diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 23f1f581..feafcbd5 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -2,7 +2,7 @@ name: Build and Deploy on: push: - branches: [ main ] + branches: [ main, host ] permissions: contents: write diff --git a/.gitignore b/.gitignore index ef468671..e3ce8fc6 100644 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,6 @@ bz2.wasm # comment lines and provide files below to host webworker on github -/src/public/data/* -/src/public/LoginThread.js -/src/public/worker.js +# /src/public/data/* +# /src/public/LoginThread.js +# /src/public/worker.js diff --git a/src/public/LoginThread.js b/src/public/LoginThread.js new file mode 100644 index 00000000..b0f05b2d --- /dev/null +++ b/src/public/LoginThread.js @@ -0,0 +1,18873 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, { + get: (a, b) => (typeof require !== "undefined" ? require : a)[b] +}) : x)(function(x) { + if (typeof require !== "undefined") return require.apply(this, arguments); + throw Error('Dynamic require of "' + x + '" is not supported'); +}); +var __commonJS = (cb, mod) => function __require2() { + return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); + +// node_modules/node-forge/lib/forge.js +var require_forge = __commonJS({ + "node_modules/node-forge/lib/forge.js"(exports, module) { + module.exports = { + // default options + options: { + usePureJavaScript: false + } + }; + } +}); + +// node_modules/node-forge/lib/baseN.js +var require_baseN = __commonJS({ + "node_modules/node-forge/lib/baseN.js"(exports, module) { + var api = {}; + module.exports = api; + var _reverseAlphabets = {}; + api.encode = function(input, alphabet, maxline) { + if (typeof alphabet !== "string") { + throw new TypeError('"alphabet" must be a string.'); + } + if (maxline !== void 0 && typeof maxline !== "number") { + throw new TypeError('"maxline" must be a number.'); + } + var output = ""; + if (!(input instanceof Uint8Array)) { + output = _encodeWithByteBuffer(input, alphabet); + } else { + var i = 0; + var base = alphabet.length; + var first = alphabet.charAt(0); + var digits = [0]; + for (i = 0; i < input.length; ++i) { + for (var j = 0, carry = input[i]; j < digits.length; ++j) { + carry += digits[j] << 8; + digits[j] = carry % base; + carry = carry / base | 0; + } + while (carry > 0) { + digits.push(carry % base); + carry = carry / base | 0; + } + } + for (i = 0; input[i] === 0 && i < input.length - 1; ++i) { + output += first; + } + for (i = digits.length - 1; i >= 0; --i) { + output += alphabet[digits[i]]; + } + } + if (maxline) { + var regex = new RegExp(".{1," + maxline + "}", "g"); + output = output.match(regex).join("\r\n"); + } + return output; + }; + api.decode = function(input, alphabet) { + if (typeof input !== "string") { + throw new TypeError('"input" must be a string.'); + } + if (typeof alphabet !== "string") { + throw new TypeError('"alphabet" must be a string.'); + } + var table = _reverseAlphabets[alphabet]; + if (!table) { + table = _reverseAlphabets[alphabet] = []; + for (var i = 0; i < alphabet.length; ++i) { + table[alphabet.charCodeAt(i)] = i; + } + } + input = input.replace(/\s/g, ""); + var base = alphabet.length; + var first = alphabet.charAt(0); + var bytes = [0]; + for (var i = 0; i < input.length; i++) { + var value = table[input.charCodeAt(i)]; + if (value === void 0) { + return; + } + for (var j = 0, carry = value; j < bytes.length; ++j) { + carry += bytes[j] * base; + bytes[j] = carry & 255; + carry >>= 8; + } + while (carry > 0) { + bytes.push(carry & 255); + carry >>= 8; + } + } + for (var k = 0; input[k] === first && k < input.length - 1; ++k) { + bytes.push(0); + } + if (typeof Buffer !== "undefined") { + return Buffer.from(bytes.reverse()); + } + return new Uint8Array(bytes.reverse()); + }; + function _encodeWithByteBuffer(input, alphabet) { + var i = 0; + var base = alphabet.length; + var first = alphabet.charAt(0); + var digits = [0]; + for (i = 0; i < input.length(); ++i) { + for (var j = 0, carry = input.at(i); j < digits.length; ++j) { + carry += digits[j] << 8; + digits[j] = carry % base; + carry = carry / base | 0; + } + while (carry > 0) { + digits.push(carry % base); + carry = carry / base | 0; + } + } + var output = ""; + for (i = 0; input.at(i) === 0 && i < input.length() - 1; ++i) { + output += first; + } + for (i = digits.length - 1; i >= 0; --i) { + output += alphabet[digits[i]]; + } + return output; + } + } +}); + +// node_modules/node-forge/lib/util.js +var require_util = __commonJS({ + "node_modules/node-forge/lib/util.js"(exports, module) { + var forge3 = require_forge(); + var baseN = require_baseN(); + var util = module.exports = forge3.util = forge3.util || {}; + (function() { + if (typeof process !== "undefined" && process.nextTick && !process.browser) { + util.nextTick = process.nextTick; + if (typeof setImmediate === "function") { + util.setImmediate = setImmediate; + } else { + util.setImmediate = util.nextTick; + } + return; + } + if (typeof setImmediate === "function") { + util.setImmediate = function() { + return setImmediate.apply(void 0, arguments); + }; + util.nextTick = function(callback) { + return setImmediate(callback); + }; + return; + } + util.setImmediate = function(callback) { + setTimeout(callback, 0); + }; + if (typeof window !== "undefined" && typeof window.postMessage === "function") { + let handler2 = function(event) { + if (event.source === window && event.data === msg) { + event.stopPropagation(); + var copy = callbacks.slice(); + callbacks.length = 0; + copy.forEach(function(callback) { + callback(); + }); + } + }; + var handler = handler2; + var msg = "forge.setImmediate"; + var callbacks = []; + util.setImmediate = function(callback) { + callbacks.push(callback); + if (callbacks.length === 1) { + window.postMessage(msg, "*"); + } + }; + window.addEventListener("message", handler2, true); + } + if (typeof MutationObserver !== "undefined") { + var now = Date.now(); + var attr = true; + var div = document.createElement("div"); + var callbacks = []; + new MutationObserver(function() { + var copy = callbacks.slice(); + callbacks.length = 0; + copy.forEach(function(callback) { + callback(); + }); + }).observe(div, { attributes: true }); + var oldSetImmediate = util.setImmediate; + util.setImmediate = function(callback) { + if (Date.now() - now > 15) { + now = Date.now(); + oldSetImmediate(callback); + } else { + callbacks.push(callback); + if (callbacks.length === 1) { + div.setAttribute("a", attr = !attr); + } + } + }; + } + util.nextTick = util.setImmediate; + })(); + util.isNodejs = typeof process !== "undefined" && process.versions && process.versions.node; + util.globalScope = function() { + if (util.isNodejs) { + return global; + } + return typeof self === "undefined" ? window : self; + }(); + util.isArray = Array.isArray || function(x) { + return Object.prototype.toString.call(x) === "[object Array]"; + }; + util.isArrayBuffer = function(x) { + return typeof ArrayBuffer !== "undefined" && x instanceof ArrayBuffer; + }; + util.isArrayBufferView = function(x) { + return x && util.isArrayBuffer(x.buffer) && x.byteLength !== void 0; + }; + function _checkBitsParam(n) { + if (!(n === 8 || n === 16 || n === 24 || n === 32)) { + throw new Error("Only 8, 16, 24, or 32 bits supported: " + n); + } + } + util.ByteBuffer = ByteStringBuffer; + function ByteStringBuffer(b) { + this.data = ""; + this.read = 0; + if (typeof b === "string") { + this.data = b; + } else if (util.isArrayBuffer(b) || util.isArrayBufferView(b)) { + if (typeof Buffer !== "undefined" && b instanceof Buffer) { + this.data = b.toString("binary"); + } else { + var arr = new Uint8Array(b); + try { + this.data = String.fromCharCode.apply(null, arr); + } catch (e) { + for (var i = 0; i < arr.length; ++i) { + this.putByte(arr[i]); + } + } + } + } else if (b instanceof ByteStringBuffer || typeof b === "object" && typeof b.data === "string" && typeof b.read === "number") { + this.data = b.data; + this.read = b.read; + } + this._constructedStringLength = 0; + } + util.ByteStringBuffer = ByteStringBuffer; + var _MAX_CONSTRUCTED_STRING_LENGTH = 4096; + util.ByteStringBuffer.prototype._optimizeConstructedString = function(x) { + this._constructedStringLength += x; + if (this._constructedStringLength > _MAX_CONSTRUCTED_STRING_LENGTH) { + this.data.substr(0, 1); + this._constructedStringLength = 0; + } + }; + util.ByteStringBuffer.prototype.length = function() { + return this.data.length - this.read; + }; + util.ByteStringBuffer.prototype.isEmpty = function() { + return this.length() <= 0; + }; + util.ByteStringBuffer.prototype.putByte = function(b) { + return this.putBytes(String.fromCharCode(b)); + }; + util.ByteStringBuffer.prototype.fillWithByte = function(b, n) { + b = String.fromCharCode(b); + var d = this.data; + while (n > 0) { + if (n & 1) { + d += b; + } + n >>>= 1; + if (n > 0) { + b += b; + } + } + this.data = d; + this._optimizeConstructedString(n); + return this; + }; + util.ByteStringBuffer.prototype.putBytes = function(bytes) { + this.data += bytes; + this._optimizeConstructedString(bytes.length); + return this; + }; + util.ByteStringBuffer.prototype.putString = function(str) { + return this.putBytes(util.encodeUtf8(str)); + }; + util.ByteStringBuffer.prototype.putInt16 = function(i) { + return this.putBytes( + String.fromCharCode(i >> 8 & 255) + String.fromCharCode(i & 255) + ); + }; + util.ByteStringBuffer.prototype.putInt24 = function(i) { + return this.putBytes( + String.fromCharCode(i >> 16 & 255) + String.fromCharCode(i >> 8 & 255) + String.fromCharCode(i & 255) + ); + }; + util.ByteStringBuffer.prototype.putInt32 = function(i) { + return this.putBytes( + String.fromCharCode(i >> 24 & 255) + String.fromCharCode(i >> 16 & 255) + String.fromCharCode(i >> 8 & 255) + String.fromCharCode(i & 255) + ); + }; + util.ByteStringBuffer.prototype.putInt16Le = function(i) { + return this.putBytes( + String.fromCharCode(i & 255) + String.fromCharCode(i >> 8 & 255) + ); + }; + util.ByteStringBuffer.prototype.putInt24Le = function(i) { + return this.putBytes( + String.fromCharCode(i & 255) + String.fromCharCode(i >> 8 & 255) + String.fromCharCode(i >> 16 & 255) + ); + }; + util.ByteStringBuffer.prototype.putInt32Le = function(i) { + return this.putBytes( + String.fromCharCode(i & 255) + String.fromCharCode(i >> 8 & 255) + String.fromCharCode(i >> 16 & 255) + String.fromCharCode(i >> 24 & 255) + ); + }; + util.ByteStringBuffer.prototype.putInt = function(i, n) { + _checkBitsParam(n); + var bytes = ""; + do { + n -= 8; + bytes += String.fromCharCode(i >> n & 255); + } while (n > 0); + return this.putBytes(bytes); + }; + util.ByteStringBuffer.prototype.putSignedInt = function(i, n) { + if (i < 0) { + i += 2 << n - 1; + } + return this.putInt(i, n); + }; + util.ByteStringBuffer.prototype.putBuffer = function(buffer) { + return this.putBytes(buffer.getBytes()); + }; + util.ByteStringBuffer.prototype.getByte = function() { + return this.data.charCodeAt(this.read++); + }; + util.ByteStringBuffer.prototype.getInt16 = function() { + var rval = this.data.charCodeAt(this.read) << 8 ^ this.data.charCodeAt(this.read + 1); + this.read += 2; + return rval; + }; + util.ByteStringBuffer.prototype.getInt24 = function() { + var rval = this.data.charCodeAt(this.read) << 16 ^ this.data.charCodeAt(this.read + 1) << 8 ^ this.data.charCodeAt(this.read + 2); + this.read += 3; + return rval; + }; + util.ByteStringBuffer.prototype.getInt32 = function() { + var rval = this.data.charCodeAt(this.read) << 24 ^ this.data.charCodeAt(this.read + 1) << 16 ^ this.data.charCodeAt(this.read + 2) << 8 ^ this.data.charCodeAt(this.read + 3); + this.read += 4; + return rval; + }; + util.ByteStringBuffer.prototype.getInt16Le = function() { + var rval = this.data.charCodeAt(this.read) ^ this.data.charCodeAt(this.read + 1) << 8; + this.read += 2; + return rval; + }; + util.ByteStringBuffer.prototype.getInt24Le = function() { + var rval = this.data.charCodeAt(this.read) ^ this.data.charCodeAt(this.read + 1) << 8 ^ this.data.charCodeAt(this.read + 2) << 16; + this.read += 3; + return rval; + }; + util.ByteStringBuffer.prototype.getInt32Le = function() { + var rval = this.data.charCodeAt(this.read) ^ this.data.charCodeAt(this.read + 1) << 8 ^ this.data.charCodeAt(this.read + 2) << 16 ^ this.data.charCodeAt(this.read + 3) << 24; + this.read += 4; + return rval; + }; + util.ByteStringBuffer.prototype.getInt = function(n) { + _checkBitsParam(n); + var rval = 0; + do { + rval = (rval << 8) + this.data.charCodeAt(this.read++); + n -= 8; + } while (n > 0); + return rval; + }; + util.ByteStringBuffer.prototype.getSignedInt = function(n) { + var x = this.getInt(n); + var max = 2 << n - 2; + if (x >= max) { + x -= max << 1; + } + return x; + }; + util.ByteStringBuffer.prototype.getBytes = function(count) { + var rval; + if (count) { + count = Math.min(this.length(), count); + rval = this.data.slice(this.read, this.read + count); + this.read += count; + } else if (count === 0) { + rval = ""; + } else { + rval = this.read === 0 ? this.data : this.data.slice(this.read); + this.clear(); + } + return rval; + }; + util.ByteStringBuffer.prototype.bytes = function(count) { + return typeof count === "undefined" ? this.data.slice(this.read) : this.data.slice(this.read, this.read + count); + }; + util.ByteStringBuffer.prototype.at = function(i) { + return this.data.charCodeAt(this.read + i); + }; + util.ByteStringBuffer.prototype.setAt = function(i, b) { + this.data = this.data.substr(0, this.read + i) + String.fromCharCode(b) + this.data.substr(this.read + i + 1); + return this; + }; + util.ByteStringBuffer.prototype.last = function() { + return this.data.charCodeAt(this.data.length - 1); + }; + util.ByteStringBuffer.prototype.copy = function() { + var c = util.createBuffer(this.data); + c.read = this.read; + return c; + }; + util.ByteStringBuffer.prototype.compact = function() { + if (this.read > 0) { + this.data = this.data.slice(this.read); + this.read = 0; + } + return this; + }; + util.ByteStringBuffer.prototype.clear = function() { + this.data = ""; + this.read = 0; + return this; + }; + util.ByteStringBuffer.prototype.truncate = function(count) { + var len = Math.max(0, this.length() - count); + this.data = this.data.substr(this.read, len); + this.read = 0; + return this; + }; + util.ByteStringBuffer.prototype.toHex = function() { + var rval = ""; + for (var i = this.read; i < this.data.length; ++i) { + var b = this.data.charCodeAt(i); + if (b < 16) { + rval += "0"; + } + rval += b.toString(16); + } + return rval; + }; + util.ByteStringBuffer.prototype.toString = function() { + return util.decodeUtf8(this.bytes()); + }; + function DataBuffer(b, options) { + options = options || {}; + this.read = options.readOffset || 0; + this.growSize = options.growSize || 1024; + var isArrayBuffer = util.isArrayBuffer(b); + var isArrayBufferView = util.isArrayBufferView(b); + if (isArrayBuffer || isArrayBufferView) { + if (isArrayBuffer) { + this.data = new DataView(b); + } else { + this.data = new DataView(b.buffer, b.byteOffset, b.byteLength); + } + this.write = "writeOffset" in options ? options.writeOffset : this.data.byteLength; + return; + } + this.data = new DataView(new ArrayBuffer(0)); + this.write = 0; + if (b !== null && b !== void 0) { + this.putBytes(b); + } + if ("writeOffset" in options) { + this.write = options.writeOffset; + } + } + util.DataBuffer = DataBuffer; + util.DataBuffer.prototype.length = function() { + return this.write - this.read; + }; + util.DataBuffer.prototype.isEmpty = function() { + return this.length() <= 0; + }; + util.DataBuffer.prototype.accommodate = function(amount, growSize) { + if (this.length() >= amount) { + return this; + } + growSize = Math.max(growSize || this.growSize, amount); + var src = new Uint8Array( + this.data.buffer, + this.data.byteOffset, + this.data.byteLength + ); + var dst = new Uint8Array(this.length() + growSize); + dst.set(src); + this.data = new DataView(dst.buffer); + return this; + }; + util.DataBuffer.prototype.putByte = function(b) { + this.accommodate(1); + this.data.setUint8(this.write++, b); + return this; + }; + util.DataBuffer.prototype.fillWithByte = function(b, n) { + this.accommodate(n); + for (var i = 0; i < n; ++i) { + this.data.setUint8(b); + } + return this; + }; + util.DataBuffer.prototype.putBytes = function(bytes, encoding) { + if (util.isArrayBufferView(bytes)) { + var src = new Uint8Array(bytes.buffer, bytes.byteOffset, bytes.byteLength); + var len = src.byteLength - src.byteOffset; + this.accommodate(len); + var dst = new Uint8Array(this.data.buffer, this.write); + dst.set(src); + this.write += len; + return this; + } + if (util.isArrayBuffer(bytes)) { + var src = new Uint8Array(bytes); + this.accommodate(src.byteLength); + var dst = new Uint8Array(this.data.buffer); + dst.set(src, this.write); + this.write += src.byteLength; + return this; + } + if (bytes instanceof util.DataBuffer || typeof bytes === "object" && typeof bytes.read === "number" && typeof bytes.write === "number" && util.isArrayBufferView(bytes.data)) { + var src = new Uint8Array(bytes.data.byteLength, bytes.read, bytes.length()); + this.accommodate(src.byteLength); + var dst = new Uint8Array(bytes.data.byteLength, this.write); + dst.set(src); + this.write += src.byteLength; + return this; + } + if (bytes instanceof util.ByteStringBuffer) { + bytes = bytes.data; + encoding = "binary"; + } + encoding = encoding || "binary"; + if (typeof bytes === "string") { + var view; + if (encoding === "hex") { + this.accommodate(Math.ceil(bytes.length / 2)); + view = new Uint8Array(this.data.buffer, this.write); + this.write += util.binary.hex.decode(bytes, view, this.write); + return this; + } + if (encoding === "base64") { + this.accommodate(Math.ceil(bytes.length / 4) * 3); + view = new Uint8Array(this.data.buffer, this.write); + this.write += util.binary.base64.decode(bytes, view, this.write); + return this; + } + if (encoding === "utf8") { + bytes = util.encodeUtf8(bytes); + encoding = "binary"; + } + if (encoding === "binary" || encoding === "raw") { + this.accommodate(bytes.length); + view = new Uint8Array(this.data.buffer, this.write); + this.write += util.binary.raw.decode(view); + return this; + } + if (encoding === "utf16") { + this.accommodate(bytes.length * 2); + view = new Uint16Array(this.data.buffer, this.write); + this.write += util.text.utf16.encode(view); + return this; + } + throw new Error("Invalid encoding: " + encoding); + } + throw Error("Invalid parameter: " + bytes); + }; + util.DataBuffer.prototype.putBuffer = function(buffer) { + this.putBytes(buffer); + buffer.clear(); + return this; + }; + util.DataBuffer.prototype.putString = function(str) { + return this.putBytes(str, "utf16"); + }; + util.DataBuffer.prototype.putInt16 = function(i) { + this.accommodate(2); + this.data.setInt16(this.write, i); + this.write += 2; + return this; + }; + util.DataBuffer.prototype.putInt24 = function(i) { + this.accommodate(3); + this.data.setInt16(this.write, i >> 8 & 65535); + this.data.setInt8(this.write, i >> 16 & 255); + this.write += 3; + return this; + }; + util.DataBuffer.prototype.putInt32 = function(i) { + this.accommodate(4); + this.data.setInt32(this.write, i); + this.write += 4; + return this; + }; + util.DataBuffer.prototype.putInt16Le = function(i) { + this.accommodate(2); + this.data.setInt16(this.write, i, true); + this.write += 2; + return this; + }; + util.DataBuffer.prototype.putInt24Le = function(i) { + this.accommodate(3); + this.data.setInt8(this.write, i >> 16 & 255); + this.data.setInt16(this.write, i >> 8 & 65535, true); + this.write += 3; + return this; + }; + util.DataBuffer.prototype.putInt32Le = function(i) { + this.accommodate(4); + this.data.setInt32(this.write, i, true); + this.write += 4; + return this; + }; + util.DataBuffer.prototype.putInt = function(i, n) { + _checkBitsParam(n); + this.accommodate(n / 8); + do { + n -= 8; + this.data.setInt8(this.write++, i >> n & 255); + } while (n > 0); + return this; + }; + util.DataBuffer.prototype.putSignedInt = function(i, n) { + _checkBitsParam(n); + this.accommodate(n / 8); + if (i < 0) { + i += 2 << n - 1; + } + return this.putInt(i, n); + }; + util.DataBuffer.prototype.getByte = function() { + return this.data.getInt8(this.read++); + }; + util.DataBuffer.prototype.getInt16 = function() { + var rval = this.data.getInt16(this.read); + this.read += 2; + return rval; + }; + util.DataBuffer.prototype.getInt24 = function() { + var rval = this.data.getInt16(this.read) << 8 ^ this.data.getInt8(this.read + 2); + this.read += 3; + return rval; + }; + util.DataBuffer.prototype.getInt32 = function() { + var rval = this.data.getInt32(this.read); + this.read += 4; + return rval; + }; + util.DataBuffer.prototype.getInt16Le = function() { + var rval = this.data.getInt16(this.read, true); + this.read += 2; + return rval; + }; + util.DataBuffer.prototype.getInt24Le = function() { + var rval = this.data.getInt8(this.read) ^ this.data.getInt16(this.read + 1, true) << 8; + this.read += 3; + return rval; + }; + util.DataBuffer.prototype.getInt32Le = function() { + var rval = this.data.getInt32(this.read, true); + this.read += 4; + return rval; + }; + util.DataBuffer.prototype.getInt = function(n) { + _checkBitsParam(n); + var rval = 0; + do { + rval = (rval << 8) + this.data.getInt8(this.read++); + n -= 8; + } while (n > 0); + return rval; + }; + util.DataBuffer.prototype.getSignedInt = function(n) { + var x = this.getInt(n); + var max = 2 << n - 2; + if (x >= max) { + x -= max << 1; + } + return x; + }; + util.DataBuffer.prototype.getBytes = function(count) { + var rval; + if (count) { + count = Math.min(this.length(), count); + rval = this.data.slice(this.read, this.read + count); + this.read += count; + } else if (count === 0) { + rval = ""; + } else { + rval = this.read === 0 ? this.data : this.data.slice(this.read); + this.clear(); + } + return rval; + }; + util.DataBuffer.prototype.bytes = function(count) { + return typeof count === "undefined" ? this.data.slice(this.read) : this.data.slice(this.read, this.read + count); + }; + util.DataBuffer.prototype.at = function(i) { + return this.data.getUint8(this.read + i); + }; + util.DataBuffer.prototype.setAt = function(i, b) { + this.data.setUint8(i, b); + return this; + }; + util.DataBuffer.prototype.last = function() { + return this.data.getUint8(this.write - 1); + }; + util.DataBuffer.prototype.copy = function() { + return new util.DataBuffer(this); + }; + util.DataBuffer.prototype.compact = function() { + if (this.read > 0) { + var src = new Uint8Array(this.data.buffer, this.read); + var dst = new Uint8Array(src.byteLength); + dst.set(src); + this.data = new DataView(dst); + this.write -= this.read; + this.read = 0; + } + return this; + }; + util.DataBuffer.prototype.clear = function() { + this.data = new DataView(new ArrayBuffer(0)); + this.read = this.write = 0; + return this; + }; + util.DataBuffer.prototype.truncate = function(count) { + this.write = Math.max(0, this.length() - count); + this.read = Math.min(this.read, this.write); + return this; + }; + util.DataBuffer.prototype.toHex = function() { + var rval = ""; + for (var i = this.read; i < this.data.byteLength; ++i) { + var b = this.data.getUint8(i); + if (b < 16) { + rval += "0"; + } + rval += b.toString(16); + } + return rval; + }; + util.DataBuffer.prototype.toString = function(encoding) { + var view = new Uint8Array(this.data, this.read, this.length()); + encoding = encoding || "utf8"; + if (encoding === "binary" || encoding === "raw") { + return util.binary.raw.encode(view); + } + if (encoding === "hex") { + return util.binary.hex.encode(view); + } + if (encoding === "base64") { + return util.binary.base64.encode(view); + } + if (encoding === "utf8") { + return util.text.utf8.decode(view); + } + if (encoding === "utf16") { + return util.text.utf16.decode(view); + } + throw new Error("Invalid encoding: " + encoding); + }; + util.createBuffer = function(input, encoding) { + encoding = encoding || "raw"; + if (input !== void 0 && encoding === "utf8") { + input = util.encodeUtf8(input); + } + return new util.ByteBuffer(input); + }; + util.fillString = function(c, n) { + var s = ""; + while (n > 0) { + if (n & 1) { + s += c; + } + n >>>= 1; + if (n > 0) { + c += c; + } + } + return s; + }; + util.xorBytes = function(s1, s2, n) { + var s3 = ""; + var b = ""; + var t = ""; + var i = 0; + var c = 0; + for (; n > 0; --n, ++i) { + b = s1.charCodeAt(i) ^ s2.charCodeAt(i); + if (c >= 10) { + s3 += t; + t = ""; + c = 0; + } + t += String.fromCharCode(b); + ++c; + } + s3 += t; + return s3; + }; + util.hexToBytes = function(hex) { + var rval = ""; + var i = 0; + if (hex.length & true) { + i = 1; + rval += String.fromCharCode(parseInt(hex[0], 16)); + } + for (; i < hex.length; i += 2) { + rval += String.fromCharCode(parseInt(hex.substr(i, 2), 16)); + } + return rval; + }; + util.bytesToHex = function(bytes) { + return util.createBuffer(bytes).toHex(); + }; + util.int32ToBytes = function(i) { + return String.fromCharCode(i >> 24 & 255) + String.fromCharCode(i >> 16 & 255) + String.fromCharCode(i >> 8 & 255) + String.fromCharCode(i & 255); + }; + var _base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; + var _base64Idx = [ + /*43 -43 = 0*/ + /*'+', 1, 2, 3,'/' */ + 62, + -1, + -1, + -1, + 63, + /*'0','1','2','3','4','5','6','7','8','9' */ + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + /*15, 16, 17,'=', 19, 20, 21 */ + -1, + -1, + -1, + 64, + -1, + -1, + -1, + /*65 - 43 = 22*/ + /*'A','B','C','D','E','F','G','H','I','J','K','L','M', */ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + /*'N','O','P','Q','R','S','T','U','V','W','X','Y','Z' */ + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + /*91 - 43 = 48 */ + /*48, 49, 50, 51, 52, 53 */ + -1, + -1, + -1, + -1, + -1, + -1, + /*97 - 43 = 54*/ + /*'a','b','c','d','e','f','g','h','i','j','k','l','m' */ + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + /*'n','o','p','q','r','s','t','u','v','w','x','y','z' */ + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51 + ]; + var _base58 = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"; + util.encode64 = function(input, maxline) { + var line = ""; + var output = ""; + var chr1, chr2, chr3; + var i = 0; + while (i < input.length) { + chr1 = input.charCodeAt(i++); + chr2 = input.charCodeAt(i++); + chr3 = input.charCodeAt(i++); + line += _base64.charAt(chr1 >> 2); + line += _base64.charAt((chr1 & 3) << 4 | chr2 >> 4); + if (isNaN(chr2)) { + line += "=="; + } else { + line += _base64.charAt((chr2 & 15) << 2 | chr3 >> 6); + line += isNaN(chr3) ? "=" : _base64.charAt(chr3 & 63); + } + if (maxline && line.length > maxline) { + output += line.substr(0, maxline) + "\r\n"; + line = line.substr(maxline); + } + } + output += line; + return output; + }; + util.decode64 = function(input) { + input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ""); + var output = ""; + var enc1, enc2, enc3, enc4; + var i = 0; + while (i < input.length) { + enc1 = _base64Idx[input.charCodeAt(i++) - 43]; + enc2 = _base64Idx[input.charCodeAt(i++) - 43]; + enc3 = _base64Idx[input.charCodeAt(i++) - 43]; + enc4 = _base64Idx[input.charCodeAt(i++) - 43]; + output += String.fromCharCode(enc1 << 2 | enc2 >> 4); + if (enc3 !== 64) { + output += String.fromCharCode((enc2 & 15) << 4 | enc3 >> 2); + if (enc4 !== 64) { + output += String.fromCharCode((enc3 & 3) << 6 | enc4); + } + } + } + return output; + }; + util.encodeUtf8 = function(str) { + return unescape(encodeURIComponent(str)); + }; + util.decodeUtf8 = function(str) { + return decodeURIComponent(escape(str)); + }; + util.binary = { + raw: {}, + hex: {}, + base64: {}, + base58: {}, + baseN: { + encode: baseN.encode, + decode: baseN.decode + } + }; + util.binary.raw.encode = function(bytes) { + return String.fromCharCode.apply(null, bytes); + }; + util.binary.raw.decode = function(str, output, offset) { + var out = output; + if (!out) { + out = new Uint8Array(str.length); + } + offset = offset || 0; + var j = offset; + for (var i = 0; i < str.length; ++i) { + out[j++] = str.charCodeAt(i); + } + return output ? j - offset : out; + }; + util.binary.hex.encode = util.bytesToHex; + util.binary.hex.decode = function(hex, output, offset) { + var out = output; + if (!out) { + out = new Uint8Array(Math.ceil(hex.length / 2)); + } + offset = offset || 0; + var i = 0, j = offset; + if (hex.length & 1) { + i = 1; + out[j++] = parseInt(hex[0], 16); + } + for (; i < hex.length; i += 2) { + out[j++] = parseInt(hex.substr(i, 2), 16); + } + return output ? j - offset : out; + }; + util.binary.base64.encode = function(input, maxline) { + var line = ""; + var output = ""; + var chr1, chr2, chr3; + var i = 0; + while (i < input.byteLength) { + chr1 = input[i++]; + chr2 = input[i++]; + chr3 = input[i++]; + line += _base64.charAt(chr1 >> 2); + line += _base64.charAt((chr1 & 3) << 4 | chr2 >> 4); + if (isNaN(chr2)) { + line += "=="; + } else { + line += _base64.charAt((chr2 & 15) << 2 | chr3 >> 6); + line += isNaN(chr3) ? "=" : _base64.charAt(chr3 & 63); + } + if (maxline && line.length > maxline) { + output += line.substr(0, maxline) + "\r\n"; + line = line.substr(maxline); + } + } + output += line; + return output; + }; + util.binary.base64.decode = function(input, output, offset) { + var out = output; + if (!out) { + out = new Uint8Array(Math.ceil(input.length / 4) * 3); + } + input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ""); + offset = offset || 0; + var enc1, enc2, enc3, enc4; + var i = 0, j = offset; + while (i < input.length) { + enc1 = _base64Idx[input.charCodeAt(i++) - 43]; + enc2 = _base64Idx[input.charCodeAt(i++) - 43]; + enc3 = _base64Idx[input.charCodeAt(i++) - 43]; + enc4 = _base64Idx[input.charCodeAt(i++) - 43]; + out[j++] = enc1 << 2 | enc2 >> 4; + if (enc3 !== 64) { + out[j++] = (enc2 & 15) << 4 | enc3 >> 2; + if (enc4 !== 64) { + out[j++] = (enc3 & 3) << 6 | enc4; + } + } + } + return output ? j - offset : out.subarray(0, j); + }; + util.binary.base58.encode = function(input, maxline) { + return util.binary.baseN.encode(input, _base58, maxline); + }; + util.binary.base58.decode = function(input, maxline) { + return util.binary.baseN.decode(input, _base58, maxline); + }; + util.text = { + utf8: {}, + utf16: {} + }; + util.text.utf8.encode = function(str, output, offset) { + str = util.encodeUtf8(str); + var out = output; + if (!out) { + out = new Uint8Array(str.length); + } + offset = offset || 0; + var j = offset; + for (var i = 0; i < str.length; ++i) { + out[j++] = str.charCodeAt(i); + } + return output ? j - offset : out; + }; + util.text.utf8.decode = function(bytes) { + return util.decodeUtf8(String.fromCharCode.apply(null, bytes)); + }; + util.text.utf16.encode = function(str, output, offset) { + var out = output; + if (!out) { + out = new Uint8Array(str.length * 2); + } + var view = new Uint16Array(out.buffer); + offset = offset || 0; + var j = offset; + var k = offset; + for (var i = 0; i < str.length; ++i) { + view[k++] = str.charCodeAt(i); + j += 2; + } + return output ? j - offset : out; + }; + util.text.utf16.decode = function(bytes) { + return String.fromCharCode.apply(null, new Uint16Array(bytes.buffer)); + }; + util.deflate = function(api, bytes, raw) { + bytes = util.decode64(api.deflate(util.encode64(bytes)).rval); + if (raw) { + var start = 2; + var flg = bytes.charCodeAt(1); + if (flg & 32) { + start = 6; + } + bytes = bytes.substring(start, bytes.length - 4); + } + return bytes; + }; + util.inflate = function(api, bytes, raw) { + var rval = api.inflate(util.encode64(bytes)).rval; + return rval === null ? null : util.decode64(rval); + }; + var _setStorageObject = function(api, id, obj) { + if (!api) { + throw new Error("WebStorage not available."); + } + var rval; + if (obj === null) { + rval = api.removeItem(id); + } else { + obj = util.encode64(JSON.stringify(obj)); + rval = api.setItem(id, obj); + } + if (typeof rval !== "undefined" && rval.rval !== true) { + var error = new Error(rval.error.message); + error.id = rval.error.id; + error.name = rval.error.name; + throw error; + } + }; + var _getStorageObject = function(api, id) { + if (!api) { + throw new Error("WebStorage not available."); + } + var rval = api.getItem(id); + if (api.init) { + if (rval.rval === null) { + if (rval.error) { + var error = new Error(rval.error.message); + error.id = rval.error.id; + error.name = rval.error.name; + throw error; + } + rval = null; + } else { + rval = rval.rval; + } + } + if (rval !== null) { + rval = JSON.parse(util.decode64(rval)); + } + return rval; + }; + var _setItem = function(api, id, key, data) { + var obj = _getStorageObject(api, id); + if (obj === null) { + obj = {}; + } + obj[key] = data; + _setStorageObject(api, id, obj); + }; + var _getItem = function(api, id, key) { + var rval = _getStorageObject(api, id); + if (rval !== null) { + rval = key in rval ? rval[key] : null; + } + return rval; + }; + var _removeItem = function(api, id, key) { + var obj = _getStorageObject(api, id); + if (obj !== null && key in obj) { + delete obj[key]; + var empty = true; + for (var prop in obj) { + empty = false; + break; + } + if (empty) { + obj = null; + } + _setStorageObject(api, id, obj); + } + }; + var _clearItems = function(api, id) { + _setStorageObject(api, id, null); + }; + var _callStorageFunction = function(func, args, location) { + var rval = null; + if (typeof location === "undefined") { + location = ["web", "flash"]; + } + var type; + var done = false; + var exception = null; + for (var idx in location) { + type = location[idx]; + try { + if (type === "flash" || type === "both") { + if (args[0] === null) { + throw new Error("Flash local storage not available."); + } + rval = func.apply(this, args); + done = type === "flash"; + } + if (type === "web" || type === "both") { + args[0] = localStorage; + rval = func.apply(this, args); + done = true; + } + } catch (ex) { + exception = ex; + } + if (done) { + break; + } + } + if (!done) { + throw exception; + } + return rval; + }; + util.setItem = function(api, id, key, data, location) { + _callStorageFunction(_setItem, arguments, location); + }; + util.getItem = function(api, id, key, location) { + return _callStorageFunction(_getItem, arguments, location); + }; + util.removeItem = function(api, id, key, location) { + _callStorageFunction(_removeItem, arguments, location); + }; + util.clearItems = function(api, id, location) { + _callStorageFunction(_clearItems, arguments, location); + }; + util.isEmpty = function(obj) { + for (var prop in obj) { + if (obj.hasOwnProperty(prop)) { + return false; + } + } + return true; + }; + util.format = function(format) { + var re = /%./g; + var match; + var part; + var argi = 0; + var parts = []; + var last = 0; + while (match = re.exec(format)) { + part = format.substring(last, re.lastIndex - 2); + if (part.length > 0) { + parts.push(part); + } + last = re.lastIndex; + var code = match[0][1]; + switch (code) { + case "s": + case "o": + if (argi < arguments.length) { + parts.push(arguments[argi++ + 1]); + } else { + parts.push(""); + } + break; + case "%": + parts.push("%"); + break; + default: + parts.push("<%" + code + "?>"); + } + } + parts.push(format.substring(last)); + return parts.join(""); + }; + util.formatNumber = function(number, decimals, dec_point, thousands_sep) { + var n = number, c = isNaN(decimals = Math.abs(decimals)) ? 2 : decimals; + var d = dec_point === void 0 ? "," : dec_point; + var t = thousands_sep === void 0 ? "." : thousands_sep, s = n < 0 ? "-" : ""; + var i = parseInt(n = Math.abs(+n || 0).toFixed(c), 10) + ""; + var j = i.length > 3 ? i.length % 3 : 0; + return s + (j ? i.substr(0, j) + t : "") + i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + t) + (c ? d + Math.abs(n - i).toFixed(c).slice(2) : ""); + }; + util.formatSize = function(size) { + if (size >= 1073741824) { + size = util.formatNumber(size / 1073741824, 2, ".", "") + " GiB"; + } else if (size >= 1048576) { + size = util.formatNumber(size / 1048576, 2, ".", "") + " MiB"; + } else if (size >= 1024) { + size = util.formatNumber(size / 1024, 0) + " KiB"; + } else { + size = util.formatNumber(size, 0) + " bytes"; + } + return size; + }; + util.bytesFromIP = function(ip) { + if (ip.indexOf(".") !== -1) { + return util.bytesFromIPv4(ip); + } + if (ip.indexOf(":") !== -1) { + return util.bytesFromIPv6(ip); + } + return null; + }; + util.bytesFromIPv4 = function(ip) { + ip = ip.split("."); + if (ip.length !== 4) { + return null; + } + var b = util.createBuffer(); + for (var i = 0; i < ip.length; ++i) { + var num = parseInt(ip[i], 10); + if (isNaN(num)) { + return null; + } + b.putByte(num); + } + return b.getBytes(); + }; + util.bytesFromIPv6 = function(ip) { + var blanks = 0; + ip = ip.split(":").filter(function(e) { + if (e.length === 0) ++blanks; + return true; + }); + var zeros = (8 - ip.length + blanks) * 2; + var b = util.createBuffer(); + for (var i = 0; i < 8; ++i) { + if (!ip[i] || ip[i].length === 0) { + b.fillWithByte(0, zeros); + zeros = 0; + continue; + } + var bytes = util.hexToBytes(ip[i]); + if (bytes.length < 2) { + b.putByte(0); + } + b.putBytes(bytes); + } + return b.getBytes(); + }; + util.bytesToIP = function(bytes) { + if (bytes.length === 4) { + return util.bytesToIPv4(bytes); + } + if (bytes.length === 16) { + return util.bytesToIPv6(bytes); + } + return null; + }; + util.bytesToIPv4 = function(bytes) { + if (bytes.length !== 4) { + return null; + } + var ip = []; + for (var i = 0; i < bytes.length; ++i) { + ip.push(bytes.charCodeAt(i)); + } + return ip.join("."); + }; + util.bytesToIPv6 = function(bytes) { + if (bytes.length !== 16) { + return null; + } + var ip = []; + var zeroGroups = []; + var zeroMaxGroup = 0; + for (var i = 0; i < bytes.length; i += 2) { + var hex = util.bytesToHex(bytes[i] + bytes[i + 1]); + while (hex[0] === "0" && hex !== "0") { + hex = hex.substr(1); + } + if (hex === "0") { + var last = zeroGroups[zeroGroups.length - 1]; + var idx = ip.length; + if (!last || idx !== last.end + 1) { + zeroGroups.push({ start: idx, end: idx }); + } else { + last.end = idx; + if (last.end - last.start > zeroGroups[zeroMaxGroup].end - zeroGroups[zeroMaxGroup].start) { + zeroMaxGroup = zeroGroups.length - 1; + } + } + } + ip.push(hex); + } + if (zeroGroups.length > 0) { + var group = zeroGroups[zeroMaxGroup]; + if (group.end - group.start > 0) { + ip.splice(group.start, group.end - group.start + 1, ""); + if (group.start === 0) { + ip.unshift(""); + } + if (group.end === 7) { + ip.push(""); + } + } + } + return ip.join(":"); + }; + util.estimateCores = function(options, callback) { + if (typeof options === "function") { + callback = options; + options = {}; + } + options = options || {}; + if ("cores" in util && !options.update) { + return callback(null, util.cores); + } + if (typeof navigator !== "undefined" && "hardwareConcurrency" in navigator && navigator.hardwareConcurrency > 0) { + util.cores = navigator.hardwareConcurrency; + return callback(null, util.cores); + } + if (typeof Worker === "undefined") { + util.cores = 1; + return callback(null, util.cores); + } + if (typeof Blob === "undefined") { + util.cores = 2; + return callback(null, util.cores); + } + var blobUrl = URL.createObjectURL(new Blob([ + "(", + function() { + self.addEventListener("message", function(e) { + var st = Date.now(); + var et = st + 4; + while (Date.now() < et) ; + self.postMessage({ st, et }); + }); + }.toString(), + ")()" + ], { type: "application/javascript" })); + sample([], 5, 16); + function sample(max, samples, numWorkers) { + if (samples === 0) { + var avg = Math.floor(max.reduce(function(avg2, x) { + return avg2 + x; + }, 0) / max.length); + util.cores = Math.max(1, avg); + URL.revokeObjectURL(blobUrl); + return callback(null, util.cores); + } + map(numWorkers, function(err, results) { + max.push(reduce(numWorkers, results)); + sample(max, samples - 1, numWorkers); + }); + } + function map(numWorkers, callback2) { + var workers = []; + var results = []; + for (var i = 0; i < numWorkers; ++i) { + var worker = new Worker(blobUrl); + worker.addEventListener("message", function(e) { + results.push(e.data); + if (results.length === numWorkers) { + for (var i2 = 0; i2 < numWorkers; ++i2) { + workers[i2].terminate(); + } + callback2(null, results); + } + }); + workers.push(worker); + } + for (var i = 0; i < numWorkers; ++i) { + workers[i].postMessage(i); + } + } + function reduce(numWorkers, results) { + var overlaps = []; + for (var n = 0; n < numWorkers; ++n) { + var r1 = results[n]; + var overlap = overlaps[n] = []; + for (var i = 0; i < numWorkers; ++i) { + if (n === i) { + continue; + } + var r2 = results[i]; + if (r1.st > r2.st && r1.st < r2.et || r2.st > r1.st && r2.st < r1.et) { + overlap.push(i); + } + } + } + return overlaps.reduce(function(max, overlap2) { + return Math.max(max, overlap2.length); + }, 0); + } + }; + } +}); + +// node_modules/node-forge/lib/cipher.js +var require_cipher = __commonJS({ + "node_modules/node-forge/lib/cipher.js"(exports, module) { + var forge3 = require_forge(); + require_util(); + module.exports = forge3.cipher = forge3.cipher || {}; + forge3.cipher.algorithms = forge3.cipher.algorithms || {}; + forge3.cipher.createCipher = function(algorithm, key) { + var api = algorithm; + if (typeof api === "string") { + api = forge3.cipher.getAlgorithm(api); + if (api) { + api = api(); + } + } + if (!api) { + throw new Error("Unsupported algorithm: " + algorithm); + } + return new forge3.cipher.BlockCipher({ + algorithm: api, + key, + decrypt: false + }); + }; + forge3.cipher.createDecipher = function(algorithm, key) { + var api = algorithm; + if (typeof api === "string") { + api = forge3.cipher.getAlgorithm(api); + if (api) { + api = api(); + } + } + if (!api) { + throw new Error("Unsupported algorithm: " + algorithm); + } + return new forge3.cipher.BlockCipher({ + algorithm: api, + key, + decrypt: true + }); + }; + forge3.cipher.registerAlgorithm = function(name, algorithm) { + name = name.toUpperCase(); + forge3.cipher.algorithms[name] = algorithm; + }; + forge3.cipher.getAlgorithm = function(name) { + name = name.toUpperCase(); + if (name in forge3.cipher.algorithms) { + return forge3.cipher.algorithms[name]; + } + return null; + }; + var BlockCipher = forge3.cipher.BlockCipher = function(options) { + this.algorithm = options.algorithm; + this.mode = this.algorithm.mode; + this.blockSize = this.mode.blockSize; + this._finish = false; + this._input = null; + this.output = null; + this._op = options.decrypt ? this.mode.decrypt : this.mode.encrypt; + this._decrypt = options.decrypt; + this.algorithm.initialize(options); + }; + BlockCipher.prototype.start = function(options) { + options = options || {}; + var opts = {}; + for (var key in options) { + opts[key] = options[key]; + } + opts.decrypt = this._decrypt; + this._finish = false; + this._input = forge3.util.createBuffer(); + this.output = options.output || forge3.util.createBuffer(); + this.mode.start(opts); + }; + BlockCipher.prototype.update = function(input) { + if (input) { + this._input.putBuffer(input); + } + while (!this._op.call(this.mode, this._input, this.output, this._finish) && !this._finish) { + } + this._input.compact(); + }; + BlockCipher.prototype.finish = function(pad) { + if (pad && (this.mode.name === "ECB" || this.mode.name === "CBC")) { + this.mode.pad = function(input) { + return pad(this.blockSize, input, false); + }; + this.mode.unpad = function(output) { + return pad(this.blockSize, output, true); + }; + } + var options = {}; + options.decrypt = this._decrypt; + options.overflow = this._input.length() % this.blockSize; + if (!this._decrypt && this.mode.pad) { + if (!this.mode.pad(this._input, options)) { + return false; + } + } + this._finish = true; + this.update(); + if (this._decrypt && this.mode.unpad) { + if (!this.mode.unpad(this.output, options)) { + return false; + } + } + if (this.mode.afterFinish) { + if (!this.mode.afterFinish(this.output, options)) { + return false; + } + } + return true; + }; + } +}); + +// node_modules/node-forge/lib/cipherModes.js +var require_cipherModes = __commonJS({ + "node_modules/node-forge/lib/cipherModes.js"(exports, module) { + var forge3 = require_forge(); + require_util(); + forge3.cipher = forge3.cipher || {}; + var modes = module.exports = forge3.cipher.modes = forge3.cipher.modes || {}; + modes.ecb = function(options) { + options = options || {}; + this.name = "ECB"; + this.cipher = options.cipher; + this.blockSize = options.blockSize || 16; + this._ints = this.blockSize / 4; + this._inBlock = new Array(this._ints); + this._outBlock = new Array(this._ints); + }; + modes.ecb.prototype.start = function(options) { + }; + modes.ecb.prototype.encrypt = function(input, output, finish) { + if (input.length() < this.blockSize && !(finish && input.length() > 0)) { + return true; + } + for (var i = 0; i < this._ints; ++i) { + this._inBlock[i] = input.getInt32(); + } + this.cipher.encrypt(this._inBlock, this._outBlock); + for (var i = 0; i < this._ints; ++i) { + output.putInt32(this._outBlock[i]); + } + }; + modes.ecb.prototype.decrypt = function(input, output, finish) { + if (input.length() < this.blockSize && !(finish && input.length() > 0)) { + return true; + } + for (var i = 0; i < this._ints; ++i) { + this._inBlock[i] = input.getInt32(); + } + this.cipher.decrypt(this._inBlock, this._outBlock); + for (var i = 0; i < this._ints; ++i) { + output.putInt32(this._outBlock[i]); + } + }; + modes.ecb.prototype.pad = function(input, options) { + var padding = input.length() === this.blockSize ? this.blockSize : this.blockSize - input.length(); + input.fillWithByte(padding, padding); + return true; + }; + modes.ecb.prototype.unpad = function(output, options) { + if (options.overflow > 0) { + return false; + } + var len = output.length(); + var count = output.at(len - 1); + if (count > this.blockSize << 2) { + return false; + } + output.truncate(count); + return true; + }; + modes.cbc = function(options) { + options = options || {}; + this.name = "CBC"; + this.cipher = options.cipher; + this.blockSize = options.blockSize || 16; + this._ints = this.blockSize / 4; + this._inBlock = new Array(this._ints); + this._outBlock = new Array(this._ints); + }; + modes.cbc.prototype.start = function(options) { + if (options.iv === null) { + if (!this._prev) { + throw new Error("Invalid IV parameter."); + } + this._iv = this._prev.slice(0); + } else if (!("iv" in options)) { + throw new Error("Invalid IV parameter."); + } else { + this._iv = transformIV(options.iv, this.blockSize); + this._prev = this._iv.slice(0); + } + }; + modes.cbc.prototype.encrypt = function(input, output, finish) { + if (input.length() < this.blockSize && !(finish && input.length() > 0)) { + return true; + } + for (var i = 0; i < this._ints; ++i) { + this._inBlock[i] = this._prev[i] ^ input.getInt32(); + } + this.cipher.encrypt(this._inBlock, this._outBlock); + for (var i = 0; i < this._ints; ++i) { + output.putInt32(this._outBlock[i]); + } + this._prev = this._outBlock; + }; + modes.cbc.prototype.decrypt = function(input, output, finish) { + if (input.length() < this.blockSize && !(finish && input.length() > 0)) { + return true; + } + for (var i = 0; i < this._ints; ++i) { + this._inBlock[i] = input.getInt32(); + } + this.cipher.decrypt(this._inBlock, this._outBlock); + for (var i = 0; i < this._ints; ++i) { + output.putInt32(this._prev[i] ^ this._outBlock[i]); + } + this._prev = this._inBlock.slice(0); + }; + modes.cbc.prototype.pad = function(input, options) { + var padding = input.length() === this.blockSize ? this.blockSize : this.blockSize - input.length(); + input.fillWithByte(padding, padding); + return true; + }; + modes.cbc.prototype.unpad = function(output, options) { + if (options.overflow > 0) { + return false; + } + var len = output.length(); + var count = output.at(len - 1); + if (count > this.blockSize << 2) { + return false; + } + output.truncate(count); + return true; + }; + modes.cfb = function(options) { + options = options || {}; + this.name = "CFB"; + this.cipher = options.cipher; + this.blockSize = options.blockSize || 16; + this._ints = this.blockSize / 4; + this._inBlock = null; + this._outBlock = new Array(this._ints); + this._partialBlock = new Array(this._ints); + this._partialOutput = forge3.util.createBuffer(); + this._partialBytes = 0; + }; + modes.cfb.prototype.start = function(options) { + if (!("iv" in options)) { + throw new Error("Invalid IV parameter."); + } + this._iv = transformIV(options.iv, this.blockSize); + this._inBlock = this._iv.slice(0); + this._partialBytes = 0; + }; + modes.cfb.prototype.encrypt = function(input, output, finish) { + var inputLength = input.length(); + if (inputLength === 0) { + return true; + } + this.cipher.encrypt(this._inBlock, this._outBlock); + if (this._partialBytes === 0 && inputLength >= this.blockSize) { + for (var i = 0; i < this._ints; ++i) { + this._inBlock[i] = input.getInt32() ^ this._outBlock[i]; + output.putInt32(this._inBlock[i]); + } + return; + } + var partialBytes = (this.blockSize - inputLength) % this.blockSize; + if (partialBytes > 0) { + partialBytes = this.blockSize - partialBytes; + } + this._partialOutput.clear(); + for (var i = 0; i < this._ints; ++i) { + this._partialBlock[i] = input.getInt32() ^ this._outBlock[i]; + this._partialOutput.putInt32(this._partialBlock[i]); + } + if (partialBytes > 0) { + input.read -= this.blockSize; + } else { + for (var i = 0; i < this._ints; ++i) { + this._inBlock[i] = this._partialBlock[i]; + } + } + if (this._partialBytes > 0) { + this._partialOutput.getBytes(this._partialBytes); + } + if (partialBytes > 0 && !finish) { + output.putBytes(this._partialOutput.getBytes( + partialBytes - this._partialBytes + )); + this._partialBytes = partialBytes; + return true; + } + output.putBytes(this._partialOutput.getBytes( + inputLength - this._partialBytes + )); + this._partialBytes = 0; + }; + modes.cfb.prototype.decrypt = function(input, output, finish) { + var inputLength = input.length(); + if (inputLength === 0) { + return true; + } + this.cipher.encrypt(this._inBlock, this._outBlock); + if (this._partialBytes === 0 && inputLength >= this.blockSize) { + for (var i = 0; i < this._ints; ++i) { + this._inBlock[i] = input.getInt32(); + output.putInt32(this._inBlock[i] ^ this._outBlock[i]); + } + return; + } + var partialBytes = (this.blockSize - inputLength) % this.blockSize; + if (partialBytes > 0) { + partialBytes = this.blockSize - partialBytes; + } + this._partialOutput.clear(); + for (var i = 0; i < this._ints; ++i) { + this._partialBlock[i] = input.getInt32(); + this._partialOutput.putInt32(this._partialBlock[i] ^ this._outBlock[i]); + } + if (partialBytes > 0) { + input.read -= this.blockSize; + } else { + for (var i = 0; i < this._ints; ++i) { + this._inBlock[i] = this._partialBlock[i]; + } + } + if (this._partialBytes > 0) { + this._partialOutput.getBytes(this._partialBytes); + } + if (partialBytes > 0 && !finish) { + output.putBytes(this._partialOutput.getBytes( + partialBytes - this._partialBytes + )); + this._partialBytes = partialBytes; + return true; + } + output.putBytes(this._partialOutput.getBytes( + inputLength - this._partialBytes + )); + this._partialBytes = 0; + }; + modes.ofb = function(options) { + options = options || {}; + this.name = "OFB"; + this.cipher = options.cipher; + this.blockSize = options.blockSize || 16; + this._ints = this.blockSize / 4; + this._inBlock = null; + this._outBlock = new Array(this._ints); + this._partialOutput = forge3.util.createBuffer(); + this._partialBytes = 0; + }; + modes.ofb.prototype.start = function(options) { + if (!("iv" in options)) { + throw new Error("Invalid IV parameter."); + } + this._iv = transformIV(options.iv, this.blockSize); + this._inBlock = this._iv.slice(0); + this._partialBytes = 0; + }; + modes.ofb.prototype.encrypt = function(input, output, finish) { + var inputLength = input.length(); + if (input.length() === 0) { + return true; + } + this.cipher.encrypt(this._inBlock, this._outBlock); + if (this._partialBytes === 0 && inputLength >= this.blockSize) { + for (var i = 0; i < this._ints; ++i) { + output.putInt32(input.getInt32() ^ this._outBlock[i]); + this._inBlock[i] = this._outBlock[i]; + } + return; + } + var partialBytes = (this.blockSize - inputLength) % this.blockSize; + if (partialBytes > 0) { + partialBytes = this.blockSize - partialBytes; + } + this._partialOutput.clear(); + for (var i = 0; i < this._ints; ++i) { + this._partialOutput.putInt32(input.getInt32() ^ this._outBlock[i]); + } + if (partialBytes > 0) { + input.read -= this.blockSize; + } else { + for (var i = 0; i < this._ints; ++i) { + this._inBlock[i] = this._outBlock[i]; + } + } + if (this._partialBytes > 0) { + this._partialOutput.getBytes(this._partialBytes); + } + if (partialBytes > 0 && !finish) { + output.putBytes(this._partialOutput.getBytes( + partialBytes - this._partialBytes + )); + this._partialBytes = partialBytes; + return true; + } + output.putBytes(this._partialOutput.getBytes( + inputLength - this._partialBytes + )); + this._partialBytes = 0; + }; + modes.ofb.prototype.decrypt = modes.ofb.prototype.encrypt; + modes.ctr = function(options) { + options = options || {}; + this.name = "CTR"; + this.cipher = options.cipher; + this.blockSize = options.blockSize || 16; + this._ints = this.blockSize / 4; + this._inBlock = null; + this._outBlock = new Array(this._ints); + this._partialOutput = forge3.util.createBuffer(); + this._partialBytes = 0; + }; + modes.ctr.prototype.start = function(options) { + if (!("iv" in options)) { + throw new Error("Invalid IV parameter."); + } + this._iv = transformIV(options.iv, this.blockSize); + this._inBlock = this._iv.slice(0); + this._partialBytes = 0; + }; + modes.ctr.prototype.encrypt = function(input, output, finish) { + var inputLength = input.length(); + if (inputLength === 0) { + return true; + } + this.cipher.encrypt(this._inBlock, this._outBlock); + if (this._partialBytes === 0 && inputLength >= this.blockSize) { + for (var i = 0; i < this._ints; ++i) { + output.putInt32(input.getInt32() ^ this._outBlock[i]); + } + } else { + var partialBytes = (this.blockSize - inputLength) % this.blockSize; + if (partialBytes > 0) { + partialBytes = this.blockSize - partialBytes; + } + this._partialOutput.clear(); + for (var i = 0; i < this._ints; ++i) { + this._partialOutput.putInt32(input.getInt32() ^ this._outBlock[i]); + } + if (partialBytes > 0) { + input.read -= this.blockSize; + } + if (this._partialBytes > 0) { + this._partialOutput.getBytes(this._partialBytes); + } + if (partialBytes > 0 && !finish) { + output.putBytes(this._partialOutput.getBytes( + partialBytes - this._partialBytes + )); + this._partialBytes = partialBytes; + return true; + } + output.putBytes(this._partialOutput.getBytes( + inputLength - this._partialBytes + )); + this._partialBytes = 0; + } + inc32(this._inBlock); + }; + modes.ctr.prototype.decrypt = modes.ctr.prototype.encrypt; + modes.gcm = function(options) { + options = options || {}; + this.name = "GCM"; + this.cipher = options.cipher; + this.blockSize = options.blockSize || 16; + this._ints = this.blockSize / 4; + this._inBlock = new Array(this._ints); + this._outBlock = new Array(this._ints); + this._partialOutput = forge3.util.createBuffer(); + this._partialBytes = 0; + this._R = 3774873600; + }; + modes.gcm.prototype.start = function(options) { + if (!("iv" in options)) { + throw new Error("Invalid IV parameter."); + } + var iv = forge3.util.createBuffer(options.iv); + this._cipherLength = 0; + var additionalData; + if ("additionalData" in options) { + additionalData = forge3.util.createBuffer(options.additionalData); + } else { + additionalData = forge3.util.createBuffer(); + } + if ("tagLength" in options) { + this._tagLength = options.tagLength; + } else { + this._tagLength = 128; + } + this._tag = null; + if (options.decrypt) { + this._tag = forge3.util.createBuffer(options.tag).getBytes(); + if (this._tag.length !== this._tagLength / 8) { + throw new Error("Authentication tag does not match tag length."); + } + } + this._hashBlock = new Array(this._ints); + this.tag = null; + this._hashSubkey = new Array(this._ints); + this.cipher.encrypt([0, 0, 0, 0], this._hashSubkey); + this.componentBits = 4; + this._m = this.generateHashTable(this._hashSubkey, this.componentBits); + var ivLength = iv.length(); + if (ivLength === 12) { + this._j0 = [iv.getInt32(), iv.getInt32(), iv.getInt32(), 1]; + } else { + this._j0 = [0, 0, 0, 0]; + while (iv.length() > 0) { + this._j0 = this.ghash( + this._hashSubkey, + this._j0, + [iv.getInt32(), iv.getInt32(), iv.getInt32(), iv.getInt32()] + ); + } + this._j0 = this.ghash( + this._hashSubkey, + this._j0, + [0, 0].concat(from64To32(ivLength * 8)) + ); + } + this._inBlock = this._j0.slice(0); + inc32(this._inBlock); + this._partialBytes = 0; + additionalData = forge3.util.createBuffer(additionalData); + this._aDataLength = from64To32(additionalData.length() * 8); + var overflow = additionalData.length() % this.blockSize; + if (overflow) { + additionalData.fillWithByte(0, this.blockSize - overflow); + } + this._s = [0, 0, 0, 0]; + while (additionalData.length() > 0) { + this._s = this.ghash(this._hashSubkey, this._s, [ + additionalData.getInt32(), + additionalData.getInt32(), + additionalData.getInt32(), + additionalData.getInt32() + ]); + } + }; + modes.gcm.prototype.encrypt = function(input, output, finish) { + var inputLength = input.length(); + if (inputLength === 0) { + return true; + } + this.cipher.encrypt(this._inBlock, this._outBlock); + if (this._partialBytes === 0 && inputLength >= this.blockSize) { + for (var i = 0; i < this._ints; ++i) { + output.putInt32(this._outBlock[i] ^= input.getInt32()); + } + this._cipherLength += this.blockSize; + } else { + var partialBytes = (this.blockSize - inputLength) % this.blockSize; + if (partialBytes > 0) { + partialBytes = this.blockSize - partialBytes; + } + this._partialOutput.clear(); + for (var i = 0; i < this._ints; ++i) { + this._partialOutput.putInt32(input.getInt32() ^ this._outBlock[i]); + } + if (partialBytes <= 0 || finish) { + if (finish) { + var overflow = inputLength % this.blockSize; + this._cipherLength += overflow; + this._partialOutput.truncate(this.blockSize - overflow); + } else { + this._cipherLength += this.blockSize; + } + for (var i = 0; i < this._ints; ++i) { + this._outBlock[i] = this._partialOutput.getInt32(); + } + this._partialOutput.read -= this.blockSize; + } + if (this._partialBytes > 0) { + this._partialOutput.getBytes(this._partialBytes); + } + if (partialBytes > 0 && !finish) { + input.read -= this.blockSize; + output.putBytes(this._partialOutput.getBytes( + partialBytes - this._partialBytes + )); + this._partialBytes = partialBytes; + return true; + } + output.putBytes(this._partialOutput.getBytes( + inputLength - this._partialBytes + )); + this._partialBytes = 0; + } + this._s = this.ghash(this._hashSubkey, this._s, this._outBlock); + inc32(this._inBlock); + }; + modes.gcm.prototype.decrypt = function(input, output, finish) { + var inputLength = input.length(); + if (inputLength < this.blockSize && !(finish && inputLength > 0)) { + return true; + } + this.cipher.encrypt(this._inBlock, this._outBlock); + inc32(this._inBlock); + this._hashBlock[0] = input.getInt32(); + this._hashBlock[1] = input.getInt32(); + this._hashBlock[2] = input.getInt32(); + this._hashBlock[3] = input.getInt32(); + this._s = this.ghash(this._hashSubkey, this._s, this._hashBlock); + for (var i = 0; i < this._ints; ++i) { + output.putInt32(this._outBlock[i] ^ this._hashBlock[i]); + } + if (inputLength < this.blockSize) { + this._cipherLength += inputLength % this.blockSize; + } else { + this._cipherLength += this.blockSize; + } + }; + modes.gcm.prototype.afterFinish = function(output, options) { + var rval = true; + if (options.decrypt && options.overflow) { + output.truncate(this.blockSize - options.overflow); + } + this.tag = forge3.util.createBuffer(); + var lengths = this._aDataLength.concat(from64To32(this._cipherLength * 8)); + this._s = this.ghash(this._hashSubkey, this._s, lengths); + var tag = []; + this.cipher.encrypt(this._j0, tag); + for (var i = 0; i < this._ints; ++i) { + this.tag.putInt32(this._s[i] ^ tag[i]); + } + this.tag.truncate(this.tag.length() % (this._tagLength / 8)); + if (options.decrypt && this.tag.bytes() !== this._tag) { + rval = false; + } + return rval; + }; + modes.gcm.prototype.multiply = function(x, y) { + var z_i = [0, 0, 0, 0]; + var v_i = y.slice(0); + for (var i = 0; i < 128; ++i) { + var x_i = x[i / 32 | 0] & 1 << 31 - i % 32; + if (x_i) { + z_i[0] ^= v_i[0]; + z_i[1] ^= v_i[1]; + z_i[2] ^= v_i[2]; + z_i[3] ^= v_i[3]; + } + this.pow(v_i, v_i); + } + return z_i; + }; + modes.gcm.prototype.pow = function(x, out) { + var lsb = x[3] & 1; + for (var i = 3; i > 0; --i) { + out[i] = x[i] >>> 1 | (x[i - 1] & 1) << 31; + } + out[0] = x[0] >>> 1; + if (lsb) { + out[0] ^= this._R; + } + }; + modes.gcm.prototype.tableMultiply = function(x) { + var z = [0, 0, 0, 0]; + for (var i = 0; i < 32; ++i) { + var idx = i / 8 | 0; + var x_i = x[idx] >>> (7 - i % 8) * 4 & 15; + var ah = this._m[i][x_i]; + z[0] ^= ah[0]; + z[1] ^= ah[1]; + z[2] ^= ah[2]; + z[3] ^= ah[3]; + } + return z; + }; + modes.gcm.prototype.ghash = function(h, y, x) { + y[0] ^= x[0]; + y[1] ^= x[1]; + y[2] ^= x[2]; + y[3] ^= x[3]; + return this.tableMultiply(y); + }; + modes.gcm.prototype.generateHashTable = function(h, bits) { + var multiplier = 8 / bits; + var perInt = 4 * multiplier; + var size = 16 * multiplier; + var m = new Array(size); + for (var i = 0; i < size; ++i) { + var tmp = [0, 0, 0, 0]; + var idx = i / perInt | 0; + var shft = (perInt - 1 - i % perInt) * bits; + tmp[idx] = 1 << bits - 1 << shft; + m[i] = this.generateSubHashTable(this.multiply(tmp, h), bits); + } + return m; + }; + modes.gcm.prototype.generateSubHashTable = function(mid, bits) { + var size = 1 << bits; + var half = size >>> 1; + var m = new Array(size); + m[half] = mid.slice(0); + var i = half >>> 1; + while (i > 0) { + this.pow(m[2 * i], m[i] = []); + i >>= 1; + } + i = 2; + while (i < half) { + for (var j = 1; j < i; ++j) { + var m_i = m[i]; + var m_j = m[j]; + m[i + j] = [ + m_i[0] ^ m_j[0], + m_i[1] ^ m_j[1], + m_i[2] ^ m_j[2], + m_i[3] ^ m_j[3] + ]; + } + i *= 2; + } + m[0] = [0, 0, 0, 0]; + for (i = half + 1; i < size; ++i) { + var c = m[i ^ half]; + m[i] = [mid[0] ^ c[0], mid[1] ^ c[1], mid[2] ^ c[2], mid[3] ^ c[3]]; + } + return m; + }; + function transformIV(iv, blockSize) { + if (typeof iv === "string") { + iv = forge3.util.createBuffer(iv); + } + if (forge3.util.isArray(iv) && iv.length > 4) { + var tmp = iv; + iv = forge3.util.createBuffer(); + for (var i = 0; i < tmp.length; ++i) { + iv.putByte(tmp[i]); + } + } + if (iv.length() < blockSize) { + throw new Error( + "Invalid IV length; got " + iv.length() + " bytes and expected " + blockSize + " bytes." + ); + } + if (!forge3.util.isArray(iv)) { + var ints = []; + var blocks = blockSize / 4; + for (var i = 0; i < blocks; ++i) { + ints.push(iv.getInt32()); + } + iv = ints; + } + return iv; + } + function inc32(block) { + block[block.length - 1] = block[block.length - 1] + 1 & 4294967295; + } + function from64To32(num) { + return [num / 4294967296 | 0, num & 4294967295]; + } + } +}); + +// node_modules/node-forge/lib/aes.js +var require_aes = __commonJS({ + "node_modules/node-forge/lib/aes.js"(exports, module) { + var forge3 = require_forge(); + require_cipher(); + require_cipherModes(); + require_util(); + module.exports = forge3.aes = forge3.aes || {}; + forge3.aes.startEncrypting = function(key, iv, output, mode) { + var cipher = _createCipher({ + key, + output, + decrypt: false, + mode + }); + cipher.start(iv); + return cipher; + }; + forge3.aes.createEncryptionCipher = function(key, mode) { + return _createCipher({ + key, + output: null, + decrypt: false, + mode + }); + }; + forge3.aes.startDecrypting = function(key, iv, output, mode) { + var cipher = _createCipher({ + key, + output, + decrypt: true, + mode + }); + cipher.start(iv); + return cipher; + }; + forge3.aes.createDecryptionCipher = function(key, mode) { + return _createCipher({ + key, + output: null, + decrypt: true, + mode + }); + }; + forge3.aes.Algorithm = function(name, mode) { + if (!init) { + initialize(); + } + var self2 = this; + self2.name = name; + self2.mode = new mode({ + blockSize: 16, + cipher: { + encrypt: function(inBlock, outBlock) { + return _updateBlock(self2._w, inBlock, outBlock, false); + }, + decrypt: function(inBlock, outBlock) { + return _updateBlock(self2._w, inBlock, outBlock, true); + } + } + }); + self2._init = false; + }; + forge3.aes.Algorithm.prototype.initialize = function(options) { + if (this._init) { + return; + } + var key = options.key; + var tmp; + if (typeof key === "string" && (key.length === 16 || key.length === 24 || key.length === 32)) { + key = forge3.util.createBuffer(key); + } else if (forge3.util.isArray(key) && (key.length === 16 || key.length === 24 || key.length === 32)) { + tmp = key; + key = forge3.util.createBuffer(); + for (var i = 0; i < tmp.length; ++i) { + key.putByte(tmp[i]); + } + } + if (!forge3.util.isArray(key)) { + tmp = key; + key = []; + var len = tmp.length(); + if (len === 16 || len === 24 || len === 32) { + len = len >>> 2; + for (var i = 0; i < len; ++i) { + key.push(tmp.getInt32()); + } + } + } + if (!forge3.util.isArray(key) || !(key.length === 4 || key.length === 6 || key.length === 8)) { + throw new Error("Invalid key parameter."); + } + var mode = this.mode.name; + var encryptOp = ["CFB", "OFB", "CTR", "GCM"].indexOf(mode) !== -1; + this._w = _expandKey(key, options.decrypt && !encryptOp); + this._init = true; + }; + forge3.aes._expandKey = function(key, decrypt) { + if (!init) { + initialize(); + } + return _expandKey(key, decrypt); + }; + forge3.aes._updateBlock = _updateBlock; + registerAlgorithm("AES-ECB", forge3.cipher.modes.ecb); + registerAlgorithm("AES-CBC", forge3.cipher.modes.cbc); + registerAlgorithm("AES-CFB", forge3.cipher.modes.cfb); + registerAlgorithm("AES-OFB", forge3.cipher.modes.ofb); + registerAlgorithm("AES-CTR", forge3.cipher.modes.ctr); + registerAlgorithm("AES-GCM", forge3.cipher.modes.gcm); + function registerAlgorithm(name, mode) { + var factory = function() { + return new forge3.aes.Algorithm(name, mode); + }; + forge3.cipher.registerAlgorithm(name, factory); + } + var init = false; + var Nb = 4; + var sbox; + var isbox; + var rcon; + var mix; + var imix; + function initialize() { + init = true; + rcon = [0, 1, 2, 4, 8, 16, 32, 64, 128, 27, 54]; + var xtime = new Array(256); + for (var i = 0; i < 128; ++i) { + xtime[i] = i << 1; + xtime[i + 128] = i + 128 << 1 ^ 283; + } + sbox = new Array(256); + isbox = new Array(256); + mix = new Array(4); + imix = new Array(4); + for (var i = 0; i < 4; ++i) { + mix[i] = new Array(256); + imix[i] = new Array(256); + } + var e = 0, ei = 0, e2, e4, e8, sx, sx2, me, ime; + for (var i = 0; i < 256; ++i) { + sx = ei ^ ei << 1 ^ ei << 2 ^ ei << 3 ^ ei << 4; + sx = sx >> 8 ^ sx & 255 ^ 99; + sbox[e] = sx; + isbox[sx] = e; + sx2 = xtime[sx]; + e2 = xtime[e]; + e4 = xtime[e2]; + e8 = xtime[e4]; + me = sx2 << 24 ^ // 2 + sx << 16 ^ // 1 + sx << 8 ^ // 1 + (sx ^ sx2); + ime = (e2 ^ e4 ^ e8) << 24 ^ // E (14) + (e ^ e8) << 16 ^ // 9 + (e ^ e4 ^ e8) << 8 ^ // D (13) + (e ^ e2 ^ e8); + for (var n = 0; n < 4; ++n) { + mix[n][e] = me; + imix[n][sx] = ime; + me = me << 24 | me >>> 8; + ime = ime << 24 | ime >>> 8; + } + if (e === 0) { + e = ei = 1; + } else { + e = e2 ^ xtime[xtime[xtime[e2 ^ e8]]]; + ei ^= xtime[xtime[ei]]; + } + } + } + function _expandKey(key, decrypt) { + var w = key.slice(0); + var temp, iNk = 1; + var Nk = w.length; + var Nr1 = Nk + 6 + 1; + var end = Nb * Nr1; + for (var i = Nk; i < end; ++i) { + temp = w[i - 1]; + if (i % Nk === 0) { + temp = sbox[temp >>> 16 & 255] << 24 ^ sbox[temp >>> 8 & 255] << 16 ^ sbox[temp & 255] << 8 ^ sbox[temp >>> 24] ^ rcon[iNk] << 24; + iNk++; + } else if (Nk > 6 && i % Nk === 4) { + temp = sbox[temp >>> 24] << 24 ^ sbox[temp >>> 16 & 255] << 16 ^ sbox[temp >>> 8 & 255] << 8 ^ sbox[temp & 255]; + } + w[i] = w[i - Nk] ^ temp; + } + if (decrypt) { + var tmp; + var m0 = imix[0]; + var m1 = imix[1]; + var m2 = imix[2]; + var m3 = imix[3]; + var wnew = w.slice(0); + end = w.length; + for (var i = 0, wi = end - Nb; i < end; i += Nb, wi -= Nb) { + if (i === 0 || i === end - Nb) { + wnew[i] = w[wi]; + wnew[i + 1] = w[wi + 3]; + wnew[i + 2] = w[wi + 2]; + wnew[i + 3] = w[wi + 1]; + } else { + for (var n = 0; n < Nb; ++n) { + tmp = w[wi + n]; + wnew[i + (3 & -n)] = m0[sbox[tmp >>> 24]] ^ m1[sbox[tmp >>> 16 & 255]] ^ m2[sbox[tmp >>> 8 & 255]] ^ m3[sbox[tmp & 255]]; + } + } + } + w = wnew; + } + return w; + } + function _updateBlock(w, input, output, decrypt) { + var Nr = w.length / 4 - 1; + var m0, m1, m2, m3, sub; + if (decrypt) { + m0 = imix[0]; + m1 = imix[1]; + m2 = imix[2]; + m3 = imix[3]; + sub = isbox; + } else { + m0 = mix[0]; + m1 = mix[1]; + m2 = mix[2]; + m3 = mix[3]; + sub = sbox; + } + var a, b, c, d, a2, b2, c2; + a = input[0] ^ w[0]; + b = input[decrypt ? 3 : 1] ^ w[1]; + c = input[2] ^ w[2]; + d = input[decrypt ? 1 : 3] ^ w[3]; + var i = 3; + for (var round = 1; round < Nr; ++round) { + a2 = m0[a >>> 24] ^ m1[b >>> 16 & 255] ^ m2[c >>> 8 & 255] ^ m3[d & 255] ^ w[++i]; + b2 = m0[b >>> 24] ^ m1[c >>> 16 & 255] ^ m2[d >>> 8 & 255] ^ m3[a & 255] ^ w[++i]; + c2 = m0[c >>> 24] ^ m1[d >>> 16 & 255] ^ m2[a >>> 8 & 255] ^ m3[b & 255] ^ w[++i]; + d = m0[d >>> 24] ^ m1[a >>> 16 & 255] ^ m2[b >>> 8 & 255] ^ m3[c & 255] ^ w[++i]; + a = a2; + b = b2; + c = c2; + } + output[0] = sub[a >>> 24] << 24 ^ sub[b >>> 16 & 255] << 16 ^ sub[c >>> 8 & 255] << 8 ^ sub[d & 255] ^ w[++i]; + output[decrypt ? 3 : 1] = sub[b >>> 24] << 24 ^ sub[c >>> 16 & 255] << 16 ^ sub[d >>> 8 & 255] << 8 ^ sub[a & 255] ^ w[++i]; + output[2] = sub[c >>> 24] << 24 ^ sub[d >>> 16 & 255] << 16 ^ sub[a >>> 8 & 255] << 8 ^ sub[b & 255] ^ w[++i]; + output[decrypt ? 1 : 3] = sub[d >>> 24] << 24 ^ sub[a >>> 16 & 255] << 16 ^ sub[b >>> 8 & 255] << 8 ^ sub[c & 255] ^ w[++i]; + } + function _createCipher(options) { + options = options || {}; + var mode = (options.mode || "CBC").toUpperCase(); + var algorithm = "AES-" + mode; + var cipher; + if (options.decrypt) { + cipher = forge3.cipher.createDecipher(algorithm, options.key); + } else { + cipher = forge3.cipher.createCipher(algorithm, options.key); + } + var start = cipher.start; + cipher.start = function(iv, options2) { + var output = null; + if (options2 instanceof forge3.util.ByteBuffer) { + output = options2; + options2 = {}; + } + options2 = options2 || {}; + options2.output = output; + options2.iv = iv; + start.call(cipher, options2); + }; + return cipher; + } + } +}); + +// node_modules/node-forge/lib/oids.js +var require_oids = __commonJS({ + "node_modules/node-forge/lib/oids.js"(exports, module) { + var forge3 = require_forge(); + forge3.pki = forge3.pki || {}; + var oids = module.exports = forge3.pki.oids = forge3.oids = forge3.oids || {}; + function _IN(id, name) { + oids[id] = name; + oids[name] = id; + } + function _I_(id, name) { + oids[id] = name; + } + _IN("1.2.840.113549.1.1.1", "rsaEncryption"); + _IN("1.2.840.113549.1.1.4", "md5WithRSAEncryption"); + _IN("1.2.840.113549.1.1.5", "sha1WithRSAEncryption"); + _IN("1.2.840.113549.1.1.7", "RSAES-OAEP"); + _IN("1.2.840.113549.1.1.8", "mgf1"); + _IN("1.2.840.113549.1.1.9", "pSpecified"); + _IN("1.2.840.113549.1.1.10", "RSASSA-PSS"); + _IN("1.2.840.113549.1.1.11", "sha256WithRSAEncryption"); + _IN("1.2.840.113549.1.1.12", "sha384WithRSAEncryption"); + _IN("1.2.840.113549.1.1.13", "sha512WithRSAEncryption"); + _IN("1.3.101.112", "EdDSA25519"); + _IN("1.2.840.10040.4.3", "dsa-with-sha1"); + _IN("1.3.14.3.2.7", "desCBC"); + _IN("1.3.14.3.2.26", "sha1"); + _IN("1.3.14.3.2.29", "sha1WithRSASignature"); + _IN("2.16.840.1.101.3.4.2.1", "sha256"); + _IN("2.16.840.1.101.3.4.2.2", "sha384"); + _IN("2.16.840.1.101.3.4.2.3", "sha512"); + _IN("2.16.840.1.101.3.4.2.4", "sha224"); + _IN("2.16.840.1.101.3.4.2.5", "sha512-224"); + _IN("2.16.840.1.101.3.4.2.6", "sha512-256"); + _IN("1.2.840.113549.2.2", "md2"); + _IN("1.2.840.113549.2.5", "md5"); + _IN("1.2.840.113549.1.7.1", "data"); + _IN("1.2.840.113549.1.7.2", "signedData"); + _IN("1.2.840.113549.1.7.3", "envelopedData"); + _IN("1.2.840.113549.1.7.4", "signedAndEnvelopedData"); + _IN("1.2.840.113549.1.7.5", "digestedData"); + _IN("1.2.840.113549.1.7.6", "encryptedData"); + _IN("1.2.840.113549.1.9.1", "emailAddress"); + _IN("1.2.840.113549.1.9.2", "unstructuredName"); + _IN("1.2.840.113549.1.9.3", "contentType"); + _IN("1.2.840.113549.1.9.4", "messageDigest"); + _IN("1.2.840.113549.1.9.5", "signingTime"); + _IN("1.2.840.113549.1.9.6", "counterSignature"); + _IN("1.2.840.113549.1.9.7", "challengePassword"); + _IN("1.2.840.113549.1.9.8", "unstructuredAddress"); + _IN("1.2.840.113549.1.9.14", "extensionRequest"); + _IN("1.2.840.113549.1.9.20", "friendlyName"); + _IN("1.2.840.113549.1.9.21", "localKeyId"); + _IN("1.2.840.113549.1.9.22.1", "x509Certificate"); + _IN("1.2.840.113549.1.12.10.1.1", "keyBag"); + _IN("1.2.840.113549.1.12.10.1.2", "pkcs8ShroudedKeyBag"); + _IN("1.2.840.113549.1.12.10.1.3", "certBag"); + _IN("1.2.840.113549.1.12.10.1.4", "crlBag"); + _IN("1.2.840.113549.1.12.10.1.5", "secretBag"); + _IN("1.2.840.113549.1.12.10.1.6", "safeContentsBag"); + _IN("1.2.840.113549.1.5.13", "pkcs5PBES2"); + _IN("1.2.840.113549.1.5.12", "pkcs5PBKDF2"); + _IN("1.2.840.113549.1.12.1.1", "pbeWithSHAAnd128BitRC4"); + _IN("1.2.840.113549.1.12.1.2", "pbeWithSHAAnd40BitRC4"); + _IN("1.2.840.113549.1.12.1.3", "pbeWithSHAAnd3-KeyTripleDES-CBC"); + _IN("1.2.840.113549.1.12.1.4", "pbeWithSHAAnd2-KeyTripleDES-CBC"); + _IN("1.2.840.113549.1.12.1.5", "pbeWithSHAAnd128BitRC2-CBC"); + _IN("1.2.840.113549.1.12.1.6", "pbewithSHAAnd40BitRC2-CBC"); + _IN("1.2.840.113549.2.7", "hmacWithSHA1"); + _IN("1.2.840.113549.2.8", "hmacWithSHA224"); + _IN("1.2.840.113549.2.9", "hmacWithSHA256"); + _IN("1.2.840.113549.2.10", "hmacWithSHA384"); + _IN("1.2.840.113549.2.11", "hmacWithSHA512"); + _IN("1.2.840.113549.3.7", "des-EDE3-CBC"); + _IN("2.16.840.1.101.3.4.1.2", "aes128-CBC"); + _IN("2.16.840.1.101.3.4.1.22", "aes192-CBC"); + _IN("2.16.840.1.101.3.4.1.42", "aes256-CBC"); + _IN("2.5.4.3", "commonName"); + _IN("2.5.4.4", "surname"); + _IN("2.5.4.5", "serialNumber"); + _IN("2.5.4.6", "countryName"); + _IN("2.5.4.7", "localityName"); + _IN("2.5.4.8", "stateOrProvinceName"); + _IN("2.5.4.9", "streetAddress"); + _IN("2.5.4.10", "organizationName"); + _IN("2.5.4.11", "organizationalUnitName"); + _IN("2.5.4.12", "title"); + _IN("2.5.4.13", "description"); + _IN("2.5.4.15", "businessCategory"); + _IN("2.5.4.17", "postalCode"); + _IN("2.5.4.42", "givenName"); + _IN("1.3.6.1.4.1.311.60.2.1.2", "jurisdictionOfIncorporationStateOrProvinceName"); + _IN("1.3.6.1.4.1.311.60.2.1.3", "jurisdictionOfIncorporationCountryName"); + _IN("2.16.840.1.113730.1.1", "nsCertType"); + _IN("2.16.840.1.113730.1.13", "nsComment"); + _I_("2.5.29.1", "authorityKeyIdentifier"); + _I_("2.5.29.2", "keyAttributes"); + _I_("2.5.29.3", "certificatePolicies"); + _I_("2.5.29.4", "keyUsageRestriction"); + _I_("2.5.29.5", "policyMapping"); + _I_("2.5.29.6", "subtreesConstraint"); + _I_("2.5.29.7", "subjectAltName"); + _I_("2.5.29.8", "issuerAltName"); + _I_("2.5.29.9", "subjectDirectoryAttributes"); + _I_("2.5.29.10", "basicConstraints"); + _I_("2.5.29.11", "nameConstraints"); + _I_("2.5.29.12", "policyConstraints"); + _I_("2.5.29.13", "basicConstraints"); + _IN("2.5.29.14", "subjectKeyIdentifier"); + _IN("2.5.29.15", "keyUsage"); + _I_("2.5.29.16", "privateKeyUsagePeriod"); + _IN("2.5.29.17", "subjectAltName"); + _IN("2.5.29.18", "issuerAltName"); + _IN("2.5.29.19", "basicConstraints"); + _I_("2.5.29.20", "cRLNumber"); + _I_("2.5.29.21", "cRLReason"); + _I_("2.5.29.22", "expirationDate"); + _I_("2.5.29.23", "instructionCode"); + _I_("2.5.29.24", "invalidityDate"); + _I_("2.5.29.25", "cRLDistributionPoints"); + _I_("2.5.29.26", "issuingDistributionPoint"); + _I_("2.5.29.27", "deltaCRLIndicator"); + _I_("2.5.29.28", "issuingDistributionPoint"); + _I_("2.5.29.29", "certificateIssuer"); + _I_("2.5.29.30", "nameConstraints"); + _IN("2.5.29.31", "cRLDistributionPoints"); + _IN("2.5.29.32", "certificatePolicies"); + _I_("2.5.29.33", "policyMappings"); + _I_("2.5.29.34", "policyConstraints"); + _IN("2.5.29.35", "authorityKeyIdentifier"); + _I_("2.5.29.36", "policyConstraints"); + _IN("2.5.29.37", "extKeyUsage"); + _I_("2.5.29.46", "freshestCRL"); + _I_("2.5.29.54", "inhibitAnyPolicy"); + _IN("1.3.6.1.4.1.11129.2.4.2", "timestampList"); + _IN("1.3.6.1.5.5.7.1.1", "authorityInfoAccess"); + _IN("1.3.6.1.5.5.7.3.1", "serverAuth"); + _IN("1.3.6.1.5.5.7.3.2", "clientAuth"); + _IN("1.3.6.1.5.5.7.3.3", "codeSigning"); + _IN("1.3.6.1.5.5.7.3.4", "emailProtection"); + _IN("1.3.6.1.5.5.7.3.8", "timeStamping"); + } +}); + +// node_modules/node-forge/lib/asn1.js +var require_asn1 = __commonJS({ + "node_modules/node-forge/lib/asn1.js"(exports, module) { + var forge3 = require_forge(); + require_util(); + require_oids(); + var asn1 = module.exports = forge3.asn1 = forge3.asn1 || {}; + asn1.Class = { + UNIVERSAL: 0, + APPLICATION: 64, + CONTEXT_SPECIFIC: 128, + PRIVATE: 192 + }; + asn1.Type = { + NONE: 0, + BOOLEAN: 1, + INTEGER: 2, + BITSTRING: 3, + OCTETSTRING: 4, + NULL: 5, + OID: 6, + ODESC: 7, + EXTERNAL: 8, + REAL: 9, + ENUMERATED: 10, + EMBEDDED: 11, + UTF8: 12, + ROID: 13, + SEQUENCE: 16, + SET: 17, + PRINTABLESTRING: 19, + IA5STRING: 22, + UTCTIME: 23, + GENERALIZEDTIME: 24, + BMPSTRING: 30 + }; + asn1.create = function(tagClass, type, constructed, value, options) { + if (forge3.util.isArray(value)) { + var tmp = []; + for (var i = 0; i < value.length; ++i) { + if (value[i] !== void 0) { + tmp.push(value[i]); + } + } + value = tmp; + } + var obj = { + tagClass, + type, + constructed, + composed: constructed || forge3.util.isArray(value), + value + }; + if (options && "bitStringContents" in options) { + obj.bitStringContents = options.bitStringContents; + obj.original = asn1.copy(obj); + } + return obj; + }; + asn1.copy = function(obj, options) { + var copy; + if (forge3.util.isArray(obj)) { + copy = []; + for (var i = 0; i < obj.length; ++i) { + copy.push(asn1.copy(obj[i], options)); + } + return copy; + } + if (typeof obj === "string") { + return obj; + } + copy = { + tagClass: obj.tagClass, + type: obj.type, + constructed: obj.constructed, + composed: obj.composed, + value: asn1.copy(obj.value, options) + }; + if (options && !options.excludeBitStringContents) { + copy.bitStringContents = obj.bitStringContents; + } + return copy; + }; + asn1.equals = function(obj1, obj2, options) { + if (forge3.util.isArray(obj1)) { + if (!forge3.util.isArray(obj2)) { + return false; + } + if (obj1.length !== obj2.length) { + return false; + } + for (var i = 0; i < obj1.length; ++i) { + if (!asn1.equals(obj1[i], obj2[i])) { + return false; + } + } + return true; + } + if (typeof obj1 !== typeof obj2) { + return false; + } + if (typeof obj1 === "string") { + return obj1 === obj2; + } + var equal = obj1.tagClass === obj2.tagClass && obj1.type === obj2.type && obj1.constructed === obj2.constructed && obj1.composed === obj2.composed && asn1.equals(obj1.value, obj2.value); + if (options && options.includeBitStringContents) { + equal = equal && obj1.bitStringContents === obj2.bitStringContents; + } + return equal; + }; + asn1.getBerValueLength = function(b) { + var b2 = b.getByte(); + if (b2 === 128) { + return void 0; + } + var length; + var longForm = b2 & 128; + if (!longForm) { + length = b2; + } else { + length = b.getInt((b2 & 127) << 3); + } + return length; + }; + function _checkBufferLength(bytes, remaining, n) { + if (n > remaining) { + var error = new Error("Too few bytes to parse DER."); + error.available = bytes.length(); + error.remaining = remaining; + error.requested = n; + throw error; + } + } + var _getValueLength = function(bytes, remaining) { + var b2 = bytes.getByte(); + remaining--; + if (b2 === 128) { + return void 0; + } + var length; + var longForm = b2 & 128; + if (!longForm) { + length = b2; + } else { + var longFormBytes = b2 & 127; + _checkBufferLength(bytes, remaining, longFormBytes); + length = bytes.getInt(longFormBytes << 3); + } + if (length < 0) { + throw new Error("Negative length: " + length); + } + return length; + }; + asn1.fromDer = function(bytes, options) { + if (options === void 0) { + options = { + strict: true, + parseAllBytes: true, + decodeBitStrings: true + }; + } + if (typeof options === "boolean") { + options = { + strict: options, + parseAllBytes: true, + decodeBitStrings: true + }; + } + if (!("strict" in options)) { + options.strict = true; + } + if (!("parseAllBytes" in options)) { + options.parseAllBytes = true; + } + if (!("decodeBitStrings" in options)) { + options.decodeBitStrings = true; + } + if (typeof bytes === "string") { + bytes = forge3.util.createBuffer(bytes); + } + var byteCount = bytes.length(); + var value = _fromDer(bytes, bytes.length(), 0, options); + if (options.parseAllBytes && bytes.length() !== 0) { + var error = new Error("Unparsed DER bytes remain after ASN.1 parsing."); + error.byteCount = byteCount; + error.remaining = bytes.length(); + throw error; + } + return value; + }; + function _fromDer(bytes, remaining, depth, options) { + var start; + _checkBufferLength(bytes, remaining, 2); + var b1 = bytes.getByte(); + remaining--; + var tagClass = b1 & 192; + var type = b1 & 31; + start = bytes.length(); + var length = _getValueLength(bytes, remaining); + remaining -= start - bytes.length(); + if (length !== void 0 && length > remaining) { + if (options.strict) { + var error = new Error("Too few bytes to read ASN.1 value."); + error.available = bytes.length(); + error.remaining = remaining; + error.requested = length; + throw error; + } + length = remaining; + } + var value; + var bitStringContents; + var constructed = (b1 & 32) === 32; + if (constructed) { + value = []; + if (length === void 0) { + for (; ; ) { + _checkBufferLength(bytes, remaining, 2); + if (bytes.bytes(2) === String.fromCharCode(0, 0)) { + bytes.getBytes(2); + remaining -= 2; + break; + } + start = bytes.length(); + value.push(_fromDer(bytes, remaining, depth + 1, options)); + remaining -= start - bytes.length(); + } + } else { + while (length > 0) { + start = bytes.length(); + value.push(_fromDer(bytes, length, depth + 1, options)); + remaining -= start - bytes.length(); + length -= start - bytes.length(); + } + } + } + if (value === void 0 && tagClass === asn1.Class.UNIVERSAL && type === asn1.Type.BITSTRING) { + bitStringContents = bytes.bytes(length); + } + if (value === void 0 && options.decodeBitStrings && tagClass === asn1.Class.UNIVERSAL && // FIXME: OCTET STRINGs not yet supported here + // .. other parts of forge expect to decode OCTET STRINGs manually + type === asn1.Type.BITSTRING && length > 1) { + var savedRead = bytes.read; + var savedRemaining = remaining; + var unused = 0; + if (type === asn1.Type.BITSTRING) { + _checkBufferLength(bytes, remaining, 1); + unused = bytes.getByte(); + remaining--; + } + if (unused === 0) { + try { + start = bytes.length(); + var subOptions = { + // enforce strict mode to avoid parsing ASN.1 from plain data + strict: true, + decodeBitStrings: true + }; + var composed = _fromDer(bytes, remaining, depth + 1, subOptions); + var used = start - bytes.length(); + remaining -= used; + if (type == asn1.Type.BITSTRING) { + used++; + } + var tc = composed.tagClass; + if (used === length && (tc === asn1.Class.UNIVERSAL || tc === asn1.Class.CONTEXT_SPECIFIC)) { + value = [composed]; + } + } catch (ex) { + } + } + if (value === void 0) { + bytes.read = savedRead; + remaining = savedRemaining; + } + } + if (value === void 0) { + if (length === void 0) { + if (options.strict) { + throw new Error("Non-constructed ASN.1 object of indefinite length."); + } + length = remaining; + } + if (type === asn1.Type.BMPSTRING) { + value = ""; + for (; length > 0; length -= 2) { + _checkBufferLength(bytes, remaining, 2); + value += String.fromCharCode(bytes.getInt16()); + remaining -= 2; + } + } else { + value = bytes.getBytes(length); + remaining -= length; + } + } + var asn1Options = bitStringContents === void 0 ? null : { + bitStringContents + }; + return asn1.create(tagClass, type, constructed, value, asn1Options); + } + asn1.toDer = function(obj) { + var bytes = forge3.util.createBuffer(); + var b1 = obj.tagClass | obj.type; + var value = forge3.util.createBuffer(); + var useBitStringContents = false; + if ("bitStringContents" in obj) { + useBitStringContents = true; + if (obj.original) { + useBitStringContents = asn1.equals(obj, obj.original); + } + } + if (useBitStringContents) { + value.putBytes(obj.bitStringContents); + } else if (obj.composed) { + if (obj.constructed) { + b1 |= 32; + } else { + value.putByte(0); + } + for (var i = 0; i < obj.value.length; ++i) { + if (obj.value[i] !== void 0) { + value.putBuffer(asn1.toDer(obj.value[i])); + } + } + } else { + if (obj.type === asn1.Type.BMPSTRING) { + for (var i = 0; i < obj.value.length; ++i) { + value.putInt16(obj.value.charCodeAt(i)); + } + } else { + if (obj.type === asn1.Type.INTEGER && obj.value.length > 1 && // leading 0x00 for positive integer + (obj.value.charCodeAt(0) === 0 && (obj.value.charCodeAt(1) & 128) === 0 || // leading 0xFF for negative integer + obj.value.charCodeAt(0) === 255 && (obj.value.charCodeAt(1) & 128) === 128)) { + value.putBytes(obj.value.substr(1)); + } else { + value.putBytes(obj.value); + } + } + } + bytes.putByte(b1); + if (value.length() <= 127) { + bytes.putByte(value.length() & 127); + } else { + var len = value.length(); + var lenBytes = ""; + do { + lenBytes += String.fromCharCode(len & 255); + len = len >>> 8; + } while (len > 0); + bytes.putByte(lenBytes.length | 128); + for (var i = lenBytes.length - 1; i >= 0; --i) { + bytes.putByte(lenBytes.charCodeAt(i)); + } + } + bytes.putBuffer(value); + return bytes; + }; + asn1.oidToDer = function(oid) { + var values = oid.split("."); + var bytes = forge3.util.createBuffer(); + bytes.putByte(40 * parseInt(values[0], 10) + parseInt(values[1], 10)); + var last, valueBytes, value, b; + for (var i = 2; i < values.length; ++i) { + last = true; + valueBytes = []; + value = parseInt(values[i], 10); + do { + b = value & 127; + value = value >>> 7; + if (!last) { + b |= 128; + } + valueBytes.push(b); + last = false; + } while (value > 0); + for (var n = valueBytes.length - 1; n >= 0; --n) { + bytes.putByte(valueBytes[n]); + } + } + return bytes; + }; + asn1.derToOid = function(bytes) { + var oid; + if (typeof bytes === "string") { + bytes = forge3.util.createBuffer(bytes); + } + var b = bytes.getByte(); + oid = Math.floor(b / 40) + "." + b % 40; + var value = 0; + while (bytes.length() > 0) { + b = bytes.getByte(); + value = value << 7; + if (b & 128) { + value += b & 127; + } else { + oid += "." + (value + b); + value = 0; + } + } + return oid; + }; + asn1.utcTimeToDate = function(utc) { + var date = /* @__PURE__ */ new Date(); + var year = parseInt(utc.substr(0, 2), 10); + year = year >= 50 ? 1900 + year : 2e3 + year; + var MM = parseInt(utc.substr(2, 2), 10) - 1; + var DD = parseInt(utc.substr(4, 2), 10); + var hh = parseInt(utc.substr(6, 2), 10); + var mm = parseInt(utc.substr(8, 2), 10); + var ss = 0; + if (utc.length > 11) { + var c = utc.charAt(10); + var end = 10; + if (c !== "+" && c !== "-") { + ss = parseInt(utc.substr(10, 2), 10); + end += 2; + } + } + date.setUTCFullYear(year, MM, DD); + date.setUTCHours(hh, mm, ss, 0); + if (end) { + c = utc.charAt(end); + if (c === "+" || c === "-") { + var hhoffset = parseInt(utc.substr(end + 1, 2), 10); + var mmoffset = parseInt(utc.substr(end + 4, 2), 10); + var offset = hhoffset * 60 + mmoffset; + offset *= 6e4; + if (c === "+") { + date.setTime(+date - offset); + } else { + date.setTime(+date + offset); + } + } + } + return date; + }; + asn1.generalizedTimeToDate = function(gentime) { + var date = /* @__PURE__ */ new Date(); + var YYYY = parseInt(gentime.substr(0, 4), 10); + var MM = parseInt(gentime.substr(4, 2), 10) - 1; + var DD = parseInt(gentime.substr(6, 2), 10); + var hh = parseInt(gentime.substr(8, 2), 10); + var mm = parseInt(gentime.substr(10, 2), 10); + var ss = parseInt(gentime.substr(12, 2), 10); + var fff = 0; + var offset = 0; + var isUTC = false; + if (gentime.charAt(gentime.length - 1) === "Z") { + isUTC = true; + } + var end = gentime.length - 5, c = gentime.charAt(end); + if (c === "+" || c === "-") { + var hhoffset = parseInt(gentime.substr(end + 1, 2), 10); + var mmoffset = parseInt(gentime.substr(end + 4, 2), 10); + offset = hhoffset * 60 + mmoffset; + offset *= 6e4; + if (c === "+") { + offset *= -1; + } + isUTC = true; + } + if (gentime.charAt(14) === ".") { + fff = parseFloat(gentime.substr(14), 10) * 1e3; + } + if (isUTC) { + date.setUTCFullYear(YYYY, MM, DD); + date.setUTCHours(hh, mm, ss, fff); + date.setTime(+date + offset); + } else { + date.setFullYear(YYYY, MM, DD); + date.setHours(hh, mm, ss, fff); + } + return date; + }; + asn1.dateToUtcTime = function(date) { + if (typeof date === "string") { + return date; + } + var rval = ""; + var format = []; + format.push(("" + date.getUTCFullYear()).substr(2)); + format.push("" + (date.getUTCMonth() + 1)); + format.push("" + date.getUTCDate()); + format.push("" + date.getUTCHours()); + format.push("" + date.getUTCMinutes()); + format.push("" + date.getUTCSeconds()); + for (var i = 0; i < format.length; ++i) { + if (format[i].length < 2) { + rval += "0"; + } + rval += format[i]; + } + rval += "Z"; + return rval; + }; + asn1.dateToGeneralizedTime = function(date) { + if (typeof date === "string") { + return date; + } + var rval = ""; + var format = []; + format.push("" + date.getUTCFullYear()); + format.push("" + (date.getUTCMonth() + 1)); + format.push("" + date.getUTCDate()); + format.push("" + date.getUTCHours()); + format.push("" + date.getUTCMinutes()); + format.push("" + date.getUTCSeconds()); + for (var i = 0; i < format.length; ++i) { + if (format[i].length < 2) { + rval += "0"; + } + rval += format[i]; + } + rval += "Z"; + return rval; + }; + asn1.integerToDer = function(x) { + var rval = forge3.util.createBuffer(); + if (x >= -128 && x < 128) { + return rval.putSignedInt(x, 8); + } + if (x >= -32768 && x < 32768) { + return rval.putSignedInt(x, 16); + } + if (x >= -8388608 && x < 8388608) { + return rval.putSignedInt(x, 24); + } + if (x >= -2147483648 && x < 2147483648) { + return rval.putSignedInt(x, 32); + } + var error = new Error("Integer too large; max is 32-bits."); + error.integer = x; + throw error; + }; + asn1.derToInteger = function(bytes) { + if (typeof bytes === "string") { + bytes = forge3.util.createBuffer(bytes); + } + var n = bytes.length() * 8; + if (n > 32) { + throw new Error("Integer too large; max is 32-bits."); + } + return bytes.getSignedInt(n); + }; + asn1.validate = function(obj, v, capture, errors) { + var rval = false; + if ((obj.tagClass === v.tagClass || typeof v.tagClass === "undefined") && (obj.type === v.type || typeof v.type === "undefined")) { + if (obj.constructed === v.constructed || typeof v.constructed === "undefined") { + rval = true; + if (v.value && forge3.util.isArray(v.value)) { + var j = 0; + for (var i = 0; rval && i < v.value.length; ++i) { + rval = v.value[i].optional || false; + if (obj.value[j]) { + rval = asn1.validate(obj.value[j], v.value[i], capture, errors); + if (rval) { + ++j; + } else if (v.value[i].optional) { + rval = true; + } + } + if (!rval && errors) { + errors.push( + "[" + v.name + '] Tag class "' + v.tagClass + '", type "' + v.type + '" expected value length "' + v.value.length + '", got "' + obj.value.length + '"' + ); + } + } + } + if (rval && capture) { + if (v.capture) { + capture[v.capture] = obj.value; + } + if (v.captureAsn1) { + capture[v.captureAsn1] = obj; + } + if (v.captureBitStringContents && "bitStringContents" in obj) { + capture[v.captureBitStringContents] = obj.bitStringContents; + } + if (v.captureBitStringValue && "bitStringContents" in obj) { + var value; + if (obj.bitStringContents.length < 2) { + capture[v.captureBitStringValue] = ""; + } else { + var unused = obj.bitStringContents.charCodeAt(0); + if (unused !== 0) { + throw new Error( + "captureBitStringValue only supported for zero unused bits" + ); + } + capture[v.captureBitStringValue] = obj.bitStringContents.slice(1); + } + } + } + } else if (errors) { + errors.push( + "[" + v.name + '] Expected constructed "' + v.constructed + '", got "' + obj.constructed + '"' + ); + } + } else if (errors) { + if (obj.tagClass !== v.tagClass) { + errors.push( + "[" + v.name + '] Expected tag class "' + v.tagClass + '", got "' + obj.tagClass + '"' + ); + } + if (obj.type !== v.type) { + errors.push( + "[" + v.name + '] Expected type "' + v.type + '", got "' + obj.type + '"' + ); + } + } + return rval; + }; + var _nonLatinRegex = /[^\\u0000-\\u00ff]/; + asn1.prettyPrint = function(obj, level, indentation) { + var rval = ""; + level = level || 0; + indentation = indentation || 2; + if (level > 0) { + rval += "\n"; + } + var indent = ""; + for (var i = 0; i < level * indentation; ++i) { + indent += " "; + } + rval += indent + "Tag: "; + switch (obj.tagClass) { + case asn1.Class.UNIVERSAL: + rval += "Universal:"; + break; + case asn1.Class.APPLICATION: + rval += "Application:"; + break; + case asn1.Class.CONTEXT_SPECIFIC: + rval += "Context-Specific:"; + break; + case asn1.Class.PRIVATE: + rval += "Private:"; + break; + } + if (obj.tagClass === asn1.Class.UNIVERSAL) { + rval += obj.type; + switch (obj.type) { + case asn1.Type.NONE: + rval += " (None)"; + break; + case asn1.Type.BOOLEAN: + rval += " (Boolean)"; + break; + case asn1.Type.INTEGER: + rval += " (Integer)"; + break; + case asn1.Type.BITSTRING: + rval += " (Bit string)"; + break; + case asn1.Type.OCTETSTRING: + rval += " (Octet string)"; + break; + case asn1.Type.NULL: + rval += " (Null)"; + break; + case asn1.Type.OID: + rval += " (Object Identifier)"; + break; + case asn1.Type.ODESC: + rval += " (Object Descriptor)"; + break; + case asn1.Type.EXTERNAL: + rval += " (External or Instance of)"; + break; + case asn1.Type.REAL: + rval += " (Real)"; + break; + case asn1.Type.ENUMERATED: + rval += " (Enumerated)"; + break; + case asn1.Type.EMBEDDED: + rval += " (Embedded PDV)"; + break; + case asn1.Type.UTF8: + rval += " (UTF8)"; + break; + case asn1.Type.ROID: + rval += " (Relative Object Identifier)"; + break; + case asn1.Type.SEQUENCE: + rval += " (Sequence)"; + break; + case asn1.Type.SET: + rval += " (Set)"; + break; + case asn1.Type.PRINTABLESTRING: + rval += " (Printable String)"; + break; + case asn1.Type.IA5String: + rval += " (IA5String (ASCII))"; + break; + case asn1.Type.UTCTIME: + rval += " (UTC time)"; + break; + case asn1.Type.GENERALIZEDTIME: + rval += " (Generalized time)"; + break; + case asn1.Type.BMPSTRING: + rval += " (BMP String)"; + break; + } + } else { + rval += obj.type; + } + rval += "\n"; + rval += indent + "Constructed: " + obj.constructed + "\n"; + if (obj.composed) { + var subvalues = 0; + var sub = ""; + for (var i = 0; i < obj.value.length; ++i) { + if (obj.value[i] !== void 0) { + subvalues += 1; + sub += asn1.prettyPrint(obj.value[i], level + 1, indentation); + if (i + 1 < obj.value.length) { + sub += ","; + } + } + } + rval += indent + "Sub values: " + subvalues + sub; + } else { + rval += indent + "Value: "; + if (obj.type === asn1.Type.OID) { + var oid = asn1.derToOid(obj.value); + rval += oid; + if (forge3.pki && forge3.pki.oids) { + if (oid in forge3.pki.oids) { + rval += " (" + forge3.pki.oids[oid] + ") "; + } + } + } + if (obj.type === asn1.Type.INTEGER) { + try { + rval += asn1.derToInteger(obj.value); + } catch (ex) { + rval += "0x" + forge3.util.bytesToHex(obj.value); + } + } else if (obj.type === asn1.Type.BITSTRING) { + if (obj.value.length > 1) { + rval += "0x" + forge3.util.bytesToHex(obj.value.slice(1)); + } else { + rval += "(none)"; + } + if (obj.value.length > 0) { + var unused = obj.value.charCodeAt(0); + if (unused == 1) { + rval += " (1 unused bit shown)"; + } else if (unused > 1) { + rval += " (" + unused + " unused bits shown)"; + } + } + } else if (obj.type === asn1.Type.OCTETSTRING) { + if (!_nonLatinRegex.test(obj.value)) { + rval += "(" + obj.value + ") "; + } + rval += "0x" + forge3.util.bytesToHex(obj.value); + } else if (obj.type === asn1.Type.UTF8) { + try { + rval += forge3.util.decodeUtf8(obj.value); + } catch (e) { + if (e.message === "URI malformed") { + rval += "0x" + forge3.util.bytesToHex(obj.value) + " (malformed UTF8)"; + } else { + throw e; + } + } + } else if (obj.type === asn1.Type.PRINTABLESTRING || obj.type === asn1.Type.IA5String) { + rval += obj.value; + } else if (_nonLatinRegex.test(obj.value)) { + rval += "0x" + forge3.util.bytesToHex(obj.value); + } else if (obj.value.length === 0) { + rval += "[null]"; + } else { + rval += obj.value; + } + } + return rval; + }; + } +}); + +// node_modules/node-forge/lib/md.js +var require_md = __commonJS({ + "node_modules/node-forge/lib/md.js"(exports, module) { + var forge3 = require_forge(); + module.exports = forge3.md = forge3.md || {}; + forge3.md.algorithms = forge3.md.algorithms || {}; + } +}); + +// node_modules/node-forge/lib/hmac.js +var require_hmac = __commonJS({ + "node_modules/node-forge/lib/hmac.js"(exports, module) { + var forge3 = require_forge(); + require_md(); + require_util(); + var hmac = module.exports = forge3.hmac = forge3.hmac || {}; + hmac.create = function() { + var _key = null; + var _md = null; + var _ipadding = null; + var _opadding = null; + var ctx = {}; + ctx.start = function(md, key) { + if (md !== null) { + if (typeof md === "string") { + md = md.toLowerCase(); + if (md in forge3.md.algorithms) { + _md = forge3.md.algorithms[md].create(); + } else { + throw new Error('Unknown hash algorithm "' + md + '"'); + } + } else { + _md = md; + } + } + if (key === null) { + key = _key; + } else { + if (typeof key === "string") { + key = forge3.util.createBuffer(key); + } else if (forge3.util.isArray(key)) { + var tmp = key; + key = forge3.util.createBuffer(); + for (var i = 0; i < tmp.length; ++i) { + key.putByte(tmp[i]); + } + } + var keylen = key.length(); + if (keylen > _md.blockLength) { + _md.start(); + _md.update(key.bytes()); + key = _md.digest(); + } + _ipadding = forge3.util.createBuffer(); + _opadding = forge3.util.createBuffer(); + keylen = key.length(); + for (var i = 0; i < keylen; ++i) { + var tmp = key.at(i); + _ipadding.putByte(54 ^ tmp); + _opadding.putByte(92 ^ tmp); + } + if (keylen < _md.blockLength) { + var tmp = _md.blockLength - keylen; + for (var i = 0; i < tmp; ++i) { + _ipadding.putByte(54); + _opadding.putByte(92); + } + } + _key = key; + _ipadding = _ipadding.bytes(); + _opadding = _opadding.bytes(); + } + _md.start(); + _md.update(_ipadding); + }; + ctx.update = function(bytes) { + _md.update(bytes); + }; + ctx.getMac = function() { + var inner = _md.digest().bytes(); + _md.start(); + _md.update(_opadding); + _md.update(inner); + return _md.digest(); + }; + ctx.digest = ctx.getMac; + return ctx; + }; + } +}); + +// node_modules/node-forge/lib/md5.js +var require_md5 = __commonJS({ + "node_modules/node-forge/lib/md5.js"(exports, module) { + var forge3 = require_forge(); + require_md(); + require_util(); + var md5 = module.exports = forge3.md5 = forge3.md5 || {}; + forge3.md.md5 = forge3.md.algorithms.md5 = md5; + md5.create = function() { + if (!_initialized) { + _init(); + } + var _state = null; + var _input = forge3.util.createBuffer(); + var _w = new Array(16); + var md = { + algorithm: "md5", + blockLength: 64, + digestLength: 16, + // 56-bit length of message so far (does not including padding) + messageLength: 0, + // true message length + fullMessageLength: null, + // size of message length in bytes + messageLengthSize: 8 + }; + md.start = function() { + md.messageLength = 0; + md.fullMessageLength = md.messageLength64 = []; + var int32s = md.messageLengthSize / 4; + for (var i = 0; i < int32s; ++i) { + md.fullMessageLength.push(0); + } + _input = forge3.util.createBuffer(); + _state = { + h0: 1732584193, + h1: 4023233417, + h2: 2562383102, + h3: 271733878 + }; + return md; + }; + md.start(); + md.update = function(msg, encoding) { + if (encoding === "utf8") { + msg = forge3.util.encodeUtf8(msg); + } + var len = msg.length; + md.messageLength += len; + len = [len / 4294967296 >>> 0, len >>> 0]; + for (var i = md.fullMessageLength.length - 1; i >= 0; --i) { + md.fullMessageLength[i] += len[1]; + len[1] = len[0] + (md.fullMessageLength[i] / 4294967296 >>> 0); + md.fullMessageLength[i] = md.fullMessageLength[i] >>> 0; + len[0] = len[1] / 4294967296 >>> 0; + } + _input.putBytes(msg); + _update(_state, _w, _input); + if (_input.read > 2048 || _input.length() === 0) { + _input.compact(); + } + return md; + }; + md.digest = function() { + var finalBlock = forge3.util.createBuffer(); + finalBlock.putBytes(_input.bytes()); + var remaining = md.fullMessageLength[md.fullMessageLength.length - 1] + md.messageLengthSize; + var overflow = remaining & md.blockLength - 1; + finalBlock.putBytes(_padding.substr(0, md.blockLength - overflow)); + var bits, carry = 0; + for (var i = md.fullMessageLength.length - 1; i >= 0; --i) { + bits = md.fullMessageLength[i] * 8 + carry; + carry = bits / 4294967296 >>> 0; + finalBlock.putInt32Le(bits >>> 0); + } + var s2 = { + h0: _state.h0, + h1: _state.h1, + h2: _state.h2, + h3: _state.h3 + }; + _update(s2, _w, finalBlock); + var rval = forge3.util.createBuffer(); + rval.putInt32Le(s2.h0); + rval.putInt32Le(s2.h1); + rval.putInt32Le(s2.h2); + rval.putInt32Le(s2.h3); + return rval; + }; + return md; + }; + var _padding = null; + var _g = null; + var _r = null; + var _k = null; + var _initialized = false; + function _init() { + _padding = String.fromCharCode(128); + _padding += forge3.util.fillString(String.fromCharCode(0), 64); + _g = [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 1, + 6, + 11, + 0, + 5, + 10, + 15, + 4, + 9, + 14, + 3, + 8, + 13, + 2, + 7, + 12, + 5, + 8, + 11, + 14, + 1, + 4, + 7, + 10, + 13, + 0, + 3, + 6, + 9, + 12, + 15, + 2, + 0, + 7, + 14, + 5, + 12, + 3, + 10, + 1, + 8, + 15, + 6, + 13, + 4, + 11, + 2, + 9 + ]; + _r = [ + 7, + 12, + 17, + 22, + 7, + 12, + 17, + 22, + 7, + 12, + 17, + 22, + 7, + 12, + 17, + 22, + 5, + 9, + 14, + 20, + 5, + 9, + 14, + 20, + 5, + 9, + 14, + 20, + 5, + 9, + 14, + 20, + 4, + 11, + 16, + 23, + 4, + 11, + 16, + 23, + 4, + 11, + 16, + 23, + 4, + 11, + 16, + 23, + 6, + 10, + 15, + 21, + 6, + 10, + 15, + 21, + 6, + 10, + 15, + 21, + 6, + 10, + 15, + 21 + ]; + _k = new Array(64); + for (var i = 0; i < 64; ++i) { + _k[i] = Math.floor(Math.abs(Math.sin(i + 1)) * 4294967296); + } + _initialized = true; + } + function _update(s, w, bytes) { + var t, a, b, c, d, f, r, i; + var len = bytes.length(); + while (len >= 64) { + a = s.h0; + b = s.h1; + c = s.h2; + d = s.h3; + for (i = 0; i < 16; ++i) { + w[i] = bytes.getInt32Le(); + f = d ^ b & (c ^ d); + t = a + f + _k[i] + w[i]; + r = _r[i]; + a = d; + d = c; + c = b; + b += t << r | t >>> 32 - r; + } + for (; i < 32; ++i) { + f = c ^ d & (b ^ c); + t = a + f + _k[i] + w[_g[i]]; + r = _r[i]; + a = d; + d = c; + c = b; + b += t << r | t >>> 32 - r; + } + for (; i < 48; ++i) { + f = b ^ c ^ d; + t = a + f + _k[i] + w[_g[i]]; + r = _r[i]; + a = d; + d = c; + c = b; + b += t << r | t >>> 32 - r; + } + for (; i < 64; ++i) { + f = c ^ (b | ~d); + t = a + f + _k[i] + w[_g[i]]; + r = _r[i]; + a = d; + d = c; + c = b; + b += t << r | t >>> 32 - r; + } + s.h0 = s.h0 + a | 0; + s.h1 = s.h1 + b | 0; + s.h2 = s.h2 + c | 0; + s.h3 = s.h3 + d | 0; + len -= 64; + } + } + } +}); + +// node_modules/node-forge/lib/pem.js +var require_pem = __commonJS({ + "node_modules/node-forge/lib/pem.js"(exports, module) { + var forge3 = require_forge(); + require_util(); + var pem = module.exports = forge3.pem = forge3.pem || {}; + pem.encode = function(msg, options) { + options = options || {}; + var rval = "-----BEGIN " + msg.type + "-----\r\n"; + var header; + if (msg.procType) { + header = { + name: "Proc-Type", + values: [String(msg.procType.version), msg.procType.type] + }; + rval += foldHeader(header); + } + if (msg.contentDomain) { + header = { name: "Content-Domain", values: [msg.contentDomain] }; + rval += foldHeader(header); + } + if (msg.dekInfo) { + header = { name: "DEK-Info", values: [msg.dekInfo.algorithm] }; + if (msg.dekInfo.parameters) { + header.values.push(msg.dekInfo.parameters); + } + rval += foldHeader(header); + } + if (msg.headers) { + for (var i = 0; i < msg.headers.length; ++i) { + rval += foldHeader(msg.headers[i]); + } + } + if (msg.procType) { + rval += "\r\n"; + } + rval += forge3.util.encode64(msg.body, options.maxline || 64) + "\r\n"; + rval += "-----END " + msg.type + "-----\r\n"; + return rval; + }; + pem.decode = function(str) { + var rval = []; + var rMessage = /\s*-----BEGIN ([A-Z0-9- ]+)-----\r?\n?([\x21-\x7e\s]+?(?:\r?\n\r?\n))?([:A-Za-z0-9+\/=\s]+?)-----END \1-----/g; + var rHeader = /([\x21-\x7e]+):\s*([\x21-\x7e\s^:]+)/; + var rCRLF = /\r?\n/; + var match; + while (true) { + match = rMessage.exec(str); + if (!match) { + break; + } + var type = match[1]; + if (type === "NEW CERTIFICATE REQUEST") { + type = "CERTIFICATE REQUEST"; + } + var msg = { + type, + procType: null, + contentDomain: null, + dekInfo: null, + headers: [], + body: forge3.util.decode64(match[3]) + }; + rval.push(msg); + if (!match[2]) { + continue; + } + var lines = match[2].split(rCRLF); + var li = 0; + while (match && li < lines.length) { + var line = lines[li].replace(/\s+$/, ""); + for (var nl = li + 1; nl < lines.length; ++nl) { + var next = lines[nl]; + if (!/\s/.test(next[0])) { + break; + } + line += next; + li = nl; + } + match = line.match(rHeader); + if (match) { + var header = { name: match[1], values: [] }; + var values = match[2].split(","); + for (var vi = 0; vi < values.length; ++vi) { + header.values.push(ltrim(values[vi])); + } + if (!msg.procType) { + if (header.name !== "Proc-Type") { + throw new Error('Invalid PEM formatted message. The first encapsulated header must be "Proc-Type".'); + } else if (header.values.length !== 2) { + throw new Error('Invalid PEM formatted message. The "Proc-Type" header must have two subfields.'); + } + msg.procType = { version: values[0], type: values[1] }; + } else if (!msg.contentDomain && header.name === "Content-Domain") { + msg.contentDomain = values[0] || ""; + } else if (!msg.dekInfo && header.name === "DEK-Info") { + if (header.values.length === 0) { + throw new Error('Invalid PEM formatted message. The "DEK-Info" header must have at least one subfield.'); + } + msg.dekInfo = { algorithm: values[0], parameters: values[1] || null }; + } else { + msg.headers.push(header); + } + } + ++li; + } + if (msg.procType === "ENCRYPTED" && !msg.dekInfo) { + throw new Error('Invalid PEM formatted message. The "DEK-Info" header must be present if "Proc-Type" is "ENCRYPTED".'); + } + } + if (rval.length === 0) { + throw new Error("Invalid PEM formatted message."); + } + return rval; + }; + function foldHeader(header) { + var rval = header.name + ": "; + var values = []; + var insertSpace = function(match, $1) { + return " " + $1; + }; + for (var i = 0; i < header.values.length; ++i) { + values.push(header.values[i].replace(/^(\S+\r\n)/, insertSpace)); + } + rval += values.join(",") + "\r\n"; + var length = 0; + var candidate = -1; + for (var i = 0; i < rval.length; ++i, ++length) { + if (length > 65 && candidate !== -1) { + var insert = rval[candidate]; + if (insert === ",") { + ++candidate; + rval = rval.substr(0, candidate) + "\r\n " + rval.substr(candidate); + } else { + rval = rval.substr(0, candidate) + "\r\n" + insert + rval.substr(candidate + 1); + } + length = i - candidate - 1; + candidate = -1; + ++i; + } else if (rval[i] === " " || rval[i] === " " || rval[i] === ",") { + candidate = i; + } + } + return rval; + } + function ltrim(str) { + return str.replace(/^\s+/, ""); + } + } +}); + +// node_modules/node-forge/lib/des.js +var require_des = __commonJS({ + "node_modules/node-forge/lib/des.js"(exports, module) { + var forge3 = require_forge(); + require_cipher(); + require_cipherModes(); + require_util(); + module.exports = forge3.des = forge3.des || {}; + forge3.des.startEncrypting = function(key, iv, output, mode) { + var cipher = _createCipher({ + key, + output, + decrypt: false, + mode: mode || (iv === null ? "ECB" : "CBC") + }); + cipher.start(iv); + return cipher; + }; + forge3.des.createEncryptionCipher = function(key, mode) { + return _createCipher({ + key, + output: null, + decrypt: false, + mode + }); + }; + forge3.des.startDecrypting = function(key, iv, output, mode) { + var cipher = _createCipher({ + key, + output, + decrypt: true, + mode: mode || (iv === null ? "ECB" : "CBC") + }); + cipher.start(iv); + return cipher; + }; + forge3.des.createDecryptionCipher = function(key, mode) { + return _createCipher({ + key, + output: null, + decrypt: true, + mode + }); + }; + forge3.des.Algorithm = function(name, mode) { + var self2 = this; + self2.name = name; + self2.mode = new mode({ + blockSize: 8, + cipher: { + encrypt: function(inBlock, outBlock) { + return _updateBlock(self2._keys, inBlock, outBlock, false); + }, + decrypt: function(inBlock, outBlock) { + return _updateBlock(self2._keys, inBlock, outBlock, true); + } + } + }); + self2._init = false; + }; + forge3.des.Algorithm.prototype.initialize = function(options) { + if (this._init) { + return; + } + var key = forge3.util.createBuffer(options.key); + if (this.name.indexOf("3DES") === 0) { + if (key.length() !== 24) { + throw new Error("Invalid Triple-DES key size: " + key.length() * 8); + } + } + this._keys = _createKeys(key); + this._init = true; + }; + registerAlgorithm("DES-ECB", forge3.cipher.modes.ecb); + registerAlgorithm("DES-CBC", forge3.cipher.modes.cbc); + registerAlgorithm("DES-CFB", forge3.cipher.modes.cfb); + registerAlgorithm("DES-OFB", forge3.cipher.modes.ofb); + registerAlgorithm("DES-CTR", forge3.cipher.modes.ctr); + registerAlgorithm("3DES-ECB", forge3.cipher.modes.ecb); + registerAlgorithm("3DES-CBC", forge3.cipher.modes.cbc); + registerAlgorithm("3DES-CFB", forge3.cipher.modes.cfb); + registerAlgorithm("3DES-OFB", forge3.cipher.modes.ofb); + registerAlgorithm("3DES-CTR", forge3.cipher.modes.ctr); + function registerAlgorithm(name, mode) { + var factory = function() { + return new forge3.des.Algorithm(name, mode); + }; + forge3.cipher.registerAlgorithm(name, factory); + } + var spfunction1 = [16843776, 0, 65536, 16843780, 16842756, 66564, 4, 65536, 1024, 16843776, 16843780, 1024, 16778244, 16842756, 16777216, 4, 1028, 16778240, 16778240, 66560, 66560, 16842752, 16842752, 16778244, 65540, 16777220, 16777220, 65540, 0, 1028, 66564, 16777216, 65536, 16843780, 4, 16842752, 16843776, 16777216, 16777216, 1024, 16842756, 65536, 66560, 16777220, 1024, 4, 16778244, 66564, 16843780, 65540, 16842752, 16778244, 16777220, 1028, 66564, 16843776, 1028, 16778240, 16778240, 0, 65540, 66560, 0, 16842756]; + var spfunction2 = [-2146402272, -2147450880, 32768, 1081376, 1048576, 32, -2146435040, -2147450848, -2147483616, -2146402272, -2146402304, -2147483648, -2147450880, 1048576, 32, -2146435040, 1081344, 1048608, -2147450848, 0, -2147483648, 32768, 1081376, -2146435072, 1048608, -2147483616, 0, 1081344, 32800, -2146402304, -2146435072, 32800, 0, 1081376, -2146435040, 1048576, -2147450848, -2146435072, -2146402304, 32768, -2146435072, -2147450880, 32, -2146402272, 1081376, 32, 32768, -2147483648, 32800, -2146402304, 1048576, -2147483616, 1048608, -2147450848, -2147483616, 1048608, 1081344, 0, -2147450880, 32800, -2147483648, -2146435040, -2146402272, 1081344]; + var spfunction3 = [520, 134349312, 0, 134348808, 134218240, 0, 131592, 134218240, 131080, 134217736, 134217736, 131072, 134349320, 131080, 134348800, 520, 134217728, 8, 134349312, 512, 131584, 134348800, 134348808, 131592, 134218248, 131584, 131072, 134218248, 8, 134349320, 512, 134217728, 134349312, 134217728, 131080, 520, 131072, 134349312, 134218240, 0, 512, 131080, 134349320, 134218240, 134217736, 512, 0, 134348808, 134218248, 131072, 134217728, 134349320, 8, 131592, 131584, 134217736, 134348800, 134218248, 520, 134348800, 131592, 8, 134348808, 131584]; + var spfunction4 = [8396801, 8321, 8321, 128, 8396928, 8388737, 8388609, 8193, 0, 8396800, 8396800, 8396929, 129, 0, 8388736, 8388609, 1, 8192, 8388608, 8396801, 128, 8388608, 8193, 8320, 8388737, 1, 8320, 8388736, 8192, 8396928, 8396929, 129, 8388736, 8388609, 8396800, 8396929, 129, 0, 0, 8396800, 8320, 8388736, 8388737, 1, 8396801, 8321, 8321, 128, 8396929, 129, 1, 8192, 8388609, 8193, 8396928, 8388737, 8193, 8320, 8388608, 8396801, 128, 8388608, 8192, 8396928]; + var spfunction5 = [256, 34078976, 34078720, 1107296512, 524288, 256, 1073741824, 34078720, 1074266368, 524288, 33554688, 1074266368, 1107296512, 1107820544, 524544, 1073741824, 33554432, 1074266112, 1074266112, 0, 1073742080, 1107820800, 1107820800, 33554688, 1107820544, 1073742080, 0, 1107296256, 34078976, 33554432, 1107296256, 524544, 524288, 1107296512, 256, 33554432, 1073741824, 34078720, 1107296512, 1074266368, 33554688, 1073741824, 1107820544, 34078976, 1074266368, 256, 33554432, 1107820544, 1107820800, 524544, 1107296256, 1107820800, 34078720, 0, 1074266112, 1107296256, 524544, 33554688, 1073742080, 524288, 0, 1074266112, 34078976, 1073742080]; + var spfunction6 = [536870928, 541065216, 16384, 541081616, 541065216, 16, 541081616, 4194304, 536887296, 4210704, 4194304, 536870928, 4194320, 536887296, 536870912, 16400, 0, 4194320, 536887312, 16384, 4210688, 536887312, 16, 541065232, 541065232, 0, 4210704, 541081600, 16400, 4210688, 541081600, 536870912, 536887296, 16, 541065232, 4210688, 541081616, 4194304, 16400, 536870928, 4194304, 536887296, 536870912, 16400, 536870928, 541081616, 4210688, 541065216, 4210704, 541081600, 0, 541065232, 16, 16384, 541065216, 4210704, 16384, 4194320, 536887312, 0, 541081600, 536870912, 4194320, 536887312]; + var spfunction7 = [2097152, 69206018, 67110914, 0, 2048, 67110914, 2099202, 69208064, 69208066, 2097152, 0, 67108866, 2, 67108864, 69206018, 2050, 67110912, 2099202, 2097154, 67110912, 67108866, 69206016, 69208064, 2097154, 69206016, 2048, 2050, 69208066, 2099200, 2, 67108864, 2099200, 67108864, 2099200, 2097152, 67110914, 67110914, 69206018, 69206018, 2, 2097154, 67108864, 67110912, 2097152, 69208064, 2050, 2099202, 69208064, 2050, 67108866, 69208066, 69206016, 2099200, 0, 2, 69208066, 0, 2099202, 69206016, 2048, 67108866, 67110912, 2048, 2097154]; + var spfunction8 = [268439616, 4096, 262144, 268701760, 268435456, 268439616, 64, 268435456, 262208, 268697600, 268701760, 266240, 268701696, 266304, 4096, 64, 268697600, 268435520, 268439552, 4160, 266240, 262208, 268697664, 268701696, 4160, 0, 0, 268697664, 268435520, 268439552, 266304, 262144, 266304, 262144, 268701696, 4096, 64, 268697664, 4096, 266304, 268439552, 64, 268435520, 268697600, 268697664, 268435456, 262144, 268439616, 0, 268701760, 262208, 268435520, 268697600, 268439552, 268439616, 0, 268701760, 266240, 266240, 4160, 4160, 262208, 268435456, 268701696]; + function _createKeys(key) { + var pc2bytes0 = [0, 4, 536870912, 536870916, 65536, 65540, 536936448, 536936452, 512, 516, 536871424, 536871428, 66048, 66052, 536936960, 536936964], pc2bytes1 = [0, 1, 1048576, 1048577, 67108864, 67108865, 68157440, 68157441, 256, 257, 1048832, 1048833, 67109120, 67109121, 68157696, 68157697], pc2bytes2 = [0, 8, 2048, 2056, 16777216, 16777224, 16779264, 16779272, 0, 8, 2048, 2056, 16777216, 16777224, 16779264, 16779272], pc2bytes3 = [0, 2097152, 134217728, 136314880, 8192, 2105344, 134225920, 136323072, 131072, 2228224, 134348800, 136445952, 139264, 2236416, 134356992, 136454144], pc2bytes4 = [0, 262144, 16, 262160, 0, 262144, 16, 262160, 4096, 266240, 4112, 266256, 4096, 266240, 4112, 266256], pc2bytes5 = [0, 1024, 32, 1056, 0, 1024, 32, 1056, 33554432, 33555456, 33554464, 33555488, 33554432, 33555456, 33554464, 33555488], pc2bytes6 = [0, 268435456, 524288, 268959744, 2, 268435458, 524290, 268959746, 0, 268435456, 524288, 268959744, 2, 268435458, 524290, 268959746], pc2bytes7 = [0, 65536, 2048, 67584, 536870912, 536936448, 536872960, 536938496, 131072, 196608, 133120, 198656, 537001984, 537067520, 537004032, 537069568], pc2bytes8 = [0, 262144, 0, 262144, 2, 262146, 2, 262146, 33554432, 33816576, 33554432, 33816576, 33554434, 33816578, 33554434, 33816578], pc2bytes9 = [0, 268435456, 8, 268435464, 0, 268435456, 8, 268435464, 1024, 268436480, 1032, 268436488, 1024, 268436480, 1032, 268436488], pc2bytes10 = [0, 32, 0, 32, 1048576, 1048608, 1048576, 1048608, 8192, 8224, 8192, 8224, 1056768, 1056800, 1056768, 1056800], pc2bytes11 = [0, 16777216, 512, 16777728, 2097152, 18874368, 2097664, 18874880, 67108864, 83886080, 67109376, 83886592, 69206016, 85983232, 69206528, 85983744], pc2bytes12 = [0, 4096, 134217728, 134221824, 524288, 528384, 134742016, 134746112, 16, 4112, 134217744, 134221840, 524304, 528400, 134742032, 134746128], pc2bytes13 = [0, 4, 256, 260, 0, 4, 256, 260, 1, 5, 257, 261, 1, 5, 257, 261]; + var iterations = key.length() > 8 ? 3 : 1; + var keys = []; + var shifts = [0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0]; + var n = 0, tmp; + for (var j = 0; j < iterations; j++) { + var left = key.getInt32(); + var right = key.getInt32(); + tmp = (left >>> 4 ^ right) & 252645135; + right ^= tmp; + left ^= tmp << 4; + tmp = (right >>> -16 ^ left) & 65535; + left ^= tmp; + right ^= tmp << -16; + tmp = (left >>> 2 ^ right) & 858993459; + right ^= tmp; + left ^= tmp << 2; + tmp = (right >>> -16 ^ left) & 65535; + left ^= tmp; + right ^= tmp << -16; + tmp = (left >>> 1 ^ right) & 1431655765; + right ^= tmp; + left ^= tmp << 1; + tmp = (right >>> 8 ^ left) & 16711935; + left ^= tmp; + right ^= tmp << 8; + tmp = (left >>> 1 ^ right) & 1431655765; + right ^= tmp; + left ^= tmp << 1; + tmp = left << 8 | right >>> 20 & 240; + left = right << 24 | right << 8 & 16711680 | right >>> 8 & 65280 | right >>> 24 & 240; + right = tmp; + for (var i = 0; i < shifts.length; ++i) { + if (shifts[i]) { + left = left << 2 | left >>> 26; + right = right << 2 | right >>> 26; + } else { + left = left << 1 | left >>> 27; + right = right << 1 | right >>> 27; + } + left &= -15; + right &= -15; + var lefttmp = pc2bytes0[left >>> 28] | pc2bytes1[left >>> 24 & 15] | pc2bytes2[left >>> 20 & 15] | pc2bytes3[left >>> 16 & 15] | pc2bytes4[left >>> 12 & 15] | pc2bytes5[left >>> 8 & 15] | pc2bytes6[left >>> 4 & 15]; + var righttmp = pc2bytes7[right >>> 28] | pc2bytes8[right >>> 24 & 15] | pc2bytes9[right >>> 20 & 15] | pc2bytes10[right >>> 16 & 15] | pc2bytes11[right >>> 12 & 15] | pc2bytes12[right >>> 8 & 15] | pc2bytes13[right >>> 4 & 15]; + tmp = (righttmp >>> 16 ^ lefttmp) & 65535; + keys[n++] = lefttmp ^ tmp; + keys[n++] = righttmp ^ tmp << 16; + } + } + return keys; + } + function _updateBlock(keys, input, output, decrypt) { + var iterations = keys.length === 32 ? 3 : 9; + var looping; + if (iterations === 3) { + looping = decrypt ? [30, -2, -2] : [0, 32, 2]; + } else { + looping = decrypt ? [94, 62, -2, 32, 64, 2, 30, -2, -2] : [0, 32, 2, 62, 30, -2, 64, 96, 2]; + } + var tmp; + var left = input[0]; + var right = input[1]; + tmp = (left >>> 4 ^ right) & 252645135; + right ^= tmp; + left ^= tmp << 4; + tmp = (left >>> 16 ^ right) & 65535; + right ^= tmp; + left ^= tmp << 16; + tmp = (right >>> 2 ^ left) & 858993459; + left ^= tmp; + right ^= tmp << 2; + tmp = (right >>> 8 ^ left) & 16711935; + left ^= tmp; + right ^= tmp << 8; + tmp = (left >>> 1 ^ right) & 1431655765; + right ^= tmp; + left ^= tmp << 1; + left = left << 1 | left >>> 31; + right = right << 1 | right >>> 31; + for (var j = 0; j < iterations; j += 3) { + var endloop = looping[j + 1]; + var loopinc = looping[j + 2]; + for (var i = looping[j]; i != endloop; i += loopinc) { + var right1 = right ^ keys[i]; + var right2 = (right >>> 4 | right << 28) ^ keys[i + 1]; + tmp = left; + left = right; + right = tmp ^ (spfunction2[right1 >>> 24 & 63] | spfunction4[right1 >>> 16 & 63] | spfunction6[right1 >>> 8 & 63] | spfunction8[right1 & 63] | spfunction1[right2 >>> 24 & 63] | spfunction3[right2 >>> 16 & 63] | spfunction5[right2 >>> 8 & 63] | spfunction7[right2 & 63]); + } + tmp = left; + left = right; + right = tmp; + } + left = left >>> 1 | left << 31; + right = right >>> 1 | right << 31; + tmp = (left >>> 1 ^ right) & 1431655765; + right ^= tmp; + left ^= tmp << 1; + tmp = (right >>> 8 ^ left) & 16711935; + left ^= tmp; + right ^= tmp << 8; + tmp = (right >>> 2 ^ left) & 858993459; + left ^= tmp; + right ^= tmp << 2; + tmp = (left >>> 16 ^ right) & 65535; + right ^= tmp; + left ^= tmp << 16; + tmp = (left >>> 4 ^ right) & 252645135; + right ^= tmp; + left ^= tmp << 4; + output[0] = left; + output[1] = right; + } + function _createCipher(options) { + options = options || {}; + var mode = (options.mode || "CBC").toUpperCase(); + var algorithm = "DES-" + mode; + var cipher; + if (options.decrypt) { + cipher = forge3.cipher.createDecipher(algorithm, options.key); + } else { + cipher = forge3.cipher.createCipher(algorithm, options.key); + } + var start = cipher.start; + cipher.start = function(iv, options2) { + var output = null; + if (options2 instanceof forge3.util.ByteBuffer) { + output = options2; + options2 = {}; + } + options2 = options2 || {}; + options2.output = output; + options2.iv = iv; + start.call(cipher, options2); + }; + return cipher; + } + } +}); + +// node_modules/node-forge/lib/pbkdf2.js +var require_pbkdf2 = __commonJS({ + "node_modules/node-forge/lib/pbkdf2.js"(exports, module) { + var forge3 = require_forge(); + require_hmac(); + require_md(); + require_util(); + var pkcs5 = forge3.pkcs5 = forge3.pkcs5 || {}; + var crypto; + if (forge3.util.isNodejs && !forge3.options.usePureJavaScript) { + crypto = __require("crypto"); + } + module.exports = forge3.pbkdf2 = pkcs5.pbkdf2 = function(p, s, c, dkLen, md, callback) { + if (typeof md === "function") { + callback = md; + md = null; + } + if (forge3.util.isNodejs && !forge3.options.usePureJavaScript && crypto.pbkdf2 && (md === null || typeof md !== "object") && (crypto.pbkdf2Sync.length > 4 || (!md || md === "sha1"))) { + if (typeof md !== "string") { + md = "sha1"; + } + p = Buffer.from(p, "binary"); + s = Buffer.from(s, "binary"); + if (!callback) { + if (crypto.pbkdf2Sync.length === 4) { + return crypto.pbkdf2Sync(p, s, c, dkLen).toString("binary"); + } + return crypto.pbkdf2Sync(p, s, c, dkLen, md).toString("binary"); + } + if (crypto.pbkdf2Sync.length === 4) { + return crypto.pbkdf2(p, s, c, dkLen, function(err2, key) { + if (err2) { + return callback(err2); + } + callback(null, key.toString("binary")); + }); + } + return crypto.pbkdf2(p, s, c, dkLen, md, function(err2, key) { + if (err2) { + return callback(err2); + } + callback(null, key.toString("binary")); + }); + } + if (typeof md === "undefined" || md === null) { + md = "sha1"; + } + if (typeof md === "string") { + if (!(md in forge3.md.algorithms)) { + throw new Error("Unknown hash algorithm: " + md); + } + md = forge3.md[md].create(); + } + var hLen = md.digestLength; + if (dkLen > 4294967295 * hLen) { + var err = new Error("Derived key is too long."); + if (callback) { + return callback(err); + } + throw err; + } + var len = Math.ceil(dkLen / hLen); + var r = dkLen - (len - 1) * hLen; + var prf = forge3.hmac.create(); + prf.start(md, p); + var dk = ""; + var xor, u_c, u_c1; + if (!callback) { + for (var i = 1; i <= len; ++i) { + prf.start(null, null); + prf.update(s); + prf.update(forge3.util.int32ToBytes(i)); + xor = u_c1 = prf.digest().getBytes(); + for (var j = 2; j <= c; ++j) { + prf.start(null, null); + prf.update(u_c1); + u_c = prf.digest().getBytes(); + xor = forge3.util.xorBytes(xor, u_c, hLen); + u_c1 = u_c; + } + dk += i < len ? xor : xor.substr(0, r); + } + return dk; + } + var i = 1, j; + function outer() { + if (i > len) { + return callback(null, dk); + } + prf.start(null, null); + prf.update(s); + prf.update(forge3.util.int32ToBytes(i)); + xor = u_c1 = prf.digest().getBytes(); + j = 2; + inner(); + } + function inner() { + if (j <= c) { + prf.start(null, null); + prf.update(u_c1); + u_c = prf.digest().getBytes(); + xor = forge3.util.xorBytes(xor, u_c, hLen); + u_c1 = u_c; + ++j; + return forge3.util.setImmediate(inner); + } + dk += i < len ? xor : xor.substr(0, r); + ++i; + outer(); + } + outer(); + }; + } +}); + +// node_modules/node-forge/lib/sha256.js +var require_sha256 = __commonJS({ + "node_modules/node-forge/lib/sha256.js"(exports, module) { + var forge3 = require_forge(); + require_md(); + require_util(); + var sha256 = module.exports = forge3.sha256 = forge3.sha256 || {}; + forge3.md.sha256 = forge3.md.algorithms.sha256 = sha256; + sha256.create = function() { + if (!_initialized) { + _init(); + } + var _state = null; + var _input = forge3.util.createBuffer(); + var _w = new Array(64); + var md = { + algorithm: "sha256", + blockLength: 64, + digestLength: 32, + // 56-bit length of message so far (does not including padding) + messageLength: 0, + // true message length + fullMessageLength: null, + // size of message length in bytes + messageLengthSize: 8 + }; + md.start = function() { + md.messageLength = 0; + md.fullMessageLength = md.messageLength64 = []; + var int32s = md.messageLengthSize / 4; + for (var i = 0; i < int32s; ++i) { + md.fullMessageLength.push(0); + } + _input = forge3.util.createBuffer(); + _state = { + h0: 1779033703, + h1: 3144134277, + h2: 1013904242, + h3: 2773480762, + h4: 1359893119, + h5: 2600822924, + h6: 528734635, + h7: 1541459225 + }; + return md; + }; + md.start(); + md.update = function(msg, encoding) { + if (encoding === "utf8") { + msg = forge3.util.encodeUtf8(msg); + } + var len = msg.length; + md.messageLength += len; + len = [len / 4294967296 >>> 0, len >>> 0]; + for (var i = md.fullMessageLength.length - 1; i >= 0; --i) { + md.fullMessageLength[i] += len[1]; + len[1] = len[0] + (md.fullMessageLength[i] / 4294967296 >>> 0); + md.fullMessageLength[i] = md.fullMessageLength[i] >>> 0; + len[0] = len[1] / 4294967296 >>> 0; + } + _input.putBytes(msg); + _update(_state, _w, _input); + if (_input.read > 2048 || _input.length() === 0) { + _input.compact(); + } + return md; + }; + md.digest = function() { + var finalBlock = forge3.util.createBuffer(); + finalBlock.putBytes(_input.bytes()); + var remaining = md.fullMessageLength[md.fullMessageLength.length - 1] + md.messageLengthSize; + var overflow = remaining & md.blockLength - 1; + finalBlock.putBytes(_padding.substr(0, md.blockLength - overflow)); + var next, carry; + var bits = md.fullMessageLength[0] * 8; + for (var i = 0; i < md.fullMessageLength.length - 1; ++i) { + next = md.fullMessageLength[i + 1] * 8; + carry = next / 4294967296 >>> 0; + bits += carry; + finalBlock.putInt32(bits >>> 0); + bits = next >>> 0; + } + finalBlock.putInt32(bits); + var s2 = { + h0: _state.h0, + h1: _state.h1, + h2: _state.h2, + h3: _state.h3, + h4: _state.h4, + h5: _state.h5, + h6: _state.h6, + h7: _state.h7 + }; + _update(s2, _w, finalBlock); + var rval = forge3.util.createBuffer(); + rval.putInt32(s2.h0); + rval.putInt32(s2.h1); + rval.putInt32(s2.h2); + rval.putInt32(s2.h3); + rval.putInt32(s2.h4); + rval.putInt32(s2.h5); + rval.putInt32(s2.h6); + rval.putInt32(s2.h7); + return rval; + }; + return md; + }; + var _padding = null; + var _initialized = false; + var _k = null; + function _init() { + _padding = String.fromCharCode(128); + _padding += forge3.util.fillString(String.fromCharCode(0), 64); + _k = [ + 1116352408, + 1899447441, + 3049323471, + 3921009573, + 961987163, + 1508970993, + 2453635748, + 2870763221, + 3624381080, + 310598401, + 607225278, + 1426881987, + 1925078388, + 2162078206, + 2614888103, + 3248222580, + 3835390401, + 4022224774, + 264347078, + 604807628, + 770255983, + 1249150122, + 1555081692, + 1996064986, + 2554220882, + 2821834349, + 2952996808, + 3210313671, + 3336571891, + 3584528711, + 113926993, + 338241895, + 666307205, + 773529912, + 1294757372, + 1396182291, + 1695183700, + 1986661051, + 2177026350, + 2456956037, + 2730485921, + 2820302411, + 3259730800, + 3345764771, + 3516065817, + 3600352804, + 4094571909, + 275423344, + 430227734, + 506948616, + 659060556, + 883997877, + 958139571, + 1322822218, + 1537002063, + 1747873779, + 1955562222, + 2024104815, + 2227730452, + 2361852424, + 2428436474, + 2756734187, + 3204031479, + 3329325298 + ]; + _initialized = true; + } + function _update(s, w, bytes) { + var t1, t2, s0, s1, ch, maj, i, a, b, c, d, e, f, g, h; + var len = bytes.length(); + while (len >= 64) { + for (i = 0; i < 16; ++i) { + w[i] = bytes.getInt32(); + } + for (; i < 64; ++i) { + t1 = w[i - 2]; + t1 = (t1 >>> 17 | t1 << 15) ^ (t1 >>> 19 | t1 << 13) ^ t1 >>> 10; + t2 = w[i - 15]; + t2 = (t2 >>> 7 | t2 << 25) ^ (t2 >>> 18 | t2 << 14) ^ t2 >>> 3; + w[i] = t1 + w[i - 7] + t2 + w[i - 16] | 0; + } + a = s.h0; + b = s.h1; + c = s.h2; + d = s.h3; + e = s.h4; + f = s.h5; + g = s.h6; + h = s.h7; + for (i = 0; i < 64; ++i) { + s1 = (e >>> 6 | e << 26) ^ (e >>> 11 | e << 21) ^ (e >>> 25 | e << 7); + ch = g ^ e & (f ^ g); + s0 = (a >>> 2 | a << 30) ^ (a >>> 13 | a << 19) ^ (a >>> 22 | a << 10); + maj = a & b | c & (a ^ b); + t1 = h + s1 + ch + _k[i] + w[i]; + t2 = s0 + maj; + h = g; + g = f; + f = e; + e = d + t1 >>> 0; + d = c; + c = b; + b = a; + a = t1 + t2 >>> 0; + } + s.h0 = s.h0 + a | 0; + s.h1 = s.h1 + b | 0; + s.h2 = s.h2 + c | 0; + s.h3 = s.h3 + d | 0; + s.h4 = s.h4 + e | 0; + s.h5 = s.h5 + f | 0; + s.h6 = s.h6 + g | 0; + s.h7 = s.h7 + h | 0; + len -= 64; + } + } + } +}); + +// node_modules/node-forge/lib/prng.js +var require_prng = __commonJS({ + "node_modules/node-forge/lib/prng.js"(exports, module) { + var forge3 = require_forge(); + require_util(); + var _crypto = null; + if (forge3.util.isNodejs && !forge3.options.usePureJavaScript && !process.versions["node-webkit"]) { + _crypto = __require("crypto"); + } + var prng = module.exports = forge3.prng = forge3.prng || {}; + prng.create = function(plugin) { + var ctx = { + plugin, + key: null, + seed: null, + time: null, + // number of reseeds so far + reseeds: 0, + // amount of data generated so far + generated: 0, + // no initial key bytes + keyBytes: "" + }; + var md = plugin.md; + var pools = new Array(32); + for (var i = 0; i < 32; ++i) { + pools[i] = md.create(); + } + ctx.pools = pools; + ctx.pool = 0; + ctx.generate = function(count, callback) { + if (!callback) { + return ctx.generateSync(count); + } + var cipher = ctx.plugin.cipher; + var increment = ctx.plugin.increment; + var formatKey = ctx.plugin.formatKey; + var formatSeed = ctx.plugin.formatSeed; + var b = forge3.util.createBuffer(); + ctx.key = null; + generate(); + function generate(err) { + if (err) { + return callback(err); + } + if (b.length() >= count) { + return callback(null, b.getBytes(count)); + } + if (ctx.generated > 1048575) { + ctx.key = null; + } + if (ctx.key === null) { + return forge3.util.nextTick(function() { + _reseed(generate); + }); + } + var bytes = cipher(ctx.key, ctx.seed); + ctx.generated += bytes.length; + b.putBytes(bytes); + ctx.key = formatKey(cipher(ctx.key, increment(ctx.seed))); + ctx.seed = formatSeed(cipher(ctx.key, ctx.seed)); + forge3.util.setImmediate(generate); + } + }; + ctx.generateSync = function(count) { + var cipher = ctx.plugin.cipher; + var increment = ctx.plugin.increment; + var formatKey = ctx.plugin.formatKey; + var formatSeed = ctx.plugin.formatSeed; + ctx.key = null; + var b = forge3.util.createBuffer(); + while (b.length() < count) { + if (ctx.generated > 1048575) { + ctx.key = null; + } + if (ctx.key === null) { + _reseedSync(); + } + var bytes = cipher(ctx.key, ctx.seed); + ctx.generated += bytes.length; + b.putBytes(bytes); + ctx.key = formatKey(cipher(ctx.key, increment(ctx.seed))); + ctx.seed = formatSeed(cipher(ctx.key, ctx.seed)); + } + return b.getBytes(count); + }; + function _reseed(callback) { + if (ctx.pools[0].messageLength >= 32) { + _seed(); + return callback(); + } + var needed = 32 - ctx.pools[0].messageLength << 5; + ctx.seedFile(needed, function(err, bytes) { + if (err) { + return callback(err); + } + ctx.collect(bytes); + _seed(); + callback(); + }); + } + function _reseedSync() { + if (ctx.pools[0].messageLength >= 32) { + return _seed(); + } + var needed = 32 - ctx.pools[0].messageLength << 5; + ctx.collect(ctx.seedFileSync(needed)); + _seed(); + } + function _seed() { + ctx.reseeds = ctx.reseeds === 4294967295 ? 0 : ctx.reseeds + 1; + var md2 = ctx.plugin.md.create(); + md2.update(ctx.keyBytes); + var _2powK = 1; + for (var k = 0; k < 32; ++k) { + if (ctx.reseeds % _2powK === 0) { + md2.update(ctx.pools[k].digest().getBytes()); + ctx.pools[k].start(); + } + _2powK = _2powK << 1; + } + ctx.keyBytes = md2.digest().getBytes(); + md2.start(); + md2.update(ctx.keyBytes); + var seedBytes = md2.digest().getBytes(); + ctx.key = ctx.plugin.formatKey(ctx.keyBytes); + ctx.seed = ctx.plugin.formatSeed(seedBytes); + ctx.generated = 0; + } + function defaultSeedFile(needed) { + var getRandomValues = null; + var globalScope = forge3.util.globalScope; + var _crypto2 = globalScope.crypto || globalScope.msCrypto; + if (_crypto2 && _crypto2.getRandomValues) { + getRandomValues = function(arr) { + return _crypto2.getRandomValues(arr); + }; + } + var b = forge3.util.createBuffer(); + if (getRandomValues) { + while (b.length() < needed) { + var count = Math.max(1, Math.min(needed - b.length(), 65536) / 4); + var entropy = new Uint32Array(Math.floor(count)); + try { + getRandomValues(entropy); + for (var i2 = 0; i2 < entropy.length; ++i2) { + b.putInt32(entropy[i2]); + } + } catch (e) { + if (!(typeof QuotaExceededError !== "undefined" && e instanceof QuotaExceededError)) { + throw e; + } + } + } + } + if (b.length() < needed) { + var hi, lo, next; + var seed = Math.floor(Math.random() * 65536); + while (b.length() < needed) { + lo = 16807 * (seed & 65535); + hi = 16807 * (seed >> 16); + lo += (hi & 32767) << 16; + lo += hi >> 15; + lo = (lo & 2147483647) + (lo >> 31); + seed = lo & 4294967295; + for (var i2 = 0; i2 < 3; ++i2) { + next = seed >>> (i2 << 3); + next ^= Math.floor(Math.random() * 256); + b.putByte(next & 255); + } + } + } + return b.getBytes(needed); + } + if (_crypto) { + ctx.seedFile = function(needed, callback) { + _crypto.randomBytes(needed, function(err, bytes) { + if (err) { + return callback(err); + } + callback(null, bytes.toString()); + }); + }; + ctx.seedFileSync = function(needed) { + return _crypto.randomBytes(needed).toString(); + }; + } else { + ctx.seedFile = function(needed, callback) { + try { + callback(null, defaultSeedFile(needed)); + } catch (e) { + callback(e); + } + }; + ctx.seedFileSync = defaultSeedFile; + } + ctx.collect = function(bytes) { + var count = bytes.length; + for (var i2 = 0; i2 < count; ++i2) { + ctx.pools[ctx.pool].update(bytes.substr(i2, 1)); + ctx.pool = ctx.pool === 31 ? 0 : ctx.pool + 1; + } + }; + ctx.collectInt = function(i2, n) { + var bytes = ""; + for (var x = 0; x < n; x += 8) { + bytes += String.fromCharCode(i2 >> x & 255); + } + ctx.collect(bytes); + }; + ctx.registerWorker = function(worker) { + if (worker === self) { + ctx.seedFile = function(needed, callback) { + function listener2(e) { + var data = e.data; + if (data.forge && data.forge.prng) { + self.removeEventListener("message", listener2); + callback(data.forge.prng.err, data.forge.prng.bytes); + } + } + self.addEventListener("message", listener2); + self.postMessage({ forge: { prng: { needed } } }); + }; + } else { + var listener = function(e) { + var data = e.data; + if (data.forge && data.forge.prng) { + ctx.seedFile(data.forge.prng.needed, function(err, bytes) { + worker.postMessage({ forge: { prng: { err, bytes } } }); + }); + } + }; + worker.addEventListener("message", listener); + } + }; + return ctx; + }; + } +}); + +// node_modules/node-forge/lib/random.js +var require_random = __commonJS({ + "node_modules/node-forge/lib/random.js"(exports, module) { + var forge3 = require_forge(); + require_aes(); + require_sha256(); + require_prng(); + require_util(); + (function() { + if (forge3.random && forge3.random.getBytes) { + module.exports = forge3.random; + return; + } + (function(jQuery2) { + var prng_aes = {}; + var _prng_aes_output = new Array(4); + var _prng_aes_buffer = forge3.util.createBuffer(); + prng_aes.formatKey = function(key2) { + var tmp = forge3.util.createBuffer(key2); + key2 = new Array(4); + key2[0] = tmp.getInt32(); + key2[1] = tmp.getInt32(); + key2[2] = tmp.getInt32(); + key2[3] = tmp.getInt32(); + return forge3.aes._expandKey(key2, false); + }; + prng_aes.formatSeed = function(seed) { + var tmp = forge3.util.createBuffer(seed); + seed = new Array(4); + seed[0] = tmp.getInt32(); + seed[1] = tmp.getInt32(); + seed[2] = tmp.getInt32(); + seed[3] = tmp.getInt32(); + return seed; + }; + prng_aes.cipher = function(key2, seed) { + forge3.aes._updateBlock(key2, seed, _prng_aes_output, false); + _prng_aes_buffer.putInt32(_prng_aes_output[0]); + _prng_aes_buffer.putInt32(_prng_aes_output[1]); + _prng_aes_buffer.putInt32(_prng_aes_output[2]); + _prng_aes_buffer.putInt32(_prng_aes_output[3]); + return _prng_aes_buffer.getBytes(); + }; + prng_aes.increment = function(seed) { + ++seed[3]; + return seed; + }; + prng_aes.md = forge3.md.sha256; + function spawnPrng() { + var ctx = forge3.prng.create(prng_aes); + ctx.getBytes = function(count, callback) { + return ctx.generate(count, callback); + }; + ctx.getBytesSync = function(count) { + return ctx.generate(count); + }; + return ctx; + } + var _ctx = spawnPrng(); + var getRandomValues = null; + var globalScope = forge3.util.globalScope; + var _crypto = globalScope.crypto || globalScope.msCrypto; + if (_crypto && _crypto.getRandomValues) { + getRandomValues = function(arr) { + return _crypto.getRandomValues(arr); + }; + } + if (forge3.options.usePureJavaScript || !forge3.util.isNodejs && !getRandomValues) { + if (typeof window === "undefined" || window.document === void 0) { + } + _ctx.collectInt(+/* @__PURE__ */ new Date(), 32); + if (typeof navigator !== "undefined") { + var _navBytes = ""; + for (var key in navigator) { + try { + if (typeof navigator[key] == "string") { + _navBytes += navigator[key]; + } + } catch (e) { + } + } + _ctx.collect(_navBytes); + _navBytes = null; + } + if (jQuery2) { + jQuery2().mousemove(function(e) { + _ctx.collectInt(e.clientX, 16); + _ctx.collectInt(e.clientY, 16); + }); + jQuery2().keypress(function(e) { + _ctx.collectInt(e.charCode, 8); + }); + } + } + if (!forge3.random) { + forge3.random = _ctx; + } else { + for (var key in _ctx) { + forge3.random[key] = _ctx[key]; + } + } + forge3.random.createInstance = spawnPrng; + module.exports = forge3.random; + })(typeof jQuery !== "undefined" ? jQuery : null); + })(); + } +}); + +// node_modules/node-forge/lib/rc2.js +var require_rc2 = __commonJS({ + "node_modules/node-forge/lib/rc2.js"(exports, module) { + var forge3 = require_forge(); + require_util(); + var piTable = [ + 217, + 120, + 249, + 196, + 25, + 221, + 181, + 237, + 40, + 233, + 253, + 121, + 74, + 160, + 216, + 157, + 198, + 126, + 55, + 131, + 43, + 118, + 83, + 142, + 98, + 76, + 100, + 136, + 68, + 139, + 251, + 162, + 23, + 154, + 89, + 245, + 135, + 179, + 79, + 19, + 97, + 69, + 109, + 141, + 9, + 129, + 125, + 50, + 189, + 143, + 64, + 235, + 134, + 183, + 123, + 11, + 240, + 149, + 33, + 34, + 92, + 107, + 78, + 130, + 84, + 214, + 101, + 147, + 206, + 96, + 178, + 28, + 115, + 86, + 192, + 20, + 167, + 140, + 241, + 220, + 18, + 117, + 202, + 31, + 59, + 190, + 228, + 209, + 66, + 61, + 212, + 48, + 163, + 60, + 182, + 38, + 111, + 191, + 14, + 218, + 70, + 105, + 7, + 87, + 39, + 242, + 29, + 155, + 188, + 148, + 67, + 3, + 248, + 17, + 199, + 246, + 144, + 239, + 62, + 231, + 6, + 195, + 213, + 47, + 200, + 102, + 30, + 215, + 8, + 232, + 234, + 222, + 128, + 82, + 238, + 247, + 132, + 170, + 114, + 172, + 53, + 77, + 106, + 42, + 150, + 26, + 210, + 113, + 90, + 21, + 73, + 116, + 75, + 159, + 208, + 94, + 4, + 24, + 164, + 236, + 194, + 224, + 65, + 110, + 15, + 81, + 203, + 204, + 36, + 145, + 175, + 80, + 161, + 244, + 112, + 57, + 153, + 124, + 58, + 133, + 35, + 184, + 180, + 122, + 252, + 2, + 54, + 91, + 37, + 85, + 151, + 49, + 45, + 93, + 250, + 152, + 227, + 138, + 146, + 174, + 5, + 223, + 41, + 16, + 103, + 108, + 186, + 201, + 211, + 0, + 230, + 207, + 225, + 158, + 168, + 44, + 99, + 22, + 1, + 63, + 88, + 226, + 137, + 169, + 13, + 56, + 52, + 27, + 171, + 51, + 255, + 176, + 187, + 72, + 12, + 95, + 185, + 177, + 205, + 46, + 197, + 243, + 219, + 71, + 229, + 165, + 156, + 119, + 10, + 166, + 32, + 104, + 254, + 127, + 193, + 173 + ]; + var s = [1, 2, 3, 5]; + var rol = function(word, bits) { + return word << bits & 65535 | (word & 65535) >> 16 - bits; + }; + var ror = function(word, bits) { + return (word & 65535) >> bits | word << 16 - bits & 65535; + }; + module.exports = forge3.rc2 = forge3.rc2 || {}; + forge3.rc2.expandKey = function(key, effKeyBits) { + if (typeof key === "string") { + key = forge3.util.createBuffer(key); + } + effKeyBits = effKeyBits || 128; + var L = key; + var T = key.length(); + var T1 = effKeyBits; + var T8 = Math.ceil(T1 / 8); + var TM = 255 >> (T1 & 7); + var i; + for (i = T; i < 128; i++) { + L.putByte(piTable[L.at(i - 1) + L.at(i - T) & 255]); + } + L.setAt(128 - T8, piTable[L.at(128 - T8) & TM]); + for (i = 127 - T8; i >= 0; i--) { + L.setAt(i, piTable[L.at(i + 1) ^ L.at(i + T8)]); + } + return L; + }; + var createCipher = function(key, bits, encrypt) { + var _finish = false, _input = null, _output = null, _iv = null; + var mixRound, mashRound; + var i, j, K = []; + key = forge3.rc2.expandKey(key, bits); + for (i = 0; i < 64; i++) { + K.push(key.getInt16Le()); + } + if (encrypt) { + mixRound = function(R) { + for (i = 0; i < 4; i++) { + R[i] += K[j] + (R[(i + 3) % 4] & R[(i + 2) % 4]) + (~R[(i + 3) % 4] & R[(i + 1) % 4]); + R[i] = rol(R[i], s[i]); + j++; + } + }; + mashRound = function(R) { + for (i = 0; i < 4; i++) { + R[i] += K[R[(i + 3) % 4] & 63]; + } + }; + } else { + mixRound = function(R) { + for (i = 3; i >= 0; i--) { + R[i] = ror(R[i], s[i]); + R[i] -= K[j] + (R[(i + 3) % 4] & R[(i + 2) % 4]) + (~R[(i + 3) % 4] & R[(i + 1) % 4]); + j--; + } + }; + mashRound = function(R) { + for (i = 3; i >= 0; i--) { + R[i] -= K[R[(i + 3) % 4] & 63]; + } + }; + } + var runPlan = function(plan) { + var R = []; + for (i = 0; i < 4; i++) { + var val = _input.getInt16Le(); + if (_iv !== null) { + if (encrypt) { + val ^= _iv.getInt16Le(); + } else { + _iv.putInt16Le(val); + } + } + R.push(val & 65535); + } + j = encrypt ? 0 : 63; + for (var ptr = 0; ptr < plan.length; ptr++) { + for (var ctr = 0; ctr < plan[ptr][0]; ctr++) { + plan[ptr][1](R); + } + } + for (i = 0; i < 4; i++) { + if (_iv !== null) { + if (encrypt) { + _iv.putInt16Le(R[i]); + } else { + R[i] ^= _iv.getInt16Le(); + } + } + _output.putInt16Le(R[i]); + } + }; + var cipher = null; + cipher = { + /** + * Starts or restarts the encryption or decryption process, whichever + * was previously configured. + * + * To use the cipher in CBC mode, iv may be given either as a string + * of bytes, or as a byte buffer. For ECB mode, give null as iv. + * + * @param iv the initialization vector to use, null for ECB mode. + * @param output the output the buffer to write to, null to create one. + */ + start: function(iv, output) { + if (iv) { + if (typeof iv === "string") { + iv = forge3.util.createBuffer(iv); + } + } + _finish = false; + _input = forge3.util.createBuffer(); + _output = output || new forge3.util.createBuffer(); + _iv = iv; + cipher.output = _output; + }, + /** + * Updates the next block. + * + * @param input the buffer to read from. + */ + update: function(input) { + if (!_finish) { + _input.putBuffer(input); + } + while (_input.length() >= 8) { + runPlan([ + [5, mixRound], + [1, mashRound], + [6, mixRound], + [1, mashRound], + [5, mixRound] + ]); + } + }, + /** + * Finishes encrypting or decrypting. + * + * @param pad a padding function to use, null for PKCS#7 padding, + * signature(blockSize, buffer, decrypt). + * + * @return true if successful, false on error. + */ + finish: function(pad) { + var rval = true; + if (encrypt) { + if (pad) { + rval = pad(8, _input, !encrypt); + } else { + var padding = _input.length() === 8 ? 8 : 8 - _input.length(); + _input.fillWithByte(padding, padding); + } + } + if (rval) { + _finish = true; + cipher.update(); + } + if (!encrypt) { + rval = _input.length() === 0; + if (rval) { + if (pad) { + rval = pad(8, _output, !encrypt); + } else { + var len = _output.length(); + var count = _output.at(len - 1); + if (count > len) { + rval = false; + } else { + _output.truncate(count); + } + } + } + } + return rval; + } + }; + return cipher; + }; + forge3.rc2.startEncrypting = function(key, iv, output) { + var cipher = forge3.rc2.createEncryptionCipher(key, 128); + cipher.start(iv, output); + return cipher; + }; + forge3.rc2.createEncryptionCipher = function(key, bits) { + return createCipher(key, bits, true); + }; + forge3.rc2.startDecrypting = function(key, iv, output) { + var cipher = forge3.rc2.createDecryptionCipher(key, 128); + cipher.start(iv, output); + return cipher; + }; + forge3.rc2.createDecryptionCipher = function(key, bits) { + return createCipher(key, bits, false); + }; + } +}); + +// node_modules/node-forge/lib/jsbn.js +var require_jsbn = __commonJS({ + "node_modules/node-forge/lib/jsbn.js"(exports, module) { + var forge3 = require_forge(); + module.exports = forge3.jsbn = forge3.jsbn || {}; + var dbits; + var canary = 244837814094590; + var j_lm = (canary & 16777215) == 15715070; + function BigInteger2(a, b, c) { + this.data = []; + if (a != null) + if ("number" == typeof a) this.fromNumber(a, b, c); + else if (b == null && "string" != typeof a) this.fromString(a, 256); + else this.fromString(a, b); + } + forge3.jsbn.BigInteger = BigInteger2; + function nbi() { + return new BigInteger2(null); + } + function am1(i, x, w, j, c, n) { + while (--n >= 0) { + var v = x * this.data[i++] + w.data[j] + c; + c = Math.floor(v / 67108864); + w.data[j++] = v & 67108863; + } + return c; + } + function am2(i, x, w, j, c, n) { + var xl = x & 32767, xh = x >> 15; + while (--n >= 0) { + var l = this.data[i] & 32767; + var h = this.data[i++] >> 15; + var m = xh * l + h * xl; + l = xl * l + ((m & 32767) << 15) + w.data[j] + (c & 1073741823); + c = (l >>> 30) + (m >>> 15) + xh * h + (c >>> 30); + w.data[j++] = l & 1073741823; + } + return c; + } + function am3(i, x, w, j, c, n) { + var xl = x & 16383, xh = x >> 14; + while (--n >= 0) { + var l = this.data[i] & 16383; + var h = this.data[i++] >> 14; + var m = xh * l + h * xl; + l = xl * l + ((m & 16383) << 14) + w.data[j] + c; + c = (l >> 28) + (m >> 14) + xh * h; + w.data[j++] = l & 268435455; + } + return c; + } + if (typeof navigator === "undefined") { + BigInteger2.prototype.am = am3; + dbits = 28; + } else if (j_lm && navigator.appName == "Microsoft Internet Explorer") { + BigInteger2.prototype.am = am2; + dbits = 30; + } else if (j_lm && navigator.appName != "Netscape") { + BigInteger2.prototype.am = am1; + dbits = 26; + } else { + BigInteger2.prototype.am = am3; + dbits = 28; + } + BigInteger2.prototype.DB = dbits; + BigInteger2.prototype.DM = (1 << dbits) - 1; + BigInteger2.prototype.DV = 1 << dbits; + var BI_FP = 52; + BigInteger2.prototype.FV = Math.pow(2, BI_FP); + BigInteger2.prototype.F1 = BI_FP - dbits; + BigInteger2.prototype.F2 = 2 * dbits - BI_FP; + var BI_RM = "0123456789abcdefghijklmnopqrstuvwxyz"; + var BI_RC = new Array(); + var rr; + var vv; + rr = "0".charCodeAt(0); + for (vv = 0; vv <= 9; ++vv) BI_RC[rr++] = vv; + rr = "a".charCodeAt(0); + for (vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv; + rr = "A".charCodeAt(0); + for (vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv; + function int2char(n) { + return BI_RM.charAt(n); + } + function intAt(s, i) { + var c = BI_RC[s.charCodeAt(i)]; + return c == null ? -1 : c; + } + function bnpCopyTo(r) { + for (var i = this.t - 1; i >= 0; --i) r.data[i] = this.data[i]; + r.t = this.t; + r.s = this.s; + } + function bnpFromInt(x) { + this.t = 1; + this.s = x < 0 ? -1 : 0; + if (x > 0) this.data[0] = x; + else if (x < -1) this.data[0] = x + this.DV; + else this.t = 0; + } + function nbv(i) { + var r = nbi(); + r.fromInt(i); + return r; + } + function bnpFromString(s, b) { + var k; + if (b == 16) k = 4; + else if (b == 8) k = 3; + else if (b == 256) k = 8; + else if (b == 2) k = 1; + else if (b == 32) k = 5; + else if (b == 4) k = 2; + else { + this.fromRadix(s, b); + return; + } + this.t = 0; + this.s = 0; + var i = s.length, mi = false, sh = 0; + while (--i >= 0) { + var x = k == 8 ? s[i] & 255 : intAt(s, i); + if (x < 0) { + if (s.charAt(i) == "-") mi = true; + continue; + } + mi = false; + if (sh == 0) + this.data[this.t++] = x; + else if (sh + k > this.DB) { + this.data[this.t - 1] |= (x & (1 << this.DB - sh) - 1) << sh; + this.data[this.t++] = x >> this.DB - sh; + } else + this.data[this.t - 1] |= x << sh; + sh += k; + if (sh >= this.DB) sh -= this.DB; + } + if (k == 8 && (s[0] & 128) != 0) { + this.s = -1; + if (sh > 0) this.data[this.t - 1] |= (1 << this.DB - sh) - 1 << sh; + } + this.clamp(); + if (mi) BigInteger2.ZERO.subTo(this, this); + } + function bnpClamp() { + var c = this.s & this.DM; + while (this.t > 0 && this.data[this.t - 1] == c) --this.t; + } + function bnToString(b) { + if (this.s < 0) return "-" + this.negate().toString(b); + var k; + if (b == 16) k = 4; + else if (b == 8) k = 3; + else if (b == 2) k = 1; + else if (b == 32) k = 5; + else if (b == 4) k = 2; + else return this.toRadix(b); + var km = (1 << k) - 1, d, m = false, r = "", i = this.t; + var p = this.DB - i * this.DB % k; + if (i-- > 0) { + if (p < this.DB && (d = this.data[i] >> p) > 0) { + m = true; + r = int2char(d); + } + while (i >= 0) { + if (p < k) { + d = (this.data[i] & (1 << p) - 1) << k - p; + d |= this.data[--i] >> (p += this.DB - k); + } else { + d = this.data[i] >> (p -= k) & km; + if (p <= 0) { + p += this.DB; + --i; + } + } + if (d > 0) m = true; + if (m) r += int2char(d); + } + } + return m ? r : "0"; + } + function bnNegate() { + var r = nbi(); + BigInteger2.ZERO.subTo(this, r); + return r; + } + function bnAbs() { + return this.s < 0 ? this.negate() : this; + } + function bnCompareTo(a) { + var r = this.s - a.s; + if (r != 0) return r; + var i = this.t; + r = i - a.t; + if (r != 0) return this.s < 0 ? -r : r; + while (--i >= 0) if ((r = this.data[i] - a.data[i]) != 0) return r; + return 0; + } + function nbits(x) { + var r = 1, t; + if ((t = x >>> 16) != 0) { + x = t; + r += 16; + } + if ((t = x >> 8) != 0) { + x = t; + r += 8; + } + if ((t = x >> 4) != 0) { + x = t; + r += 4; + } + if ((t = x >> 2) != 0) { + x = t; + r += 2; + } + if ((t = x >> 1) != 0) { + x = t; + r += 1; + } + return r; + } + function bnBitLength() { + if (this.t <= 0) return 0; + return this.DB * (this.t - 1) + nbits(this.data[this.t - 1] ^ this.s & this.DM); + } + function bnpDLShiftTo(n, r) { + var i; + for (i = this.t - 1; i >= 0; --i) r.data[i + n] = this.data[i]; + for (i = n - 1; i >= 0; --i) r.data[i] = 0; + r.t = this.t + n; + r.s = this.s; + } + function bnpDRShiftTo(n, r) { + for (var i = n; i < this.t; ++i) r.data[i - n] = this.data[i]; + r.t = Math.max(this.t - n, 0); + r.s = this.s; + } + function bnpLShiftTo(n, r) { + var bs = n % this.DB; + var cbs = this.DB - bs; + var bm = (1 << cbs) - 1; + var ds = Math.floor(n / this.DB), c = this.s << bs & this.DM, i; + for (i = this.t - 1; i >= 0; --i) { + r.data[i + ds + 1] = this.data[i] >> cbs | c; + c = (this.data[i] & bm) << bs; + } + for (i = ds - 1; i >= 0; --i) r.data[i] = 0; + r.data[ds] = c; + r.t = this.t + ds + 1; + r.s = this.s; + r.clamp(); + } + function bnpRShiftTo(n, r) { + r.s = this.s; + var ds = Math.floor(n / this.DB); + if (ds >= this.t) { + r.t = 0; + return; + } + var bs = n % this.DB; + var cbs = this.DB - bs; + var bm = (1 << bs) - 1; + r.data[0] = this.data[ds] >> bs; + for (var i = ds + 1; i < this.t; ++i) { + r.data[i - ds - 1] |= (this.data[i] & bm) << cbs; + r.data[i - ds] = this.data[i] >> bs; + } + if (bs > 0) r.data[this.t - ds - 1] |= (this.s & bm) << cbs; + r.t = this.t - ds; + r.clamp(); + } + function bnpSubTo(a, r) { + var i = 0, c = 0, m = Math.min(a.t, this.t); + while (i < m) { + c += this.data[i] - a.data[i]; + r.data[i++] = c & this.DM; + c >>= this.DB; + } + if (a.t < this.t) { + c -= a.s; + while (i < this.t) { + c += this.data[i]; + r.data[i++] = c & this.DM; + c >>= this.DB; + } + c += this.s; + } else { + c += this.s; + while (i < a.t) { + c -= a.data[i]; + r.data[i++] = c & this.DM; + c >>= this.DB; + } + c -= a.s; + } + r.s = c < 0 ? -1 : 0; + if (c < -1) r.data[i++] = this.DV + c; + else if (c > 0) r.data[i++] = c; + r.t = i; + r.clamp(); + } + function bnpMultiplyTo(a, r) { + var x = this.abs(), y = a.abs(); + var i = x.t; + r.t = i + y.t; + while (--i >= 0) r.data[i] = 0; + for (i = 0; i < y.t; ++i) r.data[i + x.t] = x.am(0, y.data[i], r, i, 0, x.t); + r.s = 0; + r.clamp(); + if (this.s != a.s) BigInteger2.ZERO.subTo(r, r); + } + function bnpSquareTo(r) { + var x = this.abs(); + var i = r.t = 2 * x.t; + while (--i >= 0) r.data[i] = 0; + for (i = 0; i < x.t - 1; ++i) { + var c = x.am(i, x.data[i], r, 2 * i, 0, 1); + if ((r.data[i + x.t] += x.am(i + 1, 2 * x.data[i], r, 2 * i + 1, c, x.t - i - 1)) >= x.DV) { + r.data[i + x.t] -= x.DV; + r.data[i + x.t + 1] = 1; + } + } + if (r.t > 0) r.data[r.t - 1] += x.am(i, x.data[i], r, 2 * i, 0, 1); + r.s = 0; + r.clamp(); + } + function bnpDivRemTo(m, q, r) { + var pm = m.abs(); + if (pm.t <= 0) return; + var pt = this.abs(); + if (pt.t < pm.t) { + if (q != null) q.fromInt(0); + if (r != null) this.copyTo(r); + return; + } + if (r == null) r = nbi(); + var y = nbi(), ts = this.s, ms = m.s; + var nsh = this.DB - nbits(pm.data[pm.t - 1]); + if (nsh > 0) { + pm.lShiftTo(nsh, y); + pt.lShiftTo(nsh, r); + } else { + pm.copyTo(y); + pt.copyTo(r); + } + var ys = y.t; + var y0 = y.data[ys - 1]; + if (y0 == 0) return; + var yt = y0 * (1 << this.F1) + (ys > 1 ? y.data[ys - 2] >> this.F2 : 0); + var d1 = this.FV / yt, d2 = (1 << this.F1) / yt, e = 1 << this.F2; + var i = r.t, j = i - ys, t = q == null ? nbi() : q; + y.dlShiftTo(j, t); + if (r.compareTo(t) >= 0) { + r.data[r.t++] = 1; + r.subTo(t, r); + } + BigInteger2.ONE.dlShiftTo(ys, t); + t.subTo(y, y); + while (y.t < ys) y.data[y.t++] = 0; + while (--j >= 0) { + var qd = r.data[--i] == y0 ? this.DM : Math.floor(r.data[i] * d1 + (r.data[i - 1] + e) * d2); + if ((r.data[i] += y.am(0, qd, r, j, 0, ys)) < qd) { + y.dlShiftTo(j, t); + r.subTo(t, r); + while (r.data[i] < --qd) r.subTo(t, r); + } + } + if (q != null) { + r.drShiftTo(ys, q); + if (ts != ms) BigInteger2.ZERO.subTo(q, q); + } + r.t = ys; + r.clamp(); + if (nsh > 0) r.rShiftTo(nsh, r); + if (ts < 0) BigInteger2.ZERO.subTo(r, r); + } + function bnMod(a) { + var r = nbi(); + this.abs().divRemTo(a, null, r); + if (this.s < 0 && r.compareTo(BigInteger2.ZERO) > 0) a.subTo(r, r); + return r; + } + function Classic(m) { + this.m = m; + } + function cConvert(x) { + if (x.s < 0 || x.compareTo(this.m) >= 0) return x.mod(this.m); + else return x; + } + function cRevert(x) { + return x; + } + function cReduce(x) { + x.divRemTo(this.m, null, x); + } + function cMulTo(x, y, r) { + x.multiplyTo(y, r); + this.reduce(r); + } + function cSqrTo(x, r) { + x.squareTo(r); + this.reduce(r); + } + Classic.prototype.convert = cConvert; + Classic.prototype.revert = cRevert; + Classic.prototype.reduce = cReduce; + Classic.prototype.mulTo = cMulTo; + Classic.prototype.sqrTo = cSqrTo; + function bnpInvDigit() { + if (this.t < 1) return 0; + var x = this.data[0]; + if ((x & 1) == 0) return 0; + var y = x & 3; + y = y * (2 - (x & 15) * y) & 15; + y = y * (2 - (x & 255) * y) & 255; + y = y * (2 - ((x & 65535) * y & 65535)) & 65535; + y = y * (2 - x * y % this.DV) % this.DV; + return y > 0 ? this.DV - y : -y; + } + function Montgomery(m) { + this.m = m; + this.mp = m.invDigit(); + this.mpl = this.mp & 32767; + this.mph = this.mp >> 15; + this.um = (1 << m.DB - 15) - 1; + this.mt2 = 2 * m.t; + } + function montConvert(x) { + var r = nbi(); + x.abs().dlShiftTo(this.m.t, r); + r.divRemTo(this.m, null, r); + if (x.s < 0 && r.compareTo(BigInteger2.ZERO) > 0) this.m.subTo(r, r); + return r; + } + function montRevert(x) { + var r = nbi(); + x.copyTo(r); + this.reduce(r); + return r; + } + function montReduce(x) { + while (x.t <= this.mt2) + x.data[x.t++] = 0; + for (var i = 0; i < this.m.t; ++i) { + var j = x.data[i] & 32767; + var u0 = j * this.mpl + ((j * this.mph + (x.data[i] >> 15) * this.mpl & this.um) << 15) & x.DM; + j = i + this.m.t; + x.data[j] += this.m.am(0, u0, x, i, 0, this.m.t); + while (x.data[j] >= x.DV) { + x.data[j] -= x.DV; + x.data[++j]++; + } + } + x.clamp(); + x.drShiftTo(this.m.t, x); + if (x.compareTo(this.m) >= 0) x.subTo(this.m, x); + } + function montSqrTo(x, r) { + x.squareTo(r); + this.reduce(r); + } + function montMulTo(x, y, r) { + x.multiplyTo(y, r); + this.reduce(r); + } + Montgomery.prototype.convert = montConvert; + Montgomery.prototype.revert = montRevert; + Montgomery.prototype.reduce = montReduce; + Montgomery.prototype.mulTo = montMulTo; + Montgomery.prototype.sqrTo = montSqrTo; + function bnpIsEven() { + return (this.t > 0 ? this.data[0] & 1 : this.s) == 0; + } + function bnpExp(e, z) { + if (e > 4294967295 || e < 1) return BigInteger2.ONE; + var r = nbi(), r2 = nbi(), g = z.convert(this), i = nbits(e) - 1; + g.copyTo(r); + while (--i >= 0) { + z.sqrTo(r, r2); + if ((e & 1 << i) > 0) z.mulTo(r2, g, r); + else { + var t = r; + r = r2; + r2 = t; + } + } + return z.revert(r); + } + function bnModPowInt(e, m) { + var z; + if (e < 256 || m.isEven()) z = new Classic(m); + else z = new Montgomery(m); + return this.exp(e, z); + } + BigInteger2.prototype.copyTo = bnpCopyTo; + BigInteger2.prototype.fromInt = bnpFromInt; + BigInteger2.prototype.fromString = bnpFromString; + BigInteger2.prototype.clamp = bnpClamp; + BigInteger2.prototype.dlShiftTo = bnpDLShiftTo; + BigInteger2.prototype.drShiftTo = bnpDRShiftTo; + BigInteger2.prototype.lShiftTo = bnpLShiftTo; + BigInteger2.prototype.rShiftTo = bnpRShiftTo; + BigInteger2.prototype.subTo = bnpSubTo; + BigInteger2.prototype.multiplyTo = bnpMultiplyTo; + BigInteger2.prototype.squareTo = bnpSquareTo; + BigInteger2.prototype.divRemTo = bnpDivRemTo; + BigInteger2.prototype.invDigit = bnpInvDigit; + BigInteger2.prototype.isEven = bnpIsEven; + BigInteger2.prototype.exp = bnpExp; + BigInteger2.prototype.toString = bnToString; + BigInteger2.prototype.negate = bnNegate; + BigInteger2.prototype.abs = bnAbs; + BigInteger2.prototype.compareTo = bnCompareTo; + BigInteger2.prototype.bitLength = bnBitLength; + BigInteger2.prototype.mod = bnMod; + BigInteger2.prototype.modPowInt = bnModPowInt; + BigInteger2.ZERO = nbv(0); + BigInteger2.ONE = nbv(1); + function bnClone() { + var r = nbi(); + this.copyTo(r); + return r; + } + function bnIntValue() { + if (this.s < 0) { + if (this.t == 1) return this.data[0] - this.DV; + else if (this.t == 0) return -1; + } else if (this.t == 1) return this.data[0]; + else if (this.t == 0) return 0; + return (this.data[1] & (1 << 32 - this.DB) - 1) << this.DB | this.data[0]; + } + function bnByteValue() { + return this.t == 0 ? this.s : this.data[0] << 24 >> 24; + } + function bnShortValue() { + return this.t == 0 ? this.s : this.data[0] << 16 >> 16; + } + function bnpChunkSize(r) { + return Math.floor(Math.LN2 * this.DB / Math.log(r)); + } + function bnSigNum() { + if (this.s < 0) return -1; + else if (this.t <= 0 || this.t == 1 && this.data[0] <= 0) return 0; + else return 1; + } + function bnpToRadix(b) { + if (b == null) b = 10; + if (this.signum() == 0 || b < 2 || b > 36) return "0"; + var cs = this.chunkSize(b); + var a = Math.pow(b, cs); + var d = nbv(a), y = nbi(), z = nbi(), r = ""; + this.divRemTo(d, y, z); + while (y.signum() > 0) { + r = (a + z.intValue()).toString(b).substr(1) + r; + y.divRemTo(d, y, z); + } + return z.intValue().toString(b) + r; + } + function bnpFromRadix(s, b) { + this.fromInt(0); + if (b == null) b = 10; + var cs = this.chunkSize(b); + var d = Math.pow(b, cs), mi = false, j = 0, w = 0; + for (var i = 0; i < s.length; ++i) { + var x = intAt(s, i); + if (x < 0) { + if (s.charAt(i) == "-" && this.signum() == 0) mi = true; + continue; + } + w = b * w + x; + if (++j >= cs) { + this.dMultiply(d); + this.dAddOffset(w, 0); + j = 0; + w = 0; + } + } + if (j > 0) { + this.dMultiply(Math.pow(b, j)); + this.dAddOffset(w, 0); + } + if (mi) BigInteger2.ZERO.subTo(this, this); + } + function bnpFromNumber(a, b, c) { + if ("number" == typeof b) { + if (a < 2) this.fromInt(1); + else { + this.fromNumber(a, c); + if (!this.testBit(a - 1)) + this.bitwiseTo(BigInteger2.ONE.shiftLeft(a - 1), op_or, this); + if (this.isEven()) this.dAddOffset(1, 0); + while (!this.isProbablePrime(b)) { + this.dAddOffset(2, 0); + if (this.bitLength() > a) this.subTo(BigInteger2.ONE.shiftLeft(a - 1), this); + } + } + } else { + var x = new Array(), t = a & 7; + x.length = (a >> 3) + 1; + b.nextBytes(x); + if (t > 0) x[0] &= (1 << t) - 1; + else x[0] = 0; + this.fromString(x, 256); + } + } + function bnToByteArray() { + var i = this.t, r = new Array(); + r[0] = this.s; + var p = this.DB - i * this.DB % 8, d, k = 0; + if (i-- > 0) { + if (p < this.DB && (d = this.data[i] >> p) != (this.s & this.DM) >> p) + r[k++] = d | this.s << this.DB - p; + while (i >= 0) { + if (p < 8) { + d = (this.data[i] & (1 << p) - 1) << 8 - p; + d |= this.data[--i] >> (p += this.DB - 8); + } else { + d = this.data[i] >> (p -= 8) & 255; + if (p <= 0) { + p += this.DB; + --i; + } + } + if ((d & 128) != 0) d |= -256; + if (k == 0 && (this.s & 128) != (d & 128)) ++k; + if (k > 0 || d != this.s) r[k++] = d; + } + } + return r; + } + function bnEquals(a) { + return this.compareTo(a) == 0; + } + function bnMin(a) { + return this.compareTo(a) < 0 ? this : a; + } + function bnMax(a) { + return this.compareTo(a) > 0 ? this : a; + } + function bnpBitwiseTo(a, op, r) { + var i, f, m = Math.min(a.t, this.t); + for (i = 0; i < m; ++i) r.data[i] = op(this.data[i], a.data[i]); + if (a.t < this.t) { + f = a.s & this.DM; + for (i = m; i < this.t; ++i) r.data[i] = op(this.data[i], f); + r.t = this.t; + } else { + f = this.s & this.DM; + for (i = m; i < a.t; ++i) r.data[i] = op(f, a.data[i]); + r.t = a.t; + } + r.s = op(this.s, a.s); + r.clamp(); + } + function op_and(x, y) { + return x & y; + } + function bnAnd(a) { + var r = nbi(); + this.bitwiseTo(a, op_and, r); + return r; + } + function op_or(x, y) { + return x | y; + } + function bnOr(a) { + var r = nbi(); + this.bitwiseTo(a, op_or, r); + return r; + } + function op_xor(x, y) { + return x ^ y; + } + function bnXor(a) { + var r = nbi(); + this.bitwiseTo(a, op_xor, r); + return r; + } + function op_andnot(x, y) { + return x & ~y; + } + function bnAndNot(a) { + var r = nbi(); + this.bitwiseTo(a, op_andnot, r); + return r; + } + function bnNot() { + var r = nbi(); + for (var i = 0; i < this.t; ++i) r.data[i] = this.DM & ~this.data[i]; + r.t = this.t; + r.s = ~this.s; + return r; + } + function bnShiftLeft(n) { + var r = nbi(); + if (n < 0) this.rShiftTo(-n, r); + else this.lShiftTo(n, r); + return r; + } + function bnShiftRight(n) { + var r = nbi(); + if (n < 0) this.lShiftTo(-n, r); + else this.rShiftTo(n, r); + return r; + } + function lbit(x) { + if (x == 0) return -1; + var r = 0; + if ((x & 65535) == 0) { + x >>= 16; + r += 16; + } + if ((x & 255) == 0) { + x >>= 8; + r += 8; + } + if ((x & 15) == 0) { + x >>= 4; + r += 4; + } + if ((x & 3) == 0) { + x >>= 2; + r += 2; + } + if ((x & 1) == 0) ++r; + return r; + } + function bnGetLowestSetBit() { + for (var i = 0; i < this.t; ++i) + if (this.data[i] != 0) return i * this.DB + lbit(this.data[i]); + if (this.s < 0) return this.t * this.DB; + return -1; + } + function cbit(x) { + var r = 0; + while (x != 0) { + x &= x - 1; + ++r; + } + return r; + } + function bnBitCount() { + var r = 0, x = this.s & this.DM; + for (var i = 0; i < this.t; ++i) r += cbit(this.data[i] ^ x); + return r; + } + function bnTestBit(n) { + var j = Math.floor(n / this.DB); + if (j >= this.t) return this.s != 0; + return (this.data[j] & 1 << n % this.DB) != 0; + } + function bnpChangeBit(n, op) { + var r = BigInteger2.ONE.shiftLeft(n); + this.bitwiseTo(r, op, r); + return r; + } + function bnSetBit(n) { + return this.changeBit(n, op_or); + } + function bnClearBit(n) { + return this.changeBit(n, op_andnot); + } + function bnFlipBit(n) { + return this.changeBit(n, op_xor); + } + function bnpAddTo(a, r) { + var i = 0, c = 0, m = Math.min(a.t, this.t); + while (i < m) { + c += this.data[i] + a.data[i]; + r.data[i++] = c & this.DM; + c >>= this.DB; + } + if (a.t < this.t) { + c += a.s; + while (i < this.t) { + c += this.data[i]; + r.data[i++] = c & this.DM; + c >>= this.DB; + } + c += this.s; + } else { + c += this.s; + while (i < a.t) { + c += a.data[i]; + r.data[i++] = c & this.DM; + c >>= this.DB; + } + c += a.s; + } + r.s = c < 0 ? -1 : 0; + if (c > 0) r.data[i++] = c; + else if (c < -1) r.data[i++] = this.DV + c; + r.t = i; + r.clamp(); + } + function bnAdd(a) { + var r = nbi(); + this.addTo(a, r); + return r; + } + function bnSubtract(a) { + var r = nbi(); + this.subTo(a, r); + return r; + } + function bnMultiply(a) { + var r = nbi(); + this.multiplyTo(a, r); + return r; + } + function bnDivide(a) { + var r = nbi(); + this.divRemTo(a, r, null); + return r; + } + function bnRemainder(a) { + var r = nbi(); + this.divRemTo(a, null, r); + return r; + } + function bnDivideAndRemainder(a) { + var q = nbi(), r = nbi(); + this.divRemTo(a, q, r); + return new Array(q, r); + } + function bnpDMultiply(n) { + this.data[this.t] = this.am(0, n - 1, this, 0, 0, this.t); + ++this.t; + this.clamp(); + } + function bnpDAddOffset(n, w) { + if (n == 0) return; + while (this.t <= w) this.data[this.t++] = 0; + this.data[w] += n; + while (this.data[w] >= this.DV) { + this.data[w] -= this.DV; + if (++w >= this.t) this.data[this.t++] = 0; + ++this.data[w]; + } + } + function NullExp() { + } + function nNop(x) { + return x; + } + function nMulTo(x, y, r) { + x.multiplyTo(y, r); + } + function nSqrTo(x, r) { + x.squareTo(r); + } + NullExp.prototype.convert = nNop; + NullExp.prototype.revert = nNop; + NullExp.prototype.mulTo = nMulTo; + NullExp.prototype.sqrTo = nSqrTo; + function bnPow(e) { + return this.exp(e, new NullExp()); + } + function bnpMultiplyLowerTo(a, n, r) { + var i = Math.min(this.t + a.t, n); + r.s = 0; + r.t = i; + while (i > 0) r.data[--i] = 0; + var j; + for (j = r.t - this.t; i < j; ++i) r.data[i + this.t] = this.am(0, a.data[i], r, i, 0, this.t); + for (j = Math.min(a.t, n); i < j; ++i) this.am(0, a.data[i], r, i, 0, n - i); + r.clamp(); + } + function bnpMultiplyUpperTo(a, n, r) { + --n; + var i = r.t = this.t + a.t - n; + r.s = 0; + while (--i >= 0) r.data[i] = 0; + for (i = Math.max(n - this.t, 0); i < a.t; ++i) + r.data[this.t + i - n] = this.am(n - i, a.data[i], r, 0, 0, this.t + i - n); + r.clamp(); + r.drShiftTo(1, r); + } + function Barrett(m) { + this.r2 = nbi(); + this.q3 = nbi(); + BigInteger2.ONE.dlShiftTo(2 * m.t, this.r2); + this.mu = this.r2.divide(m); + this.m = m; + } + function barrettConvert(x) { + if (x.s < 0 || x.t > 2 * this.m.t) return x.mod(this.m); + else if (x.compareTo(this.m) < 0) return x; + else { + var r = nbi(); + x.copyTo(r); + this.reduce(r); + return r; + } + } + function barrettRevert(x) { + return x; + } + function barrettReduce(x) { + x.drShiftTo(this.m.t - 1, this.r2); + if (x.t > this.m.t + 1) { + x.t = this.m.t + 1; + x.clamp(); + } + this.mu.multiplyUpperTo(this.r2, this.m.t + 1, this.q3); + this.m.multiplyLowerTo(this.q3, this.m.t + 1, this.r2); + while (x.compareTo(this.r2) < 0) x.dAddOffset(1, this.m.t + 1); + x.subTo(this.r2, x); + while (x.compareTo(this.m) >= 0) x.subTo(this.m, x); + } + function barrettSqrTo(x, r) { + x.squareTo(r); + this.reduce(r); + } + function barrettMulTo(x, y, r) { + x.multiplyTo(y, r); + this.reduce(r); + } + Barrett.prototype.convert = barrettConvert; + Barrett.prototype.revert = barrettRevert; + Barrett.prototype.reduce = barrettReduce; + Barrett.prototype.mulTo = barrettMulTo; + Barrett.prototype.sqrTo = barrettSqrTo; + function bnModPow(e, m) { + var i = e.bitLength(), k, r = nbv(1), z; + if (i <= 0) return r; + else if (i < 18) k = 1; + else if (i < 48) k = 3; + else if (i < 144) k = 4; + else if (i < 768) k = 5; + else k = 6; + if (i < 8) + z = new Classic(m); + else if (m.isEven()) + z = new Barrett(m); + else + z = new Montgomery(m); + var g = new Array(), n = 3, k1 = k - 1, km = (1 << k) - 1; + g[1] = z.convert(this); + if (k > 1) { + var g2 = nbi(); + z.sqrTo(g[1], g2); + while (n <= km) { + g[n] = nbi(); + z.mulTo(g2, g[n - 2], g[n]); + n += 2; + } + } + var j = e.t - 1, w, is1 = true, r2 = nbi(), t; + i = nbits(e.data[j]) - 1; + while (j >= 0) { + if (i >= k1) w = e.data[j] >> i - k1 & km; + else { + w = (e.data[j] & (1 << i + 1) - 1) << k1 - i; + if (j > 0) w |= e.data[j - 1] >> this.DB + i - k1; + } + n = k; + while ((w & 1) == 0) { + w >>= 1; + --n; + } + if ((i -= n) < 0) { + i += this.DB; + --j; + } + if (is1) { + g[w].copyTo(r); + is1 = false; + } else { + while (n > 1) { + z.sqrTo(r, r2); + z.sqrTo(r2, r); + n -= 2; + } + if (n > 0) z.sqrTo(r, r2); + else { + t = r; + r = r2; + r2 = t; + } + z.mulTo(r2, g[w], r); + } + while (j >= 0 && (e.data[j] & 1 << i) == 0) { + z.sqrTo(r, r2); + t = r; + r = r2; + r2 = t; + if (--i < 0) { + i = this.DB - 1; + --j; + } + } + } + return z.revert(r); + } + function bnGCD(a) { + var x = this.s < 0 ? this.negate() : this.clone(); + var y = a.s < 0 ? a.negate() : a.clone(); + if (x.compareTo(y) < 0) { + var t = x; + x = y; + y = t; + } + var i = x.getLowestSetBit(), g = y.getLowestSetBit(); + if (g < 0) return x; + if (i < g) g = i; + if (g > 0) { + x.rShiftTo(g, x); + y.rShiftTo(g, y); + } + while (x.signum() > 0) { + if ((i = x.getLowestSetBit()) > 0) x.rShiftTo(i, x); + if ((i = y.getLowestSetBit()) > 0) y.rShiftTo(i, y); + if (x.compareTo(y) >= 0) { + x.subTo(y, x); + x.rShiftTo(1, x); + } else { + y.subTo(x, y); + y.rShiftTo(1, y); + } + } + if (g > 0) y.lShiftTo(g, y); + return y; + } + function bnpModInt(n) { + if (n <= 0) return 0; + var d = this.DV % n, r = this.s < 0 ? n - 1 : 0; + if (this.t > 0) + if (d == 0) r = this.data[0] % n; + else for (var i = this.t - 1; i >= 0; --i) r = (d * r + this.data[i]) % n; + return r; + } + function bnModInverse(m) { + var ac = m.isEven(); + if (this.isEven() && ac || m.signum() == 0) return BigInteger2.ZERO; + var u = m.clone(), v = this.clone(); + var a = nbv(1), b = nbv(0), c = nbv(0), d = nbv(1); + while (u.signum() != 0) { + while (u.isEven()) { + u.rShiftTo(1, u); + if (ac) { + if (!a.isEven() || !b.isEven()) { + a.addTo(this, a); + b.subTo(m, b); + } + a.rShiftTo(1, a); + } else if (!b.isEven()) b.subTo(m, b); + b.rShiftTo(1, b); + } + while (v.isEven()) { + v.rShiftTo(1, v); + if (ac) { + if (!c.isEven() || !d.isEven()) { + c.addTo(this, c); + d.subTo(m, d); + } + c.rShiftTo(1, c); + } else if (!d.isEven()) d.subTo(m, d); + d.rShiftTo(1, d); + } + if (u.compareTo(v) >= 0) { + u.subTo(v, u); + if (ac) a.subTo(c, a); + b.subTo(d, b); + } else { + v.subTo(u, v); + if (ac) c.subTo(a, c); + d.subTo(b, d); + } + } + if (v.compareTo(BigInteger2.ONE) != 0) return BigInteger2.ZERO; + if (d.compareTo(m) >= 0) return d.subtract(m); + if (d.signum() < 0) d.addTo(m, d); + else return d; + if (d.signum() < 0) return d.add(m); + else return d; + } + var lowprimes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509]; + var lplim = (1 << 26) / lowprimes[lowprimes.length - 1]; + function bnIsProbablePrime(t) { + var i, x = this.abs(); + if (x.t == 1 && x.data[0] <= lowprimes[lowprimes.length - 1]) { + for (i = 0; i < lowprimes.length; ++i) + if (x.data[0] == lowprimes[i]) return true; + return false; + } + if (x.isEven()) return false; + i = 1; + while (i < lowprimes.length) { + var m = lowprimes[i], j = i + 1; + while (j < lowprimes.length && m < lplim) m *= lowprimes[j++]; + m = x.modInt(m); + while (i < j) if (m % lowprimes[i++] == 0) return false; + } + return x.millerRabin(t); + } + function bnpMillerRabin(t) { + var n1 = this.subtract(BigInteger2.ONE); + var k = n1.getLowestSetBit(); + if (k <= 0) return false; + var r = n1.shiftRight(k); + var prng = bnGetPrng(); + var a; + for (var i = 0; i < t; ++i) { + do { + a = new BigInteger2(this.bitLength(), prng); + } while (a.compareTo(BigInteger2.ONE) <= 0 || a.compareTo(n1) >= 0); + var y = a.modPow(r, this); + if (y.compareTo(BigInteger2.ONE) != 0 && y.compareTo(n1) != 0) { + var j = 1; + while (j++ < k && y.compareTo(n1) != 0) { + y = y.modPowInt(2, this); + if (y.compareTo(BigInteger2.ONE) == 0) return false; + } + if (y.compareTo(n1) != 0) return false; + } + } + return true; + } + function bnGetPrng() { + return { + // x is an array to fill with bytes + nextBytes: function(x) { + for (var i = 0; i < x.length; ++i) { + x[i] = Math.floor(Math.random() * 256); + } + } + }; + } + BigInteger2.prototype.chunkSize = bnpChunkSize; + BigInteger2.prototype.toRadix = bnpToRadix; + BigInteger2.prototype.fromRadix = bnpFromRadix; + BigInteger2.prototype.fromNumber = bnpFromNumber; + BigInteger2.prototype.bitwiseTo = bnpBitwiseTo; + BigInteger2.prototype.changeBit = bnpChangeBit; + BigInteger2.prototype.addTo = bnpAddTo; + BigInteger2.prototype.dMultiply = bnpDMultiply; + BigInteger2.prototype.dAddOffset = bnpDAddOffset; + BigInteger2.prototype.multiplyLowerTo = bnpMultiplyLowerTo; + BigInteger2.prototype.multiplyUpperTo = bnpMultiplyUpperTo; + BigInteger2.prototype.modInt = bnpModInt; + BigInteger2.prototype.millerRabin = bnpMillerRabin; + BigInteger2.prototype.clone = bnClone; + BigInteger2.prototype.intValue = bnIntValue; + BigInteger2.prototype.byteValue = bnByteValue; + BigInteger2.prototype.shortValue = bnShortValue; + BigInteger2.prototype.signum = bnSigNum; + BigInteger2.prototype.toByteArray = bnToByteArray; + BigInteger2.prototype.equals = bnEquals; + BigInteger2.prototype.min = bnMin; + BigInteger2.prototype.max = bnMax; + BigInteger2.prototype.and = bnAnd; + BigInteger2.prototype.or = bnOr; + BigInteger2.prototype.xor = bnXor; + BigInteger2.prototype.andNot = bnAndNot; + BigInteger2.prototype.not = bnNot; + BigInteger2.prototype.shiftLeft = bnShiftLeft; + BigInteger2.prototype.shiftRight = bnShiftRight; + BigInteger2.prototype.getLowestSetBit = bnGetLowestSetBit; + BigInteger2.prototype.bitCount = bnBitCount; + BigInteger2.prototype.testBit = bnTestBit; + BigInteger2.prototype.setBit = bnSetBit; + BigInteger2.prototype.clearBit = bnClearBit; + BigInteger2.prototype.flipBit = bnFlipBit; + BigInteger2.prototype.add = bnAdd; + BigInteger2.prototype.subtract = bnSubtract; + BigInteger2.prototype.multiply = bnMultiply; + BigInteger2.prototype.divide = bnDivide; + BigInteger2.prototype.remainder = bnRemainder; + BigInteger2.prototype.divideAndRemainder = bnDivideAndRemainder; + BigInteger2.prototype.modPow = bnModPow; + BigInteger2.prototype.modInverse = bnModInverse; + BigInteger2.prototype.pow = bnPow; + BigInteger2.prototype.gcd = bnGCD; + BigInteger2.prototype.isProbablePrime = bnIsProbablePrime; + } +}); + +// node_modules/node-forge/lib/sha1.js +var require_sha1 = __commonJS({ + "node_modules/node-forge/lib/sha1.js"(exports, module) { + var forge3 = require_forge(); + require_md(); + require_util(); + var sha1 = module.exports = forge3.sha1 = forge3.sha1 || {}; + forge3.md.sha1 = forge3.md.algorithms.sha1 = sha1; + sha1.create = function() { + if (!_initialized) { + _init(); + } + var _state = null; + var _input = forge3.util.createBuffer(); + var _w = new Array(80); + var md = { + algorithm: "sha1", + blockLength: 64, + digestLength: 20, + // 56-bit length of message so far (does not including padding) + messageLength: 0, + // true message length + fullMessageLength: null, + // size of message length in bytes + messageLengthSize: 8 + }; + md.start = function() { + md.messageLength = 0; + md.fullMessageLength = md.messageLength64 = []; + var int32s = md.messageLengthSize / 4; + for (var i = 0; i < int32s; ++i) { + md.fullMessageLength.push(0); + } + _input = forge3.util.createBuffer(); + _state = { + h0: 1732584193, + h1: 4023233417, + h2: 2562383102, + h3: 271733878, + h4: 3285377520 + }; + return md; + }; + md.start(); + md.update = function(msg, encoding) { + if (encoding === "utf8") { + msg = forge3.util.encodeUtf8(msg); + } + var len = msg.length; + md.messageLength += len; + len = [len / 4294967296 >>> 0, len >>> 0]; + for (var i = md.fullMessageLength.length - 1; i >= 0; --i) { + md.fullMessageLength[i] += len[1]; + len[1] = len[0] + (md.fullMessageLength[i] / 4294967296 >>> 0); + md.fullMessageLength[i] = md.fullMessageLength[i] >>> 0; + len[0] = len[1] / 4294967296 >>> 0; + } + _input.putBytes(msg); + _update(_state, _w, _input); + if (_input.read > 2048 || _input.length() === 0) { + _input.compact(); + } + return md; + }; + md.digest = function() { + var finalBlock = forge3.util.createBuffer(); + finalBlock.putBytes(_input.bytes()); + var remaining = md.fullMessageLength[md.fullMessageLength.length - 1] + md.messageLengthSize; + var overflow = remaining & md.blockLength - 1; + finalBlock.putBytes(_padding.substr(0, md.blockLength - overflow)); + var next, carry; + var bits = md.fullMessageLength[0] * 8; + for (var i = 0; i < md.fullMessageLength.length - 1; ++i) { + next = md.fullMessageLength[i + 1] * 8; + carry = next / 4294967296 >>> 0; + bits += carry; + finalBlock.putInt32(bits >>> 0); + bits = next >>> 0; + } + finalBlock.putInt32(bits); + var s2 = { + h0: _state.h0, + h1: _state.h1, + h2: _state.h2, + h3: _state.h3, + h4: _state.h4 + }; + _update(s2, _w, finalBlock); + var rval = forge3.util.createBuffer(); + rval.putInt32(s2.h0); + rval.putInt32(s2.h1); + rval.putInt32(s2.h2); + rval.putInt32(s2.h3); + rval.putInt32(s2.h4); + return rval; + }; + return md; + }; + var _padding = null; + var _initialized = false; + function _init() { + _padding = String.fromCharCode(128); + _padding += forge3.util.fillString(String.fromCharCode(0), 64); + _initialized = true; + } + function _update(s, w, bytes) { + var t, a, b, c, d, e, f, i; + var len = bytes.length(); + while (len >= 64) { + a = s.h0; + b = s.h1; + c = s.h2; + d = s.h3; + e = s.h4; + for (i = 0; i < 16; ++i) { + t = bytes.getInt32(); + w[i] = t; + f = d ^ b & (c ^ d); + t = (a << 5 | a >>> 27) + f + e + 1518500249 + t; + e = d; + d = c; + c = (b << 30 | b >>> 2) >>> 0; + b = a; + a = t; + } + for (; i < 20; ++i) { + t = w[i - 3] ^ w[i - 8] ^ w[i - 14] ^ w[i - 16]; + t = t << 1 | t >>> 31; + w[i] = t; + f = d ^ b & (c ^ d); + t = (a << 5 | a >>> 27) + f + e + 1518500249 + t; + e = d; + d = c; + c = (b << 30 | b >>> 2) >>> 0; + b = a; + a = t; + } + for (; i < 32; ++i) { + t = w[i - 3] ^ w[i - 8] ^ w[i - 14] ^ w[i - 16]; + t = t << 1 | t >>> 31; + w[i] = t; + f = b ^ c ^ d; + t = (a << 5 | a >>> 27) + f + e + 1859775393 + t; + e = d; + d = c; + c = (b << 30 | b >>> 2) >>> 0; + b = a; + a = t; + } + for (; i < 40; ++i) { + t = w[i - 6] ^ w[i - 16] ^ w[i - 28] ^ w[i - 32]; + t = t << 2 | t >>> 30; + w[i] = t; + f = b ^ c ^ d; + t = (a << 5 | a >>> 27) + f + e + 1859775393 + t; + e = d; + d = c; + c = (b << 30 | b >>> 2) >>> 0; + b = a; + a = t; + } + for (; i < 60; ++i) { + t = w[i - 6] ^ w[i - 16] ^ w[i - 28] ^ w[i - 32]; + t = t << 2 | t >>> 30; + w[i] = t; + f = b & c | d & (b ^ c); + t = (a << 5 | a >>> 27) + f + e + 2400959708 + t; + e = d; + d = c; + c = (b << 30 | b >>> 2) >>> 0; + b = a; + a = t; + } + for (; i < 80; ++i) { + t = w[i - 6] ^ w[i - 16] ^ w[i - 28] ^ w[i - 32]; + t = t << 2 | t >>> 30; + w[i] = t; + f = b ^ c ^ d; + t = (a << 5 | a >>> 27) + f + e + 3395469782 + t; + e = d; + d = c; + c = (b << 30 | b >>> 2) >>> 0; + b = a; + a = t; + } + s.h0 = s.h0 + a | 0; + s.h1 = s.h1 + b | 0; + s.h2 = s.h2 + c | 0; + s.h3 = s.h3 + d | 0; + s.h4 = s.h4 + e | 0; + len -= 64; + } + } + } +}); + +// node_modules/node-forge/lib/pkcs1.js +var require_pkcs1 = __commonJS({ + "node_modules/node-forge/lib/pkcs1.js"(exports, module) { + var forge3 = require_forge(); + require_util(); + require_random(); + require_sha1(); + var pkcs1 = module.exports = forge3.pkcs1 = forge3.pkcs1 || {}; + pkcs1.encode_rsa_oaep = function(key, message, options) { + var label; + var seed; + var md; + var mgf1Md; + if (typeof options === "string") { + label = options; + seed = arguments[3] || void 0; + md = arguments[4] || void 0; + } else if (options) { + label = options.label || void 0; + seed = options.seed || void 0; + md = options.md || void 0; + if (options.mgf1 && options.mgf1.md) { + mgf1Md = options.mgf1.md; + } + } + if (!md) { + md = forge3.md.sha1.create(); + } else { + md.start(); + } + if (!mgf1Md) { + mgf1Md = md; + } + var keyLength = Math.ceil(key.n.bitLength() / 8); + var maxLength = keyLength - 2 * md.digestLength - 2; + if (message.length > maxLength) { + var error = new Error("RSAES-OAEP input message length is too long."); + error.length = message.length; + error.maxLength = maxLength; + throw error; + } + if (!label) { + label = ""; + } + md.update(label, "raw"); + var lHash = md.digest(); + var PS = ""; + var PS_length = maxLength - message.length; + for (var i = 0; i < PS_length; i++) { + PS += "\0"; + } + var DB = lHash.getBytes() + PS + "" + message; + if (!seed) { + seed = forge3.random.getBytes(md.digestLength); + } else if (seed.length !== md.digestLength) { + var error = new Error("Invalid RSAES-OAEP seed. The seed length must match the digest length."); + error.seedLength = seed.length; + error.digestLength = md.digestLength; + throw error; + } + var dbMask = rsa_mgf1(seed, keyLength - md.digestLength - 1, mgf1Md); + var maskedDB = forge3.util.xorBytes(DB, dbMask, DB.length); + var seedMask = rsa_mgf1(maskedDB, md.digestLength, mgf1Md); + var maskedSeed = forge3.util.xorBytes(seed, seedMask, seed.length); + return "\0" + maskedSeed + maskedDB; + }; + pkcs1.decode_rsa_oaep = function(key, em, options) { + var label; + var md; + var mgf1Md; + if (typeof options === "string") { + label = options; + md = arguments[3] || void 0; + } else if (options) { + label = options.label || void 0; + md = options.md || void 0; + if (options.mgf1 && options.mgf1.md) { + mgf1Md = options.mgf1.md; + } + } + var keyLength = Math.ceil(key.n.bitLength() / 8); + if (em.length !== keyLength) { + var error = new Error("RSAES-OAEP encoded message length is invalid."); + error.length = em.length; + error.expectedLength = keyLength; + throw error; + } + if (md === void 0) { + md = forge3.md.sha1.create(); + } else { + md.start(); + } + if (!mgf1Md) { + mgf1Md = md; + } + if (keyLength < 2 * md.digestLength + 2) { + throw new Error("RSAES-OAEP key is too short for the hash function."); + } + if (!label) { + label = ""; + } + md.update(label, "raw"); + var lHash = md.digest().getBytes(); + var y = em.charAt(0); + var maskedSeed = em.substring(1, md.digestLength + 1); + var maskedDB = em.substring(1 + md.digestLength); + var seedMask = rsa_mgf1(maskedDB, md.digestLength, mgf1Md); + var seed = forge3.util.xorBytes(maskedSeed, seedMask, maskedSeed.length); + var dbMask = rsa_mgf1(seed, keyLength - md.digestLength - 1, mgf1Md); + var db2 = forge3.util.xorBytes(maskedDB, dbMask, maskedDB.length); + var lHashPrime = db2.substring(0, md.digestLength); + var error = y !== "\0"; + for (var i = 0; i < md.digestLength; ++i) { + error |= lHash.charAt(i) !== lHashPrime.charAt(i); + } + var in_ps = 1; + var index = md.digestLength; + for (var j = md.digestLength; j < db2.length; j++) { + var code = db2.charCodeAt(j); + var is_0 = code & 1 ^ 1; + var error_mask = in_ps ? 65534 : 0; + error |= code & error_mask; + in_ps = in_ps & is_0; + index += in_ps; + } + if (error || db2.charCodeAt(index) !== 1) { + throw new Error("Invalid RSAES-OAEP padding."); + } + return db2.substring(index + 1); + }; + function rsa_mgf1(seed, maskLength, hash) { + if (!hash) { + hash = forge3.md.sha1.create(); + } + var t = ""; + var count = Math.ceil(maskLength / hash.digestLength); + for (var i = 0; i < count; ++i) { + var c = String.fromCharCode( + i >> 24 & 255, + i >> 16 & 255, + i >> 8 & 255, + i & 255 + ); + hash.start(); + hash.update(seed + c); + t += hash.digest().getBytes(); + } + return t.substring(0, maskLength); + } + } +}); + +// node_modules/node-forge/lib/prime.js +var require_prime = __commonJS({ + "node_modules/node-forge/lib/prime.js"(exports, module) { + var forge3 = require_forge(); + require_util(); + require_jsbn(); + require_random(); + (function() { + if (forge3.prime) { + module.exports = forge3.prime; + return; + } + var prime = module.exports = forge3.prime = forge3.prime || {}; + var BigInteger2 = forge3.jsbn.BigInteger; + var GCD_30_DELTA = [6, 4, 2, 4, 2, 4, 6, 2]; + var THIRTY = new BigInteger2(null); + THIRTY.fromInt(30); + var op_or = function(x, y) { + return x | y; + }; + prime.generateProbablePrime = function(bits, options, callback) { + if (typeof options === "function") { + callback = options; + options = {}; + } + options = options || {}; + var algorithm = options.algorithm || "PRIMEINC"; + if (typeof algorithm === "string") { + algorithm = { name: algorithm }; + } + algorithm.options = algorithm.options || {}; + var prng = options.prng || forge3.random; + var rng = { + // x is an array to fill with bytes + nextBytes: function(x) { + var b = prng.getBytesSync(x.length); + for (var i = 0; i < x.length; ++i) { + x[i] = b.charCodeAt(i); + } + } + }; + if (algorithm.name === "PRIMEINC") { + return primeincFindPrime(bits, rng, algorithm.options, callback); + } + throw new Error("Invalid prime generation algorithm: " + algorithm.name); + }; + function primeincFindPrime(bits, rng, options, callback) { + if ("workers" in options) { + return primeincFindPrimeWithWorkers(bits, rng, options, callback); + } + return primeincFindPrimeWithoutWorkers(bits, rng, options, callback); + } + function primeincFindPrimeWithoutWorkers(bits, rng, options, callback) { + var num = generateRandom(bits, rng); + var deltaIdx = 0; + var mrTests = getMillerRabinTests(num.bitLength()); + if ("millerRabinTests" in options) { + mrTests = options.millerRabinTests; + } + var maxBlockTime = 10; + if ("maxBlockTime" in options) { + maxBlockTime = options.maxBlockTime; + } + _primeinc(num, bits, rng, deltaIdx, mrTests, maxBlockTime, callback); + } + function _primeinc(num, bits, rng, deltaIdx, mrTests, maxBlockTime, callback) { + var start = +/* @__PURE__ */ new Date(); + do { + if (num.bitLength() > bits) { + num = generateRandom(bits, rng); + } + if (num.isProbablePrime(mrTests)) { + return callback(null, num); + } + num.dAddOffset(GCD_30_DELTA[deltaIdx++ % 8], 0); + } while (maxBlockTime < 0 || +/* @__PURE__ */ new Date() - start < maxBlockTime); + forge3.util.setImmediate(function() { + _primeinc(num, bits, rng, deltaIdx, mrTests, maxBlockTime, callback); + }); + } + function primeincFindPrimeWithWorkers(bits, rng, options, callback) { + if (typeof Worker === "undefined") { + return primeincFindPrimeWithoutWorkers(bits, rng, options, callback); + } + var num = generateRandom(bits, rng); + var numWorkers = options.workers; + var workLoad = options.workLoad || 100; + var range = workLoad * 30 / 8; + var workerScript = options.workerScript || "forge/prime.worker.js"; + if (numWorkers === -1) { + return forge3.util.estimateCores(function(err, cores) { + if (err) { + cores = 2; + } + numWorkers = cores - 1; + generate(); + }); + } + generate(); + function generate() { + numWorkers = Math.max(1, numWorkers); + var workers = []; + for (var i = 0; i < numWorkers; ++i) { + workers[i] = new Worker(workerScript); + } + var running = numWorkers; + for (var i = 0; i < numWorkers; ++i) { + workers[i].addEventListener("message", workerMessage); + } + var found = false; + function workerMessage(e) { + if (found) { + return; + } + --running; + var data = e.data; + if (data.found) { + for (var i2 = 0; i2 < workers.length; ++i2) { + workers[i2].terminate(); + } + found = true; + return callback(null, new BigInteger2(data.prime, 16)); + } + if (num.bitLength() > bits) { + num = generateRandom(bits, rng); + } + var hex = num.toString(16); + e.target.postMessage({ + hex, + workLoad + }); + num.dAddOffset(range, 0); + } + } + } + function generateRandom(bits, rng) { + var num = new BigInteger2(bits, rng); + var bits1 = bits - 1; + if (!num.testBit(bits1)) { + num.bitwiseTo(BigInteger2.ONE.shiftLeft(bits1), op_or, num); + } + num.dAddOffset(31 - num.mod(THIRTY).byteValue(), 0); + return num; + } + function getMillerRabinTests(bits) { + if (bits <= 100) return 27; + if (bits <= 150) return 18; + if (bits <= 200) return 15; + if (bits <= 250) return 12; + if (bits <= 300) return 9; + if (bits <= 350) return 8; + if (bits <= 400) return 7; + if (bits <= 500) return 6; + if (bits <= 600) return 5; + if (bits <= 800) return 4; + if (bits <= 1250) return 3; + return 2; + } + })(); + } +}); + +// node_modules/node-forge/lib/rsa.js +var require_rsa = __commonJS({ + "node_modules/node-forge/lib/rsa.js"(exports, module) { + var forge3 = require_forge(); + require_asn1(); + require_jsbn(); + require_oids(); + require_pkcs1(); + require_prime(); + require_random(); + require_util(); + if (typeof BigInteger2 === "undefined") { + BigInteger2 = forge3.jsbn.BigInteger; + } + var BigInteger2; + var _crypto = forge3.util.isNodejs ? __require("crypto") : null; + var asn1 = forge3.asn1; + var util = forge3.util; + forge3.pki = forge3.pki || {}; + module.exports = forge3.pki.rsa = forge3.rsa = forge3.rsa || {}; + var pki = forge3.pki; + var GCD_30_DELTA = [6, 4, 2, 4, 2, 4, 6, 2]; + var privateKeyValidator = { + // PrivateKeyInfo + name: "PrivateKeyInfo", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + // Version (INTEGER) + name: "PrivateKeyInfo.version", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.INTEGER, + constructed: false, + capture: "privateKeyVersion" + }, { + // privateKeyAlgorithm + name: "PrivateKeyInfo.privateKeyAlgorithm", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + name: "AlgorithmIdentifier.algorithm", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.OID, + constructed: false, + capture: "privateKeyOid" + }] + }, { + // PrivateKey + name: "PrivateKeyInfo", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.OCTETSTRING, + constructed: false, + capture: "privateKey" + }] + }; + var rsaPrivateKeyValidator = { + // RSAPrivateKey + name: "RSAPrivateKey", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + // Version (INTEGER) + name: "RSAPrivateKey.version", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.INTEGER, + constructed: false, + capture: "privateKeyVersion" + }, { + // modulus (n) + name: "RSAPrivateKey.modulus", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.INTEGER, + constructed: false, + capture: "privateKeyModulus" + }, { + // publicExponent (e) + name: "RSAPrivateKey.publicExponent", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.INTEGER, + constructed: false, + capture: "privateKeyPublicExponent" + }, { + // privateExponent (d) + name: "RSAPrivateKey.privateExponent", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.INTEGER, + constructed: false, + capture: "privateKeyPrivateExponent" + }, { + // prime1 (p) + name: "RSAPrivateKey.prime1", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.INTEGER, + constructed: false, + capture: "privateKeyPrime1" + }, { + // prime2 (q) + name: "RSAPrivateKey.prime2", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.INTEGER, + constructed: false, + capture: "privateKeyPrime2" + }, { + // exponent1 (d mod (p-1)) + name: "RSAPrivateKey.exponent1", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.INTEGER, + constructed: false, + capture: "privateKeyExponent1" + }, { + // exponent2 (d mod (q-1)) + name: "RSAPrivateKey.exponent2", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.INTEGER, + constructed: false, + capture: "privateKeyExponent2" + }, { + // coefficient ((inverse of q) mod p) + name: "RSAPrivateKey.coefficient", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.INTEGER, + constructed: false, + capture: "privateKeyCoefficient" + }] + }; + var rsaPublicKeyValidator = { + // RSAPublicKey + name: "RSAPublicKey", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + // modulus (n) + name: "RSAPublicKey.modulus", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.INTEGER, + constructed: false, + capture: "publicKeyModulus" + }, { + // publicExponent (e) + name: "RSAPublicKey.exponent", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.INTEGER, + constructed: false, + capture: "publicKeyExponent" + }] + }; + var publicKeyValidator = forge3.pki.rsa.publicKeyValidator = { + name: "SubjectPublicKeyInfo", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + captureAsn1: "subjectPublicKeyInfo", + value: [{ + name: "SubjectPublicKeyInfo.AlgorithmIdentifier", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + name: "AlgorithmIdentifier.algorithm", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.OID, + constructed: false, + capture: "publicKeyOid" + }] + }, { + // subjectPublicKey + name: "SubjectPublicKeyInfo.subjectPublicKey", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.BITSTRING, + constructed: false, + value: [{ + // RSAPublicKey + name: "SubjectPublicKeyInfo.subjectPublicKey.RSAPublicKey", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + optional: true, + captureAsn1: "rsaPublicKey" + }] + }] + }; + var digestInfoValidator = { + name: "DigestInfo", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + name: "DigestInfo.DigestAlgorithm", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + name: "DigestInfo.DigestAlgorithm.algorithmIdentifier", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.OID, + constructed: false, + capture: "algorithmIdentifier" + }, { + // NULL paramters + name: "DigestInfo.DigestAlgorithm.parameters", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.NULL, + // captured only to check existence for md2 and md5 + capture: "parameters", + optional: true, + constructed: false + }] + }, { + // digest + name: "DigestInfo.digest", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.OCTETSTRING, + constructed: false, + capture: "digest" + }] + }; + var emsaPkcs1v15encode = function(md) { + var oid; + if (md.algorithm in pki.oids) { + oid = pki.oids[md.algorithm]; + } else { + var error = new Error("Unknown message digest algorithm."); + error.algorithm = md.algorithm; + throw error; + } + var oidBytes = asn1.oidToDer(oid).getBytes(); + var digestInfo = asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.SEQUENCE, + true, + [] + ); + var digestAlgorithm = asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.SEQUENCE, + true, + [] + ); + digestAlgorithm.value.push(asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + oidBytes + )); + digestAlgorithm.value.push(asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.NULL, + false, + "" + )); + var digest = asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OCTETSTRING, + false, + md.digest().getBytes() + ); + digestInfo.value.push(digestAlgorithm); + digestInfo.value.push(digest); + return asn1.toDer(digestInfo).getBytes(); + }; + var _modPow = function(x, key, pub) { + if (pub) { + return x.modPow(key.e, key.n); + } + if (!key.p || !key.q) { + return x.modPow(key.d, key.n); + } + if (!key.dP) { + key.dP = key.d.mod(key.p.subtract(BigInteger2.ONE)); + } + if (!key.dQ) { + key.dQ = key.d.mod(key.q.subtract(BigInteger2.ONE)); + } + if (!key.qInv) { + key.qInv = key.q.modInverse(key.p); + } + var r; + do { + r = new BigInteger2( + forge3.util.bytesToHex(forge3.random.getBytes(key.n.bitLength() / 8)), + 16 + ); + } while (r.compareTo(key.n) >= 0 || !r.gcd(key.n).equals(BigInteger2.ONE)); + x = x.multiply(r.modPow(key.e, key.n)).mod(key.n); + var xp = x.mod(key.p).modPow(key.dP, key.p); + var xq = x.mod(key.q).modPow(key.dQ, key.q); + while (xp.compareTo(xq) < 0) { + xp = xp.add(key.p); + } + var y = xp.subtract(xq).multiply(key.qInv).mod(key.p).multiply(key.q).add(xq); + y = y.multiply(r.modInverse(key.n)).mod(key.n); + return y; + }; + pki.rsa.encrypt = function(m, key, bt) { + var pub = bt; + var eb; + var k = Math.ceil(key.n.bitLength() / 8); + if (bt !== false && bt !== true) { + pub = bt === 2; + eb = _encodePkcs1_v1_5(m, key, bt); + } else { + eb = forge3.util.createBuffer(); + eb.putBytes(m); + } + var x = new BigInteger2(eb.toHex(), 16); + var y = _modPow(x, key, pub); + var yhex = y.toString(16); + var ed = forge3.util.createBuffer(); + var zeros = k - Math.ceil(yhex.length / 2); + while (zeros > 0) { + ed.putByte(0); + --zeros; + } + ed.putBytes(forge3.util.hexToBytes(yhex)); + return ed.getBytes(); + }; + pki.rsa.decrypt = function(ed, key, pub, ml) { + var k = Math.ceil(key.n.bitLength() / 8); + if (ed.length !== k) { + var error = new Error("Encrypted message length is invalid."); + error.length = ed.length; + error.expected = k; + throw error; + } + var y = new BigInteger2(forge3.util.createBuffer(ed).toHex(), 16); + if (y.compareTo(key.n) >= 0) { + throw new Error("Encrypted message is invalid."); + } + var x = _modPow(y, key, pub); + var xhex = x.toString(16); + var eb = forge3.util.createBuffer(); + var zeros = k - Math.ceil(xhex.length / 2); + while (zeros > 0) { + eb.putByte(0); + --zeros; + } + eb.putBytes(forge3.util.hexToBytes(xhex)); + if (ml !== false) { + return _decodePkcs1_v1_5(eb.getBytes(), key, pub); + } + return eb.getBytes(); + }; + pki.rsa.createKeyPairGenerationState = function(bits, e, options) { + if (typeof bits === "string") { + bits = parseInt(bits, 10); + } + bits = bits || 2048; + options = options || {}; + var prng = options.prng || forge3.random; + var rng = { + // x is an array to fill with bytes + nextBytes: function(x) { + var b = prng.getBytesSync(x.length); + for (var i = 0; i < x.length; ++i) { + x[i] = b.charCodeAt(i); + } + } + }; + var algorithm = options.algorithm || "PRIMEINC"; + var rval; + if (algorithm === "PRIMEINC") { + rval = { + algorithm, + state: 0, + bits, + rng, + eInt: e || 65537, + e: new BigInteger2(null), + p: null, + q: null, + qBits: bits >> 1, + pBits: bits - (bits >> 1), + pqState: 0, + num: null, + keys: null + }; + rval.e.fromInt(rval.eInt); + } else { + throw new Error("Invalid key generation algorithm: " + algorithm); + } + return rval; + }; + pki.rsa.stepKeyPairGenerationState = function(state, n) { + if (!("algorithm" in state)) { + state.algorithm = "PRIMEINC"; + } + var THIRTY = new BigInteger2(null); + THIRTY.fromInt(30); + var deltaIdx = 0; + var op_or = function(x, y) { + return x | y; + }; + var t1 = +/* @__PURE__ */ new Date(); + var t2; + var total = 0; + while (state.keys === null && (n <= 0 || total < n)) { + if (state.state === 0) { + var bits = state.p === null ? state.pBits : state.qBits; + var bits1 = bits - 1; + if (state.pqState === 0) { + state.num = new BigInteger2(bits, state.rng); + if (!state.num.testBit(bits1)) { + state.num.bitwiseTo( + BigInteger2.ONE.shiftLeft(bits1), + op_or, + state.num + ); + } + state.num.dAddOffset(31 - state.num.mod(THIRTY).byteValue(), 0); + deltaIdx = 0; + ++state.pqState; + } else if (state.pqState === 1) { + if (state.num.bitLength() > bits) { + state.pqState = 0; + } else if (state.num.isProbablePrime( + _getMillerRabinTests(state.num.bitLength()) + )) { + ++state.pqState; + } else { + state.num.dAddOffset(GCD_30_DELTA[deltaIdx++ % 8], 0); + } + } else if (state.pqState === 2) { + state.pqState = state.num.subtract(BigInteger2.ONE).gcd(state.e).compareTo(BigInteger2.ONE) === 0 ? 3 : 0; + } else if (state.pqState === 3) { + state.pqState = 0; + if (state.p === null) { + state.p = state.num; + } else { + state.q = state.num; + } + if (state.p !== null && state.q !== null) { + ++state.state; + } + state.num = null; + } + } else if (state.state === 1) { + if (state.p.compareTo(state.q) < 0) { + state.num = state.p; + state.p = state.q; + state.q = state.num; + } + ++state.state; + } else if (state.state === 2) { + state.p1 = state.p.subtract(BigInteger2.ONE); + state.q1 = state.q.subtract(BigInteger2.ONE); + state.phi = state.p1.multiply(state.q1); + ++state.state; + } else if (state.state === 3) { + if (state.phi.gcd(state.e).compareTo(BigInteger2.ONE) === 0) { + ++state.state; + } else { + state.p = null; + state.q = null; + state.state = 0; + } + } else if (state.state === 4) { + state.n = state.p.multiply(state.q); + if (state.n.bitLength() === state.bits) { + ++state.state; + } else { + state.q = null; + state.state = 0; + } + } else if (state.state === 5) { + var d = state.e.modInverse(state.phi); + state.keys = { + privateKey: pki.rsa.setPrivateKey( + state.n, + state.e, + d, + state.p, + state.q, + d.mod(state.p1), + d.mod(state.q1), + state.q.modInverse(state.p) + ), + publicKey: pki.rsa.setPublicKey(state.n, state.e) + }; + } + t2 = +/* @__PURE__ */ new Date(); + total += t2 - t1; + t1 = t2; + } + return state.keys !== null; + }; + pki.rsa.generateKeyPair = function(bits, e, options, callback) { + if (arguments.length === 1) { + if (typeof bits === "object") { + options = bits; + bits = void 0; + } else if (typeof bits === "function") { + callback = bits; + bits = void 0; + } + } else if (arguments.length === 2) { + if (typeof bits === "number") { + if (typeof e === "function") { + callback = e; + e = void 0; + } else if (typeof e !== "number") { + options = e; + e = void 0; + } + } else { + options = bits; + callback = e; + bits = void 0; + e = void 0; + } + } else if (arguments.length === 3) { + if (typeof e === "number") { + if (typeof options === "function") { + callback = options; + options = void 0; + } + } else { + callback = options; + options = e; + e = void 0; + } + } + options = options || {}; + if (bits === void 0) { + bits = options.bits || 2048; + } + if (e === void 0) { + e = options.e || 65537; + } + if (!forge3.options.usePureJavaScript && !options.prng && bits >= 256 && bits <= 16384 && (e === 65537 || e === 3)) { + if (callback) { + if (_detectNodeCrypto("generateKeyPair")) { + return _crypto.generateKeyPair("rsa", { + modulusLength: bits, + publicExponent: e, + publicKeyEncoding: { + type: "spki", + format: "pem" + }, + privateKeyEncoding: { + type: "pkcs8", + format: "pem" + } + }, function(err, pub, priv) { + if (err) { + return callback(err); + } + callback(null, { + privateKey: pki.privateKeyFromPem(priv), + publicKey: pki.publicKeyFromPem(pub) + }); + }); + } + if (_detectSubtleCrypto("generateKey") && _detectSubtleCrypto("exportKey")) { + return util.globalScope.crypto.subtle.generateKey({ + name: "RSASSA-PKCS1-v1_5", + modulusLength: bits, + publicExponent: _intToUint8Array(e), + hash: { name: "SHA-256" } + }, true, ["sign", "verify"]).then(function(pair) { + return util.globalScope.crypto.subtle.exportKey( + "pkcs8", + pair.privateKey + ); + }).then(void 0, function(err) { + callback(err); + }).then(function(pkcs8) { + if (pkcs8) { + var privateKey = pki.privateKeyFromAsn1( + asn1.fromDer(forge3.util.createBuffer(pkcs8)) + ); + callback(null, { + privateKey, + publicKey: pki.setRsaPublicKey(privateKey.n, privateKey.e) + }); + } + }); + } + if (_detectSubtleMsCrypto("generateKey") && _detectSubtleMsCrypto("exportKey")) { + var genOp = util.globalScope.msCrypto.subtle.generateKey({ + name: "RSASSA-PKCS1-v1_5", + modulusLength: bits, + publicExponent: _intToUint8Array(e), + hash: { name: "SHA-256" } + }, true, ["sign", "verify"]); + genOp.oncomplete = function(e2) { + var pair = e2.target.result; + var exportOp = util.globalScope.msCrypto.subtle.exportKey( + "pkcs8", + pair.privateKey + ); + exportOp.oncomplete = function(e3) { + var pkcs8 = e3.target.result; + var privateKey = pki.privateKeyFromAsn1( + asn1.fromDer(forge3.util.createBuffer(pkcs8)) + ); + callback(null, { + privateKey, + publicKey: pki.setRsaPublicKey(privateKey.n, privateKey.e) + }); + }; + exportOp.onerror = function(err) { + callback(err); + }; + }; + genOp.onerror = function(err) { + callback(err); + }; + return; + } + } else { + if (_detectNodeCrypto("generateKeyPairSync")) { + var keypair = _crypto.generateKeyPairSync("rsa", { + modulusLength: bits, + publicExponent: e, + publicKeyEncoding: { + type: "spki", + format: "pem" + }, + privateKeyEncoding: { + type: "pkcs8", + format: "pem" + } + }); + return { + privateKey: pki.privateKeyFromPem(keypair.privateKey), + publicKey: pki.publicKeyFromPem(keypair.publicKey) + }; + } + } + } + var state = pki.rsa.createKeyPairGenerationState(bits, e, options); + if (!callback) { + pki.rsa.stepKeyPairGenerationState(state, 0); + return state.keys; + } + _generateKeyPair(state, options, callback); + }; + pki.setRsaPublicKey = pki.rsa.setPublicKey = function(n, e) { + var key = { + n, + e + }; + key.encrypt = function(data, scheme, schemeOptions) { + if (typeof scheme === "string") { + scheme = scheme.toUpperCase(); + } else if (scheme === void 0) { + scheme = "RSAES-PKCS1-V1_5"; + } + if (scheme === "RSAES-PKCS1-V1_5") { + scheme = { + encode: function(m, key2, pub) { + return _encodePkcs1_v1_5(m, key2, 2).getBytes(); + } + }; + } else if (scheme === "RSA-OAEP" || scheme === "RSAES-OAEP") { + scheme = { + encode: function(m, key2) { + return forge3.pkcs1.encode_rsa_oaep(key2, m, schemeOptions); + } + }; + } else if (["RAW", "NONE", "NULL", null].indexOf(scheme) !== -1) { + scheme = { encode: function(e3) { + return e3; + } }; + } else if (typeof scheme === "string") { + throw new Error('Unsupported encryption scheme: "' + scheme + '".'); + } + var e2 = scheme.encode(data, key, true); + return pki.rsa.encrypt(e2, key, true); + }; + key.verify = function(digest, signature, scheme, options) { + if (typeof scheme === "string") { + scheme = scheme.toUpperCase(); + } else if (scheme === void 0) { + scheme = "RSASSA-PKCS1-V1_5"; + } + if (options === void 0) { + options = { + _parseAllDigestBytes: true + }; + } + if (!("_parseAllDigestBytes" in options)) { + options._parseAllDigestBytes = true; + } + if (scheme === "RSASSA-PKCS1-V1_5") { + scheme = { + verify: function(digest2, d2) { + d2 = _decodePkcs1_v1_5(d2, key, true); + var obj = asn1.fromDer(d2, { + parseAllBytes: options._parseAllDigestBytes + }); + var capture = {}; + var errors = []; + if (!asn1.validate(obj, digestInfoValidator, capture, errors)) { + var error = new Error( + "ASN.1 object does not contain a valid RSASSA-PKCS1-v1_5 DigestInfo value." + ); + error.errors = errors; + throw error; + } + var oid = asn1.derToOid(capture.algorithmIdentifier); + if (!(oid === forge3.oids.md2 || oid === forge3.oids.md5 || oid === forge3.oids.sha1 || oid === forge3.oids.sha224 || oid === forge3.oids.sha256 || oid === forge3.oids.sha384 || oid === forge3.oids.sha512 || oid === forge3.oids["sha512-224"] || oid === forge3.oids["sha512-256"])) { + var error = new Error( + "Unknown RSASSA-PKCS1-v1_5 DigestAlgorithm identifier." + ); + error.oid = oid; + throw error; + } + if (oid === forge3.oids.md2 || oid === forge3.oids.md5) { + if (!("parameters" in capture)) { + throw new Error( + "ASN.1 object does not contain a valid RSASSA-PKCS1-v1_5 DigestInfo value. Missing algorithm identifer NULL parameters." + ); + } + } + return digest2 === capture.digest; + } + }; + } else if (scheme === "NONE" || scheme === "NULL" || scheme === null) { + scheme = { + verify: function(digest2, d2) { + d2 = _decodePkcs1_v1_5(d2, key, true); + return digest2 === d2; + } + }; + } + var d = pki.rsa.decrypt(signature, key, true, false); + return scheme.verify(digest, d, key.n.bitLength()); + }; + return key; + }; + pki.setRsaPrivateKey = pki.rsa.setPrivateKey = function(n, e, d, p, q, dP, dQ, qInv) { + var key = { + n, + e, + d, + p, + q, + dP, + dQ, + qInv + }; + key.decrypt = function(data, scheme, schemeOptions) { + if (typeof scheme === "string") { + scheme = scheme.toUpperCase(); + } else if (scheme === void 0) { + scheme = "RSAES-PKCS1-V1_5"; + } + var d2 = pki.rsa.decrypt(data, key, false, false); + if (scheme === "RSAES-PKCS1-V1_5") { + scheme = { decode: _decodePkcs1_v1_5 }; + } else if (scheme === "RSA-OAEP" || scheme === "RSAES-OAEP") { + scheme = { + decode: function(d3, key2) { + return forge3.pkcs1.decode_rsa_oaep(key2, d3, schemeOptions); + } + }; + } else if (["RAW", "NONE", "NULL", null].indexOf(scheme) !== -1) { + scheme = { decode: function(d3) { + return d3; + } }; + } else { + throw new Error('Unsupported encryption scheme: "' + scheme + '".'); + } + return scheme.decode(d2, key, false); + }; + key.sign = function(md, scheme) { + var bt = false; + if (typeof scheme === "string") { + scheme = scheme.toUpperCase(); + } + if (scheme === void 0 || scheme === "RSASSA-PKCS1-V1_5") { + scheme = { encode: emsaPkcs1v15encode }; + bt = 1; + } else if (scheme === "NONE" || scheme === "NULL" || scheme === null) { + scheme = { encode: function() { + return md; + } }; + bt = 1; + } + var d2 = scheme.encode(md, key.n.bitLength()); + return pki.rsa.encrypt(d2, key, bt); + }; + return key; + }; + pki.wrapRsaPrivateKey = function(rsaKey) { + return asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // version (0) + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.INTEGER, + false, + asn1.integerToDer(0).getBytes() + ), + // privateKeyAlgorithm + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + asn1.oidToDer(pki.oids.rsaEncryption).getBytes() + ), + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.NULL, false, "") + ]), + // PrivateKey + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OCTETSTRING, + false, + asn1.toDer(rsaKey).getBytes() + ) + ]); + }; + pki.privateKeyFromAsn1 = function(obj) { + var capture = {}; + var errors = []; + if (asn1.validate(obj, privateKeyValidator, capture, errors)) { + obj = asn1.fromDer(forge3.util.createBuffer(capture.privateKey)); + } + capture = {}; + errors = []; + if (!asn1.validate(obj, rsaPrivateKeyValidator, capture, errors)) { + var error = new Error("Cannot read private key. ASN.1 object does not contain an RSAPrivateKey."); + error.errors = errors; + throw error; + } + var n, e, d, p, q, dP, dQ, qInv; + n = forge3.util.createBuffer(capture.privateKeyModulus).toHex(); + e = forge3.util.createBuffer(capture.privateKeyPublicExponent).toHex(); + d = forge3.util.createBuffer(capture.privateKeyPrivateExponent).toHex(); + p = forge3.util.createBuffer(capture.privateKeyPrime1).toHex(); + q = forge3.util.createBuffer(capture.privateKeyPrime2).toHex(); + dP = forge3.util.createBuffer(capture.privateKeyExponent1).toHex(); + dQ = forge3.util.createBuffer(capture.privateKeyExponent2).toHex(); + qInv = forge3.util.createBuffer(capture.privateKeyCoefficient).toHex(); + return pki.setRsaPrivateKey( + new BigInteger2(n, 16), + new BigInteger2(e, 16), + new BigInteger2(d, 16), + new BigInteger2(p, 16), + new BigInteger2(q, 16), + new BigInteger2(dP, 16), + new BigInteger2(dQ, 16), + new BigInteger2(qInv, 16) + ); + }; + pki.privateKeyToAsn1 = pki.privateKeyToRSAPrivateKey = function(key) { + return asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // version (0 = only 2 primes, 1 multiple primes) + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.INTEGER, + false, + asn1.integerToDer(0).getBytes() + ), + // modulus (n) + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.INTEGER, + false, + _bnToBytes(key.n) + ), + // publicExponent (e) + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.INTEGER, + false, + _bnToBytes(key.e) + ), + // privateExponent (d) + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.INTEGER, + false, + _bnToBytes(key.d) + ), + // privateKeyPrime1 (p) + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.INTEGER, + false, + _bnToBytes(key.p) + ), + // privateKeyPrime2 (q) + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.INTEGER, + false, + _bnToBytes(key.q) + ), + // privateKeyExponent1 (dP) + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.INTEGER, + false, + _bnToBytes(key.dP) + ), + // privateKeyExponent2 (dQ) + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.INTEGER, + false, + _bnToBytes(key.dQ) + ), + // coefficient (qInv) + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.INTEGER, + false, + _bnToBytes(key.qInv) + ) + ]); + }; + pki.publicKeyFromAsn1 = function(obj) { + var capture = {}; + var errors = []; + if (asn1.validate(obj, publicKeyValidator, capture, errors)) { + var oid = asn1.derToOid(capture.publicKeyOid); + if (oid !== pki.oids.rsaEncryption) { + var error = new Error("Cannot read public key. Unknown OID."); + error.oid = oid; + throw error; + } + obj = capture.rsaPublicKey; + } + errors = []; + if (!asn1.validate(obj, rsaPublicKeyValidator, capture, errors)) { + var error = new Error("Cannot read public key. ASN.1 object does not contain an RSAPublicKey."); + error.errors = errors; + throw error; + } + var n = forge3.util.createBuffer(capture.publicKeyModulus).toHex(); + var e = forge3.util.createBuffer(capture.publicKeyExponent).toHex(); + return pki.setRsaPublicKey( + new BigInteger2(n, 16), + new BigInteger2(e, 16) + ); + }; + pki.publicKeyToAsn1 = pki.publicKeyToSubjectPublicKeyInfo = function(key) { + return asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // AlgorithmIdentifier + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // algorithm + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + asn1.oidToDer(pki.oids.rsaEncryption).getBytes() + ), + // parameters (null) + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.NULL, false, "") + ]), + // subjectPublicKey + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.BITSTRING, false, [ + pki.publicKeyToRSAPublicKey(key) + ]) + ]); + }; + pki.publicKeyToRSAPublicKey = function(key) { + return asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // modulus (n) + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.INTEGER, + false, + _bnToBytes(key.n) + ), + // publicExponent (e) + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.INTEGER, + false, + _bnToBytes(key.e) + ) + ]); + }; + function _encodePkcs1_v1_5(m, key, bt) { + var eb = forge3.util.createBuffer(); + var k = Math.ceil(key.n.bitLength() / 8); + if (m.length > k - 11) { + var error = new Error("Message is too long for PKCS#1 v1.5 padding."); + error.length = m.length; + error.max = k - 11; + throw error; + } + eb.putByte(0); + eb.putByte(bt); + var padNum = k - 3 - m.length; + var padByte; + if (bt === 0 || bt === 1) { + padByte = bt === 0 ? 0 : 255; + for (var i = 0; i < padNum; ++i) { + eb.putByte(padByte); + } + } else { + while (padNum > 0) { + var numZeros = 0; + var padBytes = forge3.random.getBytes(padNum); + for (var i = 0; i < padNum; ++i) { + padByte = padBytes.charCodeAt(i); + if (padByte === 0) { + ++numZeros; + } else { + eb.putByte(padByte); + } + } + padNum = numZeros; + } + } + eb.putByte(0); + eb.putBytes(m); + return eb; + } + function _decodePkcs1_v1_5(em, key, pub, ml) { + var k = Math.ceil(key.n.bitLength() / 8); + var eb = forge3.util.createBuffer(em); + var first = eb.getByte(); + var bt = eb.getByte(); + if (first !== 0 || pub && bt !== 0 && bt !== 1 || !pub && bt != 2 || pub && bt === 0 && typeof ml === "undefined") { + throw new Error("Encryption block is invalid."); + } + var padNum = 0; + if (bt === 0) { + padNum = k - 3 - ml; + for (var i = 0; i < padNum; ++i) { + if (eb.getByte() !== 0) { + throw new Error("Encryption block is invalid."); + } + } + } else if (bt === 1) { + padNum = 0; + while (eb.length() > 1) { + if (eb.getByte() !== 255) { + --eb.read; + break; + } + ++padNum; + } + } else if (bt === 2) { + padNum = 0; + while (eb.length() > 1) { + if (eb.getByte() === 0) { + --eb.read; + break; + } + ++padNum; + } + } + var zero = eb.getByte(); + if (zero !== 0 || padNum !== k - 3 - eb.length()) { + throw new Error("Encryption block is invalid."); + } + return eb.getBytes(); + } + function _generateKeyPair(state, options, callback) { + if (typeof options === "function") { + callback = options; + options = {}; + } + options = options || {}; + var opts = { + algorithm: { + name: options.algorithm || "PRIMEINC", + options: { + workers: options.workers || 2, + workLoad: options.workLoad || 100, + workerScript: options.workerScript + } + } + }; + if ("prng" in options) { + opts.prng = options.prng; + } + generate(); + function generate() { + getPrime(state.pBits, function(err, num) { + if (err) { + return callback(err); + } + state.p = num; + if (state.q !== null) { + return finish(err, state.q); + } + getPrime(state.qBits, finish); + }); + } + function getPrime(bits, callback2) { + forge3.prime.generateProbablePrime(bits, opts, callback2); + } + function finish(err, num) { + if (err) { + return callback(err); + } + state.q = num; + if (state.p.compareTo(state.q) < 0) { + var tmp = state.p; + state.p = state.q; + state.q = tmp; + } + if (state.p.subtract(BigInteger2.ONE).gcd(state.e).compareTo(BigInteger2.ONE) !== 0) { + state.p = null; + generate(); + return; + } + if (state.q.subtract(BigInteger2.ONE).gcd(state.e).compareTo(BigInteger2.ONE) !== 0) { + state.q = null; + getPrime(state.qBits, finish); + return; + } + state.p1 = state.p.subtract(BigInteger2.ONE); + state.q1 = state.q.subtract(BigInteger2.ONE); + state.phi = state.p1.multiply(state.q1); + if (state.phi.gcd(state.e).compareTo(BigInteger2.ONE) !== 0) { + state.p = state.q = null; + generate(); + return; + } + state.n = state.p.multiply(state.q); + if (state.n.bitLength() !== state.bits) { + state.q = null; + getPrime(state.qBits, finish); + return; + } + var d = state.e.modInverse(state.phi); + state.keys = { + privateKey: pki.rsa.setPrivateKey( + state.n, + state.e, + d, + state.p, + state.q, + d.mod(state.p1), + d.mod(state.q1), + state.q.modInverse(state.p) + ), + publicKey: pki.rsa.setPublicKey(state.n, state.e) + }; + callback(null, state.keys); + } + } + function _bnToBytes(b) { + var hex = b.toString(16); + if (hex[0] >= "8") { + hex = "00" + hex; + } + var bytes = forge3.util.hexToBytes(hex); + if (bytes.length > 1 && // leading 0x00 for positive integer + (bytes.charCodeAt(0) === 0 && (bytes.charCodeAt(1) & 128) === 0 || // leading 0xFF for negative integer + bytes.charCodeAt(0) === 255 && (bytes.charCodeAt(1) & 128) === 128)) { + return bytes.substr(1); + } + return bytes; + } + function _getMillerRabinTests(bits) { + if (bits <= 100) return 27; + if (bits <= 150) return 18; + if (bits <= 200) return 15; + if (bits <= 250) return 12; + if (bits <= 300) return 9; + if (bits <= 350) return 8; + if (bits <= 400) return 7; + if (bits <= 500) return 6; + if (bits <= 600) return 5; + if (bits <= 800) return 4; + if (bits <= 1250) return 3; + return 2; + } + function _detectNodeCrypto(fn) { + return forge3.util.isNodejs && typeof _crypto[fn] === "function"; + } + function _detectSubtleCrypto(fn) { + return typeof util.globalScope !== "undefined" && typeof util.globalScope.crypto === "object" && typeof util.globalScope.crypto.subtle === "object" && typeof util.globalScope.crypto.subtle[fn] === "function"; + } + function _detectSubtleMsCrypto(fn) { + return typeof util.globalScope !== "undefined" && typeof util.globalScope.msCrypto === "object" && typeof util.globalScope.msCrypto.subtle === "object" && typeof util.globalScope.msCrypto.subtle[fn] === "function"; + } + function _intToUint8Array(x) { + var bytes = forge3.util.hexToBytes(x.toString(16)); + var buffer = new Uint8Array(bytes.length); + for (var i = 0; i < bytes.length; ++i) { + buffer[i] = bytes.charCodeAt(i); + } + return buffer; + } + } +}); + +// node_modules/node-forge/lib/pbe.js +var require_pbe = __commonJS({ + "node_modules/node-forge/lib/pbe.js"(exports, module) { + var forge3 = require_forge(); + require_aes(); + require_asn1(); + require_des(); + require_md(); + require_oids(); + require_pbkdf2(); + require_pem(); + require_random(); + require_rc2(); + require_rsa(); + require_util(); + if (typeof BigInteger2 === "undefined") { + BigInteger2 = forge3.jsbn.BigInteger; + } + var BigInteger2; + var asn1 = forge3.asn1; + var pki = forge3.pki = forge3.pki || {}; + module.exports = pki.pbe = forge3.pbe = forge3.pbe || {}; + var oids = pki.oids; + var encryptedPrivateKeyValidator = { + name: "EncryptedPrivateKeyInfo", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + name: "EncryptedPrivateKeyInfo.encryptionAlgorithm", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + name: "AlgorithmIdentifier.algorithm", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.OID, + constructed: false, + capture: "encryptionOid" + }, { + name: "AlgorithmIdentifier.parameters", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + captureAsn1: "encryptionParams" + }] + }, { + // encryptedData + name: "EncryptedPrivateKeyInfo.encryptedData", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.OCTETSTRING, + constructed: false, + capture: "encryptedData" + }] + }; + var PBES2AlgorithmsValidator = { + name: "PBES2Algorithms", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + name: "PBES2Algorithms.keyDerivationFunc", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + name: "PBES2Algorithms.keyDerivationFunc.oid", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.OID, + constructed: false, + capture: "kdfOid" + }, { + name: "PBES2Algorithms.params", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + name: "PBES2Algorithms.params.salt", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.OCTETSTRING, + constructed: false, + capture: "kdfSalt" + }, { + name: "PBES2Algorithms.params.iterationCount", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.INTEGER, + constructed: false, + capture: "kdfIterationCount" + }, { + name: "PBES2Algorithms.params.keyLength", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.INTEGER, + constructed: false, + optional: true, + capture: "keyLength" + }, { + // prf + name: "PBES2Algorithms.params.prf", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + optional: true, + value: [{ + name: "PBES2Algorithms.params.prf.algorithm", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.OID, + constructed: false, + capture: "prfOid" + }] + }] + }] + }, { + name: "PBES2Algorithms.encryptionScheme", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + name: "PBES2Algorithms.encryptionScheme.oid", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.OID, + constructed: false, + capture: "encOid" + }, { + name: "PBES2Algorithms.encryptionScheme.iv", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.OCTETSTRING, + constructed: false, + capture: "encIv" + }] + }] + }; + var pkcs12PbeParamsValidator = { + name: "pkcs-12PbeParams", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + name: "pkcs-12PbeParams.salt", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.OCTETSTRING, + constructed: false, + capture: "salt" + }, { + name: "pkcs-12PbeParams.iterations", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.INTEGER, + constructed: false, + capture: "iterations" + }] + }; + pki.encryptPrivateKeyInfo = function(obj, password, options) { + options = options || {}; + options.saltSize = options.saltSize || 8; + options.count = options.count || 2048; + options.algorithm = options.algorithm || "aes128"; + options.prfAlgorithm = options.prfAlgorithm || "sha1"; + var salt = forge3.random.getBytesSync(options.saltSize); + var count = options.count; + var countBytes = asn1.integerToDer(count); + var dkLen; + var encryptionAlgorithm; + var encryptedData; + if (options.algorithm.indexOf("aes") === 0 || options.algorithm === "des") { + var ivLen, encOid, cipherFn; + switch (options.algorithm) { + case "aes128": + dkLen = 16; + ivLen = 16; + encOid = oids["aes128-CBC"]; + cipherFn = forge3.aes.createEncryptionCipher; + break; + case "aes192": + dkLen = 24; + ivLen = 16; + encOid = oids["aes192-CBC"]; + cipherFn = forge3.aes.createEncryptionCipher; + break; + case "aes256": + dkLen = 32; + ivLen = 16; + encOid = oids["aes256-CBC"]; + cipherFn = forge3.aes.createEncryptionCipher; + break; + case "des": + dkLen = 8; + ivLen = 8; + encOid = oids["desCBC"]; + cipherFn = forge3.des.createEncryptionCipher; + break; + default: + var error = new Error("Cannot encrypt private key. Unknown encryption algorithm."); + error.algorithm = options.algorithm; + throw error; + } + var prfAlgorithm = "hmacWith" + options.prfAlgorithm.toUpperCase(); + var md = prfAlgorithmToMessageDigest(prfAlgorithm); + var dk = forge3.pkcs5.pbkdf2(password, salt, count, dkLen, md); + var iv = forge3.random.getBytesSync(ivLen); + var cipher = cipherFn(dk); + cipher.start(iv); + cipher.update(asn1.toDer(obj)); + cipher.finish(); + encryptedData = cipher.output.getBytes(); + var params = createPbkdf2Params(salt, countBytes, dkLen, prfAlgorithm); + encryptionAlgorithm = asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.SEQUENCE, + true, + [ + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + asn1.oidToDer(oids["pkcs5PBES2"]).getBytes() + ), + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // keyDerivationFunc + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + asn1.oidToDer(oids["pkcs5PBKDF2"]).getBytes() + ), + // PBKDF2-params + params + ]), + // encryptionScheme + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + asn1.oidToDer(encOid).getBytes() + ), + // iv + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OCTETSTRING, + false, + iv + ) + ]) + ]) + ] + ); + } else if (options.algorithm === "3des") { + dkLen = 24; + var saltBytes = new forge3.util.ByteBuffer(salt); + var dk = pki.pbe.generatePkcs12Key(password, saltBytes, 1, count, dkLen); + var iv = pki.pbe.generatePkcs12Key(password, saltBytes, 2, count, dkLen); + var cipher = forge3.des.createEncryptionCipher(dk); + cipher.start(iv); + cipher.update(asn1.toDer(obj)); + cipher.finish(); + encryptedData = cipher.output.getBytes(); + encryptionAlgorithm = asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.SEQUENCE, + true, + [ + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + asn1.oidToDer(oids["pbeWithSHAAnd3-KeyTripleDES-CBC"]).getBytes() + ), + // pkcs-12PbeParams + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // salt + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OCTETSTRING, false, salt), + // iteration count + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.INTEGER, + false, + countBytes.getBytes() + ) + ]) + ] + ); + } else { + var error = new Error("Cannot encrypt private key. Unknown encryption algorithm."); + error.algorithm = options.algorithm; + throw error; + } + var rval = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // encryptionAlgorithm + encryptionAlgorithm, + // encryptedData + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OCTETSTRING, + false, + encryptedData + ) + ]); + return rval; + }; + pki.decryptPrivateKeyInfo = function(obj, password) { + var rval = null; + var capture = {}; + var errors = []; + if (!asn1.validate(obj, encryptedPrivateKeyValidator, capture, errors)) { + var error = new Error("Cannot read encrypted private key. ASN.1 object is not a supported EncryptedPrivateKeyInfo."); + error.errors = errors; + throw error; + } + var oid = asn1.derToOid(capture.encryptionOid); + var cipher = pki.pbe.getCipher(oid, capture.encryptionParams, password); + var encrypted = forge3.util.createBuffer(capture.encryptedData); + cipher.update(encrypted); + if (cipher.finish()) { + rval = asn1.fromDer(cipher.output); + } + return rval; + }; + pki.encryptedPrivateKeyToPem = function(epki, maxline) { + var msg = { + type: "ENCRYPTED PRIVATE KEY", + body: asn1.toDer(epki).getBytes() + }; + return forge3.pem.encode(msg, { maxline }); + }; + pki.encryptedPrivateKeyFromPem = function(pem) { + var msg = forge3.pem.decode(pem)[0]; + if (msg.type !== "ENCRYPTED PRIVATE KEY") { + var error = new Error('Could not convert encrypted private key from PEM; PEM header type is "ENCRYPTED PRIVATE KEY".'); + error.headerType = msg.type; + throw error; + } + if (msg.procType && msg.procType.type === "ENCRYPTED") { + throw new Error("Could not convert encrypted private key from PEM; PEM is encrypted."); + } + return asn1.fromDer(msg.body); + }; + pki.encryptRsaPrivateKey = function(rsaKey, password, options) { + options = options || {}; + if (!options.legacy) { + var rval = pki.wrapRsaPrivateKey(pki.privateKeyToAsn1(rsaKey)); + rval = pki.encryptPrivateKeyInfo(rval, password, options); + return pki.encryptedPrivateKeyToPem(rval); + } + var algorithm; + var iv; + var dkLen; + var cipherFn; + switch (options.algorithm) { + case "aes128": + algorithm = "AES-128-CBC"; + dkLen = 16; + iv = forge3.random.getBytesSync(16); + cipherFn = forge3.aes.createEncryptionCipher; + break; + case "aes192": + algorithm = "AES-192-CBC"; + dkLen = 24; + iv = forge3.random.getBytesSync(16); + cipherFn = forge3.aes.createEncryptionCipher; + break; + case "aes256": + algorithm = "AES-256-CBC"; + dkLen = 32; + iv = forge3.random.getBytesSync(16); + cipherFn = forge3.aes.createEncryptionCipher; + break; + case "3des": + algorithm = "DES-EDE3-CBC"; + dkLen = 24; + iv = forge3.random.getBytesSync(8); + cipherFn = forge3.des.createEncryptionCipher; + break; + case "des": + algorithm = "DES-CBC"; + dkLen = 8; + iv = forge3.random.getBytesSync(8); + cipherFn = forge3.des.createEncryptionCipher; + break; + default: + var error = new Error('Could not encrypt RSA private key; unsupported encryption algorithm "' + options.algorithm + '".'); + error.algorithm = options.algorithm; + throw error; + } + var dk = forge3.pbe.opensslDeriveBytes(password, iv.substr(0, 8), dkLen); + var cipher = cipherFn(dk); + cipher.start(iv); + cipher.update(asn1.toDer(pki.privateKeyToAsn1(rsaKey))); + cipher.finish(); + var msg = { + type: "RSA PRIVATE KEY", + procType: { + version: "4", + type: "ENCRYPTED" + }, + dekInfo: { + algorithm, + parameters: forge3.util.bytesToHex(iv).toUpperCase() + }, + body: cipher.output.getBytes() + }; + return forge3.pem.encode(msg); + }; + pki.decryptRsaPrivateKey = function(pem, password) { + var rval = null; + var msg = forge3.pem.decode(pem)[0]; + if (msg.type !== "ENCRYPTED PRIVATE KEY" && msg.type !== "PRIVATE KEY" && msg.type !== "RSA PRIVATE KEY") { + var error = new Error('Could not convert private key from PEM; PEM header type is not "ENCRYPTED PRIVATE KEY", "PRIVATE KEY", or "RSA PRIVATE KEY".'); + error.headerType = error; + throw error; + } + if (msg.procType && msg.procType.type === "ENCRYPTED") { + var dkLen; + var cipherFn; + switch (msg.dekInfo.algorithm) { + case "DES-CBC": + dkLen = 8; + cipherFn = forge3.des.createDecryptionCipher; + break; + case "DES-EDE3-CBC": + dkLen = 24; + cipherFn = forge3.des.createDecryptionCipher; + break; + case "AES-128-CBC": + dkLen = 16; + cipherFn = forge3.aes.createDecryptionCipher; + break; + case "AES-192-CBC": + dkLen = 24; + cipherFn = forge3.aes.createDecryptionCipher; + break; + case "AES-256-CBC": + dkLen = 32; + cipherFn = forge3.aes.createDecryptionCipher; + break; + case "RC2-40-CBC": + dkLen = 5; + cipherFn = function(key) { + return forge3.rc2.createDecryptionCipher(key, 40); + }; + break; + case "RC2-64-CBC": + dkLen = 8; + cipherFn = function(key) { + return forge3.rc2.createDecryptionCipher(key, 64); + }; + break; + case "RC2-128-CBC": + dkLen = 16; + cipherFn = function(key) { + return forge3.rc2.createDecryptionCipher(key, 128); + }; + break; + default: + var error = new Error('Could not decrypt private key; unsupported encryption algorithm "' + msg.dekInfo.algorithm + '".'); + error.algorithm = msg.dekInfo.algorithm; + throw error; + } + var iv = forge3.util.hexToBytes(msg.dekInfo.parameters); + var dk = forge3.pbe.opensslDeriveBytes(password, iv.substr(0, 8), dkLen); + var cipher = cipherFn(dk); + cipher.start(iv); + cipher.update(forge3.util.createBuffer(msg.body)); + if (cipher.finish()) { + rval = cipher.output.getBytes(); + } else { + return rval; + } + } else { + rval = msg.body; + } + if (msg.type === "ENCRYPTED PRIVATE KEY") { + rval = pki.decryptPrivateKeyInfo(asn1.fromDer(rval), password); + } else { + rval = asn1.fromDer(rval); + } + if (rval !== null) { + rval = pki.privateKeyFromAsn1(rval); + } + return rval; + }; + pki.pbe.generatePkcs12Key = function(password, salt, id, iter, n, md) { + var j, l; + if (typeof md === "undefined" || md === null) { + if (!("sha1" in forge3.md)) { + throw new Error('"sha1" hash algorithm unavailable.'); + } + md = forge3.md.sha1.create(); + } + var u = md.digestLength; + var v = md.blockLength; + var result = new forge3.util.ByteBuffer(); + var passBuf = new forge3.util.ByteBuffer(); + if (password !== null && password !== void 0) { + for (l = 0; l < password.length; l++) { + passBuf.putInt16(password.charCodeAt(l)); + } + passBuf.putInt16(0); + } + var p = passBuf.length(); + var s = salt.length(); + var D = new forge3.util.ByteBuffer(); + D.fillWithByte(id, v); + var Slen = v * Math.ceil(s / v); + var S = new forge3.util.ByteBuffer(); + for (l = 0; l < Slen; l++) { + S.putByte(salt.at(l % s)); + } + var Plen = v * Math.ceil(p / v); + var P = new forge3.util.ByteBuffer(); + for (l = 0; l < Plen; l++) { + P.putByte(passBuf.at(l % p)); + } + var I = S; + I.putBuffer(P); + var c = Math.ceil(n / u); + for (var i = 1; i <= c; i++) { + var buf = new forge3.util.ByteBuffer(); + buf.putBytes(D.bytes()); + buf.putBytes(I.bytes()); + for (var round = 0; round < iter; round++) { + md.start(); + md.update(buf.getBytes()); + buf = md.digest(); + } + var B = new forge3.util.ByteBuffer(); + for (l = 0; l < v; l++) { + B.putByte(buf.at(l % u)); + } + var k = Math.ceil(s / v) + Math.ceil(p / v); + var Inew = new forge3.util.ByteBuffer(); + for (j = 0; j < k; j++) { + var chunk = new forge3.util.ByteBuffer(I.getBytes(v)); + var x = 511; + for (l = B.length() - 1; l >= 0; l--) { + x = x >> 8; + x += B.at(l) + chunk.at(l); + chunk.setAt(l, x & 255); + } + Inew.putBuffer(chunk); + } + I = Inew; + result.putBuffer(buf); + } + result.truncate(result.length() - n); + return result; + }; + pki.pbe.getCipher = function(oid, params, password) { + switch (oid) { + case pki.oids["pkcs5PBES2"]: + return pki.pbe.getCipherForPBES2(oid, params, password); + case pki.oids["pbeWithSHAAnd3-KeyTripleDES-CBC"]: + case pki.oids["pbewithSHAAnd40BitRC2-CBC"]: + return pki.pbe.getCipherForPKCS12PBE(oid, params, password); + default: + var error = new Error("Cannot read encrypted PBE data block. Unsupported OID."); + error.oid = oid; + error.supportedOids = [ + "pkcs5PBES2", + "pbeWithSHAAnd3-KeyTripleDES-CBC", + "pbewithSHAAnd40BitRC2-CBC" + ]; + throw error; + } + }; + pki.pbe.getCipherForPBES2 = function(oid, params, password) { + var capture = {}; + var errors = []; + if (!asn1.validate(params, PBES2AlgorithmsValidator, capture, errors)) { + var error = new Error("Cannot read password-based-encryption algorithm parameters. ASN.1 object is not a supported EncryptedPrivateKeyInfo."); + error.errors = errors; + throw error; + } + oid = asn1.derToOid(capture.kdfOid); + if (oid !== pki.oids["pkcs5PBKDF2"]) { + var error = new Error("Cannot read encrypted private key. Unsupported key derivation function OID."); + error.oid = oid; + error.supportedOids = ["pkcs5PBKDF2"]; + throw error; + } + oid = asn1.derToOid(capture.encOid); + if (oid !== pki.oids["aes128-CBC"] && oid !== pki.oids["aes192-CBC"] && oid !== pki.oids["aes256-CBC"] && oid !== pki.oids["des-EDE3-CBC"] && oid !== pki.oids["desCBC"]) { + var error = new Error("Cannot read encrypted private key. Unsupported encryption scheme OID."); + error.oid = oid; + error.supportedOids = [ + "aes128-CBC", + "aes192-CBC", + "aes256-CBC", + "des-EDE3-CBC", + "desCBC" + ]; + throw error; + } + var salt = capture.kdfSalt; + var count = forge3.util.createBuffer(capture.kdfIterationCount); + count = count.getInt(count.length() << 3); + var dkLen; + var cipherFn; + switch (pki.oids[oid]) { + case "aes128-CBC": + dkLen = 16; + cipherFn = forge3.aes.createDecryptionCipher; + break; + case "aes192-CBC": + dkLen = 24; + cipherFn = forge3.aes.createDecryptionCipher; + break; + case "aes256-CBC": + dkLen = 32; + cipherFn = forge3.aes.createDecryptionCipher; + break; + case "des-EDE3-CBC": + dkLen = 24; + cipherFn = forge3.des.createDecryptionCipher; + break; + case "desCBC": + dkLen = 8; + cipherFn = forge3.des.createDecryptionCipher; + break; + } + var md = prfOidToMessageDigest(capture.prfOid); + var dk = forge3.pkcs5.pbkdf2(password, salt, count, dkLen, md); + var iv = capture.encIv; + var cipher = cipherFn(dk); + cipher.start(iv); + return cipher; + }; + pki.pbe.getCipherForPKCS12PBE = function(oid, params, password) { + var capture = {}; + var errors = []; + if (!asn1.validate(params, pkcs12PbeParamsValidator, capture, errors)) { + var error = new Error("Cannot read password-based-encryption algorithm parameters. ASN.1 object is not a supported EncryptedPrivateKeyInfo."); + error.errors = errors; + throw error; + } + var salt = forge3.util.createBuffer(capture.salt); + var count = forge3.util.createBuffer(capture.iterations); + count = count.getInt(count.length() << 3); + var dkLen, dIvLen, cipherFn; + switch (oid) { + case pki.oids["pbeWithSHAAnd3-KeyTripleDES-CBC"]: + dkLen = 24; + dIvLen = 8; + cipherFn = forge3.des.startDecrypting; + break; + case pki.oids["pbewithSHAAnd40BitRC2-CBC"]: + dkLen = 5; + dIvLen = 8; + cipherFn = function(key2, iv2) { + var cipher = forge3.rc2.createDecryptionCipher(key2, 40); + cipher.start(iv2, null); + return cipher; + }; + break; + default: + var error = new Error("Cannot read PKCS #12 PBE data block. Unsupported OID."); + error.oid = oid; + throw error; + } + var md = prfOidToMessageDigest(capture.prfOid); + var key = pki.pbe.generatePkcs12Key(password, salt, 1, count, dkLen, md); + md.start(); + var iv = pki.pbe.generatePkcs12Key(password, salt, 2, count, dIvLen, md); + return cipherFn(key, iv); + }; + pki.pbe.opensslDeriveBytes = function(password, salt, dkLen, md) { + if (typeof md === "undefined" || md === null) { + if (!("md5" in forge3.md)) { + throw new Error('"md5" hash algorithm unavailable.'); + } + md = forge3.md.md5.create(); + } + if (salt === null) { + salt = ""; + } + var digests = [hash(md, password + salt)]; + for (var length = 16, i = 1; length < dkLen; ++i, length += 16) { + digests.push(hash(md, digests[i - 1] + password + salt)); + } + return digests.join("").substr(0, dkLen); + }; + function hash(md, bytes) { + return md.start().update(bytes).digest().getBytes(); + } + function prfOidToMessageDigest(prfOid) { + var prfAlgorithm; + if (!prfOid) { + prfAlgorithm = "hmacWithSHA1"; + } else { + prfAlgorithm = pki.oids[asn1.derToOid(prfOid)]; + if (!prfAlgorithm) { + var error = new Error("Unsupported PRF OID."); + error.oid = prfOid; + error.supported = [ + "hmacWithSHA1", + "hmacWithSHA224", + "hmacWithSHA256", + "hmacWithSHA384", + "hmacWithSHA512" + ]; + throw error; + } + } + return prfAlgorithmToMessageDigest(prfAlgorithm); + } + function prfAlgorithmToMessageDigest(prfAlgorithm) { + var factory = forge3.md; + switch (prfAlgorithm) { + case "hmacWithSHA224": + factory = forge3.md.sha512; + case "hmacWithSHA1": + case "hmacWithSHA256": + case "hmacWithSHA384": + case "hmacWithSHA512": + prfAlgorithm = prfAlgorithm.substr(8).toLowerCase(); + break; + default: + var error = new Error("Unsupported PRF algorithm."); + error.algorithm = prfAlgorithm; + error.supported = [ + "hmacWithSHA1", + "hmacWithSHA224", + "hmacWithSHA256", + "hmacWithSHA384", + "hmacWithSHA512" + ]; + throw error; + } + if (!factory || !(prfAlgorithm in factory)) { + throw new Error("Unknown hash algorithm: " + prfAlgorithm); + } + return factory[prfAlgorithm].create(); + } + function createPbkdf2Params(salt, countBytes, dkLen, prfAlgorithm) { + var params = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // salt + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OCTETSTRING, + false, + salt + ), + // iteration count + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.INTEGER, + false, + countBytes.getBytes() + ) + ]); + if (prfAlgorithm !== "hmacWithSHA1") { + params.value.push( + // key length + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.INTEGER, + false, + forge3.util.hexToBytes(dkLen.toString(16)) + ), + // AlgorithmIdentifier + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // algorithm + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + asn1.oidToDer(pki.oids[prfAlgorithm]).getBytes() + ), + // parameters (null) + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.NULL, false, "") + ]) + ); + } + return params; + } + } +}); + +// node_modules/node-forge/lib/pkcs7asn1.js +var require_pkcs7asn1 = __commonJS({ + "node_modules/node-forge/lib/pkcs7asn1.js"(exports, module) { + var forge3 = require_forge(); + require_asn1(); + require_util(); + var asn1 = forge3.asn1; + var p7v = module.exports = forge3.pkcs7asn1 = forge3.pkcs7asn1 || {}; + forge3.pkcs7 = forge3.pkcs7 || {}; + forge3.pkcs7.asn1 = p7v; + var contentInfoValidator = { + name: "ContentInfo", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + name: "ContentInfo.ContentType", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.OID, + constructed: false, + capture: "contentType" + }, { + name: "ContentInfo.content", + tagClass: asn1.Class.CONTEXT_SPECIFIC, + type: 0, + constructed: true, + optional: true, + captureAsn1: "content" + }] + }; + p7v.contentInfoValidator = contentInfoValidator; + var encryptedContentInfoValidator = { + name: "EncryptedContentInfo", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + name: "EncryptedContentInfo.contentType", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.OID, + constructed: false, + capture: "contentType" + }, { + name: "EncryptedContentInfo.contentEncryptionAlgorithm", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + name: "EncryptedContentInfo.contentEncryptionAlgorithm.algorithm", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.OID, + constructed: false, + capture: "encAlgorithm" + }, { + name: "EncryptedContentInfo.contentEncryptionAlgorithm.parameter", + tagClass: asn1.Class.UNIVERSAL, + captureAsn1: "encParameter" + }] + }, { + name: "EncryptedContentInfo.encryptedContent", + tagClass: asn1.Class.CONTEXT_SPECIFIC, + type: 0, + /* The PKCS#7 structure output by OpenSSL somewhat differs from what + * other implementations do generate. + * + * OpenSSL generates a structure like this: + * SEQUENCE { + * ... + * [0] + * 26 DA 67 D2 17 9C 45 3C B1 2A A8 59 2F 29 33 38 + * C3 C3 DF 86 71 74 7A 19 9F 40 D0 29 BE 85 90 45 + * ... + * } + * + * Whereas other implementations (and this PKCS#7 module) generate: + * SEQUENCE { + * ... + * [0] { + * OCTET STRING + * 26 DA 67 D2 17 9C 45 3C B1 2A A8 59 2F 29 33 38 + * C3 C3 DF 86 71 74 7A 19 9F 40 D0 29 BE 85 90 45 + * ... + * } + * } + * + * In order to support both, we just capture the context specific + * field here. The OCTET STRING bit is removed below. + */ + capture: "encryptedContent", + captureAsn1: "encryptedContentAsn1" + }] + }; + p7v.envelopedDataValidator = { + name: "EnvelopedData", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + name: "EnvelopedData.Version", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.INTEGER, + constructed: false, + capture: "version" + }, { + name: "EnvelopedData.RecipientInfos", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SET, + constructed: true, + captureAsn1: "recipientInfos" + }].concat(encryptedContentInfoValidator) + }; + p7v.encryptedDataValidator = { + name: "EncryptedData", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + name: "EncryptedData.Version", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.INTEGER, + constructed: false, + capture: "version" + }].concat(encryptedContentInfoValidator) + }; + var signerValidator = { + name: "SignerInfo", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + name: "SignerInfo.version", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.INTEGER, + constructed: false + }, { + name: "SignerInfo.issuerAndSerialNumber", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + name: "SignerInfo.issuerAndSerialNumber.issuer", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + captureAsn1: "issuer" + }, { + name: "SignerInfo.issuerAndSerialNumber.serialNumber", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.INTEGER, + constructed: false, + capture: "serial" + }] + }, { + name: "SignerInfo.digestAlgorithm", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + name: "SignerInfo.digestAlgorithm.algorithm", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.OID, + constructed: false, + capture: "digestAlgorithm" + }, { + name: "SignerInfo.digestAlgorithm.parameter", + tagClass: asn1.Class.UNIVERSAL, + constructed: false, + captureAsn1: "digestParameter", + optional: true + }] + }, { + name: "SignerInfo.authenticatedAttributes", + tagClass: asn1.Class.CONTEXT_SPECIFIC, + type: 0, + constructed: true, + optional: true, + capture: "authenticatedAttributes" + }, { + name: "SignerInfo.digestEncryptionAlgorithm", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + capture: "signatureAlgorithm" + }, { + name: "SignerInfo.encryptedDigest", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.OCTETSTRING, + constructed: false, + capture: "signature" + }, { + name: "SignerInfo.unauthenticatedAttributes", + tagClass: asn1.Class.CONTEXT_SPECIFIC, + type: 1, + constructed: true, + optional: true, + capture: "unauthenticatedAttributes" + }] + }; + p7v.signedDataValidator = { + name: "SignedData", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [ + { + name: "SignedData.Version", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.INTEGER, + constructed: false, + capture: "version" + }, + { + name: "SignedData.DigestAlgorithms", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SET, + constructed: true, + captureAsn1: "digestAlgorithms" + }, + contentInfoValidator, + { + name: "SignedData.Certificates", + tagClass: asn1.Class.CONTEXT_SPECIFIC, + type: 0, + optional: true, + captureAsn1: "certificates" + }, + { + name: "SignedData.CertificateRevocationLists", + tagClass: asn1.Class.CONTEXT_SPECIFIC, + type: 1, + optional: true, + captureAsn1: "crls" + }, + { + name: "SignedData.SignerInfos", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SET, + capture: "signerInfos", + optional: true, + value: [signerValidator] + } + ] + }; + p7v.recipientInfoValidator = { + name: "RecipientInfo", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + name: "RecipientInfo.version", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.INTEGER, + constructed: false, + capture: "version" + }, { + name: "RecipientInfo.issuerAndSerial", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + name: "RecipientInfo.issuerAndSerial.issuer", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + captureAsn1: "issuer" + }, { + name: "RecipientInfo.issuerAndSerial.serialNumber", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.INTEGER, + constructed: false, + capture: "serial" + }] + }, { + name: "RecipientInfo.keyEncryptionAlgorithm", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + name: "RecipientInfo.keyEncryptionAlgorithm.algorithm", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.OID, + constructed: false, + capture: "encAlgorithm" + }, { + name: "RecipientInfo.keyEncryptionAlgorithm.parameter", + tagClass: asn1.Class.UNIVERSAL, + constructed: false, + captureAsn1: "encParameter", + optional: true + }] + }, { + name: "RecipientInfo.encryptedKey", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.OCTETSTRING, + constructed: false, + capture: "encKey" + }] + }; + } +}); + +// node_modules/node-forge/lib/mgf1.js +var require_mgf1 = __commonJS({ + "node_modules/node-forge/lib/mgf1.js"(exports, module) { + var forge3 = require_forge(); + require_util(); + forge3.mgf = forge3.mgf || {}; + var mgf1 = module.exports = forge3.mgf.mgf1 = forge3.mgf1 = forge3.mgf1 || {}; + mgf1.create = function(md) { + var mgf = { + /** + * Generate mask of specified length. + * + * @param {String} seed The seed for mask generation. + * @param maskLen Number of bytes to generate. + * @return {String} The generated mask. + */ + generate: function(seed, maskLen) { + var t = new forge3.util.ByteBuffer(); + var len = Math.ceil(maskLen / md.digestLength); + for (var i = 0; i < len; i++) { + var c = new forge3.util.ByteBuffer(); + c.putInt32(i); + md.start(); + md.update(seed + c.getBytes()); + t.putBuffer(md.digest()); + } + t.truncate(t.length() - maskLen); + return t.getBytes(); + } + }; + return mgf; + }; + } +}); + +// node_modules/node-forge/lib/mgf.js +var require_mgf = __commonJS({ + "node_modules/node-forge/lib/mgf.js"(exports, module) { + var forge3 = require_forge(); + require_mgf1(); + module.exports = forge3.mgf = forge3.mgf || {}; + forge3.mgf.mgf1 = forge3.mgf1; + } +}); + +// node_modules/node-forge/lib/pss.js +var require_pss = __commonJS({ + "node_modules/node-forge/lib/pss.js"(exports, module) { + var forge3 = require_forge(); + require_random(); + require_util(); + var pss = module.exports = forge3.pss = forge3.pss || {}; + pss.create = function(options) { + if (arguments.length === 3) { + options = { + md: arguments[0], + mgf: arguments[1], + saltLength: arguments[2] + }; + } + var hash = options.md; + var mgf = options.mgf; + var hLen = hash.digestLength; + var salt_ = options.salt || null; + if (typeof salt_ === "string") { + salt_ = forge3.util.createBuffer(salt_); + } + var sLen; + if ("saltLength" in options) { + sLen = options.saltLength; + } else if (salt_ !== null) { + sLen = salt_.length(); + } else { + throw new Error("Salt length not specified or specific salt not given."); + } + if (salt_ !== null && salt_.length() !== sLen) { + throw new Error("Given salt length does not match length of given salt."); + } + var prng = options.prng || forge3.random; + var pssobj = {}; + pssobj.encode = function(md, modBits) { + var i; + var emBits = modBits - 1; + var emLen = Math.ceil(emBits / 8); + var mHash = md.digest().getBytes(); + if (emLen < hLen + sLen + 2) { + throw new Error("Message is too long to encrypt."); + } + var salt; + if (salt_ === null) { + salt = prng.getBytesSync(sLen); + } else { + salt = salt_.bytes(); + } + var m_ = new forge3.util.ByteBuffer(); + m_.fillWithByte(0, 8); + m_.putBytes(mHash); + m_.putBytes(salt); + hash.start(); + hash.update(m_.getBytes()); + var h = hash.digest().getBytes(); + var ps = new forge3.util.ByteBuffer(); + ps.fillWithByte(0, emLen - sLen - hLen - 2); + ps.putByte(1); + ps.putBytes(salt); + var db2 = ps.getBytes(); + var maskLen = emLen - hLen - 1; + var dbMask = mgf.generate(h, maskLen); + var maskedDB = ""; + for (i = 0; i < maskLen; i++) { + maskedDB += String.fromCharCode(db2.charCodeAt(i) ^ dbMask.charCodeAt(i)); + } + var mask = 65280 >> 8 * emLen - emBits & 255; + maskedDB = String.fromCharCode(maskedDB.charCodeAt(0) & ~mask) + maskedDB.substr(1); + return maskedDB + h + String.fromCharCode(188); + }; + pssobj.verify = function(mHash, em, modBits) { + var i; + var emBits = modBits - 1; + var emLen = Math.ceil(emBits / 8); + em = em.substr(-emLen); + if (emLen < hLen + sLen + 2) { + throw new Error("Inconsistent parameters to PSS signature verification."); + } + if (em.charCodeAt(emLen - 1) !== 188) { + throw new Error("Encoded message does not end in 0xBC."); + } + var maskLen = emLen - hLen - 1; + var maskedDB = em.substr(0, maskLen); + var h = em.substr(maskLen, hLen); + var mask = 65280 >> 8 * emLen - emBits & 255; + if ((maskedDB.charCodeAt(0) & mask) !== 0) { + throw new Error("Bits beyond keysize not zero as expected."); + } + var dbMask = mgf.generate(h, maskLen); + var db2 = ""; + for (i = 0; i < maskLen; i++) { + db2 += String.fromCharCode(maskedDB.charCodeAt(i) ^ dbMask.charCodeAt(i)); + } + db2 = String.fromCharCode(db2.charCodeAt(0) & ~mask) + db2.substr(1); + var checkLen = emLen - hLen - sLen - 2; + for (i = 0; i < checkLen; i++) { + if (db2.charCodeAt(i) !== 0) { + throw new Error("Leftmost octets not zero as expected"); + } + } + if (db2.charCodeAt(checkLen) !== 1) { + throw new Error("Inconsistent PSS signature, 0x01 marker not found"); + } + var salt = db2.substr(-sLen); + var m_ = new forge3.util.ByteBuffer(); + m_.fillWithByte(0, 8); + m_.putBytes(mHash); + m_.putBytes(salt); + hash.start(); + hash.update(m_.getBytes()); + var h_ = hash.digest().getBytes(); + return h === h_; + }; + return pssobj; + }; + } +}); + +// node_modules/node-forge/lib/x509.js +var require_x509 = __commonJS({ + "node_modules/node-forge/lib/x509.js"(exports, module) { + var forge3 = require_forge(); + require_aes(); + require_asn1(); + require_des(); + require_md(); + require_mgf(); + require_oids(); + require_pem(); + require_pss(); + require_rsa(); + require_util(); + var asn1 = forge3.asn1; + var pki = module.exports = forge3.pki = forge3.pki || {}; + var oids = pki.oids; + var _shortNames = {}; + _shortNames["CN"] = oids["commonName"]; + _shortNames["commonName"] = "CN"; + _shortNames["C"] = oids["countryName"]; + _shortNames["countryName"] = "C"; + _shortNames["L"] = oids["localityName"]; + _shortNames["localityName"] = "L"; + _shortNames["ST"] = oids["stateOrProvinceName"]; + _shortNames["stateOrProvinceName"] = "ST"; + _shortNames["O"] = oids["organizationName"]; + _shortNames["organizationName"] = "O"; + _shortNames["OU"] = oids["organizationalUnitName"]; + _shortNames["organizationalUnitName"] = "OU"; + _shortNames["E"] = oids["emailAddress"]; + _shortNames["emailAddress"] = "E"; + var publicKeyValidator = forge3.pki.rsa.publicKeyValidator; + var x509CertificateValidator = { + name: "Certificate", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + name: "Certificate.TBSCertificate", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + captureAsn1: "tbsCertificate", + value: [ + { + name: "Certificate.TBSCertificate.version", + tagClass: asn1.Class.CONTEXT_SPECIFIC, + type: 0, + constructed: true, + optional: true, + value: [{ + name: "Certificate.TBSCertificate.version.integer", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.INTEGER, + constructed: false, + capture: "certVersion" + }] + }, + { + name: "Certificate.TBSCertificate.serialNumber", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.INTEGER, + constructed: false, + capture: "certSerialNumber" + }, + { + name: "Certificate.TBSCertificate.signature", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + name: "Certificate.TBSCertificate.signature.algorithm", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.OID, + constructed: false, + capture: "certinfoSignatureOid" + }, { + name: "Certificate.TBSCertificate.signature.parameters", + tagClass: asn1.Class.UNIVERSAL, + optional: true, + captureAsn1: "certinfoSignatureParams" + }] + }, + { + name: "Certificate.TBSCertificate.issuer", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + captureAsn1: "certIssuer" + }, + { + name: "Certificate.TBSCertificate.validity", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + // Note: UTC and generalized times may both appear so the capture + // names are based on their detected order, the names used below + // are only for the common case, which validity time really means + // "notBefore" and which means "notAfter" will be determined by order + value: [{ + // notBefore (Time) (UTC time case) + name: "Certificate.TBSCertificate.validity.notBefore (utc)", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.UTCTIME, + constructed: false, + optional: true, + capture: "certValidity1UTCTime" + }, { + // notBefore (Time) (generalized time case) + name: "Certificate.TBSCertificate.validity.notBefore (generalized)", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.GENERALIZEDTIME, + constructed: false, + optional: true, + capture: "certValidity2GeneralizedTime" + }, { + // notAfter (Time) (only UTC time is supported) + name: "Certificate.TBSCertificate.validity.notAfter (utc)", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.UTCTIME, + constructed: false, + optional: true, + capture: "certValidity3UTCTime" + }, { + // notAfter (Time) (only UTC time is supported) + name: "Certificate.TBSCertificate.validity.notAfter (generalized)", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.GENERALIZEDTIME, + constructed: false, + optional: true, + capture: "certValidity4GeneralizedTime" + }] + }, + { + // Name (subject) (RDNSequence) + name: "Certificate.TBSCertificate.subject", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + captureAsn1: "certSubject" + }, + // SubjectPublicKeyInfo + publicKeyValidator, + { + // issuerUniqueID (optional) + name: "Certificate.TBSCertificate.issuerUniqueID", + tagClass: asn1.Class.CONTEXT_SPECIFIC, + type: 1, + constructed: true, + optional: true, + value: [{ + name: "Certificate.TBSCertificate.issuerUniqueID.id", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.BITSTRING, + constructed: false, + // TODO: support arbitrary bit length ids + captureBitStringValue: "certIssuerUniqueId" + }] + }, + { + // subjectUniqueID (optional) + name: "Certificate.TBSCertificate.subjectUniqueID", + tagClass: asn1.Class.CONTEXT_SPECIFIC, + type: 2, + constructed: true, + optional: true, + value: [{ + name: "Certificate.TBSCertificate.subjectUniqueID.id", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.BITSTRING, + constructed: false, + // TODO: support arbitrary bit length ids + captureBitStringValue: "certSubjectUniqueId" + }] + }, + { + // Extensions (optional) + name: "Certificate.TBSCertificate.extensions", + tagClass: asn1.Class.CONTEXT_SPECIFIC, + type: 3, + constructed: true, + captureAsn1: "certExtensions", + optional: true + } + ] + }, { + // AlgorithmIdentifier (signature algorithm) + name: "Certificate.signatureAlgorithm", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + // algorithm + name: "Certificate.signatureAlgorithm.algorithm", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.OID, + constructed: false, + capture: "certSignatureOid" + }, { + name: "Certificate.TBSCertificate.signature.parameters", + tagClass: asn1.Class.UNIVERSAL, + optional: true, + captureAsn1: "certSignatureParams" + }] + }, { + // SignatureValue + name: "Certificate.signatureValue", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.BITSTRING, + constructed: false, + captureBitStringValue: "certSignature" + }] + }; + var rsassaPssParameterValidator = { + name: "rsapss", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + name: "rsapss.hashAlgorithm", + tagClass: asn1.Class.CONTEXT_SPECIFIC, + type: 0, + constructed: true, + value: [{ + name: "rsapss.hashAlgorithm.AlgorithmIdentifier", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Class.SEQUENCE, + constructed: true, + optional: true, + value: [{ + name: "rsapss.hashAlgorithm.AlgorithmIdentifier.algorithm", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.OID, + constructed: false, + capture: "hashOid" + /* parameter block omitted, for SHA1 NULL anyhow. */ + }] + }] + }, { + name: "rsapss.maskGenAlgorithm", + tagClass: asn1.Class.CONTEXT_SPECIFIC, + type: 1, + constructed: true, + value: [{ + name: "rsapss.maskGenAlgorithm.AlgorithmIdentifier", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Class.SEQUENCE, + constructed: true, + optional: true, + value: [{ + name: "rsapss.maskGenAlgorithm.AlgorithmIdentifier.algorithm", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.OID, + constructed: false, + capture: "maskGenOid" + }, { + name: "rsapss.maskGenAlgorithm.AlgorithmIdentifier.params", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + name: "rsapss.maskGenAlgorithm.AlgorithmIdentifier.params.algorithm", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.OID, + constructed: false, + capture: "maskGenHashOid" + /* parameter block omitted, for SHA1 NULL anyhow. */ + }] + }] + }] + }, { + name: "rsapss.saltLength", + tagClass: asn1.Class.CONTEXT_SPECIFIC, + type: 2, + optional: true, + value: [{ + name: "rsapss.saltLength.saltLength", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Class.INTEGER, + constructed: false, + capture: "saltLength" + }] + }, { + name: "rsapss.trailerField", + tagClass: asn1.Class.CONTEXT_SPECIFIC, + type: 3, + optional: true, + value: [{ + name: "rsapss.trailer.trailer", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Class.INTEGER, + constructed: false, + capture: "trailer" + }] + }] + }; + var certificationRequestInfoValidator = { + name: "CertificationRequestInfo", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + captureAsn1: "certificationRequestInfo", + value: [ + { + name: "CertificationRequestInfo.integer", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.INTEGER, + constructed: false, + capture: "certificationRequestInfoVersion" + }, + { + // Name (subject) (RDNSequence) + name: "CertificationRequestInfo.subject", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + captureAsn1: "certificationRequestInfoSubject" + }, + // SubjectPublicKeyInfo + publicKeyValidator, + { + name: "CertificationRequestInfo.attributes", + tagClass: asn1.Class.CONTEXT_SPECIFIC, + type: 0, + constructed: true, + optional: true, + capture: "certificationRequestInfoAttributes", + value: [{ + name: "CertificationRequestInfo.attributes", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + name: "CertificationRequestInfo.attributes.type", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.OID, + constructed: false + }, { + name: "CertificationRequestInfo.attributes.value", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SET, + constructed: true + }] + }] + } + ] + }; + var certificationRequestValidator = { + name: "CertificationRequest", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + captureAsn1: "csr", + value: [ + certificationRequestInfoValidator, + { + // AlgorithmIdentifier (signature algorithm) + name: "CertificationRequest.signatureAlgorithm", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + // algorithm + name: "CertificationRequest.signatureAlgorithm.algorithm", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.OID, + constructed: false, + capture: "csrSignatureOid" + }, { + name: "CertificationRequest.signatureAlgorithm.parameters", + tagClass: asn1.Class.UNIVERSAL, + optional: true, + captureAsn1: "csrSignatureParams" + }] + }, + { + // signature + name: "CertificationRequest.signature", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.BITSTRING, + constructed: false, + captureBitStringValue: "csrSignature" + } + ] + }; + pki.RDNAttributesAsArray = function(rdn, md) { + var rval = []; + var set, attr, obj; + for (var si = 0; si < rdn.value.length; ++si) { + set = rdn.value[si]; + for (var i = 0; i < set.value.length; ++i) { + obj = {}; + attr = set.value[i]; + obj.type = asn1.derToOid(attr.value[0].value); + obj.value = attr.value[1].value; + obj.valueTagClass = attr.value[1].type; + if (obj.type in oids) { + obj.name = oids[obj.type]; + if (obj.name in _shortNames) { + obj.shortName = _shortNames[obj.name]; + } + } + if (md) { + md.update(obj.type); + md.update(obj.value); + } + rval.push(obj); + } + } + return rval; + }; + pki.CRIAttributesAsArray = function(attributes) { + var rval = []; + for (var si = 0; si < attributes.length; ++si) { + var seq = attributes[si]; + var type = asn1.derToOid(seq.value[0].value); + var values = seq.value[1].value; + for (var vi = 0; vi < values.length; ++vi) { + var obj = {}; + obj.type = type; + obj.value = values[vi].value; + obj.valueTagClass = values[vi].type; + if (obj.type in oids) { + obj.name = oids[obj.type]; + if (obj.name in _shortNames) { + obj.shortName = _shortNames[obj.name]; + } + } + if (obj.type === oids.extensionRequest) { + obj.extensions = []; + for (var ei = 0; ei < obj.value.length; ++ei) { + obj.extensions.push(pki.certificateExtensionFromAsn1(obj.value[ei])); + } + } + rval.push(obj); + } + } + return rval; + }; + function _getAttribute(obj, options) { + if (typeof options === "string") { + options = { shortName: options }; + } + var rval = null; + var attr; + for (var i = 0; rval === null && i < obj.attributes.length; ++i) { + attr = obj.attributes[i]; + if (options.type && options.type === attr.type) { + rval = attr; + } else if (options.name && options.name === attr.name) { + rval = attr; + } else if (options.shortName && options.shortName === attr.shortName) { + rval = attr; + } + } + return rval; + } + var _readSignatureParameters = function(oid, obj, fillDefaults) { + var params = {}; + if (oid !== oids["RSASSA-PSS"]) { + return params; + } + if (fillDefaults) { + params = { + hash: { + algorithmOid: oids["sha1"] + }, + mgf: { + algorithmOid: oids["mgf1"], + hash: { + algorithmOid: oids["sha1"] + } + }, + saltLength: 20 + }; + } + var capture = {}; + var errors = []; + if (!asn1.validate(obj, rsassaPssParameterValidator, capture, errors)) { + var error = new Error("Cannot read RSASSA-PSS parameter block."); + error.errors = errors; + throw error; + } + if (capture.hashOid !== void 0) { + params.hash = params.hash || {}; + params.hash.algorithmOid = asn1.derToOid(capture.hashOid); + } + if (capture.maskGenOid !== void 0) { + params.mgf = params.mgf || {}; + params.mgf.algorithmOid = asn1.derToOid(capture.maskGenOid); + params.mgf.hash = params.mgf.hash || {}; + params.mgf.hash.algorithmOid = asn1.derToOid(capture.maskGenHashOid); + } + if (capture.saltLength !== void 0) { + params.saltLength = capture.saltLength.charCodeAt(0); + } + return params; + }; + var _createSignatureDigest = function(options) { + switch (oids[options.signatureOid]) { + case "sha1WithRSAEncryption": + case "sha1WithRSASignature": + return forge3.md.sha1.create(); + case "md5WithRSAEncryption": + return forge3.md.md5.create(); + case "sha256WithRSAEncryption": + return forge3.md.sha256.create(); + case "sha384WithRSAEncryption": + return forge3.md.sha384.create(); + case "sha512WithRSAEncryption": + return forge3.md.sha512.create(); + case "RSASSA-PSS": + return forge3.md.sha256.create(); + default: + var error = new Error( + "Could not compute " + options.type + " digest. Unknown signature OID." + ); + error.signatureOid = options.signatureOid; + throw error; + } + }; + var _verifySignature = function(options) { + var cert = options.certificate; + var scheme; + switch (cert.signatureOid) { + case oids.sha1WithRSAEncryption: + case oids.sha1WithRSASignature: + break; + case oids["RSASSA-PSS"]: + var hash, mgf; + hash = oids[cert.signatureParameters.mgf.hash.algorithmOid]; + if (hash === void 0 || forge3.md[hash] === void 0) { + var error = new Error("Unsupported MGF hash function."); + error.oid = cert.signatureParameters.mgf.hash.algorithmOid; + error.name = hash; + throw error; + } + mgf = oids[cert.signatureParameters.mgf.algorithmOid]; + if (mgf === void 0 || forge3.mgf[mgf] === void 0) { + var error = new Error("Unsupported MGF function."); + error.oid = cert.signatureParameters.mgf.algorithmOid; + error.name = mgf; + throw error; + } + mgf = forge3.mgf[mgf].create(forge3.md[hash].create()); + hash = oids[cert.signatureParameters.hash.algorithmOid]; + if (hash === void 0 || forge3.md[hash] === void 0) { + var error = new Error("Unsupported RSASSA-PSS hash function."); + error.oid = cert.signatureParameters.hash.algorithmOid; + error.name = hash; + throw error; + } + scheme = forge3.pss.create( + forge3.md[hash].create(), + mgf, + cert.signatureParameters.saltLength + ); + break; + } + return cert.publicKey.verify( + options.md.digest().getBytes(), + options.signature, + scheme + ); + }; + pki.certificateFromPem = function(pem, computeHash, strict) { + var msg = forge3.pem.decode(pem)[0]; + if (msg.type !== "CERTIFICATE" && msg.type !== "X509 CERTIFICATE" && msg.type !== "TRUSTED CERTIFICATE") { + var error = new Error( + 'Could not convert certificate from PEM; PEM header type is not "CERTIFICATE", "X509 CERTIFICATE", or "TRUSTED CERTIFICATE".' + ); + error.headerType = msg.type; + throw error; + } + if (msg.procType && msg.procType.type === "ENCRYPTED") { + throw new Error( + "Could not convert certificate from PEM; PEM is encrypted." + ); + } + var obj = asn1.fromDer(msg.body, strict); + return pki.certificateFromAsn1(obj, computeHash); + }; + pki.certificateToPem = function(cert, maxline) { + var msg = { + type: "CERTIFICATE", + body: asn1.toDer(pki.certificateToAsn1(cert)).getBytes() + }; + return forge3.pem.encode(msg, { maxline }); + }; + pki.publicKeyFromPem = function(pem) { + var msg = forge3.pem.decode(pem)[0]; + if (msg.type !== "PUBLIC KEY" && msg.type !== "RSA PUBLIC KEY") { + var error = new Error('Could not convert public key from PEM; PEM header type is not "PUBLIC KEY" or "RSA PUBLIC KEY".'); + error.headerType = msg.type; + throw error; + } + if (msg.procType && msg.procType.type === "ENCRYPTED") { + throw new Error("Could not convert public key from PEM; PEM is encrypted."); + } + var obj = asn1.fromDer(msg.body); + return pki.publicKeyFromAsn1(obj); + }; + pki.publicKeyToPem = function(key, maxline) { + var msg = { + type: "PUBLIC KEY", + body: asn1.toDer(pki.publicKeyToAsn1(key)).getBytes() + }; + return forge3.pem.encode(msg, { maxline }); + }; + pki.publicKeyToRSAPublicKeyPem = function(key, maxline) { + var msg = { + type: "RSA PUBLIC KEY", + body: asn1.toDer(pki.publicKeyToRSAPublicKey(key)).getBytes() + }; + return forge3.pem.encode(msg, { maxline }); + }; + pki.getPublicKeyFingerprint = function(key, options) { + options = options || {}; + var md = options.md || forge3.md.sha1.create(); + var type = options.type || "RSAPublicKey"; + var bytes; + switch (type) { + case "RSAPublicKey": + bytes = asn1.toDer(pki.publicKeyToRSAPublicKey(key)).getBytes(); + break; + case "SubjectPublicKeyInfo": + bytes = asn1.toDer(pki.publicKeyToAsn1(key)).getBytes(); + break; + default: + throw new Error('Unknown fingerprint type "' + options.type + '".'); + } + md.start(); + md.update(bytes); + var digest = md.digest(); + if (options.encoding === "hex") { + var hex = digest.toHex(); + if (options.delimiter) { + return hex.match(/.{2}/g).join(options.delimiter); + } + return hex; + } else if (options.encoding === "binary") { + return digest.getBytes(); + } else if (options.encoding) { + throw new Error('Unknown encoding "' + options.encoding + '".'); + } + return digest; + }; + pki.certificationRequestFromPem = function(pem, computeHash, strict) { + var msg = forge3.pem.decode(pem)[0]; + if (msg.type !== "CERTIFICATE REQUEST") { + var error = new Error('Could not convert certification request from PEM; PEM header type is not "CERTIFICATE REQUEST".'); + error.headerType = msg.type; + throw error; + } + if (msg.procType && msg.procType.type === "ENCRYPTED") { + throw new Error("Could not convert certification request from PEM; PEM is encrypted."); + } + var obj = asn1.fromDer(msg.body, strict); + return pki.certificationRequestFromAsn1(obj, computeHash); + }; + pki.certificationRequestToPem = function(csr, maxline) { + var msg = { + type: "CERTIFICATE REQUEST", + body: asn1.toDer(pki.certificationRequestToAsn1(csr)).getBytes() + }; + return forge3.pem.encode(msg, { maxline }); + }; + pki.createCertificate = function() { + var cert = {}; + cert.version = 2; + cert.serialNumber = "00"; + cert.signatureOid = null; + cert.signature = null; + cert.siginfo = {}; + cert.siginfo.algorithmOid = null; + cert.validity = {}; + cert.validity.notBefore = /* @__PURE__ */ new Date(); + cert.validity.notAfter = /* @__PURE__ */ new Date(); + cert.issuer = {}; + cert.issuer.getField = function(sn) { + return _getAttribute(cert.issuer, sn); + }; + cert.issuer.addField = function(attr) { + _fillMissingFields([attr]); + cert.issuer.attributes.push(attr); + }; + cert.issuer.attributes = []; + cert.issuer.hash = null; + cert.subject = {}; + cert.subject.getField = function(sn) { + return _getAttribute(cert.subject, sn); + }; + cert.subject.addField = function(attr) { + _fillMissingFields([attr]); + cert.subject.attributes.push(attr); + }; + cert.subject.attributes = []; + cert.subject.hash = null; + cert.extensions = []; + cert.publicKey = null; + cert.md = null; + cert.setSubject = function(attrs, uniqueId) { + _fillMissingFields(attrs); + cert.subject.attributes = attrs; + delete cert.subject.uniqueId; + if (uniqueId) { + cert.subject.uniqueId = uniqueId; + } + cert.subject.hash = null; + }; + cert.setIssuer = function(attrs, uniqueId) { + _fillMissingFields(attrs); + cert.issuer.attributes = attrs; + delete cert.issuer.uniqueId; + if (uniqueId) { + cert.issuer.uniqueId = uniqueId; + } + cert.issuer.hash = null; + }; + cert.setExtensions = function(exts) { + for (var i = 0; i < exts.length; ++i) { + _fillMissingExtensionFields(exts[i], { cert }); + } + cert.extensions = exts; + }; + cert.getExtension = function(options) { + if (typeof options === "string") { + options = { name: options }; + } + var rval = null; + var ext; + for (var i = 0; rval === null && i < cert.extensions.length; ++i) { + ext = cert.extensions[i]; + if (options.id && ext.id === options.id) { + rval = ext; + } else if (options.name && ext.name === options.name) { + rval = ext; + } + } + return rval; + }; + cert.sign = function(key, md) { + cert.md = md || forge3.md.sha1.create(); + var algorithmOid = oids[cert.md.algorithm + "WithRSAEncryption"]; + if (!algorithmOid) { + var error = new Error("Could not compute certificate digest. Unknown message digest algorithm OID."); + error.algorithm = cert.md.algorithm; + throw error; + } + cert.signatureOid = cert.siginfo.algorithmOid = algorithmOid; + cert.tbsCertificate = pki.getTBSCertificate(cert); + var bytes = asn1.toDer(cert.tbsCertificate); + cert.md.update(bytes.getBytes()); + cert.signature = key.sign(cert.md); + }; + cert.verify = function(child) { + var rval = false; + if (!cert.issued(child)) { + var issuer = child.issuer; + var subject = cert.subject; + var error = new Error( + "The parent certificate did not issue the given child certificate; the child certificate's issuer does not match the parent's subject." + ); + error.expectedIssuer = subject.attributes; + error.actualIssuer = issuer.attributes; + throw error; + } + var md = child.md; + if (md === null) { + md = _createSignatureDigest({ + signatureOid: child.signatureOid, + type: "certificate" + }); + var tbsCertificate = child.tbsCertificate || pki.getTBSCertificate(child); + var bytes = asn1.toDer(tbsCertificate); + md.update(bytes.getBytes()); + } + if (md !== null) { + rval = _verifySignature({ + certificate: cert, + md, + signature: child.signature + }); + } + return rval; + }; + cert.isIssuer = function(parent) { + var rval = false; + var i = cert.issuer; + var s = parent.subject; + if (i.hash && s.hash) { + rval = i.hash === s.hash; + } else if (i.attributes.length === s.attributes.length) { + rval = true; + var iattr, sattr; + for (var n = 0; rval && n < i.attributes.length; ++n) { + iattr = i.attributes[n]; + sattr = s.attributes[n]; + if (iattr.type !== sattr.type || iattr.value !== sattr.value) { + rval = false; + } + } + } + return rval; + }; + cert.issued = function(child) { + return child.isIssuer(cert); + }; + cert.generateSubjectKeyIdentifier = function() { + return pki.getPublicKeyFingerprint(cert.publicKey, { type: "RSAPublicKey" }); + }; + cert.verifySubjectKeyIdentifier = function() { + var oid = oids["subjectKeyIdentifier"]; + for (var i = 0; i < cert.extensions.length; ++i) { + var ext = cert.extensions[i]; + if (ext.id === oid) { + var ski = cert.generateSubjectKeyIdentifier().getBytes(); + return forge3.util.hexToBytes(ext.subjectKeyIdentifier) === ski; + } + } + return false; + }; + return cert; + }; + pki.certificateFromAsn1 = function(obj, computeHash) { + var capture = {}; + var errors = []; + if (!asn1.validate(obj, x509CertificateValidator, capture, errors)) { + var error = new Error("Cannot read X.509 certificate. ASN.1 object is not an X509v3 Certificate."); + error.errors = errors; + throw error; + } + var oid = asn1.derToOid(capture.publicKeyOid); + if (oid !== pki.oids.rsaEncryption) { + throw new Error("Cannot read public key. OID is not RSA."); + } + var cert = pki.createCertificate(); + cert.version = capture.certVersion ? capture.certVersion.charCodeAt(0) : 0; + var serial = forge3.util.createBuffer(capture.certSerialNumber); + cert.serialNumber = serial.toHex(); + cert.signatureOid = forge3.asn1.derToOid(capture.certSignatureOid); + cert.signatureParameters = _readSignatureParameters( + cert.signatureOid, + capture.certSignatureParams, + true + ); + cert.siginfo.algorithmOid = forge3.asn1.derToOid(capture.certinfoSignatureOid); + cert.siginfo.parameters = _readSignatureParameters( + cert.siginfo.algorithmOid, + capture.certinfoSignatureParams, + false + ); + cert.signature = capture.certSignature; + var validity = []; + if (capture.certValidity1UTCTime !== void 0) { + validity.push(asn1.utcTimeToDate(capture.certValidity1UTCTime)); + } + if (capture.certValidity2GeneralizedTime !== void 0) { + validity.push(asn1.generalizedTimeToDate( + capture.certValidity2GeneralizedTime + )); + } + if (capture.certValidity3UTCTime !== void 0) { + validity.push(asn1.utcTimeToDate(capture.certValidity3UTCTime)); + } + if (capture.certValidity4GeneralizedTime !== void 0) { + validity.push(asn1.generalizedTimeToDate( + capture.certValidity4GeneralizedTime + )); + } + if (validity.length > 2) { + throw new Error("Cannot read notBefore/notAfter validity times; more than two times were provided in the certificate."); + } + if (validity.length < 2) { + throw new Error("Cannot read notBefore/notAfter validity times; they were not provided as either UTCTime or GeneralizedTime."); + } + cert.validity.notBefore = validity[0]; + cert.validity.notAfter = validity[1]; + cert.tbsCertificate = capture.tbsCertificate; + if (computeHash) { + cert.md = _createSignatureDigest({ + signatureOid: cert.signatureOid, + type: "certificate" + }); + var bytes = asn1.toDer(cert.tbsCertificate); + cert.md.update(bytes.getBytes()); + } + var imd = forge3.md.sha1.create(); + var ibytes = asn1.toDer(capture.certIssuer); + imd.update(ibytes.getBytes()); + cert.issuer.getField = function(sn) { + return _getAttribute(cert.issuer, sn); + }; + cert.issuer.addField = function(attr) { + _fillMissingFields([attr]); + cert.issuer.attributes.push(attr); + }; + cert.issuer.attributes = pki.RDNAttributesAsArray(capture.certIssuer); + if (capture.certIssuerUniqueId) { + cert.issuer.uniqueId = capture.certIssuerUniqueId; + } + cert.issuer.hash = imd.digest().toHex(); + var smd = forge3.md.sha1.create(); + var sbytes = asn1.toDer(capture.certSubject); + smd.update(sbytes.getBytes()); + cert.subject.getField = function(sn) { + return _getAttribute(cert.subject, sn); + }; + cert.subject.addField = function(attr) { + _fillMissingFields([attr]); + cert.subject.attributes.push(attr); + }; + cert.subject.attributes = pki.RDNAttributesAsArray(capture.certSubject); + if (capture.certSubjectUniqueId) { + cert.subject.uniqueId = capture.certSubjectUniqueId; + } + cert.subject.hash = smd.digest().toHex(); + if (capture.certExtensions) { + cert.extensions = pki.certificateExtensionsFromAsn1(capture.certExtensions); + } else { + cert.extensions = []; + } + cert.publicKey = pki.publicKeyFromAsn1(capture.subjectPublicKeyInfo); + return cert; + }; + pki.certificateExtensionsFromAsn1 = function(exts) { + var rval = []; + for (var i = 0; i < exts.value.length; ++i) { + var extseq = exts.value[i]; + for (var ei = 0; ei < extseq.value.length; ++ei) { + rval.push(pki.certificateExtensionFromAsn1(extseq.value[ei])); + } + } + return rval; + }; + pki.certificateExtensionFromAsn1 = function(ext) { + var e = {}; + e.id = asn1.derToOid(ext.value[0].value); + e.critical = false; + if (ext.value[1].type === asn1.Type.BOOLEAN) { + e.critical = ext.value[1].value.charCodeAt(0) !== 0; + e.value = ext.value[2].value; + } else { + e.value = ext.value[1].value; + } + if (e.id in oids) { + e.name = oids[e.id]; + if (e.name === "keyUsage") { + var ev = asn1.fromDer(e.value); + var b2 = 0; + var b3 = 0; + if (ev.value.length > 1) { + b2 = ev.value.charCodeAt(1); + b3 = ev.value.length > 2 ? ev.value.charCodeAt(2) : 0; + } + e.digitalSignature = (b2 & 128) === 128; + e.nonRepudiation = (b2 & 64) === 64; + e.keyEncipherment = (b2 & 32) === 32; + e.dataEncipherment = (b2 & 16) === 16; + e.keyAgreement = (b2 & 8) === 8; + e.keyCertSign = (b2 & 4) === 4; + e.cRLSign = (b2 & 2) === 2; + e.encipherOnly = (b2 & 1) === 1; + e.decipherOnly = (b3 & 128) === 128; + } else if (e.name === "basicConstraints") { + var ev = asn1.fromDer(e.value); + if (ev.value.length > 0 && ev.value[0].type === asn1.Type.BOOLEAN) { + e.cA = ev.value[0].value.charCodeAt(0) !== 0; + } else { + e.cA = false; + } + var value = null; + if (ev.value.length > 0 && ev.value[0].type === asn1.Type.INTEGER) { + value = ev.value[0].value; + } else if (ev.value.length > 1) { + value = ev.value[1].value; + } + if (value !== null) { + e.pathLenConstraint = asn1.derToInteger(value); + } + } else if (e.name === "extKeyUsage") { + var ev = asn1.fromDer(e.value); + for (var vi = 0; vi < ev.value.length; ++vi) { + var oid = asn1.derToOid(ev.value[vi].value); + if (oid in oids) { + e[oids[oid]] = true; + } else { + e[oid] = true; + } + } + } else if (e.name === "nsCertType") { + var ev = asn1.fromDer(e.value); + var b2 = 0; + if (ev.value.length > 1) { + b2 = ev.value.charCodeAt(1); + } + e.client = (b2 & 128) === 128; + e.server = (b2 & 64) === 64; + e.email = (b2 & 32) === 32; + e.objsign = (b2 & 16) === 16; + e.reserved = (b2 & 8) === 8; + e.sslCA = (b2 & 4) === 4; + e.emailCA = (b2 & 2) === 2; + e.objCA = (b2 & 1) === 1; + } else if (e.name === "subjectAltName" || e.name === "issuerAltName") { + e.altNames = []; + var gn; + var ev = asn1.fromDer(e.value); + for (var n = 0; n < ev.value.length; ++n) { + gn = ev.value[n]; + var altName = { + type: gn.type, + value: gn.value + }; + e.altNames.push(altName); + switch (gn.type) { + case 1: + case 2: + case 6: + break; + case 7: + altName.ip = forge3.util.bytesToIP(gn.value); + break; + case 8: + altName.oid = asn1.derToOid(gn.value); + break; + default: + } + } + } else if (e.name === "subjectKeyIdentifier") { + var ev = asn1.fromDer(e.value); + e.subjectKeyIdentifier = forge3.util.bytesToHex(ev.value); + } + } + return e; + }; + pki.certificationRequestFromAsn1 = function(obj, computeHash) { + var capture = {}; + var errors = []; + if (!asn1.validate(obj, certificationRequestValidator, capture, errors)) { + var error = new Error("Cannot read PKCS#10 certificate request. ASN.1 object is not a PKCS#10 CertificationRequest."); + error.errors = errors; + throw error; + } + var oid = asn1.derToOid(capture.publicKeyOid); + if (oid !== pki.oids.rsaEncryption) { + throw new Error("Cannot read public key. OID is not RSA."); + } + var csr = pki.createCertificationRequest(); + csr.version = capture.csrVersion ? capture.csrVersion.charCodeAt(0) : 0; + csr.signatureOid = forge3.asn1.derToOid(capture.csrSignatureOid); + csr.signatureParameters = _readSignatureParameters( + csr.signatureOid, + capture.csrSignatureParams, + true + ); + csr.siginfo.algorithmOid = forge3.asn1.derToOid(capture.csrSignatureOid); + csr.siginfo.parameters = _readSignatureParameters( + csr.siginfo.algorithmOid, + capture.csrSignatureParams, + false + ); + csr.signature = capture.csrSignature; + csr.certificationRequestInfo = capture.certificationRequestInfo; + if (computeHash) { + csr.md = _createSignatureDigest({ + signatureOid: csr.signatureOid, + type: "certification request" + }); + var bytes = asn1.toDer(csr.certificationRequestInfo); + csr.md.update(bytes.getBytes()); + } + var smd = forge3.md.sha1.create(); + csr.subject.getField = function(sn) { + return _getAttribute(csr.subject, sn); + }; + csr.subject.addField = function(attr) { + _fillMissingFields([attr]); + csr.subject.attributes.push(attr); + }; + csr.subject.attributes = pki.RDNAttributesAsArray( + capture.certificationRequestInfoSubject, + smd + ); + csr.subject.hash = smd.digest().toHex(); + csr.publicKey = pki.publicKeyFromAsn1(capture.subjectPublicKeyInfo); + csr.getAttribute = function(sn) { + return _getAttribute(csr, sn); + }; + csr.addAttribute = function(attr) { + _fillMissingFields([attr]); + csr.attributes.push(attr); + }; + csr.attributes = pki.CRIAttributesAsArray( + capture.certificationRequestInfoAttributes || [] + ); + return csr; + }; + pki.createCertificationRequest = function() { + var csr = {}; + csr.version = 0; + csr.signatureOid = null; + csr.signature = null; + csr.siginfo = {}; + csr.siginfo.algorithmOid = null; + csr.subject = {}; + csr.subject.getField = function(sn) { + return _getAttribute(csr.subject, sn); + }; + csr.subject.addField = function(attr) { + _fillMissingFields([attr]); + csr.subject.attributes.push(attr); + }; + csr.subject.attributes = []; + csr.subject.hash = null; + csr.publicKey = null; + csr.attributes = []; + csr.getAttribute = function(sn) { + return _getAttribute(csr, sn); + }; + csr.addAttribute = function(attr) { + _fillMissingFields([attr]); + csr.attributes.push(attr); + }; + csr.md = null; + csr.setSubject = function(attrs) { + _fillMissingFields(attrs); + csr.subject.attributes = attrs; + csr.subject.hash = null; + }; + csr.setAttributes = function(attrs) { + _fillMissingFields(attrs); + csr.attributes = attrs; + }; + csr.sign = function(key, md) { + csr.md = md || forge3.md.sha1.create(); + var algorithmOid = oids[csr.md.algorithm + "WithRSAEncryption"]; + if (!algorithmOid) { + var error = new Error("Could not compute certification request digest. Unknown message digest algorithm OID."); + error.algorithm = csr.md.algorithm; + throw error; + } + csr.signatureOid = csr.siginfo.algorithmOid = algorithmOid; + csr.certificationRequestInfo = pki.getCertificationRequestInfo(csr); + var bytes = asn1.toDer(csr.certificationRequestInfo); + csr.md.update(bytes.getBytes()); + csr.signature = key.sign(csr.md); + }; + csr.verify = function() { + var rval = false; + var md = csr.md; + if (md === null) { + md = _createSignatureDigest({ + signatureOid: csr.signatureOid, + type: "certification request" + }); + var cri = csr.certificationRequestInfo || pki.getCertificationRequestInfo(csr); + var bytes = asn1.toDer(cri); + md.update(bytes.getBytes()); + } + if (md !== null) { + rval = _verifySignature({ + certificate: csr, + md, + signature: csr.signature + }); + } + return rval; + }; + return csr; + }; + function _dnToAsn1(obj) { + var rval = asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.SEQUENCE, + true, + [] + ); + var attr, set; + var attrs = obj.attributes; + for (var i = 0; i < attrs.length; ++i) { + attr = attrs[i]; + var value = attr.value; + var valueTagClass = asn1.Type.PRINTABLESTRING; + if ("valueTagClass" in attr) { + valueTagClass = attr.valueTagClass; + if (valueTagClass === asn1.Type.UTF8) { + value = forge3.util.encodeUtf8(value); + } + } + set = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SET, true, [ + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // AttributeType + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + asn1.oidToDer(attr.type).getBytes() + ), + // AttributeValue + asn1.create(asn1.Class.UNIVERSAL, valueTagClass, false, value) + ]) + ]); + rval.value.push(set); + } + return rval; + } + function _fillMissingFields(attrs) { + var attr; + for (var i = 0; i < attrs.length; ++i) { + attr = attrs[i]; + if (typeof attr.name === "undefined") { + if (attr.type && attr.type in pki.oids) { + attr.name = pki.oids[attr.type]; + } else if (attr.shortName && attr.shortName in _shortNames) { + attr.name = pki.oids[_shortNames[attr.shortName]]; + } + } + if (typeof attr.type === "undefined") { + if (attr.name && attr.name in pki.oids) { + attr.type = pki.oids[attr.name]; + } else { + var error = new Error("Attribute type not specified."); + error.attribute = attr; + throw error; + } + } + if (typeof attr.shortName === "undefined") { + if (attr.name && attr.name in _shortNames) { + attr.shortName = _shortNames[attr.name]; + } + } + if (attr.type === oids.extensionRequest) { + attr.valueConstructed = true; + attr.valueTagClass = asn1.Type.SEQUENCE; + if (!attr.value && attr.extensions) { + attr.value = []; + for (var ei = 0; ei < attr.extensions.length; ++ei) { + attr.value.push(pki.certificateExtensionToAsn1( + _fillMissingExtensionFields(attr.extensions[ei]) + )); + } + } + } + if (typeof attr.value === "undefined") { + var error = new Error("Attribute value not specified."); + error.attribute = attr; + throw error; + } + } + } + function _fillMissingExtensionFields(e, options) { + options = options || {}; + if (typeof e.name === "undefined") { + if (e.id && e.id in pki.oids) { + e.name = pki.oids[e.id]; + } + } + if (typeof e.id === "undefined") { + if (e.name && e.name in pki.oids) { + e.id = pki.oids[e.name]; + } else { + var error = new Error("Extension ID not specified."); + error.extension = e; + throw error; + } + } + if (typeof e.value !== "undefined") { + return e; + } + if (e.name === "keyUsage") { + var unused = 0; + var b2 = 0; + var b3 = 0; + if (e.digitalSignature) { + b2 |= 128; + unused = 7; + } + if (e.nonRepudiation) { + b2 |= 64; + unused = 6; + } + if (e.keyEncipherment) { + b2 |= 32; + unused = 5; + } + if (e.dataEncipherment) { + b2 |= 16; + unused = 4; + } + if (e.keyAgreement) { + b2 |= 8; + unused = 3; + } + if (e.keyCertSign) { + b2 |= 4; + unused = 2; + } + if (e.cRLSign) { + b2 |= 2; + unused = 1; + } + if (e.encipherOnly) { + b2 |= 1; + unused = 0; + } + if (e.decipherOnly) { + b3 |= 128; + unused = 7; + } + var value = String.fromCharCode(unused); + if (b3 !== 0) { + value += String.fromCharCode(b2) + String.fromCharCode(b3); + } else if (b2 !== 0) { + value += String.fromCharCode(b2); + } + e.value = asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.BITSTRING, + false, + value + ); + } else if (e.name === "basicConstraints") { + e.value = asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.SEQUENCE, + true, + [] + ); + if (e.cA) { + e.value.value.push(asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.BOOLEAN, + false, + String.fromCharCode(255) + )); + } + if ("pathLenConstraint" in e) { + e.value.value.push(asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.INTEGER, + false, + asn1.integerToDer(e.pathLenConstraint).getBytes() + )); + } + } else if (e.name === "extKeyUsage") { + e.value = asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.SEQUENCE, + true, + [] + ); + var seq = e.value.value; + for (var key in e) { + if (e[key] !== true) { + continue; + } + if (key in oids) { + seq.push(asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + asn1.oidToDer(oids[key]).getBytes() + )); + } else if (key.indexOf(".") !== -1) { + seq.push(asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + asn1.oidToDer(key).getBytes() + )); + } + } + } else if (e.name === "nsCertType") { + var unused = 0; + var b2 = 0; + if (e.client) { + b2 |= 128; + unused = 7; + } + if (e.server) { + b2 |= 64; + unused = 6; + } + if (e.email) { + b2 |= 32; + unused = 5; + } + if (e.objsign) { + b2 |= 16; + unused = 4; + } + if (e.reserved) { + b2 |= 8; + unused = 3; + } + if (e.sslCA) { + b2 |= 4; + unused = 2; + } + if (e.emailCA) { + b2 |= 2; + unused = 1; + } + if (e.objCA) { + b2 |= 1; + unused = 0; + } + var value = String.fromCharCode(unused); + if (b2 !== 0) { + value += String.fromCharCode(b2); + } + e.value = asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.BITSTRING, + false, + value + ); + } else if (e.name === "subjectAltName" || e.name === "issuerAltName") { + e.value = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, []); + var altName; + for (var n = 0; n < e.altNames.length; ++n) { + altName = e.altNames[n]; + var value = altName.value; + if (altName.type === 7 && altName.ip) { + value = forge3.util.bytesFromIP(altName.ip); + if (value === null) { + var error = new Error( + 'Extension "ip" value is not a valid IPv4 or IPv6 address.' + ); + error.extension = e; + throw error; + } + } else if (altName.type === 8) { + if (altName.oid) { + value = asn1.oidToDer(asn1.oidToDer(altName.oid)); + } else { + value = asn1.oidToDer(value); + } + } + e.value.value.push(asn1.create( + asn1.Class.CONTEXT_SPECIFIC, + altName.type, + false, + value + )); + } + } else if (e.name === "nsComment" && options.cert) { + if (!/^[\x00-\x7F]*$/.test(e.comment) || e.comment.length < 1 || e.comment.length > 128) { + throw new Error('Invalid "nsComment" content.'); + } + e.value = asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.IA5STRING, + false, + e.comment + ); + } else if (e.name === "subjectKeyIdentifier" && options.cert) { + var ski = options.cert.generateSubjectKeyIdentifier(); + e.subjectKeyIdentifier = ski.toHex(); + e.value = asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OCTETSTRING, + false, + ski.getBytes() + ); + } else if (e.name === "authorityKeyIdentifier" && options.cert) { + e.value = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, []); + var seq = e.value.value; + if (e.keyIdentifier) { + var keyIdentifier = e.keyIdentifier === true ? options.cert.generateSubjectKeyIdentifier().getBytes() : e.keyIdentifier; + seq.push( + asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, false, keyIdentifier) + ); + } + if (e.authorityCertIssuer) { + var authorityCertIssuer = [ + asn1.create(asn1.Class.CONTEXT_SPECIFIC, 4, true, [ + _dnToAsn1(e.authorityCertIssuer === true ? options.cert.issuer : e.authorityCertIssuer) + ]) + ]; + seq.push( + asn1.create(asn1.Class.CONTEXT_SPECIFIC, 1, true, authorityCertIssuer) + ); + } + if (e.serialNumber) { + var serialNumber = forge3.util.hexToBytes(e.serialNumber === true ? options.cert.serialNumber : e.serialNumber); + seq.push( + asn1.create(asn1.Class.CONTEXT_SPECIFIC, 2, false, serialNumber) + ); + } + } else if (e.name === "cRLDistributionPoints") { + e.value = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, []); + var seq = e.value.value; + var subSeq = asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.SEQUENCE, + true, + [] + ); + var fullNameGeneralNames = asn1.create( + asn1.Class.CONTEXT_SPECIFIC, + 0, + true, + [] + ); + var altName; + for (var n = 0; n < e.altNames.length; ++n) { + altName = e.altNames[n]; + var value = altName.value; + if (altName.type === 7 && altName.ip) { + value = forge3.util.bytesFromIP(altName.ip); + if (value === null) { + var error = new Error( + 'Extension "ip" value is not a valid IPv4 or IPv6 address.' + ); + error.extension = e; + throw error; + } + } else if (altName.type === 8) { + if (altName.oid) { + value = asn1.oidToDer(asn1.oidToDer(altName.oid)); + } else { + value = asn1.oidToDer(value); + } + } + fullNameGeneralNames.value.push(asn1.create( + asn1.Class.CONTEXT_SPECIFIC, + altName.type, + false, + value + )); + } + subSeq.value.push(asn1.create( + asn1.Class.CONTEXT_SPECIFIC, + 0, + true, + [fullNameGeneralNames] + )); + seq.push(subSeq); + } + if (typeof e.value === "undefined") { + var error = new Error("Extension value not specified."); + error.extension = e; + throw error; + } + return e; + } + function _signatureParametersToAsn1(oid, params) { + switch (oid) { + case oids["RSASSA-PSS"]: + var parts = []; + if (params.hash.algorithmOid !== void 0) { + parts.push(asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, [ + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + asn1.oidToDer(params.hash.algorithmOid).getBytes() + ), + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.NULL, false, "") + ]) + ])); + } + if (params.mgf.algorithmOid !== void 0) { + parts.push(asn1.create(asn1.Class.CONTEXT_SPECIFIC, 1, true, [ + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + asn1.oidToDer(params.mgf.algorithmOid).getBytes() + ), + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + asn1.oidToDer(params.mgf.hash.algorithmOid).getBytes() + ), + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.NULL, false, "") + ]) + ]) + ])); + } + if (params.saltLength !== void 0) { + parts.push(asn1.create(asn1.Class.CONTEXT_SPECIFIC, 2, true, [ + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.INTEGER, + false, + asn1.integerToDer(params.saltLength).getBytes() + ) + ])); + } + return asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, parts); + default: + return asn1.create(asn1.Class.UNIVERSAL, asn1.Type.NULL, false, ""); + } + } + function _CRIAttributesToAsn1(csr) { + var rval = asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, []); + if (csr.attributes.length === 0) { + return rval; + } + var attrs = csr.attributes; + for (var i = 0; i < attrs.length; ++i) { + var attr = attrs[i]; + var value = attr.value; + var valueTagClass = asn1.Type.UTF8; + if ("valueTagClass" in attr) { + valueTagClass = attr.valueTagClass; + } + if (valueTagClass === asn1.Type.UTF8) { + value = forge3.util.encodeUtf8(value); + } + var valueConstructed = false; + if ("valueConstructed" in attr) { + valueConstructed = attr.valueConstructed; + } + var seq = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // AttributeType + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + asn1.oidToDer(attr.type).getBytes() + ), + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SET, true, [ + // AttributeValue + asn1.create( + asn1.Class.UNIVERSAL, + valueTagClass, + valueConstructed, + value + ) + ]) + ]); + rval.value.push(seq); + } + return rval; + } + var jan_1_1950 = /* @__PURE__ */ new Date("1950-01-01T00:00:00Z"); + var jan_1_2050 = /* @__PURE__ */ new Date("2050-01-01T00:00:00Z"); + function _dateToAsn1(date) { + if (date >= jan_1_1950 && date < jan_1_2050) { + return asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.UTCTIME, + false, + asn1.dateToUtcTime(date) + ); + } else { + return asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.GENERALIZEDTIME, + false, + asn1.dateToGeneralizedTime(date) + ); + } + } + pki.getTBSCertificate = function(cert) { + var notBefore = _dateToAsn1(cert.validity.notBefore); + var notAfter = _dateToAsn1(cert.validity.notAfter); + var tbs = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // version + asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, [ + // integer + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.INTEGER, + false, + asn1.integerToDer(cert.version).getBytes() + ) + ]), + // serialNumber + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.INTEGER, + false, + forge3.util.hexToBytes(cert.serialNumber) + ), + // signature + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // algorithm + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + asn1.oidToDer(cert.siginfo.algorithmOid).getBytes() + ), + // parameters + _signatureParametersToAsn1( + cert.siginfo.algorithmOid, + cert.siginfo.parameters + ) + ]), + // issuer + _dnToAsn1(cert.issuer), + // validity + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + notBefore, + notAfter + ]), + // subject + _dnToAsn1(cert.subject), + // SubjectPublicKeyInfo + pki.publicKeyToAsn1(cert.publicKey) + ]); + if (cert.issuer.uniqueId) { + tbs.value.push( + asn1.create(asn1.Class.CONTEXT_SPECIFIC, 1, true, [ + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.BITSTRING, + false, + // TODO: support arbitrary bit length ids + String.fromCharCode(0) + cert.issuer.uniqueId + ) + ]) + ); + } + if (cert.subject.uniqueId) { + tbs.value.push( + asn1.create(asn1.Class.CONTEXT_SPECIFIC, 2, true, [ + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.BITSTRING, + false, + // TODO: support arbitrary bit length ids + String.fromCharCode(0) + cert.subject.uniqueId + ) + ]) + ); + } + if (cert.extensions.length > 0) { + tbs.value.push(pki.certificateExtensionsToAsn1(cert.extensions)); + } + return tbs; + }; + pki.getCertificationRequestInfo = function(csr) { + var cri = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // version + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.INTEGER, + false, + asn1.integerToDer(csr.version).getBytes() + ), + // subject + _dnToAsn1(csr.subject), + // SubjectPublicKeyInfo + pki.publicKeyToAsn1(csr.publicKey), + // attributes + _CRIAttributesToAsn1(csr) + ]); + return cri; + }; + pki.distinguishedNameToAsn1 = function(dn) { + return _dnToAsn1(dn); + }; + pki.certificateToAsn1 = function(cert) { + var tbsCertificate = cert.tbsCertificate || pki.getTBSCertificate(cert); + return asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // TBSCertificate + tbsCertificate, + // AlgorithmIdentifier (signature algorithm) + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // algorithm + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + asn1.oidToDer(cert.signatureOid).getBytes() + ), + // parameters + _signatureParametersToAsn1(cert.signatureOid, cert.signatureParameters) + ]), + // SignatureValue + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.BITSTRING, + false, + String.fromCharCode(0) + cert.signature + ) + ]); + }; + pki.certificateExtensionsToAsn1 = function(exts) { + var rval = asn1.create(asn1.Class.CONTEXT_SPECIFIC, 3, true, []); + var seq = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, []); + rval.value.push(seq); + for (var i = 0; i < exts.length; ++i) { + seq.value.push(pki.certificateExtensionToAsn1(exts[i])); + } + return rval; + }; + pki.certificateExtensionToAsn1 = function(ext) { + var extseq = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, []); + extseq.value.push(asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + asn1.oidToDer(ext.id).getBytes() + )); + if (ext.critical) { + extseq.value.push(asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.BOOLEAN, + false, + String.fromCharCode(255) + )); + } + var value = ext.value; + if (typeof ext.value !== "string") { + value = asn1.toDer(value).getBytes(); + } + extseq.value.push(asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OCTETSTRING, + false, + value + )); + return extseq; + }; + pki.certificationRequestToAsn1 = function(csr) { + var cri = csr.certificationRequestInfo || pki.getCertificationRequestInfo(csr); + return asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // CertificationRequestInfo + cri, + // AlgorithmIdentifier (signature algorithm) + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // algorithm + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + asn1.oidToDer(csr.signatureOid).getBytes() + ), + // parameters + _signatureParametersToAsn1(csr.signatureOid, csr.signatureParameters) + ]), + // signature + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.BITSTRING, + false, + String.fromCharCode(0) + csr.signature + ) + ]); + }; + pki.createCaStore = function(certs) { + var caStore = { + // stored certificates + certs: {} + }; + caStore.getIssuer = function(cert2) { + var rval = getBySubject(cert2.issuer); + return rval; + }; + caStore.addCertificate = function(cert2) { + if (typeof cert2 === "string") { + cert2 = forge3.pki.certificateFromPem(cert2); + } + ensureSubjectHasHash(cert2.subject); + if (!caStore.hasCertificate(cert2)) { + if (cert2.subject.hash in caStore.certs) { + var tmp = caStore.certs[cert2.subject.hash]; + if (!forge3.util.isArray(tmp)) { + tmp = [tmp]; + } + tmp.push(cert2); + caStore.certs[cert2.subject.hash] = tmp; + } else { + caStore.certs[cert2.subject.hash] = cert2; + } + } + }; + caStore.hasCertificate = function(cert2) { + if (typeof cert2 === "string") { + cert2 = forge3.pki.certificateFromPem(cert2); + } + var match = getBySubject(cert2.subject); + if (!match) { + return false; + } + if (!forge3.util.isArray(match)) { + match = [match]; + } + var der1 = asn1.toDer(pki.certificateToAsn1(cert2)).getBytes(); + for (var i2 = 0; i2 < match.length; ++i2) { + var der2 = asn1.toDer(pki.certificateToAsn1(match[i2])).getBytes(); + if (der1 === der2) { + return true; + } + } + return false; + }; + caStore.listAllCertificates = function() { + var certList = []; + for (var hash in caStore.certs) { + if (caStore.certs.hasOwnProperty(hash)) { + var value = caStore.certs[hash]; + if (!forge3.util.isArray(value)) { + certList.push(value); + } else { + for (var i2 = 0; i2 < value.length; ++i2) { + certList.push(value[i2]); + } + } + } + } + return certList; + }; + caStore.removeCertificate = function(cert2) { + var result; + if (typeof cert2 === "string") { + cert2 = forge3.pki.certificateFromPem(cert2); + } + ensureSubjectHasHash(cert2.subject); + if (!caStore.hasCertificate(cert2)) { + return null; + } + var match = getBySubject(cert2.subject); + if (!forge3.util.isArray(match)) { + result = caStore.certs[cert2.subject.hash]; + delete caStore.certs[cert2.subject.hash]; + return result; + } + var der1 = asn1.toDer(pki.certificateToAsn1(cert2)).getBytes(); + for (var i2 = 0; i2 < match.length; ++i2) { + var der2 = asn1.toDer(pki.certificateToAsn1(match[i2])).getBytes(); + if (der1 === der2) { + result = match[i2]; + match.splice(i2, 1); + } + } + if (match.length === 0) { + delete caStore.certs[cert2.subject.hash]; + } + return result; + }; + function getBySubject(subject) { + ensureSubjectHasHash(subject); + return caStore.certs[subject.hash] || null; + } + function ensureSubjectHasHash(subject) { + if (!subject.hash) { + var md = forge3.md.sha1.create(); + subject.attributes = pki.RDNAttributesAsArray(_dnToAsn1(subject), md); + subject.hash = md.digest().toHex(); + } + } + if (certs) { + for (var i = 0; i < certs.length; ++i) { + var cert = certs[i]; + caStore.addCertificate(cert); + } + } + return caStore; + }; + pki.certificateError = { + bad_certificate: "forge.pki.BadCertificate", + unsupported_certificate: "forge.pki.UnsupportedCertificate", + certificate_revoked: "forge.pki.CertificateRevoked", + certificate_expired: "forge.pki.CertificateExpired", + certificate_unknown: "forge.pki.CertificateUnknown", + unknown_ca: "forge.pki.UnknownCertificateAuthority" + }; + pki.verifyCertificateChain = function(caStore, chain, options) { + if (typeof options === "function") { + options = { verify: options }; + } + options = options || {}; + chain = chain.slice(0); + var certs = chain.slice(0); + var validityCheckDate = options.validityCheckDate; + if (typeof validityCheckDate === "undefined") { + validityCheckDate = /* @__PURE__ */ new Date(); + } + var first = true; + var error = null; + var depth = 0; + do { + var cert = chain.shift(); + var parent = null; + var selfSigned = false; + if (validityCheckDate) { + if (validityCheckDate < cert.validity.notBefore || validityCheckDate > cert.validity.notAfter) { + error = { + message: "Certificate is not valid yet or has expired.", + error: pki.certificateError.certificate_expired, + notBefore: cert.validity.notBefore, + notAfter: cert.validity.notAfter, + // TODO: we might want to reconsider renaming 'now' to + // 'validityCheckDate' should this API be changed in the future. + now: validityCheckDate + }; + } + } + if (error === null) { + parent = chain[0] || caStore.getIssuer(cert); + if (parent === null) { + if (cert.isIssuer(cert)) { + selfSigned = true; + parent = cert; + } + } + if (parent) { + var parents = parent; + if (!forge3.util.isArray(parents)) { + parents = [parents]; + } + var verified = false; + while (!verified && parents.length > 0) { + parent = parents.shift(); + try { + verified = parent.verify(cert); + } catch (ex) { + } + } + if (!verified) { + error = { + message: "Certificate signature is invalid.", + error: pki.certificateError.bad_certificate + }; + } + } + if (error === null && (!parent || selfSigned) && !caStore.hasCertificate(cert)) { + error = { + message: "Certificate is not trusted.", + error: pki.certificateError.unknown_ca + }; + } + } + if (error === null && parent && !cert.isIssuer(parent)) { + error = { + message: "Certificate issuer is invalid.", + error: pki.certificateError.bad_certificate + }; + } + if (error === null) { + var se = { + keyUsage: true, + basicConstraints: true + }; + for (var i = 0; error === null && i < cert.extensions.length; ++i) { + var ext = cert.extensions[i]; + if (ext.critical && !(ext.name in se)) { + error = { + message: "Certificate has an unsupported critical extension.", + error: pki.certificateError.unsupported_certificate + }; + } + } + } + if (error === null && (!first || chain.length === 0 && (!parent || selfSigned))) { + var bcExt = cert.getExtension("basicConstraints"); + var keyUsageExt = cert.getExtension("keyUsage"); + if (keyUsageExt !== null) { + if (!keyUsageExt.keyCertSign || bcExt === null) { + error = { + message: "Certificate keyUsage or basicConstraints conflict or indicate that the certificate is not a CA. If the certificate is the only one in the chain or isn't the first then the certificate must be a valid CA.", + error: pki.certificateError.bad_certificate + }; + } + } + if (error === null && bcExt !== null && !bcExt.cA) { + error = { + message: "Certificate basicConstraints indicates the certificate is not a CA.", + error: pki.certificateError.bad_certificate + }; + } + if (error === null && keyUsageExt !== null && "pathLenConstraint" in bcExt) { + var pathLen = depth - 1; + if (pathLen > bcExt.pathLenConstraint) { + error = { + message: "Certificate basicConstraints pathLenConstraint violated.", + error: pki.certificateError.bad_certificate + }; + } + } + } + var vfd = error === null ? true : error.error; + var ret = options.verify ? options.verify(vfd, depth, certs) : vfd; + if (ret === true) { + error = null; + } else { + if (vfd === true) { + error = { + message: "The application rejected the certificate.", + error: pki.certificateError.bad_certificate + }; + } + if (ret || ret === 0) { + if (typeof ret === "object" && !forge3.util.isArray(ret)) { + if (ret.message) { + error.message = ret.message; + } + if (ret.error) { + error.error = ret.error; + } + } else if (typeof ret === "string") { + error.error = ret; + } + } + throw error; + } + first = false; + ++depth; + } while (chain.length > 0); + return true; + }; + } +}); + +// node_modules/node-forge/lib/pkcs12.js +var require_pkcs12 = __commonJS({ + "node_modules/node-forge/lib/pkcs12.js"(exports, module) { + var forge3 = require_forge(); + require_asn1(); + require_hmac(); + require_oids(); + require_pkcs7asn1(); + require_pbe(); + require_random(); + require_rsa(); + require_sha1(); + require_util(); + require_x509(); + var asn1 = forge3.asn1; + var pki = forge3.pki; + var p12 = module.exports = forge3.pkcs12 = forge3.pkcs12 || {}; + var contentInfoValidator = { + name: "ContentInfo", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + // a ContentInfo + constructed: true, + value: [{ + name: "ContentInfo.contentType", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.OID, + constructed: false, + capture: "contentType" + }, { + name: "ContentInfo.content", + tagClass: asn1.Class.CONTEXT_SPECIFIC, + constructed: true, + captureAsn1: "content" + }] + }; + var pfxValidator = { + name: "PFX", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [ + { + name: "PFX.version", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.INTEGER, + constructed: false, + capture: "version" + }, + contentInfoValidator, + { + name: "PFX.macData", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + optional: true, + captureAsn1: "mac", + value: [{ + name: "PFX.macData.mac", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + // DigestInfo + constructed: true, + value: [{ + name: "PFX.macData.mac.digestAlgorithm", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + // DigestAlgorithmIdentifier + constructed: true, + value: [{ + name: "PFX.macData.mac.digestAlgorithm.algorithm", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.OID, + constructed: false, + capture: "macAlgorithm" + }, { + name: "PFX.macData.mac.digestAlgorithm.parameters", + tagClass: asn1.Class.UNIVERSAL, + captureAsn1: "macAlgorithmParameters" + }] + }, { + name: "PFX.macData.mac.digest", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.OCTETSTRING, + constructed: false, + capture: "macDigest" + }] + }, { + name: "PFX.macData.macSalt", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.OCTETSTRING, + constructed: false, + capture: "macSalt" + }, { + name: "PFX.macData.iterations", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.INTEGER, + constructed: false, + optional: true, + capture: "macIterations" + }] + } + ] + }; + var safeBagValidator = { + name: "SafeBag", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + name: "SafeBag.bagId", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.OID, + constructed: false, + capture: "bagId" + }, { + name: "SafeBag.bagValue", + tagClass: asn1.Class.CONTEXT_SPECIFIC, + constructed: true, + captureAsn1: "bagValue" + }, { + name: "SafeBag.bagAttributes", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SET, + constructed: true, + optional: true, + capture: "bagAttributes" + }] + }; + var attributeValidator = { + name: "Attribute", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + name: "Attribute.attrId", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.OID, + constructed: false, + capture: "oid" + }, { + name: "Attribute.attrValues", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SET, + constructed: true, + capture: "values" + }] + }; + var certBagValidator = { + name: "CertBag", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + name: "CertBag.certId", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.OID, + constructed: false, + capture: "certId" + }, { + name: "CertBag.certValue", + tagClass: asn1.Class.CONTEXT_SPECIFIC, + constructed: true, + /* So far we only support X.509 certificates (which are wrapped in + an OCTET STRING, hence hard code that here). */ + value: [{ + name: "CertBag.certValue[0]", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Class.OCTETSTRING, + constructed: false, + capture: "cert" + }] + }] + }; + function _getBagsByAttribute(safeContents, attrName, attrValue, bagType) { + var result = []; + for (var i = 0; i < safeContents.length; i++) { + for (var j = 0; j < safeContents[i].safeBags.length; j++) { + var bag = safeContents[i].safeBags[j]; + if (bagType !== void 0 && bag.type !== bagType) { + continue; + } + if (attrName === null) { + result.push(bag); + continue; + } + if (bag.attributes[attrName] !== void 0 && bag.attributes[attrName].indexOf(attrValue) >= 0) { + result.push(bag); + } + } + } + return result; + } + p12.pkcs12FromAsn1 = function(obj, strict, password) { + if (typeof strict === "string") { + password = strict; + strict = true; + } else if (strict === void 0) { + strict = true; + } + var capture = {}; + var errors = []; + if (!asn1.validate(obj, pfxValidator, capture, errors)) { + var error = new Error("Cannot read PKCS#12 PFX. ASN.1 object is not an PKCS#12 PFX."); + error.errors = error; + throw error; + } + var pfx = { + version: capture.version.charCodeAt(0), + safeContents: [], + /** + * Gets bags with matching attributes. + * + * @param filter the attributes to filter by: + * [localKeyId] the localKeyId to search for. + * [localKeyIdHex] the localKeyId in hex to search for. + * [friendlyName] the friendly name to search for. + * [bagType] bag type to narrow each attribute search by. + * + * @return a map of attribute type to an array of matching bags or, if no + * attribute was given but a bag type, the map key will be the + * bag type. + */ + getBags: function(filter) { + var rval = {}; + var localKeyId; + if ("localKeyId" in filter) { + localKeyId = filter.localKeyId; + } else if ("localKeyIdHex" in filter) { + localKeyId = forge3.util.hexToBytes(filter.localKeyIdHex); + } + if (localKeyId === void 0 && !("friendlyName" in filter) && "bagType" in filter) { + rval[filter.bagType] = _getBagsByAttribute( + pfx.safeContents, + null, + null, + filter.bagType + ); + } + if (localKeyId !== void 0) { + rval.localKeyId = _getBagsByAttribute( + pfx.safeContents, + "localKeyId", + localKeyId, + filter.bagType + ); + } + if ("friendlyName" in filter) { + rval.friendlyName = _getBagsByAttribute( + pfx.safeContents, + "friendlyName", + filter.friendlyName, + filter.bagType + ); + } + return rval; + }, + /** + * DEPRECATED: use getBags() instead. + * + * Get bags with matching friendlyName attribute. + * + * @param friendlyName the friendly name to search for. + * @param [bagType] bag type to narrow search by. + * + * @return an array of bags with matching friendlyName attribute. + */ + getBagsByFriendlyName: function(friendlyName, bagType) { + return _getBagsByAttribute( + pfx.safeContents, + "friendlyName", + friendlyName, + bagType + ); + }, + /** + * DEPRECATED: use getBags() instead. + * + * Get bags with matching localKeyId attribute. + * + * @param localKeyId the localKeyId to search for. + * @param [bagType] bag type to narrow search by. + * + * @return an array of bags with matching localKeyId attribute. + */ + getBagsByLocalKeyId: function(localKeyId, bagType) { + return _getBagsByAttribute( + pfx.safeContents, + "localKeyId", + localKeyId, + bagType + ); + } + }; + if (capture.version.charCodeAt(0) !== 3) { + var error = new Error("PKCS#12 PFX of version other than 3 not supported."); + error.version = capture.version.charCodeAt(0); + throw error; + } + if (asn1.derToOid(capture.contentType) !== pki.oids.data) { + var error = new Error("Only PKCS#12 PFX in password integrity mode supported."); + error.oid = asn1.derToOid(capture.contentType); + throw error; + } + var data = capture.content.value[0]; + if (data.tagClass !== asn1.Class.UNIVERSAL || data.type !== asn1.Type.OCTETSTRING) { + throw new Error("PKCS#12 authSafe content data is not an OCTET STRING."); + } + data = _decodePkcs7Data(data); + if (capture.mac) { + var md = null; + var macKeyBytes = 0; + var macAlgorithm = asn1.derToOid(capture.macAlgorithm); + switch (macAlgorithm) { + case pki.oids.sha1: + md = forge3.md.sha1.create(); + macKeyBytes = 20; + break; + case pki.oids.sha256: + md = forge3.md.sha256.create(); + macKeyBytes = 32; + break; + case pki.oids.sha384: + md = forge3.md.sha384.create(); + macKeyBytes = 48; + break; + case pki.oids.sha512: + md = forge3.md.sha512.create(); + macKeyBytes = 64; + break; + case pki.oids.md5: + md = forge3.md.md5.create(); + macKeyBytes = 16; + break; + } + if (md === null) { + throw new Error("PKCS#12 uses unsupported MAC algorithm: " + macAlgorithm); + } + var macSalt = new forge3.util.ByteBuffer(capture.macSalt); + var macIterations = "macIterations" in capture ? parseInt(forge3.util.bytesToHex(capture.macIterations), 16) : 1; + var macKey = p12.generateKey( + password, + macSalt, + 3, + macIterations, + macKeyBytes, + md + ); + var mac = forge3.hmac.create(); + mac.start(md, macKey); + mac.update(data.value); + var macValue = mac.getMac(); + if (macValue.getBytes() !== capture.macDigest) { + throw new Error("PKCS#12 MAC could not be verified. Invalid password?"); + } + } + _decodeAuthenticatedSafe(pfx, data.value, strict, password); + return pfx; + }; + function _decodePkcs7Data(data) { + if (data.composed || data.constructed) { + var value = forge3.util.createBuffer(); + for (var i = 0; i < data.value.length; ++i) { + value.putBytes(data.value[i].value); + } + data.composed = data.constructed = false; + data.value = value.getBytes(); + } + return data; + } + function _decodeAuthenticatedSafe(pfx, authSafe, strict, password) { + authSafe = asn1.fromDer(authSafe, strict); + if (authSafe.tagClass !== asn1.Class.UNIVERSAL || authSafe.type !== asn1.Type.SEQUENCE || authSafe.constructed !== true) { + throw new Error("PKCS#12 AuthenticatedSafe expected to be a SEQUENCE OF ContentInfo"); + } + for (var i = 0; i < authSafe.value.length; i++) { + var contentInfo = authSafe.value[i]; + var capture = {}; + var errors = []; + if (!asn1.validate(contentInfo, contentInfoValidator, capture, errors)) { + var error = new Error("Cannot read ContentInfo."); + error.errors = errors; + throw error; + } + var obj = { + encrypted: false + }; + var safeContents = null; + var data = capture.content.value[0]; + switch (asn1.derToOid(capture.contentType)) { + case pki.oids.data: + if (data.tagClass !== asn1.Class.UNIVERSAL || data.type !== asn1.Type.OCTETSTRING) { + throw new Error("PKCS#12 SafeContents Data is not an OCTET STRING."); + } + safeContents = _decodePkcs7Data(data).value; + break; + case pki.oids.encryptedData: + safeContents = _decryptSafeContents(data, password); + obj.encrypted = true; + break; + default: + var error = new Error("Unsupported PKCS#12 contentType."); + error.contentType = asn1.derToOid(capture.contentType); + throw error; + } + obj.safeBags = _decodeSafeContents(safeContents, strict, password); + pfx.safeContents.push(obj); + } + } + function _decryptSafeContents(data, password) { + var capture = {}; + var errors = []; + if (!asn1.validate( + data, + forge3.pkcs7.asn1.encryptedDataValidator, + capture, + errors + )) { + var error = new Error("Cannot read EncryptedContentInfo."); + error.errors = errors; + throw error; + } + var oid = asn1.derToOid(capture.contentType); + if (oid !== pki.oids.data) { + var error = new Error( + "PKCS#12 EncryptedContentInfo ContentType is not Data." + ); + error.oid = oid; + throw error; + } + oid = asn1.derToOid(capture.encAlgorithm); + var cipher = pki.pbe.getCipher(oid, capture.encParameter, password); + var encryptedContentAsn1 = _decodePkcs7Data(capture.encryptedContentAsn1); + var encrypted = forge3.util.createBuffer(encryptedContentAsn1.value); + cipher.update(encrypted); + if (!cipher.finish()) { + throw new Error("Failed to decrypt PKCS#12 SafeContents."); + } + return cipher.output.getBytes(); + } + function _decodeSafeContents(safeContents, strict, password) { + if (!strict && safeContents.length === 0) { + return []; + } + safeContents = asn1.fromDer(safeContents, strict); + if (safeContents.tagClass !== asn1.Class.UNIVERSAL || safeContents.type !== asn1.Type.SEQUENCE || safeContents.constructed !== true) { + throw new Error( + "PKCS#12 SafeContents expected to be a SEQUENCE OF SafeBag." + ); + } + var res = []; + for (var i = 0; i < safeContents.value.length; i++) { + var safeBag = safeContents.value[i]; + var capture = {}; + var errors = []; + if (!asn1.validate(safeBag, safeBagValidator, capture, errors)) { + var error = new Error("Cannot read SafeBag."); + error.errors = errors; + throw error; + } + var bag = { + type: asn1.derToOid(capture.bagId), + attributes: _decodeBagAttributes(capture.bagAttributes) + }; + res.push(bag); + var validator, decoder; + var bagAsn1 = capture.bagValue.value[0]; + switch (bag.type) { + case pki.oids.pkcs8ShroudedKeyBag: + bagAsn1 = pki.decryptPrivateKeyInfo(bagAsn1, password); + if (bagAsn1 === null) { + throw new Error( + "Unable to decrypt PKCS#8 ShroudedKeyBag, wrong password?" + ); + } + case pki.oids.keyBag: + try { + bag.key = pki.privateKeyFromAsn1(bagAsn1); + } catch (e) { + bag.key = null; + bag.asn1 = bagAsn1; + } + continue; + case pki.oids.certBag: + validator = certBagValidator; + decoder = function() { + if (asn1.derToOid(capture.certId) !== pki.oids.x509Certificate) { + var error2 = new Error( + "Unsupported certificate type, only X.509 supported." + ); + error2.oid = asn1.derToOid(capture.certId); + throw error2; + } + var certAsn1 = asn1.fromDer(capture.cert, strict); + try { + bag.cert = pki.certificateFromAsn1(certAsn1, true); + } catch (e) { + bag.cert = null; + bag.asn1 = certAsn1; + } + }; + break; + default: + var error = new Error("Unsupported PKCS#12 SafeBag type."); + error.oid = bag.type; + throw error; + } + if (validator !== void 0 && !asn1.validate(bagAsn1, validator, capture, errors)) { + var error = new Error("Cannot read PKCS#12 " + validator.name); + error.errors = errors; + throw error; + } + decoder(); + } + return res; + } + function _decodeBagAttributes(attributes) { + var decodedAttrs = {}; + if (attributes !== void 0) { + for (var i = 0; i < attributes.length; ++i) { + var capture = {}; + var errors = []; + if (!asn1.validate(attributes[i], attributeValidator, capture, errors)) { + var error = new Error("Cannot read PKCS#12 BagAttribute."); + error.errors = errors; + throw error; + } + var oid = asn1.derToOid(capture.oid); + if (pki.oids[oid] === void 0) { + continue; + } + decodedAttrs[pki.oids[oid]] = []; + for (var j = 0; j < capture.values.length; ++j) { + decodedAttrs[pki.oids[oid]].push(capture.values[j].value); + } + } + } + return decodedAttrs; + } + p12.toPkcs12Asn1 = function(key, cert, password, options) { + options = options || {}; + options.saltSize = options.saltSize || 8; + options.count = options.count || 2048; + options.algorithm = options.algorithm || options.encAlgorithm || "aes128"; + if (!("useMac" in options)) { + options.useMac = true; + } + if (!("localKeyId" in options)) { + options.localKeyId = null; + } + if (!("generateLocalKeyId" in options)) { + options.generateLocalKeyId = true; + } + var localKeyId = options.localKeyId; + var bagAttrs; + if (localKeyId !== null) { + localKeyId = forge3.util.hexToBytes(localKeyId); + } else if (options.generateLocalKeyId) { + if (cert) { + var pairedCert = forge3.util.isArray(cert) ? cert[0] : cert; + if (typeof pairedCert === "string") { + pairedCert = pki.certificateFromPem(pairedCert); + } + var sha1 = forge3.md.sha1.create(); + sha1.update(asn1.toDer(pki.certificateToAsn1(pairedCert)).getBytes()); + localKeyId = sha1.digest().getBytes(); + } else { + localKeyId = forge3.random.getBytes(20); + } + } + var attrs = []; + if (localKeyId !== null) { + attrs.push( + // localKeyID + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // attrId + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + asn1.oidToDer(pki.oids.localKeyId).getBytes() + ), + // attrValues + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SET, true, [ + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OCTETSTRING, + false, + localKeyId + ) + ]) + ]) + ); + } + if ("friendlyName" in options) { + attrs.push( + // friendlyName + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // attrId + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + asn1.oidToDer(pki.oids.friendlyName).getBytes() + ), + // attrValues + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SET, true, [ + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.BMPSTRING, + false, + options.friendlyName + ) + ]) + ]) + ); + } + if (attrs.length > 0) { + bagAttrs = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SET, true, attrs); + } + var contents = []; + var chain = []; + if (cert !== null) { + if (forge3.util.isArray(cert)) { + chain = cert; + } else { + chain = [cert]; + } + } + var certSafeBags = []; + for (var i = 0; i < chain.length; ++i) { + cert = chain[i]; + if (typeof cert === "string") { + cert = pki.certificateFromPem(cert); + } + var certBagAttrs = i === 0 ? bagAttrs : void 0; + var certAsn1 = pki.certificateToAsn1(cert); + var certSafeBag = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // bagId + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + asn1.oidToDer(pki.oids.certBag).getBytes() + ), + // bagValue + asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, [ + // CertBag + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // certId + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + asn1.oidToDer(pki.oids.x509Certificate).getBytes() + ), + // certValue (x509Certificate) + asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, [ + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OCTETSTRING, + false, + asn1.toDer(certAsn1).getBytes() + ) + ]) + ]) + ]), + // bagAttributes (OPTIONAL) + certBagAttrs + ]); + certSafeBags.push(certSafeBag); + } + if (certSafeBags.length > 0) { + var certSafeContents = asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.SEQUENCE, + true, + certSafeBags + ); + var certCI = ( + // PKCS#7 ContentInfo + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // contentType + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + // OID for the content type is 'data' + asn1.oidToDer(pki.oids.data).getBytes() + ), + // content + asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, [ + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OCTETSTRING, + false, + asn1.toDer(certSafeContents).getBytes() + ) + ]) + ]) + ); + contents.push(certCI); + } + var keyBag = null; + if (key !== null) { + var pkAsn1 = pki.wrapRsaPrivateKey(pki.privateKeyToAsn1(key)); + if (password === null) { + keyBag = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // bagId + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + asn1.oidToDer(pki.oids.keyBag).getBytes() + ), + // bagValue + asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, [ + // PrivateKeyInfo + pkAsn1 + ]), + // bagAttributes (OPTIONAL) + bagAttrs + ]); + } else { + keyBag = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // bagId + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + asn1.oidToDer(pki.oids.pkcs8ShroudedKeyBag).getBytes() + ), + // bagValue + asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, [ + // EncryptedPrivateKeyInfo + pki.encryptPrivateKeyInfo(pkAsn1, password, options) + ]), + // bagAttributes (OPTIONAL) + bagAttrs + ]); + } + var keySafeContents = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [keyBag]); + var keyCI = ( + // PKCS#7 ContentInfo + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // contentType + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + // OID for the content type is 'data' + asn1.oidToDer(pki.oids.data).getBytes() + ), + // content + asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, [ + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OCTETSTRING, + false, + asn1.toDer(keySafeContents).getBytes() + ) + ]) + ]) + ); + contents.push(keyCI); + } + var safe = asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.SEQUENCE, + true, + contents + ); + var macData; + if (options.useMac) { + var sha1 = forge3.md.sha1.create(); + var macSalt = new forge3.util.ByteBuffer( + forge3.random.getBytes(options.saltSize) + ); + var count = options.count; + var key = p12.generateKey(password, macSalt, 3, count, 20); + var mac = forge3.hmac.create(); + mac.start(sha1, key); + mac.update(asn1.toDer(safe).getBytes()); + var macValue = mac.getMac(); + macData = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // mac DigestInfo + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // digestAlgorithm + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // algorithm = SHA-1 + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + asn1.oidToDer(pki.oids.sha1).getBytes() + ), + // parameters = Null + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.NULL, false, "") + ]), + // digest + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OCTETSTRING, + false, + macValue.getBytes() + ) + ]), + // macSalt OCTET STRING + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OCTETSTRING, + false, + macSalt.getBytes() + ), + // iterations INTEGER (XXX: Only support count < 65536) + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.INTEGER, + false, + asn1.integerToDer(count).getBytes() + ) + ]); + } + return asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // version (3) + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.INTEGER, + false, + asn1.integerToDer(3).getBytes() + ), + // PKCS#7 ContentInfo + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // contentType + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + // OID for the content type is 'data' + asn1.oidToDer(pki.oids.data).getBytes() + ), + // content + asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, [ + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OCTETSTRING, + false, + asn1.toDer(safe).getBytes() + ) + ]) + ]), + macData + ]); + }; + p12.generateKey = forge3.pbe.generatePkcs12Key; + } +}); + +// node_modules/node-forge/lib/pki.js +var require_pki = __commonJS({ + "node_modules/node-forge/lib/pki.js"(exports, module) { + var forge3 = require_forge(); + require_asn1(); + require_oids(); + require_pbe(); + require_pem(); + require_pbkdf2(); + require_pkcs12(); + require_pss(); + require_rsa(); + require_util(); + require_x509(); + var asn1 = forge3.asn1; + var pki = module.exports = forge3.pki = forge3.pki || {}; + pki.pemToDer = function(pem) { + var msg = forge3.pem.decode(pem)[0]; + if (msg.procType && msg.procType.type === "ENCRYPTED") { + throw new Error("Could not convert PEM to DER; PEM is encrypted."); + } + return forge3.util.createBuffer(msg.body); + }; + pki.privateKeyFromPem = function(pem) { + var msg = forge3.pem.decode(pem)[0]; + if (msg.type !== "PRIVATE KEY" && msg.type !== "RSA PRIVATE KEY") { + var error = new Error('Could not convert private key from PEM; PEM header type is not "PRIVATE KEY" or "RSA PRIVATE KEY".'); + error.headerType = msg.type; + throw error; + } + if (msg.procType && msg.procType.type === "ENCRYPTED") { + throw new Error("Could not convert private key from PEM; PEM is encrypted."); + } + var obj = asn1.fromDer(msg.body); + return pki.privateKeyFromAsn1(obj); + }; + pki.privateKeyToPem = function(key, maxline) { + var msg = { + type: "RSA PRIVATE KEY", + body: asn1.toDer(pki.privateKeyToAsn1(key)).getBytes() + }; + return forge3.pem.encode(msg, { maxline }); + }; + pki.privateKeyInfoToPem = function(pki2, maxline) { + var msg = { + type: "PRIVATE KEY", + body: asn1.toDer(pki2).getBytes() + }; + return forge3.pem.encode(msg, { maxline }); + }; + } +}); + +// node_modules/node-forge/lib/tls.js +var require_tls = __commonJS({ + "node_modules/node-forge/lib/tls.js"(exports, module) { + var forge3 = require_forge(); + require_asn1(); + require_hmac(); + require_md5(); + require_pem(); + require_pki(); + require_random(); + require_sha1(); + require_util(); + var prf_TLS1 = function(secret, label, seed, length) { + var rval = forge3.util.createBuffer(); + var idx = secret.length >> 1; + var slen = idx + (secret.length & 1); + var s1 = secret.substr(0, slen); + var s2 = secret.substr(idx, slen); + var ai = forge3.util.createBuffer(); + var hmac = forge3.hmac.create(); + seed = label + seed; + var md5itr = Math.ceil(length / 16); + var sha1itr = Math.ceil(length / 20); + hmac.start("MD5", s1); + var md5bytes = forge3.util.createBuffer(); + ai.putBytes(seed); + for (var i = 0; i < md5itr; ++i) { + hmac.start(null, null); + hmac.update(ai.getBytes()); + ai.putBuffer(hmac.digest()); + hmac.start(null, null); + hmac.update(ai.bytes() + seed); + md5bytes.putBuffer(hmac.digest()); + } + hmac.start("SHA1", s2); + var sha1bytes = forge3.util.createBuffer(); + ai.clear(); + ai.putBytes(seed); + for (var i = 0; i < sha1itr; ++i) { + hmac.start(null, null); + hmac.update(ai.getBytes()); + ai.putBuffer(hmac.digest()); + hmac.start(null, null); + hmac.update(ai.bytes() + seed); + sha1bytes.putBuffer(hmac.digest()); + } + rval.putBytes(forge3.util.xorBytes( + md5bytes.getBytes(), + sha1bytes.getBytes(), + length + )); + return rval; + }; + var hmac_sha1 = function(key2, seqNum, record) { + var hmac = forge3.hmac.create(); + hmac.start("SHA1", key2); + var b = forge3.util.createBuffer(); + b.putInt32(seqNum[0]); + b.putInt32(seqNum[1]); + b.putByte(record.type); + b.putByte(record.version.major); + b.putByte(record.version.minor); + b.putInt16(record.length); + b.putBytes(record.fragment.bytes()); + hmac.update(b.getBytes()); + return hmac.digest().getBytes(); + }; + var deflate = function(c, record, s) { + var rval = false; + try { + var bytes = c.deflate(record.fragment.getBytes()); + record.fragment = forge3.util.createBuffer(bytes); + record.length = bytes.length; + rval = true; + } catch (ex) { + } + return rval; + }; + var inflate = function(c, record, s) { + var rval = false; + try { + var bytes = c.inflate(record.fragment.getBytes()); + record.fragment = forge3.util.createBuffer(bytes); + record.length = bytes.length; + rval = true; + } catch (ex) { + } + return rval; + }; + var readVector = function(b, lenBytes) { + var len = 0; + switch (lenBytes) { + case 1: + len = b.getByte(); + break; + case 2: + len = b.getInt16(); + break; + case 3: + len = b.getInt24(); + break; + case 4: + len = b.getInt32(); + break; + } + return forge3.util.createBuffer(b.getBytes(len)); + }; + var writeVector = function(b, lenBytes, v) { + b.putInt(v.length(), lenBytes << 3); + b.putBuffer(v); + }; + var tls = {}; + tls.Versions = { + TLS_1_0: { major: 3, minor: 1 }, + TLS_1_1: { major: 3, minor: 2 }, + TLS_1_2: { major: 3, minor: 3 } + }; + tls.SupportedVersions = [ + tls.Versions.TLS_1_1, + tls.Versions.TLS_1_0 + ]; + tls.Version = tls.SupportedVersions[0]; + tls.MaxFragment = 16384 - 1024; + tls.ConnectionEnd = { + server: 0, + client: 1 + }; + tls.PRFAlgorithm = { + tls_prf_sha256: 0 + }; + tls.BulkCipherAlgorithm = { + none: null, + rc4: 0, + des3: 1, + aes: 2 + }; + tls.CipherType = { + stream: 0, + block: 1, + aead: 2 + }; + tls.MACAlgorithm = { + none: null, + hmac_md5: 0, + hmac_sha1: 1, + hmac_sha256: 2, + hmac_sha384: 3, + hmac_sha512: 4 + }; + tls.CompressionMethod = { + none: 0, + deflate: 1 + }; + tls.ContentType = { + change_cipher_spec: 20, + alert: 21, + handshake: 22, + application_data: 23, + heartbeat: 24 + }; + tls.HandshakeType = { + hello_request: 0, + client_hello: 1, + server_hello: 2, + certificate: 11, + server_key_exchange: 12, + certificate_request: 13, + server_hello_done: 14, + certificate_verify: 15, + client_key_exchange: 16, + finished: 20 + }; + tls.Alert = {}; + tls.Alert.Level = { + warning: 1, + fatal: 2 + }; + tls.Alert.Description = { + close_notify: 0, + unexpected_message: 10, + bad_record_mac: 20, + decryption_failed: 21, + record_overflow: 22, + decompression_failure: 30, + handshake_failure: 40, + bad_certificate: 42, + unsupported_certificate: 43, + certificate_revoked: 44, + certificate_expired: 45, + certificate_unknown: 46, + illegal_parameter: 47, + unknown_ca: 48, + access_denied: 49, + decode_error: 50, + decrypt_error: 51, + export_restriction: 60, + protocol_version: 70, + insufficient_security: 71, + internal_error: 80, + user_canceled: 90, + no_renegotiation: 100 + }; + tls.HeartbeatMessageType = { + heartbeat_request: 1, + heartbeat_response: 2 + }; + tls.CipherSuites = {}; + tls.getCipherSuite = function(twoBytes) { + var rval = null; + for (var key2 in tls.CipherSuites) { + var cs = tls.CipherSuites[key2]; + if (cs.id[0] === twoBytes.charCodeAt(0) && cs.id[1] === twoBytes.charCodeAt(1)) { + rval = cs; + break; + } + } + return rval; + }; + tls.handleUnexpected = function(c, record) { + var ignore = !c.open && c.entity === tls.ConnectionEnd.client; + if (!ignore) { + c.error(c, { + message: "Unexpected message. Received TLS record out of order.", + send: true, + alert: { + level: tls.Alert.Level.fatal, + description: tls.Alert.Description.unexpected_message + } + }); + } + }; + tls.handleHelloRequest = function(c, record, length) { + if (!c.handshaking && c.handshakes > 0) { + tls.queue(c, tls.createAlert(c, { + level: tls.Alert.Level.warning, + description: tls.Alert.Description.no_renegotiation + })); + tls.flush(c); + } + c.process(); + }; + tls.parseHelloMessage = function(c, record, length) { + var msg = null; + var client = c.entity === tls.ConnectionEnd.client; + if (length < 38) { + c.error(c, { + message: client ? "Invalid ServerHello message. Message too short." : "Invalid ClientHello message. Message too short.", + send: true, + alert: { + level: tls.Alert.Level.fatal, + description: tls.Alert.Description.illegal_parameter + } + }); + } else { + var b = record.fragment; + var remaining = b.length(); + msg = { + version: { + major: b.getByte(), + minor: b.getByte() + }, + random: forge3.util.createBuffer(b.getBytes(32)), + session_id: readVector(b, 1), + extensions: [] + }; + if (client) { + msg.cipher_suite = b.getBytes(2); + msg.compression_method = b.getByte(); + } else { + msg.cipher_suites = readVector(b, 2); + msg.compression_methods = readVector(b, 1); + } + remaining = length - (remaining - b.length()); + if (remaining > 0) { + var exts = readVector(b, 2); + while (exts.length() > 0) { + msg.extensions.push({ + type: [exts.getByte(), exts.getByte()], + data: readVector(exts, 2) + }); + } + if (!client) { + for (var i = 0; i < msg.extensions.length; ++i) { + var ext = msg.extensions[i]; + if (ext.type[0] === 0 && ext.type[1] === 0) { + var snl = readVector(ext.data, 2); + while (snl.length() > 0) { + var snType = snl.getByte(); + if (snType !== 0) { + break; + } + c.session.extensions.server_name.serverNameList.push( + readVector(snl, 2).getBytes() + ); + } + } + } + } + } + if (c.session.version) { + if (msg.version.major !== c.session.version.major || msg.version.minor !== c.session.version.minor) { + return c.error(c, { + message: "TLS version change is disallowed during renegotiation.", + send: true, + alert: { + level: tls.Alert.Level.fatal, + description: tls.Alert.Description.protocol_version + } + }); + } + } + if (client) { + c.session.cipherSuite = tls.getCipherSuite(msg.cipher_suite); + } else { + var tmp = forge3.util.createBuffer(msg.cipher_suites.bytes()); + while (tmp.length() > 0) { + c.session.cipherSuite = tls.getCipherSuite(tmp.getBytes(2)); + if (c.session.cipherSuite !== null) { + break; + } + } + } + if (c.session.cipherSuite === null) { + return c.error(c, { + message: "No cipher suites in common.", + send: true, + alert: { + level: tls.Alert.Level.fatal, + description: tls.Alert.Description.handshake_failure + }, + cipherSuite: forge3.util.bytesToHex(msg.cipher_suite) + }); + } + if (client) { + c.session.compressionMethod = msg.compression_method; + } else { + c.session.compressionMethod = tls.CompressionMethod.none; + } + } + return msg; + }; + tls.createSecurityParameters = function(c, msg) { + var client = c.entity === tls.ConnectionEnd.client; + var msgRandom = msg.random.bytes(); + var cRandom = client ? c.session.sp.client_random : msgRandom; + var sRandom = client ? msgRandom : tls.createRandom().getBytes(); + c.session.sp = { + entity: c.entity, + prf_algorithm: tls.PRFAlgorithm.tls_prf_sha256, + bulk_cipher_algorithm: null, + cipher_type: null, + enc_key_length: null, + block_length: null, + fixed_iv_length: null, + record_iv_length: null, + mac_algorithm: null, + mac_length: null, + mac_key_length: null, + compression_algorithm: c.session.compressionMethod, + pre_master_secret: null, + master_secret: null, + client_random: cRandom, + server_random: sRandom + }; + }; + tls.handleServerHello = function(c, record, length) { + var msg = tls.parseHelloMessage(c, record, length); + if (c.fail) { + return; + } + if (msg.version.minor <= c.version.minor) { + c.version.minor = msg.version.minor; + } else { + return c.error(c, { + message: "Incompatible TLS version.", + send: true, + alert: { + level: tls.Alert.Level.fatal, + description: tls.Alert.Description.protocol_version + } + }); + } + c.session.version = c.version; + var sessionId = msg.session_id.bytes(); + if (sessionId.length > 0 && sessionId === c.session.id) { + c.expect = SCC; + c.session.resuming = true; + c.session.sp.server_random = msg.random.bytes(); + } else { + c.expect = SCE; + c.session.resuming = false; + tls.createSecurityParameters(c, msg); + } + c.session.id = sessionId; + c.process(); + }; + tls.handleClientHello = function(c, record, length) { + var msg = tls.parseHelloMessage(c, record, length); + if (c.fail) { + return; + } + var sessionId = msg.session_id.bytes(); + var session = null; + if (c.sessionCache) { + session = c.sessionCache.getSession(sessionId); + if (session === null) { + sessionId = ""; + } else if (session.version.major !== msg.version.major || session.version.minor > msg.version.minor) { + session = null; + sessionId = ""; + } + } + if (sessionId.length === 0) { + sessionId = forge3.random.getBytes(32); + } + c.session.id = sessionId; + c.session.clientHelloVersion = msg.version; + c.session.sp = {}; + if (session) { + c.version = c.session.version = session.version; + c.session.sp = session.sp; + } else { + var version; + for (var i = 1; i < tls.SupportedVersions.length; ++i) { + version = tls.SupportedVersions[i]; + if (version.minor <= msg.version.minor) { + break; + } + } + c.version = { major: version.major, minor: version.minor }; + c.session.version = c.version; + } + if (session !== null) { + c.expect = CCC; + c.session.resuming = true; + c.session.sp.client_random = msg.random.bytes(); + } else { + c.expect = c.verifyClient !== false ? CCE : CKE; + c.session.resuming = false; + tls.createSecurityParameters(c, msg); + } + c.open = true; + tls.queue(c, tls.createRecord(c, { + type: tls.ContentType.handshake, + data: tls.createServerHello(c) + })); + if (c.session.resuming) { + tls.queue(c, tls.createRecord(c, { + type: tls.ContentType.change_cipher_spec, + data: tls.createChangeCipherSpec() + })); + c.state.pending = tls.createConnectionState(c); + c.state.current.write = c.state.pending.write; + tls.queue(c, tls.createRecord(c, { + type: tls.ContentType.handshake, + data: tls.createFinished(c) + })); + } else { + tls.queue(c, tls.createRecord(c, { + type: tls.ContentType.handshake, + data: tls.createCertificate(c) + })); + if (!c.fail) { + tls.queue(c, tls.createRecord(c, { + type: tls.ContentType.handshake, + data: tls.createServerKeyExchange(c) + })); + if (c.verifyClient !== false) { + tls.queue(c, tls.createRecord(c, { + type: tls.ContentType.handshake, + data: tls.createCertificateRequest(c) + })); + } + tls.queue(c, tls.createRecord(c, { + type: tls.ContentType.handshake, + data: tls.createServerHelloDone(c) + })); + } + } + tls.flush(c); + c.process(); + }; + tls.handleCertificate = function(c, record, length) { + if (length < 3) { + return c.error(c, { + message: "Invalid Certificate message. Message too short.", + send: true, + alert: { + level: tls.Alert.Level.fatal, + description: tls.Alert.Description.illegal_parameter + } + }); + } + var b = record.fragment; + var msg = { + certificate_list: readVector(b, 3) + }; + var cert, asn1; + var certs = []; + try { + while (msg.certificate_list.length() > 0) { + cert = readVector(msg.certificate_list, 3); + asn1 = forge3.asn1.fromDer(cert); + cert = forge3.pki.certificateFromAsn1(asn1, true); + certs.push(cert); + } + } catch (ex) { + return c.error(c, { + message: "Could not parse certificate list.", + cause: ex, + send: true, + alert: { + level: tls.Alert.Level.fatal, + description: tls.Alert.Description.bad_certificate + } + }); + } + var client = c.entity === tls.ConnectionEnd.client; + if ((client || c.verifyClient === true) && certs.length === 0) { + c.error(c, { + message: client ? "No server certificate provided." : "No client certificate provided.", + send: true, + alert: { + level: tls.Alert.Level.fatal, + description: tls.Alert.Description.illegal_parameter + } + }); + } else if (certs.length === 0) { + c.expect = client ? SKE : CKE; + } else { + if (client) { + c.session.serverCertificate = certs[0]; + } else { + c.session.clientCertificate = certs[0]; + } + if (tls.verifyCertificateChain(c, certs)) { + c.expect = client ? SKE : CKE; + } + } + c.process(); + }; + tls.handleServerKeyExchange = function(c, record, length) { + if (length > 0) { + return c.error(c, { + message: "Invalid key parameters. Only RSA is supported.", + send: true, + alert: { + level: tls.Alert.Level.fatal, + description: tls.Alert.Description.unsupported_certificate + } + }); + } + c.expect = SCR; + c.process(); + }; + tls.handleClientKeyExchange = function(c, record, length) { + if (length < 48) { + return c.error(c, { + message: "Invalid key parameters. Only RSA is supported.", + send: true, + alert: { + level: tls.Alert.Level.fatal, + description: tls.Alert.Description.unsupported_certificate + } + }); + } + var b = record.fragment; + var msg = { + enc_pre_master_secret: readVector(b, 2).getBytes() + }; + var privateKey = null; + if (c.getPrivateKey) { + try { + privateKey = c.getPrivateKey(c, c.session.serverCertificate); + privateKey = forge3.pki.privateKeyFromPem(privateKey); + } catch (ex) { + c.error(c, { + message: "Could not get private key.", + cause: ex, + send: true, + alert: { + level: tls.Alert.Level.fatal, + description: tls.Alert.Description.internal_error + } + }); + } + } + if (privateKey === null) { + return c.error(c, { + message: "No private key set.", + send: true, + alert: { + level: tls.Alert.Level.fatal, + description: tls.Alert.Description.internal_error + } + }); + } + try { + var sp = c.session.sp; + sp.pre_master_secret = privateKey.decrypt(msg.enc_pre_master_secret); + var version = c.session.clientHelloVersion; + if (version.major !== sp.pre_master_secret.charCodeAt(0) || version.minor !== sp.pre_master_secret.charCodeAt(1)) { + throw new Error("TLS version rollback attack detected."); + } + } catch (ex) { + sp.pre_master_secret = forge3.random.getBytes(48); + } + c.expect = CCC; + if (c.session.clientCertificate !== null) { + c.expect = CCV; + } + c.process(); + }; + tls.handleCertificateRequest = function(c, record, length) { + if (length < 3) { + return c.error(c, { + message: "Invalid CertificateRequest. Message too short.", + send: true, + alert: { + level: tls.Alert.Level.fatal, + description: tls.Alert.Description.illegal_parameter + } + }); + } + var b = record.fragment; + var msg = { + certificate_types: readVector(b, 1), + certificate_authorities: readVector(b, 2) + }; + c.session.certificateRequest = msg; + c.expect = SHD; + c.process(); + }; + tls.handleCertificateVerify = function(c, record, length) { + if (length < 2) { + return c.error(c, { + message: "Invalid CertificateVerify. Message too short.", + send: true, + alert: { + level: tls.Alert.Level.fatal, + description: tls.Alert.Description.illegal_parameter + } + }); + } + var b = record.fragment; + b.read -= 4; + var msgBytes = b.bytes(); + b.read += 4; + var msg = { + signature: readVector(b, 2).getBytes() + }; + var verify = forge3.util.createBuffer(); + verify.putBuffer(c.session.md5.digest()); + verify.putBuffer(c.session.sha1.digest()); + verify = verify.getBytes(); + try { + var cert = c.session.clientCertificate; + if (!cert.publicKey.verify(verify, msg.signature, "NONE")) { + throw new Error("CertificateVerify signature does not match."); + } + c.session.md5.update(msgBytes); + c.session.sha1.update(msgBytes); + } catch (ex) { + return c.error(c, { + message: "Bad signature in CertificateVerify.", + send: true, + alert: { + level: tls.Alert.Level.fatal, + description: tls.Alert.Description.handshake_failure + } + }); + } + c.expect = CCC; + c.process(); + }; + tls.handleServerHelloDone = function(c, record, length) { + if (length > 0) { + return c.error(c, { + message: "Invalid ServerHelloDone message. Invalid length.", + send: true, + alert: { + level: tls.Alert.Level.fatal, + description: tls.Alert.Description.record_overflow + } + }); + } + if (c.serverCertificate === null) { + var error = { + message: "No server certificate provided. Not enough security.", + send: true, + alert: { + level: tls.Alert.Level.fatal, + description: tls.Alert.Description.insufficient_security + } + }; + var depth = 0; + var ret = c.verify(c, error.alert.description, depth, []); + if (ret !== true) { + if (ret || ret === 0) { + if (typeof ret === "object" && !forge3.util.isArray(ret)) { + if (ret.message) { + error.message = ret.message; + } + if (ret.alert) { + error.alert.description = ret.alert; + } + } else if (typeof ret === "number") { + error.alert.description = ret; + } + } + return c.error(c, error); + } + } + if (c.session.certificateRequest !== null) { + record = tls.createRecord(c, { + type: tls.ContentType.handshake, + data: tls.createCertificate(c) + }); + tls.queue(c, record); + } + record = tls.createRecord(c, { + type: tls.ContentType.handshake, + data: tls.createClientKeyExchange(c) + }); + tls.queue(c, record); + c.expect = SER; + var callback = function(c2, signature) { + if (c2.session.certificateRequest !== null && c2.session.clientCertificate !== null) { + tls.queue(c2, tls.createRecord(c2, { + type: tls.ContentType.handshake, + data: tls.createCertificateVerify(c2, signature) + })); + } + tls.queue(c2, tls.createRecord(c2, { + type: tls.ContentType.change_cipher_spec, + data: tls.createChangeCipherSpec() + })); + c2.state.pending = tls.createConnectionState(c2); + c2.state.current.write = c2.state.pending.write; + tls.queue(c2, tls.createRecord(c2, { + type: tls.ContentType.handshake, + data: tls.createFinished(c2) + })); + c2.expect = SCC; + tls.flush(c2); + c2.process(); + }; + if (c.session.certificateRequest === null || c.session.clientCertificate === null) { + return callback(c, null); + } + tls.getClientSignature(c, callback); + }; + tls.handleChangeCipherSpec = function(c, record) { + if (record.fragment.getByte() !== 1) { + return c.error(c, { + message: "Invalid ChangeCipherSpec message received.", + send: true, + alert: { + level: tls.Alert.Level.fatal, + description: tls.Alert.Description.illegal_parameter + } + }); + } + var client = c.entity === tls.ConnectionEnd.client; + if (c.session.resuming && client || !c.session.resuming && !client) { + c.state.pending = tls.createConnectionState(c); + } + c.state.current.read = c.state.pending.read; + if (!c.session.resuming && client || c.session.resuming && !client) { + c.state.pending = null; + } + c.expect = client ? SFI : CFI; + c.process(); + }; + tls.handleFinished = function(c, record, length) { + var b = record.fragment; + b.read -= 4; + var msgBytes = b.bytes(); + b.read += 4; + var vd = record.fragment.getBytes(); + b = forge3.util.createBuffer(); + b.putBuffer(c.session.md5.digest()); + b.putBuffer(c.session.sha1.digest()); + var client = c.entity === tls.ConnectionEnd.client; + var label = client ? "server finished" : "client finished"; + var sp = c.session.sp; + var vdl = 12; + var prf = prf_TLS1; + b = prf(sp.master_secret, label, b.getBytes(), vdl); + if (b.getBytes() !== vd) { + return c.error(c, { + message: "Invalid verify_data in Finished message.", + send: true, + alert: { + level: tls.Alert.Level.fatal, + description: tls.Alert.Description.decrypt_error + } + }); + } + c.session.md5.update(msgBytes); + c.session.sha1.update(msgBytes); + if (c.session.resuming && client || !c.session.resuming && !client) { + tls.queue(c, tls.createRecord(c, { + type: tls.ContentType.change_cipher_spec, + data: tls.createChangeCipherSpec() + })); + c.state.current.write = c.state.pending.write; + c.state.pending = null; + tls.queue(c, tls.createRecord(c, { + type: tls.ContentType.handshake, + data: tls.createFinished(c) + })); + } + c.expect = client ? SAD : CAD; + c.handshaking = false; + ++c.handshakes; + c.peerCertificate = client ? c.session.serverCertificate : c.session.clientCertificate; + tls.flush(c); + c.isConnected = true; + c.connected(c); + c.process(); + }; + tls.handleAlert = function(c, record) { + var b = record.fragment; + var alert = { + level: b.getByte(), + description: b.getByte() + }; + var msg; + switch (alert.description) { + case tls.Alert.Description.close_notify: + msg = "Connection closed."; + break; + case tls.Alert.Description.unexpected_message: + msg = "Unexpected message."; + break; + case tls.Alert.Description.bad_record_mac: + msg = "Bad record MAC."; + break; + case tls.Alert.Description.decryption_failed: + msg = "Decryption failed."; + break; + case tls.Alert.Description.record_overflow: + msg = "Record overflow."; + break; + case tls.Alert.Description.decompression_failure: + msg = "Decompression failed."; + break; + case tls.Alert.Description.handshake_failure: + msg = "Handshake failure."; + break; + case tls.Alert.Description.bad_certificate: + msg = "Bad certificate."; + break; + case tls.Alert.Description.unsupported_certificate: + msg = "Unsupported certificate."; + break; + case tls.Alert.Description.certificate_revoked: + msg = "Certificate revoked."; + break; + case tls.Alert.Description.certificate_expired: + msg = "Certificate expired."; + break; + case tls.Alert.Description.certificate_unknown: + msg = "Certificate unknown."; + break; + case tls.Alert.Description.illegal_parameter: + msg = "Illegal parameter."; + break; + case tls.Alert.Description.unknown_ca: + msg = "Unknown certificate authority."; + break; + case tls.Alert.Description.access_denied: + msg = "Access denied."; + break; + case tls.Alert.Description.decode_error: + msg = "Decode error."; + break; + case tls.Alert.Description.decrypt_error: + msg = "Decrypt error."; + break; + case tls.Alert.Description.export_restriction: + msg = "Export restriction."; + break; + case tls.Alert.Description.protocol_version: + msg = "Unsupported protocol version."; + break; + case tls.Alert.Description.insufficient_security: + msg = "Insufficient security."; + break; + case tls.Alert.Description.internal_error: + msg = "Internal error."; + break; + case tls.Alert.Description.user_canceled: + msg = "User canceled."; + break; + case tls.Alert.Description.no_renegotiation: + msg = "Renegotiation not supported."; + break; + default: + msg = "Unknown error."; + break; + } + if (alert.description === tls.Alert.Description.close_notify) { + return c.close(); + } + c.error(c, { + message: msg, + send: false, + // origin is the opposite end + origin: c.entity === tls.ConnectionEnd.client ? "server" : "client", + alert + }); + c.process(); + }; + tls.handleHandshake = function(c, record) { + var b = record.fragment; + var type = b.getByte(); + var length = b.getInt24(); + if (length > b.length()) { + c.fragmented = record; + record.fragment = forge3.util.createBuffer(); + b.read -= 4; + return c.process(); + } + c.fragmented = null; + b.read -= 4; + var bytes = b.bytes(length + 4); + b.read += 4; + if (type in hsTable[c.entity][c.expect]) { + if (c.entity === tls.ConnectionEnd.server && !c.open && !c.fail) { + c.handshaking = true; + c.session = { + version: null, + extensions: { + server_name: { + serverNameList: [] + } + }, + cipherSuite: null, + compressionMethod: null, + serverCertificate: null, + clientCertificate: null, + md5: forge3.md.md5.create(), + sha1: forge3.md.sha1.create() + }; + } + if (type !== tls.HandshakeType.hello_request && type !== tls.HandshakeType.certificate_verify && type !== tls.HandshakeType.finished) { + c.session.md5.update(bytes); + c.session.sha1.update(bytes); + } + hsTable[c.entity][c.expect][type](c, record, length); + } else { + tls.handleUnexpected(c, record); + } + }; + tls.handleApplicationData = function(c, record) { + c.data.putBuffer(record.fragment); + c.dataReady(c); + c.process(); + }; + tls.handleHeartbeat = function(c, record) { + var b = record.fragment; + var type = b.getByte(); + var length = b.getInt16(); + var payload = b.getBytes(length); + if (type === tls.HeartbeatMessageType.heartbeat_request) { + if (c.handshaking || length > payload.length) { + return c.process(); + } + tls.queue(c, tls.createRecord(c, { + type: tls.ContentType.heartbeat, + data: tls.createHeartbeat( + tls.HeartbeatMessageType.heartbeat_response, + payload + ) + })); + tls.flush(c); + } else if (type === tls.HeartbeatMessageType.heartbeat_response) { + if (payload !== c.expectedHeartbeatPayload) { + return c.process(); + } + if (c.heartbeatReceived) { + c.heartbeatReceived(c, forge3.util.createBuffer(payload)); + } + } + c.process(); + }; + var SHE = 0; + var SCE = 1; + var SKE = 2; + var SCR = 3; + var SHD = 4; + var SCC = 5; + var SFI = 6; + var SAD = 7; + var SER = 8; + var CHE = 0; + var CCE = 1; + var CKE = 2; + var CCV = 3; + var CCC = 4; + var CFI = 5; + var CAD = 6; + var __ = tls.handleUnexpected; + var R0 = tls.handleChangeCipherSpec; + var R1 = tls.handleAlert; + var R2 = tls.handleHandshake; + var R3 = tls.handleApplicationData; + var R4 = tls.handleHeartbeat; + var ctTable = []; + ctTable[tls.ConnectionEnd.client] = [ + // CC,AL,HS,AD,HB + /*SHE*/ + [__, R1, R2, __, R4], + /*SCE*/ + [__, R1, R2, __, R4], + /*SKE*/ + [__, R1, R2, __, R4], + /*SCR*/ + [__, R1, R2, __, R4], + /*SHD*/ + [__, R1, R2, __, R4], + /*SCC*/ + [R0, R1, __, __, R4], + /*SFI*/ + [__, R1, R2, __, R4], + /*SAD*/ + [__, R1, R2, R3, R4], + /*SER*/ + [__, R1, R2, __, R4] + ]; + ctTable[tls.ConnectionEnd.server] = [ + // CC,AL,HS,AD + /*CHE*/ + [__, R1, R2, __, R4], + /*CCE*/ + [__, R1, R2, __, R4], + /*CKE*/ + [__, R1, R2, __, R4], + /*CCV*/ + [__, R1, R2, __, R4], + /*CCC*/ + [R0, R1, __, __, R4], + /*CFI*/ + [__, R1, R2, __, R4], + /*CAD*/ + [__, R1, R2, R3, R4], + /*CER*/ + [__, R1, R2, __, R4] + ]; + var H0 = tls.handleHelloRequest; + var H1 = tls.handleServerHello; + var H2 = tls.handleCertificate; + var H3 = tls.handleServerKeyExchange; + var H4 = tls.handleCertificateRequest; + var H5 = tls.handleServerHelloDone; + var H6 = tls.handleFinished; + var hsTable = []; + hsTable[tls.ConnectionEnd.client] = [ + // HR,01,SH,03,04,05,06,07,08,09,10,SC,SK,CR,HD,15,CK,17,18,19,FI + /*SHE*/ + [__, __, H1, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __], + /*SCE*/ + [H0, __, __, __, __, __, __, __, __, __, __, H2, H3, H4, H5, __, __, __, __, __, __], + /*SKE*/ + [H0, __, __, __, __, __, __, __, __, __, __, __, H3, H4, H5, __, __, __, __, __, __], + /*SCR*/ + [H0, __, __, __, __, __, __, __, __, __, __, __, __, H4, H5, __, __, __, __, __, __], + /*SHD*/ + [H0, __, __, __, __, __, __, __, __, __, __, __, __, __, H5, __, __, __, __, __, __], + /*SCC*/ + [H0, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __], + /*SFI*/ + [H0, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, H6], + /*SAD*/ + [H0, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __], + /*SER*/ + [H0, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __] + ]; + var H7 = tls.handleClientHello; + var H8 = tls.handleClientKeyExchange; + var H9 = tls.handleCertificateVerify; + hsTable[tls.ConnectionEnd.server] = [ + // 01,CH,02,03,04,05,06,07,08,09,10,CC,12,13,14,CV,CK,17,18,19,FI + /*CHE*/ + [__, H7, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __], + /*CCE*/ + [__, __, __, __, __, __, __, __, __, __, __, H2, __, __, __, __, __, __, __, __, __], + /*CKE*/ + [__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, H8, __, __, __, __], + /*CCV*/ + [__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, H9, __, __, __, __, __], + /*CCC*/ + [__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __], + /*CFI*/ + [__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, H6], + /*CAD*/ + [__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __], + /*CER*/ + [__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __] + ]; + tls.generateKeys = function(c, sp) { + var prf = prf_TLS1; + var random = sp.client_random + sp.server_random; + if (!c.session.resuming) { + sp.master_secret = prf( + sp.pre_master_secret, + "master secret", + random, + 48 + ).bytes(); + sp.pre_master_secret = null; + } + random = sp.server_random + sp.client_random; + var length = 2 * sp.mac_key_length + 2 * sp.enc_key_length; + var tls10 = c.version.major === tls.Versions.TLS_1_0.major && c.version.minor === tls.Versions.TLS_1_0.minor; + if (tls10) { + length += 2 * sp.fixed_iv_length; + } + var km = prf(sp.master_secret, "key expansion", random, length); + var rval = { + client_write_MAC_key: km.getBytes(sp.mac_key_length), + server_write_MAC_key: km.getBytes(sp.mac_key_length), + client_write_key: km.getBytes(sp.enc_key_length), + server_write_key: km.getBytes(sp.enc_key_length) + }; + if (tls10) { + rval.client_write_IV = km.getBytes(sp.fixed_iv_length); + rval.server_write_IV = km.getBytes(sp.fixed_iv_length); + } + return rval; + }; + tls.createConnectionState = function(c) { + var client = c.entity === tls.ConnectionEnd.client; + var createMode = function() { + var mode = { + // two 32-bit numbers, first is most significant + sequenceNumber: [0, 0], + macKey: null, + macLength: 0, + macFunction: null, + cipherState: null, + cipherFunction: function(record) { + return true; + }, + compressionState: null, + compressFunction: function(record) { + return true; + }, + updateSequenceNumber: function() { + if (mode.sequenceNumber[1] === 4294967295) { + mode.sequenceNumber[1] = 0; + ++mode.sequenceNumber[0]; + } else { + ++mode.sequenceNumber[1]; + } + } + }; + return mode; + }; + var state = { + read: createMode(), + write: createMode() + }; + state.read.update = function(c2, record) { + if (!state.read.cipherFunction(record, state.read)) { + c2.error(c2, { + message: "Could not decrypt record or bad MAC.", + send: true, + alert: { + level: tls.Alert.Level.fatal, + // doesn't matter if decryption failed or MAC was + // invalid, return the same error so as not to reveal + // which one occurred + description: tls.Alert.Description.bad_record_mac + } + }); + } else if (!state.read.compressFunction(c2, record, state.read)) { + c2.error(c2, { + message: "Could not decompress record.", + send: true, + alert: { + level: tls.Alert.Level.fatal, + description: tls.Alert.Description.decompression_failure + } + }); + } + return !c2.fail; + }; + state.write.update = function(c2, record) { + if (!state.write.compressFunction(c2, record, state.write)) { + c2.error(c2, { + message: "Could not compress record.", + send: false, + alert: { + level: tls.Alert.Level.fatal, + description: tls.Alert.Description.internal_error + } + }); + } else if (!state.write.cipherFunction(record, state.write)) { + c2.error(c2, { + message: "Could not encrypt record.", + send: false, + alert: { + level: tls.Alert.Level.fatal, + description: tls.Alert.Description.internal_error + } + }); + } + return !c2.fail; + }; + if (c.session) { + var sp = c.session.sp; + c.session.cipherSuite.initSecurityParameters(sp); + sp.keys = tls.generateKeys(c, sp); + state.read.macKey = client ? sp.keys.server_write_MAC_key : sp.keys.client_write_MAC_key; + state.write.macKey = client ? sp.keys.client_write_MAC_key : sp.keys.server_write_MAC_key; + c.session.cipherSuite.initConnectionState(state, c, sp); + switch (sp.compression_algorithm) { + case tls.CompressionMethod.none: + break; + case tls.CompressionMethod.deflate: + state.read.compressFunction = inflate; + state.write.compressFunction = deflate; + break; + default: + throw new Error("Unsupported compression algorithm."); + } + } + return state; + }; + tls.createRandom = function() { + var d = /* @__PURE__ */ new Date(); + var utc = +d + d.getTimezoneOffset() * 6e4; + var rval = forge3.util.createBuffer(); + rval.putInt32(utc); + rval.putBytes(forge3.random.getBytes(28)); + return rval; + }; + tls.createRecord = function(c, options) { + if (!options.data) { + return null; + } + var record = { + type: options.type, + version: { + major: c.version.major, + minor: c.version.minor + }, + length: options.data.length(), + fragment: options.data + }; + return record; + }; + tls.createAlert = function(c, alert) { + var b = forge3.util.createBuffer(); + b.putByte(alert.level); + b.putByte(alert.description); + return tls.createRecord(c, { + type: tls.ContentType.alert, + data: b + }); + }; + tls.createClientHello = function(c) { + c.session.clientHelloVersion = { + major: c.version.major, + minor: c.version.minor + }; + var cipherSuites = forge3.util.createBuffer(); + for (var i = 0; i < c.cipherSuites.length; ++i) { + var cs = c.cipherSuites[i]; + cipherSuites.putByte(cs.id[0]); + cipherSuites.putByte(cs.id[1]); + } + var cSuites = cipherSuites.length(); + var compressionMethods = forge3.util.createBuffer(); + compressionMethods.putByte(tls.CompressionMethod.none); + var cMethods = compressionMethods.length(); + var extensions = forge3.util.createBuffer(); + if (c.virtualHost) { + var ext = forge3.util.createBuffer(); + ext.putByte(0); + ext.putByte(0); + var serverName = forge3.util.createBuffer(); + serverName.putByte(0); + writeVector(serverName, 2, forge3.util.createBuffer(c.virtualHost)); + var snList = forge3.util.createBuffer(); + writeVector(snList, 2, serverName); + writeVector(ext, 2, snList); + extensions.putBuffer(ext); + } + var extLength = extensions.length(); + if (extLength > 0) { + extLength += 2; + } + var sessionId = c.session.id; + var length = sessionId.length + 1 + // session ID vector + 2 + // version (major + minor) + 4 + 28 + // random time and random bytes + 2 + cSuites + // cipher suites vector + 1 + cMethods + // compression methods vector + extLength; + var rval = forge3.util.createBuffer(); + rval.putByte(tls.HandshakeType.client_hello); + rval.putInt24(length); + rval.putByte(c.version.major); + rval.putByte(c.version.minor); + rval.putBytes(c.session.sp.client_random); + writeVector(rval, 1, forge3.util.createBuffer(sessionId)); + writeVector(rval, 2, cipherSuites); + writeVector(rval, 1, compressionMethods); + if (extLength > 0) { + writeVector(rval, 2, extensions); + } + return rval; + }; + tls.createServerHello = function(c) { + var sessionId = c.session.id; + var length = sessionId.length + 1 + // session ID vector + 2 + // version (major + minor) + 4 + 28 + // random time and random bytes + 2 + // chosen cipher suite + 1; + var rval = forge3.util.createBuffer(); + rval.putByte(tls.HandshakeType.server_hello); + rval.putInt24(length); + rval.putByte(c.version.major); + rval.putByte(c.version.minor); + rval.putBytes(c.session.sp.server_random); + writeVector(rval, 1, forge3.util.createBuffer(sessionId)); + rval.putByte(c.session.cipherSuite.id[0]); + rval.putByte(c.session.cipherSuite.id[1]); + rval.putByte(c.session.compressionMethod); + return rval; + }; + tls.createCertificate = function(c) { + var client = c.entity === tls.ConnectionEnd.client; + var cert = null; + if (c.getCertificate) { + var hint; + if (client) { + hint = c.session.certificateRequest; + } else { + hint = c.session.extensions.server_name.serverNameList; + } + cert = c.getCertificate(c, hint); + } + var certList = forge3.util.createBuffer(); + if (cert !== null) { + try { + if (!forge3.util.isArray(cert)) { + cert = [cert]; + } + var asn1 = null; + for (var i = 0; i < cert.length; ++i) { + var msg = forge3.pem.decode(cert[i])[0]; + if (msg.type !== "CERTIFICATE" && msg.type !== "X509 CERTIFICATE" && msg.type !== "TRUSTED CERTIFICATE") { + var error = new Error('Could not convert certificate from PEM; PEM header type is not "CERTIFICATE", "X509 CERTIFICATE", or "TRUSTED CERTIFICATE".'); + error.headerType = msg.type; + throw error; + } + if (msg.procType && msg.procType.type === "ENCRYPTED") { + throw new Error("Could not convert certificate from PEM; PEM is encrypted."); + } + var der = forge3.util.createBuffer(msg.body); + if (asn1 === null) { + asn1 = forge3.asn1.fromDer(der.bytes(), false); + } + var certBuffer = forge3.util.createBuffer(); + writeVector(certBuffer, 3, der); + certList.putBuffer(certBuffer); + } + cert = forge3.pki.certificateFromAsn1(asn1); + if (client) { + c.session.clientCertificate = cert; + } else { + c.session.serverCertificate = cert; + } + } catch (ex) { + return c.error(c, { + message: "Could not send certificate list.", + cause: ex, + send: true, + alert: { + level: tls.Alert.Level.fatal, + description: tls.Alert.Description.bad_certificate + } + }); + } + } + var length = 3 + certList.length(); + var rval = forge3.util.createBuffer(); + rval.putByte(tls.HandshakeType.certificate); + rval.putInt24(length); + writeVector(rval, 3, certList); + return rval; + }; + tls.createClientKeyExchange = function(c) { + var b = forge3.util.createBuffer(); + b.putByte(c.session.clientHelloVersion.major); + b.putByte(c.session.clientHelloVersion.minor); + b.putBytes(forge3.random.getBytes(46)); + var sp = c.session.sp; + sp.pre_master_secret = b.getBytes(); + var key2 = c.session.serverCertificate.publicKey; + b = key2.encrypt(sp.pre_master_secret); + var length = b.length + 2; + var rval = forge3.util.createBuffer(); + rval.putByte(tls.HandshakeType.client_key_exchange); + rval.putInt24(length); + rval.putInt16(b.length); + rval.putBytes(b); + return rval; + }; + tls.createServerKeyExchange = function(c) { + var length = 0; + var rval = forge3.util.createBuffer(); + if (length > 0) { + rval.putByte(tls.HandshakeType.server_key_exchange); + rval.putInt24(length); + } + return rval; + }; + tls.getClientSignature = function(c, callback) { + var b = forge3.util.createBuffer(); + b.putBuffer(c.session.md5.digest()); + b.putBuffer(c.session.sha1.digest()); + b = b.getBytes(); + c.getSignature = c.getSignature || function(c2, b2, callback2) { + var privateKey = null; + if (c2.getPrivateKey) { + try { + privateKey = c2.getPrivateKey(c2, c2.session.clientCertificate); + privateKey = forge3.pki.privateKeyFromPem(privateKey); + } catch (ex) { + c2.error(c2, { + message: "Could not get private key.", + cause: ex, + send: true, + alert: { + level: tls.Alert.Level.fatal, + description: tls.Alert.Description.internal_error + } + }); + } + } + if (privateKey === null) { + c2.error(c2, { + message: "No private key set.", + send: true, + alert: { + level: tls.Alert.Level.fatal, + description: tls.Alert.Description.internal_error + } + }); + } else { + b2 = privateKey.sign(b2, null); + } + callback2(c2, b2); + }; + c.getSignature(c, b, callback); + }; + tls.createCertificateVerify = function(c, signature) { + var length = signature.length + 2; + var rval = forge3.util.createBuffer(); + rval.putByte(tls.HandshakeType.certificate_verify); + rval.putInt24(length); + rval.putInt16(signature.length); + rval.putBytes(signature); + return rval; + }; + tls.createCertificateRequest = function(c) { + var certTypes = forge3.util.createBuffer(); + certTypes.putByte(1); + var cAs = forge3.util.createBuffer(); + for (var key2 in c.caStore.certs) { + var cert = c.caStore.certs[key2]; + var dn = forge3.pki.distinguishedNameToAsn1(cert.subject); + var byteBuffer = forge3.asn1.toDer(dn); + cAs.putInt16(byteBuffer.length()); + cAs.putBuffer(byteBuffer); + } + var length = 1 + certTypes.length() + 2 + cAs.length(); + var rval = forge3.util.createBuffer(); + rval.putByte(tls.HandshakeType.certificate_request); + rval.putInt24(length); + writeVector(rval, 1, certTypes); + writeVector(rval, 2, cAs); + return rval; + }; + tls.createServerHelloDone = function(c) { + var rval = forge3.util.createBuffer(); + rval.putByte(tls.HandshakeType.server_hello_done); + rval.putInt24(0); + return rval; + }; + tls.createChangeCipherSpec = function() { + var rval = forge3.util.createBuffer(); + rval.putByte(1); + return rval; + }; + tls.createFinished = function(c) { + var b = forge3.util.createBuffer(); + b.putBuffer(c.session.md5.digest()); + b.putBuffer(c.session.sha1.digest()); + var client = c.entity === tls.ConnectionEnd.client; + var sp = c.session.sp; + var vdl = 12; + var prf = prf_TLS1; + var label = client ? "client finished" : "server finished"; + b = prf(sp.master_secret, label, b.getBytes(), vdl); + var rval = forge3.util.createBuffer(); + rval.putByte(tls.HandshakeType.finished); + rval.putInt24(b.length()); + rval.putBuffer(b); + return rval; + }; + tls.createHeartbeat = function(type, payload, payloadLength) { + if (typeof payloadLength === "undefined") { + payloadLength = payload.length; + } + var rval = forge3.util.createBuffer(); + rval.putByte(type); + rval.putInt16(payloadLength); + rval.putBytes(payload); + var plaintextLength = rval.length(); + var paddingLength = Math.max(16, plaintextLength - payloadLength - 3); + rval.putBytes(forge3.random.getBytes(paddingLength)); + return rval; + }; + tls.queue = function(c, record) { + if (!record) { + return; + } + if (record.fragment.length() === 0) { + if (record.type === tls.ContentType.handshake || record.type === tls.ContentType.alert || record.type === tls.ContentType.change_cipher_spec) { + return; + } + } + if (record.type === tls.ContentType.handshake) { + var bytes = record.fragment.bytes(); + c.session.md5.update(bytes); + c.session.sha1.update(bytes); + bytes = null; + } + var records; + if (record.fragment.length() <= tls.MaxFragment) { + records = [record]; + } else { + records = []; + var data = record.fragment.bytes(); + while (data.length > tls.MaxFragment) { + records.push(tls.createRecord(c, { + type: record.type, + data: forge3.util.createBuffer(data.slice(0, tls.MaxFragment)) + })); + data = data.slice(tls.MaxFragment); + } + if (data.length > 0) { + records.push(tls.createRecord(c, { + type: record.type, + data: forge3.util.createBuffer(data) + })); + } + } + for (var i = 0; i < records.length && !c.fail; ++i) { + var rec = records[i]; + var s = c.state.current.write; + if (s.update(c, rec)) { + c.records.push(rec); + } + } + }; + tls.flush = function(c) { + for (var i = 0; i < c.records.length; ++i) { + var record = c.records[i]; + c.tlsData.putByte(record.type); + c.tlsData.putByte(record.version.major); + c.tlsData.putByte(record.version.minor); + c.tlsData.putInt16(record.fragment.length()); + c.tlsData.putBuffer(c.records[i].fragment); + } + c.records = []; + return c.tlsDataReady(c); + }; + var _certErrorToAlertDesc = function(error) { + switch (error) { + case true: + return true; + case forge3.pki.certificateError.bad_certificate: + return tls.Alert.Description.bad_certificate; + case forge3.pki.certificateError.unsupported_certificate: + return tls.Alert.Description.unsupported_certificate; + case forge3.pki.certificateError.certificate_revoked: + return tls.Alert.Description.certificate_revoked; + case forge3.pki.certificateError.certificate_expired: + return tls.Alert.Description.certificate_expired; + case forge3.pki.certificateError.certificate_unknown: + return tls.Alert.Description.certificate_unknown; + case forge3.pki.certificateError.unknown_ca: + return tls.Alert.Description.unknown_ca; + default: + return tls.Alert.Description.bad_certificate; + } + }; + var _alertDescToCertError = function(desc) { + switch (desc) { + case true: + return true; + case tls.Alert.Description.bad_certificate: + return forge3.pki.certificateError.bad_certificate; + case tls.Alert.Description.unsupported_certificate: + return forge3.pki.certificateError.unsupported_certificate; + case tls.Alert.Description.certificate_revoked: + return forge3.pki.certificateError.certificate_revoked; + case tls.Alert.Description.certificate_expired: + return forge3.pki.certificateError.certificate_expired; + case tls.Alert.Description.certificate_unknown: + return forge3.pki.certificateError.certificate_unknown; + case tls.Alert.Description.unknown_ca: + return forge3.pki.certificateError.unknown_ca; + default: + return forge3.pki.certificateError.bad_certificate; + } + }; + tls.verifyCertificateChain = function(c, chain) { + try { + var options = {}; + for (var key2 in c.verifyOptions) { + options[key2] = c.verifyOptions[key2]; + } + options.verify = function(vfd, depth, chain2) { + var desc = _certErrorToAlertDesc(vfd); + var ret = c.verify(c, vfd, depth, chain2); + if (ret !== true) { + if (typeof ret === "object" && !forge3.util.isArray(ret)) { + var error = new Error("The application rejected the certificate."); + error.send = true; + error.alert = { + level: tls.Alert.Level.fatal, + description: tls.Alert.Description.bad_certificate + }; + if (ret.message) { + error.message = ret.message; + } + if (ret.alert) { + error.alert.description = ret.alert; + } + throw error; + } + if (ret !== vfd) { + ret = _alertDescToCertError(ret); + } + } + return ret; + }; + forge3.pki.verifyCertificateChain(c.caStore, chain, options); + } catch (ex) { + var err = ex; + if (typeof err !== "object" || forge3.util.isArray(err)) { + err = { + send: true, + alert: { + level: tls.Alert.Level.fatal, + description: _certErrorToAlertDesc(ex) + } + }; + } + if (!("send" in err)) { + err.send = true; + } + if (!("alert" in err)) { + err.alert = { + level: tls.Alert.Level.fatal, + description: _certErrorToAlertDesc(err.error) + }; + } + c.error(c, err); + } + return !c.fail; + }; + tls.createSessionCache = function(cache, capacity) { + var rval = null; + if (cache && cache.getSession && cache.setSession && cache.order) { + rval = cache; + } else { + rval = {}; + rval.cache = cache || {}; + rval.capacity = Math.max(capacity || 100, 1); + rval.order = []; + for (var key2 in cache) { + if (rval.order.length <= capacity) { + rval.order.push(key2); + } else { + delete cache[key2]; + } + } + rval.getSession = function(sessionId) { + var session = null; + var key3 = null; + if (sessionId) { + key3 = forge3.util.bytesToHex(sessionId); + } else if (rval.order.length > 0) { + key3 = rval.order[0]; + } + if (key3 !== null && key3 in rval.cache) { + session = rval.cache[key3]; + delete rval.cache[key3]; + for (var i in rval.order) { + if (rval.order[i] === key3) { + rval.order.splice(i, 1); + break; + } + } + } + return session; + }; + rval.setSession = function(sessionId, session) { + if (rval.order.length === rval.capacity) { + var key3 = rval.order.shift(); + delete rval.cache[key3]; + } + var key3 = forge3.util.bytesToHex(sessionId); + rval.order.push(key3); + rval.cache[key3] = session; + }; + } + return rval; + }; + tls.createConnection = function(options) { + var caStore = null; + if (options.caStore) { + if (forge3.util.isArray(options.caStore)) { + caStore = forge3.pki.createCaStore(options.caStore); + } else { + caStore = options.caStore; + } + } else { + caStore = forge3.pki.createCaStore(); + } + var cipherSuites = options.cipherSuites || null; + if (cipherSuites === null) { + cipherSuites = []; + for (var key2 in tls.CipherSuites) { + cipherSuites.push(tls.CipherSuites[key2]); + } + } + var entity = options.server || false ? tls.ConnectionEnd.server : tls.ConnectionEnd.client; + var sessionCache = options.sessionCache ? tls.createSessionCache(options.sessionCache) : null; + var c = { + version: { major: tls.Version.major, minor: tls.Version.minor }, + entity, + sessionId: options.sessionId, + caStore, + sessionCache, + cipherSuites, + connected: options.connected, + virtualHost: options.virtualHost || null, + verifyClient: options.verifyClient || false, + verify: options.verify || function(cn, vfd, dpth, cts) { + return vfd; + }, + verifyOptions: options.verifyOptions || {}, + getCertificate: options.getCertificate || null, + getPrivateKey: options.getPrivateKey || null, + getSignature: options.getSignature || null, + input: forge3.util.createBuffer(), + tlsData: forge3.util.createBuffer(), + data: forge3.util.createBuffer(), + tlsDataReady: options.tlsDataReady, + dataReady: options.dataReady, + heartbeatReceived: options.heartbeatReceived, + closed: options.closed, + error: function(c2, ex) { + ex.origin = ex.origin || (c2.entity === tls.ConnectionEnd.client ? "client" : "server"); + if (ex.send) { + tls.queue(c2, tls.createAlert(c2, ex.alert)); + tls.flush(c2); + } + var fatal = ex.fatal !== false; + if (fatal) { + c2.fail = true; + } + options.error(c2, ex); + if (fatal) { + c2.close(false); + } + }, + deflate: options.deflate || null, + inflate: options.inflate || null + }; + c.reset = function(clearFail) { + c.version = { major: tls.Version.major, minor: tls.Version.minor }; + c.record = null; + c.session = null; + c.peerCertificate = null; + c.state = { + pending: null, + current: null + }; + c.expect = c.entity === tls.ConnectionEnd.client ? SHE : CHE; + c.fragmented = null; + c.records = []; + c.open = false; + c.handshakes = 0; + c.handshaking = false; + c.isConnected = false; + c.fail = !(clearFail || typeof clearFail === "undefined"); + c.input.clear(); + c.tlsData.clear(); + c.data.clear(); + c.state.current = tls.createConnectionState(c); + }; + c.reset(); + var _update = function(c2, record) { + var aligned = record.type - tls.ContentType.change_cipher_spec; + var handlers = ctTable[c2.entity][c2.expect]; + if (aligned in handlers) { + handlers[aligned](c2, record); + } else { + tls.handleUnexpected(c2, record); + } + }; + var _readRecordHeader = function(c2) { + var rval = 0; + var b = c2.input; + var len = b.length(); + if (len < 5) { + rval = 5 - len; + } else { + c2.record = { + type: b.getByte(), + version: { + major: b.getByte(), + minor: b.getByte() + }, + length: b.getInt16(), + fragment: forge3.util.createBuffer(), + ready: false + }; + var compatibleVersion = c2.record.version.major === c2.version.major; + if (compatibleVersion && c2.session && c2.session.version) { + compatibleVersion = c2.record.version.minor === c2.version.minor; + } + if (!compatibleVersion) { + c2.error(c2, { + message: "Incompatible TLS version.", + send: true, + alert: { + level: tls.Alert.Level.fatal, + description: tls.Alert.Description.protocol_version + } + }); + } + } + return rval; + }; + var _readRecord = function(c2) { + var rval = 0; + var b = c2.input; + var len = b.length(); + if (len < c2.record.length) { + rval = c2.record.length - len; + } else { + c2.record.fragment.putBytes(b.getBytes(c2.record.length)); + b.compact(); + var s = c2.state.current.read; + if (s.update(c2, c2.record)) { + if (c2.fragmented !== null) { + if (c2.fragmented.type === c2.record.type) { + c2.fragmented.fragment.putBuffer(c2.record.fragment); + c2.record = c2.fragmented; + } else { + c2.error(c2, { + message: "Invalid fragmented record.", + send: true, + alert: { + level: tls.Alert.Level.fatal, + description: tls.Alert.Description.unexpected_message + } + }); + } + } + c2.record.ready = true; + } + } + return rval; + }; + c.handshake = function(sessionId) { + if (c.entity !== tls.ConnectionEnd.client) { + c.error(c, { + message: "Cannot initiate handshake as a server.", + fatal: false + }); + } else if (c.handshaking) { + c.error(c, { + message: "Handshake already in progress.", + fatal: false + }); + } else { + if (c.fail && !c.open && c.handshakes === 0) { + c.fail = false; + } + c.handshaking = true; + sessionId = sessionId || ""; + var session = null; + if (sessionId.length > 0) { + if (c.sessionCache) { + session = c.sessionCache.getSession(sessionId); + } + if (session === null) { + sessionId = ""; + } + } + if (sessionId.length === 0 && c.sessionCache) { + session = c.sessionCache.getSession(); + if (session !== null) { + sessionId = session.id; + } + } + c.session = { + id: sessionId, + version: null, + cipherSuite: null, + compressionMethod: null, + serverCertificate: null, + certificateRequest: null, + clientCertificate: null, + sp: {}, + md5: forge3.md.md5.create(), + sha1: forge3.md.sha1.create() + }; + if (session) { + c.version = session.version; + c.session.sp = session.sp; + } + c.session.sp.client_random = tls.createRandom().getBytes(); + c.open = true; + tls.queue(c, tls.createRecord(c, { + type: tls.ContentType.handshake, + data: tls.createClientHello(c) + })); + tls.flush(c); + } + }; + c.process = function(data) { + var rval = 0; + if (data) { + c.input.putBytes(data); + } + if (!c.fail) { + if (c.record !== null && c.record.ready && c.record.fragment.isEmpty()) { + c.record = null; + } + if (c.record === null) { + rval = _readRecordHeader(c); + } + if (!c.fail && c.record !== null && !c.record.ready) { + rval = _readRecord(c); + } + if (!c.fail && c.record !== null && c.record.ready) { + _update(c, c.record); + } + } + return rval; + }; + c.prepare = function(data) { + tls.queue(c, tls.createRecord(c, { + type: tls.ContentType.application_data, + data: forge3.util.createBuffer(data) + })); + return tls.flush(c); + }; + c.prepareHeartbeatRequest = function(payload, payloadLength) { + if (payload instanceof forge3.util.ByteBuffer) { + payload = payload.bytes(); + } + if (typeof payloadLength === "undefined") { + payloadLength = payload.length; + } + c.expectedHeartbeatPayload = payload; + tls.queue(c, tls.createRecord(c, { + type: tls.ContentType.heartbeat, + data: tls.createHeartbeat( + tls.HeartbeatMessageType.heartbeat_request, + payload, + payloadLength + ) + })); + return tls.flush(c); + }; + c.close = function(clearFail) { + if (!c.fail && c.sessionCache && c.session) { + var session = { + id: c.session.id, + version: c.session.version, + sp: c.session.sp + }; + session.sp.keys = null; + c.sessionCache.setSession(session.id, session); + } + if (c.open) { + c.open = false; + c.input.clear(); + if (c.isConnected || c.handshaking) { + c.isConnected = c.handshaking = false; + tls.queue(c, tls.createAlert(c, { + level: tls.Alert.Level.warning, + description: tls.Alert.Description.close_notify + })); + tls.flush(c); + } + c.closed(c); + } + c.reset(clearFail); + }; + return c; + }; + module.exports = forge3.tls = forge3.tls || {}; + for (key in tls) { + if (typeof tls[key] !== "function") { + forge3.tls[key] = tls[key]; + } + } + var key; + forge3.tls.prf_tls1 = prf_TLS1; + forge3.tls.hmac_sha1 = hmac_sha1; + forge3.tls.createSessionCache = tls.createSessionCache; + forge3.tls.createConnection = tls.createConnection; + } +}); + +// node_modules/node-forge/lib/aesCipherSuites.js +var require_aesCipherSuites = __commonJS({ + "node_modules/node-forge/lib/aesCipherSuites.js"(exports, module) { + var forge3 = require_forge(); + require_aes(); + require_tls(); + var tls = module.exports = forge3.tls; + tls.CipherSuites["TLS_RSA_WITH_AES_128_CBC_SHA"] = { + id: [0, 47], + name: "TLS_RSA_WITH_AES_128_CBC_SHA", + initSecurityParameters: function(sp) { + sp.bulk_cipher_algorithm = tls.BulkCipherAlgorithm.aes; + sp.cipher_type = tls.CipherType.block; + sp.enc_key_length = 16; + sp.block_length = 16; + sp.fixed_iv_length = 16; + sp.record_iv_length = 16; + sp.mac_algorithm = tls.MACAlgorithm.hmac_sha1; + sp.mac_length = 20; + sp.mac_key_length = 20; + }, + initConnectionState + }; + tls.CipherSuites["TLS_RSA_WITH_AES_256_CBC_SHA"] = { + id: [0, 53], + name: "TLS_RSA_WITH_AES_256_CBC_SHA", + initSecurityParameters: function(sp) { + sp.bulk_cipher_algorithm = tls.BulkCipherAlgorithm.aes; + sp.cipher_type = tls.CipherType.block; + sp.enc_key_length = 32; + sp.block_length = 16; + sp.fixed_iv_length = 16; + sp.record_iv_length = 16; + sp.mac_algorithm = tls.MACAlgorithm.hmac_sha1; + sp.mac_length = 20; + sp.mac_key_length = 20; + }, + initConnectionState + }; + function initConnectionState(state, c, sp) { + var client = c.entity === forge3.tls.ConnectionEnd.client; + state.read.cipherState = { + init: false, + cipher: forge3.cipher.createDecipher("AES-CBC", client ? sp.keys.server_write_key : sp.keys.client_write_key), + iv: client ? sp.keys.server_write_IV : sp.keys.client_write_IV + }; + state.write.cipherState = { + init: false, + cipher: forge3.cipher.createCipher("AES-CBC", client ? sp.keys.client_write_key : sp.keys.server_write_key), + iv: client ? sp.keys.client_write_IV : sp.keys.server_write_IV + }; + state.read.cipherFunction = decrypt_aes_cbc_sha1; + state.write.cipherFunction = encrypt_aes_cbc_sha1; + state.read.macLength = state.write.macLength = sp.mac_length; + state.read.macFunction = state.write.macFunction = tls.hmac_sha1; + } + function encrypt_aes_cbc_sha1(record, s) { + var rval = false; + var mac = s.macFunction(s.macKey, s.sequenceNumber, record); + record.fragment.putBytes(mac); + s.updateSequenceNumber(); + var iv; + if (record.version.minor === tls.Versions.TLS_1_0.minor) { + iv = s.cipherState.init ? null : s.cipherState.iv; + } else { + iv = forge3.random.getBytesSync(16); + } + s.cipherState.init = true; + var cipher = s.cipherState.cipher; + cipher.start({ iv }); + if (record.version.minor >= tls.Versions.TLS_1_1.minor) { + cipher.output.putBytes(iv); + } + cipher.update(record.fragment); + if (cipher.finish(encrypt_aes_cbc_sha1_padding)) { + record.fragment = cipher.output; + record.length = record.fragment.length(); + rval = true; + } + return rval; + } + function encrypt_aes_cbc_sha1_padding(blockSize, input, decrypt) { + if (!decrypt) { + var padding = blockSize - input.length() % blockSize; + input.fillWithByte(padding - 1, padding); + } + return true; + } + function decrypt_aes_cbc_sha1_padding(blockSize, output, decrypt) { + var rval = true; + if (decrypt) { + var len = output.length(); + var paddingLength = output.last(); + for (var i = len - 1 - paddingLength; i < len - 1; ++i) { + rval = rval && output.at(i) == paddingLength; + } + if (rval) { + output.truncate(paddingLength + 1); + } + } + return rval; + } + function decrypt_aes_cbc_sha1(record, s) { + var rval = false; + var iv; + if (record.version.minor === tls.Versions.TLS_1_0.minor) { + iv = s.cipherState.init ? null : s.cipherState.iv; + } else { + iv = record.fragment.getBytes(16); + } + s.cipherState.init = true; + var cipher = s.cipherState.cipher; + cipher.start({ iv }); + cipher.update(record.fragment); + rval = cipher.finish(decrypt_aes_cbc_sha1_padding); + var macLen = s.macLength; + var mac = forge3.random.getBytesSync(macLen); + var len = cipher.output.length(); + if (len >= macLen) { + record.fragment = cipher.output.getBytes(len - macLen); + mac = cipher.output.getBytes(macLen); + } else { + record.fragment = cipher.output.getBytes(); + } + record.fragment = forge3.util.createBuffer(record.fragment); + record.length = record.fragment.length(); + var mac2 = s.macFunction(s.macKey, s.sequenceNumber, record); + s.updateSequenceNumber(); + rval = compareMacs(s.macKey, mac, mac2) && rval; + return rval; + } + function compareMacs(key, mac1, mac2) { + var hmac = forge3.hmac.create(); + hmac.start("SHA1", key); + hmac.update(mac1); + mac1 = hmac.digest().getBytes(); + hmac.start(null, null); + hmac.update(mac2); + mac2 = hmac.digest().getBytes(); + return mac1 === mac2; + } + } +}); + +// node_modules/node-forge/lib/sha512.js +var require_sha512 = __commonJS({ + "node_modules/node-forge/lib/sha512.js"(exports, module) { + var forge3 = require_forge(); + require_md(); + require_util(); + var sha512 = module.exports = forge3.sha512 = forge3.sha512 || {}; + forge3.md.sha512 = forge3.md.algorithms.sha512 = sha512; + var sha384 = forge3.sha384 = forge3.sha512.sha384 = forge3.sha512.sha384 || {}; + sha384.create = function() { + return sha512.create("SHA-384"); + }; + forge3.md.sha384 = forge3.md.algorithms.sha384 = sha384; + forge3.sha512.sha256 = forge3.sha512.sha256 || { + create: function() { + return sha512.create("SHA-512/256"); + } + }; + forge3.md["sha512/256"] = forge3.md.algorithms["sha512/256"] = forge3.sha512.sha256; + forge3.sha512.sha224 = forge3.sha512.sha224 || { + create: function() { + return sha512.create("SHA-512/224"); + } + }; + forge3.md["sha512/224"] = forge3.md.algorithms["sha512/224"] = forge3.sha512.sha224; + sha512.create = function(algorithm) { + if (!_initialized) { + _init(); + } + if (typeof algorithm === "undefined") { + algorithm = "SHA-512"; + } + if (!(algorithm in _states)) { + throw new Error("Invalid SHA-512 algorithm: " + algorithm); + } + var _state = _states[algorithm]; + var _h = null; + var _input = forge3.util.createBuffer(); + var _w = new Array(80); + for (var wi = 0; wi < 80; ++wi) { + _w[wi] = new Array(2); + } + var digestLength = 64; + switch (algorithm) { + case "SHA-384": + digestLength = 48; + break; + case "SHA-512/256": + digestLength = 32; + break; + case "SHA-512/224": + digestLength = 28; + break; + } + var md = { + // SHA-512 => sha512 + algorithm: algorithm.replace("-", "").toLowerCase(), + blockLength: 128, + digestLength, + // 56-bit length of message so far (does not including padding) + messageLength: 0, + // true message length + fullMessageLength: null, + // size of message length in bytes + messageLengthSize: 16 + }; + md.start = function() { + md.messageLength = 0; + md.fullMessageLength = md.messageLength128 = []; + var int32s = md.messageLengthSize / 4; + for (var i = 0; i < int32s; ++i) { + md.fullMessageLength.push(0); + } + _input = forge3.util.createBuffer(); + _h = new Array(_state.length); + for (var i = 0; i < _state.length; ++i) { + _h[i] = _state[i].slice(0); + } + return md; + }; + md.start(); + md.update = function(msg, encoding) { + if (encoding === "utf8") { + msg = forge3.util.encodeUtf8(msg); + } + var len = msg.length; + md.messageLength += len; + len = [len / 4294967296 >>> 0, len >>> 0]; + for (var i = md.fullMessageLength.length - 1; i >= 0; --i) { + md.fullMessageLength[i] += len[1]; + len[1] = len[0] + (md.fullMessageLength[i] / 4294967296 >>> 0); + md.fullMessageLength[i] = md.fullMessageLength[i] >>> 0; + len[0] = len[1] / 4294967296 >>> 0; + } + _input.putBytes(msg); + _update(_h, _w, _input); + if (_input.read > 2048 || _input.length() === 0) { + _input.compact(); + } + return md; + }; + md.digest = function() { + var finalBlock = forge3.util.createBuffer(); + finalBlock.putBytes(_input.bytes()); + var remaining = md.fullMessageLength[md.fullMessageLength.length - 1] + md.messageLengthSize; + var overflow = remaining & md.blockLength - 1; + finalBlock.putBytes(_padding.substr(0, md.blockLength - overflow)); + var next, carry; + var bits = md.fullMessageLength[0] * 8; + for (var i = 0; i < md.fullMessageLength.length - 1; ++i) { + next = md.fullMessageLength[i + 1] * 8; + carry = next / 4294967296 >>> 0; + bits += carry; + finalBlock.putInt32(bits >>> 0); + bits = next >>> 0; + } + finalBlock.putInt32(bits); + var h = new Array(_h.length); + for (var i = 0; i < _h.length; ++i) { + h[i] = _h[i].slice(0); + } + _update(h, _w, finalBlock); + var rval = forge3.util.createBuffer(); + var hlen; + if (algorithm === "SHA-512") { + hlen = h.length; + } else if (algorithm === "SHA-384") { + hlen = h.length - 2; + } else { + hlen = h.length - 4; + } + for (var i = 0; i < hlen; ++i) { + rval.putInt32(h[i][0]); + if (i !== hlen - 1 || algorithm !== "SHA-512/224") { + rval.putInt32(h[i][1]); + } + } + return rval; + }; + return md; + }; + var _padding = null; + var _initialized = false; + var _k = null; + var _states = null; + function _init() { + _padding = String.fromCharCode(128); + _padding += forge3.util.fillString(String.fromCharCode(0), 128); + _k = [ + [1116352408, 3609767458], + [1899447441, 602891725], + [3049323471, 3964484399], + [3921009573, 2173295548], + [961987163, 4081628472], + [1508970993, 3053834265], + [2453635748, 2937671579], + [2870763221, 3664609560], + [3624381080, 2734883394], + [310598401, 1164996542], + [607225278, 1323610764], + [1426881987, 3590304994], + [1925078388, 4068182383], + [2162078206, 991336113], + [2614888103, 633803317], + [3248222580, 3479774868], + [3835390401, 2666613458], + [4022224774, 944711139], + [264347078, 2341262773], + [604807628, 2007800933], + [770255983, 1495990901], + [1249150122, 1856431235], + [1555081692, 3175218132], + [1996064986, 2198950837], + [2554220882, 3999719339], + [2821834349, 766784016], + [2952996808, 2566594879], + [3210313671, 3203337956], + [3336571891, 1034457026], + [3584528711, 2466948901], + [113926993, 3758326383], + [338241895, 168717936], + [666307205, 1188179964], + [773529912, 1546045734], + [1294757372, 1522805485], + [1396182291, 2643833823], + [1695183700, 2343527390], + [1986661051, 1014477480], + [2177026350, 1206759142], + [2456956037, 344077627], + [2730485921, 1290863460], + [2820302411, 3158454273], + [3259730800, 3505952657], + [3345764771, 106217008], + [3516065817, 3606008344], + [3600352804, 1432725776], + [4094571909, 1467031594], + [275423344, 851169720], + [430227734, 3100823752], + [506948616, 1363258195], + [659060556, 3750685593], + [883997877, 3785050280], + [958139571, 3318307427], + [1322822218, 3812723403], + [1537002063, 2003034995], + [1747873779, 3602036899], + [1955562222, 1575990012], + [2024104815, 1125592928], + [2227730452, 2716904306], + [2361852424, 442776044], + [2428436474, 593698344], + [2756734187, 3733110249], + [3204031479, 2999351573], + [3329325298, 3815920427], + [3391569614, 3928383900], + [3515267271, 566280711], + [3940187606, 3454069534], + [4118630271, 4000239992], + [116418474, 1914138554], + [174292421, 2731055270], + [289380356, 3203993006], + [460393269, 320620315], + [685471733, 587496836], + [852142971, 1086792851], + [1017036298, 365543100], + [1126000580, 2618297676], + [1288033470, 3409855158], + [1501505948, 4234509866], + [1607167915, 987167468], + [1816402316, 1246189591] + ]; + _states = {}; + _states["SHA-512"] = [ + [1779033703, 4089235720], + [3144134277, 2227873595], + [1013904242, 4271175723], + [2773480762, 1595750129], + [1359893119, 2917565137], + [2600822924, 725511199], + [528734635, 4215389547], + [1541459225, 327033209] + ]; + _states["SHA-384"] = [ + [3418070365, 3238371032], + [1654270250, 914150663], + [2438529370, 812702999], + [355462360, 4144912697], + [1731405415, 4290775857], + [2394180231, 1750603025], + [3675008525, 1694076839], + [1203062813, 3204075428] + ]; + _states["SHA-512/256"] = [ + [573645204, 4230739756], + [2673172387, 3360449730], + [596883563, 1867755857], + [2520282905, 1497426621], + [2519219938, 2827943907], + [3193839141, 1401305490], + [721525244, 746961066], + [246885852, 2177182882] + ]; + _states["SHA-512/224"] = [ + [2352822216, 424955298], + [1944164710, 2312950998], + [502970286, 855612546], + [1738396948, 1479516111], + [258812777, 2077511080], + [2011393907, 79989058], + [1067287976, 1780299464], + [286451373, 2446758561] + ]; + _initialized = true; + } + function _update(s, w, bytes) { + var t1_hi, t1_lo; + var t2_hi, t2_lo; + var s0_hi, s0_lo; + var s1_hi, s1_lo; + var ch_hi, ch_lo; + var maj_hi, maj_lo; + var a_hi, a_lo; + var b_hi, b_lo; + var c_hi, c_lo; + var d_hi, d_lo; + var e_hi, e_lo; + var f_hi, f_lo; + var g_hi, g_lo; + var h_hi, h_lo; + var i, hi, lo, w2, w7, w15, w16; + var len = bytes.length(); + while (len >= 128) { + for (i = 0; i < 16; ++i) { + w[i][0] = bytes.getInt32() >>> 0; + w[i][1] = bytes.getInt32() >>> 0; + } + for (; i < 80; ++i) { + w2 = w[i - 2]; + hi = w2[0]; + lo = w2[1]; + t1_hi = ((hi >>> 19 | lo << 13) ^ // ROTR 19 + (lo >>> 29 | hi << 3) ^ // ROTR 61/(swap + ROTR 29) + hi >>> 6) >>> 0; + t1_lo = ((hi << 13 | lo >>> 19) ^ // ROTR 19 + (lo << 3 | hi >>> 29) ^ // ROTR 61/(swap + ROTR 29) + (hi << 26 | lo >>> 6)) >>> 0; + w15 = w[i - 15]; + hi = w15[0]; + lo = w15[1]; + t2_hi = ((hi >>> 1 | lo << 31) ^ // ROTR 1 + (hi >>> 8 | lo << 24) ^ // ROTR 8 + hi >>> 7) >>> 0; + t2_lo = ((hi << 31 | lo >>> 1) ^ // ROTR 1 + (hi << 24 | lo >>> 8) ^ // ROTR 8 + (hi << 25 | lo >>> 7)) >>> 0; + w7 = w[i - 7]; + w16 = w[i - 16]; + lo = t1_lo + w7[1] + t2_lo + w16[1]; + w[i][0] = t1_hi + w7[0] + t2_hi + w16[0] + (lo / 4294967296 >>> 0) >>> 0; + w[i][1] = lo >>> 0; + } + a_hi = s[0][0]; + a_lo = s[0][1]; + b_hi = s[1][0]; + b_lo = s[1][1]; + c_hi = s[2][0]; + c_lo = s[2][1]; + d_hi = s[3][0]; + d_lo = s[3][1]; + e_hi = s[4][0]; + e_lo = s[4][1]; + f_hi = s[5][0]; + f_lo = s[5][1]; + g_hi = s[6][0]; + g_lo = s[6][1]; + h_hi = s[7][0]; + h_lo = s[7][1]; + for (i = 0; i < 80; ++i) { + s1_hi = ((e_hi >>> 14 | e_lo << 18) ^ // ROTR 14 + (e_hi >>> 18 | e_lo << 14) ^ // ROTR 18 + (e_lo >>> 9 | e_hi << 23)) >>> 0; + s1_lo = ((e_hi << 18 | e_lo >>> 14) ^ // ROTR 14 + (e_hi << 14 | e_lo >>> 18) ^ // ROTR 18 + (e_lo << 23 | e_hi >>> 9)) >>> 0; + ch_hi = (g_hi ^ e_hi & (f_hi ^ g_hi)) >>> 0; + ch_lo = (g_lo ^ e_lo & (f_lo ^ g_lo)) >>> 0; + s0_hi = ((a_hi >>> 28 | a_lo << 4) ^ // ROTR 28 + (a_lo >>> 2 | a_hi << 30) ^ // ROTR 34/(swap + ROTR 2) + (a_lo >>> 7 | a_hi << 25)) >>> 0; + s0_lo = ((a_hi << 4 | a_lo >>> 28) ^ // ROTR 28 + (a_lo << 30 | a_hi >>> 2) ^ // ROTR 34/(swap + ROTR 2) + (a_lo << 25 | a_hi >>> 7)) >>> 0; + maj_hi = (a_hi & b_hi | c_hi & (a_hi ^ b_hi)) >>> 0; + maj_lo = (a_lo & b_lo | c_lo & (a_lo ^ b_lo)) >>> 0; + lo = h_lo + s1_lo + ch_lo + _k[i][1] + w[i][1]; + t1_hi = h_hi + s1_hi + ch_hi + _k[i][0] + w[i][0] + (lo / 4294967296 >>> 0) >>> 0; + t1_lo = lo >>> 0; + lo = s0_lo + maj_lo; + t2_hi = s0_hi + maj_hi + (lo / 4294967296 >>> 0) >>> 0; + t2_lo = lo >>> 0; + h_hi = g_hi; + h_lo = g_lo; + g_hi = f_hi; + g_lo = f_lo; + f_hi = e_hi; + f_lo = e_lo; + lo = d_lo + t1_lo; + e_hi = d_hi + t1_hi + (lo / 4294967296 >>> 0) >>> 0; + e_lo = lo >>> 0; + d_hi = c_hi; + d_lo = c_lo; + c_hi = b_hi; + c_lo = b_lo; + b_hi = a_hi; + b_lo = a_lo; + lo = t1_lo + t2_lo; + a_hi = t1_hi + t2_hi + (lo / 4294967296 >>> 0) >>> 0; + a_lo = lo >>> 0; + } + lo = s[0][1] + a_lo; + s[0][0] = s[0][0] + a_hi + (lo / 4294967296 >>> 0) >>> 0; + s[0][1] = lo >>> 0; + lo = s[1][1] + b_lo; + s[1][0] = s[1][0] + b_hi + (lo / 4294967296 >>> 0) >>> 0; + s[1][1] = lo >>> 0; + lo = s[2][1] + c_lo; + s[2][0] = s[2][0] + c_hi + (lo / 4294967296 >>> 0) >>> 0; + s[2][1] = lo >>> 0; + lo = s[3][1] + d_lo; + s[3][0] = s[3][0] + d_hi + (lo / 4294967296 >>> 0) >>> 0; + s[3][1] = lo >>> 0; + lo = s[4][1] + e_lo; + s[4][0] = s[4][0] + e_hi + (lo / 4294967296 >>> 0) >>> 0; + s[4][1] = lo >>> 0; + lo = s[5][1] + f_lo; + s[5][0] = s[5][0] + f_hi + (lo / 4294967296 >>> 0) >>> 0; + s[5][1] = lo >>> 0; + lo = s[6][1] + g_lo; + s[6][0] = s[6][0] + g_hi + (lo / 4294967296 >>> 0) >>> 0; + s[6][1] = lo >>> 0; + lo = s[7][1] + h_lo; + s[7][0] = s[7][0] + h_hi + (lo / 4294967296 >>> 0) >>> 0; + s[7][1] = lo >>> 0; + len -= 128; + } + } + } +}); + +// node_modules/node-forge/lib/asn1-validator.js +var require_asn1_validator = __commonJS({ + "node_modules/node-forge/lib/asn1-validator.js"(exports) { + var forge3 = require_forge(); + require_asn1(); + var asn1 = forge3.asn1; + exports.privateKeyValidator = { + // PrivateKeyInfo + name: "PrivateKeyInfo", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + // Version (INTEGER) + name: "PrivateKeyInfo.version", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.INTEGER, + constructed: false, + capture: "privateKeyVersion" + }, { + // privateKeyAlgorithm + name: "PrivateKeyInfo.privateKeyAlgorithm", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + name: "AlgorithmIdentifier.algorithm", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.OID, + constructed: false, + capture: "privateKeyOid" + }] + }, { + // PrivateKey + name: "PrivateKeyInfo", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.OCTETSTRING, + constructed: false, + capture: "privateKey" + }] + }; + exports.publicKeyValidator = { + name: "SubjectPublicKeyInfo", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + captureAsn1: "subjectPublicKeyInfo", + value: [ + { + name: "SubjectPublicKeyInfo.AlgorithmIdentifier", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + name: "AlgorithmIdentifier.algorithm", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.OID, + constructed: false, + capture: "publicKeyOid" + }] + }, + // capture group for ed25519PublicKey + { + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.BITSTRING, + constructed: false, + composed: true, + captureBitStringValue: "ed25519PublicKey" + } + // FIXME: this is capture group for rsaPublicKey, use it in this API or + // discard? + /* { + // subjectPublicKey + name: 'SubjectPublicKeyInfo.subjectPublicKey', + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.BITSTRING, + constructed: false, + value: [{ + // RSAPublicKey + name: 'SubjectPublicKeyInfo.subjectPublicKey.RSAPublicKey', + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + optional: true, + captureAsn1: 'rsaPublicKey' + }] + } */ + ] + }; + } +}); + +// node_modules/node-forge/lib/ed25519.js +var require_ed25519 = __commonJS({ + "node_modules/node-forge/lib/ed25519.js"(exports, module) { + var forge3 = require_forge(); + require_jsbn(); + require_random(); + require_sha512(); + require_util(); + var asn1Validator = require_asn1_validator(); + var publicKeyValidator = asn1Validator.publicKeyValidator; + var privateKeyValidator = asn1Validator.privateKeyValidator; + if (typeof BigInteger2 === "undefined") { + BigInteger2 = forge3.jsbn.BigInteger; + } + var BigInteger2; + var ByteBuffer = forge3.util.ByteBuffer; + var NativeBuffer = typeof Buffer === "undefined" ? Uint8Array : Buffer; + forge3.pki = forge3.pki || {}; + module.exports = forge3.pki.ed25519 = forge3.ed25519 = forge3.ed25519 || {}; + var ed25519 = forge3.ed25519; + ed25519.constants = {}; + ed25519.constants.PUBLIC_KEY_BYTE_LENGTH = 32; + ed25519.constants.PRIVATE_KEY_BYTE_LENGTH = 64; + ed25519.constants.SEED_BYTE_LENGTH = 32; + ed25519.constants.SIGN_BYTE_LENGTH = 64; + ed25519.constants.HASH_BYTE_LENGTH = 64; + ed25519.generateKeyPair = function(options) { + options = options || {}; + var seed = options.seed; + if (seed === void 0) { + seed = forge3.random.getBytesSync(ed25519.constants.SEED_BYTE_LENGTH); + } else if (typeof seed === "string") { + if (seed.length !== ed25519.constants.SEED_BYTE_LENGTH) { + throw new TypeError( + '"seed" must be ' + ed25519.constants.SEED_BYTE_LENGTH + " bytes in length." + ); + } + } else if (!(seed instanceof Uint8Array)) { + throw new TypeError( + '"seed" must be a node.js Buffer, Uint8Array, or a binary string.' + ); + } + seed = messageToNativeBuffer({ message: seed, encoding: "binary" }); + var pk = new NativeBuffer(ed25519.constants.PUBLIC_KEY_BYTE_LENGTH); + var sk = new NativeBuffer(ed25519.constants.PRIVATE_KEY_BYTE_LENGTH); + for (var i = 0; i < 32; ++i) { + sk[i] = seed[i]; + } + crypto_sign_keypair(pk, sk); + return { publicKey: pk, privateKey: sk }; + }; + ed25519.privateKeyFromAsn1 = function(obj) { + var capture = {}; + var errors = []; + var valid = forge3.asn1.validate(obj, privateKeyValidator, capture, errors); + if (!valid) { + var error = new Error("Invalid Key."); + error.errors = errors; + throw error; + } + var oid = forge3.asn1.derToOid(capture.privateKeyOid); + var ed25519Oid = forge3.oids.EdDSA25519; + if (oid !== ed25519Oid) { + throw new Error('Invalid OID "' + oid + '"; OID must be "' + ed25519Oid + '".'); + } + var privateKey = capture.privateKey; + var privateKeyBytes = messageToNativeBuffer({ + message: forge3.asn1.fromDer(privateKey).value, + encoding: "binary" + }); + return { privateKeyBytes }; + }; + ed25519.publicKeyFromAsn1 = function(obj) { + var capture = {}; + var errors = []; + var valid = forge3.asn1.validate(obj, publicKeyValidator, capture, errors); + if (!valid) { + var error = new Error("Invalid Key."); + error.errors = errors; + throw error; + } + var oid = forge3.asn1.derToOid(capture.publicKeyOid); + var ed25519Oid = forge3.oids.EdDSA25519; + if (oid !== ed25519Oid) { + throw new Error('Invalid OID "' + oid + '"; OID must be "' + ed25519Oid + '".'); + } + var publicKeyBytes = capture.ed25519PublicKey; + if (publicKeyBytes.length !== ed25519.constants.PUBLIC_KEY_BYTE_LENGTH) { + throw new Error("Key length is invalid."); + } + return messageToNativeBuffer({ + message: publicKeyBytes, + encoding: "binary" + }); + }; + ed25519.publicKeyFromPrivateKey = function(options) { + options = options || {}; + var privateKey = messageToNativeBuffer({ + message: options.privateKey, + encoding: "binary" + }); + if (privateKey.length !== ed25519.constants.PRIVATE_KEY_BYTE_LENGTH) { + throw new TypeError( + '"options.privateKey" must have a byte length of ' + ed25519.constants.PRIVATE_KEY_BYTE_LENGTH + ); + } + var pk = new NativeBuffer(ed25519.constants.PUBLIC_KEY_BYTE_LENGTH); + for (var i = 0; i < pk.length; ++i) { + pk[i] = privateKey[32 + i]; + } + return pk; + }; + ed25519.sign = function(options) { + options = options || {}; + var msg = messageToNativeBuffer(options); + var privateKey = messageToNativeBuffer({ + message: options.privateKey, + encoding: "binary" + }); + if (privateKey.length === ed25519.constants.SEED_BYTE_LENGTH) { + var keyPair = ed25519.generateKeyPair({ seed: privateKey }); + privateKey = keyPair.privateKey; + } else if (privateKey.length !== ed25519.constants.PRIVATE_KEY_BYTE_LENGTH) { + throw new TypeError( + '"options.privateKey" must have a byte length of ' + ed25519.constants.SEED_BYTE_LENGTH + " or " + ed25519.constants.PRIVATE_KEY_BYTE_LENGTH + ); + } + var signedMsg = new NativeBuffer( + ed25519.constants.SIGN_BYTE_LENGTH + msg.length + ); + crypto_sign(signedMsg, msg, msg.length, privateKey); + var sig = new NativeBuffer(ed25519.constants.SIGN_BYTE_LENGTH); + for (var i = 0; i < sig.length; ++i) { + sig[i] = signedMsg[i]; + } + return sig; + }; + ed25519.verify = function(options) { + options = options || {}; + var msg = messageToNativeBuffer(options); + if (options.signature === void 0) { + throw new TypeError( + '"options.signature" must be a node.js Buffer, a Uint8Array, a forge ByteBuffer, or a binary string.' + ); + } + var sig = messageToNativeBuffer({ + message: options.signature, + encoding: "binary" + }); + if (sig.length !== ed25519.constants.SIGN_BYTE_LENGTH) { + throw new TypeError( + '"options.signature" must have a byte length of ' + ed25519.constants.SIGN_BYTE_LENGTH + ); + } + var publicKey = messageToNativeBuffer({ + message: options.publicKey, + encoding: "binary" + }); + if (publicKey.length !== ed25519.constants.PUBLIC_KEY_BYTE_LENGTH) { + throw new TypeError( + '"options.publicKey" must have a byte length of ' + ed25519.constants.PUBLIC_KEY_BYTE_LENGTH + ); + } + var sm = new NativeBuffer(ed25519.constants.SIGN_BYTE_LENGTH + msg.length); + var m = new NativeBuffer(ed25519.constants.SIGN_BYTE_LENGTH + msg.length); + var i; + for (i = 0; i < ed25519.constants.SIGN_BYTE_LENGTH; ++i) { + sm[i] = sig[i]; + } + for (i = 0; i < msg.length; ++i) { + sm[i + ed25519.constants.SIGN_BYTE_LENGTH] = msg[i]; + } + return crypto_sign_open(m, sm, sm.length, publicKey) >= 0; + }; + function messageToNativeBuffer(options) { + var message = options.message; + if (message instanceof Uint8Array || message instanceof NativeBuffer) { + return message; + } + var encoding = options.encoding; + if (message === void 0) { + if (options.md) { + message = options.md.digest().getBytes(); + encoding = "binary"; + } else { + throw new TypeError('"options.message" or "options.md" not specified.'); + } + } + if (typeof message === "string" && !encoding) { + throw new TypeError('"options.encoding" must be "binary" or "utf8".'); + } + if (typeof message === "string") { + if (typeof Buffer !== "undefined") { + return Buffer.from(message, encoding); + } + message = new ByteBuffer(message, encoding); + } else if (!(message instanceof ByteBuffer)) { + throw new TypeError( + '"options.message" must be a node.js Buffer, a Uint8Array, a forge ByteBuffer, or a string with "options.encoding" specifying its encoding.' + ); + } + var buffer = new NativeBuffer(message.length()); + for (var i = 0; i < buffer.length; ++i) { + buffer[i] = message.at(i); + } + return buffer; + } + var gf0 = gf(); + var gf1 = gf([1]); + var D = gf([ + 30883, + 4953, + 19914, + 30187, + 55467, + 16705, + 2637, + 112, + 59544, + 30585, + 16505, + 36039, + 65139, + 11119, + 27886, + 20995 + ]); + var D2 = gf([ + 61785, + 9906, + 39828, + 60374, + 45398, + 33411, + 5274, + 224, + 53552, + 61171, + 33010, + 6542, + 64743, + 22239, + 55772, + 9222 + ]); + var X = gf([ + 54554, + 36645, + 11616, + 51542, + 42930, + 38181, + 51040, + 26924, + 56412, + 64982, + 57905, + 49316, + 21502, + 52590, + 14035, + 8553 + ]); + var Y = gf([ + 26200, + 26214, + 26214, + 26214, + 26214, + 26214, + 26214, + 26214, + 26214, + 26214, + 26214, + 26214, + 26214, + 26214, + 26214, + 26214 + ]); + var L = new Float64Array([ + 237, + 211, + 245, + 92, + 26, + 99, + 18, + 88, + 214, + 156, + 247, + 162, + 222, + 249, + 222, + 20, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 16 + ]); + var I = gf([ + 41136, + 18958, + 6951, + 50414, + 58488, + 44335, + 6150, + 12099, + 55207, + 15867, + 153, + 11085, + 57099, + 20417, + 9344, + 11139 + ]); + function sha512(msg, msgLen) { + var md = forge3.md.sha512.create(); + var buffer = new ByteBuffer(msg); + md.update(buffer.getBytes(msgLen), "binary"); + var hash = md.digest().getBytes(); + if (typeof Buffer !== "undefined") { + return Buffer.from(hash, "binary"); + } + var out = new NativeBuffer(ed25519.constants.HASH_BYTE_LENGTH); + for (var i = 0; i < 64; ++i) { + out[i] = hash.charCodeAt(i); + } + return out; + } + function crypto_sign_keypair(pk, sk) { + var p = [gf(), gf(), gf(), gf()]; + var i; + var d = sha512(sk, 32); + d[0] &= 248; + d[31] &= 127; + d[31] |= 64; + scalarbase(p, d); + pack(pk, p); + for (i = 0; i < 32; ++i) { + sk[i + 32] = pk[i]; + } + return 0; + } + function crypto_sign(sm, m, n, sk) { + var i, j, x = new Float64Array(64); + var p = [gf(), gf(), gf(), gf()]; + var d = sha512(sk, 32); + d[0] &= 248; + d[31] &= 127; + d[31] |= 64; + var smlen = n + 64; + for (i = 0; i < n; ++i) { + sm[64 + i] = m[i]; + } + for (i = 0; i < 32; ++i) { + sm[32 + i] = d[32 + i]; + } + var r = sha512(sm.subarray(32), n + 32); + reduce(r); + scalarbase(p, r); + pack(sm, p); + for (i = 32; i < 64; ++i) { + sm[i] = sk[i]; + } + var h = sha512(sm, n + 64); + reduce(h); + for (i = 32; i < 64; ++i) { + x[i] = 0; + } + for (i = 0; i < 32; ++i) { + x[i] = r[i]; + } + for (i = 0; i < 32; ++i) { + for (j = 0; j < 32; j++) { + x[i + j] += h[i] * d[j]; + } + } + modL(sm.subarray(32), x); + return smlen; + } + function crypto_sign_open(m, sm, n, pk) { + var i, mlen; + var t = new NativeBuffer(32); + var p = [gf(), gf(), gf(), gf()], q = [gf(), gf(), gf(), gf()]; + mlen = -1; + if (n < 64) { + return -1; + } + if (unpackneg(q, pk)) { + return -1; + } + for (i = 0; i < n; ++i) { + m[i] = sm[i]; + } + for (i = 0; i < 32; ++i) { + m[i + 32] = pk[i]; + } + var h = sha512(m, n); + reduce(h); + scalarmult(p, q, h); + scalarbase(q, sm.subarray(32)); + add(p, q); + pack(t, p); + n -= 64; + if (crypto_verify_32(sm, 0, t, 0)) { + for (i = 0; i < n; ++i) { + m[i] = 0; + } + return -1; + } + for (i = 0; i < n; ++i) { + m[i] = sm[i + 64]; + } + mlen = n; + return mlen; + } + function modL(r, x) { + var carry, i, j, k; + for (i = 63; i >= 32; --i) { + carry = 0; + for (j = i - 32, k = i - 12; j < k; ++j) { + x[j] += carry - 16 * x[i] * L[j - (i - 32)]; + carry = x[j] + 128 >> 8; + x[j] -= carry * 256; + } + x[j] += carry; + x[i] = 0; + } + carry = 0; + for (j = 0; j < 32; ++j) { + x[j] += carry - (x[31] >> 4) * L[j]; + carry = x[j] >> 8; + x[j] &= 255; + } + for (j = 0; j < 32; ++j) { + x[j] -= carry * L[j]; + } + for (i = 0; i < 32; ++i) { + x[i + 1] += x[i] >> 8; + r[i] = x[i] & 255; + } + } + function reduce(r) { + var x = new Float64Array(64); + for (var i = 0; i < 64; ++i) { + x[i] = r[i]; + r[i] = 0; + } + modL(r, x); + } + function add(p, q) { + var a = gf(), b = gf(), c = gf(), d = gf(), e = gf(), f = gf(), g = gf(), h = gf(), t = gf(); + Z(a, p[1], p[0]); + Z(t, q[1], q[0]); + M(a, a, t); + A(b, p[0], p[1]); + A(t, q[0], q[1]); + M(b, b, t); + M(c, p[3], q[3]); + M(c, c, D2); + M(d, p[2], q[2]); + A(d, d, d); + Z(e, b, a); + Z(f, d, c); + A(g, d, c); + A(h, b, a); + M(p[0], e, f); + M(p[1], h, g); + M(p[2], g, f); + M(p[3], e, h); + } + function cswap(p, q, b) { + for (var i = 0; i < 4; ++i) { + sel25519(p[i], q[i], b); + } + } + function pack(r, p) { + var tx = gf(), ty = gf(), zi = gf(); + inv25519(zi, p[2]); + M(tx, p[0], zi); + M(ty, p[1], zi); + pack25519(r, ty); + r[31] ^= par25519(tx) << 7; + } + function pack25519(o, n) { + var i, j, b; + var m = gf(), t = gf(); + for (i = 0; i < 16; ++i) { + t[i] = n[i]; + } + car25519(t); + car25519(t); + car25519(t); + for (j = 0; j < 2; ++j) { + m[0] = t[0] - 65517; + for (i = 1; i < 15; ++i) { + m[i] = t[i] - 65535 - (m[i - 1] >> 16 & 1); + m[i - 1] &= 65535; + } + m[15] = t[15] - 32767 - (m[14] >> 16 & 1); + b = m[15] >> 16 & 1; + m[14] &= 65535; + sel25519(t, m, 1 - b); + } + for (i = 0; i < 16; i++) { + o[2 * i] = t[i] & 255; + o[2 * i + 1] = t[i] >> 8; + } + } + function unpackneg(r, p) { + var t = gf(), chk = gf(), num = gf(), den = gf(), den2 = gf(), den4 = gf(), den6 = gf(); + set25519(r[2], gf1); + unpack25519(r[1], p); + S(num, r[1]); + M(den, num, D); + Z(num, num, r[2]); + A(den, r[2], den); + S(den2, den); + S(den4, den2); + M(den6, den4, den2); + M(t, den6, num); + M(t, t, den); + pow2523(t, t); + M(t, t, num); + M(t, t, den); + M(t, t, den); + M(r[0], t, den); + S(chk, r[0]); + M(chk, chk, den); + if (neq25519(chk, num)) { + M(r[0], r[0], I); + } + S(chk, r[0]); + M(chk, chk, den); + if (neq25519(chk, num)) { + return -1; + } + if (par25519(r[0]) === p[31] >> 7) { + Z(r[0], gf0, r[0]); + } + M(r[3], r[0], r[1]); + return 0; + } + function unpack25519(o, n) { + var i; + for (i = 0; i < 16; ++i) { + o[i] = n[2 * i] + (n[2 * i + 1] << 8); + } + o[15] &= 32767; + } + function pow2523(o, i) { + var c = gf(); + var a; + for (a = 0; a < 16; ++a) { + c[a] = i[a]; + } + for (a = 250; a >= 0; --a) { + S(c, c); + if (a !== 1) { + M(c, c, i); + } + } + for (a = 0; a < 16; ++a) { + o[a] = c[a]; + } + } + function neq25519(a, b) { + var c = new NativeBuffer(32); + var d = new NativeBuffer(32); + pack25519(c, a); + pack25519(d, b); + return crypto_verify_32(c, 0, d, 0); + } + function crypto_verify_32(x, xi, y, yi) { + return vn(x, xi, y, yi, 32); + } + function vn(x, xi, y, yi, n) { + var i, d = 0; + for (i = 0; i < n; ++i) { + d |= x[xi + i] ^ y[yi + i]; + } + return (1 & d - 1 >>> 8) - 1; + } + function par25519(a) { + var d = new NativeBuffer(32); + pack25519(d, a); + return d[0] & 1; + } + function scalarmult(p, q, s) { + var b, i; + set25519(p[0], gf0); + set25519(p[1], gf1); + set25519(p[2], gf1); + set25519(p[3], gf0); + for (i = 255; i >= 0; --i) { + b = s[i / 8 | 0] >> (i & 7) & 1; + cswap(p, q, b); + add(q, p); + add(p, p); + cswap(p, q, b); + } + } + function scalarbase(p, s) { + var q = [gf(), gf(), gf(), gf()]; + set25519(q[0], X); + set25519(q[1], Y); + set25519(q[2], gf1); + M(q[3], X, Y); + scalarmult(p, q, s); + } + function set25519(r, a) { + var i; + for (i = 0; i < 16; i++) { + r[i] = a[i] | 0; + } + } + function inv25519(o, i) { + var c = gf(); + var a; + for (a = 0; a < 16; ++a) { + c[a] = i[a]; + } + for (a = 253; a >= 0; --a) { + S(c, c); + if (a !== 2 && a !== 4) { + M(c, c, i); + } + } + for (a = 0; a < 16; ++a) { + o[a] = c[a]; + } + } + function car25519(o) { + var i, v, c = 1; + for (i = 0; i < 16; ++i) { + v = o[i] + c + 65535; + c = Math.floor(v / 65536); + o[i] = v - c * 65536; + } + o[0] += c - 1 + 37 * (c - 1); + } + function sel25519(p, q, b) { + var t, c = ~(b - 1); + for (var i = 0; i < 16; ++i) { + t = c & (p[i] ^ q[i]); + p[i] ^= t; + q[i] ^= t; + } + } + function gf(init) { + var i, r = new Float64Array(16); + if (init) { + for (i = 0; i < init.length; ++i) { + r[i] = init[i]; + } + } + return r; + } + function A(o, a, b) { + for (var i = 0; i < 16; ++i) { + o[i] = a[i] + b[i]; + } + } + function Z(o, a, b) { + for (var i = 0; i < 16; ++i) { + o[i] = a[i] - b[i]; + } + } + function S(o, a) { + M(o, a, a); + } + function M(o, a, b) { + var v, c, t0 = 0, t1 = 0, t2 = 0, t3 = 0, t4 = 0, t5 = 0, t6 = 0, t7 = 0, t8 = 0, t9 = 0, t10 = 0, t11 = 0, t12 = 0, t13 = 0, t14 = 0, t15 = 0, t16 = 0, t17 = 0, t18 = 0, t19 = 0, t20 = 0, t21 = 0, t22 = 0, t23 = 0, t24 = 0, t25 = 0, t26 = 0, t27 = 0, t28 = 0, t29 = 0, t30 = 0, b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3], b4 = b[4], b5 = b[5], b6 = b[6], b7 = b[7], b8 = b[8], b9 = b[9], b10 = b[10], b11 = b[11], b12 = b[12], b13 = b[13], b14 = b[14], b15 = b[15]; + v = a[0]; + t0 += v * b0; + t1 += v * b1; + t2 += v * b2; + t3 += v * b3; + t4 += v * b4; + t5 += v * b5; + t6 += v * b6; + t7 += v * b7; + t8 += v * b8; + t9 += v * b9; + t10 += v * b10; + t11 += v * b11; + t12 += v * b12; + t13 += v * b13; + t14 += v * b14; + t15 += v * b15; + v = a[1]; + t1 += v * b0; + t2 += v * b1; + t3 += v * b2; + t4 += v * b3; + t5 += v * b4; + t6 += v * b5; + t7 += v * b6; + t8 += v * b7; + t9 += v * b8; + t10 += v * b9; + t11 += v * b10; + t12 += v * b11; + t13 += v * b12; + t14 += v * b13; + t15 += v * b14; + t16 += v * b15; + v = a[2]; + t2 += v * b0; + t3 += v * b1; + t4 += v * b2; + t5 += v * b3; + t6 += v * b4; + t7 += v * b5; + t8 += v * b6; + t9 += v * b7; + t10 += v * b8; + t11 += v * b9; + t12 += v * b10; + t13 += v * b11; + t14 += v * b12; + t15 += v * b13; + t16 += v * b14; + t17 += v * b15; + v = a[3]; + t3 += v * b0; + t4 += v * b1; + t5 += v * b2; + t6 += v * b3; + t7 += v * b4; + t8 += v * b5; + t9 += v * b6; + t10 += v * b7; + t11 += v * b8; + t12 += v * b9; + t13 += v * b10; + t14 += v * b11; + t15 += v * b12; + t16 += v * b13; + t17 += v * b14; + t18 += v * b15; + v = a[4]; + t4 += v * b0; + t5 += v * b1; + t6 += v * b2; + t7 += v * b3; + t8 += v * b4; + t9 += v * b5; + t10 += v * b6; + t11 += v * b7; + t12 += v * b8; + t13 += v * b9; + t14 += v * b10; + t15 += v * b11; + t16 += v * b12; + t17 += v * b13; + t18 += v * b14; + t19 += v * b15; + v = a[5]; + t5 += v * b0; + t6 += v * b1; + t7 += v * b2; + t8 += v * b3; + t9 += v * b4; + t10 += v * b5; + t11 += v * b6; + t12 += v * b7; + t13 += v * b8; + t14 += v * b9; + t15 += v * b10; + t16 += v * b11; + t17 += v * b12; + t18 += v * b13; + t19 += v * b14; + t20 += v * b15; + v = a[6]; + t6 += v * b0; + t7 += v * b1; + t8 += v * b2; + t9 += v * b3; + t10 += v * b4; + t11 += v * b5; + t12 += v * b6; + t13 += v * b7; + t14 += v * b8; + t15 += v * b9; + t16 += v * b10; + t17 += v * b11; + t18 += v * b12; + t19 += v * b13; + t20 += v * b14; + t21 += v * b15; + v = a[7]; + t7 += v * b0; + t8 += v * b1; + t9 += v * b2; + t10 += v * b3; + t11 += v * b4; + t12 += v * b5; + t13 += v * b6; + t14 += v * b7; + t15 += v * b8; + t16 += v * b9; + t17 += v * b10; + t18 += v * b11; + t19 += v * b12; + t20 += v * b13; + t21 += v * b14; + t22 += v * b15; + v = a[8]; + t8 += v * b0; + t9 += v * b1; + t10 += v * b2; + t11 += v * b3; + t12 += v * b4; + t13 += v * b5; + t14 += v * b6; + t15 += v * b7; + t16 += v * b8; + t17 += v * b9; + t18 += v * b10; + t19 += v * b11; + t20 += v * b12; + t21 += v * b13; + t22 += v * b14; + t23 += v * b15; + v = a[9]; + t9 += v * b0; + t10 += v * b1; + t11 += v * b2; + t12 += v * b3; + t13 += v * b4; + t14 += v * b5; + t15 += v * b6; + t16 += v * b7; + t17 += v * b8; + t18 += v * b9; + t19 += v * b10; + t20 += v * b11; + t21 += v * b12; + t22 += v * b13; + t23 += v * b14; + t24 += v * b15; + v = a[10]; + t10 += v * b0; + t11 += v * b1; + t12 += v * b2; + t13 += v * b3; + t14 += v * b4; + t15 += v * b5; + t16 += v * b6; + t17 += v * b7; + t18 += v * b8; + t19 += v * b9; + t20 += v * b10; + t21 += v * b11; + t22 += v * b12; + t23 += v * b13; + t24 += v * b14; + t25 += v * b15; + v = a[11]; + t11 += v * b0; + t12 += v * b1; + t13 += v * b2; + t14 += v * b3; + t15 += v * b4; + t16 += v * b5; + t17 += v * b6; + t18 += v * b7; + t19 += v * b8; + t20 += v * b9; + t21 += v * b10; + t22 += v * b11; + t23 += v * b12; + t24 += v * b13; + t25 += v * b14; + t26 += v * b15; + v = a[12]; + t12 += v * b0; + t13 += v * b1; + t14 += v * b2; + t15 += v * b3; + t16 += v * b4; + t17 += v * b5; + t18 += v * b6; + t19 += v * b7; + t20 += v * b8; + t21 += v * b9; + t22 += v * b10; + t23 += v * b11; + t24 += v * b12; + t25 += v * b13; + t26 += v * b14; + t27 += v * b15; + v = a[13]; + t13 += v * b0; + t14 += v * b1; + t15 += v * b2; + t16 += v * b3; + t17 += v * b4; + t18 += v * b5; + t19 += v * b6; + t20 += v * b7; + t21 += v * b8; + t22 += v * b9; + t23 += v * b10; + t24 += v * b11; + t25 += v * b12; + t26 += v * b13; + t27 += v * b14; + t28 += v * b15; + v = a[14]; + t14 += v * b0; + t15 += v * b1; + t16 += v * b2; + t17 += v * b3; + t18 += v * b4; + t19 += v * b5; + t20 += v * b6; + t21 += v * b7; + t22 += v * b8; + t23 += v * b9; + t24 += v * b10; + t25 += v * b11; + t26 += v * b12; + t27 += v * b13; + t28 += v * b14; + t29 += v * b15; + v = a[15]; + t15 += v * b0; + t16 += v * b1; + t17 += v * b2; + t18 += v * b3; + t19 += v * b4; + t20 += v * b5; + t21 += v * b6; + t22 += v * b7; + t23 += v * b8; + t24 += v * b9; + t25 += v * b10; + t26 += v * b11; + t27 += v * b12; + t28 += v * b13; + t29 += v * b14; + t30 += v * b15; + t0 += 38 * t16; + t1 += 38 * t17; + t2 += 38 * t18; + t3 += 38 * t19; + t4 += 38 * t20; + t5 += 38 * t21; + t6 += 38 * t22; + t7 += 38 * t23; + t8 += 38 * t24; + t9 += 38 * t25; + t10 += 38 * t26; + t11 += 38 * t27; + t12 += 38 * t28; + t13 += 38 * t29; + t14 += 38 * t30; + c = 1; + v = t0 + c + 65535; + c = Math.floor(v / 65536); + t0 = v - c * 65536; + v = t1 + c + 65535; + c = Math.floor(v / 65536); + t1 = v - c * 65536; + v = t2 + c + 65535; + c = Math.floor(v / 65536); + t2 = v - c * 65536; + v = t3 + c + 65535; + c = Math.floor(v / 65536); + t3 = v - c * 65536; + v = t4 + c + 65535; + c = Math.floor(v / 65536); + t4 = v - c * 65536; + v = t5 + c + 65535; + c = Math.floor(v / 65536); + t5 = v - c * 65536; + v = t6 + c + 65535; + c = Math.floor(v / 65536); + t6 = v - c * 65536; + v = t7 + c + 65535; + c = Math.floor(v / 65536); + t7 = v - c * 65536; + v = t8 + c + 65535; + c = Math.floor(v / 65536); + t8 = v - c * 65536; + v = t9 + c + 65535; + c = Math.floor(v / 65536); + t9 = v - c * 65536; + v = t10 + c + 65535; + c = Math.floor(v / 65536); + t10 = v - c * 65536; + v = t11 + c + 65535; + c = Math.floor(v / 65536); + t11 = v - c * 65536; + v = t12 + c + 65535; + c = Math.floor(v / 65536); + t12 = v - c * 65536; + v = t13 + c + 65535; + c = Math.floor(v / 65536); + t13 = v - c * 65536; + v = t14 + c + 65535; + c = Math.floor(v / 65536); + t14 = v - c * 65536; + v = t15 + c + 65535; + c = Math.floor(v / 65536); + t15 = v - c * 65536; + t0 += c - 1 + 37 * (c - 1); + c = 1; + v = t0 + c + 65535; + c = Math.floor(v / 65536); + t0 = v - c * 65536; + v = t1 + c + 65535; + c = Math.floor(v / 65536); + t1 = v - c * 65536; + v = t2 + c + 65535; + c = Math.floor(v / 65536); + t2 = v - c * 65536; + v = t3 + c + 65535; + c = Math.floor(v / 65536); + t3 = v - c * 65536; + v = t4 + c + 65535; + c = Math.floor(v / 65536); + t4 = v - c * 65536; + v = t5 + c + 65535; + c = Math.floor(v / 65536); + t5 = v - c * 65536; + v = t6 + c + 65535; + c = Math.floor(v / 65536); + t6 = v - c * 65536; + v = t7 + c + 65535; + c = Math.floor(v / 65536); + t7 = v - c * 65536; + v = t8 + c + 65535; + c = Math.floor(v / 65536); + t8 = v - c * 65536; + v = t9 + c + 65535; + c = Math.floor(v / 65536); + t9 = v - c * 65536; + v = t10 + c + 65535; + c = Math.floor(v / 65536); + t10 = v - c * 65536; + v = t11 + c + 65535; + c = Math.floor(v / 65536); + t11 = v - c * 65536; + v = t12 + c + 65535; + c = Math.floor(v / 65536); + t12 = v - c * 65536; + v = t13 + c + 65535; + c = Math.floor(v / 65536); + t13 = v - c * 65536; + v = t14 + c + 65535; + c = Math.floor(v / 65536); + t14 = v - c * 65536; + v = t15 + c + 65535; + c = Math.floor(v / 65536); + t15 = v - c * 65536; + t0 += c - 1 + 37 * (c - 1); + o[0] = t0; + o[1] = t1; + o[2] = t2; + o[3] = t3; + o[4] = t4; + o[5] = t5; + o[6] = t6; + o[7] = t7; + o[8] = t8; + o[9] = t9; + o[10] = t10; + o[11] = t11; + o[12] = t12; + o[13] = t13; + o[14] = t14; + o[15] = t15; + } + } +}); + +// node_modules/node-forge/lib/kem.js +var require_kem = __commonJS({ + "node_modules/node-forge/lib/kem.js"(exports, module) { + var forge3 = require_forge(); + require_util(); + require_random(); + require_jsbn(); + module.exports = forge3.kem = forge3.kem || {}; + var BigInteger2 = forge3.jsbn.BigInteger; + forge3.kem.rsa = {}; + forge3.kem.rsa.create = function(kdf, options) { + options = options || {}; + var prng = options.prng || forge3.random; + var kem = {}; + kem.encrypt = function(publicKey, keyLength) { + var byteLength = Math.ceil(publicKey.n.bitLength() / 8); + var r; + do { + r = new BigInteger2( + forge3.util.bytesToHex(prng.getBytesSync(byteLength)), + 16 + ).mod(publicKey.n); + } while (r.compareTo(BigInteger2.ONE) <= 0); + r = forge3.util.hexToBytes(r.toString(16)); + var zeros = byteLength - r.length; + if (zeros > 0) { + r = forge3.util.fillString(String.fromCharCode(0), zeros) + r; + } + var encapsulation = publicKey.encrypt(r, "NONE"); + var key = kdf.generate(r, keyLength); + return { encapsulation, key }; + }; + kem.decrypt = function(privateKey, encapsulation, keyLength) { + var r = privateKey.decrypt(encapsulation, "NONE"); + return kdf.generate(r, keyLength); + }; + return kem; + }; + forge3.kem.kdf1 = function(md, digestLength) { + _createKDF(this, md, 0, digestLength || md.digestLength); + }; + forge3.kem.kdf2 = function(md, digestLength) { + _createKDF(this, md, 1, digestLength || md.digestLength); + }; + function _createKDF(kdf, md, counterStart, digestLength) { + kdf.generate = function(x, length) { + var key = new forge3.util.ByteBuffer(); + var k = Math.ceil(length / digestLength) + counterStart; + var c = new forge3.util.ByteBuffer(); + for (var i = counterStart; i < k; ++i) { + c.putInt32(i); + md.start(); + md.update(x + c.getBytes()); + var hash = md.digest(); + key.putBytes(hash.getBytes(digestLength)); + } + key.truncate(key.length() - length); + return key.getBytes(); + }; + } + } +}); + +// node_modules/node-forge/lib/log.js +var require_log = __commonJS({ + "node_modules/node-forge/lib/log.js"(exports, module) { + var forge3 = require_forge(); + require_util(); + module.exports = forge3.log = forge3.log || {}; + forge3.log.levels = [ + "none", + "error", + "warning", + "info", + "debug", + "verbose", + "max" + ]; + var sLevelInfo = {}; + var sLoggers = []; + var sConsoleLogger = null; + forge3.log.LEVEL_LOCKED = 1 << 1; + forge3.log.NO_LEVEL_CHECK = 1 << 2; + forge3.log.INTERPOLATE = 1 << 3; + for (i = 0; i < forge3.log.levels.length; ++i) { + level = forge3.log.levels[i]; + sLevelInfo[level] = { + index: i, + name: level.toUpperCase() + }; + } + var level; + var i; + forge3.log.logMessage = function(message) { + var messageLevelIndex = sLevelInfo[message.level].index; + for (var i2 = 0; i2 < sLoggers.length; ++i2) { + var logger2 = sLoggers[i2]; + if (logger2.flags & forge3.log.NO_LEVEL_CHECK) { + logger2.f(message); + } else { + var loggerLevelIndex = sLevelInfo[logger2.level].index; + if (messageLevelIndex <= loggerLevelIndex) { + logger2.f(logger2, message); + } + } + } + }; + forge3.log.prepareStandard = function(message) { + if (!("standard" in message)) { + message.standard = sLevelInfo[message.level].name + //' ' + +message.timestamp + + " [" + message.category + "] " + message.message; + } + }; + forge3.log.prepareFull = function(message) { + if (!("full" in message)) { + var args = [message.message]; + args = args.concat([]); + message.full = forge3.util.format.apply(this, args); + } + }; + forge3.log.prepareStandardFull = function(message) { + if (!("standardFull" in message)) { + forge3.log.prepareStandard(message); + message.standardFull = message.standard; + } + }; + if (true) { + levels = ["error", "warning", "info", "debug", "verbose"]; + for (i = 0; i < levels.length; ++i) { + (function(level2) { + forge3.log[level2] = function(category, message) { + var args = Array.prototype.slice.call(arguments).slice(2); + var msg = { + timestamp: /* @__PURE__ */ new Date(), + level: level2, + category, + message, + "arguments": args + /*standard*/ + /*full*/ + /*fullMessage*/ + }; + forge3.log.logMessage(msg); + }; + })(levels[i]); + } + } + var levels; + var i; + forge3.log.makeLogger = function(logFunction) { + var logger2 = { + flags: 0, + f: logFunction + }; + forge3.log.setLevel(logger2, "none"); + return logger2; + }; + forge3.log.setLevel = function(logger2, level2) { + var rval = false; + if (logger2 && !(logger2.flags & forge3.log.LEVEL_LOCKED)) { + for (var i2 = 0; i2 < forge3.log.levels.length; ++i2) { + var aValidLevel = forge3.log.levels[i2]; + if (level2 == aValidLevel) { + logger2.level = level2; + rval = true; + break; + } + } + } + return rval; + }; + forge3.log.lock = function(logger2, lock2) { + if (typeof lock2 === "undefined" || lock2) { + logger2.flags |= forge3.log.LEVEL_LOCKED; + } else { + logger2.flags &= ~forge3.log.LEVEL_LOCKED; + } + }; + forge3.log.addLogger = function(logger2) { + sLoggers.push(logger2); + }; + if (typeof console !== "undefined" && "log" in console) { + if (console.error && console.warn && console.info && console.debug) { + levelHandlers = { + error: console.error, + warning: console.warn, + info: console.info, + debug: console.debug, + verbose: console.debug + }; + f = function(logger2, message) { + forge3.log.prepareStandard(message); + var handler = levelHandlers[message.level]; + var args = [message.standard]; + args = args.concat(message["arguments"].slice()); + handler.apply(console, args); + }; + logger = forge3.log.makeLogger(f); + } else { + f = function(logger2, message) { + forge3.log.prepareStandardFull(message); + console.log(message.standardFull); + }; + logger = forge3.log.makeLogger(f); + } + forge3.log.setLevel(logger, "debug"); + forge3.log.addLogger(logger); + sConsoleLogger = logger; + } else { + console = { + log: function() { + } + }; + } + var logger; + var levelHandlers; + var f; + if (sConsoleLogger !== null && typeof window !== "undefined" && window.location) { + query = new URL(window.location.href).searchParams; + if (query.has("console.level")) { + forge3.log.setLevel( + sConsoleLogger, + query.get("console.level").slice(-1)[0] + ); + } + if (query.has("console.lock")) { + lock = query.get("console.lock").slice(-1)[0]; + if (lock == "true") { + forge3.log.lock(sConsoleLogger); + } + } + } + var query; + var lock; + forge3.log.consoleLogger = sConsoleLogger; + } +}); + +// node_modules/node-forge/lib/md.all.js +var require_md_all = __commonJS({ + "node_modules/node-forge/lib/md.all.js"(exports, module) { + module.exports = require_md(); + require_md5(); + require_sha1(); + require_sha256(); + require_sha512(); + } +}); + +// node_modules/node-forge/lib/pkcs7.js +var require_pkcs7 = __commonJS({ + "node_modules/node-forge/lib/pkcs7.js"(exports, module) { + var forge3 = require_forge(); + require_aes(); + require_asn1(); + require_des(); + require_oids(); + require_pem(); + require_pkcs7asn1(); + require_random(); + require_util(); + require_x509(); + var asn1 = forge3.asn1; + var p7 = module.exports = forge3.pkcs7 = forge3.pkcs7 || {}; + p7.messageFromPem = function(pem) { + var msg = forge3.pem.decode(pem)[0]; + if (msg.type !== "PKCS7") { + var error = new Error('Could not convert PKCS#7 message from PEM; PEM header type is not "PKCS#7".'); + error.headerType = msg.type; + throw error; + } + if (msg.procType && msg.procType.type === "ENCRYPTED") { + throw new Error("Could not convert PKCS#7 message from PEM; PEM is encrypted."); + } + var obj = asn1.fromDer(msg.body); + return p7.messageFromAsn1(obj); + }; + p7.messageToPem = function(msg, maxline) { + var pemObj = { + type: "PKCS7", + body: asn1.toDer(msg.toAsn1()).getBytes() + }; + return forge3.pem.encode(pemObj, { maxline }); + }; + p7.messageFromAsn1 = function(obj) { + var capture = {}; + var errors = []; + if (!asn1.validate(obj, p7.asn1.contentInfoValidator, capture, errors)) { + var error = new Error("Cannot read PKCS#7 message. ASN.1 object is not an PKCS#7 ContentInfo."); + error.errors = errors; + throw error; + } + var contentType = asn1.derToOid(capture.contentType); + var msg; + switch (contentType) { + case forge3.pki.oids.envelopedData: + msg = p7.createEnvelopedData(); + break; + case forge3.pki.oids.encryptedData: + msg = p7.createEncryptedData(); + break; + case forge3.pki.oids.signedData: + msg = p7.createSignedData(); + break; + default: + throw new Error("Cannot read PKCS#7 message. ContentType with OID " + contentType + " is not (yet) supported."); + } + msg.fromAsn1(capture.content.value[0]); + return msg; + }; + p7.createSignedData = function() { + var msg = null; + msg = { + type: forge3.pki.oids.signedData, + version: 1, + certificates: [], + crls: [], + // TODO: add json-formatted signer stuff here? + signers: [], + // populated during sign() + digestAlgorithmIdentifiers: [], + contentInfo: null, + signerInfos: [], + fromAsn1: function(obj) { + _fromAsn1(msg, obj, p7.asn1.signedDataValidator); + msg.certificates = []; + msg.crls = []; + msg.digestAlgorithmIdentifiers = []; + msg.contentInfo = null; + msg.signerInfos = []; + if (msg.rawCapture.certificates) { + var certs = msg.rawCapture.certificates.value; + for (var i = 0; i < certs.length; ++i) { + msg.certificates.push(forge3.pki.certificateFromAsn1(certs[i])); + } + } + }, + toAsn1: function() { + if (!msg.contentInfo) { + msg.sign(); + } + var certs = []; + for (var i = 0; i < msg.certificates.length; ++i) { + certs.push(forge3.pki.certificateToAsn1(msg.certificates[i])); + } + var crls = []; + var signedData = asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, [ + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // Version + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.INTEGER, + false, + asn1.integerToDer(msg.version).getBytes() + ), + // DigestAlgorithmIdentifiers + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.SET, + true, + msg.digestAlgorithmIdentifiers + ), + // ContentInfo + msg.contentInfo + ]) + ]); + if (certs.length > 0) { + signedData.value[0].value.push( + asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, certs) + ); + } + if (crls.length > 0) { + signedData.value[0].value.push( + asn1.create(asn1.Class.CONTEXT_SPECIFIC, 1, true, crls) + ); + } + signedData.value[0].value.push( + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.SET, + true, + msg.signerInfos + ) + ); + return asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.SEQUENCE, + true, + [ + // ContentType + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + asn1.oidToDer(msg.type).getBytes() + ), + // [0] SignedData + signedData + ] + ); + }, + /** + * Add (another) entity to list of signers. + * + * Note: If authenticatedAttributes are provided, then, per RFC 2315, + * they must include at least two attributes: content type and + * message digest. The message digest attribute value will be + * auto-calculated during signing and will be ignored if provided. + * + * Here's an example of providing these two attributes: + * + * forge.pkcs7.createSignedData(); + * p7.addSigner({ + * issuer: cert.issuer.attributes, + * serialNumber: cert.serialNumber, + * key: privateKey, + * digestAlgorithm: forge.pki.oids.sha1, + * authenticatedAttributes: [{ + * type: forge.pki.oids.contentType, + * value: forge.pki.oids.data + * }, { + * type: forge.pki.oids.messageDigest + * }] + * }); + * + * TODO: Support [subjectKeyIdentifier] as signer's ID. + * + * @param signer the signer information: + * key the signer's private key. + * [certificate] a certificate containing the public key + * associated with the signer's private key; use this option as + * an alternative to specifying signer.issuer and + * signer.serialNumber. + * [issuer] the issuer attributes (eg: cert.issuer.attributes). + * [serialNumber] the signer's certificate's serial number in + * hexadecimal (eg: cert.serialNumber). + * [digestAlgorithm] the message digest OID, as a string, to use + * (eg: forge.pki.oids.sha1). + * [authenticatedAttributes] an optional array of attributes + * to also sign along with the content. + */ + addSigner: function(signer) { + var issuer = signer.issuer; + var serialNumber = signer.serialNumber; + if (signer.certificate) { + var cert = signer.certificate; + if (typeof cert === "string") { + cert = forge3.pki.certificateFromPem(cert); + } + issuer = cert.issuer.attributes; + serialNumber = cert.serialNumber; + } + var key = signer.key; + if (!key) { + throw new Error( + "Could not add PKCS#7 signer; no private key specified." + ); + } + if (typeof key === "string") { + key = forge3.pki.privateKeyFromPem(key); + } + var digestAlgorithm = signer.digestAlgorithm || forge3.pki.oids.sha1; + switch (digestAlgorithm) { + case forge3.pki.oids.sha1: + case forge3.pki.oids.sha256: + case forge3.pki.oids.sha384: + case forge3.pki.oids.sha512: + case forge3.pki.oids.md5: + break; + default: + throw new Error( + "Could not add PKCS#7 signer; unknown message digest algorithm: " + digestAlgorithm + ); + } + var authenticatedAttributes = signer.authenticatedAttributes || []; + if (authenticatedAttributes.length > 0) { + var contentType = false; + var messageDigest = false; + for (var i = 0; i < authenticatedAttributes.length; ++i) { + var attr = authenticatedAttributes[i]; + if (!contentType && attr.type === forge3.pki.oids.contentType) { + contentType = true; + if (messageDigest) { + break; + } + continue; + } + if (!messageDigest && attr.type === forge3.pki.oids.messageDigest) { + messageDigest = true; + if (contentType) { + break; + } + continue; + } + } + if (!contentType || !messageDigest) { + throw new Error("Invalid signer.authenticatedAttributes. If signer.authenticatedAttributes is specified, then it must contain at least two attributes, PKCS #9 content-type and PKCS #9 message-digest."); + } + } + msg.signers.push({ + key, + version: 1, + issuer, + serialNumber, + digestAlgorithm, + signatureAlgorithm: forge3.pki.oids.rsaEncryption, + signature: null, + authenticatedAttributes, + unauthenticatedAttributes: [] + }); + }, + /** + * Signs the content. + * @param options Options to apply when signing: + * [detached] boolean. If signing should be done in detached mode. Defaults to false. + */ + sign: function(options) { + options = options || {}; + if (typeof msg.content !== "object" || msg.contentInfo === null) { + msg.contentInfo = asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.SEQUENCE, + true, + [ + // ContentType + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + asn1.oidToDer(forge3.pki.oids.data).getBytes() + ) + ] + ); + if ("content" in msg) { + var content; + if (msg.content instanceof forge3.util.ByteBuffer) { + content = msg.content.bytes(); + } else if (typeof msg.content === "string") { + content = forge3.util.encodeUtf8(msg.content); + } + if (options.detached) { + msg.detachedContent = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OCTETSTRING, false, content); + } else { + msg.contentInfo.value.push( + // [0] EXPLICIT content + asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, [ + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OCTETSTRING, + false, + content + ) + ]) + ); + } + } + } + if (msg.signers.length === 0) { + return; + } + var mds = addDigestAlgorithmIds(); + addSignerInfos(mds); + }, + verify: function() { + throw new Error("PKCS#7 signature verification not yet implemented."); + }, + /** + * Add a certificate. + * + * @param cert the certificate to add. + */ + addCertificate: function(cert) { + if (typeof cert === "string") { + cert = forge3.pki.certificateFromPem(cert); + } + msg.certificates.push(cert); + }, + /** + * Add a certificate revokation list. + * + * @param crl the certificate revokation list to add. + */ + addCertificateRevokationList: function(crl) { + throw new Error("PKCS#7 CRL support not yet implemented."); + } + }; + return msg; + function addDigestAlgorithmIds() { + var mds = {}; + for (var i = 0; i < msg.signers.length; ++i) { + var signer = msg.signers[i]; + var oid = signer.digestAlgorithm; + if (!(oid in mds)) { + mds[oid] = forge3.md[forge3.pki.oids[oid]].create(); + } + if (signer.authenticatedAttributes.length === 0) { + signer.md = mds[oid]; + } else { + signer.md = forge3.md[forge3.pki.oids[oid]].create(); + } + } + msg.digestAlgorithmIdentifiers = []; + for (var oid in mds) { + msg.digestAlgorithmIdentifiers.push( + // AlgorithmIdentifier + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // algorithm + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + asn1.oidToDer(oid).getBytes() + ), + // parameters (null) + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.NULL, false, "") + ]) + ); + } + return mds; + } + function addSignerInfos(mds) { + var content; + if (msg.detachedContent) { + content = msg.detachedContent; + } else { + content = msg.contentInfo.value[1]; + content = content.value[0]; + } + if (!content) { + throw new Error( + "Could not sign PKCS#7 message; there is no content to sign." + ); + } + var contentType = asn1.derToOid(msg.contentInfo.value[0].value); + var bytes = asn1.toDer(content); + bytes.getByte(); + asn1.getBerValueLength(bytes); + bytes = bytes.getBytes(); + for (var oid in mds) { + mds[oid].start().update(bytes); + } + var signingTime = /* @__PURE__ */ new Date(); + for (var i = 0; i < msg.signers.length; ++i) { + var signer = msg.signers[i]; + if (signer.authenticatedAttributes.length === 0) { + if (contentType !== forge3.pki.oids.data) { + throw new Error( + "Invalid signer; authenticatedAttributes must be present when the ContentInfo content type is not PKCS#7 Data." + ); + } + } else { + signer.authenticatedAttributesAsn1 = asn1.create( + asn1.Class.CONTEXT_SPECIFIC, + 0, + true, + [] + ); + var attrsAsn1 = asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.SET, + true, + [] + ); + for (var ai = 0; ai < signer.authenticatedAttributes.length; ++ai) { + var attr = signer.authenticatedAttributes[ai]; + if (attr.type === forge3.pki.oids.messageDigest) { + attr.value = mds[signer.digestAlgorithm].digest(); + } else if (attr.type === forge3.pki.oids.signingTime) { + if (!attr.value) { + attr.value = signingTime; + } + } + attrsAsn1.value.push(_attributeToAsn1(attr)); + signer.authenticatedAttributesAsn1.value.push(_attributeToAsn1(attr)); + } + bytes = asn1.toDer(attrsAsn1).getBytes(); + signer.md.start().update(bytes); + } + signer.signature = signer.key.sign(signer.md, "RSASSA-PKCS1-V1_5"); + } + msg.signerInfos = _signersToAsn1(msg.signers); + } + }; + p7.createEncryptedData = function() { + var msg = null; + msg = { + type: forge3.pki.oids.encryptedData, + version: 0, + encryptedContent: { + algorithm: forge3.pki.oids["aes256-CBC"] + }, + /** + * Reads an EncryptedData content block (in ASN.1 format) + * + * @param obj The ASN.1 representation of the EncryptedData content block + */ + fromAsn1: function(obj) { + _fromAsn1(msg, obj, p7.asn1.encryptedDataValidator); + }, + /** + * Decrypt encrypted content + * + * @param key The (symmetric) key as a byte buffer + */ + decrypt: function(key) { + if (key !== void 0) { + msg.encryptedContent.key = key; + } + _decryptContent(msg); + } + }; + return msg; + }; + p7.createEnvelopedData = function() { + var msg = null; + msg = { + type: forge3.pki.oids.envelopedData, + version: 0, + recipients: [], + encryptedContent: { + algorithm: forge3.pki.oids["aes256-CBC"] + }, + /** + * Reads an EnvelopedData content block (in ASN.1 format) + * + * @param obj the ASN.1 representation of the EnvelopedData content block. + */ + fromAsn1: function(obj) { + var capture = _fromAsn1(msg, obj, p7.asn1.envelopedDataValidator); + msg.recipients = _recipientsFromAsn1(capture.recipientInfos.value); + }, + toAsn1: function() { + return asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // ContentType + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + asn1.oidToDer(msg.type).getBytes() + ), + // [0] EnvelopedData + asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, [ + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // Version + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.INTEGER, + false, + asn1.integerToDer(msg.version).getBytes() + ), + // RecipientInfos + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.SET, + true, + _recipientsToAsn1(msg.recipients) + ), + // EncryptedContentInfo + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.SEQUENCE, + true, + _encryptedContentToAsn1(msg.encryptedContent) + ) + ]) + ]) + ]); + }, + /** + * Find recipient by X.509 certificate's issuer. + * + * @param cert the certificate with the issuer to look for. + * + * @return the recipient object. + */ + findRecipient: function(cert) { + var sAttr = cert.issuer.attributes; + for (var i = 0; i < msg.recipients.length; ++i) { + var r = msg.recipients[i]; + var rAttr = r.issuer; + if (r.serialNumber !== cert.serialNumber) { + continue; + } + if (rAttr.length !== sAttr.length) { + continue; + } + var match = true; + for (var j = 0; j < sAttr.length; ++j) { + if (rAttr[j].type !== sAttr[j].type || rAttr[j].value !== sAttr[j].value) { + match = false; + break; + } + } + if (match) { + return r; + } + } + return null; + }, + /** + * Decrypt enveloped content + * + * @param recipient The recipient object related to the private key + * @param privKey The (RSA) private key object + */ + decrypt: function(recipient, privKey) { + if (msg.encryptedContent.key === void 0 && recipient !== void 0 && privKey !== void 0) { + switch (recipient.encryptedContent.algorithm) { + case forge3.pki.oids.rsaEncryption: + case forge3.pki.oids.desCBC: + var key = privKey.decrypt(recipient.encryptedContent.content); + msg.encryptedContent.key = forge3.util.createBuffer(key); + break; + default: + throw new Error("Unsupported asymmetric cipher, OID " + recipient.encryptedContent.algorithm); + } + } + _decryptContent(msg); + }, + /** + * Add (another) entity to list of recipients. + * + * @param cert The certificate of the entity to add. + */ + addRecipient: function(cert) { + msg.recipients.push({ + version: 0, + issuer: cert.issuer.attributes, + serialNumber: cert.serialNumber, + encryptedContent: { + // We simply assume rsaEncryption here, since forge.pki only + // supports RSA so far. If the PKI module supports other + // ciphers one day, we need to modify this one as well. + algorithm: forge3.pki.oids.rsaEncryption, + key: cert.publicKey + } + }); + }, + /** + * Encrypt enveloped content. + * + * This function supports two optional arguments, cipher and key, which + * can be used to influence symmetric encryption. Unless cipher is + * provided, the cipher specified in encryptedContent.algorithm is used + * (defaults to AES-256-CBC). If no key is provided, encryptedContent.key + * is (re-)used. If that one's not set, a random key will be generated + * automatically. + * + * @param [key] The key to be used for symmetric encryption. + * @param [cipher] The OID of the symmetric cipher to use. + */ + encrypt: function(key, cipher) { + if (msg.encryptedContent.content === void 0) { + cipher = cipher || msg.encryptedContent.algorithm; + key = key || msg.encryptedContent.key; + var keyLen, ivLen, ciphFn; + switch (cipher) { + case forge3.pki.oids["aes128-CBC"]: + keyLen = 16; + ivLen = 16; + ciphFn = forge3.aes.createEncryptionCipher; + break; + case forge3.pki.oids["aes192-CBC"]: + keyLen = 24; + ivLen = 16; + ciphFn = forge3.aes.createEncryptionCipher; + break; + case forge3.pki.oids["aes256-CBC"]: + keyLen = 32; + ivLen = 16; + ciphFn = forge3.aes.createEncryptionCipher; + break; + case forge3.pki.oids["des-EDE3-CBC"]: + keyLen = 24; + ivLen = 8; + ciphFn = forge3.des.createEncryptionCipher; + break; + default: + throw new Error("Unsupported symmetric cipher, OID " + cipher); + } + if (key === void 0) { + key = forge3.util.createBuffer(forge3.random.getBytes(keyLen)); + } else if (key.length() != keyLen) { + throw new Error("Symmetric key has wrong length; got " + key.length() + " bytes, expected " + keyLen + "."); + } + msg.encryptedContent.algorithm = cipher; + msg.encryptedContent.key = key; + msg.encryptedContent.parameter = forge3.util.createBuffer( + forge3.random.getBytes(ivLen) + ); + var ciph = ciphFn(key); + ciph.start(msg.encryptedContent.parameter.copy()); + ciph.update(msg.content); + if (!ciph.finish()) { + throw new Error("Symmetric encryption failed."); + } + msg.encryptedContent.content = ciph.output; + } + for (var i = 0; i < msg.recipients.length; ++i) { + var recipient = msg.recipients[i]; + if (recipient.encryptedContent.content !== void 0) { + continue; + } + switch (recipient.encryptedContent.algorithm) { + case forge3.pki.oids.rsaEncryption: + recipient.encryptedContent.content = recipient.encryptedContent.key.encrypt( + msg.encryptedContent.key.data + ); + break; + default: + throw new Error("Unsupported asymmetric cipher, OID " + recipient.encryptedContent.algorithm); + } + } + } + }; + return msg; + }; + function _recipientFromAsn1(obj) { + var capture = {}; + var errors = []; + if (!asn1.validate(obj, p7.asn1.recipientInfoValidator, capture, errors)) { + var error = new Error("Cannot read PKCS#7 RecipientInfo. ASN.1 object is not an PKCS#7 RecipientInfo."); + error.errors = errors; + throw error; + } + return { + version: capture.version.charCodeAt(0), + issuer: forge3.pki.RDNAttributesAsArray(capture.issuer), + serialNumber: forge3.util.createBuffer(capture.serial).toHex(), + encryptedContent: { + algorithm: asn1.derToOid(capture.encAlgorithm), + parameter: capture.encParameter ? capture.encParameter.value : void 0, + content: capture.encKey + } + }; + } + function _recipientToAsn1(obj) { + return asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // Version + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.INTEGER, + false, + asn1.integerToDer(obj.version).getBytes() + ), + // IssuerAndSerialNumber + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // Name + forge3.pki.distinguishedNameToAsn1({ attributes: obj.issuer }), + // Serial + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.INTEGER, + false, + forge3.util.hexToBytes(obj.serialNumber) + ) + ]), + // KeyEncryptionAlgorithmIdentifier + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // Algorithm + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + asn1.oidToDer(obj.encryptedContent.algorithm).getBytes() + ), + // Parameter, force NULL, only RSA supported for now. + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.NULL, false, "") + ]), + // EncryptedKey + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OCTETSTRING, + false, + obj.encryptedContent.content + ) + ]); + } + function _recipientsFromAsn1(infos) { + var ret = []; + for (var i = 0; i < infos.length; ++i) { + ret.push(_recipientFromAsn1(infos[i])); + } + return ret; + } + function _recipientsToAsn1(recipients) { + var ret = []; + for (var i = 0; i < recipients.length; ++i) { + ret.push(_recipientToAsn1(recipients[i])); + } + return ret; + } + function _signerToAsn1(obj) { + var rval = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // version + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.INTEGER, + false, + asn1.integerToDer(obj.version).getBytes() + ), + // issuerAndSerialNumber + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // name + forge3.pki.distinguishedNameToAsn1({ attributes: obj.issuer }), + // serial + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.INTEGER, + false, + forge3.util.hexToBytes(obj.serialNumber) + ) + ]), + // digestAlgorithm + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // algorithm + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + asn1.oidToDer(obj.digestAlgorithm).getBytes() + ), + // parameters (null) + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.NULL, false, "") + ]) + ]); + if (obj.authenticatedAttributesAsn1) { + rval.value.push(obj.authenticatedAttributesAsn1); + } + rval.value.push(asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // algorithm + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + asn1.oidToDer(obj.signatureAlgorithm).getBytes() + ), + // parameters (null) + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.NULL, false, "") + ])); + rval.value.push(asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OCTETSTRING, + false, + obj.signature + )); + if (obj.unauthenticatedAttributes.length > 0) { + var attrsAsn1 = asn1.create(asn1.Class.CONTEXT_SPECIFIC, 1, true, []); + for (var i = 0; i < obj.unauthenticatedAttributes.length; ++i) { + var attr = obj.unauthenticatedAttributes[i]; + attrsAsn1.values.push(_attributeToAsn1(attr)); + } + rval.value.push(attrsAsn1); + } + return rval; + } + function _signersToAsn1(signers) { + var ret = []; + for (var i = 0; i < signers.length; ++i) { + ret.push(_signerToAsn1(signers[i])); + } + return ret; + } + function _attributeToAsn1(attr) { + var value; + if (attr.type === forge3.pki.oids.contentType) { + value = asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + asn1.oidToDer(attr.value).getBytes() + ); + } else if (attr.type === forge3.pki.oids.messageDigest) { + value = asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OCTETSTRING, + false, + attr.value.bytes() + ); + } else if (attr.type === forge3.pki.oids.signingTime) { + var jan_1_1950 = /* @__PURE__ */ new Date("1950-01-01T00:00:00Z"); + var jan_1_2050 = /* @__PURE__ */ new Date("2050-01-01T00:00:00Z"); + var date = attr.value; + if (typeof date === "string") { + var timestamp = Date.parse(date); + if (!isNaN(timestamp)) { + date = new Date(timestamp); + } else if (date.length === 13) { + date = asn1.utcTimeToDate(date); + } else { + date = asn1.generalizedTimeToDate(date); + } + } + if (date >= jan_1_1950 && date < jan_1_2050) { + value = asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.UTCTIME, + false, + asn1.dateToUtcTime(date) + ); + } else { + value = asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.GENERALIZEDTIME, + false, + asn1.dateToGeneralizedTime(date) + ); + } + } + return asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // AttributeType + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + asn1.oidToDer(attr.type).getBytes() + ), + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SET, true, [ + // AttributeValue + value + ]) + ]); + } + function _encryptedContentToAsn1(ec) { + return [ + // ContentType, always Data for the moment + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + asn1.oidToDer(forge3.pki.oids.data).getBytes() + ), + // ContentEncryptionAlgorithmIdentifier + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // Algorithm + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + asn1.oidToDer(ec.algorithm).getBytes() + ), + // Parameters (IV) + !ec.parameter ? void 0 : asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OCTETSTRING, + false, + ec.parameter.getBytes() + ) + ]), + // [0] EncryptedContent + asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, [ + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OCTETSTRING, + false, + ec.content.getBytes() + ) + ]) + ]; + } + function _fromAsn1(msg, obj, validator) { + var capture = {}; + var errors = []; + if (!asn1.validate(obj, validator, capture, errors)) { + var error = new Error("Cannot read PKCS#7 message. ASN.1 object is not a supported PKCS#7 message."); + error.errors = error; + throw error; + } + var contentType = asn1.derToOid(capture.contentType); + if (contentType !== forge3.pki.oids.data) { + throw new Error("Unsupported PKCS#7 message. Only wrapped ContentType Data supported."); + } + if (capture.encryptedContent) { + var content = ""; + if (forge3.util.isArray(capture.encryptedContent)) { + for (var i = 0; i < capture.encryptedContent.length; ++i) { + if (capture.encryptedContent[i].type !== asn1.Type.OCTETSTRING) { + throw new Error("Malformed PKCS#7 message, expecting encrypted content constructed of only OCTET STRING objects."); + } + content += capture.encryptedContent[i].value; + } + } else { + content = capture.encryptedContent; + } + msg.encryptedContent = { + algorithm: asn1.derToOid(capture.encAlgorithm), + parameter: forge3.util.createBuffer(capture.encParameter.value), + content: forge3.util.createBuffer(content) + }; + } + if (capture.content) { + var content = ""; + if (forge3.util.isArray(capture.content)) { + for (var i = 0; i < capture.content.length; ++i) { + if (capture.content[i].type !== asn1.Type.OCTETSTRING) { + throw new Error("Malformed PKCS#7 message, expecting content constructed of only OCTET STRING objects."); + } + content += capture.content[i].value; + } + } else { + content = capture.content; + } + msg.content = forge3.util.createBuffer(content); + } + msg.version = capture.version.charCodeAt(0); + msg.rawCapture = capture; + return capture; + } + function _decryptContent(msg) { + if (msg.encryptedContent.key === void 0) { + throw new Error("Symmetric key not available."); + } + if (msg.content === void 0) { + var ciph; + switch (msg.encryptedContent.algorithm) { + case forge3.pki.oids["aes128-CBC"]: + case forge3.pki.oids["aes192-CBC"]: + case forge3.pki.oids["aes256-CBC"]: + ciph = forge3.aes.createDecryptionCipher(msg.encryptedContent.key); + break; + case forge3.pki.oids["desCBC"]: + case forge3.pki.oids["des-EDE3-CBC"]: + ciph = forge3.des.createDecryptionCipher(msg.encryptedContent.key); + break; + default: + throw new Error("Unsupported symmetric cipher, OID " + msg.encryptedContent.algorithm); + } + ciph.start(msg.encryptedContent.parameter); + ciph.update(msg.encryptedContent.content); + if (!ciph.finish()) { + throw new Error("Symmetric decryption failed."); + } + msg.content = ciph.output; + } + } + } +}); + +// node_modules/node-forge/lib/ssh.js +var require_ssh = __commonJS({ + "node_modules/node-forge/lib/ssh.js"(exports, module) { + var forge3 = require_forge(); + require_aes(); + require_hmac(); + require_md5(); + require_sha1(); + require_util(); + var ssh = module.exports = forge3.ssh = forge3.ssh || {}; + ssh.privateKeyToPutty = function(privateKey, passphrase, comment) { + comment = comment || ""; + passphrase = passphrase || ""; + var algorithm = "ssh-rsa"; + var encryptionAlgorithm = passphrase === "" ? "none" : "aes256-cbc"; + var ppk = "PuTTY-User-Key-File-2: " + algorithm + "\r\n"; + ppk += "Encryption: " + encryptionAlgorithm + "\r\n"; + ppk += "Comment: " + comment + "\r\n"; + var pubbuffer = forge3.util.createBuffer(); + _addStringToBuffer(pubbuffer, algorithm); + _addBigIntegerToBuffer(pubbuffer, privateKey.e); + _addBigIntegerToBuffer(pubbuffer, privateKey.n); + var pub = forge3.util.encode64(pubbuffer.bytes(), 64); + var length = Math.floor(pub.length / 66) + 1; + ppk += "Public-Lines: " + length + "\r\n"; + ppk += pub; + var privbuffer = forge3.util.createBuffer(); + _addBigIntegerToBuffer(privbuffer, privateKey.d); + _addBigIntegerToBuffer(privbuffer, privateKey.p); + _addBigIntegerToBuffer(privbuffer, privateKey.q); + _addBigIntegerToBuffer(privbuffer, privateKey.qInv); + var priv; + if (!passphrase) { + priv = forge3.util.encode64(privbuffer.bytes(), 64); + } else { + var encLen = privbuffer.length() + 16 - 1; + encLen -= encLen % 16; + var padding = _sha1(privbuffer.bytes()); + padding.truncate(padding.length() - encLen + privbuffer.length()); + privbuffer.putBuffer(padding); + var aeskey = forge3.util.createBuffer(); + aeskey.putBuffer(_sha1("\0\0\0\0", passphrase)); + aeskey.putBuffer(_sha1("\0\0\0", passphrase)); + var cipher = forge3.aes.createEncryptionCipher(aeskey.truncate(8), "CBC"); + cipher.start(forge3.util.createBuffer().fillWithByte(0, 16)); + cipher.update(privbuffer.copy()); + cipher.finish(); + var encrypted = cipher.output; + encrypted.truncate(16); + priv = forge3.util.encode64(encrypted.bytes(), 64); + } + length = Math.floor(priv.length / 66) + 1; + ppk += "\r\nPrivate-Lines: " + length + "\r\n"; + ppk += priv; + var mackey = _sha1("putty-private-key-file-mac-key", passphrase); + var macbuffer = forge3.util.createBuffer(); + _addStringToBuffer(macbuffer, algorithm); + _addStringToBuffer(macbuffer, encryptionAlgorithm); + _addStringToBuffer(macbuffer, comment); + macbuffer.putInt32(pubbuffer.length()); + macbuffer.putBuffer(pubbuffer); + macbuffer.putInt32(privbuffer.length()); + macbuffer.putBuffer(privbuffer); + var hmac = forge3.hmac.create(); + hmac.start("sha1", mackey); + hmac.update(macbuffer.bytes()); + ppk += "\r\nPrivate-MAC: " + hmac.digest().toHex() + "\r\n"; + return ppk; + }; + ssh.publicKeyToOpenSSH = function(key, comment) { + var type = "ssh-rsa"; + comment = comment || ""; + var buffer = forge3.util.createBuffer(); + _addStringToBuffer(buffer, type); + _addBigIntegerToBuffer(buffer, key.e); + _addBigIntegerToBuffer(buffer, key.n); + return type + " " + forge3.util.encode64(buffer.bytes()) + " " + comment; + }; + ssh.privateKeyToOpenSSH = function(privateKey, passphrase) { + if (!passphrase) { + return forge3.pki.privateKeyToPem(privateKey); + } + return forge3.pki.encryptRsaPrivateKey( + privateKey, + passphrase, + { legacy: true, algorithm: "aes128" } + ); + }; + ssh.getPublicKeyFingerprint = function(key, options) { + options = options || {}; + var md = options.md || forge3.md.md5.create(); + var type = "ssh-rsa"; + var buffer = forge3.util.createBuffer(); + _addStringToBuffer(buffer, type); + _addBigIntegerToBuffer(buffer, key.e); + _addBigIntegerToBuffer(buffer, key.n); + md.start(); + md.update(buffer.getBytes()); + var digest = md.digest(); + if (options.encoding === "hex") { + var hex = digest.toHex(); + if (options.delimiter) { + return hex.match(/.{2}/g).join(options.delimiter); + } + return hex; + } else if (options.encoding === "binary") { + return digest.getBytes(); + } else if (options.encoding) { + throw new Error('Unknown encoding "' + options.encoding + '".'); + } + return digest; + }; + function _addBigIntegerToBuffer(buffer, val) { + var hexVal = val.toString(16); + if (hexVal[0] >= "8") { + hexVal = "00" + hexVal; + } + var bytes = forge3.util.hexToBytes(hexVal); + buffer.putInt32(bytes.length); + buffer.putBytes(bytes); + } + function _addStringToBuffer(buffer, val) { + buffer.putInt32(val.length); + buffer.putString(val); + } + function _sha1() { + var sha = forge3.md.sha1.create(); + var num = arguments.length; + for (var i = 0; i < num; ++i) { + sha.update(arguments[i]); + } + return sha.digest(); + } + } +}); + +// node_modules/node-forge/lib/index.js +var require_lib = __commonJS({ + "node_modules/node-forge/lib/index.js"(exports, module) { + module.exports = require_forge(); + require_aes(); + require_aesCipherSuites(); + require_asn1(); + require_cipher(); + require_des(); + require_ed25519(); + require_hmac(); + require_kem(); + require_log(); + require_md_all(); + require_mgf1(); + require_pbkdf2(); + require_pem(); + require_pkcs1(); + require_pkcs12(); + require_pkcs7(); + require_pki(); + require_prime(); + require_prng(); + require_pss(); + require_random(); + require_rc2(); + require_ssh(); + require_tls(); + require_util(); + } +}); + +// src/lostcity/server/LoginThread.ts +var import_node_forge2 = __toESM(require_lib(), 1); + +// src/jagex2/io/Packet.ts +var import_node_forge = __toESM(require_lib(), 1); + +// src/jagex2/datastruct/Linkable.ts +var Linkable = class { + key; + next; + prev; + constructor() { + this.key = 0n; + this.next = this; + this.prev = this; + } + unlink() { + if (!this.prev || !this.next) { + return; + } + this.prev.next = this.next; + this.next.prev = this.prev; + this.next = null; + this.prev = null; + } +}; + +// src/jagex2/datastruct/LinkList.ts +var LinkList = class { + sentinel; + cursor = null; + constructor() { + const head = new Linkable(); + head.next = head; + head.prev = head; + this.sentinel = head; + } + addTail(node) { + if (node.prev) { + node.unlink(); + } + node.prev = this.sentinel.prev; + node.next = this.sentinel; + if (node.prev) { + node.prev.next = node; + } + node.next.prev = node; + } + addHead(node) { + if (node.prev) { + node.unlink(); + } + node.prev = this.sentinel; + node.next = this.sentinel.next; + node.prev.next = node; + if (node.next) { + node.next.prev = node; + } + } + removeHead() { + const node = this.sentinel.next; + if (node === this.sentinel) { + return null; + } + node?.unlink(); + return node; + } + head() { + const node = this.sentinel.next; + if (node === this.sentinel) { + this.cursor = null; + return null; + } + this.cursor = node?.next || null; + return node; + } + tail() { + const node = this.sentinel.prev; + if (node === this.sentinel) { + this.cursor = null; + return null; + } + this.cursor = node?.prev || null; + return node; + } + next() { + const node = this.cursor; + if (node === this.sentinel) { + this.cursor = null; + return null; + } + this.cursor = node?.next || null; + return node; + } + prev() { + const node = this.cursor; + if (node === this.sentinel) { + this.cursor = null; + return null; + } + this.cursor = node?.prev || null; + return node; + } + clear() { + while (true) { + const node = this.sentinel.next; + if (node === this.sentinel) { + return; + } + node?.unlink(); + } + } +}; + +// src/jagex2/datastruct/Hashable.ts +var Hashable = class extends Linkable { + nextHashable; + prevHashable; + constructor() { + super(); + this.nextHashable = this; + this.prevHashable = this; + } + uncache() { + if (!this.prevHashable || !this.nextHashable) { + return; + } + this.prevHashable.nextHashable = this.nextHashable; + this.nextHashable.prevHashable = this.prevHashable; + this.nextHashable = null; + this.prevHashable = null; + } +}; + +// src/jagex2/io/Packet.ts +var BigInteger = import_node_forge.default.jsbn.BigInteger; +var Packet = class _Packet extends Hashable { + static crctable = new Int32Array(256); + static bitmask = new Uint32Array(33); + /** + * Reversed CRC-32 polynomial for Cyclic Redundancy Check (CRC). + * This is sometimes referred to as CRC32B. + */ + static crc32b = 3988292384; + static { + for (let i = 0; i < 32; i++) { + this.bitmask[i] = (1 << i) - 1; + } + this.bitmask[32] = 4294967295; + for (let b = 0; b < 256; b++) { + let remainder = b; + for (let bit = 0; bit < 8; bit++) { + if ((remainder & 1) == 1) { + remainder = remainder >>> 1 ^ this.crc32b; + } else { + remainder >>>= 1; + } + } + this.crctable[b] = remainder; + } + } + static getcrc(src, offset, length) { + let crc = 4294967295; + for (let i = offset; i < length; i++) { + crc = crc >>> 8 ^ this.crctable[(crc ^ src[i]) & 255]; + } + return ~crc; + } + static checkcrc(src, offset, length, expected = 0) { + const checksum = _Packet.getcrc(src, offset, length); + return checksum == expected; + } + static alloc(type) { + let packet = null; + if (type === 0 && this.cacheMinCount > 0) { + packet = this.cacheMin.removeHead(); + this.cacheMinCount--; + } else if (type === 1 && this.cacheMidCount > 0) { + packet = this.cacheMid.removeHead(); + this.cacheMidCount--; + } else if (type === 2 && this.cacheMaxCount > 0) { + packet = this.cacheMax.removeHead(); + this.cacheMaxCount--; + } else if (type === 3 && this.cacheBigCount > 0) { + packet = this.cacheBig.removeHead(); + this.cacheBigCount--; + } else if (type === 4 && this.cacheHugeCount > 0) { + packet = this.cacheHuge.removeHead(); + this.cacheHugeCount--; + } else if (type === 5 && this.cacheUnimaginableCount > 0) { + packet = this.cacheUnimaginable.removeHead(); + this.cacheUnimaginableCount--; + } + if (packet !== null) { + packet.pos = 0; + packet.bitPos = 0; + return packet; + } + if (type === 0) { + return new _Packet(new Uint8Array(100)); + } else if (type === 1) { + return new _Packet(new Uint8Array(5e3)); + } else if (type === 2) { + return new _Packet(new Uint8Array(3e4)); + } else if (type === 3) { + return new _Packet(new Uint8Array(1e5)); + } else if (type === 4) { + return new _Packet(new Uint8Array(5e5)); + } else if (type === 5) { + return new _Packet(new Uint8Array(2e6)); + } else { + return new _Packet(new Uint8Array(type)); + } + } + static load(path2, seekToEnd = false) { + const packet = new _Packet(new Uint8Array(fs.readFileSync(path2))); + if (seekToEnd) { + packet.pos = packet.data.length; + } + return packet; + } + static async loadAsync(path2, seekToEnd = false) { + const packet = new _Packet(new Uint8Array(await (await fetch(path2)).arrayBuffer())); + if (seekToEnd) { + packet.pos = packet.data.length; + } + return packet; + } + static cacheMinCount = 0; + static cacheMidCount = 0; + static cacheMaxCount = 0; + static cacheBigCount = 0; + static cacheHugeCount = 0; + static cacheUnimaginableCount = 0; + static cacheMin = new LinkList(); + static cacheMid = new LinkList(); + static cacheMax = new LinkList(); + static cacheBig = new LinkList(); + static cacheHuge = new LinkList(); + static cacheUnimaginable = new LinkList(); + data; + #view; + pos; + bitPos; + constructor(src) { + super(); + this.data = src; + this.#view = new DataView(this.data.buffer); + this.pos = 0; + this.bitPos = 0; + } + get available() { + return this.data.length - this.pos; + } + get length() { + return this.data.length; + } + release() { + this.pos = 0; + this.bitPos = 0; + if (this.data.length === 100 && _Packet.cacheMinCount < 1e3) { + _Packet.cacheMin.addTail(this); + _Packet.cacheMinCount++; + } else if (this.data.length === 5e3 && _Packet.cacheMidCount < 250) { + _Packet.cacheMid.addTail(this); + _Packet.cacheMidCount++; + } else if (this.data.length === 3e4 && _Packet.cacheMaxCount < 50) { + _Packet.cacheMax.addTail(this); + _Packet.cacheMaxCount++; + } else if (this.data.length === 1e5 && _Packet.cacheBigCount < 10) { + _Packet.cacheBig.addTail(this); + _Packet.cacheBigCount++; + } else if (this.data.length === 5e5 && _Packet.cacheHugeCount < 5) { + _Packet.cacheHuge.addTail(this); + _Packet.cacheHugeCount++; + } else if (this.data.length === 2e6 && _Packet.cacheUnimaginableCount < 2) { + _Packet.cacheUnimaginable.addTail(this); + _Packet.cacheUnimaginableCount++; + } + } + save(filePath, length = this.pos, start = 0) { + if (typeof self === "undefined") { + const dir = path.dirname(filePath); + if (!fs.existsSync(dir)) { + fs.mkdirSync(dir, { recursive: true }); + } + fs.writeFileSync(filePath, this.data.subarray(start, start + length)); + } else { + const blob = new Blob([this.data.subarray(start, start + length)], { type: "application/octet-stream" }); + const url = URL.createObjectURL(blob); + self.postMessage({ type: "save", value: url, path: filePath }); + } + } + p1(value) { + this.#view.setUint8(this.pos++, value); + } + p2(value) { + this.#view.setUint16(this.pos, value); + this.pos += 2; + } + ip2(value) { + this.#view.setUint16(this.pos, value, true); + this.pos += 2; + } + p3(value) { + this.#view.setUint8(this.pos++, value >> 16); + this.#view.setUint16(this.pos, value); + this.pos += 2; + } + p4(value) { + this.#view.setInt32(this.pos, value); + this.pos += 4; + } + ip4(value) { + this.#view.setInt32(this.pos, value, true); + this.pos += 4; + } + p8(value) { + this.#view.setBigInt64(this.pos, value); + this.pos += 8; + } + pbool(value) { + this.p1(value ? 1 : 0); + } + pjstr(str, terminator = 10) { + const length = str.length; + for (let i = 0; i < length; i++) { + this.#view.setUint8(this.pos++, str.charCodeAt(i)); + } + this.#view.setUint8(this.pos++, terminator); + } + pdata(src, offset, length) { + this.data.set(src.subarray(offset, offset + length), this.pos); + this.pos += length - offset; + } + psize4(size) { + this.#view.setUint32(this.pos - size - 4, size); + } + psize2(size) { + this.#view.setUint16(this.pos - size - 2, size); + } + psize1(size) { + this.#view.setUint8(this.pos - size - 1, size); + } + psmarts(value) { + if (value < 64 && value >= 64) { + this.p1(value + 64); + } else if (value < 16384 && value >= -16384) { + this.p2(value + 49152); + } else { + throw new Error("Error psmarts out of range: " + value); + } + } + psmart(value) { + if (value >= 0 && value < 128) { + this.p1(value); + } else if (value >= 0 && value < 32768) { + this.p2(value + 32768); + } else { + throw new Error("Error psmart out of range: " + value); + } + } + // ---- + g1() { + return this.#view.getUint8(this.pos++); + } + g1b() { + return this.#view.getInt8(this.pos++); + } + g2() { + this.pos += 2; + return this.#view.getUint16(this.pos - 2); + } + g2s() { + this.pos += 2; + return this.#view.getInt16(this.pos - 2); + } + ig2() { + this.pos += 2; + return this.#view.getUint16(this.pos - 2, true); + } + g3() { + const result = this.#view.getUint8(this.pos++) << 16 | this.#view.getUint16(this.pos); + this.pos += 2; + return result; + } + g4() { + this.pos += 4; + return this.#view.getInt32(this.pos - 4); + } + ig4() { + this.pos += 4; + return this.#view.getInt32(this.pos - 4, true); + } + g8() { + this.pos += 8; + return this.#view.getBigInt64(this.pos - 8); + } + gbool() { + return this.g1() === 1; + } + gjstr(terminator = 10) { + const length = this.data.length; + let str = ""; + let b; + while ((b = this.#view.getUint8(this.pos++)) !== terminator && this.pos < length) { + str += String.fromCharCode(b); + } + return str; + } + gdata(dest, offset, length) { + dest.set(this.data.subarray(this.pos, this.pos + length), offset); + this.pos += length; + } + gsmarts() { + return this.#view.getUint8(this.pos) < 128 ? this.g1() - 64 : this.g2() - 49152; + } + gsmart() { + return this.#view.getUint8(this.pos) < 128 ? this.g1() : this.g2() - 32768; + } + bits() { + this.bitPos = this.pos << 3; + } + bytes() { + this.pos = this.bitPos + 7 >>> 3; + } + gBit(n) { + let bytePos = this.bitPos >>> 3; + let remaining = 8 - (this.bitPos & 7); + let value = 0; + this.bitPos += n; + for (; n > remaining; remaining = 8) { + value += (this.#view.getUint8(bytePos++) & _Packet.bitmask[remaining]) << n - remaining; + n -= remaining; + } + if (n == remaining) { + value += this.#view.getUint8(bytePos) & _Packet.bitmask[remaining]; + } else { + value += this.#view.getUint8(bytePos) >>> remaining - n & _Packet.bitmask[n]; + } + return value; + } + pBit(n, value) { + const pos = this.bitPos; + this.bitPos += n; + let bytePos = pos >>> 3; + let remaining = 8 - (pos & 7); + const view = this.#view; + for (; n > remaining; remaining = 8) { + const shift2 = (1 << remaining) - 1; + const byte2 = view.getUint8(bytePos); + view.setUint8(bytePos++, byte2 & ~shift2 | value >>> n - remaining & shift2); + n -= remaining; + } + const r = remaining - n; + const shift = (1 << n) - 1; + const byte = view.getUint8(bytePos); + view.setUint8(bytePos, byte & ~shift << r | (value & shift) << r); + } + rsaenc(pem) { + const length = this.pos; + this.pos = 0; + const dec = new Uint8Array(length); + this.gdata(dec, 0, dec.length); + const bigRaw = new BigInteger(Array.from(dec)); + const rawEnc = Uint8Array.from(bigRaw.modPow(pem.e, pem.n).toByteArray()); + this.pos = 0; + this.p1(rawEnc.length); + this.pdata(rawEnc, 0, rawEnc.length); + } + rsadec(pem) { + const p = pem.p; + const q = pem.q; + const dP = pem.dP; + const dQ = pem.dQ; + const qInv = pem.qInv; + const enc = new Uint8Array(this.g1()); + this.gdata(enc, 0, enc.length); + const bigRaw = new BigInteger(Array.from(enc)); + const m1 = bigRaw.mod(p).modPow(dP, p); + const m2 = bigRaw.mod(q).modPow(dQ, q); + const h = qInv.multiply(m1.subtract(m2)).mod(p); + const rawDec = new Uint8Array(m2.add(h.multiply(q)).toByteArray()); + this.pos = 0; + this.pdata(rawDec, 0, rawDec.length); + this.pos = 0; + } + // later revs have tinyenc/tinydec methods + // later revs have alt methods for packet obfuscation +}; + +// src/jagex2/jstring/JString.ts +function toBase37(string) { + string = string.trim(); + let l = 0n; + for (let i = 0; i < string.length && i < 12; i++) { + const c = string.charCodeAt(i); + l *= 37n; + if (c >= 65 && c <= 90) { + l += BigInt(c + 1 - 65); + } else if (c >= 97 && c <= 122) { + l += BigInt(c + 1 - 97); + } else if (c >= 48 && c <= 57) { + l += BigInt(c + 27 - 48); + } + } + return l; +} +var BASE37_LOOKUP = [ + "_", + "a", + "b", + "c", + "d", + "e", + "f", + "g", + "h", + "i", + "j", + "k", + "l", + "m", + "n", + "o", + "p", + "q", + "r", + "s", + "t", + "u", + "v", + "w", + "x", + "y", + "z", + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9" +]; +function fromBase37(value) { + if (value < 0n || value >= 6582952005840035281n) { + return "invalid_name"; + } + if (value % 37n === 0n) { + return "invalid_name"; + } + let len = 0; + const chars = Array(12); + while (value !== 0n) { + const l1 = value; + value /= 37n; + chars[11 - len++] = BASE37_LOOKUP[Number(l1 - value * 37n)]; + } + return chars.slice(12 - len).join(""); +} +function toSafeName(name) { + return fromBase37(toBase37(name)); +} + +// src/lostcity/server/LoginServer.ts + +// src/lostcity/server/NetworkStream.ts +var NetworkStream = class { + queue = []; + // queue of data events + available = 0; + // remaining bytes to read + buffer = null; + // current data event + offset = 0; + waiting = 0; + // number of bytes waiting to be read + received(buf) { + this.queue.push(buf); + this.available += buf.length; + } + clear() { + this.queue = []; + this.available = 0; + this.buffer = null; + this.offset = 0; + } + async readByte(socket) { + if (socket === null || socket.closed) { + return 0; + } + if (this.available < 1) { + await new Promise((res) => setTimeout(res, 10)); + return this.readByte(socket); + } + if (this.buffer === null) { + this.buffer = this.queue.shift() ?? null; + this.offset = 0; + } + const value = this.buffer?.[this.offset] ?? 0; + this.offset++; + this.available--; + if (this.buffer && this.offset === this.buffer.length) { + this.buffer = null; + } + return value; + } + async readBytes(socket, destination, offset, length, full = true) { + if (socket === null || socket.closed) { + return 0; + } + if (this.available < length) { + if (full) { + await new Promise((res) => setTimeout(res, 10)); + return this.readBytes(socket, destination, offset, length); + } else { + length = this.available; + } + } + destination.pos = offset; + for (let i = 0; i < length; i++) { + if (this.buffer === null) { + this.buffer = this.queue.shift() ?? null; + this.offset = 0; + } + destination.data[offset + i] = this.buffer?.[this.offset] ?? 0; + this.offset++; + this.available--; + if (this.buffer && this.offset === this.buffer.length) { + this.buffer = null; + } + } + return length; + } +}; + +// src/lostcity/util/Environment.ts + +// src/lostcity/util/TryParse.ts +function tryParseBoolean(value, defaultValue) { + if (value === "true" || value === true) { + return true; + } else if (value === "false" || value === false) { + return false; + } else { + return defaultValue; + } +} +function tryParseInt(value, defaultValue) { + if (typeof value === "number") { + return value; + } + if (typeof value !== "string" && typeof value !== "number") { + return defaultValue; + } + const intValue = parseInt(value); + if (!isNaN(intValue)) { + return intValue; + } + return defaultValue; +} +function tryParseString(value, defaultValue) { + if (typeof value !== "string") { + return defaultValue; + } + return value; +} +function tryParseArray(value, defaultValue) { + if (!Array.isArray(value)) { + return defaultValue; + } + return value; +} + +// src/lostcity/util/Environment.ts +var Environment_default = { + /// web server + WEB_PORT: tryParseInt(void 0, false ? 80 : 8888), + WEB_CORS: tryParseBoolean(void 0, true), + /// game server + // world id - offset by 9, so 1 = 10, 2 = 11, etc + NODE_ID: tryParseInt(void 0, 10), + NODE_PORT: tryParseInt(void 0, 43594), + // members content + NODE_MEMBERS: tryParseBoolean(void 0, true), + // addxp multiplier + NODE_XPRATE: tryParseInt(void 0, 1), + // production mode! + NODE_PRODUCTION: tryParseBoolean(void 0, false), + // automatic shutdown time for production mode on sigint + NODE_KILLTIMER: tryParseInt(void 0, 50), + NODE_ALLOW_CHEATS: tryParseBoolean(void 0, true), + // development mode! + NODE_DEBUG: tryParseBoolean(void 0, true), + // measuring script execution + NODE_DEBUG_PROFILE: tryParseBoolean(void 0, false), + // *only* if no login server is running to authenticate accounts, this provides admin accs by username :) + NODE_STAFF: tryParseArray(void 0, ["pazaz"]), + // todo: add staffmodlevel to database + // no server routefinding until 2009 + NODE_CLIENT_ROUTEFINDER: tryParseBoolean(void 0, true), + // controllable for bot testing + NODE_SOCKET_TIMEOUT: tryParseBoolean(void 0, true), + /// login server + LOGIN_HOST: tryParseString(void 0, "localhost"), + LOGIN_PORT: tryParseInt(void 0, 43500), + LOGIN_KEY: tryParseString(void 0, ""), + /// database + DB_HOST: tryParseString(void 0, "localhost"), + DB_USER: tryParseString(void 0, "root"), + DB_PASS: tryParseString(void 0, "password"), + DB_NAME: tryParseString(void 0, "lostcity"), + /// development + // some users may not be able to change their system PATH for this project + BUILD_JAVA_PATH: tryParseString(void 0, "java"), + // auto-build on startup + BUILD_STARTUP: tryParseBoolean(void 0, true), + // auto-update compiler on startup + BUILD_STARTUP_UPDATE: tryParseBoolean(void 0, true), + // used to check if we're producing the original cache without edits + BUILD_VERIFY: tryParseBoolean(void 0, true), + // used to keep some semblance of sanity in our folder structure + BUILD_VERIFY_FOLDER: tryParseBoolean(void 0, true), + // used for unpacking/custom development + BUILD_VERIFY_PACK: tryParseBoolean(void 0, true), + // used for unpacking/custom development + BUILD_SRC_DIR: tryParseString(void 0, "data/src") +}; + +// src/lostcity/server/LoginServer.ts +var LoginResponse = class { + static SUCCESSFUL = Uint8Array.from([2]); + static INVALID_USER_OR_PASS = Uint8Array.from([3]); + // Invalid username or password. + static ACCOUNT_DISABLED = Uint8Array.from([4]); + // Your account has been disabled. + static LOGGED_IN = Uint8Array.from([5]); + // Your account is already logged in. + static SERVER_UPDATED = Uint8Array.from([6]); + // RuneScape has been updated! + static WORLD_FULL = Uint8Array.from([7]); + // This world is full. + static LOGIN_SERVER_OFFLINE = Uint8Array.from([8]); + // Unable to connect. + static LOGIN_LIMIT_EXCEEDED = Uint8Array.from([9]); + // Login limit exceeded. + static UNABLE_TO_CONNECT = Uint8Array.from([10]); + // Unable to connect. + static LOGIN_REJECTED = Uint8Array.from([11]); + // Login server rejected session. + static NEED_MEMBERS_ACCOUNT = Uint8Array.from([12]); + // You need a members account to login to this world. + static COULD_NOT_COMPLETE = Uint8Array.from([13]); + // Could not complete login. + static SERVER_UPDATING = Uint8Array.from([14]); + // The server is being updated. + static RECONNECTING = Uint8Array.from([15]); + static LOGIN_ATTEMPTS_EXCEEDED = Uint8Array.from([16]); + // Login attempts exceeded. + static STANDING_IN_MEMBERS = Uint8Array.from([17]); + // You are standing in a members-only area. + static STAFF_MOD_LEVEL = Uint8Array.from([18]); +}; +var LoginClient = class { + socket = null; + stream = new NetworkStream(); + async connect() { + if (this.socket) { + return; + } + return new Promise((res) => { + this.socket = net.createConnection({ + port: Environment_default.LOGIN_PORT, + host: Environment_default.LOGIN_HOST + }); + this.socket.setNoDelay(true); + this.socket.setTimeout(1e3); + this.socket.on("data", async (buf) => { + this.stream.received(buf); + }); + this.socket.once("close", () => { + this.disconnect(); + res(); + }); + this.socket.once("error", () => { + this.disconnect(); + res(); + }); + this.socket.once("connect", () => { + res(); + }); + }); + } + disconnect() { + if (this.socket === null) { + return; + } + this.socket.destroy(); + this.socket = null; + this.stream.clear(); + } + async write(socket, opcode, data = null, full = true) { + if (socket === null) { + return; + } + const packet = new Packet(new Uint8Array(1 + 2 + (data !== null ? data?.length : 0))); + packet.p1(opcode); + if (data !== null) { + packet.p2(data.length); + packet.pdata(data, 0, data.length); + } else { + packet.p2(0); + } + const done = socket.write(packet.data); + if (!done && full) { + await new Promise((res) => { + const interval = setInterval(() => { + if (socket === null || socket.closed) { + clearInterval(interval); + res(); + } + }, 100); + socket.once("drain", () => { + clearInterval(interval); + res(); + }); + }); + } + } + async load(username37, password, uid) { + await this.connect(); + if (this.socket === null) { + return { reply: -1, data: null }; + } + const request = new Packet(new Uint8Array(2 + 8 + password.length + 1 + 4)); + request.p2(Environment_default.NODE_ID); + request.p8(username37); + request.pjstr(password); + request.p4(uid); + await this.write(this.socket, 1, request.data); + const reply = await this.stream.readByte(this.socket); + if (reply !== 1) { + this.disconnect(); + return { reply, data: null }; + } + const data = new Packet(new Uint8Array(2)); + await this.stream.readBytes(this.socket, data, 0, 2); + const length = data.g2(); + const data2 = new Packet(new Uint8Array(length)); + await this.stream.readBytes(this.socket, data2, 0, length); + this.disconnect(); + return { reply, data: data2 }; + } + async save(username37, save) { + await this.connect(); + if (this.socket === null) { + return -1; + } + const request = new Packet(new Uint8Array(2 + 8 + 2 + save.length)); + request.p2(Environment_default.NODE_ID); + request.p8(username37); + request.p2(save.length); + request.pdata(save, 0, save.length); + await this.write(this.socket, 2, request.data); + const reply = await this.stream.readByte(this.socket); + this.disconnect(); + return reply; + } + async reset() { + await this.connect(); + if (this.socket === null) { + return -1; + } + const request = new Packet(new Uint8Array(2)); + request.p2(Environment_default.NODE_ID); + await this.write(this.socket, 3, request.data); + this.disconnect(); + } + async count(world) { + await this.connect(); + if (this.socket === null) { + return -1; + } + const request = new Packet(new Uint8Array(2)); + request.p2(world); + await this.write(this.socket, 4, request.data); + const reply = new Packet(new Uint8Array(2)); + await this.stream.readBytes(this.socket, reply, 0, 2); + const count = reply.g2(); + this.disconnect(); + return count; + } + async heartbeat(players) { + await this.connect(); + if (this.socket === null) { + return -1; + } + const request = new Packet(new Uint8Array(2 + 2 + players.length * 8)); + request.p2(Environment_default.NODE_ID); + request.p2(players.length); + for (const player of players) { + request.p8(player); + } + await this.write(this.socket, 5, request.data); + this.disconnect(); + } +}; + +// src/lostcity/server/LoginThread.ts +if (typeof self === "undefined") { + if (!parentPort) throw new Error("This file must be run as a worker thread."); + const priv = import_node_forge2.default.pki.privateKeyFromPem(fs3.readFileSync("data/config/private.pem", "ascii")); + parentPort.on("message", async (msg) => { + try { + if (!parentPort) throw new Error("This file must be run as a worker thread."); + await handleRequests(parentPort, msg, priv); + } catch (err) { + console.error(err); + } + }); +} else { + const priv = import_node_forge2.default.pki.privateKeyFromPem(await (await fetch("data/config/private.pem")).text()); + self.onmessage = async (msg) => { + try { + await handleRequests(self, msg.data, priv); + } catch (err) { + console.error(err); + } + }; +} +async function handleRequests(parentPort2, msg, priv) { + switch (msg.type) { + case "reset": { + if (!Environment_default.LOGIN_KEY) { + return; + } + const login = new LoginClient(); + await login.reset(); + break; + } + case "heartbeat": { + if (!Environment_default.LOGIN_KEY) { + return; + } + const login = new LoginClient(); + await login.heartbeat(msg.players); + break; + } + case "loginreq": { + const { opcode, data, socket } = msg; + const stream = new Packet(data); + const revision = stream.g1(); + if (revision !== 225) { + parentPort2.postMessage({ + type: "loginreply", + status: LoginResponse.SERVER_UPDATED, + socket + }); + return; + } + const info = stream.g1(); + const crcs = new Uint8Array(9 * 4); + stream.gdata(crcs, 0, crcs.length); + stream.rsadec(priv); + if (stream.g1() !== 10) { + parentPort2.postMessage({ + type: "loginreply", + status: LoginResponse.LOGIN_REJECTED, + socket + }); + return; + } + const seed = []; + for (let i = 0; i < 4; i++) { + seed[i] = stream.g4(); + } + const uid = stream.g4(); + const username = stream.gjstr(); + const password = stream.gjstr(); + if (username.length < 1 || username.length > 12) { + parentPort2.postMessage({ + type: "loginreply", + status: LoginResponse.INVALID_USER_OR_PASS, + socket + }); + return; + } + if (Environment_default.LOGIN_KEY) { + if (password.length < 5 || password.length > 20) { + parentPort2.postMessage({ + type: "loginreply", + status: LoginResponse.INVALID_USER_OR_PASS, + socket + }); + return; + } + const login = new LoginClient(); + const request = await login.load(toBase37(toSafeName(username)), password, uid); + if (request.reply === 1 && request.data) { + parentPort2.postMessage({ + type: "loginreply", + status: LoginResponse.SUCCESSFUL, + socket, + info, + seed, + username: toSafeName(username), + save: request.data.data + }); + } else if ((request.reply === 2 || request.reply === 3) && opcode === 16) { + parentPort2.postMessage({ + type: "loginreply", + status: LoginResponse.LOGGED_IN, + socket + }); + return; + } else if (request.reply === 3 && opcode === 18) { + parentPort2.postMessage({ + type: "loginreply", + status: LoginResponse.LOGGED_IN, + socket + }); + return; + } else if (request.reply === 4) { + parentPort2.postMessage({ + type: "loginreply", + status: LoginResponse.SUCCESSFUL, + socket, + info, + seed, + username: toSafeName(username), + save: new Uint8Array() + }); + } else if (request.reply === 5) { + parentPort2.postMessage({ + type: "loginreply", + status: LoginResponse.INVALID_USER_OR_PASS, + socket + }); + return; + } else if (request.reply === -1) { + parentPort2.postMessage({ + type: "loginreply", + status: LoginResponse.LOGIN_SERVER_OFFLINE, + socket + }); + return; + } else { + parentPort2.postMessage({ + type: "loginreply", + status: LoginResponse.LOGIN_REJECTED, + socket + }); + return; + } + } else { + let save = new Uint8Array(); + const safeName = toSafeName(username); + if (typeof self === "undefined") { + if (fs3.existsSync(`data/players/${safeName}.sav`)) { + save = await fsp2.readFile(`data/players/${safeName}.sav`); + } + } else { + const saveFile = await fetch(`data/players/${safeName}.sav`); + if (saveFile.ok) { + save = new Uint8Array(await saveFile.arrayBuffer()); + } + } + parentPort2.postMessage({ + type: "loginreply", + status: LoginResponse.SUCCESSFUL, + socket, + info, + seed, + username: safeName, + save + }); + } + break; + } + case "logout": { + const { username, save } = msg; + if (Environment_default.LOGIN_KEY) { + const login = new LoginClient(); + const reply = await login.save(toBase37(username), save); + if (reply === 0) { + parentPort2.postMessage({ + type: "logoutreply", + username + }); + } + } else { + parentPort2.postMessage({ + type: "logoutreply", + username + }); + } + break; + } + default: + console.error("Unknown message type: " + msg.type); + break; + } +} diff --git a/src/public/data/config/login.example.json b/src/public/data/config/login.example.json new file mode 100644 index 00000000..d913c29d --- /dev/null +++ b/src/public/data/config/login.example.json @@ -0,0 +1,6 @@ +{ + "worlds": { + "SuperSecretKey": 1, + "SuperSecretKey2": 2 + } +} \ No newline at end of file diff --git a/src/public/data/config/private.pem b/src/public/data/config/private.pem new file mode 100644 index 00000000..3bb7ec87 --- /dev/null +++ b/src/public/data/config/private.pem @@ -0,0 +1,10 @@ +-----BEGIN PRIVATE KEY----- +MIIBcgIBADANBgkqhkiG9w0BAQEFAASCAVwwggFYAgEAAkEAiMOHSKWCKPcmHNw0 +C1aR19CXXe4OzbcXYJ5r+XHrP+cj750TDkaGgTc5dorZRy60bYv8wELBpfywXpMf +Yy7qXQIhAIHzkLLPjKcDnuUHl1lR1aCxWoe/iz+ZyWaDQRjFD9lNAkBXH7BiBIth +ch6/zx6HcVMkG3DDqibtsPnwahsr4HxOReq6T8NW6oBsvtKY04YTWQpT/eA4PDpB +F1hRYpMkCSXlAiEA12bEXY1UEkjlCVg2WUOK14Ug0Kd8fKayvoFWOoUTahkCIQCi +inQF+Sys+2JOzUx80OWHR/JqcF6eqc20u7PnfB1S5QIhAJIcknTm7h3OH3kbx5Dq +AtzL3tEJyD83H3EMM8GRTmB9AiBb6wjlrcM3AIG08VSVyhxCTeUwS9ck5NaNV8LM +LFx19QIgFdwct6Ho3H2nTDvthwudGhnE1rwbQEeTy9eOAMUMSSY= +-----END PRIVATE KEY----- diff --git a/src/public/data/config/worlds.example.json b/src/public/data/config/worlds.example.json new file mode 100644 index 00000000..89e38752 --- /dev/null +++ b/src/public/data/config/worlds.example.json @@ -0,0 +1,15 @@ +[ + { + "id": 1, + "region": "Central USA", + "address": "https://w1.225.2004scape.org", + "portOffset": 0 + }, + { + "id": 2, + "region": "Central USA", + "address": "https://w2.225.2004scape.org", + "members": true, + "portOffset": 3 + } +] \ No newline at end of file diff --git a/src/public/data/pack/client/config b/src/public/data/pack/client/config new file mode 100644 index 00000000..c44d0df2 Binary files /dev/null and b/src/public/data/pack/client/config differ diff --git a/src/public/data/pack/client/crc b/src/public/data/pack/client/crc new file mode 100644 index 00000000..eaf7d097 Binary files /dev/null and b/src/public/data/pack/client/crc differ diff --git a/src/public/data/pack/client/interface b/src/public/data/pack/client/interface new file mode 100644 index 00000000..18dac326 Binary files /dev/null and b/src/public/data/pack/client/interface differ diff --git a/src/public/data/pack/client/jingles/advance agility.mid b/src/public/data/pack/client/jingles/advance agility.mid new file mode 100644 index 00000000..7d52109c Binary files /dev/null and b/src/public/data/pack/client/jingles/advance agility.mid differ diff --git a/src/public/data/pack/client/jingles/advance attack.mid b/src/public/data/pack/client/jingles/advance attack.mid new file mode 100644 index 00000000..03fbf46a Binary files /dev/null and b/src/public/data/pack/client/jingles/advance attack.mid differ diff --git a/src/public/data/pack/client/jingles/advance attack2.mid b/src/public/data/pack/client/jingles/advance attack2.mid new file mode 100644 index 00000000..5c3fe0d1 Binary files /dev/null and b/src/public/data/pack/client/jingles/advance attack2.mid differ diff --git a/src/public/data/pack/client/jingles/advance cooking.mid b/src/public/data/pack/client/jingles/advance cooking.mid new file mode 100644 index 00000000..0fc39fa1 Binary files /dev/null and b/src/public/data/pack/client/jingles/advance cooking.mid differ diff --git a/src/public/data/pack/client/jingles/advance cooking2.mid b/src/public/data/pack/client/jingles/advance cooking2.mid new file mode 100644 index 00000000..4e1c07c4 Binary files /dev/null and b/src/public/data/pack/client/jingles/advance cooking2.mid differ diff --git a/src/public/data/pack/client/jingles/advance crafting.mid b/src/public/data/pack/client/jingles/advance crafting.mid new file mode 100644 index 00000000..5e58f1fe Binary files /dev/null and b/src/public/data/pack/client/jingles/advance crafting.mid differ diff --git a/src/public/data/pack/client/jingles/advance crafting2.mid b/src/public/data/pack/client/jingles/advance crafting2.mid new file mode 100644 index 00000000..8e957c16 Binary files /dev/null and b/src/public/data/pack/client/jingles/advance crafting2.mid differ diff --git a/src/public/data/pack/client/jingles/advance defense.mid b/src/public/data/pack/client/jingles/advance defense.mid new file mode 100644 index 00000000..5be98239 Binary files /dev/null and b/src/public/data/pack/client/jingles/advance defense.mid differ diff --git a/src/public/data/pack/client/jingles/advance defense2.mid b/src/public/data/pack/client/jingles/advance defense2.mid new file mode 100644 index 00000000..dbca9749 Binary files /dev/null and b/src/public/data/pack/client/jingles/advance defense2.mid differ diff --git a/src/public/data/pack/client/jingles/advance firemarking.mid b/src/public/data/pack/client/jingles/advance firemarking.mid new file mode 100644 index 00000000..0f5334ea Binary files /dev/null and b/src/public/data/pack/client/jingles/advance firemarking.mid differ diff --git a/src/public/data/pack/client/jingles/advance firemarking2.mid b/src/public/data/pack/client/jingles/advance firemarking2.mid new file mode 100644 index 00000000..62159fd1 Binary files /dev/null and b/src/public/data/pack/client/jingles/advance firemarking2.mid differ diff --git a/src/public/data/pack/client/jingles/advance fishing.mid b/src/public/data/pack/client/jingles/advance fishing.mid new file mode 100644 index 00000000..4a4656d7 Binary files /dev/null and b/src/public/data/pack/client/jingles/advance fishing.mid differ diff --git a/src/public/data/pack/client/jingles/advance fishing2.mid b/src/public/data/pack/client/jingles/advance fishing2.mid new file mode 100644 index 00000000..a74eb22b Binary files /dev/null and b/src/public/data/pack/client/jingles/advance fishing2.mid differ diff --git a/src/public/data/pack/client/jingles/advance fletching.mid b/src/public/data/pack/client/jingles/advance fletching.mid new file mode 100644 index 00000000..affb24b2 Binary files /dev/null and b/src/public/data/pack/client/jingles/advance fletching.mid differ diff --git a/src/public/data/pack/client/jingles/advance fletching2.mid b/src/public/data/pack/client/jingles/advance fletching2.mid new file mode 100644 index 00000000..d93de539 Binary files /dev/null and b/src/public/data/pack/client/jingles/advance fletching2.mid differ diff --git a/src/public/data/pack/client/jingles/advance herblaw.mid b/src/public/data/pack/client/jingles/advance herblaw.mid new file mode 100644 index 00000000..3310b935 Binary files /dev/null and b/src/public/data/pack/client/jingles/advance herblaw.mid differ diff --git a/src/public/data/pack/client/jingles/advance herblaw2.mid b/src/public/data/pack/client/jingles/advance herblaw2.mid new file mode 100644 index 00000000..bf92212d Binary files /dev/null and b/src/public/data/pack/client/jingles/advance herblaw2.mid differ diff --git a/src/public/data/pack/client/jingles/advance hitpoints.mid b/src/public/data/pack/client/jingles/advance hitpoints.mid new file mode 100644 index 00000000..23c40e9d Binary files /dev/null and b/src/public/data/pack/client/jingles/advance hitpoints.mid differ diff --git a/src/public/data/pack/client/jingles/advance hitpoints2.mid b/src/public/data/pack/client/jingles/advance hitpoints2.mid new file mode 100644 index 00000000..391c382a Binary files /dev/null and b/src/public/data/pack/client/jingles/advance hitpoints2.mid differ diff --git a/src/public/data/pack/client/jingles/advance magic.mid b/src/public/data/pack/client/jingles/advance magic.mid new file mode 100644 index 00000000..b61f2724 Binary files /dev/null and b/src/public/data/pack/client/jingles/advance magic.mid differ diff --git a/src/public/data/pack/client/jingles/advance magic2.mid b/src/public/data/pack/client/jingles/advance magic2.mid new file mode 100644 index 00000000..2f359ccd Binary files /dev/null and b/src/public/data/pack/client/jingles/advance magic2.mid differ diff --git a/src/public/data/pack/client/jingles/advance mining.mid b/src/public/data/pack/client/jingles/advance mining.mid new file mode 100644 index 00000000..aabf7a4c Binary files /dev/null and b/src/public/data/pack/client/jingles/advance mining.mid differ diff --git a/src/public/data/pack/client/jingles/advance mining2.mid b/src/public/data/pack/client/jingles/advance mining2.mid new file mode 100644 index 00000000..8d030701 Binary files /dev/null and b/src/public/data/pack/client/jingles/advance mining2.mid differ diff --git a/src/public/data/pack/client/jingles/advance prayer.mid b/src/public/data/pack/client/jingles/advance prayer.mid new file mode 100644 index 00000000..52291db5 Binary files /dev/null and b/src/public/data/pack/client/jingles/advance prayer.mid differ diff --git a/src/public/data/pack/client/jingles/advance prayer2.mid b/src/public/data/pack/client/jingles/advance prayer2.mid new file mode 100644 index 00000000..3741da04 Binary files /dev/null and b/src/public/data/pack/client/jingles/advance prayer2.mid differ diff --git a/src/public/data/pack/client/jingles/advance ranged.mid b/src/public/data/pack/client/jingles/advance ranged.mid new file mode 100644 index 00000000..73931e46 Binary files /dev/null and b/src/public/data/pack/client/jingles/advance ranged.mid differ diff --git a/src/public/data/pack/client/jingles/advance ranged2.mid b/src/public/data/pack/client/jingles/advance ranged2.mid new file mode 100644 index 00000000..874dfddf Binary files /dev/null and b/src/public/data/pack/client/jingles/advance ranged2.mid differ diff --git a/src/public/data/pack/client/jingles/advance runecraft.mid b/src/public/data/pack/client/jingles/advance runecraft.mid new file mode 100644 index 00000000..fdedb336 Binary files /dev/null and b/src/public/data/pack/client/jingles/advance runecraft.mid differ diff --git a/src/public/data/pack/client/jingles/advance runecraft2.mid b/src/public/data/pack/client/jingles/advance runecraft2.mid new file mode 100644 index 00000000..576b8180 Binary files /dev/null and b/src/public/data/pack/client/jingles/advance runecraft2.mid differ diff --git a/src/public/data/pack/client/jingles/advance smithing.mid b/src/public/data/pack/client/jingles/advance smithing.mid new file mode 100644 index 00000000..85b235a5 Binary files /dev/null and b/src/public/data/pack/client/jingles/advance smithing.mid differ diff --git a/src/public/data/pack/client/jingles/advance smithing2.mid b/src/public/data/pack/client/jingles/advance smithing2.mid new file mode 100644 index 00000000..1e3f4103 Binary files /dev/null and b/src/public/data/pack/client/jingles/advance smithing2.mid differ diff --git a/src/public/data/pack/client/jingles/advance strength.mid b/src/public/data/pack/client/jingles/advance strength.mid new file mode 100644 index 00000000..4212ff85 Binary files /dev/null and b/src/public/data/pack/client/jingles/advance strength.mid differ diff --git a/src/public/data/pack/client/jingles/advance strength2.mid b/src/public/data/pack/client/jingles/advance strength2.mid new file mode 100644 index 00000000..43838942 Binary files /dev/null and b/src/public/data/pack/client/jingles/advance strength2.mid differ diff --git a/src/public/data/pack/client/jingles/advance thieving.mid b/src/public/data/pack/client/jingles/advance thieving.mid new file mode 100644 index 00000000..9e64bba9 Binary files /dev/null and b/src/public/data/pack/client/jingles/advance thieving.mid differ diff --git a/src/public/data/pack/client/jingles/advance thieving2.mid b/src/public/data/pack/client/jingles/advance thieving2.mid new file mode 100644 index 00000000..1de99024 Binary files /dev/null and b/src/public/data/pack/client/jingles/advance thieving2.mid differ diff --git a/src/public/data/pack/client/jingles/advance woodcutting.mid b/src/public/data/pack/client/jingles/advance woodcutting.mid new file mode 100644 index 00000000..19ed953d Binary files /dev/null and b/src/public/data/pack/client/jingles/advance woodcutting.mid differ diff --git a/src/public/data/pack/client/jingles/advance woodcutting2.mid b/src/public/data/pack/client/jingles/advance woodcutting2.mid new file mode 100644 index 00000000..343ea093 Binary files /dev/null and b/src/public/data/pack/client/jingles/advance woodcutting2.mid differ diff --git a/src/public/data/pack/client/jingles/death.mid b/src/public/data/pack/client/jingles/death.mid new file mode 100644 index 00000000..768973be Binary files /dev/null and b/src/public/data/pack/client/jingles/death.mid differ diff --git a/src/public/data/pack/client/jingles/death2.mid b/src/public/data/pack/client/jingles/death2.mid new file mode 100644 index 00000000..2f3d5e88 Binary files /dev/null and b/src/public/data/pack/client/jingles/death2.mid differ diff --git a/src/public/data/pack/client/jingles/dice lose.mid b/src/public/data/pack/client/jingles/dice lose.mid new file mode 100644 index 00000000..ca362285 Binary files /dev/null and b/src/public/data/pack/client/jingles/dice lose.mid differ diff --git a/src/public/data/pack/client/jingles/dice win.mid b/src/public/data/pack/client/jingles/dice win.mid new file mode 100644 index 00000000..3fc25588 Binary files /dev/null and b/src/public/data/pack/client/jingles/dice win.mid differ diff --git a/src/public/data/pack/client/jingles/duel start.mid b/src/public/data/pack/client/jingles/duel start.mid new file mode 100644 index 00000000..5f190041 Binary files /dev/null and b/src/public/data/pack/client/jingles/duel start.mid differ diff --git a/src/public/data/pack/client/jingles/duel win2.mid b/src/public/data/pack/client/jingles/duel win2.mid new file mode 100644 index 00000000..1bb1234c Binary files /dev/null and b/src/public/data/pack/client/jingles/duel win2.mid differ diff --git a/src/public/data/pack/client/jingles/quest complete 1.mid b/src/public/data/pack/client/jingles/quest complete 1.mid new file mode 100644 index 00000000..830d67f6 Binary files /dev/null and b/src/public/data/pack/client/jingles/quest complete 1.mid differ diff --git a/src/public/data/pack/client/jingles/quest complete 2.mid b/src/public/data/pack/client/jingles/quest complete 2.mid new file mode 100644 index 00000000..188abbed Binary files /dev/null and b/src/public/data/pack/client/jingles/quest complete 2.mid differ diff --git a/src/public/data/pack/client/jingles/quest complete 3.mid b/src/public/data/pack/client/jingles/quest complete 3.mid new file mode 100644 index 00000000..deacf11b Binary files /dev/null and b/src/public/data/pack/client/jingles/quest complete 3.mid differ diff --git a/src/public/data/pack/client/jingles/sailing journey.mid b/src/public/data/pack/client/jingles/sailing journey.mid new file mode 100644 index 00000000..0ce4478c Binary files /dev/null and b/src/public/data/pack/client/jingles/sailing journey.mid differ diff --git a/src/public/data/pack/client/jingles/treasure hunt win.mid b/src/public/data/pack/client/jingles/treasure hunt win.mid new file mode 100644 index 00000000..206e1b2c Binary files /dev/null and b/src/public/data/pack/client/jingles/treasure hunt win.mid differ diff --git a/src/public/data/pack/client/lastbuild.pack b/src/public/data/pack/client/lastbuild.pack new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/client/maps/l29_75 b/src/public/data/pack/client/maps/l29_75 new file mode 100644 index 00000000..2c4f7a0a Binary files /dev/null and b/src/public/data/pack/client/maps/l29_75 differ diff --git a/src/public/data/pack/client/maps/l30_75 b/src/public/data/pack/client/maps/l30_75 new file mode 100644 index 00000000..e44550b0 Binary files /dev/null and b/src/public/data/pack/client/maps/l30_75 differ diff --git a/src/public/data/pack/client/maps/l31_75 b/src/public/data/pack/client/maps/l31_75 new file mode 100644 index 00000000..c04fce8b Binary files /dev/null and b/src/public/data/pack/client/maps/l31_75 differ diff --git a/src/public/data/pack/client/maps/l32_70 b/src/public/data/pack/client/maps/l32_70 new file mode 100644 index 00000000..5f3f0ccd Binary files /dev/null and b/src/public/data/pack/client/maps/l32_70 differ diff --git a/src/public/data/pack/client/maps/l32_71 b/src/public/data/pack/client/maps/l32_71 new file mode 100644 index 00000000..7e88fe74 Binary files /dev/null and b/src/public/data/pack/client/maps/l32_71 differ diff --git a/src/public/data/pack/client/maps/l32_72 b/src/public/data/pack/client/maps/l32_72 new file mode 100644 index 00000000..8254e609 Binary files /dev/null and b/src/public/data/pack/client/maps/l32_72 differ diff --git a/src/public/data/pack/client/maps/l32_73 b/src/public/data/pack/client/maps/l32_73 new file mode 100644 index 00000000..6cd56003 Binary files /dev/null and b/src/public/data/pack/client/maps/l32_73 differ diff --git a/src/public/data/pack/client/maps/l32_74 b/src/public/data/pack/client/maps/l32_74 new file mode 100644 index 00000000..dc89daa1 Binary files /dev/null and b/src/public/data/pack/client/maps/l32_74 differ diff --git a/src/public/data/pack/client/maps/l32_75 b/src/public/data/pack/client/maps/l32_75 new file mode 100644 index 00000000..6e279b55 Binary files /dev/null and b/src/public/data/pack/client/maps/l32_75 differ diff --git a/src/public/data/pack/client/maps/l33_70 b/src/public/data/pack/client/maps/l33_70 new file mode 100644 index 00000000..1b4bd7df Binary files /dev/null and b/src/public/data/pack/client/maps/l33_70 differ diff --git a/src/public/data/pack/client/maps/l33_71 b/src/public/data/pack/client/maps/l33_71 new file mode 100644 index 00000000..e9e5b98d Binary files /dev/null and b/src/public/data/pack/client/maps/l33_71 differ diff --git a/src/public/data/pack/client/maps/l33_72 b/src/public/data/pack/client/maps/l33_72 new file mode 100644 index 00000000..3a614a09 Binary files /dev/null and b/src/public/data/pack/client/maps/l33_72 differ diff --git a/src/public/data/pack/client/maps/l33_73 b/src/public/data/pack/client/maps/l33_73 new file mode 100644 index 00000000..e5205969 Binary files /dev/null and b/src/public/data/pack/client/maps/l33_73 differ diff --git a/src/public/data/pack/client/maps/l33_74 b/src/public/data/pack/client/maps/l33_74 new file mode 100644 index 00000000..54a0344e Binary files /dev/null and b/src/public/data/pack/client/maps/l33_74 differ diff --git a/src/public/data/pack/client/maps/l33_75 b/src/public/data/pack/client/maps/l33_75 new file mode 100644 index 00000000..fa0d8604 Binary files /dev/null and b/src/public/data/pack/client/maps/l33_75 differ diff --git a/src/public/data/pack/client/maps/l33_76 b/src/public/data/pack/client/maps/l33_76 new file mode 100644 index 00000000..cfd53240 Binary files /dev/null and b/src/public/data/pack/client/maps/l33_76 differ diff --git a/src/public/data/pack/client/maps/l34_70 b/src/public/data/pack/client/maps/l34_70 new file mode 100644 index 00000000..f6f8296a Binary files /dev/null and b/src/public/data/pack/client/maps/l34_70 differ diff --git a/src/public/data/pack/client/maps/l34_71 b/src/public/data/pack/client/maps/l34_71 new file mode 100644 index 00000000..cfc77729 Binary files /dev/null and b/src/public/data/pack/client/maps/l34_71 differ diff --git a/src/public/data/pack/client/maps/l34_72 b/src/public/data/pack/client/maps/l34_72 new file mode 100644 index 00000000..809d23a8 Binary files /dev/null and b/src/public/data/pack/client/maps/l34_72 differ diff --git a/src/public/data/pack/client/maps/l34_73 b/src/public/data/pack/client/maps/l34_73 new file mode 100644 index 00000000..4c8c3ff9 Binary files /dev/null and b/src/public/data/pack/client/maps/l34_73 differ diff --git a/src/public/data/pack/client/maps/l34_74 b/src/public/data/pack/client/maps/l34_74 new file mode 100644 index 00000000..2925b457 Binary files /dev/null and b/src/public/data/pack/client/maps/l34_74 differ diff --git a/src/public/data/pack/client/maps/l34_75 b/src/public/data/pack/client/maps/l34_75 new file mode 100644 index 00000000..a4970835 Binary files /dev/null and b/src/public/data/pack/client/maps/l34_75 differ diff --git a/src/public/data/pack/client/maps/l34_76 b/src/public/data/pack/client/maps/l34_76 new file mode 100644 index 00000000..fe7816b3 Binary files /dev/null and b/src/public/data/pack/client/maps/l34_76 differ diff --git a/src/public/data/pack/client/maps/l35_20 b/src/public/data/pack/client/maps/l35_20 new file mode 100644 index 00000000..5117d2ea Binary files /dev/null and b/src/public/data/pack/client/maps/l35_20 differ diff --git a/src/public/data/pack/client/maps/l35_75 b/src/public/data/pack/client/maps/l35_75 new file mode 100644 index 00000000..d208c278 Binary files /dev/null and b/src/public/data/pack/client/maps/l35_75 differ diff --git a/src/public/data/pack/client/maps/l35_76 b/src/public/data/pack/client/maps/l35_76 new file mode 100644 index 00000000..d7601b90 Binary files /dev/null and b/src/public/data/pack/client/maps/l35_76 differ diff --git a/src/public/data/pack/client/maps/l36_146 b/src/public/data/pack/client/maps/l36_146 new file mode 100644 index 00000000..286fafdb Binary files /dev/null and b/src/public/data/pack/client/maps/l36_146 differ diff --git a/src/public/data/pack/client/maps/l36_147 b/src/public/data/pack/client/maps/l36_147 new file mode 100644 index 00000000..1834a104 Binary files /dev/null and b/src/public/data/pack/client/maps/l36_147 differ diff --git a/src/public/data/pack/client/maps/l36_148 b/src/public/data/pack/client/maps/l36_148 new file mode 100644 index 00000000..0a067ebc Binary files /dev/null and b/src/public/data/pack/client/maps/l36_148 differ diff --git a/src/public/data/pack/client/maps/l36_149 b/src/public/data/pack/client/maps/l36_149 new file mode 100644 index 00000000..eb8a9577 Binary files /dev/null and b/src/public/data/pack/client/maps/l36_149 differ diff --git a/src/public/data/pack/client/maps/l36_150 b/src/public/data/pack/client/maps/l36_150 new file mode 100644 index 00000000..31939793 Binary files /dev/null and b/src/public/data/pack/client/maps/l36_150 differ diff --git a/src/public/data/pack/client/maps/l36_153 b/src/public/data/pack/client/maps/l36_153 new file mode 100644 index 00000000..81b6e93a Binary files /dev/null and b/src/public/data/pack/client/maps/l36_153 differ diff --git a/src/public/data/pack/client/maps/l36_154 b/src/public/data/pack/client/maps/l36_154 new file mode 100644 index 00000000..c2c42b9d Binary files /dev/null and b/src/public/data/pack/client/maps/l36_154 differ diff --git a/src/public/data/pack/client/maps/l36_52 b/src/public/data/pack/client/maps/l36_52 new file mode 100644 index 00000000..514f48b8 Binary files /dev/null and b/src/public/data/pack/client/maps/l36_52 differ diff --git a/src/public/data/pack/client/maps/l36_53 b/src/public/data/pack/client/maps/l36_53 new file mode 100644 index 00000000..8e1d9cef Binary files /dev/null and b/src/public/data/pack/client/maps/l36_53 differ diff --git a/src/public/data/pack/client/maps/l36_54 b/src/public/data/pack/client/maps/l36_54 new file mode 100644 index 00000000..f63ce2bb Binary files /dev/null and b/src/public/data/pack/client/maps/l36_54 differ diff --git a/src/public/data/pack/client/maps/l36_72 b/src/public/data/pack/client/maps/l36_72 new file mode 100644 index 00000000..51e105e3 Binary files /dev/null and b/src/public/data/pack/client/maps/l36_72 differ diff --git a/src/public/data/pack/client/maps/l36_73 b/src/public/data/pack/client/maps/l36_73 new file mode 100644 index 00000000..fd4f29e1 Binary files /dev/null and b/src/public/data/pack/client/maps/l36_73 differ diff --git a/src/public/data/pack/client/maps/l36_74 b/src/public/data/pack/client/maps/l36_74 new file mode 100644 index 00000000..d671952b Binary files /dev/null and b/src/public/data/pack/client/maps/l36_74 differ diff --git a/src/public/data/pack/client/maps/l36_75 b/src/public/data/pack/client/maps/l36_75 new file mode 100644 index 00000000..ec1835bb Binary files /dev/null and b/src/public/data/pack/client/maps/l36_75 differ diff --git a/src/public/data/pack/client/maps/l36_76 b/src/public/data/pack/client/maps/l36_76 new file mode 100644 index 00000000..9b259203 Binary files /dev/null and b/src/public/data/pack/client/maps/l36_76 differ diff --git a/src/public/data/pack/client/maps/l37_146 b/src/public/data/pack/client/maps/l37_146 new file mode 100644 index 00000000..ebb25396 Binary files /dev/null and b/src/public/data/pack/client/maps/l37_146 differ diff --git a/src/public/data/pack/client/maps/l37_147 b/src/public/data/pack/client/maps/l37_147 new file mode 100644 index 00000000..c5bbd8b8 Binary files /dev/null and b/src/public/data/pack/client/maps/l37_147 differ diff --git a/src/public/data/pack/client/maps/l37_148 b/src/public/data/pack/client/maps/l37_148 new file mode 100644 index 00000000..10f0cfa7 Binary files /dev/null and b/src/public/data/pack/client/maps/l37_148 differ diff --git a/src/public/data/pack/client/maps/l37_149 b/src/public/data/pack/client/maps/l37_149 new file mode 100644 index 00000000..e40a262d Binary files /dev/null and b/src/public/data/pack/client/maps/l37_149 differ diff --git a/src/public/data/pack/client/maps/l37_150 b/src/public/data/pack/client/maps/l37_150 new file mode 100644 index 00000000..21c3f192 Binary files /dev/null and b/src/public/data/pack/client/maps/l37_150 differ diff --git a/src/public/data/pack/client/maps/l37_151 b/src/public/data/pack/client/maps/l37_151 new file mode 100644 index 00000000..5925846f Binary files /dev/null and b/src/public/data/pack/client/maps/l37_151 differ diff --git a/src/public/data/pack/client/maps/l37_152 b/src/public/data/pack/client/maps/l37_152 new file mode 100644 index 00000000..88f8bccd Binary files /dev/null and b/src/public/data/pack/client/maps/l37_152 differ diff --git a/src/public/data/pack/client/maps/l37_153 b/src/public/data/pack/client/maps/l37_153 new file mode 100644 index 00000000..9f959f48 Binary files /dev/null and b/src/public/data/pack/client/maps/l37_153 differ diff --git a/src/public/data/pack/client/maps/l37_154 b/src/public/data/pack/client/maps/l37_154 new file mode 100644 index 00000000..6de19b9f Binary files /dev/null and b/src/public/data/pack/client/maps/l37_154 differ diff --git a/src/public/data/pack/client/maps/l37_48 b/src/public/data/pack/client/maps/l37_48 new file mode 100644 index 00000000..4c7334f0 Binary files /dev/null and b/src/public/data/pack/client/maps/l37_48 differ diff --git a/src/public/data/pack/client/maps/l37_49 b/src/public/data/pack/client/maps/l37_49 new file mode 100644 index 00000000..d33af861 Binary files /dev/null and b/src/public/data/pack/client/maps/l37_49 differ diff --git a/src/public/data/pack/client/maps/l37_50 b/src/public/data/pack/client/maps/l37_50 new file mode 100644 index 00000000..d799c005 Binary files /dev/null and b/src/public/data/pack/client/maps/l37_50 differ diff --git a/src/public/data/pack/client/maps/l37_51 b/src/public/data/pack/client/maps/l37_51 new file mode 100644 index 00000000..2da9025e Binary files /dev/null and b/src/public/data/pack/client/maps/l37_51 differ diff --git a/src/public/data/pack/client/maps/l37_52 b/src/public/data/pack/client/maps/l37_52 new file mode 100644 index 00000000..4bec83cb Binary files /dev/null and b/src/public/data/pack/client/maps/l37_52 differ diff --git a/src/public/data/pack/client/maps/l37_53 b/src/public/data/pack/client/maps/l37_53 new file mode 100644 index 00000000..61fe9ff7 Binary files /dev/null and b/src/public/data/pack/client/maps/l37_53 differ diff --git a/src/public/data/pack/client/maps/l37_54 b/src/public/data/pack/client/maps/l37_54 new file mode 100644 index 00000000..df66893a Binary files /dev/null and b/src/public/data/pack/client/maps/l37_54 differ diff --git a/src/public/data/pack/client/maps/l37_55 b/src/public/data/pack/client/maps/l37_55 new file mode 100644 index 00000000..b4514c33 Binary files /dev/null and b/src/public/data/pack/client/maps/l37_55 differ diff --git a/src/public/data/pack/client/maps/l37_72 b/src/public/data/pack/client/maps/l37_72 new file mode 100644 index 00000000..015c1b9c Binary files /dev/null and b/src/public/data/pack/client/maps/l37_72 differ diff --git a/src/public/data/pack/client/maps/l37_73 b/src/public/data/pack/client/maps/l37_73 new file mode 100644 index 00000000..0d8eea7e Binary files /dev/null and b/src/public/data/pack/client/maps/l37_73 differ diff --git a/src/public/data/pack/client/maps/l37_74 b/src/public/data/pack/client/maps/l37_74 new file mode 100644 index 00000000..07f56293 Binary files /dev/null and b/src/public/data/pack/client/maps/l37_74 differ diff --git a/src/public/data/pack/client/maps/l37_75 b/src/public/data/pack/client/maps/l37_75 new file mode 100644 index 00000000..09ad4553 Binary files /dev/null and b/src/public/data/pack/client/maps/l37_75 differ diff --git a/src/public/data/pack/client/maps/l38_146 b/src/public/data/pack/client/maps/l38_146 new file mode 100644 index 00000000..c6237782 Binary files /dev/null and b/src/public/data/pack/client/maps/l38_146 differ diff --git a/src/public/data/pack/client/maps/l38_147 b/src/public/data/pack/client/maps/l38_147 new file mode 100644 index 00000000..803843c4 Binary files /dev/null and b/src/public/data/pack/client/maps/l38_147 differ diff --git a/src/public/data/pack/client/maps/l38_148 b/src/public/data/pack/client/maps/l38_148 new file mode 100644 index 00000000..6c6e3d22 Binary files /dev/null and b/src/public/data/pack/client/maps/l38_148 differ diff --git a/src/public/data/pack/client/maps/l38_149 b/src/public/data/pack/client/maps/l38_149 new file mode 100644 index 00000000..21407a89 Binary files /dev/null and b/src/public/data/pack/client/maps/l38_149 differ diff --git a/src/public/data/pack/client/maps/l38_150 b/src/public/data/pack/client/maps/l38_150 new file mode 100644 index 00000000..c441d40e Binary files /dev/null and b/src/public/data/pack/client/maps/l38_150 differ diff --git a/src/public/data/pack/client/maps/l38_151 b/src/public/data/pack/client/maps/l38_151 new file mode 100644 index 00000000..323b3018 Binary files /dev/null and b/src/public/data/pack/client/maps/l38_151 differ diff --git a/src/public/data/pack/client/maps/l38_152 b/src/public/data/pack/client/maps/l38_152 new file mode 100644 index 00000000..54368120 Binary files /dev/null and b/src/public/data/pack/client/maps/l38_152 differ diff --git a/src/public/data/pack/client/maps/l38_153 b/src/public/data/pack/client/maps/l38_153 new file mode 100644 index 00000000..1fe7fc1d Binary files /dev/null and b/src/public/data/pack/client/maps/l38_153 differ diff --git a/src/public/data/pack/client/maps/l38_154 b/src/public/data/pack/client/maps/l38_154 new file mode 100644 index 00000000..3dc58926 Binary files /dev/null and b/src/public/data/pack/client/maps/l38_154 differ diff --git a/src/public/data/pack/client/maps/l38_155 b/src/public/data/pack/client/maps/l38_155 new file mode 100644 index 00000000..f0898aeb Binary files /dev/null and b/src/public/data/pack/client/maps/l38_155 differ diff --git a/src/public/data/pack/client/maps/l38_45 b/src/public/data/pack/client/maps/l38_45 new file mode 100644 index 00000000..44f6dcd0 Binary files /dev/null and b/src/public/data/pack/client/maps/l38_45 differ diff --git a/src/public/data/pack/client/maps/l38_46 b/src/public/data/pack/client/maps/l38_46 new file mode 100644 index 00000000..0c6b3598 Binary files /dev/null and b/src/public/data/pack/client/maps/l38_46 differ diff --git a/src/public/data/pack/client/maps/l38_47 b/src/public/data/pack/client/maps/l38_47 new file mode 100644 index 00000000..d7f57927 Binary files /dev/null and b/src/public/data/pack/client/maps/l38_47 differ diff --git a/src/public/data/pack/client/maps/l38_48 b/src/public/data/pack/client/maps/l38_48 new file mode 100644 index 00000000..bd13ac6f Binary files /dev/null and b/src/public/data/pack/client/maps/l38_48 differ diff --git a/src/public/data/pack/client/maps/l38_49 b/src/public/data/pack/client/maps/l38_49 new file mode 100644 index 00000000..df3ed0f1 Binary files /dev/null and b/src/public/data/pack/client/maps/l38_49 differ diff --git a/src/public/data/pack/client/maps/l38_50 b/src/public/data/pack/client/maps/l38_50 new file mode 100644 index 00000000..2ce7d2c4 Binary files /dev/null and b/src/public/data/pack/client/maps/l38_50 differ diff --git a/src/public/data/pack/client/maps/l38_51 b/src/public/data/pack/client/maps/l38_51 new file mode 100644 index 00000000..0a625e81 Binary files /dev/null and b/src/public/data/pack/client/maps/l38_51 differ diff --git a/src/public/data/pack/client/maps/l38_52 b/src/public/data/pack/client/maps/l38_52 new file mode 100644 index 00000000..d9f1521b Binary files /dev/null and b/src/public/data/pack/client/maps/l38_52 differ diff --git a/src/public/data/pack/client/maps/l38_53 b/src/public/data/pack/client/maps/l38_53 new file mode 100644 index 00000000..f9d107c7 Binary files /dev/null and b/src/public/data/pack/client/maps/l38_53 differ diff --git a/src/public/data/pack/client/maps/l38_54 b/src/public/data/pack/client/maps/l38_54 new file mode 100644 index 00000000..c7636cee Binary files /dev/null and b/src/public/data/pack/client/maps/l38_54 differ diff --git a/src/public/data/pack/client/maps/l38_55 b/src/public/data/pack/client/maps/l38_55 new file mode 100644 index 00000000..20febb9d Binary files /dev/null and b/src/public/data/pack/client/maps/l38_55 differ diff --git a/src/public/data/pack/client/maps/l38_72 b/src/public/data/pack/client/maps/l38_72 new file mode 100644 index 00000000..579703b0 Binary files /dev/null and b/src/public/data/pack/client/maps/l38_72 differ diff --git a/src/public/data/pack/client/maps/l38_73 b/src/public/data/pack/client/maps/l38_73 new file mode 100644 index 00000000..f57f3d21 Binary files /dev/null and b/src/public/data/pack/client/maps/l38_73 differ diff --git a/src/public/data/pack/client/maps/l38_74 b/src/public/data/pack/client/maps/l38_74 new file mode 100644 index 00000000..6ada1f9b Binary files /dev/null and b/src/public/data/pack/client/maps/l38_74 differ diff --git a/src/public/data/pack/client/maps/l39_147 b/src/public/data/pack/client/maps/l39_147 new file mode 100644 index 00000000..f897e6c2 Binary files /dev/null and b/src/public/data/pack/client/maps/l39_147 differ diff --git a/src/public/data/pack/client/maps/l39_148 b/src/public/data/pack/client/maps/l39_148 new file mode 100644 index 00000000..b8ddb2d6 Binary files /dev/null and b/src/public/data/pack/client/maps/l39_148 differ diff --git a/src/public/data/pack/client/maps/l39_149 b/src/public/data/pack/client/maps/l39_149 new file mode 100644 index 00000000..05e6c3e0 Binary files /dev/null and b/src/public/data/pack/client/maps/l39_149 differ diff --git a/src/public/data/pack/client/maps/l39_150 b/src/public/data/pack/client/maps/l39_150 new file mode 100644 index 00000000..09639be4 Binary files /dev/null and b/src/public/data/pack/client/maps/l39_150 differ diff --git a/src/public/data/pack/client/maps/l39_151 b/src/public/data/pack/client/maps/l39_151 new file mode 100644 index 00000000..b3359640 Binary files /dev/null and b/src/public/data/pack/client/maps/l39_151 differ diff --git a/src/public/data/pack/client/maps/l39_152 b/src/public/data/pack/client/maps/l39_152 new file mode 100644 index 00000000..570016bf Binary files /dev/null and b/src/public/data/pack/client/maps/l39_152 differ diff --git a/src/public/data/pack/client/maps/l39_153 b/src/public/data/pack/client/maps/l39_153 new file mode 100644 index 00000000..5ba0fa20 Binary files /dev/null and b/src/public/data/pack/client/maps/l39_153 differ diff --git a/src/public/data/pack/client/maps/l39_154 b/src/public/data/pack/client/maps/l39_154 new file mode 100644 index 00000000..d32a5033 Binary files /dev/null and b/src/public/data/pack/client/maps/l39_154 differ diff --git a/src/public/data/pack/client/maps/l39_155 b/src/public/data/pack/client/maps/l39_155 new file mode 100644 index 00000000..eeba5f3c Binary files /dev/null and b/src/public/data/pack/client/maps/l39_155 differ diff --git a/src/public/data/pack/client/maps/l39_45 b/src/public/data/pack/client/maps/l39_45 new file mode 100644 index 00000000..ed754cb7 Binary files /dev/null and b/src/public/data/pack/client/maps/l39_45 differ diff --git a/src/public/data/pack/client/maps/l39_46 b/src/public/data/pack/client/maps/l39_46 new file mode 100644 index 00000000..8813e78a Binary files /dev/null and b/src/public/data/pack/client/maps/l39_46 differ diff --git a/src/public/data/pack/client/maps/l39_47 b/src/public/data/pack/client/maps/l39_47 new file mode 100644 index 00000000..6ef6d044 Binary files /dev/null and b/src/public/data/pack/client/maps/l39_47 differ diff --git a/src/public/data/pack/client/maps/l39_48 b/src/public/data/pack/client/maps/l39_48 new file mode 100644 index 00000000..6602d6c9 Binary files /dev/null and b/src/public/data/pack/client/maps/l39_48 differ diff --git a/src/public/data/pack/client/maps/l39_49 b/src/public/data/pack/client/maps/l39_49 new file mode 100644 index 00000000..964fa69f Binary files /dev/null and b/src/public/data/pack/client/maps/l39_49 differ diff --git a/src/public/data/pack/client/maps/l39_50 b/src/public/data/pack/client/maps/l39_50 new file mode 100644 index 00000000..b670ad0b Binary files /dev/null and b/src/public/data/pack/client/maps/l39_50 differ diff --git a/src/public/data/pack/client/maps/l39_51 b/src/public/data/pack/client/maps/l39_51 new file mode 100644 index 00000000..0decaba5 Binary files /dev/null and b/src/public/data/pack/client/maps/l39_51 differ diff --git a/src/public/data/pack/client/maps/l39_52 b/src/public/data/pack/client/maps/l39_52 new file mode 100644 index 00000000..3337d655 Binary files /dev/null and b/src/public/data/pack/client/maps/l39_52 differ diff --git a/src/public/data/pack/client/maps/l39_53 b/src/public/data/pack/client/maps/l39_53 new file mode 100644 index 00000000..93154297 Binary files /dev/null and b/src/public/data/pack/client/maps/l39_53 differ diff --git a/src/public/data/pack/client/maps/l39_54 b/src/public/data/pack/client/maps/l39_54 new file mode 100644 index 00000000..80fc7377 Binary files /dev/null and b/src/public/data/pack/client/maps/l39_54 differ diff --git a/src/public/data/pack/client/maps/l39_55 b/src/public/data/pack/client/maps/l39_55 new file mode 100644 index 00000000..7e0025e0 Binary files /dev/null and b/src/public/data/pack/client/maps/l39_55 differ diff --git a/src/public/data/pack/client/maps/l39_72 b/src/public/data/pack/client/maps/l39_72 new file mode 100644 index 00000000..fc05a032 Binary files /dev/null and b/src/public/data/pack/client/maps/l39_72 differ diff --git a/src/public/data/pack/client/maps/l39_73 b/src/public/data/pack/client/maps/l39_73 new file mode 100644 index 00000000..6c47e6de Binary files /dev/null and b/src/public/data/pack/client/maps/l39_73 differ diff --git a/src/public/data/pack/client/maps/l39_74 b/src/public/data/pack/client/maps/l39_74 new file mode 100644 index 00000000..2c8ca955 Binary files /dev/null and b/src/public/data/pack/client/maps/l39_74 differ diff --git a/src/public/data/pack/client/maps/l39_75 b/src/public/data/pack/client/maps/l39_75 new file mode 100644 index 00000000..12ed1daa Binary files /dev/null and b/src/public/data/pack/client/maps/l39_75 differ diff --git a/src/public/data/pack/client/maps/l39_76 b/src/public/data/pack/client/maps/l39_76 new file mode 100644 index 00000000..0bea06dc Binary files /dev/null and b/src/public/data/pack/client/maps/l39_76 differ diff --git a/src/public/data/pack/client/maps/l40_147 b/src/public/data/pack/client/maps/l40_147 new file mode 100644 index 00000000..a0c767ce Binary files /dev/null and b/src/public/data/pack/client/maps/l40_147 differ diff --git a/src/public/data/pack/client/maps/l40_148 b/src/public/data/pack/client/maps/l40_148 new file mode 100644 index 00000000..2b061276 Binary files /dev/null and b/src/public/data/pack/client/maps/l40_148 differ diff --git a/src/public/data/pack/client/maps/l40_149 b/src/public/data/pack/client/maps/l40_149 new file mode 100644 index 00000000..0452210f Binary files /dev/null and b/src/public/data/pack/client/maps/l40_149 differ diff --git a/src/public/data/pack/client/maps/l40_150 b/src/public/data/pack/client/maps/l40_150 new file mode 100644 index 00000000..5ad98435 Binary files /dev/null and b/src/public/data/pack/client/maps/l40_150 differ diff --git a/src/public/data/pack/client/maps/l40_151 b/src/public/data/pack/client/maps/l40_151 new file mode 100644 index 00000000..05d1b7c2 Binary files /dev/null and b/src/public/data/pack/client/maps/l40_151 differ diff --git a/src/public/data/pack/client/maps/l40_152 b/src/public/data/pack/client/maps/l40_152 new file mode 100644 index 00000000..1dbcbee2 Binary files /dev/null and b/src/public/data/pack/client/maps/l40_152 differ diff --git a/src/public/data/pack/client/maps/l40_153 b/src/public/data/pack/client/maps/l40_153 new file mode 100644 index 00000000..11d864cd Binary files /dev/null and b/src/public/data/pack/client/maps/l40_153 differ diff --git a/src/public/data/pack/client/maps/l40_154 b/src/public/data/pack/client/maps/l40_154 new file mode 100644 index 00000000..9ce7fb56 Binary files /dev/null and b/src/public/data/pack/client/maps/l40_154 differ diff --git a/src/public/data/pack/client/maps/l40_45 b/src/public/data/pack/client/maps/l40_45 new file mode 100644 index 00000000..0f438cce Binary files /dev/null and b/src/public/data/pack/client/maps/l40_45 differ diff --git a/src/public/data/pack/client/maps/l40_46 b/src/public/data/pack/client/maps/l40_46 new file mode 100644 index 00000000..2d5ca80e Binary files /dev/null and b/src/public/data/pack/client/maps/l40_46 differ diff --git a/src/public/data/pack/client/maps/l40_47 b/src/public/data/pack/client/maps/l40_47 new file mode 100644 index 00000000..cd27c80b Binary files /dev/null and b/src/public/data/pack/client/maps/l40_47 differ diff --git a/src/public/data/pack/client/maps/l40_48 b/src/public/data/pack/client/maps/l40_48 new file mode 100644 index 00000000..2888851c Binary files /dev/null and b/src/public/data/pack/client/maps/l40_48 differ diff --git a/src/public/data/pack/client/maps/l40_49 b/src/public/data/pack/client/maps/l40_49 new file mode 100644 index 00000000..b9a6b3c9 Binary files /dev/null and b/src/public/data/pack/client/maps/l40_49 differ diff --git a/src/public/data/pack/client/maps/l40_50 b/src/public/data/pack/client/maps/l40_50 new file mode 100644 index 00000000..9268d227 Binary files /dev/null and b/src/public/data/pack/client/maps/l40_50 differ diff --git a/src/public/data/pack/client/maps/l40_51 b/src/public/data/pack/client/maps/l40_51 new file mode 100644 index 00000000..97c626a7 Binary files /dev/null and b/src/public/data/pack/client/maps/l40_51 differ diff --git a/src/public/data/pack/client/maps/l40_52 b/src/public/data/pack/client/maps/l40_52 new file mode 100644 index 00000000..558abcb7 Binary files /dev/null and b/src/public/data/pack/client/maps/l40_52 differ diff --git a/src/public/data/pack/client/maps/l40_53 b/src/public/data/pack/client/maps/l40_53 new file mode 100644 index 00000000..4b672f70 Binary files /dev/null and b/src/public/data/pack/client/maps/l40_53 differ diff --git a/src/public/data/pack/client/maps/l40_54 b/src/public/data/pack/client/maps/l40_54 new file mode 100644 index 00000000..8d193b42 Binary files /dev/null and b/src/public/data/pack/client/maps/l40_54 differ diff --git a/src/public/data/pack/client/maps/l40_55 b/src/public/data/pack/client/maps/l40_55 new file mode 100644 index 00000000..51df3fde Binary files /dev/null and b/src/public/data/pack/client/maps/l40_55 differ diff --git a/src/public/data/pack/client/maps/l40_72 b/src/public/data/pack/client/maps/l40_72 new file mode 100644 index 00000000..c9f79959 Binary files /dev/null and b/src/public/data/pack/client/maps/l40_72 differ diff --git a/src/public/data/pack/client/maps/l40_73 b/src/public/data/pack/client/maps/l40_73 new file mode 100644 index 00000000..08911f9b Binary files /dev/null and b/src/public/data/pack/client/maps/l40_73 differ diff --git a/src/public/data/pack/client/maps/l40_74 b/src/public/data/pack/client/maps/l40_74 new file mode 100644 index 00000000..63b94c73 Binary files /dev/null and b/src/public/data/pack/client/maps/l40_74 differ diff --git a/src/public/data/pack/client/maps/l40_75 b/src/public/data/pack/client/maps/l40_75 new file mode 100644 index 00000000..3c1f158c Binary files /dev/null and b/src/public/data/pack/client/maps/l40_75 differ diff --git a/src/public/data/pack/client/maps/l40_76 b/src/public/data/pack/client/maps/l40_76 new file mode 100644 index 00000000..c9f79959 Binary files /dev/null and b/src/public/data/pack/client/maps/l40_76 differ diff --git a/src/public/data/pack/client/maps/l41_146 b/src/public/data/pack/client/maps/l41_146 new file mode 100644 index 00000000..93f5f6d1 Binary files /dev/null and b/src/public/data/pack/client/maps/l41_146 differ diff --git a/src/public/data/pack/client/maps/l41_149 b/src/public/data/pack/client/maps/l41_149 new file mode 100644 index 00000000..b6fb9451 Binary files /dev/null and b/src/public/data/pack/client/maps/l41_149 differ diff --git a/src/public/data/pack/client/maps/l41_151 b/src/public/data/pack/client/maps/l41_151 new file mode 100644 index 00000000..7f5cc45e Binary files /dev/null and b/src/public/data/pack/client/maps/l41_151 differ diff --git a/src/public/data/pack/client/maps/l41_152 b/src/public/data/pack/client/maps/l41_152 new file mode 100644 index 00000000..10222d90 Binary files /dev/null and b/src/public/data/pack/client/maps/l41_152 differ diff --git a/src/public/data/pack/client/maps/l41_153 b/src/public/data/pack/client/maps/l41_153 new file mode 100644 index 00000000..97ef385d Binary files /dev/null and b/src/public/data/pack/client/maps/l41_153 differ diff --git a/src/public/data/pack/client/maps/l41_154 b/src/public/data/pack/client/maps/l41_154 new file mode 100644 index 00000000..59c20dd2 Binary files /dev/null and b/src/public/data/pack/client/maps/l41_154 differ diff --git a/src/public/data/pack/client/maps/l41_45 b/src/public/data/pack/client/maps/l41_45 new file mode 100644 index 00000000..de199f8c Binary files /dev/null and b/src/public/data/pack/client/maps/l41_45 differ diff --git a/src/public/data/pack/client/maps/l41_46 b/src/public/data/pack/client/maps/l41_46 new file mode 100644 index 00000000..ddc4e472 Binary files /dev/null and b/src/public/data/pack/client/maps/l41_46 differ diff --git a/src/public/data/pack/client/maps/l41_47 b/src/public/data/pack/client/maps/l41_47 new file mode 100644 index 00000000..426991cc Binary files /dev/null and b/src/public/data/pack/client/maps/l41_47 differ diff --git a/src/public/data/pack/client/maps/l41_48 b/src/public/data/pack/client/maps/l41_48 new file mode 100644 index 00000000..3f21f108 Binary files /dev/null and b/src/public/data/pack/client/maps/l41_48 differ diff --git a/src/public/data/pack/client/maps/l41_49 b/src/public/data/pack/client/maps/l41_49 new file mode 100644 index 00000000..eced8721 Binary files /dev/null and b/src/public/data/pack/client/maps/l41_49 differ diff --git a/src/public/data/pack/client/maps/l41_50 b/src/public/data/pack/client/maps/l41_50 new file mode 100644 index 00000000..cf863dfe Binary files /dev/null and b/src/public/data/pack/client/maps/l41_50 differ diff --git a/src/public/data/pack/client/maps/l41_51 b/src/public/data/pack/client/maps/l41_51 new file mode 100644 index 00000000..727c753f Binary files /dev/null and b/src/public/data/pack/client/maps/l41_51 differ diff --git a/src/public/data/pack/client/maps/l41_52 b/src/public/data/pack/client/maps/l41_52 new file mode 100644 index 00000000..0ade1635 Binary files /dev/null and b/src/public/data/pack/client/maps/l41_52 differ diff --git a/src/public/data/pack/client/maps/l41_53 b/src/public/data/pack/client/maps/l41_53 new file mode 100644 index 00000000..6a4fd2a4 Binary files /dev/null and b/src/public/data/pack/client/maps/l41_53 differ diff --git a/src/public/data/pack/client/maps/l41_54 b/src/public/data/pack/client/maps/l41_54 new file mode 100644 index 00000000..7d1d1ea1 Binary files /dev/null and b/src/public/data/pack/client/maps/l41_54 differ diff --git a/src/public/data/pack/client/maps/l41_55 b/src/public/data/pack/client/maps/l41_55 new file mode 100644 index 00000000..5f81fdc9 Binary files /dev/null and b/src/public/data/pack/client/maps/l41_55 differ diff --git a/src/public/data/pack/client/maps/l41_56 b/src/public/data/pack/client/maps/l41_56 new file mode 100644 index 00000000..4887677d Binary files /dev/null and b/src/public/data/pack/client/maps/l41_56 differ diff --git a/src/public/data/pack/client/maps/l41_72 b/src/public/data/pack/client/maps/l41_72 new file mode 100644 index 00000000..cb4ec2b6 Binary files /dev/null and b/src/public/data/pack/client/maps/l41_72 differ diff --git a/src/public/data/pack/client/maps/l41_73 b/src/public/data/pack/client/maps/l41_73 new file mode 100644 index 00000000..c55225df Binary files /dev/null and b/src/public/data/pack/client/maps/l41_73 differ diff --git a/src/public/data/pack/client/maps/l41_74 b/src/public/data/pack/client/maps/l41_74 new file mode 100644 index 00000000..dc097e16 Binary files /dev/null and b/src/public/data/pack/client/maps/l41_74 differ diff --git a/src/public/data/pack/client/maps/l41_75 b/src/public/data/pack/client/maps/l41_75 new file mode 100644 index 00000000..b86e222a Binary files /dev/null and b/src/public/data/pack/client/maps/l41_75 differ diff --git a/src/public/data/pack/client/maps/l42_144 b/src/public/data/pack/client/maps/l42_144 new file mode 100644 index 00000000..c38f8942 Binary files /dev/null and b/src/public/data/pack/client/maps/l42_144 differ diff --git a/src/public/data/pack/client/maps/l42_145 b/src/public/data/pack/client/maps/l42_145 new file mode 100644 index 00000000..91a9d20c Binary files /dev/null and b/src/public/data/pack/client/maps/l42_145 differ diff --git a/src/public/data/pack/client/maps/l42_146 b/src/public/data/pack/client/maps/l42_146 new file mode 100644 index 00000000..9085a9a2 Binary files /dev/null and b/src/public/data/pack/client/maps/l42_146 differ diff --git a/src/public/data/pack/client/maps/l42_151 b/src/public/data/pack/client/maps/l42_151 new file mode 100644 index 00000000..f44f53e6 Binary files /dev/null and b/src/public/data/pack/client/maps/l42_151 differ diff --git a/src/public/data/pack/client/maps/l42_152 b/src/public/data/pack/client/maps/l42_152 new file mode 100644 index 00000000..d408b847 Binary files /dev/null and b/src/public/data/pack/client/maps/l42_152 differ diff --git a/src/public/data/pack/client/maps/l42_153 b/src/public/data/pack/client/maps/l42_153 new file mode 100644 index 00000000..230b1459 Binary files /dev/null and b/src/public/data/pack/client/maps/l42_153 differ diff --git a/src/public/data/pack/client/maps/l42_49 b/src/public/data/pack/client/maps/l42_49 new file mode 100644 index 00000000..6f867e93 Binary files /dev/null and b/src/public/data/pack/client/maps/l42_49 differ diff --git a/src/public/data/pack/client/maps/l42_50 b/src/public/data/pack/client/maps/l42_50 new file mode 100644 index 00000000..5277d77d Binary files /dev/null and b/src/public/data/pack/client/maps/l42_50 differ diff --git a/src/public/data/pack/client/maps/l42_51 b/src/public/data/pack/client/maps/l42_51 new file mode 100644 index 00000000..61f780be Binary files /dev/null and b/src/public/data/pack/client/maps/l42_51 differ diff --git a/src/public/data/pack/client/maps/l42_52 b/src/public/data/pack/client/maps/l42_52 new file mode 100644 index 00000000..afeed1f6 Binary files /dev/null and b/src/public/data/pack/client/maps/l42_52 differ diff --git a/src/public/data/pack/client/maps/l42_53 b/src/public/data/pack/client/maps/l42_53 new file mode 100644 index 00000000..6771dbac Binary files /dev/null and b/src/public/data/pack/client/maps/l42_53 differ diff --git a/src/public/data/pack/client/maps/l42_54 b/src/public/data/pack/client/maps/l42_54 new file mode 100644 index 00000000..cb2c533a Binary files /dev/null and b/src/public/data/pack/client/maps/l42_54 differ diff --git a/src/public/data/pack/client/maps/l42_55 b/src/public/data/pack/client/maps/l42_55 new file mode 100644 index 00000000..3c8ef168 Binary files /dev/null and b/src/public/data/pack/client/maps/l42_55 differ diff --git a/src/public/data/pack/client/maps/l42_56 b/src/public/data/pack/client/maps/l42_56 new file mode 100644 index 00000000..cafb5e23 Binary files /dev/null and b/src/public/data/pack/client/maps/l42_56 differ diff --git a/src/public/data/pack/client/maps/l42_72 b/src/public/data/pack/client/maps/l42_72 new file mode 100644 index 00000000..7dfa9261 Binary files /dev/null and b/src/public/data/pack/client/maps/l42_72 differ diff --git a/src/public/data/pack/client/maps/l42_73 b/src/public/data/pack/client/maps/l42_73 new file mode 100644 index 00000000..7a9f67d1 Binary files /dev/null and b/src/public/data/pack/client/maps/l42_73 differ diff --git a/src/public/data/pack/client/maps/l42_74 b/src/public/data/pack/client/maps/l42_74 new file mode 100644 index 00000000..1fa5fd55 Binary files /dev/null and b/src/public/data/pack/client/maps/l42_74 differ diff --git a/src/public/data/pack/client/maps/l42_75 b/src/public/data/pack/client/maps/l42_75 new file mode 100644 index 00000000..40155a87 Binary files /dev/null and b/src/public/data/pack/client/maps/l42_75 differ diff --git a/src/public/data/pack/client/maps/l43_144 b/src/public/data/pack/client/maps/l43_144 new file mode 100644 index 00000000..bf4c478d Binary files /dev/null and b/src/public/data/pack/client/maps/l43_144 differ diff --git a/src/public/data/pack/client/maps/l43_145 b/src/public/data/pack/client/maps/l43_145 new file mode 100644 index 00000000..6958c283 Binary files /dev/null and b/src/public/data/pack/client/maps/l43_145 differ diff --git a/src/public/data/pack/client/maps/l43_146 b/src/public/data/pack/client/maps/l43_146 new file mode 100644 index 00000000..f7d8f01c Binary files /dev/null and b/src/public/data/pack/client/maps/l43_146 differ diff --git a/src/public/data/pack/client/maps/l43_153 b/src/public/data/pack/client/maps/l43_153 new file mode 100644 index 00000000..fa66ecf5 Binary files /dev/null and b/src/public/data/pack/client/maps/l43_153 differ diff --git a/src/public/data/pack/client/maps/l43_154 b/src/public/data/pack/client/maps/l43_154 new file mode 100644 index 00000000..f6cc4026 Binary files /dev/null and b/src/public/data/pack/client/maps/l43_154 differ diff --git a/src/public/data/pack/client/maps/l43_45 b/src/public/data/pack/client/maps/l43_45 new file mode 100644 index 00000000..54ef8152 Binary files /dev/null and b/src/public/data/pack/client/maps/l43_45 differ diff --git a/src/public/data/pack/client/maps/l43_46 b/src/public/data/pack/client/maps/l43_46 new file mode 100644 index 00000000..4e41fb84 Binary files /dev/null and b/src/public/data/pack/client/maps/l43_46 differ diff --git a/src/public/data/pack/client/maps/l43_47 b/src/public/data/pack/client/maps/l43_47 new file mode 100644 index 00000000..cc3edc97 Binary files /dev/null and b/src/public/data/pack/client/maps/l43_47 differ diff --git a/src/public/data/pack/client/maps/l43_48 b/src/public/data/pack/client/maps/l43_48 new file mode 100644 index 00000000..c2c2592c Binary files /dev/null and b/src/public/data/pack/client/maps/l43_48 differ diff --git a/src/public/data/pack/client/maps/l43_49 b/src/public/data/pack/client/maps/l43_49 new file mode 100644 index 00000000..54dbc39d Binary files /dev/null and b/src/public/data/pack/client/maps/l43_49 differ diff --git a/src/public/data/pack/client/maps/l43_50 b/src/public/data/pack/client/maps/l43_50 new file mode 100644 index 00000000..b232117b Binary files /dev/null and b/src/public/data/pack/client/maps/l43_50 differ diff --git a/src/public/data/pack/client/maps/l43_51 b/src/public/data/pack/client/maps/l43_51 new file mode 100644 index 00000000..6014baf4 Binary files /dev/null and b/src/public/data/pack/client/maps/l43_51 differ diff --git a/src/public/data/pack/client/maps/l43_52 b/src/public/data/pack/client/maps/l43_52 new file mode 100644 index 00000000..b9f354a0 Binary files /dev/null and b/src/public/data/pack/client/maps/l43_52 differ diff --git a/src/public/data/pack/client/maps/l43_53 b/src/public/data/pack/client/maps/l43_53 new file mode 100644 index 00000000..18588a88 Binary files /dev/null and b/src/public/data/pack/client/maps/l43_53 differ diff --git a/src/public/data/pack/client/maps/l43_54 b/src/public/data/pack/client/maps/l43_54 new file mode 100644 index 00000000..2c3a169b Binary files /dev/null and b/src/public/data/pack/client/maps/l43_54 differ diff --git a/src/public/data/pack/client/maps/l43_55 b/src/public/data/pack/client/maps/l43_55 new file mode 100644 index 00000000..d46dc242 Binary files /dev/null and b/src/public/data/pack/client/maps/l43_55 differ diff --git a/src/public/data/pack/client/maps/l43_56 b/src/public/data/pack/client/maps/l43_56 new file mode 100644 index 00000000..8c892e22 Binary files /dev/null and b/src/public/data/pack/client/maps/l43_56 differ diff --git a/src/public/data/pack/client/maps/l43_72 b/src/public/data/pack/client/maps/l43_72 new file mode 100644 index 00000000..62a88fcf Binary files /dev/null and b/src/public/data/pack/client/maps/l43_72 differ diff --git a/src/public/data/pack/client/maps/l43_73 b/src/public/data/pack/client/maps/l43_73 new file mode 100644 index 00000000..0e3cf692 Binary files /dev/null and b/src/public/data/pack/client/maps/l43_73 differ diff --git a/src/public/data/pack/client/maps/l43_74 b/src/public/data/pack/client/maps/l43_74 new file mode 100644 index 00000000..db5d6629 Binary files /dev/null and b/src/public/data/pack/client/maps/l43_74 differ diff --git a/src/public/data/pack/client/maps/l43_75 b/src/public/data/pack/client/maps/l43_75 new file mode 100644 index 00000000..4f5a7a60 Binary files /dev/null and b/src/public/data/pack/client/maps/l43_75 differ diff --git a/src/public/data/pack/client/maps/l44_144 b/src/public/data/pack/client/maps/l44_144 new file mode 100644 index 00000000..e2b7f01f Binary files /dev/null and b/src/public/data/pack/client/maps/l44_144 differ diff --git a/src/public/data/pack/client/maps/l44_145 b/src/public/data/pack/client/maps/l44_145 new file mode 100644 index 00000000..ff5615bf Binary files /dev/null and b/src/public/data/pack/client/maps/l44_145 differ diff --git a/src/public/data/pack/client/maps/l44_146 b/src/public/data/pack/client/maps/l44_146 new file mode 100644 index 00000000..7e6c5a92 Binary files /dev/null and b/src/public/data/pack/client/maps/l44_146 differ diff --git a/src/public/data/pack/client/maps/l44_148 b/src/public/data/pack/client/maps/l44_148 new file mode 100644 index 00000000..1d92f6ce Binary files /dev/null and b/src/public/data/pack/client/maps/l44_148 differ diff --git a/src/public/data/pack/client/maps/l44_149 b/src/public/data/pack/client/maps/l44_149 new file mode 100644 index 00000000..fa06f9e2 Binary files /dev/null and b/src/public/data/pack/client/maps/l44_149 differ diff --git a/src/public/data/pack/client/maps/l44_150 b/src/public/data/pack/client/maps/l44_150 new file mode 100644 index 00000000..07482edc Binary files /dev/null and b/src/public/data/pack/client/maps/l44_150 differ diff --git a/src/public/data/pack/client/maps/l44_151 b/src/public/data/pack/client/maps/l44_151 new file mode 100644 index 00000000..fb41cabe Binary files /dev/null and b/src/public/data/pack/client/maps/l44_151 differ diff --git a/src/public/data/pack/client/maps/l44_152 b/src/public/data/pack/client/maps/l44_152 new file mode 100644 index 00000000..7e2636b2 Binary files /dev/null and b/src/public/data/pack/client/maps/l44_152 differ diff --git a/src/public/data/pack/client/maps/l44_153 b/src/public/data/pack/client/maps/l44_153 new file mode 100644 index 00000000..654699e2 Binary files /dev/null and b/src/public/data/pack/client/maps/l44_153 differ diff --git a/src/public/data/pack/client/maps/l44_154 b/src/public/data/pack/client/maps/l44_154 new file mode 100644 index 00000000..c948e9ff Binary files /dev/null and b/src/public/data/pack/client/maps/l44_154 differ diff --git a/src/public/data/pack/client/maps/l44_155 b/src/public/data/pack/client/maps/l44_155 new file mode 100644 index 00000000..c826a73a Binary files /dev/null and b/src/public/data/pack/client/maps/l44_155 differ diff --git a/src/public/data/pack/client/maps/l44_45 b/src/public/data/pack/client/maps/l44_45 new file mode 100644 index 00000000..d4b702b3 Binary files /dev/null and b/src/public/data/pack/client/maps/l44_45 differ diff --git a/src/public/data/pack/client/maps/l44_46 b/src/public/data/pack/client/maps/l44_46 new file mode 100644 index 00000000..e9628e98 Binary files /dev/null and b/src/public/data/pack/client/maps/l44_46 differ diff --git a/src/public/data/pack/client/maps/l44_47 b/src/public/data/pack/client/maps/l44_47 new file mode 100644 index 00000000..2ff3a2e0 Binary files /dev/null and b/src/public/data/pack/client/maps/l44_47 differ diff --git a/src/public/data/pack/client/maps/l44_48 b/src/public/data/pack/client/maps/l44_48 new file mode 100644 index 00000000..5ccf6b74 Binary files /dev/null and b/src/public/data/pack/client/maps/l44_48 differ diff --git a/src/public/data/pack/client/maps/l44_49 b/src/public/data/pack/client/maps/l44_49 new file mode 100644 index 00000000..8895fe22 Binary files /dev/null and b/src/public/data/pack/client/maps/l44_49 differ diff --git a/src/public/data/pack/client/maps/l44_50 b/src/public/data/pack/client/maps/l44_50 new file mode 100644 index 00000000..ad43f3c5 Binary files /dev/null and b/src/public/data/pack/client/maps/l44_50 differ diff --git a/src/public/data/pack/client/maps/l44_51 b/src/public/data/pack/client/maps/l44_51 new file mode 100644 index 00000000..69e15093 Binary files /dev/null and b/src/public/data/pack/client/maps/l44_51 differ diff --git a/src/public/data/pack/client/maps/l44_52 b/src/public/data/pack/client/maps/l44_52 new file mode 100644 index 00000000..a19e2cf1 Binary files /dev/null and b/src/public/data/pack/client/maps/l44_52 differ diff --git a/src/public/data/pack/client/maps/l44_53 b/src/public/data/pack/client/maps/l44_53 new file mode 100644 index 00000000..2d0cc146 Binary files /dev/null and b/src/public/data/pack/client/maps/l44_53 differ diff --git a/src/public/data/pack/client/maps/l44_54 b/src/public/data/pack/client/maps/l44_54 new file mode 100644 index 00000000..13ea654b Binary files /dev/null and b/src/public/data/pack/client/maps/l44_54 differ diff --git a/src/public/data/pack/client/maps/l44_55 b/src/public/data/pack/client/maps/l44_55 new file mode 100644 index 00000000..7fd4ca3f Binary files /dev/null and b/src/public/data/pack/client/maps/l44_55 differ diff --git a/src/public/data/pack/client/maps/l44_72 b/src/public/data/pack/client/maps/l44_72 new file mode 100644 index 00000000..35b64348 Binary files /dev/null and b/src/public/data/pack/client/maps/l44_72 differ diff --git a/src/public/data/pack/client/maps/l44_73 b/src/public/data/pack/client/maps/l44_73 new file mode 100644 index 00000000..1e10699d Binary files /dev/null and b/src/public/data/pack/client/maps/l44_73 differ diff --git a/src/public/data/pack/client/maps/l44_74 b/src/public/data/pack/client/maps/l44_74 new file mode 100644 index 00000000..d7de1f00 Binary files /dev/null and b/src/public/data/pack/client/maps/l44_74 differ diff --git a/src/public/data/pack/client/maps/l44_75 b/src/public/data/pack/client/maps/l44_75 new file mode 100644 index 00000000..267ba331 Binary files /dev/null and b/src/public/data/pack/client/maps/l44_75 differ diff --git a/src/public/data/pack/client/maps/l45_145 b/src/public/data/pack/client/maps/l45_145 new file mode 100644 index 00000000..a1e96d24 Binary files /dev/null and b/src/public/data/pack/client/maps/l45_145 differ diff --git a/src/public/data/pack/client/maps/l45_146 b/src/public/data/pack/client/maps/l45_146 new file mode 100644 index 00000000..513716fe Binary files /dev/null and b/src/public/data/pack/client/maps/l45_146 differ diff --git a/src/public/data/pack/client/maps/l45_148 b/src/public/data/pack/client/maps/l45_148 new file mode 100644 index 00000000..5a96a6f5 Binary files /dev/null and b/src/public/data/pack/client/maps/l45_148 differ diff --git a/src/public/data/pack/client/maps/l45_150 b/src/public/data/pack/client/maps/l45_150 new file mode 100644 index 00000000..f70d7ace Binary files /dev/null and b/src/public/data/pack/client/maps/l45_150 differ diff --git a/src/public/data/pack/client/maps/l45_151 b/src/public/data/pack/client/maps/l45_151 new file mode 100644 index 00000000..cab456b4 Binary files /dev/null and b/src/public/data/pack/client/maps/l45_151 differ diff --git a/src/public/data/pack/client/maps/l45_152 b/src/public/data/pack/client/maps/l45_152 new file mode 100644 index 00000000..514cdf6c Binary files /dev/null and b/src/public/data/pack/client/maps/l45_152 differ diff --git a/src/public/data/pack/client/maps/l45_153 b/src/public/data/pack/client/maps/l45_153 new file mode 100644 index 00000000..63525632 Binary files /dev/null and b/src/public/data/pack/client/maps/l45_153 differ diff --git a/src/public/data/pack/client/maps/l45_154 b/src/public/data/pack/client/maps/l45_154 new file mode 100644 index 00000000..202f94db Binary files /dev/null and b/src/public/data/pack/client/maps/l45_154 differ diff --git a/src/public/data/pack/client/maps/l45_155 b/src/public/data/pack/client/maps/l45_155 new file mode 100644 index 00000000..db49aa04 Binary files /dev/null and b/src/public/data/pack/client/maps/l45_155 differ diff --git a/src/public/data/pack/client/maps/l45_45 b/src/public/data/pack/client/maps/l45_45 new file mode 100644 index 00000000..6ae5d3fb Binary files /dev/null and b/src/public/data/pack/client/maps/l45_45 differ diff --git a/src/public/data/pack/client/maps/l45_46 b/src/public/data/pack/client/maps/l45_46 new file mode 100644 index 00000000..5fd5073a Binary files /dev/null and b/src/public/data/pack/client/maps/l45_46 differ diff --git a/src/public/data/pack/client/maps/l45_47 b/src/public/data/pack/client/maps/l45_47 new file mode 100644 index 00000000..204c0dc3 Binary files /dev/null and b/src/public/data/pack/client/maps/l45_47 differ diff --git a/src/public/data/pack/client/maps/l45_48 b/src/public/data/pack/client/maps/l45_48 new file mode 100644 index 00000000..541c559d Binary files /dev/null and b/src/public/data/pack/client/maps/l45_48 differ diff --git a/src/public/data/pack/client/maps/l45_49 b/src/public/data/pack/client/maps/l45_49 new file mode 100644 index 00000000..3d266ece Binary files /dev/null and b/src/public/data/pack/client/maps/l45_49 differ diff --git a/src/public/data/pack/client/maps/l45_50 b/src/public/data/pack/client/maps/l45_50 new file mode 100644 index 00000000..18d1d44c Binary files /dev/null and b/src/public/data/pack/client/maps/l45_50 differ diff --git a/src/public/data/pack/client/maps/l45_51 b/src/public/data/pack/client/maps/l45_51 new file mode 100644 index 00000000..f263f898 Binary files /dev/null and b/src/public/data/pack/client/maps/l45_51 differ diff --git a/src/public/data/pack/client/maps/l45_52 b/src/public/data/pack/client/maps/l45_52 new file mode 100644 index 00000000..7c4381b1 Binary files /dev/null and b/src/public/data/pack/client/maps/l45_52 differ diff --git a/src/public/data/pack/client/maps/l45_53 b/src/public/data/pack/client/maps/l45_53 new file mode 100644 index 00000000..3c693955 Binary files /dev/null and b/src/public/data/pack/client/maps/l45_53 differ diff --git a/src/public/data/pack/client/maps/l45_54 b/src/public/data/pack/client/maps/l45_54 new file mode 100644 index 00000000..6519f3a0 Binary files /dev/null and b/src/public/data/pack/client/maps/l45_54 differ diff --git a/src/public/data/pack/client/maps/l45_55 b/src/public/data/pack/client/maps/l45_55 new file mode 100644 index 00000000..b55b7200 Binary files /dev/null and b/src/public/data/pack/client/maps/l45_55 differ diff --git a/src/public/data/pack/client/maps/l45_56 b/src/public/data/pack/client/maps/l45_56 new file mode 100644 index 00000000..91e13862 Binary files /dev/null and b/src/public/data/pack/client/maps/l45_56 differ diff --git a/src/public/data/pack/client/maps/l45_57 b/src/public/data/pack/client/maps/l45_57 new file mode 100644 index 00000000..2a50a9f8 Binary files /dev/null and b/src/public/data/pack/client/maps/l45_57 differ diff --git a/src/public/data/pack/client/maps/l45_58 b/src/public/data/pack/client/maps/l45_58 new file mode 100644 index 00000000..7b031935 Binary files /dev/null and b/src/public/data/pack/client/maps/l45_58 differ diff --git a/src/public/data/pack/client/maps/l45_59 b/src/public/data/pack/client/maps/l45_59 new file mode 100644 index 00000000..28bda955 Binary files /dev/null and b/src/public/data/pack/client/maps/l45_59 differ diff --git a/src/public/data/pack/client/maps/l45_60 b/src/public/data/pack/client/maps/l45_60 new file mode 100644 index 00000000..f2389c4e Binary files /dev/null and b/src/public/data/pack/client/maps/l45_60 differ diff --git a/src/public/data/pack/client/maps/l45_61 b/src/public/data/pack/client/maps/l45_61 new file mode 100644 index 00000000..879ad62b Binary files /dev/null and b/src/public/data/pack/client/maps/l45_61 differ diff --git a/src/public/data/pack/client/maps/l45_62 b/src/public/data/pack/client/maps/l45_62 new file mode 100644 index 00000000..35f7f564 Binary files /dev/null and b/src/public/data/pack/client/maps/l45_62 differ diff --git a/src/public/data/pack/client/maps/l45_73 b/src/public/data/pack/client/maps/l45_73 new file mode 100644 index 00000000..4ddafb5d Binary files /dev/null and b/src/public/data/pack/client/maps/l45_73 differ diff --git a/src/public/data/pack/client/maps/l45_74 b/src/public/data/pack/client/maps/l45_74 new file mode 100644 index 00000000..18b57d63 Binary files /dev/null and b/src/public/data/pack/client/maps/l45_74 differ diff --git a/src/public/data/pack/client/maps/l45_75 b/src/public/data/pack/client/maps/l45_75 new file mode 100644 index 00000000..f6e9d691 Binary files /dev/null and b/src/public/data/pack/client/maps/l45_75 differ diff --git a/src/public/data/pack/client/maps/l45_76 b/src/public/data/pack/client/maps/l45_76 new file mode 100644 index 00000000..dac2584a Binary files /dev/null and b/src/public/data/pack/client/maps/l45_76 differ diff --git a/src/public/data/pack/client/maps/l46_149 b/src/public/data/pack/client/maps/l46_149 new file mode 100644 index 00000000..27789ca9 Binary files /dev/null and b/src/public/data/pack/client/maps/l46_149 differ diff --git a/src/public/data/pack/client/maps/l46_150 b/src/public/data/pack/client/maps/l46_150 new file mode 100644 index 00000000..879b0e82 Binary files /dev/null and b/src/public/data/pack/client/maps/l46_150 differ diff --git a/src/public/data/pack/client/maps/l46_152 b/src/public/data/pack/client/maps/l46_152 new file mode 100644 index 00000000..3288338a Binary files /dev/null and b/src/public/data/pack/client/maps/l46_152 differ diff --git a/src/public/data/pack/client/maps/l46_153 b/src/public/data/pack/client/maps/l46_153 new file mode 100644 index 00000000..3e6d8462 Binary files /dev/null and b/src/public/data/pack/client/maps/l46_153 differ diff --git a/src/public/data/pack/client/maps/l46_154 b/src/public/data/pack/client/maps/l46_154 new file mode 100644 index 00000000..93abb115 Binary files /dev/null and b/src/public/data/pack/client/maps/l46_154 differ diff --git a/src/public/data/pack/client/maps/l46_161 b/src/public/data/pack/client/maps/l46_161 new file mode 100644 index 00000000..4a2845ab Binary files /dev/null and b/src/public/data/pack/client/maps/l46_161 differ diff --git a/src/public/data/pack/client/maps/l46_45 b/src/public/data/pack/client/maps/l46_45 new file mode 100644 index 00000000..bda3c768 Binary files /dev/null and b/src/public/data/pack/client/maps/l46_45 differ diff --git a/src/public/data/pack/client/maps/l46_46 b/src/public/data/pack/client/maps/l46_46 new file mode 100644 index 00000000..676552a4 Binary files /dev/null and b/src/public/data/pack/client/maps/l46_46 differ diff --git a/src/public/data/pack/client/maps/l46_47 b/src/public/data/pack/client/maps/l46_47 new file mode 100644 index 00000000..2b78141c Binary files /dev/null and b/src/public/data/pack/client/maps/l46_47 differ diff --git a/src/public/data/pack/client/maps/l46_48 b/src/public/data/pack/client/maps/l46_48 new file mode 100644 index 00000000..61d199a7 Binary files /dev/null and b/src/public/data/pack/client/maps/l46_48 differ diff --git a/src/public/data/pack/client/maps/l46_49 b/src/public/data/pack/client/maps/l46_49 new file mode 100644 index 00000000..19050b28 Binary files /dev/null and b/src/public/data/pack/client/maps/l46_49 differ diff --git a/src/public/data/pack/client/maps/l46_50 b/src/public/data/pack/client/maps/l46_50 new file mode 100644 index 00000000..05adf5ae Binary files /dev/null and b/src/public/data/pack/client/maps/l46_50 differ diff --git a/src/public/data/pack/client/maps/l46_51 b/src/public/data/pack/client/maps/l46_51 new file mode 100644 index 00000000..36d515b5 Binary files /dev/null and b/src/public/data/pack/client/maps/l46_51 differ diff --git a/src/public/data/pack/client/maps/l46_52 b/src/public/data/pack/client/maps/l46_52 new file mode 100644 index 00000000..0e7f2e11 Binary files /dev/null and b/src/public/data/pack/client/maps/l46_52 differ diff --git a/src/public/data/pack/client/maps/l46_53 b/src/public/data/pack/client/maps/l46_53 new file mode 100644 index 00000000..2b9d84ec Binary files /dev/null and b/src/public/data/pack/client/maps/l46_53 differ diff --git a/src/public/data/pack/client/maps/l46_54 b/src/public/data/pack/client/maps/l46_54 new file mode 100644 index 00000000..b0824892 Binary files /dev/null and b/src/public/data/pack/client/maps/l46_54 differ diff --git a/src/public/data/pack/client/maps/l46_55 b/src/public/data/pack/client/maps/l46_55 new file mode 100644 index 00000000..8f254250 Binary files /dev/null and b/src/public/data/pack/client/maps/l46_55 differ diff --git a/src/public/data/pack/client/maps/l46_56 b/src/public/data/pack/client/maps/l46_56 new file mode 100644 index 00000000..176457e5 Binary files /dev/null and b/src/public/data/pack/client/maps/l46_56 differ diff --git a/src/public/data/pack/client/maps/l46_57 b/src/public/data/pack/client/maps/l46_57 new file mode 100644 index 00000000..3c711dcd Binary files /dev/null and b/src/public/data/pack/client/maps/l46_57 differ diff --git a/src/public/data/pack/client/maps/l46_58 b/src/public/data/pack/client/maps/l46_58 new file mode 100644 index 00000000..c42ff9f0 Binary files /dev/null and b/src/public/data/pack/client/maps/l46_58 differ diff --git a/src/public/data/pack/client/maps/l46_59 b/src/public/data/pack/client/maps/l46_59 new file mode 100644 index 00000000..f86b5736 Binary files /dev/null and b/src/public/data/pack/client/maps/l46_59 differ diff --git a/src/public/data/pack/client/maps/l46_60 b/src/public/data/pack/client/maps/l46_60 new file mode 100644 index 00000000..b4f3aa5d Binary files /dev/null and b/src/public/data/pack/client/maps/l46_60 differ diff --git a/src/public/data/pack/client/maps/l46_61 b/src/public/data/pack/client/maps/l46_61 new file mode 100644 index 00000000..dc7f636c Binary files /dev/null and b/src/public/data/pack/client/maps/l46_61 differ diff --git a/src/public/data/pack/client/maps/l46_62 b/src/public/data/pack/client/maps/l46_62 new file mode 100644 index 00000000..88ab2796 Binary files /dev/null and b/src/public/data/pack/client/maps/l46_62 differ diff --git a/src/public/data/pack/client/maps/l46_75 b/src/public/data/pack/client/maps/l46_75 new file mode 100644 index 00000000..f0aff3ec Binary files /dev/null and b/src/public/data/pack/client/maps/l46_75 differ diff --git a/src/public/data/pack/client/maps/l47_148 b/src/public/data/pack/client/maps/l47_148 new file mode 100644 index 00000000..41064782 Binary files /dev/null and b/src/public/data/pack/client/maps/l47_148 differ diff --git a/src/public/data/pack/client/maps/l47_149 b/src/public/data/pack/client/maps/l47_149 new file mode 100644 index 00000000..64370e71 Binary files /dev/null and b/src/public/data/pack/client/maps/l47_149 differ diff --git a/src/public/data/pack/client/maps/l47_150 b/src/public/data/pack/client/maps/l47_150 new file mode 100644 index 00000000..150f0ee5 Binary files /dev/null and b/src/public/data/pack/client/maps/l47_150 differ diff --git a/src/public/data/pack/client/maps/l47_152 b/src/public/data/pack/client/maps/l47_152 new file mode 100644 index 00000000..136cec39 Binary files /dev/null and b/src/public/data/pack/client/maps/l47_152 differ diff --git a/src/public/data/pack/client/maps/l47_153 b/src/public/data/pack/client/maps/l47_153 new file mode 100644 index 00000000..72b30e58 Binary files /dev/null and b/src/public/data/pack/client/maps/l47_153 differ diff --git a/src/public/data/pack/client/maps/l47_160 b/src/public/data/pack/client/maps/l47_160 new file mode 100644 index 00000000..be3b0350 Binary files /dev/null and b/src/public/data/pack/client/maps/l47_160 differ diff --git a/src/public/data/pack/client/maps/l47_161 b/src/public/data/pack/client/maps/l47_161 new file mode 100644 index 00000000..10ac023e Binary files /dev/null and b/src/public/data/pack/client/maps/l47_161 differ diff --git a/src/public/data/pack/client/maps/l47_47 b/src/public/data/pack/client/maps/l47_47 new file mode 100644 index 00000000..89459472 Binary files /dev/null and b/src/public/data/pack/client/maps/l47_47 differ diff --git a/src/public/data/pack/client/maps/l47_48 b/src/public/data/pack/client/maps/l47_48 new file mode 100644 index 00000000..458d80cb Binary files /dev/null and b/src/public/data/pack/client/maps/l47_48 differ diff --git a/src/public/data/pack/client/maps/l47_49 b/src/public/data/pack/client/maps/l47_49 new file mode 100644 index 00000000..4718e6d8 Binary files /dev/null and b/src/public/data/pack/client/maps/l47_49 differ diff --git a/src/public/data/pack/client/maps/l47_50 b/src/public/data/pack/client/maps/l47_50 new file mode 100644 index 00000000..5dee1d87 Binary files /dev/null and b/src/public/data/pack/client/maps/l47_50 differ diff --git a/src/public/data/pack/client/maps/l47_51 b/src/public/data/pack/client/maps/l47_51 new file mode 100644 index 00000000..1e611e4e Binary files /dev/null and b/src/public/data/pack/client/maps/l47_51 differ diff --git a/src/public/data/pack/client/maps/l47_52 b/src/public/data/pack/client/maps/l47_52 new file mode 100644 index 00000000..fdfe83af Binary files /dev/null and b/src/public/data/pack/client/maps/l47_52 differ diff --git a/src/public/data/pack/client/maps/l47_53 b/src/public/data/pack/client/maps/l47_53 new file mode 100644 index 00000000..ad2d050b Binary files /dev/null and b/src/public/data/pack/client/maps/l47_53 differ diff --git a/src/public/data/pack/client/maps/l47_54 b/src/public/data/pack/client/maps/l47_54 new file mode 100644 index 00000000..004e2588 Binary files /dev/null and b/src/public/data/pack/client/maps/l47_54 differ diff --git a/src/public/data/pack/client/maps/l47_55 b/src/public/data/pack/client/maps/l47_55 new file mode 100644 index 00000000..b42cc82e Binary files /dev/null and b/src/public/data/pack/client/maps/l47_55 differ diff --git a/src/public/data/pack/client/maps/l47_56 b/src/public/data/pack/client/maps/l47_56 new file mode 100644 index 00000000..86a4154e Binary files /dev/null and b/src/public/data/pack/client/maps/l47_56 differ diff --git a/src/public/data/pack/client/maps/l47_57 b/src/public/data/pack/client/maps/l47_57 new file mode 100644 index 00000000..428185f5 Binary files /dev/null and b/src/public/data/pack/client/maps/l47_57 differ diff --git a/src/public/data/pack/client/maps/l47_58 b/src/public/data/pack/client/maps/l47_58 new file mode 100644 index 00000000..e7bde215 Binary files /dev/null and b/src/public/data/pack/client/maps/l47_58 differ diff --git a/src/public/data/pack/client/maps/l47_59 b/src/public/data/pack/client/maps/l47_59 new file mode 100644 index 00000000..ecf1e96b Binary files /dev/null and b/src/public/data/pack/client/maps/l47_59 differ diff --git a/src/public/data/pack/client/maps/l47_60 b/src/public/data/pack/client/maps/l47_60 new file mode 100644 index 00000000..6b75e541 Binary files /dev/null and b/src/public/data/pack/client/maps/l47_60 differ diff --git a/src/public/data/pack/client/maps/l47_61 b/src/public/data/pack/client/maps/l47_61 new file mode 100644 index 00000000..c4042797 Binary files /dev/null and b/src/public/data/pack/client/maps/l47_61 differ diff --git a/src/public/data/pack/client/maps/l47_62 b/src/public/data/pack/client/maps/l47_62 new file mode 100644 index 00000000..997b267a Binary files /dev/null and b/src/public/data/pack/client/maps/l47_62 differ diff --git a/src/public/data/pack/client/maps/l47_75 b/src/public/data/pack/client/maps/l47_75 new file mode 100644 index 00000000..8a5a7dc8 Binary files /dev/null and b/src/public/data/pack/client/maps/l47_75 differ diff --git a/src/public/data/pack/client/maps/l48_148 b/src/public/data/pack/client/maps/l48_148 new file mode 100644 index 00000000..0d94ce3c Binary files /dev/null and b/src/public/data/pack/client/maps/l48_148 differ diff --git a/src/public/data/pack/client/maps/l48_149 b/src/public/data/pack/client/maps/l48_149 new file mode 100644 index 00000000..00eb4285 Binary files /dev/null and b/src/public/data/pack/client/maps/l48_149 differ diff --git a/src/public/data/pack/client/maps/l48_152 b/src/public/data/pack/client/maps/l48_152 new file mode 100644 index 00000000..fb372c07 Binary files /dev/null and b/src/public/data/pack/client/maps/l48_152 differ diff --git a/src/public/data/pack/client/maps/l48_153 b/src/public/data/pack/client/maps/l48_153 new file mode 100644 index 00000000..a9270ad0 Binary files /dev/null and b/src/public/data/pack/client/maps/l48_153 differ diff --git a/src/public/data/pack/client/maps/l48_154 b/src/public/data/pack/client/maps/l48_154 new file mode 100644 index 00000000..3facf4a0 Binary files /dev/null and b/src/public/data/pack/client/maps/l48_154 differ diff --git a/src/public/data/pack/client/maps/l48_155 b/src/public/data/pack/client/maps/l48_155 new file mode 100644 index 00000000..18610318 Binary files /dev/null and b/src/public/data/pack/client/maps/l48_155 differ diff --git a/src/public/data/pack/client/maps/l48_156 b/src/public/data/pack/client/maps/l48_156 new file mode 100644 index 00000000..c0602dec Binary files /dev/null and b/src/public/data/pack/client/maps/l48_156 differ diff --git a/src/public/data/pack/client/maps/l48_47 b/src/public/data/pack/client/maps/l48_47 new file mode 100644 index 00000000..4fe14a6f Binary files /dev/null and b/src/public/data/pack/client/maps/l48_47 differ diff --git a/src/public/data/pack/client/maps/l48_48 b/src/public/data/pack/client/maps/l48_48 new file mode 100644 index 00000000..9b6601e5 Binary files /dev/null and b/src/public/data/pack/client/maps/l48_48 differ diff --git a/src/public/data/pack/client/maps/l48_49 b/src/public/data/pack/client/maps/l48_49 new file mode 100644 index 00000000..018a9ef8 Binary files /dev/null and b/src/public/data/pack/client/maps/l48_49 differ diff --git a/src/public/data/pack/client/maps/l48_50 b/src/public/data/pack/client/maps/l48_50 new file mode 100644 index 00000000..f964b314 Binary files /dev/null and b/src/public/data/pack/client/maps/l48_50 differ diff --git a/src/public/data/pack/client/maps/l48_51 b/src/public/data/pack/client/maps/l48_51 new file mode 100644 index 00000000..fc961f73 Binary files /dev/null and b/src/public/data/pack/client/maps/l48_51 differ diff --git a/src/public/data/pack/client/maps/l48_52 b/src/public/data/pack/client/maps/l48_52 new file mode 100644 index 00000000..7c65cea3 Binary files /dev/null and b/src/public/data/pack/client/maps/l48_52 differ diff --git a/src/public/data/pack/client/maps/l48_53 b/src/public/data/pack/client/maps/l48_53 new file mode 100644 index 00000000..9f12f2ae Binary files /dev/null and b/src/public/data/pack/client/maps/l48_53 differ diff --git a/src/public/data/pack/client/maps/l48_54 b/src/public/data/pack/client/maps/l48_54 new file mode 100644 index 00000000..46d227c1 Binary files /dev/null and b/src/public/data/pack/client/maps/l48_54 differ diff --git a/src/public/data/pack/client/maps/l48_55 b/src/public/data/pack/client/maps/l48_55 new file mode 100644 index 00000000..772c5c0a Binary files /dev/null and b/src/public/data/pack/client/maps/l48_55 differ diff --git a/src/public/data/pack/client/maps/l48_56 b/src/public/data/pack/client/maps/l48_56 new file mode 100644 index 00000000..62b87904 Binary files /dev/null and b/src/public/data/pack/client/maps/l48_56 differ diff --git a/src/public/data/pack/client/maps/l48_57 b/src/public/data/pack/client/maps/l48_57 new file mode 100644 index 00000000..146417e2 Binary files /dev/null and b/src/public/data/pack/client/maps/l48_57 differ diff --git a/src/public/data/pack/client/maps/l48_58 b/src/public/data/pack/client/maps/l48_58 new file mode 100644 index 00000000..d1c10fab Binary files /dev/null and b/src/public/data/pack/client/maps/l48_58 differ diff --git a/src/public/data/pack/client/maps/l48_59 b/src/public/data/pack/client/maps/l48_59 new file mode 100644 index 00000000..2dcb1a8a Binary files /dev/null and b/src/public/data/pack/client/maps/l48_59 differ diff --git a/src/public/data/pack/client/maps/l48_60 b/src/public/data/pack/client/maps/l48_60 new file mode 100644 index 00000000..9344fbe5 Binary files /dev/null and b/src/public/data/pack/client/maps/l48_60 differ diff --git a/src/public/data/pack/client/maps/l48_61 b/src/public/data/pack/client/maps/l48_61 new file mode 100644 index 00000000..f1240e95 Binary files /dev/null and b/src/public/data/pack/client/maps/l48_61 differ diff --git a/src/public/data/pack/client/maps/l48_62 b/src/public/data/pack/client/maps/l48_62 new file mode 100644 index 00000000..360c1bda Binary files /dev/null and b/src/public/data/pack/client/maps/l48_62 differ diff --git a/src/public/data/pack/client/maps/l49_148 b/src/public/data/pack/client/maps/l49_148 new file mode 100644 index 00000000..3a0182aa Binary files /dev/null and b/src/public/data/pack/client/maps/l49_148 differ diff --git a/src/public/data/pack/client/maps/l49_149 b/src/public/data/pack/client/maps/l49_149 new file mode 100644 index 00000000..e11fbd03 Binary files /dev/null and b/src/public/data/pack/client/maps/l49_149 differ diff --git a/src/public/data/pack/client/maps/l49_153 b/src/public/data/pack/client/maps/l49_153 new file mode 100644 index 00000000..504981c1 Binary files /dev/null and b/src/public/data/pack/client/maps/l49_153 differ diff --git a/src/public/data/pack/client/maps/l49_154 b/src/public/data/pack/client/maps/l49_154 new file mode 100644 index 00000000..f0a722d0 Binary files /dev/null and b/src/public/data/pack/client/maps/l49_154 differ diff --git a/src/public/data/pack/client/maps/l49_155 b/src/public/data/pack/client/maps/l49_155 new file mode 100644 index 00000000..0213fa67 Binary files /dev/null and b/src/public/data/pack/client/maps/l49_155 differ diff --git a/src/public/data/pack/client/maps/l49_156 b/src/public/data/pack/client/maps/l49_156 new file mode 100644 index 00000000..cac91b83 Binary files /dev/null and b/src/public/data/pack/client/maps/l49_156 differ diff --git a/src/public/data/pack/client/maps/l49_46 b/src/public/data/pack/client/maps/l49_46 new file mode 100644 index 00000000..179f34cc Binary files /dev/null and b/src/public/data/pack/client/maps/l49_46 differ diff --git a/src/public/data/pack/client/maps/l49_47 b/src/public/data/pack/client/maps/l49_47 new file mode 100644 index 00000000..9e560006 Binary files /dev/null and b/src/public/data/pack/client/maps/l49_47 differ diff --git a/src/public/data/pack/client/maps/l49_48 b/src/public/data/pack/client/maps/l49_48 new file mode 100644 index 00000000..ad581789 Binary files /dev/null and b/src/public/data/pack/client/maps/l49_48 differ diff --git a/src/public/data/pack/client/maps/l49_49 b/src/public/data/pack/client/maps/l49_49 new file mode 100644 index 00000000..7c4d0963 Binary files /dev/null and b/src/public/data/pack/client/maps/l49_49 differ diff --git a/src/public/data/pack/client/maps/l49_50 b/src/public/data/pack/client/maps/l49_50 new file mode 100644 index 00000000..f7796c88 Binary files /dev/null and b/src/public/data/pack/client/maps/l49_50 differ diff --git a/src/public/data/pack/client/maps/l49_51 b/src/public/data/pack/client/maps/l49_51 new file mode 100644 index 00000000..b60cd340 Binary files /dev/null and b/src/public/data/pack/client/maps/l49_51 differ diff --git a/src/public/data/pack/client/maps/l49_52 b/src/public/data/pack/client/maps/l49_52 new file mode 100644 index 00000000..8665089a Binary files /dev/null and b/src/public/data/pack/client/maps/l49_52 differ diff --git a/src/public/data/pack/client/maps/l49_53 b/src/public/data/pack/client/maps/l49_53 new file mode 100644 index 00000000..ed466519 Binary files /dev/null and b/src/public/data/pack/client/maps/l49_53 differ diff --git a/src/public/data/pack/client/maps/l49_54 b/src/public/data/pack/client/maps/l49_54 new file mode 100644 index 00000000..33af0856 Binary files /dev/null and b/src/public/data/pack/client/maps/l49_54 differ diff --git a/src/public/data/pack/client/maps/l49_55 b/src/public/data/pack/client/maps/l49_55 new file mode 100644 index 00000000..75a67fab Binary files /dev/null and b/src/public/data/pack/client/maps/l49_55 differ diff --git a/src/public/data/pack/client/maps/l49_56 b/src/public/data/pack/client/maps/l49_56 new file mode 100644 index 00000000..1dfeeb1a Binary files /dev/null and b/src/public/data/pack/client/maps/l49_56 differ diff --git a/src/public/data/pack/client/maps/l49_57 b/src/public/data/pack/client/maps/l49_57 new file mode 100644 index 00000000..c26780fc Binary files /dev/null and b/src/public/data/pack/client/maps/l49_57 differ diff --git a/src/public/data/pack/client/maps/l49_58 b/src/public/data/pack/client/maps/l49_58 new file mode 100644 index 00000000..e8d74c62 Binary files /dev/null and b/src/public/data/pack/client/maps/l49_58 differ diff --git a/src/public/data/pack/client/maps/l49_59 b/src/public/data/pack/client/maps/l49_59 new file mode 100644 index 00000000..58b320c6 Binary files /dev/null and b/src/public/data/pack/client/maps/l49_59 differ diff --git a/src/public/data/pack/client/maps/l49_60 b/src/public/data/pack/client/maps/l49_60 new file mode 100644 index 00000000..03e1a2d1 Binary files /dev/null and b/src/public/data/pack/client/maps/l49_60 differ diff --git a/src/public/data/pack/client/maps/l49_61 b/src/public/data/pack/client/maps/l49_61 new file mode 100644 index 00000000..63db184d Binary files /dev/null and b/src/public/data/pack/client/maps/l49_61 differ diff --git a/src/public/data/pack/client/maps/l49_62 b/src/public/data/pack/client/maps/l49_62 new file mode 100644 index 00000000..d78007ea Binary files /dev/null and b/src/public/data/pack/client/maps/l49_62 differ diff --git a/src/public/data/pack/client/maps/l50_149 b/src/public/data/pack/client/maps/l50_149 new file mode 100644 index 00000000..da6bbfb7 Binary files /dev/null and b/src/public/data/pack/client/maps/l50_149 differ diff --git a/src/public/data/pack/client/maps/l50_150 b/src/public/data/pack/client/maps/l50_150 new file mode 100644 index 00000000..3d7ec246 Binary files /dev/null and b/src/public/data/pack/client/maps/l50_150 differ diff --git a/src/public/data/pack/client/maps/l50_152 b/src/public/data/pack/client/maps/l50_152 new file mode 100644 index 00000000..c354effd Binary files /dev/null and b/src/public/data/pack/client/maps/l50_152 differ diff --git a/src/public/data/pack/client/maps/l50_153 b/src/public/data/pack/client/maps/l50_153 new file mode 100644 index 00000000..f994dde0 Binary files /dev/null and b/src/public/data/pack/client/maps/l50_153 differ diff --git a/src/public/data/pack/client/maps/l50_154 b/src/public/data/pack/client/maps/l50_154 new file mode 100644 index 00000000..4e621211 Binary files /dev/null and b/src/public/data/pack/client/maps/l50_154 differ diff --git a/src/public/data/pack/client/maps/l50_46 b/src/public/data/pack/client/maps/l50_46 new file mode 100644 index 00000000..07259736 Binary files /dev/null and b/src/public/data/pack/client/maps/l50_46 differ diff --git a/src/public/data/pack/client/maps/l50_47 b/src/public/data/pack/client/maps/l50_47 new file mode 100644 index 00000000..22b4755f Binary files /dev/null and b/src/public/data/pack/client/maps/l50_47 differ diff --git a/src/public/data/pack/client/maps/l50_48 b/src/public/data/pack/client/maps/l50_48 new file mode 100644 index 00000000..d1981215 Binary files /dev/null and b/src/public/data/pack/client/maps/l50_48 differ diff --git a/src/public/data/pack/client/maps/l50_49 b/src/public/data/pack/client/maps/l50_49 new file mode 100644 index 00000000..d5dcbc2d Binary files /dev/null and b/src/public/data/pack/client/maps/l50_49 differ diff --git a/src/public/data/pack/client/maps/l50_50 b/src/public/data/pack/client/maps/l50_50 new file mode 100644 index 00000000..660df1b8 Binary files /dev/null and b/src/public/data/pack/client/maps/l50_50 differ diff --git a/src/public/data/pack/client/maps/l50_51 b/src/public/data/pack/client/maps/l50_51 new file mode 100644 index 00000000..1fefe42e Binary files /dev/null and b/src/public/data/pack/client/maps/l50_51 differ diff --git a/src/public/data/pack/client/maps/l50_52 b/src/public/data/pack/client/maps/l50_52 new file mode 100644 index 00000000..2ba8eb86 Binary files /dev/null and b/src/public/data/pack/client/maps/l50_52 differ diff --git a/src/public/data/pack/client/maps/l50_53 b/src/public/data/pack/client/maps/l50_53 new file mode 100644 index 00000000..cc866f5c Binary files /dev/null and b/src/public/data/pack/client/maps/l50_53 differ diff --git a/src/public/data/pack/client/maps/l50_54 b/src/public/data/pack/client/maps/l50_54 new file mode 100644 index 00000000..8b66ab18 Binary files /dev/null and b/src/public/data/pack/client/maps/l50_54 differ diff --git a/src/public/data/pack/client/maps/l50_55 b/src/public/data/pack/client/maps/l50_55 new file mode 100644 index 00000000..d661171c Binary files /dev/null and b/src/public/data/pack/client/maps/l50_55 differ diff --git a/src/public/data/pack/client/maps/l50_56 b/src/public/data/pack/client/maps/l50_56 new file mode 100644 index 00000000..e56db978 Binary files /dev/null and b/src/public/data/pack/client/maps/l50_56 differ diff --git a/src/public/data/pack/client/maps/l50_57 b/src/public/data/pack/client/maps/l50_57 new file mode 100644 index 00000000..e1d750fd Binary files /dev/null and b/src/public/data/pack/client/maps/l50_57 differ diff --git a/src/public/data/pack/client/maps/l50_58 b/src/public/data/pack/client/maps/l50_58 new file mode 100644 index 00000000..edb51cdf Binary files /dev/null and b/src/public/data/pack/client/maps/l50_58 differ diff --git a/src/public/data/pack/client/maps/l50_59 b/src/public/data/pack/client/maps/l50_59 new file mode 100644 index 00000000..30ad6b71 Binary files /dev/null and b/src/public/data/pack/client/maps/l50_59 differ diff --git a/src/public/data/pack/client/maps/l50_60 b/src/public/data/pack/client/maps/l50_60 new file mode 100644 index 00000000..fc217ef2 Binary files /dev/null and b/src/public/data/pack/client/maps/l50_60 differ diff --git a/src/public/data/pack/client/maps/l50_61 b/src/public/data/pack/client/maps/l50_61 new file mode 100644 index 00000000..ec55dab2 Binary files /dev/null and b/src/public/data/pack/client/maps/l50_61 differ diff --git a/src/public/data/pack/client/maps/l50_62 b/src/public/data/pack/client/maps/l50_62 new file mode 100644 index 00000000..65fa682d Binary files /dev/null and b/src/public/data/pack/client/maps/l50_62 differ diff --git a/src/public/data/pack/client/maps/l51_147 b/src/public/data/pack/client/maps/l51_147 new file mode 100644 index 00000000..0c53e7ae Binary files /dev/null and b/src/public/data/pack/client/maps/l51_147 differ diff --git a/src/public/data/pack/client/maps/l51_154 b/src/public/data/pack/client/maps/l51_154 new file mode 100644 index 00000000..ab301226 Binary files /dev/null and b/src/public/data/pack/client/maps/l51_154 differ diff --git a/src/public/data/pack/client/maps/l51_46 b/src/public/data/pack/client/maps/l51_46 new file mode 100644 index 00000000..425a8991 Binary files /dev/null and b/src/public/data/pack/client/maps/l51_46 differ diff --git a/src/public/data/pack/client/maps/l51_47 b/src/public/data/pack/client/maps/l51_47 new file mode 100644 index 00000000..7bb73b71 Binary files /dev/null and b/src/public/data/pack/client/maps/l51_47 differ diff --git a/src/public/data/pack/client/maps/l51_48 b/src/public/data/pack/client/maps/l51_48 new file mode 100644 index 00000000..50fbff8a Binary files /dev/null and b/src/public/data/pack/client/maps/l51_48 differ diff --git a/src/public/data/pack/client/maps/l51_49 b/src/public/data/pack/client/maps/l51_49 new file mode 100644 index 00000000..d68621fe Binary files /dev/null and b/src/public/data/pack/client/maps/l51_49 differ diff --git a/src/public/data/pack/client/maps/l51_50 b/src/public/data/pack/client/maps/l51_50 new file mode 100644 index 00000000..1f8084a0 Binary files /dev/null and b/src/public/data/pack/client/maps/l51_50 differ diff --git a/src/public/data/pack/client/maps/l51_51 b/src/public/data/pack/client/maps/l51_51 new file mode 100644 index 00000000..4e936d69 Binary files /dev/null and b/src/public/data/pack/client/maps/l51_51 differ diff --git a/src/public/data/pack/client/maps/l51_52 b/src/public/data/pack/client/maps/l51_52 new file mode 100644 index 00000000..9d3ab09b Binary files /dev/null and b/src/public/data/pack/client/maps/l51_52 differ diff --git a/src/public/data/pack/client/maps/l51_53 b/src/public/data/pack/client/maps/l51_53 new file mode 100644 index 00000000..5454810d Binary files /dev/null and b/src/public/data/pack/client/maps/l51_53 differ diff --git a/src/public/data/pack/client/maps/l51_54 b/src/public/data/pack/client/maps/l51_54 new file mode 100644 index 00000000..d24c7540 Binary files /dev/null and b/src/public/data/pack/client/maps/l51_54 differ diff --git a/src/public/data/pack/client/maps/l51_55 b/src/public/data/pack/client/maps/l51_55 new file mode 100644 index 00000000..9c58bec4 Binary files /dev/null and b/src/public/data/pack/client/maps/l51_55 differ diff --git a/src/public/data/pack/client/maps/l51_56 b/src/public/data/pack/client/maps/l51_56 new file mode 100644 index 00000000..b43ff9da Binary files /dev/null and b/src/public/data/pack/client/maps/l51_56 differ diff --git a/src/public/data/pack/client/maps/l51_57 b/src/public/data/pack/client/maps/l51_57 new file mode 100644 index 00000000..ceef79e9 Binary files /dev/null and b/src/public/data/pack/client/maps/l51_57 differ diff --git a/src/public/data/pack/client/maps/l51_58 b/src/public/data/pack/client/maps/l51_58 new file mode 100644 index 00000000..4a50ef0b Binary files /dev/null and b/src/public/data/pack/client/maps/l51_58 differ diff --git a/src/public/data/pack/client/maps/l51_59 b/src/public/data/pack/client/maps/l51_59 new file mode 100644 index 00000000..9082e896 Binary files /dev/null and b/src/public/data/pack/client/maps/l51_59 differ diff --git a/src/public/data/pack/client/maps/l51_60 b/src/public/data/pack/client/maps/l51_60 new file mode 100644 index 00000000..152d3028 Binary files /dev/null and b/src/public/data/pack/client/maps/l51_60 differ diff --git a/src/public/data/pack/client/maps/l51_61 b/src/public/data/pack/client/maps/l51_61 new file mode 100644 index 00000000..16590a94 Binary files /dev/null and b/src/public/data/pack/client/maps/l51_61 differ diff --git a/src/public/data/pack/client/maps/l51_62 b/src/public/data/pack/client/maps/l51_62 new file mode 100644 index 00000000..326b1980 Binary files /dev/null and b/src/public/data/pack/client/maps/l51_62 differ diff --git a/src/public/data/pack/client/maps/l52_152 b/src/public/data/pack/client/maps/l52_152 new file mode 100644 index 00000000..220d8c90 Binary files /dev/null and b/src/public/data/pack/client/maps/l52_152 differ diff --git a/src/public/data/pack/client/maps/l52_153 b/src/public/data/pack/client/maps/l52_153 new file mode 100644 index 00000000..992b9d47 Binary files /dev/null and b/src/public/data/pack/client/maps/l52_153 differ diff --git a/src/public/data/pack/client/maps/l52_154 b/src/public/data/pack/client/maps/l52_154 new file mode 100644 index 00000000..d93336ae Binary files /dev/null and b/src/public/data/pack/client/maps/l52_154 differ diff --git a/src/public/data/pack/client/maps/l52_46 b/src/public/data/pack/client/maps/l52_46 new file mode 100644 index 00000000..326b1980 Binary files /dev/null and b/src/public/data/pack/client/maps/l52_46 differ diff --git a/src/public/data/pack/client/maps/l52_47 b/src/public/data/pack/client/maps/l52_47 new file mode 100644 index 00000000..731b8272 Binary files /dev/null and b/src/public/data/pack/client/maps/l52_47 differ diff --git a/src/public/data/pack/client/maps/l52_48 b/src/public/data/pack/client/maps/l52_48 new file mode 100644 index 00000000..66d0100f Binary files /dev/null and b/src/public/data/pack/client/maps/l52_48 differ diff --git a/src/public/data/pack/client/maps/l52_49 b/src/public/data/pack/client/maps/l52_49 new file mode 100644 index 00000000..1cc1b552 Binary files /dev/null and b/src/public/data/pack/client/maps/l52_49 differ diff --git a/src/public/data/pack/client/maps/l52_50 b/src/public/data/pack/client/maps/l52_50 new file mode 100644 index 00000000..2f664d8f Binary files /dev/null and b/src/public/data/pack/client/maps/l52_50 differ diff --git a/src/public/data/pack/client/maps/l52_51 b/src/public/data/pack/client/maps/l52_51 new file mode 100644 index 00000000..98eddca6 Binary files /dev/null and b/src/public/data/pack/client/maps/l52_51 differ diff --git a/src/public/data/pack/client/maps/l52_52 b/src/public/data/pack/client/maps/l52_52 new file mode 100644 index 00000000..de5b4347 Binary files /dev/null and b/src/public/data/pack/client/maps/l52_52 differ diff --git a/src/public/data/pack/client/maps/l52_53 b/src/public/data/pack/client/maps/l52_53 new file mode 100644 index 00000000..51e108e0 Binary files /dev/null and b/src/public/data/pack/client/maps/l52_53 differ diff --git a/src/public/data/pack/client/maps/l52_54 b/src/public/data/pack/client/maps/l52_54 new file mode 100644 index 00000000..c1b032de Binary files /dev/null and b/src/public/data/pack/client/maps/l52_54 differ diff --git a/src/public/data/pack/client/maps/l52_55 b/src/public/data/pack/client/maps/l52_55 new file mode 100644 index 00000000..9a024935 Binary files /dev/null and b/src/public/data/pack/client/maps/l52_55 differ diff --git a/src/public/data/pack/client/maps/l52_56 b/src/public/data/pack/client/maps/l52_56 new file mode 100644 index 00000000..e30eba2d Binary files /dev/null and b/src/public/data/pack/client/maps/l52_56 differ diff --git a/src/public/data/pack/client/maps/l52_57 b/src/public/data/pack/client/maps/l52_57 new file mode 100644 index 00000000..5e27a893 Binary files /dev/null and b/src/public/data/pack/client/maps/l52_57 differ diff --git a/src/public/data/pack/client/maps/l52_58 b/src/public/data/pack/client/maps/l52_58 new file mode 100644 index 00000000..ee1b483e Binary files /dev/null and b/src/public/data/pack/client/maps/l52_58 differ diff --git a/src/public/data/pack/client/maps/l52_59 b/src/public/data/pack/client/maps/l52_59 new file mode 100644 index 00000000..ca178ab1 Binary files /dev/null and b/src/public/data/pack/client/maps/l52_59 differ diff --git a/src/public/data/pack/client/maps/l52_60 b/src/public/data/pack/client/maps/l52_60 new file mode 100644 index 00000000..fd7d1ad9 Binary files /dev/null and b/src/public/data/pack/client/maps/l52_60 differ diff --git a/src/public/data/pack/client/maps/l52_61 b/src/public/data/pack/client/maps/l52_61 new file mode 100644 index 00000000..88784b2f Binary files /dev/null and b/src/public/data/pack/client/maps/l52_61 differ diff --git a/src/public/data/pack/client/maps/l52_62 b/src/public/data/pack/client/maps/l52_62 new file mode 100644 index 00000000..b4f1831a Binary files /dev/null and b/src/public/data/pack/client/maps/l52_62 differ diff --git a/src/public/data/pack/client/maps/l53_49 b/src/public/data/pack/client/maps/l53_49 new file mode 100644 index 00000000..e546729f Binary files /dev/null and b/src/public/data/pack/client/maps/l53_49 differ diff --git a/src/public/data/pack/client/maps/l53_50 b/src/public/data/pack/client/maps/l53_50 new file mode 100644 index 00000000..e7519974 Binary files /dev/null and b/src/public/data/pack/client/maps/l53_50 differ diff --git a/src/public/data/pack/client/maps/l53_51 b/src/public/data/pack/client/maps/l53_51 new file mode 100644 index 00000000..7eab92ed Binary files /dev/null and b/src/public/data/pack/client/maps/l53_51 differ diff --git a/src/public/data/pack/client/maps/l53_52 b/src/public/data/pack/client/maps/l53_52 new file mode 100644 index 00000000..b4f1831a Binary files /dev/null and b/src/public/data/pack/client/maps/l53_52 differ diff --git a/src/public/data/pack/client/maps/l53_53 b/src/public/data/pack/client/maps/l53_53 new file mode 100644 index 00000000..0b868617 Binary files /dev/null and b/src/public/data/pack/client/maps/l53_53 differ diff --git a/src/public/data/pack/client/maps/m29_75 b/src/public/data/pack/client/maps/m29_75 new file mode 100644 index 00000000..639134cb Binary files /dev/null and b/src/public/data/pack/client/maps/m29_75 differ diff --git a/src/public/data/pack/client/maps/m30_75 b/src/public/data/pack/client/maps/m30_75 new file mode 100644 index 00000000..d37c3546 Binary files /dev/null and b/src/public/data/pack/client/maps/m30_75 differ diff --git a/src/public/data/pack/client/maps/m31_75 b/src/public/data/pack/client/maps/m31_75 new file mode 100644 index 00000000..4c478894 Binary files /dev/null and b/src/public/data/pack/client/maps/m31_75 differ diff --git a/src/public/data/pack/client/maps/m32_70 b/src/public/data/pack/client/maps/m32_70 new file mode 100644 index 00000000..f8d32fb9 Binary files /dev/null and b/src/public/data/pack/client/maps/m32_70 differ diff --git a/src/public/data/pack/client/maps/m32_71 b/src/public/data/pack/client/maps/m32_71 new file mode 100644 index 00000000..3f3ea0a6 Binary files /dev/null and b/src/public/data/pack/client/maps/m32_71 differ diff --git a/src/public/data/pack/client/maps/m32_72 b/src/public/data/pack/client/maps/m32_72 new file mode 100644 index 00000000..bb1a7f8d Binary files /dev/null and b/src/public/data/pack/client/maps/m32_72 differ diff --git a/src/public/data/pack/client/maps/m32_73 b/src/public/data/pack/client/maps/m32_73 new file mode 100644 index 00000000..0c687450 Binary files /dev/null and b/src/public/data/pack/client/maps/m32_73 differ diff --git a/src/public/data/pack/client/maps/m32_74 b/src/public/data/pack/client/maps/m32_74 new file mode 100644 index 00000000..5fb84480 Binary files /dev/null and b/src/public/data/pack/client/maps/m32_74 differ diff --git a/src/public/data/pack/client/maps/m32_75 b/src/public/data/pack/client/maps/m32_75 new file mode 100644 index 00000000..930ca279 Binary files /dev/null and b/src/public/data/pack/client/maps/m32_75 differ diff --git a/src/public/data/pack/client/maps/m33_70 b/src/public/data/pack/client/maps/m33_70 new file mode 100644 index 00000000..ceecdcf6 Binary files /dev/null and b/src/public/data/pack/client/maps/m33_70 differ diff --git a/src/public/data/pack/client/maps/m33_71 b/src/public/data/pack/client/maps/m33_71 new file mode 100644 index 00000000..d274a154 Binary files /dev/null and b/src/public/data/pack/client/maps/m33_71 differ diff --git a/src/public/data/pack/client/maps/m33_72 b/src/public/data/pack/client/maps/m33_72 new file mode 100644 index 00000000..88c05020 Binary files /dev/null and b/src/public/data/pack/client/maps/m33_72 differ diff --git a/src/public/data/pack/client/maps/m33_73 b/src/public/data/pack/client/maps/m33_73 new file mode 100644 index 00000000..53df8196 Binary files /dev/null and b/src/public/data/pack/client/maps/m33_73 differ diff --git a/src/public/data/pack/client/maps/m33_74 b/src/public/data/pack/client/maps/m33_74 new file mode 100644 index 00000000..d9d670d3 Binary files /dev/null and b/src/public/data/pack/client/maps/m33_74 differ diff --git a/src/public/data/pack/client/maps/m33_75 b/src/public/data/pack/client/maps/m33_75 new file mode 100644 index 00000000..c699b865 Binary files /dev/null and b/src/public/data/pack/client/maps/m33_75 differ diff --git a/src/public/data/pack/client/maps/m33_76 b/src/public/data/pack/client/maps/m33_76 new file mode 100644 index 00000000..16034de4 Binary files /dev/null and b/src/public/data/pack/client/maps/m33_76 differ diff --git a/src/public/data/pack/client/maps/m34_70 b/src/public/data/pack/client/maps/m34_70 new file mode 100644 index 00000000..12b8b511 Binary files /dev/null and b/src/public/data/pack/client/maps/m34_70 differ diff --git a/src/public/data/pack/client/maps/m34_71 b/src/public/data/pack/client/maps/m34_71 new file mode 100644 index 00000000..8fd84982 Binary files /dev/null and b/src/public/data/pack/client/maps/m34_71 differ diff --git a/src/public/data/pack/client/maps/m34_72 b/src/public/data/pack/client/maps/m34_72 new file mode 100644 index 00000000..f5b6752b Binary files /dev/null and b/src/public/data/pack/client/maps/m34_72 differ diff --git a/src/public/data/pack/client/maps/m34_73 b/src/public/data/pack/client/maps/m34_73 new file mode 100644 index 00000000..ff4764c9 Binary files /dev/null and b/src/public/data/pack/client/maps/m34_73 differ diff --git a/src/public/data/pack/client/maps/m34_74 b/src/public/data/pack/client/maps/m34_74 new file mode 100644 index 00000000..2b454f03 Binary files /dev/null and b/src/public/data/pack/client/maps/m34_74 differ diff --git a/src/public/data/pack/client/maps/m34_75 b/src/public/data/pack/client/maps/m34_75 new file mode 100644 index 00000000..027f6fdc Binary files /dev/null and b/src/public/data/pack/client/maps/m34_75 differ diff --git a/src/public/data/pack/client/maps/m34_76 b/src/public/data/pack/client/maps/m34_76 new file mode 100644 index 00000000..160d88ca Binary files /dev/null and b/src/public/data/pack/client/maps/m34_76 differ diff --git a/src/public/data/pack/client/maps/m35_20 b/src/public/data/pack/client/maps/m35_20 new file mode 100644 index 00000000..0fb70b8c Binary files /dev/null and b/src/public/data/pack/client/maps/m35_20 differ diff --git a/src/public/data/pack/client/maps/m35_75 b/src/public/data/pack/client/maps/m35_75 new file mode 100644 index 00000000..16602250 Binary files /dev/null and b/src/public/data/pack/client/maps/m35_75 differ diff --git a/src/public/data/pack/client/maps/m35_76 b/src/public/data/pack/client/maps/m35_76 new file mode 100644 index 00000000..970973bd Binary files /dev/null and b/src/public/data/pack/client/maps/m35_76 differ diff --git a/src/public/data/pack/client/maps/m36_146 b/src/public/data/pack/client/maps/m36_146 new file mode 100644 index 00000000..2fca3bf5 Binary files /dev/null and b/src/public/data/pack/client/maps/m36_146 differ diff --git a/src/public/data/pack/client/maps/m36_147 b/src/public/data/pack/client/maps/m36_147 new file mode 100644 index 00000000..e7b09390 Binary files /dev/null and b/src/public/data/pack/client/maps/m36_147 differ diff --git a/src/public/data/pack/client/maps/m36_148 b/src/public/data/pack/client/maps/m36_148 new file mode 100644 index 00000000..fb729965 Binary files /dev/null and b/src/public/data/pack/client/maps/m36_148 differ diff --git a/src/public/data/pack/client/maps/m36_149 b/src/public/data/pack/client/maps/m36_149 new file mode 100644 index 00000000..94311601 Binary files /dev/null and b/src/public/data/pack/client/maps/m36_149 differ diff --git a/src/public/data/pack/client/maps/m36_150 b/src/public/data/pack/client/maps/m36_150 new file mode 100644 index 00000000..acf82302 Binary files /dev/null and b/src/public/data/pack/client/maps/m36_150 differ diff --git a/src/public/data/pack/client/maps/m36_153 b/src/public/data/pack/client/maps/m36_153 new file mode 100644 index 00000000..a97ce003 Binary files /dev/null and b/src/public/data/pack/client/maps/m36_153 differ diff --git a/src/public/data/pack/client/maps/m36_154 b/src/public/data/pack/client/maps/m36_154 new file mode 100644 index 00000000..84e33dd5 Binary files /dev/null and b/src/public/data/pack/client/maps/m36_154 differ diff --git a/src/public/data/pack/client/maps/m36_52 b/src/public/data/pack/client/maps/m36_52 new file mode 100644 index 00000000..042473ca Binary files /dev/null and b/src/public/data/pack/client/maps/m36_52 differ diff --git a/src/public/data/pack/client/maps/m36_53 b/src/public/data/pack/client/maps/m36_53 new file mode 100644 index 00000000..f940bc8f Binary files /dev/null and b/src/public/data/pack/client/maps/m36_53 differ diff --git a/src/public/data/pack/client/maps/m36_54 b/src/public/data/pack/client/maps/m36_54 new file mode 100644 index 00000000..711fa5cb Binary files /dev/null and b/src/public/data/pack/client/maps/m36_54 differ diff --git a/src/public/data/pack/client/maps/m36_72 b/src/public/data/pack/client/maps/m36_72 new file mode 100644 index 00000000..bd7cfeb6 Binary files /dev/null and b/src/public/data/pack/client/maps/m36_72 differ diff --git a/src/public/data/pack/client/maps/m36_73 b/src/public/data/pack/client/maps/m36_73 new file mode 100644 index 00000000..fb7ed084 Binary files /dev/null and b/src/public/data/pack/client/maps/m36_73 differ diff --git a/src/public/data/pack/client/maps/m36_74 b/src/public/data/pack/client/maps/m36_74 new file mode 100644 index 00000000..5890b8d9 Binary files /dev/null and b/src/public/data/pack/client/maps/m36_74 differ diff --git a/src/public/data/pack/client/maps/m36_75 b/src/public/data/pack/client/maps/m36_75 new file mode 100644 index 00000000..58a7bee3 Binary files /dev/null and b/src/public/data/pack/client/maps/m36_75 differ diff --git a/src/public/data/pack/client/maps/m36_76 b/src/public/data/pack/client/maps/m36_76 new file mode 100644 index 00000000..43b08b31 Binary files /dev/null and b/src/public/data/pack/client/maps/m36_76 differ diff --git a/src/public/data/pack/client/maps/m37_146 b/src/public/data/pack/client/maps/m37_146 new file mode 100644 index 00000000..90442897 Binary files /dev/null and b/src/public/data/pack/client/maps/m37_146 differ diff --git a/src/public/data/pack/client/maps/m37_147 b/src/public/data/pack/client/maps/m37_147 new file mode 100644 index 00000000..6cf32902 Binary files /dev/null and b/src/public/data/pack/client/maps/m37_147 differ diff --git a/src/public/data/pack/client/maps/m37_148 b/src/public/data/pack/client/maps/m37_148 new file mode 100644 index 00000000..499a1a42 Binary files /dev/null and b/src/public/data/pack/client/maps/m37_148 differ diff --git a/src/public/data/pack/client/maps/m37_149 b/src/public/data/pack/client/maps/m37_149 new file mode 100644 index 00000000..0d00db68 Binary files /dev/null and b/src/public/data/pack/client/maps/m37_149 differ diff --git a/src/public/data/pack/client/maps/m37_150 b/src/public/data/pack/client/maps/m37_150 new file mode 100644 index 00000000..cc9ff8ce Binary files /dev/null and b/src/public/data/pack/client/maps/m37_150 differ diff --git a/src/public/data/pack/client/maps/m37_151 b/src/public/data/pack/client/maps/m37_151 new file mode 100644 index 00000000..c3686726 Binary files /dev/null and b/src/public/data/pack/client/maps/m37_151 differ diff --git a/src/public/data/pack/client/maps/m37_152 b/src/public/data/pack/client/maps/m37_152 new file mode 100644 index 00000000..c3808521 Binary files /dev/null and b/src/public/data/pack/client/maps/m37_152 differ diff --git a/src/public/data/pack/client/maps/m37_153 b/src/public/data/pack/client/maps/m37_153 new file mode 100644 index 00000000..34f81b0a Binary files /dev/null and b/src/public/data/pack/client/maps/m37_153 differ diff --git a/src/public/data/pack/client/maps/m37_154 b/src/public/data/pack/client/maps/m37_154 new file mode 100644 index 00000000..077ad080 Binary files /dev/null and b/src/public/data/pack/client/maps/m37_154 differ diff --git a/src/public/data/pack/client/maps/m37_48 b/src/public/data/pack/client/maps/m37_48 new file mode 100644 index 00000000..118099ec Binary files /dev/null and b/src/public/data/pack/client/maps/m37_48 differ diff --git a/src/public/data/pack/client/maps/m37_49 b/src/public/data/pack/client/maps/m37_49 new file mode 100644 index 00000000..dbdf2c45 Binary files /dev/null and b/src/public/data/pack/client/maps/m37_49 differ diff --git a/src/public/data/pack/client/maps/m37_50 b/src/public/data/pack/client/maps/m37_50 new file mode 100644 index 00000000..da1cd344 Binary files /dev/null and b/src/public/data/pack/client/maps/m37_50 differ diff --git a/src/public/data/pack/client/maps/m37_51 b/src/public/data/pack/client/maps/m37_51 new file mode 100644 index 00000000..7d13185f Binary files /dev/null and b/src/public/data/pack/client/maps/m37_51 differ diff --git a/src/public/data/pack/client/maps/m37_52 b/src/public/data/pack/client/maps/m37_52 new file mode 100644 index 00000000..cc5e660d Binary files /dev/null and b/src/public/data/pack/client/maps/m37_52 differ diff --git a/src/public/data/pack/client/maps/m37_53 b/src/public/data/pack/client/maps/m37_53 new file mode 100644 index 00000000..fbbae640 Binary files /dev/null and b/src/public/data/pack/client/maps/m37_53 differ diff --git a/src/public/data/pack/client/maps/m37_54 b/src/public/data/pack/client/maps/m37_54 new file mode 100644 index 00000000..02c5f7a5 Binary files /dev/null and b/src/public/data/pack/client/maps/m37_54 differ diff --git a/src/public/data/pack/client/maps/m37_55 b/src/public/data/pack/client/maps/m37_55 new file mode 100644 index 00000000..33da664b Binary files /dev/null and b/src/public/data/pack/client/maps/m37_55 differ diff --git a/src/public/data/pack/client/maps/m37_72 b/src/public/data/pack/client/maps/m37_72 new file mode 100644 index 00000000..8b85e9da Binary files /dev/null and b/src/public/data/pack/client/maps/m37_72 differ diff --git a/src/public/data/pack/client/maps/m37_73 b/src/public/data/pack/client/maps/m37_73 new file mode 100644 index 00000000..553bf172 Binary files /dev/null and b/src/public/data/pack/client/maps/m37_73 differ diff --git a/src/public/data/pack/client/maps/m37_74 b/src/public/data/pack/client/maps/m37_74 new file mode 100644 index 00000000..9cb88891 Binary files /dev/null and b/src/public/data/pack/client/maps/m37_74 differ diff --git a/src/public/data/pack/client/maps/m37_75 b/src/public/data/pack/client/maps/m37_75 new file mode 100644 index 00000000..ca4ac322 Binary files /dev/null and b/src/public/data/pack/client/maps/m37_75 differ diff --git a/src/public/data/pack/client/maps/m38_146 b/src/public/data/pack/client/maps/m38_146 new file mode 100644 index 00000000..88f03b97 Binary files /dev/null and b/src/public/data/pack/client/maps/m38_146 differ diff --git a/src/public/data/pack/client/maps/m38_147 b/src/public/data/pack/client/maps/m38_147 new file mode 100644 index 00000000..fc20457c Binary files /dev/null and b/src/public/data/pack/client/maps/m38_147 differ diff --git a/src/public/data/pack/client/maps/m38_148 b/src/public/data/pack/client/maps/m38_148 new file mode 100644 index 00000000..ccb33388 Binary files /dev/null and b/src/public/data/pack/client/maps/m38_148 differ diff --git a/src/public/data/pack/client/maps/m38_149 b/src/public/data/pack/client/maps/m38_149 new file mode 100644 index 00000000..daae547d Binary files /dev/null and b/src/public/data/pack/client/maps/m38_149 differ diff --git a/src/public/data/pack/client/maps/m38_150 b/src/public/data/pack/client/maps/m38_150 new file mode 100644 index 00000000..27813703 Binary files /dev/null and b/src/public/data/pack/client/maps/m38_150 differ diff --git a/src/public/data/pack/client/maps/m38_151 b/src/public/data/pack/client/maps/m38_151 new file mode 100644 index 00000000..b31d80a6 Binary files /dev/null and b/src/public/data/pack/client/maps/m38_151 differ diff --git a/src/public/data/pack/client/maps/m38_152 b/src/public/data/pack/client/maps/m38_152 new file mode 100644 index 00000000..00fad630 Binary files /dev/null and b/src/public/data/pack/client/maps/m38_152 differ diff --git a/src/public/data/pack/client/maps/m38_153 b/src/public/data/pack/client/maps/m38_153 new file mode 100644 index 00000000..43fdbc69 Binary files /dev/null and b/src/public/data/pack/client/maps/m38_153 differ diff --git a/src/public/data/pack/client/maps/m38_154 b/src/public/data/pack/client/maps/m38_154 new file mode 100644 index 00000000..1580e43e Binary files /dev/null and b/src/public/data/pack/client/maps/m38_154 differ diff --git a/src/public/data/pack/client/maps/m38_155 b/src/public/data/pack/client/maps/m38_155 new file mode 100644 index 00000000..f4b0fddd Binary files /dev/null and b/src/public/data/pack/client/maps/m38_155 differ diff --git a/src/public/data/pack/client/maps/m38_45 b/src/public/data/pack/client/maps/m38_45 new file mode 100644 index 00000000..d174cdce Binary files /dev/null and b/src/public/data/pack/client/maps/m38_45 differ diff --git a/src/public/data/pack/client/maps/m38_46 b/src/public/data/pack/client/maps/m38_46 new file mode 100644 index 00000000..c1ecc01d Binary files /dev/null and b/src/public/data/pack/client/maps/m38_46 differ diff --git a/src/public/data/pack/client/maps/m38_47 b/src/public/data/pack/client/maps/m38_47 new file mode 100644 index 00000000..31b86f9c Binary files /dev/null and b/src/public/data/pack/client/maps/m38_47 differ diff --git a/src/public/data/pack/client/maps/m38_48 b/src/public/data/pack/client/maps/m38_48 new file mode 100644 index 00000000..dd97336b Binary files /dev/null and b/src/public/data/pack/client/maps/m38_48 differ diff --git a/src/public/data/pack/client/maps/m38_49 b/src/public/data/pack/client/maps/m38_49 new file mode 100644 index 00000000..c9e0c2d9 Binary files /dev/null and b/src/public/data/pack/client/maps/m38_49 differ diff --git a/src/public/data/pack/client/maps/m38_50 b/src/public/data/pack/client/maps/m38_50 new file mode 100644 index 00000000..4dcd6849 Binary files /dev/null and b/src/public/data/pack/client/maps/m38_50 differ diff --git a/src/public/data/pack/client/maps/m38_51 b/src/public/data/pack/client/maps/m38_51 new file mode 100644 index 00000000..68a32aed Binary files /dev/null and b/src/public/data/pack/client/maps/m38_51 differ diff --git a/src/public/data/pack/client/maps/m38_52 b/src/public/data/pack/client/maps/m38_52 new file mode 100644 index 00000000..c0417431 Binary files /dev/null and b/src/public/data/pack/client/maps/m38_52 differ diff --git a/src/public/data/pack/client/maps/m38_53 b/src/public/data/pack/client/maps/m38_53 new file mode 100644 index 00000000..cef46d0d Binary files /dev/null and b/src/public/data/pack/client/maps/m38_53 differ diff --git a/src/public/data/pack/client/maps/m38_54 b/src/public/data/pack/client/maps/m38_54 new file mode 100644 index 00000000..f885b03e Binary files /dev/null and b/src/public/data/pack/client/maps/m38_54 differ diff --git a/src/public/data/pack/client/maps/m38_55 b/src/public/data/pack/client/maps/m38_55 new file mode 100644 index 00000000..44a7f9e4 Binary files /dev/null and b/src/public/data/pack/client/maps/m38_55 differ diff --git a/src/public/data/pack/client/maps/m38_72 b/src/public/data/pack/client/maps/m38_72 new file mode 100644 index 00000000..b8d50f5b Binary files /dev/null and b/src/public/data/pack/client/maps/m38_72 differ diff --git a/src/public/data/pack/client/maps/m38_73 b/src/public/data/pack/client/maps/m38_73 new file mode 100644 index 00000000..1baa5aef Binary files /dev/null and b/src/public/data/pack/client/maps/m38_73 differ diff --git a/src/public/data/pack/client/maps/m38_74 b/src/public/data/pack/client/maps/m38_74 new file mode 100644 index 00000000..49a84001 Binary files /dev/null and b/src/public/data/pack/client/maps/m38_74 differ diff --git a/src/public/data/pack/client/maps/m39_147 b/src/public/data/pack/client/maps/m39_147 new file mode 100644 index 00000000..1ac01058 Binary files /dev/null and b/src/public/data/pack/client/maps/m39_147 differ diff --git a/src/public/data/pack/client/maps/m39_148 b/src/public/data/pack/client/maps/m39_148 new file mode 100644 index 00000000..c15bafb6 Binary files /dev/null and b/src/public/data/pack/client/maps/m39_148 differ diff --git a/src/public/data/pack/client/maps/m39_149 b/src/public/data/pack/client/maps/m39_149 new file mode 100644 index 00000000..784adbfa Binary files /dev/null and b/src/public/data/pack/client/maps/m39_149 differ diff --git a/src/public/data/pack/client/maps/m39_150 b/src/public/data/pack/client/maps/m39_150 new file mode 100644 index 00000000..aa5bb5b1 Binary files /dev/null and b/src/public/data/pack/client/maps/m39_150 differ diff --git a/src/public/data/pack/client/maps/m39_151 b/src/public/data/pack/client/maps/m39_151 new file mode 100644 index 00000000..c99750ea Binary files /dev/null and b/src/public/data/pack/client/maps/m39_151 differ diff --git a/src/public/data/pack/client/maps/m39_152 b/src/public/data/pack/client/maps/m39_152 new file mode 100644 index 00000000..dd4b7e24 Binary files /dev/null and b/src/public/data/pack/client/maps/m39_152 differ diff --git a/src/public/data/pack/client/maps/m39_153 b/src/public/data/pack/client/maps/m39_153 new file mode 100644 index 00000000..10b6e087 Binary files /dev/null and b/src/public/data/pack/client/maps/m39_153 differ diff --git a/src/public/data/pack/client/maps/m39_154 b/src/public/data/pack/client/maps/m39_154 new file mode 100644 index 00000000..cb114431 Binary files /dev/null and b/src/public/data/pack/client/maps/m39_154 differ diff --git a/src/public/data/pack/client/maps/m39_155 b/src/public/data/pack/client/maps/m39_155 new file mode 100644 index 00000000..5ed45c48 Binary files /dev/null and b/src/public/data/pack/client/maps/m39_155 differ diff --git a/src/public/data/pack/client/maps/m39_45 b/src/public/data/pack/client/maps/m39_45 new file mode 100644 index 00000000..ef7a241b Binary files /dev/null and b/src/public/data/pack/client/maps/m39_45 differ diff --git a/src/public/data/pack/client/maps/m39_46 b/src/public/data/pack/client/maps/m39_46 new file mode 100644 index 00000000..a89faa6c Binary files /dev/null and b/src/public/data/pack/client/maps/m39_46 differ diff --git a/src/public/data/pack/client/maps/m39_47 b/src/public/data/pack/client/maps/m39_47 new file mode 100644 index 00000000..72550bed Binary files /dev/null and b/src/public/data/pack/client/maps/m39_47 differ diff --git a/src/public/data/pack/client/maps/m39_48 b/src/public/data/pack/client/maps/m39_48 new file mode 100644 index 00000000..089f9797 Binary files /dev/null and b/src/public/data/pack/client/maps/m39_48 differ diff --git a/src/public/data/pack/client/maps/m39_49 b/src/public/data/pack/client/maps/m39_49 new file mode 100644 index 00000000..307438c2 Binary files /dev/null and b/src/public/data/pack/client/maps/m39_49 differ diff --git a/src/public/data/pack/client/maps/m39_50 b/src/public/data/pack/client/maps/m39_50 new file mode 100644 index 00000000..23706df0 Binary files /dev/null and b/src/public/data/pack/client/maps/m39_50 differ diff --git a/src/public/data/pack/client/maps/m39_51 b/src/public/data/pack/client/maps/m39_51 new file mode 100644 index 00000000..06255cfa Binary files /dev/null and b/src/public/data/pack/client/maps/m39_51 differ diff --git a/src/public/data/pack/client/maps/m39_52 b/src/public/data/pack/client/maps/m39_52 new file mode 100644 index 00000000..c071a056 Binary files /dev/null and b/src/public/data/pack/client/maps/m39_52 differ diff --git a/src/public/data/pack/client/maps/m39_53 b/src/public/data/pack/client/maps/m39_53 new file mode 100644 index 00000000..79d73094 Binary files /dev/null and b/src/public/data/pack/client/maps/m39_53 differ diff --git a/src/public/data/pack/client/maps/m39_54 b/src/public/data/pack/client/maps/m39_54 new file mode 100644 index 00000000..0e90c138 Binary files /dev/null and b/src/public/data/pack/client/maps/m39_54 differ diff --git a/src/public/data/pack/client/maps/m39_55 b/src/public/data/pack/client/maps/m39_55 new file mode 100644 index 00000000..ed950771 Binary files /dev/null and b/src/public/data/pack/client/maps/m39_55 differ diff --git a/src/public/data/pack/client/maps/m39_72 b/src/public/data/pack/client/maps/m39_72 new file mode 100644 index 00000000..817360e8 Binary files /dev/null and b/src/public/data/pack/client/maps/m39_72 differ diff --git a/src/public/data/pack/client/maps/m39_73 b/src/public/data/pack/client/maps/m39_73 new file mode 100644 index 00000000..9f02004a Binary files /dev/null and b/src/public/data/pack/client/maps/m39_73 differ diff --git a/src/public/data/pack/client/maps/m39_74 b/src/public/data/pack/client/maps/m39_74 new file mode 100644 index 00000000..20186e7b Binary files /dev/null and b/src/public/data/pack/client/maps/m39_74 differ diff --git a/src/public/data/pack/client/maps/m39_75 b/src/public/data/pack/client/maps/m39_75 new file mode 100644 index 00000000..2bc3d502 Binary files /dev/null and b/src/public/data/pack/client/maps/m39_75 differ diff --git a/src/public/data/pack/client/maps/m39_76 b/src/public/data/pack/client/maps/m39_76 new file mode 100644 index 00000000..ba1d979a Binary files /dev/null and b/src/public/data/pack/client/maps/m39_76 differ diff --git a/src/public/data/pack/client/maps/m40_147 b/src/public/data/pack/client/maps/m40_147 new file mode 100644 index 00000000..bebebac3 Binary files /dev/null and b/src/public/data/pack/client/maps/m40_147 differ diff --git a/src/public/data/pack/client/maps/m40_148 b/src/public/data/pack/client/maps/m40_148 new file mode 100644 index 00000000..f0b83c0a Binary files /dev/null and b/src/public/data/pack/client/maps/m40_148 differ diff --git a/src/public/data/pack/client/maps/m40_149 b/src/public/data/pack/client/maps/m40_149 new file mode 100644 index 00000000..a424a85b Binary files /dev/null and b/src/public/data/pack/client/maps/m40_149 differ diff --git a/src/public/data/pack/client/maps/m40_150 b/src/public/data/pack/client/maps/m40_150 new file mode 100644 index 00000000..2162a7bd Binary files /dev/null and b/src/public/data/pack/client/maps/m40_150 differ diff --git a/src/public/data/pack/client/maps/m40_151 b/src/public/data/pack/client/maps/m40_151 new file mode 100644 index 00000000..59d85557 Binary files /dev/null and b/src/public/data/pack/client/maps/m40_151 differ diff --git a/src/public/data/pack/client/maps/m40_152 b/src/public/data/pack/client/maps/m40_152 new file mode 100644 index 00000000..63f59993 Binary files /dev/null and b/src/public/data/pack/client/maps/m40_152 differ diff --git a/src/public/data/pack/client/maps/m40_153 b/src/public/data/pack/client/maps/m40_153 new file mode 100644 index 00000000..fc1e8ef9 Binary files /dev/null and b/src/public/data/pack/client/maps/m40_153 differ diff --git a/src/public/data/pack/client/maps/m40_154 b/src/public/data/pack/client/maps/m40_154 new file mode 100644 index 00000000..06d146f9 Binary files /dev/null and b/src/public/data/pack/client/maps/m40_154 differ diff --git a/src/public/data/pack/client/maps/m40_45 b/src/public/data/pack/client/maps/m40_45 new file mode 100644 index 00000000..78a600e4 Binary files /dev/null and b/src/public/data/pack/client/maps/m40_45 differ diff --git a/src/public/data/pack/client/maps/m40_46 b/src/public/data/pack/client/maps/m40_46 new file mode 100644 index 00000000..08e9e235 Binary files /dev/null and b/src/public/data/pack/client/maps/m40_46 differ diff --git a/src/public/data/pack/client/maps/m40_47 b/src/public/data/pack/client/maps/m40_47 new file mode 100644 index 00000000..7ef4da0b Binary files /dev/null and b/src/public/data/pack/client/maps/m40_47 differ diff --git a/src/public/data/pack/client/maps/m40_48 b/src/public/data/pack/client/maps/m40_48 new file mode 100644 index 00000000..12678424 Binary files /dev/null and b/src/public/data/pack/client/maps/m40_48 differ diff --git a/src/public/data/pack/client/maps/m40_49 b/src/public/data/pack/client/maps/m40_49 new file mode 100644 index 00000000..64d75191 Binary files /dev/null and b/src/public/data/pack/client/maps/m40_49 differ diff --git a/src/public/data/pack/client/maps/m40_50 b/src/public/data/pack/client/maps/m40_50 new file mode 100644 index 00000000..99bdb9cd Binary files /dev/null and b/src/public/data/pack/client/maps/m40_50 differ diff --git a/src/public/data/pack/client/maps/m40_51 b/src/public/data/pack/client/maps/m40_51 new file mode 100644 index 00000000..880b5297 Binary files /dev/null and b/src/public/data/pack/client/maps/m40_51 differ diff --git a/src/public/data/pack/client/maps/m40_52 b/src/public/data/pack/client/maps/m40_52 new file mode 100644 index 00000000..1f82d36d Binary files /dev/null and b/src/public/data/pack/client/maps/m40_52 differ diff --git a/src/public/data/pack/client/maps/m40_53 b/src/public/data/pack/client/maps/m40_53 new file mode 100644 index 00000000..2a0bbc52 Binary files /dev/null and b/src/public/data/pack/client/maps/m40_53 differ diff --git a/src/public/data/pack/client/maps/m40_54 b/src/public/data/pack/client/maps/m40_54 new file mode 100644 index 00000000..9ba516eb Binary files /dev/null and b/src/public/data/pack/client/maps/m40_54 differ diff --git a/src/public/data/pack/client/maps/m40_55 b/src/public/data/pack/client/maps/m40_55 new file mode 100644 index 00000000..94428d81 Binary files /dev/null and b/src/public/data/pack/client/maps/m40_55 differ diff --git a/src/public/data/pack/client/maps/m40_72 b/src/public/data/pack/client/maps/m40_72 new file mode 100644 index 00000000..fbaa7978 Binary files /dev/null and b/src/public/data/pack/client/maps/m40_72 differ diff --git a/src/public/data/pack/client/maps/m40_73 b/src/public/data/pack/client/maps/m40_73 new file mode 100644 index 00000000..eb11214f Binary files /dev/null and b/src/public/data/pack/client/maps/m40_73 differ diff --git a/src/public/data/pack/client/maps/m40_74 b/src/public/data/pack/client/maps/m40_74 new file mode 100644 index 00000000..01c6c9f1 Binary files /dev/null and b/src/public/data/pack/client/maps/m40_74 differ diff --git a/src/public/data/pack/client/maps/m40_75 b/src/public/data/pack/client/maps/m40_75 new file mode 100644 index 00000000..b387cf56 Binary files /dev/null and b/src/public/data/pack/client/maps/m40_75 differ diff --git a/src/public/data/pack/client/maps/m40_76 b/src/public/data/pack/client/maps/m40_76 new file mode 100644 index 00000000..30344e78 Binary files /dev/null and b/src/public/data/pack/client/maps/m40_76 differ diff --git a/src/public/data/pack/client/maps/m41_146 b/src/public/data/pack/client/maps/m41_146 new file mode 100644 index 00000000..ec3e9606 Binary files /dev/null and b/src/public/data/pack/client/maps/m41_146 differ diff --git a/src/public/data/pack/client/maps/m41_149 b/src/public/data/pack/client/maps/m41_149 new file mode 100644 index 00000000..b6a5ff04 Binary files /dev/null and b/src/public/data/pack/client/maps/m41_149 differ diff --git a/src/public/data/pack/client/maps/m41_151 b/src/public/data/pack/client/maps/m41_151 new file mode 100644 index 00000000..5a79a8d3 Binary files /dev/null and b/src/public/data/pack/client/maps/m41_151 differ diff --git a/src/public/data/pack/client/maps/m41_152 b/src/public/data/pack/client/maps/m41_152 new file mode 100644 index 00000000..b7d79859 Binary files /dev/null and b/src/public/data/pack/client/maps/m41_152 differ diff --git a/src/public/data/pack/client/maps/m41_153 b/src/public/data/pack/client/maps/m41_153 new file mode 100644 index 00000000..126ce82f Binary files /dev/null and b/src/public/data/pack/client/maps/m41_153 differ diff --git a/src/public/data/pack/client/maps/m41_154 b/src/public/data/pack/client/maps/m41_154 new file mode 100644 index 00000000..4f5b09ea Binary files /dev/null and b/src/public/data/pack/client/maps/m41_154 differ diff --git a/src/public/data/pack/client/maps/m41_45 b/src/public/data/pack/client/maps/m41_45 new file mode 100644 index 00000000..7b46f17e Binary files /dev/null and b/src/public/data/pack/client/maps/m41_45 differ diff --git a/src/public/data/pack/client/maps/m41_46 b/src/public/data/pack/client/maps/m41_46 new file mode 100644 index 00000000..0db51bb2 Binary files /dev/null and b/src/public/data/pack/client/maps/m41_46 differ diff --git a/src/public/data/pack/client/maps/m41_47 b/src/public/data/pack/client/maps/m41_47 new file mode 100644 index 00000000..450d0d06 Binary files /dev/null and b/src/public/data/pack/client/maps/m41_47 differ diff --git a/src/public/data/pack/client/maps/m41_48 b/src/public/data/pack/client/maps/m41_48 new file mode 100644 index 00000000..dcf5ac04 Binary files /dev/null and b/src/public/data/pack/client/maps/m41_48 differ diff --git a/src/public/data/pack/client/maps/m41_49 b/src/public/data/pack/client/maps/m41_49 new file mode 100644 index 00000000..9b11d95a Binary files /dev/null and b/src/public/data/pack/client/maps/m41_49 differ diff --git a/src/public/data/pack/client/maps/m41_50 b/src/public/data/pack/client/maps/m41_50 new file mode 100644 index 00000000..33711101 Binary files /dev/null and b/src/public/data/pack/client/maps/m41_50 differ diff --git a/src/public/data/pack/client/maps/m41_51 b/src/public/data/pack/client/maps/m41_51 new file mode 100644 index 00000000..cc2e8f82 Binary files /dev/null and b/src/public/data/pack/client/maps/m41_51 differ diff --git a/src/public/data/pack/client/maps/m41_52 b/src/public/data/pack/client/maps/m41_52 new file mode 100644 index 00000000..9ca54d60 Binary files /dev/null and b/src/public/data/pack/client/maps/m41_52 differ diff --git a/src/public/data/pack/client/maps/m41_53 b/src/public/data/pack/client/maps/m41_53 new file mode 100644 index 00000000..625e3633 Binary files /dev/null and b/src/public/data/pack/client/maps/m41_53 differ diff --git a/src/public/data/pack/client/maps/m41_54 b/src/public/data/pack/client/maps/m41_54 new file mode 100644 index 00000000..eea7a71c Binary files /dev/null and b/src/public/data/pack/client/maps/m41_54 differ diff --git a/src/public/data/pack/client/maps/m41_55 b/src/public/data/pack/client/maps/m41_55 new file mode 100644 index 00000000..73418f4c Binary files /dev/null and b/src/public/data/pack/client/maps/m41_55 differ diff --git a/src/public/data/pack/client/maps/m41_56 b/src/public/data/pack/client/maps/m41_56 new file mode 100644 index 00000000..49161794 Binary files /dev/null and b/src/public/data/pack/client/maps/m41_56 differ diff --git a/src/public/data/pack/client/maps/m41_72 b/src/public/data/pack/client/maps/m41_72 new file mode 100644 index 00000000..381cb1a4 Binary files /dev/null and b/src/public/data/pack/client/maps/m41_72 differ diff --git a/src/public/data/pack/client/maps/m41_73 b/src/public/data/pack/client/maps/m41_73 new file mode 100644 index 00000000..2cc12feb Binary files /dev/null and b/src/public/data/pack/client/maps/m41_73 differ diff --git a/src/public/data/pack/client/maps/m41_74 b/src/public/data/pack/client/maps/m41_74 new file mode 100644 index 00000000..de2b29a5 Binary files /dev/null and b/src/public/data/pack/client/maps/m41_74 differ diff --git a/src/public/data/pack/client/maps/m41_75 b/src/public/data/pack/client/maps/m41_75 new file mode 100644 index 00000000..88ad0b0c Binary files /dev/null and b/src/public/data/pack/client/maps/m41_75 differ diff --git a/src/public/data/pack/client/maps/m42_144 b/src/public/data/pack/client/maps/m42_144 new file mode 100644 index 00000000..5c5f330a Binary files /dev/null and b/src/public/data/pack/client/maps/m42_144 differ diff --git a/src/public/data/pack/client/maps/m42_145 b/src/public/data/pack/client/maps/m42_145 new file mode 100644 index 00000000..353a4426 Binary files /dev/null and b/src/public/data/pack/client/maps/m42_145 differ diff --git a/src/public/data/pack/client/maps/m42_146 b/src/public/data/pack/client/maps/m42_146 new file mode 100644 index 00000000..7a7bc702 Binary files /dev/null and b/src/public/data/pack/client/maps/m42_146 differ diff --git a/src/public/data/pack/client/maps/m42_151 b/src/public/data/pack/client/maps/m42_151 new file mode 100644 index 00000000..2bcb467f Binary files /dev/null and b/src/public/data/pack/client/maps/m42_151 differ diff --git a/src/public/data/pack/client/maps/m42_152 b/src/public/data/pack/client/maps/m42_152 new file mode 100644 index 00000000..07be9319 Binary files /dev/null and b/src/public/data/pack/client/maps/m42_152 differ diff --git a/src/public/data/pack/client/maps/m42_153 b/src/public/data/pack/client/maps/m42_153 new file mode 100644 index 00000000..46006231 Binary files /dev/null and b/src/public/data/pack/client/maps/m42_153 differ diff --git a/src/public/data/pack/client/maps/m42_49 b/src/public/data/pack/client/maps/m42_49 new file mode 100644 index 00000000..79d9b40e Binary files /dev/null and b/src/public/data/pack/client/maps/m42_49 differ diff --git a/src/public/data/pack/client/maps/m42_50 b/src/public/data/pack/client/maps/m42_50 new file mode 100644 index 00000000..8cf69b62 Binary files /dev/null and b/src/public/data/pack/client/maps/m42_50 differ diff --git a/src/public/data/pack/client/maps/m42_51 b/src/public/data/pack/client/maps/m42_51 new file mode 100644 index 00000000..9f91b0b0 Binary files /dev/null and b/src/public/data/pack/client/maps/m42_51 differ diff --git a/src/public/data/pack/client/maps/m42_52 b/src/public/data/pack/client/maps/m42_52 new file mode 100644 index 00000000..a5cf3211 Binary files /dev/null and b/src/public/data/pack/client/maps/m42_52 differ diff --git a/src/public/data/pack/client/maps/m42_53 b/src/public/data/pack/client/maps/m42_53 new file mode 100644 index 00000000..b93f1256 Binary files /dev/null and b/src/public/data/pack/client/maps/m42_53 differ diff --git a/src/public/data/pack/client/maps/m42_54 b/src/public/data/pack/client/maps/m42_54 new file mode 100644 index 00000000..3941ad6c Binary files /dev/null and b/src/public/data/pack/client/maps/m42_54 differ diff --git a/src/public/data/pack/client/maps/m42_55 b/src/public/data/pack/client/maps/m42_55 new file mode 100644 index 00000000..847a499d Binary files /dev/null and b/src/public/data/pack/client/maps/m42_55 differ diff --git a/src/public/data/pack/client/maps/m42_56 b/src/public/data/pack/client/maps/m42_56 new file mode 100644 index 00000000..85d23e2d Binary files /dev/null and b/src/public/data/pack/client/maps/m42_56 differ diff --git a/src/public/data/pack/client/maps/m42_72 b/src/public/data/pack/client/maps/m42_72 new file mode 100644 index 00000000..b32d3bbc Binary files /dev/null and b/src/public/data/pack/client/maps/m42_72 differ diff --git a/src/public/data/pack/client/maps/m42_73 b/src/public/data/pack/client/maps/m42_73 new file mode 100644 index 00000000..5d7ae758 Binary files /dev/null and b/src/public/data/pack/client/maps/m42_73 differ diff --git a/src/public/data/pack/client/maps/m42_74 b/src/public/data/pack/client/maps/m42_74 new file mode 100644 index 00000000..fc01e25f Binary files /dev/null and b/src/public/data/pack/client/maps/m42_74 differ diff --git a/src/public/data/pack/client/maps/m42_75 b/src/public/data/pack/client/maps/m42_75 new file mode 100644 index 00000000..5c2eef5a Binary files /dev/null and b/src/public/data/pack/client/maps/m42_75 differ diff --git a/src/public/data/pack/client/maps/m43_144 b/src/public/data/pack/client/maps/m43_144 new file mode 100644 index 00000000..8ba2f722 Binary files /dev/null and b/src/public/data/pack/client/maps/m43_144 differ diff --git a/src/public/data/pack/client/maps/m43_145 b/src/public/data/pack/client/maps/m43_145 new file mode 100644 index 00000000..2a18e3a1 Binary files /dev/null and b/src/public/data/pack/client/maps/m43_145 differ diff --git a/src/public/data/pack/client/maps/m43_146 b/src/public/data/pack/client/maps/m43_146 new file mode 100644 index 00000000..c9f387c0 Binary files /dev/null and b/src/public/data/pack/client/maps/m43_146 differ diff --git a/src/public/data/pack/client/maps/m43_153 b/src/public/data/pack/client/maps/m43_153 new file mode 100644 index 00000000..70a098f0 Binary files /dev/null and b/src/public/data/pack/client/maps/m43_153 differ diff --git a/src/public/data/pack/client/maps/m43_154 b/src/public/data/pack/client/maps/m43_154 new file mode 100644 index 00000000..48198b9d Binary files /dev/null and b/src/public/data/pack/client/maps/m43_154 differ diff --git a/src/public/data/pack/client/maps/m43_45 b/src/public/data/pack/client/maps/m43_45 new file mode 100644 index 00000000..b497e70b Binary files /dev/null and b/src/public/data/pack/client/maps/m43_45 differ diff --git a/src/public/data/pack/client/maps/m43_46 b/src/public/data/pack/client/maps/m43_46 new file mode 100644 index 00000000..5dffd546 Binary files /dev/null and b/src/public/data/pack/client/maps/m43_46 differ diff --git a/src/public/data/pack/client/maps/m43_47 b/src/public/data/pack/client/maps/m43_47 new file mode 100644 index 00000000..8713f7a1 Binary files /dev/null and b/src/public/data/pack/client/maps/m43_47 differ diff --git a/src/public/data/pack/client/maps/m43_48 b/src/public/data/pack/client/maps/m43_48 new file mode 100644 index 00000000..09d20355 Binary files /dev/null and b/src/public/data/pack/client/maps/m43_48 differ diff --git a/src/public/data/pack/client/maps/m43_49 b/src/public/data/pack/client/maps/m43_49 new file mode 100644 index 00000000..0452041a Binary files /dev/null and b/src/public/data/pack/client/maps/m43_49 differ diff --git a/src/public/data/pack/client/maps/m43_50 b/src/public/data/pack/client/maps/m43_50 new file mode 100644 index 00000000..8720c4b1 Binary files /dev/null and b/src/public/data/pack/client/maps/m43_50 differ diff --git a/src/public/data/pack/client/maps/m43_51 b/src/public/data/pack/client/maps/m43_51 new file mode 100644 index 00000000..0421c4de Binary files /dev/null and b/src/public/data/pack/client/maps/m43_51 differ diff --git a/src/public/data/pack/client/maps/m43_52 b/src/public/data/pack/client/maps/m43_52 new file mode 100644 index 00000000..8e7e4f34 Binary files /dev/null and b/src/public/data/pack/client/maps/m43_52 differ diff --git a/src/public/data/pack/client/maps/m43_53 b/src/public/data/pack/client/maps/m43_53 new file mode 100644 index 00000000..b4592c0d Binary files /dev/null and b/src/public/data/pack/client/maps/m43_53 differ diff --git a/src/public/data/pack/client/maps/m43_54 b/src/public/data/pack/client/maps/m43_54 new file mode 100644 index 00000000..99c1f413 Binary files /dev/null and b/src/public/data/pack/client/maps/m43_54 differ diff --git a/src/public/data/pack/client/maps/m43_55 b/src/public/data/pack/client/maps/m43_55 new file mode 100644 index 00000000..87baedcf Binary files /dev/null and b/src/public/data/pack/client/maps/m43_55 differ diff --git a/src/public/data/pack/client/maps/m43_56 b/src/public/data/pack/client/maps/m43_56 new file mode 100644 index 00000000..494a475e Binary files /dev/null and b/src/public/data/pack/client/maps/m43_56 differ diff --git a/src/public/data/pack/client/maps/m43_72 b/src/public/data/pack/client/maps/m43_72 new file mode 100644 index 00000000..848c0e8c Binary files /dev/null and b/src/public/data/pack/client/maps/m43_72 differ diff --git a/src/public/data/pack/client/maps/m43_73 b/src/public/data/pack/client/maps/m43_73 new file mode 100644 index 00000000..2c5a5f15 Binary files /dev/null and b/src/public/data/pack/client/maps/m43_73 differ diff --git a/src/public/data/pack/client/maps/m43_74 b/src/public/data/pack/client/maps/m43_74 new file mode 100644 index 00000000..cf9c0953 Binary files /dev/null and b/src/public/data/pack/client/maps/m43_74 differ diff --git a/src/public/data/pack/client/maps/m43_75 b/src/public/data/pack/client/maps/m43_75 new file mode 100644 index 00000000..f317f51c Binary files /dev/null and b/src/public/data/pack/client/maps/m43_75 differ diff --git a/src/public/data/pack/client/maps/m44_144 b/src/public/data/pack/client/maps/m44_144 new file mode 100644 index 00000000..e9bcba14 Binary files /dev/null and b/src/public/data/pack/client/maps/m44_144 differ diff --git a/src/public/data/pack/client/maps/m44_145 b/src/public/data/pack/client/maps/m44_145 new file mode 100644 index 00000000..c4b66cc5 Binary files /dev/null and b/src/public/data/pack/client/maps/m44_145 differ diff --git a/src/public/data/pack/client/maps/m44_146 b/src/public/data/pack/client/maps/m44_146 new file mode 100644 index 00000000..5aa2e932 Binary files /dev/null and b/src/public/data/pack/client/maps/m44_146 differ diff --git a/src/public/data/pack/client/maps/m44_148 b/src/public/data/pack/client/maps/m44_148 new file mode 100644 index 00000000..cbdc025d Binary files /dev/null and b/src/public/data/pack/client/maps/m44_148 differ diff --git a/src/public/data/pack/client/maps/m44_149 b/src/public/data/pack/client/maps/m44_149 new file mode 100644 index 00000000..101f931b Binary files /dev/null and b/src/public/data/pack/client/maps/m44_149 differ diff --git a/src/public/data/pack/client/maps/m44_150 b/src/public/data/pack/client/maps/m44_150 new file mode 100644 index 00000000..a332a5cb Binary files /dev/null and b/src/public/data/pack/client/maps/m44_150 differ diff --git a/src/public/data/pack/client/maps/m44_151 b/src/public/data/pack/client/maps/m44_151 new file mode 100644 index 00000000..02855a1e Binary files /dev/null and b/src/public/data/pack/client/maps/m44_151 differ diff --git a/src/public/data/pack/client/maps/m44_152 b/src/public/data/pack/client/maps/m44_152 new file mode 100644 index 00000000..fe071b8a Binary files /dev/null and b/src/public/data/pack/client/maps/m44_152 differ diff --git a/src/public/data/pack/client/maps/m44_153 b/src/public/data/pack/client/maps/m44_153 new file mode 100644 index 00000000..2f1383f8 Binary files /dev/null and b/src/public/data/pack/client/maps/m44_153 differ diff --git a/src/public/data/pack/client/maps/m44_154 b/src/public/data/pack/client/maps/m44_154 new file mode 100644 index 00000000..c946a96d Binary files /dev/null and b/src/public/data/pack/client/maps/m44_154 differ diff --git a/src/public/data/pack/client/maps/m44_155 b/src/public/data/pack/client/maps/m44_155 new file mode 100644 index 00000000..bb5dd503 Binary files /dev/null and b/src/public/data/pack/client/maps/m44_155 differ diff --git a/src/public/data/pack/client/maps/m44_45 b/src/public/data/pack/client/maps/m44_45 new file mode 100644 index 00000000..a1823c6a Binary files /dev/null and b/src/public/data/pack/client/maps/m44_45 differ diff --git a/src/public/data/pack/client/maps/m44_46 b/src/public/data/pack/client/maps/m44_46 new file mode 100644 index 00000000..48a888d1 Binary files /dev/null and b/src/public/data/pack/client/maps/m44_46 differ diff --git a/src/public/data/pack/client/maps/m44_47 b/src/public/data/pack/client/maps/m44_47 new file mode 100644 index 00000000..8d984eae Binary files /dev/null and b/src/public/data/pack/client/maps/m44_47 differ diff --git a/src/public/data/pack/client/maps/m44_48 b/src/public/data/pack/client/maps/m44_48 new file mode 100644 index 00000000..daa617c8 Binary files /dev/null and b/src/public/data/pack/client/maps/m44_48 differ diff --git a/src/public/data/pack/client/maps/m44_49 b/src/public/data/pack/client/maps/m44_49 new file mode 100644 index 00000000..4292a5a4 Binary files /dev/null and b/src/public/data/pack/client/maps/m44_49 differ diff --git a/src/public/data/pack/client/maps/m44_50 b/src/public/data/pack/client/maps/m44_50 new file mode 100644 index 00000000..a2c000e4 Binary files /dev/null and b/src/public/data/pack/client/maps/m44_50 differ diff --git a/src/public/data/pack/client/maps/m44_51 b/src/public/data/pack/client/maps/m44_51 new file mode 100644 index 00000000..7ffd7794 Binary files /dev/null and b/src/public/data/pack/client/maps/m44_51 differ diff --git a/src/public/data/pack/client/maps/m44_52 b/src/public/data/pack/client/maps/m44_52 new file mode 100644 index 00000000..297dfe07 Binary files /dev/null and b/src/public/data/pack/client/maps/m44_52 differ diff --git a/src/public/data/pack/client/maps/m44_53 b/src/public/data/pack/client/maps/m44_53 new file mode 100644 index 00000000..69c29794 Binary files /dev/null and b/src/public/data/pack/client/maps/m44_53 differ diff --git a/src/public/data/pack/client/maps/m44_54 b/src/public/data/pack/client/maps/m44_54 new file mode 100644 index 00000000..d6ef5153 Binary files /dev/null and b/src/public/data/pack/client/maps/m44_54 differ diff --git a/src/public/data/pack/client/maps/m44_55 b/src/public/data/pack/client/maps/m44_55 new file mode 100644 index 00000000..4f4eeca5 Binary files /dev/null and b/src/public/data/pack/client/maps/m44_55 differ diff --git a/src/public/data/pack/client/maps/m44_72 b/src/public/data/pack/client/maps/m44_72 new file mode 100644 index 00000000..2b5787d5 Binary files /dev/null and b/src/public/data/pack/client/maps/m44_72 differ diff --git a/src/public/data/pack/client/maps/m44_73 b/src/public/data/pack/client/maps/m44_73 new file mode 100644 index 00000000..c2b62dfa Binary files /dev/null and b/src/public/data/pack/client/maps/m44_73 differ diff --git a/src/public/data/pack/client/maps/m44_74 b/src/public/data/pack/client/maps/m44_74 new file mode 100644 index 00000000..2943bfb1 Binary files /dev/null and b/src/public/data/pack/client/maps/m44_74 differ diff --git a/src/public/data/pack/client/maps/m44_75 b/src/public/data/pack/client/maps/m44_75 new file mode 100644 index 00000000..225e9654 Binary files /dev/null and b/src/public/data/pack/client/maps/m44_75 differ diff --git a/src/public/data/pack/client/maps/m45_145 b/src/public/data/pack/client/maps/m45_145 new file mode 100644 index 00000000..62485442 Binary files /dev/null and b/src/public/data/pack/client/maps/m45_145 differ diff --git a/src/public/data/pack/client/maps/m45_146 b/src/public/data/pack/client/maps/m45_146 new file mode 100644 index 00000000..5b4dce2c Binary files /dev/null and b/src/public/data/pack/client/maps/m45_146 differ diff --git a/src/public/data/pack/client/maps/m45_148 b/src/public/data/pack/client/maps/m45_148 new file mode 100644 index 00000000..d25df899 Binary files /dev/null and b/src/public/data/pack/client/maps/m45_148 differ diff --git a/src/public/data/pack/client/maps/m45_150 b/src/public/data/pack/client/maps/m45_150 new file mode 100644 index 00000000..49bec4fd Binary files /dev/null and b/src/public/data/pack/client/maps/m45_150 differ diff --git a/src/public/data/pack/client/maps/m45_151 b/src/public/data/pack/client/maps/m45_151 new file mode 100644 index 00000000..9a4ac285 Binary files /dev/null and b/src/public/data/pack/client/maps/m45_151 differ diff --git a/src/public/data/pack/client/maps/m45_152 b/src/public/data/pack/client/maps/m45_152 new file mode 100644 index 00000000..ebde34e8 Binary files /dev/null and b/src/public/data/pack/client/maps/m45_152 differ diff --git a/src/public/data/pack/client/maps/m45_153 b/src/public/data/pack/client/maps/m45_153 new file mode 100644 index 00000000..038d09dd Binary files /dev/null and b/src/public/data/pack/client/maps/m45_153 differ diff --git a/src/public/data/pack/client/maps/m45_154 b/src/public/data/pack/client/maps/m45_154 new file mode 100644 index 00000000..5c52e711 Binary files /dev/null and b/src/public/data/pack/client/maps/m45_154 differ diff --git a/src/public/data/pack/client/maps/m45_155 b/src/public/data/pack/client/maps/m45_155 new file mode 100644 index 00000000..442853f2 Binary files /dev/null and b/src/public/data/pack/client/maps/m45_155 differ diff --git a/src/public/data/pack/client/maps/m45_45 b/src/public/data/pack/client/maps/m45_45 new file mode 100644 index 00000000..fa5adc48 Binary files /dev/null and b/src/public/data/pack/client/maps/m45_45 differ diff --git a/src/public/data/pack/client/maps/m45_46 b/src/public/data/pack/client/maps/m45_46 new file mode 100644 index 00000000..bda4c1b9 Binary files /dev/null and b/src/public/data/pack/client/maps/m45_46 differ diff --git a/src/public/data/pack/client/maps/m45_47 b/src/public/data/pack/client/maps/m45_47 new file mode 100644 index 00000000..55ac1633 Binary files /dev/null and b/src/public/data/pack/client/maps/m45_47 differ diff --git a/src/public/data/pack/client/maps/m45_48 b/src/public/data/pack/client/maps/m45_48 new file mode 100644 index 00000000..ab969489 Binary files /dev/null and b/src/public/data/pack/client/maps/m45_48 differ diff --git a/src/public/data/pack/client/maps/m45_49 b/src/public/data/pack/client/maps/m45_49 new file mode 100644 index 00000000..952b6e8f Binary files /dev/null and b/src/public/data/pack/client/maps/m45_49 differ diff --git a/src/public/data/pack/client/maps/m45_50 b/src/public/data/pack/client/maps/m45_50 new file mode 100644 index 00000000..e78faeb2 Binary files /dev/null and b/src/public/data/pack/client/maps/m45_50 differ diff --git a/src/public/data/pack/client/maps/m45_51 b/src/public/data/pack/client/maps/m45_51 new file mode 100644 index 00000000..6cdd8b6a Binary files /dev/null and b/src/public/data/pack/client/maps/m45_51 differ diff --git a/src/public/data/pack/client/maps/m45_52 b/src/public/data/pack/client/maps/m45_52 new file mode 100644 index 00000000..b3232127 Binary files /dev/null and b/src/public/data/pack/client/maps/m45_52 differ diff --git a/src/public/data/pack/client/maps/m45_53 b/src/public/data/pack/client/maps/m45_53 new file mode 100644 index 00000000..08246a73 Binary files /dev/null and b/src/public/data/pack/client/maps/m45_53 differ diff --git a/src/public/data/pack/client/maps/m45_54 b/src/public/data/pack/client/maps/m45_54 new file mode 100644 index 00000000..968171b4 Binary files /dev/null and b/src/public/data/pack/client/maps/m45_54 differ diff --git a/src/public/data/pack/client/maps/m45_55 b/src/public/data/pack/client/maps/m45_55 new file mode 100644 index 00000000..3052e9d3 Binary files /dev/null and b/src/public/data/pack/client/maps/m45_55 differ diff --git a/src/public/data/pack/client/maps/m45_56 b/src/public/data/pack/client/maps/m45_56 new file mode 100644 index 00000000..c7618bfd Binary files /dev/null and b/src/public/data/pack/client/maps/m45_56 differ diff --git a/src/public/data/pack/client/maps/m45_57 b/src/public/data/pack/client/maps/m45_57 new file mode 100644 index 00000000..feb3fea4 Binary files /dev/null and b/src/public/data/pack/client/maps/m45_57 differ diff --git a/src/public/data/pack/client/maps/m45_58 b/src/public/data/pack/client/maps/m45_58 new file mode 100644 index 00000000..fc321a06 Binary files /dev/null and b/src/public/data/pack/client/maps/m45_58 differ diff --git a/src/public/data/pack/client/maps/m45_59 b/src/public/data/pack/client/maps/m45_59 new file mode 100644 index 00000000..da11b178 Binary files /dev/null and b/src/public/data/pack/client/maps/m45_59 differ diff --git a/src/public/data/pack/client/maps/m45_60 b/src/public/data/pack/client/maps/m45_60 new file mode 100644 index 00000000..510fe928 Binary files /dev/null and b/src/public/data/pack/client/maps/m45_60 differ diff --git a/src/public/data/pack/client/maps/m45_61 b/src/public/data/pack/client/maps/m45_61 new file mode 100644 index 00000000..2e73fad1 Binary files /dev/null and b/src/public/data/pack/client/maps/m45_61 differ diff --git a/src/public/data/pack/client/maps/m45_62 b/src/public/data/pack/client/maps/m45_62 new file mode 100644 index 00000000..1d8957c8 Binary files /dev/null and b/src/public/data/pack/client/maps/m45_62 differ diff --git a/src/public/data/pack/client/maps/m45_73 b/src/public/data/pack/client/maps/m45_73 new file mode 100644 index 00000000..896300f8 Binary files /dev/null and b/src/public/data/pack/client/maps/m45_73 differ diff --git a/src/public/data/pack/client/maps/m45_74 b/src/public/data/pack/client/maps/m45_74 new file mode 100644 index 00000000..c2685052 Binary files /dev/null and b/src/public/data/pack/client/maps/m45_74 differ diff --git a/src/public/data/pack/client/maps/m45_75 b/src/public/data/pack/client/maps/m45_75 new file mode 100644 index 00000000..33f9a84a Binary files /dev/null and b/src/public/data/pack/client/maps/m45_75 differ diff --git a/src/public/data/pack/client/maps/m45_76 b/src/public/data/pack/client/maps/m45_76 new file mode 100644 index 00000000..1f9060ac Binary files /dev/null and b/src/public/data/pack/client/maps/m45_76 differ diff --git a/src/public/data/pack/client/maps/m46_149 b/src/public/data/pack/client/maps/m46_149 new file mode 100644 index 00000000..7921a249 Binary files /dev/null and b/src/public/data/pack/client/maps/m46_149 differ diff --git a/src/public/data/pack/client/maps/m46_150 b/src/public/data/pack/client/maps/m46_150 new file mode 100644 index 00000000..18d33f11 Binary files /dev/null and b/src/public/data/pack/client/maps/m46_150 differ diff --git a/src/public/data/pack/client/maps/m46_152 b/src/public/data/pack/client/maps/m46_152 new file mode 100644 index 00000000..f07153f3 Binary files /dev/null and b/src/public/data/pack/client/maps/m46_152 differ diff --git a/src/public/data/pack/client/maps/m46_153 b/src/public/data/pack/client/maps/m46_153 new file mode 100644 index 00000000..11375299 Binary files /dev/null and b/src/public/data/pack/client/maps/m46_153 differ diff --git a/src/public/data/pack/client/maps/m46_154 b/src/public/data/pack/client/maps/m46_154 new file mode 100644 index 00000000..49b14e9a Binary files /dev/null and b/src/public/data/pack/client/maps/m46_154 differ diff --git a/src/public/data/pack/client/maps/m46_161 b/src/public/data/pack/client/maps/m46_161 new file mode 100644 index 00000000..fc832f9a Binary files /dev/null and b/src/public/data/pack/client/maps/m46_161 differ diff --git a/src/public/data/pack/client/maps/m46_45 b/src/public/data/pack/client/maps/m46_45 new file mode 100644 index 00000000..1efd767a Binary files /dev/null and b/src/public/data/pack/client/maps/m46_45 differ diff --git a/src/public/data/pack/client/maps/m46_46 b/src/public/data/pack/client/maps/m46_46 new file mode 100644 index 00000000..6a0c1a1b Binary files /dev/null and b/src/public/data/pack/client/maps/m46_46 differ diff --git a/src/public/data/pack/client/maps/m46_47 b/src/public/data/pack/client/maps/m46_47 new file mode 100644 index 00000000..5a4a68ee Binary files /dev/null and b/src/public/data/pack/client/maps/m46_47 differ diff --git a/src/public/data/pack/client/maps/m46_48 b/src/public/data/pack/client/maps/m46_48 new file mode 100644 index 00000000..b8bca803 Binary files /dev/null and b/src/public/data/pack/client/maps/m46_48 differ diff --git a/src/public/data/pack/client/maps/m46_49 b/src/public/data/pack/client/maps/m46_49 new file mode 100644 index 00000000..4c52f3e7 Binary files /dev/null and b/src/public/data/pack/client/maps/m46_49 differ diff --git a/src/public/data/pack/client/maps/m46_50 b/src/public/data/pack/client/maps/m46_50 new file mode 100644 index 00000000..e68e2eae Binary files /dev/null and b/src/public/data/pack/client/maps/m46_50 differ diff --git a/src/public/data/pack/client/maps/m46_51 b/src/public/data/pack/client/maps/m46_51 new file mode 100644 index 00000000..5cb44dea Binary files /dev/null and b/src/public/data/pack/client/maps/m46_51 differ diff --git a/src/public/data/pack/client/maps/m46_52 b/src/public/data/pack/client/maps/m46_52 new file mode 100644 index 00000000..8e6f629d Binary files /dev/null and b/src/public/data/pack/client/maps/m46_52 differ diff --git a/src/public/data/pack/client/maps/m46_53 b/src/public/data/pack/client/maps/m46_53 new file mode 100644 index 00000000..bbb5ec00 Binary files /dev/null and b/src/public/data/pack/client/maps/m46_53 differ diff --git a/src/public/data/pack/client/maps/m46_54 b/src/public/data/pack/client/maps/m46_54 new file mode 100644 index 00000000..b514064b Binary files /dev/null and b/src/public/data/pack/client/maps/m46_54 differ diff --git a/src/public/data/pack/client/maps/m46_55 b/src/public/data/pack/client/maps/m46_55 new file mode 100644 index 00000000..32773247 Binary files /dev/null and b/src/public/data/pack/client/maps/m46_55 differ diff --git a/src/public/data/pack/client/maps/m46_56 b/src/public/data/pack/client/maps/m46_56 new file mode 100644 index 00000000..4f3ac80f Binary files /dev/null and b/src/public/data/pack/client/maps/m46_56 differ diff --git a/src/public/data/pack/client/maps/m46_57 b/src/public/data/pack/client/maps/m46_57 new file mode 100644 index 00000000..57e20e45 Binary files /dev/null and b/src/public/data/pack/client/maps/m46_57 differ diff --git a/src/public/data/pack/client/maps/m46_58 b/src/public/data/pack/client/maps/m46_58 new file mode 100644 index 00000000..c9f57e5d Binary files /dev/null and b/src/public/data/pack/client/maps/m46_58 differ diff --git a/src/public/data/pack/client/maps/m46_59 b/src/public/data/pack/client/maps/m46_59 new file mode 100644 index 00000000..d4236df0 Binary files /dev/null and b/src/public/data/pack/client/maps/m46_59 differ diff --git a/src/public/data/pack/client/maps/m46_60 b/src/public/data/pack/client/maps/m46_60 new file mode 100644 index 00000000..dac7f7cc Binary files /dev/null and b/src/public/data/pack/client/maps/m46_60 differ diff --git a/src/public/data/pack/client/maps/m46_61 b/src/public/data/pack/client/maps/m46_61 new file mode 100644 index 00000000..b9635892 Binary files /dev/null and b/src/public/data/pack/client/maps/m46_61 differ diff --git a/src/public/data/pack/client/maps/m46_62 b/src/public/data/pack/client/maps/m46_62 new file mode 100644 index 00000000..1d8957c8 Binary files /dev/null and b/src/public/data/pack/client/maps/m46_62 differ diff --git a/src/public/data/pack/client/maps/m46_75 b/src/public/data/pack/client/maps/m46_75 new file mode 100644 index 00000000..8f47e0e7 Binary files /dev/null and b/src/public/data/pack/client/maps/m46_75 differ diff --git a/src/public/data/pack/client/maps/m47_148 b/src/public/data/pack/client/maps/m47_148 new file mode 100644 index 00000000..0148366d Binary files /dev/null and b/src/public/data/pack/client/maps/m47_148 differ diff --git a/src/public/data/pack/client/maps/m47_149 b/src/public/data/pack/client/maps/m47_149 new file mode 100644 index 00000000..1205252a Binary files /dev/null and b/src/public/data/pack/client/maps/m47_149 differ diff --git a/src/public/data/pack/client/maps/m47_150 b/src/public/data/pack/client/maps/m47_150 new file mode 100644 index 00000000..e7f9a6ca Binary files /dev/null and b/src/public/data/pack/client/maps/m47_150 differ diff --git a/src/public/data/pack/client/maps/m47_152 b/src/public/data/pack/client/maps/m47_152 new file mode 100644 index 00000000..c68d91e4 Binary files /dev/null and b/src/public/data/pack/client/maps/m47_152 differ diff --git a/src/public/data/pack/client/maps/m47_153 b/src/public/data/pack/client/maps/m47_153 new file mode 100644 index 00000000..ce700a6c Binary files /dev/null and b/src/public/data/pack/client/maps/m47_153 differ diff --git a/src/public/data/pack/client/maps/m47_160 b/src/public/data/pack/client/maps/m47_160 new file mode 100644 index 00000000..4ed4f8ea Binary files /dev/null and b/src/public/data/pack/client/maps/m47_160 differ diff --git a/src/public/data/pack/client/maps/m47_161 b/src/public/data/pack/client/maps/m47_161 new file mode 100644 index 00000000..97e30c2b Binary files /dev/null and b/src/public/data/pack/client/maps/m47_161 differ diff --git a/src/public/data/pack/client/maps/m47_47 b/src/public/data/pack/client/maps/m47_47 new file mode 100644 index 00000000..f3be2c74 Binary files /dev/null and b/src/public/data/pack/client/maps/m47_47 differ diff --git a/src/public/data/pack/client/maps/m47_48 b/src/public/data/pack/client/maps/m47_48 new file mode 100644 index 00000000..8f3e944f Binary files /dev/null and b/src/public/data/pack/client/maps/m47_48 differ diff --git a/src/public/data/pack/client/maps/m47_49 b/src/public/data/pack/client/maps/m47_49 new file mode 100644 index 00000000..d4748a04 Binary files /dev/null and b/src/public/data/pack/client/maps/m47_49 differ diff --git a/src/public/data/pack/client/maps/m47_50 b/src/public/data/pack/client/maps/m47_50 new file mode 100644 index 00000000..bcac1ef2 Binary files /dev/null and b/src/public/data/pack/client/maps/m47_50 differ diff --git a/src/public/data/pack/client/maps/m47_51 b/src/public/data/pack/client/maps/m47_51 new file mode 100644 index 00000000..399232c2 Binary files /dev/null and b/src/public/data/pack/client/maps/m47_51 differ diff --git a/src/public/data/pack/client/maps/m47_52 b/src/public/data/pack/client/maps/m47_52 new file mode 100644 index 00000000..79bf4bd2 Binary files /dev/null and b/src/public/data/pack/client/maps/m47_52 differ diff --git a/src/public/data/pack/client/maps/m47_53 b/src/public/data/pack/client/maps/m47_53 new file mode 100644 index 00000000..5b6f7869 Binary files /dev/null and b/src/public/data/pack/client/maps/m47_53 differ diff --git a/src/public/data/pack/client/maps/m47_54 b/src/public/data/pack/client/maps/m47_54 new file mode 100644 index 00000000..fa4eed50 Binary files /dev/null and b/src/public/data/pack/client/maps/m47_54 differ diff --git a/src/public/data/pack/client/maps/m47_55 b/src/public/data/pack/client/maps/m47_55 new file mode 100644 index 00000000..f54c9391 Binary files /dev/null and b/src/public/data/pack/client/maps/m47_55 differ diff --git a/src/public/data/pack/client/maps/m47_56 b/src/public/data/pack/client/maps/m47_56 new file mode 100644 index 00000000..f5b9de08 Binary files /dev/null and b/src/public/data/pack/client/maps/m47_56 differ diff --git a/src/public/data/pack/client/maps/m47_57 b/src/public/data/pack/client/maps/m47_57 new file mode 100644 index 00000000..7c7551bd Binary files /dev/null and b/src/public/data/pack/client/maps/m47_57 differ diff --git a/src/public/data/pack/client/maps/m47_58 b/src/public/data/pack/client/maps/m47_58 new file mode 100644 index 00000000..2f7f1455 Binary files /dev/null and b/src/public/data/pack/client/maps/m47_58 differ diff --git a/src/public/data/pack/client/maps/m47_59 b/src/public/data/pack/client/maps/m47_59 new file mode 100644 index 00000000..af49b736 Binary files /dev/null and b/src/public/data/pack/client/maps/m47_59 differ diff --git a/src/public/data/pack/client/maps/m47_60 b/src/public/data/pack/client/maps/m47_60 new file mode 100644 index 00000000..f782f3ee Binary files /dev/null and b/src/public/data/pack/client/maps/m47_60 differ diff --git a/src/public/data/pack/client/maps/m47_61 b/src/public/data/pack/client/maps/m47_61 new file mode 100644 index 00000000..f11e3860 Binary files /dev/null and b/src/public/data/pack/client/maps/m47_61 differ diff --git a/src/public/data/pack/client/maps/m47_62 b/src/public/data/pack/client/maps/m47_62 new file mode 100644 index 00000000..22519ee9 Binary files /dev/null and b/src/public/data/pack/client/maps/m47_62 differ diff --git a/src/public/data/pack/client/maps/m47_75 b/src/public/data/pack/client/maps/m47_75 new file mode 100644 index 00000000..29851238 Binary files /dev/null and b/src/public/data/pack/client/maps/m47_75 differ diff --git a/src/public/data/pack/client/maps/m48_148 b/src/public/data/pack/client/maps/m48_148 new file mode 100644 index 00000000..9ad86d93 Binary files /dev/null and b/src/public/data/pack/client/maps/m48_148 differ diff --git a/src/public/data/pack/client/maps/m48_149 b/src/public/data/pack/client/maps/m48_149 new file mode 100644 index 00000000..6467af9a Binary files /dev/null and b/src/public/data/pack/client/maps/m48_149 differ diff --git a/src/public/data/pack/client/maps/m48_152 b/src/public/data/pack/client/maps/m48_152 new file mode 100644 index 00000000..2ec43568 Binary files /dev/null and b/src/public/data/pack/client/maps/m48_152 differ diff --git a/src/public/data/pack/client/maps/m48_153 b/src/public/data/pack/client/maps/m48_153 new file mode 100644 index 00000000..97f9e759 Binary files /dev/null and b/src/public/data/pack/client/maps/m48_153 differ diff --git a/src/public/data/pack/client/maps/m48_154 b/src/public/data/pack/client/maps/m48_154 new file mode 100644 index 00000000..e537c02e Binary files /dev/null and b/src/public/data/pack/client/maps/m48_154 differ diff --git a/src/public/data/pack/client/maps/m48_155 b/src/public/data/pack/client/maps/m48_155 new file mode 100644 index 00000000..32d72efc Binary files /dev/null and b/src/public/data/pack/client/maps/m48_155 differ diff --git a/src/public/data/pack/client/maps/m48_156 b/src/public/data/pack/client/maps/m48_156 new file mode 100644 index 00000000..ea957322 Binary files /dev/null and b/src/public/data/pack/client/maps/m48_156 differ diff --git a/src/public/data/pack/client/maps/m48_47 b/src/public/data/pack/client/maps/m48_47 new file mode 100644 index 00000000..a6dac018 Binary files /dev/null and b/src/public/data/pack/client/maps/m48_47 differ diff --git a/src/public/data/pack/client/maps/m48_48 b/src/public/data/pack/client/maps/m48_48 new file mode 100644 index 00000000..0422c8a1 Binary files /dev/null and b/src/public/data/pack/client/maps/m48_48 differ diff --git a/src/public/data/pack/client/maps/m48_49 b/src/public/data/pack/client/maps/m48_49 new file mode 100644 index 00000000..b8dce9c8 Binary files /dev/null and b/src/public/data/pack/client/maps/m48_49 differ diff --git a/src/public/data/pack/client/maps/m48_50 b/src/public/data/pack/client/maps/m48_50 new file mode 100644 index 00000000..a44551eb Binary files /dev/null and b/src/public/data/pack/client/maps/m48_50 differ diff --git a/src/public/data/pack/client/maps/m48_51 b/src/public/data/pack/client/maps/m48_51 new file mode 100644 index 00000000..34791174 Binary files /dev/null and b/src/public/data/pack/client/maps/m48_51 differ diff --git a/src/public/data/pack/client/maps/m48_52 b/src/public/data/pack/client/maps/m48_52 new file mode 100644 index 00000000..70aaf10e Binary files /dev/null and b/src/public/data/pack/client/maps/m48_52 differ diff --git a/src/public/data/pack/client/maps/m48_53 b/src/public/data/pack/client/maps/m48_53 new file mode 100644 index 00000000..3e7d73b3 Binary files /dev/null and b/src/public/data/pack/client/maps/m48_53 differ diff --git a/src/public/data/pack/client/maps/m48_54 b/src/public/data/pack/client/maps/m48_54 new file mode 100644 index 00000000..b64f72f3 Binary files /dev/null and b/src/public/data/pack/client/maps/m48_54 differ diff --git a/src/public/data/pack/client/maps/m48_55 b/src/public/data/pack/client/maps/m48_55 new file mode 100644 index 00000000..93356f9a Binary files /dev/null and b/src/public/data/pack/client/maps/m48_55 differ diff --git a/src/public/data/pack/client/maps/m48_56 b/src/public/data/pack/client/maps/m48_56 new file mode 100644 index 00000000..38d6d918 Binary files /dev/null and b/src/public/data/pack/client/maps/m48_56 differ diff --git a/src/public/data/pack/client/maps/m48_57 b/src/public/data/pack/client/maps/m48_57 new file mode 100644 index 00000000..4a074ea0 Binary files /dev/null and b/src/public/data/pack/client/maps/m48_57 differ diff --git a/src/public/data/pack/client/maps/m48_58 b/src/public/data/pack/client/maps/m48_58 new file mode 100644 index 00000000..fd52a9c3 Binary files /dev/null and b/src/public/data/pack/client/maps/m48_58 differ diff --git a/src/public/data/pack/client/maps/m48_59 b/src/public/data/pack/client/maps/m48_59 new file mode 100644 index 00000000..93309403 Binary files /dev/null and b/src/public/data/pack/client/maps/m48_59 differ diff --git a/src/public/data/pack/client/maps/m48_60 b/src/public/data/pack/client/maps/m48_60 new file mode 100644 index 00000000..31043f7e Binary files /dev/null and b/src/public/data/pack/client/maps/m48_60 differ diff --git a/src/public/data/pack/client/maps/m48_61 b/src/public/data/pack/client/maps/m48_61 new file mode 100644 index 00000000..13bf3f99 Binary files /dev/null and b/src/public/data/pack/client/maps/m48_61 differ diff --git a/src/public/data/pack/client/maps/m48_62 b/src/public/data/pack/client/maps/m48_62 new file mode 100644 index 00000000..464632e3 Binary files /dev/null and b/src/public/data/pack/client/maps/m48_62 differ diff --git a/src/public/data/pack/client/maps/m49_148 b/src/public/data/pack/client/maps/m49_148 new file mode 100644 index 00000000..0c24b8b8 Binary files /dev/null and b/src/public/data/pack/client/maps/m49_148 differ diff --git a/src/public/data/pack/client/maps/m49_149 b/src/public/data/pack/client/maps/m49_149 new file mode 100644 index 00000000..82988461 Binary files /dev/null and b/src/public/data/pack/client/maps/m49_149 differ diff --git a/src/public/data/pack/client/maps/m49_153 b/src/public/data/pack/client/maps/m49_153 new file mode 100644 index 00000000..feb25996 Binary files /dev/null and b/src/public/data/pack/client/maps/m49_153 differ diff --git a/src/public/data/pack/client/maps/m49_154 b/src/public/data/pack/client/maps/m49_154 new file mode 100644 index 00000000..828cef27 Binary files /dev/null and b/src/public/data/pack/client/maps/m49_154 differ diff --git a/src/public/data/pack/client/maps/m49_155 b/src/public/data/pack/client/maps/m49_155 new file mode 100644 index 00000000..2c38d40a Binary files /dev/null and b/src/public/data/pack/client/maps/m49_155 differ diff --git a/src/public/data/pack/client/maps/m49_156 b/src/public/data/pack/client/maps/m49_156 new file mode 100644 index 00000000..e7fd0a0d Binary files /dev/null and b/src/public/data/pack/client/maps/m49_156 differ diff --git a/src/public/data/pack/client/maps/m49_46 b/src/public/data/pack/client/maps/m49_46 new file mode 100644 index 00000000..a8f8de98 Binary files /dev/null and b/src/public/data/pack/client/maps/m49_46 differ diff --git a/src/public/data/pack/client/maps/m49_47 b/src/public/data/pack/client/maps/m49_47 new file mode 100644 index 00000000..2e6de628 Binary files /dev/null and b/src/public/data/pack/client/maps/m49_47 differ diff --git a/src/public/data/pack/client/maps/m49_48 b/src/public/data/pack/client/maps/m49_48 new file mode 100644 index 00000000..ee8b496e Binary files /dev/null and b/src/public/data/pack/client/maps/m49_48 differ diff --git a/src/public/data/pack/client/maps/m49_49 b/src/public/data/pack/client/maps/m49_49 new file mode 100644 index 00000000..7f0109a5 Binary files /dev/null and b/src/public/data/pack/client/maps/m49_49 differ diff --git a/src/public/data/pack/client/maps/m49_50 b/src/public/data/pack/client/maps/m49_50 new file mode 100644 index 00000000..f27078ad Binary files /dev/null and b/src/public/data/pack/client/maps/m49_50 differ diff --git a/src/public/data/pack/client/maps/m49_51 b/src/public/data/pack/client/maps/m49_51 new file mode 100644 index 00000000..e6acb452 Binary files /dev/null and b/src/public/data/pack/client/maps/m49_51 differ diff --git a/src/public/data/pack/client/maps/m49_52 b/src/public/data/pack/client/maps/m49_52 new file mode 100644 index 00000000..ceb0fb6e Binary files /dev/null and b/src/public/data/pack/client/maps/m49_52 differ diff --git a/src/public/data/pack/client/maps/m49_53 b/src/public/data/pack/client/maps/m49_53 new file mode 100644 index 00000000..52bd7847 Binary files /dev/null and b/src/public/data/pack/client/maps/m49_53 differ diff --git a/src/public/data/pack/client/maps/m49_54 b/src/public/data/pack/client/maps/m49_54 new file mode 100644 index 00000000..2ac98f9a Binary files /dev/null and b/src/public/data/pack/client/maps/m49_54 differ diff --git a/src/public/data/pack/client/maps/m49_55 b/src/public/data/pack/client/maps/m49_55 new file mode 100644 index 00000000..2e9e5fc2 Binary files /dev/null and b/src/public/data/pack/client/maps/m49_55 differ diff --git a/src/public/data/pack/client/maps/m49_56 b/src/public/data/pack/client/maps/m49_56 new file mode 100644 index 00000000..80379578 Binary files /dev/null and b/src/public/data/pack/client/maps/m49_56 differ diff --git a/src/public/data/pack/client/maps/m49_57 b/src/public/data/pack/client/maps/m49_57 new file mode 100644 index 00000000..f7d00aaa Binary files /dev/null and b/src/public/data/pack/client/maps/m49_57 differ diff --git a/src/public/data/pack/client/maps/m49_58 b/src/public/data/pack/client/maps/m49_58 new file mode 100644 index 00000000..0d8b4287 Binary files /dev/null and b/src/public/data/pack/client/maps/m49_58 differ diff --git a/src/public/data/pack/client/maps/m49_59 b/src/public/data/pack/client/maps/m49_59 new file mode 100644 index 00000000..0c92d64a Binary files /dev/null and b/src/public/data/pack/client/maps/m49_59 differ diff --git a/src/public/data/pack/client/maps/m49_60 b/src/public/data/pack/client/maps/m49_60 new file mode 100644 index 00000000..292f8705 Binary files /dev/null and b/src/public/data/pack/client/maps/m49_60 differ diff --git a/src/public/data/pack/client/maps/m49_61 b/src/public/data/pack/client/maps/m49_61 new file mode 100644 index 00000000..2695ae60 Binary files /dev/null and b/src/public/data/pack/client/maps/m49_61 differ diff --git a/src/public/data/pack/client/maps/m49_62 b/src/public/data/pack/client/maps/m49_62 new file mode 100644 index 00000000..464632e3 Binary files /dev/null and b/src/public/data/pack/client/maps/m49_62 differ diff --git a/src/public/data/pack/client/maps/m50_149 b/src/public/data/pack/client/maps/m50_149 new file mode 100644 index 00000000..d2261d8e Binary files /dev/null and b/src/public/data/pack/client/maps/m50_149 differ diff --git a/src/public/data/pack/client/maps/m50_150 b/src/public/data/pack/client/maps/m50_150 new file mode 100644 index 00000000..35b83888 Binary files /dev/null and b/src/public/data/pack/client/maps/m50_150 differ diff --git a/src/public/data/pack/client/maps/m50_152 b/src/public/data/pack/client/maps/m50_152 new file mode 100644 index 00000000..5878a2e6 Binary files /dev/null and b/src/public/data/pack/client/maps/m50_152 differ diff --git a/src/public/data/pack/client/maps/m50_153 b/src/public/data/pack/client/maps/m50_153 new file mode 100644 index 00000000..c4b15c18 Binary files /dev/null and b/src/public/data/pack/client/maps/m50_153 differ diff --git a/src/public/data/pack/client/maps/m50_154 b/src/public/data/pack/client/maps/m50_154 new file mode 100644 index 00000000..6fa4612f Binary files /dev/null and b/src/public/data/pack/client/maps/m50_154 differ diff --git a/src/public/data/pack/client/maps/m50_46 b/src/public/data/pack/client/maps/m50_46 new file mode 100644 index 00000000..dc4bdc1c Binary files /dev/null and b/src/public/data/pack/client/maps/m50_46 differ diff --git a/src/public/data/pack/client/maps/m50_47 b/src/public/data/pack/client/maps/m50_47 new file mode 100644 index 00000000..9daf9796 Binary files /dev/null and b/src/public/data/pack/client/maps/m50_47 differ diff --git a/src/public/data/pack/client/maps/m50_48 b/src/public/data/pack/client/maps/m50_48 new file mode 100644 index 00000000..02cf9fe3 Binary files /dev/null and b/src/public/data/pack/client/maps/m50_48 differ diff --git a/src/public/data/pack/client/maps/m50_49 b/src/public/data/pack/client/maps/m50_49 new file mode 100644 index 00000000..30031022 Binary files /dev/null and b/src/public/data/pack/client/maps/m50_49 differ diff --git a/src/public/data/pack/client/maps/m50_50 b/src/public/data/pack/client/maps/m50_50 new file mode 100644 index 00000000..f42488fe Binary files /dev/null and b/src/public/data/pack/client/maps/m50_50 differ diff --git a/src/public/data/pack/client/maps/m50_51 b/src/public/data/pack/client/maps/m50_51 new file mode 100644 index 00000000..54422458 Binary files /dev/null and b/src/public/data/pack/client/maps/m50_51 differ diff --git a/src/public/data/pack/client/maps/m50_52 b/src/public/data/pack/client/maps/m50_52 new file mode 100644 index 00000000..49df7f5a Binary files /dev/null and b/src/public/data/pack/client/maps/m50_52 differ diff --git a/src/public/data/pack/client/maps/m50_53 b/src/public/data/pack/client/maps/m50_53 new file mode 100644 index 00000000..625aee73 Binary files /dev/null and b/src/public/data/pack/client/maps/m50_53 differ diff --git a/src/public/data/pack/client/maps/m50_54 b/src/public/data/pack/client/maps/m50_54 new file mode 100644 index 00000000..5866233e Binary files /dev/null and b/src/public/data/pack/client/maps/m50_54 differ diff --git a/src/public/data/pack/client/maps/m50_55 b/src/public/data/pack/client/maps/m50_55 new file mode 100644 index 00000000..d3472f12 Binary files /dev/null and b/src/public/data/pack/client/maps/m50_55 differ diff --git a/src/public/data/pack/client/maps/m50_56 b/src/public/data/pack/client/maps/m50_56 new file mode 100644 index 00000000..76b826f3 Binary files /dev/null and b/src/public/data/pack/client/maps/m50_56 differ diff --git a/src/public/data/pack/client/maps/m50_57 b/src/public/data/pack/client/maps/m50_57 new file mode 100644 index 00000000..2ea7ab3c Binary files /dev/null and b/src/public/data/pack/client/maps/m50_57 differ diff --git a/src/public/data/pack/client/maps/m50_58 b/src/public/data/pack/client/maps/m50_58 new file mode 100644 index 00000000..308311b3 Binary files /dev/null and b/src/public/data/pack/client/maps/m50_58 differ diff --git a/src/public/data/pack/client/maps/m50_59 b/src/public/data/pack/client/maps/m50_59 new file mode 100644 index 00000000..919d0908 Binary files /dev/null and b/src/public/data/pack/client/maps/m50_59 differ diff --git a/src/public/data/pack/client/maps/m50_60 b/src/public/data/pack/client/maps/m50_60 new file mode 100644 index 00000000..57e9cd7c Binary files /dev/null and b/src/public/data/pack/client/maps/m50_60 differ diff --git a/src/public/data/pack/client/maps/m50_61 b/src/public/data/pack/client/maps/m50_61 new file mode 100644 index 00000000..bbda1570 Binary files /dev/null and b/src/public/data/pack/client/maps/m50_61 differ diff --git a/src/public/data/pack/client/maps/m50_62 b/src/public/data/pack/client/maps/m50_62 new file mode 100644 index 00000000..464632e3 Binary files /dev/null and b/src/public/data/pack/client/maps/m50_62 differ diff --git a/src/public/data/pack/client/maps/m51_147 b/src/public/data/pack/client/maps/m51_147 new file mode 100644 index 00000000..6c92e7e9 Binary files /dev/null and b/src/public/data/pack/client/maps/m51_147 differ diff --git a/src/public/data/pack/client/maps/m51_154 b/src/public/data/pack/client/maps/m51_154 new file mode 100644 index 00000000..4442f0f1 Binary files /dev/null and b/src/public/data/pack/client/maps/m51_154 differ diff --git a/src/public/data/pack/client/maps/m51_46 b/src/public/data/pack/client/maps/m51_46 new file mode 100644 index 00000000..46062d89 Binary files /dev/null and b/src/public/data/pack/client/maps/m51_46 differ diff --git a/src/public/data/pack/client/maps/m51_47 b/src/public/data/pack/client/maps/m51_47 new file mode 100644 index 00000000..47377faf Binary files /dev/null and b/src/public/data/pack/client/maps/m51_47 differ diff --git a/src/public/data/pack/client/maps/m51_48 b/src/public/data/pack/client/maps/m51_48 new file mode 100644 index 00000000..63e86806 Binary files /dev/null and b/src/public/data/pack/client/maps/m51_48 differ diff --git a/src/public/data/pack/client/maps/m51_49 b/src/public/data/pack/client/maps/m51_49 new file mode 100644 index 00000000..ece0d9c2 Binary files /dev/null and b/src/public/data/pack/client/maps/m51_49 differ diff --git a/src/public/data/pack/client/maps/m51_50 b/src/public/data/pack/client/maps/m51_50 new file mode 100644 index 00000000..9a9ce93b Binary files /dev/null and b/src/public/data/pack/client/maps/m51_50 differ diff --git a/src/public/data/pack/client/maps/m51_51 b/src/public/data/pack/client/maps/m51_51 new file mode 100644 index 00000000..05c91c79 Binary files /dev/null and b/src/public/data/pack/client/maps/m51_51 differ diff --git a/src/public/data/pack/client/maps/m51_52 b/src/public/data/pack/client/maps/m51_52 new file mode 100644 index 00000000..fcc51601 Binary files /dev/null and b/src/public/data/pack/client/maps/m51_52 differ diff --git a/src/public/data/pack/client/maps/m51_53 b/src/public/data/pack/client/maps/m51_53 new file mode 100644 index 00000000..3be2d506 Binary files /dev/null and b/src/public/data/pack/client/maps/m51_53 differ diff --git a/src/public/data/pack/client/maps/m51_54 b/src/public/data/pack/client/maps/m51_54 new file mode 100644 index 00000000..30d69339 Binary files /dev/null and b/src/public/data/pack/client/maps/m51_54 differ diff --git a/src/public/data/pack/client/maps/m51_55 b/src/public/data/pack/client/maps/m51_55 new file mode 100644 index 00000000..2aa837b2 Binary files /dev/null and b/src/public/data/pack/client/maps/m51_55 differ diff --git a/src/public/data/pack/client/maps/m51_56 b/src/public/data/pack/client/maps/m51_56 new file mode 100644 index 00000000..80a4ca1f Binary files /dev/null and b/src/public/data/pack/client/maps/m51_56 differ diff --git a/src/public/data/pack/client/maps/m51_57 b/src/public/data/pack/client/maps/m51_57 new file mode 100644 index 00000000..4439cb82 Binary files /dev/null and b/src/public/data/pack/client/maps/m51_57 differ diff --git a/src/public/data/pack/client/maps/m51_58 b/src/public/data/pack/client/maps/m51_58 new file mode 100644 index 00000000..4346cfec Binary files /dev/null and b/src/public/data/pack/client/maps/m51_58 differ diff --git a/src/public/data/pack/client/maps/m51_59 b/src/public/data/pack/client/maps/m51_59 new file mode 100644 index 00000000..166f2cc2 Binary files /dev/null and b/src/public/data/pack/client/maps/m51_59 differ diff --git a/src/public/data/pack/client/maps/m51_60 b/src/public/data/pack/client/maps/m51_60 new file mode 100644 index 00000000..c3eff0f8 Binary files /dev/null and b/src/public/data/pack/client/maps/m51_60 differ diff --git a/src/public/data/pack/client/maps/m51_61 b/src/public/data/pack/client/maps/m51_61 new file mode 100644 index 00000000..28956d7e Binary files /dev/null and b/src/public/data/pack/client/maps/m51_61 differ diff --git a/src/public/data/pack/client/maps/m51_62 b/src/public/data/pack/client/maps/m51_62 new file mode 100644 index 00000000..464632e3 Binary files /dev/null and b/src/public/data/pack/client/maps/m51_62 differ diff --git a/src/public/data/pack/client/maps/m52_152 b/src/public/data/pack/client/maps/m52_152 new file mode 100644 index 00000000..7c9d5dc0 Binary files /dev/null and b/src/public/data/pack/client/maps/m52_152 differ diff --git a/src/public/data/pack/client/maps/m52_153 b/src/public/data/pack/client/maps/m52_153 new file mode 100644 index 00000000..f9e17b8a Binary files /dev/null and b/src/public/data/pack/client/maps/m52_153 differ diff --git a/src/public/data/pack/client/maps/m52_154 b/src/public/data/pack/client/maps/m52_154 new file mode 100644 index 00000000..174c4c2e Binary files /dev/null and b/src/public/data/pack/client/maps/m52_154 differ diff --git a/src/public/data/pack/client/maps/m52_46 b/src/public/data/pack/client/maps/m52_46 new file mode 100644 index 00000000..130e2c56 Binary files /dev/null and b/src/public/data/pack/client/maps/m52_46 differ diff --git a/src/public/data/pack/client/maps/m52_47 b/src/public/data/pack/client/maps/m52_47 new file mode 100644 index 00000000..a43b70ec Binary files /dev/null and b/src/public/data/pack/client/maps/m52_47 differ diff --git a/src/public/data/pack/client/maps/m52_48 b/src/public/data/pack/client/maps/m52_48 new file mode 100644 index 00000000..a49f4465 Binary files /dev/null and b/src/public/data/pack/client/maps/m52_48 differ diff --git a/src/public/data/pack/client/maps/m52_49 b/src/public/data/pack/client/maps/m52_49 new file mode 100644 index 00000000..91f713ed Binary files /dev/null and b/src/public/data/pack/client/maps/m52_49 differ diff --git a/src/public/data/pack/client/maps/m52_50 b/src/public/data/pack/client/maps/m52_50 new file mode 100644 index 00000000..6fdeb646 Binary files /dev/null and b/src/public/data/pack/client/maps/m52_50 differ diff --git a/src/public/data/pack/client/maps/m52_51 b/src/public/data/pack/client/maps/m52_51 new file mode 100644 index 00000000..ebae3eca Binary files /dev/null and b/src/public/data/pack/client/maps/m52_51 differ diff --git a/src/public/data/pack/client/maps/m52_52 b/src/public/data/pack/client/maps/m52_52 new file mode 100644 index 00000000..5549ca49 Binary files /dev/null and b/src/public/data/pack/client/maps/m52_52 differ diff --git a/src/public/data/pack/client/maps/m52_53 b/src/public/data/pack/client/maps/m52_53 new file mode 100644 index 00000000..85ca1e59 Binary files /dev/null and b/src/public/data/pack/client/maps/m52_53 differ diff --git a/src/public/data/pack/client/maps/m52_54 b/src/public/data/pack/client/maps/m52_54 new file mode 100644 index 00000000..5532d8b6 Binary files /dev/null and b/src/public/data/pack/client/maps/m52_54 differ diff --git a/src/public/data/pack/client/maps/m52_55 b/src/public/data/pack/client/maps/m52_55 new file mode 100644 index 00000000..04154332 Binary files /dev/null and b/src/public/data/pack/client/maps/m52_55 differ diff --git a/src/public/data/pack/client/maps/m52_56 b/src/public/data/pack/client/maps/m52_56 new file mode 100644 index 00000000..332bf02b Binary files /dev/null and b/src/public/data/pack/client/maps/m52_56 differ diff --git a/src/public/data/pack/client/maps/m52_57 b/src/public/data/pack/client/maps/m52_57 new file mode 100644 index 00000000..5624d82c Binary files /dev/null and b/src/public/data/pack/client/maps/m52_57 differ diff --git a/src/public/data/pack/client/maps/m52_58 b/src/public/data/pack/client/maps/m52_58 new file mode 100644 index 00000000..5b440fdb Binary files /dev/null and b/src/public/data/pack/client/maps/m52_58 differ diff --git a/src/public/data/pack/client/maps/m52_59 b/src/public/data/pack/client/maps/m52_59 new file mode 100644 index 00000000..a6dba9e9 Binary files /dev/null and b/src/public/data/pack/client/maps/m52_59 differ diff --git a/src/public/data/pack/client/maps/m52_60 b/src/public/data/pack/client/maps/m52_60 new file mode 100644 index 00000000..9ac66618 Binary files /dev/null and b/src/public/data/pack/client/maps/m52_60 differ diff --git a/src/public/data/pack/client/maps/m52_61 b/src/public/data/pack/client/maps/m52_61 new file mode 100644 index 00000000..f7dfaac5 Binary files /dev/null and b/src/public/data/pack/client/maps/m52_61 differ diff --git a/src/public/data/pack/client/maps/m52_62 b/src/public/data/pack/client/maps/m52_62 new file mode 100644 index 00000000..bc3746c0 Binary files /dev/null and b/src/public/data/pack/client/maps/m52_62 differ diff --git a/src/public/data/pack/client/maps/m53_49 b/src/public/data/pack/client/maps/m53_49 new file mode 100644 index 00000000..4ffcb414 Binary files /dev/null and b/src/public/data/pack/client/maps/m53_49 differ diff --git a/src/public/data/pack/client/maps/m53_50 b/src/public/data/pack/client/maps/m53_50 new file mode 100644 index 00000000..78f91bc4 Binary files /dev/null and b/src/public/data/pack/client/maps/m53_50 differ diff --git a/src/public/data/pack/client/maps/m53_51 b/src/public/data/pack/client/maps/m53_51 new file mode 100644 index 00000000..e622ff7e Binary files /dev/null and b/src/public/data/pack/client/maps/m53_51 differ diff --git a/src/public/data/pack/client/maps/m53_52 b/src/public/data/pack/client/maps/m53_52 new file mode 100644 index 00000000..b2825de1 Binary files /dev/null and b/src/public/data/pack/client/maps/m53_52 differ diff --git a/src/public/data/pack/client/maps/m53_53 b/src/public/data/pack/client/maps/m53_53 new file mode 100644 index 00000000..9fb146d9 Binary files /dev/null and b/src/public/data/pack/client/maps/m53_53 differ diff --git a/src/public/data/pack/client/media b/src/public/data/pack/client/media new file mode 100644 index 00000000..e88e2f73 Binary files /dev/null and b/src/public/data/pack/client/media differ diff --git a/src/public/data/pack/client/models b/src/public/data/pack/client/models new file mode 100644 index 00000000..4e0962e6 Binary files /dev/null and b/src/public/data/pack/client/models differ diff --git a/src/public/data/pack/client/songs/adventure.mid b/src/public/data/pack/client/songs/adventure.mid new file mode 100644 index 00000000..2d2c994b Binary files /dev/null and b/src/public/data/pack/client/songs/adventure.mid differ diff --git a/src/public/data/pack/client/songs/al_kharid.mid b/src/public/data/pack/client/songs/al_kharid.mid new file mode 100644 index 00000000..fafabd49 Binary files /dev/null and b/src/public/data/pack/client/songs/al_kharid.mid differ diff --git a/src/public/data/pack/client/songs/alone.mid b/src/public/data/pack/client/songs/alone.mid new file mode 100644 index 00000000..bf1cfb56 Binary files /dev/null and b/src/public/data/pack/client/songs/alone.mid differ diff --git a/src/public/data/pack/client/songs/ambience_2.mid b/src/public/data/pack/client/songs/ambience_2.mid new file mode 100644 index 00000000..fbf5b368 Binary files /dev/null and b/src/public/data/pack/client/songs/ambience_2.mid differ diff --git a/src/public/data/pack/client/songs/ambience_3.mid b/src/public/data/pack/client/songs/ambience_3.mid new file mode 100644 index 00000000..5759c4f0 Binary files /dev/null and b/src/public/data/pack/client/songs/ambience_3.mid differ diff --git a/src/public/data/pack/client/songs/ambience_4.mid b/src/public/data/pack/client/songs/ambience_4.mid new file mode 100644 index 00000000..2a87cc9b Binary files /dev/null and b/src/public/data/pack/client/songs/ambience_4.mid differ diff --git a/src/public/data/pack/client/songs/ambient_jungle.mid b/src/public/data/pack/client/songs/ambient_jungle.mid new file mode 100644 index 00000000..751f5658 Binary files /dev/null and b/src/public/data/pack/client/songs/ambient_jungle.mid differ diff --git a/src/public/data/pack/client/songs/arabian.mid b/src/public/data/pack/client/songs/arabian.mid new file mode 100644 index 00000000..f07cd76a Binary files /dev/null and b/src/public/data/pack/client/songs/arabian.mid differ diff --git a/src/public/data/pack/client/songs/arabian2.mid b/src/public/data/pack/client/songs/arabian2.mid new file mode 100644 index 00000000..f4f2c31c Binary files /dev/null and b/src/public/data/pack/client/songs/arabian2.mid differ diff --git a/src/public/data/pack/client/songs/arabian3.mid b/src/public/data/pack/client/songs/arabian3.mid new file mode 100644 index 00000000..dfcac745 Binary files /dev/null and b/src/public/data/pack/client/songs/arabian3.mid differ diff --git a/src/public/data/pack/client/songs/arabique.mid b/src/public/data/pack/client/songs/arabique.mid new file mode 100644 index 00000000..c5b99ea3 Binary files /dev/null and b/src/public/data/pack/client/songs/arabique.mid differ diff --git a/src/public/data/pack/client/songs/army_of_darkness.mid b/src/public/data/pack/client/songs/army_of_darkness.mid new file mode 100644 index 00000000..ebbd9c4b Binary files /dev/null and b/src/public/data/pack/client/songs/army_of_darkness.mid differ diff --git a/src/public/data/pack/client/songs/arrival.mid b/src/public/data/pack/client/songs/arrival.mid new file mode 100644 index 00000000..12e6f0a4 Binary files /dev/null and b/src/public/data/pack/client/songs/arrival.mid differ diff --git a/src/public/data/pack/client/songs/attack1.mid b/src/public/data/pack/client/songs/attack1.mid new file mode 100644 index 00000000..8aeddf0f Binary files /dev/null and b/src/public/data/pack/client/songs/attack1.mid differ diff --git a/src/public/data/pack/client/songs/attack2.mid b/src/public/data/pack/client/songs/attack2.mid new file mode 100644 index 00000000..f7ba4d50 Binary files /dev/null and b/src/public/data/pack/client/songs/attack2.mid differ diff --git a/src/public/data/pack/client/songs/attack3.mid b/src/public/data/pack/client/songs/attack3.mid new file mode 100644 index 00000000..94a49a9a Binary files /dev/null and b/src/public/data/pack/client/songs/attack3.mid differ diff --git a/src/public/data/pack/client/songs/attack4.mid b/src/public/data/pack/client/songs/attack4.mid new file mode 100644 index 00000000..f37ae069 Binary files /dev/null and b/src/public/data/pack/client/songs/attack4.mid differ diff --git a/src/public/data/pack/client/songs/attack5.mid b/src/public/data/pack/client/songs/attack5.mid new file mode 100644 index 00000000..6f50d4a7 Binary files /dev/null and b/src/public/data/pack/client/songs/attack5.mid differ diff --git a/src/public/data/pack/client/songs/attack6.mid b/src/public/data/pack/client/songs/attack6.mid new file mode 100644 index 00000000..5e19037c Binary files /dev/null and b/src/public/data/pack/client/songs/attack6.mid differ diff --git a/src/public/data/pack/client/songs/attention.mid b/src/public/data/pack/client/songs/attention.mid new file mode 100644 index 00000000..45d5c0c8 Binary files /dev/null and b/src/public/data/pack/client/songs/attention.mid differ diff --git a/src/public/data/pack/client/songs/autumn_voyage.mid b/src/public/data/pack/client/songs/autumn_voyage.mid new file mode 100644 index 00000000..62305283 Binary files /dev/null and b/src/public/data/pack/client/songs/autumn_voyage.mid differ diff --git a/src/public/data/pack/client/songs/background2.mid b/src/public/data/pack/client/songs/background2.mid new file mode 100644 index 00000000..43ea7ae7 Binary files /dev/null and b/src/public/data/pack/client/songs/background2.mid differ diff --git a/src/public/data/pack/client/songs/ballad_of_enchantment.mid b/src/public/data/pack/client/songs/ballad_of_enchantment.mid new file mode 100644 index 00000000..3f2abaac Binary files /dev/null and b/src/public/data/pack/client/songs/ballad_of_enchantment.mid differ diff --git a/src/public/data/pack/client/songs/baroque.mid b/src/public/data/pack/client/songs/baroque.mid new file mode 100644 index 00000000..080077f9 Binary files /dev/null and b/src/public/data/pack/client/songs/baroque.mid differ diff --git a/src/public/data/pack/client/songs/beyond.mid b/src/public/data/pack/client/songs/beyond.mid new file mode 100644 index 00000000..deecfd64 Binary files /dev/null and b/src/public/data/pack/client/songs/beyond.mid differ diff --git a/src/public/data/pack/client/songs/big_chords.mid b/src/public/data/pack/client/songs/big_chords.mid new file mode 100644 index 00000000..043eb818 Binary files /dev/null and b/src/public/data/pack/client/songs/big_chords.mid differ diff --git a/src/public/data/pack/client/songs/book_of_spells.mid b/src/public/data/pack/client/songs/book_of_spells.mid new file mode 100644 index 00000000..6246ac26 Binary files /dev/null and b/src/public/data/pack/client/songs/book_of_spells.mid differ diff --git a/src/public/data/pack/client/songs/camelot.mid b/src/public/data/pack/client/songs/camelot.mid new file mode 100644 index 00000000..e43f7dfb Binary files /dev/null and b/src/public/data/pack/client/songs/camelot.mid differ diff --git a/src/public/data/pack/client/songs/cave_background1.mid b/src/public/data/pack/client/songs/cave_background1.mid new file mode 100644 index 00000000..8d627a37 Binary files /dev/null and b/src/public/data/pack/client/songs/cave_background1.mid differ diff --git a/src/public/data/pack/client/songs/cavern.mid b/src/public/data/pack/client/songs/cavern.mid new file mode 100644 index 00000000..0dd484a4 Binary files /dev/null and b/src/public/data/pack/client/songs/cavern.mid differ diff --git a/src/public/data/pack/client/songs/cellar_song1.mid b/src/public/data/pack/client/songs/cellar_song1.mid new file mode 100644 index 00000000..ab100270 Binary files /dev/null and b/src/public/data/pack/client/songs/cellar_song1.mid differ diff --git a/src/public/data/pack/client/songs/chain_of_command.mid b/src/public/data/pack/client/songs/chain_of_command.mid new file mode 100644 index 00000000..c926015b Binary files /dev/null and b/src/public/data/pack/client/songs/chain_of_command.mid differ diff --git a/src/public/data/pack/client/songs/chompy_hunt.mid b/src/public/data/pack/client/songs/chompy_hunt.mid new file mode 100644 index 00000000..a0aa518d Binary files /dev/null and b/src/public/data/pack/client/songs/chompy_hunt.mid differ diff --git a/src/public/data/pack/client/songs/close_quarters.mid b/src/public/data/pack/client/songs/close_quarters.mid new file mode 100644 index 00000000..a0eb735c Binary files /dev/null and b/src/public/data/pack/client/songs/close_quarters.mid differ diff --git a/src/public/data/pack/client/songs/crystal_cave.mid b/src/public/data/pack/client/songs/crystal_cave.mid new file mode 100644 index 00000000..60ea6117 Binary files /dev/null and b/src/public/data/pack/client/songs/crystal_cave.mid differ diff --git a/src/public/data/pack/client/songs/crystal_sword.mid b/src/public/data/pack/client/songs/crystal_sword.mid new file mode 100644 index 00000000..998d9fbc Binary files /dev/null and b/src/public/data/pack/client/songs/crystal_sword.mid differ diff --git a/src/public/data/pack/client/songs/cursed.mid b/src/public/data/pack/client/songs/cursed.mid new file mode 100644 index 00000000..de7d9964 Binary files /dev/null and b/src/public/data/pack/client/songs/cursed.mid differ diff --git a/src/public/data/pack/client/songs/dangerous.mid b/src/public/data/pack/client/songs/dangerous.mid new file mode 100644 index 00000000..88292db6 Binary files /dev/null and b/src/public/data/pack/client/songs/dangerous.mid differ diff --git a/src/public/data/pack/client/songs/dark2.mid b/src/public/data/pack/client/songs/dark2.mid new file mode 100644 index 00000000..6f50d8a8 Binary files /dev/null and b/src/public/data/pack/client/songs/dark2.mid differ diff --git a/src/public/data/pack/client/songs/deep_wildy.mid b/src/public/data/pack/client/songs/deep_wildy.mid new file mode 100644 index 00000000..16e0e445 Binary files /dev/null and b/src/public/data/pack/client/songs/deep_wildy.mid differ diff --git a/src/public/data/pack/client/songs/desert_voyage.mid b/src/public/data/pack/client/songs/desert_voyage.mid new file mode 100644 index 00000000..fc43c165 Binary files /dev/null and b/src/public/data/pack/client/songs/desert_voyage.mid differ diff --git a/src/public/data/pack/client/songs/doorways.mid b/src/public/data/pack/client/songs/doorways.mid new file mode 100644 index 00000000..2217bf94 Binary files /dev/null and b/src/public/data/pack/client/songs/doorways.mid differ diff --git a/src/public/data/pack/client/songs/dream1.mid b/src/public/data/pack/client/songs/dream1.mid new file mode 100644 index 00000000..882d4e23 Binary files /dev/null and b/src/public/data/pack/client/songs/dream1.mid differ diff --git a/src/public/data/pack/client/songs/duel_arena.mid b/src/public/data/pack/client/songs/duel_arena.mid new file mode 100644 index 00000000..f4d1abfe Binary files /dev/null and b/src/public/data/pack/client/songs/duel_arena.mid differ diff --git a/src/public/data/pack/client/songs/dunjun.mid b/src/public/data/pack/client/songs/dunjun.mid new file mode 100644 index 00000000..710309c2 Binary files /dev/null and b/src/public/data/pack/client/songs/dunjun.mid differ diff --git a/src/public/data/pack/client/songs/egypt.mid b/src/public/data/pack/client/songs/egypt.mid new file mode 100644 index 00000000..3b17e334 Binary files /dev/null and b/src/public/data/pack/client/songs/egypt.mid differ diff --git a/src/public/data/pack/client/songs/emotion.mid b/src/public/data/pack/client/songs/emotion.mid new file mode 100644 index 00000000..94a3b5f1 Binary files /dev/null and b/src/public/data/pack/client/songs/emotion.mid differ diff --git a/src/public/data/pack/client/songs/emperor.mid b/src/public/data/pack/client/songs/emperor.mid new file mode 100644 index 00000000..fdfa9797 Binary files /dev/null and b/src/public/data/pack/client/songs/emperor.mid differ diff --git a/src/public/data/pack/client/songs/escape.mid b/src/public/data/pack/client/songs/escape.mid new file mode 100644 index 00000000..fb00fc88 Binary files /dev/null and b/src/public/data/pack/client/songs/escape.mid differ diff --git a/src/public/data/pack/client/songs/expanse.mid b/src/public/data/pack/client/songs/expanse.mid new file mode 100644 index 00000000..99702f6a Binary files /dev/null and b/src/public/data/pack/client/songs/expanse.mid differ diff --git a/src/public/data/pack/client/songs/expecting.mid b/src/public/data/pack/client/songs/expecting.mid new file mode 100644 index 00000000..4dadb2dd Binary files /dev/null and b/src/public/data/pack/client/songs/expecting.mid differ diff --git a/src/public/data/pack/client/songs/expedition.mid b/src/public/data/pack/client/songs/expedition.mid new file mode 100644 index 00000000..9254820f Binary files /dev/null and b/src/public/data/pack/client/songs/expedition.mid differ diff --git a/src/public/data/pack/client/songs/fade_test.mid b/src/public/data/pack/client/songs/fade_test.mid new file mode 100644 index 00000000..901c5007 Binary files /dev/null and b/src/public/data/pack/client/songs/fade_test.mid differ diff --git a/src/public/data/pack/client/songs/faerie.mid b/src/public/data/pack/client/songs/faerie.mid new file mode 100644 index 00000000..20fd529f Binary files /dev/null and b/src/public/data/pack/client/songs/faerie.mid differ diff --git a/src/public/data/pack/client/songs/fanfare.mid b/src/public/data/pack/client/songs/fanfare.mid new file mode 100644 index 00000000..24ac9d60 Binary files /dev/null and b/src/public/data/pack/client/songs/fanfare.mid differ diff --git a/src/public/data/pack/client/songs/fanfare2.mid b/src/public/data/pack/client/songs/fanfare2.mid new file mode 100644 index 00000000..3ef24e38 Binary files /dev/null and b/src/public/data/pack/client/songs/fanfare2.mid differ diff --git a/src/public/data/pack/client/songs/fanfare3.mid b/src/public/data/pack/client/songs/fanfare3.mid new file mode 100644 index 00000000..2fb67bdb Binary files /dev/null and b/src/public/data/pack/client/songs/fanfare3.mid differ diff --git a/src/public/data/pack/client/songs/fishing.mid b/src/public/data/pack/client/songs/fishing.mid new file mode 100644 index 00000000..aa433d89 Binary files /dev/null and b/src/public/data/pack/client/songs/fishing.mid differ diff --git a/src/public/data/pack/client/songs/flute_salad.mid b/src/public/data/pack/client/songs/flute_salad.mid new file mode 100644 index 00000000..87c7a57c Binary files /dev/null and b/src/public/data/pack/client/songs/flute_salad.mid differ diff --git a/src/public/data/pack/client/songs/forbidden.mid b/src/public/data/pack/client/songs/forbidden.mid new file mode 100644 index 00000000..acf87e53 Binary files /dev/null and b/src/public/data/pack/client/songs/forbidden.mid differ diff --git a/src/public/data/pack/client/songs/forever.mid b/src/public/data/pack/client/songs/forever.mid new file mode 100644 index 00000000..13f05925 Binary files /dev/null and b/src/public/data/pack/client/songs/forever.mid differ diff --git a/src/public/data/pack/client/songs/game_intro_1.mid b/src/public/data/pack/client/songs/game_intro_1.mid new file mode 100644 index 00000000..5bfaa64e Binary files /dev/null and b/src/public/data/pack/client/songs/game_intro_1.mid differ diff --git a/src/public/data/pack/client/songs/gaol.mid b/src/public/data/pack/client/songs/gaol.mid new file mode 100644 index 00000000..fef40884 Binary files /dev/null and b/src/public/data/pack/client/songs/gaol.mid differ diff --git a/src/public/data/pack/client/songs/garden.mid b/src/public/data/pack/client/songs/garden.mid new file mode 100644 index 00000000..a4e38a5d Binary files /dev/null and b/src/public/data/pack/client/songs/garden.mid differ diff --git a/src/public/data/pack/client/songs/gnome.mid b/src/public/data/pack/client/songs/gnome.mid new file mode 100644 index 00000000..7f584dc5 Binary files /dev/null and b/src/public/data/pack/client/songs/gnome.mid differ diff --git a/src/public/data/pack/client/songs/gnome_king.mid b/src/public/data/pack/client/songs/gnome_king.mid new file mode 100644 index 00000000..72181945 Binary files /dev/null and b/src/public/data/pack/client/songs/gnome_king.mid differ diff --git a/src/public/data/pack/client/songs/gnome_theme.mid b/src/public/data/pack/client/songs/gnome_theme.mid new file mode 100644 index 00000000..c61bcd82 Binary files /dev/null and b/src/public/data/pack/client/songs/gnome_theme.mid differ diff --git a/src/public/data/pack/client/songs/gnome_village.mid b/src/public/data/pack/client/songs/gnome_village.mid new file mode 100644 index 00000000..d0c4c04f Binary files /dev/null and b/src/public/data/pack/client/songs/gnome_village.mid differ diff --git a/src/public/data/pack/client/songs/gnome_village2.mid b/src/public/data/pack/client/songs/gnome_village2.mid new file mode 100644 index 00000000..3f2f704b Binary files /dev/null and b/src/public/data/pack/client/songs/gnome_village2.mid differ diff --git a/src/public/data/pack/client/songs/gnomeball.mid b/src/public/data/pack/client/songs/gnomeball.mid new file mode 100644 index 00000000..40a02622 Binary files /dev/null and b/src/public/data/pack/client/songs/gnomeball.mid differ diff --git a/src/public/data/pack/client/songs/greatness.mid b/src/public/data/pack/client/songs/greatness.mid new file mode 100644 index 00000000..178367bd Binary files /dev/null and b/src/public/data/pack/client/songs/greatness.mid differ diff --git a/src/public/data/pack/client/songs/grumpy.mid b/src/public/data/pack/client/songs/grumpy.mid new file mode 100644 index 00000000..f4f915d6 Binary files /dev/null and b/src/public/data/pack/client/songs/grumpy.mid differ diff --git a/src/public/data/pack/client/songs/harmony.mid b/src/public/data/pack/client/songs/harmony.mid new file mode 100644 index 00000000..168bdd2b Binary files /dev/null and b/src/public/data/pack/client/songs/harmony.mid differ diff --git a/src/public/data/pack/client/songs/harmony2.mid b/src/public/data/pack/client/songs/harmony2.mid new file mode 100644 index 00000000..da3232ea Binary files /dev/null and b/src/public/data/pack/client/songs/harmony2.mid differ diff --git a/src/public/data/pack/client/songs/heart_and_mind.mid b/src/public/data/pack/client/songs/heart_and_mind.mid new file mode 100644 index 00000000..fb5e8ad1 Binary files /dev/null and b/src/public/data/pack/client/songs/heart_and_mind.mid differ diff --git a/src/public/data/pack/client/songs/high_seas.mid b/src/public/data/pack/client/songs/high_seas.mid new file mode 100644 index 00000000..76feaf71 Binary files /dev/null and b/src/public/data/pack/client/songs/high_seas.mid differ diff --git a/src/public/data/pack/client/songs/horizon.mid b/src/public/data/pack/client/songs/horizon.mid new file mode 100644 index 00000000..24824966 Binary files /dev/null and b/src/public/data/pack/client/songs/horizon.mid differ diff --git a/src/public/data/pack/client/songs/iban.mid b/src/public/data/pack/client/songs/iban.mid new file mode 100644 index 00000000..0f4bb7c3 Binary files /dev/null and b/src/public/data/pack/client/songs/iban.mid differ diff --git a/src/public/data/pack/client/songs/ice_melody.mid b/src/public/data/pack/client/songs/ice_melody.mid new file mode 100644 index 00000000..859fa720 Binary files /dev/null and b/src/public/data/pack/client/songs/ice_melody.mid differ diff --git a/src/public/data/pack/client/songs/in_the_manor.mid b/src/public/data/pack/client/songs/in_the_manor.mid new file mode 100644 index 00000000..d15f88d2 Binary files /dev/null and b/src/public/data/pack/client/songs/in_the_manor.mid differ diff --git a/src/public/data/pack/client/songs/inspiration.mid b/src/public/data/pack/client/songs/inspiration.mid new file mode 100644 index 00000000..e4348f85 Binary files /dev/null and b/src/public/data/pack/client/songs/inspiration.mid differ diff --git a/src/public/data/pack/client/songs/intrepid.mid b/src/public/data/pack/client/songs/intrepid.mid new file mode 100644 index 00000000..da7c3d74 Binary files /dev/null and b/src/public/data/pack/client/songs/intrepid.mid differ diff --git a/src/public/data/pack/client/songs/jolly-r.mid b/src/public/data/pack/client/songs/jolly-r.mid new file mode 100644 index 00000000..3870b770 Binary files /dev/null and b/src/public/data/pack/client/songs/jolly-r.mid differ diff --git a/src/public/data/pack/client/songs/jungle_island.mid b/src/public/data/pack/client/songs/jungle_island.mid new file mode 100644 index 00000000..bcdcbc1e Binary files /dev/null and b/src/public/data/pack/client/songs/jungle_island.mid differ diff --git a/src/public/data/pack/client/songs/jungly1.mid b/src/public/data/pack/client/songs/jungly1.mid new file mode 100644 index 00000000..a19f808f Binary files /dev/null and b/src/public/data/pack/client/songs/jungly1.mid differ diff --git a/src/public/data/pack/client/songs/jungly2.mid b/src/public/data/pack/client/songs/jungly2.mid new file mode 100644 index 00000000..ca83aab5 Binary files /dev/null and b/src/public/data/pack/client/songs/jungly2.mid differ diff --git a/src/public/data/pack/client/songs/jungly3.mid b/src/public/data/pack/client/songs/jungly3.mid new file mode 100644 index 00000000..b4dc8eb8 Binary files /dev/null and b/src/public/data/pack/client/songs/jungly3.mid differ diff --git a/src/public/data/pack/client/songs/knightly.mid b/src/public/data/pack/client/songs/knightly.mid new file mode 100644 index 00000000..8c53daf1 Binary files /dev/null and b/src/public/data/pack/client/songs/knightly.mid differ diff --git a/src/public/data/pack/client/songs/landlubber.mid b/src/public/data/pack/client/songs/landlubber.mid new file mode 100644 index 00000000..754185f1 Binary files /dev/null and b/src/public/data/pack/client/songs/landlubber.mid differ diff --git a/src/public/data/pack/client/songs/lasting.mid b/src/public/data/pack/client/songs/lasting.mid new file mode 100644 index 00000000..d7669cb5 Binary files /dev/null and b/src/public/data/pack/client/songs/lasting.mid differ diff --git a/src/public/data/pack/client/songs/legion.mid b/src/public/data/pack/client/songs/legion.mid new file mode 100644 index 00000000..0c062e48 Binary files /dev/null and b/src/public/data/pack/client/songs/legion.mid differ diff --git a/src/public/data/pack/client/songs/lightness.mid b/src/public/data/pack/client/songs/lightness.mid new file mode 100644 index 00000000..ff911b9d Binary files /dev/null and b/src/public/data/pack/client/songs/lightness.mid differ diff --git a/src/public/data/pack/client/songs/lightwalk.mid b/src/public/data/pack/client/songs/lightwalk.mid new file mode 100644 index 00000000..f0912d00 Binary files /dev/null and b/src/public/data/pack/client/songs/lightwalk.mid differ diff --git a/src/public/data/pack/client/songs/lonesome.mid b/src/public/data/pack/client/songs/lonesome.mid new file mode 100644 index 00000000..a7105ff4 Binary files /dev/null and b/src/public/data/pack/client/songs/lonesome.mid differ diff --git a/src/public/data/pack/client/songs/long_ago.mid b/src/public/data/pack/client/songs/long_ago.mid new file mode 100644 index 00000000..dea92e11 Binary files /dev/null and b/src/public/data/pack/client/songs/long_ago.mid differ diff --git a/src/public/data/pack/client/songs/long_way_home.mid b/src/public/data/pack/client/songs/long_way_home.mid new file mode 100644 index 00000000..b870a815 Binary files /dev/null and b/src/public/data/pack/client/songs/long_way_home.mid differ diff --git a/src/public/data/pack/client/songs/lullaby.mid b/src/public/data/pack/client/songs/lullaby.mid new file mode 100644 index 00000000..67bd89ec Binary files /dev/null and b/src/public/data/pack/client/songs/lullaby.mid differ diff --git a/src/public/data/pack/client/songs/mage_arena.mid b/src/public/data/pack/client/songs/mage_arena.mid new file mode 100644 index 00000000..f88533f7 Binary files /dev/null and b/src/public/data/pack/client/songs/mage_arena.mid differ diff --git a/src/public/data/pack/client/songs/magic_dance.mid b/src/public/data/pack/client/songs/magic_dance.mid new file mode 100644 index 00000000..7837a7e9 Binary files /dev/null and b/src/public/data/pack/client/songs/magic_dance.mid differ diff --git a/src/public/data/pack/client/songs/magical_journey.mid b/src/public/data/pack/client/songs/magical_journey.mid new file mode 100644 index 00000000..455686ac Binary files /dev/null and b/src/public/data/pack/client/songs/magical_journey.mid differ diff --git a/src/public/data/pack/client/songs/march2.mid b/src/public/data/pack/client/songs/march2.mid new file mode 100644 index 00000000..61978a66 Binary files /dev/null and b/src/public/data/pack/client/songs/march2.mid differ diff --git a/src/public/data/pack/client/songs/medieval.mid b/src/public/data/pack/client/songs/medieval.mid new file mode 100644 index 00000000..cdb2c369 Binary files /dev/null and b/src/public/data/pack/client/songs/medieval.mid differ diff --git a/src/public/data/pack/client/songs/mellow.mid b/src/public/data/pack/client/songs/mellow.mid new file mode 100644 index 00000000..9608fd31 Binary files /dev/null and b/src/public/data/pack/client/songs/mellow.mid differ diff --git a/src/public/data/pack/client/songs/miles_away.mid b/src/public/data/pack/client/songs/miles_away.mid new file mode 100644 index 00000000..473e4a2c Binary files /dev/null and b/src/public/data/pack/client/songs/miles_away.mid differ diff --git a/src/public/data/pack/client/songs/miracle_dance.mid b/src/public/data/pack/client/songs/miracle_dance.mid new file mode 100644 index 00000000..2fc74048 Binary files /dev/null and b/src/public/data/pack/client/songs/miracle_dance.mid differ diff --git a/src/public/data/pack/client/songs/monarch_waltz.mid b/src/public/data/pack/client/songs/monarch_waltz.mid new file mode 100644 index 00000000..a2809078 Binary files /dev/null and b/src/public/data/pack/client/songs/monarch_waltz.mid differ diff --git a/src/public/data/pack/client/songs/moody.mid b/src/public/data/pack/client/songs/moody.mid new file mode 100644 index 00000000..d7cf2782 Binary files /dev/null and b/src/public/data/pack/client/songs/moody.mid differ diff --git a/src/public/data/pack/client/songs/neverland.mid b/src/public/data/pack/client/songs/neverland.mid new file mode 100644 index 00000000..51def30e Binary files /dev/null and b/src/public/data/pack/client/songs/neverland.mid differ diff --git a/src/public/data/pack/client/songs/newbie_melody.mid b/src/public/data/pack/client/songs/newbie_melody.mid new file mode 100644 index 00000000..7c03f81b Binary files /dev/null and b/src/public/data/pack/client/songs/newbie_melody.mid differ diff --git a/src/public/data/pack/client/songs/nightfall.mid b/src/public/data/pack/client/songs/nightfall.mid new file mode 100644 index 00000000..eff19ad3 Binary files /dev/null and b/src/public/data/pack/client/songs/nightfall.mid differ diff --git a/src/public/data/pack/client/songs/nomad.mid b/src/public/data/pack/client/songs/nomad.mid new file mode 100644 index 00000000..b4ce0994 Binary files /dev/null and b/src/public/data/pack/client/songs/nomad.mid differ diff --git a/src/public/data/pack/client/songs/null.mid b/src/public/data/pack/client/songs/null.mid new file mode 100644 index 00000000..d92c6a1f Binary files /dev/null and b/src/public/data/pack/client/songs/null.mid differ diff --git a/src/public/data/pack/client/songs/organ_music_1.mid b/src/public/data/pack/client/songs/organ_music_1.mid new file mode 100644 index 00000000..43c30b2e Binary files /dev/null and b/src/public/data/pack/client/songs/organ_music_1.mid differ diff --git a/src/public/data/pack/client/songs/organ_music_2.mid b/src/public/data/pack/client/songs/organ_music_2.mid new file mode 100644 index 00000000..2ecf1c07 Binary files /dev/null and b/src/public/data/pack/client/songs/organ_music_2.mid differ diff --git a/src/public/data/pack/client/songs/oriental.mid b/src/public/data/pack/client/songs/oriental.mid new file mode 100644 index 00000000..549155c3 Binary files /dev/null and b/src/public/data/pack/client/songs/oriental.mid differ diff --git a/src/public/data/pack/client/songs/overture.mid b/src/public/data/pack/client/songs/overture.mid new file mode 100644 index 00000000..1e83568a Binary files /dev/null and b/src/public/data/pack/client/songs/overture.mid differ diff --git a/src/public/data/pack/client/songs/parade.mid b/src/public/data/pack/client/songs/parade.mid new file mode 100644 index 00000000..e55d6eac Binary files /dev/null and b/src/public/data/pack/client/songs/parade.mid differ diff --git a/src/public/data/pack/client/songs/quest.mid b/src/public/data/pack/client/songs/quest.mid new file mode 100644 index 00000000..a141e978 Binary files /dev/null and b/src/public/data/pack/client/songs/quest.mid differ diff --git a/src/public/data/pack/client/songs/regal2.mid b/src/public/data/pack/client/songs/regal2.mid new file mode 100644 index 00000000..fd681c7a Binary files /dev/null and b/src/public/data/pack/client/songs/regal2.mid differ diff --git a/src/public/data/pack/client/songs/reggae.mid b/src/public/data/pack/client/songs/reggae.mid new file mode 100644 index 00000000..1411ed7e Binary files /dev/null and b/src/public/data/pack/client/songs/reggae.mid differ diff --git a/src/public/data/pack/client/songs/reggae2.mid b/src/public/data/pack/client/songs/reggae2.mid new file mode 100644 index 00000000..d5403b02 Binary files /dev/null and b/src/public/data/pack/client/songs/reggae2.mid differ diff --git a/src/public/data/pack/client/songs/riverside.mid b/src/public/data/pack/client/songs/riverside.mid new file mode 100644 index 00000000..b49848ef Binary files /dev/null and b/src/public/data/pack/client/songs/riverside.mid differ diff --git a/src/public/data/pack/client/songs/royale.mid b/src/public/data/pack/client/songs/royale.mid new file mode 100644 index 00000000..023c8acd Binary files /dev/null and b/src/public/data/pack/client/songs/royale.mid differ diff --git a/src/public/data/pack/client/songs/rune_essence.mid b/src/public/data/pack/client/songs/rune_essence.mid new file mode 100644 index 00000000..80201bc7 Binary files /dev/null and b/src/public/data/pack/client/songs/rune_essence.mid differ diff --git a/src/public/data/pack/client/songs/sad_meadow.mid b/src/public/data/pack/client/songs/sad_meadow.mid new file mode 100644 index 00000000..405c08f7 Binary files /dev/null and b/src/public/data/pack/client/songs/sad_meadow.mid differ diff --git a/src/public/data/pack/client/songs/scape_cave.mid b/src/public/data/pack/client/songs/scape_cave.mid new file mode 100644 index 00000000..0ffb0a19 Binary files /dev/null and b/src/public/data/pack/client/songs/scape_cave.mid differ diff --git a/src/public/data/pack/client/songs/scape_main.mid b/src/public/data/pack/client/songs/scape_main.mid new file mode 100644 index 00000000..230ee3b6 Binary files /dev/null and b/src/public/data/pack/client/songs/scape_main.mid differ diff --git a/src/public/data/pack/client/songs/scape_sad1.mid b/src/public/data/pack/client/songs/scape_sad1.mid new file mode 100644 index 00000000..da48b1b3 Binary files /dev/null and b/src/public/data/pack/client/songs/scape_sad1.mid differ diff --git a/src/public/data/pack/client/songs/scape_soft.mid b/src/public/data/pack/client/songs/scape_soft.mid new file mode 100644 index 00000000..1402679d Binary files /dev/null and b/src/public/data/pack/client/songs/scape_soft.mid differ diff --git a/src/public/data/pack/client/songs/scape_wild1.mid b/src/public/data/pack/client/songs/scape_wild1.mid new file mode 100644 index 00000000..9a234b0a Binary files /dev/null and b/src/public/data/pack/client/songs/scape_wild1.mid differ diff --git a/src/public/data/pack/client/songs/sea_shanty.mid b/src/public/data/pack/client/songs/sea_shanty.mid new file mode 100644 index 00000000..7a6f3e31 Binary files /dev/null and b/src/public/data/pack/client/songs/sea_shanty.mid differ diff --git a/src/public/data/pack/client/songs/sea_shanty2.mid b/src/public/data/pack/client/songs/sea_shanty2.mid new file mode 100644 index 00000000..f64df421 Binary files /dev/null and b/src/public/data/pack/client/songs/sea_shanty2.mid differ diff --git a/src/public/data/pack/client/songs/serenade.mid b/src/public/data/pack/client/songs/serenade.mid new file mode 100644 index 00000000..c48a85b4 Binary files /dev/null and b/src/public/data/pack/client/songs/serenade.mid differ diff --git a/src/public/data/pack/client/songs/serene.mid b/src/public/data/pack/client/songs/serene.mid new file mode 100644 index 00000000..a8052833 Binary files /dev/null and b/src/public/data/pack/client/songs/serene.mid differ diff --git a/src/public/data/pack/client/songs/shine.mid b/src/public/data/pack/client/songs/shine.mid new file mode 100644 index 00000000..2a91a6c7 Binary files /dev/null and b/src/public/data/pack/client/songs/shine.mid differ diff --git a/src/public/data/pack/client/songs/shining.mid b/src/public/data/pack/client/songs/shining.mid new file mode 100644 index 00000000..1a4bd5d6 Binary files /dev/null and b/src/public/data/pack/client/songs/shining.mid differ diff --git a/src/public/data/pack/client/songs/silence.mid b/src/public/data/pack/client/songs/silence.mid new file mode 100644 index 00000000..b5e2310a Binary files /dev/null and b/src/public/data/pack/client/songs/silence.mid differ diff --git a/src/public/data/pack/client/songs/soundscape.mid b/src/public/data/pack/client/songs/soundscape.mid new file mode 100644 index 00000000..d6afafa3 Binary files /dev/null and b/src/public/data/pack/client/songs/soundscape.mid differ diff --git a/src/public/data/pack/client/songs/spirit.mid b/src/public/data/pack/client/songs/spirit.mid new file mode 100644 index 00000000..35207161 Binary files /dev/null and b/src/public/data/pack/client/songs/spirit.mid differ diff --git a/src/public/data/pack/client/songs/splendour.mid b/src/public/data/pack/client/songs/splendour.mid new file mode 100644 index 00000000..6773f584 Binary files /dev/null and b/src/public/data/pack/client/songs/splendour.mid differ diff --git a/src/public/data/pack/client/songs/spooky2.mid b/src/public/data/pack/client/songs/spooky2.mid new file mode 100644 index 00000000..75fa3000 Binary files /dev/null and b/src/public/data/pack/client/songs/spooky2.mid differ diff --git a/src/public/data/pack/client/songs/spooky_jungle.mid b/src/public/data/pack/client/songs/spooky_jungle.mid new file mode 100644 index 00000000..e6a6050b Binary files /dev/null and b/src/public/data/pack/client/songs/spooky_jungle.mid differ diff --git a/src/public/data/pack/client/songs/starlight.mid b/src/public/data/pack/client/songs/starlight.mid new file mode 100644 index 00000000..08d85629 Binary files /dev/null and b/src/public/data/pack/client/songs/starlight.mid differ diff --git a/src/public/data/pack/client/songs/start.mid b/src/public/data/pack/client/songs/start.mid new file mode 100644 index 00000000..7b22f899 Binary files /dev/null and b/src/public/data/pack/client/songs/start.mid differ diff --git a/src/public/data/pack/client/songs/still_night.mid b/src/public/data/pack/client/songs/still_night.mid new file mode 100644 index 00000000..efdc3ca7 Binary files /dev/null and b/src/public/data/pack/client/songs/still_night.mid differ diff --git a/src/public/data/pack/client/songs/talking_forest.mid b/src/public/data/pack/client/songs/talking_forest.mid new file mode 100644 index 00000000..309e8038 Binary files /dev/null and b/src/public/data/pack/client/songs/talking_forest.mid differ diff --git a/src/public/data/pack/client/songs/the_desert.mid b/src/public/data/pack/client/songs/the_desert.mid new file mode 100644 index 00000000..fdd983e9 Binary files /dev/null and b/src/public/data/pack/client/songs/the_desert.mid differ diff --git a/src/public/data/pack/client/songs/the_shadow.mid b/src/public/data/pack/client/songs/the_shadow.mid new file mode 100644 index 00000000..8aa89ce3 Binary files /dev/null and b/src/public/data/pack/client/songs/the_shadow.mid differ diff --git a/src/public/data/pack/client/songs/the_tower.mid b/src/public/data/pack/client/songs/the_tower.mid new file mode 100644 index 00000000..cd499292 Binary files /dev/null and b/src/public/data/pack/client/songs/the_tower.mid differ diff --git a/src/public/data/pack/client/songs/theme.mid b/src/public/data/pack/client/songs/theme.mid new file mode 100644 index 00000000..67db8121 Binary files /dev/null and b/src/public/data/pack/client/songs/theme.mid differ diff --git a/src/public/data/pack/client/songs/tomorrow.mid b/src/public/data/pack/client/songs/tomorrow.mid new file mode 100644 index 00000000..68d55c79 Binary files /dev/null and b/src/public/data/pack/client/songs/tomorrow.mid differ diff --git a/src/public/data/pack/client/songs/trawler.mid b/src/public/data/pack/client/songs/trawler.mid new file mode 100644 index 00000000..e983bf4a Binary files /dev/null and b/src/public/data/pack/client/songs/trawler.mid differ diff --git a/src/public/data/pack/client/songs/trawler_minor.mid b/src/public/data/pack/client/songs/trawler_minor.mid new file mode 100644 index 00000000..165d2411 Binary files /dev/null and b/src/public/data/pack/client/songs/trawler_minor.mid differ diff --git a/src/public/data/pack/client/songs/tree_spirits.mid b/src/public/data/pack/client/songs/tree_spirits.mid new file mode 100644 index 00000000..a45446a9 Binary files /dev/null and b/src/public/data/pack/client/songs/tree_spirits.mid differ diff --git a/src/public/data/pack/client/songs/tribal.mid b/src/public/data/pack/client/songs/tribal.mid new file mode 100644 index 00000000..dcd84fc1 Binary files /dev/null and b/src/public/data/pack/client/songs/tribal.mid differ diff --git a/src/public/data/pack/client/songs/tribal2.mid b/src/public/data/pack/client/songs/tribal2.mid new file mode 100644 index 00000000..f0e399fb Binary files /dev/null and b/src/public/data/pack/client/songs/tribal2.mid differ diff --git a/src/public/data/pack/client/songs/tribal_background.mid b/src/public/data/pack/client/songs/tribal_background.mid new file mode 100644 index 00000000..eed03e89 Binary files /dev/null and b/src/public/data/pack/client/songs/tribal_background.mid differ diff --git a/src/public/data/pack/client/songs/trinity.mid b/src/public/data/pack/client/songs/trinity.mid new file mode 100644 index 00000000..e6f3b0fc Binary files /dev/null and b/src/public/data/pack/client/songs/trinity.mid differ diff --git a/src/public/data/pack/client/songs/troubled.mid b/src/public/data/pack/client/songs/troubled.mid new file mode 100644 index 00000000..8f42a2f2 Binary files /dev/null and b/src/public/data/pack/client/songs/troubled.mid differ diff --git a/src/public/data/pack/client/songs/undercurrent.mid b/src/public/data/pack/client/songs/undercurrent.mid new file mode 100644 index 00000000..fb4921ca Binary files /dev/null and b/src/public/data/pack/client/songs/undercurrent.mid differ diff --git a/src/public/data/pack/client/songs/underground.mid b/src/public/data/pack/client/songs/underground.mid new file mode 100644 index 00000000..a08fbcb2 Binary files /dev/null and b/src/public/data/pack/client/songs/underground.mid differ diff --git a/src/public/data/pack/client/songs/understanding.mid b/src/public/data/pack/client/songs/understanding.mid new file mode 100644 index 00000000..6454e160 Binary files /dev/null and b/src/public/data/pack/client/songs/understanding.mid differ diff --git a/src/public/data/pack/client/songs/unknown_land.mid b/src/public/data/pack/client/songs/unknown_land.mid new file mode 100644 index 00000000..74be1ceb Binary files /dev/null and b/src/public/data/pack/client/songs/unknown_land.mid differ diff --git a/src/public/data/pack/client/songs/upass1.mid b/src/public/data/pack/client/songs/upass1.mid new file mode 100644 index 00000000..6f42dee7 Binary files /dev/null and b/src/public/data/pack/client/songs/upass1.mid differ diff --git a/src/public/data/pack/client/songs/upcoming.mid b/src/public/data/pack/client/songs/upcoming.mid new file mode 100644 index 00000000..6ebbbc14 Binary files /dev/null and b/src/public/data/pack/client/songs/upcoming.mid differ diff --git a/src/public/data/pack/client/songs/venture.mid b/src/public/data/pack/client/songs/venture.mid new file mode 100644 index 00000000..91d8d123 Binary files /dev/null and b/src/public/data/pack/client/songs/venture.mid differ diff --git a/src/public/data/pack/client/songs/venture2.mid b/src/public/data/pack/client/songs/venture2.mid new file mode 100644 index 00000000..d2fa2194 Binary files /dev/null and b/src/public/data/pack/client/songs/venture2.mid differ diff --git a/src/public/data/pack/client/songs/vision.mid b/src/public/data/pack/client/songs/vision.mid new file mode 100644 index 00000000..d7990c17 Binary files /dev/null and b/src/public/data/pack/client/songs/vision.mid differ diff --git a/src/public/data/pack/client/songs/voodoo_cult.mid b/src/public/data/pack/client/songs/voodoo_cult.mid new file mode 100644 index 00000000..fc9212ad Binary files /dev/null and b/src/public/data/pack/client/songs/voodoo_cult.mid differ diff --git a/src/public/data/pack/client/songs/voyage.mid b/src/public/data/pack/client/songs/voyage.mid new file mode 100644 index 00000000..29f71039 Binary files /dev/null and b/src/public/data/pack/client/songs/voyage.mid differ diff --git a/src/public/data/pack/client/songs/wander.mid b/src/public/data/pack/client/songs/wander.mid new file mode 100644 index 00000000..45f57f85 Binary files /dev/null and b/src/public/data/pack/client/songs/wander.mid differ diff --git a/src/public/data/pack/client/songs/waterfall.mid b/src/public/data/pack/client/songs/waterfall.mid new file mode 100644 index 00000000..f9c34de9 Binary files /dev/null and b/src/public/data/pack/client/songs/waterfall.mid differ diff --git a/src/public/data/pack/client/songs/wilderness2.mid b/src/public/data/pack/client/songs/wilderness2.mid new file mode 100644 index 00000000..54e3783d Binary files /dev/null and b/src/public/data/pack/client/songs/wilderness2.mid differ diff --git a/src/public/data/pack/client/songs/wilderness3.mid b/src/public/data/pack/client/songs/wilderness3.mid new file mode 100644 index 00000000..c708f131 Binary files /dev/null and b/src/public/data/pack/client/songs/wilderness3.mid differ diff --git a/src/public/data/pack/client/songs/wilderness4.mid b/src/public/data/pack/client/songs/wilderness4.mid new file mode 100644 index 00000000..57455ab9 Binary files /dev/null and b/src/public/data/pack/client/songs/wilderness4.mid differ diff --git a/src/public/data/pack/client/songs/witching.mid b/src/public/data/pack/client/songs/witching.mid new file mode 100644 index 00000000..59eaf698 Binary files /dev/null and b/src/public/data/pack/client/songs/witching.mid differ diff --git a/src/public/data/pack/client/songs/wolf_mountain.mid b/src/public/data/pack/client/songs/wolf_mountain.mid new file mode 100644 index 00000000..62c34077 Binary files /dev/null and b/src/public/data/pack/client/songs/wolf_mountain.mid differ diff --git a/src/public/data/pack/client/songs/wonder.mid b/src/public/data/pack/client/songs/wonder.mid new file mode 100644 index 00000000..a642da39 Binary files /dev/null and b/src/public/data/pack/client/songs/wonder.mid differ diff --git a/src/public/data/pack/client/songs/wonderous.mid b/src/public/data/pack/client/songs/wonderous.mid new file mode 100644 index 00000000..eba1ba87 Binary files /dev/null and b/src/public/data/pack/client/songs/wonderous.mid differ diff --git a/src/public/data/pack/client/songs/workshop.mid b/src/public/data/pack/client/songs/workshop.mid new file mode 100644 index 00000000..beaf1f12 Binary files /dev/null and b/src/public/data/pack/client/songs/workshop.mid differ diff --git a/src/public/data/pack/client/songs/yesteryear.mid b/src/public/data/pack/client/songs/yesteryear.mid new file mode 100644 index 00000000..2e6eceb1 Binary files /dev/null and b/src/public/data/pack/client/songs/yesteryear.mid differ diff --git a/src/public/data/pack/client/songs/zealot.mid b/src/public/data/pack/client/songs/zealot.mid new file mode 100644 index 00000000..8fa4c540 Binary files /dev/null and b/src/public/data/pack/client/songs/zealot.mid differ diff --git a/src/public/data/pack/client/sounds b/src/public/data/pack/client/sounds new file mode 100644 index 00000000..451e6978 Binary files /dev/null and b/src/public/data/pack/client/sounds differ diff --git a/src/public/data/pack/client/textures b/src/public/data/pack/client/textures new file mode 100644 index 00000000..cfd34af6 Binary files /dev/null and b/src/public/data/pack/client/textures differ diff --git a/src/public/data/pack/client/title b/src/public/data/pack/client/title new file mode 100644 index 00000000..09c440b0 Binary files /dev/null and b/src/public/data/pack/client/title differ diff --git a/src/public/data/pack/client/wordenc b/src/public/data/pack/client/wordenc new file mode 100644 index 00000000..85b8129d Binary files /dev/null and b/src/public/data/pack/client/wordenc differ diff --git a/src/public/data/pack/mapview/worldmap.jag b/src/public/data/pack/mapview/worldmap.jag new file mode 100644 index 00000000..e039d530 Binary files /dev/null and b/src/public/data/pack/mapview/worldmap.jag differ diff --git a/src/public/data/pack/server/category.dat b/src/public/data/pack/server/category.dat new file mode 100644 index 00000000..693c627d Binary files /dev/null and b/src/public/data/pack/server/category.dat differ diff --git a/src/public/data/pack/server/dbrow.dat b/src/public/data/pack/server/dbrow.dat new file mode 100644 index 00000000..0334e8b8 Binary files /dev/null and b/src/public/data/pack/server/dbrow.dat differ diff --git a/src/public/data/pack/server/dbrow.idx b/src/public/data/pack/server/dbrow.idx new file mode 100644 index 00000000..143048d3 Binary files /dev/null and b/src/public/data/pack/server/dbrow.idx differ diff --git a/src/public/data/pack/server/dbtable.dat b/src/public/data/pack/server/dbtable.dat new file mode 100644 index 00000000..2a4aa60a Binary files /dev/null and b/src/public/data/pack/server/dbtable.dat differ diff --git a/src/public/data/pack/server/dbtable.idx b/src/public/data/pack/server/dbtable.idx new file mode 100644 index 00000000..faaad858 Binary files /dev/null and b/src/public/data/pack/server/dbtable.idx differ diff --git a/src/public/data/pack/server/enum.dat b/src/public/data/pack/server/enum.dat new file mode 100644 index 00000000..8a008492 Binary files /dev/null and b/src/public/data/pack/server/enum.dat differ diff --git a/src/public/data/pack/server/enum.idx b/src/public/data/pack/server/enum.idx new file mode 100644 index 00000000..d087a0e1 Binary files /dev/null and b/src/public/data/pack/server/enum.idx differ diff --git a/src/public/data/pack/server/flo.dat b/src/public/data/pack/server/flo.dat new file mode 100644 index 00000000..50da5880 Binary files /dev/null and b/src/public/data/pack/server/flo.dat differ diff --git a/src/public/data/pack/server/flo.idx b/src/public/data/pack/server/flo.idx new file mode 100644 index 00000000..6521961e Binary files /dev/null and b/src/public/data/pack/server/flo.idx differ diff --git a/src/public/data/pack/server/frame_del.dat b/src/public/data/pack/server/frame_del.dat new file mode 100644 index 00000000..01067baf Binary files /dev/null and b/src/public/data/pack/server/frame_del.dat differ diff --git a/src/public/data/pack/server/hunt.dat b/src/public/data/pack/server/hunt.dat new file mode 100644 index 00000000..517da3ee Binary files /dev/null and b/src/public/data/pack/server/hunt.dat differ diff --git a/src/public/data/pack/server/hunt.idx b/src/public/data/pack/server/hunt.idx new file mode 100644 index 00000000..a224fbe5 Binary files /dev/null and b/src/public/data/pack/server/hunt.idx differ diff --git a/src/public/data/pack/server/idk.dat b/src/public/data/pack/server/idk.dat new file mode 100644 index 00000000..6e00cb96 Binary files /dev/null and b/src/public/data/pack/server/idk.dat differ diff --git a/src/public/data/pack/server/idk.idx b/src/public/data/pack/server/idk.idx new file mode 100644 index 00000000..2405cef2 Binary files /dev/null and b/src/public/data/pack/server/idk.idx differ diff --git a/src/public/data/pack/server/interface.dat b/src/public/data/pack/server/interface.dat new file mode 100644 index 00000000..2b2199a9 Binary files /dev/null and b/src/public/data/pack/server/interface.dat differ diff --git a/src/public/data/pack/server/inv.dat b/src/public/data/pack/server/inv.dat new file mode 100644 index 00000000..b1b5480f Binary files /dev/null and b/src/public/data/pack/server/inv.dat differ diff --git a/src/public/data/pack/server/inv.idx b/src/public/data/pack/server/inv.idx new file mode 100644 index 00000000..39900ae5 Binary files /dev/null and b/src/public/data/pack/server/inv.idx differ diff --git a/src/public/data/pack/server/lastbuild.pack b/src/public/data/pack/server/lastbuild.pack new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/loc.dat b/src/public/data/pack/server/loc.dat new file mode 100644 index 00000000..f4448419 Binary files /dev/null and b/src/public/data/pack/server/loc.dat differ diff --git a/src/public/data/pack/server/loc.idx b/src/public/data/pack/server/loc.idx new file mode 100644 index 00000000..c8c7bd7b Binary files /dev/null and b/src/public/data/pack/server/loc.idx differ diff --git a/src/public/data/pack/server/maps/l29_75 b/src/public/data/pack/server/maps/l29_75 new file mode 100644 index 00000000..33a26c69 Binary files /dev/null and b/src/public/data/pack/server/maps/l29_75 differ diff --git a/src/public/data/pack/server/maps/l30_75 b/src/public/data/pack/server/maps/l30_75 new file mode 100644 index 00000000..47ae339c Binary files /dev/null and b/src/public/data/pack/server/maps/l30_75 differ diff --git a/src/public/data/pack/server/maps/l31_75 b/src/public/data/pack/server/maps/l31_75 new file mode 100644 index 00000000..7bf7d5fa Binary files /dev/null and b/src/public/data/pack/server/maps/l31_75 differ diff --git a/src/public/data/pack/server/maps/l32_70 b/src/public/data/pack/server/maps/l32_70 new file mode 100644 index 00000000..d026ee3a Binary files /dev/null and b/src/public/data/pack/server/maps/l32_70 differ diff --git a/src/public/data/pack/server/maps/l32_71 b/src/public/data/pack/server/maps/l32_71 new file mode 100644 index 00000000..38170b76 Binary files /dev/null and b/src/public/data/pack/server/maps/l32_71 differ diff --git a/src/public/data/pack/server/maps/l32_72 b/src/public/data/pack/server/maps/l32_72 new file mode 100644 index 00000000..38170b76 Binary files /dev/null and b/src/public/data/pack/server/maps/l32_72 differ diff --git a/src/public/data/pack/server/maps/l32_73 b/src/public/data/pack/server/maps/l32_73 new file mode 100644 index 00000000..38170b76 Binary files /dev/null and b/src/public/data/pack/server/maps/l32_73 differ diff --git a/src/public/data/pack/server/maps/l32_74 b/src/public/data/pack/server/maps/l32_74 new file mode 100644 index 00000000..628a4459 Binary files /dev/null and b/src/public/data/pack/server/maps/l32_74 differ diff --git a/src/public/data/pack/server/maps/l32_75 b/src/public/data/pack/server/maps/l32_75 new file mode 100644 index 00000000..f76dd238 Binary files /dev/null and b/src/public/data/pack/server/maps/l32_75 differ diff --git a/src/public/data/pack/server/maps/l33_70 b/src/public/data/pack/server/maps/l33_70 new file mode 100644 index 00000000..7b60eaf3 Binary files /dev/null and b/src/public/data/pack/server/maps/l33_70 differ diff --git a/src/public/data/pack/server/maps/l33_71 b/src/public/data/pack/server/maps/l33_71 new file mode 100644 index 00000000..b0a9d715 Binary files /dev/null and b/src/public/data/pack/server/maps/l33_71 differ diff --git a/src/public/data/pack/server/maps/l33_72 b/src/public/data/pack/server/maps/l33_72 new file mode 100644 index 00000000..0c03598e Binary files /dev/null and b/src/public/data/pack/server/maps/l33_72 differ diff --git a/src/public/data/pack/server/maps/l33_73 b/src/public/data/pack/server/maps/l33_73 new file mode 100644 index 00000000..72f32e3b Binary files /dev/null and b/src/public/data/pack/server/maps/l33_73 differ diff --git a/src/public/data/pack/server/maps/l33_74 b/src/public/data/pack/server/maps/l33_74 new file mode 100644 index 00000000..519813dd Binary files /dev/null and b/src/public/data/pack/server/maps/l33_74 differ diff --git a/src/public/data/pack/server/maps/l33_75 b/src/public/data/pack/server/maps/l33_75 new file mode 100644 index 00000000..fbeff55d Binary files /dev/null and b/src/public/data/pack/server/maps/l33_75 differ diff --git a/src/public/data/pack/server/maps/l33_76 b/src/public/data/pack/server/maps/l33_76 new file mode 100644 index 00000000..f76dd238 Binary files /dev/null and b/src/public/data/pack/server/maps/l33_76 differ diff --git a/src/public/data/pack/server/maps/l34_70 b/src/public/data/pack/server/maps/l34_70 new file mode 100644 index 00000000..064eca89 Binary files /dev/null and b/src/public/data/pack/server/maps/l34_70 differ diff --git a/src/public/data/pack/server/maps/l34_71 b/src/public/data/pack/server/maps/l34_71 new file mode 100644 index 00000000..b3e5077d Binary files /dev/null and b/src/public/data/pack/server/maps/l34_71 differ diff --git a/src/public/data/pack/server/maps/l34_72 b/src/public/data/pack/server/maps/l34_72 new file mode 100644 index 00000000..c87a4755 Binary files /dev/null and b/src/public/data/pack/server/maps/l34_72 differ diff --git a/src/public/data/pack/server/maps/l34_73 b/src/public/data/pack/server/maps/l34_73 new file mode 100644 index 00000000..c87a4755 Binary files /dev/null and b/src/public/data/pack/server/maps/l34_73 differ diff --git a/src/public/data/pack/server/maps/l34_74 b/src/public/data/pack/server/maps/l34_74 new file mode 100644 index 00000000..2d18b0c0 Binary files /dev/null and b/src/public/data/pack/server/maps/l34_74 differ diff --git a/src/public/data/pack/server/maps/l34_75 b/src/public/data/pack/server/maps/l34_75 new file mode 100644 index 00000000..e709c593 Binary files /dev/null and b/src/public/data/pack/server/maps/l34_75 differ diff --git a/src/public/data/pack/server/maps/l34_76 b/src/public/data/pack/server/maps/l34_76 new file mode 100644 index 00000000..f76dd238 Binary files /dev/null and b/src/public/data/pack/server/maps/l34_76 differ diff --git a/src/public/data/pack/server/maps/l35_20 b/src/public/data/pack/server/maps/l35_20 new file mode 100644 index 00000000..641d8dbb Binary files /dev/null and b/src/public/data/pack/server/maps/l35_20 differ diff --git a/src/public/data/pack/server/maps/l35_75 b/src/public/data/pack/server/maps/l35_75 new file mode 100644 index 00000000..9dfce02b Binary files /dev/null and b/src/public/data/pack/server/maps/l35_75 differ diff --git a/src/public/data/pack/server/maps/l35_76 b/src/public/data/pack/server/maps/l35_76 new file mode 100644 index 00000000..f76dd238 Binary files /dev/null and b/src/public/data/pack/server/maps/l35_76 differ diff --git a/src/public/data/pack/server/maps/l36_146 b/src/public/data/pack/server/maps/l36_146 new file mode 100644 index 00000000..ffd14f61 Binary files /dev/null and b/src/public/data/pack/server/maps/l36_146 differ diff --git a/src/public/data/pack/server/maps/l36_147 b/src/public/data/pack/server/maps/l36_147 new file mode 100644 index 00000000..8b66ca30 Binary files /dev/null and b/src/public/data/pack/server/maps/l36_147 differ diff --git a/src/public/data/pack/server/maps/l36_148 b/src/public/data/pack/server/maps/l36_148 new file mode 100644 index 00000000..33e80865 Binary files /dev/null and b/src/public/data/pack/server/maps/l36_148 differ diff --git a/src/public/data/pack/server/maps/l36_149 b/src/public/data/pack/server/maps/l36_149 new file mode 100644 index 00000000..a7fa9689 Binary files /dev/null and b/src/public/data/pack/server/maps/l36_149 differ diff --git a/src/public/data/pack/server/maps/l36_150 b/src/public/data/pack/server/maps/l36_150 new file mode 100644 index 00000000..cb3c7f3e Binary files /dev/null and b/src/public/data/pack/server/maps/l36_150 differ diff --git a/src/public/data/pack/server/maps/l36_153 b/src/public/data/pack/server/maps/l36_153 new file mode 100644 index 00000000..9411781f Binary files /dev/null and b/src/public/data/pack/server/maps/l36_153 differ diff --git a/src/public/data/pack/server/maps/l36_154 b/src/public/data/pack/server/maps/l36_154 new file mode 100644 index 00000000..4835708e Binary files /dev/null and b/src/public/data/pack/server/maps/l36_154 differ diff --git a/src/public/data/pack/server/maps/l36_52 b/src/public/data/pack/server/maps/l36_52 new file mode 100644 index 00000000..ab88022b Binary files /dev/null and b/src/public/data/pack/server/maps/l36_52 differ diff --git a/src/public/data/pack/server/maps/l36_53 b/src/public/data/pack/server/maps/l36_53 new file mode 100644 index 00000000..da570075 Binary files /dev/null and b/src/public/data/pack/server/maps/l36_53 differ diff --git a/src/public/data/pack/server/maps/l36_54 b/src/public/data/pack/server/maps/l36_54 new file mode 100644 index 00000000..feead18b Binary files /dev/null and b/src/public/data/pack/server/maps/l36_54 differ diff --git a/src/public/data/pack/server/maps/l36_72 b/src/public/data/pack/server/maps/l36_72 new file mode 100644 index 00000000..2dd3af7f Binary files /dev/null and b/src/public/data/pack/server/maps/l36_72 differ diff --git a/src/public/data/pack/server/maps/l36_73 b/src/public/data/pack/server/maps/l36_73 new file mode 100644 index 00000000..d70a0cb6 Binary files /dev/null and b/src/public/data/pack/server/maps/l36_73 differ diff --git a/src/public/data/pack/server/maps/l36_74 b/src/public/data/pack/server/maps/l36_74 new file mode 100644 index 00000000..af148730 Binary files /dev/null and b/src/public/data/pack/server/maps/l36_74 differ diff --git a/src/public/data/pack/server/maps/l36_75 b/src/public/data/pack/server/maps/l36_75 new file mode 100644 index 00000000..f76dd238 Binary files /dev/null and b/src/public/data/pack/server/maps/l36_75 differ diff --git a/src/public/data/pack/server/maps/l36_76 b/src/public/data/pack/server/maps/l36_76 new file mode 100644 index 00000000..f76dd238 Binary files /dev/null and b/src/public/data/pack/server/maps/l36_76 differ diff --git a/src/public/data/pack/server/maps/l37_146 b/src/public/data/pack/server/maps/l37_146 new file mode 100644 index 00000000..84faeec4 Binary files /dev/null and b/src/public/data/pack/server/maps/l37_146 differ diff --git a/src/public/data/pack/server/maps/l37_147 b/src/public/data/pack/server/maps/l37_147 new file mode 100644 index 00000000..e246f54d Binary files /dev/null and b/src/public/data/pack/server/maps/l37_147 differ diff --git a/src/public/data/pack/server/maps/l37_148 b/src/public/data/pack/server/maps/l37_148 new file mode 100644 index 00000000..77fa6a08 Binary files /dev/null and b/src/public/data/pack/server/maps/l37_148 differ diff --git a/src/public/data/pack/server/maps/l37_149 b/src/public/data/pack/server/maps/l37_149 new file mode 100644 index 00000000..0118ee45 Binary files /dev/null and b/src/public/data/pack/server/maps/l37_149 differ diff --git a/src/public/data/pack/server/maps/l37_150 b/src/public/data/pack/server/maps/l37_150 new file mode 100644 index 00000000..5b542eb0 Binary files /dev/null and b/src/public/data/pack/server/maps/l37_150 differ diff --git a/src/public/data/pack/server/maps/l37_151 b/src/public/data/pack/server/maps/l37_151 new file mode 100644 index 00000000..e3a02584 Binary files /dev/null and b/src/public/data/pack/server/maps/l37_151 differ diff --git a/src/public/data/pack/server/maps/l37_152 b/src/public/data/pack/server/maps/l37_152 new file mode 100644 index 00000000..fc402ff8 Binary files /dev/null and b/src/public/data/pack/server/maps/l37_152 differ diff --git a/src/public/data/pack/server/maps/l37_153 b/src/public/data/pack/server/maps/l37_153 new file mode 100644 index 00000000..ed86a61a Binary files /dev/null and b/src/public/data/pack/server/maps/l37_153 differ diff --git a/src/public/data/pack/server/maps/l37_154 b/src/public/data/pack/server/maps/l37_154 new file mode 100644 index 00000000..761550fd Binary files /dev/null and b/src/public/data/pack/server/maps/l37_154 differ diff --git a/src/public/data/pack/server/maps/l37_48 b/src/public/data/pack/server/maps/l37_48 new file mode 100644 index 00000000..784e7dee Binary files /dev/null and b/src/public/data/pack/server/maps/l37_48 differ diff --git a/src/public/data/pack/server/maps/l37_49 b/src/public/data/pack/server/maps/l37_49 new file mode 100644 index 00000000..5599e17c Binary files /dev/null and b/src/public/data/pack/server/maps/l37_49 differ diff --git a/src/public/data/pack/server/maps/l37_50 b/src/public/data/pack/server/maps/l37_50 new file mode 100644 index 00000000..62e92c32 Binary files /dev/null and b/src/public/data/pack/server/maps/l37_50 differ diff --git a/src/public/data/pack/server/maps/l37_51 b/src/public/data/pack/server/maps/l37_51 new file mode 100644 index 00000000..269ef7a7 Binary files /dev/null and b/src/public/data/pack/server/maps/l37_51 differ diff --git a/src/public/data/pack/server/maps/l37_52 b/src/public/data/pack/server/maps/l37_52 new file mode 100644 index 00000000..a187b766 Binary files /dev/null and b/src/public/data/pack/server/maps/l37_52 differ diff --git a/src/public/data/pack/server/maps/l37_53 b/src/public/data/pack/server/maps/l37_53 new file mode 100644 index 00000000..2c06dd97 Binary files /dev/null and b/src/public/data/pack/server/maps/l37_53 differ diff --git a/src/public/data/pack/server/maps/l37_54 b/src/public/data/pack/server/maps/l37_54 new file mode 100644 index 00000000..cda65e0b Binary files /dev/null and b/src/public/data/pack/server/maps/l37_54 differ diff --git a/src/public/data/pack/server/maps/l37_55 b/src/public/data/pack/server/maps/l37_55 new file mode 100644 index 00000000..4f7f4564 Binary files /dev/null and b/src/public/data/pack/server/maps/l37_55 differ diff --git a/src/public/data/pack/server/maps/l37_72 b/src/public/data/pack/server/maps/l37_72 new file mode 100644 index 00000000..9e4617d5 Binary files /dev/null and b/src/public/data/pack/server/maps/l37_72 differ diff --git a/src/public/data/pack/server/maps/l37_73 b/src/public/data/pack/server/maps/l37_73 new file mode 100644 index 00000000..a8f03189 Binary files /dev/null and b/src/public/data/pack/server/maps/l37_73 differ diff --git a/src/public/data/pack/server/maps/l37_74 b/src/public/data/pack/server/maps/l37_74 new file mode 100644 index 00000000..1f90b79e Binary files /dev/null and b/src/public/data/pack/server/maps/l37_74 differ diff --git a/src/public/data/pack/server/maps/l37_75 b/src/public/data/pack/server/maps/l37_75 new file mode 100644 index 00000000..976f31a7 Binary files /dev/null and b/src/public/data/pack/server/maps/l37_75 differ diff --git a/src/public/data/pack/server/maps/l38_146 b/src/public/data/pack/server/maps/l38_146 new file mode 100644 index 00000000..a6311b09 Binary files /dev/null and b/src/public/data/pack/server/maps/l38_146 differ diff --git a/src/public/data/pack/server/maps/l38_147 b/src/public/data/pack/server/maps/l38_147 new file mode 100644 index 00000000..225aa1ab --- /dev/null +++ b/src/public/data/pack/server/maps/l38_147 @@ -0,0 +1 @@ +…›(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( \ No newline at end of file diff --git a/src/public/data/pack/server/maps/l38_148 b/src/public/data/pack/server/maps/l38_148 new file mode 100644 index 00000000..9be9177d Binary files /dev/null and b/src/public/data/pack/server/maps/l38_148 differ diff --git a/src/public/data/pack/server/maps/l38_149 b/src/public/data/pack/server/maps/l38_149 new file mode 100644 index 00000000..00206603 Binary files /dev/null and b/src/public/data/pack/server/maps/l38_149 differ diff --git a/src/public/data/pack/server/maps/l38_150 b/src/public/data/pack/server/maps/l38_150 new file mode 100644 index 00000000..82dddad3 Binary files /dev/null and b/src/public/data/pack/server/maps/l38_150 differ diff --git a/src/public/data/pack/server/maps/l38_151 b/src/public/data/pack/server/maps/l38_151 new file mode 100644 index 00000000..fc48619e Binary files /dev/null and b/src/public/data/pack/server/maps/l38_151 differ diff --git a/src/public/data/pack/server/maps/l38_152 b/src/public/data/pack/server/maps/l38_152 new file mode 100644 index 00000000..84dca864 Binary files /dev/null and b/src/public/data/pack/server/maps/l38_152 differ diff --git a/src/public/data/pack/server/maps/l38_153 b/src/public/data/pack/server/maps/l38_153 new file mode 100644 index 00000000..c4614c47 Binary files /dev/null and b/src/public/data/pack/server/maps/l38_153 differ diff --git a/src/public/data/pack/server/maps/l38_154 b/src/public/data/pack/server/maps/l38_154 new file mode 100644 index 00000000..b3726a36 Binary files /dev/null and b/src/public/data/pack/server/maps/l38_154 differ diff --git a/src/public/data/pack/server/maps/l38_155 b/src/public/data/pack/server/maps/l38_155 new file mode 100644 index 00000000..4afcefdb Binary files /dev/null and b/src/public/data/pack/server/maps/l38_155 differ diff --git a/src/public/data/pack/server/maps/l38_45 b/src/public/data/pack/server/maps/l38_45 new file mode 100644 index 00000000..f76dd238 Binary files /dev/null and b/src/public/data/pack/server/maps/l38_45 differ diff --git a/src/public/data/pack/server/maps/l38_46 b/src/public/data/pack/server/maps/l38_46 new file mode 100644 index 00000000..18213eac Binary files /dev/null and b/src/public/data/pack/server/maps/l38_46 differ diff --git a/src/public/data/pack/server/maps/l38_47 b/src/public/data/pack/server/maps/l38_47 new file mode 100644 index 00000000..ff852f57 Binary files /dev/null and b/src/public/data/pack/server/maps/l38_47 differ diff --git a/src/public/data/pack/server/maps/l38_48 b/src/public/data/pack/server/maps/l38_48 new file mode 100644 index 00000000..5556a2b0 Binary files /dev/null and b/src/public/data/pack/server/maps/l38_48 differ diff --git a/src/public/data/pack/server/maps/l38_49 b/src/public/data/pack/server/maps/l38_49 new file mode 100644 index 00000000..956ce126 Binary files /dev/null and b/src/public/data/pack/server/maps/l38_49 differ diff --git a/src/public/data/pack/server/maps/l38_50 b/src/public/data/pack/server/maps/l38_50 new file mode 100644 index 00000000..90cf4451 Binary files /dev/null and b/src/public/data/pack/server/maps/l38_50 differ diff --git a/src/public/data/pack/server/maps/l38_51 b/src/public/data/pack/server/maps/l38_51 new file mode 100644 index 00000000..1e79353c Binary files /dev/null and b/src/public/data/pack/server/maps/l38_51 differ diff --git a/src/public/data/pack/server/maps/l38_52 b/src/public/data/pack/server/maps/l38_52 new file mode 100644 index 00000000..31f4b396 Binary files /dev/null and b/src/public/data/pack/server/maps/l38_52 differ diff --git a/src/public/data/pack/server/maps/l38_53 b/src/public/data/pack/server/maps/l38_53 new file mode 100644 index 00000000..634bc3fa Binary files /dev/null and b/src/public/data/pack/server/maps/l38_53 differ diff --git a/src/public/data/pack/server/maps/l38_54 b/src/public/data/pack/server/maps/l38_54 new file mode 100644 index 00000000..10fde9a8 Binary files /dev/null and b/src/public/data/pack/server/maps/l38_54 differ diff --git a/src/public/data/pack/server/maps/l38_55 b/src/public/data/pack/server/maps/l38_55 new file mode 100644 index 00000000..8a3a3727 Binary files /dev/null and b/src/public/data/pack/server/maps/l38_55 differ diff --git a/src/public/data/pack/server/maps/l38_72 b/src/public/data/pack/server/maps/l38_72 new file mode 100644 index 00000000..e7e45b9e Binary files /dev/null and b/src/public/data/pack/server/maps/l38_72 differ diff --git a/src/public/data/pack/server/maps/l38_73 b/src/public/data/pack/server/maps/l38_73 new file mode 100644 index 00000000..b4207ca0 Binary files /dev/null and b/src/public/data/pack/server/maps/l38_73 differ diff --git a/src/public/data/pack/server/maps/l38_74 b/src/public/data/pack/server/maps/l38_74 new file mode 100644 index 00000000..dbc3f57d Binary files /dev/null and b/src/public/data/pack/server/maps/l38_74 differ diff --git a/src/public/data/pack/server/maps/l39_147 b/src/public/data/pack/server/maps/l39_147 new file mode 100644 index 00000000..82fc4859 Binary files /dev/null and b/src/public/data/pack/server/maps/l39_147 differ diff --git a/src/public/data/pack/server/maps/l39_148 b/src/public/data/pack/server/maps/l39_148 new file mode 100644 index 00000000..15f1f870 Binary files /dev/null and b/src/public/data/pack/server/maps/l39_148 differ diff --git a/src/public/data/pack/server/maps/l39_149 b/src/public/data/pack/server/maps/l39_149 new file mode 100644 index 00000000..fb5abd01 Binary files /dev/null and b/src/public/data/pack/server/maps/l39_149 differ diff --git a/src/public/data/pack/server/maps/l39_150 b/src/public/data/pack/server/maps/l39_150 new file mode 100644 index 00000000..629cd2dc Binary files /dev/null and b/src/public/data/pack/server/maps/l39_150 differ diff --git a/src/public/data/pack/server/maps/l39_151 b/src/public/data/pack/server/maps/l39_151 new file mode 100644 index 00000000..f24984a7 Binary files /dev/null and b/src/public/data/pack/server/maps/l39_151 differ diff --git a/src/public/data/pack/server/maps/l39_152 b/src/public/data/pack/server/maps/l39_152 new file mode 100644 index 00000000..74432cde Binary files /dev/null and b/src/public/data/pack/server/maps/l39_152 differ diff --git a/src/public/data/pack/server/maps/l39_153 b/src/public/data/pack/server/maps/l39_153 new file mode 100644 index 00000000..fbc0f522 Binary files /dev/null and b/src/public/data/pack/server/maps/l39_153 differ diff --git a/src/public/data/pack/server/maps/l39_154 b/src/public/data/pack/server/maps/l39_154 new file mode 100644 index 00000000..a12eefcb Binary files /dev/null and b/src/public/data/pack/server/maps/l39_154 differ diff --git a/src/public/data/pack/server/maps/l39_155 b/src/public/data/pack/server/maps/l39_155 new file mode 100644 index 00000000..38ca37cc Binary files /dev/null and b/src/public/data/pack/server/maps/l39_155 differ diff --git a/src/public/data/pack/server/maps/l39_45 b/src/public/data/pack/server/maps/l39_45 new file mode 100644 index 00000000..f76dd238 Binary files /dev/null and b/src/public/data/pack/server/maps/l39_45 differ diff --git a/src/public/data/pack/server/maps/l39_46 b/src/public/data/pack/server/maps/l39_46 new file mode 100644 index 00000000..74d6384d Binary files /dev/null and b/src/public/data/pack/server/maps/l39_46 differ diff --git a/src/public/data/pack/server/maps/l39_47 b/src/public/data/pack/server/maps/l39_47 new file mode 100644 index 00000000..c50bad3b Binary files /dev/null and b/src/public/data/pack/server/maps/l39_47 differ diff --git a/src/public/data/pack/server/maps/l39_48 b/src/public/data/pack/server/maps/l39_48 new file mode 100644 index 00000000..6f144eb2 Binary files /dev/null and b/src/public/data/pack/server/maps/l39_48 differ diff --git a/src/public/data/pack/server/maps/l39_49 b/src/public/data/pack/server/maps/l39_49 new file mode 100644 index 00000000..d72c4b82 Binary files /dev/null and b/src/public/data/pack/server/maps/l39_49 differ diff --git a/src/public/data/pack/server/maps/l39_50 b/src/public/data/pack/server/maps/l39_50 new file mode 100644 index 00000000..7fd5e654 Binary files /dev/null and b/src/public/data/pack/server/maps/l39_50 differ diff --git a/src/public/data/pack/server/maps/l39_51 b/src/public/data/pack/server/maps/l39_51 new file mode 100644 index 00000000..d5875afb Binary files /dev/null and b/src/public/data/pack/server/maps/l39_51 differ diff --git a/src/public/data/pack/server/maps/l39_52 b/src/public/data/pack/server/maps/l39_52 new file mode 100644 index 00000000..c49e85a9 Binary files /dev/null and b/src/public/data/pack/server/maps/l39_52 differ diff --git a/src/public/data/pack/server/maps/l39_53 b/src/public/data/pack/server/maps/l39_53 new file mode 100644 index 00000000..a338daa5 Binary files /dev/null and b/src/public/data/pack/server/maps/l39_53 differ diff --git a/src/public/data/pack/server/maps/l39_54 b/src/public/data/pack/server/maps/l39_54 new file mode 100644 index 00000000..83a24559 Binary files /dev/null and b/src/public/data/pack/server/maps/l39_54 differ diff --git a/src/public/data/pack/server/maps/l39_55 b/src/public/data/pack/server/maps/l39_55 new file mode 100644 index 00000000..a4b790c1 Binary files /dev/null and b/src/public/data/pack/server/maps/l39_55 differ diff --git a/src/public/data/pack/server/maps/l39_72 b/src/public/data/pack/server/maps/l39_72 new file mode 100644 index 00000000..99797910 Binary files /dev/null and b/src/public/data/pack/server/maps/l39_72 differ diff --git a/src/public/data/pack/server/maps/l39_73 b/src/public/data/pack/server/maps/l39_73 new file mode 100644 index 00000000..52066dff Binary files /dev/null and b/src/public/data/pack/server/maps/l39_73 differ diff --git a/src/public/data/pack/server/maps/l39_74 b/src/public/data/pack/server/maps/l39_74 new file mode 100644 index 00000000..59d4cbfe Binary files /dev/null and b/src/public/data/pack/server/maps/l39_74 differ diff --git a/src/public/data/pack/server/maps/l39_75 b/src/public/data/pack/server/maps/l39_75 new file mode 100644 index 00000000..e006122d Binary files /dev/null and b/src/public/data/pack/server/maps/l39_75 differ diff --git a/src/public/data/pack/server/maps/l39_76 b/src/public/data/pack/server/maps/l39_76 new file mode 100644 index 00000000..f76dd238 Binary files /dev/null and b/src/public/data/pack/server/maps/l39_76 differ diff --git a/src/public/data/pack/server/maps/l40_147 b/src/public/data/pack/server/maps/l40_147 new file mode 100644 index 00000000..50a526d1 Binary files /dev/null and b/src/public/data/pack/server/maps/l40_147 differ diff --git a/src/public/data/pack/server/maps/l40_148 b/src/public/data/pack/server/maps/l40_148 new file mode 100644 index 00000000..2f4ef06d Binary files /dev/null and b/src/public/data/pack/server/maps/l40_148 differ diff --git a/src/public/data/pack/server/maps/l40_149 b/src/public/data/pack/server/maps/l40_149 new file mode 100644 index 00000000..4ad5adaa Binary files /dev/null and b/src/public/data/pack/server/maps/l40_149 differ diff --git a/src/public/data/pack/server/maps/l40_150 b/src/public/data/pack/server/maps/l40_150 new file mode 100644 index 00000000..3d5a2366 Binary files /dev/null and b/src/public/data/pack/server/maps/l40_150 differ diff --git a/src/public/data/pack/server/maps/l40_151 b/src/public/data/pack/server/maps/l40_151 new file mode 100644 index 00000000..b89babb7 Binary files /dev/null and b/src/public/data/pack/server/maps/l40_151 differ diff --git a/src/public/data/pack/server/maps/l40_152 b/src/public/data/pack/server/maps/l40_152 new file mode 100644 index 00000000..8e9100c3 Binary files /dev/null and b/src/public/data/pack/server/maps/l40_152 differ diff --git a/src/public/data/pack/server/maps/l40_153 b/src/public/data/pack/server/maps/l40_153 new file mode 100644 index 00000000..5cce582d Binary files /dev/null and b/src/public/data/pack/server/maps/l40_153 differ diff --git a/src/public/data/pack/server/maps/l40_154 b/src/public/data/pack/server/maps/l40_154 new file mode 100644 index 00000000..a89f28b1 Binary files /dev/null and b/src/public/data/pack/server/maps/l40_154 differ diff --git a/src/public/data/pack/server/maps/l40_45 b/src/public/data/pack/server/maps/l40_45 new file mode 100644 index 00000000..f76dd238 Binary files /dev/null and b/src/public/data/pack/server/maps/l40_45 differ diff --git a/src/public/data/pack/server/maps/l40_46 b/src/public/data/pack/server/maps/l40_46 new file mode 100644 index 00000000..fadc0a90 Binary files /dev/null and b/src/public/data/pack/server/maps/l40_46 differ diff --git a/src/public/data/pack/server/maps/l40_47 b/src/public/data/pack/server/maps/l40_47 new file mode 100644 index 00000000..9335398c Binary files /dev/null and b/src/public/data/pack/server/maps/l40_47 differ diff --git a/src/public/data/pack/server/maps/l40_48 b/src/public/data/pack/server/maps/l40_48 new file mode 100644 index 00000000..49b2b227 Binary files /dev/null and b/src/public/data/pack/server/maps/l40_48 differ diff --git a/src/public/data/pack/server/maps/l40_49 b/src/public/data/pack/server/maps/l40_49 new file mode 100644 index 00000000..6455c834 Binary files /dev/null and b/src/public/data/pack/server/maps/l40_49 differ diff --git a/src/public/data/pack/server/maps/l40_50 b/src/public/data/pack/server/maps/l40_50 new file mode 100644 index 00000000..c4ce564a Binary files /dev/null and b/src/public/data/pack/server/maps/l40_50 differ diff --git a/src/public/data/pack/server/maps/l40_51 b/src/public/data/pack/server/maps/l40_51 new file mode 100644 index 00000000..5cc22680 Binary files /dev/null and b/src/public/data/pack/server/maps/l40_51 differ diff --git a/src/public/data/pack/server/maps/l40_52 b/src/public/data/pack/server/maps/l40_52 new file mode 100644 index 00000000..ed5fb2af Binary files /dev/null and b/src/public/data/pack/server/maps/l40_52 differ diff --git a/src/public/data/pack/server/maps/l40_53 b/src/public/data/pack/server/maps/l40_53 new file mode 100644 index 00000000..358888cf Binary files /dev/null and b/src/public/data/pack/server/maps/l40_53 differ diff --git a/src/public/data/pack/server/maps/l40_54 b/src/public/data/pack/server/maps/l40_54 new file mode 100644 index 00000000..bdad46af Binary files /dev/null and b/src/public/data/pack/server/maps/l40_54 differ diff --git a/src/public/data/pack/server/maps/l40_55 b/src/public/data/pack/server/maps/l40_55 new file mode 100644 index 00000000..f76dd238 Binary files /dev/null and b/src/public/data/pack/server/maps/l40_55 differ diff --git a/src/public/data/pack/server/maps/l40_72 b/src/public/data/pack/server/maps/l40_72 new file mode 100644 index 00000000..f76dd238 Binary files /dev/null and b/src/public/data/pack/server/maps/l40_72 differ diff --git a/src/public/data/pack/server/maps/l40_73 b/src/public/data/pack/server/maps/l40_73 new file mode 100644 index 00000000..f76dd238 Binary files /dev/null and b/src/public/data/pack/server/maps/l40_73 differ diff --git a/src/public/data/pack/server/maps/l40_74 b/src/public/data/pack/server/maps/l40_74 new file mode 100644 index 00000000..b131d91e Binary files /dev/null and b/src/public/data/pack/server/maps/l40_74 differ diff --git a/src/public/data/pack/server/maps/l40_75 b/src/public/data/pack/server/maps/l40_75 new file mode 100644 index 00000000..50fa5353 Binary files /dev/null and b/src/public/data/pack/server/maps/l40_75 differ diff --git a/src/public/data/pack/server/maps/l40_76 b/src/public/data/pack/server/maps/l40_76 new file mode 100644 index 00000000..f76dd238 Binary files /dev/null and b/src/public/data/pack/server/maps/l40_76 differ diff --git a/src/public/data/pack/server/maps/l41_146 b/src/public/data/pack/server/maps/l41_146 new file mode 100644 index 00000000..d8e65caa Binary files /dev/null and b/src/public/data/pack/server/maps/l41_146 differ diff --git a/src/public/data/pack/server/maps/l41_149 b/src/public/data/pack/server/maps/l41_149 new file mode 100644 index 00000000..5fb58fbf Binary files /dev/null and b/src/public/data/pack/server/maps/l41_149 differ diff --git a/src/public/data/pack/server/maps/l41_151 b/src/public/data/pack/server/maps/l41_151 new file mode 100644 index 00000000..ce2eee26 Binary files /dev/null and b/src/public/data/pack/server/maps/l41_151 differ diff --git a/src/public/data/pack/server/maps/l41_152 b/src/public/data/pack/server/maps/l41_152 new file mode 100644 index 00000000..015f1dfe Binary files /dev/null and b/src/public/data/pack/server/maps/l41_152 differ diff --git a/src/public/data/pack/server/maps/l41_153 b/src/public/data/pack/server/maps/l41_153 new file mode 100644 index 00000000..53149bad Binary files /dev/null and b/src/public/data/pack/server/maps/l41_153 differ diff --git a/src/public/data/pack/server/maps/l41_154 b/src/public/data/pack/server/maps/l41_154 new file mode 100644 index 00000000..36b21b29 Binary files /dev/null and b/src/public/data/pack/server/maps/l41_154 differ diff --git a/src/public/data/pack/server/maps/l41_45 b/src/public/data/pack/server/maps/l41_45 new file mode 100644 index 00000000..f76dd238 Binary files /dev/null and b/src/public/data/pack/server/maps/l41_45 differ diff --git a/src/public/data/pack/server/maps/l41_46 b/src/public/data/pack/server/maps/l41_46 new file mode 100644 index 00000000..9609ed94 Binary files /dev/null and b/src/public/data/pack/server/maps/l41_46 differ diff --git a/src/public/data/pack/server/maps/l41_47 b/src/public/data/pack/server/maps/l41_47 new file mode 100644 index 00000000..f76dd238 Binary files /dev/null and b/src/public/data/pack/server/maps/l41_47 differ diff --git a/src/public/data/pack/server/maps/l41_48 b/src/public/data/pack/server/maps/l41_48 new file mode 100644 index 00000000..34f8876d Binary files /dev/null and b/src/public/data/pack/server/maps/l41_48 differ diff --git a/src/public/data/pack/server/maps/l41_49 b/src/public/data/pack/server/maps/l41_49 new file mode 100644 index 00000000..47ad199b Binary files /dev/null and b/src/public/data/pack/server/maps/l41_49 differ diff --git a/src/public/data/pack/server/maps/l41_50 b/src/public/data/pack/server/maps/l41_50 new file mode 100644 index 00000000..df5b4a6e Binary files /dev/null and b/src/public/data/pack/server/maps/l41_50 differ diff --git a/src/public/data/pack/server/maps/l41_51 b/src/public/data/pack/server/maps/l41_51 new file mode 100644 index 00000000..0bf64e11 Binary files /dev/null and b/src/public/data/pack/server/maps/l41_51 differ diff --git a/src/public/data/pack/server/maps/l41_52 b/src/public/data/pack/server/maps/l41_52 new file mode 100644 index 00000000..f9e1e68b Binary files /dev/null and b/src/public/data/pack/server/maps/l41_52 differ diff --git a/src/public/data/pack/server/maps/l41_53 b/src/public/data/pack/server/maps/l41_53 new file mode 100644 index 00000000..27d4a1e6 Binary files /dev/null and b/src/public/data/pack/server/maps/l41_53 differ diff --git a/src/public/data/pack/server/maps/l41_54 b/src/public/data/pack/server/maps/l41_54 new file mode 100644 index 00000000..fb0a2e94 Binary files /dev/null and b/src/public/data/pack/server/maps/l41_54 differ diff --git a/src/public/data/pack/server/maps/l41_55 b/src/public/data/pack/server/maps/l41_55 new file mode 100644 index 00000000..ccb830f3 Binary files /dev/null and b/src/public/data/pack/server/maps/l41_55 differ diff --git a/src/public/data/pack/server/maps/l41_56 b/src/public/data/pack/server/maps/l41_56 new file mode 100644 index 00000000..f76dd238 Binary files /dev/null and b/src/public/data/pack/server/maps/l41_56 differ diff --git a/src/public/data/pack/server/maps/l41_72 b/src/public/data/pack/server/maps/l41_72 new file mode 100644 index 00000000..f76dd238 Binary files /dev/null and b/src/public/data/pack/server/maps/l41_72 differ diff --git a/src/public/data/pack/server/maps/l41_73 b/src/public/data/pack/server/maps/l41_73 new file mode 100644 index 00000000..1099358b Binary files /dev/null and b/src/public/data/pack/server/maps/l41_73 differ diff --git a/src/public/data/pack/server/maps/l41_74 b/src/public/data/pack/server/maps/l41_74 new file mode 100644 index 00000000..f76dd238 Binary files /dev/null and b/src/public/data/pack/server/maps/l41_74 differ diff --git a/src/public/data/pack/server/maps/l41_75 b/src/public/data/pack/server/maps/l41_75 new file mode 100644 index 00000000..fa93e59f Binary files /dev/null and b/src/public/data/pack/server/maps/l41_75 differ diff --git a/src/public/data/pack/server/maps/l42_144 b/src/public/data/pack/server/maps/l42_144 new file mode 100644 index 00000000..2dd3af7f Binary files /dev/null and b/src/public/data/pack/server/maps/l42_144 differ diff --git a/src/public/data/pack/server/maps/l42_145 b/src/public/data/pack/server/maps/l42_145 new file mode 100644 index 00000000..d70a0cb6 Binary files /dev/null and b/src/public/data/pack/server/maps/l42_145 differ diff --git a/src/public/data/pack/server/maps/l42_146 b/src/public/data/pack/server/maps/l42_146 new file mode 100644 index 00000000..af148730 Binary files /dev/null and b/src/public/data/pack/server/maps/l42_146 differ diff --git a/src/public/data/pack/server/maps/l42_151 b/src/public/data/pack/server/maps/l42_151 new file mode 100644 index 00000000..524eb7ff Binary files /dev/null and b/src/public/data/pack/server/maps/l42_151 differ diff --git a/src/public/data/pack/server/maps/l42_152 b/src/public/data/pack/server/maps/l42_152 new file mode 100644 index 00000000..9f85a43d Binary files /dev/null and b/src/public/data/pack/server/maps/l42_152 differ diff --git a/src/public/data/pack/server/maps/l42_153 b/src/public/data/pack/server/maps/l42_153 new file mode 100644 index 00000000..97284b81 Binary files /dev/null and b/src/public/data/pack/server/maps/l42_153 differ diff --git a/src/public/data/pack/server/maps/l42_49 b/src/public/data/pack/server/maps/l42_49 new file mode 100644 index 00000000..f27f7c15 Binary files /dev/null and b/src/public/data/pack/server/maps/l42_49 differ diff --git a/src/public/data/pack/server/maps/l42_50 b/src/public/data/pack/server/maps/l42_50 new file mode 100644 index 00000000..8111d75c Binary files /dev/null and b/src/public/data/pack/server/maps/l42_50 differ diff --git a/src/public/data/pack/server/maps/l42_51 b/src/public/data/pack/server/maps/l42_51 new file mode 100644 index 00000000..8d1efb97 Binary files /dev/null and b/src/public/data/pack/server/maps/l42_51 differ diff --git a/src/public/data/pack/server/maps/l42_52 b/src/public/data/pack/server/maps/l42_52 new file mode 100644 index 00000000..69c8ee6d Binary files /dev/null and b/src/public/data/pack/server/maps/l42_52 differ diff --git a/src/public/data/pack/server/maps/l42_53 b/src/public/data/pack/server/maps/l42_53 new file mode 100644 index 00000000..d110f2fc Binary files /dev/null and b/src/public/data/pack/server/maps/l42_53 differ diff --git a/src/public/data/pack/server/maps/l42_54 b/src/public/data/pack/server/maps/l42_54 new file mode 100644 index 00000000..a229f80f Binary files /dev/null and b/src/public/data/pack/server/maps/l42_54 differ diff --git a/src/public/data/pack/server/maps/l42_55 b/src/public/data/pack/server/maps/l42_55 new file mode 100644 index 00000000..a8b87769 Binary files /dev/null and b/src/public/data/pack/server/maps/l42_55 differ diff --git a/src/public/data/pack/server/maps/l42_56 b/src/public/data/pack/server/maps/l42_56 new file mode 100644 index 00000000..eb1cfac9 Binary files /dev/null and b/src/public/data/pack/server/maps/l42_56 differ diff --git a/src/public/data/pack/server/maps/l42_72 b/src/public/data/pack/server/maps/l42_72 new file mode 100644 index 00000000..f76dd238 Binary files /dev/null and b/src/public/data/pack/server/maps/l42_72 differ diff --git a/src/public/data/pack/server/maps/l42_73 b/src/public/data/pack/server/maps/l42_73 new file mode 100644 index 00000000..f76dd238 Binary files /dev/null and b/src/public/data/pack/server/maps/l42_73 differ diff --git a/src/public/data/pack/server/maps/l42_74 b/src/public/data/pack/server/maps/l42_74 new file mode 100644 index 00000000..f76dd238 Binary files /dev/null and b/src/public/data/pack/server/maps/l42_74 differ diff --git a/src/public/data/pack/server/maps/l42_75 b/src/public/data/pack/server/maps/l42_75 new file mode 100644 index 00000000..6353656f Binary files /dev/null and b/src/public/data/pack/server/maps/l42_75 differ diff --git a/src/public/data/pack/server/maps/l43_144 b/src/public/data/pack/server/maps/l43_144 new file mode 100644 index 00000000..9e4617d5 Binary files /dev/null and b/src/public/data/pack/server/maps/l43_144 differ diff --git a/src/public/data/pack/server/maps/l43_145 b/src/public/data/pack/server/maps/l43_145 new file mode 100644 index 00000000..3a7b2495 Binary files /dev/null and b/src/public/data/pack/server/maps/l43_145 differ diff --git a/src/public/data/pack/server/maps/l43_146 b/src/public/data/pack/server/maps/l43_146 new file mode 100644 index 00000000..80ebdc29 Binary files /dev/null and b/src/public/data/pack/server/maps/l43_146 differ diff --git a/src/public/data/pack/server/maps/l43_153 b/src/public/data/pack/server/maps/l43_153 new file mode 100644 index 00000000..73abd488 Binary files /dev/null and b/src/public/data/pack/server/maps/l43_153 differ diff --git a/src/public/data/pack/server/maps/l43_154 b/src/public/data/pack/server/maps/l43_154 new file mode 100644 index 00000000..a45e53d1 Binary files /dev/null and b/src/public/data/pack/server/maps/l43_154 differ diff --git a/src/public/data/pack/server/maps/l43_45 b/src/public/data/pack/server/maps/l43_45 new file mode 100644 index 00000000..ba583e8e Binary files /dev/null and b/src/public/data/pack/server/maps/l43_45 differ diff --git a/src/public/data/pack/server/maps/l43_46 b/src/public/data/pack/server/maps/l43_46 new file mode 100644 index 00000000..c4a24362 Binary files /dev/null and b/src/public/data/pack/server/maps/l43_46 differ diff --git a/src/public/data/pack/server/maps/l43_47 b/src/public/data/pack/server/maps/l43_47 new file mode 100644 index 00000000..0e9e1d3d Binary files /dev/null and b/src/public/data/pack/server/maps/l43_47 differ diff --git a/src/public/data/pack/server/maps/l43_48 b/src/public/data/pack/server/maps/l43_48 new file mode 100644 index 00000000..499ea7c8 Binary files /dev/null and b/src/public/data/pack/server/maps/l43_48 differ diff --git a/src/public/data/pack/server/maps/l43_49 b/src/public/data/pack/server/maps/l43_49 new file mode 100644 index 00000000..b9f382a0 Binary files /dev/null and b/src/public/data/pack/server/maps/l43_49 differ diff --git a/src/public/data/pack/server/maps/l43_50 b/src/public/data/pack/server/maps/l43_50 new file mode 100644 index 00000000..c23e60a7 Binary files /dev/null and b/src/public/data/pack/server/maps/l43_50 differ diff --git a/src/public/data/pack/server/maps/l43_51 b/src/public/data/pack/server/maps/l43_51 new file mode 100644 index 00000000..8f821c5f Binary files /dev/null and b/src/public/data/pack/server/maps/l43_51 differ diff --git a/src/public/data/pack/server/maps/l43_52 b/src/public/data/pack/server/maps/l43_52 new file mode 100644 index 00000000..fdfc2f40 Binary files /dev/null and b/src/public/data/pack/server/maps/l43_52 differ diff --git a/src/public/data/pack/server/maps/l43_53 b/src/public/data/pack/server/maps/l43_53 new file mode 100644 index 00000000..71afaad3 Binary files /dev/null and b/src/public/data/pack/server/maps/l43_53 differ diff --git a/src/public/data/pack/server/maps/l43_54 b/src/public/data/pack/server/maps/l43_54 new file mode 100644 index 00000000..4974988c Binary files /dev/null and b/src/public/data/pack/server/maps/l43_54 differ diff --git a/src/public/data/pack/server/maps/l43_55 b/src/public/data/pack/server/maps/l43_55 new file mode 100644 index 00000000..856cb339 Binary files /dev/null and b/src/public/data/pack/server/maps/l43_55 differ diff --git a/src/public/data/pack/server/maps/l43_56 b/src/public/data/pack/server/maps/l43_56 new file mode 100644 index 00000000..10b3e54e Binary files /dev/null and b/src/public/data/pack/server/maps/l43_56 differ diff --git a/src/public/data/pack/server/maps/l43_72 b/src/public/data/pack/server/maps/l43_72 new file mode 100644 index 00000000..f76dd238 Binary files /dev/null and b/src/public/data/pack/server/maps/l43_72 differ diff --git a/src/public/data/pack/server/maps/l43_73 b/src/public/data/pack/server/maps/l43_73 new file mode 100644 index 00000000..75e3bf11 Binary files /dev/null and b/src/public/data/pack/server/maps/l43_73 differ diff --git a/src/public/data/pack/server/maps/l43_74 b/src/public/data/pack/server/maps/l43_74 new file mode 100644 index 00000000..f76dd238 Binary files /dev/null and b/src/public/data/pack/server/maps/l43_74 differ diff --git a/src/public/data/pack/server/maps/l43_75 b/src/public/data/pack/server/maps/l43_75 new file mode 100644 index 00000000..47042847 Binary files /dev/null and b/src/public/data/pack/server/maps/l43_75 differ diff --git a/src/public/data/pack/server/maps/l44_144 b/src/public/data/pack/server/maps/l44_144 new file mode 100644 index 00000000..617a683e Binary files /dev/null and b/src/public/data/pack/server/maps/l44_144 differ diff --git a/src/public/data/pack/server/maps/l44_145 b/src/public/data/pack/server/maps/l44_145 new file mode 100644 index 00000000..ebf5159a Binary files /dev/null and b/src/public/data/pack/server/maps/l44_145 differ diff --git a/src/public/data/pack/server/maps/l44_146 b/src/public/data/pack/server/maps/l44_146 new file mode 100644 index 00000000..90c3f863 Binary files /dev/null and b/src/public/data/pack/server/maps/l44_146 differ diff --git a/src/public/data/pack/server/maps/l44_148 b/src/public/data/pack/server/maps/l44_148 new file mode 100644 index 00000000..a5dc0612 Binary files /dev/null and b/src/public/data/pack/server/maps/l44_148 differ diff --git a/src/public/data/pack/server/maps/l44_149 b/src/public/data/pack/server/maps/l44_149 new file mode 100644 index 00000000..94c6700c Binary files /dev/null and b/src/public/data/pack/server/maps/l44_149 differ diff --git a/src/public/data/pack/server/maps/l44_150 b/src/public/data/pack/server/maps/l44_150 new file mode 100644 index 00000000..f3c32c0b Binary files /dev/null and b/src/public/data/pack/server/maps/l44_150 differ diff --git a/src/public/data/pack/server/maps/l44_151 b/src/public/data/pack/server/maps/l44_151 new file mode 100644 index 00000000..fceea9d1 Binary files /dev/null and b/src/public/data/pack/server/maps/l44_151 differ diff --git a/src/public/data/pack/server/maps/l44_152 b/src/public/data/pack/server/maps/l44_152 new file mode 100644 index 00000000..d793dea9 Binary files /dev/null and b/src/public/data/pack/server/maps/l44_152 differ diff --git a/src/public/data/pack/server/maps/l44_153 b/src/public/data/pack/server/maps/l44_153 new file mode 100644 index 00000000..bddb1767 Binary files /dev/null and b/src/public/data/pack/server/maps/l44_153 differ diff --git a/src/public/data/pack/server/maps/l44_154 b/src/public/data/pack/server/maps/l44_154 new file mode 100644 index 00000000..73ab2b7c Binary files /dev/null and b/src/public/data/pack/server/maps/l44_154 differ diff --git a/src/public/data/pack/server/maps/l44_155 b/src/public/data/pack/server/maps/l44_155 new file mode 100644 index 00000000..bacc9c31 Binary files /dev/null and b/src/public/data/pack/server/maps/l44_155 differ diff --git a/src/public/data/pack/server/maps/l44_45 b/src/public/data/pack/server/maps/l44_45 new file mode 100644 index 00000000..470538a1 Binary files /dev/null and b/src/public/data/pack/server/maps/l44_45 differ diff --git a/src/public/data/pack/server/maps/l44_46 b/src/public/data/pack/server/maps/l44_46 new file mode 100644 index 00000000..ade6c312 Binary files /dev/null and b/src/public/data/pack/server/maps/l44_46 differ diff --git a/src/public/data/pack/server/maps/l44_47 b/src/public/data/pack/server/maps/l44_47 new file mode 100644 index 00000000..70d255aa Binary files /dev/null and b/src/public/data/pack/server/maps/l44_47 differ diff --git a/src/public/data/pack/server/maps/l44_48 b/src/public/data/pack/server/maps/l44_48 new file mode 100644 index 00000000..036d9027 Binary files /dev/null and b/src/public/data/pack/server/maps/l44_48 differ diff --git a/src/public/data/pack/server/maps/l44_49 b/src/public/data/pack/server/maps/l44_49 new file mode 100644 index 00000000..a66abdec Binary files /dev/null and b/src/public/data/pack/server/maps/l44_49 differ diff --git a/src/public/data/pack/server/maps/l44_50 b/src/public/data/pack/server/maps/l44_50 new file mode 100644 index 00000000..f8f4f23d Binary files /dev/null and b/src/public/data/pack/server/maps/l44_50 differ diff --git a/src/public/data/pack/server/maps/l44_51 b/src/public/data/pack/server/maps/l44_51 new file mode 100644 index 00000000..6724b093 Binary files /dev/null and b/src/public/data/pack/server/maps/l44_51 differ diff --git a/src/public/data/pack/server/maps/l44_52 b/src/public/data/pack/server/maps/l44_52 new file mode 100644 index 00000000..22984a28 Binary files /dev/null and b/src/public/data/pack/server/maps/l44_52 differ diff --git a/src/public/data/pack/server/maps/l44_53 b/src/public/data/pack/server/maps/l44_53 new file mode 100644 index 00000000..ec7a7172 Binary files /dev/null and b/src/public/data/pack/server/maps/l44_53 differ diff --git a/src/public/data/pack/server/maps/l44_54 b/src/public/data/pack/server/maps/l44_54 new file mode 100644 index 00000000..df802089 Binary files /dev/null and b/src/public/data/pack/server/maps/l44_54 differ diff --git a/src/public/data/pack/server/maps/l44_55 b/src/public/data/pack/server/maps/l44_55 new file mode 100644 index 00000000..be1e524f Binary files /dev/null and b/src/public/data/pack/server/maps/l44_55 differ diff --git a/src/public/data/pack/server/maps/l44_72 b/src/public/data/pack/server/maps/l44_72 new file mode 100644 index 00000000..f76dd238 Binary files /dev/null and b/src/public/data/pack/server/maps/l44_72 differ diff --git a/src/public/data/pack/server/maps/l44_73 b/src/public/data/pack/server/maps/l44_73 new file mode 100644 index 00000000..f76dd238 Binary files /dev/null and b/src/public/data/pack/server/maps/l44_73 differ diff --git a/src/public/data/pack/server/maps/l44_74 b/src/public/data/pack/server/maps/l44_74 new file mode 100644 index 00000000..f76dd238 Binary files /dev/null and b/src/public/data/pack/server/maps/l44_74 differ diff --git a/src/public/data/pack/server/maps/l44_75 b/src/public/data/pack/server/maps/l44_75 new file mode 100644 index 00000000..cf45eeab Binary files /dev/null and b/src/public/data/pack/server/maps/l44_75 differ diff --git a/src/public/data/pack/server/maps/l45_145 b/src/public/data/pack/server/maps/l45_145 new file mode 100644 index 00000000..73b9caeb Binary files /dev/null and b/src/public/data/pack/server/maps/l45_145 differ diff --git a/src/public/data/pack/server/maps/l45_146 b/src/public/data/pack/server/maps/l45_146 new file mode 100644 index 00000000..bf6a3c20 Binary files /dev/null and b/src/public/data/pack/server/maps/l45_146 differ diff --git a/src/public/data/pack/server/maps/l45_148 b/src/public/data/pack/server/maps/l45_148 new file mode 100644 index 00000000..30968170 Binary files /dev/null and b/src/public/data/pack/server/maps/l45_148 differ diff --git a/src/public/data/pack/server/maps/l45_150 b/src/public/data/pack/server/maps/l45_150 new file mode 100644 index 00000000..fb6f0e19 Binary files /dev/null and b/src/public/data/pack/server/maps/l45_150 differ diff --git a/src/public/data/pack/server/maps/l45_151 b/src/public/data/pack/server/maps/l45_151 new file mode 100644 index 00000000..047739a7 Binary files /dev/null and b/src/public/data/pack/server/maps/l45_151 differ diff --git a/src/public/data/pack/server/maps/l45_152 b/src/public/data/pack/server/maps/l45_152 new file mode 100644 index 00000000..b1450f49 Binary files /dev/null and b/src/public/data/pack/server/maps/l45_152 differ diff --git a/src/public/data/pack/server/maps/l45_153 b/src/public/data/pack/server/maps/l45_153 new file mode 100644 index 00000000..8bdd188b Binary files /dev/null and b/src/public/data/pack/server/maps/l45_153 differ diff --git a/src/public/data/pack/server/maps/l45_154 b/src/public/data/pack/server/maps/l45_154 new file mode 100644 index 00000000..75bcb42f Binary files /dev/null and b/src/public/data/pack/server/maps/l45_154 differ diff --git a/src/public/data/pack/server/maps/l45_155 b/src/public/data/pack/server/maps/l45_155 new file mode 100644 index 00000000..52157c16 Binary files /dev/null and b/src/public/data/pack/server/maps/l45_155 differ diff --git a/src/public/data/pack/server/maps/l45_45 b/src/public/data/pack/server/maps/l45_45 new file mode 100644 index 00000000..4f87a7d7 Binary files /dev/null and b/src/public/data/pack/server/maps/l45_45 differ diff --git a/src/public/data/pack/server/maps/l45_46 b/src/public/data/pack/server/maps/l45_46 new file mode 100644 index 00000000..d9495e7f Binary files /dev/null and b/src/public/data/pack/server/maps/l45_46 differ diff --git a/src/public/data/pack/server/maps/l45_47 b/src/public/data/pack/server/maps/l45_47 new file mode 100644 index 00000000..81d78791 Binary files /dev/null and b/src/public/data/pack/server/maps/l45_47 differ diff --git a/src/public/data/pack/server/maps/l45_48 b/src/public/data/pack/server/maps/l45_48 new file mode 100644 index 00000000..cb95c02e Binary files /dev/null and b/src/public/data/pack/server/maps/l45_48 differ diff --git a/src/public/data/pack/server/maps/l45_49 b/src/public/data/pack/server/maps/l45_49 new file mode 100644 index 00000000..41a1da19 Binary files /dev/null and b/src/public/data/pack/server/maps/l45_49 differ diff --git a/src/public/data/pack/server/maps/l45_50 b/src/public/data/pack/server/maps/l45_50 new file mode 100644 index 00000000..54ceba24 Binary files /dev/null and b/src/public/data/pack/server/maps/l45_50 differ diff --git a/src/public/data/pack/server/maps/l45_51 b/src/public/data/pack/server/maps/l45_51 new file mode 100644 index 00000000..792a5419 Binary files /dev/null and b/src/public/data/pack/server/maps/l45_51 differ diff --git a/src/public/data/pack/server/maps/l45_52 b/src/public/data/pack/server/maps/l45_52 new file mode 100644 index 00000000..a02eede5 Binary files /dev/null and b/src/public/data/pack/server/maps/l45_52 differ diff --git a/src/public/data/pack/server/maps/l45_53 b/src/public/data/pack/server/maps/l45_53 new file mode 100644 index 00000000..ba2865fa Binary files /dev/null and b/src/public/data/pack/server/maps/l45_53 differ diff --git a/src/public/data/pack/server/maps/l45_54 b/src/public/data/pack/server/maps/l45_54 new file mode 100644 index 00000000..e1c588e3 Binary files /dev/null and b/src/public/data/pack/server/maps/l45_54 differ diff --git a/src/public/data/pack/server/maps/l45_55 b/src/public/data/pack/server/maps/l45_55 new file mode 100644 index 00000000..5b4c91b7 Binary files /dev/null and b/src/public/data/pack/server/maps/l45_55 differ diff --git a/src/public/data/pack/server/maps/l45_56 b/src/public/data/pack/server/maps/l45_56 new file mode 100644 index 00000000..64019959 Binary files /dev/null and b/src/public/data/pack/server/maps/l45_56 differ diff --git a/src/public/data/pack/server/maps/l45_57 b/src/public/data/pack/server/maps/l45_57 new file mode 100644 index 00000000..a3ae99e6 Binary files /dev/null and b/src/public/data/pack/server/maps/l45_57 differ diff --git a/src/public/data/pack/server/maps/l45_58 b/src/public/data/pack/server/maps/l45_58 new file mode 100644 index 00000000..161e2f9d Binary files /dev/null and b/src/public/data/pack/server/maps/l45_58 differ diff --git a/src/public/data/pack/server/maps/l45_59 b/src/public/data/pack/server/maps/l45_59 new file mode 100644 index 00000000..ba157d2b Binary files /dev/null and b/src/public/data/pack/server/maps/l45_59 differ diff --git a/src/public/data/pack/server/maps/l45_60 b/src/public/data/pack/server/maps/l45_60 new file mode 100644 index 00000000..4b29cb82 Binary files /dev/null and b/src/public/data/pack/server/maps/l45_60 differ diff --git a/src/public/data/pack/server/maps/l45_61 b/src/public/data/pack/server/maps/l45_61 new file mode 100644 index 00000000..f76dd238 Binary files /dev/null and b/src/public/data/pack/server/maps/l45_61 differ diff --git a/src/public/data/pack/server/maps/l45_62 b/src/public/data/pack/server/maps/l45_62 new file mode 100644 index 00000000..f76dd238 Binary files /dev/null and b/src/public/data/pack/server/maps/l45_62 differ diff --git a/src/public/data/pack/server/maps/l45_73 b/src/public/data/pack/server/maps/l45_73 new file mode 100644 index 00000000..ffd99663 Binary files /dev/null and b/src/public/data/pack/server/maps/l45_73 differ diff --git a/src/public/data/pack/server/maps/l45_74 b/src/public/data/pack/server/maps/l45_74 new file mode 100644 index 00000000..f76dd238 Binary files /dev/null and b/src/public/data/pack/server/maps/l45_74 differ diff --git a/src/public/data/pack/server/maps/l45_75 b/src/public/data/pack/server/maps/l45_75 new file mode 100644 index 00000000..9d0fae9b Binary files /dev/null and b/src/public/data/pack/server/maps/l45_75 differ diff --git a/src/public/data/pack/server/maps/l45_76 b/src/public/data/pack/server/maps/l45_76 new file mode 100644 index 00000000..c0d78d4d Binary files /dev/null and b/src/public/data/pack/server/maps/l45_76 differ diff --git a/src/public/data/pack/server/maps/l46_149 b/src/public/data/pack/server/maps/l46_149 new file mode 100644 index 00000000..e8f151d3 Binary files /dev/null and b/src/public/data/pack/server/maps/l46_149 differ diff --git a/src/public/data/pack/server/maps/l46_150 b/src/public/data/pack/server/maps/l46_150 new file mode 100644 index 00000000..83d5b27d Binary files /dev/null and b/src/public/data/pack/server/maps/l46_150 differ diff --git a/src/public/data/pack/server/maps/l46_152 b/src/public/data/pack/server/maps/l46_152 new file mode 100644 index 00000000..fd352300 Binary files /dev/null and b/src/public/data/pack/server/maps/l46_152 differ diff --git a/src/public/data/pack/server/maps/l46_153 b/src/public/data/pack/server/maps/l46_153 new file mode 100644 index 00000000..aa89c73a Binary files /dev/null and b/src/public/data/pack/server/maps/l46_153 differ diff --git a/src/public/data/pack/server/maps/l46_154 b/src/public/data/pack/server/maps/l46_154 new file mode 100644 index 00000000..7e6bf069 Binary files /dev/null and b/src/public/data/pack/server/maps/l46_154 differ diff --git a/src/public/data/pack/server/maps/l46_161 b/src/public/data/pack/server/maps/l46_161 new file mode 100644 index 00000000..e65f3925 Binary files /dev/null and b/src/public/data/pack/server/maps/l46_161 differ diff --git a/src/public/data/pack/server/maps/l46_45 b/src/public/data/pack/server/maps/l46_45 new file mode 100644 index 00000000..fa545774 Binary files /dev/null and b/src/public/data/pack/server/maps/l46_45 differ diff --git a/src/public/data/pack/server/maps/l46_46 b/src/public/data/pack/server/maps/l46_46 new file mode 100644 index 00000000..d7b5aa6e Binary files /dev/null and b/src/public/data/pack/server/maps/l46_46 differ diff --git a/src/public/data/pack/server/maps/l46_47 b/src/public/data/pack/server/maps/l46_47 new file mode 100644 index 00000000..7ddd201a Binary files /dev/null and b/src/public/data/pack/server/maps/l46_47 differ diff --git a/src/public/data/pack/server/maps/l46_48 b/src/public/data/pack/server/maps/l46_48 new file mode 100644 index 00000000..f76dd238 Binary files /dev/null and b/src/public/data/pack/server/maps/l46_48 differ diff --git a/src/public/data/pack/server/maps/l46_49 b/src/public/data/pack/server/maps/l46_49 new file mode 100644 index 00000000..4e2c6c8b Binary files /dev/null and b/src/public/data/pack/server/maps/l46_49 differ diff --git a/src/public/data/pack/server/maps/l46_50 b/src/public/data/pack/server/maps/l46_50 new file mode 100644 index 00000000..de915890 Binary files /dev/null and b/src/public/data/pack/server/maps/l46_50 differ diff --git a/src/public/data/pack/server/maps/l46_51 b/src/public/data/pack/server/maps/l46_51 new file mode 100644 index 00000000..a50ee690 Binary files /dev/null and b/src/public/data/pack/server/maps/l46_51 differ diff --git a/src/public/data/pack/server/maps/l46_52 b/src/public/data/pack/server/maps/l46_52 new file mode 100644 index 00000000..c16398ff Binary files /dev/null and b/src/public/data/pack/server/maps/l46_52 differ diff --git a/src/public/data/pack/server/maps/l46_53 b/src/public/data/pack/server/maps/l46_53 new file mode 100644 index 00000000..010ef62a Binary files /dev/null and b/src/public/data/pack/server/maps/l46_53 differ diff --git a/src/public/data/pack/server/maps/l46_54 b/src/public/data/pack/server/maps/l46_54 new file mode 100644 index 00000000..718477fe Binary files /dev/null and b/src/public/data/pack/server/maps/l46_54 differ diff --git a/src/public/data/pack/server/maps/l46_55 b/src/public/data/pack/server/maps/l46_55 new file mode 100644 index 00000000..733479a7 Binary files /dev/null and b/src/public/data/pack/server/maps/l46_55 differ diff --git a/src/public/data/pack/server/maps/l46_56 b/src/public/data/pack/server/maps/l46_56 new file mode 100644 index 00000000..cf2a7abb Binary files /dev/null and b/src/public/data/pack/server/maps/l46_56 differ diff --git a/src/public/data/pack/server/maps/l46_57 b/src/public/data/pack/server/maps/l46_57 new file mode 100644 index 00000000..ec45f1ff Binary files /dev/null and b/src/public/data/pack/server/maps/l46_57 differ diff --git a/src/public/data/pack/server/maps/l46_58 b/src/public/data/pack/server/maps/l46_58 new file mode 100644 index 00000000..96a3c3a9 Binary files /dev/null and b/src/public/data/pack/server/maps/l46_58 differ diff --git a/src/public/data/pack/server/maps/l46_59 b/src/public/data/pack/server/maps/l46_59 new file mode 100644 index 00000000..a3eb1926 Binary files /dev/null and b/src/public/data/pack/server/maps/l46_59 differ diff --git a/src/public/data/pack/server/maps/l46_60 b/src/public/data/pack/server/maps/l46_60 new file mode 100644 index 00000000..927713fb Binary files /dev/null and b/src/public/data/pack/server/maps/l46_60 differ diff --git a/src/public/data/pack/server/maps/l46_61 b/src/public/data/pack/server/maps/l46_61 new file mode 100644 index 00000000..a28c0085 Binary files /dev/null and b/src/public/data/pack/server/maps/l46_61 differ diff --git a/src/public/data/pack/server/maps/l46_62 b/src/public/data/pack/server/maps/l46_62 new file mode 100644 index 00000000..f76dd238 Binary files /dev/null and b/src/public/data/pack/server/maps/l46_62 differ diff --git a/src/public/data/pack/server/maps/l46_75 b/src/public/data/pack/server/maps/l46_75 new file mode 100644 index 00000000..f76dd238 Binary files /dev/null and b/src/public/data/pack/server/maps/l46_75 differ diff --git a/src/public/data/pack/server/maps/l47_148 b/src/public/data/pack/server/maps/l47_148 new file mode 100644 index 00000000..2f2c6501 Binary files /dev/null and b/src/public/data/pack/server/maps/l47_148 differ diff --git a/src/public/data/pack/server/maps/l47_149 b/src/public/data/pack/server/maps/l47_149 new file mode 100644 index 00000000..52ceb768 Binary files /dev/null and b/src/public/data/pack/server/maps/l47_149 differ diff --git a/src/public/data/pack/server/maps/l47_150 b/src/public/data/pack/server/maps/l47_150 new file mode 100644 index 00000000..3ff3cf0b Binary files /dev/null and b/src/public/data/pack/server/maps/l47_150 differ diff --git a/src/public/data/pack/server/maps/l47_152 b/src/public/data/pack/server/maps/l47_152 new file mode 100644 index 00000000..251b0f4c Binary files /dev/null and b/src/public/data/pack/server/maps/l47_152 differ diff --git a/src/public/data/pack/server/maps/l47_153 b/src/public/data/pack/server/maps/l47_153 new file mode 100644 index 00000000..57c8b390 Binary files /dev/null and b/src/public/data/pack/server/maps/l47_153 differ diff --git a/src/public/data/pack/server/maps/l47_160 b/src/public/data/pack/server/maps/l47_160 new file mode 100644 index 00000000..edcdce3c Binary files /dev/null and b/src/public/data/pack/server/maps/l47_160 differ diff --git a/src/public/data/pack/server/maps/l47_161 b/src/public/data/pack/server/maps/l47_161 new file mode 100644 index 00000000..fea564e7 Binary files /dev/null and b/src/public/data/pack/server/maps/l47_161 differ diff --git a/src/public/data/pack/server/maps/l47_47 b/src/public/data/pack/server/maps/l47_47 new file mode 100644 index 00000000..be6a1378 Binary files /dev/null and b/src/public/data/pack/server/maps/l47_47 differ diff --git a/src/public/data/pack/server/maps/l47_48 b/src/public/data/pack/server/maps/l47_48 new file mode 100644 index 00000000..984799a8 Binary files /dev/null and b/src/public/data/pack/server/maps/l47_48 differ diff --git a/src/public/data/pack/server/maps/l47_49 b/src/public/data/pack/server/maps/l47_49 new file mode 100644 index 00000000..68728a48 Binary files /dev/null and b/src/public/data/pack/server/maps/l47_49 differ diff --git a/src/public/data/pack/server/maps/l47_50 b/src/public/data/pack/server/maps/l47_50 new file mode 100644 index 00000000..1cc25ffb Binary files /dev/null and b/src/public/data/pack/server/maps/l47_50 differ diff --git a/src/public/data/pack/server/maps/l47_51 b/src/public/data/pack/server/maps/l47_51 new file mode 100644 index 00000000..4d46f175 Binary files /dev/null and b/src/public/data/pack/server/maps/l47_51 differ diff --git a/src/public/data/pack/server/maps/l47_52 b/src/public/data/pack/server/maps/l47_52 new file mode 100644 index 00000000..e0d8f803 Binary files /dev/null and b/src/public/data/pack/server/maps/l47_52 differ diff --git a/src/public/data/pack/server/maps/l47_53 b/src/public/data/pack/server/maps/l47_53 new file mode 100644 index 00000000..30457986 Binary files /dev/null and b/src/public/data/pack/server/maps/l47_53 differ diff --git a/src/public/data/pack/server/maps/l47_54 b/src/public/data/pack/server/maps/l47_54 new file mode 100644 index 00000000..ac4cbc27 Binary files /dev/null and b/src/public/data/pack/server/maps/l47_54 differ diff --git a/src/public/data/pack/server/maps/l47_55 b/src/public/data/pack/server/maps/l47_55 new file mode 100644 index 00000000..f7194724 Binary files /dev/null and b/src/public/data/pack/server/maps/l47_55 differ diff --git a/src/public/data/pack/server/maps/l47_56 b/src/public/data/pack/server/maps/l47_56 new file mode 100644 index 00000000..b2294105 Binary files /dev/null and b/src/public/data/pack/server/maps/l47_56 differ diff --git a/src/public/data/pack/server/maps/l47_57 b/src/public/data/pack/server/maps/l47_57 new file mode 100644 index 00000000..c9eeb489 Binary files /dev/null and b/src/public/data/pack/server/maps/l47_57 differ diff --git a/src/public/data/pack/server/maps/l47_58 b/src/public/data/pack/server/maps/l47_58 new file mode 100644 index 00000000..6103afc8 Binary files /dev/null and b/src/public/data/pack/server/maps/l47_58 differ diff --git a/src/public/data/pack/server/maps/l47_59 b/src/public/data/pack/server/maps/l47_59 new file mode 100644 index 00000000..8b6e53b2 Binary files /dev/null and b/src/public/data/pack/server/maps/l47_59 differ diff --git a/src/public/data/pack/server/maps/l47_60 b/src/public/data/pack/server/maps/l47_60 new file mode 100644 index 00000000..a074b3e2 Binary files /dev/null and b/src/public/data/pack/server/maps/l47_60 differ diff --git a/src/public/data/pack/server/maps/l47_61 b/src/public/data/pack/server/maps/l47_61 new file mode 100644 index 00000000..faf0174b Binary files /dev/null and b/src/public/data/pack/server/maps/l47_61 differ diff --git a/src/public/data/pack/server/maps/l47_62 b/src/public/data/pack/server/maps/l47_62 new file mode 100644 index 00000000..f76dd238 Binary files /dev/null and b/src/public/data/pack/server/maps/l47_62 differ diff --git a/src/public/data/pack/server/maps/l47_75 b/src/public/data/pack/server/maps/l47_75 new file mode 100644 index 00000000..f76dd238 Binary files /dev/null and b/src/public/data/pack/server/maps/l47_75 differ diff --git a/src/public/data/pack/server/maps/l48_148 b/src/public/data/pack/server/maps/l48_148 new file mode 100644 index 00000000..8e5af8ea Binary files /dev/null and b/src/public/data/pack/server/maps/l48_148 differ diff --git a/src/public/data/pack/server/maps/l48_149 b/src/public/data/pack/server/maps/l48_149 new file mode 100644 index 00000000..c048dfff Binary files /dev/null and b/src/public/data/pack/server/maps/l48_149 differ diff --git a/src/public/data/pack/server/maps/l48_152 b/src/public/data/pack/server/maps/l48_152 new file mode 100644 index 00000000..f65716e2 Binary files /dev/null and b/src/public/data/pack/server/maps/l48_152 differ diff --git a/src/public/data/pack/server/maps/l48_153 b/src/public/data/pack/server/maps/l48_153 new file mode 100644 index 00000000..0f8b6ab2 Binary files /dev/null and b/src/public/data/pack/server/maps/l48_153 differ diff --git a/src/public/data/pack/server/maps/l48_154 b/src/public/data/pack/server/maps/l48_154 new file mode 100644 index 00000000..9c16785a Binary files /dev/null and b/src/public/data/pack/server/maps/l48_154 differ diff --git a/src/public/data/pack/server/maps/l48_155 b/src/public/data/pack/server/maps/l48_155 new file mode 100644 index 00000000..1812698f Binary files /dev/null and b/src/public/data/pack/server/maps/l48_155 differ diff --git a/src/public/data/pack/server/maps/l48_156 b/src/public/data/pack/server/maps/l48_156 new file mode 100644 index 00000000..5659b0f7 Binary files /dev/null and b/src/public/data/pack/server/maps/l48_156 differ diff --git a/src/public/data/pack/server/maps/l48_47 b/src/public/data/pack/server/maps/l48_47 new file mode 100644 index 00000000..2ed1cbc1 Binary files /dev/null and b/src/public/data/pack/server/maps/l48_47 differ diff --git a/src/public/data/pack/server/maps/l48_48 b/src/public/data/pack/server/maps/l48_48 new file mode 100644 index 00000000..218d7d4d Binary files /dev/null and b/src/public/data/pack/server/maps/l48_48 differ diff --git a/src/public/data/pack/server/maps/l48_49 b/src/public/data/pack/server/maps/l48_49 new file mode 100644 index 00000000..f56e59d7 Binary files /dev/null and b/src/public/data/pack/server/maps/l48_49 differ diff --git a/src/public/data/pack/server/maps/l48_50 b/src/public/data/pack/server/maps/l48_50 new file mode 100644 index 00000000..9c557f8e Binary files /dev/null and b/src/public/data/pack/server/maps/l48_50 differ diff --git a/src/public/data/pack/server/maps/l48_51 b/src/public/data/pack/server/maps/l48_51 new file mode 100644 index 00000000..716208f9 Binary files /dev/null and b/src/public/data/pack/server/maps/l48_51 differ diff --git a/src/public/data/pack/server/maps/l48_52 b/src/public/data/pack/server/maps/l48_52 new file mode 100644 index 00000000..21bb5622 Binary files /dev/null and b/src/public/data/pack/server/maps/l48_52 differ diff --git a/src/public/data/pack/server/maps/l48_53 b/src/public/data/pack/server/maps/l48_53 new file mode 100644 index 00000000..5d64aefd Binary files /dev/null and b/src/public/data/pack/server/maps/l48_53 differ diff --git a/src/public/data/pack/server/maps/l48_54 b/src/public/data/pack/server/maps/l48_54 new file mode 100644 index 00000000..98cbf250 Binary files /dev/null and b/src/public/data/pack/server/maps/l48_54 differ diff --git a/src/public/data/pack/server/maps/l48_55 b/src/public/data/pack/server/maps/l48_55 new file mode 100644 index 00000000..3b9e163f Binary files /dev/null and b/src/public/data/pack/server/maps/l48_55 differ diff --git a/src/public/data/pack/server/maps/l48_56 b/src/public/data/pack/server/maps/l48_56 new file mode 100644 index 00000000..50134671 Binary files /dev/null and b/src/public/data/pack/server/maps/l48_56 differ diff --git a/src/public/data/pack/server/maps/l48_57 b/src/public/data/pack/server/maps/l48_57 new file mode 100644 index 00000000..7fa25482 Binary files /dev/null and b/src/public/data/pack/server/maps/l48_57 differ diff --git a/src/public/data/pack/server/maps/l48_58 b/src/public/data/pack/server/maps/l48_58 new file mode 100644 index 00000000..9c859d8c Binary files /dev/null and b/src/public/data/pack/server/maps/l48_58 differ diff --git a/src/public/data/pack/server/maps/l48_59 b/src/public/data/pack/server/maps/l48_59 new file mode 100644 index 00000000..4c4f7f5a Binary files /dev/null and b/src/public/data/pack/server/maps/l48_59 differ diff --git a/src/public/data/pack/server/maps/l48_60 b/src/public/data/pack/server/maps/l48_60 new file mode 100644 index 00000000..60afd2ea Binary files /dev/null and b/src/public/data/pack/server/maps/l48_60 differ diff --git a/src/public/data/pack/server/maps/l48_61 b/src/public/data/pack/server/maps/l48_61 new file mode 100644 index 00000000..c0a21976 Binary files /dev/null and b/src/public/data/pack/server/maps/l48_61 differ diff --git a/src/public/data/pack/server/maps/l48_62 b/src/public/data/pack/server/maps/l48_62 new file mode 100644 index 00000000..f76dd238 Binary files /dev/null and b/src/public/data/pack/server/maps/l48_62 differ diff --git a/src/public/data/pack/server/maps/l49_148 b/src/public/data/pack/server/maps/l49_148 new file mode 100644 index 00000000..b64ec525 Binary files /dev/null and b/src/public/data/pack/server/maps/l49_148 differ diff --git a/src/public/data/pack/server/maps/l49_149 b/src/public/data/pack/server/maps/l49_149 new file mode 100644 index 00000000..b5b4323f Binary files /dev/null and b/src/public/data/pack/server/maps/l49_149 differ diff --git a/src/public/data/pack/server/maps/l49_153 b/src/public/data/pack/server/maps/l49_153 new file mode 100644 index 00000000..9fcbdf63 Binary files /dev/null and b/src/public/data/pack/server/maps/l49_153 differ diff --git a/src/public/data/pack/server/maps/l49_154 b/src/public/data/pack/server/maps/l49_154 new file mode 100644 index 00000000..a0e099c2 Binary files /dev/null and b/src/public/data/pack/server/maps/l49_154 differ diff --git a/src/public/data/pack/server/maps/l49_155 b/src/public/data/pack/server/maps/l49_155 new file mode 100644 index 00000000..90706119 Binary files /dev/null and b/src/public/data/pack/server/maps/l49_155 differ diff --git a/src/public/data/pack/server/maps/l49_156 b/src/public/data/pack/server/maps/l49_156 new file mode 100644 index 00000000..faacbec7 Binary files /dev/null and b/src/public/data/pack/server/maps/l49_156 differ diff --git a/src/public/data/pack/server/maps/l49_46 b/src/public/data/pack/server/maps/l49_46 new file mode 100644 index 00000000..f76dd238 Binary files /dev/null and b/src/public/data/pack/server/maps/l49_46 differ diff --git a/src/public/data/pack/server/maps/l49_47 b/src/public/data/pack/server/maps/l49_47 new file mode 100644 index 00000000..17327d3c Binary files /dev/null and b/src/public/data/pack/server/maps/l49_47 differ diff --git a/src/public/data/pack/server/maps/l49_48 b/src/public/data/pack/server/maps/l49_48 new file mode 100644 index 00000000..410c72b1 Binary files /dev/null and b/src/public/data/pack/server/maps/l49_48 differ diff --git a/src/public/data/pack/server/maps/l49_49 b/src/public/data/pack/server/maps/l49_49 new file mode 100644 index 00000000..f01f8f8c Binary files /dev/null and b/src/public/data/pack/server/maps/l49_49 differ diff --git a/src/public/data/pack/server/maps/l49_50 b/src/public/data/pack/server/maps/l49_50 new file mode 100644 index 00000000..2085c9c0 Binary files /dev/null and b/src/public/data/pack/server/maps/l49_50 differ diff --git a/src/public/data/pack/server/maps/l49_51 b/src/public/data/pack/server/maps/l49_51 new file mode 100644 index 00000000..8b4981cc Binary files /dev/null and b/src/public/data/pack/server/maps/l49_51 differ diff --git a/src/public/data/pack/server/maps/l49_52 b/src/public/data/pack/server/maps/l49_52 new file mode 100644 index 00000000..f443c374 Binary files /dev/null and b/src/public/data/pack/server/maps/l49_52 differ diff --git a/src/public/data/pack/server/maps/l49_53 b/src/public/data/pack/server/maps/l49_53 new file mode 100644 index 00000000..e0c8d2ea Binary files /dev/null and b/src/public/data/pack/server/maps/l49_53 differ diff --git a/src/public/data/pack/server/maps/l49_54 b/src/public/data/pack/server/maps/l49_54 new file mode 100644 index 00000000..c32bc1f3 Binary files /dev/null and b/src/public/data/pack/server/maps/l49_54 differ diff --git a/src/public/data/pack/server/maps/l49_55 b/src/public/data/pack/server/maps/l49_55 new file mode 100644 index 00000000..560a00fa Binary files /dev/null and b/src/public/data/pack/server/maps/l49_55 differ diff --git a/src/public/data/pack/server/maps/l49_56 b/src/public/data/pack/server/maps/l49_56 new file mode 100644 index 00000000..f0e64241 Binary files /dev/null and b/src/public/data/pack/server/maps/l49_56 differ diff --git a/src/public/data/pack/server/maps/l49_57 b/src/public/data/pack/server/maps/l49_57 new file mode 100644 index 00000000..04c3415a Binary files /dev/null and b/src/public/data/pack/server/maps/l49_57 differ diff --git a/src/public/data/pack/server/maps/l49_58 b/src/public/data/pack/server/maps/l49_58 new file mode 100644 index 00000000..9a7f9b0d Binary files /dev/null and b/src/public/data/pack/server/maps/l49_58 differ diff --git a/src/public/data/pack/server/maps/l49_59 b/src/public/data/pack/server/maps/l49_59 new file mode 100644 index 00000000..e812c914 Binary files /dev/null and b/src/public/data/pack/server/maps/l49_59 differ diff --git a/src/public/data/pack/server/maps/l49_60 b/src/public/data/pack/server/maps/l49_60 new file mode 100644 index 00000000..6537f378 Binary files /dev/null and b/src/public/data/pack/server/maps/l49_60 differ diff --git a/src/public/data/pack/server/maps/l49_61 b/src/public/data/pack/server/maps/l49_61 new file mode 100644 index 00000000..3d6d334f Binary files /dev/null and b/src/public/data/pack/server/maps/l49_61 differ diff --git a/src/public/data/pack/server/maps/l49_62 b/src/public/data/pack/server/maps/l49_62 new file mode 100644 index 00000000..f76dd238 Binary files /dev/null and b/src/public/data/pack/server/maps/l49_62 differ diff --git a/src/public/data/pack/server/maps/l50_149 b/src/public/data/pack/server/maps/l50_149 new file mode 100644 index 00000000..b55147ba Binary files /dev/null and b/src/public/data/pack/server/maps/l50_149 differ diff --git a/src/public/data/pack/server/maps/l50_150 b/src/public/data/pack/server/maps/l50_150 new file mode 100644 index 00000000..2eff03b8 Binary files /dev/null and b/src/public/data/pack/server/maps/l50_150 differ diff --git a/src/public/data/pack/server/maps/l50_152 b/src/public/data/pack/server/maps/l50_152 new file mode 100644 index 00000000..a2421380 Binary files /dev/null and b/src/public/data/pack/server/maps/l50_152 differ diff --git a/src/public/data/pack/server/maps/l50_153 b/src/public/data/pack/server/maps/l50_153 new file mode 100644 index 00000000..e9aa4d32 Binary files /dev/null and b/src/public/data/pack/server/maps/l50_153 differ diff --git a/src/public/data/pack/server/maps/l50_154 b/src/public/data/pack/server/maps/l50_154 new file mode 100644 index 00000000..95098de2 Binary files /dev/null and b/src/public/data/pack/server/maps/l50_154 differ diff --git a/src/public/data/pack/server/maps/l50_46 b/src/public/data/pack/server/maps/l50_46 new file mode 100644 index 00000000..f76dd238 Binary files /dev/null and b/src/public/data/pack/server/maps/l50_46 differ diff --git a/src/public/data/pack/server/maps/l50_47 b/src/public/data/pack/server/maps/l50_47 new file mode 100644 index 00000000..3a6a504a Binary files /dev/null and b/src/public/data/pack/server/maps/l50_47 differ diff --git a/src/public/data/pack/server/maps/l50_48 b/src/public/data/pack/server/maps/l50_48 new file mode 100644 index 00000000..66f2e8fa Binary files /dev/null and b/src/public/data/pack/server/maps/l50_48 differ diff --git a/src/public/data/pack/server/maps/l50_49 b/src/public/data/pack/server/maps/l50_49 new file mode 100644 index 00000000..b85e7894 Binary files /dev/null and b/src/public/data/pack/server/maps/l50_49 differ diff --git a/src/public/data/pack/server/maps/l50_50 b/src/public/data/pack/server/maps/l50_50 new file mode 100644 index 00000000..73c7fbd4 Binary files /dev/null and b/src/public/data/pack/server/maps/l50_50 differ diff --git a/src/public/data/pack/server/maps/l50_51 b/src/public/data/pack/server/maps/l50_51 new file mode 100644 index 00000000..59662cc0 Binary files /dev/null and b/src/public/data/pack/server/maps/l50_51 differ diff --git a/src/public/data/pack/server/maps/l50_52 b/src/public/data/pack/server/maps/l50_52 new file mode 100644 index 00000000..16d8d11a Binary files /dev/null and b/src/public/data/pack/server/maps/l50_52 differ diff --git a/src/public/data/pack/server/maps/l50_53 b/src/public/data/pack/server/maps/l50_53 new file mode 100644 index 00000000..7ba9b010 Binary files /dev/null and b/src/public/data/pack/server/maps/l50_53 differ diff --git a/src/public/data/pack/server/maps/l50_54 b/src/public/data/pack/server/maps/l50_54 new file mode 100644 index 00000000..6ae922e3 Binary files /dev/null and b/src/public/data/pack/server/maps/l50_54 differ diff --git a/src/public/data/pack/server/maps/l50_55 b/src/public/data/pack/server/maps/l50_55 new file mode 100644 index 00000000..ab1c548b Binary files /dev/null and b/src/public/data/pack/server/maps/l50_55 differ diff --git a/src/public/data/pack/server/maps/l50_56 b/src/public/data/pack/server/maps/l50_56 new file mode 100644 index 00000000..a1bc5dd2 Binary files /dev/null and b/src/public/data/pack/server/maps/l50_56 differ diff --git a/src/public/data/pack/server/maps/l50_57 b/src/public/data/pack/server/maps/l50_57 new file mode 100644 index 00000000..35d30f10 Binary files /dev/null and b/src/public/data/pack/server/maps/l50_57 differ diff --git a/src/public/data/pack/server/maps/l50_58 b/src/public/data/pack/server/maps/l50_58 new file mode 100644 index 00000000..16ffb38c Binary files /dev/null and b/src/public/data/pack/server/maps/l50_58 differ diff --git a/src/public/data/pack/server/maps/l50_59 b/src/public/data/pack/server/maps/l50_59 new file mode 100644 index 00000000..f9ca3a80 Binary files /dev/null and b/src/public/data/pack/server/maps/l50_59 differ diff --git a/src/public/data/pack/server/maps/l50_60 b/src/public/data/pack/server/maps/l50_60 new file mode 100644 index 00000000..3d335919 Binary files /dev/null and b/src/public/data/pack/server/maps/l50_60 differ diff --git a/src/public/data/pack/server/maps/l50_61 b/src/public/data/pack/server/maps/l50_61 new file mode 100644 index 00000000..3f6a7a9c Binary files /dev/null and b/src/public/data/pack/server/maps/l50_61 differ diff --git a/src/public/data/pack/server/maps/l50_62 b/src/public/data/pack/server/maps/l50_62 new file mode 100644 index 00000000..f76dd238 Binary files /dev/null and b/src/public/data/pack/server/maps/l50_62 differ diff --git a/src/public/data/pack/server/maps/l51_147 b/src/public/data/pack/server/maps/l51_147 new file mode 100644 index 00000000..54e8c42d Binary files /dev/null and b/src/public/data/pack/server/maps/l51_147 differ diff --git a/src/public/data/pack/server/maps/l51_154 b/src/public/data/pack/server/maps/l51_154 new file mode 100644 index 00000000..5e0f1e1e Binary files /dev/null and b/src/public/data/pack/server/maps/l51_154 differ diff --git a/src/public/data/pack/server/maps/l51_46 b/src/public/data/pack/server/maps/l51_46 new file mode 100644 index 00000000..f76dd238 Binary files /dev/null and b/src/public/data/pack/server/maps/l51_46 differ diff --git a/src/public/data/pack/server/maps/l51_47 b/src/public/data/pack/server/maps/l51_47 new file mode 100644 index 00000000..3fd0f5eb Binary files /dev/null and b/src/public/data/pack/server/maps/l51_47 differ diff --git a/src/public/data/pack/server/maps/l51_48 b/src/public/data/pack/server/maps/l51_48 new file mode 100644 index 00000000..baabc0ae Binary files /dev/null and b/src/public/data/pack/server/maps/l51_48 differ diff --git a/src/public/data/pack/server/maps/l51_49 b/src/public/data/pack/server/maps/l51_49 new file mode 100644 index 00000000..ad9600a5 Binary files /dev/null and b/src/public/data/pack/server/maps/l51_49 differ diff --git a/src/public/data/pack/server/maps/l51_50 b/src/public/data/pack/server/maps/l51_50 new file mode 100644 index 00000000..f738d883 Binary files /dev/null and b/src/public/data/pack/server/maps/l51_50 differ diff --git a/src/public/data/pack/server/maps/l51_51 b/src/public/data/pack/server/maps/l51_51 new file mode 100644 index 00000000..e98129cf Binary files /dev/null and b/src/public/data/pack/server/maps/l51_51 differ diff --git a/src/public/data/pack/server/maps/l51_52 b/src/public/data/pack/server/maps/l51_52 new file mode 100644 index 00000000..fea24918 Binary files /dev/null and b/src/public/data/pack/server/maps/l51_52 differ diff --git a/src/public/data/pack/server/maps/l51_53 b/src/public/data/pack/server/maps/l51_53 new file mode 100644 index 00000000..c271b89e Binary files /dev/null and b/src/public/data/pack/server/maps/l51_53 differ diff --git a/src/public/data/pack/server/maps/l51_54 b/src/public/data/pack/server/maps/l51_54 new file mode 100644 index 00000000..3843771c Binary files /dev/null and b/src/public/data/pack/server/maps/l51_54 differ diff --git a/src/public/data/pack/server/maps/l51_55 b/src/public/data/pack/server/maps/l51_55 new file mode 100644 index 00000000..990d5379 Binary files /dev/null and b/src/public/data/pack/server/maps/l51_55 differ diff --git a/src/public/data/pack/server/maps/l51_56 b/src/public/data/pack/server/maps/l51_56 new file mode 100644 index 00000000..384e2ca5 Binary files /dev/null and b/src/public/data/pack/server/maps/l51_56 differ diff --git a/src/public/data/pack/server/maps/l51_57 b/src/public/data/pack/server/maps/l51_57 new file mode 100644 index 00000000..edc6a4bc Binary files /dev/null and b/src/public/data/pack/server/maps/l51_57 differ diff --git a/src/public/data/pack/server/maps/l51_58 b/src/public/data/pack/server/maps/l51_58 new file mode 100644 index 00000000..0422fbf8 Binary files /dev/null and b/src/public/data/pack/server/maps/l51_58 differ diff --git a/src/public/data/pack/server/maps/l51_59 b/src/public/data/pack/server/maps/l51_59 new file mode 100644 index 00000000..b74cad85 Binary files /dev/null and b/src/public/data/pack/server/maps/l51_59 differ diff --git a/src/public/data/pack/server/maps/l51_60 b/src/public/data/pack/server/maps/l51_60 new file mode 100644 index 00000000..bbc08a96 Binary files /dev/null and b/src/public/data/pack/server/maps/l51_60 differ diff --git a/src/public/data/pack/server/maps/l51_61 b/src/public/data/pack/server/maps/l51_61 new file mode 100644 index 00000000..7e996731 Binary files /dev/null and b/src/public/data/pack/server/maps/l51_61 differ diff --git a/src/public/data/pack/server/maps/l51_62 b/src/public/data/pack/server/maps/l51_62 new file mode 100644 index 00000000..f76dd238 Binary files /dev/null and b/src/public/data/pack/server/maps/l51_62 differ diff --git a/src/public/data/pack/server/maps/l52_152 b/src/public/data/pack/server/maps/l52_152 new file mode 100644 index 00000000..44408213 Binary files /dev/null and b/src/public/data/pack/server/maps/l52_152 differ diff --git a/src/public/data/pack/server/maps/l52_153 b/src/public/data/pack/server/maps/l52_153 new file mode 100644 index 00000000..0c812666 Binary files /dev/null and b/src/public/data/pack/server/maps/l52_153 differ diff --git a/src/public/data/pack/server/maps/l52_154 b/src/public/data/pack/server/maps/l52_154 new file mode 100644 index 00000000..f76dd238 Binary files /dev/null and b/src/public/data/pack/server/maps/l52_154 differ diff --git a/src/public/data/pack/server/maps/l52_46 b/src/public/data/pack/server/maps/l52_46 new file mode 100644 index 00000000..f76dd238 Binary files /dev/null and b/src/public/data/pack/server/maps/l52_46 differ diff --git a/src/public/data/pack/server/maps/l52_47 b/src/public/data/pack/server/maps/l52_47 new file mode 100644 index 00000000..f76dd238 Binary files /dev/null and b/src/public/data/pack/server/maps/l52_47 differ diff --git a/src/public/data/pack/server/maps/l52_48 b/src/public/data/pack/server/maps/l52_48 new file mode 100644 index 00000000..f76dd238 Binary files /dev/null and b/src/public/data/pack/server/maps/l52_48 differ diff --git a/src/public/data/pack/server/maps/l52_49 b/src/public/data/pack/server/maps/l52_49 new file mode 100644 index 00000000..d99936bd Binary files /dev/null and b/src/public/data/pack/server/maps/l52_49 differ diff --git a/src/public/data/pack/server/maps/l52_50 b/src/public/data/pack/server/maps/l52_50 new file mode 100644 index 00000000..4a65b601 Binary files /dev/null and b/src/public/data/pack/server/maps/l52_50 differ diff --git a/src/public/data/pack/server/maps/l52_51 b/src/public/data/pack/server/maps/l52_51 new file mode 100644 index 00000000..31e81d46 Binary files /dev/null and b/src/public/data/pack/server/maps/l52_51 differ diff --git a/src/public/data/pack/server/maps/l52_52 b/src/public/data/pack/server/maps/l52_52 new file mode 100644 index 00000000..30fa9b4e Binary files /dev/null and b/src/public/data/pack/server/maps/l52_52 differ diff --git a/src/public/data/pack/server/maps/l52_53 b/src/public/data/pack/server/maps/l52_53 new file mode 100644 index 00000000..15594ed1 Binary files /dev/null and b/src/public/data/pack/server/maps/l52_53 differ diff --git a/src/public/data/pack/server/maps/l52_54 b/src/public/data/pack/server/maps/l52_54 new file mode 100644 index 00000000..06a2bb71 Binary files /dev/null and b/src/public/data/pack/server/maps/l52_54 differ diff --git a/src/public/data/pack/server/maps/l52_55 b/src/public/data/pack/server/maps/l52_55 new file mode 100644 index 00000000..b37e3df8 Binary files /dev/null and b/src/public/data/pack/server/maps/l52_55 differ diff --git a/src/public/data/pack/server/maps/l52_56 b/src/public/data/pack/server/maps/l52_56 new file mode 100644 index 00000000..a5296bc5 Binary files /dev/null and b/src/public/data/pack/server/maps/l52_56 differ diff --git a/src/public/data/pack/server/maps/l52_57 b/src/public/data/pack/server/maps/l52_57 new file mode 100644 index 00000000..52e8b2b6 Binary files /dev/null and b/src/public/data/pack/server/maps/l52_57 differ diff --git a/src/public/data/pack/server/maps/l52_58 b/src/public/data/pack/server/maps/l52_58 new file mode 100644 index 00000000..98adb2f7 Binary files /dev/null and b/src/public/data/pack/server/maps/l52_58 differ diff --git a/src/public/data/pack/server/maps/l52_59 b/src/public/data/pack/server/maps/l52_59 new file mode 100644 index 00000000..a9519bc6 Binary files /dev/null and b/src/public/data/pack/server/maps/l52_59 differ diff --git a/src/public/data/pack/server/maps/l52_60 b/src/public/data/pack/server/maps/l52_60 new file mode 100644 index 00000000..b9aadc20 Binary files /dev/null and b/src/public/data/pack/server/maps/l52_60 differ diff --git a/src/public/data/pack/server/maps/l52_61 b/src/public/data/pack/server/maps/l52_61 new file mode 100644 index 00000000..043f9367 Binary files /dev/null and b/src/public/data/pack/server/maps/l52_61 differ diff --git a/src/public/data/pack/server/maps/l52_62 b/src/public/data/pack/server/maps/l52_62 new file mode 100644 index 00000000..f76dd238 Binary files /dev/null and b/src/public/data/pack/server/maps/l52_62 differ diff --git a/src/public/data/pack/server/maps/l53_49 b/src/public/data/pack/server/maps/l53_49 new file mode 100644 index 00000000..41e6d59d Binary files /dev/null and b/src/public/data/pack/server/maps/l53_49 differ diff --git a/src/public/data/pack/server/maps/l53_50 b/src/public/data/pack/server/maps/l53_50 new file mode 100644 index 00000000..74014fdd Binary files /dev/null and b/src/public/data/pack/server/maps/l53_50 differ diff --git a/src/public/data/pack/server/maps/l53_51 b/src/public/data/pack/server/maps/l53_51 new file mode 100644 index 00000000..50b0e176 Binary files /dev/null and b/src/public/data/pack/server/maps/l53_51 differ diff --git a/src/public/data/pack/server/maps/l53_52 b/src/public/data/pack/server/maps/l53_52 new file mode 100644 index 00000000..f76dd238 Binary files /dev/null and b/src/public/data/pack/server/maps/l53_52 differ diff --git a/src/public/data/pack/server/maps/l53_53 b/src/public/data/pack/server/maps/l53_53 new file mode 100644 index 00000000..f76dd238 Binary files /dev/null and b/src/public/data/pack/server/maps/l53_53 differ diff --git a/src/public/data/pack/server/maps/m29_75 b/src/public/data/pack/server/maps/m29_75 new file mode 100644 index 00000000..474f02be --- /dev/null +++ b/src/public/data/pack/server/maps/m29_75 @@ -0,0 +1 @@ +œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ2œ2œ2œ2œ2œ2œ2œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ2œœ2œ2œ2œœ2œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ2œ2œœœœ2œ2œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ2œ2œ2œœœœ2œ2œ2œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ2œ2œ6œ5œ5œ5œ6œ2œ2œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ2œ2œ6œ5œ5œ5œ6œ2œ2œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ2œ2œ6œ5œ5œ5œ6œ2œ2œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ2œ2œ6œ5œ5œ5œ6œ2œ2œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ2œ2œ6œ5œ5œ5œ6œ2œ2œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ2œ2œ6œ5œ5œ5œ6œ2œ2œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ2œ2œ6œ5œ5œ5œ6œ2œ2œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ2œ2œ6œ5œ5œ5œ6œ2œ2œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ2œ2œ6œ5œ5œ5œ6œ2œ2œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ2œ2œ6œ5œ5œ5œ6œ2œ2œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ2œ2œ2œœœœ2œ2œ2œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ2œ2œ2œœœœ2œ2œ2œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ2œ2œ2œœœœ2œ2œ2œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ2œ2œ2œœœœ2œ2œ2œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ2œœ2œ2œ2œœ2œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ2œœœ2œœœ2œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ2œœœœœœ2œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ2œœœœœœ2œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ2œœœœœœ2œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ2œ2œ2œ2œ2œ2œ2œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ&œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ222:9::9999999999*2*2*2*2*2*2*2*2*29999999999999999999999999999999999999999"+"+ \ No newline at end of file diff --git a/src/public/data/pack/server/maps/m30_75 b/src/public/data/pack/server/maps/m30_75 new file mode 100644 index 00000000..378c0b68 --- /dev/null +++ b/src/public/data/pack/server/maps/m30_75 @@ -0,0 +1 @@ +222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222“““2222222222222222222222222222222222222222“2“2“2“2““““222222222222222222222222222222222222222“2“2“2“2“2“““““22222222222222222222222222222222222222“2“2“2“2“2“2““““““22222222222222222222222222222222222222“2“2“2“2“2“2“2“2“2“““22222222222222222222222222222222222“2“2“2““““2“2“2““““22222222222222222222222222222222222“2“2““““““2“2“““222222222222222222222222222222222222“2“(2“2“2“2“2“2“2““““222222222222222222222222222222222222“2“““2““2“2“2““““22222222222222222222222222222222222“2“2““““““2“2“““22222222222222222222222222222222222“2“2““““““2“2“““2222222222222222222222222•2222222222“2“2““““““2“2““222222222222222222222222•2•2•2222222222“2““““““2“2“222222222222222222222222222222•2•2•2•2•22222222222222“2“2““““““2“222222222222222222222222222222•2•2•2•2•2•222222222222222“2““““““222222222222222222222222222222•2•2•2•2•2•2•2222222222222222““2222222222222222222222222•2•2•2•2•2•2•222222222222222222“2222222222222222222222•2•2•2•2•2•2•2•2222222222222222222222“2““22““2“2“““222222222222222222222•2•2•2•2•2•2•2•2•222222222222222222222“2“2““)2“2“2“2“2“2““““2222222222222222222222•2•2•2•2•2•2•2•22222222222222222222“2“2“2“+2“““““2“2““““22222222222222222222222•2•2•2•2•2•2•22222222222222222222“2“2“2““““““2“2“2“2“2222222222222222222222222•2•2•2•2•2•2•2•2222222222222““2“2“ 2““““2“2“2“2“2“2“22222222222222222222222•2•2•2•2•2•2•2•2•2222222222222““2“2“2“ 2““2“2“2“2“2“2“22222222222222222222222•2•2•2•2•2•2•2•2•2•2222222222222““2“2“2“2“2“2“2“2“2“2“2“2“22222222222222222222222•2•2•2•2•2•2•2•2•2222222222222“2“2“2“2“2“2“2“2“2“2“2“2“222222222222222222222222•2•2•2•2•2•2•2•2222222222222““2“2“2“2“2“2“2“2“2“2“2“2222222222222222222222222•2•2•2•2•2•2•2•2222222222222“2“2“2“2“2“2“2“2“2“2“22222222222222222222222222•2•2•2•2•2•2•2•2222222222222“2“2“2“2“2“2“2“2“2“2“22222222222222222222222222•2•2•2•2•2•2•2•2222222222222“2“2“2“2“2“2“2“2“2“22222222222222222222222222•2•2•2•2•2•2•2•2•2222222222222222222222“2“2“2“2“2“2“2“222222222222222222222222222•2•2•2•2•2•2•2•2•22222222222222222222222“22“2“2“22222222222222222222222222222•2•2•2•2•2•2•2•2•222222222222222222222222222222222222222222222222222222222•2•2•2•2•2•2•2•22222222222222222222222222222222222222222222222222222222•2•2•2•2•2•2•2•2•22222222222222222222222222222222222222222222222222222222•2•2•2•2•2•2•2•2•222222222222222222222222222222222222222222222222222222222•2•2•2•2•2•2•2•22222222222222222222222222222222222222222222222222222222•2•2•2•2•2•2•2•2•22222222222222222222222222222222222222222222222222222222•2•2•2•2•2•2•2•2•222222222222222222222222222222222222222222222222222222222•2•2•2•2•2•2•2•2222222222222222222222222222222222222222222222222222222222•2•2•2•2•2•2•222222222222222222222222222222222222222222222222222222222•2•2•2•2•2•2•2•22222222222222222222222222222222222222222222222222222222•2•2•2•2•2•2•2•2•22222222222222222222222222222222222222222222222222222222•2•2•2•2•2•2•2•2•22222222222222222222222222222222222222222222222222222222•2•2•2•2•2•2•2•2•2222222222222222222222222222222222222222222222222222222•2•2•2•2•2•2•2•2•2•99999999999999999999"+"+ \ No newline at end of file diff --git a/src/public/data/pack/server/maps/m31_75 b/src/public/data/pack/server/maps/m31_75 new file mode 100644 index 00000000..1c225067 --- /dev/null +++ b/src/public/data/pack/server/maps/m31_75 @@ -0,0 +1 @@ +œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ2œ2œ2œ2œ2œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ2œœœœœœ2œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ2œ2œœœœ2œ2œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ2œ2œ2œœœœ2œ2œ2œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ2œ2œ6œ5œ5œ5œ6œ2œ2œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ2œ2œ6œ5œ5œ5œ6œ2œ2œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ2œ2œ6œ5œ5œ5œ6œ2œ2œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ2œ2œ6œ5œ5œ5œ6œ2œ2œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ2œ2œ6œ5œ5œ5œ6œ2œ2œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ2œ2œ6œ5œ5œ5œ6œ2œ2œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ2œ2œ6œ5œ5œ5œ6œ2œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ2œ2œ6œ5œ5œ5œ6œ2œ2œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ2œ2œ6œ5œ5œ5œ6œ2œ2œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ2œ2œ6œ5œ5œ5œ6œ2œ2œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ2œ2œ2œœœœ2œ2œ2œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ2œ2œœœœ2œ2œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ2œ2œœœœ2œ2œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ2œœœœœœ2œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ2œœœœ2œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ2œœ2œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ2œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ222::9::9999999999*2*2*2*2*2*2*2*2*2999999999999999999999999999999999999999"+"+ \ No newline at end of file diff --git a/src/public/data/pack/server/maps/m32_70 b/src/public/data/pack/server/maps/m32_70 new file mode 100644 index 00000000..5cf94494 Binary files /dev/null and b/src/public/data/pack/server/maps/m32_70 differ diff --git a/src/public/data/pack/server/maps/m32_71 b/src/public/data/pack/server/maps/m32_71 new file mode 100644 index 00000000..de30c205 Binary files /dev/null and b/src/public/data/pack/server/maps/m32_71 differ diff --git a/src/public/data/pack/server/maps/m32_72 b/src/public/data/pack/server/maps/m32_72 new file mode 100644 index 00000000..421e9f01 Binary files /dev/null and b/src/public/data/pack/server/maps/m32_72 differ diff --git a/src/public/data/pack/server/maps/m32_73 b/src/public/data/pack/server/maps/m32_73 new file mode 100644 index 00000000..782fb06c Binary files /dev/null and b/src/public/data/pack/server/maps/m32_73 differ diff --git a/src/public/data/pack/server/maps/m32_74 b/src/public/data/pack/server/maps/m32_74 new file mode 100644 index 00000000..dbe914ba Binary files /dev/null and b/src/public/data/pack/server/maps/m32_74 differ diff --git a/src/public/data/pack/server/maps/m32_75 b/src/public/data/pack/server/maps/m32_75 new file mode 100644 index 00000000..37818c98 Binary files /dev/null and b/src/public/data/pack/server/maps/m32_75 differ diff --git a/src/public/data/pack/server/maps/m33_70 b/src/public/data/pack/server/maps/m33_70 new file mode 100644 index 00000000..d8330ecf Binary files /dev/null and b/src/public/data/pack/server/maps/m33_70 differ diff --git a/src/public/data/pack/server/maps/m33_71 b/src/public/data/pack/server/maps/m33_71 new file mode 100644 index 00000000..1ba1e875 --- /dev/null +++ b/src/public/data/pack/server/maps/m33_71 @@ -0,0 +1,12 @@ +NLJLOPPQSRPPPPPSSPMNOPPPPRSQNLNNNNOPPRSRPOOOOORVRPOOOOOOORUTPOOPNKJLPRPPSSQPPPSVVQNNQRQPQTVTOLMNMLNPQTSQONNNNMOPONOPPONNMPTROMNOOMLNPRPNPRPPRTVXXTQSUUUSRTVURPPOMLMPRUSPMMOOMLLMMNQRRQOMLORQNLMOPPOOQRRPRTTUWYYYZXWXYXXWVVXXXWUSQOOQRSRONPQRQOOOOQTUUTRPOQSSRPPRRSRPRTTUWXZ[[[YY[[Z[ZXXYYZZZ[[XWVUTSSSQQRSUUUTTTSUWVWVUUUVWVUUUWSTSRTUVXYZ\]YVTSV\\YXVVX[\[YYYWXYZXWVUTTVWXXXWXXVUUUVWWYZYYXXYYZRSSSUWVTTU\[PKHGJ__PRSUW[[XTQQRTW[[YYYXXYXWVWXYYVSRQSTV[[WVWXZZXPPQSVXTLEG_PQHDEMXZVTY\[ZUPPPPPPPXZYYZ[Z\XTSTVWVSPPPPSSSSSQSWXWTNMOSWXSHDDECBCCIEEEEEEEEEZRPPPPPPPPQSY^[[SPPPPPPPPPPPSSSSSPPQQQPLKMRWXRDDCCBCCFMEEEEEEEEE\RPPPPPP99999_PPPPPPPPPPPPPPSPSSSSSPPPPLKNSXXRFDCCCCCIEEEEEEEEEEA=95013699999PPPPPPPPPPPPPPPSPSPSSSPPPPLLNRUVQEDCCBCDKEEEEEEEEEEA=95013699999====@@@@PPPPPPPSSSSSSSPPPPMLNRUVQEDCCBCFMEEEEEEEEEE\RPPPPPP99999====@@@@PPPPPPPPOOPSSSPPPPNMOSVWRDDDCABFNEEEEEEEEEESPPPPPPP99999PPPP@@@@@PPPPPPPLLPPVVPPPPNNQTXXTDDDCACHNEEEEEEEHHSPPPPPPPPPPPPPPPPPPP@@@PPPPPIIIIPPYYPPPPNNQVZZUDDDDEHJMEEEEEZXHHPPPPPPPPPPPPPPPPPPPP@@@CFFFFIIIIPP\\PPPPMLPV\\ZRVDDMLIHVZZYXTRHHPPPPPPPPPPPPPPPPPPPP@@@CFFFFIIIIPP__PPPPLLPW\]\UZ]^^[VSSRRSRQRHHPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPbbPPPPMMQW\]^X[\[[[YTQPPPQTHHHLPPPPPPPPPPPPPP$$$$$PPPPPPPPPPPPPPeePPPPNNRX]^_Y[[XWY[XUPPQULLLLLLQPPPPPPPPPPPP$$$$$PPPPPPPPPPPPeeeeePPPMMQW\]_]\ZUTX]\ZTPSZLLLLLLUPPPPPPPPPPPP$$$$$PPPPPPPPUY]aeeeeePPPMLPV[[Y^]ZTRUY\\XTV\LLLLLLYTPPPPPPPPPPP$$$$$PPPPPPPPUY]aeeeeePPPMLPV[YU\^ZTQRVZ]ZUXLLLLLLLLZRPPPPPPPPPP$$$$$PPPPPPPPPPPPePeeePPPNMPVZYRY][WTRUZ^YTPLLLLLLLL[SPPPVVVVVPPP--PPPPPPPPPPPPPPeeeeePPPQQTWZ\_TY[ZYVW\^YTPLLLLLLLLLMORTVVVVVVVV--PPPPPPPPPPPPPPPaaPPPPPTVWWZ[]PTWZ[[[^\UQWLLLLLLLLLMORTVVVPVVVV--PPPPPPPPPPPPPPP]]PPPPPWZYXZ[[PQTVY\]^YRPTLLLLLLLLZRPPPVPVVVVVV--PPPPPPPPPPPPPPPYYPPPPPW[ZY[ZSPPPRTXZYSPPPLLLLLLLLUPPPPVVVPVVPP--PPPPPPPPPPPPPPPUUPPPPPTVUVZZTPPPPPQRQPPPPPRRTXZTQPPPPPPPPPPPPP11PPPPPPPPPOOPPPPPPPPPPPPQQSWZYPPPPPPPPPPPPPPPPRRPPPPPPPPPPPPP;;;;;PPPPPPPPKKPPPPPPPPPPPONOPTY]_PPPPPPPQTWZZZZ]`dhopohc^YTOJE@;;;;;PPPPPPHHHHHPPPPPPPPPPMLMPSY^_PPPPPPPQTWZZZZ]`dhopohc^YTOJE@;;;;;<AAAAEHHHHHPPPPPRPPPPLKLPU[^_PPPPPPPPPPPPPPPPPPPPPPPPPPPPPP;;;;;<AAAAEHHHHHPPPPPPPPPPMLOTY[YPPPPPPPPPPPPPPPPPPPPP2PPPPPPPPP;;;;;PPPPPPHHHHHPPPPPPPPPPNNQV\[WPPPPPPPPPPPPPPPPPPP22222QPPPPPPP88PPPPPPPPHHHHHPPPPPPPPPPMLPV[\YPPPPPPPPPPPPPPPPPR2222222TPPPPPP88PPPPPPPPPPPPPPPPPPPPPPPLKMSX\]_PPPPPPPPPPP22222222222222SPPPPP88PPPPPPPPPPPPPPPPPUUUUUPNLNQUZ]_PPPPPPPPP22222222222222225888PP88PPPPPPPPPPPPPPPPPUUUUUPOMNQUY\_PP222P22222222222222222225888PP88PPPPPPPPPPPPPPPPPUUUUUPONMPUZXPPAAAAA2222222222222222222288888888PPPPPPPPPPPPPPPPUUUUUPQOMPVZXP2AAAAA2222222222222222222288888888PPPPPPPPPPjjjjjPPUUPPPSTQTY[WP2AAAAA=952222222222222222P88888888PPPPPPPPPPjjjjjPPXXPPPSVUW\[TP2AAAAA=952222222222222222PPPP88888PPPPPPPPPPjjjjjPP\\\PPQTTX][SPPAAAAA222222222222222222PPPPP88888PPPPPPPPPPjjjjjPP\\\PPSVVX\ZTPPP2222222222222222222222PPPPPP;;PPPPPPPPPPPPjjjjjPP\\\PPTWVW[\YPPPPP2P22222222222222222PPPPPPP;;PPPPPPPPPPPPPggPPPPP``PPRUTU[][PPPPPPPPQ222222222222222PPPPPPN;;MPPPPPPPPPPPPccPPPPPeePPPQQTZ]ZPPPPPPPPR22222222222222PPPPPPPM;;MPPPPPPPPPP_____PPPPbbPPPPOSX[XPPPPPPPPPS222222222222RPPPPPPPN??MPPPPPPPPPP_____PP_____PPONQVZWQPPPPPPPPPS2222222222PPPPPPPPPNHHNPPPPPPPPPP____________PQOMPVYWQPPPPPPPPPPP22222222TPPPPPPPPPONNOPPPPPPPPPP____________ZQONQVYWRPPPPPPPPPPP2255222PPPPPPPPPPPPRRPPPPTTTTTPP____________ZPOOQTXWTPPPPPPPPPPP228822RPPPPPPPPPPPPSSPPPPTTTTTP[[[[PPPP_____PPOOPRUWVTRQPPPPPPPP22::22PPPPPPPPPPPPPVVPPPPTTTTTX[[[[PPPPbbbPPPPPOOQSUWXXWRPPPPPPP22<<22PPPPPPPPPPPPPWWPPPPTTTTTX[[[[PPPfffffPPPPNNOQSUX[[XPPPPPP2>>>>>2PPPPPPPPPPPPPXXPPPPTTTTTPPPPPPPPfffffPPPQNLMOQRUWZ[YTPPPPP>>>>>PPPPPPPPPPPQQRZZ\]][PP___PPPPPPPPfffffPPSVOKLMNPRTWZ[XRPPPP>>>>>PPPPPPQPPRTXZYZ]^^]][[^____PPPPPPfffff__Y[SMLLMNPQTWZZVTSSR>>>>>QTY\[\YUUWY[]]\]\\[\]^]^]]]YVRQPPfffff]]SWTNLLLMOPQTWYYYYXX>>>>>UWZ\\]][[[[ZZZZYVUWXZ[[[Z[\\ZYWTSYZY\\[ZPQQLJKKNOOPQSVWY[[[[YWVWWWYYXZ\]][XUUUSTSUXWVUVUUWZ[Z[[[Z\][ZYWUPSWRLMOTRPPPPRSUWWXZZZYXVUUTSVXZZWTRSQOQUY[ZWVUSSUYZXXZ\][ZVUUSQPY\WQQTYTQPPOPOOQRSUWWVUSRPNNPRRRRPQQOMOTXYYWVSPQTXXUSTXYWTPPQPPPSYSPPSYSPPPOOMLMOPPQRRQPOMLMOOPPPPPRSMQTTUUSROMORTSQPPQRQOMNOOO*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*w*’w*’w*’w*’w’w’w*’w*w*’w*’w*’w*’w’w’w’w*w*w*’w*’w’w’w*’w*’w*w*’w*’w’w’w’w*w*’w*’w*’ww’w’w’w*w*w*w*’w*’w*’w*’w*’w*’w*’w*’w*w*’w*ww’w’w*’w*’w*’w*’w*’w*’w*’w*’w*’w’w*’w*’www’w’wwww’ww’ww’wwwww’www’wwww’w’w’wwww’wwww’wwww*w*w*’w’w*w*w*’w*’w*wwwwww’ww’w*w*w*’w*w’w’w’ww*’w’w’wwwwwwwwwwwwwwwwww*2w!*2wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww’www*’w *’w’wwwwwwwwww *2w*2w*2w*2w *2ww*2w*2w*2w#*2w*2w *2wwww*2w*2w*2w*2w!*2wwwwwwwwwwwwwwwww *2w*2w*2w*2w!*2wwwwwwwwwwww*’w*’wwww *2w*2w*2w *2www*2w"*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w#*2w *2wwwwwwww *2w*2w*2w*2w*2w *2ww*2w"*2w*2w*2w*2w#*2w*2w *2ww*2w*2w*2w*2w*2w!*2w *w*2w*’w*wwww*2w*2w*2w*2w*2w*2w*2w*2w*2w$*2w%*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w *2ww *2w"*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w#*2w"*2w*2w*’w*’wwww*2w*2w)*2w&*2w*2w*2w*2w*2w*2w#*2w"*2w*2w*2w*2w*2w*2w*2w*2w*2w*2wwww*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w"*2w*2w*2w*2w*2wwwwwwwww2w*w*w*w*w2wwwwwww*’w’w’www*2w*2w(*2w'*2w*2w*2w*2w*2w*2w*2w*2w)*2w +*2w*2w*2w*2w*2ww&*2w*2wwwwwwww2w2w2w2w2w*2w*2w*2w*2w*2w*2wwwwwwwwww2w*w*w*w*w2w2w2wwwww*’w’wwww*2w*2w*2w*2w*2w*2w*2w&*2w*2w*2w*2wwwww’wwww*2w2w2w2w2w2w2w2w2w*w*w*w*w2wwwwwwwwwwwwwww2w*w*w*w*w*w*w2wwwww*’w *wwww*2w*2w*2w*2w*2wwww*2w*2w+*2wwww’w’w’www*w*w*w*w*w*w*w*w*w*w*w*w*w2w2w2w2w2w2w2w2w2wwwwwww2w*w*w*w*w2w*w2wwwww*’w*’www *2w"*2w*2w*2w*2w#*2w!*2ww-*2w*2w*2wwww’w’w’w’w’ww*2w*2w2w2w2w2w2w2w2w*w*w*w*w*wwww*w*w*w*w2wwwwwww2w2w*w2w2w2w*w2wwwww*’w*’w’ww*2w*2w*2w$*2w*2w*2w#*2w*2w*2w*2w*2wwwww’w’w’ww'*2w*2wwwwwwww2w*w*w*w*w2w2w2w2w2w2w2w*w2wwwwwwww2w*w2ww2w*w2wwwww*’w*’www*2w%*2w*2w*2ww,*2w*2w*2w*2w*2w*2wwwwww*2’w*2w*w*2w*2wwwwwwww2w2w2w2w2w2wwwwww2w*w2wwwwwwww2w*w2ww2w*w2wwwww*’w*wwww*2w*2w*2w(*2w'*2w*2w*2w*2w&*2w*2w(*2wwww-*2w*2w*2ww2wwwwwwwwwwwwwwwwwwww2w*w2w2w2w2w2w2w2w2w2w*w2ww2w*w2wwwww*’w*’www *2w*2w*2w*2w*2w*2w*2w**2ww'*2w*2w*2w*2w*2w*2w*2w*2w*2ww2wwwwwwwwwwwwwwwwwwww2w*w*w*w*wwww*w*w*w*w2ww2w*w2wwwww*’w’w’ww*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2ww2wwwwwwwwwwwwwwwwww2w2w2w2w2w2w2w2w2w2w2w2w2ww2w*w2wwwww*’w’www*2w%*2w*2w*2w)*2ww’w&*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*w2wwwwwwwwwwwww2w2w2w2w2w2www2w2w2w2w2w2wwwwww2w*w2wwwww*’wwwww*2w*2w*2ww’w’~’w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*w*2w*2wwwwwwwwwwwwww2w*w*w*w*w2www2w*w*w*w*w2wwww2w2w2w*w2w2wwww*’w’wwww*2w*2w*2w’w’w’w’*2’w*2w*2w*2w*2w*2w*2w*2w*2w*2ww&*2w*2wwwwwwwwwwwwww2w*w*w*w*w2www2w*w*w*w*w2w2w2w2w2w*w*w*w*w2wwww*’w *’w’www*2w*2w*2ww’w’w’w’w,*2w*2w*2w*2w*2w*2w*2ww’www*2w*2wwwwwwwwwwwww2w*w*w*w*w2www2w*w*w*w*w*w*w*w*w*w*w*w*w*w2wwww*’w*’www *2w"*2w*2w*2ww’w’w’w’w’w&*2w*2w*2w*2w*2w *2w’w’w’ww,*2w*2w*2wwwwwwwwwwww2w*w*w*w*w2www2w*w*w*w*w2w2w2w2w2w*w*w*w*w2wwww*’w’w’ww*2w%*2w*2w*2w*2w’w’w’w’w’ww*2w*2w*2w*2w’w’w’w’w’ww&*2w*2wwwww2w2w2w2w2w2ww2w2w*w2w2w2www2w2w*w2w2w2wwww2w*w*w*w*w2wwww*’w *’wwww*2w*2w*2w*2ww’w’w’www*w*w*w*ww’w’w’wwww*2w2w2w2w2w2w*w*w*w*w2www2w*w2w2wwwww2w*w2w2w2w2www2w2w*w2w2w2wwww*’w*wwww *2w*2w*2w*2w*2w *2w’www'*2w*2w*2w*2w*2w’w’w’w’w’www*w*w*w*w*w*w*w*w*w*w2www2ww2wwwwww2w*w*w*w*w2wwww2w*w2wwwwww*w*www *2w"*2w*2w*2w*2w*2w*2w(*2ww-*2w*2w*2w*2w*2w*2w(*2w’w’w’www'*2w*2w2w2w2w2w2w*w*w*w*w2www2ww2wwwwww2w2w2w2w*w2wwww2w*w2wwwwww*w*www*2w*2w*2w*2w*2www*2w*w*2wwwwww*2w*2w *2’ww*2{*2w*2w*2wwwww2w*w*w*w*w2www2ww2wwwwwwwww2w*w2wwww2w*w2wwwwww*’w *www*2w*2w*2w*2w*2www*2w*w*2wwwwww*2w*2w*2w*2w*2w*2w*2w*2wwwww2w2w2w2w2w2www2w*w2wwwwwwwww2w*w2wwww2w*w2wwwwww*’w*’www*2w*2w*2w*2w*2www*2w*w*2wwwwwwwwwwwwwwwwwwwwwwww2w2w2w*w2w2wwwwwwww2w*w2wwww2w*w2w2w2w2www*’w*’w’www*2w*2w*2w*2www*2w*w*2w*2w*2w2w2w2w2w2w2w2w2w2w2w2w2w2w2w2w2w2w2w2w2w2w2w*w*w*w*w2wwwwww2w2w2w*w2w2www2w*w*w*w*w2www*’w’w’w’ww*2w%*2w*2w*2www*2w*w*w*w*w*w*wwww*w*w*w*w*w*w*w*w*w*w*w*w*w*w*w*w*w*w*w*w*w2w2w2w2w2w2w2w*w*w*w*w2www2w2w2w2w*w2www*’w’w’w’w’w *2w"*2w*2w*2www*2w*2w*2w2w2w2w2w2w2w2w2w2w2w2w2w2w2w2w2w2w2w2w2w2w2w2w2w*w*w*w*w*w*w*w*w*w*w*w*w*w*w*w2wwwwww2ww2www*’w’w’w’w *2w"*2w*2w*2w*2www*2wwwwwwwwwwwwwwwwwwwwwwwwww2w*w*w*w*w2w2w2w2w2w2w2w*w*w*w*w2wwwwww2ww2www *’w’w’ww*2w*2w*2w*2w*2wwwwwwwwwwwwwwwwwwwwwwwwwwwww2w2w*w2w2w2wwwwww2w*w*w*w*w2wwwwww2ww2www*’wwww*2w*2w*2w*2w*2wwwwwwwwwwwwwww*2w*2w*2w*2w*2w*2w*2w*2wwwwwwww2w*w2wwwwwwww2w2w2w2w2w2wwwwww2w*w2www*wwww*2w%*2w*2w*2w*2wwwwwwwwwwwwww*2w*2w*2w*2’w)*2’ww +*2w*2w*2w*2w2wwwwww2ww2wwwwwwwwwwwwwwwww2w2w2w*w2w2ww*w *wwww*2w*2w*2w*2wwwwwwwwwww*2w*2w*2w*2w*2w*2w+*2ww’wwww&*2w*2w2w2w2w2ww2ww2wwwwwwwwwwwwwwwww2w*w*w*w*w2ww*w*wwwww*2w*2wwwwwwwwww*2w*2w*2w*2w*2w*2w*2www’wwww’ww*w*w*w*w2ww2ww2wwwwwwwwwwwwwwwww2w*w*w*w*w2ww*w*wwww *2w*2w*2w2w2w2w2w2w2www*2w*2w*2w*2wwwww’w’wwwwww *2w*2w2w2w*w2w2w2w*w2w2wwwwwwwwwwwwwwww2w*w*w*w*w2ww*’w*wwww*2w*2w*2w2w*w*w*w*w2www*2w*2wwww 5w 5w 5w 5’w 5’w‘wwwww*2w*2ww2w*w2w*w*w*w*w2wwwwwwwwww2w2w2w2w2w2w2w*w*w*w*w2ww*’w*wwww*2w*2w*2w2w*w*w*w*w2w2w2w*2w *2wwww 5w 5’w 5’w 5’w 5’w’www’w'*2w*2w*2ww2w*w*w*w*w*w*w2wwwwwwwwww2w*w*w*w*w2w2w2w*w2w2w2ww*’ww’ww *2w*2w*2w*2w2w*w*w*w*w*w*w*w*wwww 5w 5’w 5’w 5’w 5w’w’ww’w-*2w*2w*2www2w2w2w*w*w*w*w2wwwwwwww2w*w*w*w*w2ww2w*w2w2www*’w *’w’w’w*2w*2w*2w*2w2w*w*w*w*w2w2w*2w*2wwww 5’w 5’w 5w 5ww’ww’ww*2w*2wwwwww2w*w*w*w*w2wwwwwwww2w*w*w*w*w2ww2w*w*w2www*’w*’w’w’w*2’w*2w*2w*2w2w2w2w2w2w2ww*2w *2wwww 5’w 5’w 5w 5www’ww *2w*2wwwwwww2w2w*w2w2w2wwwwwwwwww2w*w*w*w*w2ww2w*w*w2www*’w*’w’w’w*2w*2w*2w*2wwwwwww*2w*2www’ww 5’w 5’w 5w 5w’w’www*2w*2wwwwwwww2ww2wwwwwwwwwwww2w2w*w2w2w2ww2w2w*w2www*’w’w’ww*2w%*2w*2w*2wwwwwww*2w*2w*2www’w 5w 5w 5w 5’w’ww’w-*2w*2wwwwwwwww2ww2wwwwwwwwwwwww2w*w2wwwww2w*w2www*’w *’w’w’ww*2w*2w*2wwwwwww*2w*2w*2wwwww’w’ww’www*2wwwwwwwwww2ww2wwwwwwwwwww2w2w2w*w2w2wwww2w*w2www*’w*’w’wwww*2w*2wwwwwwww*2w*2w(*2ww’ww’w’w’www *2w*2wwwwwwwwww2w*w2wwwwwwwwwww2w*w*w*w*w2ww2w2w2w*w2w2ww*’w*’w’wwww*2w*2wwwwwwwww*2w*2w**2www’w’ww’ww*2w*2wwwwwwwwww2w*w2wwwwwwwwwww2w*w*w*w*w2w2w2w*w*w*w*w2ww*’w*’w’www *2w*2w*2wwwwwwwwww*2w*2w*2w *2wwww*2w*2w*2w*2wwwwwwww2w*w2wwwwwwwwwww2w*w*w*w*wwww*w*w*w*w2w2w*’w*’w’w’ww*2w*2w*2wwwwwwwww*2w*2w*2w*w*2w*2w*2w*2w*2wwwwwwwww2w*w2wwww2w2w2w2w2w2ww2w*w*w*w*w2w2w2w*w*w*w*w*w*w*’w’w’www*2w*2w*2wwwwwwwwwww*2w*w*2w*2wwwwwwwwwwwwww2w*w2wwww2w*w*w*w*w2ww2w2w*w2w2w2ww2w*w*w*w*w2w2w*’w’wwww +*2w%*2w*2w*2wwwwwwwwwwww2w*w2wwwwwwwwwwwwwww2w*w2wwww2w*w*w*w*w2w2w2w2w*w2wwww2w2w*w2w2w2ww*’w’w’wwww*2w%*2w*2w*2wwwwwwwwwww2w*w2wwwwwwwwwwwwwww2w*w2wwww2w*w*w*w*w*w*w*w*w*w2www2w2w2w*w2w2www*’w’w’w’wwww*2w*2w*2w*2wwwwwwww2w2w2w*w2w2wwwwwwwwwwwwww2w*w2wwww2w*w*w*w*w2w2w2w2w2w2www2w*w*w*w*w2www*’w’w’wwwwwww*2w*2w*2wwwwwww2w*w*w*w*w2wwwwwwwwwwwwww*2w*w2wwww2w2w2w2w2w2wwwwwwww2w*w*w*w*w2www*’w *’w’w’wwwwwww*2w*2w*2w*2wwwww2w*w*w*w*w2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*w*2w*2w%*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w2w*w*w*w*w2www*’w*’w’wwwwwwww*2w*2w*2w*2w*2w*2w*2w*2w2w*w*w*w*w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w$*2w*2wwww*2w*2w*2w*2w +*2w*2w*2w*2w*2w%*2w*2w*2w*2w*2w*2w2w*w*w*w*w2w*2w*2w*’w*’w’wwwwwwwwww +*2w%*2w*2w*2w*2w*2w*2w*w*w*w*w*2w*2w*2w*2w$*2w*2w%*2w$*2w%*2w*2w*2w*2w +*2w*2wwwwwwwwwwwwww*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*’w*’wwwww’wwwwwww*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w +*2w*2ww*2w*2w*2w*2wwwwwwwwwwwwwwwwwwww +*2w*2w*2w*2w*2w*2w*2w*2wwwww*’w *’w’ww’w’w’w’wwwwwwwwwww +*2w*2w*2w +*2w*2w*2wwwwwwwwwwwwwwwwww’w’ww’ww’w’ww’wwwww +*2w*2w*2wwwwwwww*’w*’w’w’w’w’w’w’w’w’wwwwwww’wwww’www’ww*w*w*w *’w’w’wwwwwwwww’w’w’w’w’w’w’w’w’w’w’w’w’w’wwwwww*w*w*w*’w*’w*w*’w*’w *’w’w’w*’w*’w*’w *’w’w’w’www*’w*’w*’w*’w *w’w’w*’w*’w *’w’w*w*’w*’w*’w’w’w’ww*w*w*w *ww’w’w’w*’w*’w*’w*’w*’w *’w’w*’w*’w *’w’w’w’wwww*w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w *’w*’w*’w*’w*w*w*w*w*’w *’w’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*w*w*’w*’w*’w*’w*’w*’w*’w***************************************************************************************** \ No newline at end of file diff --git a/src/public/data/pack/server/maps/m33_72 b/src/public/data/pack/server/maps/m33_72 new file mode 100644 index 00000000..7c8985b5 --- /dev/null +++ b/src/public/data/pack/server/maps/m33_72 @@ -0,0 +1,11 @@ +PPPPQPPQQPPPNOOPPPOPQTUUUTSPOOOONRUUQPONNOPPPQOSTQPONNPQQPPPONOPPPPTSQOQTRQOMNNOPPONQVWWWVSONNONMOSWRPONMOPPPOMQUTRPNMORTRPPNMORPQRTSOMOTSQQNOMNQQONQUTTTSPMMMNOOQSSQPPOORSRRRQWZYXURPSVXWTSQORSTXUTUSPSTRQQQQOPRSSRVXUSSSQOPPRSSTTRRTTUUWXXWXY\]]][YXY[\\YWVUUT\^ZXXWVWVTSRRRRTVWYYZZXUTUUUTUWXYYWVWY\\\^^][[]]^^^_]\\]]^]]\[ZX\_^]]\]]\\ZXUVXZ[\[\\[[ZZ[]^\]^]\\YZ[\^_^__^]_cf\[[_^]\[Z[]^^^^^TZ\^_^__^^^]\[\][YWXWX[\]^_`__^ZYYX]]]^^^^]]`dd_RRS[\ZYTSUZ\[[^_PRUZ\[\\[[[\]\[ZXTPPPTWYZ[]^^^\PQQTZ`_______ce`_PPPRSSRPPPQQRUY\PPPQQSSSSSTVXWUSRPPPPPQRRRRRRRRPPPP[`bba`aaade__PPPPPPPPPPPPPPRSPwwwwwPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP^bcbbccded\PPPPPPPPPPPPPPPPPPwwwwwPPPPPPPPPtttttPPPPPPPPPPPPPPPP_ddddcffgePPPPPPPPPPPPPPPPPPPwwwwwz|||||zzwtttttPPPPPPPPPPPPPPPiieiiiiiiiiPPPPPPPPPPPPPPPPPPPwwwwwz|||||zzwtttttPPPPPPPPPPPPPPPPSSTSSPPRRSPPPPPPPPPPPPPPPPPPPwwwwwPPPPPPPPPtttttPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPttPPPPPPPPPPPtttttPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPqqPPPPPPPPPPPPqqPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPqqPPPPcccccPPPnnPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPqqPfffcccccPPkkkPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPqqPfffcccccfhkkkPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPnnPfffcccccfhkkkPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPkkkkkhhPcccccPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPkkkkkkkPP``PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPkkkkkkkPP]]PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPkkkkkkkPP]]PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPkkkkkPPYYYYYPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPYYYYYPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPYYYYYPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPYYYYYPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPYYYYYPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPVVVPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPSSSPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPSSSPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPSSSPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP<PPPPPPPPPPPPPPPPP<<<PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP<FFFFFFFFFFFFFFFFF<<<<PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP<<<<<<<<<<<<<<<<<<<<PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP<<<<<<<<<<<<<<<<<<<PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP<<<<<<<<<<<<<<<<<PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP<<<<<222222<<<<<<PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP<<P2((((((<<<<<PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP(((((((<<<<PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP((((((P<<<PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP(((((PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPNNPPPPPPPPPPPPPPPPPPPPPP(((((((PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPKKKPPPPPPPPPPPPPPPPPPPPP(((((((PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPKKKPPPPPPPP77777PPPPP(((((((((((((PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPKKKKGGGGC?;77777PPPPP(((((((((((((PPPP11111PPPPPP11PPPPPPPPPPPPPKKKKGGGGC?;777772222-((((((((((((((((,11111PPPPPP11UPPPPPPPPPPPPPPPPPPPPPPP777772222-((((((((((((((((,1111111111P11UPPPPPPPPPPPPPPPPPPPPPPP77777PPPPP(((((((((((((PPPP1111111111111PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP(((((((((((((PPPP11111PP111111PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPbbZYZbbbbbbbPPPPPPPPPPPPP11111PPPPQRRRRPPPPPPPPQQQRPPPPPPPPPPPPP^^]bbbbbb^^^PPPPPPPPPPPPP11111PPRTWXXZZZYSPPPPTZZZYTRRSRPPPPQRSS^^^]]][]^^^^^PPPPPPQQPPPPPRSSRSUXY[\\]]]\YUQRS[^]]\YXZZXUSSUXYZ^^^^^^[\]^^^^^SPPQRTWWSQRSTY[ZYZ\][YYXZY[\\XWZZ^][\\\\^]\[XXZ]\]^^^\]YUZ]^^^Z^WTUXXY[[XWXYZ]^]^^^\XUSPSTVX[Z[]\ZWWY[]]][[]\\\][[[\ZUXVQU[\]ZZ[\Z[\[[\[Z[\\\[[[]Z\ZVQONOPQSVX[\ZWTUWY]\ZVWYZ\[YVUVUSRUVUYYUXXXY\\\[ZZYXZ]][YUTUVTXYURPNPMQRSVWVUTTTSVXYVSSTVWWVTTRQQRUXXYVQSSSTWYZWVVUTVXXVURRQQPTVTRQQMMMRTTSSSTTRORTVURRSSTWWWUPOPQSUTWURQPPPSVWTSTQOQTSPRRTRPPPRQRRSUMRRSSQRQSTOMOSUSPPRRSTVXWSPQQRRQRSRPPQPQVWSSTOMNPOMNPRQPPPPRTRRSRPPQPPPPRSQNOQSPMNPQQRRUVSQRRRSQRQQOOPOPTTQQSQNOPONOPPPP*w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*w*w*www*’w*’w*’w*’w*w’w’w’w*’w*’w*’w*’w*’w*’w’w’w’w*’w*’w*’w*’w*’w*’w*’w’w*w*’w*’w’ww’w*’w*’w*’w*’w*’w*’w’w’w’w’w’w*’w*’w*’w*’w’w’w’w’w*’w*’w*’w*ww’ww’ww*w*w*wwww’w’wwww’w’w’w’w’w’www’ww’w’w’w’w’w’ww’wwww’wwww’www’w’w’w’w’w’www’ww’w’w’w’w’w’w’wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww’w’ww*2’w!*2wwwww*2w!*2wwwwwwwwwwwwwwwwwwwwwwwww*2w*2w*2w!*2wwwwwwwwwwwwwwwwwwwwwwwww *2w*2w*2w*2w*2w*2www*2w*2w*2w#*2w!*2wwwwww*2w*2w*2w *2wwwwwwwwwwwww *2w*2w*2w*2w*2w#*2w *2w*2w!*2wwwww*2w*2w*2w*2w*2w *2wwwwwwwwwww *2w"*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w#*2w *2w*2w*2w *2ww*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w"*2w*2w*2w*2w*2w*2w*2w*2w#*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w *2wwwwwwwww *2w"*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2wwwwwwwwwwwwwwwwwwwwwwww+2w+2w+2w+2w+2w+2w*2w*2w*2w*2w*2w*2w*2w*2wwwwwwww*2w*2w*2w*2w*2w*2w*2w+2w+2w+2w+2w+2w+2wwwwww*2w*2w2w2w2w2w2w2wwwwwwwwwwwwwwwwwww+2w+2w+2w+2w+2w*2w*2w*2w*2w*2w*2w*2w*2www *2w*2w!*2www*2w*2w*2w*2w*2w*2w*2w+2w+2w+2w+2w+2wwwwwwwww2w*w*w*w*w2wwwwwwwww2w2w2w2w2w2wwwwww+2w+2w+2w+2w*2w*2w*2w*2w*2w*2w*2w*2w*2w *2w"*2w*2w#*2w *2w*2w"*2w*2w*2w*2w*2w*2w*2w+2w+2w+2w+2wwwwwwwwww2w*w*w*w*w2w2w2w2w2w2w2w2w2w2w*w*w*w*w2wwwwwww+2w+2w+2w+2w+2w+2w+2w+2w+2w+2w+2w#*2w"*2w+2w+2w+2w+2w+2w+2w+2w+2w+2w+2w+2w+2w+2w+2w+2wwwwwwwwwww2w*w*w*w*w*w*w*wwww*w*w*w*w*w*w*w*w2wwwwwwww+2w+2w+2+2+2w+2w+2w+2w+2w+2w+2w+2w+2w+2w+2w+2w+2w+2w+2w+2w+2w+2w+2w+2w+2w+2wwwwwwwwwwww2w*w*w*w*w2w2w2w2w2w2w2w2w2w2w*w*w*w*w2wwwwwwwww+2w+2+2+2w+2w+2w+2w+2w+2w+2w+2w*2w*2w+2w+2w+2w+2w+2w+2w+2w+2w+2w+2w+2wwwwwwwwwwwww2w2w*w2w2w2wwwwwwwww2w*w*w*w*w2wwwwwwwwww+2w+2w+2w+2w+2w+2w+2w+2w+2w+2w*2w*2w*2w+2w+2w+2w+2w+2w+2w+2w+2w+2wwwwwwwwwwwwwww2w*w2wwwwwwwwwww2w2w*w2w2w2wwwwwwwwww+2w+2w+2w+2w+2w+2w+2w*2w*2w*2w*2w*2w*2w*2w*2w+2w+2w+2w+2w+2w+2w+2wwwwwwwwwwwww2ww2wwww2w2w2w2w2w2www2w*w2wwwwwwwwwwww+2w+2w+2w+2w+2w+2w*2wwwwwwwww*2w+2w+2w+2w+2w+2w+2wwwwwwwwwwwww2ww2w2w2w2w2w*w*w*w*w2www2w*w2wwwwwwwwwwww*2w*2w*2w*2w*2w*2wwwwwwwwwww*2w*2w*2w*2w*2w*2wwwwwwwwwwwwwww2ww2w2w*w*w*w*w*w*w*w2w2w2w2w*w2wwwwwwwwwwww*2w*2w*2w*2w*2wwwwwwwwwwwww*2w*2w*2w*2w*2wwwwwwwwwwwwwww2w*w2w2w*w2w2w*w*w*w*w*w*w*w*w*w2wwwwwwwwwwww*2w*2w*2w*2wwwwwwwwwwwwwww*2w*2w*2w*2wwwwwwwwwwwwww2w2w*w2w2w*w2w2w*w*w*w*w2w2w2w2w2w2wwwwwwwwwwww*2w*2w*2wwwwwwwwwwwwwwwww*2w*2w*2wwwwwwwwwwwwww*w*w*w*w2w*w2w2w2w*w2w2w2wwwwwwwwwwwwwwwww*2w*2wwwwwwwwwwwwwwwwwww*2w*2wwwwwwwwwwwwww*w*w*w*w2w*w2ww2w*w2wwwwwwwwwwwwwwwwwww*2wwwwwwwwwwwwwwwwwwwww*2wwwwwwwwwwwwww*w*w*w*w*w*w2ww2w*w2wwwwwwwwwwwwwwwww*2wwwwwwwwwwwwwwwwwwwww*2wwwwwwwwwwwwww*w*w*w*w2w2w2w2w2w*w2w2wwwwwwwwwwwwwwww*2wwwwwwwwwwwwwwwwwwwww*2wwwwwwwwwwwwww2w2w2w2w2ww2w*w*w*w*w2wwwwwwwwwwwwwwwwww*2wwwwwwwwwwwwwwwwwwwww*2wwwwwwwwwwwwwwwwwwww2w*w*w*w*w2wwwwwwwwwwwwwwwwww*2wwwwwwwwwwwwwwwwwwwww*2wwwwwwwwwwwwwwwwwwww2w*w*w*w*w2wwwwwwwwwwwwwwwwww*2wwwwwwwwwwwwwwwwwwwww*2wwwwwwwwwwwwwwwwwwww2w*w*w*w*w2wwwwwwwwwwwwwwwwww*2wwwwwwwwwwwwwwwwwwwww*2wwwwwwwwwwwwwwwwwwww2w2w*w2w2w2wwwwwwwwwwwwwwwwww *2wwwwwwwwwwwwwwwwwwwww*2wwwwwwwwwwwwwwwwwwwww2w*w2wwwwwwwwwwwwwwwwwwww*2wwwwwwwwwwwwwwwwwwwww*2wwwwwwwwwwwwwwww2w2w2w2w2w2w*w2wwwwwwwwwwwwwwwwwwww*2wwwwwwwwwwwwwwwwwwwww*2wwwwwwwwwwwwwwww2w*w*w*w*w*w*w2wwwwwwwwwwwwwwwwwwww*2wwwwwwwwwwwwwwwwwwwww*2wwwwwwwwwwwwww2w*w2w2w2w2w2w2wwwwwwwwwwwwwwwwwwww*2wwwwwwwwwwwwwwwwwwwww*2wwwwwwwwwwwwww2w*w2w2w2w2wwwwwwwwwwwwwwwwwwww*2w(*2wwwwwwwwwwwwwwwwwww'*2w*2wwwwwwwwwwwwwwww2w*w*w*w*w2wwwwwwwwwwwwwwwwwwww*2w*2w*2w**2wwwwwwwwwwwwwww-*2w*2w*2wwwwwwwwwwwwwwwww2w2w2w2w*w2wwwwwwwwwwwwwwwwwwwwwwww*2w*2wwwwwwwwwwwwwww*2w*2w*2wwwwwwwwwwwwwwwwwwww2ww2wwwwwwwwwwwwwwwwwwwwwwwww*2wwwwwwwwwwwwwww*2w*2w*2wwwwwwwwwwwwwwwwwwww2ww2wwwwwwwwwwwwwwwwwwwwwwwww*2wwwwwwwwwwwwwww*2w*2wwwwwwwwwwwwwwwwwww2w2w2ww2w2wwwwwwwwwwwwwwwwwwwwwwww2w*2w *2wwwwwwwwwww*2w*2w*2wwwwwwwwwwwwwwwwww2w2w2w*w*w*w*w2wwwwwwwwwwwwwwwwwwwwww2w*2w*2w*w *w'*wwwww(*w*w*w*2w2wwwwwwwwwwwwwwwwwww2w*w*w*w*w*w*w2w2w2w2w2w2w2wwwwwwwwwwwwwwwwww2w2w*2w*2wwwww*2w*2w2w2w2wwwwwwwwwwwwwwwwwww2w*w2w*w*w*w*w*w*w*w*w*w*w2wwwwwwwwwwwwwwwwwwwww2w2w*2wwwww*2w2w2wwwwwwwwwwwwwwwwwwwww2w*w2w*w*w*w*w2w2w2w2w2w*w2wwwwwwwwwwwwwwwwwwwwww2w*2ww-*2w**2ww*2w2wwwwwwwwwwwwwwwwwwww2w*w2w2w2w2w2w2wwww2w*w2wwwwwwwwwwwwwwwwwwwwww2w2w*w2w2w*w2w2wwwwwwwwwwwwwwwwwwww2w*w2wwwwwwwww2w*w2wwwwwwwwwwwwwwwwwwwwww2w2w*w2w2w*w2w2wwwwwwwwwwwwwwwwwwwwww2w*w2wwwwwwwww2w*w2wwwwwwwwwwwwwwwwwwwwww2w2w*w2w2w*w2w2wwwwwwwwwwwwwwwwwwwwww2w*w2wwwwwwwww2w*w2wwwwwwwww2w2w2w2w2w2wwwww2w2w2w2w2w*w2w2w*w2w2w2w2w2wwwwwwwwwwwwwwwwwww2w*w2wwwwwwwww2w*w2w2w2w2w2w2w2w2w2w2w*w*w*w*w2wwwww2w*w*w*w*w*w2w2w*w*w*w*w*w2wwww2w2w2w2w2w2wwwwww2w2w2ww2w*w2wwwwwwwww2w*w*w*w*wwww*w*w*w*w*w*w*w*w2w2w2w2w2w2w*w2w2w2w2w2w2w2w2w2w2w*w2w2w2w2w2w*w*w*w*w2wwwwww2w*w*w2w2w*w2wwwwwwwww2w2w2w2w2w2w2w2w2w2w2w2w*w*w*w*w*wwww*w*w*w2wwwwwwwww2w*wwww*w*w*w*w*w*w2w2w2w2w2w2w2w*w2w*w*w*w2wwwwwwwwwwwwwwwwwwww2w*w*w*w*w2w2w2w2w2w2w*w2w2w2w2w2w2w2w2w2w2w*w2w2w2w2w2w*w*w*w*wwww*w*w2w2w*w2w2w2w2w2wwwwwwwwwwwwwwwwww2w2w2w2w2w2wwwww2w*w*w*w*w*w*w*w*w*w*w*w*w2wwww2w*w*w*w*w2w2w2w2w*w2w2w*w2wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww2w2w2w2w2w2w*2w2w2w2w2w2w2w2wwww2w2w2w2w2w2www2w*w2w2w*w2wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww$*2w*2ww +*2w%*2wwwwwwwwwwwwwwwww2w*w*w*w*w2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w$*2w*2w*2wwww*2w%*2w*2w*2w*2w*2wwwwwwwwwwww2w2w2w2w2w2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w$*2w*2wwwwwww*2w*2w +*2w%*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2wwwww +*2w*2w*2w*2w*2w*2w*2w*2w*2www*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w *2wwwwwwwwwww*2w%*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2w*2wwwwwwwwwww +*2w*2w*2w*2w*2wwww*2w%*2w*2w*2www +*2w*2w*2w*2w*2w*2wwwwwwwwwwwww’www*2w*2w*2w*2w*2w*2w*2w$*2w*2w*2w*2w$*2w*2w*2www +*2w*2wwwwwwwwwwwwwwwwwwwww*2w*2w*2wwwwww +*2w*2www’w’ww’wwwww’w’w’w’w’ww*2w*2w$*2w*2ww’w +*2’w*2www +*2w*2wwwwwwwwwwwwwww’wwwww’w’wwwwwwwwwww’w’ww’ww’w’w’w’w’w’w’www’w’w’w’w’w’w’ww +*2w*2w’w’w’w’w’www’ww’w’w’w’w’wwwwwwww*w*’w*’w *’www’w’w’w’wwwwwww*w*w*’w*’w*’w*’w *’w’w’w’w’w’w’w’w’w’w’w’w’w’w’w’w’wwww’w’w’w’w’w’w*’w*’w*’w*’w*’w *’w’w’w’w’w *wwwww*w*’w*’w*’w*’w *’w’w’w’w’w’w’wwwww*w*w*’w*’w*’w*’w*’w*’w *’w’w’w*’w*’w*’w *’w’www’w’w’w’w’wwww’w’w’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w *’w’w’w’w*w*w*w*w*w*w*w*’w*’w*’w*w *w’w’w’w*’w*w*w*w*w*w*w*w*w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*w*’w*w *www’w*’w*’w *wwwww*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*’w*w*w*w*w*w*w*w*w*’w*w*w*w*w*’w*’w*w*w*w*w*w*w*w*w*w*w*’w*’w*w*’w*w*’w*’w*w*w*w*w*w*w*w*w*w*w*w*w*w*w*w*w*w*’w*w*w*w*’w*w*w*’w*w*’w*’w*’w*’w*’w*w****************************************************************************************************** \ No newline at end of file diff --git a/src/public/data/pack/server/maps/m33_73 b/src/public/data/pack/server/maps/m33_73 new file mode 100644 index 00000000..699212ba Binary files /dev/null and b/src/public/data/pack/server/maps/m33_73 differ diff --git a/src/public/data/pack/server/maps/m33_74 b/src/public/data/pack/server/maps/m33_74 new file mode 100644 index 00000000..ec864ecb Binary files /dev/null and b/src/public/data/pack/server/maps/m33_74 differ diff --git a/src/public/data/pack/server/maps/m33_75 b/src/public/data/pack/server/maps/m33_75 new file mode 100644 index 00000000..17164d05 --- /dev/null +++ b/src/public/data/pack/server/maps/m33_75 @@ -0,0 +1 @@ +*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F+F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F F F F F F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F F F F F F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F F F F F F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F F F F F F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F F F F F F+F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*2F*F*2F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*2*F*2F**F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*2*F*2F**F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*2*F*2F**F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*2*F*2F**F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*2*F*2F**F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*2*F*2F**F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*2*F*2F**F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*2*F*2F**F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*2*F*2F**F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*2*F*2F**F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*2*F*2F**F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*2*F*2F**F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*FFFFFFFFF F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*FFFFFFFFFFF F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*FFFFFFFFFFFF*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F F F F F F*F*F*F*F*F*F*F*F*F*F*F*F*FFFFFFFFFFFF*F*F*F*F*F*F*F*F*F*F*F*F*F F F F F F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F F F F F F*2F*2*2*2*2*2*2*2*2*2*2*2*2FFFFFFFFFFF*2F*2*2*2*2*2*2*2*2*2*2*2*2 F F F F F+F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F F F F F F*F*F*F*F*F*F*F*F*F*F*F*F*FFFFFFFFFFFF*F*F*F*F*F*F*F*F*F*F*F*F*F F F F F F+F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F F F F F F*2F*2F*2F*2F*2F*2F*2F*2F*2F*2F*2F*2F*2FFFFFFFFFFFF*2F*2F*2F*2F*2F*2F*2F*2F*2F*2F*2F*2F*2F F F F F F+F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F F F F F F*F************FFFFFFFFFFF*F************ F F F F F+F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*FFFFFFFFFFFF*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F+F*F+F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*FFFFFFFFFFFF*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*FFFFFFFFFF*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*2F*F*2F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*2*F*2F**F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*2*F*2F**F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*2*F*2F**F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*2*F*2F**F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*2*F*2F**F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*2*F*2F**F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*2*F*2F**F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*2*F*2F**F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*2*F*2F**F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*2*F*2F**F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*2*F*2F**F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*2*F*2F**F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F F F F F F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F F F F F F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F F F F F F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F F F F F F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F F F F F F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F*F \ No newline at end of file diff --git a/src/public/data/pack/server/maps/m33_76 b/src/public/data/pack/server/maps/m33_76 new file mode 100644 index 00000000..c1e957c6 Binary files /dev/null and b/src/public/data/pack/server/maps/m33_76 differ diff --git a/src/public/data/pack/server/maps/m34_70 b/src/public/data/pack/server/maps/m34_70 new file mode 100644 index 00000000..f06a6d8b Binary files /dev/null and b/src/public/data/pack/server/maps/m34_70 differ diff --git a/src/public/data/pack/server/maps/m34_71 b/src/public/data/pack/server/maps/m34_71 new file mode 100644 index 00000000..0470cdf4 Binary files /dev/null and b/src/public/data/pack/server/maps/m34_71 differ diff --git a/src/public/data/pack/server/maps/m34_72 b/src/public/data/pack/server/maps/m34_72 new file mode 100644 index 00000000..429abcd1 Binary files /dev/null and b/src/public/data/pack/server/maps/m34_72 differ diff --git a/src/public/data/pack/server/maps/m34_73 b/src/public/data/pack/server/maps/m34_73 new file mode 100644 index 00000000..dafa051f Binary files /dev/null and b/src/public/data/pack/server/maps/m34_73 differ diff --git a/src/public/data/pack/server/maps/m34_74 b/src/public/data/pack/server/maps/m34_74 new file mode 100644 index 00000000..55cc37ba Binary files /dev/null and b/src/public/data/pack/server/maps/m34_74 differ diff --git a/src/public/data/pack/server/maps/m34_75 b/src/public/data/pack/server/maps/m34_75 new file mode 100644 index 00000000..d85fa624 Binary files /dev/null and b/src/public/data/pack/server/maps/m34_75 differ diff --git a/src/public/data/pack/server/maps/m34_76 b/src/public/data/pack/server/maps/m34_76 new file mode 100644 index 00000000..bf8250ba Binary files /dev/null and b/src/public/data/pack/server/maps/m34_76 differ diff --git a/src/public/data/pack/server/maps/m35_20 b/src/public/data/pack/server/maps/m35_20 new file mode 100644 index 00000000..ddd85c45 Binary files /dev/null and b/src/public/data/pack/server/maps/m35_20 differ diff --git a/src/public/data/pack/server/maps/m35_75 b/src/public/data/pack/server/maps/m35_75 new file mode 100644 index 00000000..bc207884 Binary files /dev/null and b/src/public/data/pack/server/maps/m35_75 differ diff --git a/src/public/data/pack/server/maps/m35_76 b/src/public/data/pack/server/maps/m35_76 new file mode 100644 index 00000000..615420d3 Binary files /dev/null and b/src/public/data/pack/server/maps/m35_76 differ diff --git a/src/public/data/pack/server/maps/m36_146 b/src/public/data/pack/server/maps/m36_146 new file mode 100644 index 00000000..0279879c Binary files /dev/null and b/src/public/data/pack/server/maps/m36_146 differ diff --git a/src/public/data/pack/server/maps/m36_147 b/src/public/data/pack/server/maps/m36_147 new file mode 100644 index 00000000..d12a0ebc Binary files /dev/null and b/src/public/data/pack/server/maps/m36_147 differ diff --git a/src/public/data/pack/server/maps/m36_148 b/src/public/data/pack/server/maps/m36_148 new file mode 100644 index 00000000..fe12d689 Binary files /dev/null and b/src/public/data/pack/server/maps/m36_148 differ diff --git a/src/public/data/pack/server/maps/m36_149 b/src/public/data/pack/server/maps/m36_149 new file mode 100644 index 00000000..2e7afe5a Binary files /dev/null and b/src/public/data/pack/server/maps/m36_149 differ diff --git a/src/public/data/pack/server/maps/m36_150 b/src/public/data/pack/server/maps/m36_150 new file mode 100644 index 00000000..4ccbd74b Binary files /dev/null and b/src/public/data/pack/server/maps/m36_150 differ diff --git a/src/public/data/pack/server/maps/m36_153 b/src/public/data/pack/server/maps/m36_153 new file mode 100644 index 00000000..5ad32647 Binary files /dev/null and b/src/public/data/pack/server/maps/m36_153 differ diff --git a/src/public/data/pack/server/maps/m36_154 b/src/public/data/pack/server/maps/m36_154 new file mode 100644 index 00000000..00efac9a Binary files /dev/null and b/src/public/data/pack/server/maps/m36_154 differ diff --git a/src/public/data/pack/server/maps/m36_52 b/src/public/data/pack/server/maps/m36_52 new file mode 100644 index 00000000..dfd9e673 Binary files /dev/null and b/src/public/data/pack/server/maps/m36_52 differ diff --git a/src/public/data/pack/server/maps/m36_53 b/src/public/data/pack/server/maps/m36_53 new file mode 100644 index 00000000..c347b225 Binary files /dev/null and b/src/public/data/pack/server/maps/m36_53 differ diff --git a/src/public/data/pack/server/maps/m36_54 b/src/public/data/pack/server/maps/m36_54 new file mode 100644 index 00000000..86ef4830 Binary files /dev/null and b/src/public/data/pack/server/maps/m36_54 differ diff --git a/src/public/data/pack/server/maps/m36_72 b/src/public/data/pack/server/maps/m36_72 new file mode 100644 index 00000000..8cb31253 Binary files /dev/null and b/src/public/data/pack/server/maps/m36_72 differ diff --git a/src/public/data/pack/server/maps/m36_73 b/src/public/data/pack/server/maps/m36_73 new file mode 100644 index 00000000..98631b46 Binary files /dev/null and b/src/public/data/pack/server/maps/m36_73 differ diff --git a/src/public/data/pack/server/maps/m36_74 b/src/public/data/pack/server/maps/m36_74 new file mode 100644 index 00000000..80d438b2 Binary files /dev/null and b/src/public/data/pack/server/maps/m36_74 differ diff --git a/src/public/data/pack/server/maps/m36_75 b/src/public/data/pack/server/maps/m36_75 new file mode 100644 index 00000000..f0f3f3ab Binary files /dev/null and b/src/public/data/pack/server/maps/m36_75 differ diff --git a/src/public/data/pack/server/maps/m36_76 b/src/public/data/pack/server/maps/m36_76 new file mode 100644 index 00000000..315a3ff5 Binary files /dev/null and b/src/public/data/pack/server/maps/m36_76 differ diff --git a/src/public/data/pack/server/maps/m37_146 b/src/public/data/pack/server/maps/m37_146 new file mode 100644 index 00000000..aaf987be Binary files /dev/null and b/src/public/data/pack/server/maps/m37_146 differ diff --git a/src/public/data/pack/server/maps/m37_147 b/src/public/data/pack/server/maps/m37_147 new file mode 100644 index 00000000..f2712f9c Binary files /dev/null and b/src/public/data/pack/server/maps/m37_147 differ diff --git a/src/public/data/pack/server/maps/m37_148 b/src/public/data/pack/server/maps/m37_148 new file mode 100644 index 00000000..a52b8ac9 Binary files /dev/null and b/src/public/data/pack/server/maps/m37_148 differ diff --git a/src/public/data/pack/server/maps/m37_149 b/src/public/data/pack/server/maps/m37_149 new file mode 100644 index 00000000..8053d530 Binary files /dev/null and b/src/public/data/pack/server/maps/m37_149 differ diff --git a/src/public/data/pack/server/maps/m37_150 b/src/public/data/pack/server/maps/m37_150 new file mode 100644 index 00000000..5f90225b Binary files /dev/null and b/src/public/data/pack/server/maps/m37_150 differ diff --git a/src/public/data/pack/server/maps/m37_151 b/src/public/data/pack/server/maps/m37_151 new file mode 100644 index 00000000..9a338925 Binary files /dev/null and b/src/public/data/pack/server/maps/m37_151 differ diff --git a/src/public/data/pack/server/maps/m37_152 b/src/public/data/pack/server/maps/m37_152 new file mode 100644 index 00000000..4a890f5b Binary files /dev/null and b/src/public/data/pack/server/maps/m37_152 differ diff --git a/src/public/data/pack/server/maps/m37_153 b/src/public/data/pack/server/maps/m37_153 new file mode 100644 index 00000000..e4cf8c65 Binary files /dev/null and b/src/public/data/pack/server/maps/m37_153 differ diff --git a/src/public/data/pack/server/maps/m37_154 b/src/public/data/pack/server/maps/m37_154 new file mode 100644 index 00000000..73757644 Binary files /dev/null and b/src/public/data/pack/server/maps/m37_154 differ diff --git a/src/public/data/pack/server/maps/m37_48 b/src/public/data/pack/server/maps/m37_48 new file mode 100644 index 00000000..4f4ef533 Binary files /dev/null and b/src/public/data/pack/server/maps/m37_48 differ diff --git a/src/public/data/pack/server/maps/m37_49 b/src/public/data/pack/server/maps/m37_49 new file mode 100644 index 00000000..afa8304e Binary files /dev/null and b/src/public/data/pack/server/maps/m37_49 differ diff --git a/src/public/data/pack/server/maps/m37_50 b/src/public/data/pack/server/maps/m37_50 new file mode 100644 index 00000000..1e88ae9b Binary files /dev/null and b/src/public/data/pack/server/maps/m37_50 differ diff --git a/src/public/data/pack/server/maps/m37_51 b/src/public/data/pack/server/maps/m37_51 new file mode 100644 index 00000000..52d65d54 --- /dev/null +++ b/src/public/data/pack/server/maps/m37_51 @@ -0,0 +1 @@ +€€€€€€€€€‚ƒ€sgbr€€€€€€uuurlnv„†…„‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~€„ˆ‹Š…}z€€€€€€€€~ƒƒ…‰ŒŽŽŽŒˆ„€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~€‚†Š†€€€€€€€€…Ž”–˜™™˜˜—•Š‚€€€€€€€€€€€€€€€€€€€€€€€€€~~~}}~€ƒ†Š‘Š…€€€€€ƒš¡££¤¢¡  žš”‹‚€€€€€€€€€€€€€€€€€€€€€€€€~|{|~€‚„…†‡‰‹ŒŒˆ„‚€€€ƒš¢¦¥¥¥¤¤££¢¡—Ž†€€€€€€€€€€€€€€€€€€€€~}{|€ƒ†ˆŠŠŠ‰‰‰ˆˆ…ƒ€„ £¥¡ žžŸ Ÿ Ÿœ—‡ƒ€€€€€€€€€€€€€€€€€€€…||€…ˆŒŽ‹‰‡…„‚€~€‚†Œ’”••““‘‘“–—š›˜’Š‚~~€€€€€€€€€€€€€€€€€€Šˆƒ€‚‡‘’’‘Œ‰…‚€~}}~€‚†ˆ‰‰‡…ƒ‚‚…‹Ž”˜™“Š€wv|€€€€€€€€€€€€€€€€€†“’‹…„‰’““‘‹†‚~|{zz{|‚……‚~zvroorw€‡‘™›–‚yru€€€ƒ„…†…ƒ€€€€€€‡˜™ˆ…‰’’’‰ƒzwvwwy{~„|unhdbcgmvŽ˜š—†}ut€…‰Œ‘’‘ŒŠ…€€€ƒ—š“Š†ˆ‹†~xtqqrsvy}}uld`]\^agoz„’’Ž‡}{‡Ž–šžŸŸž›—†€€—œ•‹……‰‹‹Š†‚~xrnkkmptw|~yod_]\\^aekqx€†ˆˆ…ƒ‚‚ˆ˜Ÿ£§§¨¨¨¦¢›…€€€——Œƒ€ƒ……‚|xrlgdeimrvz|}vja^^`bdfgihou{~€ƒ…‰‘š¡§©««¬¬¬¬©¤›Ž„€†˜œ–Šz|}}{zyvpib_`ekquzywpf_^`dgjllkhjmquy}‚ˆ˜ ¥©«¬­®­®­¬©£˜‚šž–†ytuvwy{zwoh`\]bjqv{yvnd^^chnqrrpljkmpty€Š•Ÿ¦©«¬­®®®®®­«¨ •†…‹Œ†{rpqty}€}voga^_cksy}{wnd__emtyzywtonnpsy™£©«¬­®®¯¯¯®®¬ª¥™ˆ|vpoqx‡ˆvohdcdgmw|~zpf_`hr{‚„ƒ€|wutuw|„‘¦ª¬­®®¯°°°°°¯­ªž‡~}}zwtrt~……‚{uokjklns{‚†‚}sibahu‰ŒŒˆ…|zz|€ˆ•£ª¬­®®®¯°°°°°¯­«¡~}|{yxwy„|vrpqsuwy{ˆŠ†€wmechr~ˆŠ…‚~‚Š—§¬®®®®¯¯°°°°°°®¬§˜~}}||{{{}~zuqprvz}‚‚„ŠŠ‚zqifho{†’‰…‚€‡”¦¬®®®®®®¯°°°°¯­ª¡}}}~~~}ywvrnlouz€…†ˆ†„‰Œ‹ƒ}upkkpy„‘‹‡ƒ€~€„Ž «®®®®®®¯¯°°°¯¬¨œŠ|}}~~vqnjhinv~…‰‰Š†ƒ‡‰†‚}yvsru|…Œ‘‘Œ†|z}ƒ¨¬¬­­®®®¯¯°°¯«¥™‰x{}~}tniffiox€‡Œ‹‰…ƒ…‡„~|{{{~‚ˆŽ’“‘‹‚yrps{‡•£ª«¬­­­®®¯¯°¯ª£—‡iuz}~}uniggjq{„‰‹ˆƒ‚„†ƒ€ƒ†‰Ž“——‘‡{ogdgp~›¥¨ª«¬­­®®¯¯¬£›“‰Skw|~~ysnkjmt}…Š‰†‚‚ƒ…‚‚„…†‡‰Œ”˜œš’…vi`]^guƒ‘œ¢¦©ª«¬­®®®¦œ—•’>`u|€€}xspqw~…ˆŠ†ƒ€‚„„†‰ŽŽ’—šž Ÿ•…uia^`fn|ˆ‘š ¤§©ª¬®®«›—˜ž¥7]u|~€…‡ƒ}ywy~ƒ…†ƒ€€‚„…ˆŒ’“”—œ £¤ –‡ynhffinw‚ˆ™ž¡¥©©°°°”•ž§¬4e{†Ž’‡}{}€‚€€ƒ…‰Ž“•–˜›Ÿ¤§¨¤š‹wtsrqrw€‚†‹‘”—“‹Š‰Š–¢ª¬8g|€ƒš¢Ÿ‘‡~||}}}}}~€‚…‰Ž”—˜š¡¥©¬¨ž†‚€€|zz€€ƒ„…‡ˆ…€€€†–¥ª¢Ek|€…‘ž¦£—‹}zzyzz{{}~„ˆŽ“–™œŸ£¨«­ª¢–ŠŠ‹‹‡ƒ}€…‚€€€€€€€‡—¦¬©Vvƒƒ„Ž›™•„}xvvvwxyz{|‚‡‘•˜œŸ¤¨ª­¬¥š’‘’Ž‹……Œ†€€€€€€€€ƒŸ¦œl†‘Ž†‚‡‹„}vrpqrtvwwxz|€„Š“—›ž£¦©¬¬§•’’“•“’‹”‹„€€€€€€€€€…Ž•Ž‰š¢œ„‚…†‚}unjikoqstuvwy|‚‰‘”–šŸ£¨¬«¨¡˜“’”—˜–“•Œ…€€€€€€€€€€‚†‚ª®©›ˆ€€€}woiedgloqsttuvx~†‹“™¡§«­¬¦–““–—•’–‹„€€€€€€€€€€€€€ ¬®¬Ÿˆ€€~zumgcbekoqstvxwv{†ˆ‡†ˆš¤ª¬­©¢œ–••–“‹Ž‡€€€€€€€€€€€€€ «®«Ÿˆ}yunhdcfmqsux|~~||ƒ„~€‡”¡¨«¬«§¢žš™—’Œ‰†‚€€€€€€€€€€€€€€ «®«ž„}{wrkgfiqstx~…ˆ‡ƒ€ƒ„{|‚œ¥©¬¬ª¨¦¤¢Ÿ™ˆ‚€€€€€€€€€€€€ƒ…‘Ÿ¦}wqljlstu{ƒ‹Ž‰„‚…‡ƒ~~ƒ— ¤§¬¬­®®­¬¦—‡€€€€€€„…„†ƒŽ˜Ž€€€€€€{vsqquvv|„Œ’’‡…ˆ‹ˆ„ƒ…”›Ÿ¡¥£¥©­®­§—‡€€€€€†ŠŒ‰…†Ž˜¢„„‡‚€€€€€€€~{zyyzzy|ƒŠ‘“ŠˆŠŽŒŠŠŒ“•–—•—ž¥¨¦…€€€€€€„Š‘“Š‹“ž§•Ž…€€€€€€€€‚ƒƒ~~‚ˆ“’Ž‹Œ’“’‹‹ŒŒŠ‰Œ”¢¡™„€€€€€€…•˜’Œ•ž¤ª¡‚€„…„€€ƒ‡‹ŽŠ††•—”Ž•——–’‰…„ƒƒ…Š‘˜—†€€€€€„‹’•—œ˜°­Ÿ‰…ŠŒŠ…„‰’““‡‚†™ž›•Ž”–•’‡ƒ€€‚†”™™‘‰‚€€€€€‚†‹ŽŠŽ•œŸ˜°¯§„‰“Š„„Š‘”“‘‡‡›¡œ‘‰‰‘Š†‚€€„Š‘˜›Ÿžš“‹„€€€€€€„…†š¡¤’°°°£ŒŒ–š–…‚‡ŒŽŒ‰Œ—•˜“Š„ƒ†‰ŠŠ‡ƒ€€†Œ”š›žœ˜’Š„€€€€€€€€€ƒ›¤¦”®°®¥Œ——Œ„€€‚…†…ƒˆ”™•’‘‰ƒ€ƒ……ƒ€€†Œ”˜˜˜–’Žˆƒ€€€€€€€€€‹˜£¨™ª®ªŠ†Ž•Ž…€€€€€€€€…™¡£ —„€€€€€€€€€„‰’’‘‹ˆ…‚€€€€€€€€€…›¡‘¡ª¡‚€ƒ†ƒ€€€€€€€€€„‹•ž¡”‰‚€€€ƒ…ƒ€€€…‰‹‹ŠŠŒŽŒˆ„€€€€€€€‚Š“”~Ž˜Žƒ€€€€€€€€€€€€ƒ…„‡‘™›˜…€€€…ŠŽ†€€€ƒ……†Š”—•‘‹…€€€€€€€‡ŒŠt‚†‚€€€€€€€€€€€€ƒŒ‰‹Žˆƒ€€„Œ•œžŽ…€€€€€…Œ”›Ÿ™“Š‚€€€€€€€ƒ†m€€€€€€€€€€€€€€ƒŽ˜œ˜Žˆ†††…„„„„ˆ‘›¤¨›Œ„€€€€€€…–ž¢¡–„€€€||~}k€€€€ƒ†„€€€„ŒšŸ¢œ†‚ƒ†ˆŠŠŠŒ“œ¤§£”‰ƒ€€€€„‹”›Ÿžš“‰‚€€}zxx|€r€€€†‹‹‡ƒ‚ƒ‡ŠŒ‘š˜„€€„ˆ‘‘”š¡§¦œ’Š†…†…„…ˆŽ”—•‘‹…‚ƒ€{vsuz‚„|€€€ƒ’–•’Ž‰‡‹“™—“‘†€€„‰”–”’’–›¢¤¡›”Œˆ…†‰‹Šˆ„‚ƒ‹‰‚xpmpv€†ˆ€€€‡££ž™””¢°°°–Š„€€€ƒˆ”•”•›¡¤¤ž››œœ˜†‚‚‚‚‚„Š‘˜‚tkfgmw}}€€€ˆ¤¥ ›–’‘˜¦°°°—‡€€€€…‹‘Œ‰‰Œ’›¢©¦¥¦¨¨¥œŽƒ€€…‹“ššŽ€qf`^`fii€€Š¡¤ ›–‘” °°°‘…€€€€€€‚…‰Š‰†ƒƒ…‰‘˜ž ¢§¨©©¤—†€€ƒŠ‘’†{nc[URPNC€€‚‹›žœ—’Š‹”°°€ƒ€€€€€€€€ƒ„ƒ€€ƒˆŽ”—šž ¢¥€€€†‹ŒŒŠ…xpeYOHA;1€€ƒŒ–™—“Ž‰„‚ƒ††€€€ƒ‡ˆ‡…‚€€€€€€€…‹‘““““””…‚ƒ††…‚~}|ym\MB80(€€ƒŒ”–•‹†€€‚‚ƒƒ‡’‘ŽŠ‡„‚€€€€€€‚‡“–“Œ‹‹‰„€€€}{z}‚ƒ{hVJ@0"€€„Ž”–“Žˆƒ€€ƒ†‰ŒŽ“”’Š†ƒ€€€€€„‰”–“‰ˆ‡…‚€}}|{ywuv|ƒ‰…vf]UD,€‹“˜—‘‹…€‚…ŠŽ’•˜™™˜”’ˆ„€€€€„ˆŽŠˆ†„~|yxvusqopv}„‚xqojX9€€•™œ•Ž‡‚€‚ˆŽ”˜›Ÿ¡ Ÿœ•’“‘Š…‚€€€€ƒ†ŠŽŒ‰‡…‚}wtsonmnmljjmswwuxzwcC€€‹’ˆ„€€„•œ¡£¥§©¨¦¡‘›™‰„€€€€€ƒˆ“‰…ƒ‚xpbed`]bghgfefhklp~y{SK \ No newline at end of file diff --git a/src/public/data/pack/server/maps/m37_52 b/src/public/data/pack/server/maps/m37_52 new file mode 100644 index 00000000..5be435f9 Binary files /dev/null and b/src/public/data/pack/server/maps/m37_52 differ diff --git a/src/public/data/pack/server/maps/m37_53 b/src/public/data/pack/server/maps/m37_53 new file mode 100644 index 00000000..28303974 Binary files /dev/null and b/src/public/data/pack/server/maps/m37_53 differ diff --git a/src/public/data/pack/server/maps/m37_54 b/src/public/data/pack/server/maps/m37_54 new file mode 100644 index 00000000..617a9fde Binary files /dev/null and b/src/public/data/pack/server/maps/m37_54 differ diff --git a/src/public/data/pack/server/maps/m37_55 b/src/public/data/pack/server/maps/m37_55 new file mode 100644 index 00000000..873ae615 Binary files /dev/null and b/src/public/data/pack/server/maps/m37_55 differ diff --git a/src/public/data/pack/server/maps/m37_72 b/src/public/data/pack/server/maps/m37_72 new file mode 100644 index 00000000..bffd404b Binary files /dev/null and b/src/public/data/pack/server/maps/m37_72 differ diff --git a/src/public/data/pack/server/maps/m37_73 b/src/public/data/pack/server/maps/m37_73 new file mode 100644 index 00000000..38c62f49 Binary files /dev/null and b/src/public/data/pack/server/maps/m37_73 differ diff --git a/src/public/data/pack/server/maps/m37_74 b/src/public/data/pack/server/maps/m37_74 new file mode 100644 index 00000000..4e5519fe Binary files /dev/null and b/src/public/data/pack/server/maps/m37_74 differ diff --git a/src/public/data/pack/server/maps/m37_75 b/src/public/data/pack/server/maps/m37_75 new file mode 100644 index 00000000..3d38cb37 Binary files /dev/null and b/src/public/data/pack/server/maps/m37_75 differ diff --git a/src/public/data/pack/server/maps/m38_146 b/src/public/data/pack/server/maps/m38_146 new file mode 100644 index 00000000..938f54e1 Binary files /dev/null and b/src/public/data/pack/server/maps/m38_146 differ diff --git a/src/public/data/pack/server/maps/m38_147 b/src/public/data/pack/server/maps/m38_147 new file mode 100644 index 00000000..8b2f18ed Binary files /dev/null and b/src/public/data/pack/server/maps/m38_147 differ diff --git a/src/public/data/pack/server/maps/m38_148 b/src/public/data/pack/server/maps/m38_148 new file mode 100644 index 00000000..b6f2a889 Binary files /dev/null and b/src/public/data/pack/server/maps/m38_148 differ diff --git a/src/public/data/pack/server/maps/m38_149 b/src/public/data/pack/server/maps/m38_149 new file mode 100644 index 00000000..98ccfe97 Binary files /dev/null and b/src/public/data/pack/server/maps/m38_149 differ diff --git a/src/public/data/pack/server/maps/m38_150 b/src/public/data/pack/server/maps/m38_150 new file mode 100644 index 00000000..ad233c28 Binary files /dev/null and b/src/public/data/pack/server/maps/m38_150 differ diff --git a/src/public/data/pack/server/maps/m38_151 b/src/public/data/pack/server/maps/m38_151 new file mode 100644 index 00000000..9c338217 Binary files /dev/null and b/src/public/data/pack/server/maps/m38_151 differ diff --git a/src/public/data/pack/server/maps/m38_152 b/src/public/data/pack/server/maps/m38_152 new file mode 100644 index 00000000..dbd2450c Binary files /dev/null and b/src/public/data/pack/server/maps/m38_152 differ diff --git a/src/public/data/pack/server/maps/m38_153 b/src/public/data/pack/server/maps/m38_153 new file mode 100644 index 00000000..1f9ebd20 Binary files /dev/null and b/src/public/data/pack/server/maps/m38_153 differ diff --git a/src/public/data/pack/server/maps/m38_154 b/src/public/data/pack/server/maps/m38_154 new file mode 100644 index 00000000..da19d076 Binary files /dev/null and b/src/public/data/pack/server/maps/m38_154 differ diff --git a/src/public/data/pack/server/maps/m38_155 b/src/public/data/pack/server/maps/m38_155 new file mode 100644 index 00000000..72cb6f94 Binary files /dev/null and b/src/public/data/pack/server/maps/m38_155 differ diff --git a/src/public/data/pack/server/maps/m38_45 b/src/public/data/pack/server/maps/m38_45 new file mode 100644 index 00000000..9f91fd8a Binary files /dev/null and b/src/public/data/pack/server/maps/m38_45 differ diff --git a/src/public/data/pack/server/maps/m38_46 b/src/public/data/pack/server/maps/m38_46 new file mode 100644 index 00000000..56fd0994 Binary files /dev/null and b/src/public/data/pack/server/maps/m38_46 differ diff --git a/src/public/data/pack/server/maps/m38_47 b/src/public/data/pack/server/maps/m38_47 new file mode 100644 index 00000000..9ad4315e Binary files /dev/null and b/src/public/data/pack/server/maps/m38_47 differ diff --git a/src/public/data/pack/server/maps/m38_48 b/src/public/data/pack/server/maps/m38_48 new file mode 100644 index 00000000..4bffbc40 Binary files /dev/null and b/src/public/data/pack/server/maps/m38_48 differ diff --git a/src/public/data/pack/server/maps/m38_49 b/src/public/data/pack/server/maps/m38_49 new file mode 100644 index 00000000..df03ff5a Binary files /dev/null and b/src/public/data/pack/server/maps/m38_49 differ diff --git a/src/public/data/pack/server/maps/m38_50 b/src/public/data/pack/server/maps/m38_50 new file mode 100644 index 00000000..ae52687d Binary files /dev/null and b/src/public/data/pack/server/maps/m38_50 differ diff --git a/src/public/data/pack/server/maps/m38_51 b/src/public/data/pack/server/maps/m38_51 new file mode 100644 index 00000000..4accd1b4 Binary files /dev/null and b/src/public/data/pack/server/maps/m38_51 differ diff --git a/src/public/data/pack/server/maps/m38_52 b/src/public/data/pack/server/maps/m38_52 new file mode 100644 index 00000000..eb728cf4 Binary files /dev/null and b/src/public/data/pack/server/maps/m38_52 differ diff --git a/src/public/data/pack/server/maps/m38_53 b/src/public/data/pack/server/maps/m38_53 new file mode 100644 index 00000000..eb5a130c Binary files /dev/null and b/src/public/data/pack/server/maps/m38_53 differ diff --git a/src/public/data/pack/server/maps/m38_54 b/src/public/data/pack/server/maps/m38_54 new file mode 100644 index 00000000..8d194291 Binary files /dev/null and b/src/public/data/pack/server/maps/m38_54 differ diff --git a/src/public/data/pack/server/maps/m38_55 b/src/public/data/pack/server/maps/m38_55 new file mode 100644 index 00000000..2bd0ca84 Binary files /dev/null and b/src/public/data/pack/server/maps/m38_55 differ diff --git a/src/public/data/pack/server/maps/m38_72 b/src/public/data/pack/server/maps/m38_72 new file mode 100644 index 00000000..55ae3c49 Binary files /dev/null and b/src/public/data/pack/server/maps/m38_72 differ diff --git a/src/public/data/pack/server/maps/m38_73 b/src/public/data/pack/server/maps/m38_73 new file mode 100644 index 00000000..e72871b1 Binary files /dev/null and b/src/public/data/pack/server/maps/m38_73 differ diff --git a/src/public/data/pack/server/maps/m38_74 b/src/public/data/pack/server/maps/m38_74 new file mode 100644 index 00000000..0f29a5b0 Binary files /dev/null and b/src/public/data/pack/server/maps/m38_74 differ diff --git a/src/public/data/pack/server/maps/m39_147 b/src/public/data/pack/server/maps/m39_147 new file mode 100644 index 00000000..57d53e22 Binary files /dev/null and b/src/public/data/pack/server/maps/m39_147 differ diff --git a/src/public/data/pack/server/maps/m39_148 b/src/public/data/pack/server/maps/m39_148 new file mode 100644 index 00000000..68d3c867 Binary files /dev/null and b/src/public/data/pack/server/maps/m39_148 differ diff --git a/src/public/data/pack/server/maps/m39_149 b/src/public/data/pack/server/maps/m39_149 new file mode 100644 index 00000000..503d2f0a Binary files /dev/null and b/src/public/data/pack/server/maps/m39_149 differ diff --git a/src/public/data/pack/server/maps/m39_150 b/src/public/data/pack/server/maps/m39_150 new file mode 100644 index 00000000..a70187f7 Binary files /dev/null and b/src/public/data/pack/server/maps/m39_150 differ diff --git a/src/public/data/pack/server/maps/m39_151 b/src/public/data/pack/server/maps/m39_151 new file mode 100644 index 00000000..0c8cf59c Binary files /dev/null and b/src/public/data/pack/server/maps/m39_151 differ diff --git a/src/public/data/pack/server/maps/m39_152 b/src/public/data/pack/server/maps/m39_152 new file mode 100644 index 00000000..a2e0b713 Binary files /dev/null and b/src/public/data/pack/server/maps/m39_152 differ diff --git a/src/public/data/pack/server/maps/m39_153 b/src/public/data/pack/server/maps/m39_153 new file mode 100644 index 00000000..2a94ba84 Binary files /dev/null and b/src/public/data/pack/server/maps/m39_153 differ diff --git a/src/public/data/pack/server/maps/m39_154 b/src/public/data/pack/server/maps/m39_154 new file mode 100644 index 00000000..d55713eb Binary files /dev/null and b/src/public/data/pack/server/maps/m39_154 differ diff --git a/src/public/data/pack/server/maps/m39_155 b/src/public/data/pack/server/maps/m39_155 new file mode 100644 index 00000000..501875da Binary files /dev/null and b/src/public/data/pack/server/maps/m39_155 differ diff --git a/src/public/data/pack/server/maps/m39_45 b/src/public/data/pack/server/maps/m39_45 new file mode 100644 index 00000000..e5319a81 Binary files /dev/null and b/src/public/data/pack/server/maps/m39_45 differ diff --git a/src/public/data/pack/server/maps/m39_46 b/src/public/data/pack/server/maps/m39_46 new file mode 100644 index 00000000..e18785dd Binary files /dev/null and b/src/public/data/pack/server/maps/m39_46 differ diff --git a/src/public/data/pack/server/maps/m39_47 b/src/public/data/pack/server/maps/m39_47 new file mode 100644 index 00000000..ce163880 Binary files /dev/null and b/src/public/data/pack/server/maps/m39_47 differ diff --git a/src/public/data/pack/server/maps/m39_48 b/src/public/data/pack/server/maps/m39_48 new file mode 100644 index 00000000..eda68294 Binary files /dev/null and b/src/public/data/pack/server/maps/m39_48 differ diff --git a/src/public/data/pack/server/maps/m39_49 b/src/public/data/pack/server/maps/m39_49 new file mode 100644 index 00000000..f9d7ff63 Binary files /dev/null and b/src/public/data/pack/server/maps/m39_49 differ diff --git a/src/public/data/pack/server/maps/m39_50 b/src/public/data/pack/server/maps/m39_50 new file mode 100644 index 00000000..c3871d35 Binary files /dev/null and b/src/public/data/pack/server/maps/m39_50 differ diff --git a/src/public/data/pack/server/maps/m39_51 b/src/public/data/pack/server/maps/m39_51 new file mode 100644 index 00000000..57bce45f Binary files /dev/null and b/src/public/data/pack/server/maps/m39_51 differ diff --git a/src/public/data/pack/server/maps/m39_52 b/src/public/data/pack/server/maps/m39_52 new file mode 100644 index 00000000..e11b495b Binary files /dev/null and b/src/public/data/pack/server/maps/m39_52 differ diff --git a/src/public/data/pack/server/maps/m39_53 b/src/public/data/pack/server/maps/m39_53 new file mode 100644 index 00000000..1bff5ec9 Binary files /dev/null and b/src/public/data/pack/server/maps/m39_53 differ diff --git a/src/public/data/pack/server/maps/m39_54 b/src/public/data/pack/server/maps/m39_54 new file mode 100644 index 00000000..c429cd81 --- /dev/null +++ b/src/public/data/pack/server/maps/m39_54 @@ -0,0 +1,41 @@ +22 2h~¥²ÆÆ2Í2Í2ù2Í2Í)Ü‚Ü‚Ü‚Ü‚ÜÜÜ2Ü2«2«2«Ü2Ü2„Ú2„Ú2Ú 2ÜÜÜÜÜÜ2Ü2Ü2«2„«2„«2„«2„«2«2«2«2«2ÜÜÜÜÜÜÜÜ +ÜÜÜÈ««««2«2222 2­Æ2Æ2ù2ù2ù2Í2ñ 2ïò‚Ü ‚Ü2‚ß2‚Ý!‚ÝÜ +ÕÜÜ2Õ2„Ü2„â2„ä2„æ2Ü 2ÜÕÕÜÜÜ +Ù2„Ù2„Ù2„«2„«2«2«2±2·2ÏÜããããããÜãã +ÜÜÈÈÈÈ«22222 (Æ2–2ÿ2ù2ñ2ò2ñ2ï2Þ2Þ2‚è2‚ê2‚å‚ÝÛÕÕ2Ü2Þ2„Þ„Þ„Þ2„Ü2Ü„Ü„Ü„Õ„Ü„Ü„Ü„Ù +„Ü2„Ü2„«2«2«2ÏÖ×ÈÈÈÈÈ ÈÈããÜÜÜÜÙ +ÕÙÈ22222))()2d)2–!)2–2ñ2ä2ä2ï2ï2Þ2à2‚ê2‚ï2‚èÝÜ Ü2Ü2Ü2å „Þ„Ü„Ü„Ü„Ü„Ü„Ü„Ü„Ü„Ù„Ù„ÜÙ„ÕÙ +ÜÜÜÚ Ð2È2È2È2È2È2È2È2È2È 2ÈÈÜÜÜÜÜÜ22222))()d)–#)2–!)2–2Ü2ñ2ï2ì2ãå2è2‚éæÝÜÜ2Ü2Ü2„܄܄܄܄܄܄للՄՄÜÜÜÛÛÜÜÜÜÝË2È2È2È2È2È2È2È2È2È2È 2ÈÈããÜÜÜ22222))()d)–)–#)2–!)2–2é2é2â2ßßßà ß2ß!áÜÜÜ„Ü„Ü„Ü„Ü„Ü„Ù„ÜÜÜÜÜÜÜÜÜÜÜÜÚ×2Ê2È2È2È2È2È2È2È2È2È2È2È2È 2ÈÈÜÜÜ22222))()d)–)–)–)2––2–2Ú2ä#2Þ 2ÞÜ2ß2ê2íßÜÕÜ„Ü„Õ„Õ„Ü„ÜÜÕÜÜÜÜÝÛÚÜÜÜÖ2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2ÈÈÜÜ22222))()d)–)–)–)2––Ô2×2Ø2Ù2Þ 2Ùß2ëéÝÜÜÜÜ„Ü„Ü„ÜÜÕÜÜÛÚÙÕ 2Ì 2ÊÈÖ×2Ï2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È#2È!2ÈãÜ22222))()d)–)–$)2–)2––Ô2È2»2¼2¿2Ã2Ó 2ÚÝÜÜÜÜÕÕÜÜÙÜÜ‚Ü‚ÜØÕÒ2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2ÈÈã22222))()d)–)–)2––ÆÏ–2–2¸2¸2³2¼2ÁÓ×ÜÜÜÜÜÜÜÙÜ‚Ü‚ÜßÈÈÌ2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2ÈÈã22222))()d)–)–)2––¸–)2–)–)2– )2–2–2¸2¸#2¸ 2¸2¸ÜÜ‚ÜÕÕ‚Õ‚Ü‚Ü‚Ü‚Üã-2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2ÈÈã22222))()d)–)–)2––¯)2–)–)–)–)–)2– )2–2–2¸2¸2¸2¸2‚Ü‚Ü‚܃Ü‚Ü‚Ü‚Ü2Ü2Ü'2Ü2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2ÈÈÜ22222))()d)–)–)–)2–)2–)2–)2–)2–)2–)–)2–)2–)2–)2– )2–2´2¸#2‚Ü 2‚܃Ü‚Ü‚Ü‚Ü2Ü2ã2ã2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2ÈÈÜ22222)2)2()2d)2–)–)–)–)–)2–)2–)2–)2–)–)2–)2–)–)–)–)2´ )2´2¸2¸‚¸‚ÜÜÜ2Ü2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È 2ÈÈÜ22222)2))()2d)2–)–)–)–)–)–)–)–)–)–)–)2–)2–))2– +)2–)2´)´ )2´2È‚È2ƒÈ2Ü2ã2ã2È2È2È2È‚ÈÈÈ2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2ÈÈÜÜ22222)2(d)2–)2–)2–)2–)2–)2–)2–)2–)2–)2–)2–))2–––±¸&)2´)2´ )2´‚»)2‚»!)2´2¿2×2Ê2È2È2È‚ÒÜÜ2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È 2ÈÍÙÜ22222)2()()2d))2–––&)2–)–)–)–)–)–)–)2––)2 )2–º¼)2´)2´)2´)2´)2´2¹2Ò2Ë2È2È 2‚ÈÈÜÜÜ2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2ÈÈÛÜÜ22222)2)2()2d()2–ž¤–)2–)2–)2–)2–)2–)2–)2–)2–)2–)2–)2–()2´')2¼)2´)2´)2´)2´)´)2´)2¼2Å2È2È2‚ÈÜÜÜÜÈ2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2ÈÛÜÛ22222))()d)2–)2–)2–)2–)2–)2–)2–)2–)–)–)–)–)–)–)–)´)´)´)´)´)´)´)´)´2È2È2‚ÈãÜÜÜÜÜÈ +2È%2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2ÈÈÜÜ22222))()d)–)–)–)–)–)2–)2––2–&)2–)–)2–)2–)2–)–)´)´)´)´)´)´)´)´)´2È2‚È2‚ÈãÜÜÜæÜÜÜ2È%2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2ÈÈÜ22222))()2d)2–)2–)–)–)–)2–)2––2–2¼2–2–2–2–)2–)´)´)´)´)´)´)´)´)´ 2È2‚È‚ãÜÜÜÜÜÜÜÜÜ2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2ÈÈÜ22222))()2d)2–)2–)–)–)–)–)– )2–2–2Ä2Ê2Ü2Í2Ä)2°)´)´)´)´)´)´)´)´)2´2‚È2‚ÜÜÜÜÜÜÜÜÜÜÜÈ2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2ÈÈ22222))()2d)2–)2–)–)–)–)–)–)2–2–2Ê2ÜÜÚ2Ö2Å)2´)´)´)´)´)´)´)2´2‚´2‚È‚ãÜÜ5Ü5Ü5Ü5Ü5Ü5ÜÜÜÜ2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2ÈÈ22222))()2d)2–)2–)–)–)–)–)2–2š2¬2ÑÜÜÛÙ2Ò2Ì)2´)´)´)´)´)2´2‚´2‚´‚ãÜÜÜ5Ü5Ü5Ü5Ü5Ü5ÜÜÜÜÜ +2È2È2È2È2È2È2È2È2È2È2È2È2È2È2È2ÈÈ22222))()d)–)–)–)–)2–)2–2ž2¯2Æ2ÞÜÜÜÛÚ2Ô2Ê +)2´)2´)2´)2´2‚´‚ã‚Ü‚ÜÜÜÜ5Ü5Ü5Ü5Ü5Ü5ÜÜÜÜÜÜÈ +2È2È2È2È2ÈÈ2È2È2È2È2È2È2È2ÈÈ22222))()d)–)–)2–2–2–2–2³2É2Û2é‚Ü‚Ü‚Ü‚Ü‚ÜÚ2Ò2Ê2´2‚´2‚´‚Ü‚Ü‚ÜÜÜÜÜ5Ü5Ü5Ü5Ü5Ü5Ü5Ü5Ü5Ü 5ÜÜÜÈÈÈÈÈÈÈ2È2È2È2È2È2È2ÈÈ22222))()2d2–2–2–2ð2ä2õ2á2æ2‚æ‚Ü‚Ü‚Ü‚Ü‚Ü‚Ü‚ÛÙׂÖ‚ã‚ã‚Ü‚ÜÜÜãÜÜ5Ü5Ü5Ü5Ü5Ü5Ü5Ü5Ü5Ü5ÜÜÜÜÜÜÜ‚Ü‚ÜÜÈ2È2È2È2È2È 2ÈÈ22222))2(2d2–2–2õ2×2þ2ñ2ï2‚ï ‚ç‚Ý2‚Ü2‚Ü2‚Ü2‚Ü2‚Ü2Ü2‚à 2‚ß‚ÚÙÜÜÜÜÕãÜÜ5Ü5Ü5Ü5Ü5Ü5Ü5Ü5Ü5Ü5ÜÜÜÜÜÜ‚Ü‚Ü‚ÜÜÜ2È2È2È2‚È2ÈÈÈ22222)22(2d2ù2ù2÷2ù2ö2é2ò2ï‚â‚Ü2‚Ü2‚Ü2‚ï2‚ï2‚ï2‚ï2‚õ2‚õ2‚Ü‚ÙÜÜàÚÚÜÜÜÜ5Ü5Ü5ÜÜÜÜÜÜÜÜÜÜ‚Ü‚Ü‚Ü‚ÜÜÜ2Ü2È2È2ÈÈ‚ÈÈÜ22222 )22(2Ä2ù2ù2ù2ù2ù2ù2ÜéèÞ„Ü +2‚Ü2‚Ü2Ü2‚ï2Ü2‚õ2‚ï2ÜÜÜÜàÕÜÚÜÜÜÜÜÜÜÜÜÜÜÜÜÜ‚Ü‚Ü‚à‚ÜÜÜ2È2È2È2ÈÈÜÜ‚ÜÜ2222222´2Ä2ù2ù2ý2ù2ù2ù Ü„Ü„Ü„Ü„Ü‚Ü„ÜÜÜÜ +2Ü2ÜïÜÜãàÕÜÚÜÜÜÜÜÜÜÜÜÜÜÜÜ‚Ü‚Ü‚Û‚Ü‚ÜÜ 2Ü2È2È2ÈÈÈÜÜÜÜ2222222´2Ä2ù2ù2È2È2È2Ü „Ü„Ü„Ü„Ü„Ü„Ü„Ü„Ü„ÜÜÜÜÜÜÜÚÚÜÜÜÜÜÜ܃܃ÜÜÜÙÜÜÕÝ‚Þ‚Ý‚Þ2‚Ú2Ü 2Ü"2Ü2È2È2ÈÈÈÜÛÛÞ222+22222´2³2³2‹2d2d2d2È2„È„Ü „ÜÜÜ܄ՄՃككل܃܃ÜÜÜÜàÕÕƒàÜÜ‚Ü‚܃܃ÜÜãÜÜÚ‚Ü‚Ý2‚Þ2‚Þ2Ü 2È"2È2È2È2È2ÈÈÜÛÚÙÝ22+2222²2´2´2‘2‘ +2È2„È2È ÜÜÜ܃ÕƒÚƒÕƒ܃ÚƒÚƒÕƒÚÕÕƒ܃àƒàƒàƒÜ‚Ú‚Ü‚Ü‚ÜÜÚàÚÜØ‚Û2‚Ü2‚Ý2Ú2Ü2È2È2È2È2È2È 2ÜÜÚÙÙÜ2+2222Ÿ2Š2—2˜2‘2‘!  ƒ22È2ÈÜ܃܃܃ÚƒÕƒÚ‚Ü‚܃Ü‚܃Úƒ܃܃Ü‚Ü‚Ü‚Ü‚Õ‚Õ‚àÜÜÜÕÚÚÙ ‚Û2‚Ü2Ú 2Ð2È2È2È2È2È2È2È2ÜÜÚÙÙÜ+2222|2~2Š2—2˜222ƒ2ƒ2ƒƒ2ƒ2ƒ2ƒ2È܃܃܃Ü‚Ü‚Ü‚Ü‚Õ‚Ü‚Ü‚Ü‚Ü‚Ú‚Ú‚Ú‚Ú‚Ü‚Ü‚Ü‚ÜÜ‚ÜÜÜÜÜÜ‚Û‚Û2‚Ü2Ù2È2È2È2È2È2È2È2È2ÜÜÚØÖÕ222l2b2a2Š2—2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒdƒȃׂ؂؂؂ڂۂ܂܂܂܂܂܂܂܂܂܂ã‚ã‚Ü‚Ü‚Ü‚ÜÜÜÜÜ‚Ü‚Û2‚Û2×2È2È2È2È2È2È2È2È2Ü2Ü2Ú2Ù2ÕÜ22K2T2b2aƒƒƒƒ2ƒ(2ƒdÈ‚Ë‚Í‚΂ЂÒ‚ÔÖ‚ÙÛÜ‚æ‚ã‚Ü‚Ü‚Ü‚ãƒãã‚ÜÜ2‚Ü2Ü2Ü2Ü 2ÜÜ‚Ü‚Ü‚Ü2Ø2È2È2È2È2È2È2È2È2Ö 2Ü2ÕÜ2Ü2Ü22K2T2b2 2 ƒ2ƒ(2ƒdƒ·ƒ¼‚À‚ÃÅÇÉÏÕÛÜÜ‚æ‚܃܃ãããÜ2Ü2Ü2Ü2d2d2d2d 2Ü‚Ü‚Ü‚ÜÓ2Ë2È2È2È2È2È2È2È2Ü2Ü2Á2Ü2d2d,22K2T2a 2222 ƒ"2ƒ$2ƒªƒ­ƒ±ƒ´ ·2¼2¸2·2¼(ÅÚÜÜÜÜÜÜÜÜÜ2Ü2d2((((2(2d2‚Ü2‚Ü2‚Ü2‚Ä2¾ 2Á2È2È2È2È2È2È2Ð2±2ˆ2d2d2(2222D2/ ƒ"2ƒ$2ƒªªªƒ«¬¬ª————2Ü2Ü 2ÜÜÜÜÜ2Ü2Ü2Ü2Ü2d(2()—‚—‚—&‚Ÿ2‚¦2‚¬2‚»)2‚È)2È)2È)2È2È2È2d2d2(((22E2S2C"2ƒ2ƒ2ƒ ƒªªªªª2ª2ª2—2—2—2—!—&—2—2d 2Ü2Ü2Ü2Ü2Ü2d2d2d(2(——‚—'‚—2‚—2‚d2‚x)2x)2x)2x)2x2x2x$2x2(( 22 2 +2.2,'2ƒ2ƒx2ƒx¡¡¡2¡2¡2¡(dd'd2d2—'—2‰B2d2Ü2Ü2d2ddŽ(Ž$Ž2—2—2—2—2‚—2‚(2Z)2Z)2Z)2Z)2Z2Z2Z 2Z222&2,2(%2ƒ2ƒx2ƒx¡¡¡2¡2d2d2d2d2d2d22y2v)2(2d2d2((Ž(2Ž2Ž2Ž 2ŽŽ2x2xx )22)22)22)22$)2222222222222(25 2*2ƒ2ƒxƒ————2—2d2 2-(((Ž 2Ž2Ž2Ž2Ž2Ž 2ŽŽ)2)2)2)2)22222 +2$2+&2ƒƒŽƒŽŽŽŽ2Ž2d2 2Ž2Ž2Ž2Ž2Ž2Ž2Ž 2ŽŽ222222 22#2ƒ‡!‡‡‡‡‡2‡2d2d 2 2Ž2Ž2Ž2Ž2Ž2Ž2ŽŽŽŽŽ 222222222#2ttttttt&t2oŽŽŽŽŽŽŽŽ +2Ž2Ž2Ž2Ž2Ž2ŽŽ2Ž2Ž 2ŽŽ2222222222llllll'l2lŽŽ2Ž2Ž 2Ž2Ž2Ž 2ŽŽŽ2Ž2Ž2ŽŽ 2Ž2Ž2Ž2ŽŽ222Ž2Ž2222 222[[[[[2[2[2[Ž 2Ž2Ž2Ž2Ž2Ž2Ž2Ž 2ŽŽ2Ž2Ž2Ž2Ž2ŽŽ2Ž2Ž2Ž2ŽŽ22Ž2Ž22222 22$2SSSSS2S2S2Ž2Ž2Ž2Ž2Ž2Ž2Ž2Ž2Ž2Ž 2Ž2Ž2Ž2Ž2Ž22Ž22Ž2Ž 2Ž2222222222KKKK2K2K2KŽ2Ž2Ž2Ž2Ž2Ž2Ž2Ž2Ž#2Ž"2Ž2Ž2Ž2Ž2Ž22Ž22Ž2ŽŽŽ 2Ž2222222222>>>>>2>2> 2Ž2Ž2Ž2Ž222222Ž2Ž2Ž2Ž2Ž2Ž22Ž2Ž2Ž2Ž2Ž2Ž2Ž2222222222888882828Ž2Ž2Ž2Ž2Ž22222222Ž2Ž2Ž2Ž#2Ž!22Ž2Ž22Ž2Ž2Ž2Ž2Ž222222221111121 21 2Ž2Ž2Ž2Ž2Ž22222222222Ž2Ž#2Ž!22Ž2Ž222Ž2Ž2222222Ž2Ž22" +++++++2Ž2Ž2Ž2Ž2222222222222Ž2Ž#2Ž2Ž"2Ž222222222222Ž2Ž2 + + +*&#!2Ž2Ž2Ž2Ž22222222222222Ž2Ž2Ž2Ž222222222222ŽŽ + + +---($!Ž2Ž2Ž2Ž2Ž222222222222222222222222222 2ŽŽŽ + +Ž +ŽŽ44--+'"ŽŽ2Ž2Ž2Ž2Ž2Ž22222222222222222222222222ŽŽŽ +Ž +Ž +ŽŽ44444.("ŽŽ +2Ž2Ž2Ž2Ž2Ž222222222222222222222222#2Ž 2ŽŽ2Ž +2Ž2Ž 2Ž<<<<44,%ŽŽ2Ž2Ž2Ž22222222222222222222222222Ž2Ž2Ž2Ž2Ž2Ž?<?940+%ŽŽ2Ž2Ž2Ž2222222222222222222222222222222??<61-% ŽŽ2Ž2Ž2Ž2222222222222222222222222222222???2-*(%! $!ŽŽ2Ž2Ž2Ž22222222222222222222222222222229 +99%9999%9999%999999 999 9"99999999 +999999 +9999 +99 +999999222 +9999923>*:222-:: :99923>*:222222-:*:299%99923>*:-:;2::29: :9922>2,:;;;.:2 +::22,:22 +99: :99222222222222::!:99*999 9 9#:!:9999:99999999 99999 9999999 999555555::::: :999555555 :99955555599955555599 99993333333333339'9$999'9 9 9'9$999'9999 9 9 9999999999999999999 \ No newline at end of file diff --git a/src/public/data/pack/server/maps/m39_55 b/src/public/data/pack/server/maps/m39_55 new file mode 100644 index 00000000..3f64069d Binary files /dev/null and b/src/public/data/pack/server/maps/m39_55 differ diff --git a/src/public/data/pack/server/maps/m39_72 b/src/public/data/pack/server/maps/m39_72 new file mode 100644 index 00000000..10dab95a Binary files /dev/null and b/src/public/data/pack/server/maps/m39_72 differ diff --git a/src/public/data/pack/server/maps/m39_73 b/src/public/data/pack/server/maps/m39_73 new file mode 100644 index 00000000..ff580ccc Binary files /dev/null and b/src/public/data/pack/server/maps/m39_73 differ diff --git a/src/public/data/pack/server/maps/m39_74 b/src/public/data/pack/server/maps/m39_74 new file mode 100644 index 00000000..3fd89a61 Binary files /dev/null and b/src/public/data/pack/server/maps/m39_74 differ diff --git a/src/public/data/pack/server/maps/m39_75 b/src/public/data/pack/server/maps/m39_75 new file mode 100644 index 00000000..a5e82a98 Binary files /dev/null and b/src/public/data/pack/server/maps/m39_75 differ diff --git a/src/public/data/pack/server/maps/m39_76 b/src/public/data/pack/server/maps/m39_76 new file mode 100644 index 00000000..ad454efc Binary files /dev/null and b/src/public/data/pack/server/maps/m39_76 differ diff --git a/src/public/data/pack/server/maps/m40_147 b/src/public/data/pack/server/maps/m40_147 new file mode 100644 index 00000000..d87d8bdd Binary files /dev/null and b/src/public/data/pack/server/maps/m40_147 differ diff --git a/src/public/data/pack/server/maps/m40_148 b/src/public/data/pack/server/maps/m40_148 new file mode 100644 index 00000000..36d60d28 Binary files /dev/null and b/src/public/data/pack/server/maps/m40_148 differ diff --git a/src/public/data/pack/server/maps/m40_149 b/src/public/data/pack/server/maps/m40_149 new file mode 100644 index 00000000..1ff9353d Binary files /dev/null and b/src/public/data/pack/server/maps/m40_149 differ diff --git a/src/public/data/pack/server/maps/m40_150 b/src/public/data/pack/server/maps/m40_150 new file mode 100644 index 00000000..f923cc97 Binary files /dev/null and b/src/public/data/pack/server/maps/m40_150 differ diff --git a/src/public/data/pack/server/maps/m40_151 b/src/public/data/pack/server/maps/m40_151 new file mode 100644 index 00000000..a8b020c9 Binary files /dev/null and b/src/public/data/pack/server/maps/m40_151 differ diff --git a/src/public/data/pack/server/maps/m40_152 b/src/public/data/pack/server/maps/m40_152 new file mode 100644 index 00000000..241afb2b Binary files /dev/null and b/src/public/data/pack/server/maps/m40_152 differ diff --git a/src/public/data/pack/server/maps/m40_153 b/src/public/data/pack/server/maps/m40_153 new file mode 100644 index 00000000..b940e6b1 Binary files /dev/null and b/src/public/data/pack/server/maps/m40_153 differ diff --git a/src/public/data/pack/server/maps/m40_154 b/src/public/data/pack/server/maps/m40_154 new file mode 100644 index 00000000..e1581b5d Binary files /dev/null and b/src/public/data/pack/server/maps/m40_154 differ diff --git a/src/public/data/pack/server/maps/m40_45 b/src/public/data/pack/server/maps/m40_45 new file mode 100644 index 00000000..ec3cb263 Binary files /dev/null and b/src/public/data/pack/server/maps/m40_45 differ diff --git a/src/public/data/pack/server/maps/m40_46 b/src/public/data/pack/server/maps/m40_46 new file mode 100644 index 00000000..85d6e3e0 Binary files /dev/null and b/src/public/data/pack/server/maps/m40_46 differ diff --git a/src/public/data/pack/server/maps/m40_47 b/src/public/data/pack/server/maps/m40_47 new file mode 100644 index 00000000..4129d84d Binary files /dev/null and b/src/public/data/pack/server/maps/m40_47 differ diff --git a/src/public/data/pack/server/maps/m40_48 b/src/public/data/pack/server/maps/m40_48 new file mode 100644 index 00000000..ea97fc9d Binary files /dev/null and b/src/public/data/pack/server/maps/m40_48 differ diff --git a/src/public/data/pack/server/maps/m40_49 b/src/public/data/pack/server/maps/m40_49 new file mode 100644 index 00000000..5287fa2e Binary files /dev/null and b/src/public/data/pack/server/maps/m40_49 differ diff --git a/src/public/data/pack/server/maps/m40_50 b/src/public/data/pack/server/maps/m40_50 new file mode 100644 index 00000000..c155b962 Binary files /dev/null and b/src/public/data/pack/server/maps/m40_50 differ diff --git a/src/public/data/pack/server/maps/m40_51 b/src/public/data/pack/server/maps/m40_51 new file mode 100644 index 00000000..fd56d1ba Binary files /dev/null and b/src/public/data/pack/server/maps/m40_51 differ diff --git a/src/public/data/pack/server/maps/m40_52 b/src/public/data/pack/server/maps/m40_52 new file mode 100644 index 00000000..b56f31e9 Binary files /dev/null and b/src/public/data/pack/server/maps/m40_52 differ diff --git a/src/public/data/pack/server/maps/m40_53 b/src/public/data/pack/server/maps/m40_53 new file mode 100644 index 00000000..eb12ebbc Binary files /dev/null and b/src/public/data/pack/server/maps/m40_53 differ diff --git a/src/public/data/pack/server/maps/m40_54 b/src/public/data/pack/server/maps/m40_54 new file mode 100644 index 00000000..7d1b3107 Binary files /dev/null and b/src/public/data/pack/server/maps/m40_54 differ diff --git a/src/public/data/pack/server/maps/m40_55 b/src/public/data/pack/server/maps/m40_55 new file mode 100644 index 00000000..3d4afa9c --- /dev/null +++ b/src/public/data/pack/server/maps/m40_55 @@ -0,0 +1 @@ +2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222 \ No newline at end of file diff --git a/src/public/data/pack/server/maps/m40_72 b/src/public/data/pack/server/maps/m40_72 new file mode 100644 index 00000000..e2802bc3 Binary files /dev/null and b/src/public/data/pack/server/maps/m40_72 differ diff --git a/src/public/data/pack/server/maps/m40_73 b/src/public/data/pack/server/maps/m40_73 new file mode 100644 index 00000000..b814901d Binary files /dev/null and b/src/public/data/pack/server/maps/m40_73 differ diff --git a/src/public/data/pack/server/maps/m40_74 b/src/public/data/pack/server/maps/m40_74 new file mode 100644 index 00000000..bffe5584 Binary files /dev/null and b/src/public/data/pack/server/maps/m40_74 differ diff --git a/src/public/data/pack/server/maps/m40_75 b/src/public/data/pack/server/maps/m40_75 new file mode 100644 index 00000000..1d2dba53 Binary files /dev/null and b/src/public/data/pack/server/maps/m40_75 differ diff --git a/src/public/data/pack/server/maps/m40_76 b/src/public/data/pack/server/maps/m40_76 new file mode 100644 index 00000000..5eb56e33 Binary files /dev/null and b/src/public/data/pack/server/maps/m40_76 differ diff --git a/src/public/data/pack/server/maps/m41_146 b/src/public/data/pack/server/maps/m41_146 new file mode 100644 index 00000000..7bde2adb Binary files /dev/null and b/src/public/data/pack/server/maps/m41_146 differ diff --git a/src/public/data/pack/server/maps/m41_149 b/src/public/data/pack/server/maps/m41_149 new file mode 100644 index 00000000..ff627b54 Binary files /dev/null and b/src/public/data/pack/server/maps/m41_149 differ diff --git a/src/public/data/pack/server/maps/m41_151 b/src/public/data/pack/server/maps/m41_151 new file mode 100644 index 00000000..4cda7e96 Binary files /dev/null and b/src/public/data/pack/server/maps/m41_151 differ diff --git a/src/public/data/pack/server/maps/m41_152 b/src/public/data/pack/server/maps/m41_152 new file mode 100644 index 00000000..32dfd9b0 Binary files /dev/null and b/src/public/data/pack/server/maps/m41_152 differ diff --git a/src/public/data/pack/server/maps/m41_153 b/src/public/data/pack/server/maps/m41_153 new file mode 100644 index 00000000..f6c19a31 Binary files /dev/null and b/src/public/data/pack/server/maps/m41_153 differ diff --git a/src/public/data/pack/server/maps/m41_154 b/src/public/data/pack/server/maps/m41_154 new file mode 100644 index 00000000..9b980710 Binary files /dev/null and b/src/public/data/pack/server/maps/m41_154 differ diff --git a/src/public/data/pack/server/maps/m41_45 b/src/public/data/pack/server/maps/m41_45 new file mode 100644 index 00000000..cffbf6b3 Binary files /dev/null and b/src/public/data/pack/server/maps/m41_45 differ diff --git a/src/public/data/pack/server/maps/m41_46 b/src/public/data/pack/server/maps/m41_46 new file mode 100644 index 00000000..c5b597c9 Binary files /dev/null and b/src/public/data/pack/server/maps/m41_46 differ diff --git a/src/public/data/pack/server/maps/m41_47 b/src/public/data/pack/server/maps/m41_47 new file mode 100644 index 00000000..47853690 Binary files /dev/null and b/src/public/data/pack/server/maps/m41_47 differ diff --git a/src/public/data/pack/server/maps/m41_48 b/src/public/data/pack/server/maps/m41_48 new file mode 100644 index 00000000..84bf98df Binary files /dev/null and b/src/public/data/pack/server/maps/m41_48 differ diff --git a/src/public/data/pack/server/maps/m41_49 b/src/public/data/pack/server/maps/m41_49 new file mode 100644 index 00000000..e25e6b90 Binary files /dev/null and b/src/public/data/pack/server/maps/m41_49 differ diff --git a/src/public/data/pack/server/maps/m41_50 b/src/public/data/pack/server/maps/m41_50 new file mode 100644 index 00000000..7359331c Binary files /dev/null and b/src/public/data/pack/server/maps/m41_50 differ diff --git a/src/public/data/pack/server/maps/m41_51 b/src/public/data/pack/server/maps/m41_51 new file mode 100644 index 00000000..a761ee1b Binary files /dev/null and b/src/public/data/pack/server/maps/m41_51 differ diff --git a/src/public/data/pack/server/maps/m41_52 b/src/public/data/pack/server/maps/m41_52 new file mode 100644 index 00000000..1215e1a5 Binary files /dev/null and b/src/public/data/pack/server/maps/m41_52 differ diff --git a/src/public/data/pack/server/maps/m41_53 b/src/public/data/pack/server/maps/m41_53 new file mode 100644 index 00000000..a2af361c Binary files /dev/null and b/src/public/data/pack/server/maps/m41_53 differ diff --git a/src/public/data/pack/server/maps/m41_54 b/src/public/data/pack/server/maps/m41_54 new file mode 100644 index 00000000..91de2f8d Binary files /dev/null and b/src/public/data/pack/server/maps/m41_54 differ diff --git a/src/public/data/pack/server/maps/m41_55 b/src/public/data/pack/server/maps/m41_55 new file mode 100644 index 00000000..c8ff226f --- /dev/null +++ b/src/public/data/pack/server/maps/m41_55 @@ -0,0 +1,206 @@ +222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222ƒ2ƒ22ƒ2ƒ2ƒ22222222222222222222222222222222222222222222222222222222222ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ22ƒ22222222222222222222222222222222222222222222ƒ2ƒ2ƒ22222ƒ2ƒ2ƒ2ƒ22ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ22222222222222222222222222222222222222222ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒƒƒƒƒƒ +2ƒ2ƒ2ƒ2ƒ2ƒ222222222222222222222222222222222222222ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒƒƒƒƒƒƒƒƒ2ƒ2ƒ2ƒ2ƒ2222222222222222222222222222222222222ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒƒƒƒƒƒƒƒƒ2ƒ%2ƒ2ƒ2ƒ2ƒ22222222222222222222222222222222222ƒ2ƒ2ƒ2ƒ2ƒ2ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ2ƒ%2ƒ2ƒ2ƒ2ƒ22ƒ2222222222222222222222222222222ƒ2ƒ2ƒ2ƒ2ƒ$2ƒ2ƒƒƒƒ!ƒƒ!ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ22222222222222222222222222222ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒƒƒƒ%&'%!  $$ƒƒƒƒƒƒƒƒƒƒƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2222222222222222222222222222ƒ2ƒ2ƒ2ƒƒƒƒƒƒ$&&%%'(ƒƒƒƒƒƒƒƒƒƒƒ2ƒ%2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ22222222222222222222222222ƒ2ƒ2ƒ2ƒƒƒƒƒƒ!%&&''('ƒƒƒƒƒƒƒƒƒƒ +ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2222222222222222222222222ƒ2ƒ2ƒ2ƒ$2ƒ2ƒƒƒ  #%&((&&%ƒƒƒƒƒ +ƒƒƒƒ2ƒ2ƒ2ƒ22222222222222222222222ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒƒ #&'(((('&%ƒƒ +ƒƒƒ2ƒ2ƒ2ƒ222222222222222222222ƒ2ƒ2ƒ2ƒ2ƒƒƒƒƒ"%(+)((((&%$  + !ƒƒ 2ƒ2ƒ2ƒ2ƒ2222222222222222222ƒ2ƒ2ƒ2ƒ2ƒƒƒƒ ƒ!#'+*(ƒƒ(ƒ(ƒ)ƒ&ƒ%& +  ƒ2ƒ%2ƒ2ƒ2ƒ2ƒ22222222222222222ƒ2ƒ2ƒ2ƒ$2ƒ2ƒƒƒ  ##ƒ& +ƒ& +ƒ% +ƒ% +ƒ% +ƒ% +ƒ% +ƒ$ +ƒ%ƒ(ƒ2ƒ2ƒ2ƒ2ƒ22222222222222ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒƒ'(% +ƒ +ƒ" +ƒ" +ƒ" +ƒ" +ƒ" +ƒ" +ƒ" +ƒ" +ƒ# +ƒ& !ƒƒƒ2ƒ2ƒ2ƒ222222222222ƒ2ƒ2ƒ2ƒ$2ƒ2ƒƒƒ"%&" +ƒ" +ƒ +ƒ  +ƒ +ƒ +ƒ +ƒ  +ƒ  +ƒ  +ƒ  +ƒ! +ƒ# !!!"#" ƒƒƒ2ƒ2ƒ22222222222ƒ2ƒ2ƒ2ƒ2ƒ 2ƒƒƒ"$ƒ +ƒ +ƒ$ +ƒ + !$$%&&$!ƒƒƒ +2ƒ2ƒ2222222222ƒ2ƒ2ƒ2ƒ2ƒ2ƒƒƒ !!ƒ +ƒ +ƒ +ƒ   ƒ"ƒ%(*+*'"ƒƒ 2ƒ2ƒ2ƒ22222222ƒ2ƒ2ƒ2ƒ2ƒƒƒƒƒ!! ƒ +ƒ +ƒ +ƒƒ!"  ƒ ƒ#ƒ(ƒ,01/*ƒ2ƒ2ƒ2ƒ222222222ƒ2ƒ2ƒ2ƒƒ ƒ +ƒ +ƒ +ƒƒ +ƒ" +ƒ +ƒ +ƒƒ " !ƒ%ƒ)ƒ/ƒ4.("ƒƒ2ƒ2ƒ2ƒ2ƒ22222222ƒ2ƒ2ƒ2ƒƒƒ +ƒ +ƒ +ƒ +ƒ +ƒ +ƒ +ƒ +ƒ +ƒ +ƒ +ƒ +ƒ +ƒ +ƒ$ +ƒ +ƒƒ!ƒ%ƒƒƒ1+&!ƒƒ2ƒ2ƒ2ƒ2222222ƒ2ƒ2ƒ2ƒ 2ƒƒƒ +ƒ" +ƒ +ƒ +ƒ +ƒ +ƒ +ƒ +ƒ +ƒ +ƒ +ƒ +ƒ +ƒ +ƒ +ƒ +ƒƒ0-)& ƒƒ2ƒ2ƒ2ƒ222222ƒ2ƒ2ƒ2ƒ2ƒƒƒ +ƒ +ƒ$ +ƒ +ƒ + + +ƒ +ƒ +ƒ +ƒ +ƒ +ƒ +ƒƒƒƒƒƒ0.,*&ƒƒƒ2ƒ2ƒ2ƒ22222ƒ2ƒ2ƒ2ƒ2ƒ +ƒ +ƒ +ƒ +ƒƒƒƒƒƒƒƒƒƒ0.,)"ƒ 2ƒ2ƒ2ƒ2ƒ22222ƒ2ƒ2ƒƒƒ  +ƒ +ƒ +ƒƒƒƒƒƒƒ21/+%ƒ2ƒ2ƒ2ƒ2ƒ2ƒ22ƒ22ƒ2ƒƒƒƒ +ƒ +ƒ +ƒƒƒƒƒƒƒƒƒƒƒƒ31,ƒ(ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒƒƒƒ +ƒ +ƒ +ƒƒƒƒƒƒƒƒƒƒ 2ƒ2ƒ2ƒ2ƒ 30,)ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒƒƒ ƒ +ƒ +ƒ +ƒƒƒƒ 2ƒ2ƒ2ƒ2ƒ2ƒ!2ƒƒ 2ƒ"2ƒ2ƒ2ƒ2ƒ 31,%2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ$2ƒ2ƒƒ ƒ +ƒ +ƒ +ƒƒƒƒƒ 2ƒ"2ƒ2ƒ2ƒ2ƒ2ƒ#2ƒ!2ƒ2ƒ2ƒ$2ƒ2ƒƒ1.*$ƒƒ +2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒƒƒƒ +ƒ +ƒƒƒƒ 2ƒ2ƒ2ƒ2ƒ2ƒ22ƒ2ƒ2ƒ2ƒ2ƒ2ƒ 2ƒƒ-)"ƒƒƒƒƒƒƒƒ ƒƒ +ƒ +ƒƒƒƒ 2ƒ"2ƒ2ƒ2ƒ222222ƒ2ƒ2ƒ2ƒƒ&"ƒƒƒƒƒƒƒƒ +ƒ +ƒ +ƒƒƒ ƒ2ƒ2ƒ22222222ƒ2ƒ2ƒ2ƒ!2ƒƒ! ƒƒƒƒƒƒ +ƒ +ƒ +ƒƒ 2ƒ2ƒ2ƒ2ƒ222222222ƒ2ƒ2ƒ2ƒƒ ƒƒƒƒƒ +ƒ +ƒ +ƒ +ƒƒ2ƒ2ƒ2ƒ2ƒ2222222222ƒ2ƒ2ƒƒƒ "! ƒƒƒƒ ƒ +ƒ +ƒ +ƒ +ƒ +ƒƒ +ƒ" +ƒ +ƒ +ƒƒ 2ƒ2ƒ2ƒ2ƒ2ƒ222222222ƒ2ƒ2ƒ2ƒƒ#%ƒ#!ƒƒƒ +ƒ +ƒ +ƒ +ƒ +ƒ +ƒ +ƒ +ƒ +ƒ +ƒ$ +ƒ +ƒƒ2ƒ2ƒ2ƒ2ƒ2222222222ƒ2ƒ2ƒ 2ƒƒ!ƒ#ƒ"ƒ!ƒƒƒƒƒ +ƒ" +ƒ +ƒ +ƒ +ƒ +ƒ +ƒ +ƒ +ƒ +ƒ +ƒ +ƒƒƒƒ2ƒ2ƒ2ƒ2ƒ22222222222ƒ2ƒƒ""ƒƒƒƒƒƒƒ +ƒ +ƒ$ +ƒ +ƒƒ + +ƒ +ƒ +ƒ +ƒƒƒƒƒ2ƒ2ƒ2ƒ2ƒ2222222222ƒ2ƒ2ƒƒƒ"ƒƒƒƒƒƒƒ +ƒ +ƒ +ƒƒƒƒ2ƒ2ƒ2ƒ2ƒ2222222222ƒ2ƒ2ƒ2ƒƒ!$"ƒƒƒƒƒƒ +ƒ +ƒƒƒƒƒ2ƒ2ƒ2ƒ2ƒ2222222222ƒ2ƒ2ƒ2ƒƒ#'ƒƒƒƒƒ" +ƒ +ƒƒƒƒ2ƒ2ƒ2ƒ2ƒ2ƒ222222222ƒ2ƒ2ƒ2ƒƒ"(&ƒƒƒ +ƒ +ƒ +ƒƒƒ2ƒ%2ƒ2ƒ2ƒ2ƒ2222222222ƒ2ƒ2ƒƒƒ"))'ƒƒƒƒ! +ƒ +ƒƒƒƒ2ƒ2ƒ2ƒ2ƒ2222222222ƒ2ƒ2ƒƒƒ"+--ƒƒƒ  +ƒ +ƒƒ ƒƒƒ2ƒ2ƒ2ƒ2222222222ƒ2ƒƒƒ+/0ƒƒ +ƒ +ƒ +ƒ!ƒ ƒ2ƒ%2ƒ2ƒ2ƒ222222222ƒ2ƒƒƒ)/1ƒ +ƒ +ƒ +ƒ"!ƒ ƒ2ƒ2ƒ2ƒ22222222ƒ2ƒ2ƒƒƒ$.0ƒ +ƒ +ƒ +ƒ  ƒ ƒƒ2ƒ2ƒ2ƒ222222ƒ2ƒ2ƒƒƒ$/ +ƒ +ƒ +ƒƒ  ƒƒ +2ƒ%2ƒ2ƒ2ƒ222222ƒ2ƒƒ2 22)6 ƒ +ƒ +ƒƒ!! ƒƒ2ƒ2ƒ2ƒ2ƒ2222ƒ2ƒ2ƒƒƒ \ No newline at end of file diff --git a/src/public/data/pack/server/maps/m41_56 b/src/public/data/pack/server/maps/m41_56 new file mode 100644 index 00000000..1fc8e28a Binary files /dev/null and b/src/public/data/pack/server/maps/m41_56 differ diff --git a/src/public/data/pack/server/maps/m41_72 b/src/public/data/pack/server/maps/m41_72 new file mode 100644 index 00000000..bd980099 Binary files /dev/null and b/src/public/data/pack/server/maps/m41_72 differ diff --git a/src/public/data/pack/server/maps/m41_73 b/src/public/data/pack/server/maps/m41_73 new file mode 100644 index 00000000..182c2710 Binary files /dev/null and b/src/public/data/pack/server/maps/m41_73 differ diff --git a/src/public/data/pack/server/maps/m41_74 b/src/public/data/pack/server/maps/m41_74 new file mode 100644 index 00000000..b6afbee5 Binary files /dev/null and b/src/public/data/pack/server/maps/m41_74 differ diff --git a/src/public/data/pack/server/maps/m41_75 b/src/public/data/pack/server/maps/m41_75 new file mode 100644 index 00000000..776465e4 Binary files /dev/null and b/src/public/data/pack/server/maps/m41_75 differ diff --git a/src/public/data/pack/server/maps/m42_144 b/src/public/data/pack/server/maps/m42_144 new file mode 100644 index 00000000..f2751557 Binary files /dev/null and b/src/public/data/pack/server/maps/m42_144 differ diff --git a/src/public/data/pack/server/maps/m42_145 b/src/public/data/pack/server/maps/m42_145 new file mode 100644 index 00000000..eeea6d06 Binary files /dev/null and b/src/public/data/pack/server/maps/m42_145 differ diff --git a/src/public/data/pack/server/maps/m42_146 b/src/public/data/pack/server/maps/m42_146 new file mode 100644 index 00000000..957606c6 Binary files /dev/null and b/src/public/data/pack/server/maps/m42_146 differ diff --git a/src/public/data/pack/server/maps/m42_151 b/src/public/data/pack/server/maps/m42_151 new file mode 100644 index 00000000..f381bf7e Binary files /dev/null and b/src/public/data/pack/server/maps/m42_151 differ diff --git a/src/public/data/pack/server/maps/m42_152 b/src/public/data/pack/server/maps/m42_152 new file mode 100644 index 00000000..c5bd3796 Binary files /dev/null and b/src/public/data/pack/server/maps/m42_152 differ diff --git a/src/public/data/pack/server/maps/m42_153 b/src/public/data/pack/server/maps/m42_153 new file mode 100644 index 00000000..66dd0c89 Binary files /dev/null and b/src/public/data/pack/server/maps/m42_153 differ diff --git a/src/public/data/pack/server/maps/m42_49 b/src/public/data/pack/server/maps/m42_49 new file mode 100644 index 00000000..2aaf3aac --- /dev/null +++ b/src/public/data/pack/server/maps/m42_49 @@ -0,0 +1,400 @@ +222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222)2 +22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222 +2222222222222222222 + + + +222222222222222222222222222222222 + + +222222222222$22 + + + + + +22222222222222222222222222222222 + + + + + + +222222222222 2 + + + + + + + + +222222222222222222222222222 2 + + + + + + +222222222222 + + + + + +  + + + + + + + +22222222222222222222222222 + +    + 222222222222 + + + +     + + + + + + + + +222222222222222222222222 + + +    +222222222222 + +   +          + + + +22222222222222222222222 2 + + +    222222222222 + +              + + +2222222222222222222222 + +     222222222222 + +  +  +        + + +222222222222222222222 + + +    +22222222222 2 + +  +  +    + + + + + +22222222222222222222 + + +   22222222222 + +  +  +    + + + + + + +2222222222222222 2 + +   22222222222 + +  +        + + + +22222222222222 + + 222222222222 + +         + + + + + +2222222222222 + + + 222222222222 + +        + + + + +22222222222 2 + + + +2222222222222 +  #%"       + + +2222222222 + + + 2222222222222 +  "$%#"      + + + + +2222222 + + +   222222222222 2 +   #$%&&&%##      + + + + + +    $222222222222  "%&'ƒ(((''("     + + + + + + + + + + + + + +    #'22222222222 2 +  +!%''ƒ(ƒ)ƒ)ƒ)(ƒ()($      + + + + + + + + + + + + +   !#&*22222222222  #')ƒ)ƒ*ƒ*ƒ)ƒ)ƒ(ƒ(ƒ(*)(                     #%(,2222222222 $')ƒ*ƒ+ƒ*ƒ(ƒ'ƒ&ƒ&ƒƒ(*)"             !$&)-22222222  "&)*ƒ)ƒƒ(ƒƒ%ƒ$ƒ$ƒ%))#   #$&).22222 +   %()ƒƒƒ$ƒ!ƒ!ƒ ƒ"ƒ$'(&   $%'*/222 + + + +  #')*ƒƒƒƒ!ƒƒƒƒ!$&& "%%'*/22 2 + + +   !#$&()**ƒƒƒƒƒƒƒ"%&&"  #&&')-22 + +   !$((('ƒƒƒƒƒƒƒ"$%%%#! !  "%'&&'*22 + +    !$''ƒƒƒƒƒ#%%%!    !#"""$%'%%'22 +     !$&&ƒƒ!%'''&$ "%$!   !"#$$&'%%&'2 2 +    +!%#'*+)&! "$&$! #'(%%&'2 +  +  !$,.*("! !##$#!ƒƒƒ$%%&'2 + +   +*%$#""#%$# ƒ 2ƒ 2ƒ +!2ƒ ƒ ƒƒ#*%%&(2 + + + ƒ"ƒ 2ƒ 2ƒ +2ƒ +#2ƒ + 2ƒ +ƒƒ ƒ$+%%'2 + + +  ƒƒƒ"ƒ2ƒ +2ƒ +2ƒ +2ƒ +2ƒ +2ƒ +ƒƒƒ#$$%22 + + "ƒƒƒƒ!#ƒ2ƒ +2ƒ +2ƒ +2ƒ +2ƒ +2ƒ +ƒ +ƒƒ!$$##22 + +  !ƒƒƒƒƒƒƒƒ ƒƒƒƒƒ +2ƒ +2ƒ +2ƒ +2ƒ +2ƒ +2ƒ +ƒ +ƒ$$#"!22 + +    "$ƒƒƒƒƒƒƒƒ*ƒ)ƒ'ƒƒƒƒƒƒƒƒ2ƒ +2ƒ +2ƒ +2ƒ +2ƒ +2ƒ +ƒ +ƒ$$#"22 + +     "ƒ$ƒƒƒƒƒƒƒƒƒƒƒ+ƒ,ƒ,*ƒ*ƒ)ƒ"ƒ2ƒ 2ƒ +2ƒ +2ƒ + 2ƒ +ƒ +'2ƒ +2ƒ +2ƒ +2ƒ +2ƒ +2ƒ + 2ƒ +ƒ +ƒ%$"222 + +   !#%ƒƒƒƒƒƒƒƒƒƒƒƒƒƒ*ƒ)ƒ'&"ƒ 2ƒ +2ƒ +2ƒ +2ƒ +2ƒ +2ƒ +2ƒ +2ƒ +2ƒ +2ƒ +2ƒ +2ƒ +2ƒ +ƒ +ƒ ƒ '&$#222 + + +    "$&ƒƒƒƒƒƒƒƒƒƒƒƒ)ƒ(ƒ'ƒ%#ƒƒ2ƒ +2ƒ +2ƒ +2ƒ +2ƒ +2ƒ +2ƒ +2ƒ +2ƒ +2ƒ +2ƒ +2ƒ +ƒ +ƒ +ƒ#+(%%2222 + +   !#%'(ƒ(ƒƒƒƒƒƒƒ(ƒ(ƒ&# ƒƒƒ2ƒ +2ƒ +2ƒ +2ƒ +2ƒ +2ƒ +2ƒ +2ƒ +2ƒ +2ƒ +ƒ +ƒ +ƒ +ƒ%&2222 + +  !#%')*ƒ)ƒƒƒƒƒ'ƒ&ƒ%ƒ"ƒ ƒƒƒ2ƒ +2ƒ +2ƒ +2ƒ +2ƒ +2ƒ +2ƒ +2ƒ +2ƒ +ƒ +ƒ +ƒƒ"*(2222 + +  "%(+ƒ,ƒƒ,ƒƒƒƒƒƒƒƒƒ%ƒ#ƒ!ƒƒƒƒ2ƒ +2ƒ +2ƒ +2ƒ +2ƒ +2ƒ +2ƒ +2ƒ + 2ƒ +ƒ +ƒƒ)()22222 + +  $)-0ƒ0ƒ0ƒƒƒƒ"ƒ ƒƒƒƒ2ƒ +%2ƒ +2ƒ +2ƒ +2ƒ +2ƒ +2ƒ +2ƒ +ƒ +ƒ +ƒƒ $('(22222 + #(.12ƒƒƒƒƒƒƒƒ2ƒ +2ƒ +2ƒ +2ƒ +2ƒ +$2ƒ +2ƒ +ƒ +ƒƒƒ%%22222 + .2ƒƒƒƒ + +2ƒ +2ƒ +2ƒ +2ƒ +2ƒ +ƒ +ƒ ƒƒ#!2222 2 +  %*/2ƒƒ +ƒ +ƒ +ƒ +ƒ +ƒ +"2222 + ",044ƒƒƒƒ1!!!!##!!##  !!  ''''1111    ##((##((((((     \ No newline at end of file diff --git a/src/public/data/pack/server/maps/m42_50 b/src/public/data/pack/server/maps/m42_50 new file mode 100644 index 00000000..c5d9a87a Binary files /dev/null and b/src/public/data/pack/server/maps/m42_50 differ diff --git a/src/public/data/pack/server/maps/m42_51 b/src/public/data/pack/server/maps/m42_51 new file mode 100644 index 00000000..ed3d869c Binary files /dev/null and b/src/public/data/pack/server/maps/m42_51 differ diff --git a/src/public/data/pack/server/maps/m42_52 b/src/public/data/pack/server/maps/m42_52 new file mode 100644 index 00000000..7860ef76 Binary files /dev/null and b/src/public/data/pack/server/maps/m42_52 differ diff --git a/src/public/data/pack/server/maps/m42_53 b/src/public/data/pack/server/maps/m42_53 new file mode 100644 index 00000000..2d15ac98 Binary files /dev/null and b/src/public/data/pack/server/maps/m42_53 differ diff --git a/src/public/data/pack/server/maps/m42_54 b/src/public/data/pack/server/maps/m42_54 new file mode 100644 index 00000000..337c33e7 Binary files /dev/null and b/src/public/data/pack/server/maps/m42_54 differ diff --git a/src/public/data/pack/server/maps/m42_55 b/src/public/data/pack/server/maps/m42_55 new file mode 100644 index 00000000..bfec0ab3 Binary files /dev/null and b/src/public/data/pack/server/maps/m42_55 differ diff --git a/src/public/data/pack/server/maps/m42_56 b/src/public/data/pack/server/maps/m42_56 new file mode 100644 index 00000000..8ff88840 Binary files /dev/null and b/src/public/data/pack/server/maps/m42_56 differ diff --git a/src/public/data/pack/server/maps/m42_72 b/src/public/data/pack/server/maps/m42_72 new file mode 100644 index 00000000..209f55c7 Binary files /dev/null and b/src/public/data/pack/server/maps/m42_72 differ diff --git a/src/public/data/pack/server/maps/m42_73 b/src/public/data/pack/server/maps/m42_73 new file mode 100644 index 00000000..d6680927 Binary files /dev/null and b/src/public/data/pack/server/maps/m42_73 differ diff --git a/src/public/data/pack/server/maps/m42_74 b/src/public/data/pack/server/maps/m42_74 new file mode 100644 index 00000000..d383a168 Binary files /dev/null and b/src/public/data/pack/server/maps/m42_74 differ diff --git a/src/public/data/pack/server/maps/m42_75 b/src/public/data/pack/server/maps/m42_75 new file mode 100644 index 00000000..f9fb3483 Binary files /dev/null and b/src/public/data/pack/server/maps/m42_75 differ diff --git a/src/public/data/pack/server/maps/m43_144 b/src/public/data/pack/server/maps/m43_144 new file mode 100644 index 00000000..55c1d277 Binary files /dev/null and b/src/public/data/pack/server/maps/m43_144 differ diff --git a/src/public/data/pack/server/maps/m43_145 b/src/public/data/pack/server/maps/m43_145 new file mode 100644 index 00000000..09483f5c Binary files /dev/null and b/src/public/data/pack/server/maps/m43_145 differ diff --git a/src/public/data/pack/server/maps/m43_146 b/src/public/data/pack/server/maps/m43_146 new file mode 100644 index 00000000..32dc6a94 Binary files /dev/null and b/src/public/data/pack/server/maps/m43_146 differ diff --git a/src/public/data/pack/server/maps/m43_153 b/src/public/data/pack/server/maps/m43_153 new file mode 100644 index 00000000..021e9920 Binary files /dev/null and b/src/public/data/pack/server/maps/m43_153 differ diff --git a/src/public/data/pack/server/maps/m43_154 b/src/public/data/pack/server/maps/m43_154 new file mode 100644 index 00000000..0c3164c1 Binary files /dev/null and b/src/public/data/pack/server/maps/m43_154 differ diff --git a/src/public/data/pack/server/maps/m43_45 b/src/public/data/pack/server/maps/m43_45 new file mode 100644 index 00000000..cef431b3 Binary files /dev/null and b/src/public/data/pack/server/maps/m43_45 differ diff --git a/src/public/data/pack/server/maps/m43_46 b/src/public/data/pack/server/maps/m43_46 new file mode 100644 index 00000000..d4403d33 Binary files /dev/null and b/src/public/data/pack/server/maps/m43_46 differ diff --git a/src/public/data/pack/server/maps/m43_47 b/src/public/data/pack/server/maps/m43_47 new file mode 100644 index 00000000..533845b5 Binary files /dev/null and b/src/public/data/pack/server/maps/m43_47 differ diff --git a/src/public/data/pack/server/maps/m43_48 b/src/public/data/pack/server/maps/m43_48 new file mode 100644 index 00000000..b2cc7dd1 Binary files /dev/null and b/src/public/data/pack/server/maps/m43_48 differ diff --git a/src/public/data/pack/server/maps/m43_49 b/src/public/data/pack/server/maps/m43_49 new file mode 100644 index 00000000..64a13900 Binary files /dev/null and b/src/public/data/pack/server/maps/m43_49 differ diff --git a/src/public/data/pack/server/maps/m43_50 b/src/public/data/pack/server/maps/m43_50 new file mode 100644 index 00000000..25635c7d Binary files /dev/null and b/src/public/data/pack/server/maps/m43_50 differ diff --git a/src/public/data/pack/server/maps/m43_51 b/src/public/data/pack/server/maps/m43_51 new file mode 100644 index 00000000..03c8459f --- /dev/null +++ b/src/public/data/pack/server/maps/m43_51 @@ -0,0 +1,6 @@ +222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222226666222666666622222222222222222222222222222222222222222222222226666622266666666222222222222222222222222222222222222222222222222666662226666666662222222222222222222222222222222222222222222222266666222666666666222222222222222222222222222222222222222222222226666622266666666662222222222222222222222222222222222222222222222222222226666666666222222222222222222222222222222222222222222222222222222666666666622222222222222222222222222222222222222222222222222222266666666662222222222222222222222222222222222222222222222222222226666666666222222222222222222222222222222222222222222222222222222666666666622222222222222222222222222222222222222222222222222222266666666662222222222222222222222222222222222222222222222222222226666666666222222222222222222222222222222222222222222222222222222666666666622222222222222222222222222222222222222222222222222222266666666662222222222222222222222222222222222222222222222222222226666666666222222222222222222222222222222222222222222222222222222666666666622222222222222222222222222222222222222222222222222222266666666662222222222222222222222222222222222222222222222222222226666666666222222222222222222222222222222222222222222222222222222666666666622222222222222222222222222222222222222222222222222222266666666662222222222222222222222222222222222222222222222222222226666666666222222222222222222222222222222222222222222222222226666666666666622222222222222222222222222222222222222222222222226666666666666622222222222222222222222222222222222222222222222222666666666666662222222222222222222222222222222222222222222222222266666666666662222222222222222222222222222222Ž2Ž22222222222222222226666666662222222222222222222222222222222222Ž2Ž2Ž2Ž222222222222222222266666666222222222222222222222222222222222Ž2Ž2Ž2Ž2Ž2Ž2222222222222222222222222222222222222222222222222222222222Ž2Ž2Ž2Ž2Ž2Ž2Ž2Ž22222222222222222222222222222222222222222222222222222Ž2Ž2Ž2Ž2Ž2Ž2Ž2Ž2Ž2Ž2Ž2Ž2Ž2Ž22222222222222222222222222222222222222222222222222Ž2Ž2Ž2Ž2Ž2Ž2Ž2ŽŽŽŽŽ2Ž2Ž2Ž2Ž222222222222222222222222222222222222222222222222Ž2Ž2Ž2Ž2Ž2Ž2Ž2Ž2ŽŽŽ ŽŽŽ2Ž2Ž2Ž22222222222222222222222222222222222222222222222Ž2Ž2Ž2Ž2Ž2Ž2Ž2Ž2Ž2ŽŽŽ2Ž2Ž22222222222222222222222222222222222222222222222Ž2Ž2Ž2Ž2ŽŽ2Ž2Ž2Ž2Ž 2Ž222222222222222222222222222222222222222222222222Ž2Ž2Ž2ŽŽŽ2Ž2Ž2ŽŽ 2Ž2Ž2222222222222222222222222222222222222222222222Ž2Ž2Ž2Ž 2ŽŽ 2Ž2Ž2Ž2Ž Ž2Ž2Ž2Ž22222222222222222222222222222222222222222222222Ž2Ž2Ž2Ž2Ž 22Ž2Ž2Ž2ŽŽ2Ž2Ž2Ž2Ž222222222222222222222222222222222222222222222222Ž2Ž2Ž22Ž2Ž"2Ž2Ž2Ž2ŽŽŽ 2Ž2Ž2Ž2Ž222222222222222222222222222222222222222222222222Ž2Ž2Ž2Ž2Ž2Ž2Ž2Ž2Ž2Ž+2Ž2Ž2Ž2Ž22222222222222222222222222222222222222222222222222Ž2Ž2Ž2Ž2Ž2Ž2Ž2ŽŽ +Ž2Ž2Ž2Ž2Ž2222222222222222222222222222222222222222222222222Ž2Ž2Ž2Ž2Ž2Ž2ŽŽ 2Ž 2Ž2Ž2Ž2222222222222222222222222222222222222222222222222Ž2Ž2Ž2Ž2Ž2Ž2Ž2ŽŽŽŽ Ž2Ž2Ž2Ž222222222222222222222222222222222222222222222222222Ž2Ž2Ž2Ž2Ž2Ž2Ž2Ž2Ž2Ž2Ž2Ž2Ž22222222222222222222222222222222222222222222222222222Ž22Ž2Ž2Ž2Ž2Ž2Ž2Ž2Ž2Ž222222222222222222222222222222222222222222222222222222222Ž2Ž2Ž2Ž2Ž2Ž2Ž222222222222222222222222222222222222222222222222222222222222Ž2Ž2Ž2Ž22222222222222222222222222222222222222222222222222222222222222Ž2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222•2222•2•2•2•22•22222222222222222222222222222222222222222222222222222•2•2•2•2•2•2•2•2•2•2•2•2•2•22222•2222222222222222222222222222222222222222222222•2•2•2•2•2•2•2•2•2•2•2•2•2•2•2•2•2•2•222222222222222222222222222222222222222222222$2•2•••••••• +2•2•2•2•2•2•2•2•2•2•2222 +222222222222222222222222222222222222222 2••••••••••• +2•2•2•2•2•2•2•2•2•22 +222222222222222222222222222222222222*3*3*3*3*3*3*3*3*3*3*3*3*3 *3*33333*3*3*3*3*3*3*333 3 *3*333333*3*3*3*3*7*7*7733 3 *3*3*33333*3*3*3*3*7*7*77333 3 *3*333333*3*3*3*3*7*7*773333*3*333333*3*3*3*3*3*3*333333*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*32*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*32*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*32*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*33*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*3*32*3*322*3*322*3*322*3*3222222222*3*3*3*3*3*3*3*3*322*3*3*3*3*3*3*3*3*322*3*3*3*3*3*3*3*3*3222222222222****** *** *** ********************22**2***2222***2*2* ***2*****2*****2*2****2222***2********************************************************************************************************************************** \ No newline at end of file diff --git a/src/public/data/pack/server/maps/m43_52 b/src/public/data/pack/server/maps/m43_52 new file mode 100644 index 00000000..f9eb82c0 --- /dev/null +++ b/src/public/data/pack/server/maps/m43_52 @@ -0,0 +1,10 @@ +2222222222222222222222222222222222222222222222222222222222ƒ 2ƒƒƒƒƒƒ2222222222222222222222222222222222222222222222222222222222ƒ2ƒ2ƒƒƒ ƒƒ2222222222222222222222222222$22&2222222222222222222222222222ƒ#2ƒ 2ƒƒƒƒ2222222222222222222222222222 22222222222222222222222222222ƒ2ƒ2ƒ!2ƒƒ2222222222222222222222222222222222)2 +22222222)2 +2%222222222ƒ2ƒ#2ƒ!2ƒ2222222222222222222222222222 22222222 +2%22222222222222ƒ2ƒ2ƒ2222222222222222222222222222(22222222#2 22222(22222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222*22222222222222222222222222222222222222222222222222222222222222(2'2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222ƒ22ƒ2ƒ2ƒ22222222222222222222222222222222222222222222222222222222222ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2222222222222222222222222222222222222222222222222222222222ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ22222222222222222222222222222222222222222222222222222222ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ222222222222222222222222222222222222222222222222222ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2222222222222222222222222222222222222222222222ƒ2222ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2222222222222222222222222222222222222222222ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2222222222222222222222222222222222222222ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2)2ƒƒƒ&2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ222222222222222222222222222222222222222ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ22ƒƒ,2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2222222222222222222222222222222222222ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ$2ƒ2ƒƒ######ƒ&2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2222222222222222$22 +222222222222ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ 2ƒƒƒ#####)))))ƒ +2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ222222222222222ƒ2ƒƒ ƒ      +2222222222ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ)ƒ  ))ƒ)ƒ)ƒ)ƒ))))ƒƒ&ƒ2ƒ2ƒ2ƒ2ƒ2222222ƒ22ƒ2ƒ2ƒ2ƒƒƒƒƒ   &22222222ƒ2ƒ2ƒ2ƒ2ƒ2ƒ+2ƒƒ    5ƒ) 5ƒ) 5ƒ) 5ƒ) 5ƒ) 5ƒ) 5ƒ)))))ƒ,2ƒ2ƒ2ƒ2ƒ2ƒ22222ƒ2ƒ2ƒ)ƒƒƒƒƒ    2222222ƒ2ƒ2ƒ2ƒ2ƒ)2ƒƒƒ  ƒƒ) 5ƒ) 5ƒ) 5ƒ) 5ƒ) 5ƒ) 5ƒ) 5ƒ)ƒ)))))ƒƒƒ +2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ+2ƒƒƒƒ  ,2222222ƒ2ƒ2ƒ2ƒ2ƒƒƒ   ƒ)ƒ) 5ƒ) 5ƒ) 5ƒ) 5ƒ) 5ƒ) 5ƒ) 5ƒ)ƒ)ƒ)))))ƒƒƒƒ2ƒ2ƒ2ƒ2ƒ)2ƒ2ƒ2ƒƒ  &22222ƒ2ƒ2ƒ2ƒ2ƒƒƒ ƒ)ƒ) 5ƒ) 5ƒ) 5ƒ) 5ƒ) 5ƒ) 5ƒ) 5ƒ) ƒ)* )))))ƒƒƒƒ2ƒ2ƒ+2ƒƒ2ƒ2ƒ   ƒ22222ƒ2ƒ2ƒ2ƒ+2ƒƒƒ ƒ)ƒ) 5ƒ) 5ƒ) 5ƒ) 5ƒ) 5ƒ) 5ƒ) 5ƒ) ƒ) )))))!  ƒ ƒƒƒƒƒƒƒ # ƒ ƒ2222ƒ2ƒ2ƒ)2ƒƒƒ  ƒ) 5ƒ) 5ƒ) 5ƒ) 5ƒ) 5ƒ) 5ƒ) 5ƒ) ƒ)+ )))),($##ƒ#ƒ$ƒƒƒ !$'ƒ ƒ2ƒ222ƒ2ƒ2ƒƒƒ   '$)ƒ) 5ƒ) 5ƒ) 5ƒ) 5ƒ) 5ƒ) 5ƒ) 5ƒ))))))ƒ)ƒ+ƒ( ƒ'&&&&&''($#""  # ƒƒ2ƒ2ƒ2ƒ2ƒ 2ƒƒƒ )%"ƒ)ƒ)ƒ)ƒ)- ƒ) ƒ)* ƒ))))))-ƒ)ƒ-ƒ-ƒ,ƒ+*ƒ+ƒ++---((&$$#!   ƒ ƒ ƒ 2ƒ2ƒ2ƒ)ƒƒƒ *'#ƒ)ƒ)ƒ) ƒ) ƒ) )))))ƒ-ƒ-ƒ-ƒ-ƒ-ƒ-ƒ-ƒ-ƒ-----)(&'%#   ƒ ƒƒ2ƒ2ƒ 999*999999999-999 9-9999!99999999999!999999,999 99999999,9999 9 +9999999 +999&9999,99+9                                    \ No newline at end of file diff --git a/src/public/data/pack/server/maps/m43_53 b/src/public/data/pack/server/maps/m43_53 new file mode 100644 index 00000000..187a97e3 Binary files /dev/null and b/src/public/data/pack/server/maps/m43_53 differ diff --git a/src/public/data/pack/server/maps/m43_54 b/src/public/data/pack/server/maps/m43_54 new file mode 100644 index 00000000..3204ae35 Binary files /dev/null and b/src/public/data/pack/server/maps/m43_54 differ diff --git a/src/public/data/pack/server/maps/m43_55 b/src/public/data/pack/server/maps/m43_55 new file mode 100644 index 00000000..998ee0ee Binary files /dev/null and b/src/public/data/pack/server/maps/m43_55 differ diff --git a/src/public/data/pack/server/maps/m43_56 b/src/public/data/pack/server/maps/m43_56 new file mode 100644 index 00000000..26fb9672 Binary files /dev/null and b/src/public/data/pack/server/maps/m43_56 differ diff --git a/src/public/data/pack/server/maps/m43_72 b/src/public/data/pack/server/maps/m43_72 new file mode 100644 index 00000000..ccaaa1cc Binary files /dev/null and b/src/public/data/pack/server/maps/m43_72 differ diff --git a/src/public/data/pack/server/maps/m43_73 b/src/public/data/pack/server/maps/m43_73 new file mode 100644 index 00000000..090a4634 Binary files /dev/null and b/src/public/data/pack/server/maps/m43_73 differ diff --git a/src/public/data/pack/server/maps/m43_74 b/src/public/data/pack/server/maps/m43_74 new file mode 100644 index 00000000..9df7bd0c Binary files /dev/null and b/src/public/data/pack/server/maps/m43_74 differ diff --git a/src/public/data/pack/server/maps/m43_75 b/src/public/data/pack/server/maps/m43_75 new file mode 100644 index 00000000..1a434212 Binary files /dev/null and b/src/public/data/pack/server/maps/m43_75 differ diff --git a/src/public/data/pack/server/maps/m44_144 b/src/public/data/pack/server/maps/m44_144 new file mode 100644 index 00000000..2aa2ce2d Binary files /dev/null and b/src/public/data/pack/server/maps/m44_144 differ diff --git a/src/public/data/pack/server/maps/m44_145 b/src/public/data/pack/server/maps/m44_145 new file mode 100644 index 00000000..5509a6ec Binary files /dev/null and b/src/public/data/pack/server/maps/m44_145 differ diff --git a/src/public/data/pack/server/maps/m44_146 b/src/public/data/pack/server/maps/m44_146 new file mode 100644 index 00000000..bbc20113 Binary files /dev/null and b/src/public/data/pack/server/maps/m44_146 differ diff --git a/src/public/data/pack/server/maps/m44_148 b/src/public/data/pack/server/maps/m44_148 new file mode 100644 index 00000000..0160ba52 Binary files /dev/null and b/src/public/data/pack/server/maps/m44_148 differ diff --git a/src/public/data/pack/server/maps/m44_149 b/src/public/data/pack/server/maps/m44_149 new file mode 100644 index 00000000..1ab87be5 Binary files /dev/null and b/src/public/data/pack/server/maps/m44_149 differ diff --git a/src/public/data/pack/server/maps/m44_150 b/src/public/data/pack/server/maps/m44_150 new file mode 100644 index 00000000..97d83357 Binary files /dev/null and b/src/public/data/pack/server/maps/m44_150 differ diff --git a/src/public/data/pack/server/maps/m44_151 b/src/public/data/pack/server/maps/m44_151 new file mode 100644 index 00000000..6d7acec8 Binary files /dev/null and b/src/public/data/pack/server/maps/m44_151 differ diff --git a/src/public/data/pack/server/maps/m44_152 b/src/public/data/pack/server/maps/m44_152 new file mode 100644 index 00000000..3e3ea19f Binary files /dev/null and b/src/public/data/pack/server/maps/m44_152 differ diff --git a/src/public/data/pack/server/maps/m44_153 b/src/public/data/pack/server/maps/m44_153 new file mode 100644 index 00000000..43e427ec Binary files /dev/null and b/src/public/data/pack/server/maps/m44_153 differ diff --git a/src/public/data/pack/server/maps/m44_154 b/src/public/data/pack/server/maps/m44_154 new file mode 100644 index 00000000..08634f48 Binary files /dev/null and b/src/public/data/pack/server/maps/m44_154 differ diff --git a/src/public/data/pack/server/maps/m44_155 b/src/public/data/pack/server/maps/m44_155 new file mode 100644 index 00000000..1b39c797 Binary files /dev/null and b/src/public/data/pack/server/maps/m44_155 differ diff --git a/src/public/data/pack/server/maps/m44_45 b/src/public/data/pack/server/maps/m44_45 new file mode 100644 index 00000000..c2dd15a5 Binary files /dev/null and b/src/public/data/pack/server/maps/m44_45 differ diff --git a/src/public/data/pack/server/maps/m44_46 b/src/public/data/pack/server/maps/m44_46 new file mode 100644 index 00000000..64482359 Binary files /dev/null and b/src/public/data/pack/server/maps/m44_46 differ diff --git a/src/public/data/pack/server/maps/m44_47 b/src/public/data/pack/server/maps/m44_47 new file mode 100644 index 00000000..25d8019c Binary files /dev/null and b/src/public/data/pack/server/maps/m44_47 differ diff --git a/src/public/data/pack/server/maps/m44_48 b/src/public/data/pack/server/maps/m44_48 new file mode 100644 index 00000000..0815e3c9 Binary files /dev/null and b/src/public/data/pack/server/maps/m44_48 differ diff --git a/src/public/data/pack/server/maps/m44_49 b/src/public/data/pack/server/maps/m44_49 new file mode 100644 index 00000000..f1448e10 Binary files /dev/null and b/src/public/data/pack/server/maps/m44_49 differ diff --git a/src/public/data/pack/server/maps/m44_50 b/src/public/data/pack/server/maps/m44_50 new file mode 100644 index 00000000..ea6fb094 Binary files /dev/null and b/src/public/data/pack/server/maps/m44_50 differ diff --git a/src/public/data/pack/server/maps/m44_51 b/src/public/data/pack/server/maps/m44_51 new file mode 100644 index 00000000..9c060dc4 Binary files /dev/null and b/src/public/data/pack/server/maps/m44_51 differ diff --git a/src/public/data/pack/server/maps/m44_52 b/src/public/data/pack/server/maps/m44_52 new file mode 100644 index 00000000..1dc4db7e Binary files /dev/null and b/src/public/data/pack/server/maps/m44_52 differ diff --git a/src/public/data/pack/server/maps/m44_53 b/src/public/data/pack/server/maps/m44_53 new file mode 100644 index 00000000..aeacbd45 --- /dev/null +++ b/src/public/data/pack/server/maps/m44_53 @@ -0,0 +1,105 @@ +222222222222222222222222222222222222222ƒ2ƒ2ƒ2ƒ2ƒƒƒ + + +5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ + +5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ222222222222222222222222222222222222222ƒ2ƒ2ƒ2ƒ2ƒƒƒ + + +5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ/ +5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ222222222222222222222222222222222222222ƒ2ƒ2ƒ2ƒ2ƒ2ƒƒ +ƒ +5ƒ5ƒ5ƒ5ƒ5ƒ5ƒƒƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ2222222222222222222222222222222222222222ƒ2ƒ2ƒ2ƒ2ƒƒ +ƒ + +ƒƒƒƒƒ5ƒ +5ƒ5ƒ +5ƒ5ƒ +5ƒ5ƒ2222222222222222222222222222222222222222ƒ2ƒ2ƒ2ƒ2ƒƒ +ƒ  +# + +ƒƒƒ +55ƒ +5ƒ5ƒ +5ƒ5ƒ +5ƒ2222222222222222222222222222222222222222ƒ2ƒ2ƒ2ƒ2ƒƒ +ƒ +% + + +5ƒ5ƒ5ƒ5ƒ5ƒƒƒƒƒƒƒƒ22222222222222222222222222222222222222222ƒ2ƒ2ƒ2ƒƒƒ + + + +ƒ5ƒ5ƒ5ƒ5ƒ5ƒƒƒƒƒƒƒƒƒƒƒ22222222222222222222222222222222222222222ƒ2ƒ2ƒ2ƒƒƒ  + +ƒ5ƒ5ƒ5ƒ5ƒ5ƒƒƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒƒ22222222222222222222222222222222222222222ƒ2ƒ2ƒ2ƒƒƒ + + +ƒ5ƒ5ƒ5ƒ5ƒ5ƒƒƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒƒ2ƒ2222222222222222222222222222222222222222ƒ2ƒ2ƒ2ƒƒ +ƒ  + +ƒ5ƒ5ƒ5ƒ5ƒ5ƒƒƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒƒ2ƒ2ƒ222222222222222222222222222222222222222ƒ2ƒ2ƒ2ƒƒ +ƒ +( +ƒƒƒƒƒƒƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒƒ2ƒ2ƒ222222222222222222222222222222222222222ƒ2ƒ2ƒƒ +ƒ + + + + + + +ƒ + +ƒ +ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒƒ2ƒ2ƒ2ƒ2222222222222222222222222222222222222ƒ2ƒƒ + + + +ƒ +ƒ +ƒ +ƒ  +ƒ! +ƒ" +$ +ƒ +ƒ +ƒ +ƒƒƒƒƒ2ƒ2ƒ222222222222222222222222222222222222ƒ2ƒ2ƒƒ + +) +ƒƒƒƒƒƒƒ + +ƒ + +ƒ ++ +ƒƒƒƒ2ƒ2ƒ2ƒ2222222222222222222222222222 2222222222ƒ2ƒ + +ƒƒ5ƒ5ƒ6ƒ6ƒ5ƒ6ƒ6ƒ*2ƒ2ƒ2ƒ2ƒ2222222222222222222222222222222222222222 2 + +ƒƒ5ƒ5ƒ6ƒ6ƒ5ƒ6ƒ6ƒ2ƒ2ƒ2ƒ2ƒ2222222222222222222222222222222222222222 + +ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ+2ƒ!2ƒ2ƒ2ƒ2ƒ2222222222222222222222222222222222222 2 + + +ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒƒƒ $2ƒ2ƒ2ƒ2ƒ22222222222222222222222222&222222$2 , + + +ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒƒƒ!&2ƒ2ƒ2ƒ22222222222222222222222222'222222 ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒƒ"'2ƒ2ƒ2ƒ2ƒ2222222222222222222222222"2222222 5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒƒƒƒƒƒ "„'2ƒ2ƒ2ƒ2ƒ2222222222222222222222222*$"2222222 5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ2ƒ2ƒ 2ƒ"ƒ"ƒ!ƒ"„#&2ƒ2ƒ2ƒ2ƒ2ƒ222222222222222222222222+#22222 ƒƒƒƒ2ƒ2ƒ2ƒ2ƒ2ƒ( 2ƒ'ƒ$ƒ$ƒ*ƒ&2ƒ2ƒ2ƒ2ƒ222222222222222222222222222  ƒ2ƒ2ƒ2ƒ2202/2ƒ)ƒ'ƒ+ƒƒ2ƒ2ƒ2ƒ22222222222222222222   """"22222 ƒƒ 2ƒ#2ƒ&2ƒ232:2=2=#22ƒ* 2ƒ%ƒƒ2ƒ2ƒ2ƒ2222222222222222222))  2222 2 ƒƒƒ!2ƒ&2ƒ,2ƒ4)<E2I2P2>2ƒ12ƒ'ƒƒ2ƒ2ƒ2ƒ2222222222222222222  2222 ƒƒƒ ƒ#2ƒ2ƒ22=FOP2P2P2ƒ=2ƒ.ƒ'2ƒ2ƒ2ƒ22222222222222222222-22!2 22)2 ƒƒƒ ƒ%2ƒ+2ƒ72KOOP2P2P2P2ƒ=-2ƒ2ƒ2ƒ2ƒ2ƒ2222222222222222222 2$222 22 ƒƒƒƒ 2ƒ%2ƒ,272PPOOO2P2P2P2ƒ2ƒ2ƒ2ƒ222222222222222222222 2$,66+622  ƒƒƒƒƒ 2ƒ&2ƒ,$2PPP‘O‘PQ2P2O2ƒ2ƒ2ƒ2ƒ2ƒ222222222222222222222$222ƒƒƒƒƒ2ƒ)22PPP‘O‘K‘J‘L‘OO2ƒ2ƒ2ƒ2ƒ2222222222222222222222  2222+2 ƒƒƒƒƒƒ$22 PP‘P‘O‘I‘G‘I‘P‘O2ƒ2ƒ2ƒ2ƒ2ƒ222222222222222222222"22222 ƒ"ƒ#ƒƒƒ!'222P‘P‘P‘O‘K‘I‘K‘P‘P2ƒ2ƒ2ƒ2ƒ2ƒ222222222222222222222 222222   ƒƒ%ƒ%ƒƒ2%22 2P‘N‘K‘N‘P‘P‘P‘P‘P‘P2ƒ2ƒ2ƒ2ƒ2ƒ22222222222222222222222222222$ ƒƒƒ*ƒ)ƒ2(22H‘N‘I‘D‘K ‘P2‘P2‘P2‘P 2‘P‘P2ƒ2ƒ2ƒ2ƒ22222222222222222222222222222  +ƒƒ ƒ+ƒ)ƒ2!2,22‘A‘F‘F‘H‘N2‘P2‘P2‘e2‘j2‘d 2‘W2ƒ2ƒ2ƒ2ƒ2222222222222222222222222222 2  ƒƒƒ"ƒ-ƒ,2ƒ2"2+25‘H‘F‘G‘K 2‘P2‘P2‘o2‘t2‘w2‘v2‘{2ƒ2ƒ2ƒ2ƒ2222222222222222222222222222# "ƒƒƒƒ!ƒ. 2ƒ.2#2#22 2P‘P‘L‘L‘M2‘P2‘P2‘„)‘‚&‘‚2‘2‹w2ƒ2ƒ2ƒ2ƒ2222222222222222222222222222ƒƒƒ +ƒƒ22ƒ52,2.2EP‘P‘O‘O2‘O2‘P2‘‚2‘‘‘‹‹‰ +2‹‡2‹ƒ2ƒ2ƒ2ƒ22222222222222222222222222222ƒƒƒ +ƒƒ3=AP‘N‘P‘K‘P2‘P2‘P$2‘t2‘…‹Ž‹‹‹‹‹2ƒ2ƒ2ƒ2ƒ2222222222222222222222222222 2ƒƒƒƒ -2ƒ2/29*2E‘P‘L‘G‘F2‘P2‘P2‘€2‘€‹„‹‘‹›‹›‹•‹2ƒ2ƒ2ƒ2222222222222222222222222222222!ƒƒƒƒƒ 2ƒ2ƒ2*)2PP‘J‘E2‘G2‘P2‘€ ‘€ ‹„‹’‹£‹§‹£‹š‹’2ƒ2ƒ2ƒ2ƒ22222222222222222222222222222ƒƒƒƒ2ƒ22DN‘I‘M2‘L2‘M)‘P‘€‹‚‹“‹¤‹²‹±‹¨‹œ‹’2ƒ2ƒ2ƒ222222222222222222222222222222ƒƒ 2ƒ22=I‘I‘F2‘I2‘P2‘P‹t‹‹‘ ‹¦‹®‹´2‹©‹¢‹š‹2ƒ2ƒ2ƒ2ƒ222222222222222222222222222$ƒ2ƒ"2ƒ 26‘C‘G 2‘I2‘P2‘P‹€‹‚‹‘‹¦‹µ‹«2‹¥ 2‹—‹—‹–‹Œ2ƒ2ƒ2ƒ22222222222222222222 2"2222222 2ƒ2ƒ +2‘!‘2‘@‘F‘I2‘N2‘P‹€‹‚‹˜‹¨‹®2‹¦ 2‹“2‹‹ 2‹ƒ‹ƒ‹†2‹}2ƒ2ƒ2ƒ2222222222222222222222222222222ƒ22‘2‘7‘E‘I‘K2‘M2‘W 2‘€‹€‹Š‹¥‹«‹ ‹Š +2‹m2‹j2‹i2‹f2‹a2‹U2ƒ2ƒ2ƒ222222222222222222222222 2222$22$ 22222‘C2‘S2‘P2‘P2‘P)2‘P‘€‘€‹‡‹‘‹‘‹‡‹r‹c‹b‘_‘[‘V‘U2ƒ2ƒ2ƒ22222222222222222222222222222$222P2P2Y‘k‘k‘o‘s‘€‘€‘|‘w‹v‹r‹o‹e‹b‘c‘`‘Y‘U‘U2ƒ2ƒ2222222222222222222222222222$2222PX‘f‘q‘q‘t‘v‘{‘x‘l‘k‹k‹h‹f‹b‹g‹n‘j‘^‘U‘U2ƒ2ƒ2ƒ22222222222222222222222222222P‘G‘\‘b‘i‘j‘i‘i‘h‘b‘b‘e‹j‹n‹q ‹o‹b‹Ž‹‡‹‹l‹U‘U2ƒ2ƒ2222222222222222222222222 22222222<2P‘P‘]‘h‘d‘f‘d‘b‘a‘a‘d‘f‘j'2‹q2‹w2‹2‹‰ 2‹ˆ‹•‹–‹”‹Ž‹t‹c2ƒ22222222222222222222222222222:2D2F2P2PPPZ‘b‘i‘e‘c‘b‘b‘`‘_‘e2‘i2‹o2‹p2‹q2‘u2‹~2‹“ 2‹“‹˜‹š‹–‹‹l22222222222222222222222$22ƒƒ2ƒ22I)2MPPPU]e‘h‘fe‘c‘b02‘[2‘]2‘j2‘s2‘o2‘X2‘T2‘U2‘P2‘P2‹€ 2‹‹–‹™‹ƒ‹p222222222222222222222222ƒƒ2ƒ2ƒ2(2HM2NOS‘Y‘a‘a‘b‘d‘d‘b‘U +2‘P2‘P2‘P‘P‘P‘P‘P‘P&‘P2‘P2‹€2‹“ ‹”‹‚‹s2222222222222222222222ƒƒ +222 2FII‘N‘R‘W‘Y‘\‘_‘c‘h‘P‘P‘P‘P‘P‘P‘P‘P‘P‘P,2‘P2‘P2‘€2‹“2‹€2‹s222222222222‘22‘2‘2‘222 +8=A‘F‘K‘O‘R‘T‘X‘]‘d‘P‘P‘P‘P‘P‘P‘P‘M‘J‘M‘P +‘P2‘P2‘€2‹v2‹p22222222222‘2‘2‘2‘2‘2‘2‘ƒ,2‘8‘=‘C‘H‘M‘P‘U‘[‘b‘P‘P‘P PP‘P‘P‘J‘E‘G‘H‘L‘P +‘P2‘^2‹c2222222222‘2‘2‘2‘2‘2‘2‘‘‘ƒƒ"(.‘5‘<‘C‘J‘Q‘V‘Z‘P2‘P2‘P2P2P2P2P2‘P ‘K‘H‘E‘D‘J‘P‘P‘P‘P222222222‘2‘2‘2‘2‘2‘‘‘‘‘‘ƒƒƒ-2# 2.7=‘C‘J‘R‘U‘Z'P2P2P2ƒJ2ƒF2B2A2D2H 2P‘K‘I‘L‘L‘J‘M‘P2222222222‘2‘2‘‘‘‘‘‘‘‘ƒƒƒ2ƒ#202; 2BJ‘M P‘P2W2P2P2ƒ-2ƒ)2ƒ(2ƒ'2ƒ'2+232@ 2‘J‘N‘P‘J‘E‘J‘P22222222‘‘‘‘‘‘‘‘‘‘ƒƒ2ƒ2ƒ+2ƒ72B2P2P2P2P2P2P2ƒP2ƒ(2ƒ!2ƒ2ƒ2ƒ2ƒ!2'242?2‘G2‘M2‘K2‘J2‘M2‘P2222‘‘‘‘‘‘‘‘‘ƒƒ2ƒ'2ƒ12ƒ:2B2G2J2L2G2ƒC2ƒ<)ƒ*ƒ!ƒ&ƒ2ƒ2ƒ 2ƒ&2.262=2‘A2‘A2‘A2‘B2‘C2‘‘‘‘‘‘‘‘+++++++!ƒ, +2ƒ42ƒ:2ƒ>2ƒ@2ƒ?2ƒ=2ƒ32ƒ/2ƒ+ƒ$ƒƒƒ +2ƒ2ƒ 2ƒ(2ƒ/2427292927282855555555555555555555555555555555555555555555555555555+5555555+5555555+5555555+555555555555555555555 \ No newline at end of file diff --git a/src/public/data/pack/server/maps/m44_54 b/src/public/data/pack/server/maps/m44_54 new file mode 100644 index 00000000..4eda4258 Binary files /dev/null and b/src/public/data/pack/server/maps/m44_54 differ diff --git a/src/public/data/pack/server/maps/m44_55 b/src/public/data/pack/server/maps/m44_55 new file mode 100644 index 00000000..2444cbf0 Binary files /dev/null and b/src/public/data/pack/server/maps/m44_55 differ diff --git a/src/public/data/pack/server/maps/m44_72 b/src/public/data/pack/server/maps/m44_72 new file mode 100644 index 00000000..d383a168 Binary files /dev/null and b/src/public/data/pack/server/maps/m44_72 differ diff --git a/src/public/data/pack/server/maps/m44_73 b/src/public/data/pack/server/maps/m44_73 new file mode 100644 index 00000000..7fec7efc Binary files /dev/null and b/src/public/data/pack/server/maps/m44_73 differ diff --git a/src/public/data/pack/server/maps/m44_74 b/src/public/data/pack/server/maps/m44_74 new file mode 100644 index 00000000..8a059356 Binary files /dev/null and b/src/public/data/pack/server/maps/m44_74 differ diff --git a/src/public/data/pack/server/maps/m44_75 b/src/public/data/pack/server/maps/m44_75 new file mode 100644 index 00000000..a074b6e5 Binary files /dev/null and b/src/public/data/pack/server/maps/m44_75 differ diff --git a/src/public/data/pack/server/maps/m45_145 b/src/public/data/pack/server/maps/m45_145 new file mode 100644 index 00000000..ad9e35ee Binary files /dev/null and b/src/public/data/pack/server/maps/m45_145 differ diff --git a/src/public/data/pack/server/maps/m45_146 b/src/public/data/pack/server/maps/m45_146 new file mode 100644 index 00000000..0aa7b516 Binary files /dev/null and b/src/public/data/pack/server/maps/m45_146 differ diff --git a/src/public/data/pack/server/maps/m45_148 b/src/public/data/pack/server/maps/m45_148 new file mode 100644 index 00000000..ef28b5b4 Binary files /dev/null and b/src/public/data/pack/server/maps/m45_148 differ diff --git a/src/public/data/pack/server/maps/m45_150 b/src/public/data/pack/server/maps/m45_150 new file mode 100644 index 00000000..1697914a Binary files /dev/null and b/src/public/data/pack/server/maps/m45_150 differ diff --git a/src/public/data/pack/server/maps/m45_151 b/src/public/data/pack/server/maps/m45_151 new file mode 100644 index 00000000..e707f73b Binary files /dev/null and b/src/public/data/pack/server/maps/m45_151 differ diff --git a/src/public/data/pack/server/maps/m45_152 b/src/public/data/pack/server/maps/m45_152 new file mode 100644 index 00000000..81616ec8 Binary files /dev/null and b/src/public/data/pack/server/maps/m45_152 differ diff --git a/src/public/data/pack/server/maps/m45_153 b/src/public/data/pack/server/maps/m45_153 new file mode 100644 index 00000000..b3480e82 Binary files /dev/null and b/src/public/data/pack/server/maps/m45_153 differ diff --git a/src/public/data/pack/server/maps/m45_154 b/src/public/data/pack/server/maps/m45_154 new file mode 100644 index 00000000..f3a1dcca Binary files /dev/null and b/src/public/data/pack/server/maps/m45_154 differ diff --git a/src/public/data/pack/server/maps/m45_155 b/src/public/data/pack/server/maps/m45_155 new file mode 100644 index 00000000..5d18f979 Binary files /dev/null and b/src/public/data/pack/server/maps/m45_155 differ diff --git a/src/public/data/pack/server/maps/m45_45 b/src/public/data/pack/server/maps/m45_45 new file mode 100644 index 00000000..30f5a596 Binary files /dev/null and b/src/public/data/pack/server/maps/m45_45 differ diff --git a/src/public/data/pack/server/maps/m45_46 b/src/public/data/pack/server/maps/m45_46 new file mode 100644 index 00000000..d1c171cd Binary files /dev/null and b/src/public/data/pack/server/maps/m45_46 differ diff --git a/src/public/data/pack/server/maps/m45_47 b/src/public/data/pack/server/maps/m45_47 new file mode 100644 index 00000000..de3d2f55 Binary files /dev/null and b/src/public/data/pack/server/maps/m45_47 differ diff --git a/src/public/data/pack/server/maps/m45_48 b/src/public/data/pack/server/maps/m45_48 new file mode 100644 index 00000000..7cb70f50 Binary files /dev/null and b/src/public/data/pack/server/maps/m45_48 differ diff --git a/src/public/data/pack/server/maps/m45_49 b/src/public/data/pack/server/maps/m45_49 new file mode 100644 index 00000000..5fc176fe Binary files /dev/null and b/src/public/data/pack/server/maps/m45_49 differ diff --git a/src/public/data/pack/server/maps/m45_50 b/src/public/data/pack/server/maps/m45_50 new file mode 100644 index 00000000..6cb9ec6c --- /dev/null +++ b/src/public/data/pack/server/maps/m45_50 @@ -0,0 +1,8 @@ +222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222ƒ22ƒ2ƒ22222222222222222222222222222222222222ƒ22ƒ22ƒ22ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2222222222222222222222222222222222ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ22222222222222222222222222222222ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ22222222222222222222222222222222ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2222222222222222222222222222ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ222222222222ƒ2222222222222ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ222222222ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2222222222ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ)2ƒ&2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2222222ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ222ƒ22ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒƒƒ +2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ+2ƒƒƒƒƒƒƒ +2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ22222ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒƒƒƒƒƒƒƒƒ +2ƒ%2ƒ2ƒ2ƒ2ƒ2ƒƒƒƒƒƒƒƒƒƒ +2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ222ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒƒƒƒƒƒƒƒƒƒƒƒ2ƒ2ƒ2ƒ2ƒƒƒ$ƒƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ22ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ(#"ƒƒ +2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ22ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒƒƒƒƒƒ*&ƒƒƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒƒƒƒƒƒ"ƒƒƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒƒƒƒƒƒƒƒƒƒƒƒƒ555 5ƒƒƒƒ,2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ5ƒ5ƒ5ƒ5ƒ5ƒ 5ƒƒƒƒƒƒƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒƒƒƒƒƒƒ +2ƒ2ƒ2ƒ2ƒ2ƒ&2ƒ2ƒ2ƒ2ƒ2ƒƒƒƒƒƒƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒƒƒƒƒ2ƒ2ƒ2ƒ2ƒ2ƒƒƒƒƒƒƒƒƒƒƒƒ +2ƒ2ƒƒƒƒƒƒƒƒƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒƒƒ"ƒ2ƒ2ƒ2ƒ$2ƒ2ƒƒƒ5ƒƒ5ƒ5ƒƒƒƒƒƒƒƒƒƒƒƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒƒƒ2ƒ2ƒ2ƒ 2ƒƒƒƒ5ƒ5ƒ55ƒƒƒƒƒƒƒƒƒƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒƒƒ2ƒ2ƒ2ƒƒƒƒ5ƒ5ƒ5ƒ5ƒƒƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒƒƒ2ƒ2ƒ2ƒƒƒ5ƒ5ƒ5ƒ5ƒƒƒƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒƒ2ƒ2ƒ 2ƒƒƒƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒƒƒ2ƒ2ƒƒƒƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒƒƒƒƒƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒƒƒ2ƒ2ƒƒƒƒƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒƒƒƒƒƒƒƒƒƒƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒƒ2ƒ 2ƒƒƒƒƒƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒƒƒƒƒƒƒƒƒƒƒƒ*5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒƒƒ2ƒƒ ƒƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒƒ!ƒƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ5ƒ5ƒ5ƒ5ƒ5ƒ555ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒƒƒƒƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒƒƒƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒƒƒƒƒƒƒƒƒƒƒƒƒƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒƒƒƒ5ƒ5ƒ5ƒ5ƒƒƒƒƒƒƒƒƒƒƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒƒƒƒ5ƒ5ƒ5ƒ5ƒƒƒƒƒƒƒƒƒƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒƒƒƒ5ƒ5ƒ5ƒ5ƒƒƒƒƒƒƒƒƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ*5ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ55ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒ5ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ555 555555 5555555555555555555AAAAAA555555555555555555AAAAAA5555555555555555555AAAAAA5555555555555555555AAAAAA555555555555555555555AAAAAAAAA555555555555555555555AAAAAAAAA555555555555555555555AAAAAAAAA555555555555555555555AAAAAAAAA555555555555555555AAAAAAAAA555555555555555555AAAAAAAAA555555555555555555AAAAAAAAA555555555555555555AAAAAAAAA555555555555555555AAAAAAAAA55555555555555555AAAAAAAAA555555555555555555555AAAAAA555555555555555555555AAAAAA555555555555555555555AAAA555555555555555555555555555555555555555555 555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA \ No newline at end of file diff --git a/src/public/data/pack/server/maps/m45_51 b/src/public/data/pack/server/maps/m45_51 new file mode 100644 index 00000000..d67d3a31 --- /dev/null +++ b/src/public/data/pack/server/maps/m45_51 @@ -0,0 +1,127 @@ +2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222ƒ2ƒ2ƒ22ƒ2222222222222222222222222222222222222222222222222222222222ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2222222222222222222222222222222222222222222222222222222222ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222ƒ22ƒ222222222222222222222222222222222222222222222222222222222222ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2222222222222222222222222222222222222222222222222222222222ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ22222222222222222222222222222222222222222222222222222222ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ222222222222222222222222222222222222222222222222222222ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ222222222222222222222222222222222222222222222222222222ƒ2ƒ2ƒ2ƒ2ƒ2ƒ)2ƒƒƒ&2ƒ2ƒ22222222222222222222222222222222222222222222222222222ƒ2ƒ2ƒ2ƒ2ƒ2ƒ)2ƒƒƒƒ +ƒ2ƒ222222222222222222222222222222222222222222222222222222ƒ2ƒ2ƒ2ƒ2ƒƒƒƒ +ƒ +ƒ +2ƒ22222222222222222222222222222222222222222222222222222ƒ2ƒ2ƒ2ƒ2ƒ2ƒƒƒ +ƒ +ƒƒ +ƒ22222222222222222222222222222222222222222222222222222ƒ2ƒ2ƒ2ƒ2ƒ 2ƒƒƒ +ƒƒƒ + +222222222222222222222222222222222222222222222222222222ƒ2ƒ2ƒ2ƒƒƒ +ƒ +ƒƒ 2222222222222222222222222222222222222222222222222222222ƒ2ƒ2ƒƒƒ +ƒƒƒ 222222222222222222222222222222222222222222222222222222ƒ2ƒ2ƒ2ƒƒƒ +ƒ ƒ 2222222222222222222222222222222222222222222222222222222ƒ2ƒ2ƒƒƒƒƒ2222222222222222222222222222222222222222222222222222222ƒ2ƒ2ƒ 2ƒƒƒƒƒ2222222222222222222222222222222222222222222222222222222ƒ2ƒ2ƒ2ƒ*2ƒƒƒƒ22222222222222222222222222222222222222222222222222222222ƒ2ƒ2ƒ2ƒƒƒ"222222222222222222222222222222222 +2222222222222222222222ƒ2ƒ2ƒ2ƒ+2ƒƒƒƒ"222222$2222222222222222222)2  &2222222222222222222ƒ2ƒ2ƒ2ƒ2ƒƒƒƒƒ 22222Ž)2Ž'22222222222222222  +2222222222222222222ƒ2ƒ2ƒƒƒƒƒ 2222Ž2Ž 2ŽŽ2Ž2Ž22222222222222 "(222222222)2222222ƒ2ƒ 2ƒƒƒƒ!222Ž2Ž2Ž2Ž2Ž2Ž2Ž2Ž222222222222!   2 2$22,2+2,22222ƒ+2ƒƒƒƒ2222Ž2Ž2Ž2Ž2Ž2Ž22222222)2!2 2"22 22222ƒƒƒ22222Ž2Ž2Ž2Ž22222222+2 2 2222+2,……!ƒ222222Ž222222222)2 222!2  2 "2222+2…,…&…… ……!"""222222222222222 +22222#2 22"2222+2………,…*…&……"#%%$#!  2222222222222 '2222$222222222…………+…*……*(%#!ƒ2222222222)2 222222222 2 +2222……………)…%%$*'$! " ƒ!ƒ!ƒ!ƒ!ƒ!ƒ!!2222$2222 22222222222……………… "ƒ ƒƒ!5ƒ!5ƒ!5ƒ!5ƒ!ƒ!!2222 2  22"2222222222 2…………………………ƒ!ƒ!ƒ!ƒ!5ƒ!5ƒ!5ƒ!5ƒ!ƒ!ƒ!222+222222222222+2ƒ…………………………!ƒƒ!5ƒ!5ƒ!5ƒ!5ƒ!5ƒ!5ƒ!5ƒ!ƒ!ƒ!22)2 22222222222+2ƒƒƒƒ………………ƒƒ!5ƒ!5ƒ!5ƒ!5ƒ!5ƒ!5ƒ!5ƒ!ƒ!ƒ!2+2ƒ2222222222+2ƒƒƒƒƒ…………ƒ!5ƒ!5ƒ!5ƒ!5ƒ!5ƒ!5ƒ!5ƒ!ƒ!ƒ!)2222222222+2ƒƒƒƒƒƒ…………!ƒ!ƒ!ƒ!ƒ!ƒ!ƒ!5ƒ!5ƒ!ƒ!ƒ!"22222ƒ22ƒ2ƒ+2ƒƒƒƒƒƒƒ… …!… $!ƒ!ƒ!ƒ!ƒ!ƒ!5ƒ!5ƒ!ƒ!ƒ!",222ƒ2ƒ2ƒ2ƒ)2ƒƒƒƒƒƒƒ…… !"$ƒƒ!5ƒ!5ƒ!ƒ!ƒ! +22ƒ2ƒƒƒƒƒƒƒƒ#"#$ƒƒ!ƒ!ƒ!ƒ!!ƒƒ ƒƒƒ#####ƒ!ƒ!ƒ!!!(#####'+ƒƒ #####ƒ#"!ƒ#ƒ#ƒ#ƒ##ƒ##ƒ###ƒƒƒ$#!ƒ#5ƒ#5ƒ#5ƒ# 5ƒ#ƒ##!"##ƒ#ƒ#ƒ#ƒ#ƒ#ƒ#ƒ#ƒ##ƒƒƒƒ&$"ƒ#5ƒ#5ƒ#5ƒ#5ƒ# 5ƒ#######5ƒ#5ƒ#5ƒ#5ƒ#5ƒ#5ƒ# 5ƒ#ƒ##ƒƒƒƒ(%ƒ#"##ƒ#5ƒ#5ƒ#5ƒ#5ƒ#5ƒ# 5ƒ#####5#5#5ƒ#5ƒ#5ƒ#5ƒ#5ƒ#5ƒ#ƒ#ƒ##ƒƒƒƒƒ&ƒ%ƒ%&##5ƒ#5ƒ#5ƒ#5ƒ#5ƒ#5ƒ#5ƒ#5ƒ#5ƒ#5#5ƒ#5#5ƒ#5ƒ#5ƒ#5ƒ#5ƒ#5ƒ#ƒ#ƒ##ƒƒ(ƒ'ƒ')#ƒ#ƒ#5ƒ#5ƒ#5ƒ#5ƒ#5ƒ#5ƒ#5ƒ#5ƒ#5ƒ#5ƒ#5ƒ#5ƒ#5ƒ#5ƒ#5ƒ#5ƒ#ƒ#ƒ##ƒ*ƒ(ƒ(+%#ƒ#ƒ#5ƒ#5ƒ#5ƒ#5ƒ#5ƒ#5ƒ#5ƒ#5ƒ#5ƒ#5ƒ#5ƒ#5ƒ#ƒ#ƒ#ƒ#ƒ#ƒ#ƒ +ƒ + +ƒƒƒƒƒ*ƒ)ƒ)*##ƒ#5ƒ#5ƒ#5ƒ#5ƒ#5ƒ#5ƒ#5ƒ#5ƒ#5ƒ#5ƒ# +ƒ# +ƒ# +ƒ# +ƒ# +ƒ# +ƒ#' +ƒ! +ƒ +ƒ + +ƒƒƒƒƒƒ +ƒ +ƒ +ƒ +ƒƒƒ)ƒ)ƒ)ƒ##ƒ#5ƒ#5ƒ#5ƒ#5ƒ#5ƒ#5ƒ#5ƒ#5ƒ#5ƒ#5ƒ# 5ƒ#ƒ#ƒ# + +ƒ# +ƒ# +# +! +ƒ) +ƒ& +ƒ + +ƒƒƒ- +ƒ +ƒ +ƒ +ƒ + +ƒ +ƒ +ƒ +ƒ +ƒ +ƒ +ƒ +ƒƒƒƒ'$$ƒ#ƒ#5ƒ#5ƒ#5ƒ#5ƒ#5ƒ#5ƒ#5ƒ#5ƒ#5ƒ#5ƒ#5ƒ#5ƒ#5ƒ# 5ƒ#ƒ# + +# +# +ƒƒ +ƒ +ƒ( +ƒ' +ƒ +ƒ +ƒ +ƒ +ƒ + + + +ƒ +ƒ +ƒ +ƒ +ƒ +ƒ + +ƒ#ƒ########'#ƒ#ƒ#ƒ#5ƒ#5ƒ#5ƒ#5ƒ#5ƒ#5ƒ#5ƒ#5ƒ#5ƒ#5ƒ#5ƒ#5ƒ#5ƒ#5ƒ#ƒ#ƒ##ƒ +ƒ +ƒ +ƒ +ƒ +ƒ +ƒƒ + +ƒ +ƒ +ƒ +ƒ +ƒ +ƒ +ƒ +ƒƒ#6#6#6#6#6#6#6#6#()&#ƒ#ƒ#ƒ#ƒ#ƒ#ƒ#ƒ#ƒ#ƒ#ƒ#ƒ#5ƒ#5ƒ#5ƒ#5ƒ#5ƒ#5ƒ#5ƒ#ƒ#ƒ###, +ƒ +ƒ +ƒ$ +ƒ +ƒƒƒ + +ƒ +ƒ +ƒ +ƒ +ƒ +#6########%##ƒ#ƒ#ƒ#ƒ#ƒ#ƒ#ƒ#ƒ#ƒ#ƒ#ƒ#ƒ#5ƒ#5ƒ#5ƒ#5ƒ#5ƒ#5ƒ#ƒ#ƒ###& +ƒ +ƒ +ƒƒƒƒƒƒƒƒƒƒ#6#ƒ##ƒ#ƒ##ƒ#ƒ#&$"#####ƒ#ƒƒƒƒƒƒ#ƒ#ƒ#ƒ#ƒ#ƒ#ƒ#ƒ#ƒ####ƒ +ƒ +ƒƒƒ#ƒ#ƒ#ƒ#ƒ#ƒ#ƒ#ƒ#6ƒ#ƒ#ƒ#ƒƒƒƒƒ(('###### ƒƒ ƒƒƒ#ƒ#ƒ#ƒ#ƒ#ƒ#ƒ#### +ƒ +ƒ +ƒƒƒƒ#6ƒ#6ƒ#6ƒ#6ƒ#5ƒ#6ƒ#6ƒ#6ƒ#6ƒ#ƒ#ƒ#ƒƒƒƒƒ')(######ƒ ƒƒ ƒƒƒƒƒƒƒ######ƒ +ƒ +ƒ +ƒƒƒƒ#6ƒ#6ƒ#6ƒ#ƒ#ƒ#ƒ#ƒ#ƒ#ƒ#ƒ#ƒ#ƒ#ƒƒƒƒƒ&'######ƒƒƒƒƒƒƒ#####ƒ +ƒ +ƒƒƒƒƒ#6ƒ#6ƒ#ƒ##########&%###################ƒ###### +ƒ +ƒ +ƒƒƒƒ#6ƒ######AA5555AAAA555AAAA5555AAAA5555AAAA5555AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA55555555AAAAAAAAAAA5555555AAAAAAAAA5555555AAAAAAA55555555AAAAA55555555AAAAAAA55555555AAAAAAAAAAAAAAAAA55555555AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA \ No newline at end of file diff --git a/src/public/data/pack/server/maps/m45_52 b/src/public/data/pack/server/maps/m45_52 new file mode 100644 index 00000000..c17d4764 Binary files /dev/null and b/src/public/data/pack/server/maps/m45_52 differ diff --git a/src/public/data/pack/server/maps/m45_53 b/src/public/data/pack/server/maps/m45_53 new file mode 100644 index 00000000..e382ea74 Binary files /dev/null and b/src/public/data/pack/server/maps/m45_53 differ diff --git a/src/public/data/pack/server/maps/m45_54 b/src/public/data/pack/server/maps/m45_54 new file mode 100644 index 00000000..a201b1f5 Binary files /dev/null and b/src/public/data/pack/server/maps/m45_54 differ diff --git a/src/public/data/pack/server/maps/m45_55 b/src/public/data/pack/server/maps/m45_55 new file mode 100644 index 00000000..d33df074 Binary files /dev/null and b/src/public/data/pack/server/maps/m45_55 differ diff --git a/src/public/data/pack/server/maps/m45_56 b/src/public/data/pack/server/maps/m45_56 new file mode 100644 index 00000000..c6904b83 Binary files /dev/null and b/src/public/data/pack/server/maps/m45_56 differ diff --git a/src/public/data/pack/server/maps/m45_57 b/src/public/data/pack/server/maps/m45_57 new file mode 100644 index 00000000..87d7d0f5 Binary files /dev/null and b/src/public/data/pack/server/maps/m45_57 differ diff --git a/src/public/data/pack/server/maps/m45_58 b/src/public/data/pack/server/maps/m45_58 new file mode 100644 index 00000000..a91b150c Binary files /dev/null and b/src/public/data/pack/server/maps/m45_58 differ diff --git a/src/public/data/pack/server/maps/m45_59 b/src/public/data/pack/server/maps/m45_59 new file mode 100644 index 00000000..2a4b70b5 Binary files /dev/null and b/src/public/data/pack/server/maps/m45_59 differ diff --git a/src/public/data/pack/server/maps/m45_60 b/src/public/data/pack/server/maps/m45_60 new file mode 100644 index 00000000..3bb5b000 Binary files /dev/null and b/src/public/data/pack/server/maps/m45_60 differ diff --git a/src/public/data/pack/server/maps/m45_61 b/src/public/data/pack/server/maps/m45_61 new file mode 100644 index 00000000..5c52a16d Binary files /dev/null and b/src/public/data/pack/server/maps/m45_61 differ diff --git a/src/public/data/pack/server/maps/m45_62 b/src/public/data/pack/server/maps/m45_62 new file mode 100644 index 00000000..55c284b6 --- /dev/null +++ b/src/public/data/pack/server/maps/m45_62 @@ -0,0 +1 @@ +2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222 \ No newline at end of file diff --git a/src/public/data/pack/server/maps/m45_73 b/src/public/data/pack/server/maps/m45_73 new file mode 100644 index 00000000..a39d2c9d Binary files /dev/null and b/src/public/data/pack/server/maps/m45_73 differ diff --git a/src/public/data/pack/server/maps/m45_74 b/src/public/data/pack/server/maps/m45_74 new file mode 100644 index 00000000..9273d4ff Binary files /dev/null and b/src/public/data/pack/server/maps/m45_74 differ diff --git a/src/public/data/pack/server/maps/m45_75 b/src/public/data/pack/server/maps/m45_75 new file mode 100644 index 00000000..1e2808ae Binary files /dev/null and b/src/public/data/pack/server/maps/m45_75 differ diff --git a/src/public/data/pack/server/maps/m45_76 b/src/public/data/pack/server/maps/m45_76 new file mode 100644 index 00000000..4408bd54 Binary files /dev/null and b/src/public/data/pack/server/maps/m45_76 differ diff --git a/src/public/data/pack/server/maps/m46_149 b/src/public/data/pack/server/maps/m46_149 new file mode 100644 index 00000000..ea922804 --- /dev/null +++ b/src/public/data/pack/server/maps/m46_149 @@ -0,0 +1 @@ +*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A”€*A”€*A”€*A”€*A”€*A€*A”€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A”€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A€*A€*A€*A€*A€*A€*A€*A”€*A”€*A”€*A”€*A€*A€*A€*A€*A€*A€*A€*A€*A€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A€*A€*A”€*A”€*A€*A€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”‚*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”ˆ*A”„*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”*A”*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”‘*A”Š*A”ƒ*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”*A”|*A”}*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”—*A”*A”‡*A”‚*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”|*A”v*A”v*A”x*A”{*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”š*A”’*A”‹*A”†*A”‚*A”€*A”€*A”*A”ƒ*A”‚*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”}*A”u*A”t*A”u*A”w*A”}*A”€*A”€*A”€*A”€*A”€*A”€*A”|*A”{*A”|*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”*A”–*A”*A”Œ*A”‡*A”„*A”…*A”ˆ*A”‰*A”‡*A”„*A”‚*A”‚*A”ƒ*A”‚*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”*A”}*A”}*A”*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”}*A”z*A”y*A”x*A”}*A”€*A”€*A”€*A”€*A”€*A”€*A”x*A”t*A”u*A”|*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”Ÿ*A”™*A”•*A”‘*A”Ž*A”*A”*A”’*A”’*A”*A”‹*A”ˆ*A”ˆ*A”ˆ*A”†*A”ƒ*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”|*A”x*A”x*A”{*A”*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”}*A”€*A”€*A”€*A”€*A”€*A”€*A”*A”z*A”u*A”r*A”s*A”z*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A” *A”œ*A”˜*A”–*A”•*A”–*A”š*A”›*A”š*A”•*A”‘*A”*A”*A”Œ*A”Š*A”…*A”*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”|*A”v*A”v*A”y*A”*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”*A”}*A”x*A”s*A”r*A”w*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”¢*A”ž*A”›*A”™*A”™*A”›*A”Ÿ*A” *A”ž*A”™*A”–*A””*A”‘*A”*A”*A”ˆ*A”„*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”*A”|*A”|*A”*A”€*A”*A”|*A”|*A”~*A”€*A”€*A”€*A”€*A”€*A”*A”*A”€*A”€*A”€*A”*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”*A”|*A”v*A”v*A”|*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”£*A” *A”*A”š*A”š*A”œ*A” *A”Ÿ*A”š*A”—*A”—*A”•*A”“*A”“*A”‘*A”‹*A”†*A”‚*A”€*A”€*A”€*A”€*A”€*A”*A”}*A”x*A”u*A”|*A”*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”*A”*A”}*A”|*A”|*A”}*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”*A”}*A”}*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”¤*A”¡*A”ž*A”š*A”š*A”œ*A”*A”™*A”Ž*A”Œ*A”*A”•*A”•*A””*A”“*A”*A”ˆ*A”„*A”*A”€*A”€*A”€*A”€*A”*A”z*A”u*A”t*A”y*A”€*A”€*A”€*A”€*A”€*A”€*A”*A”}*A”~*A”*A”~*A”}*A”x*A”t*A”s*A”t*A”z*A”*A”*A”*A”*A”€*A”|*A”|*A”~*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”¤*A”£*A”¡*A”š*A”™*A”›*A”œ*A”—*A”Œ*A”‰*A”‹*A””*A”–*A”•*A”’*A”*A”‰*A”…*A”‚*A”€*A”€*A”€*A”€*A”}*A”v*A”q*A”q*A”u*A”}*A”€*A”€*A”€*A”€*A”€*A”y*A”x*A”}*A”*A”*A”~*A”y*A”u*A”s*A”r*A”w*A”}*A”~*A”*A”*A”}*A”x*A”w*A”z*A”|*A”*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”¤*A”¤*A”¤*A”—*A”™*A”›*A”™*A”š*A”•*A”“*A””*A”—*A”—*A”•*A”*A”ˆ*A”†*A”‡*A”ƒ*A”€*A”€*A”€*A”€*A”€*A”|*A”u*A”t*A”w*A”}*A”*A”€*A”*A”|*A”y*A”v*A”w*A”|*A”*A”€*A”€*A”}*A”{*A”{*A”}*A”~*A”*A”*A”*A”*A”€*A”z*A”w*A”w*A”v*A”~*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”¤*A”¤*A”“*A”—*A”š*A”›*A”™*A”™*A”›*A”™*A”–*A”•*A”˜*A”—*A”*A”‡*A”ƒ*A”†*A”„*A”€*A”€*A”€*A”€*A”€*A”€*A”~*A”|*A”~*A”|*A”}*A”*A”~*A”y*A”u*A”u*A”|*A”*A”€*A”€*A”€*A”*A”*A”*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”~*A”{*A”y*A”}*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”¤*A”¤*A”¤*A”™*A”›*A”œ*A”š*A”™*A”š*A”—*A”Ž*A”‹*A”*A”—*A””*A”‹*A”…*A”‰*A”†*A”*A”€*A”€*A”€*A”€*A”€*A”€*A”*A”}*A”y*A”x*A”}*A”~*A”z*A”w*A”w*A”}*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”~*A”}*A”}*A”}*A”~*A”~*A”*A”€*A”*A”~*A”*A”*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”¤*A”¢*A”˜*A”•*A”›*A”—*A”›*A”š*A”š*A”—*A”Œ*A”‡*A”‰*A”˜*A”•*A”’*A”Ž*A”*A”ˆ*A”ƒ*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”}*A”v*A”v*A”}*A”€*A”€*A”€*A”€*A”€*A”€*”€*”€*”€*”*”*”*”*”|*”{*”z*A”{*A”{*A”|*A”}*A”€*A”€*A”€*A”€*A”€*A”*A”}*A”*A”€*A”€*A”€*A”€*A”€*A”¤*A” *A”“*A”*A”*A”*A”˜*A”›*A”›*A”*A”Ž*A”‡*A”‡*A”˜*A”–*A”“*A”‘*A”*A”Š*A”†*A”‚*A”~*A”€*A”€*A”€*A”€*A”€*A”*A”z*A”z*A”*A”€*A”€*A”€*A”€*A”€*”*”~”~”|”z”z”z”z”y”w*”w*”x*A”y*A”z*A”|*A”€*A”€*A”€*A”€*A”*A”|*A”x*A”y*A”|*A”*A”€*A”€*A”€*A”¤*A”¢*A”–*A”Œ*A”Š*A”*A”™*A”*A”*A”ž*A”—*A”‘*A”Œ*A”˜*A”–*A””*A”’*A”‘*A”Ž*A”‰*A”}*A”x*A”y*A”{*A”€*A”€*A”€*A”}*A”|*A”|*A”*A”€*A”€*A”€*A”€*”€*”}”z”x”v”t”t”u”u”u”t”t*”u*”v*A”x*A”z*A”}*A”€*A”€*A”€*A”*A”{*A”v*A”u*A”y*A”~*A”€*A”€*A”€*A”¤*A”¤*A”œ*A””*A”“*A”˜*A”ž*A”Ÿ*A”Ÿ*A” *A”œ*A”š*A”˜*A”—*A”–*A””*A”“*A”’*A”*A”‹*A”w*A”s*A”s*A”v*A”*A”*A”}*A”w*A”v*A”v*A”{*A”€*A”€*A”€*A”€*”€”{”v”r”o”m”n”o”p”p”p”q”r*”s*”u*A”w*A”{*A”}*A”~*A”*A”*A”|*A”x*A”x*A”{*A”*A”€*A”€*A”€*A”¤*A”£*A”¢*A”Ÿ*A”*A” *A”¡*A”¡*A”¡*A”¡*A”œ*A”™*A”—*A”–*A”•*A””*A”’*A”‘*A”*A”Œ*A”‚*A”x*A”w*A”z*A”*A”€*A”€*A”~*A”{*A”t*A”u*A”}*A”€*A”€*A”€*”€”y”s”m”i”g”h”j”k”l”m”n”o”p*”r*”t*A”x*A”{*A”|*A”~*A”€*A”€*A”~*A”*A”*A”€*A”€*A”€*A”€*A”¤*A”£*A”£*A”¢*A”¡*A”¢*A”¢*”¡*”¡*” *”œ*”™*A”—*A”–*A”•*A”“*A”’*A”‘*A”*A”*A”Š*A”…*A”‚*A”*A”€*A”€*A”€*A”€*A”€*A”~*A”}*A”*A”€*A”€*”}*”{”v”q”k”g”e”e”e”f”h”j”k”l”n”o*”r*A”v*A”y*A”{*A”~*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”¤*A”£*A”£*A”¢*A”¢*A”¢*”¡*”¡*” *”Ÿ*”›*”™*A”—*A”–*A”•*A””*A”’*A”*A”Ž*A”Œ*A”‰*A”„*A”€*A”~*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”*A”~*”~*”{”x”t”o”k”h”e”b”a”c”e”g”h”i”k”m*”o*A”r*A”u*A”w*A”y*A”z*A”{*A”{*A”~*A”~*A”~*A”}*A”€*A”€*A”¤*A”£*A”¢*A”£*”£*”¢*”¡*” *” *”ž*”›*”™*”—*”–*””*A”“*A”’*A”*A”*A”Š*A”‡*A”‚*A”~*A”~*A”€*”€*”€*”€*”€*”€*”€*”*”}*”|”x”u”r”n”g”c”a”_”^”`”c”e”f”g”h”j*”l*A”o*A”q*A”s*A”t*A”t*A”u*A”v*A”x*A”w*A”t*A”n*A”d*A”V*A”•*A”ž*A”*”¢*”£*”¢*”¡*” *”¤”Ÿ”œ”š”˜”–*”•*”“*A”’*A”*A”Œ*A”ˆ*A”„*A”*A”}*A”~*”€*”€”€”€”€””~2”}”z”x”v”s”p”n”e”a”a”`”_”a”c”d”d”d”e”g*”i*”k*”m*”o*A”o*A”o*A”p*A”o*A”q*A”n*A”h*A”]*A”O*A”D*A”€*A”–*”—*”¤*”£*”¤*”¢*”¤”¢”Ÿ”œ”š”˜”–””*”“*”‘*”*”Š*”†*”*”}*”|*”}*”~””€”€”€”~”|”z”x”v”t”q”o”k”f”c”c”c”b”c”c”c”b”b”c”d”f”h”i*”k*”j*A”i*A”h*A”h*A”h*A”c*A”Z*A”O*A”D*A”>*A”*”“*”“*”£*”£*”¢*”¤”¤”¡”ž”œ”š”˜”–”””“”‘””Š”…”‚””|”|”}”~”€”€””}”{”y”w”u”s”q”m”i”f”d”d”f”d”c”c”b”a”a”a”b”c”d”e”f*”e*”c*A”a*A”_*A”\*A”W*A”O*A”E*A”?*A”<*A”ˆ*”™*”•*”£*”¢*”¢”¤”¤”¡”Ÿ”œ”›”˜”–”””“”‘””Š”†”ƒ”€”}”|”}”~””€””}”{”y”w”u”s”p”l”i”e”c”c”d”d”c”c”a”_”_”^”_”`”a”a”b”`*”]*”Z*A”V*A”R*A”L*A”E*A”?*A”<*A”<*A”¤*”¤*”¤*”£*”¢*”¡”Ÿ”¤”¡”Ÿ””›”™”—”•”“”‘”Ž”Š”‡”„””~”|”}”~””€””}”{”y”w”u”s”p”m”i”e”b”a”b”c”c”b”`”^”]”\”]”^”^”_”^”\”X*”S*”O*A”I*A”C*A”?*A”<*A”<*A”<*A”¤*”¤*”¤*”£*”¢*” ”Ÿ”Ÿ” ”Ÿ”ž”œ”š”˜”–”””’”*”‹*”ˆ*”…*”‚*”*”}*”}*”~*” *”€””}”{”y”w”u”s”p”n”j”f”b”`”a”b”b”a”_”]”[”Z”[*”\*”] *”]”[”X”S”N*”I*”C*A”>*A”<*A”<*A”<*A”<*A”¤*”¤*”¤*”£*”£*”¡” ””›”˜”–”“”‘”””Œ”‹*”Š*”Š*A”‰*A”†*A”ƒ*A”€*A”~*A”}*A”~*A”*”€ *””}”|”z”x”v”t”r”p”n”i”d”a”a”a”a”`”^”\”Z”Y”Z*”Z*”Z*”Z *”W”T”M”H”C*”>*”<*A”<*A”<*A”<*A”<*A”¤*”¤*”¤*”£*”£*”£”¢”œ”—”“””Œ”‰”‡”…”„”ƒ*”„*”…*A”†*A”‡*A”„*A”*A”*A”~*A”~*A”*A”€*” *”~2”}”{”y”x”v”t”r”p”n”h”e”c”a”a”a”^”[”Z”Y”X*”W*”V*”V*”S *”O”H”C”>”<*”<*”<*A”<*A”<*A”<*A”¤*”¤*”¤*”¤*”¤*”£”£”›”””Ž”‰”…”””}”|”|*”}*”*”‚*A”ˆ*A”…*A”‚*A”€*A”~*A”~*A”*A”€*A”€*”*”*”}*”|*”{*”y *”w”u”s”q”o”i”e”b”`”_”[”Y”Y”X*”V*”T*A”R*A”Q*A”N*”I *”B”>”<”<”<*”<*A”<*A”<*A”<*A”¤*”¤*”¤*”¤*”¤*”¤”£”™””‰”ƒ”~”z”w”u”t”t*”v*”y*”}*A”„*A”ˆ*A”…*A”‚*A”*A”~*A”*A”€*A”€*A”€*A”€*A”€*A”€*A”*A”|*”z *”y”v”t”q”l”h”c”`”\”Y”W”W*”V*”S*A”P*A”M*A”K*A”F*A”A*”= *”<”<”<”<*”<*A”<*A”<*A”<*A”¤*”¤*”¤*”¤*”¤*”¤ *”¤”—”Œ”ƒ”|”v”r”o”m”l*”l*”n*”r*”w*A”}*A”ƒ*A”†*A”ƒ*A”*A”*A”*A”*A”€*A”€*A”€*A”€*A”€*A”*A”}*A”|*”z *”x”v”r”m”g”b”]”Z”V”T*”S*”R*A”O*A”K*A”H*A”D*A”@*A”=*A”<*”<”<”<”<*”<*A”<*A”<*A”<*A”¤*”¤*”¤*”¤*”¤*”¤*”¤ *”•”ˆ”}”t”m”i”f”d*”c*”d*”f*”k*”q*A”y*A”*A”ˆ*A”…*A”ƒ*A”*A”*A”*A”€*A”€*A”€*A”€*A”€*A”€*A”~*A”}*A”|*”z*”w*”t*”m *”g”`”[”W*”S*”P*”O*A”N*A”I*A”F*A”B*A”>*A”<*A”<*A”<*”<”<”<”<*”<*A”<*A”<*A”<*A”¤*A”¤*”¤*”¤*”¤*”¤*”¤*”’ *”‚”u”k”d”_”\*”Z*”Y*”[*”^*”c*A”j*A”t*A”*A”Š*A”ˆ*A”†*A”„*A”‚*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”*A”*A”~*A”|*A”z*A”x*A”o*”f2”_”X”S*”O*A”L*A”J*A”I*A”D*A”@*A”=*A”<*A”<*A”<*A”<*”<”<”<”<*”<*A”<*A”<*A”<*A”¤*A”¤*A”¤*”¤*”¤*”¤*”¤*”*”z”k”`”Y”T”Q*”O*”O*”Q*”T*A”Z*A”b*A”n*A”}*A”Ž*A”‹*A”‰*A”‡*A”…*A”ƒ*A”*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”*A”~*A”|*A”p*”e2”\”U”O*”J*A”G*A”D*A”A*A”>*A”<*A”<*A”<*A”<*A”<*A”<*”<”<”<”<*”<*A”<*A”<*A”<*A”¤*A”¤*A”¤*A”¤*A”¤*”£*”£*A”†*”o *”^”S”L”G”E”D*”D*”F*A”I*A”O*A”X*A”e*A”y*A”’*A”*A”Ž*A”Œ*A”‰*A”†*A”ƒ*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”~*A”p*”c2”X”Q”K*”F*A”B*A”?*A”=*A”<*A”<*A”<*A”<*A”<*A”<*A”<*”<”<”<”<*”<*A”<*A”<*A”<*A”¤*A”¤*A”£*A”£*A”£*A”¢*A”¢*A”y*A”^*”M *”C”=”9”8”8”8*”:*”=*A”B*A”J*A”X*A”p*A”—*A”•*A””*A”’*A”*A”‹*A”…*A”*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”}*A”o*”^2”S”K”F*”B*A”>*A”<*A”<*A”<*A”<*A”<*A”<*A”<*A”<*A”<*”<”<”<”<*”<*A”<*A”<*A”<*A”¤*A”¤*A”£*A”£*A”¤*A”¤*A”¤*A”`*A”D*A”7*”0 *”,”*”+”,”,”-*”/*”2*A”7*A”A*A”Z*A”*A”œ*A”›*A”š*A”˜*A”“*A”†*A”*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”€*A”}*A”p*”U”J”D”@*”=*A”<*A”<*A”<*A”<*A”<*A”<*A”<*A”<*A”<*A”<*”<”<”<”<*”<*A”<*A”<*A”<****9*****999***9**99*9***9*99******9**9*9*9******9**999********99*9****9*9*9**99****9**99***999*9**9*99****9********99***9* \ No newline at end of file diff --git a/src/public/data/pack/server/maps/m46_150 b/src/public/data/pack/server/maps/m46_150 new file mode 100644 index 00000000..59832da9 Binary files /dev/null and b/src/public/data/pack/server/maps/m46_150 differ diff --git a/src/public/data/pack/server/maps/m46_152 b/src/public/data/pack/server/maps/m46_152 new file mode 100644 index 00000000..38be1570 Binary files /dev/null and b/src/public/data/pack/server/maps/m46_152 differ diff --git a/src/public/data/pack/server/maps/m46_153 b/src/public/data/pack/server/maps/m46_153 new file mode 100644 index 00000000..21451b9a Binary files /dev/null and b/src/public/data/pack/server/maps/m46_153 differ diff --git a/src/public/data/pack/server/maps/m46_154 b/src/public/data/pack/server/maps/m46_154 new file mode 100644 index 00000000..7c58b9a9 Binary files /dev/null and b/src/public/data/pack/server/maps/m46_154 differ diff --git a/src/public/data/pack/server/maps/m46_161 b/src/public/data/pack/server/maps/m46_161 new file mode 100644 index 00000000..f2d8cef5 Binary files /dev/null and b/src/public/data/pack/server/maps/m46_161 differ diff --git a/src/public/data/pack/server/maps/m46_45 b/src/public/data/pack/server/maps/m46_45 new file mode 100644 index 00000000..4d2f9b05 Binary files /dev/null and b/src/public/data/pack/server/maps/m46_45 differ diff --git a/src/public/data/pack/server/maps/m46_46 b/src/public/data/pack/server/maps/m46_46 new file mode 100644 index 00000000..118dd0e2 Binary files /dev/null and b/src/public/data/pack/server/maps/m46_46 differ diff --git a/src/public/data/pack/server/maps/m46_47 b/src/public/data/pack/server/maps/m46_47 new file mode 100644 index 00000000..b9d7e82a Binary files /dev/null and b/src/public/data/pack/server/maps/m46_47 differ diff --git a/src/public/data/pack/server/maps/m46_48 b/src/public/data/pack/server/maps/m46_48 new file mode 100644 index 00000000..ee54afc6 --- /dev/null +++ b/src/public/data/pack/server/maps/m46_48 @@ -0,0 +1 @@ +2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222œ2222222222222222222222222222222222222222222222222222222œ22œ2œ2œ22œ2œ2œ2œ2œ2œ2œ2œ22œ2222222222222222222222222222222222222222222222œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ22222222222222222222222222222222222222222œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ222222222222222222222222222222222222œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ222222222222222222222222222222222œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2222222222222222222222222222222œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ22222222222222222222222222222œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ222222222222222222222222222œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ22222222222222222222222222œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ22222222222222222222222222œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2222222222222222222222222œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ222222222222222222222222œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ222222222222222222222222œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2222222222222222222222222œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ222222222222222222222222œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ222222222222222222222222œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ222222222222222222222222œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ22222222222222222222222œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2222222222222222•22222222œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ222222222222222•2•2•22222222œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2222222222222•2•2•2•2•22222222œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ222222222222•2•2•2•2•2•2222222œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2222222222•2•2•2•2•2•2•22222222œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2222222222•2•2•2•2•2•2•2222222œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2222222222•2•2•2•2•2•2•2•2222222œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ222222222•2•2•2•2•2•2•2•2•2222222œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2222222222•2•2•2•2•2•2•2•22222222œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ22222222222•2•2•2•2•2•2•22222222œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2222222222•2•2•2•2•2•2•2•22222222œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ222222222•2•2•2•2•2•2•2•2•2222222œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ22222222•2•2•2•2•2•2•2•2•2•22222222œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ222222222•2•2•2•2•2•2•2•2•22222222œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2222222222•2•2•2•2•2•2•2•22222222œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ22222222222•2•2•2•2•2•2•2•22222222œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ22222222222•2•2•2•2•2•2•2•2222222œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ22222222222•2•2•2•2•2•2•2•222222œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ222222222•2•2•2•2•2•2•2•2•222222œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2222222222•2•2•2•2•2•2•2•2•222222œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2222222222•2•2•2•2•2•2•2•2•22222œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ22222222222•2•2•2•2•2•2•2•222222œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2222222222•2•2•2•2•2•2•2•2•222222œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ222222222•2•2•2•2•2•2•2•2•222222œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ22222222222•2•2•2•2•2•2•2•2222222œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ222222222•2•2•2•2•2•2•$2•2•2222222œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ222222222•2•2•2•2•2•2• 2••22222222œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ22222222222•2•2•2•$2•2•••222222222œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ222222222222•2•2• 2••••2222222222œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ22222222222•2•2•2• 2••••22222222222œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ22222222222•2•2•2•2•2•2•••22222222222222œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ22œ22œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ2œ222222222222•2•2•2•2•2•#2• 2••22222222222222222œ2œ2œ2œ2œ2222222222œ22œ222œ2œ2œ2œ2œ2œ2œ2œ2œ222222222222•2•2•2•2•2•2•2•*2•222222222222222222222222222222222222œ2œ2œ2œ2œ2œ2œ2œ2œ22222222222•2•2•2•2•2•2•2•2•2•"+"+ \ No newline at end of file diff --git a/src/public/data/pack/server/maps/m46_49 b/src/public/data/pack/server/maps/m46_49 new file mode 100644 index 00000000..0dab91e9 Binary files /dev/null and b/src/public/data/pack/server/maps/m46_49 differ diff --git a/src/public/data/pack/server/maps/m46_50 b/src/public/data/pack/server/maps/m46_50 new file mode 100644 index 00000000..ee252cd4 Binary files /dev/null and b/src/public/data/pack/server/maps/m46_50 differ diff --git a/src/public/data/pack/server/maps/m46_51 b/src/public/data/pack/server/maps/m46_51 new file mode 100644 index 00000000..a05987db Binary files /dev/null and b/src/public/data/pack/server/maps/m46_51 differ diff --git a/src/public/data/pack/server/maps/m46_52 b/src/public/data/pack/server/maps/m46_52 new file mode 100644 index 00000000..1ba2f1c6 Binary files /dev/null and b/src/public/data/pack/server/maps/m46_52 differ diff --git a/src/public/data/pack/server/maps/m46_53 b/src/public/data/pack/server/maps/m46_53 new file mode 100644 index 00000000..3470c469 Binary files /dev/null and b/src/public/data/pack/server/maps/m46_53 differ diff --git a/src/public/data/pack/server/maps/m46_54 b/src/public/data/pack/server/maps/m46_54 new file mode 100644 index 00000000..74f0082b Binary files /dev/null and b/src/public/data/pack/server/maps/m46_54 differ diff --git a/src/public/data/pack/server/maps/m46_55 b/src/public/data/pack/server/maps/m46_55 new file mode 100644 index 00000000..38836b79 Binary files /dev/null and b/src/public/data/pack/server/maps/m46_55 differ diff --git a/src/public/data/pack/server/maps/m46_56 b/src/public/data/pack/server/maps/m46_56 new file mode 100644 index 00000000..f34883a8 Binary files /dev/null and b/src/public/data/pack/server/maps/m46_56 differ diff --git a/src/public/data/pack/server/maps/m46_57 b/src/public/data/pack/server/maps/m46_57 new file mode 100644 index 00000000..1e46c1fa Binary files /dev/null and b/src/public/data/pack/server/maps/m46_57 differ diff --git a/src/public/data/pack/server/maps/m46_58 b/src/public/data/pack/server/maps/m46_58 new file mode 100644 index 00000000..c5522039 Binary files /dev/null and b/src/public/data/pack/server/maps/m46_58 differ diff --git a/src/public/data/pack/server/maps/m46_59 b/src/public/data/pack/server/maps/m46_59 new file mode 100644 index 00000000..e135793c Binary files /dev/null and b/src/public/data/pack/server/maps/m46_59 differ diff --git a/src/public/data/pack/server/maps/m46_60 b/src/public/data/pack/server/maps/m46_60 new file mode 100644 index 00000000..a697ef19 Binary files /dev/null and b/src/public/data/pack/server/maps/m46_60 differ diff --git a/src/public/data/pack/server/maps/m46_61 b/src/public/data/pack/server/maps/m46_61 new file mode 100644 index 00000000..b56753d8 Binary files /dev/null and b/src/public/data/pack/server/maps/m46_61 differ diff --git a/src/public/data/pack/server/maps/m46_62 b/src/public/data/pack/server/maps/m46_62 new file mode 100644 index 00000000..55c284b6 --- /dev/null +++ b/src/public/data/pack/server/maps/m46_62 @@ -0,0 +1 @@ +2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222 \ No newline at end of file diff --git a/src/public/data/pack/server/maps/m46_75 b/src/public/data/pack/server/maps/m46_75 new file mode 100644 index 00000000..742b83c5 Binary files /dev/null and b/src/public/data/pack/server/maps/m46_75 differ diff --git a/src/public/data/pack/server/maps/m47_148 b/src/public/data/pack/server/maps/m47_148 new file mode 100644 index 00000000..ca72734a Binary files /dev/null and b/src/public/data/pack/server/maps/m47_148 differ diff --git a/src/public/data/pack/server/maps/m47_149 b/src/public/data/pack/server/maps/m47_149 new file mode 100644 index 00000000..11a328e2 Binary files /dev/null and b/src/public/data/pack/server/maps/m47_149 differ diff --git a/src/public/data/pack/server/maps/m47_150 b/src/public/data/pack/server/maps/m47_150 new file mode 100644 index 00000000..9934a731 --- /dev/null +++ b/src/public/data/pack/server/maps/m47_150 @@ -0,0 +1 @@ +*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*‹*‹*‹*‹*‹5555555555*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*‹*‹*‹*‹*‹5555555555*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*‹*‹*‹*‹*‹5555555555*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*‹*‹*‹*‹*‹5555555555*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*‹*‹*‹*‹*‹5555555555*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*‹*‹*‹*‹*‹5555555555*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*‹*‹*‹*‹*‹5555555555*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*‹*‹*‹*‹*‹5555555555*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*‹*‹*‹*‹*‹5555555555*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*‹*‹*‹*‹*‹5555555555*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*‹*‹*‹*‹*‹5555555555*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*‹*‹*‹*‹*‹5555555555*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*‹*‹*‹*‹*‹5555555555*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*‹*‹*‹*‹*‹5555555555*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*‹*‹*‹*‹*‹5555555555*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*‹*‹*‹*‹*‹5555555555*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*‹*‹*‹*‹*‹5555555555*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*‹*‹*‹*‹*‹5555555555*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*‹*‹*‹*‹*‹5555555555*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*‹*‹*‹*‹*‹5555555555*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*‹*‹*‹*‹*‹5555555555*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*‹*‹*‹*‹*‹5555555555*‹*‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*‹*‹*‹*‹*‹5555555555‹*‹*‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*‹*‹*‹*‹*‹5555555555‹‹*‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*‹*‹*‹*‹*‹5555555555‹‹*‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*‹*‹*‹*‹*‹5555555555‹‹*‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*‹*‹*‹*‹*‹5555555555‹*‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*‹*‹*‹*‹*‹5555555555*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*‹*‹*‹*‹*‹5555555555*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*‹*‹*‹*‹*‹5555555555*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*‹*‹*‹*‹*‹5555555555*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*‹*‹*‹*‹*‹5555555555*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*‹*‹*‹*‹*‹5555555555*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*‹*‹*‹*‹*‹5555555555*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*‹*‹*‹*‹*‹5555555555*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*‹*‹*‹*‹*‹5555555555*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*‹*‹*‹*‹*‹5555555555*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*‹*‹*‹*‹*‹5555555555*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*‹*‹*‹*‹*‹5555555555*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*‹*‹*‹*‹*‹5555555555*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*‹*‹*‹*‹*‹5555555555*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*‹*‹*‹*‹*‹5555555555*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*‹*‹*‹*‹*‹5555555555*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*‹*‹*‹*‹*‹5555555555*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*‹*‹*‹*‹*‹5555555555*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*‹*‹*‹*‹*‹5555555555*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*‹*‹*‹*‹*‹5555555555*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*‹*‹*‹*‹*‹5555555555*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*‹*‹*‹*‹*‹5555555555*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*‹*‹*‹*‹*‹5555555555*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*‹*‹*‹*‹*‹5555555555*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*‹*‹*‹*‹*‹5555555555*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*‹*‹*‹*‹*‹5555555555*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*‹*‹*‹*‹*‹5555555555*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*‹*‹*‹*‹*‹5555555555*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*‹*‹*‹*‹*‹5555555555*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*‹*‹*‹*‹*‹5555555555*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*‹*‹*‹*‹*‹5555555555*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*‹*‹*‹*‹*‹5555555555*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*‹*‹*‹*‹*‹5555555555*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*‹*‹*‹*‹*‹5555555555*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*‹*‹*‹*‹*‹5555555555*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*‹*‹*‹*‹*‹5555555555*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*A‹*‹*‹*‹*‹*‹5555555555666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666566666666666666666666666666666666666666666566666666666666666666666666666666666666666566666666666666666666666666666666666666666566666666666666666666666666666666666666666566666666666666666666666666666666666666666566666666666666666666666666666666666666666566666666666666666666666666666666666666666566666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666566666666666666666666666666666666666666666566666666666666666666666666666666666666666566666666666666666666666666666666666666666566666666666666666666666666666666666666666566666666666666666666666666666666666666666566666666666666666666666666666666666666666566666666666666666666666666666666666666666566666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666566666666666666666666666666666666666666666566666666666666666666666666666666666666666566666666666666666666666666666666666666666566666666666666666666666666666666666666666566666666666666666666666666666666666666666566666666666666666666666666666666666666666566666666666666666666666666666666666666666566666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666 \ No newline at end of file diff --git a/src/public/data/pack/server/maps/m47_152 b/src/public/data/pack/server/maps/m47_152 new file mode 100644 index 00000000..da8c8afe Binary files /dev/null and b/src/public/data/pack/server/maps/m47_152 differ diff --git a/src/public/data/pack/server/maps/m47_153 b/src/public/data/pack/server/maps/m47_153 new file mode 100644 index 00000000..d4d8400f Binary files /dev/null and b/src/public/data/pack/server/maps/m47_153 differ diff --git a/src/public/data/pack/server/maps/m47_160 b/src/public/data/pack/server/maps/m47_160 new file mode 100644 index 00000000..2ca7c583 Binary files /dev/null and b/src/public/data/pack/server/maps/m47_160 differ diff --git a/src/public/data/pack/server/maps/m47_161 b/src/public/data/pack/server/maps/m47_161 new file mode 100644 index 00000000..8b2474b4 Binary files /dev/null and b/src/public/data/pack/server/maps/m47_161 differ diff --git a/src/public/data/pack/server/maps/m47_47 b/src/public/data/pack/server/maps/m47_47 new file mode 100644 index 00000000..5484aa96 --- /dev/null +++ b/src/public/data/pack/server/maps/m47_47 @@ -0,0 +1,5 @@ +2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222)2ƒƒƒ&2ƒ2ƒ222222222222222222222222222222222222222222222222222222222ƒƒƒƒƒƒƒ2ƒ2ƒ222222222222222222222222222222222222222222222222222222ƒƒƒƒƒƒƒƒƒ2ƒ2ƒ2ƒ2ƒ222222222222222222222222222222222222222222222222222ƒƒƒƒƒƒƒƒƒƒƒƒ2ƒ2ƒ2ƒ2222222222222222222222222222222222222222222222222ƒƒƒƒƒƒƒƒƒƒƒ +2ƒ2ƒ2ƒ222222222222222222222222222222222222222222222222ƒƒƒƒƒƒƒƒ&2ƒ2222222222222222222222222222222222222222222222ƒ2ƒƒƒ*ƒƒƒ 2ƒ22222222222222222222222222222222222222222222222ƒƒƒ*ƒ#ƒƒ2ƒ2ƒ2222222222222222222222222222222222222222222222ƒ2ƒƒƒƒƒ"ƒƒ2ƒ2ƒ2222222222222222222222222222222222222222222222ƒ2ƒƒƒƒƒƒƒƒƒƒƒ'2ƒ2ƒ2222222222222222222222222222222222222222222222ƒ2ƒƒƒƒƒƒƒ2ƒ2ƒ2ƒ2ƒ22ƒ2ƒ2222222222222222222222222222222222222222222222ƒ2ƒ 2ƒƒƒƒƒƒ-2ƒ2222222222222222222222222222222222222222222222222222ƒ2ƒ+2ƒƒƒƒƒƒ2ƒ222222ƒ2ƒ2ƒ22222222222222222222222222222222222222222222ƒ)2ƒƒƒƒƒƒ 2ƒ2ƒ2222ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ22222222222222222222222222222222222222222ƒ2ƒƒƒ"ƒƒƒƒ2ƒ"22222ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ22222222222222222222222222222222222222222ƒ2ƒƒƒƒ"ƒƒ2ƒ2ƒ2ƒ2222ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ22222222222222222222222222222222222222222ƒ2ƒƒƒƒƒ-2ƒ2ƒ2ƒ2ƒ2222ƒ2ƒ2ƒ2ƒ2ƒ2ƒƒ +2ƒ2ƒ2ƒ2ƒ22222222222222222222222222222222222222222ƒ2ƒ2ƒƒƒ'2ƒ2ƒ2ƒ2ƒ2222ƒ2ƒ2ƒ2ƒ2ƒƒ222ƒ2ƒ2ƒ2ƒ222222222222222222222222222222222222222222ƒ#2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ222ƒ2ƒ2ƒ2ƒ2ƒ2ƒ22ƒ2ƒ2ƒ2222222222222222222222222222222222222222222ƒ2ƒ2ƒ2ƒ2ƒ2ƒ222ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒƒ22222222222222222222222222222222222222222222ƒ2ƒ2ƒ22222ƒ2ƒ2ƒ2ƒ 2ƒ2ƒ222222222222222222222222222222222222222222222222222ƒ2ƒ2ƒ)2ƒ2ƒ2ƒƒƒƒ2222222222222222222222222222222222222222222222222222ƒ2ƒ2ƒ2ƒƒ-ƒƒƒƒ ƒ2222222222222222222222222222222222222222222222222222ƒ2ƒ2ƒ2ƒ2ƒƒ" ƒ$ƒƒƒƒ22222222222222222222222222222222222222222222222222222ƒ#2ƒ 2ƒ2ƒ 2ƒƒ"ƒƒ ƒƒ +22222222222222222222222222222222222222222222222222222ƒ2ƒ2ƒ*2ƒ2ƒ2ƒƒ-9999*99999999999999#9 9999999 9 99999999 9999999*999&99999 99999'999999999999+999999 +99999999)9'9999999-999999$99 99999999999999999(999)99999 9999+9999999 9999999999 99999-9999999 9999 9&99 9 \ No newline at end of file diff --git a/src/public/data/pack/server/maps/m47_48 b/src/public/data/pack/server/maps/m47_48 new file mode 100644 index 00000000..882d67f3 --- /dev/null +++ b/src/public/data/pack/server/maps/m47_48 @@ -0,0 +1,22 @@ +222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222ƒ2ƒ22222222222222222222222222222222222222222222222222222222222)2ƒƒƒƒ +2ƒ2ƒ2222222222222222222222222222222222222222222222222222222222ƒ(2ƒƒƒƒƒƒ2ƒ222222222222222222222222222222222222222222222222222222222ƒ2ƒ*2ƒƒƒƒƒ2ƒ%2222222222222222222222222222222222222222222222222222ƒ2ƒ2ƒ2ƒ22ƒ2ƒ+2ƒƒƒƒƒƒ222222222222222222222222222222222222222222222222222ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2)2ƒƒƒƒƒƒ222222222222222222222222222222222222222222222222222ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ(2ƒƒƒƒƒ2ƒ2222222222222222222222222222222222222222222222ƒ2ƒƒ22ƒ2ƒ)2ƒƒƒ&2ƒ2ƒ2ƒ2ƒ 2ƒƒ'2ƒ2222222222222222222222222222222222222222222222ƒƒƒƒ2ƒ2ƒ2ƒ(2ƒƒƒƒƒƒ2ƒ2ƒ2222222222222222222222222222222222222222222222222ƒƒƒƒƒ2ƒ2ƒ 2ƒƒƒƒ'2ƒ2ƒ22222222ƒ2222222222222222222222222222222222ƒ2ƒ2ƒ2ƒ2222+2ƒƒƒƒ'222ƒ2ƒ2ƒ2ƒ2ƒ2ƒ222222)2ƒƒƒ,2222)2ƒƒ&2222222222222222222222222ƒ2ƒ2ƒ2ƒ2ƒ2ƒ22)2ƒƒƒƒƒ222222ƒ2ƒ2ƒ2ƒ2ƒ22222ƒƒƒƒƒ +222ƒƒƒƒ22222222222222222222222ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2(2ƒƒƒ 22222ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ222(2ƒƒƒƒƒƒƒƒƒ2222222222222222222222ƒ2ƒƒƒƒ2ƒ2ƒ2ƒ2ƒ2ƒ22 22"2222ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ222*2ƒƒƒƒƒƒƒƒƒ222222222222222222222ƒ2ƒƒƒ +2%2ƒ2ƒ2222222222ƒ2ƒ2ƒƒ222ƒ2ƒ2ƒ2ƒ2222 2ƒƒƒƒƒƒƒƒ'22222222222222222222222ƒƒƒ2ƒ2ƒ2ƒ2222222ƒ$2ƒ2ƒ2ƒƒ22ƒ +2ƒ%2ƒ2ƒ2ƒ2222(2ƒƒƒƒƒ 22222222222222%22222222222ƒƒƒƒƒƒ2ƒ2ƒ222222ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2222222 2ƒƒ2"22222222222)2ƒ2ƒ22ƒ22222222ƒƒƒƒƒƒ 2ƒ2ƒ2222222ƒ2ƒ2ƒ22ƒ2ƒ2ƒ222222222222222222222ƒƒƒƒ +2ƒ2ƒ22222ƒ22(2ƒƒƒƒƒ2ƒ2222222ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ222222222222222222222ƒƒƒƒƒ22222ƒ2ƒ2ƒ2222ƒ2ƒ222222222ƒ2ƒ2ƒ-ƒƒƒ*ƒ2ƒ2ƒ2ƒ22222222222222222222ƒƒƒƒƒƒ22222ƒ2ƒ2ƒ2ƒ2ƒ222222222ƒ2ƒ2ƒ2ƒ2ƒ2ƒƒ)ƒ&ƒƒƒ2ƒ2ƒ2ƒ2ƒ222222ƒ22ƒ2ƒ22222222222ƒƒƒƒƒƒ22222ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ222222ƒ2ƒ2ƒ2ƒ2ƒƒƒƒƒƒƒƒƒ2ƒ,2ƒ2ƒ2ƒ2222ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ222222ƒƒƒ ƒ +ƒ222222ƒ2ƒ2ƒ2ƒ2ƒ +2ƒ2ƒ2ƒ2ƒ222ƒ2ƒ2ƒ2ƒ2ƒ$ƒƒƒƒƒƒƒƒ2ƒ2ƒ2ƒ +2ƒ%2ƒ2ƒ$2ƒ2ƒ2ƒ +2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ +2ƒ2ƒ2ƒ2ƒ2222ƒƒƒ 2ƒ222222ƒƒƒƒ2ƒ2ƒ2ƒ,2ƒ2ƒ2ƒ2ƒ+2ƒ2ƒ2ƒ2ƒ   ƒƒƒ!*ƒ ƒƒƒƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ22ƒ2ƒ2ƒ2ƒ2ƒ2ƒ +2ƒ%2ƒ2ƒ222ƒƒ2ƒ222222ƒƒƒƒƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒƒƒ)ƒ1&ƒ.ƒ,ƒƒƒƒƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2222ƒ2ƒ%2ƒ2ƒ2ƒ2 2ƒ2222222ƒƒƒƒƒƒƒƒƒƒƒƒƒƒ ƒ ƒ11."ƒ#ƒ ƒƒƒƒƒ22ƒ2ƒ2ƒ2ƒ2ƒ2(2'2222ƒ2ƒ2ƒ2ƒ2ƒƒƒƒƒƒƒƒƒƒƒƒƒ111,ƒƒ ƒƒƒƒƒƒƒ ƒƒ 2&2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒƒƒƒ!ƒƒ ƒƒƒ(11'11ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ ƒ%22ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒƒƒƒƒƒƒƒƒ,111+1&ƒ#ƒƒƒƒƒƒƒƒƒƒƒƒƒ +ƒƒƒƒƒ%22 +2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ2ƒƒ&ƒƒƒƒƒ ƒ,ƒƒƒƒƒƒƒƒƒ&ƒƒƒ2222ƒ2222ƒ2ƒ2ƒ99 9-99999 9,999999&999#9!9'999 9-99999999 9,999999999-9)9&9*9 +999+99999#9 9,9(9999999999 9'9+999 9'999999+9 +999-9999(9-999*9-999(9999999999999&99999 9,999999999 9,99 99999999-9999 9 +9999999999 9&999 999 9 999999!999&99 9 +99999(999+999999 999999!9,99999$9999!999999"999999 +99999-999#9 999 9'999 999)9 99999999 9,999999 99999999999999 +999999"99999999999 99999999 99999 9999 99"999(9999999999999 999999999!9 9999999999 9999$99 +999(9'9999,999#99"999999999999!999(99999999999 +9999999999#9!9999 9999,9+99*999 99 999999999999999999&999999999 \ No newline at end of file diff --git a/src/public/data/pack/server/maps/m47_49 b/src/public/data/pack/server/maps/m47_49 new file mode 100644 index 00000000..6d29d805 Binary files /dev/null and b/src/public/data/pack/server/maps/m47_49 differ diff --git a/src/public/data/pack/server/maps/m47_50 b/src/public/data/pack/server/maps/m47_50 new file mode 100644 index 00000000..57ea949b Binary files /dev/null and b/src/public/data/pack/server/maps/m47_50 differ diff --git a/src/public/data/pack/server/maps/m47_51 b/src/public/data/pack/server/maps/m47_51 new file mode 100644 index 00000000..5763814c Binary files /dev/null and b/src/public/data/pack/server/maps/m47_51 differ diff --git a/src/public/data/pack/server/maps/m47_52 b/src/public/data/pack/server/maps/m47_52 new file mode 100644 index 00000000..5da86359 Binary files /dev/null and b/src/public/data/pack/server/maps/m47_52 differ diff --git a/src/public/data/pack/server/maps/m47_53 b/src/public/data/pack/server/maps/m47_53 new file mode 100644 index 00000000..196a3a4a Binary files /dev/null and b/src/public/data/pack/server/maps/m47_53 differ diff --git a/src/public/data/pack/server/maps/m47_54 b/src/public/data/pack/server/maps/m47_54 new file mode 100644 index 00000000..f4994fa4 Binary files /dev/null and b/src/public/data/pack/server/maps/m47_54 differ diff --git a/src/public/data/pack/server/maps/m47_55 b/src/public/data/pack/server/maps/m47_55 new file mode 100644 index 00000000..1838897c Binary files /dev/null and b/src/public/data/pack/server/maps/m47_55 differ diff --git a/src/public/data/pack/server/maps/m47_56 b/src/public/data/pack/server/maps/m47_56 new file mode 100644 index 00000000..ae7726a0 Binary files /dev/null and b/src/public/data/pack/server/maps/m47_56 differ diff --git a/src/public/data/pack/server/maps/m47_57 b/src/public/data/pack/server/maps/m47_57 new file mode 100644 index 00000000..14d42b3b Binary files /dev/null and b/src/public/data/pack/server/maps/m47_57 differ diff --git a/src/public/data/pack/server/maps/m47_58 b/src/public/data/pack/server/maps/m47_58 new file mode 100644 index 00000000..1492fbbc Binary files /dev/null and b/src/public/data/pack/server/maps/m47_58 differ diff --git a/src/public/data/pack/server/maps/m47_59 b/src/public/data/pack/server/maps/m47_59 new file mode 100644 index 00000000..53d9e858 Binary files /dev/null and b/src/public/data/pack/server/maps/m47_59 differ diff --git a/src/public/data/pack/server/maps/m47_60 b/src/public/data/pack/server/maps/m47_60 new file mode 100644 index 00000000..b1cac53d Binary files /dev/null and b/src/public/data/pack/server/maps/m47_60 differ diff --git a/src/public/data/pack/server/maps/m47_61 b/src/public/data/pack/server/maps/m47_61 new file mode 100644 index 00000000..e6ce0718 Binary files /dev/null and b/src/public/data/pack/server/maps/m47_61 differ diff --git a/src/public/data/pack/server/maps/m47_62 b/src/public/data/pack/server/maps/m47_62 new file mode 100644 index 00000000..55c284b6 --- /dev/null +++ b/src/public/data/pack/server/maps/m47_62 @@ -0,0 +1 @@ +2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222 \ No newline at end of file diff --git a/src/public/data/pack/server/maps/m47_75 b/src/public/data/pack/server/maps/m47_75 new file mode 100644 index 00000000..a19a70a5 Binary files /dev/null and b/src/public/data/pack/server/maps/m47_75 differ diff --git a/src/public/data/pack/server/maps/m48_148 b/src/public/data/pack/server/maps/m48_148 new file mode 100644 index 00000000..52b086ec Binary files /dev/null and b/src/public/data/pack/server/maps/m48_148 differ diff --git a/src/public/data/pack/server/maps/m48_149 b/src/public/data/pack/server/maps/m48_149 new file mode 100644 index 00000000..2e938737 Binary files /dev/null and b/src/public/data/pack/server/maps/m48_149 differ diff --git a/src/public/data/pack/server/maps/m48_152 b/src/public/data/pack/server/maps/m48_152 new file mode 100644 index 00000000..9ddd001e Binary files /dev/null and b/src/public/data/pack/server/maps/m48_152 differ diff --git a/src/public/data/pack/server/maps/m48_153 b/src/public/data/pack/server/maps/m48_153 new file mode 100644 index 00000000..88a24a88 Binary files /dev/null and b/src/public/data/pack/server/maps/m48_153 differ diff --git a/src/public/data/pack/server/maps/m48_154 b/src/public/data/pack/server/maps/m48_154 new file mode 100644 index 00000000..5c218c99 Binary files /dev/null and b/src/public/data/pack/server/maps/m48_154 differ diff --git a/src/public/data/pack/server/maps/m48_155 b/src/public/data/pack/server/maps/m48_155 new file mode 100644 index 00000000..6f2dd6cb Binary files /dev/null and b/src/public/data/pack/server/maps/m48_155 differ diff --git a/src/public/data/pack/server/maps/m48_156 b/src/public/data/pack/server/maps/m48_156 new file mode 100644 index 00000000..796d736f Binary files /dev/null and b/src/public/data/pack/server/maps/m48_156 differ diff --git a/src/public/data/pack/server/maps/m48_47 b/src/public/data/pack/server/maps/m48_47 new file mode 100644 index 00000000..590a1db3 Binary files /dev/null and b/src/public/data/pack/server/maps/m48_47 differ diff --git a/src/public/data/pack/server/maps/m48_48 b/src/public/data/pack/server/maps/m48_48 new file mode 100644 index 00000000..8a6e2fe3 Binary files /dev/null and b/src/public/data/pack/server/maps/m48_48 differ diff --git a/src/public/data/pack/server/maps/m48_49 b/src/public/data/pack/server/maps/m48_49 new file mode 100644 index 00000000..c2a1ed4a Binary files /dev/null and b/src/public/data/pack/server/maps/m48_49 differ diff --git a/src/public/data/pack/server/maps/m48_50 b/src/public/data/pack/server/maps/m48_50 new file mode 100644 index 00000000..50f1942b Binary files /dev/null and b/src/public/data/pack/server/maps/m48_50 differ diff --git a/src/public/data/pack/server/maps/m48_51 b/src/public/data/pack/server/maps/m48_51 new file mode 100644 index 00000000..fde04aba Binary files /dev/null and b/src/public/data/pack/server/maps/m48_51 differ diff --git a/src/public/data/pack/server/maps/m48_52 b/src/public/data/pack/server/maps/m48_52 new file mode 100644 index 00000000..1ff37eb9 Binary files /dev/null and b/src/public/data/pack/server/maps/m48_52 differ diff --git a/src/public/data/pack/server/maps/m48_53 b/src/public/data/pack/server/maps/m48_53 new file mode 100644 index 00000000..689401e4 Binary files /dev/null and b/src/public/data/pack/server/maps/m48_53 differ diff --git a/src/public/data/pack/server/maps/m48_54 b/src/public/data/pack/server/maps/m48_54 new file mode 100644 index 00000000..77d7a4e6 Binary files /dev/null and b/src/public/data/pack/server/maps/m48_54 differ diff --git a/src/public/data/pack/server/maps/m48_55 b/src/public/data/pack/server/maps/m48_55 new file mode 100644 index 00000000..9affa226 Binary files /dev/null and b/src/public/data/pack/server/maps/m48_55 differ diff --git a/src/public/data/pack/server/maps/m48_56 b/src/public/data/pack/server/maps/m48_56 new file mode 100644 index 00000000..29594572 Binary files /dev/null and b/src/public/data/pack/server/maps/m48_56 differ diff --git a/src/public/data/pack/server/maps/m48_57 b/src/public/data/pack/server/maps/m48_57 new file mode 100644 index 00000000..27ba127d Binary files /dev/null and b/src/public/data/pack/server/maps/m48_57 differ diff --git a/src/public/data/pack/server/maps/m48_58 b/src/public/data/pack/server/maps/m48_58 new file mode 100644 index 00000000..cbcba40c Binary files /dev/null and b/src/public/data/pack/server/maps/m48_58 differ diff --git a/src/public/data/pack/server/maps/m48_59 b/src/public/data/pack/server/maps/m48_59 new file mode 100644 index 00000000..9ad81ad2 Binary files /dev/null and b/src/public/data/pack/server/maps/m48_59 differ diff --git a/src/public/data/pack/server/maps/m48_60 b/src/public/data/pack/server/maps/m48_60 new file mode 100644 index 00000000..5ccb9a49 Binary files /dev/null and b/src/public/data/pack/server/maps/m48_60 differ diff --git a/src/public/data/pack/server/maps/m48_61 b/src/public/data/pack/server/maps/m48_61 new file mode 100644 index 00000000..ad4a88f7 Binary files /dev/null and b/src/public/data/pack/server/maps/m48_61 differ diff --git a/src/public/data/pack/server/maps/m48_62 b/src/public/data/pack/server/maps/m48_62 new file mode 100644 index 00000000..55c284b6 --- /dev/null +++ b/src/public/data/pack/server/maps/m48_62 @@ -0,0 +1 @@ +2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222 \ No newline at end of file diff --git a/src/public/data/pack/server/maps/m49_148 b/src/public/data/pack/server/maps/m49_148 new file mode 100644 index 00000000..bb0bd28e Binary files /dev/null and b/src/public/data/pack/server/maps/m49_148 differ diff --git a/src/public/data/pack/server/maps/m49_149 b/src/public/data/pack/server/maps/m49_149 new file mode 100644 index 00000000..e3596658 Binary files /dev/null and b/src/public/data/pack/server/maps/m49_149 differ diff --git a/src/public/data/pack/server/maps/m49_153 b/src/public/data/pack/server/maps/m49_153 new file mode 100644 index 00000000..2f720cae Binary files /dev/null and b/src/public/data/pack/server/maps/m49_153 differ diff --git a/src/public/data/pack/server/maps/m49_154 b/src/public/data/pack/server/maps/m49_154 new file mode 100644 index 00000000..3bf20a12 Binary files /dev/null and b/src/public/data/pack/server/maps/m49_154 differ diff --git a/src/public/data/pack/server/maps/m49_155 b/src/public/data/pack/server/maps/m49_155 new file mode 100644 index 00000000..d6b198f0 Binary files /dev/null and b/src/public/data/pack/server/maps/m49_155 differ diff --git a/src/public/data/pack/server/maps/m49_156 b/src/public/data/pack/server/maps/m49_156 new file mode 100644 index 00000000..2f9c57b9 Binary files /dev/null and b/src/public/data/pack/server/maps/m49_156 differ diff --git a/src/public/data/pack/server/maps/m49_46 b/src/public/data/pack/server/maps/m49_46 new file mode 100644 index 00000000..3e078724 Binary files /dev/null and b/src/public/data/pack/server/maps/m49_46 differ diff --git a/src/public/data/pack/server/maps/m49_47 b/src/public/data/pack/server/maps/m49_47 new file mode 100644 index 00000000..af29645c Binary files /dev/null and b/src/public/data/pack/server/maps/m49_47 differ diff --git a/src/public/data/pack/server/maps/m49_48 b/src/public/data/pack/server/maps/m49_48 new file mode 100644 index 00000000..21b5d3a5 Binary files /dev/null and b/src/public/data/pack/server/maps/m49_48 differ diff --git a/src/public/data/pack/server/maps/m49_49 b/src/public/data/pack/server/maps/m49_49 new file mode 100644 index 00000000..0907b81b Binary files /dev/null and b/src/public/data/pack/server/maps/m49_49 differ diff --git a/src/public/data/pack/server/maps/m49_50 b/src/public/data/pack/server/maps/m49_50 new file mode 100644 index 00000000..f2f550e4 Binary files /dev/null and b/src/public/data/pack/server/maps/m49_50 differ diff --git a/src/public/data/pack/server/maps/m49_51 b/src/public/data/pack/server/maps/m49_51 new file mode 100644 index 00000000..465a8c4b Binary files /dev/null and b/src/public/data/pack/server/maps/m49_51 differ diff --git a/src/public/data/pack/server/maps/m49_52 b/src/public/data/pack/server/maps/m49_52 new file mode 100644 index 00000000..46ea64d6 Binary files /dev/null and b/src/public/data/pack/server/maps/m49_52 differ diff --git a/src/public/data/pack/server/maps/m49_53 b/src/public/data/pack/server/maps/m49_53 new file mode 100644 index 00000000..15f4e32e Binary files /dev/null and b/src/public/data/pack/server/maps/m49_53 differ diff --git a/src/public/data/pack/server/maps/m49_54 b/src/public/data/pack/server/maps/m49_54 new file mode 100644 index 00000000..7ea0f224 Binary files /dev/null and b/src/public/data/pack/server/maps/m49_54 differ diff --git a/src/public/data/pack/server/maps/m49_55 b/src/public/data/pack/server/maps/m49_55 new file mode 100644 index 00000000..893d8854 Binary files /dev/null and b/src/public/data/pack/server/maps/m49_55 differ diff --git a/src/public/data/pack/server/maps/m49_56 b/src/public/data/pack/server/maps/m49_56 new file mode 100644 index 00000000..b3d22564 Binary files /dev/null and b/src/public/data/pack/server/maps/m49_56 differ diff --git a/src/public/data/pack/server/maps/m49_57 b/src/public/data/pack/server/maps/m49_57 new file mode 100644 index 00000000..56866cfe Binary files /dev/null and b/src/public/data/pack/server/maps/m49_57 differ diff --git a/src/public/data/pack/server/maps/m49_58 b/src/public/data/pack/server/maps/m49_58 new file mode 100644 index 00000000..8d204be6 Binary files /dev/null and b/src/public/data/pack/server/maps/m49_58 differ diff --git a/src/public/data/pack/server/maps/m49_59 b/src/public/data/pack/server/maps/m49_59 new file mode 100644 index 00000000..a693cbc4 Binary files /dev/null and b/src/public/data/pack/server/maps/m49_59 differ diff --git a/src/public/data/pack/server/maps/m49_60 b/src/public/data/pack/server/maps/m49_60 new file mode 100644 index 00000000..324847c4 Binary files /dev/null and b/src/public/data/pack/server/maps/m49_60 differ diff --git a/src/public/data/pack/server/maps/m49_61 b/src/public/data/pack/server/maps/m49_61 new file mode 100644 index 00000000..04f3e0e1 Binary files /dev/null and b/src/public/data/pack/server/maps/m49_61 differ diff --git a/src/public/data/pack/server/maps/m49_62 b/src/public/data/pack/server/maps/m49_62 new file mode 100644 index 00000000..55c284b6 --- /dev/null +++ b/src/public/data/pack/server/maps/m49_62 @@ -0,0 +1 @@ +2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222 \ No newline at end of file diff --git a/src/public/data/pack/server/maps/m50_149 b/src/public/data/pack/server/maps/m50_149 new file mode 100644 index 00000000..f68ae53e Binary files /dev/null and b/src/public/data/pack/server/maps/m50_149 differ diff --git a/src/public/data/pack/server/maps/m50_150 b/src/public/data/pack/server/maps/m50_150 new file mode 100644 index 00000000..843befca Binary files /dev/null and b/src/public/data/pack/server/maps/m50_150 differ diff --git a/src/public/data/pack/server/maps/m50_152 b/src/public/data/pack/server/maps/m50_152 new file mode 100644 index 00000000..85b7def8 Binary files /dev/null and b/src/public/data/pack/server/maps/m50_152 differ diff --git a/src/public/data/pack/server/maps/m50_153 b/src/public/data/pack/server/maps/m50_153 new file mode 100644 index 00000000..1e317122 Binary files /dev/null and b/src/public/data/pack/server/maps/m50_153 differ diff --git a/src/public/data/pack/server/maps/m50_154 b/src/public/data/pack/server/maps/m50_154 new file mode 100644 index 00000000..bf253abe Binary files /dev/null and b/src/public/data/pack/server/maps/m50_154 differ diff --git a/src/public/data/pack/server/maps/m50_46 b/src/public/data/pack/server/maps/m50_46 new file mode 100644 index 00000000..a1960f63 Binary files /dev/null and b/src/public/data/pack/server/maps/m50_46 differ diff --git a/src/public/data/pack/server/maps/m50_47 b/src/public/data/pack/server/maps/m50_47 new file mode 100644 index 00000000..d174c658 Binary files /dev/null and b/src/public/data/pack/server/maps/m50_47 differ diff --git a/src/public/data/pack/server/maps/m50_48 b/src/public/data/pack/server/maps/m50_48 new file mode 100644 index 00000000..72dff695 Binary files /dev/null and b/src/public/data/pack/server/maps/m50_48 differ diff --git a/src/public/data/pack/server/maps/m50_49 b/src/public/data/pack/server/maps/m50_49 new file mode 100644 index 00000000..29282b6e Binary files /dev/null and b/src/public/data/pack/server/maps/m50_49 differ diff --git a/src/public/data/pack/server/maps/m50_50 b/src/public/data/pack/server/maps/m50_50 new file mode 100644 index 00000000..dab29a3e Binary files /dev/null and b/src/public/data/pack/server/maps/m50_50 differ diff --git a/src/public/data/pack/server/maps/m50_51 b/src/public/data/pack/server/maps/m50_51 new file mode 100644 index 00000000..81b39c56 Binary files /dev/null and b/src/public/data/pack/server/maps/m50_51 differ diff --git a/src/public/data/pack/server/maps/m50_52 b/src/public/data/pack/server/maps/m50_52 new file mode 100644 index 00000000..de7cc7b1 Binary files /dev/null and b/src/public/data/pack/server/maps/m50_52 differ diff --git a/src/public/data/pack/server/maps/m50_53 b/src/public/data/pack/server/maps/m50_53 new file mode 100644 index 00000000..d6b2acb2 Binary files /dev/null and b/src/public/data/pack/server/maps/m50_53 differ diff --git a/src/public/data/pack/server/maps/m50_54 b/src/public/data/pack/server/maps/m50_54 new file mode 100644 index 00000000..01cd62cd Binary files /dev/null and b/src/public/data/pack/server/maps/m50_54 differ diff --git a/src/public/data/pack/server/maps/m50_55 b/src/public/data/pack/server/maps/m50_55 new file mode 100644 index 00000000..3e33cd63 Binary files /dev/null and b/src/public/data/pack/server/maps/m50_55 differ diff --git a/src/public/data/pack/server/maps/m50_56 b/src/public/data/pack/server/maps/m50_56 new file mode 100644 index 00000000..a65ba58e Binary files /dev/null and b/src/public/data/pack/server/maps/m50_56 differ diff --git a/src/public/data/pack/server/maps/m50_57 b/src/public/data/pack/server/maps/m50_57 new file mode 100644 index 00000000..1c4e4378 Binary files /dev/null and b/src/public/data/pack/server/maps/m50_57 differ diff --git a/src/public/data/pack/server/maps/m50_58 b/src/public/data/pack/server/maps/m50_58 new file mode 100644 index 00000000..61ce8d2e Binary files /dev/null and b/src/public/data/pack/server/maps/m50_58 differ diff --git a/src/public/data/pack/server/maps/m50_59 b/src/public/data/pack/server/maps/m50_59 new file mode 100644 index 00000000..413277a3 Binary files /dev/null and b/src/public/data/pack/server/maps/m50_59 differ diff --git a/src/public/data/pack/server/maps/m50_60 b/src/public/data/pack/server/maps/m50_60 new file mode 100644 index 00000000..620511ea Binary files /dev/null and b/src/public/data/pack/server/maps/m50_60 differ diff --git a/src/public/data/pack/server/maps/m50_61 b/src/public/data/pack/server/maps/m50_61 new file mode 100644 index 00000000..3518f029 Binary files /dev/null and b/src/public/data/pack/server/maps/m50_61 differ diff --git a/src/public/data/pack/server/maps/m50_62 b/src/public/data/pack/server/maps/m50_62 new file mode 100644 index 00000000..55c284b6 --- /dev/null +++ b/src/public/data/pack/server/maps/m50_62 @@ -0,0 +1 @@ +2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222 \ No newline at end of file diff --git a/src/public/data/pack/server/maps/m51_147 b/src/public/data/pack/server/maps/m51_147 new file mode 100644 index 00000000..58e31695 Binary files /dev/null and b/src/public/data/pack/server/maps/m51_147 differ diff --git a/src/public/data/pack/server/maps/m51_154 b/src/public/data/pack/server/maps/m51_154 new file mode 100644 index 00000000..7d822843 Binary files /dev/null and b/src/public/data/pack/server/maps/m51_154 differ diff --git a/src/public/data/pack/server/maps/m51_46 b/src/public/data/pack/server/maps/m51_46 new file mode 100644 index 00000000..3a5c37cc Binary files /dev/null and b/src/public/data/pack/server/maps/m51_46 differ diff --git a/src/public/data/pack/server/maps/m51_47 b/src/public/data/pack/server/maps/m51_47 new file mode 100644 index 00000000..2cc34439 Binary files /dev/null and b/src/public/data/pack/server/maps/m51_47 differ diff --git a/src/public/data/pack/server/maps/m51_48 b/src/public/data/pack/server/maps/m51_48 new file mode 100644 index 00000000..d7c888f5 Binary files /dev/null and b/src/public/data/pack/server/maps/m51_48 differ diff --git a/src/public/data/pack/server/maps/m51_49 b/src/public/data/pack/server/maps/m51_49 new file mode 100644 index 00000000..82e775e1 Binary files /dev/null and b/src/public/data/pack/server/maps/m51_49 differ diff --git a/src/public/data/pack/server/maps/m51_50 b/src/public/data/pack/server/maps/m51_50 new file mode 100644 index 00000000..8c55d405 Binary files /dev/null and b/src/public/data/pack/server/maps/m51_50 differ diff --git a/src/public/data/pack/server/maps/m51_51 b/src/public/data/pack/server/maps/m51_51 new file mode 100644 index 00000000..1257526e Binary files /dev/null and b/src/public/data/pack/server/maps/m51_51 differ diff --git a/src/public/data/pack/server/maps/m51_52 b/src/public/data/pack/server/maps/m51_52 new file mode 100644 index 00000000..5a09cf2f Binary files /dev/null and b/src/public/data/pack/server/maps/m51_52 differ diff --git a/src/public/data/pack/server/maps/m51_53 b/src/public/data/pack/server/maps/m51_53 new file mode 100644 index 00000000..3d730cac Binary files /dev/null and b/src/public/data/pack/server/maps/m51_53 differ diff --git a/src/public/data/pack/server/maps/m51_54 b/src/public/data/pack/server/maps/m51_54 new file mode 100644 index 00000000..9add7013 Binary files /dev/null and b/src/public/data/pack/server/maps/m51_54 differ diff --git a/src/public/data/pack/server/maps/m51_55 b/src/public/data/pack/server/maps/m51_55 new file mode 100644 index 00000000..eccae42f Binary files /dev/null and b/src/public/data/pack/server/maps/m51_55 differ diff --git a/src/public/data/pack/server/maps/m51_56 b/src/public/data/pack/server/maps/m51_56 new file mode 100644 index 00000000..29844508 Binary files /dev/null and b/src/public/data/pack/server/maps/m51_56 differ diff --git a/src/public/data/pack/server/maps/m51_57 b/src/public/data/pack/server/maps/m51_57 new file mode 100644 index 00000000..36cf52b4 Binary files /dev/null and b/src/public/data/pack/server/maps/m51_57 differ diff --git a/src/public/data/pack/server/maps/m51_58 b/src/public/data/pack/server/maps/m51_58 new file mode 100644 index 00000000..cc3a076a Binary files /dev/null and b/src/public/data/pack/server/maps/m51_58 differ diff --git a/src/public/data/pack/server/maps/m51_59 b/src/public/data/pack/server/maps/m51_59 new file mode 100644 index 00000000..071e8997 Binary files /dev/null and b/src/public/data/pack/server/maps/m51_59 differ diff --git a/src/public/data/pack/server/maps/m51_60 b/src/public/data/pack/server/maps/m51_60 new file mode 100644 index 00000000..4ccbdc70 Binary files /dev/null and b/src/public/data/pack/server/maps/m51_60 differ diff --git a/src/public/data/pack/server/maps/m51_61 b/src/public/data/pack/server/maps/m51_61 new file mode 100644 index 00000000..cefcd52e Binary files /dev/null and b/src/public/data/pack/server/maps/m51_61 differ diff --git a/src/public/data/pack/server/maps/m51_62 b/src/public/data/pack/server/maps/m51_62 new file mode 100644 index 00000000..55c284b6 --- /dev/null +++ b/src/public/data/pack/server/maps/m51_62 @@ -0,0 +1 @@ +2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222 \ No newline at end of file diff --git a/src/public/data/pack/server/maps/m52_152 b/src/public/data/pack/server/maps/m52_152 new file mode 100644 index 00000000..6e5a290c Binary files /dev/null and b/src/public/data/pack/server/maps/m52_152 differ diff --git a/src/public/data/pack/server/maps/m52_153 b/src/public/data/pack/server/maps/m52_153 new file mode 100644 index 00000000..b46a2e79 Binary files /dev/null and b/src/public/data/pack/server/maps/m52_153 differ diff --git a/src/public/data/pack/server/maps/m52_154 b/src/public/data/pack/server/maps/m52_154 new file mode 100644 index 00000000..99e076c7 Binary files /dev/null and b/src/public/data/pack/server/maps/m52_154 differ diff --git a/src/public/data/pack/server/maps/m52_46 b/src/public/data/pack/server/maps/m52_46 new file mode 100644 index 00000000..8380a490 Binary files /dev/null and b/src/public/data/pack/server/maps/m52_46 differ diff --git a/src/public/data/pack/server/maps/m52_47 b/src/public/data/pack/server/maps/m52_47 new file mode 100644 index 00000000..6be515bd Binary files /dev/null and b/src/public/data/pack/server/maps/m52_47 differ diff --git a/src/public/data/pack/server/maps/m52_48 b/src/public/data/pack/server/maps/m52_48 new file mode 100644 index 00000000..6467729f Binary files /dev/null and b/src/public/data/pack/server/maps/m52_48 differ diff --git a/src/public/data/pack/server/maps/m52_49 b/src/public/data/pack/server/maps/m52_49 new file mode 100644 index 00000000..ed79fe98 Binary files /dev/null and b/src/public/data/pack/server/maps/m52_49 differ diff --git a/src/public/data/pack/server/maps/m52_50 b/src/public/data/pack/server/maps/m52_50 new file mode 100644 index 00000000..05c689a9 --- /dev/null +++ b/src/public/data/pack/server/maps/m52_50 @@ -0,0 +1,8 @@ + L L L L L L L L L L L L L L LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL2L2L2L2L2L2L2L2L2L2L2L2L2L2L2L2L2LLL2L2L2L2L2L2L2L2L2L2L2L2L2L2L2L2L2LLL2L2L2L2L2L2L2L2L2L2L2L2L2L2L2L22LLL2LL22222222222222LLL22222222222222LLL22222222222222LLL2LL22222222LL22222222LL2222LLL2222LL2LL222222LL222222LL222LLLLLL L222LL2LL2222LLL2222LLL22LLLLLL L22LLL2LL2222LL2222LL22LLLLLLLL22LL2LL22LL22LL2LLLLLLLL2LL2LL22LLL22LLL2LLLLLLLLL2LLL2LL22LL22LL2LLLLLLLLL2LL2LL22LL22LL2LLLLLLLLL2LL2LL22LLL22LLL2LLLLLLLLL2LLL2LL22LL22LL2LLLLLLLLL2LL2LL22LL22LL2LLLLLLLLL2LL2LL22LLL22LLL2LLLLLLLLL2LLL2LL22LL22LL2LLLLLLLLL2LL2LLL22LL22LL2LLLLLLLLL2LL2LLL22LLL22LLL2LLLLLLLLL2LLL2LLL22LL22LL2LLLLLLLLL2LL2LLL22LL22LL2LLLLLLLLL2LLLLL22LLL22LLL2LLLLLLLLL2LLLLLL22LL22LL2LLLLLLLLL2LLLLL22LL22LL2LLLLLLLLLLL2LLLLL22LLL22LLL2LLLLLLLLLLLL2LLLLLL2222LL2222LL22LLLLLLLLLLLL2 L2LLLLL2222LL2222LL22LLLLLLLLLLLL22LLLLL222222LLL222222LLL222LLLLLLLLLLLL2 L22LLLLLL22222222LL22222222LL2222LLLLLLLLLL2L222LLLLL22222222222222LL22222222222222LL22222 +L2L2LLLL2L2L2L2222LLLLL22222222222222222LL22222222222222222LL22222222L2L2L2222222LLLLL L L L L LLL L L L LLL L LLL L LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL2L2L2L2L2L2L2L2L2L2L2L2L2L2L2L2L2LLL2L2L2L2L2L2L2L2L2L2L2L2L2L2L2L2L2LLL2L2L2L2L2L2L2L2L2L2L2L2L2L2L2L2L2LLLLLL22222222222222LL22222222222222LL22222222222222LLLLLL22222222LL22222222LL22222222LLLLL222222LL222222LL222222LLLL2222LLL2222LLL2222LLL LLL2222LL2222LL2222LLLLL22LL22LL22LLLLL22LLL22LLL22LLLLLL22LL22LL22LLLLL22LL22LL22LLLLL22LLL22LLL22LLLLLL22LL22LL22LL2LLL22LL22LL22LL2LLL22LLL22LLL22LLL2LLL22LL22LL22LL2LLL22LL22LL22LL2LL22LLL22LLL22LLL2LL22LL22LL22LL2LL22LL22LL22LL2LL22LLL22LLL22LLL2LL22LL22LL22LL2LL22LL22LL22LL2LL22LLL22LLL22LLL2LL2222LL2222LL2222LL2LL2222LL2222LL2222LL2LL222222LLL222222LLL222222LLL2LL22222222LL22222222LL22222222LL2LL22222222222222LL22222222222222LL22222222222222LL2LL22222222222222222LL22222222222222222LL22222222222222222LL2LL L L L L LLL L L L L LLL L L L L LLL*3F*3FFEA=951-)%!  <<<<<<<<<<  !%)-159=AE*3F*3FFF*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*2F*2F*2F*4F*4F*2F*2F*4F*4F*4F*2F*2F*4F*4F*2F*2F*2F*3F*3F*2F*2F*2F*4F*4F*2F*2F*4F*4F*4F*2F*2F*4F*4F*2F*2F*2F*3F*3F*2F*2F*2F*4F*4F*2F*2F*4F*4F*4F*2F*2F*4F*4F*2F*2F*2F*3F*3F*2F*3F*3F*3F*2F*2*2*2*2*2*2M3M3M3*2*2*2*2*2*2*2*3F*3F*2F*2*2*2*2*2*2M3M3M3*2*2*2*2*2*2*2*3F*3F*2F*2*2*2*2*2*2M3M3M3*2*2*2*2*2*2*2*3F*3F*2F*3E*3F*3F*2F*2*2*2M4M4M3M3M3M3M3M4 M4*2*2*2*2*3F*3F*2F*2*2*2M4M4M3M3M3M3M3M4 M4*2*2*2*2*3F*3F*2F*2*2*2M4M4M3M3M3M3M3M4 M4*2*2*2*2*3F*3F*2F*3A*3F*3F*4F*2*2M4M3M3M3M3M3M3M3M3M3 M4*2*2*4*3F*3F*4F*2*2M4M3M3M3M3M3M3M3M3M3 M4*2*2*4*3F*3F*4F*2*2M4M3M3M3M3M3M3M3M3M3 M4*2*2*4*3F*3F*2F*3=*3F*3F*4F*2 M4M3M3M3M3M3M3M3M3M3M3M3M4*2*4*3F*3F*4F*2 M4M3M3M3M3M3M3M3M3M3M3M3M4*2*4*3F*3F*4F*2 M4M3M3M3M3M3M3!M3M3M3M3M3M4*2*4*3F*3F*2F*39*3F*3F*2F*2M4M3M3M3M3M3M3M3M3M3M3M3M4*2*2*3F*3F*2F*2M4M3M3M3M3M3M3M3M3M3M3M3M4*2*2*3F*3F*2F*2M4M3M3M3M3!M3!M3!M3!M3!M3M3M3M4*2*2*3F*3F*2F*35*3F*3F*4F M4M3M3M3M3M3M3M3M3M3M3M3M3M3M4*4*3F*3F*4F M4M3M3M3M3M3M3M3M3M3M3M3M3M3M4*4*3F*3F*4F M4M3M3M3M3!M3!M3!M3!M3!M3!M3!M3M3M3M4*4*3F*3F*2F*31*3F*3F*4FM4M3M3M3M3M3M3M3M3M3M3M3M3M3M4*4*3F*3F*4FM4M3M3M3M3M3M3M3M3M3M3M3M3M3M4*4*3F*3F*4FM4M3M3M3M3!M3!M3!M3!M3!M3!M3!M3M3M3M3*4*3F*3F*2F*3-*3F*3F*2FM3M3M3M3M3M3M3M3M3M3M3M3M3M3M3*2*3F*3F*2FM3M3M3M3M3M3M3M3M3M3M3M3M3M3M3*2*3F*3F*2FM3M3M3M3!M3!M3!M3!M3!M3!M3!M3!M3!M3M3M3*2*3F*3F*2F*3)*3F*3F*4FM3M3M3M3M3M3M3M3M3M3M3M3M3M3M3*4*3F*3F*4FM3M3M3M3M3M3M3M3M3M3M3M3M3M3M3*4*3F*3F*4FM3M3M3M3M3!M3!M3!M3!M3!M3!M3!M3!M3M3M3*4*3F*3F*2F*3%*3F*3F*4FM3M3M3M3M3M3M3M3M3M3M3M3M3M3M3*4*3F*3F*4FM3M3M3M3M3M3M3M3M3M3M3M3M3M3M3*4*3F*3F*4FM3M3M3M3!M3!M3!M3!M3!M3!M3!M3!M3M3M3M3*4*3F*3F*2F*3!*3F*3F*2FM3M3M3M3M3M3M3M3M3M3M3M3M3M3M3*2*3F*3F*2FM3M3M3M3M3M3M3M3M3M3M3M3M3M3M3*2*3F*3F*2FM3M3M3M3!M3!M3!M3!M3!M3!M3!M3!M3!M3M3M3*2*3F*3F*2F*3*3F*3F*4FM3M3M3M3M3M3M3M3M3M3M3M3M3M3M3*4*3F*3F*4FM3M3M3M3M3M3M3M3M3M3M3M3M3M3M3*4*3F*3F*4FM3M3M3M3!M3!M3!M3!M3!M3!M3!M3!M3!M3M3M3*4*3F*3F*2F*3*3F*3F*4FM3M3M3M3M3M3M3M3M3M3M3M3M3M3M3*4*3F*3F*4FM3M3M3M3M3M3M3M3M3M3M3M3M3M3M3*4*3F*3F*4FM3M3M3M3M3!M3!M3!M3!M3!M3!M3!M3M3M3M3*4*3F*3F*2F*3*3F*3F*2FM3M3M3M3M3M3M3M3M3M3M3M3M3M3M3*2*3F*3F*2FM3M3M3M3M3M3M3M3M3M3M3M3M3M3M3*2*3F*3F*2FM3M3M3M3M3!M3!M3!M3!M3!M3!M3!M3M3M3M3*2*3F*3F*2F*3*3F*3F*4FM3M3M3M3M3M3M3M3M3M3M3M3M3M3M3*4*3F*3F*4FM3M3M3M3M3M3M3M3M3M3M3M3M3M3M3*4*3F*3F*4FM3M3M3M3M3!M3!M3!M3!M3!M3!M3!M3!M3M3M3*4*3F*3F*2F*3 *3F*3F*4FM3M3M3M3M3M3M3M3M3M3M3M3M3M3M3*4*3F*3F*4FM3M3M3M3M3M3M3M3M3M3M3M3M3M3M3*4*3F*3F*4FM3M3M3M3M3!M3!M3!M3!M3!M3!M3!M3M3M3M3*4*3F*3F*2F*3 *3F*3F*2FM3M3M3M3M3M3M3M3M3M3M3M3M3M3M3*2*3F*3F*2FM3M3M3M3M3M3M3M3M3M3M3M3M3M3M3*2*3F*3F*2FM3M3M3M3M3!M3!M3!M3!M3!M3!M3!M3M3M3M3*2*3F*3F*2F*3*3F*3F*4FM3M3M3M3M3M3M3M3M3M3M3M3M3M3M3*4*3F*3F*4FM3M3M3M3M3M3M3M3M3M3M3M3M3M3M3*4*3F*3F*4FM3M3M3M3M3M3!M3!M3!M3!M3!M3M3M3M3M3*4*3F*3FF*3F*3F*4FM3M3M3M3M3M3M3M3M3M3M3M3M3M3M3*4*3F*3F*4FM3M3M3M3M3M3M3M3M3M3M3M3M3M3M3*4*3F*3F*4FM3M3M3M3M3M3!M3!M3!M3!M3!M3M3M3M3M3*4*3F*3FF*3F*3F*2FM3M3M3M3M3M3M3M3M3M3M3M3M3M3M3*2*3F*3F*2FM3M3M3M3M3M3M3M3M3M3M3M3M3M3M3*2*3F*3F*2FM3M3M3M3M3M3M3M3!M3M3M3M3M3M3M3*2*3F*3FF*3F*3F*4FM4M3M3M3M3M3M3M3M3M3M3M3M3M3M4*4*3F*3F*4FM4M3M3M3M3M3M3M3M3M3M3M3M3M3M4*4*3F*3F*4FM4M3M3M3M3M3M3M3M3M3M3M3M3M3M4*4*3F*3FF*3F*3F*4FM4M3M3M3M3M3M3M3M3M3M3M3M3M3 M4*4*3F*3F*4FM4M3M3M3M3M3M3M3M3M3M3M3M3M3 M4*4*3F*3F*4FM4M3M3M3M3M3M3M3M3M3M3M3M3M3 M4*4*3F*3FF*3F*3F*2F*2M4M3M3M3M3M3M3M3M3M3M3M3M4*2*2*3F*3F*2F*2M4M3M3M3M3M3M3M3M3M3M3M3M4*2*2*3F*3F*2F*2M4M3M3M3M3M3M3M3M3M3M3M3M4*2*2*3F*3FF*3F*3F*4F*2M4M3M3M3M3M3M3M3M3M3M3M3 M4*2*2*3F*3F*2F*2M4M3M3M3M3M3M3M3M3M3M3M3 M4*2*2*3F*3F*2F*2M4M3M3M3M3M3M3M3M3M3M3M3 M4*2*4*3F*3FF*3F*3F*4F*2*2M4M3M3M3M3M3M3M3M3M3M4*2*2M3FM3FM3F M3F*2F*2M4M3M3M3M3M3M3M3M3M3M4*2*2M3FM3FM3F M3F*2F*2M4M3M3M3M3M3M3M3M3M3M4*2*2*4*3F*3F*9F*3F*3F*2F*2*2*2 +M4M4M3M3M3M3M3M4M4*2*2M3FM3FM3FM3FM3F M3F*2F*2 +M4M4M3M3M3M3M3M4M4*2*2M3FM3FM3FM3FM3F M3F*2F*2 +M4M4M3M3M3M3M3M4M4*2*2*2*2*3F*3F*9F*3F*3F*2F*2*2*2*2*2*2M3M3M3*2*2*2*2M3FM3FM3FM3FM3FM3FM3F M3F*2F*2*2*2M3M3M3*2*2*2*2M3FM3FM3FM3FM3FM3FM3F M3F*2F*2*2*2M3M3M3*2*2*2*2*2*2*2*3F*3FF*3F*3F*2F*2*2*4*4*2*2*4*4*4*2*2*2M3FM3FM3FM3FM3FM3FM3FM3FM3F M3F*2F*2*2*4*4*4*2*2*2M3FM3FM3FM3FM3FM3FM3FM3FM3F M3F*2F*2*2*4*4*4*2*2*4*4*2*2*2*3F*3FF*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*4FM3FM3FM3FM3FM3FM3FM3FM3FM3FM3F*3F*3F*3F*3F*3F*3F*3F*3F*3FM3FM3FM3FM3FM3FM3FM3FM3FM3FM3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3FF*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3FM3FM3FM3FM3FM3FM3FM3FM3FM3FM3F*3F*3F*3F*3F*3F*3F*3F*3F*3FM3FM3FM3FM3FM3FM3FM3FM3FM3FM3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3FF*3F*3F*2F*2F*2F*4F*4F*2F*2F*4F*4F*4F*2F*2F*2FM3FM3FM3FM3FM3FM3FM3FM3FM3FM3F*2F*2F*2F*4F*4F*4F*2F*2F*2FM3FM3FM3FM3FM3FM3FM3FM3FM3FM3F*2F*2F*2F*4F*4F*4F*2F*2F*4F*4F*2F*2F*2F*3F*3FF*3F*3F*2F*2*2*2*2*2*2M3M3M3*2*2*2*2FM3FM3FM3FM3FM3FM3FM3FM3F*2F*2F*2*2M3M3M3*2*2*2*2FM3FM3FM3FM3FM3FM3FM3FM3F*2F*2F*2*2M3M3M3*2*2*2*2*2*2*2*3F*3FF*3F*3F*2F*2*2*2M4M4M3M3M3M3M3M4 M4*2*2FM3FM3FM3FM3FM3FM3F*2F*2FM4M4M3M3M3M3M3M4 M4*2*2FM3FM3FM3FM3FM3FM3F*2F*2FM4M4M3M3M3M3M3M4 M4*2*2*2*2*3F*3FF*3F*3F*4F*2*2M4M3M3M3M3M3M3M3M3M3 M4*2*2FM3FM3FM3FM3F*2F*2FM4M3M3M3M3M3M3M3M3M3 M4*2*2FM3FM3FM3FM3F*2F*2FM4M3M3M3M3M3M3M3M3M3 M4*2*2*4*3F*3FF*3F*3F*4F*2 M4M3M3M3M3M3M3M3M3M3M3M3M4*2*2F*3F*3F*2F*2F M4M3M3M3M3M3M3M3M3M3M3M3M4*2*2F*3F*3F*2F*2F M4M3M3M3M3M3M3M3M3M3M3M3M4*2*4*3F*3FF*3F*3F*2F*2M4M3M3M3M3M3M3M3M3M3M3M3M4*2*2*3F*3F*2F*2M4M3M3M3M3M3M3M3M3M3M3M3M4*2*2*3F*3F*2F*2M4M3M3M3M3M3M3M3M3M3M3M3M4*2*4*3F*3FF*3F*3F*4F M4M3M3M3M3M3M3M3M3M3M3M3M3M3M4*4*3F*3F*4F M4M3M3M3M3M3M3M3M3M3M3M3M3M3M4*4*3F*3F*4F M4M3M3M3M3M3M3M3M3M3M3M3M3M3M4*4*3F*3FF*3F*3F*4FM4M3M3M3M3M3M3M3M3M3M3M3M3M3M4*4*3F*3F*4FM4M3M3M3M3M3M3M3M3M3M3M3M3M3M4*4*3F*3F*4FM4M3M3M3M3M3M3M3M3M3M3M3M3M3M4*4*3F*3FF*3F*3F*2FM3M3M3M3M3M3M3M3M3M3M3M3M3M3M3*2*3F*3F*2FM3M3M3M3M3M3M3M3M3M3M3M3M3M3M3*2*3F*3F*2FM3M3M3M3M3M3M3M3M3M3M3M3M3M3M3*2*3F*3FF*3F*3F*4FM3M3M3M3M3M3M3M3M3M3M3M3M3M3M3*4*3F*3F*4FM3M3M3M3M3M3M3M3M3M3M3M3M3M3M3*4*3F*3F*4FM3M3M3M3M3M3M3M3M3M3M3M3M3M3M3*4*3F*3FF*3F*3F*4FM3M3M3M3M3M3M3M3M3M3M3M3M3M3M3*4*3F*3F*4FM3M3M3M3M3M3M3M3M3M3M3M3M3M3M3*4*3F*3F*4FM3M3M3M3M3M3M3M3M3M3M3M3M3M3M3*4*3F*3FF*3F*3F*2FM3M3M3M3M3M3M3M3M3M3M3M3M3M3M3*2*3F*3F*2FM3M3M3M3M3M3M3M3M3M3M3M3M3M3M3*2*3F*3F*2FM3M3M3M3M3M3M3M3M3M3M3M3M3M3M3*2*3F*3F*2F*3*3F*3F*4FM3M3M3M3M3M3M3M3M3M3M3M3M3M3M3*4*3F*3F*4FM3M3M3M3M3M3M3M3M3M3M3M3M3M3M3*4*3F*3F*4FM3M3M3M3M3M3M3M3M3M3M3M3M3M3M3*4*3F*3F*2F*3*3F*3F*4FM3M3M3M3M3M3M3M3M3M3M3M3M3M3M3*4*3F*3F*4FM3M3M3M3M3M3M3M3M3M3M3M3M3M3M3*4*3F*3F*4FM3M3M3M3M3M3M3M3M3M3M3M3M3M3M3*4*3F*3F*2F*3 *3F*3F*2FM3M3M3M3M3M3M3M3M3M3M3M3M3M3M3*2*3F*3F*2FM3M3M3M3M3M3M3M3M3M3M3M3M3M3M3*2*3F*3F*2FM3M3M3M3M3M3M3M3M3M3M3M3M3M3M3*2*3F*3F*2F*3 *3F*3F*4FM3M3M3M3M3M3M3M3M3M3M3M3M3M3M3*4*3F*3F*4FM3M3M3M3M3M3M3M3M3M3M3M3M3M3M3*4*3F*3F*4FM3M3M3M3M3M3M3M3M3M3M3M3M3M3M3*4*3F*3F*2F*3*3F*3F*4FM3M3M3M3M3M3M3M3M3M3M3M3M3M3M3*4*3F*3F*4FM3M3M3M3M3M3M3M3M3M3M3M3M3M3M3*4*3F*3F*4FM3M3M3M3M3M3M3M3M3M3M3M3M3M3M3*4*3F*3F*2F*3*3F*3F*2FM3M3M3M3M3M3M3M3M3M3M3M3M3M3M3*2*3F*3F*2FM3M3M3M3M3M3M3M3M3M3M3M3M3M3M3*2*3F*3F*2FM3M3M3M3M3M3M3M3M3M3M3M3M3M3M3*2*3F*3F*2F*3*3F*3F*4FM3M3M3M3M3M3M3M3M3M3M3M3M3M3M3*4*3F*3F*4FM3M3M3M3M3M3M3M3M3M3M3M3M3M3M3*4*3F*3F*4FM3M3M3M3M3M3M3M3M3M3M3M3M3M3M3*4*3F*3F*2F*3*3F*3F*4FM3M3M3M3M3M3M3M3M3M3M3M3M3M3M3*4*3F*3F*4FM3M3M3M3M3M3M3M3M3M3M3M3M3M3M3*4*3F*3F*4FM3M3M3M3M3M3M3M3M3M3M3M3M3M3M3*4*3F*3F*2F*3!*3F*3F*2FM3M3M3M3M3M3M3M3M3M3M3M3M3M3M3*2*3F*3F*2FM3M3M3M3M3M3M3M3M3M3M3M3M3M3M3*2*3F*3F*2FM3M3M3M3M3M3M3M3M3M3M3M3M3M3M3*2*3F*3F*2F*3%*3F*3F*4FM3M3M3M3M3M3M3M3M3M3M3M3M3M3M4*4*3F*3F*4FM4M3M3M3M3M3M3M3M3M3M3M3M3M3M4*4*3F*3F*4FM4M3M3M3M3M3M3M3M3M3M3M3M3M3M4*4*3F*3F*2F*3)*3F*3F*4FM4M3M3M3M3M3M3M3M3M3M3M3M3M3 M4*4*3F*3F*4FM4M3M3M3M3M3M3M3M3M3M3M3M3M3 M4*4*3F*3F*4FM4M3M3M3M3M3M3M3M3M3M3M3M3M3 M4*4*3F*3F*2F*3-*3F*3F*2F*2M4M3M3M3M3M3M3M3M3M3M3M3M4*2*2*3F*3F*2F*2M4M3M3M3M3M3M3M3M3M3M3M3M4*2*2*3F*3F*2F*2M3M3M3M3M3M3M3M3M3M3M3M3M4*2*2*3F*3F*2F*31*3F*3F*4F*2M4M3M3M3M3M3M3M3M3M3M3M3 M4*2*4*3F*3F*4F*2M4M3M3M3M3M3M3M3M3M3M3M3 M4*2*4*3F*3F*4F*2M4M3M3M3M3M3M3M3M3M3M3M3 M4*2*4*3F*3F*2F*35*3F*3F*4F*2*2M4M3M3M3M3M3M3M3M3M3M4*2*2*4*3F*3F*4F*2*2M4M3M3M3M3M3M3M3M3M3M4*2*2*4*3F*3F*4F*2*2M4M3M3M3M3M3M3M3M3M3M4*2**4*3F*3F*2F*39*3F*3F*2F*2*2*2 +M4M4M3M3M3M3M3M4M4*2*2*2*2*3F*3F*2F*2*2*2 +M4M4M3M3M3M3M3M4M4*2*2*2*2*3F*3F*2F*2*2*2 +M4M4M3M3M3M3M3M4M4*2*2*2*2*3F*3F*2F*3=*3F*3F*2F*2*2*2*2*2*2M3M3M3*2*2*2*2*2*2*2*3F*3F*2F*2*2*2*2*2*2M3M3M3*2*2*2*2*2*2*2*3F*3F*2F*2*2*2*2*2*2M3M3M3*2*2*2*2*2*2*2*3F*3F*2F*3A*3F*3F*2F*2*2*4*4*2*2*4*4*4*2*2*4*4*2*2*2*3F*3F*2F*2*2*4*4*2*2*4*4*4*2*2*4*4*2*2*2*3F*3F*2F*2*2*4*4*2*2*4*4*4*2*2*4*4*2*2*2*3F*3F*2F*3E*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3F*3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF \ No newline at end of file diff --git a/src/public/data/pack/server/maps/m52_51 b/src/public/data/pack/server/maps/m52_51 new file mode 100644 index 00000000..d2698141 Binary files /dev/null and b/src/public/data/pack/server/maps/m52_51 differ diff --git a/src/public/data/pack/server/maps/m52_52 b/src/public/data/pack/server/maps/m52_52 new file mode 100644 index 00000000..189775cc Binary files /dev/null and b/src/public/data/pack/server/maps/m52_52 differ diff --git a/src/public/data/pack/server/maps/m52_53 b/src/public/data/pack/server/maps/m52_53 new file mode 100644 index 00000000..cbd1d035 Binary files /dev/null and b/src/public/data/pack/server/maps/m52_53 differ diff --git a/src/public/data/pack/server/maps/m52_54 b/src/public/data/pack/server/maps/m52_54 new file mode 100644 index 00000000..d526eb6f Binary files /dev/null and b/src/public/data/pack/server/maps/m52_54 differ diff --git a/src/public/data/pack/server/maps/m52_55 b/src/public/data/pack/server/maps/m52_55 new file mode 100644 index 00000000..97608509 Binary files /dev/null and b/src/public/data/pack/server/maps/m52_55 differ diff --git a/src/public/data/pack/server/maps/m52_56 b/src/public/data/pack/server/maps/m52_56 new file mode 100644 index 00000000..c5193d0e Binary files /dev/null and b/src/public/data/pack/server/maps/m52_56 differ diff --git a/src/public/data/pack/server/maps/m52_57 b/src/public/data/pack/server/maps/m52_57 new file mode 100644 index 00000000..ae2d3e02 Binary files /dev/null and b/src/public/data/pack/server/maps/m52_57 differ diff --git a/src/public/data/pack/server/maps/m52_58 b/src/public/data/pack/server/maps/m52_58 new file mode 100644 index 00000000..461de70a Binary files /dev/null and b/src/public/data/pack/server/maps/m52_58 differ diff --git a/src/public/data/pack/server/maps/m52_59 b/src/public/data/pack/server/maps/m52_59 new file mode 100644 index 00000000..2af87cc4 Binary files /dev/null and b/src/public/data/pack/server/maps/m52_59 differ diff --git a/src/public/data/pack/server/maps/m52_60 b/src/public/data/pack/server/maps/m52_60 new file mode 100644 index 00000000..ea591892 Binary files /dev/null and b/src/public/data/pack/server/maps/m52_60 differ diff --git a/src/public/data/pack/server/maps/m52_61 b/src/public/data/pack/server/maps/m52_61 new file mode 100644 index 00000000..ad2af83b --- /dev/null +++ b/src/public/data/pack/server/maps/m52_61 @@ -0,0 +1 @@ +2Š2Š2Š2Š2Š2Š2Š2Š‚2Šp2Š.2Š2Š&2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2ŠŠŠŠŠŠŠŠ>ŠŠŠ2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2ŠŠŠŠŠŠŠŠŠsŠ/ŠŠ2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2ŠŠŠŠŠŠŠŠŠŠ>Š%Š&2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2ŠŠŠŠŠŠŠŠŠŠŠŠkŠ;ŠŠ2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2ŠŠŠŠŠŠŠŠŠŠŠ{ŠAŠŠ&2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2ŠŠŠŠŠŠŠŠŠŠŠ|ŠRŠŠŠ2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2ŠŠŠŠŠŠŠŠŠŠŠŠŠnŠCŠŠ2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2ŠŠŠŠŠŠŠŠŠŠŠŠzŠGŠŠ&2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2ŠŠŠŠŠŠŠŠŠŠŠŠ~ŠQŠŠŠ2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2ŠŠŠŠŠŠŠŠŠŠŠŠˆŠ[Š9ŠŠ2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2ŠŠŠŠŠŠŠŠŠŠŠ‹Š~ŠSŠ/ŠŠ&2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2ŠŠŠŠŠŠŠŠŠŠŠŠ‰ŠmŠ5ŠŠŠ2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2ŠŠŠŠŠŠŠŠŠŠŠŠŒŠtŠ8ŠŠŠ2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2ŠŠŠŠŠŠŠŠŠŠŠŠŠwŠ7ŠŠŠ2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2ŠŠŠŠŠŠŠŠŠŠŠŠŠzŠBŠŠŠ2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2ŠŠŠŠŠŠŠŠŠŠŠŠŠƒŠ_ŠŠŠ2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2ŠŠŠŠŠŠŠŠŠŠŠŠŽŠŠŠnŠ3ŠŠ2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2ŠŠŠŠŠŠŠŠŠŠŠŒŠŠŒŠtŠ1ŠŠ2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2ŠŠŠŠŠŠŠŠŠŠŠŠŠŠxŠ.ŠŠ2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2ŠŠŠŠŠŠŠŠŠŠŠŠŠŠ}ŠŠŠ2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2ŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠ2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2ŠŠŠŠŠŠŠŠŠŠŠŠŠŠxŠŠŠ2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2ŠŠŠŠŠŠŠŠŠŠŠŠŠŠqŠŠ'2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2ŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠ;ŠŠ2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2ŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠkŠ6ŠŠ2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2ŠŠŠŠŠŠŠŠŠŠŠŠ‹Š€ŠWŠ.ŠŠ2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2ŠŠŠŠŠŠŠŠŠŠŠŠŠ‡ŠcŠ;Š'2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2ŠŠŠŠŠŠŠŠŠŠŠŠŠ‚ŠbŠ9Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2ŠŠŠŠŠŠŠŠŠŠŠŠŠŠ}Š?Š&2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2ŠŠŠŠŠŠŠŠŠŠŠŠŠŠyŠ@ŠŠ2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2ŠŠŠŠŠŠŠŠŠŠŠŠŠŠzŠ9ŠŠ2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2ŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠ2ŠŠ2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2ŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠ0ŠŠ&2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2ŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠ=ŠŠŠ2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2ŠŠŠŠŠŠŠŠŠŠŠŠŠŠŽŠqŠŠŠ2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2ŠŠŠŠŠŠŠŠŠŠŠŠŠŠ‹ŠvŠ;ŠŠ&2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2ŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠ{ŠDŠŠŠ2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2ŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠ†ŠZŠŠŠ2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2ŠŠŠŠŠŠŠŠŠŠŠŠŠŠ‹ŠŠSŠŠŠ2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2ŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠ‰ŠjŠŠŠ&2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2ŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠzŠŠŠŠ2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2ŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠ„ŠŠŠŠ2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2ŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŽŠŠŠŠ2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2ŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠ‰ŠdŠŠŠ2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2ŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠyŠŠŠŠ2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2ŠŠŠŠŠŠŠŠŠŠŠŠŠŠŽŠŠŠoŠŠŠŠ2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2ŠŠŠŠŠŠŠŠŠŠŠŠŠŠŽŠ‰ŠjŠŠŠŠ2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2ŠŠŠŠŠŠŠŠŠŠŠŠŠŠŽŠ„ŠYŠŠŠŠ2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2ŠŠŠŠŠŠŠŠŠŠŠŠŠŽŠŠŠpŠ>ŠŠŠŠ2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2ŠŠŠŠŠŠŠŠŠŠŠŠŠŠ…Š\Š.ŠŠŠŠ2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2ŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠuŠCŠŠŠŠ'2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2ŠŠŠŠŠŠŠŠŠŠŠŠŽŠ‹ŠsŠ9ŠŠŠŠ2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2ŠŠŠŠŠŠŠŠŠŠŠŠŠŒŠtŠŠŠŠ'2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2ŠŠŠŠŠŠŠŠŠŠŠŠŠ…ŠfŠŠŠŠ2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2ŠŠŠŠŠŠŠŠŠŠŠŠ‹ŠŠ]ŠŠŠŠ2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2ŠŠŠŠŠŠŠŠŠŠŠŽŠŽŠ†ŠbŠ7ŠŠ'2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2ŠŠŠŠŠŠŠŠŠŠŠŠ‰ŠzŠSŠ4ŠŠ2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2ŠŠŠŠŠŠŠŠŠŠŠŽŠŠ„Š[Š4ŠŠ2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2ŠŠŠŠŠŠŠŠŠŠŠŠŽŠŠ|ŠMŠŠ2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2ŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠlŠŠ2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2ŠŠŠŠŠŠŠŠŠŠŠŠŠŠyŠDŠŠ2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2ŠŠŠŠŠŠŠŠŠŠŠŠŠ…Š[Š+ŠŠ&2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2ŠŠŠŠŠŠŠŠŠŠŠŠŠŠxŠ3ŠŠŠ2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š2Š \ No newline at end of file diff --git a/src/public/data/pack/server/maps/m52_62 b/src/public/data/pack/server/maps/m52_62 new file mode 100644 index 00000000..55c284b6 --- /dev/null +++ b/src/public/data/pack/server/maps/m52_62 @@ -0,0 +1 @@ +2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222 \ No newline at end of file diff --git a/src/public/data/pack/server/maps/m53_49 b/src/public/data/pack/server/maps/m53_49 new file mode 100644 index 00000000..6a556ed0 Binary files /dev/null and b/src/public/data/pack/server/maps/m53_49 differ diff --git a/src/public/data/pack/server/maps/m53_50 b/src/public/data/pack/server/maps/m53_50 new file mode 100644 index 00000000..e365e6f1 Binary files /dev/null and b/src/public/data/pack/server/maps/m53_50 differ diff --git a/src/public/data/pack/server/maps/m53_51 b/src/public/data/pack/server/maps/m53_51 new file mode 100644 index 00000000..7791a013 Binary files /dev/null and b/src/public/data/pack/server/maps/m53_51 differ diff --git a/src/public/data/pack/server/maps/m53_52 b/src/public/data/pack/server/maps/m53_52 new file mode 100644 index 00000000..615f543b Binary files /dev/null and b/src/public/data/pack/server/maps/m53_52 differ diff --git a/src/public/data/pack/server/maps/m53_53 b/src/public/data/pack/server/maps/m53_53 new file mode 100644 index 00000000..f139a2c9 Binary files /dev/null and b/src/public/data/pack/server/maps/m53_53 differ diff --git a/src/public/data/pack/server/maps/n29_75 b/src/public/data/pack/server/maps/n29_75 new file mode 100644 index 00000000..38606579 Binary files /dev/null and b/src/public/data/pack/server/maps/n29_75 differ diff --git a/src/public/data/pack/server/maps/n30_75 b/src/public/data/pack/server/maps/n30_75 new file mode 100644 index 00000000..ff92523c Binary files /dev/null and b/src/public/data/pack/server/maps/n30_75 differ diff --git a/src/public/data/pack/server/maps/n31_75 b/src/public/data/pack/server/maps/n31_75 new file mode 100644 index 00000000..34e55cf8 Binary files /dev/null and b/src/public/data/pack/server/maps/n31_75 differ diff --git a/src/public/data/pack/server/maps/n32_70 b/src/public/data/pack/server/maps/n32_70 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n32_71 b/src/public/data/pack/server/maps/n32_71 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n32_72 b/src/public/data/pack/server/maps/n32_72 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n32_73 b/src/public/data/pack/server/maps/n32_73 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n32_74 b/src/public/data/pack/server/maps/n32_74 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n32_75 b/src/public/data/pack/server/maps/n32_75 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n33_70 b/src/public/data/pack/server/maps/n33_70 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n33_71 b/src/public/data/pack/server/maps/n33_71 new file mode 100644 index 00000000..960c7a12 --- /dev/null +++ b/src/public/data/pack/server/maps/n33_71 @@ -0,0 +1,2 @@ +’æúá +è•ç¯íÖà \ No newline at end of file diff --git a/src/public/data/pack/server/maps/n33_72 b/src/public/data/pack/server/maps/n33_72 new file mode 100644 index 00000000..1b9afbf0 --- /dev/null +++ b/src/public/data/pack/server/maps/n33_72 @@ -0,0 +1 @@ +gëfê¨êfêiê&êiêÛêâêæêêê6êíêôê \ No newline at end of file diff --git a/src/public/data/pack/server/maps/n33_73 b/src/public/data/pack/server/maps/n33_73 new file mode 100644 index 00000000..3d7aea76 Binary files /dev/null and b/src/public/data/pack/server/maps/n33_73 differ diff --git a/src/public/data/pack/server/maps/n33_74 b/src/public/data/pack/server/maps/n33_74 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n33_75 b/src/public/data/pack/server/maps/n33_75 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n33_76 b/src/public/data/pack/server/maps/n33_76 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n34_70 b/src/public/data/pack/server/maps/n34_70 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n34_71 b/src/public/data/pack/server/maps/n34_71 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n34_72 b/src/public/data/pack/server/maps/n34_72 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n34_73 b/src/public/data/pack/server/maps/n34_73 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n34_74 b/src/public/data/pack/server/maps/n34_74 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n34_75 b/src/public/data/pack/server/maps/n34_75 new file mode 100644 index 00000000..f55e19a7 Binary files /dev/null and b/src/public/data/pack/server/maps/n34_75 differ diff --git a/src/public/data/pack/server/maps/n34_76 b/src/public/data/pack/server/maps/n34_76 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n35_20 b/src/public/data/pack/server/maps/n35_20 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n35_75 b/src/public/data/pack/server/maps/n35_75 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n35_76 b/src/public/data/pack/server/maps/n35_76 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n36_146 b/src/public/data/pack/server/maps/n36_146 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n36_147 b/src/public/data/pack/server/maps/n36_147 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n36_148 b/src/public/data/pack/server/maps/n36_148 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n36_149 b/src/public/data/pack/server/maps/n36_149 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n36_150 b/src/public/data/pack/server/maps/n36_150 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n36_153 b/src/public/data/pack/server/maps/n36_153 new file mode 100644 index 00000000..a8d6be96 Binary files /dev/null and b/src/public/data/pack/server/maps/n36_153 differ diff --git a/src/public/data/pack/server/maps/n36_154 b/src/public/data/pack/server/maps/n36_154 new file mode 100644 index 00000000..ddfae7df Binary files /dev/null and b/src/public/data/pack/server/maps/n36_154 differ diff --git a/src/public/data/pack/server/maps/n36_52 b/src/public/data/pack/server/maps/n36_52 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n36_53 b/src/public/data/pack/server/maps/n36_53 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n36_54 b/src/public/data/pack/server/maps/n36_54 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n36_72 b/src/public/data/pack/server/maps/n36_72 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n36_73 b/src/public/data/pack/server/maps/n36_73 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n36_74 b/src/public/data/pack/server/maps/n36_74 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n36_75 b/src/public/data/pack/server/maps/n36_75 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n36_76 b/src/public/data/pack/server/maps/n36_76 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n37_146 b/src/public/data/pack/server/maps/n37_146 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n37_147 b/src/public/data/pack/server/maps/n37_147 new file mode 100644 index 00000000..3a5b3ab5 Binary files /dev/null and b/src/public/data/pack/server/maps/n37_147 differ diff --git a/src/public/data/pack/server/maps/n37_148 b/src/public/data/pack/server/maps/n37_148 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n37_149 b/src/public/data/pack/server/maps/n37_149 new file mode 100644 index 00000000..47c9b1e6 --- /dev/null +++ b/src/public/data/pack/server/maps/n37_149 @@ -0,0 +1 @@ +;Ú \ No newline at end of file diff --git a/src/public/data/pack/server/maps/n37_150 b/src/public/data/pack/server/maps/n37_150 new file mode 100644 index 00000000..1ca7b2e9 Binary files /dev/null and b/src/public/data/pack/server/maps/n37_150 differ diff --git a/src/public/data/pack/server/maps/n37_151 b/src/public/data/pack/server/maps/n37_151 new file mode 100644 index 00000000..c4037abb Binary files /dev/null and b/src/public/data/pack/server/maps/n37_151 differ diff --git a/src/public/data/pack/server/maps/n37_152 b/src/public/data/pack/server/maps/n37_152 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n37_153 b/src/public/data/pack/server/maps/n37_153 new file mode 100644 index 00000000..7f9cdf64 Binary files /dev/null and b/src/public/data/pack/server/maps/n37_153 differ diff --git a/src/public/data/pack/server/maps/n37_154 b/src/public/data/pack/server/maps/n37_154 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n37_48 b/src/public/data/pack/server/maps/n37_48 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n37_49 b/src/public/data/pack/server/maps/n37_49 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n37_50 b/src/public/data/pack/server/maps/n37_50 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n37_51 b/src/public/data/pack/server/maps/n37_51 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n37_52 b/src/public/data/pack/server/maps/n37_52 new file mode 100644 index 00000000..fe3a7209 Binary files /dev/null and b/src/public/data/pack/server/maps/n37_52 differ diff --git a/src/public/data/pack/server/maps/n37_53 b/src/public/data/pack/server/maps/n37_53 new file mode 100644 index 00000000..35add90f Binary files /dev/null and b/src/public/data/pack/server/maps/n37_53 differ diff --git a/src/public/data/pack/server/maps/n37_54 b/src/public/data/pack/server/maps/n37_54 new file mode 100644 index 00000000..b1349136 Binary files /dev/null and b/src/public/data/pack/server/maps/n37_54 differ diff --git a/src/public/data/pack/server/maps/n37_55 b/src/public/data/pack/server/maps/n37_55 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n37_72 b/src/public/data/pack/server/maps/n37_72 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n37_73 b/src/public/data/pack/server/maps/n37_73 new file mode 100644 index 00000000..18e3f92a Binary files /dev/null and b/src/public/data/pack/server/maps/n37_73 differ diff --git a/src/public/data/pack/server/maps/n37_74 b/src/public/data/pack/server/maps/n37_74 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n37_75 b/src/public/data/pack/server/maps/n37_75 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n38_146 b/src/public/data/pack/server/maps/n38_146 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n38_147 b/src/public/data/pack/server/maps/n38_147 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n38_148 b/src/public/data/pack/server/maps/n38_148 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n38_149 b/src/public/data/pack/server/maps/n38_149 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n38_150 b/src/public/data/pack/server/maps/n38_150 new file mode 100644 index 00000000..4245dff9 --- /dev/null +++ b/src/public/data/pack/server/maps/n38_150 @@ -0,0 +1 @@ +ÇÐ \ No newline at end of file diff --git a/src/public/data/pack/server/maps/n38_151 b/src/public/data/pack/server/maps/n38_151 new file mode 100644 index 00000000..9e1fb44e Binary files /dev/null and b/src/public/data/pack/server/maps/n38_151 differ diff --git a/src/public/data/pack/server/maps/n38_152 b/src/public/data/pack/server/maps/n38_152 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n38_153 b/src/public/data/pack/server/maps/n38_153 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n38_154 b/src/public/data/pack/server/maps/n38_154 new file mode 100644 index 00000000..a439c9a7 Binary files /dev/null and b/src/public/data/pack/server/maps/n38_154 differ diff --git a/src/public/data/pack/server/maps/n38_155 b/src/public/data/pack/server/maps/n38_155 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n38_45 b/src/public/data/pack/server/maps/n38_45 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n38_46 b/src/public/data/pack/server/maps/n38_46 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n38_47 b/src/public/data/pack/server/maps/n38_47 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n38_48 b/src/public/data/pack/server/maps/n38_48 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n38_49 b/src/public/data/pack/server/maps/n38_49 new file mode 100644 index 00000000..4d99e3c5 Binary files /dev/null and b/src/public/data/pack/server/maps/n38_49 differ diff --git a/src/public/data/pack/server/maps/n38_50 b/src/public/data/pack/server/maps/n38_50 new file mode 100644 index 00000000..9f8a116f Binary files /dev/null and b/src/public/data/pack/server/maps/n38_50 differ diff --git a/src/public/data/pack/server/maps/n38_51 b/src/public/data/pack/server/maps/n38_51 new file mode 100644 index 00000000..e32124d3 Binary files /dev/null and b/src/public/data/pack/server/maps/n38_51 differ diff --git a/src/public/data/pack/server/maps/n38_52 b/src/public/data/pack/server/maps/n38_52 new file mode 100644 index 00000000..12d5f4f3 Binary files /dev/null and b/src/public/data/pack/server/maps/n38_52 differ diff --git a/src/public/data/pack/server/maps/n38_53 b/src/public/data/pack/server/maps/n38_53 new file mode 100644 index 00000000..3eb80b46 Binary files /dev/null and b/src/public/data/pack/server/maps/n38_53 differ diff --git a/src/public/data/pack/server/maps/n38_54 b/src/public/data/pack/server/maps/n38_54 new file mode 100644 index 00000000..bccc099e Binary files /dev/null and b/src/public/data/pack/server/maps/n38_54 differ diff --git a/src/public/data/pack/server/maps/n38_55 b/src/public/data/pack/server/maps/n38_55 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n38_72 b/src/public/data/pack/server/maps/n38_72 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n38_73 b/src/public/data/pack/server/maps/n38_73 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n38_74 b/src/public/data/pack/server/maps/n38_74 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n39_147 b/src/public/data/pack/server/maps/n39_147 new file mode 100644 index 00000000..37f33c2c Binary files /dev/null and b/src/public/data/pack/server/maps/n39_147 differ diff --git a/src/public/data/pack/server/maps/n39_148 b/src/public/data/pack/server/maps/n39_148 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n39_149 b/src/public/data/pack/server/maps/n39_149 new file mode 100644 index 00000000..02849f6e Binary files /dev/null and b/src/public/data/pack/server/maps/n39_149 differ diff --git a/src/public/data/pack/server/maps/n39_150 b/src/public/data/pack/server/maps/n39_150 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n39_151 b/src/public/data/pack/server/maps/n39_151 new file mode 100644 index 00000000..8a9f708e --- /dev/null +++ b/src/public/data/pack/server/maps/n39_151 @@ -0,0 +1 @@ + ÷Ê HË \ No newline at end of file diff --git a/src/public/data/pack/server/maps/n39_152 b/src/public/data/pack/server/maps/n39_152 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n39_153 b/src/public/data/pack/server/maps/n39_153 new file mode 100644 index 00000000..fc7090f1 Binary files /dev/null and b/src/public/data/pack/server/maps/n39_153 differ diff --git a/src/public/data/pack/server/maps/n39_154 b/src/public/data/pack/server/maps/n39_154 new file mode 100644 index 00000000..b0aa266d Binary files /dev/null and b/src/public/data/pack/server/maps/n39_154 differ diff --git a/src/public/data/pack/server/maps/n39_155 b/src/public/data/pack/server/maps/n39_155 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n39_45 b/src/public/data/pack/server/maps/n39_45 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n39_46 b/src/public/data/pack/server/maps/n39_46 new file mode 100644 index 00000000..63699b16 Binary files /dev/null and b/src/public/data/pack/server/maps/n39_46 differ diff --git a/src/public/data/pack/server/maps/n39_47 b/src/public/data/pack/server/maps/n39_47 new file mode 100644 index 00000000..2649964b Binary files /dev/null and b/src/public/data/pack/server/maps/n39_47 differ diff --git a/src/public/data/pack/server/maps/n39_48 b/src/public/data/pack/server/maps/n39_48 new file mode 100644 index 00000000..905eb000 Binary files /dev/null and b/src/public/data/pack/server/maps/n39_48 differ diff --git a/src/public/data/pack/server/maps/n39_49 b/src/public/data/pack/server/maps/n39_49 new file mode 100644 index 00000000..9180c90d Binary files /dev/null and b/src/public/data/pack/server/maps/n39_49 differ diff --git a/src/public/data/pack/server/maps/n39_50 b/src/public/data/pack/server/maps/n39_50 new file mode 100644 index 00000000..a4a6e36f Binary files /dev/null and b/src/public/data/pack/server/maps/n39_50 differ diff --git a/src/public/data/pack/server/maps/n39_51 b/src/public/data/pack/server/maps/n39_51 new file mode 100644 index 00000000..b165df7d Binary files /dev/null and b/src/public/data/pack/server/maps/n39_51 differ diff --git a/src/public/data/pack/server/maps/n39_52 b/src/public/data/pack/server/maps/n39_52 new file mode 100644 index 00000000..c1c6a117 Binary files /dev/null and b/src/public/data/pack/server/maps/n39_52 differ diff --git a/src/public/data/pack/server/maps/n39_53 b/src/public/data/pack/server/maps/n39_53 new file mode 100644 index 00000000..6a4fff0b Binary files /dev/null and b/src/public/data/pack/server/maps/n39_53 differ diff --git a/src/public/data/pack/server/maps/n39_54 b/src/public/data/pack/server/maps/n39_54 new file mode 100644 index 00000000..bbab1f13 Binary files /dev/null and b/src/public/data/pack/server/maps/n39_54 differ diff --git a/src/public/data/pack/server/maps/n39_55 b/src/public/data/pack/server/maps/n39_55 new file mode 100644 index 00000000..b8825c9b Binary files /dev/null and b/src/public/data/pack/server/maps/n39_55 differ diff --git a/src/public/data/pack/server/maps/n39_72 b/src/public/data/pack/server/maps/n39_72 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n39_73 b/src/public/data/pack/server/maps/n39_73 new file mode 100644 index 00000000..3dca71d0 --- /dev/null +++ b/src/public/data/pack/server/maps/n39_73 @@ -0,0 +1 @@ +ˆ ª† ¯‡ k‰ \ No newline at end of file diff --git a/src/public/data/pack/server/maps/n39_74 b/src/public/data/pack/server/maps/n39_74 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n39_75 b/src/public/data/pack/server/maps/n39_75 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n39_76 b/src/public/data/pack/server/maps/n39_76 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n40_147 b/src/public/data/pack/server/maps/n40_147 new file mode 100644 index 00000000..7ae87da3 Binary files /dev/null and b/src/public/data/pack/server/maps/n40_147 differ diff --git a/src/public/data/pack/server/maps/n40_148 b/src/public/data/pack/server/maps/n40_148 new file mode 100644 index 00000000..6accbea4 Binary files /dev/null and b/src/public/data/pack/server/maps/n40_148 differ diff --git a/src/public/data/pack/server/maps/n40_149 b/src/public/data/pack/server/maps/n40_149 new file mode 100644 index 00000000..d6e1b670 Binary files /dev/null and b/src/public/data/pack/server/maps/n40_149 differ diff --git a/src/public/data/pack/server/maps/n40_150 b/src/public/data/pack/server/maps/n40_150 new file mode 100644 index 00000000..a01740c7 Binary files /dev/null and b/src/public/data/pack/server/maps/n40_150 differ diff --git a/src/public/data/pack/server/maps/n40_151 b/src/public/data/pack/server/maps/n40_151 new file mode 100644 index 00000000..8b54819d Binary files /dev/null and b/src/public/data/pack/server/maps/n40_151 differ diff --git a/src/public/data/pack/server/maps/n40_152 b/src/public/data/pack/server/maps/n40_152 new file mode 100644 index 00000000..a0ecc9e8 Binary files /dev/null and b/src/public/data/pack/server/maps/n40_152 differ diff --git a/src/public/data/pack/server/maps/n40_153 b/src/public/data/pack/server/maps/n40_153 new file mode 100644 index 00000000..b0127767 Binary files /dev/null and b/src/public/data/pack/server/maps/n40_153 differ diff --git a/src/public/data/pack/server/maps/n40_154 b/src/public/data/pack/server/maps/n40_154 new file mode 100644 index 00000000..57dfdc3d Binary files /dev/null and b/src/public/data/pack/server/maps/n40_154 differ diff --git a/src/public/data/pack/server/maps/n40_45 b/src/public/data/pack/server/maps/n40_45 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n40_46 b/src/public/data/pack/server/maps/n40_46 new file mode 100644 index 00000000..99a5be7d Binary files /dev/null and b/src/public/data/pack/server/maps/n40_46 differ diff --git a/src/public/data/pack/server/maps/n40_47 b/src/public/data/pack/server/maps/n40_47 new file mode 100644 index 00000000..d27993d2 Binary files /dev/null and b/src/public/data/pack/server/maps/n40_47 differ diff --git a/src/public/data/pack/server/maps/n40_48 b/src/public/data/pack/server/maps/n40_48 new file mode 100644 index 00000000..2f9cb2a1 Binary files /dev/null and b/src/public/data/pack/server/maps/n40_48 differ diff --git a/src/public/data/pack/server/maps/n40_49 b/src/public/data/pack/server/maps/n40_49 new file mode 100644 index 00000000..661e8bb8 Binary files /dev/null and b/src/public/data/pack/server/maps/n40_49 differ diff --git a/src/public/data/pack/server/maps/n40_50 b/src/public/data/pack/server/maps/n40_50 new file mode 100644 index 00000000..35c22e7e Binary files /dev/null and b/src/public/data/pack/server/maps/n40_50 differ diff --git a/src/public/data/pack/server/maps/n40_51 b/src/public/data/pack/server/maps/n40_51 new file mode 100644 index 00000000..4ac6aebb Binary files /dev/null and b/src/public/data/pack/server/maps/n40_51 differ diff --git a/src/public/data/pack/server/maps/n40_52 b/src/public/data/pack/server/maps/n40_52 new file mode 100644 index 00000000..e611cf4b Binary files /dev/null and b/src/public/data/pack/server/maps/n40_52 differ diff --git a/src/public/data/pack/server/maps/n40_53 b/src/public/data/pack/server/maps/n40_53 new file mode 100644 index 00000000..2d419fa3 Binary files /dev/null and b/src/public/data/pack/server/maps/n40_53 differ diff --git a/src/public/data/pack/server/maps/n40_54 b/src/public/data/pack/server/maps/n40_54 new file mode 100644 index 00000000..4b9b5897 Binary files /dev/null and b/src/public/data/pack/server/maps/n40_54 differ diff --git a/src/public/data/pack/server/maps/n40_55 b/src/public/data/pack/server/maps/n40_55 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n40_72 b/src/public/data/pack/server/maps/n40_72 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n40_73 b/src/public/data/pack/server/maps/n40_73 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n40_74 b/src/public/data/pack/server/maps/n40_74 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n40_75 b/src/public/data/pack/server/maps/n40_75 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n40_76 b/src/public/data/pack/server/maps/n40_76 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n41_146 b/src/public/data/pack/server/maps/n41_146 new file mode 100644 index 00000000..a153857c --- /dev/null +++ b/src/public/data/pack/server/maps/n41_146 @@ -0,0 +1 @@ +/ô±ó \ No newline at end of file diff --git a/src/public/data/pack/server/maps/n41_149 b/src/public/data/pack/server/maps/n41_149 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n41_151 b/src/public/data/pack/server/maps/n41_151 new file mode 100644 index 00000000..0738fdc3 Binary files /dev/null and b/src/public/data/pack/server/maps/n41_151 differ diff --git a/src/public/data/pack/server/maps/n41_152 b/src/public/data/pack/server/maps/n41_152 new file mode 100644 index 00000000..2de291d1 Binary files /dev/null and b/src/public/data/pack/server/maps/n41_152 differ diff --git a/src/public/data/pack/server/maps/n41_153 b/src/public/data/pack/server/maps/n41_153 new file mode 100644 index 00000000..147f5a87 Binary files /dev/null and b/src/public/data/pack/server/maps/n41_153 differ diff --git a/src/public/data/pack/server/maps/n41_154 b/src/public/data/pack/server/maps/n41_154 new file mode 100644 index 00000000..78370ccc Binary files /dev/null and b/src/public/data/pack/server/maps/n41_154 differ diff --git a/src/public/data/pack/server/maps/n41_45 b/src/public/data/pack/server/maps/n41_45 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n41_46 b/src/public/data/pack/server/maps/n41_46 new file mode 100644 index 00000000..c2fa0a37 --- /dev/null +++ b/src/public/data/pack/server/maps/n41_46 @@ -0,0 +1 @@ +¥ò \ No newline at end of file diff --git a/src/public/data/pack/server/maps/n41_47 b/src/public/data/pack/server/maps/n41_47 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n41_48 b/src/public/data/pack/server/maps/n41_48 new file mode 100644 index 00000000..024de934 Binary files /dev/null and b/src/public/data/pack/server/maps/n41_48 differ diff --git a/src/public/data/pack/server/maps/n41_49 b/src/public/data/pack/server/maps/n41_49 new file mode 100644 index 00000000..e1170b9b --- /dev/null +++ b/src/public/data/pack/server/maps/n41_49 @@ -0,0 +1 @@ +c+Ð+ Ï \ No newline at end of file diff --git a/src/public/data/pack/server/maps/n41_50 b/src/public/data/pack/server/maps/n41_50 new file mode 100644 index 00000000..f1eea6eb Binary files /dev/null and b/src/public/data/pack/server/maps/n41_50 differ diff --git a/src/public/data/pack/server/maps/n41_51 b/src/public/data/pack/server/maps/n41_51 new file mode 100644 index 00000000..b7f35e7c Binary files /dev/null and b/src/public/data/pack/server/maps/n41_51 differ diff --git a/src/public/data/pack/server/maps/n41_52 b/src/public/data/pack/server/maps/n41_52 new file mode 100644 index 00000000..efa7a4ea Binary files /dev/null and b/src/public/data/pack/server/maps/n41_52 differ diff --git a/src/public/data/pack/server/maps/n41_53 b/src/public/data/pack/server/maps/n41_53 new file mode 100644 index 00000000..260220f4 Binary files /dev/null and b/src/public/data/pack/server/maps/n41_53 differ diff --git a/src/public/data/pack/server/maps/n41_54 b/src/public/data/pack/server/maps/n41_54 new file mode 100644 index 00000000..faddb022 Binary files /dev/null and b/src/public/data/pack/server/maps/n41_54 differ diff --git a/src/public/data/pack/server/maps/n41_55 b/src/public/data/pack/server/maps/n41_55 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n41_56 b/src/public/data/pack/server/maps/n41_56 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n41_72 b/src/public/data/pack/server/maps/n41_72 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n41_73 b/src/public/data/pack/server/maps/n41_73 new file mode 100644 index 00000000..57616743 Binary files /dev/null and b/src/public/data/pack/server/maps/n41_73 differ diff --git a/src/public/data/pack/server/maps/n41_74 b/src/public/data/pack/server/maps/n41_74 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n41_75 b/src/public/data/pack/server/maps/n41_75 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n42_144 b/src/public/data/pack/server/maps/n42_144 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n42_145 b/src/public/data/pack/server/maps/n42_145 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n42_146 b/src/public/data/pack/server/maps/n42_146 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n42_151 b/src/public/data/pack/server/maps/n42_151 new file mode 100644 index 00000000..3c32c742 Binary files /dev/null and b/src/public/data/pack/server/maps/n42_151 differ diff --git a/src/public/data/pack/server/maps/n42_152 b/src/public/data/pack/server/maps/n42_152 new file mode 100644 index 00000000..883e6b74 Binary files /dev/null and b/src/public/data/pack/server/maps/n42_152 differ diff --git a/src/public/data/pack/server/maps/n42_153 b/src/public/data/pack/server/maps/n42_153 new file mode 100644 index 00000000..0f69e9eb Binary files /dev/null and b/src/public/data/pack/server/maps/n42_153 differ diff --git a/src/public/data/pack/server/maps/n42_49 b/src/public/data/pack/server/maps/n42_49 new file mode 100644 index 00000000..f4d3d5ec Binary files /dev/null and b/src/public/data/pack/server/maps/n42_49 differ diff --git a/src/public/data/pack/server/maps/n42_50 b/src/public/data/pack/server/maps/n42_50 new file mode 100644 index 00000000..2d2511e5 Binary files /dev/null and b/src/public/data/pack/server/maps/n42_50 differ diff --git a/src/public/data/pack/server/maps/n42_51 b/src/public/data/pack/server/maps/n42_51 new file mode 100644 index 00000000..435c073f Binary files /dev/null and b/src/public/data/pack/server/maps/n42_51 differ diff --git a/src/public/data/pack/server/maps/n42_52 b/src/public/data/pack/server/maps/n42_52 new file mode 100644 index 00000000..d5020da9 Binary files /dev/null and b/src/public/data/pack/server/maps/n42_52 differ diff --git a/src/public/data/pack/server/maps/n42_53 b/src/public/data/pack/server/maps/n42_53 new file mode 100644 index 00000000..4280f419 Binary files /dev/null and b/src/public/data/pack/server/maps/n42_53 differ diff --git a/src/public/data/pack/server/maps/n42_54 b/src/public/data/pack/server/maps/n42_54 new file mode 100644 index 00000000..4ae49c74 Binary files /dev/null and b/src/public/data/pack/server/maps/n42_54 differ diff --git a/src/public/data/pack/server/maps/n42_55 b/src/public/data/pack/server/maps/n42_55 new file mode 100644 index 00000000..42e5d40a Binary files /dev/null and b/src/public/data/pack/server/maps/n42_55 differ diff --git a/src/public/data/pack/server/maps/n42_56 b/src/public/data/pack/server/maps/n42_56 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n42_72 b/src/public/data/pack/server/maps/n42_72 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n42_73 b/src/public/data/pack/server/maps/n42_73 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n42_74 b/src/public/data/pack/server/maps/n42_74 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n42_75 b/src/public/data/pack/server/maps/n42_75 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n43_144 b/src/public/data/pack/server/maps/n43_144 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n43_145 b/src/public/data/pack/server/maps/n43_145 new file mode 100644 index 00000000..1d963f2e Binary files /dev/null and b/src/public/data/pack/server/maps/n43_145 differ diff --git a/src/public/data/pack/server/maps/n43_146 b/src/public/data/pack/server/maps/n43_146 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n43_153 b/src/public/data/pack/server/maps/n43_153 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n43_154 b/src/public/data/pack/server/maps/n43_154 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n43_45 b/src/public/data/pack/server/maps/n43_45 new file mode 100644 index 00000000..1882ddf6 Binary files /dev/null and b/src/public/data/pack/server/maps/n43_45 differ diff --git a/src/public/data/pack/server/maps/n43_46 b/src/public/data/pack/server/maps/n43_46 new file mode 100644 index 00000000..4fd82116 Binary files /dev/null and b/src/public/data/pack/server/maps/n43_46 differ diff --git a/src/public/data/pack/server/maps/n43_47 b/src/public/data/pack/server/maps/n43_47 new file mode 100644 index 00000000..49dec103 Binary files /dev/null and b/src/public/data/pack/server/maps/n43_47 differ diff --git a/src/public/data/pack/server/maps/n43_48 b/src/public/data/pack/server/maps/n43_48 new file mode 100644 index 00000000..336eaf5b Binary files /dev/null and b/src/public/data/pack/server/maps/n43_48 differ diff --git a/src/public/data/pack/server/maps/n43_49 b/src/public/data/pack/server/maps/n43_49 new file mode 100644 index 00000000..d9b7928e Binary files /dev/null and b/src/public/data/pack/server/maps/n43_49 differ diff --git a/src/public/data/pack/server/maps/n43_50 b/src/public/data/pack/server/maps/n43_50 new file mode 100644 index 00000000..5048db1f Binary files /dev/null and b/src/public/data/pack/server/maps/n43_50 differ diff --git a/src/public/data/pack/server/maps/n43_51 b/src/public/data/pack/server/maps/n43_51 new file mode 100644 index 00000000..1bd59e0b --- /dev/null +++ b/src/public/data/pack/server/maps/n43_51 @@ -0,0 +1,8 @@ +îL·Žî˜îîV¿ îî•î›À¾NîUËîîLîWî +î I< ‰< +Kî +Pî +y½ +¿ +“< +Ï< øº¹•¿î’îÛîRÀ˜îîZ¾Ï¿ÖîîRîT¾ÐÀ \ No newline at end of file diff --git a/src/public/data/pack/server/maps/n43_52 b/src/public/data/pack/server/maps/n43_52 new file mode 100644 index 00000000..54e0f3d5 Binary files /dev/null and b/src/public/data/pack/server/maps/n43_52 differ diff --git a/src/public/data/pack/server/maps/n43_53 b/src/public/data/pack/server/maps/n43_53 new file mode 100644 index 00000000..430f4a57 Binary files /dev/null and b/src/public/data/pack/server/maps/n43_53 differ diff --git a/src/public/data/pack/server/maps/n43_54 b/src/public/data/pack/server/maps/n43_54 new file mode 100644 index 00000000..bb8293b0 Binary files /dev/null and b/src/public/data/pack/server/maps/n43_54 differ diff --git a/src/public/data/pack/server/maps/n43_55 b/src/public/data/pack/server/maps/n43_55 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n43_56 b/src/public/data/pack/server/maps/n43_56 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n43_72 b/src/public/data/pack/server/maps/n43_72 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n43_73 b/src/public/data/pack/server/maps/n43_73 new file mode 100644 index 00000000..1ed5fe3a Binary files /dev/null and b/src/public/data/pack/server/maps/n43_73 differ diff --git a/src/public/data/pack/server/maps/n43_74 b/src/public/data/pack/server/maps/n43_74 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n43_75 b/src/public/data/pack/server/maps/n43_75 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n44_144 b/src/public/data/pack/server/maps/n44_144 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n44_145 b/src/public/data/pack/server/maps/n44_145 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n44_146 b/src/public/data/pack/server/maps/n44_146 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n44_148 b/src/public/data/pack/server/maps/n44_148 new file mode 100644 index 00000000..391b9757 Binary files /dev/null and b/src/public/data/pack/server/maps/n44_148 differ diff --git a/src/public/data/pack/server/maps/n44_149 b/src/public/data/pack/server/maps/n44_149 new file mode 100644 index 00000000..1a290175 Binary files /dev/null and b/src/public/data/pack/server/maps/n44_149 differ diff --git a/src/public/data/pack/server/maps/n44_150 b/src/public/data/pack/server/maps/n44_150 new file mode 100644 index 00000000..0ce080cf Binary files /dev/null and b/src/public/data/pack/server/maps/n44_150 differ diff --git a/src/public/data/pack/server/maps/n44_151 b/src/public/data/pack/server/maps/n44_151 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n44_152 b/src/public/data/pack/server/maps/n44_152 new file mode 100644 index 00000000..1b0accf1 Binary files /dev/null and b/src/public/data/pack/server/maps/n44_152 differ diff --git a/src/public/data/pack/server/maps/n44_153 b/src/public/data/pack/server/maps/n44_153 new file mode 100644 index 00000000..7b389f28 Binary files /dev/null and b/src/public/data/pack/server/maps/n44_153 differ diff --git a/src/public/data/pack/server/maps/n44_154 b/src/public/data/pack/server/maps/n44_154 new file mode 100644 index 00000000..57c36b94 Binary files /dev/null and b/src/public/data/pack/server/maps/n44_154 differ diff --git a/src/public/data/pack/server/maps/n44_155 b/src/public/data/pack/server/maps/n44_155 new file mode 100644 index 00000000..8f5fc61b Binary files /dev/null and b/src/public/data/pack/server/maps/n44_155 differ diff --git a/src/public/data/pack/server/maps/n44_45 b/src/public/data/pack/server/maps/n44_45 new file mode 100644 index 00000000..8305fa21 Binary files /dev/null and b/src/public/data/pack/server/maps/n44_45 differ diff --git a/src/public/data/pack/server/maps/n44_46 b/src/public/data/pack/server/maps/n44_46 new file mode 100644 index 00000000..0e54f0c3 Binary files /dev/null and b/src/public/data/pack/server/maps/n44_46 differ diff --git a/src/public/data/pack/server/maps/n44_47 b/src/public/data/pack/server/maps/n44_47 new file mode 100644 index 00000000..3794d8a8 Binary files /dev/null and b/src/public/data/pack/server/maps/n44_47 differ diff --git a/src/public/data/pack/server/maps/n44_48 b/src/public/data/pack/server/maps/n44_48 new file mode 100644 index 00000000..3db0621d Binary files /dev/null and b/src/public/data/pack/server/maps/n44_48 differ diff --git a/src/public/data/pack/server/maps/n44_49 b/src/public/data/pack/server/maps/n44_49 new file mode 100644 index 00000000..26d19341 Binary files /dev/null and b/src/public/data/pack/server/maps/n44_49 differ diff --git a/src/public/data/pack/server/maps/n44_50 b/src/public/data/pack/server/maps/n44_50 new file mode 100644 index 00000000..1fb7a0ac Binary files /dev/null and b/src/public/data/pack/server/maps/n44_50 differ diff --git a/src/public/data/pack/server/maps/n44_51 b/src/public/data/pack/server/maps/n44_51 new file mode 100644 index 00000000..aff285af Binary files /dev/null and b/src/public/data/pack/server/maps/n44_51 differ diff --git a/src/public/data/pack/server/maps/n44_52 b/src/public/data/pack/server/maps/n44_52 new file mode 100644 index 00000000..4c23c233 Binary files /dev/null and b/src/public/data/pack/server/maps/n44_52 differ diff --git a/src/public/data/pack/server/maps/n44_53 b/src/public/data/pack/server/maps/n44_53 new file mode 100644 index 00000000..cfd3c54f Binary files /dev/null and b/src/public/data/pack/server/maps/n44_53 differ diff --git a/src/public/data/pack/server/maps/n44_54 b/src/public/data/pack/server/maps/n44_54 new file mode 100644 index 00000000..2876c17a Binary files /dev/null and b/src/public/data/pack/server/maps/n44_54 differ diff --git a/src/public/data/pack/server/maps/n44_55 b/src/public/data/pack/server/maps/n44_55 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n44_72 b/src/public/data/pack/server/maps/n44_72 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n44_73 b/src/public/data/pack/server/maps/n44_73 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n44_74 b/src/public/data/pack/server/maps/n44_74 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n44_75 b/src/public/data/pack/server/maps/n44_75 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n45_145 b/src/public/data/pack/server/maps/n45_145 new file mode 100644 index 00000000..61b65837 --- /dev/null +++ b/src/public/data/pack/server/maps/n45_145 @@ -0,0 +1 @@ +÷Žöàø ùiùjù X÷ Yö ù Žù åö Cø Nù …ù ù ¥ùSøUù \ No newline at end of file diff --git a/src/public/data/pack/server/maps/n45_146 b/src/public/data/pack/server/maps/n45_146 new file mode 100644 index 00000000..fc6e7deb --- /dev/null +++ b/src/public/data/pack/server/maps/n45_146 @@ -0,0 +1,4 @@ +Œöù ø%öSøÖ÷(÷ŽøÅö÷•ùØöKù +ø…÷ ù Iù +Ëø ø +ù \ No newline at end of file diff --git a/src/public/data/pack/server/maps/n45_148 b/src/public/data/pack/server/maps/n45_148 new file mode 100644 index 00000000..aa8389fe Binary files /dev/null and b/src/public/data/pack/server/maps/n45_148 differ diff --git a/src/public/data/pack/server/maps/n45_150 b/src/public/data/pack/server/maps/n45_150 new file mode 100644 index 00000000..1db605a4 Binary files /dev/null and b/src/public/data/pack/server/maps/n45_150 differ diff --git a/src/public/data/pack/server/maps/n45_151 b/src/public/data/pack/server/maps/n45_151 new file mode 100644 index 00000000..f9f09456 Binary files /dev/null and b/src/public/data/pack/server/maps/n45_151 differ diff --git a/src/public/data/pack/server/maps/n45_152 b/src/public/data/pack/server/maps/n45_152 new file mode 100644 index 00000000..15ddab79 Binary files /dev/null and b/src/public/data/pack/server/maps/n45_152 differ diff --git a/src/public/data/pack/server/maps/n45_153 b/src/public/data/pack/server/maps/n45_153 new file mode 100644 index 00000000..b6c898e3 Binary files /dev/null and b/src/public/data/pack/server/maps/n45_153 differ diff --git a/src/public/data/pack/server/maps/n45_154 b/src/public/data/pack/server/maps/n45_154 new file mode 100644 index 00000000..d1dee37a Binary files /dev/null and b/src/public/data/pack/server/maps/n45_154 differ diff --git a/src/public/data/pack/server/maps/n45_155 b/src/public/data/pack/server/maps/n45_155 new file mode 100644 index 00000000..64110dba Binary files /dev/null and b/src/public/data/pack/server/maps/n45_155 differ diff --git a/src/public/data/pack/server/maps/n45_45 b/src/public/data/pack/server/maps/n45_45 new file mode 100644 index 00000000..fb88854a Binary files /dev/null and b/src/public/data/pack/server/maps/n45_45 differ diff --git a/src/public/data/pack/server/maps/n45_46 b/src/public/data/pack/server/maps/n45_46 new file mode 100644 index 00000000..469d68cf Binary files /dev/null and b/src/public/data/pack/server/maps/n45_46 differ diff --git a/src/public/data/pack/server/maps/n45_47 b/src/public/data/pack/server/maps/n45_47 new file mode 100644 index 00000000..68a90f47 Binary files /dev/null and b/src/public/data/pack/server/maps/n45_47 differ diff --git a/src/public/data/pack/server/maps/n45_48 b/src/public/data/pack/server/maps/n45_48 new file mode 100644 index 00000000..4b86f6d1 Binary files /dev/null and b/src/public/data/pack/server/maps/n45_48 differ diff --git a/src/public/data/pack/server/maps/n45_49 b/src/public/data/pack/server/maps/n45_49 new file mode 100644 index 00000000..51cd210d Binary files /dev/null and b/src/public/data/pack/server/maps/n45_49 differ diff --git a/src/public/data/pack/server/maps/n45_50 b/src/public/data/pack/server/maps/n45_50 new file mode 100644 index 00000000..e8a9a8ce Binary files /dev/null and b/src/public/data/pack/server/maps/n45_50 differ diff --git a/src/public/data/pack/server/maps/n45_51 b/src/public/data/pack/server/maps/n45_51 new file mode 100644 index 00000000..3c519038 Binary files /dev/null and b/src/public/data/pack/server/maps/n45_51 differ diff --git a/src/public/data/pack/server/maps/n45_52 b/src/public/data/pack/server/maps/n45_52 new file mode 100644 index 00000000..c6f580df Binary files /dev/null and b/src/public/data/pack/server/maps/n45_52 differ diff --git a/src/public/data/pack/server/maps/n45_53 b/src/public/data/pack/server/maps/n45_53 new file mode 100644 index 00000000..1c9b4c59 Binary files /dev/null and b/src/public/data/pack/server/maps/n45_53 differ diff --git a/src/public/data/pack/server/maps/n45_54 b/src/public/data/pack/server/maps/n45_54 new file mode 100644 index 00000000..923b892b Binary files /dev/null and b/src/public/data/pack/server/maps/n45_54 differ diff --git a/src/public/data/pack/server/maps/n45_55 b/src/public/data/pack/server/maps/n45_55 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n45_56 b/src/public/data/pack/server/maps/n45_56 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n45_57 b/src/public/data/pack/server/maps/n45_57 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n45_58 b/src/public/data/pack/server/maps/n45_58 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n45_59 b/src/public/data/pack/server/maps/n45_59 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n45_60 b/src/public/data/pack/server/maps/n45_60 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n45_61 b/src/public/data/pack/server/maps/n45_61 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n45_62 b/src/public/data/pack/server/maps/n45_62 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n45_73 b/src/public/data/pack/server/maps/n45_73 new file mode 100644 index 00000000..3b7d60fa Binary files /dev/null and b/src/public/data/pack/server/maps/n45_73 differ diff --git a/src/public/data/pack/server/maps/n45_74 b/src/public/data/pack/server/maps/n45_74 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n45_75 b/src/public/data/pack/server/maps/n45_75 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n45_76 b/src/public/data/pack/server/maps/n45_76 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n46_149 b/src/public/data/pack/server/maps/n46_149 new file mode 100644 index 00000000..43754f82 Binary files /dev/null and b/src/public/data/pack/server/maps/n46_149 differ diff --git a/src/public/data/pack/server/maps/n46_150 b/src/public/data/pack/server/maps/n46_150 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n46_152 b/src/public/data/pack/server/maps/n46_152 new file mode 100644 index 00000000..3f742f5f Binary files /dev/null and b/src/public/data/pack/server/maps/n46_152 differ diff --git a/src/public/data/pack/server/maps/n46_153 b/src/public/data/pack/server/maps/n46_153 new file mode 100644 index 00000000..0e0f511a Binary files /dev/null and b/src/public/data/pack/server/maps/n46_153 differ diff --git a/src/public/data/pack/server/maps/n46_154 b/src/public/data/pack/server/maps/n46_154 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n46_161 b/src/public/data/pack/server/maps/n46_161 new file mode 100644 index 00000000..fa40526a Binary files /dev/null and b/src/public/data/pack/server/maps/n46_161 differ diff --git a/src/public/data/pack/server/maps/n46_45 b/src/public/data/pack/server/maps/n46_45 new file mode 100644 index 00000000..59be7fd8 Binary files /dev/null and b/src/public/data/pack/server/maps/n46_45 differ diff --git a/src/public/data/pack/server/maps/n46_46 b/src/public/data/pack/server/maps/n46_46 new file mode 100644 index 00000000..0f138ba2 Binary files /dev/null and b/src/public/data/pack/server/maps/n46_46 differ diff --git a/src/public/data/pack/server/maps/n46_47 b/src/public/data/pack/server/maps/n46_47 new file mode 100644 index 00000000..b5f462b9 Binary files /dev/null and b/src/public/data/pack/server/maps/n46_47 differ diff --git a/src/public/data/pack/server/maps/n46_48 b/src/public/data/pack/server/maps/n46_48 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n46_49 b/src/public/data/pack/server/maps/n46_49 new file mode 100644 index 00000000..1e5467a3 Binary files /dev/null and b/src/public/data/pack/server/maps/n46_49 differ diff --git a/src/public/data/pack/server/maps/n46_50 b/src/public/data/pack/server/maps/n46_50 new file mode 100644 index 00000000..74e44373 Binary files /dev/null and b/src/public/data/pack/server/maps/n46_50 differ diff --git a/src/public/data/pack/server/maps/n46_51 b/src/public/data/pack/server/maps/n46_51 new file mode 100644 index 00000000..e7f67e27 Binary files /dev/null and b/src/public/data/pack/server/maps/n46_51 differ diff --git a/src/public/data/pack/server/maps/n46_52 b/src/public/data/pack/server/maps/n46_52 new file mode 100644 index 00000000..bd75d0c0 Binary files /dev/null and b/src/public/data/pack/server/maps/n46_52 differ diff --git a/src/public/data/pack/server/maps/n46_53 b/src/public/data/pack/server/maps/n46_53 new file mode 100644 index 00000000..f2959b0f Binary files /dev/null and b/src/public/data/pack/server/maps/n46_53 differ diff --git a/src/public/data/pack/server/maps/n46_54 b/src/public/data/pack/server/maps/n46_54 new file mode 100644 index 00000000..f92b1734 Binary files /dev/null and b/src/public/data/pack/server/maps/n46_54 differ diff --git a/src/public/data/pack/server/maps/n46_55 b/src/public/data/pack/server/maps/n46_55 new file mode 100644 index 00000000..8c41350b Binary files /dev/null and b/src/public/data/pack/server/maps/n46_55 differ diff --git a/src/public/data/pack/server/maps/n46_56 b/src/public/data/pack/server/maps/n46_56 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n46_57 b/src/public/data/pack/server/maps/n46_57 new file mode 100644 index 00000000..6f3f2b94 Binary files /dev/null and b/src/public/data/pack/server/maps/n46_57 differ diff --git a/src/public/data/pack/server/maps/n46_58 b/src/public/data/pack/server/maps/n46_58 new file mode 100644 index 00000000..a2934a58 Binary files /dev/null and b/src/public/data/pack/server/maps/n46_58 differ diff --git a/src/public/data/pack/server/maps/n46_59 b/src/public/data/pack/server/maps/n46_59 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n46_60 b/src/public/data/pack/server/maps/n46_60 new file mode 100644 index 00000000..48088004 Binary files /dev/null and b/src/public/data/pack/server/maps/n46_60 differ diff --git a/src/public/data/pack/server/maps/n46_61 b/src/public/data/pack/server/maps/n46_61 new file mode 100644 index 00000000..e5bfe25d Binary files /dev/null and b/src/public/data/pack/server/maps/n46_61 differ diff --git a/src/public/data/pack/server/maps/n46_62 b/src/public/data/pack/server/maps/n46_62 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n46_75 b/src/public/data/pack/server/maps/n46_75 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n47_148 b/src/public/data/pack/server/maps/n47_148 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n47_149 b/src/public/data/pack/server/maps/n47_149 new file mode 100644 index 00000000..4b931088 Binary files /dev/null and b/src/public/data/pack/server/maps/n47_149 differ diff --git a/src/public/data/pack/server/maps/n47_150 b/src/public/data/pack/server/maps/n47_150 new file mode 100644 index 00000000..356888e2 --- /dev/null +++ b/src/public/data/pack/server/maps/n47_150 @@ -0,0 +1 @@ +9¨ç \ No newline at end of file diff --git a/src/public/data/pack/server/maps/n47_152 b/src/public/data/pack/server/maps/n47_152 new file mode 100644 index 00000000..8ab4a966 Binary files /dev/null and b/src/public/data/pack/server/maps/n47_152 differ diff --git a/src/public/data/pack/server/maps/n47_153 b/src/public/data/pack/server/maps/n47_153 new file mode 100644 index 00000000..df293ff1 Binary files /dev/null and b/src/public/data/pack/server/maps/n47_153 differ diff --git a/src/public/data/pack/server/maps/n47_160 b/src/public/data/pack/server/maps/n47_160 new file mode 100644 index 00000000..aa23f474 Binary files /dev/null and b/src/public/data/pack/server/maps/n47_160 differ diff --git a/src/public/data/pack/server/maps/n47_161 b/src/public/data/pack/server/maps/n47_161 new file mode 100644 index 00000000..a779faea Binary files /dev/null and b/src/public/data/pack/server/maps/n47_161 differ diff --git a/src/public/data/pack/server/maps/n47_47 b/src/public/data/pack/server/maps/n47_47 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n47_48 b/src/public/data/pack/server/maps/n47_48 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n47_49 b/src/public/data/pack/server/maps/n47_49 new file mode 100644 index 00000000..483a0f84 Binary files /dev/null and b/src/public/data/pack/server/maps/n47_49 differ diff --git a/src/public/data/pack/server/maps/n47_50 b/src/public/data/pack/server/maps/n47_50 new file mode 100644 index 00000000..7e415d30 Binary files /dev/null and b/src/public/data/pack/server/maps/n47_50 differ diff --git a/src/public/data/pack/server/maps/n47_51 b/src/public/data/pack/server/maps/n47_51 new file mode 100644 index 00000000..835c8ef5 Binary files /dev/null and b/src/public/data/pack/server/maps/n47_51 differ diff --git a/src/public/data/pack/server/maps/n47_52 b/src/public/data/pack/server/maps/n47_52 new file mode 100644 index 00000000..407daeed Binary files /dev/null and b/src/public/data/pack/server/maps/n47_52 differ diff --git a/src/public/data/pack/server/maps/n47_53 b/src/public/data/pack/server/maps/n47_53 new file mode 100644 index 00000000..ca3d808a Binary files /dev/null and b/src/public/data/pack/server/maps/n47_53 differ diff --git a/src/public/data/pack/server/maps/n47_54 b/src/public/data/pack/server/maps/n47_54 new file mode 100644 index 00000000..6fe329a1 Binary files /dev/null and b/src/public/data/pack/server/maps/n47_54 differ diff --git a/src/public/data/pack/server/maps/n47_55 b/src/public/data/pack/server/maps/n47_55 new file mode 100644 index 00000000..b1058f3c Binary files /dev/null and b/src/public/data/pack/server/maps/n47_55 differ diff --git a/src/public/data/pack/server/maps/n47_56 b/src/public/data/pack/server/maps/n47_56 new file mode 100644 index 00000000..d6d49007 Binary files /dev/null and b/src/public/data/pack/server/maps/n47_56 differ diff --git a/src/public/data/pack/server/maps/n47_57 b/src/public/data/pack/server/maps/n47_57 new file mode 100644 index 00000000..4934e26c Binary files /dev/null and b/src/public/data/pack/server/maps/n47_57 differ diff --git a/src/public/data/pack/server/maps/n47_58 b/src/public/data/pack/server/maps/n47_58 new file mode 100644 index 00000000..7b9203ed Binary files /dev/null and b/src/public/data/pack/server/maps/n47_58 differ diff --git a/src/public/data/pack/server/maps/n47_59 b/src/public/data/pack/server/maps/n47_59 new file mode 100644 index 00000000..e373a8bd Binary files /dev/null and b/src/public/data/pack/server/maps/n47_59 differ diff --git a/src/public/data/pack/server/maps/n47_60 b/src/public/data/pack/server/maps/n47_60 new file mode 100644 index 00000000..2affdd25 Binary files /dev/null and b/src/public/data/pack/server/maps/n47_60 differ diff --git a/src/public/data/pack/server/maps/n47_61 b/src/public/data/pack/server/maps/n47_61 new file mode 100644 index 00000000..812dd19b Binary files /dev/null and b/src/public/data/pack/server/maps/n47_61 differ diff --git a/src/public/data/pack/server/maps/n47_62 b/src/public/data/pack/server/maps/n47_62 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n47_75 b/src/public/data/pack/server/maps/n47_75 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n48_148 b/src/public/data/pack/server/maps/n48_148 new file mode 100644 index 00000000..b4bbf4fa --- /dev/null +++ b/src/public/data/pack/server/maps/n48_148 @@ -0,0 +1 @@ +`´¯¶ê¶-¶1¶©¶î¶ñ¶(¶j¶n¶¥°ì¶ñ¶ n¶ \ No newline at end of file diff --git a/src/public/data/pack/server/maps/n48_149 b/src/public/data/pack/server/maps/n48_149 new file mode 100644 index 00000000..db61355e Binary files /dev/null and b/src/public/data/pack/server/maps/n48_149 differ diff --git a/src/public/data/pack/server/maps/n48_152 b/src/public/data/pack/server/maps/n48_152 new file mode 100644 index 00000000..fc86d5ca Binary files /dev/null and b/src/public/data/pack/server/maps/n48_152 differ diff --git a/src/public/data/pack/server/maps/n48_153 b/src/public/data/pack/server/maps/n48_153 new file mode 100644 index 00000000..c2dcf7df Binary files /dev/null and b/src/public/data/pack/server/maps/n48_153 differ diff --git a/src/public/data/pack/server/maps/n48_154 b/src/public/data/pack/server/maps/n48_154 new file mode 100644 index 00000000..1bbd1125 Binary files /dev/null and b/src/public/data/pack/server/maps/n48_154 differ diff --git a/src/public/data/pack/server/maps/n48_155 b/src/public/data/pack/server/maps/n48_155 new file mode 100644 index 00000000..98194569 Binary files /dev/null and b/src/public/data/pack/server/maps/n48_155 differ diff --git a/src/public/data/pack/server/maps/n48_156 b/src/public/data/pack/server/maps/n48_156 new file mode 100644 index 00000000..faa6379d Binary files /dev/null and b/src/public/data/pack/server/maps/n48_156 differ diff --git a/src/public/data/pack/server/maps/n48_47 b/src/public/data/pack/server/maps/n48_47 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n48_48 b/src/public/data/pack/server/maps/n48_48 new file mode 100644 index 00000000..88d85557 Binary files /dev/null and b/src/public/data/pack/server/maps/n48_48 differ diff --git a/src/public/data/pack/server/maps/n48_49 b/src/public/data/pack/server/maps/n48_49 new file mode 100644 index 00000000..cfd363b2 Binary files /dev/null and b/src/public/data/pack/server/maps/n48_49 differ diff --git a/src/public/data/pack/server/maps/n48_50 b/src/public/data/pack/server/maps/n48_50 new file mode 100644 index 00000000..d5a0947e Binary files /dev/null and b/src/public/data/pack/server/maps/n48_50 differ diff --git a/src/public/data/pack/server/maps/n48_51 b/src/public/data/pack/server/maps/n48_51 new file mode 100644 index 00000000..9eb5c91b Binary files /dev/null and b/src/public/data/pack/server/maps/n48_51 differ diff --git a/src/public/data/pack/server/maps/n48_52 b/src/public/data/pack/server/maps/n48_52 new file mode 100644 index 00000000..2117b0c6 Binary files /dev/null and b/src/public/data/pack/server/maps/n48_52 differ diff --git a/src/public/data/pack/server/maps/n48_53 b/src/public/data/pack/server/maps/n48_53 new file mode 100644 index 00000000..a8220df1 Binary files /dev/null and b/src/public/data/pack/server/maps/n48_53 differ diff --git a/src/public/data/pack/server/maps/n48_54 b/src/public/data/pack/server/maps/n48_54 new file mode 100644 index 00000000..9373d2be Binary files /dev/null and b/src/public/data/pack/server/maps/n48_54 differ diff --git a/src/public/data/pack/server/maps/n48_55 b/src/public/data/pack/server/maps/n48_55 new file mode 100644 index 00000000..e34228b9 Binary files /dev/null and b/src/public/data/pack/server/maps/n48_55 differ diff --git a/src/public/data/pack/server/maps/n48_56 b/src/public/data/pack/server/maps/n48_56 new file mode 100644 index 00000000..1f7e7fde Binary files /dev/null and b/src/public/data/pack/server/maps/n48_56 differ diff --git a/src/public/data/pack/server/maps/n48_57 b/src/public/data/pack/server/maps/n48_57 new file mode 100644 index 00000000..402e2872 Binary files /dev/null and b/src/public/data/pack/server/maps/n48_57 differ diff --git a/src/public/data/pack/server/maps/n48_58 b/src/public/data/pack/server/maps/n48_58 new file mode 100644 index 00000000..dec17ee4 Binary files /dev/null and b/src/public/data/pack/server/maps/n48_58 differ diff --git a/src/public/data/pack/server/maps/n48_59 b/src/public/data/pack/server/maps/n48_59 new file mode 100644 index 00000000..ff1cf459 Binary files /dev/null and b/src/public/data/pack/server/maps/n48_59 differ diff --git a/src/public/data/pack/server/maps/n48_60 b/src/public/data/pack/server/maps/n48_60 new file mode 100644 index 00000000..782c0d1e Binary files /dev/null and b/src/public/data/pack/server/maps/n48_60 differ diff --git a/src/public/data/pack/server/maps/n48_61 b/src/public/data/pack/server/maps/n48_61 new file mode 100644 index 00000000..bbb12e59 Binary files /dev/null and b/src/public/data/pack/server/maps/n48_61 differ diff --git a/src/public/data/pack/server/maps/n48_62 b/src/public/data/pack/server/maps/n48_62 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n49_148 b/src/public/data/pack/server/maps/n49_148 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n49_149 b/src/public/data/pack/server/maps/n49_149 new file mode 100644 index 00000000..f71e3855 Binary files /dev/null and b/src/public/data/pack/server/maps/n49_149 differ diff --git a/src/public/data/pack/server/maps/n49_153 b/src/public/data/pack/server/maps/n49_153 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n49_154 b/src/public/data/pack/server/maps/n49_154 new file mode 100644 index 00000000..37957e09 Binary files /dev/null and b/src/public/data/pack/server/maps/n49_154 differ diff --git a/src/public/data/pack/server/maps/n49_155 b/src/public/data/pack/server/maps/n49_155 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n49_156 b/src/public/data/pack/server/maps/n49_156 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n49_46 b/src/public/data/pack/server/maps/n49_46 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n49_47 b/src/public/data/pack/server/maps/n49_47 new file mode 100644 index 00000000..bd94af21 Binary files /dev/null and b/src/public/data/pack/server/maps/n49_47 differ diff --git a/src/public/data/pack/server/maps/n49_48 b/src/public/data/pack/server/maps/n49_48 new file mode 100644 index 00000000..28192574 Binary files /dev/null and b/src/public/data/pack/server/maps/n49_48 differ diff --git a/src/public/data/pack/server/maps/n49_49 b/src/public/data/pack/server/maps/n49_49 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n49_50 b/src/public/data/pack/server/maps/n49_50 new file mode 100644 index 00000000..63727f0b Binary files /dev/null and b/src/public/data/pack/server/maps/n49_50 differ diff --git a/src/public/data/pack/server/maps/n49_51 b/src/public/data/pack/server/maps/n49_51 new file mode 100644 index 00000000..7b4747ee Binary files /dev/null and b/src/public/data/pack/server/maps/n49_51 differ diff --git a/src/public/data/pack/server/maps/n49_52 b/src/public/data/pack/server/maps/n49_52 new file mode 100644 index 00000000..2eaf414d Binary files /dev/null and b/src/public/data/pack/server/maps/n49_52 differ diff --git a/src/public/data/pack/server/maps/n49_53 b/src/public/data/pack/server/maps/n49_53 new file mode 100644 index 00000000..a6cb7a10 Binary files /dev/null and b/src/public/data/pack/server/maps/n49_53 differ diff --git a/src/public/data/pack/server/maps/n49_54 b/src/public/data/pack/server/maps/n49_54 new file mode 100644 index 00000000..5a5b7efb Binary files /dev/null and b/src/public/data/pack/server/maps/n49_54 differ diff --git a/src/public/data/pack/server/maps/n49_55 b/src/public/data/pack/server/maps/n49_55 new file mode 100644 index 00000000..bc45ca0d Binary files /dev/null and b/src/public/data/pack/server/maps/n49_55 differ diff --git a/src/public/data/pack/server/maps/n49_56 b/src/public/data/pack/server/maps/n49_56 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n49_57 b/src/public/data/pack/server/maps/n49_57 new file mode 100644 index 00000000..1629c515 Binary files /dev/null and b/src/public/data/pack/server/maps/n49_57 differ diff --git a/src/public/data/pack/server/maps/n49_58 b/src/public/data/pack/server/maps/n49_58 new file mode 100644 index 00000000..bd0aa71e Binary files /dev/null and b/src/public/data/pack/server/maps/n49_58 differ diff --git a/src/public/data/pack/server/maps/n49_59 b/src/public/data/pack/server/maps/n49_59 new file mode 100644 index 00000000..3b72fe26 Binary files /dev/null and b/src/public/data/pack/server/maps/n49_59 differ diff --git a/src/public/data/pack/server/maps/n49_60 b/src/public/data/pack/server/maps/n49_60 new file mode 100644 index 00000000..d59f016c Binary files /dev/null and b/src/public/data/pack/server/maps/n49_60 differ diff --git a/src/public/data/pack/server/maps/n49_61 b/src/public/data/pack/server/maps/n49_61 new file mode 100644 index 00000000..9ae086d3 Binary files /dev/null and b/src/public/data/pack/server/maps/n49_61 differ diff --git a/src/public/data/pack/server/maps/n49_62 b/src/public/data/pack/server/maps/n49_62 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n50_149 b/src/public/data/pack/server/maps/n50_149 new file mode 100644 index 00000000..8a0a869d Binary files /dev/null and b/src/public/data/pack/server/maps/n50_149 differ diff --git a/src/public/data/pack/server/maps/n50_150 b/src/public/data/pack/server/maps/n50_150 new file mode 100644 index 00000000..84fe1dfc Binary files /dev/null and b/src/public/data/pack/server/maps/n50_150 differ diff --git a/src/public/data/pack/server/maps/n50_152 b/src/public/data/pack/server/maps/n50_152 new file mode 100644 index 00000000..22c97cc0 Binary files /dev/null and b/src/public/data/pack/server/maps/n50_152 differ diff --git a/src/public/data/pack/server/maps/n50_153 b/src/public/data/pack/server/maps/n50_153 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n50_154 b/src/public/data/pack/server/maps/n50_154 new file mode 100644 index 00000000..fc0f0b5c Binary files /dev/null and b/src/public/data/pack/server/maps/n50_154 differ diff --git a/src/public/data/pack/server/maps/n50_46 b/src/public/data/pack/server/maps/n50_46 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n50_47 b/src/public/data/pack/server/maps/n50_47 new file mode 100644 index 00000000..9fe0b677 --- /dev/null +++ b/src/public/data/pack/server/maps/n50_47 @@ -0,0 +1 @@ +HxHÃGÛGGCGZG´G4G ‡H ±G óG·H \ No newline at end of file diff --git a/src/public/data/pack/server/maps/n50_48 b/src/public/data/pack/server/maps/n50_48 new file mode 100644 index 00000000..4f976181 --- /dev/null +++ b/src/public/data/pack/server/maps/n50_48 @@ -0,0 +1 @@ +ÔGTGgHtGõGŽHCGÂG H H ¶G 5G lH ×H†GG \ No newline at end of file diff --git a/src/public/data/pack/server/maps/n50_49 b/src/public/data/pack/server/maps/n50_49 new file mode 100644 index 00000000..4dedd6ec Binary files /dev/null and b/src/public/data/pack/server/maps/n50_49 differ diff --git a/src/public/data/pack/server/maps/n50_50 b/src/public/data/pack/server/maps/n50_50 new file mode 100644 index 00000000..36d7062a Binary files /dev/null and b/src/public/data/pack/server/maps/n50_50 differ diff --git a/src/public/data/pack/server/maps/n50_51 b/src/public/data/pack/server/maps/n50_51 new file mode 100644 index 00000000..4bf5a36d Binary files /dev/null and b/src/public/data/pack/server/maps/n50_51 differ diff --git a/src/public/data/pack/server/maps/n50_52 b/src/public/data/pack/server/maps/n50_52 new file mode 100644 index 00000000..317d8179 Binary files /dev/null and b/src/public/data/pack/server/maps/n50_52 differ diff --git a/src/public/data/pack/server/maps/n50_53 b/src/public/data/pack/server/maps/n50_53 new file mode 100644 index 00000000..a68b4438 Binary files /dev/null and b/src/public/data/pack/server/maps/n50_53 differ diff --git a/src/public/data/pack/server/maps/n50_54 b/src/public/data/pack/server/maps/n50_54 new file mode 100644 index 00000000..d1cfdf67 Binary files /dev/null and b/src/public/data/pack/server/maps/n50_54 differ diff --git a/src/public/data/pack/server/maps/n50_55 b/src/public/data/pack/server/maps/n50_55 new file mode 100644 index 00000000..0715224f Binary files /dev/null and b/src/public/data/pack/server/maps/n50_55 differ diff --git a/src/public/data/pack/server/maps/n50_56 b/src/public/data/pack/server/maps/n50_56 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n50_57 b/src/public/data/pack/server/maps/n50_57 new file mode 100644 index 00000000..33fb1429 Binary files /dev/null and b/src/public/data/pack/server/maps/n50_57 differ diff --git a/src/public/data/pack/server/maps/n50_58 b/src/public/data/pack/server/maps/n50_58 new file mode 100644 index 00000000..dee4aff7 Binary files /dev/null and b/src/public/data/pack/server/maps/n50_58 differ diff --git a/src/public/data/pack/server/maps/n50_59 b/src/public/data/pack/server/maps/n50_59 new file mode 100644 index 00000000..ba4a502b Binary files /dev/null and b/src/public/data/pack/server/maps/n50_59 differ diff --git a/src/public/data/pack/server/maps/n50_60 b/src/public/data/pack/server/maps/n50_60 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n50_61 b/src/public/data/pack/server/maps/n50_61 new file mode 100644 index 00000000..2a26a82e Binary files /dev/null and b/src/public/data/pack/server/maps/n50_61 differ diff --git a/src/public/data/pack/server/maps/n50_62 b/src/public/data/pack/server/maps/n50_62 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n51_147 b/src/public/data/pack/server/maps/n51_147 new file mode 100644 index 00000000..4cf6f4aa Binary files /dev/null and b/src/public/data/pack/server/maps/n51_147 differ diff --git a/src/public/data/pack/server/maps/n51_154 b/src/public/data/pack/server/maps/n51_154 new file mode 100644 index 00000000..f05a8ca0 Binary files /dev/null and b/src/public/data/pack/server/maps/n51_154 differ diff --git a/src/public/data/pack/server/maps/n51_46 b/src/public/data/pack/server/maps/n51_46 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n51_47 b/src/public/data/pack/server/maps/n51_47 new file mode 100644 index 00000000..254c33b3 Binary files /dev/null and b/src/public/data/pack/server/maps/n51_47 differ diff --git a/src/public/data/pack/server/maps/n51_48 b/src/public/data/pack/server/maps/n51_48 new file mode 100644 index 00000000..c7f62e9d Binary files /dev/null and b/src/public/data/pack/server/maps/n51_48 differ diff --git a/src/public/data/pack/server/maps/n51_49 b/src/public/data/pack/server/maps/n51_49 new file mode 100644 index 00000000..b0f8baa4 Binary files /dev/null and b/src/public/data/pack/server/maps/n51_49 differ diff --git a/src/public/data/pack/server/maps/n51_50 b/src/public/data/pack/server/maps/n51_50 new file mode 100644 index 00000000..1e26df6c Binary files /dev/null and b/src/public/data/pack/server/maps/n51_50 differ diff --git a/src/public/data/pack/server/maps/n51_51 b/src/public/data/pack/server/maps/n51_51 new file mode 100644 index 00000000..ecf6df44 Binary files /dev/null and b/src/public/data/pack/server/maps/n51_51 differ diff --git a/src/public/data/pack/server/maps/n51_52 b/src/public/data/pack/server/maps/n51_52 new file mode 100644 index 00000000..46ff61d9 Binary files /dev/null and b/src/public/data/pack/server/maps/n51_52 differ diff --git a/src/public/data/pack/server/maps/n51_53 b/src/public/data/pack/server/maps/n51_53 new file mode 100644 index 00000000..1beaad04 Binary files /dev/null and b/src/public/data/pack/server/maps/n51_53 differ diff --git a/src/public/data/pack/server/maps/n51_54 b/src/public/data/pack/server/maps/n51_54 new file mode 100644 index 00000000..25475ad1 Binary files /dev/null and b/src/public/data/pack/server/maps/n51_54 differ diff --git a/src/public/data/pack/server/maps/n51_55 b/src/public/data/pack/server/maps/n51_55 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n51_56 b/src/public/data/pack/server/maps/n51_56 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n51_57 b/src/public/data/pack/server/maps/n51_57 new file mode 100644 index 00000000..fffb08e4 Binary files /dev/null and b/src/public/data/pack/server/maps/n51_57 differ diff --git a/src/public/data/pack/server/maps/n51_58 b/src/public/data/pack/server/maps/n51_58 new file mode 100644 index 00000000..6ea70713 Binary files /dev/null and b/src/public/data/pack/server/maps/n51_58 differ diff --git a/src/public/data/pack/server/maps/n51_59 b/src/public/data/pack/server/maps/n51_59 new file mode 100644 index 00000000..77ad5c91 Binary files /dev/null and b/src/public/data/pack/server/maps/n51_59 differ diff --git a/src/public/data/pack/server/maps/n51_60 b/src/public/data/pack/server/maps/n51_60 new file mode 100644 index 00000000..3197bb74 Binary files /dev/null and b/src/public/data/pack/server/maps/n51_60 differ diff --git a/src/public/data/pack/server/maps/n51_61 b/src/public/data/pack/server/maps/n51_61 new file mode 100644 index 00000000..ac6d1fef Binary files /dev/null and b/src/public/data/pack/server/maps/n51_61 differ diff --git a/src/public/data/pack/server/maps/n51_62 b/src/public/data/pack/server/maps/n51_62 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n52_152 b/src/public/data/pack/server/maps/n52_152 new file mode 100644 index 00000000..798c62e0 Binary files /dev/null and b/src/public/data/pack/server/maps/n52_152 differ diff --git a/src/public/data/pack/server/maps/n52_153 b/src/public/data/pack/server/maps/n52_153 new file mode 100644 index 00000000..798c62e0 Binary files /dev/null and b/src/public/data/pack/server/maps/n52_153 differ diff --git a/src/public/data/pack/server/maps/n52_154 b/src/public/data/pack/server/maps/n52_154 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n52_46 b/src/public/data/pack/server/maps/n52_46 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n52_47 b/src/public/data/pack/server/maps/n52_47 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n52_48 b/src/public/data/pack/server/maps/n52_48 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n52_49 b/src/public/data/pack/server/maps/n52_49 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n52_50 b/src/public/data/pack/server/maps/n52_50 new file mode 100644 index 00000000..4e08f151 Binary files /dev/null and b/src/public/data/pack/server/maps/n52_50 differ diff --git a/src/public/data/pack/server/maps/n52_51 b/src/public/data/pack/server/maps/n52_51 new file mode 100644 index 00000000..51cd0ca1 --- /dev/null +++ b/src/public/data/pack/server/maps/n52_51 @@ -0,0 +1,2 @@ +ŒÂ‰¿ +À à HÁ Õð ž \ No newline at end of file diff --git a/src/public/data/pack/server/maps/n52_52 b/src/public/data/pack/server/maps/n52_52 new file mode 100644 index 00000000..eff38b3a --- /dev/null +++ b/src/public/data/pack/server/maps/n52_52 @@ -0,0 +1,2 @@ +Åk9ej j j +»e 1l \ No newline at end of file diff --git a/src/public/data/pack/server/maps/n52_53 b/src/public/data/pack/server/maps/n52_53 new file mode 100644 index 00000000..dd316196 --- /dev/null +++ b/src/public/data/pack/server/maps/n52_53 @@ -0,0 +1,2 @@ + i‰eee˜eÅg ee ¡e +˜h Ze \ No newline at end of file diff --git a/src/public/data/pack/server/maps/n52_54 b/src/public/data/pack/server/maps/n52_54 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n52_55 b/src/public/data/pack/server/maps/n52_55 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n52_56 b/src/public/data/pack/server/maps/n52_56 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n52_57 b/src/public/data/pack/server/maps/n52_57 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n52_58 b/src/public/data/pack/server/maps/n52_58 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n52_59 b/src/public/data/pack/server/maps/n52_59 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n52_60 b/src/public/data/pack/server/maps/n52_60 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n52_61 b/src/public/data/pack/server/maps/n52_61 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n52_62 b/src/public/data/pack/server/maps/n52_62 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n53_49 b/src/public/data/pack/server/maps/n53_49 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n53_50 b/src/public/data/pack/server/maps/n53_50 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n53_51 b/src/public/data/pack/server/maps/n53_51 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n53_52 b/src/public/data/pack/server/maps/n53_52 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/n53_53 b/src/public/data/pack/server/maps/n53_53 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o29_75 b/src/public/data/pack/server/maps/o29_75 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o30_75 b/src/public/data/pack/server/maps/o30_75 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o31_75 b/src/public/data/pack/server/maps/o31_75 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o32_70 b/src/public/data/pack/server/maps/o32_70 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o32_71 b/src/public/data/pack/server/maps/o32_71 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o32_72 b/src/public/data/pack/server/maps/o32_72 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o32_73 b/src/public/data/pack/server/maps/o32_73 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o32_74 b/src/public/data/pack/server/maps/o32_74 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o32_75 b/src/public/data/pack/server/maps/o32_75 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o33_70 b/src/public/data/pack/server/maps/o33_70 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o33_71 b/src/public/data/pack/server/maps/o33_71 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o33_72 b/src/public/data/pack/server/maps/o33_72 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o33_73 b/src/public/data/pack/server/maps/o33_73 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o33_74 b/src/public/data/pack/server/maps/o33_74 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o33_75 b/src/public/data/pack/server/maps/o33_75 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o33_76 b/src/public/data/pack/server/maps/o33_76 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o34_70 b/src/public/data/pack/server/maps/o34_70 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o34_71 b/src/public/data/pack/server/maps/o34_71 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o34_72 b/src/public/data/pack/server/maps/o34_72 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o34_73 b/src/public/data/pack/server/maps/o34_73 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o34_74 b/src/public/data/pack/server/maps/o34_74 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o34_75 b/src/public/data/pack/server/maps/o34_75 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o34_76 b/src/public/data/pack/server/maps/o34_76 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o35_20 b/src/public/data/pack/server/maps/o35_20 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o35_75 b/src/public/data/pack/server/maps/o35_75 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o35_76 b/src/public/data/pack/server/maps/o35_76 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o36_146 b/src/public/data/pack/server/maps/o36_146 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o36_147 b/src/public/data/pack/server/maps/o36_147 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o36_148 b/src/public/data/pack/server/maps/o36_148 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o36_149 b/src/public/data/pack/server/maps/o36_149 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o36_150 b/src/public/data/pack/server/maps/o36_150 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o36_153 b/src/public/data/pack/server/maps/o36_153 new file mode 100644 index 00000000..953a8d3e --- /dev/null +++ b/src/public/data/pack/server/maps/o36_153 @@ -0,0 +1 @@ +I…N \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o36_154 b/src/public/data/pack/server/maps/o36_154 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o36_52 b/src/public/data/pack/server/maps/o36_52 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o36_53 b/src/public/data/pack/server/maps/o36_53 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o36_54 b/src/public/data/pack/server/maps/o36_54 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o36_72 b/src/public/data/pack/server/maps/o36_72 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o36_73 b/src/public/data/pack/server/maps/o36_73 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o36_74 b/src/public/data/pack/server/maps/o36_74 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o36_75 b/src/public/data/pack/server/maps/o36_75 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o36_76 b/src/public/data/pack/server/maps/o36_76 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o37_146 b/src/public/data/pack/server/maps/o37_146 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o37_147 b/src/public/data/pack/server/maps/o37_147 new file mode 100644 index 00000000..f6db1012 Binary files /dev/null and b/src/public/data/pack/server/maps/o37_147 differ diff --git a/src/public/data/pack/server/maps/o37_148 b/src/public/data/pack/server/maps/o37_148 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o37_149 b/src/public/data/pack/server/maps/o37_149 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o37_150 b/src/public/data/pack/server/maps/o37_150 new file mode 100644 index 00000000..c9ab79a8 --- /dev/null +++ b/src/public/data/pack/server/maps/o37_150 @@ -0,0 +1 @@ +üº \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o37_151 b/src/public/data/pack/server/maps/o37_151 new file mode 100644 index 00000000..69853826 --- /dev/null +++ b/src/public/data/pack/server/maps/o37_151 @@ -0,0 +1 @@ +UËÊ "Ì IÕ \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o37_152 b/src/public/data/pack/server/maps/o37_152 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o37_153 b/src/public/data/pack/server/maps/o37_153 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o37_154 b/src/public/data/pack/server/maps/o37_154 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o37_48 b/src/public/data/pack/server/maps/o37_48 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o37_49 b/src/public/data/pack/server/maps/o37_49 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o37_50 b/src/public/data/pack/server/maps/o37_50 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o37_51 b/src/public/data/pack/server/maps/o37_51 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o37_52 b/src/public/data/pack/server/maps/o37_52 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o37_53 b/src/public/data/pack/server/maps/o37_53 new file mode 100644 index 00000000..86d9e163 --- /dev/null +++ b/src/public/data/pack/server/maps/o37_53 @@ -0,0 +1,2 @@ +Vf”fÎfÎfLf f +f \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o37_54 b/src/public/data/pack/server/maps/o37_54 new file mode 100644 index 00000000..2e63630b --- /dev/null +++ b/src/public/data/pack/server/maps/o37_54 @@ -0,0 +1,5 @@ + üf +;r +>r +zf +øf ?f wf ¶r ¾r ÷r ýr þf 8f tf xf {f |f ·f ½f ÷r uf f:f=f{r³rôr6f \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o37_55 b/src/public/data/pack/server/maps/o37_55 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o37_72 b/src/public/data/pack/server/maps/o37_72 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o37_73 b/src/public/data/pack/server/maps/o37_73 new file mode 100644 index 00000000..240cba6a --- /dev/null +++ b/src/public/data/pack/server/maps/o37_73 @@ -0,0 +1 @@ +èä \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o37_74 b/src/public/data/pack/server/maps/o37_74 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o37_75 b/src/public/data/pack/server/maps/o37_75 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o38_146 b/src/public/data/pack/server/maps/o38_146 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o38_147 b/src/public/data/pack/server/maps/o38_147 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o38_148 b/src/public/data/pack/server/maps/o38_148 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o38_149 b/src/public/data/pack/server/maps/o38_149 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o38_150 b/src/public/data/pack/server/maps/o38_150 new file mode 100644 index 00000000..a0854caf --- /dev/null +++ b/src/public/data/pack/server/maps/o38_150 @@ -0,0 +1 @@ +õÈ'È \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o38_151 b/src/public/data/pack/server/maps/o38_151 new file mode 100644 index 00000000..eb1fb897 Binary files /dev/null and b/src/public/data/pack/server/maps/o38_151 differ diff --git a/src/public/data/pack/server/maps/o38_152 b/src/public/data/pack/server/maps/o38_152 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o38_153 b/src/public/data/pack/server/maps/o38_153 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o38_154 b/src/public/data/pack/server/maps/o38_154 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o38_155 b/src/public/data/pack/server/maps/o38_155 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o38_45 b/src/public/data/pack/server/maps/o38_45 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o38_46 b/src/public/data/pack/server/maps/o38_46 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o38_47 b/src/public/data/pack/server/maps/o38_47 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o38_48 b/src/public/data/pack/server/maps/o38_48 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o38_49 b/src/public/data/pack/server/maps/o38_49 new file mode 100644 index 00000000..5427186b Binary files /dev/null and b/src/public/data/pack/server/maps/o38_49 differ diff --git a/src/public/data/pack/server/maps/o38_50 b/src/public/data/pack/server/maps/o38_50 new file mode 100644 index 00000000..30fb04d5 --- /dev/null +++ b/src/public/data/pack/server/maps/o38_50 @@ -0,0 +1 @@ +^Ô"XÖ^š ‘ —    \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o38_51 b/src/public/data/pack/server/maps/o38_51 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o38_52 b/src/public/data/pack/server/maps/o38_52 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o38_53 b/src/public/data/pack/server/maps/o38_53 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o38_54 b/src/public/data/pack/server/maps/o38_54 new file mode 100644 index 00000000..ee0b28fe --- /dev/null +++ b/src/public/data/pack/server/maps/o38_54 @@ -0,0 +1 @@ +ŸêÚêaê \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o38_55 b/src/public/data/pack/server/maps/o38_55 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o38_72 b/src/public/data/pack/server/maps/o38_72 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o38_73 b/src/public/data/pack/server/maps/o38_73 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o38_74 b/src/public/data/pack/server/maps/o38_74 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o39_147 b/src/public/data/pack/server/maps/o39_147 new file mode 100644 index 00000000..24b3d18d Binary files /dev/null and b/src/public/data/pack/server/maps/o39_147 differ diff --git a/src/public/data/pack/server/maps/o39_148 b/src/public/data/pack/server/maps/o39_148 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o39_149 b/src/public/data/pack/server/maps/o39_149 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o39_150 b/src/public/data/pack/server/maps/o39_150 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o39_151 b/src/public/data/pack/server/maps/o39_151 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o39_152 b/src/public/data/pack/server/maps/o39_152 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o39_153 b/src/public/data/pack/server/maps/o39_153 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o39_154 b/src/public/data/pack/server/maps/o39_154 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o39_155 b/src/public/data/pack/server/maps/o39_155 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o39_45 b/src/public/data/pack/server/maps/o39_45 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o39_46 b/src/public/data/pack/server/maps/o39_46 new file mode 100644 index 00000000..26fca79a Binary files /dev/null and b/src/public/data/pack/server/maps/o39_46 differ diff --git a/src/public/data/pack/server/maps/o39_47 b/src/public/data/pack/server/maps/o39_47 new file mode 100644 index 00000000..ea8705c4 --- /dev/null +++ b/src/public/data/pack/server/maps/o39_47 @@ -0,0 +1 @@ + LMŒÌV² T “ W $ c â \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o39_48 b/src/public/data/pack/server/maps/o39_48 new file mode 100644 index 00000000..48ac0116 Binary files /dev/null and b/src/public/data/pack/server/maps/o39_48 differ diff --git a/src/public/data/pack/server/maps/o39_49 b/src/public/data/pack/server/maps/o39_49 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o39_50 b/src/public/data/pack/server/maps/o39_50 new file mode 100644 index 00000000..10b9a587 --- /dev/null +++ b/src/public/data/pack/server/maps/o39_50 @@ -0,0 +1 @@ + 1q \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o39_51 b/src/public/data/pack/server/maps/o39_51 new file mode 100644 index 00000000..dda07db3 --- /dev/null +++ b/src/public/data/pack/server/maps/o39_51 @@ -0,0 +1 @@ + ×Û Ø² \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o39_52 b/src/public/data/pack/server/maps/o39_52 new file mode 100644 index 00000000..61550048 --- /dev/null +++ b/src/public/data/pack/server/maps/o39_52 @@ -0,0 +1 @@ +r}s}e} ÅÀ \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o39_53 b/src/public/data/pack/server/maps/o39_53 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o39_54 b/src/public/data/pack/server/maps/o39_54 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o39_55 b/src/public/data/pack/server/maps/o39_55 new file mode 100644 index 00000000..d97d3dd8 --- /dev/null +++ b/src/public/data/pack/server/maps/o39_55 @@ -0,0 +1 @@ +6ÀwÀ¶À5À \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o39_72 b/src/public/data/pack/server/maps/o39_72 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o39_73 b/src/public/data/pack/server/maps/o39_73 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o39_74 b/src/public/data/pack/server/maps/o39_74 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o39_75 b/src/public/data/pack/server/maps/o39_75 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o39_76 b/src/public/data/pack/server/maps/o39_76 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o40_147 b/src/public/data/pack/server/maps/o40_147 new file mode 100644 index 00000000..06494d6e --- /dev/null +++ b/src/public/data/pack/server/maps/o40_147 @@ -0,0 +1,2 @@ + a ‰ Ç Þ â#H] ]`fˆ‰ŒÊ + \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o40_148 b/src/public/data/pack/server/maps/o40_148 new file mode 100644 index 00000000..4d6806ec Binary files /dev/null and b/src/public/data/pack/server/maps/o40_148 differ diff --git a/src/public/data/pack/server/maps/o40_149 b/src/public/data/pack/server/maps/o40_149 new file mode 100644 index 00000000..df1fde1e --- /dev/null +++ b/src/public/data/pack/server/maps/o40_149 @@ -0,0 +1 @@ + ãó \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o40_150 b/src/public/data/pack/server/maps/o40_150 new file mode 100644 index 00000000..07b789f7 Binary files /dev/null and b/src/public/data/pack/server/maps/o40_150 differ diff --git a/src/public/data/pack/server/maps/o40_151 b/src/public/data/pack/server/maps/o40_151 new file mode 100644 index 00000000..92a04a89 --- /dev/null +++ b/src/public/data/pack/server/maps/o40_151 @@ -0,0 +1 @@ +  \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o40_152 b/src/public/data/pack/server/maps/o40_152 new file mode 100644 index 00000000..c801c789 --- /dev/null +++ b/src/public/data/pack/server/maps/o40_152 @@ -0,0 +1 @@ + „Cƒˆ  \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o40_153 b/src/public/data/pack/server/maps/o40_153 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o40_154 b/src/public/data/pack/server/maps/o40_154 new file mode 100644 index 00000000..60d388f4 --- /dev/null +++ b/src/public/data/pack/server/maps/o40_154 @@ -0,0 +1 @@ +i* \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o40_45 b/src/public/data/pack/server/maps/o40_45 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o40_46 b/src/public/data/pack/server/maps/o40_46 new file mode 100644 index 00000000..6f78b4c9 Binary files /dev/null and b/src/public/data/pack/server/maps/o40_46 differ diff --git a/src/public/data/pack/server/maps/o40_47 b/src/public/data/pack/server/maps/o40_47 new file mode 100644 index 00000000..5df57c99 --- /dev/null +++ b/src/public/data/pack/server/maps/o40_47 @@ -0,0 +1 @@ +ÒºÖÜp¯›+¯U \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o40_48 b/src/public/data/pack/server/maps/o40_48 new file mode 100644 index 00000000..5951ed4d Binary files /dev/null and b/src/public/data/pack/server/maps/o40_48 differ diff --git a/src/public/data/pack/server/maps/o40_49 b/src/public/data/pack/server/maps/o40_49 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o40_50 b/src/public/data/pack/server/maps/o40_50 new file mode 100644 index 00000000..1743351b Binary files /dev/null and b/src/public/data/pack/server/maps/o40_50 differ diff --git a/src/public/data/pack/server/maps/o40_51 b/src/public/data/pack/server/maps/o40_51 new file mode 100644 index 00000000..7bca2fde --- /dev/null +++ b/src/public/data/pack/server/maps/o40_51 @@ -0,0 +1 @@ +»¨¼¨½¨/ \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o40_52 b/src/public/data/pack/server/maps/o40_52 new file mode 100644 index 00000000..4006618c --- /dev/null +++ b/src/public/data/pack/server/maps/o40_52 @@ -0,0 +1 @@ +ƒ¸æ  \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o40_53 b/src/public/data/pack/server/maps/o40_53 new file mode 100644 index 00000000..71b586d9 Binary files /dev/null and b/src/public/data/pack/server/maps/o40_53 differ diff --git a/src/public/data/pack/server/maps/o40_54 b/src/public/data/pack/server/maps/o40_54 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o40_55 b/src/public/data/pack/server/maps/o40_55 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o40_72 b/src/public/data/pack/server/maps/o40_72 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o40_73 b/src/public/data/pack/server/maps/o40_73 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o40_74 b/src/public/data/pack/server/maps/o40_74 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o40_75 b/src/public/data/pack/server/maps/o40_75 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o40_76 b/src/public/data/pack/server/maps/o40_76 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o41_146 b/src/public/data/pack/server/maps/o41_146 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o41_149 b/src/public/data/pack/server/maps/o41_149 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o41_151 b/src/public/data/pack/server/maps/o41_151 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o41_152 b/src/public/data/pack/server/maps/o41_152 new file mode 100644 index 00000000..e687002a Binary files /dev/null and b/src/public/data/pack/server/maps/o41_152 differ diff --git a/src/public/data/pack/server/maps/o41_153 b/src/public/data/pack/server/maps/o41_153 new file mode 100644 index 00000000..4d2d58be Binary files /dev/null and b/src/public/data/pack/server/maps/o41_153 differ diff --git a/src/public/data/pack/server/maps/o41_154 b/src/public/data/pack/server/maps/o41_154 new file mode 100644 index 00000000..1277c608 Binary files /dev/null and b/src/public/data/pack/server/maps/o41_154 differ diff --git a/src/public/data/pack/server/maps/o41_45 b/src/public/data/pack/server/maps/o41_45 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o41_46 b/src/public/data/pack/server/maps/o41_46 new file mode 100644 index 00000000..c666bac5 --- /dev/null +++ b/src/public/data/pack/server/maps/o41_46 @@ -0,0 +1 @@ +ÈPPLP \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o41_47 b/src/public/data/pack/server/maps/o41_47 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o41_48 b/src/public/data/pack/server/maps/o41_48 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o41_49 b/src/public/data/pack/server/maps/o41_49 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o41_50 b/src/public/data/pack/server/maps/o41_50 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o41_51 b/src/public/data/pack/server/maps/o41_51 new file mode 100644 index 00000000..00444087 --- /dev/null +++ b/src/public/data/pack/server/maps/o41_51 @@ -0,0 +1 @@ +œ@ ãŒöÛ6 + \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o41_52 b/src/public/data/pack/server/maps/o41_52 new file mode 100644 index 00000000..3be3016d --- /dev/null +++ b/src/public/data/pack/server/maps/o41_52 @@ -0,0 +1,2 @@ +#£ +ûƒ \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o41_53 b/src/public/data/pack/server/maps/o41_53 new file mode 100644 index 00000000..7440a910 Binary files /dev/null and b/src/public/data/pack/server/maps/o41_53 differ diff --git a/src/public/data/pack/server/maps/o41_54 b/src/public/data/pack/server/maps/o41_54 new file mode 100644 index 00000000..f1159854 --- /dev/null +++ b/src/public/data/pack/server/maps/o41_54 @@ -0,0 +1,3 @@ +hN—NjN +N +æN \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o41_55 b/src/public/data/pack/server/maps/o41_55 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o41_56 b/src/public/data/pack/server/maps/o41_56 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o41_72 b/src/public/data/pack/server/maps/o41_72 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o41_73 b/src/public/data/pack/server/maps/o41_73 new file mode 100644 index 00000000..9042a648 Binary files /dev/null and b/src/public/data/pack/server/maps/o41_73 differ diff --git a/src/public/data/pack/server/maps/o41_74 b/src/public/data/pack/server/maps/o41_74 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o41_75 b/src/public/data/pack/server/maps/o41_75 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o42_144 b/src/public/data/pack/server/maps/o42_144 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o42_145 b/src/public/data/pack/server/maps/o42_145 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o42_146 b/src/public/data/pack/server/maps/o42_146 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o42_151 b/src/public/data/pack/server/maps/o42_151 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o42_152 b/src/public/data/pack/server/maps/o42_152 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o42_153 b/src/public/data/pack/server/maps/o42_153 new file mode 100644 index 00000000..a8910e48 --- /dev/null +++ b/src/public/data/pack/server/maps/o42_153 @@ -0,0 +1 @@ +ÛãÜcã]ã˜WžããXãZã[ã]ã \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o42_49 b/src/public/data/pack/server/maps/o42_49 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o42_50 b/src/public/data/pack/server/maps/o42_50 new file mode 100644 index 00000000..d80130a5 Binary files /dev/null and b/src/public/data/pack/server/maps/o42_50 differ diff --git a/src/public/data/pack/server/maps/o42_51 b/src/public/data/pack/server/maps/o42_51 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o42_52 b/src/public/data/pack/server/maps/o42_52 new file mode 100644 index 00000000..4e3db3c2 --- /dev/null +++ b/src/public/data/pack/server/maps/o42_52 @@ -0,0 +1 @@ + 'Ê \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o42_53 b/src/public/data/pack/server/maps/o42_53 new file mode 100644 index 00000000..e9285d80 --- /dev/null +++ b/src/public/data/pack/server/maps/o42_53 @@ -0,0 +1 @@ +² \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o42_54 b/src/public/data/pack/server/maps/o42_54 new file mode 100644 index 00000000..56e2457d --- /dev/null +++ b/src/public/data/pack/server/maps/o42_54 @@ -0,0 +1 @@ +² \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o42_55 b/src/public/data/pack/server/maps/o42_55 new file mode 100644 index 00000000..c4c87ddf --- /dev/null +++ b/src/public/data/pack/server/maps/o42_55 @@ -0,0 +1 @@ +ºû \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o42_56 b/src/public/data/pack/server/maps/o42_56 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o42_72 b/src/public/data/pack/server/maps/o42_72 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o42_73 b/src/public/data/pack/server/maps/o42_73 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o42_74 b/src/public/data/pack/server/maps/o42_74 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o42_75 b/src/public/data/pack/server/maps/o42_75 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o43_144 b/src/public/data/pack/server/maps/o43_144 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o43_145 b/src/public/data/pack/server/maps/o43_145 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o43_146 b/src/public/data/pack/server/maps/o43_146 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o43_153 b/src/public/data/pack/server/maps/o43_153 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o43_154 b/src/public/data/pack/server/maps/o43_154 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o43_45 b/src/public/data/pack/server/maps/o43_45 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o43_46 b/src/public/data/pack/server/maps/o43_46 new file mode 100644 index 00000000..6cad9fc2 Binary files /dev/null and b/src/public/data/pack/server/maps/o43_46 differ diff --git a/src/public/data/pack/server/maps/o43_47 b/src/public/data/pack/server/maps/o43_47 new file mode 100644 index 00000000..52025a13 Binary files /dev/null and b/src/public/data/pack/server/maps/o43_47 differ diff --git a/src/public/data/pack/server/maps/o43_48 b/src/public/data/pack/server/maps/o43_48 new file mode 100644 index 00000000..78646567 Binary files /dev/null and b/src/public/data/pack/server/maps/o43_48 differ diff --git a/src/public/data/pack/server/maps/o43_49 b/src/public/data/pack/server/maps/o43_49 new file mode 100644 index 00000000..bf289f04 --- /dev/null +++ b/src/public/data/pack/server/maps/o43_49 @@ -0,0 +1,5 @@ +~ãýãÿã>ã=ã ¿‰ + +Ø +ÙG +Ý } ” ˜ ™ Ó Ô} \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o43_50 b/src/public/data/pack/server/maps/o43_50 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o43_51 b/src/public/data/pack/server/maps/o43_51 new file mode 100644 index 00000000..bcd51a47 --- /dev/null +++ b/src/public/data/pack/server/maps/o43_51 @@ -0,0 +1 @@ +N½Y½» \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o43_52 b/src/public/data/pack/server/maps/o43_52 new file mode 100644 index 00000000..1a52c1eb Binary files /dev/null and b/src/public/data/pack/server/maps/o43_52 differ diff --git a/src/public/data/pack/server/maps/o43_53 b/src/public/data/pack/server/maps/o43_53 new file mode 100644 index 00000000..f8b0f4bb Binary files /dev/null and b/src/public/data/pack/server/maps/o43_53 differ diff --git a/src/public/data/pack/server/maps/o43_54 b/src/public/data/pack/server/maps/o43_54 new file mode 100644 index 00000000..7a47f586 --- /dev/null +++ b/src/public/data/pack/server/maps/o43_54 @@ -0,0 +1 @@ +,* \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o43_55 b/src/public/data/pack/server/maps/o43_55 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o43_56 b/src/public/data/pack/server/maps/o43_56 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o43_72 b/src/public/data/pack/server/maps/o43_72 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o43_73 b/src/public/data/pack/server/maps/o43_73 new file mode 100644 index 00000000..cf3502d8 Binary files /dev/null and b/src/public/data/pack/server/maps/o43_73 differ diff --git a/src/public/data/pack/server/maps/o43_74 b/src/public/data/pack/server/maps/o43_74 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o43_75 b/src/public/data/pack/server/maps/o43_75 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o44_144 b/src/public/data/pack/server/maps/o44_144 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o44_145 b/src/public/data/pack/server/maps/o44_145 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o44_146 b/src/public/data/pack/server/maps/o44_146 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o44_148 b/src/public/data/pack/server/maps/o44_148 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o44_149 b/src/public/data/pack/server/maps/o44_149 new file mode 100644 index 00000000..9202ac61 Binary files /dev/null and b/src/public/data/pack/server/maps/o44_149 differ diff --git a/src/public/data/pack/server/maps/o44_150 b/src/public/data/pack/server/maps/o44_150 new file mode 100644 index 00000000..0ee5444c --- /dev/null +++ b/src/public/data/pack/server/maps/o44_150 @@ -0,0 +1,2 @@ + +-ã +ã \ã Ýã àã \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o44_151 b/src/public/data/pack/server/maps/o44_151 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o44_152 b/src/public/data/pack/server/maps/o44_152 new file mode 100644 index 00000000..9f00f8c3 --- /dev/null +++ b/src/public/data/pack/server/maps/o44_152 @@ -0,0 +1,4 @@ +dæ +R +W +Ò \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o44_153 b/src/public/data/pack/server/maps/o44_153 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o44_154 b/src/public/data/pack/server/maps/o44_154 new file mode 100644 index 00000000..bb485774 --- /dev/null +++ b/src/public/data/pack/server/maps/o44_154 @@ -0,0 +1 @@ + Vy Óy –y \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o44_155 b/src/public/data/pack/server/maps/o44_155 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o44_45 b/src/public/data/pack/server/maps/o44_45 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o44_46 b/src/public/data/pack/server/maps/o44_46 new file mode 100644 index 00000000..f2ed1581 --- /dev/null +++ b/src/public/data/pack/server/maps/o44_46 @@ -0,0 +1 @@ +‘ ¡‘  ‘ \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o44_47 b/src/public/data/pack/server/maps/o44_47 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o44_48 b/src/public/data/pack/server/maps/o44_48 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o44_49 b/src/public/data/pack/server/maps/o44_49 new file mode 100644 index 00000000..a6bcfe51 --- /dev/null +++ b/src/public/data/pack/server/maps/o44_49 @@ -0,0 +1 @@ + ;‘ \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o44_50 b/src/public/data/pack/server/maps/o44_50 new file mode 100644 index 00000000..fb03849b --- /dev/null +++ b/src/public/data/pack/server/maps/o44_50 @@ -0,0 +1,3 @@ +àÀæÀçÀ +À +$À \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o44_51 b/src/public/data/pack/server/maps/o44_51 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o44_52 b/src/public/data/pack/server/maps/o44_52 new file mode 100644 index 00000000..ae2c7344 --- /dev/null +++ b/src/public/data/pack/server/maps/o44_52 @@ -0,0 +1 @@ +›ùé³ì˜ )˜ j˜ 3ƒ \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o44_53 b/src/public/data/pack/server/maps/o44_53 new file mode 100644 index 00000000..14a48cab --- /dev/null +++ b/src/public/data/pack/server/maps/o44_53 @@ -0,0 +1 @@ +9:²<‰=e? ù‰ \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o44_54 b/src/public/data/pack/server/maps/o44_54 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o44_55 b/src/public/data/pack/server/maps/o44_55 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o44_72 b/src/public/data/pack/server/maps/o44_72 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o44_73 b/src/public/data/pack/server/maps/o44_73 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o44_74 b/src/public/data/pack/server/maps/o44_74 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o44_75 b/src/public/data/pack/server/maps/o44_75 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o45_145 b/src/public/data/pack/server/maps/o45_145 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o45_146 b/src/public/data/pack/server/maps/o45_146 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o45_148 b/src/public/data/pack/server/maps/o45_148 new file mode 100644 index 00000000..f3f765b2 --- /dev/null +++ b/src/public/data/pack/server/maps/o45_148 @@ -0,0 +1 @@ +ßi \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o45_150 b/src/public/data/pack/server/maps/o45_150 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o45_151 b/src/public/data/pack/server/maps/o45_151 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o45_152 b/src/public/data/pack/server/maps/o45_152 new file mode 100644 index 00000000..8b4b7236 --- /dev/null +++ b/src/public/data/pack/server/maps/o45_152 @@ -0,0 +1 @@ +&6 \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o45_153 b/src/public/data/pack/server/maps/o45_153 new file mode 100644 index 00000000..0347bd09 Binary files /dev/null and b/src/public/data/pack/server/maps/o45_153 differ diff --git a/src/public/data/pack/server/maps/o45_154 b/src/public/data/pack/server/maps/o45_154 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o45_155 b/src/public/data/pack/server/maps/o45_155 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o45_45 b/src/public/data/pack/server/maps/o45_45 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o45_46 b/src/public/data/pack/server/maps/o45_46 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o45_47 b/src/public/data/pack/server/maps/o45_47 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o45_48 b/src/public/data/pack/server/maps/o45_48 new file mode 100644 index 00000000..a049cf25 --- /dev/null +++ b/src/public/data/pack/server/maps/o45_48 @@ -0,0 +1 @@ +/‘g‘ ¦‘Á‘‘ \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o45_49 b/src/public/data/pack/server/maps/o45_49 new file mode 100644 index 00000000..3d89986f --- /dev/null +++ b/src/public/data/pack/server/maps/o45_49 @@ -0,0 +1 @@ +̲ºJÊ«–, \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o45_50 b/src/public/data/pack/server/maps/o45_50 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o45_51 b/src/public/data/pack/server/maps/o45_51 new file mode 100644 index 00000000..3ef166da Binary files /dev/null and b/src/public/data/pack/server/maps/o45_51 differ diff --git a/src/public/data/pack/server/maps/o45_52 b/src/public/data/pack/server/maps/o45_52 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o45_53 b/src/public/data/pack/server/maps/o45_53 new file mode 100644 index 00000000..e3eb03c9 Binary files /dev/null and b/src/public/data/pack/server/maps/o45_53 differ diff --git a/src/public/data/pack/server/maps/o45_54 b/src/public/data/pack/server/maps/o45_54 new file mode 100644 index 00000000..7c139c89 Binary files /dev/null and b/src/public/data/pack/server/maps/o45_54 differ diff --git a/src/public/data/pack/server/maps/o45_55 b/src/public/data/pack/server/maps/o45_55 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o45_56 b/src/public/data/pack/server/maps/o45_56 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o45_57 b/src/public/data/pack/server/maps/o45_57 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o45_58 b/src/public/data/pack/server/maps/o45_58 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o45_59 b/src/public/data/pack/server/maps/o45_59 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o45_60 b/src/public/data/pack/server/maps/o45_60 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o45_61 b/src/public/data/pack/server/maps/o45_61 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o45_62 b/src/public/data/pack/server/maps/o45_62 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o45_73 b/src/public/data/pack/server/maps/o45_73 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o45_74 b/src/public/data/pack/server/maps/o45_74 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o45_75 b/src/public/data/pack/server/maps/o45_75 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o45_76 b/src/public/data/pack/server/maps/o45_76 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o46_149 b/src/public/data/pack/server/maps/o46_149 new file mode 100644 index 00000000..907c20f2 --- /dev/null +++ b/src/public/data/pack/server/maps/o46_149 @@ -0,0 +1,2 @@ + +ïã .ã 0ã \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o46_150 b/src/public/data/pack/server/maps/o46_150 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o46_152 b/src/public/data/pack/server/maps/o46_152 new file mode 100644 index 00000000..cd99651a --- /dev/null +++ b/src/public/data/pack/server/maps/o46_152 @@ -0,0 +1 @@ +¬+ \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o46_153 b/src/public/data/pack/server/maps/o46_153 new file mode 100644 index 00000000..b38b7003 --- /dev/null +++ b/src/public/data/pack/server/maps/o46_153 @@ -0,0 +1,2 @@ + +YO w FãÉã \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o46_154 b/src/public/data/pack/server/maps/o46_154 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o46_161 b/src/public/data/pack/server/maps/o46_161 new file mode 100644 index 00000000..3a9ddb58 --- /dev/null +++ b/src/public/data/pack/server/maps/o46_161 @@ -0,0 +1 @@ + ä§äg \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o46_45 b/src/public/data/pack/server/maps/o46_45 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o46_46 b/src/public/data/pack/server/maps/o46_46 new file mode 100644 index 00000000..30a1fbef --- /dev/null +++ b/src/public/data/pack/server/maps/o46_46 @@ -0,0 +1 @@ +‘‘ì \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o46_47 b/src/public/data/pack/server/maps/o46_47 new file mode 100644 index 00000000..e437354e Binary files /dev/null and b/src/public/data/pack/server/maps/o46_47 differ diff --git a/src/public/data/pack/server/maps/o46_48 b/src/public/data/pack/server/maps/o46_48 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o46_49 b/src/public/data/pack/server/maps/o46_49 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o46_50 b/src/public/data/pack/server/maps/o46_50 new file mode 100644 index 00000000..bf562311 --- /dev/null +++ b/src/public/data/pack/server/maps/o46_50 @@ -0,0 +1 @@ +ÂççÅrÐñÌ) \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o46_51 b/src/public/data/pack/server/maps/o46_51 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o46_52 b/src/public/data/pack/server/maps/o46_52 new file mode 100644 index 00000000..7769b33a Binary files /dev/null and b/src/public/data/pack/server/maps/o46_52 differ diff --git a/src/public/data/pack/server/maps/o46_53 b/src/public/data/pack/server/maps/o46_53 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o46_54 b/src/public/data/pack/server/maps/o46_54 new file mode 100644 index 00000000..db0457ae --- /dev/null +++ b/src/public/data/pack/server/maps/o46_54 @@ -0,0 +1 @@ +¶… \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o46_55 b/src/public/data/pack/server/maps/o46_55 new file mode 100644 index 00000000..36481cfe --- /dev/null +++ b/src/public/data/pack/server/maps/o46_55 @@ -0,0 +1 @@ +IÄ‹Ä \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o46_56 b/src/public/data/pack/server/maps/o46_56 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o46_57 b/src/public/data/pack/server/maps/o46_57 new file mode 100644 index 00000000..e54cce7e --- /dev/null +++ b/src/public/data/pack/server/maps/o46_57 @@ -0,0 +1,4 @@ +8ÀôÆ6Æ:ÀqÆñÆvÀ±úÆi"ƸÆÛã ñÆ +[ã +äÆ +æ_ #9 ›ã kÆ ¹9 ö/²Æ \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o46_58 b/src/public/data/pack/server/maps/o46_58 new file mode 100644 index 00000000..3a0312c4 --- /dev/null +++ b/src/public/data/pack/server/maps/o46_58 @@ -0,0 +1 @@ +³ 4 \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o46_59 b/src/public/data/pack/server/maps/o46_59 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o46_60 b/src/public/data/pack/server/maps/o46_60 new file mode 100644 index 00000000..8cec6fbb Binary files /dev/null and b/src/public/data/pack/server/maps/o46_60 differ diff --git a/src/public/data/pack/server/maps/o46_61 b/src/public/data/pack/server/maps/o46_61 new file mode 100644 index 00000000..def2350a --- /dev/null +++ b/src/public/data/pack/server/maps/o46_61 @@ -0,0 +1 @@ +  ” Ò’ \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o46_62 b/src/public/data/pack/server/maps/o46_62 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o46_75 b/src/public/data/pack/server/maps/o46_75 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o47_148 b/src/public/data/pack/server/maps/o47_148 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o47_149 b/src/public/data/pack/server/maps/o47_149 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o47_150 b/src/public/data/pack/server/maps/o47_150 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o47_152 b/src/public/data/pack/server/maps/o47_152 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o47_153 b/src/public/data/pack/server/maps/o47_153 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o47_160 b/src/public/data/pack/server/maps/o47_160 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o47_161 b/src/public/data/pack/server/maps/o47_161 new file mode 100644 index 00000000..62fd0867 Binary files /dev/null and b/src/public/data/pack/server/maps/o47_161 differ diff --git a/src/public/data/pack/server/maps/o47_47 b/src/public/data/pack/server/maps/o47_47 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o47_48 b/src/public/data/pack/server/maps/o47_48 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o47_49 b/src/public/data/pack/server/maps/o47_49 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o47_50 b/src/public/data/pack/server/maps/o47_50 new file mode 100644 index 00000000..e000a14a Binary files /dev/null and b/src/public/data/pack/server/maps/o47_50 differ diff --git a/src/public/data/pack/server/maps/o47_51 b/src/public/data/pack/server/maps/o47_51 new file mode 100644 index 00000000..2219affa --- /dev/null +++ b/src/public/data/pack/server/maps/o47_51 @@ -0,0 +1 @@ +˜_˜…™… \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o47_52 b/src/public/data/pack/server/maps/o47_52 new file mode 100644 index 00000000..40297b64 Binary files /dev/null and b/src/public/data/pack/server/maps/o47_52 differ diff --git a/src/public/data/pack/server/maps/o47_53 b/src/public/data/pack/server/maps/o47_53 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o47_54 b/src/public/data/pack/server/maps/o47_54 new file mode 100644 index 00000000..295eb511 --- /dev/null +++ b/src/public/data/pack/server/maps/o47_54 @@ -0,0 +1 @@ +ß à \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o47_55 b/src/public/data/pack/server/maps/o47_55 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o47_56 b/src/public/data/pack/server/maps/o47_56 new file mode 100644 index 00000000..9dace7b1 --- /dev/null +++ b/src/public/data/pack/server/maps/o47_56 @@ -0,0 +1 @@ +u/x2ø.µ*5+µ,5- \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o47_57 b/src/public/data/pack/server/maps/o47_57 new file mode 100644 index 00000000..9e845e03 --- /dev/null +++ b/src/public/data/pack/server/maps/o47_57 @@ -0,0 +1 @@ +ú¾ûÁ \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o47_58 b/src/public/data/pack/server/maps/o47_58 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o47_59 b/src/public/data/pack/server/maps/o47_59 new file mode 100644 index 00000000..7cae3931 --- /dev/null +++ b/src/public/data/pack/server/maps/o47_59 @@ -0,0 +1 @@ +w \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o47_60 b/src/public/data/pack/server/maps/o47_60 new file mode 100644 index 00000000..c30280ec --- /dev/null +++ b/src/public/data/pack/server/maps/o47_60 @@ -0,0 +1 @@ +Xv \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o47_61 b/src/public/data/pack/server/maps/o47_61 new file mode 100644 index 00000000..9b39e80a --- /dev/null +++ b/src/public/data/pack/server/maps/o47_61 @@ -0,0 +1 @@ +°  \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o47_62 b/src/public/data/pack/server/maps/o47_62 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o47_75 b/src/public/data/pack/server/maps/o47_75 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o48_148 b/src/public/data/pack/server/maps/o48_148 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o48_149 b/src/public/data/pack/server/maps/o48_149 new file mode 100644 index 00000000..26695b89 --- /dev/null +++ b/src/public/data/pack/server/maps/o48_149 @@ -0,0 +1 @@ + ) \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o48_152 b/src/public/data/pack/server/maps/o48_152 new file mode 100644 index 00000000..b7bcb88a --- /dev/null +++ b/src/public/data/pack/server/maps/o48_152 @@ -0,0 +1 @@ +1s \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o48_153 b/src/public/data/pack/server/maps/o48_153 new file mode 100644 index 00000000..6d628528 --- /dev/null +++ b/src/public/data/pack/server/maps/o48_153 @@ -0,0 +1 @@ +aß _ ¡ \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o48_154 b/src/public/data/pack/server/maps/o48_154 new file mode 100644 index 00000000..849f0582 --- /dev/null +++ b/src/public/data/pack/server/maps/o48_154 @@ -0,0 +1 @@ +*ã+ãëãW\²mž # æ & ™ñ £¯rÆ×ür \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o48_155 b/src/public/data/pack/server/maps/o48_155 new file mode 100644 index 00000000..2679bd50 Binary files /dev/null and b/src/public/data/pack/server/maps/o48_155 differ diff --git a/src/public/data/pack/server/maps/o48_156 b/src/public/data/pack/server/maps/o48_156 new file mode 100644 index 00000000..3187e5e7 Binary files /dev/null and b/src/public/data/pack/server/maps/o48_156 differ diff --git a/src/public/data/pack/server/maps/o48_47 b/src/public/data/pack/server/maps/o48_47 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o48_48 b/src/public/data/pack/server/maps/o48_48 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o48_49 b/src/public/data/pack/server/maps/o48_49 new file mode 100644 index 00000000..05d01d93 --- /dev/null +++ b/src/public/data/pack/server/maps/o48_49 @@ -0,0 +1 @@ +Wç—ç˜ç ×%% \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o48_50 b/src/public/data/pack/server/maps/o48_50 new file mode 100644 index 00000000..2922da5f --- /dev/null +++ b/src/public/data/pack/server/maps/o48_50 @@ -0,0 +1 @@ +=Áý¾ \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o48_51 b/src/public/data/pack/server/maps/o48_51 new file mode 100644 index 00000000..286f9b73 --- /dev/null +++ b/src/public/data/pack/server/maps/o48_51 @@ -0,0 +1 @@ +AçBç \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o48_52 b/src/public/data/pack/server/maps/o48_52 new file mode 100644 index 00000000..b815d028 --- /dev/null +++ b/src/public/data/pack/server/maps/o48_52 @@ -0,0 +1 @@ +#¯c¯d¯e¯£¯¤¯¥¯f ç ¸ _…  s œÇ*)N \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o48_53 b/src/public/data/pack/server/maps/o48_53 new file mode 100644 index 00000000..f07a0c57 Binary files /dev/null and b/src/public/data/pack/server/maps/o48_53 differ diff --git a/src/public/data/pack/server/maps/o48_54 b/src/public/data/pack/server/maps/o48_54 new file mode 100644 index 00000000..3a1b4870 --- /dev/null +++ b/src/public/data/pack/server/maps/o48_54 @@ -0,0 +1 @@ +^# ýŒ \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o48_55 b/src/public/data/pack/server/maps/o48_55 new file mode 100644 index 00000000..3af1077b --- /dev/null +++ b/src/public/data/pack/server/maps/o48_55 @@ -0,0 +1 @@ +zã¬ãåãôãÜã ã \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o48_56 b/src/public/data/pack/server/maps/o48_56 new file mode 100644 index 00000000..926f9897 --- /dev/null +++ b/src/public/data/pack/server/maps/o48_56 @@ -0,0 +1 @@ +ŒrrHrVrÌrÐrWr Tr ›r \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o48_57 b/src/public/data/pack/server/maps/o48_57 new file mode 100644 index 00000000..d19e1079 --- /dev/null +++ b/src/public/data/pack/server/maps/o48_57 @@ -0,0 +1,5 @@ +omämèm1vmè_mnm km qm É / +"m +& +/ +ªm 5m p \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o48_58 b/src/public/data/pack/server/maps/o48_58 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o48_59 b/src/public/data/pack/server/maps/o48_59 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o48_60 b/src/public/data/pack/server/maps/o48_60 new file mode 100644 index 00000000..25672b08 --- /dev/null +++ b/src/public/data/pack/server/maps/o48_60 @@ -0,0 +1 @@ +ãS_Ù/i ã \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o48_61 b/src/public/data/pack/server/maps/o48_61 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o48_62 b/src/public/data/pack/server/maps/o48_62 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o49_148 b/src/public/data/pack/server/maps/o49_148 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o49_149 b/src/public/data/pack/server/maps/o49_149 new file mode 100644 index 00000000..a3a6249d --- /dev/null +++ b/src/public/data/pack/server/maps/o49_149 @@ -0,0 +1 @@ +µm… \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o49_153 b/src/public/data/pack/server/maps/o49_153 new file mode 100644 index 00000000..0766106d --- /dev/null +++ b/src/public/data/pack/server/maps/o49_153 @@ -0,0 +1 @@ + ã ã* [ã# ›ã8 Üñ ÝãBv 5Üãݼêãi \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o49_154 b/src/public/data/pack/server/maps/o49_154 new file mode 100644 index 00000000..6d1a3ddc Binary files /dev/null and b/src/public/data/pack/server/maps/o49_154 differ diff --git a/src/public/data/pack/server/maps/o49_155 b/src/public/data/pack/server/maps/o49_155 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o49_156 b/src/public/data/pack/server/maps/o49_156 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o49_46 b/src/public/data/pack/server/maps/o49_46 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o49_47 b/src/public/data/pack/server/maps/o49_47 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o49_48 b/src/public/data/pack/server/maps/o49_48 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o49_49 b/src/public/data/pack/server/maps/o49_49 new file mode 100644 index 00000000..b0e2c70c --- /dev/null +++ b/src/public/data/pack/server/maps/o49_49 @@ -0,0 +1,2 @@ +!“,“3“Ÿ“é“÷“ ^“ j“ +ö“ y“ “ ì“ Y“ [“ Ú“m“ “ \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o49_50 b/src/public/data/pack/server/maps/o49_50 new file mode 100644 index 00000000..0c8107c5 --- /dev/null +++ b/src/public/data/pack/server/maps/o49_50 @@ -0,0 +1 @@ + ‹¯, \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o49_51 b/src/public/data/pack/server/maps/o49_51 new file mode 100644 index 00000000..a3b4ae15 --- /dev/null +++ b/src/public/data/pack/server/maps/o49_51 @@ -0,0 +1 @@ +*Ç \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o49_52 b/src/public/data/pack/server/maps/o49_52 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o49_53 b/src/public/data/pack/server/maps/o49_53 new file mode 100644 index 00000000..292923b8 --- /dev/null +++ b/src/public/data/pack/server/maps/o49_53 @@ -0,0 +1 @@ +üµÇ%% % %H%7£<ƒw£|_· !7£!w"9‹":à \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o49_54 b/src/public/data/pack/server/maps/o49_54 new file mode 100644 index 00000000..8957ed9f --- /dev/null +++ b/src/public/data/pack/server/maps/o49_54 @@ -0,0 +1 @@ +§/û- \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o49_55 b/src/public/data/pack/server/maps/o49_55 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o49_56 b/src/public/data/pack/server/maps/o49_56 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o49_57 b/src/public/data/pack/server/maps/o49_57 new file mode 100644 index 00000000..6e6dc1b7 --- /dev/null +++ b/src/public/data/pack/server/maps/o49_57 @@ -0,0 +1,2 @@ +ÀZÆ‹À–À#³˜·LÆàÀ E ¨Æ +¤q •À Æ \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o49_58 b/src/public/data/pack/server/maps/o49_58 new file mode 100644 index 00000000..bb822623 --- /dev/null +++ b/src/public/data/pack/server/maps/o49_58 @@ -0,0 +1 @@ +[¼ Š  - \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o49_59 b/src/public/data/pack/server/maps/o49_59 new file mode 100644 index 00000000..11cc8c47 Binary files /dev/null and b/src/public/data/pack/server/maps/o49_59 differ diff --git a/src/public/data/pack/server/maps/o49_60 b/src/public/data/pack/server/maps/o49_60 new file mode 100644 index 00000000..6bbdf142 Binary files /dev/null and b/src/public/data/pack/server/maps/o49_60 differ diff --git a/src/public/data/pack/server/maps/o49_61 b/src/public/data/pack/server/maps/o49_61 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o49_62 b/src/public/data/pack/server/maps/o49_62 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o50_149 b/src/public/data/pack/server/maps/o50_149 new file mode 100644 index 00000000..99ade0be --- /dev/null +++ b/src/public/data/pack/server/maps/o50_149 @@ -0,0 +1 @@ +|˜ \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o50_150 b/src/public/data/pack/server/maps/o50_150 new file mode 100644 index 00000000..24eb01f6 --- /dev/null +++ b/src/public/data/pack/server/maps/o50_150 @@ -0,0 +1 @@ +%%ÙÙ²…V­ \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o50_152 b/src/public/data/pack/server/maps/o50_152 new file mode 100644 index 00000000..9f98dc8d --- /dev/null +++ b/src/public/data/pack/server/maps/o50_152 @@ -0,0 +1 @@ + aà \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o50_153 b/src/public/data/pack/server/maps/o50_153 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o50_154 b/src/public/data/pack/server/maps/o50_154 new file mode 100644 index 00000000..ad38ff9b --- /dev/null +++ b/src/public/data/pack/server/maps/o50_154 @@ -0,0 +1 @@ +6.¶/ \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o50_46 b/src/public/data/pack/server/maps/o50_46 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o50_47 b/src/public/data/pack/server/maps/o50_47 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o50_48 b/src/public/data/pack/server/maps/o50_48 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o50_49 b/src/public/data/pack/server/maps/o50_49 new file mode 100644 index 00000000..074609e8 --- /dev/null +++ b/src/public/data/pack/server/maps/o50_49 @@ -0,0 +1 @@ +# \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o50_50 b/src/public/data/pack/server/maps/o50_50 new file mode 100644 index 00000000..6814c4aa --- /dev/null +++ b/src/public/data/pack/server/maps/o50_50 @@ -0,0 +1 @@ +[rˆ.Œ‹ ² -³Rµ!Xç!Zç"ç"Xç'Oñ'Wñ \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o50_51 b/src/public/data/pack/server/maps/o50_51 new file mode 100644 index 00000000..e445018e --- /dev/null +++ b/src/public/data/pack/server/maps/o50_51 @@ -0,0 +1 @@ +¥˜…c˜ \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o50_52 b/src/public/data/pack/server/maps/o50_52 new file mode 100644 index 00000000..03b79073 --- /dev/null +++ b/src/public/data/pack/server/maps/o50_52 @@ -0,0 +1 @@ +·³¹#÷ÿ:%yÿ \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o50_53 b/src/public/data/pack/server/maps/o50_53 new file mode 100644 index 00000000..ed917ec3 Binary files /dev/null and b/src/public/data/pack/server/maps/o50_53 differ diff --git a/src/public/data/pack/server/maps/o50_54 b/src/public/data/pack/server/maps/o50_54 new file mode 100644 index 00000000..1cebd699 --- /dev/null +++ b/src/public/data/pack/server/maps/o50_54 @@ -0,0 +1 @@ +;“¦ 0ã,ãi…£… \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o50_55 b/src/public/data/pack/server/maps/o50_55 new file mode 100644 index 00000000..a9c17874 --- /dev/null +++ b/src/public/data/pack/server/maps/o50_55 @@ -0,0 +1 @@ +ÿ/n/6/¤ã \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o50_56 b/src/public/data/pack/server/maps/o50_56 new file mode 100644 index 00000000..96b18cc8 --- /dev/null +++ b/src/public/data/pack/server/maps/o50_56 @@ -0,0 +1 @@ +U˜ÓÕ×  S T [ “ Ô Ö  Ÿ \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o50_57 b/src/public/data/pack/server/maps/o50_57 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o50_58 b/src/public/data/pack/server/maps/o50_58 new file mode 100644 index 00000000..34632cb4 --- /dev/null +++ b/src/public/data/pack/server/maps/o50_58 @@ -0,0 +1,3 @@ +\’+•$aÄ›" "\¡Þc\Ä % + +Þ Ü ß ` Ø å  X Ä_×× \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o50_59 b/src/public/data/pack/server/maps/o50_59 new file mode 100644 index 00000000..36d23772 Binary files /dev/null and b/src/public/data/pack/server/maps/o50_59 differ diff --git a/src/public/data/pack/server/maps/o50_60 b/src/public/data/pack/server/maps/o50_60 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o50_61 b/src/public/data/pack/server/maps/o50_61 new file mode 100644 index 00000000..7e025ba5 Binary files /dev/null and b/src/public/data/pack/server/maps/o50_61 differ diff --git a/src/public/data/pack/server/maps/o50_62 b/src/public/data/pack/server/maps/o50_62 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o51_147 b/src/public/data/pack/server/maps/o51_147 new file mode 100644 index 00000000..eb7159cc --- /dev/null +++ b/src/public/data/pack/server/maps/o51_147 @@ -0,0 +1 @@ +ñ"ñ \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o51_154 b/src/public/data/pack/server/maps/o51_154 new file mode 100644 index 00000000..e84ce025 --- /dev/null +++ b/src/public/data/pack/server/maps/o51_154 @@ -0,0 +1 @@ +Žã \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o51_46 b/src/public/data/pack/server/maps/o51_46 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o51_47 b/src/public/data/pack/server/maps/o51_47 new file mode 100644 index 00000000..842ca94f --- /dev/null +++ b/src/public/data/pack/server/maps/o51_47 @@ -0,0 +1 @@ +ÚÙÉ \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o51_48 b/src/public/data/pack/server/maps/o51_48 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o51_49 b/src/public/data/pack/server/maps/o51_49 new file mode 100644 index 00000000..0fbef0b1 --- /dev/null +++ b/src/public/data/pack/server/maps/o51_49 @@ -0,0 +1,2 @@ +g­ ¢‘ ¶% +û…Ž·/ \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o51_50 b/src/public/data/pack/server/maps/o51_50 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o51_51 b/src/public/data/pack/server/maps/o51_51 new file mode 100644 index 00000000..05919ebb --- /dev/null +++ b/src/public/data/pack/server/maps/o51_51 @@ -0,0 +1,2 @@ +´+ +/* \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o51_52 b/src/public/data/pack/server/maps/o51_52 new file mode 100644 index 00000000..63dd7010 Binary files /dev/null and b/src/public/data/pack/server/maps/o51_52 differ diff --git a/src/public/data/pack/server/maps/o51_53 b/src/public/data/pack/server/maps/o51_53 new file mode 100644 index 00000000..3d46142c --- /dev/null +++ b/src/public/data/pack/server/maps/o51_53 @@ -0,0 +1 @@ +ÕÈ \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o51_54 b/src/public/data/pack/server/maps/o51_54 new file mode 100644 index 00000000..e78ebfeb --- /dev/null +++ b/src/public/data/pack/server/maps/o51_54 @@ -0,0 +1 @@ +£Æøç 4ç sç ³ç ¶ç îç ïç °ç ïç \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o51_55 b/src/public/data/pack/server/maps/o51_55 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o51_56 b/src/public/data/pack/server/maps/o51_56 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o51_57 b/src/public/data/pack/server/maps/o51_57 new file mode 100644 index 00000000..461312d6 --- /dev/null +++ b/src/public/data/pack/server/maps/o51_57 @@ -0,0 +1,2 @@ + ÈÆÊLPÐÀ‰ÆË  +JOÆÊCÆÄÀ \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o51_58 b/src/public/data/pack/server/maps/o51_58 new file mode 100644 index 00000000..c1d821b9 Binary files /dev/null and b/src/public/data/pack/server/maps/o51_58 differ diff --git a/src/public/data/pack/server/maps/o51_59 b/src/public/data/pack/server/maps/o51_59 new file mode 100644 index 00000000..61d41b30 --- /dev/null +++ b/src/public/data/pack/server/maps/o51_59 @@ -0,0 +1,2 @@ +ë5ž5 +h5 \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o51_60 b/src/public/data/pack/server/maps/o51_60 new file mode 100644 index 00000000..28e9d9d3 --- /dev/null +++ b/src/public/data/pack/server/maps/o51_60 @@ -0,0 +1,2 @@ +ï3²ð/r5 +Ó1 Í1 r 0t \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o51_61 b/src/public/data/pack/server/maps/o51_61 new file mode 100644 index 00000000..ece96d99 --- /dev/null +++ b/src/public/data/pack/server/maps/o51_61 @@ -0,0 +1 @@ +V¼˜¼¼Ü¼Ÿ•3â³4༠\ No newline at end of file diff --git a/src/public/data/pack/server/maps/o51_62 b/src/public/data/pack/server/maps/o51_62 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o52_152 b/src/public/data/pack/server/maps/o52_152 new file mode 100644 index 00000000..b7b143d5 --- /dev/null +++ b/src/public/data/pack/server/maps/o52_152 @@ -0,0 +1,4 @@ +óÄYóØóàÄà……… V eÄ Õ + +Y +kÄ  “» UZ” \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o52_153 b/src/public/data/pack/server/maps/o52_153 new file mode 100644 index 00000000..bfbfc7e1 --- /dev/null +++ b/src/public/data/pack/server/maps/o52_153 @@ -0,0 +1,4 @@ +óÄYó˜óàÄà……… V eÄ Õ + +Y +kÄ  “» UZ” \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o52_154 b/src/public/data/pack/server/maps/o52_154 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o52_46 b/src/public/data/pack/server/maps/o52_46 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o52_47 b/src/public/data/pack/server/maps/o52_47 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o52_48 b/src/public/data/pack/server/maps/o52_48 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o52_49 b/src/public/data/pack/server/maps/o52_49 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o52_50 b/src/public/data/pack/server/maps/o52_50 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o52_51 b/src/public/data/pack/server/maps/o52_51 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o52_52 b/src/public/data/pack/server/maps/o52_52 new file mode 100644 index 00000000..8195a619 --- /dev/null +++ b/src/public/data/pack/server/maps/o52_52 @@ -0,0 +1,2 @@ + +r¥ \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o52_53 b/src/public/data/pack/server/maps/o52_53 new file mode 100644 index 00000000..5c855e5f --- /dev/null +++ b/src/public/data/pack/server/maps/o52_53 @@ -0,0 +1,3 @@ +¢dS + +T \ No newline at end of file diff --git a/src/public/data/pack/server/maps/o52_54 b/src/public/data/pack/server/maps/o52_54 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o52_55 b/src/public/data/pack/server/maps/o52_55 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o52_56 b/src/public/data/pack/server/maps/o52_56 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o52_57 b/src/public/data/pack/server/maps/o52_57 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o52_58 b/src/public/data/pack/server/maps/o52_58 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o52_59 b/src/public/data/pack/server/maps/o52_59 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o52_60 b/src/public/data/pack/server/maps/o52_60 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o52_61 b/src/public/data/pack/server/maps/o52_61 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o52_62 b/src/public/data/pack/server/maps/o52_62 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o53_49 b/src/public/data/pack/server/maps/o53_49 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o53_50 b/src/public/data/pack/server/maps/o53_50 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o53_51 b/src/public/data/pack/server/maps/o53_51 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o53_52 b/src/public/data/pack/server/maps/o53_52 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/maps/o53_53 b/src/public/data/pack/server/maps/o53_53 new file mode 100644 index 00000000..e69de29b diff --git a/src/public/data/pack/server/mesanim.dat b/src/public/data/pack/server/mesanim.dat new file mode 100644 index 00000000..038bc9dc Binary files /dev/null and b/src/public/data/pack/server/mesanim.dat differ diff --git a/src/public/data/pack/server/mesanim.idx b/src/public/data/pack/server/mesanim.idx new file mode 100644 index 00000000..936adaad Binary files /dev/null and b/src/public/data/pack/server/mesanim.idx differ diff --git a/src/public/data/pack/server/npc.dat b/src/public/data/pack/server/npc.dat new file mode 100644 index 00000000..786d2111 Binary files /dev/null and b/src/public/data/pack/server/npc.dat differ diff --git a/src/public/data/pack/server/npc.idx b/src/public/data/pack/server/npc.idx new file mode 100644 index 00000000..9f2f887c Binary files /dev/null and b/src/public/data/pack/server/npc.idx differ diff --git a/src/public/data/pack/server/obj.dat b/src/public/data/pack/server/obj.dat new file mode 100644 index 00000000..3446040a Binary files /dev/null and b/src/public/data/pack/server/obj.dat differ diff --git a/src/public/data/pack/server/obj.idx b/src/public/data/pack/server/obj.idx new file mode 100644 index 00000000..125f45db Binary files /dev/null and b/src/public/data/pack/server/obj.idx differ diff --git a/src/public/data/pack/server/param.dat b/src/public/data/pack/server/param.dat new file mode 100644 index 00000000..a5c60058 Binary files /dev/null and b/src/public/data/pack/server/param.dat differ diff --git a/src/public/data/pack/server/param.idx b/src/public/data/pack/server/param.idx new file mode 100644 index 00000000..286a49b8 Binary files /dev/null and b/src/public/data/pack/server/param.idx differ diff --git a/src/public/data/pack/server/script.dat b/src/public/data/pack/server/script.dat new file mode 100644 index 00000000..1fbd6d69 Binary files /dev/null and b/src/public/data/pack/server/script.dat differ diff --git a/src/public/data/pack/server/script.idx b/src/public/data/pack/server/script.idx new file mode 100644 index 00000000..812f8955 Binary files /dev/null and b/src/public/data/pack/server/script.idx differ diff --git a/src/public/data/pack/server/seq.dat b/src/public/data/pack/server/seq.dat new file mode 100644 index 00000000..2448457a Binary files /dev/null and b/src/public/data/pack/server/seq.dat differ diff --git a/src/public/data/pack/server/seq.idx b/src/public/data/pack/server/seq.idx new file mode 100644 index 00000000..06b64275 Binary files /dev/null and b/src/public/data/pack/server/seq.idx differ diff --git a/src/public/data/pack/server/spotanim.dat b/src/public/data/pack/server/spotanim.dat new file mode 100644 index 00000000..0abff4dd Binary files /dev/null and b/src/public/data/pack/server/spotanim.dat differ diff --git a/src/public/data/pack/server/spotanim.idx b/src/public/data/pack/server/spotanim.idx new file mode 100644 index 00000000..1fe1a8b8 Binary files /dev/null and b/src/public/data/pack/server/spotanim.idx differ diff --git a/src/public/data/pack/server/struct.dat b/src/public/data/pack/server/struct.dat new file mode 100644 index 00000000..dd4b5d38 Binary files /dev/null and b/src/public/data/pack/server/struct.dat differ diff --git a/src/public/data/pack/server/struct.idx b/src/public/data/pack/server/struct.idx new file mode 100644 index 00000000..3642d0bc Binary files /dev/null and b/src/public/data/pack/server/struct.idx differ diff --git a/src/public/data/pack/server/varn.dat b/src/public/data/pack/server/varn.dat new file mode 100644 index 00000000..675aa867 Binary files /dev/null and b/src/public/data/pack/server/varn.dat differ diff --git a/src/public/data/pack/server/varn.idx b/src/public/data/pack/server/varn.idx new file mode 100644 index 00000000..ee4aaf9f Binary files /dev/null and b/src/public/data/pack/server/varn.idx differ diff --git a/src/public/data/pack/server/varp.dat b/src/public/data/pack/server/varp.dat new file mode 100644 index 00000000..056a42ec Binary files /dev/null and b/src/public/data/pack/server/varp.dat differ diff --git a/src/public/data/pack/server/varp.idx b/src/public/data/pack/server/varp.idx new file mode 100644 index 00000000..fc38e0f7 Binary files /dev/null and b/src/public/data/pack/server/varp.idx differ diff --git a/src/public/data/pack/server/vars.dat b/src/public/data/pack/server/vars.dat new file mode 100644 index 00000000..cdbb2212 Binary files /dev/null and b/src/public/data/pack/server/vars.dat differ diff --git a/src/public/data/pack/server/vars.idx b/src/public/data/pack/server/vars.idx new file mode 100644 index 00000000..f7379ca9 Binary files /dev/null and b/src/public/data/pack/server/vars.idx differ diff --git a/src/public/data/symbols/category.sym b/src/public/data/symbols/category.sym new file mode 100644 index 00000000..83cea7d4 --- /dev/null +++ b/src/public/data/symbols/category.sym @@ -0,0 +1,207 @@ +0 hemenster_gate +1 keep_lefaye_door +2 door_open_and_close +3 empty_crate +4 empty_crates +5 empty_boxes +6 bookcase +7 locked_gate +8 red_vine +9 magic_guild_dungeon_door +10 ball_irongate +11 double_door_open_and_close_right +12 double_door_open_and_close_left +13 border_gate_toll_left +14 border_gate_toll_right +15 door_closed +16 door_opened +17 door_left_closed +18 door_left_opened +19 door_right_closed +20 door_right_opened +21 outpost_gate +22 pineapple_plant_wild +23 banana_tree +24 mcgrubor_gate +25 monkeybars +26 prayer_altar +27 chest_closed +28 chest_open +29 cupboard_closed +30 cupboard_opened +31 drawer +32 empty_drawer +33 gangplank_board +34 gangplank_disembark +35 gate_main_closed +36 gate_outer_closed +37 gate_main_open +38 gate_outer_open +39 hopper_nonfull +40 hoppercontrol +41 unusable_table +42 usable_table +43 watersource +44 party_balloon +45 varrock_gate +46 incorrect_clock_spindle +47 cooking_oven +48 manor_entrance +49 manor_bookcase +50 haunted_door +51 haunted_lever +52 hazeelcult_valve +53 observatory_dungeon_gate +54 island_rope_swing +55 karamja_stepping_stone +56 wilderness_course_main_gate +57 cooking_fire +58 mining_rock_normal +59 mining_rock_fast +60 mining_rock_macro_gas +61 rc_ruins +62 rc_altar +63 rc_exit_portal +64 smithing_furnace +65 tree +66 tutorial_gate +67 tut_mining_exit +68 rat_pit_cage +69 citizen +70 guard +71 barbarian +72 chicken +73 duck +74 duckling +75 cow +76 black_demon +77 unicorn +78 bear +79 pirate +80 monk_of_zamorak +81 shop_keeper +82 fisherman_platform +83 bank_teller +84 gnome_troop +85 kolodion +86 battle_mage +87 sailor +88 bandit_camp_leader +89 macro_event_rock_golem +90 macro_event_zombie +91 macro_event_shade +92 macro_event_watchman +93 macro_event_dryad +94 macro_event_ent +95 macro_event_river_troll +96 freshfish +97 saltfish +98 rarefish +99 memberfish +100 healer +101 tower_advisor +102 witches_experiment +103 guardian_of_armadyl +104 category_475 +105 weapon_slash +106 armour_cape +107 weapon_staff +108 weapon_scythe +109 category_1328 +110 category_16 +111 category_715 +112 category_81 +113 category_31 +114 category_30 +115 category_29 +116 water_skin_filled +117 category_118 +118 category_120 +119 category_1399 +120 category_734 +121 category_1748 +122 category_5 +123 armour_godcape +124 category_69 +125 flowers +126 category_15 +127 trail_casket_easy +128 trail_casket_hard +129 trail_puzzle_piece +130 trail_puzzle +131 trail_casket_medium +132 trail_clue_easy +133 trail_clue_hard +134 trail_clue_medium +135 trail_challenge +136 armour_helmet +137 armour_body +138 light_source_lit +139 light_source_unlit +140 weapon_crossbow +141 cog +142 category_74 +143 category_528 +144 arrows +145 weapon_thrown +146 weapon_stab +147 category_1176 +148 cannon_parts +149 murder_proofobj +150 murder_flourobj +151 murder_printobj +152 scorpcage +153 category_91 +154 weapon_blunt +155 weapon_2h_sword +156 weapon_axe +157 armour_shield +158 weapon_spiked +159 armour_legs +160 weapon_spear +161 category_17 +162 bolts +163 weapon_bow +164 weapon_javelin +165 alcoholic_drinks +166 category_135 +167 category_131 +168 category_59 +169 category_86 +170 category_58 +171 cooking_generic +172 category_130 +173 category_128 +174 category_124 +175 category_125 +176 category_83 +177 category_122 +178 category_123 +179 category_127 +180 category_126 +181 category_129 +182 category_132 +183 category_82 +184 category_621 +185 category_656 +186 armour_hands +187 category_22 +188 category_532 +189 category_57 +190 category_116 +191 category_968 +192 category_530 +193 category_969 +194 ogre_arrows +195 unstrung_bow +196 category_774 +197 category_90 +198 category_773 +199 category_136 +200 category_557 +201 craft_orb +202 category_149 +203 weapon_pickaxe +204 bones +205 talismans +206 category_151 diff --git a/src/public/data/symbols/commands.sym b/src/public/data/symbols/commands.sym new file mode 100644 index 00000000..f7df0eee --- /dev/null +++ b/src/public/data/symbols/commands.sym @@ -0,0 +1,383 @@ +0 push_constant_int +1 push_varp +2 pop_varp +3 push_constant_string +4 push_varn +5 pop_varn +6 branch +7 branch_not +8 branch_equals +9 branch_less_than +10 branch_greater_than +11 push_vars +12 pop_vars +21 return +22 gosub +23 jump +24 switch +31 branch_less_than_or_equals +32 branch_greater_than_or_equals +33 push_int_local +34 pop_int_local +35 push_string_local +36 pop_string_local +37 join_string +38 pop_int_discard +39 pop_string_discard +40 gosub_with_params +41 jump_with_params +44 define_array +45 push_array_int +46 pop_array_int +1000 coordx +1001 coordy +1002 coordz +1003 distance +1004 huntall none find_player none +1005 huntnext find_player:find_player CONDITIONAL:active_player:active_player2 none +1006 inzone +1007 lineofsight +1008 lineofwalk +1009 map_blocked +1010 map_indoors +1011 map_clock +1012 map_locaddunsafe +1013 map_members +1014 map_playercount +1015 map_findsquare +1016 movecoord +1017 playercount +1018 projanim_map +1019 projanim_npc active_npc:active_npc2 none none +1020 projanim_pl active_player:active_player2 none none +1021 seqlength +1022 split_get +1023 split_getanim +1024 split_init +1025 split_linecount +1026 split_pagecount +1027 spotanim_map +1028 stat_random +1029 struct_param +1030 world_delay +1031 npccount +1032 zonecount +1033 loccount +1034 objcount +2000 allowdesign active_player none none +2001 anim active_player:active_player2 none none +2002 bas_readyanim active_player none none +2003 bas_running active_player none none +2004 bas_turnonspot active_player none none +2005 bas_walk_b active_player none none +2006 bas_walk_f active_player none none +2007 bas_walk_l active_player none none +2008 bas_walk_r active_player none none +2009 buffer_full active_player none none +2010 buildappearance active_player none none +2011 busy active_player:active_player2 none none +2012 cam_lookat active_player:active_player2 none none +2013 cam_moveto active_player:active_player2 none none +2014 cam_reset active_player:active_player2 none none +2015 cam_shake active_player:active_player2 none none +2016 clearqueue active_player none none +2017 clearsofttimer active_player:active_player2 none none +2018 cleartimer active_player:active_player2 none none +2019 coord active_player:active_player2 none none +2020 damage active_player:active_player2 none none +2021 displayname active_player:active_player2 none none +2022 facesquare active_player:active_player2 none none +2023 finduid none CONDITIONAL:active_player:active_player2 none +2024 gender active_player:active_player2 none none +2025 getqueue active_player:active_player2 none none +2026 stat_advance active_player none none +2027 headicons_get active_player none none +2028 headicons_set active_player none none +2029 healenergy active_player none none +2030 hint_coord active_player none none +2031 hint_npc active_player,active_npc none none +2032 hint_player active_player,active_player2 none none +2033 hint_stop active_player none none +2034 if_close active_player:active_player2 none none +2035 if_closesticky active_player none none +2036 if_multizone active_player none none +2037 if_openchat active_player none none +2038 if_openchatsticky active_player none none +2039 if_openmainmodal active_player:active_player2 none none +2040 if_openmainmodalsideoverlay active_player:active_player2 none none +2041 if_opensideoverlay active_player none none +2042 if_setanim active_player none none +2043 if_setcolour active_player none none +2044 if_sethide active_player:active_player2 none none +2045 if_setmodel active_player none none +2046 if_setrecol active_player none none +2047 if_setnpchead active_player none none +2048 if_setobject active_player none none +2049 if_setplayerhead active_player none none +2050 if_setposition active_player none none +2051 if_setresumebuttons active_player none none +2052 if_settab active_player none none +2053 if_settabactive active_player:active_player2 none none +2054 if_settabflash active_player none none +2055 if_settext active_player:active_player2 none none +2056 last_login_info active_player none none +2057 last_com last_com none none +2058 last_int last_int none none +2059 last_item last_item none none +2060 last_slot last_slot none none +2061 last_targetslot last_targetslot none none +2062 last_useitem last_useitem none none +2063 last_useslot last_useslot none none +2064 longqueue active_player:active_player2 none none +2065 mes active_player:active_player2 none none +2066 midi_jingle active_player none none +2067 midi_song active_player none none +2068 name active_player:active_player2 none none +2069 p_aprange p_active_player none none +2070 p_arrivedelay p_active_player none find_player,find_npc,find_loc,find_obj,find_db,last_com,last_int,last_item,last_slot,last_targetslot,last_useitem,last_useslot +2071 p_countdialog p_active_player last_int find_player,find_npc,find_loc,find_obj,find_db,last_com,last_item,last_slot,last_targetslot,last_useitem,last_useslot +2072 p_delay p_active_player none find_player,find_npc,find_loc,find_obj,find_db,last_com,last_int,last_item,last_slot,last_targetslot,last_useitem,last_useslot +2073 p_exactmove p_active_player none none +2074 p_finduid none CONDITIONAL:p_active_player:p_active_player2 none +2075 p_locmerge p_active_player none none +2076 p_logout p_active_player none none +2077 p_opheld p_active_player none none +2078 p_oploc p_active_player,active_loc none none +2079 p_opnpc p_active_player,active_npc none none +2080 p_opnpct p_active_player,active_npc none none +2081 p_opobj p_active_player,active_obj none none +2082 p_opplayer p_active_player,active_player2:p_active_player2,active_player none none +2083 p_opplayert p_active_player,active_player2:p_active_player2,active_player none none +2084 p_pausebutton p_active_player last_com find_player,find_npc,find_loc,find_obj,find_db,last_int,last_item,last_slot,last_targetslot,last_useitem,last_useslot +2085 p_stopaction p_active_player:p_active_player2 none none +2086 p_telejump p_active_player:p_active_player2 none none +2087 p_teleport p_active_player:p_active_player2 none none +2088 p_walk p_active_player:p_active_player2 none none +2089 player_findallzone +2090 player_findnext +2091 queue active_player:active_player2 none none +2092 say active_player:active_player2 none none +2093 walktrigger active_player:active_player2 none none +2094 settimer active_player:active_player2 none none +2095 softtimer active_player:active_player2 none none +2096 sound_synth active_player:active_player2 none none +2097 spotanim_pl active_player:active_player2 none none +2098 staffmodlevel active_player:active_player2 none none +2099 stat active_player:active_player2 none none +2100 stat_add active_player:active_player2 none none +2101 stat_base active_player:active_player2 none none +2102 stat_heal active_player:active_player2 none none +2103 stat_sub active_player:active_player2 none none +2104 strongqueue +2105 uid active_player:active_player2 none none +2106 weakqueue active_player:active_player2 none none +2107 if_openmainoverlay +2108 afk_event +2109 lowmemory active_player none none +2110 setidkit p_active_player none none +2111 p_clearpendingaction p_active_player:p_active_player2 none none +2112 getwalktrigger active_player:active_player2 none none +2113 busy2 active_player:active_player2 none none +2114 findhero none CONDITIONAL:active_player2:active_player none +2115 both_heropoints active_player,active_player2:active_player2,active_player none none +2116 setgender p_active_player none none +2117 setskincolour p_active_player none none +2118 p_animprotect p_active_player:p_active_player2 none none +2119 runenergy active_player:active_player2 none none +2120 weight p_active_player:p_active_player2 none none +2121 last_coord active_player:active_player2 none none +2500 npc_add none active_npc:active_npc2 none +2501 npc_anim active_npc:active_npc2 none none +2502 npc_basestat active_npc:active_npc2 none none +2503 npc_category active_npc:active_npc2 none none +2504 npc_changetype active_npc:active_npc2 none none +2505 npc_coord active_npc:active_npc2 none none +2506 npc_damage active_npc:active_npc2 none none +2507 npc_del active_npc:active_npc2 none none +2508 npc_delay active_npc:active_npc2 none find_player,find_npc,find_loc,find_obj,find_db,last_com,last_int,last_item,last_slot,last_targetslot,last_useitem,last_useslot +2509 npc_facesquare active_npc:active_npc2 none none +2510 npc_find none CONDITIONAL:active_npc:active_npc2 none +2511 npc_findallany none find_npc none +2512 npc_findexact +2513 npc_findhero active_npc CONDITIONAL:active_player:active_player none +2514 npc_findallzone none find_npc none +2515 npc_findnext find_npc CONDITIONAL:active_npc:active_npc2 none +2516 npc_finduid none CONDITIONAL:active_npc:active_npc2 none +2517 npc_getmode active_npc:active_npc2 none none +2518 npc_heropoints active_npc,active_player none none +2519 npc_name active_npc:active_npc2 none none +2520 npc_param active_npc:active_npc2 none none +2521 npc_queue active_npc:active_npc2 none none +2522 npc_range active_npc:active_npc2 none none +2523 npc_say active_npc:active_npc2 none none +2524 npc_huntall none find_npc none +2525 npc_huntnext find_npc:find_npc CONDITIONAL:active_npc:active_npc2 none +2526 npc_sethunt active_npc:active_npc2 none none +2527 npc_sethuntmode active_npc:active_npc2 none none +2528 npc_setmode active_npc:active_npc2 none none +2529 npc_walktrigger active_npc:active_npc2 none none +2530 npc_settimer active_npc:active_npc2 none none +2531 npc_stat active_npc:active_npc2 none none +2532 npc_statadd active_npc:active_npc2 none none +2533 npc_statheal active_npc:active_npc2 none none +2534 npc_statsub active_npc:active_npc2 none none +2535 npc_tele active_npc:active_npc2 none none +2536 npc_type active_npc:active_npc2 none none +2537 npc_uid active_npc:active_npc2 none none +2538 spotanim_npc active_npc:active_npc2 none none +2539 npc_walk active_npc:active_npc2 none none +2540 npc_attackrange active_npc:active_npc2 none none +3000 loc_add none active_loc:active_loc2 none +3001 loc_angle active_loc:active_loc2 none none +3002 loc_anim active_loc:active_loc2 none none +3003 loc_category active_loc:active_loc2 none none +3004 loc_change active_loc:active_loc2 none none +3005 loc_coord active_loc:active_loc2 none none +3006 loc_del active_loc:active_loc2 none none +3007 loc_find none CONDITIONAL:active_loc:active_loc2 none +3008 loc_findallzone none find_loc:find_loc none +3009 loc_findnext find_loc:find_loc CONDITIONAL:active_loc:active_loc2 none +3010 loc_name active_loc:active_loc2 none none +3011 loc_param active_loc:active_loc2 none none +3012 loc_shape active_loc:active_loc2 none none +3013 loc_type active_loc:active_loc2 none none +3500 obj_add active_player:active_player active_obj:active_obj2 none +3501 obj_addall none active_obj:active_obj2 none +3502 obj_coord active_obj:active_obj2 none none +3503 obj_count active_obj:active_obj2 none none +3504 obj_del active_obj:active_obj2 none none +3505 obj_name active_obj:active_obj2 none none +3506 obj_param active_obj:active_obj2 none none +3507 obj_takeitem active_obj,active_player:active_obj,active_player2 none none +3508 obj_type active_obj:active_obj2 none none +4000 nc_category +4001 nc_debugname +4002 nc_desc +4003 nc_name +4004 nc_op +4005 nc_param +4100 lc_category +4101 lc_debugname +4102 lc_desc +4103 lc_name +4104 lc_op +4105 lc_param +4106 lc_width +4107 lc_length +4200 oc_category +4201 oc_cert +4202 oc_cost +4203 oc_debugname +4204 oc_desc +4205 oc_iop +4206 oc_members +4207 oc_name +4208 oc_op +4209 oc_param +4210 oc_stackable +4211 oc_tradeable +4212 oc_uncert +4213 oc_wearpos2 +4214 oc_wearpos3 +4215 oc_wearpos +4216 oc_weight +4300 inv_allstock +4301 inv_size +4302 inv_stockbase +4303 inv_add active_player:active_player2 none none +4304 inv_changeslot active_player:active_player2 none none +4305 inv_clear active_player:active_player2 none none +4306 inv_del active_player:active_player2 none none +4307 inv_delslot active_player:active_player2 none none +4308 inv_dropitem active_player:active_player2 active_obj:active_obj2 none +4309 inv_dropslot active_player:active_player2 active_obj:active_obj2 none +4310 inv_freespace active_player:active_player2 none none +4311 inv_getnum active_player:active_player2 none none +4312 inv_getobj active_player:active_player2 none none +4313 inv_itemspace active_player:active_player2 none none +4314 inv_itemspace2 active_player:active_player2 none none +4315 inv_movefromslot active_player:active_player2 none none +4316 inv_movetoslot active_player:active_player2 none none +4317 both_moveinv active_player,active_player2:active_player2,active_player none none +4318 inv_moveitem active_player:active_player2 none none +4319 inv_moveitem_cert active_player:active_player2 none none +4320 inv_moveitem_uncert active_player:active_player2 none none +4321 inv_setslot active_player:active_player2 none none +4322 inv_total active_player:active_player2 none none +4323 inv_totalcat active_player:active_player2 none none +4324 inv_transmit active_player:active_player2 none none +4325 invother_transmit active_player,active_player2:active_player2,active_player none none +4326 inv_stoptransmit active_player:active_player2 none none +4327 both_dropslot active_player,active_player2:active_player2,active_player none none +4328 inv_dropall active_player:active_player2 none none +4329 inv_totalparam active_player:active_player2 none none +4330 inv_totalparam_stack active_player:active_player2 none none +4400 enum +4401 enum_getoutputcount +4500 append_num +4501 append +4502 append_signnum +4503 lowercase +4504 text_gender active_player:active_player2 none none +4505 tostring +4506 compare +4507 text_switch +4508 append_char +4509 string_length +4510 substring +4511 string_indexof_char +4512 string_indexof_string +4600 add +4601 sub +4602 multiply +4603 divide +4604 random +4605 randominc +4606 interpolate +4607 addpercent +4608 setbit +4609 clearbit +4610 testbit +4611 modulo +4612 pow +4613 invpow +4614 and +4615 or +4616 min +4617 max +4618 scale +4619 bitcount +4620 togglebit +4621 setbit_range +4622 clearbit_range +4623 getbit_range +4624 setbit_range_toint +4625 sin_deg +4626 cos_deg +4627 atan2_deg +4628 abs +7500 db_find_with_count +7501 db_findnext find_db none none +7502 db_getfield +7503 db_getfieldcount +7504 db_listall_with_count +7505 db_getrowtable +7506 db_findbyindex +7507 db_find_refine_with_count +7508 db_find none find_db none +7509 db_find_refine find_db none none +7510 db_listall +10000 error +10001 map_production +10002 map_lastclock +10003 map_lastworld +10004 map_lastclientin +10005 map_lastnpc +10006 map_lastplayer +10007 map_lastlogout +10008 map_lastlogin +10009 map_lastzone +10010 map_lastclientout +10011 map_lastcleanup +10012 map_lastbandwidthin +10013 map_lastbandwidthout diff --git a/src/public/data/symbols/component.sym b/src/public/data/symbols/component.sym new file mode 100644 index 00000000..5b681644 --- /dev/null +++ b/src/public/data/symbols/component.sym @@ -0,0 +1,7196 @@ +1 player_kit_tailor_legs_man:com_0 +2 player_kit_tailor_legs_man:com_1 +3 player_kit_tailor_legs_man:com_2 +4 player_kit_tailor_legs_man:com_3 +5 player_kit_tailor_legs_man:com_4 +6 player_kit_tailor_legs_man:com_5 +7 player_kit_tailor_legs_man:com_6 +8 player_kit_tailor_legs_man:com_7 +9 player_kit_tailor_legs_man:com_8 +10 player_kit_tailor_legs_man:com_9 +11 player_kit_tailor_legs_man:com_10 +12 player_kit_tailor_legs_man:com_11 +13 player_kit_tailor_legs_man:com_12 +14 player_kit_tailor_legs_man:com_13 +15 player_kit_tailor_legs_man:com_14 +16 player_kit_tailor_legs_man:com_15 +17 player_kit_tailor_legs_man:com_16 +18 player_kit_tailor_legs_man:com_17 +19 player_kit_tailor_legs_man:com_18 +20 player_kit_tailor_legs_man:com_19 +21 player_kit_tailor_legs_man:com_20 +22 player_kit_tailor_legs_man:com_21 +23 player_kit_tailor_legs_man:com_22 +24 player_kit_tailor_legs_man:com_23 +25 player_kit_tailor_legs_man:com_24 +26 player_kit_tailor_legs_man:com_25 +27 player_kit_tailor_legs_man:com_26 +28 player_kit_tailor_legs_man:com_27 +29 player_kit_tailor_legs_man:com_28 +30 player_kit_tailor_legs_man:com_29 +31 player_kit_tailor_legs_man:com_30 +32 player_kit_tailor_legs_man:com_31 +33 player_kit_tailor_legs_man:com_32 +34 player_kit_tailor_legs_man:com_33 +35 player_kit_tailor_legs_man:com_34 +36 player_kit_tailor_legs_man:com_35 +37 player_kit_tailor_legs_man:com_36 +38 player_kit_tailor_legs_man:com_37 +39 player_kit_tailor_legs_man:com_38 +40 player_kit_tailor_legs_man:com_39 +41 player_kit_tailor_legs_man:com_40 +42 player_kit_tailor_legs_man:com_41 +43 player_kit_tailor_legs_man:com_42 +44 player_kit_tailor_legs_man:com_43 +45 player_kit_tailor_legs_man:com_44 +46 player_kit_tailor_legs_man:com_45 +47 player_kit_tailor_legs_man:com_46 +48 player_kit_tailor_legs_man:com_47 +49 player_kit_tailor_legs_man:com_48 +50 player_kit_tailor_legs_man:com_49 +51 player_kit_tailor_legs_man:com_50 +52 player_kit_tailor_legs_man:com_51 +53 player_kit_tailor_legs_man:com_52 +54 player_kit_tailor_legs_man:com_53 +55 player_kit_tailor_legs_man:com_54 +56 player_kit_tailor_legs_man:com_55 +57 player_kit_tailor_legs_man:com_56 +58 player_kit_tailor_legs_man:com_57 +59 player_kit_tailor_legs_man:com_58 +60 player_kit_tailor_legs_man:com_59 +61 player_kit_tailor_legs_man:com_60 +62 player_kit_tailor_legs_man:com_61 +63 player_kit_tailor_legs_man:com_62 +64 player_kit_tailor_legs_man:com_63 +65 player_kit_tailor_legs_man:com_64 +66 player_kit_tailor_legs_man:com_65 +67 player_kit_tailor_legs_man:com_66 +68 player_kit_tailor_legs_man:com_67 +69 player_kit_tailor_legs_man:com_68 +70 player_kit_tailor_legs_man:com_69 +71 player_kit_tailor_legs_man:com_70 +72 player_kit_tailor_legs_man:com_71 +73 player_kit_tailor_legs_man:com_72 +74 player_kit_tailor_legs_man:com_73 +75 player_kit_tailor_legs_man:com_74 +76 player_kit_tailor_legs_man:com_75 +77 player_kit_tailor_legs_man:com_76 +78 player_kit_tailor_legs_man:com_77 +79 player_kit_tailor_legs_man:com_78 +80 player_kit_tailor_legs_man:com_79 +81 player_kit_tailor_legs_man:com_80 +82 player_kit_tailor_legs_man:com_81 +83 player_kit_tailor_legs_man:com_82 +84 player_kit_tailor_legs_man:com_83 +85 player_kit_tailor_legs_man:com_84 +86 player_kit_tailor_legs_man:com_85 +87 player_kit_tailor_legs_man:com_86 +88 player_kit_tailor_legs_man:com_87 +89 player_kit_tailor_legs_man:com_88 +90 player_kit_tailor_legs_man:com_89 +91 player_kit_tailor_legs_man:com_90 +92 player_kit_tailor_legs_man:khaki +93 player_kit_tailor_legs_man:black +94 player_kit_tailor_legs_man:crimson +95 player_kit_tailor_legs_man:navy +96 player_kit_tailor_legs_man:straw +97 player_kit_tailor_legs_man:white +98 player_kit_tailor_legs_man:red +99 player_kit_tailor_legs_man:blue +100 player_kit_tailor_legs_man:green +101 player_kit_tailor_legs_man:yellow +102 player_kit_tailor_legs_man:purple +103 player_kit_tailor_legs_man:orange +104 player_kit_tailor_legs_man:rose +105 player_kit_tailor_legs_man:lime +106 player_kit_tailor_legs_man:cyan +107 player_kit_tailor_legs_man:emerald +108 player_kit_tailor_legs_man:confirm +109 player_kit_tailor_legs_man:com_108 +110 player_kit_tailor_legs_man:com_109 +111 player_kit_tailor_legs_man:com_110 +112 player_kit_tailor_legs_man:com_111 +113 player_kit_tailor_legs_man:com_112 +114 player_kit_tailor_legs_man:com_113 +115 player_kit_tailor_legs_man:com_114 +116 player_kit_tailor_legs_man:com_115 +117 player_kit_tailor_legs_man:com_116 +118 player_kit_tailor_legs_man:com_117 +119 player_kit_tailor_legs_man:com_118 +120 player_kit_tailor_legs_man:com_119 +121 player_kit_tailor_legs_man:com_120 +122 player_kit_tailor_legs_man:com_121 +123 player_kit_tailor_legs_man:com_122 +124 player_kit_tailor_legs_man:com_123 +125 player_kit_tailor_legs_man:com_124 +126 player_kit_tailor_legs_man:com_125 +127 player_kit_tailor_legs_man:com_126 +128 player_kit_tailor_legs_man:com_127 +129 player_kit_tailor_legs_man:com_128 +130 player_kit_tailor_legs_man:plain +131 player_kit_tailor_legs_man:shorts +132 player_kit_tailor_legs_man:flares +133 player_kit_tailor_legs_man:turn_ups +134 player_kit_tailor_legs_man:com_133 +135 player_kit_tailor_legs_man:com_134 +136 player_kit_tailor_legs_man:com_135 +137 player_kit_tailor_legs_man:com_136 +138 player_kit_tailor_legs_man:com_137 +140 multiobj2:com_0 +141 multiobj2:com_1 +142 multiobj2:com_2 +143 multiobj2:com_3 +144 multiobj2:com_4 +145 multiobj2:com_5 +146 multiobj2:com_6 +148 controls:com_0 +149 controls:com_1 +150 controls:com_2 +151 controls:com_3 +152 controls:com_4 +153 controls:com_5 +154 controls:com_6 +155 controls:com_7 +156 controls:com_8 +157 controls:com_9 +158 controls:com_10 +159 controls:com_11 +160 controls:com_12 +161 controls:com_13 +162 controls:com_14 +163 controls:com_15 +164 controls:com_16 +165 controls:com_17 +166 controls:com_18 +167 controls:com_19 +168 controls:com_20 +169 controls:com_21 +170 controls:com_22 +171 controls:com_23 +172 controls:com_24 +173 controls:com_25 +174 controls:com_26 +175 controls:com_27 +176 controls:com_28 +177 controls:com_29 +178 controls:com_30 +179 controls:com_31 +180 controls:com_32 +181 controls:com_33 +182 controls:com_34 +183 controls:com_35 +184 controls:com_36 +185 controls:com_37 +186 controls:com_38 +187 controls:com_39 +189 tribal_door:com_0 +190 tribal_door:com_1 +191 tribal_door:com_2 +192 tribal_door:com_3 +193 tribal_door:com_4 +194 tribal_door:com_5 +195 tribal_door:com_6 +196 tribal_door:com_7 +197 tribal_door:com_8 +198 tribal_door:com_9 +199 tribal_door:com_10 +200 tribal_door:com_11 +201 tribal_door:com_12 +202 tribal_door:com_13 +203 tribal_door:com_14 +204 tribal_door:com_15 +205 tribal_door:com_16 +206 tribal_door:com_17 +207 tribal_door:com_18 +208 tribal_door:com_19 +209 tribal_door:com_20 +210 tribal_door:com_21 +211 tribal_door:com_22 +212 tribal_door:com_23 +213 tribal_door:com_24 +214 tribal_door:com_25 +215 tribal_door:com_26 +216 tribal_door:com_27 +217 tribal_door:com_28 +218 tribal_door:com_29 +219 tribal_door:com_30 +220 tribal_door:com_31 +221 tribal_door:com_32 +222 tribal_door:com_33 +223 tribal_door:com_34 +224 tribal_door:com_35 +225 tribal_door:com_36 +226 tribal_door:com_37 +227 tribal_door:com_38 +228 tribal_door:com_39 +229 tribal_door:com_40 +230 tribal_door:com_41 +231 tribal_door:com_42 +232 tribal_door:com_43 +233 tribal_door:com_44 +234 tribal_door:com_45 +235 tribal_door:com_46 +236 tribal_door:com_47 +237 tribal_door:com_48 +238 tribal_door:com_49 +239 tribal_door:com_50 +240 tribal_door:com_51 +241 tribal_door:com_52 +242 tribal_door:com_53 +243 tribal_door:com_54 +244 tribal_door:com_55 +245 tribal_door:com_56 +247 blurberry_cocktail_guide:com_0 +248 blurberry_cocktail_guide:com_1 +249 blurberry_cocktail_guide:com_2 +250 blurberry_cocktail_guide:com_3 +251 blurberry_cocktail_guide:com_4 +252 blurberry_cocktail_guide:com_5 +253 blurberry_cocktail_guide:com_6 +254 blurberry_cocktail_guide:com_7 +255 blurberry_cocktail_guide:com_8 +256 blurberry_cocktail_guide:com_9 +257 blurberry_cocktail_guide:com_10 +258 blurberry_cocktail_guide:com_11 +259 blurberry_cocktail_guide:com_12 +260 blurberry_cocktail_guide:com_13 +261 blurberry_cocktail_guide:com_14 +262 blurberry_cocktail_guide:com_15 +263 blurberry_cocktail_guide:com_16 +264 blurberry_cocktail_guide:com_17 +265 blurberry_cocktail_guide:com_18 +266 blurberry_cocktail_guide:com_19 +267 blurberry_cocktail_guide:com_20 +268 blurberry_cocktail_guide:com_21 +269 blurberry_cocktail_guide:com_22 +270 blurberry_cocktail_guide:com_23 +271 blurberry_cocktail_guide:com_24 +272 blurberry_cocktail_guide:com_25 +273 blurberry_cocktail_guide:com_26 +274 blurberry_cocktail_guide:com_27 +275 blurberry_cocktail_guide:com_28 +276 blurberry_cocktail_guide:com_29 +277 blurberry_cocktail_guide:com_30 +278 blurberry_cocktail_guide:com_31 +279 blurberry_cocktail_guide:com_32 +280 blurberry_cocktail_guide:com_33 +281 blurberry_cocktail_guide:com_34 +282 blurberry_cocktail_guide:com_35 +283 blurberry_cocktail_guide:com_36 +284 blurberry_cocktail_guide:com_37 +285 blurberry_cocktail_guide:com_38 +286 blurberry_cocktail_guide:com_39 +287 blurberry_cocktail_guide:leftarrow +288 blurberry_cocktail_guide:rightarrow +289 blurberry_cocktail_guide:text_left +290 blurberry_cocktail_guide:cook_obj +291 blurberry_cocktail_guide:page_title +292 blurberry_cocktail_guide:text_right +293 blurberry_cocktail_guide:leftarrow_layer +294 blurberry_cocktail_guide:rightarrow_layer +295 blurberry_cocktail_guide:index +298 questscroll:com_0 +299 questscroll:com_1 +300 questscroll:com_2 +301 questscroll:com_3 +302 questscroll:com_4 +303 questscroll:com_5 +304 questscroll:com_6 +305 questscroll:com_7 +307 objbox1:com_0 +308 objbox1:com_1 +309 objbox1:com_2 +311 objbox2:com_0 +312 objbox2:com_1 +313 objbox2:com_2 +314 objbox2:com_3 +316 objbox3:com_0 +317 objbox3:com_1 +318 objbox3:com_2 +319 objbox3:com_3 +320 objbox3:com_4 +322 objbox4:com_0 +323 objbox4:com_1 +324 objbox4:com_2 +325 objbox4:com_3 +326 objbox4:com_4 +327 objbox4:com_5 +329 combat_staff_2:preview +330 combat_staff_2:com_1 +331 combat_staff_2:name +332 combat_staff_2:com_3 +333 combat_staff_2:com_4 +334 combat_staff_2:staff2c +335 combat_staff_2:staff2b +336 combat_staff_2:staff2a +337 combat_staff_2:com_8 +338 combat_staff_2:com_9 +339 combat_staff_2:com_10 +340 combat_staff_2:com_11 +341 combat_staff_2:com_12 +342 combat_staff_2:com_13 +343 combat_staff_2:com_14 +344 combat_staff_2:com_15 +345 combat_staff_2:com_16 +346 combat_staff_2:com_20 +347 combat_staff_2:com_21 +348 combat_staff_2:com_22 +349 combat_staff_2:auto_toggle +350 combat_staff_2:com_18 +351 combat_staff_2:com_19 +352 combat_staff_2:auto_spell +353 combat_staff_2:auto_choose +354 combat_staff_2:com_25 +355 combat_staff_2:com_26 +357 message1:com_0 +358 message1:com_1 +360 message2:com_0 +361 message2:com_1 +362 message2:com_2 +364 message3:com_0 +365 message3:com_1 +366 message3:com_2 +367 message3:com_3 +369 message4:com_0 +370 message4:com_1 +371 message4:com_2 +372 message4:com_3 +373 message4:com_4 +375 message5:com_0 +376 message5:com_1 +377 message5:com_2 +378 message5:com_3 +379 message5:com_4 +380 message5:com_5 +382 part1:com_0 +383 part1:com_1 +384 part1:com_2 +385 part1:com_3 +386 part1:com_4 +387 part1:com_5 +388 part1:com_6 +389 part1:com_7 +390 part1:com_8 +391 part1:com_9 +392 part1:com_10 +393 part1:com_11 +394 part1:com_12 +395 part1:com_13 +396 part1:com_14 +397 part1:com_15 +398 part1:com_16 +399 part1:com_17 +400 part1:com_18 +401 part1:com_19 +402 part1:com_20 +403 part1:com_21 +404 part1:com_22 +405 part1:com_23 +406 part1:com_24 +407 part1:com_25 +408 part1:com_26 +409 part1:com_27 +410 part1:com_28 +411 part1:com_31 +412 part1:com_29 +413 part1:com_30 +414 part1:com_32 +415 part1:com_33 +416 part1:com_34 +417 part1:com_35 +418 part1:com_36 +419 part1:com_37 +420 part1:com_38 +421 part1:com_39 +422 part1:com_40 +423 part1:com_41 +424 part1:com_42 +426 combat_blunt:preview +427 combat_blunt:com_1 +428 combat_blunt:name +429 combat_blunt:com_3 +430 combat_blunt:blunt101 +431 combat_blunt:blunt2 +432 combat_blunt:blunt1 +433 combat_blunt:blunt0 +434 combat_blunt:com_8 +435 combat_blunt:com_9 +436 combat_blunt:com_10 +437 combat_blunt:com_11 +438 combat_blunt:com_12 +439 combat_blunt:com_13 +440 combat_blunt:com_14 +441 combat_blunt:com_15 +442 combat_blunt:com_16 +443 combat_blunt:com_17 +444 combat_blunt:com_18 +445 combat_blunt:com_19 +447 target:com_0 +448 target:com_1 +449 target:com_2 +450 target:com_3 +451 target:com_4 +452 target:com_5 +453 target:com_6 +454 target:com_7 +455 target:com_8 +456 target:com_9 +457 target:com_10 +458 target:com_11 +459 target:com_12 +460 target:com_13 +461 target:com_14 +462 target:com_15 +463 target:com_16 +464 target:com_17 +465 target:com_18 +466 target:com_19 +467 target:com_20 +468 target:com_21 +469 target:com_22 +470 target:com_23 +471 target:com_24 +472 target:com_25 +473 target:com_26 +474 target:com_27 +475 target:com_28 +476 target:com_29 +477 target:com_30 +478 target:com_31 +479 target:com_32 +480 target:com_33 +481 target:com_34 +482 target:com_35 +483 target:com_36 +484 target:com_37 +485 target:com_38 +486 target:com_39 +487 target:com_40 +488 target:com_41 +489 target:com_42 +490 target:com_43 +491 target:com_44 +492 target:com_45 +493 target:com_46 +494 target:com_47 +495 target:com_48 +496 target:com_49 +497 target:com_50 +498 target:com_51 +499 target:com_52 +500 target:com_53 +501 target:com_54 +502 target:com_55 +503 target:com_56 +504 target:com_57 +505 target:com_58 +506 target:com_59 +507 target:com_60 +508 target:com_61 +509 target:com_62 +510 target:com_63 +511 target:com_64 +512 target:com_65 +513 target:com_66 +514 target:com_67 +515 target:com_68 +516 target:com_69 +517 target:com_70 +518 target:com_71 +519 target:com_72 +520 target:com_73 +521 target:com_74 +522 target:com_75 +523 target:com_76 +524 target:com_77 +525 target:com_78 +526 target:com_79 +527 target:com_80 +528 target:com_81 +529 target:com_82 +530 target:com_83 +531 target:com_84 +532 target:com_85 +533 target:com_86 +534 target:com_87 +535 target:com_88 +536 target:com_89 +537 target:com_90 +538 target:com_91 +539 target:com_92 +540 target:com_93 +541 target:com_94 +542 target:com_95 +543 target:com_96 +544 target:com_97 +545 target:com_98 +546 target:com_99 +547 target:com_100 +548 target:com_101 +549 target:com_102 +550 target:com_103 +551 target:com_104 +552 target:com_105 +553 target:com_106 +554 target:com_107 +555 target:com_108 +556 target:com_109 +557 target:com_110 +558 target:com_111 +559 target:com_112 +560 target:com_113 +561 target:com_114 +562 target:com_115 +563 target:com_116 +564 target:com_117 +565 target:com_118 +566 target:com_119 +567 target:com_120 +568 target:com_121 +570 blurberry_cocktail_guide2:com_0 +571 blurberry_cocktail_guide2:cocktail_index_layer +572 blurberry_cocktail_guide2:rightarrow +573 blurberry_cocktail_guide2:rightarrow_layer +574 blurberry_cocktail_guide2:cocktail_index +575 blurberry_cocktail_guide2:blurberry_special +576 blurberry_cocktail_guide2:chocolate_saturday +577 blurberry_cocktail_guide2:drunk_dragon +578 blurberry_cocktail_guide2:fruit_blast +579 blurberry_cocktail_guide2:pineapple_punch +580 blurberry_cocktail_guide2:short_green_guy +581 blurberry_cocktail_guide2:wizard_blizzard +582 blurberry_cocktail_guide2:gnome_food_index_layer +583 blurberry_cocktail_guide2:gnome_bowls +584 blurberry_cocktail_guide2:chocolate_bomb +585 blurberry_cocktail_guide2:tangled_toads_legs +586 blurberry_cocktail_guide2:worm_hole +587 blurberry_cocktail_guide2:veg_ball +588 blurberry_cocktail_guide2:gnome_crunchies +589 blurberry_cocktail_guide2:premade_worm_crunchies +590 blurberry_cocktail_guide2:choc_chip_crunchies +591 blurberry_cocktail_guide2:premade_spicy_crunchies +592 blurberry_cocktail_guide2:premade_toad_crunchies +593 blurberry_cocktail_guide2:gnome_battas +594 blurberry_cocktail_guide2:premade_worm_batta +595 blurberry_cocktail_guide2:toads_legs_batta +596 blurberry_cocktail_guide2:cheese_tomato_batta +597 blurberry_cocktail_guide2:premade_fruit_batta +598 blurberry_cocktail_guide2:premade_vegetable_batta +599 blurberry_cocktail_guide2:com_29 +600 blurberry_cocktail_guide2:com_30 +601 blurberry_cocktail_guide2:com_31 +602 blurberry_cocktail_guide2:com_32 +603 blurberry_cocktail_guide2:com_33 +604 blurberry_cocktail_guide2:com_34 +605 blurberry_cocktail_guide2:com_35 +606 blurberry_cocktail_guide2:com_36 +607 blurberry_cocktail_guide2:com_37 +608 blurberry_cocktail_guide2:com_38 +609 blurberry_cocktail_guide2:com_39 +610 blurberry_cocktail_guide2:com_40 +611 blurberry_cocktail_guide2:com_41 +612 blurberry_cocktail_guide2:com_42 +613 blurberry_cocktail_guide2:com_43 +614 blurberry_cocktail_guide2:com_44 +615 blurberry_cocktail_guide2:com_45 +616 blurberry_cocktail_guide2:com_46 +617 blurberry_cocktail_guide2:com_47 +618 blurberry_cocktail_guide2:com_48 +619 blurberry_cocktail_guide2:com_49 +620 blurberry_cocktail_guide2:com_50 +621 blurberry_cocktail_guide2:com_51 +622 blurberry_cocktail_guide2:com_52 +623 blurberry_cocktail_guide2:com_53 +624 blurberry_cocktail_guide2:com_54 +625 blurberry_cocktail_guide2:com_55 +626 blurberry_cocktail_guide2:com_56 +627 blurberry_cocktail_guide2:com_57 +628 blurberry_cocktail_guide2:com_58 +629 blurberry_cocktail_guide2:com_59 +630 blurberry_cocktail_guide2:com_60 +631 blurberry_cocktail_guide2:com_61 +632 blurberry_cocktail_guide2:com_62 +633 blurberry_cocktail_guide2:com_63 +634 blurberry_cocktail_guide2:com_64 +635 blurberry_cocktail_guide2:com_65 +636 blurberry_cocktail_guide2:book_title +637 blurberry_cocktail_guide2:com_67 +639 questlist:com_0 +640 questlist:com_55 +641 questlist:com_56 +642 questlist:com_57 +643 questlist:com_58 +644 questlist:com_59 +645 questlist:com_60 +646 questlist:com_61 +647 questlist:com_62 +648 questlist:com_63 +649 questlist:com_64 +650 questlist:com_65 +651 questlist:com_66 +652 questlist:com_67 +653 questlist:com_68 +654 questlist:com_69 +655 questlist:com_70 +656 questlist:com_71 +657 questlist:com_72 +658 questlist:com_73 +659 questlist:com_74 +660 questlist:com_75 +661 questlist:com_76 +662 questlist:com_77 +663 questlist:com_1 +664 duel_confirm:flower_power_text +665 duel_confirm:com_161 +666 duel_confirm:no_jewelry_text +667 duel_confirm:com_163 +668 duel_select_type:no_jewelry_text +669 duel_select_type:flower_power_text +670 duel_select_type:flower_power +671 duel_select_type:no_jewelry +672 duel_select_type:com_161 +673 questlist:chompybird +674 music:com_171 +675 music:com_172 +676 music:com_173 +677 music:com_174 +678 music:com_175 +682 questlist:com_20 +717 tribal_door2:com_0 +718 tribal_door2:com_1 +719 tribal_door2:com_2 +720 tribal_door2:com_3 +721 tribal_door2:com_4 +722 tribal_door2:com_5 +723 tribal_door2:com_6 +724 tribal_door2:com_7 +725 tribal_door2:com_8 +726 tribal_door2:com_9 +727 tribal_door2:com_10 +728 tribal_door2:com_11 +729 tribal_door2:com_12 +730 tribal_door2:com_13 +731 tribal_door2:com_14 +732 tribal_door2:com_15 +733 tribal_door2:com_16 +734 tribal_door2:com_17 +735 tribal_door2:com_18 +736 tribal_door2:com_19 +737 tribal_door2:com_20 +738 tribal_door2:com_21 +739 tribal_door2:com_22 +740 tribal_door2:com_23 +741 tribal_door2:com_24 +742 tribal_door2:com_25 +743 tribal_door2:com_26 +744 tribal_door2:com_27 +745 tribal_door2:com_28 +746 tribal_door2:com_29 +747 tribal_door2:com_30 +748 tribal_door2:com_31 +749 tribal_door2:com_32 +750 tribal_door2:com_33 +751 tribal_door2:com_34 +752 tribal_door2:com_35 +753 tribal_door2:com_36 +754 tribal_door2:com_37 +755 tribal_door2:com_38 +756 tribal_door2:com_39 +757 tribal_door2:com_40 +758 tribal_door2:com_41 +759 tribal_door2:com_42 +760 tribal_door2:com_43 +761 tribal_door2:com_44 +762 tribal_door2:com_45 +763 tribal_door2:com_46 +764 tribal_door2:com_47 +765 tribal_door2:com_48 +766 tribal_door2:com_49 +767 tribal_door2:com_50 +768 tribal_door2:com_51 +769 tribal_door2:com_52 +770 tribal_door2:com_53 +771 tribal_door2:com_54 +772 tribal_door2:com_55 +773 tribal_door2:com_56 +774 tribal_door2:com_57 +775 tribal_door2:com_58 +777 combat_scythe:preview +778 combat_scythe:com_1 +779 combat_scythe:name +780 combat_scythe:com_3 +781 combat_scythe:scythe101 +782 combat_scythe:scythe0 +783 combat_scythe:scythe3 +784 combat_scythe:scythe2 +785 combat_scythe:scythe1 +786 combat_scythe:com_9 +787 combat_scythe:com_10 +788 combat_scythe:com_11 +789 combat_scythe:com_12 +790 combat_scythe:com_13 +791 combat_scythe:com_14 +792 combat_scythe:com_15 +793 combat_scythe:com_16 +794 combat_scythe:com_17 +795 combat_scythe:com_18 +796 combat_scythe:com_19 +797 combat_scythe:com_20 +798 combat_scythe:com_21 +799 combat_scythe:com_22 +800 combat_scythe:com_23 +801 combat_scythe:com_24 +803 glidermap:com_0 +804 glidermap:com_1 +805 glidermap:com_2 +806 glidermap:com_3 +807 glidermap:com_4 +808 glidermap:com_5 +809 glidermap:com_6 +810 glidermap:com_7 +811 glidermap:com_8 +812 glidermap:com_9 +813 glidermap:com_10 +814 glidermap:com_16 +815 glidermap:com_12 +816 glidermap:com_14 +817 glidermap:com_18 +818 glidermap:com_20 +819 glidermap:com_11 +820 glidermap:com_13 +821 glidermap:com_15 +822 glidermap:com_17 +823 glidermap:com_19 +824 glidermap:com_21 +825 glidermap:com_22 +826 glidermap:com_23 +827 glidermap:com_24 +828 glidermap:com_25 +829 glidermap:com_26 +830 glidermap:com_27 +831 glidermap:com_28 +832 glidermap:com_29 +833 glidermap:com_30 +834 glidermap:com_31 +835 glidermap:com_32 +836 glidermap:com_33 +838 book:com_0 +839 book:com_2 +840 book:com_1 +841 book:com_4 +842 book:com_3 +843 book:com_5 +844 book:com_6 +845 book:com_7 +846 book:com_8 +847 book:com_9 +848 book:com_10 +849 book:com_11 +850 book:com_12 +851 book:com_13 +852 book:com_14 +853 book:com_15 +854 book:com_16 +855 book:com_17 +856 book:com_18 +857 book:com_19 +858 book:com_20 +859 book:com_21 +860 book:com_22 +861 book:com_23 +862 book:com_24 +863 book:com_25 +864 book:com_26 +865 book:com_27 +866 book:com_28 +867 book:com_29 +868 book:com_30 +869 book:com_31 +870 book:com_32 +871 book:com_33 +872 book:com_34 +873 book:com_35 +874 book:com_36 +875 book:com_37 +876 book:com_38 +877 book:com_39 +878 book:com_40 +879 book:com_41 +880 book:com_42 +881 book:com_43 +882 book:com_44 +883 book:com_45 +884 book:com_46 +885 book:com_47 +886 book:com_48 +887 book:com_49 +888 book:com_50 +889 book:com_51 +890 book:com_52 +891 book:com_53 +892 book:com_54 +893 book:com_55 +894 book:com_56 +895 book:com_57 +896 book:com_58 +897 book:com_59 +898 book:com_60 +899 book:com_61 +900 book:com_62 +901 book:com_63 +902 book:com_64 +903 book:book_title +905 options:com_0 +906 options:com_1 +907 options:com_2 +908 options:com_3 +909 options:com_4 +910 options:com_5 +911 options:com_6 +912 options:com_7 +913 options:com_8 +914 options:com_9 +915 options:com_10 +916 options:com_11 +917 options:com_12 +918 options:com_13 +919 options:com_14 +920 options:com_15 +921 options:com_16 +922 options:com_17 +923 options:com_18 +924 options:com_19 +925 options:com_20 +926 options:com_21 +927 options:com_22 +928 options:com_23 +929 options:com_24 +930 options:com_25 +931 options:com_26 +932 options:com_27 +933 options:com_28 +934 options:com_29 +935 options:com_30 +936 options:com_31 +937 options:com_32 +938 options:com_33 +939 options:com_34 +940 options:com_35 +941 options:com_36 +942 options:com_37 +943 options:com_38 +944 options:com_39 +945 options:com_40 +946 options:com_41 +947 options:com_42 +948 options:com_43 +949 options:com_44 +950 options:com_45 +951 options_ld:com_27 +952 options_ld:com_28 +953 options_ld:com_29 +954 options_ld:com_30 +955 options_ld:com_31 +956 options:com_46 +957 options:com_47 +958 options:com_48 +959 options:com_49 +960 options:com_50 +961 music:com_159 +963 music:com_176 +964 music:com_177 +965 music:com_178 +966 music:com_179 +967 music:com_180 +969 chat1:com_0 +970 chat1:com_1 +971 chat1:com_2 +972 chat1:com_3 +974 chat2:com_0 +975 chat2:com_1 +976 chat2:com_2 +977 chat2:com_3 +978 chat2:com_4 +980 chat3:com_0 +981 chat3:com_1 +982 chat3:com_2 +983 chat3:com_3 +984 chat3:com_4 +985 chat3:com_5 +987 chat4:com_0 +988 chat4:com_1 +989 chat4:com_2 +990 chat4:com_3 +991 chat4:com_4 +992 chat4:com_5 +993 chat4:com_6 +995 smithing:com_0 +996 smithing:com_1 +997 smithing:com_2 +998 smithing:com_3 +999 smithing:com_4 +1000 smithing:com_5 +1001 smithing:com_6 +1002 smithing:com_7 +1003 smithing:com_8 +1004 smithing:com_9 +1005 smithing:com_10 +1006 smithing:com_11 +1007 smithing:com_12 +1008 smithing:com_13 +1009 smithing:com_14 +1010 smithing:com_15 +1011 smithing:com_16 +1012 smithing:com_17 +1013 smithing:com_18 +1014 smithing:com_19 +1015 smithing:com_20 +1016 smithing:com_21 +1017 smithing:com_22 +1018 smithing:com_23 +1019 smithing:com_24 +1020 smithing:com_25 +1021 smithing:com_26 +1022 smithing:com_27 +1023 smithing:com_28 +1024 smithing:com_29 +1025 smithing:com_30 +1026 smithing:com_31 +1027 smithing:com_32 +1028 smithing:com_33 +1029 smithing:com_34 +1030 smithing:com_35 +1031 smithing:com_36 +1032 smithing:com_37 +1033 smithing:com_38 +1034 smithing:com_39 +1035 smithing:com_40 +1036 smithing:com_41 +1037 smithing:com_42 +1038 smithing:com_43 +1039 smithing:com_44 +1040 smithing:com_45 +1041 smithing:com_46 +1042 smithing:com_47 +1043 smithing:com_48 +1044 smithing:com_49 +1045 smithing:com_50 +1046 smithing:com_51 +1047 smithing:com_52 +1048 smithing:com_53 +1049 smithing:com_54 +1050 smithing:com_55 +1051 smithing:com_56 +1052 smithing:com_57 +1053 smithing:com_58 +1054 smithing:com_59 +1055 smithing:com_60 +1056 smithing:com_61 +1057 smithing:com_62 +1058 smithing:com_63 +1059 smithing:com_64 +1060 smithing:com_65 +1061 smithing:com_66 +1062 smithing:com_67 +1063 smithing:com_68 +1064 smithing:com_69 +1065 smithing:com_70 +1066 smithing:com_71 +1067 smithing:com_72 +1068 smithing:com_73 +1069 smithing:com_74 +1070 smithing:com_75 +1071 smithing:com_76 +1072 smithing:com_77 +1073 smithing:com_78 +1074 smithing:com_79 +1075 smithing:com_80 +1076 smithing:com_81 +1077 smithing:com_82 +1078 smithing:com_83 +1079 smithing:com_84 +1080 smithing:com_85 +1081 smithing:com_86 +1082 smithing:com_87 +1083 smithing:com_88 +1084 smithing:com_89 +1085 smithing:com_90 +1086 smithing:com_91 +1087 smithing:com_92 +1088 smithing:com_93 +1089 smithing:com_94 +1090 smithing:com_95 +1091 smithing:com_96 +1092 smithing:com_97 +1093 smithing:com_98 +1094 smithing:com_99 +1095 smithing:com_100 +1096 smithing:com_102 +1097 smithing:other_layer +1098 smithing:com_104 +1099 smithing:com_105 +1100 smithing:com_106 +1101 smithing:com_107 +1102 smithing:com_108 +1103 smithing:com_109 +1104 smithing:com_110 +1105 smithing:com_111 +1106 smithing:com_112 +1107 smithing:com_113 +1108 smithing:com_114 +1109 smithing:com_115 +1110 smithing:com_116 +1111 smithing:com_117 +1112 smithing:com_118 +1113 smithing:com_119 +1114 smithing:com_120 +1115 smithing:com_121 +1116 smithing:com_122 +1117 smithing:com_123 +1118 smithing:com_124 +1119 smithing:column1 +1120 smithing:column2 +1121 smithing:column3 +1122 smithing:column4 +1123 smithing:column5 +1124 smithing:com_130 +1125 smithing:com_131 +1126 smithing:com_132 +1127 smithing:com_133 +1128 smithing:com_134 +1129 smithing:com_135 +1130 smithing:com_136 +1131 smithing:com_137 +1132 smithing:com_103 +1133 smithing:stud_layer +1134 smithing:com_139 +1135 smithing:com_140 +1137 scroll:com_0 +1138 scroll:com_1 +1139 scroll:com_2 +1140 scroll:com_3 +1141 scroll:com_4 +1142 scroll:com_5 +1143 scroll:com_6 +1144 scroll:com_7 +1145 scroll:com_8 +1146 scroll:com_9 +1147 scroll:com_10 +1148 scroll:com_11 +1149 scroll:com_12 +1150 scroll:com_13 +1152 magic:wind_strike +1153 magic:confuse +1154 magic:water_strike +1155 magic:enchant_lvl1 +1156 magic:earth_strike +1157 magic:weaken +1158 magic:fire_strike +1159 magic:bones_to_bananas +1160 magic:wind_bolt +1161 magic:curse +1162 magic:lowlvl_alchemy +1163 magic:water_bolt +1164 magic:varrock_teleport +1165 magic:enchant_lvl2 +1166 magic:earth_bolt +1167 magic:lumbridge_teleport +1168 magic:telekinetic_grab +1169 magic:fire_bolt +1170 magic:falador_teleport +1171 magic:crumble_undead +1172 magic:wind_blast +1173 magic:superheat_item +1174 magic:camelot_teleport +1175 magic:water_blast +1176 magic:enchant_lvl3 +1177 magic:earth_blast +1178 magic:highlvl_alchemy +1179 magic:water_orb +1180 magic:enchant_lvl4 +1181 magic:fire_blast +1182 magic:earth_orb +1183 magic:wind_wave +1184 magic:fire_orb +1185 magic:water_wave +1186 magic:air_orb +1187 magic:enchant_lvl5 +1188 magic:earth_wave +1189 magic:fire_wave +1190 magic:saradomin_strike +1191 magic:claws_of_guthix +1192 magic:flames_of_zamorak +1193 magic:charge +1194 magic:com_42 +1195 magic:com_43 +1196 magic:com_44 +1197 magic:com_45 +1198 magic:com_46 +1199 magic:com_47 +1200 magic:com_48 +1201 magic:com_49 +1202 magic:com_50 +1203 magic:com_51 +1204 magic:com_52 +1205 magic:com_53 +1206 magic:com_54 +1207 magic:com_55 +1208 magic:com_56 +1209 magic:com_57 +1210 magic:com_58 +1211 magic:com_59 +1212 magic:com_60 +1213 magic:com_61 +1214 magic:com_62 +1215 magic:com_63 +1216 magic:com_64 +1217 magic:com_65 +1218 magic:com_66 +1219 magic:com_67 +1220 magic:com_68 +1221 magic:com_69 +1222 magic:com_70 +1223 magic:com_71 +1224 magic:com_72 +1225 magic:com_73 +1226 magic:com_74 +1227 magic:com_75 +1228 magic:com_76 +1229 magic:com_77 +1230 magic:com_78 +1231 magic:com_79 +1232 magic:com_80 +1233 magic:com_81 +1234 magic:com_82 +1235 magic:com_83 +1236 magic:com_84 +1237 magic:com_85 +1238 magic:com_86 +1239 magic:com_87 +1240 magic:com_88 +1241 magic:com_89 +1242 magic:com_90 +1243 magic:com_91 +1244 magic:com_92 +1245 magic:com_93 +1246 magic:com_94 +1247 magic:com_95 +1248 magic:com_96 +1249 magic:com_97 +1250 magic:com_98 +1251 magic:com_99 +1252 magic:com_100 +1253 magic:com_101 +1254 magic:com_102 +1255 magic:com_103 +1256 magic:com_104 +1257 magic:com_105 +1258 magic:com_106 +1259 magic:com_107 +1260 magic:com_108 +1261 magic:com_109 +1262 magic:com_110 +1263 magic:com_111 +1264 magic:com_112 +1265 magic:com_113 +1266 magic:com_114 +1267 magic:com_115 +1268 magic:com_116 +1269 magic:com_117 +1270 magic:com_118 +1271 magic:com_119 +1272 magic:com_120 +1273 magic:com_121 +1274 magic:com_122 +1275 magic:com_123 +1276 magic:com_124 +1277 magic:com_125 +1278 magic:com_126 +1279 magic:com_127 +1280 magic:com_128 +1281 magic:com_129 +1282 magic:com_130 +1283 magic:com_131 +1284 magic:com_132 +1285 magic:com_133 +1286 magic:com_134 +1287 magic:com_135 +1288 magic:com_136 +1289 magic:com_137 +1290 magic:com_138 +1291 magic:com_139 +1292 magic:com_140 +1293 magic:com_141 +1294 magic:com_142 +1295 magic:com_143 +1296 magic:com_144 +1297 magic:com_145 +1298 magic:com_146 +1299 magic:com_147 +1300 magic:com_148 +1301 magic:com_149 +1302 magic:com_150 +1303 magic:com_151 +1304 magic:com_152 +1305 magic:com_153 +1306 magic:com_154 +1307 magic:com_155 +1308 magic:com_156 +1309 magic:com_157 +1310 magic:com_158 +1311 magic:com_159 +1312 magic:com_160 +1313 magic:com_161 +1314 magic:com_162 +1315 magic:com_163 +1316 magic:com_164 +1317 magic:com_165 +1318 magic:com_166 +1319 magic:com_167 +1320 magic:com_168 +1321 magic:com_169 +1322 magic:com_170 +1323 magic:com_171 +1324 magic:com_172 +1325 magic:com_173 +1326 magic:com_174 +1327 magic:com_175 +1328 magic:com_176 +1329 magic:com_177 +1330 magic:com_178 +1331 magic:com_179 +1332 magic:com_180 +1333 magic:com_181 +1334 magic:com_182 +1335 magic:com_183 +1336 magic:com_184 +1337 magic:com_185 +1338 magic:com_186 +1339 magic:com_187 +1340 magic:com_188 +1341 magic:com_189 +1342 magic:com_190 +1343 magic:com_191 +1344 magic:com_192 +1345 magic:com_193 +1346 magic:com_194 +1347 magic:com_195 +1348 magic:com_196 +1349 magic:com_197 +1350 magic:com_198 +1351 magic:com_199 +1352 magic:com_200 +1353 magic:com_201 +1354 magic:com_202 +1355 magic:com_203 +1356 magic:com_204 +1357 magic:com_205 +1358 magic:com_206 +1359 magic:com_207 +1360 magic:com_208 +1361 magic:com_209 +1362 magic:com_210 +1363 magic:com_211 +1364 magic:com_212 +1365 magic:com_213 +1366 magic:com_214 +1367 magic:com_215 +1368 magic:com_216 +1369 magic:com_217 +1370 magic:com_218 +1371 magic:com_219 +1372 magic:com_220 +1373 magic:com_221 +1374 magic:com_222 +1375 magic:com_223 +1376 magic:com_224 +1377 magic:com_225 +1378 magic:com_226 +1379 magic:com_227 +1380 magic:com_228 +1381 magic:com_229 +1382 magic:com_230 +1383 magic:com_231 +1384 magic:com_232 +1385 magic:com_233 +1386 magic:com_234 +1387 magic:com_235 +1388 magic:com_236 +1389 magic:com_237 +1390 magic:com_238 +1391 magic:com_239 +1392 magic:com_240 +1393 magic:com_241 +1394 magic:com_242 +1395 magic:com_243 +1396 magic:com_244 +1397 magic:com_245 +1398 magic:com_246 +1399 magic:com_247 +1400 magic:com_248 +1401 magic:com_249 +1402 magic:com_250 +1403 magic:com_251 +1404 magic:com_252 +1405 magic:com_253 +1406 magic:com_254 +1407 magic:com_255 +1408 magic:com_256 +1409 magic:com_257 +1410 magic:com_258 +1411 magic:com_259 +1412 magic:com_260 +1413 magic:com_261 +1414 magic:com_262 +1415 magic:com_263 +1416 magic:com_264 +1417 magic:com_265 +1418 magic:com_266 +1419 magic:com_267 +1420 magic:com_268 +1421 magic:com_269 +1422 magic:com_270 +1423 magic:com_271 +1424 magic:com_272 +1425 magic:com_273 +1426 magic:com_274 +1427 magic:com_275 +1428 magic:com_276 +1429 magic:com_277 +1430 magic:com_278 +1431 magic:com_279 +1432 magic:com_280 +1433 magic:com_281 +1434 magic:com_282 +1435 magic:com_283 +1436 magic:com_284 +1437 magic:com_285 +1438 magic:com_286 +1439 magic:com_287 +1440 magic:com_288 +1441 magic:com_289 +1442 magic:com_290 +1443 magic:com_291 +1444 magic:com_292 +1445 magic:com_293 +1446 magic:com_294 +1447 magic:com_295 +1448 magic:com_296 +1449 magic:com_297 +1450 magic:com_298 +1451 magic:com_299 +1452 magic:com_300 +1453 magic:com_301 +1454 magic:com_302 +1455 magic:com_303 +1456 magic:com_304 +1457 magic:com_305 +1458 magic:com_306 +1459 magic:com_307 +1460 magic:com_308 +1461 magic:com_309 +1462 magic:com_310 +1463 magic:com_311 +1464 magic:com_312 +1465 magic:com_313 +1466 magic:com_314 +1467 magic:com_315 +1468 magic:com_316 +1469 magic:com_317 +1470 magic:com_318 +1471 magic:com_319 +1472 magic:com_320 +1473 magic:com_321 +1474 magic:com_322 +1475 magic:com_323 +1476 magic:com_324 +1477 magic:com_325 +1478 magic:com_326 +1479 magic:com_327 +1480 magic:com_328 +1481 magic:com_329 +1482 magic:com_330 +1483 magic:com_331 +1484 magic:com_332 +1485 magic:com_333 +1486 magic:com_334 +1487 magic:com_335 +1488 magic:com_336 +1489 magic:com_337 +1490 magic:com_338 +1491 magic:com_339 +1492 magic:com_340 +1493 magic:com_341 +1494 magic:com_342 +1495 magic:com_343 +1496 magic:com_344 +1497 magic:com_345 +1498 magic:com_346 +1499 magic:com_347 +1500 magic:com_348 +1501 magic:com_349 +1502 magic:com_350 +1503 magic:com_351 +1504 magic:com_352 +1505 magic:com_353 +1506 magic:com_354 +1507 magic:com_355 +1508 magic:com_356 +1509 magic:com_357 +1510 magic:com_358 +1511 magic:com_359 +1512 magic:com_360 +1513 magic:com_361 +1514 magic:com_362 +1515 magic:com_363 +1516 magic:com_364 +1517 magic:com_365 +1518 magic:com_366 +1519 magic:com_367 +1520 magic:com_368 +1521 magic:com_369 +1522 magic:com_370 +1523 magic:com_371 +1524 magic:com_372 +1525 magic:com_373 +1526 magic:com_374 +1527 magic:com_375 +1528 magic:com_376 +1529 magic:com_377 +1530 magic:com_378 +1531 magic:com_379 +1532 magic:com_380 +1533 magic:com_381 +1534 magic:com_382 +1535 magic:com_383 +1536 magic:com_384 +1537 magic:com_385 +1538 magic:com_386 +1539 magic:iban_blast +1540 magic:ardougne_teleport +1541 magic:watchtower_teleport +1542 magic:vulnerability +1543 magic:enfeeble +1544 magic:com_392 +1545 magic:com_393 +1546 magic:com_394 +1547 magic:com_395 +1548 magic:com_396 +1549 magic:com_397 +1550 magic:com_398 +1551 magic:com_399 +1552 magic:com_400 +1553 magic:com_401 +1554 magic:com_402 +1555 magic:com_403 +1556 magic:com_404 +1557 magic:com_405 +1558 magic:com_406 +1559 magic:com_407 +1560 magic:com_408 +1561 magic:com_409 +1562 magic:stun +1563 magic:com_411 +1564 magic:com_412 +1565 magic:com_413 +1566 magic:com_414 +1567 magic:com_415 +1568 magic:com_416 +1569 magic:com_417 +1570 magic:com_418 +1571 magic:com_419 +1572 magic:bind +1573 magic:com_421 +1574 magic:com_422 +1575 magic:com_423 +1576 magic:com_424 +1577 magic:com_425 +1578 magic:com_426 +1579 magic:com_427 +1580 magic:com_428 +1581 magic:com_429 +1582 magic:snare +1583 magic:com_431 +1584 magic:com_432 +1585 magic:com_433 +1586 magic:com_434 +1587 magic:com_435 +1588 magic:com_436 +1589 magic:com_437 +1590 magic:com_438 +1591 magic:com_439 +1592 magic:entangle +1593 magic:com_441 +1594 magic:com_442 +1595 magic:com_443 +1596 magic:com_444 +1597 magic:com_445 +1598 magic:com_446 +1599 magic:com_447 +1600 magic:com_448 +1601 magic:com_449 +1602 magic:com_450 +1603 magic:com_451 +1604 magic:com_452 +1605 magic:com_453 +1606 magic:com_454 +1607 magic:com_455 +1608 magic:com_456 +1609 magic:com_457 +1610 magic:com_458 +1611 magic:com_459 +1612 magic:com_460 +1613 magic:com_461 +1614 magic:com_462 +1615 magic:com_463 +1616 magic:com_464 +1617 magic:com_465 +1618 magic:com_466 +1619 magic:com_467 +1620 magic:com_468 +1621 magic:com_469 +1622 magic:com_470 +1623 magic:com_471 +1624 magic:com_472 +1625 magic:com_473 +1626 magic:com_474 +1627 magic:com_475 +1628 magic:com_476 +1629 magic:com_477 +1630 magic:com_478 +1631 magic:com_479 +1632 magic:com_480 +1633 magic:com_481 +1634 magic:com_482 +1635 magic:com_483 +1636 magic:com_484 +1637 magic:com_485 +1638 magic:com_486 +1639 magic:com_487 +1640 magic:com_488 +1641 magic:com_489 +1642 magic:com_490 +1643 magic:com_491 +1645 wornitems:com_0 +1646 wornitems:com_1 +1647 wornitems:com_2 +1648 wornitems:com_3 +1649 wornitems:com_4 +1650 wornitems:com_5 +1651 wornitems:com_6 +1652 wornitems:com_7 +1653 wornitems:com_8 +1654 wornitems:com_9 +1655 wornitems:com_10 +1656 wornitems:com_11 +1657 wornitems:com_12 +1658 wornitems:com_13 +1659 wornitems:com_14 +1660 wornitems:com_15 +1661 wornitems:com_16 +1662 wornitems:com_17 +1663 wornitems:com_18 +1664 wornitems:com_19 +1665 wornitems:com_20 +1666 wornitems:com_21 +1667 wornitems:com_22 +1668 wornitems:com_23 +1669 wornitems:com_40 +1670 wornitems:com_41 +1671 wornitems:com_42 +1672 wornitems:com_24 +1673 wornitems:com_25 +1674 wornitems:com_26 +1675 wornitems:stabattack +1676 wornitems:slashattack +1677 wornitems:crushattack +1678 wornitems:magicattack +1679 wornitems:rangeattack +1680 wornitems:stabdefence +1681 wornitems:slashdefence +1682 wornitems:crushdefence +1683 wornitems:magicdefence +1684 wornitems:rangedefence +1685 wornitems:com_37 +1686 wornitems:strengthbonus +1687 wornitems:prayerbonus +1688 wornitems:wear +1690 questscroll_itgronigen:com_0 +1691 music:com_181 +1692 questscroll_itgronigen:com_2 +1693 music:com_182 +1694 music:com_183 +1695 questscroll_itgronigen:com_5 +1696 questscroll_itgronigen:com_6 +1697 music:com_184 +1699 combat_axe:preview +1700 combat_axe:com_1 +1701 combat_axe:name +1702 combat_axe:com_3 +1703 combat_axe:axe101 +1704 combat_axe:axe0 +1705 combat_axe:axe3 +1706 combat_axe:axe2 +1707 combat_axe:axe1 +1708 combat_axe:com_9 +1709 combat_axe:com_10 +1710 combat_axe:com_11 +1711 combat_axe:com_12 +1712 combat_axe:com_13 +1713 combat_axe:com_14 +1714 combat_axe:com_15 +1715 combat_axe:com_16 +1716 combat_axe:com_17 +1717 combat_axe:com_18 +1718 combat_axe:com_19 +1719 combat_axe:com_20 +1720 combat_axe:com_21 +1721 combat_axe:com_22 +1722 combat_axe:com_23 +1723 combat_axe:com_24 +1725 combat_staff:preview +1726 combat_staff:com_1 +1727 combat_staff:name +1728 combat_staff:com_3 +1729 combat_staff:staff101 +1730 combat_staff:staff2 +1731 combat_staff:staff1 +1732 combat_staff:staff0 +1733 combat_staff:com_8 +1734 combat_staff:com_9 +1735 combat_staff:com_10 +1736 combat_staff:com_11 +1737 combat_staff:com_12 +1738 combat_staff:com_13 +1739 combat_staff:com_14 +1740 combat_staff:com_15 +1741 combat_staff:com_16 +1742 combat_staff:com_20 +1743 combat_staff:com_21 +1744 combat_staff:com_22 +1745 combat_staff:com_17 +1746 combat_staff:com_18 +1747 combat_staff:com_19 +1748 combat_staff:com_23 +1750 combat_crossbow:preview +1751 combat_crossbow:com_1 +1752 combat_crossbow:name +1753 combat_crossbow:com_3 +1754 combat_crossbow:crossbow101 +1755 combat_crossbow:crossbow2 +1756 combat_crossbow:crossbow1 +1757 combat_crossbow:crossbow0 +1758 combat_crossbow:com_8 +1759 combat_crossbow:com_9 +1760 combat_crossbow:com_10 +1761 combat_crossbow:com_11 +1762 combat_crossbow:com_12 +1763 combat_crossbow:com_13 +1765 combat_bow:preview +1766 combat_bow:com_1 +1767 combat_bow:name +1768 combat_bow:com_3 +1769 combat_bow:bow101 +1770 combat_bow:bow2 +1771 combat_bow:bow1 +1772 combat_bow:bow0 +1773 combat_bow:com_8 +1774 combat_bow:com_9 +1775 combat_bow:com_10 +1776 combat_bow:com_11 +1777 combat_bow:com_12 +1778 combat_bow:com_13 +1780 giannes_cook_book:book_background +1781 giannes_cook_book:leftarrow +1782 giannes_cook_book:rightarrow +1783 giannes_cook_book:text_left +1784 giannes_cook_book:cook_obj +1785 giannes_cook_book:title +1786 giannes_cook_book:text_right +1787 giannes_cook_book:leftarrow_layer +1788 giannes_cook_book:rightarrow_layer +1789 giannes_cook_book:com_9 +1790 giannes_cook_book:com_10 +1791 giannes_cook_book:com_11 +1792 giannes_cook_book:com_12 +1793 giannes_cook_book:com_13 +1794 giannes_cook_book:com_14 +1795 giannes_cook_book:com_15 +1796 giannes_cook_book:com_16 +1797 giannes_cook_book:com_17 +1798 giannes_cook_book:com_18 +1799 giannes_cook_book:com_19 +1800 giannes_cook_book:com_20 +1801 giannes_cook_book:com_21 +1802 giannes_cook_book:com_22 +1803 giannes_cook_book:com_23 +1804 giannes_cook_book:com_24 +1805 giannes_cook_book:com_25 +1806 giannes_cook_book:com_26 +1807 giannes_cook_book:com_27 +1808 giannes_cook_book:com_28 +1809 giannes_cook_book:com_29 +1810 giannes_cook_book:com_30 +1811 giannes_cook_book:com_31 +1812 giannes_cook_book:com_32 +1813 giannes_cook_book:com_33 +1814 giannes_cook_book:com_34 +1815 giannes_cook_book:com_35 +1816 giannes_cook_book:com_36 +1817 giannes_cook_book:com_37 +1818 giannes_cook_book:com_38 +1819 giannes_cook_book:com_39 +1820 giannes_cook_book:com_40 +1821 giannes_cook_book:com_41 +1822 giannes_cook_book:com_42 +1823 giannes_cook_book:com_43 +1824 giannes_cook_book:com_44 +1825 giannes_cook_book:com_45 +1826 giannes_cook_book:com_46 +1827 giannes_cook_book:com_47 +1828 giannes_cook_book:index +1830 staff_spells:ssb0 +1831 staff_spells:ssb1 +1832 staff_spells:ssb2 +1833 staff_spells:ssb3 +1834 staff_spells:ssb4 +1835 staff_spells:ssb5 +1836 staff_spells:ssb6 +1837 staff_spells:ssb7 +1838 staff_spells:ssb8 +1839 staff_spells:ssb9 +1840 staff_spells:ssb10 +1841 staff_spells:ssb11 +1842 staff_spells:ssb12 +1843 staff_spells:ssb13 +1844 staff_spells:ssb14 +1845 staff_spells:ssb15 +1846 staff_spells:com_16 +1847 staff_spells:com_21 +1848 staff_spells:com_17 +1849 staff_spells:com_18 +1850 staff_spells:com_19 +1851 staff_spells:com_20 +1852 staff_spells:com_22 +1853 staff_spells:com_23 +1854 staff_spells:com_24 +1855 staff_spells:com_25 +1856 staff_spells:com_26 +1857 staff_spells:com_27 +1858 staff_spells:com_28 +1859 staff_spells:com_29 +1860 staff_spells:com_30 +1861 staff_spells:com_31 +1862 staff_spells:com_32 +1863 staff_spells:com_33 +1864 staff_spells:com_34 +1865 staff_spells:com_35 +1866 staff_spells:com_36 +1867 staff_spells:com_37 +1868 staff_spells:com_38 +1869 staff_spells:com_39 +1870 staff_spells:com_40 +1871 staff_spells:com_41 +1872 staff_spells:com_42 +1873 staff_spells:com_43 +1874 staff_spells:com_44 +1875 staff_spells:com_45 +1876 staff_spells:com_46 +1877 staff_spells:com_47 +1878 staff_spells:com_48 +1879 staff_spells:com_49 +1880 staff_spells:com_50 +1881 staff_spells:com_51 +1882 staff_spells:com_52 +1883 music:com_163 +1884 staff_spells:com_54 +1885 staff_spells:com_55 +1886 staff_spells:com_56 +1887 staff_spells:com_57 +1888 staff_spells:com_58 +1889 staff_spells:com_60 +1890 music:com_164 +1891 staff_spells:com_62 +1892 staff_spells:com_63 +1893 music:com_170 +1894 staff_spells:com_64 +1895 staff_spells:com_65 +1896 staff_spells:com_66 +1897 staff_spells:com_68 +1898 music:com_165 +1899 staff_spells:com_70 +1900 staff_spells:com_71 +1901 music:com_166 +1902 staff_spells:com_72 +1903 staff_spells:com_73 +1904 staff_spells:com_74 +1905 staff_spells:com_75 +1906 staff_spells:com_76 +1907 staff_spells:com_78 +1909 staff_spells:com_80 +1910 staff_spells:com_81 +1911 wilderness_warning:com_0 +1912 staff_spells:com_82 +1913 staff_spells:com_83 +1914 staff_spells:com_84 +1915 staff_spells:com_85 +1916 staff_spells:com_86 +1917 staff_spells:com_88 +1918 wilderness_warning:com_1 +1919 staff_spells:com_90 +1920 staff_spells:com_91 +1921 wilderness_warning:com_2 +1922 staff_spells:com_92 +1923 staff_spells:com_93 +1924 staff_spells:com_94 +1925 staff_spells:com_95 +1926 staff_spells:com_96 +1927 staff_spells:com_98 +1928 wilderness_warning:com_3 +1929 staff_spells:com_100 +1930 staff_spells:com_101 +1931 wilderness_warning:com_4 +1932 staff_spells:com_102 +1933 staff_spells:com_103 +1934 staff_spells:com_104 +1935 staff_spells:com_106 +1936 wilderness_warning:com_5 +1937 staff_spells:com_108 +1938 staff_spells:com_109 +1939 wilderness_warning:com_6 +1940 staff_spells:com_110 +1941 staff_spells:com_111 +1942 staff_spells:com_112 +1943 staff_spells:com_113 +1944 staff_spells:com_114 +1945 staff_spells:com_116 +1946 wilderness_warning:com_7 +1947 staff_spells:com_118 +1948 staff_spells:com_119 +1949 wilderness_warning:com_8 +1950 staff_spells:com_120 +1951 staff_spells:com_121 +1952 staff_spells:com_122 +1953 staff_spells:com_123 +1954 staff_spells:com_124 +1955 staff_spells:com_126 +1956 wilderness_warning:com_9 +1957 staff_spells:com_128 +1958 staff_spells:com_129 +1959 wilderness_warning:com_10 +1960 staff_spells:com_130 +1961 staff_spells:com_131 +1962 staff_spells:com_132 +1963 staff_spells:com_133 +1964 staff_spells:com_134 +1965 staff_spells:com_136 +1966 wilderness_warning:com_11 +1967 staff_spells:com_138 +1968 staff_spells:com_139 +1969 wilderness_warning:com_12 +1970 staff_spells:com_140 +1971 staff_spells:com_141 +1972 staff_spells:com_142 +1973 staff_spells:com_144 +1974 wilderness_warning:com_13 +1975 staff_spells:com_146 +1976 staff_spells:com_147 +1977 wilderness_warning:com_14 +1978 staff_spells:com_148 +1979 staff_spells:com_149 +1980 staff_spells:com_150 +1981 staff_spells:com_151 +1982 staff_spells:com_152 +1983 staff_spells:com_154 +1984 wilderness_warning:com_15 +1985 staff_spells:com_156 +1986 staff_spells:com_157 +1987 wilderness_warning:com_16 +1988 staff_spells:com_158 +1989 staff_spells:com_159 +1990 staff_spells:com_53 +1991 staff_spells:com_161 +1992 staff_spells:com_162 +1993 staff_spells:com_163 +1994 staff_spells:com_164 +1995 staff_spells:com_165 +1996 staff_spells:com_166 +1997 staff_spells:com_167 +1998 staff_spells:com_168 +1999 staff_spells:com_169 +2000 staff_spells:com_170 +2001 staff_spells:com_171 +2002 staff_spells:com_172 +2003 staff_spells:com_173 +2004 staff_spells:cancelspell +2006 bank_side:inv +2008 player_kit_hair_jaw:com_0 +2009 player_kit_hair_jaw:com_1 +2010 player_kit_hair_jaw:com_2 +2011 player_kit_hair_jaw:com_3 +2012 player_kit_hair_jaw:com_4 +2013 player_kit_hair_jaw:com_5 +2014 player_kit_hair_jaw:com_6 +2015 player_kit_hair_jaw:com_7 +2016 player_kit_hair_jaw:com_8 +2017 player_kit_hair_jaw:com_9 +2018 player_kit_hair_jaw:com_10 +2019 player_kit_hair_jaw:com_11 +2020 player_kit_hair_jaw:com_12 +2021 player_kit_hair_jaw:com_13 +2022 player_kit_hair_jaw:com_14 +2023 player_kit_hair_jaw:com_15 +2024 player_kit_hair_jaw:com_16 +2025 player_kit_hair_jaw:com_17 +2026 player_kit_hair_jaw:com_18 +2027 player_kit_hair_jaw:com_19 +2028 player_kit_hair_jaw:com_20 +2029 player_kit_hair_jaw:com_21 +2030 player_kit_hair_jaw:com_22 +2031 player_kit_hair_jaw:com_23 +2032 player_kit_hair_jaw:com_24 +2033 player_kit_hair_jaw:com_25 +2034 player_kit_hair_jaw:com_26 +2035 player_kit_hair_jaw:com_27 +2036 player_kit_hair_jaw:com_28 +2037 player_kit_hair_jaw:com_29 +2038 player_kit_hair_jaw:com_30 +2039 player_kit_hair_jaw:com_31 +2040 player_kit_hair_jaw:com_32 +2041 player_kit_hair_jaw:com_33 +2042 player_kit_hair_jaw:com_34 +2043 player_kit_hair_jaw:com_35 +2044 player_kit_hair_jaw:com_36 +2045 player_kit_hair_jaw:com_37 +2046 player_kit_hair_jaw:com_38 +2047 player_kit_hair_jaw:com_39 +2048 player_kit_hair_jaw:com_40 +2049 player_kit_hair_jaw:com_41 +2050 player_kit_hair_jaw:com_42 +2051 player_kit_hair_jaw:com_43 +2052 player_kit_hair_jaw:com_44 +2053 player_kit_hair_jaw:com_45 +2054 player_kit_hair_jaw:com_46 +2055 player_kit_hair_jaw:com_47 +2056 player_kit_hair_jaw:com_48 +2057 player_kit_hair_jaw:com_49 +2058 player_kit_hair_jaw:com_50 +2059 player_kit_hair_jaw:com_51 +2060 player_kit_hair_jaw:com_52 +2061 player_kit_hair_jaw:com_53 +2062 player_kit_hair_jaw:com_54 +2063 player_kit_hair_jaw:com_55 +2064 player_kit_hair_jaw:com_56 +2065 player_kit_hair_jaw:com_57 +2066 player_kit_hair_jaw:com_58 +2067 player_kit_hair_jaw:com_59 +2068 player_kit_hair_jaw:com_60 +2069 player_kit_hair_jaw:com_61 +2070 player_kit_hair_jaw:com_62 +2071 player_kit_hair_jaw:com_63 +2072 player_kit_hair_jaw:com_64 +2073 player_kit_hair_jaw:com_65 +2074 player_kit_hair_jaw:com_66 +2075 player_kit_hair_jaw:com_67 +2076 player_kit_hair_jaw:com_68 +2077 player_kit_hair_jaw:com_69 +2078 player_kit_hair_jaw:com_70 +2079 player_kit_hair_jaw:com_71 +2080 player_kit_hair_jaw:com_72 +2081 player_kit_hair_jaw:com_73 +2082 player_kit_hair_jaw:com_74 +2083 player_kit_hair_jaw:com_75 +2084 player_kit_hair_jaw:com_76 +2085 player_kit_hair_jaw:com_77 +2086 player_kit_hair_jaw:com_78 +2087 player_kit_hair_jaw:com_79 +2088 player_kit_hair_jaw:com_80 +2089 player_kit_hair_jaw:com_81 +2090 player_kit_hair_jaw:com_82 +2091 player_kit_hair_jaw:com_83 +2092 player_kit_hair_jaw:com_84 +2093 player_kit_hair_jaw:com_85 +2094 player_kit_hair_jaw:com_86 +2095 player_kit_hair_jaw:com_87 +2096 player_kit_hair_jaw:com_88 +2097 player_kit_hair_jaw:com_89 +2098 player_kit_hair_jaw:com_90 +2099 player_kit_hair_jaw:com_91 +2100 player_kit_hair_jaw:com_92 +2101 player_kit_hair_jaw:com_93 +2102 player_kit_hair_jaw:com_94 +2103 player_kit_hair_jaw:com_95 +2104 player_kit_hair_jaw:com_96 +2105 player_kit_hair_jaw:com_97 +2106 player_kit_hair_jaw:com_98 +2107 player_kit_hair_jaw:com_99 +2108 player_kit_hair_jaw:com_100 +2109 player_kit_hair_jaw:com_101 +2110 player_kit_hair_jaw:com_102 +2111 player_kit_hair_jaw:com_103 +2112 player_kit_hair_jaw:com_104 +2113 player_kit_hair_jaw:com_105 +2114 player_kit_hair_jaw:com_106 +2115 player_kit_hair_jaw:com_107 +2116 player_kit_hair_jaw:com_108 +2117 player_kit_hair_jaw:com_109 +2118 player_kit_hair_jaw:com_110 +2119 player_kit_hair_jaw:com_111 +2120 player_kit_hair_jaw:com_112 +2121 player_kit_hair_jaw:com_113 +2122 player_kit_hair_jaw:com_114 +2123 player_kit_hair_jaw:com_115 +2124 player_kit_hair_jaw:com_116 +2125 player_kit_hair_jaw:com_117 +2126 player_kit_hair_jaw:com_118 +2127 player_kit_hair_jaw:com_119 +2128 player_kit_hair_jaw:com_120 +2129 player_kit_hair_jaw:com_121 +2130 player_kit_hair_jaw:com_122 +2131 player_kit_hair_jaw:com_123 +2132 player_kit_hair_jaw:com_124 +2133 player_kit_hair_jaw:com_125 +2134 player_kit_hair_jaw:com_126 +2135 player_kit_hair_jaw:com_127 +2136 player_kit_hair_jaw:com_128 +2137 player_kit_hair_jaw:com_129 +2138 player_kit_hair_jaw:com_130 +2139 player_kit_hair_jaw:com_131 +2140 player_kit_hair_jaw:com_132 +2141 player_kit_hair_jaw:com_133 +2142 player_kit_hair_jaw:com_134 +2143 player_kit_hair_jaw:com_135 +2144 player_kit_hair_jaw:com_136 +2145 player_kit_hair_jaw:com_137 +2146 player_kit_hair_jaw:com_138 +2147 player_kit_hair_jaw:com_139 +2148 player_kit_hair_jaw:com_140 +2149 player_kit_hair_jaw:com_141 +2150 player_kit_hair_jaw:com_142 +2151 player_kit_hair_jaw:com_143 +2152 player_kit_hair_jaw:com_144 +2153 player_kit_hair_jaw:com_145 +2154 player_kit_hair_jaw:com_146 +2155 player_kit_hair_jaw:com_147 +2157 party_drop_chest:com_0 +2158 party_drop_chest:com_1 +2159 party_drop_chest:com_2 +2160 party_drop_chest:com_3 +2161 party_drop_chest:com_4 +2162 party_drop_chest:com_5 +2163 party_drop_chest:com_6 +2164 party_drop_chest:com_7 +2165 party_drop_chest:com_8 +2166 party_drop_chest:com_9 +2167 party_drop_chest:com_10 +2168 party_drop_chest:com_11 +2169 party_drop_chest:com_12 +2170 party_drop_chest:com_13 +2171 party_drop_chest:com_14 +2172 party_drop_chest:com_15 +2173 party_drop_chest:com_16 +2174 party_drop_chest:com_17 +2175 party_drop_chest:com_18 +2176 party_drop_chest:com_19 +2177 party_drop_chest:com_20 +2178 party_drop_chest:com_21 +2179 party_drop_chest:com_22 +2180 party_drop_chest:com_23 +2181 party_drop_chest:com_24 +2182 party_drop_chest:com_25 +2183 party_drop_chest:com_26 +2184 party_drop_chest:com_27 +2185 party_drop_chest:com_28 +2186 party_drop_chest:com_29 +2187 party_drop_chest:com_30 +2188 party_drop_chest:com_31 +2189 party_drop_chest:com_32 +2190 party_drop_chest:com_33 +2191 party_drop_chest:com_34 +2192 party_drop_chest:com_35 +2193 party_drop_chest:com_36 +2194 party_drop_chest:com_37 +2195 party_drop_chest:com_38 +2196 party_drop_chest:com_39 +2197 party_drop_chest:com_40 +2198 party_drop_chest:com_41 +2199 party_drop_chest:com_42 +2200 party_drop_chest:com_43 +2201 party_drop_chest:com_44 +2202 party_drop_chest:com_45 +2203 party_drop_chest:com_46 +2204 party_drop_chest:com_47 +2205 party_drop_chest:com_48 +2206 party_drop_chest:com_49 +2207 party_drop_chest:com_50 +2208 party_drop_chest:com_51 +2209 party_drop_chest:com_52 +2210 party_drop_chest:com_53 +2211 party_drop_chest:com_54 +2212 party_drop_chest:com_55 +2213 party_drop_chest:com_56 +2214 party_drop_chest:com_57 +2215 party_drop_chest:com_58 +2216 party_drop_chest:com_59 +2217 party_drop_chest:com_60 +2218 party_drop_chest:com_61 +2219 party_drop_chest:com_62 +2220 party_drop_chest:com_63 +2221 party_drop_chest:com_64 +2222 party_drop_chest:com_65 +2223 party_drop_chest:com_66 +2224 party_drop_chest:com_67 +2225 party_drop_chest:com_68 +2226 party_drop_chest:com_69 +2227 party_drop_chest:com_70 +2228 party_drop_chest:com_71 +2229 party_drop_chest:com_72 +2230 party_drop_chest:com_73 +2231 party_drop_chest:com_74 +2232 party_drop_chest:com_75 +2233 party_drop_chest:com_76 +2234 party_drop_chest:com_77 +2235 party_drop_chest:com_78 +2236 party_drop_chest:com_79 +2237 party_drop_chest:com_80 +2238 party_drop_chest:com_81 +2239 party_drop_chest:com_82 +2240 party_drop_chest:com_83 +2241 party_drop_chest:com_84 +2242 party_drop_chest:com_85 +2243 party_drop_chest:com_86 +2244 party_drop_chest:com_87 +2245 party_drop_chest:com_88 +2246 party_drop_chest:com_94 +2247 party_drop_chest:com_95 +2248 party_drop_chest:com_89 +2249 party_drop_chest:com_90 +2250 party_drop_chest:com_91 +2251 party_drop_chest:com_93 +2252 party_drop_chest:com_98 +2253 party_drop_chest:com_99 +2254 party_drop_chest:com_100 +2255 party_drop_chest:com_101 +2256 party_drop_chest:com_102 +2257 party_drop_chest:com_103 +2258 party_drop_chest:com_104 +2259 party_drop_chest:com_105 +2260 party_drop_chest:com_106 +2261 party_drop_chest:com_107 +2262 party_drop_chest:com_108 +2263 party_drop_chest:com_109 +2264 party_drop_chest:com_110 +2265 party_drop_chest:com_111 +2266 party_drop_chest:com_96 +2267 party_drop_chest:com_112 +2268 party_drop_chest:com_113 +2269 party_drop_chest:com_114 +2270 party_drop_chest:com_115 +2271 party_drop_chest:com_116 +2272 party_drop_chest:com_117 +2273 party_drop_chest:inv +2274 party_drop_chest:playerinv +2275 party_drop_chest:com_118 +2277 combat_stabsword:preview +2278 combat_stabsword:com_1 +2279 combat_stabsword:name +2280 combat_stabsword:com_3 +2281 combat_stabsword:stab101 +2282 combat_stabsword:stab0 +2283 combat_stabsword:stab3 +2284 combat_stabsword:stab2 +2285 combat_stabsword:stab1 +2286 combat_stabsword:com_9 +2287 combat_stabsword:com_10 +2288 combat_stabsword:com_11 +2289 combat_stabsword:com_12 +2290 combat_stabsword:com_13 +2291 combat_stabsword:com_14 +2292 combat_stabsword:com_15 +2293 combat_stabsword:com_16 +2294 combat_stabsword:com_17 +2295 combat_stabsword:com_18 +2296 combat_stabsword:com_19 +2297 combat_stabsword:com_20 +2298 combat_stabsword:com_21 +2299 combat_stabsword:com_22 +2300 combat_stabsword:com_23 +2301 combat_stabsword:com_24 +2303 questscroll_fluffs:com_0 +2304 music:com_185 +2305 questscroll_fluffs:com_2 +2306 music:com_186 +2307 music:com_187 +2308 questscroll_fluffs:com_5 +2309 questscroll_fluffs:com_6 +2310 music:com_188 +2312 leather_crafting:com_0 +2313 leather_crafting:com_1 +2314 leather_crafting:com_2 +2315 leather_crafting:com_3 +2316 leather_crafting:com_4 +2317 leather_crafting:com_5 +2318 leather_crafting:com_6 +2319 leather_crafting:com_7 +2320 leather_crafting:com_8 +2321 leather_crafting:com_9 +2322 leather_crafting:com_10 +2323 leather_crafting:com_11 +2324 leather_crafting:com_12 +2325 leather_crafting:com_13 +2326 leather_crafting:com_14 +2327 leather_crafting:com_15 +2328 leather_crafting:com_16 +2329 leather_crafting:com_17 +2330 leather_crafting:com_18 +2331 leather_crafting:com_19 +2332 leather_crafting:com_20 +2333 leather_crafting:com_21 +2334 leather_crafting:com_22 +2335 leather_crafting:com_23 +2336 leather_crafting:com_24 +2337 leather_crafting:com_25 +2338 leather_crafting:com_26 +2339 leather_crafting:com_27 +2340 leather_crafting:com_28 +2341 leather_crafting:com_29 +2342 leather_crafting:com_30 +2343 leather_crafting:com_31 +2344 leather_crafting:com_32 +2345 leather_crafting:com_33 +2346 leather_crafting:com_34 +2347 leather_crafting:com_35 +2348 leather_crafting:com_36 +2349 leather_crafting:com_37 +2350 leather_crafting:com_38 +2351 leather_crafting:com_39 +2352 leather_crafting:com_40 +2353 leather_crafting:com_41 +2354 leather_crafting:com_42 +2355 leather_crafting:com_43 +2356 leather_crafting:com_44 +2357 leather_crafting:com_45 +2358 leather_crafting:com_46 +2359 leather_crafting:com_47 +2360 leather_crafting:com_48 +2361 leather_crafting:com_49 +2362 leather_crafting:com_50 +2363 leather_crafting:com_51 +2364 leather_crafting:com_52 +2365 leather_crafting:com_53 +2366 leather_crafting:com_54 +2367 leather_crafting:com_55 +2368 leather_crafting:com_56 +2369 leather_crafting:com_57 +2370 leather_crafting:com_58 +2371 leather_crafting:com_59 +2372 leather_crafting:com_60 +2373 leather_crafting:com_61 +2374 leather_crafting:com_62 +2375 leather_crafting:com_63 +2376 leather_crafting:com_64 +2377 leather_crafting:com_65 +2378 leather_crafting:com_66 +2379 leather_crafting:com_67 +2380 leather_crafting:com_68 +2381 leather_crafting:com_69 +2382 leather_crafting:com_70 +2383 leather_crafting:com_71 +2384 leather_crafting:com_72 +2385 leather_crafting:com_73 +2386 leather_crafting:com_74 +2387 leather_crafting:com_75 +2388 leather_crafting:com_76 +2389 leather_crafting:com_77 +2390 leather_crafting:com_78 +2391 leather_crafting:com_79 +2392 leather_crafting:com_80 +2393 leather_crafting:com_81 +2394 leather_crafting:com_82 +2395 leather_crafting:com_83 +2396 leather_crafting:com_84 +2397 leather_crafting:com_85 +2398 leather_crafting:com_86 +2399 leather_crafting:com_87 +2400 leather_crafting:com_88 +2401 leather_crafting:com_89 +2402 leather_crafting:com_90 +2403 leather_crafting:com_91 +2404 leather_crafting:com_92 +2405 leather_crafting:com_93 +2406 leather_crafting:com_94 +2407 leather_crafting:com_95 +2408 leather_crafting:com_96 +2409 leather_crafting:com_97 +2410 leather_crafting:com_98 +2411 leather_crafting:com_99 +2412 leather_crafting:com_100 +2413 leather_crafting:com_101 +2414 leather_crafting:com_102 +2415 leather_crafting:com_103 +2416 leather_crafting:com_104 +2417 leather_crafting:com_105 +2418 leather_crafting:com_106 +2419 leather_crafting:com_107 +2420 leather_crafting:com_108 +2421 leather_crafting:com_109 +2422 leather_crafting:com_110 +2424 combat_hacksword:preview +2425 combat_hacksword:com_1 +2426 combat_hacksword:name +2427 combat_hacksword:com_3 +2428 combat_hacksword:hack101 +2429 combat_hacksword:hack0 +2430 combat_hacksword:hack3 +2431 combat_hacksword:hack2 +2432 combat_hacksword:hack1 +2433 combat_hacksword:com_9 +2434 combat_hacksword:com_10 +2435 combat_hacksword:com_11 +2436 combat_hacksword:com_12 +2437 combat_hacksword:com_13 +2438 combat_hacksword:com_14 +2439 combat_hacksword:com_15 +2440 combat_hacksword:com_16 +2441 combat_hacksword:com_17 +2442 combat_hacksword:com_18 +2443 combat_hacksword:com_19 +2444 combat_hacksword:com_20 +2445 combat_hacksword:com_21 +2446 combat_hacksword:com_22 +2447 combat_hacksword:com_23 +2448 combat_hacksword:com_24 +2450 logout:com_0 +2451 logout:com_1 +2452 logout:com_2 +2453 logout:com_3 +2454 logout:com_4 +2455 logout:com_5 +2456 logout:com_6 +2457 logout:com_7 +2458 logout:try_logout +2460 multi2:com_0 +2461 multi2:com_1 +2462 multi2:com_2 +2463 multi2:com_4 +2464 multi2:com_5 +2465 multi2:com_3 +2466 multi2:com_7 +2467 multi2:com_8 +2468 multi2:com_6 +2470 multi3:com_0 +2471 multi3:com_1 +2472 multi3:com_2 +2473 multi3:com_3 +2474 multi3:com_5 +2475 multi3:com_6 +2476 multi3:com_4 +2477 multi3:com_8 +2478 multi3:com_9 +2479 multi3:com_7 +2481 multi4:com_0 +2482 multi4:com_1 +2483 multi4:com_2 +2484 multi4:com_3 +2485 multi4:com_4 +2486 multi4:com_6 +2487 multi4:com_7 +2488 multi4:com_5 +2489 multi4:com_8 +2490 multi4:com_9 +2491 multi4:com_10 +2493 multi5:com_0 +2494 multi5:com_1 +2495 multi5:com_2 +2496 multi5:com_3 +2497 multi5:com_4 +2498 multi5:com_5 +2499 multi5:com_7 +2500 multi5:com_8 +2501 multi5:com_6 +2502 multi5:com_9 +2503 multi5:com_10 +2504 multi5:com_11 +2506 player_kit_hair_woman:com_0 +2507 player_kit_hair_woman:com_1 +2508 player_kit_hair_woman:com_2 +2509 player_kit_hair_woman:com_3 +2510 player_kit_hair_woman:com_4 +2511 player_kit_hair_woman:com_5 +2512 player_kit_hair_woman:com_6 +2513 player_kit_hair_woman:com_7 +2514 player_kit_hair_woman:com_8 +2515 player_kit_hair_woman:com_9 +2516 player_kit_hair_woman:com_10 +2517 player_kit_hair_woman:com_11 +2518 player_kit_hair_woman:com_12 +2519 player_kit_hair_woman:com_13 +2520 player_kit_hair_woman:com_14 +2521 player_kit_hair_woman:com_15 +2522 player_kit_hair_woman:com_16 +2523 player_kit_hair_woman:com_17 +2524 player_kit_hair_woman:com_18 +2525 player_kit_hair_woman:com_19 +2526 player_kit_hair_woman:com_20 +2527 player_kit_hair_woman:com_21 +2528 player_kit_hair_woman:com_22 +2529 player_kit_hair_woman:com_23 +2530 player_kit_hair_woman:com_24 +2531 player_kit_hair_woman:com_25 +2532 player_kit_hair_woman:com_26 +2533 player_kit_hair_woman:com_27 +2534 player_kit_hair_woman:com_28 +2535 player_kit_hair_woman:com_29 +2536 player_kit_hair_woman:com_30 +2537 player_kit_hair_woman:com_31 +2538 player_kit_hair_woman:com_32 +2539 player_kit_hair_woman:com_33 +2540 player_kit_hair_woman:com_34 +2541 player_kit_hair_woman:com_35 +2542 player_kit_hair_woman:com_36 +2543 player_kit_hair_woman:com_37 +2544 player_kit_hair_woman:com_38 +2545 player_kit_hair_woman:com_39 +2546 player_kit_hair_woman:com_40 +2547 player_kit_hair_woman:com_41 +2548 player_kit_hair_woman:com_42 +2549 player_kit_hair_woman:com_43 +2550 player_kit_hair_woman:com_44 +2551 player_kit_hair_woman:com_45 +2552 player_kit_hair_woman:com_46 +2553 player_kit_hair_woman:com_47 +2554 player_kit_hair_woman:com_48 +2555 player_kit_hair_woman:com_49 +2556 player_kit_hair_woman:com_50 +2557 player_kit_hair_woman:com_51 +2558 player_kit_hair_woman:com_52 +2559 player_kit_hair_woman:com_53 +2560 player_kit_hair_woman:com_54 +2561 player_kit_hair_woman:com_55 +2562 player_kit_hair_woman:com_56 +2563 player_kit_hair_woman:com_57 +2564 player_kit_hair_woman:com_58 +2565 player_kit_hair_woman:com_59 +2566 player_kit_hair_woman:com_60 +2567 player_kit_hair_woman:com_61 +2568 player_kit_hair_woman:com_62 +2569 player_kit_hair_woman:com_63 +2570 player_kit_hair_woman:com_64 +2571 player_kit_hair_woman:com_65 +2572 player_kit_hair_woman:com_66 +2573 player_kit_hair_woman:com_67 +2574 player_kit_hair_woman:com_68 +2575 player_kit_hair_woman:com_69 +2576 player_kit_hair_woman:com_70 +2577 player_kit_hair_woman:com_71 +2578 player_kit_hair_woman:com_72 +2579 player_kit_hair_woman:com_73 +2580 player_kit_hair_woman:com_74 +2581 player_kit_hair_woman:com_75 +2582 player_kit_hair_woman:com_76 +2583 player_kit_hair_woman:com_77 +2584 player_kit_hair_woman:com_78 +2585 player_kit_hair_woman:com_79 +2586 player_kit_hair_woman:com_80 +2587 player_kit_hair_woman:com_81 +2588 player_kit_hair_woman:com_82 +2589 player_kit_hair_woman:com_83 +2590 player_kit_hair_woman:com_84 +2591 player_kit_hair_woman:com_85 +2592 player_kit_hair_woman:com_86 +2593 player_kit_hair_woman:com_87 +2594 player_kit_hair_woman:com_88 +2595 player_kit_hair_woman:com_89 +2596 player_kit_hair_woman:com_90 +2597 player_kit_hair_woman:com_91 +2598 player_kit_hair_woman:com_92 +2599 player_kit_hair_woman:com_93 +2600 player_kit_hair_woman:com_94 +2601 player_kit_hair_woman:com_95 +2602 player_kit_hair_woman:com_96 +2603 player_kit_hair_woman:com_97 +2604 player_kit_hair_woman:com_98 +2605 player_kit_hair_woman:com_99 +2606 player_kit_hair_woman:com_100 +2607 player_kit_hair_woman:com_101 +2608 player_kit_hair_woman:com_102 +2609 player_kit_hair_woman:com_103 +2610 player_kit_hair_woman:com_104 +2611 player_kit_hair_woman:com_105 +2612 player_kit_hair_woman:com_106 +2613 player_kit_hair_woman:com_107 +2614 player_kit_hair_woman:com_108 +2615 player_kit_hair_woman:com_109 +2616 player_kit_hair_woman:com_110 +2617 player_kit_hair_woman:com_111 +2618 player_kit_hair_woman:com_112 +2619 player_kit_hair_woman:com_113 +2620 player_kit_hair_woman:com_114 +2621 player_kit_hair_woman:com_115 +2622 player_kit_hair_woman:com_116 +2623 player_kit_hair_woman:com_117 +2624 player_kit_hair_woman:com_118 +2625 player_kit_hair_woman:com_119 +2626 player_kit_hair_woman:com_120 +2627 player_kit_hair_woman:com_121 +2628 player_kit_hair_woman:com_122 +2629 player_kit_hair_woman:com_123 +2630 player_kit_hair_woman:com_124 +2631 player_kit_hair_woman:com_125 +2632 player_kit_hair_woman:com_126 +2633 player_kit_hair_woman:com_127 +2634 player_kit_hair_woman:com_128 +2635 player_kit_hair_woman:com_129 +2636 player_kit_hair_woman:com_130 +2637 player_kit_hair_woman:com_131 +2638 player_kit_hair_woman:com_132 +2639 player_kit_hair_woman:com_133 +2640 player_kit_hair_woman:com_134 +2641 player_kit_hair_woman:com_135 +2642 player_kit_hair_woman:com_136 +2643 player_kit_hair_woman:com_137 +2644 player_kit_hair_woman:com_138 +2645 player_kit_hair_woman:com_139 +2646 player_kit_hair_woman:com_140 +2647 player_kit_hair_woman:com_141 +2648 player_kit_hair_woman:com_142 +2649 player_kit_hair_woman:com_143 +2650 player_kit_hair_woman:com_144 +2651 player_kit_hair_woman:com_145 +2652 player_kit_hair_woman:com_146 +2654 player_kit_hair_man:com_0 +2655 player_kit_hair_man:com_1 +2656 player_kit_hair_man:com_2 +2657 player_kit_hair_man:com_3 +2658 player_kit_hair_man:com_4 +2659 player_kit_hair_man:com_5 +2660 player_kit_hair_man:com_6 +2661 player_kit_hair_man:com_7 +2662 player_kit_hair_man:com_8 +2663 player_kit_hair_man:com_9 +2664 player_kit_hair_man:com_10 +2665 player_kit_hair_man:com_11 +2666 player_kit_hair_man:com_12 +2667 player_kit_hair_man:com_13 +2668 player_kit_hair_man:com_14 +2669 player_kit_hair_man:com_15 +2670 player_kit_hair_man:com_16 +2671 player_kit_hair_man:com_17 +2672 player_kit_hair_man:com_18 +2673 player_kit_hair_man:com_19 +2674 player_kit_hair_man:com_20 +2675 player_kit_hair_man:com_21 +2676 player_kit_hair_man:com_22 +2677 player_kit_hair_man:com_23 +2678 player_kit_hair_man:com_24 +2679 player_kit_hair_man:com_25 +2680 player_kit_hair_man:com_26 +2681 player_kit_hair_man:com_27 +2682 player_kit_hair_man:com_28 +2683 player_kit_hair_man:com_29 +2684 player_kit_hair_man:com_30 +2685 player_kit_hair_man:com_31 +2686 player_kit_hair_man:com_32 +2687 player_kit_hair_man:com_33 +2688 player_kit_hair_man:com_34 +2689 player_kit_hair_man:com_35 +2690 player_kit_hair_man:com_36 +2691 player_kit_hair_man:com_37 +2692 player_kit_hair_man:com_38 +2693 player_kit_hair_man:com_39 +2694 player_kit_hair_man:com_40 +2695 player_kit_hair_man:com_41 +2696 player_kit_hair_man:com_42 +2697 player_kit_hair_man:com_43 +2698 player_kit_hair_man:com_44 +2699 player_kit_hair_man:com_45 +2700 player_kit_hair_man:com_46 +2701 player_kit_hair_man:com_47 +2702 player_kit_hair_man:com_48 +2703 player_kit_hair_man:com_49 +2704 player_kit_hair_man:com_50 +2705 player_kit_hair_man:com_51 +2706 player_kit_hair_man:com_52 +2707 player_kit_hair_man:com_53 +2708 player_kit_hair_man:com_54 +2709 player_kit_hair_man:com_55 +2710 player_kit_hair_man:com_56 +2711 player_kit_hair_man:com_57 +2712 player_kit_hair_man:com_58 +2713 player_kit_hair_man:com_59 +2714 player_kit_hair_man:com_60 +2715 player_kit_hair_man:com_61 +2716 player_kit_hair_man:com_62 +2717 player_kit_hair_man:com_63 +2718 player_kit_hair_man:com_64 +2719 player_kit_hair_man:com_65 +2720 player_kit_hair_man:com_66 +2721 player_kit_hair_man:com_67 +2722 player_kit_hair_man:com_68 +2723 player_kit_hair_man:com_69 +2724 player_kit_hair_man:com_70 +2725 player_kit_hair_man:com_71 +2726 player_kit_hair_man:com_72 +2727 player_kit_hair_man:com_73 +2728 player_kit_hair_man:com_74 +2729 player_kit_hair_man:com_75 +2730 player_kit_hair_man:com_76 +2731 player_kit_hair_man:com_77 +2732 player_kit_hair_man:com_78 +2733 player_kit_hair_man:com_79 +2734 player_kit_hair_man:com_80 +2735 player_kit_hair_man:com_81 +2736 player_kit_hair_man:com_82 +2737 player_kit_hair_man:com_83 +2738 player_kit_hair_man:com_84 +2739 player_kit_hair_man:com_85 +2740 player_kit_hair_man:com_86 +2741 player_kit_hair_man:com_87 +2742 player_kit_hair_man:com_88 +2743 player_kit_hair_man:com_89 +2744 player_kit_hair_man:com_90 +2745 player_kit_hair_man:com_91 +2746 player_kit_hair_man:com_92 +2747 player_kit_hair_man:com_93 +2748 player_kit_hair_man:com_94 +2749 player_kit_hair_man:com_95 +2750 player_kit_hair_man:com_96 +2751 player_kit_hair_man:com_97 +2752 player_kit_hair_man:com_98 +2753 player_kit_hair_man:com_99 +2754 player_kit_hair_man:com_100 +2755 player_kit_hair_man:com_101 +2756 player_kit_hair_man:com_102 +2757 player_kit_hair_man:com_103 +2758 player_kit_hair_man:com_104 +2759 player_kit_hair_man:com_105 +2760 player_kit_hair_man:com_106 +2761 player_kit_hair_man:com_107 +2762 player_kit_hair_man:com_108 +2763 player_kit_hair_man:com_109 +2764 player_kit_hair_man:com_110 +2765 player_kit_hair_man:com_111 +2766 player_kit_hair_man:com_112 +2767 player_kit_hair_man:com_113 +2768 player_kit_hair_man:com_114 +2769 player_kit_hair_man:com_115 +2770 player_kit_hair_man:com_116 +2771 player_kit_hair_man:com_117 +2772 player_kit_hair_man:com_118 +2773 player_kit_hair_man:com_119 +2774 player_kit_hair_man:com_120 +2775 player_kit_hair_man:com_121 +2776 player_kit_hair_man:com_122 +2777 player_kit_hair_man:com_123 +2778 player_kit_hair_man:com_124 +2779 player_kit_hair_man:com_125 +2780 player_kit_hair_man:com_126 +2781 player_kit_hair_man:com_127 +2782 player_kit_hair_man:com_128 +2783 player_kit_hair_man:com_129 +2784 player_kit_hair_man:com_130 +2785 player_kit_hair_man:com_131 +2786 player_kit_hair_man:com_132 +2787 player_kit_hair_man:com_133 +2788 player_kit_hair_man:com_134 +2789 player_kit_hair_man:com_135 +2790 player_kit_hair_man:com_136 +2791 player_kit_hair_man:com_137 +2792 player_kit_hair_man:com_138 +2793 player_kit_hair_man:com_139 +2794 player_kit_hair_man:com_140 +2795 player_kit_hair_man:com_141 +2796 player_kit_hair_man:com_142 +2797 player_kit_hair_man:com_143 +2799 multiobj3_close:com_0 +2800 multiobj3_close:com_1 +2801 multiobj3_close:com_2 +2802 multiobj3_close:com_3 +2803 multiobj3_close:com_4 +2804 multiobj3_close:com_5 +2805 multiobj3_close:com_6 +2806 multiobj3_close:com_7 +2807 multiobj3_close:com_8 +2809 xplamp:com_0 +2810 xplamp:title +2811 xplamp:close +2812 xplamp:attack +2813 xplamp:strength +2814 xplamp:ranged +2815 xplamp:magic +2816 xplamp:defence +2817 xplamp:hitpoints +2818 xplamp:prayer +2819 xplamp:agility +2820 xplamp:herblore +2821 xplamp:thieving +2822 xplamp:crafting +2823 xplamp:runecraft +2824 xplamp:mining +2825 xplamp:smithing +2826 xplamp:fishing +2827 xplamp:cooking +2828 xplamp:firemaking +2829 xplamp:woodcutting +2830 xplamp:fletching +2831 xplamp:confirm +2832 xplamp:com_23 +2833 xplamp:com_24 +2834 xplamp:com_25 +2835 xplamp:com_26 +2836 xplamp:com_27 +2837 xplamp:com_28 +2838 xplamp:com_29 +2839 xplamp:com_30 +2840 xplamp:com_31 +2841 xplamp:com_32 +2842 xplamp:com_33 +2843 xplamp:com_34 +2844 xplamp:com_35 +2845 xplamp:com_36 +2846 xplamp:com_37 +2847 xplamp:com_38 +2848 xplamp:com_39 +2849 xplamp:com_40 +2850 xplamp:com_41 +2852 player_kit_tailor_torso_man:com_0 +2853 player_kit_tailor_torso_man:com_1 +2854 player_kit_tailor_torso_man:com_2 +2855 player_kit_tailor_torso_man:com_3 +2856 player_kit_tailor_torso_man:com_4 +2857 player_kit_tailor_torso_man:com_5 +2858 player_kit_tailor_torso_man:com_6 +2859 player_kit_tailor_torso_man:com_7 +2860 player_kit_tailor_torso_man:com_8 +2861 player_kit_tailor_torso_man:com_9 +2862 player_kit_tailor_torso_man:com_10 +2863 player_kit_tailor_torso_man:com_11 +2864 player_kit_tailor_torso_man:com_12 +2865 player_kit_tailor_torso_man:com_13 +2866 player_kit_tailor_torso_man:com_14 +2867 player_kit_tailor_torso_man:com_15 +2868 player_kit_tailor_torso_man:com_16 +2869 player_kit_tailor_torso_man:com_17 +2870 player_kit_tailor_torso_man:com_18 +2871 player_kit_tailor_torso_man:com_19 +2872 player_kit_tailor_torso_man:com_20 +2873 player_kit_tailor_torso_man:com_21 +2874 player_kit_tailor_torso_man:com_22 +2875 player_kit_tailor_torso_man:com_23 +2876 player_kit_tailor_torso_man:com_24 +2877 player_kit_tailor_torso_man:com_25 +2878 player_kit_tailor_torso_man:com_26 +2879 player_kit_tailor_torso_man:com_27 +2880 player_kit_tailor_torso_man:com_28 +2881 player_kit_tailor_torso_man:com_29 +2882 player_kit_tailor_torso_man:com_30 +2883 player_kit_tailor_torso_man:com_31 +2884 player_kit_tailor_torso_man:com_32 +2885 player_kit_tailor_torso_man:com_33 +2886 player_kit_tailor_torso_man:com_34 +2887 player_kit_tailor_torso_man:com_35 +2888 player_kit_tailor_torso_man:com_36 +2889 player_kit_tailor_torso_man:com_37 +2890 player_kit_tailor_torso_man:com_38 +2891 player_kit_tailor_torso_man:com_39 +2892 player_kit_tailor_torso_man:com_40 +2893 player_kit_tailor_torso_man:com_41 +2894 player_kit_tailor_torso_man:com_42 +2895 player_kit_tailor_torso_man:com_43 +2896 player_kit_tailor_torso_man:com_44 +2897 player_kit_tailor_torso_man:com_45 +2898 player_kit_tailor_torso_man:com_46 +2899 player_kit_tailor_torso_man:com_47 +2900 player_kit_tailor_torso_man:com_48 +2901 player_kit_tailor_torso_man:com_49 +2902 player_kit_tailor_torso_man:com_50 +2903 player_kit_tailor_torso_man:com_51 +2904 player_kit_tailor_torso_man:com_52 +2905 player_kit_tailor_torso_man:com_53 +2906 player_kit_tailor_torso_man:com_54 +2907 player_kit_tailor_torso_man:com_55 +2908 player_kit_tailor_torso_man:com_56 +2909 player_kit_tailor_torso_man:com_57 +2910 player_kit_tailor_torso_man:com_58 +2911 player_kit_tailor_torso_man:com_59 +2912 player_kit_tailor_torso_man:com_60 +2913 player_kit_tailor_torso_man:com_61 +2914 player_kit_tailor_torso_man:com_62 +2915 player_kit_tailor_torso_man:com_63 +2916 player_kit_tailor_torso_man:com_64 +2917 player_kit_tailor_torso_man:com_65 +2918 player_kit_tailor_torso_man:com_66 +2919 player_kit_tailor_torso_man:com_67 +2920 player_kit_tailor_torso_man:com_68 +2921 player_kit_tailor_torso_man:com_69 +2922 player_kit_tailor_torso_man:com_70 +2923 player_kit_tailor_torso_man:com_71 +2924 player_kit_tailor_torso_man:com_72 +2925 player_kit_tailor_torso_man:com_73 +2926 player_kit_tailor_torso_man:com_74 +2927 player_kit_tailor_torso_man:com_75 +2928 player_kit_tailor_torso_man:com_76 +2929 player_kit_tailor_torso_man:com_77 +2930 player_kit_tailor_torso_man:com_78 +2931 player_kit_tailor_torso_man:com_79 +2932 player_kit_tailor_torso_man:com_80 +2933 player_kit_tailor_torso_man:com_81 +2934 player_kit_tailor_torso_man:com_82 +2935 player_kit_tailor_torso_man:com_83 +2936 player_kit_tailor_torso_man:com_84 +2937 player_kit_tailor_torso_man:com_85 +2938 player_kit_tailor_torso_man:com_86 +2939 player_kit_tailor_torso_man:com_87 +2940 player_kit_tailor_torso_man:com_88 +2941 player_kit_tailor_torso_man:com_89 +2942 player_kit_tailor_torso_man:com_90 +2943 player_kit_tailor_torso_man:khaki +2944 player_kit_tailor_torso_man:black +2945 player_kit_tailor_torso_man:crimson +2946 player_kit_tailor_torso_man:navy +2947 player_kit_tailor_torso_man:straw +2948 player_kit_tailor_torso_man:white +2949 player_kit_tailor_torso_man:red +2950 player_kit_tailor_torso_man:blue +2951 player_kit_tailor_torso_man:green +2952 player_kit_tailor_torso_man:yellow +2953 player_kit_tailor_torso_man:purple +2954 player_kit_tailor_torso_man:orange +2955 player_kit_tailor_torso_man:rose +2956 player_kit_tailor_torso_man:lime +2957 player_kit_tailor_torso_man:cyan +2958 player_kit_tailor_torso_man:emerald +2959 player_kit_tailor_torso_man:confirm +2960 player_kit_tailor_torso_man:com_108 +2961 player_kit_tailor_torso_man:com_109 +2962 player_kit_tailor_torso_man:com_110 +2963 player_kit_tailor_torso_man:com_111 +2964 player_kit_tailor_torso_man:com_112 +2965 player_kit_tailor_torso_man:com_113 +2966 player_kit_tailor_torso_man:com_114 +2967 player_kit_tailor_torso_man:com_115 +2968 player_kit_tailor_torso_man:com_116 +2969 player_kit_tailor_torso_man:com_117 +2970 player_kit_tailor_torso_man:com_118 +2971 player_kit_tailor_torso_man:com_119 +2972 player_kit_tailor_torso_man:com_120 +2973 player_kit_tailor_torso_man:com_121 +2974 player_kit_tailor_torso_man:com_122 +2975 player_kit_tailor_torso_man:com_123 +2976 player_kit_tailor_torso_man:com_124 +2977 player_kit_tailor_torso_man:com_125 +2978 player_kit_tailor_torso_man:com_126 +2979 player_kit_tailor_torso_man:com_127 +2980 player_kit_tailor_torso_man:com_128 +2981 player_kit_tailor_torso_man:com_129 +2982 player_kit_tailor_torso_man:com_130 +2983 player_kit_tailor_torso_man:com_131 +2984 player_kit_tailor_torso_man:com_132 +2985 player_kit_tailor_torso_man:com_133 +2986 player_kit_tailor_torso_man:com_134 +2987 player_kit_tailor_torso_man:com_135 +2988 player_kit_tailor_torso_man:com_136 +2989 player_kit_tailor_torso_man:com_137 +2990 player_kit_tailor_torso_man:com_138 +2991 player_kit_tailor_torso_man:com_139 +2992 player_kit_tailor_torso_man:com_140 +2993 player_kit_tailor_torso_man:com_141 +2994 player_kit_tailor_torso_man:com_142 +2995 player_kit_tailor_torso_man:com_143 +2996 player_kit_tailor_torso_man:com_144 +2997 player_kit_tailor_torso_man:com_145 +2998 player_kit_tailor_torso_man:com_146 +2999 player_kit_tailor_torso_man:com_147 +3000 player_kit_tailor_torso_man:com_148 +3001 player_kit_tailor_torso_man:com_149 +3002 player_kit_tailor_torso_man:com_150 +3003 player_kit_tailor_torso_man:com_151 +3004 player_kit_tailor_torso_man:com_152 +3005 player_kit_tailor_torso_man:com_153 +3006 player_kit_tailor_torso_man:com_154 +3007 player_kit_tailor_torso_man:com_155 +3008 player_kit_tailor_torso_man:com_156 +3009 player_kit_tailor_torso_man:com_157 +3010 player_kit_tailor_torso_man:plain +3011 player_kit_tailor_torso_man:light_buttons +3012 player_kit_tailor_torso_man:jacket +3013 player_kit_tailor_torso_man:dark_buttons +3014 player_kit_tailor_torso_man:stitching +3015 player_kit_tailor_torso_man:shirt +3016 player_kit_tailor_torso_man:two_toned +3017 player_kit_tailor_torso_man:regular +3018 player_kit_tailor_torso_man:musclebound +3019 player_kit_tailor_torso_man:loose_sleeved +3020 player_kit_tailor_torso_man:large_cuffed +3021 player_kit_tailor_torso_man:thin_sleeved +3022 player_kit_tailor_torso_man:shoulder_pads +3024 stone:com_0 +3025 stone:com_1 +3026 stone:com_2 +3027 stone:com_3 +3028 stone:com_4 +3029 stone:com_5 +3030 stone:com_6 +3031 stone:com_7 +3032 stone:com_8 +3033 stone:com_9 +3034 stone:com_10 +3035 stone:com_11 +3036 stone:com_12 +3037 stone:com_13 +3039 player_kit_tailor_torso_woman:com_0 +3040 player_kit_tailor_torso_woman:com_1 +3041 player_kit_tailor_torso_woman:com_2 +3042 player_kit_tailor_torso_woman:com_3 +3043 player_kit_tailor_torso_woman:com_4 +3044 player_kit_tailor_torso_woman:com_5 +3045 player_kit_tailor_torso_woman:com_6 +3046 player_kit_tailor_torso_woman:com_7 +3047 player_kit_tailor_torso_woman:com_8 +3048 player_kit_tailor_torso_woman:com_9 +3049 player_kit_tailor_torso_woman:com_10 +3050 player_kit_tailor_torso_woman:com_11 +3051 player_kit_tailor_torso_woman:com_12 +3052 player_kit_tailor_torso_woman:com_13 +3053 player_kit_tailor_torso_woman:com_14 +3054 player_kit_tailor_torso_woman:com_15 +3055 player_kit_tailor_torso_woman:com_16 +3056 player_kit_tailor_torso_woman:com_17 +3057 player_kit_tailor_torso_woman:com_18 +3058 player_kit_tailor_torso_woman:com_19 +3059 player_kit_tailor_torso_woman:com_20 +3060 player_kit_tailor_torso_woman:com_21 +3061 player_kit_tailor_torso_woman:com_22 +3062 player_kit_tailor_torso_woman:com_23 +3063 player_kit_tailor_torso_woman:com_24 +3064 player_kit_tailor_torso_woman:com_25 +3065 player_kit_tailor_torso_woman:com_26 +3066 player_kit_tailor_torso_woman:com_27 +3067 player_kit_tailor_torso_woman:com_28 +3068 player_kit_tailor_torso_woman:com_29 +3069 player_kit_tailor_torso_woman:com_30 +3070 player_kit_tailor_torso_woman:com_31 +3071 player_kit_tailor_torso_woman:com_32 +3072 player_kit_tailor_torso_woman:com_33 +3073 player_kit_tailor_torso_woman:com_34 +3074 player_kit_tailor_torso_woman:com_35 +3075 player_kit_tailor_torso_woman:com_36 +3076 player_kit_tailor_torso_woman:com_37 +3077 player_kit_tailor_torso_woman:com_38 +3078 player_kit_tailor_torso_woman:com_39 +3079 player_kit_tailor_torso_woman:com_40 +3080 player_kit_tailor_torso_woman:com_41 +3081 player_kit_tailor_torso_woman:com_42 +3082 player_kit_tailor_torso_woman:com_43 +3083 player_kit_tailor_torso_woman:com_44 +3084 player_kit_tailor_torso_woman:com_45 +3085 player_kit_tailor_torso_woman:com_46 +3086 player_kit_tailor_torso_woman:com_47 +3087 player_kit_tailor_torso_woman:com_48 +3088 player_kit_tailor_torso_woman:com_49 +3089 player_kit_tailor_torso_woman:com_50 +3090 player_kit_tailor_torso_woman:com_51 +3091 player_kit_tailor_torso_woman:com_52 +3092 player_kit_tailor_torso_woman:com_53 +3093 player_kit_tailor_torso_woman:com_54 +3094 player_kit_tailor_torso_woman:com_55 +3095 player_kit_tailor_torso_woman:com_56 +3096 player_kit_tailor_torso_woman:com_57 +3097 player_kit_tailor_torso_woman:com_58 +3098 player_kit_tailor_torso_woman:com_59 +3099 player_kit_tailor_torso_woman:com_60 +3100 player_kit_tailor_torso_woman:com_61 +3101 player_kit_tailor_torso_woman:com_62 +3102 player_kit_tailor_torso_woman:com_63 +3103 player_kit_tailor_torso_woman:com_64 +3104 player_kit_tailor_torso_woman:com_65 +3105 player_kit_tailor_torso_woman:com_66 +3106 player_kit_tailor_torso_woman:com_67 +3107 player_kit_tailor_torso_woman:com_68 +3108 player_kit_tailor_torso_woman:com_69 +3109 player_kit_tailor_torso_woman:com_70 +3110 player_kit_tailor_torso_woman:com_71 +3111 player_kit_tailor_torso_woman:com_72 +3112 player_kit_tailor_torso_woman:com_73 +3113 player_kit_tailor_torso_woman:com_74 +3114 player_kit_tailor_torso_woman:com_75 +3115 player_kit_tailor_torso_woman:com_76 +3116 player_kit_tailor_torso_woman:com_77 +3117 player_kit_tailor_torso_woman:com_78 +3118 player_kit_tailor_torso_woman:com_79 +3119 player_kit_tailor_torso_woman:com_80 +3120 player_kit_tailor_torso_woman:com_81 +3121 player_kit_tailor_torso_woman:com_82 +3122 player_kit_tailor_torso_woman:com_83 +3123 player_kit_tailor_torso_woman:com_84 +3124 player_kit_tailor_torso_woman:com_85 +3125 player_kit_tailor_torso_woman:com_86 +3126 player_kit_tailor_torso_woman:com_87 +3127 player_kit_tailor_torso_woman:com_88 +3128 player_kit_tailor_torso_woman:com_89 +3129 player_kit_tailor_torso_woman:com_90 +3130 player_kit_tailor_torso_woman:com_91 +3131 player_kit_tailor_torso_woman:com_92 +3132 player_kit_tailor_torso_woman:com_93 +3133 player_kit_tailor_torso_woman:com_94 +3134 player_kit_tailor_torso_woman:com_95 +3135 player_kit_tailor_torso_woman:com_96 +3136 player_kit_tailor_torso_woman:com_97 +3137 player_kit_tailor_torso_woman:com_98 +3138 player_kit_tailor_torso_woman:com_99 +3139 player_kit_tailor_torso_woman:com_100 +3140 player_kit_tailor_torso_woman:com_101 +3141 player_kit_tailor_torso_woman:com_102 +3142 player_kit_tailor_torso_woman:com_103 +3143 player_kit_tailor_torso_woman:com_104 +3144 player_kit_tailor_torso_woman:com_105 +3145 player_kit_tailor_torso_woman:com_106 +3146 player_kit_tailor_torso_woman:confirm +3147 player_kit_tailor_torso_woman:com_108 +3148 player_kit_tailor_torso_woman:com_109 +3149 player_kit_tailor_torso_woman:com_110 +3150 player_kit_tailor_torso_woman:com_111 +3151 player_kit_tailor_torso_woman:com_112 +3152 player_kit_tailor_torso_woman:com_113 +3153 player_kit_tailor_torso_woman:com_114 +3154 player_kit_tailor_torso_woman:com_115 +3155 player_kit_tailor_torso_woman:com_116 +3156 player_kit_tailor_torso_woman:com_117 +3157 player_kit_tailor_torso_woman:com_118 +3158 player_kit_tailor_torso_woman:com_119 +3159 player_kit_tailor_torso_woman:com_120 +3160 player_kit_tailor_torso_woman:com_121 +3161 player_kit_tailor_torso_woman:com_122 +3162 player_kit_tailor_torso_woman:com_123 +3163 player_kit_tailor_torso_woman:com_124 +3164 player_kit_tailor_torso_woman:com_125 +3165 player_kit_tailor_torso_woman:com_126 +3166 player_kit_tailor_torso_woman:com_127 +3167 player_kit_tailor_torso_woman:com_128 +3168 player_kit_tailor_torso_woman:com_129 +3169 player_kit_tailor_torso_woman:com_130 +3170 player_kit_tailor_torso_woman:com_131 +3171 player_kit_tailor_torso_woman:com_132 +3172 player_kit_tailor_torso_woman:com_133 +3173 player_kit_tailor_torso_woman:com_134 +3174 player_kit_tailor_torso_woman:com_135 +3175 player_kit_tailor_torso_woman:com_136 +3176 player_kit_tailor_torso_woman:com_137 +3177 player_kit_tailor_torso_woman:com_138 +3178 player_kit_tailor_torso_woman:com_139 +3179 player_kit_tailor_torso_woman:com_140 +3180 player_kit_tailor_torso_woman:com_141 +3181 player_kit_tailor_torso_woman:com_142 +3182 player_kit_tailor_torso_woman:com_143 +3183 player_kit_tailor_torso_woman:com_144 +3184 player_kit_tailor_torso_woman:com_145 +3185 player_kit_tailor_torso_woman:com_146 +3186 player_kit_tailor_torso_woman:plain +3187 player_kit_tailor_torso_woman:crop_top +3188 player_kit_tailor_torso_woman:polo_neck +3189 player_kit_tailor_torso_woman:simple +3190 player_kit_tailor_torso_woman:torn +3191 player_kit_tailor_torso_woman:short_sleeves +3192 player_kit_tailor_torso_woman:bare_arms +3193 player_kit_tailor_torso_woman:muscley +3194 player_kit_tailor_torso_woman:long_sleeved +3195 player_kit_tailor_torso_woman:large_cuffs +3196 music:com_189 +3197 music:com_190 +3198 music:com_191 +3199 music:com_192 +3200 music:com_193 +3201 music:com_194 +3202 music:com_195 +3203 music:com_196 +3204 music:com_197 +3205 music:com_198 +3206 music:com_1 +3207 music:com_199 +3209 misthalin_map:com_0 +3210 misthalin_map:com_1 +3211 misthalin_map:com_2 +3212 misthalin_map:com_3 +3214 inventory:inv +3216 book4:com_0 +3217 book4:com_1 +3218 book4:com_3 +3219 book4:com_2 +3220 book4:com_4 +3221 book4:com_5 +3222 book4:com_6 +3223 book4:com_7 +3224 book4:com_8 +3225 book4:com_9 +3226 book4:com_10 +3227 book4:com_11 +3228 book4:com_12 +3229 book4:com_13 +3230 book4:com_14 +3231 book4:com_15 +3232 book4:com_16 +3233 book4:com_17 +3234 book4:com_18 +3235 book4:com_19 +3236 book4:com_20 +3237 book4:com_21 +3238 book4:com_22 +3239 book4:com_23 +3240 book4:com_24 +3241 book4:com_25 +3242 book4:com_26 +3243 book4:com_27 +3244 book4:com_28 +3245 book4:com_29 +3246 book4:com_30 +3247 book4:com_31 +3248 book4:com_32 +3249 book4:com_33 +3250 book4:com_34 +3251 book4:com_35 +3252 book4:com_36 +3253 book4:com_37 +3254 book4:com_38 +3255 book4:com_39 +3256 book4:com_40 +3257 book4:com_41 +3258 book4:com_42 +3259 book4:com_43 +3260 book4:com_44 +3261 book4:com_45 +3262 book4:com_46 +3263 book4:com_47 +3264 book4:com_48 +3265 book4:com_49 +3266 book4:com_50 +3267 book4:com_51 +3268 book4:com_52 +3269 book4:com_53 +3270 book4:com_54 +3271 book4:com_55 +3272 book4:com_56 +3273 book4:com_57 +3274 book4:com_58 +3275 book4:com_59 +3276 book4:com_60 +3277 book4:com_61 +3278 book4:com_62 +3279 book4:com_63 +3280 book4:com_64 +3282 ship_journey:com_0 +3283 ship_journey:com_1 +3284 ship_journey:com_2 +3285 ship_journey:com_3 +3286 ship_journey:com_4 +3287 ship_journey:com_5 +3288 ship_journey:com_6 +3289 ship_journey:com_7 +3290 ship_journey:com_8 +3291 ship_journey:com_9 +3292 ship_journey:com_10 +3293 ship_journey:com_11 +3294 ship_journey:com_12 +3295 ship_journey:com_13 +3296 ship_journey:com_14 +3297 ship_journey:com_15 +3298 ship_journey:com_16 +3299 ship_journey:com_17 +3300 ship_journey:com_18 +3301 ship_journey:com_19 +3302 ship_journey:com_20 +3303 ship_journey:com_21 +3304 ship_journey:com_22 +3305 ship_journey:com_23 +3306 ship_journey:com_24 +3307 ship_journey:com_25 +3308 ship_journey:com_26 +3309 ship_journey:com_27 +3310 ship_journey:com_28 +3311 ship_journey:com_29 +3312 ship_journey:com_30 +3313 ship_journey:com_31 +3314 ship_journey:com_32 +3315 ship_journey:com_33 +3316 ship_journey:com_34 +3317 ship_journey:com_35 +3318 ship_journey:com_36 +3319 ship_journey:com_37 +3320 ship_journey:com_38 +3322 tradeside:inv +3324 trademain:com_0 +3325 trademain:com_1 +3326 trademain:com_2 +3327 trademain:com_3 +3328 trademain:com_4 +3329 trademain:com_5 +3330 trademain:com_6 +3331 trademain:com_7 +3332 trademain:com_8 +3333 trademain:com_9 +3334 trademain:com_10 +3335 trademain:com_11 +3336 trademain:com_12 +3337 trademain:com_13 +3338 trademain:com_14 +3339 trademain:com_15 +3340 trademain:com_16 +3341 trademain:com_17 +3342 trademain:com_18 +3343 trademain:com_19 +3344 trademain:com_20 +3345 trademain:com_21 +3346 trademain:com_22 +3347 trademain:com_23 +3348 trademain:com_24 +3349 trademain:com_25 +3350 trademain:com_26 +3351 trademain:com_27 +3352 trademain:com_28 +3353 trademain:com_29 +3354 trademain:com_30 +3355 trademain:com_31 +3356 trademain:com_32 +3357 trademain:com_33 +3358 trademain:com_34 +3359 trademain:com_35 +3360 trademain:com_36 +3361 trademain:com_37 +3362 trademain:com_38 +3363 trademain:com_39 +3364 trademain:com_40 +3365 trademain:com_41 +3366 trademain:com_42 +3367 trademain:com_43 +3368 trademain:com_44 +3369 trademain:com_45 +3370 trademain:com_46 +3371 trademain:com_47 +3372 trademain:com_48 +3373 trademain:com_49 +3374 trademain:com_50 +3375 trademain:com_51 +3376 trademain:com_52 +3377 trademain:com_53 +3378 trademain:com_54 +3379 trademain:com_55 +3380 trademain:com_56 +3381 trademain:com_57 +3382 trademain:com_58 +3383 trademain:com_59 +3384 trademain:com_60 +3385 trademain:com_61 +3386 trademain:com_62 +3387 trademain:com_63 +3388 trademain:com_64 +3389 trademain:com_65 +3390 trademain:com_66 +3391 trademain:com_67 +3392 trademain:com_68 +3393 trademain:com_69 +3394 trademain:com_70 +3395 trademain:com_71 +3396 trademain:com_72 +3397 trademain:com_73 +3398 trademain:com_74 +3399 trademain:com_75 +3400 trademain:com_76 +3401 trademain:com_77 +3402 trademain:com_78 +3403 trademain:com_79 +3404 trademain:com_80 +3405 trademain:com_81 +3406 trademain:com_82 +3407 trademain:com_83 +3408 trademain:com_84 +3409 trademain:com_85 +3410 trademain:com_86 +3411 trademain:com_87 +3412 trademain:com_88 +3413 trademain:com_96 +3414 trademain:com_98 +3415 trademain:inv +3416 trademain:otherinv +3417 trademain:otherplayer +3418 trademain:com_101 +3419 trademain:com_102 +3420 trademain:accept +3421 trademain:com_104 +3422 trademain:decline +3423 trademain:com_106 +3424 trademain:com_89 +3425 trademain:com_90 +3426 trademain:com_91 +3427 trademain:com_107 +3428 trademain:com_92 +3429 trademain:com_93 +3430 trademain:com_108 +3431 trademain:status +3432 trademain:com_94 +3433 trademain:com_110 +3434 trademain:com_111 +3435 trademain:com_112 +3436 trademain:com_113 +3437 trademain:com_114 +3438 trademain:com_115 +3439 trademain:com_116 +3440 trademain:com_95 +3441 trademain:com_117 +3442 trademain:close +3444 tradeconfirm:com_0 +3445 tradeconfirm:com_1 +3446 tradeconfirm:com_2 +3447 tradeconfirm:com_3 +3448 tradeconfirm:com_4 +3449 tradeconfirm:com_5 +3450 tradeconfirm:com_6 +3451 tradeconfirm:com_7 +3452 tradeconfirm:com_8 +3453 tradeconfirm:com_9 +3454 tradeconfirm:com_10 +3455 tradeconfirm:com_11 +3456 tradeconfirm:com_12 +3457 tradeconfirm:com_13 +3458 tradeconfirm:com_14 +3459 tradeconfirm:com_15 +3460 tradeconfirm:com_16 +3461 tradeconfirm:com_17 +3462 tradeconfirm:com_18 +3463 tradeconfirm:com_19 +3464 tradeconfirm:com_20 +3465 tradeconfirm:com_21 +3466 tradeconfirm:com_22 +3467 tradeconfirm:com_23 +3468 tradeconfirm:com_24 +3469 tradeconfirm:com_25 +3470 tradeconfirm:com_26 +3471 tradeconfirm:com_27 +3472 tradeconfirm:com_28 +3473 tradeconfirm:com_29 +3474 tradeconfirm:com_30 +3475 tradeconfirm:com_31 +3476 tradeconfirm:com_32 +3477 tradeconfirm:com_33 +3478 tradeconfirm:com_34 +3479 tradeconfirm:com_35 +3480 tradeconfirm:com_36 +3481 tradeconfirm:com_37 +3482 tradeconfirm:com_38 +3483 tradeconfirm:com_39 +3484 tradeconfirm:com_40 +3485 tradeconfirm:com_41 +3486 tradeconfirm:com_42 +3487 tradeconfirm:com_43 +3488 tradeconfirm:com_44 +3489 tradeconfirm:com_45 +3490 tradeconfirm:com_46 +3491 tradeconfirm:com_47 +3492 tradeconfirm:com_48 +3493 tradeconfirm:com_49 +3494 tradeconfirm:com_50 +3495 tradeconfirm:com_51 +3496 tradeconfirm:com_52 +3497 tradeconfirm:com_53 +3498 tradeconfirm:com_54 +3499 tradeconfirm:com_55 +3500 tradeconfirm:com_56 +3501 tradeconfirm:com_57 +3502 tradeconfirm:com_58 +3503 tradeconfirm:com_59 +3504 tradeconfirm:com_60 +3505 tradeconfirm:com_61 +3506 tradeconfirm:com_62 +3507 tradeconfirm:com_63 +3508 tradeconfirm:com_64 +3509 tradeconfirm:com_65 +3510 tradeconfirm:com_66 +3511 tradeconfirm:com_67 +3512 tradeconfirm:com_68 +3513 tradeconfirm:com_69 +3514 tradeconfirm:com_70 +3515 tradeconfirm:com_71 +3516 tradeconfirm:com_72 +3517 tradeconfirm:com_73 +3518 tradeconfirm:com_74 +3519 tradeconfirm:com_75 +3520 tradeconfirm:com_76 +3521 tradeconfirm:com_77 +3522 tradeconfirm:com_78 +3523 tradeconfirm:com_79 +3524 tradeconfirm:com_80 +3525 tradeconfirm:com_81 +3526 tradeconfirm:com_82 +3527 tradeconfirm:com_83 +3528 tradeconfirm:com_84 +3529 tradeconfirm:com_85 +3530 tradeconfirm:com_86 +3531 tradeconfirm:com_87 +3532 tradeconfirm:otherinv1 +3533 tradeconfirm:com_89 +3534 tradeconfirm:com_90 +3535 tradeconfirm:com_91 +3536 tradeconfirm:com_92 +3537 tradeconfirm:com_93 +3538 tradeconfirm:inv2 +3539 tradeconfirm:otherinv2 +3540 tradeconfirm:com_96 +3541 tradeconfirm:com_97 +3542 tradeconfirm:inv1 +3543 tradeconfirm:com_99 +3544 tradeconfirm:com_100 +3545 tradeconfirm:com_101 +3546 tradeconfirm:accept +3547 tradeconfirm:com_103 +3548 tradeconfirm:decline +3549 tradeconfirm:com_105 +3550 tradeconfirm:com_106 +3551 tradeconfirm:com_107 +3552 tradeconfirm:com_108 +3553 tradeconfirm:com_109 +3554 tradeconfirm:com_110 +3555 tradeconfirm:com_111 +3556 tradeconfirm:com_112 +3557 tradeconfirm:inv_nothing +3558 tradeconfirm:otherinv_nothing +3560 player_kit:com_0 +3561 player_kit:com_1 +3562 player_kit:com_2 +3563 player_kit:com_3 +3564 player_kit:com_4 +3565 player_kit:com_5 +3566 player_kit:com_6 +3567 player_kit:com_7 +3568 player_kit:com_8 +3569 player_kit:com_9 +3570 player_kit:com_10 +3571 player_kit:com_11 +3572 player_kit:com_12 +3573 player_kit:com_13 +3574 player_kit:com_14 +3575 player_kit:com_15 +3576 player_kit:com_16 +3577 player_kit:com_17 +3578 player_kit:com_18 +3579 player_kit:com_19 +3580 player_kit:com_20 +3581 player_kit:com_21 +3582 player_kit:com_22 +3583 player_kit:com_23 +3584 player_kit:com_24 +3585 player_kit:com_25 +3586 player_kit:com_26 +3587 player_kit:com_27 +3588 player_kit:com_28 +3589 player_kit:com_29 +3590 player_kit:com_30 +3591 player_kit:com_31 +3592 player_kit:com_32 +3593 player_kit:com_33 +3594 player_kit:com_34 +3595 player_kit:com_35 +3596 player_kit:com_36 +3597 player_kit:com_37 +3598 player_kit:com_38 +3599 player_kit:com_39 +3600 player_kit:com_40 +3601 player_kit:com_41 +3602 player_kit:com_42 +3603 player_kit:com_43 +3604 player_kit:com_44 +3605 player_kit:com_45 +3606 player_kit:com_46 +3607 player_kit:com_47 +3608 player_kit:com_48 +3609 player_kit:com_49 +3610 player_kit:com_50 +3611 player_kit:com_51 +3612 player_kit:com_52 +3613 player_kit:com_53 +3614 player_kit:com_54 +3615 player_kit:com_55 +3616 player_kit:com_56 +3617 player_kit:com_57 +3618 player_kit:com_58 +3619 player_kit:com_59 +3620 player_kit:com_60 +3621 player_kit:com_61 +3622 player_kit:com_62 +3623 player_kit:com_63 +3624 player_kit:com_64 +3625 player_kit:com_65 +3626 player_kit:com_66 +3627 player_kit:com_67 +3628 player_kit:com_68 +3629 player_kit:com_69 +3630 player_kit:com_70 +3631 player_kit:com_71 +3632 player_kit:com_72 +3633 player_kit:com_73 +3634 player_kit:com_74 +3635 player_kit:com_75 +3636 player_kit:com_76 +3637 player_kit:com_77 +3638 player_kit:com_78 +3639 player_kit:com_79 +3640 player_kit:com_80 +3641 player_kit:com_81 +3642 player_kit:com_82 +3643 player_kit:com_83 +3644 player_kit:com_84 +3645 player_kit:com_85 +3646 player_kit:com_86 +3647 player_kit:com_87 +3648 player_kit:com_88 +3649 player_kit:com_89 +3650 player_kit:com_90 +3651 player_kit:accept +3652 player_kit:com_92 +3653 player_kit:com_93 +3654 player_kit:com_94 +3655 player_kit:com_95 +3656 player_kit:com_96 +3657 player_kit:com_97 +3658 player_kit:com_98 +3659 player_kit:com_99 +3660 player_kit:com_100 +3661 player_kit:com_101 +3662 player_kit:com_102 +3663 player_kit:com_103 +3664 player_kit:com_104 +3665 player_kit:com_105 +3666 player_kit:com_106 +3667 player_kit:com_107 +3668 player_kit:com_108 +3669 player_kit:com_109 +3670 player_kit:com_110 +3671 player_kit:com_111 +3672 player_kit:com_112 +3673 player_kit:com_113 +3674 player_kit:com_114 +3675 player_kit:com_115 +3676 player_kit:com_116 +3677 player_kit:com_117 +3678 player_kit:com_118 +3679 player_kit:com_119 +3680 player_kit:com_120 +3681 player_kit:com_121 +3682 player_kit:com_122 +3683 player_kit:com_123 +3684 player_kit:com_124 +3685 player_kit:com_125 +3686 player_kit:com_126 +3687 player_kit:com_127 +3688 player_kit:com_128 +3689 player_kit:com_129 +3690 player_kit:com_130 +3691 player_kit:com_131 +3692 player_kit:com_132 +3693 player_kit:com_133 +3694 player_kit:com_134 +3695 player_kit:com_135 +3696 player_kit:com_136 +3697 player_kit:com_137 +3698 player_kit:com_138 +3699 player_kit:com_139 +3700 player_kit:com_140 +3701 player_kit:com_141 +3703 telescope:com_0 +3704 telescope:com_1 +3705 telescope:com_2 +3706 telescope:com_3 +3707 telescope:com_4 +3708 telescope:com_5 +3709 telescope:com_6 +3710 telescope:com_7 +3711 telescope:com_8 +3712 telescope:com_9 +3713 telescope:com_10 +3714 telescope:com_11 +3715 telescope:com_12 +3716 telescope:com_13 +3717 telescope:com_14 +3718 telescope:com_15 +3719 telescope:com_16 +3720 telescope:com_17 +3721 telescope:com_18 +3722 telescope:com_19 +3723 telescope:com_20 +3724 telescope:com_21 +3725 telescope:com_22 +3726 telescope:com_23 +3727 telescope:com_24 +3728 telescope:com_25 +3729 telescope:com_26 +3730 telescope:com_27 +3731 telescope:com_28 +3732 telescope:com_29 +3733 telescope:com_30 +3734 telescope:com_31 +3735 telescope:com_32 +3736 telescope:com_33 +3737 telescope:com_34 +3738 telescope:com_35 +3739 telescope:com_36 +3740 telescope:com_37 +3741 telescope:com_38 +3742 telescope:com_39 +3743 telescope:com_40 +3744 telescope:com_41 +3745 telescope:com_42 +3746 telescope:com_43 +3747 telescope:com_44 +3748 telescope:com_45 +3749 telescope:com_46 +3750 telescope:com_47 +3751 telescope:com_48 +3752 telescope:com_49 +3753 telescope:com_50 +3754 telescope:com_51 +3755 telescope:com_52 +3756 telescope:com_53 +3757 telescope:com_54 +3758 telescope:com_55 +3759 telescope:com_56 +3760 telescope:com_57 +3761 telescope:com_58 +3762 telescope:com_59 +3763 telescope:com_60 +3764 telescope:com_61 +3765 telescope:com_62 +3766 telescope:com_63 +3767 telescope:com_64 +3768 telescope:com_65 +3769 telescope:com_66 +3770 telescope:com_67 +3771 telescope:com_68 +3772 telescope:com_69 +3773 telescope:com_70 +3774 telescope:com_71 +3775 telescope:com_72 +3776 telescope:com_73 +3777 telescope:com_74 +3778 telescope:com_75 +3779 telescope:com_76 +3780 telescope:com_77 +3781 telescope:com_78 +3782 telescope:com_79 +3783 telescope:com_80 +3784 telescope:com_81 +3785 telescope:com_82 +3786 telescope:com_83 +3787 telescope:com_84 +3788 telescope:com_85 +3789 telescope:com_86 +3790 telescope:com_87 +3791 telescope:com_88 +3792 telescope:com_89 +3793 telescope:com_90 +3794 telescope:com_91 +3795 telescope:com_92 +3797 combat_spiked:preview +3798 combat_spiked:com_1 +3799 combat_spiked:name +3800 combat_spiked:com_3 +3801 combat_spiked:spiked101 +3802 combat_spiked:spiked0 +3803 combat_spiked:spiked3 +3804 combat_spiked:spiked2 +3805 combat_spiked:spiked1 +3806 combat_spiked:com_9 +3807 combat_spiked:com_10 +3808 combat_spiked:com_11 +3809 combat_spiked:com_12 +3810 combat_spiked:com_13 +3811 combat_spiked:com_14 +3812 combat_spiked:com_15 +3813 combat_spiked:com_16 +3814 combat_spiked:com_17 +3815 combat_spiked:com_18 +3816 combat_spiked:com_19 +3817 combat_spiked:com_20 +3818 combat_spiked:com_21 +3819 combat_spiked:com_22 +3820 combat_spiked:com_23 +3821 combat_spiked:com_24 +3823 shop_template_side:inv +3825 shop_template:com_0 +3826 shop_template:com_1 +3827 shop_template:com_2 +3828 shop_template:com_3 +3829 shop_template:com_4 +3830 shop_template:com_5 +3831 shop_template:com_6 +3832 shop_template:com_7 +3833 shop_template:com_8 +3834 shop_template:com_9 +3835 shop_template:com_10 +3836 shop_template:com_11 +3837 shop_template:com_12 +3838 shop_template:com_13 +3839 shop_template:com_14 +3840 shop_template:com_15 +3841 shop_template:com_16 +3842 shop_template:com_17 +3843 shop_template:com_18 +3844 shop_template:com_19 +3845 shop_template:com_20 +3846 shop_template:com_21 +3847 shop_template:com_22 +3848 shop_template:com_23 +3849 shop_template:com_24 +3850 shop_template:com_25 +3851 shop_template:com_26 +3852 shop_template:com_27 +3853 shop_template:com_28 +3854 shop_template:com_29 +3855 shop_template:com_30 +3856 shop_template:com_31 +3857 shop_template:com_32 +3858 shop_template:com_33 +3859 shop_template:com_34 +3860 shop_template:com_35 +3861 shop_template:com_36 +3862 shop_template:com_37 +3863 shop_template:com_38 +3864 shop_template:com_39 +3865 shop_template:com_40 +3866 shop_template:com_41 +3867 shop_template:com_42 +3868 shop_template:com_43 +3869 shop_template:com_44 +3870 shop_template:com_45 +3871 shop_template:com_46 +3872 shop_template:com_47 +3873 shop_template:com_48 +3874 shop_template:com_49 +3875 shop_template:com_50 +3876 shop_template:com_51 +3877 shop_template:com_52 +3878 shop_template:com_53 +3879 shop_template:com_54 +3880 shop_template:com_55 +3881 shop_template:com_56 +3882 shop_template:com_57 +3883 shop_template:com_58 +3884 shop_template:com_59 +3885 shop_template:com_60 +3886 shop_template:com_61 +3887 shop_template:com_62 +3888 shop_template:com_63 +3889 shop_template:com_64 +3890 shop_template:com_65 +3891 shop_template:com_66 +3892 shop_template:com_67 +3893 shop_template:com_68 +3894 shop_template:com_69 +3895 shop_template:com_70 +3896 shop_template:com_71 +3897 shop_template:com_72 +3898 shop_template:com_73 +3899 shop_template:com_74 +3900 shop_template:inv +3901 shop_template:com_76 +3902 shop_template:com_77 +3903 shop_template:com_78 +3904 shop_template:com_79 +3905 shop_template:com_80 +3906 shop_template:com_81 +3907 shop_template:com_82 +3908 shop_template:com_83 +3909 shop_template:com_84 +3910 shop_template:com_85 +3911 shop_template:com_86 +3912 shop_template:com_87 +3913 shop_template:com_88 +3914 shop_template:com_89 +3915 shop_template:com_90 +3916 shop_template:com_91 +3918 stats:com_0 +3919 stats:com_1 +3920 stats:com_2 +3921 stats:com_3 +3922 stats:com_4 +3923 stats:com_5 +3924 stats:com_6 +3925 stats:com_16 +3926 stats:com_17 +3927 stats:com_18 +3928 stats:com_19 +3929 stats:com_20 +3930 stats:com_21 +3931 stats:com_22 +3932 stats:com_32 +3933 stats:com_33 +3934 stats:com_34 +3935 stats:com_35 +3936 stats:com_36 +3937 stats:com_37 +3938 stats:com_38 +3939 stats:com_47 +3940 stats:com_48 +3941 stats:com_49 +3942 stats:com_50 +3943 stats:com_51 +3944 stats:com_52 +3945 stats:com_53 +3946 stats:com_63 +3947 stats:com_64 +3948 stats:com_65 +3949 stats:com_66 +3950 stats:com_67 +3951 stats:com_68 +3952 stats:com_69 +3953 stats:com_79 +3954 stats:com_80 +3955 stats:com_81 +3956 stats:com_82 +3957 stats:com_83 +3958 stats:com_84 +3959 stats:com_85 +3960 stats:com_98 +3961 stats:com_99 +3962 stats:com_100 +3963 stats:com_101 +3964 stats:com_102 +3965 stats:com_7 +3966 stats:com_8 +3967 stats:com_9 +3968 stats:com_23 +3969 stats:com_24 +3970 stats:com_25 +3971 stats:com_39 +3972 stats:com_106 +3973 stats:com_40 +3974 stats:com_54 +3975 stats:com_55 +3976 stats:com_56 +3977 stats:com_70 +3978 stats:com_71 +3979 stats:com_72 +3980 stats:com_86 +3981 stats:com_87 +3982 stats:com_88 +3983 stats:com_103 +3984 stats:com_104 +3985 stats:com_105 +3986 stats:com_107 +3987 stats:com_108 +3988 stats:com_109 +3989 stats:com_110 +3990 stats:com_111 +3991 stats:com_112 +3992 stats:com_113 +3993 stats:com_114 +3994 stats:com_115 +3995 stats:com_116 +3996 stats:com_117 +3997 stats:com_118 +3998 stats:com_119 +3999 stats:com_120 +4000 stats:com_121 +4001 stats:com_89 +4002 stats:com_90 +4003 stats:com_91 +4004 stats:com_10 +4005 stats:com_11 +4006 stats:com_26 +4007 stats:com_27 +4008 stats:com_41 +4009 stats:com_42 +4010 stats:com_57 +4011 stats:com_58 +4012 stats:com_73 +4013 stats:com_74 +4014 stats:com_92 +4015 stats:com_93 +4016 stats:com_12 +4017 stats:com_13 +4018 stats:com_28 +4019 stats:com_29 +4020 stats:com_43 +4021 stats:com_44 +4022 stats:com_59 +4023 stats:com_60 +4024 stats:com_75 +4025 stats:com_76 +4026 stats:com_94 +4027 stats:com_95 +4028 stats:com_14 +4029 stats:com_15 +4030 stats:com_30 +4031 stats:com_31 +4032 stats:com_45 +4033 stats:com_46 +4034 stats:com_61 +4035 stats:com_62 +4036 stats:com_77 +4037 stats:com_78 +4038 stats:com_96 +4039 stats:com_97 +4040 stats:com_122 +4041 stats:com_123 +4042 stats:com_124 +4043 stats:com_125 +4044 stats:com_126 +4045 stats:com_127 +4046 stats:com_128 +4047 stats:com_129 +4048 stats:com_130 +4049 stats:com_131 +4050 stats:com_132 +4051 stats:com_133 +4052 stats:com_134 +4053 stats:com_135 +4054 stats:com_136 +4055 stats:com_137 +4056 stats:com_138 +4057 stats:com_139 +4058 stats:com_140 +4059 stats:com_141 +4060 stats:com_142 +4061 stats:com_143 +4062 stats:com_144 +4063 stats:com_145 +4064 stats:com_146 +4065 stats:com_147 +4066 stats:com_148 +4067 stats:com_149 +4068 stats:com_150 +4069 stats:com_151 +4070 stats:com_152 +4071 stats:com_153 +4072 stats:com_154 +4073 stats:com_155 +4074 stats:com_156 +4075 stats:com_157 +4076 stats:com_158 +4077 stats:com_159 +4078 stats:com_160 +4079 stats:com_161 +4080 stats:com_162 +4081 stats:com_163 +4082 stats:com_164 +4083 stats:com_165 +4084 stats:com_166 +4085 stats:com_167 +4086 stats:com_168 +4087 stats:com_169 +4088 stats:com_170 +4089 stats:com_171 +4090 stats:com_172 +4091 stats:com_173 +4092 stats:com_174 +4093 stats:com_175 +4094 stats:com_176 +4095 stats:com_177 +4096 stats:com_178 +4097 stats:com_179 +4098 stats:com_180 +4099 stats:com_181 +4100 stats:com_182 +4101 stats:com_183 +4102 stats:com_184 +4103 stats:com_185 +4104 stats:com_186 +4105 stats:com_187 +4106 stats:com_188 +4107 stats:com_189 +4108 stats:com_190 +4109 stats:com_191 +4110 stats:com_192 +4111 stats:com_193 +4112 stats:com_194 +4113 stats:com_195 +4114 stats:com_196 +4115 stats:com_197 +4116 stats:com_198 +4117 stats:com_199 +4118 stats:com_200 +4119 stats:com_201 +4120 stats:com_202 +4121 stats:com_203 +4122 stats:com_204 +4123 stats:com_205 +4124 stats:com_206 +4125 stats:com_207 +4126 stats:com_208 +4127 stats:com_209 +4128 stats:com_210 +4129 stats:com_211 +4130 stats:com_212 +4131 stats:com_213 +4132 stats:com_214 +4133 stats:com_215 +4134 stats:com_216 +4135 stats:com_217 +4136 stats:com_218 +4137 stats:com_219 +4138 stats:com_220 +4139 stats:com_221 +4140 stats:com_222 +4141 stats:com_223 +4142 stats:com_224 +4143 stats:com_225 +4144 stats:com_226 +4145 stats:com_227 +4146 stats:com_228 +4147 stats:com_229 +4148 stats:com_230 +4149 stats:com_231 +4150 stats:com_232 +4151 stats:com_233 +4152 stats:com_234 +4153 stats:com_235 +4154 stats:com_236 +4155 stats:com_238 +4156 stats:com_239 +4157 stats:com_240 +4158 stats:com_241 +4159 stats:com_242 +4160 stats:com_237 +4162 crafting_jewelry:com_0 +4163 crafting_jewelry:com_1 +4164 crafting_jewelry:com_2 +4165 crafting_jewelry:com_3 +4166 crafting_jewelry:com_4 +4167 crafting_jewelry:com_5 +4168 crafting_jewelry:com_6 +4169 crafting_jewelry:com_7 +4170 crafting_jewelry:com_8 +4171 crafting_jewelry:com_9 +4172 crafting_jewelry:com_10 +4173 crafting_jewelry:com_11 +4174 crafting_jewelry:com_12 +4175 crafting_jewelry:com_13 +4176 crafting_jewelry:com_14 +4177 crafting_jewelry:com_15 +4178 crafting_jewelry:com_16 +4179 crafting_jewelry:com_17 +4180 crafting_jewelry:com_18 +4181 crafting_jewelry:com_19 +4182 crafting_jewelry:com_20 +4183 crafting_jewelry:com_21 +4184 crafting_jewelry:com_22 +4185 crafting_jewelry:com_23 +4186 crafting_jewelry:com_24 +4187 crafting_jewelry:com_25 +4188 crafting_jewelry:com_26 +4189 crafting_jewelry:com_27 +4190 crafting_jewelry:com_28 +4191 crafting_jewelry:com_29 +4192 crafting_jewelry:com_30 +4193 crafting_jewelry:com_31 +4194 crafting_jewelry:com_32 +4195 crafting_jewelry:com_33 +4196 crafting_jewelry:com_34 +4197 crafting_jewelry:com_35 +4198 crafting_jewelry:com_36 +4199 crafting_jewelry:com_37 +4200 crafting_jewelry:com_38 +4201 crafting_jewelry:com_39 +4202 crafting_jewelry:com_40 +4203 crafting_jewelry:com_41 +4204 crafting_jewelry:com_42 +4205 crafting_jewelry:com_43 +4206 crafting_jewelry:com_44 +4207 crafting_jewelry:com_45 +4208 crafting_jewelry:com_46 +4209 crafting_jewelry:com_47 +4210 crafting_jewelry:com_48 +4211 crafting_jewelry:com_49 +4212 crafting_jewelry:com_50 +4213 crafting_jewelry:com_51 +4214 crafting_jewelry:com_52 +4215 crafting_jewelry:com_53 +4216 crafting_jewelry:com_54 +4217 crafting_jewelry:com_55 +4218 crafting_jewelry:com_56 +4219 crafting_jewelry:com_57 +4220 crafting_jewelry:com_58 +4221 crafting_jewelry:com_59 +4222 crafting_jewelry:com_60 +4223 crafting_jewelry:com_61 +4224 crafting_jewelry:com_62 +4225 crafting_jewelry:com_63 +4226 crafting_jewelry:com_64 +4227 crafting_jewelry:com_65 +4228 crafting_jewelry:ring_mould +4229 crafting_jewelry:com_67 +4230 crafting_jewelry:com_68 +4231 crafting_jewelry:rings_title +4232 crafting_jewelry:rings_layer +4233 crafting_jewelry:rings_inv +4234 crafting_jewelry:necklace_mould +4235 crafting_jewelry:com_78 +4236 crafting_jewelry:com_79 +4237 crafting_jewelry:necklaces_title +4238 crafting_jewelry:necklaces_layer +4239 crafting_jewelry:necklaces_inv +4240 crafting_jewelry:amulet_mould +4241 crafting_jewelry:com_89 +4242 crafting_jewelry:com_90 +4243 crafting_jewelry:amulets_title +4244 crafting_jewelry:amulets_layer +4245 crafting_jewelry:amulets_inv +4246 crafting_jewelry:rings1 +4247 crafting_jewelry:rings2 +4248 crafting_jewelry:rings3 +4249 crafting_jewelry:rings4 +4250 crafting_jewelry:rings5 +4251 crafting_jewelry:necklaces1 +4252 crafting_jewelry:necklaces2 +4253 crafting_jewelry:necklaces3 +4254 crafting_jewelry:necklaces4 +4255 crafting_jewelry:necklaces5 +4256 crafting_jewelry:amulets1 +4257 crafting_jewelry:amulets2 +4258 crafting_jewelry:amulets3 +4259 crafting_jewelry:amulets4 +4260 crafting_jewelry:amulets5 +4262 music:com_0 +4263 levelup_thieving:line1 +4264 levelup_thieving:line2 +4265 levelup_thieving:continue +4266 levelup_thieving:icon +4268 levelup_runecraft:line1 +4269 levelup_runecraft:line2 +4270 levelup_runecraft:continue +4271 levelup_runecraft:icon +4273 levelup_woodcutting:line1 +4274 levelup_woodcutting:line2 +4275 levelup_woodcutting:continue +4276 levelup_woodcutting:icon +4278 levelup_agility:line1 +4279 levelup_agility:line2 +4280 levelup_agility:continue +4281 levelup_agility:icon +4283 levelup_firemaking:line1 +4284 levelup_firemaking:line2 +4285 levelup_firemaking:continue +4286 levelup_firemaking:icon +4287 music:com_2 +4288 music:com_3 +4289 music:com_4 +4290 music:com_5 +4291 music:com_6 +4292 music:com_7 +4293 music:com_8 +4294 music:com_9 +4295 music:com_10 +4296 music:com_11 +4297 music:com_12 +4298 music:com_13 +4299 music:com_14 +4300 music:com_15 +4301 music:com_16 +4302 music:com_17 +4303 music:com_18 +4304 music:com_19 +4305 music:com_20 +4306 music:com_21 +4307 music:com_22 +4308 music:com_23 +4309 music:com_24 +4310 music:com_25 +4311 music:com_26 +4312 music:com_27 +4313 music:com_28 +4314 music:com_29 +4315 music:com_30 +4316 music:com_31 +4317 music:com_32 +4318 music:com_33 +4319 music:com_34 +4320 music:com_35 +4321 music:com_36 +4322 music:com_37 +4323 music:com_38 +4324 music:com_39 +4325 music:com_40 +4326 music:com_41 +4327 music:com_42 +4328 music:com_43 +4329 music:com_44 +4330 music:com_45 +4331 music:com_46 +4332 music:com_47 +4333 music:com_48 +4334 music:com_49 +4335 music:com_50 +4336 music:com_51 +4337 music:com_52 +4338 music:com_53 +4339 music:com_54 +4340 music:com_55 +4341 music:com_56 +4342 music:com_57 +4343 music:com_58 +4344 music:com_59 +4345 music:com_60 +4346 music:com_61 +4347 music:com_62 +4348 music:com_63 +4349 music:com_64 +4350 music:com_65 +4351 music:com_66 +4352 music:com_67 +4353 music:com_68 +4354 music:com_69 +4355 music:com_70 +4356 music:com_71 +4357 music:com_72 +4358 music:com_73 +4359 music:com_74 +4360 music:com_75 +4361 music:com_76 +4362 music:com_77 +4363 music:com_78 +4364 music:com_79 +4365 music:com_80 +4366 music:com_81 +4367 music:com_82 +4368 music:com_83 +4369 music:com_84 +4370 music:com_85 +4371 music:com_86 +4372 music:com_87 +4373 music:com_88 +4374 music:com_89 +4375 music:com_90 +4376 music:com_91 +4377 music:com_92 +4378 music:com_93 +4379 music:com_94 +4380 music:com_95 +4381 music:com_96 +4382 music:com_97 +4383 music:com_98 +4384 music:com_99 +4385 music:com_100 +4386 music:com_101 +4387 music:com_102 +4388 music:com_103 +4389 music:com_104 +4390 music:com_105 +4391 music:com_106 +4392 music:com_107 +4393 music:com_108 +4394 music:com_109 +4395 music:com_110 +4396 music:com_111 +4397 music:com_112 +4398 music:com_113 +4399 music:com_114 +4400 music:com_115 +4401 music:com_116 +4402 music:com_117 +4403 music:com_118 +4404 music:com_119 +4405 music:com_120 +4406 music:com_121 +4407 music:com_122 +4408 music:com_123 +4409 music:com_124 +4410 music:com_125 +4411 music:com_126 +4412 music:com_127 +4413 music:com_128 +4414 music:com_129 +4415 music:com_130 +4417 levelup_mining:line1 +4418 music:com_131 +4419 music:com_132 +4420 music:com_133 +4421 music:com_134 +4422 music:com_135 +4423 music:com_136 +4424 music:com_137 +4425 music:com_138 +4426 music:com_139 +4427 music:com_140 +4428 music:com_141 +4429 music:com_142 +4430 music:com_143 +4431 music:com_144 +4432 music:com_145 +4433 music:com_146 +4434 music:com_147 +4435 music:com_148 +4436 music:com_149 +4437 music:com_150 +4438 levelup_mining:line2 +4439 music:com_201 +4440 levelup_mining:continue +4441 music:com_152 +4442 levelup_mining:icon +4444 questscroll:com_9 +4447 combat_thrown:preview +4448 combat_thrown:com_1 +4449 combat_thrown:name +4450 combat_thrown:com_3 +4451 combat_thrown:thrown101 +4452 combat_thrown:thrown2 +4453 combat_thrown:thrown1 +4454 combat_thrown:thrown0 +4455 combat_thrown:com_8 +4456 combat_thrown:com_9 +4457 combat_thrown:com_10 +4458 combat_thrown:com_11 +4459 combat_thrown:com_12 +4460 combat_thrown:com_13 +4462 tickets_shop:com_0 +4463 tickets_shop:com_1 +4464 tickets_shop:com_2 +4465 tickets_shop:com_3 +4466 tickets_shop:com_4 +4467 tickets_shop:com_5 +4468 tickets_shop:com_6 +4469 tickets_shop:com_7 +4470 tickets_shop:com_8 +4471 tickets_shop:com_9 +4472 tickets_shop:com_10 +4473 tickets_shop:com_11 +4474 tickets_shop:com_12 +4475 tickets_shop:com_13 +4476 tickets_shop:com_14 +4477 tickets_shop:com_15 +4478 tickets_shop:com_16 +4479 tickets_shop:com_17 +4480 tickets_shop:com_18 +4481 tickets_shop:com_19 +4482 tickets_shop:com_20 +4483 tickets_shop:com_21 +4484 tickets_shop:com_22 +4485 tickets_shop:com_23 +4486 tickets_shop:com_24 +4487 tickets_shop:com_25 +4488 tickets_shop:com_26 +4489 tickets_shop:com_27 +4490 tickets_shop:com_28 +4491 tickets_shop:com_29 +4492 tickets_shop:com_30 +4493 tickets_shop:com_31 +4494 tickets_shop:com_32 +4495 tickets_shop:com_33 +4496 tickets_shop:com_34 +4497 tickets_shop:com_35 +4498 tickets_shop:com_36 +4499 tickets_shop:com_37 +4500 tickets_shop:com_38 +4501 tickets_shop:com_39 +4502 tickets_shop:com_40 +4503 tickets_shop:com_41 +4504 tickets_shop:com_42 +4505 tickets_shop:com_43 +4506 tickets_shop:com_44 +4507 tickets_shop:com_45 +4508 tickets_shop:com_46 +4509 tickets_shop:com_47 +4510 tickets_shop:com_48 +4511 tickets_shop:com_49 +4512 tickets_shop:com_50 +4513 tickets_shop:com_51 +4514 tickets_shop:com_52 +4515 tickets_shop:com_53 +4516 tickets_shop:com_54 +4517 tickets_shop:com_55 +4518 tickets_shop:com_56 +4519 tickets_shop:com_57 +4520 tickets_shop:com_58 +4521 tickets_shop:com_59 +4522 tickets_shop:com_60 +4523 tickets_shop:com_61 +4524 tickets_shop:com_62 +4525 tickets_shop:com_63 +4526 tickets_shop:com_64 +4527 tickets_shop:com_65 +4528 tickets_shop:com_66 +4529 tickets_shop:com_67 +4530 tickets_shop:com_68 +4531 tickets_shop:com_69 +4532 tickets_shop:com_70 +4533 tickets_shop:com_71 +4534 tickets_shop:com_72 +4535 tickets_shop:com_73 +4536 tickets_shop:com_74 +4537 tickets_shop:com_75 +4538 tickets_shop:com_76 +4539 tickets_shop:com_77 +4540 tickets_shop:com_78 +4541 tickets_shop:com_79 +4542 tickets_shop:com_80 +4543 tickets_shop:com_81 +4544 tickets_shop:com_82 +4545 tickets_shop:com_83 +4546 tickets_shop:com_84 +4547 tickets_shop:com_85 +4548 tickets_shop:com_86 +4549 tickets_shop:com_87 +4550 tickets_shop:com_88 +4551 tickets_shop:com_89 +4552 tickets_shop:com_90 +4553 tickets_shop:com_91 +4554 tickets_shop:com_92 +4555 tickets_shop:com_93 +4556 tickets_shop:com_94 +4557 tickets_shop:com_95 +4558 tickets_shop:com_96 +4559 tickets_shop:com_97 +4560 tickets_shop:com_98 +4561 tickets_shop:com_99 +4562 tickets_shop:com_100 +4563 tickets_shop:com_101 +4565 trawler_catch:com_0 +4566 trawler_catch:com_1 +4567 trawler_catch:com_2 +4568 trawler_catch:com_3 +4569 trawler_catch:com_4 +4570 trawler_catch:com_5 +4571 trawler_catch:com_6 +4572 trawler_catch:com_7 +4573 trawler_catch:com_8 +4574 trawler_catch:com_9 +4575 trawler_catch:com_10 +4576 trawler_catch:com_11 +4577 trawler_catch:com_12 +4578 trawler_catch:com_13 +4579 trawler_catch:com_14 +4580 trawler_catch:com_15 +4581 trawler_catch:com_16 +4582 trawler_catch:com_17 +4583 trawler_catch:com_18 +4584 trawler_catch:com_19 +4585 trawler_catch:com_20 +4586 trawler_catch:com_21 +4587 trawler_catch:com_22 +4588 trawler_catch:com_23 +4589 trawler_catch:com_24 +4590 trawler_catch:com_25 +4591 trawler_catch:com_26 +4592 trawler_catch:com_27 +4593 trawler_catch:com_28 +4594 trawler_catch:com_29 +4595 trawler_catch:com_30 +4596 trawler_catch:com_31 +4597 trawler_catch:com_32 +4598 trawler_catch:com_33 +4599 trawler_catch:com_34 +4600 trawler_catch:com_35 +4601 trawler_catch:com_36 +4602 trawler_catch:com_37 +4603 trawler_catch:com_38 +4604 trawler_catch:com_39 +4605 trawler_catch:com_40 +4606 trawler_catch:com_41 +4607 trawler_catch:com_42 +4608 trawler_catch:com_43 +4609 trawler_catch:com_44 +4610 trawler_catch:com_45 +4611 trawler_catch:com_46 +4612 trawler_catch:com_47 +4613 trawler_catch:com_48 +4614 trawler_catch:com_49 +4615 trawler_catch:com_50 +4616 trawler_catch:com_51 +4617 trawler_catch:com_52 +4618 trawler_catch:com_53 +4619 trawler_catch:com_54 +4620 trawler_catch:com_55 +4621 trawler_catch:com_56 +4622 trawler_catch:com_57 +4623 trawler_catch:com_58 +4624 trawler_catch:com_59 +4625 trawler_catch:com_60 +4626 trawler_catch:com_61 +4627 trawler_catch:com_62 +4628 trawler_catch:com_63 +4629 trawler_catch:com_64 +4630 trawler_catch:com_65 +4631 trawler_catch:com_66 +4632 trawler_catch:com_67 +4633 trawler_catch:com_68 +4634 trawler_catch:com_69 +4635 trawler_catch:com_70 +4636 trawler_catch:com_71 +4637 trawler_catch:com_72 +4638 trawler_catch:com_73 +4639 trawler_catch:com_74 +4640 trawler_catch:inv +4641 trawler_catch:com_76 +4642 trawler_catch:com_77 +4643 trawler_catch:com_78 +4644 trawler_catch:com_79 +4645 trawler_catch:com_80 +4646 trawler_catch:com_81 +4647 trawler_catch:com_82 +4648 trawler_catch:com_83 +4649 trawler_catch:com_84 +4650 trawler_catch:com_85 +4651 trawler_catch:com_86 +4652 trawler_catch:com_87 +4653 trawler_catch:com_88 +4654 trawler_catch:com_89 +4655 trawler_catch:com_90 +4656 trawler_catch:com_91 +4658 multiobj3:com_0 +4659 multiobj3:com_1 +4660 multiobj3:com_2 +4661 multiobj3:com_3 +4662 multiobj3:com_4 +4663 multiobj3:com_5 +4664 multiobj3:com_6 +4665 multiobj3:com_7 +4666 multiobj3:com_8 +4668 multiobj4:com_0 +4669 multiobj4:com_1 +4670 multiobj4:com_2 +4671 multiobj4:com_3 +4672 multiobj4:com_4 +4673 multiobj4:com_5 +4674 multiobj4:com_6 +4675 multiobj4:com_7 +4676 multiobj4:com_8 +4677 multiobj4:com_9 +4678 multiobj4:com_10 +4680 combat_spear:preview +4681 combat_spear:com_1 +4682 combat_spear:name +4683 combat_spear:com_3 +4684 combat_spear:spear101 +4685 combat_spear:spear0 +4686 combat_spear:spear3 +4687 combat_spear:spear2 +4688 combat_spear:spear1 +4689 combat_spear:com_9 +4690 combat_spear:com_10 +4691 combat_spear:com_11 +4692 combat_spear:com_12 +4693 combat_spear:com_13 +4694 combat_spear:com_14 +4695 combat_spear:com_15 +4696 combat_spear:com_16 +4697 combat_spear:com_17 +4698 combat_spear:com_18 +4699 combat_spear:com_19 +4700 combat_spear:com_20 +4701 combat_spear:com_21 +4702 combat_spear:com_22 +4703 combat_spear:com_23 +4704 combat_spear:com_24 +4706 combat_heavysword:preview +4707 combat_heavysword:com_1 +4708 combat_heavysword:name +4709 combat_heavysword:com_3 +4710 combat_heavysword:heavy101 +4711 combat_heavysword:heavy0 +4712 combat_heavysword:heavy3 +4713 combat_heavysword:heavy2 +4714 combat_heavysword:heavy1 +4715 combat_heavysword:com_9 +4716 combat_heavysword:com_10 +4717 combat_heavysword:com_11 +4718 combat_heavysword:com_12 +4719 combat_heavysword:com_13 +4720 combat_heavysword:com_14 +4721 combat_heavysword:com_15 +4722 combat_heavysword:com_16 +4723 combat_heavysword:com_17 +4724 combat_heavysword:com_18 +4725 combat_heavysword:com_19 +4726 combat_heavysword:com_20 +4727 combat_heavysword:com_21 +4728 combat_heavysword:com_22 +4729 combat_heavysword:com_23 +4730 combat_heavysword:com_24 +4732 player_kit_tailor_legs_woman:com_0 +4733 player_kit_tailor_legs_woman:com_1 +4734 player_kit_tailor_legs_woman:com_2 +4735 player_kit_tailor_legs_woman:com_3 +4736 player_kit_tailor_legs_woman:com_4 +4737 player_kit_tailor_legs_woman:com_5 +4738 player_kit_tailor_legs_woman:com_6 +4739 player_kit_tailor_legs_woman:com_7 +4740 player_kit_tailor_legs_woman:com_8 +4741 player_kit_tailor_legs_woman:com_9 +4742 player_kit_tailor_legs_woman:com_10 +4743 player_kit_tailor_legs_woman:com_11 +4744 player_kit_tailor_legs_woman:com_12 +4745 player_kit_tailor_legs_woman:com_13 +4746 player_kit_tailor_legs_woman:com_14 +4747 player_kit_tailor_legs_woman:com_15 +4748 player_kit_tailor_legs_woman:com_16 +4749 player_kit_tailor_legs_woman:com_17 +4750 player_kit_tailor_legs_woman:com_18 +4751 player_kit_tailor_legs_woman:com_19 +4752 player_kit_tailor_legs_woman:com_20 +4753 player_kit_tailor_legs_woman:com_21 +4754 player_kit_tailor_legs_woman:com_22 +4755 player_kit_tailor_legs_woman:com_23 +4756 player_kit_tailor_legs_woman:com_24 +4757 player_kit_tailor_legs_woman:com_25 +4758 player_kit_tailor_legs_woman:com_26 +4759 player_kit_tailor_legs_woman:com_27 +4760 player_kit_tailor_legs_woman:com_28 +4761 player_kit_tailor_legs_woman:com_29 +4762 player_kit_tailor_legs_woman:com_30 +4763 player_kit_tailor_legs_woman:com_31 +4764 player_kit_tailor_legs_woman:com_32 +4765 player_kit_tailor_legs_woman:com_33 +4766 player_kit_tailor_legs_woman:com_34 +4767 player_kit_tailor_legs_woman:com_35 +4768 player_kit_tailor_legs_woman:com_36 +4769 player_kit_tailor_legs_woman:com_37 +4770 player_kit_tailor_legs_woman:com_38 +4771 player_kit_tailor_legs_woman:com_39 +4772 player_kit_tailor_legs_woman:com_40 +4773 player_kit_tailor_legs_woman:com_41 +4774 player_kit_tailor_legs_woman:com_42 +4775 player_kit_tailor_legs_woman:com_43 +4776 player_kit_tailor_legs_woman:com_44 +4777 player_kit_tailor_legs_woman:com_45 +4778 player_kit_tailor_legs_woman:com_46 +4779 player_kit_tailor_legs_woman:com_47 +4780 player_kit_tailor_legs_woman:com_48 +4781 player_kit_tailor_legs_woman:com_49 +4782 player_kit_tailor_legs_woman:com_50 +4783 player_kit_tailor_legs_woman:com_51 +4784 player_kit_tailor_legs_woman:com_52 +4785 player_kit_tailor_legs_woman:com_53 +4786 player_kit_tailor_legs_woman:com_54 +4787 player_kit_tailor_legs_woman:com_55 +4788 player_kit_tailor_legs_woman:com_56 +4789 player_kit_tailor_legs_woman:com_57 +4790 player_kit_tailor_legs_woman:com_58 +4791 player_kit_tailor_legs_woman:com_59 +4792 player_kit_tailor_legs_woman:com_60 +4793 player_kit_tailor_legs_woman:com_61 +4794 player_kit_tailor_legs_woman:com_62 +4795 player_kit_tailor_legs_woman:com_63 +4796 player_kit_tailor_legs_woman:com_64 +4797 player_kit_tailor_legs_woman:com_65 +4798 player_kit_tailor_legs_woman:com_66 +4799 player_kit_tailor_legs_woman:com_67 +4800 player_kit_tailor_legs_woman:com_68 +4801 player_kit_tailor_legs_woman:com_69 +4802 player_kit_tailor_legs_woman:com_70 +4803 player_kit_tailor_legs_woman:com_71 +4804 player_kit_tailor_legs_woman:com_72 +4805 player_kit_tailor_legs_woman:com_73 +4806 player_kit_tailor_legs_woman:com_74 +4807 player_kit_tailor_legs_woman:com_75 +4808 player_kit_tailor_legs_woman:com_76 +4809 player_kit_tailor_legs_woman:com_77 +4810 player_kit_tailor_legs_woman:com_78 +4811 player_kit_tailor_legs_woman:com_79 +4812 player_kit_tailor_legs_woman:com_80 +4813 player_kit_tailor_legs_woman:com_81 +4814 player_kit_tailor_legs_woman:com_82 +4815 player_kit_tailor_legs_woman:com_83 +4816 player_kit_tailor_legs_woman:com_84 +4817 player_kit_tailor_legs_woman:com_85 +4818 player_kit_tailor_legs_woman:com_86 +4819 player_kit_tailor_legs_woman:com_87 +4820 player_kit_tailor_legs_woman:com_88 +4821 player_kit_tailor_legs_woman:com_89 +4822 player_kit_tailor_legs_woman:com_90 +4823 player_kit_tailor_legs_woman:com_91 +4824 player_kit_tailor_legs_woman:com_92 +4825 player_kit_tailor_legs_woman:com_93 +4826 player_kit_tailor_legs_woman:com_94 +4827 player_kit_tailor_legs_woman:com_95 +4828 player_kit_tailor_legs_woman:com_96 +4829 player_kit_tailor_legs_woman:com_97 +4830 player_kit_tailor_legs_woman:com_98 +4831 player_kit_tailor_legs_woman:com_99 +4832 player_kit_tailor_legs_woman:com_100 +4833 player_kit_tailor_legs_woman:com_101 +4834 player_kit_tailor_legs_woman:com_102 +4835 player_kit_tailor_legs_woman:com_103 +4836 player_kit_tailor_legs_woman:com_104 +4837 player_kit_tailor_legs_woman:com_105 +4838 player_kit_tailor_legs_woman:com_106 +4839 player_kit_tailor_legs_woman:confirm +4840 player_kit_tailor_legs_woman:com_108 +4841 player_kit_tailor_legs_woman:com_109 +4842 player_kit_tailor_legs_woman:com_110 +4843 player_kit_tailor_legs_woman:com_111 +4844 player_kit_tailor_legs_woman:com_112 +4845 player_kit_tailor_legs_woman:com_113 +4846 player_kit_tailor_legs_woman:com_114 +4847 player_kit_tailor_legs_woman:com_115 +4848 player_kit_tailor_legs_woman:com_116 +4849 player_kit_tailor_legs_woman:com_117 +4850 player_kit_tailor_legs_woman:com_118 +4851 player_kit_tailor_legs_woman:com_119 +4852 player_kit_tailor_legs_woman:com_120 +4853 player_kit_tailor_legs_woman:com_121 +4854 player_kit_tailor_legs_woman:com_122 +4855 player_kit_tailor_legs_woman:com_123 +4856 player_kit_tailor_legs_woman:com_124 +4857 player_kit_tailor_legs_woman:com_125 +4858 player_kit_tailor_legs_woman:com_126 +4859 player_kit_tailor_legs_woman:com_127 +4860 player_kit_tailor_legs_woman:com_128 +4861 player_kit_tailor_legs_woman:com_129 +4862 player_kit_tailor_legs_woman:com_130 +4863 player_kit_tailor_legs_woman:com_131 +4864 player_kit_tailor_legs_woman:com_132 +4865 player_kit_tailor_legs_woman:com_133 +4866 player_kit_tailor_legs_woman:com_134 +4867 player_kit_tailor_legs_woman:com_135 +4868 player_kit_tailor_legs_woman:com_136 +4869 player_kit_tailor_legs_woman:com_137 +4870 player_kit_tailor_legs_woman:com_138 +4871 player_kit_tailor_legs_woman:com_139 +4872 player_kit_tailor_legs_woman:com_140 +4873 player_kit_tailor_legs_woman:com_141 +4874 player_kit_tailor_legs_woman:com_142 +4875 player_kit_tailor_legs_woman:com_143 +4876 player_kit_tailor_legs_woman:com_144 +4877 player_kit_tailor_legs_woman:com_145 +4878 player_kit_tailor_legs_woman:com_146 +4879 player_kit_tailor_legs_woman:com_147 +4880 player_kit_tailor_legs_woman:com_148 +4881 player_kit_tailor_legs_woman:com_149 +4883 npcchat1:com_0 +4884 npcchat1:com_1 +4885 npcchat1:com_2 +4886 npcchat1:com_3 +4888 npcchat2:com_0 +4889 npcchat2:com_1 +4890 npcchat2:com_2 +4891 npcchat2:com_3 +4892 npcchat2:com_4 +4894 npcchat3:com_0 +4895 npcchat3:com_1 +4896 npcchat3:com_2 +4897 npcchat3:com_3 +4898 npcchat3:com_4 +4899 npcchat3:com_5 +4901 npcchat4:com_0 +4902 npcchat4:com_1 +4903 npcchat4:com_2 +4904 npcchat4:com_3 +4905 npcchat4:com_4 +4906 npcchat4:com_5 +4907 npcchat4:com_6 +4909 part2:com_0 +4910 part2:com_1 +4911 part2:com_2 +4912 part2:com_3 +4913 part2:com_4 +4914 part2:com_5 +4915 part2:com_6 +4916 part2:com_7 +4917 part2:com_8 +4918 part2:com_9 +4919 part2:com_10 +4920 part2:com_11 +4921 part2:com_12 +4922 part2:com_13 +4923 part2:com_14 +4924 part2:com_15 +4925 part2:com_16 +4926 part2:com_17 +4927 part2:com_18 +4928 part2:com_19 +4929 part2:com_20 +4930 part2:com_21 +4931 part2:com_22 +4932 part2:com_23 +4933 part2:com_24 +4934 part2:com_25 +4935 part2:com_26 +4936 part2:com_27 +4937 part2:com_28 +4938 part2:com_29 +4939 part2:com_30 +4940 part2:com_31 +4941 part2:com_32 +4942 part2:com_33 +4943 part2:com_34 +4944 part2:com_35 +4945 part2:com_36 +4946 part2:com_37 +4947 part2:com_38 +4948 part2:com_39 +4949 part2:com_40 +4951 doubleobjbox:com_0 +4952 doubleobjbox:com_1 +4953 doubleobjbox:com_2 +4954 doubleobjbox:com_3 +4955 doubleobjbox:com_4 +4956 doubleobjbox:com_5 +4957 doubleobjbox:com_6 +4959 gnomeball:com_0 +4960 gnomeball:com_1 +4961 gnomeball:com_2 +4962 gnomeball:com_3 +4963 gnomeball:com_4 +4964 gnomeball:com_5 +4965 gnomeball:com_6 +4966 gnomeball:com_7 +4967 gnomeball:com_8 +4968 gnomeball:com_9 +4969 gnomeball:com_10 +4970 gnomeball:com_11 +4972 book2:com_0 +4973 book2:com_1 +4974 book2:com_2 +4975 book2:com_3 +4976 book2:com_4 +4977 book2:com_5 +4978 book2:com_6 +4979 book2:com_7 +4980 book2:com_8 +4981 book2:com_9 +4982 book2:com_10 +4983 book2:com_11 +4984 book2:com_12 +4985 book2:com_13 +4986 book2:com_14 +4987 book2:com_15 +4988 book2:com_16 +4989 book2:com_17 +4990 book2:com_18 +4991 book2:com_19 +4992 book2:com_20 +4993 book2:com_21 +4994 book2:com_22 +4995 book2:com_23 +4996 book2:com_24 +4997 book2:com_25 +4998 book2:com_26 +4999 book2:com_27 +5000 book2:com_28 +5001 book2:com_29 +5002 book2:com_30 +5003 book2:com_31 +5004 book2:com_32 +5005 book2:com_33 +5006 book2:com_34 +5007 book2:com_35 +5008 book2:com_36 +5009 book2:com_37 +5010 book2:com_38 +5011 book2:com_39 +5012 book2:com_40 +5013 book2:com_41 +5014 book2:com_42 +5015 book2:com_43 +5016 book2:com_44 +5018 book3:com_0 +5019 book3:com_1 +5020 book3:com_2 +5021 book3:com_3 +5022 book3:com_4 +5023 book3:com_5 +5024 book3:com_6 +5025 book3:com_7 +5026 book3:com_8 +5027 book3:com_9 +5028 book3:com_10 +5029 book3:com_11 +5030 book3:com_12 +5031 book3:com_13 +5032 book3:com_14 +5033 book3:com_15 +5034 book3:com_16 +5035 book3:com_17 +5036 book3:com_18 +5037 book3:com_19 +5038 book3:com_20 +5039 book3:com_21 +5040 book3:com_22 +5041 book3:com_23 +5042 book3:com_24 +5043 book3:com_25 +5044 book3:com_26 +5045 book3:com_27 +5046 book3:com_28 +5047 book3:com_29 +5048 book3:com_30 +5049 book3:com_31 +5050 book3:com_32 +5051 book3:com_33 +5052 book3:com_34 +5053 book3:com_35 +5054 book3:com_36 +5055 book3:com_37 +5056 book3:com_38 +5057 book3:com_39 +5058 book3:com_40 +5059 book3:com_41 +5060 book3:com_42 +5061 book3:com_43 +5062 book3:com_44 +5064 party_drop_chest_side:inv +5066 friends:com_0 +5067 friends:com_201 +5068 friends:com_202 +5069 friends:com_203 +5070 friends:com_204 +5071 friends:com_205 +5072 friends:com_206 +5073 friends:com_207 +5074 friends:com_208 +5075 friends:com_209 +5076 friends:com_210 +5077 friends:com_211 +5078 friends:com_212 +5079 friends:com_213 +5080 friends:com_214 +5081 friends:com_215 +5082 friends:com_216 +5083 friends:com_217 +5084 friends:com_218 +5085 friends:com_219 +5086 friends:com_220 +5087 friends:com_221 +5088 friends:com_222 +5089 friends:com_223 +5090 friends:com_224 +5091 friends:com_225 +5092 friends:com_1 +5093 friends:com_2 +5094 friends:com_3 +5095 friends:com_4 +5096 friends:com_5 +5097 friends:com_6 +5098 friends:com_7 +5099 friends:com_8 +5100 friends:com_9 +5101 friends:com_10 +5102 friends:com_11 +5103 friends:com_12 +5104 friends:com_13 +5105 friends:com_14 +5106 friends:com_15 +5107 friends:com_16 +5108 friends:com_17 +5109 friends:com_18 +5110 friends:com_19 +5111 friends:com_20 +5112 friends:com_21 +5113 friends:com_22 +5114 friends:com_23 +5115 friends:com_24 +5116 friends:com_25 +5117 friends:com_26 +5118 friends:com_27 +5119 friends:com_28 +5120 friends:com_29 +5121 friends:com_30 +5122 friends:com_31 +5123 friends:com_32 +5124 friends:com_33 +5125 friends:com_34 +5126 friends:com_35 +5127 friends:com_36 +5128 friends:com_37 +5129 friends:com_38 +5130 friends:com_39 +5131 friends:com_40 +5132 friends:com_41 +5133 friends:com_42 +5134 friends:com_43 +5135 friends:com_44 +5136 friends:com_45 +5137 friends:com_46 +5138 friends:com_47 +5139 friends:com_48 +5140 friends:com_49 +5141 friends:com_50 +5142 friends:com_51 +5143 friends:com_52 +5144 friends:com_53 +5145 friends:com_54 +5146 friends:com_55 +5147 friends:com_56 +5148 friends:com_57 +5149 friends:com_58 +5150 friends:com_59 +5151 friends:com_60 +5152 friends:com_61 +5153 friends:com_62 +5154 friends:com_63 +5155 friends:com_64 +5156 friends:com_65 +5157 friends:com_66 +5158 friends:com_67 +5159 friends:com_68 +5160 friends:com_69 +5161 friends:com_70 +5162 friends:com_71 +5163 friends:com_72 +5164 friends:com_73 +5165 friends:com_74 +5166 friends:com_75 +5167 friends:com_76 +5168 friends:com_77 +5169 friends:com_78 +5170 friends:com_79 +5171 friends:com_80 +5172 friends:com_81 +5173 friends:com_82 +5174 friends:com_83 +5175 friends:com_84 +5176 friends:com_85 +5177 friends:com_86 +5178 friends:com_87 +5179 friends:com_88 +5180 friends:com_89 +5181 friends:com_90 +5182 friends:com_91 +5183 friends:com_92 +5184 friends:com_93 +5185 friends:com_94 +5186 friends:com_95 +5187 friends:com_96 +5188 friends:com_97 +5189 friends:com_98 +5190 friends:com_99 +5191 friends:com_100 +5192 friends:com_101 +5193 friends:com_102 +5194 friends:com_103 +5195 friends:com_104 +5196 friends:com_105 +5197 friends:com_106 +5198 friends:com_107 +5199 friends:com_108 +5200 friends:com_109 +5201 friends:com_110 +5202 friends:com_111 +5203 friends:com_112 +5204 friends:com_113 +5205 friends:com_114 +5206 friends:com_115 +5207 friends:com_116 +5208 friends:com_117 +5209 friends:com_118 +5210 friends:com_119 +5211 friends:com_120 +5212 friends:com_121 +5213 friends:com_122 +5214 friends:com_123 +5215 friends:com_124 +5216 friends:com_125 +5217 friends:com_126 +5218 friends:com_127 +5219 friends:com_128 +5220 friends:com_129 +5221 friends:com_130 +5222 friends:com_131 +5223 friends:com_132 +5224 friends:com_133 +5225 friends:com_134 +5226 friends:com_135 +5227 friends:com_136 +5228 friends:com_137 +5229 friends:com_138 +5230 friends:com_139 +5231 friends:com_140 +5232 friends:com_141 +5233 friends:com_142 +5234 friends:com_143 +5235 friends:com_144 +5236 friends:com_145 +5237 friends:com_146 +5238 friends:com_147 +5239 friends:com_148 +5240 friends:com_149 +5241 friends:com_150 +5242 friends:com_151 +5243 friends:com_152 +5244 friends:com_153 +5245 friends:com_154 +5246 friends:com_155 +5247 friends:com_156 +5248 friends:com_157 +5249 friends:com_158 +5250 friends:com_159 +5251 friends:com_160 +5252 friends:com_161 +5253 friends:com_162 +5254 friends:com_163 +5255 friends:com_164 +5256 friends:com_165 +5257 friends:com_166 +5258 friends:com_167 +5259 friends:com_168 +5260 friends:com_169 +5261 friends:com_170 +5262 friends:com_171 +5263 friends:com_172 +5264 friends:com_173 +5265 friends:com_174 +5266 friends:com_175 +5267 friends:com_176 +5268 friends:com_177 +5269 friends:com_178 +5270 friends:com_179 +5271 friends:com_180 +5272 friends:com_181 +5273 friends:com_182 +5274 friends:com_183 +5275 friends:com_184 +5276 friends:com_185 +5277 friends:com_186 +5278 friends:com_187 +5279 friends:com_188 +5280 friends:com_189 +5281 friends:com_190 +5282 friends:com_191 +5283 friends:com_192 +5284 friends:com_193 +5285 friends:com_194 +5286 friends:com_195 +5287 friends:com_196 +5288 friends:com_197 +5289 friends:com_198 +5290 friends:com_199 +5291 friends:com_200 +5293 bank_main:com_0 +5294 bank_main:com_1 +5295 bank_main:com_2 +5296 bank_main:com_3 +5297 bank_main:com_4 +5298 bank_main:com_5 +5299 bank_main:com_6 +5300 bank_main:com_7 +5301 bank_main:com_8 +5302 bank_main:com_9 +5303 bank_main:com_10 +5304 bank_main:com_11 +5305 bank_main:com_12 +5306 bank_main:com_13 +5307 bank_main:com_14 +5308 bank_main:com_15 +5309 bank_main:com_16 +5310 bank_main:com_17 +5311 bank_main:com_18 +5312 bank_main:com_19 +5313 bank_main:com_20 +5314 bank_main:com_21 +5315 bank_main:com_22 +5316 bank_main:com_23 +5317 bank_main:com_24 +5318 bank_main:com_25 +5319 bank_main:com_26 +5320 bank_main:com_27 +5321 bank_main:com_28 +5322 bank_main:com_29 +5323 bank_main:com_30 +5324 bank_main:com_31 +5325 bank_main:com_32 +5326 bank_main:com_33 +5327 bank_main:com_34 +5328 bank_main:com_35 +5329 bank_main:com_36 +5330 bank_main:com_37 +5331 bank_main:com_38 +5332 bank_main:com_39 +5333 bank_main:com_40 +5334 bank_main:com_41 +5335 bank_main:com_42 +5336 bank_main:com_43 +5337 bank_main:com_44 +5338 bank_main:com_45 +5339 bank_main:com_46 +5340 bank_main:com_47 +5341 bank_main:com_48 +5342 bank_main:com_49 +5343 bank_main:com_50 +5344 bank_main:com_51 +5345 bank_main:com_52 +5346 bank_main:com_53 +5347 bank_main:com_54 +5348 bank_main:com_55 +5349 bank_main:com_56 +5350 bank_main:com_57 +5351 bank_main:com_58 +5352 bank_main:com_59 +5353 bank_main:com_60 +5354 bank_main:com_61 +5355 bank_main:com_62 +5356 bank_main:com_63 +5357 bank_main:com_64 +5358 bank_main:com_65 +5359 bank_main:com_66 +5360 bank_main:com_67 +5361 bank_main:com_68 +5362 bank_main:com_69 +5363 bank_main:com_70 +5364 bank_main:com_71 +5365 bank_main:com_72 +5366 bank_main:com_73 +5367 bank_main:com_74 +5368 bank_main:com_75 +5369 bank_main:com_76 +5370 bank_main:com_77 +5371 bank_main:com_78 +5372 bank_main:com_79 +5373 bank_main:com_80 +5374 bank_main:com_81 +5375 bank_main:com_82 +5376 bank_main:com_83 +5377 bank_main:com_84 +5378 bank_main:com_85 +5379 bank_main:com_86 +5380 bank_main:com_87 +5381 bank_main:com_88 +5382 bank_main:inv +5383 bank_main:com_89 +5384 bank_main:com_90 +5385 bank_main:com_91 +5386 bank_main:com_93 +5387 bank_main:com_94 +5388 bank_main:com_95 +5389 bank_main:com_96 +5390 bank_main:com_97 +5391 bank_main:com_98 +5393 playermap_east:com_0 +5394 playermap_east:com_1 +5395 playermap_east:com_2 +5396 playermap_east:com_3 +5397 playermap_east:com_4 +5398 playermap_east:com_5 +5399 playermap_east:com_6 +5400 playermap_east:com_7 +5401 playermap_east:com_8 +5402 playermap_east:com_9 +5403 playermap_east:com_10 +5404 playermap_east:com_11 +5405 playermap_east:com_12 +5406 playermap_east:com_13 +5407 playermap_east:com_14 +5408 playermap_east:com_15 +5409 playermap_east:com_16 +5410 playermap_east:com_17 +5411 playermap_east:com_18 +5412 playermap_east:com_19 +5413 playermap_east:com_20 +5414 playermap_east:com_21 +5415 playermap_east:com_22 +5416 playermap_east:com_23 +5417 playermap_east:com_24 +5418 playermap_east:com_25 +5419 playermap_east:com_26 +5420 playermap_east:com_27 +5421 playermap_east:com_28 +5422 playermap_east:com_29 +5423 playermap_east:com_30 +5424 playermap_east:com_31 +5425 playermap_east:com_32 +5426 playermap_east:com_33 +5427 playermap_east:com_34 +5428 playermap_east:com_35 +5429 playermap_east:com_36 +5430 playermap_east:com_37 +5431 playermap_east:com_38 +5432 playermap_east:com_39 +5433 playermap_east:com_40 +5434 playermap_east:com_41 +5435 playermap_east:com_42 +5436 playermap_east:com_43 +5437 playermap_east:com_44 +5438 playermap_east:com_45 +5439 playermap_east:com_46 +5440 playermap_east:com_47 +5442 objbox4_special2:com_0 +5443 objbox4_special2:com_1 +5444 objbox4_special2:com_2 +5445 objbox4_special2:com_3 +5446 objbox4_special2:com_4 +5447 objbox4_special2:com_5 +5448 music:com_200 +5449 music:com_151 +5450 music:com_202 +5451 options_ld:com_0 +5452 options_ld:com_1 +5453 levelup_ranged:line1 +5455 makeover_mage:com_0 +5456 makeover_mage:com_1 +5457 makeover_mage:com_2 +5458 makeover_mage:com_3 +5459 makeover_mage:com_4 +5460 makeover_mage:com_5 +5461 makeover_mage:com_6 +5462 makeover_mage:com_7 +5463 makeover_mage:com_8 +5464 makeover_mage:com_9 +5465 makeover_mage:com_10 +5466 makeover_mage:com_11 +5467 makeover_mage:com_12 +5468 makeover_mage:com_13 +5469 makeover_mage:com_14 +5470 makeover_mage:com_15 +5471 makeover_mage:com_16 +5472 makeover_mage:com_17 +5473 makeover_mage:com_18 +5474 makeover_mage:com_19 +5475 makeover_mage:com_20 +5476 makeover_mage:com_21 +5477 makeover_mage:com_22 +5478 makeover_mage:com_23 +5479 makeover_mage:com_24 +5480 makeover_mage:com_25 +5481 makeover_mage:com_26 +5482 makeover_mage:com_27 +5483 makeover_mage:com_28 +5484 makeover_mage:com_29 +5485 makeover_mage:com_30 +5486 makeover_mage:com_31 +5487 makeover_mage:com_32 +5488 makeover_mage:com_33 +5489 makeover_mage:com_34 +5490 makeover_mage:com_35 +5491 makeover_mage:com_36 +5492 makeover_mage:com_37 +5493 makeover_mage:com_38 +5494 makeover_mage:com_39 +5495 makeover_mage:com_40 +5496 makeover_mage:com_41 +5497 makeover_mage:com_42 +5498 makeover_mage:com_43 +5499 makeover_mage:com_44 +5500 makeover_mage:com_45 +5501 makeover_mage:com_46 +5502 makeover_mage:com_47 +5503 makeover_mage:com_48 +5504 makeover_mage:com_49 +5505 makeover_mage:com_50 +5506 makeover_mage:com_51 +5507 makeover_mage:com_52 +5508 makeover_mage:com_53 +5509 makeover_mage:com_54 +5510 makeover_mage:com_55 +5511 makeover_mage:com_56 +5512 makeover_mage:com_57 +5513 makeover_mage:com_58 +5514 makeover_mage:com_59 +5515 makeover_mage:com_60 +5516 makeover_mage:com_61 +5517 makeover_mage:com_62 +5518 makeover_mage:com_63 +5519 makeover_mage:com_64 +5520 makeover_mage:com_65 +5521 makeover_mage:com_66 +5522 makeover_mage:com_67 +5523 makeover_mage:com_68 +5524 makeover_mage:com_69 +5525 makeover_mage:com_70 +5526 makeover_mage:com_71 +5527 makeover_mage:com_72 +5528 makeover_mage:com_73 +5529 makeover_mage:com_74 +5530 makeover_mage:com_75 +5531 makeover_mage:com_76 +5532 makeover_mage:com_77 +5533 makeover_mage:com_78 +5534 makeover_mage:com_79 +5535 makeover_mage:com_80 +5536 makeover_mage:com_81 +5537 makeover_mage:com_82 +5538 makeover_mage:com_83 +5539 makeover_mage:com_84 +5540 makeover_mage:com_85 +5541 makeover_mage:com_86 +5542 makeover_mage:com_87 +5543 makeover_mage:com_88 +5544 makeover_mage:com_89 +5545 makeover_mage:com_90 +5546 makeover_mage:com_91 +5547 makeover_mage:com_92 +5548 makeover_mage:com_93 +5549 makeover_mage:com_94 +5550 makeover_mage:com_95 +5551 makeover_mage:com_96 +5552 makeover_mage:com_97 +5553 makeover_mage:com_98 +5554 makeover_mage:com_99 +5555 makeover_mage:com_100 +5556 makeover_mage:com_101 +5557 makeover_mage:com_102 +5558 makeover_mage:com_103 +5559 makeover_mage:com_104 +5560 makeover_mage:com_105 +5561 makeover_mage:com_106 +5562 makeover_mage:com_107 +5563 makeover_mage:com_108 +5564 makeover_mage:com_109 +5565 makeover_mage:com_110 +5566 makeover_mage:com_111 +5567 makeover_mage:com_112 +5568 makeover_mage:com_113 +5569 makeover_mage:com_114 +5571 combat_pickaxe:preview +5572 combat_pickaxe:com_1 +5573 combat_pickaxe:name +5574 combat_pickaxe:com_3 +5575 combat_pickaxe:pickaxe101 +5576 combat_pickaxe:pickaxe0 +5577 combat_pickaxe:pickaxe3 +5578 combat_pickaxe:pickaxe2 +5579 combat_pickaxe:pickaxe1 +5580 combat_pickaxe:com_9 +5581 combat_pickaxe:com_10 +5582 combat_pickaxe:com_11 +5583 combat_pickaxe:com_12 +5584 combat_pickaxe:com_13 +5585 combat_pickaxe:com_14 +5586 combat_pickaxe:com_15 +5587 combat_pickaxe:com_16 +5588 combat_pickaxe:com_17 +5589 combat_pickaxe:com_18 +5590 combat_pickaxe:com_19 +5591 combat_pickaxe:com_20 +5592 combat_pickaxe:com_21 +5593 combat_pickaxe:com_22 +5594 combat_pickaxe:com_23 +5595 combat_pickaxe:com_24 +5597 trawler_help:com_0 +5598 trawler_help:com_1 +5599 trawler_help:com_2 +5600 trawler_help:com_3 +5601 trawler_help:com_4 +5602 trawler_help:com_5 +5603 trawler_help:com_6 +5604 trawler_help:com_7 +5605 trawler_help:com_8 +5606 trawler_help:com_9 +5607 trawler_help:com_10 +5609 prayer:prayer_thickskin +5610 prayer:prayer_strengthburst +5611 prayer:prayer_clarity +5612 prayer:prayer_rockskin +5613 prayer:prayer_superhumanstrength +5614 prayer:prayer_improvedreflexes +5615 prayer:prayer_rapidrestore +5616 prayer:prayer_rapidheal +5617 prayer:prayer_protectitems +5618 prayer:prayer_steelskin +5619 prayer:prayer_ultimatestrength +5620 prayer:prayer_incrediblereflexes +5621 prayer:prayer_protectfrommagic +5622 prayer:prayer_protectfrommissiles +5623 prayer:prayer_protectfrommelee +5624 prayer:com_15 +5625 prayer:com_16 +5626 prayer:com_17 +5627 prayer:com_18 +5628 prayer:com_19 +5629 prayer:com_20 +5630 prayer:com_21 +5631 prayer:com_22 +5632 prayer:com_23 +5633 prayer:com_24 +5634 prayer:com_25 +5635 prayer:com_26 +5636 prayer:com_27 +5637 prayer:com_28 +5638 prayer:com_29 +5639 prayer:com_30 +5640 prayer:com_31 +5641 prayer:com_32 +5642 prayer:com_33 +5643 prayer:com_34 +5644 prayer:com_35 +5645 prayer:com_36 +5646 prayer:com_37 +5647 prayer:com_38 +5648 prayer:com_39 +5649 prayer:com_40 +5650 prayer:com_41 +5651 prayer:com_42 +5652 prayer:com_43 +5653 prayer:com_44 +5654 prayer:com_45 +5655 prayer:com_46 +5656 prayer:com_47 +5657 prayer:com_48 +5658 prayer:com_49 +5659 prayer:com_50 +5660 prayer:com_51 +5661 prayer:com_52 +5662 prayer:com_53 +5663 prayer:com_54 +5664 prayer:com_55 +5665 prayer:com_56 +5666 prayer:com_57 +5667 prayer:com_58 +5668 prayer:com_59 +5669 prayer:com_60 +5670 prayer:com_61 +5671 prayer:com_62 +5672 prayer:com_63 +5673 prayer:com_64 +5674 prayer:com_65 +5675 prayer:com_66 +5676 prayer:com_67 +5677 prayer:com_68 +5678 prayer:com_69 +5679 prayer:com_70 +5680 prayer:com_71 +5681 prayer:com_72 +5682 prayer:com_73 +5683 prayer:com_74 +5684 prayer:com_75 +5685 prayer:com_76 +5686 prayer:com_77 +5687 prayer:com_78 +5688 prayer:com_79 +5689 prayer:com_80 +5690 prayer:com_81 +5691 prayer:com_82 +5692 prayer:com_83 +5693 prayer:com_84 +5694 prayer:com_85 +5695 prayer:com_86 +5696 prayer:com_87 +5697 prayer:com_88 +5698 prayer:com_89 +5699 prayer:com_90 +5700 prayer:com_91 +5701 prayer:com_92 +5702 prayer:com_93 +5703 prayer:com_94 +5704 prayer:com_95 +5705 prayer:com_96 +5707 objbox1_special:com_0 +5708 objbox1_special:com_1 +5709 objbox1_special:com_2 +5711 objbox2_special:com_0 +5712 objbox2_special:com_1 +5713 objbox2_special:com_2 +5714 objbox2_special:com_3 +5716 ignore:com_0 +5717 ignore:com_101 +5718 ignore:com_102 +5719 ignore:com_103 +5720 ignore:com_104 +5721 ignore:com_105 +5722 ignore:com_106 +5723 ignore:com_107 +5724 ignore:com_108 +5725 ignore:com_109 +5726 ignore:com_110 +5727 ignore:com_111 +5728 ignore:com_112 +5729 ignore:com_113 +5730 ignore:com_114 +5731 ignore:com_115 +5732 ignore:com_116 +5733 ignore:com_117 +5734 ignore:com_118 +5735 ignore:com_119 +5736 ignore:com_120 +5737 ignore:com_121 +5738 ignore:com_122 +5739 ignore:com_123 +5740 ignore:com_124 +5741 ignore:com_125 +5742 ignore:com_1 +5743 ignore:com_2 +5744 ignore:com_3 +5745 ignore:com_4 +5746 ignore:com_5 +5747 ignore:com_6 +5748 ignore:com_7 +5749 ignore:com_8 +5750 ignore:com_9 +5751 ignore:com_10 +5752 ignore:com_11 +5753 ignore:com_12 +5754 ignore:com_13 +5755 ignore:com_14 +5756 ignore:com_15 +5757 ignore:com_16 +5758 ignore:com_17 +5759 ignore:com_18 +5760 ignore:com_19 +5761 ignore:com_20 +5762 ignore:com_21 +5763 ignore:com_22 +5764 ignore:com_23 +5765 ignore:com_24 +5766 ignore:com_25 +5767 ignore:com_26 +5768 ignore:com_27 +5769 ignore:com_28 +5770 ignore:com_29 +5771 ignore:com_30 +5772 ignore:com_31 +5773 ignore:com_32 +5774 ignore:com_33 +5775 ignore:com_34 +5776 ignore:com_35 +5777 ignore:com_36 +5778 ignore:com_37 +5779 ignore:com_38 +5780 ignore:com_39 +5781 ignore:com_40 +5782 ignore:com_41 +5783 ignore:com_42 +5784 ignore:com_43 +5785 ignore:com_44 +5786 ignore:com_45 +5787 ignore:com_46 +5788 ignore:com_47 +5789 ignore:com_48 +5790 ignore:com_49 +5791 ignore:com_50 +5792 ignore:com_51 +5793 ignore:com_52 +5794 ignore:com_53 +5795 ignore:com_54 +5796 ignore:com_55 +5797 ignore:com_56 +5798 ignore:com_57 +5799 ignore:com_58 +5800 ignore:com_59 +5801 ignore:com_60 +5802 ignore:com_61 +5803 ignore:com_62 +5804 ignore:com_63 +5805 ignore:com_64 +5806 ignore:com_65 +5807 ignore:com_66 +5808 ignore:com_67 +5809 ignore:com_68 +5810 ignore:com_69 +5811 ignore:com_70 +5812 ignore:com_71 +5813 ignore:com_72 +5814 ignore:com_73 +5815 ignore:com_74 +5816 ignore:com_75 +5817 ignore:com_76 +5818 ignore:com_77 +5819 ignore:com_78 +5820 ignore:com_79 +5821 ignore:com_80 +5822 ignore:com_81 +5823 ignore:com_82 +5824 ignore:com_83 +5825 ignore:com_84 +5826 ignore:com_85 +5827 ignore:com_86 +5828 ignore:com_87 +5829 ignore:com_88 +5830 ignore:com_89 +5831 ignore:com_90 +5832 ignore:com_91 +5833 ignore:com_92 +5834 ignore:com_93 +5835 ignore:com_94 +5836 ignore:com_95 +5837 ignore:com_96 +5838 ignore:com_97 +5839 ignore:com_98 +5840 ignore:com_99 +5841 ignore:com_100 +5843 objbox3_special:com_0 +5844 objbox3_special:com_1 +5845 objbox3_special:com_2 +5846 objbox3_special:com_3 +5847 objbox3_special:com_4 +5849 objbox4_special:com_0 +5850 objbox4_special:com_1 +5851 objbox4_special:com_2 +5852 objbox4_special:com_3 +5853 objbox4_special:com_4 +5854 objbox4_special:com_5 +5856 combat_unarmed:com_0 +5857 combat_unarmed:name +5858 combat_unarmed:com_2 +5859 combat_unarmed:unarmed101 +5860 combat_unarmed:unarmed0 +5861 combat_unarmed:unarmed2 +5862 combat_unarmed:unarmed1 +5863 combat_unarmed:com_7 +5864 combat_unarmed:com_8 +5865 combat_unarmed:com_9 +5866 combat_unarmed:com_10 +5867 combat_unarmed:com_11 +5868 combat_unarmed:com_12 +5869 combat_unarmed:com_13 +5870 combat_unarmed:com_14 +5871 combat_unarmed:com_15 +5872 combat_unarmed:com_16 +5873 combat_unarmed:com_17 +5874 combat_unarmed:com_18 +5876 reportabuse:com_0 +5877 reportabuse:com_1 +5878 reportabuse:com_2 +5879 reportabuse:com_3 +5880 reportabuse:com_4 +5881 reportabuse:com_5 +5882 reportabuse:com_6 +5883 reportabuse:com_7 +5884 reportabuse:com_8 +5885 reportabuse:com_9 +5886 reportabuse:com_10 +5887 reportabuse:com_11 +5888 reportabuse:com_12 +5889 reportabuse:com_13 +5890 reportabuse:com_14 +5891 reportabuse:com_15 +5892 reportabuse:com_16 +5893 reportabuse:com_17 +5894 reportabuse:com_18 +5895 reportabuse:com_19 +5896 reportabuse:com_20 +5897 reportabuse:com_21 +5898 reportabuse:com_22 +5899 reportabuse:com_23 +5900 reportabuse:com_24 +5901 reportabuse:com_25 +5902 reportabuse:com_26 +5903 reportabuse:com_27 +5904 reportabuse:com_28 +5905 reportabuse:com_29 +5906 reportabuse:com_30 +5907 reportabuse:com_31 +5908 reportabuse:com_32 +5909 reportabuse:com_33 +5910 reportabuse:com_34 +5911 reportabuse:com_35 +5912 reportabuse:com_36 +5913 reportabuse:com_37 +5914 reportabuse:com_38 +5915 reportabuse:com_39 +5916 reportabuse:com_40 +5917 reportabuse:com_41 +5918 reportabuse:com_42 +5919 reportabuse:com_43 +5920 reportabuse:com_44 +5921 reportabuse:com_45 +5922 reportabuse:com_46 +5923 reportabuse:com_47 +5924 reportabuse:com_48 +5925 reportabuse:com_49 +5926 reportabuse:com_50 +5927 reportabuse:com_51 +5928 reportabuse:com_52 +5929 reportabuse:com_53 +5930 reportabuse:com_54 +5931 reportabuse:com_55 +5932 reportabuse:com_56 +5933 reportabuse:com_57 +5934 reportabuse:com_58 +5935 reportabuse:com_59 +5936 reportabuse:com_60 +5937 reportabuse:com_61 +5938 reportabuse:com_62 +5939 reportabuse:com_63 +5940 reportabuse:com_64 +5941 reportabuse:com_65 +5942 reportabuse:com_66 +5943 reportabuse:com_67 +5944 reportabuse:com_68 +5945 reportabuse:com_69 +5946 reportabuse:com_70 +5947 reportabuse:com_71 +5948 reportabuse:com_72 +5949 reportabuse:com_73 +5950 reportabuse:com_74 +5951 reportabuse:com_75 +5952 reportabuse:com_76 +5953 reportabuse:com_77 +5954 reportabuse:com_78 +5955 reportabuse:com_79 +5956 reportabuse:com_80 +5957 reportabuse:com_81 +5958 reportabuse:com_82 +5959 reportabuse:com_83 +5960 reportabuse:com_84 +5961 reportabuse:com_85 +5962 reportabuse:com_86 +5963 reportabuse:com_87 +5964 reportabuse:com_88 +5965 reportabuse:com_89 +5966 reportabuse:com_90 +5967 reportabuse:com_91 +5968 reportabuse:com_92 +5969 reportabuse:com_93 +5970 reportabuse:com_94 +5971 reportabuse:com_95 +5972 reportabuse:com_96 +5973 reportabuse:com_97 +5974 reportabuse:com_98 +5975 reportabuse:com_99 +5976 reportabuse:com_100 +5977 reportabuse:com_101 +5978 reportabuse:com_102 +5979 reportabuse:com_103 +5980 reportabuse:com_104 +5981 reportabuse:com_105 +5982 reportabuse:com_106 +5983 reportabuse:com_107 +5984 reportabuse:com_108 +5985 reportabuse:com_109 +5986 reportabuse:com_110 +5987 reportabuse:com_111 +5988 music:com_153 +5989 music:com_154 +5990 music:com_155 +5991 tickets_shop:com_102 +5992 tickets_shop:com_103 +5994 welcome_screen:com_0 +5995 welcome_screen:com_1 +5996 welcome_screen:com_2 +5997 welcome_screen:com_3 +5998 welcome_screen:com_4 +5999 welcome_screen:com_5 +6000 welcome_screen:com_6 +6001 welcome_screen:com_7 +6002 welcome_screen:com_8 +6003 welcome_screen:com_9 +6004 welcome_screen:com_10 +6005 welcome_screen:com_11 +6006 welcome_screen:com_12 +6007 welcome_screen:com_13 +6008 welcome_screen:com_14 +6009 welcome_screen:com_15 +6010 welcome_screen:com_16 +6011 welcome_screen:com_17 +6012 welcome_screen:com_18 +6013 welcome_screen:com_19 +6014 welcome_screen:com_20 +6015 welcome_screen:com_21 +6016 welcome_screen:com_22 +6017 welcome_screen:com_23 +6018 welcome_screen:com_24 +6019 welcome_screen:com_25 +6020 welcome_screen:com_26 +6021 welcome_screen:com_27 +6022 welcome_screen:com_28 +6023 welcome_screen:com_29 +6024 welcome_screen:com_30 +6025 welcome_screen:com_31 +6026 welcome_screen:com_32 +6027 welcome_screen:com_33 +6028 welcome_screen:com_34 +6029 welcome_screen:com_35 +6030 welcome_screen:com_36 +6031 welcome_screen:com_37 +6032 welcome_screen:com_38 +6033 welcome_screen:com_39 +6034 welcome_screen:com_40 +6035 welcome_screen:com_41 +6036 welcome_screen:com_42 +6037 welcome_screen:com_43 +6038 welcome_screen:com_44 +6039 welcome_screen:com_45 +6040 welcome_screen:com_46 +6041 welcome_screen:com_47 +6042 welcome_screen:com_48 +6043 welcome_screen:com_49 +6044 welcome_screen:com_50 +6045 welcome_screen:com_51 +6046 welcome_screen:com_52 +6047 welcome_screen:com_53 +6048 welcome_screen:com_54 +6049 welcome_screen:com_55 +6050 welcome_screen:com_56 +6051 welcome_screen:com_57 +6052 welcome_screen:com_58 +6053 welcome_screen:com_59 +6054 welcome_screen:com_60 +6055 welcome_screen:com_61 +6056 welcome_screen:com_62 +6057 welcome_screen:com_63 +6058 welcome_screen:com_64 +6059 welcome_screen:com_65 +6060 welcome_screen:com_66 +6061 welcome_screen:com_67 +6062 welcome_screen:com_68 +6063 welcome_screen:com_69 +6064 welcome_screen:com_70 +6065 welcome_screen:com_71 +6066 welcome_screen:com_72 +6067 welcome_screen:com_73 +6068 welcome_screen:com_74 +6069 welcome_screen:com_75 +6070 welcome_screen:com_76 +6071 welcome_screen:com_77 +6072 welcome_screen:com_78 +6074 welcome_screen_warning:com_0 +6075 welcome_screen_warning:com_1 +6076 welcome_screen_warning:com_2 +6077 welcome_screen_warning:com_3 +6078 welcome_screen_warning:com_4 +6079 welcome_screen_warning:com_5 +6080 welcome_screen_warning:com_6 +6081 welcome_screen_warning:com_7 +6082 welcome_screen_warning:com_8 +6083 welcome_screen_warning:com_9 +6084 welcome_screen_warning:com_10 +6085 welcome_screen_warning:com_11 +6086 welcome_screen_warning:com_12 +6087 welcome_screen_warning:com_13 +6088 welcome_screen_warning:com_14 +6089 welcome_screen_warning:com_15 +6090 welcome_screen_warning:com_16 +6091 welcome_screen_warning:com_17 +6092 welcome_screen_warning:com_18 +6093 welcome_screen_warning:com_19 +6094 welcome_screen_warning:com_20 +6095 welcome_screen_warning:com_21 +6096 welcome_screen_warning:com_22 +6097 welcome_screen_warning:com_23 +6098 welcome_screen_warning:com_24 +6099 welcome_screen_warning:com_25 +6100 welcome_screen_warning:com_26 +6101 welcome_screen_warning:com_40 +6102 welcome_screen_warning:com_28 +6103 welcome_screen_warning:com_29 +6104 welcome_screen_warning:com_30 +6105 welcome_screen_warning:com_31 +6106 welcome_screen_warning:com_32 +6107 welcome_screen_warning:com_33 +6108 welcome_screen_warning:com_34 +6109 welcome_screen_warning:com_35 +6110 welcome_screen_warning:com_36 +6111 welcome_screen_warning:com_37 +6112 welcome_screen_warning:com_38 +6113 welcome_screen_warning:com_39 +6114 levelup_ranged:line2 +6115 welcome_screen_warning:com_41 +6116 welcome_screen_warning:com_42 +6117 welcome_screen_warning:com_43 +6118 welcome_screen_warning:com_44 +6119 welcome_screen_warning:com_45 +6120 welcome_screen_warning:com_46 +6121 welcome_screen_warning:com_47 +6122 welcome_screen_warning:com_48 +6123 welcome_screen_warning:com_49 +6124 welcome_screen_warning:com_50 +6125 welcome_screen_warning:com_51 +6126 welcome_screen_warning:com_52 +6127 welcome_screen_warning:com_53 +6128 welcome_screen_warning:com_54 +6129 welcome_screen_warning:com_55 +6130 welcome_screen_warning:com_56 +6131 welcome_screen_warning:com_57 +6132 welcome_screen_warning:com_73 +6133 welcome_screen_warning:com_59 +6134 welcome_screen_warning:com_60 +6135 welcome_screen_warning:com_61 +6136 welcome_screen_warning:com_62 +6137 welcome_screen_warning:com_63 +6138 welcome_screen_warning:com_64 +6139 welcome_screen_warning:com_65 +6140 welcome_screen_warning:com_66 +6141 welcome_screen_warning:com_67 +6142 welcome_screen_warning:com_68 +6143 welcome_screen_warning:com_69 +6144 welcome_screen_warning:com_70 +6145 welcome_screen_warning:com_71 +6146 welcome_screen_warning:com_72 +6147 levelup_ranged:continue +6148 welcome_screen_warning:com_74 +6149 welcome_screen_warning:com_75 +6150 welcome_screen_warning:com_76 +6151 welcome_screen_warning:com_77 +6152 welcome_screen_warning:com_78 +6153 welcome_screen_warning:com_79 +6154 welcome_screen_warning:com_80 +6155 welcome_screen_warning:com_81 +6156 questscroll:com_8 +6157 options_ld:com_2 +6158 questscroll:com_10 +6159 questscroll_itgronigen:com_1 +6160 questscroll_itgronigen:com_3 +6161 questscroll_itgronigen:com_4 +6162 questscroll_itgronigen:com_7 +6163 questscroll_itgronigen:com_8 +6164 questscroll_itgronigen:com_9 +6165 questscroll_itgronigen:com_10 +6166 questscroll_fluffs:com_1 +6167 questscroll_fluffs:com_3 +6168 questscroll_fluffs:com_4 +6169 questscroll_fluffs:com_7 +6170 questscroll_fluffs:com_8 +6171 questscroll_fluffs:com_9 +6172 questscroll_fluffs:com_10 +6174 objbox_np4:com_0 +6175 objbox_np4:com_1 +6176 objbox_np4:com_2 +6177 objbox_np4:com_3 +6178 objbox_np4:com_4 +6180 tutorial_text:title +6181 tutorial_text:line1 +6182 tutorial_text:line2 +6183 tutorial_text:line3 +6184 tutorial_text:line4 +6185 music:com_156 +6186 welcome_screen_warning:com_27 +6187 welcome_screen_warning:com_58 +6188 welcome_screen_warning:com_82 +6189 welcome_screen_warning:com_83 +6190 welcome_screen_warning:com_84 +6191 welcome_screen_warning:com_85 +6192 welcome_screen_warning:com_86 +6193 welcome_screen_warning:com_87 +6194 welcome_screen_warning:com_88 +6195 welcome_screen_warning:com_89 +6196 welcome_screen_warning:com_90 +6197 welcome_screen_warning:com_91 +6198 welcome_screen_warning:com_92 +6199 welcome_screen_warning:com_93 +6200 welcome_screen_warning:com_94 +6201 welcome_screen_warning:com_95 +6202 welcome_screen_warning:com_96 +6203 welcome_screen_warning:com_97 +6204 levelup_ranged:icon +6205 levelup_ranged:icon2 +6207 levelup_strength:line1 +6208 levelup_strength:line2 +6209 levelup_strength:continue +6210 levelup_strength:icon +6212 levelup_magic:line1 +6213 levelup_magic:line2 +6214 levelup_magic:continue +6215 levelup_magic:icon +6217 levelup_hitpoints:line1 +6218 levelup_hitpoints:line2 +6219 levelup_hitpoints:continue +6220 levelup_hitpoints:icon +6222 levelup_smithing:line1 +6223 levelup_smithing:line2 +6224 levelup_smithing:continue +6225 levelup_smithing:icon +6227 levelup_cooking:line1 +6228 levelup_cooking:line2 +6229 levelup_cooking:continue +6230 levelup_cooking:icon +6232 levelup_fletching:line1 +6233 levelup_fletching:line2 +6234 levelup_fletching:continue +6235 levelup_fletching:icon +6236 levelup_fletching:icon2 +6238 levelup_herblore:line1 +6239 levelup_herblore:line2 +6240 levelup_herblore:continue +6241 levelup_herblore:icon +6243 levelup_prayer:line1 +6244 levelup_prayer:line2 +6245 levelup_prayer:continue +6246 levelup_prayer:icon +6248 levelup_attack:line1 +6249 levelup_attack:line2 +6250 levelup_attack:continue +6251 levelup_attack:icon +6252 levelup_attack:icon2 +6254 levelup_defence:line1 +6255 levelup_defence:line2 +6256 levelup_defence:continue +6257 levelup_defence:icon +6259 levelup_fishing:line1 +6260 levelup_fishing:line2 +6261 levelup_fishing:continue +6262 levelup_fishing:icon +6264 levelup_crafting:line1 +6265 levelup_crafting:line2 +6266 levelup_crafting:continue +6267 levelup_crafting:icon +6268 levelup_crafting:icon2 +6269 music:com_203 +6270 music:com_204 +6271 music:com_205 +6272 music:com_206 +6273 options_ld:com_3 +6274 options_ld:com_4 +6275 options_ld:com_5 +6276 options_ld:com_6 +6277 options_ld:com_7 +6278 options_ld:com_8 +6279 options_ld:com_9 +6280 options_ld:com_10 +6281 options_ld:com_11 +6282 options_ld:com_12 +6283 options_ld:com_13 +6284 options_ld:com_14 +6285 options_ld:com_15 +6286 options_ld:com_16 +6287 options_ld:com_17 +6288 options_ld:com_18 +6289 options_ld:com_19 +6290 options_ld:com_20 +6291 options_ld:com_21 +6292 options_ld:com_22 +6293 options_ld:com_23 +6294 options_ld:com_24 +6295 options_ld:com_25 +6296 options_ld:com_26 +6297 music:com_157 +6298 music:com_158 +6300 music_ld:com_0 +6301 music_ld:com_1 +6302 music_ld:com_2 +6303 music_ld:com_3 +6304 music_ld:com_4 +6305 music_ld:com_5 +6306 music_ld:com_6 +6307 music_ld:com_7 +6309 duel_scoreboard:com_0 +6310 duel_scoreboard:com_1 +6311 duel_scoreboard:com_2 +6312 duel_scoreboard:com_3 +6313 duel_scoreboard:com_4 +6314 duel_scoreboard:com_5 +6315 duel_scoreboard:com_6 +6316 duel_scoreboard:com_7 +6317 duel_scoreboard:com_8 +6318 duel_scoreboard:com_9 +6319 duel_scoreboard:com_10 +6320 duel_scoreboard:com_11 +6321 duel_scoreboard:com_12 +6322 duel_scoreboard:com_13 +6323 duel_scoreboard:com_14 +6324 duel_scoreboard:com_15 +6325 duel_scoreboard:com_16 +6326 duel_scoreboard:com_17 +6327 duel_scoreboard:com_18 +6328 duel_scoreboard:com_19 +6329 duel_scoreboard:com_20 +6330 duel_scoreboard:com_21 +6331 duel_scoreboard:com_22 +6332 duel_scoreboard:com_23 +6333 duel_scoreboard:com_24 +6334 duel_scoreboard:com_25 +6335 duel_scoreboard:com_26 +6336 duel_scoreboard:com_27 +6337 duel_scoreboard:com_28 +6338 duel_scoreboard:com_29 +6339 duel_scoreboard:com_30 +6340 duel_scoreboard:com_31 +6341 duel_scoreboard:com_32 +6342 duel_scoreboard:com_33 +6343 duel_scoreboard:com_34 +6344 duel_scoreboard:com_35 +6345 duel_scoreboard:com_36 +6346 duel_scoreboard:com_37 +6347 duel_scoreboard:com_38 +6348 duel_scoreboard:com_39 +6349 duel_scoreboard:com_40 +6350 duel_scoreboard:com_41 +6351 duel_scoreboard:com_42 +6352 duel_scoreboard:com_43 +6353 duel_scoreboard:com_44 +6354 duel_scoreboard:com_45 +6355 duel_scoreboard:com_46 +6356 duel_scoreboard:com_47 +6357 duel_scoreboard:com_48 +6358 duel_scoreboard:com_49 +6359 duel_scoreboard:com_50 +6360 duel_scoreboard:com_51 +6361 duel_scoreboard:com_52 +6362 duel_scoreboard:com_53 +6363 duel_scoreboard:com_54 +6364 duel_scoreboard:com_55 +6365 duel_scoreboard:com_56 +6366 duel_scoreboard:com_57 +6367 duel_scoreboard:com_58 +6368 duel_scoreboard:com_59 +6369 duel_scoreboard:com_60 +6370 duel_scoreboard:com_61 +6371 duel_scoreboard:com_62 +6372 duel_scoreboard:com_63 +6373 duel_scoreboard:com_64 +6374 duel_scoreboard:com_65 +6375 duel_scoreboard:com_66 +6376 duel_scoreboard:com_67 +6377 duel_scoreboard:com_68 +6378 duel_scoreboard:com_69 +6379 duel_scoreboard:com_70 +6380 duel_scoreboard:com_71 +6381 duel_scoreboard:com_72 +6382 duel_scoreboard:com_73 +6383 duel_scoreboard:com_74 +6384 duel_scoreboard:com_75 +6385 duel_scoreboard:com_76 +6386 duel_scoreboard:com_77 +6387 duel_scoreboard:com_78 +6388 duel_scoreboard:com_79 +6389 duel_scoreboard:com_80 +6390 duel_scoreboard:com_81 +6391 duel_scoreboard:com_82 +6392 duel_scoreboard:com_83 +6393 duel_scoreboard:com_84 +6394 duel_scoreboard:com_85 +6395 duel_scoreboard:com_86 +6396 duel_scoreboard:com_87 +6397 duel_scoreboard:com_88 +6398 duel_scoreboard:com_89 +6399 duel_scoreboard:com_90 +6400 duel_scoreboard:com_91 +6401 duel_scoreboard:com_92 +6402 duel_scoreboard:duel1 +6403 duel_scoreboard:duel2 +6404 duel_scoreboard:duel3 +6405 duel_scoreboard:duel4 +6406 duel_scoreboard:duel5 +6407 duel_scoreboard:duel6 +6408 duel_scoreboard:duel7 +6409 duel_scoreboard:duel8 +6410 duel_scoreboard:duel9 +6411 duel_scoreboard:duel10 +6413 duel_confirm:com_0 +6414 duel_confirm:com_1 +6415 duel_confirm:com_2 +6416 duel_confirm:com_3 +6417 duel_confirm:com_4 +6418 duel_confirm:com_5 +6419 duel_confirm:com_6 +6420 duel_confirm:com_7 +6421 duel_confirm:com_8 +6422 duel_confirm:com_9 +6423 duel_confirm:com_10 +6424 duel_confirm:com_11 +6425 duel_confirm:com_12 +6426 duel_confirm:com_13 +6427 duel_confirm:com_14 +6428 duel_confirm:com_15 +6429 duel_confirm:com_16 +6430 duel_confirm:com_17 +6431 duel_confirm:com_18 +6432 duel_confirm:com_19 +6433 duel_confirm:com_20 +6434 duel_confirm:com_21 +6435 duel_confirm:com_22 +6436 duel_confirm:com_23 +6437 duel_confirm:com_24 +6438 duel_confirm:com_25 +6439 duel_confirm:com_26 +6440 duel_confirm:com_27 +6441 duel_confirm:com_28 +6442 duel_confirm:com_29 +6443 duel_confirm:com_30 +6444 duel_confirm:com_31 +6445 duel_confirm:com_32 +6446 duel_confirm:com_33 +6447 duel_confirm:com_34 +6448 duel_confirm:com_35 +6449 duel_confirm:com_36 +6450 duel_confirm:com_37 +6451 duel_confirm:com_38 +6452 duel_confirm:com_39 +6453 duel_confirm:com_40 +6454 duel_confirm:com_41 +6455 duel_confirm:com_42 +6456 duel_confirm:com_43 +6457 duel_confirm:com_44 +6458 duel_confirm:com_45 +6459 duel_confirm:com_46 +6460 duel_confirm:com_47 +6461 duel_confirm:com_48 +6462 duel_confirm:com_49 +6463 duel_confirm:com_50 +6464 duel_confirm:com_51 +6465 duel_confirm:com_52 +6466 duel_confirm:com_53 +6467 duel_confirm:com_54 +6468 duel_confirm:com_55 +6469 duel_confirm:com_56 +6470 duel_confirm:com_57 +6471 duel_confirm:com_58 +6472 duel_confirm:com_59 +6473 duel_confirm:com_60 +6474 duel_confirm:com_61 +6475 duel_confirm:com_62 +6476 duel_confirm:com_63 +6477 duel_confirm:com_64 +6478 duel_confirm:com_65 +6479 duel_confirm:com_66 +6480 duel_confirm:com_67 +6481 duel_confirm:com_68 +6482 duel_confirm:com_69 +6483 duel_confirm:com_70 +6484 duel_confirm:com_71 +6485 duel_confirm:com_72 +6486 duel_confirm:com_73 +6487 duel_confirm:com_74 +6488 duel_confirm:com_75 +6489 duel_confirm:com_76 +6490 duel_confirm:com_77 +6491 duel_confirm:com_78 +6492 duel_confirm:com_79 +6493 duel_confirm:com_80 +6494 duel_confirm:com_81 +6495 duel_confirm:com_82 +6496 duel_confirm:com_83 +6497 duel_confirm:com_84 +6498 duel_confirm:com_85 +6499 duel_confirm:com_86 +6500 duel_confirm:com_87 +6501 duel_confirm:com_92 +6502 duel_confirm:otherinv_nothing +6503 duel_confirm:com_88 +6504 duel_confirm:com_94 +6505 duel_confirm:com_97 +6506 duel_confirm:obstacles +6507 duel_confirm:inv +6508 duel_confirm:otherinv +6509 duel_confirm:inv_nothing +6510 duel_confirm:com_99 +6511 duel_confirm:com_100 +6512 duel_confirm:com_101 +6513 duel_confirm:com_102 +6514 duel_confirm:com_103 +6515 duel_confirm:com_104 +6516 duel_confirm:com_91 +6517 duel_confirm:com_96 +6518 duel_confirm:com_105 +6519 duel_confirm:com_114 +6520 duel_confirm:accept +6521 duel_confirm:accept_text +6522 duel_confirm:decline +6523 duel_confirm:decline_text +6524 duel_confirm:com_108 +6525 duel_confirm:com_117 +6526 duel_confirm:com_109 +6527 duel_confirm:com_118 +6528 duel_confirm:com_110 +6529 duel_confirm:com_119 +6530 duel_confirm:com_111 +6531 duel_confirm:com_120 +6532 duel_confirm:com_112 +6533 duel_confirm:com_113 +6534 duel_confirm:com_121 +6535 duel_confirm:no_forfeit_text +6536 duel_confirm:no_magic_text +6537 duel_confirm:no_ranged_text +6538 duel_confirm:no_melee_text +6539 duel_confirm:no_weapons_text +6540 duel_confirm:no_potions_text +6541 duel_confirm:no_food_text +6542 duel_confirm:no_prayer_text +6543 duel_confirm:no_movement_text +6544 duel_confirm:no_armour_text +6545 duel_confirm:com_133 +6546 duel_confirm:com_134 +6547 duel_confirm:com_135 +6548 duel_confirm:com_136 +6549 duel_confirm:com_137 +6550 duel_confirm:com_138 +6551 duel_confirm:com_139 +6552 duel_confirm:com_140 +6553 duel_confirm:com_141 +6554 duel_confirm:com_142 +6555 duel_confirm:com_143 +6556 duel_confirm:com_144 +6557 duel_confirm:com_145 +6558 duel_confirm:com_146 +6559 duel_confirm:com_147 +6560 duel_confirm:com_148 +6561 duel_confirm:com_149 +6562 duel_confirm:com_150 +6563 duel_confirm:com_151 +6564 duel_confirm:com_152 +6565 duel_confirm:com_153 +6566 duel_confirm:com_154 +6567 duel_confirm:com_155 +6568 duel_confirm:com_156 +6569 duel_confirm:com_122 +6570 duel_confirm:com_157 +6571 duel_confirm:status +6572 duel_confirm:com_159 +6574 duel_side:inv +6576 duel_select_type:com_0 +6577 duel_select_type:com_1 +6578 duel_select_type:com_2 +6579 duel_select_type:com_3 +6580 duel_select_type:com_4 +6581 duel_select_type:com_5 +6582 duel_select_type:com_6 +6583 duel_select_type:com_7 +6584 duel_select_type:com_8 +6585 duel_select_type:com_9 +6586 duel_select_type:com_10 +6587 duel_select_type:com_11 +6588 duel_select_type:com_12 +6589 duel_select_type:com_13 +6590 duel_select_type:com_14 +6591 duel_select_type:com_15 +6592 duel_select_type:com_16 +6593 duel_select_type:com_17 +6594 duel_select_type:com_18 +6595 duel_select_type:com_19 +6596 duel_select_type:com_20 +6597 duel_select_type:com_21 +6598 duel_select_type:com_22 +6599 duel_select_type:com_23 +6600 duel_select_type:com_24 +6601 duel_select_type:com_25 +6602 duel_select_type:com_26 +6603 duel_select_type:com_27 +6604 duel_select_type:com_28 +6605 duel_select_type:com_29 +6606 duel_select_type:com_30 +6607 duel_select_type:com_31 +6608 duel_select_type:com_32 +6609 duel_select_type:com_33 +6610 duel_select_type:com_34 +6611 duel_select_type:com_35 +6612 duel_select_type:com_36 +6613 duel_select_type:com_37 +6614 duel_select_type:com_38 +6615 duel_select_type:com_39 +6616 duel_select_type:com_40 +6617 duel_select_type:com_41 +6618 duel_select_type:com_42 +6619 duel_select_type:com_43 +6620 duel_select_type:com_44 +6621 duel_select_type:com_45 +6622 duel_select_type:com_46 +6623 duel_select_type:com_47 +6624 duel_select_type:com_48 +6625 duel_select_type:com_49 +6626 duel_select_type:com_50 +6627 duel_select_type:com_51 +6628 duel_select_type:com_52 +6629 duel_select_type:com_53 +6630 duel_select_type:com_54 +6631 duel_select_type:com_55 +6632 duel_select_type:com_56 +6633 duel_select_type:com_57 +6634 duel_select_type:com_58 +6635 duel_select_type:com_59 +6636 duel_select_type:com_60 +6637 duel_select_type:com_61 +6638 duel_select_type:com_62 +6639 duel_select_type:com_63 +6640 duel_select_type:com_64 +6641 duel_select_type:com_65 +6642 duel_select_type:com_66 +6643 duel_select_type:com_67 +6644 duel_select_type:com_68 +6645 duel_select_type:com_69 +6646 duel_select_type:com_70 +6647 duel_select_type:com_71 +6648 duel_select_type:com_72 +6649 duel_select_type:com_73 +6650 duel_select_type:com_74 +6651 duel_select_type:com_75 +6652 duel_select_type:com_76 +6653 duel_select_type:com_77 +6654 duel_select_type:com_78 +6655 duel_select_type:com_79 +6656 duel_select_type:com_80 +6657 duel_select_type:com_81 +6658 duel_select_type:com_82 +6659 duel_select_type:com_83 +6660 duel_select_type:com_84 +6661 duel_select_type:com_85 +6662 duel_select_type:com_86 +6663 duel_select_type:com_87 +6664 duel_select_type:com_88 +6665 duel_select_type:com_94 +6666 duel_select_type:com_97 +6667 duel_select_type:com_100 +6668 duel_select_type:com_109 +6669 duel_select_type:inv +6670 duel_select_type:otherinv +6671 duel_select_type:otherplayer +6672 duel_select_type:com_99 +6673 duel_select_type:com_96 +6674 duel_select_type:accept +6675 duel_select_type:accept_text +6676 duel_select_type:decline +6677 duel_select_type:decline_text +6678 duel_select_type:com_89 +6679 duel_select_type:com_90 +6680 duel_select_type:com_91 +6681 duel_select_type:com_103 +6682 duel_select_type:com_92 +6683 duel_select_type:com_112 +6684 duel_select_type:status +6685 duel_select_type:com_113 +6686 duel_select_type:com_104 +6687 duel_select_type:com_114 +6688 duel_select_type:com_105 +6689 duel_select_type:com_115 +6690 duel_select_type:com_106 +6691 duel_select_type:com_116 +6692 duel_select_type:com_107 +6693 duel_select_type:com_108 +6694 duel_select_type:com_117 +6695 duel_select_type:com_120 +6696 duel_select_type:no_forfeit_text +6697 duel_select_type:no_magic_text +6698 duel_select_type:no_ranged_text +6699 duel_select_type:no_melee_text +6700 duel_select_type:no_weapons_text +6701 duel_select_type:no_potions_text +6702 duel_select_type:no_food_text +6703 duel_select_type:no_prayer_text +6704 duel_select_type:no_movement_text +6705 duel_select_type:no_armour_text +6706 duel_select_type:com_131 +6707 duel_select_type:com_132 +6708 duel_select_type:com_133 +6709 duel_select_type:com_134 +6710 duel_select_type:com_135 +6711 duel_select_type:com_136 +6712 duel_select_type:com_137 +6713 duel_select_type:com_138 +6714 duel_select_type:com_139 +6715 duel_select_type:com_140 +6716 duel_select_type:com_141 +6717 duel_select_type:com_142 +6718 duel_select_type:com_143 +6719 duel_select_type:com_144 +6720 duel_select_type:com_93 +6721 duel_select_type:no_forfeit +6722 duel_select_type:no_movement +6723 duel_select_type:no_weapons +6724 duel_select_type:no_armour +6725 duel_select_type:no_ranged +6726 duel_select_type:no_melee +6727 duel_select_type:no_magic +6728 duel_select_type:no_potions +6729 duel_select_type:no_food +6730 duel_select_type:no_prayer +6731 duel_select_type:obstacle_text +6732 duel_select_type:obstacles +6734 duel_win:com_0 +6735 duel_win:com_1 +6736 duel_win:com_2 +6737 duel_win:com_3 +6738 duel_win:com_4 +6739 duel_win:com_5 +6740 duel_win:com_6 +6741 duel_win:com_7 +6742 duel_win:com_8 +6743 duel_win:com_9 +6744 duel_win:com_10 +6745 duel_win:com_11 +6746 duel_win:com_12 +6747 duel_win:com_13 +6748 duel_win:com_14 +6749 duel_win:com_15 +6750 duel_win:com_16 +6751 duel_win:com_17 +6752 duel_win:com_18 +6753 duel_win:com_19 +6754 duel_win:com_20 +6755 duel_win:com_21 +6756 duel_win:com_22 +6757 duel_win:com_23 +6758 duel_win:com_24 +6759 duel_win:com_25 +6760 duel_win:com_26 +6761 duel_win:com_27 +6762 duel_win:com_28 +6763 duel_win:com_29 +6764 duel_win:com_30 +6765 duel_win:com_31 +6766 duel_win:com_32 +6767 duel_win:com_33 +6768 duel_win:com_34 +6769 duel_win:com_35 +6770 duel_win:com_36 +6771 duel_win:com_37 +6772 duel_win:com_38 +6773 duel_win:com_39 +6774 duel_win:com_40 +6775 duel_win:com_41 +6776 duel_win:com_42 +6777 duel_win:com_43 +6778 duel_win:com_44 +6779 duel_win:com_45 +6780 duel_win:com_46 +6781 duel_win:com_47 +6782 duel_win:com_48 +6783 duel_win:com_49 +6784 duel_win:com_50 +6785 duel_win:com_51 +6786 duel_win:com_52 +6787 duel_win:com_53 +6788 duel_win:com_54 +6789 duel_win:com_55 +6790 duel_win:com_56 +6791 duel_win:com_57 +6792 duel_win:com_58 +6793 duel_win:com_59 +6794 duel_win:com_60 +6795 duel_win:com_61 +6796 duel_win:com_62 +6797 duel_win:com_63 +6798 duel_win:com_64 +6799 duel_win:com_65 +6800 duel_win:com_66 +6801 duel_win:com_67 +6802 duel_win:com_68 +6803 duel_win:com_69 +6804 duel_win:com_70 +6805 duel_win:com_71 +6806 duel_win:com_72 +6807 duel_win:com_73 +6808 duel_win:com_74 +6809 duel_win:com_75 +6810 duel_win:com_76 +6811 duel_win:com_77 +6812 duel_win:com_78 +6813 duel_win:com_79 +6814 duel_win:com_80 +6815 duel_win:com_81 +6816 duel_win:com_82 +6817 duel_win:com_83 +6818 duel_win:com_84 +6819 duel_win:com_85 +6820 duel_win:com_86 +6821 duel_win:com_87 +6822 duel_win:spoils +6823 duel_win:com_89 +6824 duel_win:com_90 +6825 duel_win:com_99 +6826 duel_win:com_91 +6827 duel_win:com_92 +6828 duel_win:com_93 +6829 duel_win:com_94 +6830 duel_win:com_95 +6831 duel_win:com_96 +6832 duel_win:com_97 +6833 duel_win:com_98 +6834 duel_win:com_100 +6835 duel_win:com_101 +6836 duel_win:com_102 +6837 duel_win:com_103 +6838 duel_win:com_104 +6839 duel_win:combat_level +6840 duel_win:displayname +6841 duel_win:com_107 +6842 music:com_160 +6843 music:com_161 +6844 staff_spells:com_59 +6845 staff_spells:com_61 +6846 staff_spells:com_67 +6847 staff_spells:com_69 +6848 staff_spells:com_77 +6849 staff_spells:com_79 +6850 staff_spells:com_87 +6851 staff_spells:com_89 +6852 staff_spells:com_97 +6853 staff_spells:com_99 +6854 staff_spells:com_105 +6855 staff_spells:com_107 +6856 staff_spells:com_115 +6857 staff_spells:com_117 +6858 staff_spells:com_125 +6859 staff_spells:com_127 +6860 staff_spells:com_135 +6861 staff_spells:com_137 +6862 staff_spells:com_143 +6863 staff_spells:com_145 +6864 staff_spells:com_153 +6865 staff_spells:com_155 +6866 staff_spells:com_160 +6867 music:com_162 +6868 wilderness_warning:com_17 +6869 wilderness_warning:com_18 +6870 wilderness_warning:com_19 +6871 wilderness_warning:com_20 +6872 wilderness_warning:com_21 +6873 wilderness_warning:com_22 +6874 wilderness_warning:com_23 +6875 wilderness_warning:com_24 +6876 wilderness_warning:com_25 +6877 wilderness_warning:com_26 +6878 wilderness_warning:com_27 +6879 wilderness_warning:com_28 +6880 wilderness_warning:com_29 +6881 wilderness_warning:com_30 +6882 wilderness_warning:com_31 +6883 wilderness_warning:com_32 +6884 wilderness_warning:com_33 +6885 wilderness_warning:com_34 +6886 wilderness_warning:com_35 +6887 wilderness_warning:com_36 +6888 wilderness_warning:com_37 +6889 wilderness_warning:com_38 +6890 wilderness_warning:com_39 +6891 wilderness_warning:com_40 +6892 wilderness_warning:com_41 +6893 wilderness_warning:com_42 +6894 wilderness_warning:com_43 +6895 wilderness_warning:com_44 +6896 wilderness_warning:com_45 +6897 wilderness_warning:com_46 +6898 wilderness_warning:com_47 +6899 wilderness_warning:com_48 +6900 wilderness_warning:com_49 +6901 wilderness_warning:com_50 +6902 wilderness_warning:com_51 +6903 wilderness_warning:com_52 +6904 wilderness_warning:com_53 +6905 wilderness_warning:com_54 +6906 wilderness_warning:com_55 +6907 wilderness_warning:com_56 +6908 wilderness_warning:com_57 +6909 wilderness_warning:com_58 +6910 wilderness_warning:com_59 +6911 wilderness_warning:com_60 +6912 wilderness_warning:com_61 +6913 wilderness_warning:com_62 +6914 wilderness_warning:com_63 +6915 wilderness_warning:com_64 +6916 wilderness_warning:com_65 +6917 wilderness_warning:com_66 +6918 wilderness_warning:com_67 +6919 wilderness_warning:com_68 +6920 wilderness_warning:com_69 +6921 wilderness_warning:com_70 +6922 wilderness_warning:com_71 +6923 wilderness_warning:com_72 +6924 wilderness_warning:com_73 +6925 wilderness_warning:com_74 +6926 wilderness_warning:com_75 +6927 wilderness_warning:com_76 +6928 wilderness_warning:com_77 +6929 wilderness_warning:com_78 +6930 wilderness_warning:com_79 +6931 wilderness_warning:com_80 +6932 wilderness_warning:com_81 +6933 wilderness_warning:com_82 +6934 wilderness_warning:com_83 +6935 wilderness_warning:com_84 +6936 wilderness_warning:com_85 +6937 wilderness_warning:com_86 +6938 wilderness_warning:com_87 +6939 wilderness_warning:com_88 +6940 wilderness_warning:com_89 +6941 wilderness_warning:com_90 +6942 wilderness_warning:com_91 +6943 music:com_167 +6944 music:com_168 +6945 music:com_169 +6947 trail_sextant:com_0 +6948 trail_sextant:com_1 +6949 trail_sextant:com_2 +6950 trail_sextant:com_3 +6951 trail_sextant:com_4 +6952 trail_sextant:com_5 +6953 trail_sextant:com_6 +6954 trail_sextant:com_7 +6955 trail_sextant:com_8 +6956 trail_sextant:com_9 +6957 trail_sextant:com_10 +6958 trail_sextant:com_11 +6959 trail_sextant:get_location +6961 trail_reward:com_0 +6962 trail_reward:com_1 +6963 trail_reward:inv +6964 trail_reward:com_3 +6966 trail_cluelong:com_0 +6967 trail_cluelong:com_1 +6968 trail_cluelong:com_2 +6969 trail_cluelong:com_3 +6970 trail_cluelong:com_4 +6971 trail_cluelong:com_5 +6972 trail_cluelong:com_6 +6973 trail_cluelong:com_7 +6974 trail_cluelong:com_8 +6975 trail_cluelong:com_9 +6977 trail_puzzle:com_0 +6978 trail_puzzle:com_2 +6979 trail_puzzle:com_3 +6980 trail_puzzle:com_4 +6981 trail_puzzle:com_6 +6982 trail_puzzle:com_7 +6983 trail_puzzle:com_8 +6984 trail_puzzle:com_5 +6985 trail_puzzle:com_1 +6986 trail_puzzle:com_9 +6988 trail_clue:com_0 +6989 trail_clue:com_1 +6990 trail_clue:com_2 +6991 trail_clue:com_3 +6992 trail_clue:com_4 +6993 trail_clue:com_5 +6995 trail_map01:com_0 +6996 trail_map01:com_1 +6997 trail_map01:com_2 +6998 trail_map01:com_3 +6999 trail_map01:com_4 +7000 trail_map01:com_5 +7001 trail_map01:com_6 +7002 trail_map01:com_7 +7003 trail_map01:com_8 +7004 trail_map01:com_9 +7005 trail_map01:com_10 +7006 trail_map01:com_11 +7007 trail_map01:com_12 +7008 trail_map01:com_13 +7009 trail_map01:com_14 +7010 trail_map01:com_15 +7011 trail_map01:com_16 +7012 trail_map01:com_17 +7013 trail_map01:com_18 +7014 trail_map01:com_19 +7015 trail_map01:com_20 +7016 trail_map01:com_21 +7017 trail_map01:com_22 +7018 trail_map01:com_23 +7019 trail_map01:com_24 +7020 trail_map01:com_25 +7021 trail_map01:com_26 +7022 trail_map01:com_27 +7023 trail_map01:com_28 +7024 trail_map01:com_29 +7025 trail_map01:com_30 +7026 trail_map01:com_31 +7027 trail_map01:com_32 +7028 trail_map01:com_33 +7029 trail_map01:com_34 +7030 trail_map01:com_35 +7031 trail_map01:com_36 +7032 trail_map01:com_37 +7033 trail_map01:com_38 +7034 trail_map01:com_39 +7035 trail_map01:com_40 +7036 trail_map01:com_41 +7037 trail_map01:com_42 +7038 trail_map01:com_43 +7039 trail_map01:com_44 +7040 trail_map01:com_45 +7041 trail_map01:com_46 +7042 trail_map01:com_47 +7043 trail_map01:com_48 +7044 trail_map01:com_49 +7046 trail_map02:com_0 +7047 trail_map02:com_1 +7048 trail_map02:com_2 +7049 trail_map02:com_3 +7050 trail_map02:com_4 +7051 trail_map02:com_5 +7052 trail_map02:com_7 +7053 trail_map02:com_8 +7054 trail_map02:com_9 +7055 trail_map02:com_10 +7056 trail_map02:com_11 +7057 trail_map02:com_12 +7058 trail_map02:com_13 +7059 trail_map02:com_14 +7060 trail_map02:com_15 +7061 trail_map02:com_16 +7062 trail_map02:com_17 +7063 trail_map02:com_18 +7064 trail_map02:com_19 +7065 trail_map02:com_20 +7066 trail_map02:com_21 +7067 trail_map02:com_22 +7068 trail_map02:com_23 +7069 trail_map02:com_24 +7070 trail_map02:com_25 +7071 trail_map02:com_26 +7072 trail_map02:com_29 +7073 trail_map02:com_30 +7074 trail_map02:com_31 +7075 trail_map02:com_32 +7076 trail_map02:com_33 +7077 trail_map02:com_34 +7078 trail_map02:com_35 +7079 trail_map02:com_36 +7080 trail_map02:com_37 +7081 trail_map02:com_38 +7082 trail_map02:com_39 +7083 trail_map02:com_40 +7084 trail_map02:com_41 +7085 trail_map02:com_42 +7086 trail_map02:com_43 +7087 trail_map02:com_44 +7088 trail_map02:com_45 +7089 trail_map02:com_46 +7090 trail_map02:com_47 +7091 trail_map02:com_6 +7092 trail_map02:com_28 +7093 trail_map02:com_48 +7094 trail_map02:com_49 +7095 trail_map02:com_50 +7096 trail_map02:com_51 +7097 trail_map02:com_52 +7098 trail_map02:com_53 +7099 trail_map02:com_54 +7100 trail_map02:com_55 +7101 trail_map02:com_56 +7102 trail_map02:com_57 +7103 trail_map02:com_58 +7104 trail_map02:com_59 +7105 trail_map02:com_60 +7106 trail_map02:com_61 +7107 trail_map02:com_62 +7108 trail_map02:com_63 +7109 trail_map02:com_64 +7110 trail_map02:com_65 +7111 trail_map02:com_66 +7112 trail_map02:com_27 +7114 trail_map03:com_0 +7115 trail_map03:com_1 +7116 trail_map03:com_8 +7117 trail_map03:com_9 +7118 trail_map03:com_10 +7119 trail_map03:com_11 +7120 trail_map03:com_12 +7121 trail_map03:com_13 +7122 trail_map03:com_2 +7123 trail_map03:com_14 +7124 trail_map03:com_3 +7125 trail_map03:com_4 +7126 trail_map03:com_15 +7127 trail_map03:com_5 +7128 trail_map03:com_16 +7129 trail_map03:com_17 +7130 trail_map03:com_6 +7131 trail_map03:com_7 +7132 trail_map03:com_18 +7133 trail_map03:com_19 +7134 trail_map03:com_20 +7135 trail_map03:com_21 +7136 trail_map03:com_22 +7137 trail_map03:com_23 +7138 trail_map03:com_24 +7139 trail_map03:com_25 +7140 trail_map03:com_26 +7141 trail_map03:com_27 +7142 trail_map03:com_28 +7143 trail_map03:com_29 +7144 trail_map03:com_30 +7145 trail_map03:com_31 +7146 trail_map03:com_32 +7147 trail_map03:com_33 +7148 trail_map03:com_34 +7149 trail_map03:com_35 +7150 trail_map03:com_36 +7151 trail_map03:com_37 +7152 trail_map03:com_38 +7153 trail_map03:com_39 +7154 trail_map03:com_40 +7155 trail_map03:com_41 +7156 trail_map03:com_42 +7157 trail_map03:com_43 +7158 trail_map03:com_44 +7159 trail_map03:com_45 +7160 trail_map03:com_46 +7161 trail_map03:com_47 +7163 trail_map04:com_0 +7164 trail_map04:com_1 +7165 trail_map04:com_2 +7166 trail_map04:com_3 +7167 trail_map04:com_4 +7168 trail_map04:com_5 +7169 trail_map04:com_6 +7170 trail_map04:com_7 +7171 trail_map04:com_8 +7172 trail_map04:com_9 +7173 trail_map04:com_10 +7174 trail_map04:com_11 +7175 trail_map04:com_12 +7176 trail_map04:com_13 +7177 trail_map04:com_14 +7178 trail_map04:com_15 +7179 trail_map04:com_16 +7180 trail_map04:com_17 +7181 trail_map04:com_18 +7182 trail_map04:com_19 +7183 trail_map04:com_20 +7184 trail_map04:com_21 +7185 trail_map04:com_22 +7186 trail_map04:com_23 +7187 trail_map04:com_24 +7188 trail_map04:com_25 +7189 trail_map04:com_26 +7190 trail_map04:com_27 +7191 trail_map04:com_28 +7192 trail_map04:com_29 +7193 trail_map04:com_30 +7194 trail_map04:com_31 +7195 trail_map04:com_32 +7196 trail_map04:com_33 +7197 trail_map04:com_34 +7198 trail_map04:com_35 +7199 trail_map04:com_36 +7200 trail_map04:com_37 +7201 trail_map04:com_38 +7202 trail_map04:com_39 +7203 trail_map04:com_40 +7204 trail_map04:com_41 +7205 trail_map04:com_42 +7206 trail_map04:com_43 +7207 trail_map04:com_44 +7208 trail_map04:com_45 +7209 trail_map04:com_46 +7210 trail_map04:com_47 +7211 trail_map04:com_48 +7212 trail_map04:com_49 +7213 trail_map04:com_50 +7214 trail_map04:com_51 +7215 trail_map04:com_52 +7216 trail_map04:com_53 +7217 trail_map04:com_54 +7218 trail_map04:com_55 +7219 trail_map04:com_56 +7220 trail_map04:com_57 +7222 trail_map05:com_0 +7223 trail_map05:com_1 +7224 trail_map05:com_36 +7225 trail_map05:com_2 +7226 trail_map05:com_37 +7227 trail_map05:com_3 +7228 trail_map05:com_4 +7229 trail_map05:com_5 +7230 trail_map05:com_6 +7231 trail_map05:com_7 +7232 trail_map05:com_8 +7233 trail_map05:com_9 +7234 trail_map05:com_10 +7235 trail_map05:com_38 +7236 trail_map05:com_11 +7237 trail_map05:com_12 +7238 trail_map05:com_13 +7239 trail_map05:com_14 +7240 trail_map05:com_15 +7241 trail_map05:com_16 +7242 trail_map05:com_17 +7243 trail_map05:com_18 +7244 trail_map05:com_39 +7245 trail_map05:com_40 +7246 trail_map05:com_41 +7247 trail_map05:com_42 +7248 trail_map05:com_43 +7249 trail_map05:com_19 +7250 trail_map05:com_20 +7251 trail_map05:com_21 +7252 trail_map05:com_22 +7253 trail_map05:com_23 +7254 trail_map05:com_24 +7255 trail_map05:com_25 +7256 trail_map05:com_26 +7257 trail_map05:com_27 +7258 trail_map05:com_28 +7259 trail_map05:com_29 +7260 trail_map05:com_30 +7261 trail_map05:com_31 +7262 trail_map05:com_32 +7263 trail_map05:com_33 +7264 trail_map05:com_34 +7265 trail_map05:com_35 +7266 trail_map05:com_44 +7267 trail_map05:com_45 +7268 trail_map05:com_46 +7269 trail_map05:com_47 +7270 trail_map05:com_48 +7272 trail_map06:com_0 +7273 trail_map06:com_1 +7274 trail_map06:com_3 +7275 trail_map06:com_4 +7276 trail_map06:com_5 +7277 trail_map06:com_2 +7278 trail_map06:com_35 +7279 trail_map06:com_36 +7280 trail_map06:com_37 +7281 trail_map06:com_38 +7282 trail_map06:com_6 +7283 trail_map06:com_7 +7284 trail_map06:com_8 +7285 trail_map06:com_9 +7286 trail_map06:com_10 +7287 trail_map06:com_11 +7288 trail_map06:com_12 +7289 trail_map06:com_39 +7290 trail_map06:com_40 +7291 trail_map06:com_41 +7292 trail_map06:com_42 +7293 trail_map06:com_43 +7294 trail_map06:com_44 +7295 trail_map06:com_45 +7296 trail_map06:com_46 +7297 trail_map06:com_13 +7298 trail_map06:com_14 +7299 trail_map06:com_15 +7300 trail_map06:com_16 +7301 trail_map06:com_17 +7302 trail_map06:com_18 +7303 trail_map06:com_19 +7304 trail_map06:com_20 +7305 trail_map06:com_47 +7306 trail_map06:com_48 +7307 trail_map06:com_21 +7308 trail_map06:com_22 +7309 trail_map06:com_23 +7310 trail_map06:com_24 +7311 trail_map06:com_25 +7312 trail_map06:com_26 +7313 trail_map06:com_27 +7314 trail_map06:com_28 +7315 trail_map06:com_29 +7316 trail_map06:com_30 +7317 trail_map06:com_31 +7318 trail_map06:com_32 +7319 trail_map06:com_33 +7320 trail_map06:com_34 +7321 trail_map06:com_49 +7322 trail_map06:com_50 +7323 trail_map06:com_51 +7324 trail_map06:com_52 +7325 trail_map06:com_53 +7326 trail_map06:com_54 +7327 trail_map06:com_55 +7328 trail_map06:com_56 +7329 trail_map06:com_57 +7330 trail_map06:com_58 +7331 trail_map06:com_59 +7332 questlist:fortress +7333 questlist:cook +7334 questlist:demon +7335 questlist:runemysteries +7336 questlist:doric +7337 questlist:priest +7338 questlist:gobdip +7339 questlist:haunted +7340 questlist:imp +7341 questlist:hunt +7342 questlist:prince +7343 questlist:romeojuliet +7344 questlist:sheep +7345 questlist:blackarmgang +7346 questlist:squire +7347 questlist:vampire +7348 questlist:hetty +7349 questlist:itwatchtower +7350 questlist:waterfall +7351 questlist:ball +7352 questlist:biohazard +7353 questlist:cog +7354 questlist:itexam +7355 questlist:druid +7356 questlist:mcannon +7357 questlist:crest +7358 questlist:arena +7359 questlist:fishingcompo +7360 questlist:fluffs +7361 questlist:grandtree +7362 questlist:hazeelcult +7363 questlist:hero +7364 questlist:grail +7365 questlist:junglepotion +7366 questlist:legends +7367 questlist:zanaris +7368 questlist:arthur +7369 questlist:drunkmonk +7370 questlist:murder +7371 questlist:itgronigen +7372 questlist:elena +7373 questlist:scorpcatcher +7374 questlist:seaslug +7375 questlist:sheepherder +7376 questlist:zombiequeen +7378 questlist:ikov +7379 questlist:desertrescue +7380 questlist:tree +7381 questlist:totem +7382 questlist:upass +7383 questlist:dragon diff --git a/src/public/data/symbols/constant.sym b/src/public/data/symbols/constant.sym new file mode 100644 index 00000000..2de60bd5 --- /dev/null +++ b/src/public/data/symbols/constant.sym @@ -0,0 +1,943 @@ +not_talked_to_shantay 0 +talked_to_shantay 1 +paid_shantay_jail_fine 1 +put_in_shantay_jail 2 +ardougne_to_wilderness_coord 0_49_61_18_20 +wilderness_to_ardougne_coord 0_40_51_2_47 +khazard_tree 0_39_50_59_59 +varrock_tree 0_49_54_43_51 +village_tree 0_39_49_46_33 +stronghold_tree 0_38_53_29_52 +mage_arena_started 1 +mage_arena_ogre 2 +mage_arena_arachnid 3 +mage_arena_ethereal 4 +mage_arena_demon 5 +mage_arena_complete 6 +mage_arena_prayed_at_statue 7 +mage_arena_saradomin 8 +mage_arena_guthix 9 +mage_arena_zamorak 10 +mage_arena_staff_given 11 +mage_arena_start_coord 0_48_61_33_30 +mage_arena_finish_coord 0_39_73_44_44 +sparkling_pool_chamber_coord 0_39_73_13_17 +sparkling_pool_return_coord 0_39_73_46_46 +mage_arena_spell_last_cast 98 +mage_arena_spell_finished 99 +coal_truck_max 120 +wilderness_starting_z 3520 +left 0 +right 1 +lootdrop_duration 200 +true 1 +false 0 +min_32bit_int -2147483648 +max_32bit_int 2147483647 +exact_north 0 +exact_east 1 +exact_south 2 +exact_west 3 +exact_northeast 4 +exact_southeast 5 +exact_southwest 6 +exact_northwest 7 +loc_west 0 +loc_north 1 +loc_east 2 +loc_south 3 +string_empty +red_rgb 0xFF0000 +green_rgb 0xFF00 +blue_rgb 0xFF +yellow_rgb 0xFFFF00 +cyan_rgb 0xFFFF +magenta_rgb 0xFF00FF +white_rgb 0xFFFFFF +black_rgb 0x0 +lightred_rgb 0xFF9040 +darkred_rgb 0x800000 +darkblue_rgb 0x80 +orange1_rgb 0xFFB000 +orange2_rgb 0xFF7000 +orange3_rgb 0xFF3000 +green1_rgb 0xC0FF00 +green2_rgb 0x80FF00 +green3_rgb 0x40FF00 +dm_default 0 +dm_invspace 1 +dm_members_feature 2 +dm_farming_spade 64 +dm_farming_dibber 65 +dm_farming_patch_no_crops 66 +dm_farming_patch_weeding 67 +dm_farming_patch_planted 68 +dm_farming_trowel 69 +dm_need_plant_cure 70 +hint_center 2 +hint_west 3 +hint_east 4 +hint_south 5 +hint_north 6 +advance_agility_jingle advance agility +advance_agility_millis 7200 +advance_attack_jingle advance attack +advance_attack_millis 4800 +advance_attack_2_jingle advance attack2 +advance_attack_2_millis 10910 +advance_cooking_jingle advance cooking +advance_cooking_millis 5340 +advance_cooking_2_jingle advance cooking2 +advance_cooking_2_millis 4000 +advance_crafting_jingle advance crafting +advance_crafting_millis 7200 +advance_crafting_2_jingle advance crafting2 +advance_crafting_2_millis 4800 +advance_defense_jingle advance defense +advance_defense_millis 6000 +advance_defense_2_jingle advance defense2 +advance_defense_2_millis 8000 +advance_firemarking_jingle advance firemarking +advance_firemarking_millis 6550 +advance_firemarking_2_jingle advance firemarking2 +advance_firemarking_2_millis 8800 +advance_fishing_jingle advance fishing +advance_fishing_millis 9600 +advance_fishing_2_jingle advance fishing2 +advance_fishing_2_millis 6000 +advance_fletching_jingle advance fletching +advance_fletching_millis 7200 +advance_fletching_2_jingle advance fletching2 +advance_fletching_2_millis 7200 +advance_herblaw_jingle advance herblaw +advance_herblaw_millis 4800 +advance_herblaw_2_jingle advance herblaw2 +advance_herblaw_2_millis 6550 +advance_hitpoints_jingle advance hitpoints +advance_hitpoints_millis 4800 +advance_hitpoints_2_jingle advance hitpoints2 +advance_hitpoints_2_millis 4800 +advance_magic_jingle advance magic +advance_magic_millis 7200 +advance_magic_2_jingle advance magic2 +advance_magic_2_millis 7200 +advance_mining_jingle advance mining +advance_mining_millis 7200 +advance_mining_2_jingle advance mining2 +advance_mining_2_millis 6000 +advance_prayer_jingle advance prayer +advance_prayer_millis 9600 +advance_prayer_2_jingle advance prayer2 +advance_prayer_2_millis 7200 +advance_ranged_jingle advance ranged +advance_ranged_millis 7680 +advance_ranged_2_jingle advance ranged2 +advance_ranged_2_millis 7680 +advance_runecraft_jingle advance runecraft +advance_runecraft_millis 8000 +advance_runecraft_2_jingle advance runecraft2 +advance_runecraft_2_millis 8000 +advance_smithing_jingle advance smithing +advance_smithing_millis 7200 +advance_smithing_2_jingle advance smithing2 +advance_smithing_2_millis 5340 +advance_strength_jingle advance strength +advance_strength_millis 7200 +advance_strength_2_jingle advance strength2 +advance_strength_2_millis 6000 +advance_thieving_jingle advance thieving +advance_thieving_millis 8000 +advance_thieving_2_jingle advance thieving2 +advance_thieving_2_millis 5340 +advance_woodcutting_jingle advance woodcutting +advance_woodcutting_millis 4800 +advance_woodcutting_2_jingle advance woodcutting2 +advance_woodcutting_2_millis 6000 +death_jingle death +death_jingle_millis 7200 +death_jingle_2 death2 +death_jingle_2_millis 8000 +dice_lose_jingle dice lose +dice_lose_jingle_millis 6000 +dice_win_jingle dice win +dice_win_jingle_millis 4200 +duel_win_2_jingle duel win2 +duel_win_2_jingle_millis 4300 +duel_start_jingle duel start +duel_start_jingle_millis 6810 +quest_complete_1_jingle quest complete 1 +quest_complete_1_millis 9600 +quest_complete_2_jingle quest complete 2 +quest_complete_2_millis 12000 +quest_complete_3_jingle quest complete 3 +quest_complete_3_millis 8000 +sailing_journey_jingle sailing journey +sailing_journey_jingle_millis 35480 +treasure_hunt_win_jingle treasure hunt win +treasure_hunt_win_jingle_millis 8730 +map_findsquare_lineofwalk 0 +map_findsquare_lineofsight 1 +map_findsquare_none 2 +runemysteries_complete 6 +doric_complete 100 +cook_complete 2 +romeojuliet_complete 100 +hetty_complete 3 +priest_complete 5 +squire_complete 7 +imp_complete 2 +druid_complete 4 +gobdip_complete 6 +sheep_complete 22 +demon_complete 30 +prince_complete 110 +blackknight_complete 4 +haunted_complete 3 +hunt_complete 4 +drunkmonk_complete 80 +tutorial_complete 1000 +vampire_complete 3 +totem_complete 5 +fishingcompo_complete 5 +scorpcatcher_complete 6 +dragon_complete 10 +zanaris_complete 6 +hero_complete 0 +legends_complete 0 +blackarmgang_complete 4 +phoenixgang_complete 10 +elena_complete 29 +seaslug_complete 12 +arthur_complete 7 +tree_complete 9 +grandtree_complete 160 +waterfall_complete 10 +grail_complete 10 +ball_complete 7 +murder_complete 2 +hazeelcult_complete 9 +itgronigen_complete 7 +junglepotion_complete 11 +biohazard_complete 16 +blackarmgang_questpoints 1 +blackknight_questpoints 3 +cook_questpoints 1 +demon_questpoints 3 +doric_questpoints 1 +dragon_questpoints 2 +druid_questpoints 4 +drunkmonk_questpoints 1 +elena_questpoints 1 +fishingcompo_questpoints 1 +gobdip_questpoints 5 +haunted_questpoints 4 +hetty_questpoints 1 +hunt_questpoints 2 +imp_questpoints 1 +priest_questpoints 1 +prince_questpoints 3 +romeojuliet_questpoints 5 +runemysteries_questpoints 1 +scorpcatcher_questpoints 1 +seaslug_questpoints 1 +sheep_questpoints 1 +squire_questpoints 1 +totem_questpoints 1 +vampire_questpoints 3 +zanaris_questpoints 3 +arthur_questpoints 6 +tree_questpoints 2 +waterfall_questpoints 1 +grail_questpoints 2 +ball_questpoints 4 +murder_questpoints 3 +hazeelcult_questpoints 1 +itgronigen_questpoints 2 +arena_questpoints 2 +junglepotion_questpoints 1 +ikov_questpoints 1 +biohazard_questpoints 3 +tab_combat_options 0 +tab_skills 1 +tab_quest_journal 2 +tab_inventory 3 +tab_wornitems 4 +tab_prayer 5 +tab_magic 6 +tab_friends 8 +tab_ignore 9 +tab_logout 10 +tab_game_options 11 +tab_player_controls 12 +tab_musicplayer 13 +xplamp_none 0 +xplamp_attack 1 +xplamp_strength 2 +xplamp_ranged 3 +xplamp_magic 4 +xplamp_defence 5 +xplamp_hitpoints 6 +xplamp_prayer 7 +xplamp_agility 8 +xplamp_herblore 9 +xplamp_thieving 10 +xplamp_crafting 11 +xplamp_runecraft 12 +xplamp_mining 13 +xplamp_smithing 14 +xplamp_fishing 15 +xplamp_cooking 16 +xplamp_firemaking 17 +xplamp_woodcutting 18 +xplamp_fletching 19 +bank_total_slots 240 +bank_free_slots 60 +sail_port_sarim_to_entrana 1 +sail_entrana_to_port_sarim 2 +sail_port_sarim_to_crandor 3 +sail_crandor_to_port_sarim 4 +sail_port_sarim_to_karamja 5 +sail_karamja_to_port_sarim 6 +sail_ardougne_to_brimhaven 7 +sail_brimhaven_to_ardougne 8 +book_direction_forward 1 +book_direction_backward -1 +objbox_height 32 +player_run_off 0 +player_run_on 1 +player_auto_retaliate_on 0 +player_auto_retaliate_off 1 +macro_event_swarm 1 +macro_event_genie 2 +macro_event_drunken_dwarf 3 +macro_event_mysterious_old_man_general 4 +macro_event_triffid_friendly 5 +macro_event_big_fish 6 +no_macro_event 0 +macro_event_none 0 +macro_event_wave -1 +macro_event_disappear -2 +macro_event_alone -3 +macro_event_del -4 +macro_event_attack -5 +macro_event_appear -6 +macro_event_big_fish_move -7 +triffid_growing 0 +triffid_ready_to_attack 1 +macro_event_cmb_14 1 +macro_event_cmb_29 2 +macro_event_cmb_49 3 +macro_event_cmb_79 4 +macro_event_cmb_120 5 +macro_event_cmb_159 6 +no_forfeit 0 +no_movement 1 +no_weapons 2 +no_armour 3 +no_ranged 4 +no_melee 5 +no_magic 6 +no_potions 7 +no_food 8 +no_prayer 9 +obstacles 10 +no_jewelry 11 +flower_power 12 +north_camera 0 +south_camera 1 +east_camera 2 +west_camera 3 +north_east_camera 4 +north_west_camera 5 +south_east_camera 6 +south_west_camera 7 +duelstatus_lost 5 +duelstatus_victory 6 +duelstatus_opponent_resigned 7 +gnomeball_goal_coord 0_37_54_36_32 +gnomeball_not_started 0 +gnomeball_talked_to_ref 1 +gnomeball_game_started 2 +gnomeball_player_has_won 3 +gnomeball_centre_coord 0_37_54_28_32 +gnomeball_cheer_coord1 0_37_54_27_39 +gnomeball_cheer_coord2 0_37_54_29_39 +partyroom_starting_knight_coord 0_42_54_47_12 +balloons_per_drop 4 +trail_easy_maxsteps 4 +trail_medium_maxsteps 5 +trail_hard_maxsteps 6 +trail_sextant_frame_max 14 +trail_chart_not_started 0 +trail_chart_spoken_prof 1 +trail_chart_spoken_murphy 2 +trail_chart_spoken_kojo 3 +trail_chart_complete 4 +trawler_talked_to_murphy 1 +trawler_sailed 2 +trawler_finished 3 +trawler_lobby_center_under 0_41_49_47_38 +trawler_lobby_center 1_41_49_47_48 +trawler_lobby_murphy_spawn 0_41_49_44_26 +trawler_start_center_under 0_29_75_33_25 +trawler_start_center 1_29_75_33_25 +trawler_flood_center_under 0_31_75_33_25 +trawler_flood_center 1_31_75_33_25 +trawler_start_net1 1_29_75_24_26 +trawler_start_net2 1_29_75_24_19 +trawler_flood_net1 1_31_75_24_26 +trawler_flood_net2 1_31_75_24_19 +trawler_wreck_center 0_30_75_33_25 +trawler_wreck_murphy 0_30_75_26_26 +trawler_escape 0_47_49_18_20 +trawler_start_patrol1 0_29_75_29_25 +trawler_start_patrol2 0_29_75_36_25 +trawler_flood_patrol1 0_31_75_29_25 +trawler_flood_patrol2 0_31_75_36_25 +antipoison -1 +wearpos_hat 0 +wearpos_back 1 +wearpos_front 2 +wearpos_rhand 3 +wearpos_torso 4 +wearpos_lhand 5 +wearpos_arms 6 +wearpos_legs 7 +wearpos_head 8 +wearpos_hands 9 +wearpos_feet 10 +wearpos_jaw 11 +wearpos_ring 12 +wearpos_quiver 13 +gender_male 0 +gender_female 1 +headicon_skull 0 +headicon_multi 1 +headicon_hint 2 +headicon_prayer_protectfrommelee 3 +headicon_prayer_protectfromrange 4 +headicon_prayer_protectfrommagic 5 +headicon_duel 6 +headicon_hint2 7 +attack 1 +strength 2 +ranged 3 +magic 4 +defence 5 +hitpoints 6 +prayer 7 +agility 8 +herblore 9 +thieving 10 +crafting 11 +runecraft 12 +mining 13 +smithing 14 +fishing 15 +cooking 16 +firemaking 17 +woodcutting 18 +fletching 19 +arena_not_started 0 +arena_started 1 +arena_obtained_armour 2 +arena_spoken_drunkguard 3 +arena_given_khali_brew 5 +arena_entered_ogre_fight 6 +arena_defeated_ogre 8 +arena_sent_jail 9 +arena_defeated_scorpion 10 +arena_defeated_bouncer 11 +arena_freed_servils 12 +arena_defeated_genkhazard 13 +arena_complete 14 +arena_complete_defeated_genkhazard 15 +arthur_not_started 0 +arthur_started 1 +arthur_spoken_gawain 2 +arthur_spoken_lancelot 3 +arthur_spoken_morgan_lefaye 4 +arthur_excalibur_bound 5 +arthur_freed_merlin 6 +chaosaltar_index 0 +blackcandle_index 1 +excalibur_started 2 +excalibur_spoken_beggar 3 +excalibur_rewarded 4 +keep_crate_coord 0_43_53_26_9 +catherby_crate_coord 0_43_53_50_49 +morgan_spawn_coord 2_43_53_18_11 +camelot_magic_symbol 0_43_54_28_59 +ball_not_started 0 +ball_started 1 +ball_found_magnet 2 +ball_unlocked_mousedoor 3 +ball_read_diary_after_door 5 +ball_defeated_experiment 6 +ball_mouse_coord 0_45_54_23_10 +ball_experiment_spawn_coord 0_45_54_55_6 +barcrawl_not_started 0 +barcrawl_started 1 +barcrawl_complete 2 +drunkcard_index 2 +bluemoon_index 3 +blurberry_index 4 +deadman_index 5 +dragoninn_index 6 +flyinghorse_index 7 +forestersarms_index 8 +jollyboar_index 9 +karamjaspirits_index 10 +risingsun_index 11 +rustyanchor_index 12 +biohazard_not_started 0 +biohazard_started 1 +biohazard_spoken_jerico 2 +biohazard_used_birdfeed 3 +biohazard_released_pigeons 4 +biohazard_climbed_ladder 5 +biohazard_poisoned_stew 6 +biohazard_found_distillator 7 +biohazard_given_distillator 10 +biohazard_spoken_chemist 12 +biohazard_found_secret 14 +biohazard_reported_elena 15 +hops_correct 1 +chancy_correct 2 +devinci_correct 3 +hops_given 4 +chancy_given 5 +devinci_given 6 +hops_wrong 7 +chancy_wrong 8 +devinci_wrong 9 +blackarmgang_not_started 0 +blackarmgang_started 1 +blackarmgang_spoken_katrine 2 +blackarmgang_joined 3 +phoenixgang_not_started 0 +phoenixgang_started 1 +phoenixgang_read_book 2 +phoenixgang_spoken_reldo 3 +phoenixgang_spoken_baraek 4 +phoenixgang_spoken_straven 8 +phoenixgang_joined 9 +quest_dragon_not_started 0 +quest_dragon_spoken_to_guildmaster 1 +quest_dragon_spoken_to_oziach 2 +quest_dragon_maze_key 3 +quest_dragon_bought_ship 4 +quest_dragon_repaired_ship 7 +quest_dragon_ned_given_map 8 +quest_dragon_sailed_to_crandor 9 +quest_dragon_knows_about_oracle 1 +quest_dragon_has_spoken_to_oracle 2 +quest_dragon_gone_through_oracle_door 3 +quest_dragon_knows_about_shield 1 +quest_dragon_knows_about_goblin 1 +crandor_tele_coord 0_44_50_35_35 +druid_not_started 0 +druid_started 1 +druid_spoken_sanfew 2 +druid_given_ingredients 3 +blanket_ladder_coord 0_40_50_1_22 +drunkmonk_not_started 0 +drunkmonk_spoken_to_omad 10 +drunkmonk_retrieved_blanket 20 +drunkmonk_looking_cedric 30 +drunkmonk_finding_water 40 +drunkmonk_given_water 50 +drunkmonk_fixing_cart 60 +drunkmonk_fixed_cart 70 +quest_elena_not_started 0 +quest_elena_started 1 +quest_elena_gasmask 2 +quest_elena_started_mud_patch 3 +quest_elena_mud_patch1 4 +quest_elena_mud_patch2 5 +quest_elena_mud_patch3 6 +quest_elena_mud_patch4 7 +quest_elena_opened_tunnel 8 +quest_elena_tied_rope 9 +quest_elena_opened_pipe 10 +quest_elena_shown_picture 20 +quest_elena_returned_book 21 +quest_elena_spoken_martha_ted 22 +quest_elena_spoke_to_milli 23 +quest_elena_spoke_to_plague_house 24 +quest_elena_spoke_to_clerk 25 +quest_elena_spoke_to_bravek 26 +quest_elena_spoke_cured_bravek 27 +quest_elena_freed_elena 28 +elena_complete_read_scroll 30 +quest_elena_garden_coord 0_40_52_6_3 +quest_elena_sewer_mud_pile_coord 0_40_152_2_9 +quest_elena_west_ardy_manhole_coord 0_39_51_33_39 +quest_elena_west_ardy_manhole_tele_coord 0_39_51_33_40 +quest_elena_sewer_sewerpipe_coord 0_39_151_34_39 +quest_elena_black_cross_door_coord 0_39_51_44_9 +fishingcompo_not_started 0 +fishingcompo_started 1 +fishingcompo_in_comp 2 +fishingcompo_garlic_comp 3 +fishingcompo_won_comp 4 +hemenster_comp_not_entered 0 +hemenster_comp_paidfee 1 +hemenster_comp_fish_caught 2 +hemenster_comp_all_fish_caught 4 +grail_not_started 0 +grail_started 2 +grail_spoken_merlin 3 +grail_spoken_crone 4 +grail_failed_defeat_titan 7 +grail_finding_percival 8 +grail_given_whistle 9 +haunted_not_started 0 +haunted_started 1 +haunted_spoken_to_oddenstein 2 +hazeelcult_not_started 0 +hazeelcult_started 2 +hazeelcult_spoken_clivet 3 +hazeelcult_clivet_decision 4 +hazeelcult_poured_poison 5 +hazeelcult_finished_side_task 6 +hazeelcult_given_armour_or_scroll 7 +hazeelcult_goodside 0 +hazeelcult_evilside 1 +hetty_not_started 0 +hetty_started 1 +hetty_objects_given 2 +plantation 0 +food_store 1 +ikov_not_started 0 +ikov_started 10 +ikov_disabled_trap 20 +ikov_pulled_lever 30 +ikov_defeated_fire_warrior 40 +ikov_spoken_winelda 50 +ikov_paid_winelda 60 +ikov_helping_armadyl 70 +ikov_completed_armadyl 80 +ikov_completed_lucien 90 +ikovbridge_zone_lower 0_41_153_24_36 +ikovbridge_zone_upper 0_41_153_26_37 +imp_not_started 0 +imp_started 1 +itgronigen_not_started 0 +itgronigen_started 1 +itgronigen_given_planks 2 +itgronigen_given_bronze 3 +itgronigen_given_glass 4 +itgronigen_given_mould 5 +itgronigen_sent_telescope 6 +itgronigen_claimed_wine 8 +sign_capricorn 1 +sign_virgo 2 +sign_libra 3 +sign_aquarius 4 +sign_scorpio 5 +sign_leo 6 +sign_aries 7 +sign_sagittarius 8 +sign_gemini 9 +sign_pisces 10 +sign_taurus 11 +sign_cancer 12 +junglepotion_not_started 0 +junglepotion_get_snake_weed 1 +junglepotion_found_snake_weed 2 +junglepotion_get_ardrigal 3 +junglepotion_found_ardrigal 4 +junglepotion_get_sito_foil 5 +junglepotion_found_sito_foil 6 +junglepotion_get_volencia_moss 7 +junglepotion_found_volencia_moss 8 +junglepotion_get_rogues_purse 9 +junglepotion_found_rogues_purse 10 +murder_not_started 0 +murder_started 1 +poisonproof_spoken_salesman 1 +poisonproof_spoken_murderer 2 +poisonproof_searched_loc 3 +murder_found_thread 1 +murder_found_fingerprints 2 +murderer_anna 1 +murderer_bob 2 +murderer_carol 3 +murderer_david 4 +murderer_elizabeth 5 +murderer_frank 6 +priest_not_started 0 +priest_started 1 +priest_spoken_urhney 2 +priest_spoken_ghost 3 +priest_obtained_skull 4 +prince_not_started 0 +prince_started 10 +prince_spoken_osman 20 +prince_prep_finished 30 +prince_guard_drunk 40 +prince_tied_keli 50 +prince_saved 100 +prince_keymade 1 +prince_keyclaimed 2 +romeojuliet_not_started 0 +romeojuliet_spoken_romeo 10 +romeojuliet_spoken_juliet 20 +romeojuliet_passed_message 30 +romeojuliet_spoken_father 40 +romeojuliet_spoken_apothecary 50 +romeojuliet_juliet_crypt 60 +runemysteries_not_started 0 +runemysteries_started 1 +runemysteries_given_talisman 2 +runemysteries_received_package 3 +runemysteries_given_package 4 +runemysteries_received_notes 5 +scorpcatcher_not_started 0 +scorpcatcher_started 1 +scorpcatcher_first_hint 2 +scorpcatcher_second_hint 3 +seaslug_not_started 0 +seaslug_started 1 +seaslug_spoken_holgart 2 +seaslug_boat_repaired 3 +seaslug_spoken_kennith 4 +seaslug_sailed_kent 5 +seaslug_spoken_kent 6 +seaslug_lit_torch 7 +seaslug_kennith_need_escape 8 +seaslug_panel_opened 9 +seaslug_need_kennith_path 10 +seaslug_saved_kennith 11 +seaslug_island_coord 0_43_51_48_56 +seaslug_shore_coord 0_42_51_34_41 +seaslug_platform_coord 0_43_51_30_9 +sheep_not_started 0 +sheep_started 1 +sheep_last_wool 20 +totem_not_started 0 +totem_started 1 +totem_crate_marked 2 +totem_crate_delivered 3 +totem_teleported 4 +totem_stairs_fail_coord 0_41_151_16_55 +tree_not_started 0 +tree_started 1 +tree_spoken_montai 2 +tree_given_logs_montai 3 +tree_finding_trackers 4 +tree_ballista_fired 5 +tree_retrieved_orb 6 +tree_returned_first_orb 7 +tree_defeated_warlord 8 +elkoy_entrance_coord 0_39_49_8_56 +elkoy_maze_coord 0_39_49_19_23 +quest_vampire_not_started 0 +quest_vampire_started 1 +quest_vampire_spoke_to_harlow 2 +waterfall_not_started 0 +waterfall_started 1 +waterfall_spoken_to_hudon 2 +waterfall_opened_book_on_baxtorian 3 +waterfall_entered_glarial_tomb 4 +waterfall_entered_waterfall 5 +waterfall_entered_puzzle_room 6 +waterfall_placed_amulet 8 +waterfall_poured_ashes 10 +waterfall_fail_coord 0_39_53_31_21 +waterfall_raised_room_door_coord 0_40_154_44_45 +waterfall_original_room_door_coord 0_40_154_6_45 +zanaris_not_started 0 +zanaris_started 1 +zanaris_spoken_shamus 2 +zanaris_spirit_defeated 3 +zanaris_tree_chopped 4 +zanaris_staff_made 5 +style_melee_accurate 0 +style_melee_aggressive 1 +style_melee_defensive 2 +style_melee_controlled 3 +style_ranged_accurate 4 +style_ranged_rapid 5 +style_ranged_longrange 6 +style_magic_normal 7 +style_magic_defensive 8 +stab_style 0 +slash_style 1 +crush_style 2 +ranged_style 3 +magic_style 4 +melee_style 5 +hitmark_block 0 +hitmark_damage 1 +hitmark_poison 2 +wind_strike 51 +water_strike 1 +earth_strike 2 +fire_strike 3 +wind_bolt 4 +water_bolt 5 +earth_bolt 6 +fire_bolt 7 +wind_blast 8 +water_blast 9 +earth_blast 10 +fire_blast 11 +wind_wave 12 +water_wave 13 +earth_wave 14 +fire_wave 15 +curse 16 +weaken 17 +confuse 18 +vulnerability 19 +enfeeble 20 +stun 21 +iban_blast 41 +flames_of_zamorak 42 +claws_of_guthix 43 +saradomin_strike 44 +crumble_undead 45 +bind 46 +snare 47 +entangle 48 +enchant_lvl1 22 +bones_to_bananas 23 +lowlvl_alchemy 24 +varrock_teleport 25 +enchant_lvl2 26 +telekinetic_grab 27 +falador_teleport 28 +superheat_item 29 +camelot_teleport 30 +enchant_lvl3 31 +highlvl_alchemy 32 +water_orb 33 +enchant_lvl4 34 +watchtower_teleport 35 +earth_orb 36 +fire_orb 37 +air_orb 38 +enchant_lvl5 39 +charge 40 +ardougne_teleport 49 +lumbridge_teleport 50 +gnome_cocktail 0 +gnome_bowl 1 +gnome_crunchies 2 +gnome_batta 3 +prayer_thickskin 1 +prayer_rockskin 2 +prayer_steelskin 3 +prayer_strengthburst 4 +prayer_superhumanstrength 5 +prayer_ultimatestrength 6 +prayer_clarity 7 +prayer_improvedreflexes 8 +prayer_incrediblereflexes 9 +prayer_rapidrestore 10 +prayer_rapidheal 11 +prayer_protectitems 12 +prayer_protectfrommagic 13 +prayer_protectfrommissiles 14 +prayer_protectfrommelee 15 +air 1; +mind 2; +water 3; +earth 4; +fire 5; +body 6; +cosmic 7; +chaos 8; +nature 9; +law 10; +death 11; +soul 12; +blood 13; +essence_mine_to_aubury 0_50_53_53_9 +essence_mine_to_sedridor 0_48_149_34_36 +essence_mine_to_disentor 0_40_48_31_14 +essence_mine_to_brimstail 0_37_59_22_35 +essence_mine_to_cromperty 0_41_51_60_58 +shack_center 0_50_49_3_33 +shack_nw 0_50_49_2_31 +shack_se 0_50_49_5_34 +zanaris_nw 0_49_148_0_0 +zanaris_se 0_51_150_0_0 +bakery_stall_timer 1500 +tea_stall_timer 1000 +silk_stall_timer 1000 +fur_stall_timer 1000 +silver_stall_timer 1000 +spice_stall_timer 600 +gem_stall_timer 1000 +runescape_guide_start 0 +runescape_guide_designed_character 1 +runescape_guide_interact_with_scenery 4 +runescape_guide_interacted_with_door 10 +survival_guide_open_inventory 20 +survival_guide_cut_tree 30 +survival_guide_build_fire 40 +survival_guide_open_skill_menu 50 +survival_guide_opened_skill_menu 60 +survival_guide_fish_shrimps 70 +survival_guide_cook_shrimps 80 +survival_guide_burnt_shrimps 90 +survival_guide_complete 120 +tutorial_opened_gate_to_chef 130 +chef_start 140 +chef_make_dough 150 +chef_mixed_dough 160 +chef_baked_bread 170 +chef_opened_music_tab 180 +chef_completed 190 +tutorial_open_player_controls 195 +tutorial_has_toggled_on_run 200 +quest_guide_start 220 +quest_guide_open_menu 230 +quest_guide_opened_menu 240 +quest_guide_finished 250 +mining_instructor_start 260 +mining_instructor_begin_prospecting 270 +mining_instructor_prospected_copper_first 274 +mining_instructor_prospected_tin_first 275 +mining_instructor_prospected_tin_second 279 +mining_instructor_prospected_copper_second 280 +mining_instructor_mining_start 290 +mining_instructor_minted_copper_first 294 +mining_instructor_mined_tin_first 295 +mining_instructor_before_smelt_bronze_bar 320 +mining_instructor_after_smelt_bronze_bar 330 +mining_instructor_smith_a_dagger 340 +mining_instructor_finished 350 +combat_instructor_start 360 +combat_instructor_wielding_weapons 370 +combat_instructor_worn_inventory 380 +combat_instructor_dagger_equipped 390 +combat_instructor_unequipping_items 400 +combat_instructor_open_combat_interface 410 +combat_instructor_opened_combat_interface 420 +combat_instructor_before_attacking_melee 430 +combat_instructor_during_attacking_melee 440 +combat_instructor_after_rat_kill_melee 450 +combat_instructor_before_attacking_ranged 460 +combat_instructor_after_attacking_ranged 470 +tutorial_open_banking 500 +tutorial_opened_bank 510 +tutorial_opened_financial_advisor_door 520 +financial_advisor_talked_to 530 +tutorial_exit_financial_advisors_room 540 +brother_brace_open_prayer_tab 550 +brother_brace_opened_prayer_tab 560 +brother_brace_after_prayer_tab 570 +brother_brace_open_friends_tab 580 +brother_brace_after_friends_tab 590 +brother_brace_finish 600 +tutorial_exit_chapel 610 +tutorial_open_magic_tab 620 +tutorial_opened_magic_tab 630 +tutorial_cast_wind_strike 640 +tutorial_unsuccessful_wind_strike 650 +tutorial_successful_wind_strike 660 +magic_instructor_finished 670 diff --git a/src/public/data/symbols/dbcolumn.sym b/src/public/data/symbols/dbcolumn.sym new file mode 100644 index 00000000..57b8a256 --- /dev/null +++ b/src/public/data/symbols/dbcolumn.sym @@ -0,0 +1,171 @@ +0 drop_table:total int +16 drop_table:drop namedobj,int,int +4096 coord_pair_table:coord_pair coord,coord +8192 levelup:stat stat +8208 levelup:interface interface +8224 levelup:title component +8240 levelup:body component +8256 levelup:message string +8272 levelup:level_prefix string +8288 levelup:levelup_jingle string +8304 levelup:levelup_jingle_millis int +8320 levelup:unlocks_jingle string +8336 levelup:unlocks_jingle_millis int +8352 levelup:unlocks_levels enum +12288 music:name string +12304 music:playbutton component +12320 music:unlock int,int +16384 musicregion:mapsquare coord +16400 musicregion:name string +20480 consume_table:consumable obj +20496 consume_table:consume_sound synth +20512 consume_table:stat_change stat,int,int +20528 consume_table:stat_restore stat,int,int +20544 consume_table:stat_heal stat,int,int +24576 consume_messages_table:consumable obj +24592 consume_messages_table:consume_message1 string +24608 consume_messages_table:consume_message2 string +24624 consume_messages_table:restore_message1 string +24640 consume_messages_table:restore_message2 string +24656 consume_messages_table:message_delay1 int +24672 consume_messages_table:message_delay2 int +28672 combat_style_table:damagestyle int +28688 combat_style_table:damagetype int +32768 gnome_food_cooking:gnome_food obj +32784 gnome_food_cooking:step namedobj,namedobj,namedobj,namedobj +36864 cooking_generic:cooked namedobj +36880 cooking_generic:uncooked obj +36896 cooking_generic:burnt namedobj +36912 cooking_generic:additional namedobj +36928 cooking_generic:levelrequired int +36944 cooking_generic:experience int +36960 cooking_generic:successchance int,int +36976 cooking_generic:successchance_range int,int +36992 cooking_generic:successchance_cookomatic int,int +37008 cooking_generic:successchance_gauntlets int,int +37024 cooking_generic:cookmessage_fire string +37040 cooking_generic:cantcookmessage_fire string +37056 cooking_generic:cookmessage_range string +37072 cooking_generic:cantcookmessage_range string +37088 cooking_generic:processmessage string +37104 cooking_generic:successmessage string +37120 cooking_generic:burnmessage string +40960 gem_cutting_table:uncut_gem obj +40976 gem_cutting_table:cut_gem namedobj +40992 gem_cutting_table:level int +41008 gem_cutting_table:experience int +41024 gem_cutting_table:skill_anim seq +41040 gem_cutting_table:level_fail_name string +41056 gem_cutting_table:product_name string +41072 gem_cutting_table:success_rate int,int +45056 craft_leather_table:members boolean +45072 craft_leather_table:levelrequired int +45088 craft_leather_table:name string +45104 craft_leather_table:leather namedobj,int +45120 craft_leather_table:product namedobj +45136 craft_leather_table:productexp int +49152 dhide_interface_table:color string +49168 dhide_interface_table:leather obj +49184 dhide_interface_table:interface_items namedobj,namedobj,namedobj +53248 fletch_bow_table:log obj +53264 fletch_bow_table:shafts int +53280 fletch_bow_table:objchoices namedobj,namedobj +53296 fletch_bow_table:shortbow namedobj,int,int +53312 fletch_bow_table:longbow namedobj,int,int +57344 fletching_table:item obj +57360 fletching_table:product namedobj,int +57376 fletching_table:level int +57392 fletching_table:experience int +57408 fletching_table:skill_anim seq +57424 fletching_table:skill_sound synth +61440 magic_staff_table:staff obj +61456 magic_staff_table:rune namedobj +65536 magic_spell_table:spell int +65552 magic_spell_table:spellcom component +65568 magic_spell_table:name string +65584 magic_spell_table:members boolean +65600 magic_spell_table:levelrequired int +65616 magic_spell_table:runesrequired namedobj,int,namedobj,int,namedobj,int +65632 magic_spell_table:wornrequired namedobj +65648 magic_spell_table:worn_reqmessage string +65664 magic_spell_table:experience int +65680 magic_spell_table:loc_type loc +65696 magic_spell_table:convertobj obj,namedobj,seq,spotanim,synth +65712 magic_spell_table:tele_coord coord +65728 magic_spell_table:additional_reqmessage string +65744 magic_spell_table:specificobj_reqmessage obj,string +65760 magic_spell_table:stat_change stat,int,int +65776 magic_spell_table:freeze_time int +65792 magic_spell_table:anim seq +65808 magic_spell_table:spotanim_proj spotanim,int,int +65824 magic_spell_table:spotanim_origin spotanim +65840 magic_spell_table:spotanim_target spotanim,int +65856 magic_spell_table:sound_success synth +65872 magic_spell_table:sound_fail synth +65888 magic_spell_table:maxhit int +65904 magic_spell_table:continue_by_autocast boolean +69632 mining_table:rock loc +69648 mining_table:ore_name string +69664 mining_table:rock_output namedobj +69680 mining_table:rock_level int +69696 mining_table:rock_exp int +69712 mining_table:rock_successchance int,int +69728 mining_table:rock_respawnrate int +73728 prayers:prayer int +73744 prayers:prayer_deactivate int +73760 prayers:members int +73776 prayers:name string +73792 prayers:level int +73808 prayers:sound synth +77824 runecraft_table:type int +77840 runecraft_table:members int +77856 runecraft_table:level int +77872 runecraft_table:experience int +77888 runecraft_table:rune namedobj +77904 runecraft_table:talisman obj +77920 runecraft_table:name string +77936 runecraft_table:multiplier int +77952 runecraft_table:altar_coord coord +77968 runecraft_table:enter_coord coord,int,int,int +77984 runecraft_table:exit_coord coord,int,int,int +81920 smithing:ifproduct obj +81936 smithing:product namedobj +81952 smithing:product_amount int +81968 smithing:levelrequired int +81984 smithing:end_message string +82000 smithing:levelfailmessage string +82016 smithing:bar namedobj +82032 smithing:bar_amount int +86016 trapped_chest:loc loc +86032 trapped_chest:level int +86048 trapped_chest:experience int +86064 trapped_chest:respawn_ticks int +86080 trapped_chest:loot namedobj,int,int,int +90112 locked_door:loc loc +90128 locked_door:replacement loc +90144 locked_door:level int +90160 locked_door:experience int +90176 locked_door:tool namedobj,string +94208 pickpocket:npc npc +94224 pickpocket:level int +94240 pickpocket:experience int +94256 pickpocket:stun_ticks int +94272 pickpocket:stun_damage int +94288 pickpocket:success_chance int,int +94304 pickpocket:loot namedobj,int,int,int +94320 pickpocket:pocket string +98304 stealing:loc loc +98320 stealing:owner npc +98336 stealing:guard npc +98352 stealing:level int +98368 stealing:experience int +98384 stealing:respawn_ticks int +98400 stealing:loot namedobj,int,int,int,string +98416 stealing:loot_total int +98432 stealing:stall string +102400 woodcutting_trees:levelrequired int +102416 woodcutting_trees:tree loc +102432 woodcutting_trees:productexp int +102448 woodcutting_trees:product namedobj +102464 woodcutting_trees:respawnrate int +102480 woodcutting_trees:successchance namedobj,int,int diff --git a/src/public/data/symbols/dbrow.sym b/src/public/data/symbols/dbrow.sym new file mode 100644 index 00000000..352f428f --- /dev/null +++ b/src/public/data/symbols/dbrow.sym @@ -0,0 +1,1039 @@ +0 ardougne_west +1 fishing_platform_zones +2 mage_arena +3 wilderness_zones +4 levelup_attack +5 levelup_strength +6 levelup_ranged +7 levelup_magic +8 levelup_defence +9 levelup_hitpoints +10 levelup_prayer +11 levelup_agility +12 levelup_herblore +13 levelup_thieving +14 levelup_crafting +15 levelup_runecraft +16 levelup_mining +17 levelup_smithing +18 levelup_fishing +19 levelup_cooking +20 levelup_firemaking +21 levelup_woodcutting +22 levelup_fletching +23 duel_arena_fight_zones +24 duel_arena_obstacle_fight_zones +25 duel_arena_zones +26 gnomeball_zones +27 sextant_disabled_zones +28 trawler_lobby_zones +29 trawler_game_zones +30 trawler_flood_zones +31 trawler_nonflood_zones +32 trawler_all_zones +33 trawler_wreck_zones +34 music_Adventure +35 music_Al_Kharid +36 music_Alone +37 music_Ambient_Jungle +38 music_Arabian +39 music_Arabian2 +40 music_Arabian3 +41 music_Arabique +42 music_Army_Of_Darkness +43 music_Arrival +44 music_Attack1 +45 music_Attack2 +46 music_Attack3 +47 music_Attack4 +48 music_Attack5 +49 music_Attack6 +50 music_Attention +51 music_Autumn_Voyage +52 music_Background2 +53 music_Ballad_Of_Enchantment +54 music_Baroque +55 music_Beyond +56 music_Big_Chords +57 music_Book_Of_Spells +58 music_Camelot +59 music_Cave_Background1 +60 music_Cavern +61 music_Cellar_Song1 +62 music_Chain_Of_Command +63 music_Chompy_Hunt +64 music_Close_Quarters +65 music_Crystal_Cave +66 music_Crystal_Sword +67 music_Cursed +68 music_Dangerous +69 music_Dark2 +70 music_Deep_Wildy +71 music_Desert_Voyage +72 music_Doorways +73 music_Dream1 +74 music_Duel_Arena +75 music_Dunjun +76 music_Egypt +77 music_Emotion +78 music_Emperor +79 music_Escape +80 music_Expanse +81 music_Expecting +82 music_Expedition +83 music_Faerie +84 music_Fanfare +85 music_Fanfare2 +86 music_Fanfare3 +87 music_Fishing +88 music_Flute_Salad +89 music_Forbidden +90 music_Forever +91 music_Gaol +92 music_Garden +93 music_Gnome +94 music_Gnome_King +95 music_Gnome_Theme +96 music_Gnome_Village +97 music_Gnome_Village2 +98 music_Gnomeball +99 music_Greatness +100 music_Grumpy +101 music_Harmony +102 music_Harmony2 +103 music_Heart_and_Mind +104 music_High_Seas +105 music_Horizon +106 music_Iban +107 music_Ice_Melody +108 music_In_The_Manor +109 music_Inspiration +110 music_Intrepid +111 music_Jolly-R +112 music_Jungle_Island +113 music_Jungly1 +114 music_Jungly2 +115 music_Jungly3 +116 music_Knightly +117 music_Landlubber +118 music_Lasting +119 music_Legion +120 music_Lightness +121 music_Lightwalk +122 music_Lonesome +123 music_Long_Ago +124 music_Long_Way_Home +125 music_Lullaby +126 music_Mage_Arena +127 music_Magic_Dance +128 music_Magical_Journey +129 music_March2 +130 music_Medieval +131 music_Mellow +132 music_Miles_Away +133 music_Miracle_Dance +134 music_Monarch_Waltz +135 music_Moody +136 music_Neverland +137 music_Newbie_Melody +138 music_Nightfall +139 music_Nomad +140 music_Oriental +141 music_Overture +142 music_Parade +143 music_Quest +144 music_Regal2 +145 music_Reggae +146 music_Reggae2 +147 music_Riverside +148 music_Royale +149 music_Rune_Essence +150 music_Sad_Meadow +151 music_Scape_Cave +152 music_Scape_Main +153 music_Scape_Sad1 +154 music_Scape_Soft +155 music_Scape_Wild1 +156 music_Sea_Shanty +157 music_Sea_Shanty2 +158 music_Serenade +159 music_Serene +160 music_Shine +161 music_Shining +162 music_Soundscape +163 music_Spirit +164 music_Splendour +165 music_Spooky_Jungle +166 music_Spooky2 +167 music_Starlight +168 music_Start +169 music_Still_Night +170 music_Talking_Forest +171 music_The_Desert +172 music_The_Shadow +173 music_The_Tower +174 music_Theme +175 music_Tomorrow +176 music_Trawler +177 music_Trawler_Minor +178 music_Tree_Spirits +179 music_Tribal +180 music_Tribal_Background +181 music_Tribal2 +182 music_Trinity +183 music_Troubled +184 music_Undercurrent +185 music_Underground +186 music_Understanding +187 music_Unknown_Land +188 music_Upass1 +189 music_Upcoming +190 music_Venture +191 music_Venture2 +192 music_Vision +193 music_Voodoo_Cult +194 music_Voyage +195 music_Wander +196 music_Waterfall +197 music_Wilderness2 +198 music_Wilderness3 +199 music_Wilderness4 +200 music_Witching +201 music_Wolf_Mountain +202 music_Wonder +203 music_Wonderous +204 music_Workshop +205 music_Yesteryear +206 music_Zealot +207 musicregion_29_75 +208 musicregion_30_75 +209 musicregion_31_75 +210 musicregion_33_71 +211 musicregion_33_72 +212 musicregion_33_73 +213 musicregion_33_75 +214 musicregion_34_75 +215 musicregion_36_52 +216 musicregion_36_53 +217 musicregion_36_54 +218 musicregion_36_153 +219 musicregion_36_154 +220 musicregion_37_49 +221 musicregion_37_51 +222 musicregion_37_52 +223 musicregion_37_53 +224 musicregion_37_54 +225 musicregion_37_55 +226 musicregion_37_73 +227 musicregion_37_75 +228 musicregion_37_147 +229 musicregion_37_149 +230 musicregion_37_150 +231 musicregion_37_151 +232 musicregion_38_49 +233 musicregion_38_50 +234 musicregion_38_51 +235 musicregion_38_52 +236 musicregion_38_53 +237 musicregion_38_54 +238 musicregion_38_55 +239 musicregion_38_150 +240 musicregion_38_151 +241 musicregion_39_46 +242 musicregion_39_47 +243 musicregion_39_48 +244 musicregion_39_49 +245 musicregion_39_50 +246 musicregion_39_51 +247 musicregion_39_52 +248 musicregion_39_53 +249 musicregion_39_54 +250 musicregion_39_55 +251 musicregion_39_75 +252 musicregion_39_147 +253 musicregion_39_150 +254 musicregion_39_153 +255 musicregion_39_155 +256 musicregion_40_46 +257 musicregion_40_47 +258 musicregion_40_48 +259 musicregion_40_49 +260 musicregion_40_50 +261 musicregion_40_51 +262 musicregion_40_52 +263 musicregion_40_53 +264 musicregion_40_54 +265 musicregion_40_75 +266 musicregion_40_147 +267 musicregion_40_148 +268 musicregion_40_149 +269 musicregion_40_150 +270 musicregion_40_151 +271 musicregion_40_154 +272 musicregion_41_46 +273 musicregion_41_48 +274 musicregion_41_49 +275 musicregion_41_50 +276 musicregion_41_51 +277 musicregion_41_52 +278 musicregion_41_53 +279 musicregion_41_54 +280 musicregion_41_55 +281 musicregion_41_73 +282 musicregion_41_75 +283 musicregion_41_146 +284 musicregion_41_152 +285 musicregion_41_153 +286 musicregion_41_154 +287 musicregion_42_49 +288 musicregion_42_50 +289 musicregion_42_51 +290 musicregion_42_52 +291 musicregion_42_53 +292 musicregion_42_54 +293 musicregion_42_55 +294 musicregion_42_75 +295 musicregion_42_151 +296 musicregion_42_152 +297 musicregion_42_153 +298 musicregion_43_45 +299 musicregion_43_46 +300 musicregion_43_47 +301 musicregion_43_48 +302 musicregion_43_49 +303 musicregion_43_50 +304 musicregion_43_51 +305 musicregion_43_52 +306 musicregion_43_53 +307 musicregion_43_54 +308 musicregion_43_55 +309 musicregion_43_73 +310 musicregion_43_75 +311 musicregion_43_145 +312 musicregion_43_146 +313 musicregion_43_153 +314 musicregion_44_45 +315 musicregion_44_46 +316 musicregion_44_47 +317 musicregion_44_48 +318 musicregion_44_49 +319 musicregion_44_50 +320 musicregion_44_51 +321 musicregion_44_52 +322 musicregion_44_53 +323 musicregion_44_54 +324 musicregion_44_55 +325 musicregion_44_75 +326 musicregion_44_148 +327 musicregion_44_149 +328 musicregion_44_150 +329 musicregion_44_152 +330 musicregion_44_153 +331 musicregion_44_154 +332 musicregion_44_155 +333 musicregion_45_45 +334 musicregion_45_46 +335 musicregion_45_47 +336 musicregion_45_48 +337 musicregion_45_49 +338 musicregion_45_50 +339 musicregion_45_51 +340 musicregion_45_52 +341 musicregion_45_53 +342 musicregion_45_54 +343 musicregion_45_55 +344 musicregion_45_73 +345 musicregion_45_75 +346 musicregion_45_145 +347 musicregion_45_146 +348 musicregion_45_148 +349 musicregion_45_151 +350 musicregion_45_152 +351 musicregion_45_153 +352 musicregion_45_154 +353 musicregion_46_45 +354 musicregion_46_46 +355 musicregion_46_47 +356 musicregion_46_49 +357 musicregion_46_50 +358 musicregion_46_51 +359 musicregion_46_52 +360 musicregion_46_53 +361 musicregion_46_54 +362 musicregion_46_55 +363 musicregion_46_56 +364 musicregion_46_57 +365 musicregion_46_58 +366 musicregion_46_59 +367 musicregion_46_60 +368 musicregion_46_61 +369 musicregion_46_149 +370 musicregion_46_152 +371 musicregion_46_153 +372 musicregion_47_47 +373 musicregion_47_48 +374 musicregion_47_49 +375 musicregion_47_50 +376 musicregion_47_51 +377 musicregion_47_52 +378 musicregion_47_53 +379 musicregion_47_54 +380 musicregion_47_55 +381 musicregion_47_56 +382 musicregion_47_57 +383 musicregion_47_58 +384 musicregion_47_59 +385 musicregion_47_60 +386 musicregion_47_61 +387 musicregion_47_149 +388 musicregion_47_152 +389 musicregion_47_153 +390 musicregion_47_160 +391 musicregion_47_161 +392 musicregion_48_47 +393 musicregion_48_48 +394 musicregion_48_49 +395 musicregion_48_50 +396 musicregion_48_51 +397 musicregion_48_52 +398 musicregion_48_53 +399 musicregion_48_54 +400 musicregion_48_55 +401 musicregion_48_56 +402 musicregion_48_57 +403 musicregion_48_58 +404 musicregion_48_59 +405 musicregion_48_60 +406 musicregion_48_61 +407 musicregion_48_148 +408 musicregion_48_149 +409 musicregion_48_153 +410 musicregion_48_154 +411 musicregion_48_155 +412 musicregion_48_156 +413 musicregion_49_47 +414 musicregion_49_48 +415 musicregion_49_49 +416 musicregion_49_50 +417 musicregion_49_51 +418 musicregion_49_52 +419 musicregion_49_53 +420 musicregion_49_54 +421 musicregion_49_55 +422 musicregion_49_56 +423 musicregion_49_57 +424 musicregion_49_58 +425 musicregion_49_59 +426 musicregion_49_60 +427 musicregion_49_61 +428 musicregion_49_148 +429 musicregion_49_149 +430 musicregion_49_153 +431 musicregion_49_154 +432 musicregion_50_47 +433 musicregion_50_48 +434 musicregion_50_49 +435 musicregion_50_50 +436 musicregion_50_51 +437 musicregion_50_52 +438 musicregion_50_53 +439 musicregion_50_54 +440 musicregion_50_55 +441 musicregion_50_56 +442 musicregion_50_57 +443 musicregion_50_58 +444 musicregion_50_59 +445 musicregion_50_60 +446 musicregion_50_61 +447 musicregion_50_149 +448 musicregion_50_150 +449 musicregion_50_152 +450 musicregion_50_153 +451 musicregion_50_154 +452 musicregion_51_46 +453 musicregion_51_47 +454 musicregion_51_48 +455 musicregion_51_49 +456 musicregion_51_50 +457 musicregion_51_51 +458 musicregion_51_52 +459 musicregion_51_53 +460 musicregion_51_54 +461 musicregion_51_55 +462 musicregion_51_56 +463 musicregion_51_57 +464 musicregion_51_58 +465 musicregion_51_59 +466 musicregion_51_60 +467 musicregion_51_61 +468 musicregion_51_147 +469 musicregion_51_154 +470 musicregion_52_47 +471 musicregion_52_48 +472 musicregion_52_49 +473 musicregion_52_50 +474 musicregion_52_51 +475 musicregion_52_52 +476 musicregion_52_53 +477 musicregion_52_54 +478 musicregion_52_55 +479 musicregion_52_56 +480 musicregion_52_57 +481 musicregion_52_58 +482 musicregion_52_59 +483 musicregion_52_60 +484 musicregion_52_61 +485 musicregion_52_152 +486 musicregion_52_153 +487 attack_consumable_effect +488 strength_consumable_effect +489 defence_consumable_effect +490 super_attack_consumable_effect +491 fishing_consumable_effect +492 super_strength_consumable_effect +493 super_defence_consumable_effect +494 range_consumable_effect +495 asgarnian_ale_effect +496 wizards_mind_bomb_effect +497 greenmans_ale_effect +498 dragon_bitter_effect +499 dwarven_stout_effect +500 grog_effect +501 beer_effect +502 wine_effect +503 half_wine_effect +504 bad_wine_effect +505 cabbage_draynor_effect +506 jangerberries_effect +507 restore_potion_effect +508 prayer_potion_effect +509 zamorak_brew_effect +510 bottle_alcohol_effect +511 cocktail_effect1 +512 cocktail_effect2 +513 cocktail_effect3 +514 cocktail_effect4 +515 odd_cocktail_effect +516 odd_cocktail_effect2 +517 tea_effect +518 odd_gnomefood_effect +519 cabbage_consume_messages +520 cabbage_draynor_consume_messages +521 plural_consume_messages +522 jangerberries_consume_messages +523 ugthanki_kebab_consume_messages +524 blank_restore_message +525 spinach_roll_consume_messages +526 asgarnian_ale_consume_messages +527 wizards_mind_bomb_consume_messages +528 greenmans_ale_consume_messages +529 dragon_bitter_consume_messages +530 dwarven_stout_consume_messages +531 grog_consume_messages +532 beer_consume_messages +533 chocolaty_milk_consume_messages +534 cup_of_tea_consume_messages +535 cake_consume_messages +536 cake_part_consume_messages +537 chocolate_cake_consume_messages +538 chocolate_cake_part_consume_messages +539 chocolate_cake_slice_consume_messages +540 batta_consume_messages +541 premade_cheese_tom_batta_consume_messages +542 batta2_consume_messages +543 vodka_consume_messages +544 whisky_consume_messages +545 gin_consume_messages +546 brandy_consume_messages +547 cocktail_consume_messages +548 cocktail2_consume_messages +549 odd_cocktail_consume_messages +550 odd_batta_consume_messages +551 odd_gnomebowl_consume_messages +552 odd_crunchies_consume_messages +553 unfinished_cocktail_consume_messages +554 unfinished_cocktail2_consume_messages +555 lemon_chunks_consume_messages +556 lemon_slices_consume_messages +557 lemon_consume_messages +558 orange_chunks_consume_messages +559 orange_slices_consume_messages +560 pineapple_chunks_consume_messages +561 lime_consume_messages +562 lime_chunks_consume_messages +563 lime_slices_consume_messages +564 premade_worm_crunchies_consume_messages +565 premade_choc_chip_crunchies_consume_messages +566 premade_spicy_crunchies_consume_messages +567 premade_toad_crunchies_consume_messages +568 dwellberry_consume_messages +569 equa_leaves_consume_messages +570 pot_of_cream_consume_messages +571 toad_legs_consume_messages +572 equa_toad_legs_consume_messages +573 spicy_toad_legs_consume_messages +574 seasoned_toad_legs_consume_messages +575 spicy_worm_consume_messages +576 king_worm_consume_messages +577 chocolate_bomb_consume_messages +578 tangled_toads_legs_consume_messages +579 worm_hole_consume_messages +580 veg_ball_consume_messages +581 cooked_wrapped_oomlie_consume_messages +582 apple_pie_consume_messages +583 redberry_pie_consume_messages +584 meat_pie_consume_messages +585 half_meat_pie_consume_messages +586 half_redberry_pie_consume_messages +587 half_apple_pie_consume_messages +588 pizza_consume_messages +589 meat_pizza_consume_messages +590 anchovy_pizza_consume_messages +591 pineapple_pizza_consume_messages +592 half_pizza_consume_messages +593 half_meat_pizza_consume_messages +594 half_anchovy_pizza_consume_messages +595 half_pineapple_pizza_consume_messages +596 wine_consume_messages +597 strength_potion_consume_messages +598 attack_potion_consume_messages +599 restore_potion_consume_messages +600 defence_potion_consume_messages +601 prayer_potion_consume_messages +602 fishing_potion_consume_messages +603 ranging_potion_consume_messages +604 antipoison_potion_consume_messages +605 zamorak_potion_consume_messages +606 antifire_potion_consume_messages +607 unfinished_batta_consume_messages +608 unfinished_crunchies_consume_messages +609 unfinished_gnomebowl_consume_messages +610 strange_fruit_consume_messages +611 chocolaty_milk_consume +612 heal_0 +613 heal_1 +614 heal_2 +615 heal_3 +616 heal_4 +617 heal_5 +618 heal_6 +619 heal_7 +620 heal_8 +621 heal_9 +622 heal_10 +623 heal_11 +624 heal_12 +625 heal_13 +626 heal_14 +627 heal_15 +628 heal_19 +629 heal_20 +630 heal_21 +631 heal_22 +632 multiway_zones +633 fisher_realm_zones +634 weapon_2h_sword_table +635 weapon_axe_table +636 weapon_blunt_table +637 weapon_pickaxe_table +638 weapon_scythe_table +639 weapon_slash_table +640 weapon_spear_table +641 weapon_spiked_table +642 weapon_stab_table +643 weapon_bow_table +644 weapon_crossbow_table +645 weapon_thrown_table +646 weapon_unarmed_table +647 weapon_staff_table +648 magic_spell_wind_strike +649 magic_spell_water_strike +650 magic_spell_earth_strike +651 magic_spell_fire_strike +652 magic_spell_wind_bolt +653 magic_spell_water_bolt +654 magic_spell_earth_bolt +655 magic_spell_fire_bolt +656 magic_spell_wind_blast +657 magic_spell_water_blast +658 magic_spell_earth_blast +659 magic_spell_fire_blast +660 magic_spell_wind_wave +661 magic_spell_water_wave +662 magic_spell_earth_wave +663 magic_spell_fire_wave +664 magic_spell_bind +665 magic_spell_snare +666 magic_spell_entangle +667 magic_spell_confuse +668 magic_spell_weaken +669 magic_spell_curse +670 magic_spell_vulnerability +671 magic_spell_enfeeble +672 magic_spell_stun +673 magic_spell_crumble_undead +674 magic_spell_saradomin_strike +675 magic_spell_claws_of_guthix +676 magic_spell_flames_of_zamorak +677 worm_batta +678 cheese_tom_batta +679 fruit_batta +680 vegetable_batta +681 blurberry_special_cocktail +682 chocolate_saturday_cocktail +683 drunk_dragon_cocktail +684 fruit_blast_cocktail +685 pineapple_punch_cocktail +686 short_green_guy_cocktail +687 wizard_blizzard_cocktail +688 spicy_crunchies +689 toad_crunchies +690 worm_crunchies +691 choc_chip_crunchies +692 chocolate_bomb +693 worm_hole +694 veg_ball +695 cooking_generic_ugthanki_meat +696 cooking_generic_stew +697 cooking_generic_curry +698 cooking_generic_beef +699 cooking_burn_meat +700 cooking_generic_rat_meat +701 cooking_generic_bear_meat +702 cooking_generic_chicken +703 cooking_generic_lava_eel +704 cooking_generic_wrapped_oomlie +705 cooking_generic_raw_oomlie +706 cooking_generic_pitta_bread +707 cooking_generic_cake +708 cooking_generic_pizza +709 cooking_generic_bread +710 cooking_generic_apple_pie +711 cooking_generic_meat_pie +712 cooking_generic_redberry_pie +713 cooking_generic_shrimp +714 cooking_generic_anchovies +715 cooking_generic_sardine +716 cooking_generic_salmon +717 cooking_generic_trout +718 cooking_generic_giant_carp +719 cooking_generic_cod +720 cooking_generic_herring +721 cooking_generic_pike +722 cooking_generic_mackerel +723 cooking_generic_tuna +724 cooking_generic_bass +725 cooking_generic_swordfish +726 cooking_generic_lobster +727 cooking_generic_shark +728 cooking_generic_manta_ray +729 cooking_generic_sea_turtle +730 cooking_generic_seaweed +731 cooking_generic_half_baked_gnomebowl +732 cooking_generic_half_baked_crunchies +733 cooking_generic_half_baked_batta +734 cooking_generic_chocolate_saturday +735 cooking_generic_drunk_dragon +736 cooking_generic_unfinished_gnome_batta +737 cooking_generic_unfinished_gnome_crunchies +738 cooking_generic_unfinished_gnomebowl +739 cooking_generic_raw_swamp_paste +740 diamond_cutting +741 emerald_cutting +742 ruby_cutting +743 sapphire_cutting +744 opal_cutting +745 red_topaz_cutting +746 jade_cutting +747 dragonstone_cutting +748 craft_leather_gloves +749 craft_leather_boots +750 craft_leather_vambraces +751 craft_dragonhide_vamb +752 craft_leather_chaps +753 craft_dragonhide_chaps +754 craft_leather_body +755 craft_hardleather_body +756 craft_dragonhide_body +757 craft_leather_cowl +758 craft_coif +759 craft_dragonhide_vamb_blue +760 craft_dragonhide_vamb_red +761 craft_dragonhide_vamb_black +762 craft_dragonhide_chaps_blue +763 craft_dragonhide_chaps_red +764 craft_dragonhide_chaps_black +765 craft_dragonhide_body_blue +766 craft_dragonhide_body_red +767 craft_dragonhide_body_black +768 green_dhide_interface_table +769 blue_dhide_interface_table +770 red_dhide_interface_table +771 black_dhide_interface_table +772 bank_zones +773 party_room_zones +774 fletching_bronze_arrow +775 fletching_iron_arrow +776 fletching_steel_arrow +777 fletching_mithril_arrow +778 fletching_adamant_arrow +779 fletching_rune_arrow +780 fletching_opal_tips +781 fletching_oyster_pearl_tips +782 fletching_oyster_pearls_tips +783 fletching_opal_bolts +784 fletching_pearl_bolts +785 fletching_barb_bolts +786 fletching_normal +787 fletching_oak +788 fletching_willow +789 fletching_maple +790 fletching_yew +791 fletching_magic +792 fletching_bronze_dart +793 fletching_iron_dart +794 fletching_steel_dart +795 fletching_mithril_dart +796 fletching_adamant_dart +797 fletching_rune_dart +798 stringing_normal_shortbow +799 stringing_normal_longbow +800 stringing_oak_shortbow +801 stringing_oak_longbow +802 stringing_willow_shortbow +803 stringing_willow_longbow +804 stringing_maple_shortbow +805 stringing_maple_longbow +806 stringing_yew_shortbow +807 stringing_yew_longbow +808 stringing_magic_shortbow +809 stringing_magic_longbow +810 magic_spell_enchant_level1 +811 magic_spell_enchant_level2 +812 magic_spell_enchant_level3 +813 magic_spell_enchant_level4 +814 magic_spell_enchant_level5 +815 magic_spell_teleport_varrock +816 magic_spell_teleport_lumbridge +817 magic_spell_teleport_falador +818 magic_spell_teleport_camelot +819 magic_spell_teleport_ardougne +820 magic_spell_teleport_watchtower +821 magic_spell_charge_air_orb +822 magic_spell_charge_water_orb +823 magic_spell_charge_earth_orb +824 magic_spell_charge_fire_orb +825 magic_spell_low_alch +826 magic_spell_high_alch +827 magic_spell_superheat +828 magic_spell_bones_to_bananas +829 magic_spell_telegrab +830 magic_spell_charge +831 magic_staff_air +832 magic_staff_water +833 magic_staff_earth +834 magic_staff_fire +835 gem_rock_table +836 rune_essence_table +837 clay_rock_table +838 copper_rock_table +839 tin_rock_table +840 iron_rock_table +841 coal_rock_table +842 gold_rock_table +843 silver_rock_table +844 mithril_rock_table +845 adamantite_rock_table +846 runite_rock_table +847 blurite_rock_1 +848 gem_rock_1 +849 prayer_thick_skin +850 prayer_strength_burst +851 prayer_clarity +852 prayer_rock_skin +853 prayer_superhuman_strength +854 prayer_improved_reflexes +855 prayer_rapid_restore +856 prayer_rapid_heal +857 prayer_protect_item +858 prayer_steel_skin +859 prayer_ultimate_strength +860 prayer_incredible_reflexes +861 prayer_protect_from_magic +862 prayer_protect_from_missiles +863 prayer_protect_from_melee +864 runecraft_air +865 runecraft_mind +866 runecraft_water +867 runecraft_earth +868 runecraft_fire +869 runecraft_body +870 runecraft_cosmic +871 runecraft_chaos +872 runecraft_nature +873 runecraft_law +874 runecraft_death +875 bronze_dagger +876 iron_dagger +877 steel_dagger +878 mithril_dagger +879 adamant_dagger +880 rune_dagger +881 bronze_sword +882 iron_sword +883 steel_sword +884 mithril_sword +885 adamant_sword +886 rune_sword +887 bronze_scimitar +888 iron_scimitar +889 steel_scimitar +890 mithril_scimitar +891 adamant_scimitar +892 rune_scimitar +893 bronze_longsword +894 iron_longsword +895 steel_longsword +896 mithril_longsword +897 adamant_longsword +898 rune_longsword +899 bronze_2h_sword +900 iron_2h_sword +901 steel_2h_sword +902 mithril_2h_sword +903 adamant_2h_sword +904 rune_2h_sword +905 bronze_axe +906 iron_axe +907 steel_axe +908 mithril_axe +909 adamant_axe +910 rune_axe +911 bronze_mace +912 iron_mace +913 steel_mace +914 mithril_mace +915 adamant_mace +916 rune_mace +917 bronze_warhammer +918 iron_warhammer +919 steel_warhammer +920 mithril_warhammer +921 adamant_warhammer +922 rune_warhammer +923 bronze_battleaxe +924 iron_battleaxe +925 steel_battleaxe +926 mithril_battleaxe +927 adamant_battleaxe +928 rune_battleaxe +929 bronze_chainbody +930 iron_chainbody +931 steel_chainbody +932 mithril_chainbody +933 adamant_chainbody +934 rune_chainbody +935 bronze_platelegs +936 iron_platelegs +937 steel_platelegs +938 mithril_platelegs +939 adamant_platelegs +940 rune_platelegs +941 bronze_plateskirt +942 iron_plateskirt +943 steel_plateskirt +944 mithril_plateskirt +945 adamant_plateskirt +946 rune_plateskirt +947 bronze_platebody +948 iron_platebody +949 steel_platebody +950 mithril_platebody +951 adamant_platebody +952 rune_platebody +953 bronze_med_helm +954 iron_med_helm +955 steel_med_helm +956 mithril_med_helm +957 adamant_med_helm +958 rune_med_helm +959 bronze_full_helm +960 iron_full_helm +961 steel_full_helm +962 mithril_full_helm +963 adamant_full_helm +964 rune_full_helm +965 bronze_sq_shield +966 iron_sq_shield +967 steel_sq_shield +968 mithril_sq_shield +969 adamant_sq_shield +970 rune_sq_shield +971 bronze_kiteshield +972 iron_kiteshield +973 steel_kiteshield +974 mithril_kiteshield +975 adamant_kiteshield +976 rune_kiteshield +977 bronze_dart_tip +978 iron_dart_tip +979 steel_dart_tip +980 mithril_dart_tip +981 adamant_dart_tip +982 rune_dart_tip +983 bronze_arrowheads +984 iron_arrowheads +985 steel_arrowheads +986 mithril_arrowheads +987 adamant_arrowheads +988 rune_arrowheads +989 bronze_knife +990 iron_knife +991 steel_knife +992 mithril_knife +993 adamant_knife +994 rune_knife +995 bronze_wire +996 steel_studs +997 nails +998 trapped_chest_chest_10_coins +999 trapped_chest_chest_nature_rune +1000 trapped_chest_chest_50_coins +1001 trapped_chest_chest_steel_arrowtips +1002 trapped_chest_chest_blood_runes +1003 trapped_chest_chest_ardougne_castle +1004 locked_door_loc_2550 +1005 locked_door_loc_2551 +1006 locked_door_loc_2554 +1007 locked_door_loc_2555 +1008 locked_door_loc_2556 +1009 locked_door_loc_2557 +1010 locked_door_loc_2558 +1011 locked_door_loc_2559 +1012 pickpocket_man +1013 pickpocket_woman +1014 pickpocket_farmer +1015 pickpocket_warrior +1016 pickpocket_rogue +1017 pickpocket_guard +1018 pickpocket_knight_of_ardougne +1019 pickpocket_watchman +1020 pickpocket_paladin +1021 pickpocket_gnome +1022 pickpocket_hero +1023 stealing_bakery_stall +1024 stealing_tea_stall +1025 stealing_silk_stall +1026 stealing_fur_stall +1027 stealing_silver_stall +1028 stealing_spice_stall +1029 stealing_gem_stall +1030 normal_tree_table +1031 burnt_tree_table +1032 achey_tree_table +1033 oak_tree_table +1034 willow_tree_table +1035 maple_tree_table +1036 yew_tree_table +1037 magic_tree_table +1038 tutorial_island diff --git a/src/public/data/symbols/dbtable.sym b/src/public/data/symbols/dbtable.sym new file mode 100644 index 00000000..eb853103 --- /dev/null +++ b/src/public/data/symbols/dbtable.sym @@ -0,0 +1,26 @@ +0 drop_table +1 coord_pair_table +2 levelup +3 music +4 musicregion +5 consume_table +6 consume_messages_table +7 combat_style_table +8 gnome_food_cooking +9 cooking_generic +10 gem_cutting_table +11 craft_leather_table +12 dhide_interface_table +13 fletch_bow_table +14 fletching_table +15 magic_staff_table +16 magic_spell_table +17 mining_table +18 prayers +19 runecraft_table +20 smithing +21 trapped_chest +22 locked_door +23 pickpocket +24 stealing +25 woodcutting_trees diff --git a/src/public/data/symbols/enum.sym b/src/public/data/symbols/enum.sym new file mode 100644 index 00000000..883dbcf8 --- /dev/null +++ b/src/public/data/symbols/enum.sym @@ -0,0 +1,102 @@ +0 cocktail_guide_title +1 cocktail_guide_model +2 cocktail_guide_text_left +3 cocktail_guide_text_right +4 cook_book_title +5 cook_book_model +6 cook_book_text_left +7 cook_book_text_right +8 mage_arena_bosses +9 mage_arena_stages +10 mage_arena_boss_names +11 displaymessage_enum +12 worn_hands +13 worn_armour +14 worn_all +15 levelup_unlocks_attack +16 levelup_unlocks_strength +17 levelup_unlocks_ranged +18 levelup_unlocks_magic +19 levelup_unlocks_defence +20 levelup_unlocks_hitpoints +21 levelup_unlocks_prayer +22 levelup_unlocks_agility +23 levelup_unlocks_herblore +24 levelup_unlocks_thieving +25 levelup_unlocks_crafting +26 levelup_unlocks_runecraft +27 levelup_unlocks_mining +28 levelup_unlocks_smithing +29 levelup_unlocks_fishing +30 levelup_unlocks_cooking +31 levelup_unlocks_firemaking +32 levelup_unlocks_woodcutting +33 levelup_unlocks_fletching +34 general_macro_events_members +35 general_macro_events_free +36 macro_event_zombie_levels +37 macro_event_rock_golem_levels +38 macro_event_shade_levels +39 macro_event_watchman_levels +40 macro_event_dryad_levels +41 macro_event_river_troll_levels +42 macro_event_fail_teleports_free +43 macro_event_fail_teleports_members +44 duel_arena_armour_slots +45 duel_arena_jewelry_slots +46 duel_arena_weapon_slots +47 duel_arena_center_coords +48 duel_arena_camera_centers +49 duel_arena_camera_coords +50 duel_arena_camera_types +51 sextant_seq_enum +52 trail_easy_enum +53 trail_hard_enum +54 trail_medium_enum +55 trawler_hulls +56 trawler_hulls_flooded +57 stats +58 stat_names +59 stat_members +60 alphabet +61 gnome_batta_ingredients +62 gnome_cocktail_ingredients +63 gnome_crunchies_ingredients +64 gnome_bowl_ingredients +65 fishing_movement_catherby_enum +66 fishing_movement_gnome_stronghold_enum +67 fishing_movement_baxtorian_falls_enum +68 fishing_movement_ardougne_river_enum +69 fishing_movement_fishing_guild_enum +70 fishing_movement_fisher_realm_enum +71 fishing_movement_seers_village_enum +72 fishing_movement_fishing_platform_enum +73 fishing_movement_shilo_village_enum +74 fishing_movement_entrana1_enum +75 fishing_movement_entrana2_enum +76 fishing_movement_musa_point_enum +77 fishing_movement_rimmington_enum +78 fishing_movement_wilderness_camp_enum +79 fishing_movement_draynor_village_enum +80 fishing_movement_barbarian_village_enum +81 fishing_movement_lumbridge_river_enum +82 fishing_movement_al_kharid_enum +83 fishing_movement_taverly_dungeon_enum +84 fishing_movement_observatory_enum +85 potion_1strength +86 potion_1attack +87 potion_1restore +88 potion_1defense +89 potion_prayerrestore +90 potion_2attack +91 potion_fisherspotion +92 potion_2strength +93 potion_2defense +94 potion_rangerspotion +95 potion_antipoison +96 potion_2antipoison +97 potion_potionofzamorak +98 potion_1antidragon +99 prayer_drain_effects +100 prayer_headicons +101 essence_mine_teleports diff --git a/src/public/data/symbols/fontmetrics.sym b/src/public/data/symbols/fontmetrics.sym new file mode 100644 index 00000000..88daa167 --- /dev/null +++ b/src/public/data/symbols/fontmetrics.sym @@ -0,0 +1,4 @@ +0 p11 +1 p12 +2 b12 +3 q8 diff --git a/src/public/data/symbols/hunt.sym b/src/public/data/symbols/hunt.sym new file mode 100644 index 00000000..b4f0acf4 --- /dev/null +++ b/src/public/data/symbols/hunt.sym @@ -0,0 +1,69 @@ +0 ranged +1 constant_melee +2 constant_melee_always +3 constant_ranged +4 cowardly +5 notbusy_melee +6 notbusy_range +7 aggressive_melee +8 aggressive_melee_extra +9 aggressive_ranged +10 aggressive_ranged_extra +11 ap1_trigger_constant +12 ap1_trigger +13 ap2_trigger_constant +14 ap2_trigger +15 op1_trigger_constant +16 op1_trigger +17 op2_trigger_constant +18 op2_trigger +19 queue1_trigger_constant +20 queue1_trigger +21 queue2_trigger_constant +22 queue2_trigger +23 queue3_trigger_constant +24 queue3_trigger +25 queue4_trigger_constant +26 queue4_trigger +27 queue5_trigger_constant +28 queue5_trigger +29 queue6_trigger_constant +30 queue6_trigger +31 queue7_trigger_constant +32 queue7_trigger +33 queue8_trigger_constant +34 queue8_trigger +35 queue9_trigger_constant +36 queue9_trigger +37 queue10_trigger_constant +38 queue10_trigger +39 queue11_trigger_constant +40 queue11_trigger +41 queue12_trigger_constant +42 queue12_trigger +43 queue13_trigger_constant +44 queue13_trigger +45 queue14_trigger_constant +46 queue14_trigger +47 queue15_trigger_constant +48 queue15_trigger +49 queue16_trigger_constant +50 queue16_trigger +51 queue17_trigger_constant +52 queue17_trigger +53 queue18_trigger_constant +54 queue18_trigger +55 queue19_trigger_constant +56 queue19_trigger +57 queue20_trigger_constant +58 queue20_trigger +59 bigmonster_melee +60 bigmonster_ranged +61 example1 +62 example2 +63 example3 +64 example4 +65 example5 +66 example6 +67 king_black_dragon +68 gnomeball_tackler diff --git a/src/public/data/symbols/idk.sym b/src/public/data/symbols/idk.sym new file mode 100644 index 00000000..19c05f09 --- /dev/null +++ b/src/public/data/symbols/idk.sym @@ -0,0 +1,82 @@ +0 man_hair_bald +1 man_hair_dreadlocks +2 man_hair_long +3 man_hair_medium +4 man_hair_tonsure +5 man_hair_short +6 man_hair_cropped +7 man_hair_wildspikes +8 man_hair_spikes +9 man_hair_demon +10 man_jaw_goatee +11 man_jaw_long +12 man_jaw_medium +13 man_jaw_moustache +14 man_jaw_none +15 man_jaw_short +16 man_jaw_pointy +17 man_jaw_split +18 man_torso_plain +19 man_torso_light_buttons +20 man_torso_dark_buttons +21 man_torso_jacket +22 man_torso_shirt +23 man_torso_stitching +24 man_torso_torn +25 man_torso_two_toned +26 man_arms_regular +27 man_arms_musclebound +28 man_arms_loose_sleeved +29 man_arms_large_cuffed +30 man_arms_thin_sleeved +31 man_arms_shoulder_pads +32 man_arms_demon +33 idk_33 +34 idk_34 +35 man_hands_demon +36 man_legs_plain +37 man_legs_shorts +38 man_legs_flares +39 man_legs_turn_ups +40 man_legs_tatty +41 man_legs_demon +42 idk_42 +43 idk_43 +44 man_feet_demon +45 woman_hair_bald +46 woman_hair_bun +47 woman_hair_dreadlocks +48 woman_hair_long +49 woman_hair_medium +50 woman_hair_pigtails +51 woman_hair_short +52 woman_hair_cropped +53 woman_hair_wildspikes +54 woman_hair_spikes +55 idk_55 +56 woman_torso_plain +57 woman_torso_crop_top +58 woman_torso_polo_neck +59 woman_torso_simple +60 woman_torso_torn +61 woman_arms_short_sleeves +62 woman_arms_bare_arms +63 woman_arms_muscley +64 woman_arms_long_sleeved +65 woman_arms_large_cuffs +66 idk_66 +67 idk_67 +68 idk_68 +69 idk_69 +70 woman_legs_plain +71 woman_legs_shorts +72 woman_legs_flares +73 woman_legs_turn_ups +74 woman_legs_turn_ups_2 +75 woman_legs_turn_ups_3 +76 woman_legs_turn_ups_4 +77 woman_legs_turn_ups_5 +78 idk_78 +79 idk_79 +80 idk_80 +81 idk_81 diff --git a/src/public/data/symbols/interface.sym b/src/public/data/symbols/interface.sym new file mode 100644 index 00000000..ec336b67 --- /dev/null +++ b/src/public/data/symbols/interface.sym @@ -0,0 +1,151 @@ +0 player_kit_tailor_legs_man +139 multiobj2 +147 controls +188 tribal_door +246 blurberry_cocktail_guide +296 empty +297 questscroll +306 objbox1 +310 objbox2 +315 objbox3 +321 objbox4 +328 combat_staff_2 +356 message1 +359 message2 +363 message3 +368 message4 +374 message5 +381 part1 +425 combat_blunt +446 target +569 blurberry_cocktail_guide2 +638 questlist +716 tribal_door2 +776 combat_scythe +802 glidermap +837 book +904 options +962 music +968 chat1 +973 chat2 +979 chat3 +986 chat4 +994 smithing +1136 scroll +1151 magic +1644 wornitems +1689 questscroll_itgronigen +1698 combat_axe +1724 combat_staff +1749 combat_crossbow +1764 combat_bow +1779 giannes_cook_book +1829 staff_spells +1908 wilderness_warning +2005 bank_side +2007 player_kit_hair_jaw +2156 party_drop_chest +2276 combat_stabsword +2302 questscroll_fluffs +2311 leather_crafting +2423 combat_hacksword +2449 logout +2459 multi2 +2469 multi3 +2480 multi4 +2492 multi5 +2505 player_kit_hair_woman +2653 player_kit_hair_man +2798 multiobj3_close +2808 xplamp +2851 player_kit_tailor_torso_man +3023 stone +3038 player_kit_tailor_torso_woman +3208 misthalin_map +3213 inventory +3215 book4 +3281 ship_journey +3321 tradeside +3323 trademain +3443 tradeconfirm +3559 player_kit +3702 telescope +3796 combat_spiked +3822 shop_template_side +3824 shop_template +3917 stats +4161 crafting_jewelry +4261 levelup_thieving +4267 levelup_runecraft +4272 levelup_woodcutting +4277 levelup_agility +4282 levelup_firemaking +4416 levelup_mining +4443 levelup_ranged +4445 options_ld +4446 combat_thrown +4461 tickets_shop +4564 trawler_catch +4657 multiobj3 +4667 multiobj4 +4679 combat_spear +4705 combat_heavysword +4731 player_kit_tailor_legs_woman +4882 npcchat1 +4887 npcchat2 +4893 npcchat3 +4900 npcchat4 +4908 part2 +4950 doubleobjbox +4958 gnomeball +4971 book2 +5017 book3 +5063 party_drop_chest_side +5065 friends +5292 bank_main +5392 playermap_east +5441 objbox4_special2 +5454 makeover_mage +5570 combat_pickaxe +5596 trawler_help +5608 prayer +5706 objbox1_special +5710 objbox2_special +5715 ignore +5842 objbox3_special +5848 objbox4_special +5855 combat_unarmed +5875 reportabuse +5993 welcome_screen +6073 welcome_screen_warning +6173 objbox_np4 +6179 tutorial_text +6206 levelup_strength +6211 levelup_magic +6216 levelup_hitpoints +6221 levelup_smithing +6226 levelup_cooking +6231 levelup_fletching +6237 levelup_herblore +6242 levelup_prayer +6247 levelup_attack +6253 levelup_defence +6258 levelup_fishing +6263 levelup_crafting +6299 music_ld +6308 duel_scoreboard +6412 duel_confirm +6573 duel_side +6575 duel_select_type +6733 duel_win +6946 trail_sextant +6960 trail_reward +6965 trail_cluelong +6976 trail_puzzle +6987 trail_clue +6994 trail_map01 +7045 trail_map02 +7113 trail_map03 +7162 trail_map04 +7221 trail_map05 +7271 trail_map06 diff --git a/src/public/data/symbols/inv.sym b/src/public/data/symbols/inv.sym new file mode 100644 index 00000000..6c432d6a --- /dev/null +++ b/src/public/data/symbols/inv.sym @@ -0,0 +1,147 @@ +0 trawler_catch +1 bob_axes +2 armourshop +3 generalshop1 +4 generalshop2 +5 auburys_rune_shop +6 varrock_swordshop +7 lowes_archery_emporium +8 thessalia_fine_clothes +9 zaffs_superior_staffs_nonmem +10 helmet_shop +11 zeke_scimitar +12 louie_leg +13 generalshop3 +14 drogo_mining +15 cassie_shields +16 ranael_skirt +17 generalshop4 +18 valaines_shop_of_champions +19 flynn_maces +20 gnomeball +21 brian_battleaxe +22 waynes_chains +23 generalshop5 +24 generalshop6 +25 betty_magic +26 herquin_gems +27 rommiks_crafty_supplies +28 grum_gold +29 zambos_alcohols +30 gerrant_fish +31 generalshop7 +32 dommiks_crafting_store +33 scavvos_rune_store +34 generalshop8 +35 oziach_shop +36 jakutshop +37 irksolshop +38 generalshop9 +39 gaius_two_handed +40 jatix_herb +41 generalshop10 +42 tony_pizza +43 harry_fish +44 ranged_quiver_inv +45 happy_heroes_hemporium +46 davons_amulet_store +47 generalshop11 +48 candleshop +49 hickton_archery +50 frincos_herb +51 zaffs_superior_staffs_mem +52 alkharid_gem +53 zenesha_platemail +54 ardougne_baker +55 inv_55 +56 inv_56 +57 generalshop12 +58 inv_58 +59 furshop +60 fishing_guild_shop +61 generalshop13 +62 bolkoys_village_shop +63 fancy_clothes_store +64 magic_guild_store +65 jiminuas_jungle_store +66 armoury_combat_training_camp +67 frenitas_cookery_shop +68 nurmof_pickaxe +69 ye_old_tea_shoppe +70 dals_general_orge_supplies +71 frincos_fabulous_herb_store +72 ardougne_silver +73 ardougne_gem +74 ardougne_spice +75 inv_75 +76 food_store +77 bedabin_village_bartering +78 shantay_pass_shop +79 multicannon_parts_for_sale +80 darguads_bow_and_arrows +81 aarons_archery_appendages +82 authentic_throwing_weapons +83 legends_guild_general_store +84 legends_guild_shop_of_useful_items +85 fernaheis_fishing +86 fine_fashions +87 gullock_and_sons +88 funchs_fine_groceries +89 grand_tree_groceries +90 tempinv +91 partyroominv +92 partyroomoffer +93 inv +94 worn +95 bank +96 inv_96 +97 inv_97 +98 inv_98 +99 blurberry_bar +100 giannes_restaurant +101 bronze1 +102 bronze2 +103 bronze3 +104 bronze4 +105 bronze5 +106 iron1 +107 iron2 +108 iron3 +109 iron4 +110 iron5 +111 steel1 +112 steel2 +113 steel3 +114 steel4 +115 steel5 +116 mithril1 +117 mithril2 +118 mithril3 +119 mithril4 +120 mithril5 +121 adamantite1 +122 adamantite2 +123 adamantite3 +124 adamantite4 +125 adamantite5 +126 runite1 +127 runite2 +128 runite3 +129 runite4 +130 runite5 +131 lundails_arena_side_rune_shop +132 mage_arena_staffs +133 death +134 inv_134 +135 shop_of_distaste +136 inv_136 +137 diango_toy +138 oblis_general_store +139 generalshop14 +140 trail_puzzle_inv +141 reward +142 stakeinv +143 shrimp_and_parrot +144 crafting_rings +145 crafting_necklaces +146 crafting_amulets diff --git a/src/public/data/symbols/loc.sym b/src/public/data/symbols/loc.sym new file mode 100644 index 00000000..3c90f7b9 --- /dev/null +++ b/src/public/data/symbols/loc.sym @@ -0,0 +1,3387 @@ +0 loc_0 +1 loc_1 +2 loc_2 +3 loc_3 +4 loc_4 +5 broken_cannon +6 cannon +7 cannon_base +8 cannon_stand +9 cannon_barrels +10 loc_10 +11 loc_11 +12 loc_12 +13 loc_13 +14 loc_14 +15 loc_15 +16 loc_16 +17 loc_17 +18 loc_18 +19 loc_19 +20 loc_20 +21 loc_21 +22 loc_22 +23 loc_23 +24 loc_24 +25 red_clock_spindle_incorrect +26 black_clock_spindle_incorrect +27 white_clock_spindle_incorrect +28 blue_clock_spindle_incorrect +29 red_clock_spindle +30 black_clock_spindle +31 white_clock_spindle +32 blue_clock_spindle +33 loc_33 +34 loc_34 +35 loc_35 +36 loc_36 +37 loc_37 +38 loc_38 +39 loc_39 +40 loc_40 +41 loc_41 +42 loc_42 +43 loc_43 +44 loc_44 +45 loc_45 +46 loc_46 +47 loc_47 +48 loc_48 +49 loc_49 +50 loc_50 +51 loc_51 +52 loc_52 +53 loc_53 +54 loc_54 +55 loc_55 +56 loc_56 +57 loc_57 +58 loc_58 +59 loc_59 +60 loc_60 +61 loc_61 +62 loc_62 +63 loc_63 +64 loc_64 +65 loc_65 +66 loc_66 +67 loc_67 +68 loc_68 +69 loc_69 +70 loc_70 +71 loc_71 +72 loc_72 +73 blackknight_double_door_left +74 blackknight_double_door_right +75 loc_75 +76 loc_76 +77 loc_77 +78 loc_78 +79 loc_79 +80 loc_80 +81 loc_81 +82 loc_82 +83 loc_83 +84 loc_84 +85 loc_85 +86 loc_86 +87 loc_87 +88 loc_88 +89 loc_89 +90 loc_90 +91 loc_91 +92 loc_92 +93 loc_93 +94 loc_94 +95 loc_95 +96 loc_96 +97 loc_97 +98 loc_98 +99 loc_99 +100 loc_100 +101 loc_101 +102 loc_102 +103 loc_103 +104 loc_104 +105 loc_105 +106 hiddentrapdoor_open +107 loc_107 +108 loc_108 +109 loc_109 +110 loc_110 +111 loc_111 +112 loc_112 +113 loc_113 +114 cook_range +115 loc_115 +116 loc_116 +117 loc_117 +118 loc_118 +119 loc_119 +120 loc_120 +121 loc_121 +122 loc_122 +123 loc_123 +124 loc_124 +125 loc_125 +126 loc_126 +127 loc_127 +128 loc_128 +129 loc_129 +130 loc_130 +131 loc_131 +132 loc_132 +133 loc_133 +134 loc_134 +135 loc_135 +136 loc_136 +137 loc_137 +138 loc_138 +139 loc_139 +140 loc_140 +141 loc_141 +142 loc_142 +143 loc_143 +144 loc_144 +145 loc_145 +146 loc_146 +147 loc_147 +148 loc_148 +149 loc_149 +150 loc_150 +151 loc_151 +152 loc_152 +153 loc_153 +154 loc_154 +155 loc_155 +156 loc_156 +157 loc_157 +158 loc_158 +159 loc_159 +160 loc_160 +161 loc_161 +162 loc_162 +163 loc_163 +164 loc_164 +165 furnace2 +166 loc_166 +167 loc_167 +168 loc_168 +169 loc_169 +170 muddy_chest_closed +171 muddy_chest_opened +172 loc_172 +173 loc_173 +174 rubble_1 +175 rubble_2 +176 loc_176 +177 loc_177 +178 loc_178 +179 gravel_1 +180 gravel_2 +181 loc_181 +182 loc_182 +183 mudpiledown +184 loc_184 +185 loc_185 +186 loc_186 +187 loc_187 +188 loc_188 +189 loc_189 +190 loc_190 +191 loc_191 +192 loc_192 +193 loc_193 +194 loc_194 +195 loc_195 +196 loc_196 +197 loc_197 +198 loc_198 +199 loc_199 +200 loc_200 +201 loc_201 +202 loc_202 +203 loc_203 +204 loc_204 +205 loc_205 +206 loc_206 +207 loc_207 +208 loc_208 +209 loc_209 +210 loc_210 +211 loc_211 +212 loc_212 +213 bowcornerl +214 bowcornerr +215 bowmiddle +216 bowshortl +217 bowshortr +218 loc_218 +219 loc_219 +220 loc_220 +221 loc_221 +222 loc_222 +223 loc_223 +224 loc_224 +225 loc_225 +226 loc_226 +227 loc_227 +228 loc_228 +229 loc_229 +230 loc_230 +231 loc_231 +232 loc_232 +233 loc_233 +234 loc_234 +235 loc_235 +236 loc_236 +237 loc_237 +238 loc_238 +239 loc_239 +240 loc_240 +241 loc_241 +242 loc_242 +243 loc_243 +244 loc_244 +245 loc_245 +246 loc_246 +247 loc_247 +248 loc_248 +249 loc_249 +250 loc_250 +251 loc_251 +252 loc_252 +253 loc_253 +254 loc_254 +255 winch +256 loc_256 +257 loc_257 +258 loc_258 +259 loc_259 +260 loc_260 +261 loc_261 +262 loc_262 +263 loc_263 +264 mast4 +265 loc_265 +266 loc_266 +267 loc_267 +268 loc_268 +269 loc_269 +270 loc_270 +271 loc_271 +272 loc_272 +273 loc_273 +274 loc_274 +275 loc_275 +276 loc_276 +277 loc_277 +278 loc_278 +279 loc_279 +280 loc_280 +281 loc_281 +282 loc_282 +283 loc_283 +284 loc_284 +285 loc_285 +286 loc_286 +287 loc_287 +288 loc_288 +289 loc_289 +290 loc_290 +291 loc_291 +292 loc_292 +293 loc_293 +294 loc_294 +295 loc_295 +296 loc_296 +297 loc_297 +298 loc_298 +299 loc_299 +300 loc_300 +301 loc_301 +302 loc_302 +303 loc_303 +304 loc_304 +305 loc_305 +306 loc_306 +307 loc_307 +308 loc_308 +309 loc_309 +310 loc_310 +311 loc_311 +312 loc_312 +313 loc_313 +314 dugupsoil1 +315 dugupsoil2 +316 dugupsoil3 +317 loc_317 +318 loc_318 +319 dugupsoil1_light +320 dugupsoil2_light +321 dugupsoil3_light +322 loc_322 +323 loc_323 +324 dugupsoil1_light2 +325 dugupsoil2_light2 +326 dugupsoil3_light2 +327 loc_327 +328 loc_328 +329 loc_329 +330 loc_330 +331 loc_331 +332 loc_332 +333 loc_333 +334 loc_334 +335 loc_335 +336 loc_336 +337 loc_337 +338 loc_338 +339 loc_339 +340 loc_340 +341 loc_341 +342 loc_342 +343 loc_343 +344 loc_344 +345 loc_345 +346 loc_346 +347 loc_347 +348 loc_348 +349 loc_349 +350 loc_350 +351 loc_351 +352 loc_352 +353 loc_353 +354 loc_354 +355 loc_355 +356 loc_356 +357 loc_357 +358 loc_358 +359 loc_359 +360 loc_360 +361 loc_361 +362 loc_362 +363 loc_363 +364 loc_364 +365 loc_365 +366 loc_366 +367 loc_367 +368 loc_368 +369 loc_369 +370 loc_370 +371 loc_371 +372 loc_372 +373 loc_373 +374 hat_stand +375 loc_375 +376 loc_376 +377 loc_377 +378 loc_378 +379 loc_379 +380 loc_380 +381 loc_381 +382 loc_382 +383 loc_383 +384 loc_384 +385 loc_385 +386 loc_386 +387 loc_387 +388 loc_388 +389 loc_389 +390 loc_390 +391 loc_391 +392 loc_392 +393 loc_393 +394 loc_394 +395 loc_395 +396 loc_396 +397 loc_397 +398 loc_398 +399 loc_399 +400 loc_400 +401 loc_401 +402 loc_402 +403 loc_403 +404 loc_404 +405 loc_405 +406 loc_406 +407 loc_407 +408 loc_408 +409 loc_409 +410 loc_410 +411 loc_411 +412 loc_412 +413 loc_413 +414 loc_414 +415 loc_415 +416 loc_416 +417 loc_417 +418 loc_418 +419 loc_419 +420 loc_420 +421 loc_421 +422 loc_422 +423 loc_423 +424 loc_424 +425 loc_425 +426 loc_426 +427 loc_427 +428 loc_428 +429 loc_429 +430 loc_430 +431 loc_431 +432 loc_432 +433 loc_433 +434 loc_434 +435 loc_435 +436 loc_436 +437 loc_437 +438 loc_438 +439 loc_439 +440 loc_440 +441 loc_441 +442 loc_442 +443 boulder_group +444 loc_444 +445 loc_445 +446 loc_446 +447 loc_447 +448 loc_448 +449 loc_449 +450 empty_rock_1 +451 empty_rock_2 +452 empty_rock_3 +453 empty_rock_4 +454 loc_454 +455 loc_455 +456 loc_456 +457 loc_457 +458 loc_458 +459 loc_459 +460 loc_460 +461 loc_461 +462 loc_462 +463 loc_463 +464 loc_464 +465 loc_465 +466 loc_466 +467 loc_467 +468 loc_468 +469 loc_469 +470 loc_470 +471 loc_471 +472 loc_472 +473 loc_473 +474 loc_474 +475 loc_475 +476 loc_476 +477 loc_477 +478 loc_478 +479 loc_479 +480 loc_480 +481 loc_481 +482 loc_482 +483 loc_483 +484 loc_484 +485 loc_485 +486 loc_486 +487 loc_487 +488 loc_488 +489 loc_489 +490 loc_490 +491 loc_491 +492 loc_492 +493 greatrunestone +494 greatrunestone_mid +495 greatrunestone_uppermid +496 greatrunestone_top +497 greatrunestone_top2 +498 loc_498 +499 loc_499 +500 loc_500 +501 loc_501 +502 loc_502 +503 loc_503 +504 loc_504 +505 loc_505 +506 loc_506 +507 loc_507 +508 loc_508 +509 loc_509 +510 loc_510 +511 loc_511 +512 loc_512 +513 loc_513 +514 loc_514 +515 greatrunestone_top_glow +516 loc_516 +517 loc_517 +518 loc_518 +519 loc_519 +520 loc_520 +521 loc_521 +522 loc_522 +523 loc_523 +524 loc_524 +525 loc_525 +526 loc_526 +527 loc_527 +528 loc_528 +529 loc_529 +530 loc_530 +531 loc_531 +532 loc_532 +533 loc_533 +534 loc_534 +535 loc_535 +536 loc_536 +537 loc_537 +538 loc_538 +539 loc_539 +540 loc_540 +541 loc_541 +542 loc_542 +543 loc_543 +544 loc_544 +545 loc_545 +546 loc_546 +547 loc_547 +548 loc_548 +549 loc_549 +550 loc_550 +551 loc_551 +552 loc_552 +553 loc_553 +554 loc_554 +555 loc_555 +556 loc_556 +557 loc_557 +558 loc_558 +559 loc_559 +560 loc_560 +561 loc_561 +562 loc_562 +563 loc_563 +564 loc_564 +565 loc_565 +566 loc_566 +567 loc_567 +568 loc_568 +569 loc_569 +570 loc_570 +571 loc_571 +572 loc_572 +573 loc_573 +574 loc_574 +575 loc_575 +576 loc_576 +577 loc_577 +578 loc_578 +579 loc_579 +580 loc_580 +581 loc_581 +582 loc_582 +583 loc_583 +584 loc_584 +585 loc_585 +586 loc_586 +587 loc_587 +588 loc_588 +589 loc_589 +590 loc_590 +591 loc_591 +592 loc_592 +593 loc_593 +594 loc_594 +595 loc_595 +596 loc_596 +597 loc_597 +598 loc_598 +599 loc_599 +600 loc_600 +601 loc_601 +602 loc_602 +603 loc_603 +604 loc_604 +605 loc_605 +606 loc_606 +607 loc_607 +608 loc_608 +609 loc_609 +610 loc_610 +611 loc_611 +612 loc_612 +613 loc_613 +614 loc_614 +615 loc_615 +616 loc_616 +617 loc_617 +618 loc_618 +619 loc_619 +620 loc_620 +621 loc_621 +622 loc_622 +623 loc_623 +624 loc_624 +625 loc_625 +626 loc_626 +627 loc_627 +628 silver_stall +629 silk_stall +630 bakery_stall +631 gem_stall +632 fur_stall +633 spice_stall +634 market_stall +635 tea_stall_stealing +636 loc_636 +637 loc_637 +638 loc_638 +639 loc_639 +640 loc_640 +641 loc_641 +642 loc_642 +643 loc_643 +644 loc_644 +645 loc_645 +646 loc_646 +647 loc_647 +648 loc_648 +649 loc_649 +650 loc_650 +651 loc_651 +652 loc_652 +653 loc_653 +654 loc_654 +655 loc_655 +656 loc_656 +657 loc_657 +658 loc_658 +659 loc_659 +660 loc_660 +661 loc_661 +662 loc_662 +663 loc_663 +664 loc_664 +665 loc_665 +666 loc_666 +667 loc_667 +668 loc_668 +669 floorlever_on +670 floorlever_off +671 catapult +672 barrel_breaking +673 gas +674 gas_chest +675 gas_rocks1 +676 gas_rocks2 +677 gas_rocks3 +678 fishingspot +679 fishingspot2 +680 loc_680 +681 loc_681 +682 loc_682 +683 loc_683 +684 loc_684 +685 loc_685 +686 loc_686 +687 loc_687 +688 loc_688 +689 loc_689 +690 loc_690 +691 screen +692 loc_692 +693 loc_693 +694 loc_694 +695 loc_695 +696 loc_696 +697 loc_697 +698 loc_698 +699 loc_699 +700 loc_700 +701 loc_701 +702 loc_702 +703 loc_703 +704 loc_704 +705 loc_705 +706 loc_706 +707 loc_707 +708 loc_708 +709 loc_709 +710 loc_710 +711 loc_711 +712 loc_712 +713 loc_713 +714 loc_714 +715 loc_715 +716 loc_716 +717 loc_717 +718 loc_718 +719 loc_719 +720 loc_720 +721 loc_721 +722 loc_722 +723 loc_723 +724 loc_724 +725 fire_graphic +726 loc_726 +727 loc_727 +728 loc_728 +729 loc_729 +730 loc_730 +731 loc_731 +732 loc_732 +733 loc_733 +734 loc_734 +735 loc_735 +736 loc_736 +737 loc_737 +738 loc_738 +739 magic_portal +740 glowing_circle +741 loc_741 +742 ladder_old_top +743 loc_743 +744 loc_744 +745 loc_745 +746 loc_746 +747 loc_747 +748 loc_748 +749 lineofsight_ruler +750 loc_750 +751 loc_751 +752 loc_752 +753 loc_753 +754 loc_754 +755 loc_755 +756 loc_756 +757 loc_757 +758 loc_758 +759 loc_759 +760 loc_760 +761 loc_761 +762 loc_762 +763 loc_763 +764 loc_764 +765 loc_765 +766 loc_766 +767 loc_767 +768 loc_768 +769 loc_769 +770 loc_770 +771 gnomeglider_icon1 +772 gnomeglider_icon2 +773 gnomeglider_icon3 +774 gnomeglider_icon4 +775 loc_775 +776 loc_776 +777 loc_777 +778 loc_778 +779 loc_779 +780 loc_780 +781 loc_781 +782 loc_782 +783 loc_783 +784 loc_784 +785 loc_785 +786 loc_786 +787 loc_787 +788 loc_788 +789 loc_789 +790 loc_790 +791 loc_791 +792 loc_792 +793 loc_793 +794 loc_794 +795 loc_795 +796 loc_796 +797 loc_797 +798 loc_798 +799 loc_799 +800 loc_800 +801 loc_801 +802 loc_802 +803 loc_803 +804 loc_804 +805 loc_805 +806 loc_806 +807 loc_807 +808 loc_808 +809 loc_809 +810 loc_810 +811 loc_811 +812 loc_812 +813 loc_813 +814 loc_814 +815 loc_815 +816 loc_816 +817 loc_817 +818 loc_818 +819 loc_819 +820 loc_820 +821 loc_821 +822 loc_822 +823 attack_dummy +824 loc_824 +825 damaged_armour +826 loc_826 +827 loc_827 +828 loc_828 +829 loc_829 +830 loc_830 +831 loc_831 +832 loc_832 +833 loc_833 +834 loc_834 +835 loc_835 +836 loc_836 +837 loc_837 +838 loc_838 +839 loc_839 +840 loc_840 +841 loc_841 +842 loc_842 +843 loc_843 +844 loc_844 +845 loc_845 +846 loc_846 +847 loc_847 +848 loc_848 +849 loc_849 +850 loc_850 +851 loc_851 +852 loc_852 +853 loc_853 +854 loc_854 +855 loc_855 +856 loc_856 +857 loc_857 +858 loc_858 +859 loc_859 +860 loc_860 +861 loc_861 +862 loc_862 +863 loc_863 +864 loc_864 +865 loc_865 +866 loc_866 +867 loc_867 +868 loc_868 +869 loc_869 +870 loc_870 +871 loc_871 +872 loc_872 +873 loc_873 +874 loc_874 +875 loc_875 +876 loc_876 +877 loc_877 +878 loc_878 +879 loc_879 +880 loc_880 +881 loc_881 +882 loc_882 +883 loc_883 +884 loc_884 +885 loc_885 +886 loc_886 +887 loc_887 +888 loc_888 +889 loc_889 +890 loc_890 +891 loc_891 +892 loc_892 +893 loc_893 +894 loc_894 +895 loc_895 +896 loc_896 +897 loc_897 +898 loc_898 +899 loc_899 +900 loc_900 +901 loc_901 +902 loc_902 +903 loc_903 +904 loc_904 +905 loc_905 +906 loc_906 +907 loc_907 +908 loc_908 +909 loc_909 +910 loc_910 +911 loc_911 +912 loc_912 +913 loc_913 +914 loc_914 +915 loc_915 +916 poorrug1 +917 poorrugcorner1 +918 poorrug1side +919 loc_919 +920 loc_920 +921 loc_921 +922 loc_922 +923 loc_923 +924 loc_924 +925 loc_925 +926 loc_926 +927 loc_927 +928 loc_928 +929 loc_929 +930 loc_930 +931 loc_931 +932 loc_932 +933 loc_933 +934 loc_934 +935 loc_935 +936 loc_936 +937 loc_937 +938 loc_938 +939 loc_939 +940 loc_940 +941 loc_941 +942 loc_942 +943 greenrugcorner +944 greenrugside +945 greenrugmiddle +946 loc_946 +947 loc_947 +948 loc_948 +949 loc_949 +950 loc_950 +951 loc_951 +952 loc_952 +953 loc_953 +954 loc_954 +955 loc_955 +956 loc_956 +957 loc_957 +958 loc_958 +959 loc_959 +960 loc_960 +961 loc_961 +962 loc_962 +963 loc_963 +964 loc_964 +965 loc_965 +966 loc_966 +967 loc_967 +968 loc_968 +969 loc_969 +970 varrock_palace_plaque +971 loc_971 +972 loc_972 +973 loc_973 +974 loc_974 +975 loc_975 +976 loc_976 +977 loc_977 +978 loc_978 +979 loc_979 +980 fencing +981 gardenfencing +982 poshwallfencing +983 loc_983 +984 woodenrailing +985 loc_985 +986 poshwallgatetop +987 loc_987 +988 loc_988 +989 loc_989 +990 poshwallgatetop_brown +991 loc_991 +992 loc_992 +993 loc_993 +994 loc_994 +995 loc_995 +996 loc_996 +997 loc_997 +998 loc_998 +999 loc_999 +1000 loc_1000 +1001 loc_1001 +1002 loc_1002 +1003 loc_1003 +1004 loc_1004 +1005 loc_1005 +1006 loc_1006 +1007 loc_1007 +1008 loc_1008 +1009 loc_1009 +1010 loc_1010 +1011 loc_1011 +1012 loc_1012 +1013 loc_1013 +1014 loc_1014 +1015 loc_1015 +1016 loc_1016 +1017 loc_1017 +1018 loc_1018 +1019 loc_1019 +1020 loc_1020 +1021 loc_1021 +1022 loc_1022 +1023 loc_1023 +1024 loc_1024 +1025 loc_1025 +1026 loc_1026 +1027 loc_1027 +1028 loc_1028 +1029 loc_1029 +1030 loc_1030 +1031 loc_1031 +1032 loc_1032 +1033 loc_1033 +1034 loc_1034 +1035 loc_1035 +1036 loc_1036 +1037 loc_1037 +1038 loc_1038 +1039 loc_1039 +1040 loc_1040 +1041 loc_1041 +1042 loc_1042 +1043 loc_1043 +1044 loc_1044 +1045 loc_1045 +1046 loc_1046 +1047 loc_1047 +1048 loc_1048 +1049 loc_1049 +1050 loc_1050 +1051 loc_1051 +1052 loc_1052 +1053 loc_1053 +1054 loc_1054 +1055 loc_1055 +1056 loc_1056 +1057 loc_1057 +1058 loc_1058 +1059 loc_1059 +1060 loc_1060 +1061 loc_1061 +1062 loc_1062 +1063 loc_1063 +1064 loc_1064 +1065 loc_1065 +1066 loc_1066 +1067 loc_1067 +1068 loc_1068 +1069 loc_1069 +1070 loc_1070 +1071 loc_1071 +1072 loc_1072 +1073 loc_1073 +1074 loc_1074 +1075 loc_1075 +1076 loc_1076 +1077 loc_1077 +1078 loc_1078 +1079 loc_1079 +1080 loc_1080 +1081 loc_1081 +1082 loc_1082 +1083 loc_1083 +1084 loc_1084 +1085 loc_1085 +1086 loc_1086 +1087 loc_1087 +1088 loc_1088 +1089 loc_1089 +1090 loc_1090 +1091 loc_1091 +1092 loc_1092 +1093 loc_1093 +1094 loc_1094 +1095 loc_1095 +1096 loc_1096 +1097 loc_1097 +1098 loc_1098 +1099 loc_1099 +1100 loc_1100 +1101 loc_1101 +1102 loc_1102 +1103 loc_1103 +1104 loc_1104 +1105 loc_1105 +1106 loc_1106 +1107 loc_1107 +1108 loc_1108 +1109 loc_1109 +1110 loc_1110 +1111 loc_1111 +1112 loc_1112 +1113 loc_1113 +1114 loc_1114 +1115 loc_1115 +1116 loc_1116 +1117 loc_1117 +1118 loc_1118 +1119 loc_1119 +1120 loc_1120 +1121 loc_1121 +1122 loc_1122 +1123 loc_1123 +1124 loc_1124 +1125 loc_1125 +1126 loc_1126 +1127 loc_1127 +1128 loc_1128 +1129 loc_1129 +1130 loc_1130 +1131 tk1 +1132 loc_1132 +1133 loc_1133 +1134 loc_1134 +1135 loc_1135 +1136 loc_1136 +1137 loc_1137 +1138 loc_1138 +1139 loc_1139 +1140 loc_1140 +1141 loc_1141 +1142 loc_1142 +1143 loc_1143 +1144 loc_1144 +1145 loc_1145 +1146 loc_1146 +1147 loc_1147 +1148 loc_1148 +1149 loc_1149 +1150 loc_1150 +1151 loc_1151 +1152 loc_1152 +1153 loc_1153 +1154 loc_1154 +1155 loc_1155 +1156 loc_1156 +1157 loc_1157 +1158 loc_1158 +1159 loc_1159 +1160 loc_1160 +1161 cabbage +1162 loc_1162 +1163 loc_1163 +1164 loc_1164 +1165 loc_1165 +1166 loc_1166 +1167 loc_1167 +1168 loc_1168 +1169 loc_1169 +1170 loc_1170 +1171 loc_1171 +1172 loc_1172 +1173 loc_1173 +1174 loc_1174 +1175 loc_1175 +1176 loc_1176 +1177 loc_1177 +1178 loc_1178 +1179 loc_1179 +1180 loc_1180 +1181 loc_1181 +1182 loc_1182 +1183 loc_1183 +1184 loc_1184 +1185 loc_1185 +1186 loc_1186 +1187 loc_1187 +1188 loc_1188 +1189 daisys +1190 loc_1190 +1191 loc_1191 +1192 loc_1192 +1193 loc_1193 +1194 loc_1194 +1195 loc_1195 +1196 loc_1196 +1197 loc_1197 +1198 loc_1198 +1199 loc_1199 +1200 loc_1200 +1201 loc_1201 +1202 loc_1202 +1203 loc_1203 +1204 loc_1204 +1205 loc_1205 +1206 loc_1206 +1207 loc_1207 +1208 loc_1208 +1209 loc_1209 +1210 loc_1210 +1211 loc_1211 +1212 loc_1212 +1213 loc_1213 +1214 loc_1214 +1215 loc_1215 +1216 loc_1216 +1217 loc_1217 +1218 loc_1218 +1219 loc_1219 +1220 loc_1220 +1221 loc_1221 +1222 loc_1222 +1223 loc_1223 +1224 loc_1224 +1225 loc_1225 +1226 loc_1226 +1227 loc_1227 +1228 loc_1228 +1229 loc_1229 +1230 loc_1230 +1231 loc_1231 +1232 loc_1232 +1233 loc_1233 +1234 loc_1234 +1235 loc_1235 +1236 loc_1236 +1237 loc_1237 +1238 loc_1238 +1239 loc_1239 +1240 loc_1240 +1241 loc_1241 +1242 loc_1242 +1243 loc_1243 +1244 loc_1244 +1245 loc_1245 +1246 full_twig +1247 broken_twig +1248 sticks_twigs +1249 loc_1249 +1250 loc_1250 +1251 loc_1251 +1252 loc_1252 +1253 grass_1 +1254 grass_2 +1255 grass_3 +1256 grass_4 +1257 grass_light_1 +1258 grass_light_2 +1259 grass_light_3 +1260 grass_light_4 +1261 loc_1261 +1262 loc_1262 +1263 loc_1263 +1264 leaves_1 +1265 leaves_2 +1266 loc_1266 +1267 loc_1267 +1268 loc_1268 +1269 loc_1269 +1270 loc_1270 +1271 loc_1271 +1272 loc_1272 +1273 loc_1273 +1274 loc_1274 +1275 loc_1275 +1276 loc_1276 +1277 loc_1277 +1278 loc_1278 +1279 loc_1279 +1280 loc_1280 +1281 oak_tree +1282 loc_1282 +1283 loc_1283 +1284 loc_1284 +1285 loc_1285 +1286 loc_1286 +1287 loc_1287 +1288 loc_1288 +1289 loc_1289 +1290 loc_1290 +1291 loc_1291 +1292 loc_1292 +1293 loc_1293 +1294 loc_1294 +1295 loc_1295 +1296 loc_1296 +1297 loc_1297 +1298 loc_1298 +1299 loc_1299 +1300 loc_1300 +1301 loc_1301 +1302 loc_1302 +1303 loc_1303 +1304 loc_1304 +1305 loc_1305 +1306 magic_tree +1307 maple_tree +1308 willow_tree +1309 yew_tree +1310 loc_1310 +1311 loc_1311 +1312 loc_1312 +1313 loc_1313 +1314 loc_1314 +1315 loc_1315 +1316 loc_1316 +1317 loc_1317 +1318 loc_1318 +1319 loc_1319 +1320 loc_1320 +1321 loc_1321 +1322 loc_1322 +1323 loc_1323 +1324 loc_1324 +1325 loc_1325 +1326 loc_1326 +1327 loc_1327 +1328 loc_1328 +1329 loc_1329 +1330 loc_1330 +1331 loc_1331 +1332 loc_1332 +1333 loc_1333 +1334 loc_1334 +1335 loc_1335 +1336 loc_1336 +1337 loc_1337 +1338 loc_1338 +1339 loc_1339 +1340 loc_1340 +1341 loc_1341 +1342 loc_1342 +1343 loc_1343 +1344 loc_1344 +1345 loc_1345 +1346 loc_1346 +1347 loc_1347 +1348 loc_1348 +1349 loc_1349 +1350 loc_1350 +1351 loc_1351 +1352 loc_1352 +1353 loc_1353 +1354 loc_1354 +1355 oak_tree_stump +1356 loc_1356 +1357 loc_1357 +1358 loc_1358 +1359 loc_1359 +1360 loc_1360 +1361 loc_1361 +1362 loc_1362 +1363 loc_1363 +1364 loc_1364 +1365 loc_1365 +1366 loc_1366 +1367 loc_1367 +1368 loc_1368 +1369 loc_1369 +1370 loc_1370 +1371 loc_1371 +1372 loc_1372 +1373 loc_1373 +1374 loc_1374 +1375 loc_1375 +1376 loc_1376 +1377 loc_1377 +1378 loc_1378 +1379 loc_1379 +1380 loc_1380 +1381 loc_1381 +1382 loc_1382 +1383 loc_1383 +1384 loc_1384 +1385 loc_1385 +1386 loc_1386 +1387 loc_1387 +1388 loc_1388 +1389 loc_1389 +1390 loc_1390 +1391 loc_1391 +1392 loc_1392 +1393 loc_1393 +1394 loc_1394 +1395 loc_1395 +1396 loc_1396 +1397 loc_1397 +1398 loc_1398 +1399 loc_1399 +1400 loc_1400 +1401 loc_1401 +1402 loc_1402 +1403 loc_1403 +1404 loc_1404 +1405 loc_1405 +1406 loc_1406 +1407 loc_1407 +1408 pineapple_plant_wild_5 +1409 pineapple_plant_wild_4 +1410 pineapple_plant_wild_3 +1411 pineapple_plant_wild_2 +1412 pineapple_plant_wild_1 +1413 pineapple_plant_wild_0 +1414 loc_1414 +1415 loc_1415 +1416 loc_1416 +1417 loc_1417 +1418 loc_1418 +1419 loc_1419 +1420 loc_1420 +1421 cavewall_facewithledge1 +1422 loc_1422 +1423 loc_1423 +1424 loc_1424 +1425 loc_1425 +1426 loc_1426 +1427 loc_1427 +1428 loc_1428 +1429 loc_1429 +1430 loc_1430 +1431 loc_1431 +1432 loc_1432 +1433 loc_1433 +1434 loc_1434 +1435 loc_1435 +1436 loc_1436 +1437 loc_1437 +1438 loc_1438 +1439 loc_1439 +1440 loc_1440 +1441 loc_1441 +1442 loc_1442 +1443 loc_1443 +1444 loc_1444 +1445 loc_1445 +1446 loc_1446 +1447 loc_1447 +1448 loc_1448 +1449 loc_1449 +1450 loc_1450 +1451 loc_1451 +1452 loc_1452 +1453 loc_1453 +1454 loc_1454 +1455 loc_1455 +1456 loc_1456 +1457 loc_1457 +1458 loc_1458 +1459 loc_1459 +1460 loc_1460 +1461 loc_1461 +1462 loc_1462 +1463 loc_1463 +1464 loc_1464 +1465 loc_1465 +1466 loc_1466 +1467 loc_1467 +1468 loc_1468 +1469 loc_1469 +1470 loc_1470 +1471 loc_1471 +1472 cavewall_slopefill_dark +1473 loc_1473 +1474 loc_1474 +1475 loc_1475 +1476 loc_1476 +1477 loc_1477 +1478 loc_1478 +1479 loc_1479 +1480 loc_1480 +1481 loc_1481 +1482 loc_1482 +1483 loc_1483 +1484 loc_1484 +1485 loc_1485 +1486 loc_1486 +1487 loc_1487 +1488 loc_1488 +1489 loc_1489 +1490 loc_1490 +1491 loc_1491 +1492 loc_1492 +1493 loc_1493 +1494 loc_1494 +1495 loc_1495 +1496 loc_1496 +1497 loc_1497 +1498 loc_1498 +1499 loc_1499 +1500 loc_1500 +1501 loc_1501 +1502 loc_1502 +1503 loc_1503 +1504 loc_1504 +1505 loc_1505 +1506 loc_1506 +1507 loc_1507 +1508 loc_1508 +1509 loc_1509 +1510 loc_1510 +1511 loc_1511 +1512 loc_1512 +1513 loc_1513 +1514 loc_1514 +1515 loc_1515 +1516 loc_1516 +1517 loc_1517 +1518 loc_1518 +1519 loc_1519 +1520 loc_1520 +1521 loc_1521 +1522 loc_1522 +1523 loc_1523 +1524 loc_1524 +1525 loc_1525 +1526 loc_1526 +1527 loc_1527 +1528 loc_1528 +1529 loc_1529 +1530 loc_1530 +1531 loc_1531 +1532 loc_1532 +1533 loc_1533 +1534 loc_1534 +1535 loc_1535 +1536 loc_1536 +1537 loc_1537 +1538 loc_1538 +1539 loc_1539 +1540 loc_1540 +1541 loc_1541 +1542 loc_1542 +1543 loc_1543 +1544 loc_1544 +1545 loc_1545 +1546 loc_1546 +1547 loc_1547 +1548 loc_1548 +1549 loc_1549 +1550 loc_1550 +1551 loc_1551 +1552 loc_1552 +1553 loc_1553 +1554 loc_1554 +1555 loc_1555 +1556 loc_1556 +1557 loc_1557 +1558 loc_1558 +1559 loc_1559 +1560 loc_1560 +1561 loc_1561 +1562 loc_1562 +1563 loc_1563 +1564 loc_1564 +1565 loc_1565 +1566 towered_gateway_roof +1567 loc_1567 +1568 loc_1568 +1569 loc_1569 +1570 loc_1570 +1571 loc_1571 +1572 loc_1572 +1573 loc_1573 +1574 loc_1574 +1575 loc_1575 +1576 loc_1576 +1577 loc_1577 +1578 loc_1578 +1579 loc_1579 +1580 loc_1580 +1581 loc_1581 +1582 loc_1582 +1583 loc_1583 +1584 loc_1584 +1585 loc_1585 +1586 loc_1586 +1587 loc_1587 +1588 loc_1588 +1589 loc_1589 +1590 loc_1590 +1591 loc_1591 +1592 loc_1592 +1593 loc_1593 +1594 loc_1594 +1595 loc_1595 +1596 loc_1596 +1597 loc_1597 +1598 loc_1598 +1599 loc_1599 +1600 loc_1600 +1601 loc_1601 +1602 timberwall +1603 loc_1603 +1604 loc_1604 +1605 loc_1605 +1606 loc_1606 +1607 loc_1607 +1608 loc_1608 +1609 loc_1609 +1610 loc_1610 +1611 loc_1611 +1612 loc_1612 +1613 loc_1613 +1614 loc_1614 +1615 loc_1615 +1616 loc_1616 +1617 loc_1617 +1618 loc_1618 +1619 loc_1619 +1620 loc_1620 +1621 loc_1621 +1622 loc_1622 +1623 loc_1623 +1624 crumblywall1 +1625 crumblywall1r +1626 crumblywall2 +1627 loc_1627 +1628 loc_1628 +1629 crumblywalllow +1630 crumblywalllow2 +1631 oldwall +1632 loc_1632 +1633 loc_1633 +1634 loc_1634 +1635 loc_1635 +1636 loc_1636 +1637 loc_1637 +1638 loc_1638 +1639 loc_1639 +1640 loc_1640 +1641 loc_1641 +1642 loc_1642 +1643 loc_1643 +1644 loc_1644 +1645 oldcastlewallbattlementroof +1646 oldcastlearrowslit +1647 loc_1647 +1648 loc_1648 +1649 loc_1649 +1650 loc_1650 +1651 loc_1651 +1652 oldstone_arched_doortop +1653 oldstone_arched_doortop_b_l +1654 oldstone_arched_doortop_b_r +1655 oldstone_arched_doorbase_r +1656 oldstone_arched_doorbase_l +1657 crumblywall_with_roof_diag +1658 loc_1658 +1659 loc_1659 +1660 loc_1660 +1661 loc_1661 +1662 loc_1662 +1663 loc_1663 +1664 loc_1664 +1665 loc_1665 +1666 loc_1666 +1667 loc_1667 +1668 loc_1668 +1669 loc_1669 +1670 loc_1670 +1671 loc_1671 +1672 loc_1672 +1673 loc_1673 +1674 tentwall3 +1675 loc_1675 +1676 loc_1676 +1677 loc_1677 +1678 tent_door +1679 loc_1679 +1680 guideropes1 +1681 loc_1681 +1682 tentroofcentre1 +1683 loc_1683 +1684 loc_1684 +1685 tentroofcentreold +1686 loc_1686 +1687 loc_1687 +1688 loc_1688 +1689 loc_1689 +1690 loc_1690 +1691 loc_1691 +1692 loc_1692 +1693 loc_1693 +1694 loc_1694 +1695 loc_1695 +1696 loc_1696 +1697 loc_1697 +1698 loc_1698 +1699 loc_1699 +1700 loc_1700 +1701 loc_1701 +1702 loc_1702 +1703 loc_1703 +1704 loc_1704 +1705 loc_1705 +1706 loc_1706 +1707 loc_1707 +1708 loc_1708 +1709 loc_1709 +1710 loc_1710 +1711 loc_1711 +1712 loc_1712 +1713 loc_1713 +1714 loc_1714 +1715 loc_1715 +1716 loc_1716 +1717 loc_1717 +1718 loc_1718 +1719 loc_1719 +1720 loc_1720 +1721 loc_1721 +1722 loc_1722 +1723 loc_1723 +1724 loc_1724 +1725 loc_1725 +1726 loc_1726 +1727 loc_1727 +1728 loc_1728 +1729 loc_1729 +1730 loc_1730 +1731 loc_1731 +1732 loc_1732 +1733 loc_1733 +1734 loc_1734 +1735 loc_1735 +1736 loc_1736 +1737 loc_1737 +1738 loc_1738 +1739 loc_1739 +1740 loc_1740 +1741 loc_1741 +1742 loc_1742 +1743 loc_1743 +1744 loc_1744 +1745 loc_1745 +1746 loc_1746 +1747 loc_1747 +1748 loc_1748 +1749 loc_1749 +1750 loc_1750 +1751 loc_1751 +1752 broken_ladder +1753 loc_1753 +1754 loc_1754 +1755 loc_1755 +1756 loc_1756 +1757 loc_1757 +1758 loc_1758 +1759 loc_1759 +1760 loc_1760 +1761 loc_1761 +1762 loc_1762 +1763 climbing_rope_top +1764 loc_1764 +1765 loc_1765 +1766 loc_1766 +1767 loc_1767 +1768 loc_1768 +1769 loc_1769 +1770 loc_1770 +1771 loc_1771 +1772 loc_1772 +1773 watchtower_leg1 +1774 loc_1774 +1775 loc_1775 +1776 loc_1776 +1777 loc_1777 +1778 loc_1778 +1779 loc_1779 +1780 loc_1780 +1781 millbase +1782 millbase_full +1783 loc_1783 +1784 loc_1784 +1785 loc_1785 +1786 mroof1 +1787 mroof2 +1788 mroof3 +1789 mroof4 +1790 loc_1790 +1791 loc_1791 +1792 loc_1792 +1793 loc_1793 +1794 loc_1794 +1795 loc_1795 +1796 magicwall +1797 loc_1797 +1798 loc_1798 +1799 loc_1799 +1800 loc_1800 +1801 loc_1801 +1802 loc_1802 +1803 loc_1803 +1804 loc_1804 +1805 loc_1805 +1806 loc_1806 +1807 loc_1807 +1808 loc_1808 +1809 loc_1809 +1810 loc_1810 +1811 loc_1811 +1812 loc_1812 +1813 loc_1813 +1814 ardougne_to_wilderness_lever +1815 wilderness_to_ardougne_lever +1816 loc_1816 +1817 loc_1817 +1818 woodfloor_crumbly_l +1819 woodfloor_crumbly_r +1820 loc_1820 +1821 loc_1821 +1822 loc_1822 +1823 loc_1823 +1824 loc_1824 +1825 loc_1825 +1826 loc_1826 +1827 loc_1827 +1828 loc_1828 +1829 loc_1829 +1830 loc_1830 +1831 loc_1831 +1832 loc_1832 +1833 loc_1833 +1834 loc_1834 +1835 loc_1835 +1836 loc_1836 +1837 loc_1837 +1838 loc_1838 +1839 loc_1839 +1840 loc_1840 +1841 loc_1841 +1842 loc_1842 +1843 loc_1843 +1844 loc_1844 +1845 loc_1845 +1846 loc_1846 +1847 loc_1847 +1848 loc_1848 +1849 loc_1849 +1850 loc_1850 +1851 loc_1851 +1852 loc_1852 +1853 loc_1853 +1854 loc_1854 +1855 loc_1855 +1856 loc_1856 +1857 loc_1857 +1858 loc_1858 +1859 loc_1859 +1860 loc_1860 +1861 loc_1861 +1862 skewsteps1 +1863 loc_1863 +1864 loc_1864 +1865 loc_1865 +1866 loc_1866 +1867 loc_1867 +1868 loc_1868 +1869 marblepillar +1870 loc_1870 +1871 loc_1871 +1872 wallsupport +1873 loc_1873 +1874 loc_1874 +1875 loc_1875 +1876 loc_1876 +1877 loc_1877 +1878 loc_1878 +1879 loc_1879 +1880 loc_1880 +1881 loc_1881 +1882 loc_1882 +1883 loc_1883 +1884 runetemple_ruined +1885 runetemple +1886 loc_1886 +1887 runetemple_altar_new +1888 runetemple_altar_old +1889 loc_1889 +1890 loc_1890 +1891 loc_1891 +1892 loc_1892 +1893 loc_1893 +1894 loc_1894 +1895 loc_1895 +1896 loc_1896 +1897 loc_1897 +1898 loc_1898 +1899 loc_1899 +1900 loc_1900 +1901 loc_1901 +1902 brickwall +1903 loc_1903 +1904 loc_1904 +1905 loc_1905 +1906 loc_1906 +1907 loc_1907 +1908 loc_1908 +1909 loc_1909 +1910 loc_1910 +1911 castlewall +1912 loc_1912 +1913 loc_1913 +1914 loc_1914 +1915 loc_1915 +1916 loc_1916 +1917 loc_1917 +1918 loc_1918 +1919 loc_1919 +1920 loc_1920 +1921 loc_1921 +1922 loc_1922 +1923 loc_1923 +1924 loc_1924 +1925 loc_1925 +1926 loc_1926 +1927 loc_1927 +1928 loc_1928 +1929 loc_1929 +1930 loc_1930 +1931 loc_1931 +1932 loc_1932 +1933 loc_1933 +1934 loc_1934 +1935 loc_1935 +1936 loc_1936 +1937 loc_1937 +1938 castlearrowslit +1939 loc_1939 +1940 loc_1940 +1941 woodwall+brickedge_left +1942 woodwall+brickedge_right +1943 loc_1943 +1944 loc_1944 +1945 loc_1945 +1946 loc_1946 +1947 loc_1947 +1948 barbarian_crumblingwall +1949 loc_1949 +1950 loc_1950 +1951 loc_1951 +1952 loc_1952 +1953 loc_1953 +1954 loc_1954 +1955 loc_1955 +1956 loc_1956 +1957 loc_1957 +1958 loc_1958 +1959 loc_1959 +1960 loc_1960 +1961 loc_1961 +1962 loc_1962 +1963 loc_1963 +1964 loc_1964 +1965 loc_1965 +1966 loc_1966 +1967 loc_1967 +1968 loc_1968 +1969 loc_1969 +1970 loc_1970 +1971 loc_1971 +1972 loc_1972 +1973 loc_1973 +1974 loc_1974 +1975 loc_1975 +1976 loc_1976 +1977 loc_1977 +1978 loc_1978 +1979 loc_1979 +1980 loc_1980 +1981 loc_1981 +1982 loc_1982 +1983 loc_1983 +1984 loc_1984 +1985 loc_1985 +1986 loc_1986 +1987 loc_1987 +1988 loc_1988 +1989 loc_1989 +1990 loc_1990 +1991 loc_1991 +1992 loc_1992 +1993 loc_1993 +1994 loc_1994 +1995 loc_1995 +1996 loc_1996 +1997 loc_1997 +1998 loc_1998 +1999 loc_1999 +2000 loc_2000 +2001 loc_2001 +2002 loc_2002 +2003 loc_2003 +2004 loc_2004 +2005 loc_2005 +2006 loc_2006 +2007 loc_2007 +2008 loc_2008 +2009 loc_2009 +2010 loc_2010 +2011 loc_2011 +2012 loc_2012 +2013 loc_2013 +2014 loc_2014 +2015 loc_2015 +2016 loc_2016 +2017 loc_2017 +2018 loc_2018 +2019 loc_2019 +2020 loc_2020 +2021 loc_2021 +2022 loc_2022 +2023 achey_tree +2024 loc_2024 +2025 loc_2025 +2026 loc_2026 +2027 loc_2027 +2028 loc_2028 +2029 loc_2029 +2030 loc_2030 +2031 loc_2031 +2032 loc_2032 +2033 loc_2033 +2034 loc_2034 +2035 loc_2035 +2036 loc_2036 +2037 loc_2037 +2038 loc_2038 +2039 loc_2039 +2040 loc_2040 +2041 loc_2041 +2042 loc_2042 +2043 loc_2043 +2044 loc_2044 +2045 loc_2045 +2046 loc_2046 +2047 loc_2047 +2048 loc_2048 +2049 loc_2049 +2050 loc_2050 +2051 loc_2051 +2052 loc_2052 +2053 loc_2053 +2054 loc_2054 +2055 loc_2055 +2056 loc_2056 +2057 loc_2057 +2058 loc_2058 +2059 loc_2059 +2060 loc_2060 +2061 loc_2061 +2062 loc_2062 +2063 loc_2063 +2064 loc_2064 +2065 loc_2065 +2066 loc_2066 +2067 loc_2067 +2068 loc_2068 +2069 food_store_door +2070 loc_2070 +2071 food_store_crate +2072 banana_crate +2073 banana_tree_5 +2074 banana_tree_4 +2075 banana_tree_3 +2076 banana_tree_2 +2077 banana_tree_1 +2078 banana_tree_0 +2079 hunt_chest +2080 hunt_chest_open +2081 karamja_gangplank_board +2082 karamja_gangplank_disembark +2083 port_sarim_gangplank_board +2084 port_sarim_gangplank_disembark +2085 ardougne_gangplank_board +2086 ardougne_gangplank_disembark +2087 brimhaven_gangplank_board +2088 brimhaven_gangplank_disembark +2089 loc_2089 +2090 copper_rock_1 +2091 copper_rock_2 +2092 iron_rock_1 +2093 iron_rock_2 +2094 tin_rock_1 +2095 tin_rock_2 +2096 coal_rock_1 +2097 coal_rock_2 +2098 gold_rock_1 +2099 gold_rock_2 +2100 silver_rock_1 +2101 silver_rock_2 +2102 mithril_rock_1 +2103 mithril_rock_2 +2104 adamantite_rock_1 +2105 adamantite_rock_2 +2106 runite_rock_1 +2107 runite_rock_2 +2108 clay_rock_1 +2109 clay_rock_2 +2110 blurite_rock_1 +2111 gem_rock_1 +2112 loc_2112 +2113 loc_2113 +2114 loc_2114 +2115 loc_2115 +2116 loc_2116 +2117 loc_2117 +2118 loc_2118 +2119 copper_rock_macro_gas_1 +2120 copper_rock_macro_gas_2 +2121 iron_rock_macro_gas_1 +2122 iron_rock_macro_gas_2 +2123 tin_rock_macro_gas_1 +2124 tin_rock_macro_gas_2 +2125 coal_rock_macro_gas_1 +2126 coal_rock_macro_gas_2 +2127 gold_rock_macro_gas_1 +2128 gold_rock_macro_gas_2 +2129 silver_rock_macro_gas_1 +2130 silver_rock_macro_gas_2 +2131 mithril_rock_macro_gas_1 +2132 mithril_rock_macro_gas_2 +2133 adamantite_rock_macro_gas_1 +2134 adamantite_rock_macro_gas_2 +2135 runite_rock_macro_gas_1 +2136 runite_rock_macro_gas_2 +2137 clay_rock_macro_gas_1 +2138 clay_rock_macro_gas_2 +2139 blurite_rock_macro_gas_1 +2140 gem_rock_macro_gas_1 +2141 chest_macro_gas +2142 druid_cauldron +2143 loc_2143 +2144 loc_2144 +2145 loc_2145 +2146 loc_2146 +2147 loc_2147 +2148 loc_2148 +2149 loc_2149 +2150 loc_2150 +2151 loc_2151 +2152 loc_2152 +2153 loc_2153 +2154 loc_2154 +2155 loc_2155 +2156 loc_2156 +2157 loc_2157 +2158 loc_2158 +2159 game_trawler_barrel1 +2160 game_trawler_barrel2 +2161 game_trawler_barrel3 +2162 game_trawler_net1 +2163 game_trawler_net2 +2164 game_trawler_fish_net1 +2165 game_trawler_fish_net2 +2166 game_trawler_reward_net +2167 game_trawler_leak +2168 game_trawler_repaired_leak +2169 game_trawler_spray1 +2170 game_trawler_spray2 +2171 loc_2171 +2172 game_trawler_fish_net_broken1 +2173 game_trawler_fish_net_broken2 +2174 game_trawler_ship_ladder_up +2175 game_trawler_ship_ladder_down +2176 game_trawler_hole +2177 game_trawler_hull +2178 game_trawler_gangplank1 +2179 game_trawler_gangplank2 +2180 loc_2180 +2181 loc_2181 +2182 loc_2182 +2183 loc_2183 +2184 loc_2184 +2185 loc_2185 +2186 loc_2186 +2187 loc_2187 +2188 loc_2188 +2189 loc_2189 +2190 loc_2190 +2191 loc_2191 +2192 loc_2192 +2193 loc_2193 +2194 loc_2194 +2195 loc_2195 +2196 loc_2196 +2197 loc_2197 +2198 loc_2198 +2199 loc_2199 +2200 loc_2200 +2201 loc_2201 +2202 loc_2202 +2203 loc_2203 +2204 loc_2204 +2205 loc_2205 +2206 loc_2206 +2207 loc_2207 +2208 loc_2208 +2209 loc_2209 +2210 loc_2210 +2211 loc_2211 +2212 loc_2212 +2213 bank_booth +2214 loc_2214 +2215 loc_2215 +2216 loc_2216 +2217 loc_2217 +2218 loc_2218 +2219 loc_2219 +2220 loc_2220 +2221 loc_2221 +2222 loc_2222 +2223 loc_2223 +2224 loc_2224 +2225 loc_2225 +2226 loc_2226 +2227 loc_2227 +2228 loc_2228 +2229 loc_2229 +2230 loc_2230 +2231 loc_2231 +2232 loc_2232 +2233 loc_2233 +2234 loc_2234 +2235 loc_2235 +2236 loc_2236 +2237 loc_2237 +2238 loc_2238 +2239 loc_2239 +2240 loc_2240 +2241 loc_2241 +2242 loc_2242 +2243 loc_2243 +2244 loc_2244 +2245 loc_2245 +2246 loc_2246 +2247 loc_2247 +2248 loc_2248 +2249 loc_2249 +2250 loc_2250 +2251 loc_2251 +2252 loc_2252 +2253 loc_2253 +2254 loc_2254 +2255 loc_2255 +2256 loc_2256 +2257 loc_2257 +2258 loc_2258 +2259 loc_2259 +2260 loc_2260 +2261 loc_2261 +2262 loc_2262 +2263 loc_2263 +2264 loc_2264 +2265 loc_2265 +2266 loc_2266 +2267 loc_2267 +2268 loc_2268 +2269 loc_2269 +2270 zqdoorhideplant +2271 loc_2271 +2272 loc_2272 +2273 loc_2273 +2274 loc_2274 +2275 loc_2275 +2276 loc_2276 +2277 loc_2277 +2278 loc_2278 +2279 loc_2279 +2280 loc_2280 +2281 loc_2281 +2282 barbarian_rope_swing +2283 wilderness_rope_swing +2284 barbarian_obstacle_net +2285 gnome_obstacle_net_1 +2286 gnome_obstacle_net_2 +2287 barbarian_obstacle_pipe +2288 wilderness_obstacle_pipe +2289 gnome_obstacle_pipe +2290 loc_2290 +2291 loc_2291 +2292 loc_2292 +2293 loc_2293 +2294 barbarian_log_balance +2295 gnome_log_balance +2296 loc_2296 +2297 wilderness_log_balance +2298 loc_2298 +2299 loc_2299 +2300 loc_2300 +2301 loc_2301 +2302 barbarian_ledge +2303 loc_2303 +2304 loc_2304 +2305 loc_2305 +2306 loc_2306 +2307 loc_2307 +2308 loc_2308 +2309 loc_2309 +2310 loc_2310 +2311 wilderness_stepping_stone +2312 gnome_balancing_rope +2313 gnome_tree_branch_1 +2314 gnome_tree_branch_2 +2315 gnome_tree_branch_3 +2316 loc_2316 +2317 loc_2317 +2318 loc_2318 +2319 loc_2319 +2320 loc_2320 +2321 loc_2321 +2322 loc_2322 +2323 loc_2323 +2324 loc_2324 +2325 loc_2325 +2326 loc_2326 +2327 loc_2327 +2328 wilderness_rocks +2329 loc_2329 +2330 loc_2330 +2331 loc_2331 +2332 loc_2332 +2333 loc_2333 +2334 loc_2334 +2335 loc_2335 +2336 blackknight_hole +2337 blackknight_front_door +2338 blackknight_banquet_hall_door +2339 blackknight_door_to_grill +2340 blackknight_potion_room_door +2341 blackknight_pushable_wall +2342 blackknight_grate +2343 loc_2343 +2344 loc_2344 +2345 loc_2345 +2346 loc_2346 +2347 loc_2347 +2348 loc_2348 +2349 loc_2349 +2350 loc_2350 +2351 loc_2351 +2352 loc_2352 +2353 loc_2353 +2354 loc_2354 +2355 loc_2355 +2356 loc_2356 +2357 loc_2357 +2358 loc_2358 +2359 loc_2359 +2360 loc_2360 +2361 loc_2361 +2362 loc_2362 +2363 loc_2363 +2364 loc_2364 +2365 loc_2365 +2366 loc_2366 +2367 loc_2367 +2368 loc_2368 +2369 loc_2369 +2370 loc_2370 +2371 loc_2371 +2372 loc_2372 +2373 loc_2373 +2374 loc_2374 +2375 loc_2375 +2376 loc_2376 +2377 loc_2377 +2378 loc_2378 +2379 loc_2379 +2380 loc_2380 +2381 loc_2381 +2382 loc_2382 +2383 loc_2383 +2384 loc_2384 +2385 loc_2385 +2386 loc_2386 +2387 loc_2387 +2388 loc_2388 +2389 loc_2389 +2390 loc_2390 +2391 loc_2391 +2392 loc_2392 +2393 gnome_goal +2394 gnomeball_gate +2395 loc_2395 +2396 loc_2396 +2397 loc_2397 +2398 loc_2398 +2399 loc_2399 +2400 loc_2400 +2401 loc_2401 +2402 loc_2402 +2403 loc_2403 +2404 loc_2404 +2405 loc_2405 +2406 loc_2406 +2407 loc_2407 +2408 loc_2408 +2409 loc_2409 +2410 loc_2410 +2411 loc_2411 +2412 loc_2412 +2413 loc_2413 +2414 loc_2414 +2415 loc_2415 +2416 loc_2416 +2417 loc_2417 +2418 loc_2418 +2419 loc_2419 +2420 loc_2420 +2421 loc_2421 +2422 loc_2422 +2423 loc_2423 +2424 loc_2424 +2425 loc_2425 +2426 loc_2426 +2427 loc_2427 +2428 loc_2428 +2429 loc_2429 +2430 loc_2430 +2431 loc_2431 +2432 loc_2432 +2433 loc_2433 +2434 loc_2434 +2435 loc_2435 +2436 loc_2436 +2437 loc_2437 +2438 loc_2438 +2439 loc_2439 +2440 loc_2440 +2441 loc_2441 +2442 loc_2442 +2443 loc_2443 +2444 loc_2444 +2445 loc_2445 +2446 loc_2446 +2447 loc_2447 +2448 loc_2448 +2449 loc_2449 +2450 loc_2450 +2451 loc_2451 +2452 airtemple_ruined +2453 mindtemple_ruined +2454 watertemple_ruined +2455 earthtemple_ruined +2456 firetemple_ruined +2457 bodytemple_ruined +2458 cosmictemple_ruined +2459 lawtemple_ruined +2460 naturetemple_ruined +2461 chaostemple_ruined +2462 deathtemple_ruined +2463 soultemple_ruined +2464 bloodtemple_ruined +2465 rc_air_altar_exit_portal +2466 rc_mind_altar_exit_portal +2467 rc_water_altar_exit_portal +2468 rc_earth_altar_exit_portal +2469 rc_fire_altar_exit_portal +2470 rc_body_altar_exit_portal +2471 rc_cosmic_altar_exit_portal +2472 loc_2472 +2473 rc_nature_altar_exit_portal +2474 rc_chaos_altar_exit_portal +2475 rc_death_altar_exit_portal +2476 loc_2476 +2477 loc_2477 +2478 rc_air_altar +2479 rc_mind_altar +2480 rc_water_altar +2481 rc_earth_altar +2482 rc_fire_altar +2483 rc_body_altar +2484 rc_cosmic_altar +2485 loc_2485 +2486 rc_nature_altar +2487 rc_chaos_altar +2488 rc_death_altar +2489 loc_2489 +2490 loc_2490 +2491 loc_2491 +2492 loc_2492 +2493 loc_2493 +2494 loc_2494 +2495 loc_2495 +2496 loc_2496 +2497 loc_2497 +2498 loc_2498 +2499 loc_2499 +2500 loc_2500 +2501 loc_2501 +2502 loc_2502 +2503 loc_2503 +2504 loc_2504 +2505 loc_2505 +2506 loc_2506 +2507 loc_2507 +2508 loc_2508 +2509 loc_2509 +2510 loc_2510 +2511 loc_2511 +2512 loc_2512 +2513 loc_2513 +2514 loc_2514 +2515 loc_2515 +2516 loc_2516 +2517 loc_2517 +2518 loc_2518 +2519 loc_2519 +2520 loc_2520 +2521 loc_2521 +2522 loc_2522 +2523 loc_2523 +2524 loc_2524 +2525 loc_2525 +2526 loc_2526 +2527 loc_2527 +2528 loc_2528 +2529 loc_2529 +2530 loc_2530 +2531 elena_mud_patch1 +2532 elena_mud_patch2 +2533 loc_2533 +2534 loc_2534 +2535 loc_2535 +2536 loc_2536 +2537 loc_2537 +2538 loc_2538 +2539 loc_2539 +2540 loc_2540 +2541 loc_2541 +2542 loc_2542 +2543 loc_2543 +2544 loc_2544 +2545 loc_2545 +2546 loc_2546 +2547 loc_2547 +2548 loc_2548 +2549 loc_2549 +2550 loc_2550 +2551 loc_2551 +2552 loc_2552 +2553 loc_2553 +2554 loc_2554 +2555 loc_2555 +2556 loc_2556 +2557 loc_2557 +2558 loc_2558 +2559 loc_2559 +2560 silk_stall_stealing +2561 bakers_stall_stealing +2562 gem_stall_stealing +2563 fur_stall_stealing +2564 spice_stall_stealing +2565 silver_stall_stealing +2566 chest_10_coins +2567 chest_nature_rune +2568 chest_50_coins +2569 chest_blood_runes +2570 chest_ardougne_castle +2571 loc_2571 +2572 loc_2572 +2573 chest_steel_arrowtips +2574 loc_2574 +2575 junglepotion_marshy_jungle_vine +2576 junglepotion_marshy_jungle_vine_empty +2577 junglepotion_palm_tree +2578 junglepotion_palm_tree_empty +2579 junglepotion_scorched_earth +2580 junglepotion_scorched_earth_empty +2581 junglepotion_rock +2582 junglepotion_rock_empty +2583 junglepotion_wall_fungus +2584 junglepotion_rocks +2585 junglepotion_hand_holds +2586 dragon_slayer_magic_door +2587 dragon_slayer_magic_chest_closed +2588 dragon_slayer_magic_chest_opened +2589 lady_lumbridge_hole +2590 lady_lumbridge_ladder +2591 lady_lumbridge_ladder_shipwreck +2592 lady_lumbridge_ladder2 +2593 dragonslayer_gangplank_board +2594 dragonslayer_gangplank_disembark +2595 melzar_maze_entrance +2596 melzar_maze_red_door +2597 melzar_maze_orange_door +2598 melzar_maze_yellow_door +2599 melzar_maze_blue_door +2600 melzar_maze_magenta_door +2601 melzar_maze_green_door +2602 melzar_maze_exit_door +2603 melzar_maze_chest_closed +2604 melzar_maze_chest_opened +2605 melzar_maze_ladder +2606 crandor_secret_door +2607 elvarg_gate_right +2608 elvarg_gate_left +2609 crandor_rock_opening +2610 crandor_climbing_rope +2611 loc_2611 +2612 loc_2612 +2613 loc_2613 +2614 loc_2614 +2615 loc_2615 +2616 loc_2616 +2617 loc_2617 +2618 loc_2618 +2619 loc_2619 +2620 loc_2620 +2621 loc_2621 +2622 loc_2622 +2623 loc_2623 +2624 loc_2624 +2625 loc_2625 +2626 loc_2626 +2627 loc_2627 +2628 loc_2628 +2629 loc_2629 +2630 loc_2630 +2631 loc_2631 +2632 loc_2632 +2633 loc_2633 +2634 loc_2634 +2635 loc_2635 +2636 loc_2636 +2637 loc_2637 +2638 loc_2638 +2639 loc_2639 +2640 loc_2640 +2641 loc_2641 +2642 potters_wheel +2643 pottery_oven +2644 spinning_wheel +2645 sand_pit +2646 flax_ground +2647 crafting_guild_door +2648 loc_2648 +2649 loc_2649 +2650 loc_2650 +2651 loc_2651 +2652 loc_2652 +2653 loc_2653 +2654 loc_2654 +2655 loc_2655 +2656 loc_2656 +2657 loc_2657 +2658 loc_2658 +2659 loc_2659 +2660 loc_2660 +2661 loc_2661 +2662 loc_2662 +2663 loc_2663 +2664 loc_2664 +2665 loc_2665 +2666 loc_2666 +2667 loc_2667 +2668 loc_2668 +2669 shantay_pass +2670 loc_2670 +2671 loc_2671 +2672 loc_2672 +2673 loc_2673 +2674 loc_2674 +2675 loc_2675 +2676 loc_2676 +2677 loc_2677 +2678 loc_2678 +2679 loc_2679 +2680 loc_2680 +2681 loc_2681 +2682 loc_2682 +2683 loc_2683 +2684 loc_2684 +2685 loc_2685 +2686 loc_2686 +2687 loc_2687 +2688 loc_2688 +2689 loc_2689 +2690 loc_2690 +2691 loc_2691 +2692 shantay_jail_door +2693 shantay_chest +2694 loc_2694 +2695 loc_2695 +2696 loc_2696 +2697 loc_2697 +2698 loc_2698 +2699 loc_2699 +2700 loc_2700 +2701 loc_2701 +2702 loc_2702 +2703 loc_2703 +2704 loc_2704 +2705 loc_2705 +2706 loc_2706 +2707 loc_2707 +2708 loc_2708 +2709 loc_2709 +2710 loc_2710 +2711 loc_2711 +2712 loc_2712 +2713 hopper_full +2714 hopper_lumbridge +2715 hopper_varrock +2716 hopper_zanaris +2717 hopper_ardougne +2718 hoppercontrol_lumbridge +2719 hoppercontrol_varrock +2720 hoppercontrol_zanaris +2721 hoppercontrol_ardougne +2722 hoppercontrol_inuse +2723 loc_2723 +2724 loc_2724 +2725 loc_2725 +2726 loc_2726 +2727 loc_2727 +2728 loc_2728 +2729 loc_2729 +2730 loc_2730 +2731 loc_2731 +2732 loc_2732 +2733 loc_2733 +2734 loc_2734 +2735 loc_2735 +2736 loc_2736 +2737 loc_2737 +2738 loc_2738 +2739 loc_2739 +2740 loc_2740 +2741 loc_2741 +2742 loc_2742 +2743 loc_2743 +2744 loc_2744 +2745 loc_2745 +2746 loc_2746 +2747 loc_2747 +2748 loc_2748 +2749 loc_2749 +2750 loc_2750 +2751 loc_2751 +2752 loc_2752 +2753 loc_2753 +2754 loc_2754 +2755 loc_2755 +2756 loc_2756 +2757 loc_2757 +2758 loc_2758 +2759 loc_2759 +2760 loc_2760 +2761 loc_2761 +2762 loc_2762 +2763 loc_2763 +2764 loc_2764 +2765 loc_2765 +2766 loc_2766 +2767 loc_2767 +2768 loc_2768 +2769 loc_2769 +2770 loc_2770 +2771 loc_2771 +2772 loc_2772 +2773 loc_2773 +2774 loc_2774 +2775 loc_2775 +2776 loc_2776 +2777 loc_2777 +2778 loc_2778 +2779 loc_2779 +2780 loc_2780 +2781 furnace1 +2782 doric_anvil +2783 anvil +2784 loc_2784 +2785 furnace_side +2786 loc_2786 +2787 loc_2787 +2788 loc_2788 +2789 loc_2789 +2790 loc_2790 +2791 loc_2791 +2792 loc_2792 +2793 loc_2793 +2794 loc_2794 +2795 loc_2795 +2796 loc_2796 +2797 loc_2797 +2798 loc_2798 +2799 loc_2799 +2800 loc_2800 +2801 loc_2801 +2802 loc_2802 +2803 loc_2803 +2804 loc_2804 +2805 loc_2805 +2806 loc_2806 +2807 loc_2807 +2808 loc_2808 +2809 loc_2809 +2810 loc_2810 +2811 loc_2811 +2812 loc_2812 +2813 loc_2813 +2814 loc_2814 +2815 loc_2815 +2816 loc_2816 +2817 loc_2817 +2818 loc_2818 +2819 loc_2819 +2820 loc_2820 +2821 loc_2821 +2822 loc_2822 +2823 loc_2823 +2824 loc_2824 +2825 loc_2825 +2826 loc_2826 +2827 loc_2827 +2828 loc_2828 +2829 loc_2829 +2830 loc_2830 +2831 loc_2831 +2832 loc_2832 +2833 loc_2833 +2834 loc_2834 +2835 loc_2835 +2836 loc_2836 +2837 loc_2837 +2838 loc_2838 +2839 loc_2839 +2840 loc_2840 +2841 loc_2841 +2842 loc_2842 +2843 varrock_palace_sewer_drain +2844 loc_2844 +2845 loc_2845 +2846 loc_2846 +2847 loc_2847 +2848 loc_2848 +2849 loc_2849 +2850 loc_2850 +2851 loc_2851 +2852 loc_2852 +2853 loc_2853 +2854 loc_2854 +2855 loc_2855 +2856 loc_2856 +2857 loc_2857 +2858 loc_2858 +2859 loc_2859 +2860 loc_2860 +2861 loc_2861 +2862 loc_2862 +2863 loc_2863 +2864 loc_2864 +2865 loc_2865 +2866 loc_2866 +2867 loc_2867 +2868 loc_2868 +2869 loc_2869 +2870 loc_2870 +2871 loc_2871 +2872 loc_2872 +2873 loc_2873 +2874 loc_2874 +2875 loc_2875 +2876 loc_2876 +2877 loc_2877 +2878 loc_2878 +2879 loc_2879 +2880 loc_2880 +2881 loc_2881 +2882 loc_2882 +2883 loc_2883 +2884 loc_2884 +2885 loc_2885 +2886 loc_2886 +2887 loc_2887 +2888 loc_2888 +2889 loc_2889 +2890 loc_2890 +2891 loc_2891 +2892 loc_2892 +2893 loc_2893 +2894 loc_2894 +2895 loc_2895 +2896 loc_2896 +2897 loc_2897 +2898 loc_2898 +2899 loc_2899 +2900 loc_2900 +2901 loc_2901 +2902 loc_2902 +2903 loc_2903 +2904 loc_2904 +2905 loc_2905 +2906 loc_2906 +2907 loc_2907 +2908 loc_2908 +2909 loc_2909 +2910 loc_2910 +2911 loc_2911 +2912 loc_2912 +2913 loc_2913 +2914 loc_2914 +2915 loc_2915 +2916 loc_2916 +2917 loc_2917 +2918 loc_2918 +2919 loc_2919 +2920 loc_2920 +2921 loc_2921 +2922 loc_2922 +2923 loc_2923 +2924 loc_2924 +2925 loc_2925 +2926 loc_2926 +2927 loc_2927 +2928 loc_2928 +2929 loc_2929 +2930 loc_2930 +2931 loc_2931 +2932 loc_2932 +2933 loc_2933 +2934 loc_2934 +2935 loc_2935 +2936 loc_2936 +2937 loc_2937 +2938 loc_2938 +2939 loc_2939 +2940 loc_2940 +2941 loc_2941 +2942 loc_2942 +2943 loc_2943 +2944 loc_2944 +2945 loc_2945 +2946 loc_2946 +2947 loc_2947 +2948 loc_2948 +2949 loc_2949 +2950 loc_2950 +2951 loc_2951 +2952 loc_2952 +2953 loc_2953 +2954 loc_2954 +2955 loc_2955 +2956 loc_2956 +2957 loc_2957 +2958 loc_2958 +2959 loc_2959 +2960 loc_2960 +2961 loc_2961 +2962 loc_2962 +2963 loc_2963 +2964 loc_2964 +2965 loc_2965 +2966 furnace_underground +2967 loc_2967 +2968 loc_2968 +2969 loc_2969 +2970 loc_2970 +2971 loc_2971 +2972 loc_2972 +2973 loc_2973 +2974 loc_2974 +2975 loc_2975 +2976 loc_2976 +2977 loc_2977 +2978 loc_2978 +2979 loc_2979 +2980 loc_2980 +2981 loc_2981 +2982 loc_2982 +2983 loc_2983 +2984 loc_2984 +2985 loc_2985 +2986 loc_2986 +2987 loc_2987 +2988 loc_2988 +2989 loc_2989 +2990 loc_2990 +2991 loc_2991 +2992 loc_2992 +2993 loc_2993 +2994 loc_2994 +2995 loc_2995 +2996 loc_2996 +2997 loc_2997 +2998 loc_2998 +2999 loc_2999 +3000 loc_3000 +3001 loc_3001 +3002 loc_3002 +3003 loc_3003 +3004 loc_3004 +3005 loc_3005 +3006 loc_3006 +3007 loc_3007 +3008 loc_3008 +3009 loc_3009 +3010 loc_3010 +3011 loc_3011 +3012 loc_3012 +3013 loc_3013 +3014 loc_3014 +3015 loc_3015 +3016 loc_3016 +3017 loc_3017 +3018 loc_3018 +3019 loc_3019 +3020 loc_3020 +3021 loc_3021 +3022 loc_3022 +3023 loc_3023 +3024 loc_3024 +3025 loc_3025 +3026 loc_3026 +3027 loc_3027 +3028 loc_3028 +3029 loc_3029 +3030 loc_3030 +3031 loc_3031 +3032 loc_3032 +3033 loc_3033 +3034 loc_3034 +3035 loc_3035 +3036 loc_3036 +3037 loc_3037 +3038 loc_3038 +3039 loc_3039 +3040 loc_3040 +3041 loc_3041 +3042 loc_3042 +3043 loc_3043 +3044 furnace_tutorial +3045 loc_3045 +3046 loc_3046 +3047 loc_3047 +3048 loc_3048 +3049 loc_3049 +3050 loc_3050 +3051 loc_3051 +3052 loc_3052 +3053 loc_3053 +3054 loc_3054 +3055 loc_3055 +3056 loc_3056 +3057 loc_3057 +3058 loc_3058 +3059 loc_3059 +3060 loc_3060 +3061 loc_3061 +3062 loc_3062 +3063 loc_3063 +3064 loc_3064 +3065 loc_3065 +3066 loc_3066 +3067 loc_3067 +3068 loc_3068 +3069 loc_3069 +3070 loc_3070 +3071 loc_3071 +3072 loc_3072 +3073 loc_3073 +3074 loc_3074 +3075 loc_3075 +3076 loc_3076 +3077 loc_3077 +3078 loc_3078 +3079 loc_3079 +3080 loc_3080 +3081 loc_3081 +3082 loc_3082 +3083 loc_3083 +3084 loc_3084 +3085 loc_3085 +3086 loc_3086 +3087 loc_3087 +3088 loc_3088 +3089 loc_3089 +3090 loc_3090 +3091 loc_3091 +3092 loc_3092 +3093 loc_3093 +3094 loc_3094 +3095 loc_3095 +3096 loc_3096 +3097 loc_3097 +3098 loc_3098 +3099 loc_3099 +3100 loc_3100 +3101 loc_3101 +3102 loc_3102 +3103 loc_3103 +3104 loc_3104 +3105 loc_3105 +3106 loc_3106 +3107 loc_3107 +3108 loc_3108 +3109 loc_3109 +3110 loc_3110 +3111 duel_entrance_1 +3112 duel_entrance_2 +3113 duel_entrance_3 +3114 duel_entrance_4 +3115 loc_3115 +3116 loc_3116 +3117 loc_3117 +3118 loc_3118 +3119 loc_3119 +3120 loc_3120 +3121 loc_3121 +3122 loc_3122 +3123 loc_3123 +3124 loc_3124 +3125 loc_3125 +3126 loc_3126 +3127 loc_3127 +3128 loc_3128 +3129 loc_3129 +3130 loc_3130 +3131 loc_3131 +3132 loc_3132 +3133 loc_3133 +3134 loc_3134 +3135 loc_3135 +3136 loc_3136 +3137 loc_3137 +3138 loc_3138 +3139 loc_3139 +3140 loc_3140 +3141 loc_3141 +3142 loc_3142 +3143 loc_3143 +3144 loc_3144 +3145 loc_3145 +3146 loc_3146 +3147 loc_3147 +3148 loc_3148 +3149 loc_3149 +3150 loc_3150 +3151 loc_3151 +3152 loc_3152 +3153 loc_3153 +3154 loc_3154 +3155 loc_3155 +3156 loc_3156 +3157 loc_3157 +3158 loc_3158 +3159 loc_3159 +3160 loc_3160 +3161 loc_3161 +3162 loc_3162 +3163 loc_3163 +3164 loc_3164 +3165 loc_3165 +3166 loc_3166 +3167 loc_3167 +3168 loc_3168 +3169 loc_3169 +3170 loc_3170 +3171 loc_3171 +3172 loc_3172 +3173 loc_3173 +3174 loc_3174 +3175 loc_3175 +3176 loc_3176 +3177 loc_3177 +3178 loc_3178 +3179 loc_3179 +3180 loc_3180 +3181 loc_3181 +3182 loc_3182 +3183 loc_3183 +3184 loc_3184 +3185 loc_3185 +3186 loc_3186 +3187 loc_3187 +3188 loc_3188 +3189 loc_3189 +3190 loc_3190 +3191 loc_3191 +3192 loc_3192 +3193 loc_3193 +3194 loc_3194 +3195 loc_3195 +3196 loc_3196 +3197 loc_3197 +3198 loc_3198 +3199 loc_3199 +3200 loc_3200 +3201 loc_3201 +3202 loc_3202 +3203 duel_trapdoor +3204 loc_3204 +3205 loc_3205 +3206 loc_3206 +3207 loc_3207 +3208 loc_3208 +3209 loc_3209 +3210 loc_3210 +3211 loc_3211 +3212 loc_3212 +3213 loc_3213 +3214 loc_3214 +3215 loc_3215 +3216 loc_3216 +3217 loc_3217 +3218 loc_3218 +3219 loc_3219 +3220 loc_3220 +3221 loc_3221 +3222 loc_3222 +3223 loc_3223 +3224 loc_3224 +3225 loc_3225 +3226 loc_3226 +3227 loc_3227 +3228 loc_3228 +3229 loc_3229 +3230 loc_3230 +3231 loc_3231 +3232 loc_3232 +3233 loc_3233 +3234 loc_3234 +3235 loc_3235 +3236 loc_3236 +3237 loc_3237 +3238 loc_3238 +3239 loc_3239 +3240 loc_3240 +3241 loc_3241 +3242 loc_3242 +3243 loc_3243 +3244 loc_3244 +3245 loc_3245 +3246 loc_3246 +3247 loc_3247 +3248 loc_3248 +3249 loc_3249 +3250 loc_3250 +3251 bridge_bend_left +3252 bridge_bend_right +3253 bridge_threeway +3254 loc_3254 +3255 loc_3255 +3256 loc_3256 +3257 loc_3257 +3258 loc_3258 +3259 loc_3259 +3260 loc_3260 +3261 upass_bridge+support +3262 loc_3262 +3263 loc_3263 +3264 loc_3264 +3265 loc_3265 +3266 loc_3266 +3267 loc_3267 +3268 loc_3268 +3269 loc_3269 +3270 loc_3270 +3271 loc_3271 +3272 loc_3272 +3273 loc_3273 +3274 loc_3274 +3275 loc_3275 +3276 loc_3276 +3277 loc_3277 +3278 loc_3278 +3279 loc_3279 +3280 loc_3280 +3281 loc_3281 +3282 loc_3282 +3283 loc_3283 +3284 loc_3284 +3285 loc_3285 +3286 loc_3286 +3287 loc_3287 +3288 loc_3288 +3289 loc_3289 +3290 loc_3290 +3291 loc_3291 +3292 loc_3292 +3293 loc_3293 +3294 furnace_legends +3295 loc_3295 +3296 loc_3296 +3297 loc_3297 +3298 loc_3298 +3299 loc_3299 +3300 loc_3300 +3301 loc_3301 +3302 loc_3302 +3303 loc_3303 +3304 loc_3304 +3305 loc_3305 +3306 loc_3306 +3307 loc_3307 +3308 loc_3308 +3309 loc_3309 +3310 loc_3310 +3311 loc_3311 +3312 loc_3312 +3313 loc_3313 +3314 loc_3314 +3315 loc_3315 +3316 loc_3316 +3317 loc_3317 +3318 loc_3318 +3319 loc_3319 +3320 loc_3320 +3321 loc_3321 +3322 loc_3322 +3323 loc_3323 +3324 loc_3324 +3325 upass_bridge_corner +3326 loc_3326 +3327 loc_3327 +3328 loc_3328 +3329 loc_3329 +3330 loc_3330 +3331 loc_3331 +3332 upass_templedoor_top +3333 loc_3333 +3334 loc_3334 +3335 loc_3335 +3336 loc_3336 +3337 loc_3337 +3338 loc_3338 +3339 loc_3339 +3340 loc_3340 +3341 loc_3341 +3342 loc_3342 +3343 loc_3343 +3344 loc_3344 +3345 loc_3345 +3346 loc_3346 +3347 loc_3347 +3348 loc_3348 +3349 iban_temple_throne_top +3350 loc_3350 +3351 loc_3351 +3352 loc_3352 +3353 loc_3353 +3354 loc_3354 +3355 ibantomb_burnt_left +3356 ibantomb_burnt_right +3357 loc_3357 +3358 loc_3358 +3359 loc_3359 +3360 loc_3360 +3361 loc_3361 +3362 loc_3362 +3363 loc_3363 +3364 loc_3364 +3365 loc_3365 +3366 onion +3367 loc_3367 +3368 loc_3368 +3369 loc_3369 +3370 loc_3370 +3371 achey_tree_stump +3372 loc_3372 +3373 loc_3373 +3374 loc_3374 +3375 loc_3375 +3376 loc_3376 +3377 loc_3377 +3378 loc_3378 +3379 loc_3379 +3380 loc_3380 +3381 loc_3381 +3382 loc_3382 +3383 loc_3383 +3384 loc_3384 +3385 loc_3385 +3386 loc_3386 diff --git a/src/public/data/symbols/locshape.sym b/src/public/data/symbols/locshape.sym new file mode 100644 index 00000000..466900b8 --- /dev/null +++ b/src/public/data/symbols/locshape.sym @@ -0,0 +1,23 @@ +0 wall_straight +1 wall_diagonalcorner +2 wall_l +3 wall_squarecorner +4 walldecor_straight_nooffset +5 walldecor_straight_offset +6 walldecor_diagonal_offset +7 walldecor_diagonal_nooffset +8 walldecor_diagonal_both +9 wall_diagonal +10 centrepiece_straight +11 centrepiece_diagonal +12 roof_straight +13 roof_diagonal_with_roofedge +14 roof_diagonal +15 roof_l_concave +16 roof_l_convex +17 roof_flat +18 roofedge_straight +19 roofedge_diagonalcorner +20 roofedge_l +21 roofedge_squarecorner +22 grounddecor diff --git a/src/public/data/symbols/mesanim.sym b/src/public/data/symbols/mesanim.sym new file mode 100644 index 00000000..7f0a751d --- /dev/null +++ b/src/public/data/symbols/mesanim.sym @@ -0,0 +1,19 @@ +0 goblinchat +1 happy +2 bored +3 short +4 neutral +5 shock +6 confused +7 silent +8 quiz +9 default +10 shifty +11 worried +12 drunk +13 verymad +14 laugh +15 madlaugh +16 sad +17 angry +18 genkhazard diff --git a/src/public/data/symbols/npc.sym b/src/public/data/symbols/npc.sym new file mode 100644 index 00000000..6aa89d43 --- /dev/null +++ b/src/public/data/symbols/npc.sym @@ -0,0 +1,1017 @@ +0 hans +1 man_white +2 man_blue +3 man_brown +4 woman_purple +5 woman_brown +6 woman_red +7 farmer +8 thief +9 guard_sword +10 guard_crossbow +11 tramp +12 barbarian +13 wizard +14 druid +15 warrior_woman +16 man_black +17 barbarian_woman +18 alkharid_warrior +19 white_knight +20 paladin +21 hero +22 forester +23 knight_of_ardougne_1 +24 man_cavalier +25 woman_east_ardougne +26 knight_of_ardougne_2 +27 archer +28 zoo_keeper +29 chuck +30 barman +31 priest +32 guard_ardougne +33 door_man +34 watchman +35 soldier +36 wyson +37 sigbert_the_adventurer +38 shipyard_worker1 +39 shipyard_worker2 +40 shark_Shipyard +41 chicken +42 sheep_sheared +43 sheep_fluffy +44 drake +45 duck +46 duckling +47 rat +48 oomlie_bird +49 hellhound +50 king_black_dragon +51 baby_dragon +52 baby_blue_dragon +53 red_dragon +54 black_dragon +55 blue_dragon +56 dryad +57 fairy +58 shadow_spider +59 giant_spider1 +60 giant_spider2 +61 spider +62 jungle_spider +63 deadly_red_spider +64 ice_spider +65 leprechaun +66 gnome_green +67 gnome_brown +68 gnome_black +69 lizardman +70 mummy +71 orc +72 troll +73 zombie1 +74 zombie2 +75 zombie3 +76 zombie_entrana +77 summoned_zombie +78 giant_bat +79 death_wing +80 camel +81 cow_1 +82 lesser_demon +83 greater_demon +84 black_demon +85 golem +86 giant_rat1 +87 giant_rat2 +88 dungeon_rat +89 unicorn +90 skeleton1 +91 skeleton2 +92 skeleton3 +93 skeleton4 +94 skeleton_mage +95 npc_95 +96 npc_96 +97 npc_97 +98 npc_98 +99 guard_dog +100 goblin_unarmed1 +101 goblin_armed +102 goblin_unarmed2 +103 ghost +104 ghost_draynor_manor +105 bear_brown +106 bear_black +107 npc_107 +108 npc_108 +109 npc_109 +110 fire_giant +111 ice_giant +112 moss_giant +113 jogre +114 npc_114 +115 npc_115 +116 cyclops +117 giant +118 npc_118 +119 npc_119 +120 npc_120 +121 npc_121 +122 hobgoblin +123 hobgoblin_armed +124 earth_warrior +125 ice_warrior +126 otherworldly_being +127 magic_axe +128 snake +129 npc_129 +130 yeti +131 penguin +132 monkey +133 black_unicorn +134 npc_134 +135 mammoth +136 terrorbird +137 npc_137 +138 npc_138 +139 npc_139 +140 npc_140 +141 npc_141 +142 npc_142 +143 npc_143 +144 npc_144 +145 npc_145 +146 npc_146 +147 npc_147 +148 npc_148 +149 npc_149 +150 npc_150 +151 fly_trap +152 nasty_tree +153 npc_153 +154 npc_154 +155 npc_155 +156 npc_156 +157 npc_157 +158 npc_158 +159 gnome_child_yellow +160 gnome_child_blue +161 gnome_child_green +162 gnome_trainer +163 gnome_guard_halberd +164 gnome_guard_sword +165 npc_165 +166 npc_166 +167 npc_167 +168 gnome_woman_white +169 gnome_woman_black +170 npc_170 +171 npc_171 +172 dark_wizard_earth +173 npc_173 +174 dark_wizard_water +175 npc_175 +176 npc_176 +177 npc_177 +178 npc_178 +179 npc_179 +180 highwayman +181 chaos_druid +182 npc_182 +183 npc_183 +184 npc_184 +185 npc_185 +186 thug +187 rogue +188 monk_of_zamorak_22 +189 monk_of_zamorak_17 +190 monk_of_zamorak_45 +191 tribesman +192 dark_warrior +193 chaos_druid_warrior +194 necromancer +195 bandit +196 guard_bandit +197 npc_197 +198 guild_master +199 gunthor_the_brave +200 npc_200 +201 jailer +202 black_heather +203 donny_the_lad +204 speedy_keith +205 salarin_the_twisted +206 npc_206 +207 npc_207 +208 npc_208 +209 npc_209 +210 grail_maiden +211 sir_percival +212 king_percival +213 merlin_workshop +214 peasent_unhappy +215 peasent_happy +216 high_priest +217 crone +218 galahad +219 grail_fisherman +220 the_fisher_king +221 black_knight_titan +222 npc_222 +223 brother_kojo +224 npc_224 +225 bonzo +226 sinister_stranger +227 morris +228 big_dave +229 joshua +230 grandpa_jack +231 forester_mcgrubor +232 mountain_dwarf +233 npc_233 +234 npc_234 +235 npc_235 +236 npc_236 +237 renegade_knight +238 thrantax_the_mighty +239 sir_lancelot +240 sir_gawain +241 sir_kay +242 sir_bedivere +243 sir_tristram +244 sir_pelleas +245 sir_lucan +246 sir_palomedes +247 sir_mordred +248 morgan_le_faye +249 merlin_arthur +250 lady_of_the_lake +251 king_arthur +252 beggar +253 khazard_guard_cells +254 khazard_guard_drunk +255 khazard_guard_chest +256 khazard_guard_standard +257 khazard_guard_cutscene +258 general_khazard +259 khazard_barman +260 kelvin +261 joe_fightslave +262 fightslave +263 hengrad +264 lady_servil +265 jeremy_servil +266 jeremy_servil_arena +267 justin_servil +268 local +269 bouncer +270 khazard_ogre +271 khazard_scorpion +272 lucien_edge +273 lucien_ardougne +274 guardian_of_armadyl_male +275 guardian_of_armadyl_female +276 winelda +277 fire_warrior_of_lesarkus +278 cook +279 brother_omad +280 brother_cedric +281 ardougne_monk +282 npc_282 +283 head_thief +284 doric +285 veronica +286 professor_oddenstein +287 ernest_human +288 ernest_chicken +289 npc_289 +290 npc_290 +291 npc_291 +292 npc_292 +293 npc_293 +294 npc_294 +295 npc_295 +296 general_bentnoze +297 general_wartface +298 goblin_armed_green +299 goblin_armed_red +300 sedridor +301 npc_301 +302 hadley +303 gerald +304 almera +305 hudon +306 golrie +307 hetty +308 npc_308 +309 0_37_53_freshfish +310 0_39_53_freshfish +311 0_40_52_freshfish +312 0_40_53_rarefish +313 0_40_53_memberfish +314 0_41_73_freshfish +315 0_42_55_freshfish +316 0_43_51_saltfish +317 0_44_46_freshfish +318 0_44_52_freshfish +319 0_44_52_saltfish +320 0_44_53_saltfish +321 0_44_53_rarefish +322 0_44_43_memberfish +323 0_45_49_saltfish +324 0_45_49_rarefish +325 0_46_49_saltfish +326 0_47_57_saltfish +327 0_48_50_saltfish +328 0_48_53_freshfish +329 0_50_50_freshfish +330 0_51_49_saltfish +331 npc_331 +332 npc_332 +333 npc_333 +334 npc_334 +335 elena +336 Artist1 +337 Artist2 +338 chancy1 +339 chancy2 +340 hops1 +341 hops2 +342 guidors_wife +343 guidor +344 npc_344 +345 npc_345 +346 npc_346 +347 npc_347 +348 npc_348 +349 kilron +350 omart +351 npc_351 +352 npc_352 +353 npc_353 +354 npc_354 +355 child_white +356 child_brown +357 npc_357 +358 npc_358 +359 npc_359 +360 npc_360 +361 npc_361 +362 npc_362 +363 npc_363 +364 king_lathas +365 npc_365 +366 jerico +367 chemist +368 npc_368 +369 npc_369 +370 npc_370 +371 npc_371 +372 npc_372 +373 nurse_sarah +374 npc_374 +375 redbeard_frank +376 captain_tobias +377 seaman_lorris +378 seaman_thresnor +379 luthas +380 customs_officer +381 captain_barnaby +382 npc_382 +383 stankers +384 barbarian_outpost_guard +385 kharid_scorpion_first +386 kharid_scorpion_second +387 kharid_scorpion_third +388 seer +389 thormac +390 macro_event_big_fish +391 macro_event_river_troll1 +392 macro_event_river_troll2 +393 macro_event_river_troll3 +394 macro_event_river_troll4 +395 macro_event_river_troll5 +396 macro_event_river_troll6 +397 cow_2 +398 npc_398 +399 npc_399 +400 npc_400 +401 npc_401 +402 npc_402 +403 freshfish_whirlpool +404 saltfish_whirlpool +405 rarefish_whirlpool +406 memberfish_whirlpool +407 macro_event_triffid_friendly +408 macro_event_triffid_hostile +409 macro_event_genie +410 macro_event_mysterious_old_man_general +411 macro_event_swarm +412 savage_bird +413 macro_event_rock_golem1 +414 macro_event_rock_golem2 +415 macro_event_rock_golem3 +416 macro_event_rock_golem4 +417 macro_event_rock_golem5 +418 macro_event_rock_golem6 +419 macro_event_zombie1 +420 macro_event_zombie2 +421 macro_event_zombie3 +422 macro_event_zombie4 +423 macro_event_zombie5 +424 macro_event_zombie6 +425 macro_event_shade1 +426 macro_event_shade2 +427 macro_event_shade3 +428 macro_event_shade4 +429 macro_event_shade5 +430 macro_event_shade6 +431 macro_event_watchman1 +432 macro_event_watchman2 +433 macro_event_watchman3 +434 macro_event_watchman4 +435 macro_event_watchman5 +436 macro_event_watchman6 +437 npc_437 +438 macro_event_dryad1 +439 macro_event_dryad2 +440 macro_event_dryad3 +441 macro_event_dryad4 +442 macro_event_dryad5 +443 macro_event_dryad6 +444 macro_event_ent_tree1 +445 macro_event_ent_tree2 +446 macro_event_ent_dead_tree1 +447 macro_event_ent_dead_tree2 +448 macro_event_ent_oak +449 macro_event_ent_willow +450 macro_event_ent_yew +451 macro_event_ent_maple +452 macro_event_ent_magic +453 suit_of_armour +454 sanfew +455 kaqemeex +456 father_aereck +457 restless_ghost +458 father_urhney +459 priest_skeleton +460 wizard_frumscone +461 magic_store_owner +462 wizard_disentor +463 murphy +464 murphy_nonflood +465 murphy_flood +466 murphy_sunk +467 game_trawler_shark1 +468 game_trawler_shark2 +469 king_bolren +470 commander_montai +471 bolkoy +472 remsai +473 elkoy_outmaze +474 elkoy_maze +475 khazard_trooper_mace +476 khazard_trooper_spear +477 khazard_warlord +478 khazard_commander +479 gnome_troop_white +480 gnome_troop_black +481 tracker_gnome_1 +482 tracker_gnome_2 +483 tracker_gnome_3 +484 npc_484 +485 local_gnome +486 kalron +487 observatory_assistant +488 observatory_professor +489 goblin_guard +490 observatory_professor_tower +491 ghost_grave_of_scorpius +492 spirit_of_scorpius +493 npc_493 +494 npc_494 +495 npc_495 +496 npc_496 +497 npc_497 +498 npc_498 +499 npc_499 +500 npc_500 +501 npc_501 +502 npc_502 +503 npc_503 +504 npc_504 +505 npc_505 +506 npc_506 +507 npc_507 +508 npc_508 +509 npc_509 +510 hajedy +511 vigroy +512 kaleb_paramaya +513 yohnus +514 seravel +515 yanni_salika +516 obli +517 fernahei +518 npc_518 +519 bob +520 shop_keeper_lumbridge +521 shop_assistant_lumbridge +522 shop_keeper_varrock_generalshop +523 shop_assistant_varrock_generalshop +524 shop_keeper_alkharid +525 shop_assistant_alkharid +526 shop_keeper_falador +527 shop_assistant_falador +528 shop_keeper_edgeville +529 shop_assistant_edgeville +530 shop_keeper_rimmington +531 shop_assistant_rimmington +532 shop_keeper_karamja +533 shop_assistant_karamja +534 fairy_shop_keeper +535 fairy_shop_assistant +536 valaine +537 scavvo +538 peksa +539 silk_trader +540 gem_trader +541 zeke +542 louie_legs +543 kebab_seller +544 ranael +545 dommik +546 zaff +547 baraek +548 thessalia +549 horvik +550 lowe +551 shop_keeper_varrock_swordshop +552 shop_assistant_varrock_swordshop +553 aubury +554 fancy_dress_shop_owner +555 shop_keeper_khazard +556 grum +557 wydin +558 gerrant +559 brian +560 jiminua +561 npc_561 +562 candle_maker +563 arhein +564 jakut +565 lunderwin +566 irksol +567 ladder_fairy +568 zambo +569 silver_merchant +570 gem_merchant +571 baker +572 spice_seller +573 fur_trader +574 silk_merchant +575 hickton +576 harry +577 cassie +578 frincos +579 drogo_dwarf +580 falador_flynn +581 wayne +582 dwarf_generalshop +583 betty +584 herquin +585 rommik +586 gaius +587 jatix +588 davon +589 zenesha +590 aemad +591 kortan +592 npc_592 +593 npc_593 +594 nurmof +595 tea_seller +596 fat_tony +597 noterazzo +598 hairdresser +599 makeover_mage +600 npc_600 +601 npc_601 +602 npc_602 +603 npc_603 +604 thurgo +605 sir_vyvin +606 falador_squire +607 gunnjorn +608 sir_amik_varze +609 fortress_guard +610 black_knight_knight +611 black_knight_witch +612 greldo +613 npc_613 +614 npc_614 +615 npc_615 +616 npc_616 +617 npc_617 +618 npc_618 +619 npc_619 +620 npc_620 +621 gnome_baller1 +622 gnome_baller2 +623 gnome_baller3 +624 gnome_baller4 +625 gnome_baller5 +626 gnome_baller6 +627 gnome_baller7 +628 gnome_baller8 +629 gnome_baller9 +630 gnome_baller10 +631 gnome_baller11 +632 gnome_baller12 +633 gnome_winger1 +634 gnome_winger2 +635 gnome_ball_referee +636 gnome_cheerleader +637 juliet +638 apothecary +639 romeo +640 father_lawrence +641 tramp_orange +642 katrine +643 weaponsmaster +644 straven +645 jonny_the_beard +646 curator +647 reldo +648 king_roald +649 archer_zanaris +650 warrior_zanaris +651 monk_zanaris +652 wizard_zanaris +653 fairy_queen +654 shamus +655 tree_spirit_zanaris +656 cave_monk +657 monk_of_entrana_sarim +658 monk_of_entrana_island +659 party_pete +660 partyroom_dancingknight +661 partyroom_megan +662 partyroom_lucy +663 npc_663 +664 crest_dimintheis +665 crest_boot +666 crest_caleb +667 crest_chronozon +668 crest_johnathon +669 hazelmere +670 npc_670 +671 npc_671 +672 npc_672 +673 npc_673 +674 npc_674 +675 npc_675 +676 npc_676 +677 npc_677 +678 ranging_guild_guard +679 ranging_guild_doorman +680 leatherworker +681 npc_681 +682 armour_salesman +683 bow_and_arrow_salesman +684 tower_advisor_north +685 tower_advisor_east +686 tower_advisor_south +687 tower_advisor_west +688 tower_archer_north +689 tower_archer_east +690 tower_archer_south +691 tower_archer_west +692 tribal_weapon_salesman +693 competition_judge +694 ticket_merchant +695 bailey +696 caroline +697 kennith +698 holgart_island +699 holgart_platform +700 holgart_ardougne +701 kent +702 npc_702 +703 npc_703 +704 npc_704 +705 npc_705 +706 wizard_mizgog +707 wizard_grayzag +708 imp +709 imp_grayzag +710 alrena +711 bravek +712 carla +713 clerk +714 edmond +715 elena_imprisoned +716 head_mourner +717 npc_717 +718 npc_718 +719 npc_719 +720 recruiter +721 ted_rehnison +722 martha_rehnison +723 billy_rehnison +724 milli_rehnison +725 jethick +726 npc_726 +727 npc_727 +728 npc_728 +729 npc_729 +730 npc_730 +731 bartender_jollyboar +732 npc_732 +733 bartender_varrock +734 bartender_port_sarim +735 bartender_brimhaven +736 barmaid +737 bartender_seers +738 bartender_flyinghorse +739 bartender_dragoninn +740 trufitus +741 duke_horacio +742 elvarg +743 dragonslayer_ned +744 klarense +745 wormbrain +746 oracle +747 npc_747 +748 melzar_maze_giant_rat +749 melzar_maze_ghost +750 melzar_maze_skeleton +751 melzar_maze_zombie +752 melzar_maze_lesser_demon +753 melzar +754 cabin_boy_jenkins +755 morgan +756 harlow +757 count_draynor +758 fred_the_farmer +759 npc_759 +760 npc_760 +761 npc_761 +762 npc_762 +763 npc_763 +764 npc_764 +765 npc_765 +766 npc_766 +767 npc_767 +768 npc_768 +769 npc_769 +770 npc_770 +771 npc_771 +772 npc_772 +773 npc_773 +774 npc_774 +775 npc_775 +776 npc_776 +777 npc_777 +778 npc_778 +779 npc_779 +780 npc_780 +781 npc_781 +782 npc_782 +783 wilough +784 npc_784 +785 civilian_blonde +786 civilian_brown +787 civilian_bald +788 npc_788 +789 npc_789 +790 npc_790 +791 npc_791 +792 grip +793 alfonse_the_waiter +794 npc_794 +795 npc_795 +796 achietties +797 helemos +798 velrak_the_explorer +799 pirate_guard +800 npc_800 +801 abbot_langley +802 brother_jered +803 monk +804 tanner +805 master_crafter +806 donovan +807 pierre +808 hobbes +809 louisa +810 mary +811 stanford +812 murder_guard +813 gossip +814 anna +815 murder_bob +816 carol +817 david +818 elizabeth +819 frank +820 poison_salesman +821 sinclair_guard_dog +822 npc_822 +823 anabarrel +824 npc_824 +825 npc_825 +826 npc_826 +827 rowdy_slave +828 npc_828 +829 npc_829 +830 npc_830 +831 npc_831 +832 npc_832 +833 npc_833 +834 npc_834 +835 irena +836 shantay +837 shantay_guard +838 shantay_pass_guard +839 npc_839 +840 npc_840 +841 npc_841 +842 npc_842 +843 rdpt_employee +844 wizard_cromperty +845 horacio +846 kangai_mau +847 npc_847 +848 blurberry +849 gnome_barman +850 aluft_gianne +851 npc_851 +852 npc_852 +853 npc_853 +854 npc_854 +855 npc_855 +856 npc_856 +857 npc_857 +858 npc_858 +859 npc_859 +860 npc_860 +861 npc_861 +862 npc_862 +863 npc_863 +864 npc_864 +865 npc_865 +866 npc_866 +867 npc_867 +868 npc_868 +869 npc_869 +870 npc_870 +871 npc_871 +872 npc_872 +873 npc_873 +874 npc_874 +875 npc_875 +876 npc_876 +877 tower_guard +878 colonel_radick +879 delrith +880 weakened_delrith +881 traiborn +882 gypsy +883 sir_prysin +884 captain_rovin +885 ceril_carnillean +886 claus_the_chef +887 carnillean_guard +888 philipe_carnillean +889 henryeta_carnillean +890 butler_jones +891 alomone +892 hazeel +893 clivet +894 hazeel_cultist +895 boy +896 nora_t_hagg +897 witches_experiment_p1 +898 witches_experiment_p2 +899 witches_experiment_p3 +900 witches_experiment_p4 +901 ball_mouse +902 gundai +903 lundail +904 chamber_guardian +905 kolodion +906 kolodion_defeated +907 kolodion_human_form +908 kolodion_ogre_form +909 kolodion_arachnid_form +910 kolodion_ethereal_form +911 kolodion_demon_form +912 battle_mage_zamorak +913 battle_mage_saradomin +914 battle_mage_guthix +915 leela +916 joe_guard +917 jail_guard +918 ned +919 lady_keli +920 prince_ali +921 npc_921 +922 aggie +923 hassan +924 osman +925 border_guard_lumby +926 border_guard_alkharid +927 npc_927 +928 npc_928 +929 npc_929 +930 npc_930 +931 jungle_savage +932 npc_932 +933 npc_933 +934 nezikchened +935 npc_935 +936 npc_936 +937 npc_937 +938 npc_938 +939 npc_939 +940 npc_940 +941 green_dragon +942 master_chef +943 survival_expert +944 combat_instructor +945 runescape_guide +946 magic_instructor +947 financial_advisor +948 mining_instructor +949 quest_guide +950 tut_giant_rat +951 tut_chicken +952 tut_fishing_spot +953 tut_banker +954 brother_brace +955 cow_3 +956 macro_event_drunken_dwarf +957 mubariz +958 fadli +959 aabla +960 sabreen +961 tafani +962 jaraah +963 zahwa +964 ima +965 sabeil +966 jadid +967 dalal +968 afrah +969 jeed +970 diango +971 chadwell +972 npc_972 +973 npc_973 +974 npc_974 +975 npc_975 +976 npc_976 +977 npc_977 +978 npc_978 +979 npc_979 +980 npc_980 +981 npc_981 +982 npc_982 +983 npc_983 +984 npc_984 +985 npc_985 +986 npc_986 +987 npc_987 +988 sir_jerro +989 sir_carl +990 sir_harry +991 npc_991 +992 npc_992 +993 npc_993 +994 npc_994 +995 npc_995 +996 npc_996 +997 npc_997 +998 othainian +999 doomion +1000 holthion +1001 darkmage +1002 npc_1002 +1003 npc_1003 +1004 npc_1004 +1005 npc_1005 +1006 sea_slug +1007 zamorak_wizard +1008 hamid +1009 poison_spider_observatory +1010 npc_1010 +1011 npc_1011 +1012 npc_1012 +1013 npc_1013 +1014 npc_1014 +1015 npc_1015 +1016 npc_1016 diff --git a/src/public/data/symbols/npc_mode.sym b/src/public/data/symbols/npc_mode.sym new file mode 100644 index 00000000..2746073b --- /dev/null +++ b/src/public/data/symbols/npc_mode.sym @@ -0,0 +1,48 @@ +-1 null +0 none +1 wander +2 patrol +3 playerescape +4 playerfollow +5 playerface +6 playerfaceclose +7 opplayer1 +8 opplayer2 +9 opplayer3 +10 opplayer4 +11 opplayer5 +12 applayer1 +13 applayer2 +14 applayer3 +15 applayer4 +16 applayer5 +17 oploc1 +18 oploc2 +19 oploc3 +20 oploc4 +21 oploc5 +22 aploc1 +23 aploc2 +24 aploc3 +25 aploc4 +26 aploc5 +27 opobj1 +28 opobj2 +29 opobj3 +30 opobj4 +31 opobj5 +32 apobj1 +33 apobj2 +34 apobj3 +35 apobj4 +36 apobj5 +37 opnpc1 +38 opnpc2 +39 opnpc3 +40 opnpc4 +41 opnpc5 +42 apnpc1 +43 apnpc2 +44 apnpc3 +45 apnpc4 +46 apnpc5 diff --git a/src/public/data/symbols/npc_stat.sym b/src/public/data/symbols/npc_stat.sym new file mode 100644 index 00000000..e4b048cb --- /dev/null +++ b/src/public/data/symbols/npc_stat.sym @@ -0,0 +1,6 @@ +0 attack +1 defence +2 strength +3 hitpoints +4 ranged +5 magic diff --git a/src/public/data/symbols/obj.sym b/src/public/data/symbols/obj.sym new file mode 100644 index 00000000..a4dbcd97 --- /dev/null +++ b/src/public/data/symbols/obj.sym @@ -0,0 +1,2886 @@ +0 obj_0 +1 obj_1 +2 mcannonball +3 obj_3 +4 ammo_mould +5 instruction_manual +6 cannon_base +7 cert_cannon_base +8 cannon_stand +9 cert_cannon_stand +10 cannon_barrels +11 cert_cannon_barrels +12 cannon_furnace +13 cert_cannon_furnace +14 obj_14 +15 holy_table_napkin +16 magic_whistle +17 grail_bell +18 magic_gold_feather +19 holy_grail +20 white_cog +21 black_cog +22 blue_cog +23 red_cog +24 rat_poison +25 red_vine_worm +26 fishing_trophy +27 fishing_pass +28 insect_repellent +29 cert_insect_repellent +30 bucket_wax +31 cert_bucket_wax +32 lit_black_candle +33 lit_candle +34 cert_lit_candle +35 excalibur +36 candle +37 cert_candle +38 black_candle +39 bronze_arrowheads +40 iron_arrowheads +41 steel_arrowheads +42 mithril_arrowheads +43 adamant_arrowheads +44 rune_arrowheads +45 obj_45 +46 obj_46 +47 obj_47 +48 obj_48 +49 cert_obj_48 +50 obj_50 +51 cert_obj_50 +52 arrow_shaft +53 headless_arrow +54 obj_54 +55 cert_obj_54 +56 obj_56 +57 cert_obj_56 +58 obj_58 +59 cert_obj_58 +60 obj_60 +61 cert_obj_60 +62 obj_62 +63 cert_obj_62 +64 obj_64 +65 cert_obj_64 +66 obj_66 +67 cert_obj_66 +68 obj_68 +69 cert_obj_68 +70 obj_70 +71 cert_obj_70 +72 obj_72 +73 cert_obj_72 +74 khazard_helmet +75 khazard_armour +76 khazard_cell_keys +77 khali_brew +78 ice_arrow +79 ice_arrow_4 +80 ice_arrow_3 +81 ice_arrow_2 +82 ice_arrow_5 +83 ikov_lever +84 staff_of_armadyl +85 shiny_key +86 pendant_of_lucien +87 armadyl_pendant +88 boots_of_lightness_inv +89 boots_of_lightness_worn +90 childs_blanket +91 unf_guam_potion +92 cert_unf_guam_potion +93 unf_marrentill_potion +94 cert_unf_marrentill_potion +95 unf_tarromin_potion +96 cert_unf_tarromin_potion +97 unf_harralander_potion +98 cert_unf_harralander_potion +99 unf_ranarr_potion +100 cert_unf_ranarr_potion +101 unf_irit_potion +102 cert_unf_irit_potion +103 unf_avantoe_potion +104 cert_unf_avantoe_potion +105 unf_kwuarm_potion +106 cert_unf_kwuarm_potion +107 unf_cadantine_potion +108 cert_unf_cadantine_potion +109 unf_dwarf_weed_potion +110 cert_unf_dwarf_weed_potion +111 unf_torstol_potion +112 cert_unf_torstol_potion +113 4dose1strength +114 cert_4dose1strength +115 3dose1strength +116 cert_3dose1strength +117 2dose1strength +118 cert_2dose1strength +119 1dose1strength +120 cert_1dose1strength +121 3dose1attack +122 cert_3dose1attack +123 2dose1attack +124 cert_2dose1attack +125 1dose1attack +126 cert_1dose1attack +127 3dose1restore +128 cert_3dose1restore +129 2dose1restore +130 cert_2dose1restore +131 1dose1restore +132 cert_1dose1restore +133 3dose1defense +134 cert_3dose1defense +135 2dose1defense +136 cert_2dose1defense +137 1dose1defense +138 cert_1dose1defense +139 3doseprayerrestore +140 cert_3doseprayerrestore +141 2doseprayerrestore +142 cert_2doseprayerrestore +143 1doseprayerrestore +144 cert_1doseprayerrestore +145 3dose2attack +146 cert_3dose2attack +147 2dose2attack +148 cert_2dose2attack +149 1dose2attack +150 cert_1dose2attack +151 3dosefisherspotion +152 cert_3dosefisherspotion +153 2dosefisherspotion +154 cert_2dosefisherspotion +155 1dosefisherspotion +156 cert_1dosefisherspotion +157 3dose2strength +158 cert_3dose2strength +159 2dose2strength +160 cert_2dose2strength +161 1dose2strength +162 cert_1dose2strength +163 3dose2defense +164 cert_3dose2defense +165 2dose2defense +166 cert_2dose2defense +167 1dose2defense +168 cert_1dose2defense +169 3doserangerspotion +170 cert_3doserangerspotion +171 2doserangerspotion +172 cert_2doserangerspotion +173 1doserangerspotion +174 cert_1doserangerspotion +175 3doseantipoison +176 cert_3doseantipoison +177 2doseantipoison +178 cert_2doseantipoison +179 1doseantipoison +180 cert_1doseantipoison +181 3dose2antipoison +182 cert_3dose2antipoison +183 2dose2antipoison +184 cert_2dose2antipoison +185 1dose2antipoison +186 cert_1dose2antipoison +187 weapon_poison +188 cert_weapon_poison +189 3dosepotionofzamorak +190 cert_3dosepotionofzamorak +191 2dosepotionofzamorak +192 cert_2dosepotionofzamorak +193 1dosepotionofzamorak +194 cert_1dosepotionofzamorak +195 potion +196 cert_potion +197 poison_chalice +198 cert_poison_chalice +199 unidentified_guam_leaf +200 cert_unidentified_guam_leaf +201 unidentified_marrentill +202 cert_unidentified_marrentill +203 unidentified_tarromin +204 cert_unidentified_tarromin +205 unidentified_harralander +206 cert_unidentified_harralander +207 unidentified_ranarr_weed +208 cert_unidentified_ranarr_weed +209 unidentified_irit_leaf +210 cert_unidentified_irit_leaf +211 unidentified_avantoe +212 cert_unidentified_avantoe +213 unidentified_kwuarm +214 cert_unidentified_kwuarm +215 unidentified_cadantine +216 cert_unidentified_cadantine +217 unidentified_dwarf_weed +218 cert_unidentified_dwarf_weed +219 unidentified_torstol +220 cert_unidentified_torstol +221 eye_of_newt +222 cert_eye_of_newt +223 red_spiders_eggs +224 cert_red_spiders_eggs +225 limpwurt_root +226 cert_limpwurt_root +227 vial_water +228 cert_vial_water +229 vial_empty +230 cert_vial_empty +231 snape_grass +232 cert_snape_grass +233 pestle_and_mortar +234 cert_pestle_and_mortar +235 unicorn_horn_dust +236 cert_unicorn_horn_dust +237 unicorn_horn +238 cert_unicorn_horn +239 white_berries +240 cert_white_berries +241 dragon_scale_dust +242 cert_dragon_scale_dust +243 blue_dragon_scale +244 cert_blue_dragon_scale +245 wine_of_zamorak +246 cert_wine_of_zamorak +247 jangerberries +248 cert_jangerberries +249 guam_leaf +250 cert_guam_leaf +251 marentill +252 cert_marentill +253 tarromin +254 cert_tarromin +255 harralander +256 cert_harralander +257 ranarr_weed +258 cert_ranarr_weed +259 irit_leaf +260 cert_irit_leaf +261 avantoe +262 cert_avantoe +263 kwuarm +264 cert_kwuarm +265 cadantine +266 cert_cadantine +267 dwarf_weed +268 cert_dwarf_weed +269 torstol +270 cert_torstol +271 pressure_gauge +272 fish_food +273 poison +274 poisoned_fish_good +275 key_haunted +276 rubber_tube +277 oil_can +278 obj_278 +279 obj_279 +280 obj_280 +281 obj_281 +282 obj_282 +283 obj_283 +284 obj_284 +285 obj_285 +286 goblin_mail_orange +287 goblin_mail_blue +288 goblin_mail +289 cert_goblin_mail +290 research_package +291 notes +292 book_on_baxtorian +293 golrie_key +294 glarials_pebble +295 glarials_amulet +296 glarials_urn_full +297 glarials_urn_empty +298 waterfall_key +299 mithril_seeds +300 rats_tail +301 lobster_pot +302 cert_lobster_pot +303 net +304 cert_net +305 net_big +306 cert_net_big +307 fishing_rod +308 cert_fishing_rod +309 fly_fishing_rod +310 cert_fly_fishing_rod +311 harpoon +312 cert_harpoon +313 fishing_bait +314 feather +315 shrimps +316 cert_shrimps +317 raw_shrimps +318 cert_raw_shrimps +319 anchovies +320 cert_anchovies +321 raw_anchovies +322 cert_raw_anchovies +323 burnt_shrimp_anchovies +324 cert_burnt_shrimp_anchovies +325 sardine +326 cert_sardine +327 raw_sardine +328 cert_raw_sardine +329 salmon +330 cert_salmon +331 raw_salmon +332 cert_raw_salmon +333 trout +334 cert_trout +335 raw_trout +336 cert_raw_trout +337 giant_carp +338 raw_giant_carp +339 cod +340 cert_cod +341 raw_cod +342 cert_raw_cod +343 burnt_salmon_trout_carp_cod_pike +344 cert_burnt_salmon_trout_carp_cod_pike +345 raw_herring +346 cert_raw_herring +347 herring +348 cert_herring +349 raw_pike +350 cert_raw_pike +351 pike +352 cert_pike +353 raw_mackerel +354 cert_raw_mackerel +355 mackerel +356 cert_mackerel +357 burnt_mackerel +358 cert_burnt_mackerel +359 raw_tuna +360 cert_raw_tuna +361 tuna +362 cert_tuna +363 raw_bass +364 cert_raw_bass +365 bass +366 cert_bass +367 burnt_tuna_bass +368 cert_burnt_tuna_bass +369 burnt_sardine +370 cert_burnt_sardine +371 raw_swordfish +372 cert_raw_swordfish +373 swordfish +374 cert_swordfish +375 burnt_swordfish +376 cert_burnt_swordfish +377 raw_lobster +378 cert_raw_lobster +379 lobster +380 cert_lobster +381 burnt_lobster +382 cert_burnt_lobster +383 raw_shark +384 cert_raw_shark +385 shark +386 cert_shark +387 burnt_shark +388 cert_burnt_shark +389 raw_manta_ray +390 cert_raw_manta_ray +391 manta_ray +392 cert_manta_ray +393 burnt_manta_ray +394 cert_burnt_manta_ray +395 raw_sea_turtle +396 cert_raw_sea_turtle +397 sea_turtle +398 cert_sea_turtle +399 burnt_sea_turtle +400 cert_burnt_sea_turtle +401 seaweed +402 cert_seaweed +403 edible_seaweed +404 cert_edible_seaweed +405 casket +406 cert_casket +407 oyster +408 cert_oyster +409 empty_oyster +410 cert_empty_oyster +411 oyster_perl +412 cert_oyster_perl +413 oyster_perls +414 cert_oyster_perls +415 Ethenea +416 liquid_honey +417 sulphuric_broline +418 plague_sample +419 touch_paper +420 distillator +421 obj_421 +422 bird_feed +423 biohazard_key +424 pigeon_cage +425 pigeon_cage_empty +426 priest_gown_top +427 cert_priest_gown_top +428 priest_gown_bottom +429 cert_priest_gown_bottom +430 doctors_gown +431 karamja_rum +432 hunt_chest_key +433 pirate_message +434 clay +435 cert_clay +436 copper_ore +437 cert_copper_ore +438 tin_ore +439 cert_tin_ore +440 iron_ore +441 cert_iron_ore +442 silver_ore +443 cert_silver_ore +444 gold_ore +445 cert_gold_ore +446 perfect_gold_ore +447 mithril_ore +448 cert_mithril_ore +449 adamantite_ore +450 cert_adamantite_ore +451 runite_ore +452 cert_runite_ore +453 coal +454 cert_coal +455 barcrawl_card +456 scorpion_cage_empty +457 scorpion_cage_first +458 scorpion_cage_first_second +459 scorpion_cage_first_third +460 scorpion_cage_second +461 scorpion_cage_second_third +462 scorpion_cage_third +463 scorpion_cage_all +464 strange_fruit +465 cert_strange_fruit +466 pickaxe_handle +467 cert_pickaxe_handle +468 bronze_pickaxe_broken +469 cert_bronze_pickaxe_broken +470 iron_pickaxe_broken +471 cert_iron_pickaxe_broken +472 steel_pickaxe_broken +473 cert_steel_pickaxe_broken +474 mithril_pickaxe_broken +475 cert_mithril_pickaxe_broken +476 adamant_pickaxe_broken +477 cert_adamant_pickaxe_broken +478 rune_pickaxe_broken +479 cert_rune_pickaxe_broken +480 bronze_pickaxe_head +481 cert_bronze_pickaxe_head +482 iron_pickaxe_head +483 cert_iron_pickaxe_head +484 steel_pickaxe_head +485 cert_steel_pickaxe_head +486 mithril_pickaxe_head +487 cert_mithril_pickaxe_head +488 adamant_pickaxe_head +489 cert_adamant_pickaxe_head +490 rune_pickaxe_head +491 cert_rune_pickaxe_head +492 axe_handle +493 cert_axe_handle +494 bronze_axe_broken +495 cert_bronze_axe_broken +496 iron_axe_broken +497 cert_iron_axe_broken +498 steel_axe_broken +499 cert_steel_axe_broken +500 black_axe_broken +501 cert_black_axe_broken +502 mithril_axe_broken +503 cert_mithril_axe_broken +504 adamant_axe_broken +505 cert_adamant_axe_broken +506 rune_axe_broken +507 cert_rune_axe_broken +508 bronze_axe_head +509 cert_bronze_axe_head +510 iron_axe_head +511 cert_iron_axe_head +512 steel_axe_head +513 cert_steel_axe_head +514 black_axe_head +515 cert_black_axe_head +516 mithril_axe_head +517 cert_mithril_axe_head +518 adamant_axe_head +519 cert_adamant_axe_head +520 rune_axe_head +521 cert_rune_axe_head +522 druid_enchanted_beef +523 druid_enchanted_rat +524 druid_enchanted_bear +525 druid_enchanted_chicken +526 bones +527 cert_bones +528 burnt_bones +529 cert_burnt_bones +530 bat_bones +531 cert_bat_bones +532 big_bones +533 cert_big_bones +534 babydragon_bones +535 cert_babydragon_bones +536 dragon_bones +537 cert_dragon_bones +538 obj_538 +539 cert_obj_538 +540 obj_540 +541 cert_obj_540 +542 obj_542 +543 cert_obj_542 +544 obj_544 +545 cert_obj_544 +546 obj_546 +547 cert_obj_546 +548 obj_548 +549 cert_obj_548 +550 newcomer_map +551 cert_newcomer_map +552 amulet_of_ghostspeak +553 ghost_skull +554 firerune +555 waterrune +556 airrune +557 earthrune +558 mindrune +559 bodyrune +560 deathrune +561 naturerune +562 chaosrune +563 lawrune +564 cosmicrune +565 bloodrune +566 soulrune +567 stafforb +568 cert_stafforb +569 fire_orb +570 cert_fire_orb +571 water_orb +572 cert_water_orb +573 air_orb +574 cert_air_orb +575 earth_orb +576 cert_earth_orb +577 wizards_robe +578 cert_wizards_robe +579 wizards_hat_blue +580 cert_wizards_hat_blue +581 obj_581 +582 cert_obj_581 +583 bailing_bucket_empty +584 cert_bailing_bucket_empty +585 bailing_bucket_full +586 cert_bailing_bucket_full +587 orb_of_protection +588 orbs_of_protection +589 gnome_amulet +590 tinderbox +591 cert_tinderbox +592 ashes +593 cert_ashes +594 lit_torch +595 cert_lit_torch +596 unlit_torch +597 cert_unlit_torch +598 obj_598 +599 obj_599 +600 book_of_astrology +601 keep_key +602 lens_mould +603 lens +604 obj_604 +605 obj_605 +606 obj_606 +607 obj_607 +608 obj_608 +609 obj_609 +610 obj_610 +611 zqcrystal +612 zqcrystal_blue +613 zqcrystal_red +614 zqcrystal_yellow +615 zqcrystal_white +616 obj_616 +617 coins_shilo +618 obj_618 +619 obj_619 +620 cert_obj_619 +621 obj_621 +622 cert_obj_621 +623 obj_623 +624 obj_624 +625 obj_625 +626 gnome_boots_pink +627 cert_gnome_boots_pink +628 gnome_boots_green +629 cert_gnome_boots_green +630 gnome_boots_blue +631 cert_gnome_boots_blue +632 gnome_boots_cream +633 cert_gnome_boots_cream +634 gnome_boots_turqoise +635 cert_gnome_boots_turqoise +636 gnome_robe_top_pink +637 cert_gnome_robe_top_pink +638 gnome_robe_top_green +639 cert_gnome_robe_top_green +640 gnome_robe_top_blue +641 cert_gnome_robe_top_blue +642 gnome_robe_top_cream +643 cert_gnome_robe_top_cream +644 gnome_robe_top_turqoise +645 cert_gnome_robe_top_turqoise +646 gnome_robe_bottoms_pink +647 cert_gnome_robe_bottoms_pink +648 gnome_robe_bottoms_green +649 cert_gnome_robe_bottoms_green +650 robe_bottoms_blue +651 cert_robe_bottoms_blue +652 gnome_robe_bottoms_cream +653 cert_gnome_robe_bottoms_cream +654 gnome_robe_bottoms_turqoise +655 cert_gnome_robe_bottoms_turqoise +656 gnome_hat_pink +657 cert_gnome_hat_pink +658 gnome_hat_green +659 cert_gnome_hat_green +660 gnome_hat_blue +661 cert_gnome_hat_blue +662 gnome_hat_cream +663 cert_gnome_hat_cream +664 gnome_hat_turqoise +665 cert_gnome_hat_turqoise +666 portrait +667 blurite_sword +668 blurite_ore +669 specimen_jar +670 specimen_brush +671 obj_671 +672 obj_672 +673 obj_673 +674 obj_674 +675 rock_pick +676 trowel +677 obj_677 +678 obj_678 +679 obj_679 +680 obj_680 +681 talisman_of_zaros +682 obj_682 +683 obj_683 +684 obj_684 +685 old_boot +686 rusty_sword +687 broken_arrow +688 buttons +689 broken_staff +690 broken_glass +691 obj_691 +692 obj_692 +693 obj_693 +694 obj_694 +695 old_tooth +696 obj_696 +697 damaged_armour +698 obj_698 +699 obj_699 +700 obj_700 +701 obj_701 +702 obj_702 +703 obj_703 +704 obj_704 +705 obj_705 +706 obj_706 +707 obj_707 +708 arcenia_root +709 obj_709 +710 obj_710 +711 obj_711 +712 obj_712 +713 obj_713 +714 obj_714 +715 obj_715 +716 obj_716 +717 obj_717 +718 obj_718 +719 obj_719 +720 obj_720 +721 obj_721 +722 obj_722 +723 obj_723 +724 obj_724 +725 obj_725 +726 obj_726 +727 obj_727 +728 cert_obj_727 +729 obj_729 +730 obj_730 +731 obj_731 +732 holy_water +733 obj_733 +734 cert_obj_733 +735 obj_735 +736 obj_736 +737 obj_737 +738 obj_738 +739 obj_739 +740 obj_740 +741 obj_741 +742 obj_742 +743 obj_743 +744 obj_744 +745 obj_745 +746 obj_746 +747 obj_747 +748 obj_748 +749 obj_749 +750 obj_750 +751 gnomeball +752 cert_gnomeball +753 cadaver_berries +754 cert_cadaver_berries +755 juliet_message +756 cadaver +757 arrav_book +758 obj_758 +759 weapon_store_key +760 cert_weapon_store_key +761 blackarmgang_scroll +762 cert_blackarmgang_scroll +763 arravshield1 +764 cert_arravshield1 +765 arravshield2 +766 cert_arravshield2 +767 phoenix_crossbow +768 cert_phoenix_crossbow +769 arravcert_scroll +770 cert_arravcert_scroll +771 dramenbranch +772 dramenstaff +773 obj_773 +774 obj_774 +775 gauntlets_of_cooking +776 gauntlets_of_goldsmithing +777 obj_777 +778 obj_778 +779 obj_779 +780 obj_780 +781 obj_781 +782 obj_782 +783 obj_783 +784 obj_784 +785 obj_785 +786 obj_786 +787 obj_787 +788 obj_788 +789 obj_789 +790 obj_790 +791 obj_791 +792 obj_792 +793 obj_793 +794 obj_794 +795 war_ship +796 explodingvial +797 herbbowl +798 grinder +799 template_for_cert +800 bronze_thrownaxe +801 iron_thrownaxe +802 steel_thrownaxe +803 mithril_thrownaxe +804 adamant_thrownaxe +805 rune_thrownaxe +806 bronze_dart +807 iron_dart +808 steel_dart +809 mithril_dart +810 adamant_dart +811 rune_dart +812 bronze_dart_p +813 iron_dart_p +814 steel_dart_p +815 mithril_dart_p +816 adamant_dart_p +817 rune_dart_p +818 poisoned_dart_p +819 bronze_dart_tip +820 iron_dart_tip +821 steel_dart_tip +822 mithril_dart_tip +823 adamant_dart_tip +824 rune_dart_tip +825 bronze_javelin +826 iron_javelin +827 steel_javelin +828 mithril_javelin +829 adamant_javelin +830 rune_javelin +831 bronze_javelin_p +832 iron_javelin_p +833 steel_javelin_p +834 mithril_javelin_p +835 adamant_javelin_p +836 rune_javelin_p +837 crossbow +838 cert_crossbow +839 longbow +840 cert_longbow +841 shortbow +842 cert_shortbow +843 oak_shortbow +844 cert_oak_shortbow +845 oak_longbow +846 cert_oak_longbow +847 willow_longbow +848 cert_willow_longbow +849 willow_shortbow +850 cert_willow_shortbow +851 maple_longbow +852 cert_maple_longbow +853 maple_shortbow +854 cert_maple_shortbow +855 yew_longbow +856 cert_yew_longbow +857 yew_shortbow +858 cert_yew_shortbow +859 magic_longbow +860 cert_magic_longbow +861 magic_shortbow +862 cert_magic_shortbow +863 iron_knife +864 bronze_knife +865 steel_knife +866 mithril_knife +867 adamant_knife +868 rune_knife +869 black_knife +870 bronze_knife_p +871 iron_knife_p +872 steel_knife_p +873 mithril_knife_p +874 black_knife_p +875 adamant_knife_p +876 rune_knife_p +877 bolt +878 bolt_p +879 opal_bolt +880 pearl_bolt +881 barbed_bolt +882 bronze_arrow +883 bronze_arrow_p +884 iron_arrow +885 iron_arrow_p +886 steel_arrow +887 steel_arrow_p +888 mithril_arrow +889 mithril_arrow_p +890 adamant_arrow +891 adamant_arrow_p +892 rune_arrow +893 rune_arrow_p +894 bronze_arrow_4 +895 bronze_arrow_3 +896 bronze_arrow_2 +897 bronze_arrow_5 +898 bronze_arrow_p_4 +899 bronze_arrow_p_3 +900 bronze_arrow_p_2 +901 bronze_arrow_p_5 +902 iron_arrow_4 +903 iron_arrow_3 +904 iron_arrow_2 +905 iron_arrow_5 +906 iron_arrow_p_4 +907 iron_arrow_p_3 +908 iron_arrow_p_2 +909 iron_arrow_p_5 +910 steel_arrow_4 +911 steel_arrow_3 +912 steel_arrow_2 +913 steel_arrow_5 +914 steel_arrow_p_4 +915 steel_arrow_p_3 +916 steel_arrow_p_2 +917 steel_arrow_p_5 +918 mithril_arrow_4 +919 mithril_arrow_3 +920 mithril_arrow_2 +921 mithril_arrow_5 +922 mithril_arrow_p_4 +923 mithril_arrow_p_3 +924 mithril_arrow_p_2 +925 mithril_arrow_p_5 +926 adamant_arrow_4 +927 adamant_arrow_3 +928 adamant_arrow_2 +929 adamant_arrow_5 +930 adamant_arrow_p_4 +931 adamant_arrow_p_3 +932 adamant_arrow_p_2 +933 adamant_arrow_p_5 +934 rune_arrow_4 +935 rune_arrow_3 +936 rune_arrow_2 +937 rune_arrow_5 +938 rune_arrow_p_4 +939 rune_arrow_p_3 +940 rune_arrow_p_2 +941 rune_arrow_p_5 +942 lit_arrows +943 obj_943 +944 cert_obj_943 +945 throwingrope +946 knife +947 cert_knife +948 bear_fur +949 cert_bear_fur +950 silk +951 cert_silk +952 spade +953 cert_spade +954 rope +955 cert_rope +956 flier +957 cert_flier +958 grey_wolf_fur +959 cert_grey_wolf_fur +960 plank +961 cert_plank +962 christmas_cracker +963 cert_christmas_cracker +964 obj_964 +965 cert_obj_964 +966 obj_966 +967 cert_obj_966 +968 obj_968 +969 cert_obj_968 +970 papyrus +971 cert_papyrus +972 obj_972 +973 charcoal +974 cert_charcoal +975 machete +976 cert_machete +977 obj_977 +978 cert_obj_977 +979 highwayman_mask +980 cert_highwayman_mask +981 disk_of_returning +982 cert_disk_of_returning +983 brass_key +984 cert_brass_key +985 half_key1 +986 cert_half_key1 +987 half_key2 +988 cert_half_key2 +989 crystal_key +990 cert_crystal_key +991 muddy_key +992 cert_muddy_key +993 sinister_key +994 cert_sinister_key +995 coins +996 coins_2 +997 coins_3 +998 coins_4 +999 coins_5 +1000 coins_25 +1001 coins_100 +1002 coins_250 +1003 coins_1000 +1004 coins_10000 +1005 white_apron +1006 cert_white_apron +1007 red_cape +1008 cert_red_cape +1009 brass_necklace +1010 cert_brass_necklace +1011 blue_skirt +1012 cert_blue_skirt +1013 pink_skirt +1014 cert_pink_skirt +1015 black_skirt +1016 cert_black_skirt +1017 wizard_hat +1018 cert_wizard_hat +1019 black_cape +1020 cert_black_cape +1021 blue_cape +1022 cert_blue_cape +1023 yellow_cape +1024 cert_yellow_cape +1025 eyepatch +1026 cert_eyepatch +1027 green_cape +1028 cert_green_cape +1029 purple_cape +1030 cert_purple_cape +1031 orange_cape +1032 cert_orange_cape +1033 zamorak_monk_bottom +1034 cert_zamorak_monk_bottom +1035 zamorak_monk_top +1036 cert_zamorak_monk_top +1037 bunny_ears +1038 red_partyhat +1039 cert_red_partyhat +1040 yellow_partyhat +1041 cert_yellow_partyhat +1042 blue_partyhat +1043 cert_blue_partyhat +1044 green_partyhat +1045 cert_green_partyhat +1046 purple_partyhat +1047 cert_purple_partyhat +1048 white_partyhat +1049 cert_white_partyhat +1050 santa_hat +1051 cert_santa_hat +1052 cape_of_legends +1053 green_halloween_mask +1054 cert_green_halloween_mask +1055 blue_halloween_mask +1056 cert_blue_halloween_mask +1057 red_halloween_mask +1058 cert_red_halloween_mask +1059 leather_gloves +1060 cert_leather_gloves +1061 leather_boots +1062 cert_leather_boots +1063 leather_vambraces +1064 cert_leather_vambraces +1065 dragonhide_vamb +1066 cert_dragonhide_vamb +1067 iron_platelegs +1068 cert_iron_platelegs +1069 steel_platelegs +1070 cert_steel_platelegs +1071 mithril_platelegs +1072 cert_mithril_platelegs +1073 adamant_platelegs +1074 cert_adamant_platelegs +1075 bronze_platelegs +1076 cert_bronze_platelegs +1077 black_platelegs +1078 cert_black_platelegs +1079 rune_platelegs +1080 cert_rune_platelegs +1081 iron_plateskirt +1082 cert_iron_plateskirt +1083 steel_plateskirt +1084 cert_steel_plateskirt +1085 mithril_plateskirt +1086 cert_mithril_plateskirt +1087 bronze_plateskirt +1088 cert_bronze_plateskirt +1089 black_plateskirt +1090 cert_black_plateskirt +1091 adamant_plateskirt +1092 cert_adamant_plateskirt +1093 rune_plateskirt +1094 cert_rune_plateskirt +1095 leather_chaps +1096 cert_leather_chaps +1097 studded_chaps +1098 cert_studded_chaps +1099 dragonhide_chaps +1100 cert_dragonhide_chaps +1101 iron_chainbody +1102 cert_iron_chainbody +1103 bronze_chainbody +1104 cert_bronze_chainbody +1105 steel_chainbody +1106 cert_steel_chainbody +1107 black_chainbody +1108 cert_black_chainbody +1109 mithril_chainbody +1110 cert_mithril_chainbody +1111 adamant_chainbody +1112 cert_adamant_chainbody +1113 rune_chainbody +1114 cert_rune_chainbody +1115 iron_platebody +1116 cert_iron_platebody +1117 bronze_platebody +1118 cert_bronze_platebody +1119 steel_platebody +1120 cert_steel_platebody +1121 mithril_platebody +1122 cert_mithril_platebody +1123 adamant_platebody +1124 cert_adamant_platebody +1125 black_platebody +1126 cert_black_platebody +1127 rune_platebody +1128 cert_rune_platebody +1129 leather_body +1130 cert_leather_body +1131 hardleather_body +1132 cert_hardleather_body +1133 studded_body +1134 cert_studded_body +1135 dragonhide_body +1136 cert_dragonhide_body +1137 iron_med_helm +1138 cert_iron_med_helm +1139 bronze_med_helm +1140 cert_bronze_med_helm +1141 steel_med_helm +1142 cert_steel_med_helm +1143 mithril_med_helm +1144 cert_mithril_med_helm +1145 adamant_med_helm +1146 cert_adamant_med_helm +1147 rune_med_helm +1148 cert_rune_med_helm +1149 dragon_med_helm +1150 cert_dragon_med_helm +1151 black_med_helm +1152 cert_black_med_helm +1153 iron_full_helm +1154 cert_iron_full_helm +1155 bronze_full_helm +1156 cert_bronze_full_helm +1157 steel_full_helm +1158 cert_steel_full_helm +1159 mithril_full_helm +1160 cert_mithril_full_helm +1161 adamant_full_helm +1162 cert_adamant_full_helm +1163 rune_full_helm +1164 cert_rune_full_helm +1165 black_full_helm +1166 cert_black_full_helm +1167 leather_cowl +1168 cert_leather_cowl +1169 coif +1170 cert_coif +1171 wooden_shield +1172 cert_wooden_shield +1173 bronze_sq_shield +1174 cert_bronze_sq_shield +1175 iron_sq_shield +1176 cert_iron_sq_shield +1177 steel_sq_shield +1178 cert_steel_sq_shield +1179 black_sq_shield +1180 cert_black_sq_shield +1181 mithril_sq_shield +1182 cert_mithril_sq_shield +1183 adamant_sq_shield +1184 cert_adamant_sq_shield +1185 rune_sq_shield +1186 cert_rune_sq_shield +1187 dragon_sq_shield +1188 cert_dragon_sq_shield +1189 bronze_kiteshield +1190 cert_bronze_kiteshield +1191 iron_kiteshield +1192 cert_iron_kiteshield +1193 steel_kiteshield +1194 cert_steel_kiteshield +1195 black_kiteshield +1196 cert_black_kiteshield +1197 mithril_kiteshield +1198 cert_mithril_kiteshield +1199 adamant_kiteshield +1200 cert_adamant_kiteshield +1201 rune_kiteshield +1202 cert_rune_kiteshield +1203 iron_dagger +1204 cert_iron_dagger +1205 bronze_dagger +1206 cert_bronze_dagger +1207 steel_dagger +1208 cert_steel_dagger +1209 mithril_dagger +1210 cert_mithril_dagger +1211 adamant_dagger +1212 cert_adamant_dagger +1213 rune_dagger +1214 cert_rune_dagger +1215 dragon_dagger +1216 cert_dragon_dagger +1217 black_dagger +1218 cert_black_dagger +1219 iron_dagger_p +1220 cert_iron_dagger_p +1221 bronze_dagger_p +1222 cert_bronze_dagger_p +1223 steel_dagger_p +1224 cert_steel_dagger_p +1225 mithril_dagger_p +1226 cert_mithril_dagger_p +1227 adamant_dagger_p +1228 cert_adamant_dagger_p +1229 rune_dagger_p +1230 cert_rune_dagger_p +1231 dragon_dagger_p +1232 cert_dragon_dagger_p +1233 black_dagger_p +1234 cert_black_dagger_p +1235 poisoned_dagger +1236 cert_poisoned_dagger +1237 bronze_spear +1238 cert_bronze_spear +1239 iron_spear +1240 cert_iron_spear +1241 steel_spear +1242 cert_steel_spear +1243 mithril_spear +1244 cert_mithril_spear +1245 adamant_spear +1246 cert_adamant_spear +1247 rune_spear +1248 cert_rune_spear +1249 dragon_spear +1250 cert_dragon_spear +1251 bronze_spear_p +1252 cert_bronze_spear_p +1253 iron_spear_p +1254 cert_iron_spear_p +1255 steel_spear_p +1256 cert_steel_spear_p +1257 mithril_spear_p +1258 cert_mithril_spear_p +1259 adamant_spear_p +1260 cert_adamant_spear_p +1261 rune_spear_p +1262 cert_rune_spear_p +1263 dragon_spear_p +1264 cert_dragon_spear_p +1265 bronze_pickaxe +1266 cert_bronze_pickaxe +1267 iron_pickaxe +1268 cert_iron_pickaxe +1269 steel_pickaxe +1270 cert_steel_pickaxe +1271 adamant_pickaxe +1272 cert_adamant_pickaxe +1273 mithril_pickaxe +1274 cert_mithril_pickaxe +1275 rune_pickaxe +1276 cert_rune_pickaxe +1277 bronze_sword +1278 cert_bronze_sword +1279 iron_sword +1280 cert_iron_sword +1281 steel_sword +1282 cert_steel_sword +1283 black_sword +1284 cert_black_sword +1285 mithril_sword +1286 cert_mithril_sword +1287 adamant_sword +1288 cert_adamant_sword +1289 rune_sword +1290 cert_rune_sword +1291 bronze_longsword +1292 cert_bronze_longsword +1293 iron_longsword +1294 cert_iron_longsword +1295 steel_longsword +1296 cert_steel_longsword +1297 black_longsword +1298 cert_black_longsword +1299 mithril_longsword +1300 cert_mithril_longsword +1301 adamant_longsword +1302 cert_adamant_longsword +1303 rune_longsword +1304 cert_rune_longsword +1305 dragon_longsword +1306 cert_dragon_longsword +1307 bronze_2h_sword +1308 cert_bronze_2h_sword +1309 iron_2h_sword +1310 cert_iron_2h_sword +1311 steel_2h_sword +1312 cert_steel_2h_sword +1313 black_2h_sword +1314 cert_black_2h_sword +1315 mithril_2h_sword +1316 cert_mithril_2h_sword +1317 adamant_2h_sword +1318 cert_adamant_2h_sword +1319 rune_2h_sword +1320 cert_rune_2h_sword +1321 bronze_scimitar +1322 cert_bronze_scimitar +1323 iron_scimitar +1324 cert_iron_scimitar +1325 steel_scimitar +1326 cert_steel_scimitar +1327 black_scimitar +1328 cert_black_scimitar +1329 mithril_scimitar +1330 cert_mithril_scimitar +1331 adamant_scimitar +1332 cert_adamant_scimitar +1333 rune_scimitar +1334 cert_rune_scimitar +1335 iron_warhammer +1336 cert_iron_warhammer +1337 bronze_warhammer +1338 cert_bronze_warhammer +1339 steel_warhammer +1340 cert_steel_warhammer +1341 black_warhammer +1342 cert_black_warhammer +1343 mithril_warhammer +1344 cert_mithril_warhammer +1345 adamant_warhammer +1346 cert_adamant_warhammer +1347 rune_warhammer +1348 cert_rune_warhammer +1349 iron_axe +1350 cert_iron_axe +1351 bronze_axe +1352 cert_bronze_axe +1353 steel_axe +1354 cert_steel_axe +1355 mithril_axe +1356 cert_mithril_axe +1357 adamant_axe +1358 cert_adamant_axe +1359 rune_axe +1360 cert_rune_axe +1361 black_axe +1362 cert_black_axe +1363 iron_battleaxe +1364 cert_iron_battleaxe +1365 steel_battleaxe +1366 cert_steel_battleaxe +1367 black_battleaxe +1368 cert_black_battleaxe +1369 mithril_battleaxe +1370 cert_mithril_battleaxe +1371 adamant_battleaxe +1372 cert_adamant_battleaxe +1373 rune_battleaxe +1374 cert_rune_battleaxe +1375 bronze_battleaxe +1376 cert_bronze_battleaxe +1377 dragon_battleaxe +1378 cert_dragon_battleaxe +1379 plainstaff +1380 cert_plainstaff +1381 staff_of_air +1382 cert_staff_of_air +1383 staff_of_water +1384 cert_staff_of_water +1385 staff_of_earth +1386 cert_staff_of_earth +1387 staff_of_fire +1388 cert_staff_of_fire +1389 magicstaff +1390 cert_magicstaff +1391 battlestaff +1392 cert_battlestaff +1393 fire_battlestaff +1394 cert_fire_battlestaff +1395 water_battlestaff +1396 cert_water_battlestaff +1397 air_battlestaff +1398 cert_air_battlestaff +1399 earth_battlestaff +1400 cert_earth_battlestaff +1401 mystic_fire_staff +1402 cert_mystic_fire_staff +1403 mystic_water_staff +1404 cert_mystic_water_staff +1405 mystic_air_staff +1406 cert_mystic_air_staff +1407 mystic_earth_staff +1408 cert_mystic_earth_staff +1409 iban_staff +1410 broken_iban_staff +1411 obj_1411 +1412 cert_obj_1411 +1413 obj_1413 +1414 cert_obj_1413 +1415 obj_1415 +1416 cert_obj_1415 +1417 obj_1417 +1418 cert_obj_1417 +1419 scythe +1420 iron_mace +1421 cert_iron_mace +1422 bronze_mace +1423 cert_bronze_mace +1424 steel_mace +1425 cert_steel_mace +1426 black_mace +1427 cert_black_mace +1428 mithril_mace +1429 cert_mithril_mace +1430 adamant_mace +1431 cert_adamant_mace +1432 rune_mace +1433 cert_rune_mace +1434 dragon_mace +1435 cert_dragon_mace +1436 blankrune +1437 cert_blankrune +1438 air_talisman +1439 cert_air_talisman +1440 earth_talisman +1441 cert_earth_talisman +1442 fire_talisman +1443 cert_fire_talisman +1444 water_talisman +1445 cert_water_talisman +1446 body_talisman +1447 cert_body_talisman +1448 mind_talisman +1449 cert_mind_talisman +1450 blood_talisman +1451 cert_blood_talisman +1452 chaos_talisman +1453 cert_chaos_talisman +1454 cosmic_talisman +1455 cert_cosmic_talisman +1456 death_talisman +1457 cert_death_talisman +1458 law_talisman +1459 cert_law_talisman +1460 soul_talisman +1461 cert_soul_talisman +1462 nature_talisman +1463 cert_nature_talisman +1464 archery_ticket +1465 obj_1465 +1466 sea_slug +1467 damp_sticks +1468 dry_sticks +1469 broken_glass2 +1470 imp_red_bead +1471 cert_imp_red_bead +1472 imp_yellow_bead +1473 cert_imp_yellow_bead +1474 imp_black_bead +1475 cert_imp_black_bead +1476 imp_white_bead +1477 cert_imp_white_bead +1478 amulet_accuracy +1479 cert_amulet_accuracy +1480 obj_1480 +1481 obj_1481 +1482 obj_1482 +1483 obj_1483 +1484 obj_1484 +1485 obj_1485 +1486 obj_1486 +1487 obj_1487 +1488 obj_1488 +1489 obj_1489 +1490 obj_1490 +1491 obj_1491 +1492 obj_1492 +1493 obj_1493 +1494 obj_1494 +1495 obj_1495 +1496 obj_1496 +1497 obj_1497 +1498 obj_1498 +1499 obj_1499 +1500 obj_1500 +1501 dwarf_brew +1502 obj_1502 +1503 elena_warrant +1504 hangover_cure +1505 elena_teleport_scroll +1506 gasmask +1507 elena_key +1508 elena_scruffy_note +1509 elena_book +1510 elena_picture +1511 logs +1512 cert_logs +1513 magic_logs +1514 cert_magic_logs +1515 yew_logs +1516 cert_yew_logs +1517 maple_logs +1518 cert_maple_logs +1519 willow_logs +1520 cert_willow_logs +1521 oak_logs +1522 cert_oak_logs +1523 lockpick +1524 cert_lockpick +1525 unidentified_snake_weed +1526 snake_weed +1527 unidentified_ardrigal +1528 ardrigal +1529 unidentified_sito_foil +1530 sito_foil +1531 unidentified_volencia_moss +1532 volencia_moss +1533 unidentified_rogues_purse +1534 rogues_purse +1535 crandor_map_part1 +1536 crandor_map_part2 +1537 crandor_map_part3 +1538 crandor_map +1539 nails +1540 dragonfire_shield +1541 cert_dragonfire_shield +1542 maze_key +1543 maze_key_red +1544 maze_key_orange +1545 maze_key_yellow +1546 maze_key_blue +1547 maze_key_magenta +1548 maze_key_green +1549 stake +1550 garlic +1551 cert_garlic +1552 obj_1552 +1553 cert_obj_1552 +1554 obj_1554 +1555 obj_1555 +1556 obj_1556 +1557 obj_1557 +1558 obj_1558 +1559 obj_1559 +1560 obj_1560 +1561 obj_1561 +1562 obj_1562 +1563 obj_1563 +1564 obj_1564 +1565 obj_1565 +1566 obj_1566 +1567 obj_1567 +1568 obj_1568 +1569 obj_1569 +1570 obj_1570 +1571 obj_1571 +1572 obj_1572 +1573 obj_1573 +1574 cert_obj_1573 +1575 obj_1575 +1576 cert_obj_1575 +1577 obj_1577 +1578 cert_obj_1577 +1579 obj_1579 +1580 ice_gloves +1581 obj_1581 +1582 obj_1582 +1583 obj_1583 +1584 obj_1584 +1585 obj_1585 +1586 obj_1586 +1587 cert_obj_1586 +1588 obj_1588 +1589 obj_1589 +1590 dusty_key +1591 jail_key +1592 ring_mould +1593 cert_ring_mould +1594 unholy_mould +1595 amulet_mould +1596 cert_amulet_mould +1597 necklace_mould +1598 cert_necklace_mould +1599 holy_mould +1600 cert_holy_mould +1601 diamond +1602 cert_diamond +1603 ruby +1604 cert_ruby +1605 emerald +1606 cert_emerald +1607 sapphire +1608 cert_sapphire +1609 opal +1610 cert_opal +1611 jade +1612 cert_jade +1613 red_topaz +1614 cert_red_topaz +1615 dragonstone +1616 cert_dragonstone +1617 uncut_diamond +1618 cert_uncut_diamond +1619 uncut_ruby +1620 cert_uncut_ruby +1621 uncut_emerald +1622 cert_uncut_emerald +1623 uncut_sapphire +1624 cert_uncut_sapphire +1625 uncut_opal +1626 cert_uncut_opal +1627 uncut_jade +1628 cert_uncut_jade +1629 uncut_red_topaz +1630 cert_uncut_red_topaz +1631 uncut_dragonstone +1632 cert_uncut_dragonstone +1633 crushed_gemstone +1634 cert_crushed_gemstone +1635 gold_ring +1636 cert_gold_ring +1637 sapphire_ring +1638 cert_sapphire_ring +1639 emerald_ring +1640 cert_emerald_ring +1641 ruby_ring +1642 cert_ruby_ring +1643 diamond_ring +1644 cert_diamond_ring +1645 dragonstone_ring +1646 cert_dragonstone_ring +1647 black_ring +1648 cert_black_ring +1649 obj_1649 +1650 obj_1650 +1651 obj_1651 +1652 obj_1652 +1653 obj_1653 +1654 gold_necklace +1655 cert_gold_necklace +1656 sapphire_necklace +1657 cert_sapphire_necklace +1658 emerald_necklace +1659 cert_emerald_necklace +1660 ruby_necklace +1661 cert_ruby_necklace +1662 diamond_necklace +1663 cert_diamond_necklace +1664 dragonstone_necklace +1665 cert_dragonstone_necklace +1666 black_necklace +1667 cert_black_necklace +1668 obj_1668 +1669 obj_1669 +1670 obj_1670 +1671 obj_1671 +1672 obj_1672 +1673 unstrung_gold_amulet +1674 cert_unstrung_gold_amulet +1675 unstrung_sapphire_amulet +1676 cert_unstrung_sapphire_amulet +1677 unstrung_emerald_amulet +1678 cert_unstrung_emerald_amulet +1679 unstrung_ruby_amulet +1680 cert_unstrung_ruby_amulet +1681 unstrung_diamond_amulet +1682 cert_unstrung_diamond_amulet +1683 unstrung_dragonstone_amulet +1684 cert_unstrung_dragonstone_amulet +1685 black_amulet +1686 cert_black_amulet +1687 obj_1687 +1688 obj_1688 +1689 obj_1689 +1690 obj_1690 +1691 obj_1691 +1692 gold_amulet +1693 cert_gold_amulet +1694 sapphire_amulet +1695 cert_sapphire_amulet +1696 emerald_amulet +1697 cert_emerald_amulet +1698 ruby_amulet +1699 cert_ruby_amulet +1700 diamond_amulet +1701 cert_diamond_amulet +1702 dragonstone_amulet +1703 cert_dragonstone_amulet +1704 amulet_of_glory +1705 cert_amulet_of_glory +1706 amulet_of_glory_1 +1707 cert_amulet_of_glory_1 +1708 amulet_of_glory_2 +1709 cert_amulet_of_glory_2 +1710 amulet_of_glory_3 +1711 cert_amulet_of_glory_3 +1712 amulet_of_glory_4 +1713 cert_amulet_of_glory_4 +1714 unstrung_symbol +1715 cert_unstrung_symbol +1716 obj_1716 +1717 cert_obj_1716 +1718 blessedstar +1719 cert_blessedstar +1720 unstrung_emblem +1721 cert_unstrung_emblem +1722 unpowered_symbol +1723 cert_unpowered_symbol +1724 unholy_symbol +1725 amulet_of_strength +1726 cert_amulet_of_strength +1727 amulet_of_magic +1728 cert_amulet_of_magic +1729 amulet_of_defence +1730 cert_amulet_of_defence +1731 amulet_of_power +1732 cert_amulet_of_power +1733 needle +1734 thread +1735 shears +1736 cert_shears +1737 wool +1738 cert_wool +1739 cow_hide +1740 cert_cow_hide +1741 leather +1742 cert_leather +1743 hardleather +1744 cert_hardleather +1745 dragon_leather +1746 cert_dragon_leather +1747 dragonhide_black +1748 cert_dragonhide_black +1749 dragonhide_red +1750 cert_dragonhide_red +1751 dragonhide_blue +1752 cert_dragonhide_blue +1753 dragonhide_green +1754 cert_dragonhide_green +1755 chisel +1756 cert_chisel +1757 brown_apron +1758 cert_brown_apron +1759 ball_of_wool +1760 cert_ball_of_wool +1761 soft_clay +1762 cert_soft_clay +1763 red_dye +1764 cert_red_dye +1765 yellow_dye +1766 cert_yellow_dye +1767 blue_dye +1768 cert_blue_dye +1769 orange_dye +1770 cert_orange_dye +1771 green_dye +1772 cert_green_dye +1773 purple_dye +1774 cert_purple_dye +1775 molten_glass +1776 cert_molten_glass +1777 bow_string +1778 cert_bow_string +1779 flax +1780 cert_flax +1781 soda_ash +1782 cert_soda_ash +1783 bucket_sand +1784 cert_bucket_sand +1785 glassblowing_pipe +1786 cert_glassblowing_pipe +1787 unfired_pot +1788 cert_unfired_pot +1789 unfired_piedish +1790 cert_unfired_piedish +1791 unfired_bowl +1792 cert_unfired_bowl +1793 woad_leaf +1794 bronze_wire +1795 cert_bronze_wire +1796 murder_necklace +1797 murder_flournecklace +1798 murder_cup +1799 murder_flourcup +1800 murder_bottle +1801 murder_flourbottle +1802 murder_book +1803 murder_flourbook +1804 murder_needle +1805 murder_flourneedle +1806 murder_pot +1807 murder_flourpot +1808 murder_red_thread +1809 murder_green_thread +1810 murder_blue_thread +1811 flypaper +1812 pungent_pot +1813 criminals_dagger +1814 murder_flourdagger +1815 killers_print +1816 annas_print +1817 bobs_print +1818 carols_print +1819 davids_print +1820 elizabeths_print +1821 franks_print +1822 unknown_print +1823 water_skin4 +1824 cert_water_skin4 +1825 water_skin3 +1826 cert_water_skin3 +1827 water_skin2 +1828 cert_water_skin2 +1829 water_skin1 +1830 cert_water_skin1 +1831 water_skin0 +1832 cert_water_skin0 +1833 desert_shirt +1834 cert_desert_shirt +1835 desert_robe +1836 cert_desert_robe +1837 desert_boots +1838 cert_desert_boots +1839 obj_1839 +1840 obj_1840 +1841 obj_1841 +1842 obj_1842 +1843 obj_1843 +1844 obj_1844 +1845 obj_1845 +1846 obj_1846 +1847 obj_1847 +1848 shantay_disclaimer +1849 obj_1849 +1850 obj_1850 +1851 obj_1851 +1852 obj_1852 +1853 obj_1853 +1854 shantay_pass +1855 obj_1855 +1856 guide_book +1857 totem +1858 address_label +1859 raw_ugthanki_meat +1860 cert_raw_ugthanki_meat +1861 ugthanki_meat +1862 cert_ugthanki_meat +1863 uncooked_pitta_bread +1864 cert_uncooked_pitta_bread +1865 pitta_bread +1866 cert_pitta_bread +1867 burnt_pitta_bread +1868 cert_burnt_pitta_bread +1869 chopped_tomato +1870 cert_chopped_tomato +1871 chopped_onion +1872 cert_chopped_onion +1873 chopped_ugthanki +1874 cert_chopped_ugthanki +1875 chopped_onion_tomato +1876 cert_chopped_onion_tomato +1877 chopped_ugthanki_onion +1878 cert_chopped_ugthanki_onion +1879 chopped_ugthanki_tomato +1880 cert_chopped_ugthanki_tomato +1881 kebab_mix +1882 cert_kebab_mix +1883 dodgy_ugthanki_kebab +1884 cert_dodgy_ugthanki_kebab +1885 ugthanki_kebab +1886 cert_ugthanki_kebab +1887 cake_tin +1888 cert_cake_tin +1889 uncooked_cake +1890 cert_uncooked_cake +1891 cake +1892 cert_cake +1893 obj_1893 +1894 cert_obj_1893 +1895 obj_1895 +1896 cert_obj_1895 +1897 chocolate_cake +1898 cert_chocolate_cake +1899 obj_1899 +1900 cert_obj_1899 +1901 chocolate_slice +1902 cert_chocolate_slice +1903 burnt_cake +1904 cert_burnt_cake +1905 asgarnian_ale +1906 cert_asgarnian_ale +1907 wizards_mind_bomb +1908 cert_wizards_mind_bomb +1909 greenmans_ale +1910 cert_greenmans_ale +1911 dragon_bitter +1912 cert_dragon_bitter +1913 dwarven_stout +1914 cert_dwarven_stout +1915 grog +1916 cert_grog +1917 beer +1918 cert_beer +1919 beer_glass +1920 cert_beer_glass +1921 bowl_water +1922 cert_bowl_water +1923 bowl_empty +1924 cert_bowl_empty +1925 bucket_empty +1926 cert_bucket_empty +1927 bucket_milk +1928 cert_bucket_milk +1929 bucket_water +1930 cert_bucket_water +1931 pot_empty +1932 cert_pot_empty +1933 pot_of_flour +1934 cert_pot_of_flour +1935 jug_empty +1936 cert_jug_empty +1937 jug_of_water +1938 cert_jug_of_water +1939 swamp_tar +1940 raw_swamp_paste +1941 swamp_paste +1942 potato +1943 cert_potato +1944 egg +1945 cert_egg +1946 obj_1946 +1947 grain +1948 cert_grain +1949 chefshat +1950 cert_chefshat +1951 redberry +1952 cert_redberry +1953 pastry_dough +1954 cert_pastry_dough +1955 cooking_apple +1956 cert_cooking_apple +1957 onion +1958 cert_onion +1959 pumpkin +1960 cert_pumpkin +1961 easter_egg +1962 cert_easter_egg +1963 banana +1964 cert_banana +1965 cabbage +1966 cert_cabbage +1967 cabbage_draynor +1968 cert_cabbage_draynor +1969 spinach_roll +1970 cert_spinach_roll +1971 kebab +1972 cert_kebab +1973 chocolate_bar +1974 cert_chocolate_bar +1975 chocolate_dust +1976 cert_chocolate_dust +1977 chocolaty_milk +1978 cup_of_tea +1979 cert_cup_of_tea +1980 cup_empty +1981 cert_cup_empty +1982 tomato +1983 cert_tomato +1984 rotten_apples +1985 cheese +1986 cert_cheese +1987 grapes +1988 cert_grapes +1989 half_full_wine_jug +1990 cert_half_full_wine_jug +1991 jug_of_bad_wine +1992 cert_jug_of_bad_wine +1993 jug_wine +1994 cert_jug_wine +1995 unfermented_wine +1996 cert_unfermented_wine +1997 incomplete_stew_potato +1998 cert_incomplete_stew_potato +1999 incomplete_stew_meat +2000 cert_incomplete_stew_meat +2001 uncooked_stew +2002 cert_uncooked_stew +2003 stew +2004 cert_stew +2005 burnt_stew +2006 cert_burnt_stew +2007 spice +2008 cert_spice +2009 uncooked_curry +2010 cert_uncooked_curry +2011 curry +2012 cert_curry +2013 burnt_curry +2014 cert_burnt_curry +2015 vodka +2016 cert_vodka +2017 whisky +2018 cert_whisky +2019 gin +2020 cert_gin +2021 brandy +2022 cert_brandy +2023 cocktail_guide +2024 cert_cocktail_guide +2025 cocktail_shaker +2026 cocktail_glass +2027 cert_cocktail_glass +2028 premade_blurberry_special +2029 cert_premade_blurberry_special +2030 premade_chocolate_saturday +2031 cert_premade_chocolate_saturday +2032 premade_drunk_dragon +2033 cert_premade_drunk_dragon +2034 premade_fruit_blast +2035 cert_premade_fruit_blast +2036 premade_pineapple_punch +2037 cert_premade_pineapple_punch +2038 premade_short_green_guy +2039 cert_premade_short_green_guy +2040 premade_wizard_blizzard +2041 cert_premade_wizard_blizzard +2042 unfinished_pineapple_punch1 +2043 cert_unfinished_pineapple_punch1 +2044 unfinished_pineapple_punch2 +2045 cert_unfinished_pineapple_punch2 +2046 unfinished_pineapple_punch3 +2047 cert_unfinished_pineapple_punch3 +2048 pineapple_punch +2049 cert_pineapple_punch +2050 unfinished_wizard_blizzard1 +2051 cert_unfinished_wizard_blizzard1 +2052 unfinished_wizard_blizzard2 +2053 cert_unfinished_wizard_blizzard2 +2054 wizard_blizzard +2055 cert_wizard_blizzard +2056 unfinished_blurberry_special1 +2057 cert_unfinished_blurberry_special1 +2058 unfinished_blurberry_special2 +2059 cert_unfinished_blurberry_special2 +2060 unfinished_blurberry_special3 +2061 cert_unfinished_blurberry_special3 +2062 unfinished_blurberry_special4 +2063 cert_unfinished_blurberry_special4 +2064 blurberry_special +2065 cert_blurberry_special +2066 unfinished_chocolate_saturday1 +2067 cert_unfinished_chocolate_saturday1 +2068 unfinished_chocolate_saturday2 +2069 cert_unfinished_chocolate_saturday2 +2070 unfinished_chocolate_saturday3 +2071 cert_unfinished_chocolate_saturday3 +2072 unfinished_chocolate_saturday4 +2073 cert_unfinished_chocolate_saturday4 +2074 chocolate_saturday +2075 cert_chocolate_saturday +2076 unfinished_short_green_guy1 +2077 cert_unfinished_short_green_guy1 +2078 unfinished_short_green_guy2 +2079 cert_unfinished_short_green_guy2 +2080 short_green_guy +2081 cert_short_green_guy +2082 unfinished_fruit_blast1 +2083 cert_unfinished_fruit_blast1 +2084 fruit_blast +2085 cert_fruit_blast +2086 unfinished_drunk_dragon1 +2087 cert_unfinished_drunk_dragon1 +2088 unfinished_drunk_dragon2 +2089 cert_unfinished_drunk_dragon2 +2090 unfinished_drunk_dragon3 +2091 cert_unfinished_drunk_dragon3 +2092 drunk_dragon +2093 cert_drunk_dragon +2094 odd_cocktail1 +2095 cert_odd_cocktail1 +2096 odd_cocktail2 +2097 cert_odd_cocktail2 +2098 odd_cocktail3 +2099 cert_odd_cocktail3 +2100 odd_cocktail4 +2101 cert_odd_cocktail4 +2102 lemon +2103 cert_lemon +2104 lemon_chunks +2105 cert_lemon_chunks +2106 lemon_slices +2107 cert_lemon_slices +2108 orange +2109 cert_orange +2110 orange_chunks +2111 cert_orange_chunks +2112 orange_slices +2113 cert_orange_slices +2114 pineapple +2115 cert_pineapple +2116 pineapple_chunks +2117 cert_pineapple_chunks +2118 pineapple_ring +2119 cert_pineapple_ring +2120 lime +2121 cert_lime +2122 lime_chunks +2123 cert_lime_chunks +2124 lime_slices +2125 cert_lime_slices +2126 dwellberry +2127 cert_dwellberry +2128 equa_leaves +2129 cert_equa_leaves +2130 pot_of_cream +2131 cert_pot_of_cream +2132 raw_beef +2133 cert_raw_beef +2134 raw_rat_meat +2135 cert_raw_rat_meat +2136 raw_bear_meat +2137 cert_raw_bear_meat +2138 raw_chicken +2139 cert_raw_chicken +2140 cooked_chicken +2141 cert_cooked_chicken +2142 cooked_meat +2143 cert_cooked_meat +2144 burnt_chicken +2145 cert_burnt_chicken +2146 burnt_meat +2147 cert_burnt_meat +2148 raw_lava_eel +2149 lava_eel +2150 swamp_toad +2151 cert_swamp_toad +2152 toad_legs +2153 cert_toad_legs +2154 equa_toad_legs +2155 cert_equa_toad_legs +2156 spicy_toad_legs +2157 cert_spicy_toad_legs +2158 seasoned_toad_legs +2159 cert_seasoned_toad_legs +2160 spicy_worm +2161 cert_spicy_worm +2162 king_worm +2163 cert_king_worm +2164 batta_tin +2165 crunchy_tray +2166 gnomebowl_mould +2167 gianne_cook_book +2168 cert_gianne_cook_book +2169 gnome_spice +2170 cert_gnome_spice +2171 gianne_dough +2172 cert_gianne_dough +2173 odd_gnomebowl +2174 cert_odd_gnomebowl +2175 burnt_gnomebowl +2176 cert_burnt_gnomebowl +2177 half_baked_gnomebowl +2178 raw_gnomebowl +2179 unfinished_chocolate_bomb1 +2180 cert_unfinished_chocolate_bomb1 +2181 unfinished_chocolate_bomb2 +2182 cert_unfinished_chocolate_bomb2 +2183 unfinished_chocolate_bomb3 +2184 cert_unfinished_chocolate_bomb3 +2185 premade_chocolate_bomb +2186 cert_premade_chocolate_bomb +2187 premade_tangled_toads_legs +2188 cert_premade_tangled_toads_legs +2189 unfinished_worm_hole1 +2190 cert_unfinished_worm_hole1 +2191 premade_worm_hole +2192 cert_premade_worm_hole +2193 unfinished_veg_ball1 +2194 cert_unfinished_veg_ball1 +2195 premade_veg_ball +2196 cert_premade_veg_ball +2197 odd_crunchies +2198 cert_odd_crunchies +2199 burnt_crunchies +2200 cert_burnt_crunchies +2201 half_baked_crunchies +2202 raw_crunchies +2203 unfinished_worm_crunchies1 +2204 cert_unfinished_worm_crunchies1 +2205 worm_crunchies +2206 cert_worm_crunchies +2207 unfinished_choc_chip_crunchies1 +2208 cert_unfinished_choc_chip_crunchies1 +2209 choc_chip_crunchies +2210 cert_choc_chip_crunchies +2211 unfinished_spicy_crunchies1 +2212 cert_unfinished_spicy_crunchies1 +2213 spicy_crunchies +2214 cert_spicy_crunchies +2215 unfinished_toad_crunchies1 +2216 cert_unfinished_toad_crunchies1 +2217 toad_crunchies +2218 cert_toad_crunchies +2219 premade_worm_batta +2220 cert_premade_worm_batta +2221 premade_toad_batta +2222 cert_premade_toad_batta +2223 premade_cheese_tom_batta +2224 cert_premade_cheese_tom_batta +2225 premade_fruit_batta +2226 cert_premade_fruit_batta +2227 premade_vegetable_batta +2228 cert_premade_vegetable_batta +2229 chocolate_bomb +2230 cert_chocolate_bomb +2231 tangled_toads_legs +2232 cert_tangled_toads_legs +2233 worm_hole +2234 cert_worm_hole +2235 veg_ball +2236 cert_veg_ball +2237 premade_worm_crunchies +2238 cert_premade_worm_crunchies +2239 premade_choc_chip_crunchies +2240 cert_premade_choc_chip_crunchies +2241 premade_spicy_crunchies +2242 cert_premade_spicy_crunchies +2243 premade_toad_crunchies +2244 cert_premade_toad_crunchies +2245 odd_batta +2246 cert_odd_batta +2247 burnt_batta +2248 cert_burnt_batta +2249 half_baked_batta +2250 raw_batta +2251 unfinished_worm_batta1 +2252 cert_unfinished_worm_batta1 +2253 worm_batta +2254 cert_worm_batta +2255 toad_batta +2256 cert_toad_batta +2257 unfinished_cheese_tom_batta1 +2258 cert_unfinished_cheese_tom_batta1 +2259 cheese_tom_batta +2260 cert_cheese_tom_batta +2261 unfinished_fruit_batta1 +2262 cert_unfinished_fruit_batta1 +2263 unfinished_fruit_batta2 +2264 cert_unfinished_fruit_batta2 +2265 unfinished_fruit_batta3 +2266 cert_unfinished_fruit_batta3 +2267 unfinished_fruit_batta4 +2268 cert_unfinished_fruit_batta4 +2269 unfinished_fruit_batta5 +2270 cert_unfinished_fruit_batta5 +2271 unfinished_fruit_batta6 +2272 cert_unfinished_fruit_batta6 +2273 unfinished_fruit_batta7 +2274 cert_unfinished_fruit_batta7 +2275 unfinished_fruit_batta8 +2276 cert_unfinished_fruit_batta8 +2277 fruit_batta +2278 cert_fruit_batta +2279 unfinished_vegetable_batta1 +2280 cert_unfinished_vegetable_batta1 +2281 vegetable_batta +2282 cert_vegetable_batta +2283 pizza_base +2284 cert_pizza_base +2285 incomplete_pizza +2286 cert_incomplete_pizza +2287 uncooked_pizza +2288 cert_uncooked_pizza +2289 plain_pizza +2290 cert_plain_pizza +2291 obj_2291 +2292 cert_obj_2291 +2293 meat_pizza +2294 cert_meat_pizza +2295 obj_2295 +2296 cert_obj_2295 +2297 anchovy_pizza +2298 cert_anchovy_pizza +2299 obj_2299 +2300 cert_obj_2299 +2301 pineapple_pizza +2302 cert_pineapple_pizza +2303 obj_2303 +2304 cert_obj_2303 +2305 burnt_pizza +2306 cert_burnt_pizza +2307 bread_dough +2308 cert_bread_dough +2309 bread +2310 cert_bread +2311 burnt_bread +2312 cert_burnt_bread +2313 piedish +2314 cert_piedish +2315 pie_shell +2316 cert_pie_shell +2317 uncooked_apple_pie +2318 cert_uncooked_apple_pie +2319 uncooked_meat_pie +2320 cert_uncooked_meat_pie +2321 uncooked_redberry_pie +2322 cert_uncooked_redberry_pie +2323 apple_pie +2324 cert_apple_pie +2325 redberry_pie +2326 cert_redberry_pie +2327 meat_pie +2328 cert_meat_pie +2329 burnt_pie +2330 cert_burnt_pie +2331 obj_2331 +2332 cert_obj_2331 +2333 obj_2333 +2334 cert_obj_2333 +2335 obj_2335 +2336 cert_obj_2335 +2337 raw_oomlie +2338 cert_raw_oomlie +2339 palm_leaf +2340 cert_palm_leaf +2341 wrapped_oomlie +2342 cert_wrapped_oomlie +2343 cooked_wrapped_oomlie +2344 cert_cooked_wrapped_oomlie +2345 burnt_wrapped_oomlie +2346 cert_burnt_wrapped_oomlie +2347 hammer +2348 cert_hammer +2349 bronze_bar +2350 cert_bronze_bar +2351 iron_bar +2352 cert_iron_bar +2353 steel_bar +2354 cert_steel_bar +2355 silver_bar +2356 cert_silver_bar +2357 gold_bar +2358 cert_gold_bar +2359 mithril_bar +2360 cert_mithril_bar +2361 adamantite_bar +2362 cert_adamantite_bar +2363 runite_bar +2364 cert_runite_bar +2365 obj_2365 +2366 shield_left_half +2367 cert_shield_left_half +2368 shield_right_half +2369 cert_shield_right_half +2370 steel_studs +2371 cert_steel_studs +2372 ogre_relic +2373 relic_part_1 +2374 relic_part_2 +2375 relic_part_3 +2376 skavid_map +2377 ogre_tooth +2378 obj_2378 +2379 rock_cake +2380 obj_2380 +2381 obj_2381 +2382 obj_2382 +2383 obj_2383 +2384 obj_2384 +2385 obj_2385 +2386 obj_2386 +2387 obj_2387 +2388 tattered_eye_patch +2389 obj_2389 +2390 obj_2390 +2391 ground_bat_bones +2392 cert_ground_bat_bones +2393 obj_2393 +2394 obj_2394 +2395 magic_ogre_potion +2396 spell_scroll +2397 shaman_robe +2398 nightshade +2399 demon_traiborn_key +2400 demon_rovin_key +2401 demon_prysin_key +2402 silverlight +2403 scroll_of_hazeel +2404 hazeelcult_key +2405 carnillean_armour +2406 mark_of_hazeel +2407 boy_ball +2408 ball_diary +2409 ball_doorkey +2410 magnet +2411 ball_shedkey +2412 saradomincape +2413 guthixcape +2414 zamorakcape +2415 saradominstaff +2416 guthixstaff +2417 zamorakstaff +2418 bronze_key +2419 wig_blonde +2420 obj_2420 +2421 wig_grey +2422 obj_2422 +2423 key_print +2424 paste +2425 obj_2425 +2426 burnt_oomlie +2427 cert_burnt_oomlie +2428 4dose1attack +2429 cert_4dose1attack +2430 4dose1restore +2431 cert_4dose1restore +2432 4dose1defense +2433 cert_4dose1defense +2434 4doseprayerrestore +2435 cert_4doseprayerrestore +2436 4dose2attack +2437 cert_4dose2attack +2438 4dosefisherspotion +2439 cert_4dosefisherspotion +2440 4dose2strength +2441 cert_4dose2strength +2442 4dose2defense +2443 cert_4dose2defense +2444 4doserangerspotion +2445 cert_4doserangerspotion +2446 4doseantipoison +2447 cert_4doseantipoison +2448 4dose2antipoison +2449 cert_4dose2antipoison +2450 4dosepotionofzamorak +2451 cert_4dosepotionofzamorak +2452 4dose1antidragon +2453 cert_4dose1antidragon +2454 3dose1antidragon +2455 cert_3dose1antidragon +2456 2dose1antidragon +2457 cert_2dose1antidragon +2458 1dose1antidragon +2459 cert_1dose1antidragon +2460 assorted_flowers +2461 cert_assorted_flowers +2462 red_flowers +2463 cert_red_flowers +2464 blue_flowers +2465 cert_blue_flowers +2466 yellow_flowers +2467 cert_yellow_flowers +2468 purple_flowers +2469 cert_purple_flowers +2470 orange_flowers +2471 cert_orange_flowers +2472 mixed_flowers +2473 cert_mixed_flowers +2474 white_flowers +2475 cert_white_flowers +2476 black_flowers +2477 cert_black_flowers +2478 cert_fish_food +2479 cert_poison +2480 obj_2480 +2481 lantadyme +2482 cert_lantadyme +2483 unf_lantadyme_potion +2484 cert_unf_lantadyme_potion +2485 unidentified_lantadyme +2486 cert_unidentified_lantadyme +2487 blue_dragonhide_vambraces +2488 cert_blue_dragonhide_vambraces +2489 red_dragonhide_vambraces +2490 cert_red_dragonhide_vambraces +2491 black_dragonhide_vambraces +2492 cert_black_dragonhide_vambraces +2493 blue_dragonhide_chaps +2494 cert_blue_dragonhide_chaps +2495 red_dragonhide_chaps +2496 cert_red_dragonhide_chaps +2497 black_dragonhide_chaps +2498 cert_black_dragonhide_chaps +2499 blue_dragonhide_body +2500 cert_blue_dragonhide_body +2501 red_dragonhide_body +2502 cert_red_dragonhide_body +2503 black_dragonhide_body +2504 cert_black_dragonhide_body +2505 dragon_leather_blue +2506 cert_dragon_leather_blue +2507 dragon_leather_red +2508 cert_dragon_leather_red +2509 dragon_leather_black +2510 cert_dragon_leather_black +2511 tutorial_logs +2512 obj_2512 +2513 obj_2513 +2514 tutorial_raw_shrimps +2515 cert_tutorial_raw_shrimps +2516 tutorial_pot_of_flour +2517 cert_tutorial_pot_of_flour +2518 rotten_tomato +2519 cert_rotten_tomato +2520 toy_horsey_brown +2521 cert_toy_horsey_brown +2522 toy_horsey_white +2523 cert_toy_horsey_white +2524 toy_horsey_black +2525 cert_toy_horsey_black +2526 toy_horsey_grey +2527 cert_toy_horsey_grey +2528 lamp +2529 obj_2529 +2530 obj_2530 +2531 cert_obj_2530 +2532 iron_fire_arrows_unlit +2533 iron_fire_arrows +2534 steel_fire_arrows_unlit +2535 steel_fire_arrows +2536 mithril_fire_arrows_unlit +2537 mithril_fire_arrows +2538 adamant_fire_arrows_unlit +2539 adamant_fire_arrows +2540 rune_fire_arrows_unlit +2541 rune_fire_arrows +2542 unlitarrow_2 +2543 unlitarrow_3 +2544 unlitarrow_4 +2545 unlitarrow_5 +2546 litarrow_2 +2547 litarrow_3 +2548 litarrow_4 +2549 litarrow_5 +2550 ring_of_recoil +2551 cert_ring_of_recoil +2552 ring_of_duel_8 +2553 cert_ring_of_duel_8 +2554 ring_of_duel_7 +2555 cert_ring_of_duel_7 +2556 ring_of_duel_6 +2557 cert_ring_of_duel_6 +2558 ring_of_duel_5 +2559 cert_ring_of_duel_5 +2560 ring_of_duel_4 +2561 cert_ring_of_duel_4 +2562 ring_of_duel_3 +2563 cert_ring_of_duel_3 +2564 ring_of_duel_2 +2565 cert_ring_of_duel_2 +2566 ring_of_duel_1 +2567 cert_ring_of_duel_1 +2568 ring_of_forging +2569 cert_ring_of_forging +2570 ring_of_life +2571 cert_ring_of_life +2572 ring_of_wealth +2573 cert_ring_of_wealth +2574 trail_sextant +2575 trail_watch +2576 trail_chart +2577 trail_ranger_boots +2578 cert_trail_ranger_boots +2579 wizards_boots +2580 cert_wizards_boots +2581 trail_robin_hood_hat +2582 cert_trail_robin_hood_hat +2583 black_platebody_trim +2584 cert_black_platebody_trim +2585 black_platelegs_trim +2586 cert_black_platelegs_trim +2587 black_full_helm_trim +2588 cert_black_full_helm_trim +2589 black_kiteshield_trim +2590 cert_black_kiteshield_trim +2591 black_platebody_gold +2592 cert_black_platebody_gold +2593 black_platelegs_gold +2594 cert_black_platelegs_gold +2595 black_full_helm_gold +2596 cert_black_full_helm_gold +2597 black_kiteshield_gold +2598 cert_black_kiteshield_gold +2599 adamant_platebody_trim +2600 cert_adamant_platebody_trim +2601 adamant_platelegs_trim +2602 cert_adamant_platelegs_trim +2603 adamant_kiteshield_trim +2604 cert_adamant_kiteshield_trim +2605 adamant_full_helm_trim +2606 cert_adamant_full_helm_trim +2607 adamant_platebody_gold +2608 cert_adamant_platebody_gold +2609 adamant_platelegs_gold +2610 cert_adamant_platelegs_gold +2611 adamant_kiteshield_gold +2612 cert_adamant_kiteshield_gold +2613 adamant_full_helm_gold +2614 cert_adamant_full_helm_gold +2615 rune_platebody_gold +2616 cert_rune_platebody_gold +2617 rune_platelegs_gold +2618 cert_rune_platelegs_gold +2619 rune_full_helm_gold +2620 cert_rune_full_helm_gold +2621 rune_kiteshield_gold +2622 cert_rune_kiteshield_gold +2623 rune_platebody_trim +2624 cert_rune_platebody_trim +2625 rune_platelegs_trim +2626 cert_rune_platelegs_trim +2627 rune_full_helm_trim +2628 cert_rune_full_helm_trim +2629 rune_kiteshield_trim +2630 cert_rune_kiteshield_trim +2631 trail_highwayman_mask +2632 cert_trail_highwayman_mask +2633 trail_berret_blue +2634 cert_trail_berret_blue +2635 trail_berret_black +2636 cert_trail_berret_black +2637 trail_berret_white +2638 cert_trail_berret_white +2639 trail_cavalier_tan +2640 cert_trail_cavalier_tan +2641 trail_cavalier_brown +2642 cert_trail_cavalier_brown +2643 trail_cavalier_black +2644 cert_trail_cavalier_black +2645 trail_headband_red +2646 cert_trail_headband_red +2647 trail_headband_black +2648 cert_trail_headband_black +2649 trail_headband_brown +2650 cert_trail_headband_brown +2651 trail_pirates_hat +2652 cert_trail_pirates_hat +2653 rune_platebody_zamorak +2654 cert_rune_platebody_zamorak +2655 rune_platelegs_zamorak +2656 cert_rune_platelegs_zamorak +2657 rune_full_helm_zamorak +2658 cert_rune_full_helm_zamorak +2659 rune_kiteshield_zamorak +2660 cert_rune_kiteshield_zamorak +2661 rune_platebody_saradomin +2662 cert_rune_platebody_saradomin +2663 rune_platelegs_saradomin +2664 cert_rune_platelegs_saradomin +2665 rune_full_helm_saradomin +2666 cert_rune_full_helm_saradomin +2667 rune_kiteshield_saradomin +2668 cert_rune_kiteshield_saradomin +2669 rune_platebody_guthix +2670 cert_rune_platebody_guthix +2671 rune_platelegs_guthix +2672 cert_rune_platelegs_guthix +2673 rune_full_helm_guthix +2674 cert_rune_full_helm_guthix +2675 rune_kiteshield_guthix +2676 cert_rune_kiteshield_guthix +2677 trail_clue_easy_simple_exp001 +2678 trail_clue_easy_simple_exp002 +2679 trail_clue_easy_simple_exp003 +2680 trail_clue_easy_simple_exp004 +2681 trail_clue_easy_simple_exp005 +2682 trail_clue_easy_simple_exp006 +2683 trail_clue_easy_simple_exp007 +2684 trail_clue_easy_simple_exp008 +2685 trail_clue_easy_simple_exp009 +2686 trail_clue_easy_simple_exp010 +2687 trail_clue_easy_simple_exp011 +2688 trail_clue_easy_simple_exp012 +2689 trail_clue_easy_simple_exp013 +2690 trail_clue_easy_simple_exp014 +2691 trail_clue_easy_simple_exp015 +2692 trail_clue_easy_simple_exp016 +2693 trail_clue_easy_simple_exp017 +2694 trail_clue_easy_simple_exp018 +2695 trail_clue_easy_simple_exp019 +2696 trail_clue_easy_simple_exp020 +2697 trail_clue_easy_simple_exp021 +2698 trail_clue_easy_simple_exp022 +2699 trail_clue_easy_simple_exp023 +2700 trail_clue_easy_simple_exp024 +2701 trail_clue_easy_simple_exp025 +2702 trail_clue_easy_simple_exp026 +2703 trail_clue_easy_riddle_exp001 +2704 trail_clue_easy_riddle_exp002 +2705 trail_clue_easy_riddle_exp003 +2706 trail_clue_easy_riddle_exp004 +2707 trail_clue_easy_riddle_exp005 +2708 trail_clue_easy_riddle_exp006 +2709 trail_clue_easy_riddle_exp007 +2710 trail_clue_easy_riddle_exp008 +2711 trail_clue_easy_riddle_exp009 +2712 trail_clue_easy_riddle_exp010 +2713 trail_clue_easy_map001 +2714 trail_casket_easy_map001 +2715 obj_2715 +2716 trail_clue_easy_map002 +2717 trail_casket_easy_map002 +2718 obj_2718 +2719 trail_clue_easy_map003 +2720 trail_casket_easy_map003 +2721 obj_2721 +2722 trail_clue_hard_map001 +2723 trail_clue_hard_sextant_exp001 +2724 trail_casket_hard_sextant_exp001 +2725 trail_clue_hard_sextant_exp002 +2726 trail_casket_hard_sextant_exp002 +2727 trail_clue_hard_sextant_exp003 +2728 trail_casket_hard_sextant_exp003 +2729 trail_clue_hard_sextant_exp004 +2730 trail_casket_hard_sextant_exp004 +2731 trail_clue_hard_sextant_exp005 +2732 trail_casket_hard_sextant_exp005 +2733 trail_clue_hard_sextant_exp006 +2734 trail_casket_hard_sextant_exp006 +2735 trail_clue_hard_sextant_exp007 +2736 trail_casket_hard_sextant_exp007 +2737 trail_clue_hard_sextant_exp008 +2738 trail_casket_hard_sextant_exp008 +2739 trail_clue_hard_sextant_exp009 +2740 trail_casket_hard_sextant_exp009 +2741 trail_clue_hard_sextant_exp010 +2742 trail_casket_hard_sextant_exp010 +2743 trail_clue_hard_sextant_exp011 +2744 trail_casket_hard_sextant_exp011 +2745 trail_clue_hard_sextant_exp012 +2746 trail_casket_hard_sextant_exp012 +2747 trail_clue_hard_sextant_exp013 +2748 trail_casket_hard_sextant_exp013 +2749 obj_2749 +2750 obj_2750 +2751 obj_2751 +2752 obj_2752 +2753 obj_2753 +2754 obj_2754 +2755 obj_2755 +2756 obj_2756 +2757 obj_2757 +2758 obj_2758 +2759 obj_2759 +2760 obj_2760 +2761 obj_2761 +2762 obj_2762 +2763 obj_2763 +2764 obj_2764 +2765 obj_2765 +2766 obj_2766 +2767 obj_2767 +2768 obj_2768 +2769 obj_2769 +2770 obj_2770 +2771 obj_2771 +2772 obj_2772 +2773 trail_clue_hard_riddle_exp001 +2774 trail_clue_hard_riddle_exp002 +2775 trail_casket_hard_riddle_exp002 +2776 trail_clue_hard_riddle_exp003 +2777 trail_casket_hard_riddle_exp003 +2778 trail_clue_hard_riddle_exp004 +2779 trail_casket_hard_riddle_exp004 +2780 trail_clue_hard_riddle_exp005 +2781 trail_casket_hard_riddle_exp005 +2782 trail_clue_hard_riddle_exp006 +2783 trail_clue_hard_riddle_exp007 +2784 trail_casket_hard_riddle_exp007 +2785 trail_clue_hard_riddle_exp008 +2786 trail_clue_hard_riddle_exp009 +2787 trail_casket_hard_riddle_exp009 +2788 trail_clue_hard_riddle_exp010 +2789 trail_casket_hard_riddle_exp010 +2790 trail_clue_hard_riddle_exp011 +2791 trail_casket_hard_riddle_exp011 +2792 trail_clue_hard_riddle_exp012 +2793 trail_clue_hard_riddle_exp013 +2794 trail_clue_hard_riddle_exp014 +2795 trail_clue_hard_puzzle_exp014 +2796 trail_clue_hard_riddle_exp015 +2797 trail_clue_hard_riddle_exp016 +2798 trail_clue_hard_puzzle_exp016 +2799 trail_clue_hard_riddle_exp017 +2800 trail_clue_hard_puzzle_exp017 +2801 trail_clue_medium_sextant_exp001 +2802 trail_casket_medium_sextant_exp001 +2803 trail_clue_medium_sextant_exp002 +2804 trail_casket_medium_sextant_exp002 +2805 trail_clue_medium_sextant_exp003 +2806 trail_casket_medium_sextant_exp003 +2807 trail_clue_medium_sextant_exp004 +2808 trail_casket_medium_sextant_exp004 +2809 trail_clue_medium_sextant_exp005 +2810 trail_casket_medium_sextant_exp005 +2811 trail_clue_medium_sextant_exp006 +2812 trail_casket_medium_sextant_exp006 +2813 trail_clue_medium_sextant_exp007 +2814 trail_casket_medium_sextant_exp007 +2815 trail_clue_medium_sextant_exp008 +2816 trail_casket_medium_sextant_exp008 +2817 trail_clue_medium_sextant_exp009 +2818 trail_casket_medium_sextant_exp009 +2819 trail_clue_medium_sextant_exp010 +2820 trail_casket_medium_sextant_exp010 +2821 trail_clue_medium_sextant_exp011 +2822 trail_casket_medium_sextant_exp011 +2823 trail_clue_medium_sextant_exp012 +2824 trail_casket_medium_sextant_exp012 +2825 trail_clue_medium_sextant_exp013 +2826 trail_casket_medium_sextant_exp013 +2827 trail_clue_medium_map001 +2828 trail_casket_medium_map001 +2829 trail_clue_medium_map002 +2830 trail_casket_medium_map002 +2831 trail_clue_medium_riddle_exp001 +2832 trail_clue_medium_key_exp001 +2833 trail_clue_medium_riddle_exp002 +2834 trail_clue_medium_key_exp002 +2835 trail_clue_medium_riddle_exp003 +2836 trail_clue_medium_key_exp003 +2837 trail_clue_medium_riddle_exp004 +2838 trail_clue_medium_key_exp004 +2839 trail_clue_medium_riddle_exp005 +2840 trail_clue_medium_key_exp005 +2841 trail_clue_medium_anagram_exp001 +2842 trail_clue_medium_challenge_exp001 +2843 trail_clue_medium_anagram_exp002 +2844 trail_clue_medium_challenge_exp002 +2845 trail_clue_medium_anagram_exp003 +2846 trail_clue_medium_challenge_exp003 +2847 trail_clue_medium_anagram_exp004 +2848 trail_clue_medium_anagram_exp005 +2849 trail_clue_medium_anagram_exp006 +2850 trail_clue_medium_challenge_exp004 +2851 trail_clue_medium_anagram_exp007 +2852 trail_clue_medium_challenge_exp005 +2853 trail_clue_medium_anagram_exp008 +2854 trail_clue_medium_challenge_exp006 +2855 trail_clue_medium_anagram_exp009 +2856 trail_clue_medium_anagram_exp010 +2857 trail_clue_medium_anagram_exp011 +2858 trail_clue_medium_anagram_exp012 +2859 wolf_bones +2860 cert_wolf_bones +2861 wolfbone_arrowheads +2862 achey_logs +2863 cert_achey_logs +2864 obj_2864 +2865 obj_2865 +2866 ogre_arrow +2867 ogre_arrow_5 +2868 ogre_arrow_4 +2869 ogre_arrow_3 +2870 ogre_arrow_2 +2871 obj_2871 +2872 obj_2872 +2873 obj_2873 +2874 obj_2874 +2875 obj_2875 +2876 obj_2876 +2877 cert_obj_2876 +2878 obj_2878 +2879 cert_obj_2878 +2880 obj_2880 +2881 cert_obj_2880 +2882 obj_2882 +2883 ogre_bow +2884 chompy_bird_obj +2885 cert_chompy_bird_obj diff --git a/src/public/data/symbols/overlayinterface.sym b/src/public/data/symbols/overlayinterface.sym new file mode 100644 index 00000000..75d9ee7e --- /dev/null +++ b/src/public/data/symbols/overlayinterface.sym @@ -0,0 +1,30 @@ +147 controls +328 combat_staff_2 +425 combat_blunt +638 questlist +776 combat_scythe +904 options +962 music +1151 magic +1644 wornitems +1698 combat_axe +1724 combat_staff +1749 combat_crossbow +1764 combat_bow +1829 staff_spells +2276 combat_stabsword +2423 combat_hacksword +2449 logout +3213 inventory +3796 combat_spiked +3917 stats +4445 options_ld +4446 combat_thrown +4679 combat_spear +4705 combat_heavysword +5065 friends +5570 combat_pickaxe +5608 prayer +5715 ignore +5855 combat_unarmed +6299 music_ld diff --git a/src/public/data/symbols/param.sym b/src/public/data/symbols/param.sym new file mode 100644 index 00000000..859dce67 --- /dev/null +++ b/src/public/data/symbols/param.sym @@ -0,0 +1,196 @@ +0 lose_cape_message string +1 next_loc_stage loc +2 game_message string +3 open_sound synth +4 close_sound synth +5 chest_other loc +6 cupboard_other loc +7 drawer_other loc +8 board_message string +9 millbase_coord coord +10 hopper_coord coord +11 changesto namedobj +12 is_water_source int +13 whirlpool npc +14 is_whirlpool int +15 broken namedobj +16 to_be_fixed_by_bob int +17 to_be_fixed_by_nurmof int +18 fixed namedobj +19 axe_head namedobj +20 pickaxe_head namedobj +21 ent npc +22 ent_tree_loc loc +23 follow_player_on_logout int +24 gnome_fallen npc +25 gnome_tackled npc +26 gnome_hasball npc +27 gnome_original npc +28 trail_coord coord +29 trail_sextant boolean +30 trail_desc string +31 trail_casket namedobj +32 trail_guardian npc +33 puzzle_piece_id int +34 trail_challenge_answer int +35 ready_baseanim seq +36 turnonspot_baseanim seq +37 walk_f_baseanim seq +38 walk_b_baseanim seq +39 walk_l_baseanim seq +40 walk_r_baseanim seq +41 running_baseanim seq +42 next_obj_stage namedobj +43 lever_index int +44 hazeelcult_valve_idx int +45 game_message2 string +46 murder_id_value int +47 owned_shop inv +48 shop_sell_multiplier int +49 shop_buy_multiplier int +50 shop_delta int +51 shop_title string +52 start_coord coord +53 end_coord coord +54 fail_coord coord +55 agil_level_req int +56 obstacle_low_fail int +57 obstacle_high_fail int +58 agil_xp int +59 dir int +60 stabattack int +61 slashattack int +62 crushattack int +63 magicattack int +64 rangeattack int +65 stabdefence int +66 slashdefence int +67 crushdefence int +68 magicdefence int +69 rangedefence int +70 strengthbonus int +71 attackbonus int +72 prayerbonus int +73 rangebonus int +74 attackrange int +75 attackrate int +76 levelrequire int +77 stabattack_anim seq +78 stab_sound synth +79 slashattack_anim seq +80 slash_sound synth +81 crushattack_anim seq +82 crush_sound synth +83 defend_anim seq +84 rangeattack_anim seq +85 rangeattack_sound synth +86 proj_launch spotanim +87 proj_travel spotanim +88 proj_height int +89 undead int +90 zamorakitem int +91 poison_severity int +92 max_dealt int +93 combat_xp_multiplier int +94 magicattack_anim seq +95 npc_ammo namedobj +96 damagetype int +97 attack_anim seq +98 death_anim seq +99 spawn_anim seq +100 attack_sound synth +101 defend_sound synth +102 death_sound synth +103 death_drop namedobj +104 demonbane_vulnerable boolean +105 deathanim_delay int +106 retreat int +107 weapon_poisoned namedobj +108 weapon_poisoned_message string +109 gnome_cooking_struct struct +110 plural_name string +111 singular_name string +112 cocktail_message string +113 batta_message string +114 crunchies_message string +115 bowl_message string +116 gnome_cooking_type int +117 uncooked_pie_struct struct +118 pizza_topping_struct struct +119 ugthanki_kebab_struct struct +120 product2 namedobj +121 ingredient namedobj +122 productexp int +123 product namedobj +124 crafting_staff_struct struct +125 processmessage string +126 secondary_ingredient namedobj +127 color string +128 cape namedobj +129 crafting_capes_struct struct +130 levelfailure string +131 productmessage string +132 levelrequired int +133 skill_anim seq +134 levelfailmessage string +135 crafting_glass_struct struct +136 gem namedobj +137 strung namedobj +138 crafting_jewelry_struct struct +139 processexp int +140 namedobj namedobj +141 crafting_pottery_struct struct +142 crafting_spinning_struct struct +143 crafting_studded_struct struct +144 fish_equipment_failmessage string +145 fish_wrong_spot_message string +146 fish_equipment_struct struct +147 fishing_struct struct +148 baitrequired namedobj +149 baitmessage string +150 success_low int +151 success_high int +152 fishing_movement_enum enum +153 brew_potion_level int +154 brew_potion_exp int +155 brew_potion_solvent namedobj +156 brew_potion_mixture namedobj +157 brew_potion_message string +158 brew_potion_ingredient namedobj +159 brew_potion_struct struct +160 brew_potion_struct_secondary struct +161 decant_potion_enum enum +162 dose_count int +163 grindable_ingredient_refined namedobj +164 grindable_ingredient_message string +165 identified_herb_level int +166 identified_herb_exp int +167 identified_herb_message string +168 no_alchemy int +169 processfailure_superheat string +170 telegrab_disabled boolean +171 charge_orb_name string +172 charges int +173 mining_rock_empty int +174 next_loc_stage_mining loc +175 macro_gas loc +176 mining_animation seq +177 mining_rate int +178 bone_exp int +179 rc_ruin_coord enum +180 rune_type int +181 ingredient_secondary_count int +182 ingredient_secondary namedobj +183 smelting_struct struct +184 smeltsto namedobj +185 name string +186 xpperbar int +187 invcolumn1 inv +188 invcolumn2 inv +189 invcolumn3 inv +190 invcolumn4 inv +191 invcolumn5 inv +192 processfailure string +193 bar_count int +194 smithing_anvil_struct struct +195 woodcutting_struct struct diff --git a/src/public/data/symbols/runescript.sym b/src/public/data/symbols/runescript.sym new file mode 100644 index 00000000..eb8ce11a --- /dev/null +++ b/src/public/data/symbols/runescript.sym @@ -0,0 +1,5791 @@ +0 [debugproc,addxp] +1 [debugproc,bank] +2 [debugproc,bank_preset] +3 [debugproc,clearbank] +4 [debugproc,clearinv] +5 [debugproc,1hp] +6 [debugproc,foodbank] +7 [debugproc,dragslaystart] +8 [debugproc,dragslaybank] +9 [debugproc,energy] +10 [debugproc,fmtest] +11 [debugproc,fmbank] +12 [debugproc,fishtest] +13 [debugproc,fletchbank] +14 [debugproc,help] +15 [debugproc,macro_event] +16 [debugproc,giverunes] +17 [debugproc,magicbank] +18 [debugproc,maxme] +19 [debugproc,skull] +20 [debugproc,clearskull] +21 [debugproc,singles] +22 [debugproc,pvp] +23 [debugproc,duel] +24 [debugproc,random] +25 [debugproc,reset] +26 [debugproc,server] +27 [softtimer,server] +28 [debugproc,west] +29 [debugproc,east] +30 [debugproc,north] +31 [debugproc,south] +32 [debugproc,kbd] +33 [debugproc,elvarg] +34 [debugproc,home] +35 [debugproc,varrock] +36 [debugproc,falador] +37 [debugproc,draynor] +38 [debugproc,portsarim] +39 [debugproc,rimmington] +40 [debugproc,alkharid] +41 [debugproc,seers] +42 [debugproc,giants] +43 [debugproc,trawler_win] +44 [debugproc,trawler_loot] +45 [debugproc,trawler] +46 [debugproc,wptest] +47 [label,debugusage] +48 [label,please_finish] +49 [debugproc,addobj] +50 [debugproc,addobj2] +51 [debugproc,busy] +52 [debugproc,coord] +53 [debugproc,delay] +54 [debugproc,error] +55 [debugproc,findhero] +56 [debugproc,both_heropoints] +57 [debugproc,huntall_primary] +58 [debugproc,huntall_secondary] +59 [debugproc,open] +60 [debugproc,close] +61 [debugproc,lineofwalk] +62 [debugproc,loc] +63 [debugproc,map_blocked] +64 [debugproc,map_playercount] +65 [debugproc,npc] +66 [debugproc,npc_huntall] +67 [debugproc,npc_huntall_secondary] +68 [debugproc,npc_find] +69 [debugproc,npc_find2] +70 [debugproc,npc_findallany] +71 [debugproc,npc_findallany2] +72 [debugproc,players] +73 [debugproc,pos] +74 [debugproc,seq] +75 [debugproc,anim] +76 [debugproc,spotanim] +77 [debugproc,zone] +78 [ai_queue1,alkharid_warrior] +79 [ai_timer,border_guard_lumby] +80 [ai_timer,border_guard_alkharid] +81 [opnpc1,border_guard_lumby] +82 [opnpc1,border_guard_alkharid] +83 [oploc1,loc_2882] +84 [oploc1,loc_2883] +85 [label,find_and_talk_to_border_guard] +86 [label,talk_to_border_guard] +87 [label,pass_toll_gate] +88 [label,enter_through_border_gate_toll] +89 [proc,open_border_gate_toll_left_closed] +90 [proc,open_border_gate_toll_right_closed] +91 [label,guard_scout_toll_fence] +92 [opnpc1,dommik] +93 [label,crafting_shop_talk] +94 [opnpc1,gem_trader] +95 [opnpc1,hassan] +96 [opnpc1,kebab_seller] +97 [label,kebab_seller_miss] +98 [label,kebab_seller_buy] +99 [label,trail_kebab_seller] +100 [opnpc1,louie_legs] +101 [oploc1,loc_1529] +102 [oploc1,loc_1528] +103 [opnpc1,osman] +104 [label,osman_prequest] +105 [label,osman_instructions] +106 [label,osman_first_thing] +107 [label,osman_second_thing] +108 [label,osman_better_go] +109 [label,osman_items] +110 [label,osman_still_need] +111 [label,osman_other_items] +112 [opnpcu,osman] +113 [opnpc1,ranael] +114 [opnpc1,shantay] +115 [opnpc3,shantay] +116 [label,shantay_what_is_this_place] +117 [label,shantay_pay_for_desert] +118 [label,shantay_ill_pay_the_fine] +119 [label,shantay_no_thanks_youre_not_having_my_money] +120 [label,shantay_yes_okay_ill_pay_the_fine] +121 [label,shantay_send_player_to_port_sarim] +122 [label,shantay_can_i_see_what_you_have_to_sell_please] +123 [label,shantay_i_must_be_going] +124 [label,shantay_buy_shantay_pass] +125 [oploc1,shantay_chest] +126 [opnpc1,shantay_guard] +127 [opnpc1,shantay_pass_guard] +128 [oploc1,shantay_jail_door] +129 [oploc1,shantay_pass] +130 [oploc2,shantay_pass] +131 [opheld1,shantay_disclaimer] +132 [opnpc1,silk_trader] +133 [opnpc1,tanner] +134 [opnpcu,tanner] +135 [label,tan_leather_choices] +136 [proc,tan_leather] +137 [label,trail_tanner] +138 [opnpc1,zeke] +139 [label,trail_zeke] +140 [opnpc1,aemad] +141 [opnpc1,kortan] +142 [label,aemad_talk] +143 [ai_queue1,archer] +144 [ai_opplayer2,archer] +145 [ai_applayer2,archer] +146 [opnpc1,ardougne_monk] +147 [opnpc1,baker] +148 [opnpc1,bartender_flyinghorse] +149 [opnpcu,bartender_flyinghorse] +150 [label,flyinghorse_barcrawl] +151 [opnpc1,brother_cedric] +152 [label,cedric_default] +153 [label,cedric_okay] +154 [label,cedric_need_water] +155 [label,cedric_fix_cart] +156 [label,cedric_get_wood] +157 [label,cedric_almost_done] +158 [opnpc1,brother_kojo] +159 [opnpc1,brother_omad] +160 [label,omad_whats_wrong] +161 [label,omad_why] +162 [label,omad_help] +163 [label,omad_have_blanket] +164 [label,omad_organize_party] +165 [label,omad_no_time] +166 [label,omad_where_look] +167 [label,omad_come] +168 [label,omad_need_wine] +169 [label,omad_hello_again] +170 [label,omad_party] +171 [label,omad_postparty] +172 [opnpc1,captain_barnaby] +173 [opnpc1,caroline] +174 [label,caroline_help] +175 [label,caroline_savedkennith] +176 [label,caroline_postquest] +177 [label,caroline_anynews] +178 [oploc1,loc_2054] +179 [opnpc1,elena] +180 [opnpc1,fur_trader] +181 [opnpc1,gem_merchant] +182 [opheld1,guide_book] +183 [label,open_guide_ardougne] +184 [proc,guide_ardougne] +185 [opnpc1,holgart_ardougne] +186 [label,holgart_prequest] +187 [label,holgart_wantboat] +188 [label,holgart_paste] +189 [label,holgart_strangethings] +190 [label,holgart_back_kent] +191 [label,holgart_fancy] +192 [proc,board_ardougne_to_fishing_platform] +193 [opnpc1,horacio] +194 [label,horacio_garden_back] +195 [label,horacio_help] +196 [opnpc1,rdpt_employee] +197 [opnpc1,silk_merchant] +198 [proc,silk_merchant_sell_silk] +199 [opnpc1,silver_merchant] +200 [opnpc1,spice_seller] +201 [oploc1,ardougne_to_wilderness_lever] +202 [oploc1,wilderness_to_ardougne_lever] +203 [opnpc1,wizard_cromperty] +204 [label,cromperty_two_jobs] +205 [label,cromperty_what_invented] +206 [label,cromperty_teleport] +207 [label,rdpt_teleport] +208 [opnpc1,zenesha] +209 [opnpc1,zoo_keeper] +210 [label,trail_zoo_keeper] +211 [opnpc1,carla] +212 [label,carla_where_did_the_plague_come_from] +213 [label,carla_have_there_been_many_victims_of_the_plague] +214 [label,carla_i_hope_things_get_eaiser_for_you] +215 [opnpc1,chadwell] +216 [label,chadwell_lets_see_what_youve_got] +217 [label,chadwell_nothing_thanks] +218 [opnpc1,child_white] +219 [opnpc1,child_brown] +220 [label,child_im_not_allowed_to_speak_with_strangers] +221 [opnpc1,civilian_blonde] +222 [opnpc1,civilian_brown] +223 [opnpc1,civilian_bald] +224 [label,civilian_talk_about_cats] +225 [label,civilian_i_have_a_cat_i_could_sell] +226 [label,civilian_nope_theyre_not_easy_to_get_hold_of] +227 [label,civilian_im_not_parting_for_that] +228 [label,civilian_ok_then_youve_got_a_deal] +229 [proc,civilian_player_has_cat] +230 [opnpc1,clerk] +231 [label,clerk_who_is_through_that_door] +232 [label,clerk_im_just_looking_thanks] +233 [label,clerk_i_need_permission] +234 [label,clerk_ill_try_asking_them_then] +235 [label,clerk_surely_you_dont_let_them_run_everything_for_you] +236 [label,clerk_can_i_speak_to_bravek_anyway] +237 [label,clerk_ok_i_will_leave_him_alone] +238 [label,clerk_this_is_urgent_though] +239 [label,clerk_bravek_will_see_you_now] +240 [opnpc1,darkmage] +241 [oploc1,loc_2036] +242 [oploc1,loc_2048] +243 [oploc1,loc_2049] +244 [oploc1,loc_2528] +245 [label,west_ardougne_open_city_doors] +246 [label,west_ardougne_mourner_headquarters_doors] +247 [label,bravek_go_away_im_busy] +248 [label,bravek_enter_room] +249 [opnpc1,kilron] +250 [opnpc1,npc_351] +251 [opnpc1,npc_728] +252 [opnpc1,npc_729] +253 [label,man_woman_curse_king_tyras] +254 [label,man_woman_bad_day_then] +255 [label,man_woman_what_has_he_done] +256 [label,man_woman_im_looking_for_a_woman] +257 [oploc1,loc_2543] +258 [oploc1,loc_2544] +259 [oploc1,loc_2545] +260 [label,elena_open_manhole] +261 [label,elena_enter_manhole] +262 [label,elena_close_manhole] +263 [opnpc1,npc_347] +264 [opnpc1,npc_348] +265 [opnpc1,npc_717] +266 [opnpc1,head_mourner] +267 [opnpc1,npc_719] +268 [label,mourner_stand_back_citizen] +269 [label,mourner_talk_to_player] +270 [label,mourner_so_whats_a_mourner] +271 [label,mourner_i_havent_got_the_plague_though] +272 [label,mourner_im_looking_for_a_woman] +273 [label,head_mourner_talk_to_player] +274 [label,head_mourner_i_need_clearance] +275 [label,head_mourner_theres_a_kidnap_victim_inside] +276 [label,head_mourner_ive_got_a_gas_mask_though] +277 [label,head_mourner_yes_im_utterly_crazy] +278 [label,mourner_outside_gates] +279 [label,mourner_what_brought_the_plague_to_ardougne] +280 [label,mourner_what_are_the_symptoms_of_the_plague] +281 [label,mourner_thanks_for_the_advice] +282 [opnpc1,nurse_sarah] +283 [opnpc1,omart] +284 [opnpc1,npc_358] +285 [opnpc1,recruiter] +286 [opnpc1,npc_352] +287 [opnpc1,npc_353] +288 [opnpc1,npc_354] +289 [opnpc1,npc_360] +290 [opnpc1,npc_361] +291 [opnpc1,npc_362] +292 [opnpc1,npc_363] +293 [label,woman_life_is_tough] +294 [label,woman_living_in_a_plague_city_must_be_hard] +295 [label,woman_im_sorry_to_hear_that] +296 [label,woman_im_looking_for_a_lady] +297 [label,man_woman_help_me_out_of_this_hell_hole] +298 [label,man_woman_go_away_outsider] +299 [label,woman_bah_those_mourners] +300 [label,woman_have_you_seen_a_lady_around_here] +301 [label,woman_you_should_stand_up_to_them_more] +302 [opnpc1,barbarian_outpost_guard] +303 [label,outpost_guard_talk] +304 [label,outpost_guard_start] +305 [label,outpost_guard_progress] +306 [oploc1,_outpost_gate] +307 [opnpc1,barbarian] +308 [label,beer_barrel_beatdown] +309 [opnpc1,gunthor_the_brave] +310 [opnpc1,peksa] +311 [opnpc1,alfonse_the_waiter] +312 [opnpc1,bartender_brimhaven] +313 [opnpcu,bartender_brimhaven] +314 [label,deadman_barcrawl] +315 [opnpc1,davon] +316 [opnpc1,hajedy] +317 [opnpc1,kangai_mau] +318 [label,kangai_mau_prequest] +319 [label,kangai_mau_brimhaven] +320 [label,kangai_mau_mission] +321 [label,kangai_mau_start_totem] +322 [label,kangai_mau_why] +323 [label,kangai_mau_house] +324 [label,kangai_mau_totem_back] +325 [oploc1,_pineapple_plant_wild] +326 [oploc1,pineapple_plant_wild_0] +327 [opnpc1,pirate_guard] +328 [opnpc1,king_arthur] +329 [label,arthur_merlin_free] +330 [label,arthur_grailstart] +331 [label,arthur_firstmeet] +332 [opnpc1,merlin_arthur] +333 [opnpc1,merlin_workshop] +334 [opnpc1,sir_bedivere] +335 [opnpc1,sir_gawain] +336 [label,sir_gawain_lefaye_stronghold] +337 [opnpc1,sir_kay] +338 [label,trail_sir_kay] +339 [opnpc1,sir_lancelot] +340 [opnpc1,sir_lucan] +341 [opnpc1,sir_palomedes] +342 [opnpc1,sir_pelleas] +343 [opnpc1,sir_tristram] +344 [opnpc1,arhein] +345 [label,arhein_deliver] +346 [label,arhein_rich] +347 [label,arhein_fort] +348 [label,trail_arhein] +349 [opnpc1,candle_maker] +350 [opnpc1,harry] +351 [opnpc1,hickton] +352 [opnpc1,npc_561] +353 [opnpc1,npc_344] +354 [opnpc1,npc_346] +355 [oplocu,loc_2670] +356 [oplocu,loc_2671] +357 [oploc1,loc_2670] +358 [label,cut_kharidian_cactus] +359 [opnpc1,aggie] +360 [opnpcu,aggie] +361 [label,aggie_fine] +362 [label,aggie_dyes] +363 [label,aggie_yellow_dye] +364 [label,aggie_red_dye] +365 [label,aggie_blue_dye] +366 [label,aggie_ingredients] +367 [label,aggie_without_dye] +368 [label,aggie_mix_paste] +369 [label,aggie_no_paste] +370 [opnpc1,diango] +371 [opheld1,toy_horsey_brown] +372 [opheld1,toy_horsey_white] +373 [opheld1,toy_horsey_black] +374 [opheld1,toy_horsey_grey] +375 [label,diango_option1] +376 [label,toy_horsey_say] +377 [opnpc1,jail_guard] +378 [label,jail_guard_chill] +379 [opnpc1,joe_guard] +380 [opnpcu,joe_guard] +381 [label,joe_distract] +382 [label,joe_beer] +383 [label,joe_life] +384 [label,joe_boy] +385 [label,joe_chill_out] +386 [label,joe_wages] +387 [label,joe_money] +388 [label,joe_leave] +389 [label,joe_prequest] +390 [label,joe_drunk] +391 [label,joe_postquest] +392 [opnpc1,lady_keli] +393 [label,lady_keli_famous] +394 [label,lady_keli_kill] +395 [label,lady_keli_trained] +396 [label,lady_keli_never] +397 [label,lady_keli_bell] +398 [label,lady_keli_not_disturb] +399 [label,lady_keli_hoodlums] +400 [label,lady_keli_katrine] +401 [label,lady_keli_still_katrine] +402 [label,lady_keli_plan] +403 [label,lady_keli_skillful] +404 [label,lady_keli_pay] +405 [label,lady_keli_out] +406 [label,lady_keli_secrets] +407 [label,lady_keli_key_please] +408 [label,lady_keli_touch_key] +409 [opnpc1,leela] +410 [label,leela_help] +411 [label,leela_disguise] +412 [label,leela_need_key] +413 [label,leela_guards] +414 [label,leela_rest_escape] +415 [label,leela_post_key] +416 [opnpc1,morgan] +417 [label,morgan_before_vampire_slayer] +418 [label,morgan_decline_vampire_slayer] +419 [label,morgan_during_vampire_slayer] +420 [label,morgan_after_vampire_slayer] +421 [opnpc1,ned] +422 [opnpcu,ned] +423 [label,trail_ned] +424 [label,standard_ned] +425 [label,ned_start_rope_purchase] +426 [label,ned_rope] +427 [label,ned_decline_rope] +428 [label,ned_get_wool] +429 [label,ned_more_pay] +430 [label,ned_have_wool] +431 [label,ned_sweater] +432 [label,ned_arrow_holes] +433 [label,ned_wig] +434 [label,ned_make_wig] +435 [label,ned_come_back] +436 [label,ned_dragon_slayer_before_hired] +437 [label,ned_so_wheres_your_ship] +438 [label,ned_dragon_slayer_hired] +439 [label,ned_dragon_slayer_back_in_draynor_after_visiting_crandor] +440 [label,give_map_to_ned] +441 [opnpc1,prince_ali] +442 [label,prince_rescue] +443 [opnpcu,prince_ali] +444 [opnpc1,professor_oddenstein] +445 [label,oddenstein_nonquest] +446 [label,oddenstein_machine] +447 [label,oddenstein_house] +448 [label,oddenstein_looking] +449 [label,oddenstein_chicken] +450 [label,oddenstein_change_back] +451 [label,oddenstein_not_easy] +452 [label,oddenstein_items] +453 [opnpc1,traiborn] +454 [label,demon_slayer_traiborn_bones_dialogue] +455 [label,demon_slayer_traiborn_give_bones] +456 [proc,traiborn_dialogue_options] +457 [label,traiborn_dialogue] +458 [label,demon_slayer_traiborn_lost_key] +459 [label,traiborn_teach_me] +460 [label,traiborn_thingummywut_shock] +461 [label,traiborn_thingummywut_player] +462 [label,traiborn_thingummywut_mash] +463 [label,traiborn_be_off] +464 [label,traiborn_mad] +465 [label,demon_slayer_traiborn_keys_around] +466 [label,demon_slayer_traiborn_be_off_keys_around] +467 [label,traiborn_spinach_roll] +468 [label,demon_slayer_traiborn_stop_giving_bones] +469 [label,demon_slayer_traiborn_incantation] +470 [opnpc1,veronica] +471 [label,haunted_start] +472 [label,veronica_sweetheart] +473 [label,veronica_postquest] +474 [oploc1,loc_1804] +475 [oplocu,loc_1804] +476 [label,open_edgeville_dungeon_door] +477 [oploc1,loc_3209] +478 [oploc1,loc_3211] +479 [opnpc1,oracle] +480 [label,oracle_seek_map_piece] +481 [label,oracle_random] +482 [label,trail_oracle] +483 [opnpc1,npc_747] +484 [opnpc3,npc_747] +485 [label,oziach_not_friend] +486 [label,oziach_can_sell_rune_plate] +487 [label,oziach_nice_day] +488 [label,oziach_detective] +489 [label,oziach_guildmaster] +490 [label,oziach_dragon_shield] +491 [label,oziach_find_dragon] +492 [label,oziach_first_piece] +493 [label,oziach_second_piece] +494 [label,oziach_third_piece] +495 [label,oziach_farewell] +496 [label,oziach_dragon_complete] +497 [label,trail_oziach] +498 [label,puzzle_oziach] +499 [opnpc1,cave_monk] +500 [label,cave_monk_chat] +501 [oploc1,loc_2408] +502 [oploc1,loc_2407] +503 [opnpc1,frincos] +504 [opnpc1,high_priest] +505 [opnpcu,high_priest] +506 [opnpc1,monk_of_entrana_island] +507 [opnpc1,barmaid] +508 [opnpcu,barmaid] +509 [label,barmaid_barcrawl_dialogue] +510 [label,barmaid_what_ales] +511 [opnpc1,cassie] +512 [opnpc1,drogo_dwarf] +513 [opnpc1,falador_flynn] +514 [opnpc1,general_bentnoze] +515 [opnpc1,general_wartface] +516 [opnpc1,goblin_armed_green] +517 [opnpc1,goblin_armed_red] +518 [opnpc1,hairdresser] +519 [label,hairdresser_b1_s1] +520 [label,hairdresser_b1_s2] +521 [label,hairdresser_b1_s3] +522 [if_button,player_kit_hair_woman:com_137] +523 [if_button,player_kit_hair_woman:com_138] +524 [if_button,player_kit_hair_woman:com_139] +525 [if_button,player_kit_hair_woman:com_140] +526 [if_button,player_kit_hair_woman:com_141] +527 [if_button,player_kit_hair_woman:com_142] +528 [if_button,player_kit_hair_woman:com_143] +529 [if_button,player_kit_hair_woman:com_144] +530 [if_button,player_kit_hair_woman:com_145] +531 [if_button,player_kit_hair_woman:com_146] +532 [if_button,player_kit_hair_woman:com_125] +533 [if_button,player_kit_hair_woman:com_126] +534 [if_button,player_kit_hair_woman:com_127] +535 [if_button,player_kit_hair_woman:com_128] +536 [if_button,player_kit_hair_woman:com_129] +537 [if_button,player_kit_hair_woman:com_130] +538 [if_button,player_kit_hair_woman:com_131] +539 [if_button,player_kit_hair_woman:com_132] +540 [if_button,player_kit_hair_woman:com_133] +541 [if_button,player_kit_hair_woman:com_134] +542 [if_button,player_kit_hair_woman:com_135] +543 [if_button,player_kit_hair_woman:com_136] +544 [if_button,player_kit_hair_woman:com_100] +545 [if_button,player_kit_hair_man:com_135] +546 [if_button,player_kit_hair_man:com_136] +547 [if_button,player_kit_hair_man:com_137] +548 [if_button,player_kit_hair_man:com_138] +549 [if_button,player_kit_hair_man:com_139] +550 [if_button,player_kit_hair_man:com_140] +551 [if_button,player_kit_hair_man:com_141] +552 [if_button,player_kit_hair_man:com_142] +553 [if_button,player_kit_hair_man:com_143] +554 [if_button,player_kit_hair_man:com_123] +555 [if_button,player_kit_hair_man:com_124] +556 [if_button,player_kit_hair_man:com_125] +557 [if_button,player_kit_hair_man:com_126] +558 [if_button,player_kit_hair_man:com_127] +559 [if_button,player_kit_hair_man:com_128] +560 [if_button,player_kit_hair_man:com_129] +561 [if_button,player_kit_hair_man:com_130] +562 [if_button,player_kit_hair_man:com_131] +563 [if_button,player_kit_hair_man:com_132] +564 [if_button,player_kit_hair_man:com_133] +565 [if_button,player_kit_hair_man:com_134] +566 [if_button,player_kit_hair_man:com_99] +567 [if_button,player_kit_hair_jaw:com_140] +568 [if_button,player_kit_hair_jaw:com_141] +569 [if_button,player_kit_hair_jaw:com_142] +570 [if_button,player_kit_hair_jaw:com_143] +571 [if_button,player_kit_hair_jaw:com_144] +572 [if_button,player_kit_hair_jaw:com_145] +573 [if_button,player_kit_hair_jaw:com_146] +574 [if_button,player_kit_hair_jaw:com_147] +575 [if_button,player_kit_hair_jaw:com_128] +576 [if_button,player_kit_hair_jaw:com_129] +577 [if_button,player_kit_hair_jaw:com_130] +578 [if_button,player_kit_hair_jaw:com_131] +579 [if_button,player_kit_hair_jaw:com_132] +580 [if_button,player_kit_hair_jaw:com_133] +581 [if_button,player_kit_hair_jaw:com_134] +582 [if_button,player_kit_hair_jaw:com_135] +583 [if_button,player_kit_hair_jaw:com_136] +584 [if_button,player_kit_hair_jaw:com_137] +585 [if_button,player_kit_hair_jaw:com_138] +586 [if_button,player_kit_hair_jaw:com_139] +587 [if_button,player_kit_hair_jaw:com_105] +588 [opnpc1,herquin] +589 [opnpc1,makeover_mage] +590 [label,makeover_mage_tell_more] +591 [label,makeover_mage_sure] +592 [label,makeover_mage_no] +593 [if_button,makeover_mage:com_102] +594 [if_button,makeover_mage:com_104] +595 [if_button,makeover_mage:com_113] +596 [if_button,makeover_mage:com_114] +597 [if_button,makeover_mage:com_94] +598 [if_button,makeover_mage:com_95] +599 [if_button,makeover_mage:com_96] +600 [if_button,makeover_mage:com_97] +601 [if_button,makeover_mage:com_98] +602 [if_button,makeover_mage:com_99] +603 [if_button,makeover_mage:com_100] +604 [if_button,makeover_mage:com_101] +605 [if_button,makeover_mage:com_89] +606 [oploc1,loc_2113] +607 [oploc1,loc_2112] +608 [opnpc1,nurmof] +609 [opnpcu,nurmof] +610 [proc,has_broken_pickaxe] +611 [opnpc1,sir_amik_varze] +612 [label,black_knights_fortress_sir_amik_prequest] +613 [label,black_knights_fortress_sir_amik_meets_requirements] +614 [label,black_knights_fortress_sir_amik_come_along_at_the_right_time] +615 [label,black_knights_fortress_sir_amik_in_progress] +616 [label,black_knights_fortress_sir_amik_postquest] +617 [opnpc1,sir_vyvin] +618 [label,sir_vyvin_trade] +619 [label,sir_vyvin_knights] +620 [label,sir_vyvin_distract] +621 [opnpc1,falador_squire] +622 [label,trail_squire] +623 [opnpc1,wayne] +624 [opnpc1,wyson] +625 [opnpc1,bailey] +626 [opnpc1,_fisherman_platform] +627 [opnpc1,holgart_island] +628 [opnpc1,holgart_platform] +629 [label,holgart_platform_standard] +630 [label,holgart_something_strange] +631 [label,holgart_kid_shore] +632 [proc,board_fishing_platform_to_island] +633 [proc,board_fishing_platform_to_ardougne] +634 [label,kennith_chat] +635 [opnpc1,kent] +636 [opnpc1,aluft_gianne] +637 [opnpcu,aluft_gianne] +638 [opnpc1,blurberry] +639 [opnpcu,blurberry] +640 [label,blurberry_barcrawl] +641 [opnpc1,bolkoy] +642 [opnpc1,commander_montai] +643 [opnpc1,elkoy_outmaze] +644 [opnpc1,elkoy_maze] +645 [label,elkoy_intro] +646 [label,elkoy_looking_orbs] +647 [label,elkoy_maze_preorb] +648 [label,elkoy_retrieved_orb_outside] +649 [label,elkoy_retrieved_orb_inside] +650 [label,elkoy_missing_first_orb] +651 [label,elkoy_stolen_orbs_inside] +652 [label,elkoy_stolen_orbs_outside] +653 [proc,elkoy_did_you_hear] +654 [label,elkoy_leavemaze_initial] +655 [label,elkoy_leavemaze_second] +656 [label,elkoy_hero_outside] +657 [label,elkoy_hero_inside] +658 [label,elkoy_postquest_outside] +659 [label,elkoy_postquest_inside] +660 [label,elkoy_jumpmaze_postquest] +661 [label,gnome_bar_start] +662 [label,gnome_bar_assign_fruit_blast] +663 [label,gnome_bar_assign_drunk_dragon] +664 [label,gnome_bar_assign_ssg] +665 [label,gnome_bar_assign_chocolate_saturday] +666 [label,gnome_bar_assign_blurberry_special] +667 [label,gnome_bar_complete] +668 [proc,gnome_bar_cocktail_checks] +669 [label,gnome_bar_cocktail_job_start] +670 [label,gnome_bar_cocktail_job_finish] +671 [proc,gnome_bar_cocktail_job_checks] +672 [opnpc1,gnome_barman] +673 [label,gnome_barman_barcrawl] +674 [opnpcu,gnome_barman] +675 [opheld1,cocktail_guide] +676 [if_button,blurberry_cocktail_guide:index] +677 [if_button,blurberry_cocktail_guide2:rightarrow] +678 [if_button,blurberry_cocktail_guide2:blurberry_special] +679 [if_button,blurberry_cocktail_guide2:chocolate_saturday] +680 [if_button,blurberry_cocktail_guide2:drunk_dragon] +681 [if_button,blurberry_cocktail_guide2:fruit_blast] +682 [if_button,blurberry_cocktail_guide2:pineapple_punch] +683 [if_button,blurberry_cocktail_guide2:short_green_guy] +684 [if_button,blurberry_cocktail_guide2:wizard_blizzard] +685 [if_button,blurberry_cocktail_guide:leftarrow] +686 [if_button,blurberry_cocktail_guide:rightarrow] +687 [label,open_cocktail_guide_index] +688 [label,flip_page_cocktail_guide] +689 [opheld1,gianne_cook_book] +690 [if_button,blurberry_cocktail_guide2:chocolate_bomb] +691 [if_button,blurberry_cocktail_guide2:tangled_toads_legs] +692 [if_button,blurberry_cocktail_guide2:worm_hole] +693 [if_button,blurberry_cocktail_guide2:veg_ball] +694 [if_button,blurberry_cocktail_guide2:premade_worm_crunchies] +695 [if_button,blurberry_cocktail_guide2:choc_chip_crunchies] +696 [if_button,blurberry_cocktail_guide2:premade_spicy_crunchies] +697 [if_button,blurberry_cocktail_guide2:premade_toad_crunchies] +698 [if_button,blurberry_cocktail_guide2:premade_worm_batta] +699 [if_button,blurberry_cocktail_guide2:toads_legs_batta] +700 [if_button,blurberry_cocktail_guide2:cheese_tomato_batta] +701 [if_button,blurberry_cocktail_guide2:premade_fruit_batta] +702 [if_button,blurberry_cocktail_guide2:premade_vegetable_batta] +703 [if_button,giannes_cook_book:leftarrow] +704 [if_button,giannes_cook_book:rightarrow] +705 [if_button,giannes_cook_book:index] +706 [label,open_cook_book_index] +707 [label,flip_page_cook_book] +708 [oploc1,loc_190] +709 [oploc1,loc_1967] +710 [oploc1,loc_1968] +711 [label,open_tree_door] +712 [label,gnome_restaurant_start] +713 [label,gnome_restaurant_assign_cheese_tom_batta] +714 [label,gnome_restaurant_assign_chocolate_bomb] +715 [label,gnome_restaurant_assign_toad_batta] +716 [label,gnome_restaurant_assign_worm_hole] +717 [label,gnome_restaurant_assign_toad_crunchies] +718 [label,gnome_restaurant_complete] +719 [proc,gnome_restaurant_food_check] +720 [label,gnome_restaurant_job_start] +721 [label,gnome_restaurant_job_finish] +722 [proc,gnome_restaurant_job_checks] +723 [opnpc1,gnome_trainer] +724 [opnpc1,_gnome_troop] +725 [ai_queue1,_gnome_troop] +726 [ai_opplayer2,_gnome_troop] +727 [ai_applayer2,_gnome_troop] +728 [ai_queue1,gnome_woman_white] +729 [ai_opplayer2,gnome_woman_white] +730 [ai_applayer2,gnome_woman_white] +731 [ai_queue1,gnome_woman_black] +732 [ai_opplayer2,gnome_woman_black] +733 [ai_applayer2,gnome_woman_black] +734 [opnpc1,npc_851] +735 [opnpc1,gnome_green] +736 [opnpc1,gnome_brown] +737 [opnpc1,gnome_woman_white] +738 [opnpc1,gnome_woman_black] +739 [label,talk_to_gnome] +740 [label,talk_to_gnome_woman] +741 [opnpc1,gnome_child_yellow] +742 [opnpc1,gnome_child_green] +743 [opnpc1,gnome_child_blue] +744 [oploc1,loc_2186] +745 [opnpc1,hazelmere] +746 [label,trail_hazelmere] +747 [opnpc1,npc_603] +748 [opnpc1,npc_600] +749 [opnpc1,kalron] +750 [opnpc1,king_bolren] +751 [proc,gnome_chant] +752 [opnpc1,local_gnome] +753 [opnpc1,remsai] +754 [opnpc1,npc_601] +755 [oploc1,loc_1293] +756 [oploc1,loc_1294] +757 [oploc1,loc_1317] +758 [label,spirit_tree_tele] +759 [oploc1,_banana_tree] +760 [oploc1,banana_tree_0] +761 [opnpc1,customs_officer] +762 [label,customs_unusual] +763 [label,customs_journey] +764 [label,customs_spot_inspection] +765 [label,customs_why] +766 [label,customs_dont_touch] +767 [label,customs_search] +768 [label,customs_pass_search] +769 [label,customs_pay] +770 [opnpc1,jiminua] +771 [oploc1,loc_492] +772 [oploc1,loc_1764] +773 [opnpcu,trufitus] +774 [opnpc1,trufitus] +775 [label,start_junglepotion] +776 [label,farewell] +777 [label,ask_village] +778 [proc,give_herb] +779 [label,accept_herb] +780 [label,given_unid] +781 [label,decline_herb] +782 [proc,mention_herb] +783 [label,post_quest] +784 [opnpc1,zambo] +785 [opnpcu,zambo] +786 [label,karamjaspirits_barcrawl] +787 [opnpc1,door_man] +788 [label,door_man_chat] +789 [oploc1,loc_2411] +790 [opnpc1,fairy_queen] +791 [opnpc1,irksol] +792 [opnpc1,jakut] +793 [opnpc1,ladder_fairy] +794 [oploc1,loc_2410] +795 [label,ladder_fairy_talk] +796 [opnpc1,lunderwin] +797 [opnpc1,archer_zanaris] +798 [opnpc1,bob] +799 [opnpcu,bob] +800 [opnpc1,cook] +801 [label,trail_cook] +802 [opnpc1,duke_horacio] +803 [proc,duke_handle_rune_mysteries] +804 [label,duke_horacio_money] +805 [label,duke_rune_mysteries_start] +806 [label,duke_rune_mysteries_in_progress] +807 [label,duke_rune_mysteries_complete] +808 [label,duke_horacio_shield] +809 [opnpc1,father_aereck] +810 [label,father_aereck_default] +811 [label,father_aereck_priest_inprogress] +812 [opnpc1,father_urhney] +813 [label,father_urhney_well_thats_friendly] +814 [label,father_urhney_repossess_house] +815 [label,father_urhney_priest_father_aereck_sent_me] +816 [label,father_urhney_priest_hes_got_a_ghost] +817 [label,father_urhney_priest_lost_amulet] +818 [opnpc1,fred_the_farmer] +819 [label,fred_start] +820 [label,fred_something_to_kill] +821 [label,fred_im_lost] +822 [label,fred_not_exciting] +823 [label,fred_the_thing] +824 [label,fred_no_miss] +825 [label,fred_worried_thing] +826 [label,fred_yes_okay] +827 [label,fred_progressed] +828 [label,fred_give_wool] +829 [label,fred_end_giving_wool] +830 [label,fred_post_quest] +831 [opnpc1,hans] +832 [opnpc1,monk_zanaris] +833 [opnpc1,warrior_zanaris] +834 [label,warrior_camped_out] +835 [label,warrior_who_zanaris] +836 [label,warrior_what_zanaris] +837 [label,warrior_think_here] +838 [label,warrior_if_hidden] +839 [label,warrior_no_such_thing] +840 [label,warrior_adventures] +841 [label,warrior_please_tell] +842 [opnpc1,wizard_zanaris] +843 [opnpc2,_battle_mage] +844 [apnpc2,_battle_mage] +845 [ai_queue1,battle_mage_zamorak] +846 [ai_queue1,battle_mage_saradomin] +847 [ai_queue1,battle_mage_guthix] +848 [ai_applayer2,battle_mage_zamorak] +849 [ai_applayer2,battle_mage_saradomin] +850 [ai_applayer2,battle_mage_guthix] +851 [ai_opplayer2,battle_mage_zamorak] +852 [ai_opplayer2,battle_mage_saradomin] +853 [ai_opplayer2,battle_mage_guthix] +854 [oploc1,loc_2873] +855 [oploc1,loc_2874] +856 [oploc1,loc_2875] +857 [label,pray_at_statue] +858 [opnpc1,chamber_guardian] +859 [opnpc3,chamber_guardian] +860 [opheld2,saradomincape] +861 [opheld2,zamorakcape] +862 [opheld2,guthixcape] +863 [opheld2,saradominstaff] +864 [opheld2,zamorakstaff] +865 [opheld2,guthixstaff] +866 [proc,check_conflicting_god_cape] +867 [proc,check_conflicting_god_staff] +868 [opheld5,saradomincape] +869 [opheld5,zamorakcape] +870 [opheld5,guthixcape] +871 [label,drop_god_cape] +872 [opnpc1,gundai] +873 [opnpc1,kolodion] +874 [label,kolodion_can_i_fight_here] +875 [label,kolodion_whats_the_point] +876 [label,kolodion_barbaric] +877 [label,kolodion_yes_indeedy] +878 [label,kolodion_no_i_dont] +879 [label,kolodion_lets_fight] +880 [label,kolodion_return] +881 [label,kolodion_what_now] +882 [label,kolodion_teleport] +883 [ai_opplayer2,kolodion] +884 [ai_queue4,kolodion] +885 [ai_applayer2,kolodion_human_form] +886 [ai_applayer2,kolodion_ogre_form] +887 [ai_applayer2,kolodion_arachnid_form] +888 [ai_applayer2,kolodion_ethereal_form] +889 [ai_applayer2,kolodion_demon_form] +890 [ai_opplayer2,kolodion_human_form] +891 [ai_opplayer2,kolodion_ogre_form] +892 [ai_opplayer2,kolodion_arachnid_form] +893 [ai_opplayer2,kolodion_ethereal_form] +894 [ai_opplayer2,kolodion_demon_form] +895 [ai_queue1,kolodion_human_form] +896 [ai_queue1,kolodion_ogre_form] +897 [ai_queue1,kolodion_arachnid_form] +898 [ai_queue1,kolodion_ethereal_form] +899 [ai_queue1,kolodion_demon_form] +900 [ai_queue3,kolodion_human_form] +901 [ai_queue3,kolodion_ogre_form] +902 [ai_queue3,kolodion_arachnid_form] +903 [ai_queue3,kolodion_ethereal_form] +904 [ai_queue3,kolodion_demon_form] +905 [opnpc1,lundail] +906 [opnpc3,lundail] +907 [oploc1,loc_2871] +908 [oploc1,loc_2872] +909 [oploc1,loc_2878] +910 [oploc1,loc_2879] +911 [label,jump_in_sparkling_pool] +912 [oploc1,loc_2880] +913 [proc,can_enter_mage_arena] +914 [proc,mage_arena_in_progress] +915 [queue,finish_mage_arena] +916 [proc,mage_arena_exactmove] +917 [proc,spawn_mage_arena_boss] +918 [opnpc1,bartender_port_sarim] +919 [opnpcu,bartender_port_sarim] +920 [label,bartender_port_sarim_beer] +921 [label,rustyanchor_barcrawl] +922 [label,trail_bartender_port_sarim] +923 [opnpc1,betty] +924 [opnpc1,brian] +925 [opnpc1,cabin_boy_jenkins] +926 [label,jenkins_back_to_shore] +927 [label,jenkins_inspect_her_more] +928 [label,jenkins_can_crandor] +929 [opnpc1,gerrant] +930 [opnpc1,grum] +931 [opnpc1,klarense] +932 [label,klarense_crandor_for_me] +933 [label,klarense_fixing] +934 [label,klarense_board_ship] +935 [label,klarense_no_ship] +936 [label,klarense_when_sea_worthy] +937 [label,klarense_crandor_when_ready] +938 [label,klarense_buy] +939 [label,klarense_nevermind] +940 [opnpc1,monk_of_entrana_sarim] +941 [proc,has_entrana_restricted_items] +942 [opnpc1,_sailor] +943 [label,sailor_yes] +944 [opnpc1,thurgo] +945 [opnpc1,wydin] +946 [label,wydin_employed_chat] +947 [label,wydin_job] +948 [label,wydin_open_shop] +949 [label,wydin_no] +950 [label,wydin_recommend] +951 [label,wydin_recommend_try] +952 [label,wydin_recommend_no] +953 [opnpc1,hetty] +954 [label,hetty_search_quest] +955 [label,hetty_darker_self] +956 [opnpc1,rommik] +957 [opnpc1,bartender_seers] +958 [opnpcu,bartender_seers] +959 [label,bartender_seers_what_have] +960 [label,bartender_seers_beer] +961 [label,bartender_seers_stew] +962 [label,bartender_seers_meat_pie] +963 [label,bartender_seers_transaction] +964 [label,bartender_seers_thanks] +965 [label,forestersarms_barcrawl] +966 [oploc1,loc_68] +967 [oplocu,loc_68] +968 [label,pour_repellent_bees] +969 [label,take_beehive] +970 [oploc1,loc_2114] +971 [oplocu,loc_2114] +972 [opnpc1,galahad] +973 [label,galahad_how] +974 [label,galahad_what] +975 [label,galahad_why_leave] +976 [label,galahad_why_grail] +977 [label,galahad_get_going] +978 [label,galahad_give_tea] +979 [label,galahad_borrow_cloth] +980 [opnpc1,big_dave] +981 [label,big_dave_dialogue] +982 [opnpc1,bonzo] +983 [label,bonzo_waiting_entry] +984 [label,bonzo_set_places] +985 [label,bonzo_howdoing] +986 [label,bonzo_handover_catch] +987 [label,bonzo_quits] +988 [label,bonzo_champ] +989 [opnpc1,grandpa_jack] +990 [opnpc1,joshua] +991 [label,joshua_dialogue] +992 [opnpc1,morris] +993 [opnpc1,sinister_stranger] +994 [label,sinister_stranger_vampire] +995 [label,sinister_stranger_nice] +996 [label,sinister_stranger_fishing] +997 [label,sinister_stranger_thirsty] +998 [label,sinister_stranger_luck] +999 [label,sinister_stranger_my_spot] +1000 [oploc1,_mcgrubor_gate] +1001 [opnpc1,forester_mcgrubor] +1002 [oploc1,loc_51] +1003 [oploc1,_red_vine] +1004 [oplocu,_red_vine] +1005 [label,dig_red_vine] +1006 [opnpc1,poison_salesman] +1007 [opnpc1,seer] +1008 [proc,seers_greetings] +1009 [label,seer_many_greetings] +1010 [label,seer_knowledge_and_power] +1011 [label,seer_locate_scorp] +1012 [label,seer_thormac] +1013 [label,seer_looking_glass] +1014 [label,seer_where_scorp] +1015 [label,seer_first_scorp] +1016 [label,seer_second_scorp] +1017 [label,seer_last_scorp] +1018 [opnpc1,stankers] +1019 [label,stankers_yes] +1020 [label,stankers_what] +1021 [label,stankers_no] +1022 [opnpc1,thormac] +1023 [label,thormac_assistance] +1024 [label,thormac_how_catch] +1025 [label,thormac_for_me] +1026 [label,thormac_not_interest] +1027 [label,thormac_startquest] +1028 [label,thormac_how_goes] +1029 [label,thormac_lost_cage] +1030 [label,thormac_not_yet] +1031 [label,thormac_thankyou] +1032 [label,thormac_makestaff] +1033 [opnpc1,fernahei] +1034 [opnpc1,obli] +1035 [oploc1,loc_2631] +1036 [oplocu,loc_2631] +1037 [oploc1,loc_2623] +1038 [oplocu,loc_2623] +1039 [oploc1,loc_37] +1040 [label,unlock_taverly_jaildoor] +1041 [proc,open_taverly_jaildoor] +1042 [oploc1,_taverly_dungeon_prison_door] +1043 [label,taverly_dungeon_open_doors] +1044 [opnpc1,velrak_the_explorer] +1045 [opnpc1,boy] +1046 [oploc1,loc_172] +1047 [oplocu,loc_172] +1048 [label,open_crystal_chest] +1049 [label,crystal_chest_reward] +1050 [opheldu,half_key1] +1051 [opheldu,half_key2] +1052 [label,join_keys] +1053 [ai_queue1,druid] +1054 [ai_applayer2,druid] +1055 [ai_opplayer2,druid] +1056 [proc,npc_druid_entangle] +1057 [opnpc1,gaius] +1058 [label,trail_gaius] +1059 [opnpc1,jatix] +1060 [opnpc1,kaqemeex] +1061 [label,kaqemeex_who_are_you] +1062 [label,kaqemeex_did_you_build] +1063 [label,kaqemeex_leaving_now] +1064 [label,kaqemeex_about_guthix] +1065 [opnpc1,lady_of_the_lake] +1066 [opnpc1,sanfew] +1067 [label,sanfew_teach_herblore] +1068 [label,sanfew_dont_need] +1069 [label,sanfew_more_work] +1070 [opnpc1,apothecary] +1071 [label,apothecary_standard] +1072 [label,apothecary_make_cadaver] +1073 [label,apothecary_lawrence_sent] +1074 [oploc2,attack_dummy] +1075 [opnpc1,aubury] +1076 [label,aubury_shop] +1077 [label,aubury_no] +1078 [label,aubury_ess] +1079 [label,aubury_package] +1080 [opnpc1,baraek] +1081 [label,baraek_sell_fur] +1082 [label,baraek_quest] +1083 [label,baraek_buy_fur] +1084 [label,baraek_grey_wolf_fur] +1085 [label,baraek_phoenixgang] +1086 [opnpc1,bartender_jollyboar] +1087 [opnpcu,bartender_jollyboar] +1088 [label,jollyboar_barcrawl] +1089 [opnpc1,bartender_varrock] +1090 [opnpcu,bartender_varrock] +1091 [label,bluemoon_barcrawl] +1092 [label,trail_bartender_varrock] +1093 [opnpc1,captain_rovin] +1094 [label,demon_slayer_captain_rovin] +1095 [proc,demon_slayer_captain_rovin_dialogue_options] +1096 [oploc1,loc_1805] +1097 [opnpc1,curator] +1098 [opnpc1,fancy_dress_shop_owner] +1099 [opnpc1,father_lawrence] +1100 [label,father_lawrence_prequest] +1101 [label,father_lawrence_help] +1102 [opnpc1,guild_master] +1103 [label,guild_master_start_dragon_quest] +1104 [opnpc1,gypsy] +1105 [label,demon_slayer_gypsy_press_on_with_it] +1106 [label,demon_slayer_gypsy_stop_calling_me_that] +1107 [label,demon_slayer_not_started_gypsy] +1108 [label,demon_slayer_gypsy_how_old_are_you] +1109 [label,demon_slayer_gypsy_money_for_fortune] +1110 [label,demon_slayer_gypsy_quest_start] +1111 [label,demon_slayer_gypsy_who_is_delrith] +1112 [label,demon_slayer_gypsy_wally] +1113 [label,demon_slayer_gypsy_destroy_cities] +1114 [label,demon_slayer_gypsy_kill_him_for_you] +1115 [label,demon_slayer_gypsy_destroy_delrith] +1116 [label,demon_slayer_gypsy_more_info] +1117 [label,demon_slayer_gypsy_incantation] +1118 [label,demon_slayer_gypsy_ill_do_my_best] +1119 [label,demon_slayer_gypsy_silverlight] +1120 [label,demon_slayer_gypsy_age_riddle] +1121 [label,demon_slayer_gypsy_dont_believe] +1122 [opnpc1,harlow] +1123 [label,harlow_during_vampire_slayer] +1124 [label,harlow_during_vampire_slayer_buy_beer] +1125 [label,harlow_decline_drink] +1126 [opnpc1,horvik] +1127 [opnpc1,juliet] +1128 [label,juliet_start] +1129 [label,juliet_from_romeo] +1130 [label,juliet_agree_message] +1131 [label,juliet_deliver_letter] +1132 [label,juliet_message_passed] +1133 [label,juliet_found_father] +1134 [label,juliet_potion_made] +1135 [label,juliet_postquest] +1136 [opnpc1,katrine] +1137 [label,katrine_standard] +1138 [label,katrine_gangmember] +1139 [label,katrine_hint] +1140 [label,katrine_doorout] +1141 [label,katrine_got_yet] +1142 [label,katrine_blackarmmember] +1143 [opnpc1,king_roald] +1144 [opnpcu,king_roald] +1145 [label,roald_dialogue] +1146 [opnpc1,lowe] +1147 [opnpc1,reldo] +1148 [label,reldo_trade] +1149 [label,reldo_what_do] +1150 [label,reldo_phoenixstart] +1151 [label,reldo_read_book] +1152 [opnpc1,romeo] +1153 [label,romeojuliet_start] +1154 [label,romeo_tell_her] +1155 [label,romeo_busy] +1156 [label,romeo_work] +1157 [label,romeo_messagefrom] +1158 [label,romeo_father] +1159 [label,romeo_potion] +1160 [label,romeo_allset] +1161 [opnpc1,scavvo] +1162 [opnpc1,sir_prysin] +1163 [label,demon_slayer_sir_prysin_pre_silverlight] +1164 [label,demon_slayer_sir_prysin_key_search_progress] +1165 [label,demon_slayer_prysin_got_them] +1166 [label,demon_slayer_sir_prysin_gypsy] +1167 [label,demon_slayer_sir_prysin_silverlight] +1168 [label,demon_slayer_sir_prysin_keys] +1169 [label,demon_slayer_sir_prysin_key_inquiry] +1170 [label,demon_slayer_sir_captain_rovin_key_inquiry] +1171 [label,demon_slayer_sir_wizard_traiborn_inquiry] +1172 [label,demon_slayer_sir_prysin_drain] +1173 [label,demon_slayer_better_go_key_hunting] +1174 [proc,demon_slayer_sir_prysin_options] +1175 [opnpc1,straven] +1176 [opnpcu,straven] +1177 [label,straven_cant_enter] +1178 [label,straven_mission] +1179 [label,straven_gangmember] +1180 [label,straven_blackarmdog] +1181 [opnpc1,tea_seller] +1182 [opnpc3,tea_seller] +1183 [opobj3,obj_712] +1184 [opnpc1,thessalia] +1185 [label,thessalia_b1_s1] +1186 [label,thessalia_b1_s2] +1187 [label,thessalia_b2_s1] +1188 [label,thessalia_b3_s1] +1189 [label,thessalia_b3_s2] +1190 [label,thessalia_b2_s2] +1191 [if_button,player_kit_tailor_torso_man:plain] +1192 [if_button,player_kit_tailor_torso_man:light_buttons] +1193 [if_button,player_kit_tailor_torso_man:jacket] +1194 [if_button,player_kit_tailor_torso_man:dark_buttons] +1195 [if_button,player_kit_tailor_torso_man:stitching] +1196 [if_button,player_kit_tailor_torso_man:shirt] +1197 [if_button,player_kit_tailor_torso_man:two_toned] +1198 [if_button,player_kit_tailor_torso_man:regular] +1199 [if_button,player_kit_tailor_torso_man:musclebound] +1200 [if_button,player_kit_tailor_torso_man:loose_sleeved] +1201 [if_button,player_kit_tailor_torso_man:large_cuffed] +1202 [if_button,player_kit_tailor_torso_man:thin_sleeved] +1203 [if_button,player_kit_tailor_torso_man:shoulder_pads] +1204 [if_button,player_kit_tailor_torso_man:khaki] +1205 [if_button,player_kit_tailor_torso_man:black] +1206 [if_button,player_kit_tailor_torso_man:crimson] +1207 [if_button,player_kit_tailor_torso_man:navy] +1208 [if_button,player_kit_tailor_torso_man:straw] +1209 [if_button,player_kit_tailor_torso_man:white] +1210 [if_button,player_kit_tailor_torso_man:red] +1211 [if_button,player_kit_tailor_torso_man:blue] +1212 [if_button,player_kit_tailor_torso_man:green] +1213 [if_button,player_kit_tailor_torso_man:yellow] +1214 [if_button,player_kit_tailor_torso_man:purple] +1215 [if_button,player_kit_tailor_torso_man:orange] +1216 [if_button,player_kit_tailor_torso_man:rose] +1217 [if_button,player_kit_tailor_torso_man:lime] +1218 [if_button,player_kit_tailor_torso_man:cyan] +1219 [if_button,player_kit_tailor_torso_man:emerald] +1220 [if_button,player_kit_tailor_torso_man:confirm] +1221 [if_button,player_kit_tailor_legs_man:plain] +1222 [if_button,player_kit_tailor_legs_man:shorts] +1223 [if_button,player_kit_tailor_legs_man:flares] +1224 [if_button,player_kit_tailor_legs_man:turn_ups] +1225 [if_button,player_kit_tailor_legs_man:khaki] +1226 [if_button,player_kit_tailor_legs_man:black] +1227 [if_button,player_kit_tailor_legs_man:crimson] +1228 [if_button,player_kit_tailor_legs_man:navy] +1229 [if_button,player_kit_tailor_legs_man:straw] +1230 [if_button,player_kit_tailor_legs_man:white] +1231 [if_button,player_kit_tailor_legs_man:red] +1232 [if_button,player_kit_tailor_legs_man:blue] +1233 [if_button,player_kit_tailor_legs_man:green] +1234 [if_button,player_kit_tailor_legs_man:yellow] +1235 [if_button,player_kit_tailor_legs_man:purple] +1236 [if_button,player_kit_tailor_legs_man:orange] +1237 [if_button,player_kit_tailor_legs_man:rose] +1238 [if_button,player_kit_tailor_legs_man:lime] +1239 [if_button,player_kit_tailor_legs_man:cyan] +1240 [if_button,player_kit_tailor_legs_man:emerald] +1241 [if_button,player_kit_tailor_legs_man:confirm] +1242 [if_button,player_kit_tailor_torso_woman:plain] +1243 [if_button,player_kit_tailor_torso_woman:crop_top] +1244 [if_button,player_kit_tailor_torso_woman:polo_neck] +1245 [if_button,player_kit_tailor_torso_woman:simple] +1246 [if_button,player_kit_tailor_torso_woman:torn] +1247 [if_button,player_kit_tailor_torso_woman:short_sleeves] +1248 [if_button,player_kit_tailor_torso_woman:bare_arms] +1249 [if_button,player_kit_tailor_torso_woman:muscley] +1250 [if_button,player_kit_tailor_torso_woman:long_sleeved] +1251 [if_button,player_kit_tailor_torso_woman:large_cuffs] +1252 [if_button,player_kit_tailor_torso_woman:com_91] +1253 [if_button,player_kit_tailor_torso_woman:com_92] +1254 [if_button,player_kit_tailor_torso_woman:com_93] +1255 [if_button,player_kit_tailor_torso_woman:com_94] +1256 [if_button,player_kit_tailor_torso_woman:com_95] +1257 [if_button,player_kit_tailor_torso_woman:com_96] +1258 [if_button,player_kit_tailor_torso_woman:com_97] +1259 [if_button,player_kit_tailor_torso_woman:com_98] +1260 [if_button,player_kit_tailor_torso_woman:com_99] +1261 [if_button,player_kit_tailor_torso_woman:com_100] +1262 [if_button,player_kit_tailor_torso_woman:com_101] +1263 [if_button,player_kit_tailor_torso_woman:com_102] +1264 [if_button,player_kit_tailor_torso_woman:com_103] +1265 [if_button,player_kit_tailor_torso_woman:com_104] +1266 [if_button,player_kit_tailor_torso_woman:com_105] +1267 [if_button,player_kit_tailor_torso_woman:com_106] +1268 [if_button,player_kit_tailor_torso_woman:confirm] +1269 [if_button,player_kit_tailor_legs_woman:com_133] +1270 [if_button,player_kit_tailor_legs_woman:com_134] +1271 [if_button,player_kit_tailor_legs_woman:com_135] +1272 [if_button,player_kit_tailor_legs_woman:com_136] +1273 [if_button,player_kit_tailor_legs_woman:com_137] +1274 [if_button,player_kit_tailor_legs_woman:com_138] +1275 [if_button,player_kit_tailor_legs_woman:com_139] +1276 [if_button,player_kit_tailor_legs_woman:com_140] +1277 [if_button,player_kit_tailor_legs_woman:com_91] +1278 [if_button,player_kit_tailor_legs_woman:com_92] +1279 [if_button,player_kit_tailor_legs_woman:com_93] +1280 [if_button,player_kit_tailor_legs_woman:com_94] +1281 [if_button,player_kit_tailor_legs_woman:com_95] +1282 [if_button,player_kit_tailor_legs_woman:com_96] +1283 [if_button,player_kit_tailor_legs_woman:com_97] +1284 [if_button,player_kit_tailor_legs_woman:com_98] +1285 [if_button,player_kit_tailor_legs_woman:com_99] +1286 [if_button,player_kit_tailor_legs_woman:com_100] +1287 [if_button,player_kit_tailor_legs_woman:com_101] +1288 [if_button,player_kit_tailor_legs_woman:com_102] +1289 [if_button,player_kit_tailor_legs_woman:com_103] +1290 [if_button,player_kit_tailor_legs_woman:com_104] +1291 [if_button,player_kit_tailor_legs_woman:com_105] +1292 [if_button,player_kit_tailor_legs_woman:com_106] +1293 [if_button,player_kit_tailor_legs_woman:confirm] +1294 [label,thessalia_finished_makeover] +1295 [opnpc1,tramp_orange] +1296 [label,tramp_phoenixmember] +1297 [opnpc1,valaine] +1298 [oploc1,varrock_palace_plaque] +1299 [opnpc1,shop_keeper_varrock_swordshop] +1300 [opnpc1,shop_assistant_varrock_swordshop] +1301 [label,varrock_swordshop_talk] +1302 [opnpc1,weaponsmaster] +1303 [label,weaponsmaster_stop] +1304 [opnpc1,wilough] +1305 [opnpc1,zaff] +1306 [opnpc3,zaff] +1307 [proc,openshop_zaff] +1308 [opnpc1,mountain_dwarf] +1309 [label,mountain_dwarf_start] +1310 [label,mountain_dwarf_stairs] +1311 [label,mountain_dwarf_bigger] +1312 [label,mountain_dwarf_didnt_want] +1313 [label,mountain_dwarf_why] +1314 [label,mountain_dwarf_private] +1315 [label,mountain_dwarf_friends] +1316 [label,mountain_dwarf_spare_pass] +1317 [label,mountain_dwarf_grumpy] +1318 [label,mountain_dwarf_won] +1319 [opnpc1,_bandit_camp_leader] +1320 [opnpc1,fat_tony] +1321 [label,fat_tony_gourmet] +1322 [label,fat_tony_pizza] +1323 [label,fat_tony_leave] +1324 [ai_queue1,king_black_dragon] +1325 [ai_queue3,king_black_dragon] +1326 [ai_applayer2,king_black_dragon] +1327 [ai_opplayer2,king_black_dragon] +1328 [proc,kbd_random_attack] +1329 [proc,kbd_dragonfire_far] +1330 [proc,kbd_dragonfire_close] +1331 [proc,kbd_toxic_breath] +1332 [proc,kbd_shocking_breath] +1333 [proc,kbd_icy_breath] +1334 [queue,kbd_freeze_player] +1335 [walktrigger,kbd_frozen] +1336 [proc,kbd_special_breath] +1337 [proc,kbd_fiery_breath_maxhit] +1338 [proc,kbd_special_breath_maxhit] +1339 [oploc1,loc_1816] +1340 [oploc1,loc_1817] +1341 [oploc1,muddy_chest_closed] +1342 [oplocu,muddy_chest_closed] +1343 [oploc1,loc_1766] +1344 [oploc1,loc_1767] +1345 [oploc1,loc_1768] +1346 [opnpc1,noterazzo] +1347 [proc,wilderness_level] +1348 [opnpc1,sedridor] +1349 [opnpcu,sedridor] +1350 [label,rune_mysteries] +1351 [label,sedridor_2] +1352 [label,seridor_3] +1353 [label,sedridor_incredible] +1354 [label,sedridor_nothing] +1355 [ai_queue1,wizard] +1356 [ai_opplayer2,wizard] +1357 [ai_applayer2,wizard] +1358 [ai_queue1,wizard_grayzag] +1359 [ai_applayer2,wizard_grayzag] +1360 [ai_opplayer2,wizard_grayzag] +1361 [proc,npc_spawn_imp_attack] +1362 [opnpc1,wizard_mizgog] +1363 [label,mizgog_givequest] +1364 [label,mizgog_quiet] +1365 [oploc1,loc_2290] +1366 [oploc1,loc_2303] +1367 [oploc1,loc_2317] +1368 [oploc1,loc_2318] +1369 [oploc1,loc_377] +1370 [oplocu,loc_377] +1371 [oploc1,loc_412] +1372 [opnpc1,bartender_dragoninn] +1373 [opnpcu,bartender_dragoninn] +1374 [label,dragoninn_barcrawl] +1375 [opnpc1,colonel_radick] +1376 [oploc1,_magic_guild_dungeon_door] +1377 [oploc1,loc_1600] +1378 [oploc1,loc_1601] +1379 [label,open_mageguild_door] +1380 [oploc1,loc_2156] +1381 [oploc1,loc_2157] +1382 [oploc1,loc_2158] +1383 [opnpc1,magic_store_owner] +1384 [opnpc1,sigbert_the_adventurer] +1385 [opnpc1,tower_guard] +1386 [opnpc1,wizard_disentor] +1387 [opnpc1,wizard_frumscone] +1388 [opnpc1,helemos] +1389 [opnpc1,abbot_langley] +1390 [label,ask_to_join_abbot_langley] +1391 [label,can_you_heal_me_im_injured] +1392 [opnpc1,brother_jered] +1393 [ai_opplayer2,monk] +1394 [label,monk_heal_self] +1395 [opnpc1,monk] +1396 [label,monk_heal_player] +1397 [label,ask_to_join_monk] +1398 [label,isnt_this_place_built_a_bit_out_the_way] +1399 [oploc1,loc_2641] +1400 [label,ask_to_join_abbot_langley2] +1401 [oploc1,loc_2640] +1402 [proc,door_open] +1403 [proc,door_close] +1404 [proc,door_open_mirrored] +1405 [proc,door_close_mirrored] +1406 [proc,door_close_move_player_out_of_way] +1407 [proc,door_open_move_player_out_of_way] +1408 [proc,check_axis] +1409 [proc,check_axis_locactive] +1410 [proc,movecoord_loc_return] +1411 [proc,loc_shape_debug] +1412 [oploc1,_door_closed] +1413 [oploc1,_door_opened] +1414 [oploc1,_door_left_closed] +1415 [oploc1,_door_right_closed] +1416 [oploc1,_door_left_opened] +1417 [oploc1,_door_right_opened] +1418 [oploc1,loc_1596] +1419 [oploc1,loc_1597] +1420 [proc,open_double_doors_left] +1421 [proc,open_double_doors_right] +1422 [proc,close_double_doors_left] +1423 [proc,close_double_doors_right] +1424 [oploc1,_door_open_and_close] +1425 [proc,open_and_close_door] +1426 [proc,open_and_close_door2] +1427 [proc,open_and_close_metal_gate] +1428 [proc,open_and_close_metal_gate2] +1429 [oploc1,_double_door_open_and_close_left] +1430 [oploc1,_double_door_open_and_close_right] +1431 [proc,open_and_close_double_door] +1432 [proc,open_and_close_double_door2] +1433 [ai_queue3,bandit] +1434 [ai_queue3,_bandit_camp_leader] +1435 [ai_queue3,_barbarian] +1436 [ai_queue3,gunthor_the_brave] +1437 [ai_queue3,_bear] +1438 [ai_queue3,_black_demon] +1439 [ai_queue3,black_dragon] +1440 [ai_queue3,npc_178] +1441 [ai_queue3,npc_179] +1442 [label,black_knight_drops] +1443 [ai_queue3,blue_dragon] +1444 [ai_queue3,chaos_druid] +1445 [ai_queue3,chaos_druid_warrior] +1446 [ai_queue3,npc_119] +1447 [ai_queue3,_chicken] +1448 [ai_queue3,_cow] +1449 [ai_queue3,dark_warrior] +1450 [ai_queue3,dark_wizard_earth] +1451 [ai_queue3,dark_wizard_water] +1452 [proc,roll_on_drop_table] +1453 [ai_queue3,druid] +1454 [ai_queue3,_duck] +1455 [ai_queue3,npc_118] +1456 [ai_queue3,npc_120] +1457 [label,dwarf_drop_table] +1458 [ai_queue3,npc_124] +1459 [ai_queue3,farmer] +1460 [ai_queue3,fire_giant] +1461 [ai_queue3,npc_86] +1462 [ai_queue3,npc_87] +1463 [label,rat_droptable] +1464 [ai_queue3,goblin_unarmed1] +1465 [ai_queue3,goblin_armed] +1466 [ai_queue3,goblin_unarmed2] +1467 [ai_queue3,goblin_guard] +1468 [label,goblin_drop_table] +1469 [ai_queue3,goblin_armed_green] +1470 [ai_queue3,goblin_armed_red] +1471 [label,goblin_village_drop_table] +1472 [ai_queue3,greater_demon] +1473 [ai_queue3,green_dragon] +1474 [ai_queue3,_guard] +1475 [ai_queue3,guard_dog] +1476 [ai_queue3,highwayman] +1477 [ai_queue3,hobgoblin] +1478 [ai_queue3,hobgoblin_armed] +1479 [ai_queue3,ice_giant] +1480 [ai_queue3,ice_warrior] +1481 [ai_queue3,imp] +1482 [ai_queue3,jailer] +1483 [ai_queue3,jogre] +1484 [opnpc1,jonny_the_beard] +1485 [ai_queue3,jonny_the_beard] +1486 [ai_queue3,lesser_demon] +1487 [label,ai_queue3_lesser_demon] +1488 [ai_queue3,_citizen] +1489 [ai_queue3,alkharid_warrior] +1490 [ai_queue3,thief] +1491 [ai_queue3,npc_282] +1492 [label,man_drop_table] +1493 [ai_queue3,_monk_of_zamorak] +1494 [ai_queue3,moss_giant] +1495 [ai_queue3,npc_175] +1496 [ai_queue3,otherworldly_being] +1497 [ai_queue3,paladin] +1498 [ai_queue3,_pirate] +1499 [ai_queue3,rat] +1500 [ai_queue3,red_dragon] +1501 [ai_queue3,rogue] +1502 [ai_queue2,salarin_the_twisted] +1503 [ai_queue3,salarin_the_twisted] +1504 [proc,randomherb] +1505 [proc,randomjewel] +1506 [proc,ultrarare_getitem] +1507 [proc,megararetable] +1508 [proc,randomjunk] +1509 [ai_queue3,npc_90] +1510 [ai_queue3,npc_91] +1511 [label,skeleton_unarmed] +1512 [ai_queue3,npc_92] +1513 [ai_queue3,npc_93] +1514 [label,skeleton_armed] +1515 [ai_queue3,thug] +1516 [ai_queue3,npc_840] +1517 [ai_queue3,_unicorn] +1518 [ai_queue3,wizard] +1519 [ai_queue3,soldier] +1520 [ai_queue3,tower_guard] +1521 [ai_queue3,colonel_radick] +1522 [label,yanille_soldier_tower_guard] +1523 [ai_queue3,zombie_entrana] +1524 [ai_queue3,npc_73] +1525 [ai_queue3,npc_74] +1526 [label,unarmed_zombie] +1527 [ai_queue3,npc_75] +1528 [label,armed_zombie] +1529 [if_button,book:com_2] +1530 [if_button,book:com_4] +1531 [proc,book] +1532 [proc,book_page] +1533 [label,book_flip_page] +1534 [label,exit] +1535 [ai_timer,_chicken] +1536 [ai_timer,cow_1] +1537 [ai_timer,cow_2] +1538 [ai_timer,cow_3] +1539 [label,cow_moo] +1540 [ai_timer,drake] +1541 [ai_timer,duck] +1542 [ai_timer,duckling] +1543 [label,duck_quack] +1544 [ai_timer,sheep_sheared] +1545 [ai_timer,sheep_fluffy] +1546 [label,sheep_baa] +1547 [ai_timer,zombie_entrana] +1548 [ai_timer,npc_73] +1549 [ai_timer,npc_74] +1550 [ai_timer,npc_75] +1551 [ai_timer,melzar_maze_zombie] +1552 [label,zombie_brains] +1553 [proc,require_members_feature] +1554 [proc,require_members_store_owner] +1555 [proc,require_members_skill_experience] +1556 [proc,require_members_do_that] +1557 [proc,require_members_prayer] +1558 [proc,require_members_fletching] +1559 [proc,require_members_gate] +1560 [label,you_need_to_be_on_a_members_server_to_use_this_feature] +1561 [label,sorry_but_you_need_to_be_on_a_members_server_to_talk_to_this_store_owner] +1562 [label,you_need_to_be_on_a_members_server_to_gain_experience_in_that_skill] +1563 [label,you_need_to_be_on_a_members_world_to_gain_experience_in_agility] +1564 [label,you_need_to_be_on_a_members_world_to_gain_experience_in_herblore] +1565 [label,you_need_to_be_on_a_members_world_to_gain_experience_in_thieving] +1566 [label,you_need_to_be_on_a_members_world_to_gain_experience_in_fletching] +1567 [label,you_need_to_subscribe_for_a_members_account_if_you_want_to_store_any_more_items_in_the_bank] +1568 [label,you_need_to_be_on_a_members_server_to_use_this_prayer] +1569 [label,you_must_be_on_a_members_world_to_do_that] +1570 [label,you_need_to_be_on_a_members_server_to_use_this_gate] +1571 [proc,obj_gettotal] +1572 [proc,inv_slotspace] +1573 [proc,coord_lineofwalk_radius] +1574 [proc,coord_lineofwalk_radius2] +1575 [proc,inmap] +1576 [proc,mapsquare] +1577 [proc,mapsquare_to_coord] +1578 [proc,coord_lineofsight_radius] +1579 [proc,coord_unpack] +1580 [proc,coord_tostring] +1581 [proc,inzone_coord_pair_table] +1582 [proc,.inzone_coord_pair_table] +1583 [proc,coord_direction] +1584 [proc,coord_direction2] +1585 [proc,movecoord_indirection] +1586 [proc,closest_enum_coord] +1587 [proc,closest_enum_coord_and_index] +1588 [proc,total_distance] +1589 [proc,playercount_coord_pair_table] +1590 [proc,displaymessage] +1591 [proc,enum_containsintvalue] +1592 [proc,inv_delcat] +1593 [proc,loc_within_distance] +1594 [proc,multiply2] +1595 [proc,add2] +1596 [proc,sub2] +1597 [proc,divide2] +1598 [proc,not_bool] +1599 [proc,npc_findcount] +1600 [proc,.npc_findcount] +1601 [label,opheldu_make_item] +1602 [proc,random_player_within_distance] +1603 [proc,random_range] +1604 [label,not_written_yet] +1605 [proc,sound_synth_area] +1606 [proc,.sound_synth_area] +1607 [proc,add_article] +1608 [proc,pluralise] +1609 [proc,string_right] +1610 [proc,string_removeright] +1611 [proc,string_left] +1612 [proc,string_removeleft] +1613 [proc,singularise] +1614 [proc,string_isnullorempty] +1615 [proc,tostring_boolean] +1616 [opobj3,wine_of_zamorak] +1617 [proc,wine_of_zamorak_attack] +1618 [proc,set_monk_aggro] +1619 [proc,scale_by_playercount] +1620 [proc,send_quest_progress] +1621 [proc,send_quest_progress_colour] +1622 [proc,send_quest_complete] +1623 [proc,quest_complete_interface] +1624 [proc,update_quests] +1625 [label,scroll_pirate_message] +1626 [label,scroll_elena_hangover_cure_recipe] +1627 [label,scroll_barcrawl_card] +1628 [if_close,scroll] +1629 [proc,seqlength20ms] +1630 [proc,slash_checker] +1631 [opheld1,lamp] +1632 [if_button,xplamp:attack] +1633 [if_button,xplamp:strength] +1634 [if_button,xplamp:ranged] +1635 [if_button,xplamp:magic] +1636 [if_button,xplamp:defence] +1637 [if_button,xplamp:hitpoints] +1638 [if_button,xplamp:prayer] +1639 [if_button,xplamp:agility] +1640 [if_button,xplamp:herblore] +1641 [if_button,xplamp:thieving] +1642 [if_button,xplamp:crafting] +1643 [if_button,xplamp:runecraft] +1644 [if_button,xplamp:mining] +1645 [if_button,xplamp:smithing] +1646 [if_button,xplamp:fishing] +1647 [if_button,xplamp:cooking] +1648 [if_button,xplamp:firemaking] +1649 [if_button,xplamp:woodcutting] +1650 [if_button,xplamp:fletching] +1651 [if_button,xplamp:confirm] +1652 [label,xplamp_select] +1653 [label,xplamp_select_stat] +1654 [label,xplamp_confirm] +1655 [oplocu,loc_364] +1656 [oplocu,loc_885] +1657 [label,fill_beer_glass] +1658 [oploc1,_bookcase] +1659 [oploc1,_chest_closed] +1660 [oploc3,_chest_open] +1661 [oploc2,_chest_open] +1662 [proc,open_chest] +1663 [proc,close_chest] +1664 [oploc1,loc_398] +1665 [oploc1,loc_399] +1666 [oploc1,_empty_crate] +1667 [oploc1,_empty_crates] +1668 [oploc1,_empty_boxes] +1669 [oploc1,_cupboard_closed] +1670 [oploc1,_cupboard_opened] +1671 [oploc2,_cupboard_opened] +1672 [oploc2,loc_370] +1673 [oploc3,loc_370] +1674 [oploc2,loc_371] +1675 [oploc3,loc_371] +1676 [oploc2,loc_372] +1677 [oploc3,loc_372] +1678 [label,search_cupboard] +1679 [label,open_cupboard] +1680 [label,close_cupboard] +1681 [proc,cupboards_use_message] +1682 [label,cupboard_take_garlic] +1683 [oploc1,_drawer] +1684 [oplocu,_drawer] +1685 [oploc2,_empty_drawer] +1686 [oploc3,_empty_drawer] +1687 [oploc1,loc_2068] +1688 [proc,gangplank_dir_mod] +1689 [oploc1,_gangplank_board] +1690 [oploc1,_gangplank_disembark] +1691 [proc,gate_set_open] +1692 [proc,gate_set_close] +1693 [proc,get_pair_coord] +1694 [proc,open_gate] +1695 [proc,close_gate] +1696 [oploc1,_gate_main_closed] +1697 [oploc1,_gate_outer_closed] +1698 [oploc1,_gate_main_open] +1699 [oploc1,_gate_outer_open] +1700 [ai_queue3,giant] +1701 [oplocu,hat_stand] +1702 [oploc1,loc_298] +1703 [oploc1,loc_299] +1704 [oploc1,loc_300] +1705 [oploc1,loc_304] +1706 [label,search_haybale] +1707 [oploc1,loc_1591] +1708 [oploc1,_locked_gate] +1709 [oploc1,loc_881] +1710 [oploc1,loc_882] +1711 [oploc1,loc_883] +1712 [opheld1,mithril_seeds] +1713 [proc,random_flowers] +1714 [proc,flowers_obj] +1715 [proc,free_mithseed_spot] +1716 [opheld1,newcomer_map] +1717 [oploc2,loc_312] +1718 [oploc2,loc_313] +1719 [oploc2,onion] +1720 [oploc2,cabbage] +1721 [oploc2,flax_ground] +1722 [oploc1,loc_365] +1723 [opnpcu,sheep_fluffy] +1724 [opnpcu,sheep_sheared] +1725 [opheld1,spade] +1726 [oplocu,_usable_table] +1727 [oplocu,_unusable_table] +1728 [oploc1,loc_1568] +1729 [oploc1,loc_1570] +1730 [oploc2,loc_1570] +1731 [oploc1,loc_388] +1732 [oploc2,loc_389] +1733 [oploc3,loc_389] +1734 [oploc2,loc_390] +1735 [oploc3,loc_390] +1736 [opheldu,bowl_water] +1737 [opheldu,bucket_water] +1738 [opheldu,jug_of_water] +1739 [opheldu,bucket_empty] +1740 [opheldu,jug_empty] +1741 [opheldu,bowl_empty] +1742 [label,water_fill] +1743 [oplocu,_watersource] +1744 [label,fill_container_water] +1745 [oploc1,loc_733] +1746 [oplocu,loc_733] +1747 [label,cut_web] +1748 [oploc1,millbase] +1749 [oploc1,millbase_full] +1750 [oplocu,millbase] +1751 [oplocu,millbase_full] +1752 [label,millbase_take] +1753 [label,empty_flour_bin] +1754 [label,take_flour_bin] +1755 [oplocu,hopper_full] +1756 [oplocu,_hopper_nonfull] +1757 [oploc1,_hoppercontrol] +1758 [inv_button1,bank_main:inv] +1759 [inv_button2,bank_main:inv] +1760 [inv_button3,bank_main:inv] +1761 [inv_button4,bank_main:inv] +1762 [inv_button5,bank_main:inv] +1763 [inv_buttond,bank_main:inv] +1764 [if_button,bank_main:com_94] +1765 [if_button,bank_main:com_93] +1766 [if_close,bank_main] +1767 [label,openbank] +1768 [label,closebank] +1769 [label,bank_withdraw] +1770 [proc,bank_withdraw_request] +1771 [proc,bank_deposit_request] +1772 [proc,bank_check_nobreak] +1773 [label,a_magical_force_prevents_you_from_banking_this_item] +1774 [proc,reorganize_bank] +1775 [proc,bank_peek_next_available_obj_slot] +1776 [proc,bank_find_obj_unbankable] +1777 [oploc1,bank_booth] +1778 [oploc2,bank_booth] +1779 [inv_button1,bank_side:inv] +1780 [inv_button2,bank_side:inv] +1781 [inv_button3,bank_side:inv] +1782 [inv_button4,bank_side:inv] +1783 [inv_button5,bank_side:inv] +1784 [inv_buttond,bank_side:inv] +1785 [label,bank_deposit] +1786 [opnpc1,npc_498] +1787 [opnpc1,npc_499] +1788 [apnpc1,_bank_teller] +1789 [label,talk_to_banker] +1790 [proc,set_sail] +1791 [proc,p_choice2] +1792 [proc,p_choice2_header] +1793 [proc,p_choice3] +1794 [proc,p_choice3_header] +1795 [proc,p_choice4] +1796 [proc,p_choice4_header] +1797 [proc,p_choice5] +1798 [proc,p_choice5_header] +1799 [label,multi2] +1800 [label,multi3] +1801 [label,multi4] +1802 [label,multi5] +1803 [label,multi2_header] +1804 [label,multi3_header] +1805 [label,multi4_header] +1806 [label,multi5_header] +1807 [proc,chatplayer_page] +1808 [proc,chatplayer] +1809 [proc,chatnpc_page] +1810 [proc,chatnpc] +1811 [proc,.chatnpc] +1812 [proc,chatnpcrange] +1813 [proc,.chatnpcrange] +1814 [proc,chatnpcnoturn] +1815 [proc,.chatnpcnoturn] +1816 [proc,chatnpc_specific] +1817 [proc,mesbox_page] +1818 [proc,mesbox] +1819 [proc,.mesbox_page] +1820 [proc,.mesbox] +1821 [proc,objbox_page] +1822 [proc,objbox] +1823 [proc,objboxt] +1824 [proc,objboxb] +1825 [proc,doubleobjbox_page] +1826 [proc,doubleobjbox] +1827 [proc,multiobj2] +1828 [proc,multiobj3] +1829 [if_button,multiobj3_close:com_8] +1830 [proc,multiobj3_close] +1831 [proc,multiobj4] +1832 [if_button,controls:com_2] +1833 [if_button,controls:com_3] +1834 [queue,set_auto_retaliate] +1835 [if_button,controls:com_4] +1836 [if_button,controls:com_5] +1837 [queue,set_run] +1838 [if_button,controls:com_13] +1839 [if_button,controls:com_14] +1840 [if_button,controls:com_15] +1841 [if_button,controls:com_16] +1842 [if_button,controls:com_17] +1843 [if_button,controls:com_18] +1844 [if_button,controls:com_19] +1845 [if_button,controls:com_20] +1846 [if_button,controls:com_21] +1847 [if_button,controls:com_22] +1848 [if_button,controls:com_23] +1849 [if_button,controls:com_24] +1850 [label,controls_emote] +1851 [if_button,options:com_0] +1852 [if_button,options:com_1] +1853 [if_button,options:com_2] +1854 [if_button,options:com_3] +1855 [if_button,options:com_4] +1856 [if_button,options:com_5] +1857 [if_button,options:com_6] +1858 [if_button,options:com_7] +1859 [if_button,options:com_8] +1860 [if_button,options:com_9] +1861 [if_button,options:com_10] +1862 [if_button,options:com_11] +1863 [if_button,options:com_25] +1864 [if_button,options:com_26] +1865 [if_button,options:com_27] +1866 [if_button,options:com_28] +1867 [if_button,options:com_29] +1868 [if_button,options:com_36] +1869 [if_button,options:com_37] +1870 [if_button,options:com_38] +1871 [if_button,options:com_39] +1872 [if_button,options:com_40] +1873 [if_button,options:com_47] +1874 [if_button,options:com_48] +1875 [if_button,options_ld:com_0] +1876 [if_button,options_ld:com_1] +1877 [if_button,options_ld:com_2] +1878 [if_button,options_ld:com_3] +1879 [if_button,options_ld:com_4] +1880 [if_button,options_ld:com_5] +1881 [if_button,options_ld:com_6] +1882 [if_button,options_ld:com_7] +1883 [if_button,options_ld:com_8] +1884 [if_button,options_ld:com_9] +1885 [if_button,options_ld:com_10] +1886 [if_button,options_ld:com_11] +1887 [if_button,options_ld:com_28] +1888 [if_button,options_ld:com_29] +1889 [proc,moveallinv] +1890 [proc,.moveallinv] +1891 [opplayer4,_] +1892 [if_button,trademain:accept] +1893 [proc,enough_trade_space] +1894 [proc,.enough_trade_space] +1895 [if_close,trademain] +1896 [if_button,tradeconfirm:accept] +1897 [if_close,tradeconfirm] +1898 [inv_button1,trademain:inv] +1899 [inv_button2,trademain:inv] +1900 [inv_button3,trademain:inv] +1901 [inv_button4,trademain:inv] +1902 [inv_button5,trademain:inv] +1903 [label,removefromtrade] +1904 [inv_button1,tradeside:inv] +1905 [inv_button2,tradeside:inv] +1906 [inv_button3,tradeside:inv] +1907 [inv_button4,tradeside:inv] +1908 [inv_button5,tradeside:inv] +1909 [label,movetotrade] +1910 [oploc1,loc_245] +1911 [oploc1,loc_246] +1912 [oploc1,loc_272] +1913 [oploc1,loc_273] +1914 [oploc1,loc_2147] +1915 [oploc1,loc_1746] +1916 [oploc1,loc_1747] +1917 [oploc1,loc_1748] +1918 [oploc2,loc_1748] +1919 [oploc3,loc_1748] +1920 [oploc1,loc_1749] +1921 [oploc1,loc_1750] +1922 [oploc1,loc_1754] +1923 [oploc1,loc_1755] +1924 [oploc1,loc_1757] +1925 [oploc1,loc_1759] +1926 [oploc1,loc_1765] +1927 [oploc1,loc_2148] +1928 [oploc1,loc_2405] +1929 [oploc1,loc_2884] +1930 [oploc2,loc_2884] +1931 [oploc3,loc_2884] +1932 [oploc1,loc_3205] +1933 [label,climb_ladder] +1934 [label,ladder_options] +1935 [label,unhandled_ladder] +1936 [oploc1,loc_1722] +1937 [oploc1,loc_1723] +1938 [oploc1,loc_1728] +1939 [oploc1,loc_1729] +1940 [oploc1,loc_1730] +1941 [oploc1,loc_1731] +1942 [oploc1,loc_1733] +1943 [oploc1,loc_1734] +1944 [oploc1,loc_1736] +1945 [oploc1,loc_1737] +1946 [oploc1,loc_1738] +1947 [oploc1,loc_1739] +1948 [oploc2,loc_1739] +1949 [oploc3,loc_1739] +1950 [oploc1,loc_1740] +1951 [oploc1,loc_1742] +1952 [oploc1,loc_1744] +1953 [oploc1,loc_2316] +1954 [oploc1,loc_2616] +1955 [oploc1,loc_2617] +1956 [oploc1,loc_1725] +1957 [oploc1,loc_1726] +1958 [label,stair_options] +1959 [label,unhandled_stairs] +1960 [label,levelrequire_attack] +1961 [label,levelrequire_defence] +1962 [label,levelrequire_ranged] +1963 [label,levelrequire_magic_and_attack] +1964 [label,levelrequire_ranged_and_defence] +1965 [label,levelrequire_dragon_slayer_quest_attack] +1966 [label,levelrequire_dragon_slayer_quest_defence] +1967 [label,levelrequire_dragon_slayer_quest_ranged_and_defence] +1968 [label,levelrequire_heroes_quest_attack] +1969 [label,levelrequire_legends_quest_defence] +1970 [label,levelrequire_zanaris_quest_attack] +1971 [proc,levelrequire_dragon_slayer_quest] +1972 [proc,levelrequire_heroes_quest] +1973 [proc,levelrequire_legends_quest] +1974 [proc,levelrequire_zanaris_quest] +1975 [label,levelrequire_iban_staff] +1976 [opheld2,bronze_dagger] +1977 [opheld2,bronze_dagger_p] +1978 [opheld2,bronze_axe] +1979 [opheld2,bronze_pickaxe] +1980 [opheld2,bronze_mace] +1981 [opheld2,bronze_sword] +1982 [opheld2,bronze_scimitar] +1983 [opheld2,bronze_longsword] +1984 [opheld2,bronze_warhammer] +1985 [opheld2,bronze_battleaxe] +1986 [opheld2,bronze_spear] +1987 [opheld2,bronze_spear_p] +1988 [opheld2,bronze_2h_sword] +1989 [opheld2,bronze_dart] +1990 [opheld2,bronze_dart_p] +1991 [opheld2,bronze_knife] +1992 [opheld2,bronze_knife_p] +1993 [opheld2,bronze_thrownaxe] +1994 [opheld2,bronze_med_helm] +1995 [opheld2,bronze_full_helm] +1996 [opheld2,bronze_sq_shield] +1997 [opheld2,bronze_kiteshield] +1998 [opheld2,bronze_platelegs] +1999 [opheld2,bronze_plateskirt] +2000 [opheld2,bronze_chainbody] +2001 [opheld2,bronze_platebody] +2002 [opheld2,iron_dagger] +2003 [opheld2,iron_dagger_p] +2004 [opheld2,iron_axe] +2005 [opheld2,iron_pickaxe] +2006 [opheld2,iron_mace] +2007 [opheld2,iron_sword] +2008 [opheld2,iron_scimitar] +2009 [opheld2,iron_longsword] +2010 [opheld2,iron_warhammer] +2011 [opheld2,iron_battleaxe] +2012 [opheld2,iron_spear] +2013 [opheld2,iron_spear_p] +2014 [opheld2,iron_2h_sword] +2015 [opheld2,iron_dart] +2016 [opheld2,iron_dart_p] +2017 [opheld2,iron_knife] +2018 [opheld2,iron_knife_p] +2019 [opheld2,iron_thrownaxe] +2020 [opheld2,iron_med_helm] +2021 [opheld2,iron_full_helm] +2022 [opheld2,iron_sq_shield] +2023 [opheld2,iron_kiteshield] +2024 [opheld2,iron_platelegs] +2025 [opheld2,iron_plateskirt] +2026 [opheld2,iron_chainbody] +2027 [opheld2,iron_platebody] +2028 [opheld2,crossbow] +2029 [opheld2,longbow] +2030 [opheld2,shortbow] +2031 [opheld2,leather_gloves] +2032 [opheld2,leather_boots] +2033 [opheld2,leather_vambraces] +2034 [opheld2,leather_chaps] +2035 [opheld2,leather_body] +2036 [opheld2,leather_cowl] +2037 [opheld2,plainstaff] +2038 [opheld2,staff_of_air] +2039 [opheld2,staff_of_water] +2040 [opheld2,staff_of_earth] +2041 [opheld2,staff_of_fire] +2042 [opheld2,magicstaff] +2043 [opheld2,black_dagger] +2044 [opheld2,black_dagger_p] +2045 [opheld2,black_axe] +2046 [opheld2,black_mace] +2047 [opheld2,black_sword] +2048 [opheld2,black_scimitar] +2049 [opheld2,black_longsword] +2050 [opheld2,black_warhammer] +2051 [opheld2,black_battleaxe] +2052 [opheld2,black_2h_sword] +2053 [opheld2,black_knife] +2054 [opheld2,black_knife_p] +2055 [opheld2,black_med_helm] +2056 [opheld2,black_full_helm] +2057 [opheld2,black_sq_shield] +2058 [opheld2,black_kiteshield] +2059 [opheld2,black_platelegs] +2060 [opheld2,black_plateskirt] +2061 [opheld2,black_chainbody] +2062 [opheld2,black_platebody] +2063 [opheld2,black_platebody_trim] +2064 [opheld2,black_platelegs_trim] +2065 [opheld2,black_full_helm_trim] +2066 [opheld2,black_kiteshield_trim] +2067 [opheld2,black_platebody_gold] +2068 [opheld2,black_platelegs_gold] +2069 [opheld2,black_full_helm_gold] +2070 [opheld2,black_kiteshield_gold] +2071 [opheld2,hardleather_body] +2072 [opheld2,mithril_dagger] +2073 [opheld2,mithril_dagger_p] +2074 [opheld2,mithril_axe] +2075 [opheld2,mithril_pickaxe] +2076 [opheld2,mithril_mace] +2077 [opheld2,mithril_sword] +2078 [opheld2,mithril_scimitar] +2079 [opheld2,mithril_longsword] +2080 [opheld2,mithril_warhammer] +2081 [opheld2,mithril_battleaxe] +2082 [opheld2,mithril_spear] +2083 [opheld2,mithril_spear_p] +2084 [opheld2,mithril_2h_sword] +2085 [opheld2,excalibur] +2086 [opheld2,mithril_dart] +2087 [opheld2,mithril_dart_p] +2088 [opheld2,mithril_knife] +2089 [opheld2,mithril_knife_p] +2090 [opheld2,mithril_thrownaxe] +2091 [opheld2,mithril_med_helm] +2092 [opheld2,mithril_full_helm] +2093 [opheld2,mithril_sq_shield] +2094 [opheld2,mithril_kiteshield] +2095 [opheld2,mithril_platelegs] +2096 [opheld2,mithril_plateskirt] +2097 [opheld2,mithril_chainbody] +2098 [opheld2,mithril_platebody] +2099 [opheld2,willow_longbow] +2100 [opheld2,willow_shortbow] +2101 [opheld2,coif] +2102 [opheld2,studded_body] +2103 [opheld2,studded_chaps] +2104 [opheld2,adamant_dagger] +2105 [opheld2,adamant_dagger_p] +2106 [opheld2,adamant_axe] +2107 [opheld2,adamant_pickaxe] +2108 [opheld2,adamant_mace] +2109 [opheld2,adamant_sword] +2110 [opheld2,adamant_scimitar] +2111 [opheld2,adamant_longsword] +2112 [opheld2,adamant_warhammer] +2113 [opheld2,adamant_battleaxe] +2114 [opheld2,adamant_spear] +2115 [opheld2,adamant_spear_p] +2116 [opheld2,adamant_2h_sword] +2117 [opheld2,adamant_dart] +2118 [opheld2,adamant_dart_p] +2119 [opheld2,adamant_knife] +2120 [opheld2,adamant_knife_p] +2121 [opheld2,adamant_thrownaxe] +2122 [opheld2,adamant_med_helm] +2123 [opheld2,adamant_full_helm] +2124 [opheld2,adamant_sq_shield] +2125 [opheld2,adamant_kiteshield] +2126 [opheld2,adamant_platelegs] +2127 [opheld2,adamant_plateskirt] +2128 [opheld2,adamant_chainbody] +2129 [opheld2,adamant_platebody] +2130 [opheld2,adamant_platebody_trim] +2131 [opheld2,adamant_platelegs_trim] +2132 [opheld2,adamant_full_helm_trim] +2133 [opheld2,adamant_kiteshield_trim] +2134 [opheld2,adamant_platebody_gold] +2135 [opheld2,adamant_platelegs_gold] +2136 [opheld2,adamant_full_helm_gold] +2137 [opheld2,adamant_kiteshield_gold] +2138 [opheld2,maple_longbow] +2139 [opheld2,maple_shortbow] +2140 [opheld2,ogre_bow] +2141 [opheld2,battlestaff] +2142 [opheld2,air_battlestaff] +2143 [opheld2,water_battlestaff] +2144 [opheld2,earth_battlestaff] +2145 [opheld2,fire_battlestaff] +2146 [opheld2,rune_dagger] +2147 [opheld2,rune_dagger_p] +2148 [opheld2,rune_axe] +2149 [opheld2,rune_pickaxe] +2150 [opheld2,rune_mace] +2151 [opheld2,rune_sword] +2152 [opheld2,rune_scimitar] +2153 [opheld2,rune_longsword] +2154 [opheld2,rune_warhammer] +2155 [opheld2,rune_battleaxe] +2156 [opheld2,rune_spear] +2157 [opheld2,rune_spear_p] +2158 [opheld2,rune_2h_sword] +2159 [opheld2,rune_dart] +2160 [opheld2,rune_dart_p] +2161 [opheld2,rune_knife] +2162 [opheld2,rune_knife_p] +2163 [opheld2,rune_thrownaxe] +2164 [opheld2,rune_med_helm] +2165 [opheld2,rune_full_helm] +2166 [opheld2,rune_sq_shield] +2167 [opheld2,rune_kiteshield] +2168 [opheld2,rune_platelegs] +2169 [opheld2,rune_plateskirt] +2170 [opheld2,rune_chainbody] +2171 [opheld2,rune_platebody] +2172 [opheld2,rune_platebody_trim] +2173 [opheld2,rune_platelegs_trim] +2174 [opheld2,rune_full_helm_trim] +2175 [opheld2,rune_kiteshield_trim] +2176 [opheld2,rune_platebody_gold] +2177 [opheld2,rune_platelegs_gold] +2178 [opheld2,rune_full_helm_gold] +2179 [opheld2,rune_kiteshield_gold] +2180 [opheld2,rune_platebody_zamorak] +2181 [opheld2,rune_platelegs_zamorak] +2182 [opheld2,rune_full_helm_zamorak] +2183 [opheld2,rune_kiteshield_zamorak] +2184 [opheld2,rune_platebody_saradomin] +2185 [opheld2,rune_platelegs_saradomin] +2186 [opheld2,rune_full_helm_saradomin] +2187 [opheld2,rune_kiteshield_saradomin] +2188 [opheld2,rune_platebody_guthix] +2189 [opheld2,rune_platelegs_guthix] +2190 [opheld2,rune_full_helm_guthix] +2191 [opheld2,rune_kiteshield_guthix] +2192 [opheld2,trail_robin_hood_hat] +2193 [opheld2,trail_ranger_boots] +2194 [opheld2,yew_longbow] +2195 [opheld2,yew_shortbow] +2196 [opheld2,dragonhide_body] +2197 [opheld2,dragonhide_chaps] +2198 [opheld2,dragonhide_vamb] +2199 [opheld2,mystic_fire_staff] +2200 [opheld2,mystic_water_staff] +2201 [opheld2,mystic_air_staff] +2202 [opheld2,mystic_earth_staff] +2203 [opheld2,steel_dagger] +2204 [opheld2,steel_dagger_p] +2205 [opheld2,steel_axe] +2206 [opheld2,steel_pickaxe] +2207 [opheld2,steel_mace] +2208 [opheld2,steel_sword] +2209 [opheld2,steel_scimitar] +2210 [opheld2,steel_longsword] +2211 [opheld2,steel_warhammer] +2212 [opheld2,steel_battleaxe] +2213 [opheld2,steel_spear] +2214 [opheld2,steel_spear_p] +2215 [opheld2,steel_2h_sword] +2216 [opheld2,steel_dart] +2217 [opheld2,steel_dart_p] +2218 [opheld2,steel_knife] +2219 [opheld2,steel_knife_p] +2220 [opheld2,steel_thrownaxe] +2221 [opheld2,steel_med_helm] +2222 [opheld2,steel_full_helm] +2223 [opheld2,steel_sq_shield] +2224 [opheld2,steel_kiteshield] +2225 [opheld2,steel_platelegs] +2226 [opheld2,steel_plateskirt] +2227 [opheld2,steel_chainbody] +2228 [opheld2,steel_platebody] +2229 [opheld2,oak_shortbow] +2230 [opheld2,oak_longbow] +2231 [opheld2,magic_longbow] +2232 [opheld2,magic_shortbow] +2233 [opheld2,blue_dragonhide_vambraces] +2234 [opheld2,blue_dragonhide_chaps] +2235 [opheld2,blue_dragonhide_body] +2236 [opheld2,iban_staff] +2237 [opheld2,dragon_dagger] +2238 [opheld2,dragon_dagger_p] +2239 [opheld2,dragon_mace] +2240 [opheld2,dragon_longsword] +2241 [opheld2,dragon_battleaxe] +2242 [opheld2,dragon_spear] +2243 [opheld2,dragon_spear_p] +2244 [opheld2,dragon_med_helm] +2245 [opheld2,dragon_sq_shield] +2246 [opheld2,red_dragonhide_vambraces] +2247 [opheld2,red_dragonhide_chaps] +2248 [opheld2,red_dragonhide_body] +2249 [opheld2,black_dragonhide_vambraces] +2250 [opheld2,black_dragonhide_chaps] +2251 [opheld2,black_dragonhide_body] +2252 [levelup,attack] +2253 [levelup,strength] +2254 [levelup,ranged] +2255 [levelup,magic] +2256 [levelup,defence] +2257 [levelup,hitpoints] +2258 [levelup,prayer] +2259 [levelup,agility] +2260 [levelup,herblore] +2261 [levelup,thieving] +2262 [levelup,crafting] +2263 [levelup,runecraft] +2264 [levelup,mining] +2265 [levelup,smithing] +2266 [levelup,fishing] +2267 [levelup,cooking] +2268 [levelup,firemaking] +2269 [levelup,woodcutting] +2270 [levelup,fletching] +2271 [queue,levelup] +2272 [proc,levelup_unlocks] +2273 [label,levelup_attack] +2274 [label,levelup_cooking] +2275 [label,levelup_crafting] +2276 [label,levelup_defence] +2277 [label,levelup_firemaking] +2278 [label,levelup_fishing] +2279 [label,levelup_fletching] +2280 [label,levelup_herblore] +2281 [label,levelup_magic] +2282 [label,levelup_mining] +2283 [label,levelup_prayer] +2284 [label,levelup_ranged] +2285 [label,levelup_runecraft] +2286 [label,levelup_smithing] +2287 [label,levelup_strength] +2288 [label,levelup_thieving] +2289 [label,levelup_woodcutting] +2290 [login,_] +2291 [proc,initalltabs] +2292 [logout,_] +2293 [if_button,logout:try_logout] +2294 [proc,macro_event_big_fish_spawn] +2295 [label,macro_event_fishing] +2296 [proc,macro_event_river_troll_spawn] +2297 [ai_timer,_macro_event_river_troll] +2298 [ai_queue3,_macro_event_river_troll] +2299 [proc,macro_event_whirlpool_spawn] +2300 [proc,macro_whirlpool_attempt_take_equipment] +2301 [proc,macro_event_drunken_dwarf_spawn] +2302 [ai_queue4,macro_event_drunken_dwarf] +2303 [ai_queue5,macro_event_drunken_dwarf] +2304 [ai_queue6,macro_event_drunken_dwarf] +2305 [opnpc1,macro_event_drunken_dwarf] +2306 [ai_timer,macro_event_drunken_dwarf] +2307 [ai_opplayer2,macro_event_drunken_dwarf] +2308 [queue,drunken_dwarf_player_defend_anim] +2309 [proc,macro_event_genie_spawn] +2310 [ai_queue4,macro_event_genie] +2311 [ai_queue5,macro_event_genie] +2312 [ai_queue6,macro_event_genie] +2313 [opnpc1,macro_event_genie] +2314 [ai_timer,macro_event_genie] +2315 [proc,macro_event_mysterious_old_man_general_spawn] +2316 [ai_queue4,macro_event_mysterious_old_man_general] +2317 [ai_queue5,macro_event_mysterious_old_man_general] +2318 [ai_queue6,macro_event_mysterious_old_man_general] +2319 [opnpc1,macro_event_mysterious_old_man_general] +2320 [proc,macro_event_mysterious_old_man_general_reward] +2321 [ai_timer,macro_event_mysterious_old_man_general] +2322 [proc,macro_event_swarm_spawn] +2323 [ai_timer,macro_event_swarm] +2324 [proc,macro_event_triffid_spawn] +2325 [opnpc1,macro_event_triffid_friendly] +2326 [ai_timer,macro_event_triffid_friendly] +2327 [ai_timer,macro_event_triffid_hostile] +2328 [timer,general_macro_events] +2329 [proc,macro_event_general_spawn] +2330 [proc,macro_event_area] +2331 [queue,macro_event_general_check] +2332 [proc,macro_event_npc] +2333 [proc,macro_event_set_random] +2334 [proc,macro_event_general_count] +2335 [proc,macro_event_fail_teleport] +2336 [proc,macro_event_fail_scatter_inv] +2337 [proc,macro_event_fail_note_inv] +2338 [proc,macro_event_disappear] +2339 [proc,macro_event_general_active] +2340 [proc,macro_event_lost_and_follow] +2341 [proc,macro_event_lost] +2342 [proc,macro_event_combat_level] +2343 [proc,macro_event_coord] +2344 [proc,macro_event_coord_2x2] +2345 [proc,macro_event_gas_spawn] +2346 [oploc1,_mining_rock_macro_gas] +2347 [oploc3,_mining_rock_macro_gas] +2348 [label,get_ore_macro_gas] +2349 [proc,macro_event_lost_pickaxe_spawn] +2350 [label,reattach_pickaxe] +2351 [opheldu,pickaxe_handle] +2352 [opheldu,bronze_pickaxe_head] +2353 [opheldu,iron_pickaxe_head] +2354 [opheldu,steel_pickaxe_head] +2355 [opheldu,mithril_pickaxe_head] +2356 [opheldu,adamant_pickaxe_head] +2357 [opheldu,rune_pickaxe_head] +2358 [label,check_pickaxe_head] +2359 [label,macro_randommining] +2360 [label,macro_randomminingrune] +2361 [proc,macro_event_rock_golem_spawn] +2362 [ai_applayer2,_macro_event_rock_golem] +2363 [proc,macro_event_rock_golem_ranged_attack] +2364 [ai_timer,_macro_event_rock_golem] +2365 [ai_queue3,_macro_event_rock_golem] +2366 [label,macro_event_rock_golem_lowlvl_drops] +2367 [label,macro_event_rock_golem_highlvl_drops] +2368 [label,macro_event_prayer] +2369 [proc,macro_event_shade_spawn] +2370 [ai_timer,_macro_event_shade] +2371 [ai_queue3,_macro_event_shade] +2372 [proc,macro_event_zombie_spawn] +2373 [ai_timer,_macro_event_zombie] +2374 [ai_queue3,_macro_event_zombie] +2375 [proc,macro_event_macro_gas_chest] +2376 [timer,poison_gas] +2377 [proc,check_chest_macro_gas] +2378 [label,macro_randomthieving] +2379 [label,macro_randomthievingchest] +2380 [proc,macro_event_watchman_spawn] +2381 [ai_timer,_macro_event_watchman] +2382 [ai_queue3,_macro_event_watchman] +2383 [proc,macro_event_dryad_spawn] +2384 [ai_timer,_macro_event_dryad] +2385 [ai_queue3,_macro_event_dryad] +2386 [proc,macro_event_ent_spawn] +2387 [opnpc1,_macro_event_ent] +2388 [opnpc3,_macro_event_ent] +2389 [opnpcu,_macro_event_ent] +2390 [label,attempt_cut_ent] +2391 [label,cut_ent] +2392 [proc,macro_event_lost_axe_spawn] +2393 [label,reattach_axe] +2394 [opheldu,axe_handle] +2395 [opheldu,bronze_axe_head] +2396 [opheldu,iron_axe_head] +2397 [opheldu,steel_axe_head] +2398 [opheldu,mithril_axe_head] +2399 [opheldu,adamant_axe_head] +2400 [opheldu,rune_axe_head] +2401 [label,check_axe_head] +2402 [label,macro_randomwoodcutting] +2403 [debugproc,tempinv] +2404 [debugproc,stakeinv] +2405 [opplayer1,_] +2406 [if_close,duel_select_type] +2407 [if_close,duel_confirm] +2408 [if_button,duel_select_type:accept] +2409 [proc,enough_duel_space] +2410 [proc,.enough_duel_space] +2411 [if_button,duel_confirm:accept] +2412 [inv_button1,duel_select_type:inv] +2413 [inv_button2,duel_select_type:inv] +2414 [inv_button3,duel_select_type:inv] +2415 [inv_button4,duel_select_type:inv] +2416 [inv_button5,duel_select_type:inv] +2417 [label,removefromduel] +2418 [inv_button1,duel_side:inv] +2419 [inv_button2,duel_side:inv] +2420 [inv_button3,duel_side:inv] +2421 [inv_button4,duel_side:inv] +2422 [inv_button5,duel_side:inv] +2423 [label,movetoduel] +2424 [proc,duel_arena_checks] +2425 [proc,in_duel_arena] +2426 [proc,.in_duel_arena] +2427 [proc,duel_arena_login] +2428 [queue,duel_arena_finish] +2429 [if_close,duel_win] +2430 [proc,duel_arena_finish_coord] +2431 [oploc5,loc_3077] +2432 [oploc5,loc_3078] +2433 [oploc5,loc_3079] +2434 [oploc5,loc_3082] +2435 [oploc5,loc_3083] +2436 [label,lean_on_wall] +2437 [walktrigger,lean_on_wall] +2438 [debugproc,cr] +2439 [debugproc,c] +2440 [proc,handle_duel_camera] +2441 [oploc1,loc_3192] +2442 [proc,duel_adjust_scoreboard] +2443 [if_button,duel_select_type:no_forfeit] +2444 [if_button,duel_select_type:no_movement] +2445 [if_button,duel_select_type:no_weapons] +2446 [if_button,duel_select_type:no_armour] +2447 [if_button,duel_select_type:no_potions] +2448 [if_button,duel_select_type:no_jewelry] +2449 [if_button,duel_select_type:no_ranged] +2450 [if_button,duel_select_type:no_melee] +2451 [if_button,duel_select_type:no_magic] +2452 [if_button,duel_select_type:no_prayer] +2453 [if_button,duel_select_type:no_food] +2454 [if_button,duel_select_type:flower_power] +2455 [if_button,duel_select_type:obstacles] +2456 [proc,toggle_duel_setting] +2457 [proc,unequip_duel] +2458 [proc,.unequip_duel] +2459 [proc,duel_arena_equip_check] +2460 [proc,duel_arena_prayer_check] +2461 [proc,duel_arena_consume_check] +2462 [proc,duel_arena_obstacles_check] +2463 [proc,duel_arena_movement_check] +2464 [proc,duel_arena_forfeit_check] +2465 [proc,duel_arena_flower_power_check] +2466 [proc,duel_arena_flower_power_equip_check] +2467 [proc,duel_arena_flower_power_unequip_check] +2468 [proc,duel_arena_ranged_check] +2469 [proc,duel_arena_melee_check] +2470 [proc,duel_arena_magic_check] +2471 [opnpc1,ima] +2472 [opnpc1,sabeil] +2473 [opnpc1,jadid] +2474 [opnpc1,dalal] +2475 [opnpc1,afrah] +2476 [opnpc1,jeed] +2477 [label,duel_arena_spectator_dialogue] +2478 [queue,duel_arena_prepare_start] +2479 [proc,duel_arena_coord] +2480 [softtimer,duel_arena_start_3] +2481 [softtimer,duel_arena_start_2] +2482 [softtimer,duel_arena_start_1] +2483 [softtimer,duel_arena_start_fight] +2484 [walktrigger,duel_arena_no_move] +2485 [queue,duel_arena_full] +2486 [oploc1,duel_entrance_1] +2487 [oploc1,duel_entrance_2] +2488 [oploc1,duel_entrance_3] +2489 [oploc1,duel_entrance_4] +2490 [oploc1,duel_trapdoor] +2491 [label,duel_forfeit] +2492 [opnpc1,fadli] +2493 [opnpc3,fadli] +2494 [opnpc4,fadli] +2495 [opnpc1,hamid] +2496 [opnpc1,_healer] +2497 [opnpc3,_healer] +2498 [label,heal_duelarena] +2499 [opnpc1,jaraah] +2500 [opnpc3,jaraah] +2501 [oploc1,loc_3195] +2502 [oploc1,loc_3193] +2503 [oploc2,loc_3194] +2504 [oploc3,loc_3194] +2505 [oploc1,loc_3197] +2506 [oploc1,loc_3198] +2507 [opnpc1,mubariz] +2508 [opplayeru,rotten_tomato] +2509 [applayeru,rotten_tomato] +2510 [label,rotten_tomato_throw] +2511 [opnpc1,zahwa] +2512 [ai_opplayer2,gnome_baller1] +2513 [ai_opplayer2,gnome_baller5] +2514 [ai_opplayer2,gnome_baller9] +2515 [label,npc_gnomeball_tackle] +2516 [proc,npc_gnomeball_tackle_fail] +2517 [proc,npc_gnomeball_tackle_success] +2518 [opnpc1,gnome_baller1] +2519 [opnpc1,gnome_baller5] +2520 [opnpc1,gnome_baller9] +2521 [opnpct,gnomeball:com_5] +2522 [opplayert,gnomeball:com_5] +2523 [label,player_gnomeball_tackle] +2524 [proc,player_gnomeball_tackle_fail] +2525 [proc,player_gnomeball_tackle_success] +2526 [opnpc1,gnome_baller2] +2527 [opnpc1,gnome_baller6] +2528 [opnpc1,gnome_baller10] +2529 [label,player_gnomeball_tackle_carrier] +2530 [ai_timer,gnome_cheerleader] +2531 [opnpc1,gnome_winger1] +2532 [opnpc1,gnome_winger2] +2533 [opnpct,gnomeball:com_7] +2534 [apnpct,gnomeball:com_7] +2535 [label,player_gnomeball_pass] +2536 [queue,player_catch_gnomeball] +2537 [ai_timer,gnome_winger2] +2538 [proc,npc_gnomeball_pass] +2539 [oplocu,gnome_goal] +2540 [oploc1,gnomeball_gate] +2541 [proc,gnomeball_reset] +2542 [proc,gnomeball_inplay] +2543 [opheld5,gnomeball] +2544 [proc,gnomeball_login] +2545 [opplayeru,gnomeball] +2546 [applayeru,gnomeball] +2547 [opplayert,gnomeball:com_7] +2548 [applayert,gnomeball:com_7] +2549 [label,pvp_gnomeball_pass] +2550 [label,trail_gnome_ball_ref] +2551 [opnpc1,gnome_ball_referee] +2552 [proc,gnomeball_game_start] +2553 [label,gnomeball_ref_first_start] +2554 [label,gnomeball_hear_rules] +2555 [label,gnomeball_no_hear_rules] +2556 [label,gnomeball_just_want_to_play] +2557 [label,gnomeball_dont_want_to_play] +2558 [if_button,gnomeball:com_6] +2559 [label,gnomeball_shoot] +2560 [proc,gnomeball_shoot_random] +2561 [opnpc1,party_pete] +2562 [oploc1,loc_2416] +2563 [label,partyroom_balloons] +2564 [proc,pull_partylever] +2565 [label,partyroom_knights] +2566 [opnpc1,partyroom_dancingknight] +2567 [ai_queue10,partyroom_dancingknight] +2568 [proc,random_balloon] +2569 [proc,random_partyroom_balloon_coord] +2570 [label,partyroom_drop_balloons] +2571 [oploc1,_party_balloon] +2572 [oploc1,loc_2417] +2573 [oploc2,loc_2418] +2574 [if_close,party_drop_chest] +2575 [oploc3,loc_2418] +2576 [inv_button1,party_drop_chest:playerinv] +2577 [inv_button2,party_drop_chest:playerinv] +2578 [inv_button3,party_drop_chest:playerinv] +2579 [inv_button4,party_drop_chest:playerinv] +2580 [inv_button5,party_drop_chest:playerinv] +2581 [label,withdraw_partychest] +2582 [inv_button1,party_drop_chest_side:inv] +2583 [inv_button2,party_drop_chest_side:inv] +2584 [inv_button3,party_drop_chest_side:inv] +2585 [inv_button4,party_drop_chest_side:inv] +2586 [inv_button5,party_drop_chest_side:inv] +2587 [inv_buttond,party_drop_chest_side:inv] +2588 [label,deposit_partychest] +2589 [if_button,party_drop_chest:com_94] +2590 [apnpc1,partyroom_lucy] +2591 [opnpc1,partyroom_megan] +2592 [opnpc1,armour_salesman] +2593 [label,armour_salesman_armours] +2594 [label,armour_salesman_leather1] +2595 [label,armour_salesman_leather2] +2596 [label,armour_salesman_leather3] +2597 [label,armour_salesman_enougharmour] +2598 [label,armour_salesman_accessories] +2599 [label,armour_salesman_vambraces] +2600 [label,armour_salesman_chaps] +2601 [label,armour_salesman_cowls] +2602 [label,armour_salesman_coifs] +2603 [label,armour_salesman_enoughaccessories] +2604 [label,armour_salesman_enough] +2605 [opnpc1,bow_and_arrow_salesman] +2606 [opnpc1,competition_judge] +2607 [label,competition_judge_sure] +2608 [label,competition_judge_rules] +2609 [label,competition_judge_no] +2610 [label,competition_judge_reward_pts] +2611 [opnpc1,ranging_guild_guard] +2612 [opnpc1,leatherworker] +2613 [label,leatherworker_whatdo] +2614 [label,leatherworker_ordinary] +2615 [label,leatherworker_hard] +2616 [label,leatherworker_dragonhide] +2617 [label,leatherworker_bored] +2618 [label,leatherworker_no] +2619 [oploc1,loc_2514] +2620 [opnpc1,ranging_guild_doorman] +2621 [oploc1,loc_2511] +2622 [proc,fill_towers] +2623 [oploc1,loc_2512] +2624 [ai_queue1,tower_archer_north] +2625 [ai_opplayer2,tower_archer_north] +2626 [ai_applayer2,tower_archer_north] +2627 [ai_queue3,tower_archer_north] +2628 [ai_queue1,tower_archer_east] +2629 [ai_opplayer2,tower_archer_east] +2630 [ai_applayer2,tower_archer_east] +2631 [ai_queue3,tower_archer_east] +2632 [ai_queue1,tower_archer_south] +2633 [ai_opplayer2,tower_archer_south] +2634 [ai_applayer2,tower_archer_south] +2635 [ai_queue3,tower_archer_south] +2636 [ai_queue1,tower_archer_west] +2637 [ai_opplayer2,tower_archer_west] +2638 [ai_applayer2,tower_archer_west] +2639 [ai_queue3,tower_archer_west] +2640 [opnpc1,_tower_advisor] +2641 [aploc1,loc_2513] +2642 [proc,get_targetstr] +2643 [proc,get_targetpts] +2644 [proc,roll_rangeguild_target] +2645 [opnpc1,ticket_merchant] +2646 [if_button,tickets_shop:com_88] +2647 [if_button,tickets_shop:com_89] +2648 [if_button,tickets_shop:com_90] +2649 [if_button,tickets_shop:com_92] +2650 [if_button,tickets_shop:com_95] +2651 [if_button,tickets_shop:com_97] +2652 [label,tickets_shop_buy] +2653 [if_button,tickets_shop:com_101] +2654 [opnpc1,tribal_weapon_salesman] +2655 [opheld1,trail_clue_easy_map001] +2656 [opheld1,trail_clue_easy_map002] +2657 [opheld1,trail_clue_easy_map003] +2658 [opheld1,_trail_clue_easy] +2659 [proc,progress_clue_easy] +2660 [opheld1,_trail_casket_easy] +2661 [proc,trail_clue_easy_complete] +2662 [proc,trail_clue_easy_getrandom] +2663 [proc,trail_clue_easy_loc_interact] +2664 [proc,trail_clue_easy_reward] +2665 [proc,trail_clue_easy_normal] +2666 [proc,trail_clue_easy_rare] +2667 [opheld1,trail_clue_hard_map001] +2668 [opheld1,trail_clue_hard_riddle_exp011] +2669 [opheld1,_trail_clue_hard] +2670 [opheld1,_trail_casket_hard] +2671 [proc,trail_clue_hard_complete] +2672 [proc,trail_clue_hard_getrandom] +2673 [proc,give_trail_puzzle] +2674 [proc,progress_clue_hard] +2675 [proc,trail_clue_hard_loc_interact] +2676 [proc,trail_clue_hard_reward] +2677 [proc,trail_clue_hard_normal] +2678 [proc,trail_clue_hard_rare] +2679 [ai_applayer2,zamorak_wizard] +2680 [ai_opplayer2,zamorak_wizard] +2681 [ai_queue1,zamorak_wizard] +2682 [ai_queue3,zamorak_wizard] +2683 [queue,queue_defeat_zamorak_wizard] +2684 [opheld1,trail_clue_medium_map001] +2685 [opheld1,trail_clue_medium_map002] +2686 [opheld1,_trail_clue_medium] +2687 [opheld1,_trail_challenge] +2688 [proc,progress_clue_medium] +2689 [proc,trail_checkmediumdrop] +2690 [label,riddle_loc_medium_exp001] +2691 [label,riddle_loc_medium_exp002] +2692 [label,riddle_loc_medium_exp003] +2693 [label,riddle_loc_medium_exp004] +2694 [label,riddle_loc_medium_exp005] +2695 [label,trail_challengenpc_prompt] +2696 [proc,trail_clue_medium_complete] +2697 [opheld1,_trail_casket_medium] +2698 [proc,trail_clue_medium_loc_interact] +2699 [proc,trail_clue_medium_getrandom] +2700 [proc,trail_clue_medium_reward] +2701 [proc,trail_clue_medium_normal] +2702 [proc,trail_clue_medium_rare] +2703 [proc,trail_geteasyclue] +2704 [proc,trail_getmediumclue] +2705 [proc,trail_gethardclue] +2706 [proc,trail_easycluedrop] +2707 [proc,trail_mediumcluedrop] +2708 [proc,trail_hardcluedrop] +2709 [opobj3,_trail_challenge] +2710 [opobj3,_trail_puzzle] +2711 [opobj3,_trail_clue_easy] +2712 [opobj3,_trail_clue_medium] +2713 [opobj3,_trail_clue_hard] +2714 [opobj3,_trail_casket_easy] +2715 [opobj3,_trail_casket_medium] +2716 [opobj3,_trail_casket_hard] +2717 [label,pickup_cluescroll] +2718 [proc,trail_hasclue_all] +2719 [proc,trail_hasclue_inv] +2720 [proc,trail_getclue_inv] +2721 [proc,trail_clue_coord] +2722 [proc,trail_clue_progress] +2723 [proc,get_trail_progress] +2724 [proc,clear_trail_progress] +2725 [proc,get_chart_progress] +2726 [proc,has_sextant_clue] +2727 [proc,trail_casket_obtained] +2728 [proc,trail_complete] +2729 [queue,trail_give_reward] +2730 [proc,full_trail_readclue_map] +2731 [proc,full_trail_readclue] +2732 [debugproc,testpuz] +2733 [opheld1,_trail_puzzle] +2734 [label,trail_open_puzzle] +2735 [proc,init_trail_puzzle] +2736 [proc,shuffle_trail_puzzle] +2737 [proc,random_puzzle_slot] +2738 [proc,trail_puzzle_complete] +2739 [opheld5,_trail_puzzle_piece] +2740 [opheld1,trail_sextant] +2741 [if_button,trail_sextant:get_location] +2742 [proc,randomize_sextant_pos] +2743 [if_button,trail_sextant:com_5] +2744 [if_button,trail_sextant:com_6] +2745 [if_button,trail_sextant:com_7] +2746 [if_button,trail_sextant:com_8] +2747 [proc,rand_sextant_needle_pos] +2748 [proc,pack_negative_8bit] +2749 [proc,unpack_negative_8bit] +2750 [proc,get_sextant_needle_max] +2751 [proc,get_sextant_needle_min] +2752 [proc,get_sextant_horizon] +2753 [proc,get_sextant_sun] +2754 [proc,get_sextant_frame] +2755 [proc,get_sextant_needle] +2756 [label,output_sextant_coords] +2757 [debugproc,tc] +2758 [opnpc1,murphy] +2759 [label,murphy_fish_you_catch] +2760 [label,murphy_unsafe_boat] +2761 [label,murphy_could_i_help] +2762 [label,murphy_ill_leave_it] +2763 [label,murphy_lets_go] +2764 [label,murphy_whats_swamp_paste] +2765 [opnpc1,murphy_nonflood] +2766 [opnpc1,murphy_flood] +2767 [label,murphy_at_sea] +2768 [ai_queue6,murphy_nonflood] +2769 [ai_queue6,murphy_flood] +2770 [ai_queue7,murphy_nonflood] +2771 [ai_queue7,murphy_flood] +2772 [label,murphy_cry] +2773 [label,murphy_cheer] +2774 [oploc1,game_trawler_ship_ladder_down] +2775 [oploc1,game_trawler_ship_ladder_up] +2776 [ai_timer,murphy_nonflood] +2777 [ai_timer,murphy_flood] +2778 [label,trawler_controller] +2779 [proc,trawler_reset] +2780 [proc,trawler_login] +2781 [opheld1,bailing_bucket_empty] +2782 [opheld1,bailing_bucket_full] +2783 [proc,trawler_flood] +2784 [proc,trawler_unflood] +2785 [proc,trawler_leak] +2786 [queue,trawler_player_flood] +2787 [queue,trawler_player_unflood] +2788 [oploc1,game_trawler_leak] +2789 [oplocu,game_trawler_leak] +2790 [oplocu,game_trawler_repaired_leak] +2791 [oplocu,game_trawler_hull] +2792 [label,trawler_fix_leak] +2793 [oploc1,game_trawler_gangplank1] +2794 [oploc1,game_trawler_gangplank2] +2795 [proc,trawler_rip_net] +2796 [queue,trawler_player_rip_net] +2797 [oploc1,game_trawler_fish_net1] +2798 [oploc1,game_trawler_fish_net2] +2799 [oplocu,game_trawler_fish_net1] +2800 [oplocu,game_trawler_fish_net2] +2801 [oploc1,game_trawler_fish_net_broken1] +2802 [oploc1,game_trawler_fish_net_broken2] +2803 [oplocu,game_trawler_fish_net_broken1] +2804 [oplocu,game_trawler_fish_net_broken2] +2805 [label,trawler_net_use] +2806 [label,trawler_fix_net] +2807 [proc,trawler_sink] +2808 [queue,trawler_player_sink] +2809 [oploc1,game_trawler_barrel1] +2810 [oploc1,game_trawler_barrel2] +2811 [label,trawler_escape] +2812 [ai_timer,murphy_sunk] +2813 [ai_timer,game_trawler_shark1] +2814 [ai_timer,game_trawler_shark2] +2815 [ai_timer,murphy] +2816 [queue,trawler_start] +2817 [proc,trawler_win] +2818 [queue,trawler_player_win] +2819 [oploc1,game_trawler_reward_net] +2820 [if_close,trawler_catch] +2821 [inv_button1,trawler_catch:inv] +2822 [inv_button2,trawler_catch:inv] +2823 [proc,trawler_reward] +2824 [oploc1,winch] +2825 [proc,move_musictrigger] +2826 [debugproc,lockalltracks] +2827 [debugproc,unlockalltracks] +2828 [proc,music_getvar] +2829 [proc,music_setvar] +2830 [proc,music_playbybutton] +2831 [proc,music_playbyregion] +2832 [if_button,music:com_203] +2833 [if_button,music:com_204] +2834 [if_button,music:com_2] +2835 [if_button,music:com_3] +2836 [if_button,music:com_4] +2837 [if_button,music:com_5] +2838 [if_button,music:com_6] +2839 [if_button,music:com_7] +2840 [if_button,music:com_8] +2841 [if_button,music:com_9] +2842 [if_button,music:com_10] +2843 [if_button,music:com_11] +2844 [if_button,music:com_12] +2845 [if_button,music:com_13] +2846 [if_button,music:com_14] +2847 [if_button,music:com_15] +2848 [if_button,music:com_16] +2849 [if_button,music:com_17] +2850 [if_button,music:com_18] +2851 [if_button,music:com_19] +2852 [if_button,music:com_20] +2853 [if_button,music:com_21] +2854 [if_button,music:com_22] +2855 [if_button,music:com_23] +2856 [if_button,music:com_24] +2857 [if_button,music:com_25] +2858 [if_button,music:com_26] +2859 [if_button,music:com_27] +2860 [if_button,music:com_28] +2861 [if_button,music:com_166] +2862 [if_button,music:com_29] +2863 [if_button,music:com_171] +2864 [if_button,music:com_168] +2865 [if_button,music:com_30] +2866 [if_button,music:com_31] +2867 [if_button,music:com_174] +2868 [if_button,music:com_32] +2869 [if_button,music:com_33] +2870 [if_button,music:com_34] +2871 [if_button,music:com_35] +2872 [if_button,music:com_36] +2873 [if_button,music:com_37] +2874 [if_button,music:com_158] +2875 [if_button,music:com_38] +2876 [if_button,music:com_39] +2877 [if_button,music:com_40] +2878 [if_button,music:com_152] +2879 [if_button,music:com_167] +2880 [if_button,music:com_41] +2881 [if_button,music:com_42] +2882 [if_button,music:com_150] +2883 [if_button,music:com_43] +2884 [if_button,music:com_44] +2885 [if_button,music:com_45] +2886 [if_button,music:com_46] +2887 [if_button,music:com_47] +2888 [if_button,music:com_48] +2889 [if_button,music:com_173] +2890 [if_button,music:com_49] +2891 [if_button,music:com_50] +2892 [if_button,music:com_51] +2893 [if_button,music:com_56] +2894 [if_button,music:com_52] +2895 [if_button,music:com_53] +2896 [if_button,music:com_54] +2897 [if_button,music:com_55] +2898 [if_button,music:com_57] +2899 [if_button,music:com_58] +2900 [if_button,music:com_172] +2901 [if_button,music:com_59] +2902 [if_button,music:com_161] +2903 [if_button,music:com_169] +2904 [if_button,music:com_60] +2905 [if_button,music:com_61] +2906 [if_button,music:com_62] +2907 [if_button,music:com_159] +2908 [if_button,music:com_63] +2909 [if_button,music:com_64] +2910 [if_button,music:com_65] +2911 [if_button,music:com_66] +2912 [if_button,music:com_67] +2913 [if_button,music:com_68] +2914 [if_button,music:com_69] +2915 [if_button,music:com_70] +2916 [if_button,music:com_71] +2917 [if_button,music:com_163] +2918 [if_button,music:com_72] +2919 [if_button,music:com_73] +2920 [if_button,music:com_74] +2921 [if_button,music:com_75] +2922 [if_button,music:com_156] +2923 [if_button,music:com_76] +2924 [if_button,music:com_77] +2925 [if_button,music:com_79] +2926 [if_button,music:com_80] +2927 [if_button,music:com_81] +2928 [if_button,music:com_82] +2929 [if_button,music:com_78] +2930 [if_button,music:com_83] +2931 [if_button,music:com_84] +2932 [if_button,music:com_85] +2933 [if_button,music:com_86] +2934 [if_button,music:com_87] +2935 [if_button,music:com_88] +2936 [if_button,music:com_89] +2937 [if_button,music:com_90] +2938 [if_button,music:com_91] +2939 [if_button,music:com_170] +2940 [if_button,music:com_92] +2941 [if_button,music:com_93] +2942 [if_button,music:com_94] +2943 [if_button,music:com_95] +2944 [if_button,music:com_96] +2945 [if_button,music:com_97] +2946 [if_button,music:com_98] +2947 [if_button,music:com_99] +2948 [if_button,music:com_100] +2949 [if_button,music:com_101] +2950 [if_button,music:com_102] +2951 [if_button,music:com_103] +2952 [if_button,music:com_104] +2953 [if_button,music:com_105] +2954 [if_button,music:com_153] +2955 [if_button,music:com_106] +2956 [if_button,music:com_107] +2957 [if_button,music:com_108] +2958 [if_button,music:com_109] +2959 [if_button,music:com_110] +2960 [if_button,music:com_111] +2961 [if_button,music:com_155] +2962 [if_button,music:com_112] +2963 [if_button,music:com_113] +2964 [if_button,music:com_114] +2965 [if_button,music:com_116] +2966 [if_button,music:com_115] +2967 [if_button,music:com_117] +2968 [if_button,music:com_147] +2969 [if_button,music:com_118] +2970 [if_button,music:com_148] +2971 [if_button,music:com_119] +2972 [if_button,music:com_120] +2973 [if_button,music:com_121] +2974 [if_button,music:com_149] +2975 [if_button,music:com_157] +2976 [if_button,music:com_122] +2977 [if_button,music:com_123] +2978 [if_button,music:com_124] +2979 [if_button,music:com_126] +2980 [if_button,music:com_125] +2981 [if_button,music:com_127] +2982 [if_button,music:com_128] +2983 [if_button,music:com_129] +2984 [if_button,music:com_164] +2985 [if_button,music:com_130] +2986 [if_button,music:com_175] +2987 [if_button,music:com_131] +2988 [if_button,music:com_132] +2989 [if_button,music:com_133] +2990 [if_button,music:com_134] +2991 [if_button,music:com_162] +2992 [if_button,music:com_135] +2993 [if_button,music:com_136] +2994 [if_button,music:com_137] +2995 [if_button,music:com_138] +2996 [if_button,music:com_139] +2997 [if_button,music:com_140] +2998 [if_button,music:com_141] +2999 [if_button,music:com_142] +3000 [if_button,music:com_143] +3001 [if_button,music:com_160] +3002 [if_button,music:com_144] +3003 [if_button,music:com_145] +3004 [if_button,music:com_146] +3005 [if_button,music:com_154] +3006 [if_button,music:com_165] +3007 [opnpcu,cow_1] +3008 [opnpcu,cow_2] +3009 [opnpcu,cow_3] +3010 [label,milk_cow] +3011 [ai_applayer2,dark_wizard_earth] +3012 [ai_opplayer2,dark_wizard_earth] +3013 [ai_applayer2,dark_wizard_water] +3014 [ai_opplayer2,dark_wizard_water] +3015 [proc,dark_wizard_earth_attack] +3016 [proc,dark_wizard_water_attack] +3017 [ai_opplayer2,green_dragon] +3018 [ai_opplayer2,baby_dragon] +3019 [ai_opplayer2,baby_blue_dragon] +3020 [ai_opplayer2,red_dragon] +3021 [ai_opplayer2,blue_dragon] +3022 [ai_opplayer2,black_dragon] +3023 [label,dragon_ai_opplayer2] +3024 [proc,dragon_melee] +3025 [proc,dragon_fire] +3026 [ai_queue1,highwayman] +3027 [ai_applayer2,highwayman] +3028 [opnpc1,_citizen] +3029 [ai_opplayer2,monk_of_zamorak_22] +3030 [ai_opplayer2,monk_of_zamorak_17] +3031 [ai_opplayer2,monk_of_zamorak_45] +3032 [label,monk_of_zamorak_combat] +3033 [opnpc1,_pirate] +3034 [proc,update_bas] +3035 [proc,.update_bas] +3036 [proc,bas_set_all] +3037 [proc,headicon_add] +3038 [proc,headicon_del] +3039 [proc,.headicon_del] +3040 [proc,headicon_exists] +3041 [proc,headicons_clear] +3042 [proc,.headicons_clear] +3043 [proc,update_all] +3044 [proc,.update_all] +3045 [proc,player_combat_level] +3046 [proc,.player_combat_level] +3047 [opheld1,_category_5] +3048 [opheld1,_category_58] +3049 [opheld1,_category_59] +3050 [opheld1,_category_86] +3051 [opheld1,rotten_apples] +3052 [opheld1,_category_120] +3053 [opheld1,_category_131] +3054 [opheld1,vegetable_batta] +3055 [opheld1,pineapple] +3056 [opheld1,_alcoholic_drinks] +3057 [opheld1,kebab] +3058 [opheld1,dodgy_ugthanki_kebab] +3059 [opheld1,ugthanki_kebab] +3060 [opheld1,_category_15] +3061 [opheld1,_category_123] +3062 [opheld1,_category_125] +3063 [opheld1,_category_127] +3064 [opheld1,_category_128] +3065 [opheld1,_category_83] +3066 [opheld3,_category_15] +3067 [opheld1,_category_129] +3068 [opheld1,_category_130] +3069 [opheld1,_category_132] +3070 [opheld1,jangerberries] +3071 [opheld1,poison_chalice] +3072 [opheld1,cup_of_tea] +3073 [opheld1,_category_69] +3074 [opheld1,strange_fruit] +3075 [label,player_consume_item] +3076 [label,player_empty_item] +3077 [label,consume_effect_antidragon] +3078 [proc,set_antifire_login] +3079 [proc,set_antifire_logout] +3080 [label,consume_effect_antipoison] +3081 [label,consume_effect_super_antipoison] +3082 [proc,set_antipoison_login] +3083 [proc,set_antipoison_logout] +3084 [label,consume_effect_stat] +3085 [label,consume_effect_stat2] +3086 [label,consume_effect_stat_say] +3087 [proc,consume_effect_apply] +3088 [proc,consume_effect_sound] +3089 [proc,consume_effect_messages] +3090 [label,consume_effect_kebab] +3091 [label,consume_effect_poison_chalice] +3092 [label,consume_effect_strange_fruit] +3093 [opplayeru,christmas_cracker] +3094 [label,player_pull_christmas_cracker] +3095 [proc,cracker_partyhat] +3096 [proc,cracker_other] +3097 [debugproc,hit] +3098 [proc,combat_clearqueue] +3099 [proc,.combat_clearqueue] +3100 [queue,player_death] +3101 [proc,player_death_lose_items] +3102 [proc,pvp_death_lose_items] +3103 [proc,move_priciest_item_on_hero_to_death] +3104 [debugproc,death] +3105 [proc,damage_self] +3106 [proc,human_hit_sound] +3107 [proc,.damage_self] +3108 [proc,.human_hit_sound] +3109 [opheld5,_] +3110 [proc,dropslot] +3111 [opheld2,_] +3112 [inv_button1,wornitems:wear] +3113 [proc,equip] +3114 [proc,unequip] +3115 [proc,try_unequip] +3116 [proc,.try_unequip] +3117 [proc,update_bonuses] +3118 [proc,.update_bonuses] +3119 [proc,equip_get_bonuses] +3120 [proc,.equip_get_bonuses] +3121 [proc,update_bonus_text] +3122 [proc,.update_bonus_text] +3123 [proc,update_weight] +3124 [proc,.update_weight] +3125 [proc,equip_validate_and_move] +3126 [proc,equip_validate_and_move_primary] +3127 [proc,equip_validate_and_move_secondary] +3128 [proc,update_weight_equipment] +3129 [inv_buttond,inventory:inv] +3130 [move,_] +3131 [walktrigger,stunned] +3132 [proc,move_multiwaytrigger] +3133 [opobj3,_] +3134 [label,pickup_obj] +3135 [label,pickup_obj_floor] +3136 [label,pickup_obj_table] +3137 [proc,pickup_loc_floor] +3138 [proc,pickup_obj_check_for_space] +3139 [proc,stat_name] +3140 [proc,stat_members] +3141 [proc,npc_stat_name] +3142 [proc,convert_stat_to_npc_stat] +3143 [softtimer,stat_replenish] +3144 [softtimer,health_replenish] +3145 [proc,stat_addclamp] +3146 [proc,stat_subclamp] +3147 [proc,stat_healbase] +3148 [proc,stat_reset] +3149 [proc,stat_reset_all] +3150 [proc,.stat_reset] +3151 [proc,.stat_reset_all] +3152 [proc,stat_reset_boosts] +3153 [proc,.stat_reset_boosts] +3154 [ai_queue3,bouncer] +3155 [queue,queue_defeat_bouncer] +3156 [label,defeat_bouncer] +3157 [apnpc1,kelvin] +3158 [apnpc1,joe_fightslave] +3159 [label,joe_kelvin_dialogue] +3160 [apnpc1,fightslave] +3161 [opnpc1,general_khazard] +3162 [label,khazard_welldone] +3163 [label,general_khazard_belong_nobody] +3164 [label,general_khazard_summon_bouncer] +3165 [label,general_khazard_bouncer_killed] +3166 [label,general_khazard_agreement] +3167 [label,general_khazard_attack] +3168 [apnpc1,hengrad] +3169 [ai_queue10,khazard_guard_cutscene] +3170 [ai_queue11,khazard_guard_cutscene] +3171 [apnpc1,jeremy_servil] +3172 [opnpc1,jeremy_servil_arena] +3173 [label,free_jeremy_servil] +3174 [label,ogre_attack_justin] +3175 [ai_queue10,khazard_ogre] +3176 [ai_queue11,khazard_ogre] +3177 [ai_queue12,khazard_ogre] +3178 [ai_queue10,jeremy_servil] +3179 [ai_queue11,jeremy_servil] +3180 [ai_queue12,jeremy_servil] +3181 [opnpc1,justin_servil] +3182 [label,justin_servil_saved] +3183 [opnpc1,khazard_barman] +3184 [opnpc1,khazard_guard_standard] +3185 [opnpc1,khazard_guard_chest] +3186 [opnpc1,khazard_guard_cells] +3187 [opnpc1,khazard_guard_drunk] +3188 [label,khazard_guard_drunk_interested] +3189 [label,khazard_guard_restricted] +3190 [label,khazard_guard_killed_bouncer] +3191 [label,khazard_guard_generals_pet] +3192 [ai_queue3,khazard_ogre] +3193 [queue,queue_defeat_khazard_ogre] +3194 [label,defeat_khazard_ogre] +3195 [ai_queue3,khazard_scorpion] +3196 [queue,queue_defeat_khazard_scorpion] +3197 [label,defeat_khazard_scorpion] +3198 [opnpc1,lady_servil] +3199 [opnpc1,local] +3200 [oploc1,loc_75] +3201 [oploc1,loc_76] +3202 [oploc1,loc_81] +3203 [proc,wearing_khazard_armour] +3204 [oploc1,loc_79] +3205 [oploc1,loc_80] +3206 [oplocu,loc_79] +3207 [oplocu,loc_80] +3208 [oploc1,loc_82] +3209 [label,arena_enter] +3210 [label,open_arena_door] +3211 [label,arena_release_scorp] +3212 [label,arena_release_bouncer] +3213 [debugproc,c3a] +3214 [debugproc,c4a] +3215 [queue,arena_quest_complete] +3216 [opnpc1,beggar] +3217 [label,beggar_dialogue] +3218 [label,give_beggar_bread] +3219 [label,ignore_beggar] +3220 [oploc1,loc_65] +3221 [oploc2,loc_63] +3222 [oploc2,loc_64] +3223 [label,leave_arhein_crate] +3224 [oploc1,loc_69] +3225 [oploc1,_keep_lefaye_door] +3226 [oploc2,_keep_lefaye_door] +3227 [oploc2,loc_61] +3228 [opheld5,bat_bones] +3229 [oploc1,loc_59] +3230 [oploc1,loc_60] +3231 [oplocu,loc_62] +3232 [queue,arthur_quest_complete] +3233 [opnpc1,sir_mordred] +3234 [ai_queue3,sir_mordred] +3235 [ai_queue4,sir_mordred] +3236 [label,lefaye_spare_son] +3237 [label,lefaye_excalibur] +3238 [label,lefaye_magic_words] +3239 [label,lefaye_ok] +3240 [oploc1,loc_2867] +3241 [oploc1,loc_2861] +3242 [oplocu,loc_2861] +3243 [label,open_witch_house_door] +3244 [oploc1,_ball_irongate] +3245 [oploc1,loc_2868] +3246 [oploc1,loc_2869] +3247 [oploc2,loc_2869] +3248 [label,ball_cheese] +3249 [oplocu,loc_2870] +3250 [opheld5,cheese] +3251 [opnpcu,ball_mouse] +3252 [oploc1,loc_2862] +3253 [oploc1,loc_2863] +3254 [oplocu,loc_2863] +3255 [oploc2,loc_2864] +3256 [opobj3,boy_ball] +3257 [queue,ball_quest_complete] +3258 [ai_opplayer2,nora_t_hagg] +3259 [ai_applayer2,nora_t_hagg] +3260 [opheld1,ball_diary] +3261 [label,open_witches_diary] +3262 [proc,witches_diary] +3263 [ai_queue3,witches_experiment_p1] +3264 [ai_queue3,witches_experiment_p2] +3265 [ai_queue3,witches_experiment_p3] +3266 [ai_queue3,witches_experiment_p4] +3267 [queue,queue_defeat_witches_experiment] +3268 [label,defeat_witches_experiment] +3269 [opheld1,barcrawl_card] +3270 [proc,visited_all_bars] +3271 [opheld1,arrav_book] +3272 [label,open_arrav_book] +3273 [proc,shieldofarrav_book] +3274 [oploc2,loc_2402] +3275 [oploc1,loc_2397] +3276 [oploc1,loc_2403] +3277 [oploc1,loc_2404] +3278 [oploc2,loc_2404] +3279 [oploc1,loc_2398] +3280 [oplocu,loc_2398] +3281 [label,unlock_weaponstore_door] +3282 [proc,open_hideout_door] +3283 [opobj3,phoenix_crossbow] +3284 [oploc1,loc_2399] +3285 [oploc1,loc_2400] +3286 [oploc1,loc_2401] +3287 [oploc2,loc_2401] +3288 [queue,blackarmgang_quest_complete] +3289 [opnpc1,fortress_guard] +3290 [oploc1,blackknight_double_door_right] +3291 [oploc1,blackknight_double_door_left] +3292 [oploc1,blackknight_front_door] +3293 [oploc1,blackknight_door_to_grill] +3294 [label,blackknight_entrance_dialogue] +3295 [label,blackknight_entrance_fortress_guard] +3296 [oploc1,blackknight_banquet_hall_door] +3297 [label,blackknight_banquet_hall_fortress_guard] +3298 [oploc1,blackknight_potion_room_door] +3299 [oplocu,blackknight_hole] +3300 [label,black_knights_fortress_correct_cabbage] +3301 [label,black_knights_fortress_incorrect_cabbage] +3302 [oploc1,blackknight_grate] +3303 [proc,set_black_knight_aggro] +3304 [proc,update_blackknight_progress] +3305 [queue,black_knights_fortress_quest_complete] +3306 [label,cog_start_quest] +3307 [label,cog_start_options] +3308 [opobj3,black_cog] +3309 [opobju,black_cog] +3310 [oplocu,black_clock_spindle] +3311 [oplocu,red_clock_spindle] +3312 [oplocu,white_clock_spindle] +3313 [oplocu,blue_clock_spindle] +3314 [oplocu,_incorrect_clock_spindle] +3315 [oplocu,loc_40] +3316 [label,cooks_assistant_start] +3317 [label,cooks_assistant_whats_wrong] +3318 [label,cooks_assistant_inprogress] +3319 [label,cooks_assistant_completion] +3320 [queue,cooks_quest_complete] +3321 [oplocu,cook_range] +3322 [ai_queue3,delrith] +3323 [ai_queue4,delrith] +3324 [ai_queue2,delrith] +3325 [apnpc2,delrith] +3326 [opnpc2,delrith] +3327 [label,attack_delrith] +3328 [queue,delrith_death] +3329 [label,demon_slayer_wrong_incantation] +3330 [label,restore_delrith] +3331 [label,demon_slayer_correct_incantation] +3332 [ai_timer,weakened_delrith] +3333 [proc,update_demon_progress] +3334 [proc,set_demon_progress] +3335 [queue,demon_slayer_complete] +3336 [oploc1,varrock_palace_sewer_drain] +3337 [oplocu,varrock_palace_sewer_drain] +3338 [opnpc1,doric] +3339 [oplocu,doric_anvil] +3340 [label,doric_not_started_anvil] +3341 [label,doric_not_started] +3342 [label,start_quest_options] +3343 [label,doric_materials] +3344 [label,doric_post_complete] +3345 [queue,doric_quest_complete] +3346 [label,trail_doric] +3347 [oploc1,crandor_rock_opening] +3348 [oploc1,crandor_climbing_rope] +3349 [oploc1,crandor_secret_door] +3350 [oploc1,elvarg_gate_right] +3351 [oploc1,elvarg_gate_left] +3352 [opheld1,crandor_map_part2] +3353 [opheld1,crandor_map_part1] +3354 [opheld1,crandor_map_part3] +3355 [opheldu,crandor_map_part1] +3356 [opheldu,crandor_map_part2] +3357 [opheldu,crandor_map_part3] +3358 [label,combine_crandor_map_parts] +3359 [opheld1,crandor_map] +3360 [proc,quest_dragon_getting_map_parts] +3361 [debugproc,dragslay] +3362 [opnpc1,dragonslayer_ned] +3363 [ai_queue3,elvarg] +3364 [ai_queue1,elvarg] +3365 [ai_applayer2,elvarg] +3366 [ai_opplayer2,elvarg] +3367 [proc,elvarg_dragon_fire_op] +3368 [proc,elvarg_dragon_fire_ap] +3369 [proc,elvarg_max_hit] +3370 [oploc1,dragonslayer_gangplank_board] +3371 [oploc1,dragonslayer_gangplank_disembark] +3372 [oploc1,lady_lumbridge_ladder] +3373 [oploc1,lady_lumbridge_ladder2] +3374 [oploc1,lady_lumbridge_hole] +3375 [oplocu,lady_lumbridge_hole] +3376 [label,add_plank_to_ship_hole] +3377 [oploc1,lady_lumbridge_ladder_shipwreck] +3378 [oploc1,dragon_slayer_magic_door] +3379 [oploc1,dragon_slayer_magic_chest_closed] +3380 [oploc2,dragon_slayer_magic_chest_opened] +3381 [oploc1,dragon_slayer_magic_chest_opened] +3382 [ai_queue1,melzar] +3383 [ai_applayer2,melzar] +3384 [ai_opplayer2,melzar] +3385 [proc,npc_cabbage_attack] +3386 [proc,npc_zap_attack] +3387 [proc,melzar_say_random_message] +3388 [oploc1,melzar_maze_entrance] +3389 [oplocu,melzar_maze_entrance] +3390 [oploc1,melzar_maze_exit_door] +3391 [oploc1,broken_ladder] +3392 [oploc1,melzar_maze_ladder] +3393 [oploc1,melzar_maze_red_door] +3394 [oplocu,melzar_maze_red_door] +3395 [oploc1,melzar_maze_orange_door] +3396 [oplocu,melzar_maze_orange_door] +3397 [oploc1,melzar_maze_yellow_door] +3398 [oplocu,melzar_maze_yellow_door] +3399 [oploc1,melzar_maze_blue_door] +3400 [oplocu,melzar_maze_blue_door] +3401 [oploc1,melzar_maze_magenta_door] +3402 [oplocu,melzar_maze_magenta_door] +3403 [oploc1,melzar_maze_green_door] +3404 [oplocu,melzar_maze_green_door] +3405 [label,open_melzar_maze_door] +3406 [ai_queue3,melzar_maze_giant_rat] +3407 [ai_queue3,melzar_maze_ghost] +3408 [ai_queue3,melzar_maze_skeleton] +3409 [ai_queue3,melzar_maze_zombie] +3410 [ai_queue3,melzar] +3411 [ai_queue3,melzar_maze_lesser_demon] +3412 [oploc1,melzar_maze_chest_closed] +3413 [oploc2,melzar_maze_chest_opened] +3414 [oploc1,melzar_maze_chest_opened] +3415 [queue,dragon_complete] +3416 [ai_queue3,wormbrain] +3417 [opnpc1,wormbrain] +3418 [apnpc1,wormbrain] +3419 [label,talk_to_wormbrain] +3420 [label,wormbrain_in_for] +3421 [label,wormbrain_zoo] +3422 [label,wormbrain_map] +3423 [label,wormbrain_forget_it] +3424 [label,wormbrain_kill] +3425 [label,wormbrain_pay] +3426 [label,wormbrain_accept_pay] +3427 [label,wormbrain_story] +3428 [label,druidic_ritual_start_1] +3429 [label,druidic_ritual_start_2] +3430 [label,druid_agree_to_help] +3431 [label,druid_not_interested] +3432 [label,druid_sanfew_information] +3433 [label,druid_sanfew_questions] +3434 [label,druid_sanfew_give_ingredients] +3435 [label,druid_completion] +3436 [queue,druid_quest_complete] +3437 [oplocu,druid_cauldron] +3438 [softtimer,blanket_ladder] +3439 [proc,drunkmonk_ladder_active] +3440 [label,drunkmonk_party] +3441 [proc,random_monk_uid] +3442 [proc,monk_dance] +3443 [proc,player_monkdance] +3444 [proc,spawn_drunkmonk_balloons] +3445 [proc,drunkmonk_balloon_coord] +3446 [queue,drunkmonk_complete] +3447 [opnpc1,alrena] +3448 [opnpc1,bravek] +3449 [opnpcu,bravek] +3450 [label,bravek_my_head_hurts] +3451 [label,bravek_this_is_really_important_though] +3452 [label,bravek_thanks_again_for_the_hangover_cure] +3453 [label,bravek_okay_goodbye] +3454 [label,bravek_you_shouldnt_drink_so_much_then] +3455 [label,bravek_do_you_know_what_is_in_the_cure] +3456 [label,bravek_give_hangover_cure] +3457 [label,bravek_i_dont_think_drink_is_the_solution] +3458 [label,bravek_well_the_mourners_deal_with_that_sort_of_thing] +3459 [label,bravek_okay_ill_go_speak_to_them] +3460 [label,bravek_is_that_all_anyone_says_around_here] +3461 [label,bravek_they_wont_listen_to_me] +3462 [label,bravek_dont_you_want_to_take_an_interest] +3463 [label,bravek_i_see_why_people_say_youre_a_weak_leader] +3464 [label,bravek_okay_ill_talk_to_the_mourners] +3465 [label,elena_search_cupboard] +3466 [oploc1,loc_2537] +3467 [oploc1,loc_2534] +3468 [oploc1,loc_2535] +3469 [label,west_ardougne_plague_house_doors] +3470 [label,plague_house_but_i_think_a_kidnap_victim_is_in_here] +3471 [label,plague_house_good_point] +3472 [label,plague_house_i_want_to_check_anyway] +3473 [label,plague_house_i_fear_not_a_mere_plague] +3474 [label,plague_house_how_do_i_get_clearance] +3475 [label,plague_house_thanks_for_the_warning] +3476 [label,rehnissons_enter_house] +3477 [opnpc1,edmond] +3478 [label,edmond_what_happened_to_elena] +3479 [label,edmond_tell_me_more] +3480 [label,edmond_can_i_help_find_elena] +3481 [label,edmond_sorry_i_have_to_go] +3482 [label,edmond_goodluck_finding_elena] +3483 [opnpc1,elena_imprisoned] +3484 [opheld1,elena_teleport_scroll] +3485 [opnpc1,jethick] +3486 [label,jethick_im_looking_for_a_woman] +3487 [label,jethick_whos_in_charge_here] +3488 [opnpc1,npc_718] +3489 [label,mourner_who_are_you] +3490 [label,mourner_nothing_just_being_polite] +3491 [label,mourner_what_are_the_symptoms] +3492 [label,mourner_no_i_feel_fine] +3493 [label,mourner_no_but_can_you_tell_me_where_the_plague_came_from] +3494 [oplocu,elena_mud_patch1] +3495 [oplocu,elena_mud_patch2] +3496 [label,elena_dig_mud_patch] +3497 [label,elena_bucket_mud_patch] +3498 [label,elena_soften_mud_patch] +3499 [oploc1,loc_2533] +3500 [opheld1,elena_scruffy_note] +3501 [oploc1,loc_2530] +3502 [oploc1,loc_2522] +3503 [oploc1,loc_2523] +3504 [oplocu,loc_2526] +3505 [oploc1,loc_2526] +3506 [label,elena_improsoned_have_you_caught_the_plague] +3507 [label,elena_improsioned_ok_ill_look_for_it] +3508 [proc,quest_elena_set_progress] +3509 [queue,quest_elena_complete] +3510 [oploc1,loc_2539] +3511 [oploc1,loc_2540] +3512 [opnpc1,billy_rehnison] +3513 [opnpc1,ted_rehnison] +3514 [opnpc1,martha_rehnison] +3515 [opnpc1,milli_rehnison] +3516 [label,rehnisons_i_hear_a_woman_is_staying_here] +3517 [label,rehnisons_ask_milli_what_happened] +3518 [oploc1,loc_2541] +3519 [oplocu,loc_2541] +3520 [label,elena_climb_through_sewerpipe] +3521 [opnpc1,npc_233] +3522 [opnpc1,npc_234] +3523 [opnpc2,npc_233] +3524 [opnpc2,npc_234] +3525 [opnpc1,npc_235] +3526 [opnpc1,npc_236] +3527 [proc,get_hemenster_bait] +3528 [proc,fish_roll_hemenster] +3529 [proc,attempt_hemenster_roll] +3530 [proc,check_hemenster_equipment] +3531 [label,hemenster_fishfail] +3532 [label,attempt_fish_hemenster] +3533 [label,fish_hemenster] +3534 [proc,in_hemenster_comp] +3535 [oploc1,loc_55] +3536 [oploc1,loc_57] +3537 [oploc1,loc_54] +3538 [oploc1,loc_56] +3539 [label,dwarven_tunnel] +3540 [oploc1,_hemenster_gate] +3541 [proc,open_fishingcompo_gate] +3542 [oplocu,loc_41] +3543 [oploc1,loc_41] +3544 [label,stash_garlic] +3545 [label,move_hemenster_pipe] +3546 [queue,fishingcompo_quest_complete] +3547 [opheldu,goblin_mail] +3548 [proc,dye_goblin_mail_armour] +3549 [label,goblin_diplomacy_greet_general_bentnoze] +3550 [label,goblin_diplomacy_greet_general_wartface] +3551 [label,goblin_diplomacy_start] +3552 [label,goblin_diplomacy_orange_armour] +3553 [label,goblin_diplomacy_blue_armour] +3554 [label,goblin_diplomacy_brown_armour] +3555 [label,goblin_diplomacy_finish] +3556 [queue,goblin_diplomacy_complete_quest] +3557 [label,goblin_diplomacy_completed] +3558 [label,goblin_diplomacy_greet_player_reply] +3559 [label,goblin_diplomacy_greet_player_reply_stage_1] +3560 [label,goblin_diplomacy_greet_player_reply_stage_2] +3561 [label,goblin_diplomacy_greet_player_reply_stage_3] +3562 [label,goblin_diplomacy_greet_player_reply_stage_4] +3563 [label,goblin_diplomacy_greet_player_reply_stage_1_option_1] +3564 [label,goblin_diplomacy_greet_player_reply_stage_1_option_2] +3565 [opnpc1,black_knight_titan] +3566 [ai_queue3,black_knight_titan] +3567 [queue,queue_defeat_titan] +3568 [label,defeat_titan] +3569 [opnpc1,crone] +3570 [label,crone_the_grail] +3571 [label,crone_six_heads] +3572 [label,crone_fisherking] +3573 [label,crone_whistle] +3574 [label,crone_searching] +3575 [label,crone_realm] +3576 [opnpc1,grail_fisherman] +3577 [opnpc1,grail_maiden] +3578 [opnpc1,king_percival] +3579 [opnpc1,peasent_unhappy] +3580 [opnpc1,peasent_happy] +3581 [oploc1,loc_24] +3582 [oploc1,loc_23] +3583 [oploc2,loc_23] +3584 [oploc1,loc_22] +3585 [opheld1,magic_whistle] +3586 [opheld1,grail_bell] +3587 [opobj3,holy_grail] +3588 [opheld1,magic_gold_feather] +3589 [queue,grail_quest_complete] +3590 [opnpc1,sir_percival] +3591 [label,percival_found] +3592 [label,percival_sack] +3593 [label,percival_make_king] +3594 [label,percival_father] +3595 [label,percival_told_that] +3596 [opnpc1,the_fisher_king] +3597 [label,fisher_king_how] +3598 [label,fisher_king_grail] +3599 [label,fisher_king_look] +3600 [label,fisher_king_well] +3601 [oploc1,_manor_entrance] +3602 [proc,open_manor_gates] +3603 [oploc1,loc_152] +3604 [oplocu,loc_152] +3605 [oploc1,loc_131] +3606 [oplocu,loc_131] +3607 [label,ernest_open_key_door] +3608 [oploc1,loc_153] +3609 [opheldu,poison] +3610 [opheldu,fish_food] +3611 [label,poison_fish_food] +3612 [oplocu,loc_153] +3613 [oploc1,_manor_bookcase] +3614 [oploc1,loc_160] +3615 [label,manor_bookcase_door] +3616 [oploc1,loc_133] +3617 [oploc1,loc_132] +3618 [proc,reset_haunted_levers] +3619 [oploc1,_haunted_lever] +3620 [oploc2,_haunted_lever] +3621 [oploc1,_haunted_door] +3622 [proc,change_ernest] +3623 [ai_timer,ernest_human] +3624 [queue,haunted_quest_complete] +3625 [opnpc1,alomone] +3626 [queue,hazeel_leave] +3627 [ai_queue3,alomone] +3628 [queue,queue_defeat_alomone] +3629 [label,defeat_alomone] +3630 [opnpc1,butler_jones] +3631 [label,butler_jones_info] +3632 [label,butler_jones_howlong] +3633 [label,butler_jones_takecare] +3634 [opnpc1,carnillean_guard] +3635 [opnpc1,ceril_carnillean] +3636 [label,ceril_give_armour] +3637 [opnpc1,claus_the_chef] +3638 [oplocu,loc_2859] +3639 [opnpc1,clivet] +3640 [label,clivet_what_do_you_mean] +3641 [label,clivet_rubbish] +3642 [label,clivet_fool] +3643 [opnpc1,hazeel_cultist] +3644 [label,hazeel_cultist_goodsidequest] +3645 [opnpc1,philipe_carnillean] +3646 [label,philipe_toys] +3647 [label,philipe_jones] +3648 [label,philipe_carnillean_breakin] +3649 [oploc1,loc_2852] +3650 [oploc1,loc_2853] +3651 [oploc1,loc_2849] +3652 [proc,count_correct_valves] +3653 [oploc1,_hazeelcult_valve] +3654 [oploc2,_hazeelcult_valve] +3655 [oploc1,loc_2854] +3656 [oploc1,loc_2850] +3657 [oploc2,loc_2851] +3658 [oploc1,loc_2851] +3659 [oploc1,loc_2856] +3660 [oplocu,loc_2856] +3661 [oploc1,loc_2857] +3662 [oploc2,loc_2857] +3663 [oploc1,loc_2858] +3664 [queue,hazeelcult_fake_complete] +3665 [queue,hazeelcult_quest_complete] +3666 [oploc1,loc_2024] +3667 [queue,hetty_quest_complete] +3668 [oploc1,banana_crate] +3669 [oplocu,banana_crate] +3670 [label,banana_crate_pack_banana] +3671 [label,banana_crate_pack_rum] +3672 [label,hunt_dig] +3673 [queue,hunt_quest_complete] +3674 [label,wyson_attack] +3675 [oploc1,food_store_door] +3676 [label,wydin_employees_only] +3677 [label,wydin_apron_required] +3678 [label,wydin_get_pointer] +3679 [oploc1,food_store_crate] +3680 [opnpc1,luthas] +3681 [label,luthas_employment] +3682 [label,luthas_annoying_customs] +3683 [label,luthas_what_to_do] +3684 [label,luthas_crate_not_full] +3685 [label,luthas_where_delivered] +3686 [label,luthas_another] +3687 [label,luthas_thanks] +3688 [oploc1,hunt_chest] +3689 [oplocu,hunt_chest] +3690 [opheld1,pirate_message] +3691 [opnpc1,redbeard_frank] +3692 [label,redbeard_options] +3693 [label,redboard_progress] +3694 [label,redbeard_hand_rum] +3695 [label,redbeard_treasure] +3696 [label,redbeard_arr] +3697 [label,redbeard_trade] +3698 [opnpcu,redbeard_frank] +3699 [opnpc1,fire_warrior_of_lesarkus] +3700 [ai_applayer2,fire_warrior_of_lesarkus] +3701 [ai_opplayer2,fire_warrior_of_lesarkus] +3702 [ai_queue1,fire_warrior_of_lesarkus] +3703 [ai_queue3,fire_warrior_of_lesarkus] +3704 [queue,queue_defeat_fire_warrior] +3705 [opnpc1,_guardian_of_armadyl] +3706 [label,armadyl_staffofarma] +3707 [label,armadyl_fool] +3708 [label,armadyl_what_kind] +3709 [label,armadyl_howdare] +3710 [label,armadyl_thought] +3711 [label,armadyl_bath] +3712 [oploc1,loc_1586] +3713 [oploc1,loc_98] +3714 [oploc1,loc_94] +3715 [oploc1,loc_95] +3716 [label,open_ikov_northgate] +3717 [oploc1,loc_89] +3718 [oploc1,loc_90] +3719 [label,open_ikov_southgate] +3720 [proc,move_ikovtrigger] +3721 [queue,ikov_movebridge] +3722 [label,ikov_bridgefail] +3723 [oploc1,loc_96] +3724 [oplocu,loc_86] +3725 [oploc1,loc_87] +3726 [oploc1,loc_103] +3727 [oploc2,loc_104] +3728 [oploc1,loc_104] +3729 [oploc1,loc_91] +3730 [oploc2,loc_91] +3731 [oploc1,loc_101] +3732 [oploc1,loc_92] +3733 [oploc1,loc_93] +3734 [oploc1,loc_99] +3735 [oplocu,loc_99] +3736 [opnpc1,lucien_ardougne] +3737 [opnpc1,lucien_edge] +3738 [label,lucien_mightyhero] +3739 [label,lucien_why_yourself] +3740 [label,lucien_laugh] +3741 [label,lucien_no] +3742 [label,lucien_reward] +3743 [label,lucien_pass] +3744 [label,lucien_mission] +3745 [label,lucien_heros] +3746 [ai_queue3,lucien_edge] +3747 [queue,queue_defeat_lucien] +3748 [oploc1,loc_102] +3749 [proc,randomize_ice_arrow_chest] +3750 [proc,lucien_attack] +3751 [opobj3,staff_of_armadyl] +3752 [queue,ikov_armadyl_quest_complete] +3753 [queue,ikov_lucien_quest_complete] +3754 [debugproc,ikov_reset] +3755 [opnpc1,winelda] +3756 [label,winelda_teleport] +3757 [label,winelda_explain] +3758 [queue,imp_quest_complete] +3759 [opheld1,book_of_astrology] +3760 [label,open_astrology_book] +3761 [proc,astrology_book] +3762 [opnpc1,ghost_grave_of_scorpius] +3763 [opnpc1,goblin_guard] +3764 [opnpc1,observatory_assistant] +3765 [label,assistant_dontneedhelp] +3766 [opnpc1,observatory_professor] +3767 [label,professor_hastrail] +3768 [label,professor_glass] +3769 [label,professor_planks] +3770 [label,professor_bronze] +3771 [label,professor_mould] +3772 [label,professor_lens] +3773 [label,professor_friend_of_gods] +3774 [opnpcu,observatory_professor] +3775 [label,professor_initial] +3776 [label,professor_returns] +3777 [label,professor_trails] +3778 [label,observatory_professor_remind_navigate] +3779 [label,observatory_professor_lostchart] +3780 [opnpc1,observatory_professor_tower] +3781 [oploc1,loc_2187] +3782 [oploc1,loc_2188] +3783 [oploc1,loc_2189] +3784 [oploc1,loc_2190] +3785 [oploc1,loc_2191] +3786 [oploc1,loc_2192] +3787 [oploc1,loc_2193] +3788 [oploc1,loc_2197] +3789 [oploc1,loc_2194] +3790 [oploc1,loc_2195] +3791 [oploc1,loc_2196] +3792 [oploc1,loc_2198] +3793 [oploc2,loc_2194] +3794 [oploc2,loc_2195] +3795 [oploc2,loc_2196] +3796 [oploc2,loc_2198] +3797 [oplocu,_observatory_dungeon_gate] +3798 [oploc1,_observatory_dungeon_gate] +3799 [label,open_keep_gate] +3800 [oploc1,loc_2210] +3801 [oploc1,loc_2212] +3802 [opheldu,lens_mould] +3803 [label,craft_telescope_disc] +3804 [label,observatory_telescope] +3805 [queue,constellation_dialogue] +3806 [label,constellation_reward] +3807 [queue,itgronigen_quest_complete] +3808 [opnpc1,spirit_of_scorpius] +3809 [oploc2,junglepotion_marshy_jungle_vine] +3810 [oploc2,junglepotion_palm_tree] +3811 [oploc2,junglepotion_scorched_earth] +3812 [oploc2,junglepotion_rock] +3813 [oploc2,junglepotion_wall_fungus] +3814 [oploc2,junglepotion_rocks] +3815 [oploc1,junglepotion_hand_holds] +3816 [proc,pick_herb] +3817 [queue,junglepotion_quest_complete] +3818 [opheld1,cannon_base] +3819 [oploc1,cannon_base] +3820 [oplocu,cannon_base] +3821 [oploc1,cannon_stand] +3822 [oplocu,cannon_stand] +3823 [oploc1,cannon_barrels] +3824 [oplocu,cannon_barrels] +3825 [oploc2,cannon] +3826 [oploc1,cannon] +3827 [timer,cannon_rotate] +3828 [opnpc1,anna] +3829 [opnpc1,murder_bob] +3830 [opnpc1,carol] +3831 [opnpc1,david] +3832 [opnpc1,donovan] +3833 [opnpc1,elizabeth] +3834 [opnpc1,frank] +3835 [opnpc1,gossip] +3836 [opnpc1,hobbes] +3837 [opnpc1,louisa] +3838 [opnpc1,mary] +3839 [opnpc1,murder_guard] +3840 [label,murder_guard_help] +3841 [label,murder_guard_how] +3842 [label,murder_guard_who] +3843 [label,murder_guard_quick] +3844 [label,murder_guard_butler] +3845 [label,murder_guard_accuse_suspect] +3846 [label,murder_guard_threadproof] +3847 [label,murder_guard_printproof] +3848 [label,murder_guard_poisonproof] +3849 [label,murder_guard_conclusive_proof] +3850 [proc,murder_get_poisoned_loc_name] +3851 [proc,murder_get_murderer_pronoun] +3852 [opnpc1,pierre] +3853 [oploc2,loc_2650] +3854 [oploc2,loc_2651] +3855 [oploc2,loc_2652] +3856 [oploc2,loc_2653] +3857 [oploc2,loc_2654] +3858 [oploc2,loc_2655] +3859 [oploc2,loc_2656] +3860 [oploc2,loc_2657] +3861 [oploc2,loc_2658] +3862 [oploc2,loc_2659] +3863 [oploc2,loc_2660] +3864 [oploc2,loc_2661] +3865 [label,murder_flour_barrel] +3866 [oploc2,loc_2662] +3867 [oplocu,loc_2662] +3868 [oploc2,loc_2663] +3869 [oploc1,loc_2664] +3870 [oploc1,loc_2665] +3871 [label,murder_inspect_gate] +3872 [oploc2,loc_2666] +3873 [proc,get_murder_thread] +3874 [opobj3,criminals_dagger] +3875 [opobj3,pungent_pot] +3876 [opheldu,_murder_proofobj] +3877 [opheldu,_murder_flourobj] +3878 [opheldu,unknown_print] +3879 [label,flour_proofobj] +3880 [label,create_flourprints] +3881 [label,check_murderer_print] +3882 [opobj3,murder_blue_thread] +3883 [opobj3,murder_red_thread] +3884 [opobj3,murder_green_thread] +3885 [proc,murder_get_murderer_name] +3886 [proc,murder_clear_evidence] +3887 [queue,murder_quest_complete] +3888 [ai_timer,sinclair_guard_dog] +3889 [opnpc1,stanford] +3890 [oploc1,loc_2145] +3891 [oploc1,loc_2146] +3892 [proc,check_restlessghost_spawn] +3893 [oploc2,loc_2146] +3894 [oplocu,loc_2145] +3895 [oplocu,loc_2146] +3896 [opobj3,ghost_skull] +3897 [opheld5,ghost_skull] +3898 [queue,priest_quest_complete] +3899 [opnpc1,restless_ghost] +3900 [opnpcu,restless_ghost] +3901 [label,priest_ghost_no_amulet] +3902 [label,priest_ghost_why] +3903 [label,priest_ghost_scary] +3904 [label,priest_ghost_goodbye] +3905 [label,priest_ghost_certain_task] +3906 [label,priest_ghost_dontunderstand] +3907 [label,priest_ghost_notsure] +3908 [opheldu,wig_grey] +3909 [label,make_blonde_wig] +3910 [opnpcu,lady_keli] +3911 [oplocu,loc_2881] +3912 [oploc1,loc_2881] +3913 [ai_timer,npc_921] +3914 [queue,prince_complete] +3915 [queue,romeo_and_juliet_complete] +3916 [queue,rune_mysteries_complete] +3917 [label,scorpion_caught] +3918 [label,scorpion_sting] +3919 [label,catch_scorp] +3920 [opnpcu,kharid_scorpion_first] +3921 [opnpcu,kharid_scorpion_second] +3922 [opnpcu,kharid_scorpion_third] +3923 [opnpc1,kharid_scorpion_first] +3924 [opnpc1,kharid_scorpion_second] +3925 [opnpc1,kharid_scorpion_third] +3926 [oploc1,loc_2117] +3927 [queue,scorpcatcher_quest_complete] +3928 [opnpc1,sea_slug] +3929 [opobj3,sea_slug] +3930 [label,pickup_seaslug] +3931 [opheldu,swamp_tar] +3932 [label,make_swamp_paste] +3933 [opheldu,damp_sticks] +3934 [opheldu,broken_glass] +3935 [label,dry_damp_sticks] +3936 [opheld1,dry_sticks] +3937 [oploc1,loc_2517] +3938 [oploc1,loc_2518] +3939 [oploc1,loc_2520] +3940 [oploc1,loc_2519] +3941 [queue,seaslug_quest_complete] +3942 [queue,sheep_complete] +3943 [label,squire_start] +3944 [label,squire_angry] +3945 [label,squire_sword_options_lost] +3946 [label,squire_sword_options_angry] +3947 [label,squire_find_soon] +3948 [label,squire_vague_area] +3949 [label,squire_sword_options_further] +3950 [label,squire_kingdom_swords] +3951 [label,squire_new_sword] +3952 [label,squire_thing_is] +3953 [label,squire_status_report] +3954 [label,reldo_imcando_dwaves] +3955 [label,thurgo_inquire] +3956 [label,thurgo_who_wants] +3957 [label,thurgo_special_sword_pre_pie] +3958 [label,thurgo_redberry_pie] +3959 [label,thurgo_special_sword_post_pie] +3960 [label,thurgo_about_sword] +3961 [label,thurgo_check_blurite] +3962 [proc,vyvin_distracted] +3963 [queue,squire_complete] +3964 [oploc1,loc_2706] +3965 [oploc2,loc_2707] +3966 [oplocu,loc_2708] +3967 [if_button,tribal_door2:com_57] +3968 [if_button,tribal_door2:com_47] +3969 [if_button,tribal_door2:com_49] +3970 [if_button,tribal_door2:com_51] +3971 [if_button,tribal_door2:com_53] +3972 [if_button,tribal_door2:com_48] +3973 [if_button,tribal_door2:com_50] +3974 [if_button,tribal_door2:com_52] +3975 [if_button,tribal_door2:com_54] +3976 [proc,clear_tribaldoor_inter] +3977 [proc,calc_tribaldoor_value] +3978 [proc,get_tribal_door_lock] +3979 [label,tribal_door_combo] +3980 [oploc1,loc_2705] +3981 [oploc1,loc_2711] +3982 [oploc2,loc_2711] +3983 [oploc1,loc_2709] +3984 [oploc1,loc_2710] +3985 [oploc2,loc_2710] +3986 [oploc2,loc_2708] +3987 [queue,totem_quest_complete] +3988 [opnpc1,khazard_warlord] +3989 [ai_queue3,khazard_warlord] +3990 [queue,queue_defeat_warlord] +3991 [label,defeat_warlord] +3992 [opobj3,orbs_of_protection] +3993 [oploc2,loc_2181] +3994 [oploc1,loc_2184] +3995 [oploc1,loc_2185] +3996 [oploc1,loc_2183] +3997 [oploc1,loc_2182] +3998 [oploc2,loc_2182] +3999 [queue,tree_quest_complete] +4000 [opnpc1,tracker_gnome_1] +4001 [apnpc1,tracker_gnome_2] +4002 [opnpc1,tracker_gnome_3] +4003 [ai_queue3,count_draynor] +4004 [ai_queue4,count_draynor] +4005 [opnpc2,count_draynor] +4006 [apnpc2,count_draynor] +4007 [ai_queue2,count_draynor] +4008 [label,count_draynor_use_stake] +4009 [ai_timer,count_draynor] +4010 [oploc1,loc_2614] +4011 [oploc1,loc_2615] +4012 [oploc2,loc_2615] +4013 [proc,quest_vampire_set_progress] +4014 [label,quest_vampire_coffin_open] +4015 [label,quest_vampire_coffin_close] +4016 [label,quest_vampire_coffin_search] +4017 [queue,quest_vampire_complete] +4018 [opnpc1,almera] +4019 [opheld1,book_on_baxtorian] +4020 [label,open_book_on_baxtorian] +4021 [proc,book_on_baxtorian_page] +4022 [opnpc1,gerald] +4023 [opnpc1,golrie] +4024 [label,waterfall_golrie_door_dialogue] +4025 [opnpc1,hadley] +4026 [label,waterfall_hadley_elf_king] +4027 [label,waterfall_hadley_treasure] +4028 [label,waterfall_hadley_worth_visiting] +4029 [label,waterfall_hadley_nature] +4030 [label,waterfall_hadley_bye] +4031 [apnpc1,hudon] +4032 [opnpc1,hudon] +4033 [label,hudon_dialogue] +4034 [oploc1,loc_1992] +4035 [proc,waterfall_can_enter_glarials_tomb] +4036 [oplocu,loc_1992] +4037 [oploc1,loc_1993] +4038 [oploc1,loc_1994] +4039 [oploc2,loc_1995] +4040 [oploc1,loc_1995] +4041 [oploc1,loc_1987] +4042 [aploc1,loc_1996] +4043 [aplocu,loc_1996] +4044 [oploc1,loc_2020] +4045 [oplocu,loc_2020] +4046 [oploc1,loc_2010] +4047 [oploc1,loc_2000] +4048 [oploc1,loc_2022] +4049 [oploc1,loc_1989] +4050 [oploc1,loc_1990] +4051 [oploc1,loc_1991] +4052 [oplocu,loc_1991] +4053 [label,waterfall_golrie_door] +4054 [oploc1,loc_1999] +4055 [oploc1,loc_2002] +4056 [oplocu,loc_2002] +4057 [oplocu,loc_2006] +4058 [oploc1,loc_2014] +4059 [oplocu,loc_2014] +4060 [queue,waterfall_quest_complete] +4061 [oplocu,loc_2004] +4062 [label,waterfall_placerune_pillar] +4063 [proc,get_pillar_index] +4064 [proc,get_rune_index] +4065 [oplocu,loc_2409] +4066 [oploc1,loc_2409] +4067 [oploc1,loc_1292] +4068 [opheldu,dramenbranch] +4069 [label,cut_dramenstaff] +4070 [oploc1,loc_2406] +4071 [queue,zanaris_quest_complete] +4072 [opnpc1,shamus] +4073 [label,shamus_dramenwood_staff] +4074 [label,remove_shamus] +4075 [ai_queue3,tree_spirit_zanaris] +4076 [queue,queue_defeat_tree_spirit] +4077 [label,defeat_tree_spirit] +4078 [opnpc1,shop_keeper_lumbridge] +4079 [opnpc1,shop_assistant_lumbridge] +4080 [opnpc1,shop_keeper_varrock_generalshop] +4081 [opnpc1,shop_assistant_varrock_generalshop] +4082 [opnpc1,shop_keeper_falador] +4083 [opnpc1,shop_assistant_falador] +4084 [opnpc1,shop_keeper_edgeville] +4085 [opnpc1,shop_assistant_edgeville] +4086 [opnpc1,shop_keeper_alkharid] +4087 [opnpc1,shop_assistant_alkharid] +4088 [opnpc1,shop_keeper_rimmington] +4089 [opnpc1,shop_assistant_rimmington] +4090 [opnpc1,shop_keeper_karamja] +4091 [opnpc1,shop_assistant_karamja] +4092 [opnpc1,shop_keeper_khazard] +4093 [opnpc1,dwarf_generalshop] +4094 [opnpc1,fairy_shop_keeper] +4095 [opnpc1,fairy_shop_assistant] +4096 [label,generalshop_help] +4097 [label,generalshop_help_neutral] +4098 [opnpc3,_shop_keeper] +4099 [proc,openshop] +4100 [proc,openshop_activenpc] +4101 [if_close,shop_template] +4102 [proc,can_sell_obj] +4103 [inv_button1,shop_template_side:inv] +4104 [inv_button1,shop_template:inv] +4105 [label,buy_item] +4106 [label,sell_item] +4107 [proc,price_mod] +4108 [proc,adjusted_item_cost_buying] +4109 [proc,adjusted_item_cost_selling] +4110 [proc,calculate_items_amount_sold] +4111 [inv_button2,shop_template_side:inv] +4112 [inv_button3,shop_template_side:inv] +4113 [inv_button4,shop_template_side:inv] +4114 [inv_button2,shop_template:inv] +4115 [inv_button3,shop_template:inv] +4116 [inv_button4,shop_template:inv] +4117 [label,shop_request] +4118 [proc,calc_shop_value] +4119 [proc,agility_climb_up] +4120 [proc,agility_force_move] +4121 [proc,agility_walk] +4122 [proc,agility_exactmove] +4123 [proc,agility_delay_fail] +4124 [proc,forcewalk] +4125 [proc,forcemove] +4126 [proc,agility_instant_fail] +4127 [proc,set_walkbas] +4128 [proc,change_merged_loc] +4129 [oploc1,barbarian_rope_swing] +4130 [oploc1,barbarian_log_balance] +4131 [oploc1,barbarian_obstacle_net] +4132 [oploc1,barbarian_ledge] +4133 [oploc1,barbarian_crumblingwall] +4134 [oploc1,barbarian_obstacle_pipe] +4135 [proc,update_barbarian_varp] +4136 [oploc1,gnome_log_balance] +4137 [oploc1,gnome_obstacle_net_1] +4138 [oploc1,gnome_tree_branch_1] +4139 [oploc1,gnome_balancing_rope] +4140 [oploc1,gnome_tree_branch_2] +4141 [oploc1,gnome_tree_branch_3] +4142 [label,climbdown_gnome_tree_branch] +4143 [oploc1,gnome_obstacle_net_2] +4144 [oploc1,gnome_obstacle_pipe] +4145 [proc,gnome_trainer_say] +4146 [proc,update_gnome_varp] +4147 [oploc1,loc_1947] +4148 [oploc1,loc_2298] +4149 [oploc1,loc_2296] +4150 [oploc1,loc_2332] +4151 [proc,get_island_rope_var] +4152 [proc,set_island_rope_var] +4153 [oploc1,_island_rope_swing] +4154 [oploc1,_monkeybars] +4155 [oploc1,loc_993] +4156 [oploc1,_karamja_stepping_stone] +4157 [oploc1,loc_2309] +4158 [oploc1,_wilderness_course_main_gate] +4159 [oploc1,wilderness_obstacle_pipe] +4160 [oploc1,wilderness_rope_swing] +4161 [oploc1,wilderness_stepping_stone] +4162 [oploc1,wilderness_log_balance] +4163 [oploc1,wilderness_rocks] +4164 [label,fail_ridge] +4165 [proc,open_course_gates] +4166 [proc,open_entrance_gate] +4167 [proc,update_wilderness_varp] +4168 [proc,combat_effective_stat] +4169 [proc,combat_maxhit] +4170 [proc,combat_stat] +4171 [proc,combat_get_weapon_style_data] +4172 [proc,combat_get_damagetype] +4173 [proc,combat_get_damagestyle] +4174 [proc,combat_get_damagestyle_bonuses] +4175 [proc,combat_swing_anim_and_synth] +4176 [proc,give_combat_experience] +4177 [proc,combat_defend_anim] +4178 [ai_queue1,_] +4179 [ai_queue2,_] +4180 [ai_queue3,_] +4181 [ai_opplayer2,_] +4182 [proc,npc_default_retaliate] +4183 [proc,npc_default_retaliate_ap] +4184 [proc,npc_default_attack] +4185 [proc,npc_default_damage] +4186 [proc,npc_default_death] +4187 [proc,npc_player_hit_roll] +4188 [proc,npc_is_attackable] +4189 [proc,npc_is_attackable_message] +4190 [proc,npc_out_of_combat] +4191 [proc,npc_defence_roll_specific] +4192 [proc,npc_attack_roll_specific] +4193 [proc,npc_combat_defencebonus] +4194 [queue,damage_player] +4195 [proc,npc_retaliate] +4196 [proc,npc_set_attack_vars] +4197 [proc,npc_can_attack_player] +4198 [proc,npc_magic_attack_roll] +4199 [proc,npc_magic_attack_roll_no_prot] +4200 [walktrigger,frozen] +4201 [proc,npc_cast_spell] +4202 [proc,npc_cast_spell_with_forced_max_hit] +4203 [queue,npc_freeze_player] +4204 [proc,npc_combat_spell_checks] +4205 [proc,npc_freeze_allowed] +4206 [proc,npc_debuff_allowed] +4207 [proc,npc_spell_cast] +4208 [proc,npc_spell_success] +4209 [proc,npc_stat_change_effect] +4210 [proc,npc_freeze_effect] +4211 [proc,npc_spell_fail] +4212 [proc,npc_melee_maxhit] +4213 [proc,npc_melee_attack_roll] +4214 [proc,npc_meleeattack] +4215 [proc,playerhit_n_melee] +4216 [proc,npc_ranged_attack_roll] +4217 [proc,npc_ranged_maxhit] +4218 [proc,npc_rangeattack] +4219 [proc,playerhit_n_ranged] +4220 [proc,npc_drop_ammo] +4221 [proc,npc_death] +4222 [ai_timer,_] +4223 [proc,npc_poison_timer] +4224 [proc,npc_poison_clear] +4225 [proc,npc_poison_start] +4226 [if_button,combat_staff_2:auto_choose] +4227 [if_button,staff_spells:ssb0] +4228 [if_button,staff_spells:ssb1] +4229 [if_button,staff_spells:ssb2] +4230 [if_button,staff_spells:ssb3] +4231 [if_button,staff_spells:ssb4] +4232 [if_button,staff_spells:ssb5] +4233 [if_button,staff_spells:ssb6] +4234 [if_button,staff_spells:ssb7] +4235 [if_button,staff_spells:ssb8] +4236 [if_button,staff_spells:ssb9] +4237 [if_button,staff_spells:ssb10] +4238 [if_button,staff_spells:ssb11] +4239 [if_button,staff_spells:ssb12] +4240 [if_button,staff_spells:ssb13] +4241 [if_button,staff_spells:ssb14] +4242 [if_button,staff_spells:ssb15] +4243 [label,open_autocast_interface] +4244 [if_button,staff_spells:cancelspell] +4245 [label,set_autocast_spell] +4246 [queue,playerhit_n_retaliate] +4247 [queue,pvp_retaliate] +4248 [opnpc2,_] +4249 [apnpc2,_] +4250 [label,player_combat_start_ap] +4251 [label,player_combat_start] +4252 [proc,player_npc_hit_roll] +4253 [proc,player_attack_roll_specific] +4254 [proc,player_defence_roll_specific] +4255 [proc,.player_defence_roll_specific] +4256 [proc,player_in_combat_check] +4257 [proc,player_combat_stat] +4258 [proc,.player_combat_stat] +4259 [proc,check_attack_prayer] +4260 [proc,check_defence_prayer] +4261 [proc,check_strength_prayer] +4262 [proc,check_protect_prayer] +4263 [proc,.check_attack_prayer] +4264 [proc,.check_defence_prayer] +4265 [proc,.check_strength_prayer] +4266 [proc,.check_protect_prayer] +4267 [opnpct,magic:wind_strike] +4268 [opnpct,magic:water_strike] +4269 [opnpct,magic:earth_strike] +4270 [opnpct,magic:fire_strike] +4271 [opnpct,magic:wind_bolt] +4272 [opnpct,magic:water_bolt] +4273 [opnpct,magic:earth_bolt] +4274 [opnpct,magic:fire_bolt] +4275 [opnpct,magic:wind_blast] +4276 [opnpct,magic:water_blast] +4277 [opnpct,magic:earth_blast] +4278 [opnpct,magic:fire_blast] +4279 [opnpct,magic:wind_wave] +4280 [opnpct,magic:water_wave] +4281 [opnpct,magic:earth_wave] +4282 [opnpct,magic:fire_wave] +4283 [opnpct,magic:curse] +4284 [opnpct,magic:weaken] +4285 [opnpct,magic:confuse] +4286 [opnpct,magic:bind] +4287 [opnpct,magic:snare] +4288 [opnpct,magic:entangle] +4289 [opnpct,magic:vulnerability] +4290 [opnpct,magic:enfeeble] +4291 [opnpct,magic:stun] +4292 [apnpct,magic:wind_strike] +4293 [apnpct,magic:water_strike] +4294 [apnpct,magic:earth_strike] +4295 [apnpct,magic:fire_strike] +4296 [apnpct,magic:wind_bolt] +4297 [apnpct,magic:water_bolt] +4298 [apnpct,magic:earth_bolt] +4299 [apnpct,magic:fire_bolt] +4300 [apnpct,magic:wind_blast] +4301 [apnpct,magic:water_blast] +4302 [apnpct,magic:earth_blast] +4303 [apnpct,magic:fire_blast] +4304 [apnpct,magic:wind_wave] +4305 [apnpct,magic:water_wave] +4306 [apnpct,magic:earth_wave] +4307 [apnpct,magic:fire_wave] +4308 [apnpct,magic:curse] +4309 [apnpct,magic:weaken] +4310 [apnpct,magic:confuse] +4311 [apnpct,magic:bind] +4312 [apnpct,magic:snare] +4313 [apnpct,magic:entangle] +4314 [apnpct,magic:vulnerability] +4315 [apnpct,magic:enfeeble] +4316 [apnpct,magic:stun] +4317 [proc,pvm_default_spell] +4318 [proc,pvm_combat_spell_checks] +4319 [proc,pvm_freeze_allowed] +4320 [proc,pvm_debuff_allowed] +4321 [proc,pvm_spell_cast] +4322 [proc,pvm_spell_success] +4323 [proc,pvm_spell_fail] +4324 [proc,pvm_stat_change_effect] +4325 [proc,pvm_freeze_effect] +4326 [ai_queue8,_] +4327 [label,player_melee_attack] +4328 [label,player_ranged_attack] +4329 [proc,player_ranged_check_ammo] +4330 [proc,player_ranged_use_weapon] +4331 [proc,ranged_shoot_npc] +4332 [proc,ranged_throw_npc] +4333 [opnpct,magic:claws_of_guthix] +4334 [apnpct,magic:claws_of_guthix] +4335 [proc,pvm_claws_of_guthix] +4336 [apnpct,magic:crumble_undead] +4337 [opnpct,magic:crumble_undead] +4338 [proc,pvm_crumble_undead] +4339 [opnpct,magic:flames_of_zamorak] +4340 [apnpct,magic:flames_of_zamorak] +4341 [proc,pvm_flames_of_zamorak] +4342 [opnpct,magic:saradomin_strike] +4343 [apnpct,magic:saradomin_strike] +4344 [proc,pvm_saradomin_strike] +4345 [if_button,combat_heavysword:heavy0] +4346 [if_button,combat_heavysword:heavy1] +4347 [if_button,combat_heavysword:heavy2] +4348 [if_button,combat_heavysword:heavy3] +4349 [if_button,combat_axe:axe0] +4350 [if_button,combat_axe:axe1] +4351 [if_button,combat_axe:axe2] +4352 [if_button,combat_axe:axe3] +4353 [if_button,combat_blunt:blunt0] +4354 [if_button,combat_blunt:blunt1] +4355 [if_button,combat_blunt:blunt2] +4356 [if_button,combat_bow:bow0] +4357 [if_button,combat_bow:bow1] +4358 [if_button,combat_bow:bow2] +4359 [if_button,combat_crossbow:crossbow0] +4360 [if_button,combat_crossbow:crossbow1] +4361 [if_button,combat_crossbow:crossbow2] +4362 [if_button,combat_pickaxe:pickaxe0] +4363 [if_button,combat_pickaxe:pickaxe1] +4364 [if_button,combat_pickaxe:pickaxe2] +4365 [if_button,combat_pickaxe:pickaxe3] +4366 [if_button,combat_scythe:scythe0] +4367 [if_button,combat_scythe:scythe1] +4368 [if_button,combat_scythe:scythe2] +4369 [if_button,combat_scythe:scythe3] +4370 [if_button,combat_hacksword:hack0] +4371 [if_button,combat_hacksword:hack1] +4372 [if_button,combat_hacksword:hack2] +4373 [if_button,combat_hacksword:hack3] +4374 [if_button,combat_spear:spear0] +4375 [if_button,combat_spear:spear1] +4376 [if_button,combat_spear:spear2] +4377 [if_button,combat_spear:spear3] +4378 [if_button,combat_spiked:spiked0] +4379 [if_button,combat_spiked:spiked1] +4380 [if_button,combat_spiked:spiked2] +4381 [if_button,combat_spiked:spiked3] +4382 [if_button,combat_stabsword:stab0] +4383 [if_button,combat_stabsword:stab1] +4384 [if_button,combat_stabsword:stab2] +4385 [if_button,combat_stabsword:stab3] +4386 [if_button,combat_thrown:thrown0] +4387 [if_button,combat_thrown:thrown1] +4388 [if_button,combat_thrown:thrown2] +4389 [if_button,combat_unarmed:unarmed0] +4390 [if_button,combat_unarmed:unarmed1] +4391 [if_button,combat_unarmed:unarmed2] +4392 [if_button,combat_staff_2:staff2a] +4393 [if_button,combat_staff_2:staff2b] +4394 [if_button,combat_staff_2:staff2c] +4395 [if_button,combat_staff_2:auto_toggle] +4396 [proc,set_attackstyle] +4397 [queue,set_attackstyle] +4398 [queue,set_attack_style_magic] +4399 [proc,update_weapon_category] +4400 [proc,weapon_category_tab_attack] +4401 [proc,weapon_category_tab_attack_unarmed] +4402 [proc,.update_weapon_category] +4403 [proc,.weapon_category_tab_attack] +4404 [proc,.weapon_category_tab_attack_unarmed] +4405 [queue,poison_player] +4406 [timer,poison] +4407 [debugproc,poison] +4408 [proc,poison_damage] +4409 [proc,clear_poison] +4410 [proc,.clear_poison] +4411 [proc,npc_projectile] +4412 [proc,player_projectile] +4413 [proc,coord_projectile] +4414 [proc,deserves_pk_skull] +4415 [proc,set_pk_vars] +4416 [proc,pk_skull] +4417 [proc,clear_pk_skull] +4418 [proc,.clear_pk_skull] +4419 [softtimer,pk_skull_timer] +4420 [proc,set_pk_skull_logout] +4421 [proc,set_pk_skull_login] +4422 [opplayer2,_] +4423 [applayer2,_] +4424 [label,pvp_combat_start] +4425 [proc,pvp_level_check] +4426 [proc,pvp_in_combat_check] +4427 [proc,pvp_hit_roll] +4428 [proc,pvp_xp_multiplier] +4429 [proc,give_combat_experience_pvp] +4430 [queue,pvp_damage] +4431 [queue,recoil_damage] +4432 [proc,pvp_death_message] +4433 [opplayert,magic:wind_strike] +4434 [opplayert,magic:water_strike] +4435 [opplayert,magic:earth_strike] +4436 [opplayert,magic:fire_strike] +4437 [opplayert,magic:wind_bolt] +4438 [opplayert,magic:water_bolt] +4439 [opplayert,magic:earth_bolt] +4440 [opplayert,magic:fire_bolt] +4441 [opplayert,magic:wind_blast] +4442 [opplayert,magic:water_blast] +4443 [opplayert,magic:earth_blast] +4444 [opplayert,magic:fire_blast] +4445 [opplayert,magic:wind_wave] +4446 [opplayert,magic:water_wave] +4447 [opplayert,magic:earth_wave] +4448 [opplayert,magic:fire_wave] +4449 [opplayert,magic:curse] +4450 [opplayert,magic:weaken] +4451 [opplayert,magic:confuse] +4452 [opplayert,magic:bind] +4453 [opplayert,magic:snare] +4454 [opplayert,magic:entangle] +4455 [opplayert,magic:vulnerability] +4456 [opplayert,magic:enfeeble] +4457 [opplayert,magic:stun] +4458 [opplayert,magic:crumble_undead] +4459 [applayert,magic:wind_strike] +4460 [applayert,magic:water_strike] +4461 [applayert,magic:earth_strike] +4462 [applayert,magic:fire_strike] +4463 [applayert,magic:wind_bolt] +4464 [applayert,magic:water_bolt] +4465 [applayert,magic:earth_bolt] +4466 [applayert,magic:fire_bolt] +4467 [applayert,magic:wind_blast] +4468 [applayert,magic:water_blast] +4469 [applayert,magic:earth_blast] +4470 [applayert,magic:fire_blast] +4471 [applayert,magic:wind_wave] +4472 [applayert,magic:water_wave] +4473 [applayert,magic:earth_wave] +4474 [applayert,magic:fire_wave] +4475 [applayert,magic:curse] +4476 [applayert,magic:weaken] +4477 [applayert,magic:confuse] +4478 [applayert,magic:bind] +4479 [applayert,magic:snare] +4480 [applayert,magic:entangle] +4481 [applayert,magic:vulnerability] +4482 [applayert,magic:enfeeble] +4483 [applayert,magic:stun] +4484 [applayert,magic:crumble_undead] +4485 [proc,pvp_default_spell] +4486 [proc,pvp_combat_spell_checks] +4487 [proc,pvp_freeze_allowed] +4488 [proc,pvp_debuff_allowed] +4489 [proc,pvp_stat_change_effect] +4490 [proc,pvp_freeze_effect] +4491 [proc,pvp_spell_success] +4492 [proc,pvp_spell_fail] +4493 [proc,pvp_spell_cast] +4494 [proc,magic_spell_maxhit] +4495 [queue,pvp_freeze_player] +4496 [label,pvp_melee_attack] +4497 [label,pvp_ranged_attack] +4498 [proc,pvp_ranged_use_weapon] +4499 [opplayert,magic:claws_of_guthix] +4500 [proc,pvp_claws_of_guthix] +4501 [opplayert,magic:flames_of_zamorak] +4502 [proc,pvp_flames_of_zamorak] +4503 [proc,god_spell_maxhit] +4504 [opplayert,magic:saradomin_strike] +4505 [proc,pvp_saradomin_strike] +4506 [opheldu,weapon_poison] +4507 [opheldu,_weapon_stab] +4508 [opheldu,_weapon_spear] +4509 [opheldu,_weapon_javelin] +4510 [opheldu,_weapon_thrown] +4511 [opheldu,_bolts] +4512 [opheldu,_arrows] +4513 [label,make_weapon_poisoned] +4514 [oplocu,_cooking_oven] +4515 [oplocu,_cooking_fire] +4516 [label,attempt_cook_item] +4517 [label,cook_item] +4518 [oploc1,loc_2712] +4519 [opnpc1,npc_847] +4520 [opheldu,cake_tin] +4521 [opheldu,egg] +4522 [opheldu,bucket_milk] +4523 [opheldu,chocolaty_milk] +4524 [opheldu,chocolate_bar] +4525 [opheldu,chocolate_dust] +4526 [opheldu,snape_grass] +4527 [opheldu,cake] +4528 [label,make_uncooked_cake] +4529 [proc,check_cake_ingredients] +4530 [label,make_chocolate_cake] +4531 [label,make_chocolate_milk] +4532 [label,make_hangover_cure] +4533 [opheldu,pot_of_flour] +4534 [label,dough_interface] +4535 [opheldu,lemon_slices] +4536 [opheldu,lime_slices] +4537 [opheldu,lemon_chunks] +4538 [opheldu,lime_chunks] +4539 [opheldu,pot_of_cream] +4540 [label,finish_cocktail] +4541 [proc,handle_cocktail_data] +4542 [opheld1,cocktail_shaker] +4543 [opheldu,cocktail_shaker] +4544 [opheldu,cocktail_glass] +4545 [opheldu,dwellberry] +4546 [opheldu,_alcoholic_drinks] +4547 [opheldu,equa_leaves] +4548 [label,pour_cocktail_shaker] +4549 [label,add_cocktail_ingredient] +4550 [proc,get_cocktail_ingredient_step] +4551 [proc,get_cocktail_ingredient_name] +4552 [proc,get_cocktail_ingredient_count] +4553 [proc,clear_cocktail_ingredients] +4554 [opheldu,knife] +4555 [opheldu,lemon] +4556 [opheldu,orange] +4557 [opheldu,lime] +4558 [opheldu,pineapple] +4559 [label,slice_or_dice_interface] +4560 [opheld1,half_baked_batta] +4561 [opheldu,half_baked_batta] +4562 [opheldu,cabbage] +4563 [opheldu,seasoned_toad_legs] +4564 [opheldu,spicy_worm] +4565 [proc,get_gnome_batta_product] +4566 [label,add_batta_ingredient] +4567 [proc,get_batta_ingredient_step] +4568 [proc,get_batta_ingredient_name] +4569 [proc,get_batta_ingredient_count] +4570 [proc,clear_batta_ingredients] +4571 [opheld1,half_baked_gnomebowl] +4572 [opheldu,half_baked_gnomebowl] +4573 [opheldu,king_worm] +4574 [opheldu,toad_legs] +4575 [proc,get_gnome_bowl_product] +4576 [label,add_bowl_ingredient] +4577 [proc,get_bowl_ingredient_step] +4578 [proc,get_bowl_ingredient_name] +4579 [proc,get_bowl_ingredient_count] +4580 [proc,clear_bowl_ingredients] +4581 [opheldu,gianne_dough] +4582 [label,make_raw_gnome] +4583 [opheldu,_category_15] +4584 [opheldu,gnome_spice] +4585 [label,finish_gnome_food] +4586 [opheld1,swamp_toad] +4587 [proc,handle_gnome_food_data] +4588 [label,opheldu_make_gnome_food] +4589 [opheld1,half_baked_crunchies] +4590 [opheldu,half_baked_crunchies] +4591 [proc,get_gnome_crunchies_product] +4592 [label,add_crunchies_ingredient] +4593 [proc,get_crunchies_ingredient_step] +4594 [proc,get_crunchies_ingredient_name] +4595 [proc,get_crunchies_ingredient_count] +4596 [proc,clear_crunchies_ingredients] +4597 [opheldu,cooked_meat] +4598 [opheldu,cooked_chicken] +4599 [opheldu,palm_leaf] +4600 [opheldu,raw_oomlie] +4601 [label,make_oomlie_wrap] +4602 [opheldu,pastry_dough] +4603 [opheldu,piedish] +4604 [opheldu,pie_shell] +4605 [opheldu,cooking_apple] +4606 [opheldu,redberry] +4607 [opheld1,burnt_pie] +4608 [label,make_pie_shell] +4609 [label,make_uncooked_pie] +4610 [opheldu,pizza_base] +4611 [opheldu,tomato] +4612 [opheldu,cheese] +4613 [opheldu,incomplete_pizza] +4614 [opheldu,uncooked_pizza] +4615 [opheldu,pineapple_ring] +4616 [opheldu,pineapple_chunks] +4617 [opheldu,anchovies] +4618 [opheldu,plain_pizza] +4619 [label,use_topping_on_pizza] +4620 [label,uncooked_pizza_message] +4621 [label,make_incomplete_pizza] +4622 [label,make_uncooked_pizza] +4623 [label,make_pizza_with_topping] +4624 [opheldu,potato] +4625 [opheldu,uncooked_stew] +4626 [opheldu,spice] +4627 [opheld1,burnt_stew] +4628 [label,no_water_stew_message] +4629 [label,make_incomplete_stew] +4630 [label,make_uncooked_stew] +4631 [label,make_curry] +4632 [opheldu,onion] +4633 [opheldu,ugthanki_meat] +4634 [opheldu,chopped_tomato] +4635 [opheldu,chopped_onion] +4636 [opheldu,chopped_ugthanki] +4637 [opheldu,chopped_onion_tomato] +4638 [opheldu,chopped_ugthanki_onion] +4639 [opheldu,chopped_ugthanki_tomato] +4640 [opheldu,kebab_mix] +4641 [opheldu,pitta_bread] +4642 [label,make_bowl_mixture] +4643 [label,make_bowl_mixture2] +4644 [label,make_ugthanki_kebab] +4645 [opheldu,grapes] +4646 [label,make_wine] +4647 [timer,fermenting_wine] +4648 [opheldu,battlestaff] +4649 [opheldu,_craft_orb] +4650 [label,craft_staff] +4651 [oploc1,crafting_guild_door] +4652 [opnpc1,master_crafter] +4653 [opheldu,red_dye] +4654 [opheldu,blue_dye] +4655 [opheldu,yellow_dye] +4656 [opheldu,green_dye] +4657 [opheldu,purple_dye] +4658 [opheldu,orange_dye] +4659 [opheldu,black_cape] +4660 [opheldu,red_cape] +4661 [opheldu,blue_cape] +4662 [opheldu,yellow_cape] +4663 [opheldu,green_cape] +4664 [opheldu,purple_cape] +4665 [opheldu,orange_cape] +4666 [label,craft_capes] +4667 [label,craft_dyes] +4668 [opheldu,chisel] +4669 [opheldu,uncut_sapphire] +4670 [opheldu,uncut_emerald] +4671 [opheldu,uncut_ruby] +4672 [opheldu,uncut_diamond] +4673 [opheldu,uncut_opal] +4674 [opheldu,uncut_jade] +4675 [opheldu,uncut_red_topaz] +4676 [opheldu,uncut_dragonstone] +4677 [label,crafting_gem] +4678 [oplocu,sand_pit] +4679 [opheldu,glassblowing_pipe] +4680 [opheldu,molten_glass] +4681 [label,sand_fill] +4682 [label,smelt_glass] +4683 [label,craft_glass_interface] +4684 [label,crafting_glass] +4685 [inv_button1,crafting_jewelry:rings_inv] +4686 [inv_button2,crafting_jewelry:rings_inv] +4687 [inv_button3,crafting_jewelry:rings_inv] +4688 [inv_button1,crafting_jewelry:necklaces_inv] +4689 [inv_button2,crafting_jewelry:necklaces_inv] +4690 [inv_button3,crafting_jewelry:necklaces_inv] +4691 [inv_button1,crafting_jewelry:amulets_inv] +4692 [inv_button2,crafting_jewelry:amulets_inv] +4693 [inv_button3,crafting_jewelry:amulets_inv] +4694 [if_close,crafting_jewelry] +4695 [label,craft_gold_interface] +4696 [label,craft_gold] +4697 [proc,crafting_gold] +4698 [label,craft_silver] +4699 [opheldu,ball_of_wool] +4700 [opheldu,unstrung_sapphire_amulet] +4701 [opheldu,unstrung_emerald_amulet] +4702 [opheldu,unstrung_ruby_amulet] +4703 [opheldu,unstrung_diamond_amulet] +4704 [opheldu,unstrung_dragonstone_amulet] +4705 [opheldu,unstrung_symbol] +4706 [opheldu,unstrung_emblem] +4707 [label,string_amulet] +4708 [if_button,leather_crafting:com_88] +4709 [if_button,leather_crafting:com_89] +4710 [if_button,leather_crafting:com_90] +4711 [if_button,leather_crafting:com_91] +4712 [if_button,leather_crafting:com_97] +4713 [if_button,leather_crafting:com_99] +4714 [if_button,leather_crafting:com_100] +4715 [if_button,leather_crafting:com_110] +4716 [opheldu,needle] +4717 [opheldu,leather] +4718 [opheldu,hardleather] +4719 [opheldu,dragon_leather] +4720 [opheldu,dragon_leather_blue] +4721 [opheldu,dragon_leather_red] +4722 [opheldu,dragon_leather_black] +4723 [opheldu,thread] +4724 [proc,check_craft_leather_reqs] +4725 [label,craft_leather] +4726 [label,craft_leather_interface] +4727 [label,craft_dhide_interface] +4728 [opheldu,clay] +4729 [oplocu,potters_wheel] +4730 [oplocu,pottery_oven] +4731 [label,make_softclay] +4732 [label,craft_pottery_interface] +4733 [label,craft_pottery] +4734 [label,fire_pottery] +4735 [oplocu,spinning_wheel] +4736 [label,craft_spinning] +4737 [opheldu,steel_studs] +4738 [opheldu,leather_chaps] +4739 [opheldu,leather_body] +4740 [label,craft_studded] +4741 [opheldu,achey_logs] +4742 [label,light_achey_inv] +4743 [opobj4,_category_22] +4744 [opobju,_category_22] +4745 [opheldu,tinderbox] +4746 [label,light_logs_ground] +4747 [label,light_logs_inv] +4748 [proc,firemaking_success] +4749 [proc,area_allow_loc_add] +4750 [label,ignite_light_source] +4751 [label,fishing_wrong_spot_message] +4752 [proc,check_fish_equipment] +4753 [proc,fish_roll] +4754 [oploc1,loc_2025] +4755 [label,fishing_guild_level_fail] +4756 [opnpc1,npc_308] +4757 [opnpc1,npc_592] +4758 [ai_timer,_freshfish] +4759 [ai_timer,_rarefish] +4760 [ai_timer,_memberfish] +4761 [ai_timer,_saltfish] +4762 [ai_timer,npc_800] +4763 [label,move_fishing_spot] +4764 [proc,fishing_spot_random_coord] +4765 [proc,check_fishing_spot_empty] +4766 [opnpc1,_rarefish] +4767 [opnpc3,_rarefish] +4768 [opnpc2,_rarefish] +4769 [opnpc4,_rarefish] +4770 [opnpcu,_rarefish] +4771 [label,attempt_fish_lobster] +4772 [label,fish_lobster] +4773 [label,attempt_fish_swordfish] +4774 [label,fish_swordfish] +4775 [opnpc1,_freshfish] +4776 [opnpc3,_freshfish] +4777 [opnpc2,_freshfish] +4778 [opnpc4,_freshfish] +4779 [opnpcu,_freshfish] +4780 [label,attempt_fish_trout_salmon] +4781 [label,fish_trout_salmon] +4782 [label,attempt_fish_pike] +4783 [label,fish_pike] +4784 [oploc1,loc_2027] +4785 [oploc3,loc_2027] +4786 [oploc2,loc_2027] +4787 [oploc4,loc_2027] +4788 [oplocu,loc_2027] +4789 [proc,fish_roll_waterfall] +4790 [opnpc1,_saltfish] +4791 [opnpc3,_saltfish] +4792 [opnpc2,_saltfish] +4793 [opnpc4,_saltfish] +4794 [opnpcu,_saltfish] +4795 [label,attempt_fish_shrimp] +4796 [label,fish_shrimp] +4797 [label,attempt_fish_sardine] +4798 [label,fish_sardine] +4799 [opnpc1,_memberfish] +4800 [opnpc3,_memberfish] +4801 [opnpc2,_memberfish] +4802 [opnpc4,_memberfish] +4803 [label,attempt_fish_shark] +4804 [label,fish_shark] +4805 [label,attempt_fish_mackerel] +4806 [label,fish_mackerel] +4807 [proc,fish_roll_big_net] +4808 [opheld1,oyster] +4809 [opheld1,casket] +4810 [opnpc1,npc_800] +4811 [opnpc2,npc_800] +4812 [opnpcu,npc_800] +4813 [apnpc1,npc_800] +4814 [apnpc2,npc_800] +4815 [apnpcu,npc_800] +4816 [label,oil_rod_fishing_use_item] +4817 [label,burnup_fishing_equipment] +4818 [label,attempt_fish_lava_eel] +4819 [label,fish_lava_eel] +4820 [proc,oil_rod_fishing_check_requirements] +4821 [opheldu,arrow_shaft] +4822 [opheldu,_category_968] +4823 [opheldu,headless_arrow] +4824 [label,make_headless_arrows] +4825 [label,make_arrows] +4826 [opheldu,opal] +4827 [opheldu,oyster_perl] +4828 [opheldu,oyster_perls] +4829 [opheldu,_category_530] +4830 [opheldu,bolt] +4831 [label,make_bolt_tips] +4832 [label,make_bolts] +4833 [opheldu,_unstrung_bow] +4834 [opheldu,bow_string] +4835 [label,string_bow] +4836 [opheldu,_category_22] +4837 [label,fletch_log] +4838 [opheldu,_category_969] +4839 [opheldu,feather] +4840 [label,make_darts] +4841 [proc,get_fletching_data] +4842 [opheldu,wolf_bones] +4843 [opheldu,obj_2864] +4844 [opheldu,obj_2865] +4845 [label,make_ogre_shafts] +4846 [label,make_wolf_bone_tips] +4847 [label,make_ogre_headless_arrows] +4848 [label,make_ogre_arrows] +4849 [opheldu,vial_water] +4850 [opheldu,unf_guam_potion] +4851 [opheldu,unf_marrentill_potion] +4852 [opheldu,unf_tarromin_potion] +4853 [opheldu,unf_harralander_potion] +4854 [opheldu,unf_ranarr_potion] +4855 [opheldu,unf_irit_potion] +4856 [opheldu,unf_avantoe_potion] +4857 [opheldu,unf_kwuarm_potion] +4858 [opheldu,unf_cadantine_potion] +4859 [opheldu,unf_lantadyme_potion] +4860 [opheldu,unf_dwarf_weed_potion] +4861 [opheldu,unf_torstol_potion] +4862 [proc,attempt_brew_potion] +4863 [opheldu,_category_69] +4864 [label,decant_potion] +4865 [proc,doses_made] +4866 [proc,get_potion_type] +4867 [opheldu,unicorn_horn] +4868 [opheldu,blue_dragon_scale] +4869 [proc,attempt_grind_ingredient] +4870 [proc,identify_herb] +4871 [proc,brew_potion] +4872 [proc,grind_ingredient] +4873 [opheld1,unidentified_guam_leaf] +4874 [opheld1,unidentified_marrentill] +4875 [opheld1,unidentified_tarromin] +4876 [opheld1,unidentified_harralander] +4877 [opheld1,unidentified_ranarr_weed] +4878 [opheld1,unidentified_irit_leaf] +4879 [opheld1,unidentified_avantoe] +4880 [opheld1,unidentified_kwuarm] +4881 [opheld1,unidentified_cadantine] +4882 [opheld1,unidentified_lantadyme] +4883 [opheld1,unidentified_dwarf_weed] +4884 [opheld1,unidentified_torstol] +4885 [opheld1,unidentified_snake_weed] +4886 [opheld1,unidentified_ardrigal] +4887 [opheld1,unidentified_sito_foil] +4888 [opheld1,unidentified_volencia_moss] +4889 [opheld1,unidentified_rogues_purse] +4890 [proc,attempt_identify_herb] +4891 [proc,get_spell_data] +4892 [proc,check_spell_requirements] +4893 [proc,staff_runes] +4894 [proc,delete_spell_runes] +4895 [proc,give_spell_xp] +4896 [proc,magic_spell_search_convertobj] +4897 [proc,magic_spell_specificobj_reqmessage] +4898 [opheldt,magic:highlvl_alchemy] +4899 [opheldt,magic:lowlvl_alchemy] +4900 [label,magic_spell_high_alch] +4901 [label,magic_spell_low_alch] +4902 [proc,is_alchable] +4903 [if_button,magic:charge] +4904 [timer,charge] +4905 [proc,has_god_cape_and_staff] +4906 [oploct,magic:air_orb] +4907 [oploct,magic:water_orb] +4908 [oploct,magic:earth_orb] +4909 [oploct,magic:fire_orb] +4910 [label,magic_spell_charge_orb] +4911 [if_button,magic:bones_to_bananas] +4912 [label,magic_spell_convert_bones] +4913 [opheldt,magic:enchant_lvl1] +4914 [opheldt,magic:enchant_lvl2] +4915 [opheldt,magic:enchant_lvl3] +4916 [opheldt,magic:enchant_lvl4] +4917 [opheldt,magic:enchant_lvl5] +4918 [label,magic_spell_enchant] +4919 [opheld4,amulet_of_glory_4] +4920 [opheld4,amulet_of_glory_3] +4921 [opheld4,amulet_of_glory_2] +4922 [opheld4,amulet_of_glory_1] +4923 [opheld4,amulet_of_glory] +4924 [label,amulet_of_glory_interface] +4925 [opheld4,_category_136] +4926 [proc,ring_of_recoil_lose_charge] +4927 [proc,ring_of_life_check] +4928 [opheldt,magic:superheat_item] +4929 [label,magic_spell_superheat] +4930 [opobjt,magic:telekinetic_grab] +4931 [apobjt,magic:telekinetic_grab] +4932 [label,magic_spell_telegrab] +4933 [if_button,magic:varrock_teleport] +4934 [if_button,magic:lumbridge_teleport] +4935 [if_button,magic:falador_teleport] +4936 [if_button,magic:camelot_teleport] +4937 [if_button,magic:ardougne_teleport] +4938 [if_button,magic:watchtower_teleport] +4939 [label,magic_teleport] +4940 [proc,player_teleport_normal] +4941 [proc,p_telejump_safe] +4942 [proc,pre_tele_checks] +4943 [opnpc1,npc_382] +4944 [label,dwarf_at_entrance] +4945 [oploc1,_mining_rock_normal] +4946 [oploc3,_mining_rock_normal] +4947 [oploc1,_mining_rock_fast] +4948 [oploc3,_mining_rock_fast] +4949 [oploc1,loc_2491] +4950 [oploc3,loc_2491] +4951 [oploc1,gem_rock_1] +4952 [oploc3,gem_rock_1] +4953 [label,mining_firstswing] +4954 [label,mining_continue] +4955 [label,get_ore_normal] +4956 [label,get_ore_fast] +4957 [label,get_ore_essence] +4958 [label,get_ore_gem_rock] +4959 [proc,mining_gem_table] +4960 [proc,mining_sound] +4961 [proc,pickaxe_checker] +4962 [oploc2,_mining_rock_normal] +4963 [oploc2,_mining_rock_fast] +4964 [oploc2,loc_2491] +4965 [oploc2,gem_rock_1] +4966 [label,prospect_rock] +4967 [label,finish_prospect_normal] +4968 [label,finish_prospect_essence] +4969 [oploc1,_prayer_altar] +4970 [label,pray_at_altar] +4971 [debugproc,1pray] +4972 [opheld1,bones] +4973 [opheld1,burnt_bones] +4974 [opheld1,bat_bones] +4975 [opheld1,big_bones] +4976 [opheld1,babydragon_bones] +4977 [opheld1,dragon_bones] +4978 [opheld1,wolf_bones] +4979 [label,bury_bones] +4980 [queue,finish_bury] +4981 [queue,prayer_activate] +4982 [proc,get_prayer_data] +4983 [proc,prayer_checks] +4984 [proc,prayer_activate] +4985 [queue,start_draining] +4986 [timer,drain_prayer] +4987 [proc,prayers_are_active] +4988 [proc,deactivate_prayers] +4989 [proc,.deactivate_prayers] +4990 [proc,prayer_deactivate] +4991 [if_button,prayer:prayer_clarity] +4992 [label,activate_prayer_clarity] +4993 [if_button,prayer:prayer_improvedreflexes] +4994 [label,activate_prayer_improvedreflexes] +4995 [if_button,prayer:prayer_incrediblereflexes] +4996 [label,activate_prayer_incrediblereflexes] +4997 [if_button,prayer:prayer_protectfrommagic] +4998 [label,activate_prayer_protectfrommagic] +4999 [if_button,prayer:prayer_protectfrommelee] +5000 [label,activate_prayer_protectfrommelee] +5001 [if_button,prayer:prayer_protectfrommissiles] +5002 [label,activate_prayer_protectfrommissiles] +5003 [if_button,prayer:prayer_protectitems] +5004 [label,activate_prayer_protectitems] +5005 [if_button,prayer:prayer_rapidheal] +5006 [label,activate_prayer_rapidheal] +5007 [if_button,prayer:prayer_rapidrestore] +5008 [label,activate_prayer_rapidrestore] +5009 [if_button,prayer:prayer_rockskin] +5010 [label,activate_prayer_rockskin] +5011 [if_button,prayer:prayer_steelskin] +5012 [label,activate_prayer_steelskin] +5013 [if_button,prayer:prayer_strengthburst] +5014 [label,activate_prayer_strengthburst] +5015 [if_button,prayer:prayer_superhumanstrength] +5016 [label,activate_prayer_superhumanstrength] +5017 [if_button,prayer:prayer_thickskin] +5018 [label,activate_prayer_thickskin] +5019 [if_button,prayer:prayer_ultimatestrength] +5020 [label,activate_prayer_ultimatestrength] +5021 [label,teleport_to_essence_mine] +5022 [oploc1,loc_2492] +5023 [oploc1,_rc_exit_portal] +5024 [oplocu,_rc_altar] +5025 [oploc1,_rc_altar] +5026 [oplocu,_rc_ruins] +5027 [label,teleport_to_ruins] +5028 [label,runecraft_runes] +5029 [opheld4,_talismans] +5030 [opheld4,cosmic_talisman] +5031 [proc,talisman_locate_coord] +5032 [proc,get_runecraft_data] +5033 [oplocu,_smithing_furnace] +5034 [label,smelt_ore] +5035 [proc,lose_charge_ring_of_forging] +5036 [opheldu,shield_left_half] +5037 [opheldu,shield_right_half] +5038 [label,make_dragon_sq] +5039 [inv_button1,smithing:column1] +5040 [inv_button2,smithing:column1] +5041 [inv_button3,smithing:column1] +5042 [inv_button1,smithing:column2] +5043 [inv_button2,smithing:column2] +5044 [inv_button3,smithing:column2] +5045 [inv_button1,smithing:column3] +5046 [inv_button2,smithing:column3] +5047 [inv_button3,smithing:column3] +5048 [inv_button1,smithing:column4] +5049 [inv_button2,smithing:column4] +5050 [inv_button3,smithing:column4] +5051 [inv_button1,smithing:column5] +5052 [inv_button2,smithing:column5] +5053 [inv_button3,smithing:column5] +5054 [oplocu,anvil] +5055 [if_close,smithing] +5056 [label,smithing_anvil_interface] +5057 [label,attempt_smithing] +5058 [proc,smithing_anvil] +5059 [oploc1,chest_10_coins] +5060 [oploc1,chest_nature_rune] +5061 [oploc1,chest_50_coins] +5062 [oploc1,chest_steel_arrowtips] +5063 [oploc1,chest_blood_runes] +5064 [oploc1,chest_ardougne_castle] +5065 [oploc2,chest_10_coins] +5066 [oploc2,chest_nature_rune] +5067 [oploc2,chest_50_coins] +5068 [oploc2,chest_steel_arrowtips] +5069 [oploc2,chest_blood_runes] +5070 [oploc2,chest_ardougne_castle] +5071 [proc,attempt_trapped_chest] +5072 [oploc1,loc_2550] +5073 [oploc1,loc_2551] +5074 [oploc1,loc_2554] +5075 [oploc1,loc_2555] +5076 [oploc1,loc_2556] +5077 [oploc1,loc_2557] +5078 [oploc1,loc_2558] +5079 [oploc1,loc_2559] +5080 [oploc2,loc_2550] +5081 [oploc2,loc_2551] +5082 [oploc2,loc_2554] +5083 [oploc2,loc_2555] +5084 [oploc2,loc_2556] +5085 [oploc2,loc_2557] +5086 [oplocu,loc_2557] +5087 [oploc2,loc_2558] +5088 [oplocu,loc_2558] +5089 [oploc2,loc_2559] +5090 [oplocu,loc_2559] +5091 [proc,attempt_open_locked_door] +5092 [proc,pick_locked_door] +5093 [opnpc3,man_white] +5094 [opnpc3,man_blue] +5095 [opnpc3,man_brown] +5096 [opnpc3,woman_purple] +5097 [opnpc3,woman_brown] +5098 [opnpc3,woman_red] +5099 [opnpc3,farmer] +5100 [opnpc3,guard_sword] +5101 [opnpc3,guard_crossbow] +5102 [opnpc3,warrior_woman] +5103 [opnpc3,man_black] +5104 [opnpc3,alkharid_warrior] +5105 [opnpc3,paladin] +5106 [opnpc3,hero] +5107 [opnpc3,knight_of_ardougne_1] +5108 [opnpc3,man_cavalier] +5109 [opnpc3,woman_east_ardougne] +5110 [opnpc3,knight_of_ardougne_2] +5111 [opnpc3,guard_ardougne] +5112 [opnpc3,watchman] +5113 [opnpc3,gnome_green] +5114 [opnpc3,gnome_brown] +5115 [opnpc3,gnome_black] +5116 [opnpc3,gnome_child_yellow] +5117 [opnpc3,gnome_child_blue] +5118 [opnpc3,gnome_child_green] +5119 [opnpc3,gnome_woman_white] +5120 [opnpc3,gnome_woman_black] +5121 [opnpc3,rogue] +5122 [proc,attempt_pick_pocket] +5123 [oploc2,tea_stall_stealing] +5124 [oploc2,silk_stall_stealing] +5125 [oploc2,bakers_stall_stealing] +5126 [oploc2,gem_stall_stealing] +5127 [oploc2,fur_stall_stealing] +5128 [oploc2,spice_stall_stealing] +5129 [oploc2,silver_stall_stealing] +5130 [proc,attempt_steal_from_stall] +5131 [proc,stealing_check_for_guard] +5132 [proc,stealing_check_for_owner] +5133 [proc,stealing_guard_within_distance] +5134 [label,stall_owner_alert_guards] +5135 [proc,update_stall_trade_timers] +5136 [proc,reset_stall_trade_timers] +5137 [proc,pick_pocket] +5138 [proc,check_if_success_pick_pocket] +5139 [proc,fail_pick_pocket] +5140 [proc,steal_from_stall] +5141 [label,activate_trapped_chest] +5142 [proc,disarm_trapped_chest] +5143 [proc,pick_pocket_check_for_reward] +5144 [proc,stealing_check_for_reward] +5145 [proc,trapped_chest_check_for_reward] +5146 [oploc1,_tree] +5147 [oploc3,_tree] +5148 [oplocu,_tree] +5149 [label,attempt_cut_tree] +5150 [label,cut_tree] +5151 [proc,woodcutting_axe_checker] +5152 [label,woodcutting_axe_fail] +5153 [label,your_inventory_is_full] +5154 [label,woodcutting_level_failmessage] +5155 [proc,woodcutting_successchance] +5156 [opnpc1,brother_brace] +5157 [label,brother_brace_intro] +5158 [label,brother_brace_open_indicated_menu_prayer] +5159 [label,brother_brace_this_is_your_prayer_list] +5160 [label,brother_brace_friends_and_ignore_tabs] +5161 [label,brother_brace_recap] +5162 [label,brother_brace_recap_questions] +5163 [label,brother_brace_prayer_recap] +5164 [label,brother_brace_friends_recap] +5165 [label,brother_brace_no_thanks] +5166 [proc,set_hint_icon_brother_brace] +5167 [opnpc1,combat_instructor] +5168 [label,combat_instructor_start] +5169 [label,combat_instructor_lets_teach_you_wield] +5170 [label,combat_instructor_dagger_equipped] +5171 [label,combat_instructor_equipping_sword_and_shield] +5172 [label,combat_instructor_check_combat_interface] +5173 [label,combat_instructor_get_away_from_there] +5174 [label,combat_instructor_youre_not_ready_to_continue] +5175 [label,combat_instructor_time_for_combat] +5176 [label,combat_instructor_killed_giant_rat_melee] +5177 [label,combat_instructor_during_giant_rat_ranged] +5178 [label,combat_instructor_dont_enter_the_pit_ranged] +5179 [label,combat_instructor_recap] +5180 [label,combat_instructor_recap_questions] +5181 [label,combat_instructor_combat_stats_recap] +5182 [label,combat_instructor_melee_combat_recap] +5183 [label,combat_instructor_ranged_combat_recap] +5184 [label,combat_instructor_moving_on] +5185 [proc,combat_instructor_replace_items] +5186 [proc,set_hint_icon_combat_instructor] +5187 [opnpc1,financial_advisor] +5188 [label,financial_advisor_incomplete] +5189 [label,financial_advisor_recap_questions] +5190 [label,financial_advisor_recap] +5191 [label,financial_advisor_no_thanks] +5192 [proc,set_hint_icon_financial_advisor] +5193 [opnpc1,magic_instructor] +5194 [label,magic_instructor_start] +5195 [label,magic_instructor_open_tab] +5196 [label,magic_instructor_opened_tab] +5197 [label,magic_instructor_cast_wind_strike] +5198 [proc,magic_instructor_runes_to_give] +5199 [label,magic_instructor_successfully_cast_wind_strike] +5200 [label,magic_instructor_to_mainland] +5201 [label,magic_instructor_decline_mainland] +5202 [proc,magic_instructor_give_runes] +5203 [proc,set_hint_icon_magic_instructor] +5204 [opnpc1,master_chef] +5205 [label,master_chef_start] +5206 [label,master_chef_after_start] +5207 [proc,master_chef_give_ingredients] +5208 [label,master_chef_recap] +5209 [proc,master_chef_recap_options] +5210 [proc,master_chef_recap_response] +5211 [proc,set_hint_icon_master_chef] +5212 [opnpc1,mining_instructor] +5213 [label,mining_instructor_start] +5214 [label,mining_instructor_during_prospecting] +5215 [label,mining_instructor_during_mining] +5216 [label,mining_instructor_after_prospecting] +5217 [label,mining_instructor_before_smelting] +5218 [label,mining_instructor_after_smelting] +5219 [label,mining_instructor_smith_a_dagger] +5220 [label,mining_instructor_recap] +5221 [label,mining_instructor_prospecting_recap] +5222 [label,mining_instructor_mining_recap] +5223 [label,mining_instructor_smelting_recap] +5224 [label,mining_instructor_smithing_recap] +5225 [label,mining_instructor_ready_to_move_on] +5226 [proc,mining_instructor_replace_items] +5227 [proc,set_hint_icon_mining_instructor] +5228 [opnpc1,quest_guide] +5229 [label,quest_guide_start] +5230 [label,quest_guide_journal_info] +5231 [proc,quest_guide_journal_info_no_intro] +5232 [label,quest_guide_menu_not_opened] +5233 [label,quest_guide_recap] +5234 [label,quest_guide_not_ready_to_leave_yet] +5235 [proc,set_hint_icon_quest_guide] +5236 [opnpc1,runescape_guide] +5237 [label,runescape_guide_welcome] +5238 [label,runescape_guide_return] +5239 [proc,set_hint_runescape_guide] +5240 [opnpc1,survival_expert] +5241 [label,survival_guide_start] +5242 [label,survival_guide_look_at_menu] +5243 [label,survival_guide_fire] +5244 [proc,survival_guide_replace_items] +5245 [proc,survival_guide_replace_items_no_objboxes] +5246 [label,survival_guide_fishing] +5247 [label,survival_guide_fishing_after_burning] +5248 [label,survival_guide_recap] +5249 [proc,survival_guide_recap_response] +5250 [proc,survival_recap_questions] +5251 [proc,survival_recap_skills] +5252 [proc,survival_recap_woodcutting] +5253 [proc,survival_recap_fishing] +5254 [proc,survival_recap_firemaking] +5255 [proc,survival_recap_cooking] +5256 [proc,set_hint_icon_survival_guide] +5257 [oploc1,loc_3045] +5258 [oploc1,loc_416] +5259 [opnpc1,tut_banker] +5260 [apnpc1,tut_banker] +5261 [label,tut_banker] +5262 [label,tut_open_bank] +5263 [label,banker_no_thanks] +5264 [apnpc2,tut_chicken] +5265 [proc,set_hint_icon_chicken] +5266 [ai_queue1,tut_giant_rat] +5267 [ai_queue3,tut_giant_rat] +5268 [ai_opplayer2,tut_giant_rat] +5269 [opnpc2,tut_giant_rat] +5270 [apnpc2,tut_giant_rat] +5271 [queue,set_rat_kill] +5272 [proc,set_hint_icon_giant_rat] +5273 [label,tut_bury_bones] +5274 [queue,tut_finish_bury] +5275 [opheldu,tutorial_pot_of_flour] +5276 [oplocu,loc_3039] +5277 [label,tut_attempt_cook_item] +5278 [label,tut_random_shrimp_chance] +5279 [label,tut_random_meat_chance] +5280 [label,tut_make_dough] +5281 [opobj4,tutorial_logs] +5282 [opobju,tutorial_logs] +5283 [label,tut_light_logs_ground] +5284 [label,tut_light_logs_inv] +5285 [label,tut_firemaking_move_and_delay] +5286 [proc,tut_firemaking_move] +5287 [label,tut_firemaking_success] +5288 [opnpcu,tut_fishing_spot] +5289 [opnpc1,tut_fishing_spot] +5290 [label,tutorial_fishing] +5291 [oploc1,loc_3042] +5292 [oploc1,loc_3043] +5293 [proc,tut_mining] +5294 [oploc2,loc_3042] +5295 [oploc2,loc_3043] +5296 [proc,tut_prospect] +5297 [proc,tut_hint_icon_rocks] +5298 [proc,pvm_tutorial_spell] +5299 [proc,tut_pvm_spell_cast] +5300 [proc,tut_give_spell_xp] +5301 [oplocu,furnace_tutorial] +5302 [label,tut_smelting] +5303 [proc,tut_smithing_anvil] +5304 [oploc1,loc_3033] +5305 [oploc1,loc_3034] +5306 [oploc1,loc_3036] +5307 [label,tut_woodcutting] +5308 [proc,tut_woodcutting_swap_loc] +5309 [label,tut_advance_woodcutting] +5310 [label,give_logs] +5311 [oploc1,loc_3037] +5312 [proc,tutorial_step_getting_started] +5313 [proc,tutorial_step_player_controls_spanner] +5314 [proc,tutorial_step_player_controls_left_click] +5315 [proc,tutorial_step_interact_with_scenery] +5316 [proc,tutorial_step_moving_around] +5317 [proc,tutorial_step_view_inventory] +5318 [proc,tutorial_step_cut_tree] +5319 [proc,tutorial_please_wait_woodcutting] +5320 [proc,tutorial_step_build_fire] +5321 [proc,tutorial_please_wait_firemaking] +5322 [proc,tutorial_step_you_gained_experience] +5323 [proc,tutorial_step_view_stats] +5324 [proc,tutorial_step_catch_shrimp] +5325 [proc,tutorial_please_wait_fishing] +5326 [proc,tutorial_step_cook_shrimp] +5327 [proc,tutorial_step_burn_shrimp] +5328 [proc,tutorial_step_survival_recap] +5329 [proc,tutorial_step_go_to_chef] +5330 [proc,tutorial_step_talk_to_chef] +5331 [proc,tutorial_step_make_dough] +5332 [proc,tutorial_step_cooking_dough] +5333 [proc,tutorial_step_click_music_player] +5334 [proc,tutorial_step_music_player] +5335 [proc,tutorial_step_click_run_icon] +5336 [proc,tutorial_step_enable_run] +5337 [proc,tutorial_step_enter_quest_guide_house] +5338 [proc,tutorial_step_talk_to_quest_guide] +5339 [proc,tutorial_step_open_quest_journal] +5340 [proc,tutorial_step_quest_journal] +5341 [proc,tutorial_step_enter_mine] +5342 [proc,tutorial_step_talk_to_mining_instructor] +5343 [proc,tutorial_please_wait_prospecting] +5344 [proc,tutorial_step_prospect_rocks] +5345 [proc,tutorial_please_wait_mining] +5346 [proc,tutorial_step_mining] +5347 [proc,tutorial_step_smelting] +5348 [proc,tutorial_step_bronze_bar] +5349 [proc,tutorial_step_smithing_a_dagger] +5350 [proc,tutorial_step_mining_instructor_finished] +5351 [proc,tutorial_step_combat] +5352 [proc,tutorial_step_wielding_weapons] +5353 [proc,tutorial_step_worn_inventory] +5354 [proc,tutorial_step_dagger_equipped] +5355 [proc,tutorial_step_unequipping_items] +5356 [proc,tutorial_step_open_combat_interface] +5357 [proc,tutorial_step_opened_combat_interface] +5358 [proc,tutorial_step_attacking_melee] +5359 [proc,tutorial_step_sit_back_and_watch_melee] +5360 [proc,tutorial_step_first_kill_melee] +5361 [proc,tutorial_step_rat_ranging] +5362 [proc,tutorial_step_combat_moving_on] +5363 [proc,tutorial_step_banking] +5364 [proc,tutorial_step_this_is_your_bank_box] +5365 [proc,tutorial_step_financial_advisor] +5366 [proc,tutorial_financial_advisor_continue_through_door] +5367 [proc,tutorial_to_the_chapel] +5368 [proc,tutorial_your_prayer_menu] +5369 [proc,tutorial_your_prayer_menu_post_click] +5370 [proc,tutorial_friends_tab] +5371 [proc,tutorial_ignore_tab] +5372 [proc,tutorial_your_ignore_list] +5373 [proc,tutorial_your_final_instructor] +5374 [proc,tutorial_your_final_instructor_2] +5375 [proc,tutorial_open_your_final_menu] +5376 [proc,tutorial_cast_wind_strike] +5377 [proc,tutorial_cast_wind_strike_splash] +5378 [proc,tutorial_cast_wind_strike_success] +5379 [proc,tut_island_survial_gate] +5380 [oploc1,_tutorial_gate] +5381 [oploc1,loc_3014] +5382 [oploc1,loc_3017] +5383 [oploc1,loc_3018] +5384 [oploc1,loc_3019] +5385 [oploc1,loc_3029] +5386 [oploc1,loc_3028] +5387 [oploc1,_tut_mining_exit] +5388 [proc,tut_open_mining_gate] +5389 [oploc1,_rat_pit_cage] +5390 [proc,tut_open_rat_pit] +5391 [oploc1,loc_3030] +5392 [oploc1,loc_3031] +5393 [oploc1,loc_3024] +5394 [oploc1,loc_3025] +5395 [oploc1,loc_3026] +5396 [label,start_tutorial] +5397 [proc,tutorial_set_active_tabs] +5398 [proc,tutorial_set_npc_hints] +5399 [if_button,player_kit:accept] +5400 [if_close,player_kit] +5401 [tutorial_clickside,_] +5402 [proc,set_tutorial_progress] +5403 [label,tutorial_island_equip] +5404 [proc,tutorial_has_obj_on_person] +5405 [proc,tutorial_give_xp] +5406 [label,tutorial_complete] +5407 [proc,tutorialstep_page] +5408 [proc,tutorialstep] +5409 [proc,in_tutorial_island] +5410 [debugproc,map_findsquare] +5411 [debugproc,imp] +5412 [opnpc1,king_lathas] +5413 [oploc1,loc_2034] +5414 [opnpc1,npc_369] +5415 [opnpc1,npc_371] +5416 [opnpc1,npc_370] +5417 [ai_queue3,npc_370] +5418 [queue,defeat_biohazard_mourner] +5419 [label,omart_letsdo] +5420 [label,omart_backsoon] +5421 [opnpc1,npc_345] +5422 [oploc1,loc_2039] +5423 [oploc1,loc_2041] +5424 [label,open_combat_training_gate] +5425 [oploc1,loc_2038] +5426 [opnpc1,npc_368] +5427 [oploc1,_varrock_gate] +5428 [label,open_varrockgate] +5429 [ai_timer,imp] +5430 [ai_queue2,imp] +5431 [proc,npc_imp_teleport] +5432 [opnpc1,chancy1] +5433 [label,chancy_ethenea] +5434 [label,chancy_liquidhoney] +5435 [label,chancy_sulphuricbroline] +5436 [opnpc1,chancy2] +5437 [opnpc1,chemist] +5438 [label,chemist_touchpaperplague] +5439 [label,chemist_takeplaguesample] +5440 [label,chemist_touchpaperguidor] +5441 [opnpc1,Artist1] +5442 [label,devinci_ethenea] +5443 [label,devinci_liquidhoney] +5444 [label,devinci_sulphuricbroline] +5445 [opnpc1,Artist2] +5446 [opnpc1,guidor] +5447 [label,guidor_elena] +5448 [opnpc1,guidors_wife] +5449 [opnpc1,hops1] +5450 [label,hops_ethenea] +5451 [label,hops_liquidhoney] +5452 [label,hops_sulphuricbroline] +5453 [opnpc1,hops2] +5454 [opnpc1,jerico] +5455 [oploc1,loc_2032] +5456 [oploc1,loc_2067] +5457 [oplocu,loc_2067] +5458 [oploc1,loc_2057] +5459 [opheld1,pigeon_cage] +5460 [label,biohazard_climb_ladder] +5461 [oplocu,loc_2043] +5462 [oploc1,loc_2063] +5463 [oploc1,loc_2058] +5464 [oploc1,loc_2060] +5465 [oplocu,loc_2058] +5466 [oplocu,loc_2060] +5467 [label,open_mournerhq_gate] +5468 [oploc1,loc_2064] +5469 [queue,quest_biohazard_complete] +5470 [oploc1,loc_2143] +5471 [oploc1,loc_2144] +5472 [label,kaqemeex_our_circle] +5473 [label,kaqemeex_herblore_fundamentals] +5474 [ai_queue3,earth_warrior] +5475 [ai_queue3,giant_rat1] +5476 [ai_queue3,giant_rat2] +5477 [ai_queue3,skeleton1] +5478 [ai_queue3,skeleton2] +5479 [ai_queue3,skeleton3] +5480 [ai_queue3,skeleton4] +5481 [ai_queue3,zombie1] +5482 [ai_queue3,zombie2] +5483 [ai_queue3,zombie3] +5484 [ai_timer,zombie1] +5485 [ai_timer,zombie2] +5486 [ai_timer,zombie3] +5487 [advancestat,attack] +5488 [advancestat,strength] +5489 [advancestat,ranged] +5490 [advancestat,magic] +5491 [advancestat,defence] +5492 [advancestat,hitpoints] +5493 [advancestat,prayer] +5494 [advancestat,agility] +5495 [advancestat,herblore] +5496 [advancestat,thieving] +5497 [advancestat,crafting] +5498 [advancestat,runecraft] +5499 [advancestat,mining] +5500 [advancestat,smithing] +5501 [advancestat,fishing] +5502 [advancestat,cooking] +5503 [advancestat,firemaking] +5504 [advancestat,woodcutting] +5505 [advancestat,fletching] +5506 [queue,macro_event_login] +5507 [proc,macro_event_lost_hostile] +5508 [mapzone,0_29_75] +5509 [mapzone,0_30_75] +5510 [mapzone,0_31_75] +5511 [mapzone,0_33_71] +5512 [mapzone,0_33_72] +5513 [mapzone,0_33_73] +5514 [mapzone,0_33_75] +5515 [mapzone,0_34_75] +5516 [mapzone,0_36_52] +5517 [mapzone,0_36_53] +5518 [mapzone,0_36_54] +5519 [mapzone,0_36_153] +5520 [mapzone,0_36_154] +5521 [mapzone,0_37_49] +5522 [mapzone,0_37_51] +5523 [mapzone,0_37_52] +5524 [mapzone,0_37_53] +5525 [mapzone,0_37_54] +5526 [mapzone,0_37_55] +5527 [mapzone,0_37_73] +5528 [mapzone,0_37_75] +5529 [mapzone,0_37_147] +5530 [mapzone,0_37_149] +5531 [mapzone,0_37_150] +5532 [mapzone,0_37_151] +5533 [mapzone,0_38_49] +5534 [mapzone,0_38_50] +5535 [mapzone,0_38_51] +5536 [mapzone,0_38_52] +5537 [mapzone,0_38_53] +5538 [mapzone,0_38_54] +5539 [mapzone,0_38_55] +5540 [mapzone,0_38_150] +5541 [mapzone,0_38_151] +5542 [mapzone,0_39_46] +5543 [mapzone,0_39_47] +5544 [mapzone,0_39_48] +5545 [mapzone,0_39_49] +5546 [mapzone,0_39_50] +5547 [mapzone,0_39_51] +5548 [mapzone,0_39_52] +5549 [mapzone,0_39_53] +5550 [mapzone,0_39_54] +5551 [mapzone,0_39_55] +5552 [mapzone,0_39_75] +5553 [mapzone,0_39_147] +5554 [mapzone,0_39_150] +5555 [mapzone,0_39_153] +5556 [mapzone,0_39_155] +5557 [mapzone,0_40_46] +5558 [mapzone,0_40_47] +5559 [mapzone,0_40_48] +5560 [mapzone,0_40_49] +5561 [mapzone,0_40_50] +5562 [mapzone,0_40_51] +5563 [mapzone,0_40_52] +5564 [mapzone,0_40_53] +5565 [mapzone,0_40_54] +5566 [mapzone,0_40_75] +5567 [mapzone,0_40_147] +5568 [mapzone,0_40_148] +5569 [mapzone,0_40_149] +5570 [mapzone,0_40_150] +5571 [mapzone,0_40_151] +5572 [mapzone,0_40_154] +5573 [mapzone,0_41_46] +5574 [mapzone,0_41_48] +5575 [mapzone,0_41_49] +5576 [mapzone,0_41_50] +5577 [mapzone,0_41_51] +5578 [mapzone,0_41_52] +5579 [mapzone,0_41_53] +5580 [mapzone,0_41_54] +5581 [mapzone,0_41_55] +5582 [mapzone,0_41_73] +5583 [mapzone,0_41_75] +5584 [mapzone,0_41_146] +5585 [mapzone,0_41_152] +5586 [mapzone,0_41_153] +5587 [mapzone,0_41_154] +5588 [mapzone,0_42_49] +5589 [mapzone,0_42_50] +5590 [mapzone,0_42_51] +5591 [mapzone,0_42_52] +5592 [mapzone,0_42_53] +5593 [mapzone,0_42_54] +5594 [mapzone,0_42_55] +5595 [mapzone,0_42_75] +5596 [mapzone,0_42_151] +5597 [mapzone,0_42_152] +5598 [mapzone,0_42_153] +5599 [mapzone,0_43_45] +5600 [mapzone,0_43_46] +5601 [mapzone,0_43_47] +5602 [mapzone,0_43_48] +5603 [mapzone,0_43_49] +5604 [mapzone,0_43_50] +5605 [mapzone,0_43_51] +5606 [mapzone,0_43_52] +5607 [mapzone,0_43_53] +5608 [mapzone,0_43_54] +5609 [mapzone,0_43_55] +5610 [mapzone,0_43_73] +5611 [mapzone,0_43_75] +5612 [mapzone,0_43_145] +5613 [mapzone,0_43_146] +5614 [mapzone,0_43_153] +5615 [mapzone,0_44_45] +5616 [mapzone,0_44_46] +5617 [mapzone,0_44_47] +5618 [mapzone,0_44_48] +5619 [mapzone,0_44_49] +5620 [mapzone,0_44_50] +5621 [mapzone,0_44_51] +5622 [mapzone,0_44_52] +5623 [mapzone,0_44_53] +5624 [mapzone,0_44_54] +5625 [mapzone,0_44_55] +5626 [mapzone,0_44_75] +5627 [mapzone,0_44_148] +5628 [mapzone,0_44_149] +5629 [mapzone,0_44_150] +5630 [mapzone,0_44_152] +5631 [mapzone,0_44_153] +5632 [mapzone,0_44_154] +5633 [mapzone,0_44_155] +5634 [mapzone,0_45_45] +5635 [mapzone,0_45_46] +5636 [mapzone,0_45_47] +5637 [mapzone,0_45_48] +5638 [mapzone,0_45_49] +5639 [mapzone,0_45_50] +5640 [mapzone,0_45_51] +5641 [mapzone,0_45_52] +5642 [mapzone,0_45_53] +5643 [mapzone,0_45_54] +5644 [mapzone,0_45_55] +5645 [mapzone,0_45_73] +5646 [mapzone,0_45_75] +5647 [mapzone,0_45_145] +5648 [mapzone,0_45_146] +5649 [mapzone,0_45_148] +5650 [mapzone,0_45_151] +5651 [mapzone,0_45_152] +5652 [mapzone,0_45_153] +5653 [mapzone,0_45_154] +5654 [mapzone,0_46_45] +5655 [mapzone,0_46_46] +5656 [mapzone,0_46_47] +5657 [mapzone,0_46_49] +5658 [mapzone,0_46_50] +5659 [mapzone,0_46_51] +5660 [mapzone,0_46_52] +5661 [mapzone,0_46_53] +5662 [mapzone,0_46_54] +5663 [mapzone,0_46_55] +5664 [mapzone,0_46_56] +5665 [mapzone,0_46_57] +5666 [mapzone,0_46_58] +5667 [mapzone,0_46_59] +5668 [mapzone,0_46_60] +5669 [mapzone,0_46_61] +5670 [mapzone,0_46_149] +5671 [mapzone,0_46_152] +5672 [mapzone,0_46_153] +5673 [mapzone,0_47_47] +5674 [mapzone,0_47_48] +5675 [mapzone,0_47_49] +5676 [mapzone,0_47_50] +5677 [mapzone,0_47_51] +5678 [mapzone,0_47_52] +5679 [mapzone,0_47_53] +5680 [mapzone,0_47_54] +5681 [mapzone,0_47_55] +5682 [mapzone,0_47_56] +5683 [mapzone,0_47_57] +5684 [mapzone,0_47_58] +5685 [mapzone,0_47_59] +5686 [mapzone,0_47_60] +5687 [mapzone,0_47_61] +5688 [mapzone,0_47_149] +5689 [mapzone,0_47_152] +5690 [mapzone,0_47_153] +5691 [mapzone,0_47_160] +5692 [mapzone,0_47_161] +5693 [mapzone,0_48_47] +5694 [mapzone,0_48_48] +5695 [mapzone,0_48_49] +5696 [mapzone,0_48_50] +5697 [mapzone,0_48_51] +5698 [mapzone,0_48_52] +5699 [mapzone,0_48_53] +5700 [mapzone,0_48_54] +5701 [mapzone,0_48_55] +5702 [mapzone,0_48_56] +5703 [mapzone,0_48_57] +5704 [mapzone,0_48_58] +5705 [mapzone,0_48_59] +5706 [mapzone,0_48_60] +5707 [mapzone,0_48_61] +5708 [mapzone,0_48_148] +5709 [mapzone,0_48_149] +5710 [mapzone,0_48_153] +5711 [mapzone,0_48_154] +5712 [mapzone,0_48_155] +5713 [mapzone,0_48_156] +5714 [mapzone,0_49_47] +5715 [mapzone,0_49_48] +5716 [mapzone,0_49_49] +5717 [mapzone,0_49_50] +5718 [mapzone,0_49_51] +5719 [mapzone,0_49_52] +5720 [mapzone,0_49_53] +5721 [mapzone,0_49_54] +5722 [mapzone,0_49_55] +5723 [mapzone,0_49_56] +5724 [mapzone,0_49_57] +5725 [mapzone,0_49_58] +5726 [mapzone,0_49_59] +5727 [mapzone,0_49_60] +5728 [mapzone,0_49_61] +5729 [mapzone,0_49_148] +5730 [mapzone,0_49_149] +5731 [mapzone,0_49_153] +5732 [mapzone,0_49_154] +5733 [mapzone,0_50_47] +5734 [mapzone,0_50_48] +5735 [mapzone,0_50_49] +5736 [mapzone,0_50_50] +5737 [mapzone,0_50_51] +5738 [mapzone,0_50_52] +5739 [mapzone,0_50_53] +5740 [mapzone,0_50_54] +5741 [mapzone,0_50_55] +5742 [mapzone,0_50_56] +5743 [mapzone,0_50_57] +5744 [mapzone,0_50_58] +5745 [mapzone,0_50_59] +5746 [mapzone,0_50_60] +5747 [mapzone,0_50_61] +5748 [mapzone,0_50_149] +5749 [mapzone,0_50_150] +5750 [mapzone,0_50_152] +5751 [mapzone,0_50_153] +5752 [mapzone,0_50_154] +5753 [mapzone,0_51_46] +5754 [mapzone,0_51_47] +5755 [mapzone,0_51_48] +5756 [mapzone,0_51_49] +5757 [mapzone,0_51_50] +5758 [mapzone,0_51_51] +5759 [mapzone,0_51_52] +5760 [mapzone,0_51_53] +5761 [mapzone,0_51_54] +5762 [mapzone,0_51_55] +5763 [mapzone,0_51_56] +5764 [mapzone,0_51_57] +5765 [mapzone,0_51_58] +5766 [mapzone,0_51_59] +5767 [mapzone,0_51_60] +5768 [mapzone,0_51_61] +5769 [mapzone,0_51_147] +5770 [mapzone,0_51_154] +5771 [mapzone,0_52_47] +5772 [mapzone,0_52_48] +5773 [mapzone,0_52_49] +5774 [mapzone,0_52_50] +5775 [mapzone,0_52_51] +5776 [mapzone,0_52_52] +5777 [mapzone,0_52_53] +5778 [mapzone,0_52_54] +5779 [mapzone,0_52_55] +5780 [mapzone,0_52_56] +5781 [mapzone,0_52_57] +5782 [mapzone,0_52_58] +5783 [mapzone,0_52_59] +5784 [mapzone,0_52_60] +5785 [mapzone,0_52_61] +5786 [mapzone,0_52_152] +5787 [mapzone,0_52_153] +5788 [ai_timer,nora_t_hagg] +5789 [queue,druid_fundamentals] +5790 [tutorial,_] diff --git a/src/public/data/symbols/seq.sym b/src/public/data/symbols/seq.sym new file mode 100644 index 00000000..301b51c2 --- /dev/null +++ b/src/public/data/symbols/seq.sym @@ -0,0 +1,1027 @@ +0 swarm_walk +1 swarm_seq_1 +2 swarm_seq_2 +3 fish_seq_3 +4 fish_ready +5 fish_seq_5 +6 rock_ready +7 duck_swim +8 duck_defend +9 duck_death +10 shark_walk +11 shark_divedown +12 shark_diveup +13 ghosthuman_walk_forward +14 human_seq_14 +15 ghosthuman_ready +16 seq_16 +17 seq_17 +18 seq_18 +19 seq_19 +20 seq_20 +21 bdrag_walk +22 bdrag_walkbackwards +23 bdrag_walkright +24 bdrag_walkleft +25 bdrag_attack +26 bdrag_block +27 bdrag_ready +28 bdrag_death +29 bat_walk +30 bat_attack +31 bat_parry +32 bat_seq_32 +33 bat_seq_33 +34 bat_seq_34 +35 bat_ready +36 bat_death +37 bear_walk +38 bear_walkbackwards +39 bear_walkleft +40 bear_walkright +41 bear_attack +42 bear_block +43 bear_ready +44 bear_death +45 camel_walk +46 camel_seq_46 +47 camel_seq_47 +48 camel_seq_48 +49 camel_attack +50 camel_block +51 camel_ready +52 camel_death +53 chicken_walk +54 chicken_ready +55 chicken_attack +56 chicken_block +57 chicken_death +58 cow_walk +59 cow_attack +60 cow_block +61 cow_ready +62 cow_death +63 demon_walk +64 demon_attack +65 demon_block +66 demon_ready +67 demon_death +68 demon_death_greater +69 demon_casting +70 delrith_ready +71 delrith_banish +72 demon_appear +73 nasty_tree_attack +74 dog_walk +75 dog_attack +76 dog_block +77 dog_ready +78 dog_death +79 dragon_walk +80 dragon_attack +81 dragon_firebreath_all_attack +82 dragon_firebreath_left_attack +83 dragon_firebreath_right_attack +84 dragon_firebreath_middle_attack +85 seq_85 +86 seq_86 +87 seq_87 +88 seq_88 +89 dragon_block +90 dragon_ready +91 dragon_head_attack +92 dragon_death +93 dryhad_walk +94 dryhad_attack +95 dryhad_block +96 dryhad_ready +97 dryhad_death +98 dwarf_walk +99 dwarf_attack +100 dwarf_block +101 dwarf_ready +102 dwarf_death +103 dwarf_seq_103 +104 dwarf_drunkwalk +105 dwarf_seq_105 +106 fairy_walk +107 fairy_seq_107 +108 fairy_seq_108 +109 fairy_seq_109 +110 fairy_attack +111 fairy_block +112 fairy_ready +113 fairy_death +114 firebird_walk +115 firebird_attack +116 firebird_block +117 firebird_ready +118 firebird_death +119 ghost_walk +120 ghost_seq_120 +121 ghost_seq_121 +122 ghost_seq_122 +123 ghost_attack +124 ghost_block +125 ghost_ready +126 ghost_death +127 giant_walk +128 giant_attack +129 giant_block +130 giant_ready +131 giant_death +132 giant_casting +133 giant_teleport_reverse +134 giant_teleport +135 seq_135 +136 seq_136 +137 giantrat_walk +138 giantrat_attack +139 giantrat_block +140 giantrat_ready +141 giantrat_death +142 giantspider_walk +143 giantspider_attack +144 giantspider_block +145 giantspider_ready +146 giantspider_death +147 giantspider_casting +148 giantspider_teleport_reverse +149 giantspider_teleport +150 seq_150 +151 seq_151 +152 golem_walk +153 golem_attack +154 golem_block +155 golem_ready +156 golem_death +157 hellhound_walk +158 hellhound_attack +159 hellhound_block +160 hellhound_ready +161 hellhound_death +162 hobgoblin_walk +163 hobgoblin_spear_attack +164 hobgoblin_attack +165 hobgoblin_block +166 hobgoblin_ready +167 hobgoblin_death +168 imp_walk +169 imp_attack +170 imp_block +171 imp_ready +172 imp_death +173 imp_seq_173 +174 imp_seq_174 +175 imp_seq_175 +176 lizardman_walk +177 lizardman_attack +178 lizardman_block +179 lizardman_ready +180 lizardman_death +181 magicaxe_walk +182 magicaxe_walkbackwards +183 magicaxe_walkleft +184 magicaxe_walkright +185 magicaxe_attack +186 magicaxe_block +187 magicaxe_ready +188 magicaxe_death +189 midget_walk +190 midget_attackbow +191 midget_attackunarmed +192 midget_attacksword +193 midget_block +194 midget_blockshield +195 midget_ready +196 midget_death +197 midget_chanting +198 midget_seq_198 +199 midget_seq_199 +200 midget_seq_200 +201 midget_seq_201 +202 midget_seq_202 +203 midget_seq_203 +204 midget_seq_204 +205 midget_seq_205 +206 midget_seq_206 +207 midget_seq_207 +208 midget_seq_208 +209 midget_seq_209 +210 midget_seq_210 +211 midget_seq_211 +212 midget_seq_212 +213 midget_seq_213 +214 midget_seq_214 +215 midget_seq_215 +216 midget_seq_216 +217 midget_seq_217 +218 midget_seq_218 +219 monkey_walk +220 monkey_attack +221 monkey_block +222 monkey_ready +223 monkey_death +224 mummy_walk +225 mummy_attack +226 mummy_block +227 mummy_ready +228 mummy_death +229 orc_walk +230 orc_attack +231 orc_block +232 orc_ready +233 orc_death +234 penguin_walk +235 penguin_ready +236 penguin_death +237 penguin_attack +238 penguin_block +239 rat_walk +240 rat_attack +241 rat_block +242 rat_ready +243 rat_death +244 scorpion_walk +245 scorpion_ready +246 scorpion_attack +247 scorpion_parry +248 scorpion_death +249 sheep_walk +250 sheep_attack +251 sheep_block +252 sheep_ready +253 sheep_death +254 skavid_walk +255 skavid_attack +256 skavid_block +257 skavid_ready +258 skavid_death +259 skeleton_walk +260 skeleton_attack +261 skeleton_block +262 skeleton_ready +263 skeleton_death +264 skeleton_trans_ready +265 skeleton_trans_attack +266 skeleton_trans_block +267 skeleton_trans_walk +268 skeleton_trans_death +269 smallscorpion_walk +270 smallscorpion_attack +271 smallscorpion_block +272 smallscorpion_ready +273 smallscorpion_death +274 snake_walk +275 snake_attack +276 snake_block +277 snake_ready +278 snake_death +279 spider_walk +280 spider_attack +281 spider_block +282 spider_death +283 troll_walk +284 troll_attack +285 troll_block +286 troll_ready +287 troll_death +288 unicorn_walk +289 unicorn_attack +290 unicorn_block +291 unicorn_ready +292 unicorn_death +293 yeti_walk +294 yeti_attack +295 yeti_block +296 yeti_ready +297 yeti_death +298 zombie_walk +299 zombie_attack +300 zombie_block +301 zombie_ready +302 zombie_death +303 mammoth_walk +304 mammoth_attack +305 mammoth_block +306 mammoth_ready +307 mammoth_death +308 goblin_walk +309 goblin_attack_unarmed +310 goblin_attack_armed +311 goblin_ready +312 goblin_block +313 goblin_death +314 cat_walk +315 cat_attack +316 cat_archback +317 cat_ready +318 cat_rollingover +319 cat_pounce +320 cat_death +321 terrorbird_walk +322 terrorbird_attack +323 terrorbird_block +324 terrorbird_ready +325 terrorbird_death +326 mounted_terrorbird_walk +327 mounted_terrorbird_attack +328 mounted_terrorbird_gnome_hands_over_food +329 mounted_terrorbird_defend +330 mounted_terrorbird_ready +331 mounted_terrorbird_death +332 seq_332 +333 seq_333 +334 seq_334 +335 seq_335 +336 souless_walk +337 souless_ready +338 souless_attack +339 souless_block +340 souless_death +341 bird_walk +342 bird_ready +343 bird_death +344 bird_attack +345 bird_hit +346 sitting_ready +347 ibansboltcasting +348 seq_348 +349 seq_349 +350 seq_350 +351 seq_351 +352 seq_352 +353 seq_353 +354 seq_354 +355 seq_355 +356 seq_356 +357 ogre_ready +358 ogre_walk +359 ogre_attack +360 ogre_block +361 ogre_death +362 butterfly_hover +363 human_herbing_vial +364 human_herbing_grind +365 explodingvial +366 seq_366 +367 seq_367 +368 seq_368 +369 seq_369 +370 seq_370 +371 seq_371 +372 seq_372 +373 seq_373 +374 seq_374 +375 seq_375 +376 human_ddagger_lunge +377 human_ddagger_hack +378 human_dagger_defend1 +379 human_dagger_defend2 +380 human_dspear_slash +381 human_dspear_stab +382 human_dspear_pound +383 human_dspear_def +384 human_ibanstaff_2h_defend +385 human_holy_water_throw +386 human_sword_stab +387 human_sword_defend1 +388 human_sword_defend2 +389 earthwarrior_def +390 human_sword_slash +391 human_sword_transslash +392 human_sword_lunge +393 earthwarrior_chop +394 human_trans_axe_chop +395 human_baxe_slash +396 seq_396 +397 human_baxe_defend1 +398 human_baxe_defend2 +399 human_trans_axe_def +400 human_blunt_stab +401 human_blunt_crush +402 seq_402 +403 human_blunt_defend1 +404 human_blunt_defend2 +405 human_spear_lunge +406 human_2h_crush +407 human_2h_slash +408 human_dspear_lunge +409 human_spear_slash +410 human_bow_defend +411 human_2h_sword_defend +412 human_staff_spike +413 human_staff_pummel +414 human_staff_pound +415 human_staff_def +416 human_staff_block +417 human_stafforb_spike +418 human_stafforb_pummel +419 human_stafforb_pound +420 human_stafforb_def +421 human_stafforb_block +422 human_unarmedpunch +423 human_unarmedkick +424 human_unarmedblock +425 human_defend_cowardly +426 human_bow +427 human_crossbow +428 human_spear_stab +429 human_spear_pound +430 human_spear_def +431 human_khazard_spear_defend +432 human_spear_throw +433 human_farmersfork_stab +434 human_farmersfork_defend +435 human_scythe_block +436 human_scythe_def +437 human_scythe_lunge +438 human_scythe_sweep +439 human_scythe_spin +440 human_scythe_slash +441 seq_441 +442 seq_442 +443 catapult_fire +444 seq_444 +445 seq_445 +446 seq_446 +447 fishingspot_ready +448 fishingspot_walk +449 seq_449 +450 partyroom_lever +451 seq_451 +452 seq_452 +453 seq_453 +454 seq_454 +455 seq_455 +456 seq_456 +457 seq_457 +458 seq_458 +459 seq_459 +460 seq_460 +461 seq_461 +462 seq_462 +463 seq_463 +464 seq_464 +465 seq_465 +466 spinningwheel +467 seq_467 +468 seq_468 +469 seq_469 +470 seq_470 +471 seq_471 +472 seq_472 +473 seq_473 +474 seq_474 +475 seq_475 +476 seq_476 +477 seq_477 +478 seq_478 +479 seq_479 +480 seq_480 +481 seq_481 +482 seq_482 +483 seq_483 +484 seq_484 +485 seq_485 +486 seq_486 +487 seq_487 +488 seq_488 +489 seq_489 +490 seaslug_crane_left +491 seq_491 +492 seq_492 +493 seq_493 +494 seq_494 +495 seq_495 +496 seq_496 +497 rope_swing +498 seq_498 +499 seq_499 +500 seq_500 +501 seq_501 +502 seq_502 +503 seq_503 +504 seq_504 +505 seq_505 +506 seq_506 +507 seq_507 +508 seq_508 +509 seq_509 +510 seq_510 +511 seq_511 +512 seq_512 +513 seq_513 +514 cannon_west +515 cannon_north_west +516 cannon_north +517 cannon_north_east +518 cannon_east +519 cannon_south_east +520 cannon_south +521 cannon_south_west +522 seq_522 +523 seq_523 +524 seq_524 +525 seq_525 +526 seq_526 +527 seq_527 +528 seq_528 +529 seq_529 +530 seq_530 +531 seq_531 +532 seq_532 +533 seq_533 +534 seq_534 +535 human_closechest +536 human_openchest +537 human_picklock_chest +538 seq_538 +539 seq_539 +540 seq_540 +541 human_closecupboard +542 human_opencupboard +543 seq_543 +544 seq_544 +545 seq_545 +546 seq_546 +547 seq_547 +548 seq_548 +549 seq_549 +550 seq_550 +551 seq_551 +552 seq_552 +553 seq_553 +554 chat_quiz1 +555 chat_quiz2 +556 chat_quiz3 +557 chat_quiz4 +558 seq_558 +559 seq_559 +560 seq_560 +561 seq_561 +562 chat_bored1 +563 chat_bored2 +564 chat_bored3 +565 chat_bored4 +566 chat_short +567 chat_happy1 +568 chat_happy2 +569 chat_happy3 +570 chat_happy4 +571 chat_shock1 +572 chat_shock2 +573 chat_shock3 +574 chat_shock4 +575 chat_confused1 +576 chat_confused2 +577 chat_confused3 +578 chat_confused4 +579 chat_silent +580 chat_goblin1 +581 chat_goblin2 +582 chat_goblin3 +583 chat_goblin4 +584 seq_584 +585 seq_585 +586 seq_586 +587 seq_587 +588 chat_neutral1 +589 chat_neutral2 +590 chat_neutral3 +591 chat_default +592 chat_shifty1 +593 chat_shifty2 +594 chat_shifty3 +595 chat_shifty4 +596 chat_worried1 +597 chat_worried2 +598 chat_worried3 +599 chat_worried4 +600 chat_drunk1 +601 chat_drunk2 +602 chat_drunk3 +603 chat_drunk4 +604 chat_verymad +605 chat_laugh1 +606 chat_laugh2 +607 chat_laugh3 +608 chat_laugh4 +609 chat_madlaugh +610 chat_sad1 +611 chat_sad2 +612 chat_sad3 +613 chat_sad4 +614 chat_angry1 +615 chat_angry2 +616 chat_angry3 +617 chat_angry4 +618 human_harpoon +619 human_lobster +620 human_largenet +621 human_smallnet +622 human_fishing_casting +623 human_fish_onspot +624 human_mining_rune_pickaxe +625 human_mining_bronze_pickaxe +626 human_mining_iron_pickaxe +627 human_mining_steel_pickaxe +628 human_mining_adamant_pickaxe +629 human_mining_mithril_pickaxe +630 seq_630 +631 seq_631 +632 seq_632 +633 seq_633 +634 seq_634 +635 seq_635 +636 seq_636 +637 seq_637 +638 seq_638 +639 seq_639 +640 seq_640 +641 seq_641 +642 human_mining_pickaxe_handle +643 seq_643 +644 human_woodcutting_axe_handle +645 human_pray +646 seq_646 +647 seq_647 +648 seq_648 +649 seq_649 +650 seq_650 +651 seq_651 +652 seq_652 +653 seq_653 +654 seq_654 +655 seq_655 +656 seq_656 +657 seq_657 +658 seq_658 +659 seq_659 +660 seq_660 +661 seq_661 +662 seq_662 +663 seq_663 +664 seq_664 +665 seq_665 +666 seq_666 +667 seq_667 +668 seq_668 +669 seq_669 +670 seq_670 +671 seq_671 +672 seq_672 +673 seq_673 +674 seq_674 +675 seq_675 +676 seq_676 +677 seq_677 +678 seq_678 +679 seq_679 +680 seq_680 +681 seq_681 +682 seq_682 +683 seq_683 +684 seq_684 +685 seq_685 +686 seq_686 +687 seq_687 +688 seq_688 +689 seq_689 +690 seq_690 +691 seq_691 +692 seq_692 +693 seq_693 +694 seq_694 +695 seq_695 +696 seq_696 +697 seq_697 +698 seq_698 +699 seq_699 +700 seq_700 +701 seq_701 +702 seq_702 +703 seq_703 +704 seq_704 +705 seq_705 +706 seq_706 +707 zap +708 human_castibanblast +709 human_castheal +710 human_chaos_druid_cast_bind +711 human_caststrike +712 human_castlowlvlalchemy +713 human_casthighlvlalchemy +714 human_castteleport +715 human_castteleport_reverse +716 human_castconfuse +717 human_castweaken +718 human_castcurse +719 human_enchantamuletlvl1 +720 human_enchantamuletlvl2 +721 human_enchantamuletlvl3 +722 human_castbonestobananas +723 human_casttelegrab +724 human_castcrumbleundead +725 human_castsuperheatitem +726 human_castchargeorb +727 human_castwave +728 human_castenfeeble +729 human_caststun +730 seq_730 +731 seq_731 +732 seq_732 +733 human_createfire +734 seq_734 +735 seq_735 +736 seq_736 +737 seq_737 +738 seq_738 +739 seq_739 +740 human_rock_climb +741 human_jump_stones +742 monkeybar_jump_up +743 monkeybar_jump_down +744 monkeybar_move +745 seq_745 +746 seq_746 +747 seq_747 +748 seq_748 +749 human_pipesqueeze +750 seq_750 +751 human_ropeswing +752 human_ledge_on_right +753 human_ledge_on_left +754 human_ledge_walk_right +755 seq_755 +756 human_ledge_walk_left +757 seq_757 +758 human_ledge_off_right +759 human_ledge_off_left +760 seq_760 +761 seq_761 +762 human_walk_logbalance +763 seq_763 +764 human_sidestep_fall +765 human_drowning +766 seq_766 +767 seq_767 +768 seq_768 +769 human_steppingstonejump +770 seq_770 +771 seq_771 +772 human_swim +773 seq_773 +774 seq_774 +775 seq_775 +776 seq_776 +777 seq_777 +778 seq_778 +779 seq_779 +780 seq_780 +781 seq_781 +782 seq_782 +783 seq_783 +784 seq_784 +785 seq_785 +786 seq_786 +787 seq_787 +788 seq_788 +789 seq_789 +790 seq_790 +791 human_runecraft +792 seq_792 +793 seq_793 +794 seq_794 +795 seq_795 +796 seq_796 +797 seq_797 +798 seq_798 +799 seq_799 +800 half-souless_ready +801 seq_801 +802 seq_802 +803 seq_803 +804 seq_804 +805 seq_805 +806 human_stake +807 seq_807 +808 human_ready +809 human_ready_sword_up +810 seq_810 +811 human_casting +812 human_casting_kolodion +813 human_staffready +814 human_getinbed_left +815 human_getoutbed_left +816 human_getinbed +817 human_getoutbed +818 human_dancing +819 human_walk_f +820 human_walk_b +821 human_walk_l +822 human_walk_r +823 human_turnonspot +824 human_running +825 seq_825 +826 seq_826 +827 human_pickupfloor +828 human_reachforladdertop +829 human_eat +830 human_dig +831 human_dig_long +832 human_pickuptable +833 long_place_item +834 human_leverdown +835 seq_835 +836 human_death +837 seq_837 +838 seq_838 +839 human_walk_fence_north +840 human_walk_crumbledwall +841 earthwarrior_walk +842 earthwarrior_ready +843 earthwarrior_death +844 seq_844 +845 seq_845 +846 seq_846 +847 human_ready_scythe +848 seq_848 +849 seq_849 +850 seq_850 +851 seq_851 +852 seq_852 +853 seq_853 +854 seq_854 +855 emote_yes +856 emote_no +857 emote_think +858 emote_bow +859 emote_angry +860 emote_cry +861 emote_laugh +862 emote_cheer +863 emote_wave +864 emote_beckon +865 emote_clap +866 emote_dance +867 human_woodcutting_rune_axe +868 seq_868 +869 human_woodcutting_adamant_axe +870 seq_870 +871 human_woodcutting_mithril_axe +872 seq_872 +873 human_woodcutting_black_axe +874 seq_874 +875 human_woodcutting_steel_axe +876 seq_876 +877 human_woodcutting_iron_axe +878 seq_878 +879 human_woodcutting_bronze_axe +880 seq_880 +881 human_pickpocket +882 seq_882 +883 human_cooking +884 human_glassblowing +885 human_dragonstonecutting +886 human_diamondcutting +887 human_rubycutting +888 human_sapphirecutting +889 human_emeraldcutting +890 human_opalcutting +891 human_jadecutting +892 human_redtopazcutting +893 human_shearing +894 human_spinningwheel +895 human_fillbucket_sandpit +896 human_potterywheel +897 human_firecooking +898 human_smithing +899 human_furnace +900 dwarf_drunkready +901 seq_901 +902 fire_arrow +903 seq_903 +904 seq_904 +905 seq_905 +906 seq_906 +907 seq_907 +908 human_bullroarer +909 human_mapping +910 human_machette_chop +911 human_knife_slash +912 seq_912 +913 seq_913 +914 seq_914 +915 seq_915 +916 seq_916 +917 seq_917 +918 toy_horsey_brown_play +919 toy_horsey_white_play +920 toy_horsey_black_play +921 toy_horsey_grey_play +922 seq_922 +923 seq_923 +924 seq_924 +925 seq_925 +926 seq_926 +927 seq_927 +928 dwarf_seq_928 +929 human_throw +930 seq_930 +931 human_cast_enchantring +932 seaslug_ready +933 seaslug_walk +934 seq_934 +935 seq_935 +936 seq_936 +937 seq_937 +938 seq_938 +939 seq_939 +940 seq_940 +941 seq_941 +942 seq_942 +943 seq_943 +944 seq_944 +945 seq_945 +946 seq_946 +947 seq_947 +948 seq_948 +949 seq_949 +950 seq_950 +951 seq_951 +952 seq_952 +953 seq_953 +954 seq_954 +955 seq_955 +956 seq_956 +957 seq_957 +958 seq_958 +959 seq_959 +960 seq_960 +961 seq_961 +962 seq_962 +963 seq_963 +964 seq_964 +965 seq_965 +966 seq_966 +967 seq_967 +968 seq_968 +969 seq_969 +970 seq_970 +971 seq_971 +972 seq_972 +973 seq_973 +974 seq_974 +975 seq_975 +976 seq_976 +977 seq_977 +978 seq_978 +979 seq_979 +980 seq_980 +981 seq_981 +982 seq_982 +983 seq_983 +984 seq_984 +985 seq_985 +986 seq_986 +987 seq_987 +988 seq_988 +989 seq_989 +990 seq_990 +991 seq_991 +992 seq_992 +993 seq_993 +994 seq_994 +995 seq_995 +996 seq_996 +997 seq_997 +998 seq_998 +999 seq_999 +1000 seq_1000 +1001 seq_1001 +1002 seq_1002 +1003 seq_1003 +1004 seq_1004 +1005 seq_1005 +1006 seq_1006 +1007 chompy_walk +1008 chompy_ready +1009 seq_1009 +1010 seq_1010 +1011 seq_1011 +1012 seq_1012 +1013 seq_1013 +1014 seq_1014 +1015 chompy_death +1016 seq_1016 +1017 spit_anim +1018 chompy_toad_ready +1019 chompy_toad_death +1020 chompy_toad_permadeath +1021 chompy_toad_walk +1022 seq_1022 +1023 seq_1023 +1024 seq_1024 +1025 ogre_seq_1025 +1026 human_ogre_bellows_use diff --git a/src/public/data/symbols/spotanim.sym b/src/public/data/symbols/spotanim.sym new file mode 100644 index 00000000..e6fafbb6 --- /dev/null +++ b/src/public/data/symbols/spotanim.sym @@ -0,0 +1,244 @@ +0 triple_firebreath_attack +1 firebreath_attack +2 icebreath_attack +3 acidbreath_attack +4 spotanim_4 +5 spotanim_5 +6 spotanim_6 +7 spotanim_7 +8 spotanim_8 +9 iron_arrow_travel +10 bronze_arrow_travel +11 steel_arrow_travel +12 mithril_arrow_travel +13 adamant_arrow_travel +14 unlit_arrow_travel +15 rune_arrow_travel +16 ice_arrow_travel +17 fire_arrow_travel +18 iron_arrow_launch +19 bronze_arrow_launch +20 steel_arrow_launch +21 mithril_arrow_launch +22 adamant_arrow_launch +23 unlit_arrow_launch +24 rune_arrow_launch +25 ice_arrow_launch +26 fire_arrow_launch +27 crossbowbolt_travel +28 crossbowbolt_launch +29 rotten_tomato_travel +30 rotten_tomato_launch +31 rotten_splash +32 dwarf_stone_throw_travel +33 dwarf_rock_launch +34 spotanim_34 +35 iron_taxe_travel +36 bronze_taxe_travel +37 steel_taxe_travel +38 mithril_taxe_travel +39 adamant_taxe_travel +40 spotanim_40 +41 rune_taxe_travel +42 iron_taxe_launch +43 bronze_taxe_launch +44 steel_taxe_launch +45 mithril_taxe_launch +46 adamant_taxe_launch +47 spotanim_47 +48 rune_taxe_launch +49 vial_travel +50 vial_launch +51 enchanted_vial_travel +52 enchanted_vial_launch +53 spotanim_53 +54 spotanim_54 +55 spotanim_55 +56 attacksword +57 spotanim_57 +58 spotanim_58 +59 whirlpool +60 spotanim_60 +61 spotanim_61 +62 spotanim_62 +63 spotanim_63 +64 spotanim_64 +65 spotanim_65 +66 spotanim_66 +67 spotanim_67 +68 watersplash +69 lavasplash +70 spotanim_70 +71 spotanim_71 +72 spotanim_72 +73 pickaxe_head_launch +74 spotanim_74 +75 axe_head_launch +76 saradomin_lightning +77 gunthix_claw +78 zamorak_flame +79 gnome_globes +80 stunned_thieving +81 bullroarer +82 zap +83 ibansbolt +84 heal_casting +85 failedspell_impact +86 small_smokepuff +87 ibanblast_casting +88 ibanblast_travel +89 ibanblast_impact +90 windstrike_casting +91 windstrike_travel +92 windstrike_impact +93 waterstrike_casting +94 waterstrike_travel +95 waterstrike_impact +96 earthstrike_casting +97 earthstrike_travel +98 earthstrike_impact +99 firestrike_casting +100 firestrike_travel +101 firestrike_impact +102 confuse_casting +103 confuse_travel +104 confuse_impact +105 weaken_casting +106 weaken_travel +107 weaken_impact +108 curse_casting +109 curse_travel +110 curse_impact +111 teleport_casting +112 lowlvlalchemy_casting +113 highlvlalchemy_casting +114 enchant_amulet_lvl1 +115 enchant_amulet_lvl2 +116 enchant_amulet_lvl3 +117 windbolt_casting +118 windbolt_travel +119 windbolt_impact +120 waterbolt_casting +121 waterbolt_travel +122 waterbolt_impact +123 earthbolt_casting +124 earthbolt_travel +125 earthbolt_impact +126 firebolt_casting +127 firebolt_travel +128 firebolt_impact +129 fireblast_casting +130 fireblast_travel +131 fireblast_impact +132 windblast_casting +133 windblast_travel +134 windblast_impact +135 waterblast_casting +136 waterblast_travel +137 waterblast_impact +138 earthblast_casting +139 earthblast_travel +140 earthblast_impact +141 bonestobananas_casting +142 telegrab_casting +143 telegrab_travel +144 telegrab_impact +145 crumbleundead_casting +146 crumbleundead_travel +147 crumbleundead_impact +148 superheatitem_casting +149 chargewaterorb_casting +150 chargewindorb_casting +151 chargeearthorb_casting +152 chargefireorb_casting +153 enchant_amulet2_lvl4 +154 enchant_amulet2_lvl5 +155 firewave_casting +156 firewave_travel +157 firewave_impact +158 windwave_casting +159 windwave_travel +160 windwave_impact +161 waterwave_casting +162 waterwave_travel +163 waterwave_impact +164 earthwave_casting +165 earthwave_travel +166 earthwave_impact +167 vulnerability_casting +168 vulnerability_travel +169 vulnerability_impact +170 enfeeble_casting +171 enfeeble_travel +172 enfeeble_impact +173 stun_casting +174 stun_travel +175 stun_impact +176 explodingvial +177 bind_casting +178 bind_travel +179 entangle_impact +180 snare_impact +181 bind_impact +182 spotanim_182 +183 spotanim_183 +184 spotanim_184 +185 spotanim_185 +186 runecrafting +187 spotanim_187 +188 smokepuff_large +189 smokepuff_huge +190 spotanim_190 +191 spotanim_191 +192 holy_water_travel +193 holy_water_launch +194 spotanim_194 +195 spotanim_195 +196 spotanim_196 +197 spotanim_197 +198 spotanim_198 +199 levelup_anim +200 bronze_javelin_travel +201 iron_javelin_travel +202 steel_javelin_travel +203 mithril_javelin_travel +204 adamant_javelin_travel +205 rune_javelin_travel +206 bronze_javelin_launch +207 iron_javelin_launch +208 steel_javelin_launch +209 mithril_javelin_launch +210 adamant_javelin_launch +211 rune_javelin_launch +212 bronze_tknife_travel +213 iron_tknife_travel +214 steel_tknife_travel +215 black_tknife_travel +216 mithril_tknife_travel +217 adamant_tknife_travel +218 rune_tknife_travel +219 bronze_tknife_launch +220 iron_tknife_launch +221 steel_tknife_launch +222 black_tknife_launch +223 mithril_tknife_launch +224 adamant_tknife_launch +225 rune_tknife_launch +226 bronze_dart_travel +227 iron_dart_travel +228 steel_dart_travel +229 mithril_dart_travel +230 adamant_dart_travel +231 rune_dart_travel +232 bronze_dart_launch +233 iron_dart_launch +234 steel_dart_launch +235 mithril_dart_launch +236 adamant_dart_launch +237 rune_dart_launch +238 enchant_ring +239 Barrel_Smash +240 chompy_toad_exploding +241 ogre_bellows_use +242 ogre_arrow_travel +243 ogre_arrow_launch diff --git a/src/public/data/symbols/stat.sym b/src/public/data/symbols/stat.sym new file mode 100644 index 00000000..78783393 --- /dev/null +++ b/src/public/data/symbols/stat.sym @@ -0,0 +1,21 @@ +0 attack +1 defence +2 strength +3 hitpoints +4 ranged +5 prayer +6 magic +7 cooking +8 woodcutting +9 fletching +10 fishing +11 firemaking +12 crafting +13 smithing +14 mining +15 herblore +16 agility +17 thieving +18 stat18 +19 stat19 +20 runecraft diff --git a/src/public/data/symbols/struct.sym b/src/public/data/symbols/struct.sym new file mode 100644 index 00000000..3537577a --- /dev/null +++ b/src/public/data/symbols/struct.sym @@ -0,0 +1,143 @@ +0 crunchy_tray +1 gnomebowl_mould +2 batta_tin +3 uncooked_apple_pie +4 uncooked_meat_pie +5 uncooked_redberry_pie +6 anchovy_topping +7 pineapple_topping +8 meat_topping +9 onion_kebab +10 ugthanki_meat_kebab +11 tomato_kebab +12 chopped_onion_kebab +13 chopped_tomato_kebab +14 chopped_ugthanki_kebab +15 chopped_onion_tomato_kebab +16 chopped_ugthanki_onion_kebab +17 chopped_ugthanki_tomato_kebab +18 fire_orb +19 water_orb +20 air_orb +21 earth_orb +22 red_cape +23 black_cape +24 blue_cape +25 yellow_cape +26 green_cape +27 purple_cape +28 orange_cape +29 orange_dye +30 green_dye +31 purple_dye +32 red_dye +33 yellow_dye +34 blue_dye +35 uncut_diamond +36 uncut_ruby +37 uncut_emerald +38 uncut_sapphire +39 uncut_opal +40 uncut_jade +41 uncut_red_topaz +42 uncut_dragonstone +43 beer_glass +44 vial_empty +45 stafforb +46 gold_ring +47 sapphire_ring +48 emerald_ring +49 ruby_ring +50 diamond_ring +51 dragonstone_ring +52 gold_necklace +53 sapphire_necklace +54 emerald_necklace +55 ruby_necklace +56 diamond_necklace +57 dragonstone_necklace +58 unstrung_gold_amulet +59 unstrung_sapphire_amulet +60 unstrung_emerald_amulet +61 unstrung_ruby_amulet +62 unstrung_diamond_amulet +63 unstrung_dragonstone_amulet +64 unstrung_symbol +65 unstrung_emblem +66 soft_clay +67 unfired_pot +68 unfired_piedish +69 unfired_bowl +70 flax +71 wool +72 studded_body +73 studded_chaps +74 fishing_struct_shrimps +75 fishing_struct_anchovies +76 fishing_struct_sardine +77 fishing_struct_herring +78 fishing_struct_trout +79 fishing_struct_salmon +80 fishing_struct_pike +81 fishing_struct_tuna +82 fishing_struct_lobster +83 fishing_struct_swordfish +84 fishing_struct_shark +85 fishing_struct_lava_eel +86 fishing_struct_manta_ray +87 fishing_struct_sea_turtle +88 fish_equipment_lobster_pot +89 fish_equipment_net +90 fish_equipment_big_net +91 fish_equipment_fishing_rod +92 fish_equipment_fly_fishing_rod +93 fish_equipment_harpoon +94 unf_guam_potion +95 unf_marrentill_potion +96 unf_tarromin_potion +97 unf_harralander_potion +98 unf_ranarr_potion +99 unf_irit_potion +100 unf_avantoe_potion +101 unf_kwuarm_potion +102 unf_cadantine_potion +103 unf_lantadyme_potion +104 unf_dwarf_weed_potion +105 unf_torstol_potion +106 3dose1attack +107 3dose2attack +108 3dose1restore +109 3dose1strength +110 3dose2strength +111 3doseprayerrestore +112 3dosefisherspotion +113 3doseantipoison +114 3dose2antipoison +115 3dose1defense +116 3dose2defense +117 weapon_poison +118 3dose1antidragon +119 3doserangerspotion +120 3dosepotionofzamorak +121 smelting_bronze_bar +122 smelting_iron_bar +123 smelting_steel_bar +124 smelting_silver_bar +125 smelting_gold_bar +126 smelting_mithril_bar +127 smelting_adamantite_bar +128 smelting_runite_bar +129 obj_2365 +130 smithing_bronze_bar +131 smithing_iron_bar +132 smithing_steel_bar +133 smithing_mithril_bar +134 smithing_adamantite_bar +135 smithing_runite_bar +136 woodcutting_bronze_axe +137 woodcutting_iron_axe +138 woodcutting_steel_axe +139 woodcutting_black_axe +140 woodcutting_mithril_axe +141 woodcutting_adamant_axe +142 woodcutting_rune_axe diff --git a/src/public/data/symbols/synth.sym b/src/public/data/symbols/synth.sym new file mode 100644 index 00000000..8e0d3c07 --- /dev/null +++ b/src/public/data/symbols/synth.sym @@ -0,0 +1,435 @@ +0 bat_death +1 bat_attack +2 bat_hit +3 imp_death +4 imp_attack +5 imp_hit +6 rat_death +7 rat_hit +8 rat_attack +9 bear_attack +10 bear_death +11 bear_hit +12 bird_death +13 bird_attack +14 bird_hit +15 duck_hit +16 duck_death +17 quack +18 wolf_hit +19 wolf_death +20 wolf_attack2 +21 wolf_attack +22 firebreath +23 kingicebreath +24 lightningbreath +25 toxicbreath +26 animated_death +27 animated_hit +28 demon_death +29 demon_attack +30 demon_hit +31 giant_hit +32 giant_death +33 giant_attack +34 ghost_hit +35 ghost_death +36 ghost_attack +37 human_death +38 human_hit_7 +39 shark_death +40 shark_hit +41 shark_attack +42 snake_death +43 snaketest1 +44 snake_attack +45 snake_hit +46 skeleton_attack +47 skeleton_death +48 skelly_hit +49 dragon_death +50 dragon_hit +51 dragon_attack +52 babydragon_attack +53 babydragon_death +54 babydragon_hit +55 goblin_attack +56 goblin_hit +57 goblin_death +58 growl3 +59 growl4 +60 growl5 +61 growl6 +62 growl +63 growl2 +64 insect_death +65 insect_hit +66 insect_attack +67 monkey_hit +68 otherworld_hit +69 otherworld_attack +70 otherworld_death +71 zombie_hit +72 zombie_death +73 zombie_attack +74 chicken_death +75 chicken_hit +76 chicken_attack +77 sound_77 +78 sound_78 +79 zap +80 vulnerability_all +81 bind_all +82 fire_bolt_fail +83 fire_blast_all +84 fire_strike_fail +85 fire_wave_all +86 fire_blast_fail +87 fire_bolt_all +88 fire_strike_all +89 fire_wave_fail +90 selfheal +91 heal +92 stun_all +93 wind_strike_fail +94 wind_wave_all +95 wind_blast_fail +96 wind_strike_all +97 wind_wave_fail +98 wind_bolt_fail +99 wind_blast_all +100 wind_bolt_all +101 confuse_all +102 curse_all +103 earth_wave_fail +104 earth_strike_fail +105 earth_wave_all +106 earth_blast_all +107 earth_blast_fail +108 earth_strike_all +109 earth_bolt_all +110 sound_110 +111 snare_all +112 water_wave_fail +113 water_strike_fail +114 water_bolt_all +115 water_wave_all +116 water_blast_fail +117 water_bolt_fail +118 water_strike_all +119 water_blast_all +120 undead_rot +121 telegrab_all +122 teleport_reverse +123 teleport_all +124 enchant_dragon_amulet +125 enchant_diamond_amulet +126 enchant_ruby_amulet +127 enchant_emerald_amulet +128 enchant_sapphire_amulet +129 charge_earth_orb +130 charge_air_orb +131 charge_water_orb +132 charge_fire_orb +133 superheat_all +134 superheat_fail +135 enfeeble_all +136 entangle_all +137 summon_zombie +138 high_alchemy +139 low_alchemy +140 weaken_all +141 crumble_all +142 bones_to_bananas_all +143 lava_bridge +144 found_ice_arrows +145 lockeddoor +146 fire_teleport +147 explosion +148 sound_148 +149 fuse +150 whistle +151 throw +152 sound_152 +153 iban_lightning +154 mcannon_fire +155 machine2 +156 demon_approach +157 machinery +158 flames_of_zamorak +159 claws_of_guthix +160 charge_gone +161 charge +162 saradomin_strike +163 pool_plop +164 smokepuff +165 smokepuff2 +166 bullroarer +167 door_open +168 lever +169 chest_open +170 cupboard_open +171 locked +172 door_close +173 cupboard_close +174 chest_close +175 sound_175 +176 millstones +177 oven +178 pick2 +179 fry +180 pick +181 hopperlever +182 javelin +183 longbow +184 shortbow +185 outofammo +186 throwingknife +187 thrown +188 throwingaxe +189 crossbow +190 dart +191 arrowlaunch2 +192 tap_fill +193 grind +194 fire_lit +195 tinderbox_strike +196 put_down +197 fishing_cast +198 bones_down +199 mace_stab +200 mace_crush +201 staff_hit +202 scythe_slash +203 staff_stab +204 hacksword_slash +205 hacksword_crush +206 hacksword_stab +207 baxe_slash +208 baxe_crush +209 stabsword_slash +210 stabsword_crush +211 stabsword_stab +212 sound_212 +213 sound_213 +214 sword_hit2 +215 sound_215 +216 sound_216 +217 sound_217 +218 sound_218 +219 sound_219 +220 sound_220 +221 unarmed_punch +222 unarmed_kick +223 2H_slash +224 2H_crush +225 2H_stab +226 flower_attack +227 mine_quick +228 found_gem +229 prospect +230 sound_230 +231 prayer_drain +232 prayer_recharge +233 prayer_boost +234 sound_234 +235 sand_bucket +236 stringing +237 pottery +238 chisel +239 anvil +240 anvil2 +241 sound_241 +242 anvil_4 +243 furnace +244 anothercry +245 woodchop_quick +246 woodchop +247 woodchop_4 +248 pop1 +249 pop2 +250 bubbling +251 monkey_attack +252 monkey_death +253 cry1 +254 goblin2 +255 cry3 +256 terrorbird_attack +257 terrorbird_hit +258 terrorbird_death +259 cow_death +260 cow_attack +261 cow_hit +262 barklike +263 leak +264 gnome_attack +265 gnome_death +266 gnome_hit +267 firework +268 arrow_launch +269 black_demon_death +270 black_demon_hit +271 black_demon_attack +272 ice_warrior_death +273 ice_warrior_hit +274 sound_274 +275 whirlpool +276 swarm_attack +277 swarm_appear +278 lost_pickaxe +279 zombie_moan +280 triffid_attack +281 cavein +282 gas_explosion +283 triffid_appear +284 genie_appear +285 dryad_appear +286 sound_286 +287 sizzle +288 jump_no_land +289 squeeze_in +290 squeeze_out +291 watersplash +292 sound_292 +293 liquid +294 eat +295 smash_gem +296 fish_swim +297 paralyze +298 sound_298 +299 gas_hiss +300 coffin_open +301 coffin_close +302 mid_plop +303 stunned +304 mammoth_hit +305 mammoth_death +306 mammoth_attack +307 penguin_hit +308 penguin_death +309 penguin_attack +310 golem_attack +311 golem_hit +312 golem_death +313 mummy_death +314 mummy_attack +315 mummy_hit +316 orc_attack +317 orc_death +318 orc_hit +319 grate_close +320 tanglevine_appear +321 tremor +322 rock_spirit_appear +323 rock_spirit +324 birdlike +325 grate_open +326 sound_326 +327 ghost_hit2 +328 lizardman_attack +329 lizardman_death +330 lizardman_hit +331 scream +332 dwarf_whistle +333 sourhog_death_collapse +334 cavernous +335 protect_items +336 protect_from_melee +337 superhuman_strength +338 cancel_prayer +339 clarity +340 protect_from_magic +341 steel_skin +342 incredible_reflexes +343 rock_skin +344 rapid_heal +345 protect_from_missiles +346 thick_skin +347 prayer_off +348 improved_reflexes +349 strength_burst +350 ultimate_strength +351 rapid_restore +352 flames_of_zamorak_fail +353 claws_of_guthix_fail +354 saradomin_strike_fail +355 enchant_ruby_ring +356 enchant_emerald_ring +357 enchant_sapphire_ring +358 enchant_dragon_ring +359 enchant_diamond_ring +360 sound_360 +361 nasty_tree_attack +362 attach_handle +363 sound_363 +364 human_hit3 +365 human_hit4 +366 human_hit2 +367 female_hit +368 female_hit2 +369 female_death +370 chompy_bird_attack +371 chompy_bird_hit +372 chompy_bird_death +373 howl1 +374 lycanthropy +375 holy_water_pour +376 toad_burst +377 ogre_bellows +378 swamp +379 spit_roast +380 ogre_bow +381 biglever +382 chompy_bird_squak +383 chompy_bird_screech +384 toad_croak +385 toad_hiss +386 fire_elemental_attack +387 fire_elemental_death +388 fire_elemental_hit +389 toad_attack +390 toad_death +391 toad_hit +392 toad2 +393 squeaky_valve_gush +394 squeaky_valve +395 sound_395 +396 ogre_bellows_suck +397 shield_appear +398 cleave +399 puncture +400 shatter +401 shove +402 sound_402 +403 sound_403 +404 sanctuary +405 rampage +406 powershot +407 knock_knock +408 earth_elemental_attack +409 earth_elemental_death +410 well_fill +411 earth_elemental_hit +412 water_elemental_hit +413 air_elemental_hit +414 air_elemental_death +415 water_elemental_attack +416 sound_416 +417 air_elemental_attack +418 water_elemental_death +419 half_werewolf_death +420 half_werewolf_hit +421 horse_hit +422 slide_puzzle +423 bear_death_undead +424 lava_bowl_fill +425 water_wheel_stop +426 lava_bowl_pour +427 sluice_gate +428 water_wheel_start +429 dice_shake +430 dice_roll +431 unlock_and_move +432 snapshot +433 impale +434 neptune_blast diff --git a/src/public/data/symbols/varn.sym b/src/public/data/symbols/varn.sym new file mode 100644 index 00000000..92cf7aa5 --- /dev/null +++ b/src/public/data/symbols/varn.sym @@ -0,0 +1,11 @@ +0 npc_action_delay int +1 npc_attacking_uid player_uid +2 npc_aggressive_player player_uid +3 npc_lastcombat int +4 npc_stunned int +5 npc_macro_event_status int +6 npc_lastattack int +7 npc_poison int +8 npc_trawler_start int +9 npc_trawler_flood_status int +10 npc_trawler_fish_caught int diff --git a/src/public/data/symbols/varp.sym b/src/public/data/symbols/varp.sym new file mode 100644 index 00000000..8369f270 --- /dev/null +++ b/src/public/data/symbols/varp.sym @@ -0,0 +1,295 @@ +0 mcannon_progress int true +1 mcannon_railings int true +2 mcannon_clock int true +3 mcannon_ammo int true +4 mcannon_coord coord true +5 grail_progress int true +6 coal_truck int true +7 varp_7 int true +8 varp_8 int true +9 beehive_free boolean true +10 cog_progress int true +11 fishingcompo_progress int true +12 hemenster_comp_stage int true +13 hemenster_pipe_stashed boolean true +14 arthur_progress int true +15 excalibur_components_progress int true +16 arhein_crate_coord coord true +17 arena_progress int true +18 music_mode int false +19 music_mapsquare coord true +20 music1 int true +21 music2 int true +22 music3 int true +23 music4 int true +24 music5 int true +25 music6 int true +26 ikov_progress int true +27 ikov_lever int true +28 ikov_icearrowchest_coord coord true +29 cook_progress int true +30 drunkmonk_progress int true +31 doric_progress int true +32 haunted_progress int true +33 haunted_lever int true +34 haunted_manor_fountain_poisoned int true +35 varp_35 int true +36 damagetype int false +37 damagestyle int false +38 lastcombat int false +39 varp_39 int true +40 eat_delay int true +41 aggressive_npc npc_uid false +42 varp_42 int true +43 attackstyle int true +44 com_stabattack int false +45 com_stabdef int false +46 com_slashattack int false +47 com_slashdef int false +48 com_crushattack int false +49 com_crushdef int false +50 com_magicattack int false +51 com_magicdef int false +52 com_rangeattack int false +53 com_rangedef int false +54 com_attackanim seq false +55 com_defendanim seq false +56 com_attacksound synth false +57 com_maxhit int false +58 action_delay int true +59 autocast_spell int true +60 sheepherder_progress int true +61 varp_61 int true +62 gobdip_progress int true +63 runemysteries_progress int true +64 exit_essence_mine_coord coord true +65 waterfall_progress int true +66 waterfall_golrie_and_puzzle int true +67 hetty_progress int true +68 biohazard_progress int true +69 bioerrand int true +70 biodummy int true +71 hunt_progress int true +72 hunt_store_employed int true +73 crate_bananas int true +74 crate_rum int true +75 boat_takeoff int true +76 scorpcatcher_progress int true +77 barcrawl_progress int true +78 pk_skull int false +79 xplamp int true +80 druid_progress int true +81 warning_wilderness_teleport_lever int true +82 prayer_guild int true +83 prayer_thickskin int false +84 prayer_strengthburst int false +85 prayer_clarity int false +86 prayer_rockskin int false +87 prayer_superhumanstrength int false +88 prayer_improvedreflexes int false +89 prayer_rapidrestore int false +90 prayer_rapidheal int false +91 prayer_protectitems int false +92 prayer_steelskin int false +93 prayer_ultimatestrength int false +94 prayer_incrediblereflexes int false +95 prayer_protectfrommagic int false +96 prayer_protectfrommissiles int false +97 prayer_protectfrommelee int false +98 prayer_drain_counter int false +99 prayer_drain_effect int false +100 prayer_drain_resistance int false +101 questpoints int false +102 poison int true +103 stunned int true +104 multiway boolean true +105 varp_105 int true +106 newcomers_pos int true +107 priest_progress int true +108 attackstyle_magic int true +109 trawler int true +110 trawler_catch int false +111 tree_progress int true +112 itgronigen_progress int true +113 keepdoor_unlocked int true +114 scorpius_given_symbol int true +115 bank_noted int true +116 zombiequeen_progress int true +117 pk_prey1 player_uid false +118 pk_prey2 player_uid false +119 pk_predator1 player_uid false +120 pk_predator2 player_uid false +121 pk_predator3 player_uid false +122 squire_progress int true +123 varp_123 int true +124 skill_anim int true +125 skill_sound int true +126 shop inv true +127 shop_buy int true +128 shop_sell int true +129 shop_haggle int true +130 blackknight_progress int true +131 itexam_progress int true +132 last_stolen_from_stall_baker int true +133 last_stolen_from_stall_tea int true +134 last_stolen_from_stall_silk int true +135 last_stolen_from_stall_fur int true +136 last_stolen_from_stall_silver int true +137 last_stolen_from_stall_spice int true +138 last_stolen_from_stall_gem int true +139 legends_progress int true +140 book_page int true +141 gnome_bar_progress int true +142 gnome_restaurant_progress int true +143 gnomeball int true +144 romeojuliet_progress int true +145 blackarmgang_progress int true +146 phoenixgang_progress int true +147 zanaris_progress int true +148 crest_progress int true +149 open_book obj true +150 grandtree_progress int true +151 gnomeball_progress int true +152 varp_152 int true +153 glider_takeoff int true +154 shantay_jail_progress int true +155 varp_155 int true +156 target1 int true +157 target2 int true +158 target3 int true +159 seaslug_progress int true +160 imp_progress int true +161 upass_progress int true +162 varp_162 int true +163 varp_163 int true +164 varp_164 int true +165 elena_progress int true +166 game_brightness int false +167 varp_167 int true +168 music_volume int false +169 sound_volume int false +170 mouse_buttons int false +171 chat_effects int false +172 auto_retaliate int true +173 player_run int true +174 temp_run int true +175 junglepotion_progress int true +176 dragon_progress int true +177 dragon_planks int true +178 vampire_progress int true +179 sheep_progress int true +180 fluffs_progress int true +181 varp_181 int true +182 varp_182 int true +183 dragon_ned_hired int true +184 dragon_oracle int true +185 dragon_wall int true +186 dragon_shield int true +187 dragon_goblin int true +188 hero_progress int true +189 varp_189 int true +190 varp_190 int true +191 varp_191 int true +192 murder_progress int true +193 murder_poisonproof_progress int true +194 murder_evidence int true +195 murder_murderer_id int true +196 varp_196 int true +197 desertrescue_progress int true +198 varp_198 int true +199 varp_199 int true +200 totem_progress int true +201 handelmort_traps_disabled int true +202 varp_202 int true +203 mill_flour int true +204 macro_event int false +205 macro_event_uid npc_uid false +206 macro_whirlpool_counter int true +207 macro_gas_counter int true +208 macro_ent_counter int true +209 macro_chest_gas_coord coord true +210 smithing_bars int true +211 smithing_level int true +212 itwatchtower_progress int true +213 varp_213 int true +214 varp_214 int true +215 varp_215 int true +216 varp_216 int true +217 varp_217 int true +218 varp_218 int true +219 varp_219 int true +220 varp_220 int true +221 varp_221 int true +222 demon_progress int true +223 hazeelcult_progress int true +224 hazeelcult_valves int true +225 hazeelcult_side int true +226 ball_progress int true +227 gnome_drink_ingredient1 obj true +228 gnome_drink_ingredient2 obj true +229 gnome_drink_ingredient3 obj true +230 gnome_drink_ingredient4 obj true +231 gnome_drink_ingredient5 obj true +232 gnome_drink_ingredient6 obj true +233 gnome_drink_ingredient7 obj true +234 gnome_bowl_ingredient1 obj true +235 gnome_bowl_ingredient2 obj true +236 gnome_bowl_ingredient3 obj true +237 gnome_bowl_ingredient4 obj true +238 gnome_bowl_ingredient5 obj true +239 gnome_bowl_ingredient6 obj true +240 gnome_bowl_ingredient7 obj true +241 gnome_bowl_ingredient8 obj true +242 gnome_bowl_ingredient9 obj true +243 gnome_bowl_ingredient10 obj true +244 gnome_bowl_ingredient11 obj true +245 gnome_crunchies_ingredient1 obj true +246 gnome_crunchies_ingredient2 obj true +247 gnome_crunchies_ingredient3 obj true +248 gnome_crunchies_ingredient4 obj true +249 gnome_crunchies_ingredient5 obj true +250 gnome_batta_ingredient1 obj true +251 gnome_batta_ingredient2 obj true +252 gnome_batta_ingredient3 obj true +253 gnome_batta_ingredient4 obj true +254 gnome_batta_ingredient5 obj true +255 gnome_batta_ingredient6 obj true +256 thread_used int true +257 tradepartner player_uid false +258 tradestatus int false +259 mcannon_world int true +260 temp int true +261 option1 int true +262 option2 int true +263 option3 int true +264 gnome_course_progress int true +265 barbarian_course_progress int true +266 wilderness_course_progress int true +267 magearena_progress int false +268 saradomin_strike_casts int true +269 claws_of_guthix_casts int true +270 flames_of_zamorak_casts int true +271 varp_271 int true +272 charge_god_spell int true +273 prince_progress int true +274 prince_keystatus int true +275 varp_275 int true +276 varp_276 int true +277 antifire int true +278 antipoison int true +279 varp_279 int true +280 varp_280 int true +281 tutorial_progress int true +282 rotten_tomato_delay int true +283 varp_283 int true +284 duelpartner player_uid false +285 duelstatus int false +286 duel_settings int false +287 split_privatechat int false +288 varp_288 int true +289 varp_289 int true +290 ring_of_recoil int true +291 ring_of_forging int true +292 trail_clue int true +293 chompybird_progress int true +294 chompybird_kills int true diff --git a/src/public/data/symbols/vars.sym b/src/public/data/symbols/vars.sym new file mode 100644 index 00000000..6ce9aefe --- /dev/null +++ b/src/public/data/symbols/vars.sym @@ -0,0 +1,20 @@ +0 duel1 string +1 duel2 string +2 duel3 string +3 duel4 string +4 duel5 string +5 duel6 string +6 duel7 string +7 duel8 string +8 duel9 string +9 duel10 string +10 gnome_obstacle_pipe_used int +11 barb_ropeswing_used int +12 barb_obstacle_pipe_used int +13 wilderness_obstacle_pipe_used int +14 wilderness_ropeswing_used int +15 yanille_ledge_used int +16 yanille_obstacle_pipe_used int +17 brimnorth_ropeswing_used int +18 brimsouth_ropeswing_used int +19 ogre_ropeswing_used int diff --git a/src/public/data/symbols/writeinv.sym b/src/public/data/symbols/writeinv.sym new file mode 100644 index 00000000..57e1694e --- /dev/null +++ b/src/public/data/symbols/writeinv.sym @@ -0,0 +1,147 @@ +0 trawler_catch none true +1 bob_axes none true +2 armourshop none true +3 generalshop1 none true +4 generalshop2 none true +5 auburys_rune_shop none true +6 varrock_swordshop none true +7 lowes_archery_emporium none true +8 thessalia_fine_clothes none true +9 zaffs_superior_staffs_nonmem none true +10 helmet_shop none true +11 zeke_scimitar none true +12 louie_leg none true +13 generalshop3 none true +14 drogo_mining none true +15 cassie_shields none true +16 ranael_skirt none true +17 generalshop4 none true +18 valaines_shop_of_champions none true +19 flynn_maces none true +20 gnomeball none true +21 brian_battleaxe none true +22 waynes_chains none true +23 generalshop5 none true +24 generalshop6 none true +25 betty_magic none true +26 herquin_gems none true +27 rommiks_crafty_supplies none true +28 grum_gold none true +29 zambos_alcohols none true +30 gerrant_fish none true +31 generalshop7 none true +32 dommiks_crafting_store none true +33 scavvos_rune_store none true +34 generalshop8 none true +35 oziach_shop none true +36 jakutshop none true +37 irksolshop none true +38 generalshop9 none true +39 gaius_two_handed none true +40 jatix_herb none true +41 generalshop10 none true +42 tony_pizza none true +43 harry_fish none true +44 ranged_quiver_inv none false +45 happy_heroes_hemporium none true +46 davons_amulet_store none true +47 generalshop11 none true +48 candleshop none true +49 hickton_archery none true +50 frincos_herb none true +51 zaffs_superior_staffs_mem none true +52 alkharid_gem none true +53 zenesha_platemail none true +54 ardougne_baker none true +55 inv_55 none true +56 inv_56 none true +57 generalshop12 none true +58 inv_58 none true +59 furshop none true +60 fishing_guild_shop none true +61 generalshop13 none true +62 bolkoys_village_shop none true +63 fancy_clothes_store none true +64 magic_guild_store none true +65 jiminuas_jungle_store none true +66 armoury_combat_training_camp none true +67 frenitas_cookery_shop none true +68 nurmof_pickaxe none true +69 ye_old_tea_shoppe none true +70 dals_general_orge_supplies none true +71 frincos_fabulous_herb_store none true +72 ardougne_silver none true +73 ardougne_gem none true +74 ardougne_spice none true +75 inv_75 none true +76 food_store none true +77 bedabin_village_bartering none true +78 shantay_pass_shop none true +79 multicannon_parts_for_sale none true +80 darguads_bow_and_arrows none true +81 aarons_archery_appendages none true +82 authentic_throwing_weapons none true +83 legends_guild_general_store none true +84 legends_guild_shop_of_useful_items none true +85 fernaheis_fishing none true +86 fine_fashions none true +87 gullock_and_sons none true +88 funchs_fine_groceries none true +89 grand_tree_groceries none true +90 tempinv none false +91 partyroominv none true +92 partyroomoffer none true +93 inv none false +94 worn none true +95 bank none true +96 inv_96 none true +97 inv_97 none true +98 inv_98 none true +99 blurberry_bar none true +100 giannes_restaurant none true +101 bronze1 none true +102 bronze2 none true +103 bronze3 none true +104 bronze4 none true +105 bronze5 none true +106 iron1 none true +107 iron2 none true +108 iron3 none true +109 iron4 none true +110 iron5 none true +111 steel1 none true +112 steel2 none true +113 steel3 none true +114 steel4 none true +115 steel5 none true +116 mithril1 none true +117 mithril2 none true +118 mithril3 none true +119 mithril4 none true +120 mithril5 none true +121 adamantite1 none true +122 adamantite2 none true +123 adamantite3 none true +124 adamantite4 none true +125 adamantite5 none true +126 runite1 none true +127 runite2 none true +128 runite3 none true +129 runite4 none true +130 runite5 none true +131 lundails_arena_side_rune_shop none true +132 mage_arena_staffs none true +133 death none true +134 inv_134 none true +135 shop_of_distaste none true +136 inv_136 none true +137 diango_toy none true +138 oblis_general_store none true +139 generalshop14 none true +140 trail_puzzle_inv none true +141 reward none true +142 stakeinv none false +143 shrimp_and_parrot none true +144 crafting_rings none true +145 crafting_necklaces none true +146 crafting_amulets none true diff --git a/src/public/worker.js b/src/public/worker.js new file mode 100644 index 00000000..5b17245f --- /dev/null +++ b/src/public/worker.js @@ -0,0 +1,40296 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, { + get: (a, b) => (typeof require !== "undefined" ? require : a)[b] +}) : x)(function(x) { + if (typeof require !== "undefined") return require.apply(this, arguments); + throw Error('Dynamic require of "' + x + '" is not supported'); +}); +var __esm = (fn, res) => function __init() { + return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res; +}; +var __commonJS = (cb, mod) => function __require2() { + return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; +}; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); + +// node_modules/node-forge/lib/forge.js +var require_forge = __commonJS({ + "node_modules/node-forge/lib/forge.js"(exports, module) { + module.exports = { + // default options + options: { + usePureJavaScript: false + } + }; + } +}); + +// node_modules/node-forge/lib/baseN.js +var require_baseN = __commonJS({ + "node_modules/node-forge/lib/baseN.js"(exports, module) { + var api = {}; + module.exports = api; + var _reverseAlphabets = {}; + api.encode = function(input, alphabet, maxline) { + if (typeof alphabet !== "string") { + throw new TypeError('"alphabet" must be a string.'); + } + if (maxline !== void 0 && typeof maxline !== "number") { + throw new TypeError('"maxline" must be a number.'); + } + var output = ""; + if (!(input instanceof Uint8Array)) { + output = _encodeWithByteBuffer(input, alphabet); + } else { + var i = 0; + var base = alphabet.length; + var first = alphabet.charAt(0); + var digits = [0]; + for (i = 0; i < input.length; ++i) { + for (var j = 0, carry = input[i]; j < digits.length; ++j) { + carry += digits[j] << 8; + digits[j] = carry % base; + carry = carry / base | 0; + } + while (carry > 0) { + digits.push(carry % base); + carry = carry / base | 0; + } + } + for (i = 0; input[i] === 0 && i < input.length - 1; ++i) { + output += first; + } + for (i = digits.length - 1; i >= 0; --i) { + output += alphabet[digits[i]]; + } + } + if (maxline) { + var regex = new RegExp(".{1," + maxline + "}", "g"); + output = output.match(regex).join("\r\n"); + } + return output; + }; + api.decode = function(input, alphabet) { + if (typeof input !== "string") { + throw new TypeError('"input" must be a string.'); + } + if (typeof alphabet !== "string") { + throw new TypeError('"alphabet" must be a string.'); + } + var table = _reverseAlphabets[alphabet]; + if (!table) { + table = _reverseAlphabets[alphabet] = []; + for (var i = 0; i < alphabet.length; ++i) { + table[alphabet.charCodeAt(i)] = i; + } + } + input = input.replace(/\s/g, ""); + var base = alphabet.length; + var first = alphabet.charAt(0); + var bytes = [0]; + for (var i = 0; i < input.length; i++) { + var value = table[input.charCodeAt(i)]; + if (value === void 0) { + return; + } + for (var j = 0, carry = value; j < bytes.length; ++j) { + carry += bytes[j] * base; + bytes[j] = carry & 255; + carry >>= 8; + } + while (carry > 0) { + bytes.push(carry & 255); + carry >>= 8; + } + } + for (var k = 0; input[k] === first && k < input.length - 1; ++k) { + bytes.push(0); + } + if (typeof Buffer !== "undefined") { + return Buffer.from(bytes.reverse()); + } + return new Uint8Array(bytes.reverse()); + }; + function _encodeWithByteBuffer(input, alphabet) { + var i = 0; + var base = alphabet.length; + var first = alphabet.charAt(0); + var digits = [0]; + for (i = 0; i < input.length(); ++i) { + for (var j = 0, carry = input.at(i); j < digits.length; ++j) { + carry += digits[j] << 8; + digits[j] = carry % base; + carry = carry / base | 0; + } + while (carry > 0) { + digits.push(carry % base); + carry = carry / base | 0; + } + } + var output = ""; + for (i = 0; input.at(i) === 0 && i < input.length() - 1; ++i) { + output += first; + } + for (i = digits.length - 1; i >= 0; --i) { + output += alphabet[digits[i]]; + } + return output; + } + } +}); + +// node_modules/node-forge/lib/util.js +var require_util = __commonJS({ + "node_modules/node-forge/lib/util.js"(exports, module) { + var forge2 = require_forge(); + var baseN = require_baseN(); + var util = module.exports = forge2.util = forge2.util || {}; + (function() { + if (typeof process !== "undefined" && process.nextTick && !process.browser) { + util.nextTick = process.nextTick; + if (typeof setImmediate === "function") { + util.setImmediate = setImmediate; + } else { + util.setImmediate = util.nextTick; + } + return; + } + if (typeof setImmediate === "function") { + util.setImmediate = function() { + return setImmediate.apply(void 0, arguments); + }; + util.nextTick = function(callback) { + return setImmediate(callback); + }; + return; + } + util.setImmediate = function(callback) { + setTimeout(callback, 0); + }; + if (typeof window !== "undefined" && typeof window.postMessage === "function") { + let handler2 = function(event) { + if (event.source === window && event.data === msg) { + event.stopPropagation(); + var copy = callbacks.slice(); + callbacks.length = 0; + copy.forEach(function(callback) { + callback(); + }); + } + }; + var handler = handler2; + var msg = "forge.setImmediate"; + var callbacks = []; + util.setImmediate = function(callback) { + callbacks.push(callback); + if (callbacks.length === 1) { + window.postMessage(msg, "*"); + } + }; + window.addEventListener("message", handler2, true); + } + if (typeof MutationObserver !== "undefined") { + var now = Date.now(); + var attr = true; + var div = document.createElement("div"); + var callbacks = []; + new MutationObserver(function() { + var copy = callbacks.slice(); + callbacks.length = 0; + copy.forEach(function(callback) { + callback(); + }); + }).observe(div, { attributes: true }); + var oldSetImmediate = util.setImmediate; + util.setImmediate = function(callback) { + if (Date.now() - now > 15) { + now = Date.now(); + oldSetImmediate(callback); + } else { + callbacks.push(callback); + if (callbacks.length === 1) { + div.setAttribute("a", attr = !attr); + } + } + }; + } + util.nextTick = util.setImmediate; + })(); + util.isNodejs = typeof process !== "undefined" && process.versions && process.versions.node; + util.globalScope = function() { + if (util.isNodejs) { + return global; + } + return typeof self === "undefined" ? window : self; + }(); + util.isArray = Array.isArray || function(x) { + return Object.prototype.toString.call(x) === "[object Array]"; + }; + util.isArrayBuffer = function(x) { + return typeof ArrayBuffer !== "undefined" && x instanceof ArrayBuffer; + }; + util.isArrayBufferView = function(x) { + return x && util.isArrayBuffer(x.buffer) && x.byteLength !== void 0; + }; + function _checkBitsParam(n) { + if (!(n === 8 || n === 16 || n === 24 || n === 32)) { + throw new Error("Only 8, 16, 24, or 32 bits supported: " + n); + } + } + util.ByteBuffer = ByteStringBuffer; + function ByteStringBuffer(b) { + this.data = ""; + this.read = 0; + if (typeof b === "string") { + this.data = b; + } else if (util.isArrayBuffer(b) || util.isArrayBufferView(b)) { + if (typeof Buffer !== "undefined" && b instanceof Buffer) { + this.data = b.toString("binary"); + } else { + var arr = new Uint8Array(b); + try { + this.data = String.fromCharCode.apply(null, arr); + } catch (e) { + for (var i = 0; i < arr.length; ++i) { + this.putByte(arr[i]); + } + } + } + } else if (b instanceof ByteStringBuffer || typeof b === "object" && typeof b.data === "string" && typeof b.read === "number") { + this.data = b.data; + this.read = b.read; + } + this._constructedStringLength = 0; + } + util.ByteStringBuffer = ByteStringBuffer; + var _MAX_CONSTRUCTED_STRING_LENGTH = 4096; + util.ByteStringBuffer.prototype._optimizeConstructedString = function(x) { + this._constructedStringLength += x; + if (this._constructedStringLength > _MAX_CONSTRUCTED_STRING_LENGTH) { + this.data.substr(0, 1); + this._constructedStringLength = 0; + } + }; + util.ByteStringBuffer.prototype.length = function() { + return this.data.length - this.read; + }; + util.ByteStringBuffer.prototype.isEmpty = function() { + return this.length() <= 0; + }; + util.ByteStringBuffer.prototype.putByte = function(b) { + return this.putBytes(String.fromCharCode(b)); + }; + util.ByteStringBuffer.prototype.fillWithByte = function(b, n) { + b = String.fromCharCode(b); + var d = this.data; + while (n > 0) { + if (n & 1) { + d += b; + } + n >>>= 1; + if (n > 0) { + b += b; + } + } + this.data = d; + this._optimizeConstructedString(n); + return this; + }; + util.ByteStringBuffer.prototype.putBytes = function(bytes) { + this.data += bytes; + this._optimizeConstructedString(bytes.length); + return this; + }; + util.ByteStringBuffer.prototype.putString = function(str) { + return this.putBytes(util.encodeUtf8(str)); + }; + util.ByteStringBuffer.prototype.putInt16 = function(i) { + return this.putBytes( + String.fromCharCode(i >> 8 & 255) + String.fromCharCode(i & 255) + ); + }; + util.ByteStringBuffer.prototype.putInt24 = function(i) { + return this.putBytes( + String.fromCharCode(i >> 16 & 255) + String.fromCharCode(i >> 8 & 255) + String.fromCharCode(i & 255) + ); + }; + util.ByteStringBuffer.prototype.putInt32 = function(i) { + return this.putBytes( + String.fromCharCode(i >> 24 & 255) + String.fromCharCode(i >> 16 & 255) + String.fromCharCode(i >> 8 & 255) + String.fromCharCode(i & 255) + ); + }; + util.ByteStringBuffer.prototype.putInt16Le = function(i) { + return this.putBytes( + String.fromCharCode(i & 255) + String.fromCharCode(i >> 8 & 255) + ); + }; + util.ByteStringBuffer.prototype.putInt24Le = function(i) { + return this.putBytes( + String.fromCharCode(i & 255) + String.fromCharCode(i >> 8 & 255) + String.fromCharCode(i >> 16 & 255) + ); + }; + util.ByteStringBuffer.prototype.putInt32Le = function(i) { + return this.putBytes( + String.fromCharCode(i & 255) + String.fromCharCode(i >> 8 & 255) + String.fromCharCode(i >> 16 & 255) + String.fromCharCode(i >> 24 & 255) + ); + }; + util.ByteStringBuffer.prototype.putInt = function(i, n) { + _checkBitsParam(n); + var bytes = ""; + do { + n -= 8; + bytes += String.fromCharCode(i >> n & 255); + } while (n > 0); + return this.putBytes(bytes); + }; + util.ByteStringBuffer.prototype.putSignedInt = function(i, n) { + if (i < 0) { + i += 2 << n - 1; + } + return this.putInt(i, n); + }; + util.ByteStringBuffer.prototype.putBuffer = function(buffer) { + return this.putBytes(buffer.getBytes()); + }; + util.ByteStringBuffer.prototype.getByte = function() { + return this.data.charCodeAt(this.read++); + }; + util.ByteStringBuffer.prototype.getInt16 = function() { + var rval = this.data.charCodeAt(this.read) << 8 ^ this.data.charCodeAt(this.read + 1); + this.read += 2; + return rval; + }; + util.ByteStringBuffer.prototype.getInt24 = function() { + var rval = this.data.charCodeAt(this.read) << 16 ^ this.data.charCodeAt(this.read + 1) << 8 ^ this.data.charCodeAt(this.read + 2); + this.read += 3; + return rval; + }; + util.ByteStringBuffer.prototype.getInt32 = function() { + var rval = this.data.charCodeAt(this.read) << 24 ^ this.data.charCodeAt(this.read + 1) << 16 ^ this.data.charCodeAt(this.read + 2) << 8 ^ this.data.charCodeAt(this.read + 3); + this.read += 4; + return rval; + }; + util.ByteStringBuffer.prototype.getInt16Le = function() { + var rval = this.data.charCodeAt(this.read) ^ this.data.charCodeAt(this.read + 1) << 8; + this.read += 2; + return rval; + }; + util.ByteStringBuffer.prototype.getInt24Le = function() { + var rval = this.data.charCodeAt(this.read) ^ this.data.charCodeAt(this.read + 1) << 8 ^ this.data.charCodeAt(this.read + 2) << 16; + this.read += 3; + return rval; + }; + util.ByteStringBuffer.prototype.getInt32Le = function() { + var rval = this.data.charCodeAt(this.read) ^ this.data.charCodeAt(this.read + 1) << 8 ^ this.data.charCodeAt(this.read + 2) << 16 ^ this.data.charCodeAt(this.read + 3) << 24; + this.read += 4; + return rval; + }; + util.ByteStringBuffer.prototype.getInt = function(n) { + _checkBitsParam(n); + var rval = 0; + do { + rval = (rval << 8) + this.data.charCodeAt(this.read++); + n -= 8; + } while (n > 0); + return rval; + }; + util.ByteStringBuffer.prototype.getSignedInt = function(n) { + var x = this.getInt(n); + var max = 2 << n - 2; + if (x >= max) { + x -= max << 1; + } + return x; + }; + util.ByteStringBuffer.prototype.getBytes = function(count) { + var rval; + if (count) { + count = Math.min(this.length(), count); + rval = this.data.slice(this.read, this.read + count); + this.read += count; + } else if (count === 0) { + rval = ""; + } else { + rval = this.read === 0 ? this.data : this.data.slice(this.read); + this.clear(); + } + return rval; + }; + util.ByteStringBuffer.prototype.bytes = function(count) { + return typeof count === "undefined" ? this.data.slice(this.read) : this.data.slice(this.read, this.read + count); + }; + util.ByteStringBuffer.prototype.at = function(i) { + return this.data.charCodeAt(this.read + i); + }; + util.ByteStringBuffer.prototype.setAt = function(i, b) { + this.data = this.data.substr(0, this.read + i) + String.fromCharCode(b) + this.data.substr(this.read + i + 1); + return this; + }; + util.ByteStringBuffer.prototype.last = function() { + return this.data.charCodeAt(this.data.length - 1); + }; + util.ByteStringBuffer.prototype.copy = function() { + var c = util.createBuffer(this.data); + c.read = this.read; + return c; + }; + util.ByteStringBuffer.prototype.compact = function() { + if (this.read > 0) { + this.data = this.data.slice(this.read); + this.read = 0; + } + return this; + }; + util.ByteStringBuffer.prototype.clear = function() { + this.data = ""; + this.read = 0; + return this; + }; + util.ByteStringBuffer.prototype.truncate = function(count) { + var len = Math.max(0, this.length() - count); + this.data = this.data.substr(this.read, len); + this.read = 0; + return this; + }; + util.ByteStringBuffer.prototype.toHex = function() { + var rval = ""; + for (var i = this.read; i < this.data.length; ++i) { + var b = this.data.charCodeAt(i); + if (b < 16) { + rval += "0"; + } + rval += b.toString(16); + } + return rval; + }; + util.ByteStringBuffer.prototype.toString = function() { + return util.decodeUtf8(this.bytes()); + }; + function DataBuffer(b, options) { + options = options || {}; + this.read = options.readOffset || 0; + this.growSize = options.growSize || 1024; + var isArrayBuffer = util.isArrayBuffer(b); + var isArrayBufferView = util.isArrayBufferView(b); + if (isArrayBuffer || isArrayBufferView) { + if (isArrayBuffer) { + this.data = new DataView(b); + } else { + this.data = new DataView(b.buffer, b.byteOffset, b.byteLength); + } + this.write = "writeOffset" in options ? options.writeOffset : this.data.byteLength; + return; + } + this.data = new DataView(new ArrayBuffer(0)); + this.write = 0; + if (b !== null && b !== void 0) { + this.putBytes(b); + } + if ("writeOffset" in options) { + this.write = options.writeOffset; + } + } + util.DataBuffer = DataBuffer; + util.DataBuffer.prototype.length = function() { + return this.write - this.read; + }; + util.DataBuffer.prototype.isEmpty = function() { + return this.length() <= 0; + }; + util.DataBuffer.prototype.accommodate = function(amount, growSize) { + if (this.length() >= amount) { + return this; + } + growSize = Math.max(growSize || this.growSize, amount); + var src = new Uint8Array( + this.data.buffer, + this.data.byteOffset, + this.data.byteLength + ); + var dst = new Uint8Array(this.length() + growSize); + dst.set(src); + this.data = new DataView(dst.buffer); + return this; + }; + util.DataBuffer.prototype.putByte = function(b) { + this.accommodate(1); + this.data.setUint8(this.write++, b); + return this; + }; + util.DataBuffer.prototype.fillWithByte = function(b, n) { + this.accommodate(n); + for (var i = 0; i < n; ++i) { + this.data.setUint8(b); + } + return this; + }; + util.DataBuffer.prototype.putBytes = function(bytes, encoding) { + if (util.isArrayBufferView(bytes)) { + var src = new Uint8Array(bytes.buffer, bytes.byteOffset, bytes.byteLength); + var len = src.byteLength - src.byteOffset; + this.accommodate(len); + var dst = new Uint8Array(this.data.buffer, this.write); + dst.set(src); + this.write += len; + return this; + } + if (util.isArrayBuffer(bytes)) { + var src = new Uint8Array(bytes); + this.accommodate(src.byteLength); + var dst = new Uint8Array(this.data.buffer); + dst.set(src, this.write); + this.write += src.byteLength; + return this; + } + if (bytes instanceof util.DataBuffer || typeof bytes === "object" && typeof bytes.read === "number" && typeof bytes.write === "number" && util.isArrayBufferView(bytes.data)) { + var src = new Uint8Array(bytes.data.byteLength, bytes.read, bytes.length()); + this.accommodate(src.byteLength); + var dst = new Uint8Array(bytes.data.byteLength, this.write); + dst.set(src); + this.write += src.byteLength; + return this; + } + if (bytes instanceof util.ByteStringBuffer) { + bytes = bytes.data; + encoding = "binary"; + } + encoding = encoding || "binary"; + if (typeof bytes === "string") { + var view; + if (encoding === "hex") { + this.accommodate(Math.ceil(bytes.length / 2)); + view = new Uint8Array(this.data.buffer, this.write); + this.write += util.binary.hex.decode(bytes, view, this.write); + return this; + } + if (encoding === "base64") { + this.accommodate(Math.ceil(bytes.length / 4) * 3); + view = new Uint8Array(this.data.buffer, this.write); + this.write += util.binary.base64.decode(bytes, view, this.write); + return this; + } + if (encoding === "utf8") { + bytes = util.encodeUtf8(bytes); + encoding = "binary"; + } + if (encoding === "binary" || encoding === "raw") { + this.accommodate(bytes.length); + view = new Uint8Array(this.data.buffer, this.write); + this.write += util.binary.raw.decode(view); + return this; + } + if (encoding === "utf16") { + this.accommodate(bytes.length * 2); + view = new Uint16Array(this.data.buffer, this.write); + this.write += util.text.utf16.encode(view); + return this; + } + throw new Error("Invalid encoding: " + encoding); + } + throw Error("Invalid parameter: " + bytes); + }; + util.DataBuffer.prototype.putBuffer = function(buffer) { + this.putBytes(buffer); + buffer.clear(); + return this; + }; + util.DataBuffer.prototype.putString = function(str) { + return this.putBytes(str, "utf16"); + }; + util.DataBuffer.prototype.putInt16 = function(i) { + this.accommodate(2); + this.data.setInt16(this.write, i); + this.write += 2; + return this; + }; + util.DataBuffer.prototype.putInt24 = function(i) { + this.accommodate(3); + this.data.setInt16(this.write, i >> 8 & 65535); + this.data.setInt8(this.write, i >> 16 & 255); + this.write += 3; + return this; + }; + util.DataBuffer.prototype.putInt32 = function(i) { + this.accommodate(4); + this.data.setInt32(this.write, i); + this.write += 4; + return this; + }; + util.DataBuffer.prototype.putInt16Le = function(i) { + this.accommodate(2); + this.data.setInt16(this.write, i, true); + this.write += 2; + return this; + }; + util.DataBuffer.prototype.putInt24Le = function(i) { + this.accommodate(3); + this.data.setInt8(this.write, i >> 16 & 255); + this.data.setInt16(this.write, i >> 8 & 65535, true); + this.write += 3; + return this; + }; + util.DataBuffer.prototype.putInt32Le = function(i) { + this.accommodate(4); + this.data.setInt32(this.write, i, true); + this.write += 4; + return this; + }; + util.DataBuffer.prototype.putInt = function(i, n) { + _checkBitsParam(n); + this.accommodate(n / 8); + do { + n -= 8; + this.data.setInt8(this.write++, i >> n & 255); + } while (n > 0); + return this; + }; + util.DataBuffer.prototype.putSignedInt = function(i, n) { + _checkBitsParam(n); + this.accommodate(n / 8); + if (i < 0) { + i += 2 << n - 1; + } + return this.putInt(i, n); + }; + util.DataBuffer.prototype.getByte = function() { + return this.data.getInt8(this.read++); + }; + util.DataBuffer.prototype.getInt16 = function() { + var rval = this.data.getInt16(this.read); + this.read += 2; + return rval; + }; + util.DataBuffer.prototype.getInt24 = function() { + var rval = this.data.getInt16(this.read) << 8 ^ this.data.getInt8(this.read + 2); + this.read += 3; + return rval; + }; + util.DataBuffer.prototype.getInt32 = function() { + var rval = this.data.getInt32(this.read); + this.read += 4; + return rval; + }; + util.DataBuffer.prototype.getInt16Le = function() { + var rval = this.data.getInt16(this.read, true); + this.read += 2; + return rval; + }; + util.DataBuffer.prototype.getInt24Le = function() { + var rval = this.data.getInt8(this.read) ^ this.data.getInt16(this.read + 1, true) << 8; + this.read += 3; + return rval; + }; + util.DataBuffer.prototype.getInt32Le = function() { + var rval = this.data.getInt32(this.read, true); + this.read += 4; + return rval; + }; + util.DataBuffer.prototype.getInt = function(n) { + _checkBitsParam(n); + var rval = 0; + do { + rval = (rval << 8) + this.data.getInt8(this.read++); + n -= 8; + } while (n > 0); + return rval; + }; + util.DataBuffer.prototype.getSignedInt = function(n) { + var x = this.getInt(n); + var max = 2 << n - 2; + if (x >= max) { + x -= max << 1; + } + return x; + }; + util.DataBuffer.prototype.getBytes = function(count) { + var rval; + if (count) { + count = Math.min(this.length(), count); + rval = this.data.slice(this.read, this.read + count); + this.read += count; + } else if (count === 0) { + rval = ""; + } else { + rval = this.read === 0 ? this.data : this.data.slice(this.read); + this.clear(); + } + return rval; + }; + util.DataBuffer.prototype.bytes = function(count) { + return typeof count === "undefined" ? this.data.slice(this.read) : this.data.slice(this.read, this.read + count); + }; + util.DataBuffer.prototype.at = function(i) { + return this.data.getUint8(this.read + i); + }; + util.DataBuffer.prototype.setAt = function(i, b) { + this.data.setUint8(i, b); + return this; + }; + util.DataBuffer.prototype.last = function() { + return this.data.getUint8(this.write - 1); + }; + util.DataBuffer.prototype.copy = function() { + return new util.DataBuffer(this); + }; + util.DataBuffer.prototype.compact = function() { + if (this.read > 0) { + var src = new Uint8Array(this.data.buffer, this.read); + var dst = new Uint8Array(src.byteLength); + dst.set(src); + this.data = new DataView(dst); + this.write -= this.read; + this.read = 0; + } + return this; + }; + util.DataBuffer.prototype.clear = function() { + this.data = new DataView(new ArrayBuffer(0)); + this.read = this.write = 0; + return this; + }; + util.DataBuffer.prototype.truncate = function(count) { + this.write = Math.max(0, this.length() - count); + this.read = Math.min(this.read, this.write); + return this; + }; + util.DataBuffer.prototype.toHex = function() { + var rval = ""; + for (var i = this.read; i < this.data.byteLength; ++i) { + var b = this.data.getUint8(i); + if (b < 16) { + rval += "0"; + } + rval += b.toString(16); + } + return rval; + }; + util.DataBuffer.prototype.toString = function(encoding) { + var view = new Uint8Array(this.data, this.read, this.length()); + encoding = encoding || "utf8"; + if (encoding === "binary" || encoding === "raw") { + return util.binary.raw.encode(view); + } + if (encoding === "hex") { + return util.binary.hex.encode(view); + } + if (encoding === "base64") { + return util.binary.base64.encode(view); + } + if (encoding === "utf8") { + return util.text.utf8.decode(view); + } + if (encoding === "utf16") { + return util.text.utf16.decode(view); + } + throw new Error("Invalid encoding: " + encoding); + }; + util.createBuffer = function(input, encoding) { + encoding = encoding || "raw"; + if (input !== void 0 && encoding === "utf8") { + input = util.encodeUtf8(input); + } + return new util.ByteBuffer(input); + }; + util.fillString = function(c, n) { + var s = ""; + while (n > 0) { + if (n & 1) { + s += c; + } + n >>>= 1; + if (n > 0) { + c += c; + } + } + return s; + }; + util.xorBytes = function(s1, s2, n) { + var s3 = ""; + var b = ""; + var t = ""; + var i = 0; + var c = 0; + for (; n > 0; --n, ++i) { + b = s1.charCodeAt(i) ^ s2.charCodeAt(i); + if (c >= 10) { + s3 += t; + t = ""; + c = 0; + } + t += String.fromCharCode(b); + ++c; + } + s3 += t; + return s3; + }; + util.hexToBytes = function(hex) { + var rval = ""; + var i = 0; + if (hex.length & true) { + i = 1; + rval += String.fromCharCode(parseInt(hex[0], 16)); + } + for (; i < hex.length; i += 2) { + rval += String.fromCharCode(parseInt(hex.substr(i, 2), 16)); + } + return rval; + }; + util.bytesToHex = function(bytes) { + return util.createBuffer(bytes).toHex(); + }; + util.int32ToBytes = function(i) { + return String.fromCharCode(i >> 24 & 255) + String.fromCharCode(i >> 16 & 255) + String.fromCharCode(i >> 8 & 255) + String.fromCharCode(i & 255); + }; + var _base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; + var _base64Idx = [ + /*43 -43 = 0*/ + /*'+', 1, 2, 3,'/' */ + 62, + -1, + -1, + -1, + 63, + /*'0','1','2','3','4','5','6','7','8','9' */ + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + /*15, 16, 17,'=', 19, 20, 21 */ + -1, + -1, + -1, + 64, + -1, + -1, + -1, + /*65 - 43 = 22*/ + /*'A','B','C','D','E','F','G','H','I','J','K','L','M', */ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + /*'N','O','P','Q','R','S','T','U','V','W','X','Y','Z' */ + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + /*91 - 43 = 48 */ + /*48, 49, 50, 51, 52, 53 */ + -1, + -1, + -1, + -1, + -1, + -1, + /*97 - 43 = 54*/ + /*'a','b','c','d','e','f','g','h','i','j','k','l','m' */ + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + /*'n','o','p','q','r','s','t','u','v','w','x','y','z' */ + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51 + ]; + var _base58 = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"; + util.encode64 = function(input, maxline) { + var line = ""; + var output = ""; + var chr1, chr2, chr3; + var i = 0; + while (i < input.length) { + chr1 = input.charCodeAt(i++); + chr2 = input.charCodeAt(i++); + chr3 = input.charCodeAt(i++); + line += _base64.charAt(chr1 >> 2); + line += _base64.charAt((chr1 & 3) << 4 | chr2 >> 4); + if (isNaN(chr2)) { + line += "=="; + } else { + line += _base64.charAt((chr2 & 15) << 2 | chr3 >> 6); + line += isNaN(chr3) ? "=" : _base64.charAt(chr3 & 63); + } + if (maxline && line.length > maxline) { + output += line.substr(0, maxline) + "\r\n"; + line = line.substr(maxline); + } + } + output += line; + return output; + }; + util.decode64 = function(input) { + input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ""); + var output = ""; + var enc1, enc2, enc3, enc4; + var i = 0; + while (i < input.length) { + enc1 = _base64Idx[input.charCodeAt(i++) - 43]; + enc2 = _base64Idx[input.charCodeAt(i++) - 43]; + enc3 = _base64Idx[input.charCodeAt(i++) - 43]; + enc4 = _base64Idx[input.charCodeAt(i++) - 43]; + output += String.fromCharCode(enc1 << 2 | enc2 >> 4); + if (enc3 !== 64) { + output += String.fromCharCode((enc2 & 15) << 4 | enc3 >> 2); + if (enc4 !== 64) { + output += String.fromCharCode((enc3 & 3) << 6 | enc4); + } + } + } + return output; + }; + util.encodeUtf8 = function(str) { + return unescape(encodeURIComponent(str)); + }; + util.decodeUtf8 = function(str) { + return decodeURIComponent(escape(str)); + }; + util.binary = { + raw: {}, + hex: {}, + base64: {}, + base58: {}, + baseN: { + encode: baseN.encode, + decode: baseN.decode + } + }; + util.binary.raw.encode = function(bytes) { + return String.fromCharCode.apply(null, bytes); + }; + util.binary.raw.decode = function(str, output, offset) { + var out = output; + if (!out) { + out = new Uint8Array(str.length); + } + offset = offset || 0; + var j = offset; + for (var i = 0; i < str.length; ++i) { + out[j++] = str.charCodeAt(i); + } + return output ? j - offset : out; + }; + util.binary.hex.encode = util.bytesToHex; + util.binary.hex.decode = function(hex, output, offset) { + var out = output; + if (!out) { + out = new Uint8Array(Math.ceil(hex.length / 2)); + } + offset = offset || 0; + var i = 0, j = offset; + if (hex.length & 1) { + i = 1; + out[j++] = parseInt(hex[0], 16); + } + for (; i < hex.length; i += 2) { + out[j++] = parseInt(hex.substr(i, 2), 16); + } + return output ? j - offset : out; + }; + util.binary.base64.encode = function(input, maxline) { + var line = ""; + var output = ""; + var chr1, chr2, chr3; + var i = 0; + while (i < input.byteLength) { + chr1 = input[i++]; + chr2 = input[i++]; + chr3 = input[i++]; + line += _base64.charAt(chr1 >> 2); + line += _base64.charAt((chr1 & 3) << 4 | chr2 >> 4); + if (isNaN(chr2)) { + line += "=="; + } else { + line += _base64.charAt((chr2 & 15) << 2 | chr3 >> 6); + line += isNaN(chr3) ? "=" : _base64.charAt(chr3 & 63); + } + if (maxline && line.length > maxline) { + output += line.substr(0, maxline) + "\r\n"; + line = line.substr(maxline); + } + } + output += line; + return output; + }; + util.binary.base64.decode = function(input, output, offset) { + var out = output; + if (!out) { + out = new Uint8Array(Math.ceil(input.length / 4) * 3); + } + input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ""); + offset = offset || 0; + var enc1, enc2, enc3, enc4; + var i = 0, j = offset; + while (i < input.length) { + enc1 = _base64Idx[input.charCodeAt(i++) - 43]; + enc2 = _base64Idx[input.charCodeAt(i++) - 43]; + enc3 = _base64Idx[input.charCodeAt(i++) - 43]; + enc4 = _base64Idx[input.charCodeAt(i++) - 43]; + out[j++] = enc1 << 2 | enc2 >> 4; + if (enc3 !== 64) { + out[j++] = (enc2 & 15) << 4 | enc3 >> 2; + if (enc4 !== 64) { + out[j++] = (enc3 & 3) << 6 | enc4; + } + } + } + return output ? j - offset : out.subarray(0, j); + }; + util.binary.base58.encode = function(input, maxline) { + return util.binary.baseN.encode(input, _base58, maxline); + }; + util.binary.base58.decode = function(input, maxline) { + return util.binary.baseN.decode(input, _base58, maxline); + }; + util.text = { + utf8: {}, + utf16: {} + }; + util.text.utf8.encode = function(str, output, offset) { + str = util.encodeUtf8(str); + var out = output; + if (!out) { + out = new Uint8Array(str.length); + } + offset = offset || 0; + var j = offset; + for (var i = 0; i < str.length; ++i) { + out[j++] = str.charCodeAt(i); + } + return output ? j - offset : out; + }; + util.text.utf8.decode = function(bytes) { + return util.decodeUtf8(String.fromCharCode.apply(null, bytes)); + }; + util.text.utf16.encode = function(str, output, offset) { + var out = output; + if (!out) { + out = new Uint8Array(str.length * 2); + } + var view = new Uint16Array(out.buffer); + offset = offset || 0; + var j = offset; + var k = offset; + for (var i = 0; i < str.length; ++i) { + view[k++] = str.charCodeAt(i); + j += 2; + } + return output ? j - offset : out; + }; + util.text.utf16.decode = function(bytes) { + return String.fromCharCode.apply(null, new Uint16Array(bytes.buffer)); + }; + util.deflate = function(api, bytes, raw) { + bytes = util.decode64(api.deflate(util.encode64(bytes)).rval); + if (raw) { + var start = 2; + var flg = bytes.charCodeAt(1); + if (flg & 32) { + start = 6; + } + bytes = bytes.substring(start, bytes.length - 4); + } + return bytes; + }; + util.inflate = function(api, bytes, raw) { + var rval = api.inflate(util.encode64(bytes)).rval; + return rval === null ? null : util.decode64(rval); + }; + var _setStorageObject = function(api, id, obj) { + if (!api) { + throw new Error("WebStorage not available."); + } + var rval; + if (obj === null) { + rval = api.removeItem(id); + } else { + obj = util.encode64(JSON.stringify(obj)); + rval = api.setItem(id, obj); + } + if (typeof rval !== "undefined" && rval.rval !== true) { + var error = new Error(rval.error.message); + error.id = rval.error.id; + error.name = rval.error.name; + throw error; + } + }; + var _getStorageObject = function(api, id) { + if (!api) { + throw new Error("WebStorage not available."); + } + var rval = api.getItem(id); + if (api.init) { + if (rval.rval === null) { + if (rval.error) { + var error = new Error(rval.error.message); + error.id = rval.error.id; + error.name = rval.error.name; + throw error; + } + rval = null; + } else { + rval = rval.rval; + } + } + if (rval !== null) { + rval = JSON.parse(util.decode64(rval)); + } + return rval; + }; + var _setItem = function(api, id, key, data) { + var obj = _getStorageObject(api, id); + if (obj === null) { + obj = {}; + } + obj[key] = data; + _setStorageObject(api, id, obj); + }; + var _getItem = function(api, id, key) { + var rval = _getStorageObject(api, id); + if (rval !== null) { + rval = key in rval ? rval[key] : null; + } + return rval; + }; + var _removeItem = function(api, id, key) { + var obj = _getStorageObject(api, id); + if (obj !== null && key in obj) { + delete obj[key]; + var empty = true; + for (var prop in obj) { + empty = false; + break; + } + if (empty) { + obj = null; + } + _setStorageObject(api, id, obj); + } + }; + var _clearItems = function(api, id) { + _setStorageObject(api, id, null); + }; + var _callStorageFunction = function(func, args, location) { + var rval = null; + if (typeof location === "undefined") { + location = ["web", "flash"]; + } + var type; + var done = false; + var exception = null; + for (var idx in location) { + type = location[idx]; + try { + if (type === "flash" || type === "both") { + if (args[0] === null) { + throw new Error("Flash local storage not available."); + } + rval = func.apply(this, args); + done = type === "flash"; + } + if (type === "web" || type === "both") { + args[0] = localStorage; + rval = func.apply(this, args); + done = true; + } + } catch (ex) { + exception = ex; + } + if (done) { + break; + } + } + if (!done) { + throw exception; + } + return rval; + }; + util.setItem = function(api, id, key, data, location) { + _callStorageFunction(_setItem, arguments, location); + }; + util.getItem = function(api, id, key, location) { + return _callStorageFunction(_getItem, arguments, location); + }; + util.removeItem = function(api, id, key, location) { + _callStorageFunction(_removeItem, arguments, location); + }; + util.clearItems = function(api, id, location) { + _callStorageFunction(_clearItems, arguments, location); + }; + util.isEmpty = function(obj) { + for (var prop in obj) { + if (obj.hasOwnProperty(prop)) { + return false; + } + } + return true; + }; + util.format = function(format) { + var re = /%./g; + var match; + var part; + var argi = 0; + var parts = []; + var last = 0; + while (match = re.exec(format)) { + part = format.substring(last, re.lastIndex - 2); + if (part.length > 0) { + parts.push(part); + } + last = re.lastIndex; + var code = match[0][1]; + switch (code) { + case "s": + case "o": + if (argi < arguments.length) { + parts.push(arguments[argi++ + 1]); + } else { + parts.push(""); + } + break; + case "%": + parts.push("%"); + break; + default: + parts.push("<%" + code + "?>"); + } + } + parts.push(format.substring(last)); + return parts.join(""); + }; + util.formatNumber = function(number, decimals, dec_point, thousands_sep) { + var n = number, c = isNaN(decimals = Math.abs(decimals)) ? 2 : decimals; + var d = dec_point === void 0 ? "," : dec_point; + var t = thousands_sep === void 0 ? "." : thousands_sep, s = n < 0 ? "-" : ""; + var i = parseInt(n = Math.abs(+n || 0).toFixed(c), 10) + ""; + var j = i.length > 3 ? i.length % 3 : 0; + return s + (j ? i.substr(0, j) + t : "") + i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + t) + (c ? d + Math.abs(n - i).toFixed(c).slice(2) : ""); + }; + util.formatSize = function(size) { + if (size >= 1073741824) { + size = util.formatNumber(size / 1073741824, 2, ".", "") + " GiB"; + } else if (size >= 1048576) { + size = util.formatNumber(size / 1048576, 2, ".", "") + " MiB"; + } else if (size >= 1024) { + size = util.formatNumber(size / 1024, 0) + " KiB"; + } else { + size = util.formatNumber(size, 0) + " bytes"; + } + return size; + }; + util.bytesFromIP = function(ip) { + if (ip.indexOf(".") !== -1) { + return util.bytesFromIPv4(ip); + } + if (ip.indexOf(":") !== -1) { + return util.bytesFromIPv6(ip); + } + return null; + }; + util.bytesFromIPv4 = function(ip) { + ip = ip.split("."); + if (ip.length !== 4) { + return null; + } + var b = util.createBuffer(); + for (var i = 0; i < ip.length; ++i) { + var num = parseInt(ip[i], 10); + if (isNaN(num)) { + return null; + } + b.putByte(num); + } + return b.getBytes(); + }; + util.bytesFromIPv6 = function(ip) { + var blanks = 0; + ip = ip.split(":").filter(function(e) { + if (e.length === 0) ++blanks; + return true; + }); + var zeros = (8 - ip.length + blanks) * 2; + var b = util.createBuffer(); + for (var i = 0; i < 8; ++i) { + if (!ip[i] || ip[i].length === 0) { + b.fillWithByte(0, zeros); + zeros = 0; + continue; + } + var bytes = util.hexToBytes(ip[i]); + if (bytes.length < 2) { + b.putByte(0); + } + b.putBytes(bytes); + } + return b.getBytes(); + }; + util.bytesToIP = function(bytes) { + if (bytes.length === 4) { + return util.bytesToIPv4(bytes); + } + if (bytes.length === 16) { + return util.bytesToIPv6(bytes); + } + return null; + }; + util.bytesToIPv4 = function(bytes) { + if (bytes.length !== 4) { + return null; + } + var ip = []; + for (var i = 0; i < bytes.length; ++i) { + ip.push(bytes.charCodeAt(i)); + } + return ip.join("."); + }; + util.bytesToIPv6 = function(bytes) { + if (bytes.length !== 16) { + return null; + } + var ip = []; + var zeroGroups = []; + var zeroMaxGroup = 0; + for (var i = 0; i < bytes.length; i += 2) { + var hex = util.bytesToHex(bytes[i] + bytes[i + 1]); + while (hex[0] === "0" && hex !== "0") { + hex = hex.substr(1); + } + if (hex === "0") { + var last = zeroGroups[zeroGroups.length - 1]; + var idx = ip.length; + if (!last || idx !== last.end + 1) { + zeroGroups.push({ start: idx, end: idx }); + } else { + last.end = idx; + if (last.end - last.start > zeroGroups[zeroMaxGroup].end - zeroGroups[zeroMaxGroup].start) { + zeroMaxGroup = zeroGroups.length - 1; + } + } + } + ip.push(hex); + } + if (zeroGroups.length > 0) { + var group = zeroGroups[zeroMaxGroup]; + if (group.end - group.start > 0) { + ip.splice(group.start, group.end - group.start + 1, ""); + if (group.start === 0) { + ip.unshift(""); + } + if (group.end === 7) { + ip.push(""); + } + } + } + return ip.join(":"); + }; + util.estimateCores = function(options, callback) { + if (typeof options === "function") { + callback = options; + options = {}; + } + options = options || {}; + if ("cores" in util && !options.update) { + return callback(null, util.cores); + } + if (typeof navigator !== "undefined" && "hardwareConcurrency" in navigator && navigator.hardwareConcurrency > 0) { + util.cores = navigator.hardwareConcurrency; + return callback(null, util.cores); + } + if (typeof Worker === "undefined") { + util.cores = 1; + return callback(null, util.cores); + } + if (typeof Blob === "undefined") { + util.cores = 2; + return callback(null, util.cores); + } + var blobUrl = URL.createObjectURL(new Blob([ + "(", + function() { + self.addEventListener("message", function(e) { + var st = Date.now(); + var et = st + 4; + while (Date.now() < et) ; + self.postMessage({ st, et }); + }); + }.toString(), + ")()" + ], { type: "application/javascript" })); + sample([], 5, 16); + function sample(max, samples, numWorkers) { + if (samples === 0) { + var avg = Math.floor(max.reduce(function(avg2, x) { + return avg2 + x; + }, 0) / max.length); + util.cores = Math.max(1, avg); + URL.revokeObjectURL(blobUrl); + return callback(null, util.cores); + } + map(numWorkers, function(err, results) { + max.push(reduce(numWorkers, results)); + sample(max, samples - 1, numWorkers); + }); + } + function map(numWorkers, callback2) { + var workers = []; + var results = []; + for (var i = 0; i < numWorkers; ++i) { + var worker = new Worker(blobUrl); + worker.addEventListener("message", function(e) { + results.push(e.data); + if (results.length === numWorkers) { + for (var i2 = 0; i2 < numWorkers; ++i2) { + workers[i2].terminate(); + } + callback2(null, results); + } + }); + workers.push(worker); + } + for (var i = 0; i < numWorkers; ++i) { + workers[i].postMessage(i); + } + } + function reduce(numWorkers, results) { + var overlaps = []; + for (var n = 0; n < numWorkers; ++n) { + var r1 = results[n]; + var overlap = overlaps[n] = []; + for (var i = 0; i < numWorkers; ++i) { + if (n === i) { + continue; + } + var r2 = results[i]; + if (r1.st > r2.st && r1.st < r2.et || r2.st > r1.st && r2.st < r1.et) { + overlap.push(i); + } + } + } + return overlaps.reduce(function(max, overlap2) { + return Math.max(max, overlap2.length); + }, 0); + } + }; + } +}); + +// node_modules/node-forge/lib/cipher.js +var require_cipher = __commonJS({ + "node_modules/node-forge/lib/cipher.js"(exports, module) { + var forge2 = require_forge(); + require_util(); + module.exports = forge2.cipher = forge2.cipher || {}; + forge2.cipher.algorithms = forge2.cipher.algorithms || {}; + forge2.cipher.createCipher = function(algorithm, key) { + var api = algorithm; + if (typeof api === "string") { + api = forge2.cipher.getAlgorithm(api); + if (api) { + api = api(); + } + } + if (!api) { + throw new Error("Unsupported algorithm: " + algorithm); + } + return new forge2.cipher.BlockCipher({ + algorithm: api, + key, + decrypt: false + }); + }; + forge2.cipher.createDecipher = function(algorithm, key) { + var api = algorithm; + if (typeof api === "string") { + api = forge2.cipher.getAlgorithm(api); + if (api) { + api = api(); + } + } + if (!api) { + throw new Error("Unsupported algorithm: " + algorithm); + } + return new forge2.cipher.BlockCipher({ + algorithm: api, + key, + decrypt: true + }); + }; + forge2.cipher.registerAlgorithm = function(name, algorithm) { + name = name.toUpperCase(); + forge2.cipher.algorithms[name] = algorithm; + }; + forge2.cipher.getAlgorithm = function(name) { + name = name.toUpperCase(); + if (name in forge2.cipher.algorithms) { + return forge2.cipher.algorithms[name]; + } + return null; + }; + var BlockCipher = forge2.cipher.BlockCipher = function(options) { + this.algorithm = options.algorithm; + this.mode = this.algorithm.mode; + this.blockSize = this.mode.blockSize; + this._finish = false; + this._input = null; + this.output = null; + this._op = options.decrypt ? this.mode.decrypt : this.mode.encrypt; + this._decrypt = options.decrypt; + this.algorithm.initialize(options); + }; + BlockCipher.prototype.start = function(options) { + options = options || {}; + var opts = {}; + for (var key in options) { + opts[key] = options[key]; + } + opts.decrypt = this._decrypt; + this._finish = false; + this._input = forge2.util.createBuffer(); + this.output = options.output || forge2.util.createBuffer(); + this.mode.start(opts); + }; + BlockCipher.prototype.update = function(input) { + if (input) { + this._input.putBuffer(input); + } + while (!this._op.call(this.mode, this._input, this.output, this._finish) && !this._finish) { + } + this._input.compact(); + }; + BlockCipher.prototype.finish = function(pad) { + if (pad && (this.mode.name === "ECB" || this.mode.name === "CBC")) { + this.mode.pad = function(input) { + return pad(this.blockSize, input, false); + }; + this.mode.unpad = function(output) { + return pad(this.blockSize, output, true); + }; + } + var options = {}; + options.decrypt = this._decrypt; + options.overflow = this._input.length() % this.blockSize; + if (!this._decrypt && this.mode.pad) { + if (!this.mode.pad(this._input, options)) { + return false; + } + } + this._finish = true; + this.update(); + if (this._decrypt && this.mode.unpad) { + if (!this.mode.unpad(this.output, options)) { + return false; + } + } + if (this.mode.afterFinish) { + if (!this.mode.afterFinish(this.output, options)) { + return false; + } + } + return true; + }; + } +}); + +// node_modules/node-forge/lib/cipherModes.js +var require_cipherModes = __commonJS({ + "node_modules/node-forge/lib/cipherModes.js"(exports, module) { + var forge2 = require_forge(); + require_util(); + forge2.cipher = forge2.cipher || {}; + var modes = module.exports = forge2.cipher.modes = forge2.cipher.modes || {}; + modes.ecb = function(options) { + options = options || {}; + this.name = "ECB"; + this.cipher = options.cipher; + this.blockSize = options.blockSize || 16; + this._ints = this.blockSize / 4; + this._inBlock = new Array(this._ints); + this._outBlock = new Array(this._ints); + }; + modes.ecb.prototype.start = function(options) { + }; + modes.ecb.prototype.encrypt = function(input, output, finish) { + if (input.length() < this.blockSize && !(finish && input.length() > 0)) { + return true; + } + for (var i = 0; i < this._ints; ++i) { + this._inBlock[i] = input.getInt32(); + } + this.cipher.encrypt(this._inBlock, this._outBlock); + for (var i = 0; i < this._ints; ++i) { + output.putInt32(this._outBlock[i]); + } + }; + modes.ecb.prototype.decrypt = function(input, output, finish) { + if (input.length() < this.blockSize && !(finish && input.length() > 0)) { + return true; + } + for (var i = 0; i < this._ints; ++i) { + this._inBlock[i] = input.getInt32(); + } + this.cipher.decrypt(this._inBlock, this._outBlock); + for (var i = 0; i < this._ints; ++i) { + output.putInt32(this._outBlock[i]); + } + }; + modes.ecb.prototype.pad = function(input, options) { + var padding = input.length() === this.blockSize ? this.blockSize : this.blockSize - input.length(); + input.fillWithByte(padding, padding); + return true; + }; + modes.ecb.prototype.unpad = function(output, options) { + if (options.overflow > 0) { + return false; + } + var len = output.length(); + var count = output.at(len - 1); + if (count > this.blockSize << 2) { + return false; + } + output.truncate(count); + return true; + }; + modes.cbc = function(options) { + options = options || {}; + this.name = "CBC"; + this.cipher = options.cipher; + this.blockSize = options.blockSize || 16; + this._ints = this.blockSize / 4; + this._inBlock = new Array(this._ints); + this._outBlock = new Array(this._ints); + }; + modes.cbc.prototype.start = function(options) { + if (options.iv === null) { + if (!this._prev) { + throw new Error("Invalid IV parameter."); + } + this._iv = this._prev.slice(0); + } else if (!("iv" in options)) { + throw new Error("Invalid IV parameter."); + } else { + this._iv = transformIV(options.iv, this.blockSize); + this._prev = this._iv.slice(0); + } + }; + modes.cbc.prototype.encrypt = function(input, output, finish) { + if (input.length() < this.blockSize && !(finish && input.length() > 0)) { + return true; + } + for (var i = 0; i < this._ints; ++i) { + this._inBlock[i] = this._prev[i] ^ input.getInt32(); + } + this.cipher.encrypt(this._inBlock, this._outBlock); + for (var i = 0; i < this._ints; ++i) { + output.putInt32(this._outBlock[i]); + } + this._prev = this._outBlock; + }; + modes.cbc.prototype.decrypt = function(input, output, finish) { + if (input.length() < this.blockSize && !(finish && input.length() > 0)) { + return true; + } + for (var i = 0; i < this._ints; ++i) { + this._inBlock[i] = input.getInt32(); + } + this.cipher.decrypt(this._inBlock, this._outBlock); + for (var i = 0; i < this._ints; ++i) { + output.putInt32(this._prev[i] ^ this._outBlock[i]); + } + this._prev = this._inBlock.slice(0); + }; + modes.cbc.prototype.pad = function(input, options) { + var padding = input.length() === this.blockSize ? this.blockSize : this.blockSize - input.length(); + input.fillWithByte(padding, padding); + return true; + }; + modes.cbc.prototype.unpad = function(output, options) { + if (options.overflow > 0) { + return false; + } + var len = output.length(); + var count = output.at(len - 1); + if (count > this.blockSize << 2) { + return false; + } + output.truncate(count); + return true; + }; + modes.cfb = function(options) { + options = options || {}; + this.name = "CFB"; + this.cipher = options.cipher; + this.blockSize = options.blockSize || 16; + this._ints = this.blockSize / 4; + this._inBlock = null; + this._outBlock = new Array(this._ints); + this._partialBlock = new Array(this._ints); + this._partialOutput = forge2.util.createBuffer(); + this._partialBytes = 0; + }; + modes.cfb.prototype.start = function(options) { + if (!("iv" in options)) { + throw new Error("Invalid IV parameter."); + } + this._iv = transformIV(options.iv, this.blockSize); + this._inBlock = this._iv.slice(0); + this._partialBytes = 0; + }; + modes.cfb.prototype.encrypt = function(input, output, finish) { + var inputLength = input.length(); + if (inputLength === 0) { + return true; + } + this.cipher.encrypt(this._inBlock, this._outBlock); + if (this._partialBytes === 0 && inputLength >= this.blockSize) { + for (var i = 0; i < this._ints; ++i) { + this._inBlock[i] = input.getInt32() ^ this._outBlock[i]; + output.putInt32(this._inBlock[i]); + } + return; + } + var partialBytes = (this.blockSize - inputLength) % this.blockSize; + if (partialBytes > 0) { + partialBytes = this.blockSize - partialBytes; + } + this._partialOutput.clear(); + for (var i = 0; i < this._ints; ++i) { + this._partialBlock[i] = input.getInt32() ^ this._outBlock[i]; + this._partialOutput.putInt32(this._partialBlock[i]); + } + if (partialBytes > 0) { + input.read -= this.blockSize; + } else { + for (var i = 0; i < this._ints; ++i) { + this._inBlock[i] = this._partialBlock[i]; + } + } + if (this._partialBytes > 0) { + this._partialOutput.getBytes(this._partialBytes); + } + if (partialBytes > 0 && !finish) { + output.putBytes(this._partialOutput.getBytes( + partialBytes - this._partialBytes + )); + this._partialBytes = partialBytes; + return true; + } + output.putBytes(this._partialOutput.getBytes( + inputLength - this._partialBytes + )); + this._partialBytes = 0; + }; + modes.cfb.prototype.decrypt = function(input, output, finish) { + var inputLength = input.length(); + if (inputLength === 0) { + return true; + } + this.cipher.encrypt(this._inBlock, this._outBlock); + if (this._partialBytes === 0 && inputLength >= this.blockSize) { + for (var i = 0; i < this._ints; ++i) { + this._inBlock[i] = input.getInt32(); + output.putInt32(this._inBlock[i] ^ this._outBlock[i]); + } + return; + } + var partialBytes = (this.blockSize - inputLength) % this.blockSize; + if (partialBytes > 0) { + partialBytes = this.blockSize - partialBytes; + } + this._partialOutput.clear(); + for (var i = 0; i < this._ints; ++i) { + this._partialBlock[i] = input.getInt32(); + this._partialOutput.putInt32(this._partialBlock[i] ^ this._outBlock[i]); + } + if (partialBytes > 0) { + input.read -= this.blockSize; + } else { + for (var i = 0; i < this._ints; ++i) { + this._inBlock[i] = this._partialBlock[i]; + } + } + if (this._partialBytes > 0) { + this._partialOutput.getBytes(this._partialBytes); + } + if (partialBytes > 0 && !finish) { + output.putBytes(this._partialOutput.getBytes( + partialBytes - this._partialBytes + )); + this._partialBytes = partialBytes; + return true; + } + output.putBytes(this._partialOutput.getBytes( + inputLength - this._partialBytes + )); + this._partialBytes = 0; + }; + modes.ofb = function(options) { + options = options || {}; + this.name = "OFB"; + this.cipher = options.cipher; + this.blockSize = options.blockSize || 16; + this._ints = this.blockSize / 4; + this._inBlock = null; + this._outBlock = new Array(this._ints); + this._partialOutput = forge2.util.createBuffer(); + this._partialBytes = 0; + }; + modes.ofb.prototype.start = function(options) { + if (!("iv" in options)) { + throw new Error("Invalid IV parameter."); + } + this._iv = transformIV(options.iv, this.blockSize); + this._inBlock = this._iv.slice(0); + this._partialBytes = 0; + }; + modes.ofb.prototype.encrypt = function(input, output, finish) { + var inputLength = input.length(); + if (input.length() === 0) { + return true; + } + this.cipher.encrypt(this._inBlock, this._outBlock); + if (this._partialBytes === 0 && inputLength >= this.blockSize) { + for (var i = 0; i < this._ints; ++i) { + output.putInt32(input.getInt32() ^ this._outBlock[i]); + this._inBlock[i] = this._outBlock[i]; + } + return; + } + var partialBytes = (this.blockSize - inputLength) % this.blockSize; + if (partialBytes > 0) { + partialBytes = this.blockSize - partialBytes; + } + this._partialOutput.clear(); + for (var i = 0; i < this._ints; ++i) { + this._partialOutput.putInt32(input.getInt32() ^ this._outBlock[i]); + } + if (partialBytes > 0) { + input.read -= this.blockSize; + } else { + for (var i = 0; i < this._ints; ++i) { + this._inBlock[i] = this._outBlock[i]; + } + } + if (this._partialBytes > 0) { + this._partialOutput.getBytes(this._partialBytes); + } + if (partialBytes > 0 && !finish) { + output.putBytes(this._partialOutput.getBytes( + partialBytes - this._partialBytes + )); + this._partialBytes = partialBytes; + return true; + } + output.putBytes(this._partialOutput.getBytes( + inputLength - this._partialBytes + )); + this._partialBytes = 0; + }; + modes.ofb.prototype.decrypt = modes.ofb.prototype.encrypt; + modes.ctr = function(options) { + options = options || {}; + this.name = "CTR"; + this.cipher = options.cipher; + this.blockSize = options.blockSize || 16; + this._ints = this.blockSize / 4; + this._inBlock = null; + this._outBlock = new Array(this._ints); + this._partialOutput = forge2.util.createBuffer(); + this._partialBytes = 0; + }; + modes.ctr.prototype.start = function(options) { + if (!("iv" in options)) { + throw new Error("Invalid IV parameter."); + } + this._iv = transformIV(options.iv, this.blockSize); + this._inBlock = this._iv.slice(0); + this._partialBytes = 0; + }; + modes.ctr.prototype.encrypt = function(input, output, finish) { + var inputLength = input.length(); + if (inputLength === 0) { + return true; + } + this.cipher.encrypt(this._inBlock, this._outBlock); + if (this._partialBytes === 0 && inputLength >= this.blockSize) { + for (var i = 0; i < this._ints; ++i) { + output.putInt32(input.getInt32() ^ this._outBlock[i]); + } + } else { + var partialBytes = (this.blockSize - inputLength) % this.blockSize; + if (partialBytes > 0) { + partialBytes = this.blockSize - partialBytes; + } + this._partialOutput.clear(); + for (var i = 0; i < this._ints; ++i) { + this._partialOutput.putInt32(input.getInt32() ^ this._outBlock[i]); + } + if (partialBytes > 0) { + input.read -= this.blockSize; + } + if (this._partialBytes > 0) { + this._partialOutput.getBytes(this._partialBytes); + } + if (partialBytes > 0 && !finish) { + output.putBytes(this._partialOutput.getBytes( + partialBytes - this._partialBytes + )); + this._partialBytes = partialBytes; + return true; + } + output.putBytes(this._partialOutput.getBytes( + inputLength - this._partialBytes + )); + this._partialBytes = 0; + } + inc32(this._inBlock); + }; + modes.ctr.prototype.decrypt = modes.ctr.prototype.encrypt; + modes.gcm = function(options) { + options = options || {}; + this.name = "GCM"; + this.cipher = options.cipher; + this.blockSize = options.blockSize || 16; + this._ints = this.blockSize / 4; + this._inBlock = new Array(this._ints); + this._outBlock = new Array(this._ints); + this._partialOutput = forge2.util.createBuffer(); + this._partialBytes = 0; + this._R = 3774873600; + }; + modes.gcm.prototype.start = function(options) { + if (!("iv" in options)) { + throw new Error("Invalid IV parameter."); + } + var iv = forge2.util.createBuffer(options.iv); + this._cipherLength = 0; + var additionalData; + if ("additionalData" in options) { + additionalData = forge2.util.createBuffer(options.additionalData); + } else { + additionalData = forge2.util.createBuffer(); + } + if ("tagLength" in options) { + this._tagLength = options.tagLength; + } else { + this._tagLength = 128; + } + this._tag = null; + if (options.decrypt) { + this._tag = forge2.util.createBuffer(options.tag).getBytes(); + if (this._tag.length !== this._tagLength / 8) { + throw new Error("Authentication tag does not match tag length."); + } + } + this._hashBlock = new Array(this._ints); + this.tag = null; + this._hashSubkey = new Array(this._ints); + this.cipher.encrypt([0, 0, 0, 0], this._hashSubkey); + this.componentBits = 4; + this._m = this.generateHashTable(this._hashSubkey, this.componentBits); + var ivLength = iv.length(); + if (ivLength === 12) { + this._j0 = [iv.getInt32(), iv.getInt32(), iv.getInt32(), 1]; + } else { + this._j0 = [0, 0, 0, 0]; + while (iv.length() > 0) { + this._j0 = this.ghash( + this._hashSubkey, + this._j0, + [iv.getInt32(), iv.getInt32(), iv.getInt32(), iv.getInt32()] + ); + } + this._j0 = this.ghash( + this._hashSubkey, + this._j0, + [0, 0].concat(from64To32(ivLength * 8)) + ); + } + this._inBlock = this._j0.slice(0); + inc32(this._inBlock); + this._partialBytes = 0; + additionalData = forge2.util.createBuffer(additionalData); + this._aDataLength = from64To32(additionalData.length() * 8); + var overflow = additionalData.length() % this.blockSize; + if (overflow) { + additionalData.fillWithByte(0, this.blockSize - overflow); + } + this._s = [0, 0, 0, 0]; + while (additionalData.length() > 0) { + this._s = this.ghash(this._hashSubkey, this._s, [ + additionalData.getInt32(), + additionalData.getInt32(), + additionalData.getInt32(), + additionalData.getInt32() + ]); + } + }; + modes.gcm.prototype.encrypt = function(input, output, finish) { + var inputLength = input.length(); + if (inputLength === 0) { + return true; + } + this.cipher.encrypt(this._inBlock, this._outBlock); + if (this._partialBytes === 0 && inputLength >= this.blockSize) { + for (var i = 0; i < this._ints; ++i) { + output.putInt32(this._outBlock[i] ^= input.getInt32()); + } + this._cipherLength += this.blockSize; + } else { + var partialBytes = (this.blockSize - inputLength) % this.blockSize; + if (partialBytes > 0) { + partialBytes = this.blockSize - partialBytes; + } + this._partialOutput.clear(); + for (var i = 0; i < this._ints; ++i) { + this._partialOutput.putInt32(input.getInt32() ^ this._outBlock[i]); + } + if (partialBytes <= 0 || finish) { + if (finish) { + var overflow = inputLength % this.blockSize; + this._cipherLength += overflow; + this._partialOutput.truncate(this.blockSize - overflow); + } else { + this._cipherLength += this.blockSize; + } + for (var i = 0; i < this._ints; ++i) { + this._outBlock[i] = this._partialOutput.getInt32(); + } + this._partialOutput.read -= this.blockSize; + } + if (this._partialBytes > 0) { + this._partialOutput.getBytes(this._partialBytes); + } + if (partialBytes > 0 && !finish) { + input.read -= this.blockSize; + output.putBytes(this._partialOutput.getBytes( + partialBytes - this._partialBytes + )); + this._partialBytes = partialBytes; + return true; + } + output.putBytes(this._partialOutput.getBytes( + inputLength - this._partialBytes + )); + this._partialBytes = 0; + } + this._s = this.ghash(this._hashSubkey, this._s, this._outBlock); + inc32(this._inBlock); + }; + modes.gcm.prototype.decrypt = function(input, output, finish) { + var inputLength = input.length(); + if (inputLength < this.blockSize && !(finish && inputLength > 0)) { + return true; + } + this.cipher.encrypt(this._inBlock, this._outBlock); + inc32(this._inBlock); + this._hashBlock[0] = input.getInt32(); + this._hashBlock[1] = input.getInt32(); + this._hashBlock[2] = input.getInt32(); + this._hashBlock[3] = input.getInt32(); + this._s = this.ghash(this._hashSubkey, this._s, this._hashBlock); + for (var i = 0; i < this._ints; ++i) { + output.putInt32(this._outBlock[i] ^ this._hashBlock[i]); + } + if (inputLength < this.blockSize) { + this._cipherLength += inputLength % this.blockSize; + } else { + this._cipherLength += this.blockSize; + } + }; + modes.gcm.prototype.afterFinish = function(output, options) { + var rval = true; + if (options.decrypt && options.overflow) { + output.truncate(this.blockSize - options.overflow); + } + this.tag = forge2.util.createBuffer(); + var lengths = this._aDataLength.concat(from64To32(this._cipherLength * 8)); + this._s = this.ghash(this._hashSubkey, this._s, lengths); + var tag = []; + this.cipher.encrypt(this._j0, tag); + for (var i = 0; i < this._ints; ++i) { + this.tag.putInt32(this._s[i] ^ tag[i]); + } + this.tag.truncate(this.tag.length() % (this._tagLength / 8)); + if (options.decrypt && this.tag.bytes() !== this._tag) { + rval = false; + } + return rval; + }; + modes.gcm.prototype.multiply = function(x, y) { + var z_i = [0, 0, 0, 0]; + var v_i = y.slice(0); + for (var i = 0; i < 128; ++i) { + var x_i = x[i / 32 | 0] & 1 << 31 - i % 32; + if (x_i) { + z_i[0] ^= v_i[0]; + z_i[1] ^= v_i[1]; + z_i[2] ^= v_i[2]; + z_i[3] ^= v_i[3]; + } + this.pow(v_i, v_i); + } + return z_i; + }; + modes.gcm.prototype.pow = function(x, out) { + var lsb = x[3] & 1; + for (var i = 3; i > 0; --i) { + out[i] = x[i] >>> 1 | (x[i - 1] & 1) << 31; + } + out[0] = x[0] >>> 1; + if (lsb) { + out[0] ^= this._R; + } + }; + modes.gcm.prototype.tableMultiply = function(x) { + var z = [0, 0, 0, 0]; + for (var i = 0; i < 32; ++i) { + var idx = i / 8 | 0; + var x_i = x[idx] >>> (7 - i % 8) * 4 & 15; + var ah = this._m[i][x_i]; + z[0] ^= ah[0]; + z[1] ^= ah[1]; + z[2] ^= ah[2]; + z[3] ^= ah[3]; + } + return z; + }; + modes.gcm.prototype.ghash = function(h, y, x) { + y[0] ^= x[0]; + y[1] ^= x[1]; + y[2] ^= x[2]; + y[3] ^= x[3]; + return this.tableMultiply(y); + }; + modes.gcm.prototype.generateHashTable = function(h, bits) { + var multiplier = 8 / bits; + var perInt = 4 * multiplier; + var size = 16 * multiplier; + var m = new Array(size); + for (var i = 0; i < size; ++i) { + var tmp = [0, 0, 0, 0]; + var idx = i / perInt | 0; + var shft = (perInt - 1 - i % perInt) * bits; + tmp[idx] = 1 << bits - 1 << shft; + m[i] = this.generateSubHashTable(this.multiply(tmp, h), bits); + } + return m; + }; + modes.gcm.prototype.generateSubHashTable = function(mid, bits) { + var size = 1 << bits; + var half = size >>> 1; + var m = new Array(size); + m[half] = mid.slice(0); + var i = half >>> 1; + while (i > 0) { + this.pow(m[2 * i], m[i] = []); + i >>= 1; + } + i = 2; + while (i < half) { + for (var j = 1; j < i; ++j) { + var m_i = m[i]; + var m_j = m[j]; + m[i + j] = [ + m_i[0] ^ m_j[0], + m_i[1] ^ m_j[1], + m_i[2] ^ m_j[2], + m_i[3] ^ m_j[3] + ]; + } + i *= 2; + } + m[0] = [0, 0, 0, 0]; + for (i = half + 1; i < size; ++i) { + var c = m[i ^ half]; + m[i] = [mid[0] ^ c[0], mid[1] ^ c[1], mid[2] ^ c[2], mid[3] ^ c[3]]; + } + return m; + }; + function transformIV(iv, blockSize) { + if (typeof iv === "string") { + iv = forge2.util.createBuffer(iv); + } + if (forge2.util.isArray(iv) && iv.length > 4) { + var tmp = iv; + iv = forge2.util.createBuffer(); + for (var i = 0; i < tmp.length; ++i) { + iv.putByte(tmp[i]); + } + } + if (iv.length() < blockSize) { + throw new Error( + "Invalid IV length; got " + iv.length() + " bytes and expected " + blockSize + " bytes." + ); + } + if (!forge2.util.isArray(iv)) { + var ints = []; + var blocks = blockSize / 4; + for (var i = 0; i < blocks; ++i) { + ints.push(iv.getInt32()); + } + iv = ints; + } + return iv; + } + function inc32(block) { + block[block.length - 1] = block[block.length - 1] + 1 & 4294967295; + } + function from64To32(num) { + return [num / 4294967296 | 0, num & 4294967295]; + } + } +}); + +// node_modules/node-forge/lib/aes.js +var require_aes = __commonJS({ + "node_modules/node-forge/lib/aes.js"(exports, module) { + var forge2 = require_forge(); + require_cipher(); + require_cipherModes(); + require_util(); + module.exports = forge2.aes = forge2.aes || {}; + forge2.aes.startEncrypting = function(key, iv, output, mode) { + var cipher = _createCipher({ + key, + output, + decrypt: false, + mode + }); + cipher.start(iv); + return cipher; + }; + forge2.aes.createEncryptionCipher = function(key, mode) { + return _createCipher({ + key, + output: null, + decrypt: false, + mode + }); + }; + forge2.aes.startDecrypting = function(key, iv, output, mode) { + var cipher = _createCipher({ + key, + output, + decrypt: true, + mode + }); + cipher.start(iv); + return cipher; + }; + forge2.aes.createDecryptionCipher = function(key, mode) { + return _createCipher({ + key, + output: null, + decrypt: true, + mode + }); + }; + forge2.aes.Algorithm = function(name, mode) { + if (!init) { + initialize(); + } + var self2 = this; + self2.name = name; + self2.mode = new mode({ + blockSize: 16, + cipher: { + encrypt: function(inBlock, outBlock) { + return _updateBlock(self2._w, inBlock, outBlock, false); + }, + decrypt: function(inBlock, outBlock) { + return _updateBlock(self2._w, inBlock, outBlock, true); + } + } + }); + self2._init = false; + }; + forge2.aes.Algorithm.prototype.initialize = function(options) { + if (this._init) { + return; + } + var key = options.key; + var tmp; + if (typeof key === "string" && (key.length === 16 || key.length === 24 || key.length === 32)) { + key = forge2.util.createBuffer(key); + } else if (forge2.util.isArray(key) && (key.length === 16 || key.length === 24 || key.length === 32)) { + tmp = key; + key = forge2.util.createBuffer(); + for (var i = 0; i < tmp.length; ++i) { + key.putByte(tmp[i]); + } + } + if (!forge2.util.isArray(key)) { + tmp = key; + key = []; + var len = tmp.length(); + if (len === 16 || len === 24 || len === 32) { + len = len >>> 2; + for (var i = 0; i < len; ++i) { + key.push(tmp.getInt32()); + } + } + } + if (!forge2.util.isArray(key) || !(key.length === 4 || key.length === 6 || key.length === 8)) { + throw new Error("Invalid key parameter."); + } + var mode = this.mode.name; + var encryptOp = ["CFB", "OFB", "CTR", "GCM"].indexOf(mode) !== -1; + this._w = _expandKey(key, options.decrypt && !encryptOp); + this._init = true; + }; + forge2.aes._expandKey = function(key, decrypt) { + if (!init) { + initialize(); + } + return _expandKey(key, decrypt); + }; + forge2.aes._updateBlock = _updateBlock; + registerAlgorithm("AES-ECB", forge2.cipher.modes.ecb); + registerAlgorithm("AES-CBC", forge2.cipher.modes.cbc); + registerAlgorithm("AES-CFB", forge2.cipher.modes.cfb); + registerAlgorithm("AES-OFB", forge2.cipher.modes.ofb); + registerAlgorithm("AES-CTR", forge2.cipher.modes.ctr); + registerAlgorithm("AES-GCM", forge2.cipher.modes.gcm); + function registerAlgorithm(name, mode) { + var factory = function() { + return new forge2.aes.Algorithm(name, mode); + }; + forge2.cipher.registerAlgorithm(name, factory); + } + var init = false; + var Nb = 4; + var sbox; + var isbox; + var rcon; + var mix; + var imix; + function initialize() { + init = true; + rcon = [0, 1, 2, 4, 8, 16, 32, 64, 128, 27, 54]; + var xtime = new Array(256); + for (var i = 0; i < 128; ++i) { + xtime[i] = i << 1; + xtime[i + 128] = i + 128 << 1 ^ 283; + } + sbox = new Array(256); + isbox = new Array(256); + mix = new Array(4); + imix = new Array(4); + for (var i = 0; i < 4; ++i) { + mix[i] = new Array(256); + imix[i] = new Array(256); + } + var e = 0, ei = 0, e2, e4, e8, sx, sx2, me, ime; + for (var i = 0; i < 256; ++i) { + sx = ei ^ ei << 1 ^ ei << 2 ^ ei << 3 ^ ei << 4; + sx = sx >> 8 ^ sx & 255 ^ 99; + sbox[e] = sx; + isbox[sx] = e; + sx2 = xtime[sx]; + e2 = xtime[e]; + e4 = xtime[e2]; + e8 = xtime[e4]; + me = sx2 << 24 ^ // 2 + sx << 16 ^ // 1 + sx << 8 ^ // 1 + (sx ^ sx2); + ime = (e2 ^ e4 ^ e8) << 24 ^ // E (14) + (e ^ e8) << 16 ^ // 9 + (e ^ e4 ^ e8) << 8 ^ // D (13) + (e ^ e2 ^ e8); + for (var n = 0; n < 4; ++n) { + mix[n][e] = me; + imix[n][sx] = ime; + me = me << 24 | me >>> 8; + ime = ime << 24 | ime >>> 8; + } + if (e === 0) { + e = ei = 1; + } else { + e = e2 ^ xtime[xtime[xtime[e2 ^ e8]]]; + ei ^= xtime[xtime[ei]]; + } + } + } + function _expandKey(key, decrypt) { + var w = key.slice(0); + var temp, iNk = 1; + var Nk = w.length; + var Nr1 = Nk + 6 + 1; + var end = Nb * Nr1; + for (var i = Nk; i < end; ++i) { + temp = w[i - 1]; + if (i % Nk === 0) { + temp = sbox[temp >>> 16 & 255] << 24 ^ sbox[temp >>> 8 & 255] << 16 ^ sbox[temp & 255] << 8 ^ sbox[temp >>> 24] ^ rcon[iNk] << 24; + iNk++; + } else if (Nk > 6 && i % Nk === 4) { + temp = sbox[temp >>> 24] << 24 ^ sbox[temp >>> 16 & 255] << 16 ^ sbox[temp >>> 8 & 255] << 8 ^ sbox[temp & 255]; + } + w[i] = w[i - Nk] ^ temp; + } + if (decrypt) { + var tmp; + var m0 = imix[0]; + var m1 = imix[1]; + var m2 = imix[2]; + var m3 = imix[3]; + var wnew = w.slice(0); + end = w.length; + for (var i = 0, wi = end - Nb; i < end; i += Nb, wi -= Nb) { + if (i === 0 || i === end - Nb) { + wnew[i] = w[wi]; + wnew[i + 1] = w[wi + 3]; + wnew[i + 2] = w[wi + 2]; + wnew[i + 3] = w[wi + 1]; + } else { + for (var n = 0; n < Nb; ++n) { + tmp = w[wi + n]; + wnew[i + (3 & -n)] = m0[sbox[tmp >>> 24]] ^ m1[sbox[tmp >>> 16 & 255]] ^ m2[sbox[tmp >>> 8 & 255]] ^ m3[sbox[tmp & 255]]; + } + } + } + w = wnew; + } + return w; + } + function _updateBlock(w, input, output, decrypt) { + var Nr = w.length / 4 - 1; + var m0, m1, m2, m3, sub; + if (decrypt) { + m0 = imix[0]; + m1 = imix[1]; + m2 = imix[2]; + m3 = imix[3]; + sub = isbox; + } else { + m0 = mix[0]; + m1 = mix[1]; + m2 = mix[2]; + m3 = mix[3]; + sub = sbox; + } + var a, b, c, d, a2, b2, c2; + a = input[0] ^ w[0]; + b = input[decrypt ? 3 : 1] ^ w[1]; + c = input[2] ^ w[2]; + d = input[decrypt ? 1 : 3] ^ w[3]; + var i = 3; + for (var round = 1; round < Nr; ++round) { + a2 = m0[a >>> 24] ^ m1[b >>> 16 & 255] ^ m2[c >>> 8 & 255] ^ m3[d & 255] ^ w[++i]; + b2 = m0[b >>> 24] ^ m1[c >>> 16 & 255] ^ m2[d >>> 8 & 255] ^ m3[a & 255] ^ w[++i]; + c2 = m0[c >>> 24] ^ m1[d >>> 16 & 255] ^ m2[a >>> 8 & 255] ^ m3[b & 255] ^ w[++i]; + d = m0[d >>> 24] ^ m1[a >>> 16 & 255] ^ m2[b >>> 8 & 255] ^ m3[c & 255] ^ w[++i]; + a = a2; + b = b2; + c = c2; + } + output[0] = sub[a >>> 24] << 24 ^ sub[b >>> 16 & 255] << 16 ^ sub[c >>> 8 & 255] << 8 ^ sub[d & 255] ^ w[++i]; + output[decrypt ? 3 : 1] = sub[b >>> 24] << 24 ^ sub[c >>> 16 & 255] << 16 ^ sub[d >>> 8 & 255] << 8 ^ sub[a & 255] ^ w[++i]; + output[2] = sub[c >>> 24] << 24 ^ sub[d >>> 16 & 255] << 16 ^ sub[a >>> 8 & 255] << 8 ^ sub[b & 255] ^ w[++i]; + output[decrypt ? 1 : 3] = sub[d >>> 24] << 24 ^ sub[a >>> 16 & 255] << 16 ^ sub[b >>> 8 & 255] << 8 ^ sub[c & 255] ^ w[++i]; + } + function _createCipher(options) { + options = options || {}; + var mode = (options.mode || "CBC").toUpperCase(); + var algorithm = "AES-" + mode; + var cipher; + if (options.decrypt) { + cipher = forge2.cipher.createDecipher(algorithm, options.key); + } else { + cipher = forge2.cipher.createCipher(algorithm, options.key); + } + var start = cipher.start; + cipher.start = function(iv, options2) { + var output = null; + if (options2 instanceof forge2.util.ByteBuffer) { + output = options2; + options2 = {}; + } + options2 = options2 || {}; + options2.output = output; + options2.iv = iv; + start.call(cipher, options2); + }; + return cipher; + } + } +}); + +// node_modules/node-forge/lib/oids.js +var require_oids = __commonJS({ + "node_modules/node-forge/lib/oids.js"(exports, module) { + var forge2 = require_forge(); + forge2.pki = forge2.pki || {}; + var oids = module.exports = forge2.pki.oids = forge2.oids = forge2.oids || {}; + function _IN(id, name) { + oids[id] = name; + oids[name] = id; + } + function _I_(id, name) { + oids[id] = name; + } + _IN("1.2.840.113549.1.1.1", "rsaEncryption"); + _IN("1.2.840.113549.1.1.4", "md5WithRSAEncryption"); + _IN("1.2.840.113549.1.1.5", "sha1WithRSAEncryption"); + _IN("1.2.840.113549.1.1.7", "RSAES-OAEP"); + _IN("1.2.840.113549.1.1.8", "mgf1"); + _IN("1.2.840.113549.1.1.9", "pSpecified"); + _IN("1.2.840.113549.1.1.10", "RSASSA-PSS"); + _IN("1.2.840.113549.1.1.11", "sha256WithRSAEncryption"); + _IN("1.2.840.113549.1.1.12", "sha384WithRSAEncryption"); + _IN("1.2.840.113549.1.1.13", "sha512WithRSAEncryption"); + _IN("1.3.101.112", "EdDSA25519"); + _IN("1.2.840.10040.4.3", "dsa-with-sha1"); + _IN("1.3.14.3.2.7", "desCBC"); + _IN("1.3.14.3.2.26", "sha1"); + _IN("1.3.14.3.2.29", "sha1WithRSASignature"); + _IN("2.16.840.1.101.3.4.2.1", "sha256"); + _IN("2.16.840.1.101.3.4.2.2", "sha384"); + _IN("2.16.840.1.101.3.4.2.3", "sha512"); + _IN("2.16.840.1.101.3.4.2.4", "sha224"); + _IN("2.16.840.1.101.3.4.2.5", "sha512-224"); + _IN("2.16.840.1.101.3.4.2.6", "sha512-256"); + _IN("1.2.840.113549.2.2", "md2"); + _IN("1.2.840.113549.2.5", "md5"); + _IN("1.2.840.113549.1.7.1", "data"); + _IN("1.2.840.113549.1.7.2", "signedData"); + _IN("1.2.840.113549.1.7.3", "envelopedData"); + _IN("1.2.840.113549.1.7.4", "signedAndEnvelopedData"); + _IN("1.2.840.113549.1.7.5", "digestedData"); + _IN("1.2.840.113549.1.7.6", "encryptedData"); + _IN("1.2.840.113549.1.9.1", "emailAddress"); + _IN("1.2.840.113549.1.9.2", "unstructuredName"); + _IN("1.2.840.113549.1.9.3", "contentType"); + _IN("1.2.840.113549.1.9.4", "messageDigest"); + _IN("1.2.840.113549.1.9.5", "signingTime"); + _IN("1.2.840.113549.1.9.6", "counterSignature"); + _IN("1.2.840.113549.1.9.7", "challengePassword"); + _IN("1.2.840.113549.1.9.8", "unstructuredAddress"); + _IN("1.2.840.113549.1.9.14", "extensionRequest"); + _IN("1.2.840.113549.1.9.20", "friendlyName"); + _IN("1.2.840.113549.1.9.21", "localKeyId"); + _IN("1.2.840.113549.1.9.22.1", "x509Certificate"); + _IN("1.2.840.113549.1.12.10.1.1", "keyBag"); + _IN("1.2.840.113549.1.12.10.1.2", "pkcs8ShroudedKeyBag"); + _IN("1.2.840.113549.1.12.10.1.3", "certBag"); + _IN("1.2.840.113549.1.12.10.1.4", "crlBag"); + _IN("1.2.840.113549.1.12.10.1.5", "secretBag"); + _IN("1.2.840.113549.1.12.10.1.6", "safeContentsBag"); + _IN("1.2.840.113549.1.5.13", "pkcs5PBES2"); + _IN("1.2.840.113549.1.5.12", "pkcs5PBKDF2"); + _IN("1.2.840.113549.1.12.1.1", "pbeWithSHAAnd128BitRC4"); + _IN("1.2.840.113549.1.12.1.2", "pbeWithSHAAnd40BitRC4"); + _IN("1.2.840.113549.1.12.1.3", "pbeWithSHAAnd3-KeyTripleDES-CBC"); + _IN("1.2.840.113549.1.12.1.4", "pbeWithSHAAnd2-KeyTripleDES-CBC"); + _IN("1.2.840.113549.1.12.1.5", "pbeWithSHAAnd128BitRC2-CBC"); + _IN("1.2.840.113549.1.12.1.6", "pbewithSHAAnd40BitRC2-CBC"); + _IN("1.2.840.113549.2.7", "hmacWithSHA1"); + _IN("1.2.840.113549.2.8", "hmacWithSHA224"); + _IN("1.2.840.113549.2.9", "hmacWithSHA256"); + _IN("1.2.840.113549.2.10", "hmacWithSHA384"); + _IN("1.2.840.113549.2.11", "hmacWithSHA512"); + _IN("1.2.840.113549.3.7", "des-EDE3-CBC"); + _IN("2.16.840.1.101.3.4.1.2", "aes128-CBC"); + _IN("2.16.840.1.101.3.4.1.22", "aes192-CBC"); + _IN("2.16.840.1.101.3.4.1.42", "aes256-CBC"); + _IN("2.5.4.3", "commonName"); + _IN("2.5.4.4", "surname"); + _IN("2.5.4.5", "serialNumber"); + _IN("2.5.4.6", "countryName"); + _IN("2.5.4.7", "localityName"); + _IN("2.5.4.8", "stateOrProvinceName"); + _IN("2.5.4.9", "streetAddress"); + _IN("2.5.4.10", "organizationName"); + _IN("2.5.4.11", "organizationalUnitName"); + _IN("2.5.4.12", "title"); + _IN("2.5.4.13", "description"); + _IN("2.5.4.15", "businessCategory"); + _IN("2.5.4.17", "postalCode"); + _IN("2.5.4.42", "givenName"); + _IN("1.3.6.1.4.1.311.60.2.1.2", "jurisdictionOfIncorporationStateOrProvinceName"); + _IN("1.3.6.1.4.1.311.60.2.1.3", "jurisdictionOfIncorporationCountryName"); + _IN("2.16.840.1.113730.1.1", "nsCertType"); + _IN("2.16.840.1.113730.1.13", "nsComment"); + _I_("2.5.29.1", "authorityKeyIdentifier"); + _I_("2.5.29.2", "keyAttributes"); + _I_("2.5.29.3", "certificatePolicies"); + _I_("2.5.29.4", "keyUsageRestriction"); + _I_("2.5.29.5", "policyMapping"); + _I_("2.5.29.6", "subtreesConstraint"); + _I_("2.5.29.7", "subjectAltName"); + _I_("2.5.29.8", "issuerAltName"); + _I_("2.5.29.9", "subjectDirectoryAttributes"); + _I_("2.5.29.10", "basicConstraints"); + _I_("2.5.29.11", "nameConstraints"); + _I_("2.5.29.12", "policyConstraints"); + _I_("2.5.29.13", "basicConstraints"); + _IN("2.5.29.14", "subjectKeyIdentifier"); + _IN("2.5.29.15", "keyUsage"); + _I_("2.5.29.16", "privateKeyUsagePeriod"); + _IN("2.5.29.17", "subjectAltName"); + _IN("2.5.29.18", "issuerAltName"); + _IN("2.5.29.19", "basicConstraints"); + _I_("2.5.29.20", "cRLNumber"); + _I_("2.5.29.21", "cRLReason"); + _I_("2.5.29.22", "expirationDate"); + _I_("2.5.29.23", "instructionCode"); + _I_("2.5.29.24", "invalidityDate"); + _I_("2.5.29.25", "cRLDistributionPoints"); + _I_("2.5.29.26", "issuingDistributionPoint"); + _I_("2.5.29.27", "deltaCRLIndicator"); + _I_("2.5.29.28", "issuingDistributionPoint"); + _I_("2.5.29.29", "certificateIssuer"); + _I_("2.5.29.30", "nameConstraints"); + _IN("2.5.29.31", "cRLDistributionPoints"); + _IN("2.5.29.32", "certificatePolicies"); + _I_("2.5.29.33", "policyMappings"); + _I_("2.5.29.34", "policyConstraints"); + _IN("2.5.29.35", "authorityKeyIdentifier"); + _I_("2.5.29.36", "policyConstraints"); + _IN("2.5.29.37", "extKeyUsage"); + _I_("2.5.29.46", "freshestCRL"); + _I_("2.5.29.54", "inhibitAnyPolicy"); + _IN("1.3.6.1.4.1.11129.2.4.2", "timestampList"); + _IN("1.3.6.1.5.5.7.1.1", "authorityInfoAccess"); + _IN("1.3.6.1.5.5.7.3.1", "serverAuth"); + _IN("1.3.6.1.5.5.7.3.2", "clientAuth"); + _IN("1.3.6.1.5.5.7.3.3", "codeSigning"); + _IN("1.3.6.1.5.5.7.3.4", "emailProtection"); + _IN("1.3.6.1.5.5.7.3.8", "timeStamping"); + } +}); + +// node_modules/node-forge/lib/asn1.js +var require_asn1 = __commonJS({ + "node_modules/node-forge/lib/asn1.js"(exports, module) { + var forge2 = require_forge(); + require_util(); + require_oids(); + var asn1 = module.exports = forge2.asn1 = forge2.asn1 || {}; + asn1.Class = { + UNIVERSAL: 0, + APPLICATION: 64, + CONTEXT_SPECIFIC: 128, + PRIVATE: 192 + }; + asn1.Type = { + NONE: 0, + BOOLEAN: 1, + INTEGER: 2, + BITSTRING: 3, + OCTETSTRING: 4, + NULL: 5, + OID: 6, + ODESC: 7, + EXTERNAL: 8, + REAL: 9, + ENUMERATED: 10, + EMBEDDED: 11, + UTF8: 12, + ROID: 13, + SEQUENCE: 16, + SET: 17, + PRINTABLESTRING: 19, + IA5STRING: 22, + UTCTIME: 23, + GENERALIZEDTIME: 24, + BMPSTRING: 30 + }; + asn1.create = function(tagClass, type, constructed, value, options) { + if (forge2.util.isArray(value)) { + var tmp = []; + for (var i = 0; i < value.length; ++i) { + if (value[i] !== void 0) { + tmp.push(value[i]); + } + } + value = tmp; + } + var obj = { + tagClass, + type, + constructed, + composed: constructed || forge2.util.isArray(value), + value + }; + if (options && "bitStringContents" in options) { + obj.bitStringContents = options.bitStringContents; + obj.original = asn1.copy(obj); + } + return obj; + }; + asn1.copy = function(obj, options) { + var copy; + if (forge2.util.isArray(obj)) { + copy = []; + for (var i = 0; i < obj.length; ++i) { + copy.push(asn1.copy(obj[i], options)); + } + return copy; + } + if (typeof obj === "string") { + return obj; + } + copy = { + tagClass: obj.tagClass, + type: obj.type, + constructed: obj.constructed, + composed: obj.composed, + value: asn1.copy(obj.value, options) + }; + if (options && !options.excludeBitStringContents) { + copy.bitStringContents = obj.bitStringContents; + } + return copy; + }; + asn1.equals = function(obj1, obj2, options) { + if (forge2.util.isArray(obj1)) { + if (!forge2.util.isArray(obj2)) { + return false; + } + if (obj1.length !== obj2.length) { + return false; + } + for (var i = 0; i < obj1.length; ++i) { + if (!asn1.equals(obj1[i], obj2[i])) { + return false; + } + } + return true; + } + if (typeof obj1 !== typeof obj2) { + return false; + } + if (typeof obj1 === "string") { + return obj1 === obj2; + } + var equal = obj1.tagClass === obj2.tagClass && obj1.type === obj2.type && obj1.constructed === obj2.constructed && obj1.composed === obj2.composed && asn1.equals(obj1.value, obj2.value); + if (options && options.includeBitStringContents) { + equal = equal && obj1.bitStringContents === obj2.bitStringContents; + } + return equal; + }; + asn1.getBerValueLength = function(b) { + var b2 = b.getByte(); + if (b2 === 128) { + return void 0; + } + var length; + var longForm = b2 & 128; + if (!longForm) { + length = b2; + } else { + length = b.getInt((b2 & 127) << 3); + } + return length; + }; + function _checkBufferLength(bytes, remaining, n) { + if (n > remaining) { + var error = new Error("Too few bytes to parse DER."); + error.available = bytes.length(); + error.remaining = remaining; + error.requested = n; + throw error; + } + } + var _getValueLength = function(bytes, remaining) { + var b2 = bytes.getByte(); + remaining--; + if (b2 === 128) { + return void 0; + } + var length; + var longForm = b2 & 128; + if (!longForm) { + length = b2; + } else { + var longFormBytes = b2 & 127; + _checkBufferLength(bytes, remaining, longFormBytes); + length = bytes.getInt(longFormBytes << 3); + } + if (length < 0) { + throw new Error("Negative length: " + length); + } + return length; + }; + asn1.fromDer = function(bytes, options) { + if (options === void 0) { + options = { + strict: true, + parseAllBytes: true, + decodeBitStrings: true + }; + } + if (typeof options === "boolean") { + options = { + strict: options, + parseAllBytes: true, + decodeBitStrings: true + }; + } + if (!("strict" in options)) { + options.strict = true; + } + if (!("parseAllBytes" in options)) { + options.parseAllBytes = true; + } + if (!("decodeBitStrings" in options)) { + options.decodeBitStrings = true; + } + if (typeof bytes === "string") { + bytes = forge2.util.createBuffer(bytes); + } + var byteCount = bytes.length(); + var value = _fromDer(bytes, bytes.length(), 0, options); + if (options.parseAllBytes && bytes.length() !== 0) { + var error = new Error("Unparsed DER bytes remain after ASN.1 parsing."); + error.byteCount = byteCount; + error.remaining = bytes.length(); + throw error; + } + return value; + }; + function _fromDer(bytes, remaining, depth, options) { + var start; + _checkBufferLength(bytes, remaining, 2); + var b1 = bytes.getByte(); + remaining--; + var tagClass = b1 & 192; + var type = b1 & 31; + start = bytes.length(); + var length = _getValueLength(bytes, remaining); + remaining -= start - bytes.length(); + if (length !== void 0 && length > remaining) { + if (options.strict) { + var error = new Error("Too few bytes to read ASN.1 value."); + error.available = bytes.length(); + error.remaining = remaining; + error.requested = length; + throw error; + } + length = remaining; + } + var value; + var bitStringContents; + var constructed = (b1 & 32) === 32; + if (constructed) { + value = []; + if (length === void 0) { + for (; ; ) { + _checkBufferLength(bytes, remaining, 2); + if (bytes.bytes(2) === String.fromCharCode(0, 0)) { + bytes.getBytes(2); + remaining -= 2; + break; + } + start = bytes.length(); + value.push(_fromDer(bytes, remaining, depth + 1, options)); + remaining -= start - bytes.length(); + } + } else { + while (length > 0) { + start = bytes.length(); + value.push(_fromDer(bytes, length, depth + 1, options)); + remaining -= start - bytes.length(); + length -= start - bytes.length(); + } + } + } + if (value === void 0 && tagClass === asn1.Class.UNIVERSAL && type === asn1.Type.BITSTRING) { + bitStringContents = bytes.bytes(length); + } + if (value === void 0 && options.decodeBitStrings && tagClass === asn1.Class.UNIVERSAL && // FIXME: OCTET STRINGs not yet supported here + // .. other parts of forge expect to decode OCTET STRINGs manually + type === asn1.Type.BITSTRING && length > 1) { + var savedRead = bytes.read; + var savedRemaining = remaining; + var unused = 0; + if (type === asn1.Type.BITSTRING) { + _checkBufferLength(bytes, remaining, 1); + unused = bytes.getByte(); + remaining--; + } + if (unused === 0) { + try { + start = bytes.length(); + var subOptions = { + // enforce strict mode to avoid parsing ASN.1 from plain data + strict: true, + decodeBitStrings: true + }; + var composed = _fromDer(bytes, remaining, depth + 1, subOptions); + var used = start - bytes.length(); + remaining -= used; + if (type == asn1.Type.BITSTRING) { + used++; + } + var tc = composed.tagClass; + if (used === length && (tc === asn1.Class.UNIVERSAL || tc === asn1.Class.CONTEXT_SPECIFIC)) { + value = [composed]; + } + } catch (ex) { + } + } + if (value === void 0) { + bytes.read = savedRead; + remaining = savedRemaining; + } + } + if (value === void 0) { + if (length === void 0) { + if (options.strict) { + throw new Error("Non-constructed ASN.1 object of indefinite length."); + } + length = remaining; + } + if (type === asn1.Type.BMPSTRING) { + value = ""; + for (; length > 0; length -= 2) { + _checkBufferLength(bytes, remaining, 2); + value += String.fromCharCode(bytes.getInt16()); + remaining -= 2; + } + } else { + value = bytes.getBytes(length); + remaining -= length; + } + } + var asn1Options = bitStringContents === void 0 ? null : { + bitStringContents + }; + return asn1.create(tagClass, type, constructed, value, asn1Options); + } + asn1.toDer = function(obj) { + var bytes = forge2.util.createBuffer(); + var b1 = obj.tagClass | obj.type; + var value = forge2.util.createBuffer(); + var useBitStringContents = false; + if ("bitStringContents" in obj) { + useBitStringContents = true; + if (obj.original) { + useBitStringContents = asn1.equals(obj, obj.original); + } + } + if (useBitStringContents) { + value.putBytes(obj.bitStringContents); + } else if (obj.composed) { + if (obj.constructed) { + b1 |= 32; + } else { + value.putByte(0); + } + for (var i = 0; i < obj.value.length; ++i) { + if (obj.value[i] !== void 0) { + value.putBuffer(asn1.toDer(obj.value[i])); + } + } + } else { + if (obj.type === asn1.Type.BMPSTRING) { + for (var i = 0; i < obj.value.length; ++i) { + value.putInt16(obj.value.charCodeAt(i)); + } + } else { + if (obj.type === asn1.Type.INTEGER && obj.value.length > 1 && // leading 0x00 for positive integer + (obj.value.charCodeAt(0) === 0 && (obj.value.charCodeAt(1) & 128) === 0 || // leading 0xFF for negative integer + obj.value.charCodeAt(0) === 255 && (obj.value.charCodeAt(1) & 128) === 128)) { + value.putBytes(obj.value.substr(1)); + } else { + value.putBytes(obj.value); + } + } + } + bytes.putByte(b1); + if (value.length() <= 127) { + bytes.putByte(value.length() & 127); + } else { + var len = value.length(); + var lenBytes = ""; + do { + lenBytes += String.fromCharCode(len & 255); + len = len >>> 8; + } while (len > 0); + bytes.putByte(lenBytes.length | 128); + for (var i = lenBytes.length - 1; i >= 0; --i) { + bytes.putByte(lenBytes.charCodeAt(i)); + } + } + bytes.putBuffer(value); + return bytes; + }; + asn1.oidToDer = function(oid) { + var values = oid.split("."); + var bytes = forge2.util.createBuffer(); + bytes.putByte(40 * parseInt(values[0], 10) + parseInt(values[1], 10)); + var last, valueBytes, value, b; + for (var i = 2; i < values.length; ++i) { + last = true; + valueBytes = []; + value = parseInt(values[i], 10); + do { + b = value & 127; + value = value >>> 7; + if (!last) { + b |= 128; + } + valueBytes.push(b); + last = false; + } while (value > 0); + for (var n = valueBytes.length - 1; n >= 0; --n) { + bytes.putByte(valueBytes[n]); + } + } + return bytes; + }; + asn1.derToOid = function(bytes) { + var oid; + if (typeof bytes === "string") { + bytes = forge2.util.createBuffer(bytes); + } + var b = bytes.getByte(); + oid = Math.floor(b / 40) + "." + b % 40; + var value = 0; + while (bytes.length() > 0) { + b = bytes.getByte(); + value = value << 7; + if (b & 128) { + value += b & 127; + } else { + oid += "." + (value + b); + value = 0; + } + } + return oid; + }; + asn1.utcTimeToDate = function(utc) { + var date = /* @__PURE__ */ new Date(); + var year = parseInt(utc.substr(0, 2), 10); + year = year >= 50 ? 1900 + year : 2e3 + year; + var MM = parseInt(utc.substr(2, 2), 10) - 1; + var DD = parseInt(utc.substr(4, 2), 10); + var hh = parseInt(utc.substr(6, 2), 10); + var mm = parseInt(utc.substr(8, 2), 10); + var ss = 0; + if (utc.length > 11) { + var c = utc.charAt(10); + var end = 10; + if (c !== "+" && c !== "-") { + ss = parseInt(utc.substr(10, 2), 10); + end += 2; + } + } + date.setUTCFullYear(year, MM, DD); + date.setUTCHours(hh, mm, ss, 0); + if (end) { + c = utc.charAt(end); + if (c === "+" || c === "-") { + var hhoffset = parseInt(utc.substr(end + 1, 2), 10); + var mmoffset = parseInt(utc.substr(end + 4, 2), 10); + var offset = hhoffset * 60 + mmoffset; + offset *= 6e4; + if (c === "+") { + date.setTime(+date - offset); + } else { + date.setTime(+date + offset); + } + } + } + return date; + }; + asn1.generalizedTimeToDate = function(gentime) { + var date = /* @__PURE__ */ new Date(); + var YYYY = parseInt(gentime.substr(0, 4), 10); + var MM = parseInt(gentime.substr(4, 2), 10) - 1; + var DD = parseInt(gentime.substr(6, 2), 10); + var hh = parseInt(gentime.substr(8, 2), 10); + var mm = parseInt(gentime.substr(10, 2), 10); + var ss = parseInt(gentime.substr(12, 2), 10); + var fff = 0; + var offset = 0; + var isUTC = false; + if (gentime.charAt(gentime.length - 1) === "Z") { + isUTC = true; + } + var end = gentime.length - 5, c = gentime.charAt(end); + if (c === "+" || c === "-") { + var hhoffset = parseInt(gentime.substr(end + 1, 2), 10); + var mmoffset = parseInt(gentime.substr(end + 4, 2), 10); + offset = hhoffset * 60 + mmoffset; + offset *= 6e4; + if (c === "+") { + offset *= -1; + } + isUTC = true; + } + if (gentime.charAt(14) === ".") { + fff = parseFloat(gentime.substr(14), 10) * 1e3; + } + if (isUTC) { + date.setUTCFullYear(YYYY, MM, DD); + date.setUTCHours(hh, mm, ss, fff); + date.setTime(+date + offset); + } else { + date.setFullYear(YYYY, MM, DD); + date.setHours(hh, mm, ss, fff); + } + return date; + }; + asn1.dateToUtcTime = function(date) { + if (typeof date === "string") { + return date; + } + var rval = ""; + var format = []; + format.push(("" + date.getUTCFullYear()).substr(2)); + format.push("" + (date.getUTCMonth() + 1)); + format.push("" + date.getUTCDate()); + format.push("" + date.getUTCHours()); + format.push("" + date.getUTCMinutes()); + format.push("" + date.getUTCSeconds()); + for (var i = 0; i < format.length; ++i) { + if (format[i].length < 2) { + rval += "0"; + } + rval += format[i]; + } + rval += "Z"; + return rval; + }; + asn1.dateToGeneralizedTime = function(date) { + if (typeof date === "string") { + return date; + } + var rval = ""; + var format = []; + format.push("" + date.getUTCFullYear()); + format.push("" + (date.getUTCMonth() + 1)); + format.push("" + date.getUTCDate()); + format.push("" + date.getUTCHours()); + format.push("" + date.getUTCMinutes()); + format.push("" + date.getUTCSeconds()); + for (var i = 0; i < format.length; ++i) { + if (format[i].length < 2) { + rval += "0"; + } + rval += format[i]; + } + rval += "Z"; + return rval; + }; + asn1.integerToDer = function(x) { + var rval = forge2.util.createBuffer(); + if (x >= -128 && x < 128) { + return rval.putSignedInt(x, 8); + } + if (x >= -32768 && x < 32768) { + return rval.putSignedInt(x, 16); + } + if (x >= -8388608 && x < 8388608) { + return rval.putSignedInt(x, 24); + } + if (x >= -2147483648 && x < 2147483648) { + return rval.putSignedInt(x, 32); + } + var error = new Error("Integer too large; max is 32-bits."); + error.integer = x; + throw error; + }; + asn1.derToInteger = function(bytes) { + if (typeof bytes === "string") { + bytes = forge2.util.createBuffer(bytes); + } + var n = bytes.length() * 8; + if (n > 32) { + throw new Error("Integer too large; max is 32-bits."); + } + return bytes.getSignedInt(n); + }; + asn1.validate = function(obj, v, capture, errors) { + var rval = false; + if ((obj.tagClass === v.tagClass || typeof v.tagClass === "undefined") && (obj.type === v.type || typeof v.type === "undefined")) { + if (obj.constructed === v.constructed || typeof v.constructed === "undefined") { + rval = true; + if (v.value && forge2.util.isArray(v.value)) { + var j = 0; + for (var i = 0; rval && i < v.value.length; ++i) { + rval = v.value[i].optional || false; + if (obj.value[j]) { + rval = asn1.validate(obj.value[j], v.value[i], capture, errors); + if (rval) { + ++j; + } else if (v.value[i].optional) { + rval = true; + } + } + if (!rval && errors) { + errors.push( + "[" + v.name + '] Tag class "' + v.tagClass + '", type "' + v.type + '" expected value length "' + v.value.length + '", got "' + obj.value.length + '"' + ); + } + } + } + if (rval && capture) { + if (v.capture) { + capture[v.capture] = obj.value; + } + if (v.captureAsn1) { + capture[v.captureAsn1] = obj; + } + if (v.captureBitStringContents && "bitStringContents" in obj) { + capture[v.captureBitStringContents] = obj.bitStringContents; + } + if (v.captureBitStringValue && "bitStringContents" in obj) { + var value; + if (obj.bitStringContents.length < 2) { + capture[v.captureBitStringValue] = ""; + } else { + var unused = obj.bitStringContents.charCodeAt(0); + if (unused !== 0) { + throw new Error( + "captureBitStringValue only supported for zero unused bits" + ); + } + capture[v.captureBitStringValue] = obj.bitStringContents.slice(1); + } + } + } + } else if (errors) { + errors.push( + "[" + v.name + '] Expected constructed "' + v.constructed + '", got "' + obj.constructed + '"' + ); + } + } else if (errors) { + if (obj.tagClass !== v.tagClass) { + errors.push( + "[" + v.name + '] Expected tag class "' + v.tagClass + '", got "' + obj.tagClass + '"' + ); + } + if (obj.type !== v.type) { + errors.push( + "[" + v.name + '] Expected type "' + v.type + '", got "' + obj.type + '"' + ); + } + } + return rval; + }; + var _nonLatinRegex = /[^\\u0000-\\u00ff]/; + asn1.prettyPrint = function(obj, level, indentation) { + var rval = ""; + level = level || 0; + indentation = indentation || 2; + if (level > 0) { + rval += "\n"; + } + var indent = ""; + for (var i = 0; i < level * indentation; ++i) { + indent += " "; + } + rval += indent + "Tag: "; + switch (obj.tagClass) { + case asn1.Class.UNIVERSAL: + rval += "Universal:"; + break; + case asn1.Class.APPLICATION: + rval += "Application:"; + break; + case asn1.Class.CONTEXT_SPECIFIC: + rval += "Context-Specific:"; + break; + case asn1.Class.PRIVATE: + rval += "Private:"; + break; + } + if (obj.tagClass === asn1.Class.UNIVERSAL) { + rval += obj.type; + switch (obj.type) { + case asn1.Type.NONE: + rval += " (None)"; + break; + case asn1.Type.BOOLEAN: + rval += " (Boolean)"; + break; + case asn1.Type.INTEGER: + rval += " (Integer)"; + break; + case asn1.Type.BITSTRING: + rval += " (Bit string)"; + break; + case asn1.Type.OCTETSTRING: + rval += " (Octet string)"; + break; + case asn1.Type.NULL: + rval += " (Null)"; + break; + case asn1.Type.OID: + rval += " (Object Identifier)"; + break; + case asn1.Type.ODESC: + rval += " (Object Descriptor)"; + break; + case asn1.Type.EXTERNAL: + rval += " (External or Instance of)"; + break; + case asn1.Type.REAL: + rval += " (Real)"; + break; + case asn1.Type.ENUMERATED: + rval += " (Enumerated)"; + break; + case asn1.Type.EMBEDDED: + rval += " (Embedded PDV)"; + break; + case asn1.Type.UTF8: + rval += " (UTF8)"; + break; + case asn1.Type.ROID: + rval += " (Relative Object Identifier)"; + break; + case asn1.Type.SEQUENCE: + rval += " (Sequence)"; + break; + case asn1.Type.SET: + rval += " (Set)"; + break; + case asn1.Type.PRINTABLESTRING: + rval += " (Printable String)"; + break; + case asn1.Type.IA5String: + rval += " (IA5String (ASCII))"; + break; + case asn1.Type.UTCTIME: + rval += " (UTC time)"; + break; + case asn1.Type.GENERALIZEDTIME: + rval += " (Generalized time)"; + break; + case asn1.Type.BMPSTRING: + rval += " (BMP String)"; + break; + } + } else { + rval += obj.type; + } + rval += "\n"; + rval += indent + "Constructed: " + obj.constructed + "\n"; + if (obj.composed) { + var subvalues = 0; + var sub = ""; + for (var i = 0; i < obj.value.length; ++i) { + if (obj.value[i] !== void 0) { + subvalues += 1; + sub += asn1.prettyPrint(obj.value[i], level + 1, indentation); + if (i + 1 < obj.value.length) { + sub += ","; + } + } + } + rval += indent + "Sub values: " + subvalues + sub; + } else { + rval += indent + "Value: "; + if (obj.type === asn1.Type.OID) { + var oid = asn1.derToOid(obj.value); + rval += oid; + if (forge2.pki && forge2.pki.oids) { + if (oid in forge2.pki.oids) { + rval += " (" + forge2.pki.oids[oid] + ") "; + } + } + } + if (obj.type === asn1.Type.INTEGER) { + try { + rval += asn1.derToInteger(obj.value); + } catch (ex) { + rval += "0x" + forge2.util.bytesToHex(obj.value); + } + } else if (obj.type === asn1.Type.BITSTRING) { + if (obj.value.length > 1) { + rval += "0x" + forge2.util.bytesToHex(obj.value.slice(1)); + } else { + rval += "(none)"; + } + if (obj.value.length > 0) { + var unused = obj.value.charCodeAt(0); + if (unused == 1) { + rval += " (1 unused bit shown)"; + } else if (unused > 1) { + rval += " (" + unused + " unused bits shown)"; + } + } + } else if (obj.type === asn1.Type.OCTETSTRING) { + if (!_nonLatinRegex.test(obj.value)) { + rval += "(" + obj.value + ") "; + } + rval += "0x" + forge2.util.bytesToHex(obj.value); + } else if (obj.type === asn1.Type.UTF8) { + try { + rval += forge2.util.decodeUtf8(obj.value); + } catch (e) { + if (e.message === "URI malformed") { + rval += "0x" + forge2.util.bytesToHex(obj.value) + " (malformed UTF8)"; + } else { + throw e; + } + } + } else if (obj.type === asn1.Type.PRINTABLESTRING || obj.type === asn1.Type.IA5String) { + rval += obj.value; + } else if (_nonLatinRegex.test(obj.value)) { + rval += "0x" + forge2.util.bytesToHex(obj.value); + } else if (obj.value.length === 0) { + rval += "[null]"; + } else { + rval += obj.value; + } + } + return rval; + }; + } +}); + +// node_modules/node-forge/lib/md.js +var require_md = __commonJS({ + "node_modules/node-forge/lib/md.js"(exports, module) { + var forge2 = require_forge(); + module.exports = forge2.md = forge2.md || {}; + forge2.md.algorithms = forge2.md.algorithms || {}; + } +}); + +// node_modules/node-forge/lib/hmac.js +var require_hmac = __commonJS({ + "node_modules/node-forge/lib/hmac.js"(exports, module) { + var forge2 = require_forge(); + require_md(); + require_util(); + var hmac = module.exports = forge2.hmac = forge2.hmac || {}; + hmac.create = function() { + var _key = null; + var _md = null; + var _ipadding = null; + var _opadding = null; + var ctx = {}; + ctx.start = function(md, key) { + if (md !== null) { + if (typeof md === "string") { + md = md.toLowerCase(); + if (md in forge2.md.algorithms) { + _md = forge2.md.algorithms[md].create(); + } else { + throw new Error('Unknown hash algorithm "' + md + '"'); + } + } else { + _md = md; + } + } + if (key === null) { + key = _key; + } else { + if (typeof key === "string") { + key = forge2.util.createBuffer(key); + } else if (forge2.util.isArray(key)) { + var tmp = key; + key = forge2.util.createBuffer(); + for (var i = 0; i < tmp.length; ++i) { + key.putByte(tmp[i]); + } + } + var keylen = key.length(); + if (keylen > _md.blockLength) { + _md.start(); + _md.update(key.bytes()); + key = _md.digest(); + } + _ipadding = forge2.util.createBuffer(); + _opadding = forge2.util.createBuffer(); + keylen = key.length(); + for (var i = 0; i < keylen; ++i) { + var tmp = key.at(i); + _ipadding.putByte(54 ^ tmp); + _opadding.putByte(92 ^ tmp); + } + if (keylen < _md.blockLength) { + var tmp = _md.blockLength - keylen; + for (var i = 0; i < tmp; ++i) { + _ipadding.putByte(54); + _opadding.putByte(92); + } + } + _key = key; + _ipadding = _ipadding.bytes(); + _opadding = _opadding.bytes(); + } + _md.start(); + _md.update(_ipadding); + }; + ctx.update = function(bytes) { + _md.update(bytes); + }; + ctx.getMac = function() { + var inner = _md.digest().bytes(); + _md.start(); + _md.update(_opadding); + _md.update(inner); + return _md.digest(); + }; + ctx.digest = ctx.getMac; + return ctx; + }; + } +}); + +// node_modules/node-forge/lib/md5.js +var require_md5 = __commonJS({ + "node_modules/node-forge/lib/md5.js"(exports, module) { + var forge2 = require_forge(); + require_md(); + require_util(); + var md5 = module.exports = forge2.md5 = forge2.md5 || {}; + forge2.md.md5 = forge2.md.algorithms.md5 = md5; + md5.create = function() { + if (!_initialized) { + _init(); + } + var _state = null; + var _input = forge2.util.createBuffer(); + var _w = new Array(16); + var md = { + algorithm: "md5", + blockLength: 64, + digestLength: 16, + // 56-bit length of message so far (does not including padding) + messageLength: 0, + // true message length + fullMessageLength: null, + // size of message length in bytes + messageLengthSize: 8 + }; + md.start = function() { + md.messageLength = 0; + md.fullMessageLength = md.messageLength64 = []; + var int32s = md.messageLengthSize / 4; + for (var i = 0; i < int32s; ++i) { + md.fullMessageLength.push(0); + } + _input = forge2.util.createBuffer(); + _state = { + h0: 1732584193, + h1: 4023233417, + h2: 2562383102, + h3: 271733878 + }; + return md; + }; + md.start(); + md.update = function(msg, encoding) { + if (encoding === "utf8") { + msg = forge2.util.encodeUtf8(msg); + } + var len = msg.length; + md.messageLength += len; + len = [len / 4294967296 >>> 0, len >>> 0]; + for (var i = md.fullMessageLength.length - 1; i >= 0; --i) { + md.fullMessageLength[i] += len[1]; + len[1] = len[0] + (md.fullMessageLength[i] / 4294967296 >>> 0); + md.fullMessageLength[i] = md.fullMessageLength[i] >>> 0; + len[0] = len[1] / 4294967296 >>> 0; + } + _input.putBytes(msg); + _update(_state, _w, _input); + if (_input.read > 2048 || _input.length() === 0) { + _input.compact(); + } + return md; + }; + md.digest = function() { + var finalBlock = forge2.util.createBuffer(); + finalBlock.putBytes(_input.bytes()); + var remaining = md.fullMessageLength[md.fullMessageLength.length - 1] + md.messageLengthSize; + var overflow = remaining & md.blockLength - 1; + finalBlock.putBytes(_padding.substr(0, md.blockLength - overflow)); + var bits, carry = 0; + for (var i = md.fullMessageLength.length - 1; i >= 0; --i) { + bits = md.fullMessageLength[i] * 8 + carry; + carry = bits / 4294967296 >>> 0; + finalBlock.putInt32Le(bits >>> 0); + } + var s2 = { + h0: _state.h0, + h1: _state.h1, + h2: _state.h2, + h3: _state.h3 + }; + _update(s2, _w, finalBlock); + var rval = forge2.util.createBuffer(); + rval.putInt32Le(s2.h0); + rval.putInt32Le(s2.h1); + rval.putInt32Le(s2.h2); + rval.putInt32Le(s2.h3); + return rval; + }; + return md; + }; + var _padding = null; + var _g = null; + var _r = null; + var _k = null; + var _initialized = false; + function _init() { + _padding = String.fromCharCode(128); + _padding += forge2.util.fillString(String.fromCharCode(0), 64); + _g = [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 1, + 6, + 11, + 0, + 5, + 10, + 15, + 4, + 9, + 14, + 3, + 8, + 13, + 2, + 7, + 12, + 5, + 8, + 11, + 14, + 1, + 4, + 7, + 10, + 13, + 0, + 3, + 6, + 9, + 12, + 15, + 2, + 0, + 7, + 14, + 5, + 12, + 3, + 10, + 1, + 8, + 15, + 6, + 13, + 4, + 11, + 2, + 9 + ]; + _r = [ + 7, + 12, + 17, + 22, + 7, + 12, + 17, + 22, + 7, + 12, + 17, + 22, + 7, + 12, + 17, + 22, + 5, + 9, + 14, + 20, + 5, + 9, + 14, + 20, + 5, + 9, + 14, + 20, + 5, + 9, + 14, + 20, + 4, + 11, + 16, + 23, + 4, + 11, + 16, + 23, + 4, + 11, + 16, + 23, + 4, + 11, + 16, + 23, + 6, + 10, + 15, + 21, + 6, + 10, + 15, + 21, + 6, + 10, + 15, + 21, + 6, + 10, + 15, + 21 + ]; + _k = new Array(64); + for (var i = 0; i < 64; ++i) { + _k[i] = Math.floor(Math.abs(Math.sin(i + 1)) * 4294967296); + } + _initialized = true; + } + function _update(s, w, bytes) { + var t, a, b, c, d, f, r, i; + var len = bytes.length(); + while (len >= 64) { + a = s.h0; + b = s.h1; + c = s.h2; + d = s.h3; + for (i = 0; i < 16; ++i) { + w[i] = bytes.getInt32Le(); + f = d ^ b & (c ^ d); + t = a + f + _k[i] + w[i]; + r = _r[i]; + a = d; + d = c; + c = b; + b += t << r | t >>> 32 - r; + } + for (; i < 32; ++i) { + f = c ^ d & (b ^ c); + t = a + f + _k[i] + w[_g[i]]; + r = _r[i]; + a = d; + d = c; + c = b; + b += t << r | t >>> 32 - r; + } + for (; i < 48; ++i) { + f = b ^ c ^ d; + t = a + f + _k[i] + w[_g[i]]; + r = _r[i]; + a = d; + d = c; + c = b; + b += t << r | t >>> 32 - r; + } + for (; i < 64; ++i) { + f = c ^ (b | ~d); + t = a + f + _k[i] + w[_g[i]]; + r = _r[i]; + a = d; + d = c; + c = b; + b += t << r | t >>> 32 - r; + } + s.h0 = s.h0 + a | 0; + s.h1 = s.h1 + b | 0; + s.h2 = s.h2 + c | 0; + s.h3 = s.h3 + d | 0; + len -= 64; + } + } + } +}); + +// node_modules/node-forge/lib/pem.js +var require_pem = __commonJS({ + "node_modules/node-forge/lib/pem.js"(exports, module) { + var forge2 = require_forge(); + require_util(); + var pem = module.exports = forge2.pem = forge2.pem || {}; + pem.encode = function(msg, options) { + options = options || {}; + var rval = "-----BEGIN " + msg.type + "-----\r\n"; + var header; + if (msg.procType) { + header = { + name: "Proc-Type", + values: [String(msg.procType.version), msg.procType.type] + }; + rval += foldHeader(header); + } + if (msg.contentDomain) { + header = { name: "Content-Domain", values: [msg.contentDomain] }; + rval += foldHeader(header); + } + if (msg.dekInfo) { + header = { name: "DEK-Info", values: [msg.dekInfo.algorithm] }; + if (msg.dekInfo.parameters) { + header.values.push(msg.dekInfo.parameters); + } + rval += foldHeader(header); + } + if (msg.headers) { + for (var i = 0; i < msg.headers.length; ++i) { + rval += foldHeader(msg.headers[i]); + } + } + if (msg.procType) { + rval += "\r\n"; + } + rval += forge2.util.encode64(msg.body, options.maxline || 64) + "\r\n"; + rval += "-----END " + msg.type + "-----\r\n"; + return rval; + }; + pem.decode = function(str) { + var rval = []; + var rMessage = /\s*-----BEGIN ([A-Z0-9- ]+)-----\r?\n?([\x21-\x7e\s]+?(?:\r?\n\r?\n))?([:A-Za-z0-9+\/=\s]+?)-----END \1-----/g; + var rHeader = /([\x21-\x7e]+):\s*([\x21-\x7e\s^:]+)/; + var rCRLF = /\r?\n/; + var match; + while (true) { + match = rMessage.exec(str); + if (!match) { + break; + } + var type = match[1]; + if (type === "NEW CERTIFICATE REQUEST") { + type = "CERTIFICATE REQUEST"; + } + var msg = { + type, + procType: null, + contentDomain: null, + dekInfo: null, + headers: [], + body: forge2.util.decode64(match[3]) + }; + rval.push(msg); + if (!match[2]) { + continue; + } + var lines = match[2].split(rCRLF); + var li = 0; + while (match && li < lines.length) { + var line = lines[li].replace(/\s+$/, ""); + for (var nl = li + 1; nl < lines.length; ++nl) { + var next = lines[nl]; + if (!/\s/.test(next[0])) { + break; + } + line += next; + li = nl; + } + match = line.match(rHeader); + if (match) { + var header = { name: match[1], values: [] }; + var values = match[2].split(","); + for (var vi = 0; vi < values.length; ++vi) { + header.values.push(ltrim(values[vi])); + } + if (!msg.procType) { + if (header.name !== "Proc-Type") { + throw new Error('Invalid PEM formatted message. The first encapsulated header must be "Proc-Type".'); + } else if (header.values.length !== 2) { + throw new Error('Invalid PEM formatted message. The "Proc-Type" header must have two subfields.'); + } + msg.procType = { version: values[0], type: values[1] }; + } else if (!msg.contentDomain && header.name === "Content-Domain") { + msg.contentDomain = values[0] || ""; + } else if (!msg.dekInfo && header.name === "DEK-Info") { + if (header.values.length === 0) { + throw new Error('Invalid PEM formatted message. The "DEK-Info" header must have at least one subfield.'); + } + msg.dekInfo = { algorithm: values[0], parameters: values[1] || null }; + } else { + msg.headers.push(header); + } + } + ++li; + } + if (msg.procType === "ENCRYPTED" && !msg.dekInfo) { + throw new Error('Invalid PEM formatted message. The "DEK-Info" header must be present if "Proc-Type" is "ENCRYPTED".'); + } + } + if (rval.length === 0) { + throw new Error("Invalid PEM formatted message."); + } + return rval; + }; + function foldHeader(header) { + var rval = header.name + ": "; + var values = []; + var insertSpace = function(match, $1) { + return " " + $1; + }; + for (var i = 0; i < header.values.length; ++i) { + values.push(header.values[i].replace(/^(\S+\r\n)/, insertSpace)); + } + rval += values.join(",") + "\r\n"; + var length = 0; + var candidate = -1; + for (var i = 0; i < rval.length; ++i, ++length) { + if (length > 65 && candidate !== -1) { + var insert = rval[candidate]; + if (insert === ",") { + ++candidate; + rval = rval.substr(0, candidate) + "\r\n " + rval.substr(candidate); + } else { + rval = rval.substr(0, candidate) + "\r\n" + insert + rval.substr(candidate + 1); + } + length = i - candidate - 1; + candidate = -1; + ++i; + } else if (rval[i] === " " || rval[i] === " " || rval[i] === ",") { + candidate = i; + } + } + return rval; + } + function ltrim(str) { + return str.replace(/^\s+/, ""); + } + } +}); + +// node_modules/node-forge/lib/des.js +var require_des = __commonJS({ + "node_modules/node-forge/lib/des.js"(exports, module) { + var forge2 = require_forge(); + require_cipher(); + require_cipherModes(); + require_util(); + module.exports = forge2.des = forge2.des || {}; + forge2.des.startEncrypting = function(key, iv, output, mode) { + var cipher = _createCipher({ + key, + output, + decrypt: false, + mode: mode || (iv === null ? "ECB" : "CBC") + }); + cipher.start(iv); + return cipher; + }; + forge2.des.createEncryptionCipher = function(key, mode) { + return _createCipher({ + key, + output: null, + decrypt: false, + mode + }); + }; + forge2.des.startDecrypting = function(key, iv, output, mode) { + var cipher = _createCipher({ + key, + output, + decrypt: true, + mode: mode || (iv === null ? "ECB" : "CBC") + }); + cipher.start(iv); + return cipher; + }; + forge2.des.createDecryptionCipher = function(key, mode) { + return _createCipher({ + key, + output: null, + decrypt: true, + mode + }); + }; + forge2.des.Algorithm = function(name, mode) { + var self2 = this; + self2.name = name; + self2.mode = new mode({ + blockSize: 8, + cipher: { + encrypt: function(inBlock, outBlock) { + return _updateBlock(self2._keys, inBlock, outBlock, false); + }, + decrypt: function(inBlock, outBlock) { + return _updateBlock(self2._keys, inBlock, outBlock, true); + } + } + }); + self2._init = false; + }; + forge2.des.Algorithm.prototype.initialize = function(options) { + if (this._init) { + return; + } + var key = forge2.util.createBuffer(options.key); + if (this.name.indexOf("3DES") === 0) { + if (key.length() !== 24) { + throw new Error("Invalid Triple-DES key size: " + key.length() * 8); + } + } + this._keys = _createKeys(key); + this._init = true; + }; + registerAlgorithm("DES-ECB", forge2.cipher.modes.ecb); + registerAlgorithm("DES-CBC", forge2.cipher.modes.cbc); + registerAlgorithm("DES-CFB", forge2.cipher.modes.cfb); + registerAlgorithm("DES-OFB", forge2.cipher.modes.ofb); + registerAlgorithm("DES-CTR", forge2.cipher.modes.ctr); + registerAlgorithm("3DES-ECB", forge2.cipher.modes.ecb); + registerAlgorithm("3DES-CBC", forge2.cipher.modes.cbc); + registerAlgorithm("3DES-CFB", forge2.cipher.modes.cfb); + registerAlgorithm("3DES-OFB", forge2.cipher.modes.ofb); + registerAlgorithm("3DES-CTR", forge2.cipher.modes.ctr); + function registerAlgorithm(name, mode) { + var factory = function() { + return new forge2.des.Algorithm(name, mode); + }; + forge2.cipher.registerAlgorithm(name, factory); + } + var spfunction1 = [16843776, 0, 65536, 16843780, 16842756, 66564, 4, 65536, 1024, 16843776, 16843780, 1024, 16778244, 16842756, 16777216, 4, 1028, 16778240, 16778240, 66560, 66560, 16842752, 16842752, 16778244, 65540, 16777220, 16777220, 65540, 0, 1028, 66564, 16777216, 65536, 16843780, 4, 16842752, 16843776, 16777216, 16777216, 1024, 16842756, 65536, 66560, 16777220, 1024, 4, 16778244, 66564, 16843780, 65540, 16842752, 16778244, 16777220, 1028, 66564, 16843776, 1028, 16778240, 16778240, 0, 65540, 66560, 0, 16842756]; + var spfunction2 = [-2146402272, -2147450880, 32768, 1081376, 1048576, 32, -2146435040, -2147450848, -2147483616, -2146402272, -2146402304, -2147483648, -2147450880, 1048576, 32, -2146435040, 1081344, 1048608, -2147450848, 0, -2147483648, 32768, 1081376, -2146435072, 1048608, -2147483616, 0, 1081344, 32800, -2146402304, -2146435072, 32800, 0, 1081376, -2146435040, 1048576, -2147450848, -2146435072, -2146402304, 32768, -2146435072, -2147450880, 32, -2146402272, 1081376, 32, 32768, -2147483648, 32800, -2146402304, 1048576, -2147483616, 1048608, -2147450848, -2147483616, 1048608, 1081344, 0, -2147450880, 32800, -2147483648, -2146435040, -2146402272, 1081344]; + var spfunction3 = [520, 134349312, 0, 134348808, 134218240, 0, 131592, 134218240, 131080, 134217736, 134217736, 131072, 134349320, 131080, 134348800, 520, 134217728, 8, 134349312, 512, 131584, 134348800, 134348808, 131592, 134218248, 131584, 131072, 134218248, 8, 134349320, 512, 134217728, 134349312, 134217728, 131080, 520, 131072, 134349312, 134218240, 0, 512, 131080, 134349320, 134218240, 134217736, 512, 0, 134348808, 134218248, 131072, 134217728, 134349320, 8, 131592, 131584, 134217736, 134348800, 134218248, 520, 134348800, 131592, 8, 134348808, 131584]; + var spfunction4 = [8396801, 8321, 8321, 128, 8396928, 8388737, 8388609, 8193, 0, 8396800, 8396800, 8396929, 129, 0, 8388736, 8388609, 1, 8192, 8388608, 8396801, 128, 8388608, 8193, 8320, 8388737, 1, 8320, 8388736, 8192, 8396928, 8396929, 129, 8388736, 8388609, 8396800, 8396929, 129, 0, 0, 8396800, 8320, 8388736, 8388737, 1, 8396801, 8321, 8321, 128, 8396929, 129, 1, 8192, 8388609, 8193, 8396928, 8388737, 8193, 8320, 8388608, 8396801, 128, 8388608, 8192, 8396928]; + var spfunction5 = [256, 34078976, 34078720, 1107296512, 524288, 256, 1073741824, 34078720, 1074266368, 524288, 33554688, 1074266368, 1107296512, 1107820544, 524544, 1073741824, 33554432, 1074266112, 1074266112, 0, 1073742080, 1107820800, 1107820800, 33554688, 1107820544, 1073742080, 0, 1107296256, 34078976, 33554432, 1107296256, 524544, 524288, 1107296512, 256, 33554432, 1073741824, 34078720, 1107296512, 1074266368, 33554688, 1073741824, 1107820544, 34078976, 1074266368, 256, 33554432, 1107820544, 1107820800, 524544, 1107296256, 1107820800, 34078720, 0, 1074266112, 1107296256, 524544, 33554688, 1073742080, 524288, 0, 1074266112, 34078976, 1073742080]; + var spfunction6 = [536870928, 541065216, 16384, 541081616, 541065216, 16, 541081616, 4194304, 536887296, 4210704, 4194304, 536870928, 4194320, 536887296, 536870912, 16400, 0, 4194320, 536887312, 16384, 4210688, 536887312, 16, 541065232, 541065232, 0, 4210704, 541081600, 16400, 4210688, 541081600, 536870912, 536887296, 16, 541065232, 4210688, 541081616, 4194304, 16400, 536870928, 4194304, 536887296, 536870912, 16400, 536870928, 541081616, 4210688, 541065216, 4210704, 541081600, 0, 541065232, 16, 16384, 541065216, 4210704, 16384, 4194320, 536887312, 0, 541081600, 536870912, 4194320, 536887312]; + var spfunction7 = [2097152, 69206018, 67110914, 0, 2048, 67110914, 2099202, 69208064, 69208066, 2097152, 0, 67108866, 2, 67108864, 69206018, 2050, 67110912, 2099202, 2097154, 67110912, 67108866, 69206016, 69208064, 2097154, 69206016, 2048, 2050, 69208066, 2099200, 2, 67108864, 2099200, 67108864, 2099200, 2097152, 67110914, 67110914, 69206018, 69206018, 2, 2097154, 67108864, 67110912, 2097152, 69208064, 2050, 2099202, 69208064, 2050, 67108866, 69208066, 69206016, 2099200, 0, 2, 69208066, 0, 2099202, 69206016, 2048, 67108866, 67110912, 2048, 2097154]; + var spfunction8 = [268439616, 4096, 262144, 268701760, 268435456, 268439616, 64, 268435456, 262208, 268697600, 268701760, 266240, 268701696, 266304, 4096, 64, 268697600, 268435520, 268439552, 4160, 266240, 262208, 268697664, 268701696, 4160, 0, 0, 268697664, 268435520, 268439552, 266304, 262144, 266304, 262144, 268701696, 4096, 64, 268697664, 4096, 266304, 268439552, 64, 268435520, 268697600, 268697664, 268435456, 262144, 268439616, 0, 268701760, 262208, 268435520, 268697600, 268439552, 268439616, 0, 268701760, 266240, 266240, 4160, 4160, 262208, 268435456, 268701696]; + function _createKeys(key) { + var pc2bytes0 = [0, 4, 536870912, 536870916, 65536, 65540, 536936448, 536936452, 512, 516, 536871424, 536871428, 66048, 66052, 536936960, 536936964], pc2bytes1 = [0, 1, 1048576, 1048577, 67108864, 67108865, 68157440, 68157441, 256, 257, 1048832, 1048833, 67109120, 67109121, 68157696, 68157697], pc2bytes2 = [0, 8, 2048, 2056, 16777216, 16777224, 16779264, 16779272, 0, 8, 2048, 2056, 16777216, 16777224, 16779264, 16779272], pc2bytes3 = [0, 2097152, 134217728, 136314880, 8192, 2105344, 134225920, 136323072, 131072, 2228224, 134348800, 136445952, 139264, 2236416, 134356992, 136454144], pc2bytes4 = [0, 262144, 16, 262160, 0, 262144, 16, 262160, 4096, 266240, 4112, 266256, 4096, 266240, 4112, 266256], pc2bytes5 = [0, 1024, 32, 1056, 0, 1024, 32, 1056, 33554432, 33555456, 33554464, 33555488, 33554432, 33555456, 33554464, 33555488], pc2bytes6 = [0, 268435456, 524288, 268959744, 2, 268435458, 524290, 268959746, 0, 268435456, 524288, 268959744, 2, 268435458, 524290, 268959746], pc2bytes7 = [0, 65536, 2048, 67584, 536870912, 536936448, 536872960, 536938496, 131072, 196608, 133120, 198656, 537001984, 537067520, 537004032, 537069568], pc2bytes8 = [0, 262144, 0, 262144, 2, 262146, 2, 262146, 33554432, 33816576, 33554432, 33816576, 33554434, 33816578, 33554434, 33816578], pc2bytes9 = [0, 268435456, 8, 268435464, 0, 268435456, 8, 268435464, 1024, 268436480, 1032, 268436488, 1024, 268436480, 1032, 268436488], pc2bytes10 = [0, 32, 0, 32, 1048576, 1048608, 1048576, 1048608, 8192, 8224, 8192, 8224, 1056768, 1056800, 1056768, 1056800], pc2bytes11 = [0, 16777216, 512, 16777728, 2097152, 18874368, 2097664, 18874880, 67108864, 83886080, 67109376, 83886592, 69206016, 85983232, 69206528, 85983744], pc2bytes12 = [0, 4096, 134217728, 134221824, 524288, 528384, 134742016, 134746112, 16, 4112, 134217744, 134221840, 524304, 528400, 134742032, 134746128], pc2bytes13 = [0, 4, 256, 260, 0, 4, 256, 260, 1, 5, 257, 261, 1, 5, 257, 261]; + var iterations = key.length() > 8 ? 3 : 1; + var keys = []; + var shifts = [0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0]; + var n = 0, tmp; + for (var j = 0; j < iterations; j++) { + var left = key.getInt32(); + var right = key.getInt32(); + tmp = (left >>> 4 ^ right) & 252645135; + right ^= tmp; + left ^= tmp << 4; + tmp = (right >>> -16 ^ left) & 65535; + left ^= tmp; + right ^= tmp << -16; + tmp = (left >>> 2 ^ right) & 858993459; + right ^= tmp; + left ^= tmp << 2; + tmp = (right >>> -16 ^ left) & 65535; + left ^= tmp; + right ^= tmp << -16; + tmp = (left >>> 1 ^ right) & 1431655765; + right ^= tmp; + left ^= tmp << 1; + tmp = (right >>> 8 ^ left) & 16711935; + left ^= tmp; + right ^= tmp << 8; + tmp = (left >>> 1 ^ right) & 1431655765; + right ^= tmp; + left ^= tmp << 1; + tmp = left << 8 | right >>> 20 & 240; + left = right << 24 | right << 8 & 16711680 | right >>> 8 & 65280 | right >>> 24 & 240; + right = tmp; + for (var i = 0; i < shifts.length; ++i) { + if (shifts[i]) { + left = left << 2 | left >>> 26; + right = right << 2 | right >>> 26; + } else { + left = left << 1 | left >>> 27; + right = right << 1 | right >>> 27; + } + left &= -15; + right &= -15; + var lefttmp = pc2bytes0[left >>> 28] | pc2bytes1[left >>> 24 & 15] | pc2bytes2[left >>> 20 & 15] | pc2bytes3[left >>> 16 & 15] | pc2bytes4[left >>> 12 & 15] | pc2bytes5[left >>> 8 & 15] | pc2bytes6[left >>> 4 & 15]; + var righttmp = pc2bytes7[right >>> 28] | pc2bytes8[right >>> 24 & 15] | pc2bytes9[right >>> 20 & 15] | pc2bytes10[right >>> 16 & 15] | pc2bytes11[right >>> 12 & 15] | pc2bytes12[right >>> 8 & 15] | pc2bytes13[right >>> 4 & 15]; + tmp = (righttmp >>> 16 ^ lefttmp) & 65535; + keys[n++] = lefttmp ^ tmp; + keys[n++] = righttmp ^ tmp << 16; + } + } + return keys; + } + function _updateBlock(keys, input, output, decrypt) { + var iterations = keys.length === 32 ? 3 : 9; + var looping; + if (iterations === 3) { + looping = decrypt ? [30, -2, -2] : [0, 32, 2]; + } else { + looping = decrypt ? [94, 62, -2, 32, 64, 2, 30, -2, -2] : [0, 32, 2, 62, 30, -2, 64, 96, 2]; + } + var tmp; + var left = input[0]; + var right = input[1]; + tmp = (left >>> 4 ^ right) & 252645135; + right ^= tmp; + left ^= tmp << 4; + tmp = (left >>> 16 ^ right) & 65535; + right ^= tmp; + left ^= tmp << 16; + tmp = (right >>> 2 ^ left) & 858993459; + left ^= tmp; + right ^= tmp << 2; + tmp = (right >>> 8 ^ left) & 16711935; + left ^= tmp; + right ^= tmp << 8; + tmp = (left >>> 1 ^ right) & 1431655765; + right ^= tmp; + left ^= tmp << 1; + left = left << 1 | left >>> 31; + right = right << 1 | right >>> 31; + for (var j = 0; j < iterations; j += 3) { + var endloop = looping[j + 1]; + var loopinc = looping[j + 2]; + for (var i = looping[j]; i != endloop; i += loopinc) { + var right1 = right ^ keys[i]; + var right2 = (right >>> 4 | right << 28) ^ keys[i + 1]; + tmp = left; + left = right; + right = tmp ^ (spfunction2[right1 >>> 24 & 63] | spfunction4[right1 >>> 16 & 63] | spfunction6[right1 >>> 8 & 63] | spfunction8[right1 & 63] | spfunction1[right2 >>> 24 & 63] | spfunction3[right2 >>> 16 & 63] | spfunction5[right2 >>> 8 & 63] | spfunction7[right2 & 63]); + } + tmp = left; + left = right; + right = tmp; + } + left = left >>> 1 | left << 31; + right = right >>> 1 | right << 31; + tmp = (left >>> 1 ^ right) & 1431655765; + right ^= tmp; + left ^= tmp << 1; + tmp = (right >>> 8 ^ left) & 16711935; + left ^= tmp; + right ^= tmp << 8; + tmp = (right >>> 2 ^ left) & 858993459; + left ^= tmp; + right ^= tmp << 2; + tmp = (left >>> 16 ^ right) & 65535; + right ^= tmp; + left ^= tmp << 16; + tmp = (left >>> 4 ^ right) & 252645135; + right ^= tmp; + left ^= tmp << 4; + output[0] = left; + output[1] = right; + } + function _createCipher(options) { + options = options || {}; + var mode = (options.mode || "CBC").toUpperCase(); + var algorithm = "DES-" + mode; + var cipher; + if (options.decrypt) { + cipher = forge2.cipher.createDecipher(algorithm, options.key); + } else { + cipher = forge2.cipher.createCipher(algorithm, options.key); + } + var start = cipher.start; + cipher.start = function(iv, options2) { + var output = null; + if (options2 instanceof forge2.util.ByteBuffer) { + output = options2; + options2 = {}; + } + options2 = options2 || {}; + options2.output = output; + options2.iv = iv; + start.call(cipher, options2); + }; + return cipher; + } + } +}); + +// node_modules/node-forge/lib/pbkdf2.js +var require_pbkdf2 = __commonJS({ + "node_modules/node-forge/lib/pbkdf2.js"(exports, module) { + var forge2 = require_forge(); + require_hmac(); + require_md(); + require_util(); + var pkcs5 = forge2.pkcs5 = forge2.pkcs5 || {}; + var crypto; + if (forge2.util.isNodejs && !forge2.options.usePureJavaScript) { + crypto = __require("crypto"); + } + module.exports = forge2.pbkdf2 = pkcs5.pbkdf2 = function(p, s, c, dkLen, md, callback) { + if (typeof md === "function") { + callback = md; + md = null; + } + if (forge2.util.isNodejs && !forge2.options.usePureJavaScript && crypto.pbkdf2 && (md === null || typeof md !== "object") && (crypto.pbkdf2Sync.length > 4 || (!md || md === "sha1"))) { + if (typeof md !== "string") { + md = "sha1"; + } + p = Buffer.from(p, "binary"); + s = Buffer.from(s, "binary"); + if (!callback) { + if (crypto.pbkdf2Sync.length === 4) { + return crypto.pbkdf2Sync(p, s, c, dkLen).toString("binary"); + } + return crypto.pbkdf2Sync(p, s, c, dkLen, md).toString("binary"); + } + if (crypto.pbkdf2Sync.length === 4) { + return crypto.pbkdf2(p, s, c, dkLen, function(err2, key) { + if (err2) { + return callback(err2); + } + callback(null, key.toString("binary")); + }); + } + return crypto.pbkdf2(p, s, c, dkLen, md, function(err2, key) { + if (err2) { + return callback(err2); + } + callback(null, key.toString("binary")); + }); + } + if (typeof md === "undefined" || md === null) { + md = "sha1"; + } + if (typeof md === "string") { + if (!(md in forge2.md.algorithms)) { + throw new Error("Unknown hash algorithm: " + md); + } + md = forge2.md[md].create(); + } + var hLen = md.digestLength; + if (dkLen > 4294967295 * hLen) { + var err = new Error("Derived key is too long."); + if (callback) { + return callback(err); + } + throw err; + } + var len = Math.ceil(dkLen / hLen); + var r = dkLen - (len - 1) * hLen; + var prf = forge2.hmac.create(); + prf.start(md, p); + var dk = ""; + var xor, u_c, u_c1; + if (!callback) { + for (var i = 1; i <= len; ++i) { + prf.start(null, null); + prf.update(s); + prf.update(forge2.util.int32ToBytes(i)); + xor = u_c1 = prf.digest().getBytes(); + for (var j = 2; j <= c; ++j) { + prf.start(null, null); + prf.update(u_c1); + u_c = prf.digest().getBytes(); + xor = forge2.util.xorBytes(xor, u_c, hLen); + u_c1 = u_c; + } + dk += i < len ? xor : xor.substr(0, r); + } + return dk; + } + var i = 1, j; + function outer() { + if (i > len) { + return callback(null, dk); + } + prf.start(null, null); + prf.update(s); + prf.update(forge2.util.int32ToBytes(i)); + xor = u_c1 = prf.digest().getBytes(); + j = 2; + inner(); + } + function inner() { + if (j <= c) { + prf.start(null, null); + prf.update(u_c1); + u_c = prf.digest().getBytes(); + xor = forge2.util.xorBytes(xor, u_c, hLen); + u_c1 = u_c; + ++j; + return forge2.util.setImmediate(inner); + } + dk += i < len ? xor : xor.substr(0, r); + ++i; + outer(); + } + outer(); + }; + } +}); + +// node_modules/node-forge/lib/sha256.js +var require_sha256 = __commonJS({ + "node_modules/node-forge/lib/sha256.js"(exports, module) { + var forge2 = require_forge(); + require_md(); + require_util(); + var sha256 = module.exports = forge2.sha256 = forge2.sha256 || {}; + forge2.md.sha256 = forge2.md.algorithms.sha256 = sha256; + sha256.create = function() { + if (!_initialized) { + _init(); + } + var _state = null; + var _input = forge2.util.createBuffer(); + var _w = new Array(64); + var md = { + algorithm: "sha256", + blockLength: 64, + digestLength: 32, + // 56-bit length of message so far (does not including padding) + messageLength: 0, + // true message length + fullMessageLength: null, + // size of message length in bytes + messageLengthSize: 8 + }; + md.start = function() { + md.messageLength = 0; + md.fullMessageLength = md.messageLength64 = []; + var int32s = md.messageLengthSize / 4; + for (var i = 0; i < int32s; ++i) { + md.fullMessageLength.push(0); + } + _input = forge2.util.createBuffer(); + _state = { + h0: 1779033703, + h1: 3144134277, + h2: 1013904242, + h3: 2773480762, + h4: 1359893119, + h5: 2600822924, + h6: 528734635, + h7: 1541459225 + }; + return md; + }; + md.start(); + md.update = function(msg, encoding) { + if (encoding === "utf8") { + msg = forge2.util.encodeUtf8(msg); + } + var len = msg.length; + md.messageLength += len; + len = [len / 4294967296 >>> 0, len >>> 0]; + for (var i = md.fullMessageLength.length - 1; i >= 0; --i) { + md.fullMessageLength[i] += len[1]; + len[1] = len[0] + (md.fullMessageLength[i] / 4294967296 >>> 0); + md.fullMessageLength[i] = md.fullMessageLength[i] >>> 0; + len[0] = len[1] / 4294967296 >>> 0; + } + _input.putBytes(msg); + _update(_state, _w, _input); + if (_input.read > 2048 || _input.length() === 0) { + _input.compact(); + } + return md; + }; + md.digest = function() { + var finalBlock = forge2.util.createBuffer(); + finalBlock.putBytes(_input.bytes()); + var remaining = md.fullMessageLength[md.fullMessageLength.length - 1] + md.messageLengthSize; + var overflow = remaining & md.blockLength - 1; + finalBlock.putBytes(_padding.substr(0, md.blockLength - overflow)); + var next, carry; + var bits = md.fullMessageLength[0] * 8; + for (var i = 0; i < md.fullMessageLength.length - 1; ++i) { + next = md.fullMessageLength[i + 1] * 8; + carry = next / 4294967296 >>> 0; + bits += carry; + finalBlock.putInt32(bits >>> 0); + bits = next >>> 0; + } + finalBlock.putInt32(bits); + var s2 = { + h0: _state.h0, + h1: _state.h1, + h2: _state.h2, + h3: _state.h3, + h4: _state.h4, + h5: _state.h5, + h6: _state.h6, + h7: _state.h7 + }; + _update(s2, _w, finalBlock); + var rval = forge2.util.createBuffer(); + rval.putInt32(s2.h0); + rval.putInt32(s2.h1); + rval.putInt32(s2.h2); + rval.putInt32(s2.h3); + rval.putInt32(s2.h4); + rval.putInt32(s2.h5); + rval.putInt32(s2.h6); + rval.putInt32(s2.h7); + return rval; + }; + return md; + }; + var _padding = null; + var _initialized = false; + var _k = null; + function _init() { + _padding = String.fromCharCode(128); + _padding += forge2.util.fillString(String.fromCharCode(0), 64); + _k = [ + 1116352408, + 1899447441, + 3049323471, + 3921009573, + 961987163, + 1508970993, + 2453635748, + 2870763221, + 3624381080, + 310598401, + 607225278, + 1426881987, + 1925078388, + 2162078206, + 2614888103, + 3248222580, + 3835390401, + 4022224774, + 264347078, + 604807628, + 770255983, + 1249150122, + 1555081692, + 1996064986, + 2554220882, + 2821834349, + 2952996808, + 3210313671, + 3336571891, + 3584528711, + 113926993, + 338241895, + 666307205, + 773529912, + 1294757372, + 1396182291, + 1695183700, + 1986661051, + 2177026350, + 2456956037, + 2730485921, + 2820302411, + 3259730800, + 3345764771, + 3516065817, + 3600352804, + 4094571909, + 275423344, + 430227734, + 506948616, + 659060556, + 883997877, + 958139571, + 1322822218, + 1537002063, + 1747873779, + 1955562222, + 2024104815, + 2227730452, + 2361852424, + 2428436474, + 2756734187, + 3204031479, + 3329325298 + ]; + _initialized = true; + } + function _update(s, w, bytes) { + var t1, t2, s0, s1, ch, maj, i, a, b, c, d, e, f, g, h; + var len = bytes.length(); + while (len >= 64) { + for (i = 0; i < 16; ++i) { + w[i] = bytes.getInt32(); + } + for (; i < 64; ++i) { + t1 = w[i - 2]; + t1 = (t1 >>> 17 | t1 << 15) ^ (t1 >>> 19 | t1 << 13) ^ t1 >>> 10; + t2 = w[i - 15]; + t2 = (t2 >>> 7 | t2 << 25) ^ (t2 >>> 18 | t2 << 14) ^ t2 >>> 3; + w[i] = t1 + w[i - 7] + t2 + w[i - 16] | 0; + } + a = s.h0; + b = s.h1; + c = s.h2; + d = s.h3; + e = s.h4; + f = s.h5; + g = s.h6; + h = s.h7; + for (i = 0; i < 64; ++i) { + s1 = (e >>> 6 | e << 26) ^ (e >>> 11 | e << 21) ^ (e >>> 25 | e << 7); + ch = g ^ e & (f ^ g); + s0 = (a >>> 2 | a << 30) ^ (a >>> 13 | a << 19) ^ (a >>> 22 | a << 10); + maj = a & b | c & (a ^ b); + t1 = h + s1 + ch + _k[i] + w[i]; + t2 = s0 + maj; + h = g; + g = f; + f = e; + e = d + t1 >>> 0; + d = c; + c = b; + b = a; + a = t1 + t2 >>> 0; + } + s.h0 = s.h0 + a | 0; + s.h1 = s.h1 + b | 0; + s.h2 = s.h2 + c | 0; + s.h3 = s.h3 + d | 0; + s.h4 = s.h4 + e | 0; + s.h5 = s.h5 + f | 0; + s.h6 = s.h6 + g | 0; + s.h7 = s.h7 + h | 0; + len -= 64; + } + } + } +}); + +// node_modules/node-forge/lib/prng.js +var require_prng = __commonJS({ + "node_modules/node-forge/lib/prng.js"(exports, module) { + var forge2 = require_forge(); + require_util(); + var _crypto = null; + if (forge2.util.isNodejs && !forge2.options.usePureJavaScript && !process.versions["node-webkit"]) { + _crypto = __require("crypto"); + } + var prng = module.exports = forge2.prng = forge2.prng || {}; + prng.create = function(plugin) { + var ctx = { + plugin, + key: null, + seed: null, + time: null, + // number of reseeds so far + reseeds: 0, + // amount of data generated so far + generated: 0, + // no initial key bytes + keyBytes: "" + }; + var md = plugin.md; + var pools = new Array(32); + for (var i = 0; i < 32; ++i) { + pools[i] = md.create(); + } + ctx.pools = pools; + ctx.pool = 0; + ctx.generate = function(count, callback) { + if (!callback) { + return ctx.generateSync(count); + } + var cipher = ctx.plugin.cipher; + var increment = ctx.plugin.increment; + var formatKey = ctx.plugin.formatKey; + var formatSeed = ctx.plugin.formatSeed; + var b = forge2.util.createBuffer(); + ctx.key = null; + generate(); + function generate(err) { + if (err) { + return callback(err); + } + if (b.length() >= count) { + return callback(null, b.getBytes(count)); + } + if (ctx.generated > 1048575) { + ctx.key = null; + } + if (ctx.key === null) { + return forge2.util.nextTick(function() { + _reseed(generate); + }); + } + var bytes = cipher(ctx.key, ctx.seed); + ctx.generated += bytes.length; + b.putBytes(bytes); + ctx.key = formatKey(cipher(ctx.key, increment(ctx.seed))); + ctx.seed = formatSeed(cipher(ctx.key, ctx.seed)); + forge2.util.setImmediate(generate); + } + }; + ctx.generateSync = function(count) { + var cipher = ctx.plugin.cipher; + var increment = ctx.plugin.increment; + var formatKey = ctx.plugin.formatKey; + var formatSeed = ctx.plugin.formatSeed; + ctx.key = null; + var b = forge2.util.createBuffer(); + while (b.length() < count) { + if (ctx.generated > 1048575) { + ctx.key = null; + } + if (ctx.key === null) { + _reseedSync(); + } + var bytes = cipher(ctx.key, ctx.seed); + ctx.generated += bytes.length; + b.putBytes(bytes); + ctx.key = formatKey(cipher(ctx.key, increment(ctx.seed))); + ctx.seed = formatSeed(cipher(ctx.key, ctx.seed)); + } + return b.getBytes(count); + }; + function _reseed(callback) { + if (ctx.pools[0].messageLength >= 32) { + _seed(); + return callback(); + } + var needed = 32 - ctx.pools[0].messageLength << 5; + ctx.seedFile(needed, function(err, bytes) { + if (err) { + return callback(err); + } + ctx.collect(bytes); + _seed(); + callback(); + }); + } + function _reseedSync() { + if (ctx.pools[0].messageLength >= 32) { + return _seed(); + } + var needed = 32 - ctx.pools[0].messageLength << 5; + ctx.collect(ctx.seedFileSync(needed)); + _seed(); + } + function _seed() { + ctx.reseeds = ctx.reseeds === 4294967295 ? 0 : ctx.reseeds + 1; + var md2 = ctx.plugin.md.create(); + md2.update(ctx.keyBytes); + var _2powK = 1; + for (var k = 0; k < 32; ++k) { + if (ctx.reseeds % _2powK === 0) { + md2.update(ctx.pools[k].digest().getBytes()); + ctx.pools[k].start(); + } + _2powK = _2powK << 1; + } + ctx.keyBytes = md2.digest().getBytes(); + md2.start(); + md2.update(ctx.keyBytes); + var seedBytes = md2.digest().getBytes(); + ctx.key = ctx.plugin.formatKey(ctx.keyBytes); + ctx.seed = ctx.plugin.formatSeed(seedBytes); + ctx.generated = 0; + } + function defaultSeedFile(needed) { + var getRandomValues = null; + var globalScope = forge2.util.globalScope; + var _crypto2 = globalScope.crypto || globalScope.msCrypto; + if (_crypto2 && _crypto2.getRandomValues) { + getRandomValues = function(arr) { + return _crypto2.getRandomValues(arr); + }; + } + var b = forge2.util.createBuffer(); + if (getRandomValues) { + while (b.length() < needed) { + var count = Math.max(1, Math.min(needed - b.length(), 65536) / 4); + var entropy = new Uint32Array(Math.floor(count)); + try { + getRandomValues(entropy); + for (var i2 = 0; i2 < entropy.length; ++i2) { + b.putInt32(entropy[i2]); + } + } catch (e) { + if (!(typeof QuotaExceededError !== "undefined" && e instanceof QuotaExceededError)) { + throw e; + } + } + } + } + if (b.length() < needed) { + var hi, lo, next; + var seed = Math.floor(Math.random() * 65536); + while (b.length() < needed) { + lo = 16807 * (seed & 65535); + hi = 16807 * (seed >> 16); + lo += (hi & 32767) << 16; + lo += hi >> 15; + lo = (lo & 2147483647) + (lo >> 31); + seed = lo & 4294967295; + for (var i2 = 0; i2 < 3; ++i2) { + next = seed >>> (i2 << 3); + next ^= Math.floor(Math.random() * 256); + b.putByte(next & 255); + } + } + } + return b.getBytes(needed); + } + if (_crypto) { + ctx.seedFile = function(needed, callback) { + _crypto.randomBytes(needed, function(err, bytes) { + if (err) { + return callback(err); + } + callback(null, bytes.toString()); + }); + }; + ctx.seedFileSync = function(needed) { + return _crypto.randomBytes(needed).toString(); + }; + } else { + ctx.seedFile = function(needed, callback) { + try { + callback(null, defaultSeedFile(needed)); + } catch (e) { + callback(e); + } + }; + ctx.seedFileSync = defaultSeedFile; + } + ctx.collect = function(bytes) { + var count = bytes.length; + for (var i2 = 0; i2 < count; ++i2) { + ctx.pools[ctx.pool].update(bytes.substr(i2, 1)); + ctx.pool = ctx.pool === 31 ? 0 : ctx.pool + 1; + } + }; + ctx.collectInt = function(i2, n) { + var bytes = ""; + for (var x = 0; x < n; x += 8) { + bytes += String.fromCharCode(i2 >> x & 255); + } + ctx.collect(bytes); + }; + ctx.registerWorker = function(worker) { + if (worker === self) { + ctx.seedFile = function(needed, callback) { + function listener2(e) { + var data = e.data; + if (data.forge && data.forge.prng) { + self.removeEventListener("message", listener2); + callback(data.forge.prng.err, data.forge.prng.bytes); + } + } + self.addEventListener("message", listener2); + self.postMessage({ forge: { prng: { needed } } }); + }; + } else { + var listener = function(e) { + var data = e.data; + if (data.forge && data.forge.prng) { + ctx.seedFile(data.forge.prng.needed, function(err, bytes) { + worker.postMessage({ forge: { prng: { err, bytes } } }); + }); + } + }; + worker.addEventListener("message", listener); + } + }; + return ctx; + }; + } +}); + +// node_modules/node-forge/lib/random.js +var require_random = __commonJS({ + "node_modules/node-forge/lib/random.js"(exports, module) { + var forge2 = require_forge(); + require_aes(); + require_sha256(); + require_prng(); + require_util(); + (function() { + if (forge2.random && forge2.random.getBytes) { + module.exports = forge2.random; + return; + } + (function(jQuery2) { + var prng_aes = {}; + var _prng_aes_output = new Array(4); + var _prng_aes_buffer = forge2.util.createBuffer(); + prng_aes.formatKey = function(key2) { + var tmp = forge2.util.createBuffer(key2); + key2 = new Array(4); + key2[0] = tmp.getInt32(); + key2[1] = tmp.getInt32(); + key2[2] = tmp.getInt32(); + key2[3] = tmp.getInt32(); + return forge2.aes._expandKey(key2, false); + }; + prng_aes.formatSeed = function(seed) { + var tmp = forge2.util.createBuffer(seed); + seed = new Array(4); + seed[0] = tmp.getInt32(); + seed[1] = tmp.getInt32(); + seed[2] = tmp.getInt32(); + seed[3] = tmp.getInt32(); + return seed; + }; + prng_aes.cipher = function(key2, seed) { + forge2.aes._updateBlock(key2, seed, _prng_aes_output, false); + _prng_aes_buffer.putInt32(_prng_aes_output[0]); + _prng_aes_buffer.putInt32(_prng_aes_output[1]); + _prng_aes_buffer.putInt32(_prng_aes_output[2]); + _prng_aes_buffer.putInt32(_prng_aes_output[3]); + return _prng_aes_buffer.getBytes(); + }; + prng_aes.increment = function(seed) { + ++seed[3]; + return seed; + }; + prng_aes.md = forge2.md.sha256; + function spawnPrng() { + var ctx = forge2.prng.create(prng_aes); + ctx.getBytes = function(count, callback) { + return ctx.generate(count, callback); + }; + ctx.getBytesSync = function(count) { + return ctx.generate(count); + }; + return ctx; + } + var _ctx = spawnPrng(); + var getRandomValues = null; + var globalScope = forge2.util.globalScope; + var _crypto = globalScope.crypto || globalScope.msCrypto; + if (_crypto && _crypto.getRandomValues) { + getRandomValues = function(arr) { + return _crypto.getRandomValues(arr); + }; + } + if (forge2.options.usePureJavaScript || !forge2.util.isNodejs && !getRandomValues) { + if (typeof window === "undefined" || window.document === void 0) { + } + _ctx.collectInt(+/* @__PURE__ */ new Date(), 32); + if (typeof navigator !== "undefined") { + var _navBytes = ""; + for (var key in navigator) { + try { + if (typeof navigator[key] == "string") { + _navBytes += navigator[key]; + } + } catch (e) { + } + } + _ctx.collect(_navBytes); + _navBytes = null; + } + if (jQuery2) { + jQuery2().mousemove(function(e) { + _ctx.collectInt(e.clientX, 16); + _ctx.collectInt(e.clientY, 16); + }); + jQuery2().keypress(function(e) { + _ctx.collectInt(e.charCode, 8); + }); + } + } + if (!forge2.random) { + forge2.random = _ctx; + } else { + for (var key in _ctx) { + forge2.random[key] = _ctx[key]; + } + } + forge2.random.createInstance = spawnPrng; + module.exports = forge2.random; + })(typeof jQuery !== "undefined" ? jQuery : null); + })(); + } +}); + +// node_modules/node-forge/lib/rc2.js +var require_rc2 = __commonJS({ + "node_modules/node-forge/lib/rc2.js"(exports, module) { + var forge2 = require_forge(); + require_util(); + var piTable = [ + 217, + 120, + 249, + 196, + 25, + 221, + 181, + 237, + 40, + 233, + 253, + 121, + 74, + 160, + 216, + 157, + 198, + 126, + 55, + 131, + 43, + 118, + 83, + 142, + 98, + 76, + 100, + 136, + 68, + 139, + 251, + 162, + 23, + 154, + 89, + 245, + 135, + 179, + 79, + 19, + 97, + 69, + 109, + 141, + 9, + 129, + 125, + 50, + 189, + 143, + 64, + 235, + 134, + 183, + 123, + 11, + 240, + 149, + 33, + 34, + 92, + 107, + 78, + 130, + 84, + 214, + 101, + 147, + 206, + 96, + 178, + 28, + 115, + 86, + 192, + 20, + 167, + 140, + 241, + 220, + 18, + 117, + 202, + 31, + 59, + 190, + 228, + 209, + 66, + 61, + 212, + 48, + 163, + 60, + 182, + 38, + 111, + 191, + 14, + 218, + 70, + 105, + 7, + 87, + 39, + 242, + 29, + 155, + 188, + 148, + 67, + 3, + 248, + 17, + 199, + 246, + 144, + 239, + 62, + 231, + 6, + 195, + 213, + 47, + 200, + 102, + 30, + 215, + 8, + 232, + 234, + 222, + 128, + 82, + 238, + 247, + 132, + 170, + 114, + 172, + 53, + 77, + 106, + 42, + 150, + 26, + 210, + 113, + 90, + 21, + 73, + 116, + 75, + 159, + 208, + 94, + 4, + 24, + 164, + 236, + 194, + 224, + 65, + 110, + 15, + 81, + 203, + 204, + 36, + 145, + 175, + 80, + 161, + 244, + 112, + 57, + 153, + 124, + 58, + 133, + 35, + 184, + 180, + 122, + 252, + 2, + 54, + 91, + 37, + 85, + 151, + 49, + 45, + 93, + 250, + 152, + 227, + 138, + 146, + 174, + 5, + 223, + 41, + 16, + 103, + 108, + 186, + 201, + 211, + 0, + 230, + 207, + 225, + 158, + 168, + 44, + 99, + 22, + 1, + 63, + 88, + 226, + 137, + 169, + 13, + 56, + 52, + 27, + 171, + 51, + 255, + 176, + 187, + 72, + 12, + 95, + 185, + 177, + 205, + 46, + 197, + 243, + 219, + 71, + 229, + 165, + 156, + 119, + 10, + 166, + 32, + 104, + 254, + 127, + 193, + 173 + ]; + var s = [1, 2, 3, 5]; + var rol = function(word, bits) { + return word << bits & 65535 | (word & 65535) >> 16 - bits; + }; + var ror = function(word, bits) { + return (word & 65535) >> bits | word << 16 - bits & 65535; + }; + module.exports = forge2.rc2 = forge2.rc2 || {}; + forge2.rc2.expandKey = function(key, effKeyBits) { + if (typeof key === "string") { + key = forge2.util.createBuffer(key); + } + effKeyBits = effKeyBits || 128; + var L = key; + var T = key.length(); + var T1 = effKeyBits; + var T8 = Math.ceil(T1 / 8); + var TM = 255 >> (T1 & 7); + var i; + for (i = T; i < 128; i++) { + L.putByte(piTable[L.at(i - 1) + L.at(i - T) & 255]); + } + L.setAt(128 - T8, piTable[L.at(128 - T8) & TM]); + for (i = 127 - T8; i >= 0; i--) { + L.setAt(i, piTable[L.at(i + 1) ^ L.at(i + T8)]); + } + return L; + }; + var createCipher = function(key, bits, encrypt) { + var _finish = false, _input = null, _output = null, _iv = null; + var mixRound, mashRound; + var i, j, K = []; + key = forge2.rc2.expandKey(key, bits); + for (i = 0; i < 64; i++) { + K.push(key.getInt16Le()); + } + if (encrypt) { + mixRound = function(R) { + for (i = 0; i < 4; i++) { + R[i] += K[j] + (R[(i + 3) % 4] & R[(i + 2) % 4]) + (~R[(i + 3) % 4] & R[(i + 1) % 4]); + R[i] = rol(R[i], s[i]); + j++; + } + }; + mashRound = function(R) { + for (i = 0; i < 4; i++) { + R[i] += K[R[(i + 3) % 4] & 63]; + } + }; + } else { + mixRound = function(R) { + for (i = 3; i >= 0; i--) { + R[i] = ror(R[i], s[i]); + R[i] -= K[j] + (R[(i + 3) % 4] & R[(i + 2) % 4]) + (~R[(i + 3) % 4] & R[(i + 1) % 4]); + j--; + } + }; + mashRound = function(R) { + for (i = 3; i >= 0; i--) { + R[i] -= K[R[(i + 3) % 4] & 63]; + } + }; + } + var runPlan = function(plan) { + var R = []; + for (i = 0; i < 4; i++) { + var val = _input.getInt16Le(); + if (_iv !== null) { + if (encrypt) { + val ^= _iv.getInt16Le(); + } else { + _iv.putInt16Le(val); + } + } + R.push(val & 65535); + } + j = encrypt ? 0 : 63; + for (var ptr = 0; ptr < plan.length; ptr++) { + for (var ctr = 0; ctr < plan[ptr][0]; ctr++) { + plan[ptr][1](R); + } + } + for (i = 0; i < 4; i++) { + if (_iv !== null) { + if (encrypt) { + _iv.putInt16Le(R[i]); + } else { + R[i] ^= _iv.getInt16Le(); + } + } + _output.putInt16Le(R[i]); + } + }; + var cipher = null; + cipher = { + /** + * Starts or restarts the encryption or decryption process, whichever + * was previously configured. + * + * To use the cipher in CBC mode, iv may be given either as a string + * of bytes, or as a byte buffer. For ECB mode, give null as iv. + * + * @param iv the initialization vector to use, null for ECB mode. + * @param output the output the buffer to write to, null to create one. + */ + start: function(iv, output) { + if (iv) { + if (typeof iv === "string") { + iv = forge2.util.createBuffer(iv); + } + } + _finish = false; + _input = forge2.util.createBuffer(); + _output = output || new forge2.util.createBuffer(); + _iv = iv; + cipher.output = _output; + }, + /** + * Updates the next block. + * + * @param input the buffer to read from. + */ + update: function(input) { + if (!_finish) { + _input.putBuffer(input); + } + while (_input.length() >= 8) { + runPlan([ + [5, mixRound], + [1, mashRound], + [6, mixRound], + [1, mashRound], + [5, mixRound] + ]); + } + }, + /** + * Finishes encrypting or decrypting. + * + * @param pad a padding function to use, null for PKCS#7 padding, + * signature(blockSize, buffer, decrypt). + * + * @return true if successful, false on error. + */ + finish: function(pad) { + var rval = true; + if (encrypt) { + if (pad) { + rval = pad(8, _input, !encrypt); + } else { + var padding = _input.length() === 8 ? 8 : 8 - _input.length(); + _input.fillWithByte(padding, padding); + } + } + if (rval) { + _finish = true; + cipher.update(); + } + if (!encrypt) { + rval = _input.length() === 0; + if (rval) { + if (pad) { + rval = pad(8, _output, !encrypt); + } else { + var len = _output.length(); + var count = _output.at(len - 1); + if (count > len) { + rval = false; + } else { + _output.truncate(count); + } + } + } + } + return rval; + } + }; + return cipher; + }; + forge2.rc2.startEncrypting = function(key, iv, output) { + var cipher = forge2.rc2.createEncryptionCipher(key, 128); + cipher.start(iv, output); + return cipher; + }; + forge2.rc2.createEncryptionCipher = function(key, bits) { + return createCipher(key, bits, true); + }; + forge2.rc2.startDecrypting = function(key, iv, output) { + var cipher = forge2.rc2.createDecryptionCipher(key, 128); + cipher.start(iv, output); + return cipher; + }; + forge2.rc2.createDecryptionCipher = function(key, bits) { + return createCipher(key, bits, false); + }; + } +}); + +// node_modules/node-forge/lib/jsbn.js +var require_jsbn = __commonJS({ + "node_modules/node-forge/lib/jsbn.js"(exports, module) { + var forge2 = require_forge(); + module.exports = forge2.jsbn = forge2.jsbn || {}; + var dbits; + var canary = 244837814094590; + var j_lm = (canary & 16777215) == 15715070; + function BigInteger2(a, b, c) { + this.data = []; + if (a != null) + if ("number" == typeof a) this.fromNumber(a, b, c); + else if (b == null && "string" != typeof a) this.fromString(a, 256); + else this.fromString(a, b); + } + forge2.jsbn.BigInteger = BigInteger2; + function nbi() { + return new BigInteger2(null); + } + function am1(i, x, w, j, c, n) { + while (--n >= 0) { + var v = x * this.data[i++] + w.data[j] + c; + c = Math.floor(v / 67108864); + w.data[j++] = v & 67108863; + } + return c; + } + function am2(i, x, w, j, c, n) { + var xl = x & 32767, xh = x >> 15; + while (--n >= 0) { + var l = this.data[i] & 32767; + var h = this.data[i++] >> 15; + var m = xh * l + h * xl; + l = xl * l + ((m & 32767) << 15) + w.data[j] + (c & 1073741823); + c = (l >>> 30) + (m >>> 15) + xh * h + (c >>> 30); + w.data[j++] = l & 1073741823; + } + return c; + } + function am3(i, x, w, j, c, n) { + var xl = x & 16383, xh = x >> 14; + while (--n >= 0) { + var l = this.data[i] & 16383; + var h = this.data[i++] >> 14; + var m = xh * l + h * xl; + l = xl * l + ((m & 16383) << 14) + w.data[j] + c; + c = (l >> 28) + (m >> 14) + xh * h; + w.data[j++] = l & 268435455; + } + return c; + } + if (typeof navigator === "undefined") { + BigInteger2.prototype.am = am3; + dbits = 28; + } else if (j_lm && navigator.appName == "Microsoft Internet Explorer") { + BigInteger2.prototype.am = am2; + dbits = 30; + } else if (j_lm && navigator.appName != "Netscape") { + BigInteger2.prototype.am = am1; + dbits = 26; + } else { + BigInteger2.prototype.am = am3; + dbits = 28; + } + BigInteger2.prototype.DB = dbits; + BigInteger2.prototype.DM = (1 << dbits) - 1; + BigInteger2.prototype.DV = 1 << dbits; + var BI_FP = 52; + BigInteger2.prototype.FV = Math.pow(2, BI_FP); + BigInteger2.prototype.F1 = BI_FP - dbits; + BigInteger2.prototype.F2 = 2 * dbits - BI_FP; + var BI_RM = "0123456789abcdefghijklmnopqrstuvwxyz"; + var BI_RC = new Array(); + var rr; + var vv; + rr = "0".charCodeAt(0); + for (vv = 0; vv <= 9; ++vv) BI_RC[rr++] = vv; + rr = "a".charCodeAt(0); + for (vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv; + rr = "A".charCodeAt(0); + for (vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv; + function int2char(n) { + return BI_RM.charAt(n); + } + function intAt(s, i) { + var c = BI_RC[s.charCodeAt(i)]; + return c == null ? -1 : c; + } + function bnpCopyTo(r) { + for (var i = this.t - 1; i >= 0; --i) r.data[i] = this.data[i]; + r.t = this.t; + r.s = this.s; + } + function bnpFromInt(x) { + this.t = 1; + this.s = x < 0 ? -1 : 0; + if (x > 0) this.data[0] = x; + else if (x < -1) this.data[0] = x + this.DV; + else this.t = 0; + } + function nbv(i) { + var r = nbi(); + r.fromInt(i); + return r; + } + function bnpFromString(s, b) { + var k; + if (b == 16) k = 4; + else if (b == 8) k = 3; + else if (b == 256) k = 8; + else if (b == 2) k = 1; + else if (b == 32) k = 5; + else if (b == 4) k = 2; + else { + this.fromRadix(s, b); + return; + } + this.t = 0; + this.s = 0; + var i = s.length, mi = false, sh = 0; + while (--i >= 0) { + var x = k == 8 ? s[i] & 255 : intAt(s, i); + if (x < 0) { + if (s.charAt(i) == "-") mi = true; + continue; + } + mi = false; + if (sh == 0) + this.data[this.t++] = x; + else if (sh + k > this.DB) { + this.data[this.t - 1] |= (x & (1 << this.DB - sh) - 1) << sh; + this.data[this.t++] = x >> this.DB - sh; + } else + this.data[this.t - 1] |= x << sh; + sh += k; + if (sh >= this.DB) sh -= this.DB; + } + if (k == 8 && (s[0] & 128) != 0) { + this.s = -1; + if (sh > 0) this.data[this.t - 1] |= (1 << this.DB - sh) - 1 << sh; + } + this.clamp(); + if (mi) BigInteger2.ZERO.subTo(this, this); + } + function bnpClamp() { + var c = this.s & this.DM; + while (this.t > 0 && this.data[this.t - 1] == c) --this.t; + } + function bnToString(b) { + if (this.s < 0) return "-" + this.negate().toString(b); + var k; + if (b == 16) k = 4; + else if (b == 8) k = 3; + else if (b == 2) k = 1; + else if (b == 32) k = 5; + else if (b == 4) k = 2; + else return this.toRadix(b); + var km = (1 << k) - 1, d, m = false, r = "", i = this.t; + var p = this.DB - i * this.DB % k; + if (i-- > 0) { + if (p < this.DB && (d = this.data[i] >> p) > 0) { + m = true; + r = int2char(d); + } + while (i >= 0) { + if (p < k) { + d = (this.data[i] & (1 << p) - 1) << k - p; + d |= this.data[--i] >> (p += this.DB - k); + } else { + d = this.data[i] >> (p -= k) & km; + if (p <= 0) { + p += this.DB; + --i; + } + } + if (d > 0) m = true; + if (m) r += int2char(d); + } + } + return m ? r : "0"; + } + function bnNegate() { + var r = nbi(); + BigInteger2.ZERO.subTo(this, r); + return r; + } + function bnAbs() { + return this.s < 0 ? this.negate() : this; + } + function bnCompareTo(a) { + var r = this.s - a.s; + if (r != 0) return r; + var i = this.t; + r = i - a.t; + if (r != 0) return this.s < 0 ? -r : r; + while (--i >= 0) if ((r = this.data[i] - a.data[i]) != 0) return r; + return 0; + } + function nbits(x) { + var r = 1, t; + if ((t = x >>> 16) != 0) { + x = t; + r += 16; + } + if ((t = x >> 8) != 0) { + x = t; + r += 8; + } + if ((t = x >> 4) != 0) { + x = t; + r += 4; + } + if ((t = x >> 2) != 0) { + x = t; + r += 2; + } + if ((t = x >> 1) != 0) { + x = t; + r += 1; + } + return r; + } + function bnBitLength() { + if (this.t <= 0) return 0; + return this.DB * (this.t - 1) + nbits(this.data[this.t - 1] ^ this.s & this.DM); + } + function bnpDLShiftTo(n, r) { + var i; + for (i = this.t - 1; i >= 0; --i) r.data[i + n] = this.data[i]; + for (i = n - 1; i >= 0; --i) r.data[i] = 0; + r.t = this.t + n; + r.s = this.s; + } + function bnpDRShiftTo(n, r) { + for (var i = n; i < this.t; ++i) r.data[i - n] = this.data[i]; + r.t = Math.max(this.t - n, 0); + r.s = this.s; + } + function bnpLShiftTo(n, r) { + var bs = n % this.DB; + var cbs = this.DB - bs; + var bm = (1 << cbs) - 1; + var ds = Math.floor(n / this.DB), c = this.s << bs & this.DM, i; + for (i = this.t - 1; i >= 0; --i) { + r.data[i + ds + 1] = this.data[i] >> cbs | c; + c = (this.data[i] & bm) << bs; + } + for (i = ds - 1; i >= 0; --i) r.data[i] = 0; + r.data[ds] = c; + r.t = this.t + ds + 1; + r.s = this.s; + r.clamp(); + } + function bnpRShiftTo(n, r) { + r.s = this.s; + var ds = Math.floor(n / this.DB); + if (ds >= this.t) { + r.t = 0; + return; + } + var bs = n % this.DB; + var cbs = this.DB - bs; + var bm = (1 << bs) - 1; + r.data[0] = this.data[ds] >> bs; + for (var i = ds + 1; i < this.t; ++i) { + r.data[i - ds - 1] |= (this.data[i] & bm) << cbs; + r.data[i - ds] = this.data[i] >> bs; + } + if (bs > 0) r.data[this.t - ds - 1] |= (this.s & bm) << cbs; + r.t = this.t - ds; + r.clamp(); + } + function bnpSubTo(a, r) { + var i = 0, c = 0, m = Math.min(a.t, this.t); + while (i < m) { + c += this.data[i] - a.data[i]; + r.data[i++] = c & this.DM; + c >>= this.DB; + } + if (a.t < this.t) { + c -= a.s; + while (i < this.t) { + c += this.data[i]; + r.data[i++] = c & this.DM; + c >>= this.DB; + } + c += this.s; + } else { + c += this.s; + while (i < a.t) { + c -= a.data[i]; + r.data[i++] = c & this.DM; + c >>= this.DB; + } + c -= a.s; + } + r.s = c < 0 ? -1 : 0; + if (c < -1) r.data[i++] = this.DV + c; + else if (c > 0) r.data[i++] = c; + r.t = i; + r.clamp(); + } + function bnpMultiplyTo(a, r) { + var x = this.abs(), y = a.abs(); + var i = x.t; + r.t = i + y.t; + while (--i >= 0) r.data[i] = 0; + for (i = 0; i < y.t; ++i) r.data[i + x.t] = x.am(0, y.data[i], r, i, 0, x.t); + r.s = 0; + r.clamp(); + if (this.s != a.s) BigInteger2.ZERO.subTo(r, r); + } + function bnpSquareTo(r) { + var x = this.abs(); + var i = r.t = 2 * x.t; + while (--i >= 0) r.data[i] = 0; + for (i = 0; i < x.t - 1; ++i) { + var c = x.am(i, x.data[i], r, 2 * i, 0, 1); + if ((r.data[i + x.t] += x.am(i + 1, 2 * x.data[i], r, 2 * i + 1, c, x.t - i - 1)) >= x.DV) { + r.data[i + x.t] -= x.DV; + r.data[i + x.t + 1] = 1; + } + } + if (r.t > 0) r.data[r.t - 1] += x.am(i, x.data[i], r, 2 * i, 0, 1); + r.s = 0; + r.clamp(); + } + function bnpDivRemTo(m, q, r) { + var pm = m.abs(); + if (pm.t <= 0) return; + var pt = this.abs(); + if (pt.t < pm.t) { + if (q != null) q.fromInt(0); + if (r != null) this.copyTo(r); + return; + } + if (r == null) r = nbi(); + var y = nbi(), ts = this.s, ms = m.s; + var nsh = this.DB - nbits(pm.data[pm.t - 1]); + if (nsh > 0) { + pm.lShiftTo(nsh, y); + pt.lShiftTo(nsh, r); + } else { + pm.copyTo(y); + pt.copyTo(r); + } + var ys = y.t; + var y0 = y.data[ys - 1]; + if (y0 == 0) return; + var yt = y0 * (1 << this.F1) + (ys > 1 ? y.data[ys - 2] >> this.F2 : 0); + var d1 = this.FV / yt, d2 = (1 << this.F1) / yt, e = 1 << this.F2; + var i = r.t, j = i - ys, t = q == null ? nbi() : q; + y.dlShiftTo(j, t); + if (r.compareTo(t) >= 0) { + r.data[r.t++] = 1; + r.subTo(t, r); + } + BigInteger2.ONE.dlShiftTo(ys, t); + t.subTo(y, y); + while (y.t < ys) y.data[y.t++] = 0; + while (--j >= 0) { + var qd = r.data[--i] == y0 ? this.DM : Math.floor(r.data[i] * d1 + (r.data[i - 1] + e) * d2); + if ((r.data[i] += y.am(0, qd, r, j, 0, ys)) < qd) { + y.dlShiftTo(j, t); + r.subTo(t, r); + while (r.data[i] < --qd) r.subTo(t, r); + } + } + if (q != null) { + r.drShiftTo(ys, q); + if (ts != ms) BigInteger2.ZERO.subTo(q, q); + } + r.t = ys; + r.clamp(); + if (nsh > 0) r.rShiftTo(nsh, r); + if (ts < 0) BigInteger2.ZERO.subTo(r, r); + } + function bnMod(a) { + var r = nbi(); + this.abs().divRemTo(a, null, r); + if (this.s < 0 && r.compareTo(BigInteger2.ZERO) > 0) a.subTo(r, r); + return r; + } + function Classic(m) { + this.m = m; + } + function cConvert(x) { + if (x.s < 0 || x.compareTo(this.m) >= 0) return x.mod(this.m); + else return x; + } + function cRevert(x) { + return x; + } + function cReduce(x) { + x.divRemTo(this.m, null, x); + } + function cMulTo(x, y, r) { + x.multiplyTo(y, r); + this.reduce(r); + } + function cSqrTo(x, r) { + x.squareTo(r); + this.reduce(r); + } + Classic.prototype.convert = cConvert; + Classic.prototype.revert = cRevert; + Classic.prototype.reduce = cReduce; + Classic.prototype.mulTo = cMulTo; + Classic.prototype.sqrTo = cSqrTo; + function bnpInvDigit() { + if (this.t < 1) return 0; + var x = this.data[0]; + if ((x & 1) == 0) return 0; + var y = x & 3; + y = y * (2 - (x & 15) * y) & 15; + y = y * (2 - (x & 255) * y) & 255; + y = y * (2 - ((x & 65535) * y & 65535)) & 65535; + y = y * (2 - x * y % this.DV) % this.DV; + return y > 0 ? this.DV - y : -y; + } + function Montgomery(m) { + this.m = m; + this.mp = m.invDigit(); + this.mpl = this.mp & 32767; + this.mph = this.mp >> 15; + this.um = (1 << m.DB - 15) - 1; + this.mt2 = 2 * m.t; + } + function montConvert(x) { + var r = nbi(); + x.abs().dlShiftTo(this.m.t, r); + r.divRemTo(this.m, null, r); + if (x.s < 0 && r.compareTo(BigInteger2.ZERO) > 0) this.m.subTo(r, r); + return r; + } + function montRevert(x) { + var r = nbi(); + x.copyTo(r); + this.reduce(r); + return r; + } + function montReduce(x) { + while (x.t <= this.mt2) + x.data[x.t++] = 0; + for (var i = 0; i < this.m.t; ++i) { + var j = x.data[i] & 32767; + var u0 = j * this.mpl + ((j * this.mph + (x.data[i] >> 15) * this.mpl & this.um) << 15) & x.DM; + j = i + this.m.t; + x.data[j] += this.m.am(0, u0, x, i, 0, this.m.t); + while (x.data[j] >= x.DV) { + x.data[j] -= x.DV; + x.data[++j]++; + } + } + x.clamp(); + x.drShiftTo(this.m.t, x); + if (x.compareTo(this.m) >= 0) x.subTo(this.m, x); + } + function montSqrTo(x, r) { + x.squareTo(r); + this.reduce(r); + } + function montMulTo(x, y, r) { + x.multiplyTo(y, r); + this.reduce(r); + } + Montgomery.prototype.convert = montConvert; + Montgomery.prototype.revert = montRevert; + Montgomery.prototype.reduce = montReduce; + Montgomery.prototype.mulTo = montMulTo; + Montgomery.prototype.sqrTo = montSqrTo; + function bnpIsEven() { + return (this.t > 0 ? this.data[0] & 1 : this.s) == 0; + } + function bnpExp(e, z) { + if (e > 4294967295 || e < 1) return BigInteger2.ONE; + var r = nbi(), r2 = nbi(), g = z.convert(this), i = nbits(e) - 1; + g.copyTo(r); + while (--i >= 0) { + z.sqrTo(r, r2); + if ((e & 1 << i) > 0) z.mulTo(r2, g, r); + else { + var t = r; + r = r2; + r2 = t; + } + } + return z.revert(r); + } + function bnModPowInt(e, m) { + var z; + if (e < 256 || m.isEven()) z = new Classic(m); + else z = new Montgomery(m); + return this.exp(e, z); + } + BigInteger2.prototype.copyTo = bnpCopyTo; + BigInteger2.prototype.fromInt = bnpFromInt; + BigInteger2.prototype.fromString = bnpFromString; + BigInteger2.prototype.clamp = bnpClamp; + BigInteger2.prototype.dlShiftTo = bnpDLShiftTo; + BigInteger2.prototype.drShiftTo = bnpDRShiftTo; + BigInteger2.prototype.lShiftTo = bnpLShiftTo; + BigInteger2.prototype.rShiftTo = bnpRShiftTo; + BigInteger2.prototype.subTo = bnpSubTo; + BigInteger2.prototype.multiplyTo = bnpMultiplyTo; + BigInteger2.prototype.squareTo = bnpSquareTo; + BigInteger2.prototype.divRemTo = bnpDivRemTo; + BigInteger2.prototype.invDigit = bnpInvDigit; + BigInteger2.prototype.isEven = bnpIsEven; + BigInteger2.prototype.exp = bnpExp; + BigInteger2.prototype.toString = bnToString; + BigInteger2.prototype.negate = bnNegate; + BigInteger2.prototype.abs = bnAbs; + BigInteger2.prototype.compareTo = bnCompareTo; + BigInteger2.prototype.bitLength = bnBitLength; + BigInteger2.prototype.mod = bnMod; + BigInteger2.prototype.modPowInt = bnModPowInt; + BigInteger2.ZERO = nbv(0); + BigInteger2.ONE = nbv(1); + function bnClone() { + var r = nbi(); + this.copyTo(r); + return r; + } + function bnIntValue() { + if (this.s < 0) { + if (this.t == 1) return this.data[0] - this.DV; + else if (this.t == 0) return -1; + } else if (this.t == 1) return this.data[0]; + else if (this.t == 0) return 0; + return (this.data[1] & (1 << 32 - this.DB) - 1) << this.DB | this.data[0]; + } + function bnByteValue() { + return this.t == 0 ? this.s : this.data[0] << 24 >> 24; + } + function bnShortValue() { + return this.t == 0 ? this.s : this.data[0] << 16 >> 16; + } + function bnpChunkSize(r) { + return Math.floor(Math.LN2 * this.DB / Math.log(r)); + } + function bnSigNum() { + if (this.s < 0) return -1; + else if (this.t <= 0 || this.t == 1 && this.data[0] <= 0) return 0; + else return 1; + } + function bnpToRadix(b) { + if (b == null) b = 10; + if (this.signum() == 0 || b < 2 || b > 36) return "0"; + var cs = this.chunkSize(b); + var a = Math.pow(b, cs); + var d = nbv(a), y = nbi(), z = nbi(), r = ""; + this.divRemTo(d, y, z); + while (y.signum() > 0) { + r = (a + z.intValue()).toString(b).substr(1) + r; + y.divRemTo(d, y, z); + } + return z.intValue().toString(b) + r; + } + function bnpFromRadix(s, b) { + this.fromInt(0); + if (b == null) b = 10; + var cs = this.chunkSize(b); + var d = Math.pow(b, cs), mi = false, j = 0, w = 0; + for (var i = 0; i < s.length; ++i) { + var x = intAt(s, i); + if (x < 0) { + if (s.charAt(i) == "-" && this.signum() == 0) mi = true; + continue; + } + w = b * w + x; + if (++j >= cs) { + this.dMultiply(d); + this.dAddOffset(w, 0); + j = 0; + w = 0; + } + } + if (j > 0) { + this.dMultiply(Math.pow(b, j)); + this.dAddOffset(w, 0); + } + if (mi) BigInteger2.ZERO.subTo(this, this); + } + function bnpFromNumber(a, b, c) { + if ("number" == typeof b) { + if (a < 2) this.fromInt(1); + else { + this.fromNumber(a, c); + if (!this.testBit(a - 1)) + this.bitwiseTo(BigInteger2.ONE.shiftLeft(a - 1), op_or, this); + if (this.isEven()) this.dAddOffset(1, 0); + while (!this.isProbablePrime(b)) { + this.dAddOffset(2, 0); + if (this.bitLength() > a) this.subTo(BigInteger2.ONE.shiftLeft(a - 1), this); + } + } + } else { + var x = new Array(), t = a & 7; + x.length = (a >> 3) + 1; + b.nextBytes(x); + if (t > 0) x[0] &= (1 << t) - 1; + else x[0] = 0; + this.fromString(x, 256); + } + } + function bnToByteArray() { + var i = this.t, r = new Array(); + r[0] = this.s; + var p = this.DB - i * this.DB % 8, d, k = 0; + if (i-- > 0) { + if (p < this.DB && (d = this.data[i] >> p) != (this.s & this.DM) >> p) + r[k++] = d | this.s << this.DB - p; + while (i >= 0) { + if (p < 8) { + d = (this.data[i] & (1 << p) - 1) << 8 - p; + d |= this.data[--i] >> (p += this.DB - 8); + } else { + d = this.data[i] >> (p -= 8) & 255; + if (p <= 0) { + p += this.DB; + --i; + } + } + if ((d & 128) != 0) d |= -256; + if (k == 0 && (this.s & 128) != (d & 128)) ++k; + if (k > 0 || d != this.s) r[k++] = d; + } + } + return r; + } + function bnEquals(a) { + return this.compareTo(a) == 0; + } + function bnMin(a) { + return this.compareTo(a) < 0 ? this : a; + } + function bnMax(a) { + return this.compareTo(a) > 0 ? this : a; + } + function bnpBitwiseTo(a, op, r) { + var i, f, m = Math.min(a.t, this.t); + for (i = 0; i < m; ++i) r.data[i] = op(this.data[i], a.data[i]); + if (a.t < this.t) { + f = a.s & this.DM; + for (i = m; i < this.t; ++i) r.data[i] = op(this.data[i], f); + r.t = this.t; + } else { + f = this.s & this.DM; + for (i = m; i < a.t; ++i) r.data[i] = op(f, a.data[i]); + r.t = a.t; + } + r.s = op(this.s, a.s); + r.clamp(); + } + function op_and(x, y) { + return x & y; + } + function bnAnd(a) { + var r = nbi(); + this.bitwiseTo(a, op_and, r); + return r; + } + function op_or(x, y) { + return x | y; + } + function bnOr(a) { + var r = nbi(); + this.bitwiseTo(a, op_or, r); + return r; + } + function op_xor(x, y) { + return x ^ y; + } + function bnXor(a) { + var r = nbi(); + this.bitwiseTo(a, op_xor, r); + return r; + } + function op_andnot(x, y) { + return x & ~y; + } + function bnAndNot(a) { + var r = nbi(); + this.bitwiseTo(a, op_andnot, r); + return r; + } + function bnNot() { + var r = nbi(); + for (var i = 0; i < this.t; ++i) r.data[i] = this.DM & ~this.data[i]; + r.t = this.t; + r.s = ~this.s; + return r; + } + function bnShiftLeft(n) { + var r = nbi(); + if (n < 0) this.rShiftTo(-n, r); + else this.lShiftTo(n, r); + return r; + } + function bnShiftRight(n) { + var r = nbi(); + if (n < 0) this.lShiftTo(-n, r); + else this.rShiftTo(n, r); + return r; + } + function lbit(x) { + if (x == 0) return -1; + var r = 0; + if ((x & 65535) == 0) { + x >>= 16; + r += 16; + } + if ((x & 255) == 0) { + x >>= 8; + r += 8; + } + if ((x & 15) == 0) { + x >>= 4; + r += 4; + } + if ((x & 3) == 0) { + x >>= 2; + r += 2; + } + if ((x & 1) == 0) ++r; + return r; + } + function bnGetLowestSetBit() { + for (var i = 0; i < this.t; ++i) + if (this.data[i] != 0) return i * this.DB + lbit(this.data[i]); + if (this.s < 0) return this.t * this.DB; + return -1; + } + function cbit(x) { + var r = 0; + while (x != 0) { + x &= x - 1; + ++r; + } + return r; + } + function bnBitCount() { + var r = 0, x = this.s & this.DM; + for (var i = 0; i < this.t; ++i) r += cbit(this.data[i] ^ x); + return r; + } + function bnTestBit(n) { + var j = Math.floor(n / this.DB); + if (j >= this.t) return this.s != 0; + return (this.data[j] & 1 << n % this.DB) != 0; + } + function bnpChangeBit(n, op) { + var r = BigInteger2.ONE.shiftLeft(n); + this.bitwiseTo(r, op, r); + return r; + } + function bnSetBit(n) { + return this.changeBit(n, op_or); + } + function bnClearBit(n) { + return this.changeBit(n, op_andnot); + } + function bnFlipBit(n) { + return this.changeBit(n, op_xor); + } + function bnpAddTo(a, r) { + var i = 0, c = 0, m = Math.min(a.t, this.t); + while (i < m) { + c += this.data[i] + a.data[i]; + r.data[i++] = c & this.DM; + c >>= this.DB; + } + if (a.t < this.t) { + c += a.s; + while (i < this.t) { + c += this.data[i]; + r.data[i++] = c & this.DM; + c >>= this.DB; + } + c += this.s; + } else { + c += this.s; + while (i < a.t) { + c += a.data[i]; + r.data[i++] = c & this.DM; + c >>= this.DB; + } + c += a.s; + } + r.s = c < 0 ? -1 : 0; + if (c > 0) r.data[i++] = c; + else if (c < -1) r.data[i++] = this.DV + c; + r.t = i; + r.clamp(); + } + function bnAdd(a) { + var r = nbi(); + this.addTo(a, r); + return r; + } + function bnSubtract(a) { + var r = nbi(); + this.subTo(a, r); + return r; + } + function bnMultiply(a) { + var r = nbi(); + this.multiplyTo(a, r); + return r; + } + function bnDivide(a) { + var r = nbi(); + this.divRemTo(a, r, null); + return r; + } + function bnRemainder(a) { + var r = nbi(); + this.divRemTo(a, null, r); + return r; + } + function bnDivideAndRemainder(a) { + var q = nbi(), r = nbi(); + this.divRemTo(a, q, r); + return new Array(q, r); + } + function bnpDMultiply(n) { + this.data[this.t] = this.am(0, n - 1, this, 0, 0, this.t); + ++this.t; + this.clamp(); + } + function bnpDAddOffset(n, w) { + if (n == 0) return; + while (this.t <= w) this.data[this.t++] = 0; + this.data[w] += n; + while (this.data[w] >= this.DV) { + this.data[w] -= this.DV; + if (++w >= this.t) this.data[this.t++] = 0; + ++this.data[w]; + } + } + function NullExp() { + } + function nNop(x) { + return x; + } + function nMulTo(x, y, r) { + x.multiplyTo(y, r); + } + function nSqrTo(x, r) { + x.squareTo(r); + } + NullExp.prototype.convert = nNop; + NullExp.prototype.revert = nNop; + NullExp.prototype.mulTo = nMulTo; + NullExp.prototype.sqrTo = nSqrTo; + function bnPow(e) { + return this.exp(e, new NullExp()); + } + function bnpMultiplyLowerTo(a, n, r) { + var i = Math.min(this.t + a.t, n); + r.s = 0; + r.t = i; + while (i > 0) r.data[--i] = 0; + var j; + for (j = r.t - this.t; i < j; ++i) r.data[i + this.t] = this.am(0, a.data[i], r, i, 0, this.t); + for (j = Math.min(a.t, n); i < j; ++i) this.am(0, a.data[i], r, i, 0, n - i); + r.clamp(); + } + function bnpMultiplyUpperTo(a, n, r) { + --n; + var i = r.t = this.t + a.t - n; + r.s = 0; + while (--i >= 0) r.data[i] = 0; + for (i = Math.max(n - this.t, 0); i < a.t; ++i) + r.data[this.t + i - n] = this.am(n - i, a.data[i], r, 0, 0, this.t + i - n); + r.clamp(); + r.drShiftTo(1, r); + } + function Barrett(m) { + this.r2 = nbi(); + this.q3 = nbi(); + BigInteger2.ONE.dlShiftTo(2 * m.t, this.r2); + this.mu = this.r2.divide(m); + this.m = m; + } + function barrettConvert(x) { + if (x.s < 0 || x.t > 2 * this.m.t) return x.mod(this.m); + else if (x.compareTo(this.m) < 0) return x; + else { + var r = nbi(); + x.copyTo(r); + this.reduce(r); + return r; + } + } + function barrettRevert(x) { + return x; + } + function barrettReduce(x) { + x.drShiftTo(this.m.t - 1, this.r2); + if (x.t > this.m.t + 1) { + x.t = this.m.t + 1; + x.clamp(); + } + this.mu.multiplyUpperTo(this.r2, this.m.t + 1, this.q3); + this.m.multiplyLowerTo(this.q3, this.m.t + 1, this.r2); + while (x.compareTo(this.r2) < 0) x.dAddOffset(1, this.m.t + 1); + x.subTo(this.r2, x); + while (x.compareTo(this.m) >= 0) x.subTo(this.m, x); + } + function barrettSqrTo(x, r) { + x.squareTo(r); + this.reduce(r); + } + function barrettMulTo(x, y, r) { + x.multiplyTo(y, r); + this.reduce(r); + } + Barrett.prototype.convert = barrettConvert; + Barrett.prototype.revert = barrettRevert; + Barrett.prototype.reduce = barrettReduce; + Barrett.prototype.mulTo = barrettMulTo; + Barrett.prototype.sqrTo = barrettSqrTo; + function bnModPow(e, m) { + var i = e.bitLength(), k, r = nbv(1), z; + if (i <= 0) return r; + else if (i < 18) k = 1; + else if (i < 48) k = 3; + else if (i < 144) k = 4; + else if (i < 768) k = 5; + else k = 6; + if (i < 8) + z = new Classic(m); + else if (m.isEven()) + z = new Barrett(m); + else + z = new Montgomery(m); + var g = new Array(), n = 3, k1 = k - 1, km = (1 << k) - 1; + g[1] = z.convert(this); + if (k > 1) { + var g2 = nbi(); + z.sqrTo(g[1], g2); + while (n <= km) { + g[n] = nbi(); + z.mulTo(g2, g[n - 2], g[n]); + n += 2; + } + } + var j = e.t - 1, w, is1 = true, r2 = nbi(), t; + i = nbits(e.data[j]) - 1; + while (j >= 0) { + if (i >= k1) w = e.data[j] >> i - k1 & km; + else { + w = (e.data[j] & (1 << i + 1) - 1) << k1 - i; + if (j > 0) w |= e.data[j - 1] >> this.DB + i - k1; + } + n = k; + while ((w & 1) == 0) { + w >>= 1; + --n; + } + if ((i -= n) < 0) { + i += this.DB; + --j; + } + if (is1) { + g[w].copyTo(r); + is1 = false; + } else { + while (n > 1) { + z.sqrTo(r, r2); + z.sqrTo(r2, r); + n -= 2; + } + if (n > 0) z.sqrTo(r, r2); + else { + t = r; + r = r2; + r2 = t; + } + z.mulTo(r2, g[w], r); + } + while (j >= 0 && (e.data[j] & 1 << i) == 0) { + z.sqrTo(r, r2); + t = r; + r = r2; + r2 = t; + if (--i < 0) { + i = this.DB - 1; + --j; + } + } + } + return z.revert(r); + } + function bnGCD(a) { + var x = this.s < 0 ? this.negate() : this.clone(); + var y = a.s < 0 ? a.negate() : a.clone(); + if (x.compareTo(y) < 0) { + var t = x; + x = y; + y = t; + } + var i = x.getLowestSetBit(), g = y.getLowestSetBit(); + if (g < 0) return x; + if (i < g) g = i; + if (g > 0) { + x.rShiftTo(g, x); + y.rShiftTo(g, y); + } + while (x.signum() > 0) { + if ((i = x.getLowestSetBit()) > 0) x.rShiftTo(i, x); + if ((i = y.getLowestSetBit()) > 0) y.rShiftTo(i, y); + if (x.compareTo(y) >= 0) { + x.subTo(y, x); + x.rShiftTo(1, x); + } else { + y.subTo(x, y); + y.rShiftTo(1, y); + } + } + if (g > 0) y.lShiftTo(g, y); + return y; + } + function bnpModInt(n) { + if (n <= 0) return 0; + var d = this.DV % n, r = this.s < 0 ? n - 1 : 0; + if (this.t > 0) + if (d == 0) r = this.data[0] % n; + else for (var i = this.t - 1; i >= 0; --i) r = (d * r + this.data[i]) % n; + return r; + } + function bnModInverse(m) { + var ac = m.isEven(); + if (this.isEven() && ac || m.signum() == 0) return BigInteger2.ZERO; + var u = m.clone(), v = this.clone(); + var a = nbv(1), b = nbv(0), c = nbv(0), d = nbv(1); + while (u.signum() != 0) { + while (u.isEven()) { + u.rShiftTo(1, u); + if (ac) { + if (!a.isEven() || !b.isEven()) { + a.addTo(this, a); + b.subTo(m, b); + } + a.rShiftTo(1, a); + } else if (!b.isEven()) b.subTo(m, b); + b.rShiftTo(1, b); + } + while (v.isEven()) { + v.rShiftTo(1, v); + if (ac) { + if (!c.isEven() || !d.isEven()) { + c.addTo(this, c); + d.subTo(m, d); + } + c.rShiftTo(1, c); + } else if (!d.isEven()) d.subTo(m, d); + d.rShiftTo(1, d); + } + if (u.compareTo(v) >= 0) { + u.subTo(v, u); + if (ac) a.subTo(c, a); + b.subTo(d, b); + } else { + v.subTo(u, v); + if (ac) c.subTo(a, c); + d.subTo(b, d); + } + } + if (v.compareTo(BigInteger2.ONE) != 0) return BigInteger2.ZERO; + if (d.compareTo(m) >= 0) return d.subtract(m); + if (d.signum() < 0) d.addTo(m, d); + else return d; + if (d.signum() < 0) return d.add(m); + else return d; + } + var lowprimes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509]; + var lplim = (1 << 26) / lowprimes[lowprimes.length - 1]; + function bnIsProbablePrime(t) { + var i, x = this.abs(); + if (x.t == 1 && x.data[0] <= lowprimes[lowprimes.length - 1]) { + for (i = 0; i < lowprimes.length; ++i) + if (x.data[0] == lowprimes[i]) return true; + return false; + } + if (x.isEven()) return false; + i = 1; + while (i < lowprimes.length) { + var m = lowprimes[i], j = i + 1; + while (j < lowprimes.length && m < lplim) m *= lowprimes[j++]; + m = x.modInt(m); + while (i < j) if (m % lowprimes[i++] == 0) return false; + } + return x.millerRabin(t); + } + function bnpMillerRabin(t) { + var n1 = this.subtract(BigInteger2.ONE); + var k = n1.getLowestSetBit(); + if (k <= 0) return false; + var r = n1.shiftRight(k); + var prng = bnGetPrng(); + var a; + for (var i = 0; i < t; ++i) { + do { + a = new BigInteger2(this.bitLength(), prng); + } while (a.compareTo(BigInteger2.ONE) <= 0 || a.compareTo(n1) >= 0); + var y = a.modPow(r, this); + if (y.compareTo(BigInteger2.ONE) != 0 && y.compareTo(n1) != 0) { + var j = 1; + while (j++ < k && y.compareTo(n1) != 0) { + y = y.modPowInt(2, this); + if (y.compareTo(BigInteger2.ONE) == 0) return false; + } + if (y.compareTo(n1) != 0) return false; + } + } + return true; + } + function bnGetPrng() { + return { + // x is an array to fill with bytes + nextBytes: function(x) { + for (var i = 0; i < x.length; ++i) { + x[i] = Math.floor(Math.random() * 256); + } + } + }; + } + BigInteger2.prototype.chunkSize = bnpChunkSize; + BigInteger2.prototype.toRadix = bnpToRadix; + BigInteger2.prototype.fromRadix = bnpFromRadix; + BigInteger2.prototype.fromNumber = bnpFromNumber; + BigInteger2.prototype.bitwiseTo = bnpBitwiseTo; + BigInteger2.prototype.changeBit = bnpChangeBit; + BigInteger2.prototype.addTo = bnpAddTo; + BigInteger2.prototype.dMultiply = bnpDMultiply; + BigInteger2.prototype.dAddOffset = bnpDAddOffset; + BigInteger2.prototype.multiplyLowerTo = bnpMultiplyLowerTo; + BigInteger2.prototype.multiplyUpperTo = bnpMultiplyUpperTo; + BigInteger2.prototype.modInt = bnpModInt; + BigInteger2.prototype.millerRabin = bnpMillerRabin; + BigInteger2.prototype.clone = bnClone; + BigInteger2.prototype.intValue = bnIntValue; + BigInteger2.prototype.byteValue = bnByteValue; + BigInteger2.prototype.shortValue = bnShortValue; + BigInteger2.prototype.signum = bnSigNum; + BigInteger2.prototype.toByteArray = bnToByteArray; + BigInteger2.prototype.equals = bnEquals; + BigInteger2.prototype.min = bnMin; + BigInteger2.prototype.max = bnMax; + BigInteger2.prototype.and = bnAnd; + BigInteger2.prototype.or = bnOr; + BigInteger2.prototype.xor = bnXor; + BigInteger2.prototype.andNot = bnAndNot; + BigInteger2.prototype.not = bnNot; + BigInteger2.prototype.shiftLeft = bnShiftLeft; + BigInteger2.prototype.shiftRight = bnShiftRight; + BigInteger2.prototype.getLowestSetBit = bnGetLowestSetBit; + BigInteger2.prototype.bitCount = bnBitCount; + BigInteger2.prototype.testBit = bnTestBit; + BigInteger2.prototype.setBit = bnSetBit; + BigInteger2.prototype.clearBit = bnClearBit; + BigInteger2.prototype.flipBit = bnFlipBit; + BigInteger2.prototype.add = bnAdd; + BigInteger2.prototype.subtract = bnSubtract; + BigInteger2.prototype.multiply = bnMultiply; + BigInteger2.prototype.divide = bnDivide; + BigInteger2.prototype.remainder = bnRemainder; + BigInteger2.prototype.divideAndRemainder = bnDivideAndRemainder; + BigInteger2.prototype.modPow = bnModPow; + BigInteger2.prototype.modInverse = bnModInverse; + BigInteger2.prototype.pow = bnPow; + BigInteger2.prototype.gcd = bnGCD; + BigInteger2.prototype.isProbablePrime = bnIsProbablePrime; + } +}); + +// node_modules/node-forge/lib/sha1.js +var require_sha1 = __commonJS({ + "node_modules/node-forge/lib/sha1.js"(exports, module) { + var forge2 = require_forge(); + require_md(); + require_util(); + var sha1 = module.exports = forge2.sha1 = forge2.sha1 || {}; + forge2.md.sha1 = forge2.md.algorithms.sha1 = sha1; + sha1.create = function() { + if (!_initialized) { + _init(); + } + var _state = null; + var _input = forge2.util.createBuffer(); + var _w = new Array(80); + var md = { + algorithm: "sha1", + blockLength: 64, + digestLength: 20, + // 56-bit length of message so far (does not including padding) + messageLength: 0, + // true message length + fullMessageLength: null, + // size of message length in bytes + messageLengthSize: 8 + }; + md.start = function() { + md.messageLength = 0; + md.fullMessageLength = md.messageLength64 = []; + var int32s = md.messageLengthSize / 4; + for (var i = 0; i < int32s; ++i) { + md.fullMessageLength.push(0); + } + _input = forge2.util.createBuffer(); + _state = { + h0: 1732584193, + h1: 4023233417, + h2: 2562383102, + h3: 271733878, + h4: 3285377520 + }; + return md; + }; + md.start(); + md.update = function(msg, encoding) { + if (encoding === "utf8") { + msg = forge2.util.encodeUtf8(msg); + } + var len = msg.length; + md.messageLength += len; + len = [len / 4294967296 >>> 0, len >>> 0]; + for (var i = md.fullMessageLength.length - 1; i >= 0; --i) { + md.fullMessageLength[i] += len[1]; + len[1] = len[0] + (md.fullMessageLength[i] / 4294967296 >>> 0); + md.fullMessageLength[i] = md.fullMessageLength[i] >>> 0; + len[0] = len[1] / 4294967296 >>> 0; + } + _input.putBytes(msg); + _update(_state, _w, _input); + if (_input.read > 2048 || _input.length() === 0) { + _input.compact(); + } + return md; + }; + md.digest = function() { + var finalBlock = forge2.util.createBuffer(); + finalBlock.putBytes(_input.bytes()); + var remaining = md.fullMessageLength[md.fullMessageLength.length - 1] + md.messageLengthSize; + var overflow = remaining & md.blockLength - 1; + finalBlock.putBytes(_padding.substr(0, md.blockLength - overflow)); + var next, carry; + var bits = md.fullMessageLength[0] * 8; + for (var i = 0; i < md.fullMessageLength.length - 1; ++i) { + next = md.fullMessageLength[i + 1] * 8; + carry = next / 4294967296 >>> 0; + bits += carry; + finalBlock.putInt32(bits >>> 0); + bits = next >>> 0; + } + finalBlock.putInt32(bits); + var s2 = { + h0: _state.h0, + h1: _state.h1, + h2: _state.h2, + h3: _state.h3, + h4: _state.h4 + }; + _update(s2, _w, finalBlock); + var rval = forge2.util.createBuffer(); + rval.putInt32(s2.h0); + rval.putInt32(s2.h1); + rval.putInt32(s2.h2); + rval.putInt32(s2.h3); + rval.putInt32(s2.h4); + return rval; + }; + return md; + }; + var _padding = null; + var _initialized = false; + function _init() { + _padding = String.fromCharCode(128); + _padding += forge2.util.fillString(String.fromCharCode(0), 64); + _initialized = true; + } + function _update(s, w, bytes) { + var t, a, b, c, d, e, f, i; + var len = bytes.length(); + while (len >= 64) { + a = s.h0; + b = s.h1; + c = s.h2; + d = s.h3; + e = s.h4; + for (i = 0; i < 16; ++i) { + t = bytes.getInt32(); + w[i] = t; + f = d ^ b & (c ^ d); + t = (a << 5 | a >>> 27) + f + e + 1518500249 + t; + e = d; + d = c; + c = (b << 30 | b >>> 2) >>> 0; + b = a; + a = t; + } + for (; i < 20; ++i) { + t = w[i - 3] ^ w[i - 8] ^ w[i - 14] ^ w[i - 16]; + t = t << 1 | t >>> 31; + w[i] = t; + f = d ^ b & (c ^ d); + t = (a << 5 | a >>> 27) + f + e + 1518500249 + t; + e = d; + d = c; + c = (b << 30 | b >>> 2) >>> 0; + b = a; + a = t; + } + for (; i < 32; ++i) { + t = w[i - 3] ^ w[i - 8] ^ w[i - 14] ^ w[i - 16]; + t = t << 1 | t >>> 31; + w[i] = t; + f = b ^ c ^ d; + t = (a << 5 | a >>> 27) + f + e + 1859775393 + t; + e = d; + d = c; + c = (b << 30 | b >>> 2) >>> 0; + b = a; + a = t; + } + for (; i < 40; ++i) { + t = w[i - 6] ^ w[i - 16] ^ w[i - 28] ^ w[i - 32]; + t = t << 2 | t >>> 30; + w[i] = t; + f = b ^ c ^ d; + t = (a << 5 | a >>> 27) + f + e + 1859775393 + t; + e = d; + d = c; + c = (b << 30 | b >>> 2) >>> 0; + b = a; + a = t; + } + for (; i < 60; ++i) { + t = w[i - 6] ^ w[i - 16] ^ w[i - 28] ^ w[i - 32]; + t = t << 2 | t >>> 30; + w[i] = t; + f = b & c | d & (b ^ c); + t = (a << 5 | a >>> 27) + f + e + 2400959708 + t; + e = d; + d = c; + c = (b << 30 | b >>> 2) >>> 0; + b = a; + a = t; + } + for (; i < 80; ++i) { + t = w[i - 6] ^ w[i - 16] ^ w[i - 28] ^ w[i - 32]; + t = t << 2 | t >>> 30; + w[i] = t; + f = b ^ c ^ d; + t = (a << 5 | a >>> 27) + f + e + 3395469782 + t; + e = d; + d = c; + c = (b << 30 | b >>> 2) >>> 0; + b = a; + a = t; + } + s.h0 = s.h0 + a | 0; + s.h1 = s.h1 + b | 0; + s.h2 = s.h2 + c | 0; + s.h3 = s.h3 + d | 0; + s.h4 = s.h4 + e | 0; + len -= 64; + } + } + } +}); + +// node_modules/node-forge/lib/pkcs1.js +var require_pkcs1 = __commonJS({ + "node_modules/node-forge/lib/pkcs1.js"(exports, module) { + var forge2 = require_forge(); + require_util(); + require_random(); + require_sha1(); + var pkcs1 = module.exports = forge2.pkcs1 = forge2.pkcs1 || {}; + pkcs1.encode_rsa_oaep = function(key, message, options) { + var label; + var seed; + var md; + var mgf1Md; + if (typeof options === "string") { + label = options; + seed = arguments[3] || void 0; + md = arguments[4] || void 0; + } else if (options) { + label = options.label || void 0; + seed = options.seed || void 0; + md = options.md || void 0; + if (options.mgf1 && options.mgf1.md) { + mgf1Md = options.mgf1.md; + } + } + if (!md) { + md = forge2.md.sha1.create(); + } else { + md.start(); + } + if (!mgf1Md) { + mgf1Md = md; + } + var keyLength = Math.ceil(key.n.bitLength() / 8); + var maxLength = keyLength - 2 * md.digestLength - 2; + if (message.length > maxLength) { + var error = new Error("RSAES-OAEP input message length is too long."); + error.length = message.length; + error.maxLength = maxLength; + throw error; + } + if (!label) { + label = ""; + } + md.update(label, "raw"); + var lHash = md.digest(); + var PS = ""; + var PS_length = maxLength - message.length; + for (var i = 0; i < PS_length; i++) { + PS += "\0"; + } + var DB = lHash.getBytes() + PS + "" + message; + if (!seed) { + seed = forge2.random.getBytes(md.digestLength); + } else if (seed.length !== md.digestLength) { + var error = new Error("Invalid RSAES-OAEP seed. The seed length must match the digest length."); + error.seedLength = seed.length; + error.digestLength = md.digestLength; + throw error; + } + var dbMask = rsa_mgf1(seed, keyLength - md.digestLength - 1, mgf1Md); + var maskedDB = forge2.util.xorBytes(DB, dbMask, DB.length); + var seedMask = rsa_mgf1(maskedDB, md.digestLength, mgf1Md); + var maskedSeed = forge2.util.xorBytes(seed, seedMask, seed.length); + return "\0" + maskedSeed + maskedDB; + }; + pkcs1.decode_rsa_oaep = function(key, em, options) { + var label; + var md; + var mgf1Md; + if (typeof options === "string") { + label = options; + md = arguments[3] || void 0; + } else if (options) { + label = options.label || void 0; + md = options.md || void 0; + if (options.mgf1 && options.mgf1.md) { + mgf1Md = options.mgf1.md; + } + } + var keyLength = Math.ceil(key.n.bitLength() / 8); + if (em.length !== keyLength) { + var error = new Error("RSAES-OAEP encoded message length is invalid."); + error.length = em.length; + error.expectedLength = keyLength; + throw error; + } + if (md === void 0) { + md = forge2.md.sha1.create(); + } else { + md.start(); + } + if (!mgf1Md) { + mgf1Md = md; + } + if (keyLength < 2 * md.digestLength + 2) { + throw new Error("RSAES-OAEP key is too short for the hash function."); + } + if (!label) { + label = ""; + } + md.update(label, "raw"); + var lHash = md.digest().getBytes(); + var y = em.charAt(0); + var maskedSeed = em.substring(1, md.digestLength + 1); + var maskedDB = em.substring(1 + md.digestLength); + var seedMask = rsa_mgf1(maskedDB, md.digestLength, mgf1Md); + var seed = forge2.util.xorBytes(maskedSeed, seedMask, maskedSeed.length); + var dbMask = rsa_mgf1(seed, keyLength - md.digestLength - 1, mgf1Md); + var db2 = forge2.util.xorBytes(maskedDB, dbMask, maskedDB.length); + var lHashPrime = db2.substring(0, md.digestLength); + var error = y !== "\0"; + for (var i = 0; i < md.digestLength; ++i) { + error |= lHash.charAt(i) !== lHashPrime.charAt(i); + } + var in_ps = 1; + var index = md.digestLength; + for (var j = md.digestLength; j < db2.length; j++) { + var code = db2.charCodeAt(j); + var is_0 = code & 1 ^ 1; + var error_mask = in_ps ? 65534 : 0; + error |= code & error_mask; + in_ps = in_ps & is_0; + index += in_ps; + } + if (error || db2.charCodeAt(index) !== 1) { + throw new Error("Invalid RSAES-OAEP padding."); + } + return db2.substring(index + 1); + }; + function rsa_mgf1(seed, maskLength, hash) { + if (!hash) { + hash = forge2.md.sha1.create(); + } + var t = ""; + var count = Math.ceil(maskLength / hash.digestLength); + for (var i = 0; i < count; ++i) { + var c = String.fromCharCode( + i >> 24 & 255, + i >> 16 & 255, + i >> 8 & 255, + i & 255 + ); + hash.start(); + hash.update(seed + c); + t += hash.digest().getBytes(); + } + return t.substring(0, maskLength); + } + } +}); + +// node_modules/node-forge/lib/prime.js +var require_prime = __commonJS({ + "node_modules/node-forge/lib/prime.js"(exports, module) { + var forge2 = require_forge(); + require_util(); + require_jsbn(); + require_random(); + (function() { + if (forge2.prime) { + module.exports = forge2.prime; + return; + } + var prime = module.exports = forge2.prime = forge2.prime || {}; + var BigInteger2 = forge2.jsbn.BigInteger; + var GCD_30_DELTA = [6, 4, 2, 4, 2, 4, 6, 2]; + var THIRTY = new BigInteger2(null); + THIRTY.fromInt(30); + var op_or = function(x, y) { + return x | y; + }; + prime.generateProbablePrime = function(bits, options, callback) { + if (typeof options === "function") { + callback = options; + options = {}; + } + options = options || {}; + var algorithm = options.algorithm || "PRIMEINC"; + if (typeof algorithm === "string") { + algorithm = { name: algorithm }; + } + algorithm.options = algorithm.options || {}; + var prng = options.prng || forge2.random; + var rng = { + // x is an array to fill with bytes + nextBytes: function(x) { + var b = prng.getBytesSync(x.length); + for (var i = 0; i < x.length; ++i) { + x[i] = b.charCodeAt(i); + } + } + }; + if (algorithm.name === "PRIMEINC") { + return primeincFindPrime(bits, rng, algorithm.options, callback); + } + throw new Error("Invalid prime generation algorithm: " + algorithm.name); + }; + function primeincFindPrime(bits, rng, options, callback) { + if ("workers" in options) { + return primeincFindPrimeWithWorkers(bits, rng, options, callback); + } + return primeincFindPrimeWithoutWorkers(bits, rng, options, callback); + } + function primeincFindPrimeWithoutWorkers(bits, rng, options, callback) { + var num = generateRandom(bits, rng); + var deltaIdx = 0; + var mrTests = getMillerRabinTests(num.bitLength()); + if ("millerRabinTests" in options) { + mrTests = options.millerRabinTests; + } + var maxBlockTime = 10; + if ("maxBlockTime" in options) { + maxBlockTime = options.maxBlockTime; + } + _primeinc(num, bits, rng, deltaIdx, mrTests, maxBlockTime, callback); + } + function _primeinc(num, bits, rng, deltaIdx, mrTests, maxBlockTime, callback) { + var start = +/* @__PURE__ */ new Date(); + do { + if (num.bitLength() > bits) { + num = generateRandom(bits, rng); + } + if (num.isProbablePrime(mrTests)) { + return callback(null, num); + } + num.dAddOffset(GCD_30_DELTA[deltaIdx++ % 8], 0); + } while (maxBlockTime < 0 || +/* @__PURE__ */ new Date() - start < maxBlockTime); + forge2.util.setImmediate(function() { + _primeinc(num, bits, rng, deltaIdx, mrTests, maxBlockTime, callback); + }); + } + function primeincFindPrimeWithWorkers(bits, rng, options, callback) { + if (typeof Worker === "undefined") { + return primeincFindPrimeWithoutWorkers(bits, rng, options, callback); + } + var num = generateRandom(bits, rng); + var numWorkers = options.workers; + var workLoad = options.workLoad || 100; + var range = workLoad * 30 / 8; + var workerScript = options.workerScript || "forge/prime.worker.js"; + if (numWorkers === -1) { + return forge2.util.estimateCores(function(err, cores) { + if (err) { + cores = 2; + } + numWorkers = cores - 1; + generate(); + }); + } + generate(); + function generate() { + numWorkers = Math.max(1, numWorkers); + var workers = []; + for (var i = 0; i < numWorkers; ++i) { + workers[i] = new Worker(workerScript); + } + var running = numWorkers; + for (var i = 0; i < numWorkers; ++i) { + workers[i].addEventListener("message", workerMessage); + } + var found = false; + function workerMessage(e) { + if (found) { + return; + } + --running; + var data = e.data; + if (data.found) { + for (var i2 = 0; i2 < workers.length; ++i2) { + workers[i2].terminate(); + } + found = true; + return callback(null, new BigInteger2(data.prime, 16)); + } + if (num.bitLength() > bits) { + num = generateRandom(bits, rng); + } + var hex = num.toString(16); + e.target.postMessage({ + hex, + workLoad + }); + num.dAddOffset(range, 0); + } + } + } + function generateRandom(bits, rng) { + var num = new BigInteger2(bits, rng); + var bits1 = bits - 1; + if (!num.testBit(bits1)) { + num.bitwiseTo(BigInteger2.ONE.shiftLeft(bits1), op_or, num); + } + num.dAddOffset(31 - num.mod(THIRTY).byteValue(), 0); + return num; + } + function getMillerRabinTests(bits) { + if (bits <= 100) return 27; + if (bits <= 150) return 18; + if (bits <= 200) return 15; + if (bits <= 250) return 12; + if (bits <= 300) return 9; + if (bits <= 350) return 8; + if (bits <= 400) return 7; + if (bits <= 500) return 6; + if (bits <= 600) return 5; + if (bits <= 800) return 4; + if (bits <= 1250) return 3; + return 2; + } + })(); + } +}); + +// node_modules/node-forge/lib/rsa.js +var require_rsa = __commonJS({ + "node_modules/node-forge/lib/rsa.js"(exports, module) { + var forge2 = require_forge(); + require_asn1(); + require_jsbn(); + require_oids(); + require_pkcs1(); + require_prime(); + require_random(); + require_util(); + if (typeof BigInteger2 === "undefined") { + BigInteger2 = forge2.jsbn.BigInteger; + } + var BigInteger2; + var _crypto = forge2.util.isNodejs ? __require("crypto") : null; + var asn1 = forge2.asn1; + var util = forge2.util; + forge2.pki = forge2.pki || {}; + module.exports = forge2.pki.rsa = forge2.rsa = forge2.rsa || {}; + var pki = forge2.pki; + var GCD_30_DELTA = [6, 4, 2, 4, 2, 4, 6, 2]; + var privateKeyValidator = { + // PrivateKeyInfo + name: "PrivateKeyInfo", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + // Version (INTEGER) + name: "PrivateKeyInfo.version", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.INTEGER, + constructed: false, + capture: "privateKeyVersion" + }, { + // privateKeyAlgorithm + name: "PrivateKeyInfo.privateKeyAlgorithm", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + name: "AlgorithmIdentifier.algorithm", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.OID, + constructed: false, + capture: "privateKeyOid" + }] + }, { + // PrivateKey + name: "PrivateKeyInfo", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.OCTETSTRING, + constructed: false, + capture: "privateKey" + }] + }; + var rsaPrivateKeyValidator = { + // RSAPrivateKey + name: "RSAPrivateKey", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + // Version (INTEGER) + name: "RSAPrivateKey.version", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.INTEGER, + constructed: false, + capture: "privateKeyVersion" + }, { + // modulus (n) + name: "RSAPrivateKey.modulus", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.INTEGER, + constructed: false, + capture: "privateKeyModulus" + }, { + // publicExponent (e) + name: "RSAPrivateKey.publicExponent", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.INTEGER, + constructed: false, + capture: "privateKeyPublicExponent" + }, { + // privateExponent (d) + name: "RSAPrivateKey.privateExponent", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.INTEGER, + constructed: false, + capture: "privateKeyPrivateExponent" + }, { + // prime1 (p) + name: "RSAPrivateKey.prime1", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.INTEGER, + constructed: false, + capture: "privateKeyPrime1" + }, { + // prime2 (q) + name: "RSAPrivateKey.prime2", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.INTEGER, + constructed: false, + capture: "privateKeyPrime2" + }, { + // exponent1 (d mod (p-1)) + name: "RSAPrivateKey.exponent1", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.INTEGER, + constructed: false, + capture: "privateKeyExponent1" + }, { + // exponent2 (d mod (q-1)) + name: "RSAPrivateKey.exponent2", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.INTEGER, + constructed: false, + capture: "privateKeyExponent2" + }, { + // coefficient ((inverse of q) mod p) + name: "RSAPrivateKey.coefficient", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.INTEGER, + constructed: false, + capture: "privateKeyCoefficient" + }] + }; + var rsaPublicKeyValidator = { + // RSAPublicKey + name: "RSAPublicKey", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + // modulus (n) + name: "RSAPublicKey.modulus", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.INTEGER, + constructed: false, + capture: "publicKeyModulus" + }, { + // publicExponent (e) + name: "RSAPublicKey.exponent", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.INTEGER, + constructed: false, + capture: "publicKeyExponent" + }] + }; + var publicKeyValidator = forge2.pki.rsa.publicKeyValidator = { + name: "SubjectPublicKeyInfo", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + captureAsn1: "subjectPublicKeyInfo", + value: [{ + name: "SubjectPublicKeyInfo.AlgorithmIdentifier", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + name: "AlgorithmIdentifier.algorithm", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.OID, + constructed: false, + capture: "publicKeyOid" + }] + }, { + // subjectPublicKey + name: "SubjectPublicKeyInfo.subjectPublicKey", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.BITSTRING, + constructed: false, + value: [{ + // RSAPublicKey + name: "SubjectPublicKeyInfo.subjectPublicKey.RSAPublicKey", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + optional: true, + captureAsn1: "rsaPublicKey" + }] + }] + }; + var digestInfoValidator = { + name: "DigestInfo", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + name: "DigestInfo.DigestAlgorithm", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + name: "DigestInfo.DigestAlgorithm.algorithmIdentifier", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.OID, + constructed: false, + capture: "algorithmIdentifier" + }, { + // NULL paramters + name: "DigestInfo.DigestAlgorithm.parameters", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.NULL, + // captured only to check existence for md2 and md5 + capture: "parameters", + optional: true, + constructed: false + }] + }, { + // digest + name: "DigestInfo.digest", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.OCTETSTRING, + constructed: false, + capture: "digest" + }] + }; + var emsaPkcs1v15encode = function(md) { + var oid; + if (md.algorithm in pki.oids) { + oid = pki.oids[md.algorithm]; + } else { + var error = new Error("Unknown message digest algorithm."); + error.algorithm = md.algorithm; + throw error; + } + var oidBytes = asn1.oidToDer(oid).getBytes(); + var digestInfo = asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.SEQUENCE, + true, + [] + ); + var digestAlgorithm = asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.SEQUENCE, + true, + [] + ); + digestAlgorithm.value.push(asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + oidBytes + )); + digestAlgorithm.value.push(asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.NULL, + false, + "" + )); + var digest = asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OCTETSTRING, + false, + md.digest().getBytes() + ); + digestInfo.value.push(digestAlgorithm); + digestInfo.value.push(digest); + return asn1.toDer(digestInfo).getBytes(); + }; + var _modPow = function(x, key, pub) { + if (pub) { + return x.modPow(key.e, key.n); + } + if (!key.p || !key.q) { + return x.modPow(key.d, key.n); + } + if (!key.dP) { + key.dP = key.d.mod(key.p.subtract(BigInteger2.ONE)); + } + if (!key.dQ) { + key.dQ = key.d.mod(key.q.subtract(BigInteger2.ONE)); + } + if (!key.qInv) { + key.qInv = key.q.modInverse(key.p); + } + var r; + do { + r = new BigInteger2( + forge2.util.bytesToHex(forge2.random.getBytes(key.n.bitLength() / 8)), + 16 + ); + } while (r.compareTo(key.n) >= 0 || !r.gcd(key.n).equals(BigInteger2.ONE)); + x = x.multiply(r.modPow(key.e, key.n)).mod(key.n); + var xp = x.mod(key.p).modPow(key.dP, key.p); + var xq = x.mod(key.q).modPow(key.dQ, key.q); + while (xp.compareTo(xq) < 0) { + xp = xp.add(key.p); + } + var y = xp.subtract(xq).multiply(key.qInv).mod(key.p).multiply(key.q).add(xq); + y = y.multiply(r.modInverse(key.n)).mod(key.n); + return y; + }; + pki.rsa.encrypt = function(m, key, bt) { + var pub = bt; + var eb; + var k = Math.ceil(key.n.bitLength() / 8); + if (bt !== false && bt !== true) { + pub = bt === 2; + eb = _encodePkcs1_v1_5(m, key, bt); + } else { + eb = forge2.util.createBuffer(); + eb.putBytes(m); + } + var x = new BigInteger2(eb.toHex(), 16); + var y = _modPow(x, key, pub); + var yhex = y.toString(16); + var ed = forge2.util.createBuffer(); + var zeros = k - Math.ceil(yhex.length / 2); + while (zeros > 0) { + ed.putByte(0); + --zeros; + } + ed.putBytes(forge2.util.hexToBytes(yhex)); + return ed.getBytes(); + }; + pki.rsa.decrypt = function(ed, key, pub, ml) { + var k = Math.ceil(key.n.bitLength() / 8); + if (ed.length !== k) { + var error = new Error("Encrypted message length is invalid."); + error.length = ed.length; + error.expected = k; + throw error; + } + var y = new BigInteger2(forge2.util.createBuffer(ed).toHex(), 16); + if (y.compareTo(key.n) >= 0) { + throw new Error("Encrypted message is invalid."); + } + var x = _modPow(y, key, pub); + var xhex = x.toString(16); + var eb = forge2.util.createBuffer(); + var zeros = k - Math.ceil(xhex.length / 2); + while (zeros > 0) { + eb.putByte(0); + --zeros; + } + eb.putBytes(forge2.util.hexToBytes(xhex)); + if (ml !== false) { + return _decodePkcs1_v1_5(eb.getBytes(), key, pub); + } + return eb.getBytes(); + }; + pki.rsa.createKeyPairGenerationState = function(bits, e, options) { + if (typeof bits === "string") { + bits = parseInt(bits, 10); + } + bits = bits || 2048; + options = options || {}; + var prng = options.prng || forge2.random; + var rng = { + // x is an array to fill with bytes + nextBytes: function(x) { + var b = prng.getBytesSync(x.length); + for (var i = 0; i < x.length; ++i) { + x[i] = b.charCodeAt(i); + } + } + }; + var algorithm = options.algorithm || "PRIMEINC"; + var rval; + if (algorithm === "PRIMEINC") { + rval = { + algorithm, + state: 0, + bits, + rng, + eInt: e || 65537, + e: new BigInteger2(null), + p: null, + q: null, + qBits: bits >> 1, + pBits: bits - (bits >> 1), + pqState: 0, + num: null, + keys: null + }; + rval.e.fromInt(rval.eInt); + } else { + throw new Error("Invalid key generation algorithm: " + algorithm); + } + return rval; + }; + pki.rsa.stepKeyPairGenerationState = function(state, n) { + if (!("algorithm" in state)) { + state.algorithm = "PRIMEINC"; + } + var THIRTY = new BigInteger2(null); + THIRTY.fromInt(30); + var deltaIdx = 0; + var op_or = function(x, y) { + return x | y; + }; + var t1 = +/* @__PURE__ */ new Date(); + var t2; + var total = 0; + while (state.keys === null && (n <= 0 || total < n)) { + if (state.state === 0) { + var bits = state.p === null ? state.pBits : state.qBits; + var bits1 = bits - 1; + if (state.pqState === 0) { + state.num = new BigInteger2(bits, state.rng); + if (!state.num.testBit(bits1)) { + state.num.bitwiseTo( + BigInteger2.ONE.shiftLeft(bits1), + op_or, + state.num + ); + } + state.num.dAddOffset(31 - state.num.mod(THIRTY).byteValue(), 0); + deltaIdx = 0; + ++state.pqState; + } else if (state.pqState === 1) { + if (state.num.bitLength() > bits) { + state.pqState = 0; + } else if (state.num.isProbablePrime( + _getMillerRabinTests(state.num.bitLength()) + )) { + ++state.pqState; + } else { + state.num.dAddOffset(GCD_30_DELTA[deltaIdx++ % 8], 0); + } + } else if (state.pqState === 2) { + state.pqState = state.num.subtract(BigInteger2.ONE).gcd(state.e).compareTo(BigInteger2.ONE) === 0 ? 3 : 0; + } else if (state.pqState === 3) { + state.pqState = 0; + if (state.p === null) { + state.p = state.num; + } else { + state.q = state.num; + } + if (state.p !== null && state.q !== null) { + ++state.state; + } + state.num = null; + } + } else if (state.state === 1) { + if (state.p.compareTo(state.q) < 0) { + state.num = state.p; + state.p = state.q; + state.q = state.num; + } + ++state.state; + } else if (state.state === 2) { + state.p1 = state.p.subtract(BigInteger2.ONE); + state.q1 = state.q.subtract(BigInteger2.ONE); + state.phi = state.p1.multiply(state.q1); + ++state.state; + } else if (state.state === 3) { + if (state.phi.gcd(state.e).compareTo(BigInteger2.ONE) === 0) { + ++state.state; + } else { + state.p = null; + state.q = null; + state.state = 0; + } + } else if (state.state === 4) { + state.n = state.p.multiply(state.q); + if (state.n.bitLength() === state.bits) { + ++state.state; + } else { + state.q = null; + state.state = 0; + } + } else if (state.state === 5) { + var d = state.e.modInverse(state.phi); + state.keys = { + privateKey: pki.rsa.setPrivateKey( + state.n, + state.e, + d, + state.p, + state.q, + d.mod(state.p1), + d.mod(state.q1), + state.q.modInverse(state.p) + ), + publicKey: pki.rsa.setPublicKey(state.n, state.e) + }; + } + t2 = +/* @__PURE__ */ new Date(); + total += t2 - t1; + t1 = t2; + } + return state.keys !== null; + }; + pki.rsa.generateKeyPair = function(bits, e, options, callback) { + if (arguments.length === 1) { + if (typeof bits === "object") { + options = bits; + bits = void 0; + } else if (typeof bits === "function") { + callback = bits; + bits = void 0; + } + } else if (arguments.length === 2) { + if (typeof bits === "number") { + if (typeof e === "function") { + callback = e; + e = void 0; + } else if (typeof e !== "number") { + options = e; + e = void 0; + } + } else { + options = bits; + callback = e; + bits = void 0; + e = void 0; + } + } else if (arguments.length === 3) { + if (typeof e === "number") { + if (typeof options === "function") { + callback = options; + options = void 0; + } + } else { + callback = options; + options = e; + e = void 0; + } + } + options = options || {}; + if (bits === void 0) { + bits = options.bits || 2048; + } + if (e === void 0) { + e = options.e || 65537; + } + if (!forge2.options.usePureJavaScript && !options.prng && bits >= 256 && bits <= 16384 && (e === 65537 || e === 3)) { + if (callback) { + if (_detectNodeCrypto("generateKeyPair")) { + return _crypto.generateKeyPair("rsa", { + modulusLength: bits, + publicExponent: e, + publicKeyEncoding: { + type: "spki", + format: "pem" + }, + privateKeyEncoding: { + type: "pkcs8", + format: "pem" + } + }, function(err, pub, priv) { + if (err) { + return callback(err); + } + callback(null, { + privateKey: pki.privateKeyFromPem(priv), + publicKey: pki.publicKeyFromPem(pub) + }); + }); + } + if (_detectSubtleCrypto("generateKey") && _detectSubtleCrypto("exportKey")) { + return util.globalScope.crypto.subtle.generateKey({ + name: "RSASSA-PKCS1-v1_5", + modulusLength: bits, + publicExponent: _intToUint8Array(e), + hash: { name: "SHA-256" } + }, true, ["sign", "verify"]).then(function(pair) { + return util.globalScope.crypto.subtle.exportKey( + "pkcs8", + pair.privateKey + ); + }).then(void 0, function(err) { + callback(err); + }).then(function(pkcs8) { + if (pkcs8) { + var privateKey = pki.privateKeyFromAsn1( + asn1.fromDer(forge2.util.createBuffer(pkcs8)) + ); + callback(null, { + privateKey, + publicKey: pki.setRsaPublicKey(privateKey.n, privateKey.e) + }); + } + }); + } + if (_detectSubtleMsCrypto("generateKey") && _detectSubtleMsCrypto("exportKey")) { + var genOp = util.globalScope.msCrypto.subtle.generateKey({ + name: "RSASSA-PKCS1-v1_5", + modulusLength: bits, + publicExponent: _intToUint8Array(e), + hash: { name: "SHA-256" } + }, true, ["sign", "verify"]); + genOp.oncomplete = function(e2) { + var pair = e2.target.result; + var exportOp = util.globalScope.msCrypto.subtle.exportKey( + "pkcs8", + pair.privateKey + ); + exportOp.oncomplete = function(e3) { + var pkcs8 = e3.target.result; + var privateKey = pki.privateKeyFromAsn1( + asn1.fromDer(forge2.util.createBuffer(pkcs8)) + ); + callback(null, { + privateKey, + publicKey: pki.setRsaPublicKey(privateKey.n, privateKey.e) + }); + }; + exportOp.onerror = function(err) { + callback(err); + }; + }; + genOp.onerror = function(err) { + callback(err); + }; + return; + } + } else { + if (_detectNodeCrypto("generateKeyPairSync")) { + var keypair = _crypto.generateKeyPairSync("rsa", { + modulusLength: bits, + publicExponent: e, + publicKeyEncoding: { + type: "spki", + format: "pem" + }, + privateKeyEncoding: { + type: "pkcs8", + format: "pem" + } + }); + return { + privateKey: pki.privateKeyFromPem(keypair.privateKey), + publicKey: pki.publicKeyFromPem(keypair.publicKey) + }; + } + } + } + var state = pki.rsa.createKeyPairGenerationState(bits, e, options); + if (!callback) { + pki.rsa.stepKeyPairGenerationState(state, 0); + return state.keys; + } + _generateKeyPair(state, options, callback); + }; + pki.setRsaPublicKey = pki.rsa.setPublicKey = function(n, e) { + var key = { + n, + e + }; + key.encrypt = function(data, scheme, schemeOptions) { + if (typeof scheme === "string") { + scheme = scheme.toUpperCase(); + } else if (scheme === void 0) { + scheme = "RSAES-PKCS1-V1_5"; + } + if (scheme === "RSAES-PKCS1-V1_5") { + scheme = { + encode: function(m, key2, pub) { + return _encodePkcs1_v1_5(m, key2, 2).getBytes(); + } + }; + } else if (scheme === "RSA-OAEP" || scheme === "RSAES-OAEP") { + scheme = { + encode: function(m, key2) { + return forge2.pkcs1.encode_rsa_oaep(key2, m, schemeOptions); + } + }; + } else if (["RAW", "NONE", "NULL", null].indexOf(scheme) !== -1) { + scheme = { encode: function(e3) { + return e3; + } }; + } else if (typeof scheme === "string") { + throw new Error('Unsupported encryption scheme: "' + scheme + '".'); + } + var e2 = scheme.encode(data, key, true); + return pki.rsa.encrypt(e2, key, true); + }; + key.verify = function(digest, signature, scheme, options) { + if (typeof scheme === "string") { + scheme = scheme.toUpperCase(); + } else if (scheme === void 0) { + scheme = "RSASSA-PKCS1-V1_5"; + } + if (options === void 0) { + options = { + _parseAllDigestBytes: true + }; + } + if (!("_parseAllDigestBytes" in options)) { + options._parseAllDigestBytes = true; + } + if (scheme === "RSASSA-PKCS1-V1_5") { + scheme = { + verify: function(digest2, d2) { + d2 = _decodePkcs1_v1_5(d2, key, true); + var obj = asn1.fromDer(d2, { + parseAllBytes: options._parseAllDigestBytes + }); + var capture = {}; + var errors = []; + if (!asn1.validate(obj, digestInfoValidator, capture, errors)) { + var error = new Error( + "ASN.1 object does not contain a valid RSASSA-PKCS1-v1_5 DigestInfo value." + ); + error.errors = errors; + throw error; + } + var oid = asn1.derToOid(capture.algorithmIdentifier); + if (!(oid === forge2.oids.md2 || oid === forge2.oids.md5 || oid === forge2.oids.sha1 || oid === forge2.oids.sha224 || oid === forge2.oids.sha256 || oid === forge2.oids.sha384 || oid === forge2.oids.sha512 || oid === forge2.oids["sha512-224"] || oid === forge2.oids["sha512-256"])) { + var error = new Error( + "Unknown RSASSA-PKCS1-v1_5 DigestAlgorithm identifier." + ); + error.oid = oid; + throw error; + } + if (oid === forge2.oids.md2 || oid === forge2.oids.md5) { + if (!("parameters" in capture)) { + throw new Error( + "ASN.1 object does not contain a valid RSASSA-PKCS1-v1_5 DigestInfo value. Missing algorithm identifer NULL parameters." + ); + } + } + return digest2 === capture.digest; + } + }; + } else if (scheme === "NONE" || scheme === "NULL" || scheme === null) { + scheme = { + verify: function(digest2, d2) { + d2 = _decodePkcs1_v1_5(d2, key, true); + return digest2 === d2; + } + }; + } + var d = pki.rsa.decrypt(signature, key, true, false); + return scheme.verify(digest, d, key.n.bitLength()); + }; + return key; + }; + pki.setRsaPrivateKey = pki.rsa.setPrivateKey = function(n, e, d, p, q, dP, dQ, qInv) { + var key = { + n, + e, + d, + p, + q, + dP, + dQ, + qInv + }; + key.decrypt = function(data, scheme, schemeOptions) { + if (typeof scheme === "string") { + scheme = scheme.toUpperCase(); + } else if (scheme === void 0) { + scheme = "RSAES-PKCS1-V1_5"; + } + var d2 = pki.rsa.decrypt(data, key, false, false); + if (scheme === "RSAES-PKCS1-V1_5") { + scheme = { decode: _decodePkcs1_v1_5 }; + } else if (scheme === "RSA-OAEP" || scheme === "RSAES-OAEP") { + scheme = { + decode: function(d3, key2) { + return forge2.pkcs1.decode_rsa_oaep(key2, d3, schemeOptions); + } + }; + } else if (["RAW", "NONE", "NULL", null].indexOf(scheme) !== -1) { + scheme = { decode: function(d3) { + return d3; + } }; + } else { + throw new Error('Unsupported encryption scheme: "' + scheme + '".'); + } + return scheme.decode(d2, key, false); + }; + key.sign = function(md, scheme) { + var bt = false; + if (typeof scheme === "string") { + scheme = scheme.toUpperCase(); + } + if (scheme === void 0 || scheme === "RSASSA-PKCS1-V1_5") { + scheme = { encode: emsaPkcs1v15encode }; + bt = 1; + } else if (scheme === "NONE" || scheme === "NULL" || scheme === null) { + scheme = { encode: function() { + return md; + } }; + bt = 1; + } + var d2 = scheme.encode(md, key.n.bitLength()); + return pki.rsa.encrypt(d2, key, bt); + }; + return key; + }; + pki.wrapRsaPrivateKey = function(rsaKey) { + return asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // version (0) + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.INTEGER, + false, + asn1.integerToDer(0).getBytes() + ), + // privateKeyAlgorithm + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + asn1.oidToDer(pki.oids.rsaEncryption).getBytes() + ), + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.NULL, false, "") + ]), + // PrivateKey + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OCTETSTRING, + false, + asn1.toDer(rsaKey).getBytes() + ) + ]); + }; + pki.privateKeyFromAsn1 = function(obj) { + var capture = {}; + var errors = []; + if (asn1.validate(obj, privateKeyValidator, capture, errors)) { + obj = asn1.fromDer(forge2.util.createBuffer(capture.privateKey)); + } + capture = {}; + errors = []; + if (!asn1.validate(obj, rsaPrivateKeyValidator, capture, errors)) { + var error = new Error("Cannot read private key. ASN.1 object does not contain an RSAPrivateKey."); + error.errors = errors; + throw error; + } + var n, e, d, p, q, dP, dQ, qInv; + n = forge2.util.createBuffer(capture.privateKeyModulus).toHex(); + e = forge2.util.createBuffer(capture.privateKeyPublicExponent).toHex(); + d = forge2.util.createBuffer(capture.privateKeyPrivateExponent).toHex(); + p = forge2.util.createBuffer(capture.privateKeyPrime1).toHex(); + q = forge2.util.createBuffer(capture.privateKeyPrime2).toHex(); + dP = forge2.util.createBuffer(capture.privateKeyExponent1).toHex(); + dQ = forge2.util.createBuffer(capture.privateKeyExponent2).toHex(); + qInv = forge2.util.createBuffer(capture.privateKeyCoefficient).toHex(); + return pki.setRsaPrivateKey( + new BigInteger2(n, 16), + new BigInteger2(e, 16), + new BigInteger2(d, 16), + new BigInteger2(p, 16), + new BigInteger2(q, 16), + new BigInteger2(dP, 16), + new BigInteger2(dQ, 16), + new BigInteger2(qInv, 16) + ); + }; + pki.privateKeyToAsn1 = pki.privateKeyToRSAPrivateKey = function(key) { + return asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // version (0 = only 2 primes, 1 multiple primes) + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.INTEGER, + false, + asn1.integerToDer(0).getBytes() + ), + // modulus (n) + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.INTEGER, + false, + _bnToBytes(key.n) + ), + // publicExponent (e) + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.INTEGER, + false, + _bnToBytes(key.e) + ), + // privateExponent (d) + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.INTEGER, + false, + _bnToBytes(key.d) + ), + // privateKeyPrime1 (p) + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.INTEGER, + false, + _bnToBytes(key.p) + ), + // privateKeyPrime2 (q) + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.INTEGER, + false, + _bnToBytes(key.q) + ), + // privateKeyExponent1 (dP) + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.INTEGER, + false, + _bnToBytes(key.dP) + ), + // privateKeyExponent2 (dQ) + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.INTEGER, + false, + _bnToBytes(key.dQ) + ), + // coefficient (qInv) + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.INTEGER, + false, + _bnToBytes(key.qInv) + ) + ]); + }; + pki.publicKeyFromAsn1 = function(obj) { + var capture = {}; + var errors = []; + if (asn1.validate(obj, publicKeyValidator, capture, errors)) { + var oid = asn1.derToOid(capture.publicKeyOid); + if (oid !== pki.oids.rsaEncryption) { + var error = new Error("Cannot read public key. Unknown OID."); + error.oid = oid; + throw error; + } + obj = capture.rsaPublicKey; + } + errors = []; + if (!asn1.validate(obj, rsaPublicKeyValidator, capture, errors)) { + var error = new Error("Cannot read public key. ASN.1 object does not contain an RSAPublicKey."); + error.errors = errors; + throw error; + } + var n = forge2.util.createBuffer(capture.publicKeyModulus).toHex(); + var e = forge2.util.createBuffer(capture.publicKeyExponent).toHex(); + return pki.setRsaPublicKey( + new BigInteger2(n, 16), + new BigInteger2(e, 16) + ); + }; + pki.publicKeyToAsn1 = pki.publicKeyToSubjectPublicKeyInfo = function(key) { + return asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // AlgorithmIdentifier + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // algorithm + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + asn1.oidToDer(pki.oids.rsaEncryption).getBytes() + ), + // parameters (null) + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.NULL, false, "") + ]), + // subjectPublicKey + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.BITSTRING, false, [ + pki.publicKeyToRSAPublicKey(key) + ]) + ]); + }; + pki.publicKeyToRSAPublicKey = function(key) { + return asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // modulus (n) + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.INTEGER, + false, + _bnToBytes(key.n) + ), + // publicExponent (e) + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.INTEGER, + false, + _bnToBytes(key.e) + ) + ]); + }; + function _encodePkcs1_v1_5(m, key, bt) { + var eb = forge2.util.createBuffer(); + var k = Math.ceil(key.n.bitLength() / 8); + if (m.length > k - 11) { + var error = new Error("Message is too long for PKCS#1 v1.5 padding."); + error.length = m.length; + error.max = k - 11; + throw error; + } + eb.putByte(0); + eb.putByte(bt); + var padNum = k - 3 - m.length; + var padByte; + if (bt === 0 || bt === 1) { + padByte = bt === 0 ? 0 : 255; + for (var i = 0; i < padNum; ++i) { + eb.putByte(padByte); + } + } else { + while (padNum > 0) { + var numZeros = 0; + var padBytes = forge2.random.getBytes(padNum); + for (var i = 0; i < padNum; ++i) { + padByte = padBytes.charCodeAt(i); + if (padByte === 0) { + ++numZeros; + } else { + eb.putByte(padByte); + } + } + padNum = numZeros; + } + } + eb.putByte(0); + eb.putBytes(m); + return eb; + } + function _decodePkcs1_v1_5(em, key, pub, ml) { + var k = Math.ceil(key.n.bitLength() / 8); + var eb = forge2.util.createBuffer(em); + var first = eb.getByte(); + var bt = eb.getByte(); + if (first !== 0 || pub && bt !== 0 && bt !== 1 || !pub && bt != 2 || pub && bt === 0 && typeof ml === "undefined") { + throw new Error("Encryption block is invalid."); + } + var padNum = 0; + if (bt === 0) { + padNum = k - 3 - ml; + for (var i = 0; i < padNum; ++i) { + if (eb.getByte() !== 0) { + throw new Error("Encryption block is invalid."); + } + } + } else if (bt === 1) { + padNum = 0; + while (eb.length() > 1) { + if (eb.getByte() !== 255) { + --eb.read; + break; + } + ++padNum; + } + } else if (bt === 2) { + padNum = 0; + while (eb.length() > 1) { + if (eb.getByte() === 0) { + --eb.read; + break; + } + ++padNum; + } + } + var zero = eb.getByte(); + if (zero !== 0 || padNum !== k - 3 - eb.length()) { + throw new Error("Encryption block is invalid."); + } + return eb.getBytes(); + } + function _generateKeyPair(state, options, callback) { + if (typeof options === "function") { + callback = options; + options = {}; + } + options = options || {}; + var opts = { + algorithm: { + name: options.algorithm || "PRIMEINC", + options: { + workers: options.workers || 2, + workLoad: options.workLoad || 100, + workerScript: options.workerScript + } + } + }; + if ("prng" in options) { + opts.prng = options.prng; + } + generate(); + function generate() { + getPrime(state.pBits, function(err, num) { + if (err) { + return callback(err); + } + state.p = num; + if (state.q !== null) { + return finish(err, state.q); + } + getPrime(state.qBits, finish); + }); + } + function getPrime(bits, callback2) { + forge2.prime.generateProbablePrime(bits, opts, callback2); + } + function finish(err, num) { + if (err) { + return callback(err); + } + state.q = num; + if (state.p.compareTo(state.q) < 0) { + var tmp = state.p; + state.p = state.q; + state.q = tmp; + } + if (state.p.subtract(BigInteger2.ONE).gcd(state.e).compareTo(BigInteger2.ONE) !== 0) { + state.p = null; + generate(); + return; + } + if (state.q.subtract(BigInteger2.ONE).gcd(state.e).compareTo(BigInteger2.ONE) !== 0) { + state.q = null; + getPrime(state.qBits, finish); + return; + } + state.p1 = state.p.subtract(BigInteger2.ONE); + state.q1 = state.q.subtract(BigInteger2.ONE); + state.phi = state.p1.multiply(state.q1); + if (state.phi.gcd(state.e).compareTo(BigInteger2.ONE) !== 0) { + state.p = state.q = null; + generate(); + return; + } + state.n = state.p.multiply(state.q); + if (state.n.bitLength() !== state.bits) { + state.q = null; + getPrime(state.qBits, finish); + return; + } + var d = state.e.modInverse(state.phi); + state.keys = { + privateKey: pki.rsa.setPrivateKey( + state.n, + state.e, + d, + state.p, + state.q, + d.mod(state.p1), + d.mod(state.q1), + state.q.modInverse(state.p) + ), + publicKey: pki.rsa.setPublicKey(state.n, state.e) + }; + callback(null, state.keys); + } + } + function _bnToBytes(b) { + var hex = b.toString(16); + if (hex[0] >= "8") { + hex = "00" + hex; + } + var bytes = forge2.util.hexToBytes(hex); + if (bytes.length > 1 && // leading 0x00 for positive integer + (bytes.charCodeAt(0) === 0 && (bytes.charCodeAt(1) & 128) === 0 || // leading 0xFF for negative integer + bytes.charCodeAt(0) === 255 && (bytes.charCodeAt(1) & 128) === 128)) { + return bytes.substr(1); + } + return bytes; + } + function _getMillerRabinTests(bits) { + if (bits <= 100) return 27; + if (bits <= 150) return 18; + if (bits <= 200) return 15; + if (bits <= 250) return 12; + if (bits <= 300) return 9; + if (bits <= 350) return 8; + if (bits <= 400) return 7; + if (bits <= 500) return 6; + if (bits <= 600) return 5; + if (bits <= 800) return 4; + if (bits <= 1250) return 3; + return 2; + } + function _detectNodeCrypto(fn) { + return forge2.util.isNodejs && typeof _crypto[fn] === "function"; + } + function _detectSubtleCrypto(fn) { + return typeof util.globalScope !== "undefined" && typeof util.globalScope.crypto === "object" && typeof util.globalScope.crypto.subtle === "object" && typeof util.globalScope.crypto.subtle[fn] === "function"; + } + function _detectSubtleMsCrypto(fn) { + return typeof util.globalScope !== "undefined" && typeof util.globalScope.msCrypto === "object" && typeof util.globalScope.msCrypto.subtle === "object" && typeof util.globalScope.msCrypto.subtle[fn] === "function"; + } + function _intToUint8Array(x) { + var bytes = forge2.util.hexToBytes(x.toString(16)); + var buffer = new Uint8Array(bytes.length); + for (var i = 0; i < bytes.length; ++i) { + buffer[i] = bytes.charCodeAt(i); + } + return buffer; + } + } +}); + +// node_modules/node-forge/lib/pbe.js +var require_pbe = __commonJS({ + "node_modules/node-forge/lib/pbe.js"(exports, module) { + var forge2 = require_forge(); + require_aes(); + require_asn1(); + require_des(); + require_md(); + require_oids(); + require_pbkdf2(); + require_pem(); + require_random(); + require_rc2(); + require_rsa(); + require_util(); + if (typeof BigInteger2 === "undefined") { + BigInteger2 = forge2.jsbn.BigInteger; + } + var BigInteger2; + var asn1 = forge2.asn1; + var pki = forge2.pki = forge2.pki || {}; + module.exports = pki.pbe = forge2.pbe = forge2.pbe || {}; + var oids = pki.oids; + var encryptedPrivateKeyValidator = { + name: "EncryptedPrivateKeyInfo", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + name: "EncryptedPrivateKeyInfo.encryptionAlgorithm", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + name: "AlgorithmIdentifier.algorithm", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.OID, + constructed: false, + capture: "encryptionOid" + }, { + name: "AlgorithmIdentifier.parameters", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + captureAsn1: "encryptionParams" + }] + }, { + // encryptedData + name: "EncryptedPrivateKeyInfo.encryptedData", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.OCTETSTRING, + constructed: false, + capture: "encryptedData" + }] + }; + var PBES2AlgorithmsValidator = { + name: "PBES2Algorithms", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + name: "PBES2Algorithms.keyDerivationFunc", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + name: "PBES2Algorithms.keyDerivationFunc.oid", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.OID, + constructed: false, + capture: "kdfOid" + }, { + name: "PBES2Algorithms.params", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + name: "PBES2Algorithms.params.salt", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.OCTETSTRING, + constructed: false, + capture: "kdfSalt" + }, { + name: "PBES2Algorithms.params.iterationCount", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.INTEGER, + constructed: false, + capture: "kdfIterationCount" + }, { + name: "PBES2Algorithms.params.keyLength", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.INTEGER, + constructed: false, + optional: true, + capture: "keyLength" + }, { + // prf + name: "PBES2Algorithms.params.prf", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + optional: true, + value: [{ + name: "PBES2Algorithms.params.prf.algorithm", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.OID, + constructed: false, + capture: "prfOid" + }] + }] + }] + }, { + name: "PBES2Algorithms.encryptionScheme", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + name: "PBES2Algorithms.encryptionScheme.oid", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.OID, + constructed: false, + capture: "encOid" + }, { + name: "PBES2Algorithms.encryptionScheme.iv", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.OCTETSTRING, + constructed: false, + capture: "encIv" + }] + }] + }; + var pkcs12PbeParamsValidator = { + name: "pkcs-12PbeParams", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + name: "pkcs-12PbeParams.salt", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.OCTETSTRING, + constructed: false, + capture: "salt" + }, { + name: "pkcs-12PbeParams.iterations", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.INTEGER, + constructed: false, + capture: "iterations" + }] + }; + pki.encryptPrivateKeyInfo = function(obj, password, options) { + options = options || {}; + options.saltSize = options.saltSize || 8; + options.count = options.count || 2048; + options.algorithm = options.algorithm || "aes128"; + options.prfAlgorithm = options.prfAlgorithm || "sha1"; + var salt = forge2.random.getBytesSync(options.saltSize); + var count = options.count; + var countBytes = asn1.integerToDer(count); + var dkLen; + var encryptionAlgorithm; + var encryptedData; + if (options.algorithm.indexOf("aes") === 0 || options.algorithm === "des") { + var ivLen, encOid, cipherFn; + switch (options.algorithm) { + case "aes128": + dkLen = 16; + ivLen = 16; + encOid = oids["aes128-CBC"]; + cipherFn = forge2.aes.createEncryptionCipher; + break; + case "aes192": + dkLen = 24; + ivLen = 16; + encOid = oids["aes192-CBC"]; + cipherFn = forge2.aes.createEncryptionCipher; + break; + case "aes256": + dkLen = 32; + ivLen = 16; + encOid = oids["aes256-CBC"]; + cipherFn = forge2.aes.createEncryptionCipher; + break; + case "des": + dkLen = 8; + ivLen = 8; + encOid = oids["desCBC"]; + cipherFn = forge2.des.createEncryptionCipher; + break; + default: + var error = new Error("Cannot encrypt private key. Unknown encryption algorithm."); + error.algorithm = options.algorithm; + throw error; + } + var prfAlgorithm = "hmacWith" + options.prfAlgorithm.toUpperCase(); + var md = prfAlgorithmToMessageDigest(prfAlgorithm); + var dk = forge2.pkcs5.pbkdf2(password, salt, count, dkLen, md); + var iv = forge2.random.getBytesSync(ivLen); + var cipher = cipherFn(dk); + cipher.start(iv); + cipher.update(asn1.toDer(obj)); + cipher.finish(); + encryptedData = cipher.output.getBytes(); + var params = createPbkdf2Params(salt, countBytes, dkLen, prfAlgorithm); + encryptionAlgorithm = asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.SEQUENCE, + true, + [ + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + asn1.oidToDer(oids["pkcs5PBES2"]).getBytes() + ), + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // keyDerivationFunc + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + asn1.oidToDer(oids["pkcs5PBKDF2"]).getBytes() + ), + // PBKDF2-params + params + ]), + // encryptionScheme + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + asn1.oidToDer(encOid).getBytes() + ), + // iv + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OCTETSTRING, + false, + iv + ) + ]) + ]) + ] + ); + } else if (options.algorithm === "3des") { + dkLen = 24; + var saltBytes = new forge2.util.ByteBuffer(salt); + var dk = pki.pbe.generatePkcs12Key(password, saltBytes, 1, count, dkLen); + var iv = pki.pbe.generatePkcs12Key(password, saltBytes, 2, count, dkLen); + var cipher = forge2.des.createEncryptionCipher(dk); + cipher.start(iv); + cipher.update(asn1.toDer(obj)); + cipher.finish(); + encryptedData = cipher.output.getBytes(); + encryptionAlgorithm = asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.SEQUENCE, + true, + [ + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + asn1.oidToDer(oids["pbeWithSHAAnd3-KeyTripleDES-CBC"]).getBytes() + ), + // pkcs-12PbeParams + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // salt + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OCTETSTRING, false, salt), + // iteration count + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.INTEGER, + false, + countBytes.getBytes() + ) + ]) + ] + ); + } else { + var error = new Error("Cannot encrypt private key. Unknown encryption algorithm."); + error.algorithm = options.algorithm; + throw error; + } + var rval = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // encryptionAlgorithm + encryptionAlgorithm, + // encryptedData + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OCTETSTRING, + false, + encryptedData + ) + ]); + return rval; + }; + pki.decryptPrivateKeyInfo = function(obj, password) { + var rval = null; + var capture = {}; + var errors = []; + if (!asn1.validate(obj, encryptedPrivateKeyValidator, capture, errors)) { + var error = new Error("Cannot read encrypted private key. ASN.1 object is not a supported EncryptedPrivateKeyInfo."); + error.errors = errors; + throw error; + } + var oid = asn1.derToOid(capture.encryptionOid); + var cipher = pki.pbe.getCipher(oid, capture.encryptionParams, password); + var encrypted = forge2.util.createBuffer(capture.encryptedData); + cipher.update(encrypted); + if (cipher.finish()) { + rval = asn1.fromDer(cipher.output); + } + return rval; + }; + pki.encryptedPrivateKeyToPem = function(epki, maxline) { + var msg = { + type: "ENCRYPTED PRIVATE KEY", + body: asn1.toDer(epki).getBytes() + }; + return forge2.pem.encode(msg, { maxline }); + }; + pki.encryptedPrivateKeyFromPem = function(pem) { + var msg = forge2.pem.decode(pem)[0]; + if (msg.type !== "ENCRYPTED PRIVATE KEY") { + var error = new Error('Could not convert encrypted private key from PEM; PEM header type is "ENCRYPTED PRIVATE KEY".'); + error.headerType = msg.type; + throw error; + } + if (msg.procType && msg.procType.type === "ENCRYPTED") { + throw new Error("Could not convert encrypted private key from PEM; PEM is encrypted."); + } + return asn1.fromDer(msg.body); + }; + pki.encryptRsaPrivateKey = function(rsaKey, password, options) { + options = options || {}; + if (!options.legacy) { + var rval = pki.wrapRsaPrivateKey(pki.privateKeyToAsn1(rsaKey)); + rval = pki.encryptPrivateKeyInfo(rval, password, options); + return pki.encryptedPrivateKeyToPem(rval); + } + var algorithm; + var iv; + var dkLen; + var cipherFn; + switch (options.algorithm) { + case "aes128": + algorithm = "AES-128-CBC"; + dkLen = 16; + iv = forge2.random.getBytesSync(16); + cipherFn = forge2.aes.createEncryptionCipher; + break; + case "aes192": + algorithm = "AES-192-CBC"; + dkLen = 24; + iv = forge2.random.getBytesSync(16); + cipherFn = forge2.aes.createEncryptionCipher; + break; + case "aes256": + algorithm = "AES-256-CBC"; + dkLen = 32; + iv = forge2.random.getBytesSync(16); + cipherFn = forge2.aes.createEncryptionCipher; + break; + case "3des": + algorithm = "DES-EDE3-CBC"; + dkLen = 24; + iv = forge2.random.getBytesSync(8); + cipherFn = forge2.des.createEncryptionCipher; + break; + case "des": + algorithm = "DES-CBC"; + dkLen = 8; + iv = forge2.random.getBytesSync(8); + cipherFn = forge2.des.createEncryptionCipher; + break; + default: + var error = new Error('Could not encrypt RSA private key; unsupported encryption algorithm "' + options.algorithm + '".'); + error.algorithm = options.algorithm; + throw error; + } + var dk = forge2.pbe.opensslDeriveBytes(password, iv.substr(0, 8), dkLen); + var cipher = cipherFn(dk); + cipher.start(iv); + cipher.update(asn1.toDer(pki.privateKeyToAsn1(rsaKey))); + cipher.finish(); + var msg = { + type: "RSA PRIVATE KEY", + procType: { + version: "4", + type: "ENCRYPTED" + }, + dekInfo: { + algorithm, + parameters: forge2.util.bytesToHex(iv).toUpperCase() + }, + body: cipher.output.getBytes() + }; + return forge2.pem.encode(msg); + }; + pki.decryptRsaPrivateKey = function(pem, password) { + var rval = null; + var msg = forge2.pem.decode(pem)[0]; + if (msg.type !== "ENCRYPTED PRIVATE KEY" && msg.type !== "PRIVATE KEY" && msg.type !== "RSA PRIVATE KEY") { + var error = new Error('Could not convert private key from PEM; PEM header type is not "ENCRYPTED PRIVATE KEY", "PRIVATE KEY", or "RSA PRIVATE KEY".'); + error.headerType = error; + throw error; + } + if (msg.procType && msg.procType.type === "ENCRYPTED") { + var dkLen; + var cipherFn; + switch (msg.dekInfo.algorithm) { + case "DES-CBC": + dkLen = 8; + cipherFn = forge2.des.createDecryptionCipher; + break; + case "DES-EDE3-CBC": + dkLen = 24; + cipherFn = forge2.des.createDecryptionCipher; + break; + case "AES-128-CBC": + dkLen = 16; + cipherFn = forge2.aes.createDecryptionCipher; + break; + case "AES-192-CBC": + dkLen = 24; + cipherFn = forge2.aes.createDecryptionCipher; + break; + case "AES-256-CBC": + dkLen = 32; + cipherFn = forge2.aes.createDecryptionCipher; + break; + case "RC2-40-CBC": + dkLen = 5; + cipherFn = function(key) { + return forge2.rc2.createDecryptionCipher(key, 40); + }; + break; + case "RC2-64-CBC": + dkLen = 8; + cipherFn = function(key) { + return forge2.rc2.createDecryptionCipher(key, 64); + }; + break; + case "RC2-128-CBC": + dkLen = 16; + cipherFn = function(key) { + return forge2.rc2.createDecryptionCipher(key, 128); + }; + break; + default: + var error = new Error('Could not decrypt private key; unsupported encryption algorithm "' + msg.dekInfo.algorithm + '".'); + error.algorithm = msg.dekInfo.algorithm; + throw error; + } + var iv = forge2.util.hexToBytes(msg.dekInfo.parameters); + var dk = forge2.pbe.opensslDeriveBytes(password, iv.substr(0, 8), dkLen); + var cipher = cipherFn(dk); + cipher.start(iv); + cipher.update(forge2.util.createBuffer(msg.body)); + if (cipher.finish()) { + rval = cipher.output.getBytes(); + } else { + return rval; + } + } else { + rval = msg.body; + } + if (msg.type === "ENCRYPTED PRIVATE KEY") { + rval = pki.decryptPrivateKeyInfo(asn1.fromDer(rval), password); + } else { + rval = asn1.fromDer(rval); + } + if (rval !== null) { + rval = pki.privateKeyFromAsn1(rval); + } + return rval; + }; + pki.pbe.generatePkcs12Key = function(password, salt, id, iter, n, md) { + var j, l; + if (typeof md === "undefined" || md === null) { + if (!("sha1" in forge2.md)) { + throw new Error('"sha1" hash algorithm unavailable.'); + } + md = forge2.md.sha1.create(); + } + var u = md.digestLength; + var v = md.blockLength; + var result = new forge2.util.ByteBuffer(); + var passBuf = new forge2.util.ByteBuffer(); + if (password !== null && password !== void 0) { + for (l = 0; l < password.length; l++) { + passBuf.putInt16(password.charCodeAt(l)); + } + passBuf.putInt16(0); + } + var p = passBuf.length(); + var s = salt.length(); + var D = new forge2.util.ByteBuffer(); + D.fillWithByte(id, v); + var Slen = v * Math.ceil(s / v); + var S = new forge2.util.ByteBuffer(); + for (l = 0; l < Slen; l++) { + S.putByte(salt.at(l % s)); + } + var Plen = v * Math.ceil(p / v); + var P = new forge2.util.ByteBuffer(); + for (l = 0; l < Plen; l++) { + P.putByte(passBuf.at(l % p)); + } + var I = S; + I.putBuffer(P); + var c = Math.ceil(n / u); + for (var i = 1; i <= c; i++) { + var buf = new forge2.util.ByteBuffer(); + buf.putBytes(D.bytes()); + buf.putBytes(I.bytes()); + for (var round = 0; round < iter; round++) { + md.start(); + md.update(buf.getBytes()); + buf = md.digest(); + } + var B = new forge2.util.ByteBuffer(); + for (l = 0; l < v; l++) { + B.putByte(buf.at(l % u)); + } + var k = Math.ceil(s / v) + Math.ceil(p / v); + var Inew = new forge2.util.ByteBuffer(); + for (j = 0; j < k; j++) { + var chunk = new forge2.util.ByteBuffer(I.getBytes(v)); + var x = 511; + for (l = B.length() - 1; l >= 0; l--) { + x = x >> 8; + x += B.at(l) + chunk.at(l); + chunk.setAt(l, x & 255); + } + Inew.putBuffer(chunk); + } + I = Inew; + result.putBuffer(buf); + } + result.truncate(result.length() - n); + return result; + }; + pki.pbe.getCipher = function(oid, params, password) { + switch (oid) { + case pki.oids["pkcs5PBES2"]: + return pki.pbe.getCipherForPBES2(oid, params, password); + case pki.oids["pbeWithSHAAnd3-KeyTripleDES-CBC"]: + case pki.oids["pbewithSHAAnd40BitRC2-CBC"]: + return pki.pbe.getCipherForPKCS12PBE(oid, params, password); + default: + var error = new Error("Cannot read encrypted PBE data block. Unsupported OID."); + error.oid = oid; + error.supportedOids = [ + "pkcs5PBES2", + "pbeWithSHAAnd3-KeyTripleDES-CBC", + "pbewithSHAAnd40BitRC2-CBC" + ]; + throw error; + } + }; + pki.pbe.getCipherForPBES2 = function(oid, params, password) { + var capture = {}; + var errors = []; + if (!asn1.validate(params, PBES2AlgorithmsValidator, capture, errors)) { + var error = new Error("Cannot read password-based-encryption algorithm parameters. ASN.1 object is not a supported EncryptedPrivateKeyInfo."); + error.errors = errors; + throw error; + } + oid = asn1.derToOid(capture.kdfOid); + if (oid !== pki.oids["pkcs5PBKDF2"]) { + var error = new Error("Cannot read encrypted private key. Unsupported key derivation function OID."); + error.oid = oid; + error.supportedOids = ["pkcs5PBKDF2"]; + throw error; + } + oid = asn1.derToOid(capture.encOid); + if (oid !== pki.oids["aes128-CBC"] && oid !== pki.oids["aes192-CBC"] && oid !== pki.oids["aes256-CBC"] && oid !== pki.oids["des-EDE3-CBC"] && oid !== pki.oids["desCBC"]) { + var error = new Error("Cannot read encrypted private key. Unsupported encryption scheme OID."); + error.oid = oid; + error.supportedOids = [ + "aes128-CBC", + "aes192-CBC", + "aes256-CBC", + "des-EDE3-CBC", + "desCBC" + ]; + throw error; + } + var salt = capture.kdfSalt; + var count = forge2.util.createBuffer(capture.kdfIterationCount); + count = count.getInt(count.length() << 3); + var dkLen; + var cipherFn; + switch (pki.oids[oid]) { + case "aes128-CBC": + dkLen = 16; + cipherFn = forge2.aes.createDecryptionCipher; + break; + case "aes192-CBC": + dkLen = 24; + cipherFn = forge2.aes.createDecryptionCipher; + break; + case "aes256-CBC": + dkLen = 32; + cipherFn = forge2.aes.createDecryptionCipher; + break; + case "des-EDE3-CBC": + dkLen = 24; + cipherFn = forge2.des.createDecryptionCipher; + break; + case "desCBC": + dkLen = 8; + cipherFn = forge2.des.createDecryptionCipher; + break; + } + var md = prfOidToMessageDigest(capture.prfOid); + var dk = forge2.pkcs5.pbkdf2(password, salt, count, dkLen, md); + var iv = capture.encIv; + var cipher = cipherFn(dk); + cipher.start(iv); + return cipher; + }; + pki.pbe.getCipherForPKCS12PBE = function(oid, params, password) { + var capture = {}; + var errors = []; + if (!asn1.validate(params, pkcs12PbeParamsValidator, capture, errors)) { + var error = new Error("Cannot read password-based-encryption algorithm parameters. ASN.1 object is not a supported EncryptedPrivateKeyInfo."); + error.errors = errors; + throw error; + } + var salt = forge2.util.createBuffer(capture.salt); + var count = forge2.util.createBuffer(capture.iterations); + count = count.getInt(count.length() << 3); + var dkLen, dIvLen, cipherFn; + switch (oid) { + case pki.oids["pbeWithSHAAnd3-KeyTripleDES-CBC"]: + dkLen = 24; + dIvLen = 8; + cipherFn = forge2.des.startDecrypting; + break; + case pki.oids["pbewithSHAAnd40BitRC2-CBC"]: + dkLen = 5; + dIvLen = 8; + cipherFn = function(key2, iv2) { + var cipher = forge2.rc2.createDecryptionCipher(key2, 40); + cipher.start(iv2, null); + return cipher; + }; + break; + default: + var error = new Error("Cannot read PKCS #12 PBE data block. Unsupported OID."); + error.oid = oid; + throw error; + } + var md = prfOidToMessageDigest(capture.prfOid); + var key = pki.pbe.generatePkcs12Key(password, salt, 1, count, dkLen, md); + md.start(); + var iv = pki.pbe.generatePkcs12Key(password, salt, 2, count, dIvLen, md); + return cipherFn(key, iv); + }; + pki.pbe.opensslDeriveBytes = function(password, salt, dkLen, md) { + if (typeof md === "undefined" || md === null) { + if (!("md5" in forge2.md)) { + throw new Error('"md5" hash algorithm unavailable.'); + } + md = forge2.md.md5.create(); + } + if (salt === null) { + salt = ""; + } + var digests = [hash(md, password + salt)]; + for (var length = 16, i = 1; length < dkLen; ++i, length += 16) { + digests.push(hash(md, digests[i - 1] + password + salt)); + } + return digests.join("").substr(0, dkLen); + }; + function hash(md, bytes) { + return md.start().update(bytes).digest().getBytes(); + } + function prfOidToMessageDigest(prfOid) { + var prfAlgorithm; + if (!prfOid) { + prfAlgorithm = "hmacWithSHA1"; + } else { + prfAlgorithm = pki.oids[asn1.derToOid(prfOid)]; + if (!prfAlgorithm) { + var error = new Error("Unsupported PRF OID."); + error.oid = prfOid; + error.supported = [ + "hmacWithSHA1", + "hmacWithSHA224", + "hmacWithSHA256", + "hmacWithSHA384", + "hmacWithSHA512" + ]; + throw error; + } + } + return prfAlgorithmToMessageDigest(prfAlgorithm); + } + function prfAlgorithmToMessageDigest(prfAlgorithm) { + var factory = forge2.md; + switch (prfAlgorithm) { + case "hmacWithSHA224": + factory = forge2.md.sha512; + case "hmacWithSHA1": + case "hmacWithSHA256": + case "hmacWithSHA384": + case "hmacWithSHA512": + prfAlgorithm = prfAlgorithm.substr(8).toLowerCase(); + break; + default: + var error = new Error("Unsupported PRF algorithm."); + error.algorithm = prfAlgorithm; + error.supported = [ + "hmacWithSHA1", + "hmacWithSHA224", + "hmacWithSHA256", + "hmacWithSHA384", + "hmacWithSHA512" + ]; + throw error; + } + if (!factory || !(prfAlgorithm in factory)) { + throw new Error("Unknown hash algorithm: " + prfAlgorithm); + } + return factory[prfAlgorithm].create(); + } + function createPbkdf2Params(salt, countBytes, dkLen, prfAlgorithm) { + var params = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // salt + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OCTETSTRING, + false, + salt + ), + // iteration count + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.INTEGER, + false, + countBytes.getBytes() + ) + ]); + if (prfAlgorithm !== "hmacWithSHA1") { + params.value.push( + // key length + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.INTEGER, + false, + forge2.util.hexToBytes(dkLen.toString(16)) + ), + // AlgorithmIdentifier + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // algorithm + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + asn1.oidToDer(pki.oids[prfAlgorithm]).getBytes() + ), + // parameters (null) + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.NULL, false, "") + ]) + ); + } + return params; + } + } +}); + +// node_modules/node-forge/lib/pkcs7asn1.js +var require_pkcs7asn1 = __commonJS({ + "node_modules/node-forge/lib/pkcs7asn1.js"(exports, module) { + var forge2 = require_forge(); + require_asn1(); + require_util(); + var asn1 = forge2.asn1; + var p7v = module.exports = forge2.pkcs7asn1 = forge2.pkcs7asn1 || {}; + forge2.pkcs7 = forge2.pkcs7 || {}; + forge2.pkcs7.asn1 = p7v; + var contentInfoValidator = { + name: "ContentInfo", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + name: "ContentInfo.ContentType", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.OID, + constructed: false, + capture: "contentType" + }, { + name: "ContentInfo.content", + tagClass: asn1.Class.CONTEXT_SPECIFIC, + type: 0, + constructed: true, + optional: true, + captureAsn1: "content" + }] + }; + p7v.contentInfoValidator = contentInfoValidator; + var encryptedContentInfoValidator = { + name: "EncryptedContentInfo", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + name: "EncryptedContentInfo.contentType", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.OID, + constructed: false, + capture: "contentType" + }, { + name: "EncryptedContentInfo.contentEncryptionAlgorithm", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + name: "EncryptedContentInfo.contentEncryptionAlgorithm.algorithm", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.OID, + constructed: false, + capture: "encAlgorithm" + }, { + name: "EncryptedContentInfo.contentEncryptionAlgorithm.parameter", + tagClass: asn1.Class.UNIVERSAL, + captureAsn1: "encParameter" + }] + }, { + name: "EncryptedContentInfo.encryptedContent", + tagClass: asn1.Class.CONTEXT_SPECIFIC, + type: 0, + /* The PKCS#7 structure output by OpenSSL somewhat differs from what + * other implementations do generate. + * + * OpenSSL generates a structure like this: + * SEQUENCE { + * ... + * [0] + * 26 DA 67 D2 17 9C 45 3C B1 2A A8 59 2F 29 33 38 + * C3 C3 DF 86 71 74 7A 19 9F 40 D0 29 BE 85 90 45 + * ... + * } + * + * Whereas other implementations (and this PKCS#7 module) generate: + * SEQUENCE { + * ... + * [0] { + * OCTET STRING + * 26 DA 67 D2 17 9C 45 3C B1 2A A8 59 2F 29 33 38 + * C3 C3 DF 86 71 74 7A 19 9F 40 D0 29 BE 85 90 45 + * ... + * } + * } + * + * In order to support both, we just capture the context specific + * field here. The OCTET STRING bit is removed below. + */ + capture: "encryptedContent", + captureAsn1: "encryptedContentAsn1" + }] + }; + p7v.envelopedDataValidator = { + name: "EnvelopedData", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + name: "EnvelopedData.Version", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.INTEGER, + constructed: false, + capture: "version" + }, { + name: "EnvelopedData.RecipientInfos", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SET, + constructed: true, + captureAsn1: "recipientInfos" + }].concat(encryptedContentInfoValidator) + }; + p7v.encryptedDataValidator = { + name: "EncryptedData", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + name: "EncryptedData.Version", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.INTEGER, + constructed: false, + capture: "version" + }].concat(encryptedContentInfoValidator) + }; + var signerValidator = { + name: "SignerInfo", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + name: "SignerInfo.version", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.INTEGER, + constructed: false + }, { + name: "SignerInfo.issuerAndSerialNumber", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + name: "SignerInfo.issuerAndSerialNumber.issuer", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + captureAsn1: "issuer" + }, { + name: "SignerInfo.issuerAndSerialNumber.serialNumber", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.INTEGER, + constructed: false, + capture: "serial" + }] + }, { + name: "SignerInfo.digestAlgorithm", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + name: "SignerInfo.digestAlgorithm.algorithm", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.OID, + constructed: false, + capture: "digestAlgorithm" + }, { + name: "SignerInfo.digestAlgorithm.parameter", + tagClass: asn1.Class.UNIVERSAL, + constructed: false, + captureAsn1: "digestParameter", + optional: true + }] + }, { + name: "SignerInfo.authenticatedAttributes", + tagClass: asn1.Class.CONTEXT_SPECIFIC, + type: 0, + constructed: true, + optional: true, + capture: "authenticatedAttributes" + }, { + name: "SignerInfo.digestEncryptionAlgorithm", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + capture: "signatureAlgorithm" + }, { + name: "SignerInfo.encryptedDigest", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.OCTETSTRING, + constructed: false, + capture: "signature" + }, { + name: "SignerInfo.unauthenticatedAttributes", + tagClass: asn1.Class.CONTEXT_SPECIFIC, + type: 1, + constructed: true, + optional: true, + capture: "unauthenticatedAttributes" + }] + }; + p7v.signedDataValidator = { + name: "SignedData", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [ + { + name: "SignedData.Version", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.INTEGER, + constructed: false, + capture: "version" + }, + { + name: "SignedData.DigestAlgorithms", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SET, + constructed: true, + captureAsn1: "digestAlgorithms" + }, + contentInfoValidator, + { + name: "SignedData.Certificates", + tagClass: asn1.Class.CONTEXT_SPECIFIC, + type: 0, + optional: true, + captureAsn1: "certificates" + }, + { + name: "SignedData.CertificateRevocationLists", + tagClass: asn1.Class.CONTEXT_SPECIFIC, + type: 1, + optional: true, + captureAsn1: "crls" + }, + { + name: "SignedData.SignerInfos", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SET, + capture: "signerInfos", + optional: true, + value: [signerValidator] + } + ] + }; + p7v.recipientInfoValidator = { + name: "RecipientInfo", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + name: "RecipientInfo.version", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.INTEGER, + constructed: false, + capture: "version" + }, { + name: "RecipientInfo.issuerAndSerial", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + name: "RecipientInfo.issuerAndSerial.issuer", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + captureAsn1: "issuer" + }, { + name: "RecipientInfo.issuerAndSerial.serialNumber", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.INTEGER, + constructed: false, + capture: "serial" + }] + }, { + name: "RecipientInfo.keyEncryptionAlgorithm", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + name: "RecipientInfo.keyEncryptionAlgorithm.algorithm", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.OID, + constructed: false, + capture: "encAlgorithm" + }, { + name: "RecipientInfo.keyEncryptionAlgorithm.parameter", + tagClass: asn1.Class.UNIVERSAL, + constructed: false, + captureAsn1: "encParameter", + optional: true + }] + }, { + name: "RecipientInfo.encryptedKey", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.OCTETSTRING, + constructed: false, + capture: "encKey" + }] + }; + } +}); + +// node_modules/node-forge/lib/mgf1.js +var require_mgf1 = __commonJS({ + "node_modules/node-forge/lib/mgf1.js"(exports, module) { + var forge2 = require_forge(); + require_util(); + forge2.mgf = forge2.mgf || {}; + var mgf1 = module.exports = forge2.mgf.mgf1 = forge2.mgf1 = forge2.mgf1 || {}; + mgf1.create = function(md) { + var mgf = { + /** + * Generate mask of specified length. + * + * @param {String} seed The seed for mask generation. + * @param maskLen Number of bytes to generate. + * @return {String} The generated mask. + */ + generate: function(seed, maskLen) { + var t = new forge2.util.ByteBuffer(); + var len = Math.ceil(maskLen / md.digestLength); + for (var i = 0; i < len; i++) { + var c = new forge2.util.ByteBuffer(); + c.putInt32(i); + md.start(); + md.update(seed + c.getBytes()); + t.putBuffer(md.digest()); + } + t.truncate(t.length() - maskLen); + return t.getBytes(); + } + }; + return mgf; + }; + } +}); + +// node_modules/node-forge/lib/mgf.js +var require_mgf = __commonJS({ + "node_modules/node-forge/lib/mgf.js"(exports, module) { + var forge2 = require_forge(); + require_mgf1(); + module.exports = forge2.mgf = forge2.mgf || {}; + forge2.mgf.mgf1 = forge2.mgf1; + } +}); + +// node_modules/node-forge/lib/pss.js +var require_pss = __commonJS({ + "node_modules/node-forge/lib/pss.js"(exports, module) { + var forge2 = require_forge(); + require_random(); + require_util(); + var pss = module.exports = forge2.pss = forge2.pss || {}; + pss.create = function(options) { + if (arguments.length === 3) { + options = { + md: arguments[0], + mgf: arguments[1], + saltLength: arguments[2] + }; + } + var hash = options.md; + var mgf = options.mgf; + var hLen = hash.digestLength; + var salt_ = options.salt || null; + if (typeof salt_ === "string") { + salt_ = forge2.util.createBuffer(salt_); + } + var sLen; + if ("saltLength" in options) { + sLen = options.saltLength; + } else if (salt_ !== null) { + sLen = salt_.length(); + } else { + throw new Error("Salt length not specified or specific salt not given."); + } + if (salt_ !== null && salt_.length() !== sLen) { + throw new Error("Given salt length does not match length of given salt."); + } + var prng = options.prng || forge2.random; + var pssobj = {}; + pssobj.encode = function(md, modBits) { + var i; + var emBits = modBits - 1; + var emLen = Math.ceil(emBits / 8); + var mHash = md.digest().getBytes(); + if (emLen < hLen + sLen + 2) { + throw new Error("Message is too long to encrypt."); + } + var salt; + if (salt_ === null) { + salt = prng.getBytesSync(sLen); + } else { + salt = salt_.bytes(); + } + var m_ = new forge2.util.ByteBuffer(); + m_.fillWithByte(0, 8); + m_.putBytes(mHash); + m_.putBytes(salt); + hash.start(); + hash.update(m_.getBytes()); + var h = hash.digest().getBytes(); + var ps = new forge2.util.ByteBuffer(); + ps.fillWithByte(0, emLen - sLen - hLen - 2); + ps.putByte(1); + ps.putBytes(salt); + var db2 = ps.getBytes(); + var maskLen = emLen - hLen - 1; + var dbMask = mgf.generate(h, maskLen); + var maskedDB = ""; + for (i = 0; i < maskLen; i++) { + maskedDB += String.fromCharCode(db2.charCodeAt(i) ^ dbMask.charCodeAt(i)); + } + var mask = 65280 >> 8 * emLen - emBits & 255; + maskedDB = String.fromCharCode(maskedDB.charCodeAt(0) & ~mask) + maskedDB.substr(1); + return maskedDB + h + String.fromCharCode(188); + }; + pssobj.verify = function(mHash, em, modBits) { + var i; + var emBits = modBits - 1; + var emLen = Math.ceil(emBits / 8); + em = em.substr(-emLen); + if (emLen < hLen + sLen + 2) { + throw new Error("Inconsistent parameters to PSS signature verification."); + } + if (em.charCodeAt(emLen - 1) !== 188) { + throw new Error("Encoded message does not end in 0xBC."); + } + var maskLen = emLen - hLen - 1; + var maskedDB = em.substr(0, maskLen); + var h = em.substr(maskLen, hLen); + var mask = 65280 >> 8 * emLen - emBits & 255; + if ((maskedDB.charCodeAt(0) & mask) !== 0) { + throw new Error("Bits beyond keysize not zero as expected."); + } + var dbMask = mgf.generate(h, maskLen); + var db2 = ""; + for (i = 0; i < maskLen; i++) { + db2 += String.fromCharCode(maskedDB.charCodeAt(i) ^ dbMask.charCodeAt(i)); + } + db2 = String.fromCharCode(db2.charCodeAt(0) & ~mask) + db2.substr(1); + var checkLen = emLen - hLen - sLen - 2; + for (i = 0; i < checkLen; i++) { + if (db2.charCodeAt(i) !== 0) { + throw new Error("Leftmost octets not zero as expected"); + } + } + if (db2.charCodeAt(checkLen) !== 1) { + throw new Error("Inconsistent PSS signature, 0x01 marker not found"); + } + var salt = db2.substr(-sLen); + var m_ = new forge2.util.ByteBuffer(); + m_.fillWithByte(0, 8); + m_.putBytes(mHash); + m_.putBytes(salt); + hash.start(); + hash.update(m_.getBytes()); + var h_ = hash.digest().getBytes(); + return h === h_; + }; + return pssobj; + }; + } +}); + +// node_modules/node-forge/lib/x509.js +var require_x509 = __commonJS({ + "node_modules/node-forge/lib/x509.js"(exports, module) { + var forge2 = require_forge(); + require_aes(); + require_asn1(); + require_des(); + require_md(); + require_mgf(); + require_oids(); + require_pem(); + require_pss(); + require_rsa(); + require_util(); + var asn1 = forge2.asn1; + var pki = module.exports = forge2.pki = forge2.pki || {}; + var oids = pki.oids; + var _shortNames = {}; + _shortNames["CN"] = oids["commonName"]; + _shortNames["commonName"] = "CN"; + _shortNames["C"] = oids["countryName"]; + _shortNames["countryName"] = "C"; + _shortNames["L"] = oids["localityName"]; + _shortNames["localityName"] = "L"; + _shortNames["ST"] = oids["stateOrProvinceName"]; + _shortNames["stateOrProvinceName"] = "ST"; + _shortNames["O"] = oids["organizationName"]; + _shortNames["organizationName"] = "O"; + _shortNames["OU"] = oids["organizationalUnitName"]; + _shortNames["organizationalUnitName"] = "OU"; + _shortNames["E"] = oids["emailAddress"]; + _shortNames["emailAddress"] = "E"; + var publicKeyValidator = forge2.pki.rsa.publicKeyValidator; + var x509CertificateValidator = { + name: "Certificate", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + name: "Certificate.TBSCertificate", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + captureAsn1: "tbsCertificate", + value: [ + { + name: "Certificate.TBSCertificate.version", + tagClass: asn1.Class.CONTEXT_SPECIFIC, + type: 0, + constructed: true, + optional: true, + value: [{ + name: "Certificate.TBSCertificate.version.integer", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.INTEGER, + constructed: false, + capture: "certVersion" + }] + }, + { + name: "Certificate.TBSCertificate.serialNumber", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.INTEGER, + constructed: false, + capture: "certSerialNumber" + }, + { + name: "Certificate.TBSCertificate.signature", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + name: "Certificate.TBSCertificate.signature.algorithm", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.OID, + constructed: false, + capture: "certinfoSignatureOid" + }, { + name: "Certificate.TBSCertificate.signature.parameters", + tagClass: asn1.Class.UNIVERSAL, + optional: true, + captureAsn1: "certinfoSignatureParams" + }] + }, + { + name: "Certificate.TBSCertificate.issuer", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + captureAsn1: "certIssuer" + }, + { + name: "Certificate.TBSCertificate.validity", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + // Note: UTC and generalized times may both appear so the capture + // names are based on their detected order, the names used below + // are only for the common case, which validity time really means + // "notBefore" and which means "notAfter" will be determined by order + value: [{ + // notBefore (Time) (UTC time case) + name: "Certificate.TBSCertificate.validity.notBefore (utc)", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.UTCTIME, + constructed: false, + optional: true, + capture: "certValidity1UTCTime" + }, { + // notBefore (Time) (generalized time case) + name: "Certificate.TBSCertificate.validity.notBefore (generalized)", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.GENERALIZEDTIME, + constructed: false, + optional: true, + capture: "certValidity2GeneralizedTime" + }, { + // notAfter (Time) (only UTC time is supported) + name: "Certificate.TBSCertificate.validity.notAfter (utc)", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.UTCTIME, + constructed: false, + optional: true, + capture: "certValidity3UTCTime" + }, { + // notAfter (Time) (only UTC time is supported) + name: "Certificate.TBSCertificate.validity.notAfter (generalized)", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.GENERALIZEDTIME, + constructed: false, + optional: true, + capture: "certValidity4GeneralizedTime" + }] + }, + { + // Name (subject) (RDNSequence) + name: "Certificate.TBSCertificate.subject", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + captureAsn1: "certSubject" + }, + // SubjectPublicKeyInfo + publicKeyValidator, + { + // issuerUniqueID (optional) + name: "Certificate.TBSCertificate.issuerUniqueID", + tagClass: asn1.Class.CONTEXT_SPECIFIC, + type: 1, + constructed: true, + optional: true, + value: [{ + name: "Certificate.TBSCertificate.issuerUniqueID.id", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.BITSTRING, + constructed: false, + // TODO: support arbitrary bit length ids + captureBitStringValue: "certIssuerUniqueId" + }] + }, + { + // subjectUniqueID (optional) + name: "Certificate.TBSCertificate.subjectUniqueID", + tagClass: asn1.Class.CONTEXT_SPECIFIC, + type: 2, + constructed: true, + optional: true, + value: [{ + name: "Certificate.TBSCertificate.subjectUniqueID.id", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.BITSTRING, + constructed: false, + // TODO: support arbitrary bit length ids + captureBitStringValue: "certSubjectUniqueId" + }] + }, + { + // Extensions (optional) + name: "Certificate.TBSCertificate.extensions", + tagClass: asn1.Class.CONTEXT_SPECIFIC, + type: 3, + constructed: true, + captureAsn1: "certExtensions", + optional: true + } + ] + }, { + // AlgorithmIdentifier (signature algorithm) + name: "Certificate.signatureAlgorithm", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + // algorithm + name: "Certificate.signatureAlgorithm.algorithm", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.OID, + constructed: false, + capture: "certSignatureOid" + }, { + name: "Certificate.TBSCertificate.signature.parameters", + tagClass: asn1.Class.UNIVERSAL, + optional: true, + captureAsn1: "certSignatureParams" + }] + }, { + // SignatureValue + name: "Certificate.signatureValue", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.BITSTRING, + constructed: false, + captureBitStringValue: "certSignature" + }] + }; + var rsassaPssParameterValidator = { + name: "rsapss", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + name: "rsapss.hashAlgorithm", + tagClass: asn1.Class.CONTEXT_SPECIFIC, + type: 0, + constructed: true, + value: [{ + name: "rsapss.hashAlgorithm.AlgorithmIdentifier", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Class.SEQUENCE, + constructed: true, + optional: true, + value: [{ + name: "rsapss.hashAlgorithm.AlgorithmIdentifier.algorithm", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.OID, + constructed: false, + capture: "hashOid" + /* parameter block omitted, for SHA1 NULL anyhow. */ + }] + }] + }, { + name: "rsapss.maskGenAlgorithm", + tagClass: asn1.Class.CONTEXT_SPECIFIC, + type: 1, + constructed: true, + value: [{ + name: "rsapss.maskGenAlgorithm.AlgorithmIdentifier", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Class.SEQUENCE, + constructed: true, + optional: true, + value: [{ + name: "rsapss.maskGenAlgorithm.AlgorithmIdentifier.algorithm", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.OID, + constructed: false, + capture: "maskGenOid" + }, { + name: "rsapss.maskGenAlgorithm.AlgorithmIdentifier.params", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + name: "rsapss.maskGenAlgorithm.AlgorithmIdentifier.params.algorithm", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.OID, + constructed: false, + capture: "maskGenHashOid" + /* parameter block omitted, for SHA1 NULL anyhow. */ + }] + }] + }] + }, { + name: "rsapss.saltLength", + tagClass: asn1.Class.CONTEXT_SPECIFIC, + type: 2, + optional: true, + value: [{ + name: "rsapss.saltLength.saltLength", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Class.INTEGER, + constructed: false, + capture: "saltLength" + }] + }, { + name: "rsapss.trailerField", + tagClass: asn1.Class.CONTEXT_SPECIFIC, + type: 3, + optional: true, + value: [{ + name: "rsapss.trailer.trailer", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Class.INTEGER, + constructed: false, + capture: "trailer" + }] + }] + }; + var certificationRequestInfoValidator = { + name: "CertificationRequestInfo", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + captureAsn1: "certificationRequestInfo", + value: [ + { + name: "CertificationRequestInfo.integer", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.INTEGER, + constructed: false, + capture: "certificationRequestInfoVersion" + }, + { + // Name (subject) (RDNSequence) + name: "CertificationRequestInfo.subject", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + captureAsn1: "certificationRequestInfoSubject" + }, + // SubjectPublicKeyInfo + publicKeyValidator, + { + name: "CertificationRequestInfo.attributes", + tagClass: asn1.Class.CONTEXT_SPECIFIC, + type: 0, + constructed: true, + optional: true, + capture: "certificationRequestInfoAttributes", + value: [{ + name: "CertificationRequestInfo.attributes", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + name: "CertificationRequestInfo.attributes.type", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.OID, + constructed: false + }, { + name: "CertificationRequestInfo.attributes.value", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SET, + constructed: true + }] + }] + } + ] + }; + var certificationRequestValidator = { + name: "CertificationRequest", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + captureAsn1: "csr", + value: [ + certificationRequestInfoValidator, + { + // AlgorithmIdentifier (signature algorithm) + name: "CertificationRequest.signatureAlgorithm", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + // algorithm + name: "CertificationRequest.signatureAlgorithm.algorithm", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.OID, + constructed: false, + capture: "csrSignatureOid" + }, { + name: "CertificationRequest.signatureAlgorithm.parameters", + tagClass: asn1.Class.UNIVERSAL, + optional: true, + captureAsn1: "csrSignatureParams" + }] + }, + { + // signature + name: "CertificationRequest.signature", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.BITSTRING, + constructed: false, + captureBitStringValue: "csrSignature" + } + ] + }; + pki.RDNAttributesAsArray = function(rdn, md) { + var rval = []; + var set, attr, obj; + for (var si = 0; si < rdn.value.length; ++si) { + set = rdn.value[si]; + for (var i = 0; i < set.value.length; ++i) { + obj = {}; + attr = set.value[i]; + obj.type = asn1.derToOid(attr.value[0].value); + obj.value = attr.value[1].value; + obj.valueTagClass = attr.value[1].type; + if (obj.type in oids) { + obj.name = oids[obj.type]; + if (obj.name in _shortNames) { + obj.shortName = _shortNames[obj.name]; + } + } + if (md) { + md.update(obj.type); + md.update(obj.value); + } + rval.push(obj); + } + } + return rval; + }; + pki.CRIAttributesAsArray = function(attributes) { + var rval = []; + for (var si = 0; si < attributes.length; ++si) { + var seq = attributes[si]; + var type = asn1.derToOid(seq.value[0].value); + var values = seq.value[1].value; + for (var vi = 0; vi < values.length; ++vi) { + var obj = {}; + obj.type = type; + obj.value = values[vi].value; + obj.valueTagClass = values[vi].type; + if (obj.type in oids) { + obj.name = oids[obj.type]; + if (obj.name in _shortNames) { + obj.shortName = _shortNames[obj.name]; + } + } + if (obj.type === oids.extensionRequest) { + obj.extensions = []; + for (var ei = 0; ei < obj.value.length; ++ei) { + obj.extensions.push(pki.certificateExtensionFromAsn1(obj.value[ei])); + } + } + rval.push(obj); + } + } + return rval; + }; + function _getAttribute(obj, options) { + if (typeof options === "string") { + options = { shortName: options }; + } + var rval = null; + var attr; + for (var i = 0; rval === null && i < obj.attributes.length; ++i) { + attr = obj.attributes[i]; + if (options.type && options.type === attr.type) { + rval = attr; + } else if (options.name && options.name === attr.name) { + rval = attr; + } else if (options.shortName && options.shortName === attr.shortName) { + rval = attr; + } + } + return rval; + } + var _readSignatureParameters = function(oid, obj, fillDefaults) { + var params = {}; + if (oid !== oids["RSASSA-PSS"]) { + return params; + } + if (fillDefaults) { + params = { + hash: { + algorithmOid: oids["sha1"] + }, + mgf: { + algorithmOid: oids["mgf1"], + hash: { + algorithmOid: oids["sha1"] + } + }, + saltLength: 20 + }; + } + var capture = {}; + var errors = []; + if (!asn1.validate(obj, rsassaPssParameterValidator, capture, errors)) { + var error = new Error("Cannot read RSASSA-PSS parameter block."); + error.errors = errors; + throw error; + } + if (capture.hashOid !== void 0) { + params.hash = params.hash || {}; + params.hash.algorithmOid = asn1.derToOid(capture.hashOid); + } + if (capture.maskGenOid !== void 0) { + params.mgf = params.mgf || {}; + params.mgf.algorithmOid = asn1.derToOid(capture.maskGenOid); + params.mgf.hash = params.mgf.hash || {}; + params.mgf.hash.algorithmOid = asn1.derToOid(capture.maskGenHashOid); + } + if (capture.saltLength !== void 0) { + params.saltLength = capture.saltLength.charCodeAt(0); + } + return params; + }; + var _createSignatureDigest = function(options) { + switch (oids[options.signatureOid]) { + case "sha1WithRSAEncryption": + case "sha1WithRSASignature": + return forge2.md.sha1.create(); + case "md5WithRSAEncryption": + return forge2.md.md5.create(); + case "sha256WithRSAEncryption": + return forge2.md.sha256.create(); + case "sha384WithRSAEncryption": + return forge2.md.sha384.create(); + case "sha512WithRSAEncryption": + return forge2.md.sha512.create(); + case "RSASSA-PSS": + return forge2.md.sha256.create(); + default: + var error = new Error( + "Could not compute " + options.type + " digest. Unknown signature OID." + ); + error.signatureOid = options.signatureOid; + throw error; + } + }; + var _verifySignature = function(options) { + var cert = options.certificate; + var scheme; + switch (cert.signatureOid) { + case oids.sha1WithRSAEncryption: + case oids.sha1WithRSASignature: + break; + case oids["RSASSA-PSS"]: + var hash, mgf; + hash = oids[cert.signatureParameters.mgf.hash.algorithmOid]; + if (hash === void 0 || forge2.md[hash] === void 0) { + var error = new Error("Unsupported MGF hash function."); + error.oid = cert.signatureParameters.mgf.hash.algorithmOid; + error.name = hash; + throw error; + } + mgf = oids[cert.signatureParameters.mgf.algorithmOid]; + if (mgf === void 0 || forge2.mgf[mgf] === void 0) { + var error = new Error("Unsupported MGF function."); + error.oid = cert.signatureParameters.mgf.algorithmOid; + error.name = mgf; + throw error; + } + mgf = forge2.mgf[mgf].create(forge2.md[hash].create()); + hash = oids[cert.signatureParameters.hash.algorithmOid]; + if (hash === void 0 || forge2.md[hash] === void 0) { + var error = new Error("Unsupported RSASSA-PSS hash function."); + error.oid = cert.signatureParameters.hash.algorithmOid; + error.name = hash; + throw error; + } + scheme = forge2.pss.create( + forge2.md[hash].create(), + mgf, + cert.signatureParameters.saltLength + ); + break; + } + return cert.publicKey.verify( + options.md.digest().getBytes(), + options.signature, + scheme + ); + }; + pki.certificateFromPem = function(pem, computeHash, strict) { + var msg = forge2.pem.decode(pem)[0]; + if (msg.type !== "CERTIFICATE" && msg.type !== "X509 CERTIFICATE" && msg.type !== "TRUSTED CERTIFICATE") { + var error = new Error( + 'Could not convert certificate from PEM; PEM header type is not "CERTIFICATE", "X509 CERTIFICATE", or "TRUSTED CERTIFICATE".' + ); + error.headerType = msg.type; + throw error; + } + if (msg.procType && msg.procType.type === "ENCRYPTED") { + throw new Error( + "Could not convert certificate from PEM; PEM is encrypted." + ); + } + var obj = asn1.fromDer(msg.body, strict); + return pki.certificateFromAsn1(obj, computeHash); + }; + pki.certificateToPem = function(cert, maxline) { + var msg = { + type: "CERTIFICATE", + body: asn1.toDer(pki.certificateToAsn1(cert)).getBytes() + }; + return forge2.pem.encode(msg, { maxline }); + }; + pki.publicKeyFromPem = function(pem) { + var msg = forge2.pem.decode(pem)[0]; + if (msg.type !== "PUBLIC KEY" && msg.type !== "RSA PUBLIC KEY") { + var error = new Error('Could not convert public key from PEM; PEM header type is not "PUBLIC KEY" or "RSA PUBLIC KEY".'); + error.headerType = msg.type; + throw error; + } + if (msg.procType && msg.procType.type === "ENCRYPTED") { + throw new Error("Could not convert public key from PEM; PEM is encrypted."); + } + var obj = asn1.fromDer(msg.body); + return pki.publicKeyFromAsn1(obj); + }; + pki.publicKeyToPem = function(key, maxline) { + var msg = { + type: "PUBLIC KEY", + body: asn1.toDer(pki.publicKeyToAsn1(key)).getBytes() + }; + return forge2.pem.encode(msg, { maxline }); + }; + pki.publicKeyToRSAPublicKeyPem = function(key, maxline) { + var msg = { + type: "RSA PUBLIC KEY", + body: asn1.toDer(pki.publicKeyToRSAPublicKey(key)).getBytes() + }; + return forge2.pem.encode(msg, { maxline }); + }; + pki.getPublicKeyFingerprint = function(key, options) { + options = options || {}; + var md = options.md || forge2.md.sha1.create(); + var type = options.type || "RSAPublicKey"; + var bytes; + switch (type) { + case "RSAPublicKey": + bytes = asn1.toDer(pki.publicKeyToRSAPublicKey(key)).getBytes(); + break; + case "SubjectPublicKeyInfo": + bytes = asn1.toDer(pki.publicKeyToAsn1(key)).getBytes(); + break; + default: + throw new Error('Unknown fingerprint type "' + options.type + '".'); + } + md.start(); + md.update(bytes); + var digest = md.digest(); + if (options.encoding === "hex") { + var hex = digest.toHex(); + if (options.delimiter) { + return hex.match(/.{2}/g).join(options.delimiter); + } + return hex; + } else if (options.encoding === "binary") { + return digest.getBytes(); + } else if (options.encoding) { + throw new Error('Unknown encoding "' + options.encoding + '".'); + } + return digest; + }; + pki.certificationRequestFromPem = function(pem, computeHash, strict) { + var msg = forge2.pem.decode(pem)[0]; + if (msg.type !== "CERTIFICATE REQUEST") { + var error = new Error('Could not convert certification request from PEM; PEM header type is not "CERTIFICATE REQUEST".'); + error.headerType = msg.type; + throw error; + } + if (msg.procType && msg.procType.type === "ENCRYPTED") { + throw new Error("Could not convert certification request from PEM; PEM is encrypted."); + } + var obj = asn1.fromDer(msg.body, strict); + return pki.certificationRequestFromAsn1(obj, computeHash); + }; + pki.certificationRequestToPem = function(csr, maxline) { + var msg = { + type: "CERTIFICATE REQUEST", + body: asn1.toDer(pki.certificationRequestToAsn1(csr)).getBytes() + }; + return forge2.pem.encode(msg, { maxline }); + }; + pki.createCertificate = function() { + var cert = {}; + cert.version = 2; + cert.serialNumber = "00"; + cert.signatureOid = null; + cert.signature = null; + cert.siginfo = {}; + cert.siginfo.algorithmOid = null; + cert.validity = {}; + cert.validity.notBefore = /* @__PURE__ */ new Date(); + cert.validity.notAfter = /* @__PURE__ */ new Date(); + cert.issuer = {}; + cert.issuer.getField = function(sn) { + return _getAttribute(cert.issuer, sn); + }; + cert.issuer.addField = function(attr) { + _fillMissingFields([attr]); + cert.issuer.attributes.push(attr); + }; + cert.issuer.attributes = []; + cert.issuer.hash = null; + cert.subject = {}; + cert.subject.getField = function(sn) { + return _getAttribute(cert.subject, sn); + }; + cert.subject.addField = function(attr) { + _fillMissingFields([attr]); + cert.subject.attributes.push(attr); + }; + cert.subject.attributes = []; + cert.subject.hash = null; + cert.extensions = []; + cert.publicKey = null; + cert.md = null; + cert.setSubject = function(attrs, uniqueId) { + _fillMissingFields(attrs); + cert.subject.attributes = attrs; + delete cert.subject.uniqueId; + if (uniqueId) { + cert.subject.uniqueId = uniqueId; + } + cert.subject.hash = null; + }; + cert.setIssuer = function(attrs, uniqueId) { + _fillMissingFields(attrs); + cert.issuer.attributes = attrs; + delete cert.issuer.uniqueId; + if (uniqueId) { + cert.issuer.uniqueId = uniqueId; + } + cert.issuer.hash = null; + }; + cert.setExtensions = function(exts) { + for (var i = 0; i < exts.length; ++i) { + _fillMissingExtensionFields(exts[i], { cert }); + } + cert.extensions = exts; + }; + cert.getExtension = function(options) { + if (typeof options === "string") { + options = { name: options }; + } + var rval = null; + var ext; + for (var i = 0; rval === null && i < cert.extensions.length; ++i) { + ext = cert.extensions[i]; + if (options.id && ext.id === options.id) { + rval = ext; + } else if (options.name && ext.name === options.name) { + rval = ext; + } + } + return rval; + }; + cert.sign = function(key, md) { + cert.md = md || forge2.md.sha1.create(); + var algorithmOid = oids[cert.md.algorithm + "WithRSAEncryption"]; + if (!algorithmOid) { + var error = new Error("Could not compute certificate digest. Unknown message digest algorithm OID."); + error.algorithm = cert.md.algorithm; + throw error; + } + cert.signatureOid = cert.siginfo.algorithmOid = algorithmOid; + cert.tbsCertificate = pki.getTBSCertificate(cert); + var bytes = asn1.toDer(cert.tbsCertificate); + cert.md.update(bytes.getBytes()); + cert.signature = key.sign(cert.md); + }; + cert.verify = function(child) { + var rval = false; + if (!cert.issued(child)) { + var issuer = child.issuer; + var subject = cert.subject; + var error = new Error( + "The parent certificate did not issue the given child certificate; the child certificate's issuer does not match the parent's subject." + ); + error.expectedIssuer = subject.attributes; + error.actualIssuer = issuer.attributes; + throw error; + } + var md = child.md; + if (md === null) { + md = _createSignatureDigest({ + signatureOid: child.signatureOid, + type: "certificate" + }); + var tbsCertificate = child.tbsCertificate || pki.getTBSCertificate(child); + var bytes = asn1.toDer(tbsCertificate); + md.update(bytes.getBytes()); + } + if (md !== null) { + rval = _verifySignature({ + certificate: cert, + md, + signature: child.signature + }); + } + return rval; + }; + cert.isIssuer = function(parent) { + var rval = false; + var i = cert.issuer; + var s = parent.subject; + if (i.hash && s.hash) { + rval = i.hash === s.hash; + } else if (i.attributes.length === s.attributes.length) { + rval = true; + var iattr, sattr; + for (var n = 0; rval && n < i.attributes.length; ++n) { + iattr = i.attributes[n]; + sattr = s.attributes[n]; + if (iattr.type !== sattr.type || iattr.value !== sattr.value) { + rval = false; + } + } + } + return rval; + }; + cert.issued = function(child) { + return child.isIssuer(cert); + }; + cert.generateSubjectKeyIdentifier = function() { + return pki.getPublicKeyFingerprint(cert.publicKey, { type: "RSAPublicKey" }); + }; + cert.verifySubjectKeyIdentifier = function() { + var oid = oids["subjectKeyIdentifier"]; + for (var i = 0; i < cert.extensions.length; ++i) { + var ext = cert.extensions[i]; + if (ext.id === oid) { + var ski = cert.generateSubjectKeyIdentifier().getBytes(); + return forge2.util.hexToBytes(ext.subjectKeyIdentifier) === ski; + } + } + return false; + }; + return cert; + }; + pki.certificateFromAsn1 = function(obj, computeHash) { + var capture = {}; + var errors = []; + if (!asn1.validate(obj, x509CertificateValidator, capture, errors)) { + var error = new Error("Cannot read X.509 certificate. ASN.1 object is not an X509v3 Certificate."); + error.errors = errors; + throw error; + } + var oid = asn1.derToOid(capture.publicKeyOid); + if (oid !== pki.oids.rsaEncryption) { + throw new Error("Cannot read public key. OID is not RSA."); + } + var cert = pki.createCertificate(); + cert.version = capture.certVersion ? capture.certVersion.charCodeAt(0) : 0; + var serial = forge2.util.createBuffer(capture.certSerialNumber); + cert.serialNumber = serial.toHex(); + cert.signatureOid = forge2.asn1.derToOid(capture.certSignatureOid); + cert.signatureParameters = _readSignatureParameters( + cert.signatureOid, + capture.certSignatureParams, + true + ); + cert.siginfo.algorithmOid = forge2.asn1.derToOid(capture.certinfoSignatureOid); + cert.siginfo.parameters = _readSignatureParameters( + cert.siginfo.algorithmOid, + capture.certinfoSignatureParams, + false + ); + cert.signature = capture.certSignature; + var validity = []; + if (capture.certValidity1UTCTime !== void 0) { + validity.push(asn1.utcTimeToDate(capture.certValidity1UTCTime)); + } + if (capture.certValidity2GeneralizedTime !== void 0) { + validity.push(asn1.generalizedTimeToDate( + capture.certValidity2GeneralizedTime + )); + } + if (capture.certValidity3UTCTime !== void 0) { + validity.push(asn1.utcTimeToDate(capture.certValidity3UTCTime)); + } + if (capture.certValidity4GeneralizedTime !== void 0) { + validity.push(asn1.generalizedTimeToDate( + capture.certValidity4GeneralizedTime + )); + } + if (validity.length > 2) { + throw new Error("Cannot read notBefore/notAfter validity times; more than two times were provided in the certificate."); + } + if (validity.length < 2) { + throw new Error("Cannot read notBefore/notAfter validity times; they were not provided as either UTCTime or GeneralizedTime."); + } + cert.validity.notBefore = validity[0]; + cert.validity.notAfter = validity[1]; + cert.tbsCertificate = capture.tbsCertificate; + if (computeHash) { + cert.md = _createSignatureDigest({ + signatureOid: cert.signatureOid, + type: "certificate" + }); + var bytes = asn1.toDer(cert.tbsCertificate); + cert.md.update(bytes.getBytes()); + } + var imd = forge2.md.sha1.create(); + var ibytes = asn1.toDer(capture.certIssuer); + imd.update(ibytes.getBytes()); + cert.issuer.getField = function(sn) { + return _getAttribute(cert.issuer, sn); + }; + cert.issuer.addField = function(attr) { + _fillMissingFields([attr]); + cert.issuer.attributes.push(attr); + }; + cert.issuer.attributes = pki.RDNAttributesAsArray(capture.certIssuer); + if (capture.certIssuerUniqueId) { + cert.issuer.uniqueId = capture.certIssuerUniqueId; + } + cert.issuer.hash = imd.digest().toHex(); + var smd = forge2.md.sha1.create(); + var sbytes = asn1.toDer(capture.certSubject); + smd.update(sbytes.getBytes()); + cert.subject.getField = function(sn) { + return _getAttribute(cert.subject, sn); + }; + cert.subject.addField = function(attr) { + _fillMissingFields([attr]); + cert.subject.attributes.push(attr); + }; + cert.subject.attributes = pki.RDNAttributesAsArray(capture.certSubject); + if (capture.certSubjectUniqueId) { + cert.subject.uniqueId = capture.certSubjectUniqueId; + } + cert.subject.hash = smd.digest().toHex(); + if (capture.certExtensions) { + cert.extensions = pki.certificateExtensionsFromAsn1(capture.certExtensions); + } else { + cert.extensions = []; + } + cert.publicKey = pki.publicKeyFromAsn1(capture.subjectPublicKeyInfo); + return cert; + }; + pki.certificateExtensionsFromAsn1 = function(exts) { + var rval = []; + for (var i = 0; i < exts.value.length; ++i) { + var extseq = exts.value[i]; + for (var ei = 0; ei < extseq.value.length; ++ei) { + rval.push(pki.certificateExtensionFromAsn1(extseq.value[ei])); + } + } + return rval; + }; + pki.certificateExtensionFromAsn1 = function(ext) { + var e = {}; + e.id = asn1.derToOid(ext.value[0].value); + e.critical = false; + if (ext.value[1].type === asn1.Type.BOOLEAN) { + e.critical = ext.value[1].value.charCodeAt(0) !== 0; + e.value = ext.value[2].value; + } else { + e.value = ext.value[1].value; + } + if (e.id in oids) { + e.name = oids[e.id]; + if (e.name === "keyUsage") { + var ev = asn1.fromDer(e.value); + var b2 = 0; + var b3 = 0; + if (ev.value.length > 1) { + b2 = ev.value.charCodeAt(1); + b3 = ev.value.length > 2 ? ev.value.charCodeAt(2) : 0; + } + e.digitalSignature = (b2 & 128) === 128; + e.nonRepudiation = (b2 & 64) === 64; + e.keyEncipherment = (b2 & 32) === 32; + e.dataEncipherment = (b2 & 16) === 16; + e.keyAgreement = (b2 & 8) === 8; + e.keyCertSign = (b2 & 4) === 4; + e.cRLSign = (b2 & 2) === 2; + e.encipherOnly = (b2 & 1) === 1; + e.decipherOnly = (b3 & 128) === 128; + } else if (e.name === "basicConstraints") { + var ev = asn1.fromDer(e.value); + if (ev.value.length > 0 && ev.value[0].type === asn1.Type.BOOLEAN) { + e.cA = ev.value[0].value.charCodeAt(0) !== 0; + } else { + e.cA = false; + } + var value = null; + if (ev.value.length > 0 && ev.value[0].type === asn1.Type.INTEGER) { + value = ev.value[0].value; + } else if (ev.value.length > 1) { + value = ev.value[1].value; + } + if (value !== null) { + e.pathLenConstraint = asn1.derToInteger(value); + } + } else if (e.name === "extKeyUsage") { + var ev = asn1.fromDer(e.value); + for (var vi = 0; vi < ev.value.length; ++vi) { + var oid = asn1.derToOid(ev.value[vi].value); + if (oid in oids) { + e[oids[oid]] = true; + } else { + e[oid] = true; + } + } + } else if (e.name === "nsCertType") { + var ev = asn1.fromDer(e.value); + var b2 = 0; + if (ev.value.length > 1) { + b2 = ev.value.charCodeAt(1); + } + e.client = (b2 & 128) === 128; + e.server = (b2 & 64) === 64; + e.email = (b2 & 32) === 32; + e.objsign = (b2 & 16) === 16; + e.reserved = (b2 & 8) === 8; + e.sslCA = (b2 & 4) === 4; + e.emailCA = (b2 & 2) === 2; + e.objCA = (b2 & 1) === 1; + } else if (e.name === "subjectAltName" || e.name === "issuerAltName") { + e.altNames = []; + var gn; + var ev = asn1.fromDer(e.value); + for (var n = 0; n < ev.value.length; ++n) { + gn = ev.value[n]; + var altName = { + type: gn.type, + value: gn.value + }; + e.altNames.push(altName); + switch (gn.type) { + case 1: + case 2: + case 6: + break; + case 7: + altName.ip = forge2.util.bytesToIP(gn.value); + break; + case 8: + altName.oid = asn1.derToOid(gn.value); + break; + default: + } + } + } else if (e.name === "subjectKeyIdentifier") { + var ev = asn1.fromDer(e.value); + e.subjectKeyIdentifier = forge2.util.bytesToHex(ev.value); + } + } + return e; + }; + pki.certificationRequestFromAsn1 = function(obj, computeHash) { + var capture = {}; + var errors = []; + if (!asn1.validate(obj, certificationRequestValidator, capture, errors)) { + var error = new Error("Cannot read PKCS#10 certificate request. ASN.1 object is not a PKCS#10 CertificationRequest."); + error.errors = errors; + throw error; + } + var oid = asn1.derToOid(capture.publicKeyOid); + if (oid !== pki.oids.rsaEncryption) { + throw new Error("Cannot read public key. OID is not RSA."); + } + var csr = pki.createCertificationRequest(); + csr.version = capture.csrVersion ? capture.csrVersion.charCodeAt(0) : 0; + csr.signatureOid = forge2.asn1.derToOid(capture.csrSignatureOid); + csr.signatureParameters = _readSignatureParameters( + csr.signatureOid, + capture.csrSignatureParams, + true + ); + csr.siginfo.algorithmOid = forge2.asn1.derToOid(capture.csrSignatureOid); + csr.siginfo.parameters = _readSignatureParameters( + csr.siginfo.algorithmOid, + capture.csrSignatureParams, + false + ); + csr.signature = capture.csrSignature; + csr.certificationRequestInfo = capture.certificationRequestInfo; + if (computeHash) { + csr.md = _createSignatureDigest({ + signatureOid: csr.signatureOid, + type: "certification request" + }); + var bytes = asn1.toDer(csr.certificationRequestInfo); + csr.md.update(bytes.getBytes()); + } + var smd = forge2.md.sha1.create(); + csr.subject.getField = function(sn) { + return _getAttribute(csr.subject, sn); + }; + csr.subject.addField = function(attr) { + _fillMissingFields([attr]); + csr.subject.attributes.push(attr); + }; + csr.subject.attributes = pki.RDNAttributesAsArray( + capture.certificationRequestInfoSubject, + smd + ); + csr.subject.hash = smd.digest().toHex(); + csr.publicKey = pki.publicKeyFromAsn1(capture.subjectPublicKeyInfo); + csr.getAttribute = function(sn) { + return _getAttribute(csr, sn); + }; + csr.addAttribute = function(attr) { + _fillMissingFields([attr]); + csr.attributes.push(attr); + }; + csr.attributes = pki.CRIAttributesAsArray( + capture.certificationRequestInfoAttributes || [] + ); + return csr; + }; + pki.createCertificationRequest = function() { + var csr = {}; + csr.version = 0; + csr.signatureOid = null; + csr.signature = null; + csr.siginfo = {}; + csr.siginfo.algorithmOid = null; + csr.subject = {}; + csr.subject.getField = function(sn) { + return _getAttribute(csr.subject, sn); + }; + csr.subject.addField = function(attr) { + _fillMissingFields([attr]); + csr.subject.attributes.push(attr); + }; + csr.subject.attributes = []; + csr.subject.hash = null; + csr.publicKey = null; + csr.attributes = []; + csr.getAttribute = function(sn) { + return _getAttribute(csr, sn); + }; + csr.addAttribute = function(attr) { + _fillMissingFields([attr]); + csr.attributes.push(attr); + }; + csr.md = null; + csr.setSubject = function(attrs) { + _fillMissingFields(attrs); + csr.subject.attributes = attrs; + csr.subject.hash = null; + }; + csr.setAttributes = function(attrs) { + _fillMissingFields(attrs); + csr.attributes = attrs; + }; + csr.sign = function(key, md) { + csr.md = md || forge2.md.sha1.create(); + var algorithmOid = oids[csr.md.algorithm + "WithRSAEncryption"]; + if (!algorithmOid) { + var error = new Error("Could not compute certification request digest. Unknown message digest algorithm OID."); + error.algorithm = csr.md.algorithm; + throw error; + } + csr.signatureOid = csr.siginfo.algorithmOid = algorithmOid; + csr.certificationRequestInfo = pki.getCertificationRequestInfo(csr); + var bytes = asn1.toDer(csr.certificationRequestInfo); + csr.md.update(bytes.getBytes()); + csr.signature = key.sign(csr.md); + }; + csr.verify = function() { + var rval = false; + var md = csr.md; + if (md === null) { + md = _createSignatureDigest({ + signatureOid: csr.signatureOid, + type: "certification request" + }); + var cri = csr.certificationRequestInfo || pki.getCertificationRequestInfo(csr); + var bytes = asn1.toDer(cri); + md.update(bytes.getBytes()); + } + if (md !== null) { + rval = _verifySignature({ + certificate: csr, + md, + signature: csr.signature + }); + } + return rval; + }; + return csr; + }; + function _dnToAsn1(obj) { + var rval = asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.SEQUENCE, + true, + [] + ); + var attr, set; + var attrs = obj.attributes; + for (var i = 0; i < attrs.length; ++i) { + attr = attrs[i]; + var value = attr.value; + var valueTagClass = asn1.Type.PRINTABLESTRING; + if ("valueTagClass" in attr) { + valueTagClass = attr.valueTagClass; + if (valueTagClass === asn1.Type.UTF8) { + value = forge2.util.encodeUtf8(value); + } + } + set = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SET, true, [ + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // AttributeType + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + asn1.oidToDer(attr.type).getBytes() + ), + // AttributeValue + asn1.create(asn1.Class.UNIVERSAL, valueTagClass, false, value) + ]) + ]); + rval.value.push(set); + } + return rval; + } + function _fillMissingFields(attrs) { + var attr; + for (var i = 0; i < attrs.length; ++i) { + attr = attrs[i]; + if (typeof attr.name === "undefined") { + if (attr.type && attr.type in pki.oids) { + attr.name = pki.oids[attr.type]; + } else if (attr.shortName && attr.shortName in _shortNames) { + attr.name = pki.oids[_shortNames[attr.shortName]]; + } + } + if (typeof attr.type === "undefined") { + if (attr.name && attr.name in pki.oids) { + attr.type = pki.oids[attr.name]; + } else { + var error = new Error("Attribute type not specified."); + error.attribute = attr; + throw error; + } + } + if (typeof attr.shortName === "undefined") { + if (attr.name && attr.name in _shortNames) { + attr.shortName = _shortNames[attr.name]; + } + } + if (attr.type === oids.extensionRequest) { + attr.valueConstructed = true; + attr.valueTagClass = asn1.Type.SEQUENCE; + if (!attr.value && attr.extensions) { + attr.value = []; + for (var ei = 0; ei < attr.extensions.length; ++ei) { + attr.value.push(pki.certificateExtensionToAsn1( + _fillMissingExtensionFields(attr.extensions[ei]) + )); + } + } + } + if (typeof attr.value === "undefined") { + var error = new Error("Attribute value not specified."); + error.attribute = attr; + throw error; + } + } + } + function _fillMissingExtensionFields(e, options) { + options = options || {}; + if (typeof e.name === "undefined") { + if (e.id && e.id in pki.oids) { + e.name = pki.oids[e.id]; + } + } + if (typeof e.id === "undefined") { + if (e.name && e.name in pki.oids) { + e.id = pki.oids[e.name]; + } else { + var error = new Error("Extension ID not specified."); + error.extension = e; + throw error; + } + } + if (typeof e.value !== "undefined") { + return e; + } + if (e.name === "keyUsage") { + var unused = 0; + var b2 = 0; + var b3 = 0; + if (e.digitalSignature) { + b2 |= 128; + unused = 7; + } + if (e.nonRepudiation) { + b2 |= 64; + unused = 6; + } + if (e.keyEncipherment) { + b2 |= 32; + unused = 5; + } + if (e.dataEncipherment) { + b2 |= 16; + unused = 4; + } + if (e.keyAgreement) { + b2 |= 8; + unused = 3; + } + if (e.keyCertSign) { + b2 |= 4; + unused = 2; + } + if (e.cRLSign) { + b2 |= 2; + unused = 1; + } + if (e.encipherOnly) { + b2 |= 1; + unused = 0; + } + if (e.decipherOnly) { + b3 |= 128; + unused = 7; + } + var value = String.fromCharCode(unused); + if (b3 !== 0) { + value += String.fromCharCode(b2) + String.fromCharCode(b3); + } else if (b2 !== 0) { + value += String.fromCharCode(b2); + } + e.value = asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.BITSTRING, + false, + value + ); + } else if (e.name === "basicConstraints") { + e.value = asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.SEQUENCE, + true, + [] + ); + if (e.cA) { + e.value.value.push(asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.BOOLEAN, + false, + String.fromCharCode(255) + )); + } + if ("pathLenConstraint" in e) { + e.value.value.push(asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.INTEGER, + false, + asn1.integerToDer(e.pathLenConstraint).getBytes() + )); + } + } else if (e.name === "extKeyUsage") { + e.value = asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.SEQUENCE, + true, + [] + ); + var seq = e.value.value; + for (var key in e) { + if (e[key] !== true) { + continue; + } + if (key in oids) { + seq.push(asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + asn1.oidToDer(oids[key]).getBytes() + )); + } else if (key.indexOf(".") !== -1) { + seq.push(asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + asn1.oidToDer(key).getBytes() + )); + } + } + } else if (e.name === "nsCertType") { + var unused = 0; + var b2 = 0; + if (e.client) { + b2 |= 128; + unused = 7; + } + if (e.server) { + b2 |= 64; + unused = 6; + } + if (e.email) { + b2 |= 32; + unused = 5; + } + if (e.objsign) { + b2 |= 16; + unused = 4; + } + if (e.reserved) { + b2 |= 8; + unused = 3; + } + if (e.sslCA) { + b2 |= 4; + unused = 2; + } + if (e.emailCA) { + b2 |= 2; + unused = 1; + } + if (e.objCA) { + b2 |= 1; + unused = 0; + } + var value = String.fromCharCode(unused); + if (b2 !== 0) { + value += String.fromCharCode(b2); + } + e.value = asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.BITSTRING, + false, + value + ); + } else if (e.name === "subjectAltName" || e.name === "issuerAltName") { + e.value = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, []); + var altName; + for (var n = 0; n < e.altNames.length; ++n) { + altName = e.altNames[n]; + var value = altName.value; + if (altName.type === 7 && altName.ip) { + value = forge2.util.bytesFromIP(altName.ip); + if (value === null) { + var error = new Error( + 'Extension "ip" value is not a valid IPv4 or IPv6 address.' + ); + error.extension = e; + throw error; + } + } else if (altName.type === 8) { + if (altName.oid) { + value = asn1.oidToDer(asn1.oidToDer(altName.oid)); + } else { + value = asn1.oidToDer(value); + } + } + e.value.value.push(asn1.create( + asn1.Class.CONTEXT_SPECIFIC, + altName.type, + false, + value + )); + } + } else if (e.name === "nsComment" && options.cert) { + if (!/^[\x00-\x7F]*$/.test(e.comment) || e.comment.length < 1 || e.comment.length > 128) { + throw new Error('Invalid "nsComment" content.'); + } + e.value = asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.IA5STRING, + false, + e.comment + ); + } else if (e.name === "subjectKeyIdentifier" && options.cert) { + var ski = options.cert.generateSubjectKeyIdentifier(); + e.subjectKeyIdentifier = ski.toHex(); + e.value = asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OCTETSTRING, + false, + ski.getBytes() + ); + } else if (e.name === "authorityKeyIdentifier" && options.cert) { + e.value = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, []); + var seq = e.value.value; + if (e.keyIdentifier) { + var keyIdentifier = e.keyIdentifier === true ? options.cert.generateSubjectKeyIdentifier().getBytes() : e.keyIdentifier; + seq.push( + asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, false, keyIdentifier) + ); + } + if (e.authorityCertIssuer) { + var authorityCertIssuer = [ + asn1.create(asn1.Class.CONTEXT_SPECIFIC, 4, true, [ + _dnToAsn1(e.authorityCertIssuer === true ? options.cert.issuer : e.authorityCertIssuer) + ]) + ]; + seq.push( + asn1.create(asn1.Class.CONTEXT_SPECIFIC, 1, true, authorityCertIssuer) + ); + } + if (e.serialNumber) { + var serialNumber = forge2.util.hexToBytes(e.serialNumber === true ? options.cert.serialNumber : e.serialNumber); + seq.push( + asn1.create(asn1.Class.CONTEXT_SPECIFIC, 2, false, serialNumber) + ); + } + } else if (e.name === "cRLDistributionPoints") { + e.value = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, []); + var seq = e.value.value; + var subSeq = asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.SEQUENCE, + true, + [] + ); + var fullNameGeneralNames = asn1.create( + asn1.Class.CONTEXT_SPECIFIC, + 0, + true, + [] + ); + var altName; + for (var n = 0; n < e.altNames.length; ++n) { + altName = e.altNames[n]; + var value = altName.value; + if (altName.type === 7 && altName.ip) { + value = forge2.util.bytesFromIP(altName.ip); + if (value === null) { + var error = new Error( + 'Extension "ip" value is not a valid IPv4 or IPv6 address.' + ); + error.extension = e; + throw error; + } + } else if (altName.type === 8) { + if (altName.oid) { + value = asn1.oidToDer(asn1.oidToDer(altName.oid)); + } else { + value = asn1.oidToDer(value); + } + } + fullNameGeneralNames.value.push(asn1.create( + asn1.Class.CONTEXT_SPECIFIC, + altName.type, + false, + value + )); + } + subSeq.value.push(asn1.create( + asn1.Class.CONTEXT_SPECIFIC, + 0, + true, + [fullNameGeneralNames] + )); + seq.push(subSeq); + } + if (typeof e.value === "undefined") { + var error = new Error("Extension value not specified."); + error.extension = e; + throw error; + } + return e; + } + function _signatureParametersToAsn1(oid, params) { + switch (oid) { + case oids["RSASSA-PSS"]: + var parts = []; + if (params.hash.algorithmOid !== void 0) { + parts.push(asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, [ + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + asn1.oidToDer(params.hash.algorithmOid).getBytes() + ), + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.NULL, false, "") + ]) + ])); + } + if (params.mgf.algorithmOid !== void 0) { + parts.push(asn1.create(asn1.Class.CONTEXT_SPECIFIC, 1, true, [ + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + asn1.oidToDer(params.mgf.algorithmOid).getBytes() + ), + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + asn1.oidToDer(params.mgf.hash.algorithmOid).getBytes() + ), + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.NULL, false, "") + ]) + ]) + ])); + } + if (params.saltLength !== void 0) { + parts.push(asn1.create(asn1.Class.CONTEXT_SPECIFIC, 2, true, [ + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.INTEGER, + false, + asn1.integerToDer(params.saltLength).getBytes() + ) + ])); + } + return asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, parts); + default: + return asn1.create(asn1.Class.UNIVERSAL, asn1.Type.NULL, false, ""); + } + } + function _CRIAttributesToAsn1(csr) { + var rval = asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, []); + if (csr.attributes.length === 0) { + return rval; + } + var attrs = csr.attributes; + for (var i = 0; i < attrs.length; ++i) { + var attr = attrs[i]; + var value = attr.value; + var valueTagClass = asn1.Type.UTF8; + if ("valueTagClass" in attr) { + valueTagClass = attr.valueTagClass; + } + if (valueTagClass === asn1.Type.UTF8) { + value = forge2.util.encodeUtf8(value); + } + var valueConstructed = false; + if ("valueConstructed" in attr) { + valueConstructed = attr.valueConstructed; + } + var seq = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // AttributeType + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + asn1.oidToDer(attr.type).getBytes() + ), + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SET, true, [ + // AttributeValue + asn1.create( + asn1.Class.UNIVERSAL, + valueTagClass, + valueConstructed, + value + ) + ]) + ]); + rval.value.push(seq); + } + return rval; + } + var jan_1_1950 = /* @__PURE__ */ new Date("1950-01-01T00:00:00Z"); + var jan_1_2050 = /* @__PURE__ */ new Date("2050-01-01T00:00:00Z"); + function _dateToAsn1(date) { + if (date >= jan_1_1950 && date < jan_1_2050) { + return asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.UTCTIME, + false, + asn1.dateToUtcTime(date) + ); + } else { + return asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.GENERALIZEDTIME, + false, + asn1.dateToGeneralizedTime(date) + ); + } + } + pki.getTBSCertificate = function(cert) { + var notBefore = _dateToAsn1(cert.validity.notBefore); + var notAfter = _dateToAsn1(cert.validity.notAfter); + var tbs = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // version + asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, [ + // integer + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.INTEGER, + false, + asn1.integerToDer(cert.version).getBytes() + ) + ]), + // serialNumber + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.INTEGER, + false, + forge2.util.hexToBytes(cert.serialNumber) + ), + // signature + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // algorithm + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + asn1.oidToDer(cert.siginfo.algorithmOid).getBytes() + ), + // parameters + _signatureParametersToAsn1( + cert.siginfo.algorithmOid, + cert.siginfo.parameters + ) + ]), + // issuer + _dnToAsn1(cert.issuer), + // validity + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + notBefore, + notAfter + ]), + // subject + _dnToAsn1(cert.subject), + // SubjectPublicKeyInfo + pki.publicKeyToAsn1(cert.publicKey) + ]); + if (cert.issuer.uniqueId) { + tbs.value.push( + asn1.create(asn1.Class.CONTEXT_SPECIFIC, 1, true, [ + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.BITSTRING, + false, + // TODO: support arbitrary bit length ids + String.fromCharCode(0) + cert.issuer.uniqueId + ) + ]) + ); + } + if (cert.subject.uniqueId) { + tbs.value.push( + asn1.create(asn1.Class.CONTEXT_SPECIFIC, 2, true, [ + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.BITSTRING, + false, + // TODO: support arbitrary bit length ids + String.fromCharCode(0) + cert.subject.uniqueId + ) + ]) + ); + } + if (cert.extensions.length > 0) { + tbs.value.push(pki.certificateExtensionsToAsn1(cert.extensions)); + } + return tbs; + }; + pki.getCertificationRequestInfo = function(csr) { + var cri = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // version + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.INTEGER, + false, + asn1.integerToDer(csr.version).getBytes() + ), + // subject + _dnToAsn1(csr.subject), + // SubjectPublicKeyInfo + pki.publicKeyToAsn1(csr.publicKey), + // attributes + _CRIAttributesToAsn1(csr) + ]); + return cri; + }; + pki.distinguishedNameToAsn1 = function(dn) { + return _dnToAsn1(dn); + }; + pki.certificateToAsn1 = function(cert) { + var tbsCertificate = cert.tbsCertificate || pki.getTBSCertificate(cert); + return asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // TBSCertificate + tbsCertificate, + // AlgorithmIdentifier (signature algorithm) + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // algorithm + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + asn1.oidToDer(cert.signatureOid).getBytes() + ), + // parameters + _signatureParametersToAsn1(cert.signatureOid, cert.signatureParameters) + ]), + // SignatureValue + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.BITSTRING, + false, + String.fromCharCode(0) + cert.signature + ) + ]); + }; + pki.certificateExtensionsToAsn1 = function(exts) { + var rval = asn1.create(asn1.Class.CONTEXT_SPECIFIC, 3, true, []); + var seq = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, []); + rval.value.push(seq); + for (var i = 0; i < exts.length; ++i) { + seq.value.push(pki.certificateExtensionToAsn1(exts[i])); + } + return rval; + }; + pki.certificateExtensionToAsn1 = function(ext) { + var extseq = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, []); + extseq.value.push(asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + asn1.oidToDer(ext.id).getBytes() + )); + if (ext.critical) { + extseq.value.push(asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.BOOLEAN, + false, + String.fromCharCode(255) + )); + } + var value = ext.value; + if (typeof ext.value !== "string") { + value = asn1.toDer(value).getBytes(); + } + extseq.value.push(asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OCTETSTRING, + false, + value + )); + return extseq; + }; + pki.certificationRequestToAsn1 = function(csr) { + var cri = csr.certificationRequestInfo || pki.getCertificationRequestInfo(csr); + return asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // CertificationRequestInfo + cri, + // AlgorithmIdentifier (signature algorithm) + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // algorithm + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + asn1.oidToDer(csr.signatureOid).getBytes() + ), + // parameters + _signatureParametersToAsn1(csr.signatureOid, csr.signatureParameters) + ]), + // signature + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.BITSTRING, + false, + String.fromCharCode(0) + csr.signature + ) + ]); + }; + pki.createCaStore = function(certs) { + var caStore = { + // stored certificates + certs: {} + }; + caStore.getIssuer = function(cert2) { + var rval = getBySubject(cert2.issuer); + return rval; + }; + caStore.addCertificate = function(cert2) { + if (typeof cert2 === "string") { + cert2 = forge2.pki.certificateFromPem(cert2); + } + ensureSubjectHasHash(cert2.subject); + if (!caStore.hasCertificate(cert2)) { + if (cert2.subject.hash in caStore.certs) { + var tmp = caStore.certs[cert2.subject.hash]; + if (!forge2.util.isArray(tmp)) { + tmp = [tmp]; + } + tmp.push(cert2); + caStore.certs[cert2.subject.hash] = tmp; + } else { + caStore.certs[cert2.subject.hash] = cert2; + } + } + }; + caStore.hasCertificate = function(cert2) { + if (typeof cert2 === "string") { + cert2 = forge2.pki.certificateFromPem(cert2); + } + var match = getBySubject(cert2.subject); + if (!match) { + return false; + } + if (!forge2.util.isArray(match)) { + match = [match]; + } + var der1 = asn1.toDer(pki.certificateToAsn1(cert2)).getBytes(); + for (var i2 = 0; i2 < match.length; ++i2) { + var der2 = asn1.toDer(pki.certificateToAsn1(match[i2])).getBytes(); + if (der1 === der2) { + return true; + } + } + return false; + }; + caStore.listAllCertificates = function() { + var certList = []; + for (var hash in caStore.certs) { + if (caStore.certs.hasOwnProperty(hash)) { + var value = caStore.certs[hash]; + if (!forge2.util.isArray(value)) { + certList.push(value); + } else { + for (var i2 = 0; i2 < value.length; ++i2) { + certList.push(value[i2]); + } + } + } + } + return certList; + }; + caStore.removeCertificate = function(cert2) { + var result; + if (typeof cert2 === "string") { + cert2 = forge2.pki.certificateFromPem(cert2); + } + ensureSubjectHasHash(cert2.subject); + if (!caStore.hasCertificate(cert2)) { + return null; + } + var match = getBySubject(cert2.subject); + if (!forge2.util.isArray(match)) { + result = caStore.certs[cert2.subject.hash]; + delete caStore.certs[cert2.subject.hash]; + return result; + } + var der1 = asn1.toDer(pki.certificateToAsn1(cert2)).getBytes(); + for (var i2 = 0; i2 < match.length; ++i2) { + var der2 = asn1.toDer(pki.certificateToAsn1(match[i2])).getBytes(); + if (der1 === der2) { + result = match[i2]; + match.splice(i2, 1); + } + } + if (match.length === 0) { + delete caStore.certs[cert2.subject.hash]; + } + return result; + }; + function getBySubject(subject) { + ensureSubjectHasHash(subject); + return caStore.certs[subject.hash] || null; + } + function ensureSubjectHasHash(subject) { + if (!subject.hash) { + var md = forge2.md.sha1.create(); + subject.attributes = pki.RDNAttributesAsArray(_dnToAsn1(subject), md); + subject.hash = md.digest().toHex(); + } + } + if (certs) { + for (var i = 0; i < certs.length; ++i) { + var cert = certs[i]; + caStore.addCertificate(cert); + } + } + return caStore; + }; + pki.certificateError = { + bad_certificate: "forge.pki.BadCertificate", + unsupported_certificate: "forge.pki.UnsupportedCertificate", + certificate_revoked: "forge.pki.CertificateRevoked", + certificate_expired: "forge.pki.CertificateExpired", + certificate_unknown: "forge.pki.CertificateUnknown", + unknown_ca: "forge.pki.UnknownCertificateAuthority" + }; + pki.verifyCertificateChain = function(caStore, chain, options) { + if (typeof options === "function") { + options = { verify: options }; + } + options = options || {}; + chain = chain.slice(0); + var certs = chain.slice(0); + var validityCheckDate = options.validityCheckDate; + if (typeof validityCheckDate === "undefined") { + validityCheckDate = /* @__PURE__ */ new Date(); + } + var first = true; + var error = null; + var depth = 0; + do { + var cert = chain.shift(); + var parent = null; + var selfSigned = false; + if (validityCheckDate) { + if (validityCheckDate < cert.validity.notBefore || validityCheckDate > cert.validity.notAfter) { + error = { + message: "Certificate is not valid yet or has expired.", + error: pki.certificateError.certificate_expired, + notBefore: cert.validity.notBefore, + notAfter: cert.validity.notAfter, + // TODO: we might want to reconsider renaming 'now' to + // 'validityCheckDate' should this API be changed in the future. + now: validityCheckDate + }; + } + } + if (error === null) { + parent = chain[0] || caStore.getIssuer(cert); + if (parent === null) { + if (cert.isIssuer(cert)) { + selfSigned = true; + parent = cert; + } + } + if (parent) { + var parents = parent; + if (!forge2.util.isArray(parents)) { + parents = [parents]; + } + var verified = false; + while (!verified && parents.length > 0) { + parent = parents.shift(); + try { + verified = parent.verify(cert); + } catch (ex) { + } + } + if (!verified) { + error = { + message: "Certificate signature is invalid.", + error: pki.certificateError.bad_certificate + }; + } + } + if (error === null && (!parent || selfSigned) && !caStore.hasCertificate(cert)) { + error = { + message: "Certificate is not trusted.", + error: pki.certificateError.unknown_ca + }; + } + } + if (error === null && parent && !cert.isIssuer(parent)) { + error = { + message: "Certificate issuer is invalid.", + error: pki.certificateError.bad_certificate + }; + } + if (error === null) { + var se = { + keyUsage: true, + basicConstraints: true + }; + for (var i = 0; error === null && i < cert.extensions.length; ++i) { + var ext = cert.extensions[i]; + if (ext.critical && !(ext.name in se)) { + error = { + message: "Certificate has an unsupported critical extension.", + error: pki.certificateError.unsupported_certificate + }; + } + } + } + if (error === null && (!first || chain.length === 0 && (!parent || selfSigned))) { + var bcExt = cert.getExtension("basicConstraints"); + var keyUsageExt = cert.getExtension("keyUsage"); + if (keyUsageExt !== null) { + if (!keyUsageExt.keyCertSign || bcExt === null) { + error = { + message: "Certificate keyUsage or basicConstraints conflict or indicate that the certificate is not a CA. If the certificate is the only one in the chain or isn't the first then the certificate must be a valid CA.", + error: pki.certificateError.bad_certificate + }; + } + } + if (error === null && bcExt !== null && !bcExt.cA) { + error = { + message: "Certificate basicConstraints indicates the certificate is not a CA.", + error: pki.certificateError.bad_certificate + }; + } + if (error === null && keyUsageExt !== null && "pathLenConstraint" in bcExt) { + var pathLen = depth - 1; + if (pathLen > bcExt.pathLenConstraint) { + error = { + message: "Certificate basicConstraints pathLenConstraint violated.", + error: pki.certificateError.bad_certificate + }; + } + } + } + var vfd = error === null ? true : error.error; + var ret = options.verify ? options.verify(vfd, depth, certs) : vfd; + if (ret === true) { + error = null; + } else { + if (vfd === true) { + error = { + message: "The application rejected the certificate.", + error: pki.certificateError.bad_certificate + }; + } + if (ret || ret === 0) { + if (typeof ret === "object" && !forge2.util.isArray(ret)) { + if (ret.message) { + error.message = ret.message; + } + if (ret.error) { + error.error = ret.error; + } + } else if (typeof ret === "string") { + error.error = ret; + } + } + throw error; + } + first = false; + ++depth; + } while (chain.length > 0); + return true; + }; + } +}); + +// node_modules/node-forge/lib/pkcs12.js +var require_pkcs12 = __commonJS({ + "node_modules/node-forge/lib/pkcs12.js"(exports, module) { + var forge2 = require_forge(); + require_asn1(); + require_hmac(); + require_oids(); + require_pkcs7asn1(); + require_pbe(); + require_random(); + require_rsa(); + require_sha1(); + require_util(); + require_x509(); + var asn1 = forge2.asn1; + var pki = forge2.pki; + var p12 = module.exports = forge2.pkcs12 = forge2.pkcs12 || {}; + var contentInfoValidator = { + name: "ContentInfo", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + // a ContentInfo + constructed: true, + value: [{ + name: "ContentInfo.contentType", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.OID, + constructed: false, + capture: "contentType" + }, { + name: "ContentInfo.content", + tagClass: asn1.Class.CONTEXT_SPECIFIC, + constructed: true, + captureAsn1: "content" + }] + }; + var pfxValidator = { + name: "PFX", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [ + { + name: "PFX.version", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.INTEGER, + constructed: false, + capture: "version" + }, + contentInfoValidator, + { + name: "PFX.macData", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + optional: true, + captureAsn1: "mac", + value: [{ + name: "PFX.macData.mac", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + // DigestInfo + constructed: true, + value: [{ + name: "PFX.macData.mac.digestAlgorithm", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + // DigestAlgorithmIdentifier + constructed: true, + value: [{ + name: "PFX.macData.mac.digestAlgorithm.algorithm", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.OID, + constructed: false, + capture: "macAlgorithm" + }, { + name: "PFX.macData.mac.digestAlgorithm.parameters", + tagClass: asn1.Class.UNIVERSAL, + captureAsn1: "macAlgorithmParameters" + }] + }, { + name: "PFX.macData.mac.digest", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.OCTETSTRING, + constructed: false, + capture: "macDigest" + }] + }, { + name: "PFX.macData.macSalt", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.OCTETSTRING, + constructed: false, + capture: "macSalt" + }, { + name: "PFX.macData.iterations", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.INTEGER, + constructed: false, + optional: true, + capture: "macIterations" + }] + } + ] + }; + var safeBagValidator = { + name: "SafeBag", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + name: "SafeBag.bagId", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.OID, + constructed: false, + capture: "bagId" + }, { + name: "SafeBag.bagValue", + tagClass: asn1.Class.CONTEXT_SPECIFIC, + constructed: true, + captureAsn1: "bagValue" + }, { + name: "SafeBag.bagAttributes", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SET, + constructed: true, + optional: true, + capture: "bagAttributes" + }] + }; + var attributeValidator = { + name: "Attribute", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + name: "Attribute.attrId", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.OID, + constructed: false, + capture: "oid" + }, { + name: "Attribute.attrValues", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SET, + constructed: true, + capture: "values" + }] + }; + var certBagValidator = { + name: "CertBag", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + name: "CertBag.certId", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.OID, + constructed: false, + capture: "certId" + }, { + name: "CertBag.certValue", + tagClass: asn1.Class.CONTEXT_SPECIFIC, + constructed: true, + /* So far we only support X.509 certificates (which are wrapped in + an OCTET STRING, hence hard code that here). */ + value: [{ + name: "CertBag.certValue[0]", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Class.OCTETSTRING, + constructed: false, + capture: "cert" + }] + }] + }; + function _getBagsByAttribute(safeContents, attrName, attrValue, bagType) { + var result = []; + for (var i = 0; i < safeContents.length; i++) { + for (var j = 0; j < safeContents[i].safeBags.length; j++) { + var bag = safeContents[i].safeBags[j]; + if (bagType !== void 0 && bag.type !== bagType) { + continue; + } + if (attrName === null) { + result.push(bag); + continue; + } + if (bag.attributes[attrName] !== void 0 && bag.attributes[attrName].indexOf(attrValue) >= 0) { + result.push(bag); + } + } + } + return result; + } + p12.pkcs12FromAsn1 = function(obj, strict, password) { + if (typeof strict === "string") { + password = strict; + strict = true; + } else if (strict === void 0) { + strict = true; + } + var capture = {}; + var errors = []; + if (!asn1.validate(obj, pfxValidator, capture, errors)) { + var error = new Error("Cannot read PKCS#12 PFX. ASN.1 object is not an PKCS#12 PFX."); + error.errors = error; + throw error; + } + var pfx = { + version: capture.version.charCodeAt(0), + safeContents: [], + /** + * Gets bags with matching attributes. + * + * @param filter the attributes to filter by: + * [localKeyId] the localKeyId to search for. + * [localKeyIdHex] the localKeyId in hex to search for. + * [friendlyName] the friendly name to search for. + * [bagType] bag type to narrow each attribute search by. + * + * @return a map of attribute type to an array of matching bags or, if no + * attribute was given but a bag type, the map key will be the + * bag type. + */ + getBags: function(filter) { + var rval = {}; + var localKeyId; + if ("localKeyId" in filter) { + localKeyId = filter.localKeyId; + } else if ("localKeyIdHex" in filter) { + localKeyId = forge2.util.hexToBytes(filter.localKeyIdHex); + } + if (localKeyId === void 0 && !("friendlyName" in filter) && "bagType" in filter) { + rval[filter.bagType] = _getBagsByAttribute( + pfx.safeContents, + null, + null, + filter.bagType + ); + } + if (localKeyId !== void 0) { + rval.localKeyId = _getBagsByAttribute( + pfx.safeContents, + "localKeyId", + localKeyId, + filter.bagType + ); + } + if ("friendlyName" in filter) { + rval.friendlyName = _getBagsByAttribute( + pfx.safeContents, + "friendlyName", + filter.friendlyName, + filter.bagType + ); + } + return rval; + }, + /** + * DEPRECATED: use getBags() instead. + * + * Get bags with matching friendlyName attribute. + * + * @param friendlyName the friendly name to search for. + * @param [bagType] bag type to narrow search by. + * + * @return an array of bags with matching friendlyName attribute. + */ + getBagsByFriendlyName: function(friendlyName, bagType) { + return _getBagsByAttribute( + pfx.safeContents, + "friendlyName", + friendlyName, + bagType + ); + }, + /** + * DEPRECATED: use getBags() instead. + * + * Get bags with matching localKeyId attribute. + * + * @param localKeyId the localKeyId to search for. + * @param [bagType] bag type to narrow search by. + * + * @return an array of bags with matching localKeyId attribute. + */ + getBagsByLocalKeyId: function(localKeyId, bagType) { + return _getBagsByAttribute( + pfx.safeContents, + "localKeyId", + localKeyId, + bagType + ); + } + }; + if (capture.version.charCodeAt(0) !== 3) { + var error = new Error("PKCS#12 PFX of version other than 3 not supported."); + error.version = capture.version.charCodeAt(0); + throw error; + } + if (asn1.derToOid(capture.contentType) !== pki.oids.data) { + var error = new Error("Only PKCS#12 PFX in password integrity mode supported."); + error.oid = asn1.derToOid(capture.contentType); + throw error; + } + var data = capture.content.value[0]; + if (data.tagClass !== asn1.Class.UNIVERSAL || data.type !== asn1.Type.OCTETSTRING) { + throw new Error("PKCS#12 authSafe content data is not an OCTET STRING."); + } + data = _decodePkcs7Data(data); + if (capture.mac) { + var md = null; + var macKeyBytes = 0; + var macAlgorithm = asn1.derToOid(capture.macAlgorithm); + switch (macAlgorithm) { + case pki.oids.sha1: + md = forge2.md.sha1.create(); + macKeyBytes = 20; + break; + case pki.oids.sha256: + md = forge2.md.sha256.create(); + macKeyBytes = 32; + break; + case pki.oids.sha384: + md = forge2.md.sha384.create(); + macKeyBytes = 48; + break; + case pki.oids.sha512: + md = forge2.md.sha512.create(); + macKeyBytes = 64; + break; + case pki.oids.md5: + md = forge2.md.md5.create(); + macKeyBytes = 16; + break; + } + if (md === null) { + throw new Error("PKCS#12 uses unsupported MAC algorithm: " + macAlgorithm); + } + var macSalt = new forge2.util.ByteBuffer(capture.macSalt); + var macIterations = "macIterations" in capture ? parseInt(forge2.util.bytesToHex(capture.macIterations), 16) : 1; + var macKey = p12.generateKey( + password, + macSalt, + 3, + macIterations, + macKeyBytes, + md + ); + var mac = forge2.hmac.create(); + mac.start(md, macKey); + mac.update(data.value); + var macValue = mac.getMac(); + if (macValue.getBytes() !== capture.macDigest) { + throw new Error("PKCS#12 MAC could not be verified. Invalid password?"); + } + } + _decodeAuthenticatedSafe(pfx, data.value, strict, password); + return pfx; + }; + function _decodePkcs7Data(data) { + if (data.composed || data.constructed) { + var value = forge2.util.createBuffer(); + for (var i = 0; i < data.value.length; ++i) { + value.putBytes(data.value[i].value); + } + data.composed = data.constructed = false; + data.value = value.getBytes(); + } + return data; + } + function _decodeAuthenticatedSafe(pfx, authSafe, strict, password) { + authSafe = asn1.fromDer(authSafe, strict); + if (authSafe.tagClass !== asn1.Class.UNIVERSAL || authSafe.type !== asn1.Type.SEQUENCE || authSafe.constructed !== true) { + throw new Error("PKCS#12 AuthenticatedSafe expected to be a SEQUENCE OF ContentInfo"); + } + for (var i = 0; i < authSafe.value.length; i++) { + var contentInfo = authSafe.value[i]; + var capture = {}; + var errors = []; + if (!asn1.validate(contentInfo, contentInfoValidator, capture, errors)) { + var error = new Error("Cannot read ContentInfo."); + error.errors = errors; + throw error; + } + var obj = { + encrypted: false + }; + var safeContents = null; + var data = capture.content.value[0]; + switch (asn1.derToOid(capture.contentType)) { + case pki.oids.data: + if (data.tagClass !== asn1.Class.UNIVERSAL || data.type !== asn1.Type.OCTETSTRING) { + throw new Error("PKCS#12 SafeContents Data is not an OCTET STRING."); + } + safeContents = _decodePkcs7Data(data).value; + break; + case pki.oids.encryptedData: + safeContents = _decryptSafeContents(data, password); + obj.encrypted = true; + break; + default: + var error = new Error("Unsupported PKCS#12 contentType."); + error.contentType = asn1.derToOid(capture.contentType); + throw error; + } + obj.safeBags = _decodeSafeContents(safeContents, strict, password); + pfx.safeContents.push(obj); + } + } + function _decryptSafeContents(data, password) { + var capture = {}; + var errors = []; + if (!asn1.validate( + data, + forge2.pkcs7.asn1.encryptedDataValidator, + capture, + errors + )) { + var error = new Error("Cannot read EncryptedContentInfo."); + error.errors = errors; + throw error; + } + var oid = asn1.derToOid(capture.contentType); + if (oid !== pki.oids.data) { + var error = new Error( + "PKCS#12 EncryptedContentInfo ContentType is not Data." + ); + error.oid = oid; + throw error; + } + oid = asn1.derToOid(capture.encAlgorithm); + var cipher = pki.pbe.getCipher(oid, capture.encParameter, password); + var encryptedContentAsn1 = _decodePkcs7Data(capture.encryptedContentAsn1); + var encrypted = forge2.util.createBuffer(encryptedContentAsn1.value); + cipher.update(encrypted); + if (!cipher.finish()) { + throw new Error("Failed to decrypt PKCS#12 SafeContents."); + } + return cipher.output.getBytes(); + } + function _decodeSafeContents(safeContents, strict, password) { + if (!strict && safeContents.length === 0) { + return []; + } + safeContents = asn1.fromDer(safeContents, strict); + if (safeContents.tagClass !== asn1.Class.UNIVERSAL || safeContents.type !== asn1.Type.SEQUENCE || safeContents.constructed !== true) { + throw new Error( + "PKCS#12 SafeContents expected to be a SEQUENCE OF SafeBag." + ); + } + var res = []; + for (var i = 0; i < safeContents.value.length; i++) { + var safeBag = safeContents.value[i]; + var capture = {}; + var errors = []; + if (!asn1.validate(safeBag, safeBagValidator, capture, errors)) { + var error = new Error("Cannot read SafeBag."); + error.errors = errors; + throw error; + } + var bag = { + type: asn1.derToOid(capture.bagId), + attributes: _decodeBagAttributes(capture.bagAttributes) + }; + res.push(bag); + var validator, decoder; + var bagAsn1 = capture.bagValue.value[0]; + switch (bag.type) { + case pki.oids.pkcs8ShroudedKeyBag: + bagAsn1 = pki.decryptPrivateKeyInfo(bagAsn1, password); + if (bagAsn1 === null) { + throw new Error( + "Unable to decrypt PKCS#8 ShroudedKeyBag, wrong password?" + ); + } + case pki.oids.keyBag: + try { + bag.key = pki.privateKeyFromAsn1(bagAsn1); + } catch (e) { + bag.key = null; + bag.asn1 = bagAsn1; + } + continue; + case pki.oids.certBag: + validator = certBagValidator; + decoder = function() { + if (asn1.derToOid(capture.certId) !== pki.oids.x509Certificate) { + var error2 = new Error( + "Unsupported certificate type, only X.509 supported." + ); + error2.oid = asn1.derToOid(capture.certId); + throw error2; + } + var certAsn1 = asn1.fromDer(capture.cert, strict); + try { + bag.cert = pki.certificateFromAsn1(certAsn1, true); + } catch (e) { + bag.cert = null; + bag.asn1 = certAsn1; + } + }; + break; + default: + var error = new Error("Unsupported PKCS#12 SafeBag type."); + error.oid = bag.type; + throw error; + } + if (validator !== void 0 && !asn1.validate(bagAsn1, validator, capture, errors)) { + var error = new Error("Cannot read PKCS#12 " + validator.name); + error.errors = errors; + throw error; + } + decoder(); + } + return res; + } + function _decodeBagAttributes(attributes) { + var decodedAttrs = {}; + if (attributes !== void 0) { + for (var i = 0; i < attributes.length; ++i) { + var capture = {}; + var errors = []; + if (!asn1.validate(attributes[i], attributeValidator, capture, errors)) { + var error = new Error("Cannot read PKCS#12 BagAttribute."); + error.errors = errors; + throw error; + } + var oid = asn1.derToOid(capture.oid); + if (pki.oids[oid] === void 0) { + continue; + } + decodedAttrs[pki.oids[oid]] = []; + for (var j = 0; j < capture.values.length; ++j) { + decodedAttrs[pki.oids[oid]].push(capture.values[j].value); + } + } + } + return decodedAttrs; + } + p12.toPkcs12Asn1 = function(key, cert, password, options) { + options = options || {}; + options.saltSize = options.saltSize || 8; + options.count = options.count || 2048; + options.algorithm = options.algorithm || options.encAlgorithm || "aes128"; + if (!("useMac" in options)) { + options.useMac = true; + } + if (!("localKeyId" in options)) { + options.localKeyId = null; + } + if (!("generateLocalKeyId" in options)) { + options.generateLocalKeyId = true; + } + var localKeyId = options.localKeyId; + var bagAttrs; + if (localKeyId !== null) { + localKeyId = forge2.util.hexToBytes(localKeyId); + } else if (options.generateLocalKeyId) { + if (cert) { + var pairedCert = forge2.util.isArray(cert) ? cert[0] : cert; + if (typeof pairedCert === "string") { + pairedCert = pki.certificateFromPem(pairedCert); + } + var sha1 = forge2.md.sha1.create(); + sha1.update(asn1.toDer(pki.certificateToAsn1(pairedCert)).getBytes()); + localKeyId = sha1.digest().getBytes(); + } else { + localKeyId = forge2.random.getBytes(20); + } + } + var attrs = []; + if (localKeyId !== null) { + attrs.push( + // localKeyID + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // attrId + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + asn1.oidToDer(pki.oids.localKeyId).getBytes() + ), + // attrValues + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SET, true, [ + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OCTETSTRING, + false, + localKeyId + ) + ]) + ]) + ); + } + if ("friendlyName" in options) { + attrs.push( + // friendlyName + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // attrId + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + asn1.oidToDer(pki.oids.friendlyName).getBytes() + ), + // attrValues + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SET, true, [ + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.BMPSTRING, + false, + options.friendlyName + ) + ]) + ]) + ); + } + if (attrs.length > 0) { + bagAttrs = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SET, true, attrs); + } + var contents = []; + var chain = []; + if (cert !== null) { + if (forge2.util.isArray(cert)) { + chain = cert; + } else { + chain = [cert]; + } + } + var certSafeBags = []; + for (var i = 0; i < chain.length; ++i) { + cert = chain[i]; + if (typeof cert === "string") { + cert = pki.certificateFromPem(cert); + } + var certBagAttrs = i === 0 ? bagAttrs : void 0; + var certAsn1 = pki.certificateToAsn1(cert); + var certSafeBag = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // bagId + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + asn1.oidToDer(pki.oids.certBag).getBytes() + ), + // bagValue + asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, [ + // CertBag + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // certId + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + asn1.oidToDer(pki.oids.x509Certificate).getBytes() + ), + // certValue (x509Certificate) + asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, [ + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OCTETSTRING, + false, + asn1.toDer(certAsn1).getBytes() + ) + ]) + ]) + ]), + // bagAttributes (OPTIONAL) + certBagAttrs + ]); + certSafeBags.push(certSafeBag); + } + if (certSafeBags.length > 0) { + var certSafeContents = asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.SEQUENCE, + true, + certSafeBags + ); + var certCI = ( + // PKCS#7 ContentInfo + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // contentType + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + // OID for the content type is 'data' + asn1.oidToDer(pki.oids.data).getBytes() + ), + // content + asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, [ + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OCTETSTRING, + false, + asn1.toDer(certSafeContents).getBytes() + ) + ]) + ]) + ); + contents.push(certCI); + } + var keyBag = null; + if (key !== null) { + var pkAsn1 = pki.wrapRsaPrivateKey(pki.privateKeyToAsn1(key)); + if (password === null) { + keyBag = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // bagId + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + asn1.oidToDer(pki.oids.keyBag).getBytes() + ), + // bagValue + asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, [ + // PrivateKeyInfo + pkAsn1 + ]), + // bagAttributes (OPTIONAL) + bagAttrs + ]); + } else { + keyBag = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // bagId + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + asn1.oidToDer(pki.oids.pkcs8ShroudedKeyBag).getBytes() + ), + // bagValue + asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, [ + // EncryptedPrivateKeyInfo + pki.encryptPrivateKeyInfo(pkAsn1, password, options) + ]), + // bagAttributes (OPTIONAL) + bagAttrs + ]); + } + var keySafeContents = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [keyBag]); + var keyCI = ( + // PKCS#7 ContentInfo + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // contentType + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + // OID for the content type is 'data' + asn1.oidToDer(pki.oids.data).getBytes() + ), + // content + asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, [ + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OCTETSTRING, + false, + asn1.toDer(keySafeContents).getBytes() + ) + ]) + ]) + ); + contents.push(keyCI); + } + var safe = asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.SEQUENCE, + true, + contents + ); + var macData; + if (options.useMac) { + var sha1 = forge2.md.sha1.create(); + var macSalt = new forge2.util.ByteBuffer( + forge2.random.getBytes(options.saltSize) + ); + var count = options.count; + var key = p12.generateKey(password, macSalt, 3, count, 20); + var mac = forge2.hmac.create(); + mac.start(sha1, key); + mac.update(asn1.toDer(safe).getBytes()); + var macValue = mac.getMac(); + macData = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // mac DigestInfo + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // digestAlgorithm + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // algorithm = SHA-1 + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + asn1.oidToDer(pki.oids.sha1).getBytes() + ), + // parameters = Null + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.NULL, false, "") + ]), + // digest + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OCTETSTRING, + false, + macValue.getBytes() + ) + ]), + // macSalt OCTET STRING + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OCTETSTRING, + false, + macSalt.getBytes() + ), + // iterations INTEGER (XXX: Only support count < 65536) + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.INTEGER, + false, + asn1.integerToDer(count).getBytes() + ) + ]); + } + return asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // version (3) + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.INTEGER, + false, + asn1.integerToDer(3).getBytes() + ), + // PKCS#7 ContentInfo + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // contentType + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + // OID for the content type is 'data' + asn1.oidToDer(pki.oids.data).getBytes() + ), + // content + asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, [ + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OCTETSTRING, + false, + asn1.toDer(safe).getBytes() + ) + ]) + ]), + macData + ]); + }; + p12.generateKey = forge2.pbe.generatePkcs12Key; + } +}); + +// node_modules/node-forge/lib/pki.js +var require_pki = __commonJS({ + "node_modules/node-forge/lib/pki.js"(exports, module) { + var forge2 = require_forge(); + require_asn1(); + require_oids(); + require_pbe(); + require_pem(); + require_pbkdf2(); + require_pkcs12(); + require_pss(); + require_rsa(); + require_util(); + require_x509(); + var asn1 = forge2.asn1; + var pki = module.exports = forge2.pki = forge2.pki || {}; + pki.pemToDer = function(pem) { + var msg = forge2.pem.decode(pem)[0]; + if (msg.procType && msg.procType.type === "ENCRYPTED") { + throw new Error("Could not convert PEM to DER; PEM is encrypted."); + } + return forge2.util.createBuffer(msg.body); + }; + pki.privateKeyFromPem = function(pem) { + var msg = forge2.pem.decode(pem)[0]; + if (msg.type !== "PRIVATE KEY" && msg.type !== "RSA PRIVATE KEY") { + var error = new Error('Could not convert private key from PEM; PEM header type is not "PRIVATE KEY" or "RSA PRIVATE KEY".'); + error.headerType = msg.type; + throw error; + } + if (msg.procType && msg.procType.type === "ENCRYPTED") { + throw new Error("Could not convert private key from PEM; PEM is encrypted."); + } + var obj = asn1.fromDer(msg.body); + return pki.privateKeyFromAsn1(obj); + }; + pki.privateKeyToPem = function(key, maxline) { + var msg = { + type: "RSA PRIVATE KEY", + body: asn1.toDer(pki.privateKeyToAsn1(key)).getBytes() + }; + return forge2.pem.encode(msg, { maxline }); + }; + pki.privateKeyInfoToPem = function(pki2, maxline) { + var msg = { + type: "PRIVATE KEY", + body: asn1.toDer(pki2).getBytes() + }; + return forge2.pem.encode(msg, { maxline }); + }; + } +}); + +// node_modules/node-forge/lib/tls.js +var require_tls = __commonJS({ + "node_modules/node-forge/lib/tls.js"(exports, module) { + var forge2 = require_forge(); + require_asn1(); + require_hmac(); + require_md5(); + require_pem(); + require_pki(); + require_random(); + require_sha1(); + require_util(); + var prf_TLS1 = function(secret, label, seed, length) { + var rval = forge2.util.createBuffer(); + var idx = secret.length >> 1; + var slen = idx + (secret.length & 1); + var s1 = secret.substr(0, slen); + var s2 = secret.substr(idx, slen); + var ai = forge2.util.createBuffer(); + var hmac = forge2.hmac.create(); + seed = label + seed; + var md5itr = Math.ceil(length / 16); + var sha1itr = Math.ceil(length / 20); + hmac.start("MD5", s1); + var md5bytes = forge2.util.createBuffer(); + ai.putBytes(seed); + for (var i = 0; i < md5itr; ++i) { + hmac.start(null, null); + hmac.update(ai.getBytes()); + ai.putBuffer(hmac.digest()); + hmac.start(null, null); + hmac.update(ai.bytes() + seed); + md5bytes.putBuffer(hmac.digest()); + } + hmac.start("SHA1", s2); + var sha1bytes = forge2.util.createBuffer(); + ai.clear(); + ai.putBytes(seed); + for (var i = 0; i < sha1itr; ++i) { + hmac.start(null, null); + hmac.update(ai.getBytes()); + ai.putBuffer(hmac.digest()); + hmac.start(null, null); + hmac.update(ai.bytes() + seed); + sha1bytes.putBuffer(hmac.digest()); + } + rval.putBytes(forge2.util.xorBytes( + md5bytes.getBytes(), + sha1bytes.getBytes(), + length + )); + return rval; + }; + var hmac_sha1 = function(key2, seqNum, record) { + var hmac = forge2.hmac.create(); + hmac.start("SHA1", key2); + var b = forge2.util.createBuffer(); + b.putInt32(seqNum[0]); + b.putInt32(seqNum[1]); + b.putByte(record.type); + b.putByte(record.version.major); + b.putByte(record.version.minor); + b.putInt16(record.length); + b.putBytes(record.fragment.bytes()); + hmac.update(b.getBytes()); + return hmac.digest().getBytes(); + }; + var deflate = function(c, record, s) { + var rval = false; + try { + var bytes = c.deflate(record.fragment.getBytes()); + record.fragment = forge2.util.createBuffer(bytes); + record.length = bytes.length; + rval = true; + } catch (ex) { + } + return rval; + }; + var inflate = function(c, record, s) { + var rval = false; + try { + var bytes = c.inflate(record.fragment.getBytes()); + record.fragment = forge2.util.createBuffer(bytes); + record.length = bytes.length; + rval = true; + } catch (ex) { + } + return rval; + }; + var readVector = function(b, lenBytes) { + var len = 0; + switch (lenBytes) { + case 1: + len = b.getByte(); + break; + case 2: + len = b.getInt16(); + break; + case 3: + len = b.getInt24(); + break; + case 4: + len = b.getInt32(); + break; + } + return forge2.util.createBuffer(b.getBytes(len)); + }; + var writeVector = function(b, lenBytes, v) { + b.putInt(v.length(), lenBytes << 3); + b.putBuffer(v); + }; + var tls = {}; + tls.Versions = { + TLS_1_0: { major: 3, minor: 1 }, + TLS_1_1: { major: 3, minor: 2 }, + TLS_1_2: { major: 3, minor: 3 } + }; + tls.SupportedVersions = [ + tls.Versions.TLS_1_1, + tls.Versions.TLS_1_0 + ]; + tls.Version = tls.SupportedVersions[0]; + tls.MaxFragment = 16384 - 1024; + tls.ConnectionEnd = { + server: 0, + client: 1 + }; + tls.PRFAlgorithm = { + tls_prf_sha256: 0 + }; + tls.BulkCipherAlgorithm = { + none: null, + rc4: 0, + des3: 1, + aes: 2 + }; + tls.CipherType = { + stream: 0, + block: 1, + aead: 2 + }; + tls.MACAlgorithm = { + none: null, + hmac_md5: 0, + hmac_sha1: 1, + hmac_sha256: 2, + hmac_sha384: 3, + hmac_sha512: 4 + }; + tls.CompressionMethod = { + none: 0, + deflate: 1 + }; + tls.ContentType = { + change_cipher_spec: 20, + alert: 21, + handshake: 22, + application_data: 23, + heartbeat: 24 + }; + tls.HandshakeType = { + hello_request: 0, + client_hello: 1, + server_hello: 2, + certificate: 11, + server_key_exchange: 12, + certificate_request: 13, + server_hello_done: 14, + certificate_verify: 15, + client_key_exchange: 16, + finished: 20 + }; + tls.Alert = {}; + tls.Alert.Level = { + warning: 1, + fatal: 2 + }; + tls.Alert.Description = { + close_notify: 0, + unexpected_message: 10, + bad_record_mac: 20, + decryption_failed: 21, + record_overflow: 22, + decompression_failure: 30, + handshake_failure: 40, + bad_certificate: 42, + unsupported_certificate: 43, + certificate_revoked: 44, + certificate_expired: 45, + certificate_unknown: 46, + illegal_parameter: 47, + unknown_ca: 48, + access_denied: 49, + decode_error: 50, + decrypt_error: 51, + export_restriction: 60, + protocol_version: 70, + insufficient_security: 71, + internal_error: 80, + user_canceled: 90, + no_renegotiation: 100 + }; + tls.HeartbeatMessageType = { + heartbeat_request: 1, + heartbeat_response: 2 + }; + tls.CipherSuites = {}; + tls.getCipherSuite = function(twoBytes) { + var rval = null; + for (var key2 in tls.CipherSuites) { + var cs = tls.CipherSuites[key2]; + if (cs.id[0] === twoBytes.charCodeAt(0) && cs.id[1] === twoBytes.charCodeAt(1)) { + rval = cs; + break; + } + } + return rval; + }; + tls.handleUnexpected = function(c, record) { + var ignore = !c.open && c.entity === tls.ConnectionEnd.client; + if (!ignore) { + c.error(c, { + message: "Unexpected message. Received TLS record out of order.", + send: true, + alert: { + level: tls.Alert.Level.fatal, + description: tls.Alert.Description.unexpected_message + } + }); + } + }; + tls.handleHelloRequest = function(c, record, length) { + if (!c.handshaking && c.handshakes > 0) { + tls.queue(c, tls.createAlert(c, { + level: tls.Alert.Level.warning, + description: tls.Alert.Description.no_renegotiation + })); + tls.flush(c); + } + c.process(); + }; + tls.parseHelloMessage = function(c, record, length) { + var msg = null; + var client = c.entity === tls.ConnectionEnd.client; + if (length < 38) { + c.error(c, { + message: client ? "Invalid ServerHello message. Message too short." : "Invalid ClientHello message. Message too short.", + send: true, + alert: { + level: tls.Alert.Level.fatal, + description: tls.Alert.Description.illegal_parameter + } + }); + } else { + var b = record.fragment; + var remaining = b.length(); + msg = { + version: { + major: b.getByte(), + minor: b.getByte() + }, + random: forge2.util.createBuffer(b.getBytes(32)), + session_id: readVector(b, 1), + extensions: [] + }; + if (client) { + msg.cipher_suite = b.getBytes(2); + msg.compression_method = b.getByte(); + } else { + msg.cipher_suites = readVector(b, 2); + msg.compression_methods = readVector(b, 1); + } + remaining = length - (remaining - b.length()); + if (remaining > 0) { + var exts = readVector(b, 2); + while (exts.length() > 0) { + msg.extensions.push({ + type: [exts.getByte(), exts.getByte()], + data: readVector(exts, 2) + }); + } + if (!client) { + for (var i = 0; i < msg.extensions.length; ++i) { + var ext = msg.extensions[i]; + if (ext.type[0] === 0 && ext.type[1] === 0) { + var snl = readVector(ext.data, 2); + while (snl.length() > 0) { + var snType = snl.getByte(); + if (snType !== 0) { + break; + } + c.session.extensions.server_name.serverNameList.push( + readVector(snl, 2).getBytes() + ); + } + } + } + } + } + if (c.session.version) { + if (msg.version.major !== c.session.version.major || msg.version.minor !== c.session.version.minor) { + return c.error(c, { + message: "TLS version change is disallowed during renegotiation.", + send: true, + alert: { + level: tls.Alert.Level.fatal, + description: tls.Alert.Description.protocol_version + } + }); + } + } + if (client) { + c.session.cipherSuite = tls.getCipherSuite(msg.cipher_suite); + } else { + var tmp = forge2.util.createBuffer(msg.cipher_suites.bytes()); + while (tmp.length() > 0) { + c.session.cipherSuite = tls.getCipherSuite(tmp.getBytes(2)); + if (c.session.cipherSuite !== null) { + break; + } + } + } + if (c.session.cipherSuite === null) { + return c.error(c, { + message: "No cipher suites in common.", + send: true, + alert: { + level: tls.Alert.Level.fatal, + description: tls.Alert.Description.handshake_failure + }, + cipherSuite: forge2.util.bytesToHex(msg.cipher_suite) + }); + } + if (client) { + c.session.compressionMethod = msg.compression_method; + } else { + c.session.compressionMethod = tls.CompressionMethod.none; + } + } + return msg; + }; + tls.createSecurityParameters = function(c, msg) { + var client = c.entity === tls.ConnectionEnd.client; + var msgRandom = msg.random.bytes(); + var cRandom = client ? c.session.sp.client_random : msgRandom; + var sRandom = client ? msgRandom : tls.createRandom().getBytes(); + c.session.sp = { + entity: c.entity, + prf_algorithm: tls.PRFAlgorithm.tls_prf_sha256, + bulk_cipher_algorithm: null, + cipher_type: null, + enc_key_length: null, + block_length: null, + fixed_iv_length: null, + record_iv_length: null, + mac_algorithm: null, + mac_length: null, + mac_key_length: null, + compression_algorithm: c.session.compressionMethod, + pre_master_secret: null, + master_secret: null, + client_random: cRandom, + server_random: sRandom + }; + }; + tls.handleServerHello = function(c, record, length) { + var msg = tls.parseHelloMessage(c, record, length); + if (c.fail) { + return; + } + if (msg.version.minor <= c.version.minor) { + c.version.minor = msg.version.minor; + } else { + return c.error(c, { + message: "Incompatible TLS version.", + send: true, + alert: { + level: tls.Alert.Level.fatal, + description: tls.Alert.Description.protocol_version + } + }); + } + c.session.version = c.version; + var sessionId = msg.session_id.bytes(); + if (sessionId.length > 0 && sessionId === c.session.id) { + c.expect = SCC; + c.session.resuming = true; + c.session.sp.server_random = msg.random.bytes(); + } else { + c.expect = SCE; + c.session.resuming = false; + tls.createSecurityParameters(c, msg); + } + c.session.id = sessionId; + c.process(); + }; + tls.handleClientHello = function(c, record, length) { + var msg = tls.parseHelloMessage(c, record, length); + if (c.fail) { + return; + } + var sessionId = msg.session_id.bytes(); + var session = null; + if (c.sessionCache) { + session = c.sessionCache.getSession(sessionId); + if (session === null) { + sessionId = ""; + } else if (session.version.major !== msg.version.major || session.version.minor > msg.version.minor) { + session = null; + sessionId = ""; + } + } + if (sessionId.length === 0) { + sessionId = forge2.random.getBytes(32); + } + c.session.id = sessionId; + c.session.clientHelloVersion = msg.version; + c.session.sp = {}; + if (session) { + c.version = c.session.version = session.version; + c.session.sp = session.sp; + } else { + var version; + for (var i = 1; i < tls.SupportedVersions.length; ++i) { + version = tls.SupportedVersions[i]; + if (version.minor <= msg.version.minor) { + break; + } + } + c.version = { major: version.major, minor: version.minor }; + c.session.version = c.version; + } + if (session !== null) { + c.expect = CCC; + c.session.resuming = true; + c.session.sp.client_random = msg.random.bytes(); + } else { + c.expect = c.verifyClient !== false ? CCE : CKE; + c.session.resuming = false; + tls.createSecurityParameters(c, msg); + } + c.open = true; + tls.queue(c, tls.createRecord(c, { + type: tls.ContentType.handshake, + data: tls.createServerHello(c) + })); + if (c.session.resuming) { + tls.queue(c, tls.createRecord(c, { + type: tls.ContentType.change_cipher_spec, + data: tls.createChangeCipherSpec() + })); + c.state.pending = tls.createConnectionState(c); + c.state.current.write = c.state.pending.write; + tls.queue(c, tls.createRecord(c, { + type: tls.ContentType.handshake, + data: tls.createFinished(c) + })); + } else { + tls.queue(c, tls.createRecord(c, { + type: tls.ContentType.handshake, + data: tls.createCertificate(c) + })); + if (!c.fail) { + tls.queue(c, tls.createRecord(c, { + type: tls.ContentType.handshake, + data: tls.createServerKeyExchange(c) + })); + if (c.verifyClient !== false) { + tls.queue(c, tls.createRecord(c, { + type: tls.ContentType.handshake, + data: tls.createCertificateRequest(c) + })); + } + tls.queue(c, tls.createRecord(c, { + type: tls.ContentType.handshake, + data: tls.createServerHelloDone(c) + })); + } + } + tls.flush(c); + c.process(); + }; + tls.handleCertificate = function(c, record, length) { + if (length < 3) { + return c.error(c, { + message: "Invalid Certificate message. Message too short.", + send: true, + alert: { + level: tls.Alert.Level.fatal, + description: tls.Alert.Description.illegal_parameter + } + }); + } + var b = record.fragment; + var msg = { + certificate_list: readVector(b, 3) + }; + var cert, asn1; + var certs = []; + try { + while (msg.certificate_list.length() > 0) { + cert = readVector(msg.certificate_list, 3); + asn1 = forge2.asn1.fromDer(cert); + cert = forge2.pki.certificateFromAsn1(asn1, true); + certs.push(cert); + } + } catch (ex) { + return c.error(c, { + message: "Could not parse certificate list.", + cause: ex, + send: true, + alert: { + level: tls.Alert.Level.fatal, + description: tls.Alert.Description.bad_certificate + } + }); + } + var client = c.entity === tls.ConnectionEnd.client; + if ((client || c.verifyClient === true) && certs.length === 0) { + c.error(c, { + message: client ? "No server certificate provided." : "No client certificate provided.", + send: true, + alert: { + level: tls.Alert.Level.fatal, + description: tls.Alert.Description.illegal_parameter + } + }); + } else if (certs.length === 0) { + c.expect = client ? SKE : CKE; + } else { + if (client) { + c.session.serverCertificate = certs[0]; + } else { + c.session.clientCertificate = certs[0]; + } + if (tls.verifyCertificateChain(c, certs)) { + c.expect = client ? SKE : CKE; + } + } + c.process(); + }; + tls.handleServerKeyExchange = function(c, record, length) { + if (length > 0) { + return c.error(c, { + message: "Invalid key parameters. Only RSA is supported.", + send: true, + alert: { + level: tls.Alert.Level.fatal, + description: tls.Alert.Description.unsupported_certificate + } + }); + } + c.expect = SCR; + c.process(); + }; + tls.handleClientKeyExchange = function(c, record, length) { + if (length < 48) { + return c.error(c, { + message: "Invalid key parameters. Only RSA is supported.", + send: true, + alert: { + level: tls.Alert.Level.fatal, + description: tls.Alert.Description.unsupported_certificate + } + }); + } + var b = record.fragment; + var msg = { + enc_pre_master_secret: readVector(b, 2).getBytes() + }; + var privateKey = null; + if (c.getPrivateKey) { + try { + privateKey = c.getPrivateKey(c, c.session.serverCertificate); + privateKey = forge2.pki.privateKeyFromPem(privateKey); + } catch (ex) { + c.error(c, { + message: "Could not get private key.", + cause: ex, + send: true, + alert: { + level: tls.Alert.Level.fatal, + description: tls.Alert.Description.internal_error + } + }); + } + } + if (privateKey === null) { + return c.error(c, { + message: "No private key set.", + send: true, + alert: { + level: tls.Alert.Level.fatal, + description: tls.Alert.Description.internal_error + } + }); + } + try { + var sp = c.session.sp; + sp.pre_master_secret = privateKey.decrypt(msg.enc_pre_master_secret); + var version = c.session.clientHelloVersion; + if (version.major !== sp.pre_master_secret.charCodeAt(0) || version.minor !== sp.pre_master_secret.charCodeAt(1)) { + throw new Error("TLS version rollback attack detected."); + } + } catch (ex) { + sp.pre_master_secret = forge2.random.getBytes(48); + } + c.expect = CCC; + if (c.session.clientCertificate !== null) { + c.expect = CCV; + } + c.process(); + }; + tls.handleCertificateRequest = function(c, record, length) { + if (length < 3) { + return c.error(c, { + message: "Invalid CertificateRequest. Message too short.", + send: true, + alert: { + level: tls.Alert.Level.fatal, + description: tls.Alert.Description.illegal_parameter + } + }); + } + var b = record.fragment; + var msg = { + certificate_types: readVector(b, 1), + certificate_authorities: readVector(b, 2) + }; + c.session.certificateRequest = msg; + c.expect = SHD; + c.process(); + }; + tls.handleCertificateVerify = function(c, record, length) { + if (length < 2) { + return c.error(c, { + message: "Invalid CertificateVerify. Message too short.", + send: true, + alert: { + level: tls.Alert.Level.fatal, + description: tls.Alert.Description.illegal_parameter + } + }); + } + var b = record.fragment; + b.read -= 4; + var msgBytes = b.bytes(); + b.read += 4; + var msg = { + signature: readVector(b, 2).getBytes() + }; + var verify = forge2.util.createBuffer(); + verify.putBuffer(c.session.md5.digest()); + verify.putBuffer(c.session.sha1.digest()); + verify = verify.getBytes(); + try { + var cert = c.session.clientCertificate; + if (!cert.publicKey.verify(verify, msg.signature, "NONE")) { + throw new Error("CertificateVerify signature does not match."); + } + c.session.md5.update(msgBytes); + c.session.sha1.update(msgBytes); + } catch (ex) { + return c.error(c, { + message: "Bad signature in CertificateVerify.", + send: true, + alert: { + level: tls.Alert.Level.fatal, + description: tls.Alert.Description.handshake_failure + } + }); + } + c.expect = CCC; + c.process(); + }; + tls.handleServerHelloDone = function(c, record, length) { + if (length > 0) { + return c.error(c, { + message: "Invalid ServerHelloDone message. Invalid length.", + send: true, + alert: { + level: tls.Alert.Level.fatal, + description: tls.Alert.Description.record_overflow + } + }); + } + if (c.serverCertificate === null) { + var error = { + message: "No server certificate provided. Not enough security.", + send: true, + alert: { + level: tls.Alert.Level.fatal, + description: tls.Alert.Description.insufficient_security + } + }; + var depth = 0; + var ret = c.verify(c, error.alert.description, depth, []); + if (ret !== true) { + if (ret || ret === 0) { + if (typeof ret === "object" && !forge2.util.isArray(ret)) { + if (ret.message) { + error.message = ret.message; + } + if (ret.alert) { + error.alert.description = ret.alert; + } + } else if (typeof ret === "number") { + error.alert.description = ret; + } + } + return c.error(c, error); + } + } + if (c.session.certificateRequest !== null) { + record = tls.createRecord(c, { + type: tls.ContentType.handshake, + data: tls.createCertificate(c) + }); + tls.queue(c, record); + } + record = tls.createRecord(c, { + type: tls.ContentType.handshake, + data: tls.createClientKeyExchange(c) + }); + tls.queue(c, record); + c.expect = SER; + var callback = function(c2, signature) { + if (c2.session.certificateRequest !== null && c2.session.clientCertificate !== null) { + tls.queue(c2, tls.createRecord(c2, { + type: tls.ContentType.handshake, + data: tls.createCertificateVerify(c2, signature) + })); + } + tls.queue(c2, tls.createRecord(c2, { + type: tls.ContentType.change_cipher_spec, + data: tls.createChangeCipherSpec() + })); + c2.state.pending = tls.createConnectionState(c2); + c2.state.current.write = c2.state.pending.write; + tls.queue(c2, tls.createRecord(c2, { + type: tls.ContentType.handshake, + data: tls.createFinished(c2) + })); + c2.expect = SCC; + tls.flush(c2); + c2.process(); + }; + if (c.session.certificateRequest === null || c.session.clientCertificate === null) { + return callback(c, null); + } + tls.getClientSignature(c, callback); + }; + tls.handleChangeCipherSpec = function(c, record) { + if (record.fragment.getByte() !== 1) { + return c.error(c, { + message: "Invalid ChangeCipherSpec message received.", + send: true, + alert: { + level: tls.Alert.Level.fatal, + description: tls.Alert.Description.illegal_parameter + } + }); + } + var client = c.entity === tls.ConnectionEnd.client; + if (c.session.resuming && client || !c.session.resuming && !client) { + c.state.pending = tls.createConnectionState(c); + } + c.state.current.read = c.state.pending.read; + if (!c.session.resuming && client || c.session.resuming && !client) { + c.state.pending = null; + } + c.expect = client ? SFI : CFI; + c.process(); + }; + tls.handleFinished = function(c, record, length) { + var b = record.fragment; + b.read -= 4; + var msgBytes = b.bytes(); + b.read += 4; + var vd = record.fragment.getBytes(); + b = forge2.util.createBuffer(); + b.putBuffer(c.session.md5.digest()); + b.putBuffer(c.session.sha1.digest()); + var client = c.entity === tls.ConnectionEnd.client; + var label = client ? "server finished" : "client finished"; + var sp = c.session.sp; + var vdl = 12; + var prf = prf_TLS1; + b = prf(sp.master_secret, label, b.getBytes(), vdl); + if (b.getBytes() !== vd) { + return c.error(c, { + message: "Invalid verify_data in Finished message.", + send: true, + alert: { + level: tls.Alert.Level.fatal, + description: tls.Alert.Description.decrypt_error + } + }); + } + c.session.md5.update(msgBytes); + c.session.sha1.update(msgBytes); + if (c.session.resuming && client || !c.session.resuming && !client) { + tls.queue(c, tls.createRecord(c, { + type: tls.ContentType.change_cipher_spec, + data: tls.createChangeCipherSpec() + })); + c.state.current.write = c.state.pending.write; + c.state.pending = null; + tls.queue(c, tls.createRecord(c, { + type: tls.ContentType.handshake, + data: tls.createFinished(c) + })); + } + c.expect = client ? SAD : CAD; + c.handshaking = false; + ++c.handshakes; + c.peerCertificate = client ? c.session.serverCertificate : c.session.clientCertificate; + tls.flush(c); + c.isConnected = true; + c.connected(c); + c.process(); + }; + tls.handleAlert = function(c, record) { + var b = record.fragment; + var alert = { + level: b.getByte(), + description: b.getByte() + }; + var msg; + switch (alert.description) { + case tls.Alert.Description.close_notify: + msg = "Connection closed."; + break; + case tls.Alert.Description.unexpected_message: + msg = "Unexpected message."; + break; + case tls.Alert.Description.bad_record_mac: + msg = "Bad record MAC."; + break; + case tls.Alert.Description.decryption_failed: + msg = "Decryption failed."; + break; + case tls.Alert.Description.record_overflow: + msg = "Record overflow."; + break; + case tls.Alert.Description.decompression_failure: + msg = "Decompression failed."; + break; + case tls.Alert.Description.handshake_failure: + msg = "Handshake failure."; + break; + case tls.Alert.Description.bad_certificate: + msg = "Bad certificate."; + break; + case tls.Alert.Description.unsupported_certificate: + msg = "Unsupported certificate."; + break; + case tls.Alert.Description.certificate_revoked: + msg = "Certificate revoked."; + break; + case tls.Alert.Description.certificate_expired: + msg = "Certificate expired."; + break; + case tls.Alert.Description.certificate_unknown: + msg = "Certificate unknown."; + break; + case tls.Alert.Description.illegal_parameter: + msg = "Illegal parameter."; + break; + case tls.Alert.Description.unknown_ca: + msg = "Unknown certificate authority."; + break; + case tls.Alert.Description.access_denied: + msg = "Access denied."; + break; + case tls.Alert.Description.decode_error: + msg = "Decode error."; + break; + case tls.Alert.Description.decrypt_error: + msg = "Decrypt error."; + break; + case tls.Alert.Description.export_restriction: + msg = "Export restriction."; + break; + case tls.Alert.Description.protocol_version: + msg = "Unsupported protocol version."; + break; + case tls.Alert.Description.insufficient_security: + msg = "Insufficient security."; + break; + case tls.Alert.Description.internal_error: + msg = "Internal error."; + break; + case tls.Alert.Description.user_canceled: + msg = "User canceled."; + break; + case tls.Alert.Description.no_renegotiation: + msg = "Renegotiation not supported."; + break; + default: + msg = "Unknown error."; + break; + } + if (alert.description === tls.Alert.Description.close_notify) { + return c.close(); + } + c.error(c, { + message: msg, + send: false, + // origin is the opposite end + origin: c.entity === tls.ConnectionEnd.client ? "server" : "client", + alert + }); + c.process(); + }; + tls.handleHandshake = function(c, record) { + var b = record.fragment; + var type = b.getByte(); + var length = b.getInt24(); + if (length > b.length()) { + c.fragmented = record; + record.fragment = forge2.util.createBuffer(); + b.read -= 4; + return c.process(); + } + c.fragmented = null; + b.read -= 4; + var bytes = b.bytes(length + 4); + b.read += 4; + if (type in hsTable[c.entity][c.expect]) { + if (c.entity === tls.ConnectionEnd.server && !c.open && !c.fail) { + c.handshaking = true; + c.session = { + version: null, + extensions: { + server_name: { + serverNameList: [] + } + }, + cipherSuite: null, + compressionMethod: null, + serverCertificate: null, + clientCertificate: null, + md5: forge2.md.md5.create(), + sha1: forge2.md.sha1.create() + }; + } + if (type !== tls.HandshakeType.hello_request && type !== tls.HandshakeType.certificate_verify && type !== tls.HandshakeType.finished) { + c.session.md5.update(bytes); + c.session.sha1.update(bytes); + } + hsTable[c.entity][c.expect][type](c, record, length); + } else { + tls.handleUnexpected(c, record); + } + }; + tls.handleApplicationData = function(c, record) { + c.data.putBuffer(record.fragment); + c.dataReady(c); + c.process(); + }; + tls.handleHeartbeat = function(c, record) { + var b = record.fragment; + var type = b.getByte(); + var length = b.getInt16(); + var payload = b.getBytes(length); + if (type === tls.HeartbeatMessageType.heartbeat_request) { + if (c.handshaking || length > payload.length) { + return c.process(); + } + tls.queue(c, tls.createRecord(c, { + type: tls.ContentType.heartbeat, + data: tls.createHeartbeat( + tls.HeartbeatMessageType.heartbeat_response, + payload + ) + })); + tls.flush(c); + } else if (type === tls.HeartbeatMessageType.heartbeat_response) { + if (payload !== c.expectedHeartbeatPayload) { + return c.process(); + } + if (c.heartbeatReceived) { + c.heartbeatReceived(c, forge2.util.createBuffer(payload)); + } + } + c.process(); + }; + var SHE = 0; + var SCE = 1; + var SKE = 2; + var SCR = 3; + var SHD = 4; + var SCC = 5; + var SFI = 6; + var SAD = 7; + var SER = 8; + var CHE = 0; + var CCE = 1; + var CKE = 2; + var CCV = 3; + var CCC = 4; + var CFI = 5; + var CAD = 6; + var __ = tls.handleUnexpected; + var R0 = tls.handleChangeCipherSpec; + var R1 = tls.handleAlert; + var R2 = tls.handleHandshake; + var R3 = tls.handleApplicationData; + var R4 = tls.handleHeartbeat; + var ctTable = []; + ctTable[tls.ConnectionEnd.client] = [ + // CC,AL,HS,AD,HB + /*SHE*/ + [__, R1, R2, __, R4], + /*SCE*/ + [__, R1, R2, __, R4], + /*SKE*/ + [__, R1, R2, __, R4], + /*SCR*/ + [__, R1, R2, __, R4], + /*SHD*/ + [__, R1, R2, __, R4], + /*SCC*/ + [R0, R1, __, __, R4], + /*SFI*/ + [__, R1, R2, __, R4], + /*SAD*/ + [__, R1, R2, R3, R4], + /*SER*/ + [__, R1, R2, __, R4] + ]; + ctTable[tls.ConnectionEnd.server] = [ + // CC,AL,HS,AD + /*CHE*/ + [__, R1, R2, __, R4], + /*CCE*/ + [__, R1, R2, __, R4], + /*CKE*/ + [__, R1, R2, __, R4], + /*CCV*/ + [__, R1, R2, __, R4], + /*CCC*/ + [R0, R1, __, __, R4], + /*CFI*/ + [__, R1, R2, __, R4], + /*CAD*/ + [__, R1, R2, R3, R4], + /*CER*/ + [__, R1, R2, __, R4] + ]; + var H0 = tls.handleHelloRequest; + var H1 = tls.handleServerHello; + var H2 = tls.handleCertificate; + var H3 = tls.handleServerKeyExchange; + var H4 = tls.handleCertificateRequest; + var H5 = tls.handleServerHelloDone; + var H6 = tls.handleFinished; + var hsTable = []; + hsTable[tls.ConnectionEnd.client] = [ + // HR,01,SH,03,04,05,06,07,08,09,10,SC,SK,CR,HD,15,CK,17,18,19,FI + /*SHE*/ + [__, __, H1, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __], + /*SCE*/ + [H0, __, __, __, __, __, __, __, __, __, __, H2, H3, H4, H5, __, __, __, __, __, __], + /*SKE*/ + [H0, __, __, __, __, __, __, __, __, __, __, __, H3, H4, H5, __, __, __, __, __, __], + /*SCR*/ + [H0, __, __, __, __, __, __, __, __, __, __, __, __, H4, H5, __, __, __, __, __, __], + /*SHD*/ + [H0, __, __, __, __, __, __, __, __, __, __, __, __, __, H5, __, __, __, __, __, __], + /*SCC*/ + [H0, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __], + /*SFI*/ + [H0, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, H6], + /*SAD*/ + [H0, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __], + /*SER*/ + [H0, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __] + ]; + var H7 = tls.handleClientHello; + var H8 = tls.handleClientKeyExchange; + var H9 = tls.handleCertificateVerify; + hsTable[tls.ConnectionEnd.server] = [ + // 01,CH,02,03,04,05,06,07,08,09,10,CC,12,13,14,CV,CK,17,18,19,FI + /*CHE*/ + [__, H7, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __], + /*CCE*/ + [__, __, __, __, __, __, __, __, __, __, __, H2, __, __, __, __, __, __, __, __, __], + /*CKE*/ + [__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, H8, __, __, __, __], + /*CCV*/ + [__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, H9, __, __, __, __, __], + /*CCC*/ + [__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __], + /*CFI*/ + [__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, H6], + /*CAD*/ + [__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __], + /*CER*/ + [__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __] + ]; + tls.generateKeys = function(c, sp) { + var prf = prf_TLS1; + var random = sp.client_random + sp.server_random; + if (!c.session.resuming) { + sp.master_secret = prf( + sp.pre_master_secret, + "master secret", + random, + 48 + ).bytes(); + sp.pre_master_secret = null; + } + random = sp.server_random + sp.client_random; + var length = 2 * sp.mac_key_length + 2 * sp.enc_key_length; + var tls10 = c.version.major === tls.Versions.TLS_1_0.major && c.version.minor === tls.Versions.TLS_1_0.minor; + if (tls10) { + length += 2 * sp.fixed_iv_length; + } + var km = prf(sp.master_secret, "key expansion", random, length); + var rval = { + client_write_MAC_key: km.getBytes(sp.mac_key_length), + server_write_MAC_key: km.getBytes(sp.mac_key_length), + client_write_key: km.getBytes(sp.enc_key_length), + server_write_key: km.getBytes(sp.enc_key_length) + }; + if (tls10) { + rval.client_write_IV = km.getBytes(sp.fixed_iv_length); + rval.server_write_IV = km.getBytes(sp.fixed_iv_length); + } + return rval; + }; + tls.createConnectionState = function(c) { + var client = c.entity === tls.ConnectionEnd.client; + var createMode = function() { + var mode = { + // two 32-bit numbers, first is most significant + sequenceNumber: [0, 0], + macKey: null, + macLength: 0, + macFunction: null, + cipherState: null, + cipherFunction: function(record) { + return true; + }, + compressionState: null, + compressFunction: function(record) { + return true; + }, + updateSequenceNumber: function() { + if (mode.sequenceNumber[1] === 4294967295) { + mode.sequenceNumber[1] = 0; + ++mode.sequenceNumber[0]; + } else { + ++mode.sequenceNumber[1]; + } + } + }; + return mode; + }; + var state = { + read: createMode(), + write: createMode() + }; + state.read.update = function(c2, record) { + if (!state.read.cipherFunction(record, state.read)) { + c2.error(c2, { + message: "Could not decrypt record or bad MAC.", + send: true, + alert: { + level: tls.Alert.Level.fatal, + // doesn't matter if decryption failed or MAC was + // invalid, return the same error so as not to reveal + // which one occurred + description: tls.Alert.Description.bad_record_mac + } + }); + } else if (!state.read.compressFunction(c2, record, state.read)) { + c2.error(c2, { + message: "Could not decompress record.", + send: true, + alert: { + level: tls.Alert.Level.fatal, + description: tls.Alert.Description.decompression_failure + } + }); + } + return !c2.fail; + }; + state.write.update = function(c2, record) { + if (!state.write.compressFunction(c2, record, state.write)) { + c2.error(c2, { + message: "Could not compress record.", + send: false, + alert: { + level: tls.Alert.Level.fatal, + description: tls.Alert.Description.internal_error + } + }); + } else if (!state.write.cipherFunction(record, state.write)) { + c2.error(c2, { + message: "Could not encrypt record.", + send: false, + alert: { + level: tls.Alert.Level.fatal, + description: tls.Alert.Description.internal_error + } + }); + } + return !c2.fail; + }; + if (c.session) { + var sp = c.session.sp; + c.session.cipherSuite.initSecurityParameters(sp); + sp.keys = tls.generateKeys(c, sp); + state.read.macKey = client ? sp.keys.server_write_MAC_key : sp.keys.client_write_MAC_key; + state.write.macKey = client ? sp.keys.client_write_MAC_key : sp.keys.server_write_MAC_key; + c.session.cipherSuite.initConnectionState(state, c, sp); + switch (sp.compression_algorithm) { + case tls.CompressionMethod.none: + break; + case tls.CompressionMethod.deflate: + state.read.compressFunction = inflate; + state.write.compressFunction = deflate; + break; + default: + throw new Error("Unsupported compression algorithm."); + } + } + return state; + }; + tls.createRandom = function() { + var d = /* @__PURE__ */ new Date(); + var utc = +d + d.getTimezoneOffset() * 6e4; + var rval = forge2.util.createBuffer(); + rval.putInt32(utc); + rval.putBytes(forge2.random.getBytes(28)); + return rval; + }; + tls.createRecord = function(c, options) { + if (!options.data) { + return null; + } + var record = { + type: options.type, + version: { + major: c.version.major, + minor: c.version.minor + }, + length: options.data.length(), + fragment: options.data + }; + return record; + }; + tls.createAlert = function(c, alert) { + var b = forge2.util.createBuffer(); + b.putByte(alert.level); + b.putByte(alert.description); + return tls.createRecord(c, { + type: tls.ContentType.alert, + data: b + }); + }; + tls.createClientHello = function(c) { + c.session.clientHelloVersion = { + major: c.version.major, + minor: c.version.minor + }; + var cipherSuites = forge2.util.createBuffer(); + for (var i = 0; i < c.cipherSuites.length; ++i) { + var cs = c.cipherSuites[i]; + cipherSuites.putByte(cs.id[0]); + cipherSuites.putByte(cs.id[1]); + } + var cSuites = cipherSuites.length(); + var compressionMethods = forge2.util.createBuffer(); + compressionMethods.putByte(tls.CompressionMethod.none); + var cMethods = compressionMethods.length(); + var extensions = forge2.util.createBuffer(); + if (c.virtualHost) { + var ext = forge2.util.createBuffer(); + ext.putByte(0); + ext.putByte(0); + var serverName = forge2.util.createBuffer(); + serverName.putByte(0); + writeVector(serverName, 2, forge2.util.createBuffer(c.virtualHost)); + var snList = forge2.util.createBuffer(); + writeVector(snList, 2, serverName); + writeVector(ext, 2, snList); + extensions.putBuffer(ext); + } + var extLength = extensions.length(); + if (extLength > 0) { + extLength += 2; + } + var sessionId = c.session.id; + var length = sessionId.length + 1 + // session ID vector + 2 + // version (major + minor) + 4 + 28 + // random time and random bytes + 2 + cSuites + // cipher suites vector + 1 + cMethods + // compression methods vector + extLength; + var rval = forge2.util.createBuffer(); + rval.putByte(tls.HandshakeType.client_hello); + rval.putInt24(length); + rval.putByte(c.version.major); + rval.putByte(c.version.minor); + rval.putBytes(c.session.sp.client_random); + writeVector(rval, 1, forge2.util.createBuffer(sessionId)); + writeVector(rval, 2, cipherSuites); + writeVector(rval, 1, compressionMethods); + if (extLength > 0) { + writeVector(rval, 2, extensions); + } + return rval; + }; + tls.createServerHello = function(c) { + var sessionId = c.session.id; + var length = sessionId.length + 1 + // session ID vector + 2 + // version (major + minor) + 4 + 28 + // random time and random bytes + 2 + // chosen cipher suite + 1; + var rval = forge2.util.createBuffer(); + rval.putByte(tls.HandshakeType.server_hello); + rval.putInt24(length); + rval.putByte(c.version.major); + rval.putByte(c.version.minor); + rval.putBytes(c.session.sp.server_random); + writeVector(rval, 1, forge2.util.createBuffer(sessionId)); + rval.putByte(c.session.cipherSuite.id[0]); + rval.putByte(c.session.cipherSuite.id[1]); + rval.putByte(c.session.compressionMethod); + return rval; + }; + tls.createCertificate = function(c) { + var client = c.entity === tls.ConnectionEnd.client; + var cert = null; + if (c.getCertificate) { + var hint; + if (client) { + hint = c.session.certificateRequest; + } else { + hint = c.session.extensions.server_name.serverNameList; + } + cert = c.getCertificate(c, hint); + } + var certList = forge2.util.createBuffer(); + if (cert !== null) { + try { + if (!forge2.util.isArray(cert)) { + cert = [cert]; + } + var asn1 = null; + for (var i = 0; i < cert.length; ++i) { + var msg = forge2.pem.decode(cert[i])[0]; + if (msg.type !== "CERTIFICATE" && msg.type !== "X509 CERTIFICATE" && msg.type !== "TRUSTED CERTIFICATE") { + var error = new Error('Could not convert certificate from PEM; PEM header type is not "CERTIFICATE", "X509 CERTIFICATE", or "TRUSTED CERTIFICATE".'); + error.headerType = msg.type; + throw error; + } + if (msg.procType && msg.procType.type === "ENCRYPTED") { + throw new Error("Could not convert certificate from PEM; PEM is encrypted."); + } + var der = forge2.util.createBuffer(msg.body); + if (asn1 === null) { + asn1 = forge2.asn1.fromDer(der.bytes(), false); + } + var certBuffer = forge2.util.createBuffer(); + writeVector(certBuffer, 3, der); + certList.putBuffer(certBuffer); + } + cert = forge2.pki.certificateFromAsn1(asn1); + if (client) { + c.session.clientCertificate = cert; + } else { + c.session.serverCertificate = cert; + } + } catch (ex) { + return c.error(c, { + message: "Could not send certificate list.", + cause: ex, + send: true, + alert: { + level: tls.Alert.Level.fatal, + description: tls.Alert.Description.bad_certificate + } + }); + } + } + var length = 3 + certList.length(); + var rval = forge2.util.createBuffer(); + rval.putByte(tls.HandshakeType.certificate); + rval.putInt24(length); + writeVector(rval, 3, certList); + return rval; + }; + tls.createClientKeyExchange = function(c) { + var b = forge2.util.createBuffer(); + b.putByte(c.session.clientHelloVersion.major); + b.putByte(c.session.clientHelloVersion.minor); + b.putBytes(forge2.random.getBytes(46)); + var sp = c.session.sp; + sp.pre_master_secret = b.getBytes(); + var key2 = c.session.serverCertificate.publicKey; + b = key2.encrypt(sp.pre_master_secret); + var length = b.length + 2; + var rval = forge2.util.createBuffer(); + rval.putByte(tls.HandshakeType.client_key_exchange); + rval.putInt24(length); + rval.putInt16(b.length); + rval.putBytes(b); + return rval; + }; + tls.createServerKeyExchange = function(c) { + var length = 0; + var rval = forge2.util.createBuffer(); + if (length > 0) { + rval.putByte(tls.HandshakeType.server_key_exchange); + rval.putInt24(length); + } + return rval; + }; + tls.getClientSignature = function(c, callback) { + var b = forge2.util.createBuffer(); + b.putBuffer(c.session.md5.digest()); + b.putBuffer(c.session.sha1.digest()); + b = b.getBytes(); + c.getSignature = c.getSignature || function(c2, b2, callback2) { + var privateKey = null; + if (c2.getPrivateKey) { + try { + privateKey = c2.getPrivateKey(c2, c2.session.clientCertificate); + privateKey = forge2.pki.privateKeyFromPem(privateKey); + } catch (ex) { + c2.error(c2, { + message: "Could not get private key.", + cause: ex, + send: true, + alert: { + level: tls.Alert.Level.fatal, + description: tls.Alert.Description.internal_error + } + }); + } + } + if (privateKey === null) { + c2.error(c2, { + message: "No private key set.", + send: true, + alert: { + level: tls.Alert.Level.fatal, + description: tls.Alert.Description.internal_error + } + }); + } else { + b2 = privateKey.sign(b2, null); + } + callback2(c2, b2); + }; + c.getSignature(c, b, callback); + }; + tls.createCertificateVerify = function(c, signature) { + var length = signature.length + 2; + var rval = forge2.util.createBuffer(); + rval.putByte(tls.HandshakeType.certificate_verify); + rval.putInt24(length); + rval.putInt16(signature.length); + rval.putBytes(signature); + return rval; + }; + tls.createCertificateRequest = function(c) { + var certTypes = forge2.util.createBuffer(); + certTypes.putByte(1); + var cAs = forge2.util.createBuffer(); + for (var key2 in c.caStore.certs) { + var cert = c.caStore.certs[key2]; + var dn = forge2.pki.distinguishedNameToAsn1(cert.subject); + var byteBuffer = forge2.asn1.toDer(dn); + cAs.putInt16(byteBuffer.length()); + cAs.putBuffer(byteBuffer); + } + var length = 1 + certTypes.length() + 2 + cAs.length(); + var rval = forge2.util.createBuffer(); + rval.putByte(tls.HandshakeType.certificate_request); + rval.putInt24(length); + writeVector(rval, 1, certTypes); + writeVector(rval, 2, cAs); + return rval; + }; + tls.createServerHelloDone = function(c) { + var rval = forge2.util.createBuffer(); + rval.putByte(tls.HandshakeType.server_hello_done); + rval.putInt24(0); + return rval; + }; + tls.createChangeCipherSpec = function() { + var rval = forge2.util.createBuffer(); + rval.putByte(1); + return rval; + }; + tls.createFinished = function(c) { + var b = forge2.util.createBuffer(); + b.putBuffer(c.session.md5.digest()); + b.putBuffer(c.session.sha1.digest()); + var client = c.entity === tls.ConnectionEnd.client; + var sp = c.session.sp; + var vdl = 12; + var prf = prf_TLS1; + var label = client ? "client finished" : "server finished"; + b = prf(sp.master_secret, label, b.getBytes(), vdl); + var rval = forge2.util.createBuffer(); + rval.putByte(tls.HandshakeType.finished); + rval.putInt24(b.length()); + rval.putBuffer(b); + return rval; + }; + tls.createHeartbeat = function(type, payload, payloadLength) { + if (typeof payloadLength === "undefined") { + payloadLength = payload.length; + } + var rval = forge2.util.createBuffer(); + rval.putByte(type); + rval.putInt16(payloadLength); + rval.putBytes(payload); + var plaintextLength = rval.length(); + var paddingLength = Math.max(16, plaintextLength - payloadLength - 3); + rval.putBytes(forge2.random.getBytes(paddingLength)); + return rval; + }; + tls.queue = function(c, record) { + if (!record) { + return; + } + if (record.fragment.length() === 0) { + if (record.type === tls.ContentType.handshake || record.type === tls.ContentType.alert || record.type === tls.ContentType.change_cipher_spec) { + return; + } + } + if (record.type === tls.ContentType.handshake) { + var bytes = record.fragment.bytes(); + c.session.md5.update(bytes); + c.session.sha1.update(bytes); + bytes = null; + } + var records; + if (record.fragment.length() <= tls.MaxFragment) { + records = [record]; + } else { + records = []; + var data = record.fragment.bytes(); + while (data.length > tls.MaxFragment) { + records.push(tls.createRecord(c, { + type: record.type, + data: forge2.util.createBuffer(data.slice(0, tls.MaxFragment)) + })); + data = data.slice(tls.MaxFragment); + } + if (data.length > 0) { + records.push(tls.createRecord(c, { + type: record.type, + data: forge2.util.createBuffer(data) + })); + } + } + for (var i = 0; i < records.length && !c.fail; ++i) { + var rec = records[i]; + var s = c.state.current.write; + if (s.update(c, rec)) { + c.records.push(rec); + } + } + }; + tls.flush = function(c) { + for (var i = 0; i < c.records.length; ++i) { + var record = c.records[i]; + c.tlsData.putByte(record.type); + c.tlsData.putByte(record.version.major); + c.tlsData.putByte(record.version.minor); + c.tlsData.putInt16(record.fragment.length()); + c.tlsData.putBuffer(c.records[i].fragment); + } + c.records = []; + return c.tlsDataReady(c); + }; + var _certErrorToAlertDesc = function(error) { + switch (error) { + case true: + return true; + case forge2.pki.certificateError.bad_certificate: + return tls.Alert.Description.bad_certificate; + case forge2.pki.certificateError.unsupported_certificate: + return tls.Alert.Description.unsupported_certificate; + case forge2.pki.certificateError.certificate_revoked: + return tls.Alert.Description.certificate_revoked; + case forge2.pki.certificateError.certificate_expired: + return tls.Alert.Description.certificate_expired; + case forge2.pki.certificateError.certificate_unknown: + return tls.Alert.Description.certificate_unknown; + case forge2.pki.certificateError.unknown_ca: + return tls.Alert.Description.unknown_ca; + default: + return tls.Alert.Description.bad_certificate; + } + }; + var _alertDescToCertError = function(desc) { + switch (desc) { + case true: + return true; + case tls.Alert.Description.bad_certificate: + return forge2.pki.certificateError.bad_certificate; + case tls.Alert.Description.unsupported_certificate: + return forge2.pki.certificateError.unsupported_certificate; + case tls.Alert.Description.certificate_revoked: + return forge2.pki.certificateError.certificate_revoked; + case tls.Alert.Description.certificate_expired: + return forge2.pki.certificateError.certificate_expired; + case tls.Alert.Description.certificate_unknown: + return forge2.pki.certificateError.certificate_unknown; + case tls.Alert.Description.unknown_ca: + return forge2.pki.certificateError.unknown_ca; + default: + return forge2.pki.certificateError.bad_certificate; + } + }; + tls.verifyCertificateChain = function(c, chain) { + try { + var options = {}; + for (var key2 in c.verifyOptions) { + options[key2] = c.verifyOptions[key2]; + } + options.verify = function(vfd, depth, chain2) { + var desc = _certErrorToAlertDesc(vfd); + var ret = c.verify(c, vfd, depth, chain2); + if (ret !== true) { + if (typeof ret === "object" && !forge2.util.isArray(ret)) { + var error = new Error("The application rejected the certificate."); + error.send = true; + error.alert = { + level: tls.Alert.Level.fatal, + description: tls.Alert.Description.bad_certificate + }; + if (ret.message) { + error.message = ret.message; + } + if (ret.alert) { + error.alert.description = ret.alert; + } + throw error; + } + if (ret !== vfd) { + ret = _alertDescToCertError(ret); + } + } + return ret; + }; + forge2.pki.verifyCertificateChain(c.caStore, chain, options); + } catch (ex) { + var err = ex; + if (typeof err !== "object" || forge2.util.isArray(err)) { + err = { + send: true, + alert: { + level: tls.Alert.Level.fatal, + description: _certErrorToAlertDesc(ex) + } + }; + } + if (!("send" in err)) { + err.send = true; + } + if (!("alert" in err)) { + err.alert = { + level: tls.Alert.Level.fatal, + description: _certErrorToAlertDesc(err.error) + }; + } + c.error(c, err); + } + return !c.fail; + }; + tls.createSessionCache = function(cache, capacity) { + var rval = null; + if (cache && cache.getSession && cache.setSession && cache.order) { + rval = cache; + } else { + rval = {}; + rval.cache = cache || {}; + rval.capacity = Math.max(capacity || 100, 1); + rval.order = []; + for (var key2 in cache) { + if (rval.order.length <= capacity) { + rval.order.push(key2); + } else { + delete cache[key2]; + } + } + rval.getSession = function(sessionId) { + var session = null; + var key3 = null; + if (sessionId) { + key3 = forge2.util.bytesToHex(sessionId); + } else if (rval.order.length > 0) { + key3 = rval.order[0]; + } + if (key3 !== null && key3 in rval.cache) { + session = rval.cache[key3]; + delete rval.cache[key3]; + for (var i in rval.order) { + if (rval.order[i] === key3) { + rval.order.splice(i, 1); + break; + } + } + } + return session; + }; + rval.setSession = function(sessionId, session) { + if (rval.order.length === rval.capacity) { + var key3 = rval.order.shift(); + delete rval.cache[key3]; + } + var key3 = forge2.util.bytesToHex(sessionId); + rval.order.push(key3); + rval.cache[key3] = session; + }; + } + return rval; + }; + tls.createConnection = function(options) { + var caStore = null; + if (options.caStore) { + if (forge2.util.isArray(options.caStore)) { + caStore = forge2.pki.createCaStore(options.caStore); + } else { + caStore = options.caStore; + } + } else { + caStore = forge2.pki.createCaStore(); + } + var cipherSuites = options.cipherSuites || null; + if (cipherSuites === null) { + cipherSuites = []; + for (var key2 in tls.CipherSuites) { + cipherSuites.push(tls.CipherSuites[key2]); + } + } + var entity = options.server || false ? tls.ConnectionEnd.server : tls.ConnectionEnd.client; + var sessionCache = options.sessionCache ? tls.createSessionCache(options.sessionCache) : null; + var c = { + version: { major: tls.Version.major, minor: tls.Version.minor }, + entity, + sessionId: options.sessionId, + caStore, + sessionCache, + cipherSuites, + connected: options.connected, + virtualHost: options.virtualHost || null, + verifyClient: options.verifyClient || false, + verify: options.verify || function(cn, vfd, dpth, cts) { + return vfd; + }, + verifyOptions: options.verifyOptions || {}, + getCertificate: options.getCertificate || null, + getPrivateKey: options.getPrivateKey || null, + getSignature: options.getSignature || null, + input: forge2.util.createBuffer(), + tlsData: forge2.util.createBuffer(), + data: forge2.util.createBuffer(), + tlsDataReady: options.tlsDataReady, + dataReady: options.dataReady, + heartbeatReceived: options.heartbeatReceived, + closed: options.closed, + error: function(c2, ex) { + ex.origin = ex.origin || (c2.entity === tls.ConnectionEnd.client ? "client" : "server"); + if (ex.send) { + tls.queue(c2, tls.createAlert(c2, ex.alert)); + tls.flush(c2); + } + var fatal = ex.fatal !== false; + if (fatal) { + c2.fail = true; + } + options.error(c2, ex); + if (fatal) { + c2.close(false); + } + }, + deflate: options.deflate || null, + inflate: options.inflate || null + }; + c.reset = function(clearFail) { + c.version = { major: tls.Version.major, minor: tls.Version.minor }; + c.record = null; + c.session = null; + c.peerCertificate = null; + c.state = { + pending: null, + current: null + }; + c.expect = c.entity === tls.ConnectionEnd.client ? SHE : CHE; + c.fragmented = null; + c.records = []; + c.open = false; + c.handshakes = 0; + c.handshaking = false; + c.isConnected = false; + c.fail = !(clearFail || typeof clearFail === "undefined"); + c.input.clear(); + c.tlsData.clear(); + c.data.clear(); + c.state.current = tls.createConnectionState(c); + }; + c.reset(); + var _update = function(c2, record) { + var aligned = record.type - tls.ContentType.change_cipher_spec; + var handlers = ctTable[c2.entity][c2.expect]; + if (aligned in handlers) { + handlers[aligned](c2, record); + } else { + tls.handleUnexpected(c2, record); + } + }; + var _readRecordHeader = function(c2) { + var rval = 0; + var b = c2.input; + var len = b.length(); + if (len < 5) { + rval = 5 - len; + } else { + c2.record = { + type: b.getByte(), + version: { + major: b.getByte(), + minor: b.getByte() + }, + length: b.getInt16(), + fragment: forge2.util.createBuffer(), + ready: false + }; + var compatibleVersion = c2.record.version.major === c2.version.major; + if (compatibleVersion && c2.session && c2.session.version) { + compatibleVersion = c2.record.version.minor === c2.version.minor; + } + if (!compatibleVersion) { + c2.error(c2, { + message: "Incompatible TLS version.", + send: true, + alert: { + level: tls.Alert.Level.fatal, + description: tls.Alert.Description.protocol_version + } + }); + } + } + return rval; + }; + var _readRecord = function(c2) { + var rval = 0; + var b = c2.input; + var len = b.length(); + if (len < c2.record.length) { + rval = c2.record.length - len; + } else { + c2.record.fragment.putBytes(b.getBytes(c2.record.length)); + b.compact(); + var s = c2.state.current.read; + if (s.update(c2, c2.record)) { + if (c2.fragmented !== null) { + if (c2.fragmented.type === c2.record.type) { + c2.fragmented.fragment.putBuffer(c2.record.fragment); + c2.record = c2.fragmented; + } else { + c2.error(c2, { + message: "Invalid fragmented record.", + send: true, + alert: { + level: tls.Alert.Level.fatal, + description: tls.Alert.Description.unexpected_message + } + }); + } + } + c2.record.ready = true; + } + } + return rval; + }; + c.handshake = function(sessionId) { + if (c.entity !== tls.ConnectionEnd.client) { + c.error(c, { + message: "Cannot initiate handshake as a server.", + fatal: false + }); + } else if (c.handshaking) { + c.error(c, { + message: "Handshake already in progress.", + fatal: false + }); + } else { + if (c.fail && !c.open && c.handshakes === 0) { + c.fail = false; + } + c.handshaking = true; + sessionId = sessionId || ""; + var session = null; + if (sessionId.length > 0) { + if (c.sessionCache) { + session = c.sessionCache.getSession(sessionId); + } + if (session === null) { + sessionId = ""; + } + } + if (sessionId.length === 0 && c.sessionCache) { + session = c.sessionCache.getSession(); + if (session !== null) { + sessionId = session.id; + } + } + c.session = { + id: sessionId, + version: null, + cipherSuite: null, + compressionMethod: null, + serverCertificate: null, + certificateRequest: null, + clientCertificate: null, + sp: {}, + md5: forge2.md.md5.create(), + sha1: forge2.md.sha1.create() + }; + if (session) { + c.version = session.version; + c.session.sp = session.sp; + } + c.session.sp.client_random = tls.createRandom().getBytes(); + c.open = true; + tls.queue(c, tls.createRecord(c, { + type: tls.ContentType.handshake, + data: tls.createClientHello(c) + })); + tls.flush(c); + } + }; + c.process = function(data) { + var rval = 0; + if (data) { + c.input.putBytes(data); + } + if (!c.fail) { + if (c.record !== null && c.record.ready && c.record.fragment.isEmpty()) { + c.record = null; + } + if (c.record === null) { + rval = _readRecordHeader(c); + } + if (!c.fail && c.record !== null && !c.record.ready) { + rval = _readRecord(c); + } + if (!c.fail && c.record !== null && c.record.ready) { + _update(c, c.record); + } + } + return rval; + }; + c.prepare = function(data) { + tls.queue(c, tls.createRecord(c, { + type: tls.ContentType.application_data, + data: forge2.util.createBuffer(data) + })); + return tls.flush(c); + }; + c.prepareHeartbeatRequest = function(payload, payloadLength) { + if (payload instanceof forge2.util.ByteBuffer) { + payload = payload.bytes(); + } + if (typeof payloadLength === "undefined") { + payloadLength = payload.length; + } + c.expectedHeartbeatPayload = payload; + tls.queue(c, tls.createRecord(c, { + type: tls.ContentType.heartbeat, + data: tls.createHeartbeat( + tls.HeartbeatMessageType.heartbeat_request, + payload, + payloadLength + ) + })); + return tls.flush(c); + }; + c.close = function(clearFail) { + if (!c.fail && c.sessionCache && c.session) { + var session = { + id: c.session.id, + version: c.session.version, + sp: c.session.sp + }; + session.sp.keys = null; + c.sessionCache.setSession(session.id, session); + } + if (c.open) { + c.open = false; + c.input.clear(); + if (c.isConnected || c.handshaking) { + c.isConnected = c.handshaking = false; + tls.queue(c, tls.createAlert(c, { + level: tls.Alert.Level.warning, + description: tls.Alert.Description.close_notify + })); + tls.flush(c); + } + c.closed(c); + } + c.reset(clearFail); + }; + return c; + }; + module.exports = forge2.tls = forge2.tls || {}; + for (key in tls) { + if (typeof tls[key] !== "function") { + forge2.tls[key] = tls[key]; + } + } + var key; + forge2.tls.prf_tls1 = prf_TLS1; + forge2.tls.hmac_sha1 = hmac_sha1; + forge2.tls.createSessionCache = tls.createSessionCache; + forge2.tls.createConnection = tls.createConnection; + } +}); + +// node_modules/node-forge/lib/aesCipherSuites.js +var require_aesCipherSuites = __commonJS({ + "node_modules/node-forge/lib/aesCipherSuites.js"(exports, module) { + var forge2 = require_forge(); + require_aes(); + require_tls(); + var tls = module.exports = forge2.tls; + tls.CipherSuites["TLS_RSA_WITH_AES_128_CBC_SHA"] = { + id: [0, 47], + name: "TLS_RSA_WITH_AES_128_CBC_SHA", + initSecurityParameters: function(sp) { + sp.bulk_cipher_algorithm = tls.BulkCipherAlgorithm.aes; + sp.cipher_type = tls.CipherType.block; + sp.enc_key_length = 16; + sp.block_length = 16; + sp.fixed_iv_length = 16; + sp.record_iv_length = 16; + sp.mac_algorithm = tls.MACAlgorithm.hmac_sha1; + sp.mac_length = 20; + sp.mac_key_length = 20; + }, + initConnectionState + }; + tls.CipherSuites["TLS_RSA_WITH_AES_256_CBC_SHA"] = { + id: [0, 53], + name: "TLS_RSA_WITH_AES_256_CBC_SHA", + initSecurityParameters: function(sp) { + sp.bulk_cipher_algorithm = tls.BulkCipherAlgorithm.aes; + sp.cipher_type = tls.CipherType.block; + sp.enc_key_length = 32; + sp.block_length = 16; + sp.fixed_iv_length = 16; + sp.record_iv_length = 16; + sp.mac_algorithm = tls.MACAlgorithm.hmac_sha1; + sp.mac_length = 20; + sp.mac_key_length = 20; + }, + initConnectionState + }; + function initConnectionState(state, c, sp) { + var client = c.entity === forge2.tls.ConnectionEnd.client; + state.read.cipherState = { + init: false, + cipher: forge2.cipher.createDecipher("AES-CBC", client ? sp.keys.server_write_key : sp.keys.client_write_key), + iv: client ? sp.keys.server_write_IV : sp.keys.client_write_IV + }; + state.write.cipherState = { + init: false, + cipher: forge2.cipher.createCipher("AES-CBC", client ? sp.keys.client_write_key : sp.keys.server_write_key), + iv: client ? sp.keys.client_write_IV : sp.keys.server_write_IV + }; + state.read.cipherFunction = decrypt_aes_cbc_sha1; + state.write.cipherFunction = encrypt_aes_cbc_sha1; + state.read.macLength = state.write.macLength = sp.mac_length; + state.read.macFunction = state.write.macFunction = tls.hmac_sha1; + } + function encrypt_aes_cbc_sha1(record, s) { + var rval = false; + var mac = s.macFunction(s.macKey, s.sequenceNumber, record); + record.fragment.putBytes(mac); + s.updateSequenceNumber(); + var iv; + if (record.version.minor === tls.Versions.TLS_1_0.minor) { + iv = s.cipherState.init ? null : s.cipherState.iv; + } else { + iv = forge2.random.getBytesSync(16); + } + s.cipherState.init = true; + var cipher = s.cipherState.cipher; + cipher.start({ iv }); + if (record.version.minor >= tls.Versions.TLS_1_1.minor) { + cipher.output.putBytes(iv); + } + cipher.update(record.fragment); + if (cipher.finish(encrypt_aes_cbc_sha1_padding)) { + record.fragment = cipher.output; + record.length = record.fragment.length(); + rval = true; + } + return rval; + } + function encrypt_aes_cbc_sha1_padding(blockSize, input, decrypt) { + if (!decrypt) { + var padding = blockSize - input.length() % blockSize; + input.fillWithByte(padding - 1, padding); + } + return true; + } + function decrypt_aes_cbc_sha1_padding(blockSize, output, decrypt) { + var rval = true; + if (decrypt) { + var len = output.length(); + var paddingLength = output.last(); + for (var i = len - 1 - paddingLength; i < len - 1; ++i) { + rval = rval && output.at(i) == paddingLength; + } + if (rval) { + output.truncate(paddingLength + 1); + } + } + return rval; + } + function decrypt_aes_cbc_sha1(record, s) { + var rval = false; + var iv; + if (record.version.minor === tls.Versions.TLS_1_0.minor) { + iv = s.cipherState.init ? null : s.cipherState.iv; + } else { + iv = record.fragment.getBytes(16); + } + s.cipherState.init = true; + var cipher = s.cipherState.cipher; + cipher.start({ iv }); + cipher.update(record.fragment); + rval = cipher.finish(decrypt_aes_cbc_sha1_padding); + var macLen = s.macLength; + var mac = forge2.random.getBytesSync(macLen); + var len = cipher.output.length(); + if (len >= macLen) { + record.fragment = cipher.output.getBytes(len - macLen); + mac = cipher.output.getBytes(macLen); + } else { + record.fragment = cipher.output.getBytes(); + } + record.fragment = forge2.util.createBuffer(record.fragment); + record.length = record.fragment.length(); + var mac2 = s.macFunction(s.macKey, s.sequenceNumber, record); + s.updateSequenceNumber(); + rval = compareMacs(s.macKey, mac, mac2) && rval; + return rval; + } + function compareMacs(key, mac1, mac2) { + var hmac = forge2.hmac.create(); + hmac.start("SHA1", key); + hmac.update(mac1); + mac1 = hmac.digest().getBytes(); + hmac.start(null, null); + hmac.update(mac2); + mac2 = hmac.digest().getBytes(); + return mac1 === mac2; + } + } +}); + +// node_modules/node-forge/lib/sha512.js +var require_sha512 = __commonJS({ + "node_modules/node-forge/lib/sha512.js"(exports, module) { + var forge2 = require_forge(); + require_md(); + require_util(); + var sha512 = module.exports = forge2.sha512 = forge2.sha512 || {}; + forge2.md.sha512 = forge2.md.algorithms.sha512 = sha512; + var sha384 = forge2.sha384 = forge2.sha512.sha384 = forge2.sha512.sha384 || {}; + sha384.create = function() { + return sha512.create("SHA-384"); + }; + forge2.md.sha384 = forge2.md.algorithms.sha384 = sha384; + forge2.sha512.sha256 = forge2.sha512.sha256 || { + create: function() { + return sha512.create("SHA-512/256"); + } + }; + forge2.md["sha512/256"] = forge2.md.algorithms["sha512/256"] = forge2.sha512.sha256; + forge2.sha512.sha224 = forge2.sha512.sha224 || { + create: function() { + return sha512.create("SHA-512/224"); + } + }; + forge2.md["sha512/224"] = forge2.md.algorithms["sha512/224"] = forge2.sha512.sha224; + sha512.create = function(algorithm) { + if (!_initialized) { + _init(); + } + if (typeof algorithm === "undefined") { + algorithm = "SHA-512"; + } + if (!(algorithm in _states)) { + throw new Error("Invalid SHA-512 algorithm: " + algorithm); + } + var _state = _states[algorithm]; + var _h = null; + var _input = forge2.util.createBuffer(); + var _w = new Array(80); + for (var wi = 0; wi < 80; ++wi) { + _w[wi] = new Array(2); + } + var digestLength = 64; + switch (algorithm) { + case "SHA-384": + digestLength = 48; + break; + case "SHA-512/256": + digestLength = 32; + break; + case "SHA-512/224": + digestLength = 28; + break; + } + var md = { + // SHA-512 => sha512 + algorithm: algorithm.replace("-", "").toLowerCase(), + blockLength: 128, + digestLength, + // 56-bit length of message so far (does not including padding) + messageLength: 0, + // true message length + fullMessageLength: null, + // size of message length in bytes + messageLengthSize: 16 + }; + md.start = function() { + md.messageLength = 0; + md.fullMessageLength = md.messageLength128 = []; + var int32s = md.messageLengthSize / 4; + for (var i = 0; i < int32s; ++i) { + md.fullMessageLength.push(0); + } + _input = forge2.util.createBuffer(); + _h = new Array(_state.length); + for (var i = 0; i < _state.length; ++i) { + _h[i] = _state[i].slice(0); + } + return md; + }; + md.start(); + md.update = function(msg, encoding) { + if (encoding === "utf8") { + msg = forge2.util.encodeUtf8(msg); + } + var len = msg.length; + md.messageLength += len; + len = [len / 4294967296 >>> 0, len >>> 0]; + for (var i = md.fullMessageLength.length - 1; i >= 0; --i) { + md.fullMessageLength[i] += len[1]; + len[1] = len[0] + (md.fullMessageLength[i] / 4294967296 >>> 0); + md.fullMessageLength[i] = md.fullMessageLength[i] >>> 0; + len[0] = len[1] / 4294967296 >>> 0; + } + _input.putBytes(msg); + _update(_h, _w, _input); + if (_input.read > 2048 || _input.length() === 0) { + _input.compact(); + } + return md; + }; + md.digest = function() { + var finalBlock = forge2.util.createBuffer(); + finalBlock.putBytes(_input.bytes()); + var remaining = md.fullMessageLength[md.fullMessageLength.length - 1] + md.messageLengthSize; + var overflow = remaining & md.blockLength - 1; + finalBlock.putBytes(_padding.substr(0, md.blockLength - overflow)); + var next, carry; + var bits = md.fullMessageLength[0] * 8; + for (var i = 0; i < md.fullMessageLength.length - 1; ++i) { + next = md.fullMessageLength[i + 1] * 8; + carry = next / 4294967296 >>> 0; + bits += carry; + finalBlock.putInt32(bits >>> 0); + bits = next >>> 0; + } + finalBlock.putInt32(bits); + var h = new Array(_h.length); + for (var i = 0; i < _h.length; ++i) { + h[i] = _h[i].slice(0); + } + _update(h, _w, finalBlock); + var rval = forge2.util.createBuffer(); + var hlen; + if (algorithm === "SHA-512") { + hlen = h.length; + } else if (algorithm === "SHA-384") { + hlen = h.length - 2; + } else { + hlen = h.length - 4; + } + for (var i = 0; i < hlen; ++i) { + rval.putInt32(h[i][0]); + if (i !== hlen - 1 || algorithm !== "SHA-512/224") { + rval.putInt32(h[i][1]); + } + } + return rval; + }; + return md; + }; + var _padding = null; + var _initialized = false; + var _k = null; + var _states = null; + function _init() { + _padding = String.fromCharCode(128); + _padding += forge2.util.fillString(String.fromCharCode(0), 128); + _k = [ + [1116352408, 3609767458], + [1899447441, 602891725], + [3049323471, 3964484399], + [3921009573, 2173295548], + [961987163, 4081628472], + [1508970993, 3053834265], + [2453635748, 2937671579], + [2870763221, 3664609560], + [3624381080, 2734883394], + [310598401, 1164996542], + [607225278, 1323610764], + [1426881987, 3590304994], + [1925078388, 4068182383], + [2162078206, 991336113], + [2614888103, 633803317], + [3248222580, 3479774868], + [3835390401, 2666613458], + [4022224774, 944711139], + [264347078, 2341262773], + [604807628, 2007800933], + [770255983, 1495990901], + [1249150122, 1856431235], + [1555081692, 3175218132], + [1996064986, 2198950837], + [2554220882, 3999719339], + [2821834349, 766784016], + [2952996808, 2566594879], + [3210313671, 3203337956], + [3336571891, 1034457026], + [3584528711, 2466948901], + [113926993, 3758326383], + [338241895, 168717936], + [666307205, 1188179964], + [773529912, 1546045734], + [1294757372, 1522805485], + [1396182291, 2643833823], + [1695183700, 2343527390], + [1986661051, 1014477480], + [2177026350, 1206759142], + [2456956037, 344077627], + [2730485921, 1290863460], + [2820302411, 3158454273], + [3259730800, 3505952657], + [3345764771, 106217008], + [3516065817, 3606008344], + [3600352804, 1432725776], + [4094571909, 1467031594], + [275423344, 851169720], + [430227734, 3100823752], + [506948616, 1363258195], + [659060556, 3750685593], + [883997877, 3785050280], + [958139571, 3318307427], + [1322822218, 3812723403], + [1537002063, 2003034995], + [1747873779, 3602036899], + [1955562222, 1575990012], + [2024104815, 1125592928], + [2227730452, 2716904306], + [2361852424, 442776044], + [2428436474, 593698344], + [2756734187, 3733110249], + [3204031479, 2999351573], + [3329325298, 3815920427], + [3391569614, 3928383900], + [3515267271, 566280711], + [3940187606, 3454069534], + [4118630271, 4000239992], + [116418474, 1914138554], + [174292421, 2731055270], + [289380356, 3203993006], + [460393269, 320620315], + [685471733, 587496836], + [852142971, 1086792851], + [1017036298, 365543100], + [1126000580, 2618297676], + [1288033470, 3409855158], + [1501505948, 4234509866], + [1607167915, 987167468], + [1816402316, 1246189591] + ]; + _states = {}; + _states["SHA-512"] = [ + [1779033703, 4089235720], + [3144134277, 2227873595], + [1013904242, 4271175723], + [2773480762, 1595750129], + [1359893119, 2917565137], + [2600822924, 725511199], + [528734635, 4215389547], + [1541459225, 327033209] + ]; + _states["SHA-384"] = [ + [3418070365, 3238371032], + [1654270250, 914150663], + [2438529370, 812702999], + [355462360, 4144912697], + [1731405415, 4290775857], + [2394180231, 1750603025], + [3675008525, 1694076839], + [1203062813, 3204075428] + ]; + _states["SHA-512/256"] = [ + [573645204, 4230739756], + [2673172387, 3360449730], + [596883563, 1867755857], + [2520282905, 1497426621], + [2519219938, 2827943907], + [3193839141, 1401305490], + [721525244, 746961066], + [246885852, 2177182882] + ]; + _states["SHA-512/224"] = [ + [2352822216, 424955298], + [1944164710, 2312950998], + [502970286, 855612546], + [1738396948, 1479516111], + [258812777, 2077511080], + [2011393907, 79989058], + [1067287976, 1780299464], + [286451373, 2446758561] + ]; + _initialized = true; + } + function _update(s, w, bytes) { + var t1_hi, t1_lo; + var t2_hi, t2_lo; + var s0_hi, s0_lo; + var s1_hi, s1_lo; + var ch_hi, ch_lo; + var maj_hi, maj_lo; + var a_hi, a_lo; + var b_hi, b_lo; + var c_hi, c_lo; + var d_hi, d_lo; + var e_hi, e_lo; + var f_hi, f_lo; + var g_hi, g_lo; + var h_hi, h_lo; + var i, hi, lo, w2, w7, w15, w16; + var len = bytes.length(); + while (len >= 128) { + for (i = 0; i < 16; ++i) { + w[i][0] = bytes.getInt32() >>> 0; + w[i][1] = bytes.getInt32() >>> 0; + } + for (; i < 80; ++i) { + w2 = w[i - 2]; + hi = w2[0]; + lo = w2[1]; + t1_hi = ((hi >>> 19 | lo << 13) ^ // ROTR 19 + (lo >>> 29 | hi << 3) ^ // ROTR 61/(swap + ROTR 29) + hi >>> 6) >>> 0; + t1_lo = ((hi << 13 | lo >>> 19) ^ // ROTR 19 + (lo << 3 | hi >>> 29) ^ // ROTR 61/(swap + ROTR 29) + (hi << 26 | lo >>> 6)) >>> 0; + w15 = w[i - 15]; + hi = w15[0]; + lo = w15[1]; + t2_hi = ((hi >>> 1 | lo << 31) ^ // ROTR 1 + (hi >>> 8 | lo << 24) ^ // ROTR 8 + hi >>> 7) >>> 0; + t2_lo = ((hi << 31 | lo >>> 1) ^ // ROTR 1 + (hi << 24 | lo >>> 8) ^ // ROTR 8 + (hi << 25 | lo >>> 7)) >>> 0; + w7 = w[i - 7]; + w16 = w[i - 16]; + lo = t1_lo + w7[1] + t2_lo + w16[1]; + w[i][0] = t1_hi + w7[0] + t2_hi + w16[0] + (lo / 4294967296 >>> 0) >>> 0; + w[i][1] = lo >>> 0; + } + a_hi = s[0][0]; + a_lo = s[0][1]; + b_hi = s[1][0]; + b_lo = s[1][1]; + c_hi = s[2][0]; + c_lo = s[2][1]; + d_hi = s[3][0]; + d_lo = s[3][1]; + e_hi = s[4][0]; + e_lo = s[4][1]; + f_hi = s[5][0]; + f_lo = s[5][1]; + g_hi = s[6][0]; + g_lo = s[6][1]; + h_hi = s[7][0]; + h_lo = s[7][1]; + for (i = 0; i < 80; ++i) { + s1_hi = ((e_hi >>> 14 | e_lo << 18) ^ // ROTR 14 + (e_hi >>> 18 | e_lo << 14) ^ // ROTR 18 + (e_lo >>> 9 | e_hi << 23)) >>> 0; + s1_lo = ((e_hi << 18 | e_lo >>> 14) ^ // ROTR 14 + (e_hi << 14 | e_lo >>> 18) ^ // ROTR 18 + (e_lo << 23 | e_hi >>> 9)) >>> 0; + ch_hi = (g_hi ^ e_hi & (f_hi ^ g_hi)) >>> 0; + ch_lo = (g_lo ^ e_lo & (f_lo ^ g_lo)) >>> 0; + s0_hi = ((a_hi >>> 28 | a_lo << 4) ^ // ROTR 28 + (a_lo >>> 2 | a_hi << 30) ^ // ROTR 34/(swap + ROTR 2) + (a_lo >>> 7 | a_hi << 25)) >>> 0; + s0_lo = ((a_hi << 4 | a_lo >>> 28) ^ // ROTR 28 + (a_lo << 30 | a_hi >>> 2) ^ // ROTR 34/(swap + ROTR 2) + (a_lo << 25 | a_hi >>> 7)) >>> 0; + maj_hi = (a_hi & b_hi | c_hi & (a_hi ^ b_hi)) >>> 0; + maj_lo = (a_lo & b_lo | c_lo & (a_lo ^ b_lo)) >>> 0; + lo = h_lo + s1_lo + ch_lo + _k[i][1] + w[i][1]; + t1_hi = h_hi + s1_hi + ch_hi + _k[i][0] + w[i][0] + (lo / 4294967296 >>> 0) >>> 0; + t1_lo = lo >>> 0; + lo = s0_lo + maj_lo; + t2_hi = s0_hi + maj_hi + (lo / 4294967296 >>> 0) >>> 0; + t2_lo = lo >>> 0; + h_hi = g_hi; + h_lo = g_lo; + g_hi = f_hi; + g_lo = f_lo; + f_hi = e_hi; + f_lo = e_lo; + lo = d_lo + t1_lo; + e_hi = d_hi + t1_hi + (lo / 4294967296 >>> 0) >>> 0; + e_lo = lo >>> 0; + d_hi = c_hi; + d_lo = c_lo; + c_hi = b_hi; + c_lo = b_lo; + b_hi = a_hi; + b_lo = a_lo; + lo = t1_lo + t2_lo; + a_hi = t1_hi + t2_hi + (lo / 4294967296 >>> 0) >>> 0; + a_lo = lo >>> 0; + } + lo = s[0][1] + a_lo; + s[0][0] = s[0][0] + a_hi + (lo / 4294967296 >>> 0) >>> 0; + s[0][1] = lo >>> 0; + lo = s[1][1] + b_lo; + s[1][0] = s[1][0] + b_hi + (lo / 4294967296 >>> 0) >>> 0; + s[1][1] = lo >>> 0; + lo = s[2][1] + c_lo; + s[2][0] = s[2][0] + c_hi + (lo / 4294967296 >>> 0) >>> 0; + s[2][1] = lo >>> 0; + lo = s[3][1] + d_lo; + s[3][0] = s[3][0] + d_hi + (lo / 4294967296 >>> 0) >>> 0; + s[3][1] = lo >>> 0; + lo = s[4][1] + e_lo; + s[4][0] = s[4][0] + e_hi + (lo / 4294967296 >>> 0) >>> 0; + s[4][1] = lo >>> 0; + lo = s[5][1] + f_lo; + s[5][0] = s[5][0] + f_hi + (lo / 4294967296 >>> 0) >>> 0; + s[5][1] = lo >>> 0; + lo = s[6][1] + g_lo; + s[6][0] = s[6][0] + g_hi + (lo / 4294967296 >>> 0) >>> 0; + s[6][1] = lo >>> 0; + lo = s[7][1] + h_lo; + s[7][0] = s[7][0] + h_hi + (lo / 4294967296 >>> 0) >>> 0; + s[7][1] = lo >>> 0; + len -= 128; + } + } + } +}); + +// node_modules/node-forge/lib/asn1-validator.js +var require_asn1_validator = __commonJS({ + "node_modules/node-forge/lib/asn1-validator.js"(exports) { + var forge2 = require_forge(); + require_asn1(); + var asn1 = forge2.asn1; + exports.privateKeyValidator = { + // PrivateKeyInfo + name: "PrivateKeyInfo", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + // Version (INTEGER) + name: "PrivateKeyInfo.version", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.INTEGER, + constructed: false, + capture: "privateKeyVersion" + }, { + // privateKeyAlgorithm + name: "PrivateKeyInfo.privateKeyAlgorithm", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + name: "AlgorithmIdentifier.algorithm", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.OID, + constructed: false, + capture: "privateKeyOid" + }] + }, { + // PrivateKey + name: "PrivateKeyInfo", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.OCTETSTRING, + constructed: false, + capture: "privateKey" + }] + }; + exports.publicKeyValidator = { + name: "SubjectPublicKeyInfo", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + captureAsn1: "subjectPublicKeyInfo", + value: [ + { + name: "SubjectPublicKeyInfo.AlgorithmIdentifier", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + value: [{ + name: "AlgorithmIdentifier.algorithm", + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.OID, + constructed: false, + capture: "publicKeyOid" + }] + }, + // capture group for ed25519PublicKey + { + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.BITSTRING, + constructed: false, + composed: true, + captureBitStringValue: "ed25519PublicKey" + } + // FIXME: this is capture group for rsaPublicKey, use it in this API or + // discard? + /* { + // subjectPublicKey + name: 'SubjectPublicKeyInfo.subjectPublicKey', + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.BITSTRING, + constructed: false, + value: [{ + // RSAPublicKey + name: 'SubjectPublicKeyInfo.subjectPublicKey.RSAPublicKey', + tagClass: asn1.Class.UNIVERSAL, + type: asn1.Type.SEQUENCE, + constructed: true, + optional: true, + captureAsn1: 'rsaPublicKey' + }] + } */ + ] + }; + } +}); + +// node_modules/node-forge/lib/ed25519.js +var require_ed25519 = __commonJS({ + "node_modules/node-forge/lib/ed25519.js"(exports, module) { + var forge2 = require_forge(); + require_jsbn(); + require_random(); + require_sha512(); + require_util(); + var asn1Validator = require_asn1_validator(); + var publicKeyValidator = asn1Validator.publicKeyValidator; + var privateKeyValidator = asn1Validator.privateKeyValidator; + if (typeof BigInteger2 === "undefined") { + BigInteger2 = forge2.jsbn.BigInteger; + } + var BigInteger2; + var ByteBuffer = forge2.util.ByteBuffer; + var NativeBuffer = typeof Buffer === "undefined" ? Uint8Array : Buffer; + forge2.pki = forge2.pki || {}; + module.exports = forge2.pki.ed25519 = forge2.ed25519 = forge2.ed25519 || {}; + var ed25519 = forge2.ed25519; + ed25519.constants = {}; + ed25519.constants.PUBLIC_KEY_BYTE_LENGTH = 32; + ed25519.constants.PRIVATE_KEY_BYTE_LENGTH = 64; + ed25519.constants.SEED_BYTE_LENGTH = 32; + ed25519.constants.SIGN_BYTE_LENGTH = 64; + ed25519.constants.HASH_BYTE_LENGTH = 64; + ed25519.generateKeyPair = function(options) { + options = options || {}; + var seed = options.seed; + if (seed === void 0) { + seed = forge2.random.getBytesSync(ed25519.constants.SEED_BYTE_LENGTH); + } else if (typeof seed === "string") { + if (seed.length !== ed25519.constants.SEED_BYTE_LENGTH) { + throw new TypeError( + '"seed" must be ' + ed25519.constants.SEED_BYTE_LENGTH + " bytes in length." + ); + } + } else if (!(seed instanceof Uint8Array)) { + throw new TypeError( + '"seed" must be a node.js Buffer, Uint8Array, or a binary string.' + ); + } + seed = messageToNativeBuffer({ message: seed, encoding: "binary" }); + var pk = new NativeBuffer(ed25519.constants.PUBLIC_KEY_BYTE_LENGTH); + var sk = new NativeBuffer(ed25519.constants.PRIVATE_KEY_BYTE_LENGTH); + for (var i = 0; i < 32; ++i) { + sk[i] = seed[i]; + } + crypto_sign_keypair(pk, sk); + return { publicKey: pk, privateKey: sk }; + }; + ed25519.privateKeyFromAsn1 = function(obj) { + var capture = {}; + var errors = []; + var valid = forge2.asn1.validate(obj, privateKeyValidator, capture, errors); + if (!valid) { + var error = new Error("Invalid Key."); + error.errors = errors; + throw error; + } + var oid = forge2.asn1.derToOid(capture.privateKeyOid); + var ed25519Oid = forge2.oids.EdDSA25519; + if (oid !== ed25519Oid) { + throw new Error('Invalid OID "' + oid + '"; OID must be "' + ed25519Oid + '".'); + } + var privateKey = capture.privateKey; + var privateKeyBytes = messageToNativeBuffer({ + message: forge2.asn1.fromDer(privateKey).value, + encoding: "binary" + }); + return { privateKeyBytes }; + }; + ed25519.publicKeyFromAsn1 = function(obj) { + var capture = {}; + var errors = []; + var valid = forge2.asn1.validate(obj, publicKeyValidator, capture, errors); + if (!valid) { + var error = new Error("Invalid Key."); + error.errors = errors; + throw error; + } + var oid = forge2.asn1.derToOid(capture.publicKeyOid); + var ed25519Oid = forge2.oids.EdDSA25519; + if (oid !== ed25519Oid) { + throw new Error('Invalid OID "' + oid + '"; OID must be "' + ed25519Oid + '".'); + } + var publicKeyBytes = capture.ed25519PublicKey; + if (publicKeyBytes.length !== ed25519.constants.PUBLIC_KEY_BYTE_LENGTH) { + throw new Error("Key length is invalid."); + } + return messageToNativeBuffer({ + message: publicKeyBytes, + encoding: "binary" + }); + }; + ed25519.publicKeyFromPrivateKey = function(options) { + options = options || {}; + var privateKey = messageToNativeBuffer({ + message: options.privateKey, + encoding: "binary" + }); + if (privateKey.length !== ed25519.constants.PRIVATE_KEY_BYTE_LENGTH) { + throw new TypeError( + '"options.privateKey" must have a byte length of ' + ed25519.constants.PRIVATE_KEY_BYTE_LENGTH + ); + } + var pk = new NativeBuffer(ed25519.constants.PUBLIC_KEY_BYTE_LENGTH); + for (var i = 0; i < pk.length; ++i) { + pk[i] = privateKey[32 + i]; + } + return pk; + }; + ed25519.sign = function(options) { + options = options || {}; + var msg = messageToNativeBuffer(options); + var privateKey = messageToNativeBuffer({ + message: options.privateKey, + encoding: "binary" + }); + if (privateKey.length === ed25519.constants.SEED_BYTE_LENGTH) { + var keyPair = ed25519.generateKeyPair({ seed: privateKey }); + privateKey = keyPair.privateKey; + } else if (privateKey.length !== ed25519.constants.PRIVATE_KEY_BYTE_LENGTH) { + throw new TypeError( + '"options.privateKey" must have a byte length of ' + ed25519.constants.SEED_BYTE_LENGTH + " or " + ed25519.constants.PRIVATE_KEY_BYTE_LENGTH + ); + } + var signedMsg = new NativeBuffer( + ed25519.constants.SIGN_BYTE_LENGTH + msg.length + ); + crypto_sign(signedMsg, msg, msg.length, privateKey); + var sig = new NativeBuffer(ed25519.constants.SIGN_BYTE_LENGTH); + for (var i = 0; i < sig.length; ++i) { + sig[i] = signedMsg[i]; + } + return sig; + }; + ed25519.verify = function(options) { + options = options || {}; + var msg = messageToNativeBuffer(options); + if (options.signature === void 0) { + throw new TypeError( + '"options.signature" must be a node.js Buffer, a Uint8Array, a forge ByteBuffer, or a binary string.' + ); + } + var sig = messageToNativeBuffer({ + message: options.signature, + encoding: "binary" + }); + if (sig.length !== ed25519.constants.SIGN_BYTE_LENGTH) { + throw new TypeError( + '"options.signature" must have a byte length of ' + ed25519.constants.SIGN_BYTE_LENGTH + ); + } + var publicKey = messageToNativeBuffer({ + message: options.publicKey, + encoding: "binary" + }); + if (publicKey.length !== ed25519.constants.PUBLIC_KEY_BYTE_LENGTH) { + throw new TypeError( + '"options.publicKey" must have a byte length of ' + ed25519.constants.PUBLIC_KEY_BYTE_LENGTH + ); + } + var sm = new NativeBuffer(ed25519.constants.SIGN_BYTE_LENGTH + msg.length); + var m = new NativeBuffer(ed25519.constants.SIGN_BYTE_LENGTH + msg.length); + var i; + for (i = 0; i < ed25519.constants.SIGN_BYTE_LENGTH; ++i) { + sm[i] = sig[i]; + } + for (i = 0; i < msg.length; ++i) { + sm[i + ed25519.constants.SIGN_BYTE_LENGTH] = msg[i]; + } + return crypto_sign_open(m, sm, sm.length, publicKey) >= 0; + }; + function messageToNativeBuffer(options) { + var message = options.message; + if (message instanceof Uint8Array || message instanceof NativeBuffer) { + return message; + } + var encoding = options.encoding; + if (message === void 0) { + if (options.md) { + message = options.md.digest().getBytes(); + encoding = "binary"; + } else { + throw new TypeError('"options.message" or "options.md" not specified.'); + } + } + if (typeof message === "string" && !encoding) { + throw new TypeError('"options.encoding" must be "binary" or "utf8".'); + } + if (typeof message === "string") { + if (typeof Buffer !== "undefined") { + return Buffer.from(message, encoding); + } + message = new ByteBuffer(message, encoding); + } else if (!(message instanceof ByteBuffer)) { + throw new TypeError( + '"options.message" must be a node.js Buffer, a Uint8Array, a forge ByteBuffer, or a string with "options.encoding" specifying its encoding.' + ); + } + var buffer = new NativeBuffer(message.length()); + for (var i = 0; i < buffer.length; ++i) { + buffer[i] = message.at(i); + } + return buffer; + } + var gf0 = gf(); + var gf1 = gf([1]); + var D = gf([ + 30883, + 4953, + 19914, + 30187, + 55467, + 16705, + 2637, + 112, + 59544, + 30585, + 16505, + 36039, + 65139, + 11119, + 27886, + 20995 + ]); + var D2 = gf([ + 61785, + 9906, + 39828, + 60374, + 45398, + 33411, + 5274, + 224, + 53552, + 61171, + 33010, + 6542, + 64743, + 22239, + 55772, + 9222 + ]); + var X = gf([ + 54554, + 36645, + 11616, + 51542, + 42930, + 38181, + 51040, + 26924, + 56412, + 64982, + 57905, + 49316, + 21502, + 52590, + 14035, + 8553 + ]); + var Y = gf([ + 26200, + 26214, + 26214, + 26214, + 26214, + 26214, + 26214, + 26214, + 26214, + 26214, + 26214, + 26214, + 26214, + 26214, + 26214, + 26214 + ]); + var L = new Float64Array([ + 237, + 211, + 245, + 92, + 26, + 99, + 18, + 88, + 214, + 156, + 247, + 162, + 222, + 249, + 222, + 20, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 16 + ]); + var I = gf([ + 41136, + 18958, + 6951, + 50414, + 58488, + 44335, + 6150, + 12099, + 55207, + 15867, + 153, + 11085, + 57099, + 20417, + 9344, + 11139 + ]); + function sha512(msg, msgLen) { + var md = forge2.md.sha512.create(); + var buffer = new ByteBuffer(msg); + md.update(buffer.getBytes(msgLen), "binary"); + var hash = md.digest().getBytes(); + if (typeof Buffer !== "undefined") { + return Buffer.from(hash, "binary"); + } + var out = new NativeBuffer(ed25519.constants.HASH_BYTE_LENGTH); + for (var i = 0; i < 64; ++i) { + out[i] = hash.charCodeAt(i); + } + return out; + } + function crypto_sign_keypair(pk, sk) { + var p = [gf(), gf(), gf(), gf()]; + var i; + var d = sha512(sk, 32); + d[0] &= 248; + d[31] &= 127; + d[31] |= 64; + scalarbase(p, d); + pack(pk, p); + for (i = 0; i < 32; ++i) { + sk[i + 32] = pk[i]; + } + return 0; + } + function crypto_sign(sm, m, n, sk) { + var i, j, x = new Float64Array(64); + var p = [gf(), gf(), gf(), gf()]; + var d = sha512(sk, 32); + d[0] &= 248; + d[31] &= 127; + d[31] |= 64; + var smlen = n + 64; + for (i = 0; i < n; ++i) { + sm[64 + i] = m[i]; + } + for (i = 0; i < 32; ++i) { + sm[32 + i] = d[32 + i]; + } + var r = sha512(sm.subarray(32), n + 32); + reduce(r); + scalarbase(p, r); + pack(sm, p); + for (i = 32; i < 64; ++i) { + sm[i] = sk[i]; + } + var h = sha512(sm, n + 64); + reduce(h); + for (i = 32; i < 64; ++i) { + x[i] = 0; + } + for (i = 0; i < 32; ++i) { + x[i] = r[i]; + } + for (i = 0; i < 32; ++i) { + for (j = 0; j < 32; j++) { + x[i + j] += h[i] * d[j]; + } + } + modL(sm.subarray(32), x); + return smlen; + } + function crypto_sign_open(m, sm, n, pk) { + var i, mlen; + var t = new NativeBuffer(32); + var p = [gf(), gf(), gf(), gf()], q = [gf(), gf(), gf(), gf()]; + mlen = -1; + if (n < 64) { + return -1; + } + if (unpackneg(q, pk)) { + return -1; + } + for (i = 0; i < n; ++i) { + m[i] = sm[i]; + } + for (i = 0; i < 32; ++i) { + m[i + 32] = pk[i]; + } + var h = sha512(m, n); + reduce(h); + scalarmult(p, q, h); + scalarbase(q, sm.subarray(32)); + add(p, q); + pack(t, p); + n -= 64; + if (crypto_verify_32(sm, 0, t, 0)) { + for (i = 0; i < n; ++i) { + m[i] = 0; + } + return -1; + } + for (i = 0; i < n; ++i) { + m[i] = sm[i + 64]; + } + mlen = n; + return mlen; + } + function modL(r, x) { + var carry, i, j, k; + for (i = 63; i >= 32; --i) { + carry = 0; + for (j = i - 32, k = i - 12; j < k; ++j) { + x[j] += carry - 16 * x[i] * L[j - (i - 32)]; + carry = x[j] + 128 >> 8; + x[j] -= carry * 256; + } + x[j] += carry; + x[i] = 0; + } + carry = 0; + for (j = 0; j < 32; ++j) { + x[j] += carry - (x[31] >> 4) * L[j]; + carry = x[j] >> 8; + x[j] &= 255; + } + for (j = 0; j < 32; ++j) { + x[j] -= carry * L[j]; + } + for (i = 0; i < 32; ++i) { + x[i + 1] += x[i] >> 8; + r[i] = x[i] & 255; + } + } + function reduce(r) { + var x = new Float64Array(64); + for (var i = 0; i < 64; ++i) { + x[i] = r[i]; + r[i] = 0; + } + modL(r, x); + } + function add(p, q) { + var a = gf(), b = gf(), c = gf(), d = gf(), e = gf(), f = gf(), g = gf(), h = gf(), t = gf(); + Z(a, p[1], p[0]); + Z(t, q[1], q[0]); + M(a, a, t); + A(b, p[0], p[1]); + A(t, q[0], q[1]); + M(b, b, t); + M(c, p[3], q[3]); + M(c, c, D2); + M(d, p[2], q[2]); + A(d, d, d); + Z(e, b, a); + Z(f, d, c); + A(g, d, c); + A(h, b, a); + M(p[0], e, f); + M(p[1], h, g); + M(p[2], g, f); + M(p[3], e, h); + } + function cswap(p, q, b) { + for (var i = 0; i < 4; ++i) { + sel25519(p[i], q[i], b); + } + } + function pack(r, p) { + var tx = gf(), ty = gf(), zi = gf(); + inv25519(zi, p[2]); + M(tx, p[0], zi); + M(ty, p[1], zi); + pack25519(r, ty); + r[31] ^= par25519(tx) << 7; + } + function pack25519(o, n) { + var i, j, b; + var m = gf(), t = gf(); + for (i = 0; i < 16; ++i) { + t[i] = n[i]; + } + car25519(t); + car25519(t); + car25519(t); + for (j = 0; j < 2; ++j) { + m[0] = t[0] - 65517; + for (i = 1; i < 15; ++i) { + m[i] = t[i] - 65535 - (m[i - 1] >> 16 & 1); + m[i - 1] &= 65535; + } + m[15] = t[15] - 32767 - (m[14] >> 16 & 1); + b = m[15] >> 16 & 1; + m[14] &= 65535; + sel25519(t, m, 1 - b); + } + for (i = 0; i < 16; i++) { + o[2 * i] = t[i] & 255; + o[2 * i + 1] = t[i] >> 8; + } + } + function unpackneg(r, p) { + var t = gf(), chk = gf(), num = gf(), den = gf(), den2 = gf(), den4 = gf(), den6 = gf(); + set25519(r[2], gf1); + unpack25519(r[1], p); + S(num, r[1]); + M(den, num, D); + Z(num, num, r[2]); + A(den, r[2], den); + S(den2, den); + S(den4, den2); + M(den6, den4, den2); + M(t, den6, num); + M(t, t, den); + pow2523(t, t); + M(t, t, num); + M(t, t, den); + M(t, t, den); + M(r[0], t, den); + S(chk, r[0]); + M(chk, chk, den); + if (neq25519(chk, num)) { + M(r[0], r[0], I); + } + S(chk, r[0]); + M(chk, chk, den); + if (neq25519(chk, num)) { + return -1; + } + if (par25519(r[0]) === p[31] >> 7) { + Z(r[0], gf0, r[0]); + } + M(r[3], r[0], r[1]); + return 0; + } + function unpack25519(o, n) { + var i; + for (i = 0; i < 16; ++i) { + o[i] = n[2 * i] + (n[2 * i + 1] << 8); + } + o[15] &= 32767; + } + function pow2523(o, i) { + var c = gf(); + var a; + for (a = 0; a < 16; ++a) { + c[a] = i[a]; + } + for (a = 250; a >= 0; --a) { + S(c, c); + if (a !== 1) { + M(c, c, i); + } + } + for (a = 0; a < 16; ++a) { + o[a] = c[a]; + } + } + function neq25519(a, b) { + var c = new NativeBuffer(32); + var d = new NativeBuffer(32); + pack25519(c, a); + pack25519(d, b); + return crypto_verify_32(c, 0, d, 0); + } + function crypto_verify_32(x, xi, y, yi) { + return vn(x, xi, y, yi, 32); + } + function vn(x, xi, y, yi, n) { + var i, d = 0; + for (i = 0; i < n; ++i) { + d |= x[xi + i] ^ y[yi + i]; + } + return (1 & d - 1 >>> 8) - 1; + } + function par25519(a) { + var d = new NativeBuffer(32); + pack25519(d, a); + return d[0] & 1; + } + function scalarmult(p, q, s) { + var b, i; + set25519(p[0], gf0); + set25519(p[1], gf1); + set25519(p[2], gf1); + set25519(p[3], gf0); + for (i = 255; i >= 0; --i) { + b = s[i / 8 | 0] >> (i & 7) & 1; + cswap(p, q, b); + add(q, p); + add(p, p); + cswap(p, q, b); + } + } + function scalarbase(p, s) { + var q = [gf(), gf(), gf(), gf()]; + set25519(q[0], X); + set25519(q[1], Y); + set25519(q[2], gf1); + M(q[3], X, Y); + scalarmult(p, q, s); + } + function set25519(r, a) { + var i; + for (i = 0; i < 16; i++) { + r[i] = a[i] | 0; + } + } + function inv25519(o, i) { + var c = gf(); + var a; + for (a = 0; a < 16; ++a) { + c[a] = i[a]; + } + for (a = 253; a >= 0; --a) { + S(c, c); + if (a !== 2 && a !== 4) { + M(c, c, i); + } + } + for (a = 0; a < 16; ++a) { + o[a] = c[a]; + } + } + function car25519(o) { + var i, v, c = 1; + for (i = 0; i < 16; ++i) { + v = o[i] + c + 65535; + c = Math.floor(v / 65536); + o[i] = v - c * 65536; + } + o[0] += c - 1 + 37 * (c - 1); + } + function sel25519(p, q, b) { + var t, c = ~(b - 1); + for (var i = 0; i < 16; ++i) { + t = c & (p[i] ^ q[i]); + p[i] ^= t; + q[i] ^= t; + } + } + function gf(init) { + var i, r = new Float64Array(16); + if (init) { + for (i = 0; i < init.length; ++i) { + r[i] = init[i]; + } + } + return r; + } + function A(o, a, b) { + for (var i = 0; i < 16; ++i) { + o[i] = a[i] + b[i]; + } + } + function Z(o, a, b) { + for (var i = 0; i < 16; ++i) { + o[i] = a[i] - b[i]; + } + } + function S(o, a) { + M(o, a, a); + } + function M(o, a, b) { + var v, c, t0 = 0, t1 = 0, t2 = 0, t3 = 0, t4 = 0, t5 = 0, t6 = 0, t7 = 0, t8 = 0, t9 = 0, t10 = 0, t11 = 0, t12 = 0, t13 = 0, t14 = 0, t15 = 0, t16 = 0, t17 = 0, t18 = 0, t19 = 0, t20 = 0, t21 = 0, t22 = 0, t23 = 0, t24 = 0, t25 = 0, t26 = 0, t27 = 0, t28 = 0, t29 = 0, t30 = 0, b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3], b4 = b[4], b5 = b[5], b6 = b[6], b7 = b[7], b8 = b[8], b9 = b[9], b10 = b[10], b11 = b[11], b12 = b[12], b13 = b[13], b14 = b[14], b15 = b[15]; + v = a[0]; + t0 += v * b0; + t1 += v * b1; + t2 += v * b2; + t3 += v * b3; + t4 += v * b4; + t5 += v * b5; + t6 += v * b6; + t7 += v * b7; + t8 += v * b8; + t9 += v * b9; + t10 += v * b10; + t11 += v * b11; + t12 += v * b12; + t13 += v * b13; + t14 += v * b14; + t15 += v * b15; + v = a[1]; + t1 += v * b0; + t2 += v * b1; + t3 += v * b2; + t4 += v * b3; + t5 += v * b4; + t6 += v * b5; + t7 += v * b6; + t8 += v * b7; + t9 += v * b8; + t10 += v * b9; + t11 += v * b10; + t12 += v * b11; + t13 += v * b12; + t14 += v * b13; + t15 += v * b14; + t16 += v * b15; + v = a[2]; + t2 += v * b0; + t3 += v * b1; + t4 += v * b2; + t5 += v * b3; + t6 += v * b4; + t7 += v * b5; + t8 += v * b6; + t9 += v * b7; + t10 += v * b8; + t11 += v * b9; + t12 += v * b10; + t13 += v * b11; + t14 += v * b12; + t15 += v * b13; + t16 += v * b14; + t17 += v * b15; + v = a[3]; + t3 += v * b0; + t4 += v * b1; + t5 += v * b2; + t6 += v * b3; + t7 += v * b4; + t8 += v * b5; + t9 += v * b6; + t10 += v * b7; + t11 += v * b8; + t12 += v * b9; + t13 += v * b10; + t14 += v * b11; + t15 += v * b12; + t16 += v * b13; + t17 += v * b14; + t18 += v * b15; + v = a[4]; + t4 += v * b0; + t5 += v * b1; + t6 += v * b2; + t7 += v * b3; + t8 += v * b4; + t9 += v * b5; + t10 += v * b6; + t11 += v * b7; + t12 += v * b8; + t13 += v * b9; + t14 += v * b10; + t15 += v * b11; + t16 += v * b12; + t17 += v * b13; + t18 += v * b14; + t19 += v * b15; + v = a[5]; + t5 += v * b0; + t6 += v * b1; + t7 += v * b2; + t8 += v * b3; + t9 += v * b4; + t10 += v * b5; + t11 += v * b6; + t12 += v * b7; + t13 += v * b8; + t14 += v * b9; + t15 += v * b10; + t16 += v * b11; + t17 += v * b12; + t18 += v * b13; + t19 += v * b14; + t20 += v * b15; + v = a[6]; + t6 += v * b0; + t7 += v * b1; + t8 += v * b2; + t9 += v * b3; + t10 += v * b4; + t11 += v * b5; + t12 += v * b6; + t13 += v * b7; + t14 += v * b8; + t15 += v * b9; + t16 += v * b10; + t17 += v * b11; + t18 += v * b12; + t19 += v * b13; + t20 += v * b14; + t21 += v * b15; + v = a[7]; + t7 += v * b0; + t8 += v * b1; + t9 += v * b2; + t10 += v * b3; + t11 += v * b4; + t12 += v * b5; + t13 += v * b6; + t14 += v * b7; + t15 += v * b8; + t16 += v * b9; + t17 += v * b10; + t18 += v * b11; + t19 += v * b12; + t20 += v * b13; + t21 += v * b14; + t22 += v * b15; + v = a[8]; + t8 += v * b0; + t9 += v * b1; + t10 += v * b2; + t11 += v * b3; + t12 += v * b4; + t13 += v * b5; + t14 += v * b6; + t15 += v * b7; + t16 += v * b8; + t17 += v * b9; + t18 += v * b10; + t19 += v * b11; + t20 += v * b12; + t21 += v * b13; + t22 += v * b14; + t23 += v * b15; + v = a[9]; + t9 += v * b0; + t10 += v * b1; + t11 += v * b2; + t12 += v * b3; + t13 += v * b4; + t14 += v * b5; + t15 += v * b6; + t16 += v * b7; + t17 += v * b8; + t18 += v * b9; + t19 += v * b10; + t20 += v * b11; + t21 += v * b12; + t22 += v * b13; + t23 += v * b14; + t24 += v * b15; + v = a[10]; + t10 += v * b0; + t11 += v * b1; + t12 += v * b2; + t13 += v * b3; + t14 += v * b4; + t15 += v * b5; + t16 += v * b6; + t17 += v * b7; + t18 += v * b8; + t19 += v * b9; + t20 += v * b10; + t21 += v * b11; + t22 += v * b12; + t23 += v * b13; + t24 += v * b14; + t25 += v * b15; + v = a[11]; + t11 += v * b0; + t12 += v * b1; + t13 += v * b2; + t14 += v * b3; + t15 += v * b4; + t16 += v * b5; + t17 += v * b6; + t18 += v * b7; + t19 += v * b8; + t20 += v * b9; + t21 += v * b10; + t22 += v * b11; + t23 += v * b12; + t24 += v * b13; + t25 += v * b14; + t26 += v * b15; + v = a[12]; + t12 += v * b0; + t13 += v * b1; + t14 += v * b2; + t15 += v * b3; + t16 += v * b4; + t17 += v * b5; + t18 += v * b6; + t19 += v * b7; + t20 += v * b8; + t21 += v * b9; + t22 += v * b10; + t23 += v * b11; + t24 += v * b12; + t25 += v * b13; + t26 += v * b14; + t27 += v * b15; + v = a[13]; + t13 += v * b0; + t14 += v * b1; + t15 += v * b2; + t16 += v * b3; + t17 += v * b4; + t18 += v * b5; + t19 += v * b6; + t20 += v * b7; + t21 += v * b8; + t22 += v * b9; + t23 += v * b10; + t24 += v * b11; + t25 += v * b12; + t26 += v * b13; + t27 += v * b14; + t28 += v * b15; + v = a[14]; + t14 += v * b0; + t15 += v * b1; + t16 += v * b2; + t17 += v * b3; + t18 += v * b4; + t19 += v * b5; + t20 += v * b6; + t21 += v * b7; + t22 += v * b8; + t23 += v * b9; + t24 += v * b10; + t25 += v * b11; + t26 += v * b12; + t27 += v * b13; + t28 += v * b14; + t29 += v * b15; + v = a[15]; + t15 += v * b0; + t16 += v * b1; + t17 += v * b2; + t18 += v * b3; + t19 += v * b4; + t20 += v * b5; + t21 += v * b6; + t22 += v * b7; + t23 += v * b8; + t24 += v * b9; + t25 += v * b10; + t26 += v * b11; + t27 += v * b12; + t28 += v * b13; + t29 += v * b14; + t30 += v * b15; + t0 += 38 * t16; + t1 += 38 * t17; + t2 += 38 * t18; + t3 += 38 * t19; + t4 += 38 * t20; + t5 += 38 * t21; + t6 += 38 * t22; + t7 += 38 * t23; + t8 += 38 * t24; + t9 += 38 * t25; + t10 += 38 * t26; + t11 += 38 * t27; + t12 += 38 * t28; + t13 += 38 * t29; + t14 += 38 * t30; + c = 1; + v = t0 + c + 65535; + c = Math.floor(v / 65536); + t0 = v - c * 65536; + v = t1 + c + 65535; + c = Math.floor(v / 65536); + t1 = v - c * 65536; + v = t2 + c + 65535; + c = Math.floor(v / 65536); + t2 = v - c * 65536; + v = t3 + c + 65535; + c = Math.floor(v / 65536); + t3 = v - c * 65536; + v = t4 + c + 65535; + c = Math.floor(v / 65536); + t4 = v - c * 65536; + v = t5 + c + 65535; + c = Math.floor(v / 65536); + t5 = v - c * 65536; + v = t6 + c + 65535; + c = Math.floor(v / 65536); + t6 = v - c * 65536; + v = t7 + c + 65535; + c = Math.floor(v / 65536); + t7 = v - c * 65536; + v = t8 + c + 65535; + c = Math.floor(v / 65536); + t8 = v - c * 65536; + v = t9 + c + 65535; + c = Math.floor(v / 65536); + t9 = v - c * 65536; + v = t10 + c + 65535; + c = Math.floor(v / 65536); + t10 = v - c * 65536; + v = t11 + c + 65535; + c = Math.floor(v / 65536); + t11 = v - c * 65536; + v = t12 + c + 65535; + c = Math.floor(v / 65536); + t12 = v - c * 65536; + v = t13 + c + 65535; + c = Math.floor(v / 65536); + t13 = v - c * 65536; + v = t14 + c + 65535; + c = Math.floor(v / 65536); + t14 = v - c * 65536; + v = t15 + c + 65535; + c = Math.floor(v / 65536); + t15 = v - c * 65536; + t0 += c - 1 + 37 * (c - 1); + c = 1; + v = t0 + c + 65535; + c = Math.floor(v / 65536); + t0 = v - c * 65536; + v = t1 + c + 65535; + c = Math.floor(v / 65536); + t1 = v - c * 65536; + v = t2 + c + 65535; + c = Math.floor(v / 65536); + t2 = v - c * 65536; + v = t3 + c + 65535; + c = Math.floor(v / 65536); + t3 = v - c * 65536; + v = t4 + c + 65535; + c = Math.floor(v / 65536); + t4 = v - c * 65536; + v = t5 + c + 65535; + c = Math.floor(v / 65536); + t5 = v - c * 65536; + v = t6 + c + 65535; + c = Math.floor(v / 65536); + t6 = v - c * 65536; + v = t7 + c + 65535; + c = Math.floor(v / 65536); + t7 = v - c * 65536; + v = t8 + c + 65535; + c = Math.floor(v / 65536); + t8 = v - c * 65536; + v = t9 + c + 65535; + c = Math.floor(v / 65536); + t9 = v - c * 65536; + v = t10 + c + 65535; + c = Math.floor(v / 65536); + t10 = v - c * 65536; + v = t11 + c + 65535; + c = Math.floor(v / 65536); + t11 = v - c * 65536; + v = t12 + c + 65535; + c = Math.floor(v / 65536); + t12 = v - c * 65536; + v = t13 + c + 65535; + c = Math.floor(v / 65536); + t13 = v - c * 65536; + v = t14 + c + 65535; + c = Math.floor(v / 65536); + t14 = v - c * 65536; + v = t15 + c + 65535; + c = Math.floor(v / 65536); + t15 = v - c * 65536; + t0 += c - 1 + 37 * (c - 1); + o[0] = t0; + o[1] = t1; + o[2] = t2; + o[3] = t3; + o[4] = t4; + o[5] = t5; + o[6] = t6; + o[7] = t7; + o[8] = t8; + o[9] = t9; + o[10] = t10; + o[11] = t11; + o[12] = t12; + o[13] = t13; + o[14] = t14; + o[15] = t15; + } + } +}); + +// node_modules/node-forge/lib/kem.js +var require_kem = __commonJS({ + "node_modules/node-forge/lib/kem.js"(exports, module) { + var forge2 = require_forge(); + require_util(); + require_random(); + require_jsbn(); + module.exports = forge2.kem = forge2.kem || {}; + var BigInteger2 = forge2.jsbn.BigInteger; + forge2.kem.rsa = {}; + forge2.kem.rsa.create = function(kdf, options) { + options = options || {}; + var prng = options.prng || forge2.random; + var kem = {}; + kem.encrypt = function(publicKey, keyLength) { + var byteLength = Math.ceil(publicKey.n.bitLength() / 8); + var r; + do { + r = new BigInteger2( + forge2.util.bytesToHex(prng.getBytesSync(byteLength)), + 16 + ).mod(publicKey.n); + } while (r.compareTo(BigInteger2.ONE) <= 0); + r = forge2.util.hexToBytes(r.toString(16)); + var zeros = byteLength - r.length; + if (zeros > 0) { + r = forge2.util.fillString(String.fromCharCode(0), zeros) + r; + } + var encapsulation = publicKey.encrypt(r, "NONE"); + var key = kdf.generate(r, keyLength); + return { encapsulation, key }; + }; + kem.decrypt = function(privateKey, encapsulation, keyLength) { + var r = privateKey.decrypt(encapsulation, "NONE"); + return kdf.generate(r, keyLength); + }; + return kem; + }; + forge2.kem.kdf1 = function(md, digestLength) { + _createKDF(this, md, 0, digestLength || md.digestLength); + }; + forge2.kem.kdf2 = function(md, digestLength) { + _createKDF(this, md, 1, digestLength || md.digestLength); + }; + function _createKDF(kdf, md, counterStart, digestLength) { + kdf.generate = function(x, length) { + var key = new forge2.util.ByteBuffer(); + var k = Math.ceil(length / digestLength) + counterStart; + var c = new forge2.util.ByteBuffer(); + for (var i = counterStart; i < k; ++i) { + c.putInt32(i); + md.start(); + md.update(x + c.getBytes()); + var hash = md.digest(); + key.putBytes(hash.getBytes(digestLength)); + } + key.truncate(key.length() - length); + return key.getBytes(); + }; + } + } +}); + +// node_modules/node-forge/lib/log.js +var require_log = __commonJS({ + "node_modules/node-forge/lib/log.js"(exports, module) { + var forge2 = require_forge(); + require_util(); + module.exports = forge2.log = forge2.log || {}; + forge2.log.levels = [ + "none", + "error", + "warning", + "info", + "debug", + "verbose", + "max" + ]; + var sLevelInfo = {}; + var sLoggers = []; + var sConsoleLogger = null; + forge2.log.LEVEL_LOCKED = 1 << 1; + forge2.log.NO_LEVEL_CHECK = 1 << 2; + forge2.log.INTERPOLATE = 1 << 3; + for (i = 0; i < forge2.log.levels.length; ++i) { + level = forge2.log.levels[i]; + sLevelInfo[level] = { + index: i, + name: level.toUpperCase() + }; + } + var level; + var i; + forge2.log.logMessage = function(message) { + var messageLevelIndex = sLevelInfo[message.level].index; + for (var i2 = 0; i2 < sLoggers.length; ++i2) { + var logger2 = sLoggers[i2]; + if (logger2.flags & forge2.log.NO_LEVEL_CHECK) { + logger2.f(message); + } else { + var loggerLevelIndex = sLevelInfo[logger2.level].index; + if (messageLevelIndex <= loggerLevelIndex) { + logger2.f(logger2, message); + } + } + } + }; + forge2.log.prepareStandard = function(message) { + if (!("standard" in message)) { + message.standard = sLevelInfo[message.level].name + //' ' + +message.timestamp + + " [" + message.category + "] " + message.message; + } + }; + forge2.log.prepareFull = function(message) { + if (!("full" in message)) { + var args = [message.message]; + args = args.concat([]); + message.full = forge2.util.format.apply(this, args); + } + }; + forge2.log.prepareStandardFull = function(message) { + if (!("standardFull" in message)) { + forge2.log.prepareStandard(message); + message.standardFull = message.standard; + } + }; + if (true) { + levels = ["error", "warning", "info", "debug", "verbose"]; + for (i = 0; i < levels.length; ++i) { + (function(level2) { + forge2.log[level2] = function(category, message) { + var args = Array.prototype.slice.call(arguments).slice(2); + var msg = { + timestamp: /* @__PURE__ */ new Date(), + level: level2, + category, + message, + "arguments": args + /*standard*/ + /*full*/ + /*fullMessage*/ + }; + forge2.log.logMessage(msg); + }; + })(levels[i]); + } + } + var levels; + var i; + forge2.log.makeLogger = function(logFunction) { + var logger2 = { + flags: 0, + f: logFunction + }; + forge2.log.setLevel(logger2, "none"); + return logger2; + }; + forge2.log.setLevel = function(logger2, level2) { + var rval = false; + if (logger2 && !(logger2.flags & forge2.log.LEVEL_LOCKED)) { + for (var i2 = 0; i2 < forge2.log.levels.length; ++i2) { + var aValidLevel = forge2.log.levels[i2]; + if (level2 == aValidLevel) { + logger2.level = level2; + rval = true; + break; + } + } + } + return rval; + }; + forge2.log.lock = function(logger2, lock2) { + if (typeof lock2 === "undefined" || lock2) { + logger2.flags |= forge2.log.LEVEL_LOCKED; + } else { + logger2.flags &= ~forge2.log.LEVEL_LOCKED; + } + }; + forge2.log.addLogger = function(logger2) { + sLoggers.push(logger2); + }; + if (typeof console !== "undefined" && "log" in console) { + if (console.error && console.warn && console.info && console.debug) { + levelHandlers = { + error: console.error, + warning: console.warn, + info: console.info, + debug: console.debug, + verbose: console.debug + }; + f = function(logger2, message) { + forge2.log.prepareStandard(message); + var handler = levelHandlers[message.level]; + var args = [message.standard]; + args = args.concat(message["arguments"].slice()); + handler.apply(console, args); + }; + logger = forge2.log.makeLogger(f); + } else { + f = function(logger2, message) { + forge2.log.prepareStandardFull(message); + console.log(message.standardFull); + }; + logger = forge2.log.makeLogger(f); + } + forge2.log.setLevel(logger, "debug"); + forge2.log.addLogger(logger); + sConsoleLogger = logger; + } else { + console = { + log: function() { + } + }; + } + var logger; + var levelHandlers; + var f; + if (sConsoleLogger !== null && typeof window !== "undefined" && window.location) { + query = new URL(window.location.href).searchParams; + if (query.has("console.level")) { + forge2.log.setLevel( + sConsoleLogger, + query.get("console.level").slice(-1)[0] + ); + } + if (query.has("console.lock")) { + lock = query.get("console.lock").slice(-1)[0]; + if (lock == "true") { + forge2.log.lock(sConsoleLogger); + } + } + } + var query; + var lock; + forge2.log.consoleLogger = sConsoleLogger; + } +}); + +// node_modules/node-forge/lib/md.all.js +var require_md_all = __commonJS({ + "node_modules/node-forge/lib/md.all.js"(exports, module) { + module.exports = require_md(); + require_md5(); + require_sha1(); + require_sha256(); + require_sha512(); + } +}); + +// node_modules/node-forge/lib/pkcs7.js +var require_pkcs7 = __commonJS({ + "node_modules/node-forge/lib/pkcs7.js"(exports, module) { + var forge2 = require_forge(); + require_aes(); + require_asn1(); + require_des(); + require_oids(); + require_pem(); + require_pkcs7asn1(); + require_random(); + require_util(); + require_x509(); + var asn1 = forge2.asn1; + var p7 = module.exports = forge2.pkcs7 = forge2.pkcs7 || {}; + p7.messageFromPem = function(pem) { + var msg = forge2.pem.decode(pem)[0]; + if (msg.type !== "PKCS7") { + var error = new Error('Could not convert PKCS#7 message from PEM; PEM header type is not "PKCS#7".'); + error.headerType = msg.type; + throw error; + } + if (msg.procType && msg.procType.type === "ENCRYPTED") { + throw new Error("Could not convert PKCS#7 message from PEM; PEM is encrypted."); + } + var obj = asn1.fromDer(msg.body); + return p7.messageFromAsn1(obj); + }; + p7.messageToPem = function(msg, maxline) { + var pemObj = { + type: "PKCS7", + body: asn1.toDer(msg.toAsn1()).getBytes() + }; + return forge2.pem.encode(pemObj, { maxline }); + }; + p7.messageFromAsn1 = function(obj) { + var capture = {}; + var errors = []; + if (!asn1.validate(obj, p7.asn1.contentInfoValidator, capture, errors)) { + var error = new Error("Cannot read PKCS#7 message. ASN.1 object is not an PKCS#7 ContentInfo."); + error.errors = errors; + throw error; + } + var contentType = asn1.derToOid(capture.contentType); + var msg; + switch (contentType) { + case forge2.pki.oids.envelopedData: + msg = p7.createEnvelopedData(); + break; + case forge2.pki.oids.encryptedData: + msg = p7.createEncryptedData(); + break; + case forge2.pki.oids.signedData: + msg = p7.createSignedData(); + break; + default: + throw new Error("Cannot read PKCS#7 message. ContentType with OID " + contentType + " is not (yet) supported."); + } + msg.fromAsn1(capture.content.value[0]); + return msg; + }; + p7.createSignedData = function() { + var msg = null; + msg = { + type: forge2.pki.oids.signedData, + version: 1, + certificates: [], + crls: [], + // TODO: add json-formatted signer stuff here? + signers: [], + // populated during sign() + digestAlgorithmIdentifiers: [], + contentInfo: null, + signerInfos: [], + fromAsn1: function(obj) { + _fromAsn1(msg, obj, p7.asn1.signedDataValidator); + msg.certificates = []; + msg.crls = []; + msg.digestAlgorithmIdentifiers = []; + msg.contentInfo = null; + msg.signerInfos = []; + if (msg.rawCapture.certificates) { + var certs = msg.rawCapture.certificates.value; + for (var i = 0; i < certs.length; ++i) { + msg.certificates.push(forge2.pki.certificateFromAsn1(certs[i])); + } + } + }, + toAsn1: function() { + if (!msg.contentInfo) { + msg.sign(); + } + var certs = []; + for (var i = 0; i < msg.certificates.length; ++i) { + certs.push(forge2.pki.certificateToAsn1(msg.certificates[i])); + } + var crls = []; + var signedData = asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, [ + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // Version + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.INTEGER, + false, + asn1.integerToDer(msg.version).getBytes() + ), + // DigestAlgorithmIdentifiers + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.SET, + true, + msg.digestAlgorithmIdentifiers + ), + // ContentInfo + msg.contentInfo + ]) + ]); + if (certs.length > 0) { + signedData.value[0].value.push( + asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, certs) + ); + } + if (crls.length > 0) { + signedData.value[0].value.push( + asn1.create(asn1.Class.CONTEXT_SPECIFIC, 1, true, crls) + ); + } + signedData.value[0].value.push( + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.SET, + true, + msg.signerInfos + ) + ); + return asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.SEQUENCE, + true, + [ + // ContentType + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + asn1.oidToDer(msg.type).getBytes() + ), + // [0] SignedData + signedData + ] + ); + }, + /** + * Add (another) entity to list of signers. + * + * Note: If authenticatedAttributes are provided, then, per RFC 2315, + * they must include at least two attributes: content type and + * message digest. The message digest attribute value will be + * auto-calculated during signing and will be ignored if provided. + * + * Here's an example of providing these two attributes: + * + * forge.pkcs7.createSignedData(); + * p7.addSigner({ + * issuer: cert.issuer.attributes, + * serialNumber: cert.serialNumber, + * key: privateKey, + * digestAlgorithm: forge.pki.oids.sha1, + * authenticatedAttributes: [{ + * type: forge.pki.oids.contentType, + * value: forge.pki.oids.data + * }, { + * type: forge.pki.oids.messageDigest + * }] + * }); + * + * TODO: Support [subjectKeyIdentifier] as signer's ID. + * + * @param signer the signer information: + * key the signer's private key. + * [certificate] a certificate containing the public key + * associated with the signer's private key; use this option as + * an alternative to specifying signer.issuer and + * signer.serialNumber. + * [issuer] the issuer attributes (eg: cert.issuer.attributes). + * [serialNumber] the signer's certificate's serial number in + * hexadecimal (eg: cert.serialNumber). + * [digestAlgorithm] the message digest OID, as a string, to use + * (eg: forge.pki.oids.sha1). + * [authenticatedAttributes] an optional array of attributes + * to also sign along with the content. + */ + addSigner: function(signer) { + var issuer = signer.issuer; + var serialNumber = signer.serialNumber; + if (signer.certificate) { + var cert = signer.certificate; + if (typeof cert === "string") { + cert = forge2.pki.certificateFromPem(cert); + } + issuer = cert.issuer.attributes; + serialNumber = cert.serialNumber; + } + var key = signer.key; + if (!key) { + throw new Error( + "Could not add PKCS#7 signer; no private key specified." + ); + } + if (typeof key === "string") { + key = forge2.pki.privateKeyFromPem(key); + } + var digestAlgorithm = signer.digestAlgorithm || forge2.pki.oids.sha1; + switch (digestAlgorithm) { + case forge2.pki.oids.sha1: + case forge2.pki.oids.sha256: + case forge2.pki.oids.sha384: + case forge2.pki.oids.sha512: + case forge2.pki.oids.md5: + break; + default: + throw new Error( + "Could not add PKCS#7 signer; unknown message digest algorithm: " + digestAlgorithm + ); + } + var authenticatedAttributes = signer.authenticatedAttributes || []; + if (authenticatedAttributes.length > 0) { + var contentType = false; + var messageDigest = false; + for (var i = 0; i < authenticatedAttributes.length; ++i) { + var attr = authenticatedAttributes[i]; + if (!contentType && attr.type === forge2.pki.oids.contentType) { + contentType = true; + if (messageDigest) { + break; + } + continue; + } + if (!messageDigest && attr.type === forge2.pki.oids.messageDigest) { + messageDigest = true; + if (contentType) { + break; + } + continue; + } + } + if (!contentType || !messageDigest) { + throw new Error("Invalid signer.authenticatedAttributes. If signer.authenticatedAttributes is specified, then it must contain at least two attributes, PKCS #9 content-type and PKCS #9 message-digest."); + } + } + msg.signers.push({ + key, + version: 1, + issuer, + serialNumber, + digestAlgorithm, + signatureAlgorithm: forge2.pki.oids.rsaEncryption, + signature: null, + authenticatedAttributes, + unauthenticatedAttributes: [] + }); + }, + /** + * Signs the content. + * @param options Options to apply when signing: + * [detached] boolean. If signing should be done in detached mode. Defaults to false. + */ + sign: function(options) { + options = options || {}; + if (typeof msg.content !== "object" || msg.contentInfo === null) { + msg.contentInfo = asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.SEQUENCE, + true, + [ + // ContentType + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + asn1.oidToDer(forge2.pki.oids.data).getBytes() + ) + ] + ); + if ("content" in msg) { + var content; + if (msg.content instanceof forge2.util.ByteBuffer) { + content = msg.content.bytes(); + } else if (typeof msg.content === "string") { + content = forge2.util.encodeUtf8(msg.content); + } + if (options.detached) { + msg.detachedContent = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OCTETSTRING, false, content); + } else { + msg.contentInfo.value.push( + // [0] EXPLICIT content + asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, [ + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OCTETSTRING, + false, + content + ) + ]) + ); + } + } + } + if (msg.signers.length === 0) { + return; + } + var mds = addDigestAlgorithmIds(); + addSignerInfos(mds); + }, + verify: function() { + throw new Error("PKCS#7 signature verification not yet implemented."); + }, + /** + * Add a certificate. + * + * @param cert the certificate to add. + */ + addCertificate: function(cert) { + if (typeof cert === "string") { + cert = forge2.pki.certificateFromPem(cert); + } + msg.certificates.push(cert); + }, + /** + * Add a certificate revokation list. + * + * @param crl the certificate revokation list to add. + */ + addCertificateRevokationList: function(crl) { + throw new Error("PKCS#7 CRL support not yet implemented."); + } + }; + return msg; + function addDigestAlgorithmIds() { + var mds = {}; + for (var i = 0; i < msg.signers.length; ++i) { + var signer = msg.signers[i]; + var oid = signer.digestAlgorithm; + if (!(oid in mds)) { + mds[oid] = forge2.md[forge2.pki.oids[oid]].create(); + } + if (signer.authenticatedAttributes.length === 0) { + signer.md = mds[oid]; + } else { + signer.md = forge2.md[forge2.pki.oids[oid]].create(); + } + } + msg.digestAlgorithmIdentifiers = []; + for (var oid in mds) { + msg.digestAlgorithmIdentifiers.push( + // AlgorithmIdentifier + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // algorithm + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + asn1.oidToDer(oid).getBytes() + ), + // parameters (null) + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.NULL, false, "") + ]) + ); + } + return mds; + } + function addSignerInfos(mds) { + var content; + if (msg.detachedContent) { + content = msg.detachedContent; + } else { + content = msg.contentInfo.value[1]; + content = content.value[0]; + } + if (!content) { + throw new Error( + "Could not sign PKCS#7 message; there is no content to sign." + ); + } + var contentType = asn1.derToOid(msg.contentInfo.value[0].value); + var bytes = asn1.toDer(content); + bytes.getByte(); + asn1.getBerValueLength(bytes); + bytes = bytes.getBytes(); + for (var oid in mds) { + mds[oid].start().update(bytes); + } + var signingTime = /* @__PURE__ */ new Date(); + for (var i = 0; i < msg.signers.length; ++i) { + var signer = msg.signers[i]; + if (signer.authenticatedAttributes.length === 0) { + if (contentType !== forge2.pki.oids.data) { + throw new Error( + "Invalid signer; authenticatedAttributes must be present when the ContentInfo content type is not PKCS#7 Data." + ); + } + } else { + signer.authenticatedAttributesAsn1 = asn1.create( + asn1.Class.CONTEXT_SPECIFIC, + 0, + true, + [] + ); + var attrsAsn1 = asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.SET, + true, + [] + ); + for (var ai = 0; ai < signer.authenticatedAttributes.length; ++ai) { + var attr = signer.authenticatedAttributes[ai]; + if (attr.type === forge2.pki.oids.messageDigest) { + attr.value = mds[signer.digestAlgorithm].digest(); + } else if (attr.type === forge2.pki.oids.signingTime) { + if (!attr.value) { + attr.value = signingTime; + } + } + attrsAsn1.value.push(_attributeToAsn1(attr)); + signer.authenticatedAttributesAsn1.value.push(_attributeToAsn1(attr)); + } + bytes = asn1.toDer(attrsAsn1).getBytes(); + signer.md.start().update(bytes); + } + signer.signature = signer.key.sign(signer.md, "RSASSA-PKCS1-V1_5"); + } + msg.signerInfos = _signersToAsn1(msg.signers); + } + }; + p7.createEncryptedData = function() { + var msg = null; + msg = { + type: forge2.pki.oids.encryptedData, + version: 0, + encryptedContent: { + algorithm: forge2.pki.oids["aes256-CBC"] + }, + /** + * Reads an EncryptedData content block (in ASN.1 format) + * + * @param obj The ASN.1 representation of the EncryptedData content block + */ + fromAsn1: function(obj) { + _fromAsn1(msg, obj, p7.asn1.encryptedDataValidator); + }, + /** + * Decrypt encrypted content + * + * @param key The (symmetric) key as a byte buffer + */ + decrypt: function(key) { + if (key !== void 0) { + msg.encryptedContent.key = key; + } + _decryptContent(msg); + } + }; + return msg; + }; + p7.createEnvelopedData = function() { + var msg = null; + msg = { + type: forge2.pki.oids.envelopedData, + version: 0, + recipients: [], + encryptedContent: { + algorithm: forge2.pki.oids["aes256-CBC"] + }, + /** + * Reads an EnvelopedData content block (in ASN.1 format) + * + * @param obj the ASN.1 representation of the EnvelopedData content block. + */ + fromAsn1: function(obj) { + var capture = _fromAsn1(msg, obj, p7.asn1.envelopedDataValidator); + msg.recipients = _recipientsFromAsn1(capture.recipientInfos.value); + }, + toAsn1: function() { + return asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // ContentType + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + asn1.oidToDer(msg.type).getBytes() + ), + // [0] EnvelopedData + asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, [ + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // Version + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.INTEGER, + false, + asn1.integerToDer(msg.version).getBytes() + ), + // RecipientInfos + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.SET, + true, + _recipientsToAsn1(msg.recipients) + ), + // EncryptedContentInfo + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.SEQUENCE, + true, + _encryptedContentToAsn1(msg.encryptedContent) + ) + ]) + ]) + ]); + }, + /** + * Find recipient by X.509 certificate's issuer. + * + * @param cert the certificate with the issuer to look for. + * + * @return the recipient object. + */ + findRecipient: function(cert) { + var sAttr = cert.issuer.attributes; + for (var i = 0; i < msg.recipients.length; ++i) { + var r = msg.recipients[i]; + var rAttr = r.issuer; + if (r.serialNumber !== cert.serialNumber) { + continue; + } + if (rAttr.length !== sAttr.length) { + continue; + } + var match = true; + for (var j = 0; j < sAttr.length; ++j) { + if (rAttr[j].type !== sAttr[j].type || rAttr[j].value !== sAttr[j].value) { + match = false; + break; + } + } + if (match) { + return r; + } + } + return null; + }, + /** + * Decrypt enveloped content + * + * @param recipient The recipient object related to the private key + * @param privKey The (RSA) private key object + */ + decrypt: function(recipient, privKey) { + if (msg.encryptedContent.key === void 0 && recipient !== void 0 && privKey !== void 0) { + switch (recipient.encryptedContent.algorithm) { + case forge2.pki.oids.rsaEncryption: + case forge2.pki.oids.desCBC: + var key = privKey.decrypt(recipient.encryptedContent.content); + msg.encryptedContent.key = forge2.util.createBuffer(key); + break; + default: + throw new Error("Unsupported asymmetric cipher, OID " + recipient.encryptedContent.algorithm); + } + } + _decryptContent(msg); + }, + /** + * Add (another) entity to list of recipients. + * + * @param cert The certificate of the entity to add. + */ + addRecipient: function(cert) { + msg.recipients.push({ + version: 0, + issuer: cert.issuer.attributes, + serialNumber: cert.serialNumber, + encryptedContent: { + // We simply assume rsaEncryption here, since forge.pki only + // supports RSA so far. If the PKI module supports other + // ciphers one day, we need to modify this one as well. + algorithm: forge2.pki.oids.rsaEncryption, + key: cert.publicKey + } + }); + }, + /** + * Encrypt enveloped content. + * + * This function supports two optional arguments, cipher and key, which + * can be used to influence symmetric encryption. Unless cipher is + * provided, the cipher specified in encryptedContent.algorithm is used + * (defaults to AES-256-CBC). If no key is provided, encryptedContent.key + * is (re-)used. If that one's not set, a random key will be generated + * automatically. + * + * @param [key] The key to be used for symmetric encryption. + * @param [cipher] The OID of the symmetric cipher to use. + */ + encrypt: function(key, cipher) { + if (msg.encryptedContent.content === void 0) { + cipher = cipher || msg.encryptedContent.algorithm; + key = key || msg.encryptedContent.key; + var keyLen, ivLen, ciphFn; + switch (cipher) { + case forge2.pki.oids["aes128-CBC"]: + keyLen = 16; + ivLen = 16; + ciphFn = forge2.aes.createEncryptionCipher; + break; + case forge2.pki.oids["aes192-CBC"]: + keyLen = 24; + ivLen = 16; + ciphFn = forge2.aes.createEncryptionCipher; + break; + case forge2.pki.oids["aes256-CBC"]: + keyLen = 32; + ivLen = 16; + ciphFn = forge2.aes.createEncryptionCipher; + break; + case forge2.pki.oids["des-EDE3-CBC"]: + keyLen = 24; + ivLen = 8; + ciphFn = forge2.des.createEncryptionCipher; + break; + default: + throw new Error("Unsupported symmetric cipher, OID " + cipher); + } + if (key === void 0) { + key = forge2.util.createBuffer(forge2.random.getBytes(keyLen)); + } else if (key.length() != keyLen) { + throw new Error("Symmetric key has wrong length; got " + key.length() + " bytes, expected " + keyLen + "."); + } + msg.encryptedContent.algorithm = cipher; + msg.encryptedContent.key = key; + msg.encryptedContent.parameter = forge2.util.createBuffer( + forge2.random.getBytes(ivLen) + ); + var ciph = ciphFn(key); + ciph.start(msg.encryptedContent.parameter.copy()); + ciph.update(msg.content); + if (!ciph.finish()) { + throw new Error("Symmetric encryption failed."); + } + msg.encryptedContent.content = ciph.output; + } + for (var i = 0; i < msg.recipients.length; ++i) { + var recipient = msg.recipients[i]; + if (recipient.encryptedContent.content !== void 0) { + continue; + } + switch (recipient.encryptedContent.algorithm) { + case forge2.pki.oids.rsaEncryption: + recipient.encryptedContent.content = recipient.encryptedContent.key.encrypt( + msg.encryptedContent.key.data + ); + break; + default: + throw new Error("Unsupported asymmetric cipher, OID " + recipient.encryptedContent.algorithm); + } + } + } + }; + return msg; + }; + function _recipientFromAsn1(obj) { + var capture = {}; + var errors = []; + if (!asn1.validate(obj, p7.asn1.recipientInfoValidator, capture, errors)) { + var error = new Error("Cannot read PKCS#7 RecipientInfo. ASN.1 object is not an PKCS#7 RecipientInfo."); + error.errors = errors; + throw error; + } + return { + version: capture.version.charCodeAt(0), + issuer: forge2.pki.RDNAttributesAsArray(capture.issuer), + serialNumber: forge2.util.createBuffer(capture.serial).toHex(), + encryptedContent: { + algorithm: asn1.derToOid(capture.encAlgorithm), + parameter: capture.encParameter ? capture.encParameter.value : void 0, + content: capture.encKey + } + }; + } + function _recipientToAsn1(obj) { + return asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // Version + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.INTEGER, + false, + asn1.integerToDer(obj.version).getBytes() + ), + // IssuerAndSerialNumber + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // Name + forge2.pki.distinguishedNameToAsn1({ attributes: obj.issuer }), + // Serial + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.INTEGER, + false, + forge2.util.hexToBytes(obj.serialNumber) + ) + ]), + // KeyEncryptionAlgorithmIdentifier + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // Algorithm + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + asn1.oidToDer(obj.encryptedContent.algorithm).getBytes() + ), + // Parameter, force NULL, only RSA supported for now. + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.NULL, false, "") + ]), + // EncryptedKey + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OCTETSTRING, + false, + obj.encryptedContent.content + ) + ]); + } + function _recipientsFromAsn1(infos) { + var ret = []; + for (var i = 0; i < infos.length; ++i) { + ret.push(_recipientFromAsn1(infos[i])); + } + return ret; + } + function _recipientsToAsn1(recipients) { + var ret = []; + for (var i = 0; i < recipients.length; ++i) { + ret.push(_recipientToAsn1(recipients[i])); + } + return ret; + } + function _signerToAsn1(obj) { + var rval = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // version + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.INTEGER, + false, + asn1.integerToDer(obj.version).getBytes() + ), + // issuerAndSerialNumber + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // name + forge2.pki.distinguishedNameToAsn1({ attributes: obj.issuer }), + // serial + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.INTEGER, + false, + forge2.util.hexToBytes(obj.serialNumber) + ) + ]), + // digestAlgorithm + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // algorithm + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + asn1.oidToDer(obj.digestAlgorithm).getBytes() + ), + // parameters (null) + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.NULL, false, "") + ]) + ]); + if (obj.authenticatedAttributesAsn1) { + rval.value.push(obj.authenticatedAttributesAsn1); + } + rval.value.push(asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // algorithm + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + asn1.oidToDer(obj.signatureAlgorithm).getBytes() + ), + // parameters (null) + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.NULL, false, "") + ])); + rval.value.push(asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OCTETSTRING, + false, + obj.signature + )); + if (obj.unauthenticatedAttributes.length > 0) { + var attrsAsn1 = asn1.create(asn1.Class.CONTEXT_SPECIFIC, 1, true, []); + for (var i = 0; i < obj.unauthenticatedAttributes.length; ++i) { + var attr = obj.unauthenticatedAttributes[i]; + attrsAsn1.values.push(_attributeToAsn1(attr)); + } + rval.value.push(attrsAsn1); + } + return rval; + } + function _signersToAsn1(signers) { + var ret = []; + for (var i = 0; i < signers.length; ++i) { + ret.push(_signerToAsn1(signers[i])); + } + return ret; + } + function _attributeToAsn1(attr) { + var value; + if (attr.type === forge2.pki.oids.contentType) { + value = asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + asn1.oidToDer(attr.value).getBytes() + ); + } else if (attr.type === forge2.pki.oids.messageDigest) { + value = asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OCTETSTRING, + false, + attr.value.bytes() + ); + } else if (attr.type === forge2.pki.oids.signingTime) { + var jan_1_1950 = /* @__PURE__ */ new Date("1950-01-01T00:00:00Z"); + var jan_1_2050 = /* @__PURE__ */ new Date("2050-01-01T00:00:00Z"); + var date = attr.value; + if (typeof date === "string") { + var timestamp = Date.parse(date); + if (!isNaN(timestamp)) { + date = new Date(timestamp); + } else if (date.length === 13) { + date = asn1.utcTimeToDate(date); + } else { + date = asn1.generalizedTimeToDate(date); + } + } + if (date >= jan_1_1950 && date < jan_1_2050) { + value = asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.UTCTIME, + false, + asn1.dateToUtcTime(date) + ); + } else { + value = asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.GENERALIZEDTIME, + false, + asn1.dateToGeneralizedTime(date) + ); + } + } + return asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // AttributeType + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + asn1.oidToDer(attr.type).getBytes() + ), + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SET, true, [ + // AttributeValue + value + ]) + ]); + } + function _encryptedContentToAsn1(ec) { + return [ + // ContentType, always Data for the moment + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + asn1.oidToDer(forge2.pki.oids.data).getBytes() + ), + // ContentEncryptionAlgorithmIdentifier + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // Algorithm + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OID, + false, + asn1.oidToDer(ec.algorithm).getBytes() + ), + // Parameters (IV) + !ec.parameter ? void 0 : asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OCTETSTRING, + false, + ec.parameter.getBytes() + ) + ]), + // [0] EncryptedContent + asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, [ + asn1.create( + asn1.Class.UNIVERSAL, + asn1.Type.OCTETSTRING, + false, + ec.content.getBytes() + ) + ]) + ]; + } + function _fromAsn1(msg, obj, validator) { + var capture = {}; + var errors = []; + if (!asn1.validate(obj, validator, capture, errors)) { + var error = new Error("Cannot read PKCS#7 message. ASN.1 object is not a supported PKCS#7 message."); + error.errors = error; + throw error; + } + var contentType = asn1.derToOid(capture.contentType); + if (contentType !== forge2.pki.oids.data) { + throw new Error("Unsupported PKCS#7 message. Only wrapped ContentType Data supported."); + } + if (capture.encryptedContent) { + var content = ""; + if (forge2.util.isArray(capture.encryptedContent)) { + for (var i = 0; i < capture.encryptedContent.length; ++i) { + if (capture.encryptedContent[i].type !== asn1.Type.OCTETSTRING) { + throw new Error("Malformed PKCS#7 message, expecting encrypted content constructed of only OCTET STRING objects."); + } + content += capture.encryptedContent[i].value; + } + } else { + content = capture.encryptedContent; + } + msg.encryptedContent = { + algorithm: asn1.derToOid(capture.encAlgorithm), + parameter: forge2.util.createBuffer(capture.encParameter.value), + content: forge2.util.createBuffer(content) + }; + } + if (capture.content) { + var content = ""; + if (forge2.util.isArray(capture.content)) { + for (var i = 0; i < capture.content.length; ++i) { + if (capture.content[i].type !== asn1.Type.OCTETSTRING) { + throw new Error("Malformed PKCS#7 message, expecting content constructed of only OCTET STRING objects."); + } + content += capture.content[i].value; + } + } else { + content = capture.content; + } + msg.content = forge2.util.createBuffer(content); + } + msg.version = capture.version.charCodeAt(0); + msg.rawCapture = capture; + return capture; + } + function _decryptContent(msg) { + if (msg.encryptedContent.key === void 0) { + throw new Error("Symmetric key not available."); + } + if (msg.content === void 0) { + var ciph; + switch (msg.encryptedContent.algorithm) { + case forge2.pki.oids["aes128-CBC"]: + case forge2.pki.oids["aes192-CBC"]: + case forge2.pki.oids["aes256-CBC"]: + ciph = forge2.aes.createDecryptionCipher(msg.encryptedContent.key); + break; + case forge2.pki.oids["desCBC"]: + case forge2.pki.oids["des-EDE3-CBC"]: + ciph = forge2.des.createDecryptionCipher(msg.encryptedContent.key); + break; + default: + throw new Error("Unsupported symmetric cipher, OID " + msg.encryptedContent.algorithm); + } + ciph.start(msg.encryptedContent.parameter); + ciph.update(msg.encryptedContent.content); + if (!ciph.finish()) { + throw new Error("Symmetric decryption failed."); + } + msg.content = ciph.output; + } + } + } +}); + +// node_modules/node-forge/lib/ssh.js +var require_ssh = __commonJS({ + "node_modules/node-forge/lib/ssh.js"(exports, module) { + var forge2 = require_forge(); + require_aes(); + require_hmac(); + require_md5(); + require_sha1(); + require_util(); + var ssh = module.exports = forge2.ssh = forge2.ssh || {}; + ssh.privateKeyToPutty = function(privateKey, passphrase, comment) { + comment = comment || ""; + passphrase = passphrase || ""; + var algorithm = "ssh-rsa"; + var encryptionAlgorithm = passphrase === "" ? "none" : "aes256-cbc"; + var ppk = "PuTTY-User-Key-File-2: " + algorithm + "\r\n"; + ppk += "Encryption: " + encryptionAlgorithm + "\r\n"; + ppk += "Comment: " + comment + "\r\n"; + var pubbuffer = forge2.util.createBuffer(); + _addStringToBuffer(pubbuffer, algorithm); + _addBigIntegerToBuffer(pubbuffer, privateKey.e); + _addBigIntegerToBuffer(pubbuffer, privateKey.n); + var pub = forge2.util.encode64(pubbuffer.bytes(), 64); + var length = Math.floor(pub.length / 66) + 1; + ppk += "Public-Lines: " + length + "\r\n"; + ppk += pub; + var privbuffer = forge2.util.createBuffer(); + _addBigIntegerToBuffer(privbuffer, privateKey.d); + _addBigIntegerToBuffer(privbuffer, privateKey.p); + _addBigIntegerToBuffer(privbuffer, privateKey.q); + _addBigIntegerToBuffer(privbuffer, privateKey.qInv); + var priv; + if (!passphrase) { + priv = forge2.util.encode64(privbuffer.bytes(), 64); + } else { + var encLen = privbuffer.length() + 16 - 1; + encLen -= encLen % 16; + var padding = _sha1(privbuffer.bytes()); + padding.truncate(padding.length() - encLen + privbuffer.length()); + privbuffer.putBuffer(padding); + var aeskey = forge2.util.createBuffer(); + aeskey.putBuffer(_sha1("\0\0\0\0", passphrase)); + aeskey.putBuffer(_sha1("\0\0\0", passphrase)); + var cipher = forge2.aes.createEncryptionCipher(aeskey.truncate(8), "CBC"); + cipher.start(forge2.util.createBuffer().fillWithByte(0, 16)); + cipher.update(privbuffer.copy()); + cipher.finish(); + var encrypted = cipher.output; + encrypted.truncate(16); + priv = forge2.util.encode64(encrypted.bytes(), 64); + } + length = Math.floor(priv.length / 66) + 1; + ppk += "\r\nPrivate-Lines: " + length + "\r\n"; + ppk += priv; + var mackey = _sha1("putty-private-key-file-mac-key", passphrase); + var macbuffer = forge2.util.createBuffer(); + _addStringToBuffer(macbuffer, algorithm); + _addStringToBuffer(macbuffer, encryptionAlgorithm); + _addStringToBuffer(macbuffer, comment); + macbuffer.putInt32(pubbuffer.length()); + macbuffer.putBuffer(pubbuffer); + macbuffer.putInt32(privbuffer.length()); + macbuffer.putBuffer(privbuffer); + var hmac = forge2.hmac.create(); + hmac.start("sha1", mackey); + hmac.update(macbuffer.bytes()); + ppk += "\r\nPrivate-MAC: " + hmac.digest().toHex() + "\r\n"; + return ppk; + }; + ssh.publicKeyToOpenSSH = function(key, comment) { + var type = "ssh-rsa"; + comment = comment || ""; + var buffer = forge2.util.createBuffer(); + _addStringToBuffer(buffer, type); + _addBigIntegerToBuffer(buffer, key.e); + _addBigIntegerToBuffer(buffer, key.n); + return type + " " + forge2.util.encode64(buffer.bytes()) + " " + comment; + }; + ssh.privateKeyToOpenSSH = function(privateKey, passphrase) { + if (!passphrase) { + return forge2.pki.privateKeyToPem(privateKey); + } + return forge2.pki.encryptRsaPrivateKey( + privateKey, + passphrase, + { legacy: true, algorithm: "aes128" } + ); + }; + ssh.getPublicKeyFingerprint = function(key, options) { + options = options || {}; + var md = options.md || forge2.md.md5.create(); + var type = "ssh-rsa"; + var buffer = forge2.util.createBuffer(); + _addStringToBuffer(buffer, type); + _addBigIntegerToBuffer(buffer, key.e); + _addBigIntegerToBuffer(buffer, key.n); + md.start(); + md.update(buffer.getBytes()); + var digest = md.digest(); + if (options.encoding === "hex") { + var hex = digest.toHex(); + if (options.delimiter) { + return hex.match(/.{2}/g).join(options.delimiter); + } + return hex; + } else if (options.encoding === "binary") { + return digest.getBytes(); + } else if (options.encoding) { + throw new Error('Unknown encoding "' + options.encoding + '".'); + } + return digest; + }; + function _addBigIntegerToBuffer(buffer, val) { + var hexVal = val.toString(16); + if (hexVal[0] >= "8") { + hexVal = "00" + hexVal; + } + var bytes = forge2.util.hexToBytes(hexVal); + buffer.putInt32(bytes.length); + buffer.putBytes(bytes); + } + function _addStringToBuffer(buffer, val) { + buffer.putInt32(val.length); + buffer.putString(val); + } + function _sha1() { + var sha = forge2.md.sha1.create(); + var num = arguments.length; + for (var i = 0; i < num; ++i) { + sha.update(arguments[i]); + } + return sha.digest(); + } + } +}); + +// node_modules/node-forge/lib/index.js +var require_lib = __commonJS({ + "node_modules/node-forge/lib/index.js"(exports, module) { + module.exports = require_forge(); + require_aes(); + require_aesCipherSuites(); + require_asn1(); + require_cipher(); + require_des(); + require_ed25519(); + require_hmac(); + require_kem(); + require_log(); + require_md_all(); + require_mgf1(); + require_pbkdf2(); + require_pem(); + require_pkcs1(); + require_pkcs12(); + require_pkcs7(); + require_pki(); + require_prime(); + require_prng(); + require_pss(); + require_random(); + require_rc2(); + require_ssh(); + require_tls(); + require_util(); + } +}); + +// src/lostcity/server/PreloadedDirs.ts +var PreloadedDirs_exports = {}; +__export(PreloadedDirs_exports, { + jingles: () => jingles, + maps: () => maps, + serverMaps: () => serverMaps, + songs: () => songs +}); +var maps, songs, jingles, serverMaps; +var init_PreloadedDirs = __esm({ + "src/lostcity/server/PreloadedDirs.ts"() { + "use strict"; + maps = ["l29_75", "l30_75", "l31_75", "l32_70", "l32_71", "l32_72", "l32_73", "l32_74", "l32_75", "l33_70", "l33_71", "l33_72", "l33_73", "l33_74", "l33_75", "l33_76", "l34_70", "l34_71", "l34_72", "l34_73", "l34_74", "l34_75", "l34_76", "l35_20", "l35_75", "l35_76", "l36_146", "l36_147", "l36_148", "l36_149", "l36_150", "l36_153", "l36_154", "l36_52", "l36_53", "l36_54", "l36_72", "l36_73", "l36_74", "l36_75", "l36_76", "l37_146", "l37_147", "l37_148", "l37_149", "l37_150", "l37_151", "l37_152", "l37_153", "l37_154", "l37_48", "l37_49", "l37_50", "l37_51", "l37_52", "l37_53", "l37_54", "l37_55", "l37_72", "l37_73", "l37_74", "l37_75", "l38_146", "l38_147", "l38_148", "l38_149", "l38_150", "l38_151", "l38_152", "l38_153", "l38_154", "l38_155", "l38_45", "l38_46", "l38_47", "l38_48", "l38_49", "l38_50", "l38_51", "l38_52", "l38_53", "l38_54", "l38_55", "l38_72", "l38_73", "l38_74", "l39_147", "l39_148", "l39_149", "l39_150", "l39_151", "l39_152", "l39_153", "l39_154", "l39_155", "l39_45", "l39_46", "l39_47", "l39_48", "l39_49", "l39_50", "l39_51", "l39_52", "l39_53", "l39_54", "l39_55", "l39_72", "l39_73", "l39_74", "l39_75", "l39_76", "l40_147", "l40_148", "l40_149", "l40_150", "l40_151", "l40_152", "l40_153", "l40_154", "l40_45", "l40_46", "l40_47", "l40_48", "l40_49", "l40_50", "l40_51", "l40_52", "l40_53", "l40_54", "l40_55", "l40_72", "l40_73", "l40_74", "l40_75", "l40_76", "l41_146", "l41_149", "l41_151", "l41_152", "l41_153", "l41_154", "l41_45", "l41_46", "l41_47", "l41_48", "l41_49", "l41_50", "l41_51", "l41_52", "l41_53", "l41_54", "l41_55", "l41_56", "l41_72", "l41_73", "l41_74", "l41_75", "l42_144", "l42_145", "l42_146", "l42_151", "l42_152", "l42_153", "l42_49", "l42_50", "l42_51", "l42_52", "l42_53", "l42_54", "l42_55", "l42_56", "l42_72", "l42_73", "l42_74", "l42_75", "l43_144", "l43_145", "l43_146", "l43_153", "l43_154", "l43_45", "l43_46", "l43_47", "l43_48", "l43_49", "l43_50", "l43_51", "l43_52", "l43_53", "l43_54", "l43_55", "l43_56", "l43_72", "l43_73", "l43_74", "l43_75", "l44_144", "l44_145", "l44_146", "l44_148", "l44_149", "l44_150", "l44_151", "l44_152", "l44_153", "l44_154", "l44_155", "l44_45", "l44_46", "l44_47", "l44_48", "l44_49", "l44_50", "l44_51", "l44_52", "l44_53", "l44_54", "l44_55", "l44_72", "l44_73", "l44_74", "l44_75", "l45_145", "l45_146", "l45_148", "l45_150", "l45_151", "l45_152", "l45_153", "l45_154", "l45_155", "l45_45", "l45_46", "l45_47", "l45_48", "l45_49", "l45_50", "l45_51", "l45_52", "l45_53", "l45_54", "l45_55", "l45_56", "l45_57", "l45_58", "l45_59", "l45_60", "l45_61", "l45_62", "l45_73", "l45_74", "l45_75", "l45_76", "l46_149", "l46_150", "l46_152", "l46_153", "l46_154", "l46_161", "l46_45", "l46_46", "l46_47", "l46_48", "l46_49", "l46_50", "l46_51", "l46_52", "l46_53", "l46_54", "l46_55", "l46_56", "l46_57", "l46_58", "l46_59", "l46_60", "l46_61", "l46_62", "l46_75", "l47_148", "l47_149", "l47_150", "l47_152", "l47_153", "l47_160", "l47_161", "l47_47", "l47_48", "l47_49", "l47_50", "l47_51", "l47_52", "l47_53", "l47_54", "l47_55", "l47_56", "l47_57", "l47_58", "l47_59", "l47_60", "l47_61", "l47_62", "l47_75", "l48_148", "l48_149", "l48_152", "l48_153", "l48_154", "l48_155", "l48_156", "l48_47", "l48_48", "l48_49", "l48_50", "l48_51", "l48_52", "l48_53", "l48_54", "l48_55", "l48_56", "l48_57", "l48_58", "l48_59", "l48_60", "l48_61", "l48_62", "l49_148", "l49_149", "l49_153", "l49_154", "l49_155", "l49_156", "l49_46", "l49_47", "l49_48", "l49_49", "l49_50", "l49_51", "l49_52", "l49_53", "l49_54", "l49_55", "l49_56", "l49_57", "l49_58", "l49_59", "l49_60", "l49_61", "l49_62", "l50_149", "l50_150", "l50_152", "l50_153", "l50_154", "l50_46", "l50_47", "l50_48", "l50_49", "l50_50", "l50_51", "l50_52", "l50_53", "l50_54", "l50_55", "l50_56", "l50_57", "l50_58", "l50_59", "l50_60", "l50_61", "l50_62", "l51_147", "l51_154", "l51_46", "l51_47", "l51_48", "l51_49", "l51_50", "l51_51", "l51_52", "l51_53", "l51_54", "l51_55", "l51_56", "l51_57", "l51_58", "l51_59", "l51_60", "l51_61", "l51_62", "l52_152", "l52_153", "l52_154", "l52_46", "l52_47", "l52_48", "l52_49", "l52_50", "l52_51", "l52_52", "l52_53", "l52_54", "l52_55", "l52_56", "l52_57", "l52_58", "l52_59", "l52_60", "l52_61", "l52_62", "l53_49", "l53_50", "l53_51", "l53_52", "l53_53", "m29_75", "m30_75", "m31_75", "m32_70", "m32_71", "m32_72", "m32_73", "m32_74", "m32_75", "m33_70", "m33_71", "m33_72", "m33_73", "m33_74", "m33_75", "m33_76", "m34_70", "m34_71", "m34_72", "m34_73", "m34_74", "m34_75", "m34_76", "m35_20", "m35_75", "m35_76", "m36_146", "m36_147", "m36_148", "m36_149", "m36_150", "m36_153", "m36_154", "m36_52", "m36_53", "m36_54", "m36_72", "m36_73", "m36_74", "m36_75", "m36_76", "m37_146", "m37_147", "m37_148", "m37_149", "m37_150", "m37_151", "m37_152", "m37_153", "m37_154", "m37_48", "m37_49", "m37_50", "m37_51", "m37_52", "m37_53", "m37_54", "m37_55", "m37_72", "m37_73", "m37_74", "m37_75", "m38_146", "m38_147", "m38_148", "m38_149", "m38_150", "m38_151", "m38_152", "m38_153", "m38_154", "m38_155", "m38_45", "m38_46", "m38_47", "m38_48", "m38_49", "m38_50", "m38_51", "m38_52", "m38_53", "m38_54", "m38_55", "m38_72", "m38_73", "m38_74", "m39_147", "m39_148", "m39_149", "m39_150", "m39_151", "m39_152", "m39_153", "m39_154", "m39_155", "m39_45", "m39_46", "m39_47", "m39_48", "m39_49", "m39_50", "m39_51", "m39_52", "m39_53", "m39_54", "m39_55", "m39_72", "m39_73", "m39_74", "m39_75", "m39_76", "m40_147", "m40_148", "m40_149", "m40_150", "m40_151", "m40_152", "m40_153", "m40_154", "m40_45", "m40_46", "m40_47", "m40_48", "m40_49", "m40_50", "m40_51", "m40_52", "m40_53", "m40_54", "m40_55", "m40_72", "m40_73", "m40_74", "m40_75", "m40_76", "m41_146", "m41_149", "m41_151", "m41_152", "m41_153", "m41_154", "m41_45", "m41_46", "m41_47", "m41_48", "m41_49", "m41_50", "m41_51", "m41_52", "m41_53", "m41_54", "m41_55", "m41_56", "m41_72", "m41_73", "m41_74", "m41_75", "m42_144", "m42_145", "m42_146", "m42_151", "m42_152", "m42_153", "m42_49", "m42_50", "m42_51", "m42_52", "m42_53", "m42_54", "m42_55", "m42_56", "m42_72", "m42_73", "m42_74", "m42_75", "m43_144", "m43_145", "m43_146", "m43_153", "m43_154", "m43_45", "m43_46", "m43_47", "m43_48", "m43_49", "m43_50", "m43_51", "m43_52", "m43_53", "m43_54", "m43_55", "m43_56", "m43_72", "m43_73", "m43_74", "m43_75", "m44_144", "m44_145", "m44_146", "m44_148", "m44_149", "m44_150", "m44_151", "m44_152", "m44_153", "m44_154", "m44_155", "m44_45", "m44_46", "m44_47", "m44_48", "m44_49", "m44_50", "m44_51", "m44_52", "m44_53", "m44_54", "m44_55", "m44_72", "m44_73", "m44_74", "m44_75", "m45_145", "m45_146", "m45_148", "m45_150", "m45_151", "m45_152", "m45_153", "m45_154", "m45_155", "m45_45", "m45_46", "m45_47", "m45_48", "m45_49", "m45_50", "m45_51", "m45_52", "m45_53", "m45_54", "m45_55", "m45_56", "m45_57", "m45_58", "m45_59", "m45_60", "m45_61", "m45_62", "m45_73", "m45_74", "m45_75", "m45_76", "m46_149", "m46_150", "m46_152", "m46_153", "m46_154", "m46_161", "m46_45", "m46_46", "m46_47", "m46_48", "m46_49", "m46_50", "m46_51", "m46_52", "m46_53", "m46_54", "m46_55", "m46_56", "m46_57", "m46_58", "m46_59", "m46_60", "m46_61", "m46_62", "m46_75", "m47_148", "m47_149", "m47_150", "m47_152", "m47_153", "m47_160", "m47_161", "m47_47", "m47_48", "m47_49", "m47_50", "m47_51", "m47_52", "m47_53", "m47_54", "m47_55", "m47_56", "m47_57", "m47_58", "m47_59", "m47_60", "m47_61", "m47_62", "m47_75", "m48_148", "m48_149", "m48_152", "m48_153", "m48_154", "m48_155", "m48_156", "m48_47", "m48_48", "m48_49", "m48_50", "m48_51", "m48_52", "m48_53", "m48_54", "m48_55", "m48_56", "m48_57", "m48_58", "m48_59", "m48_60", "m48_61", "m48_62", "m49_148", "m49_149", "m49_153", "m49_154", "m49_155", "m49_156", "m49_46", "m49_47", "m49_48", "m49_49", "m49_50", "m49_51", "m49_52", "m49_53", "m49_54", "m49_55", "m49_56", "m49_57", "m49_58", "m49_59", "m49_60", "m49_61", "m49_62", "m50_149", "m50_150", "m50_152", "m50_153", "m50_154", "m50_46", "m50_47", "m50_48", "m50_49", "m50_50", "m50_51", "m50_52", "m50_53", "m50_54", "m50_55", "m50_56", "m50_57", "m50_58", "m50_59", "m50_60", "m50_61", "m50_62", "m51_147", "m51_154", "m51_46", "m51_47", "m51_48", "m51_49", "m51_50", "m51_51", "m51_52", "m51_53", "m51_54", "m51_55", "m51_56", "m51_57", "m51_58", "m51_59", "m51_60", "m51_61", "m51_62", "m52_152", "m52_153", "m52_154", "m52_46", "m52_47", "m52_48", "m52_49", "m52_50", "m52_51", "m52_52", "m52_53", "m52_54", "m52_55", "m52_56", "m52_57", "m52_58", "m52_59", "m52_60", "m52_61", "m52_62", "m53_49", "m53_50", "m53_51", "m53_52", "m53_53"]; + songs = ["adventure.mid", "al_kharid.mid", "alone.mid", "ambience_2.mid", "ambience_3.mid", "ambience_4.mid", "ambient_jungle.mid", "arabian.mid", "arabian2.mid", "arabian3.mid", "arabique.mid", "army_of_darkness.mid", "arrival.mid", "attack1.mid", "attack2.mid", "attack3.mid", "attack4.mid", "attack5.mid", "attack6.mid", "attention.mid", "autumn_voyage.mid", "background2.mid", "ballad_of_enchantment.mid", "baroque.mid", "beyond.mid", "big_chords.mid", "book_of_spells.mid", "camelot.mid", "cave_background1.mid", "cavern.mid", "cellar_song1.mid", "chain_of_command.mid", "chompy_hunt.mid", "close_quarters.mid", "crystal_cave.mid", "crystal_sword.mid", "cursed.mid", "dangerous.mid", "dark2.mid", "deep_wildy.mid", "desert_voyage.mid", "doorways.mid", "dream1.mid", "duel_arena.mid", "dunjun.mid", "egypt.mid", "emotion.mid", "emperor.mid", "escape.mid", "expanse.mid", "expecting.mid", "expedition.mid", "fade_test.mid", "faerie.mid", "fanfare.mid", "fanfare2.mid", "fanfare3.mid", "fishing.mid", "flute_salad.mid", "forbidden.mid", "forever.mid", "game_intro_1.mid", "gaol.mid", "garden.mid", "gnome.mid", "gnome_king.mid", "gnome_theme.mid", "gnome_village.mid", "gnome_village2.mid", "gnomeball.mid", "greatness.mid", "grumpy.mid", "harmony.mid", "harmony2.mid", "heart_and_mind.mid", "high_seas.mid", "horizon.mid", "iban.mid", "ice_melody.mid", "in_the_manor.mid", "inspiration.mid", "intrepid.mid", "jolly-r.mid", "jungle_island.mid", "jungly1.mid", "jungly2.mid", "jungly3.mid", "knightly.mid", "landlubber.mid", "lasting.mid", "legion.mid", "lightness.mid", "lightwalk.mid", "lonesome.mid", "long_ago.mid", "long_way_home.mid", "lullaby.mid", "mage_arena.mid", "magic_dance.mid", "magical_journey.mid", "march2.mid", "medieval.mid", "mellow.mid", "miles_away.mid", "miracle_dance.mid", "monarch_waltz.mid", "moody.mid", "neverland.mid", "newbie_melody.mid", "nightfall.mid", "nomad.mid", "null.mid", "organ_music_1.mid", "organ_music_2.mid", "oriental.mid", "overture.mid", "parade.mid", "quest.mid", "regal2.mid", "reggae.mid", "reggae2.mid", "riverside.mid", "royale.mid", "rune_essence.mid", "sad_meadow.mid", "scape_cave.mid", "scape_main.mid", "scape_sad1.mid", "scape_soft.mid", "scape_wild1.mid", "sea_shanty.mid", "sea_shanty2.mid", "serenade.mid", "serene.mid", "shine.mid", "shining.mid", "silence.mid", "soundscape.mid", "spirit.mid", "splendour.mid", "spooky2.mid", "spooky_jungle.mid", "starlight.mid", "start.mid", "still_night.mid", "talking_forest.mid", "the_desert.mid", "the_shadow.mid", "the_tower.mid", "theme.mid", "tomorrow.mid", "trawler.mid", "trawler_minor.mid", "tree_spirits.mid", "tribal.mid", "tribal2.mid", "tribal_background.mid", "trinity.mid", "troubled.mid", "undercurrent.mid", "underground.mid", "understanding.mid", "unknown_land.mid", "upass1.mid", "upcoming.mid", "venture.mid", "venture2.mid", "vision.mid", "voodoo_cult.mid", "voyage.mid", "wander.mid", "waterfall.mid", "wilderness2.mid", "wilderness3.mid", "wilderness4.mid", "witching.mid", "wolf_mountain.mid", "wonder.mid", "wonderous.mid", "workshop.mid", "yesteryear.mid", "zealot.mid"]; + jingles = ["advance agility.mid", "advance attack.mid", "advance attack2.mid", "advance cooking.mid", "advance cooking2.mid", "advance crafting.mid", "advance crafting2.mid", "advance defense.mid", "advance defense2.mid", "advance firemarking.mid", "advance firemarking2.mid", "advance fishing.mid", "advance fishing2.mid", "advance fletching.mid", "advance fletching2.mid", "advance herblaw.mid", "advance herblaw2.mid", "advance hitpoints.mid", "advance hitpoints2.mid", "advance magic.mid", "advance magic2.mid", "advance mining.mid", "advance mining2.mid", "advance prayer.mid", "advance prayer2.mid", "advance ranged.mid", "advance ranged2.mid", "advance runecraft.mid", "advance runecraft2.mid", "advance smithing.mid", "advance smithing2.mid", "advance strength.mid", "advance strength2.mid", "advance thieving.mid", "advance thieving2.mid", "advance woodcutting.mid", "advance woodcutting2.mid", "death.mid", "death2.mid", "dice lose.mid", "dice win.mid", "duel start.mid", "duel win2.mid", "quest complete 1.mid", "quest complete 2.mid", "quest complete 3.mid", "sailing journey.mid", "treasure hunt win.mid"]; + serverMaps = ["m29_75", "m30_75", "m31_75", "m32_70", "m32_71", "m32_72", "m32_73", "m32_74", "m32_75", "m33_70", "m33_71", "m33_72", "m33_73", "m33_74", "m33_75", "m33_76", "m34_70", "m34_71", "m34_72", "m34_73", "m34_74", "m34_75", "m34_76", "m35_20", "m35_75", "m35_76", "m36_146", "m36_147", "m36_148", "m36_149", "m36_150", "m36_153", "m36_154", "m36_52", "m36_53", "m36_54", "m36_72", "m36_73", "m36_74", "m36_75", "m36_76", "m37_146", "m37_147", "m37_148", "m37_149", "m37_150", "m37_151", "m37_152", "m37_153", "m37_154", "m37_48", "m37_49", "m37_50", "m37_51", "m37_52", "m37_53", "m37_54", "m37_55", "m37_72", "m37_73", "m37_74", "m37_75", "m38_146", "m38_147", "m38_148", "m38_149", "m38_150", "m38_151", "m38_152", "m38_153", "m38_154", "m38_155", "m38_45", "m38_46", "m38_47", "m38_48", "m38_49", "m38_50", "m38_51", "m38_52", "m38_53", "m38_54", "m38_55", "m38_72", "m38_73", "m38_74", "m39_147", "m39_148", "m39_149", "m39_150", "m39_151", "m39_152", "m39_153", "m39_154", "m39_155", "m39_45", "m39_46", "m39_47", "m39_48", "m39_49", "m39_50", "m39_51", "m39_52", "m39_53", "m39_54", "m39_55", "m39_72", "m39_73", "m39_74", "m39_75", "m39_76", "m40_147", "m40_148", "m40_149", "m40_150", "m40_151", "m40_152", "m40_153", "m40_154", "m40_45", "m40_46", "m40_47", "m40_48", "m40_49", "m40_50", "m40_51", "m40_52", "m40_53", "m40_54", "m40_55", "m40_72", "m40_73", "m40_74", "m40_75", "m40_76", "m41_146", "m41_149", "m41_151", "m41_152", "m41_153", "m41_154", "m41_45", "m41_46", "m41_47", "m41_48", "m41_49", "m41_50", "m41_51", "m41_52", "m41_53", "m41_54", "m41_55", "m41_56", "m41_72", "m41_73", "m41_74", "m41_75", "m42_144", "m42_145", "m42_146", "m42_151", "m42_152", "m42_153", "m42_49", "m42_50", "m42_51", "m42_52", "m42_53", "m42_54", "m42_55", "m42_56", "m42_72", "m42_73", "m42_74", "m42_75", "m43_144", "m43_145", "m43_146", "m43_153", "m43_154", "m43_45", "m43_46", "m43_47", "m43_48", "m43_49", "m43_50", "m43_51", "m43_52", "m43_53", "m43_54", "m43_55", "m43_56", "m43_72", "m43_73", "m43_74", "m43_75", "m44_144", "m44_145", "m44_146", "m44_148", "m44_149", "m44_150", "m44_151", "m44_152", "m44_153", "m44_154", "m44_155", "m44_45", "m44_46", "m44_47", "m44_48", "m44_49", "m44_50", "m44_51", "m44_52", "m44_53", "m44_54", "m44_55", "m44_72", "m44_73", "m44_74", "m44_75", "m45_145", "m45_146", "m45_148", "m45_150", "m45_151", "m45_152", "m45_153", "m45_154", "m45_155", "m45_45", "m45_46", "m45_47", "m45_48", "m45_49", "m45_50", "m45_51", "m45_52", "m45_53", "m45_54", "m45_55", "m45_56", "m45_57", "m45_58", "m45_59", "m45_60", "m45_61", "m45_62", "m45_73", "m45_74", "m45_75", "m45_76", "m46_149", "m46_150", "m46_152", "m46_153", "m46_154", "m46_161", "m46_45", "m46_46", "m46_47", "m46_48", "m46_49", "m46_50", "m46_51", "m46_52", "m46_53", "m46_54", "m46_55", "m46_56", "m46_57", "m46_58", "m46_59", "m46_60", "m46_61", "m46_62", "m46_75", "m47_148", "m47_149", "m47_150", "m47_152", "m47_153", "m47_160", "m47_161", "m47_47", "m47_48", "m47_49", "m47_50", "m47_51", "m47_52", "m47_53", "m47_54", "m47_55", "m47_56", "m47_57", "m47_58", "m47_59", "m47_60", "m47_61", "m47_62", "m47_75", "m48_148", "m48_149", "m48_152", "m48_153", "m48_154", "m48_155", "m48_156", "m48_47", "m48_48", "m48_49", "m48_50", "m48_51", "m48_52", "m48_53", "m48_54", "m48_55", "m48_56", "m48_57", "m48_58", "m48_59", "m48_60", "m48_61", "m48_62", "m49_148", "m49_149", "m49_153", "m49_154", "m49_155", "m49_156", "m49_46", "m49_47", "m49_48", "m49_49", "m49_50", "m49_51", "m49_52", "m49_53", "m49_54", "m49_55", "m49_56", "m49_57", "m49_58", "m49_59", "m49_60", "m49_61", "m49_62", "m50_149", "m50_150", "m50_152", "m50_153", "m50_154", "m50_46", "m50_47", "m50_48", "m50_49", "m50_50", "m50_51", "m50_52", "m50_53", "m50_54", "m50_55", "m50_56", "m50_57", "m50_58", "m50_59", "m50_60", "m50_61", "m50_62", "m51_147", "m51_154", "m51_46", "m51_47", "m51_48", "m51_49", "m51_50", "m51_51", "m51_52", "m51_53", "m51_54", "m51_55", "m51_56", "m51_57", "m51_58", "m51_59", "m51_60", "m51_61", "m51_62", "m52_152", "m52_153", "m52_154", "m52_46", "m52_47", "m52_48", "m52_49", "m52_50", "m52_51", "m52_52", "m52_53", "m52_54", "m52_55", "m52_56", "m52_57", "m52_58", "m52_59", "m52_60", "m52_61", "m52_62", "m53_49", "m53_50", "m53_51", "m53_52", "m53_53"]; + } +}); + +// src/lostcity/engine/World.ts + +// src/jagex2/jstring/JString.ts +function toBase37(string) { + string = string.trim(); + let l = 0n; + for (let i = 0; i < string.length && i < 12; i++) { + const c = string.charCodeAt(i); + l *= 37n; + if (c >= 65 && c <= 90) { + l += BigInt(c + 1 - 65); + } else if (c >= 97 && c <= 122) { + l += BigInt(c + 1 - 97); + } else if (c >= 48 && c <= 57) { + l += BigInt(c + 27 - 48); + } + } + return l; +} +var BASE37_LOOKUP = [ + "_", + "a", + "b", + "c", + "d", + "e", + "f", + "g", + "h", + "i", + "j", + "k", + "l", + "m", + "n", + "o", + "p", + "q", + "r", + "s", + "t", + "u", + "v", + "w", + "x", + "y", + "z", + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9" +]; +function fromBase37(value) { + if (value < 0n || value >= 6582952005840035281n) { + return "invalid_name"; + } + if (value % 37n === 0n) { + return "invalid_name"; + } + let len = 0; + const chars = Array(12); + while (value !== 0n) { + const l1 = value; + value /= 37n; + chars[11 - len++] = BASE37_LOOKUP[Number(l1 - value * 37n)]; + } + return chars.slice(12 - len).join(""); +} +function toTitleCase(str) { + return str.replace(/\w\S*/g, (txt) => txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase()); +} +function toSafeName(name) { + return fromBase37(toBase37(name)); +} +function toDisplayName(name) { + return toTitleCase(toSafeName(name).replaceAll("_", " ")); +} + +// src/lostcity/cache/config/CategoryType.ts + +// src/jagex2/io/Packet.ts +var import_node_forge = __toESM(require_lib(), 1); + +// src/jagex2/datastruct/Linkable.ts +var Linkable = class { + key; + next; + prev; + constructor() { + this.key = 0n; + this.next = this; + this.prev = this; + } + unlink() { + if (!this.prev || !this.next) { + return; + } + this.prev.next = this.next; + this.next.prev = this.prev; + this.next = null; + this.prev = null; + } +}; + +// src/jagex2/datastruct/LinkList.ts +var LinkList = class { + sentinel; + cursor = null; + constructor() { + const head = new Linkable(); + head.next = head; + head.prev = head; + this.sentinel = head; + } + addTail(node) { + if (node.prev) { + node.unlink(); + } + node.prev = this.sentinel.prev; + node.next = this.sentinel; + if (node.prev) { + node.prev.next = node; + } + node.next.prev = node; + } + addHead(node) { + if (node.prev) { + node.unlink(); + } + node.prev = this.sentinel; + node.next = this.sentinel.next; + node.prev.next = node; + if (node.next) { + node.next.prev = node; + } + } + removeHead() { + const node = this.sentinel.next; + if (node === this.sentinel) { + return null; + } + node?.unlink(); + return node; + } + head() { + const node = this.sentinel.next; + if (node === this.sentinel) { + this.cursor = null; + return null; + } + this.cursor = node?.next || null; + return node; + } + tail() { + const node = this.sentinel.prev; + if (node === this.sentinel) { + this.cursor = null; + return null; + } + this.cursor = node?.prev || null; + return node; + } + next() { + const node = this.cursor; + if (node === this.sentinel) { + this.cursor = null; + return null; + } + this.cursor = node?.next || null; + return node; + } + prev() { + const node = this.cursor; + if (node === this.sentinel) { + this.cursor = null; + return null; + } + this.cursor = node?.prev || null; + return node; + } + clear() { + while (true) { + const node = this.sentinel.next; + if (node === this.sentinel) { + return; + } + node?.unlink(); + } + } +}; + +// src/jagex2/datastruct/Hashable.ts +var Hashable = class extends Linkable { + nextHashable; + prevHashable; + constructor() { + super(); + this.nextHashable = this; + this.prevHashable = this; + } + uncache() { + if (!this.prevHashable || !this.nextHashable) { + return; + } + this.prevHashable.nextHashable = this.nextHashable; + this.nextHashable.prevHashable = this.prevHashable; + this.nextHashable = null; + this.prevHashable = null; + } +}; + +// src/jagex2/io/Packet.ts +var BigInteger = import_node_forge.default.jsbn.BigInteger; +var Packet = class _Packet extends Hashable { + static crctable = new Int32Array(256); + static bitmask = new Uint32Array(33); + /** + * Reversed CRC-32 polynomial for Cyclic Redundancy Check (CRC). + * This is sometimes referred to as CRC32B. + */ + static crc32b = 3988292384; + static { + for (let i = 0; i < 32; i++) { + this.bitmask[i] = (1 << i) - 1; + } + this.bitmask[32] = 4294967295; + for (let b = 0; b < 256; b++) { + let remainder = b; + for (let bit = 0; bit < 8; bit++) { + if ((remainder & 1) == 1) { + remainder = remainder >>> 1 ^ this.crc32b; + } else { + remainder >>>= 1; + } + } + this.crctable[b] = remainder; + } + } + static getcrc(src, offset, length) { + let crc = 4294967295; + for (let i = offset; i < length; i++) { + crc = crc >>> 8 ^ this.crctable[(crc ^ src[i]) & 255]; + } + return ~crc; + } + static checkcrc(src, offset, length, expected = 0) { + const checksum = _Packet.getcrc(src, offset, length); + return checksum == expected; + } + static alloc(type) { + let packet = null; + if (type === 0 && this.cacheMinCount > 0) { + packet = this.cacheMin.removeHead(); + this.cacheMinCount--; + } else if (type === 1 && this.cacheMidCount > 0) { + packet = this.cacheMid.removeHead(); + this.cacheMidCount--; + } else if (type === 2 && this.cacheMaxCount > 0) { + packet = this.cacheMax.removeHead(); + this.cacheMaxCount--; + } else if (type === 3 && this.cacheBigCount > 0) { + packet = this.cacheBig.removeHead(); + this.cacheBigCount--; + } else if (type === 4 && this.cacheHugeCount > 0) { + packet = this.cacheHuge.removeHead(); + this.cacheHugeCount--; + } else if (type === 5 && this.cacheUnimaginableCount > 0) { + packet = this.cacheUnimaginable.removeHead(); + this.cacheUnimaginableCount--; + } + if (packet !== null) { + packet.pos = 0; + packet.bitPos = 0; + return packet; + } + if (type === 0) { + return new _Packet(new Uint8Array(100)); + } else if (type === 1) { + return new _Packet(new Uint8Array(5e3)); + } else if (type === 2) { + return new _Packet(new Uint8Array(3e4)); + } else if (type === 3) { + return new _Packet(new Uint8Array(1e5)); + } else if (type === 4) { + return new _Packet(new Uint8Array(5e5)); + } else if (type === 5) { + return new _Packet(new Uint8Array(2e6)); + } else { + return new _Packet(new Uint8Array(type)); + } + } + static load(path4, seekToEnd = false) { + const packet = new _Packet(new Uint8Array(fs.readFileSync(path4))); + if (seekToEnd) { + packet.pos = packet.data.length; + } + return packet; + } + static async loadAsync(path4, seekToEnd = false) { + const packet = new _Packet(new Uint8Array(await (await fetch(path4)).arrayBuffer())); + if (seekToEnd) { + packet.pos = packet.data.length; + } + return packet; + } + static cacheMinCount = 0; + static cacheMidCount = 0; + static cacheMaxCount = 0; + static cacheBigCount = 0; + static cacheHugeCount = 0; + static cacheUnimaginableCount = 0; + static cacheMin = new LinkList(); + static cacheMid = new LinkList(); + static cacheMax = new LinkList(); + static cacheBig = new LinkList(); + static cacheHuge = new LinkList(); + static cacheUnimaginable = new LinkList(); + data; + #view; + pos; + bitPos; + constructor(src) { + super(); + this.data = src; + this.#view = new DataView(this.data.buffer); + this.pos = 0; + this.bitPos = 0; + } + get available() { + return this.data.length - this.pos; + } + get length() { + return this.data.length; + } + release() { + this.pos = 0; + this.bitPos = 0; + if (this.data.length === 100 && _Packet.cacheMinCount < 1e3) { + _Packet.cacheMin.addTail(this); + _Packet.cacheMinCount++; + } else if (this.data.length === 5e3 && _Packet.cacheMidCount < 250) { + _Packet.cacheMid.addTail(this); + _Packet.cacheMidCount++; + } else if (this.data.length === 3e4 && _Packet.cacheMaxCount < 50) { + _Packet.cacheMax.addTail(this); + _Packet.cacheMaxCount++; + } else if (this.data.length === 1e5 && _Packet.cacheBigCount < 10) { + _Packet.cacheBig.addTail(this); + _Packet.cacheBigCount++; + } else if (this.data.length === 5e5 && _Packet.cacheHugeCount < 5) { + _Packet.cacheHuge.addTail(this); + _Packet.cacheHugeCount++; + } else if (this.data.length === 2e6 && _Packet.cacheUnimaginableCount < 2) { + _Packet.cacheUnimaginable.addTail(this); + _Packet.cacheUnimaginableCount++; + } + } + save(filePath, length = this.pos, start = 0) { + if (typeof self === "undefined") { + const dir = path.dirname(filePath); + if (!fs.existsSync(dir)) { + fs.mkdirSync(dir, { recursive: true }); + } + fs.writeFileSync(filePath, this.data.subarray(start, start + length)); + } else { + const blob = new Blob([this.data.subarray(start, start + length)], { type: "application/octet-stream" }); + const url = URL.createObjectURL(blob); + self.postMessage({ type: "save", value: url, path: filePath }); + } + } + p1(value) { + this.#view.setUint8(this.pos++, value); + } + p2(value) { + this.#view.setUint16(this.pos, value); + this.pos += 2; + } + ip2(value) { + this.#view.setUint16(this.pos, value, true); + this.pos += 2; + } + p3(value) { + this.#view.setUint8(this.pos++, value >> 16); + this.#view.setUint16(this.pos, value); + this.pos += 2; + } + p4(value) { + this.#view.setInt32(this.pos, value); + this.pos += 4; + } + ip4(value) { + this.#view.setInt32(this.pos, value, true); + this.pos += 4; + } + p8(value) { + this.#view.setBigInt64(this.pos, value); + this.pos += 8; + } + pbool(value) { + this.p1(value ? 1 : 0); + } + pjstr(str, terminator = 10) { + const length = str.length; + for (let i = 0; i < length; i++) { + this.#view.setUint8(this.pos++, str.charCodeAt(i)); + } + this.#view.setUint8(this.pos++, terminator); + } + pdata(src, offset, length) { + this.data.set(src.subarray(offset, offset + length), this.pos); + this.pos += length - offset; + } + psize4(size) { + this.#view.setUint32(this.pos - size - 4, size); + } + psize2(size) { + this.#view.setUint16(this.pos - size - 2, size); + } + psize1(size) { + this.#view.setUint8(this.pos - size - 1, size); + } + psmarts(value) { + if (value < 64 && value >= 64) { + this.p1(value + 64); + } else if (value < 16384 && value >= -16384) { + this.p2(value + 49152); + } else { + throw new Error("Error psmarts out of range: " + value); + } + } + psmart(value) { + if (value >= 0 && value < 128) { + this.p1(value); + } else if (value >= 0 && value < 32768) { + this.p2(value + 32768); + } else { + throw new Error("Error psmart out of range: " + value); + } + } + // ---- + g1() { + return this.#view.getUint8(this.pos++); + } + g1b() { + return this.#view.getInt8(this.pos++); + } + g2() { + this.pos += 2; + return this.#view.getUint16(this.pos - 2); + } + g2s() { + this.pos += 2; + return this.#view.getInt16(this.pos - 2); + } + ig2() { + this.pos += 2; + return this.#view.getUint16(this.pos - 2, true); + } + g3() { + const result = this.#view.getUint8(this.pos++) << 16 | this.#view.getUint16(this.pos); + this.pos += 2; + return result; + } + g4() { + this.pos += 4; + return this.#view.getInt32(this.pos - 4); + } + ig4() { + this.pos += 4; + return this.#view.getInt32(this.pos - 4, true); + } + g8() { + this.pos += 8; + return this.#view.getBigInt64(this.pos - 8); + } + gbool() { + return this.g1() === 1; + } + gjstr(terminator = 10) { + const length = this.data.length; + let str = ""; + let b; + while ((b = this.#view.getUint8(this.pos++)) !== terminator && this.pos < length) { + str += String.fromCharCode(b); + } + return str; + } + gdata(dest, offset, length) { + dest.set(this.data.subarray(this.pos, this.pos + length), offset); + this.pos += length; + } + gsmarts() { + return this.#view.getUint8(this.pos) < 128 ? this.g1() - 64 : this.g2() - 49152; + } + gsmart() { + return this.#view.getUint8(this.pos) < 128 ? this.g1() : this.g2() - 32768; + } + bits() { + this.bitPos = this.pos << 3; + } + bytes() { + this.pos = this.bitPos + 7 >>> 3; + } + gBit(n) { + let bytePos = this.bitPos >>> 3; + let remaining = 8 - (this.bitPos & 7); + let value = 0; + this.bitPos += n; + for (; n > remaining; remaining = 8) { + value += (this.#view.getUint8(bytePos++) & _Packet.bitmask[remaining]) << n - remaining; + n -= remaining; + } + if (n == remaining) { + value += this.#view.getUint8(bytePos) & _Packet.bitmask[remaining]; + } else { + value += this.#view.getUint8(bytePos) >>> remaining - n & _Packet.bitmask[n]; + } + return value; + } + pBit(n, value) { + const pos = this.bitPos; + this.bitPos += n; + let bytePos = pos >>> 3; + let remaining = 8 - (pos & 7); + const view = this.#view; + for (; n > remaining; remaining = 8) { + const shift2 = (1 << remaining) - 1; + const byte2 = view.getUint8(bytePos); + view.setUint8(bytePos++, byte2 & ~shift2 | value >>> n - remaining & shift2); + n -= remaining; + } + const r = remaining - n; + const shift = (1 << n) - 1; + const byte = view.getUint8(bytePos); + view.setUint8(bytePos, byte & ~shift << r | (value & shift) << r); + } + rsaenc(pem) { + const length = this.pos; + this.pos = 0; + const dec = new Uint8Array(length); + this.gdata(dec, 0, dec.length); + const bigRaw = new BigInteger(Array.from(dec)); + const rawEnc = Uint8Array.from(bigRaw.modPow(pem.e, pem.n).toByteArray()); + this.pos = 0; + this.p1(rawEnc.length); + this.pdata(rawEnc, 0, rawEnc.length); + } + rsadec(pem) { + const p = pem.p; + const q = pem.q; + const dP = pem.dP; + const dQ = pem.dQ; + const qInv = pem.qInv; + const enc = new Uint8Array(this.g1()); + this.gdata(enc, 0, enc.length); + const bigRaw = new BigInteger(Array.from(enc)); + const m1 = bigRaw.mod(p).modPow(dP, p); + const m2 = bigRaw.mod(q).modPow(dQ, q); + const h = qInv.multiply(m1.subtract(m2)).mod(p); + const rawDec = new Uint8Array(m2.add(h.multiply(q)).toByteArray()); + this.pos = 0; + this.pdata(rawDec, 0, rawDec.length); + this.pos = 0; + } + // later revs have tinyenc/tinydec methods + // later revs have alt methods for packet obfuscation +}; + +// src/lostcity/cache/config/ConfigType.ts +var ConfigType = class { + id; + debugname = null; + constructor(id) { + this.id = id; + } + decodeType(dat) { + while (dat.available > 0) { + const code = dat.g1(); + if (code === 0) { + break; + } + this.decode(code, dat); + } + } +}; + +// src/lostcity/cache/config/CategoryType.ts +var CategoryType = class _CategoryType extends ConfigType { + static configNames = /* @__PURE__ */ new Map(); + static configs = []; + static load(dir) { + if (!fs2.existsSync(`${dir}/server/category.dat`)) { + console.log("Warning: No category.dat found."); + return; + } + const dat = Packet.load(`${dir}/server/category.dat`); + this.parse(dat); + } + static async loadAsync(dir) { + const file = await fetch(`${dir}/server/category.dat`); + if (!file.ok) { + console.log("Warning: No category.dat found."); + return; + } + const dat = new Packet(new Uint8Array(await file.arrayBuffer())); + this.parse(dat); + } + static parse(dat) { + _CategoryType.configNames = /* @__PURE__ */ new Map(); + _CategoryType.configs = []; + const count = dat.g2(); + for (let id = 0; id < count; id++) { + const config = new _CategoryType(id); + config.decodeType(dat); + _CategoryType.configs[id] = config; + if (config.debugname) { + _CategoryType.configNames.set(config.debugname, id); + } + } + } + static get(id) { + return _CategoryType.configs[id]; + } + static getId(name) { + return _CategoryType.configNames.get(name) ?? -1; + } + static getByName(name) { + const id = this.getId(name); + if (id === -1) { + return null; + } + return this.get(id); + } + static get count() { + return this.configs.length; + } + // ---- + decode(code, dat) { + this.debugname = dat.gjstr(); + } + toString() { + return this.debugname ?? `category_${this.id}`; + } +}; + +// src/lostcity/cache/config/DbRowType.ts + +// src/lostcity/cache/config/DbTableType.ts + +// src/lostcity/cache/config/ScriptVarType.ts +var ScriptVarType = class _ScriptVarType { + static INT = 105; + // i + static AUTOINT = 255; + // ÿ - virtual type used for enum keys + static STRING = 115; + // s + static ENUM = 103; + // g + static OBJ = 111; + // o + static LOC = 108; + // l + static COMPONENT = 73; + // I + static NAMEDOBJ = 79; + // O + static STRUCT = 74; + // J + static BOOLEAN = 49; + // 1 + static COORD = 99; + // c + static CATEGORY = 121; + // y + static SPOTANIM = 116; + // t + static NPC = 110; + // n + static INV = 118; + // v + static SYNTH = 80; + // P + static SEQ = 65; + // A + static STAT = 83; + // S + static VARP = 86; + // V + static PLAYER_UID = 112; + // p + static NPC_UID = 78; + // N + static INTERFACE = 97; + // a + static NPC_STAT = 254; + // þ + static IDKIT = 75; + // K + static getType(type) { + switch (type) { + case _ScriptVarType.INT: + return "int"; + case _ScriptVarType.STRING: + return "string"; + case _ScriptVarType.ENUM: + return "enum"; + case _ScriptVarType.OBJ: + return "obj"; + case _ScriptVarType.LOC: + return "loc"; + case _ScriptVarType.COMPONENT: + return "component"; + case _ScriptVarType.NAMEDOBJ: + return "namedobj"; + case _ScriptVarType.STRUCT: + return "struct"; + case _ScriptVarType.BOOLEAN: + return "boolean"; + case _ScriptVarType.COORD: + return "coord"; + case _ScriptVarType.CATEGORY: + return "category"; + case _ScriptVarType.SPOTANIM: + return "spotanim"; + case _ScriptVarType.NPC: + return "npc"; + case _ScriptVarType.INV: + return "inv"; + case _ScriptVarType.SYNTH: + return "synth"; + case _ScriptVarType.SEQ: + return "seq"; + case _ScriptVarType.STAT: + return "stat"; + case _ScriptVarType.AUTOINT: + return "autoint"; + case _ScriptVarType.VARP: + return "varp"; + case _ScriptVarType.PLAYER_UID: + return "player_uid"; + case _ScriptVarType.NPC_UID: + return "npc_uid"; + case _ScriptVarType.INTERFACE: + return "interface"; + case _ScriptVarType.NPC_STAT: + return "npc_stat"; + case _ScriptVarType.IDKIT: + return "idkit"; + default: + return "unknown"; + } + } + static getTypeChar(type) { + let char = "i"; + switch (type) { + case "int": + char = "i"; + break; + case "autoint": + char = "\xFF"; + break; + case "string": + char = "s"; + break; + case "enum": + char = "g"; + break; + case "obj": + char = "o"; + break; + case "loc": + char = "l"; + break; + case "component": + char = "I"; + break; + case "namedobj": + char = "O"; + break; + case "struct": + char = "J"; + break; + case "boolean": + char = "1"; + break; + case "coord": + char = "c"; + break; + case "category": + char = "y"; + break; + case "spotanim": + char = "t"; + break; + case "npc": + char = "n"; + break; + case "inv": + char = "v"; + break; + case "synth": + char = "P"; + break; + case "seq": + char = "A"; + break; + case "stat": + char = "S"; + break; + case "varp": + char = "V"; + break; + case "player_uid": + char = "p"; + break; + case "npc_uid": + char = "N"; + break; + case "interface": + char = "a"; + break; + case "npc_stat": + char = "\xFE"; + break; + case "idkit": + char = "K"; + break; + default: + return null; + } + return char.charCodeAt(0); + } + static getDefault(type) { + if (type === _ScriptVarType.STRING) { + return ""; + } else if (type === _ScriptVarType.BOOLEAN) { + return 0; + } else { + return -1; + } + } +}; + +// src/lostcity/cache/config/DbTableType.ts +var DbTableType = class _DbTableType extends ConfigType { + static configNames = /* @__PURE__ */ new Map(); + static configs = []; + static load(dir) { + if (!fs3.existsSync(`${dir}/server/dbtable.dat`)) { + console.log("Warning: No dbtable.dat found."); + return; + } + const dat = Packet.load(`${dir}/server/dbtable.dat`); + this.parse(dat); + } + static async loadAsync(dir) { + const file = await fetch(`${dir}/server/dbtable.dat`); + if (!file.ok) { + console.log("Warning: No dbtable.dat found."); + return; + } + const dat = new Packet(new Uint8Array(await file.arrayBuffer())); + this.parse(dat); + } + static parse(dat) { + _DbTableType.configNames = /* @__PURE__ */ new Map(); + _DbTableType.configs = []; + const count = dat.g2(); + for (let id = 0; id < count; id++) { + const config = new _DbTableType(id); + config.decodeType(dat); + _DbTableType.configs[id] = config; + if (config.debugname) { + _DbTableType.configNames.set(config.debugname, id); + } + } + } + static get(id) { + return _DbTableType.configs[id]; + } + static getId(name) { + return _DbTableType.configNames.get(name) ?? -1; + } + static getByName(name) { + const id = this.getId(name); + if (id === -1) { + return null; + } + return this.get(id); + } + static get count() { + return this.configs.length; + } + // ---- + types = []; + defaultValues = []; + columnNames = []; + decode(code, dat) { + if (code === 1) { + this.types = new Array(dat.g1()); + for (let setting = dat.g1(); setting != 255; setting = dat.g1()) { + const column = setting & 127; + const hasDefault = (setting & 128) !== 0; + const columnTypes = new Array(dat.g1()); + for (let i = 0; i < columnTypes.length; i++) { + columnTypes[i] = dat.g1(); + } + this.types[column] = columnTypes; + if (hasDefault) { + if (!this.defaultValues) { + this.defaultValues = new Array(this.types.length); + } + this.defaultValues[column] = this.decodeValues(dat, column); + } + } + } else if (code === 250) { + this.debugname = dat.gjstr(); + } else if (code === 251) { + this.columnNames = new Array(dat.g1()); + for (let i = 0; i < this.columnNames.length; i++) { + this.columnNames[i] = dat.gjstr(); + } + } else { + throw new Error(`Unrecognized dbtable config code: ${code}`); + } + } + getDefault(column) { + if (!this.defaultValues[column]) { + const defaults = []; + for (let i = 0; i < this.types[column].length; i++) { + defaults[i] = ScriptVarType.getDefault(this.types[column][i]); + } + return defaults; + } + return this.defaultValues[column]; + } + decodeValues(dat, column) { + const types = this.types[column]; + const fieldCount = dat.g1(); + const values = new Array(fieldCount * types.length); + for (let fieldId = 0; fieldId < fieldCount; fieldId++) { + for (let typeId = 0; typeId < types.length; typeId++) { + const type = types[typeId]; + const index = typeId + fieldId * types.length; + if (type === ScriptVarType.STRING) { + values[index] = dat.gjstr(); + } else { + values[index] = dat.g4(); + } + } + } + return values; + } +}; + +// src/lostcity/cache/config/DbRowType.ts +var DbRowType = class _DbRowType extends ConfigType { + static configNames = /* @__PURE__ */ new Map(); + static configs = []; + static load(dir) { + if (!fs4.existsSync(`${dir}/server/dbrow.dat`)) { + console.log("Warning: No dbrow.dat found."); + return; + } + const dat = Packet.load(`${dir}/server/dbrow.dat`); + this.parse(dat); + } + static async loadAsync(dir) { + const file = await fetch(`${dir}/server/dbrow.dat`); + if (!file.ok) { + console.log("Warning: No dbrow.dat found."); + return; + } + const dat = new Packet(new Uint8Array(await file.arrayBuffer())); + this.parse(dat); + } + static parse(dat) { + _DbRowType.configNames = /* @__PURE__ */ new Map(); + _DbRowType.configs = []; + const count = dat.g2(); + for (let id = 0; id < count; id++) { + const config = new _DbRowType(id); + config.decodeType(dat); + _DbRowType.configs[id] = config; + if (config.debugname) { + _DbRowType.configNames.set(config.debugname, id); + } + } + } + static get(id) { + return _DbRowType.configs[id]; + } + static getId(name) { + return _DbRowType.configNames.get(name) ?? -1; + } + static getByName(name) { + const id = this.getId(name); + if (id === -1) { + return null; + } + return this.get(id); + } + static get count() { + return this.configs.length; + } + static getInTable(tableId) { + return _DbRowType.configs.filter((config) => config.tableId === tableId); + } + // ---- + tableId = 0; + types = []; + columnValues = []; + decode(code, dat) { + if (code === 3) { + const numColumns = dat.g1(); + this.types = new Array(numColumns); + this.columnValues = new Array(numColumns); + for (let columnId = dat.g1(); columnId != 255; columnId = dat.g1()) { + const columnTypes = new Array(dat.g1()); + for (let i = 0; i < columnTypes.length; i++) { + columnTypes[i] = dat.g1(); + } + this.types[columnId] = columnTypes; + this.columnValues[columnId] = this.decodeValues(dat, columnId); + } + } else if (code === 4) { + this.tableId = dat.g2(); + } else if (code === 250) { + this.debugname = dat.gjstr(); + } else { + throw new Error(`Unrecognized dbtable config code: ${code}`); + } + } + getValue(column, listIndex) { + const value = this.columnValues[column].slice(listIndex * this.types[column].length, (listIndex + 1) * this.types[column].length); + if (!value.length) { + return DbTableType.get(this.tableId).getDefault(column); + } + return value; + } + decodeValues(dat, column) { + const types = this.types[column]; + const fieldCount = dat.g1(); + const values = new Array(fieldCount * types.length); + for (let fieldId = 0; fieldId < fieldCount; fieldId++) { + for (let typeId = 0; typeId < types.length; typeId++) { + const type = types[typeId]; + const index = typeId + fieldId * types.length; + if (type === ScriptVarType.STRING) { + values[index] = dat.gjstr(); + } else { + values[index] = dat.g4(); + } + } + } + return values; + } +}; + +// src/lostcity/cache/config/EnumType.ts +var EnumType = class _EnumType extends ConfigType { + static configNames = /* @__PURE__ */ new Map(); + static configs = []; + static load(dir) { + if (!fs5.existsSync(`${dir}/server/enum.dat`)) { + console.log("Warning: No enum.dat found."); + return; + } + const dat = Packet.load(`${dir}/server/enum.dat`); + this.parse(dat); + } + static async loadAsync(dir) { + const file = await fetch(`${dir}/server/enum.dat`); + if (!file.ok) { + console.log("Warning: No enum.dat found."); + return; + } + const dat = new Packet(new Uint8Array(await file.arrayBuffer())); + this.parse(dat); + } + static parse(dat) { + _EnumType.configNames = /* @__PURE__ */ new Map(); + _EnumType.configs = []; + const count = dat.g2(); + for (let id = 0; id < count; id++) { + const config = new _EnumType(id); + config.decodeType(dat); + _EnumType.configs[id] = config; + if (config.debugname) { + _EnumType.configNames.set(config.debugname, id); + } + } + } + static get(id) { + return _EnumType.configs[id]; + } + static getId(name) { + return _EnumType.configNames.get(name) ?? -1; + } + static getByName(name) { + const id = this.getId(name); + if (id === -1) { + return null; + } + return this.get(id); + } + static get count() { + return this.configs.length; + } + // ---- + // server-side + inputtype = ScriptVarType.INT; + outputtype = ScriptVarType.INT; + defaultInt = 0; + defaultString = "null"; + values = /* @__PURE__ */ new Map(); + decode(code, dat) { + if (code === 1) { + this.inputtype = dat.g1(); + } else if (code === 2) { + this.outputtype = dat.g1(); + } else if (code === 3) { + this.defaultString = dat.gjstr(); + } else if (code === 4) { + this.defaultInt = dat.g4(); + } else if (code === 5) { + const count = dat.g2(); + for (let i = 0; i < count; i++) { + this.values.set(dat.g4(), dat.gjstr()); + } + } else if (code === 6) { + const count = dat.g2(); + for (let i = 0; i < count; i++) { + this.values.set(dat.g4(), dat.g4()); + } + } else if (code === 250) { + this.debugname = dat.gjstr(); + } else { + throw new Error(`Unrecognized enum config code: ${code}`); + } + } +}; + +// src/3rdparty/bzip2-wasm/bzip2-1.0.8/bzip2.mjs +var loadBZip2WASM = (() => { + var _scriptName = import.meta.url; + return async function(moduleArg = {}) { + var moduleRtn; + var Module = Object.assign({}, moduleArg); + var readyPromiseResolve, readyPromiseReject; + var readyPromise = new Promise((resolve, reject) => { + readyPromiseResolve = resolve; + readyPromiseReject = reject; + }); + ["_BZ2_bzBuffToBuffDecompress", "_BZ2_bzBuffToBuffCompress", "_malloc", "_free", "_memory", "___indirect_function_table", "onRuntimeInitialized"].forEach((prop) => { + if (!Object.getOwnPropertyDescriptor(readyPromise, prop)) { + Object.defineProperty(readyPromise, prop, { + get: () => abort("You are getting " + prop + " on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js"), + set: () => abort("You are setting " + prop + " on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js") + }); + } + }); + var ENVIRONMENT_IS_WEB = typeof window == "object"; + var ENVIRONMENT_IS_WORKER = typeof importScripts == "function"; + var ENVIRONMENT_IS_NODE = typeof process == "object" && typeof process.versions == "object" && typeof process.versions.node == "string"; + var ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER; + if (Module["ENVIRONMENT"]) { + throw new Error("Module.ENVIRONMENT has been deprecated. To force the environment, use the ENVIRONMENT compile-time option (for example, -sENVIRONMENT=web or -sENVIRONMENT=node)"); + } + if (ENVIRONMENT_IS_NODE) { + const { createRequire } = await import("module"); + var require2 = createRequire(import.meta.url); + } + var moduleOverrides = Object.assign({}, Module); + var arguments_ = []; + var thisProgram = "./this.program"; + var quit_ = (status, toThrow) => { + throw toThrow; + }; + var scriptDirectory = ""; + function locateFile(path4) { + if (Module["locateFile"]) { + return Module["locateFile"](path4, scriptDirectory); + } + return scriptDirectory + path4; + } + var read_, readAsync, readBinary; + if (ENVIRONMENT_IS_NODE) { + if (typeof process == "undefined" || !process.release || process.release.name !== "node") throw new Error("not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)"); + var nodeVersion = process.versions.node; + var numericVersion = nodeVersion.split(".").slice(0, 3); + numericVersion = numericVersion[0] * 1e4 + numericVersion[1] * 100 + numericVersion[2].split("-")[0] * 1; + var minVersion = 16e4; + if (numericVersion < 16e4) { + throw new Error("This emscripten-generated code requires node v16.0.0 (detected v" + nodeVersion + ")"); + } + var fs30 = require2("fs"); + var nodePath = require2("path"); + scriptDirectory = require2("url").fileURLToPath(new URL("./", import.meta.url)); + read_ = (filename, binary) => { + filename = isFileURI(filename) ? new URL(filename) : nodePath.normalize(filename); + return fs30.readFileSync(filename, binary ? void 0 : "utf8"); + }; + readBinary = (filename) => { + var ret = read_(filename, true); + if (!ret.buffer) { + ret = new Uint8Array(ret); + } + assert(ret.buffer); + return ret; + }; + readAsync = (filename, onload, onerror, binary = true) => { + filename = isFileURI(filename) ? new URL(filename) : nodePath.normalize(filename); + fs30.readFile(filename, binary ? void 0 : "utf8", (err2, data) => { + if (err2) onerror(err2); + else onload(binary ? data.buffer : data); + }); + }; + if (!Module["thisProgram"] && process.argv.length > 1) { + thisProgram = process.argv[1].replace(/\\/g, "/"); + } + arguments_ = process.argv.slice(2); + quit_ = (status, toThrow) => { + process.exitCode = status; + throw toThrow; + }; + } else if (ENVIRONMENT_IS_SHELL) { + if (typeof process == "object" && typeof require2 === "function" || typeof window == "object" || typeof importScripts == "function") throw new Error("not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)"); + } else if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { + if (ENVIRONMENT_IS_WORKER) { + scriptDirectory = self.location.href; + } else if (typeof document != "undefined" && document.currentScript) { + scriptDirectory = document.currentScript.src; + } + if (_scriptName) { + scriptDirectory = _scriptName; + } + if (scriptDirectory.startsWith("blob:")) { + scriptDirectory = ""; + } else { + scriptDirectory = scriptDirectory.substr(0, scriptDirectory.replace(/[?#].*/, "").lastIndexOf("/") + 1); + } + if (!(typeof window == "object" || typeof importScripts == "function")) throw new Error("not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)"); + { + read_ = (url) => { + var xhr = new XMLHttpRequest(); + xhr.open("GET", url, false); + xhr.send(null); + return xhr.responseText; + }; + if (ENVIRONMENT_IS_WORKER) { + readBinary = (url) => { + var xhr = new XMLHttpRequest(); + xhr.open("GET", url, false); + xhr.responseType = "arraybuffer"; + xhr.send(null); + return new Uint8Array( + /** @type{!ArrayBuffer} */ + xhr.response + ); + }; + } + readAsync = (url, onload, onerror) => { + var xhr = new XMLHttpRequest(); + xhr.open("GET", url, true); + xhr.responseType = "arraybuffer"; + xhr.onload = () => { + if (xhr.status == 200 || xhr.status == 0 && xhr.response) { + onload(xhr.response); + return; + } + onerror(); + }; + xhr.onerror = onerror; + xhr.send(null); + }; + } + } else { + throw new Error("environment detection error"); + } + var out = Module["print"] || console.log.bind(console); + var err = Module["printErr"] || console.error.bind(console); + Object.assign(Module, moduleOverrides); + moduleOverrides = null; + checkIncomingModuleAPI(); + if (Module["arguments"]) arguments_ = Module["arguments"]; + legacyModuleProp("arguments", "arguments_"); + if (Module["thisProgram"]) thisProgram = Module["thisProgram"]; + legacyModuleProp("thisProgram", "thisProgram"); + if (Module["quit"]) quit_ = Module["quit"]; + legacyModuleProp("quit", "quit_"); + assert(typeof Module["memoryInitializerPrefixURL"] == "undefined", "Module.memoryInitializerPrefixURL option was removed, use Module.locateFile instead"); + assert(typeof Module["pthreadMainPrefixURL"] == "undefined", "Module.pthreadMainPrefixURL option was removed, use Module.locateFile instead"); + assert(typeof Module["cdInitializerPrefixURL"] == "undefined", "Module.cdInitializerPrefixURL option was removed, use Module.locateFile instead"); + assert(typeof Module["filePackagePrefixURL"] == "undefined", "Module.filePackagePrefixURL option was removed, use Module.locateFile instead"); + assert(typeof Module["read"] == "undefined", "Module.read option was removed (modify read_ in JS)"); + assert(typeof Module["readAsync"] == "undefined", "Module.readAsync option was removed (modify readAsync in JS)"); + assert(typeof Module["readBinary"] == "undefined", "Module.readBinary option was removed (modify readBinary in JS)"); + assert(typeof Module["setWindowTitle"] == "undefined", "Module.setWindowTitle option was removed (modify emscripten_set_window_title in JS)"); + assert(typeof Module["TOTAL_MEMORY"] == "undefined", "Module.TOTAL_MEMORY has been renamed Module.INITIAL_MEMORY"); + legacyModuleProp("asm", "wasmExports"); + legacyModuleProp("read", "read_"); + legacyModuleProp("readAsync", "readAsync"); + legacyModuleProp("readBinary", "readBinary"); + legacyModuleProp("setWindowTitle", "setWindowTitle"); + var IDBFS = "IDBFS is no longer included by default; build with -lidbfs.js"; + var PROXYFS = "PROXYFS is no longer included by default; build with -lproxyfs.js"; + var WORKERFS = "WORKERFS is no longer included by default; build with -lworkerfs.js"; + var FETCHFS = "FETCHFS is no longer included by default; build with -lfetchfs.js"; + var ICASEFS = "ICASEFS is no longer included by default; build with -licasefs.js"; + var JSFILEFS = "JSFILEFS is no longer included by default; build with -ljsfilefs.js"; + var OPFS = "OPFS is no longer included by default; build with -lopfs.js"; + var NODEFS = "NODEFS is no longer included by default; build with -lnodefs.js"; + assert(!ENVIRONMENT_IS_SHELL, "shell environment detected but not enabled at build time. Add `shell` to `-sENVIRONMENT` to enable."); + var wasmBinary; + if (Module["wasmBinary"]) wasmBinary = Module["wasmBinary"]; + legacyModuleProp("wasmBinary", "wasmBinary"); + if (typeof WebAssembly != "object") { + err("no native wasm support detected"); + } + var wasmMemory; + var ABORT = false; + var EXITSTATUS; + function assert(condition, text) { + if (!condition) { + abort("Assertion failed" + (text ? ": " + text : "")); + } + } + var HEAP, HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64; + function updateMemoryViews() { + var b = wasmMemory.buffer; + Module["HEAP8"] = HEAP8 = new Int8Array(b); + Module["HEAP16"] = HEAP16 = new Int16Array(b); + Module["HEAPU8"] = HEAPU8 = new Uint8Array(b); + Module["HEAPU16"] = HEAPU16 = new Uint16Array(b); + Module["HEAP32"] = HEAP32 = new Int32Array(b); + Module["HEAPU32"] = HEAPU32 = new Uint32Array(b); + Module["HEAPF32"] = HEAPF32 = new Float32Array(b); + Module["HEAPF64"] = HEAPF64 = new Float64Array(b); + } + assert(!Module["STACK_SIZE"], "STACK_SIZE can no longer be set at runtime. Use -sSTACK_SIZE at link time"); + assert( + typeof Int32Array != "undefined" && typeof Float64Array !== "undefined" && Int32Array.prototype.subarray != void 0 && Int32Array.prototype.set != void 0, + "JS engine does not provide full typed array support" + ); + assert(!Module["wasmMemory"], "Use of `wasmMemory` detected. Use -sIMPORTED_MEMORY to define wasmMemory externally"); + assert(!Module["INITIAL_MEMORY"], "Detected runtime INITIAL_MEMORY setting. Use -sIMPORTED_MEMORY to define wasmMemory dynamically"); + function writeStackCookie() { + var max = _emscripten_stack_get_end(); + assert((max & 3) == 0); + if (max == 0) { + max += 4; + } + HEAPU32[max >> 2] = 34821223; + HEAPU32[max + 4 >> 2] = 2310721022; + HEAPU32[0 >> 2] = 1668509029; + } + function checkStackCookie() { + if (ABORT) return; + var max = _emscripten_stack_get_end(); + if (max == 0) { + max += 4; + } + var cookie1 = HEAPU32[max >> 2]; + var cookie2 = HEAPU32[max + 4 >> 2]; + if (cookie1 != 34821223 || cookie2 != 2310721022) { + abort(`Stack overflow! Stack cookie has been overwritten at ${ptrToString(max)}, expected hex dwords 0x89BACDFE and 0x2135467, but received ${ptrToString(cookie2)} ${ptrToString(cookie1)}`); + } + if (HEAPU32[0 >> 2] != 1668509029) { + abort("Runtime error: The application has corrupted its heap memory area (address zero)!"); + } + } + (function() { + var h16 = new Int16Array(1); + var h8 = new Int8Array(h16.buffer); + h16[0] = 25459; + if (h8[0] !== 115 || h8[1] !== 99) throw "Runtime error: expected the system to be little-endian! (Run with -sSUPPORT_BIG_ENDIAN to bypass)"; + })(); + var __ATPRERUN__ = []; + var __ATINIT__ = []; + var __ATEXIT__ = []; + var __ATPOSTRUN__ = []; + var runtimeInitialized = false; + function preRun() { + if (Module["preRun"]) { + if (typeof Module["preRun"] == "function") Module["preRun"] = [Module["preRun"]]; + while (Module["preRun"].length) { + addOnPreRun(Module["preRun"].shift()); + } + } + callRuntimeCallbacks(__ATPRERUN__); + } + function initRuntime() { + assert(!runtimeInitialized); + runtimeInitialized = true; + checkStackCookie(); + callRuntimeCallbacks(__ATINIT__); + } + function postRun() { + checkStackCookie(); + if (Module["postRun"]) { + if (typeof Module["postRun"] == "function") Module["postRun"] = [Module["postRun"]]; + while (Module["postRun"].length) { + addOnPostRun(Module["postRun"].shift()); + } + } + callRuntimeCallbacks(__ATPOSTRUN__); + } + function addOnPreRun(cb) { + __ATPRERUN__.unshift(cb); + } + function addOnInit(cb) { + __ATINIT__.unshift(cb); + } + function addOnExit(cb) { + } + function addOnPostRun(cb) { + __ATPOSTRUN__.unshift(cb); + } + assert(Math.imul, "This browser does not support Math.imul(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill"); + assert(Math.fround, "This browser does not support Math.fround(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill"); + assert(Math.clz32, "This browser does not support Math.clz32(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill"); + assert(Math.trunc, "This browser does not support Math.trunc(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill"); + var runDependencies = 0; + var runDependencyWatcher = null; + var dependenciesFulfilled = null; + var runDependencyTracking = {}; + function getUniqueRunDependency(id) { + var orig = id; + while (1) { + if (!runDependencyTracking[id]) return id; + id = orig + Math.random(); + } + } + function addRunDependency(id) { + runDependencies++; + Module["monitorRunDependencies"]?.(runDependencies); + if (id) { + assert(!runDependencyTracking[id]); + runDependencyTracking[id] = 1; + if (runDependencyWatcher === null && typeof setInterval != "undefined") { + runDependencyWatcher = setInterval(() => { + if (ABORT) { + clearInterval(runDependencyWatcher); + runDependencyWatcher = null; + return; + } + var shown = false; + for (var dep in runDependencyTracking) { + if (!shown) { + shown = true; + err("still waiting on run dependencies:"); + } + err(`dependency: ${dep}`); + } + if (shown) { + err("(end of list)"); + } + }, 1e4); + } + } else { + err("warning: run dependency added without ID"); + } + } + function removeRunDependency(id) { + runDependencies--; + Module["monitorRunDependencies"]?.(runDependencies); + if (id) { + assert(runDependencyTracking[id]); + delete runDependencyTracking[id]; + } else { + err("warning: run dependency removed without ID"); + } + if (runDependencies == 0) { + if (runDependencyWatcher !== null) { + clearInterval(runDependencyWatcher); + runDependencyWatcher = null; + } + if (dependenciesFulfilled) { + var callback = dependenciesFulfilled; + dependenciesFulfilled = null; + callback(); + } + } + } + function abort(what) { + Module["onAbort"]?.(what); + what = "Aborted(" + what + ")"; + err(what); + ABORT = true; + EXITSTATUS = 1; + var e = new WebAssembly.RuntimeError(what); + readyPromiseReject(e); + throw e; + } + var FS = { + error() { + abort("Filesystem support (FS) was not included. The problem is that you are using files from JS, but files were not used from C/C++, so filesystem support was not auto-included. You can force-include filesystem support with -sFORCE_FILESYSTEM"); + }, + init() { + FS.error(); + }, + createDataFile() { + FS.error(); + }, + createPreloadedFile() { + FS.error(); + }, + createLazyFile() { + FS.error(); + }, + open() { + FS.error(); + }, + mkdev() { + FS.error(); + }, + registerDevice() { + FS.error(); + }, + analyzePath() { + FS.error(); + }, + ErrnoError() { + FS.error(); + } + }; + Module["FS_createDataFile"] = FS.createDataFile; + Module["FS_createPreloadedFile"] = FS.createPreloadedFile; + var dataURIPrefix = "data:application/octet-stream;base64,"; + var isDataURI = (filename) => filename.startsWith(dataURIPrefix); + var isFileURI = (filename) => filename.startsWith("file://"); + function createExportWrapper(name, nargs) { + return (...args) => { + assert(runtimeInitialized, `native function \`${name}\` called before runtime initialization`); + var f = wasmExports[name]; + assert(f, `exported native function \`${name}\` not found`); + assert(args.length <= nargs, `native function \`${name}\` called with ${args.length} args but expects ${nargs}`); + return f(...args); + }; + } + function findWasmBinary() { + if (Module["locateFile"]) { + var f = "bzip2.wasm"; + if (!isDataURI(f)) { + return locateFile(f); + } + return f; + } + return new URL("bzip2.wasm", import.meta.url).href; + } + var wasmBinaryFile; + function getBinarySync(file) { + if (file == wasmBinaryFile && wasmBinary) { + return new Uint8Array(wasmBinary); + } + if (readBinary) { + return readBinary(file); + } + throw "both async and sync fetching of the wasm failed"; + } + function getBinaryPromise(binaryFile) { + if (!wasmBinary && (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER)) { + if (typeof fetch == "function" && !isFileURI(binaryFile)) { + return fetch(binaryFile, { credentials: "same-origin" }).then((response) => { + if (!response["ok"]) { + throw `failed to load wasm binary file at '${binaryFile}'`; + } + return response["arrayBuffer"](); + }).catch(() => getBinarySync(binaryFile)); + } else if (readAsync) { + return new Promise((resolve, reject) => { + readAsync(binaryFile, (response) => resolve(new Uint8Array( + /** @type{!ArrayBuffer} */ + response + )), reject); + }); + } + } + return Promise.resolve().then(() => getBinarySync(binaryFile)); + } + function instantiateArrayBuffer(binaryFile, imports, receiver) { + return getBinaryPromise(binaryFile).then((binary) => { + return WebAssembly.instantiate(binary, imports); + }).then(receiver, (reason) => { + err(`failed to asynchronously prepare wasm: ${reason}`); + if (isFileURI(wasmBinaryFile)) { + err(`warning: Loading from a file URI (${wasmBinaryFile}) is not supported in most browsers. See https://emscripten.org/docs/getting_started/FAQ.html#how-do-i-run-a-local-webserver-for-testing-why-does-my-program-stall-in-downloading-or-preparing`); + } + abort(reason); + }); + } + function instantiateAsync(binary, binaryFile, imports, callback) { + if (!binary && typeof WebAssembly.instantiateStreaming == "function" && !isDataURI(binaryFile) && // Don't use streaming for file:// delivered objects in a webview, fetch them synchronously. + !isFileURI(binaryFile) && // Avoid instantiateStreaming() on Node.js environment for now, as while + // Node.js v18.1.0 implements it, it does not have a full fetch() + // implementation yet. + // + // Reference: + // https://github.com/emscripten-core/emscripten/pull/16917 + !ENVIRONMENT_IS_NODE && typeof fetch == "function") { + return fetch(binaryFile, { credentials: "same-origin" }).then((response) => { + var result = WebAssembly.instantiateStreaming(response, imports); + return result.then( + callback, + function(reason) { + err(`wasm streaming compile failed: ${reason}`); + err("falling back to ArrayBuffer instantiation"); + return instantiateArrayBuffer(binaryFile, imports, callback); + } + ); + }); + } + return instantiateArrayBuffer(binaryFile, imports, callback); + } + function getWasmImports() { + return { + "env": wasmImports, + "wasi_snapshot_preview1": wasmImports + }; + } + function createWasm() { + var info = getWasmImports(); + function receiveInstance(instance, module) { + wasmExports = instance.exports; + wasmMemory = wasmExports["memory"]; + assert(wasmMemory, "memory not found in wasm exports"); + updateMemoryViews(); + addOnInit(wasmExports["__wasm_call_ctors"]); + removeRunDependency("wasm-instantiate"); + return wasmExports; + } + addRunDependency("wasm-instantiate"); + var trueModule = Module; + function receiveInstantiationResult(result) { + assert(Module === trueModule, "the Module object should not be replaced during async compilation - perhaps the order of HTML elements is wrong?"); + trueModule = null; + receiveInstance(result["instance"]); + } + if (Module["instantiateWasm"]) { + try { + return Module["instantiateWasm"](info, receiveInstance); + } catch (e) { + err(`Module.instantiateWasm callback failed with error: ${e}`); + readyPromiseReject(e); + } + } + if (!wasmBinaryFile) wasmBinaryFile = findWasmBinary(); + instantiateAsync(wasmBinary, wasmBinaryFile, info, receiveInstantiationResult).catch(readyPromiseReject); + return {}; + } + var tempDouble; + var tempI64; + function legacyModuleProp(prop, newName, incoming = true) { + if (!Object.getOwnPropertyDescriptor(Module, prop)) { + Object.defineProperty(Module, prop, { + configurable: true, + get() { + let extra = incoming ? " (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)" : ""; + abort(`\`Module.${prop}\` has been replaced by \`${newName}\`` + extra); + } + }); + } + } + function ignoredModuleProp(prop) { + if (Object.getOwnPropertyDescriptor(Module, prop)) { + abort(`\`Module.${prop}\` was supplied but \`${prop}\` not included in INCOMING_MODULE_JS_API`); + } + } + function isExportedByForceFilesystem(name) { + return name === "FS_createPath" || name === "FS_createDataFile" || name === "FS_createPreloadedFile" || name === "FS_unlink" || name === "addRunDependency" || // The old FS has some functionality that WasmFS lacks. + name === "FS_createLazyFile" || name === "FS_createDevice" || name === "removeRunDependency"; + } + function missingGlobal(sym, msg) { + if (typeof globalThis != "undefined") { + Object.defineProperty(globalThis, sym, { + configurable: true, + get() { + warnOnce(`\`${sym}\` is not longer defined by emscripten. ${msg}`); + return void 0; + } + }); + } + } + missingGlobal("buffer", "Please use HEAP8.buffer or wasmMemory.buffer"); + missingGlobal("asm", "Please use wasmExports instead"); + function missingLibrarySymbol(sym) { + if (typeof globalThis != "undefined" && !Object.getOwnPropertyDescriptor(globalThis, sym)) { + Object.defineProperty(globalThis, sym, { + configurable: true, + get() { + var msg = `\`${sym}\` is a library symbol and not included by default; add it to your library.js __deps or to DEFAULT_LIBRARY_FUNCS_TO_INCLUDE on the command line`; + var librarySymbol = sym; + if (!librarySymbol.startsWith("_")) { + librarySymbol = "$" + sym; + } + msg += ` (e.g. -sDEFAULT_LIBRARY_FUNCS_TO_INCLUDE='${librarySymbol}')`; + if (isExportedByForceFilesystem(sym)) { + msg += ". Alternatively, forcing filesystem support (-sFORCE_FILESYSTEM) can export this for you"; + } + warnOnce(msg); + return void 0; + } + }); + } + unexportedRuntimeSymbol(sym); + } + function unexportedRuntimeSymbol(sym) { + if (!Object.getOwnPropertyDescriptor(Module, sym)) { + Object.defineProperty(Module, sym, { + configurable: true, + get() { + var msg = `'${sym}' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the Emscripten FAQ)`; + if (isExportedByForceFilesystem(sym)) { + msg += ". Alternatively, forcing filesystem support (-sFORCE_FILESYSTEM) can export this for you"; + } + abort(msg); + } + }); + } + } + function dbg(...args) { + console.warn(...args); + } + function ExitStatus(status) { + this.name = "ExitStatus"; + this.message = `Program terminated with exit(${status})`; + this.status = status; + } + var callRuntimeCallbacks = (callbacks) => { + while (callbacks.length > 0) { + callbacks.shift()(Module); + } + }; + function getValue(ptr, type = "i8") { + if (type.endsWith("*")) type = "*"; + switch (type) { + case "i1": + return HEAP8[ptr]; + case "i8": + return HEAP8[ptr]; + case "i16": + return HEAP16[ptr >> 1]; + case "i32": + return HEAP32[ptr >> 2]; + case "i64": + abort("to do getValue(i64) use WASM_BIGINT"); + case "float": + return HEAPF32[ptr >> 2]; + case "double": + return HEAPF64[ptr >> 3]; + case "*": + return HEAPU32[ptr >> 2]; + default: + abort(`invalid type for getValue: ${type}`); + } + } + var noExitRuntime = Module["noExitRuntime"] || true; + var ptrToString = (ptr) => { + assert(typeof ptr === "number"); + ptr >>>= 0; + return "0x" + ptr.toString(16).padStart(8, "0"); + }; + function setValue(ptr, value, type = "i8") { + if (type.endsWith("*")) type = "*"; + switch (type) { + case "i1": + HEAP8[ptr] = value; + break; + case "i8": + HEAP8[ptr] = value; + break; + case "i16": + HEAP16[ptr >> 1] = value; + break; + case "i32": + HEAP32[ptr >> 2] = value; + break; + case "i64": + abort("to do setValue(i64) use WASM_BIGINT"); + case "float": + HEAPF32[ptr >> 2] = value; + break; + case "double": + HEAPF64[ptr >> 3] = value; + break; + case "*": + HEAPU32[ptr >> 2] = value; + break; + default: + abort(`invalid type for setValue: ${type}`); + } + } + var stackRestore = (val) => __emscripten_stack_restore(val); + var stackSave = () => _emscripten_stack_get_current(); + var warnOnce = (text) => { + warnOnce.shown ||= {}; + if (!warnOnce.shown[text]) { + warnOnce.shown[text] = 1; + if (ENVIRONMENT_IS_NODE) text = "warning: " + text; + err(text); + } + }; + var __emscripten_memcpy_js = (dest, src, num) => HEAPU8.copyWithin(dest, src, src + num); + var getHeapMax = () => ( + // Stay one Wasm page short of 4GB: while e.g. Chrome is able to allocate + // full 4GB Wasm memories, the size will wrap back to 0 bytes in Wasm side + // for any code that deals with heap sizes, which would require special + // casing all heap size related code to treat 0 specially. + 2147483648 + ); + var growMemory = (size) => { + var b = wasmMemory.buffer; + var pages = (size - b.byteLength + 65535) / 65536; + try { + wasmMemory.grow(pages); + updateMemoryViews(); + return 1; + } catch (e) { + err(`growMemory: Attempted to grow heap from ${b.byteLength} bytes to ${size} bytes, but got error: ${e}`); + } + }; + var _emscripten_resize_heap = (requestedSize) => { + var oldSize = HEAPU8.length; + requestedSize >>>= 0; + assert(requestedSize > oldSize); + var maxHeapSize = getHeapMax(); + if (requestedSize > maxHeapSize) { + err(`Cannot enlarge memory, requested ${requestedSize} bytes, but the limit is ${maxHeapSize} bytes!`); + return false; + } + var alignUp = (x, multiple) => x + (multiple - x % multiple) % multiple; + for (var cutDown = 1; cutDown <= 4; cutDown *= 2) { + var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown); + overGrownHeapSize = Math.min(overGrownHeapSize, requestedSize + 100663296); + var newSize = Math.min(maxHeapSize, alignUp(Math.max(requestedSize, overGrownHeapSize), 65536)); + var replacement = growMemory(newSize); + if (replacement) { + return true; + } + } + err(`Failed to grow the heap from ${oldSize} bytes to ${newSize} bytes, not enough memory!`); + return false; + }; + var runtimeKeepaliveCounter = 0; + var keepRuntimeAlive = () => noExitRuntime || runtimeKeepaliveCounter > 0; + var _proc_exit = (code) => { + EXITSTATUS = code; + if (!keepRuntimeAlive()) { + Module["onExit"]?.(code); + ABORT = true; + } + quit_(code, new ExitStatus(code)); + }; + var exitJS = (status, implicit) => { + EXITSTATUS = status; + checkUnflushedContent(); + if (keepRuntimeAlive() && !implicit) { + var msg = `program exited (with status: ${status}), but keepRuntimeAlive() is set (counter=${runtimeKeepaliveCounter}) due to an async operation, so halting execution but not exiting the runtime or preventing further async execution (you can use emscripten_force_exit, if you want to force a true shutdown)`; + readyPromiseReject(msg); + err(msg); + } + _proc_exit(status); + }; + var _exit = exitJS; + var UTF8Decoder = typeof TextDecoder != "undefined" ? new TextDecoder("utf8") : void 0; + var UTF8ArrayToString = (heapOrArray, idx, maxBytesToRead) => { + var endIdx = idx + maxBytesToRead; + var endPtr = idx; + while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr; + if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) { + return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr)); + } + var str = ""; + while (idx < endPtr) { + var u0 = heapOrArray[idx++]; + if (!(u0 & 128)) { + str += String.fromCharCode(u0); + continue; + } + var u1 = heapOrArray[idx++] & 63; + if ((u0 & 224) == 192) { + str += String.fromCharCode((u0 & 31) << 6 | u1); + continue; + } + var u2 = heapOrArray[idx++] & 63; + if ((u0 & 240) == 224) { + u0 = (u0 & 15) << 12 | u1 << 6 | u2; + } else { + if ((u0 & 248) != 240) warnOnce("Invalid UTF-8 leading byte " + ptrToString(u0) + " encountered when deserializing a UTF-8 string in wasm memory to a JS string!"); + u0 = (u0 & 7) << 18 | u1 << 12 | u2 << 6 | heapOrArray[idx++] & 63; + } + if (u0 < 65536) { + str += String.fromCharCode(u0); + } else { + var ch = u0 - 65536; + str += String.fromCharCode(55296 | ch >> 10, 56320 | ch & 1023); + } + } + return str; + }; + var UTF8ToString = (ptr, maxBytesToRead) => { + assert(typeof ptr == "number", `UTF8ToString expects a number (got ${typeof ptr})`); + return ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ""; + }; + var SYSCALLS = { + varargs: void 0, + getStr(ptr) { + var ret = UTF8ToString(ptr); + return ret; + } + }; + var _fd_close = (fd) => { + abort("fd_close called without SYSCALLS_REQUIRE_FILESYSTEM"); + }; + var convertI32PairToI53Checked = (lo, hi) => { + assert(lo == lo >>> 0 || lo == (lo | 0)); + assert(hi === (hi | 0)); + return hi + 2097152 >>> 0 < 4194305 - !!lo ? (lo >>> 0) + hi * 4294967296 : NaN; + }; + function _fd_seek(fd, offset_low, offset_high, whence, newOffset) { + var offset = convertI32PairToI53Checked(offset_low, offset_high); + return 70; + ; + } + var printCharBuffers = [null, [], []]; + var printChar = (stream, curr) => { + var buffer = printCharBuffers[stream]; + assert(buffer); + if (curr === 0 || curr === 10) { + (stream === 1 ? out : err)(UTF8ArrayToString(buffer, 0)); + buffer.length = 0; + } else { + buffer.push(curr); + } + }; + var flush_NO_FILESYSTEM = () => { + _fflush(0); + if (printCharBuffers[1].length) printChar(1, 10); + if (printCharBuffers[2].length) printChar(2, 10); + }; + var _fd_write = (fd, iov, iovcnt, pnum) => { + var num = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAPU32[iov >> 2]; + var len = HEAPU32[iov + 4 >> 2]; + iov += 8; + for (var j = 0; j < len; j++) { + printChar(fd, HEAPU8[ptr + j]); + } + num += len; + } + HEAPU32[pnum >> 2] = num; + return 0; + }; + function checkIncomingModuleAPI() { + ignoredModuleProp("fetchSettings"); + } + var wasmImports = { + /** @export */ + _emscripten_memcpy_js: __emscripten_memcpy_js, + /** @export */ + emscripten_resize_heap: _emscripten_resize_heap, + /** @export */ + exit: _exit, + /** @export */ + fd_close: _fd_close, + /** @export */ + fd_seek: _fd_seek, + /** @export */ + fd_write: _fd_write + }; + var wasmExports = createWasm(); + var ___wasm_call_ctors = createExportWrapper("__wasm_call_ctors", 0); + var _malloc = Module["_malloc"] = createExportWrapper("malloc", 1); + var _free = Module["_free"] = createExportWrapper("free", 1); + var _fflush = createExportWrapper("fflush", 1); + var _BZ2_bzBuffToBuffCompress = Module["_BZ2_bzBuffToBuffCompress"] = createExportWrapper("BZ2_bzBuffToBuffCompress", 7); + var _BZ2_bzBuffToBuffDecompress = Module["_BZ2_bzBuffToBuffDecompress"] = createExportWrapper("BZ2_bzBuffToBuffDecompress", 6); + var _emscripten_stack_init = () => (_emscripten_stack_init = wasmExports["emscripten_stack_init"])(); + var _emscripten_stack_get_free = () => (_emscripten_stack_get_free = wasmExports["emscripten_stack_get_free"])(); + var _emscripten_stack_get_base = () => (_emscripten_stack_get_base = wasmExports["emscripten_stack_get_base"])(); + var _emscripten_stack_get_end = () => (_emscripten_stack_get_end = wasmExports["emscripten_stack_get_end"])(); + var __emscripten_stack_restore = (a0) => (__emscripten_stack_restore = wasmExports["_emscripten_stack_restore"])(a0); + var __emscripten_stack_alloc = (a0) => (__emscripten_stack_alloc = wasmExports["_emscripten_stack_alloc"])(a0); + var _emscripten_stack_get_current = () => (_emscripten_stack_get_current = wasmExports["emscripten_stack_get_current"])(); + var dynCall_jiji = Module["dynCall_jiji"] = createExportWrapper("dynCall_jiji", 5); + Module["setValue"] = setValue; + Module["getValue"] = getValue; + var missingLibrarySymbols = [ + "writeI53ToI64", + "writeI53ToI64Clamped", + "writeI53ToI64Signaling", + "writeI53ToU64Clamped", + "writeI53ToU64Signaling", + "readI53FromI64", + "readI53FromU64", + "convertI32PairToI53", + "convertU32PairToI53", + "stackAlloc", + "getTempRet0", + "setTempRet0", + "zeroMemory", + "isLeapYear", + "ydayFromDate", + "arraySum", + "addDays", + "inetPton4", + "inetNtop4", + "inetPton6", + "inetNtop6", + "readSockaddr", + "writeSockaddr", + "initRandomFill", + "randomFill", + "emscriptenLog", + "readEmAsmArgs", + "jstoi_q", + "getExecutableName", + "listenOnce", + "autoResumeAudioContext", + "dynCallLegacy", + "getDynCaller", + "dynCall", + "handleException", + "runtimeKeepalivePush", + "runtimeKeepalivePop", + "callUserCallback", + "maybeExit", + "asmjsMangle", + "asyncLoad", + "alignMemory", + "mmapAlloc", + "HandleAllocator", + "getNativeTypeSize", + "STACK_SIZE", + "STACK_ALIGN", + "POINTER_SIZE", + "ASSERTIONS", + "getCFunc", + "ccall", + "cwrap", + "uleb128Encode", + "sigToWasmTypes", + "generateFuncType", + "convertJsFunctionToWasm", + "getEmptyTableSlot", + "updateTableMap", + "getFunctionAddress", + "addFunction", + "removeFunction", + "reallyNegative", + "unSign", + "strLen", + "reSign", + "formatString", + "stringToUTF8Array", + "stringToUTF8", + "lengthBytesUTF8", + "intArrayFromString", + "intArrayToString", + "AsciiToString", + "stringToAscii", + "UTF16ToString", + "stringToUTF16", + "lengthBytesUTF16", + "UTF32ToString", + "stringToUTF32", + "lengthBytesUTF32", + "stringToNewUTF8", + "stringToUTF8OnStack", + "writeArrayToMemory", + "registerKeyEventCallback", + "maybeCStringToJsString", + "findEventTarget", + "getBoundingClientRect", + "fillMouseEventData", + "registerMouseEventCallback", + "registerWheelEventCallback", + "registerUiEventCallback", + "registerFocusEventCallback", + "fillDeviceOrientationEventData", + "registerDeviceOrientationEventCallback", + "fillDeviceMotionEventData", + "registerDeviceMotionEventCallback", + "screenOrientation", + "fillOrientationChangeEventData", + "registerOrientationChangeEventCallback", + "fillFullscreenChangeEventData", + "registerFullscreenChangeEventCallback", + "JSEvents_requestFullscreen", + "JSEvents_resizeCanvasForFullscreen", + "registerRestoreOldStyle", + "hideEverythingExceptGivenElement", + "restoreHiddenElements", + "setLetterbox", + "softFullscreenResizeWebGLRenderTarget", + "doRequestFullscreen", + "fillPointerlockChangeEventData", + "registerPointerlockChangeEventCallback", + "registerPointerlockErrorEventCallback", + "requestPointerLock", + "fillVisibilityChangeEventData", + "registerVisibilityChangeEventCallback", + "registerTouchEventCallback", + "fillGamepadEventData", + "registerGamepadEventCallback", + "registerBeforeUnloadEventCallback", + "fillBatteryEventData", + "battery", + "registerBatteryEventCallback", + "setCanvasElementSize", + "getCanvasElementSize", + "jsStackTrace", + "getCallstack", + "convertPCtoSourceLocation", + "getEnvStrings", + "checkWasiClock", + "wasiRightsToMuslOFlags", + "wasiOFlagsToMuslOFlags", + "createDyncallWrapper", + "safeSetTimeout", + "setImmediateWrapped", + "clearImmediateWrapped", + "polyfillSetImmediate", + "getPromise", + "makePromise", + "idsToPromises", + "makePromiseCallback", + "ExceptionInfo", + "findMatchingCatch", + "Browser_asyncPrepareDataCounter", + "setMainLoop", + "getSocketFromFD", + "getSocketAddress", + "FS_createPreloadedFile", + "FS_modeStringToFlags", + "FS_getMode", + "FS_stdin_getChar", + "FS_createDataFile", + "FS_unlink", + "FS_mkdirTree", + "_setNetworkCallback", + "heapObjectForWebGLType", + "toTypedArrayIndex", + "webgl_enable_ANGLE_instanced_arrays", + "webgl_enable_OES_vertex_array_object", + "webgl_enable_WEBGL_draw_buffers", + "webgl_enable_WEBGL_multi_draw", + "emscriptenWebGLGet", + "computeUnpackAlignedImageSize", + "colorChannelsInGlTextureFormat", + "emscriptenWebGLGetTexPixelData", + "emscriptenWebGLGetUniform", + "webglGetUniformLocation", + "webglPrepareUniformLocationsBeforeFirstUse", + "webglGetLeftBracePos", + "emscriptenWebGLGetVertexAttrib", + "__glGetActiveAttribOrUniform", + "writeGLArray", + "registerWebGlEventCallback", + "runAndAbortIfError", + "ALLOC_NORMAL", + "ALLOC_STACK", + "allocate", + "writeStringToMemory", + "writeAsciiToMemory", + "setErrNo", + "demangle", + "stackTrace" + ]; + missingLibrarySymbols.forEach(missingLibrarySymbol); + var unexportedSymbols = [ + "run", + "addOnPreRun", + "addOnInit", + "addOnPreMain", + "addOnExit", + "addOnPostRun", + "addRunDependency", + "removeRunDependency", + "FS_createFolder", + "FS_createPath", + "FS_createLazyFile", + "FS_createLink", + "FS_createDevice", + "FS_readFile", + "out", + "err", + "callMain", + "abort", + "wasmMemory", + "wasmExports", + "writeStackCookie", + "checkStackCookie", + "convertI32PairToI53Checked", + "stackSave", + "stackRestore", + "ptrToString", + "exitJS", + "getHeapMax", + "growMemory", + "ENV", + "MONTH_DAYS_REGULAR", + "MONTH_DAYS_LEAP", + "MONTH_DAYS_REGULAR_CUMULATIVE", + "MONTH_DAYS_LEAP_CUMULATIVE", + "ERRNO_CODES", + "ERRNO_MESSAGES", + "DNS", + "Protocols", + "Sockets", + "timers", + "warnOnce", + "readEmAsmArgsArray", + "jstoi_s", + "keepRuntimeAlive", + "wasmTable", + "noExitRuntime", + "freeTableIndexes", + "functionsInTableMap", + "PATH", + "PATH_FS", + "UTF8Decoder", + "UTF8ArrayToString", + "UTF8ToString", + "UTF16Decoder", + "JSEvents", + "specialHTMLTargets", + "findCanvasEventTarget", + "currentFullscreenStrategy", + "restoreOldWindowedStyle", + "UNWIND_CACHE", + "ExitStatus", + "flush_NO_FILESYSTEM", + "promiseMap", + "uncaughtExceptionCount", + "exceptionLast", + "exceptionCaught", + "Browser", + "getPreloadedImageData__data", + "wget", + "SYSCALLS", + "preloadPlugins", + "FS_stdin_getChar_buffer", + "FS", + "MEMFS", + "TTY", + "PIPEFS", + "SOCKFS", + "tempFixedLengthArray", + "miniTempWebGLFloatBuffers", + "miniTempWebGLIntBuffers", + "GL", + "AL", + "GLUT", + "EGL", + "GLEW", + "IDBStore", + "SDL", + "SDL_gfx", + "allocateUTF8", + "allocateUTF8OnStack" + ]; + unexportedSymbols.forEach(unexportedRuntimeSymbol); + var calledRun; + dependenciesFulfilled = function runCaller() { + if (!calledRun) run(); + if (!calledRun) dependenciesFulfilled = runCaller; + }; + function stackCheckInit() { + _emscripten_stack_init(); + writeStackCookie(); + } + function run() { + if (runDependencies > 0) { + return; + } + stackCheckInit(); + preRun(); + if (runDependencies > 0) { + return; + } + function doRun() { + if (calledRun) return; + calledRun = true; + Module["calledRun"] = true; + if (ABORT) return; + initRuntime(); + readyPromiseResolve(Module); + if (Module["onRuntimeInitialized"]) Module["onRuntimeInitialized"](); + assert(!Module["_main"], 'compiled without a main, but one is present. if you added it from JS, use Module["onRuntimeInitialized"]'); + postRun(); + } + if (Module["setStatus"]) { + Module["setStatus"]("Running..."); + setTimeout(function() { + setTimeout(function() { + Module["setStatus"](""); + }, 1); + doRun(); + }, 1); + } else { + doRun(); + } + checkStackCookie(); + } + function checkUnflushedContent() { + var oldOut = out; + var oldErr = err; + var has = false; + out = err = (x) => { + has = true; + }; + try { + flush_NO_FILESYSTEM(); + } catch (e) { + } + out = oldOut; + err = oldErr; + if (has) { + warnOnce("stdio streams had content in them that was not flushed. you should set EXIT_RUNTIME to 1 (see the Emscripten FAQ), or make sure to emit a newline when you printf etc."); + warnOnce("(this may also be due to not including full filesystem support - try building with -sFORCE_FILESYSTEM)"); + } + } + if (Module["preInit"]) { + if (typeof Module["preInit"] == "function") Module["preInit"] = [Module["preInit"]]; + while (Module["preInit"].length > 0) { + Module["preInit"].pop()(); + } + } + run(); + moduleRtn = readyPromise; + for (const prop of Object.keys(Module)) { + if (!(prop in moduleArg)) { + Object.defineProperty(moduleArg, prop, { + configurable: true, + get() { + abort(`Access to module property ('${prop}') is no longer possible via the module constructor argument; Instead, use the result of the module constructor.`); + } + }); + } + } + return moduleRtn; + }; +})(); +var bzip2_default = loadBZip2WASM; + +// src/3rdparty/bzip2-wasm/bzip2-wasm.js +var ERROR_MESSAGES = { + "-2": "BZ_PARAM_ERROR: incorrect parameters", + "-3": "BZ_MEM_ERROR: couldn't allocate enough memory", + "-4": "BZ_DATA_ERROR: data integrity error when decompressing", + "-5": "BZ_DATA_ERROR_MAGIC: compressed data has incorrect header", + "-7": "BZ_UNEXPECTED_EOF: compressed data ends too early", + "-8": "BZ_OUTBUFF_FULL: destination buffer is full" +}; +var BZip2 = class { + constructor() { + this.wasmModule = void 0; + } + // fetch the wasm and initialize it + async init() { + if (this.wasmModule) { + return; + } + if (typeof process !== "undefined") { + const { dirname } = await import("path"); + const { createRequire } = await import( + /* webpackIgnore: true */ + "module" + ); + globalThis.__dirname = dirname(import.meta.url); + globalThis.require = createRequire(import.meta.url); + } + this.wasmModule = await bzip2_default(); + } + ensureInitialized() { + if (!this.wasmModule) { + throw new Error( + `${this.constructor.name} not initalized. call .init()` + ); + } + } + // turn bzip's integer return values into an error message and throw it. + // also free the destination pointers + handleError(returnValue, destPtr, destLengthPtr) { + if (returnValue === 0) { + return; + } + this.wasmModule._free(destPtr); + this.wasmModule._free(destLengthPtr); + const errorMessage = ERROR_MESSAGES[returnValue]; + if (errorMessage) { + throw new Error(errorMessage); + } + throw new Error(`error code: ${returnValue}`); + } + // create source, destination and length buffers + createWASMBuffers(source, destLength) { + const { _malloc, setValue, HEAPU8 } = this.wasmModule; + const sourcePtr = _malloc(source.length); + HEAPU8.set(source, sourcePtr); + const destPtr = _malloc(destLength); + const destLengthPtr = _malloc(destLength); + setValue(destLengthPtr, destLength, "i32"); + return { sourcePtr, destPtr, destLengthPtr }; + } + // read the length returned by bzip, create a new Uint8Array of that size + // and copy the decompressed/compressed data into it + createBuffer(destPtr, destLengthPtr) { + const { _free, getValue, HEAPU8 } = this.wasmModule; + const destLength = getValue(destLengthPtr, "i32"); + const dest = new Uint8Array(destLength); + dest.set(HEAPU8.subarray(destPtr, destPtr + destLength)); + _free(destPtr); + _free(destLengthPtr); + return dest; + } + decompress(compressed, decompressedLength, prependHeader = false, containsDecompressedLength = false) { + if (containsDecompressedLength) { + decompressedLength = compressed[0] << 24 | compressed[1] << 16 | compressed[2] << 8 | compressed[3]; + compressed[0] = "B".charCodeAt(0); + compressed[1] = "Z".charCodeAt(0); + compressed[2] = "h".charCodeAt(0); + compressed[3] = "1".charCodeAt(0); + prependHeader = false; + } + if (prependHeader) { + const temp = new Uint8Array(compressed.length + 4); + temp[0] = "B".charCodeAt(0); + temp[1] = "Z".charCodeAt(0); + temp[2] = "h".charCodeAt(0); + temp[3] = "1".charCodeAt(0); + temp.set(compressed, 4); + compressed = temp; + } + this.ensureInitialized(); + const { + sourcePtr: compressedPtr, + destPtr: decompressedPtr, + destLengthPtr: decompressedLengthPtr + } = this.createWASMBuffers(compressed, decompressedLength); + const returnValue = this.wasmModule._BZ2_bzBuffToBuffDecompress( + decompressedPtr, + decompressedLengthPtr, + compressedPtr, + compressed.length, + 0, + 0 + ); + this.wasmModule._free(compressedPtr); + this.handleError(returnValue, decompressedPtr, decompressedLengthPtr); + return this.createBuffer(decompressedPtr, decompressedLengthPtr); + } + compress(decompressed, prefixLength = false, removeHeader = false, blockSize = 1, compressedLength = 0) { + this.ensureInitialized(); + if (!compressedLength) { + compressedLength = decompressed.length + 1024; + } + if (compressedLength < 128) { + compressedLength = 128; + } + if (blockSize <= 0 || blockSize > 9) { + throw new RangeError("blockSize should be between 1-9"); + } + const { + sourcePtr: decompressedPtr, + destPtr: compressedPtr, + destLengthPtr: compressedLengthPtr + } = this.createWASMBuffers(decompressed, compressedLength); + const returnValue = this.wasmModule._BZ2_bzBuffToBuffCompress( + compressedPtr, + compressedLengthPtr, + decompressedPtr, + decompressed.length, + blockSize, + 0, + 30 + ); + this.wasmModule._free(decompressedPtr); + this.handleError(returnValue, compressedPtr, compressedLengthPtr); + const buf = this.createBuffer(compressedPtr, compressedLengthPtr); + if (prefixLength) { + buf[0] = decompressed.length >> 24 & 255; + buf[1] = decompressed.length >> 16 & 255; + buf[2] = decompressed.length >> 8 & 255; + buf[3] = decompressed.length & 255; + } + if (removeHeader) { + return buf.subarray(4); + } + return buf; + } +}; +var bzip2_wasm_default = BZip2; + +// src/jagex2/io/BZip2.ts +var bzip2 = new bzip2_wasm_default(); +await bzip2.init(); +var BZip2_default = bzip2; + +// src/jagex2/io/Jagfile.ts +function genHash(name) { + let hash = 0; + name = name.toUpperCase(); + for (let i = 0; i < name.length; i++) { + hash = hash * 61 + name.charCodeAt(i) - 32 | 0; + } + return hash; +} +var Jagfile = class _Jagfile { + data = null; + fileCount = 0; + fileHash = []; + fileName = []; + fileUnpackedSize = []; + filePackedSize = []; + filePos = []; + unpacked = false; + fileQueue = []; + fileWrite = []; + static load(path4) { + return new _Jagfile(Packet.load(path4)); + } + static async loadAsync(path4) { + return new _Jagfile(await Packet.loadAsync(path4)); + } + constructor(src) { + if (!src) { + return; + } + const unpackedSize = src.g3(); + const packedSize = src.g3(); + if (unpackedSize === packedSize) { + this.data = new Uint8Array(src.data); + this.unpacked = false; + } else { + this.data = BZip2_default.decompress(src.data, unpackedSize, true); + src = new Packet(this.data); + this.unpacked = true; + } + this.fileCount = src.g2(); + let pos = src.pos + this.fileCount * 10; + for (let i = 0; i < this.fileCount; i++) { + this.fileHash[i] = src.g4(); + const hashMatch = KNOWN_HASHES.findIndex((x) => x === this.fileHash[i]); + if (hashMatch !== -1) { + this.fileName[i] = KNOWN_NAMES[hashMatch]; + } + this.fileUnpackedSize[i] = src.g3(); + this.filePackedSize[i] = src.g3(); + this.filePos[i] = pos; + pos += this.filePackedSize[i]; + } + } + get(index) { + if (index < 0 || index >= this.fileCount) { + return null; + } + if (this.data === null) { + throw new Error("Jagfile data is not loaded"); + } + const src = this.data.subarray(this.filePos[index], this.filePos[index] + this.filePackedSize[index]); + if (this.unpacked) { + return new Packet(src); + } else { + return new Packet(BZip2_default.decompress(src, this.fileUnpackedSize[index], true)); + } + } + read(name) { + const hash = genHash(name); + for (let i = 0; i < this.fileCount; i++) { + if (this.fileHash[i] === hash) { + return this.get(i); + } + } + return null; + } + write(name, data) { + const hash = genHash(name); + this.fileQueue.push({ hash, name, write: true, data: data.data.subarray(0, data.pos) }); + } + delete(name) { + const hash = genHash(name); + this.fileQueue.push({ hash, name, delete: true }); + } + rename(oldName, newName) { + const oldHash = genHash(oldName); + const newHash = genHash(newName); + this.fileQueue.push({ + hash: oldHash, + name: oldName, + rename: true, + newName, + newHash + }); + } + save(path4, doNotCompressWhole = false) { + let buf = Packet.alloc(5); + for (let i = 0; i < this.fileQueue.length; i++) { + const queued = this.fileQueue[i]; + let index = this.fileHash.findIndex((x) => x === queued.hash); + if (queued.write) { + if (index === -1) { + index = this.fileCount++; + this.fileHash[index] = queued.hash; + this.fileName[index] = queued.name; + } + if (!queued.data) { + throw new Error("Cannot write without data"); + } + this.fileUnpackedSize[index] = queued.data.length; + this.filePackedSize[index] = queued.data.length; + this.filePos[index] = -1; + this.fileWrite[index] = queued.data; + } + if (queued.delete && index !== -1) { + this.fileHash.splice(index, 1); + this.fileName.splice(index, 1); + this.fileUnpackedSize.splice(index, 1); + this.filePackedSize.splice(index, 1); + this.filePos.splice(index, 1); + this.fileCount--; + } + if (queued.rename && index !== -1) { + if (!queued.newHash) { + throw new Error("Cannot rename without newHash"); + } + if (!queued.newName) { + throw new Error("Cannot rename without newName"); + } + this.fileHash[index] = queued.newHash; + this.fileName[index] = queued.newName; + } + this.fileQueue.splice(i, 1); + i--; + } + let compressWhole = this.fileCount === 1; + if (doNotCompressWhole && compressWhole) { + compressWhole = false; + } + buf.p2(this.fileCount); + for (let i = 0; i < this.fileCount; i++) { + buf.p4(this.fileHash[i]); + buf.p3(this.fileUnpackedSize[i]); + if (this.fileWrite[i] && !compressWhole) { + this.fileWrite[i] = BZip2_default.compress(this.fileWrite[i], false, true); + this.filePackedSize[i] = this.fileWrite[i].length; + } + buf.p3(this.filePackedSize[i]); + } + for (let i = 0; i < this.fileCount; i++) { + const data = this.fileWrite[i]; + buf.pdata(data, 0, data.length); + } + const jag = Packet.alloc(5); + jag.p3(buf.pos); + if (compressWhole) { + buf = new Packet(BZip2_default.compress(buf.data, false, true)); + } + if (compressWhole) { + jag.p3(buf.data.length); + jag.pdata(buf.data, 0, buf.data.length); + } else { + jag.p3(buf.pos); + jag.pdata(buf.data, 0, buf.pos); + } + jag.save(path4); + buf.release(); + jag.release(); + } + deconstruct(name) { + const dat = this.read(name + ".dat"); + const idx = this.read(name + ".idx"); + if (dat === null || idx === null) { + throw new Error("Failed to read dat or idx"); + } + const count = idx.g2(); + const sizes = new Array(count); + const offsets = new Array(count); + let offset = 2; + for (let i = 0; i < count; i++) { + sizes[i] = idx.g2(); + offsets[i] = offset; + offset += sizes[i]; + } + const checksums = new Array(count); + for (let i = 0; i < count; i++) { + dat.pos = offsets[i]; + checksums[i] = Packet.getcrc(dat.data, offset, sizes[i]); + } + return { count, sizes, offsets, checksums }; + } +}; +var KNOWN_NAMES = [ + // title + "index.dat", + "logo.dat", + "p11.dat", + "p12.dat", + "b12.dat", + "q8.dat", + "runes.dat", + "title.dat", + "titlebox.dat", + "titlebutton.dat", + // seen in 274 + "p11_full.dat", + "p12_full.dat", + "b12_full.dat", + "q8_full.dat", + // config + "flo.dat", + "flo.idx", + "idk.dat", + "idk.idx", + "loc.dat", + "loc.idx", + "npc.dat", + "npc.idx", + "obj.dat", + "obj.idx", + "seq.dat", + "seq.idx", + "spotanim.dat", + "spotanim.idx", + "varp.dat", + "varp.idx", + // seen in 254 + "varbit.dat", + "varbit.idx", + // seen in 274 + "mesanim.dat", + "mesanim.idx", + "mes.dat", + "mes.idx", + "param.dat", + "param.idx", + "hunt.dat", + "hunt.idx", + // interface + "data", + // media + "backbase1.dat", + "backbase2.dat", + "backhmid1.dat", + "backhmid2.dat", + "backleft1.dat", + "backleft2.dat", + "backright1.dat", + "backright2.dat", + "backtop1.dat", + "backtop2.dat", + "backvmid1.dat", + "backvmid2.dat", + "backvmid3.dat", + "chatback.dat", + "combatboxes.dat", + "combaticons.dat", + "combaticons2.dat", + "combaticons3.dat", + "compass.dat", + "cross.dat", + "gnomeball_buttons.dat", + "headicons.dat", + "hitmarks.dat", + // index.dat + "invback.dat", + "leftarrow.dat", + "magicoff.dat", + "magicoff2.dat", + "magicon.dat", + "magicon2.dat", + "mapback.dat", + "mapdots.dat", + "mapflag.dat", + "mapfunction.dat", + "mapscene.dat", + "miscgraphics.dat", + "miscgraphics2.dat", + "miscgraphics3.dat", + "prayerglow.dat", + "prayeroff.dat", + "prayeron.dat", + "redstone1.dat", + "redstone2.dat", + "redstone3.dat", + "rightarrow.dat", + "scrollbar.dat", + "sideicons.dat", + "staticons.dat", + "staticons2.dat", + "steelborder.dat", + "steelborder2.dat", + "sworddecor.dat", + "tradebacking.dat", + "wornicons.dat", + // seen in 254 + "mapmarker.dat", + "mod_icons.dat", + "mapedge.dat", + // seen in 336 + "blackmark.dat", + "button_brown.dat", + "button_brown_big.dat", + "button_red.dat", + "chest.dat", + "coins.dat", + "headicons_hint.dat", + "headicons_pk.dat", + "headicons_prayer.dat", + "key.dat", + "keys.dat", + "leftarrow_small.dat", + "letter.dat", + "number_button.dat", + "overlay_duel.dat", + "overlay_multiway.dat", + "pen.dat", + "rightarrow_small.dat", + "startgame.dat", + "tex_brown.dat", + "tex_red.dat", + "titlescroll.dat", + // models (225 and before) + "base_head.dat", + "base_label.dat", + "base_type.dat", + "frame_del.dat", + "frame_head.dat", + "frame_tran1.dat", + "frame_tran2.dat", + "ob_axis.dat", + "ob_face1.dat", + "ob_face2.dat", + "ob_face3.dat", + "ob_face4.dat", + "ob_face5.dat", + "ob_head.dat", + "ob_point1.dat", + "ob_point2.dat", + "ob_point3.dat", + "ob_point4.dat", + "ob_point5.dat", + "ob_vertex1.dat", + "ob_vertex2.dat", + // versionlist (introduced in 234) + "anim_crc", + "anim_index", + "anim_version", + "map_crc", + "map_index", + "map_version", + "midi_crc", + "midi_index", + "midi_version", + "model_crc", + "model_index", + "model_version", + // textures + // index.dat + "0.dat", + "1.dat", + "2.dat", + "3.dat", + "4.dat", + "5.dat", + "6.dat", + "7.dat", + "8.dat", + "9.dat", + "10.dat", + "11.dat", + "12.dat", + "13.dat", + "14.dat", + "15.dat", + "16.dat", + "17.dat", + "18.dat", + "19.dat", + "20.dat", + "21.dat", + "22.dat", + "23.dat", + "24.dat", + "25.dat", + "26.dat", + "27.dat", + "28.dat", + "29.dat", + "30.dat", + "31.dat", + "32.dat", + "33.dat", + "34.dat", + "35.dat", + "36.dat", + "37.dat", + "38.dat", + "39.dat", + "40.dat", + "41.dat", + "42.dat", + "43.dat", + "44.dat", + "45.dat", + "46.dat", + "47.dat", + "48.dat", + "49.dat", + // wordenc + "badenc.txt", + "domainenc.txt", + "fragmentsenc.txt", + "tldlist.txt", + // sounds + "sounds.dat", + // worldmap + "labels.dat", + "floorcol.dat", + "underlay.dat", + "overlay.dat", + "size.dat" + // added later +]; +var KNOWN_HASHES = []; +for (let i = 0; i < KNOWN_NAMES.length; i++) { + KNOWN_HASHES[i] = genHash(KNOWN_NAMES[i]); +} + +// src/lostcity/cache/config/FontType.ts +var FontType = class _FontType { + static CHAR_LOOKUP = []; + static instances = []; + static { + const charset = `ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!"\xA3$%^&*()-_=+[{]};:'@#~,<.>/?\\| `; + for (let i = 0; i < 256; i++) { + let c = charset.indexOf(String.fromCharCode(i)); + if (c == -1) { + c = 74; + } + _FontType.CHAR_LOOKUP[i] = c; + } + } + static load(dir) { + const title = Jagfile.load(`${dir}/client/title`); + _FontType.instances[0] = new _FontType(title, "p11"); + _FontType.instances[1] = new _FontType(title, "p12"); + _FontType.instances[2] = new _FontType(title, "b12"); + _FontType.instances[3] = new _FontType(title, "q8"); + } + static async loadAsync(dir) { + const title = await Jagfile.loadAsync(`${dir}/client/title`); + _FontType.instances[0] = new _FontType(title, "p11"); + _FontType.instances[1] = new _FontType(title, "p12"); + _FontType.instances[2] = new _FontType(title, "b12"); + _FontType.instances[3] = new _FontType(title, "q8"); + } + static get(id) { + return _FontType.instances[id]; + } + static get count() { + return this.instances.length; + } + // ---- + charMask = new Array(94); + charMaskWidth = new Uint8Array(94); + charMaskHeight = new Uint8Array(94); + charOffsetX = new Uint8Array(94); + charOffsetY = new Uint8Array(94); + charAdvance = new Uint8Array(95); + drawWidth = new Uint8Array(256); + height = 0; + constructor(title, font) { + const dat = title.read(`${font}.dat`); + const idx = title.read("index.dat"); + if (!dat || !idx) { + return; + } + idx.pos = dat.g2() + 4; + const off = idx.g1(); + if (off > 0) { + idx.pos += (off - 1) * 3; + } + for (let i = 0; i < 94; i++) { + this.charOffsetX[i] = idx.g1(); + this.charOffsetY[i] = idx.g1(); + const w = this.charMaskWidth[i] = idx.g2(); + const h = this.charMaskHeight[i] = idx.g2(); + const type = idx.g1(); + const len = w * h; + this.charMask[i] = new Uint8Array(len); + if (type == 0) { + for (let j = 0; j < len; j++) { + this.charMask[i][j] = dat.g1(); + } + } else if (type == 1) { + for (let x = 0; x < w; x++) { + for (let y = 0; y < h; y++) { + this.charMask[i][x + y * w] = dat.g1(); + } + } + } + if (h > this.height) { + this.height = h; + } + this.charOffsetX[i] = 1; + this.charAdvance[i] = w + 2; + let space = 0; + for (let y = Math.floor(h / 7); y < h; y++) { + space += this.charMask[i][y * w]; + } + if (space <= Math.floor(h / 7)) { + this.charAdvance[i]--; + this.charOffsetX[i] = 0; + } + space = 0; + for (let y = Math.floor(h / 7); y < h; y++) { + space += this.charMask[i][w + y * w - 1]; + } + if (space <= Math.floor(h / 7)) { + this.charAdvance[i]--; + } + } + this.charAdvance[94] = this.charAdvance[8]; + for (let c = 0; c < 256; c++) { + this.drawWidth[c] = this.charAdvance[_FontType.CHAR_LOOKUP[c]]; + } + } + stringWidth(str) { + if (str == null) { + return 0; + } + let size = 0; + for (let c = 0; c < str.length; c++) { + if (str.charAt(c) == "@" && c + 4 < str.length && str.charAt(c + 4) == "@") { + c += 4; + } else { + size += this.drawWidth[str.charCodeAt(c)]; + } + } + return size; + } + split(str, maxWidth) { + if (str.length === 0) { + return [str]; + } + const lines = []; + while (str.length > 0) { + const width = this.stringWidth(str); + if (width <= maxWidth && str.indexOf("|") === -1) { + lines.push(str); + break; + } + let splitIndex = str.length; + for (let i = 0; i < str.length; i++) { + if (str[i] === " ") { + const w = this.stringWidth(str.substring(0, i)); + if (w > maxWidth) { + break; + } + splitIndex = i; + } else if (str[i] === "|") { + splitIndex = i; + break; + } + } + lines.push(str.substring(0, splitIndex)); + str = str.substring(splitIndex + 1); + } + return lines; + } +}; + +// src/lostcity/cache/config/HuntType.ts + +// src/lostcity/entity/hunt/HuntCheckNotTooStrong.ts +var HuntCheckNotTooStrong = /* @__PURE__ */ ((HuntCheckNotTooStrong2) => { + HuntCheckNotTooStrong2[HuntCheckNotTooStrong2["OFF"] = 0] = "OFF"; + HuntCheckNotTooStrong2[HuntCheckNotTooStrong2["OUTSIDE_WILDERNESS"] = 1] = "OUTSIDE_WILDERNESS"; + return HuntCheckNotTooStrong2; +})(HuntCheckNotTooStrong || {}); +var HuntCheckNotTooStrong_default = HuntCheckNotTooStrong; + +// src/lostcity/entity/hunt/HuntModeType.ts +var HuntModeType = /* @__PURE__ */ ((HuntModeType2) => { + HuntModeType2[HuntModeType2["OFF"] = 0] = "OFF"; + HuntModeType2[HuntModeType2["PLAYER"] = 1] = "PLAYER"; + HuntModeType2[HuntModeType2["NPC"] = 2] = "NPC"; + HuntModeType2[HuntModeType2["OBJ"] = 3] = "OBJ"; + HuntModeType2[HuntModeType2["SCENERY"] = 4] = "SCENERY"; + return HuntModeType2; +})(HuntModeType || {}); +var HuntModeType_default = HuntModeType; + +// src/lostcity/entity/hunt/HuntNobodyNear.ts +var HuntNobodyNear = /* @__PURE__ */ ((HuntNobodyNear2) => { + HuntNobodyNear2[HuntNobodyNear2["KEEPHUNTING"] = 0] = "KEEPHUNTING"; + HuntNobodyNear2[HuntNobodyNear2["PAUSEHUNT"] = 1] = "PAUSEHUNT"; + return HuntNobodyNear2; +})(HuntNobodyNear || {}); +var HuntNobodyNear_default = HuntNobodyNear; + +// src/lostcity/entity/hunt/HuntVis.ts +var HuntVis = /* @__PURE__ */ ((HuntVis2) => { + HuntVis2[HuntVis2["OFF"] = 0] = "OFF"; + HuntVis2[HuntVis2["LINEOFSIGHT"] = 1] = "LINEOFSIGHT"; + HuntVis2[HuntVis2["LINEOFWALK"] = 2] = "LINEOFWALK"; + return HuntVis2; +})(HuntVis || {}); +var HuntVis_default = HuntVis; + +// src/lostcity/entity/NpcMode.ts +var NpcMode = /* @__PURE__ */ ((NpcMode2) => { + NpcMode2[NpcMode2["NULL"] = -1] = "NULL"; + NpcMode2[NpcMode2["NONE"] = 0] = "NONE"; + NpcMode2[NpcMode2["WANDER"] = 1] = "WANDER"; + NpcMode2[NpcMode2["PATROL"] = 2] = "PATROL"; + NpcMode2[NpcMode2["PLAYERESCAPE"] = 3] = "PLAYERESCAPE"; + NpcMode2[NpcMode2["PLAYERFOLLOW"] = 4] = "PLAYERFOLLOW"; + NpcMode2[NpcMode2["PLAYERFACE"] = 5] = "PLAYERFACE"; + NpcMode2[NpcMode2["PLAYERFACECLOSE"] = 6] = "PLAYERFACECLOSE"; + NpcMode2[NpcMode2["OPPLAYER1"] = 7] = "OPPLAYER1"; + NpcMode2[NpcMode2["OPPLAYER2"] = 8] = "OPPLAYER2"; + NpcMode2[NpcMode2["OPPLAYER3"] = 9] = "OPPLAYER3"; + NpcMode2[NpcMode2["OPPLAYER4"] = 10] = "OPPLAYER4"; + NpcMode2[NpcMode2["OPPLAYER5"] = 11] = "OPPLAYER5"; + NpcMode2[NpcMode2["APPLAYER1"] = 12] = "APPLAYER1"; + NpcMode2[NpcMode2["APPLAYER2"] = 13] = "APPLAYER2"; + NpcMode2[NpcMode2["APPLAYER3"] = 14] = "APPLAYER3"; + NpcMode2[NpcMode2["APPLAYER4"] = 15] = "APPLAYER4"; + NpcMode2[NpcMode2["APPLAYER5"] = 16] = "APPLAYER5"; + NpcMode2[NpcMode2["OPLOC1"] = 17] = "OPLOC1"; + NpcMode2[NpcMode2["OPLOC2"] = 18] = "OPLOC2"; + NpcMode2[NpcMode2["OPLOC3"] = 19] = "OPLOC3"; + NpcMode2[NpcMode2["OPLOC4"] = 20] = "OPLOC4"; + NpcMode2[NpcMode2["OPLOC5"] = 21] = "OPLOC5"; + NpcMode2[NpcMode2["APLOC1"] = 22] = "APLOC1"; + NpcMode2[NpcMode2["APLOC2"] = 23] = "APLOC2"; + NpcMode2[NpcMode2["APLOC3"] = 24] = "APLOC3"; + NpcMode2[NpcMode2["APLOC4"] = 25] = "APLOC4"; + NpcMode2[NpcMode2["APLOC5"] = 26] = "APLOC5"; + NpcMode2[NpcMode2["OPOBJ1"] = 27] = "OPOBJ1"; + NpcMode2[NpcMode2["OPOBJ2"] = 28] = "OPOBJ2"; + NpcMode2[NpcMode2["OPOBJ3"] = 29] = "OPOBJ3"; + NpcMode2[NpcMode2["OPOBJ4"] = 30] = "OPOBJ4"; + NpcMode2[NpcMode2["OPOBJ5"] = 31] = "OPOBJ5"; + NpcMode2[NpcMode2["APOBJ1"] = 32] = "APOBJ1"; + NpcMode2[NpcMode2["APOBJ2"] = 33] = "APOBJ2"; + NpcMode2[NpcMode2["APOBJ3"] = 34] = "APOBJ3"; + NpcMode2[NpcMode2["APOBJ4"] = 35] = "APOBJ4"; + NpcMode2[NpcMode2["APOBJ5"] = 36] = "APOBJ5"; + NpcMode2[NpcMode2["OPNPC1"] = 37] = "OPNPC1"; + NpcMode2[NpcMode2["OPNPC2"] = 38] = "OPNPC2"; + NpcMode2[NpcMode2["OPNPC3"] = 39] = "OPNPC3"; + NpcMode2[NpcMode2["OPNPC4"] = 40] = "OPNPC4"; + NpcMode2[NpcMode2["OPNPC5"] = 41] = "OPNPC5"; + NpcMode2[NpcMode2["APNPC1"] = 42] = "APNPC1"; + NpcMode2[NpcMode2["APNPC2"] = 43] = "APNPC2"; + NpcMode2[NpcMode2["APNPC3"] = 44] = "APNPC3"; + NpcMode2[NpcMode2["APNPC4"] = 45] = "APNPC4"; + NpcMode2[NpcMode2["APNPC5"] = 46] = "APNPC5"; + NpcMode2[NpcMode2["QUEUE1"] = 47] = "QUEUE1"; + NpcMode2[NpcMode2["QUEUE2"] = 48] = "QUEUE2"; + NpcMode2[NpcMode2["QUEUE3"] = 49] = "QUEUE3"; + NpcMode2[NpcMode2["QUEUE4"] = 50] = "QUEUE4"; + NpcMode2[NpcMode2["QUEUE5"] = 51] = "QUEUE5"; + NpcMode2[NpcMode2["QUEUE6"] = 52] = "QUEUE6"; + NpcMode2[NpcMode2["QUEUE7"] = 53] = "QUEUE7"; + NpcMode2[NpcMode2["QUEUE8"] = 54] = "QUEUE8"; + NpcMode2[NpcMode2["QUEUE9"] = 55] = "QUEUE9"; + NpcMode2[NpcMode2["QUEUE10"] = 56] = "QUEUE10"; + NpcMode2[NpcMode2["QUEUE11"] = 57] = "QUEUE11"; + NpcMode2[NpcMode2["QUEUE12"] = 58] = "QUEUE12"; + NpcMode2[NpcMode2["QUEUE13"] = 59] = "QUEUE13"; + NpcMode2[NpcMode2["QUEUE14"] = 60] = "QUEUE14"; + NpcMode2[NpcMode2["QUEUE15"] = 61] = "QUEUE15"; + NpcMode2[NpcMode2["QUEUE16"] = 62] = "QUEUE16"; + NpcMode2[NpcMode2["QUEUE17"] = 63] = "QUEUE17"; + NpcMode2[NpcMode2["QUEUE18"] = 64] = "QUEUE18"; + NpcMode2[NpcMode2["QUEUE19"] = 65] = "QUEUE19"; + NpcMode2[NpcMode2["QUEUE20"] = 66] = "QUEUE20"; + return NpcMode2; +})(NpcMode || {}); +var NpcMode_default = NpcMode; + +// src/lostcity/cache/config/HuntType.ts +var HuntType = class _HuntType extends ConfigType { + static configNames = /* @__PURE__ */ new Map(); + static configs = []; + static load(dir) { + if (!fs6.existsSync(`${dir}/server/hunt.dat`)) { + console.log("Warning: No hunt.dat found."); + return; + } + const dat = Packet.load(`${dir}/server/hunt.dat`); + this.parse(dat); + } + static async loadAsync(dir) { + const file = await fetch(`${dir}/server/hunt.dat`); + if (!file.ok) { + console.log("Warning: No hunt.dat found."); + return; + } + const dat = new Packet(new Uint8Array(await file.arrayBuffer())); + this.parse(dat); + } + static parse(dat) { + _HuntType.configNames = /* @__PURE__ */ new Map(); + _HuntType.configs = []; + const count = dat.g2(); + for (let id = 0; id < count; id++) { + const config = new _HuntType(id); + config.decodeType(dat); + _HuntType.configs[id] = config; + if (config.debugname) { + _HuntType.configNames.set(config.debugname, id); + } + } + } + static get(id) { + return _HuntType.configs[id]; + } + static getId(name) { + return _HuntType.configNames.get(name) ?? -1; + } + static getByName(name) { + const id = this.getId(name); + if (id === -1) { + return null; + } + return this.get(id); + } + static get count() { + return this.configs.length; + } + // ---- + type = HuntModeType_default.OFF; + checkVis = HuntVis_default.OFF; + checkNotTooStrong = HuntCheckNotTooStrong_default.OFF; + checkNotBusy = false; + findKeepHunting = false; + findNewMode = NpcMode_default.NONE; + nobodyNear = HuntNobodyNear_default.PAUSEHUNT; + checkNotCombat = -1; + checkNotCombatSelf = -1; + checkAfk = true; + rate = 1; + checkCategory = -1; + checkNpc = -1; + checkObj = -1; + checkLoc = -1; + checkInv = -1; + checkObjParam = -1; + checkInvMinQuantity = -1; + checkInvMaxQuantity = -1; + decode(code, dat) { + if (code === 1) { + this.type = dat.g1(); + } else if (code == 2) { + this.checkVis = dat.g1(); + } else if (code == 3) { + this.checkNotTooStrong = dat.g1(); + } else if (code == 4) { + this.checkNotBusy = true; + } else if (code == 5) { + this.findKeepHunting = true; + } else if (code == 6) { + this.findNewMode = dat.g1(); + } else if (code == 7) { + this.nobodyNear = dat.g1(); + } else if (code === 8) { + this.checkNotCombat = dat.g2(); + } else if (code === 9) { + this.checkNotCombatSelf = dat.g2(); + } else if (code === 10) { + this.checkAfk = false; + } else if (code === 11) { + this.rate = dat.g2(); + } else if (code === 12) { + this.checkCategory = dat.g2(); + } else if (code === 13) { + this.checkNpc = dat.g2(); + } else if (code === 14) { + this.checkObj = dat.g2(); + } else if (code === 15) { + this.checkLoc = dat.g2(); + } else if (code === 16) { + this.checkInv = dat.g2(); + this.checkObj = dat.g2(); + this.checkInvMinQuantity = dat.g4(); + this.checkInvMaxQuantity = dat.g4(); + } else if (code === 17) { + this.checkInv = dat.g2(); + this.checkObjParam = dat.g2(); + this.checkInvMinQuantity = dat.g4(); + this.checkInvMaxQuantity = dat.g4(); + } else if (code === 250) { + this.debugname = dat.gjstr(); + } else { + throw new Error(`Unrecognized hunt config code: ${code}`); + } + } +}; + +// src/lostcity/cache/config/IdkType.ts +var IdkType = class _IdkType extends ConfigType { + static configNames = /* @__PURE__ */ new Map(); + static configs = []; + static load(dir) { + if (!fs7.existsSync(`${dir}/server/idk.dat`)) { + console.log("Warning: No idk.dat found."); + return; + } + const server = Packet.load(`${dir}/server/idk.dat`); + const jag = Jagfile.load(`${dir}/client/config`); + this.parse(server, jag); + } + static async loadAsync(dir) { + const file = await fetch(`${dir}/server/idk.dat`); + if (!file.ok) { + console.log("Warning: No idk.dat found."); + return; + } + const [server, jag] = await Promise.all([file.arrayBuffer(), Jagfile.loadAsync(`${dir}/client/config`)]); + this.parse(new Packet(new Uint8Array(server)), jag); + } + static parse(server, jag) { + _IdkType.configNames = /* @__PURE__ */ new Map(); + _IdkType.configs = []; + const count = server.g2(); + const client = jag.read("idk.dat"); + client.pos = 2; + for (let id = 0; id < count; id++) { + const config = new _IdkType(id); + config.decodeType(server); + config.decodeType(client); + _IdkType.configs[id] = config; + if (config.debugname) { + _IdkType.configNames.set(config.debugname, id); + } + } + } + static get(id) { + return _IdkType.configs[id]; + } + static getId(name) { + return _IdkType.configNames.get(name) ?? -1; + } + static getByName(name) { + const id = this.getId(name); + if (id === -1) { + return null; + } + return this.get(id); + } + static get count() { + return this.configs.length; + } + // ---- + type = -1; + models = null; + heads = new Uint16Array(5).fill(-1); + recol_s = new Uint16Array(6).fill(0); + recol_d = new Uint16Array(6).fill(0); + disable = false; + decode(code, dat) { + if (code === 1) { + this.type = dat.g1(); + } else if (code === 2) { + const count = dat.g1(); + this.models = new Uint16Array(count); + for (let i = 0; i < count; i++) { + this.models[i] = dat.g2(); + } + } else if (code === 3) { + this.disable = true; + } else if (code >= 40 && code < 50) { + this.recol_s[code - 40] = dat.g2(); + } else if (code >= 50 && code < 60) { + this.recol_d[code - 50] = dat.g2(); + } else if (code >= 60 && code < 70) { + this.heads[code - 60] = dat.g2(); + } else if (code === 250) { + this.debugname = dat.gjstr(); + } else { + throw new Error(`Unrecognized idk config code: ${code}`); + } + } +}; + +// src/lostcity/cache/config/Component.ts +var Component = class _Component { + static TYPE_LAYER = 0; + static TYPE_UNUSED = 1; + static TYPE_INVENTORY = 2; + static TYPE_RECT = 3; + static TYPE_TEXT = 4; + static TYPE_SPRITE = 5; + static TYPE_MODEL = 6; + static TYPE_INVENTORY_TEXT = 7; + static NO_BUTTON = 0; + static BUTTON = 1; + static TARGET_BUTTON = 2; + static CLOSE_BUTTON = 3; + static TOGGLE_BUTTON = 4; + static SELECT_BUTTON = 5; + static PAUSE_BUTTON = 6; + static componentNames = /* @__PURE__ */ new Map(); + static components = []; + static load(dir) { + if (!fs8.existsSync(`${dir}/server/interface.dat`)) { + console.log("Warning: No interface.dat found."); + return; + } + const dat = Packet.load(`${dir}/server/interface.dat`); + this.parse(dat); + } + static async loadAsync(dir) { + const file = await fetch(`${dir}/server/interface.dat`); + if (!file.ok) { + console.log("Warning: No interface.dat found."); + return; + } + const dat = new Packet(new Uint8Array(await file.arrayBuffer())); + this.parse(dat); + } + static parse(dat) { + this.componentNames = /* @__PURE__ */ new Map(); + this.components = []; + dat.g2(); + let rootLayer = -1; + while (dat.available > 0) { + let id = dat.g2(); + if (id === 65535) { + rootLayer = dat.g2(); + id = dat.g2(); + } + const com = new _Component(); + com.id = id; + com.rootLayer = rootLayer; + com.comName = dat.gjstr(); + com.overlay = dat.gbool(); + com.type = dat.g1(); + com.buttonType = dat.g1(); + com.clientCode = dat.g2(); + com.width = dat.g2(); + com.height = dat.g2(); + com.overLayer = dat.g1(); + if (com.overLayer == 0) { + com.overLayer = -1; + } else { + com.overLayer = (com.overLayer - 1 << 8) + dat.g1(); + } + const comparatorCount = dat.g1(); + if (comparatorCount > 0) { + com.scriptComparator = new Uint8Array(comparatorCount).fill(0); + com.scriptOperand = new Uint16Array(comparatorCount).fill(0); + for (let i = 0; i < comparatorCount; i++) { + com.scriptComparator[i] = dat.g1(); + com.scriptOperand[i] = dat.g2(); + } + } + const scriptCount = dat.g1(); + if (scriptCount > 0) { + com.scripts = new Array(scriptCount).fill(null); + for (let i = 0; i < scriptCount; i++) { + const opcodeCount = dat.g2(); + com.scripts[i] = new Uint16Array(opcodeCount).fill(0); + for (let j = 0; j < opcodeCount; j++) { + com.scripts[i][j] = dat.g2(); + } + } + } + switch (com.type) { + case _Component.TYPE_LAYER: { + com.scroll = dat.g2(); + com.hide = dat.gbool(); + const childCount = dat.g1(); + com.childId = new Uint16Array(childCount).fill(0); + com.childX = new Uint16Array(childCount).fill(0); + com.childY = new Uint16Array(childCount).fill(0); + for (let i = 0; i < childCount; i++) { + com.childId[i] = dat.g2(); + com.childX[i] = dat.g2s(); + com.childY[i] = dat.g2s(); + } + break; + } + case _Component.TYPE_UNUSED: + dat.pos += 10; + break; + case _Component.TYPE_INVENTORY: { + com.draggable = dat.gbool(); + com.interactable = dat.gbool(); + com.usable = dat.gbool(); + com.marginX = dat.g1(); + com.marginY = dat.g1(); + com.inventorySlotOffsetX = new Uint16Array(20).fill(0); + com.inventorySlotOffsetY = new Uint16Array(20).fill(0); + com.inventorySlotGraphic = new Array(20).fill(null); + for (let i = 0; i < 20; i++) { + if (dat.gbool()) { + com.inventorySlotOffsetX[i] = dat.g2s(); + com.inventorySlotOffsetY[i] = dat.g2s(); + com.inventorySlotGraphic[i] = dat.gjstr(); + } + } + com.inventoryOptions = new Array(5).fill(null); + for (let i = 0; i < 5; i++) { + com.inventoryOptions[i] = dat.gjstr(); + } + com.actionVerb = dat.gjstr(); + com.action = dat.gjstr(); + com.actionTarget = dat.g2(); + break; + } + case _Component.TYPE_RECT: + com.fill = dat.gbool(); + com.colour = dat.g4(); + com.activeColour = dat.g4(); + com.overColour = dat.g4(); + break; + case _Component.TYPE_TEXT: + com.center = dat.gbool(); + com.font = dat.g1(); + com.shadowed = dat.gbool(); + com.text = dat.gjstr(); + com.activeText = dat.gjstr(); + com.colour = dat.g4(); + com.activeColour = dat.g4(); + com.overColour = dat.g4(); + break; + case _Component.TYPE_SPRITE: + com.graphic = dat.gjstr(); + com.activeGraphic = dat.gjstr(); + break; + case _Component.TYPE_MODEL: { + com.model = dat.g1(); + if (com.model != 0) { + com.model = (com.model - 1 << 8) + dat.g1(); + } + com.activeModel = dat.g1(); + if (com.activeModel != 0) { + com.activeModel = (com.activeModel - 1 << 8) + dat.g1(); + } + com.anim = dat.g1(); + if (com.anim == 0) { + com.anim = -1; + } else { + com.anim = (com.anim - 1 << 8) + dat.g1(); + } + com.activeAnim = dat.g1(); + if (com.activeAnim == 0) { + com.activeAnim = -1; + } else { + com.activeAnim = (com.activeAnim - 1 << 8) + dat.g1(); + } + com.zoom = dat.g2(); + com.xan = dat.g2(); + com.yan = dat.g2(); + break; + } + case _Component.TYPE_INVENTORY_TEXT: { + com.center = dat.gbool(); + com.font = dat.g1(); + com.shadowed = dat.gbool(); + com.colour = dat.g4(); + com.marginX = dat.g2s(); + com.marginY = dat.g2s(); + com.interactable = dat.gbool(); + com.inventoryOptions = new Array(5).fill(null); + for (let i = 0; i < 5; i++) { + com.inventoryOptions[i] = dat.gjstr(); + } + break; + } + } + switch (com.buttonType) { + case _Component.NO_BUTTON: + break; + case _Component.TARGET_BUTTON: + com.actionVerb = dat.gjstr(); + com.action = dat.gjstr(); + com.actionTarget = dat.g2(); + break; + case _Component.BUTTON: + case _Component.TOGGLE_BUTTON: + case _Component.SELECT_BUTTON: + case _Component.PAUSE_BUTTON: + com.option = dat.gjstr(); + break; + } + _Component.components[id] = com; + if (com.comName) { + _Component.componentNames.set(com.comName, id); + } + } + } + static get(id) { + return _Component.components[id]; + } + static getId(name) { + return _Component.componentNames.get(name) ?? -1; + } + static getByName(name) { + const id = this.getId(name); + if (id === -1) { + return null; + } + return this.get(id); + } + // ---- + id = -1; + rootLayer = -1; + comName = null; + overlay = false; + type = -1; + buttonType = -1; + clientCode = 0; + width = 0; + height = 0; + overLayer = -1; + scriptComparator = null; + scriptOperand = null; + scripts = null; + scroll = 0; + hide = false; + draggable = false; + interactable = false; + usable = false; + marginX = 0; + marginY = 0; + inventorySlotOffsetX = null; + inventorySlotOffsetY = null; + inventorySlotGraphic = null; + inventoryOptions = null; + fill = false; + center = false; + font = 0; + shadowed = false; + text = null; + activeText = null; + colour = 0; + activeColour = 0; + overColour = 0; + graphic = null; + activeGraphic = null; + model = -1; + activeModel = -1; + anim = -1; + activeAnim = -1; + zoom = 0; + xan = 0; + yan = 0; + actionVerb = null; + action = null; + actionTarget = -1; + option = null; + childId = null; + childX = null; + childY = null; +}; + +// src/lostcity/cache/config/InvType.ts +var InvType = class _InvType extends ConfigType { + static configNames = /* @__PURE__ */ new Map(); + static configs = []; + static SCOPE_TEMP = 0; + static SCOPE_PERM = 1; + static SCOPE_SHARED = 2; + // commonly referenced in-engine + static INV = -1; + static WORN = -1; + static load(dir) { + if (!fs9.existsSync(`${dir}/server/inv.dat`)) { + console.log("Warning: No inv.dat found."); + return; + } + const dat = Packet.load(`${dir}/server/inv.dat`); + this.parse(dat); + } + static async loadAsync(dir) { + const file = await fetch(`${dir}/server/inv.dat`); + if (!file.ok) { + console.log("Warning: No inv.dat found."); + return; + } + const dat = new Packet(new Uint8Array(await file.arrayBuffer())); + this.parse(dat); + } + static parse(dat) { + _InvType.configNames = /* @__PURE__ */ new Map(); + _InvType.configs = []; + const count = dat.g2(); + for (let id = 0; id < count; id++) { + const config = new _InvType(id); + config.decodeType(dat); + _InvType.configs[id] = config; + if (config.debugname) { + _InvType.configNames.set(config.debugname, id); + } + } + _InvType.INV = _InvType.getId("inv"); + _InvType.WORN = _InvType.getId("worn"); + } + static get(id) { + return _InvType.configs[id]; + } + static getId(name) { + return _InvType.configNames.get(name) ?? -1; + } + static getByName(name) { + const id = this.getId(name); + if (id === -1) { + return null; + } + return this.get(id); + } + static get count() { + return this.configs.length; + } + // ---- + scope = 0; + size = 1; + stackall = false; + restock = false; + allstock = false; + stockobj = null; + stockcount = null; + stockrate = null; + protect = true; + runweight = false; + // inv contributes to weight + dummyinv = false; + // inv only accepts objs with dummyitem=inv_only + decode(code, dat) { + if (code === 1) { + this.scope = dat.g1(); + } else if (code === 2) { + this.size = dat.g2(); + } else if (code === 3) { + this.stackall = true; + } else if (code === 4) { + const count = dat.g1(); + this.stockobj = new Uint16Array(count); + this.stockcount = new Uint16Array(count); + this.stockrate = new Int32Array(count); + for (let j = 0; j < count; j++) { + this.stockobj[j] = dat.g2(); + this.stockcount[j] = dat.g2(); + this.stockrate[j] = dat.g4(); + } + } else if (code === 5) { + this.restock = true; + } else if (code === 6) { + this.allstock = true; + } else if (code === 7) { + this.protect = false; + } else if (code === 8) { + this.runweight = true; + } else if (code === 9) { + this.dummyinv = true; + } else if (code === 250) { + this.debugname = dat.gjstr(); + } else { + throw new Error(`Unrecognized inv config code: ${code}`); + } + } +}; + +// src/lostcity/cache/config/LocType.ts + +// src/lostcity/cache/config/ParamHelper.ts +var ParamHelper = { + getStringParam: function(id, holder, defaultValue) { + const value = holder.params?.get(id); + if (typeof value !== "string") { + return defaultValue ?? "null"; + } + return value; + }, + getIntParam: function(id, holder, defaultValue) { + const value = holder.params?.get(id); + if (typeof value !== "number") { + return defaultValue; + } + return value; + }, + decodeParams: function(dat) { + const count = dat.g1(); + const params = /* @__PURE__ */ new Map(); + for (let i = 0; i < count; i++) { + const key = dat.g3(); + const isString = dat.gbool(); + if (isString) { + params.set(key, dat.gjstr()); + } else { + params.set(key, dat.g4()); + } + } + return params; + } +}; + +// src/lostcity/cache/config/LocType.ts +var LocType = class _LocType extends ConfigType { + static configNames = /* @__PURE__ */ new Map(); + static configs = []; + static load(dir) { + if (!fs10.existsSync(`${dir}/server/loc.dat`)) { + console.log("Warning: No loc.dat found."); + return; + } + const server = Packet.load(`${dir}/server/loc.dat`); + const jag = Jagfile.load(`${dir}/client/config`); + this.parse(server, jag); + } + static async loadAsync(dir) { + const file = await fetch(`${dir}/server/loc.dat`); + if (!file.ok) { + console.log("Warning: No loc.dat found."); + return; + } + const [server, jag] = await Promise.all([file.arrayBuffer(), Jagfile.loadAsync(`${dir}/client/config`)]); + this.parse(new Packet(new Uint8Array(server)), jag); + } + static parse(server, jag) { + _LocType.configNames = /* @__PURE__ */ new Map(); + _LocType.configs = []; + const count = server.g2(); + const client = jag.read("loc.dat"); + client.pos = 2; + for (let id = 0; id < count; id++) { + const config = new _LocType(id); + config.active = -1; + config.decodeType(server); + config.decodeType(client); + if (config.active === -1 && config.shapes) { + config.active = config.shapes.length > 0 && config.shapes[0] === 10 ? 1 : 0; + if (config.op && config.op.length > 0) { + config.active = 1; + } + } + _LocType.configs[id] = config; + if (config.debugname) { + _LocType.configNames.set(config.debugname, id); + } + } + } + static get(id) { + return _LocType.configs[id]; + } + static getId(name) { + return _LocType.configNames.get(name) ?? -1; + } + static getByName(name) { + const id = this.getId(name); + if (id === void 0 || id === -1) { + return null; + } + return this.get(id); + } + static get count() { + return this.configs.length; + } + // ---- + models = null; + shapes = null; + name = null; + desc = null; + recol_s = null; + recol_d = null; + width = 1; + length = 1; + blockwalk = true; + blockrange = true; + active = 0; + // not -1 here just in case an new LocType is created, we want to default to "false" + hillskew = false; + sharelight = false; + occlude = false; + anim = -1; + hasalpha = false; + wallwidth = 16; + ambient = 0; + contrast = 0; + op = null; + mapfunction = -1; + mapscene = -1; + mirror = false; + shadow = true; + resizex = 128; + resizey = 128; + resizez = 128; + forceapproach = 0; + xoff = 0; + yoff = 0; + zoff = 0; + forcedecor = false; + // server-side + category = -1; + params = /* @__PURE__ */ new Map(); + decode(code, dat) { + if (code === 1) { + const count = dat.g1(); + this.models = new Uint16Array(count); + this.shapes = new Uint8Array(count); + for (let i = 0; i < count; i++) { + this.models[i] = dat.g2(); + this.shapes[i] = dat.g1(); + } + } else if (code === 2) { + this.name = dat.gjstr(); + } else if (code === 3) { + this.desc = dat.gjstr(); + } else if (code === 14) { + this.width = dat.g1(); + } else if (code === 15) { + this.length = dat.g1(); + } else if (code === 17) { + this.blockwalk = false; + } else if (code === 18) { + this.blockrange = false; + } else if (code === 19) { + this.active = dat.g1(); + } else if (code === 21) { + this.hillskew = true; + } else if (code === 22) { + this.sharelight = true; + } else if (code === 23) { + this.occlude = true; + } else if (code === 24) { + this.anim = dat.g2(); + if (this.anim == 65535) { + this.anim = -1; + } + } else if (code === 25) { + this.hasalpha = true; + } else if (code === 28) { + this.wallwidth = dat.g1(); + } else if (code === 29) { + this.ambient = dat.g1b(); + } else if (code === 39) { + this.contrast = dat.g1b(); + } else if (code >= 30 && code < 35) { + if (!this.op) { + this.op = new Array(5).fill(null); + } + this.op[code - 30] = dat.gjstr(); + if (this.op[code - 30] === "hidden") { + this.op[code - 30] = null; + } + } else if (code === 40) { + const count = dat.g1(); + this.recol_s = new Uint16Array(count); + this.recol_d = new Uint16Array(count); + for (let i = 0; i < count; i++) { + this.recol_s[i] = dat.g2(); + this.recol_d[i] = dat.g2(); + } + } else if (code === 60) { + this.mapfunction = dat.g2(); + } else if (code === 62) { + this.mirror = true; + } else if (code === 64) { + this.shadow = false; + } else if (code === 65) { + this.resizex = dat.g2(); + } else if (code === 66) { + this.resizey = dat.g2(); + } else if (code === 67) { + this.resizez = dat.g2(); + } else if (code === 68) { + this.mapscene = dat.g2(); + } else if (code === 69) { + this.forceapproach = dat.g1(); + } else if (code === 70) { + this.xoff = dat.g2s(); + } else if (code === 71) { + this.yoff = dat.g2s(); + } else if (code === 72) { + this.zoff = dat.g2s(); + } else if (code === 73) { + this.forcedecor = true; + } else if (code === 200) { + this.category = dat.g2(); + } else if (code === 249) { + this.params = ParamHelper.decodeParams(dat); + } else if (code === 250) { + this.debugname = dat.gjstr(); + } else { + throw new Error(`Unrecognized loc config code: ${code}`); + } + } +}; + +// src/lostcity/cache/config/MesanimType.ts +var MesanimType = class _MesanimType extends ConfigType { + static configNames = /* @__PURE__ */ new Map(); + static configs = []; + static load(dir) { + if (!fs11.existsSync(`${dir}/server/mesanim.dat`)) { + console.log("Warning: No mesanim.dat found."); + return; + } + const dat = Packet.load(`${dir}/server/mesanim.dat`); + this.parse(dat); + } + static async loadAsync(dir) { + const file = await fetch(`${dir}/server/mesanim.dat`); + if (!file.ok) { + console.log("Warning: No mesanim.dat found."); + return; + } + const dat = new Packet(new Uint8Array(await file.arrayBuffer())); + this.parse(dat); + } + static parse(dat) { + _MesanimType.configNames = /* @__PURE__ */ new Map(); + _MesanimType.configs = []; + const count = dat.g2(); + for (let id = 0; id < count; id++) { + const config = new _MesanimType(id); + config.decodeType(dat); + _MesanimType.configs[id] = config; + if (config.debugname) { + _MesanimType.configNames.set(config.debugname, id); + } + } + } + static get(id) { + return _MesanimType.configs[id]; + } + static getId(name) { + return _MesanimType.configNames.get(name) ?? -1; + } + static getByName(name) { + const id = this.getId(name); + if (id === -1) { + return null; + } + return this.get(id); + } + static get count() { + return this.configs.length; + } + // ---- + len = new Array(4).fill(-1); + decode(code, dat) { + if (code >= 1 && code < 5) { + this.len[code - 1] = dat.g2(); + } else if (code === 250) { + this.debugname = dat.gjstr(); + } else { + throw new Error(`Unrecognized mesanim config code: ${code}`); + } + } +}; + +// src/lostcity/cache/config/NpcType.ts + +// src/lostcity/entity/BlockWalk.ts +var BlockWalk = /* @__PURE__ */ ((BlockWalk2) => { + BlockWalk2[BlockWalk2["NONE"] = 0] = "NONE"; + BlockWalk2[BlockWalk2["NPC"] = 1] = "NPC"; + BlockWalk2[BlockWalk2["ALL"] = 2] = "ALL"; + return BlockWalk2; +})(BlockWalk || {}); +var BlockWalk_default = BlockWalk; + +// src/lostcity/entity/MoveRestrict.ts +var MoveRestrict = /* @__PURE__ */ ((MoveRestrict2) => { + MoveRestrict2[MoveRestrict2["NORMAL"] = 0] = "NORMAL"; + MoveRestrict2[MoveRestrict2["BLOCKED"] = 1] = "BLOCKED"; + MoveRestrict2[MoveRestrict2["BLOCKED_NORMAL"] = 2] = "BLOCKED_NORMAL"; + MoveRestrict2[MoveRestrict2["INDOORS"] = 3] = "INDOORS"; + MoveRestrict2[MoveRestrict2["OUTDOORS"] = 4] = "OUTDOORS"; + MoveRestrict2[MoveRestrict2["NOMOVE"] = 5] = "NOMOVE"; + MoveRestrict2[MoveRestrict2["PASSTHRU"] = 6] = "PASSTHRU"; + return MoveRestrict2; +})(MoveRestrict || {}); +var MoveRestrict_default = MoveRestrict; + +// src/lostcity/entity/NpcStat.ts +var NpcStat = /* @__PURE__ */ ((NpcStat2) => { + NpcStat2[NpcStat2["ATTACK"] = 0] = "ATTACK"; + NpcStat2[NpcStat2["DEFENCE"] = 1] = "DEFENCE"; + NpcStat2[NpcStat2["STRENGTH"] = 2] = "STRENGTH"; + NpcStat2[NpcStat2["HITPOINTS"] = 3] = "HITPOINTS"; + NpcStat2[NpcStat2["RANGED"] = 4] = "RANGED"; + NpcStat2[NpcStat2["MAGIC"] = 5] = "MAGIC"; + return NpcStat2; +})(NpcStat || {}); +var NpcStat_default = NpcStat; + +// src/lostcity/cache/config/NpcType.ts +var NpcType = class _NpcType extends ConfigType { + static configNames = /* @__PURE__ */ new Map(); + static configs = []; + static load(dir) { + if (!fs12.existsSync(`${dir}/server/npc.dat`)) { + console.log("Warning: No npc.dat found."); + return; + } + const server = Packet.load(`${dir}/server/npc.dat`); + const jag = Jagfile.load(`${dir}/client/config`); + this.parse(server, jag); + } + static async loadAsync(dir) { + const file = await fetch(`${dir}/server/npc.dat`); + if (!file.ok) { + console.log("Warning: No npc.dat found."); + return; + } + const [server, jag] = await Promise.all([file.arrayBuffer(), Jagfile.loadAsync(`${dir}/client/config`)]); + this.parse(new Packet(new Uint8Array(server)), jag); + } + static parse(server, jag) { + _NpcType.configNames = /* @__PURE__ */ new Map(); + _NpcType.configs = []; + const count = server.g2(); + const client = jag.read("npc.dat"); + client.pos = 2; + for (let id = 0; id < count; id++) { + const config = new _NpcType(id); + config.decodeType(server); + config.decodeType(client); + _NpcType.configs[id] = config; + if (config.debugname) { + _NpcType.configNames.set(config.debugname, id); + } + } + } + static get(id) { + return _NpcType.configs[id]; + } + static getId(name) { + return _NpcType.configNames.get(name) ?? -1; + } + static getByName(name) { + const id = this.getId(name); + if (id === -1) { + return null; + } + return this.get(id); + } + static get count() { + return this.configs.length; + } + // ---- + name = null; + desc = null; + size = 1; + models = null; + heads = null; + hasanim = false; + readyanim = -1; + walkanim = -1; + walkanim_b = -1; + walkanim_r = -1; + walkanim_l = -1; + hasalpha = false; + recol_s = null; + recol_d = null; + op = null; + resizex = -1; + resizey = -1; + resizez = -1; + minimap = true; + vislevel = -1; + resizeh = 128; + resizev = 128; + // server-side + category = -1; + wanderrange = 5; + maxrange = 7; + huntrange = 5; + timer = -1; + respawnrate = 100; + // default to 1-minute + stats = [1, 1, 1, 1, 1, 1]; + moverestrict = MoveRestrict_default.NORMAL; + attackrange = 1; + huntmode = -1; + defaultmode = NpcMode_default.WANDER; + members = false; + blockwalk = BlockWalk_default.NPC; + params = /* @__PURE__ */ new Map(); + patrolCoord = []; + patrolDelay = []; + givechase = true; + decode(code, dat) { + if (code === 1) { + const count = dat.g1(); + this.models = new Uint16Array(count); + for (let i = 0; i < count; i++) { + this.models[i] = dat.g2(); + } + } else if (code === 2) { + this.name = dat.gjstr(); + } else if (code === 3) { + this.desc = dat.gjstr(); + } else if (code === 12) { + this.size = dat.g1(); + } else if (code === 13) { + this.readyanim = dat.g2(); + } else if (code === 14) { + this.walkanim = dat.g2(); + } else if (code === 16) { + this.hasanim = true; + } else if (code === 17) { + this.walkanim = dat.g2(); + this.walkanim_b = dat.g2(); + this.walkanim_r = dat.g2(); + this.walkanim_l = dat.g2(); + } else if (code === 18) { + this.category = dat.g2(); + } else if (code >= 30 && code < 40) { + if (!this.op) { + this.op = new Array(5).fill(null); + } + this.op[code - 30] = dat.gjstr(); + if (this.op[code - 30] === "hidden") { + this.op[code - 30] = null; + } + } else if (code === 40) { + const count = dat.g1(); + this.recol_s = new Uint16Array(count); + this.recol_d = new Uint16Array(count); + for (let i = 0; i < count; i++) { + this.recol_s[i] = dat.g2(); + this.recol_d[i] = dat.g2(); + } + } else if (code === 60) { + const count = dat.g1(); + this.heads = new Uint16Array(count); + for (let i = 0; i < count; i++) { + this.heads[i] = dat.g2(); + } + } else if (code === 74) { + this.stats[NpcStat_default.ATTACK] = dat.g2(); + } else if (code === 75) { + this.stats[NpcStat_default.DEFENCE] = dat.g2(); + } else if (code === 76) { + this.stats[NpcStat_default.STRENGTH] = dat.g2(); + } else if (code === 77) { + this.stats[NpcStat_default.HITPOINTS] = dat.g2(); + } else if (code === 78) { + this.stats[NpcStat_default.RANGED] = dat.g2(); + } else if (code === 79) { + this.stats[NpcStat_default.MAGIC] = dat.g2(); + } else if (code === 90) { + this.resizex = dat.g2(); + } else if (code === 91) { + this.resizey = dat.g2(); + } else if (code === 92) { + this.resizez = dat.g2(); + } else if (code === 93) { + this.minimap = false; + } else if (code === 95) { + this.vislevel = dat.g2(); + } else if (code === 97) { + this.resizeh = dat.g2(); + } else if (code === 98) { + this.resizev = dat.g2(); + } else if (code === 200) { + this.wanderrange = dat.g1(); + } else if (code === 201) { + this.maxrange = dat.g1(); + } else if (code === 202) { + this.huntrange = dat.g1(); + } else if (code === 203) { + this.timer = dat.g2(); + } else if (code === 204) { + this.respawnrate = dat.g2(); + } else if (code === 206) { + this.moverestrict = dat.g1(); + } else if (code == 207) { + this.attackrange = dat.g1(); + } else if (code === 208) { + this.blockwalk = dat.g1(); + } else if (code === 209) { + this.huntmode = dat.g1(); + } else if (code === 210) { + this.defaultmode = dat.g1(); + } else if (code === 211) { + this.members = true; + } else if (code === 212) { + const count = dat.g1(); + this.patrolCoord = new Array(count); + this.patrolDelay = new Array(count); + for (let j = 0; j < count; j++) { + this.patrolCoord[j] = dat.g4(); + this.patrolDelay[j] = dat.g1(); + } + } else if (code === 213) { + this.givechase = false; + } else if (code === 249) { + this.params = ParamHelper.decodeParams(dat); + } else if (code === 250) { + this.debugname = dat.gjstr(); + } else { + console.error("Unrecognized npc config code: " + code); + console.error("Try `npm run build` and report an issue if this still happens."); + process.exit(1); + } + } +}; + +// src/lostcity/cache/config/ObjType.ts + +// src/lostcity/cache/config/ParamType.ts +var ParamType = class _ParamType extends ConfigType { + static configNames = /* @__PURE__ */ new Map(); + static configs = []; + static load(dir) { + if (!fs13.existsSync(`${dir}/server/param.dat`)) { + console.log("Warning: No param.dat found."); + return; + } + const dat = Packet.load(`${dir}/server/param.dat`); + this.parse(dat); + } + static async loadAsync(dir) { + const file = await fetch(`${dir}/server/param.dat`); + if (!file.ok) { + console.log("Warning: No param.dat found."); + return; + } + const dat = new Packet(new Uint8Array(await file.arrayBuffer())); + this.parse(dat); + } + static parse(dat) { + _ParamType.configNames = /* @__PURE__ */ new Map(); + _ParamType.configs = []; + const count = dat.g2(); + for (let id = 0; id < count; id++) { + const config = new _ParamType(id); + config.decodeType(dat); + _ParamType.configs[id] = config; + if (config.debugname) { + _ParamType.configNames.set(config.debugname, id); + } + } + } + static get(id) { + return _ParamType.configs[id]; + } + static getId(name) { + return _ParamType.configNames.get(name) ?? -1; + } + static getByName(name) { + const id = this.getId(name); + if (id === -1) { + return null; + } + return this.get(id); + } + static get count() { + return this.configs.length; + } + // ---- + type = ScriptVarType.INT; + defaultInt = -1; + defaultString = null; + autodisable = true; + decode(code, dat) { + if (code === 1) { + this.type = dat.g1(); + } else if (code === 2) { + this.defaultInt = dat.g4(); + } else if (code === 4) { + this.autodisable = false; + } else if (code === 5) { + this.defaultString = dat.gjstr(); + } else if (code === 250) { + this.debugname = dat.gjstr(); + } else { + throw new Error(`Unrecognized param config code: ${code}`); + } + } + getType() { + switch (this.type) { + case ScriptVarType.INT: + return "int"; + case ScriptVarType.STRING: + return "string"; + case ScriptVarType.ENUM: + return "enum"; + case ScriptVarType.OBJ: + return "obj"; + case ScriptVarType.LOC: + return "loc"; + case ScriptVarType.COMPONENT: + return "component"; + case ScriptVarType.NAMEDOBJ: + return "namedobj"; + case ScriptVarType.STRUCT: + return "struct"; + case ScriptVarType.BOOLEAN: + return "boolean"; + case ScriptVarType.COORD: + return "coord"; + case ScriptVarType.CATEGORY: + return "category"; + case ScriptVarType.SPOTANIM: + return "spotanim"; + case ScriptVarType.NPC: + return "npc"; + case ScriptVarType.INV: + return "inv"; + case ScriptVarType.SYNTH: + return "synth"; + case ScriptVarType.SEQ: + return "seq"; + case ScriptVarType.STAT: + return "stat"; + case ScriptVarType.INTERFACE: + return "interface"; + default: + return "unknown"; + } + } + isString() { + return this.type === ScriptVarType.STRING; + } + get default() { + return this.isString() ? this.defaultString : this.defaultInt; + } +}; + +// src/lostcity/util/Environment.ts + +// src/lostcity/util/TryParse.ts +function tryParseBoolean(value, defaultValue) { + if (value === "true" || value === true) { + return true; + } else if (value === "false" || value === false) { + return false; + } else { + return defaultValue; + } +} +function tryParseInt(value, defaultValue) { + if (typeof value === "number") { + return value; + } + if (typeof value !== "string" && typeof value !== "number") { + return defaultValue; + } + const intValue = parseInt(value); + if (!isNaN(intValue)) { + return intValue; + } + return defaultValue; +} +function tryParseString(value, defaultValue) { + if (typeof value !== "string") { + return defaultValue; + } + return value; +} +function tryParseArray(value, defaultValue) { + if (!Array.isArray(value)) { + return defaultValue; + } + return value; +} + +// src/lostcity/util/Environment.ts +var Environment_default = { + /// web server + WEB_PORT: tryParseInt(void 0, false ? 80 : 8888), + WEB_CORS: tryParseBoolean(void 0, true), + /// game server + // world id - offset by 9, so 1 = 10, 2 = 11, etc + NODE_ID: tryParseInt(void 0, 10), + NODE_PORT: tryParseInt(void 0, 43594), + // members content + NODE_MEMBERS: tryParseBoolean(void 0, true), + // addxp multiplier + NODE_XPRATE: tryParseInt(void 0, 1), + // production mode! + NODE_PRODUCTION: tryParseBoolean(void 0, false), + // automatic shutdown time for production mode on sigint + NODE_KILLTIMER: tryParseInt(void 0, 50), + NODE_ALLOW_CHEATS: tryParseBoolean(void 0, true), + // development mode! + NODE_DEBUG: tryParseBoolean(void 0, true), + // measuring script execution + NODE_DEBUG_PROFILE: tryParseBoolean(void 0, false), + // *only* if no login server is running to authenticate accounts, this provides admin accs by username :) + NODE_STAFF: tryParseArray(void 0, ["pazaz"]), + // todo: add staffmodlevel to database + // no server routefinding until 2009 + NODE_CLIENT_ROUTEFINDER: tryParseBoolean(void 0, true), + // controllable for bot testing + NODE_SOCKET_TIMEOUT: tryParseBoolean(void 0, true), + /// login server + LOGIN_HOST: tryParseString(void 0, "localhost"), + LOGIN_PORT: tryParseInt(void 0, 43500), + LOGIN_KEY: tryParseString(void 0, ""), + /// database + DB_HOST: tryParseString(void 0, "localhost"), + DB_USER: tryParseString(void 0, "root"), + DB_PASS: tryParseString(void 0, "password"), + DB_NAME: tryParseString(void 0, "lostcity"), + /// development + // some users may not be able to change their system PATH for this project + BUILD_JAVA_PATH: tryParseString(void 0, "java"), + // auto-build on startup + BUILD_STARTUP: tryParseBoolean(void 0, true), + // auto-update compiler on startup + BUILD_STARTUP_UPDATE: tryParseBoolean(void 0, true), + // used to check if we're producing the original cache without edits + BUILD_VERIFY: tryParseBoolean(void 0, true), + // used to keep some semblance of sanity in our folder structure + BUILD_VERIFY_FOLDER: tryParseBoolean(void 0, true), + // used for unpacking/custom development + BUILD_VERIFY_PACK: tryParseBoolean(void 0, true), + // used for unpacking/custom development + BUILD_SRC_DIR: tryParseString(void 0, "data/src") +}; + +// src/lostcity/cache/config/ObjType.ts +var ObjType = class _ObjType extends ConfigType { + static configNames = /* @__PURE__ */ new Map(); + static configs = []; + static load(dir) { + if (!fs14.existsSync(`${dir}/server/obj.dat`)) { + console.log("Warning: No obj.dat found."); + return; + } + const server = Packet.load(`${dir}/server/obj.dat`); + const jag = Jagfile.load(`${dir}/client/config`); + this.parse(server, jag); + } + static async loadAsync(dir) { + const file = await fetch(`${dir}/server/obj.dat`); + if (!file.ok) { + console.log("Warning: No obj.dat found."); + return; + } + const [server, jag] = await Promise.all([file.arrayBuffer(), Jagfile.loadAsync(`${dir}/client/config`)]); + this.parse(new Packet(new Uint8Array(server)), jag); + } + static parse(server, jag) { + _ObjType.configNames = /* @__PURE__ */ new Map(); + _ObjType.configs = []; + const count = server.g2(); + const client = jag.read("obj.dat"); + client.pos = 2; + for (let id = 0; id < count; id++) { + const config = new _ObjType(id); + config.decodeType(server); + config.decodeType(client); + _ObjType.configs[id] = config; + if (config.debugname) { + _ObjType.configNames.set(config.debugname, id); + } + } + for (let id = 0; id < count; id++) { + const config = _ObjType.configs[id]; + if (config.certtemplate != -1) { + config.toCertificate(); + } + if (!Environment_default.NODE_MEMBERS && config.members) { + config.tradeable = false; + config.op = null; + config.iop = null; + config.params.forEach((_, key) => { + if (ParamType.get(key)?.autodisable) { + config.params.delete(key); + } + }); + } + } + } + static get(id) { + return _ObjType.configs[id]; + } + static getId(name) { + return _ObjType.configNames.get(name) ?? -1; + } + static getByName(name) { + const id = this.getId(name); + if (id === -1) { + return null; + } + return this.get(id); + } + static get count() { + return this.configs.length; + } + static getWearPosId(name) { + switch (name) { + case "hat": + return 0; + case "back": + return 1; + case "front": + return 2; + case "righthand": + return 3; + case "torso": + return 4; + case "lefthand": + return 5; + case "arms": + return 6; + case "legs": + return 7; + case "head": + return 8; + case "hands": + return 9; + case "feet": + return 10; + case "jaw": + return 11; + case "ring": + return 12; + case "quiver": + return 13; + default: + return -1; + } + } + // ---- + model = 0; + name = null; + desc = null; + recol_s = null; + recol_d = null; + zoom2d = 2e3; + xan2d = 0; + yan2d = 0; + zan2d = 0; + xof2d = 0; + yof2d = 0; + code9 = false; + code10 = -1; + stackable = false; + cost = 1; + members = false; + op = null; + iop = null; + manwear = -1; + manwear2 = -1; + manwearOffsetY = 0; + womanwear = -1; + womanwear2 = -1; + womanwearOffsetY = 0; + manwear3 = -1; + womanwear3 = -1; + manhead = -1; + manhead2 = -1; + womanhead = -1; + womanhead2 = -1; + countobj = null; + countco = null; + certlink = -1; + certtemplate = -1; + // server-side + wearpos = -1; + wearpos2 = -1; + wearpos3 = -1; + weight = 0; + // in grams + category = -1; + dummyitem = 0; + tradeable = false; + respawnrate = 100; + // default to 1-minute + params = /* @__PURE__ */ new Map(); + decode(code, dat) { + if (code === 1) { + this.model = dat.g2(); + } else if (code === 2) { + this.name = dat.gjstr(); + } else if (code === 3) { + this.desc = dat.gjstr(); + } else if (code === 4) { + this.zoom2d = dat.g2(); + } else if (code === 5) { + this.xan2d = dat.g2(); + } else if (code === 6) { + this.yan2d = dat.g2(); + } else if (code === 7) { + this.xof2d = dat.g2s(); + } else if (code === 8) { + this.yof2d = dat.g2s(); + } else if (code === 9) { + this.code9 = true; + } else if (code === 10) { + this.code10 = dat.g2(); + } else if (code === 11) { + this.stackable = true; + } else if (code === 12) { + this.cost = dat.g4(); + } else if (code === 13) { + this.wearpos = dat.g1(); + } else if (code === 14) { + this.wearpos2 = dat.g1(); + } else if (code === 16) { + this.members = true; + } else if (code === 23) { + this.manwear = dat.g2(); + this.manwearOffsetY = dat.g1b(); + } else if (code === 24) { + this.manwear2 = dat.g2(); + } else if (code === 25) { + this.womanwear = dat.g2(); + this.womanwearOffsetY = dat.g1b(); + } else if (code === 26) { + this.womanwear2 = dat.g2(); + } else if (code === 27) { + this.wearpos3 = dat.g1(); + } else if (code >= 30 && code < 35) { + if (!this.op) { + this.op = new Array(5).fill(null); + } + this.op[code - 30] = dat.gjstr(); + } else if (code >= 35 && code < 40) { + if (!this.iop) { + this.iop = new Array(5).fill(null); + } + this.iop[code - 35] = dat.gjstr(); + } else if (code === 40) { + const count = dat.g1(); + this.recol_s = new Uint16Array(count); + this.recol_d = new Uint16Array(count); + for (let i = 0; i < count; i++) { + this.recol_s[i] = dat.g2(); + this.recol_d[i] = dat.g2(); + } + } else if (code === 75) { + this.weight = dat.g2s(); + } else if (code === 78) { + this.manwear3 = dat.g2(); + } else if (code === 79) { + this.womanwear3 = dat.g2(); + } else if (code === 90) { + this.manhead = dat.g2(); + } else if (code === 91) { + this.womanhead = dat.g2(); + } else if (code === 92) { + this.manhead2 = dat.g2(); + } else if (code === 93) { + this.womanhead2 = dat.g2(); + } else if (code === 94) { + this.category = dat.g2(); + } else if (code === 95) { + this.zan2d = dat.g2(); + } else if (code === 96) { + this.dummyitem = dat.g1(); + } else if (code === 97) { + this.certlink = dat.g2(); + } else if (code === 98) { + this.certtemplate = dat.g2(); + } else if (code >= 100 && code < 110) { + if (!this.countobj || !this.countco) { + this.countobj = new Uint16Array(10); + this.countco = new Uint16Array(10); + } + this.countobj[code - 100] = dat.g2(); + this.countco[code - 100] = dat.g2(); + } else if (code === 200) { + this.tradeable = true; + } else if (code === 201) { + this.respawnrate = dat.g2(); + } else if (code === 249) { + this.params = ParamHelper.decodeParams(dat); + } else if (code === 250) { + this.debugname = dat.gjstr(); + } else { + throw new Error(`Unrecognized obj config code: ${code}`); + } + } + toCertificate() { + const template = _ObjType.get(this.certtemplate); + this.model = template.model; + this.zoom2d = template.zoom2d; + this.xan2d = template.xan2d; + this.yan2d = template.yan2d; + this.zan2d = template.zan2d; + this.xof2d = template.xof2d; + this.yof2d = template.yof2d; + this.recol_s = template.recol_s; + this.recol_d = template.recol_d; + const link = _ObjType.get(this.certlink); + this.name = link.name; + this.members = link.members; + this.cost = link.cost; + this.tradeable = link.tradeable; + let article = "a"; + const c = (link.name || "").toLowerCase().charAt(0); + if (c === "a" || c === "e" || c === "i" || c === "o" || c === "u") { + article = "an"; + } + this.desc = `Swap this note at any bank for ${article} ${link.name}.`; + this.stackable = true; + } +}; + +// src/lostcity/cache/config/SeqFrame.ts +var SeqFrame = class _SeqFrame { + static instances = []; + static load(dir) { + if (!fs15.existsSync(`${dir}/server/frame_del.dat`)) { + console.log("Warning: No frame_del.dat found."); + return; + } + const dat = Packet.load(`${dir}/server/frame_del.dat`); + this.parse(dat); + } + static async loadAsync(dir) { + const file = await fetch(`${dir}/server/frame_del.dat`); + if (!file.ok) { + console.log("Warning: No frame_del.dat found."); + return; + } + const dat = new Packet(new Uint8Array(await file.arrayBuffer())); + this.parse(dat); + } + static parse(dat) { + _SeqFrame.instances = []; + for (let i = 0; i < dat.data.length; i++) { + const frame = new _SeqFrame(); + frame.delay = dat.g1(); + _SeqFrame.instances[i] = frame; + } + } + // ---- + delay = 0; +}; + +// src/lostcity/cache/config/SeqType.ts +var SeqType = class _SeqType extends ConfigType { + static configNames = /* @__PURE__ */ new Map(); + static configs = []; + static load(dir) { + if (!fs16.existsSync(`${dir}/server/seq.dat`)) { + console.log("Warning: No seq.dat found."); + return; + } + const server = Packet.load(`${dir}/server/seq.dat`); + const jag = Jagfile.load(`${dir}/client/config`); + this.parse(server, jag); + } + static async loadAsync(dir) { + const file = await fetch(`${dir}/server/seq.dat`); + if (!file.ok) { + console.log("Warning: No seq.dat found."); + return; + } + const [server, jag] = await Promise.all([file.arrayBuffer(), Jagfile.loadAsync(`${dir}/client/config`)]); + this.parse(new Packet(new Uint8Array(server)), jag); + } + static parse(server, jag) { + _SeqType.configNames = /* @__PURE__ */ new Map(); + _SeqType.configs = []; + const count = server.g2(); + const client = jag.read("seq.dat"); + client.pos = 2; + for (let id = 0; id < count; id++) { + const config = new _SeqType(id); + config.decodeType(server); + config.decodeType(client); + _SeqType.configs[id] = config; + if (config.debugname) { + _SeqType.configNames.set(config.debugname, id); + } + } + } + static get(id) { + return _SeqType.configs[id]; + } + static getId(name) { + return _SeqType.configNames.get(name) ?? -1; + } + static getByName(name) { + const id = this.getId(name); + if (id === -1) { + return null; + } + return this.get(id); + } + static get count() { + return _SeqType.configs.length; + } + // ---- + frames = null; + iframes = null; + delay = null; + replayoff = -1; + walkmerge = null; + stretches = false; + priority = 5; + mainhand = -1; + offhand = -1; + replaycount = 99; + duration = 0; + decode(code, dat) { + if (code === 1) { + const count = dat.g1(); + this.frames = new Int32Array(count); + this.iframes = new Int32Array(count); + this.delay = new Int32Array(count); + for (let i = 0; i < count; i++) { + this.frames[i] = dat.g2(); + this.iframes[i] = dat.g2(); + if (this.iframes[i] === 65535) { + this.iframes[i] = -1; + } + this.delay[i] = dat.g2(); + if (this.delay[i] === 0) { + this.delay[i] = SeqFrame.instances[this.frames[i]].delay; + } + if (this.delay[i] === 0) { + this.delay[i] = 1; + } + this.duration += this.delay[i]; + } + } else if (code === 2) { + this.replayoff = dat.g2(); + } else if (code === 3) { + const count = dat.g1(); + this.walkmerge = new Int32Array(count + 1); + for (let i = 0; i < count; i++) { + this.walkmerge[i] = dat.g1(); + } + this.walkmerge[count] = 9999999; + } else if (code === 4) { + this.stretches = true; + } else if (code === 5) { + this.priority = dat.g1(); + } else if (code === 6) { + this.mainhand = dat.g2(); + } else if (code === 7) { + this.offhand = dat.g2(); + } else if (code === 8) { + this.replaycount = dat.g1(); + } else if (code === 250) { + this.debugname = dat.gjstr(); + } else { + throw new Error(`Unrecognized seq config code: ${code}`); + } + } +}; + +// src/lostcity/cache/config/StructType.ts +var StructType = class _StructType extends ConfigType { + static configNames = /* @__PURE__ */ new Map(); + static configs = []; + static load(dir) { + if (!fs17.existsSync(`${dir}/server/struct.dat`)) { + console.log("Warning: No struct.dat found."); + return; + } + const dat = Packet.load(`${dir}/server/struct.dat`); + this.parse(dat); + } + static async loadAsync(dir) { + const file = await fetch(`${dir}/server/struct.dat`); + if (!file.ok) { + console.log("Warning: No struct.dat found."); + return; + } + const dat = new Packet(new Uint8Array(await file.arrayBuffer())); + this.parse(dat); + } + static parse(dat) { + _StructType.configNames = /* @__PURE__ */ new Map(); + _StructType.configs = []; + const count = dat.g2(); + for (let id = 0; id < count; id++) { + const config = new _StructType(id); + config.decodeType(dat); + _StructType.configs[id] = config; + if (config.debugname) { + _StructType.configNames.set(config.debugname, id); + } + } + } + static get(id) { + return _StructType.configs[id]; + } + static getId(name) { + return _StructType.configNames.get(name) ?? -1; + } + static getByName(name) { + const id = this.getId(name); + if (id === -1) { + return null; + } + return this.get(id); + } + static get count() { + return this.configs.length; + } + // ---- + params = null; + decode(code, dat) { + if (code === 249) { + this.params = ParamHelper.decodeParams(dat); + } else if (code === 250) { + this.debugname = dat.gjstr(); + } else { + throw new Error(`Unrecognized struct config code: ${code}`); + } + } +}; + +// src/lostcity/cache/config/VarNpcType.ts +var VarNpcType = class _VarNpcType extends ConfigType { + static configNames = /* @__PURE__ */ new Map(); + static configs = []; + static load(dir) { + if (!fs18.existsSync(`${dir}/server/varn.dat`)) { + console.log("Warning: No varn.dat found."); + return; + } + const dat = Packet.load(`${dir}/server/varn.dat`); + this.parse(dat); + } + static async loadAsync(dir) { + const file = await fetch(`${dir}/server/varn.dat`); + if (!file.ok) { + console.log("Warning: No varn.dat found."); + return; + } + const dat = new Packet(new Uint8Array(await file.arrayBuffer())); + this.parse(dat); + } + static parse(dat) { + _VarNpcType.configNames = /* @__PURE__ */ new Map(); + _VarNpcType.configs = []; + const count = dat.g2(); + for (let id = 0; id < count; id++) { + const config = new _VarNpcType(id); + config.decodeType(dat); + _VarNpcType.configs[id] = config; + if (config.debugname) { + _VarNpcType.configNames.set(config.debugname, id); + } + } + } + static get(id) { + return _VarNpcType.configs[id]; + } + static getId(name) { + return _VarNpcType.configNames.get(name) ?? -1; + } + static getByName(name) { + const id = this.getId(name); + if (id === -1) { + return null; + } + return this.get(id); + } + static get count() { + return this.configs.length; + } + // ---- + type = ScriptVarType.INT; + decode(code, dat) { + if (code === 1) { + this.type = dat.g1(); + } else if (code === 250) { + this.debugname = dat.gjstr(); + } else { + console.error(`Unrecognized varn config code: ${code}`); + } + } +}; + +// src/lostcity/cache/config/VarPlayerType.ts +var VarPlayerType = class _VarPlayerType extends ConfigType { + static configNames = /* @__PURE__ */ new Map(); + static configs = []; + static SCOPE_TEMP = 0; + static SCOPE_PERM = 1; + // commonly referenced in-engine + static PLAYER_RUN = -1; + static TEMP_RUN = -1; + static LASTCOMBAT = -1; + static load(dir) { + if (!fs19.existsSync(`${dir}/server/varp.dat`)) { + console.log("Warning: No varp.dat found."); + return; + } + const server = Packet.load(`${dir}/server/varp.dat`); + const jag = Jagfile.load(`${dir}/client/config`); + this.parse(server, jag); + } + static async loadAsync(dir) { + const file = await fetch(`${dir}/server/varp.dat`); + if (!file.ok) { + console.log("Warning: No varp.dat found."); + return; + } + const [server, jag] = await Promise.all([file.arrayBuffer(), Jagfile.loadAsync(`${dir}/client/config`)]); + this.parse(new Packet(new Uint8Array(server)), jag); + } + static parse(server, jag) { + _VarPlayerType.configNames = /* @__PURE__ */ new Map(); + _VarPlayerType.configs = []; + const count = server.g2(); + const client = jag.read("varp.dat"); + client.pos = 2; + for (let id = 0; id < count; id++) { + const config = new _VarPlayerType(id); + config.decodeType(server); + config.decodeType(client); + _VarPlayerType.configs[id] = config; + if (config.debugname) { + _VarPlayerType.configNames.set(config.debugname, id); + } + } + _VarPlayerType.PLAYER_RUN = _VarPlayerType.getId("player_run"); + _VarPlayerType.TEMP_RUN = _VarPlayerType.getId("temp_run"); + _VarPlayerType.LASTCOMBAT = _VarPlayerType.getId("lastcombat"); + } + static get(id) { + return _VarPlayerType.configs[id]; + } + static getId(name) { + return _VarPlayerType.configNames.get(name) ?? -1; + } + static getByName(name) { + const id = this.getId(name); + if (id === -1) { + return null; + } + return this.get(id); + } + static get count() { + return this.configs.length; + } + // ---- + clientcode = 0; + // server-side + scope = _VarPlayerType.SCOPE_TEMP; + type = ScriptVarType.INT; + protect = true; + transmit = false; + decode(code, dat) { + if (code === 1) { + this.scope = dat.g1(); + } else if (code === 2) { + this.type = dat.g1(); + } else if (code === 4) { + this.protect = false; + } else if (code === 5) { + this.clientcode = dat.g2(); + } else if (code === 6) { + this.transmit = true; + } else if (code === 250) { + this.debugname = dat.gjstr(); + } else { + console.error(`Unrecognized varp config code: ${code}`); + } + } +}; + +// src/lostcity/cache/config/VarSharedType.ts +var VarSharedType = class _VarSharedType extends ConfigType { + static configNames = /* @__PURE__ */ new Map(); + static configs = []; + static load(dir) { + if (!fs20.existsSync(`${dir}/server/vars.dat`)) { + console.log("Warning: No vars.dat found."); + return; + } + const dat = Packet.load(`${dir}/server/vars.dat`); + this.parse(dat); + } + static async loadAsync(dir) { + const file = await fetch(`${dir}/server/vars.dat`); + if (!file.ok) { + console.log("Warning: No vars.dat found."); + return; + } + const dat = new Packet(new Uint8Array(await file.arrayBuffer())); + this.parse(dat); + } + static parse(dat) { + _VarSharedType.configNames = /* @__PURE__ */ new Map(); + _VarSharedType.configs = []; + const count = dat.g2(); + for (let id = 0; id < count; id++) { + const config = new _VarSharedType(id); + config.decodeType(dat); + _VarSharedType.configs[id] = config; + if (config.debugname) { + _VarSharedType.configNames.set(config.debugname, id); + } + } + } + static get(id) { + return _VarSharedType.configs[id]; + } + static getId(name) { + return _VarSharedType.configNames.get(name) ?? -1; + } + static getByName(name) { + const id = this.getId(name); + if (id === -1) { + return null; + } + return this.get(id); + } + static get count() { + return this.configs.length; + } + // ---- + type = ScriptVarType.INT; + decode(code, dat) { + switch (code) { + case 1: + this.type = dat.g1(); + break; + case 250: + this.debugname = dat.gjstr(); + break; + default: + console.error(`Unrecognized vars config code: ${code}`); + break; + } + } +}; + +// src/lostcity/cache/wordenc/WordEnc.ts + +// src/lostcity/cache/wordenc/WordEncFragments.ts +var WordEncFragments = class { + fragments = []; + filter(chars) { + for (let currentIndex = 0; currentIndex < chars.length; ) { + const numberIndex = this.indexOfNumber(chars, currentIndex); + if (numberIndex === -1) { + return; + } + let isSymbolOrNotLowercaseAlpha = false; + for (let index = currentIndex; index >= 0 && index < numberIndex && !isSymbolOrNotLowercaseAlpha; index++) { + if (!WordEnc.isSymbol(chars[index]) && !WordEnc.isNotLowercaseAlpha(chars[index])) { + isSymbolOrNotLowercaseAlpha = true; + } + } + let startIndex = 0; + if (isSymbolOrNotLowercaseAlpha) { + startIndex = 0; + } + if (startIndex === 0) { + startIndex = 1; + currentIndex = numberIndex; + } + let value = 0; + for (let index = numberIndex; index < chars.length && index < currentIndex; index++) { + value = value * 10 + chars[index].charCodeAt(0) - 48; + } + if (value <= 255 && currentIndex - numberIndex <= 8) { + startIndex++; + } else { + startIndex = 0; + } + if (startIndex === 4) { + WordEnc.maskChars(numberIndex, currentIndex, chars); + startIndex = 0; + } + currentIndex = this.indexOfNonNumber(currentIndex, chars); + } + } + isBadFragment(chars) { + if (WordEnc.isNumericalChars(chars)) { + return true; + } + const value = this.getInteger(chars); + const fragments = this.fragments; + const fragmentsLength = fragments.length; + if (value === fragments[0] || value === fragments[fragmentsLength - 1]) { + return true; + } + let start = 0; + let end = fragmentsLength - 1; + while (start <= end) { + const mid = (start + end) / 2 | 0; + if (value === fragments[mid]) { + return true; + } else if (value < fragments[mid]) { + end = mid - 1; + } else { + start = mid + 1; + } + } + return false; + } + getInteger(chars) { + if (chars.length > 6) { + return 0; + } + let value = 0; + for (let index = 0; index < chars.length; index++) { + const char = chars[chars.length - index - 1]; + if (WordEnc.isLowercaseAlpha(char)) { + value = value * 38 + char.charCodeAt(0) + 1 - "a".charCodeAt(0); + } else if (char == "'") { + value = value * 38 + 27; + } else if (WordEnc.isNumerical(char)) { + value = value * 38 + char.charCodeAt(0) + 28 - "0".charCodeAt(0); + } else if (char != "\0") { + return 0; + } + } + return value; + } + indexOfNumber(chars, offset) { + for (let index = offset; index < chars.length && index >= 0; index++) { + if (WordEnc.isNumerical(chars[index])) { + return index; + } + } + return -1; + } + indexOfNonNumber(offset, chars) { + for (let index = offset; index < chars.length && index >= 0; index++) { + if (!WordEnc.isNumerical(chars[index])) { + return index; + } + } + return chars.length; + } +}; + +// src/lostcity/cache/wordenc/WordEncBadWords.ts +var WordEncBadWords = class { + wordEncFragments; + bads = []; + badCombinations = []; + constructor(wordEncFragments) { + this.wordEncFragments = wordEncFragments; + } + filter(chars) { + for (let comboIndex = 0; comboIndex < 2; comboIndex++) { + for (let index = this.bads.length - 1; index >= 0; index--) { + this.filterBadCombinations(this.badCombinations[index], chars, this.bads[index]); + } + } + } + filterBadCombinations(combos, chars, bads) { + if (bads.length > chars.length) { + return; + } + for (let startIndex = 0; startIndex <= chars.length - bads.length; startIndex++) { + let currentIndex = startIndex; + const { currentIndex: updatedCurrentIndex, badIndex, hasSymbol, hasNumber, hasDigit } = this.processBadCharacters(chars, bads, currentIndex); + currentIndex = updatedCurrentIndex; + let currentChar = chars[currentIndex]; + let nextChar = currentIndex + 1 < chars.length ? chars[currentIndex + 1] : "\0"; + if (!(badIndex >= bads.length && (!hasNumber || !hasDigit))) { + continue; + } + let shouldFilter = true; + let localIndex; + if (hasSymbol) { + let isBeforeSymbol = false; + let isAfterSymbol = false; + if (startIndex - 1 < 0 || WordEnc.isSymbol(chars[startIndex - 1]) && chars[startIndex - 1] != "'") { + isBeforeSymbol = true; + } + if (currentIndex >= chars.length || WordEnc.isSymbol(chars[currentIndex]) && chars[currentIndex] != "'") { + isAfterSymbol = true; + } + if (!isBeforeSymbol || !isAfterSymbol) { + let isSubstringValid = false; + localIndex = startIndex - 2; + if (isBeforeSymbol) { + localIndex = startIndex; + } + while (!isSubstringValid && localIndex < currentIndex) { + if (localIndex >= 0 && (!WordEnc.isSymbol(chars[localIndex]) || chars[localIndex] == "'")) { + const localSubString = []; + let localSubStringIndex; + for (localSubStringIndex = 0; localSubStringIndex < 3 && localIndex + localSubStringIndex < chars.length && (!WordEnc.isSymbol(chars[localIndex + localSubStringIndex]) || chars[localIndex + localSubStringIndex] == "'"); localSubStringIndex++) { + localSubString[localSubStringIndex] = chars[localIndex + localSubStringIndex]; + } + let isSubStringValidCondition = true; + if (localSubStringIndex == 0) { + isSubStringValidCondition = false; + } + if (localSubStringIndex < 3 && localIndex - 1 >= 0 && (!WordEnc.isSymbol(chars[localIndex - 1]) || chars[localIndex - 1] == "'")) { + isSubStringValidCondition = false; + } + if (isSubStringValidCondition && !this.wordEncFragments.isBadFragment(localSubString)) { + isSubstringValid = true; + } + } + localIndex++; + } + if (!isSubstringValid) { + shouldFilter = false; + } + } + } else { + currentChar = " "; + if (startIndex - 1 >= 0) { + currentChar = chars[startIndex - 1]; + } + nextChar = " "; + if (currentIndex < chars.length) { + nextChar = chars[currentIndex]; + } + const current = this.getIndex(currentChar); + const next = this.getIndex(nextChar); + if (combos != null && this.comboMatches(current, combos, next)) { + shouldFilter = false; + } + } + if (!shouldFilter) { + continue; + } + let numeralCount = 0; + let alphaCount = 0; + for (let index = startIndex; index < currentIndex; index++) { + if (WordEnc.isNumerical(chars[index])) { + numeralCount++; + } else if (WordEnc.isAlpha(chars[index])) { + alphaCount++; + } + } + if (numeralCount <= alphaCount) { + WordEnc.maskChars(startIndex, currentIndex, chars); + } + } + } + processBadCharacters(chars, bads, startIndex) { + let index = startIndex; + let badIndex = 0; + let count = 0; + let hasSymbol = false; + let hasNumber = false; + let hasDigit = false; + for (; index < chars.length && !(hasNumber && hasDigit); ) { + if (index >= chars.length || hasNumber && hasDigit) { + break; + } + const currentChar = chars[index]; + const nextChar = index + 1 < chars.length ? chars[index + 1] : "\0"; + let currentLength; + if (badIndex < bads.length && (currentLength = this.getEmulatedBadCharLen(nextChar, String.fromCharCode(bads[badIndex]), currentChar)) > 0) { + if (currentLength === 1 && WordEnc.isNumerical(currentChar)) { + hasNumber = true; + } + if (currentLength === 2 && (WordEnc.isNumerical(currentChar) || WordEnc.isNumerical(nextChar))) { + hasNumber = true; + } + index += currentLength; + badIndex++; + } else { + if (badIndex === 0) { + break; + } + let previousLength; + if ((previousLength = this.getEmulatedBadCharLen(nextChar, String.fromCharCode(bads[badIndex - 1]), currentChar)) > 0) { + index += previousLength; + } else { + if (badIndex >= bads.length || !WordEnc.isNotLowercaseAlpha(currentChar)) { + break; + } + if (WordEnc.isSymbol(currentChar) && currentChar !== "'") { + hasSymbol = true; + } + if (WordEnc.isNumerical(currentChar)) { + hasDigit = true; + } + index++; + count++; + if ((count * 100 / (index - startIndex) | 0) > 90) { + break; + } + } + } + } + return { + currentIndex: index, + badIndex, + hasSymbol, + hasNumber, + hasDigit + }; + } + getEmulatedBadCharLen(nextChar, badChar, currentChar) { + if (badChar == currentChar) { + return 1; + } + if (badChar >= "a" && badChar <= "m") { + if (badChar == "a") { + if (currentChar != "4" && currentChar != "@" && currentChar != "^") { + if (currentChar == "/" && nextChar == "\\") { + return 2; + } + return 0; + } + return 1; + } + if (badChar == "b") { + if (currentChar != "6" && currentChar != "8") { + if (currentChar == "1" && nextChar == "3") { + return 2; + } + return 0; + } + return 1; + } + if (badChar == "c") { + if (currentChar != "(" && currentChar != "<" && currentChar != "{" && currentChar != "[") { + return 0; + } + return 1; + } + if (badChar == "d") { + if (currentChar == "[" && nextChar == ")") { + return 2; + } + return 0; + } + if (badChar == "e") { + if (currentChar != "3" && currentChar != "\u20AC") { + return 0; + } + return 1; + } + if (badChar == "f") { + if (currentChar == "p" && nextChar == "h") { + return 2; + } + if (currentChar == "\xA3") { + return 1; + } + return 0; + } + if (badChar == "g") { + if (currentChar != "9" && currentChar != "6") { + return 0; + } + return 1; + } + if (badChar == "h") { + if (currentChar == "#") { + return 1; + } + return 0; + } + if (badChar == "i") { + if (currentChar != "y" && currentChar != "l" && currentChar != "j" && currentChar != "1" && currentChar != "!" && currentChar != ":" && currentChar != ";" && currentChar != "|") { + return 0; + } + return 1; + } + if (badChar == "j") { + return 0; + } + if (badChar == "k") { + return 0; + } + if (badChar == "l") { + if (currentChar != "1" && currentChar != "|" && currentChar != "i") { + return 0; + } + return 1; + } + if (badChar == "m") { + return 0; + } + } + if (badChar >= "n" && badChar <= "z") { + if (badChar == "n") { + return 0; + } + if (badChar == "o") { + if (currentChar != "0" && currentChar != "*") { + if ((currentChar != "(" || nextChar != ")") && (currentChar != "[" || nextChar != "]") && (currentChar != "{" || nextChar != "}") && (currentChar != "<" || nextChar != ">")) { + return 0; + } + return 2; + } + return 1; + } + if (badChar == "p") { + return 0; + } + if (badChar == "q") { + return 0; + } + if (badChar == "r") { + return 0; + } + if (badChar == "s") { + if (currentChar != "5" && currentChar != "z" && currentChar != "$" && currentChar != "2") { + return 0; + } + return 1; + } + if (badChar == "t") { + if (currentChar != "7" && currentChar != "+") { + return 0; + } + return 1; + } + if (badChar == "u") { + if (currentChar == "v") { + return 1; + } + if ((currentChar != "\\" || nextChar != "/") && (currentChar != "\\" || nextChar != "|") && (currentChar != "|" || nextChar != "/")) { + return 0; + } + return 2; + } + if (badChar == "v") { + if ((currentChar != "\\" || nextChar != "/") && (currentChar != "\\" || nextChar != "|") && (currentChar != "|" || nextChar != "/")) { + return 0; + } + return 2; + } + if (badChar == "w") { + if (currentChar == "v" && nextChar == "v") { + return 2; + } + return 0; + } + if (badChar == "x") { + if ((currentChar != ")" || nextChar != "(") && (currentChar != "}" || nextChar != "{") && (currentChar != "]" || nextChar != "[") && (currentChar != ">" || nextChar != "<")) { + return 0; + } + return 2; + } + if (badChar == "y") { + return 0; + } + if (badChar == "z") { + return 0; + } + } + if (badChar >= "0" && badChar <= "9") { + if (badChar == "0") { + if (currentChar == "o" || currentChar == "O") { + return 1; + } else if ((currentChar != "(" || nextChar != ")") && (currentChar != "{" || nextChar != "}") && (currentChar != "[" || nextChar != "]")) { + return 0; + } else { + return 2; + } + } else if (badChar == "1") { + return currentChar == "l" ? 1 : 0; + } else { + return 0; + } + } else if (badChar == ",") { + return currentChar == "." ? 1 : 0; + } else if (badChar == ".") { + return currentChar == "," ? 1 : 0; + } else if (badChar == "!") { + return currentChar == "i" ? 1 : 0; + } + return 0; + } + comboMatches(currentIndex, combos, nextIndex) { + let start = 0; + let end = combos.length - 1; + while (start <= end) { + const mid = (start + end) / 2 | 0; + if (combos[mid][0] === currentIndex && combos[mid][1] === nextIndex) { + return true; + } else if (currentIndex < combos[mid][0] || currentIndex === combos[mid][0] && nextIndex < combos[mid][1]) { + end = mid - 1; + } else { + start = mid + 1; + } + } + return false; + } + getIndex(char) { + if (WordEnc.isLowercaseAlpha(char)) { + return char.charCodeAt(0) + 1 - "a".charCodeAt(0); + } else if (char == "'") { + return 28; + } else if (WordEnc.isNumerical(char)) { + return char.charCodeAt(0) + 29 - "0".charCodeAt(0); + } + return 27; + } +}; + +// src/lostcity/cache/wordenc/WordEncDomains.ts +var WordEncDomains = class { + wordEncBadWords; + domains = []; + constructor(wordEncBadWords) { + this.wordEncBadWords = wordEncBadWords; + } + filter(chars) { + const ampersat = [...chars]; + const period = [...chars]; + this.wordEncBadWords.filterBadCombinations(null, ampersat, WordEnc.AMPERSAT); + this.wordEncBadWords.filterBadCombinations(null, period, WordEnc.PERIOD); + for (let index = this.domains.length - 1; index >= 0; index--) { + this.filterDomain(period, ampersat, this.domains[index], chars); + } + } + getEmulatedDomainCharLen(nextChar, domainChar, currentChar) { + if (domainChar == currentChar) { + return 1; + } else if (domainChar == "o" && currentChar == "0") { + return 1; + } else if (domainChar == "o" && currentChar == "(" && nextChar == ")") { + return 2; + } else if (domainChar == "c" && (currentChar == "(" || currentChar == "<" || currentChar == "[")) { + return 1; + } else if (domainChar == "e" && currentChar == "\u20AC") { + return 1; + } else if (domainChar == "s" && currentChar == "$") { + return 1; + } else if (domainChar == "l" && currentChar == "i") { + return 1; + } + return 0; + } + filterDomain(period, ampersat, domain, chars) { + const domainLength = domain.length; + const charsLength = chars.length; + for (let index = 0; index <= charsLength - domainLength; index++) { + const { matched, currentIndex } = this.findMatchingDomain(index, domain, chars); + if (!matched) { + continue; + } + const ampersatStatus = WordEnc.prefixSymbolStatus(index, chars, 3, ampersat, ["@"]); + const periodStatus = WordEnc.suffixSymbolStatus(currentIndex - 1, chars, 3, period, [".", ","]); + const shouldFilter = ampersatStatus > 2 || periodStatus > 2; + if (!shouldFilter) { + continue; + } + WordEnc.maskChars(index, currentIndex, chars); + } + } + findMatchingDomain(startIndex, domain, chars) { + const domainLength = domain.length; + let currentIndex = startIndex; + let domainIndex = 0; + while (currentIndex < chars.length && domainIndex < domainLength) { + const currentChar = chars[currentIndex]; + const nextChar = currentIndex + 1 < chars.length ? chars[currentIndex + 1] : "\0"; + const currentLength = this.getEmulatedDomainCharLen(nextChar, String.fromCharCode(domain[domainIndex]), currentChar); + if (currentLength > 0) { + currentIndex += currentLength; + domainIndex++; + } else { + if (domainIndex === 0) break; + const previousLength = this.getEmulatedDomainCharLen(nextChar, String.fromCharCode(domain[domainIndex - 1]), currentChar); + if (previousLength > 0) { + currentIndex += previousLength; + if (domainIndex === 1) startIndex++; + } else { + if (domainIndex >= domainLength || !WordEnc.isSymbol(currentChar)) break; + currentIndex++; + } + } + } + return { matched: domainIndex >= domainLength, currentIndex }; + } +}; + +// src/lostcity/cache/wordenc/WordEncTlds.ts +var WordEncTlds = class { + wordEncBadWords; + wordEncDomains; + tlds = []; + tldTypes = []; + constructor(wordEncBadWords, wordEncDomains) { + this.wordEncBadWords = wordEncBadWords; + this.wordEncDomains = wordEncDomains; + } + filter(chars) { + const period = [...chars]; + const slash = [...chars]; + this.wordEncBadWords.filterBadCombinations(null, period, WordEnc.PERIOD); + this.wordEncBadWords.filterBadCombinations(null, slash, WordEnc.SLASH); + for (let index = 0; index < this.tlds.length; index++) { + this.filterTld(slash, this.tldTypes[index], chars, this.tlds[index], period); + } + } + filterTld(slash, tldType, chars, tld, period) { + if (tld.length > chars.length) { + return; + } + for (let index = 0; index <= chars.length - tld.length; index++) { + const { currentIndex, tldIndex } = this.processTlds(chars, tld, index); + if (tldIndex < tld.length) { + continue; + } + let shouldFilter = false; + const periodFilterStatus = WordEnc.prefixSymbolStatus(index, chars, 3, period, [",", "."]); + const slashFilterStatus = WordEnc.suffixSymbolStatus(currentIndex - 1, chars, 5, slash, ["\\", "/"]); + if (tldType == 1 && periodFilterStatus > 0 && slashFilterStatus > 0) { + shouldFilter = true; + } + if (tldType == 2 && (periodFilterStatus > 2 && slashFilterStatus > 0 || periodFilterStatus > 0 && slashFilterStatus > 2)) { + shouldFilter = true; + } + if (tldType == 3 && periodFilterStatus > 0 && slashFilterStatus > 2) { + shouldFilter = true; + } + if (!shouldFilter) { + continue; + } + let startFilterIndex = index; + let endFilterIndex = currentIndex - 1; + let foundPeriod = false; + let periodIndex; + if (periodFilterStatus > 2) { + if (periodFilterStatus == 4) { + foundPeriod = false; + for (periodIndex = index - 1; periodIndex >= 0; periodIndex--) { + if (foundPeriod) { + if (period[periodIndex] != "*") { + break; + } + startFilterIndex = periodIndex; + } else if (period[periodIndex] == "*") { + startFilterIndex = periodIndex; + foundPeriod = true; + } + } + } + foundPeriod = false; + for (periodIndex = startFilterIndex - 1; periodIndex >= 0; periodIndex--) { + if (foundPeriod) { + if (WordEnc.isSymbol(chars[periodIndex])) { + break; + } + startFilterIndex = periodIndex; + } else if (!WordEnc.isSymbol(chars[periodIndex])) { + foundPeriod = true; + startFilterIndex = periodIndex; + } + } + } + if (slashFilterStatus > 2) { + if (slashFilterStatus == 4) { + foundPeriod = false; + for (periodIndex = endFilterIndex + 1; periodIndex < chars.length; periodIndex++) { + if (foundPeriod) { + if (slash[periodIndex] != "*") { + break; + } + endFilterIndex = periodIndex; + } else if (slash[periodIndex] == "*") { + endFilterIndex = periodIndex; + foundPeriod = true; + } + } + } + foundPeriod = false; + for (periodIndex = endFilterIndex + 1; periodIndex < chars.length; periodIndex++) { + if (foundPeriod) { + if (WordEnc.isSymbol(chars[periodIndex])) { + break; + } + endFilterIndex = periodIndex; + } else if (!WordEnc.isSymbol(chars[periodIndex])) { + foundPeriod = true; + endFilterIndex = periodIndex; + } + } + } + WordEnc.maskChars(startFilterIndex, endFilterIndex + 1, chars); + } + } + processTlds(chars, tld, currentIndex) { + let tldIndex = 0; + while (currentIndex < chars.length && tldIndex < tld.length) { + const currentChar = chars[currentIndex]; + const nextChar = currentIndex + 1 < chars.length ? chars[currentIndex + 1] : "\0"; + let currentLength; + if ((currentLength = this.wordEncDomains.getEmulatedDomainCharLen(nextChar, String.fromCharCode(tld[tldIndex]), currentChar)) > 0) { + currentIndex += currentLength; + tldIndex++; + } else { + if (tldIndex === 0) { + break; + } + let previousLength; + if ((previousLength = this.wordEncDomains.getEmulatedDomainCharLen(nextChar, String.fromCharCode(tld[tldIndex - 1]), currentChar)) > 0) { + currentIndex += previousLength; + } else { + if (!WordEnc.isSymbol(currentChar)) { + break; + } + currentIndex++; + } + } + } + return { currentIndex, tldIndex }; + } +}; + +// src/lostcity/cache/wordenc/WordEnc.ts +var WordEnc = class _WordEnc { + static PERIOD = new Uint16Array( + ["d", "o", "t"].join("").split("").map((char) => char.charCodeAt(0)) + ); + static AMPERSAT = new Uint16Array( + ["(", "a", ")"].join("").split("").map((char) => char.charCodeAt(0)) + ); + static SLASH = new Uint16Array( + ["s", "l", "a", "s", "h"].join("").split("").map((char) => char.charCodeAt(0)) + ); + static wordEncFragments = new WordEncFragments(); + static wordEncBadWords = new WordEncBadWords(this.wordEncFragments); + static wordEncDomains = new WordEncDomains(this.wordEncBadWords); + static wordEncTlds = new WordEncTlds(this.wordEncBadWords, this.wordEncDomains); + static whitelist = ["cook", "cook's", "cooks", "seeks", "sheet"]; + static async load(dir) { + if (!fs21.existsSync(`${dir}/client/wordenc`)) { + console.log("Warning: No wordenc found."); + return; + } + const wordenc = Jagfile.load(`${dir}/client/wordenc`); + this.readAll(wordenc); + } + static async loadAsync(dir) { + const file = await fetch(`${dir}/client/wordenc`); + if (!file.ok) { + console.log("Warning: No wordenc.dat found."); + return; + } + const wordenc = new Jagfile(new Packet(new Uint8Array(await file.arrayBuffer()))); + this.readAll(wordenc); + } + static readAll(wordenc) { + const fragmentsenc = wordenc.read("fragmentsenc.txt"); + if (!fragmentsenc) { + console.log("Warning: No fragmentsenc found."); + return; + } + const badenc = wordenc.read("badenc.txt"); + if (!badenc) { + console.log("Warning: No badenc found."); + return; + } + const domainenc = wordenc.read("domainenc.txt"); + if (!domainenc) { + console.log("Warning: No domainenc found."); + return; + } + const tldlist = wordenc.read("tldlist.txt"); + if (!tldlist) { + console.log("Warning: No tldlist found."); + return; + } + this.decodeBadEnc(badenc); + this.decodeDomainEnc(domainenc); + this.decodeFragmentsEnc(fragmentsenc); + this.decodeTldList(tldlist); + } + static filter(input) { + const characters = [...input]; + this.format(characters); + const trimmed = characters.join("").trim(); + const lowercase = trimmed.toLowerCase(); + const filtered = [...lowercase]; + this.wordEncTlds.filter(filtered); + this.wordEncBadWords.filter(filtered); + this.wordEncDomains.filter(filtered); + this.wordEncFragments.filter(filtered); + for (let index = 0; index < this.whitelist.length; index++) { + let offset = -1; + while ((offset = lowercase.indexOf(this.whitelist[index], offset + 1)) !== -1) { + const whitelisted = [...this.whitelist[index]]; + for (let charIndex = 0; charIndex < whitelisted.length; charIndex++) { + filtered[charIndex + offset] = whitelisted[charIndex]; + } + } + } + this.replaceUppercases(filtered, [...trimmed]); + this.formatUppercases(filtered); + return filtered.join("").trim(); + } + static isSymbol(char) { + return !this.isAlpha(char) && !this.isNumerical(char); + } + static isNotLowercaseAlpha(char) { + return this.isLowercaseAlpha(char) ? char == "v" || char == "x" || char == "j" || char == "q" || char == "z" : true; + } + static isAlpha(char) { + return this.isLowercaseAlpha(char) || this.isUppercaseAlpha(char); + } + static isNumerical(char) { + return char >= "0" && char <= "9"; + } + static isLowercaseAlpha(char) { + return char >= "a" && char <= "z"; + } + static isUppercaseAlpha(char) { + return char >= "A" && char <= "Z"; + } + static isNumericalChars(chars) { + for (let index = 0; index < chars.length; index++) { + if (!this.isNumerical(chars[index]) && chars[index] !== "\0") { + return false; + } + } + return true; + } + static maskChars(offset, length, chars) { + for (let index = offset; index < length; index++) { + chars[index] = "*"; + } + } + static maskedCountBackwards(chars, offset) { + let count = 0; + for (let index = offset - 1; index >= 0 && _WordEnc.isSymbol(chars[index]); index--) { + if (chars[index] === "*") { + count++; + } + } + return count; + } + static maskedCountForwards(chars, offset) { + let count = 0; + for (let index = offset + 1; index < chars.length && this.isSymbol(chars[index]); index++) { + if (chars[index] === "*") { + count++; + } + } + return count; + } + static maskedCharsStatus(chars, filtered, offset, length, prefix) { + const count = prefix ? this.maskedCountBackwards(filtered, offset) : this.maskedCountForwards(filtered, offset); + if (count >= length) { + return 4; + } else if (this.isSymbol(prefix ? chars[offset - 1] : chars[offset + 1])) { + return 1; + } + return 0; + } + static prefixSymbolStatus(offset, chars, length, symbolChars, symbols) { + if (offset === 0) { + return 2; + } + for (let index = offset - 1; index >= 0 && _WordEnc.isSymbol(chars[index]); index--) { + if (symbols.includes(chars[index])) { + return 3; + } + } + return _WordEnc.maskedCharsStatus(chars, symbolChars, offset, length, true); + } + static suffixSymbolStatus(offset, chars, length, symbolChars, symbols) { + if (offset + 1 === chars.length) { + return 2; + } + for (let index = offset + 1; index < chars.length && _WordEnc.isSymbol(chars[index]); index++) { + if (symbols.includes(chars[index])) { + return 3; + } + } + return _WordEnc.maskedCharsStatus(chars, symbolChars, offset, length, false); + } + static decodeTldList(packet) { + const count = packet.g4(); + for (let index = 0; index < count; index++) { + this.wordEncTlds.tldTypes[index] = packet.g1(); + this.wordEncTlds.tlds[index] = new Uint16Array(packet.g1()).map(() => packet.g1()); + } + } + static decodeBadEnc(packet) { + const count = packet.g4(); + for (let index = 0; index < count; index++) { + this.wordEncBadWords.bads[index] = new Uint16Array(packet.g1()).map(() => packet.g1()); + const combos = new Array(packet.g1()).fill([]).map(() => [packet.g1b(), packet.g1b()]); + if (combos.length > 0) { + this.wordEncBadWords.badCombinations[index] = combos; + } + } + } + static decodeDomainEnc(packet) { + const count = packet.g4(); + for (let index = 0; index < count; index++) { + this.wordEncDomains.domains[index] = new Uint16Array(packet.g1()).map(() => packet.g1()); + } + } + static decodeFragmentsEnc(packet) { + const count = packet.g4(); + for (let index = 0; index < count; index++) { + this.wordEncFragments.fragments[index] = packet.g2(); + } + } + static format(chars) { + let pos = 0; + for (let index = 0; index < chars.length; index++) { + if (this.isCharacterAllowed(chars[index])) { + chars[pos] = chars[index]; + } else { + chars[pos] = " "; + } + if (pos === 0 || chars[pos] !== " " || chars[pos - 1] !== " ") { + pos++; + } + } + for (let index = pos; index < chars.length; index++) { + chars[index] = " "; + } + } + static isCharacterAllowed(char) { + return char >= " " && char <= "\x7F" || char == " " || char == "\n" || char == " " || char == "\xA3" || char == "\u20AC"; + } + static replaceUppercases(chars, comparison) { + for (let index = 0; index < comparison.length; index++) { + if (chars[index] !== "*" && this.isUppercaseAlpha(comparison[index])) { + chars[index] = comparison[index]; + } + } + } + static formatUppercases(chars) { + let flagged = true; + for (let index = 0; index < chars.length; index++) { + const char = chars[index]; + if (!this.isAlpha(char)) { + flagged = true; + } else if (flagged) { + if (this.isLowercaseAlpha(char)) { + flagged = false; + } + } else if (this.isUppercaseAlpha(char)) { + chars[index] = String.fromCharCode(char.charCodeAt(0) + "a".charCodeAt(0) - 65); + } + } + } +}; + +// src/lostcity/cache/config/SpotanimType.ts +var SpotanimType = class _SpotanimType extends ConfigType { + static configNames = /* @__PURE__ */ new Map(); + static configs = []; + static load(dir) { + if (!fs22.existsSync(`${dir}/server/spotanim.dat`)) { + console.log("Warning: No spotanim.dat found."); + return; + } + const server = Packet.load(`${dir}/server/spotanim.dat`); + const jag = Jagfile.load(`${dir}/client/config`); + this.parse(server, jag); + } + static async loadAsync(dir) { + const file = await fetch(`${dir}/server/spotanim.dat`); + if (!file.ok) { + console.log("Warning: No spotanim.dat found."); + return; + } + const [server, jag] = await Promise.all([file.arrayBuffer(), Jagfile.loadAsync(`${dir}/client/config`)]); + this.parse(new Packet(new Uint8Array(server)), jag); + } + static parse(server, jag) { + _SpotanimType.configNames = /* @__PURE__ */ new Map(); + _SpotanimType.configs = []; + const count = server.g2(); + const client = jag.read("spotanim.dat"); + client.pos = 2; + for (let id = 0; id < count; id++) { + const config = new _SpotanimType(id); + config.decodeType(server); + config.decodeType(client); + _SpotanimType.configs[id] = config; + if (config.debugname) { + _SpotanimType.configNames.set(config.debugname, id); + } + } + } + static get(id) { + return _SpotanimType.configs[id]; + } + static getId(name) { + return _SpotanimType.configNames.get(name) ?? -1; + } + static getByName(name) { + const id = this.getId(name); + if (id === -1) { + return null; + } + return this.get(id); + } + static get count() { + return this.configs.length; + } + // ---- + model = 0; + anim = -1; + hasalpha = false; + recol_s = new Uint16Array(6); + recol_d = new Uint16Array(6); + resizeh = 128; + resizev = 128; + orientation = 0; + ambient = 0; + contrast = 0; + decode(code, dat) { + if (code === 1) { + this.model = dat.g2(); + } else if (code === 2) { + this.anim = dat.g2(); + } else if (code === 3) { + this.hasalpha = true; + } else if (code === 4) { + this.resizeh = dat.g2(); + } else if (code === 5) { + this.resizev = dat.g2(); + } else if (code === 6) { + this.orientation = dat.g2(); + } else if (code === 7) { + this.ambient = dat.g1(); + } else if (code === 8) { + this.contrast = dat.g1(); + } else if (code >= 40 && code < 50) { + this.recol_s[code - 40] = dat.g2(); + } else if (code >= 50 && code < 60) { + this.recol_d[code - 50] = dat.g2(); + } else if (code === 250) { + this.debugname = dat.gjstr(); + } else { + throw new Error(`Unrecognized spotanim config code: ${code}`); + } + } +}; + +// src/lostcity/engine/GameMap.ts + +// src/lostcity/engine/script/ScriptPointer.ts +var ScriptPointer = /* @__PURE__ */ ((ScriptPointer2) => { + ScriptPointer2[ScriptPointer2["ActivePlayer"] = 0] = "ActivePlayer"; + ScriptPointer2[ScriptPointer2["ActivePlayer2"] = 1] = "ActivePlayer2"; + ScriptPointer2[ScriptPointer2["ProtectedActivePlayer"] = 2] = "ProtectedActivePlayer"; + ScriptPointer2[ScriptPointer2["ProtectedActivePlayer2"] = 3] = "ProtectedActivePlayer2"; + ScriptPointer2[ScriptPointer2["ActiveNpc"] = 4] = "ActiveNpc"; + ScriptPointer2[ScriptPointer2["ActiveNpc2"] = 5] = "ActiveNpc2"; + ScriptPointer2[ScriptPointer2["ActiveLoc"] = 6] = "ActiveLoc"; + ScriptPointer2[ScriptPointer2["ActiveLoc2"] = 7] = "ActiveLoc2"; + ScriptPointer2[ScriptPointer2["ActiveObj"] = 8] = "ActiveObj"; + ScriptPointer2[ScriptPointer2["ActiveObj2"] = 9] = "ActiveObj2"; + ScriptPointer2[ScriptPointer2["_LAST"] = 10] = "_LAST"; + return ScriptPointer2; +})(ScriptPointer || {}); +var ActiveNpc = [4 /* ActiveNpc */, 5 /* ActiveNpc2 */]; +var ActiveLoc = [6 /* ActiveLoc */, 7 /* ActiveLoc2 */]; +var ActiveObj = [8 /* ActiveObj */, 9 /* ActiveObj2 */]; +var ActivePlayer = [0 /* ActivePlayer */, 1 /* ActivePlayer2 */]; +var ProtectedActivePlayer = [2 /* ProtectedActivePlayer */, 3 /* ProtectedActivePlayer2 */]; +function checkedHandler(pointer, handler) { + return function(state) { + if (typeof pointer === "number") { + state.pointerCheck(pointer); + } else { + state.pointerCheck(pointer[state.intOperand]); + } + handler(state); + }; +} +var ScriptPointer_default = ScriptPointer; + +// src/lostcity/engine/script/ScriptFile.ts + +// src/lostcity/engine/script/ScriptOpcode.ts +var ScriptOpcode = /* @__PURE__ */ ((ScriptOpcode2) => { + ScriptOpcode2[ScriptOpcode2["PUSH_CONSTANT_INT"] = 0] = "PUSH_CONSTANT_INT"; + ScriptOpcode2[ScriptOpcode2["PUSH_VARP"] = 1] = "PUSH_VARP"; + ScriptOpcode2[ScriptOpcode2["POP_VARP"] = 2] = "POP_VARP"; + ScriptOpcode2[ScriptOpcode2["PUSH_CONSTANT_STRING"] = 3] = "PUSH_CONSTANT_STRING"; + ScriptOpcode2[ScriptOpcode2["PUSH_VARN"] = 4] = "PUSH_VARN"; + ScriptOpcode2[ScriptOpcode2["POP_VARN"] = 5] = "POP_VARN"; + ScriptOpcode2[ScriptOpcode2["BRANCH"] = 6] = "BRANCH"; + ScriptOpcode2[ScriptOpcode2["BRANCH_NOT"] = 7] = "BRANCH_NOT"; + ScriptOpcode2[ScriptOpcode2["BRANCH_EQUALS"] = 8] = "BRANCH_EQUALS"; + ScriptOpcode2[ScriptOpcode2["BRANCH_LESS_THAN"] = 9] = "BRANCH_LESS_THAN"; + ScriptOpcode2[ScriptOpcode2["BRANCH_GREATER_THAN"] = 10] = "BRANCH_GREATER_THAN"; + ScriptOpcode2[ScriptOpcode2["PUSH_VARS"] = 11] = "PUSH_VARS"; + ScriptOpcode2[ScriptOpcode2["POP_VARS"] = 12] = "POP_VARS"; + ScriptOpcode2[ScriptOpcode2["RETURN"] = 21] = "RETURN"; + ScriptOpcode2[ScriptOpcode2["GOSUB"] = 22] = "GOSUB"; + ScriptOpcode2[ScriptOpcode2["JUMP"] = 23] = "JUMP"; + ScriptOpcode2[ScriptOpcode2["SWITCH"] = 24] = "SWITCH"; + ScriptOpcode2[ScriptOpcode2["BRANCH_LESS_THAN_OR_EQUALS"] = 31] = "BRANCH_LESS_THAN_OR_EQUALS"; + ScriptOpcode2[ScriptOpcode2["BRANCH_GREATER_THAN_OR_EQUALS"] = 32] = "BRANCH_GREATER_THAN_OR_EQUALS"; + ScriptOpcode2[ScriptOpcode2["PUSH_INT_LOCAL"] = 33] = "PUSH_INT_LOCAL"; + ScriptOpcode2[ScriptOpcode2["POP_INT_LOCAL"] = 34] = "POP_INT_LOCAL"; + ScriptOpcode2[ScriptOpcode2["PUSH_STRING_LOCAL"] = 35] = "PUSH_STRING_LOCAL"; + ScriptOpcode2[ScriptOpcode2["POP_STRING_LOCAL"] = 36] = "POP_STRING_LOCAL"; + ScriptOpcode2[ScriptOpcode2["JOIN_STRING"] = 37] = "JOIN_STRING"; + ScriptOpcode2[ScriptOpcode2["POP_INT_DISCARD"] = 38] = "POP_INT_DISCARD"; + ScriptOpcode2[ScriptOpcode2["POP_STRING_DISCARD"] = 39] = "POP_STRING_DISCARD"; + ScriptOpcode2[ScriptOpcode2["GOSUB_WITH_PARAMS"] = 40] = "GOSUB_WITH_PARAMS"; + ScriptOpcode2[ScriptOpcode2["JUMP_WITH_PARAMS"] = 41] = "JUMP_WITH_PARAMS"; + ScriptOpcode2[ScriptOpcode2["DEFINE_ARRAY"] = 44] = "DEFINE_ARRAY"; + ScriptOpcode2[ScriptOpcode2["PUSH_ARRAY_INT"] = 45] = "PUSH_ARRAY_INT"; + ScriptOpcode2[ScriptOpcode2["POP_ARRAY_INT"] = 46] = "POP_ARRAY_INT"; + ScriptOpcode2[ScriptOpcode2["COORDX"] = 1e3] = "COORDX"; + ScriptOpcode2[ScriptOpcode2["COORDY"] = 1001] = "COORDY"; + ScriptOpcode2[ScriptOpcode2["COORDZ"] = 1002] = "COORDZ"; + ScriptOpcode2[ScriptOpcode2["DISTANCE"] = 1003] = "DISTANCE"; + ScriptOpcode2[ScriptOpcode2["HUNTALL"] = 1004] = "HUNTALL"; + ScriptOpcode2[ScriptOpcode2["HUNTNEXT"] = 1005] = "HUNTNEXT"; + ScriptOpcode2[ScriptOpcode2["INZONE"] = 1006] = "INZONE"; + ScriptOpcode2[ScriptOpcode2["LINEOFSIGHT"] = 1007] = "LINEOFSIGHT"; + ScriptOpcode2[ScriptOpcode2["LINEOFWALK"] = 1008] = "LINEOFWALK"; + ScriptOpcode2[ScriptOpcode2["MAP_BLOCKED"] = 1009] = "MAP_BLOCKED"; + ScriptOpcode2[ScriptOpcode2["MAP_INDOORS"] = 1010] = "MAP_INDOORS"; + ScriptOpcode2[ScriptOpcode2["MAP_CLOCK"] = 1011] = "MAP_CLOCK"; + ScriptOpcode2[ScriptOpcode2["MAP_LOCADDUNSAFE"] = 1012] = "MAP_LOCADDUNSAFE"; + ScriptOpcode2[ScriptOpcode2["MAP_MEMBERS"] = 1013] = "MAP_MEMBERS"; + ScriptOpcode2[ScriptOpcode2["MAP_PLAYERCOUNT"] = 1014] = "MAP_PLAYERCOUNT"; + ScriptOpcode2[ScriptOpcode2["MAP_FINDSQUARE"] = 1015] = "MAP_FINDSQUARE"; + ScriptOpcode2[ScriptOpcode2["MOVECOORD"] = 1016] = "MOVECOORD"; + ScriptOpcode2[ScriptOpcode2["PLAYERCOUNT"] = 1017] = "PLAYERCOUNT"; + ScriptOpcode2[ScriptOpcode2["PROJANIM_MAP"] = 1018] = "PROJANIM_MAP"; + ScriptOpcode2[ScriptOpcode2["PROJANIM_NPC"] = 1019] = "PROJANIM_NPC"; + ScriptOpcode2[ScriptOpcode2["PROJANIM_PL"] = 1020] = "PROJANIM_PL"; + ScriptOpcode2[ScriptOpcode2["SEQLENGTH"] = 1021] = "SEQLENGTH"; + ScriptOpcode2[ScriptOpcode2["SPLIT_GET"] = 1022] = "SPLIT_GET"; + ScriptOpcode2[ScriptOpcode2["SPLIT_GETANIM"] = 1023] = "SPLIT_GETANIM"; + ScriptOpcode2[ScriptOpcode2["SPLIT_INIT"] = 1024] = "SPLIT_INIT"; + ScriptOpcode2[ScriptOpcode2["SPLIT_LINECOUNT"] = 1025] = "SPLIT_LINECOUNT"; + ScriptOpcode2[ScriptOpcode2["SPLIT_PAGECOUNT"] = 1026] = "SPLIT_PAGECOUNT"; + ScriptOpcode2[ScriptOpcode2["SPOTANIM_MAP"] = 1027] = "SPOTANIM_MAP"; + ScriptOpcode2[ScriptOpcode2["STAT_RANDOM"] = 1028] = "STAT_RANDOM"; + ScriptOpcode2[ScriptOpcode2["STRUCT_PARAM"] = 1029] = "STRUCT_PARAM"; + ScriptOpcode2[ScriptOpcode2["WORLD_DELAY"] = 1030] = "WORLD_DELAY"; + ScriptOpcode2[ScriptOpcode2["NPCCOUNT"] = 1031] = "NPCCOUNT"; + ScriptOpcode2[ScriptOpcode2["ZONECOUNT"] = 1032] = "ZONECOUNT"; + ScriptOpcode2[ScriptOpcode2["LOCCOUNT"] = 1033] = "LOCCOUNT"; + ScriptOpcode2[ScriptOpcode2["OBJCOUNT"] = 1034] = "OBJCOUNT"; + ScriptOpcode2[ScriptOpcode2["ALLOWDESIGN"] = 2e3] = "ALLOWDESIGN"; + ScriptOpcode2[ScriptOpcode2["ANIM"] = 2001] = "ANIM"; + ScriptOpcode2[ScriptOpcode2["BAS_READYANIM"] = 2002] = "BAS_READYANIM"; + ScriptOpcode2[ScriptOpcode2["BAS_RUNNING"] = 2003] = "BAS_RUNNING"; + ScriptOpcode2[ScriptOpcode2["BAS_TURNONSPOT"] = 2004] = "BAS_TURNONSPOT"; + ScriptOpcode2[ScriptOpcode2["BAS_WALK_B"] = 2005] = "BAS_WALK_B"; + ScriptOpcode2[ScriptOpcode2["BAS_WALK_F"] = 2006] = "BAS_WALK_F"; + ScriptOpcode2[ScriptOpcode2["BAS_WALK_L"] = 2007] = "BAS_WALK_L"; + ScriptOpcode2[ScriptOpcode2["BAS_WALK_R"] = 2008] = "BAS_WALK_R"; + ScriptOpcode2[ScriptOpcode2["BUFFER_FULL"] = 2009] = "BUFFER_FULL"; + ScriptOpcode2[ScriptOpcode2["BUILDAPPEARANCE"] = 2010] = "BUILDAPPEARANCE"; + ScriptOpcode2[ScriptOpcode2["BUSY"] = 2011] = "BUSY"; + ScriptOpcode2[ScriptOpcode2["CAM_LOOKAT"] = 2012] = "CAM_LOOKAT"; + ScriptOpcode2[ScriptOpcode2["CAM_MOVETO"] = 2013] = "CAM_MOVETO"; + ScriptOpcode2[ScriptOpcode2["CAM_RESET"] = 2014] = "CAM_RESET"; + ScriptOpcode2[ScriptOpcode2["CAM_SHAKE"] = 2015] = "CAM_SHAKE"; + ScriptOpcode2[ScriptOpcode2["CLEARQUEUE"] = 2016] = "CLEARQUEUE"; + ScriptOpcode2[ScriptOpcode2["CLEARSOFTTIMER"] = 2017] = "CLEARSOFTTIMER"; + ScriptOpcode2[ScriptOpcode2["CLEARTIMER"] = 2018] = "CLEARTIMER"; + ScriptOpcode2[ScriptOpcode2["COORD"] = 2019] = "COORD"; + ScriptOpcode2[ScriptOpcode2["DAMAGE"] = 2020] = "DAMAGE"; + ScriptOpcode2[ScriptOpcode2["DISPLAYNAME"] = 2021] = "DISPLAYNAME"; + ScriptOpcode2[ScriptOpcode2["FACESQUARE"] = 2022] = "FACESQUARE"; + ScriptOpcode2[ScriptOpcode2["FINDUID"] = 2023] = "FINDUID"; + ScriptOpcode2[ScriptOpcode2["GENDER"] = 2024] = "GENDER"; + ScriptOpcode2[ScriptOpcode2["GETQUEUE"] = 2025] = "GETQUEUE"; + ScriptOpcode2[ScriptOpcode2["STAT_ADVANCE"] = 2026] = "STAT_ADVANCE"; + ScriptOpcode2[ScriptOpcode2["HEADICONS_GET"] = 2027] = "HEADICONS_GET"; + ScriptOpcode2[ScriptOpcode2["HEADICONS_SET"] = 2028] = "HEADICONS_SET"; + ScriptOpcode2[ScriptOpcode2["HEALENERGY"] = 2029] = "HEALENERGY"; + ScriptOpcode2[ScriptOpcode2["HINT_COORD"] = 2030] = "HINT_COORD"; + ScriptOpcode2[ScriptOpcode2["HINT_NPC"] = 2031] = "HINT_NPC"; + ScriptOpcode2[ScriptOpcode2["HINT_PLAYER"] = 2032] = "HINT_PLAYER"; + ScriptOpcode2[ScriptOpcode2["HINT_STOP"] = 2033] = "HINT_STOP"; + ScriptOpcode2[ScriptOpcode2["IF_CLOSE"] = 2034] = "IF_CLOSE"; + ScriptOpcode2[ScriptOpcode2["IF_CLOSESTICKY"] = 2035] = "IF_CLOSESTICKY"; + ScriptOpcode2[ScriptOpcode2["IF_MULTIZONE"] = 2036] = "IF_MULTIZONE"; + ScriptOpcode2[ScriptOpcode2["IF_OPENCHAT"] = 2037] = "IF_OPENCHAT"; + ScriptOpcode2[ScriptOpcode2["IF_OPENCHATSTICKY"] = 2038] = "IF_OPENCHATSTICKY"; + ScriptOpcode2[ScriptOpcode2["IF_OPENMAINMODAL"] = 2039] = "IF_OPENMAINMODAL"; + ScriptOpcode2[ScriptOpcode2["IF_OPENMAINMODALSIDEOVERLAY"] = 2040] = "IF_OPENMAINMODALSIDEOVERLAY"; + ScriptOpcode2[ScriptOpcode2["IF_OPENSIDEOVERLAY"] = 2041] = "IF_OPENSIDEOVERLAY"; + ScriptOpcode2[ScriptOpcode2["IF_SETANIM"] = 2042] = "IF_SETANIM"; + ScriptOpcode2[ScriptOpcode2["IF_SETCOLOUR"] = 2043] = "IF_SETCOLOUR"; + ScriptOpcode2[ScriptOpcode2["IF_SETHIDE"] = 2044] = "IF_SETHIDE"; + ScriptOpcode2[ScriptOpcode2["IF_SETMODEL"] = 2045] = "IF_SETMODEL"; + ScriptOpcode2[ScriptOpcode2["IF_SETRECOL"] = 2046] = "IF_SETRECOL"; + ScriptOpcode2[ScriptOpcode2["IF_SETNPCHEAD"] = 2047] = "IF_SETNPCHEAD"; + ScriptOpcode2[ScriptOpcode2["IF_SETOBJECT"] = 2048] = "IF_SETOBJECT"; + ScriptOpcode2[ScriptOpcode2["IF_SETPLAYERHEAD"] = 2049] = "IF_SETPLAYERHEAD"; + ScriptOpcode2[ScriptOpcode2["IF_SETPOSITION"] = 2050] = "IF_SETPOSITION"; + ScriptOpcode2[ScriptOpcode2["IF_SETRESUMEBUTTONS"] = 2051] = "IF_SETRESUMEBUTTONS"; + ScriptOpcode2[ScriptOpcode2["IF_SETTAB"] = 2052] = "IF_SETTAB"; + ScriptOpcode2[ScriptOpcode2["IF_SETTABACTIVE"] = 2053] = "IF_SETTABACTIVE"; + ScriptOpcode2[ScriptOpcode2["IF_SETTABFLASH"] = 2054] = "IF_SETTABFLASH"; + ScriptOpcode2[ScriptOpcode2["IF_SETTEXT"] = 2055] = "IF_SETTEXT"; + ScriptOpcode2[ScriptOpcode2["LAST_LOGIN_INFO"] = 2056] = "LAST_LOGIN_INFO"; + ScriptOpcode2[ScriptOpcode2["LAST_COM"] = 2057] = "LAST_COM"; + ScriptOpcode2[ScriptOpcode2["LAST_INT"] = 2058] = "LAST_INT"; + ScriptOpcode2[ScriptOpcode2["LAST_ITEM"] = 2059] = "LAST_ITEM"; + ScriptOpcode2[ScriptOpcode2["LAST_SLOT"] = 2060] = "LAST_SLOT"; + ScriptOpcode2[ScriptOpcode2["LAST_TARGETSLOT"] = 2061] = "LAST_TARGETSLOT"; + ScriptOpcode2[ScriptOpcode2["LAST_USEITEM"] = 2062] = "LAST_USEITEM"; + ScriptOpcode2[ScriptOpcode2["LAST_USESLOT"] = 2063] = "LAST_USESLOT"; + ScriptOpcode2[ScriptOpcode2["LONGQUEUE"] = 2064] = "LONGQUEUE"; + ScriptOpcode2[ScriptOpcode2["MES"] = 2065] = "MES"; + ScriptOpcode2[ScriptOpcode2["MIDI_JINGLE"] = 2066] = "MIDI_JINGLE"; + ScriptOpcode2[ScriptOpcode2["MIDI_SONG"] = 2067] = "MIDI_SONG"; + ScriptOpcode2[ScriptOpcode2["NAME"] = 2068] = "NAME"; + ScriptOpcode2[ScriptOpcode2["P_APRANGE"] = 2069] = "P_APRANGE"; + ScriptOpcode2[ScriptOpcode2["P_ARRIVEDELAY"] = 2070] = "P_ARRIVEDELAY"; + ScriptOpcode2[ScriptOpcode2["P_COUNTDIALOG"] = 2071] = "P_COUNTDIALOG"; + ScriptOpcode2[ScriptOpcode2["P_DELAY"] = 2072] = "P_DELAY"; + ScriptOpcode2[ScriptOpcode2["P_EXACTMOVE"] = 2073] = "P_EXACTMOVE"; + ScriptOpcode2[ScriptOpcode2["P_FINDUID"] = 2074] = "P_FINDUID"; + ScriptOpcode2[ScriptOpcode2["P_LOCMERGE"] = 2075] = "P_LOCMERGE"; + ScriptOpcode2[ScriptOpcode2["P_LOGOUT"] = 2076] = "P_LOGOUT"; + ScriptOpcode2[ScriptOpcode2["P_OPHELD"] = 2077] = "P_OPHELD"; + ScriptOpcode2[ScriptOpcode2["P_OPLOC"] = 2078] = "P_OPLOC"; + ScriptOpcode2[ScriptOpcode2["P_OPNPC"] = 2079] = "P_OPNPC"; + ScriptOpcode2[ScriptOpcode2["P_OPNPCT"] = 2080] = "P_OPNPCT"; + ScriptOpcode2[ScriptOpcode2["P_OPOBJ"] = 2081] = "P_OPOBJ"; + ScriptOpcode2[ScriptOpcode2["P_OPPLAYER"] = 2082] = "P_OPPLAYER"; + ScriptOpcode2[ScriptOpcode2["P_OPPLAYERT"] = 2083] = "P_OPPLAYERT"; + ScriptOpcode2[ScriptOpcode2["P_PAUSEBUTTON"] = 2084] = "P_PAUSEBUTTON"; + ScriptOpcode2[ScriptOpcode2["P_STOPACTION"] = 2085] = "P_STOPACTION"; + ScriptOpcode2[ScriptOpcode2["P_TELEJUMP"] = 2086] = "P_TELEJUMP"; + ScriptOpcode2[ScriptOpcode2["P_TELEPORT"] = 2087] = "P_TELEPORT"; + ScriptOpcode2[ScriptOpcode2["P_WALK"] = 2088] = "P_WALK"; + ScriptOpcode2[ScriptOpcode2["PLAYER_FINDALLZONE"] = 2089] = "PLAYER_FINDALLZONE"; + ScriptOpcode2[ScriptOpcode2["PLAYER_FINDNEXT"] = 2090] = "PLAYER_FINDNEXT"; + ScriptOpcode2[ScriptOpcode2["QUEUE"] = 2091] = "QUEUE"; + ScriptOpcode2[ScriptOpcode2["SAY"] = 2092] = "SAY"; + ScriptOpcode2[ScriptOpcode2["WALKTRIGGER"] = 2093] = "WALKTRIGGER"; + ScriptOpcode2[ScriptOpcode2["SETTIMER"] = 2094] = "SETTIMER"; + ScriptOpcode2[ScriptOpcode2["SOFTTIMER"] = 2095] = "SOFTTIMER"; + ScriptOpcode2[ScriptOpcode2["SOUND_SYNTH"] = 2096] = "SOUND_SYNTH"; + ScriptOpcode2[ScriptOpcode2["SPOTANIM_PL"] = 2097] = "SPOTANIM_PL"; + ScriptOpcode2[ScriptOpcode2["STAFFMODLEVEL"] = 2098] = "STAFFMODLEVEL"; + ScriptOpcode2[ScriptOpcode2["STAT"] = 2099] = "STAT"; + ScriptOpcode2[ScriptOpcode2["STAT_ADD"] = 2100] = "STAT_ADD"; + ScriptOpcode2[ScriptOpcode2["STAT_BASE"] = 2101] = "STAT_BASE"; + ScriptOpcode2[ScriptOpcode2["STAT_HEAL"] = 2102] = "STAT_HEAL"; + ScriptOpcode2[ScriptOpcode2["STAT_SUB"] = 2103] = "STAT_SUB"; + ScriptOpcode2[ScriptOpcode2["STRONGQUEUE"] = 2104] = "STRONGQUEUE"; + ScriptOpcode2[ScriptOpcode2["UID"] = 2105] = "UID"; + ScriptOpcode2[ScriptOpcode2["WEAKQUEUE"] = 2106] = "WEAKQUEUE"; + ScriptOpcode2[ScriptOpcode2["IF_OPENMAINOVERLAY"] = 2107] = "IF_OPENMAINOVERLAY"; + ScriptOpcode2[ScriptOpcode2["AFK_EVENT"] = 2108] = "AFK_EVENT"; + ScriptOpcode2[ScriptOpcode2["LOWMEMORY"] = 2109] = "LOWMEMORY"; + ScriptOpcode2[ScriptOpcode2["SETIDKIT"] = 2110] = "SETIDKIT"; + ScriptOpcode2[ScriptOpcode2["P_CLEARPENDINGACTION"] = 2111] = "P_CLEARPENDINGACTION"; + ScriptOpcode2[ScriptOpcode2["GETWALKTRIGGER"] = 2112] = "GETWALKTRIGGER"; + ScriptOpcode2[ScriptOpcode2["BUSY2"] = 2113] = "BUSY2"; + ScriptOpcode2[ScriptOpcode2["FINDHERO"] = 2114] = "FINDHERO"; + ScriptOpcode2[ScriptOpcode2["BOTH_HEROPOINTS"] = 2115] = "BOTH_HEROPOINTS"; + ScriptOpcode2[ScriptOpcode2["SETGENDER"] = 2116] = "SETGENDER"; + ScriptOpcode2[ScriptOpcode2["SETSKINCOLOUR"] = 2117] = "SETSKINCOLOUR"; + ScriptOpcode2[ScriptOpcode2["P_ANIMPROTECT"] = 2118] = "P_ANIMPROTECT"; + ScriptOpcode2[ScriptOpcode2["RUNENERGY"] = 2119] = "RUNENERGY"; + ScriptOpcode2[ScriptOpcode2["WEIGHT"] = 2120] = "WEIGHT"; + ScriptOpcode2[ScriptOpcode2["LAST_COORD"] = 2121] = "LAST_COORD"; + ScriptOpcode2[ScriptOpcode2["NPC_ADD"] = 2500] = "NPC_ADD"; + ScriptOpcode2[ScriptOpcode2["NPC_ANIM"] = 2501] = "NPC_ANIM"; + ScriptOpcode2[ScriptOpcode2["NPC_BASESTAT"] = 2502] = "NPC_BASESTAT"; + ScriptOpcode2[ScriptOpcode2["NPC_CATEGORY"] = 2503] = "NPC_CATEGORY"; + ScriptOpcode2[ScriptOpcode2["NPC_CHANGETYPE"] = 2504] = "NPC_CHANGETYPE"; + ScriptOpcode2[ScriptOpcode2["NPC_COORD"] = 2505] = "NPC_COORD"; + ScriptOpcode2[ScriptOpcode2["NPC_DAMAGE"] = 2506] = "NPC_DAMAGE"; + ScriptOpcode2[ScriptOpcode2["NPC_DEL"] = 2507] = "NPC_DEL"; + ScriptOpcode2[ScriptOpcode2["NPC_DELAY"] = 2508] = "NPC_DELAY"; + ScriptOpcode2[ScriptOpcode2["NPC_FACESQUARE"] = 2509] = "NPC_FACESQUARE"; + ScriptOpcode2[ScriptOpcode2["NPC_FIND"] = 2510] = "NPC_FIND"; + ScriptOpcode2[ScriptOpcode2["NPC_FINDALLANY"] = 2511] = "NPC_FINDALLANY"; + ScriptOpcode2[ScriptOpcode2["NPC_FINDEXACT"] = 2512] = "NPC_FINDEXACT"; + ScriptOpcode2[ScriptOpcode2["NPC_FINDHERO"] = 2513] = "NPC_FINDHERO"; + ScriptOpcode2[ScriptOpcode2["NPC_FINDALLZONE"] = 2514] = "NPC_FINDALLZONE"; + ScriptOpcode2[ScriptOpcode2["NPC_FINDNEXT"] = 2515] = "NPC_FINDNEXT"; + ScriptOpcode2[ScriptOpcode2["NPC_FINDUID"] = 2516] = "NPC_FINDUID"; + ScriptOpcode2[ScriptOpcode2["NPC_GETMODE"] = 2517] = "NPC_GETMODE"; + ScriptOpcode2[ScriptOpcode2["NPC_HEROPOINTS"] = 2518] = "NPC_HEROPOINTS"; + ScriptOpcode2[ScriptOpcode2["NPC_NAME"] = 2519] = "NPC_NAME"; + ScriptOpcode2[ScriptOpcode2["NPC_PARAM"] = 2520] = "NPC_PARAM"; + ScriptOpcode2[ScriptOpcode2["NPC_QUEUE"] = 2521] = "NPC_QUEUE"; + ScriptOpcode2[ScriptOpcode2["NPC_RANGE"] = 2522] = "NPC_RANGE"; + ScriptOpcode2[ScriptOpcode2["NPC_SAY"] = 2523] = "NPC_SAY"; + ScriptOpcode2[ScriptOpcode2["NPC_HUNTALL"] = 2524] = "NPC_HUNTALL"; + ScriptOpcode2[ScriptOpcode2["NPC_HUNTNEXT"] = 2525] = "NPC_HUNTNEXT"; + ScriptOpcode2[ScriptOpcode2["NPC_SETHUNT"] = 2526] = "NPC_SETHUNT"; + ScriptOpcode2[ScriptOpcode2["NPC_SETHUNTMODE"] = 2527] = "NPC_SETHUNTMODE"; + ScriptOpcode2[ScriptOpcode2["NPC_SETMODE"] = 2528] = "NPC_SETMODE"; + ScriptOpcode2[ScriptOpcode2["NPC_WALKTRIGGER"] = 2529] = "NPC_WALKTRIGGER"; + ScriptOpcode2[ScriptOpcode2["NPC_SETTIMER"] = 2530] = "NPC_SETTIMER"; + ScriptOpcode2[ScriptOpcode2["NPC_STAT"] = 2531] = "NPC_STAT"; + ScriptOpcode2[ScriptOpcode2["NPC_STATADD"] = 2532] = "NPC_STATADD"; + ScriptOpcode2[ScriptOpcode2["NPC_STATHEAL"] = 2533] = "NPC_STATHEAL"; + ScriptOpcode2[ScriptOpcode2["NPC_STATSUB"] = 2534] = "NPC_STATSUB"; + ScriptOpcode2[ScriptOpcode2["NPC_TELE"] = 2535] = "NPC_TELE"; + ScriptOpcode2[ScriptOpcode2["NPC_TYPE"] = 2536] = "NPC_TYPE"; + ScriptOpcode2[ScriptOpcode2["NPC_UID"] = 2537] = "NPC_UID"; + ScriptOpcode2[ScriptOpcode2["SPOTANIM_NPC"] = 2538] = "SPOTANIM_NPC"; + ScriptOpcode2[ScriptOpcode2["NPC_WALK"] = 2539] = "NPC_WALK"; + ScriptOpcode2[ScriptOpcode2["NPC_ATTACKRANGE"] = 2540] = "NPC_ATTACKRANGE"; + ScriptOpcode2[ScriptOpcode2["LOC_ADD"] = 3e3] = "LOC_ADD"; + ScriptOpcode2[ScriptOpcode2["LOC_ANGLE"] = 3001] = "LOC_ANGLE"; + ScriptOpcode2[ScriptOpcode2["LOC_ANIM"] = 3002] = "LOC_ANIM"; + ScriptOpcode2[ScriptOpcode2["LOC_CATEGORY"] = 3003] = "LOC_CATEGORY"; + ScriptOpcode2[ScriptOpcode2["LOC_CHANGE"] = 3004] = "LOC_CHANGE"; + ScriptOpcode2[ScriptOpcode2["LOC_COORD"] = 3005] = "LOC_COORD"; + ScriptOpcode2[ScriptOpcode2["LOC_DEL"] = 3006] = "LOC_DEL"; + ScriptOpcode2[ScriptOpcode2["LOC_FIND"] = 3007] = "LOC_FIND"; + ScriptOpcode2[ScriptOpcode2["LOC_FINDALLZONE"] = 3008] = "LOC_FINDALLZONE"; + ScriptOpcode2[ScriptOpcode2["LOC_FINDNEXT"] = 3009] = "LOC_FINDNEXT"; + ScriptOpcode2[ScriptOpcode2["LOC_NAME"] = 3010] = "LOC_NAME"; + ScriptOpcode2[ScriptOpcode2["LOC_PARAM"] = 3011] = "LOC_PARAM"; + ScriptOpcode2[ScriptOpcode2["LOC_SHAPE"] = 3012] = "LOC_SHAPE"; + ScriptOpcode2[ScriptOpcode2["LOC_TYPE"] = 3013] = "LOC_TYPE"; + ScriptOpcode2[ScriptOpcode2["OBJ_ADD"] = 3500] = "OBJ_ADD"; + ScriptOpcode2[ScriptOpcode2["OBJ_ADDALL"] = 3501] = "OBJ_ADDALL"; + ScriptOpcode2[ScriptOpcode2["OBJ_COORD"] = 3502] = "OBJ_COORD"; + ScriptOpcode2[ScriptOpcode2["OBJ_COUNT"] = 3503] = "OBJ_COUNT"; + ScriptOpcode2[ScriptOpcode2["OBJ_DEL"] = 3504] = "OBJ_DEL"; + ScriptOpcode2[ScriptOpcode2["OBJ_NAME"] = 3505] = "OBJ_NAME"; + ScriptOpcode2[ScriptOpcode2["OBJ_PARAM"] = 3506] = "OBJ_PARAM"; + ScriptOpcode2[ScriptOpcode2["OBJ_TAKEITEM"] = 3507] = "OBJ_TAKEITEM"; + ScriptOpcode2[ScriptOpcode2["OBJ_TYPE"] = 3508] = "OBJ_TYPE"; + ScriptOpcode2[ScriptOpcode2["NC_CATEGORY"] = 4e3] = "NC_CATEGORY"; + ScriptOpcode2[ScriptOpcode2["NC_DEBUGNAME"] = 4001] = "NC_DEBUGNAME"; + ScriptOpcode2[ScriptOpcode2["NC_DESC"] = 4002] = "NC_DESC"; + ScriptOpcode2[ScriptOpcode2["NC_NAME"] = 4003] = "NC_NAME"; + ScriptOpcode2[ScriptOpcode2["NC_OP"] = 4004] = "NC_OP"; + ScriptOpcode2[ScriptOpcode2["NC_PARAM"] = 4005] = "NC_PARAM"; + ScriptOpcode2[ScriptOpcode2["LC_CATEGORY"] = 4100] = "LC_CATEGORY"; + ScriptOpcode2[ScriptOpcode2["LC_DEBUGNAME"] = 4101] = "LC_DEBUGNAME"; + ScriptOpcode2[ScriptOpcode2["LC_DESC"] = 4102] = "LC_DESC"; + ScriptOpcode2[ScriptOpcode2["LC_NAME"] = 4103] = "LC_NAME"; + ScriptOpcode2[ScriptOpcode2["LC_OP"] = 4104] = "LC_OP"; + ScriptOpcode2[ScriptOpcode2["LC_PARAM"] = 4105] = "LC_PARAM"; + ScriptOpcode2[ScriptOpcode2["LC_WIDTH"] = 4106] = "LC_WIDTH"; + ScriptOpcode2[ScriptOpcode2["LC_LENGTH"] = 4107] = "LC_LENGTH"; + ScriptOpcode2[ScriptOpcode2["OC_CATEGORY"] = 4200] = "OC_CATEGORY"; + ScriptOpcode2[ScriptOpcode2["OC_CERT"] = 4201] = "OC_CERT"; + ScriptOpcode2[ScriptOpcode2["OC_COST"] = 4202] = "OC_COST"; + ScriptOpcode2[ScriptOpcode2["OC_DEBUGNAME"] = 4203] = "OC_DEBUGNAME"; + ScriptOpcode2[ScriptOpcode2["OC_DESC"] = 4204] = "OC_DESC"; + ScriptOpcode2[ScriptOpcode2["OC_IOP"] = 4205] = "OC_IOP"; + ScriptOpcode2[ScriptOpcode2["OC_MEMBERS"] = 4206] = "OC_MEMBERS"; + ScriptOpcode2[ScriptOpcode2["OC_NAME"] = 4207] = "OC_NAME"; + ScriptOpcode2[ScriptOpcode2["OC_OP"] = 4208] = "OC_OP"; + ScriptOpcode2[ScriptOpcode2["OC_PARAM"] = 4209] = "OC_PARAM"; + ScriptOpcode2[ScriptOpcode2["OC_STACKABLE"] = 4210] = "OC_STACKABLE"; + ScriptOpcode2[ScriptOpcode2["OC_TRADEABLE"] = 4211] = "OC_TRADEABLE"; + ScriptOpcode2[ScriptOpcode2["OC_UNCERT"] = 4212] = "OC_UNCERT"; + ScriptOpcode2[ScriptOpcode2["OC_WEARPOS2"] = 4213] = "OC_WEARPOS2"; + ScriptOpcode2[ScriptOpcode2["OC_WEARPOS3"] = 4214] = "OC_WEARPOS3"; + ScriptOpcode2[ScriptOpcode2["OC_WEARPOS"] = 4215] = "OC_WEARPOS"; + ScriptOpcode2[ScriptOpcode2["OC_WEIGHT"] = 4216] = "OC_WEIGHT"; + ScriptOpcode2[ScriptOpcode2["INV_ALLSTOCK"] = 4300] = "INV_ALLSTOCK"; + ScriptOpcode2[ScriptOpcode2["INV_SIZE"] = 4301] = "INV_SIZE"; + ScriptOpcode2[ScriptOpcode2["INV_STOCKBASE"] = 4302] = "INV_STOCKBASE"; + ScriptOpcode2[ScriptOpcode2["INV_ADD"] = 4303] = "INV_ADD"; + ScriptOpcode2[ScriptOpcode2["INV_CHANGESLOT"] = 4304] = "INV_CHANGESLOT"; + ScriptOpcode2[ScriptOpcode2["INV_CLEAR"] = 4305] = "INV_CLEAR"; + ScriptOpcode2[ScriptOpcode2["INV_DEL"] = 4306] = "INV_DEL"; + ScriptOpcode2[ScriptOpcode2["INV_DELSLOT"] = 4307] = "INV_DELSLOT"; + ScriptOpcode2[ScriptOpcode2["INV_DROPITEM"] = 4308] = "INV_DROPITEM"; + ScriptOpcode2[ScriptOpcode2["INV_DROPSLOT"] = 4309] = "INV_DROPSLOT"; + ScriptOpcode2[ScriptOpcode2["INV_FREESPACE"] = 4310] = "INV_FREESPACE"; + ScriptOpcode2[ScriptOpcode2["INV_GETNUM"] = 4311] = "INV_GETNUM"; + ScriptOpcode2[ScriptOpcode2["INV_GETOBJ"] = 4312] = "INV_GETOBJ"; + ScriptOpcode2[ScriptOpcode2["INV_ITEMSPACE"] = 4313] = "INV_ITEMSPACE"; + ScriptOpcode2[ScriptOpcode2["INV_ITEMSPACE2"] = 4314] = "INV_ITEMSPACE2"; + ScriptOpcode2[ScriptOpcode2["INV_MOVEFROMSLOT"] = 4315] = "INV_MOVEFROMSLOT"; + ScriptOpcode2[ScriptOpcode2["INV_MOVETOSLOT"] = 4316] = "INV_MOVETOSLOT"; + ScriptOpcode2[ScriptOpcode2["BOTH_MOVEINV"] = 4317] = "BOTH_MOVEINV"; + ScriptOpcode2[ScriptOpcode2["INV_MOVEITEM"] = 4318] = "INV_MOVEITEM"; + ScriptOpcode2[ScriptOpcode2["INV_MOVEITEM_CERT"] = 4319] = "INV_MOVEITEM_CERT"; + ScriptOpcode2[ScriptOpcode2["INV_MOVEITEM_UNCERT"] = 4320] = "INV_MOVEITEM_UNCERT"; + ScriptOpcode2[ScriptOpcode2["INV_SETSLOT"] = 4321] = "INV_SETSLOT"; + ScriptOpcode2[ScriptOpcode2["INV_TOTAL"] = 4322] = "INV_TOTAL"; + ScriptOpcode2[ScriptOpcode2["INV_TOTALCAT"] = 4323] = "INV_TOTALCAT"; + ScriptOpcode2[ScriptOpcode2["INV_TRANSMIT"] = 4324] = "INV_TRANSMIT"; + ScriptOpcode2[ScriptOpcode2["INVOTHER_TRANSMIT"] = 4325] = "INVOTHER_TRANSMIT"; + ScriptOpcode2[ScriptOpcode2["INV_STOPTRANSMIT"] = 4326] = "INV_STOPTRANSMIT"; + ScriptOpcode2[ScriptOpcode2["BOTH_DROPSLOT"] = 4327] = "BOTH_DROPSLOT"; + ScriptOpcode2[ScriptOpcode2["INV_DROPALL"] = 4328] = "INV_DROPALL"; + ScriptOpcode2[ScriptOpcode2["INV_TOTALPARAM"] = 4329] = "INV_TOTALPARAM"; + ScriptOpcode2[ScriptOpcode2["INV_TOTALPARAM_STACK"] = 4330] = "INV_TOTALPARAM_STACK"; + ScriptOpcode2[ScriptOpcode2["ENUM"] = 4400] = "ENUM"; + ScriptOpcode2[ScriptOpcode2["ENUM_GETOUTPUTCOUNT"] = 4401] = "ENUM_GETOUTPUTCOUNT"; + ScriptOpcode2[ScriptOpcode2["APPEND_NUM"] = 4500] = "APPEND_NUM"; + ScriptOpcode2[ScriptOpcode2["APPEND"] = 4501] = "APPEND"; + ScriptOpcode2[ScriptOpcode2["APPEND_SIGNNUM"] = 4502] = "APPEND_SIGNNUM"; + ScriptOpcode2[ScriptOpcode2["LOWERCASE"] = 4503] = "LOWERCASE"; + ScriptOpcode2[ScriptOpcode2["TEXT_GENDER"] = 4504] = "TEXT_GENDER"; + ScriptOpcode2[ScriptOpcode2["TOSTRING"] = 4505] = "TOSTRING"; + ScriptOpcode2[ScriptOpcode2["COMPARE"] = 4506] = "COMPARE"; + ScriptOpcode2[ScriptOpcode2["TEXT_SWITCH"] = 4507] = "TEXT_SWITCH"; + ScriptOpcode2[ScriptOpcode2["APPEND_CHAR"] = 4508] = "APPEND_CHAR"; + ScriptOpcode2[ScriptOpcode2["STRING_LENGTH"] = 4509] = "STRING_LENGTH"; + ScriptOpcode2[ScriptOpcode2["SUBSTRING"] = 4510] = "SUBSTRING"; + ScriptOpcode2[ScriptOpcode2["STRING_INDEXOF_CHAR"] = 4511] = "STRING_INDEXOF_CHAR"; + ScriptOpcode2[ScriptOpcode2["STRING_INDEXOF_STRING"] = 4512] = "STRING_INDEXOF_STRING"; + ScriptOpcode2[ScriptOpcode2["ADD"] = 4600] = "ADD"; + ScriptOpcode2[ScriptOpcode2["SUB"] = 4601] = "SUB"; + ScriptOpcode2[ScriptOpcode2["MULTIPLY"] = 4602] = "MULTIPLY"; + ScriptOpcode2[ScriptOpcode2["DIVIDE"] = 4603] = "DIVIDE"; + ScriptOpcode2[ScriptOpcode2["RANDOM"] = 4604] = "RANDOM"; + ScriptOpcode2[ScriptOpcode2["RANDOMINC"] = 4605] = "RANDOMINC"; + ScriptOpcode2[ScriptOpcode2["INTERPOLATE"] = 4606] = "INTERPOLATE"; + ScriptOpcode2[ScriptOpcode2["ADDPERCENT"] = 4607] = "ADDPERCENT"; + ScriptOpcode2[ScriptOpcode2["SETBIT"] = 4608] = "SETBIT"; + ScriptOpcode2[ScriptOpcode2["CLEARBIT"] = 4609] = "CLEARBIT"; + ScriptOpcode2[ScriptOpcode2["TESTBIT"] = 4610] = "TESTBIT"; + ScriptOpcode2[ScriptOpcode2["MODULO"] = 4611] = "MODULO"; + ScriptOpcode2[ScriptOpcode2["POW"] = 4612] = "POW"; + ScriptOpcode2[ScriptOpcode2["INVPOW"] = 4613] = "INVPOW"; + ScriptOpcode2[ScriptOpcode2["AND"] = 4614] = "AND"; + ScriptOpcode2[ScriptOpcode2["OR"] = 4615] = "OR"; + ScriptOpcode2[ScriptOpcode2["MIN"] = 4616] = "MIN"; + ScriptOpcode2[ScriptOpcode2["MAX"] = 4617] = "MAX"; + ScriptOpcode2[ScriptOpcode2["SCALE"] = 4618] = "SCALE"; + ScriptOpcode2[ScriptOpcode2["BITCOUNT"] = 4619] = "BITCOUNT"; + ScriptOpcode2[ScriptOpcode2["TOGGLEBIT"] = 4620] = "TOGGLEBIT"; + ScriptOpcode2[ScriptOpcode2["SETBIT_RANGE"] = 4621] = "SETBIT_RANGE"; + ScriptOpcode2[ScriptOpcode2["CLEARBIT_RANGE"] = 4622] = "CLEARBIT_RANGE"; + ScriptOpcode2[ScriptOpcode2["GETBIT_RANGE"] = 4623] = "GETBIT_RANGE"; + ScriptOpcode2[ScriptOpcode2["SETBIT_RANGE_TOINT"] = 4624] = "SETBIT_RANGE_TOINT"; + ScriptOpcode2[ScriptOpcode2["SIN_DEG"] = 4625] = "SIN_DEG"; + ScriptOpcode2[ScriptOpcode2["COS_DEG"] = 4626] = "COS_DEG"; + ScriptOpcode2[ScriptOpcode2["ATAN2_DEG"] = 4627] = "ATAN2_DEG"; + ScriptOpcode2[ScriptOpcode2["ABS"] = 4628] = "ABS"; + ScriptOpcode2[ScriptOpcode2["DB_FIND_WITH_COUNT"] = 7500] = "DB_FIND_WITH_COUNT"; + ScriptOpcode2[ScriptOpcode2["DB_FINDNEXT"] = 7501] = "DB_FINDNEXT"; + ScriptOpcode2[ScriptOpcode2["DB_GETFIELD"] = 7502] = "DB_GETFIELD"; + ScriptOpcode2[ScriptOpcode2["DB_GETFIELDCOUNT"] = 7503] = "DB_GETFIELDCOUNT"; + ScriptOpcode2[ScriptOpcode2["DB_LISTALL_WITH_COUNT"] = 7504] = "DB_LISTALL_WITH_COUNT"; + ScriptOpcode2[ScriptOpcode2["DB_GETROWTABLE"] = 7505] = "DB_GETROWTABLE"; + ScriptOpcode2[ScriptOpcode2["DB_FINDBYINDEX"] = 7506] = "DB_FINDBYINDEX"; + ScriptOpcode2[ScriptOpcode2["DB_FIND_REFINE_WITH_COUNT"] = 7507] = "DB_FIND_REFINE_WITH_COUNT"; + ScriptOpcode2[ScriptOpcode2["DB_FIND"] = 7508] = "DB_FIND"; + ScriptOpcode2[ScriptOpcode2["DB_FIND_REFINE"] = 7509] = "DB_FIND_REFINE"; + ScriptOpcode2[ScriptOpcode2["DB_LISTALL"] = 7510] = "DB_LISTALL"; + ScriptOpcode2[ScriptOpcode2["ERROR"] = 1e4] = "ERROR"; + ScriptOpcode2[ScriptOpcode2["MAP_PRODUCTION"] = 10001] = "MAP_PRODUCTION"; + ScriptOpcode2[ScriptOpcode2["MAP_LASTCLOCK"] = 10002] = "MAP_LASTCLOCK"; + ScriptOpcode2[ScriptOpcode2["MAP_LASTWORLD"] = 10003] = "MAP_LASTWORLD"; + ScriptOpcode2[ScriptOpcode2["MAP_LASTCLIENTIN"] = 10004] = "MAP_LASTCLIENTIN"; + ScriptOpcode2[ScriptOpcode2["MAP_LASTNPC"] = 10005] = "MAP_LASTNPC"; + ScriptOpcode2[ScriptOpcode2["MAP_LASTPLAYER"] = 10006] = "MAP_LASTPLAYER"; + ScriptOpcode2[ScriptOpcode2["MAP_LASTLOGOUT"] = 10007] = "MAP_LASTLOGOUT"; + ScriptOpcode2[ScriptOpcode2["MAP_LASTLOGIN"] = 10008] = "MAP_LASTLOGIN"; + ScriptOpcode2[ScriptOpcode2["MAP_LASTZONE"] = 10009] = "MAP_LASTZONE"; + ScriptOpcode2[ScriptOpcode2["MAP_LASTCLIENTOUT"] = 10010] = "MAP_LASTCLIENTOUT"; + ScriptOpcode2[ScriptOpcode2["MAP_LASTCLEANUP"] = 10011] = "MAP_LASTCLEANUP"; + ScriptOpcode2[ScriptOpcode2["MAP_LASTBANDWIDTHIN"] = 10012] = "MAP_LASTBANDWIDTHIN"; + ScriptOpcode2[ScriptOpcode2["MAP_LASTBANDWIDTHOUT"] = 10013] = "MAP_LASTBANDWIDTHOUT"; + return ScriptOpcode2; +})(ScriptOpcode || {}); +var ScriptOpcode_default = ScriptOpcode; + +// src/lostcity/engine/script/ScriptFile.ts +function isLargeOperand(opcode) { + if (opcode > 100) { + return false; + } + switch (opcode) { + case ScriptOpcode_default.RETURN: + case ScriptOpcode_default.POP_INT_DISCARD: + case ScriptOpcode_default.POP_STRING_DISCARD: + case ScriptOpcode_default.GOSUB: + case ScriptOpcode_default.JUMP: + return false; + } + return true; +} +var ScriptFile = class _ScriptFile { + info = { + scriptName: "", + sourceFilePath: "", + lookupKey: -1, + parameterTypes: [], + pcs: [], + lines: [] + }; + id; + intLocalCount = 0; + stringLocalCount = 0; + intArgCount = 0; + stringArgCount = 0; + switchTables = []; + opcodes = []; + intOperands = []; + stringOperands = []; + // decodes the same binary format as clientscript2 + static decode(id, stream) { + const length = stream.data.length; + if (length < 16) { + throw new Error("Invalid script file (minimum length)"); + } + stream.pos = length - 2; + const trailerLen = stream.g2(); + const trailerPos = length - trailerLen - 12 - 2; + if (trailerPos < 0 || trailerPos >= length) { + throw new Error("Invalid script file (bad trailer pos)"); + } + stream.pos = trailerPos; + const script = new _ScriptFile(id); + const _instructions = stream.g4(); + script.intLocalCount = stream.g2(); + script.stringLocalCount = stream.g2(); + script.intArgCount = stream.g2(); + script.stringArgCount = stream.g2(); + const switches = stream.g1(); + for (let i = 0; i < switches; i++) { + const count = stream.g2(); + const table = []; + for (let j = 0; j < count; j++) { + const key = stream.g4(); + const offset = stream.g4(); + table[key] = offset; + } + script.switchTables[i] = table; + } + stream.pos = 0; + script.info.scriptName = stream.gjstr(0); + script.info.sourceFilePath = stream.gjstr(0); + script.info.lookupKey = stream.g4(); + const parameterTypeCount = stream.g1(); + for (let i = 0; i < parameterTypeCount; i++) { + script.info.parameterTypes.push(stream.g1()); + } + const lineNumberTableLength = stream.g2(); + for (let i = 0; i < lineNumberTableLength; i++) { + script.info.pcs.push(stream.g4()); + script.info.lines.push(stream.g4()); + } + let instr = 0; + while (trailerPos > stream.pos) { + const opcode = stream.g2(); + if (opcode === ScriptOpcode_default.PUSH_CONSTANT_STRING) { + script.stringOperands[instr] = stream.gjstr(0); + } else if (isLargeOperand(opcode)) { + script.intOperands[instr] = stream.g4(); + } else { + script.intOperands[instr] = stream.g1(); + } + script.opcodes[instr++] = opcode; + } + return script; + } + constructor(id) { + this.id = id; + } + get name() { + return this.info.scriptName; + } + get fileName() { + if (typeof self === "undefined") { + return path2.basename(this.info.sourceFilePath); + } else { + return this.info.sourceFilePath.split("/").pop()?.split("\\").pop(); + } + } + lineNumber(pc) { + for (let i = 0; i < this.info.pcs.length; i++) { + if (this.info.pcs[i] > pc) { + return this.info.lines[i - 1]; + } + } + return this.info.lines[this.info.lines.length - 1]; + } +}; + +// src/lostcity/engine/script/ScriptProvider.ts +var ScriptProvider = class _ScriptProvider { + /** + * The expected version of the script compiler that the runtime should be loading scripts from. + */ + static COMPILER_VERSION = 19; + /** + * Array of loaded scripts. + */ + static scripts = []; + /** + * Mapping of unique trigger + type/category/global key to script. + */ + static scriptLookup = /* @__PURE__ */ new Map(); + /** + * Mapping of script names to its id. + */ + static scriptNames = /* @__PURE__ */ new Map(); + /** + * Loads all scripts from `dir`. + * + * @param dir The directory that holds the script.{dat,idx} files. + * @returns The number of scripts loaded. + */ + static load(dir) { + const dat = Packet.load(`${dir}/server/script.dat`); + const idx = Packet.load(`${dir}/server/script.idx`); + return this.parse(dat, idx); + } + static async loadAsync(dir) { + const [dat, idx] = await Promise.all([Packet.loadAsync(`${dir}/server/script.dat`), Packet.loadAsync(`${dir}/server/script.idx`)]); + return this.parse(dat, idx); + } + static parse(dat, idx) { + if (!dat.data.length || !idx.data.length) { + console.log("\nFatal: No script.dat or script.idx found. Please run the server:build script."); + process.exit(1); + } + const entries = dat.g2(); + idx.pos += 2; + const version = dat.g4(); + if (version !== _ScriptProvider.COMPILER_VERSION) { + console.error("\nFatal: Scripts were compiled with an older RuneScript compiler. Please update it, try `npm run build` and then restart the server."); + process.exit(1); + } + const scripts = new Array(entries); + const scriptNames = /* @__PURE__ */ new Map(); + const scriptLookup = /* @__PURE__ */ new Map(); + let loaded = 0; + for (let id = 0; id < entries; id++) { + const size = idx.g2(); + if (size === 0) { + continue; + } + try { + const data = new Uint8Array(size); + dat.gdata(data, 0, data.length); + const script = ScriptFile.decode(id, new Packet(data)); + scripts[id] = script; + scriptNames.set(script.name, id); + if (script.info.lookupKey !== 4294967295) { + scriptLookup.set(script.info.lookupKey, script); + } + loaded++; + } catch (err) { + console.error(err); + console.error(`Warning: Failed to load script ${id}, something may have been partially written`); + return -1; + } + } + _ScriptProvider.scripts = scripts; + _ScriptProvider.scriptNames = scriptNames; + _ScriptProvider.scriptLookup = scriptLookup; + return loaded; + } + /** + * Finds a script by `id`. + * @param id The script id to find. + * @returns The script. + */ + static get(id) { + return this.scripts[id]; + } + /** + * Finds a script by `name`. + * @param name The script name to find. + * @returns The script. + */ + static getByName(name) { + const id = _ScriptProvider.scriptNames.get(name); + if (id === void 0) { + return void 0; + } + return _ScriptProvider.scripts[id]; + } + /** + * Used to look up a script by the `type` and `category`. + * + * This function will attempt to search for a script given the specific `type`, + * if one is not found it attempts one for `category`, and if still not found + * it will attempt for the global script. + * + * @param trigger The script trigger to find. + * @param type The script subject type id. + * @param category The script subject category id. + */ + static getByTrigger(trigger, type = -1, category = -1) { + let script = _ScriptProvider.scriptLookup.get(trigger | 2 << 8 | type << 10); + if (script) { + return script; + } + script = _ScriptProvider.scriptLookup.get(trigger | 1 << 8 | category << 10); + if (script) { + return script; + } + return _ScriptProvider.scriptLookup.get(trigger); + } + /** + * Used to look up a script by a specific combo. Does not attempt any other combinations. + * + * If `type` is not `-1`, only the `type` specific script will be looked up. Likewise + * for `category`. If both `type` and `category` are `-1`, then only the global script + * will be looked up. + * + * @param trigger The script trigger to find. + * @param type The script subject type id. + * @param category The script subject category id. + */ + static getByTriggerSpecific(trigger, type = -1, category = -1) { + if (type !== -1) { + return _ScriptProvider.scriptLookup.get(trigger | 2 << 8 | type << 10); + } else if (category !== -1) { + return _ScriptProvider.scriptLookup.get(trigger | 1 << 8 | category << 10); + } + return _ScriptProvider.scriptLookup.get(trigger); + } +}; + +// src/lostcity/util/Numbers.ts +var MASK = initMaskArray(); +function toInt32(num) { + return num | 0; +} +function bitcount(num) { + num = num - (num >> 1 & 1431655765); + num = (num & 858993459) + (num >> 2 & 858993459); + return (num + (num >> 4) & 252645135) * 16843009 >> 24; +} +function setBitRange(num, startBit, endBit) { + const mask = MASK[endBit - startBit + 1]; + return num | mask << startBit; +} +function clearBitRange(num, startBit, endBit) { + const mask = MASK[endBit - startBit + 1]; + return num & ~(mask << startBit); +} +function initMaskArray() { + const data = [0]; + let incrementor = 2; + for (let i = 1; i < 33; ++i) { + data[i] = toInt32(incrementor - 1); + incrementor += incrementor; + } + return data; +} + +// src/lostcity/engine/script/ScriptState.ts +var ScriptState = class _ScriptState { + static ABORTED = -1; + static RUNNING = 0; + static FINISHED = 1; + static SUSPENDED = 2; + // suspended to move to player + static PAUSEBUTTON = 3; + static COUNTDIALOG = 4; + static NPC_SUSPENDED = 5; + // suspended to move to npc + static WORLD_SUSPENDED = 6; + // suspended to move to world + // interpreter + script; + trigger; + execution = _ScriptState.RUNNING; + executionHistory = []; + pc = -1; + // program counter + opcount = 0; + // number of opcodes executed + frames = []; + fp = 0; + // frame pointer + debugFrames = []; + debugFp = 0; + intStack = []; + isp = 0; + // int stack pointer + stringStack = []; + ssp = 0; + // string stack pointer + intLocals = []; + stringLocals = []; + /** + * Contains flags representing `ScriptPointer`s. + */ + pointers = 0; + // server + /** + * The primary entity. + */ + self = null; + // active entities + /** + * The primary active player. + */ + _activePlayer = null; + /** + * The secondary active player. + * @type {Player|null} + */ + _activePlayer2 = null; + /** + * The primary active npc. + */ + _activeNpc = null; + /** + * The secondary active npc. + */ + _activeNpc2 = null; + /** + * The primary active loc. + */ + _activeLoc = null; + /** + * The secondary active loc. + */ + _activeLoc2 = null; + _activeObj = null; + _activeObj2 = null; + /** + * Used for string splitting operations with split_init and related commands. + */ + splitPages = []; + splitMesanim = -1; + /** + * Used for db operations with db_find and related commands + */ + dbTable = null; + dbColumn = -1; + dbRow = -1; + dbRowQuery = []; + huntIterator = null; + npcIterator = null; + locIterator = null; + lastInt = 0; + constructor(script, args = []) { + this.script = script; + this.trigger = script.info.lookupKey & 255; + if (args) { + for (let i = 0; i < args.length; i++) { + const arg = args[i]; + if (typeof arg === "number") { + this.intLocals.push(arg); + } else { + this.stringLocals.push(arg); + } + } + } + } + /** + * Sets pointers to only the ones supplied. + * + * @param pointers The pointers to set. + */ + pointerSet(...pointers) { + this.pointers = 0; + for (let i = 0; i < pointers.length; i++) { + this.pointers |= 1 << pointers[i]; + } + } + /** + * Adds `pointer` to the state. + * + * @param pointer The pointer to add. + */ + pointerAdd(pointer) { + this.pointers |= 1 << pointer; + } + /** + * Removes `pointer` from the state. + * + * @param pointer The point to remove. + */ + pointerRemove(pointer) { + this.pointers &= ~(1 << pointer); + } + pointerGet(pointer) { + return (this.pointers & 1 << pointer) != 0; + } + /** + * Verifies all `pointers` are enabled. + * + * @param pointers The pointers to check for. + */ + pointerCheck(...pointers) { + for (let i = 0; i < pointers.length; i++) { + const flag = 1 << pointers[i]; + if ((this.pointers & flag) != flag) { + throw new Error(`Required pointer: ${_ScriptState.pointerPrint(flag)}, current: ${_ScriptState.pointerPrint(this.pointers)}`); + } + } + } + /** + * Pretty prints all enables flags using the names from `ScriptPointer`. + * + * @param flags The flags to print. + */ + static pointerPrint(flags) { + let text = ""; + for (let i = 0; i < ScriptPointer_default._LAST; i++) { + if ((flags & 1 << i) != 0) { + text += `${ScriptPointer_default[i]}, `; + } + } + return text.substring(0, text.lastIndexOf(",")); + } + /** + * Gets the active player. Automatically checks the operand to determine primary and secondary. + */ + get activePlayer() { + const player = this.intOperand === 0 ? this._activePlayer : this._activePlayer2; + if (player === null) { + throw new Error("Attempt to access null active_player"); + } + return player; + } + /** + * Sets the active player. Automatically checks the operand to determine primary and secondary. + * @param player The player to set. + */ + set activePlayer(player) { + if (this.intOperand === 0) { + this._activePlayer = player; + } else { + this._activePlayer2 = player; + } + } + /** + * Gets the active npc. Automatically checks the operand to determine primary and secondary. + */ + get activeNpc() { + const npc = this.intOperand === 0 ? this._activeNpc : this._activeNpc2; + if (npc === null) { + throw new Error("Attempt to access null active_npc"); + } + return npc; + } + /** + * Sets the active npc. Automatically checks the operand to determine primary and secondary. + * @param npc The npc to set. + */ + set activeNpc(npc) { + if (this.intOperand === 0) { + this._activeNpc = npc; + } else { + this._activeNpc2 = npc; + } + } + /** + * Gets the active location. Automatically checks the operand to determine primary and secondary. + */ + get activeLoc() { + const loc = this.intOperand === 0 ? this._activeLoc : this._activeLoc2; + if (loc === null) { + throw new Error("Attempt to access null active_loc"); + } + return loc; + } + /** + * Sets the active loc. Automatically checks the operand to determine primary and secondary. + * @param loc The loc to set. + */ + set activeLoc(loc) { + if (this.intOperand === 0) { + this._activeLoc = loc; + } else { + this._activeLoc2 = loc; + } + } + get activeObj() { + const obj = this.intOperand === 0 ? this._activeObj : this._activeObj2; + if (obj === null) { + throw new Error("Attempt to access null active_obj"); + } + return obj; + } + /** + * Sets the active obj. Automatically checks the operand to determine primary and secondary. + * @param obj The obj to set. + */ + set activeObj(obj) { + if (this.intOperand === 0) { + this._activeObj = obj; + } else { + this._activeObj2 = obj; + } + } + get intOperand() { + return this.script.intOperands[this.pc]; + } + get stringOperand() { + return this.script.stringOperands[this.pc]; + } + popInt() { + const value = this.intStack[--this.isp]; + if (!value) { + return 0; + } + return toInt32(value); + } + popInts(amount) { + const ints = Array(amount); + for (let i = amount - 1; i >= 0; i--) { + ints[i] = this.popInt(); + } + return ints; + } + pushInt(value) { + this.intStack[this.isp++] = toInt32(value); + } + popString() { + return this.stringStack[--this.ssp] ?? ""; + } + popStrings(amount) { + const strings = Array(amount); + for (let i = amount - 1; i >= 0; i--) { + strings[i] = this.popString(); + } + return strings; + } + pushString(value) { + this.stringStack[this.ssp++] = value; + } + reset() { + this.pc = -1; + this.frames = []; + this.fp = 0; + this.intStack = []; + this.isp = 0; + this.stringStack = []; + this.ssp = 0; + this.intLocals = []; + this.stringLocals = []; + this.pointers = 0; + } +}; + +// src/lostcity/engine/Inventory.ts +var InventoryTransaction = class { + requested = 0; + completed = 0; + items = []; + constructor(requested, completed = 0, items = []) { + this.requested = requested; + this.completed = completed; + this.items = items; + } + getLeftOver() { + return this.requested - this.completed; + } + hasSucceeded() { + return this.completed == this.requested; + } + hasFailed() { + return !this.hasSucceeded(); + } + revert(from) { + for (let i = 0; i < this.items.length; i++) { + const item = this.items[i].item; + from.remove(item.id, item.count, this.items[i].slot); + } + } +}; +var Inventory = class _Inventory { + static STACK_LIMIT = 2147483647; + static NORMAL_STACK = 0; + static ALWAYS_STACK = 1; + static NEVER_STACK = 2; + static fromType(inv) { + if (inv === -1) { + throw new Error("Invalid inventory type"); + } + const type = InvType.get(inv); + let stackType = _Inventory.NORMAL_STACK; + if (type.stackall) { + stackType = _Inventory.ALWAYS_STACK; + } + const container = new _Inventory(inv, type.size, stackType); + if (type.stockobj && type.stockcount && type.stockobj.length) { + for (let i = 0; i < type.stockobj.length; i++) { + container.set(i, { + id: type.stockobj[i], + count: type.stockcount[i] + }); + } + } + return container; + } + // 0 - stack based on item + // 1 - always stack + // 2 - never stack + stackType; + capacity; + type; + // inv ID + items; + update = false; + constructor(type, capacity, stackType = _Inventory.NORMAL_STACK) { + this.type = type; + this.capacity = capacity; + this.stackType = stackType; + this.items = new Array(capacity).fill(null); + } + contains(id) { + return this.items.some((item) => item && item.id == id); + } + hasAt(slot, id) { + const item = this.items[slot]; + return item && item.id == id; + } + get nextFreeSlot() { + return this.items.indexOf(null, 0); + } + get freeSlotCount() { + return this.items.filter((item) => item == null).length; + } + get occupiedSlotCount() { + return this.items.filter((item) => item != null).length; + } + get isFull() { + return this.occupiedSlotCount == this.capacity; + } + get isEmpty() { + return this.occupiedSlotCount == 0; + } + get hasAny() { + return this.items.some((item) => item != null); + } + get hasSpace() { + return this.nextFreeSlot != -1; + } + get itemsFiltered() { + return this.items.filter((item) => item != null); + } + getItemCount(id) { + let count = 0; + for (let i = 0; i < this.capacity; i++) { + const item = this.items[i]; + if (item && item.id == id) { + count += item.count; + } + } + return Math.min(_Inventory.STACK_LIMIT, count); + } + getItemIndex(id) { + return this.items.findIndex((item) => item && item.id == id); + } + removeAll() { + this.items.fill(null, 0, this.capacity); + this.update = true; + } + add(id, count = 1, beginSlot = -1, assureFullInsertion = true, forceNoStack = false, dryRun = false) { + const type = ObjType.get(id); + const stockObj = InvType.get(this.type).stockobj?.includes(id) === true; + const stack = !forceNoStack && this.stackType != _Inventory.NEVER_STACK && (type.stackable || this.stackType == _Inventory.ALWAYS_STACK); + let previousCount = 0; + if (stack) { + previousCount = this.getItemCount(id); + } + if (previousCount == _Inventory.STACK_LIMIT) { + return new InventoryTransaction(count, 0, []); + } + const freeSlotCount = this.freeSlotCount; + if (freeSlotCount == 0 && (!stack || stack && previousCount == 0 && !stockObj)) { + return new InventoryTransaction(count, 0, []); + } + if (assureFullInsertion) { + if (stack && previousCount > _Inventory.STACK_LIMIT - count) { + return new InventoryTransaction(count, 0, []); + } + if (!stack && count > freeSlotCount) { + return new InventoryTransaction(count, 0, []); + } + } else { + if (stack && previousCount == _Inventory.STACK_LIMIT) { + return new InventoryTransaction(count, 0, []); + } else if (!stack && freeSlotCount == 0) { + return new InventoryTransaction(count, 0, []); + } + } + let completed = 0; + const added = []; + if (!stack) { + const startSlot = Math.max(0, beginSlot); + for (let i = startSlot; i < this.capacity; i++) { + if (this.items[i] != null) { + continue; + } + const add = { id, count: 1 }; + if (!dryRun) { + this.set(i, add); + } + added.push({ slot: i, item: add }); + if (++completed >= count) { + break; + } + } + } else { + let stackIndex = this.getItemIndex(id); + if (stackIndex == -1) { + if (beginSlot == -1) { + stackIndex = this.nextFreeSlot; + } else { + stackIndex = this.items.indexOf(null, beginSlot); + } + if (stackIndex == -1) { + return new InventoryTransaction(count, completed, []); + } + } + const stackCount = this.get(stackIndex)?.count ?? 0; + const total = Math.min(_Inventory.STACK_LIMIT, stackCount + count); + const add = { id, count: total }; + if (!dryRun) { + this.set(stackIndex, add); + } + added.push({ slot: stackIndex, item: add }); + completed = total - stackCount; + } + return new InventoryTransaction(count, completed, added); + } + remove(id, count = 1, beginSlot = -1, assureFullRemoval = false) { + const hasCount = this.getItemCount(id); + const stockObj = InvType.get(this.type).stockobj?.includes(id) === true; + if (assureFullRemoval && hasCount < count) { + return new InventoryTransaction(count, 0, []); + } else if (!assureFullRemoval && hasCount < 1) { + return new InventoryTransaction(count, 0, []); + } + let totalRemoved = 0; + const removed = []; + let skippedIndices = null; + if (beginSlot != -1) { + skippedIndices = []; + for (let i = 0; i < beginSlot; i++) { + skippedIndices.push(i); + } + } + let index = 0; + if (beginSlot != -1) { + index = beginSlot; + } + for (let i = index; i < this.capacity; i++) { + const curItem = this.items[i]; + if (!curItem || curItem.id != id) { + continue; + } + const removeCount = Math.min(curItem.count, count - totalRemoved); + totalRemoved += removeCount; + curItem.count -= removeCount; + if (curItem.count == 0 && !stockObj) { + const removedItem = this.items[i]; + this.items[i] = null; + if (removedItem) { + removed.push({ slot: i, item: removedItem }); + } + } + if (totalRemoved >= count) { + break; + } + } + if (skippedIndices != null && totalRemoved < count) { + for (let i = 0; i < skippedIndices.length; i++) { + const curItem = this.items[i]; + if (!curItem || curItem.id != id) { + continue; + } + const removeCount = Math.min(curItem.count, count - totalRemoved); + totalRemoved += removeCount; + curItem.count -= removeCount; + if (curItem.count == 0 && !stockObj) { + const removedItem = this.items[i]; + this.items[i] = null; + if (removedItem) { + removed.push({ slot: i, item: removedItem }); + } + } + if (totalRemoved >= count) { + break; + } + } + } + if (totalRemoved > 0) { + this.update = true; + } + return new InventoryTransaction(count, totalRemoved, removed); + } + delete(slot) { + this.items[slot] = null; + this.update = true; + } + swap(from, to) { + const temp = this.items[from]; + this.set(from, this.items[to]); + this.set(to, temp); + } + // REVIEW: This method isn't used anywhere + shift() { + this.items.sort((a, b) => { + if (a === null || b === null) { + return +(a === null) - +(b === null); + } else { + return +(a > b) || -(a < b); + } + }); + this.update = true; + } + get(slot) { + return this.items[slot]; + } + set(slot, item) { + this.items[slot] = item; + this.update = true; + } + validSlot(slot) { + return slot >= 0 && slot < this.capacity; + } + transfer(to, item, fromSlot = -1, toSlot = -1, note = false, unnote = false) { + if (item.count <= 0) { + return null; + } + const count = Math.min(item.count, this.getItemCount(item.id)); + const objType = ObjType.get(item.id); + let finalItem = { id: item.id, count }; + if (note && objType.certlink !== -1 && objType.certtemplate === -1) { + finalItem = { id: objType.certlink, count }; + } else if (unnote && objType.certlink !== -1 && objType.certtemplate >= 0) { + finalItem = { id: objType.certlink, count }; + } + const add = to.add(finalItem.id, finalItem.count, toSlot, false); + if (add.completed == 0) { + return null; + } + const remove = this.remove(item.id, add.completed, fromSlot, false); + if (remove.completed == 0) { + return null; + } + return remove; + } +}; + +// node_modules/@2004scape/rsmod-pathfinder/dist/rsmod-pathfinder.js +async function instantiate(module, imports = {}) { + const adaptedImports = { + env: Object.assign(Object.create(globalThis), imports.env || {}, { + abort(message, fileName, lineNumber, columnNumber) { + message = __liftString(message >>> 0); + fileName = __liftString(fileName >>> 0); + lineNumber = lineNumber >>> 0; + columnNumber = columnNumber >>> 0; + (() => { + throw Error(`${message} in ${fileName}:${lineNumber}:${columnNumber}`); + })(); + }, + seed() { + return (() => { + return Date.now() * Math.random(); + })(); + } + }) + }; + const { exports } = await WebAssembly.instantiate(module, adaptedImports); + const memory2 = exports.memory || imports.env.memory; + const adaptedExports = Object.setPrototypeOf({ + findPath(level, srcX, srcZ, destX, destZ, srcSize, destWidth, destHeight, angle, shape, moveNear, blockAccessFlags, maxWaypoints, collision) { + moveNear = moveNear ? 1 : 0; + exports.__setArgumentsLength(arguments.length); + return __liftStaticArray(__getI32, 2, exports.findPath(level, srcX, srcZ, destX, destZ, srcSize, destWidth, destHeight, angle, shape, moveNear, blockAccessFlags, maxWaypoints, collision) >>> 0); + }, + findNaivePath(level, srcX, srcZ, destX, destZ, srcWidth, srcHeight, destWidth, destHeight, blockAccessFlags, collision) { + exports.__setArgumentsLength(arguments.length); + return __liftStaticArray(__getI32, 2, exports.findNaivePath(level, srcX, srcZ, destX, destZ, srcWidth, srcHeight, destWidth, destHeight, blockAccessFlags, collision) >>> 0); + }, + changeFloor(x, z, level, add) { + add = add ? 1 : 0; + exports.changeFloor(x, z, level, add); + }, + changeLoc(x, z, level, width, length, blockrange, breakroutefinding, add) { + blockrange = blockrange ? 1 : 0; + breakroutefinding = breakroutefinding ? 1 : 0; + add = add ? 1 : 0; + exports.changeLoc(x, z, level, width, length, blockrange, breakroutefinding, add); + }, + changeNpc(x, z, level, size, add) { + add = add ? 1 : 0; + exports.changeNpc(x, z, level, size, add); + }, + changePlayer(x, z, level, size, add) { + add = add ? 1 : 0; + exports.changePlayer(x, z, level, size, add); + }, + changeRoof(x, z, level, add) { + add = add ? 1 : 0; + exports.changeRoof(x, z, level, add); + }, + changeWall(x, z, level, angle, shape, blockrange, breakroutefinding, add) { + blockrange = blockrange ? 1 : 0; + breakroutefinding = breakroutefinding ? 1 : 0; + add = add ? 1 : 0; + exports.changeWall(x, z, level, angle, shape, blockrange, breakroutefinding, add); + }, + allocateIfAbsent(absoluteX, absoluteZ, level) { + return __liftStaticArray(__getI32, 2, exports.allocateIfAbsent(absoluteX, absoluteZ, level) >>> 0); + }, + isZoneAllocated(absoluteX, absoluteZ, level) { + return exports.isZoneAllocated(absoluteX, absoluteZ, level) != 0; + }, + isFlagged(x, z, level, masks) { + return exports.isFlagged(x, z, level, masks) != 0; + }, + canTravel(level, x, z, offsetX, offsetZ, size, extraFlag, collision) { + exports.__setArgumentsLength(arguments.length); + return exports.canTravel(level, x, z, offsetX, offsetZ, size, extraFlag, collision) != 0; + }, + hasLineOfSight(level, srcX, srcZ, destX, destZ, srcWidth, srcHeight, destWidth, destHeight, extraFlag) { + exports.__setArgumentsLength(arguments.length); + return exports.hasLineOfSight(level, srcX, srcZ, destX, destZ, srcWidth, srcHeight, destWidth, destHeight, extraFlag) != 0; + }, + hasLineOfWalk(level, srcX, srcZ, destX, destZ, srcWidth, srcHeight, destWidth, destHeight, extraFlag) { + exports.__setArgumentsLength(arguments.length); + return exports.hasLineOfWalk(level, srcX, srcZ, destX, destZ, srcWidth, srcHeight, destWidth, destHeight, extraFlag) != 0; + }, + lineOfSight(level, srcX, srcZ, destX, destZ, srcWidth, srcHeight, destWidth, destHeight, extraFlag) { + exports.__setArgumentsLength(arguments.length); + return __liftStaticArray(__getI32, 2, exports.lineOfSight(level, srcX, srcZ, destX, destZ, srcWidth, srcHeight, destWidth, destHeight, extraFlag) >>> 0); + }, + lineOfWalk(level, srcX, srcZ, destX, destZ, srcWidth, srcHeight, destWidth, destHeight, extraFlag) { + exports.__setArgumentsLength(arguments.length); + return __liftStaticArray(__getI32, 2, exports.lineOfWalk(level, srcX, srcZ, destX, destZ, srcWidth, srcHeight, destWidth, destHeight, extraFlag) >>> 0); + }, + reached(level, srcX, srcZ, destX, destZ, destWidth, destHeight, srcSize, angle, shape, blockAccessFlags) { + exports.__setArgumentsLength(arguments.length); + return exports.reached(level, srcX, srcZ, destX, destZ, destWidth, destHeight, srcSize, angle, shape, blockAccessFlags) != 0; + }, + __collides(srcX, srcZ, destX, destZ, srcWidth, srcHeight, destWidth, destHeight) { + return exports.__collides(srcX, srcZ, destX, destZ, srcWidth, srcHeight, destWidth, destHeight) != 0; + }, + __reachRectangle1(level, srcX, srcZ, destX, destZ, destWidth, destHeight, blockAccessFlags) { + return exports.__reachRectangle1(level, srcX, srcZ, destX, destZ, destWidth, destHeight, blockAccessFlags) != 0; + }, + __reachRectangleN(level, srcX, srcZ, destX, destZ, srcWidth, srcHeight, destWidth, destHeight, blockAccessFlags) { + return exports.__reachRectangleN(level, srcX, srcZ, destX, destZ, srcWidth, srcHeight, destWidth, destHeight, blockAccessFlags) != 0; + }, + __reachRectangle(level, srcX, srcZ, destX, destZ, srcSize, destWidth, destHeight, angle, blockAccessFlags) { + return exports.__reachRectangle(level, srcX, srcZ, destX, destZ, srcSize, destWidth, destHeight, angle, blockAccessFlags) != 0; + }, + __reachExclusiveRectangle(level, srcX, srcZ, destX, destZ, srcSize, destWidth, destHeight, angle, blockAccessFlags) { + return exports.__reachExclusiveRectangle(level, srcX, srcZ, destX, destZ, srcSize, destWidth, destHeight, angle, blockAccessFlags) != 0; + }, + CollisionFlag: ((values) => ( + // src/rsmod/flag/CollisionFlag/CollisionFlag + (values[values.NULL = exports["CollisionFlag.NULL"].valueOf()] = "NULL", values[values.OPEN = exports["CollisionFlag.OPEN"].valueOf()] = "OPEN", values[values.WALL_NORTH_WEST = exports["CollisionFlag.WALL_NORTH_WEST"].valueOf()] = "WALL_NORTH_WEST", values[values.WALL_NORTH = exports["CollisionFlag.WALL_NORTH"].valueOf()] = "WALL_NORTH", values[values.WALL_NORTH_EAST = exports["CollisionFlag.WALL_NORTH_EAST"].valueOf()] = "WALL_NORTH_EAST", values[values.WALL_EAST = exports["CollisionFlag.WALL_EAST"].valueOf()] = "WALL_EAST", values[values.WALL_SOUTH_EAST = exports["CollisionFlag.WALL_SOUTH_EAST"].valueOf()] = "WALL_SOUTH_EAST", values[values.WALL_SOUTH = exports["CollisionFlag.WALL_SOUTH"].valueOf()] = "WALL_SOUTH", values[values.WALL_SOUTH_WEST = exports["CollisionFlag.WALL_SOUTH_WEST"].valueOf()] = "WALL_SOUTH_WEST", values[values.WALL_WEST = exports["CollisionFlag.WALL_WEST"].valueOf()] = "WALL_WEST", values[values.LOC = exports["CollisionFlag.LOC"].valueOf()] = "LOC", values[values.WALL_NORTH_WEST_PROJ_BLOCKER = exports["CollisionFlag.WALL_NORTH_WEST_PROJ_BLOCKER"].valueOf()] = "WALL_NORTH_WEST_PROJ_BLOCKER", values[values.WALL_NORTH_PROJ_BLOCKER = exports["CollisionFlag.WALL_NORTH_PROJ_BLOCKER"].valueOf()] = "WALL_NORTH_PROJ_BLOCKER", values[values.WALL_NORTH_EAST_PROJ_BLOCKER = exports["CollisionFlag.WALL_NORTH_EAST_PROJ_BLOCKER"].valueOf()] = "WALL_NORTH_EAST_PROJ_BLOCKER", values[values.WALL_EAST_PROJ_BLOCKER = exports["CollisionFlag.WALL_EAST_PROJ_BLOCKER"].valueOf()] = "WALL_EAST_PROJ_BLOCKER", values[values.WALL_SOUTH_EAST_PROJ_BLOCKER = exports["CollisionFlag.WALL_SOUTH_EAST_PROJ_BLOCKER"].valueOf()] = "WALL_SOUTH_EAST_PROJ_BLOCKER", values[values.WALL_SOUTH_PROJ_BLOCKER = exports["CollisionFlag.WALL_SOUTH_PROJ_BLOCKER"].valueOf()] = "WALL_SOUTH_PROJ_BLOCKER", values[values.WALL_SOUTH_WEST_PROJ_BLOCKER = exports["CollisionFlag.WALL_SOUTH_WEST_PROJ_BLOCKER"].valueOf()] = "WALL_SOUTH_WEST_PROJ_BLOCKER", values[values.WALL_WEST_PROJ_BLOCKER = exports["CollisionFlag.WALL_WEST_PROJ_BLOCKER"].valueOf()] = "WALL_WEST_PROJ_BLOCKER", values[values.LOC_PROJ_BLOCKER = exports["CollisionFlag.LOC_PROJ_BLOCKER"].valueOf()] = "LOC_PROJ_BLOCKER", values[values.FLOOR_DECORATION = exports["CollisionFlag.FLOOR_DECORATION"].valueOf()] = "FLOOR_DECORATION", values[values.NPC = exports["CollisionFlag.NPC"].valueOf()] = "NPC", values[values.PLAYER = exports["CollisionFlag.PLAYER"].valueOf()] = "PLAYER", values[values.FLOOR = exports["CollisionFlag.FLOOR"].valueOf()] = "FLOOR", values[values.WALL_NORTH_WEST_ROUTE_BLOCKER = exports["CollisionFlag.WALL_NORTH_WEST_ROUTE_BLOCKER"].valueOf()] = "WALL_NORTH_WEST_ROUTE_BLOCKER", values[values.WALL_NORTH_ROUTE_BLOCKER = exports["CollisionFlag.WALL_NORTH_ROUTE_BLOCKER"].valueOf()] = "WALL_NORTH_ROUTE_BLOCKER", values[values.WALL_NORTH_EAST_ROUTE_BLOCKER = exports["CollisionFlag.WALL_NORTH_EAST_ROUTE_BLOCKER"].valueOf()] = "WALL_NORTH_EAST_ROUTE_BLOCKER", values[values.WALL_EAST_ROUTE_BLOCKER = exports["CollisionFlag.WALL_EAST_ROUTE_BLOCKER"].valueOf()] = "WALL_EAST_ROUTE_BLOCKER", values[values.WALL_SOUTH_EAST_ROUTE_BLOCKER = exports["CollisionFlag.WALL_SOUTH_EAST_ROUTE_BLOCKER"].valueOf()] = "WALL_SOUTH_EAST_ROUTE_BLOCKER", values[values.WALL_SOUTH_ROUTE_BLOCKER = exports["CollisionFlag.WALL_SOUTH_ROUTE_BLOCKER"].valueOf()] = "WALL_SOUTH_ROUTE_BLOCKER", values[values.WALL_SOUTH_WEST_ROUTE_BLOCKER = exports["CollisionFlag.WALL_SOUTH_WEST_ROUTE_BLOCKER"].valueOf()] = "WALL_SOUTH_WEST_ROUTE_BLOCKER", values[values.WALL_WEST_ROUTE_BLOCKER = exports["CollisionFlag.WALL_WEST_ROUTE_BLOCKER"].valueOf()] = "WALL_WEST_ROUTE_BLOCKER", values[values.LOC_ROUTE_BLOCKER = exports["CollisionFlag.LOC_ROUTE_BLOCKER"].valueOf()] = "LOC_ROUTE_BLOCKER", values[values.ROOF = exports["CollisionFlag.ROOF"].valueOf()] = "ROOF", values[values.FLOOR_BLOCKED = exports["CollisionFlag.FLOOR_BLOCKED"].valueOf()] = "FLOOR_BLOCKED", values[values.WALK_BLOCKED = exports["CollisionFlag.WALK_BLOCKED"].valueOf()] = "WALK_BLOCKED", values[values.BLOCK_WEST = exports["CollisionFlag.BLOCK_WEST"].valueOf()] = "BLOCK_WEST", values[values.BLOCK_EAST = exports["CollisionFlag.BLOCK_EAST"].valueOf()] = "BLOCK_EAST", values[values.BLOCK_SOUTH = exports["CollisionFlag.BLOCK_SOUTH"].valueOf()] = "BLOCK_SOUTH", values[values.BLOCK_NORTH = exports["CollisionFlag.BLOCK_NORTH"].valueOf()] = "BLOCK_NORTH", values[values.BLOCK_SOUTH_WEST = exports["CollisionFlag.BLOCK_SOUTH_WEST"].valueOf()] = "BLOCK_SOUTH_WEST", values[values.BLOCK_SOUTH_EAST = exports["CollisionFlag.BLOCK_SOUTH_EAST"].valueOf()] = "BLOCK_SOUTH_EAST", values[values.BLOCK_NORTH_WEST = exports["CollisionFlag.BLOCK_NORTH_WEST"].valueOf()] = "BLOCK_NORTH_WEST", values[values.BLOCK_NORTH_EAST = exports["CollisionFlag.BLOCK_NORTH_EAST"].valueOf()] = "BLOCK_NORTH_EAST", values[values.BLOCK_NORTH_AND_SOUTH_EAST = exports["CollisionFlag.BLOCK_NORTH_AND_SOUTH_EAST"].valueOf()] = "BLOCK_NORTH_AND_SOUTH_EAST", values[values.BLOCK_NORTH_AND_SOUTH_WEST = exports["CollisionFlag.BLOCK_NORTH_AND_SOUTH_WEST"].valueOf()] = "BLOCK_NORTH_AND_SOUTH_WEST", values[values.BLOCK_NORTH_EAST_AND_WEST = exports["CollisionFlag.BLOCK_NORTH_EAST_AND_WEST"].valueOf()] = "BLOCK_NORTH_EAST_AND_WEST", values[values.BLOCK_SOUTH_EAST_AND_WEST = exports["CollisionFlag.BLOCK_SOUTH_EAST_AND_WEST"].valueOf()] = "BLOCK_SOUTH_EAST_AND_WEST", values[values.BLOCK_WEST_ROUTE_BLOCKER = exports["CollisionFlag.BLOCK_WEST_ROUTE_BLOCKER"].valueOf()] = "BLOCK_WEST_ROUTE_BLOCKER", values[values.BLOCK_EAST_ROUTE_BLOCKER = exports["CollisionFlag.BLOCK_EAST_ROUTE_BLOCKER"].valueOf()] = "BLOCK_EAST_ROUTE_BLOCKER", values[values.BLOCK_SOUTH_ROUTE_BLOCKER = exports["CollisionFlag.BLOCK_SOUTH_ROUTE_BLOCKER"].valueOf()] = "BLOCK_SOUTH_ROUTE_BLOCKER", values[values.BLOCK_NORTH_ROUTE_BLOCKER = exports["CollisionFlag.BLOCK_NORTH_ROUTE_BLOCKER"].valueOf()] = "BLOCK_NORTH_ROUTE_BLOCKER", values[values.BLOCK_SOUTH_WEST_ROUTE_BLOCKER = exports["CollisionFlag.BLOCK_SOUTH_WEST_ROUTE_BLOCKER"].valueOf()] = "BLOCK_SOUTH_WEST_ROUTE_BLOCKER", values[values.BLOCK_SOUTH_EAST_ROUTE_BLOCKER = exports["CollisionFlag.BLOCK_SOUTH_EAST_ROUTE_BLOCKER"].valueOf()] = "BLOCK_SOUTH_EAST_ROUTE_BLOCKER", values[values.BLOCK_NORTH_WEST_ROUTE_BLOCKER = exports["CollisionFlag.BLOCK_NORTH_WEST_ROUTE_BLOCKER"].valueOf()] = "BLOCK_NORTH_WEST_ROUTE_BLOCKER", values[values.BLOCK_NORTH_EAST_ROUTE_BLOCKER = exports["CollisionFlag.BLOCK_NORTH_EAST_ROUTE_BLOCKER"].valueOf()] = "BLOCK_NORTH_EAST_ROUTE_BLOCKER", values[values.BLOCK_NORTH_AND_SOUTH_EAST_ROUTE_BLOCKER = exports["CollisionFlag.BLOCK_NORTH_AND_SOUTH_EAST_ROUTE_BLOCKER"].valueOf()] = "BLOCK_NORTH_AND_SOUTH_EAST_ROUTE_BLOCKER", values[values.BLOCK_NORTH_AND_SOUTH_WEST_ROUTE_BLOCKER = exports["CollisionFlag.BLOCK_NORTH_AND_SOUTH_WEST_ROUTE_BLOCKER"].valueOf()] = "BLOCK_NORTH_AND_SOUTH_WEST_ROUTE_BLOCKER", values[values.BLOCK_NORTH_EAST_AND_WEST_ROUTE_BLOCKER = exports["CollisionFlag.BLOCK_NORTH_EAST_AND_WEST_ROUTE_BLOCKER"].valueOf()] = "BLOCK_NORTH_EAST_AND_WEST_ROUTE_BLOCKER", values[values.BLOCK_SOUTH_EAST_AND_WEST_ROUTE_BLOCKER = exports["CollisionFlag.BLOCK_SOUTH_EAST_AND_WEST_ROUTE_BLOCKER"].valueOf()] = "BLOCK_SOUTH_EAST_AND_WEST_ROUTE_BLOCKER", values) + ))({}), + LocShape: ((values) => ( + // src/rsmod/LocShape/LocShape + (values[values.WALL_STRAIGHT = exports["LocShape.WALL_STRAIGHT"].valueOf()] = "WALL_STRAIGHT", values[values.WALL_DIAGONAL_CORNER = exports["LocShape.WALL_DIAGONAL_CORNER"].valueOf()] = "WALL_DIAGONAL_CORNER", values[values.WALL_L = exports["LocShape.WALL_L"].valueOf()] = "WALL_L", values[values.WALL_SQUARE_CORNER = exports["LocShape.WALL_SQUARE_CORNER"].valueOf()] = "WALL_SQUARE_CORNER", values[values.WALLDECOR_STRAIGHT_NOOFFSET = exports["LocShape.WALLDECOR_STRAIGHT_NOOFFSET"].valueOf()] = "WALLDECOR_STRAIGHT_NOOFFSET", values[values.WALLDECOR_STRAIGHT_OFFSET = exports["LocShape.WALLDECOR_STRAIGHT_OFFSET"].valueOf()] = "WALLDECOR_STRAIGHT_OFFSET", values[values.WALLDECOR_DIAGONAL_OFFSET = exports["LocShape.WALLDECOR_DIAGONAL_OFFSET"].valueOf()] = "WALLDECOR_DIAGONAL_OFFSET", values[values.WALLDECOR_DIAGONAL_NOOFFSET = exports["LocShape.WALLDECOR_DIAGONAL_NOOFFSET"].valueOf()] = "WALLDECOR_DIAGONAL_NOOFFSET", values[values.WALLDECOR_DIAGONAL_BOTH = exports["LocShape.WALLDECOR_DIAGONAL_BOTH"].valueOf()] = "WALLDECOR_DIAGONAL_BOTH", values[values.WALL_DIAGONAL = exports["LocShape.WALL_DIAGONAL"].valueOf()] = "WALL_DIAGONAL", values[values.CENTREPIECE_STRAIGHT = exports["LocShape.CENTREPIECE_STRAIGHT"].valueOf()] = "CENTREPIECE_STRAIGHT", values[values.CENTREPIECE_DIAGONAL = exports["LocShape.CENTREPIECE_DIAGONAL"].valueOf()] = "CENTREPIECE_DIAGONAL", values[values.ROOF_STRAIGHT = exports["LocShape.ROOF_STRAIGHT"].valueOf()] = "ROOF_STRAIGHT", values[values.ROOF_DIAGONAL_WITH_ROOFEDGE = exports["LocShape.ROOF_DIAGONAL_WITH_ROOFEDGE"].valueOf()] = "ROOF_DIAGONAL_WITH_ROOFEDGE", values[values.ROOF_DIAGONAL = exports["LocShape.ROOF_DIAGONAL"].valueOf()] = "ROOF_DIAGONAL", values[values.ROOF_L_CONCAVE = exports["LocShape.ROOF_L_CONCAVE"].valueOf()] = "ROOF_L_CONCAVE", values[values.ROOF_L_CONVEX = exports["LocShape.ROOF_L_CONVEX"].valueOf()] = "ROOF_L_CONVEX", values[values.ROOF_FLAT = exports["LocShape.ROOF_FLAT"].valueOf()] = "ROOF_FLAT", values[values.ROOFEDGE_STRAIGHT = exports["LocShape.ROOFEDGE_STRAIGHT"].valueOf()] = "ROOFEDGE_STRAIGHT", values[values.ROOFEDGE_DIAGONAL_CORNER = exports["LocShape.ROOFEDGE_DIAGONAL_CORNER"].valueOf()] = "ROOFEDGE_DIAGONAL_CORNER", values[values.ROOFEDGE_L = exports["LocShape.ROOFEDGE_L"].valueOf()] = "ROOFEDGE_L", values[values.ROOFEDGE_SQUARE_CORNER = exports["LocShape.ROOFEDGE_SQUARE_CORNER"].valueOf()] = "ROOFEDGE_SQUARE_CORNER", values[values.GROUND_DECOR = exports["LocShape.GROUND_DECOR"].valueOf()] = "GROUND_DECOR", values) + ))({}), + LocAngle: ((values) => ( + // src/rsmod/LocAngle/LocAngle + (values[values.WEST = exports["LocAngle.WEST"].valueOf()] = "WEST", values[values.NORTH = exports["LocAngle.NORTH"].valueOf()] = "NORTH", values[values.EAST = exports["LocAngle.EAST"].valueOf()] = "EAST", values[values.SOUTH = exports["LocAngle.SOUTH"].valueOf()] = "SOUTH", values) + ))({}), + CollisionType: ((values) => ( + // src/rsmod/collision/CollisionStrategy/CollisionType + (values[values.NORMAL = exports["CollisionType.NORMAL"].valueOf()] = "NORMAL", values[values.BLOCKED = exports["CollisionType.BLOCKED"].valueOf()] = "BLOCKED", values[values.INDOORS = exports["CollisionType.INDOORS"].valueOf()] = "INDOORS", values[values.OUTDOORS = exports["CollisionType.OUTDOORS"].valueOf()] = "OUTDOORS", values[values.LINE_OF_SIGHT = exports["CollisionType.LINE_OF_SIGHT"].valueOf()] = "LINE_OF_SIGHT", values) + ))({}), + LocLayer: ((values) => ( + // src/rsmod/LocLayer/LocLayer + (values[values.WALL = exports["LocLayer.WALL"].valueOf()] = "WALL", values[values.WALL_DECOR = exports["LocLayer.WALL_DECOR"].valueOf()] = "WALL_DECOR", values[values.GROUND = exports["LocLayer.GROUND"].valueOf()] = "GROUND", values[values.GROUND_DECOR = exports["LocLayer.GROUND_DECOR"].valueOf()] = "GROUND_DECOR", values) + ))({}), + BlockAccessFlag: ((values) => ( + // src/rsmod/flag/BlockAccessFlag/BlockAccessFlag + (values[values.BLOCK_NORTH = exports["BlockAccessFlag.BLOCK_NORTH"].valueOf()] = "BLOCK_NORTH", values[values.BLOCK_EAST = exports["BlockAccessFlag.BLOCK_EAST"].valueOf()] = "BLOCK_EAST", values[values.BLOCK_SOUTH = exports["BlockAccessFlag.BLOCK_SOUTH"].valueOf()] = "BLOCK_SOUTH", values[values.BLOCK_WEST = exports["BlockAccessFlag.BLOCK_WEST"].valueOf()] = "BLOCK_WEST", values) + ))({}) + }, exports); + function __liftString(pointer) { + if (!pointer) return null; + const end = pointer + new Uint32Array(memory2.buffer)[pointer - 4 >>> 2] >>> 1, memoryU16 = new Uint16Array(memory2.buffer); + let start = pointer >>> 1, string = ""; + while (end - start > 1024) string += String.fromCharCode(...memoryU16.subarray(start, start += 1024)); + return string + String.fromCharCode(...memoryU16.subarray(start, end)); + } + function __liftStaticArray(liftElement, align, pointer) { + if (!pointer) return null; + const length = __getU32(pointer - 4) >>> align, values = new Array(length); + for (let i = 0; i < length; ++i) values[i] = liftElement(pointer + (i << align >>> 0)); + return values; + } + let __dataview = new DataView(memory2.buffer); + function __getI32(pointer) { + try { + return __dataview.getInt32(pointer, true); + } catch { + __dataview = new DataView(memory2.buffer); + return __dataview.getInt32(pointer, true); + } + } + function __getU32(pointer) { + try { + return __dataview.getUint32(pointer, true); + } catch { + __dataview = new DataView(memory2.buffer); + return __dataview.getUint32(pointer, true); + } + } + return adaptedExports; +} +var { + memory, + findPath, + findNaivePath, + changeFloor, + changeLoc, + changeNpc, + changePlayer, + changeRoof, + changeWall, + allocateIfAbsent, + deallocateIfPresent, + isZoneAllocated, + isFlagged, + canTravel, + hasLineOfSight, + hasLineOfWalk, + lineOfSight, + lineOfWalk, + reached, + locShapeLayer, + __get, + __set, + __add, + __remove, + __rotate, + __rotateFlags, + __collides, + __reachRectangle1, + __reachRectangleN, + __alteredRotation, + __reachRectangle, + __reachExclusiveRectangle, + CollisionFlag, + LocShape, + LocAngle, + CollisionType, + LocLayer, + BlockAccessFlag +} = await (async (url) => instantiate( + await (async () => { + try { + return await globalThis.WebAssembly.compileStreaming(globalThis.fetch(url)); + } catch { + return globalThis.WebAssembly.compile(await (await import("node:fs/promises")).readFile(url)); + } + })(), + {} +))(new URL("rsmod-pathfinder.wasm", import.meta.url)); + +// src/lostcity/entity/Position.ts +var Direction = { + NORTH_WEST: 0, + NORTH: 1, + NORTH_EAST: 2, + WEST: 3, + EAST: 4, + SOUTH_WEST: 5, + SOUTH: 6, + SOUTH_EAST: 7 +}; +var Position = { + zone: (pos) => pos >> 3, + zoneCenter: (pos) => Position.zone(pos) - 6, + zoneOrigin: (pos) => Position.zoneCenter(pos) << 3, + mapsquare: (pos) => pos >> 6, + local: (pos, origin) => pos - (Position.zoneCenter(origin) << 3), + face: (srcX, srcZ, dstX, dstZ) => { + if (srcX == dstX) { + if (srcZ > dstZ) { + return Direction.SOUTH; + } else if (srcZ < dstZ) { + return Direction.NORTH; + } + } else if (srcX > dstX) { + if (srcZ > dstZ) { + return Direction.SOUTH_WEST; + } else if (srcZ < dstZ) { + return Direction.NORTH_WEST; + } else { + return Direction.WEST; + } + } else { + if (srcZ > dstZ) { + return Direction.SOUTH_EAST; + } else if (srcZ < dstZ) { + return Direction.NORTH_EAST; + } else { + return Direction.EAST; + } + } + return -1; + }, + moveX: (pos, dir) => { + return pos + Position.deltaX(dir); + }, + moveZ: (pos, dir) => { + return pos + Position.deltaZ(dir); + }, + distanceTo(pos, other) { + const p1 = Position.closest(pos, other); + const p2 = Position.closest(other, pos); + return Math.max(Math.abs(p1.x - p2.x), Math.abs(p1.z - p2.z)); + }, + closest(pos, other) { + const occupiedX = pos.x + pos.width - 1; + const occupiedZ = pos.z + pos.length - 1; + return { + x: other.x <= pos.x ? pos.x : other.x >= occupiedX ? occupiedX : other.x, + z: other.z <= pos.z ? pos.z : other.z >= occupiedZ ? occupiedZ : other.z + }; + }, + distanceToSW(pos, other) { + const deltaX = Math.abs(pos.x - other.x); + const deltaZ = Math.abs(pos.z - other.z); + return Math.max(deltaX, deltaZ); + }, + isWithinDistanceSW(pos, other, distance) { + if (Math.abs(pos.x - other.x) > distance || Math.abs(pos.z - other.z) > distance) { + return false; + } + return true; + }, + deltaX(dir) { + switch (dir) { + case Direction.SOUTH_EAST: + case Direction.NORTH_EAST: + case Direction.EAST: + return 1; + case Direction.SOUTH_WEST: + case Direction.NORTH_WEST: + case Direction.WEST: + return -1; + } + return 0; + }, + deltaZ(dir) { + switch (dir) { + case Direction.NORTH_WEST: + case Direction.NORTH_EAST: + case Direction.NORTH: + return 1; + case Direction.SOUTH_WEST: + case Direction.SOUTH_EAST: + case Direction.SOUTH: + return -1; + } + return 0; + }, + unpackCoord(coord) { + const level = coord >> 28 & 3; + const x = coord >> 14 & 16383; + const z = coord & 16383; + return { level, x, z }; + }, + packCoord(level, x, z) { + return z & 16383 | (x & 16383) << 14 | (level & 3) << 28; + }, + packZoneCoord(x, z) { + return (x & 7) << 4 | z & 7; + }, + intersects(srcX, srcZ, srcWidth, srcHeight, destX, destZ, destWidth, destHeight) { + const srcHorizontal = srcX + srcWidth; + const srcVertical = srcZ + srcHeight; + const destHorizontal = destX + destWidth; + const destVertical = destZ + destHeight; + return !(destX >= srcHorizontal || destHorizontal <= srcX || destZ >= srcVertical || destVertical <= srcZ); + }, + formatString(level, x, z, separator = "_") { + const mx = x >> 6; + const mz = z >> 6; + const lx = x & 63; + const lz = z & 63; + return level + separator + mx + separator + mz + separator + lx + separator + lz; + } +}; + +// src/lostcity/entity/HitType.ts +var HitType = /* @__PURE__ */ ((HitType2) => { + HitType2[HitType2["BLOCK"] = 0] = "BLOCK"; + HitType2[HitType2["DAMAGE"] = 1] = "DAMAGE"; + HitType2[HitType2["POISON"] = 2] = "POISON"; + return HitType2; +})(HitType || {}); +var HitType_default = HitType; + +// src/lostcity/entity/PlayerStat.ts +var PlayerStat = /* @__PURE__ */ ((PlayerStat2) => { + PlayerStat2[PlayerStat2["ATTACK"] = 0] = "ATTACK"; + PlayerStat2[PlayerStat2["DEFENCE"] = 1] = "DEFENCE"; + PlayerStat2[PlayerStat2["STRENGTH"] = 2] = "STRENGTH"; + PlayerStat2[PlayerStat2["HITPOINTS"] = 3] = "HITPOINTS"; + PlayerStat2[PlayerStat2["RANGED"] = 4] = "RANGED"; + PlayerStat2[PlayerStat2["PRAYER"] = 5] = "PRAYER"; + PlayerStat2[PlayerStat2["MAGIC"] = 6] = "MAGIC"; + PlayerStat2[PlayerStat2["COOKING"] = 7] = "COOKING"; + PlayerStat2[PlayerStat2["WOODCUTTING"] = 8] = "WOODCUTTING"; + PlayerStat2[PlayerStat2["FLETCHING"] = 9] = "FLETCHING"; + PlayerStat2[PlayerStat2["FISHING"] = 10] = "FISHING"; + PlayerStat2[PlayerStat2["FIREMAKING"] = 11] = "FIREMAKING"; + PlayerStat2[PlayerStat2["CRAFTING"] = 12] = "CRAFTING"; + PlayerStat2[PlayerStat2["SMITHING"] = 13] = "SMITHING"; + PlayerStat2[PlayerStat2["MINING"] = 14] = "MINING"; + PlayerStat2[PlayerStat2["HERBLORE"] = 15] = "HERBLORE"; + PlayerStat2[PlayerStat2["AGILITY"] = 16] = "AGILITY"; + PlayerStat2[PlayerStat2["THIEVING"] = 17] = "THIEVING"; + PlayerStat2[PlayerStat2["STAT18"] = 18] = "STAT18"; + PlayerStat2[PlayerStat2["STAT19"] = 19] = "STAT19"; + PlayerStat2[PlayerStat2["RUNECRAFT"] = 20] = "RUNECRAFT"; + return PlayerStat2; +})(PlayerStat || {}); +var PlayerStat_default = PlayerStat; + +// src/lostcity/entity/MapFindSquareType.ts +var MapFindSqaureType = /* @__PURE__ */ ((MapFindSqaureType2) => { + MapFindSqaureType2[MapFindSqaureType2["LINEOFWALK"] = 0] = "LINEOFWALK"; + MapFindSqaureType2[MapFindSqaureType2["LINEOFSIGHT"] = 1] = "LINEOFSIGHT"; + MapFindSqaureType2[MapFindSqaureType2["NONE"] = 2] = "NONE"; + return MapFindSqaureType2; +})(MapFindSqaureType || {}); +var MapFindSquareType_default = MapFindSqaureType; + +// src/lostcity/engine/script/ScriptValidators.ts +var ScriptInputNumberNotNullValidator = class { + validate(input) { + if (input !== -1) return input; + throw Error("An input number was null(-1)."); + } +}; +var ScriptInputNumberPositiveValidator = class { + validate(input) { + if (input >= 0) return input; + throw Error("An input number was negative."); + } +}; +var ScriptInputStringNotNullValidator = class { + validate(input) { + if (input.length > 0) return input; + throw Error("An input string was null(-1)."); + } +}; +var ScriptInputConfigTypeValidator = class { + type; + count; + name; + constructor(type, count, name) { + this.type = type; + this.count = count; + this.name = name; + } + validate(input) { + if (this.count(input)) return this.type(input); + throw new Error(`An input for a ${this.name} type was not valid to use. Input was ${input}.`); + } +}; +var ScriptInputRangeValidator = class { + min; + max; + name; + constructor(min, max, name) { + this.min = min; + this.max = max; + this.name = name; + } + validate(input) { + if (input >= this.min && input <= this.max) { + return input; + } + throw new Error(`An input for a ${this.name} was out of range. Range should be: ${this.min} to ${this.max}. Input was ${input}.`); + } +}; +var ScriptInputCoordValidator = class extends ScriptInputRangeValidator { + validate(input) { + if (input >= this.min && input <= this.max) { + return Position.unpackCoord(input); + } + throw new Error(`An input for a ${this.name} was out of range. Range should be: ${this.min} to ${this.max}. Input was ${input}.`); + } +}; +var NumberNotNull = new ScriptInputNumberNotNullValidator(); +var NumberPositive = new ScriptInputNumberPositiveValidator(); +var StringNotNull = new ScriptInputStringNotNullValidator(); +var LocTypeValid = new ScriptInputConfigTypeValidator(LocType.get, (input) => input >= 0 && input < LocType.count, "Loc"); +var LocAngleValid = new ScriptInputRangeValidator(LocAngle.WEST, LocAngle.SOUTH, "LocAngle"); +var LocShapeValid = new ScriptInputRangeValidator(LocShape.WALL_STRAIGHT, LocShape.GROUND_DECOR, "LocShape"); +var DurationValid = new ScriptInputRangeValidator(1, 2147483647, "Duration"); +var CoordValid = new ScriptInputCoordValidator(0, 2147483647, "Coord"); +var ParamTypeValid = new ScriptInputConfigTypeValidator(ParamType.get, (input) => input >= 0 && input < ParamType.count, "Param"); +var NpcTypeValid = new ScriptInputConfigTypeValidator(NpcType.get, (input) => input >= 0 && input < NpcType.count, "Npc"); +var NpcStatValid = new ScriptInputRangeValidator(NpcStat_default.ATTACK, NpcStat_default.MAGIC, "NpcStat"); +var PlayerStatValid = new ScriptInputRangeValidator(PlayerStat_default.ATTACK, PlayerStat_default.RUNECRAFT, "PlayerStat"); +var QueueValid = new ScriptInputRangeValidator(0, 19, "AIQueue"); +var HuntTypeValid = new ScriptInputConfigTypeValidator(HuntType.get, (input) => input >= 0 && input < HuntType.count, "Hunt"); +var NpcModeValid = new ScriptInputRangeValidator(NpcMode_default.NULL, NpcMode_default.APNPC5, "NpcMode"); +var HitTypeValid = new ScriptInputRangeValidator(HitType_default.BLOCK, HitType_default.POISON, "Hit"); +var SpotAnimTypeValid = new ScriptInputConfigTypeValidator(SpotanimType.get, (input) => input >= 0 && input < SpotanimType.count, "Spotanim"); +var EnumTypeValid = new ScriptInputConfigTypeValidator(EnumType.get, (input) => input >= 0 && input < EnumType.count, "Enum"); +var ObjTypeValid = new ScriptInputConfigTypeValidator(ObjType.get, (input) => input >= 0 && input < ObjType.count, "Obj"); +var ObjStackValid = new ScriptInputRangeValidator(1, Inventory.STACK_LIMIT, "ObjStack"); +var InvTypeValid = new ScriptInputConfigTypeValidator(InvType.get, (input) => input >= 0 && input < InvType.count, "Inv"); +var CategoryTypeValid = new ScriptInputConfigTypeValidator(CategoryType.get, (input) => input >= 0 && input < CategoryType.count, "Cat"); +var IDKTypeValid = new ScriptInputConfigTypeValidator(IdkType.get, (input) => input >= 0 && input < IdkType.count, "Idk"); +var HuntVisValid = new ScriptInputRangeValidator(HuntVis_default.OFF, HuntVis_default.LINEOFWALK, "HuntVis"); +var FindSquareValid = new ScriptInputRangeValidator(MapFindSquareType_default.LINEOFWALK, MapFindSquareType_default.NONE, "FindSquare"); +var SeqTypeValid = new ScriptInputConfigTypeValidator(SeqType.get, (input) => input >= 0 && input < SeqType.count, "Seq"); +var VarPlayerValid = new ScriptInputConfigTypeValidator(VarPlayerType.get, (input) => input >= 0 && input < VarPlayerType.count, "Varp"); +var VarNpcValid = new ScriptInputConfigTypeValidator(VarNpcType.get, (input) => input >= 0 && input < VarNpcType.count, "Varn"); +var VarSharedValid = new ScriptInputConfigTypeValidator(VarSharedType.get, (input) => input >= 0 && input < VarSharedType.count, "Vars"); +var FontTypeValid = new ScriptInputConfigTypeValidator(FontType.get, (input) => input >= 0 && input < FontType.count, "Font"); +var MesanimValid = new ScriptInputConfigTypeValidator(MesanimType.get, (input) => input >= 0 && input < MesanimType.count, "Mesanim"); +var StructTypeValid = new ScriptInputConfigTypeValidator(StructType.get, (input) => input >= 0 && input < StructType.count, "Struct"); +var DbRowTypeValid = new ScriptInputConfigTypeValidator(DbRowType.get, (input) => input >= 0 && input < DbRowType.count, "Dbrow"); +var DbTableTypeValid = new ScriptInputConfigTypeValidator(DbTableType.get, (input) => input >= 0 && input < DbTableType.count, "Dbtable"); +var GenderValid = new ScriptInputRangeValidator(0, 1, "Gender"); +var SkinColourValid = new ScriptInputRangeValidator(0, 7, "SkinColour"); +function check(input, validator) { + return validator.validate(input); +} + +// src/lostcity/engine/script/handlers/CoreOps.ts +function gosub(state, id) { + if (state.fp >= 50) { + throw new Error("stack overflow"); + } + state.frames[state.fp++] = { + script: state.script, + pc: state.pc, + intLocals: state.intLocals, + stringLocals: state.stringLocals + }; + const script = ScriptProvider.get(id); + if (!script) { + throw new Error(`unable to find proc ${script}`); + } + setupNewScript(state, script); +} +function jump(state, id) { + const label = ScriptProvider.get(id); + if (!label) { + throw new Error(`unable to find label ${id}`); + } + state.debugFrames[state.debugFp++] = { + script: state.script, + pc: state.pc + }; + setupNewScript(state, label); + state.fp = 0; + state.frames = []; +} +function setupNewScript(state, script) { + state.script = script; + state.pc = -1; + state.intLocals = state.popInts(script.intArgCount); + state.stringLocals = state.popStrings(script.stringArgCount); +} +var CoreOps = { + [ScriptOpcode_default.PUSH_CONSTANT_INT]: (state) => { + state.pushInt(state.intOperand); + }, + [ScriptOpcode_default.PUSH_CONSTANT_STRING]: (state) => { + state.pushString(state.stringOperand); + }, + [ScriptOpcode_default.PUSH_VARP]: (state) => { + const secondary = state.intOperand >> 16 & 1; + if (secondary && !state._activePlayer2) { + throw new Error("No secondary active_player."); + } else if (!secondary && !state._activePlayer) { + throw new Error("No active_player."); + } + const varpType = check(state.intOperand & 65535, VarPlayerValid); + if (varpType.type === ScriptVarType.STRING) { + state.pushString(secondary ? state._activePlayer2.getVar(varpType.id) : state._activePlayer.getVar(varpType.id)); + } else { + state.pushInt(secondary ? state._activePlayer2.getVar(varpType.id) : state._activePlayer.getVar(varpType.id)); + } + }, + [ScriptOpcode_default.POP_VARP]: (state) => { + const secondary = state.intOperand >> 16 & 1; + if (secondary && !state._activePlayer2) { + throw new Error("No secondary active_player."); + } else if (!secondary && !state._activePlayer) { + throw new Error("No active_player."); + } + const varpType = check(state.intOperand & 65535, VarPlayerValid); + if (!state.pointerGet(ProtectedActivePlayer[secondary]) && varpType.protect) { + throw new Error(`%${varpType.debugname} requires protected access`); + } + if (varpType.type === ScriptVarType.STRING) { + const value = state.popString(); + if (secondary) { + state._activePlayer2.setVar(varpType.id, value); + } else { + state._activePlayer.setVar(varpType.id, value); + } + } else { + const value = state.popInt(); + if (secondary) { + state._activePlayer2.setVar(varpType.id, value); + } else { + state._activePlayer.setVar(varpType.id, value); + } + } + }, + [ScriptOpcode_default.PUSH_VARN]: (state) => { + const secondary = state.intOperand >> 16 & 1; + if (secondary && !state._activeNpc2) { + throw new Error("No secondary active_npc."); + } else if (!secondary && !state._activeNpc) { + throw new Error("No active_npc."); + } + const varnType = check(state.intOperand & 65535, VarNpcValid); + if (varnType.type === ScriptVarType.STRING) { + state.pushString(secondary ? state._activeNpc2.getVar(varnType.id) : state._activeNpc.getVar(varnType.id)); + } else { + state.pushInt(secondary ? state._activeNpc2.getVar(varnType.id) : state._activeNpc.getVar(varnType.id)); + } + }, + [ScriptOpcode_default.POP_VARN]: (state) => { + const secondary = state.intOperand >> 16 & 1; + if (secondary && !state._activeNpc2) { + throw new Error("No secondary active_npc."); + } else if (!secondary && !state._activeNpc) { + throw new Error("No active_npc."); + } + const varnType = check(state.intOperand & 65535, VarNpcValid); + if (varnType.type === ScriptVarType.STRING) { + const value = state.popInt(); + if (secondary) { + state._activeNpc2.setVar(varnType.id, value); + } else { + state._activeNpc.setVar(varnType.id, value); + } + } else { + const value = state.popInt(); + if (secondary) { + state._activeNpc2.setVar(varnType.id, value); + } else { + state._activeNpc.setVar(varnType.id, value); + } + } + }, + [ScriptOpcode_default.PUSH_INT_LOCAL]: (state) => { + state.pushInt(state.intLocals[state.intOperand]); + }, + [ScriptOpcode_default.POP_INT_LOCAL]: (state) => { + state.intLocals[state.intOperand] = state.popInt(); + }, + [ScriptOpcode_default.PUSH_STRING_LOCAL]: (state) => { + state.pushString(state.stringLocals[state.intOperand]); + }, + [ScriptOpcode_default.POP_STRING_LOCAL]: (state) => { + state.stringLocals[state.intOperand] = state.popString(); + }, + [ScriptOpcode_default.BRANCH]: (state) => { + state.pc += state.intOperand; + }, + [ScriptOpcode_default.BRANCH_NOT]: (state) => { + const b = state.popInt(); + const a = state.popInt(); + if (a !== b) { + state.pc += state.intOperand; + } + }, + [ScriptOpcode_default.BRANCH_EQUALS]: (state) => { + const b = state.popInt(); + const a = state.popInt(); + if (a === b) { + state.pc += state.intOperand; + } + }, + [ScriptOpcode_default.BRANCH_LESS_THAN]: (state) => { + const b = state.popInt(); + const a = state.popInt(); + if (a < b) { + state.pc += state.intOperand; + } + }, + [ScriptOpcode_default.BRANCH_GREATER_THAN]: (state) => { + const b = state.popInt(); + const a = state.popInt(); + if (a > b) { + state.pc += state.intOperand; + } + }, + [ScriptOpcode_default.BRANCH_LESS_THAN_OR_EQUALS]: (state) => { + const b = state.popInt(); + const a = state.popInt(); + if (a <= b) { + state.pc += state.intOperand; + } + }, + [ScriptOpcode_default.BRANCH_GREATER_THAN_OR_EQUALS]: (state) => { + const b = state.popInt(); + const a = state.popInt(); + if (a >= b) { + state.pc += state.intOperand; + } + }, + [ScriptOpcode_default.POP_INT_DISCARD]: (state) => { + state.isp--; + }, + [ScriptOpcode_default.POP_STRING_DISCARD]: (state) => { + state.ssp--; + }, + [ScriptOpcode_default.RETURN]: (state) => { + if (state.fp === 0) { + state.execution = ScriptState.FINISHED; + return; + } + const frame = state.frames[--state.fp]; + state.pc = frame.pc; + state.script = frame.script; + state.intLocals = frame.intLocals; + state.stringLocals = frame.stringLocals; + }, + [ScriptOpcode_default.JOIN_STRING]: (state) => { + const count = state.intOperand; + const strings = []; + for (let i = 0; i < count; i++) { + strings.push(state.popString()); + } + state.pushString(strings.reverse().join("")); + }, + [ScriptOpcode_default.GOSUB]: (state) => { + gosub(state, state.popInt()); + }, + [ScriptOpcode_default.GOSUB_WITH_PARAMS]: (state) => { + gosub(state, state.intOperand); + }, + [ScriptOpcode_default.JUMP]: (state) => { + jump(state, state.popInt()); + }, + [ScriptOpcode_default.JUMP_WITH_PARAMS]: (state) => { + jump(state, state.intOperand); + }, + [ScriptOpcode_default.DEFINE_ARRAY]: (state) => { + throw new Error("unimplemented"); + }, + [ScriptOpcode_default.PUSH_ARRAY_INT]: (state) => { + throw new Error("unimplemented"); + }, + [ScriptOpcode_default.POP_ARRAY_INT]: (state) => { + throw new Error("unimplemented"); + }, + [ScriptOpcode_default.SWITCH]: (state) => { + const key = state.popInt(); + const table = state.script.switchTables[state.intOperand]; + if (table === void 0) { + return; + } + const result = table[key]; + if (result) { + state.pc += result; + } + }, + [ScriptOpcode_default.PUSH_VARS]: (state) => { + const varsType = check(state.intOperand & 65535, VarSharedValid); + if (varsType.type === ScriptVarType.STRING) { + state.pushString(World_default.varsString[varsType.id] ?? ""); + } else { + state.pushInt(World_default.vars[varsType.id]); + } + }, + [ScriptOpcode_default.POP_VARS]: (state) => { + const varsType = check(state.intOperand & 65535, VarSharedValid); + if (varsType.type === ScriptVarType.STRING) { + World_default.varsString[varsType.id] = state.popString(); + } else { + World_default.vars[varsType.id] = state.popInt(); + } + } +}; +var CoreOps_default = CoreOps; + +// src/lostcity/engine/script/handlers/DbOps.ts +var DebugOps = { + [ScriptOpcode_default.DB_FIND_WITH_COUNT]: (state) => { + throw new Error("unimplemented"); + }, + [ScriptOpcode_default.DB_FINDNEXT]: (state) => { + if (!state.dbTable) { + throw new Error("No table selected"); + } + if (state.dbRow + 1 >= state.dbRowQuery.length) { + state.pushInt(-1); + return; + } + state.dbRow++; + state.pushInt(check(state.dbRowQuery[state.dbRow], DbRowTypeValid).id); + }, + [ScriptOpcode_default.DB_GETFIELD]: (state) => { + const [row, tableColumnPacked, listIndex] = state.popInts(3); + const table = tableColumnPacked >> 12 & 65535; + const column = tableColumnPacked >> 4 & 127; + const tuple = tableColumnPacked & 63; + const rowType = check(row, DbRowTypeValid); + const tableType = check(table, DbTableTypeValid); + let values; + if (rowType.tableId !== table) { + values = tableType.getDefault(column); + } else { + values = rowType.getValue(column, listIndex); + } + const valueTypes = tableType.types[column]; + for (let i = 0; i < values.length; i++) { + if (valueTypes[i] === ScriptVarType.STRING) { + state.pushString(values[i]); + } else { + state.pushInt(values[i]); + } + } + }, + [ScriptOpcode_default.DB_GETFIELDCOUNT]: (state) => { + const [row, tableColumnPacked] = state.popInts(2); + const table = tableColumnPacked >> 12 & 65535; + const column = tableColumnPacked >> 4 & 127; + const tuple = tableColumnPacked & 63; + const rowType = check(row, DbRowTypeValid); + const tableType = check(table, DbTableTypeValid); + if (rowType.tableId !== table) { + state.pushInt(0); + return; + } + state.pushInt(rowType.columnValues[column].length / tableType.types[column].length); + }, + [ScriptOpcode_default.DB_LISTALL_WITH_COUNT]: (state) => { + throw new Error("unimplemented"); + }, + [ScriptOpcode_default.DB_GETROWTABLE]: (state) => { + state.pushInt(check(state.popInt(), DbRowTypeValid).tableId); + }, + [ScriptOpcode_default.DB_FINDBYINDEX]: (state) => { + throw new Error("unimplemented"); + }, + [ScriptOpcode_default.DB_FIND_REFINE_WITH_COUNT]: (state) => { + throw new Error("unimplemented"); + }, + [ScriptOpcode_default.DB_FIND]: (state) => { + const isString = state.popInt() == 2; + const query = isString ? state.popString() : state.popInt(); + const tableColumnPacked = state.popInt(); + const table = tableColumnPacked >> 12 & 65535; + const column = tableColumnPacked >> 4 & 127; + const tuple = tableColumnPacked & 63; + state.dbTable = check(table, DbTableTypeValid); + state.dbRow = -1; + state.dbRowQuery = []; + const rows = DbRowType.getInTable(table); + for (let i = 0; i < rows.length; i++) { + const row = rows[i]; + if (row.columnValues[column].includes(query)) { + state.dbRowQuery.push(row.id); + } + } + state.pushInt(state.dbRowQuery.length); + }, + [ScriptOpcode_default.DB_FIND_REFINE]: (state) => { + const isString = state.popInt() == 2; + const query = isString ? state.popString() : state.popInt(); + const tableColumnPacked = state.popInt(); + const table = tableColumnPacked >> 12 & 65535; + const column = tableColumnPacked >> 4 & 127; + const tuple = tableColumnPacked & 63; + const found = []; + const rows = DbRowType.getInTable(table); + for (let i = 0; i < rows.length; i++) { + const row = rows[i]; + if (row.columnValues[column].includes(query)) { + found.push(row.id); + } + } + const prevQuery = state.dbRowQuery; + state.dbRow = -1; + state.dbRowQuery = []; + for (let i = 0; i < prevQuery.length; i++) { + if (found.includes(prevQuery[i])) { + state.dbRowQuery.push(prevQuery[i]); + } + } + state.pushInt(state.dbRowQuery.length); + }, + [ScriptOpcode_default.DB_LISTALL]: (state) => { + throw new Error("unimplemented"); + } +}; +var DbOps_default = DebugOps; + +// src/lostcity/engine/WorldStat.ts +var WorldStat = /* @__PURE__ */ ((WorldStat2) => { + WorldStat2[WorldStat2["CYCLE"] = 0] = "CYCLE"; + WorldStat2[WorldStat2["WORLD"] = 1] = "WORLD"; + WorldStat2[WorldStat2["CLIENT_IN"] = 2] = "CLIENT_IN"; + WorldStat2[WorldStat2["NPC"] = 3] = "NPC"; + WorldStat2[WorldStat2["PLAYER"] = 4] = "PLAYER"; + WorldStat2[WorldStat2["LOGOUT"] = 5] = "LOGOUT"; + WorldStat2[WorldStat2["LOGIN"] = 6] = "LOGIN"; + WorldStat2[WorldStat2["ZONE"] = 7] = "ZONE"; + WorldStat2[WorldStat2["CLIENT_OUT"] = 8] = "CLIENT_OUT"; + WorldStat2[WorldStat2["CLEANUP"] = 9] = "CLEANUP"; + WorldStat2[WorldStat2["BANDWIDTH_IN"] = 10] = "BANDWIDTH_IN"; + WorldStat2[WorldStat2["BANDWIDTH_OUT"] = 11] = "BANDWIDTH_OUT"; + return WorldStat2; +})(WorldStat || {}); +var WorldStat_default = WorldStat; + +// src/lostcity/engine/script/handlers/DebugOps.ts +var DebugOps2 = { + [ScriptOpcode_default.ERROR]: (state) => { + throw new Error(state.popString()); + }, + [ScriptOpcode_default.MAP_PRODUCTION]: (state) => { + state.pushInt(Environment_default.NODE_PRODUCTION ? 1 : 0); + }, + [ScriptOpcode_default.MAP_LASTCLOCK]: (state) => { + state.pushInt(World_default.lastCycleStats[WorldStat_default.CYCLE]); + }, + [ScriptOpcode_default.MAP_LASTWORLD]: (state) => { + state.pushInt(World_default.lastCycleStats[WorldStat_default.WORLD]); + }, + [ScriptOpcode_default.MAP_LASTCLIENTIN]: (state) => { + state.pushInt(World_default.lastCycleStats[WorldStat_default.CLIENT_IN]); + }, + [ScriptOpcode_default.MAP_LASTNPC]: (state) => { + state.pushInt(World_default.lastCycleStats[WorldStat_default.NPC]); + }, + [ScriptOpcode_default.MAP_LASTPLAYER]: (state) => { + state.pushInt(World_default.lastCycleStats[WorldStat_default.PLAYER]); + }, + [ScriptOpcode_default.MAP_LASTLOGOUT]: (state) => { + state.pushInt(World_default.lastCycleStats[WorldStat_default.LOGOUT]); + }, + [ScriptOpcode_default.MAP_LASTLOGIN]: (state) => { + state.pushInt(World_default.lastCycleStats[WorldStat_default.LOGIN]); + }, + [ScriptOpcode_default.MAP_LASTZONE]: (state) => { + state.pushInt(World_default.lastCycleStats[WorldStat_default.ZONE]); + }, + [ScriptOpcode_default.MAP_LASTCLIENTOUT]: (state) => { + state.pushInt(World_default.lastCycleStats[WorldStat_default.CLIENT_OUT]); + }, + [ScriptOpcode_default.MAP_LASTCLEANUP]: (state) => { + state.pushInt(World_default.lastCycleStats[WorldStat_default.CLEANUP]); + }, + [ScriptOpcode_default.MAP_LASTBANDWIDTHIN]: (state) => { + state.pushInt(World_default.lastCycleStats[WorldStat_default.BANDWIDTH_IN]); + }, + [ScriptOpcode_default.MAP_LASTBANDWIDTHOUT]: (state) => { + state.pushInt(World_default.lastCycleStats[WorldStat_default.BANDWIDTH_OUT]); + } +}; +var DebugOps_default = DebugOps2; + +// src/lostcity/engine/script/handlers/EnumOps.ts +var EnumOps = { + [ScriptOpcode_default.ENUM]: (state) => { + const [inputType, outputType, enumId, key] = state.popInts(4); + const enumType = check(enumId, EnumTypeValid); + if (enumType.inputtype !== inputType || enumType.outputtype !== outputType) { + throw new Error(`Type validation error: ${enumType.debugname} key: ${key}. Expected input: ${inputType} got: ${enumType.inputtype}. Expected output: ${outputType} got: ${enumType.outputtype}`); + } + const value = enumType.values.get(key); + if (typeof value === "string") { + state.pushString(value ?? enumType.defaultString); + } else { + state.pushInt(value ?? enumType.defaultInt); + } + }, + [ScriptOpcode_default.ENUM_GETOUTPUTCOUNT]: (state) => { + state.pushInt(check(state.popInt(), EnumTypeValid).values.size); + } +}; +var EnumOps_default = EnumOps; + +// src/lostcity/entity/EntityLifeCycle.ts +var EntityLifeCycle = /* @__PURE__ */ ((EntityLifeCycle2) => { + EntityLifeCycle2[EntityLifeCycle2["FOREVER"] = 0] = "FOREVER"; + EntityLifeCycle2[EntityLifeCycle2["RESPAWN"] = 1] = "RESPAWN"; + EntityLifeCycle2[EntityLifeCycle2["DESPAWN"] = 2] = "DESPAWN"; + return EntityLifeCycle2; +})(EntityLifeCycle || {}); +var EntityLifeCycle_default = EntityLifeCycle; + +// src/lostcity/entity/Entity.ts +var Entity = class { + // constructor + level; + x; + z; + width; + length; + lifecycle; + // runtime + lifecycleTick = -1; + lastLifecycleTick = -1; + constructor(level, x, z, width, length, lifecycle) { + this.level = level; + this.x = x; + this.z = z; + this.width = width; + this.length = length; + this.lifecycle = lifecycle; + } + updateLifeCycle(tick) { + return this.lifecycleTick === tick && this.lifecycle !== EntityLifeCycle_default.FOREVER; + } + checkLifeCycle(tick) { + if (this.lifecycle === EntityLifeCycle_default.FOREVER) { + return true; + } + if (this.lifecycle === EntityLifeCycle_default.RESPAWN) { + return this.lifecycleTick < tick; + } + if (this.lifecycle === EntityLifeCycle_default.DESPAWN) { + return this.lifecycleTick > tick; + } + return false; + } + setLifeCycle(tick) { + this.lifecycleTick = tick; + this.lastLifecycleTick = World_default.currentTick; + } +}; + +// src/lostcity/entity/NonPathingEntity.ts +var NonPathingEntity = class extends Entity { + resetEntity(respawn) { + } +}; + +// src/lostcity/entity/Obj.ts +var Obj = class extends NonPathingEntity { + // constructor properties + type; + count; + // runtime + receiverId = -1; + reveal = -1; + constructor(level, x, z, lifecycle, type, count) { + super(level, x, z, 1, 1, lifecycle); + this.type = type; + this.count = count; + } +}; + +// src/lostcity/engine/script/handlers/InvOps.ts +var InvOps = { + // inv config + [ScriptOpcode_default.INV_ALLSTOCK]: (state) => { + const invType = check(state.popInt(), InvTypeValid); + state.pushInt(invType.allstock ? 1 : 0); + }, + // inv config + [ScriptOpcode_default.INV_SIZE]: (state) => { + const invType = check(state.popInt(), InvTypeValid); + state.pushInt(invType.size); + }, + // inv config + [ScriptOpcode_default.INV_STOCKBASE]: (state) => { + const [inv, obj] = state.popInts(2); + const invType = check(inv, InvTypeValid); + const objType = check(obj, ObjTypeValid); + if (!invType.stockobj || !invType.stockcount) { + state.pushInt(-1); + return; + } + const index = invType.stockobj.indexOf(objType.id); + state.pushInt(index >= 0 ? invType.stockcount[index] : -1); + }, + // inv write + [ScriptOpcode_default.INV_ADD]: checkedHandler(ActivePlayer, (state) => { + const [inv, objId, count] = state.popInts(3); + const invType = check(inv, InvTypeValid); + const objType = check(objId, ObjTypeValid); + check(count, ObjStackValid); + if (!state.pointerGet(ProtectedActivePlayer[state.intOperand]) && invType.protect && invType.scope !== InvType.SCOPE_SHARED) { + throw new Error(`$inv requires protected access: ${invType.debugname}`); + } + if (!invType.dummyinv && objType.dummyitem !== 0) { + throw new Error(`dummyitem in non-dummyinv: ${objType.debugname} -> ${invType.debugname}`); + } + const player = state.activePlayer; + const overflow = count - player.invAdd(invType.id, objType.id, count, false); + if (overflow > 0) { + if (!objType.stackable || overflow === 1) { + for (let i = 0; i < overflow; i++) { + World_default.addObj(new Obj(player.level, player.x, player.z, EntityLifeCycle_default.DESPAWN, objType.id, 1), player.pid, 200); + } + } else { + World_default.addObj(new Obj(player.level, player.x, player.z, EntityLifeCycle_default.DESPAWN, objType.id, overflow), player.pid, 200); + } + } + }), + // inv write + [ScriptOpcode_default.INV_CHANGESLOT]: checkedHandler(ActivePlayer, (state) => { + const [inv, find, replace, replaceCount] = state.popInts(4); + throw new Error("unimplemented"); + }), + // inv write + [ScriptOpcode_default.INV_CLEAR]: checkedHandler(ActivePlayer, (state) => { + const invType = check(state.popInt(), InvTypeValid); + if (!state.pointerGet(ProtectedActivePlayer[state.intOperand]) && invType.protect && invType.scope !== InvType.SCOPE_SHARED) { + throw new Error(`$inv requires protected access: ${invType.debugname}`); + } + state.activePlayer.invClear(invType.id); + }), + // inv write + [ScriptOpcode_default.INV_DEL]: checkedHandler(ActivePlayer, (state) => { + const [inv, obj, count] = state.popInts(3); + const invType = check(inv, InvTypeValid); + const objType = check(obj, ObjTypeValid); + check(count, ObjStackValid); + if (!state.pointerGet(ProtectedActivePlayer[state.intOperand]) && invType.protect && invType.scope !== InvType.SCOPE_SHARED) { + throw new Error(`$inv requires protected access: ${invType.debugname}`); + } + state.activePlayer.invDel(invType.id, objType.id, count); + }), + // inv write + [ScriptOpcode_default.INV_DELSLOT]: checkedHandler(ActivePlayer, (state) => { + const [inv, slot] = state.popInts(2); + const invType = check(inv, InvTypeValid); + if (!state.pointerGet(ProtectedActivePlayer[state.intOperand]) && invType.protect && invType.scope !== InvType.SCOPE_SHARED) { + throw new Error(`$inv requires protected access: ${invType.debugname}`); + } + const obj = state.activePlayer.invGetSlot(invType.id, slot); + if (!obj) { + return; + } + state.activePlayer.invDelSlot(invType.id, slot); + }), + // inv write + [ScriptOpcode_default.INV_DROPITEM]: checkedHandler(ActivePlayer, (state) => { + const [inv, coord, obj, count, duration] = state.popInts(5); + const invType = check(inv, InvTypeValid); + const position = check(coord, CoordValid); + const objType = check(obj, ObjTypeValid); + check(count, ObjStackValid); + check(duration, DurationValid); + if (!state.pointerGet(ProtectedActivePlayer[state.intOperand]) && invType.protect && invType.scope !== InvType.SCOPE_SHARED) { + throw new Error(`$inv requires protected access: ${invType.debugname}`); + } + const player = state.activePlayer; + const completed = player.invDel(invType.id, objType.id, count); + if (completed == 0) { + return; + } + player.playerLog("Dropped item from", invType.debugname, objType.debugname); + const floorObj = new Obj(position.level, position.x, position.z, EntityLifeCycle_default.DESPAWN, objType.id, completed); + World_default.addObj(floorObj, player.pid, duration); + state.activeObj = floorObj; + state.pointerAdd(ActiveObj[state.intOperand]); + }), + // inv write + [ScriptOpcode_default.INV_DROPSLOT]: checkedHandler(ActivePlayer, (state) => { + const [inv, coord, slot, duration] = state.popInts(4); + const invType = check(inv, InvTypeValid); + check(duration, DurationValid); + const position = check(coord, CoordValid); + if (!state.pointerGet(ProtectedActivePlayer[state.intOperand]) && invType.protect && invType.scope !== InvType.SCOPE_SHARED) { + throw new Error(`$inv requires protected access: ${invType.debugname}`); + } + const obj = state.activePlayer.invGetSlot(invType.id, slot); + if (!obj) { + throw new Error("$slot is empty"); + } + const player = state.activePlayer; + const completed = player.invDel(invType.id, obj.id, obj.count, slot); + if (completed === 0) { + return; + } + const objType = ObjType.get(obj.id); + player.playerLog("Dropped item from", invType.debugname, objType.debugname); + if (!objType.stackable || completed === 1) { + for (let i = 0; i < completed; i++) { + const floorObj = new Obj(position.level, position.x, position.z, EntityLifeCycle_default.DESPAWN, obj.id, 1); + World_default.addObj(floorObj, player.pid, duration); + state.activeObj = floorObj; + state.pointerAdd(ActiveObj[state.intOperand]); + } + } else { + const floorObj = new Obj(position.level, position.x, position.z, EntityLifeCycle_default.DESPAWN, obj.id, completed); + World_default.addObj(floorObj, player.pid, duration); + state.activeObj = floorObj; + state.pointerAdd(ActiveObj[state.intOperand]); + } + }), + // inv read + [ScriptOpcode_default.INV_FREESPACE]: checkedHandler(ActivePlayer, (state) => { + const invType = check(state.popInt(), InvTypeValid); + state.pushInt(state.activePlayer.invFreeSpace(invType.id)); + }), + // inv read + [ScriptOpcode_default.INV_GETNUM]: checkedHandler(ActivePlayer, (state) => { + const [inv, slot] = state.popInts(2); + const invType = check(inv, InvTypeValid); + state.pushInt(state.activePlayer.invGetSlot(invType.id, slot)?.count ?? 0); + }), + // inv read + [ScriptOpcode_default.INV_GETOBJ]: checkedHandler(ActivePlayer, (state) => { + const [inv, slot] = state.popInts(2); + const invType = check(inv, InvTypeValid); + state.pushInt(state.activePlayer.invGetSlot(invType.id, slot)?.id ?? -1); + }), + // inv read + [ScriptOpcode_default.INV_ITEMSPACE]: checkedHandler(ActivePlayer, (state) => { + const [inv, obj, count, size] = state.popInts(4); + const invType = check(inv, InvTypeValid); + const objType = check(obj, ObjTypeValid); + check(count, ObjStackValid); + if (size < 0 || size > invType.size) { + throw new Error(`$count is out of range: ${count}`); + } + state.pushInt(state.activePlayer.invItemSpace(invType.id, objType.id, count, size) === 0 ? 1 : 0); + }), + // inv read + [ScriptOpcode_default.INV_ITEMSPACE2]: checkedHandler(ActivePlayer, (state) => { + const [inv, obj, count, size] = state.popInts(4); + const invType = check(inv, InvTypeValid); + const objType = check(obj, ObjTypeValid); + check(count, ObjStackValid); + state.pushInt(state.activePlayer.invItemSpace(invType.id, objType.id, count, size)); + }), + // inv write + [ScriptOpcode_default.INV_MOVEFROMSLOT]: checkedHandler(ActivePlayer, (state) => { + const [fromInv, toInv, fromSlot] = state.popInts(3); + const fromInvType = check(fromInv, InvTypeValid); + const toInvType = check(toInv, InvTypeValid); + if (!state.pointerGet(ProtectedActivePlayer[state.intOperand]) && fromInvType.protect && fromInvType.scope !== InvType.SCOPE_SHARED) { + throw new Error(`$inv requires protected access: ${fromInvType.debugname}`); + } + if (!state.pointerGet(ProtectedActivePlayer[state.intOperand]) && toInvType.protect && fromInvType.scope !== InvType.SCOPE_SHARED) { + throw new Error(`$inv requires protected access: ${toInvType.debugname}`); + } + const player = state.activePlayer; + const { overflow, fromObj } = player.invMoveFromSlot(fromInvType.id, toInvType.id, fromSlot); + if (overflow > 0) { + const objType = ObjType.get(fromObj); + if (!objType.stackable || overflow === 1) { + for (let i = 0; i < overflow; i++) { + World_default.addObj(new Obj(player.level, player.x, player.z, EntityLifeCycle_default.DESPAWN, fromObj, 1), player.pid, 200); + } + } else { + World_default.addObj(new Obj(player.level, player.x, player.z, EntityLifeCycle_default.DESPAWN, fromObj, overflow), player.pid, 200); + } + } + }), + // inv write + [ScriptOpcode_default.INV_MOVETOSLOT]: checkedHandler(ActivePlayer, (state) => { + const [fromInv, toInv, fromSlot, toSlot] = state.popInts(4); + const fromInvType = check(fromInv, InvTypeValid); + const toInvType = check(toInv, InvTypeValid); + if (!state.pointerGet(ProtectedActivePlayer[state.intOperand]) && fromInvType.protect && fromInvType.scope !== InvType.SCOPE_SHARED) { + throw new Error(`$inv requires protected access: ${fromInvType.debugname}`); + } + if (!state.pointerGet(ProtectedActivePlayer[state.intOperand]) && toInvType.protect && fromInvType.scope !== InvType.SCOPE_SHARED) { + throw new Error(`$inv requires protected access: ${toInvType.debugname}`); + } + state.activePlayer.invMoveToSlot(fromInvType.id, toInvType.id, fromSlot, toSlot); + }), + // inv write + [ScriptOpcode_default.BOTH_MOVEINV]: checkedHandler(ActivePlayer, (state) => { + const [from, to] = state.popInts(2); + const fromInvType = check(from, InvTypeValid); + const toInvType = check(to, InvTypeValid); + const secondary = state.intOperand == 1; + const fromPlayer = secondary ? state._activePlayer2 : state._activePlayer; + const toPlayer = secondary ? state._activePlayer : state._activePlayer2; + if (!fromPlayer || !toPlayer) { + throw new Error("player is null"); + } + if (!state.pointerGet(ProtectedActivePlayer[secondary ? 1 : 0]) && fromInvType.protect && fromInvType.scope !== InvType.SCOPE_SHARED) { + throw new Error(`$from_inv requires protected access: ${fromInvType.debugname}`); + } + if (!state.pointerGet(ProtectedActivePlayer[secondary ? 0 : 1]) && toInvType.protect && fromInvType.scope !== InvType.SCOPE_SHARED) { + throw new Error(`$to_inv requires protected access: ${toInvType.debugname}`); + } + const fromInv = fromPlayer.getInventory(from); + const toInv = toPlayer.getInventory(to); + if (!fromInv || !toInv) { + throw new Error("inv is null"); + } + for (let slot = 0; slot < fromInv.capacity; slot++) { + const obj = fromInv.get(slot); + if (!obj) { + continue; + } + fromInv.delete(slot); + toInv.add(obj.id, obj.count); + fromPlayer.playerLog("Gave " + ObjType.get(obj.id).name + " x" + obj.count + " during trade with " + toPlayer.username); + toPlayer.playerLog("Received " + ObjType.get(obj.id).name + " x" + obj.count + " during trade with " + fromPlayer.username); + } + }), + // inv write + [ScriptOpcode_default.INV_MOVEITEM]: checkedHandler(ActivePlayer, (state) => { + const [fromInv, toInv, obj, count] = state.popInts(4); + const fromInvType = check(fromInv, InvTypeValid); + const toInvType = check(toInv, InvTypeValid); + const objType = check(obj, ObjTypeValid); + check(count, ObjStackValid); + if (!state.pointerGet(ProtectedActivePlayer[state.intOperand]) && fromInvType.protect && fromInvType.scope !== InvType.SCOPE_SHARED) { + throw new Error(`$inv requires protected access: ${fromInvType.debugname}`); + } + if (!state.pointerGet(ProtectedActivePlayer[state.intOperand]) && toInvType.protect && fromInvType.scope !== InvType.SCOPE_SHARED) { + throw new Error(`$inv requires protected access: ${toInvType.debugname}`); + } + const player = state.activePlayer; + const completed = player.invDel(fromInvType.id, objType.id, count); + if (completed == 0) { + return; + } + const overflow = count - player.invAdd(toInvType.id, objType.id, completed, false); + if (overflow > 0) { + if (!objType.stackable || overflow === 1) { + for (let i = 0; i < overflow; i++) { + World_default.addObj(new Obj(player.level, player.x, player.z, EntityLifeCycle_default.DESPAWN, objType.id, 1), player.pid, 200); + } + } else { + World_default.addObj(new Obj(player.level, player.x, player.z, EntityLifeCycle_default.DESPAWN, objType.id, overflow), player.pid, 200); + } + } + }), + // inv write + [ScriptOpcode_default.INV_MOVEITEM_CERT]: checkedHandler(ActivePlayer, (state) => { + const [fromInv, toInv, obj, count] = state.popInts(4); + const fromInvType = check(fromInv, InvTypeValid); + const toInvType = check(toInv, InvTypeValid); + const objType = check(obj, ObjTypeValid); + check(count, ObjStackValid); + if (!state.pointerGet(ProtectedActivePlayer[state.intOperand]) && fromInvType.protect && fromInvType.scope !== InvType.SCOPE_SHARED) { + throw new Error(`$inv requires protected access: ${fromInvType.debugname}`); + } + if (!state.pointerGet(ProtectedActivePlayer[state.intOperand]) && toInvType.protect && fromInvType.scope !== InvType.SCOPE_SHARED) { + throw new Error(`$inv requires protected access: ${toInvType.debugname}`); + } + const player = state.activePlayer; + const completed = player.invDel(fromInvType.id, objType.id, count); + if (completed == 0) { + return; + } + let finalObj = objType.id; + if (objType.certtemplate === -1 && objType.certlink >= 0) { + finalObj = objType.certlink; + } + const overflow = count - player.invAdd(toInvType.id, finalObj, completed, false); + if (overflow > 0) { + World_default.addObj(new Obj(player.level, player.x, player.z, EntityLifeCycle_default.DESPAWN, finalObj, overflow), player.pid, 200); + } + }), + // inv write + [ScriptOpcode_default.INV_MOVEITEM_UNCERT]: checkedHandler(ActivePlayer, (state) => { + const [fromInv, toInv, obj, count] = state.popInts(4); + const fromInvType = check(fromInv, InvTypeValid); + const toInvType = check(toInv, InvTypeValid); + const objType = check(obj, ObjTypeValid); + check(count, ObjStackValid); + if (!state.pointerGet(ProtectedActivePlayer[state.intOperand]) && fromInvType.protect && fromInvType.scope !== InvType.SCOPE_SHARED) { + throw new Error(`$inv requires protected access: ${fromInvType.debugname}`); + } + if (!state.pointerGet(ProtectedActivePlayer[state.intOperand]) && toInvType.protect && fromInvType.scope !== InvType.SCOPE_SHARED) { + throw new Error(`$inv requires protected access: ${toInvType.debugname}`); + } + const player = state.activePlayer; + const completed = player.invDel(fromInvType.id, objType.id, count); + if (completed == 0) { + return; + } + if (objType.certtemplate >= 0 && objType.certlink >= 0) { + player.invAdd(toInvType.id, objType.certlink, completed); + } else { + player.invAdd(toInvType.id, objType.id, completed); + } + }), + // inv write + [ScriptOpcode_default.INV_SETSLOT]: checkedHandler(ActivePlayer, (state) => { + const [inv, slot, objId, count] = state.popInts(4); + const invType = check(inv, InvTypeValid); + const objType = check(objId, ObjTypeValid); + check(count, ObjStackValid); + if (!state.pointerGet(ProtectedActivePlayer[state.intOperand]) && invType.protect && invType.scope !== InvType.SCOPE_SHARED) { + throw new Error(`$inv requires protected access: ${invType.debugname}`); + } + if (!invType.dummyinv && objType.dummyitem !== 0) { + throw new Error(`dummyitem in non-dummyinv: ${objType.debugname} -> ${invType.debugname}`); + } + state.activePlayer.invSet(invType.id, objType.id, count, slot); + }), + // inv read + [ScriptOpcode_default.INV_TOTAL]: checkedHandler(ActivePlayer, (state) => { + const [inv, obj] = state.popInts(2); + const invType = check(inv, InvTypeValid); + if (obj === -1) { + state.pushInt(0); + return; + } + state.pushInt(state.activePlayer.invTotal(invType.id, obj)); + }), + // inv read + [ScriptOpcode_default.INV_TOTALCAT]: checkedHandler(ActivePlayer, (state) => { + const [inv, category] = state.popInts(2); + const invType = check(inv, InvTypeValid); + const catType = check(category, CategoryTypeValid); + state.pushInt(state.activePlayer.invTotalCat(invType.id, catType.id)); + }), + // inv protocol + [ScriptOpcode_default.INV_TRANSMIT]: checkedHandler(ActivePlayer, (state) => { + const [inv, com] = state.popInts(2); + const invType = check(inv, InvTypeValid); + check(com, NumberNotNull); + state.activePlayer.invListenOnCom(invType.id, com, state.activePlayer.uid); + }), + // inv protocol + [ScriptOpcode_default.INVOTHER_TRANSMIT]: checkedHandler(ActivePlayer, (state) => { + const [uid, inv, com] = state.popInts(3); + check(uid, NumberNotNull); + const invType = check(inv, InvTypeValid); + check(com, NumberNotNull); + state.activePlayer.invListenOnCom(invType.id, com, uid); + }), + // inv protocol + [ScriptOpcode_default.INV_STOPTRANSMIT]: checkedHandler(ActivePlayer, (state) => { + const com = check(state.popInt(), NumberNotNull); + state.activePlayer.invStopListenOnCom(com); + }), + // inv write + [ScriptOpcode_default.BOTH_DROPSLOT]: checkedHandler(ActivePlayer, (state) => { + const [inv, coord, slot, duration] = state.popInts(4); + const invType = check(inv, InvTypeValid); + check(duration, DurationValid); + const position = check(coord, CoordValid); + const secondary = state.intOperand == 1; + const fromPlayer = secondary ? state._activePlayer2 : state._activePlayer; + const toPlayer = secondary ? state._activePlayer : state._activePlayer2; + if (!fromPlayer || !toPlayer) { + throw new Error("player is null"); + } + if (!state.pointerGet(ProtectedActivePlayer[secondary ? 1 : 0]) && invType.protect && invType.scope !== InvType.SCOPE_SHARED) { + throw new Error(`inv requires protected access: ${invType.debugname}`); + } + const obj = fromPlayer.invGetSlot(invType.id, slot); + if (!obj) { + throw new Error("$slot is empty"); + } + const completed = fromPlayer.invDel(invType.id, obj.id, obj.count, slot); + if (completed === 0) { + return; + } + const objType = ObjType.get(obj.id); + fromPlayer.playerLog("Dropped item from", invType.debugname, objType.debugname); + if (!objType.tradeable) { + return; + } + World_default.addObj(new Obj(position.level, position.x, position.z, EntityLifeCycle_default.DESPAWN, obj.id, completed), toPlayer.pid, duration); + }), + // inv write + [ScriptOpcode_default.INV_DROPALL]: checkedHandler(ActivePlayer, (state) => { + const [inv, coord, duration] = state.popInts(3); + const invType = check(inv, InvTypeValid); + check(duration, DurationValid); + const position = check(coord, CoordValid); + if (!state.pointerGet(ProtectedActivePlayer[state.intOperand]) && invType.protect && invType.scope !== InvType.SCOPE_SHARED) { + throw new Error(`$inv requires protected access: ${invType.debugname}`); + } + const inventory = state.activePlayer.getInventory(invType.id); + if (!inventory) { + return; + } + for (let slot = 0; slot < inventory.capacity; slot++) { + const obj = inventory.get(slot); + if (!obj) { + continue; + } + inventory.delete(slot); + const objType = ObjType.get(obj.id); + if (!objType.tradeable) { + continue; + } + World_default.addObj(new Obj(position.level, position.x, position.z, EntityLifeCycle_default.DESPAWN, obj.id, obj.count), -1, duration); + } + }), + [ScriptOpcode_default.INV_TOTALPARAM]: checkedHandler(ActivePlayer, (state) => { + const [inv, param] = state.popInts(2); + state.pushInt(state.activePlayer.invTotalParam(inv, param)); + }), + [ScriptOpcode_default.INV_TOTALPARAM_STACK]: checkedHandler(ActivePlayer, (state) => { + const [inv, param] = state.popInts(2); + state.pushInt(state.activePlayer.invTotalParamStack(inv, param)); + }) +}; +var InvOps_default = InvOps; + +// src/lostcity/entity/NpcIteratorType.ts +var NpcIteratorType = /* @__PURE__ */ ((NpcIteratorType2) => { + NpcIteratorType2[NpcIteratorType2["ZONE"] = 0] = "ZONE"; + NpcIteratorType2[NpcIteratorType2["DISTANCE"] = 1] = "DISTANCE"; + return NpcIteratorType2; +})(NpcIteratorType || {}); +var NpcIteratorType_default = NpcIteratorType; + +// src/lostcity/engine/script/ScriptIterators.ts +var ScriptIterator = class { + iterator; + tick; + constructor(tick) { + this.iterator = this.generator(); + this.tick = tick; + } + [Symbol.iterator]() { + return this.iterator; + } + next() { + return this.iterator.next(); + } +}; +var HuntIterator = class extends ScriptIterator { + // a radius of 1 will loop 9 zones + // a radius of 2 will loop 25 zones + // a radius of 3 will loop 49 zones + x; + z; + level; + minX; + maxX; + minZ; + maxZ; + distance; + checkVis; + checkType; + checkCategory; + type; + constructor(tick, level, x, z, distance, checkVis, checkType, checkCategory, type) { + super(tick); + const centerX = Position.zone(x); + const centerZ = Position.zone(z); + const radius = 1 + distance / 8 | 0; + this.x = x; + this.z = z; + this.level = level; + this.maxX = centerX + radius; + this.minX = centerX - radius; + this.maxZ = centerZ + radius; + this.minZ = centerZ - radius; + this.distance = distance; + this.checkVis = checkVis; + this.checkType = checkType; + this.checkCategory = checkCategory; + this.type = type; + } + *generator() { + for (let x = this.maxX; x >= this.minX; x--) { + const zoneX = x << 3; + for (let z = this.maxZ; z >= this.minZ; z--) { + const zoneZ = z << 3; + if (this.type === HuntModeType_default.PLAYER) { + for (const player of World_default.getZone(zoneX, zoneZ, this.level).getAllPlayersSafe()) { + if (World_default.currentTick > this.tick) { + throw new Error("[HuntIterator] tried to use an old iterator. Create a new iterator instead."); + } + if (Position.distanceToSW({ x: this.x, z: this.z }, player) > this.distance) { + continue; + } + if (this.checkVis === HuntVis_default.LINEOFSIGHT && !hasLineOfSight(this.level, this.x, this.z, player.x, player.z, 1, 1, 1, 1)) { + continue; + } + if (this.checkVis === HuntVis_default.LINEOFWALK && !hasLineOfWalk(this.level, this.x, this.z, player.x, player.z, 1, 1, 1, 1)) { + continue; + } + yield player; + } + } else if (this.type === HuntModeType_default.NPC) { + for (const npc of World_default.getZone(zoneX, zoneZ, this.level).getAllNpcsSafe()) { + if (World_default.currentTick > this.tick) { + throw new Error("[HuntIterator] tried to use an old iterator. Create a new iterator instead."); + } + if (this.checkType !== -1 && npc.type !== this.checkType) { + continue; + } + const npcType = NpcType.get(npc.type); + if (this.checkCategory !== -1 && npcType.category !== this.checkCategory) { + continue; + } + if (!npcType.op) { + continue; + } + if (!npcType.op[1]) { + continue; + } + if (Position.distanceToSW({ x: this.x, z: this.z }, npc) > this.distance) { + continue; + } + if (this.checkVis === HuntVis_default.LINEOFSIGHT && !hasLineOfSight(this.level, this.x, this.z, npc.x, npc.z, 1, 1, 1, 1)) { + continue; + } + if (this.checkVis === HuntVis_default.LINEOFWALK && !hasLineOfWalk(this.level, this.x, this.z, npc.x, npc.z, 1, 1, 1, 1)) { + continue; + } + yield npc; + } + } else if (this.type === HuntModeType_default.OBJ) { + for (const obj of World_default.getZone(zoneX, zoneZ, this.level).getAllObjsSafe()) { + if (World_default.currentTick > this.tick) { + throw new Error("[HuntIterator] tried to use an old iterator. Create a new iterator instead."); + } + if (this.checkType !== -1 && obj.type !== this.checkType) { + continue; + } + const objType = ObjType.get(obj.type); + if (this.checkCategory !== -1 && objType.category !== this.checkCategory) { + continue; + } + if (Position.distanceToSW({ x: this.x, z: this.z }, obj) > this.distance) { + continue; + } + if (this.checkVis === HuntVis_default.LINEOFSIGHT && !hasLineOfSight(this.level, this.x, this.z, obj.x, obj.z, 1, 1, 1, 1)) { + continue; + } + if (this.checkVis === HuntVis_default.LINEOFWALK && !hasLineOfWalk(this.level, this.x, this.z, obj.x, obj.z, 1, 1, 1, 1)) { + continue; + } + yield obj; + } + } else if (this.type === HuntModeType_default.SCENERY) { + for (const loc of World_default.getZone(zoneX, zoneZ, this.level).getAllLocsSafe()) { + if (World_default.currentTick > this.tick) { + throw new Error("[HuntIterator] tried to use an old iterator. Create a new iterator instead."); + } + if (this.checkType !== -1 && loc.type !== this.checkType) { + continue; + } + const locType = LocType.get(loc.type); + if (this.checkCategory !== -1 && locType.category !== this.checkCategory) { + continue; + } + if (Position.distanceToSW({ x: this.x, z: this.z }, loc) > this.distance) { + continue; + } + if (this.checkVis === HuntVis_default.LINEOFSIGHT && !hasLineOfSight(this.level, this.x, this.z, loc.x, loc.z, 1, 1, 1, 1)) { + continue; + } + if (this.checkVis === HuntVis_default.LINEOFWALK && !hasLineOfWalk(this.level, this.x, this.z, loc.x, loc.z, 1, 1, 1, 1)) { + continue; + } + yield loc; + } + } + } + } + } +}; +var NpcIterator = class extends ScriptIterator { + level; + x; + z; + minX; + maxX; + minZ; + maxZ; + distance; + checkVis; + type; + constructor(tick, level, x, z, distance, checkVis, type) { + super(tick); + const centerX = Position.zone(x); + const centerZ = Position.zone(z); + const radius = 1 + distance / 8 | 0; + this.x = x; + this.z = z; + this.level = level; + this.maxX = centerX + radius; + this.minX = centerX - radius; + this.maxZ = centerZ + radius; + this.minZ = centerZ - radius; + this.distance = distance; + this.checkVis = checkVis; + this.type = type; + } + *generator() { + if (this.type === NpcIteratorType_default.ZONE) { + for (const npc of World_default.getZone(this.x, this.z, this.level).getAllNpcsSafe()) { + if (World_default.currentTick > this.tick) { + throw new Error("[NpcIterator] tried to use an old iterator. Create a new iterator instead."); + } + yield npc; + } + } else if (this.type === NpcIteratorType_default.DISTANCE) { + for (let x = this.maxX; x >= this.minX; x--) { + const zoneX = x << 3; + for (let z = this.maxZ; z >= this.minZ; z--) { + const zoneZ = z << 3; + for (const npc of World_default.getZone(zoneX, zoneZ, this.level).getAllNpcsSafe()) { + if (World_default.currentTick > this.tick) { + throw new Error("[NpcIterator] tried to use an old iterator. Create a new iterator instead."); + } + if (Position.distanceToSW({ x: this.x, z: this.z }, npc) > this.distance) { + continue; + } + if (this.checkVis === HuntVis_default.LINEOFSIGHT && !hasLineOfSight(this.level, this.x, this.z, npc.x, npc.z, 1, 1, 1, 1)) { + continue; + } + if (this.checkVis === HuntVis_default.LINEOFWALK && !hasLineOfWalk(this.level, this.x, this.z, npc.x, npc.z, 1, 1, 1, 1)) { + continue; + } + yield npc; + } + } + } + } + } +}; +var LocIterator = class extends ScriptIterator { + level; + x; + z; + constructor(tick, level, x, z) { + super(tick); + this.level = level; + this.x = x; + this.z = z; + } + *generator() { + for (const loc of World_default.getZone(this.x, this.z, this.level).getAllLocsSafe()) { + if (World_default.currentTick > this.tick) { + throw new Error("[LocIterator] tried to use an old iterator. Create a new iterator instead."); + } + yield loc; + } + } +}; + +// src/lostcity/entity/Loc.ts +var Loc = class extends NonPathingEntity { + // constructor properties + info; + constructor(level, x, z, width, length, lifecycle, type, shape, angle) { + super(level, x, z, width, length, lifecycle); + this.info = type & 16383 | (shape & 31) << 14 | (angle & 3) << 19; + } + get type() { + return this.info & 16383; + } + get shape() { + return this.info >> 14 & 31; + } + get angle() { + return this.info >> 19 & 3; + } +}; + +// src/lostcity/engine/script/handlers/LocOps.ts +var LocOps = { + [ScriptOpcode_default.LOC_ADD]: (state) => { + const [coord, type, angle, shape, duration] = state.popInts(5); + const position = check(coord, CoordValid); + const locType = check(type, LocTypeValid); + const locAngle = check(angle, LocAngleValid); + const locShape = check(shape, LocShapeValid); + check(duration, DurationValid); + const created = new Loc(position.level, position.x, position.z, locType.width, locType.length, EntityLifeCycle_default.DESPAWN, locType.id, locShape, locAngle); + const locs = World_default.getZone(position.x, position.z, position.level).getLocsUnsafe(Position.packZoneCoord(position.x, position.z)); + for (const loc of locs) { + if (loc !== created && loc.angle === locAngle && loc.shape === locShape) { + World_default.removeLoc(loc, duration); + break; + } + } + World_default.addLoc(created, duration); + state.activeLoc = created; + state.pointerAdd(ActiveLoc[state.intOperand]); + }, + [ScriptOpcode_default.LOC_ANGLE]: checkedHandler(ActiveLoc, (state) => { + state.pushInt(check(state.activeLoc.angle, LocAngleValid)); + }), + [ScriptOpcode_default.LOC_ANIM]: checkedHandler(ActiveLoc, (state) => { + const seqType = check(state.popInt(), SeqTypeValid); + World_default.animLoc(state.activeLoc, seqType.id); + }), + [ScriptOpcode_default.LOC_CATEGORY]: checkedHandler(ActiveLoc, (state) => { + state.pushInt(check(state.activeLoc.type, LocTypeValid).category); + }), + [ScriptOpcode_default.LOC_CHANGE]: checkedHandler(ActiveLoc, (state) => { + const [id, duration] = state.popInts(2); + const locType = check(id, LocTypeValid); + check(duration, DurationValid); + World_default.removeLoc(state.activeLoc, duration); + const { level, x, z, angle, shape } = state.activeLoc; + const created = new Loc(level, x, z, locType.width, locType.length, EntityLifeCycle_default.DESPAWN, locType.id, shape, angle); + const locs = World_default.getZone(x, z, level).getLocsUnsafe(Position.packZoneCoord(x, z)); + for (const loc of locs) { + if (loc !== created && loc.angle === angle && loc.shape === shape) { + World_default.removeLoc(loc, duration); + break; + } + } + World_default.addLoc(created, duration); + state.activeLoc = created; + state.pointerAdd(ActiveLoc[state.intOperand]); + }), + [ScriptOpcode_default.LOC_COORD]: checkedHandler(ActiveLoc, (state) => { + const position = state.activeLoc; + state.pushInt(Position.packCoord(position.level, position.x, position.z)); + }), + [ScriptOpcode_default.LOC_DEL]: checkedHandler(ActiveLoc, (state) => { + const duration = check(state.popInt(), DurationValid); + const { level, x, z, angle, shape } = state.activeLoc; + const locs = World_default.getZone(x, z, level).getLocsUnsafe(Position.packZoneCoord(x, z)); + for (const loc of locs) { + if (loc !== state.activeLoc && loc.angle === angle && loc.shape === shape) { + World_default.removeLoc(loc, duration); + break; + } + } + World_default.removeLoc(state.activeLoc, duration); + }), + [ScriptOpcode_default.LOC_FIND]: (state) => { + const [coord, locId] = state.popInts(2); + const locType = check(locId, LocTypeValid); + const position = check(coord, CoordValid); + const loc = World_default.getLoc(position.x, position.z, position.level, locType.id); + if (!loc) { + state.pushInt(0); + return; + } + state.activeLoc = loc; + state.pointerAdd(ActiveLoc[state.intOperand]); + state.pushInt(1); + }, + [ScriptOpcode_default.LOC_FINDALLZONE]: (state) => { + const position = check(state.popInt(), CoordValid); + state.locIterator = new LocIterator(World_default.currentTick, position.level, position.x, position.z); + if (state._activeLoc) { + state._activeLoc2 = state._activeLoc; + state.pointerAdd(ScriptPointer_default.ActiveLoc2); + } + }, + [ScriptOpcode_default.LOC_FINDNEXT]: (state) => { + const result = state.locIterator?.next(); + if (!result || result.done) { + state.pushInt(0); + return; + } + state.activeLoc = result.value; + state.pointerAdd(ActiveLoc[state.intOperand]); + state.pushInt(1); + }, + [ScriptOpcode_default.LOC_PARAM]: checkedHandler(ActiveLoc, (state) => { + const paramType = check(state.popInt(), ParamTypeValid); + const locType = check(state.activeLoc.type, LocTypeValid); + if (paramType.isString()) { + state.pushString(ParamHelper.getStringParam(paramType.id, locType, paramType.defaultString)); + } else { + state.pushInt(ParamHelper.getIntParam(paramType.id, locType, paramType.defaultInt)); + } + }), + [ScriptOpcode_default.LOC_TYPE]: checkedHandler(ActiveLoc, (state) => { + state.pushInt(check(state.activeLoc.type, LocTypeValid).id); + }), + [ScriptOpcode_default.LOC_NAME]: checkedHandler(ActiveLoc, (state) => { + state.pushString(check(state.activeLoc.type, LocTypeValid).name ?? "null"); + }), + [ScriptOpcode_default.LOC_SHAPE]: checkedHandler(ActiveLoc, (state) => { + state.pushInt(check(state.activeLoc.shape, LocShapeValid)); + }) +}; +var LocOps_default = LocOps; + +// src/lostcity/engine/script/handlers/LocConfigOps.ts +var LocConfigOps = { + [ScriptOpcode_default.LC_NAME]: (state) => { + const locType = check(state.popInt(), LocTypeValid); + state.pushString(locType.name ?? locType.debugname ?? "null"); + }, + [ScriptOpcode_default.LC_PARAM]: (state) => { + const [locId, paramId] = state.popInts(2); + const locType = check(locId, LocTypeValid); + const paramType = check(paramId, ParamTypeValid); + if (paramType.isString()) { + state.pushString(ParamHelper.getStringParam(paramType.id, locType, paramType.defaultString)); + } else { + state.pushInt(ParamHelper.getIntParam(paramType.id, locType, paramType.defaultInt)); + } + }, + [ScriptOpcode_default.LC_CATEGORY]: (state) => { + state.pushInt(check(state.popInt(), LocTypeValid).category); + }, + [ScriptOpcode_default.LC_DESC]: (state) => { + state.pushString(check(state.popInt(), LocTypeValid).desc ?? "null"); + }, + [ScriptOpcode_default.LC_DEBUGNAME]: (state) => { + state.pushString(check(state.popInt(), LocTypeValid).debugname ?? "null"); + }, + [ScriptOpcode_default.LC_WIDTH]: (state) => { + state.pushInt(check(state.popInt(), LocTypeValid).width); + }, + [ScriptOpcode_default.LC_LENGTH]: (state) => { + state.pushInt(check(state.popInt(), LocTypeValid).length); + } +}; +var LocConfigOps_default = LocConfigOps; + +// src/lostcity/engine/script/ServerTriggerType.ts +var ServerTriggerType = /* @__PURE__ */ ((ServerTriggerType2) => { + ServerTriggerType2[ServerTriggerType2["PROC"] = 0] = "PROC"; + ServerTriggerType2[ServerTriggerType2["LABEL"] = 1] = "LABEL"; + ServerTriggerType2[ServerTriggerType2["DEBUGPROC"] = 2] = "DEBUGPROC"; + ServerTriggerType2[ServerTriggerType2["APNPC1"] = 3] = "APNPC1"; + ServerTriggerType2[ServerTriggerType2["APNPC2"] = 4] = "APNPC2"; + ServerTriggerType2[ServerTriggerType2["APNPC3"] = 5] = "APNPC3"; + ServerTriggerType2[ServerTriggerType2["APNPC4"] = 6] = "APNPC4"; + ServerTriggerType2[ServerTriggerType2["APNPC5"] = 7] = "APNPC5"; + ServerTriggerType2[ServerTriggerType2["APNPCU"] = 8] = "APNPCU"; + ServerTriggerType2[ServerTriggerType2["APNPCT"] = 9] = "APNPCT"; + ServerTriggerType2[ServerTriggerType2["OPNPC1"] = 10] = "OPNPC1"; + ServerTriggerType2[ServerTriggerType2["OPNPC2"] = 11] = "OPNPC2"; + ServerTriggerType2[ServerTriggerType2["OPNPC3"] = 12] = "OPNPC3"; + ServerTriggerType2[ServerTriggerType2["OPNPC4"] = 13] = "OPNPC4"; + ServerTriggerType2[ServerTriggerType2["OPNPC5"] = 14] = "OPNPC5"; + ServerTriggerType2[ServerTriggerType2["OPNPCU"] = 15] = "OPNPCU"; + ServerTriggerType2[ServerTriggerType2["OPNPCT"] = 16] = "OPNPCT"; + ServerTriggerType2[ServerTriggerType2["AI_APNPC1"] = 17] = "AI_APNPC1"; + ServerTriggerType2[ServerTriggerType2["AI_APNPC2"] = 18] = "AI_APNPC2"; + ServerTriggerType2[ServerTriggerType2["AI_APNPC3"] = 19] = "AI_APNPC3"; + ServerTriggerType2[ServerTriggerType2["AI_APNPC4"] = 20] = "AI_APNPC4"; + ServerTriggerType2[ServerTriggerType2["AI_APNPC5"] = 21] = "AI_APNPC5"; + ServerTriggerType2[ServerTriggerType2["AI_OPNPC1"] = 24] = "AI_OPNPC1"; + ServerTriggerType2[ServerTriggerType2["AI_OPNPC2"] = 25] = "AI_OPNPC2"; + ServerTriggerType2[ServerTriggerType2["AI_OPNPC3"] = 26] = "AI_OPNPC3"; + ServerTriggerType2[ServerTriggerType2["AI_OPNPC4"] = 27] = "AI_OPNPC4"; + ServerTriggerType2[ServerTriggerType2["AI_OPNPC5"] = 28] = "AI_OPNPC5"; + ServerTriggerType2[ServerTriggerType2["APOBJ1"] = 31] = "APOBJ1"; + ServerTriggerType2[ServerTriggerType2["APOBJ2"] = 32] = "APOBJ2"; + ServerTriggerType2[ServerTriggerType2["APOBJ3"] = 33] = "APOBJ3"; + ServerTriggerType2[ServerTriggerType2["APOBJ4"] = 34] = "APOBJ4"; + ServerTriggerType2[ServerTriggerType2["APOBJ5"] = 35] = "APOBJ5"; + ServerTriggerType2[ServerTriggerType2["APOBJU"] = 36] = "APOBJU"; + ServerTriggerType2[ServerTriggerType2["APOBJT"] = 37] = "APOBJT"; + ServerTriggerType2[ServerTriggerType2["OPOBJ1"] = 38] = "OPOBJ1"; + ServerTriggerType2[ServerTriggerType2["OPOBJ2"] = 39] = "OPOBJ2"; + ServerTriggerType2[ServerTriggerType2["OPOBJ3"] = 40] = "OPOBJ3"; + ServerTriggerType2[ServerTriggerType2["OPOBJ4"] = 41] = "OPOBJ4"; + ServerTriggerType2[ServerTriggerType2["OPOBJ5"] = 42] = "OPOBJ5"; + ServerTriggerType2[ServerTriggerType2["OPOBJU"] = 43] = "OPOBJU"; + ServerTriggerType2[ServerTriggerType2["OPOBJT"] = 44] = "OPOBJT"; + ServerTriggerType2[ServerTriggerType2["AI_APOBJ1"] = 45] = "AI_APOBJ1"; + ServerTriggerType2[ServerTriggerType2["AI_APOBJ2"] = 46] = "AI_APOBJ2"; + ServerTriggerType2[ServerTriggerType2["AI_APOBJ3"] = 47] = "AI_APOBJ3"; + ServerTriggerType2[ServerTriggerType2["AI_APOBJ4"] = 48] = "AI_APOBJ4"; + ServerTriggerType2[ServerTriggerType2["AI_APOBJ5"] = 49] = "AI_APOBJ5"; + ServerTriggerType2[ServerTriggerType2["AI_OPOBJ1"] = 52] = "AI_OPOBJ1"; + ServerTriggerType2[ServerTriggerType2["AI_OPOBJ2"] = 53] = "AI_OPOBJ2"; + ServerTriggerType2[ServerTriggerType2["AI_OPOBJ3"] = 54] = "AI_OPOBJ3"; + ServerTriggerType2[ServerTriggerType2["AI_OPOBJ4"] = 55] = "AI_OPOBJ4"; + ServerTriggerType2[ServerTriggerType2["AI_OPOBJ5"] = 56] = "AI_OPOBJ5"; + ServerTriggerType2[ServerTriggerType2["APLOC1"] = 59] = "APLOC1"; + ServerTriggerType2[ServerTriggerType2["APLOC2"] = 60] = "APLOC2"; + ServerTriggerType2[ServerTriggerType2["APLOC3"] = 61] = "APLOC3"; + ServerTriggerType2[ServerTriggerType2["APLOC4"] = 62] = "APLOC4"; + ServerTriggerType2[ServerTriggerType2["APLOC5"] = 63] = "APLOC5"; + ServerTriggerType2[ServerTriggerType2["APLOCU"] = 64] = "APLOCU"; + ServerTriggerType2[ServerTriggerType2["APLOCT"] = 65] = "APLOCT"; + ServerTriggerType2[ServerTriggerType2["OPLOC1"] = 66] = "OPLOC1"; + ServerTriggerType2[ServerTriggerType2["OPLOC2"] = 67] = "OPLOC2"; + ServerTriggerType2[ServerTriggerType2["OPLOC3"] = 68] = "OPLOC3"; + ServerTriggerType2[ServerTriggerType2["OPLOC4"] = 69] = "OPLOC4"; + ServerTriggerType2[ServerTriggerType2["OPLOC5"] = 70] = "OPLOC5"; + ServerTriggerType2[ServerTriggerType2["OPLOCU"] = 71] = "OPLOCU"; + ServerTriggerType2[ServerTriggerType2["OPLOCT"] = 72] = "OPLOCT"; + ServerTriggerType2[ServerTriggerType2["AI_APLOC1"] = 73] = "AI_APLOC1"; + ServerTriggerType2[ServerTriggerType2["AI_APLOC2"] = 74] = "AI_APLOC2"; + ServerTriggerType2[ServerTriggerType2["AI_APLOC3"] = 75] = "AI_APLOC3"; + ServerTriggerType2[ServerTriggerType2["AI_APLOC4"] = 76] = "AI_APLOC4"; + ServerTriggerType2[ServerTriggerType2["AI_APLOC5"] = 77] = "AI_APLOC5"; + ServerTriggerType2[ServerTriggerType2["AI_OPLOC1"] = 80] = "AI_OPLOC1"; + ServerTriggerType2[ServerTriggerType2["AI_OPLOC2"] = 81] = "AI_OPLOC2"; + ServerTriggerType2[ServerTriggerType2["AI_OPLOC3"] = 82] = "AI_OPLOC3"; + ServerTriggerType2[ServerTriggerType2["AI_OPLOC4"] = 83] = "AI_OPLOC4"; + ServerTriggerType2[ServerTriggerType2["AI_OPLOC5"] = 84] = "AI_OPLOC5"; + ServerTriggerType2[ServerTriggerType2["APPLAYER1"] = 87] = "APPLAYER1"; + ServerTriggerType2[ServerTriggerType2["APPLAYER2"] = 88] = "APPLAYER2"; + ServerTriggerType2[ServerTriggerType2["APPLAYER3"] = 89] = "APPLAYER3"; + ServerTriggerType2[ServerTriggerType2["APPLAYER4"] = 90] = "APPLAYER4"; + ServerTriggerType2[ServerTriggerType2["APPLAYER5"] = 91] = "APPLAYER5"; + ServerTriggerType2[ServerTriggerType2["APPLAYERU"] = 92] = "APPLAYERU"; + ServerTriggerType2[ServerTriggerType2["APPLAYERT"] = 93] = "APPLAYERT"; + ServerTriggerType2[ServerTriggerType2["OPPLAYER1"] = 94] = "OPPLAYER1"; + ServerTriggerType2[ServerTriggerType2["OPPLAYER2"] = 95] = "OPPLAYER2"; + ServerTriggerType2[ServerTriggerType2["OPPLAYER3"] = 96] = "OPPLAYER3"; + ServerTriggerType2[ServerTriggerType2["OPPLAYER4"] = 97] = "OPPLAYER4"; + ServerTriggerType2[ServerTriggerType2["OPPLAYER5"] = 98] = "OPPLAYER5"; + ServerTriggerType2[ServerTriggerType2["OPPLAYERU"] = 99] = "OPPLAYERU"; + ServerTriggerType2[ServerTriggerType2["OPPLAYERT"] = 100] = "OPPLAYERT"; + ServerTriggerType2[ServerTriggerType2["AI_APPLAYER1"] = 101] = "AI_APPLAYER1"; + ServerTriggerType2[ServerTriggerType2["AI_APPLAYER2"] = 102] = "AI_APPLAYER2"; + ServerTriggerType2[ServerTriggerType2["AI_APPLAYER3"] = 103] = "AI_APPLAYER3"; + ServerTriggerType2[ServerTriggerType2["AI_APPLAYER4"] = 104] = "AI_APPLAYER4"; + ServerTriggerType2[ServerTriggerType2["AI_APPLAYER5"] = 105] = "AI_APPLAYER5"; + ServerTriggerType2[ServerTriggerType2["AI_OPPLAYER1"] = 108] = "AI_OPPLAYER1"; + ServerTriggerType2[ServerTriggerType2["AI_OPPLAYER2"] = 109] = "AI_OPPLAYER2"; + ServerTriggerType2[ServerTriggerType2["AI_OPPLAYER3"] = 110] = "AI_OPPLAYER3"; + ServerTriggerType2[ServerTriggerType2["AI_OPPLAYER4"] = 111] = "AI_OPPLAYER4"; + ServerTriggerType2[ServerTriggerType2["AI_OPPLAYER5"] = 112] = "AI_OPPLAYER5"; + ServerTriggerType2[ServerTriggerType2["QUEUE"] = 116] = "QUEUE"; + ServerTriggerType2[ServerTriggerType2["AI_QUEUE1"] = 117] = "AI_QUEUE1"; + ServerTriggerType2[ServerTriggerType2["AI_QUEUE2"] = 118] = "AI_QUEUE2"; + ServerTriggerType2[ServerTriggerType2["AI_QUEUE3"] = 119] = "AI_QUEUE3"; + ServerTriggerType2[ServerTriggerType2["AI_QUEUE4"] = 120] = "AI_QUEUE4"; + ServerTriggerType2[ServerTriggerType2["AI_QUEUE5"] = 121] = "AI_QUEUE5"; + ServerTriggerType2[ServerTriggerType2["AI_QUEUE6"] = 122] = "AI_QUEUE6"; + ServerTriggerType2[ServerTriggerType2["AI_QUEUE7"] = 123] = "AI_QUEUE7"; + ServerTriggerType2[ServerTriggerType2["AI_QUEUE8"] = 124] = "AI_QUEUE8"; + ServerTriggerType2[ServerTriggerType2["AI_QUEUE9"] = 125] = "AI_QUEUE9"; + ServerTriggerType2[ServerTriggerType2["AI_QUEUE10"] = 126] = "AI_QUEUE10"; + ServerTriggerType2[ServerTriggerType2["AI_QUEUE11"] = 127] = "AI_QUEUE11"; + ServerTriggerType2[ServerTriggerType2["AI_QUEUE12"] = 128] = "AI_QUEUE12"; + ServerTriggerType2[ServerTriggerType2["AI_QUEUE13"] = 129] = "AI_QUEUE13"; + ServerTriggerType2[ServerTriggerType2["AI_QUEUE14"] = 130] = "AI_QUEUE14"; + ServerTriggerType2[ServerTriggerType2["AI_QUEUE15"] = 131] = "AI_QUEUE15"; + ServerTriggerType2[ServerTriggerType2["AI_QUEUE16"] = 132] = "AI_QUEUE16"; + ServerTriggerType2[ServerTriggerType2["AI_QUEUE17"] = 133] = "AI_QUEUE17"; + ServerTriggerType2[ServerTriggerType2["AI_QUEUE18"] = 134] = "AI_QUEUE18"; + ServerTriggerType2[ServerTriggerType2["AI_QUEUE19"] = 135] = "AI_QUEUE19"; + ServerTriggerType2[ServerTriggerType2["AI_QUEUE20"] = 136] = "AI_QUEUE20"; + ServerTriggerType2[ServerTriggerType2["SOFTTIMER"] = 137] = "SOFTTIMER"; + ServerTriggerType2[ServerTriggerType2["TIMER"] = 138] = "TIMER"; + ServerTriggerType2[ServerTriggerType2["AI_TIMER"] = 139] = "AI_TIMER"; + ServerTriggerType2[ServerTriggerType2["OPHELD1"] = 140] = "OPHELD1"; + ServerTriggerType2[ServerTriggerType2["OPHELD2"] = 141] = "OPHELD2"; + ServerTriggerType2[ServerTriggerType2["OPHELD3"] = 142] = "OPHELD3"; + ServerTriggerType2[ServerTriggerType2["OPHELD4"] = 143] = "OPHELD4"; + ServerTriggerType2[ServerTriggerType2["OPHELD5"] = 144] = "OPHELD5"; + ServerTriggerType2[ServerTriggerType2["OPHELDU"] = 145] = "OPHELDU"; + ServerTriggerType2[ServerTriggerType2["OPHELDT"] = 146] = "OPHELDT"; + ServerTriggerType2[ServerTriggerType2["IF_BUTTON"] = 147] = "IF_BUTTON"; + ServerTriggerType2[ServerTriggerType2["IF_CLOSE"] = 148] = "IF_CLOSE"; + ServerTriggerType2[ServerTriggerType2["INV_BUTTON1"] = 149] = "INV_BUTTON1"; + ServerTriggerType2[ServerTriggerType2["INV_BUTTON2"] = 150] = "INV_BUTTON2"; + ServerTriggerType2[ServerTriggerType2["INV_BUTTON3"] = 151] = "INV_BUTTON3"; + ServerTriggerType2[ServerTriggerType2["INV_BUTTON4"] = 152] = "INV_BUTTON4"; + ServerTriggerType2[ServerTriggerType2["INV_BUTTON5"] = 153] = "INV_BUTTON5"; + ServerTriggerType2[ServerTriggerType2["INV_BUTTOND"] = 154] = "INV_BUTTOND"; + ServerTriggerType2[ServerTriggerType2["WALKTRIGGER"] = 155] = "WALKTRIGGER"; + ServerTriggerType2[ServerTriggerType2["AI_WALKTRIGGER"] = 156] = "AI_WALKTRIGGER"; + ServerTriggerType2[ServerTriggerType2["LOGIN"] = 157] = "LOGIN"; + ServerTriggerType2[ServerTriggerType2["LOGOUT"] = 158] = "LOGOUT"; + ServerTriggerType2[ServerTriggerType2["TUTORIAL"] = 159] = "TUTORIAL"; + ServerTriggerType2[ServerTriggerType2["ADVANCESTAT"] = 160] = "ADVANCESTAT"; + ServerTriggerType2[ServerTriggerType2["MAPZONE"] = 161] = "MAPZONE"; + ServerTriggerType2[ServerTriggerType2["MAPZONEEXIT"] = 162] = "MAPZONEEXIT"; + ServerTriggerType2[ServerTriggerType2["ZONE"] = 163] = "ZONE"; + ServerTriggerType2[ServerTriggerType2["ZONEEXIT"] = 164] = "ZONEEXIT"; + return ServerTriggerType2; +})(ServerTriggerType || {}); +((ServerTriggerType2) => { + function toString(trigger) { + return ServerTriggerType2[trigger].toLowerCase(); + } + ServerTriggerType2.toString = toString; +})(ServerTriggerType || (ServerTriggerType = {})); +var ServerTriggerType_default = ServerTriggerType; + +// src/lostcity/entity/Interaction.ts +var Interaction = /* @__PURE__ */ ((Interaction2) => { + Interaction2[Interaction2["SCRIPT"] = 0] = "SCRIPT"; + Interaction2[Interaction2["ENGINE"] = 1] = "ENGINE"; + return Interaction2; +})(Interaction || {}); +var Interaction_default = Interaction; + +// src/lostcity/engine/script/handlers/NpcOps.ts +var NpcOps = { + [ScriptOpcode_default.NPC_FINDUID]: (state) => { + const npcUid = state.popInt(); + const slot = npcUid & 65535; + const expectedType = npcUid >> 16 & 65535; + const npc = World_default.getNpc(slot); + if (!npc || npc.type !== expectedType) { + state.pushInt(0); + return; + } + state.activeNpc = npc; + state.pointerAdd(ActiveNpc[state.intOperand]); + state.pushInt(1); + }, + [ScriptOpcode_default.NPC_ADD]: (state) => { + const [coord, id, duration] = state.popInts(3); + const position = check(coord, CoordValid); + const npcType = check(id, NpcTypeValid); + check(duration, DurationValid); + const npc = new Npc(position.level, position.x, position.z, npcType.size, npcType.size, EntityLifeCycle_default.DESPAWN, World_default.getNextNid(), npcType.id, npcType.moverestrict, npcType.blockwalk); + World_default.addNpc(npc, duration); + state.activeNpc = npc; + state.pointerAdd(ActiveNpc[state.intOperand]); + }, + [ScriptOpcode_default.NPC_ANIM]: checkedHandler(ActiveNpc, (state) => { + const delay = check(state.popInt(), NumberNotNull); + const seq = state.popInt(); + state.activeNpc.playAnimation(seq, delay); + }), + [ScriptOpcode_default.NPC_BASESTAT]: checkedHandler(ActiveNpc, (state) => { + const stat = check(state.popInt(), NpcStatValid); + state.pushInt(state.activeNpc.baseLevels[stat]); + }), + [ScriptOpcode_default.NPC_CATEGORY]: checkedHandler(ActiveNpc, (state) => { + state.pushInt(check(state.activeNpc.type, NpcTypeValid).category); + }), + [ScriptOpcode_default.NPC_COORD]: checkedHandler(ActiveNpc, (state) => { + const position = state.activeNpc; + state.pushInt(Position.packCoord(position.level, position.x, position.z)); + }), + [ScriptOpcode_default.NPC_DEL]: checkedHandler(ActiveNpc, (state) => { + World_default.removeNpc(state.activeNpc, check(state.activeNpc.type, NpcTypeValid).respawnrate); + }), + [ScriptOpcode_default.NPC_DELAY]: checkedHandler(ActiveNpc, (state) => { + state.activeNpc.delay = check(state.popInt(), NumberNotNull) + 1; + state.execution = ScriptState.NPC_SUSPENDED; + }), + [ScriptOpcode_default.NPC_FACESQUARE]: checkedHandler(ActiveNpc, (state) => { + const position = check(state.popInt(), CoordValid); + state.activeNpc.faceSquare(position.x, position.z); + }), + [ScriptOpcode_default.NPC_FINDEXACT]: (state) => { + const [coord, id] = state.popInts(2); + const position = check(coord, CoordValid); + const npcType = check(id, NpcTypeValid); + state.npcIterator = new NpcIterator(World_default.currentTick, position.level, position.x, position.z, 0, 0, NpcIteratorType_default.ZONE); + for (const npc of state.npcIterator) { + if (npc.type === npcType.id && npc.x === position.x && npc.level === position.level && npc.z === position.z) { + state.activeNpc = npc; + state.pointerAdd(ActiveNpc[state.intOperand]); + state.pushInt(1); + return; + } + } + state.pushInt(0); + return; + }, + [ScriptOpcode_default.NPC_FINDHERO]: checkedHandler(ActiveNpc, (state) => { + const uid = state.activeNpc.findHero(); + if (uid === -1) { + state.pushInt(0); + return; + } + const player = World_default.getPlayerByUid(uid); + if (!player) { + state.pushInt(0); + return; + } + state.activePlayer = player; + state.pointerAdd(ScriptPointer_default.ActivePlayer); + state.pushInt(1); + }), + [ScriptOpcode_default.NPC_PARAM]: checkedHandler(ActiveNpc, (state) => { + const paramType = check(state.popInt(), ParamTypeValid); + const npcType = check(state.activeNpc.type, NpcTypeValid); + if (paramType.isString()) { + state.pushString(ParamHelper.getStringParam(paramType.id, npcType, paramType.defaultString)); + } else { + state.pushInt(ParamHelper.getIntParam(paramType.id, npcType, paramType.defaultInt)); + } + }), + [ScriptOpcode_default.NPC_QUEUE]: checkedHandler(ActiveNpc, (state) => { + const delay = check(state.popInt(), NumberNotNull); + const arg = state.popInt(); + const queueId = check(state.popInt(), QueueValid); + const npcType = check(state.activeNpc.type, NpcTypeValid); + const script = ScriptProvider.getByTrigger(ServerTriggerType_default.AI_QUEUE1 + queueId - 1, npcType.id, npcType.category); + if (script) { + state.activeNpc.enqueueScript(script, delay, arg); + } + }), + [ScriptOpcode_default.NPC_RANGE]: checkedHandler(ActiveNpc, (state) => { + const position = check(state.popInt(), CoordValid); + const npc = state.activeNpc; + if (position.level !== npc.level) { + state.pushInt(-1); + } else { + state.pushInt( + Position.distanceTo(npc, { + x: position.x, + z: position.z, + width: 1, + length: 1 + }) + ); + } + }), + [ScriptOpcode_default.NPC_SAY]: checkedHandler(ActiveNpc, (state) => { + state.activeNpc.say(state.popString()); + }), + [ScriptOpcode_default.NPC_SETHUNT]: checkedHandler(ActiveNpc, (state) => { + state.activeNpc.huntrange = check(state.popInt(), NumberNotNull); + }), + [ScriptOpcode_default.NPC_SETHUNTMODE]: checkedHandler(ActiveNpc, (state) => { + state.activeNpc.huntMode = check(state.popInt(), HuntTypeValid).id; + }), + [ScriptOpcode_default.NPC_SETMODE]: checkedHandler(ActiveNpc, (state) => { + const mode = check(state.popInt(), NpcModeValid); + state.activeNpc.clearWaypoints(); + if (mode === NpcMode_default.NULL || mode === NpcMode_default.NONE || mode === NpcMode_default.WANDER || mode === NpcMode_default.PATROL) { + state.activeNpc.clearInteraction(); + state.activeNpc.targetOp = mode; + return; + } + state.activeNpc.targetOp = mode; + let target; + if (mode >= NpcMode_default.OPNPC1) { + target = state._activeNpc2; + } else if (mode >= NpcMode_default.OPOBJ1) { + target = state._activeObj; + } else if (mode >= NpcMode_default.OPLOC1) { + target = state._activeLoc; + } else { + target = state._activePlayer; + } + if (target) { + if (target instanceof Npc || target instanceof Obj || target instanceof Loc) { + state.activeNpc.setInteraction(Interaction_default.SCRIPT, target, mode, { type: target.type, com: -1 }); + } else { + state.activeNpc.setInteraction(Interaction_default.SCRIPT, target, mode); + } + } else { + state.activeNpc.noMode(); + } + }), + [ScriptOpcode_default.NPC_STAT]: checkedHandler(ActiveNpc, (state) => { + const stat = check(state.popInt(), NpcStatValid); + state.pushInt(state.activeNpc.levels[stat]); + }), + [ScriptOpcode_default.NPC_STATHEAL]: checkedHandler(ActiveNpc, (state) => { + const [stat, constant, percent] = state.popInts(3); + check(stat, NpcStatValid); + check(constant, NumberNotNull); + check(percent, NumberNotNull); + const npc = state.activeNpc; + const base = npc.baseLevels[stat]; + const current = npc.levels[stat]; + const healed = current + (constant + current * percent / 100); + npc.levels[stat] = Math.min(healed, base); + if (stat === 0 && npc.levels[stat] === npc.baseLevels[stat]) { + npc.resetHeroPoints(); + } + }), + [ScriptOpcode_default.NPC_TYPE]: checkedHandler(ActiveNpc, (state) => { + state.pushInt(check(state.activeNpc.type, NpcTypeValid).id); + }), + [ScriptOpcode_default.NPC_DAMAGE]: checkedHandler(ActiveNpc, (state) => { + const amount = check(state.popInt(), NumberNotNull); + const type = check(state.popInt(), HitTypeValid); + state.activeNpc.applyDamage(amount, type); + }), + [ScriptOpcode_default.NPC_NAME]: checkedHandler(ActiveNpc, (state) => { + state.pushString(check(state.activeNpc.type, NpcTypeValid).name ?? "null"); + }), + [ScriptOpcode_default.NPC_UID]: checkedHandler(ActiveNpc, (state) => { + state.pushInt(state.activeNpc.uid); + }), + [ScriptOpcode_default.NPC_SETTIMER]: checkedHandler(ActiveNpc, (state) => { + state.activeNpc.setTimer(check(state.popInt(), NumberNotNull)); + }), + [ScriptOpcode_default.SPOTANIM_NPC]: checkedHandler(ActiveNpc, (state) => { + const delay = check(state.popInt(), NumberNotNull); + const height = check(state.popInt(), NumberNotNull); + const spotanimType = check(state.popInt(), SpotAnimTypeValid); + state.activeNpc.spotanim(spotanimType.id, height, delay); + }), + [ScriptOpcode_default.NPC_FIND]: (state) => { + const [coord, npc, distance, checkVis] = state.popInts(4); + const position = check(coord, CoordValid); + const npcType = check(npc, NpcTypeValid); + check(distance, NumberNotNull); + const huntvis = check(checkVis, HuntVisValid); + let closestNpc; + let closestDistance = distance; + const npcs = new NpcIterator(World_default.currentTick, position.level, position.x, position.z, distance, huntvis, NpcIteratorType_default.DISTANCE); + for (const npc2 of npcs) { + if (npc2 && npc2.type === npcType.id) { + const npcDistance = Position.distanceToSW(position, npc2); + if (npcDistance <= closestDistance) { + closestNpc = npc2; + closestDistance = npcDistance; + } + } + } + if (!closestNpc) { + state.pushInt(0); + return; + } + state.activeNpc = closestNpc; + state.pointerAdd(ActiveNpc[state.intOperand]); + state.pushInt(1); + }, + [ScriptOpcode_default.NPC_FINDALLANY]: (state) => { + const [coord, distance, checkVis] = state.popInts(3); + const position = check(coord, CoordValid); + check(distance, NumberNotNull); + const huntvis = check(checkVis, HuntVisValid); + state.npcIterator = new NpcIterator(World_default.currentTick, position.level, position.x, position.z, distance, huntvis, NpcIteratorType_default.DISTANCE); + if (state._activeNpc) { + state._activeNpc2 = state._activeNpc; + state.pointerAdd(ScriptPointer_default.ActiveNpc2); + } + }, + [ScriptOpcode_default.NPC_FINDALLZONE]: (state) => { + const position = check(state.popInt(), CoordValid); + state.npcIterator = new NpcIterator(World_default.currentTick, position.level, position.x, position.z, 0, 0, NpcIteratorType_default.ZONE); + if (state._activeNpc) { + state._activeNpc2 = state._activeNpc; + state.pointerAdd(ScriptPointer_default.ActiveNpc2); + } + }, + [ScriptOpcode_default.NPC_FINDNEXT]: (state) => { + const result = state.npcIterator?.next(); + if (!result || result.done) { + state.pushInt(0); + return; + } + state.activeNpc = result.value; + state.pointerAdd(ActiveNpc[state.intOperand]); + state.pushInt(1); + }, + [ScriptOpcode_default.NPC_TELE]: checkedHandler(ActiveNpc, (state) => { + const position = check(state.popInt(), CoordValid); + state.activeNpc.teleport(position.x, position.z, position.level); + }), + [ScriptOpcode_default.NPC_WALK]: checkedHandler(ActiveNpc, (state) => { + const position = check(state.popInt(), CoordValid); + state.activeNpc.queueWaypoint(position.x, position.z); + }), + [ScriptOpcode_default.NPC_CHANGETYPE]: checkedHandler(ActiveNpc, (state) => { + state.activeNpc.changeType(check(state.popInt(), NpcTypeValid).id); + }), + [ScriptOpcode_default.NPC_GETMODE]: checkedHandler(ActiveNpc, (state) => { + state.pushInt(state.activeNpc.targetOp); + }), + [ScriptOpcode_default.NPC_HEROPOINTS]: checkedHandler([ScriptPointer_default.ActivePlayer, ...ActiveNpc], (state) => { + state.activeNpc.addHero(state.activePlayer.uid, check(state.popInt(), NumberNotNull)); + }), + [ScriptOpcode_default.NPC_WALKTRIGGER]: checkedHandler(ActiveNpc, (state) => { + const [queueId, arg] = state.popInts(2); + check(queueId, QueueValid); + state.activeNpc.walktrigger = queueId - 1; + state.activeNpc.walktriggerArg = arg; + }), + [ScriptOpcode_default.NPC_STATADD]: checkedHandler(ActiveNpc, (state) => { + const [stat, constant, percent] = state.popInts(3); + check(stat, NpcStatValid); + check(constant, NumberNotNull); + check(percent, NumberNotNull); + const npc = state.activeNpc; + const current = npc.levels[stat]; + const added = current + (constant + current * percent / 100); + npc.levels[stat] = Math.min(added, 255); + if (stat === 0 && npc.levels[stat] >= npc.baseLevels[stat]) { + npc.resetHeroPoints(); + } + }), + [ScriptOpcode_default.NPC_STATSUB]: checkedHandler(ActiveNpc, (state) => { + const [stat, constant, percent] = state.popInts(3); + check(stat, NpcStatValid); + check(constant, NumberNotNull); + check(percent, NumberNotNull); + const npc = state.activeNpc; + const current = npc.levels[stat]; + const subbed = current - (constant + current * percent / 100); + npc.levels[stat] = Math.max(subbed, 0); + }), + // https://twitter.com/JagexAsh/status/1614498680144527360 + [ScriptOpcode_default.NPC_ATTACKRANGE]: checkedHandler(ActiveNpc, (state) => { + state.pushInt(check(state.activeNpc.type, NpcTypeValid).attackrange); + }) +}; +var NpcOps_default = NpcOps; + +// src/lostcity/engine/script/handlers/NpcConfigOps.ts +var NpcConfigOps = { + [ScriptOpcode_default.NC_NAME]: (state) => { + const npcType = check(state.popInt(), NpcTypeValid); + state.pushString(npcType.name ?? npcType.debugname ?? "null"); + }, + [ScriptOpcode_default.NC_PARAM]: (state) => { + const [npcId, paramId] = state.popInts(2); + const npcType = check(npcId, NpcTypeValid); + const paramType = check(paramId, ParamTypeValid); + if (paramType.isString()) { + state.pushString(ParamHelper.getStringParam(paramId, npcType, paramType.defaultString)); + } else { + state.pushInt(ParamHelper.getIntParam(paramId, npcType, paramType.defaultInt)); + } + }, + [ScriptOpcode_default.NC_CATEGORY]: (state) => { + state.pushInt(check(state.popInt(), NpcTypeValid).category); + }, + [ScriptOpcode_default.NC_DESC]: (state) => { + state.pushString(check(state.popInt(), NpcTypeValid).desc ?? "null"); + }, + [ScriptOpcode_default.NC_DEBUGNAME]: (state) => { + state.pushString(check(state.popInt(), NpcTypeValid).debugname ?? "null"); + }, + [ScriptOpcode_default.NC_OP]: (state) => { + const [npcId, op] = state.popInts(2); + const npcType = check(npcId, NpcTypeValid); + check(op, NumberNotNull); + if (!npcType.op) { + state.pushString(""); + return; + } + state.pushString(npcType.op[op - 1] ?? ""); + } +}; +var NpcConfigOps_default = NpcConfigOps; + +// src/jagex2/Trig.ts +var Trig = class { + static _sin = new Int32Array(16384); + static _cos = new Int32Array(16384); + static { + const size = 3834951969714103e-19; + for (let index = 0; index < 16384; index++) { + this._sin[index] = Math.sin(index * size) * 16384 | 0; + this._cos[index] = Math.cos(index * size) * 16384 | 0; + } + } + static radians(x) { + return (x & 16383) / 16384 * 6.283185307179586; + } + static atan2(y, x) { + return Math.round(Math.atan2(y, x) * 2607.5945876176133) & 16383 | 0; + } + static sin(x) { + return this._sin[x & 16383]; + } + static cos(x) { + return this._cos[x & 16383]; + } +}; + +// src/lostcity/engine/script/handlers/NumberOps.ts +var NumberOps = { + [ScriptOpcode_default.ADD]: (state) => { + const b = state.popInt(); + const a = state.popInt(); + state.pushInt(a + b); + }, + [ScriptOpcode_default.SUB]: (state) => { + const b = state.popInt(); + const a = state.popInt(); + state.pushInt(a - b); + }, + [ScriptOpcode_default.MULTIPLY]: (state) => { + const b = state.popInt(); + const a = state.popInt(); + state.pushInt(a * b); + }, + [ScriptOpcode_default.DIVIDE]: (state) => { + const b = state.popInt(); + const a = state.popInt(); + state.pushInt(a / b); + }, + [ScriptOpcode_default.RANDOM]: (state) => { + const a = state.popInt(); + state.pushInt(Math.random() * a); + }, + [ScriptOpcode_default.RANDOMINC]: (state) => { + const a = state.popInt(); + state.pushInt(Math.random() * (a + 1)); + }, + [ScriptOpcode_default.INTERPOLATE]: (state) => { + const [y0, y1, x0, x1, x] = state.popInts(5); + const lerp = Math.floor((y1 - y0) / (x1 - x0)) * (x - x0) + y0; + state.pushInt(lerp); + }, + [ScriptOpcode_default.ADDPERCENT]: (state) => { + const [num, percent] = state.popInts(2); + state.pushInt(num * percent / 100 + num | 0); + }, + [ScriptOpcode_default.SETBIT]: (state) => { + const [value, bit] = state.popInts(2); + state.pushInt(value | 1 << bit); + }, + [ScriptOpcode_default.CLEARBIT]: (state) => { + const [value, bit] = state.popInts(2); + state.pushInt(value & ~(1 << bit)); + }, + [ScriptOpcode_default.TESTBIT]: (state) => { + const [value, bit] = state.popInts(2); + state.pushInt(value & 1 << bit ? 1 : 0); + }, + [ScriptOpcode_default.MODULO]: (state) => { + const [n1, n2] = state.popInts(2); + state.pushInt(n1 % n2); + }, + [ScriptOpcode_default.POW]: (state) => { + const [base, exponent] = state.popInts(2); + state.pushInt(Math.pow(base, exponent)); + }, + [ScriptOpcode_default.INVPOW]: (state) => { + const [n1, n2] = state.popInts(2); + if (n1 === 0 || n2 === 0) { + state.pushInt(0); + } else { + switch (n2) { + case 1: + state.pushInt(n1); + return; + case 2: + state.pushInt(Math.sqrt(n1)); + return; + case 3: + state.pushInt(Math.cbrt(n1)); + return; + case 4: + state.pushInt(Math.sqrt(Math.sqrt(n1))); + return; + default: + state.pushInt(Math.pow(n1, 1 / n2)); + return; + } + } + }, + [ScriptOpcode_default.AND]: (state) => { + const [n1, n2] = state.popInts(2); + state.pushInt(n1 & n2); + }, + [ScriptOpcode_default.OR]: (state) => { + const [n1, n2] = state.popInts(2); + state.pushInt(n1 | n2); + }, + [ScriptOpcode_default.MIN]: (state) => { + const [a, b] = state.popInts(2); + state.pushInt(Math.min(a, b)); + }, + [ScriptOpcode_default.MAX]: (state) => { + const [a, b] = state.popInts(2); + state.pushInt(Math.max(a, b)); + }, + [ScriptOpcode_default.SCALE]: (state) => { + const [a, b, c] = state.popInts(3); + state.pushInt(a * c / b); + }, + [ScriptOpcode_default.BITCOUNT]: (state) => { + state.pushInt(bitcount(state.popInt())); + }, + [ScriptOpcode_default.TOGGLEBIT]: (state) => { + const [value, bit] = state.popInts(2); + state.pushInt(value ^ 1 << bit); + }, + [ScriptOpcode_default.SETBIT_RANGE]: (state) => { + const [num, startBit, endBit] = state.popInts(3); + state.pushInt(setBitRange(num, startBit, endBit)); + }, + [ScriptOpcode_default.CLEARBIT_RANGE]: (state) => { + const [num, startBit, endBit] = state.popInts(3); + state.pushInt(clearBitRange(num, startBit, endBit)); + }, + [ScriptOpcode_default.GETBIT_RANGE]: (state) => { + const [num, startBit, endBit] = state.popInts(3); + const a = 31 - endBit; + state.pushInt(num << a >>> startBit + a); + }, + [ScriptOpcode_default.SETBIT_RANGE_TOINT]: (state) => { + const [num, value, startBit, endBit] = state.popInts(4); + const clearedBitRange = clearBitRange(num, startBit, endBit); + const maxValue = MASK[endBit - startBit + 1]; + let assignValue = value; + if (value > maxValue) { + assignValue = maxValue; + } + state.pushInt(clearedBitRange | assignValue << startBit); + }, + [ScriptOpcode_default.SIN_DEG]: (state) => { + state.pushInt(Trig.sin(state.popInt())); + }, + [ScriptOpcode_default.COS_DEG]: (state) => { + state.pushInt(Trig.cos(state.popInt())); + }, + [ScriptOpcode_default.ATAN2_DEG]: (state) => { + state.pushInt(Trig.atan2(state.popInt(), state.popInt())); + }, + [ScriptOpcode_default.ABS]: (state) => { + state.pushInt(Math.abs(state.popInt())); + } +}; +var NumberOps_default = NumberOps; + +// src/lostcity/engine/script/handlers/ObjOps.ts +var ObjOps = { + [ScriptOpcode_default.OBJ_ADD]: (state) => { + const [coord, objId, count, duration] = state.popInts(4); + if (objId === -1 || count === -1) { + return; + } + const objType = check(objId, ObjTypeValid); + check(duration, DurationValid); + const position = check(coord, CoordValid); + check(count, ObjStackValid); + if (objType.dummyitem !== 0) { + throw new Error(`attempted to add dummy item: ${objType.debugname}`); + } + if (objType.members && !Environment_default.NODE_MEMBERS) { + return; + } + if (!objType.stackable || count === 1) { + for (let i = 0; i < count; i++) { + const obj = new Obj(position.level, position.x, position.z, EntityLifeCycle_default.DESPAWN, objId, 1); + World_default.addObj(obj, state.activePlayer.pid, duration); + state.activeObj = obj; + state.pointerAdd(ActiveObj[state.intOperand]); + } + } else { + const obj = new Obj(position.level, position.x, position.z, EntityLifeCycle_default.DESPAWN, objId, count); + World_default.addObj(obj, state.activePlayer.pid, duration); + state.activeObj = obj; + state.pointerAdd(ActiveObj[state.intOperand]); + } + }, + [ScriptOpcode_default.OBJ_ADDALL]: (state) => { + const [coord, objId, count, duration] = state.popInts(4); + if (objId === -1 || count === -1) { + return; + } + const objType = check(objId, ObjTypeValid); + check(duration, DurationValid); + const position = check(coord, CoordValid); + check(count, ObjStackValid); + if (objType.dummyitem !== 0) { + throw new Error(`attempted to add dummy item: ${objType.debugname}`); + } + if (objType.members && !Environment_default.NODE_MEMBERS) { + return; + } + if (!objType.stackable || count === 1) { + for (let i = 0; i < count; i++) { + const obj = new Obj(position.level, position.x, position.z, EntityLifeCycle_default.DESPAWN, objId, 1); + World_default.addObj(obj, -1, duration); + state.activeObj = obj; + state.pointerAdd(ActiveObj[state.intOperand]); + } + } else { + const obj = new Obj(position.level, position.x, position.z, EntityLifeCycle_default.DESPAWN, objId, count); + World_default.addObj(obj, -1, duration); + state.activeObj = obj; + state.pointerAdd(ActiveObj[state.intOperand]); + } + }, + [ScriptOpcode_default.OBJ_PARAM]: (state) => { + const paramType = check(state.popInt(), ParamTypeValid); + const objType = check(state.activeObj.type, ObjTypeValid); + if (paramType.isString()) { + state.pushString(ParamHelper.getStringParam(paramType.id, objType, paramType.defaultString)); + } else { + state.pushInt(ParamHelper.getIntParam(paramType.id, objType, paramType.defaultInt)); + } + }, + [ScriptOpcode_default.OBJ_NAME]: (state) => { + const objType = check(state.activeObj.type, ObjTypeValid); + state.pushString(objType.name ?? objType.debugname ?? "null"); + }, + [ScriptOpcode_default.OBJ_DEL]: (state) => { + const duration = ObjType.get(state.activeObj.type).respawnrate; + if (state.pointerGet(ActivePlayer[state.intOperand])) { + World_default.removeObj(state.activeObj, duration); + } else { + World_default.removeObj(state.activeObj, duration); + } + }, + [ScriptOpcode_default.OBJ_COUNT]: (state) => { + state.pushInt(check(state.activeObj.count, ObjStackValid)); + }, + [ScriptOpcode_default.OBJ_TYPE]: (state) => { + state.pushInt(check(state.activeObj.type, ObjTypeValid).id); + }, + [ScriptOpcode_default.OBJ_TAKEITEM]: (state) => { + const invType = check(state.popInt(), InvTypeValid); + const obj = state.activeObj; + const objType = ObjType.get(obj.type); + const zone = World_default.getZone(obj.x, obj.z, obj.level); + for (const o of zone.getObjsSafe(Position.packZoneCoord(obj.x, obj.z))) { + if (o.type !== obj.type || o.count !== obj.count) { + continue; + } + if (o.receiverId !== -1 && o.receiverId !== state.activePlayer.pid) { + continue; + } + state.activePlayer.playerLog("Picked up item", objType.debugname); + state.activePlayer.invAdd(invType.id, obj.type, obj.count); + if (obj.lifecycle === EntityLifeCycle_default.RESPAWN) { + World_default.removeObj(obj, objType.respawnrate); + break; + } else if (obj.lifecycle === EntityLifeCycle_default.DESPAWN) { + World_default.removeObj(obj, 0); + break; + } + } + }, + [ScriptOpcode_default.OBJ_COORD]: (state) => { + const position = state.activeObj; + state.pushInt(Position.packCoord(position.level, position.x, position.z)); + } +}; +var ObjOps_default = ObjOps; + +// src/lostcity/engine/script/handlers/ObjConfigOps.ts +var ObjConfigOps = { + [ScriptOpcode_default.OC_NAME]: (state) => { + const objType = check(state.popInt(), ObjTypeValid); + state.pushString(objType.name ?? objType.debugname ?? "null"); + }, + [ScriptOpcode_default.OC_PARAM]: (state) => { + const [objId, paramId] = state.popInts(2); + const objType = check(objId, ObjTypeValid); + const paramType = check(paramId, ParamTypeValid); + if (paramType.isString()) { + state.pushString(ParamHelper.getStringParam(paramType.id, objType, paramType.defaultString)); + } else { + state.pushInt(ParamHelper.getIntParam(paramType.id, objType, paramType.defaultInt)); + } + }, + [ScriptOpcode_default.OC_CATEGORY]: (state) => { + state.pushInt(check(state.popInt(), ObjTypeValid).category); + }, + [ScriptOpcode_default.OC_DESC]: (state) => { + state.pushString(check(state.popInt(), ObjTypeValid).desc ?? "null"); + }, + [ScriptOpcode_default.OC_MEMBERS]: (state) => { + state.pushInt(check(state.popInt(), ObjTypeValid).members ? 1 : 0); + }, + [ScriptOpcode_default.OC_WEIGHT]: (state) => { + state.pushInt(check(state.popInt(), ObjTypeValid).weight); + }, + [ScriptOpcode_default.OC_WEARPOS]: (state) => { + state.pushInt(check(state.popInt(), ObjTypeValid).wearpos); + }, + [ScriptOpcode_default.OC_WEARPOS2]: (state) => { + state.pushInt(check(state.popInt(), ObjTypeValid).wearpos2); + }, + [ScriptOpcode_default.OC_WEARPOS3]: (state) => { + state.pushInt(check(state.popInt(), ObjTypeValid).wearpos3); + }, + [ScriptOpcode_default.OC_COST]: (state) => { + state.pushInt(check(state.popInt(), ObjTypeValid).cost); + }, + [ScriptOpcode_default.OC_TRADEABLE]: (state) => { + state.pushInt(check(state.popInt(), ObjTypeValid).tradeable ? 1 : 0); + }, + [ScriptOpcode_default.OC_DEBUGNAME]: (state) => { + state.pushString(check(state.popInt(), ObjTypeValid).debugname ?? "null"); + }, + [ScriptOpcode_default.OC_CERT]: (state) => { + const objType = check(state.popInt(), ObjTypeValid); + if (objType.certtemplate == -1 && objType.certlink >= 0) { + state.pushInt(objType.certlink); + } else { + state.pushInt(objType.id); + } + }, + [ScriptOpcode_default.OC_UNCERT]: (state) => { + const objType = check(state.popInt(), ObjTypeValid); + if (objType.certtemplate >= 0 && objType.certlink >= 0) { + state.pushInt(objType.certlink); + } else { + state.pushInt(objType.id); + } + }, + [ScriptOpcode_default.OC_STACKABLE]: (state) => { + state.pushInt(check(state.popInt(), ObjTypeValid).stackable ? 1 : 0); + } +}; +var ObjConfigOps_default = ObjConfigOps; + +// src/lostcity/entity/EntityQueueRequest.ts +var EntityQueueRequest = class extends Linkable { + /** + * The type of queue request. + */ + type; + /** + * The script to execute. + */ + script; + /** + * The arguments to execute the script with. + */ + args; + /** + * The number of ticks remaining until the queue executes. + */ + delay; + lastInt = 0; + constructor(type, script, args, delay) { + super(); + this.type = type; + this.script = script; + this.args = args; + this.delay = delay; + } +}; +var EntityQueueState = class extends Linkable { + script; + delay; + constructor(script, delay) { + super(); + this.script = script; + this.delay = delay; + } +}; + +// src/lostcity/entity/NetworkPlayer.ts + +// src/lostcity/network/225/outgoing/prot/ServerProt.ts +var ServerProt = class _ServerProt { + // NXT naming + constructor(id, length) { + this.id = id; + this.length = length; + _ServerProt.all.push(this); + _ServerProt.byId[id] = this; + } + static all = []; + static byId = []; + // interfaces + static IF_OPENCHATMODAL = new _ServerProt(14, 2); + static IF_OPENMAINSIDEMODAL = new _ServerProt(28, 4); + static IF_CLOSE = new _ServerProt(129, 0); + // NXT has "IF_CLOSESUB" + static IF_OPENSIDEOVERLAY = new _ServerProt(167, 3); + static IF_OPENMAINMODAL = new _ServerProt(168, 2); + static IF_OPENSIDEMODAL = new _ServerProt(195, 2); + // updating interfaces + static IF_SETCOLOUR = new _ServerProt(2, 4); + // NXT naming + static IF_SETHIDE = new _ServerProt(26, 3); + // NXT naming + static IF_SETOBJECT = new _ServerProt(46, 6); + // NXT naming + static IF_SHOWSIDE = new _ServerProt(84, 1); + static IF_SETMODEL = new _ServerProt(87, 4); + // NXT naming + static IF_SETRECOL = new _ServerProt(103, 6); + // NXT naming + static IF_SETANIM = new _ServerProt(146, 4); + // NXT naming + static IF_SETPLAYERHEAD = new _ServerProt(197, 2); + // NXT naming + static IF_SETTEXT = new _ServerProt(201, -2); + // NXT naming + static IF_SETNPCHEAD = new _ServerProt(204, 4); + // NXT naming + static IF_SETPOSITION = new _ServerProt(209, 6); + // NXT naming + // tutorial area + static TUTORIAL_FLASHSIDE = new _ServerProt(126, 1); + static TUTORIAL_OPENCHAT = new _ServerProt(185, 2); + // inventory + static UPDATE_INV_STOP_TRANSMIT = new _ServerProt(15, 2); + // NXT naming + static UPDATE_INV_FULL = new _ServerProt(98, -2); + // NXT naming + static UPDATE_INV_PARTIAL = new _ServerProt(213, -2); + // NXT naming + // camera control + static CAM_LOOKAT = new _ServerProt(74, 6); + // NXT naming + static CAM_SHAKE = new _ServerProt(13, 4); + // NXT naming + static CAM_MOVETO = new _ServerProt(3, 6); + // NXT naming + static CAM_RESET = new _ServerProt(239, 0); + // NXT naming + // entity updates + static NPC_INFO = new _ServerProt(1, -2); + // NXT naming + static PLAYER_INFO = new _ServerProt(184, -2); + // NXT naming + // input tracking + static FINISH_TRACKING = new _ServerProt(133, 0); + static ENABLE_TRACKING = new _ServerProt(226, 0); + // social + static MESSAGE_GAME = new _ServerProt(4, -1); + // NXT naming + static UPDATE_IGNORELIST = new _ServerProt(21, -2); + // NXT naming + static CHAT_FILTER_SETTINGS = new _ServerProt(32, 3); + // NXT naming + static MESSAGE_PRIVATE = new _ServerProt(41, -1); + // NXT naming + static UPDATE_FRIENDLIST = new _ServerProt(152, 9); + // NXT naming + // misc + static UNSET_MAP_FLAG = new _ServerProt(19, 0); + // NXT has "SET_MAP_FLAG" but we cannot control the position + static UPDATE_RUNWEIGHT = new _ServerProt(22, 2); + // NXT naming + static HINT_ARROW = new _ServerProt(25, 6); + // NXT naming + static UPDATE_REBOOT_TIMER = new _ServerProt(43, 2); + // NXT naming + static UPDATE_STAT = new _ServerProt(44, 6); + // NXT naming + static UPDATE_RUNENERGY = new _ServerProt(68, 1); + // NXT naming + static RESET_ANIMS = new _ServerProt(136, 0); + // NXT naming + static UPDATE_UID192 = new _ServerProt(139, 2); + // NXT naming (not 100% certain if "uid192" means local player) + static LAST_LOGIN_INFO = new _ServerProt(140, 9); + // NXT naming + static LOGOUT = new _ServerProt(142, 0); + // NXT naming + static P_COUNTDIALOG = new _ServerProt(243, 0); + // named after runescript command + client resume_p_countdialog packet + static SET_MULTIWAY = new _ServerProt(254, 1); + // maps + static DATA_LOC_DONE = new _ServerProt(20, 2); + static DATA_LAND_DONE = new _ServerProt(80, 2); + static DATA_LAND = new _ServerProt(132, -2); + static DATA_LOC = new _ServerProt(220, -2); + static REBUILD_NORMAL = new _ServerProt(237, -2); + // NXT naming (do we really need _normal if there's no region rebuild?) + // vars + static VARP_SMALL = new _ServerProt(150, 3); + // NXT naming + static VARP_LARGE = new _ServerProt(175, 6); + // NXT naming + static RESET_CLIENT_VARCACHE = new _ServerProt(193, 0); + // NXT naming + // audio + static SYNTH_SOUND = new _ServerProt(12, 5); + // NXT naming + static MIDI_SONG = new _ServerProt(54, -1); + // NXT naming + static MIDI_JINGLE = new _ServerProt(212, -2); + // NXT naming + // zones + static UPDATE_ZONE_PARTIAL_FOLLOWS = new _ServerProt(7, 2); + // NXT naming + static UPDATE_ZONE_FULL_FOLLOWS = new _ServerProt(135, 2); + // NXT naming + static UPDATE_ZONE_PARTIAL_ENCLOSED = new _ServerProt(162, -2); +}; + +// src/lostcity/entity/Player.ts + +// src/lostcity/entity/MoveSpeed.ts +var MoveSpeed = /* @__PURE__ */ ((MoveSpeed2) => { + MoveSpeed2[MoveSpeed2["STATIONARY"] = 0] = "STATIONARY"; + MoveSpeed2[MoveSpeed2["CRAWL"] = 1] = "CRAWL"; + MoveSpeed2[MoveSpeed2["WALK"] = 2] = "WALK"; + MoveSpeed2[MoveSpeed2["RUN"] = 3] = "RUN"; + MoveSpeed2[MoveSpeed2["INSTANT"] = 4] = "INSTANT"; + return MoveSpeed2; +})(MoveSpeed || {}); +var MoveSpeed_default = MoveSpeed; + +// src/lostcity/entity/MoveStrategy.ts +var MoveStrategy = /* @__PURE__ */ ((MoveStrategy2) => { + MoveStrategy2[MoveStrategy2["SMART"] = 0] = "SMART"; + MoveStrategy2[MoveStrategy2["NAIVE"] = 1] = "NAIVE"; + MoveStrategy2[MoveStrategy2["FLY"] = 2] = "FLY"; + return MoveStrategy2; +})(MoveStrategy || {}); +var MoveStrategy_default = MoveStrategy; + +// src/lostcity/entity/PathingEntity.ts +var PathingEntity = class _PathingEntity extends Entity { + // constructor properties + moveRestrict; + blockWalk; + moveStrategy; + coordmask; + entitymask; + // runtime properties + moveSpeed = MoveSpeed_default.INSTANT; + walkDir = -1; + runDir = -1; + waypointIndex = -1; + waypoints = new Int32Array(25); + lastX = -1; + lastZ = -1; + lastLevel = -1; + tele = false; + jump = false; + lastStepX = -1; + lastStepZ = -1; + stepsTaken = 0; + lastInt = -1; + // resume_p_countdialog, ai_queue + lastCrawl = false; + walktrigger = -1; + walktriggerArg = 0; + // used for npcs + delay = -1; + interacted = false; + repathed = false; + target = null; + targetOp = -1; + targetSubject = { type: -1, com: -1 }; + targetX = -1; + targetZ = -1; + apRange = 10; + apRangeCalled = false; + alreadyFacedEntity = false; + mask = 0; + exactStartX = -1; + exactStartZ = -1; + exactEndX = -1; + exactEndZ = -1; + exactMoveStart = -1; + exactMoveEnd = -1; + exactMoveDirection = -1; + faceX = -1; + faceZ = -1; + orientationX = -1; + orientationZ = -1; + faceEntity = -1; + damageTaken = -1; + damageType = -1; + animId = -1; + animDelay = -1; + chat = null; + graphicId = -1; + graphicHeight = -1; + graphicDelay = -1; + constructor(level, x, z, width, length, lifecycle, moveRestrict, blockWalk, moveStrategy, coordmask, entitymask) { + super(level, x, z, width, length, lifecycle); + this.moveRestrict = moveRestrict; + this.blockWalk = blockWalk; + this.moveStrategy = moveStrategy; + this.coordmask = coordmask; + this.entitymask = entitymask; + this.lastStepX = x - 1; + this.lastStepZ = z; + } + /** + * Process movement function for a PathingEntity to use. + * Checks for if this PathingEntity has any waypoints to move towards. + * Handles force movement. Validates and moves depending on if this + * PathingEntity is walking or running only. + * Applies an orientation update to this PathingEntity if a step + * direction was taken. + * Updates this PathingEntity zone presence if moved. + * Returns false is this PathingEntity has no waypoints. + * Returns true if a step was taken and movement processed. + */ + processMovement() { + if (!this.hasWaypoints() || this.moveSpeed === MoveSpeed_default.STATIONARY || this.moveSpeed === MoveSpeed_default.INSTANT) { + return false; + } + if (this.moveSpeed === MoveSpeed_default.CRAWL) { + this.lastCrawl = !this.lastCrawl; + if (this.lastCrawl && this.walkDir === -1) { + this.walkDir = this.validateAndAdvanceStep(); + } + return true; + } + if (this.walkDir === -1) { + this.walkDir = this.validateAndAdvanceStep(); + if (this.moveSpeed === MoveSpeed_default.RUN && this.walkDir !== -1 && this.runDir === -1) { + this.runDir = this.validateAndAdvanceStep(); + } + } + return true; + } + /** + * Zone presence implementation for a PathingEntity. + * Can allow updating collision map, removing a PathingEntity from a zone, etc. + * @param previousX Their previous recorded x position before movement. + * @param previousZ Their previous recorded z position before movement. + * @param previousLevel Their previous recorded level position before movement. This one is important for teleport. + */ + refreshZonePresence(previousX, previousZ, previousLevel) { + if (this.x != previousX || this.z !== previousZ || this.level !== previousLevel) { + switch (this.blockWalk) { + case BlockWalk_default.NPC: + World_default.gameMap.changeNpcCollision(this.width, previousX, previousZ, previousLevel, false); + World_default.gameMap.changeNpcCollision(this.width, this.x, this.z, this.level, true); + break; + case BlockWalk_default.ALL: + World_default.gameMap.changeNpcCollision(this.width, previousX, previousZ, previousLevel, false); + World_default.gameMap.changeNpcCollision(this.width, this.x, this.z, this.level, true); + World_default.gameMap.changePlayerCollision(this.width, previousX, previousZ, previousLevel, false); + World_default.gameMap.changePlayerCollision(this.width, this.x, this.z, this.level, true); + break; + } + this.lastStepX = previousX; + this.lastStepZ = previousZ; + } + if (Position.zone(previousX) !== Position.zone(this.x) || Position.zone(previousZ) !== Position.zone(this.z) || previousLevel != this.level) { + World_default.getZone(previousX, previousZ, previousLevel).leave(this); + World_default.getZone(this.x, this.z, this.level).enter(this); + } + } + /** + * Validates the next step in our current waypoint. + * + * Deques to the next step if reached the end of current step, + * then attempts to look for a possible second next step, + * validates and repeats. + * + * Moves this PathingEntity each time a step is validated. + * + * A PathingEntity can persist their current step for example if + * blocked by another PathingEntity. Unless a PathingEntity does + * a random walk again while still persisting their current step. + * + * Returns the final validated step direction. + */ + validateAndAdvanceStep() { + const dir = this.takeStep(); + if (dir === null) { + return -1; + } + if (dir === -1) { + this.waypointIndex--; + if (this.waypointIndex != -1) { + return this.validateAndAdvanceStep(); + } + return -1; + } + const previousX = this.x; + const previousZ = this.z; + this.x = Position.moveX(this.x, dir); + this.z = Position.moveZ(this.z, dir); + this.orientationX = Position.moveX(this.x, dir) * 2 + 1; + this.orientationZ = Position.moveZ(this.z, dir) * 2 + 1; + this.stepsTaken++; + this.refreshZonePresence(previousX, previousZ, this.level); + return dir; + } + /** + * Queue this PathingEntity to a single waypoint. + * @param x The x position of the step. + * @param z The z position of the step. + */ + queueWaypoint(x, z) { + this.waypoints[0] = Position.packCoord(0, x, z); + this.waypointIndex = 0; + } + /** + * Queue waypoints to this PathingEntity. + * @param waypoints The waypoints to queue. + */ + queueWaypoints(waypoints) { + let index = -1; + for (let input = waypoints.length - 1, output = 0; input >= 0 && output < this.waypoints.length; input--, output++) { + this.waypoints[output] = waypoints[input]; + index++; + } + this.waypointIndex = index; + } + clearWaypoints() { + this.waypointIndex = -1; + } + teleJump(x, z, level) { + this.teleport(x, z, level); + this.jump = true; + } + teleport(x, z, level) { + if (isNaN(level)) { + level = 0; + } + level = Math.max(0, Math.min(level, 3)); + const previousX = this.x; + const previousZ = this.z; + const previousLevel = this.level; + this.x = x; + this.z = z; + this.level = level; + this.refreshZonePresence(previousX, previousZ, previousLevel); + this.lastStepX = this.x - 1; + this.lastStepZ = this.z; + this.moveSpeed = MoveSpeed_default.INSTANT; + if (previousLevel != level) { + this.jump = true; + } + } + /** + * Check if the number of tiles moved is > 2, we use Teleport for this PathingEntity. + */ + validateDistanceWalked() { + const distanceCheck = Position.distanceTo(this, { + x: this.lastX, + z: this.lastZ, + width: this.width, + length: this.length + }) > 2; + if (distanceCheck) { + this.jump = true; + } + } + convertMovementDir() { + let walkDir = this.walkDir; + let runDir = this.runDir; + let tele = this.moveSpeed === MoveSpeed_default.INSTANT; + const distanceMoved = Position.distanceTo(this, { + x: this.lastX, + z: this.lastZ, + width: this.width, + length: this.length + }); + if (tele && !this.jump && distanceMoved <= 2) { + if (distanceMoved === 2) { + const firstX = (this.x + this.lastX) / 2 | 0; + const firstZ = (this.z + this.lastZ) / 2 | 0; + walkDir = Position.face(this.lastX, this.lastZ, firstX, firstZ); + runDir = Position.face(firstX, firstZ, this.x, this.z); + } else { + walkDir = Position.face(this.lastX, this.lastZ, this.x, this.z); + runDir = -1; + } + tele = false; + } + this.walkDir = walkDir; + this.runDir = runDir; + this.tele = tele; + } + /** + * Returns if this PathingEntity has any queued waypoints. + */ + hasWaypoints() { + return this.waypointIndex !== -1; + } + /* + * Returns if this PathingEntity is at the last waypoint or has no waypoint. + */ + isLastOrNoWaypoint() { + return this.waypointIndex <= 0; + } + inOperableDistance(target) { + if (target.level !== this.level) { + return false; + } + if (target instanceof _PathingEntity) { + return reached(this.level, this.x, this.z, target.x, target.z, target.width, target.length, this.width, -1, -2); + } else if (target instanceof Loc) { + const forceapproach = LocType.get(target.type).forceapproach; + return reached(this.level, this.x, this.z, target.x, target.z, target.width, target.length, this.width, target.angle, target.shape, forceapproach); + } + const reachedAdjacent = reached(this.level, this.x, this.z, target.x, target.z, target.width, target.length, this.width, 0, -2); + if (isFlagged(target.x, target.z, target.level, CollisionFlag.WALK_BLOCKED)) { + return reachedAdjacent; + } + if (!this.hasWaypoints() && reachedAdjacent) { + return true; + } + return reached(this.level, this.x, this.z, target.x, target.z, target.width, target.length, this.width, 0, -1); + } + inApproachDistance(range, target) { + if (target.level !== this.level) { + return false; + } + if (target instanceof _PathingEntity && Position.intersects(this.x, this.z, this.width, this.length, target.x, target.z, target.width, target.length)) { + return false; + } + return Position.distanceTo(this, target) <= range && hasLineOfSight(this.level, this.x, this.z, target.x, target.z, this.width, this.length, target.width, target.length, CollisionFlag.PLAYER); + } + pathToMoveClick(input, needsfinding) { + if (this.moveStrategy === MoveStrategy_default.SMART) { + if (needsfinding) { + const { x, z } = Position.unpackCoord(input[0]); + this.queueWaypoints(findPath(this.level, this.x, this.z, x, z)); + } else { + this.queueWaypoints(input); + } + } else { + const { x, z } = Position.unpackCoord(input[input.length - 1]); + this.queueWaypoint(x, z); + } + } + pathToPathingTarget() { + if (!this.target || !(this.target instanceof _PathingEntity)) { + return; + } + if (!this.isLastOrNoWaypoint()) { + return; + } + if (this.targetOp === ServerTriggerType_default.APPLAYER3 || this.targetOp === ServerTriggerType_default.OPPLAYER3) { + this.queueWaypoint(this.target.lastStepX, this.target.lastStepZ); + return; + } + this.pathToTarget(); + } + pathToTarget() { + if (!this.target) { + return; + } + this.targetX = this.target.x; + this.targetZ = this.target.z; + const faceX = this.target.x * 2 + this.target.width; + const faceZ = this.target.z * 2 + this.target.length; + this.orientationX = faceX; + this.orientationZ = faceZ; + if (this.moveStrategy === MoveStrategy_default.SMART) { + if (this.target instanceof _PathingEntity) { + this.queueWaypoints(findPath(this.level, this.x, this.z, this.target.x, this.target.z, this.width, this.target.width, this.target.length, 0, -2)); + } else if (this.target instanceof Loc) { + const forceapproach = LocType.get(this.target.type).forceapproach; + this.queueWaypoints(findPath(this.level, this.x, this.z, this.target.x, this.target.z, this.width, this.target.width, this.target.length, this.target.angle, this.target.shape, true, forceapproach)); + } else { + this.queueWaypoints(findPath(this.level, this.x, this.z, this.target.x, this.target.z)); + } + } else if (this.moveStrategy === MoveStrategy_default.NAIVE) { + const collisionStrategy = this.getCollisionStrategy(); + if (collisionStrategy === null) { + return; + } + const extraFlag = this.blockWalkFlag(); + if (extraFlag === CollisionFlag.NULL) { + return; + } + if (this.target instanceof _PathingEntity) { + this.queueWaypoints(findNaivePath(this.level, this.x, this.z, this.target.x, this.target.z, this.width, this.length, this.target.width, this.target.length, extraFlag, collisionStrategy)); + } else { + this.queueWaypoint(this.target.x, this.target.z); + } + } else { + const collisionStrategy = this.getCollisionStrategy(); + if (collisionStrategy === null) { + return; + } + const extraFlag = this.blockWalkFlag(); + if (extraFlag === CollisionFlag.NULL) { + return; + } + this.queueWaypoint(this.target.x, this.target.z); + } + } + setInteraction(interaction, target, op, subject) { + this.target = target; + this.targetOp = op; + this.targetSubject = subject ?? { type: -1, com: -1 }; + this.targetX = target.x; + this.targetZ = target.z; + this.apRange = 10; + this.apRangeCalled = false; + const faceX = target.x * 2 + target.width; + const faceZ = target.z * 2 + target.length; + if (target instanceof Player) { + const pid = target.pid + 32768; + if (this.faceEntity !== pid) { + this.faceEntity = pid; + this.mask |= this.entitymask; + } + } else if (target instanceof Npc) { + const nid = target.nid; + if (this.faceEntity !== nid) { + this.faceEntity = nid; + this.mask |= this.entitymask; + } + } else if (this.orientationX !== faceX || this.orientationZ !== faceZ) { + this.orientationX = faceX; + this.orientationZ = faceZ; + this.faceX = faceX; + this.faceZ = faceZ; + this.mask |= this.coordmask; + } + if (interaction === Interaction_default.SCRIPT) { + this.pathToTarget(); + } + } + clearInteraction() { + this.target = null; + this.targetOp = -1; + this.targetSubject = { type: -1, com: -1 }; + this.targetX = -1; + this.targetZ = -1; + this.apRange = 10; + this.apRangeCalled = false; + this.alreadyFacedEntity = true; + } + getCollisionStrategy() { + if (this.moveRestrict === MoveRestrict_default.NORMAL) { + return CollisionType.NORMAL; + } else if (this.moveRestrict === MoveRestrict_default.BLOCKED) { + return CollisionType.BLOCKED; + } else if (this.moveRestrict === MoveRestrict_default.BLOCKED_NORMAL) { + return CollisionType.LINE_OF_SIGHT; + } else if (this.moveRestrict === MoveRestrict_default.INDOORS) { + return CollisionType.INDOORS; + } else if (this.moveRestrict === MoveRestrict_default.OUTDOORS) { + return CollisionType.OUTDOORS; + } else if (this.moveRestrict === MoveRestrict_default.NOMOVE) { + return null; + } else if (this.moveRestrict === MoveRestrict_default.PASSTHRU) { + return CollisionType.NORMAL; + } + return null; + } + resetPathingEntity() { + this.moveSpeed = this.defaultMoveSpeed(); + this.walkDir = -1; + this.runDir = -1; + this.jump = false; + this.tele = false; + this.lastX = this.x; + this.lastZ = this.z; + this.lastLevel = this.level; + this.stepsTaken = 0; + this.interacted = false; + this.apRangeCalled = false; + this.mask = 0; + this.exactStartX = -1; + this.exactStartZ = -1; + this.exactEndX = -1; + this.exactEndZ = -1; + this.exactMoveStart = -1; + this.exactMoveEnd = -1; + this.exactMoveDirection = -1; + this.animId = -1; + this.animDelay = -1; + this.animId = -1; + this.animDelay = -1; + this.chat = null; + this.damageTaken = -1; + this.damageType = -1; + this.graphicId = -1; + this.graphicHeight = -1; + this.graphicDelay = -1; + if (this.alreadyFacedEntity && !this.target && this.faceEntity !== -1) { + this.mask |= this.entitymask; + this.faceEntity = -1; + this.alreadyFacedEntity = false; + } + } + takeStep() { + if (this.waypointIndex === -1) { + return null; + } + const srcX = this.x; + const srcZ = this.z; + const { x, z } = Position.unpackCoord(this.waypoints[this.waypointIndex]); + const dir = Position.face(srcX, srcZ, x, z); + const dx = Position.deltaX(dir); + const dz = Position.deltaZ(dir); + if (dx == 0 && dz == 0) { + return -1; + } + const collisionStrategy = this.getCollisionStrategy(); + if (collisionStrategy === null) { + return -1; + } + const extraFlag = this.blockWalkFlag(); + if (extraFlag === CollisionFlag.NULL) { + return -1; + } + if (this.moveStrategy === MoveStrategy_default.FLY) { + return dir; + } + if (canTravel(this.level, this.x, this.z, dx, dz, this.width, extraFlag, collisionStrategy)) { + return dir; + } + if (dx != 0 && canTravel(this.level, this.x, this.z, dx, 0, this.width, extraFlag, collisionStrategy)) { + return Position.face(srcX, srcZ, x, srcZ); + } + if (dz != 0 && canTravel(this.level, this.x, this.z, 0, dz, this.width, extraFlag, collisionStrategy)) { + return Position.face(srcX, srcZ, srcX, z); + } + return null; + } +}; + +// src/jagex2/datastruct/Stack.ts +var Stack = class { + sentinel; + cursor = null; + constructor() { + const head = new Hashable(); + head.nextHashable = head; + head.prevHashable = head; + this.sentinel = head; + } + push(node) { + if (node.prevHashable) { + node.uncache(); + } + node.prevHashable = this.sentinel.prevHashable; + node.nextHashable = this.sentinel; + if (node.prevHashable) { + node.prevHashable.nextHashable = node; + } + node.nextHashable.prevHashable = node; + } + pop() { + const node = this.sentinel.nextHashable; + if (node === this.sentinel) { + return null; + } + node?.uncache(); + return node; + } + head() { + const node = this.sentinel.nextHashable; + if (node === this.sentinel) { + this.cursor = null; + return null; + } + this.cursor = node?.nextHashable || null; + return node; + } + next() { + const node = this.cursor; + if (node === this.sentinel) { + this.cursor = null; + return null; + } + this.cursor = node?.nextHashable || null; + return node; + } + clear() { + while (true) { + const node = this.sentinel.next; + if (node == this.sentinel) { + return; + } + if (node) { + node.unlink(); + } + } + } +}; + +// src/lostcity/server/PreloadedPacks.ts +var PRELOADED = /* @__PURE__ */ new Map(); +var PRELOADED_CRC = /* @__PURE__ */ new Map(); +function preloadClient() { + const allMaps = fs23.readdirSync("data/pack/client/maps"); + for (let i = 0; i < allMaps.length; i++) { + const name = allMaps[i]; + const map = new Uint8Array(fs23.readFileSync(`data/pack/client/maps/${name}`)); + const crc = Packet.getcrc(map, 0, map.length); + PRELOADED.set(name, map); + PRELOADED_CRC.set(name, crc); + } + const allSongs = fs23.readdirSync("data/pack/client/songs"); + for (let i = 0; i < allSongs.length; i++) { + const name = allSongs[i]; + const song = new Uint8Array(fs23.readFileSync(`data/pack/client/songs/${name}`)); + const crc = Packet.getcrc(song, 0, song.length); + PRELOADED.set(name, song); + PRELOADED_CRC.set(name, crc); + } + const allJingles = fs23.readdirSync("data/pack/client/jingles"); + for (let i = 0; i < allJingles.length; i++) { + const name = allJingles[i]; + const jingle = new Uint8Array(fs23.readFileSync(`data/pack/client/jingles/${name}`).subarray(4)); + const crc = Packet.getcrc(jingle, 0, jingle.length); + PRELOADED.set(name, jingle); + PRELOADED_CRC.set(name, crc); + } +} +async function preloadClientAsync() { + const fetchAll = async (type, name) => { + let data = new Uint8Array(await (await fetch(`data/pack/client/${type}/${name}`)).arrayBuffer()); + if (type === "jingles") { + data = data.subarray(4); + } + const crc = Packet.getcrc(data, 0, data.length); + PRELOADED.set(name, data); + PRELOADED_CRC.set(name, crc); + }; + const { jingles: jingles2, maps: maps2, songs: songs2 } = await Promise.resolve().then(() => (init_PreloadedDirs(), PreloadedDirs_exports)); + const allPacks = [ + ...maps2.map((name) => fetchAll("maps", name)), + ...songs2.map((name) => fetchAll("songs", name)), + ...jingles2.map((name) => fetchAll("jingles", name)) + ]; + await Promise.all(allPacks); +} + +// src/lostcity/network/outgoing/OutgoingMessage.ts +var OutgoingMessage = class extends Hashable { +}; + +// src/lostcity/network/outgoing/prot/ServerProtPriority.ts +var ServerProtPriority = class _ServerProtPriority { + static LOW = new _ServerProtPriority(); + static HIGH = new _ServerProtPriority(); +}; + +// src/lostcity/network/outgoing/model/IfClose.ts +var IfClose = class extends OutgoingMessage { + priority = ServerProtPriority.LOW; +}; + +// src/lostcity/network/outgoing/model/UpdateUid192.ts +var UpdateUid192 = class extends OutgoingMessage { + // todo: low or high priority + constructor(uid) { + super(); + this.uid = uid; + } + priority = ServerProtPriority.HIGH; +}; + +// src/lostcity/network/outgoing/model/ResetAnims.ts +var ResetAnims = class extends OutgoingMessage { + priority = ServerProtPriority.HIGH; + // todo: low or high priority +}; + +// src/lostcity/network/outgoing/model/ResetClientVarCache.ts +var ResetClientVarCache = class extends OutgoingMessage { + priority = ServerProtPriority.HIGH; +}; + +// src/lostcity/network/outgoing/model/TutorialOpenChat.ts +var TutorialOpenChat = class extends OutgoingMessage { + constructor(component) { + super(); + this.component = component; + } + priority = ServerProtPriority.LOW; +}; + +// src/lostcity/network/outgoing/model/UpdateInvStopTransmit.ts +var UpdateInvStopTransmit = class extends OutgoingMessage { + constructor(component) { + super(); + this.component = component; + } + priority = ServerProtPriority.HIGH; +}; + +// src/lostcity/network/outgoing/model/VarpSmall.ts +var VarpSmall = class extends OutgoingMessage { + constructor(varp, value) { + super(); + this.varp = varp; + this.value = value; + } + priority = ServerProtPriority.HIGH; +}; + +// src/lostcity/network/outgoing/model/VarpLarge.ts +var VarpLarge = class extends OutgoingMessage { + constructor(varp, value) { + super(); + this.varp = varp; + this.value = value; + } + priority = ServerProtPriority.HIGH; +}; + +// src/lostcity/network/outgoing/model/MidiSong.ts +var MidiSong = class extends OutgoingMessage { + constructor(name, crc, length) { + super(); + this.name = name; + this.crc = crc; + this.length = length; + } + priority = ServerProtPriority.LOW; +}; + +// src/lostcity/network/outgoing/model/MidiJingle.ts +var MidiJingle = class extends OutgoingMessage { + constructor(delay, data) { + super(); + this.delay = delay; + this.data = data; + } + priority = ServerProtPriority.LOW; +}; + +// src/lostcity/network/outgoing/model/IfOpenSideOverlay.ts +var IfOpenSideOverlay = class extends OutgoingMessage { + constructor(component, tab) { + super(); + this.component = component; + this.tab = tab; + } + priority = ServerProtPriority.LOW; +}; + +// src/lostcity/network/outgoing/model/UnsetMapFlag.ts +var UnsetMapFlag = class extends OutgoingMessage { + priority = ServerProtPriority.HIGH; +}; + +// src/lostcity/network/outgoing/model/HintArrow.ts +var HintArrow = class extends OutgoingMessage { + // todo: is HINT_ARROW low or high priority? + constructor(type, nid, pid, x, z, y) { + super(); + this.type = type; + this.nid = nid; + this.pid = pid; + this.x = x; + this.z = z; + this.y = y; + } + priority = ServerProtPriority.LOW; +}; + +// src/lostcity/network/outgoing/model/LastLoginInfo.ts +var LastLoginInfo = class extends OutgoingMessage { + constructor(lastLoginIp, daysSinceLogin, daysSinceRecoveryChange, unreadMessageCount) { + super(); + this.lastLoginIp = lastLoginIp; + this.daysSinceLogin = daysSinceLogin; + this.daysSinceRecoveryChange = daysSinceRecoveryChange; + this.unreadMessageCount = unreadMessageCount; + } + priority = ServerProtPriority.LOW; +}; + +// src/lostcity/network/outgoing/model/MessageGame.ts +var MessageGame = class extends OutgoingMessage { + constructor(msg) { + super(); + this.msg = msg; + } + priority = ServerProtPriority.HIGH; +}; + +// src/lostcity/engine/zone/ZoneEvent.ts +var ZoneEvent = class { + type; + receiverId; + message; + constructor(type, receiverId, message) { + this.type = type; + this.receiverId = receiverId; + this.message = message; + } +}; + +// src/lostcity/engine/zone/ZoneEventType.ts +var ZoneEventType = /* @__PURE__ */ ((ZoneEventType2) => { + ZoneEventType2[ZoneEventType2["ENCLOSED"] = 0] = "ENCLOSED"; + ZoneEventType2[ZoneEventType2["FOLLOWS"] = 1] = "FOLLOWS"; + return ZoneEventType2; +})(ZoneEventType || {}); +var ZoneEventType_default = ZoneEventType; + +// src/lostcity/network/outgoing/model/UpdateZonePartialEnclosed.ts +var UpdateZonePartialEnclosed = class extends OutgoingMessage { + constructor(zoneX, zoneZ, originX, originZ, data) { + super(); + this.zoneX = zoneX; + this.zoneZ = zoneZ; + this.originX = originX; + this.originZ = originZ; + this.data = data; + } + priority = ServerProtPriority.HIGH; +}; + +// src/lostcity/network/outgoing/model/UpdateZoneFullFollows.ts +var UpdateZoneFullFollows = class extends OutgoingMessage { + constructor(zoneX, zoneZ, originX, originZ) { + super(); + this.zoneX = zoneX; + this.zoneZ = zoneZ; + this.originX = originX; + this.originZ = originZ; + } + priority = ServerProtPriority.HIGH; +}; + +// src/lostcity/network/outgoing/model/UpdateZonePartialFollows.ts +var UpdateZonePartialFollows = class extends OutgoingMessage { + constructor(zoneX, zoneZ, originX, originZ) { + super(); + this.zoneX = zoneX; + this.zoneZ = zoneZ; + this.originX = originX; + this.originZ = originZ; + } + priority = ServerProtPriority.HIGH; +}; + +// src/lostcity/network/outgoing/ZoneMessage.ts +var ZoneMessage = class extends OutgoingMessage { + constructor(coord) { + super(); + this.coord = coord; + } + priority = ServerProtPriority.HIGH; +}; + +// src/lostcity/network/outgoing/model/ObjAdd.ts +var ObjAdd = class extends ZoneMessage { + constructor(coord, obj, count) { + super(coord); + this.coord = coord; + this.obj = obj; + this.count = count; + } +}; + +// src/lostcity/network/outgoing/model/LocAddChange.ts +var LocAddChange = class extends ZoneMessage { + constructor(coord, loc, shape, angle) { + super(coord); + this.coord = coord; + this.loc = loc; + this.shape = shape; + this.angle = angle; + } +}; + +// src/lostcity/network/outgoing/model/LocDel.ts +var LocDel = class extends ZoneMessage { + constructor(coord, shape, angle) { + super(coord); + this.coord = coord; + this.shape = shape; + this.angle = angle; + } +}; + +// src/lostcity/network/outgoing/model/MapProjAnim.ts +var MapProjAnim = class extends ZoneMessage { + constructor(srcX, srcZ, dstX, dstZ, target, spotanim, srcHeight, dstHeight, startDelay, endDelay, peak, arc) { + super(Position.packZoneCoord(srcX, srcZ)); + this.srcX = srcX; + this.srcZ = srcZ; + this.dstX = dstX; + this.dstZ = dstZ; + this.target = target; + this.spotanim = spotanim; + this.srcHeight = srcHeight; + this.dstHeight = dstHeight; + this.startDelay = startDelay; + this.endDelay = endDelay; + this.peak = peak; + this.arc = arc; + } +}; + +// src/lostcity/network/outgoing/model/MapAnim.ts +var MapAnim = class extends ZoneMessage { + constructor(coord, spotanim, height, delay) { + super(coord); + this.coord = coord; + this.spotanim = spotanim; + this.height = height; + this.delay = delay; + } +}; + +// src/lostcity/network/outgoing/model/ObjDel.ts +var ObjDel = class extends ZoneMessage { + constructor(coord, obj) { + super(coord); + this.coord = coord; + this.obj = obj; + } +}; + +// src/lostcity/network/outgoing/model/ObjCount.ts +var ObjCount = class extends ZoneMessage { + constructor(coord, obj, oldCount, newCount) { + super(coord); + this.coord = coord; + this.obj = obj; + this.oldCount = oldCount; + this.newCount = newCount; + } +}; + +// src/lostcity/network/outgoing/model/ObjReveal.ts +var ObjReveal = class extends ZoneMessage { + constructor(coord, obj, count, receiverId) { + super(coord); + this.coord = coord; + this.obj = obj; + this.count = count; + this.receiverId = receiverId; + } +}; + +// src/lostcity/network/outgoing/model/LocAnim.ts +var LocAnim = class extends ZoneMessage { + constructor(coord, shape, angle, seq) { + super(coord); + this.coord = coord; + this.shape = shape; + this.angle = angle; + this.seq = seq; + } +}; + +// src/lostcity/network/outgoing/model/LocMerge.ts +var LocMerge = class extends ZoneMessage { + constructor(srcX, srcZ, shape, angle, locId, startCycle, endCycle, pid, east, south, west, north) { + super(Position.packZoneCoord(srcX, srcZ)); + this.srcX = srcX; + this.srcZ = srcZ; + this.shape = shape; + this.angle = angle; + this.locId = locId; + this.startCycle = startCycle; + this.endCycle = endCycle; + this.pid = pid; + this.east = east; + this.south = south; + this.west = west; + this.north = north; + } +}; + +// src/lostcity/network/outgoing/codec/MessageEncoder.ts +var MessageEncoder = class { + test(_) { + return this.prot.length; + } +}; + +// src/lostcity/network/225/outgoing/codec/IfOpenChatModalEncoder.ts +var IfOpenChatModalEncoder = class extends MessageEncoder { + prot = ServerProt.IF_OPENCHATMODAL; + encode(buf, message) { + buf.p2(message.component); + } +}; + +// src/lostcity/network/outgoing/model/IfOpenChatModal.ts +var IfOpenChatModal = class extends OutgoingMessage { + constructor(component) { + super(); + this.component = component; + } + priority = ServerProtPriority.LOW; +}; + +// src/lostcity/network/outgoing/model/PlayerInfo.ts +var PlayerInfo = class extends OutgoingMessage { + constructor(buildArea, level, x, z, originX, originZ, uid, mask, tele, jump2, walkDir, runDir, deltaX, deltaZ, changedLevel) { + super(); + this.buildArea = buildArea; + this.level = level; + this.x = x; + this.z = z; + this.originX = originX; + this.originZ = originZ; + this.uid = uid; + this.mask = mask; + this.tele = tele; + this.jump = jump2; + this.walkDir = walkDir; + this.runDir = runDir; + this.deltaX = deltaX; + this.deltaZ = deltaZ; + this.changedLevel = changedLevel; + } + priority = ServerProtPriority.HIGH; + accumulator = 0; +}; + +// src/lostcity/network/225/outgoing/codec/PlayerInfoEncoder.ts +var PlayerInfoEncoder = class _PlayerInfoEncoder extends MessageEncoder { + static BITS_NEW = 11 + 5 + 5 + 1 + 1; + static BITS_IDLE = 1; + static BITS_RUN = 1 + 2 + 3 + 3 + 1; + static BITS_WALK = 1 + 2 + 3 + 1; + static BITS_EXTENDED = 1 + 2; + static BYTES_LIMIT = 4997; + prot = ServerProt.PLAYER_INFO; + encode(buf, message) { + const buildArea = message.buildArea; + if (message.changedLevel || message.deltaX > buildArea.viewDistance || message.deltaZ > buildArea.viewDistance) { + buildArea.players.clear(); + buildArea.lastResize = 0; + buildArea.viewDistance = BuildArea.PREFERRED_VIEW_DISTANCE; + } else { + buildArea.resize(); + } + this.writeLocalPlayer(buf, message); + this.writePlayers(buf, message); + this.writeNewPlayers(buf, message); + const extended = buildArea.extendedInfo; + if (extended.size > 0) { + for (const info of extended) { + const other = World_default.getPlayerByUid(info.id); + if (!other) { + buf.p1(0); + continue; + } + this.writeExtendedInfo(other, message, buf, info.id === message.uid, info.added); + } + } + buildArea.clearExtended(); + } + test(_) { + return _PlayerInfoEncoder.BYTES_LIMIT; + } + willFit(message, buf, bitsToAdd, bytesToAdd) { + return (buf.bitPos + bitsToAdd + 7 >>> 3) + (message.accumulator + bytesToAdd) <= _PlayerInfoEncoder.BYTES_LIMIT; + } + writeLocalPlayer(buf, message) { + const { buildArea, uid, level, x, z, tele, jump: jump2, walkDir, runDir } = message; + const player = World_default.getPlayerByUid(uid); + if (!player) { + return; + } + const extendedInfoSize = this.calculateExtendedInfo(player, message, true, false); + const extendedInfo = extendedInfoSize > 0; + buf.bits(); + buf.pBit(1, tele || runDir !== -1 || walkDir !== -1 || extendedInfo ? 1 : 0); + if (tele) { + buf.pBit(2, 3); + buf.pBit(2, level); + buf.pBit(7, Position.local(x, player.originX)); + buf.pBit(7, Position.local(z, player.originZ)); + buf.pBit(1, jump2 ? 1 : 0); + buf.pBit(1, extendedInfo ? 1 : 0); + } else if (runDir !== -1) { + buf.pBit(2, 2); + buf.pBit(3, walkDir); + buf.pBit(3, runDir); + buf.pBit(1, extendedInfo ? 1 : 0); + } else if (walkDir !== -1) { + buf.pBit(2, 1); + buf.pBit(3, walkDir); + buf.pBit(1, extendedInfo ? 1 : 0); + } else if (extendedInfo) { + buf.pBit(2, 0); + } + if (extendedInfo) { + buildArea.extendedInfo.add({ id: uid, added: false }); + message.accumulator += extendedInfoSize; + } + } + writePlayers(buf, message) { + const buildArea = message.buildArea; + buf.pBit(8, buildArea.players.size); + for (const uid of buildArea.players) { + const other = World_default.getPlayerByUid(uid); + if (!other || other.tele || other.level !== message.level || !Position.isWithinDistanceSW(message, other, buildArea.viewDistance) || !other.checkLifeCycle(World_default.currentTick)) { + buf.pBit(1, 1); + buf.pBit(2, 3); + buildArea.players.delete(uid); + continue; + } + const extendedInfoSize = this.calculateExtendedInfo(other, message, false, false); + let extendedInfo = extendedInfoSize > 0; + const { walkDir, runDir } = other; + let bits = _PlayerInfoEncoder.BITS_IDLE; + if (runDir !== -1) { + bits = _PlayerInfoEncoder.BITS_RUN; + } else if (walkDir !== -1) { + bits = _PlayerInfoEncoder.BITS_WALK; + } else if (extendedInfo) { + bits = _PlayerInfoEncoder.BITS_EXTENDED; + } + if (!this.willFit(message, buf, bits, extendedInfoSize)) { + extendedInfo = false; + } + buf.pBit(1, runDir !== -1 || walkDir !== -1 || extendedInfo ? 1 : 0); + if (runDir !== -1) { + buf.pBit(2, 2); + buf.pBit(3, walkDir); + buf.pBit(3, runDir); + buf.pBit(1, extendedInfo ? 1 : 0); + } else if (walkDir !== -1) { + buf.pBit(2, 1); + buf.pBit(3, walkDir); + buf.pBit(1, extendedInfo ? 1 : 0); + } else if (extendedInfo) { + buf.pBit(2, 0); + } + if (extendedInfo) { + buildArea.extendedInfo.add({ id: uid, added: false }); + message.accumulator += extendedInfoSize; + } + } + } + writeNewPlayers(buf, message) { + const buildArea = message.buildArea; + for (const other of buildArea.getNearbyPlayers(message.uid, message.x, message.z, message.originX, message.originZ)) { + const extendedInfoSize = this.calculateExtendedInfo(other, message, false, true); + const extendedInfo = extendedInfoSize > 0; + if (!this.willFit(message, buf, _PlayerInfoEncoder.BITS_NEW + 11, extendedInfoSize)) { + break; + } + buf.pBit(11, other.pid); + buf.pBit(5, other.x - message.x); + buf.pBit(5, other.z - message.z); + buf.pBit(1, other.jump ? 1 : 0); + buf.pBit(1, extendedInfo ? 1 : 0); + if (extendedInfo) { + buildArea.extendedInfo.add({ id: other.uid, added: true }); + message.accumulator += extendedInfoSize; + } + buildArea.players.add(other.uid); + } + if (buildArea.extendedInfo.size > 0) { + buf.pBit(11, 2047); + } + buf.bytes(); + } + writeExtendedInfo(player, message, buf, self2 = false, newlyObserved = false) { + let mask = player.mask; + if (newlyObserved) { + if (player.orientationX !== -1 || player.faceX !== -1) { + mask |= Player.FACE_COORD; + } + if (player.faceEntity !== -1) { + mask |= Player.FACE_ENTITY; + } + } + if (self2 && (mask & Player.CHAT) != 0) { + mask &= ~Player.CHAT; + } + if (message.buildArea.hasAppearance(player.uid, player.lastAppearance) || !player.appearance) { + mask &= ~Player.APPEARANCE; + } else { + mask |= Player.APPEARANCE; + } + if (mask > 255) { + mask |= Player.BIG_UPDATE; + } + buf.p1(mask & 255); + if (mask & Player.BIG_UPDATE) { + buf.p1(mask >> 8); + } + if (mask & Player.APPEARANCE) { + buf.p1(player.appearance.length); + buf.pdata(player.appearance, 0, player.appearance.length); + message.buildArea.saveAppearance(player.uid, player.lastAppearance); + } + if (mask & Player.ANIM) { + buf.p2(player.animId); + buf.p1(player.animDelay); + } + if (mask & Player.FACE_ENTITY) { + if (player.faceEntity !== -1) { + player.alreadyFacedEntity = true; + } + buf.p2(player.faceEntity); + } + if (mask & Player.SAY) { + buf.pjstr(player.chat ?? ""); + } + if (mask & Player.DAMAGE) { + buf.p1(player.damageTaken); + buf.p1(player.damageType); + buf.p1(player.levels[PlayerStat_default.HITPOINTS]); + buf.p1(player.baseLevels[PlayerStat_default.HITPOINTS]); + } + if (mask & Player.FACE_COORD) { + if (newlyObserved && player.orientationX !== -1) { + buf.p2(player.orientationX); + buf.p2(player.orientationZ); + } else { + buf.p2(player.faceX); + buf.p2(player.faceZ); + } + } + if (mask & Player.CHAT) { + buf.p1(player.messageColor); + buf.p1(player.messageEffect); + buf.p1(player.messageType); + buf.p1(player.message.length); + buf.pdata(player.message, 0, player.message.length); + } + if (mask & Player.SPOTANIM) { + buf.p2(player.graphicId); + buf.p2(player.graphicHeight); + buf.p2(player.graphicDelay); + } + if (mask & Player.EXACT_MOVE) { + buf.p1(player.exactStartX - Position.zoneOrigin(message.originX)); + buf.p1(player.exactStartZ - Position.zoneOrigin(message.originZ)); + buf.p1(player.exactEndX - Position.zoneOrigin(message.originX)); + buf.p1(player.exactEndZ - Position.zoneOrigin(message.originZ)); + buf.p2(player.exactMoveStart); + buf.p2(player.exactMoveEnd); + buf.p1(player.exactMoveDirection); + } + } + calculateExtendedInfo(player, message, self2 = false, newlyObserved = false) { + let length = 0; + let mask = player.mask; + if (newlyObserved) { + if (player.orientationX !== -1 || player.faceX !== -1) { + mask |= Player.FACE_COORD; + } + if (player.faceEntity !== -1) { + mask |= Player.FACE_ENTITY; + } + } + if (self2 && (mask & Player.CHAT) != 0) { + mask &= ~Player.CHAT; + } + if (message.buildArea.hasAppearance(player.uid, player.lastAppearance) || !player.appearance) { + mask &= ~Player.APPEARANCE; + } else { + mask |= Player.APPEARANCE; + } + if (mask > 255) { + mask |= Player.BIG_UPDATE; + } + if (mask === 0) { + return 0; + } + length += 1; + if (mask & Player.BIG_UPDATE) { + length += 1; + } + if (mask & Player.APPEARANCE) { + length += 1 + player.appearance.length; + } + if (mask & Player.ANIM) { + length += 3; + } + if (mask & Player.FACE_ENTITY) { + length += 2; + } + if (mask & Player.SAY) { + length += 1 + player.chat.length; + } + if (mask & Player.DAMAGE) { + length += 4; + } + if (mask & Player.FACE_COORD) { + length += 4; + } + if (mask & Player.CHAT) { + length += 4 + player.message.length; + } + if (mask & Player.SPOTANIM) { + length += 6; + } + if (mask & Player.EXACT_MOVE) { + length += 9; + } + return length; + } +}; + +// src/lostcity/network/outgoing/model/RebuildNormal.ts +var RebuildNormal = class extends OutgoingMessage { + constructor(zoneX, zoneZ) { + super(); + this.zoneX = zoneX; + this.zoneZ = zoneZ; + } + priority = ServerProtPriority.HIGH; + get mapsquares() { + const minX = this.zoneX - 6; + const maxX = this.zoneX + 6; + const minZ = this.zoneZ - 6; + const maxZ = this.zoneZ + 6; + const result = /* @__PURE__ */ new Set(); + for (let x = minX; x <= maxX; x++) { + const mx = Position.mapsquare(x << 3); + for (let z = minZ; z <= maxZ; z++) { + const mz = Position.mapsquare(z << 3); + result.add(mx << 8 | mz); + } + } + return result; + } +}; + +// src/lostcity/network/225/outgoing/codec/RebuildNormalEncoder.ts +var RebuildNormalEncoder = class extends MessageEncoder { + prot = ServerProt.REBUILD_NORMAL; + encode(buf, message) { + buf.p2(message.zoneX); + buf.p2(message.zoneZ); + for (const packed of message.mapsquares) { + const x = packed >> 8; + const z = packed & 255; + buf.p1(x); + buf.p1(z); + buf.p4(PRELOADED_CRC.get(`m${x}_${z}`) ?? 0); + buf.p4(PRELOADED_CRC.get(`l${x}_${z}`) ?? 0); + } + } + test(message) { + return 2 + 2 + message.mapsquares.size * (1 + 1 + 4 + 4); + } +}; + +// src/lostcity/network/outgoing/model/DataLand.ts +var DataLand = class extends OutgoingMessage { + constructor(x, z, offset, length, data) { + super(); + this.x = x; + this.z = z; + this.offset = offset; + this.length = length; + this.data = data; + } + priority = ServerProtPriority.HIGH; +}; + +// src/lostcity/network/225/outgoing/codec/DataLandEncoder.ts +var DataLandEncoder = class extends MessageEncoder { + prot = ServerProt.DATA_LAND; + encode(buf, message) { + buf.p1(message.x); + buf.p1(message.z); + buf.p2(message.offset); + buf.p2(message.length); + buf.pdata(message.data, 0, message.data.length); + } + test(message) { + return 1 + 1 + 2 + 2 + message.data.length; + } +}; + +// src/lostcity/network/outgoing/model/DataLandDone.ts +var DataLandDone = class extends OutgoingMessage { + constructor(x, z) { + super(); + this.x = x; + this.z = z; + } + priority = ServerProtPriority.HIGH; +}; + +// src/lostcity/network/225/outgoing/codec/DataLandDoneEncoder.ts +var DataLandDoneEncoder = class extends MessageEncoder { + prot = ServerProt.DATA_LAND_DONE; + encode(buf, message) { + buf.p1(message.x); + buf.p1(message.z); + } +}; + +// src/lostcity/network/outgoing/model/DataLoc.ts +var DataLoc = class extends OutgoingMessage { + constructor(x, z, offset, length, data) { + super(); + this.x = x; + this.z = z; + this.offset = offset; + this.length = length; + this.data = data; + } + priority = ServerProtPriority.HIGH; +}; + +// src/lostcity/network/225/outgoing/codec/DataLocEncoder.ts +var DataLocEncoder = class extends MessageEncoder { + prot = ServerProt.DATA_LOC; + encode(buf, message) { + buf.p1(message.x); + buf.p1(message.z); + buf.p2(message.offset); + buf.p2(message.length); + buf.pdata(message.data, 0, message.data.length); + } + test(message) { + return 1 + 1 + 2 + 2 + message.data.length; + } +}; + +// src/lostcity/network/outgoing/model/DataLocDone.ts +var DataLocDone = class extends OutgoingMessage { + constructor(x, z) { + super(); + this.x = x; + this.z = z; + } + priority = ServerProtPriority.HIGH; +}; + +// src/lostcity/network/225/outgoing/codec/DataLocDoneEncoder.ts +var DataLocDoneEncoder = class extends MessageEncoder { + prot = ServerProt.DATA_LOC_DONE; + encode(buf, message) { + buf.p1(message.x); + buf.p1(message.z); + } +}; + +// src/lostcity/network/outgoing/model/CamLookAt.ts +var CamLookAt = class extends OutgoingMessage { + constructor(x, z, height, speed, multiplier) { + super(); + this.x = x; + this.z = z; + this.height = height; + this.speed = speed; + this.multiplier = multiplier; + } + priority = ServerProtPriority.LOW; +}; + +// src/lostcity/network/225/outgoing/codec/CamLookAtEncoder.ts +var CamLookAtEncoder = class extends MessageEncoder { + prot = ServerProt.CAM_LOOKAT; + encode(buf, message) { + buf.p1(message.x); + buf.p1(message.z); + buf.p2(message.height); + buf.p1(message.speed); + buf.p1(message.multiplier); + } +}; + +// src/lostcity/network/outgoing/model/CamMoveTo.ts +var CamMoveTo = class extends OutgoingMessage { + constructor(x, z, height, speed, multiplier) { + super(); + this.x = x; + this.z = z; + this.height = height; + this.speed = speed; + this.multiplier = multiplier; + } + priority = ServerProtPriority.LOW; +}; + +// src/lostcity/network/225/outgoing/codec/CamMoveToEncoder.ts +var CamMoveToEncoder = class extends MessageEncoder { + prot = ServerProt.CAM_MOVETO; + encode(buf, message) { + buf.p1(message.x); + buf.p1(message.z); + buf.p2(message.height); + buf.p1(message.speed); + buf.p1(message.multiplier); + } +}; + +// src/lostcity/network/outgoing/model/CamReset.ts +var CamReset = class extends OutgoingMessage { + priority = ServerProtPriority.LOW; +}; + +// src/lostcity/network/225/outgoing/codec/CamResetEncoder.ts +var CamResetEncoder = class extends MessageEncoder { + prot = ServerProt.CAM_RESET; + encode(_, __) { + } +}; + +// src/lostcity/network/outgoing/model/CamShake.ts +var CamShake = class extends OutgoingMessage { + constructor(type, jitter, amplitude, frequency) { + super(); + this.type = type; + this.jitter = jitter; + this.amplitude = amplitude; + this.frequency = frequency; + } + priority = ServerProtPriority.LOW; +}; + +// src/lostcity/network/225/outgoing/codec/CamShakeEncoder.ts +var CamShakeEncoder = class extends MessageEncoder { + prot = ServerProt.CAM_SHAKE; + encode(buf, message) { + buf.p1(message.type); + buf.p1(message.jitter); + buf.p1(message.amplitude); + buf.p1(message.frequency); + } +}; + +// src/lostcity/network/outgoing/model/ChatFilterSettings.ts +var ChatFilterSettings = class extends OutgoingMessage { + constructor(publicChat, privateChat, tradeDuel) { + super(); + this.publicChat = publicChat; + this.privateChat = privateChat; + this.tradeDuel = tradeDuel; + } + priority = ServerProtPriority.HIGH; +}; + +// src/lostcity/network/225/outgoing/codec/ChatFilterSettingsEncoder.ts +var ChatFilterSettingsEncoder = class extends MessageEncoder { + prot = ServerProt.CHAT_FILTER_SETTINGS; + encode(buf, message) { + buf.p1(message.publicChat); + buf.p1(message.privateChat); + buf.p1(message.tradeDuel); + } +}; + +// src/lostcity/network/outgoing/model/EnableTracking.ts +var EnableTracking = class extends OutgoingMessage { + priority = ServerProtPriority.LOW; +}; + +// src/lostcity/network/225/outgoing/codec/EnableTrackingEncoder.ts +var EnableTrackingEncoder = class extends MessageEncoder { + prot = ServerProt.ENABLE_TRACKING; + encode(_, __) { + } +}; + +// src/lostcity/network/outgoing/model/FinishTracking.ts +var FinishTracking = class extends OutgoingMessage { + priority = ServerProtPriority.LOW; +}; + +// src/lostcity/network/225/outgoing/codec/FinishTrackingEncoder.ts +var FinishTrackingEncoder = class extends MessageEncoder { + prot = ServerProt.FINISH_TRACKING; + encode(_, __) { + } +}; + +// src/lostcity/network/225/outgoing/codec/HintArrowEncoder.ts +var HintArrowEncoder = class extends MessageEncoder { + prot = ServerProt.HINT_ARROW; + encode(buf, message) { + const { type, nid, pid, x, z, y } = message; + if (type === 1) { + buf.p1(type); + buf.p2(nid); + buf.p2(0); + buf.p1(0); + } else if (type >= 2 && type <= 6) { + buf.p1(type); + buf.p2(x); + buf.p2(z); + buf.p1(y); + } else if (type === 10) { + buf.p1(type); + buf.p2(pid); + buf.p2(0); + buf.p1(0); + } else if (type === -1) { + buf.p1(-1); + buf.p2(0); + buf.p2(0); + buf.p1(0); + } + } +}; + +// src/lostcity/network/225/outgoing/codec/IfCloseEncoder.ts +var IfCloseEncoder = class extends MessageEncoder { + prot = ServerProt.IF_CLOSE; + encode(_, __) { + } +}; + +// src/lostcity/network/outgoing/model/IfOpenMainModal.ts +var IfOpenMainModal = class extends OutgoingMessage { + constructor(component) { + super(); + this.component = component; + } + priority = ServerProtPriority.LOW; +}; + +// src/lostcity/network/225/outgoing/codec/IfOpenMainModalEncoder.ts +var IfOpenMainModalEncoder = class extends MessageEncoder { + prot = ServerProt.IF_OPENMAINMODAL; + encode(buf, message) { + buf.p2(message.component); + } +}; + +// src/lostcity/network/outgoing/model/IfOpenMainSideModal.ts +var IfOpenMainSideModal = class extends OutgoingMessage { + constructor(main, side) { + super(); + this.main = main; + this.side = side; + } + priority = ServerProtPriority.LOW; +}; + +// src/lostcity/network/225/outgoing/codec/IfOpenMainSideModalEncoder.ts +var IfOpenMainSideModalEncoder = class extends MessageEncoder { + prot = ServerProt.IF_OPENMAINSIDEMODAL; + encode(buf, message) { + buf.p2(message.main); + buf.p2(message.side); + } +}; + +// src/lostcity/network/outgoing/model/IfOpenSideModal.ts +var IfOpenSideModal = class extends OutgoingMessage { + constructor(component) { + super(); + this.component = component; + } + priority = ServerProtPriority.LOW; +}; + +// src/lostcity/network/225/outgoing/codec/IfOpenSideModalEncoder.ts +var IfOpenSideModalEncoder = class extends MessageEncoder { + prot = ServerProt.IF_OPENSIDEMODAL; + encode(buf, message) { + buf.p2(message.component); + } +}; + +// src/lostcity/network/225/outgoing/codec/IfOpenSideOverlayEncoder.ts +var IfOpenSideOverlayEncoder = class extends MessageEncoder { + prot = ServerProt.IF_OPENSIDEOVERLAY; + encode(buf, message) { + buf.p2(message.component); + buf.p1(message.tab); + } +}; + +// src/lostcity/network/outgoing/model/IfSetAnim.ts +var IfSetAnim = class extends OutgoingMessage { + constructor(component, seq) { + super(); + this.component = component; + this.seq = seq; + } + priority = ServerProtPriority.LOW; +}; + +// src/lostcity/network/225/outgoing/codec/IfSetAnimEncoder.ts +var IfSetAnimEncoder = class extends MessageEncoder { + prot = ServerProt.IF_SETANIM; + encode(buf, message) { + buf.p2(message.component); + buf.p2(message.seq); + } +}; + +// src/lostcity/network/outgoing/model/IfSetColour.ts +var IfSetColour = class extends OutgoingMessage { + constructor(component, colour) { + super(); + this.component = component; + this.colour = colour; + } + priority = ServerProtPriority.LOW; +}; + +// src/lostcity/network/225/outgoing/codec/IfSetColourEncoder.ts +var IfSetColourEncoder = class extends MessageEncoder { + prot = ServerProt.IF_SETCOLOUR; + encode(buf, message) { + buf.p2(message.component); + buf.p2(message.colour); + } +}; + +// src/lostcity/network/outgoing/model/IfSetHide.ts +var IfSetHide = class extends OutgoingMessage { + constructor(component, hidden) { + super(); + this.component = component; + this.hidden = hidden; + } + priority = ServerProtPriority.LOW; +}; + +// src/lostcity/network/225/outgoing/codec/IfSetHideEncoder.ts +var IfSetHideEncoder = class extends MessageEncoder { + prot = ServerProt.IF_SETHIDE; + encode(buf, message) { + buf.p2(message.component); + buf.pbool(message.hidden); + } +}; + +// src/lostcity/network/outgoing/model/IfSetModel.ts +var IfSetModel = class extends OutgoingMessage { + constructor(component, model) { + super(); + this.component = component; + this.model = model; + } + priority = ServerProtPriority.LOW; +}; + +// src/lostcity/network/225/outgoing/codec/IfSetModelEncoder.ts +var IfSetModelEncoder = class extends MessageEncoder { + prot = ServerProt.IF_SETMODEL; + encode(buf, message) { + buf.p2(message.component); + buf.p2(message.model); + } +}; + +// src/lostcity/network/outgoing/model/IfSetNpcHead.ts +var IfSetNpcHead = class extends OutgoingMessage { + constructor(component, npc) { + super(); + this.component = component; + this.npc = npc; + } + priority = ServerProtPriority.LOW; +}; + +// src/lostcity/network/225/outgoing/codec/IfSetNpcHeadEncoder.ts +var IfSetNpcHeadEncoder = class extends MessageEncoder { + prot = ServerProt.IF_SETNPCHEAD; + encode(buf, message) { + buf.p2(message.component); + buf.p2(message.npc); + } +}; + +// src/lostcity/network/outgoing/model/IfSetObject.ts +var IfSetObject = class extends OutgoingMessage { + constructor(component, obj, scale) { + super(); + this.component = component; + this.obj = obj; + this.scale = scale; + } + priority = ServerProtPriority.LOW; +}; + +// src/lostcity/network/225/outgoing/codec/IfSetObjectEncoder.ts +var IfSetObjectEncoder = class extends MessageEncoder { + prot = ServerProt.IF_SETOBJECT; + encode(buf, message) { + buf.p2(message.component); + buf.p2(message.obj); + buf.p2(message.scale); + } +}; + +// src/lostcity/network/outgoing/model/IfSetPlayerHead.ts +var IfSetPlayerHead = class extends OutgoingMessage { + constructor(component) { + super(); + this.component = component; + } + priority = ServerProtPriority.LOW; +}; + +// src/lostcity/network/225/outgoing/codec/IfSetPlayerHeadEncoder.ts +var IfSetPlayerHeadEncoder = class extends MessageEncoder { + prot = ServerProt.IF_SETPLAYERHEAD; + encode(buf, message) { + buf.p2(message.component); + } +}; + +// src/lostcity/network/outgoing/model/IfSetPosition.ts +var IfSetPosition = class extends OutgoingMessage { + constructor(component, x, y) { + super(); + this.component = component; + this.x = x; + this.y = y; + } + priority = ServerProtPriority.LOW; +}; + +// src/lostcity/network/225/outgoing/codec/IfSetPositionEncoder.ts +var IfSetPositionEncoder = class extends MessageEncoder { + prot = ServerProt.IF_SETPOSITION; + encode(buf, message) { + buf.p2(message.component); + buf.p2(message.x); + buf.p2(message.y); + } +}; + +// src/lostcity/network/outgoing/model/IfSetRecol.ts +var IfSetRecol = class extends OutgoingMessage { + constructor(component, src, dst) { + super(); + this.component = component; + this.src = src; + this.dst = dst; + } + priority = ServerProtPriority.LOW; +}; + +// src/lostcity/network/225/outgoing/codec/IfSetRecolEncoder.ts +var IfSetRecolEncoder = class extends MessageEncoder { + prot = ServerProt.IF_SETRECOL; + encode(buf, message) { + buf.p2(message.component); + buf.p2(message.src); + buf.p2(message.dst); + } +}; + +// src/lostcity/network/outgoing/model/IfSetText.ts +var IfSetText = class extends OutgoingMessage { + constructor(component, text) { + super(); + this.component = component; + this.text = text; + } + priority = ServerProtPriority.LOW; +}; + +// src/lostcity/network/225/outgoing/codec/IfSetTextEncoder.ts +var IfSetTextEncoder = class extends MessageEncoder { + prot = ServerProt.IF_SETTEXT; + encode(buf, message) { + buf.p2(message.component); + buf.pjstr(message.text); + } + test(message) { + return 2 + 1 + message.text.length; + } +}; + +// src/lostcity/network/outgoing/model/IfShowSide.ts +var IfShowSide = class extends OutgoingMessage { + constructor(tab) { + super(); + this.tab = tab; + } + priority = ServerProtPriority.LOW; +}; + +// src/lostcity/network/225/outgoing/codec/IfShowSideEncoder.ts +var IfShowSideEncoder = class extends MessageEncoder { + prot = ServerProt.IF_SHOWSIDE; + encode(buf, message) { + buf.p1(message.tab); + } +}; + +// src/lostcity/network/225/outgoing/codec/LastLoginInfoEncoder.ts +var LastLoginInfoEncoder = class extends MessageEncoder { + prot = ServerProt.LAST_LOGIN_INFO; + encode(buf, message) { + buf.p4(message.lastLoginIp); + buf.p2(message.daysSinceLogin); + buf.p1(message.daysSinceRecoveryChange); + buf.p2(message.unreadMessageCount); + } +}; + +// src/lostcity/network/225/outgoing/prot/ZoneProt.ts +var ZoneProt = class _ZoneProt extends ServerProt { + // zone protocol + static LOC_MERGE = new _ZoneProt(23, 14); + // based on runescript command p_locmerge + static LOC_ANIM = new _ZoneProt(42, 4); + // NXT naming + static OBJ_DEL = new _ZoneProt(49, 3); + // NXT naming + static OBJ_REVEAL = new _ZoneProt(50, 7); + // NXT naming + static LOC_ADD_CHANGE = new _ZoneProt(59, 4); + // NXT naming + static MAP_PROJANIM = new _ZoneProt(69, 15); + // NXT naming + static LOC_DEL = new _ZoneProt(76, 2); + // NXT naming + static OBJ_COUNT = new _ZoneProt(151, 7); + // NXT naming + static MAP_ANIM = new _ZoneProt(191, 6); + // NXT naming + static OBJ_ADD = new _ZoneProt(223, 5); + // NXT naming +}; + +// src/lostcity/network/outgoing/codec/ZoneMessageEncoder.ts +var ZoneMessageEncoder = class extends MessageEncoder { + enclose(message) { + const buf = new Packet(new Uint8Array(1 + this.prot.length)); + buf.p1(this.prot.id); + this.encode(buf, message); + return buf.data; + } +}; + +// src/lostcity/network/225/outgoing/codec/LocAddChangeEncoder.ts +var LocAddChangeEncoder = class extends ZoneMessageEncoder { + prot = ZoneProt.LOC_ADD_CHANGE; + encode(buf, message) { + buf.p1(message.coord); + buf.p1(message.shape << 2 | message.angle & 3); + buf.p2(message.loc); + } +}; + +// src/lostcity/network/225/outgoing/codec/LocAnimEncoder.ts +var LocAnimEncoder = class extends ZoneMessageEncoder { + prot = ZoneProt.LOC_ANIM; + encode(buf, message) { + buf.p1(message.coord); + buf.p1(message.shape << 2 | message.angle & 3); + buf.p2(message.seq); + } +}; + +// src/lostcity/network/225/outgoing/codec/LocDelEncoder.ts +var LocDelEncoder = class extends ZoneMessageEncoder { + prot = ZoneProt.LOC_DEL; + encode(buf, message) { + buf.p1(message.coord); + buf.p1(message.shape << 2 | message.angle & 3); + } +}; + +// src/lostcity/network/225/outgoing/codec/LocMergeEncoder.ts +var LocMergeEncoder = class extends ZoneMessageEncoder { + prot = ZoneProt.LOC_MERGE; + encode(buf, message) { + buf.p1(message.coord); + buf.p1(message.shape << 2 | message.angle & 3); + buf.p2(message.locId); + buf.p2(message.startCycle); + buf.p2(message.endCycle); + buf.p2(message.pid); + buf.p1(message.east - message.srcX); + buf.p1(message.south - message.srcZ); + buf.p1(message.west - message.srcX); + buf.p1(message.north - message.srcZ); + } +}; + +// src/lostcity/network/outgoing/model/Logout.ts +var Logout = class extends OutgoingMessage { + priority = ServerProtPriority.HIGH; +}; + +// src/lostcity/network/225/outgoing/codec/LogoutEncoder.ts +var LogoutEncoder = class extends MessageEncoder { + prot = ServerProt.LOGOUT; + encode(_, __) { + } +}; + +// src/lostcity/network/225/outgoing/codec/MapAnimEncoder.ts +var MapAnimEncoder = class extends ZoneMessageEncoder { + prot = ZoneProt.MAP_ANIM; + encode(buf, message) { + buf.p1(message.coord); + buf.p2(message.spotanim); + buf.p1(message.height); + buf.p2(message.delay); + } +}; + +// src/lostcity/network/225/outgoing/codec/MapProjAnimEncoder.ts +var MapProjAnimEncoder = class extends ZoneMessageEncoder { + prot = ZoneProt.MAP_PROJANIM; + // variables fully broken out for now + //coord $from, coord $to, spotanim $spotanim, int $fromHeight, int $toHeight, int $startDelay, int $endDelay, int $peak, int $arc + encode(buf, message) { + buf.p1(message.coord); + buf.p1(message.dstX - message.srcX); + buf.p1(message.dstZ - message.srcZ); + buf.p2(message.target); + buf.p2(message.spotanim); + buf.p1(message.srcHeight); + buf.p1(message.dstHeight); + buf.p2(message.startDelay); + buf.p2(message.endDelay); + buf.p1(message.peak); + buf.p1(message.arc); + } +}; + +// src/lostcity/network/225/outgoing/codec/MessageGameEncoder.ts +var MessageGameEncoder = class extends MessageEncoder { + prot = ServerProt.MESSAGE_GAME; + encode(buf, message) { + buf.pjstr(message.msg); + } + test(message) { + return 1 + message.msg.length; + } +}; + +// src/jagex2/wordenc/WordPack.ts +var WordPack = class { + // prettier-ignore + static CHAR_LOOKUP = [ + " ", + "e", + "t", + "a", + "o", + "i", + "h", + "n", + "s", + "r", + "d", + "l", + "u", + "m", + "w", + "c", + "y", + "f", + "g", + "p", + "b", + "v", + "k", + "x", + "j", + "q", + "z", + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + " ", + "!", + "?", + ".", + ",", + ":", + ";", + "(", + ")", + "-", + "&", + "*", + "\\", + "'", + "@", + "#", + "+", + "=", + "\xA3", + "$", + "%", + '"', + "[", + "]" + ]; + static unpack(packet, length) { + const charBuffer = []; + let pos = 0; + let carry = -1; + let nibble; + for (let i = 0; i < length && pos < 80; i++) { + const data = packet.g1(); + nibble = data >> 4 & 15; + if (carry !== -1) { + charBuffer[pos++] = this.CHAR_LOOKUP[(carry << 4) + nibble - 195]; + carry = -1; + } else if (nibble < 13) { + charBuffer[pos++] = this.CHAR_LOOKUP[nibble]; + } else { + carry = nibble; + } + nibble = data & 15; + if (carry != -1) { + charBuffer[pos++] = this.CHAR_LOOKUP[(carry << 4) + nibble - 195]; + carry = -1; + } else if (nibble < 13) { + charBuffer[pos++] = this.CHAR_LOOKUP[nibble]; + } else { + carry = nibble; + } + } + return this.toSentenceCase(charBuffer.slice(0, pos).join("")); + } + static pack(packet, input) { + if (input.length > 80) { + input = input.substring(0, 80); + } + input = input.toLowerCase(); + let carry = -1; + for (let i = 0; i < input.length; i++) { + const char = input.charAt(i); + let index = 0; + for (let j = 0; j < this.CHAR_LOOKUP.length; j++) { + if (char === this.CHAR_LOOKUP[j]) { + index = j; + break; + } + } + if (index > 12) { + index += 195; + } + if (carry == -1) { + if (index < 13) { + carry = index; + } else { + packet.p1(index); + } + } else if (index < 13) { + packet.p1((carry << 4) + index); + carry = -1; + } else { + packet.p1((carry << 4) + (index >> 4)); + carry = index & 15; + } + } + if (carry != -1) { + packet.p1(carry << 4); + } + } + static toSentenceCase(input) { + const chars = [...input.toLowerCase()]; + let punctuation = true; + for (let index = 0; index < chars.length; index++) { + const char = chars[index]; + if (punctuation && char >= "a" && char <= "z") { + chars[index] = char.toUpperCase(); + punctuation = false; + } + if (char === "." || char === "!") { + punctuation = true; + } + } + return chars.join(""); + } +}; + +// src/lostcity/network/225/outgoing/codec/MessagePrivateEncoder.ts +var MessagePrivateEncoder = class extends MessageEncoder { + prot = ServerProt.MESSAGE_PRIVATE; + encode(buf, message) { + buf.p8(message.from); + buf.p4(message.messageId); + buf.p1(message.staffModLevel); + WordPack.pack(buf, WordEnc.filter(message.msg)); + } + test(message) { + return 8 + 4 + 1 + 1 + message.msg.length; + } +}; + +// src/lostcity/network/outgoing/model/MessagePrivate.ts +var MessagePrivate = class extends OutgoingMessage { + constructor(from, messageId, staffModLevel, msg) { + super(); + this.from = from; + this.messageId = messageId; + this.staffModLevel = staffModLevel; + this.msg = msg; + } + priority = ServerProtPriority.HIGH; +}; + +// src/lostcity/network/225/outgoing/codec/MidiJingleEncoder.ts +var MidiJingleEncoder = class extends MessageEncoder { + prot = ServerProt.MIDI_JINGLE; + encode(buf, message) { + buf.p2(message.delay); + buf.p4(message.data.length); + buf.pdata(message.data, 0, message.data.length); + } + test(message) { + return 2 + 4 + message.data.length; + } +}; + +// src/lostcity/network/225/outgoing/codec/MidiSongEncoder.ts +var MidiSongEncoder = class extends MessageEncoder { + prot = ServerProt.MIDI_SONG; + encode(buf, message) { + buf.pjstr(message.name); + buf.p4(message.crc); + buf.p4(message.length); + } + test(message) { + return 1 + message.name.length + 4 + 4; + } +}; + +// src/lostcity/network/225/outgoing/codec/ObjAddEncoder.ts +var ObjAddEncoder = class extends ZoneMessageEncoder { + prot = ZoneProt.OBJ_ADD; + encode(buf, message) { + buf.p1(message.coord); + buf.p2(message.obj); + buf.p2(Math.min(message.count, 65535)); + } +}; + +// src/lostcity/network/225/outgoing/codec/ObjCountEncoder.ts +var ObjCountEncoder = class extends ZoneMessageEncoder { + prot = ZoneProt.OBJ_COUNT; + encode(buf, message) { + buf.p1(message.coord); + buf.p2(message.obj); + buf.p2(Math.min(message.oldCount, 65535)); + buf.p2(Math.min(message.newCount, 65535)); + } +}; + +// src/lostcity/network/225/outgoing/codec/ObjDelEncoder.ts +var ObjDelEncoder = class extends ZoneMessageEncoder { + prot = ZoneProt.OBJ_DEL; + encode(buf, message) { + buf.p1(message.coord); + buf.p2(message.obj); + } +}; + +// src/lostcity/network/225/outgoing/codec/ObjRevealEncoder.ts +var ObjRevealEncoder = class extends ZoneMessageEncoder { + prot = ZoneProt.OBJ_REVEAL; + encode(buf, message) { + buf.p1(message.coord); + buf.p2(message.obj); + buf.p2(Math.min(message.count, 65535)); + buf.p2(message.receiverId); + } +}; + +// src/lostcity/network/outgoing/model/PCountDialog.ts +var PCountDialog = class extends OutgoingMessage { + priority = ServerProtPriority.LOW; +}; + +// src/lostcity/network/225/outgoing/codec/PCountDialogEncoder.ts +var PCountDialogEncoder = class extends MessageEncoder { + prot = ServerProt.P_COUNTDIALOG; + encode(_, __) { + } +}; + +// src/lostcity/network/225/outgoing/codec/ResetAnimsEncoder.ts +var ResetAnimsEncoder = class extends MessageEncoder { + prot = ServerProt.RESET_ANIMS; + encode(_, __) { + } +}; + +// src/lostcity/network/225/outgoing/codec/ResetClientVarCacheEncoder.ts +var ResetClientVarCacheEncoder = class extends MessageEncoder { + prot = ServerProt.RESET_CLIENT_VARCACHE; + encode(_, __) { + } +}; + +// src/lostcity/network/outgoing/model/SetMultiway.ts +var SetMultiway = class extends OutgoingMessage { + constructor(hidden) { + super(); + this.hidden = hidden; + } + priority = ServerProtPriority.LOW; +}; + +// src/lostcity/network/225/outgoing/codec/SetMultiwayEncoder.ts +var SetMultiwayEncoder = class extends MessageEncoder { + prot = ServerProt.SET_MULTIWAY; + encode(buf, message) { + buf.pbool(message.hidden); + } +}; + +// src/lostcity/network/outgoing/model/SynthSound.ts +var SynthSound = class extends OutgoingMessage { + constructor(synth, loops, delay) { + super(); + this.synth = synth; + this.loops = loops; + this.delay = delay; + } + priority = ServerProtPriority.LOW; +}; + +// src/lostcity/network/225/outgoing/codec/SynthSoundEncoder.ts +var SynthSoundEncoder = class extends MessageEncoder { + prot = ServerProt.SYNTH_SOUND; + encode(buf, message) { + buf.p2(message.synth); + buf.p1(message.loops); + buf.p2(message.delay); + } +}; + +// src/lostcity/network/outgoing/model/TutorialFlashSide.ts +var TutorialFlashSide = class extends OutgoingMessage { + constructor(tab) { + super(); + this.tab = tab; + } + priority = ServerProtPriority.LOW; +}; + +// src/lostcity/network/225/outgoing/codec/TutorialFlashSideEncoder.ts +var TutorialFlashSideEncoder = class extends MessageEncoder { + prot = ServerProt.TUTORIAL_FLASHSIDE; + encode(buf, message) { + buf.p1(message.tab); + } +}; + +// src/lostcity/network/225/outgoing/codec/TutorialOpenChatEncoder.ts +var TutorialOpenChatEncoder = class extends MessageEncoder { + prot = ServerProt.TUTORIAL_OPENCHAT; + encode(buf, message) { + buf.p2(message.component); + } +}; + +// src/lostcity/network/225/outgoing/codec/UnsetMapFlagEncoder.ts +var UnsetMapFlagEncoder = class extends MessageEncoder { + prot = ServerProt.UNSET_MAP_FLAG; + encode(_, __) { + } +}; + +// src/lostcity/network/outgoing/model/UpdateFriendList.ts +var UpdateFriendList = class extends OutgoingMessage { + constructor(name, nodeId) { + super(); + this.name = name; + this.nodeId = nodeId; + } + priority = ServerProtPriority.LOW; +}; + +// src/lostcity/network/225/outgoing/codec/UpdateFriendListEncoder.ts +var UpdateFriendListEncoder = class extends MessageEncoder { + prot = ServerProt.UPDATE_FRIENDLIST; + encode(buf, message) { + buf.p8(message.name); + buf.p1(message.nodeId); + } +}; + +// src/lostcity/network/outgoing/model/UpdateIgnoreList.ts +var UpdateIgnoreList = class extends OutgoingMessage { + constructor(names) { + super(); + this.names = names; + } + priority = ServerProtPriority.LOW; +}; + +// src/lostcity/network/225/outgoing/codec/UpdateIgnoreListEncoder.ts +var UpdateIgnoreListEncoder = class extends MessageEncoder { + prot = ServerProt.UPDATE_IGNORELIST; + encode(buf, message) { + for (const name of message.names) { + buf.p8(name); + } + } + test(message) { + return 8 * message.names.length; + } +}; + +// src/lostcity/network/outgoing/model/UpdateInvFull.ts +var UpdateInvFull = class extends OutgoingMessage { + constructor(component, inv) { + super(); + this.component = component; + this.inv = inv; + } + priority = ServerProtPriority.HIGH; +}; + +// src/lostcity/network/225/outgoing/codec/UpdateInvFullEncoder.ts +var UpdateInvFullEncoder = class extends MessageEncoder { + prot = ServerProt.UPDATE_INV_FULL; + encode(buf, message) { + const { component, inv } = message; + const comType = Component.get(component); + const size = Math.min(inv.capacity, comType.width * comType.height); + buf.p2(component); + buf.p1(size); + for (let slot = 0; slot < size; slot++) { + const obj = inv.get(slot); + if (obj) { + buf.p2(obj.id + 1); + if (obj.count >= 255) { + buf.p1(255); + buf.p4(obj.count); + } else { + buf.p1(obj.count); + } + } else { + buf.p2(0); + buf.p1(0); + } + } + } + test(message) { + const { component, inv } = message; + const comType = Component.get(component); + const size = Math.min(inv.capacity, comType.width * comType.height); + let length = 0; + length += 3; + for (let slot = 0; slot < size; slot++) { + const obj = inv.get(slot); + if (obj) { + length += 2; + if (obj.count >= 255) { + length += 5; + } else { + length += 1; + } + } else { + length += 3; + } + } + return length; + } +}; + +// src/lostcity/network/outgoing/model/UpdateInvPartial.ts +var UpdateInvPartial = class extends OutgoingMessage { + constructor(component, inv, ...slots) { + super(); + this.component = component; + this.inv = inv; + this.slots = slots; + } + priority = ServerProtPriority.HIGH; + slots; +}; + +// src/lostcity/network/225/outgoing/codec/UpdateInvPartialEncoder.ts +var UpdateInvPartialEncoder = class extends MessageEncoder { + prot = ServerProt.UPDATE_INV_PARTIAL; + encode(buf, message) { + const { component, inv } = message; + buf.p2(component); + for (const slot of message.slots) { + const obj = inv.get(slot); + buf.p1(slot); + if (obj) { + buf.p2(obj.id + 1); + if (obj.count >= 255) { + buf.p1(255); + buf.p4(obj.count); + } else { + buf.p1(obj.count); + } + } else { + buf.p2(0); + buf.p1(0); + } + } + } + test(message) { + const { inv } = message; + let length = 0; + length += 2; + for (const slot of message.slots) { + const obj = inv.get(slot); + length += 1; + if (obj) { + length += 2; + if (obj.count >= 255) { + length += 5; + } else { + length += 1; + } + } else { + length += 3; + } + } + return length; + } +}; + +// src/lostcity/network/225/outgoing/codec/UpdateInvStopTransmitEncoder.ts +var UpdateInvStopTransmitEncoder = class extends MessageEncoder { + prot = ServerProt.UPDATE_INV_STOP_TRANSMIT; + encode(buf, message) { + buf.p2(message.component); + } +}; + +// src/lostcity/network/outgoing/model/UpdateRunEnergy.ts +var UpdateRunEnergy = class extends OutgoingMessage { + constructor(energy) { + super(); + this.energy = energy; + } + priority = ServerProtPriority.LOW; +}; + +// src/lostcity/network/225/outgoing/codec/UpdateRunEnergyEncoder.ts +var UpdateRunEnergyEncoder = class extends MessageEncoder { + prot = ServerProt.UPDATE_RUNENERGY; + encode(buf, message) { + buf.p1(message.energy / 100 | 0); + } +}; + +// src/lostcity/network/outgoing/model/UpdateRunWeight.ts +var UpdateRunWeight = class extends OutgoingMessage { + constructor(kg) { + super(); + this.kg = kg; + } + priority = ServerProtPriority.LOW; +}; + +// src/lostcity/network/225/outgoing/codec/UpdateRunWeightEncoder.ts +var UpdateRunWeightEncoder = class extends MessageEncoder { + prot = ServerProt.UPDATE_RUNWEIGHT; + encode(buf, message) { + buf.p2(message.kg); + } +}; + +// src/lostcity/network/outgoing/model/UpdateStat.ts +var UpdateStat = class extends OutgoingMessage { + constructor(stat, exp, level) { + super(); + this.stat = stat; + this.exp = exp; + this.level = level; + } + priority = ServerProtPriority.LOW; +}; + +// src/lostcity/network/225/outgoing/codec/UpdateStatEncoder.ts +var UpdateStatEncoder = class extends MessageEncoder { + prot = ServerProt.UPDATE_STAT; + encode(buf, message) { + buf.p1(message.stat); + buf.p4(message.exp / 10 | 0); + buf.p1(message.level); + } +}; + +// src/lostcity/network/225/outgoing/codec/UpdateUid192Encoder.ts +var UpdateUid192Encoder = class extends MessageEncoder { + prot = ServerProt.UPDATE_UID192; + encode(buf, message) { + buf.p2(message.uid); + } +}; + +// src/lostcity/network/225/outgoing/codec/UpdateZoneFullFollowsEncoder.ts +var UpdateZoneFullFollowsEncoder = class extends MessageEncoder { + prot = ServerProt.UPDATE_ZONE_FULL_FOLLOWS; + encode(buf, message) { + buf.p1((message.zoneX << 3) - Position.zoneOrigin(message.originX)); + buf.p1((message.zoneZ << 3) - Position.zoneOrigin(message.originZ)); + } +}; + +// src/lostcity/network/225/outgoing/codec/UpdateZonePartialFollowsEncoder.ts +var UpdateZonePartialFollowsEncoder = class extends MessageEncoder { + prot = ServerProt.UPDATE_ZONE_PARTIAL_FOLLOWS; + encode(buf, message) { + buf.p1((message.zoneX << 3) - Position.zoneOrigin(message.originX)); + buf.p1((message.zoneZ << 3) - Position.zoneOrigin(message.originZ)); + } +}; + +// src/lostcity/network/225/outgoing/codec/UpdateZonePartialEnclosedEncoder.ts +var UpdateZonePartialEnclosedEncoder = class extends MessageEncoder { + prot = ServerProt.UPDATE_ZONE_PARTIAL_ENCLOSED; + encode(buf, message) { + buf.p1((message.zoneX << 3) - Position.zoneOrigin(message.originX)); + buf.p1((message.zoneZ << 3) - Position.zoneOrigin(message.originZ)); + buf.pdata(message.data, 0, message.data.length); + } + test(message) { + return 1 + 1 + message.data.length; + } +}; + +// src/lostcity/network/225/outgoing/codec/VarpLargeEncoder.ts +var VarpLargeEncoder = class extends MessageEncoder { + prot = ServerProt.VARP_LARGE; + encode(buf, message) { + buf.p2(message.varp); + buf.p4(message.value); + } +}; + +// src/lostcity/network/225/outgoing/codec/VarpSmallEncoder.ts +var VarpSmallEncoder = class extends MessageEncoder { + prot = ServerProt.VARP_SMALL; + encode(buf, message) { + buf.p2(message.varp); + buf.p1(message.value); + } +}; + +// src/lostcity/network/outgoing/model/NpcInfo.ts +var NpcInfo = class extends OutgoingMessage { + constructor(buildArea, level, x, z, originX, originZ, deltaX, deltaZ, changedLevel) { + super(); + this.buildArea = buildArea; + this.level = level; + this.x = x; + this.z = z; + this.originX = originX; + this.originZ = originZ; + this.deltaX = deltaX; + this.deltaZ = deltaZ; + this.changedLevel = changedLevel; + } + priority = ServerProtPriority.HIGH; + accumulator = 0; +}; + +// src/lostcity/network/225/outgoing/codec/NpcInfoEncoder.ts +var NpcInfoEncoder = class _NpcInfoEncoder extends MessageEncoder { + static BITS_NEW = 13 + 11 + 5 + 5 + 1; + static BITS_IDLE = 1; + static BITS_RUN = 1 + 2 + 3 + 3 + 1; + static BITS_WALK = 1 + 2 + 3 + 1; + static BITS_EXTENDED = 1 + 2; + static BYTES_LIMIT = 4997; + prot = ServerProt.NPC_INFO; + encode(buf, message) { + const buildArea = message.buildArea; + if (message.changedLevel || message.deltaX > buildArea.viewDistance || message.deltaZ > buildArea.viewDistance) { + buildArea.npcs.clear(); + } + this.writeNpcs(buf, message); + this.writeNewNpcs(buf, message); + const extended = buildArea.extendedInfo; + if (extended.size > 0) { + for (const info of extended) { + const npc = World_default.getNpc(info.id); + if (!npc) { + buf.p1(0); + continue; + } + this.writeExtendedInfo(npc, buf, info.added); + } + } + buildArea.clearExtended(); + } + test(_) { + return _NpcInfoEncoder.BYTES_LIMIT; + } + willFit(message, buf, bitsToAdd, bytesToAdd) { + return (buf.bitPos + bitsToAdd + 7 >>> 3) + (message.accumulator + bytesToAdd) <= _NpcInfoEncoder.BYTES_LIMIT; + } + writeNpcs(buf, message) { + const buildArea = message.buildArea; + buf.bits(); + buf.pBit(8, buildArea.npcs.size); + for (const nid of buildArea.npcs) { + const npc = World_default.getNpc(nid); + if (!npc || npc.tele || npc.level !== message.level || !Position.isWithinDistanceSW(message, npc, 15) || !npc.checkLifeCycle(World_default.currentTick)) { + buf.pBit(1, 1); + buf.pBit(2, 3); + buildArea.npcs.delete(nid); + continue; + } + const extendedInfoSize = this.calculateExtendedInfo(npc, false); + let extendedInfo = extendedInfoSize > 0; + const { walkDir, runDir } = npc; + let bits = _NpcInfoEncoder.BITS_IDLE; + if (runDir !== -1) { + bits = _NpcInfoEncoder.BITS_RUN; + } else if (walkDir !== -1) { + bits = _NpcInfoEncoder.BITS_WALK; + } else if (extendedInfo) { + bits = _NpcInfoEncoder.BITS_EXTENDED; + } + if (!this.willFit(message, buf, bits, extendedInfoSize)) { + extendedInfo = false; + } + buf.pBit(1, runDir !== -1 || walkDir !== -1 || extendedInfo ? 1 : 0); + if (runDir !== -1) { + buf.pBit(2, 2); + buf.pBit(3, walkDir); + buf.pBit(3, runDir); + buf.pBit(1, extendedInfo ? 1 : 0); + } else if (walkDir !== -1) { + buf.pBit(2, 1); + buf.pBit(3, walkDir); + buf.pBit(1, extendedInfo ? 1 : 0); + } else if (extendedInfo) { + buf.pBit(2, 0); + } + if (extendedInfo) { + buildArea.extendedInfo.add({ id: nid, added: false }); + message.accumulator += extendedInfoSize; + } + } + } + writeNewNpcs(buf, message) { + const buildArea = message.buildArea; + for (const npc of buildArea.getNearbyNpcs(message.x, message.z, message.originX, message.originZ)) { + const extendedInfoSize = this.calculateExtendedInfo(npc, true); + const extendedInfo = extendedInfoSize > 0; + if (!this.willFit(message, buf, _NpcInfoEncoder.BITS_NEW + 13, extendedInfoSize)) { + break; + } + buf.pBit(13, npc.nid); + buf.pBit(11, npc.type); + buf.pBit(5, npc.x - message.x); + buf.pBit(5, npc.z - message.z); + buf.pBit(1, extendedInfo ? 1 : 0); + if (extendedInfo) { + buildArea.extendedInfo.add({ id: npc.nid, added: true }); + message.accumulator += extendedInfoSize; + } + buildArea.npcs.add(npc.nid); + } + if (buildArea.extendedInfo.size > 0) { + buf.pBit(13, 8191); + } + buf.bytes(); + } + writeExtendedInfo(npc, buf, newlyObserved) { + let mask = npc.mask; + if (newlyObserved) { + if (npc.orientationX !== -1 || npc.faceX !== -1) { + mask |= Npc.FACE_COORD; + } + if (npc.faceEntity !== -1) { + mask |= Npc.FACE_ENTITY; + } + } + buf.p1(mask); + if (mask & Npc.ANIM) { + buf.p2(npc.animId); + buf.p1(npc.animDelay); + } + if (mask & Npc.FACE_ENTITY) { + if (npc.faceEntity !== -1) { + npc.alreadyFacedEntity = true; + } + buf.p2(npc.faceEntity); + } + if (mask & Npc.SAY) { + buf.pjstr(npc.chat ?? ""); + } + if (mask & Npc.DAMAGE) { + buf.p1(npc.damageTaken); + buf.p1(npc.damageType); + buf.p1(npc.levels[NpcStat_default.HITPOINTS]); + buf.p1(npc.baseLevels[NpcStat_default.HITPOINTS]); + } + if (mask & Npc.CHANGE_TYPE) { + buf.p2(npc.type); + } + if (mask & Npc.SPOTANIM) { + buf.p2(npc.graphicId); + buf.p2(npc.graphicHeight); + buf.p2(npc.graphicDelay); + } + if (mask & Npc.FACE_COORD) { + if (newlyObserved && npc.orientationX != -1) { + buf.p2(npc.orientationX); + buf.p2(npc.orientationZ); + } else { + buf.p2(npc.faceX); + buf.p2(npc.faceZ); + } + } + } + calculateExtendedInfo(npc, newlyObserved) { + let length = 0; + let mask = npc.mask; + if (newlyObserved) { + if (npc.orientationX !== -1 || npc.faceX !== -1) { + mask |= Npc.FACE_COORD; + } + if (npc.faceEntity !== -1) { + mask |= Npc.FACE_ENTITY; + } + } + if (mask === 0) { + return 0; + } + length += 1; + if (mask & Npc.ANIM) { + length += 3; + } + if (mask & Npc.FACE_ENTITY) { + length += 2; + } + if (mask & Npc.SAY) { + length += 1 + npc.chat.length; + } + if (mask & Npc.DAMAGE) { + length += 4; + } + if (mask & Npc.CHANGE_TYPE) { + length += 2; + } + if (mask & Npc.SPOTANIM) { + length += 6; + } + if (mask & Npc.FACE_COORD) { + length += 4; + } + return length; + } +}; + +// src/lostcity/network/outgoing/model/UpdateRebootTimer.ts +var UpdateRebootTimer = class extends OutgoingMessage { + // todo: confirm if reboot timer is low or high priority + constructor(ticks) { + super(); + this.ticks = ticks; + } + priority = ServerProtPriority.LOW; +}; + +// src/lostcity/network/225/outgoing/codec/UpdateRebootTimerEncoder.ts +var UpdateRebootTimerEncoder = class extends MessageEncoder { + prot = ServerProt.UPDATE_REBOOT_TIMER; + encode(buf, message) { + buf.p2(message.ticks); + } +}; + +// src/lostcity/network/225/outgoing/prot/ServerProtRepository.ts +var ServerProtRepository = class { + encoders = /* @__PURE__ */ new Map(); + bind(message, encoder) { + if (this.encoders.has(message)) { + throw new Error(`[ServerProtRepository] Already defines a ${message.name}.`); + } + this.encoders.set(message, encoder); + } + constructor() { + this.bind(CamLookAt, new CamLookAtEncoder()); + this.bind(CamMoveTo, new CamMoveToEncoder()); + this.bind(CamReset, new CamResetEncoder()); + this.bind(CamShake, new CamShakeEncoder()); + this.bind(ChatFilterSettings, new ChatFilterSettingsEncoder()); + this.bind(DataLand, new DataLandEncoder()); + this.bind(DataLandDone, new DataLandDoneEncoder()); + this.bind(DataLoc, new DataLocEncoder()); + this.bind(DataLocDone, new DataLocDoneEncoder()); + this.bind(EnableTracking, new EnableTrackingEncoder()); + this.bind(FinishTracking, new FinishTrackingEncoder()); + this.bind(HintArrow, new HintArrowEncoder()); + this.bind(IfClose, new IfCloseEncoder()); + this.bind(IfOpenChatModal, new IfOpenChatModalEncoder()); + this.bind(IfOpenMainModal, new IfOpenMainModalEncoder()); + this.bind(IfOpenMainSideModal, new IfOpenMainSideModalEncoder()); + this.bind(IfOpenSideModal, new IfOpenSideModalEncoder()); + this.bind(IfOpenSideOverlay, new IfOpenSideOverlayEncoder()); + this.bind(IfSetAnim, new IfSetAnimEncoder()); + this.bind(IfSetColour, new IfSetColourEncoder()); + this.bind(IfSetHide, new IfSetHideEncoder()); + this.bind(IfSetModel, new IfSetModelEncoder()); + this.bind(IfSetNpcHead, new IfSetNpcHeadEncoder()); + this.bind(IfSetObject, new IfSetObjectEncoder()); + this.bind(IfSetPlayerHead, new IfSetPlayerHeadEncoder()); + this.bind(IfSetPosition, new IfSetPositionEncoder()); + this.bind(IfSetRecol, new IfSetRecolEncoder()); + this.bind(IfSetText, new IfSetTextEncoder()); + this.bind(IfShowSide, new IfShowSideEncoder()); + this.bind(LastLoginInfo, new LastLoginInfoEncoder()); + this.bind(LocAddChange, new LocAddChangeEncoder()); + this.bind(LocAnim, new LocAnimEncoder()); + this.bind(LocDel, new LocDelEncoder()); + this.bind(LocMerge, new LocMergeEncoder()); + this.bind(Logout, new LogoutEncoder()); + this.bind(MapAnim, new MapAnimEncoder()); + this.bind(MapProjAnim, new MapProjAnimEncoder()); + this.bind(MessageGame, new MessageGameEncoder()); + this.bind(MessagePrivate, new MessagePrivateEncoder()); + this.bind(MidiJingle, new MidiJingleEncoder()); + this.bind(MidiSong, new MidiSongEncoder()); + this.bind(NpcInfo, new NpcInfoEncoder()); + this.bind(ObjAdd, new ObjAddEncoder()); + this.bind(ObjCount, new ObjCountEncoder()); + this.bind(ObjDel, new ObjDelEncoder()); + this.bind(ObjReveal, new ObjRevealEncoder()); + this.bind(PCountDialog, new PCountDialogEncoder()); + this.bind(PlayerInfo, new PlayerInfoEncoder()); + this.bind(RebuildNormal, new RebuildNormalEncoder()); + this.bind(ResetAnims, new ResetAnimsEncoder()); + this.bind(ResetClientVarCache, new ResetClientVarCacheEncoder()); + this.bind(SetMultiway, new SetMultiwayEncoder()); + this.bind(SynthSound, new SynthSoundEncoder()); + this.bind(TutorialFlashSide, new TutorialFlashSideEncoder()); + this.bind(TutorialOpenChat, new TutorialOpenChatEncoder()); + this.bind(UnsetMapFlag, new UnsetMapFlagEncoder()); + this.bind(UpdateFriendList, new UpdateFriendListEncoder()); + this.bind(UpdateIgnoreList, new UpdateIgnoreListEncoder()); + this.bind(UpdateInvFull, new UpdateInvFullEncoder()); + this.bind(UpdateInvPartial, new UpdateInvPartialEncoder()); + this.bind(UpdateInvStopTransmit, new UpdateInvStopTransmitEncoder()); + this.bind(UpdateRunEnergy, new UpdateRunEnergyEncoder()); + this.bind(UpdateRunWeight, new UpdateRunWeightEncoder()); + this.bind(UpdateRebootTimer, new UpdateRebootTimerEncoder()); + this.bind(UpdateStat, new UpdateStatEncoder()); + this.bind(UpdateUid192, new UpdateUid192Encoder()); + this.bind(UpdateZoneFullFollows, new UpdateZoneFullFollowsEncoder()); + this.bind(UpdateZonePartialEnclosed, new UpdateZonePartialEnclosedEncoder()); + this.bind(UpdateZonePartialFollows, new UpdateZonePartialFollowsEncoder()); + this.bind(VarpLarge, new VarpLargeEncoder()); + this.bind(VarpSmall, new VarpSmallEncoder()); + } + getEncoder(message) { + return this.encoders.get(message.constructor); + } + getZoneEncoder(message) { + return this.encoders.get(message.constructor); + } +}; +var ServerProtRepository_default = new ServerProtRepository(); + +// src/lostcity/engine/zone/ZoneEntityList.ts +var ZoneEntityList = class extends Array { + capacity; + onFilled; + constructor(capacity, onFilled) { + super(); + this.capacity = capacity; + this.onFilled = onFilled; + } + // ---- + *stack(coord) { + const items = this[coord]; + if (typeof items === "undefined") { + return; + } + for (let index = 0; index < items.length; index++) { + yield items[index]; + } + } + *all(reverse = false) { + for (let index = 0; index < this.length; index++) { + const items = this[index]; + if (typeof items === "undefined") { + continue; + } + if (reverse) { + for (let i = items.length - 1; i >= 0; i--) { + yield items[i]; + } + } else { + for (let i = 0; i < items.length; i++) { + yield items[i]; + } + } + } + } + // ---- + addLast(coord, item, unchecked = false) { + this.check(coord, unchecked); + this[coord]?.push(item); + } + addFirst(coord, item, unchecked = false) { + this.check(coord, unchecked); + this[coord]?.unshift(item); + } + sortStack(coord, unchecked = false) { + const top = this.nextTopStack(coord); + if (typeof top === "undefined") { + return; + } + const items = this[coord]; + if (typeof items === "undefined") { + return; + } + if (items[0] !== top) { + this.remove(coord, top); + this.addFirst(coord, top, unchecked); + } + } + remove(coord, item) { + const items = this[coord]; + if (typeof items === "undefined") { + return; + } + const index = items.indexOf(item); + if (index === -1) { + return; + } + items.splice(index, 1); + } + contains(coord, item) { + const items = this[coord]; + if (typeof items === "undefined") { + return false; + } + return items.indexOf(item) !== -1; + } + check(coord, unchecked) { + const items = this[coord]; + if (typeof items === "undefined") { + this[coord] = []; + } + if (!unchecked && this.total === this.capacity) { + const bottom = this.nextBottomAll(); + if (typeof bottom !== "undefined") { + this.onFilled(bottom); + } + } + } + get total() { + let total = 0; + for (let index = 0; index < this.length; index++) { + const items = this[index]; + if (typeof items === "undefined") { + continue; + } + total += items.length; + } + return total; + } +}; +var LocList = class extends ZoneEntityList { + nextTopStack(coord) { + const locs = this[coord]; + if (typeof locs === "undefined") { + return void 0; + } + let topCost = -99999999; + let topLoc; + for (const loc of locs) { + const cost = loc.lifecycle; + if (cost > topCost) { + topCost = cost; + topLoc = loc; + } + } + return topLoc; + } + nextBottomAll() { + let bottomCost = Number.POSITIVE_INFINITY; + let bottomLoc; + for (let index = 0; index < this.length; index++) { + const locs = this[index]; + if (typeof locs === "undefined") { + continue; + } + for (const loc of locs) { + if (bottomCost === 0) { + break; + } + if (loc.lifecycle !== EntityLifeCycle_default.DESPAWN) { + continue; + } + const cost = loc.lifecycle; + if (cost < bottomCost) { + bottomCost = cost; + bottomLoc = loc; + } + } + } + return bottomLoc; + } +}; +var ObjList = class extends ZoneEntityList { + nextTopStack(coord) { + const objs = this[coord]; + if (typeof objs === "undefined") { + return void 0; + } + let topCost = -99999999; + let topObj; + for (const obj of objs) { + const type = ObjType.get(obj.type); + let cost = type.cost; + if (type.stackable) { + cost *= obj.count + 1; + } + cost += obj.lifecycle; + if (cost > topCost) { + topCost = cost; + topObj = obj; + } + } + return topObj; + } + nextBottomAll() { + let bottomCost = Number.POSITIVE_INFINITY; + let bottomObj; + for (let index = 0; index < this.length; index++) { + const objs = this[index]; + if (typeof objs === "undefined") { + continue; + } + for (const obj of objs) { + if (bottomCost === 0) { + break; + } + if (obj.lifecycle !== EntityLifeCycle_default.DESPAWN) { + continue; + } + const type = ObjType.get(obj.type); + let cost = type.cost; + if (type.stackable) { + cost *= obj.count + 1; + } + cost += obj.lifecycle; + if (cost < bottomCost) { + bottomCost = cost; + bottomObj = obj; + } + } + } + return bottomObj; + } +}; + +// src/lostcity/engine/zone/Zone.ts +var Zone = class _Zone { + static SIZE = 8 * 8; + static LOCS = this.SIZE << 2; + static OBJS = (this.SIZE << 1) + 1; + index; + // packed coord + x; + z; + level; + // zone entities + players; + // list of player uids + npcs; + // list of npc nids (not uid because type may change) + locs; + objs; + entityEvents; + // zone events + events; + shared = null; + totalLocs = 0; + totalObjs = 0; + constructor(index) { + this.index = index; + const coord = ZoneMap.unpackIndex(index); + this.x = coord.x >> 3; + this.z = coord.z >> 3; + this.level = coord.level; + this.events = /* @__PURE__ */ new Set(); + this.players = /* @__PURE__ */ new Set(); + this.npcs = /* @__PURE__ */ new Set(); + this.locs = new LocList(_Zone.LOCS, (loc) => World_default.removeLoc(loc, 100)); + this.objs = new ObjList(_Zone.OBJS, (obj) => World_default.removeObj(obj, 100)); + this.entityEvents = /* @__PURE__ */ new Map(); + } + enter(entity) { + if (entity instanceof Player) { + this.players.add(entity.uid); + World_default.getZoneGrid(this.level).flag(this.x, this.z); + } else if (entity instanceof Npc) { + this.npcs.add(entity.nid); + } + } + leave(entity) { + if (entity instanceof Player) { + this.players.delete(entity.uid); + if (this.players.size === 0) { + World_default.getZoneGrid(this.level).unflag(this.x, this.z); + } + } else if (entity instanceof Npc) { + this.npcs.delete(entity.nid); + } + } + tick(tick) { + let updated; + do { + updated = false; + for (const obj of this.getAllObjsUnsafe()) { + if (!obj.updateLifeCycle(tick) || obj.lastLifecycleTick === tick) { + continue; + } + if (obj.lifecycle === EntityLifeCycle_default.DESPAWN) { + if (obj.receiverId !== -1) { + World_default.revealObj(obj); + } else { + World_default.removeObj(obj, 0); + updated = true; + } + } else if (obj.lifecycle === EntityLifeCycle_default.RESPAWN) { + World_default.addObj(obj, -1, 0); + updated = true; + } + } + for (const loc of this.getAllLocsUnsafe()) { + if (!loc.updateLifeCycle(tick) || loc.lastLifecycleTick === tick) { + continue; + } + if (loc.lifecycle === EntityLifeCycle_default.DESPAWN) { + World_default.removeLoc(loc, 0); + updated = true; + } else if (loc.lifecycle === EntityLifeCycle_default.RESPAWN) { + World_default.addLoc(loc, 0); + updated = true; + } + } + } while (updated); + } + computeShared() { + this.shared = null; + let length = 0; + const enclosed = []; + for (const event of this.events.values()) { + if (event.type !== ZoneEventType_default.ENCLOSED) { + continue; + } + const encoder = ServerProtRepository_default.getZoneEncoder(event.message); + if (typeof encoder === "undefined") { + continue; + } + const bytes = encoder.enclose(event.message); + enclosed.push(bytes); + length += bytes.length; + } + if (enclosed.length === 0 || length === 0) { + return; + } + const shared = new Uint8Array(length); + let ptr = 0; + for (const bytes of enclosed) { + shared.set(bytes, ptr); + ptr += bytes.length; + } + this.shared = shared; + } + writeFullFollows(player) { + player.write(new UpdateZoneFullFollows(this.x, this.z, player.originX, player.originZ)); + for (const obj of this.getAllObjsUnsafe(true)) { + if (obj.receiverId !== -1 && obj.receiverId !== player.pid) { + continue; + } + player.write(new UpdateZonePartialFollows(this.x, this.z, player.originX, player.originZ)); + if (obj.lifecycle === EntityLifeCycle_default.DESPAWN && obj.checkLifeCycle(World_default.currentTick)) { + player.write(new ObjAdd(Position.packZoneCoord(obj.x, obj.z), obj.type, obj.count)); + } else if (obj.lifecycle === EntityLifeCycle_default.RESPAWN && obj.checkLifeCycle(World_default.currentTick)) { + player.write(new ObjAdd(Position.packZoneCoord(obj.x, obj.z), obj.type, obj.count)); + } + } + for (const loc of this.getAllLocsUnsafe(true)) { + if (loc.lifecycle === EntityLifeCycle_default.DESPAWN && loc.checkLifeCycle(World_default.currentTick)) { + player.write(new LocAddChange(Position.packZoneCoord(loc.x, loc.z), loc.type, loc.shape, loc.angle)); + } else if (loc.lifecycle === EntityLifeCycle_default.RESPAWN && !loc.checkLifeCycle(World_default.currentTick)) { + player.write(new LocDel(Position.packZoneCoord(loc.x, loc.z), loc.shape, loc.angle)); + } + } + } + writePartialEncloses(player) { + if (!this.shared) { + return; + } + player.write(new UpdateZonePartialEnclosed(this.x, this.z, player.originX, player.originZ, this.shared)); + } + writePartialFollows(player) { + if (this.events.size === 0) { + return; + } + player.write(new UpdateZonePartialFollows(this.x, this.z, player.originX, player.originZ)); + for (const event of this.events) { + if (event.type !== ZoneEventType_default.FOLLOWS) { + continue; + } + if (event.receiverId !== -1 && event.receiverId !== player.pid) { + continue; + } + player.write(event.message); + } + } + reset() { + this.events.clear(); + this.entityEvents.clear(); + } + // ---- static locs/objs are added during world init ---- + addStaticLoc(loc) { + const coord = Position.packZoneCoord(loc.x, loc.z); + this.locs.addLast(coord, loc, true); + this.totalLocs++; + this.locs.sortStack(coord, true); + } + addStaticObj(obj) { + const coord = Position.packZoneCoord(obj.x, obj.z); + this.objs.addLast(coord, obj, true); + this.totalObjs++; + this.objs.sortStack(coord, true); + } + // ---- + appendEvent(entity, event) { + this.events.add(event); + const exist = this.entityEvents.get(entity); + if (typeof exist === "undefined") { + this.entityEvents.set(entity, [event]); + return; + } + this.entityEvents.set(entity, exist.concat(event)); + } + addLoc(loc) { + const coord = Position.packZoneCoord(loc.x, loc.z); + if (loc.lifecycle === EntityLifeCycle_default.DESPAWN) { + this.locs.addLast(coord, loc); + this.totalLocs++; + } + this.locs.sortStack(coord); + this.appendEvent(loc, new ZoneEvent(ZoneEventType_default.ENCLOSED, -1, new LocAddChange(coord, loc.type, loc.shape, loc.angle))); + } + removeLoc(loc) { + const coord = Position.packZoneCoord(loc.x, loc.z); + if (loc.lifecycle === EntityLifeCycle_default.DESPAWN) { + this.locs.remove(coord, loc); + this.totalLocs--; + } + this.locs.sortStack(coord); + const events = this.entityEvents.get(loc); + if (typeof events !== "undefined") { + for (let index = 0; index < events.length; index++) { + this.events.delete(events[index]); + } + this.entityEvents.delete(loc); + } + if (loc.lastLifecycleTick !== World_default.currentTick) { + this.appendEvent(loc, new ZoneEvent(ZoneEventType_default.ENCLOSED, -1, new LocDel(coord, loc.shape, loc.angle))); + } + } + getLoc(x, z, type) { + for (const loc of this.getLocsSafe(Position.packZoneCoord(x, z))) { + if (loc.type === type) { + return loc; + } + } + return null; + } + mergeLoc(loc, player, startCycle, endCycle, south, east, north, west) { + this.appendEvent(loc, new ZoneEvent(ZoneEventType_default.ENCLOSED, -1, new LocMerge(loc.x, loc.z, loc.shape, loc.angle, loc.type, startCycle, endCycle, player.pid, east, south, west, north))); + } + animLoc(loc, seq) { + this.appendEvent(loc, new ZoneEvent(ZoneEventType_default.ENCLOSED, -1, new LocAnim(Position.packZoneCoord(loc.x, loc.z), loc.shape, loc.angle, seq))); + } + // ---- + addObj(obj, receiverId) { + const coord = Position.packZoneCoord(obj.x, obj.z); + if (obj.lifecycle === EntityLifeCycle_default.DESPAWN) { + this.objs.addLast(coord, obj); + this.totalObjs++; + } + this.objs.sortStack(coord); + if (obj.lifecycle === EntityLifeCycle_default.RESPAWN || receiverId === -1) { + this.appendEvent(obj, new ZoneEvent(ZoneEventType_default.ENCLOSED, receiverId, new ObjAdd(coord, obj.type, obj.count))); + } else if (obj.lifecycle === EntityLifeCycle_default.DESPAWN) { + this.appendEvent(obj, new ZoneEvent(ZoneEventType_default.FOLLOWS, receiverId, new ObjAdd(coord, obj.type, obj.count))); + } + } + revealObj(obj, receiverId) { + obj.receiverId = -1; + obj.reveal = -1; + const coord = Position.packZoneCoord(obj.x, obj.z); + this.objs.sortStack(coord); + this.appendEvent(obj, new ZoneEvent(ZoneEventType_default.ENCLOSED, receiverId, new ObjReveal(coord, obj.type, obj.count, receiverId))); + } + changeObj(obj, receiverId, oldCount, newCount) { + obj.count = newCount; + const coord = Position.packZoneCoord(obj.x, obj.z); + this.objs.sortStack(coord); + this.appendEvent(obj, new ZoneEvent(ZoneEventType_default.FOLLOWS, receiverId, new ObjCount(coord, obj.type, oldCount, newCount))); + } + removeObj(obj) { + const coord = Position.packZoneCoord(obj.x, obj.z); + if (obj.lifecycle === EntityLifeCycle_default.DESPAWN) { + this.objs.remove(coord, obj); + this.totalObjs--; + } + this.objs.sortStack(coord); + const exist = this.entityEvents.get(obj); + if (typeof exist !== "undefined") { + for (let index = 0; index < exist.length; index++) { + this.events.delete(exist[index]); + } + this.entityEvents.delete(obj); + } + if (obj.lastLifecycleTick !== World_default.currentTick) { + if (obj.lifecycle === EntityLifeCycle_default.RESPAWN || obj.receiverId === -1) { + this.appendEvent(obj, new ZoneEvent(ZoneEventType_default.ENCLOSED, -1, new ObjDel(coord, obj.type))); + } else if (obj.lifecycle === EntityLifeCycle_default.DESPAWN) { + this.appendEvent(obj, new ZoneEvent(ZoneEventType_default.FOLLOWS, -1, new ObjDel(coord, obj.type))); + } + } + } + // ---- not tied to any entities ---- + animMap(x, z, spotanim, height, delay) { + this.events.add({ + type: ZoneEventType_default.ENCLOSED, + receiverId: -1, + message: new MapAnim(Position.packZoneCoord(x, z), spotanim, height, delay) + }); + } + mapProjAnim(x, z, dstX, dstZ, target, spotanim, srcHeight, dstHeight, startDelay, endDelay, peak, arc) { + this.events.add({ + type: ZoneEventType_default.ENCLOSED, + receiverId: -1, + message: new MapProjAnim(x, z, dstX, dstZ, target, spotanim, srcHeight, dstHeight, startDelay, endDelay, peak, arc) + }); + } + getObj(x, z, type, receiverId) { + for (const obj of this.getObjsSafe(Position.packZoneCoord(x, z))) { + if (obj.receiverId !== -1 && obj.receiverId !== receiverId || obj.type !== type) { + continue; + } + return obj; + } + return null; + } + *getAllPlayersSafe() { + for (const uid of this.players) { + const player = World_default.getPlayerByUid(uid); + if (player && player.checkLifeCycle(World_default.currentTick)) { + yield player; + } + } + } + *getAllNpcsSafe() { + for (const nid of this.npcs) { + const npc = World_default.getNpc(nid); + if (npc && npc.checkLifeCycle(World_default.currentTick)) { + yield npc; + } + } + } + *getAllObjsSafe() { + for (const obj of this.objs.all()) { + if (obj.checkLifeCycle(World_default.currentTick)) { + yield obj; + } + } + } + *getObjsSafe(coord) { + for (const obj of this.objs.stack(coord)) { + if (obj.checkLifeCycle(World_default.currentTick)) { + yield obj; + } + } + } + *getObjsUnsafe(coord) { + yield* this.objs.stack(coord); + } + *getAllObjsUnsafe(reverse = false) { + yield* this.objs.all(reverse); + } + *getAllLocsSafe() { + for (const loc of this.locs.all()) { + if (loc.checkLifeCycle(World_default.currentTick)) { + yield loc; + } + } + } + *getLocsSafe(coord) { + for (const loc of this.locs.stack(coord)) { + if (loc.checkLifeCycle(World_default.currentTick)) { + yield loc; + } + } + } + *getLocsUnsafe(coord) { + yield* this.locs.stack(coord); + } + *getAllLocsUnsafe(reverse = false) { + yield* this.locs.all(reverse); + } +}; + +// src/lostcity/engine/zone/ZoneGrid.ts +var ZoneGrid = class _ZoneGrid { + static GRID_SIZE = 2048; + static INT_BITS = 5; + static INT_BITS_FLAG = (1 << this.INT_BITS) - 1; + static DEFAULT_GRID_SIZE = this.GRID_SIZE * (this.GRID_SIZE >> this.INT_BITS); + grid; + constructor(size = _ZoneGrid.DEFAULT_GRID_SIZE) { + this.grid = new Int32Array(size); + } + index(zoneX, zoneY) { + return zoneX << _ZoneGrid.INT_BITS | zoneY >>> _ZoneGrid.INT_BITS; + } + flag(zoneX, zoneY) { + this.grid[this.index(zoneX, zoneY)] |= 1 << (zoneY & _ZoneGrid.INT_BITS_FLAG); + } + unflag(zoneX, zoneY) { + this.grid[this.index(zoneX, zoneY)] &= ~(1 << (zoneY & _ZoneGrid.INT_BITS_FLAG)); + } + isFlagged(zoneX, zoneY, radius) { + const minX = Math.max(0, zoneX - radius); + const maxX = Math.min(_ZoneGrid.GRID_SIZE - 1, zoneX + radius); + const minY = Math.max(0, zoneY - radius); + const maxY = Math.min(_ZoneGrid.GRID_SIZE - 1, zoneY + radius); + const bits = _ZoneGrid.INT_BITS_FLAG; + const startY = minY & ~bits; + const endY = maxY >>> _ZoneGrid.INT_BITS << _ZoneGrid.INT_BITS; + for (let x = minX; x <= maxX; x++) { + for (let y = startY; y <= endY; y += 32) { + const index = this.index(x, y); + const line = this.grid[index]; + let trailingTrimmed = line; + if (y + bits > maxY) { + trailingTrimmed = line & (1 << maxY - y + 1) - 1; + } + let leadingTrimmed = trailingTrimmed; + if (y < minY) { + leadingTrimmed = trailingTrimmed >>> minY - y; + } + if (leadingTrimmed !== 0) { + return true; + } + } + } + return false; + } +}; + +// src/lostcity/engine/zone/ZoneMap.ts +var ZoneMap = class _ZoneMap { + static zoneIndex(x, z, level) { + return x >> 3 & 2047 | (z >> 3 & 2047) << 11 | (level & 3) << 22; + } + static unpackIndex(index) { + const x = (index & 2047) << 3; + const z = (index >> 11 & 2047) << 3; + const level = index >> 22; + return { x, z, level }; + } + zones; + grids; + constructor() { + this.zones = /* @__PURE__ */ new Map(); + this.grids = /* @__PURE__ */ new Map(); + } + zone(x, z, level) { + const zoneIndex = _ZoneMap.zoneIndex(x, z, level); + let zone = this.zones.get(zoneIndex); + if (typeof zone == "undefined") { + zone = new Zone(zoneIndex); + this.zones.set(zoneIndex, zone); + } + return zone; + } + zoneByIndex(index) { + let zone = this.zones.get(index); + if (typeof zone == "undefined") { + zone = new Zone(index); + this.zones.set(index, zone); + } + return zone; + } + grid(level) { + let grid = this.grids.get(level); + if (typeof grid == "undefined") { + grid = new ZoneGrid(); + this.grids.set(level, grid); + } + return grid; + } + zoneCount() { + return this.zones.size; + } + locCount() { + let total = 0; + for (const zone of this.zones.values()) { + total += zone.totalLocs; + } + return total; + } + objCount() { + let total = 0; + for (const zone of this.zones.values()) { + total += zone.totalObjs; + } + return total; + } +}; + +// src/lostcity/entity/BuildArea.ts +var BuildArea = class _BuildArea { + static INTERVAL = 10; + static PREFERRED_PLAYERS = 250; + static PREFERRED_NPCS = 255; + static PREFERRED_VIEW_DISTANCE = 15; + // constructor + npcs; + // observed npcs + players; + // observed players + loadedZones; + activeZones; + extendedInfo; + appearances; + // runtime + forceViewDistance = false; + viewDistance = _BuildArea.PREFERRED_VIEW_DISTANCE; + lastResize = 0; + constructor() { + this.npcs = /* @__PURE__ */ new Set(); + this.players = /* @__PURE__ */ new Set(); + this.loadedZones = /* @__PURE__ */ new Set(); + this.activeZones = /* @__PURE__ */ new Set(); + this.extendedInfo = /* @__PURE__ */ new Set(); + this.appearances = /* @__PURE__ */ new Map(); + } + resize() { + if (this.forceViewDistance) { + return; + } + if (this.players.size >= _BuildArea.PREFERRED_PLAYERS) { + if (this.viewDistance > 1) { + this.viewDistance--; + } + this.lastResize = 0; + return; + } + if (++this.lastResize >= _BuildArea.INTERVAL) { + if (this.viewDistance < _BuildArea.PREFERRED_VIEW_DISTANCE) { + this.viewDistance++; + } else { + this.lastResize = 0; + } + } + } + clearExtended() { + this.extendedInfo.clear(); + } + hasAppearance(pid, tick) { + const appearance = this.appearances.get(pid); + if (typeof appearance === "undefined") { + return false; + } + return appearance === tick; + } + saveAppearance(pid, tick) { + this.appearances.set(pid, tick); + } + *getNearbyPlayers(uid, x, z, originX, originZ) { + players: for (const zoneIndex of this.proximitySort(x, z, this.activeZones)) { + for (const other of this.getNearby(World_default.getZoneIndex(zoneIndex).getAllPlayersSafe(), x, z, originX, originZ, this.viewDistance)) { + if (this.players.size >= _BuildArea.PREFERRED_PLAYERS) { + break players; + } + if (this.players.has(other.uid)) { + continue; + } + if (other.uid === uid) { + continue; + } + yield other; + } + } + } + *getNearbyNpcs(x, z, originX, originZ) { + npcs: for (const zoneIndex of this.proximitySort(x, z, this.activeZones)) { + for (const npc of this.getNearby(World_default.getZoneIndex(zoneIndex).getAllNpcsSafe(), x, z, originX, originZ, 15)) { + if (this.npcs.size >= _BuildArea.PREFERRED_NPCS) { + break npcs; + } + if (this.npcs.has(npc.nid)) { + continue; + } + yield npc; + } + } + } + *getNearby(entities, x, z, originX, originZ, distance) { + const absLeftX = originX - 48; + const absRightX = originX + 48; + const absTopZ = originZ + 48; + const absBottomZ = originZ - 48; + for (const entity of entities) { + if (entity.x <= absLeftX || entity.x >= absRightX || entity.z >= absTopZ || entity.z <= absBottomZ) { + continue; + } + if (!Position.isWithinDistanceSW({ x, z }, entity, distance)) { + continue; + } + yield entity; + } + } + proximitySort(zoneX, zoneZ, zones) { + return Array.from(zones.values()).map((zoneIndex) => this.zoneToDistance(zoneIndex, zoneX, zoneZ)).sort((a, b) => a.distance - b.distance).map(({ zoneIndex }) => zoneIndex); + } + zoneToDistance(zoneIndex, zoneX, zoneZ) { + const pos = ZoneMap.unpackIndex(zoneIndex); + const distance = Math.abs(pos.x - zoneX) + Math.abs(pos.z - zoneZ); + return { zoneIndex, distance }; + } +}; + +// src/lostcity/entity/Player.ts +var levelExperience = new Int32Array(99); +var acc = 0; +for (let i = 0; i < 99; i++) { + const level = i + 1; + const delta = Math.floor(level + Math.pow(2, level / 7) * 300); + acc += delta; + levelExperience[i] = Math.floor(acc / 4) * 10; +} +function getLevelByExp(exp) { + for (let i = 98; i >= 0; i--) { + if (exp >= levelExperience[i]) { + return Math.min(i + 2, 99); + } + } + return 1; +} +function getExpByLevel(level) { + return levelExperience[level - 2]; +} +var Player = class _Player extends PathingEntity { + static APPEARANCE = 1; + static ANIM = 2; + static FACE_ENTITY = 4; + static SAY = 8; + static DAMAGE = 16; + static FACE_COORD = 32; + static CHAT = 64; + static BIG_UPDATE = 128; + static SPOTANIM = 256; + static EXACT_MOVE = 512; + static SKILLS = [ + "attack", + "defence", + "strength", + "hitpoints", + "ranged", + "prayer", + "magic", + "cooking", + "woodcutting", + "fletching", + "fishing", + "firemaking", + "crafting", + "smithing", + "mining", + "herblore", + "agility", + "thieving", + "stat18", + "stat19", + "runecraft" + ]; + static DESIGN_BODY_COLORS = [ + [6798, 107, 10283, 16, 4797, 7744, 5799, 4634, 33697, 22433, 2983, 54193], + [8741, 12, 64030, 43162, 7735, 8404, 1701, 38430, 24094, 10153, 56621, 4783, 1341, 16578, 35003, 25239], + [25238, 8742, 12, 64030, 43162, 7735, 8404, 1701, 38430, 24094, 10153, 56621, 4783, 1341, 16578, 35003], + [4626, 11146, 6439, 12, 4758, 10270], + [4550, 4537, 5681, 5673, 5790, 6806, 8076, 4574] + ]; + save() { + const sav = Packet.alloc(1); + sav.p2(8196); + sav.p2(3); + sav.p2(this.x); + sav.p2(this.z); + sav.p1(this.level); + for (let i = 0; i < 7; i++) { + sav.p1(this.body[i]); + } + for (let i = 0; i < 5; i++) { + sav.p1(this.colors[i]); + } + sav.p1(this.gender); + sav.p2(this.runenergy); + sav.p4(this.playtime); + for (let i = 0; i < 21; i++) { + sav.p4(this.stats[i]); + sav.p1(this.levels[i]); + } + sav.p2(this.vars.length); + for (let i = 0; i < this.vars.length; i++) { + const type = VarPlayerType.get(i); + if (type.scope === VarPlayerType.SCOPE_PERM) { + sav.p4(this.vars[i]); + } else { + sav.p4(0); + } + } + let invCount = 0; + const invStartPos = sav.pos; + sav.p1(0); + for (const [typeId, inventory] of this.invs) { + const invType = InvType.get(typeId); + if (invType.scope !== InvType.SCOPE_PERM) { + continue; + } + sav.p2(typeId); + for (let slot = 0; slot < inventory.capacity; slot++) { + const obj = inventory.get(slot); + if (!obj) { + sav.p2(0); + continue; + } + sav.p2(obj.id + 1); + if (obj.count >= 255) { + sav.p1(255); + sav.p4(obj.count); + } else { + sav.p1(obj.count); + } + } + invCount++; + } + sav.data[invStartPos] = invCount; + sav.p1(this.afkZones.length); + for (let index = 0; index < this.afkZones.length; index++) { + sav.p4(this.afkZones[index]); + } + sav.p2(this.lastAfkZone); + sav.p4(Packet.getcrc(sav.data, 0, sav.pos)); + const safeName = fromBase37(this.username37); + sav.save(`data/players/${safeName}.sav`); + return sav; + } + // constructor properties + username; + username37; + displayName; + body; + colors; + gender; + runenergy = 1e4; + lastRunEnergy = -1; + runweight; + playtime; + stats = new Int32Array(21); + levels = new Uint8Array(21); + vars; + varsString; + invs = /* @__PURE__ */ new Map(); + // runtime variables + pid = -1; + uid = -1; + lowMemory = false; + webClient = false; + combatLevel = 3; + headicons = 0; + appearance = null; + // cached appearance + lastAppearance = 0; + baseLevels = new Uint8Array(21); + lastStats = new Int32Array(21); + // we track this so we know to flush stats only once a tick on changes + lastLevels = new Uint8Array(21); + // we track this so we know to flush stats only once a tick on changes + originX = -1; + originZ = -1; + buildArea = new BuildArea(); + lastMovement = 0; + // for p_arrivedelay + basReadyAnim = -1; + basTurnOnSpot = -1; + basWalkForward = -1; + basWalkBackward = -1; + basWalkLeft = -1; + basWalkRight = -1; + basRunning = -1; + animProtect = 0; + logoutRequested = false; + invListeners = []; + allowDesign = false; + afkEventReady = false; + interactWalkTrigger = false; + highPriorityOut = new Stack(); + lowPriorityOut = new Stack(); + lastResponse = -1; + messageColor = null; + messageEffect = null; + messageType = null; + message = null; + // --- + // script variables + delay = 0; + queue = new LinkList(); + weakQueue = new LinkList(); + engineQueue = new LinkList(); + cameraPackets = new LinkList(); + timers = /* @__PURE__ */ new Map(); + modalState = 0; + modalTop = -1; + lastModalTop = -1; + modalBottom = -1; + lastModalBottom = -1; + modalSidebar = -1; + lastModalSidebar = -1; + refreshModalClose = false; + refreshModal = false; + modalSticky = -1; + overlaySide = new Array(14).fill(-1); + receivedFirstClose = true; + // workaround to not close welcome screen on login + protect = false; + // whether protected access is available + activeScript = null; + resumeButtons = []; + lastItem = -1; + // opheld, opheldu, opheldt, inv_button + lastSlot = -1; + // opheld, opheldu, opheldt, inv_button, inv_buttond + lastUseItem = -1; + // opheldu, opobju, oplocu, opnpcu, opplayeru + lastUseSlot = -1; + // opheldu, opobju, oplocu, opnpcu, opplayeru + lastTargetSlot = -1; + // inv_buttond + lastCom = -1; + // if_button + staffModLevel = 0; + heroPoints = new Array(16); + // be sure to reset when stats are recovered/reset + afkZones = new Int32Array(2); + lastAfkZone = 0; + // movement triggers + lastMapZone = -1; + lastZone = -1; + constructor(username, username37) { + super(0, 3094, 3106, 1, 1, EntityLifeCycle_default.FOREVER, MoveRestrict_default.NORMAL, BlockWalk_default.NPC, MoveStrategy_default.SMART, _Player.FACE_COORD, _Player.FACE_ENTITY); + this.username = username; + this.username37 = username37; + this.displayName = toDisplayName(username); + this.vars = new Int32Array(VarPlayerType.count); + this.varsString = new Array(VarPlayerType.count); + this.body = [ + 0, + // hair + 10, + // beard + 18, + // body + 26, + // arms + 33, + // gloves + 36, + // legs + 42 + // boots + ]; + this.colors = [0, 0, 0, 0, 0]; + this.gender = 0; + this.runenergy = 1e4; + this.runweight = 0; + this.playtime = 0; + this.lastStats.fill(-1); + this.lastLevels.fill(-1); + } + resetHeroPoints() { + this.heroPoints = new Array(16); + this.heroPoints.fill({ uid: -1, points: 0 }); + } + addHero(uid, points) { + const index = this.heroPoints.findIndex((hero) => hero && hero.uid === uid); + if (index !== -1) { + this.heroPoints[index].points += points; + return; + } + const emptyIndex = this.heroPoints.findIndex((hero) => hero && hero.uid === -1); + if (emptyIndex !== -1) { + this.heroPoints[emptyIndex] = { uid, points }; + return; + } + } + findHero() { + this.heroPoints.sort((a, b) => { + return b.points - a.points; + }); + return this.heroPoints[0]?.uid ?? -1; + } + resetEntity(respawn) { + if (respawn) { + this.faceX = -1; + this.faceZ = -1; + this.orientationX = -1; + this.orientationZ = -1; + } + super.resetPathingEntity(); + this.repathed = false; + this.protect = false; + this.messageColor = null; + this.messageEffect = null; + this.messageType = null; + this.message = null; + } + // ---- + onLogin() { + this.playerLog("Logging in"); + this.write(new IfClose()); + this.write(new UpdateUid192(this.pid)); + this.unsetMapFlag(); + this.write(new ResetAnims()); + this.resetHeroPoints(); + this.write(new ResetClientVarCache()); + for (let varp = 0; varp < this.vars.length; varp++) { + const type = VarPlayerType.get(varp); + const value = this.vars[varp]; + if (type.transmit) { + this.writeVarp(varp, value); + } + } + const loginTrigger = ScriptProvider.getByTriggerSpecific(ServerTriggerType_default.LOGIN, -1, -1); + if (loginTrigger) { + this.executeScript(ScriptRunner.init(loginTrigger, this), true); + } + this.lastStepX = this.x - 1; + this.lastStepZ = this.z; + } + triggerMapzone(x, z) { + const trigger = ScriptProvider.getByName(`[mapzone,0_${x >> 6}_${z >> 6}]`); + if (trigger) { + this.enqueueScript(trigger, 1 /* ENGINE */); + } + } + triggerMapzoneExit(x, z) { + const trigger = ScriptProvider.getByName(`[mapzoneexit,0_${x >> 6}_${z >> 6}]`); + if (trigger) { + this.enqueueScript(trigger, 1 /* ENGINE */); + } + } + triggerZone(level, x, z) { + const mx = x >> 6; + const mz = z >> 6; + const lx = (x & 63) >> 3 << 3; + const lz = (z & 63) >> 3 << 3; + const trigger = ScriptProvider.getByName(`[zone,${level}_${mx}_${mz}_${lx}_${lz}]`); + if (trigger) { + this.enqueueScript(trigger, 1 /* ENGINE */); + } + } + triggerZoneExit(level, x, z) { + const mx = x >> 6; + const mz = z >> 6; + const lx = (x & 63) >> 3 << 3; + const lz = (z & 63) >> 3 << 3; + const trigger = ScriptProvider.getByName(`[zoneexit,${level}_${mx}_${mz}_${lx}_${lz}]`); + if (trigger) { + this.enqueueScript(trigger, 1 /* ENGINE */); + } + } + calculateRunWeight() { + this.runweight = 0; + const invs = this.invs.values(); + for (let i = 0; i < this.invs.size; i++) { + const inv = invs.next().value; + if (!inv) { + continue; + } + const invType = InvType.get(inv.type); + if (!invType || !invType.runweight) { + continue; + } + for (let slot = 0; slot < inv.capacity; slot++) { + const item = inv.get(slot); + if (!item) { + continue; + } + const type = ObjType.get(item.id); + if (!type || type.stackable) { + continue; + } + this.runweight += type.weight * item.count; + } + } + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + playerLog(message, ...args) { + } + processEngineQueue() { + for (let request = this.engineQueue.head(); request !== null; request = this.engineQueue.next()) { + const delay = request.delay--; + if (this.canAccess() && delay <= 0) { + const script = ScriptRunner.init(request.script, this, null, request.args); + this.executeScript(script, true); + request.unlink(); + } + } + } + // ---- + updateMovement(repathAllowed = true) { + if (this.containsModalInterface()) { + this.recoverEnergy(false); + return false; + } + if (repathAllowed && this.target instanceof PathingEntity && !this.interacted && this.walktrigger === -1) { + this.pathToPathingTarget(); + } + if (this.hasWaypoints() && this.walktrigger !== -1 && (!this.protect && !this.delayed())) { + const trigger = ScriptProvider.get(this.walktrigger); + this.walktrigger = -1; + if (trigger) { + const script = ScriptRunner.init(trigger, this); + this.runScript(script, true); + } + } + if (this.moveSpeed !== MoveSpeed_default.INSTANT) { + this.moveSpeed = this.defaultMoveSpeed(); + if (this.basRunning === -1) { + this.moveSpeed = MoveSpeed_default.WALK; + } else if (this.getVar(VarPlayerType.TEMP_RUN)) { + this.moveSpeed = MoveSpeed_default.RUN; + } + } + if (!super.processMovement()) { + this.setVar(VarPlayerType.TEMP_RUN, 0); + } + const moved = this.lastX !== this.x || this.lastZ !== this.z; + this.drainEnergy(moved); + this.recoverEnergy(moved); + if (this.runenergy === 0) { + this.setVar(VarPlayerType.PLAYER_RUN, 0); + this.setVar(VarPlayerType.TEMP_RUN, 0); + } + return moved; + } + drainEnergy(moved) { + if (!moved || this.stepsTaken === 0) { + return; + } + if (!this.delayed() && this.moveSpeed === MoveSpeed_default.RUN && this.stepsTaken > 1) { + const weightKg = Math.floor(this.runweight / 1e3); + const clampWeight = Math.min(Math.max(weightKg, 0), 64); + const loss = 67 + 67 * clampWeight / 64 | 0; + this.runenergy = Math.max(this.runenergy - loss, 0); + } + } + recoverEnergy(moved) { + if (!this.delayed() && (!moved || this.moveSpeed !== MoveSpeed_default.RUN) && this.runenergy < 1e4) { + const recovered = (this.baseLevels[PlayerStat_default.AGILITY] / 9 | 0) + 8; + this.runenergy = Math.min(this.runenergy + recovered, 1e4); + } + } + blockWalkFlag() { + return CollisionFlag.PLAYER; + } + defaultMoveSpeed() { + return this.getVar(VarPlayerType.PLAYER_RUN) ? MoveSpeed_default.RUN : MoveSpeed_default.WALK; + } + // ---- + closeSticky() { + if (this.modalSticky !== -1) { + const closeTrigger = ScriptProvider.getByTrigger(ServerTriggerType_default.IF_CLOSE, this.modalSticky); + if (closeTrigger) { + this.enqueueScript(closeTrigger, 1 /* ENGINE */); + } + this.modalSticky = -1; + this.write(new TutorialOpenChat(-1)); + } + } + closeModal() { + if (!this.receivedFirstClose) { + this.receivedFirstClose = true; + return; + } + this.weakQueue.clear(); + if (!this.delayed()) { + this.protect = false; + } + if (this.modalState === 0) { + return; + } + if (this.modalTop !== -1) { + const closeTrigger = ScriptProvider.getByTrigger(ServerTriggerType_default.IF_CLOSE, this.modalTop); + if (closeTrigger) { + this.enqueueScript(closeTrigger, 1 /* ENGINE */); + } + this.modalTop = -1; + } + if (this.modalBottom !== -1) { + const closeTrigger = ScriptProvider.getByTrigger(ServerTriggerType_default.IF_CLOSE, this.modalBottom); + if (closeTrigger) { + this.enqueueScript(closeTrigger, 1 /* ENGINE */); + } + this.modalBottom = -1; + } + if (this.modalSidebar !== -1) { + const closeTrigger = ScriptProvider.getByTrigger(ServerTriggerType_default.IF_CLOSE, this.modalSidebar); + if (closeTrigger) { + this.enqueueScript(closeTrigger, 1 /* ENGINE */); + } + this.modalSidebar = -1; + } + this.modalState = 0; + this.refreshModalClose = true; + } + delayed() { + return this.delay > 0; + } + containsModalInterface() { + return (this.modalState & 1) === 1 || (this.modalState & 2) === 2 || (this.modalState & 16) === 16; + } + busy() { + return this.delayed() || this.containsModalInterface(); + } + canAccess() { + return !this.protect && !this.busy(); + } + /** + * + * @param script + * @param {QueueType} type + * @param delay + * @param args + */ + enqueueScript(script, type = 0 /* NORMAL */, delay = 0, args = []) { + const request = new EntityQueueRequest(type, script, args, delay); + if (type === 1 /* ENGINE */) { + request.delay = 0; + this.engineQueue.addTail(request); + } else if (type === 2 /* WEAK */) { + this.weakQueue.addTail(request); + } else { + this.queue.addTail(request); + } + } + processQueues() { + let hasStrong = false; + for (let request = this.queue.head(); request !== null; request = this.queue.next()) { + if (request.type === 3 /* STRONG */) { + hasStrong = true; + break; + } + } + if (hasStrong) { + this.closeModal(); + } + this.processQueue(); + this.processWeakQueue(); + } + processQueue() { + for (let request = this.queue.head(); request !== null; request = this.queue.next()) { + if (request.type === 3 /* STRONG */) { + this.closeModal(); + } + const delay = request.delay--; + if (this.canAccess() && delay <= 0) { + const script = ScriptRunner.init(request.script, this, null, request.args); + this.executeScript(script, true); + request.unlink(); + } + } + } + processWeakQueue() { + for (let request = this.weakQueue.head(); request !== null; request = this.weakQueue.next()) { + const delay = request.delay--; + if (this.canAccess() && delay <= 0) { + const script = ScriptRunner.init(request.script, this, null, request.args); + this.executeScript(script, true); + request.unlink(); + } + } + } + setTimer(type, script, args = [], interval) { + const timerId = script.id; + const timer = { + type, + script, + args, + interval, + clock: interval + }; + this.timers.set(timerId, timer); + } + clearTimer(timerId) { + this.timers.delete(timerId); + } + processTimers(type) { + for (const timer of this.timers.values()) { + if (type !== timer.type) { + continue; + } + if (--timer.clock <= 0 && (timer.type === 1 /* SOFT */ || this.canAccess())) { + timer.clock = timer.interval; + const script = ScriptRunner.init(timer.script, this, null, timer.args); + this.runScript(script, timer.type === 0 /* NORMAL */); + } + } + } + // clear current interaction and walk queue + stopAction() { + this.clearPendingAction(); + this.unsetMapFlag(); + } + // clear current interaction but leave walk queue intact + clearPendingAction() { + this.clearInteraction(); + this.closeModal(); + } + hasInteraction() { + return this.target !== null; + } + getOpTrigger() { + if (!this.target) { + return null; + } + let typeId = -1; + let categoryId = -1; + if (this.target instanceof Npc || this.target instanceof Loc || this.target instanceof Obj) { + const type = this.target instanceof Npc ? NpcType.get(this.target.type) : this.target instanceof Loc ? LocType.get(this.target.type) : ObjType.get(this.target.type); + typeId = type.id; + categoryId = type.category; + } + if (this.targetSubject.type !== -1) { + typeId = this.targetSubject.type; + } + if (this.targetSubject.com !== -1) { + typeId = this.targetSubject.com; + } + return ScriptProvider.getByTrigger(this.targetOp + 7, typeId, categoryId) ?? null; + } + getApTrigger() { + if (!this.target) { + return null; + } + let typeId = -1; + let categoryId = -1; + if (this.target instanceof Npc || this.target instanceof Loc || this.target instanceof Obj) { + const type = this.target instanceof Npc ? NpcType.get(this.target.type) : this.target instanceof Loc ? LocType.get(this.target.type) : ObjType.get(this.target.type); + typeId = type.id; + categoryId = type.category; + } + if (this.targetSubject.type !== -1) { + typeId = this.targetSubject.type; + } + if (this.targetSubject.com !== -1) { + typeId = this.targetSubject.com; + } + return ScriptProvider.getByTrigger(this.targetOp, typeId, categoryId) ?? null; + } + processInteraction() { + if (this.target === null || !this.canAccess()) { + this.updateMovement(); + return; + } + if (this.target.level !== this.level) { + this.clearInteraction(); + this.unsetMapFlag(); + return; + } + if (this.target instanceof Npc && (typeof World_default.getNpc(this.target.nid) === "undefined" || this.target.delayed())) { + this.clearInteraction(); + this.unsetMapFlag(); + return; + } + if (this.target instanceof Npc && this.targetSubject.type !== -1 && World_default.getNpcByUid(this.targetSubject.type << 16 | this.target.nid) === null) { + this.clearInteraction(); + this.unsetMapFlag(); + return; + } + if (this.target instanceof Obj && World_default.getObj(this.target.x, this.target.z, this.level, this.target.type, this.pid) === null) { + this.clearInteraction(); + this.unsetMapFlag(); + return; + } + if (this.target instanceof Loc && World_default.getLoc(this.target.x, this.target.z, this.level, this.target.type) === null) { + this.clearInteraction(); + this.unsetMapFlag(); + return; + } + if (this.target instanceof _Player && World_default.getPlayerByUid(this.target.uid) === null) { + this.clearInteraction(); + this.unsetMapFlag(); + return; + } + if (this.targetOp === ServerTriggerType_default.APPLAYER3 || this.targetOp === ServerTriggerType_default.OPPLAYER3) { + const moved2 = this.updateMovement(false); + if (moved2) { + this.alreadyFacedEntity = false; + this.lastMovement = World_default.currentTick + 1; + } + return; + } + const opTrigger = this.getOpTrigger(); + const apTrigger = this.getApTrigger(); + if (opTrigger && this.target instanceof PathingEntity && this.inOperableDistance(this.target)) { + const target = this.target; + this.target = null; + this.executeScript(ScriptRunner.init(opTrigger, this, target), true); + if (this.target === null) { + this.unsetMapFlag(); + } + this.interacted = true; + this.clearWaypoints(); + } else if (apTrigger && this.inApproachDistance(this.apRange, this.target)) { + const target = this.target; + this.target = null; + this.executeScript(ScriptRunner.init(apTrigger, this, target), true); + if (this.apRangeCalled) { + this.target = target; + } else { + this.clearWaypoints(); + this.interacted = true; + } + if (this.target === null) { + this.unsetMapFlag(); + } + } else if (this.target instanceof PathingEntity && this.inOperableDistance(this.target)) { + if (Environment_default.NODE_DEBUG && !opTrigger && !apTrigger) { + let debugname = "_"; + if (this.target instanceof Npc) { + if (this.targetSubject.com !== -1 && this.targetOp === ServerTriggerType_default.APNPCT || this.targetOp === ServerTriggerType_default.OPNPCT) { + debugname = Component.get(this.targetSubject.com)?.comName ?? this.targetSubject.toString(); + } else { + debugname = NpcType.get(this.target.type)?.debugname ?? this.target.type.toString(); + } + } else if (this.target instanceof Loc) { + debugname = LocType.get(this.target.type)?.debugname ?? this.target.type.toString(); + } else if (this.target instanceof Obj) { + debugname = ObjType.get(this.target.type)?.debugname ?? this.target.type.toString(); + } else if (this.targetSubject.com !== -1 && this.targetOp === ServerTriggerType_default.APNPCT || this.targetOp === ServerTriggerType_default.APPLAYERT || this.targetOp === ServerTriggerType_default.APLOCT || this.targetOp === ServerTriggerType_default.APOBJT) { + debugname = Component.get(this.targetSubject.com)?.comName ?? this.targetSubject.toString(); + } else if (this.targetSubject.type !== -1) { + debugname = ObjType.get(this.targetSubject.type)?.debugname ?? this.targetSubject.toString(); + } + this.messageGame(`No trigger for [${ServerTriggerType_default[this.targetOp + 7].toLowerCase()},${debugname}]`); + } + this.target = null; + this.messageGame("Nothing interesting happens."); + this.interacted = true; + this.clearWaypoints(); + } + const moved = this.updateMovement(); + if (moved) { + this.alreadyFacedEntity = false; + this.lastMovement = World_default.currentTick + 1; + } + if (this.target && (!this.interacted || this.apRangeCalled)) { + this.interacted = false; + if (opTrigger && (this.target instanceof PathingEntity || !moved) && this.inOperableDistance(this.target)) { + const target = this.target; + this.target = null; + this.executeScript(ScriptRunner.init(opTrigger, this, target), true); + if (this.target === null) { + this.unsetMapFlag(); + } + this.interacted = true; + this.clearWaypoints(); + } else if (apTrigger && this.inApproachDistance(this.apRange, this.target)) { + this.apRangeCalled = false; + const target = this.target; + this.target = null; + this.executeScript(ScriptRunner.init(apTrigger, this, target), true); + if (this.apRangeCalled) { + this.target = target; + } else { + this.clearWaypoints(); + this.interacted = true; + } + if (this.target === null) { + this.unsetMapFlag(); + } + } else if ((this.target instanceof PathingEntity || !moved) && this.inOperableDistance(this.target)) { + if (!Environment_default.NODE_PRODUCTION && !opTrigger && !apTrigger) { + let debugname = "_"; + if (this.target instanceof Npc) { + debugname = NpcType.get(this.target.type)?.debugname ?? this.target.type.toString(); + } else if (this.target instanceof Loc) { + debugname = LocType.get(this.target.type)?.debugname ?? this.target.type.toString(); + } else if (this.target instanceof Obj) { + debugname = ObjType.get(this.target.type)?.debugname ?? this.target.type.toString(); + } else if (this.targetSubject.com !== -1 && this.targetOp === ServerTriggerType_default.APNPCT || this.targetOp === ServerTriggerType_default.APPLAYERT || this.targetOp === ServerTriggerType_default.APLOCT || this.targetOp === ServerTriggerType_default.APOBJT) { + debugname = Component.get(this.targetSubject.com)?.comName ?? this.targetSubject.toString(); + } else if (this.targetSubject.type !== -1) { + debugname = ObjType.get(this.targetSubject.type)?.debugname ?? this.targetSubject.toString(); + } + this.messageGame(`No trigger for [${ServerTriggerType_default[this.targetOp + 7].toLowerCase()},${debugname}]`); + } + this.target = null; + this.messageGame("Nothing interesting happens."); + this.interacted = true; + this.clearWaypoints(); + } + } + if (!this.interactWalkTrigger && this.walktrigger !== -1 && (!this.protect && !this.delayed())) { + const trigger = ScriptProvider.get(this.walktrigger); + this.walktrigger = -1; + if (trigger) { + const script = ScriptRunner.init(trigger, this); + this.interactWalkTrigger = true; + this.unsetMapFlag(); + this.runScript(script, true); + } + } + if (!this.interacted && !this.hasWaypoints() && !moved) { + this.messageGame("I can't reach that!"); + this.clearInteraction(); + } + if (this.interacted && !this.apRangeCalled && this.target === null) { + this.clearInteraction(); + } + } + // ---- + getAppearanceInSlot(slot) { + let part = -1; + if (slot === 8) { + part = this.body[0]; + } else if (slot === 11) { + part = this.body[1]; + } else if (slot === 4) { + part = this.body[2]; + } else if (slot === 6) { + part = this.body[3]; + } else if (slot === 9) { + part = this.body[4]; + } else if (slot === 7) { + part = this.body[5]; + } else if (slot === 10) { + part = this.body[6]; + } + if (part === -1) { + return 0; + } else { + return 256 + part; + } + } + getCombatLevel() { + const base = 0.25 * (this.baseLevels[PlayerStat_default.DEFENCE] + this.baseLevels[PlayerStat_default.HITPOINTS] + Math.floor(this.baseLevels[PlayerStat_default.PRAYER] / 2)); + const melee = 0.325 * (this.baseLevels[PlayerStat_default.ATTACK] + this.baseLevels[PlayerStat_default.STRENGTH]); + const range = 0.325 * (Math.floor(this.baseLevels[PlayerStat_default.RANGED] / 2) + this.baseLevels[PlayerStat_default.RANGED]); + const magic = 0.325 * (Math.floor(this.baseLevels[PlayerStat_default.MAGIC] / 2) + this.baseLevels[PlayerStat_default.MAGIC]); + return Math.floor(base + Math.max(melee, range, magic)); + } + generateAppearance(inv) { + const stream = Packet.alloc(0); + stream.p1(this.gender); + stream.p1(this.headicons); + const skippedSlots = []; + let worn = this.getInventory(inv); + if (!worn) { + worn = new Inventory(InvType.WORN, 0); + } + for (let i = 0; i < worn.capacity; i++) { + const equip = worn.get(i); + if (!equip) { + continue; + } + const config = ObjType.get(equip.id); + if (config.wearpos2 !== -1) { + if (skippedSlots.indexOf(config.wearpos2) === -1) { + skippedSlots.push(config.wearpos2); + } + } + if (config.wearpos3 !== -1) { + if (skippedSlots.indexOf(config.wearpos3) === -1) { + skippedSlots.push(config.wearpos3); + } + } + } + for (let slot = 0; slot < 12; slot++) { + if (skippedSlots.indexOf(slot) !== -1) { + stream.p1(0); + continue; + } + const equip = worn.get(slot); + if (!equip) { + const appearanceValue = this.getAppearanceInSlot(slot); + if (appearanceValue < 1) { + stream.p1(0); + } else { + stream.p2(appearanceValue); + } + } else { + stream.p2(512 + equip.id); + } + } + for (let i = 0; i < this.colors.length; i++) { + stream.p1(this.colors[i]); + } + stream.p2(this.basReadyAnim); + stream.p2(this.basTurnOnSpot); + stream.p2(this.basWalkForward); + stream.p2(this.basWalkBackward); + stream.p2(this.basWalkLeft); + stream.p2(this.basWalkRight); + stream.p2(this.basRunning); + stream.p8(this.username37); + stream.p1(this.combatLevel); + this.mask |= _Player.APPEARANCE; + this.appearance = new Uint8Array(stream.pos); + stream.pos = 0; + stream.gdata(this.appearance, 0, this.appearance.length); + stream.release(); + this.lastAppearance = World_default.currentTick; + } + // ---- + getInventoryFromListener(listener) { + if (listener.source === -1) { + return World_default.getInventory(listener.type); + } else { + const player = World_default.getPlayerByUid(listener.source); + if (!player) { + return null; + } + return player.getInventory(listener.type); + } + } + getInventory(inv) { + if (inv === -1) { + return null; + } + const invType = InvType.get(inv); + let container = null; + if (!invType) { + return null; + } + if (invType.scope === InvType.SCOPE_SHARED) { + container = World_default.getInventory(inv); + } else { + container = this.invs.get(inv); + if (!container) { + container = Inventory.fromType(inv); + this.invs.set(inv, container); + } + } + return container; + } + invListenOnCom(inv, com, source) { + if (inv === -1) { + return; + } + const index = this.invListeners.findIndex((l) => l.type === inv && l.com === com); + if (index !== -1) { + return; + } + const invType = InvType.get(inv); + if (invType.scope === InvType.SCOPE_SHARED) { + source = -1; + } + this.invListeners.push({ type: inv, com, source, firstSeen: true }); + } + invStopListenOnCom(com) { + const index = this.invListeners.findIndex((l) => l.com === com); + if (index === -1) { + return; + } + this.invListeners.splice(index, 1); + this.write(new UpdateInvStopTransmit(com)); + } + invGetSlot(inv, slot) { + const container = this.getInventory(inv); + if (!container) { + throw new Error("invGetSlot: Invalid inventory type: " + inv); + } + if (!container.validSlot(slot)) { + throw new Error("invGetSlot: Invalid slot: " + slot); + } + return container.get(slot); + } + invClear(inv) { + const container = this.getInventory(inv); + if (!container) { + throw new Error("invClear: Invalid inventory type: " + inv); + } + container.removeAll(); + } + invAdd(inv, obj, count, assureFullInsertion = true) { + const container = this.getInventory(inv); + if (!container) { + throw new Error("invAdd: Invalid inventory type: " + inv); + } + const transaction = container.add(obj, count, -1, assureFullInsertion); + return transaction.completed; + } + invSet(inv, obj, count, slot) { + const container = this.getInventory(inv); + if (!container) { + throw new Error("invSet: Invalid inventory type: " + inv); + } + if (!container.validSlot(slot)) { + throw new Error("invSet: Invalid slot: " + slot); + } + container.set(slot, { id: obj, count }); + } + invDel(inv, obj, count, beginSlot = -1) { + const container = this.getInventory(inv); + if (!container) { + throw new Error("invDel: Invalid inventory type: " + inv); + } + if (beginSlot < -1 || beginSlot >= this.invSize(inv)) { + throw new Error("invDel: Invalid beginSlot: " + beginSlot); + } + const transaction = container.remove(obj, count, beginSlot); + return transaction.completed; + } + invDelSlot(inv, slot) { + const container = this.getInventory(inv); + if (!container) { + throw new Error("invDelSlot: Invalid inventory type: " + inv); + } + if (!container.validSlot(slot)) { + throw new Error("invDelSlot: Invalid slot: " + slot); + } + container.delete(slot); + } + invSize(inv) { + const container = this.getInventory(inv); + if (!container) { + throw new Error("invSize: Invalid inventory type: " + inv); + } + return container.capacity; + } + invTotal(inv, obj) { + const container = this.getInventory(inv); + if (!container) { + throw new Error("invTotal: Invalid inventory type: " + inv); + } + return container.getItemCount(obj); + } + invFreeSpace(inv) { + const container = this.getInventory(inv); + if (!container) { + throw new Error("invFreeSpace: Invalid inventory type: " + inv); + } + return container.freeSlotCount; + } + invItemSpace(inv, obj, count, size) { + const container = this.getInventory(inv); + if (!container) { + throw new Error("invItemSpace: Invalid inventory type: " + inv); + } + const objType = ObjType.get(obj); + let uncert = obj; + if (objType.certtemplate >= 0 && objType.certlink >= 0) { + uncert = objType.certlink; + } + if (objType.stackable || uncert != obj || container.stackType == Inventory.ALWAYS_STACK) { + const stockObj = InvType.get(inv).stockobj?.includes(obj) === true; + if (this.invTotal(inv, obj) == 0 && this.invFreeSpace(inv) == 0 && !stockObj) { + return count; + } + return Math.max(0, count - (Inventory.STACK_LIMIT - this.invTotal(inv, obj))); + } + return Math.max(0, count - (this.invFreeSpace(inv) - (this.invSize(inv) - size))); + } + invMoveToSlot(fromInv, toInv, fromSlot, toSlot) { + const from = this.getInventory(fromInv); + if (!from) { + throw new Error("invMoveToSlot: Invalid inventory type: " + fromInv); + } + if (!from.validSlot(fromSlot)) { + throw new Error("invMoveToSlot: Invalid from slot: " + fromSlot); + } + const to = this.getInventory(toInv); + if (!to) { + throw new Error("invMoveToSlot: Invalid inventory type: " + toInv); + } + if (!to.validSlot(toSlot)) { + throw new Error("invMoveToSlot: Invalid to slot: " + toSlot); + } + const fromObj = this.invGetSlot(fromInv, fromSlot); + if (!fromObj) { + throw new Error(`invMoveToSlot: Invalid from obj was null. This means the obj does not exist at this slot: ${fromSlot}`); + } + const toObj = this.invGetSlot(toInv, toSlot); + this.invSet(toInv, fromObj.id, fromObj.count, toSlot); + if (toObj) { + this.invSet(fromInv, toObj.id, toObj.count, fromSlot); + } else { + this.invDelSlot(fromInv, fromSlot); + } + } + invMoveFromSlot(fromInv, toInv, fromSlot) { + const from = this.getInventory(fromInv); + if (!from) { + throw new Error("invMoveFromSlot: Invalid inventory type: " + fromInv); + } + const to = this.getInventory(toInv); + if (!to) { + throw new Error("invMoveFromSlot: Invalid inventory type: " + toInv); + } + if (!from.validSlot(fromSlot)) { + throw new Error("invMoveFromSlot: Invalid from slot: " + fromSlot); + } + const fromObj = this.invGetSlot(fromInv, fromSlot); + if (!fromObj) { + throw new Error(`invMoveFromSlot: Invalid from obj was null. This means the obj does not exist at this slot: ${fromSlot}`); + } + this.invDelSlot(fromInv, fromSlot); + return { + overflow: fromObj.count - this.invAdd(toInv, fromObj.id, fromObj.count, false), + fromObj: fromObj.id + }; + } + invTotalCat(inv, category) { + const container = this.getInventory(inv); + if (!container) { + throw new Error("invTotalCat: Invalid inventory type: " + inv); + } + return container.itemsFiltered.filter((obj) => ObjType.get(obj.id).category == category).reduce((count, obj) => count + obj.count, 0); + } + _invTotalParam(inv, param, stack) { + const container = this.getInventory(inv); + if (!container) { + throw new Error("invTotalParam: Invalid inventory type: " + inv); + } + const paramType = ParamType.get(param); + let total = 0; + for (let slot = 0; slot < container.capacity; slot++) { + const item = container.items[slot]; + if (!item || item.id < 0 || item.id >= ObjType.count) { + continue; + } + const obj = ObjType.get(item.id); + const value = ParamHelper.getIntParam(paramType.id, obj, paramType.defaultInt); + if (stack) { + total += item.count * value; + } else { + total += value; + } + } + return total; + } + invTotalParam(inv, param) { + return this._invTotalParam(inv, param, false); + } + invTotalParamStack(inv, param) { + return this._invTotalParam(inv, param, true); + } + // ---- + getVar(id) { + const varp = VarPlayerType.get(id); + return varp.type === ScriptVarType.STRING ? this.varsString[varp.id] : this.vars[varp.id]; + } + setVar(id, value) { + const varp = VarPlayerType.get(id); + if (varp.type === ScriptVarType.STRING && typeof value === "string") { + this.varsString[varp.id] = value; + } else if (typeof value === "number") { + this.vars[varp.id] = value; + if (varp.transmit) { + this.writeVarp(id, value); + } + } + } + writeVarp(id, value) { + if (value >= -128 && value <= 127) { + this.write(new VarpSmall(id, value)); + } else { + this.write(new VarpLarge(id, value)); + } + } + addXp(stat, xp) { + if (xp < 0) { + throw new Error(`Invalid xp parameter for addXp call: Stat was: ${stat}, Exp was: ${xp}`); + } + if (xp == 0) { + return; + } + const multi = Number(Environment_default.NODE_XPRATE) || 1; + this.stats[stat] += xp * multi; + if (this.stats[stat] > 2e9) { + this.stats[stat] = 2e9; + } + const before = this.baseLevels[stat]; + if (this.levels[stat] === this.baseLevels[stat]) { + this.levels[stat] = getLevelByExp(this.stats[stat]); + } + this.baseLevels[stat] = getLevelByExp(this.stats[stat]); + if (this.baseLevels[stat] > before) { + if (this.levels[stat] < before) { + this.levels[stat] += 1; + } + const script = ScriptProvider.getByTriggerSpecific(ServerTriggerType_default.ADVANCESTAT, stat, -1); + if (script) { + this.enqueueScript(script, 1 /* ENGINE */); + } + } + if (this.combatLevel != this.getCombatLevel()) { + this.combatLevel = this.getCombatLevel(); + this.generateAppearance(InvType.WORN); + } + } + setLevel(stat, level) { + level = Math.min(99, Math.max(1, level)); + this.baseLevels[stat] = level; + this.levels[stat] = level; + this.stats[stat] = getExpByLevel(level); + if (this.getCombatLevel() != this.combatLevel) { + this.combatLevel = this.getCombatLevel(); + this.generateAppearance(InvType.WORN); + } + } + playAnimation(anim, delay) { + if (anim >= SeqType.count || this.animProtect) { + return; + } + if (anim == -1 || this.animId == -1 || SeqType.get(anim).priority > SeqType.get(this.animId).priority || SeqType.get(this.animId).priority === 0) { + this.animId = anim; + this.animDelay = delay; + this.mask |= _Player.ANIM; + } + } + spotanim(spotanim, height, delay) { + this.graphicId = spotanim; + this.graphicHeight = height; + this.graphicDelay = delay; + this.mask |= _Player.SPOTANIM; + } + applyDamage(damage, type) { + this.damageTaken = damage; + this.damageType = type; + const current = this.levels[PlayerStat_default.HITPOINTS]; + if (current - damage <= 0) { + this.levels[PlayerStat_default.HITPOINTS] = 0; + this.damageTaken = current; + } else { + this.levels[PlayerStat_default.HITPOINTS] = current - damage; + } + this.mask |= _Player.DAMAGE; + } + say(message) { + this.chat = message; + this.mask |= _Player.SAY; + } + faceSquare(x, z) { + this.faceX = x * 2 + 1; + this.faceZ = z * 2 + 1; + this.orientationX = this.faceX; + this.orientationZ = this.faceZ; + this.mask |= _Player.FACE_COORD; + } + playSong(name) { + name = name.toLowerCase().replaceAll(" ", "_"); + if (!name) { + return; + } + const song = PRELOADED.get(name + ".mid"); + const crc = PRELOADED_CRC.get(name + ".mid"); + if (song && crc) { + const length = song.length; + this.write(new MidiSong(name, crc, length)); + } + } + playJingle(delay, name) { + name = name.toLowerCase().replaceAll("_", " "); + if (!name) { + return; + } + const jingle = PRELOADED.get(name + ".mid"); + if (jingle) { + this.write(new MidiJingle(delay, jingle)); + } + } + openMainModal(com) { + if (this.modalState & 4) { + this.write(new IfClose()); + this.modalState &= ~4; + this.modalSidebar = -1; + } + this.modalState |= 1; + this.modalTop = com; + this.refreshModal = true; + } + openChat(com) { + this.modalState |= 2; + this.modalBottom = com; + this.refreshModal = true; + } + openSideOverlay(com) { + this.modalState |= 4; + this.modalSidebar = com; + this.refreshModal = true; + } + openChatSticky(com) { + this.write(new TutorialOpenChat(com)); + this.modalState |= 8; + this.modalSticky = com; + } + openMainModalSideOverlay(top, side) { + this.modalState |= 1; + this.modalTop = top; + this.modalState |= 4; + this.modalSidebar = side; + this.refreshModal = true; + } + exactMove(startX, startZ, endX, endZ, startCycle, endCycle, direction) { + this.exactStartX = startX; + this.exactStartZ = startZ; + this.exactEndX = endX; + this.exactEndZ = endZ; + this.exactMoveStart = startCycle; + this.exactMoveEnd = endCycle; + this.exactMoveDirection = direction; + this.mask |= _Player.EXACT_MOVE; + this.x = endX; + this.z = endZ; + this.lastStepX = this.x - 1; + this.lastStepZ = this.z; + } + setTab(com, tab) { + this.overlaySide[tab] = com; + this.write(new IfOpenSideOverlay(com, tab)); + } + isComponentVisible(com) { + return this.modalTop === com.rootLayer || this.modalBottom === com.rootLayer || this.modalSidebar === com.rootLayer || this.overlaySide.findIndex((l) => l === com.rootLayer) !== -1 || this.modalSticky === com.rootLayer; + } + updateAfkZones() { + this.lastAfkZone = Math.min(1e3, this.lastAfkZone + 1); + if (this.withinAfkZone()) { + return; + } + const coord = Position.packCoord(0, this.x - 10, this.z - 10); + if (this.moveSpeed === MoveSpeed_default.INSTANT && this.jump) { + this.afkZones[1] = coord; + } else { + this.afkZones[1] = this.afkZones[0]; + } + this.afkZones[0] = coord; + this.lastAfkZone = 0; + } + zonesAfk() { + return this.lastAfkZone === 1e3; + } + withinAfkZone() { + const size = 21; + for (let index = 0; index < this.afkZones.length; index++) { + const coord = Position.unpackCoord(this.afkZones[index]); + if (Position.intersects(this.x, this.z, this.width, this.length, coord.x, coord.z, size, size)) { + return true; + } + } + return false; + } + // copied from client + isInWilderness() { + if (this.x >= 2944 && this.x < 3392 && this.z >= 3520 && this.z < 6400) { + return true; + } else if (this.x >= 2944 && this.x < 3392 && this.z >= 9920 && this.z < 12800) { + return true; + } else { + return false; + } + } + // ---- + runScript(script, protect = false, force = false) { + if (!force && protect && (this.protect || this.delayed())) { + return -1; + } + if (protect) { + script.pointerAdd(ScriptPointer_default.ProtectedActivePlayer); + this.protect = true; + } + const state = ScriptRunner.execute(script); + if (protect) { + this.protect = false; + } + if (script.pointerGet(ScriptPointer_default.ProtectedActivePlayer) && script._activePlayer) { + script.pointerRemove(ScriptPointer_default.ProtectedActivePlayer); + script._activePlayer.protect = false; + } + if (script.pointerGet(ScriptPointer_default.ProtectedActivePlayer2) && script._activePlayer2) { + script.pointerRemove(ScriptPointer_default.ProtectedActivePlayer2); + script._activePlayer2.protect = false; + } + return state; + } + executeScript(script, protect = false, force = false) { + const state = this.runScript(script, protect, force); + if (state === -1) { + return; + } + if (state !== ScriptState.FINISHED && state !== ScriptState.ABORTED) { + if (state === ScriptState.WORLD_SUSPENDED) { + World_default.enqueueScript(script, script.popInt()); + } else if (state === ScriptState.NPC_SUSPENDED) { + script.activeNpc.activeScript = script; + } else { + script.activePlayer.activeScript = script; + script.activePlayer.protect = protect; + } + } else if (script === this.activeScript) { + this.activeScript = null; + if ((this.modalState & 1) == 0) { + this.closeModal(); + } + } + } + wrappedMessageGame(mes) { + const font = FontType.get(1); + const lines = font.split(mes, 456); + for (const line of lines) { + this.messageGame(line); + } + } + write(message) { + if (message.priority === ServerProtPriority.HIGH) { + this.highPriorityOut.push(message); + } else { + this.lowPriorityOut.push(message); + } + } + unsetMapFlag() { + this.clearWaypoints(); + this.write(new UnsetMapFlag()); + } + hintNpc(nid) { + this.write(new HintArrow(1, nid, 0, 0, 0, 0)); + } + hintTile(offset, x, z, height) { + this.write(new HintArrow(offset, 0, 0, x, z, height)); + } + hintPlayer(pid) { + this.write(new HintArrow(10, 0, pid, 0, 0, 0)); + } + stopHint() { + this.write(new HintArrow(-1, 0, 0, 0, 0, 0)); + } + lastLoginInfo(lastLoginIp, daysSinceLogin, daysSinceRecoveryChange, unreadMessageCount) { + this.write(new LastLoginInfo(lastLoginIp, daysSinceLogin, daysSinceRecoveryChange, unreadMessageCount)); + this.modalState |= 16; + } + logout() { + } + terminate() { + } + messageGame(msg) { + this.write(new MessageGame(msg)); + } +}; + +// src/lostcity/network/225/incoming/prot/ClientProt.ts +var ClientProt = class _ClientProt { + // NXT naming + // in these old revisions we can actually get the packet index from a leftover array in the client source + constructor(index, id, length) { + this.index = index; + this.id = id; + this.length = length; + _ClientProt.all[index] = this; + _ClientProt.byId[id] = this; + } + static all = []; + static byId = []; + static REBUILD_GETMAPS = new _ClientProt(4, 150, -1); + static NO_TIMEOUT = new _ClientProt(6, 108, 0); + // NXT naming + static IDLE_TIMER = new _ClientProt(30, 70, 0); + static EVENT_TRACKING = new _ClientProt(34, 81, -2); + static EVENT_CAMERA_POSITION = new _ClientProt(35, 189, 6); + // NXT naming + // autogenerated as part of obfuscation process + static ANTICHEAT_OPLOGIC1 = new _ClientProt(60, 7, 4); + static ANTICHEAT_OPLOGIC2 = new _ClientProt(61, 88, 4); + static ANTICHEAT_OPLOGIC3 = new _ClientProt(62, 30, 3); + static ANTICHEAT_OPLOGIC4 = new _ClientProt(63, 176, 2); + static ANTICHEAT_OPLOGIC5 = new _ClientProt(64, 220, 0); + static ANTICHEAT_OPLOGIC6 = new _ClientProt(65, 66, 4); + static ANTICHEAT_OPLOGIC7 = new _ClientProt(66, 17, 4); + static ANTICHEAT_OPLOGIC8 = new _ClientProt(67, 2, 2); + static ANTICHEAT_OPLOGIC9 = new _ClientProt(68, 238, 1); + // autogenerated as part of obfuscation process + static ANTICHEAT_CYCLELOGIC1 = new _ClientProt(70, 233, 1); + static ANTICHEAT_CYCLELOGIC2 = new _ClientProt(71, 146, -1); + static ANTICHEAT_CYCLELOGIC3 = new _ClientProt(74, 215, 3); + static ANTICHEAT_CYCLELOGIC4 = new _ClientProt(72, 236, 4); + static ANTICHEAT_CYCLELOGIC5 = new _ClientProt(75, 85, 0); + static ANTICHEAT_CYCLELOGIC6 = new _ClientProt(73, 219, -1); + static OPOBJ1 = new _ClientProt(80, 140, 6); + // NXT naming + static OPOBJ2 = new _ClientProt(81, 40, 6); + // NXT naming + static OPOBJ3 = new _ClientProt(82, 200, 6); + // NXT naming + static OPOBJ4 = new _ClientProt(83, 178, 6); + // NXT naming + static OPOBJ5 = new _ClientProt(84, 247, 6); + // NXT naming + static OPOBJT = new _ClientProt(88, 138, 8); + // NXT naming + static OPOBJU = new _ClientProt(89, 239, 12); + // NXT naming + static OPNPC1 = new _ClientProt(100, 194, 2); + // NXT naming + static OPNPC2 = new _ClientProt(101, 8, 2); + // NXT naming + static OPNPC3 = new _ClientProt(102, 27, 2); + // NXT naming + static OPNPC4 = new _ClientProt(103, 113, 2); + // NXT naming + static OPNPC5 = new _ClientProt(104, 100, 2); + // NXT naming + static OPNPCT = new _ClientProt(108, 134, 4); + // NXT naming + static OPNPCU = new _ClientProt(109, 202, 8); + // NXT naming + static OPLOC1 = new _ClientProt(120, 245, 6); + // NXT naming + static OPLOC2 = new _ClientProt(121, 172, 6); + // NXT naming + static OPLOC3 = new _ClientProt(122, 96, 6); + // NXT naming + static OPLOC4 = new _ClientProt(123, 97, 6); + // NXT naming + static OPLOC5 = new _ClientProt(124, 116, 6); + // NXT naming + static OPLOCT = new _ClientProt(128, 9, 8); + // NXT naming + static OPLOCU = new _ClientProt(129, 75, 12); + // NXT naming + static OPPLAYER1 = new _ClientProt(140, 164, 2); + // NXT naming + static OPPLAYER2 = new _ClientProt(141, 53, 2); + // NXT naming + static OPPLAYER3 = new _ClientProt(142, 185, 2); + // NXT naming + static OPPLAYER4 = new _ClientProt(143, 206, 2); + // NXT naming + static OPPLAYERT = new _ClientProt(148, 177, 4); + // NXT naming + static OPPLAYERU = new _ClientProt(149, 248, 8); + // NXT naming + static OPHELD1 = new _ClientProt(160, 195, 6); + // name based on runescript trigger + static OPHELD2 = new _ClientProt(161, 71, 6); + // name based on runescript trigger + static OPHELD3 = new _ClientProt(162, 133, 6); + // name based on runescript trigger + static OPHELD4 = new _ClientProt(163, 157, 6); + // name based on runescript trigger + static OPHELD5 = new _ClientProt(164, 211, 6); + // name based on runescript trigger + static OPHELDT = new _ClientProt(168, 48, 8); + // name based on runescript trigger + static OPHELDU = new _ClientProt(169, 130, 12); + // name based on runescript trigger + static INV_BUTTON1 = new _ClientProt(190, 31, 6); + // NXT has "IF_BUTTON1" but for our interface system, this makes more sense + static INV_BUTTON2 = new _ClientProt(191, 59, 6); + // NXT has "IF_BUTTON2" but for our interface system, this makes more sense + static INV_BUTTON3 = new _ClientProt(192, 212, 6); + // NXT has "IF_BUTTON3" but for our interface system, this makes more sense + static INV_BUTTON4 = new _ClientProt(193, 38, 6); + // NXT has "IF_BUTTON4" but for our interface system, this makes more sense + static INV_BUTTON5 = new _ClientProt(194, 6, 6); + // NXT has "IF_BUTTON5" but for our interface system, this makes more sense + static IF_BUTTON = new _ClientProt(200, 155, 2); + // NXT naming + static RESUME_PAUSEBUTTON = new _ClientProt(201, 235, 2); + // NXT naming + static CLOSE_MODAL = new _ClientProt(202, 231, 0); + // NXT naming + static RESUME_P_COUNTDIALOG = new _ClientProt(203, 237, 4); + // NXT naming + static TUTORIAL_CLICKSIDE = new _ClientProt(204, 175, 1); + static MOVE_OPCLICK = new _ClientProt(242, 93, -1); + // comes with OP packets, name based on other MOVE packets + static BUG_REPORT = new _ClientProt(243, 190, 10); + // NXT naming + static MOVE_MINIMAPCLICK = new _ClientProt(244, 165, -1); + // NXT naming + static INV_BUTTOND = new _ClientProt(245, 159, 6); + // NXT has "IF_BUTTOND" but for our interface system, this makes more sense + static IGNORELIST_DEL = new _ClientProt(246, 171, 8); + // NXT naming + static IGNORELIST_ADD = new _ClientProt(247, 79, 8); + // NXT naming + static IF_PLAYERDESIGN = new _ClientProt(248, 52, 13); + static CHAT_SETMODE = new _ClientProt(249, 244, 3); + // NXT naming + static MESSAGE_PRIVATE = new _ClientProt(250, 148, -1); + // NXT naming + static FRIENDLIST_DEL = new _ClientProt(251, 11, 8); + // NXT naming + static FRIENDLIST_ADD = new _ClientProt(252, 118, 8); + // NXT naming + static CLIENT_CHEAT = new _ClientProt(253, 4, -1); + // NXT naming + static MESSAGE_PUBLIC = new _ClientProt(254, 158, -1); + // NXT naming + static MOVE_GAMECLICK = new _ClientProt(255, 181, -1); +}; + +// src/lostcity/network/incoming/codec/MessageDecoder.ts +var MessageDecoder = class { +}; + +// src/lostcity/network/incoming/IncomingMessage.ts +var IncomingMessage = class { +}; + +// src/lostcity/network/incoming/prot/ClientProtCategory.ts +var ClientProtCategory = class _ClientProtCategory { + // packet decoding limit per tick, exceeding this ends decoding and picks up where it left off on the next tick + constructor(id, limit) { + this.id = id; + this.limit = limit; + } + // todo: measure how many events we should expect to receive from the client + // osrs has this as 50/10 but we know that's not true in rs2 + // todo: determine which packets belong in which category for this era + static CLIENT_EVENT = new _ClientProtCategory(0, 20); + static USER_EVENT = new _ClientProtCategory(1, 5); +}; + +// src/lostcity/network/incoming/model/ClientCheat.ts +var ClientCheat = class extends IncomingMessage { + constructor(input) { + super(); + this.input = input; + } + category = ClientProtCategory.USER_EVENT; +}; + +// src/lostcity/network/225/incoming/codec/ClientCheatDecoder.ts +var ClientCheatDecoder = class extends MessageDecoder { + prot = ClientProt.CLIENT_CHEAT; + decode(buf) { + const input = buf.gjstr(); + return new ClientCheat(input); + } +}; + +// src/lostcity/network/incoming/model/CloseModal.ts +var CloseModal = class extends IncomingMessage { + category = ClientProtCategory.USER_EVENT; +}; + +// src/lostcity/network/225/incoming/codec/CloseModalDecoder.ts +var CloseModalDecoder = class extends MessageDecoder { + prot = ClientProt.CLOSE_MODAL; + decode() { + return new CloseModal(); + } +}; + +// src/lostcity/network/incoming/model/IdleTimer.ts +var IdleTimer = class extends IncomingMessage { + category = ClientProtCategory.CLIENT_EVENT; +}; + +// src/lostcity/network/225/incoming/codec/IdleTimerDecoder.ts +var IdleTimerDecoder = class extends MessageDecoder { + prot = ClientProt.IDLE_TIMER; + decode() { + return new IdleTimer(); + } +}; + +// src/lostcity/network/incoming/model/IfButton.ts +var IfButton = class extends IncomingMessage { + constructor(component) { + super(); + this.component = component; + } + category = ClientProtCategory.USER_EVENT; +}; + +// src/lostcity/network/225/incoming/codec/IfButtonDecoder.ts +var IfButtonDecoder = class extends MessageDecoder { + prot = ClientProt.IF_BUTTON; + decode(buf) { + const component = buf.g2(); + return new IfButton(component); + } +}; + +// src/lostcity/network/incoming/model/IfPlayerDesign.ts +var IfPlayerDesign = class extends IncomingMessage { + constructor(gender, idkit, color) { + super(); + this.gender = gender; + this.idkit = idkit; + this.color = color; + } + category = ClientProtCategory.USER_EVENT; +}; + +// src/lostcity/network/225/incoming/codec/IfPlayerDesignDecoder.ts +var IfPlayerDesignDecoder = class extends MessageDecoder { + prot = ClientProt.IF_PLAYERDESIGN; + decode(buf) { + const gender = buf.g1(); + const idkit = []; + for (let i = 0; i < 7; i++) { + idkit[i] = buf.g1(); + if (idkit[i] === 255) { + idkit[i] = -1; + } + } + const color = []; + for (let i = 0; i < 5; i++) { + color[i] = buf.g1(); + } + return new IfPlayerDesign(gender, idkit, color); + } +}; + +// src/lostcity/network/incoming/model/InvButton.ts +var InvButton = class extends IncomingMessage { + constructor(op, obj, slot, component) { + super(); + this.op = op; + this.obj = obj; + this.slot = slot; + this.component = component; + } + category = ClientProtCategory.USER_EVENT; +}; + +// src/lostcity/network/225/incoming/codec/InvButtonDecoder.ts +var InvButtonDecoder = class extends MessageDecoder { + constructor(prot, op) { + super(); + this.prot = prot; + this.op = op; + } + decode(buf) { + const obj = buf.g2(); + const slot = buf.g2(); + const component = buf.g2(); + return new InvButton(this.op, obj, slot, component); + } +}; + +// src/lostcity/network/incoming/model/InvButtonD.ts +var InvButtonD = class extends IncomingMessage { + constructor(component, slot, targetSlot) { + super(); + this.component = component; + this.slot = slot; + this.targetSlot = targetSlot; + } + category = ClientProtCategory.USER_EVENT; +}; + +// src/lostcity/network/225/incoming/codec/InvButtonDDecoder.ts +var InvButtonDDecoder = class extends MessageDecoder { + prot = ClientProt.INV_BUTTOND; + decode(buf) { + const component = buf.g2(); + const slot = buf.g2(); + const targetSlot = buf.g2(); + return new InvButtonD(component, slot, targetSlot); + } +}; + +// src/lostcity/network/incoming/model/MessagePrivate.ts +var MessagePrivate2 = class extends IncomingMessage { + constructor(username, input) { + super(); + this.username = username; + this.input = input; + } + category = ClientProtCategory.USER_EVENT; +}; + +// src/lostcity/network/225/incoming/codec/MessagePrivateDecoder.ts +var MessagePrivateDecoder = class extends MessageDecoder { + prot = ClientProt.MESSAGE_PRIVATE; + decode(buf) { + const username = buf.g8(); + const input = WordPack.unpack(buf, buf.length - 8); + return new MessagePrivate2(username, input); + } +}; + +// src/lostcity/network/incoming/model/MessagePublic.ts +var MessagePublic = class extends IncomingMessage { + constructor(input, color, effect) { + super(); + this.input = input; + this.color = color; + this.effect = effect; + } + category = ClientProtCategory.USER_EVENT; +}; + +// src/lostcity/network/225/incoming/codec/MessagePublicDecoder.ts +var MessagePublicDecoder = class extends MessageDecoder { + prot = ClientProt.MESSAGE_PUBLIC; + decode(buf) { + const color = buf.g1(); + const effect = buf.g1(); + const input = WordPack.unpack(buf, buf.length - 2); + return new MessagePublic(input, color, effect); + } +}; + +// src/lostcity/network/incoming/model/OpHeld.ts +var OpHeld = class extends IncomingMessage { + constructor(op, obj, slot, component) { + super(); + this.op = op; + this.obj = obj; + this.slot = slot; + this.component = component; + } + category = ClientProtCategory.USER_EVENT; +}; + +// src/lostcity/network/225/incoming/codec/OpHeldDecoder.ts +var OpHeldDecoder = class extends MessageDecoder { + constructor(prot, op) { + super(); + this.prot = prot; + this.op = op; + } + decode(buf) { + const obj = buf.g2(); + const slot = buf.g2(); + const component = buf.g2(); + return new OpHeld(this.op, obj, slot, component); + } +}; + +// src/lostcity/network/incoming/model/OpHeldT.ts +var OpHeldT = class extends IncomingMessage { + constructor(obj, slot, component, spellComponent) { + super(); + this.obj = obj; + this.slot = slot; + this.component = component; + this.spellComponent = spellComponent; + } + category = ClientProtCategory.USER_EVENT; +}; + +// src/lostcity/network/225/incoming/codec/OpHeldTDecoder.ts +var OpHeldTDecoder = class extends MessageDecoder { + prot = ClientProt.OPHELDT; + decode(buf) { + const obj = buf.g2(); + const slot = buf.g2(); + const component = buf.g2(); + const spellComponent = buf.g2(); + return new OpHeldT(obj, slot, component, spellComponent); + } +}; + +// src/lostcity/network/incoming/model/OpHeldU.ts +var OpHeldU = class extends IncomingMessage { + constructor(obj, slot, component, useObj, useSlot, useComponent) { + super(); + this.obj = obj; + this.slot = slot; + this.component = component; + this.useObj = useObj; + this.useSlot = useSlot; + this.useComponent = useComponent; + } + category = ClientProtCategory.USER_EVENT; +}; + +// src/lostcity/network/225/incoming/codec/OpHeldUDecoder.ts +var OpHeldUDecoder = class extends MessageDecoder { + prot = ClientProt.OPHELDU; + decode(buf) { + const obj = buf.g2(); + const slot = buf.g2(); + const component = buf.g2(); + const useObj = buf.g2(); + const useSlot = buf.g2(); + const useComponent = buf.g2(); + return new OpHeldU(obj, slot, component, useObj, useSlot, useComponent); + } +}; + +// src/lostcity/network/incoming/model/OpLoc.ts +var OpLoc = class extends IncomingMessage { + constructor(op, x, z, loc) { + super(); + this.op = op; + this.x = x; + this.z = z; + this.loc = loc; + } + category = ClientProtCategory.USER_EVENT; +}; + +// src/lostcity/network/225/incoming/codec/OpLocDecoder.ts +var OpLocDecoder = class extends MessageDecoder { + constructor(prot, op) { + super(); + this.prot = prot; + this.op = op; + } + decode(buf) { + const x = buf.g2(); + const z = buf.g2(); + const loc = buf.g2(); + return new OpLoc(this.op, x, z, loc); + } +}; + +// src/lostcity/network/incoming/model/OpLocT.ts +var OpLocT = class extends IncomingMessage { + constructor(x, z, loc, spellComponent) { + super(); + this.x = x; + this.z = z; + this.loc = loc; + this.spellComponent = spellComponent; + } + category = ClientProtCategory.USER_EVENT; +}; + +// src/lostcity/network/225/incoming/codec/OpLocTDecoder.ts +var OpLocTDecoder = class extends MessageDecoder { + prot = ClientProt.OPLOCT; + decode(buf) { + const x = buf.g2(); + const z = buf.g2(); + const loc = buf.g2(); + const spellComponent = buf.g2(); + return new OpLocT(x, z, loc, spellComponent); + } +}; + +// src/lostcity/network/incoming/model/OpLocU.ts +var OpLocU = class extends IncomingMessage { + constructor(x, z, loc, useObj, useSlot, useComponent) { + super(); + this.x = x; + this.z = z; + this.loc = loc; + this.useObj = useObj; + this.useSlot = useSlot; + this.useComponent = useComponent; + } + category = ClientProtCategory.USER_EVENT; +}; + +// src/lostcity/network/225/incoming/codec/OpLocUDecoder.ts +var OpLocUDecoder = class extends MessageDecoder { + prot = ClientProt.OPLOCU; + decode(buf) { + const x = buf.g2(); + const z = buf.g2(); + const loc = buf.g2(); + const useObj = buf.g2(); + const useSlot = buf.g2(); + const useComponent = buf.g2(); + return new OpLocU(x, z, loc, useObj, useSlot, useComponent); + } +}; + +// src/lostcity/network/incoming/model/OpNpc.ts +var OpNpc = class extends IncomingMessage { + constructor(op, nid) { + super(); + this.op = op; + this.nid = nid; + } + category = ClientProtCategory.USER_EVENT; +}; + +// src/lostcity/network/225/incoming/codec/OpNpcDecoder.ts +var OpNpcDecoder = class extends MessageDecoder { + constructor(prot, op) { + super(); + this.prot = prot; + this.op = op; + } + decode(buf) { + const nid = buf.g2(); + return new OpNpc(this.op, nid); + } +}; + +// src/lostcity/network/incoming/model/OpNpcT.ts +var OpNpcT = class extends IncomingMessage { + constructor(nid, spellComponent) { + super(); + this.nid = nid; + this.spellComponent = spellComponent; + } + category = ClientProtCategory.USER_EVENT; +}; + +// src/lostcity/network/225/incoming/codec/OpNpcTDecoder.ts +var OpNpcTDecoder = class extends MessageDecoder { + prot = ClientProt.OPNPCT; + decode(buf) { + const nid = buf.g2(); + const spellComponent = buf.g2(); + return new OpNpcT(nid, spellComponent); + } +}; + +// src/lostcity/network/incoming/model/OpNpcU.ts +var OpNpcU = class extends IncomingMessage { + constructor(nid, useObj, useSlot, useComponent) { + super(); + this.nid = nid; + this.useObj = useObj; + this.useSlot = useSlot; + this.useComponent = useComponent; + } + category = ClientProtCategory.USER_EVENT; +}; + +// src/lostcity/network/225/incoming/codec/OpNpcUDecoder.ts +var OpNpcUDecoder = class extends MessageDecoder { + prot = ClientProt.OPNPCU; + decode(buf) { + const nid = buf.g2(); + const useObj = buf.g2(); + const useSlot = buf.g2(); + const useComponent = buf.g2(); + return new OpNpcU(nid, useObj, useSlot, useComponent); + } +}; + +// src/lostcity/network/incoming/model/OpObj.ts +var OpObj = class extends IncomingMessage { + constructor(op, x, z, obj) { + super(); + this.op = op; + this.x = x; + this.z = z; + this.obj = obj; + } + category = ClientProtCategory.USER_EVENT; +}; + +// src/lostcity/network/225/incoming/codec/OpObjDecoder.ts +var OpObjDecoder = class extends MessageDecoder { + constructor(prot, op) { + super(); + this.prot = prot; + this.op = op; + } + decode(buf) { + const x = buf.g2(); + const z = buf.g2(); + const obj = buf.g2(); + return new OpObj(this.op, x, z, obj); + } +}; + +// src/lostcity/network/incoming/model/OpObjT.ts +var OpObjT = class extends IncomingMessage { + constructor(x, z, obj, spellComponent) { + super(); + this.x = x; + this.z = z; + this.obj = obj; + this.spellComponent = spellComponent; + } + category = ClientProtCategory.USER_EVENT; +}; + +// src/lostcity/network/225/incoming/codec/OpObjTDecoder.ts +var OpObjTDecoder = class extends MessageDecoder { + prot = ClientProt.OPOBJT; + decode(buf) { + const x = buf.g2(); + const z = buf.g2(); + const obj = buf.g2(); + const spellComponent = buf.g2(); + return new OpObjT(x, z, obj, spellComponent); + } +}; + +// src/lostcity/network/incoming/model/OpObjU.ts +var OpObjU = class extends IncomingMessage { + constructor(x, z, obj, useObj, useSlot, useComponent) { + super(); + this.x = x; + this.z = z; + this.obj = obj; + this.useObj = useObj; + this.useSlot = useSlot; + this.useComponent = useComponent; + } + category = ClientProtCategory.USER_EVENT; +}; + +// src/lostcity/network/225/incoming/codec/OpObjUDecoder.ts +var OpObjUDecoder = class extends MessageDecoder { + prot = ClientProt.OPOBJU; + decode(buf) { + const x = buf.g2(); + const z = buf.g2(); + const obj = buf.g2(); + const useObj = buf.g2(); + const useSlot = buf.g2(); + const useComponent = buf.g2(); + return new OpObjU(x, z, obj, useObj, useSlot, useComponent); + } +}; + +// src/lostcity/network/incoming/model/OpPlayer.ts +var OpPlayer = class extends IncomingMessage { + constructor(op, pid) { + super(); + this.op = op; + this.pid = pid; + } + category = ClientProtCategory.USER_EVENT; +}; + +// src/lostcity/network/225/incoming/codec/OpPlayerDecoder.ts +var OpPlayerDecoder = class extends MessageDecoder { + constructor(prot, op) { + super(); + this.prot = prot; + this.op = op; + } + decode(buf) { + const pid = buf.g2(); + return new OpPlayer(this.op, pid); + } +}; + +// src/lostcity/network/incoming/model/OpPlayerT.ts +var OpPlayerT = class extends IncomingMessage { + constructor(pid, spellComponent) { + super(); + this.pid = pid; + this.spellComponent = spellComponent; + } + category = ClientProtCategory.USER_EVENT; +}; + +// src/lostcity/network/225/incoming/codec/OpPlayerTDecoder.ts +var OpPlayerTDecoder = class extends MessageDecoder { + prot = ClientProt.OPPLAYERT; + decode(buf) { + const pid = buf.g2(); + const spellComponent = buf.g2(); + return new OpPlayerT(pid, spellComponent); + } +}; + +// src/lostcity/network/incoming/model/OpPlayerU.ts +var OpPlayerU = class extends IncomingMessage { + constructor(pid, useObj, useSlot, useComponent) { + super(); + this.pid = pid; + this.useObj = useObj; + this.useSlot = useSlot; + this.useComponent = useComponent; + } + category = ClientProtCategory.USER_EVENT; +}; + +// src/lostcity/network/225/incoming/codec/OpPlayerUDecoder.ts +var OpPlayerUDecoder = class extends MessageDecoder { + prot = ClientProt.OPPLAYERU; + decode(buf) { + const pid = buf.g2(); + const useObj = buf.g2(); + const useSlot = buf.g2(); + const useComponent = buf.g2(); + return new OpPlayerU(pid, useObj, useSlot, useComponent); + } +}; + +// src/lostcity/network/incoming/model/RebuildGetMaps.ts +var RebuildGetMaps = class extends IncomingMessage { + constructor(maps2) { + super(); + this.maps = maps2; + } + category = ClientProtCategory.USER_EVENT; +}; + +// src/lostcity/network/225/incoming/codec/RebuildGetMapsDecoder.ts +var RebuildGetMapsDecoder = class extends MessageDecoder { + prot = ClientProt.REBUILD_GETMAPS; + decode(buf) { + const maps2 = []; + const count = buf.length / 3; + for (let i = 0; i < count; i++) { + const type = buf.g1(); + const x = buf.g1(); + const z = buf.g1(); + maps2.push({ type, x, z }); + } + return new RebuildGetMaps(maps2); + } +}; + +// src/lostcity/network/incoming/model/ResumePauseButton.ts +var ResumePauseButton = class extends IncomingMessage { + category = ClientProtCategory.USER_EVENT; +}; + +// src/lostcity/network/225/incoming/codec/ResumePauseButtonDecoder.ts +var ResumePauseButtonDecoder = class extends MessageDecoder { + prot = ClientProt.RESUME_PAUSEBUTTON; + decode() { + return new ResumePauseButton(); + } +}; + +// src/lostcity/network/incoming/model/ResumePCountDialog.ts +var ResumePCountDialog = class extends IncomingMessage { + constructor(input) { + super(); + this.input = input; + } + category = ClientProtCategory.USER_EVENT; +}; + +// src/lostcity/network/225/incoming/codec/ResumePCountDialogDecoder.ts +var ResumePCountDialogDecoder = class extends MessageDecoder { + prot = ClientProt.RESUME_P_COUNTDIALOG; + decode(buf) { + const input = buf.g4(); + return new ResumePCountDialog(input); + } +}; + +// src/lostcity/network/incoming/model/TutorialClickSide.ts +var TutorialClickSide = class extends IncomingMessage { + constructor(tab) { + super(); + this.tab = tab; + } + category = ClientProtCategory.USER_EVENT; +}; + +// src/lostcity/network/225/incoming/codec/TutorialClickSideDecoder.ts +var TutorialClickSideDecoder = class extends MessageDecoder { + prot = ClientProt.TUTORIAL_CLICKSIDE; + decode(buf) { + const tab = buf.g1(); + return new TutorialClickSide(tab); + } +}; + +// src/lostcity/network/incoming/handler/MessageHandler.ts +var MessageHandler = class { +}; + +// src/lostcity/network/225/incoming/handler/InvButtonHandler.ts +var InvButtonHandler = class extends MessageHandler { + handle(message, player) { + const { op, obj: item, slot, component: comId } = message; + const com = Component.get(comId); + if (typeof com === "undefined" || !com.inventoryOptions || !com.inventoryOptions.length || !player.isComponentVisible(com)) { + return false; + } + if (!com.inventoryOptions[op - 1]) { + return false; + } + const listener = player.invListeners.find((l) => l.com === comId); + if (!listener) { + return false; + } + const inv = player.getInventoryFromListener(listener); + if (!inv || !inv.validSlot(slot) || !inv.hasAt(slot, item)) { + return false; + } + if (player.delayed()) { + return false; + } + player.lastItem = item; + player.lastSlot = slot; + let trigger; + if (op === 1) { + trigger = ServerTriggerType_default.INV_BUTTON1; + } else if (op === 2) { + trigger = ServerTriggerType_default.INV_BUTTON2; + } else if (op === 3) { + trigger = ServerTriggerType_default.INV_BUTTON3; + } else if (op === 4) { + trigger = ServerTriggerType_default.INV_BUTTON4; + } else { + trigger = ServerTriggerType_default.INV_BUTTON5; + } + const script = ScriptProvider.getByTrigger(trigger, comId, -1); + if (script) { + const root = Component.get(com.rootLayer); + player.executeScript(ScriptRunner.init(script, player), root.overlay == false); + } else if (Environment_default.NODE_DEBUG) { + player.messageGame(`No trigger for [${ServerTriggerType_default.toString(trigger)},${com.comName}]`); + } + return true; + } +}; + +// src/lostcity/server/ClientSocket.ts +var ClientSocket = class _ClientSocket { + static TCP = 0; + static WEBSOCKET = 1; + socket = null; + type = -1; + state = -1; + remoteAddress; + totalBytesRead = 0; + totalBytesWritten = 0; + uniqueId; + encryptor = null; + decryptor = null; + // we only want to receive 5KB per tick to mitigate bad actors + in = new Uint8Array(5e3); + inOffset = 0; + // we limit the amount of packets we receive per opcode (no more than 10) to mitigate bad actors + inCount = new Uint8Array(256); + // packets are flushed in up to 5KB chunks + // out = new Uint8Array(5000); + // outOffset = 0; + out = new Packet(new Uint8Array(5e3)); + player = null; + constructor(socket, remoteAddress, type = _ClientSocket.TCP, state = -1, uniqueId = randomUUID()) { + this.socket = socket; + this.remoteAddress = remoteAddress; + this.type = type; + this.state = state; + this.uniqueId = uniqueId; + } + isTCP() { + return this.type === _ClientSocket.TCP; + } + isWebSocket() { + return this.type === _ClientSocket.WEBSOCKET; + } + send(data) { + if (!this.socket) { + return; + } + this.totalBytesWritten += data.length; + if (this.isTCP()) { + this.socket.write(data); + } else if (this.isWebSocket()) { + this.socket.send(data); + } else if (typeof self !== "undefined") { + this.socket.postMessage({ type: "data", data, id: this.uniqueId }); + } + } + // close the connection gracefully + close() { + if (!this.socket) { + return; + } + setTimeout(() => { + if (this.isTCP()) { + this.socket.end(); + } else if (this.isWebSocket()) { + this.socket.close(); + } else if (typeof self !== "undefined") { + this.socket.postMessage({ type: "close", id: this.uniqueId }); + } + }, 100); + } + // terminate the connection immediately + terminate() { + if (!this.socket) { + return; + } + if (this.isTCP()) { + this.socket.destroy(); + } else if (this.isWebSocket()) { + this.socket.terminate(); + } else if (typeof self !== "undefined") { + this.socket.postMessage({ type: "close", id: this.uniqueId }); + } + } + reset() { + this.inOffset = 0; + this.inCount.fill(0); + } + writeImmediate(data) { + this.send(data); + } + flush() { + const out = this.out; + if (out.pos === 0) { + return; + } + this.send(out.data.subarray(0, out.pos)); + out.pos = 0; + } +}; + +// src/lostcity/server/NullClientSocket.ts +var NullClientSocket = class extends ClientSocket { + constructor() { + super(null, ""); + } + isTCP() { + return this.type === ClientSocket.TCP; + } + isWebSocket() { + return this.type === ClientSocket.WEBSOCKET; + } + send(data) { + if (!this.socket) { + return; + } + } + // close the connection gracefully + close() { + if (!this.socket) { + return; + } + } + // terminate the connection immediately + terminate() { + if (!this.socket) { + return; + } + } + reset() { + this.inOffset = 0; + this.inCount.fill(0); + } +}; + +// src/lostcity/entity/PlayerLoading.ts +var PlayerLoading = class _PlayerLoading { + /** + * Creates a non-networked player from a save file. + * + * Used for tooling. + */ + static loadFromFile(name) { + const name37 = toBase37(name); + const safeName = fromBase37(name37); + let save; + if (fs24.existsSync(`data/players/${safeName}.sav`)) { + save = Packet.load(`data/players/${safeName}.sav`); + } else { + save = new Packet(new Uint8Array()); + } + return _PlayerLoading.load(name, save, null); + } + static load(name, sav, client) { + const name37 = toBase37(name); + const safeName = fromBase37(name37); + const player = client ? new NetworkPlayer(safeName, name37, client) : new Player(safeName, name37); + if (!Environment_default.NODE_PRODUCTION) { + player.staffModLevel = 3; + } else if (Environment_default.NODE_STAFF.find((name2) => name2 === safeName) !== void 0) { + player.staffModLevel = 3; + } + if (sav.data.length < 2) { + for (let i = 0; i < 21; i++) { + player.stats[i] = 0; + player.baseLevels[i] = 1; + player.levels[i] = 1; + } + player.stats[PlayerStat_default.HITPOINTS] = getExpByLevel(10); + player.baseLevels[PlayerStat_default.HITPOINTS] = 10; + player.levels[PlayerStat_default.HITPOINTS] = 10; + return player; + } + if (sav.g2() !== 8196) { + throw new Error("Invalid player save"); + } + const version = sav.g2(); + if (version > 3) { + throw new Error("Unsupported player save format"); + } + sav.pos = sav.data.length - 4; + const crc = sav.g4(); + if (crc != Packet.getcrc(sav.data, 0, sav.data.length - 4)) { + throw new Error("Player save corrupted"); + } + sav.pos = 4; + player.x = sav.g2(); + player.z = sav.g2(); + player.level = sav.g1(); + for (let i = 0; i < 7; i++) { + player.body[i] = sav.g1(); + if (player.body[i] === 255) { + player.body[i] = -1; + } + } + for (let i = 0; i < 5; i++) { + player.colors[i] = sav.g1(); + } + player.gender = sav.g1(); + player.runenergy = sav.g2(); + if (version >= 2) { + player.playtime = sav.g4(); + } else { + player.playtime = sav.g2(); + } + for (let i = 0; i < 21; i++) { + player.stats[i] = sav.g4(); + player.baseLevels[i] = getLevelByExp(player.stats[i]); + player.levels[i] = sav.g1(); + } + const varpCount = sav.g2(); + for (let i = 0; i < varpCount; i++) { + player.vars[i] = sav.g4(); + } + const invCount = sav.g1(); + for (let i = 0; i < invCount; i++) { + const type = sav.g2(); + const inv = player.getInventory(type); + if (inv) { + for (let j = 0; j < inv.capacity; j++) { + const id = sav.g2(); + if (id === 0) { + continue; + } + let count = sav.g1(); + if (count === 255) { + count = sav.g4(); + } + inv.set(j, { + id: id - 1, + count + }); + } + } + } + if (version >= 3) { + const afkZones = sav.g1(); + for (let index = 0; index < afkZones; index++) { + player.afkZones[index] = sav.g4(); + } + player.lastAfkZone = sav.g2(); + } + player.combatLevel = player.getCombatLevel(); + player.lastResponse = World_default.currentTick; + return player; + } +}; + +// src/lostcity/network/225/incoming/handler/ClientCheatHandler.ts +var ClientCheatHandler = class extends MessageHandler { + handle(message, player) { + if (message.input.length > 80) { + return false; + } + const { input: cheat } = message; + const args = cheat.toLowerCase().split(" "); + const cmd = args.shift(); + if (cmd === void 0 || cmd.length <= 0) { + return false; + } + player.playerLog("Cheat ran", cheat); + if (player.staffModLevel >= 3) { + if (cmd === "reload" && typeof self === "undefined" && !Environment_default.NODE_PRODUCTION) { + World_default.reload(); + const count = ScriptProvider.load("data/pack"); + player.messageGame(`Reloaded ${count} scripts.`); + } else if (cmd === "rebuild" && !Environment_default.NODE_PRODUCTION) { + World_default.devThread.postMessage({ + type: "pack" + }); + } else if (cmd === "serverdrop") { + player.terminate(); + } else if (cmd === "bench") { + const start = Date.now(); + for (let index = 0; index < 1e5; index++) { + findPath(player.level, player.x, player.z, player.x, player.z + 10); + } + const end = Date.now(); + console.log(`took = ${end - start} ms`); + } else if (cmd === "bots") { + player.messageGame("Adding bots"); + for (let i = 0; i < 1999; i++) { + const bot = PlayerLoading.load(`bot${i}`, new Packet(new Uint8Array()), new NullClientSocket()); + World_default.addPlayer(bot); + } + } else if (cmd === "lightbots") { + player.messageGame("Adding lightweight bots"); + for (let i = 0; i < 1999; i++) { + const bot = PlayerLoading.load(`bot${i}`, new Packet(new Uint8Array()), null); + World_default.addPlayer(bot); + } + } else if (cmd === "teleall") { + player.messageGame("Teleporting all players"); + for (const player2 of World_default.players) { + player2.closeModal(); + do { + const x = Math.floor(Math.random() * 64) + 3200; + const z = Math.floor(Math.random() * 64) + 3200; + player2.teleJump(x + Math.floor(Math.random() * 64) - 32, z + Math.floor(Math.random() * 64) - 32, 0); + } while (isFlagged(player2.x, player2.z, player2.level, CollisionFlag.WALK_BLOCKED)); + } + } else if (cmd === "moveall") { + player.messageGame("Moving all players"); + console.time("moveall"); + for (const player2 of World_default.players) { + player2.closeModal(); + player2.queueWaypoints(findPath(player2.level, player2.x, player2.z, (player2.x >>> 6 << 6) + 32, (player2.z >>> 6 << 6) + 32)); + } + console.timeEnd("moveall"); + } else if (cmd === "speed") { + if (args.length < 1) { + player.messageGame("Usage: ::speed "); + return false; + } + const speed = tryParseInt(args.shift(), 20); + if (speed < 20) { + player.messageGame("::speed input was too low."); + return false; + } + player.messageGame(`World speed was changed to ${speed}ms`); + World_default.tickRate = speed; + } else if (cmd === "fly") { + if (player.moveStrategy === MoveStrategy_default.FLY) { + player.moveStrategy = MoveStrategy_default.SMART; + } else { + player.moveStrategy = MoveStrategy_default.FLY; + } + player.messageGame(`Fly is on? ${player.moveStrategy === MoveStrategy_default.FLY}`); + } else if (cmd === "naive") { + if (player.moveStrategy === MoveStrategy_default.NAIVE) { + player.moveStrategy = MoveStrategy_default.SMART; + } else { + player.moveStrategy = MoveStrategy_default.NAIVE; + } + player.messageGame(`Naive is on? ${player.moveStrategy === MoveStrategy_default.NAIVE}`); + } else if (cmd === "teleto") { + if (args.length < 1) { + return false; + } + const other = World_default.getPlayerByUsername(args[0]); + if (!other) { + player.messageGame(`${args[0]} is not logged in.`); + return false; + } + player.teleJump(other.x, other.z, other.level); + } else if (cmd === "teleother") { + if (args.length < 1) { + return false; + } + const other = World_default.getPlayerByUsername(args[0]); + if (!other) { + player.messageGame(`${args[0]} is not logged in.`); + return false; + } + other.teleJump(player.x, player.z, player.level); + } else if (cmd === "setvarother") { + if (args.length < 3) { + return false; + } + const other = World_default.getPlayerByUsername(args[0]); + if (!other) { + player.messageGame(`${args[0]} is not logged in.`); + return false; + } + const varp = VarPlayerType.getId(args[1]); + const value = Math.max(-2147483648, Math.min(tryParseInt(args[2], 0), 2147483647)); + if (varp === -1) { + return false; + } + other.setVar(varp, value); + player.messageGame("set " + args[1] + ": to " + value + " on " + other.username); + } else if (cmd === "shutdown") { + if (args.length < 1) { + return false; + } + World_default.rebootTimer(tryParseInt(args[0], 50)); + } + } + if (Environment_default.NODE_ALLOW_CHEATS || player.staffModLevel >= 2) { + if (cmd === "tele") { + if (args.length < 1) { + return false; + } + if (args[0] === "up") { + player.teleJump(player.x, player.z, player.level + 1); + player.messageGame("::tele " + Position.formatString(player.level, player.x, player.z, ",")); + } else if (args[0] === "down") { + player.teleJump(player.x, player.z, player.level - 1); + player.messageGame("::tele " + Position.formatString(player.level, player.x, player.z, ",")); + } else if (args[0].indexOf(",") === -1) { + player.teleJump(tryParseInt(args[0], 3200), tryParseInt(args[1], 3200), tryParseInt(args[2], player.level)); + } else { + const coord = args[0].split(","); + if (coord.length !== 5) { + return false; + } + const level = tryParseInt(coord[0], 0); + const mx = tryParseInt(coord[1], 50); + const mz = tryParseInt(coord[2], 50); + const lx = tryParseInt(coord[3], 0); + const lz = tryParseInt(coord[4], 0); + if (level < 0 || level > 3 || mx < 0 || mx > 255 || mz < 0 || mz > 255 || lx < 0 || lx > 63 || lz < 0 || lz > 63) { + return false; + } + player.teleJump((mx << 6) + lx, (mz << 6) + lz, level); + } + } else if (cmd === "setvar") { + if (args.length < 2) { + return false; + } + const varp = VarPlayerType.getId(args[0]); + const value = Math.max(-2147483648, Math.min(tryParseInt(args[1], 0), 2147483647)); + if (varp === -1) { + return false; + } + player.setVar(varp, value); + player.messageGame("set " + args[0] + ": to " + value); + } else if (cmd === "random") { + player.afkEventReady = true; + } else if (cmd === "minme") { + for (let i = 0; i < Player.SKILLS.length; i++) { + if (i === PlayerStat_default.HITPOINTS) { + player.setLevel(i, 10); + } else { + player.setLevel(i, 1); + } + } + } else if (cmd === "setxp") { + if (args.length < 2) { + player.messageGame("Usage: ::setxp "); + return false; + } + const stat = Player.SKILLS.indexOf(args[0]); + if (stat === -1) { + player.messageGame(`Unknown stat ${args[0]}`); + return false; + } + const exp = parseInt(args[1]) * 10; + player.stats[stat] = exp; + } else if (cmd === "setstat") { + if (args.length < 2) { + return false; + } + const stat = Player.SKILLS.indexOf(args[0]); + if (stat === -1) { + return false; + } + player.setLevel(stat, parseInt(args[1])); + } else if (cmd === "advancestat") { + if (args.length < 1) { + return false; + } + const stat = Player.SKILLS.indexOf(args[0]); + const level = Math.min(99, Math.max(1, tryParseInt(args[1], 1))); + if (stat === -1) { + return false; + } + player.setLevel(stat, player.baseLevels[stat] + level); + } else if (cmd === "getvar") { + if (args.length < 1) { + return false; + } + const varp = VarPlayerType.getId(args[0]); + if (varp === -1) { + return false; + } + const value = player.getVar(varp); + player.messageGame("get " + args[0] + ": " + value); + } else if (cmd === "give") { + if (args.length < 1) { + return false; + } + const obj = ObjType.getId(args[0]); + const count = Math.max(1, Math.min(tryParseInt(args[1], 1), 2147483647)); + if (obj === -1) { + return false; + } + player.invAdd(InvType.INV, obj, count, false); + } else if (cmd === "givecrap") { + } else if (cmd === "givemany") { + } + } + if (Environment_default.NODE_ALLOW_CHEATS || player.staffModLevel >= 1) { + if (cmd === "getcoord") { + player.messageGame(Position.formatString(player.level, player.x, player.z, "_")); + } + } + if (Environment_default.NODE_ALLOW_CHEATS || player.staffModLevel >= 2) { + const script = ScriptProvider.getByName(`[debugproc,${cmd}]`); + if (!script) { + return false; + } + const params = new Array(script.info.parameterTypes.length).fill(-1); + for (let i = 0; i < script.info.parameterTypes.length; i++) { + const type = script.info.parameterTypes[i]; + try { + switch (type) { + case ScriptVarType.STRING: { + const value = args.shift(); + params[i] = value ?? ""; + break; + } + case ScriptVarType.INT: { + const value = args.shift(); + params[i] = parseInt(value ?? "0", 10) | 0; + break; + } + case ScriptVarType.OBJ: + case ScriptVarType.NAMEDOBJ: { + const name = args.shift(); + params[i] = ObjType.getId(name ?? ""); + break; + } + case ScriptVarType.NPC: { + const name = args.shift(); + params[i] = NpcType.getId(name ?? ""); + break; + } + case ScriptVarType.LOC: { + const name = args.shift(); + params[i] = LocType.getId(name ?? ""); + break; + } + case ScriptVarType.SEQ: { + const name = args.shift(); + params[i] = SeqType.getId(name ?? ""); + break; + } + case ScriptVarType.STAT: { + const name = args.shift(); + params[i] = Player.SKILLS.indexOf(name ?? ""); + break; + } + case ScriptVarType.INV: { + const name = args.shift(); + params[i] = InvType.getId(name ?? ""); + break; + } + case ScriptVarType.COORD: { + const args2 = cheat.split("_"); + const level = parseInt(args2[0].slice(6)); + const mx = parseInt(args2[1]); + const mz = parseInt(args2[2]); + const lx = parseInt(args2[3]); + const lz = parseInt(args2[4]); + params[i] = Position.packCoord(level, (mx << 6) + lx, (mz << 6) + lz); + break; + } + case ScriptVarType.INTERFACE: { + const name = args.shift(); + params[i] = Component.getId(name ?? ""); + break; + } + case ScriptVarType.SPOTANIM: { + const name = args.shift(); + params[i] = SpotanimType.getId(name ?? ""); + break; + } + case ScriptVarType.IDKIT: { + const name = args.shift(); + params[i] = IdkType.getId(name ?? ""); + break; + } + } + } catch (err) { + return false; + } + } + player.executeScript(ScriptRunner.init(script, player, null, params), false); + } + return true; + } +}; + +// src/lostcity/network/225/incoming/handler/CloseModalHandler.ts +var CloseModalHandler = class extends MessageHandler { + handle(_message, player) { + player.closeModal(); + return true; + } +}; + +// src/lostcity/network/225/incoming/handler/IdleTimerHandler.ts +var IdleTimerHandler = class extends MessageHandler { + handle(_message, player) { + if (Environment_default.NODE_PRODUCTION) { + player.logout(); + player.logoutRequested = true; + } + return true; + } +}; + +// src/lostcity/network/225/incoming/handler/IfButtonHandler.ts +var IfButtonHandler = class extends MessageHandler { + handle(message, player) { + const { component: comId } = message; + const com = Component.get(comId); + if (typeof com === "undefined" || !player.isComponentVisible(com)) { + return false; + } + player.lastCom = comId; + if (player.resumeButtons.indexOf(player.lastCom) !== -1) { + if (player.activeScript && player.activeScript.execution === ScriptState.PAUSEBUTTON) { + player.executeScript(player.activeScript, true, true); + } + } else { + const root = Component.get(com.rootLayer); + const script = ScriptProvider.getByTriggerSpecific(ServerTriggerType_default.IF_BUTTON, comId, -1); + if (script) { + player.executeScript(ScriptRunner.init(script, player), root.overlay == false); + } else if (Environment_default.NODE_DEBUG) { + player.messageGame(`No trigger for [if_button,${com.comName}]`); + } + } + return true; + } +}; + +// src/lostcity/network/225/incoming/handler/IfPlayerDesignHandler.ts +var IfPlayerDesignHandler = class extends MessageHandler { + handle(message, player) { + const { gender, idkit, color } = message; + if (!player.allowDesign) { + return false; + } + if (gender > 1) { + return false; + } + let pass = true; + for (let i = 0; i < 7; i++) { + let type = i; + if (gender === 1) { + type += 7; + } + if (type == 8 && idkit[i] === -1) { + continue; + } + const idk = IdkType.get(idkit[i]); + if (!idk || idk.disable || idk.type != type) { + pass = false; + break; + } + } + if (!pass) { + return false; + } + for (let i = 0; i < 5; i++) { + if (color[i] >= Player.DESIGN_BODY_COLORS[i].length) { + pass = false; + break; + } + } + if (!pass) { + return false; + } + player.gender = gender; + player.body = idkit; + player.colors = color; + player.generateAppearance(InvType.WORN); + return true; + } +}; + +// src/lostcity/network/225/incoming/handler/InvButtonDHandler.ts +var InvButtonDHandler = class extends MessageHandler { + handle(message, player) { + const { component: comId, slot, targetSlot } = message; + const com = Component.get(comId); + if (typeof com === "undefined" || !player.isComponentVisible(com)) { + return false; + } + const listener = player.invListeners.find((l) => l.com === comId); + if (!listener) { + return false; + } + const inv = player.getInventoryFromListener(listener); + if (!inv || !inv.validSlot(slot) || !inv.get(slot) || !inv.validSlot(targetSlot)) { + return false; + } + if (player.delayed()) { + player.write(new UpdateInvPartial(comId, inv, slot, targetSlot)); + return false; + } + player.lastSlot = slot; + player.lastTargetSlot = targetSlot; + const dragTrigger = ScriptProvider.getByTrigger(ServerTriggerType_default.INV_BUTTOND, comId); + if (dragTrigger) { + const root = Component.get(com.rootLayer); + player.executeScript(ScriptRunner.init(dragTrigger, player), root.overlay == false); + } else if (Environment_default.NODE_DEBUG) { + player.messageGame(`No trigger for [inv_buttond,${com.comName}]`); + } + return true; + } +}; + +// src/lostcity/network/225/incoming/handler/MessagePrivateHandler.ts +var MessagePrivateHandler = class extends MessageHandler { + handle(message, player) { + return true; + } +}; + +// src/lostcity/network/225/incoming/handler/MessagePublicHandler.ts +var MessagePublicHandler = class extends MessageHandler { + handle(message, player) { + const { color, effect, input } = message; + if (color < 0 || color > 11 || effect < 0 || effect > 2 || input.length > 100) { + return false; + } + player.messageColor = color; + player.messageEffect = effect; + player.messageType = 0; + const out = Packet.alloc(0); + WordPack.pack(out, WordEnc.filter(input)); + player.message = new Uint8Array(out.pos); + out.pos = 0; + out.gdata(player.message, 0, player.message.length); + out.release(); + player.mask |= Player.CHAT; + return true; + } +}; + +// src/lostcity/network/225/incoming/handler/OpHeldHandler.ts +var OpHeldHandler = class extends MessageHandler { + handle(message, player) { + const { obj: item, slot, component: comId } = message; + const com = Component.get(comId); + if (typeof com === "undefined" || !player.isComponentVisible(com)) { + return false; + } + const type = ObjType.get(item); + if (message.op !== 5 && (type.iop && !type.iop[message.op - 1] || !type.iop)) { + return false; + } + const listener = player.invListeners.find((l) => l.com === comId); + if (!listener) { + return false; + } + const inv = player.getInventoryFromListener(listener); + if (!inv || !inv.validSlot(slot) || !inv.hasAt(slot, item)) { + return false; + } + if (player.delayed()) { + return false; + } + player.lastItem = item; + player.lastSlot = slot; + player.clearInteraction(); + player.closeModal(); + let trigger; + if (message.op === 1) { + trigger = ServerTriggerType_default.OPHELD1; + } else if (message.op === 2) { + trigger = ServerTriggerType_default.OPHELD2; + } else if (message.op === 3) { + trigger = ServerTriggerType_default.OPHELD3; + } else if (message.op === 4) { + trigger = ServerTriggerType_default.OPHELD4; + } else { + trigger = ServerTriggerType_default.OPHELD5; + } + const script = ScriptProvider.getByTrigger(trigger, type.id, type.category); + if (script) { + player.executeScript(ScriptRunner.init(script, player), true); + } else if (Environment_default.NODE_DEBUG) { + player.messageGame(`No trigger for [${ServerTriggerType_default.toString(trigger)},${type.debugname}]`); + } + return true; + } +}; + +// src/lostcity/network/225/incoming/handler/OpHeldTHandler.ts +var OpHeldTHandler = class extends MessageHandler { + handle(message, player) { + const { obj: item, slot, component: comId, spellComponent: spellComId } = message; + const com = Component.get(comId); + if (typeof com === "undefined" || !player.isComponentVisible(com)) { + player.unsetMapFlag(); + return false; + } + const spellCom = Component.get(comId); + if (typeof spellCom === "undefined" || !player.isComponentVisible(spellCom)) { + player.unsetMapFlag(); + return false; + } + const listener = player.invListeners.find((l) => l.com === comId); + if (!listener) { + player.unsetMapFlag(); + return false; + } + const inv = player.getInventoryFromListener(listener); + if (!inv || !inv.validSlot(slot) || !inv.hasAt(slot, item)) { + player.unsetMapFlag(); + return false; + } + if (player.delayed()) { + player.unsetMapFlag(); + return false; + } + player.lastItem = item; + player.lastSlot = slot; + player.clearInteraction(); + player.closeModal(); + const script = ScriptProvider.getByTrigger(ServerTriggerType_default.OPHELDT, spellComId, -1); + if (script) { + player.executeScript(ScriptRunner.init(script, player), true); + } else { + if (Environment_default.NODE_DEBUG) { + player.messageGame(`No trigger for [opheldt,${spellCom.comName}]`); + } + player.messageGame("Nothing interesting happens."); + } + return true; + } +}; + +// src/lostcity/network/225/incoming/handler/OpHeldUHandler.ts +var OpHeldUHandler = class extends MessageHandler { + handle(message, player) { + const { obj: item, slot, component: comId, useObj: useItem, useSlot, useComponent: useComId } = message; + const com = Component.get(comId); + if (typeof com === "undefined" || !player.isComponentVisible(com)) { + player.unsetMapFlag(); + return false; + } + const useCom = Component.get(comId); + if (typeof useCom === "undefined" || !player.isComponentVisible(useCom)) { + player.unsetMapFlag(); + return false; + } + { + const listener = player.invListeners.find((l) => l.com === comId); + if (!listener) { + player.unsetMapFlag(); + return false; + } + const inv = player.getInventoryFromListener(listener); + if (!inv || !inv.validSlot(slot) || !inv.hasAt(slot, item)) { + player.unsetMapFlag(); + return false; + } + } + { + const listener = player.invListeners.find((l) => l.com === useComId); + if (!listener) { + player.unsetMapFlag(); + return false; + } + const inv = player.getInventoryFromListener(listener); + if (!inv || !inv.validSlot(useSlot) || !inv.hasAt(useSlot, useItem)) { + player.unsetMapFlag(); + return false; + } + } + if (player.delayed()) { + player.unsetMapFlag(); + return false; + } + player.lastItem = item; + player.lastSlot = slot; + player.lastUseItem = useItem; + player.lastUseSlot = useSlot; + const objType = ObjType.get(player.lastItem); + const useObjType = ObjType.get(player.lastUseItem); + if ((objType.members || useObjType.members) && !Environment_default.NODE_MEMBERS) { + player.messageGame("To use this item please login to a members' server."); + player.unsetMapFlag(); + return false; + } + let script = ScriptProvider.getByTriggerSpecific(ServerTriggerType_default.OPHELDU, objType.id, -1); + if (!script) { + script = ScriptProvider.getByTriggerSpecific(ServerTriggerType_default.OPHELDU, useObjType.id, -1); + [player.lastItem, player.lastUseItem] = [player.lastUseItem, player.lastItem]; + [player.lastSlot, player.lastUseSlot] = [player.lastUseSlot, player.lastSlot]; + } + const objCategory = objType.category !== -1 ? CategoryType.get(objType.category) : null; + if (!script && objCategory) { + script = ScriptProvider.getByTriggerSpecific(ServerTriggerType_default.OPHELDU, -1, objCategory.id); + } + const useObjCategory = useObjType.category !== -1 ? CategoryType.get(useObjType.category) : null; + if (!script && useObjCategory) { + script = ScriptProvider.getByTriggerSpecific(ServerTriggerType_default.OPHELDU, -1, useObjCategory.id); + [player.lastItem, player.lastUseItem] = [player.lastUseItem, player.lastItem]; + [player.lastSlot, player.lastUseSlot] = [player.lastUseSlot, player.lastSlot]; + } + player.clearInteraction(); + player.closeModal(); + if (script) { + player.executeScript(ScriptRunner.init(script, player), true); + } else { + if (Environment_default.NODE_DEBUG) { + player.messageGame(`No trigger for [opheldu,${objType.debugname}]`); + } + player.messageGame("Nothing interesting happens."); + } + return true; + } +}; + +// src/lostcity/network/225/incoming/handler/OpLocHandler.ts +var OpLocHandler = class extends MessageHandler { + handle(message, player) { + const { x, z, loc: locId } = message; + if (player.delayed()) { + player.unsetMapFlag(); + return false; + } + const absLeftX = player.originX - 52; + const absRightX = player.originX + 52; + const absTopZ = player.originZ + 52; + const absBottomZ = player.originZ - 52; + if (x < absLeftX || x > absRightX || z < absBottomZ || z > absTopZ) { + return false; + } + const loc = World_default.getLoc(x, z, player.level, locId); + if (!loc) { + player.unsetMapFlag(); + return false; + } + const locType = LocType.get(loc.type); + if (!locType.op || !locType.op[message.op - 1]) { + player.unsetMapFlag(); + return false; + } + let mode; + if (message.op === 1) { + mode = ServerTriggerType_default.APLOC1; + } else if (message.op === 2) { + mode = ServerTriggerType_default.APLOC2; + } else if (message.op === 3) { + mode = ServerTriggerType_default.APLOC3; + } else if (message.op === 4) { + mode = ServerTriggerType_default.APLOC4; + } else { + mode = ServerTriggerType_default.APLOC5; + } + player.clearPendingAction(); + player.setInteraction(Interaction_default.ENGINE, loc, mode); + player.opcalled = true; + return true; + } +}; + +// src/lostcity/network/225/incoming/handler/OpLocTHandler.ts +var OpLocTHandler = class extends MessageHandler { + handle(message, player) { + const { x, z, loc: locId, spellComponent: spellComId } = message; + if (player.delayed()) { + player.unsetMapFlag(); + return false; + } + const spellCom = Component.get(spellComId); + if (typeof spellCom === "undefined" || !player.isComponentVisible(spellCom)) { + player.unsetMapFlag(); + return false; + } + const absLeftX = player.originX - 52; + const absRightX = player.originX + 52; + const absTopZ = player.originZ + 52; + const absBottomZ = player.originZ - 52; + if (x < absLeftX || x > absRightX || z < absBottomZ || z > absTopZ) { + player.unsetMapFlag(); + return false; + } + const loc = World_default.getLoc(x, z, player.level, locId); + if (!loc) { + player.unsetMapFlag(); + return false; + } + player.clearPendingAction(); + player.setInteraction(Interaction_default.ENGINE, loc, ServerTriggerType_default.APLOCT, { type: loc.type, com: spellComId }); + player.opcalled = true; + return true; + } +}; + +// src/lostcity/network/225/incoming/handler/OpLocUHandler.ts +var OpLocUHandler = class extends MessageHandler { + handle(message, player) { + const { x, z, loc: locId, useObj: item, useSlot: slot, useComponent: comId } = message; + if (player.delayed()) { + player.unsetMapFlag(); + return false; + } + const com = Component.get(comId); + if (typeof com === "undefined" || !player.isComponentVisible(com)) { + player.unsetMapFlag(); + return false; + } + const absLeftX = player.originX - 52; + const absRightX = player.originX + 52; + const absTopZ = player.originZ + 52; + const absBottomZ = player.originZ - 52; + if (x < absLeftX || x > absRightX || z < absBottomZ || z > absTopZ) { + player.unsetMapFlag(); + return false; + } + const listener = player.invListeners.find((l) => l.com === comId); + if (!listener) { + player.unsetMapFlag(); + return false; + } + const inv = player.getInventoryFromListener(listener); + if (!inv || !inv.validSlot(slot) || !inv.hasAt(slot, item)) { + player.unsetMapFlag(); + return false; + } + const loc = World_default.getLoc(x, z, player.level, locId); + if (!loc) { + player.unsetMapFlag(); + return false; + } + if (ObjType.get(item).members && !Environment_default.NODE_MEMBERS) { + player.messageGame("To use this item please login to a members' server."); + player.unsetMapFlag(); + return false; + } + player.lastUseItem = item; + player.lastUseSlot = slot; + player.clearPendingAction(); + player.setInteraction(Interaction_default.ENGINE, loc, ServerTriggerType_default.APLOCU); + player.opcalled = true; + return true; + } +}; + +// src/lostcity/network/225/incoming/handler/OpNpcHandler.ts +var OpNpcHandler = class extends MessageHandler { + handle(message, player) { + const { nid } = message; + if (player.delayed()) { + player.unsetMapFlag(); + return false; + } + const npc = World_default.getNpc(nid); + if (!npc || npc.delayed()) { + player.unsetMapFlag(); + return false; + } + if (!player.buildArea.npcs.has(npc.nid)) { + player.unsetMapFlag(); + return false; + } + const npcType = NpcType.get(npc.type); + if (!npcType.op || !npcType.op[message.op - 1]) { + player.unsetMapFlag(); + return false; + } + let mode; + if (message.op === 1) { + mode = ServerTriggerType_default.APNPC1; + } else if (message.op === 2) { + mode = ServerTriggerType_default.APNPC2; + } else if (message.op === 3) { + mode = ServerTriggerType_default.APNPC3; + } else if (message.op === 4) { + mode = ServerTriggerType_default.APNPC4; + } else { + mode = ServerTriggerType_default.APNPC5; + } + player.clearPendingAction(); + player.setInteraction(Interaction_default.ENGINE, npc, mode, { type: npc.type, com: -1 }); + player.opcalled = true; + return true; + } +}; + +// src/lostcity/network/225/incoming/handler/OpNpcTHandler.ts +var OpNpcTHandler = class extends MessageHandler { + handle(message, player) { + const { nid, spellComponent: spellComId } = message; + if (player.delayed()) { + player.unsetMapFlag(); + return false; + } + const spellCom = Component.get(spellComId); + if (typeof spellCom === "undefined" || !player.isComponentVisible(spellCom)) { + player.unsetMapFlag(); + return false; + } + const npc = World_default.getNpc(nid); + if (!npc || npc.delayed()) { + player.unsetMapFlag(); + return false; + } + if (!player.buildArea.npcs.has(npc.nid)) { + player.unsetMapFlag(); + return false; + } + player.clearPendingAction(); + player.setInteraction(Interaction_default.ENGINE, npc, ServerTriggerType_default.APNPCT, { type: npc.type, com: spellComId }); + player.opcalled = true; + return true; + } +}; + +// src/lostcity/network/225/incoming/handler/OpNpcUHandler.ts +var OpNpcUHandler = class extends MessageHandler { + handle(message, player) { + const { nid, useObj: item, useSlot: slot, useComponent: comId } = message; + if (player.delayed()) { + player.unsetMapFlag(); + return false; + } + const com = Component.get(comId); + if (typeof com === "undefined" || !player.isComponentVisible(com)) { + player.unsetMapFlag(); + return false; + } + const listener = player.invListeners.find((l) => l.com === comId); + if (!listener) { + player.unsetMapFlag(); + return false; + } + const inv = player.getInventoryFromListener(listener); + if (!inv || !inv.validSlot(slot) || !inv.hasAt(slot, item)) { + player.unsetMapFlag(); + return false; + } + const npc = World_default.getNpc(nid); + if (!npc || npc.delayed()) { + player.unsetMapFlag(); + return false; + } + if (!player.buildArea.npcs.has(npc.nid)) { + player.unsetMapFlag(); + return false; + } + if (ObjType.get(item).members && !Environment_default.NODE_MEMBERS) { + player.messageGame("To use this item please login to a members' server."); + player.unsetMapFlag(); + return false; + } + player.lastUseItem = item; + player.lastUseSlot = slot; + player.clearPendingAction(); + player.setInteraction(Interaction_default.ENGINE, npc, ServerTriggerType_default.APNPCU, { type: npc.type, com: -1 }); + player.opcalled = true; + return true; + } +}; + +// src/lostcity/network/225/incoming/handler/OpObjHandler.ts +var OpObjHandler = class extends MessageHandler { + handle(message, player) { + const { x, z, obj: objId } = message; + if (player.delayed()) { + player.unsetMapFlag(); + return false; + } + const absLeftX = player.originX - 52; + const absRightX = player.originX + 52; + const absTopZ = player.originZ + 52; + const absBottomZ = player.originZ - 52; + if (x < absLeftX || x > absRightX || z < absBottomZ || z > absTopZ) { + player.unsetMapFlag(); + return false; + } + const obj = World_default.getObj(x, z, player.level, objId, player.pid); + if (!obj) { + player.unsetMapFlag(); + return false; + } + const objType = ObjType.get(obj.type); + if (message.op === 1 && (objType.op && !objType.op[0] || !objType.op) || message.op === 4 && (objType.op && !objType.op[3] || !objType.op)) { + player.unsetMapFlag(); + return false; + } + let mode; + if (message.op === 1) { + mode = ServerTriggerType_default.APOBJ1; + } else if (message.op === 2) { + mode = ServerTriggerType_default.APOBJ2; + } else if (message.op === 3) { + mode = ServerTriggerType_default.APOBJ3; + } else if (message.op === 4) { + mode = ServerTriggerType_default.APOBJ4; + } else { + mode = ServerTriggerType_default.APOBJ5; + } + player.clearPendingAction(); + player.setInteraction(Interaction_default.ENGINE, obj, mode); + player.opcalled = true; + return true; + } +}; + +// src/lostcity/network/225/incoming/handler/OpObjTHandler.ts +var OpObjTHandler = class extends MessageHandler { + handle(message, player) { + const { x, z, obj: objId, spellComponent: spellComId } = message; + if (player.delayed()) { + player.unsetMapFlag(); + return false; + } + const spellCom = Component.get(spellComId); + if (typeof spellCom === "undefined" || !player.isComponentVisible(spellCom)) { + player.unsetMapFlag(); + return false; + } + const absLeftX = player.originX - 52; + const absRightX = player.originX + 52; + const absTopZ = player.originZ + 52; + const absBottomZ = player.originZ - 52; + if (x < absLeftX || x > absRightX || z < absBottomZ || z > absTopZ) { + player.unsetMapFlag(); + return false; + } + const obj = World_default.getObj(x, z, player.level, objId, player.pid); + if (!obj) { + player.unsetMapFlag(); + return false; + } + player.clearPendingAction(); + player.setInteraction(Interaction_default.ENGINE, obj, ServerTriggerType_default.APOBJT, { type: obj.type, com: spellComId }); + player.opcalled = true; + return true; + } +}; + +// src/lostcity/network/225/incoming/handler/OpObjUHandler.ts +var OpObjUHandler = class extends MessageHandler { + handle(message, player) { + const { x, z, obj: objId, useObj: item, useSlot: slot, useComponent: comId } = message; + if (player.delayed()) { + player.unsetMapFlag(); + return false; + } + const com = Component.get(comId); + if (typeof com === "undefined" || !player.isComponentVisible(com)) { + player.unsetMapFlag(); + return false; + } + const absLeftX = player.originX - 52; + const absRightX = player.originX + 52; + const absTopZ = player.originZ + 52; + const absBottomZ = player.originZ - 52; + if (x < absLeftX || x > absRightX || z < absBottomZ || z > absTopZ) { + player.unsetMapFlag(); + return false; + } + const listener = player.invListeners.find((l) => l.com === comId); + if (!listener) { + player.unsetMapFlag(); + return false; + } + const inv = player.getInventoryFromListener(listener); + if (!inv || !inv.validSlot(slot) || !inv.hasAt(slot, item)) { + player.unsetMapFlag(); + return false; + } + const obj = World_default.getObj(x, z, player.level, objId, player.pid); + if (!obj) { + player.unsetMapFlag(); + return false; + } + if (ObjType.get(item).members && !Environment_default.NODE_MEMBERS) { + player.messageGame("To use this item please login to a members' server."); + player.unsetMapFlag(); + return false; + } + player.lastUseItem = item; + player.lastUseSlot = slot; + player.clearPendingAction(); + player.setInteraction(Interaction_default.ENGINE, obj, ServerTriggerType_default.APOBJU); + player.opcalled = true; + return true; + } +}; + +// src/lostcity/network/225/incoming/handler/OpPlayerHandler.ts +var OpPlayerHandler = class extends MessageHandler { + handle(message, player) { + const { pid } = message; + if (player.delayed()) { + player.unsetMapFlag(); + return false; + } + const other = World_default.getPlayer(pid); + if (!other) { + player.unsetMapFlag(); + return false; + } + if (!player.buildArea.players.has(other.uid)) { + player.unsetMapFlag(); + return false; + } + let mode; + if (message.op === 1) { + mode = ServerTriggerType_default.APPLAYER1; + } else if (message.op === 2) { + mode = ServerTriggerType_default.APPLAYER2; + } else if (message.op === 3) { + mode = ServerTriggerType_default.APPLAYER3; + } else { + mode = ServerTriggerType_default.APPLAYER4; + } + player.clearPendingAction(); + player.setInteraction(Interaction_default.ENGINE, other, mode); + player.opcalled = true; + return true; + } +}; + +// src/lostcity/network/225/incoming/handler/OpPlayerTHandler.ts +var OpPlayerTHandler = class extends MessageHandler { + handle(message, player) { + const { pid, spellComponent: spellComId } = message; + if (player.delayed()) { + player.unsetMapFlag(); + return false; + } + const spellCom = Component.get(spellComId); + if (typeof spellCom === "undefined" || !player.isComponentVisible(spellCom)) { + player.unsetMapFlag(); + return false; + } + const other = World_default.getPlayer(pid); + if (!other) { + player.unsetMapFlag(); + return false; + } + if (!player.buildArea.players.has(other.uid)) { + player.unsetMapFlag(); + return false; + } + player.clearPendingAction(); + player.setInteraction(Interaction_default.ENGINE, other, ServerTriggerType_default.APPLAYERT, { type: -1, com: spellComId }); + player.opcalled = true; + return true; + } +}; + +// src/lostcity/network/225/incoming/handler/OpPlayerUHandler.ts +var OpPlayerUHandler = class extends MessageHandler { + handle(message, player) { + const { pid, useObj: item, useSlot: slot, useComponent: comId } = message; + if (player.delayed()) { + player.unsetMapFlag(); + return false; + } + const com = Component.get(comId); + if (typeof com === "undefined" || !player.isComponentVisible(com)) { + player.unsetMapFlag(); + return false; + } + const listener = player.invListeners.find((l) => l.com === comId); + if (!listener) { + player.unsetMapFlag(); + return false; + } + const inv = player.getInventoryFromListener(listener); + if (!inv || !inv.validSlot(slot) || !inv.hasAt(slot, item)) { + player.unsetMapFlag(); + return false; + } + const other = World_default.getPlayer(pid); + if (!other) { + player.unsetMapFlag(); + return false; + } + if (!player.buildArea.players.has(other.uid)) { + player.unsetMapFlag(); + return false; + } + if (ObjType.get(item).members && !Environment_default.NODE_MEMBERS) { + player.messageGame("To use this item please login to a members' server."); + player.unsetMapFlag(); + return false; + } + player.lastUseSlot = slot; + player.clearPendingAction(); + player.setInteraction(Interaction_default.ENGINE, other, ServerTriggerType_default.APPLAYERU, { type: item, com: -1 }); + player.opcalled = true; + return true; + } +}; + +// src/lostcity/network/225/incoming/handler/RebuildGetMapsHandler.ts +var RebuildGetMapsHandler = class extends MessageHandler { + handle(message, player) { + const { maps: requested } = message; + for (let i = 0; i < requested.length; i++) { + const { type, x, z } = requested[i]; + const CHUNK_SIZE = 1e3 - 1 - 2 - 1 - 1 - 2 - 2; + if (type == 0) { + const land = PRELOADED.get(`m${x}_${z}`); + if (!land) { + continue; + } + for (let off = 0; off < land.length; off += CHUNK_SIZE) { + player.write(new DataLand(x, z, off, land.length, land.subarray(off, off + CHUNK_SIZE))); + } + player.write(new DataLandDone(x, z)); + } else if (type == 1) { + const loc = PRELOADED.get(`l${x}_${z}`); + if (!loc) { + continue; + } + for (let off = 0; off < loc.length; off += CHUNK_SIZE) { + player.write(new DataLoc(x, z, off, loc.length, loc.subarray(off, off + CHUNK_SIZE))); + } + player.write(new DataLocDone(x, z)); + } + } + return true; + } +}; + +// src/lostcity/network/225/incoming/handler/ResumePauseButtonHandler.ts +var ResumePauseButtonHandler = class extends MessageHandler { + handle(_message, player) { + if (!player.activeScript || player.activeScript.execution !== ScriptState.PAUSEBUTTON) { + return false; + } + player.executeScript(player.activeScript, true, true); + return true; + } +}; + +// src/lostcity/network/225/incoming/handler/ResumePCountDialogHandler.ts +var ResumePCountDialogHandler = class extends MessageHandler { + handle(message, player) { + const { input } = message; + if (!player.activeScript || player.activeScript.execution !== ScriptState.COUNTDIALOG) { + return false; + } + player.activeScript.lastInt = input; + player.executeScript(player.activeScript, true, true); + return true; + } +}; + +// src/lostcity/network/225/incoming/handler/TutorialClickSideHandler.ts +var TutorialClickSideHandler = class extends MessageHandler { + handle(message, player) { + const { tab } = message; + if (tab < 0 || tab > 13) { + return false; + } + const script = ScriptProvider.getByTriggerSpecific(ServerTriggerType_default.TUTORIAL, -1, -1); + if (script) { + player.executeScript(ScriptRunner.init(script, player), true); + } + return true; + } +}; + +// src/lostcity/network/incoming/model/MoveClick.ts +var MoveClick = class extends IncomingMessage { + constructor(path4, ctrlHeld, opClick) { + super(); + this.path = path4; + this.ctrlHeld = ctrlHeld; + this.opClick = opClick; + } + category = ClientProtCategory.USER_EVENT; +}; + +// src/lostcity/network/225/incoming/codec/MoveClickDecoder.ts +var MoveClickDecoder = class extends MessageDecoder { + constructor(prot) { + super(); + this.prot = prot; + } + decode(buf) { + const ctrlHeld = buf.g1(); + const startX = buf.g2(); + const startZ = buf.g2(); + const offset = this.prot === ClientProt.MOVE_MINIMAPCLICK ? 14 : 0; + const waypoints = buf.available - offset >> 1; + const path4 = [ + { x: startX, z: startZ } + ]; + for (let index = 1; index <= waypoints && index < 25; index++) { + path4.push({ + x: startX + buf.g1b(), + z: startZ + buf.g1b() + }); + } + return new MoveClick(path4, ctrlHeld, this.prot === ClientProt.MOVE_OPCLICK); + } +}; + +// src/lostcity/network/225/incoming/handler/MoveClickHandler.ts +var MoveClickHandler = class extends MessageHandler { + handle(message, player) { + const start = message.path[0]; + if (player.delayed() || message.ctrlHeld < 0 || message.ctrlHeld > 1 || Position.distanceToSW(player, { x: start.x, z: start.z }) > 104) { + player.unsetMapFlag(); + player.userPath = []; + return false; + } + if (Environment_default.NODE_CLIENT_ROUTEFINDER) { + player.userPath = []; + for (let i = 0; i < message.path.length; i++) { + player.userPath[i] = Position.packCoord(player.level, message.path[i].x, message.path[i].z); + } + } else { + const dest = message.path[message.path.length - 1]; + player.userPath = [Position.packCoord(player.level, dest.x, dest.z)]; + } + player.interactWalkTrigger = false; + if (!message.opClick) { + player.clearInteraction(); + player.closeModal(); + } + if (player.runenergy < 100) { + player.setVar(VarPlayerType.TEMP_RUN, 0); + } else { + player.setVar(VarPlayerType.TEMP_RUN, message.ctrlHeld); + } + return true; + } +}; + +// src/lostcity/network/225/incoming/prot/ClientProtRepository.ts +var ClientProtRepository = class { + decoders = /* @__PURE__ */ new Map(); + handlers = /* @__PURE__ */ new Map(); + bind(decoder, handler) { + if (this.decoders.has(decoder.prot.id)) { + throw new Error(`[ClientProtRepository] Already defines a ${decoder.prot.id}.`); + } + this.decoders.set(decoder.prot.id, decoder); + if (handler) { + this.handlers.set(decoder.prot.id, handler); + } + } + constructor() { + this.bind(new ClientCheatDecoder(), new ClientCheatHandler()); + this.bind(new CloseModalDecoder(), new CloseModalHandler()); + this.bind(new IdleTimerDecoder(), new IdleTimerHandler()); + this.bind(new IfButtonDecoder(), new IfButtonHandler()); + this.bind(new IfPlayerDesignDecoder(), new IfPlayerDesignHandler()); + this.bind(new InvButtonDecoder(ClientProt.INV_BUTTON1, 1), new InvButtonHandler()); + this.bind(new InvButtonDecoder(ClientProt.INV_BUTTON2, 2), new InvButtonHandler()); + this.bind(new InvButtonDecoder(ClientProt.INV_BUTTON3, 3), new InvButtonHandler()); + this.bind(new InvButtonDecoder(ClientProt.INV_BUTTON4, 4), new InvButtonHandler()); + this.bind(new InvButtonDecoder(ClientProt.INV_BUTTON5, 5), new InvButtonHandler()); + this.bind(new InvButtonDDecoder(), new InvButtonDHandler()); + this.bind(new MessagePrivateDecoder(), new MessagePrivateHandler()); + this.bind(new MessagePublicDecoder(), new MessagePublicHandler()); + this.bind(new MoveClickDecoder(ClientProt.MOVE_GAMECLICK), new MoveClickHandler()); + this.bind(new MoveClickDecoder(ClientProt.MOVE_OPCLICK), new MoveClickHandler()); + this.bind(new MoveClickDecoder(ClientProt.MOVE_MINIMAPCLICK), new MoveClickHandler()); + this.bind(new OpHeldDecoder(ClientProt.OPHELD1, 1), new OpHeldHandler()); + this.bind(new OpHeldDecoder(ClientProt.OPHELD2, 2), new OpHeldHandler()); + this.bind(new OpHeldDecoder(ClientProt.OPHELD3, 3), new OpHeldHandler()); + this.bind(new OpHeldDecoder(ClientProt.OPHELD4, 4), new OpHeldHandler()); + this.bind(new OpHeldDecoder(ClientProt.OPHELD5, 5), new OpHeldHandler()); + this.bind(new OpHeldTDecoder(), new OpHeldTHandler()); + this.bind(new OpHeldUDecoder(), new OpHeldUHandler()); + this.bind(new OpLocDecoder(ClientProt.OPLOC1, 1), new OpLocHandler()); + this.bind(new OpLocDecoder(ClientProt.OPLOC2, 2), new OpLocHandler()); + this.bind(new OpLocDecoder(ClientProt.OPLOC3, 3), new OpLocHandler()); + this.bind(new OpLocDecoder(ClientProt.OPLOC4, 4), new OpLocHandler()); + this.bind(new OpLocDecoder(ClientProt.OPLOC5, 5), new OpLocHandler()); + this.bind(new OpLocTDecoder(), new OpLocTHandler()); + this.bind(new OpLocUDecoder(), new OpLocUHandler()); + this.bind(new OpNpcDecoder(ClientProt.OPNPC1, 1), new OpNpcHandler()); + this.bind(new OpNpcDecoder(ClientProt.OPNPC2, 2), new OpNpcHandler()); + this.bind(new OpNpcDecoder(ClientProt.OPNPC3, 3), new OpNpcHandler()); + this.bind(new OpNpcDecoder(ClientProt.OPNPC4, 4), new OpNpcHandler()); + this.bind(new OpNpcDecoder(ClientProt.OPNPC5, 5), new OpNpcHandler()); + this.bind(new OpNpcTDecoder(), new OpNpcTHandler()); + this.bind(new OpNpcUDecoder(), new OpNpcUHandler()); + this.bind(new OpObjDecoder(ClientProt.OPOBJ1, 1), new OpObjHandler()); + this.bind(new OpObjDecoder(ClientProt.OPOBJ2, 2), new OpObjHandler()); + this.bind(new OpObjDecoder(ClientProt.OPOBJ3, 3), new OpObjHandler()); + this.bind(new OpObjDecoder(ClientProt.OPOBJ4, 4), new OpObjHandler()); + this.bind(new OpObjDecoder(ClientProt.OPOBJ5, 5), new OpObjHandler()); + this.bind(new OpObjTDecoder(), new OpObjTHandler()); + this.bind(new OpObjUDecoder(), new OpObjUHandler()); + this.bind(new OpPlayerDecoder(ClientProt.OPPLAYER1, 1), new OpPlayerHandler()); + this.bind(new OpPlayerDecoder(ClientProt.OPPLAYER2, 2), new OpPlayerHandler()); + this.bind(new OpPlayerDecoder(ClientProt.OPPLAYER3, 3), new OpPlayerHandler()); + this.bind(new OpPlayerDecoder(ClientProt.OPPLAYER4, 4), new OpPlayerHandler()); + this.bind(new OpPlayerTDecoder(), new OpPlayerTHandler()); + this.bind(new OpPlayerUDecoder(), new OpPlayerUHandler()); + this.bind(new RebuildGetMapsDecoder(), new RebuildGetMapsHandler()); + this.bind(new ResumePauseButtonDecoder(), new ResumePauseButtonHandler()); + this.bind(new ResumePCountDialogDecoder(), new ResumePCountDialogHandler()); + this.bind(new TutorialClickSideDecoder(), new TutorialClickSideHandler()); + } + getDecoder(prot) { + return this.decoders.get(prot.id); + } + getHandler(prot) { + return this.handlers.get(prot.id); + } +}; +var ClientProtRepository_default = new ClientProtRepository(); + +// src/lostcity/entity/NetworkPlayer.ts +var NetworkPlayer = class extends Player { + client = null; + userPath = []; + opcalled = false; + constructor(username, username37, client) { + super(username, username37); + this.client = client; + this.client.player = this; + } + decodeIn() { + this.userPath = []; + this.opcalled = false; + if (this.client === null) { + return; + } + let offset = 0; + this.lastResponse = World_default.currentTick; + World_default.cycleStats[WorldStat_default.BANDWIDTH_IN] += this.client.inOffset; + while (this.client.inOffset > offset) { + const packetType = ClientProt.byId[this.client.in[offset++]]; + let length = packetType.length; + if (length == -1) { + length = this.client.in[offset++]; + } else if (length == -2) { + length = this.client.in[offset++] << 8 | this.client.in[offset++]; + } + const data = new Packet(this.client.in.slice(offset, offset + length)); + offset += length; + const decoder = ClientProtRepository_default.getDecoder(packetType); + if (decoder) { + const message = decoder.decode(data); + const handler = ClientProtRepository_default.getHandler(packetType); + if (handler) { + handler.handle(message, this); + } + } + } + this.client?.reset(); + } + encodeOut() { + if (!this.client) { + return; + } + if (this.modalTop !== this.lastModalTop || this.modalBottom !== this.lastModalBottom || this.modalSidebar !== this.lastModalSidebar || this.refreshModalClose) { + if (this.refreshModalClose) { + this.write(new IfClose()); + } + this.refreshModalClose = false; + this.lastModalTop = this.modalTop; + this.lastModalBottom = this.modalBottom; + this.lastModalSidebar = this.modalSidebar; + } + if (this.refreshModal) { + if ((this.modalState & 1) === 1 && (this.modalState & 4) === 4) { + this.write(new IfOpenMainSideModal(this.modalTop, this.modalSidebar)); + } else if ((this.modalState & 1) === 1) { + this.write(new IfOpenMainModal(this.modalTop)); + } else if ((this.modalState & 2) === 2) { + this.write(new IfOpenChatModal(this.modalBottom)); + } else if ((this.modalState & 4) === 4) { + this.write(new IfOpenSideModal(this.modalSidebar)); + } + this.refreshModal = false; + } + for (let message = this.highPriorityOut.head(); message; message = this.highPriorityOut.next()) { + this.writeInner(message); + message.uncache(); + } + for (let message = this.lowPriorityOut.head(); message; message = this.lowPriorityOut.next()) { + this.writeInner(message); + message.uncache(); + } + this.client.flush(); + } + writeInner(message) { + const client = this.client; + if (!client) { + return; + } + const encoder = ServerProtRepository_default.getEncoder(message); + if (!encoder) { + console.error("No encoder for message", message); + return; + } + const prot = encoder.prot; + const buf = client.out; + const test = 1 + (prot.length === -1 ? 1 : prot.length === -2 ? 2 : 0) + encoder.test(message); + if (buf.pos + test >= buf.length) { + client.flush(); + } + const pos = buf.pos; + buf.p1(prot.id); + if (prot.length === -1) { + buf.pos += 1; + } else if (prot.length === -2) { + buf.pos += 2; + } + const start = buf.pos; + encoder.encode(buf, message); + if (prot.length === -1) { + buf.psize1(buf.pos - start); + } else if (prot.length === -2) { + buf.psize2(buf.pos - start); + } + if (client.encryptor) { + buf.data[pos] = buf.data[pos] + client.encryptor.nextInt() & 255; + } + World_default.cycleStats[WorldStat_default.BANDWIDTH_OUT] += buf.pos - pos; + } + logout() { + this.writeInner(new Logout()); + this.client?.flush(); + } + terminate() { + this.client?.terminate(); + this.client = null; + } + playerLog(message, ...args) { + if (typeof self !== "undefined") { + return; + } + if (args.length > 0) { + fs25.appendFileSync(`data/players/${this.username}.log`, `[${(/* @__PURE__ */ new Date()).toISOString().split("T")[0]} ${this.client?.remoteAddress}]: ${message} ${args.join(" ")} +`); + } else { + fs25.appendFileSync(`data/players/${this.username}.log`, `[${(/* @__PURE__ */ new Date()).toISOString().split("T")[0]} ${this.client?.remoteAddress}]: ${message} +`); + } + } + updateMap() { + const loadedZones = this.buildArea.loadedZones; + const activeZones = this.buildArea.activeZones; + const reloadLeftX = Position.zone(this.originX) - 4 << 3; + const reloadRightX = Position.zone(this.originX) + 5 << 3; + const reloadTopZ = Position.zone(this.originZ) + 5 << 3; + const reloadBottomZ = Position.zone(this.originZ) - 4 << 3; + if (this.x < reloadLeftX || this.z < reloadBottomZ || this.x > reloadRightX - 1 || this.z > reloadTopZ - 1) { + this.write(new RebuildNormal(Position.zone(this.x), Position.zone(this.z))); + this.originX = this.x; + this.originZ = this.z; + loadedZones.clear(); + } + for (let info = this.cameraPackets.head(); info !== null; info = this.cameraPackets.next()) { + const localX = info.camX - Position.zoneOrigin(this.originX); + const localZ = info.camZ - Position.zoneOrigin(this.originZ); + if (info.type === ServerProt.CAM_MOVETO) { + this.write(new CamMoveTo(localX, localZ, info.height, info.rotationSpeed, info.rotationMultiplier)); + } else if (info.type === ServerProt.CAM_LOOKAT) { + this.write(new CamLookAt(localX, localZ, info.height, info.rotationSpeed, info.rotationMultiplier)); + } + info.unlink(); + } + if (this.moveSpeed === MoveSpeed_default.INSTANT && this.jump) { + loadedZones.clear(); + } + activeZones.clear(); + const centerX = Position.zone(this.x); + const centerZ = Position.zone(this.z); + const leftX = Position.zone(this.originX) - 6; + const rightX = Position.zone(this.originX) + 6; + const topZ = Position.zone(this.originZ) + 6; + const bottomZ = Position.zone(this.originZ) - 6; + for (let x = centerX - 3; x <= centerX + 3; x++) { + for (let z = centerZ - 3; z <= centerZ + 3; z++) { + if (x < leftX || x > rightX || z > topZ || z < bottomZ) { + continue; + } + activeZones.add(ZoneMap.zoneIndex(x << 3, z << 3, this.level)); + } + } + const mapZone = Position.packCoord(0, this.x >> 6 << 6, this.z >> 6 << 6); + if (this.lastMapZone !== mapZone) { + if (this.lastMapZone !== -1) { + const { x, z } = Position.unpackCoord(this.lastMapZone); + this.triggerMapzoneExit(x, z); + } + this.triggerMapzone(this.x >> 6 << 6, this.z >> 6 << 6); + this.lastMapZone = mapZone; + } + const zone = Position.packCoord(this.level, this.x >> 3 << 3, this.z >> 3 << 3); + if (this.lastZone !== zone) { + if (this.lastZone !== -1) { + const { level, x, z } = Position.unpackCoord(this.lastZone); + this.triggerZoneExit(level, x, z); + } + this.triggerZone(this.level, this.x >> 3 << 3, this.z >> 3 << 3); + this.lastZone = zone; + } + } + updatePlayers() { + this.write(new PlayerInfo(this.buildArea, this.level, this.x, this.z, this.originX, this.originZ, this.uid, this.mask, this.tele, this.jump, this.walkDir, this.runDir, Math.abs(this.lastX - this.x), Math.abs(this.lastZ - this.z), this.lastLevel !== this.level)); + } + updateNpcs() { + this.write(new NpcInfo(this.buildArea, this.level, this.x, this.z, this.originX, this.originZ, Math.abs(this.lastX - this.x), Math.abs(this.lastZ - this.z), this.lastLevel !== this.level)); + } + updateZones() { + const loadedZones = this.buildArea.loadedZones; + const activeZones = this.buildArea.activeZones; + for (const zoneIndex of loadedZones) { + if (!activeZones.has(zoneIndex)) { + loadedZones.delete(zoneIndex); + } + } + for (const zoneIndex of activeZones) { + const zone = World_default.getZoneIndex(zoneIndex); + if (!loadedZones.has(zone.index)) { + zone.writeFullFollows(this); + } else { + zone.writePartialEncloses(this); + zone.writePartialFollows(this); + } + loadedZones.add(zone.index); + } + } + updateStats() { + for (let i = 0; i < this.stats.length; i++) { + if (this.stats[i] !== this.lastStats[i] || this.levels[i] !== this.lastLevels[i]) { + this.write(new UpdateStat(i, this.stats[i], this.levels[i])); + this.lastStats[i] = this.stats[i]; + this.lastLevels[i] = this.levels[i]; + } + } + if (Math.floor(this.runenergy) / 100 !== Math.floor(this.lastRunEnergy) / 100) { + this.write(new UpdateRunEnergy(this.runenergy)); + this.lastRunEnergy = this.runenergy; + } + } + // todo: partial updates + updateInvs() { + let runWeightChanged = false; + let firstSeen = false; + for (let i = 0; i < this.invListeners.length; i++) { + const listener = this.invListeners[i]; + if (!listener) { + continue; + } + if (listener.source === -1) { + const inv = World_default.getInventory(listener.type); + if (!inv) { + continue; + } + if (inv.update || listener.firstSeen) { + this.write(new UpdateInvFull(listener.com, inv)); + listener.firstSeen = false; + } + } else { + const player = World_default.getPlayerByUid(listener.source); + if (!player) { + continue; + } + const inv = player.getInventory(listener.type); + if (!inv) { + continue; + } + if (inv.update || listener.firstSeen) { + this.write(new UpdateInvFull(listener.com, inv)); + if (listener.firstSeen) { + firstSeen = true; + } + listener.firstSeen = false; + const invType = InvType.get(listener.type); + if (invType.runweight) { + runWeightChanged = true; + } + } + } + } + if (runWeightChanged) { + const current = this.runweight; + this.calculateRunWeight(); + runWeightChanged = current !== this.runweight; + } + if (runWeightChanged || firstSeen) { + this.write(new UpdateRunWeight(Math.ceil(this.runweight / 1e3))); + } + } +}; +function isNetworkPlayer(player) { + return player.client !== null && player.client !== void 0; +} + +// src/lostcity/entity/CameraInfo.ts +var CameraInfo = class extends Linkable { + type; + camX; + camZ; + height; + rotationSpeed; + rotationMultiplier; + constructor(type, camX, camZ, height, rotationSpeed, rotationMultiplier) { + super(); + this.type = type; + this.camX = camX; + this.camZ = camZ; + this.height = height; + this.rotationSpeed = rotationSpeed; + this.rotationMultiplier = rotationMultiplier; + } +}; + +// src/lostcity/util/ColorConversion.ts +var ColorConversion = class _ColorConversion { + static hsl24to16(hue, saturation, lightness) { + if (lightness > 243) { + saturation >>= 4; + } else if (lightness > 217) { + saturation >>= 3; + } else if (lightness > 192) { + saturation >>= 2; + } else if (lightness > 179) { + saturation >>= 1; + } + return ((hue & 255) >> 2 << 10) + (saturation >> 5 << 7) + (lightness >> 1); + } + static rgb15to24(rgb) { + const r = rgb >> 10 & 31; + const g = rgb >> 5 & 31; + const b = rgb & 31; + return (r << 3 << 16) + (g << 3 << 8) + (b << 3); + } + static rgb15toHsl16(rgb) { + const r = rgb >> 10 & 31; + const g = rgb >> 5 & 31; + const b = rgb & 31; + const red = r / 31; + const green = g / 31; + const blue = b / 31; + return _ColorConversion.rgbToHsl(red, green, blue); + } + static rgb24to15(rgb) { + const r = rgb >> 16 & 255; + const g = rgb >> 8 & 255; + const b = rgb & 255; + return (r >> 3 << 10) + (g >> 3 << 5) + (b >> 3); + } + static rgb24toHsl16(rgb) { + const r = rgb >> 16 & 255; + const g = rgb >> 8 & 255; + const b = rgb & 255; + const red = r / 256; + const green = g / 256; + const blue = b / 256; + return _ColorConversion.rgbToHsl(red, green, blue); + } + static rgbToHsl(red, green, blue) { + let min = red; + if (green < min) { + min = green; + } + if (blue < min) { + min = blue; + } + let max = red; + if (green > max) { + max = green; + } + if (blue > max) { + max = blue; + } + let hNorm = 0; + let sNorm = 0; + const lNorm = (min + max) / 2; + if (min !== max) { + if (lNorm < 0.5) { + sNorm = (max - min) / (max + min); + } else if (lNorm >= 0.5) { + sNorm = (max - min) / (2 - max - min); + } + if (red === max) { + hNorm = (green - blue) / (max - min); + } else if (green === max) { + hNorm = (blue - red) / (max - min) + 2; + } else if (blue === max) { + hNorm = (red - green) / (max - min) + 4; + } + } + hNorm /= 6; + const hue = hNorm * 256 | 0; + let saturation = sNorm * 256 | 0; + let lightness = lNorm * 256 | 0; + if (saturation < 0) { + saturation = 0; + } else if (saturation > 255) { + saturation = 255; + } + if (lightness < 0) { + lightness = 0; + } else if (lightness > 255) { + lightness = 255; + } + return _ColorConversion.hsl24to16(hue, saturation, lightness); + } + static RGB15_HSL16 = new Int32Array(32768); + static { + for (let rgb = 0; rgb < 32768; rgb++) { + _ColorConversion.RGB15_HSL16[rgb] = _ColorConversion.rgb15toHsl16(rgb); + } + } + static reverseHsl(hsl) { + const possible = []; + for (let rgb = 0; rgb < 32768; rgb++) { + if (_ColorConversion.RGB15_HSL16[rgb] === hsl) { + possible.push(rgb); + } + } + return possible; + } +}; + +// src/lostcity/engine/script/handlers/PlayerOps.ts +var PlayerOps = { + [ScriptOpcode_default.FINDUID]: (state) => { + const uid = state.popInt(); + const player = World_default.getPlayerByUid(uid); + if (!player) { + state.pushInt(0); + return; + } + state.activePlayer = player; + state.pointerAdd(ActivePlayer[state.intOperand]); + state.pushInt(1); + }, + [ScriptOpcode_default.P_FINDUID]: (state) => { + const uid = state.popInt() >>> 0; + const player = World_default.getPlayerByUid(uid); + if (state.pointerGet(ProtectedActivePlayer[state.intOperand]) && state.activePlayer.uid === uid) { + state.pushInt(1); + return; + } + if (!player || !player.canAccess()) { + state.pushInt(0); + return; + } + state.activePlayer = player; + state.pointerAdd(ActivePlayer[state.intOperand]); + state.pointerAdd(ProtectedActivePlayer[state.intOperand]); + state.pushInt(1); + }, + [ScriptOpcode_default.STRONGQUEUE]: checkedHandler(ActivePlayer, (state) => { + const args = popScriptArgs(state); + const delay = check(state.popInt(), NumberNotNull); + const scriptId = state.popInt(); + const script = ScriptProvider.get(scriptId); + if (!script) { + throw new Error(`Unable to find queue script: ${scriptId}`); + } + state.activePlayer.enqueueScript(script, 3 /* STRONG */, delay, args); + }), + [ScriptOpcode_default.WEAKQUEUE]: checkedHandler(ActivePlayer, (state) => { + const args = popScriptArgs(state); + const delay = check(state.popInt(), NumberNotNull); + const scriptId = state.popInt(); + const script = ScriptProvider.get(scriptId); + if (!script) { + throw new Error(`Unable to find queue script: ${scriptId}`); + } + state.activePlayer.enqueueScript(script, 2 /* WEAK */, delay, args); + }), + [ScriptOpcode_default.QUEUE]: checkedHandler(ActivePlayer, (state) => { + const args = popScriptArgs(state); + const delay = check(state.popInt(), NumberNotNull); + const scriptId = state.popInt(); + const script = ScriptProvider.get(scriptId); + if (!script) { + throw new Error(`Unable to find queue script: ${scriptId}`); + } + state.activePlayer.enqueueScript(script, 0 /* NORMAL */, delay, args); + }), + [ScriptOpcode_default.ANIM]: checkedHandler(ActivePlayer, (state) => { + const delay = state.popInt(); + const seq = state.popInt(); + state.activePlayer.playAnimation(seq, delay); + }), + [ScriptOpcode_default.BUFFER_FULL]: checkedHandler(ActivePlayer, (state) => { + throw new Error("unimplemented"); + }), + [ScriptOpcode_default.BUILDAPPEARANCE]: checkedHandler(ActivePlayer, (state) => { + state.activePlayer.generateAppearance(check(state.popInt(), InvTypeValid).id); + }), + [ScriptOpcode_default.CAM_LOOKAT]: checkedHandler(ActivePlayer, (state) => { + const [coord, height, rotationSpeed, rotationMultiplier] = state.popInts(4); + const pos = check(coord, CoordValid); + state.activePlayer.cameraPackets.addTail(new CameraInfo(ServerProt.CAM_LOOKAT, pos.x, pos.z, height, rotationSpeed, rotationMultiplier)); + }), + [ScriptOpcode_default.CAM_MOVETO]: checkedHandler(ActivePlayer, (state) => { + const [coord, height, rotationSpeed, rotationMultiplier] = state.popInts(4); + const pos = check(coord, CoordValid); + state.activePlayer.cameraPackets.addTail(new CameraInfo(ServerProt.CAM_MOVETO, pos.x, pos.z, height, rotationSpeed, rotationMultiplier)); + }), + [ScriptOpcode_default.CAM_SHAKE]: checkedHandler(ActivePlayer, (state) => { + const [type, jitter, amplitude, frequency] = state.popInts(4); + state.activePlayer.write(new CamShake(type, jitter, amplitude, frequency)); + }), + [ScriptOpcode_default.CAM_RESET]: checkedHandler(ActivePlayer, (state) => { + state.activePlayer.write(new CamReset()); + }), + [ScriptOpcode_default.COORD]: checkedHandler(ActivePlayer, (state) => { + const position = state.activePlayer; + state.pushInt(Position.packCoord(position.level, position.x, position.z)); + }), + [ScriptOpcode_default.DISPLAYNAME]: checkedHandler(ActivePlayer, (state) => { + state.pushString(state.activePlayer.displayName); + }), + [ScriptOpcode_default.FACESQUARE]: checkedHandler(ActivePlayer, (state) => { + const pos = check(state.popInt(), CoordValid); + state.activePlayer.faceSquare(pos.x, pos.z); + }), + [ScriptOpcode_default.IF_CLOSE]: checkedHandler(ActivePlayer, (state) => { + state.activePlayer.closeModal(); + }), + [ScriptOpcode_default.LAST_COM]: (state) => { + state.pushInt(state.activePlayer.lastCom); + }, + // todo: move out of PlayerOps + [ScriptOpcode_default.LAST_INT]: (state) => { + state.pushInt(state.lastInt); + }, + [ScriptOpcode_default.LAST_ITEM]: (state) => { + const allowedTriggers = [ + ServerTriggerType_default.OPHELD1, + ServerTriggerType_default.OPHELD2, + ServerTriggerType_default.OPHELD3, + ServerTriggerType_default.OPHELD4, + ServerTriggerType_default.OPHELD5, + ServerTriggerType_default.OPHELDU, + ServerTriggerType_default.OPHELDT, + ServerTriggerType_default.INV_BUTTON1, + ServerTriggerType_default.INV_BUTTON2, + ServerTriggerType_default.INV_BUTTON3, + ServerTriggerType_default.INV_BUTTON4, + ServerTriggerType_default.INV_BUTTON5 + ]; + if (!allowedTriggers.includes(state.trigger)) { + throw new Error("is not safe to use in this trigger"); + } + state.pushInt(state.activePlayer.lastItem); + }, + [ScriptOpcode_default.LAST_SLOT]: (state) => { + const allowedTriggers = [ + ServerTriggerType_default.OPHELD1, + ServerTriggerType_default.OPHELD2, + ServerTriggerType_default.OPHELD3, + ServerTriggerType_default.OPHELD4, + ServerTriggerType_default.OPHELD5, + ServerTriggerType_default.OPHELDU, + ServerTriggerType_default.OPHELDT, + ServerTriggerType_default.INV_BUTTON1, + ServerTriggerType_default.INV_BUTTON2, + ServerTriggerType_default.INV_BUTTON3, + ServerTriggerType_default.INV_BUTTON4, + ServerTriggerType_default.INV_BUTTON5, + ServerTriggerType_default.INV_BUTTOND + ]; + if (!allowedTriggers.includes(state.trigger)) { + throw new Error("is not safe to use in this trigger"); + } + state.pushInt(state.activePlayer.lastSlot); + }, + [ScriptOpcode_default.LAST_USEITEM]: (state) => { + const allowedTriggers = [ + ServerTriggerType_default.OPHELDU, + ServerTriggerType_default.APOBJU, + ServerTriggerType_default.APLOCU, + ServerTriggerType_default.APNPCU, + ServerTriggerType_default.APPLAYERU, + ServerTriggerType_default.OPOBJU, + ServerTriggerType_default.OPLOCU, + ServerTriggerType_default.OPNPCU, + ServerTriggerType_default.OPPLAYERU + ]; + if (!allowedTriggers.includes(state.trigger)) { + throw new Error("is not safe to use in this trigger"); + } + state.pushInt(state.activePlayer.lastUseItem); + }, + [ScriptOpcode_default.LAST_USESLOT]: (state) => { + const allowedTriggers = [ + ServerTriggerType_default.OPHELDU, + ServerTriggerType_default.APOBJU, + ServerTriggerType_default.APLOCU, + ServerTriggerType_default.APNPCU, + ServerTriggerType_default.APPLAYERU, + ServerTriggerType_default.OPOBJU, + ServerTriggerType_default.OPLOCU, + ServerTriggerType_default.OPNPCU, + ServerTriggerType_default.OPPLAYERU + ]; + if (!allowedTriggers.includes(state.trigger)) { + throw new Error("is not safe to use in this trigger"); + } + state.pushInt(state.activePlayer.lastUseSlot); + }, + [ScriptOpcode_default.MES]: checkedHandler(ActivePlayer, (state) => { + const message = state.popString(); + state.activePlayer.messageGame(message); + }), + [ScriptOpcode_default.NAME]: checkedHandler(ActivePlayer, (state) => { + state.pushString(state.activePlayer.username); + }), + [ScriptOpcode_default.P_APRANGE]: checkedHandler(ProtectedActivePlayer, (state) => { + state.activePlayer.apRange = check(state.popInt(), NumberNotNull); + state.activePlayer.apRangeCalled = true; + }), + [ScriptOpcode_default.P_ARRIVEDELAY]: checkedHandler(ProtectedActivePlayer, (state) => { + if (state.activePlayer.lastMovement < World_default.currentTick) { + return; + } + state.activePlayer.delay = 1; + state.execution = ScriptState.SUSPENDED; + }), + [ScriptOpcode_default.P_COUNTDIALOG]: checkedHandler(ProtectedActivePlayer, (state) => { + state.activePlayer.write(new PCountDialog()); + state.execution = ScriptState.COUNTDIALOG; + }), + [ScriptOpcode_default.P_DELAY]: checkedHandler(ProtectedActivePlayer, (state) => { + state.activePlayer.delay = check(state.popInt(), NumberNotNull) + 1; + state.execution = ScriptState.SUSPENDED; + }), + [ScriptOpcode_default.P_OPHELD]: checkedHandler(ProtectedActivePlayer, (state) => { + throw new Error("unimplemented"); + }), + [ScriptOpcode_default.P_OPLOC]: checkedHandler(ProtectedActivePlayer, (state) => { + const type = check(state.popInt(), NumberNotNull) - 1; + if (type < 0 || type >= 5) { + throw new Error(`Invalid oploc: ${type + 1}`); + } + state.activePlayer.stopAction(); + state.activePlayer.setInteraction(Interaction_default.SCRIPT, state.activeLoc, ServerTriggerType_default.APLOC1 + type); + }), + [ScriptOpcode_default.P_OPNPC]: checkedHandler(ProtectedActivePlayer, (state) => { + const type = check(state.popInt(), NumberNotNull) - 1; + if (type < 0 || type >= 5) { + throw new Error(`Invalid opnpc: ${type + 1}`); + } + state.activePlayer.stopAction(); + state.activePlayer.setInteraction(Interaction_default.SCRIPT, state.activeNpc, ServerTriggerType_default.APNPC1 + type, { type: state.activeNpc.type, com: -1 }); + }), + [ScriptOpcode_default.P_OPNPCT]: checkedHandler(ProtectedActivePlayer, (state) => { + const spellId = check(state.popInt(), NumberNotNull); + state.activePlayer.stopAction(); + state.activePlayer.setInteraction(Interaction_default.SCRIPT, state.activeNpc, ServerTriggerType_default.APNPCT, { type: state.activeNpc.type, com: spellId }); + }), + [ScriptOpcode_default.P_PAUSEBUTTON]: checkedHandler(ProtectedActivePlayer, (state) => { + state.execution = ScriptState.PAUSEBUTTON; + }), + [ScriptOpcode_default.P_STOPACTION]: checkedHandler(ProtectedActivePlayer, (state) => { + state.activePlayer.stopAction(); + }), + [ScriptOpcode_default.P_CLEARPENDINGACTION]: checkedHandler(ProtectedActivePlayer, (state) => { + state.activePlayer.clearPendingAction(); + }), + [ScriptOpcode_default.P_TELEJUMP]: checkedHandler(ProtectedActivePlayer, (state) => { + const position = check(state.popInt(), CoordValid); + state.activePlayer.teleJump(position.x, position.z, position.level); + }), + [ScriptOpcode_default.P_TELEPORT]: checkedHandler(ProtectedActivePlayer, (state) => { + const position = check(state.popInt(), CoordValid); + state.activePlayer.teleport(position.x, position.z, position.level); + }), + [ScriptOpcode_default.P_WALK]: checkedHandler(ProtectedActivePlayer, (state) => { + const pos = check(state.popInt(), CoordValid); + const player = state.activePlayer; + player.queueWaypoints(findPath(player.level, player.x, player.z, pos.x, pos.z, player.width, player.width, player.length)); + player.updateMovement(false); + }), + [ScriptOpcode_default.SAY]: checkedHandler(ActivePlayer, (state) => { + state.activePlayer.say(state.popString()); + }), + [ScriptOpcode_default.SOUND_SYNTH]: checkedHandler(ActivePlayer, (state) => { + const [synth, loops, delay] = state.popInts(3); + state.activePlayer.write(new SynthSound(synth, loops, delay)); + }), + [ScriptOpcode_default.STAFFMODLEVEL]: checkedHandler(ActivePlayer, (state) => { + state.pushInt(state.activePlayer.staffModLevel); + }), + [ScriptOpcode_default.STAT]: checkedHandler(ActivePlayer, (state) => { + const stat = check(state.popInt(), PlayerStatValid); + state.pushInt(state.activePlayer.levels[stat]); + }), + [ScriptOpcode_default.STAT_BASE]: checkedHandler(ActivePlayer, (state) => { + const stat = check(state.popInt(), PlayerStatValid); + state.pushInt(state.activePlayer.baseLevels[stat]); + }), + [ScriptOpcode_default.STAT_ADD]: checkedHandler(ActivePlayer, (state) => { + const [stat, constant, percent] = state.popInts(3); + check(stat, PlayerStatValid); + check(constant, NumberNotNull); + check(percent, NumberNotNull); + const player = state.activePlayer; + const current = player.levels[stat]; + const added = current + (constant + current * percent / 100); + player.levels[stat] = Math.min(added, 255); + if (stat === 3 && player.levels[3] >= player.baseLevels[3]) { + player.resetHeroPoints(); + } + }), + [ScriptOpcode_default.STAT_SUB]: checkedHandler(ActivePlayer, (state) => { + const [stat, constant, percent] = state.popInts(3); + check(stat, PlayerStatValid); + check(constant, NumberNotNull); + check(percent, NumberNotNull); + const player = state.activePlayer; + const current = player.levels[stat]; + const subbed = current - (constant + current * percent / 100); + player.levels[stat] = Math.max(subbed, 0); + }), + [ScriptOpcode_default.SPOTANIM_PL]: checkedHandler(ActivePlayer, (state) => { + const delay = check(state.popInt(), NumberNotNull); + const height = state.popInt(); + const spotanimType = check(state.popInt(), SpotAnimTypeValid); + state.activePlayer.spotanim(spotanimType.id, height, delay); + }), + [ScriptOpcode_default.STAT_HEAL]: checkedHandler(ActivePlayer, (state) => { + const [stat, constant, percent] = state.popInts(3); + check(stat, PlayerStatValid); + check(constant, NumberNotNull); + check(percent, NumberNotNull); + const player = state.activePlayer; + const base = player.baseLevels[stat]; + const current = player.levels[stat]; + const healed = current + (constant + current * percent / 100); + player.levels[stat] = Math.max(Math.min(healed, base), current); + if (stat === 3 && player.levels[3] >= player.baseLevels[3]) { + player.resetHeroPoints(); + } + }), + [ScriptOpcode_default.UID]: checkedHandler(ActivePlayer, (state) => { + state.pushInt(state.activePlayer.uid); + }), + [ScriptOpcode_default.P_LOGOUT]: checkedHandler(ProtectedActivePlayer, (state) => { + state.activePlayer.logoutRequested = true; + }), + [ScriptOpcode_default.IF_SETCOLOUR]: checkedHandler(ActivePlayer, (state) => { + const [com, colour] = state.popInts(2); + check(com, NumberNotNull); + check(colour, NumberNotNull); + state.activePlayer.write(new IfSetColour(com, ColorConversion.rgb24to15(colour))); + }), + [ScriptOpcode_default.IF_OPENCHAT]: checkedHandler(ActivePlayer, (state) => { + state.activePlayer.openChat(check(state.popInt(), NumberNotNull)); + }), + [ScriptOpcode_default.IF_OPENMAINMODALSIDEOVERLAY]: checkedHandler(ActivePlayer, (state) => { + const [main, side] = state.popInts(2); + check(main, NumberNotNull); + check(side, NumberNotNull); + state.activePlayer.openMainModalSideOverlay(main, side); + }), + [ScriptOpcode_default.IF_SETHIDE]: checkedHandler(ActivePlayer, (state) => { + const [com, hide] = state.popInts(2); + check(com, NumberNotNull); + check(hide, NumberNotNull); + state.activePlayer.write(new IfSetHide(com, hide === 1)); + }), + [ScriptOpcode_default.IF_SETOBJECT]: checkedHandler(ActivePlayer, (state) => { + const [com, obj, scale] = state.popInts(3); + check(com, NumberNotNull); + check(obj, ObjTypeValid); + check(scale, NumberNotNull); + state.activePlayer.write(new IfSetObject(com, obj, scale)); + }), + [ScriptOpcode_default.IF_SETTABACTIVE]: checkedHandler(ActivePlayer, (state) => { + state.activePlayer.write(new IfShowSide(check(state.popInt(), NumberNotNull))); + }), + [ScriptOpcode_default.IF_SETMODEL]: checkedHandler(ActivePlayer, (state) => { + const [com, model] = state.popInts(2); + check(com, NumberNotNull); + check(model, NumberNotNull); + state.activePlayer.write(new IfSetModel(com, model)); + }), + [ScriptOpcode_default.IF_SETRECOL]: checkedHandler(ActivePlayer, (state) => { + const [com, src, dest] = state.popInts(3); + check(com, NumberNotNull); + state.activePlayer.write(new IfSetRecol(com, src, dest)); + }), + [ScriptOpcode_default.IF_SETTABFLASH]: checkedHandler(ActivePlayer, (state) => { + state.activePlayer.write(new TutorialFlashSide(check(state.popInt(), NumberNotNull))); + }), + [ScriptOpcode_default.IF_SETANIM]: checkedHandler(ActivePlayer, (state) => { + const [com, seq] = state.popInts(2); + check(com, NumberNotNull); + if (seq === -1) { + return; + } + state.activePlayer.write(new IfSetAnim(com, seq)); + }), + [ScriptOpcode_default.IF_SETTAB]: checkedHandler(ActivePlayer, (state) => { + const [com, tab] = state.popInts(2); + check(tab, NumberNotNull); + state.activePlayer.setTab(com, tab); + }), + [ScriptOpcode_default.IF_OPENMAINMODAL]: checkedHandler(ActivePlayer, (state) => { + state.activePlayer.openMainModal(check(state.popInt(), NumberNotNull)); + }), + [ScriptOpcode_default.IF_OPENCHATSTICKY]: checkedHandler(ActivePlayer, (state) => { + state.activePlayer.openChatSticky(check(state.popInt(), NumberNotNull)); + }), + [ScriptOpcode_default.IF_OPENSIDEOVERLAY]: checkedHandler(ActivePlayer, (state) => { + state.activePlayer.openSideOverlay(check(state.popInt(), NumberNotNull)); + }), + [ScriptOpcode_default.IF_SETPLAYERHEAD]: checkedHandler(ActivePlayer, (state) => { + state.activePlayer.write(new IfSetPlayerHead(check(state.popInt(), NumberNotNull))); + }), + [ScriptOpcode_default.IF_SETTEXT]: checkedHandler(ActivePlayer, (state) => { + const text = state.popString(); + const com = check(state.popInt(), NumberNotNull); + state.activePlayer.write(new IfSetText(com, text)); + }), + [ScriptOpcode_default.IF_SETNPCHEAD]: checkedHandler(ActivePlayer, (state) => { + const [com, npc] = state.popInts(2); + check(com, NumberNotNull); + check(npc, NpcTypeValid); + state.activePlayer.write(new IfSetNpcHead(com, npc)); + }), + [ScriptOpcode_default.IF_SETPOSITION]: checkedHandler(ActivePlayer, (state) => { + const [com, x, y] = state.popInts(3); + check(com, NumberNotNull); + state.activePlayer.write(new IfSetPosition(com, x, y)); + }), + [ScriptOpcode_default.IF_MULTIZONE]: checkedHandler(ActivePlayer, (state) => { + state.activePlayer.write(new SetMultiway(check(state.popInt(), NumberNotNull) === 1)); + }), + [ScriptOpcode_default.STAT_ADVANCE]: checkedHandler(ProtectedActivePlayer, (state) => { + const [stat, xp] = state.popInts(2); + check(stat, NumberNotNull); + check(xp, NumberNotNull); + state.activePlayer.addXp(stat, xp); + }), + [ScriptOpcode_default.DAMAGE]: (state) => { + const amount = check(state.popInt(), NumberNotNull); + const type = check(state.popInt(), HitTypeValid); + const uid = check(state.popInt(), NumberNotNull); + const player = World_default.getPlayerByUid(uid); + if (!player) { + return; + } + player.applyDamage(amount, type); + }, + [ScriptOpcode_default.IF_SETRESUMEBUTTONS]: checkedHandler(ActivePlayer, (state) => { + const [button1, button2, button3, button4, button5] = state.popInts(5); + state.activePlayer.resumeButtons = [button1, button2, button3, button4, button5]; + }), + [ScriptOpcode_default.TEXT_GENDER]: checkedHandler(ActivePlayer, (state) => { + const [male, female] = state.popStrings(2); + if (state.activePlayer.gender == 0) { + state.pushString(male); + } else { + state.pushString(female); + } + }), + [ScriptOpcode_default.MIDI_SONG]: (state) => { + state.activePlayer.playSong(check(state.popString(), StringNotNull)); + }, + [ScriptOpcode_default.MIDI_JINGLE]: (state) => { + const delay = check(state.popInt(), NumberNotNull); + const name = check(state.popString(), StringNotNull); + state.activePlayer.playJingle(delay, name); + }, + [ScriptOpcode_default.SOFTTIMER]: checkedHandler(ActivePlayer, (state) => { + const args = popScriptArgs(state); + const interval = state.popInt(); + const timerId = state.popInt(); + const script = ScriptProvider.get(timerId); + if (!script) { + throw new Error(`Unable to find timer script: ${timerId}`); + } + state.activePlayer.setTimer(1 /* SOFT */, script, args, interval); + }), + [ScriptOpcode_default.CLEARSOFTTIMER]: checkedHandler(ActivePlayer, (state) => { + state.activePlayer.clearTimer(state.popInt()); + }), + [ScriptOpcode_default.SETTIMER]: checkedHandler(ActivePlayer, (state) => { + const args = popScriptArgs(state); + const interval = state.popInt(); + const timerId = state.popInt(); + const script = ScriptProvider.get(timerId); + if (!script) { + throw new Error(`Unable to find timer script: ${timerId}`); + } + state.activePlayer.setTimer(0 /* NORMAL */, script, args, interval); + }), + [ScriptOpcode_default.CLEARTIMER]: checkedHandler(ActivePlayer, (state) => { + state.activePlayer.clearTimer(state.popInt()); + }), + [ScriptOpcode_default.HINT_COORD]: (state) => { + const [offset, coord, height] = state.popInts(3); + const position = check(coord, CoordValid); + state.activePlayer.hintTile(offset, position.x, position.z, height); + }, + [ScriptOpcode_default.HINT_STOP]: (state) => { + state.activePlayer.stopHint(); + }, + [ScriptOpcode_default.IF_CLOSESTICKY]: (state) => { + state.activePlayer.closeSticky(); + }, + [ScriptOpcode_default.P_EXACTMOVE]: checkedHandler(ProtectedActivePlayer, (state) => { + const [start, end, startCycle, endCycle, direction] = state.popInts(5); + const startPos = check(start, CoordValid); + const endPos = check(end, CoordValid); + state.activePlayer.unsetMapFlag(); + state.activePlayer.exactMove(startPos.x, startPos.z, endPos.x, endPos.z, startCycle, endCycle, direction); + }), + [ScriptOpcode_default.BUSY]: (state) => { + state.pushInt(state.activePlayer.busy() ? 1 : 0); + }, + [ScriptOpcode_default.BUSY2]: (state) => { + state.pushInt(state.activePlayer.hasInteraction() || state.activePlayer.hasWaypoints() ? 1 : 0); + }, + [ScriptOpcode_default.GETQUEUE]: (state) => { + const scriptId = state.popInt(); + let count = 0; + for (let request = state.activePlayer.queue.head(); request !== null; request = state.activePlayer.queue.next()) { + if (request.script.id === scriptId) { + count++; + } + } + for (let request = state.activePlayer.weakQueue.head(); request !== null; request = state.activePlayer.weakQueue.next()) { + if (request.script.id === scriptId) { + count++; + } + } + state.pushInt(count); + }, + // TODO: check active loc too + [ScriptOpcode_default.P_LOCMERGE]: checkedHandler(ProtectedActivePlayer, (state) => { + const [startCycle, endCycle, southEast, northWest] = state.popInts(4); + const se = check(southEast, CoordValid); + const nw = check(northWest, CoordValid); + World_default.mergeLoc(state.activeLoc, state.activePlayer, startCycle, endCycle, se.z, se.x, nw.z, nw.x); + }), + [ScriptOpcode_default.LAST_LOGIN_INFO]: (state) => { + const player = state.activePlayer; + if (!isNetworkPlayer(player) || player.client === null) { + return; + } + const client = player.client; + const remoteAddress = client.remoteAddress; + if (remoteAddress == null) { + return; + } + const lastLoginIp = new Uint32Array(new Uint8Array(remoteAddress.split(".").map((x) => parseInt(x))).reverse().buffer)[0]; + player.lastLoginInfo(lastLoginIp, 0, 201, 0); + }, + [ScriptOpcode_default.BAS_READYANIM]: (state) => { + state.activePlayer.basReadyAnim = check(state.popInt(), SeqTypeValid).id; + }, + [ScriptOpcode_default.BAS_TURNONSPOT]: (state) => { + state.activePlayer.basTurnOnSpot = check(state.popInt(), SeqTypeValid).id; + }, + [ScriptOpcode_default.BAS_WALK_F]: (state) => { + state.activePlayer.basWalkForward = check(state.popInt(), SeqTypeValid).id; + }, + [ScriptOpcode_default.BAS_WALK_B]: (state) => { + state.activePlayer.basWalkBackward = check(state.popInt(), SeqTypeValid).id; + }, + [ScriptOpcode_default.BAS_WALK_L]: (state) => { + state.activePlayer.basWalkLeft = check(state.popInt(), SeqTypeValid).id; + }, + [ScriptOpcode_default.BAS_WALK_R]: (state) => { + state.activePlayer.basWalkRight = check(state.popInt(), SeqTypeValid).id; + }, + [ScriptOpcode_default.BAS_RUNNING]: (state) => { + const seq = state.popInt(); + if (seq === -1) { + state.activePlayer.basRunning = -1; + return; + } + state.activePlayer.basRunning = check(seq, SeqTypeValid).id; + }, + [ScriptOpcode_default.GENDER]: (state) => { + state.pushInt(state.activePlayer.gender); + }, + [ScriptOpcode_default.HINT_NPC]: (state) => { + state.activePlayer.hintNpc(check(state.popInt(), NumberNotNull)); + }, + [ScriptOpcode_default.HINT_PLAYER]: (state) => { + const uid = check(state.popInt(), NumberNotNull); + const player = World_default.getPlayerByUid(uid); + if (!player) { + return; + } + state.activePlayer.hintPlayer(player.pid); + }, + [ScriptOpcode_default.HEADICONS_GET]: (state) => { + state.pushInt(state.activePlayer.headicons); + }, + [ScriptOpcode_default.HEADICONS_SET]: (state) => { + state.activePlayer.headicons = check(state.popInt(), NumberNotNull); + }, + [ScriptOpcode_default.P_OPOBJ]: checkedHandler(ProtectedActivePlayer, (state) => { + const type = check(state.popInt(), NumberNotNull) - 1; + if (type < 0 || type >= 5) { + throw new Error(`Invalid opobj: ${type + 1}`); + } + state.activePlayer.stopAction(); + state.activePlayer.setInteraction(Interaction_default.SCRIPT, state.activeObj, ServerTriggerType_default.APOBJ1 + type); + }), + [ScriptOpcode_default.P_OPPLAYER]: checkedHandler(ProtectedActivePlayer, (state) => { + const type = check(state.popInt(), NumberNotNull) - 1; + if (type < 0 || type >= 5) { + throw new Error(`Invalid opplayer: ${type + 1}`); + } + const target = state._activePlayer2; + if (!target) { + return; + } + state.activePlayer.stopAction(); + state.activePlayer.setInteraction(Interaction_default.SCRIPT, target, ServerTriggerType_default.APPLAYER1 + type); + }), + [ScriptOpcode_default.ALLOWDESIGN]: (state) => { + state.activePlayer.allowDesign = check(state.popInt(), NumberNotNull) === 1; + }, + [ScriptOpcode_default.LAST_TARGETSLOT]: (state) => { + const allowedTriggers = [ServerTriggerType_default.INV_BUTTOND]; + if (!allowedTriggers.includes(state.trigger)) { + throw new Error("is not safe to use in this trigger"); + } + state.pushInt(state.activePlayer.lastTargetSlot); + }, + [ScriptOpcode_default.WALKTRIGGER]: (state) => { + state.activePlayer.walktrigger = state.popInt(); + }, + [ScriptOpcode_default.GETWALKTRIGGER]: (state) => { + state.pushInt(state.activePlayer.walktrigger); + }, + [ScriptOpcode_default.CLEARQUEUE]: (state) => { + const scriptId = state.popInt(); + for (let request = state.activePlayer.queue.head(); request !== null; request = state.activePlayer.queue.next()) { + if (request.script.id === scriptId) { + request.unlink(); + } + } + for (let request = state.activePlayer.weakQueue.head(); request !== null; request = state.activePlayer.weakQueue.next()) { + if (request.script.id === scriptId) { + request.unlink(); + } + } + }, + [ScriptOpcode_default.HEALENERGY]: (state) => { + const amount = check(state.popInt(), NumberNotNull); + const player = state.activePlayer; + player.runenergy = Math.min(Math.max(player.runenergy + amount, 0), 1e4); + }, + [ScriptOpcode_default.AFK_EVENT]: (state) => { + state.pushInt(state.activePlayer.afkEventReady ? 1 : 0); + state.activePlayer.afkEventReady = false; + }, + [ScriptOpcode_default.LOWMEMORY]: (state) => { + state.pushInt(state.activePlayer.lowMemory ? 1 : 0); + }, + [ScriptOpcode_default.SETIDKIT]: (state) => { + const [idkit, color] = state.popInts(2); + const idkType = check(idkit, IDKTypeValid); + let slot = idkType.type; + if (state.activePlayer.gender === 1) { + slot -= 7; + } + state.activePlayer.body[slot] = idkType.id; + let type = idkType.type; + if (state.activePlayer.gender === 1) { + type -= 7; + } + let colorSlot = -1; + if (type === 0 || type === 1) { + colorSlot = 0; + } else if (type === 2 || type === 3) { + colorSlot = 1; + } else if (type === 4) { + } else if (type === 5) { + colorSlot = 2; + } else if (type === 6) { + colorSlot = 3; + } + if (colorSlot !== -1) { + state.activePlayer.colors[colorSlot] = color; + } + }, + [ScriptOpcode_default.SETGENDER]: (state) => { + const gender = check(state.popInt(), GenderValid); + for (let i = 0; i < 7; i++) { + state.activePlayer.body[i] = -1; + for (let j = 0; j < IdkType.count; j++) { + if (!IdkType.get(j).disable && IdkType.get(j).type == i + (gender === 0 ? 0 : 7)) { + state.activePlayer.body[i] = j; + break; + } + } + } + state.activePlayer.gender = gender; + }, + [ScriptOpcode_default.SETSKINCOLOUR]: (state) => { + const skin = check(state.popInt(), SkinColourValid); + state.activePlayer.colors[4] = skin; + }, + [ScriptOpcode_default.P_OPPLAYERT]: checkedHandler(ProtectedActivePlayer, (state) => { + const spellId = check(state.popInt(), NumberNotNull); + const target = state._activePlayer2; + if (!target) { + return; + } + state.activePlayer.stopAction(); + state.activePlayer.setInteraction(Interaction_default.SCRIPT, target, ServerTriggerType_default.APPLAYERT, { type: -1, com: spellId }); + }), + [ScriptOpcode_default.FINDHERO]: checkedHandler(ActivePlayer, (state) => { + const uid = state.activePlayer.findHero(); + if (uid === -1) { + state.pushInt(0); + return; + } + const player = World_default.getPlayerByUid(uid); + if (!player) { + state.pushInt(0); + return; + } + state._activePlayer2 = player; + state.pointerAdd(ScriptPointer_default.ActivePlayer2); + state.pushInt(1); + }), + [ScriptOpcode_default.BOTH_HEROPOINTS]: checkedHandler(ActivePlayer, (state) => { + const damage = check(state.popInt(), NumberNotNull); + const secondary = state.intOperand === 1; + const fromPlayer = secondary ? state._activePlayer2 : state._activePlayer; + const toPlayer = secondary ? state._activePlayer : state._activePlayer2; + if (!fromPlayer || !toPlayer) { + throw new Error("player is null"); + } + toPlayer.addHero(fromPlayer.uid, damage); + }), + [ScriptOpcode_default.P_ANIMPROTECT]: checkedHandler(ProtectedActivePlayer, (state) => { + state.activePlayer.animProtect = check(state.popInt(), NumberNotNull); + }), + [ScriptOpcode_default.RUNENERGY]: checkedHandler(ActivePlayer, (state) => { + const player = state.activePlayer; + state.pushInt(player.runenergy); + }), + [ScriptOpcode_default.WEIGHT]: checkedHandler(ProtectedActivePlayer, (state) => { + state.pushInt(state.activePlayer.runweight); + }), + [ScriptOpcode_default.LAST_COORD]: checkedHandler(ActivePlayer, (state) => { + state.pushInt(Position.packCoord(state.activePlayer.level, state.activePlayer.lastX, state.activePlayer.lastZ)); + }) +}; +function popScriptArgs(state) { + const types = state.popString(); + const count = types.length; + const args = []; + for (let i = count - 1; i >= 0; i--) { + const type = types.charAt(i); + if (type === "s") { + args[i] = state.popString(); + } else { + args[i] = state.popInt(); + } + } + return args; +} +var PlayerOps_default = PlayerOps; + +// src/lostcity/engine/script/handlers/ServerOps.ts +var ServerOps = { + [ScriptOpcode_default.MAP_CLOCK]: (state) => { + state.pushInt(World_default.currentTick); + }, + [ScriptOpcode_default.MAP_MEMBERS]: (state) => { + state.pushInt(Environment_default.NODE_MEMBERS ? 1 : 0); + }, + [ScriptOpcode_default.MAP_PLAYERCOUNT]: (state) => { + const [c1, c2] = state.popInts(2); + const from = check(c1, CoordValid); + const to = check(c2, CoordValid); + let count = 0; + for (let x = Math.floor(from.x / 8); x <= Math.ceil(to.x / 8); x++) { + for (let z = Math.floor(from.z / 8); z <= Math.ceil(to.z / 8); z++) { + for (const player of World_default.getZone(x << 3, z << 3, from.level).getAllPlayersSafe()) { + if (player.x >= from.x && player.x <= to.x && player.z >= from.z && player.z <= to.z) { + count++; + } + } + } + } + state.pushInt(count); + }, + [ScriptOpcode_default.HUNTALL]: (state) => { + const [coord, distance, checkVis] = state.popInts(3); + const position = check(coord, CoordValid); + check(distance, NumberNotNull); + const huntvis = check(checkVis, HuntVisValid); + state.huntIterator = new HuntIterator(World_default.currentTick, position.level, position.x, position.z, distance, huntvis, -1, -1, HuntModeType_default.PLAYER); + }, + [ScriptOpcode_default.HUNTNEXT]: (state) => { + const result = state.huntIterator?.next(); + if (!result || result.done) { + state.pushInt(0); + return; + } + if (!(result.value instanceof Player)) { + throw new Error("[ServerOps] huntnext command must result instance of Player."); + } + state.activePlayer = result.value; + state.pointerAdd(ActivePlayer[state.intOperand]); + state.pushInt(1); + }, + [ScriptOpcode_default.NPC_HUNTALL]: (state) => { + const [coord, distance, checkVis] = state.popInts(3); + const position = check(coord, CoordValid); + check(distance, NumberNotNull); + const huntvis = check(checkVis, HuntVisValid); + state.huntIterator = new HuntIterator(World_default.currentTick, position.level, position.x, position.z, distance, huntvis, -1, -1, HuntModeType_default.NPC); + }, + [ScriptOpcode_default.NPC_HUNTNEXT]: (state) => { + const result = state.huntIterator?.next(); + if (!result || result.done) { + state.pushInt(0); + return; + } + if (!(result.value instanceof Npc)) { + throw new Error("[ServerOps] npc_huntnext command must result instance of Npc."); + } + state.activeNpc = result.value; + state.pointerAdd(ActiveNpc[state.intOperand]); + state.pushInt(1); + }, + [ScriptOpcode_default.INZONE]: (state) => { + const [c1, c2, c3] = state.popInts(3); + const from = check(c1, CoordValid); + const to = check(c2, CoordValid); + const pos = check(c3, CoordValid); + if (pos.x < from.x || pos.x > to.x) { + state.pushInt(0); + } else if (pos.level < from.level || pos.level > to.level) { + state.pushInt(0); + } else if (pos.z < from.z || pos.z > to.z) { + state.pushInt(0); + } else { + state.pushInt(1); + } + }, + [ScriptOpcode_default.LINEOFWALK]: (state) => { + const [c1, c2] = state.popInts(2); + const from = check(c1, CoordValid); + const to = check(c2, CoordValid); + if (from.level !== to.level) { + state.pushInt(0); + return; + } + state.pushInt(hasLineOfWalk(from.level, from.x, from.z, to.x, to.z, 1, 1, 1, 1) ? 1 : 0); + }, + [ScriptOpcode_default.STAT_RANDOM]: (state) => { + const [level, low, high] = state.popInts(3); + const value = Math.floor(low * (99 - level) / 98) + Math.floor(high * (level - 1) / 98) + 1; + const chance = Math.floor(Math.random() * 256); + state.pushInt(value > chance ? 1 : 0); + }, + [ScriptOpcode_default.SPOTANIM_MAP]: (state) => { + const [spotanim, coord, height, delay] = state.popInts(4); + const position = check(coord, CoordValid); + const spotanimType = check(spotanim, SpotAnimTypeValid); + World_default.animMap(position.level, position.x, position.z, spotanimType.id, height, delay); + }, + [ScriptOpcode_default.DISTANCE]: (state) => { + const [c1, c2] = state.popInts(2); + const from = check(c1, CoordValid); + const to = check(c2, CoordValid); + state.pushInt(Position.distanceToSW(from, to)); + }, + [ScriptOpcode_default.MOVECOORD]: (state) => { + const [coord, x, y, z] = state.popInts(4); + const position = check(coord, CoordValid); + state.pushInt(Position.packCoord(position.level + y, position.x + x, position.z + z)); + }, + [ScriptOpcode_default.SEQLENGTH]: (state) => { + state.pushInt(check(state.popInt(), SeqTypeValid).duration); + }, + [ScriptOpcode_default.SPLIT_INIT]: (state) => { + const [maxWidth, linesPerPage, fontId] = state.popInts(3); + let text = state.popString(); + const font = check(fontId, FontTypeValid); + if (text.startsWith("") !== -1) { + const mesanim = text.substring(3, text.indexOf(">")); + state.splitMesanim = MesanimType.getId(mesanim); + text = text.substring(text.indexOf(">") + 1); + } else { + state.splitMesanim = -1; + } + state.splitPages = []; + const lines = font.split(text, maxWidth); + while (lines.length > 0) { + state.splitPages.push(lines.splice(0, linesPerPage)); + } + }, + [ScriptOpcode_default.SPLIT_GET]: (state) => { + const [page, line] = state.popInts(2); + state.pushString(state.splitPages[page][line]); + }, + [ScriptOpcode_default.SPLIT_PAGECOUNT]: (state) => { + state.pushInt(state.splitPages.length); + }, + [ScriptOpcode_default.SPLIT_LINECOUNT]: (state) => { + const page = state.popInt(); + state.pushInt(state.splitPages[page].length); + }, + [ScriptOpcode_default.SPLIT_GETANIM]: (state) => { + const page = state.popInt(); + if (state.splitMesanim === -1) { + state.pushInt(-1); + return; + } + state.pushInt(check(state.splitMesanim, MesanimValid).len[state.splitPages[page].length - 1]); + }, + [ScriptOpcode_default.STRUCT_PARAM]: (state) => { + const [structId, paramId] = state.popInts(2); + const paramType = check(paramId, ParamTypeValid); + const structType = check(structId, StructTypeValid); + if (paramType.isString()) { + state.pushString(ParamHelper.getStringParam(paramType.id, structType, paramType.defaultString)); + } else { + state.pushInt(ParamHelper.getIntParam(paramType.id, structType, paramType.defaultInt)); + } + }, + [ScriptOpcode_default.COORDX]: (state) => { + state.pushInt(check(state.popInt(), CoordValid).x); + }, + [ScriptOpcode_default.COORDY]: (state) => { + state.pushInt(check(state.popInt(), CoordValid).level); + }, + [ScriptOpcode_default.COORDZ]: (state) => { + state.pushInt(check(state.popInt(), CoordValid).z); + }, + [ScriptOpcode_default.PLAYERCOUNT]: (state) => { + state.pushInt(World_default.getTotalPlayers()); + }, + [ScriptOpcode_default.MAP_BLOCKED]: (state) => { + const position = check(state.popInt(), CoordValid); + state.pushInt(isFlagged(position.x, position.z, position.level, CollisionFlag.WALK_BLOCKED) ? 1 : 0); + }, + [ScriptOpcode_default.MAP_INDOORS]: (state) => { + const position = check(state.popInt(), CoordValid); + state.pushInt(isFlagged(position.x, position.z, position.level, CollisionFlag.ROOF) ? 1 : 0); + }, + [ScriptOpcode_default.LINEOFSIGHT]: (state) => { + const [c1, c2] = state.popInts(2); + const from = check(c1, CoordValid); + const to = check(c2, CoordValid); + if (from.level !== to.level) { + state.pushInt(0); + return; + } + state.pushInt(hasLineOfSight(from.level, from.x, from.z, to.x, to.z, 1, 1, 1, 1) ? 1 : 0); + }, + [ScriptOpcode_default.WORLD_DELAY]: (state) => { + state.execution = ScriptState.WORLD_SUSPENDED; + }, + [ScriptOpcode_default.PROJANIM_PL]: (state) => { + const [srcCoord, uid, spotanim, srcHeight, dstHeight, delay, duration, peak, arc] = state.popInts(9); + const srcPos = check(srcCoord, CoordValid); + const spotanimType = check(spotanim, SpotAnimTypeValid); + const player = World_default.getPlayerByUid(uid); + if (!player) { + throw new Error(`attempted to use invalid player uid: ${uid}`); + } + World_default.mapProjAnim(srcPos.level, srcPos.x, srcPos.z, player.x, player.z, -player.pid - 1, spotanimType.id, srcHeight + 100, dstHeight + 100, delay, duration, peak, arc); + }, + [ScriptOpcode_default.PROJANIM_NPC]: (state) => { + const [srcCoord, npcUid, spotanim, srcHeight, dstHeight, delay, duration, peak, arc] = state.popInts(9); + const srcPos = check(srcCoord, CoordValid); + const spotanimType = check(spotanim, SpotAnimTypeValid); + const slot = npcUid & 65535; + const expectedType = npcUid >> 16 & 65535; + const npc = World_default.getNpc(slot); + if (!npc) { + throw new Error(`attempted to use invalid npc uid: ${npcUid}`); + } + World_default.mapProjAnim(srcPos.level, srcPos.x, srcPos.z, npc.x, npc.z, npc.nid + 1, spotanimType.id, srcHeight + 100, dstHeight + 100, delay, duration, peak, arc); + }, + [ScriptOpcode_default.PROJANIM_MAP]: (state) => { + const [srcCoord, dstCoord, spotanim, srcHeight, dstHeight, delay, duration, peak, arc] = state.popInts(9); + const spotanimType = check(spotanim, SpotAnimTypeValid); + const srcPos = check(srcCoord, CoordValid); + const dstPos = check(dstCoord, CoordValid); + World_default.mapProjAnim(srcPos.level, srcPos.x, srcPos.z, dstPos.x, dstPos.z, 0, spotanimType.id, srcHeight + 100, dstHeight, delay, duration, peak, arc); + }, + [ScriptOpcode_default.MAP_LOCADDUNSAFE]: (state) => { + const pos = check(state.popInt(), CoordValid); + for (const loc of World_default.getZone(pos.x, pos.z, pos.level).getAllLocsUnsafe()) { + const type = check(loc.type, LocTypeValid); + if (type.active !== 1) { + continue; + } + const layer = locShapeLayer(loc.shape); + if (!loc.checkLifeCycle(World_default.currentTick) && layer === LocLayer.WALL) { + continue; + } + if (layer === LocLayer.WALL) { + if (loc.x === pos.x && loc.z === pos.z) { + state.pushInt(1); + return; + } + } else if (layer === LocLayer.GROUND) { + const width = loc.angle === LocAngle.NORTH || loc.angle === LocAngle.SOUTH ? loc.length : loc.width; + const length = loc.angle === LocAngle.NORTH || loc.angle === LocAngle.SOUTH ? loc.width : loc.length; + for (let index = 0; index < width * length; index++) { + const deltaX = loc.x + index % width; + const deltaZ = loc.z + (index / width | 0); + if (deltaX === pos.x && deltaZ === pos.z) { + state.pushInt(1); + return; + } + } + } else if (layer === LocLayer.GROUND_DECOR) { + if (loc.x === pos.x && loc.z === pos.z) { + state.pushInt(1); + return; + } + } + } + state.pushInt(0); + }, + [ScriptOpcode_default.NPCCOUNT]: (state) => { + state.pushInt(World_default.getTotalNpcs()); + }, + [ScriptOpcode_default.ZONECOUNT]: (state) => { + state.pushInt(World_default.getTotalZones()); + }, + [ScriptOpcode_default.LOCCOUNT]: (state) => { + state.pushInt(World_default.getTotalLocs()); + }, + [ScriptOpcode_default.OBJCOUNT]: (state) => { + state.pushInt(World_default.getTotalObjs()); + }, + [ScriptOpcode_default.MAP_FINDSQUARE]: (state) => { + const [coord, minRadius, maxRadius, type] = state.popInts(4); + check(minRadius, NumberPositive); + check(maxRadius, NumberPositive); + check(type, FindSquareValid); + const origin = check(coord, CoordValid); + if (maxRadius < 10) { + if (type === MapFindSquareType_default.NONE) { + for (let i = 0; i < 50; i++) { + const randomX = origin.x + (Math.floor(Math.random() * (maxRadius - minRadius + 1)) + minRadius) * (Math.random() < 0.5 ? 1 : -1); + const randomZ = origin.z + (Math.floor(Math.random() * (maxRadius - minRadius + 1)) + minRadius) * (Math.random() < 0.5 ? 1 : -1); + if (!isFlagged(randomX, randomZ, origin.level, CollisionFlag.WALK_BLOCKED)) { + state.pushInt(Position.packCoord(origin.level, randomX, randomZ)); + return; + } + } + } else if (type === MapFindSquareType_default.LINEOFWALK) { + for (let i = 0; i < 50; i++) { + const randomX = origin.x + (Math.floor(Math.random() * (maxRadius - minRadius + 1)) + minRadius) * (Math.random() < 0.5 ? 1 : -1); + const randomZ = origin.z + (Math.floor(Math.random() * (maxRadius - minRadius + 1)) + minRadius) * (Math.random() < 0.5 ? 1 : -1); + console.log((Math.floor(Math.random() * (maxRadius - minRadius)) + minRadius) * (Math.random() < 0.5 ? 1 : -1)); + if (hasLineOfWalk(origin.level, randomX, randomZ, origin.x, origin.z) && !isFlagged(randomX, randomZ, origin.level, CollisionFlag.WALK_BLOCKED)) { + state.pushInt(Position.packCoord(origin.level, randomX, randomZ)); + return; + } + } + } else if (type === MapFindSquareType_default.LINEOFSIGHT) { + for (let i = 0; i < 50; i++) { + const randomX = origin.x + (Math.floor(Math.random() * (maxRadius - minRadius + 1)) + minRadius) * (Math.random() < 0.5 ? 1 : -1); + const randomZ = origin.z + (Math.floor(Math.random() * (maxRadius - minRadius + 1)) + minRadius) * (Math.random() < 0.5 ? 1 : -1); + if (hasLineOfSight(origin.level, randomX, randomZ, origin.x, origin.z) && !isFlagged(randomX, randomZ, origin.level, CollisionFlag.WALK_BLOCKED)) { + state.pushInt(Position.packCoord(origin.level, randomX, randomZ)); + return; + } + } + } + } else { + if (type === MapFindSquareType_default.NONE) { + for (let x = origin.x - maxRadius; x <= origin.x + maxRadius; x++) { + const randomZ = origin.z + (Math.floor(Math.random() * (maxRadius - minRadius + 1)) + minRadius) * (Math.random() < 0.5 ? 1 : -1); + if (!isFlagged(x, randomZ, origin.level, CollisionFlag.WALK_BLOCKED) && !Position.isWithinDistanceSW({ x, z: randomZ }, origin, minRadius)) { + state.pushInt(Position.packCoord(origin.level, x, randomZ)); + return; + } + } + } else if (type === MapFindSquareType_default.LINEOFWALK) { + for (let x = origin.x - maxRadius; x <= origin.x + maxRadius; x++) { + const randomZ = origin.z + (Math.floor(Math.random() * (maxRadius - minRadius + 1)) + minRadius) * (Math.random() < 0.5 ? 1 : -1); + if (hasLineOfWalk(origin.level, x, randomZ, origin.x, origin.z) && !isFlagged(x, randomZ, origin.level, CollisionFlag.WALK_BLOCKED) && !Position.isWithinDistanceSW({ x, z: randomZ }, origin, minRadius)) { + state.pushInt(Position.packCoord(origin.level, x, randomZ)); + return; + } + } + } else if (type === MapFindSquareType_default.LINEOFSIGHT) { + for (let x = origin.x - maxRadius; x <= origin.x + maxRadius; x++) { + const randomZ = origin.z + (Math.floor(Math.random() * (maxRadius - minRadius + 1)) + minRadius) * (Math.random() < 0.5 ? 1 : -1); + if (hasLineOfSight(origin.level, x, randomZ, origin.x, origin.z) && !isFlagged(x, randomZ, origin.level, CollisionFlag.WALK_BLOCKED) && !Position.isWithinDistanceSW({ x, z: randomZ }, origin, minRadius)) { + state.pushInt(Position.packCoord(origin.level, x, randomZ)); + return; + } + } + } + } + state.pushInt(coord); + } +}; +var ServerOps_default = ServerOps; + +// src/lostcity/engine/script/handlers/StringOps.ts +var StringOps = { + [ScriptOpcode_default.APPEND_NUM]: (state) => { + const text = state.popString(); + const num = state.popInt(); + state.pushString(text + num); + }, + [ScriptOpcode_default.APPEND]: (state) => { + const [t1, t2] = state.popStrings(2); + state.pushString(t1 + t2); + }, + [ScriptOpcode_default.APPEND_SIGNNUM]: (state) => { + const text = state.popString(); + const num = state.popInt(); + if (num >= 0) { + state.pushString(`${text}+${num}`); + } else { + state.pushString(text + num); + } + }, + [ScriptOpcode_default.LOWERCASE]: (state) => { + state.pushString(state.popString().toLowerCase()); + }, + [ScriptOpcode_default.TOSTRING]: (state) => { + state.pushString(state.popInt().toString()); + }, + [ScriptOpcode_default.COMPARE]: (state) => { + const [s1, s2] = state.popStrings(2); + state.pushInt(javaStringCompare(s1, s2)); + }, + [ScriptOpcode_default.TEXT_SWITCH]: (state) => { + const value = state.popInt(); + const [s1, s2] = state.popStrings(2); + state.pushString(value === 1 ? s1 : s2); + }, + [ScriptOpcode_default.APPEND_CHAR]: (state) => { + const text = state.popString(); + const char = state.popInt(); + state.pushString(text + String.fromCharCode(char)); + }, + [ScriptOpcode_default.STRING_LENGTH]: (state) => { + state.pushInt(state.popString().length); + }, + [ScriptOpcode_default.SUBSTRING]: (state) => { + const text = state.popString(); + const [start, end] = state.popInts(2); + state.pushString(text.substring(start, end)); + }, + [ScriptOpcode_default.STRING_INDEXOF_CHAR]: (state) => { + const text = state.popString(); + const find = String.fromCharCode(state.popInt()); + state.pushInt(text.indexOf(find)); + }, + [ScriptOpcode_default.STRING_INDEXOF_STRING]: (state) => { + const text = state.popString(); + const find = state.popString(); + state.pushInt(text.indexOf(find)); + } +}; +function javaStringCompare(a, b) { + const len1 = a.length; + const len2 = b.length; + const lim = Math.min(len1, len2); + let k = 0; + while (k < lim) { + const c1 = a.charCodeAt(k); + const c2 = b.charCodeAt(k); + if (c1 != c2) { + return c1 - c2; + } + k++; + } + return len1 - len2; +} +var StringOps_default = StringOps; + +// src/lostcity/engine/script/ScriptRunner.ts +var ScriptRunner = class _ScriptRunner { + static HANDLERS = { + // Language required opcodes + ...CoreOps_default, + ...ServerOps_default, + ...PlayerOps_default, + ...NpcOps_default, + ...LocOps_default, + ...ObjOps_default, + ...NpcConfigOps_default, + ...LocConfigOps_default, + ...ObjConfigOps_default, + ...InvOps_default, + ...EnumOps_default, + ...StringOps_default, + ...NumberOps_default, + ...DbOps_default, + ...DebugOps_default + }; + /** + * + * @param script + * @param self + * @param target + * @param on + * @param args + */ + static init(script, self2 = null, target = null, args = []) { + const state = new ScriptState(script, args); + state.self = self2; + if (self2 instanceof Player) { + state._activePlayer = self2; + state.pointerAdd(ScriptPointer_default.ActivePlayer); + } else if (self2 instanceof Npc) { + state._activeNpc = self2; + state.pointerAdd(ScriptPointer_default.ActiveNpc); + } else if (self2 instanceof Loc) { + state._activeLoc = self2; + state.pointerAdd(ScriptPointer_default.ActiveLoc); + } else if (self2 instanceof Obj) { + state._activeObj = self2; + state.pointerAdd(ScriptPointer_default.ActiveObj); + } + if (target instanceof Player) { + if (self2 instanceof Player) { + state._activePlayer2 = target; + state.pointerAdd(ScriptPointer_default.ActivePlayer2); + } else { + state._activePlayer = target; + state.pointerAdd(ScriptPointer_default.ActivePlayer); + } + } else if (target instanceof Npc) { + if (self2 instanceof Npc) { + state._activeNpc2 = target; + state.pointerAdd(ScriptPointer_default.ActiveNpc2); + } else { + state._activeNpc = target; + state.pointerAdd(ScriptPointer_default.ActiveNpc); + } + } else if (target instanceof Loc) { + if (self2 instanceof Loc) { + state._activeLoc2 = target; + state.pointerAdd(ScriptPointer_default.ActiveLoc2); + } else { + state._activeLoc = target; + state.pointerAdd(ScriptPointer_default.ActiveLoc); + } + } else if (target instanceof Obj) { + if (self2 instanceof Obj) { + state._activeObj2 = target; + state.pointerAdd(ScriptPointer_default.ActiveObj2); + } else { + state._activeObj = target; + state.pointerAdd(ScriptPointer_default.ActiveObj); + } + } + return state; + } + static execute(state, reset = false, benchmark = false) { + if (!state || !state.script || !state.script.info) { + return ScriptState.ABORTED; + } + try { + if (reset) { + state.reset(); + } + if (state.execution !== ScriptState.RUNNING) { + state.executionHistory.push(state.execution); + } + state.execution = ScriptState.RUNNING; + const start = performance.now() * 1e3; + while (state.execution === ScriptState.RUNNING) { + if (state.pc >= state.script.opcodes.length || state.pc < -1) { + throw new Error("Invalid program counter: " + state.pc + ", max expected: " + state.script.opcodes.length); + } + if (!benchmark && state.opcount > 5e5) { + throw new Error("Too many instructions"); + } + state.opcount++; + _ScriptRunner.executeInner(state, state.script.opcodes[++state.pc]); + } + const time = performance.now() * 1e3 - start | 0; + if (Environment_default.NODE_DEBUG_PROFILE && time > 1e3) { + const message = `Warning [cpu time]: Script: ${state.script.info.scriptName}, time: ${time}us, opcount: ${state.opcount}`; + if (state.self instanceof Player) { + state.self.wrappedMessageGame(message); + } else { + console.warn(message); + } + } + } catch (err) { + if (state.pc >= 0 && state.pc < state.script.opcodes.length) { + const opcode = state.script.opcodes[state.pc]; + let secondary = state.intOperand; + if (opcode === ScriptOpcode_default.POP_VARP || opcode === ScriptOpcode_default.POP_VARN || opcode === ScriptOpcode_default.PUSH_VARP || opcode === ScriptOpcode_default.PUSH_VARN) { + secondary = state.intOperand >> 16 & 1; + } else if (opcode <= ScriptOpcode_default.POP_ARRAY_INT) { + secondary = 0; + } + err.message = ScriptOpcode_default[opcode].toLowerCase() + " " + err.message; + if (secondary) { + err.message = "." + err.message; + } + } + if (state.self instanceof Player) { + state.self.wrappedMessageGame(`script error: ${err.message}`); + state.self.wrappedMessageGame(`file: ${state.script.fileName}`); + state.self.wrappedMessageGame(""); + state.self.wrappedMessageGame("stack backtrace:"); + state.self.wrappedMessageGame(` 1: ${state.script.name} - ${state.script.fileName}:${state.script.lineNumber(state.pc)}`); + let trace2 = 1; + for (let i = state.fp; i > 0; i--) { + const frame = state.frames[i]; + if (frame) { + trace2++; + state.self.wrappedMessageGame(` ${trace2}: ${frame.script.name} - ${frame.script.fileName}:${frame.script.lineNumber(frame.pc)}`); + } + } + for (let i = state.debugFp; i >= 0; i--) { + const frame = state.debugFrames[i]; + if (frame) { + trace2++; + state.self.wrappedMessageGame(` ${trace2}: ${frame.script.name} - ${frame.script.fileName}:${frame.script.lineNumber(frame.pc)}`); + } + } + } + console.error(`script error: ${err.message}`); + console.error(`file: ${state.script.fileName}`); + console.error(""); + console.error("stack backtrace:"); + console.error(` 1: ${state.script.name} - ${state.script.fileName}:${state.script.lineNumber(state.pc)}`); + let trace = 1; + for (let i = state.fp; i > 0; i--) { + const frame = state.frames[i]; + if (frame) { + trace++; + console.error(` ${trace}: ${frame.script.name} - ${frame.script.fileName}:${frame.script.lineNumber(frame.pc)}`); + } + } + for (let i = state.debugFp; i >= 0; i--) { + const frame = state.debugFrames[i]; + if (frame) { + trace++; + console.error(` ${trace}: ${frame.script.name} - ${frame.script.fileName}:${frame.script.lineNumber(frame.pc)}`); + } + } + state.execution = ScriptState.ABORTED; + } + return state.execution; + } + static executeInner(state, opcode) { + const handler = _ScriptRunner.HANDLERS[opcode]; + if (!handler) { + throw new Error(`Unknown opcode ${opcode}`); + } + handler(state); + } +}; + +// src/lostcity/entity/Npc.ts +var Npc = class _Npc extends PathingEntity { + static ANIM = 2; + static FACE_ENTITY = 4; + static SAY = 8; + static DAMAGE = 16; + static CHANGE_TYPE = 32; + static SPOTANIM = 64; + static FACE_COORD = 128; + // constructor properties + nid; + type; + uid; + origType; + startX; + startZ; + levels = new Uint8Array(6); + baseLevels = new Uint8Array(6); + // runtime variables + vars; + varsString; + // script variables + activeScript = null; + delay = 0; + queue = new LinkList(); + timerInterval = 0; + timerClock = 0; + huntMode = -1; + nextHuntTick = -1; + huntrange = 5; + nextPatrolTick = -1; + nextPatrolPoint = 0; + delayedPatrol = false; + heroPoints = new Array(16); + // be sure to reset when stats are recovered/reset + constructor(level, x, z, width, length, lifecycle, nid, type, moveRestrict, blockWalk) { + super(level, x, z, width, length, lifecycle, moveRestrict, blockWalk, MoveStrategy_default.NAIVE, _Npc.FACE_COORD, _Npc.FACE_ENTITY); + this.nid = nid; + this.type = type; + this.uid = type << 16 | nid; + this.startX = this.x; + this.startZ = this.z; + this.origType = type; + const npcType = NpcType.get(type); + for (let index = 0; index < npcType.stats.length; index++) { + const level2 = npcType.stats[index]; + this.levels[index] = level2; + this.baseLevels[index] = level2; + } + if (npcType.timer !== -1) { + this.setTimer(npcType.timer); + } + this.vars = new Int32Array(VarNpcType.count); + this.varsString = new Array(VarNpcType.count); + this.targetOp = npcType.defaultmode; + this.huntMode = npcType.huntmode; + this.huntrange = npcType.huntrange; + } + resetHeroPoints() { + this.heroPoints = new Array(16); + this.heroPoints.fill({ uid: -1, points: 0 }); + } + addHero(uid, points) { + const index = this.heroPoints.findIndex((hero) => hero && hero.uid === uid); + if (index !== -1) { + this.heroPoints[index].points += points; + return; + } + const emptyIndex = this.heroPoints.findIndex((hero) => hero && hero.uid === -1); + if (emptyIndex !== -1) { + this.heroPoints[emptyIndex] = { uid, points }; + return; + } + } + findHero() { + this.heroPoints.sort((a, b) => { + return b.points - a.points; + }); + return this.heroPoints[0]?.uid ?? -1; + } + getVar(id) { + const varn = VarNpcType.get(id); + return varn.type === ScriptVarType.STRING ? this.varsString[varn.id] : this.vars[varn.id]; + } + setVar(id, value) { + const varn = VarNpcType.get(id); + if (varn.type === ScriptVarType.STRING && typeof value === "string") { + this.varsString[varn.id] = value; + } else if (typeof value === "number") { + this.vars[varn.id] = value; + } + } + resetEntity(respawn) { + if (respawn) { + this.type = this.origType; + this.uid = this.type << 16 | this.nid; + this.faceX = -1; + this.faceZ = -1; + this.orientationX = -1; + this.orientationZ = -1; + for (let index = 0; index < this.baseLevels.length; index++) { + this.levels[index] = this.baseLevels[index]; + } + this.resetHeroPoints(); + this.defaultMode(); + const npcType = NpcType.get(this.type); + this.huntrange = npcType.huntrange; + } + super.resetPathingEntity(); + } + updateMovement(repathAllowed = true) { + const type = NpcType.get(this.type); + if (type.moverestrict === MoveRestrict_default.NOMOVE) { + return false; + } + if (this.target && this.targetOp !== NpcMode_default.PLAYERFOLLOW && this.targetOp !== NpcMode_default.WANDER) { + if (this.targetOp === NpcMode_default.PLAYERESCAPE) { + const distanceToEscape = Position.distanceTo(this, { + x: this.startX, + z: this.startZ, + width: this.width, + length: this.length + }); + const targetDistanceFromStart = Position.distanceTo(this.target, { + x: this.startX, + z: this.startZ, + width: this.target.width, + length: this.target.length + }); + if (targetDistanceFromStart > type.maxrange && distanceToEscape > type.maxrange) { + return false; + } + } + if (this.targetOp >= NpcMode_default.OPPLAYER1 && this.targetOp <= NpcMode_default.OPPLAYER5) { + const distanceToX = Math.abs(this.target.x - this.startX); + const distanceToZ = Math.abs(this.target.z - this.startZ); + if (Math.max(distanceToX, distanceToZ) > type.maxrange + 1) { + this.defaultMode(); + return false; + } + if (distanceToX === type.maxrange + 1 && distanceToZ === type.maxrange + 1) { + this.defaultMode(); + return false; + } + } else if (this.targetOp >= NpcMode_default.APPLAYER1 && this.targetOp <= NpcMode_default.APPLAYER5) { + if (Position.distanceToSW(this.target, { x: this.startX, z: this.startZ }) > type.maxrange + type.attackrange) { + this.defaultMode(); + return false; + } + } + } + if (repathAllowed && this.target instanceof PathingEntity && !this.interacted && this.walktrigger === -1) { + this.pathToPathingTarget(); + } + if (this.walktrigger !== -1) { + const type2 = NpcType.get(this.type); + const script = ScriptProvider.getByTrigger(ServerTriggerType_default.AI_QUEUE1 + this.walktrigger, type2.id, type2.category); + this.walktrigger = -1; + if (script) { + const state = ScriptRunner.init(script, this, null, [this.walktriggerArg]); + ScriptRunner.execute(state); + } + } + if (this.moveSpeed !== MoveSpeed_default.INSTANT) { + this.moveSpeed = this.defaultMoveSpeed(); + } + return super.processMovement(); + } + blockWalkFlag() { + if (this.moveRestrict === MoveRestrict_default.NORMAL) { + return CollisionFlag.NPC; + } else if (this.moveRestrict === MoveRestrict_default.BLOCKED) { + return CollisionFlag.OPEN; + } else if (this.moveRestrict === MoveRestrict_default.BLOCKED_NORMAL) { + return CollisionFlag.NPC; + } else if (this.moveRestrict === MoveRestrict_default.INDOORS) { + return CollisionFlag.NPC; + } else if (this.moveRestrict === MoveRestrict_default.OUTDOORS) { + return CollisionFlag.NPC; + } else if (this.moveRestrict === MoveRestrict_default.NOMOVE) { + return CollisionFlag.NULL; + } else if (this.moveRestrict === MoveRestrict_default.PASSTHRU) { + return CollisionFlag.OPEN; + } + return CollisionFlag.NULL; + } + defaultMoveSpeed() { + return MoveSpeed_default.WALK; + } + // ---- + delayed() { + return this.delay > 0; + } + setTimer(interval) { + this.timerInterval = interval; + this.timerClock = 0; + } + executeScript(script) { + if (!script) { + return; + } + const state = ScriptRunner.execute(script); + if (state !== ScriptState.FINISHED && state !== ScriptState.ABORTED) { + if (state === ScriptState.WORLD_SUSPENDED) { + World_default.enqueueScript(script, script.popInt()); + } else if (state === ScriptState.NPC_SUSPENDED) { + script.activeNpc.activeScript = script; + } else { + script.activePlayer.activeScript = script; + } + } else if (script === this.activeScript) { + this.activeScript = null; + } + if (script.pointerGet(ScriptPointer_default.ProtectedActivePlayer) && script._activePlayer) { + script._activePlayer.protect = false; + script.pointerRemove(ScriptPointer_default.ProtectedActivePlayer); + } + if (script.pointerGet(ScriptPointer_default.ProtectedActivePlayer2) && script._activePlayer2) { + script._activePlayer2.protect = false; + script.pointerRemove(ScriptPointer_default.ProtectedActivePlayer2); + } + } + processTimers() { + if (this.timerInterval !== 0 && ++this.timerClock >= this.timerInterval) { + this.timerClock = 0; + const type = NpcType.get(this.type); + const script = ScriptProvider.getByTrigger(ServerTriggerType_default.AI_TIMER, type.id, type.category); + if (script) { + this.executeScript(ScriptRunner.init(script, this)); + } + } + } + processQueue() { + for (let request = this.queue.head(); request !== null; request = this.queue.next()) { + if (!this.delayed()) { + request.delay--; + } + if (!this.delayed() && request.delay <= 0) { + const state = ScriptRunner.init(request.script, this, null, request.args); + state.lastInt = request.lastInt; + this.executeScript(state); + request.unlink(); + } + } + } + enqueueScript(script, delay = 0, arg = 0) { + const request = new EntityQueueRequest(0 /* NORMAL */, script, [], delay); + request.lastInt = arg; + this.queue.addTail(request); + } + randomWalk(range) { + const dx = Math.round(Math.random() * (range * 2) - range); + const dz = Math.round(Math.random() * (range * 2) - range); + const destX = this.startX + dx; + const destZ = this.startZ + dz; + if (destX !== this.x || destZ !== this.z) { + this.queueWaypoint(destX, destZ); + } + } + processNpcModes() { + if (this.targetOp === NpcMode_default.NULL) { + this.defaultMode(); + } else if (this.targetOp === NpcMode_default.NONE) { + this.noMode(); + } else if (this.targetOp === NpcMode_default.WANDER) { + this.wanderMode(); + } else if (this.targetOp === NpcMode_default.PATROL) { + this.patrolMode(); + } else if (this.targetOp === NpcMode_default.PLAYERESCAPE) { + this.playerEscapeMode(); + } else if (this.targetOp === NpcMode_default.PLAYERFOLLOW) { + this.playerFollowMode(); + } else if (this.targetOp === NpcMode_default.PLAYERFACE) { + this.playerFaceMode(); + } else if (this.targetOp === NpcMode_default.PLAYERFACECLOSE) { + this.playerFaceCloseMode(); + } else { + this.aiMode(); + } + } + noMode() { + this.clearInteraction(); + this.updateMovement(false); + this.targetOp = NpcMode_default.NONE; + } + defaultMode() { + this.clearInteraction(); + this.updateMovement(false); + const type = NpcType.get(this.type); + this.targetOp = type.defaultmode; + } + wanderMode() { + const type = NpcType.get(this.type); + if (type.moverestrict !== MoveRestrict_default.NOMOVE && Math.random() < 0.125) { + this.randomWalk(type.wanderrange); + } + this.updateMovement(false); + } + patrolMode() { + const type = NpcType.get(this.type); + const patrolPoints = type.patrolCoord; + const patrolDelay = type.patrolDelay[this.nextPatrolPoint]; + let dest = Position.unpackCoord(patrolPoints[this.nextPatrolPoint]); + this.updateMovement(false); + if (!this.hasWaypoints() && !this.target) { + this.queueWaypoint(dest.x, dest.z); + } + if (!(this.x === dest.x && this.z === dest.z) && World_default.currentTick >= this.nextPatrolTick) { + this.teleport(dest.x, dest.z, dest.level); + } + if (this.x === dest.x && this.z === dest.z && !this.delayedPatrol) { + this.nextPatrolTick = World_default.currentTick + patrolDelay; + this.delayedPatrol = true; + } + if (this.nextPatrolTick > World_default.currentTick) { + return; + } + this.nextPatrolPoint = (this.nextPatrolPoint + 1) % patrolPoints.length; + this.nextPatrolTick = World_default.currentTick + 30; + this.delayedPatrol = false; + dest = Position.unpackCoord(patrolPoints[this.nextPatrolPoint]); + this.queueWaypoint(dest.x, dest.z); + } + playerEscapeMode() { + if (!this.target) { + this.defaultMode(); + return; + } + if (!(this.target instanceof Player)) { + throw new Error("[Npc] Target must be a Player for playerescape mode."); + } + if (World_default.getPlayerByUid(this.target.uid) === null) { + this.defaultMode(); + return; + } + if (Position.distanceToSW(this, this.target) > 25) { + this.defaultMode(); + return; + } + let direction; + let flags; + if (this.target.x >= this.x && this.target.z >= this.z) { + direction = Direction.SOUTH_WEST; + flags = CollisionFlag.WALL_SOUTH | CollisionFlag.WALL_WEST; + } else if (this.target.x >= this.x && this.target.z < this.z) { + direction = Direction.NORTH_WEST; + flags = CollisionFlag.WALL_NORTH | CollisionFlag.WALL_WEST; + } else if (this.target.x < this.x && this.target.z >= this.z) { + direction = Direction.SOUTH_EAST; + flags = CollisionFlag.WALL_SOUTH | CollisionFlag.WALL_EAST; + } else { + direction = Direction.NORTH_EAST; + flags = CollisionFlag.WALL_NORTH | CollisionFlag.WALL_EAST; + } + const mx = Position.moveX(this.x, direction); + const mz = Position.moveZ(this.z, direction); + if (isFlagged(mx, mz, this.level, flags)) { + this.defaultMode(); + return; + } + const position = { x: mx, z: mz, level: this.level }; + if (Position.distanceToSW(position, { + x: this.startX, + z: this.startZ + }) < NpcType.get(this.type).maxrange) { + this.queueWaypoint(position.x, position.z); + this.updateMovement(false); + return; + } + if (direction === Direction.NORTH_EAST || direction === Direction.NORTH_WEST) { + this.queueWaypoint(this.x, position.z); + } else { + this.queueWaypoint(position.x, this.z); + } + this.updateMovement(false); + } + playerFollowMode() { + const player = this.target; + if (!player) { + this.defaultMode(); + return; + } + if (!(player instanceof Player)) { + throw new Error("[Npc] Target must be a Player for playerfollow mode."); + } + if (World_default.getPlayerByUid(player.uid) === null) { + this.defaultMode(); + return; + } + if (player.level !== this.level || !Position.isWithinDistanceSW(this, player, 15)) { + this.teleport(player.x, player.z, player.level); + this.startX = player.x; + this.startZ = player.z; + } + this.pathToTarget(); + this.updateMovement(); + } + playerFaceMode() { + if (!this.target) { + this.defaultMode(); + return; + } + if (!(this.target instanceof Player)) { + throw new Error("[Npc] Target must be a Player for playerface mode."); + } + if (World_default.getPlayerByUid(this.target.uid) === null) { + this.defaultMode(); + return; + } + if (this.level !== this.target.level) { + this.defaultMode(); + return; + } + const type = NpcType.get(this.type); + if (Position.distanceTo(this, this.target) > type.maxrange) { + this.defaultMode(); + return; + } + this.clearWaypoints(); + this.updateMovement(false); + } + playerFaceCloseMode() { + if (!this.target) { + this.defaultMode(); + return; + } + if (!(this.target instanceof Player)) { + throw new Error("[Npc] Target must be a Player for playerfaceclose mode."); + } + if (World_default.getPlayerByUid(this.target.uid) == null) { + this.defaultMode(); + return; + } + if (this.level !== this.target.level) { + this.defaultMode(); + return; + } + if (Position.distanceTo(this, this.target) > 1) { + this.defaultMode(); + return; + } + this.clearWaypoints(); + this.updateMovement(false); + } + aiMode() { + if (this.delayed() || !this.target) { + this.defaultMode(); + return; + } + if (this.target.level !== this.level) { + this.defaultMode(); + return; + } + if (this.target instanceof _Npc && (typeof World_default.getNpc(this.target.nid) === "undefined" || this.target.delayed())) { + this.defaultMode(); + return; + } + if (this.target instanceof _Npc && this.targetSubject.type !== -1 && World_default.getNpcByUid(this.targetSubject.type << 16 | this.target.nid) === null) { + this.defaultMode(); + return; + } + if (this.target instanceof Obj && World_default.getObj(this.target.x, this.target.z, this.level, this.target.type, -1) === null) { + this.defaultMode(); + return; + } + if (this.target instanceof Loc && World_default.getLoc(this.target.x, this.target.z, this.level, this.target.type) === null) { + this.defaultMode(); + return; + } + if (this.target instanceof Player && World_default.getPlayerByUid(this.target.uid) === null) { + this.defaultMode(); + return; + } + const type = NpcType.get(this.type); + const apTrigger = this.targetOp >= NpcMode_default.APNPC1 && this.targetOp <= NpcMode_default.APNPC5 || this.targetOp >= NpcMode_default.APPLAYER1 && this.targetOp <= NpcMode_default.APPLAYER5 || this.targetOp >= NpcMode_default.APLOC1 && this.targetOp <= NpcMode_default.APLOC5 || this.targetOp >= NpcMode_default.APOBJ1 && this.targetOp <= NpcMode_default.APOBJ5; + const opTrigger = !apTrigger; + const script = this.getTrigger(); + if (script && opTrigger && this.inOperableDistance(this.target) && this.target instanceof PathingEntity) { + this.executeScript(ScriptRunner.init(script, this, this.target)); + this.interacted = true; + this.clearWaypoints(); + } else if (script && apTrigger && this.inApproachDistance(type.attackrange, this.target)) { + this.executeScript(ScriptRunner.init(script, this, this.target)); + this.interacted = true; + this.clearWaypoints(); + } else if (this.inOperableDistance(this.target) && this.target instanceof PathingEntity) { + this.target = null; + this.interacted = true; + this.clearWaypoints(); + } + const moved = this.updateMovement(); + if (moved) { + if (!type.givechase) { + this.defaultMode(); + return; + } + this.alreadyFacedEntity = false; + } + if (this.target && !this.interacted) { + this.interacted = false; + if (script && opTrigger && this.inOperableDistance(this.target) && (this.target instanceof PathingEntity || !moved)) { + this.executeScript(ScriptRunner.init(script, this, this.target)); + this.interacted = true; + this.clearWaypoints(); + } else if (script && apTrigger && this.inApproachDistance(type.attackrange, this.target)) { + this.executeScript(ScriptRunner.init(script, this, this.target)); + this.interacted = true; + this.clearWaypoints(); + } else if (this.inOperableDistance(this.target) && (this.target instanceof PathingEntity || !moved)) { + this.target = null; + this.interacted = true; + this.clearWaypoints(); + } + } + } + getTrigger() { + const trigger = this.getTriggerForMode(this.targetOp); + if (trigger) { + return ScriptProvider.getByTrigger(trigger, this.type, -1) ?? null; + } + return null; + } + getTriggerForMode(mode) { + if (mode === NpcMode_default.OPPLAYER1) { + return ServerTriggerType_default.AI_OPPLAYER1; + } else if (mode === NpcMode_default.OPPLAYER2) { + return ServerTriggerType_default.AI_OPPLAYER2; + } else if (mode === NpcMode_default.OPPLAYER3) { + return ServerTriggerType_default.AI_OPPLAYER3; + } else if (mode === NpcMode_default.OPPLAYER4) { + return ServerTriggerType_default.AI_OPPLAYER4; + } else if (mode === NpcMode_default.OPPLAYER5) { + return ServerTriggerType_default.AI_OPPLAYER5; + } else if (mode === NpcMode_default.APPLAYER1) { + return ServerTriggerType_default.AI_APPLAYER1; + } else if (mode === NpcMode_default.APPLAYER2) { + return ServerTriggerType_default.AI_APPLAYER2; + } else if (mode === NpcMode_default.APPLAYER3) { + return ServerTriggerType_default.AI_APPLAYER3; + } else if (mode === NpcMode_default.APPLAYER4) { + return ServerTriggerType_default.AI_APPLAYER4; + } else if (mode === NpcMode_default.APPLAYER5) { + return ServerTriggerType_default.AI_APPLAYER5; + } else if (mode === NpcMode_default.OPLOC1) { + return ServerTriggerType_default.AI_OPLOC1; + } else if (mode === NpcMode_default.OPLOC2) { + return ServerTriggerType_default.AI_OPLOC2; + } else if (mode === NpcMode_default.OPLOC3) { + return ServerTriggerType_default.AI_OPLOC3; + } else if (mode === NpcMode_default.OPLOC4) { + return ServerTriggerType_default.AI_OPLOC4; + } else if (mode === NpcMode_default.OPLOC5) { + return ServerTriggerType_default.AI_OPLOC5; + } else if (mode === NpcMode_default.APLOC1) { + return ServerTriggerType_default.AI_APLOC1; + } else if (mode === NpcMode_default.APLOC2) { + return ServerTriggerType_default.AI_APLOC2; + } else if (mode === NpcMode_default.APLOC3) { + return ServerTriggerType_default.AI_APLOC3; + } else if (mode === NpcMode_default.APLOC4) { + return ServerTriggerType_default.AI_APLOC4; + } else if (mode === NpcMode_default.APLOC5) { + return ServerTriggerType_default.AI_APLOC5; + } else if (mode === NpcMode_default.OPOBJ1) { + return ServerTriggerType_default.AI_OPOBJ1; + } else if (mode === NpcMode_default.OPOBJ2) { + return ServerTriggerType_default.AI_OPOBJ2; + } else if (mode === NpcMode_default.OPOBJ3) { + return ServerTriggerType_default.AI_OPOBJ3; + } else if (mode === NpcMode_default.OPOBJ4) { + return ServerTriggerType_default.AI_OPOBJ4; + } else if (mode === NpcMode_default.OPOBJ5) { + return ServerTriggerType_default.AI_OPOBJ5; + } else if (mode === NpcMode_default.APOBJ1) { + return ServerTriggerType_default.AI_APOBJ1; + } else if (mode === NpcMode_default.APOBJ2) { + return ServerTriggerType_default.AI_APOBJ2; + } else if (mode === NpcMode_default.APOBJ3) { + return ServerTriggerType_default.AI_APOBJ3; + } else if (mode === NpcMode_default.APOBJ4) { + return ServerTriggerType_default.AI_APOBJ4; + } else if (mode === NpcMode_default.APOBJ5) { + return ServerTriggerType_default.AI_APOBJ5; + } else if (mode === NpcMode_default.OPNPC1) { + return ServerTriggerType_default.AI_OPNPC1; + } else if (mode === NpcMode_default.OPNPC2) { + return ServerTriggerType_default.AI_OPNPC2; + } else if (mode === NpcMode_default.OPNPC3) { + return ServerTriggerType_default.AI_OPNPC3; + } else if (mode === NpcMode_default.OPNPC4) { + return ServerTriggerType_default.AI_OPNPC4; + } else if (mode === NpcMode_default.OPNPC5) { + return ServerTriggerType_default.AI_OPNPC5; + } else if (mode === NpcMode_default.APNPC1) { + return ServerTriggerType_default.AI_APNPC1; + } else if (mode === NpcMode_default.APNPC2) { + return ServerTriggerType_default.AI_APNPC2; + } else if (mode === NpcMode_default.APNPC3) { + return ServerTriggerType_default.AI_APNPC3; + } else if (mode === NpcMode_default.APNPC4) { + return ServerTriggerType_default.AI_APNPC4; + } else if (mode === NpcMode_default.APNPC5) { + return ServerTriggerType_default.AI_APNPC5; + } else if (mode === NpcMode_default.QUEUE1) { + return ServerTriggerType_default.AI_QUEUE1; + } else if (mode === NpcMode_default.QUEUE2) { + return ServerTriggerType_default.AI_QUEUE2; + } else if (mode === NpcMode_default.QUEUE3) { + return ServerTriggerType_default.AI_QUEUE3; + } else if (mode === NpcMode_default.QUEUE4) { + return ServerTriggerType_default.AI_QUEUE4; + } else if (mode === NpcMode_default.QUEUE5) { + return ServerTriggerType_default.AI_QUEUE5; + } else if (mode === NpcMode_default.QUEUE6) { + return ServerTriggerType_default.AI_QUEUE6; + } else if (mode === NpcMode_default.QUEUE7) { + return ServerTriggerType_default.AI_QUEUE7; + } else if (mode === NpcMode_default.QUEUE8) { + return ServerTriggerType_default.AI_QUEUE8; + } else if (mode === NpcMode_default.QUEUE9) { + return ServerTriggerType_default.AI_QUEUE9; + } else if (mode === NpcMode_default.QUEUE10) { + return ServerTriggerType_default.AI_QUEUE10; + } else if (mode === NpcMode_default.QUEUE11) { + return ServerTriggerType_default.AI_QUEUE11; + } else if (mode === NpcMode_default.QUEUE12) { + return ServerTriggerType_default.AI_QUEUE12; + } else if (mode === NpcMode_default.QUEUE13) { + return ServerTriggerType_default.AI_QUEUE13; + } else if (mode === NpcMode_default.QUEUE14) { + return ServerTriggerType_default.AI_QUEUE14; + } else if (mode === NpcMode_default.QUEUE15) { + return ServerTriggerType_default.AI_QUEUE15; + } else if (mode === NpcMode_default.QUEUE16) { + return ServerTriggerType_default.AI_QUEUE16; + } else if (mode === NpcMode_default.QUEUE17) { + return ServerTriggerType_default.AI_QUEUE17; + } else if (mode === NpcMode_default.QUEUE18) { + return ServerTriggerType_default.AI_QUEUE18; + } else if (mode === NpcMode_default.QUEUE19) { + return ServerTriggerType_default.AI_QUEUE19; + } else if (mode === NpcMode_default.QUEUE20) { + return ServerTriggerType_default.AI_QUEUE20; + } + return null; + } + huntAll() { + if (this.nextHuntTick > World_default.currentTick) { + return; + } + const hunt = HuntType.get(this.huntMode); + if (hunt.type === HuntModeType_default.OFF) { + return; + } + if (hunt.nobodyNear === HuntNobodyNear_default.PAUSEHUNT && !World_default.getZoneGrid(this.level).isFlagged(Position.zone(this.x), Position.zone(this.z), 5)) { + return; + } + if (!hunt.findKeepHunting && this.target !== null) { + return; + } + let hunted; + if (hunt.type === HuntModeType_default.PLAYER) { + hunted = this.huntPlayers(hunt); + } else if (hunt.type === HuntModeType_default.NPC) { + hunted = this.huntNpcs(hunt); + } else if (hunt.type === HuntModeType_default.OBJ) { + hunted = this.huntObjs(hunt); + } else { + hunted = this.huntLocs(hunt); + } + if (hunted.length > 0) { + const entity = hunted[Math.floor(Math.random() * hunted.length)]; + this.setInteraction(Interaction_default.SCRIPT, entity, hunt.findNewMode); + } + this.nextHuntTick = World_default.currentTick + hunt.rate; + } + huntPlayers(hunt) { + const type = NpcType.get(this.type); + const players = []; + const hunted = new HuntIterator(World_default.currentTick, this.level, this.x, this.z, this.huntrange, hunt.checkVis, -1, -1, HuntModeType_default.PLAYER); + const opTrigger = hunt.findNewMode >= NpcMode_default.OPPLAYER1 && hunt.findNewMode <= NpcMode_default.OPPLAYER5; + for (const player of hunted) { + if (!(player instanceof Player)) { + throw new Error("[Npc] huntAll must be of type Player here."); + } + if (opTrigger) { + const distanceToX = Math.abs(player.x - this.startX); + const distanceToZ = Math.abs(player.z - this.startZ); + if (Math.max(distanceToX, distanceToZ) > type.maxrange + 1) { + continue; + } + if (distanceToX === type.maxrange + 1 && distanceToZ === type.maxrange + 1) { + continue; + } + } else { + if (Position.distanceToSW(player, { x: this.startX, z: this.startZ }) > type.maxrange + type.attackrange) { + continue; + } + } + if (hunt.checkAfk && player.zonesAfk()) { + continue; + } + if (hunt.checkNotTooStrong === HuntCheckNotTooStrong_default.OUTSIDE_WILDERNESS && !player.isInWilderness() && player.combatLevel > type.vislevel * 2) { + continue; + } + if (hunt.checkNotCombat !== -1 && player.getVar(hunt.checkNotCombat) + 8 > World_default.currentTick) { + continue; + } else if (hunt.checkNotCombatSelf !== -1 && this.getVar(hunt.checkNotCombatSelf) >= World_default.currentTick) { + continue; + } + if (hunt.checkInv !== -1) { + let quantity = 0; + if (hunt.checkObj !== -1) { + quantity = player.invTotal(hunt.checkInv, hunt.checkObj); + } else if (hunt.checkObjParam !== -1) { + quantity = player.invTotalParam(hunt.checkInv, hunt.checkObjParam); + } + if (quantity < hunt.checkInvMinQuantity || quantity > hunt.checkInvMaxQuantity) { + continue; + } + } + if (hunt.checkNotBusy && player.busy()) { + continue; + } + players.push(player); + } + return players; + } + huntNpcs(hunt) { + return Array.from(new HuntIterator(World_default.currentTick, this.level, this.x, this.z, this.huntrange, hunt.checkVis, hunt.checkNpc, hunt.checkCategory, HuntModeType_default.NPC)); + } + huntObjs(hunt) { + return Array.from(new HuntIterator(World_default.currentTick, this.level, this.x, this.z, this.huntrange, hunt.checkVis, hunt.checkObj, hunt.checkCategory, HuntModeType_default.OBJ)); + } + huntLocs(hunt) { + return Array.from(new HuntIterator(World_default.currentTick, this.level, this.x, this.z, this.huntrange, hunt.checkVis, hunt.checkLoc, hunt.checkCategory, HuntModeType_default.SCENERY)); + } + // ---- + playAnimation(anim, delay) { + if (anim >= SeqType.count) { + return; + } + if (anim == -1 || this.animId == -1 || SeqType.get(anim).priority > SeqType.get(this.animId).priority || SeqType.get(this.animId).priority === 0) { + this.animId = anim; + this.animDelay = delay; + this.mask |= _Npc.ANIM; + } + } + spotanim(spotanim, height, delay) { + this.graphicId = spotanim; + this.graphicHeight = height; + this.graphicDelay = delay; + this.mask |= _Npc.SPOTANIM; + } + applyDamage(damage, type) { + this.damageTaken = damage; + this.damageType = type; + const current = this.levels[NpcStat_default.HITPOINTS]; + if (current - damage <= 0) { + this.levels[NpcStat_default.HITPOINTS] = 0; + this.damageTaken = current; + } else { + this.levels[NpcStat_default.HITPOINTS] = current - damage; + } + this.mask |= _Npc.DAMAGE; + } + say(text) { + if (!text) { + return; + } + this.chat = text; + this.mask |= _Npc.SAY; + } + faceSquare(x, z) { + this.faceX = x * 2 + 1; + this.faceZ = z * 2 + 1; + this.orientationX = this.faceX; + this.orientationZ = this.faceZ; + this.mask |= _Npc.FACE_COORD; + } + changeType(type) { + this.type = type; + this.mask |= _Npc.CHANGE_TYPE; + this.uid = type << 16 | this.nid; + const npcType = NpcType.get(type); + this.setTimer(npcType.timer); + } +}; + +// src/lostcity/engine/GameMap.ts +var GameMap = class _GameMap { + static OPEN = 0; + static BLOCKED = 1; + static BRIDGE = 2; + static ROOF = 4; + static WALL = 8; + static LOWMEMORY = 16; + static Y = 4; + static X = 64; + static Z = 64; + static MAPSQUARE = _GameMap.X * _GameMap.Y * _GameMap.Z; + init(zoneMap) { + console.time("Loading game map"); + const path4 = "data/pack/server/maps/"; + const maps2 = fs26.readdirSync(path4).filter((x) => x[0] === "m"); + for (let index = 0; index < maps2.length; index++) { + const [mx, mz] = maps2[index].substring(1).split("_").map(Number); + const mapsquareX = mx << 6; + const mapsquareZ = mz << 6; + this.decodeNpcs(Packet.load(`${path4}n${mx}_${mz}`), mapsquareX, mapsquareZ); + this.decodeObjs(Packet.load(`${path4}o${mx}_${mz}`), mapsquareX, mapsquareZ, zoneMap); + const lands = new Int8Array(_GameMap.MAPSQUARE); + this.decodeLands(lands, Packet.load(`${path4}m${mx}_${mz}`), mapsquareX, mapsquareZ); + this.decodeLocs(lands, Packet.load(`${path4}l${mx}_${mz}`), mapsquareX, mapsquareZ, zoneMap); + } + console.timeEnd("Loading game map"); + } + async initAsync(zoneMap) { + console.time("Loading game map"); + const path4 = "data/pack/server/maps/"; + const { serverMaps: serverMaps2 } = await Promise.resolve().then(() => (init_PreloadedDirs(), PreloadedDirs_exports)); + const maps2 = serverMaps2.map(async (map) => { + const [mx, mz] = map.substring(1).split("_").map(Number); + const mapsquareX = mx << 6; + const mapsquareZ = mz << 6; + const [npcData, objData, landData, locData] = await Promise.all([ + await Packet.loadAsync(`${path4}n${mx}_${mz}`), + await Packet.loadAsync(`${path4}o${mx}_${mz}`), + await Packet.loadAsync(`${path4}m${mx}_${mz}`), + await Packet.loadAsync(`${path4}l${mx}_${mz}`) + ]); + this.decodeNpcs(npcData, mapsquareX, mapsquareZ); + this.decodeObjs(objData, mapsquareX, mapsquareZ, zoneMap); + const lands = new Int8Array(_GameMap.MAPSQUARE); + this.decodeLands(lands, landData, mapsquareX, mapsquareZ); + this.decodeLocs(lands, locData, mapsquareX, mapsquareZ, zoneMap); + }); + console.timeEnd("Loading game map"); + } + /** + * Change collision at a specified Position for lands/floors. + * @param x The x pos. + * @param z The z pos. + * @param level The level pos. + * @param add True if adding this collision. False if removing. + */ + changeLandCollision(x, z, level, add) { + changeFloor(x, z, level, add); + } + /** + * Change collision at a specified Position for locs. + * @param shape The shape of the loc to change. + * @param angle The angle of the loc to change. + * @param blockrange If this loc blocks range. + * @param length The length of this loc. + * @param width The width of this loc. + * @param active If this loc is active. + * @param x The x pos. + * @param z The z pos. + * @param level The level pos. + * @param add True if adding this collision. False if removing. + */ + changeLocCollision(shape, angle, blockrange, length, width, active, x, z, level, add) { + const locLayer = locShapeLayer(shape); + if (locLayer === LocLayer.WALL) { + changeWall(x, z, level, angle, shape, blockrange, false, add); + } else if (locLayer === LocLayer.GROUND) { + if (angle === LocAngle.NORTH || angle === LocAngle.SOUTH) { + changeLoc(x, z, level, length, width, blockrange, false, add); + } else { + changeLoc(x, z, level, width, length, blockrange, false, add); + } + } else if (locLayer === LocLayer.GROUND_DECOR) { + if (active === 1) { + changeFloor(x, z, level, add); + } + } + } + /** + * Change collision at a specified Position for npcs. + * @param size The size square of this npc. (1x1, 2x2, etc). + * @param x The x pos. + * @param z The z pos. + * @param level The level pos. + * @param add True if adding this collision. False if removing. + */ + changeNpcCollision(size, x, z, level, add) { + changeNpc(x, z, level, size, add); + } + /** + * Change collision at a specified Position for players. + * @param size The size square of this npc. (1x1, 2x2, etc). + * @param x The x pos. + * @param z The z pos. + * @param level The level pos. + * @param add True if adding this collision. False if removing. + */ + changePlayerCollision(size, x, z, level, add) { + changePlayer(x, z, level, size, add); + } + /** + * Change collision at a specified Position for roofs. + * @param x The x pos. + * @param z The z pos. + * @param level The level pos. + * @param add True if adding this collision. False if removing. + */ + changeRoofCollision(x, z, level, add) { + changeRoof(x, z, level, add); + } + decodeNpcs(packet, mapsquareX, mapsquareZ) { + while (packet.available > 0) { + const { x, z, level } = this.unpackCoord(packet.g2()); + const absoluteX = mapsquareX + x; + const absoluteZ = mapsquareZ + z; + const count = packet.g1(); + for (let index = 0; index < count; index++) { + const npcType = NpcType.get(packet.g2()); + const size = npcType.size; + const npc = new Npc(level, absoluteX, absoluteZ, size, size, EntityLifeCycle_default.RESPAWN, World_default.getNextNid(), npcType.id, npcType.moverestrict, npcType.blockwalk); + if (npcType.members && Environment_default.NODE_MEMBERS || !npcType.members) { + World_default.addNpc(npc, -1); + } + } + } + } + decodeObjs(packet, mapsquareX, mapsquareZ, zoneMap) { + while (packet.available > 0) { + const { x, z, level } = this.unpackCoord(packet.g2()); + const absoluteX = mapsquareX + x; + const absoluteZ = mapsquareZ + z; + const count = packet.g1(); + for (let j = 0; j < count; j++) { + const objType = ObjType.get(packet.g2()); + const obj = new Obj(level, absoluteX, absoluteZ, EntityLifeCycle_default.RESPAWN, objType.id, packet.g1()); + if (objType.members && Environment_default.NODE_MEMBERS || !objType.members) { + zoneMap.zone(obj.x, obj.z, obj.level).addStaticObj(obj); + } + } + } + } + decodeLands(lands, packet, mapsquareX, mapsquareZ) { + for (let level = 0; level < _GameMap.Y; level++) { + for (let x = 0; x < _GameMap.X; x++) { + for (let z = 0; z < _GameMap.Z; z++) { + while (true) { + const opcode = packet.g1(); + if (opcode === 0) { + break; + } else if (opcode === 1) { + packet.pos++; + break; + } + if (opcode <= 49) { + packet.pos++; + } else if (opcode <= 81) { + lands[this.packCoord(x, z, level)] = opcode - 49; + } + } + } + } + } + for (let level = 0; level < _GameMap.Y; level++) { + for (let x = 0; x < _GameMap.X; x++) { + const absoluteX = x + mapsquareX; + for (let z = 0; z < _GameMap.Z; z++) { + const absoluteZ = z + mapsquareZ; + if (x % 7 === 0 && z % 7 === 0) { + allocateIfAbsent(absoluteX, absoluteZ, level); + } + const land = lands[this.packCoord(x, z, level)]; + if ((land & _GameMap.ROOF) !== _GameMap.OPEN) { + this.changeRoofCollision(absoluteX, absoluteZ, level, true); + } + if ((land & _GameMap.BLOCKED) !== _GameMap.BLOCKED) { + continue; + } + const bridged = (level === 1 ? land & _GameMap.BRIDGE : lands[this.packCoord(x, z, 1)] & _GameMap.BRIDGE) === _GameMap.BRIDGE; + const actualLevel = bridged ? level - 1 : level; + if (actualLevel < 0) { + continue; + } + this.changeLandCollision(absoluteX, absoluteZ, actualLevel, true); + } + } + } + } + decodeLocs(lands, packet, mapsquareX, mapsquareZ, zoneMap) { + let locId = -1; + let locIdOffset = packet.gsmart(); + while (locIdOffset !== 0) { + locId += locIdOffset; + let coord = 0; + let coordOffset = packet.gsmart(); + while (coordOffset !== 0) { + const { x, z, level } = this.unpackCoord(coord += coordOffset - 1); + const info = packet.g1(); + coordOffset = packet.gsmart(); + const bridged = (level === 1 ? lands[coord] & _GameMap.BRIDGE : lands[this.packCoord(x, z, 1)] & _GameMap.BRIDGE) === _GameMap.BRIDGE; + const actualLevel = bridged ? level - 1 : level; + if (actualLevel < 0) { + continue; + } + const type = LocType.get(locId); + const width = type.width; + const length = type.length; + const shape = info >> 2; + const angle = info & 3; + const absoluteX = x + mapsquareX; + const absoluteZ = z + mapsquareZ; + zoneMap.zone(absoluteX, absoluteZ, actualLevel).addStaticLoc(new Loc(actualLevel, absoluteX, absoluteZ, width, length, EntityLifeCycle_default.RESPAWN, locId, shape, angle)); + if (type.blockwalk) { + this.changeLocCollision(shape, angle, type.blockrange, length, width, type.active, absoluteX, absoluteZ, actualLevel, true); + } + } + locIdOffset = packet.gsmart(); + } + } + packCoord(x, z, level) { + return z & 63 | (x & 63) << 6 | (level & 3) << 12; + } + unpackCoord(packed) { + const z = packed & 63; + const x = packed >> 6 & 63; + const level = packed >> 12 & 3; + return { x, z, level }; + } +}; + +// src/lostcity/engine/Login.ts + +// src/jagex2/io/Isaac.ts +var Isaac = class { + count = 0; + rsl = new Int32Array(256); + mem = new Int32Array(256); + a = 0; + b = 0; + c = 0; + constructor(seed = [0, 0, 0, 0]) { + for (let i = 0; i < seed.length; i++) { + this.rsl[i] = seed[i]; + } + this.init(); + } + // prettier-ignore + init() { + let a = 2654435769, b = 2654435769, c = 2654435769, d = 2654435769, e = 2654435769, f = 2654435769, g = 2654435769, h = 2654435769; + for (let i = 0; i < 4; i++) { + a ^= b << 11; + d += a; + b += c; + b ^= c >>> 2; + e += b; + c += d; + c ^= d << 8; + f += c; + d += e; + d ^= e >>> 16; + g += d; + e += f; + e ^= f << 10; + h += e; + f += g; + f ^= g >>> 4; + a += f; + g += h; + g ^= h << 8; + b += g; + h += a; + h ^= a >>> 9; + c += h; + a += b; + } + for (let i = 0; i < 256; i += 8) { + a += this.rsl[i]; + b += this.rsl[i + 1]; + c += this.rsl[i + 2]; + d += this.rsl[i + 3]; + e += this.rsl[i + 4]; + f += this.rsl[i + 5]; + g += this.rsl[i + 6]; + h += this.rsl[i + 7]; + a ^= b << 11; + d += a; + b += c; + b ^= c >>> 2; + e += b; + c += d; + c ^= d << 8; + f += c; + d += e; + d ^= e >>> 16; + g += d; + e += f; + e ^= f << 10; + h += e; + f += g; + f ^= g >>> 4; + a += f; + g += h; + g ^= h << 8; + b += g; + h += a; + h ^= a >>> 9; + c += h; + a += b; + this.mem[i] = a; + this.mem[i + 1] = b; + this.mem[i + 2] = c; + this.mem[i + 3] = d; + this.mem[i + 4] = e; + this.mem[i + 5] = f; + this.mem[i + 6] = g; + this.mem[i + 7] = h; + } + for (let i = 0; i < 256; i += 8) { + a += this.mem[i]; + b += this.mem[i + 1]; + c += this.mem[i + 2]; + d += this.mem[i + 3]; + e += this.mem[i + 4]; + f += this.mem[i + 5]; + g += this.mem[i + 6]; + h += this.mem[i + 7]; + a ^= b << 11; + d += a; + b += c; + b ^= c >>> 2; + e += b; + c += d; + c ^= d << 8; + f += c; + d += e; + d ^= e >>> 16; + g += d; + e += f; + e ^= f << 10; + h += e; + f += g; + f ^= g >>> 4; + a += f; + g += h; + g ^= h << 8; + b += g; + h += a; + h ^= a >>> 9; + c += h; + a += b; + this.mem[i] = a; + this.mem[i + 1] = b; + this.mem[i + 2] = c; + this.mem[i + 3] = d; + this.mem[i + 4] = e; + this.mem[i + 5] = f; + this.mem[i + 6] = g; + this.mem[i + 7] = h; + } + this.isaac(); + this.count = 256; + } + isaac() { + this.c++; + this.b += this.c; + for (let i = 0; i < 256; i++) { + const x = this.mem[i]; + switch (i & 3) { + case 0: + this.a ^= this.a << 13; + break; + case 1: + this.a ^= this.a >>> 6; + break; + case 2: + this.a ^= this.a << 2; + break; + case 3: + this.a ^= this.a >>> 16; + break; + } + this.a += this.mem[i + 128 & 255]; + let y; + this.mem[i] = y = this.mem[x >>> 2 & 255] + this.a + this.b; + this.rsl[i] = this.b = this.mem[y >>> 8 >>> 2 & 255] + x; + } + } + nextInt() { + if (this.count-- === 0) { + this.isaac(); + this.count = 255; + } + return this.rsl[this.count]; + } +}; + +// src/lostcity/util/WorkerFactory.ts +function createWorker(fileName) { + if (typeof self === "undefined") { + return new NodeWorker(fileName); + } else { + return new Worker(fileName, { type: "module" }); + } +} + +// src/lostcity/server/LoginServer.ts +var LoginResponse = class { + static SUCCESSFUL = Uint8Array.from([2]); + static INVALID_USER_OR_PASS = Uint8Array.from([3]); + // Invalid username or password. + static ACCOUNT_DISABLED = Uint8Array.from([4]); + // Your account has been disabled. + static LOGGED_IN = Uint8Array.from([5]); + // Your account is already logged in. + static SERVER_UPDATED = Uint8Array.from([6]); + // RuneScape has been updated! + static WORLD_FULL = Uint8Array.from([7]); + // This world is full. + static LOGIN_SERVER_OFFLINE = Uint8Array.from([8]); + // Unable to connect. + static LOGIN_LIMIT_EXCEEDED = Uint8Array.from([9]); + // Login limit exceeded. + static UNABLE_TO_CONNECT = Uint8Array.from([10]); + // Unable to connect. + static LOGIN_REJECTED = Uint8Array.from([11]); + // Login server rejected session. + static NEED_MEMBERS_ACCOUNT = Uint8Array.from([12]); + // You need a members account to login to this world. + static COULD_NOT_COMPLETE = Uint8Array.from([13]); + // Could not complete login. + static SERVER_UPDATING = Uint8Array.from([14]); + // The server is being updated. + static RECONNECTING = Uint8Array.from([15]); + static LOGIN_ATTEMPTS_EXCEEDED = Uint8Array.from([16]); + // Login attempts exceeded. + static STANDING_IN_MEMBERS = Uint8Array.from([17]); + // You are standing in a members-only area. + static STAFF_MOD_LEVEL = Uint8Array.from([18]); +}; + +// src/lostcity/server/CrcTable.ts +var CrcBuffer = new Packet(new Uint8Array(4 * 9)); +var CrcTable = []; +var CrcBuffer32 = 0; +function makeCrc(path4) { + if (!fs28.existsSync(path4)) { + return; + } + const packet = Packet.load(path4); + const crc = Packet.getcrc(packet.data, 0, packet.data.length); + CrcTable.push(crc); + CrcBuffer.p4(crc); +} +function makeCrcs() { + CrcTable = []; + CrcBuffer.pos = 0; + CrcBuffer.p4(0); + makeCrc("data/pack/client/title"); + makeCrc("data/pack/client/config"); + makeCrc("data/pack/client/interface"); + makeCrc("data/pack/client/media"); + makeCrc("data/pack/client/models"); + makeCrc("data/pack/client/textures"); + makeCrc("data/pack/client/wordenc"); + makeCrc("data/pack/client/sounds"); + CrcBuffer32 = Packet.getcrc(CrcBuffer.data, 0, CrcBuffer.data.length); +} +async function makeCrcAsync(path4) { + const file = await fetch(path4); + if (!file.ok) { + return; + } + const packet = new Packet(new Uint8Array(await file.arrayBuffer())); + const crc = Packet.getcrc(packet.data, 0, packet.data.length); + return crc; +} +async function makeCrcsAsync() { + CrcTable = []; + CrcBuffer.pos = 0; + CrcBuffer.p4(0); + const [title, config, iface, media, models, textures, wordenc, sounds] = await Promise.all([ + makeCrcAsync("data/pack/client/title"), + makeCrcAsync("data/pack/client/config"), + makeCrcAsync("data/pack/client/interface"), + makeCrcAsync("data/pack/client/media"), + makeCrcAsync("data/pack/client/models"), + makeCrcAsync("data/pack/client/textures"), + makeCrcAsync("data/pack/client/wordenc"), + makeCrcAsync("data/pack/client/sounds") + ]); + for (const crc of [title, config, iface, media, models, textures, wordenc, sounds]) { + if (crc) { + CrcTable.push(crc); + CrcBuffer.p4(crc); + } + } + CrcBuffer32 = Packet.getcrc(CrcBuffer.data, 0, CrcBuffer.data.length); +} +if (typeof self === "undefined") { + if (fs28.existsSync("data/pack/client/")) { + makeCrcs(); + } +} + +// src/lostcity/engine/Login.ts +var Login = class { + loginThread = createWorker(typeof self === "undefined" ? "./src/lostcity/server/LoginThread.ts" : "LoginThread.js"); + loginRequests = /* @__PURE__ */ new Map(); + logoutRequests = /* @__PURE__ */ new Set(); + constructor() { + try { + if (typeof self === "undefined") { + if (this.loginThread instanceof NodeWorker2) { + this.loginThread.on("message", (msg) => { + this.onMessage(msg); + }); + } + } else { + if (this.loginThread instanceof Worker) { + this.loginThread.onmessage = (msg) => { + this.onMessage(msg.data); + }; + } + } + } catch (err) { + console.error("Login Thread:", err); + } + } + async readIn(socket, data) { + const opcode = data.g1(); + if (opcode === 16) { + const length = data.g1(); + if (data.available < length) { + socket.terminate(); + return; + } + const post = new Uint8Array(length); + data.gdata(post, 0, post.length); + data.pos -= post.length; + const revision = data.g1(); + if (revision !== 225) { + socket.writeImmediate(LoginResponse.SERVER_UPDATED); + socket.close(); + return; + } + data.pos += 1; + const crcs = new Uint8Array(9 * 4); + data.gdata(crcs, 0, crcs.length); + if (!Packet.checkcrc(crcs, 0, crcs.length, CrcBuffer32)) { + socket.writeImmediate(LoginResponse.SERVER_UPDATED); + socket.close(); + return; + } + this.loginThread.postMessage({ + type: "loginreq", + opcode, + data: post, + socket: socket.uniqueId + }); + this.loginRequests.set(socket.uniqueId, socket); + } else { + socket.terminate(); + } + } + logout(player) { + if (this.logoutRequests.has(player.username37)) { + return; + } + const save = player.save(); + this.loginThread.postMessage({ + type: "logout", + username: player.username, + save: save.data.subarray(0, save.pos) + }); + save.release(); + } + onMessage(msg) { + switch (msg.type) { + case "loginreply": { + const { status, socket } = msg; + const client = this.loginRequests.get(socket); + if (!client) { + return; + } + this.loginRequests.delete(socket); + if (status[0] !== 2) { + client.writeImmediate(status); + client.close(); + return; + } + const { info, seed, username, save } = msg; + if (World_default.getTotalPlayers() >= 2e3) { + client.writeImmediate(LoginResponse.WORLD_FULL); + client.close(); + return; + } + if (World_default.shutdownTick > -1 && World_default.currentTick - World_default.shutdownTick > 0) { + client.writeImmediate(LoginResponse.SERVER_UPDATING); + client.close(); + return; + } + if (!Environment_default.LOGIN_KEY) { + for (const player2 of World_default.players) { + if (player2.username === username) { + client.writeImmediate(LoginResponse.LOGGED_IN); + client.close(); + return; + } + } + } + client.decryptor = new Isaac(seed); + for (let i = 0; i < 4; i++) { + seed[i] += 50; + } + client.encryptor = new Isaac(seed); + const player = PlayerLoading.load(username, new Packet(save), client); + player.lowMemory = (info & 1) !== 0; + player.webClient = client.isWebSocket(); + World_default.addPlayer(player); + break; + } + case "logoutreply": { + const { username } = msg; + const player = World_default.getPlayerByUsername(username); + if (player) { + World_default.getZone(player.x, player.z, player.level).leave(player); + World_default.players.remove(player.pid); + player.pid = -1; + player.terminate(); + this.logoutRequests.delete(player.username37); + } + break; + } + default: + throw new Error("Unknown message type: " + msg.type); + } + } +}; +var Login_default = new Login(); + +// src/lostcity/entity/EntityList.ts +var EntityList = class extends Array { + // constructor + free; + indexPadding; + ids; + // runtime + lastUsedIndex = 0; + constructor(size, indexPadding) { + super(size); + this.ids = new Int32Array(size).fill(-1); + this.free = new Set(Array.from({ length: size }, (_, index) => index)); + this.indexPadding = indexPadding; + } + next(_ = false, start = this.lastUsedIndex + 1) { + const length = this.ids.length; + for (let index = start; index < length; index++) { + if (this.ids[index] === -1) { + return index; + } + } + for (let index = this.indexPadding; index < start; index++) { + if (this.ids[index] === -1) { + return index; + } + } + throw new Error("[EntityList] no space for new entities"); + } + *[Symbol.iterator]() { + for (const index of this.ids) { + if (index === -1) { + continue; + } + const entity = this[index]; + if (typeof entity === "undefined") { + continue; + } + yield entity; + } + } + get count() { + let count = 0; + for (const _ of this[Symbol.iterator]()) { + count++; + } + return count; + } + get(id) { + const index = this.ids[id]; + return index !== -1 ? this[index] : void 0; + } + set(id, entity) { + if (!this.free.size) { + throw new Error("[EntityList] cannot find available entities slot."); + } + const index = this.free.values().next().value; + this.free.delete(index); + this.ids[id] = index; + this[index] = entity; + this.lastUsedIndex = id; + } + remove(id) { + const index = this.ids[id]; + if (index !== -1) { + this.ids[id] = -1; + this.free.add(index); + } + } + reset() { + this.length = 0; + this.ids.fill(-1); + this.free.clear(); + for (let i = 0; i < this.ids.length; i++) { + this.free.add(i); + } + } +}; +var NpcList = class extends EntityList { + constructor(size) { + super(size, 0); + } +}; +var PlayerList = class extends EntityList { + constructor(size) { + super(size, 1); + } + next(priority = false, start = this.lastUsedIndex + 1) { + if (priority) { + const init = start === 0 ? 1 : 0; + for (let i = init; i < 100; i++) { + const index = start + i; + const id = this.ids[index]; + if (id === -1) { + return index; + } + } + } + return super.next(); + } +}; + +// src/lostcity/engine/World.ts +var World = class _World { + static PLAYERS = 2048; + static NPCS = 8192; + static NORMAL_TICKRATE = 600; + static SHUTDOWN_TICKRATE = 1; + static LOGIN_PINGRATE = 100; + static INV_STOCKRATE = 100; + static AFK_EVENTRATE = 500; + static PLAYER_SAVERATE = 1500; + static SHUTDOWN_TICKS = 24e3; + static TIMEOUT_IDLE_TICKS = 75; + static TIMEOUT_LOGOUT_TICKS = 100; + gameMap; + zoneMap; + invs; + // shared inventories (shops) + // entities + newPlayers; + // players joining at the end of this tick + players; + npcs; + // zones + zonesTracking; + queue; + // debug data + lastCycleStats; + cycleStats; + tickRate = _World.NORMAL_TICKRATE; + // speeds up when we're processing server shutdown + currentTick = 0; + shutdownTick = -1; + // packed data timestamps + allLastModified = 0; + datLastModified = /* @__PURE__ */ new Map(); + vars = new Int32Array(); + // var shared + varsString = []; + devWatcher = null; + devThread = null; + devRebuilding = false; + devMTime = /* @__PURE__ */ new Map(); + constructor() { + this.gameMap = new GameMap(); + this.zoneMap = new ZoneMap(); + this.invs = /* @__PURE__ */ new Set(); + this.newPlayers = /* @__PURE__ */ new Set(); + this.players = new PlayerList(_World.PLAYERS - 1); + this.npcs = new NpcList(_World.NPCS - 1); + this.zonesTracking = /* @__PURE__ */ new Map(); + this.queue = new LinkList(); + this.lastCycleStats = new Array(12).fill(0); + this.cycleStats = new Array(12).fill(0); + } + // ---- + shouldReload(type, client = false) { + if (typeof self !== "undefined") { + return true; + } + const current = Math.max(getModified(`data/pack/server/${type}.dat`), client ? getModified("data/pack/client/config") : 0); + if (!this.datLastModified.has(type)) { + this.datLastModified.set(type, current); + return true; + } + const changed = this.datLastModified.get(type) !== current; + if (changed) { + this.datLastModified.set(type, current); + } + return changed; + } + reload() { + let transmitted = false; + if (this.shouldReload("varp", true)) { + VarPlayerType.load("data/pack"); + transmitted = true; + } + if (this.shouldReload("param")) { + ParamType.load("data/pack"); + } + if (this.shouldReload("obj", true)) { + ObjType.load("data/pack"); + transmitted = true; + } + if (this.shouldReload("loc", true)) { + LocType.load("data/pack"); + transmitted = true; + } + if (this.shouldReload("npc", true)) { + NpcType.load("data/pack"); + transmitted = true; + } + if (this.shouldReload("idk", true)) { + IdkType.load("data/pack"); + transmitted = true; + } + if (this.shouldReload("frame_del")) { + SeqFrame.load("data/pack"); + } + if (this.shouldReload("seq", true)) { + SeqType.load("data/pack"); + transmitted = true; + } + if (this.shouldReload("spotanim", true)) { + SpotanimType.load("data/pack"); + transmitted = true; + } + if (this.shouldReload("category")) { + CategoryType.load("data/pack"); + } + if (this.shouldReload("enum")) { + EnumType.load("data/pack"); + } + if (this.shouldReload("struct")) { + StructType.load("data/pack"); + } + if (this.shouldReload("inv")) { + InvType.load("data/pack"); + this.invs.clear(); + for (let i = 0; i < InvType.count; i++) { + const inv = InvType.get(i); + if (inv && inv.scope === InvType.SCOPE_SHARED) { + this.invs.add(Inventory.fromType(i)); + } + } + } + if (this.shouldReload("mesanim")) { + MesanimType.load("data/pack"); + } + if (this.shouldReload("dbtable")) { + DbTableType.load("data/pack"); + } + if (this.shouldReload("dbrow")) { + DbRowType.load("data/pack"); + } + if (this.shouldReload("hunt")) { + HuntType.load("data/pack"); + } + if (this.shouldReload("varn")) { + VarNpcType.load("data/pack"); + } + if (this.shouldReload("vars")) { + VarSharedType.load("data/pack"); + if (this.vars.length !== VarSharedType.count) { + const old = this.vars; + this.vars = new Int32Array(VarSharedType.count); + for (let i = 0; i < VarSharedType.count && i < old.length; i++) { + this.vars[i] = old[i]; + } + const oldString = this.varsString; + this.varsString = new Array(VarSharedType.count); + for (let i = 0; i < VarSharedType.count && i < old.length; i++) { + this.varsString[i] = oldString[i]; + } + } + } + if (this.shouldReload("interface")) { + Component.load("data/pack"); + transmitted = true; + } + if (this.shouldReload("script")) { + const count = ScriptProvider.load("data/pack"); + if (count === -1) { + this.broadcastMes("There was an issue while reloading scripts."); + } else { + this.broadcastMes(`Reloaded ${count} scripts.`); + } + } + makeCrcs(); + preloadClient(); + this.allLastModified = getLatestModified("data/pack", ".dat"); + } + async loadAsync() { + console.time("Loading packs"); + const count = (await Promise.all([ + NpcType.loadAsync("data/pack"), + ObjType.loadAsync("data/pack"), + LocType.loadAsync("data/pack"), + FontType.loadAsync("data/pack"), + WordEnc.loadAsync("data/pack"), + VarPlayerType.loadAsync("data/pack"), + ParamType.loadAsync("data/pack"), + IdkType.loadAsync("data/pack"), + SeqFrame.loadAsync("data/pack"), + SeqType.loadAsync("data/pack"), + SpotanimType.loadAsync("data/pack"), + CategoryType.loadAsync("data/pack"), + EnumType.loadAsync("data/pack"), + StructType.loadAsync("data/pack"), + InvType.loadAsync("data/pack"), + MesanimType.loadAsync("data/pack"), + DbTableType.loadAsync("data/pack"), + DbRowType.loadAsync("data/pack"), + HuntType.loadAsync("data/pack"), + VarNpcType.loadAsync("data/pack"), + VarSharedType.loadAsync("data/pack"), + Component.loadAsync("data/pack"), + makeCrcsAsync(), + preloadClientAsync(), + ScriptProvider.loadAsync("data/pack") + ])).at(-1); + this.invs.clear(); + for (let i = 0; i < InvType.count; i++) { + const inv = InvType.get(i); + if (inv && inv.scope === InvType.SCOPE_SHARED) { + this.invs.add(Inventory.fromType(i)); + } + } + if (this.vars.length !== VarSharedType.count) { + const old = this.vars; + this.vars = new Int32Array(VarSharedType.count); + for (let i = 0; i < VarSharedType.count && i < old.length; i++) { + this.vars[i] = old[i]; + } + const oldString = this.varsString; + this.varsString = new Array(VarSharedType.count); + for (let i = 0; i < VarSharedType.count && i < old.length; i++) { + this.varsString[i] = oldString[i]; + } + } + if (count === -1) { + this.broadcastMes("There was an issue while reloading scripts."); + } else { + this.broadcastMes(`Reloaded ${count} scripts.`); + } + console.timeEnd("Loading packs"); + } + broadcastMes(message) { + for (const player of this.players) { + player.messageGame(message); + } + } + async start(skipMaps = false, startCycle = true) { + console.log("Starting world..."); + if (typeof self === "undefined") { + FontType.load("data/pack"); + WordEnc.load("data/pack"); + this.reload(); + if (!skipMaps) { + this.gameMap.init(this.zoneMap); + } + } else { + console.time("World ready"); + await this.loadAsync(); + if (!skipMaps) { + await this.gameMap.initAsync(this.zoneMap); + } + console.timeEnd("World ready"); + } + Login_default.loginThread.postMessage({ + type: "reset" + }); + if (typeof self === "undefined") { + if (!Environment_default.NODE_PRODUCTION) { + this.startDevWatcher(); + if (Environment_default.BUILD_STARTUP && (shouldBuildFileAny("data/pack/client", "data/pack/client/lastbuild.pack") || shouldBuildFileAny("data/pack/server", "data/pack/server/lastbuild.pack"))) { + this.devThread.postMessage({ + type: "pack" + }); + } + } + if (Environment_default.WEB_PORT === 80) { + console.log(kleur.green().bold("World ready") + kleur.white().bold(": http://localhost")); + } else { + console.log(kleur.green().bold("World ready") + kleur.white().bold(": http://localhost:" + Environment_default.WEB_PORT)); + } + } + if (startCycle) { + await this.cycle(); + } + } + startDevWatcher() { + this.devThread = createWorker("./src/lostcity/server/DevThread.ts"); + this.devThread.on("message", (msg) => { + if (msg.type === "done") { + this.devRebuilding = false; + this.reload(); + } + }); + this.devThread.on("exit", () => { + this.devRebuilding = false; + this.stopDevWatcher(); + if (this.shutdownTick === -1) { + this.broadcastMes("Error while rebuilding - see console for more info."); + this.startDevWatcher(); + } + }); + this.devWatcher = new Watcher("./data/src", { + recursive: true + }); + this.devWatcher.on("add", (targetPath) => { + if (targetPath.endsWith(".pack")) { + return; + } + const stat = fs29.statSync(targetPath); + this.devMTime.set(targetPath, stat.mtimeMs); + }); + this.devWatcher.on("change", (targetPath) => { + if (targetPath.endsWith(".pack")) { + return; + } + const stat = fs29.statSync(targetPath); + const known = this.devMTime.get(targetPath); + if (known && known >= stat.mtimeMs) { + return; + } + this.devMTime.set(targetPath, stat.mtimeMs); + if (this.devRebuilding) { + return; + } + console.log("dev:", path3.basename(targetPath), "was edited"); + this.devRebuilding = true; + this.broadcastMes("Rebuilding, please wait..."); + if (!this.devThread) { + this.devThread = createWorker("./src/lostcity/server/DevThread.ts"); + } + this.devThread.postMessage({ + type: "pack" + }); + }); + } + stopDevWatcher() { + if (this.devWatcher) { + this.devWatcher.close(); + } + if (this.devThread) { + this.devThread.terminate(); + this.devThread = null; + } + } + rebootTimer(duration) { + this.shutdownTick = this.currentTick + duration; + this.stopDevWatcher(); + for (const player of this.players) { + player.write(new UpdateRebootTimer(this.shutdownTick - this.currentTick)); + } + } + async cycle(continueCycle = true) { + const start = Date.now(); + this.processWorld(); + await this.processClientsIn(); + this.processNpcs(); + await this.processPlayers(); + await this.processLogouts(); + await this.processLogins(); + this.processZones(); + this.processMovementDirections(); + await this.processClientsOut(); + this.processCleanup(); + const tick = this.currentTick; + if (tick % _World.LOGIN_PINGRATE === 0) { + this.heartbeat(); + } + if (this.shutdownTick > -1 && tick >= this.shutdownTick) { + await this.processShutdown(); + } + if (tick % _World.PLAYER_SAVERATE === 0 && tick > 0) { + this.savePlayers(); + } + this.currentTick++; + this.cycleStats[WorldStat_default.CYCLE] = Date.now() - start; + this.lastCycleStats[WorldStat_default.CYCLE] = this.cycleStats[WorldStat_default.CYCLE]; + this.lastCycleStats[WorldStat_default.WORLD] = this.cycleStats[WorldStat_default.WORLD]; + this.lastCycleStats[WorldStat_default.CLIENT_IN] = this.cycleStats[WorldStat_default.CLIENT_IN]; + this.lastCycleStats[WorldStat_default.NPC] = this.cycleStats[WorldStat_default.NPC]; + this.lastCycleStats[WorldStat_default.PLAYER] = this.cycleStats[WorldStat_default.PLAYER]; + this.lastCycleStats[WorldStat_default.LOGOUT] = this.cycleStats[WorldStat_default.LOGOUT]; + this.lastCycleStats[WorldStat_default.LOGIN] = this.cycleStats[WorldStat_default.LOGIN]; + this.lastCycleStats[WorldStat_default.ZONE] = this.cycleStats[WorldStat_default.ZONE]; + this.lastCycleStats[WorldStat_default.CLIENT_OUT] = this.cycleStats[WorldStat_default.CLIENT_OUT]; + this.lastCycleStats[WorldStat_default.CLEANUP] = this.cycleStats[WorldStat_default.CLEANUP]; + this.lastCycleStats[WorldStat_default.BANDWIDTH_IN] = this.cycleStats[WorldStat_default.BANDWIDTH_IN]; + this.lastCycleStats[WorldStat_default.BANDWIDTH_OUT] = this.cycleStats[WorldStat_default.BANDWIDTH_OUT]; + if (continueCycle) { + setTimeout(this.cycle.bind(this), this.tickRate - this.cycleStats[WorldStat_default.CYCLE]); + } + if (Environment_default.NODE_DEBUG_PROFILE) { + console.log(`tick ${this.currentTick} took ${this.cycleStats[WorldStat_default.CYCLE]}ms: ${this.getTotalPlayers()} players`); + console.log(`${this.cycleStats[WorldStat_default.WORLD]} ms world | ${this.cycleStats[WorldStat_default.CLIENT_IN]} ms client in | ${this.cycleStats[WorldStat_default.NPC]} ms npcs | ${this.cycleStats[WorldStat_default.PLAYER]} ms players | ${this.cycleStats[WorldStat_default.LOGOUT]} ms logout | ${this.cycleStats[WorldStat_default.LOGIN]} ms login | ${this.cycleStats[WorldStat_default.ZONE]} ms zones | ${this.cycleStats[WorldStat_default.CLIENT_OUT]} ms client out | ${this.cycleStats[WorldStat_default.CLEANUP]} ms cleanup`); + console.log("----"); + } + } + // - world queue + // - calculate afk event readiness + // - npc spawn scripts + // - npc hunt + processWorld() { + const start = Date.now(); + const tick = this.currentTick; + for (let request = this.queue.head(); request; request = this.queue.next()) { + const delay = request.delay--; + if (delay > 0) { + continue; + } + const script = request.script; + try { + const state = ScriptRunner.execute(script); + request.unlink(); + if (state === ScriptState.SUSPENDED) { + script.activePlayer.activeScript = script; + } else if (state === ScriptState.NPC_SUSPENDED) { + script.activeNpc.activeScript = script; + } else if (state === ScriptState.WORLD_SUSPENDED) { + this.enqueueScript(script, script.popInt()); + } + } catch (err) { + console.error(err); + } + } + if (tick % _World.AFK_EVENTRATE === 0) { + for (const player of this.players) { + player.afkEventReady = Math.random() < (player.zonesAfk() ? 0.1666 : 0.0833); + } + } + for (const npc of this.npcs) { + if (!npc.updateLifeCycle(tick)) { + continue; + } + if (npc.lifecycle === EntityLifeCycle_default.RESPAWN) { + this.addNpc(npc, -1); + } else if (npc.lifecycle === EntityLifeCycle_default.DESPAWN) { + this.removeNpc(npc, -1); + } + } + for (const npc of this.npcs) { + if (!npc.checkLifeCycle(tick) || npc.delayed()) { + continue; + } + if (npc.huntMode !== -1) { + npc.huntAll(); + } + } + this.cycleStats[WorldStat_default.WORLD] = Date.now() - start; + } + // - decode packets + // - process pathfinding/following + async processClientsIn() { + const start = Date.now(); + this.cycleStats[WorldStat_default.BANDWIDTH_IN] = 0; + for (const player of this.players) { + if (!isNetworkPlayer(player)) { + continue; + } + try { + player.decodeIn(); + } catch (err) { + console.error(err); + await this.removePlayer(player); + } + } + for (const player of this.players) { + if (!isNetworkPlayer(player)) { + continue; + } + if (player.userPath.length > 0 || player.opcalled) { + if (player.delayed()) { + player.unsetMapFlag(); + continue; + } + if ((!player.target || player.target instanceof Loc || player.target instanceof Obj) && player.faceEntity !== -1) { + player.faceEntity = -1; + player.mask |= Player.FACE_ENTITY; + } + if (player.opcalled && (player.userPath.length === 0 || !Environment_default.NODE_CLIENT_ROUTEFINDER)) { + player.pathToTarget(); + continue; + } + player.pathToMoveClick(player.userPath, !Environment_default.NODE_CLIENT_ROUTEFINDER); + } + if (player.target instanceof Player && (player.targetOp === ServerTriggerType_default.APPLAYER3 || player.targetOp === ServerTriggerType_default.OPPLAYER3)) { + if (Position.distanceToSW(player, player.target) <= 25) { + player.pathToPathingTarget(); + } else { + player.clearWaypoints(); + } + } + } + this.cycleStats[WorldStat_default.CLIENT_IN] = Date.now() - start; + } + // - resume suspended script + // - stat regen + // - timer + // - queue + // - movement + // - modes + processNpcs() { + const start = Date.now(); + for (const npc of this.npcs) { + if (!npc.checkLifeCycle(this.currentTick)) { + continue; + } + try { + if (npc.delayed()) { + npc.delay--; + } + if (npc.delayed()) { + continue; + } + if (npc.activeScript && npc.activeScript.execution === ScriptState.NPC_SUSPENDED) { + npc.executeScript(npc.activeScript); + } + if (!npc.checkLifeCycle(this.currentTick)) { + continue; + } + npc.processTimers(); + npc.processQueue(); + npc.processNpcModes(); + npc.validateDistanceWalked(); + } catch (err) { + console.error(err); + this.removeNpc(npc, -1); + } + } + this.cycleStats[WorldStat_default.NPC] = Date.now() - start; + } + // - resume suspended script + // - primary queue + // - weak queue + // - timers + // - soft timers + // - engine queue + // - interactions + // - movement + // - close interface if attempting to logout + async processPlayers() { + const start = Date.now(); + for (const player of this.players) { + try { + player.playtime++; + if (player.delayed()) { + player.delay--; + } + if (player.activeScript && player.activeScript.execution === ScriptState.SUSPENDED && !player.delayed()) { + player.executeScript(player.activeScript, true, true); + } + player.processQueues(); + player.processTimers(0 /* NORMAL */); + player.processTimers(1 /* SOFT */); + player.processEngineQueue(); + player.processInteraction(); + if ((player.mask & Player.EXACT_MOVE) == 0) { + player.validateDistanceWalked(); + } + if (this.shutdownTick < this.currentTick) { + if (Environment_default.NODE_SOCKET_TIMEOUT && this.currentTick - player.lastResponse >= _World.TIMEOUT_IDLE_TICKS) { + player.logoutRequested = true; + } + } + if (player.logoutRequested) { + player.closeModal(); + } + } catch (err) { + console.error(err); + await this.removePlayer(player); + } + } + this.cycleStats[WorldStat_default.PLAYER] = Date.now() - start; + } + async processLogouts() { + const start = Date.now(); + for (const player of this.players) { + if (Environment_default.NODE_SOCKET_TIMEOUT && this.currentTick - player.lastResponse >= _World.TIMEOUT_LOGOUT_TICKS) { + player.queue.clear(); + player.weakQueue.clear(); + player.engineQueue.clear(); + player.clearInteraction(); + player.closeModal(); + player.unsetMapFlag(); + player.logoutRequested = true; + player.setVar(VarPlayerType.LASTCOMBAT, 0); + } + if (!player.logoutRequested) { + continue; + } + if (player.queue.head() === null) { + const script = ScriptProvider.getByTriggerSpecific(ServerTriggerType_default.LOGOUT, -1, -1); + if (!script) { + console.error("LOGOUT TRIGGER IS BROKEN!"); + continue; + } + const state = ScriptRunner.init(script, player); + state.pointerAdd(ScriptPointer_default.ProtectedActivePlayer); + ScriptRunner.execute(state); + const result = state.popInt(); + if (result === 0) { + player.logoutRequested = false; + } + if (player.logoutRequested) { + await this.removePlayer(player); + } + } else { + player.messageGame("[DEBUG]: Waiting for queue to empty before logging out."); + } + } + this.cycleStats[WorldStat_default.LOGOUT] = Date.now() - start; + } + async processLogins() { + const start = Date.now(); + player: for (const player of this.newPlayers) { + for (const other of this.players) { + if (player.username !== other.username) { + continue; + } + if (isNetworkPlayer(player) && player.client) { + player.client.send(LoginResponse.LOGGED_IN); + player.client.close(); + } + continue player; + } + let pid; + try { + pid = this.getNextPid(isNetworkPlayer(player) ? player.client : null); + } catch (e) { + if (isNetworkPlayer(player)) { + player.client?.send(LoginResponse.WORLD_FULL); + player.client?.close(); + } + continue; + } + this.players.set(pid, player); + player.pid = pid; + player.uid = (Number(player.username37 & 0x1fffffn) << 11 | player.pid) >>> 0; + player.tele = true; + this.getZone(player.x, player.z, player.level).enter(player); + player.onLogin(); + if (this.shutdownTick > -1) { + player.write(new UpdateRebootTimer(this.shutdownTick - this.currentTick)); + } + if (isNetworkPlayer(player) && player.client) { + player.client.state = 1; + if (player.staffModLevel >= 2) { + player.client.send(LoginResponse.STAFF_MOD_LEVEL); + } else { + player.client.send(LoginResponse.SUCCESSFUL); + } + } + } + this.newPlayers.clear(); + this.cycleStats[WorldStat_default.LOGIN] = Date.now() - start; + } + // - build list of active zones around players + // - loc/obj despawn/respawn + // - compute shared buffer + processZones() { + const start = Date.now(); + const tick = this.currentTick; + const zones = this.zonesTracking.get(tick); + if (typeof zones !== "undefined") { + for (const zone of zones) { + zone.tick(tick); + } + } + this.computeSharedEvents(); + this.cycleStats[WorldStat_default.ZONE] = Date.now() - start; + } + // - convert player movements + // - convert npc movements + processMovementDirections() { + for (const player of this.players) { + player.convertMovementDir(); + } + for (const npc of this.npcs) { + npc.convertMovementDir(); + } + } + // - map update + // - player info + // - npc info + // - zone updates + // - inv changes + // - stat changes + // - afk zones changes + // - flush packets + async processClientsOut() { + const start = Date.now(); + this.cycleStats[WorldStat_default.BANDWIDTH_OUT] = 0; + for (const player of this.players) { + if (!isNetworkPlayer(player)) { + player.highPriorityOut.clear(); + player.lowPriorityOut.clear(); + continue; + } + try { + player.updateMap(); + player.updatePlayers(); + player.updateNpcs(); + player.updateZones(); + player.updateInvs(); + player.updateStats(); + player.updateAfkZones(); + player.encodeOut(); + } catch (err) { + console.error(err); + await this.removePlayer(player); + } + } + this.cycleStats[WorldStat_default.CLIENT_OUT] = Date.now() - start; + } + // - reset zones + // - reset players + // - reset npcs + // - reset invs + processCleanup() { + const start = Date.now(); + const tick = this.currentTick; + const zones = this.zonesTracking.get(tick); + if (typeof zones !== "undefined") { + for (const zone of zones) { + zone.reset(); + } + } + this.zonesTracking.delete(tick); + for (const player of this.players) { + player.resetEntity(false); + for (const inv of player.invs.values()) { + if (!inv) { + continue; + } + inv.update = false; + } + } + for (const npc of this.npcs) { + if (!npc.checkLifeCycle(tick)) { + continue; + } + npc.resetEntity(false); + } + for (const inv of this.invs) { + inv.update = false; + const invType = InvType.get(inv.type); + if (!invType.restock || !invType.stockcount || !invType.stockrate) { + continue; + } + for (let index = 0; index < inv.items.length; index++) { + const item = inv.items[index]; + if (!item) { + continue; + } + if (item.count < invType.stockcount[index] && tick % invType.stockrate[index] === 0) { + inv.add(item?.id, 1, index, true, false, false); + inv.update = true; + continue; + } + if (item.count > invType.stockcount[index] && tick % invType.stockrate[index] === 0) { + inv.remove(item?.id, 1, index, true); + inv.update = true; + continue; + } + if (invType.allstock && !invType.stockcount[index] && tick % _World.INV_STOCKRATE === 0) { + inv.remove(item?.id, 1, index, true); + inv.update = true; + } + } + } + this.cycleStats[WorldStat_default.CLEANUP] = Date.now() - start; + } + heartbeat() { + const players = []; + for (const player of this.players) { + players.push(player.username37); + } + Login_default.loginThread.postMessage({ + type: "heartbeat", + players + }); + } + async processShutdown() { + const duration = this.currentTick - this.shutdownTick; + const online = this.getTotalPlayers(); + if (online) { + for (const player of this.players) { + player.logoutRequested = true; + if (isNetworkPlayer(player)) { + player.logout(); + if (player.client && duration > 2) { + player.client.close(); + } + } + } + this.npcs.reset(); + if (duration > 2) { + console.log("Super fast shutdown initiated..."); + if (this.tickRate > _World.SHUTDOWN_TICKRATE) { + this.tickRate = _World.SHUTDOWN_TICKRATE; + } + if (duration > _World.SHUTDOWN_TICKS) { + for (const player of this.players) { + await this.removePlayer(player); + } + this.tickRate = _World.NORMAL_TICKRATE; + } + if (!Environment_default.NODE_PRODUCTION) { + process.exit(0); + } + } + } else { + process.exit(0); + } + } + savePlayers() { + if (typeof self !== "undefined") { + return; + } + for (const player of this.players) { + player.save().release(); + } + } + enqueueScript(script, delay = 0) { + this.queue.addTail(new EntityQueueState(script, delay + 1)); + } + getInventory(inv) { + if (inv === -1) { + return null; + } + for (const inventory2 of this.invs) { + if (inventory2.type === inv) { + return inventory2; + } + } + const inventory = Inventory.fromType(inv); + this.invs.add(inventory); + return inventory; + } + getZone(x, z, level) { + return this.zoneMap.zone(x, z, level); + } + getZoneIndex(zoneIndex) { + return this.zoneMap.zoneByIndex(zoneIndex); + } + getZoneGrid(level) { + return this.zoneMap.grid(level); + } + computeSharedEvents() { + const zones = /* @__PURE__ */ new Set(); + for (const player of this.players) { + if (!isNetworkPlayer(player)) { + continue; + } + for (const zone of player.buildArea.loadedZones) { + zones.add(zone); + } + } + for (const zoneIndex of zones) { + this.getZoneIndex(zoneIndex).computeShared(); + } + } + addNpc(npc, duration) { + this.npcs.set(npc.nid, npc); + npc.x = npc.startX; + npc.z = npc.startZ; + const zone = this.getZone(npc.x, npc.z, npc.level); + zone.enter(npc); + switch (npc.blockWalk) { + case BlockWalk_default.NPC: + this.gameMap.changeNpcCollision(npc.width, npc.x, npc.z, npc.level, true); + break; + case BlockWalk_default.ALL: + this.gameMap.changeNpcCollision(npc.width, npc.x, npc.z, npc.level, true); + this.gameMap.changePlayerCollision(npc.width, npc.x, npc.z, npc.level, true); + break; + } + npc.resetEntity(true); + npc.playAnimation(-1, 0); + npc.setLifeCycle(this.currentTick + duration); + } + removeNpc(npc, duration) { + const zone = this.getZone(npc.x, npc.z, npc.level); + zone.leave(npc); + switch (npc.blockWalk) { + case BlockWalk_default.NPC: + this.gameMap.changeNpcCollision(npc.width, npc.x, npc.z, npc.level, false); + break; + case BlockWalk_default.ALL: + this.gameMap.changeNpcCollision(npc.width, npc.x, npc.z, npc.level, false); + this.gameMap.changePlayerCollision(npc.width, npc.x, npc.z, npc.level, false); + break; + } + if (npc.lifecycle === EntityLifeCycle_default.DESPAWN) { + this.npcs.remove(npc.nid); + } else if (npc.lifecycle === EntityLifeCycle_default.RESPAWN) { + npc.setLifeCycle(this.currentTick + duration); + } + } + getLoc(x, z, level, locId) { + return this.getZone(x, z, level).getLoc(x, z, locId); + } + getObj(x, z, level, objId, receiverId) { + return this.getZone(x, z, level).getObj(x, z, objId, receiverId); + } + trackZone(tick, zone) { + let zones; + const active = this.zonesTracking.get(tick); + if (!active) { + zones = /* @__PURE__ */ new Set(); + } else { + zones = active; + } + zones.add(zone); + this.zonesTracking.set(tick, zones); + } + addLoc(loc, duration) { + const type = LocType.get(loc.type); + if (type.blockwalk) { + this.gameMap.changeLocCollision(loc.shape, loc.angle, type.blockrange, type.length, type.width, type.active, loc.x, loc.z, loc.level, true); + } + const zone = this.getZone(loc.x, loc.z, loc.level); + zone.addLoc(loc); + loc.setLifeCycle(this.currentTick + duration); + this.trackZone(this.currentTick + duration, zone); + this.trackZone(this.currentTick, zone); + } + mergeLoc(loc, player, startCycle, endCycle, south, east, north, west) { + const zone = this.getZone(loc.x, loc.z, loc.level); + zone.mergeLoc(loc, player, startCycle, endCycle, south, east, north, west); + this.trackZone(this.currentTick, zone); + } + animLoc(loc, seq) { + const zone = this.getZone(loc.x, loc.z, loc.level); + zone.animLoc(loc, seq); + this.trackZone(this.currentTick, zone); + } + removeLoc(loc, duration) { + const type = LocType.get(loc.type); + if (type.blockwalk) { + this.gameMap.changeLocCollision(loc.shape, loc.angle, type.blockrange, type.length, type.width, type.active, loc.x, loc.z, loc.level, false); + } + const zone = this.getZone(loc.x, loc.z, loc.level); + zone.removeLoc(loc); + loc.setLifeCycle(this.currentTick + duration); + this.trackZone(this.currentTick + duration, zone); + this.trackZone(this.currentTick, zone); + } + addObj(obj, receiverId, duration) { + const objType = ObjType.get(obj.type); + const existing = this.getObj(obj.x, obj.z, obj.level, obj.type, receiverId); + if (existing && existing.lifecycle === EntityLifeCycle_default.DESPAWN && obj.lifecycle === EntityLifeCycle_default.DESPAWN) { + const nextCount = obj.count + existing.count; + if (objType.stackable && nextCount <= Inventory.STACK_LIMIT) { + this.changeObj(existing, receiverId, nextCount); + return; + } + } + const zone = this.getZone(obj.x, obj.z, obj.level); + zone.addObj(obj, receiverId); + if (receiverId !== -1 && objType.tradeable) { + obj.setLifeCycle(this.currentTick + 100); + this.trackZone(this.currentTick + 100, zone); + this.trackZone(this.currentTick, zone); + obj.receiverId = receiverId; + obj.reveal = duration; + } else { + obj.setLifeCycle(this.currentTick + duration); + this.trackZone(this.currentTick + duration, zone); + this.trackZone(this.currentTick, zone); + } + } + revealObj(obj) { + const duration = obj.reveal; + const zone = this.getZone(obj.x, obj.z, obj.level); + zone.revealObj(obj, obj.receiverId); + obj.setLifeCycle(this.currentTick + duration); + this.trackZone(this.currentTick + duration, zone); + this.trackZone(this.currentTick, zone); + } + changeObj(obj, receiverId, newCount) { + const zone = this.getZone(obj.x, obj.z, obj.level); + zone.changeObj(obj, receiverId, obj.count, newCount); + this.trackZone(this.currentTick, zone); + } + removeObj(obj, duration) { + const zone = this.getZone(obj.x, obj.z, obj.level); + zone.removeObj(obj); + obj.setLifeCycle(this.currentTick + duration); + this.trackZone(this.currentTick + duration, zone); + this.trackZone(this.currentTick, zone); + } + animMap(level, x, z, spotanim, height, delay) { + const zone = this.getZone(x, z, level); + zone.animMap(x, z, spotanim, height, delay); + this.trackZone(this.currentTick, zone); + } + mapProjAnim(level, x, z, dstX, dstZ, target, spotanim, srcHeight, dstHeight, startDelay, endDelay, peak, arc) { + const zone = this.getZone(x, z, level); + zone.mapProjAnim(x, z, dstX, dstZ, target, spotanim, srcHeight, dstHeight, startDelay, endDelay, peak, arc); + this.trackZone(this.currentTick, zone); + } + // ---- + async readIn(socket, stream) { + while (stream.available > 0) { + const start = stream.pos; + let opcode = stream.g1(); + if (socket.decryptor) { + opcode = opcode - socket.decryptor.nextInt() & 255; + stream.data[start] = opcode; + } + if (typeof ClientProt.byId[opcode] === "undefined") { + socket.state = -1; + socket.close(); + return; + } + let length = ClientProt.byId[opcode].length; + if (length === -1) { + length = stream.g1(); + } else if (length === -2) { + length = stream.g2(); + } + if (stream.available < length) { + break; + } + stream.pos += length; + socket.inCount[opcode]++; + if (socket.inCount[opcode] > 5) { + continue; + } + const data = new Uint8Array(stream.pos - start); + const pos = stream.pos; + stream.pos = start; + stream.gdata(data, 0, data.length); + stream.pos = pos; + socket.in.set(data, socket.inOffset); + socket.inOffset += stream.pos - start; + } + } + addPlayer(player) { + this.newPlayers.add(player); + } + async removePlayer(player) { + if (player.pid === -1) { + return; + } + player.playerLog("Logging out"); + if (isNetworkPlayer(player)) { + player.logout(); + player.client.close(); + player.client = null; + } + Login_default.logout(player); + } + getPlayer(pid) { + return this.players.get(pid); + } + getPlayerByUid(uid) { + const pid = uid & 2047; + const name37 = uid >> 11 & 2097151; + const player = this.getPlayer(pid); + if (!player) { + return null; + } + if (Number(player.username37 & 0x1fffffn) !== name37) { + return null; + } + return player; + } + getPlayerByUsername(username) { + const username37 = toBase37(username); + for (const player of this.players) { + if (player.username37 === username37) { + return player; + } + } + for (const player of this.newPlayers) { + if (player.username37 === username37) { + return player; + } + } + return void 0; + } + getTotalPlayers() { + return this.players.count; + } + getTotalNpcs() { + return this.npcs.count; + } + getTotalZones() { + return this.zoneMap.zoneCount(); + } + getTotalLocs() { + return this.zoneMap.locCount(); + } + getTotalObjs() { + return this.zoneMap.objCount(); + } + getNpc(nid) { + return this.npcs.get(nid); + } + getNpcByUid(uid) { + const slot = uid & 65535; + const type = uid >> 16 & 65535; + const npc = this.getNpc(slot); + if (!npc || npc.type !== type) { + return null; + } + return npc; + } + getNextNid() { + return this.npcs.next(); + } + getNextPid(client = null) { + if (client) { + const ip = client.remoteAddress; + const octets = ip.split("."); + const start = parseInt(octets[3]) % 20 * 100; + return this.players.next(true, start); + } + return this.players.next(); + } +}; +var World_default = new World(); + +// src/lostcity/server/WorkerServer.ts +var WorkerServer = class { + sockets = /* @__PURE__ */ new Map(); + constructor() { + } + start() { + self.onmessage = async (e) => { + const packet = new Packet(new Uint8Array(e.data.data)); + const socket = this.sockets.get(e.data.id); + switch (e.data.type) { + case "connection": { + this.sockets.set(e.data.id, new ClientSocket(self, "127.0.0.1", -1, -1, e.data.id)); + const seed = new Packet(new Uint8Array(4 + 4)); + seed.p4(Math.floor(Math.random() * 4294967295)); + seed.p4(Math.floor(Math.random() * 4294967295)); + this.sockets.get(e.data.id)?.send(seed.data); + break; + } + case "data": { + if (socket) { + try { + if (socket.state === 1) { + await World_default.readIn(socket, packet); + } else { + await Login_default.readIn(socket, packet); + } + } catch (err) { + console.log("error", err); + socket.close(); + this.sockets.delete(e.data.id); + } + } + break; + } + case "close": { + if (socket) { + if (socket.player) { + socket.player.client = null; + } + socket.close(); + this.sockets.delete(e.data.id); + } + break; + } + } + }; + self.onerror = async (e) => { + console.log(e); + }; + self.onmessageerror = async (e) => { + console.log(e); + this.sockets.get(e.data.id)?.close(); + this.sockets.delete(e.data.id); + }; + } +}; + +// src/lostcity/worker.ts +await World_default.start(); +var workerServer = new WorkerServer(); +workerServer.start(); diff --git a/webpack.config.js b/webpack.config.js index 120ffb11..2042b026 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -25,14 +25,14 @@ const htmlPlugins = pages.map(name => { const config = { entry: { index: './src/js/game.ts', - playground: './src/js/playground.js', - viewer: './src/js/viewer.ts', - mesanim: './src/js/mesanim.ts', - items: './src/js/items.ts', - sounds: './src/js/sounds.ts', - ['interface-editor']: './src/js/interface-editor.ts', - JagEd: './src/js/JagEd.ts', - mapview: './src/js/mapview.ts' + // playground: './src/js/playground.js', + // viewer: './src/js/viewer.ts', + // mesanim: './src/js/mesanim.ts', + // items: './src/js/items.ts', + // sounds: './src/js/sounds.ts', + // ['interface-editor']: './src/js/interface-editor.ts', + // JagEd: './src/js/JagEd.ts', + // mapview: './src/js/mapview.ts' }, plugins: [