nostr-crypto-utils 0.5.1 → 0.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/dist/browser/crypto.nostr-crypto-utils.min.js +15 -1
  2. package/dist/browser/crypto.nostr-crypto-utils.min.js.map +7 -0
  3. package/dist/browser/main.nostr-crypto-utils.min.js +32 -0
  4. package/dist/browser/main.nostr-crypto-utils.min.js.map +7 -0
  5. package/dist/browser/nip-44.nostr-crypto-utils.min.js +21 -2
  6. package/dist/browser/nip-44.nostr-crypto-utils.min.js.map +7 -0
  7. package/dist/browser/nip-46.nostr-crypto-utils.min.js +21 -2
  8. package/dist/browser/nip-46.nostr-crypto-utils.min.js.map +7 -0
  9. package/dist/browser/nip-49.nostr-crypto-utils.min.js +13 -1
  10. package/dist/browser/nip-49.nostr-crypto-utils.min.js.map +7 -0
  11. package/dist/browser/protocol.nostr-crypto-utils.min.js +2 -1
  12. package/dist/browser/protocol.nostr-crypto-utils.min.js.map +7 -0
  13. package/dist/browser/validation.nostr-crypto-utils.min.js +15 -1
  14. package/dist/browser/validation.nostr-crypto-utils.min.js.map +7 -0
  15. package/package.json +4 -7
  16. package/dist/browser/116.nostr-crypto-utils.min.js +0 -2
  17. package/dist/browser/116.nostr-crypto-utils.min.js.LICENSE.txt +0 -1
  18. package/dist/browser/126.nostr-crypto-utils.min.js +0 -2
  19. package/dist/browser/126.nostr-crypto-utils.min.js.LICENSE.txt +0 -3
  20. package/dist/browser/287.nostr-crypto-utils.min.js +0 -2
  21. package/dist/browser/287.nostr-crypto-utils.min.js.LICENSE.txt +0 -6
  22. package/dist/browser/343.nostr-crypto-utils.min.js +0 -1
  23. package/dist/browser/348.nostr-crypto-utils.min.js +0 -2
  24. package/dist/browser/348.nostr-crypto-utils.min.js.LICENSE.txt +0 -1
  25. package/dist/browser/524.nostr-crypto-utils.min.js +0 -1
  26. package/dist/browser/575.nostr-crypto-utils.min.js +0 -2
  27. package/dist/browser/575.nostr-crypto-utils.min.js.LICENSE.txt +0 -1
  28. package/dist/browser/615.nostr-crypto-utils.min.js +0 -2
  29. package/dist/browser/615.nostr-crypto-utils.min.js.LICENSE.txt +0 -1
  30. package/dist/browser/668.nostr-crypto-utils.min.js +0 -2
  31. package/dist/browser/668.nostr-crypto-utils.min.js.LICENSE.txt +0 -6
  32. package/dist/browser/705.nostr-crypto-utils.min.js +0 -2
  33. package/dist/browser/705.nostr-crypto-utils.min.js.LICENSE.txt +0 -1
  34. package/dist/browser/732.nostr-crypto-utils.min.js +0 -1
  35. package/dist/browser/843.nostr-crypto-utils.min.js +0 -2
  36. package/dist/browser/843.nostr-crypto-utils.min.js.LICENSE.txt +0 -3
  37. package/dist/browser/main-31743c5a.nostr-crypto-utils.min.js +0 -1
  38. package/dist/browser/main-96d4916e.nostr-crypto-utils.min.js +0 -1
  39. package/dist/browser/main-9fdc67c2.nostr-crypto-utils.min.js +0 -1
  40. package/dist/browser/nip-44.nostr-crypto-utils.min.js.LICENSE.txt +0 -1
  41. package/dist/browser/nip-46.nostr-crypto-utils.min.js.LICENSE.txt +0 -1
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../node_modules/quick-format-unescaped/index.js", "../../node_modules/pino/browser.js", "empty-node-builtin:crypto", "../../node_modules/bech32/dist/index.js", "../../node_modules/base64-js/index.js", "../../node_modules/ieee754/index.js", "../../node_modules/buffer/index.js", "../../src/index.ts", "../../src/types/base.ts", "../../src/types/nip46.ts", "../../src/types/index.ts", "../../node_modules/@noble/hashes/src/crypto.ts", "../../node_modules/@noble/hashes/src/utils.ts", "../../node_modules/@noble/hashes/src/_md.ts", "../../node_modules/@noble/hashes/src/sha2.ts", "../../node_modules/@noble/hashes/src/hmac.ts", "../../node_modules/@noble/curves/src/utils.ts", "../../node_modules/@noble/curves/src/abstract/modular.ts", "../../node_modules/@noble/curves/src/abstract/curve.ts", "../../node_modules/@noble/curves/src/abstract/weierstrass.ts", "../../node_modules/@noble/curves/src/_shortw_utils.ts", "../../node_modules/@noble/curves/src/secp256k1.ts", "../../node_modules/@noble/curves/src/abstract/utils.ts", "../../node_modules/@noble/hashes/src/sha256.ts", "../../src/utils/logger.ts", "../../src/encoding/base64.ts", "../../src/crypto.ts", "../../src/validation/index.ts", "../../src/event/creation.ts", "../../src/event/signing.ts", "../../src/nips/nip-04.ts", "../../src/nips/nip-01.ts", "../../src/nips/nip-19.ts", "../../src/nips/nip-26.ts", "../../src/nips/nip-44.ts", "../../node_modules/@noble/ciphers/src/utils.ts", "../../node_modules/@noble/ciphers/src/_arx.ts", "../../node_modules/@noble/ciphers/src/_poly1305.ts", "../../node_modules/@noble/ciphers/src/chacha.ts", "../../node_modules/@noble/hashes/src/hkdf.ts", "../../node_modules/@scure/base/index.ts", "../../src/nips/nip-46.ts", "../../src/nips/nip-49.ts", "../../node_modules/@noble/hashes/src/pbkdf2.ts", "../../node_modules/@noble/hashes/src/scrypt.ts", "../../src/utils/encoding.ts"],
4
+ "sourcesContent": ["'use strict'\nfunction tryStringify (o) {\n try { return JSON.stringify(o) } catch(e) { return '\"[Circular]\"' }\n}\n\nmodule.exports = format\n\nfunction format(f, args, opts) {\n var ss = (opts && opts.stringify) || tryStringify\n var offset = 1\n if (typeof f === 'object' && f !== null) {\n var len = args.length + offset\n if (len === 1) return f\n var objects = new Array(len)\n objects[0] = ss(f)\n for (var index = 1; index < len; index++) {\n objects[index] = ss(args[index])\n }\n return objects.join(' ')\n }\n if (typeof f !== 'string') {\n return f\n }\n var argLen = args.length\n if (argLen === 0) return f\n var str = ''\n var a = 1 - offset\n var lastPos = -1\n var flen = (f && f.length) || 0\n for (var i = 0; i < flen;) {\n if (f.charCodeAt(i) === 37 && i + 1 < flen) {\n lastPos = lastPos > -1 ? lastPos : 0\n switch (f.charCodeAt(i + 1)) {\n case 100: // 'd'\n case 102: // 'f'\n if (a >= argLen)\n break\n if (args[a] == null) break\n if (lastPos < i)\n str += f.slice(lastPos, i)\n str += Number(args[a])\n lastPos = i + 2\n i++\n break\n case 105: // 'i'\n if (a >= argLen)\n break\n if (args[a] == null) break\n if (lastPos < i)\n str += f.slice(lastPos, i)\n str += Math.floor(Number(args[a]))\n lastPos = i + 2\n i++\n break\n case 79: // 'O'\n case 111: // 'o'\n case 106: // 'j'\n if (a >= argLen)\n break\n if (args[a] === undefined) break\n if (lastPos < i)\n str += f.slice(lastPos, i)\n var type = typeof args[a]\n if (type === 'string') {\n str += '\\'' + args[a] + '\\''\n lastPos = i + 2\n i++\n break\n }\n if (type === 'function') {\n str += args[a].name || '<anonymous>'\n lastPos = i + 2\n i++\n break\n }\n str += ss(args[a])\n lastPos = i + 2\n i++\n break\n case 115: // 's'\n if (a >= argLen)\n break\n if (lastPos < i)\n str += f.slice(lastPos, i)\n str += String(args[a])\n lastPos = i + 2\n i++\n break\n case 37: // '%'\n if (lastPos < i)\n str += f.slice(lastPos, i)\n str += '%'\n lastPos = i + 2\n i++\n a--\n break\n }\n ++a\n }\n ++i\n }\n if (lastPos === -1)\n return f\n else if (lastPos < flen) {\n str += f.slice(lastPos)\n }\n\n return str\n}\n", "'use strict'\n\nconst format = require('quick-format-unescaped')\n\nmodule.exports = pino\n\nconst _console = pfGlobalThisOrFallback().console || {}\nconst stdSerializers = {\n mapHttpRequest: mock,\n mapHttpResponse: mock,\n wrapRequestSerializer: passthrough,\n wrapResponseSerializer: passthrough,\n wrapErrorSerializer: passthrough,\n req: mock,\n res: mock,\n err: asErrValue,\n errWithCause: asErrValue\n}\nfunction levelToValue (level, logger) {\n return level === 'silent'\n ? Infinity\n : logger.levels.values[level]\n}\nconst baseLogFunctionSymbol = Symbol('pino.logFuncs')\nconst hierarchySymbol = Symbol('pino.hierarchy')\n\nconst logFallbackMap = {\n error: 'log',\n fatal: 'error',\n warn: 'error',\n info: 'log',\n debug: 'log',\n trace: 'log'\n}\n\nfunction appendChildLogger (parentLogger, childLogger) {\n const newEntry = {\n logger: childLogger,\n parent: parentLogger[hierarchySymbol]\n }\n childLogger[hierarchySymbol] = newEntry\n}\n\nfunction setupBaseLogFunctions (logger, levels, proto) {\n const logFunctions = {}\n levels.forEach(level => {\n logFunctions[level] = proto[level] ? proto[level] : (_console[level] || _console[logFallbackMap[level] || 'log'] || noop)\n })\n logger[baseLogFunctionSymbol] = logFunctions\n}\n\nfunction shouldSerialize (serialize, serializers) {\n if (Array.isArray(serialize)) {\n const hasToFilter = serialize.filter(function (k) {\n return k !== '!stdSerializers.err'\n })\n return hasToFilter\n } else if (serialize === true) {\n return Object.keys(serializers)\n }\n\n return false\n}\n\nfunction pino (opts) {\n opts = opts || {}\n opts.browser = opts.browser || {}\n\n const transmit = opts.browser.transmit\n if (transmit && typeof transmit.send !== 'function') { throw Error('pino: transmit option must have a send function') }\n\n const proto = opts.browser.write || _console\n if (opts.browser.write) opts.browser.asObject = true\n const serializers = opts.serializers || {}\n const serialize = shouldSerialize(opts.browser.serialize, serializers)\n let stdErrSerialize = opts.browser.serialize\n\n if (\n Array.isArray(opts.browser.serialize) &&\n opts.browser.serialize.indexOf('!stdSerializers.err') > -1\n ) stdErrSerialize = false\n\n const customLevels = Object.keys(opts.customLevels || {})\n const levels = ['error', 'fatal', 'warn', 'info', 'debug', 'trace'].concat(customLevels)\n\n if (typeof proto === 'function') {\n levels.forEach(function (level) {\n proto[level] = proto\n })\n }\n if (opts.enabled === false || opts.browser.disabled) opts.level = 'silent'\n const level = opts.level || 'info'\n const logger = Object.create(proto)\n if (!logger.log) logger.log = noop\n\n setupBaseLogFunctions(logger, levels, proto)\n // setup root hierarchy entry\n appendChildLogger({}, logger)\n\n Object.defineProperty(logger, 'levelVal', {\n get: getLevelVal\n })\n Object.defineProperty(logger, 'level', {\n get: getLevel,\n set: setLevel\n })\n\n const setOpts = {\n transmit,\n serialize,\n asObject: opts.browser.asObject,\n formatters: opts.browser.formatters,\n levels,\n timestamp: getTimeFunction(opts)\n }\n logger.levels = getLevels(opts)\n logger.level = level\n\n logger.setMaxListeners = logger.getMaxListeners =\n logger.emit = logger.addListener = logger.on =\n logger.prependListener = logger.once =\n logger.prependOnceListener = logger.removeListener =\n logger.removeAllListeners = logger.listeners =\n logger.listenerCount = logger.eventNames =\n logger.write = logger.flush = noop\n logger.serializers = serializers\n logger._serialize = serialize\n logger._stdErrSerialize = stdErrSerialize\n logger.child = child\n\n if (transmit) logger._logEvent = createLogEventShape()\n\n function getLevelVal () {\n return levelToValue(this.level, this)\n }\n\n function getLevel () {\n return this._level\n }\n function setLevel (level) {\n if (level !== 'silent' && !this.levels.values[level]) {\n throw Error('unknown level ' + level)\n }\n this._level = level\n\n set(this, setOpts, logger, 'error') // <-- must stay first\n set(this, setOpts, logger, 'fatal')\n set(this, setOpts, logger, 'warn')\n set(this, setOpts, logger, 'info')\n set(this, setOpts, logger, 'debug')\n set(this, setOpts, logger, 'trace')\n\n customLevels.forEach((level) => {\n set(this, setOpts, logger, level)\n })\n }\n\n function child (bindings, childOptions) {\n if (!bindings) {\n throw new Error('missing bindings for child Pino')\n }\n childOptions = childOptions || {}\n if (serialize && bindings.serializers) {\n childOptions.serializers = bindings.serializers\n }\n const childOptionsSerializers = childOptions.serializers\n if (serialize && childOptionsSerializers) {\n var childSerializers = Object.assign({}, serializers, childOptionsSerializers)\n var childSerialize = opts.browser.serialize === true\n ? Object.keys(childSerializers)\n : serialize\n delete bindings.serializers\n applySerializers([bindings], childSerialize, childSerializers, this._stdErrSerialize)\n }\n function Child (parent) {\n this._childLevel = (parent._childLevel | 0) + 1\n\n // make sure bindings are available in the `set` function\n this.bindings = bindings\n\n if (childSerializers) {\n this.serializers = childSerializers\n this._serialize = childSerialize\n }\n if (transmit) {\n this._logEvent = createLogEventShape(\n [].concat(parent._logEvent.bindings, bindings)\n )\n }\n }\n Child.prototype = this\n const newLogger = new Child(this)\n\n // must happen before the level is assigned\n appendChildLogger(this, newLogger)\n // required to actually initialize the logger functions for any given child\n newLogger.level = this.level\n\n return newLogger\n }\n return logger\n}\n\nfunction getLevels (opts) {\n const customLevels = opts.customLevels || {}\n\n const values = Object.assign({}, pino.levels.values, customLevels)\n const labels = Object.assign({}, pino.levels.labels, invertObject(customLevels))\n\n return {\n values,\n labels\n }\n}\n\nfunction invertObject (obj) {\n const inverted = {}\n Object.keys(obj).forEach(function (key) {\n inverted[obj[key]] = key\n })\n return inverted\n}\n\npino.levels = {\n values: {\n fatal: 60,\n error: 50,\n warn: 40,\n info: 30,\n debug: 20,\n trace: 10\n },\n labels: {\n 10: 'trace',\n 20: 'debug',\n 30: 'info',\n 40: 'warn',\n 50: 'error',\n 60: 'fatal'\n }\n}\n\npino.stdSerializers = stdSerializers\npino.stdTimeFunctions = Object.assign({}, { nullTime, epochTime, unixTime, isoTime })\n\nfunction getBindingChain (logger) {\n const bindings = []\n if (logger.bindings) {\n bindings.push(logger.bindings)\n }\n\n // traverse up the tree to get all bindings\n let hierarchy = logger[hierarchySymbol]\n while (hierarchy.parent) {\n hierarchy = hierarchy.parent\n if (hierarchy.logger.bindings) {\n bindings.push(hierarchy.logger.bindings)\n }\n }\n\n return bindings.reverse()\n}\n\nfunction set (self, opts, rootLogger, level) {\n // override the current log functions with either `noop` or the base log function\n Object.defineProperty(self, level, {\n value: (levelToValue(self.level, rootLogger) > levelToValue(level, rootLogger)\n ? noop\n : rootLogger[baseLogFunctionSymbol][level]),\n writable: true,\n enumerable: true,\n configurable: true\n })\n\n if (!opts.transmit && self[level] === noop) {\n return\n }\n\n // make sure the log format is correct\n self[level] = createWrap(self, opts, rootLogger, level)\n\n // prepend bindings if it is not the root logger\n const bindings = getBindingChain(self)\n if (bindings.length === 0) {\n // early exit in case for rootLogger\n return\n }\n self[level] = prependBindingsInArguments(bindings, self[level])\n}\n\nfunction prependBindingsInArguments (bindings, logFunc) {\n return function () {\n return logFunc.apply(this, [...bindings, ...arguments])\n }\n}\n\nfunction createWrap (self, opts, rootLogger, level) {\n return (function (write) {\n return function LOG () {\n const ts = opts.timestamp()\n const args = new Array(arguments.length)\n const proto = (Object.getPrototypeOf && Object.getPrototypeOf(this) === _console) ? _console : this\n for (var i = 0; i < args.length; i++) args[i] = arguments[i]\n\n if (opts.serialize && !opts.asObject) {\n applySerializers(args, this._serialize, this.serializers, this._stdErrSerialize)\n }\n if (opts.asObject || opts.formatters) {\n write.call(proto, asObject(this, level, args, ts, opts.formatters))\n } else write.apply(proto, args)\n\n if (opts.transmit) {\n const transmitLevel = opts.transmit.level || self._level\n const transmitValue = rootLogger.levels.values[transmitLevel]\n const methodValue = rootLogger.levels.values[level]\n if (methodValue < transmitValue) return\n transmit(this, {\n ts,\n methodLevel: level,\n methodValue,\n transmitLevel,\n transmitValue: rootLogger.levels.values[opts.transmit.level || self._level],\n send: opts.transmit.send,\n val: levelToValue(self._level, rootLogger)\n }, args)\n }\n }\n })(self[baseLogFunctionSymbol][level])\n}\n\nfunction asObject (logger, level, args, ts, formatters = {}) {\n const {\n level: levelFormatter = () => logger.levels.values[level],\n log: logObjectFormatter = (obj) => obj\n } = formatters\n if (logger._serialize) applySerializers(args, logger._serialize, logger.serializers, logger._stdErrSerialize)\n const argsCloned = args.slice()\n let msg = argsCloned[0]\n const logObject = {}\n if (ts) {\n logObject.time = ts\n }\n logObject.level = levelFormatter(level, logger.levels.values[level])\n\n let lvl = (logger._childLevel | 0) + 1\n if (lvl < 1) lvl = 1\n // deliberate, catching objects, arrays\n if (msg !== null && typeof msg === 'object') {\n while (lvl-- && typeof argsCloned[0] === 'object') {\n Object.assign(logObject, argsCloned.shift())\n }\n msg = argsCloned.length ? format(argsCloned.shift(), argsCloned) : undefined\n } else if (typeof msg === 'string') msg = format(argsCloned.shift(), argsCloned)\n if (msg !== undefined) logObject.msg = msg\n\n const formattedLogObject = logObjectFormatter(logObject)\n return formattedLogObject\n}\n\nfunction applySerializers (args, serialize, serializers, stdErrSerialize) {\n for (const i in args) {\n if (stdErrSerialize && args[i] instanceof Error) {\n args[i] = pino.stdSerializers.err(args[i])\n } else if (typeof args[i] === 'object' && !Array.isArray(args[i])) {\n for (const k in args[i]) {\n if (serialize && serialize.indexOf(k) > -1 && k in serializers) {\n args[i][k] = serializers[k](args[i][k])\n }\n }\n }\n }\n}\n\nfunction transmit (logger, opts, args) {\n const send = opts.send\n const ts = opts.ts\n const methodLevel = opts.methodLevel\n const methodValue = opts.methodValue\n const val = opts.val\n const bindings = logger._logEvent.bindings\n\n applySerializers(\n args,\n logger._serialize || Object.keys(logger.serializers),\n logger.serializers,\n logger._stdErrSerialize === undefined ? true : logger._stdErrSerialize\n )\n logger._logEvent.ts = ts\n logger._logEvent.messages = args.filter(function (arg) {\n // bindings can only be objects, so reference equality check via indexOf is fine\n return bindings.indexOf(arg) === -1\n })\n\n logger._logEvent.level.label = methodLevel\n logger._logEvent.level.value = methodValue\n\n send(methodLevel, logger._logEvent, val)\n\n logger._logEvent = createLogEventShape(bindings)\n}\n\nfunction createLogEventShape (bindings) {\n return {\n ts: 0,\n messages: [],\n bindings: bindings || [],\n level: { label: '', value: 0 }\n }\n}\n\nfunction asErrValue (err) {\n const obj = {\n type: err.constructor.name,\n msg: err.message,\n stack: err.stack\n }\n for (const key in err) {\n if (obj[key] === undefined) {\n obj[key] = err[key]\n }\n }\n return obj\n}\n\nfunction getTimeFunction (opts) {\n if (typeof opts.timestamp === 'function') {\n return opts.timestamp\n }\n if (opts.timestamp === false) {\n return nullTime\n }\n return epochTime\n}\n\nfunction mock () { return {} }\nfunction passthrough (a) { return a }\nfunction noop () {}\n\nfunction nullTime () { return false }\nfunction epochTime () { return Date.now() }\nfunction unixTime () { return Math.round(Date.now() / 1000.0) }\nfunction isoTime () { return new Date(Date.now()).toISOString() } // using Date.now() for testability\n\n/* eslint-disable */\n/* istanbul ignore next */\nfunction pfGlobalThisOrFallback () {\n function defd (o) { return typeof o !== 'undefined' && o }\n try {\n if (typeof globalThis !== 'undefined') return globalThis\n Object.defineProperty(Object.prototype, 'globalThis', {\n get: function () {\n delete Object.prototype.globalThis\n return (this.globalThis = this)\n },\n configurable: true\n })\n return globalThis\n } catch (e) {\n return defd(self) || defd(window) || defd(this) || {}\n }\n}\n/* eslint-enable */\n\nmodule.exports.default = pino\nmodule.exports.pino = pino\n", "export default {};", "'use strict';\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.bech32m = exports.bech32 = void 0;\nconst ALPHABET = 'qpzry9x8gf2tvdw0s3jn54khce6mua7l';\nconst ALPHABET_MAP = {};\nfor (let z = 0; z < ALPHABET.length; z++) {\n const x = ALPHABET.charAt(z);\n ALPHABET_MAP[x] = z;\n}\nfunction polymodStep(pre) {\n const b = pre >> 25;\n return (((pre & 0x1ffffff) << 5) ^\n (-((b >> 0) & 1) & 0x3b6a57b2) ^\n (-((b >> 1) & 1) & 0x26508e6d) ^\n (-((b >> 2) & 1) & 0x1ea119fa) ^\n (-((b >> 3) & 1) & 0x3d4233dd) ^\n (-((b >> 4) & 1) & 0x2a1462b3));\n}\nfunction prefixChk(prefix) {\n let chk = 1;\n for (let i = 0; i < prefix.length; ++i) {\n const c = prefix.charCodeAt(i);\n if (c < 33 || c > 126)\n return 'Invalid prefix (' + prefix + ')';\n chk = polymodStep(chk) ^ (c >> 5);\n }\n chk = polymodStep(chk);\n for (let i = 0; i < prefix.length; ++i) {\n const v = prefix.charCodeAt(i);\n chk = polymodStep(chk) ^ (v & 0x1f);\n }\n return chk;\n}\nfunction convert(data, inBits, outBits, pad) {\n let value = 0;\n let bits = 0;\n const maxV = (1 << outBits) - 1;\n const result = [];\n for (let i = 0; i < data.length; ++i) {\n value = (value << inBits) | data[i];\n bits += inBits;\n while (bits >= outBits) {\n bits -= outBits;\n result.push((value >> bits) & maxV);\n }\n }\n if (pad) {\n if (bits > 0) {\n result.push((value << (outBits - bits)) & maxV);\n }\n }\n else {\n if (bits >= inBits)\n return 'Excess padding';\n if ((value << (outBits - bits)) & maxV)\n return 'Non-zero padding';\n }\n return result;\n}\nfunction toWords(bytes) {\n return convert(bytes, 8, 5, true);\n}\nfunction fromWordsUnsafe(words) {\n const res = convert(words, 5, 8, false);\n if (Array.isArray(res))\n return res;\n}\nfunction fromWords(words) {\n const res = convert(words, 5, 8, false);\n if (Array.isArray(res))\n return res;\n throw new Error(res);\n}\nfunction getLibraryFromEncoding(encoding) {\n let ENCODING_CONST;\n if (encoding === 'bech32') {\n ENCODING_CONST = 1;\n }\n else {\n ENCODING_CONST = 0x2bc830a3;\n }\n function encode(prefix, words, LIMIT) {\n LIMIT = LIMIT || 90;\n if (prefix.length + 7 + words.length > LIMIT)\n throw new TypeError('Exceeds length limit');\n prefix = prefix.toLowerCase();\n // determine chk mod\n let chk = prefixChk(prefix);\n if (typeof chk === 'string')\n throw new Error(chk);\n let result = prefix + '1';\n for (let i = 0; i < words.length; ++i) {\n const x = words[i];\n if (x >> 5 !== 0)\n throw new Error('Non 5-bit word');\n chk = polymodStep(chk) ^ x;\n result += ALPHABET.charAt(x);\n }\n for (let i = 0; i < 6; ++i) {\n chk = polymodStep(chk);\n }\n chk ^= ENCODING_CONST;\n for (let i = 0; i < 6; ++i) {\n const v = (chk >> ((5 - i) * 5)) & 0x1f;\n result += ALPHABET.charAt(v);\n }\n return result;\n }\n function __decode(str, LIMIT) {\n LIMIT = LIMIT || 90;\n if (str.length < 8)\n return str + ' too short';\n if (str.length > LIMIT)\n return 'Exceeds length limit';\n // don't allow mixed case\n const lowered = str.toLowerCase();\n const uppered = str.toUpperCase();\n if (str !== lowered && str !== uppered)\n return 'Mixed-case string ' + str;\n str = lowered;\n const split = str.lastIndexOf('1');\n if (split === -1)\n return 'No separator character for ' + str;\n if (split === 0)\n return 'Missing prefix for ' + str;\n const prefix = str.slice(0, split);\n const wordChars = str.slice(split + 1);\n if (wordChars.length < 6)\n return 'Data too short';\n let chk = prefixChk(prefix);\n if (typeof chk === 'string')\n return chk;\n const words = [];\n for (let i = 0; i < wordChars.length; ++i) {\n const c = wordChars.charAt(i);\n const v = ALPHABET_MAP[c];\n if (v === undefined)\n return 'Unknown character ' + c;\n chk = polymodStep(chk) ^ v;\n // not in the checksum?\n if (i + 6 >= wordChars.length)\n continue;\n words.push(v);\n }\n if (chk !== ENCODING_CONST)\n return 'Invalid checksum for ' + str;\n return { prefix, words };\n }\n function decodeUnsafe(str, LIMIT) {\n const res = __decode(str, LIMIT);\n if (typeof res === 'object')\n return res;\n }\n function decode(str, LIMIT) {\n const res = __decode(str, LIMIT);\n if (typeof res === 'object')\n return res;\n throw new Error(res);\n }\n return {\n decodeUnsafe,\n decode,\n encode,\n toWords,\n fromWordsUnsafe,\n fromWords,\n };\n}\nexports.bech32 = getLibraryFromEncoding('bech32');\nexports.bech32m = getLibraryFromEncoding('bech32m');\n", "'use strict'\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n lookup[i] = code[i]\n revLookup[code.charCodeAt(i)] = i\n}\n\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction getLens (b64) {\n var len = b64.length\n\n if (len % 4 > 0) {\n throw new Error('Invalid string. Length must be a multiple of 4')\n }\n\n // Trim off extra bytes after placeholder bytes are found\n // See: https://github.com/beatgammit/base64-js/issues/42\n var validLen = b64.indexOf('=')\n if (validLen === -1) validLen = len\n\n var placeHoldersLen = validLen === len\n ? 0\n : 4 - (validLen % 4)\n\n return [validLen, placeHoldersLen]\n}\n\n// base64 is 4/3 + up to two characters of the original data\nfunction byteLength (b64) {\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction _byteLength (b64, validLen, placeHoldersLen) {\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction toByteArray (b64) {\n var tmp\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n\n var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))\n\n var curByte = 0\n\n // if there are placeholders, only get up to the last complete 4 chars\n var len = placeHoldersLen > 0\n ? validLen - 4\n : validLen\n\n var i\n for (i = 0; i < len; i += 4) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 18) |\n (revLookup[b64.charCodeAt(i + 1)] << 12) |\n (revLookup[b64.charCodeAt(i + 2)] << 6) |\n revLookup[b64.charCodeAt(i + 3)]\n arr[curByte++] = (tmp >> 16) & 0xFF\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 2) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 2) |\n (revLookup[b64.charCodeAt(i + 1)] >> 4)\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 1) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 10) |\n (revLookup[b64.charCodeAt(i + 1)] << 4) |\n (revLookup[b64.charCodeAt(i + 2)] >> 2)\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n return arr\n}\n\nfunction tripletToBase64 (num) {\n return lookup[num >> 18 & 0x3F] +\n lookup[num >> 12 & 0x3F] +\n lookup[num >> 6 & 0x3F] +\n lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n var tmp\n var output = []\n for (var i = start; i < end; i += 3) {\n tmp =\n ((uint8[i] << 16) & 0xFF0000) +\n ((uint8[i + 1] << 8) & 0xFF00) +\n (uint8[i + 2] & 0xFF)\n output.push(tripletToBase64(tmp))\n }\n return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n var tmp\n var len = uint8.length\n var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n var parts = []\n var maxChunkLength = 16383 // must be multiple of 3\n\n // go through the array every three bytes, we'll deal with trailing stuff later\n for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))\n }\n\n // pad the end with zeros, but make sure to not forget the extra bytes\n if (extraBytes === 1) {\n tmp = uint8[len - 1]\n parts.push(\n lookup[tmp >> 2] +\n lookup[(tmp << 4) & 0x3F] +\n '=='\n )\n } else if (extraBytes === 2) {\n tmp = (uint8[len - 2] << 8) + uint8[len - 1]\n parts.push(\n lookup[tmp >> 10] +\n lookup[(tmp >> 4) & 0x3F] +\n lookup[(tmp << 2) & 0x3F] +\n '='\n )\n }\n\n return parts.join('')\n}\n", "/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */\nexports.read = function (buffer, offset, isLE, mLen, nBytes) {\n var e, m\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var nBits = -7\n var i = isLE ? (nBytes - 1) : 0\n var d = isLE ? -1 : 1\n var s = buffer[offset + i]\n\n i += d\n\n e = s & ((1 << (-nBits)) - 1)\n s >>= (-nBits)\n nBits += eLen\n for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n m = e & ((1 << (-nBits)) - 1)\n e >>= (-nBits)\n nBits += mLen\n for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n if (e === 0) {\n e = 1 - eBias\n } else if (e === eMax) {\n return m ? NaN : ((s ? -1 : 1) * Infinity)\n } else {\n m = m + Math.pow(2, mLen)\n e = e - eBias\n }\n return (s ? -1 : 1) * m * Math.pow(2, e - mLen)\n}\n\nexports.write = function (buffer, value, offset, isLE, mLen, nBytes) {\n var e, m, c\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)\n var i = isLE ? 0 : (nBytes - 1)\n var d = isLE ? 1 : -1\n var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0\n\n value = Math.abs(value)\n\n if (isNaN(value) || value === Infinity) {\n m = isNaN(value) ? 1 : 0\n e = eMax\n } else {\n e = Math.floor(Math.log(value) / Math.LN2)\n if (value * (c = Math.pow(2, -e)) < 1) {\n e--\n c *= 2\n }\n if (e + eBias >= 1) {\n value += rt / c\n } else {\n value += rt * Math.pow(2, 1 - eBias)\n }\n if (value * c >= 2) {\n e++\n c /= 2\n }\n\n if (e + eBias >= eMax) {\n m = 0\n e = eMax\n } else if (e + eBias >= 1) {\n m = ((value * c) - 1) * Math.pow(2, mLen)\n e = e + eBias\n } else {\n m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)\n e = 0\n }\n }\n\n for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}\n\n e = (e << mLen) | m\n eLen += mLen\n for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}\n\n buffer[offset + i - d] |= s * 128\n}\n", "/*!\n * The buffer module from node.js, for the browser.\n *\n * @author Feross Aboukhadijeh <https://feross.org>\n * @license MIT\n */\n/* eslint-disable no-proto */\n\n'use strict'\n\nconst base64 = require('base64-js')\nconst ieee754 = require('ieee754')\nconst customInspectSymbol =\n (typeof Symbol === 'function' && typeof Symbol['for'] === 'function') // eslint-disable-line dot-notation\n ? Symbol['for']('nodejs.util.inspect.custom') // eslint-disable-line dot-notation\n : null\n\nexports.Buffer = Buffer\nexports.SlowBuffer = SlowBuffer\nexports.INSPECT_MAX_BYTES = 50\n\nconst K_MAX_LENGTH = 0x7fffffff\nexports.kMaxLength = K_MAX_LENGTH\n\n/**\n * If `Buffer.TYPED_ARRAY_SUPPORT`:\n * === true Use Uint8Array implementation (fastest)\n * === false Print warning and recommend using `buffer` v4.x which has an Object\n * implementation (most compatible, even IE6)\n *\n * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,\n * Opera 11.6+, iOS 4.2+.\n *\n * We report that the browser does not support typed arrays if the are not subclassable\n * using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array`\n * (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support\n * for __proto__ and has a buggy typed array implementation.\n */\nBuffer.TYPED_ARRAY_SUPPORT = typedArraySupport()\n\nif (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== 'undefined' &&\n typeof console.error === 'function') {\n console.error(\n 'This browser lacks typed array (Uint8Array) support which is required by ' +\n '`buffer` v5.x. Use `buffer` v4.x if you require old browser support.'\n )\n}\n\nfunction typedArraySupport () {\n // Can typed array instances can be augmented?\n try {\n const arr = new Uint8Array(1)\n const proto = { foo: function () { return 42 } }\n Object.setPrototypeOf(proto, Uint8Array.prototype)\n Object.setPrototypeOf(arr, proto)\n return arr.foo() === 42\n } catch (e) {\n return false\n }\n}\n\nObject.defineProperty(Buffer.prototype, 'parent', {\n enumerable: true,\n get: function () {\n if (!Buffer.isBuffer(this)) return undefined\n return this.buffer\n }\n})\n\nObject.defineProperty(Buffer.prototype, 'offset', {\n enumerable: true,\n get: function () {\n if (!Buffer.isBuffer(this)) return undefined\n return this.byteOffset\n }\n})\n\nfunction createBuffer (length) {\n if (length > K_MAX_LENGTH) {\n throw new RangeError('The value \"' + length + '\" is invalid for option \"size\"')\n }\n // Return an augmented `Uint8Array` instance\n const buf = new Uint8Array(length)\n Object.setPrototypeOf(buf, Buffer.prototype)\n return buf\n}\n\n/**\n * The Buffer constructor returns instances of `Uint8Array` that have their\n * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of\n * `Uint8Array`, so the returned instances will have all the node `Buffer` methods\n * and the `Uint8Array` methods. Square bracket notation works as expected -- it\n * returns a single octet.\n *\n * The `Uint8Array` prototype remains unmodified.\n */\n\nfunction Buffer (arg, encodingOrOffset, length) {\n // Common case.\n if (typeof arg === 'number') {\n if (typeof encodingOrOffset === 'string') {\n throw new TypeError(\n 'The \"string\" argument must be of type string. Received type number'\n )\n }\n return allocUnsafe(arg)\n }\n return from(arg, encodingOrOffset, length)\n}\n\nBuffer.poolSize = 8192 // not used by this implementation\n\nfunction from (value, encodingOrOffset, length) {\n if (typeof value === 'string') {\n return fromString(value, encodingOrOffset)\n }\n\n if (ArrayBuffer.isView(value)) {\n return fromArrayView(value)\n }\n\n if (value == null) {\n throw new TypeError(\n 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +\n 'or Array-like Object. Received type ' + (typeof value)\n )\n }\n\n if (isInstance(value, ArrayBuffer) ||\n (value && isInstance(value.buffer, ArrayBuffer))) {\n return fromArrayBuffer(value, encodingOrOffset, length)\n }\n\n if (typeof SharedArrayBuffer !== 'undefined' &&\n (isInstance(value, SharedArrayBuffer) ||\n (value && isInstance(value.buffer, SharedArrayBuffer)))) {\n return fromArrayBuffer(value, encodingOrOffset, length)\n }\n\n if (typeof value === 'number') {\n throw new TypeError(\n 'The \"value\" argument must not be of type number. Received type number'\n )\n }\n\n const valueOf = value.valueOf && value.valueOf()\n if (valueOf != null && valueOf !== value) {\n return Buffer.from(valueOf, encodingOrOffset, length)\n }\n\n const b = fromObject(value)\n if (b) return b\n\n if (typeof Symbol !== 'undefined' && Symbol.toPrimitive != null &&\n typeof value[Symbol.toPrimitive] === 'function') {\n return Buffer.from(value[Symbol.toPrimitive]('string'), encodingOrOffset, length)\n }\n\n throw new TypeError(\n 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +\n 'or Array-like Object. Received type ' + (typeof value)\n )\n}\n\n/**\n * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError\n * if value is a number.\n * Buffer.from(str[, encoding])\n * Buffer.from(array)\n * Buffer.from(buffer)\n * Buffer.from(arrayBuffer[, byteOffset[, length]])\n **/\nBuffer.from = function (value, encodingOrOffset, length) {\n return from(value, encodingOrOffset, length)\n}\n\n// Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug:\n// https://github.com/feross/buffer/pull/148\nObject.setPrototypeOf(Buffer.prototype, Uint8Array.prototype)\nObject.setPrototypeOf(Buffer, Uint8Array)\n\nfunction assertSize (size) {\n if (typeof size !== 'number') {\n throw new TypeError('\"size\" argument must be of type number')\n } else if (size < 0) {\n throw new RangeError('The value \"' + size + '\" is invalid for option \"size\"')\n }\n}\n\nfunction alloc (size, fill, encoding) {\n assertSize(size)\n if (size <= 0) {\n return createBuffer(size)\n }\n if (fill !== undefined) {\n // Only pay attention to encoding if it's a string. This\n // prevents accidentally sending in a number that would\n // be interpreted as a start offset.\n return typeof encoding === 'string'\n ? createBuffer(size).fill(fill, encoding)\n : createBuffer(size).fill(fill)\n }\n return createBuffer(size)\n}\n\n/**\n * Creates a new filled Buffer instance.\n * alloc(size[, fill[, encoding]])\n **/\nBuffer.alloc = function (size, fill, encoding) {\n return alloc(size, fill, encoding)\n}\n\nfunction allocUnsafe (size) {\n assertSize(size)\n return createBuffer(size < 0 ? 0 : checked(size) | 0)\n}\n\n/**\n * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.\n * */\nBuffer.allocUnsafe = function (size) {\n return allocUnsafe(size)\n}\n/**\n * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.\n */\nBuffer.allocUnsafeSlow = function (size) {\n return allocUnsafe(size)\n}\n\nfunction fromString (string, encoding) {\n if (typeof encoding !== 'string' || encoding === '') {\n encoding = 'utf8'\n }\n\n if (!Buffer.isEncoding(encoding)) {\n throw new TypeError('Unknown encoding: ' + encoding)\n }\n\n const length = byteLength(string, encoding) | 0\n let buf = createBuffer(length)\n\n const actual = buf.write(string, encoding)\n\n if (actual !== length) {\n // Writing a hex string, for example, that contains invalid characters will\n // cause everything after the first invalid character to be ignored. (e.g.\n // 'abxxcd' will be treated as 'ab')\n buf = buf.slice(0, actual)\n }\n\n return buf\n}\n\nfunction fromArrayLike (array) {\n const length = array.length < 0 ? 0 : checked(array.length) | 0\n const buf = createBuffer(length)\n for (let i = 0; i < length; i += 1) {\n buf[i] = array[i] & 255\n }\n return buf\n}\n\nfunction fromArrayView (arrayView) {\n if (isInstance(arrayView, Uint8Array)) {\n const copy = new Uint8Array(arrayView)\n return fromArrayBuffer(copy.buffer, copy.byteOffset, copy.byteLength)\n }\n return fromArrayLike(arrayView)\n}\n\nfunction fromArrayBuffer (array, byteOffset, length) {\n if (byteOffset < 0 || array.byteLength < byteOffset) {\n throw new RangeError('\"offset\" is outside of buffer bounds')\n }\n\n if (array.byteLength < byteOffset + (length || 0)) {\n throw new RangeError('\"length\" is outside of buffer bounds')\n }\n\n let buf\n if (byteOffset === undefined && length === undefined) {\n buf = new Uint8Array(array)\n } else if (length === undefined) {\n buf = new Uint8Array(array, byteOffset)\n } else {\n buf = new Uint8Array(array, byteOffset, length)\n }\n\n // Return an augmented `Uint8Array` instance\n Object.setPrototypeOf(buf, Buffer.prototype)\n\n return buf\n}\n\nfunction fromObject (obj) {\n if (Buffer.isBuffer(obj)) {\n const len = checked(obj.length) | 0\n const buf = createBuffer(len)\n\n if (buf.length === 0) {\n return buf\n }\n\n obj.copy(buf, 0, 0, len)\n return buf\n }\n\n if (obj.length !== undefined) {\n if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) {\n return createBuffer(0)\n }\n return fromArrayLike(obj)\n }\n\n if (obj.type === 'Buffer' && Array.isArray(obj.data)) {\n return fromArrayLike(obj.data)\n }\n}\n\nfunction checked (length) {\n // Note: cannot use `length < K_MAX_LENGTH` here because that fails when\n // length is NaN (which is otherwise coerced to zero.)\n if (length >= K_MAX_LENGTH) {\n throw new RangeError('Attempt to allocate Buffer larger than maximum ' +\n 'size: 0x' + K_MAX_LENGTH.toString(16) + ' bytes')\n }\n return length | 0\n}\n\nfunction SlowBuffer (length) {\n if (+length != length) { // eslint-disable-line eqeqeq\n length = 0\n }\n return Buffer.alloc(+length)\n}\n\nBuffer.isBuffer = function isBuffer (b) {\n return b != null && b._isBuffer === true &&\n b !== Buffer.prototype // so Buffer.isBuffer(Buffer.prototype) will be false\n}\n\nBuffer.compare = function compare (a, b) {\n if (isInstance(a, Uint8Array)) a = Buffer.from(a, a.offset, a.byteLength)\n if (isInstance(b, Uint8Array)) b = Buffer.from(b, b.offset, b.byteLength)\n if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {\n throw new TypeError(\n 'The \"buf1\", \"buf2\" arguments must be one of type Buffer or Uint8Array'\n )\n }\n\n if (a === b) return 0\n\n let x = a.length\n let y = b.length\n\n for (let i = 0, len = Math.min(x, y); i < len; ++i) {\n if (a[i] !== b[i]) {\n x = a[i]\n y = b[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\nBuffer.isEncoding = function isEncoding (encoding) {\n switch (String(encoding).toLowerCase()) {\n case 'hex':\n case 'utf8':\n case 'utf-8':\n case 'ascii':\n case 'latin1':\n case 'binary':\n case 'base64':\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return true\n default:\n return false\n }\n}\n\nBuffer.concat = function concat (list, length) {\n if (!Array.isArray(list)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n }\n\n if (list.length === 0) {\n return Buffer.alloc(0)\n }\n\n let i\n if (length === undefined) {\n length = 0\n for (i = 0; i < list.length; ++i) {\n length += list[i].length\n }\n }\n\n const buffer = Buffer.allocUnsafe(length)\n let pos = 0\n for (i = 0; i < list.length; ++i) {\n let buf = list[i]\n if (isInstance(buf, Uint8Array)) {\n if (pos + buf.length > buffer.length) {\n if (!Buffer.isBuffer(buf)) buf = Buffer.from(buf)\n buf.copy(buffer, pos)\n } else {\n Uint8Array.prototype.set.call(\n buffer,\n buf,\n pos\n )\n }\n } else if (!Buffer.isBuffer(buf)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n } else {\n buf.copy(buffer, pos)\n }\n pos += buf.length\n }\n return buffer\n}\n\nfunction byteLength (string, encoding) {\n if (Buffer.isBuffer(string)) {\n return string.length\n }\n if (ArrayBuffer.isView(string) || isInstance(string, ArrayBuffer)) {\n return string.byteLength\n }\n if (typeof string !== 'string') {\n throw new TypeError(\n 'The \"string\" argument must be one of type string, Buffer, or ArrayBuffer. ' +\n 'Received type ' + typeof string\n )\n }\n\n const len = string.length\n const mustMatch = (arguments.length > 2 && arguments[2] === true)\n if (!mustMatch && len === 0) return 0\n\n // Use a for loop to avoid recursion\n let loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'ascii':\n case 'latin1':\n case 'binary':\n return len\n case 'utf8':\n case 'utf-8':\n return utf8ToBytes(string).length\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return len * 2\n case 'hex':\n return len >>> 1\n case 'base64':\n return base64ToBytes(string).length\n default:\n if (loweredCase) {\n return mustMatch ? -1 : utf8ToBytes(string).length // assume utf8\n }\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\nBuffer.byteLength = byteLength\n\nfunction slowToString (encoding, start, end) {\n let loweredCase = false\n\n // No need to verify that \"this.length <= MAX_UINT32\" since it's a read-only\n // property of a typed array.\n\n // This behaves neither like String nor Uint8Array in that we set start/end\n // to their upper/lower bounds if the value passed is out of range.\n // undefined is handled specially as per ECMA-262 6th Edition,\n // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.\n if (start === undefined || start < 0) {\n start = 0\n }\n // Return early if start > this.length. Done here to prevent potential uint32\n // coercion fail below.\n if (start > this.length) {\n return ''\n }\n\n if (end === undefined || end > this.length) {\n end = this.length\n }\n\n if (end <= 0) {\n return ''\n }\n\n // Force coercion to uint32. This will also coerce falsey/NaN values to 0.\n end >>>= 0\n start >>>= 0\n\n if (end <= start) {\n return ''\n }\n\n if (!encoding) encoding = 'utf8'\n\n while (true) {\n switch (encoding) {\n case 'hex':\n return hexSlice(this, start, end)\n\n case 'utf8':\n case 'utf-8':\n return utf8Slice(this, start, end)\n\n case 'ascii':\n return asciiSlice(this, start, end)\n\n case 'latin1':\n case 'binary':\n return latin1Slice(this, start, end)\n\n case 'base64':\n return base64Slice(this, start, end)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return utf16leSlice(this, start, end)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = (encoding + '').toLowerCase()\n loweredCase = true\n }\n }\n}\n\n// This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package)\n// to detect a Buffer instance. It's not possible to use `instanceof Buffer`\n// reliably in a browserify context because there could be multiple different\n// copies of the 'buffer' package in use. This method works even for Buffer\n// instances that were created from another copy of the `buffer` package.\n// See: https://github.com/feross/buffer/issues/154\nBuffer.prototype._isBuffer = true\n\nfunction swap (b, n, m) {\n const i = b[n]\n b[n] = b[m]\n b[m] = i\n}\n\nBuffer.prototype.swap16 = function swap16 () {\n const len = this.length\n if (len % 2 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 16-bits')\n }\n for (let i = 0; i < len; i += 2) {\n swap(this, i, i + 1)\n }\n return this\n}\n\nBuffer.prototype.swap32 = function swap32 () {\n const len = this.length\n if (len % 4 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 32-bits')\n }\n for (let i = 0; i < len; i += 4) {\n swap(this, i, i + 3)\n swap(this, i + 1, i + 2)\n }\n return this\n}\n\nBuffer.prototype.swap64 = function swap64 () {\n const len = this.length\n if (len % 8 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 64-bits')\n }\n for (let i = 0; i < len; i += 8) {\n swap(this, i, i + 7)\n swap(this, i + 1, i + 6)\n swap(this, i + 2, i + 5)\n swap(this, i + 3, i + 4)\n }\n return this\n}\n\nBuffer.prototype.toString = function toString () {\n const length = this.length\n if (length === 0) return ''\n if (arguments.length === 0) return utf8Slice(this, 0, length)\n return slowToString.apply(this, arguments)\n}\n\nBuffer.prototype.toLocaleString = Buffer.prototype.toString\n\nBuffer.prototype.equals = function equals (b) {\n if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')\n if (this === b) return true\n return Buffer.compare(this, b) === 0\n}\n\nBuffer.prototype.inspect = function inspect () {\n let str = ''\n const max = exports.INSPECT_MAX_BYTES\n str = this.toString('hex', 0, max).replace(/(.{2})/g, '$1 ').trim()\n if (this.length > max) str += ' ... '\n return '<Buffer ' + str + '>'\n}\nif (customInspectSymbol) {\n Buffer.prototype[customInspectSymbol] = Buffer.prototype.inspect\n}\n\nBuffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {\n if (isInstance(target, Uint8Array)) {\n target = Buffer.from(target, target.offset, target.byteLength)\n }\n if (!Buffer.isBuffer(target)) {\n throw new TypeError(\n 'The \"target\" argument must be one of type Buffer or Uint8Array. ' +\n 'Received type ' + (typeof target)\n )\n }\n\n if (start === undefined) {\n start = 0\n }\n if (end === undefined) {\n end = target ? target.length : 0\n }\n if (thisStart === undefined) {\n thisStart = 0\n }\n if (thisEnd === undefined) {\n thisEnd = this.length\n }\n\n if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {\n throw new RangeError('out of range index')\n }\n\n if (thisStart >= thisEnd && start >= end) {\n return 0\n }\n if (thisStart >= thisEnd) {\n return -1\n }\n if (start >= end) {\n return 1\n }\n\n start >>>= 0\n end >>>= 0\n thisStart >>>= 0\n thisEnd >>>= 0\n\n if (this === target) return 0\n\n let x = thisEnd - thisStart\n let y = end - start\n const len = Math.min(x, y)\n\n const thisCopy = this.slice(thisStart, thisEnd)\n const targetCopy = target.slice(start, end)\n\n for (let i = 0; i < len; ++i) {\n if (thisCopy[i] !== targetCopy[i]) {\n x = thisCopy[i]\n y = targetCopy[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\n// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,\n// OR the last index of `val` in `buffer` at offset <= `byteOffset`.\n//\n// Arguments:\n// - buffer - a Buffer to search\n// - val - a string, Buffer, or number\n// - byteOffset - an index into `buffer`; will be clamped to an int32\n// - encoding - an optional encoding, relevant is val is a string\n// - dir - true for indexOf, false for lastIndexOf\nfunction bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {\n // Empty buffer means no match\n if (buffer.length === 0) return -1\n\n // Normalize byteOffset\n if (typeof byteOffset === 'string') {\n encoding = byteOffset\n byteOffset = 0\n } else if (byteOffset > 0x7fffffff) {\n byteOffset = 0x7fffffff\n } else if (byteOffset < -0x80000000) {\n byteOffset = -0x80000000\n }\n byteOffset = +byteOffset // Coerce to Number.\n if (numberIsNaN(byteOffset)) {\n // byteOffset: it it's undefined, null, NaN, \"foo\", etc, search whole buffer\n byteOffset = dir ? 0 : (buffer.length - 1)\n }\n\n // Normalize byteOffset: negative offsets start from the end of the buffer\n if (byteOffset < 0) byteOffset = buffer.length + byteOffset\n if (byteOffset >= buffer.length) {\n if (dir) return -1\n else byteOffset = buffer.length - 1\n } else if (byteOffset < 0) {\n if (dir) byteOffset = 0\n else return -1\n }\n\n // Normalize val\n if (typeof val === 'string') {\n val = Buffer.from(val, encoding)\n }\n\n // Finally, search either indexOf (if dir is true) or lastIndexOf\n if (Buffer.isBuffer(val)) {\n // Special case: looking for empty string/buffer always fails\n if (val.length === 0) {\n return -1\n }\n return arrayIndexOf(buffer, val, byteOffset, encoding, dir)\n } else if (typeof val === 'number') {\n val = val & 0xFF // Search for a byte value [0-255]\n if (typeof Uint8Array.prototype.indexOf === 'function') {\n if (dir) {\n return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)\n } else {\n return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)\n }\n }\n return arrayIndexOf(buffer, [val], byteOffset, encoding, dir)\n }\n\n throw new TypeError('val must be string, number or Buffer')\n}\n\nfunction arrayIndexOf (arr, val, byteOffset, encoding, dir) {\n let indexSize = 1\n let arrLength = arr.length\n let valLength = val.length\n\n if (encoding !== undefined) {\n encoding = String(encoding).toLowerCase()\n if (encoding === 'ucs2' || encoding === 'ucs-2' ||\n encoding === 'utf16le' || encoding === 'utf-16le') {\n if (arr.length < 2 || val.length < 2) {\n return -1\n }\n indexSize = 2\n arrLength /= 2\n valLength /= 2\n byteOffset /= 2\n }\n }\n\n function read (buf, i) {\n if (indexSize === 1) {\n return buf[i]\n } else {\n return buf.readUInt16BE(i * indexSize)\n }\n }\n\n let i\n if (dir) {\n let foundIndex = -1\n for (i = byteOffset; i < arrLength; i++) {\n if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {\n if (foundIndex === -1) foundIndex = i\n if (i - foundIndex + 1 === valLength) return foundIndex * indexSize\n } else {\n if (foundIndex !== -1) i -= i - foundIndex\n foundIndex = -1\n }\n }\n } else {\n if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength\n for (i = byteOffset; i >= 0; i--) {\n let found = true\n for (let j = 0; j < valLength; j++) {\n if (read(arr, i + j) !== read(val, j)) {\n found = false\n break\n }\n }\n if (found) return i\n }\n }\n\n return -1\n}\n\nBuffer.prototype.includes = function includes (val, byteOffset, encoding) {\n return this.indexOf(val, byteOffset, encoding) !== -1\n}\n\nBuffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, true)\n}\n\nBuffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, false)\n}\n\nfunction hexWrite (buf, string, offset, length) {\n offset = Number(offset) || 0\n const remaining = buf.length - offset\n if (!length) {\n length = remaining\n } else {\n length = Number(length)\n if (length > remaining) {\n length = remaining\n }\n }\n\n const strLen = string.length\n\n if (length > strLen / 2) {\n length = strLen / 2\n }\n let i\n for (i = 0; i < length; ++i) {\n const parsed = parseInt(string.substr(i * 2, 2), 16)\n if (numberIsNaN(parsed)) return i\n buf[offset + i] = parsed\n }\n return i\n}\n\nfunction utf8Write (buf, string, offset, length) {\n return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nfunction asciiWrite (buf, string, offset, length) {\n return blitBuffer(asciiToBytes(string), buf, offset, length)\n}\n\nfunction base64Write (buf, string, offset, length) {\n return blitBuffer(base64ToBytes(string), buf, offset, length)\n}\n\nfunction ucs2Write (buf, string, offset, length) {\n return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nBuffer.prototype.write = function write (string, offset, length, encoding) {\n // Buffer#write(string)\n if (offset === undefined) {\n encoding = 'utf8'\n length = this.length\n offset = 0\n // Buffer#write(string, encoding)\n } else if (length === undefined && typeof offset === 'string') {\n encoding = offset\n length = this.length\n offset = 0\n // Buffer#write(string, offset[, length][, encoding])\n } else if (isFinite(offset)) {\n offset = offset >>> 0\n if (isFinite(length)) {\n length = length >>> 0\n if (encoding === undefined) encoding = 'utf8'\n } else {\n encoding = length\n length = undefined\n }\n } else {\n throw new Error(\n 'Buffer.write(string, encoding, offset[, length]) is no longer supported'\n )\n }\n\n const remaining = this.length - offset\n if (length === undefined || length > remaining) length = remaining\n\n if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {\n throw new RangeError('Attempt to write outside buffer bounds')\n }\n\n if (!encoding) encoding = 'utf8'\n\n let loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'hex':\n return hexWrite(this, string, offset, length)\n\n case 'utf8':\n case 'utf-8':\n return utf8Write(this, string, offset, length)\n\n case 'ascii':\n case 'latin1':\n case 'binary':\n return asciiWrite(this, string, offset, length)\n\n case 'base64':\n // Warning: maxLength not taken into account in base64Write\n return base64Write(this, string, offset, length)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return ucs2Write(this, string, offset, length)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\n\nBuffer.prototype.toJSON = function toJSON () {\n return {\n type: 'Buffer',\n data: Array.prototype.slice.call(this._arr || this, 0)\n }\n}\n\nfunction base64Slice (buf, start, end) {\n if (start === 0 && end === buf.length) {\n return base64.fromByteArray(buf)\n } else {\n return base64.fromByteArray(buf.slice(start, end))\n }\n}\n\nfunction utf8Slice (buf, start, end) {\n end = Math.min(buf.length, end)\n const res = []\n\n let i = start\n while (i < end) {\n const firstByte = buf[i]\n let codePoint = null\n let bytesPerSequence = (firstByte > 0xEF)\n ? 4\n : (firstByte > 0xDF)\n ? 3\n : (firstByte > 0xBF)\n ? 2\n : 1\n\n if (i + bytesPerSequence <= end) {\n let secondByte, thirdByte, fourthByte, tempCodePoint\n\n switch (bytesPerSequence) {\n case 1:\n if (firstByte < 0x80) {\n codePoint = firstByte\n }\n break\n case 2:\n secondByte = buf[i + 1]\n if ((secondByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)\n if (tempCodePoint > 0x7F) {\n codePoint = tempCodePoint\n }\n }\n break\n case 3:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)\n if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {\n codePoint = tempCodePoint\n }\n }\n break\n case 4:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n fourthByte = buf[i + 3]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)\n if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {\n codePoint = tempCodePoint\n }\n }\n }\n }\n\n if (codePoint === null) {\n // we did not generate a valid codePoint so insert a\n // replacement char (U+FFFD) and advance only 1 byte\n codePoint = 0xFFFD\n bytesPerSequence = 1\n } else if (codePoint > 0xFFFF) {\n // encode to utf16 (surrogate pair dance)\n codePoint -= 0x10000\n res.push(codePoint >>> 10 & 0x3FF | 0xD800)\n codePoint = 0xDC00 | codePoint & 0x3FF\n }\n\n res.push(codePoint)\n i += bytesPerSequence\n }\n\n return decodeCodePointsArray(res)\n}\n\n// Based on http://stackoverflow.com/a/22747272/680742, the browser with\n// the lowest limit is Chrome, with 0x10000 args.\n// We go 1 magnitude less, for safety\nconst MAX_ARGUMENTS_LENGTH = 0x1000\n\nfunction decodeCodePointsArray (codePoints) {\n const len = codePoints.length\n if (len <= MAX_ARGUMENTS_LENGTH) {\n return String.fromCharCode.apply(String, codePoints) // avoid extra slice()\n }\n\n // Decode in chunks to avoid \"call stack size exceeded\".\n let res = ''\n let i = 0\n while (i < len) {\n res += String.fromCharCode.apply(\n String,\n codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)\n )\n }\n return res\n}\n\nfunction asciiSlice (buf, start, end) {\n let ret = ''\n end = Math.min(buf.length, end)\n\n for (let i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i] & 0x7F)\n }\n return ret\n}\n\nfunction latin1Slice (buf, start, end) {\n let ret = ''\n end = Math.min(buf.length, end)\n\n for (let i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i])\n }\n return ret\n}\n\nfunction hexSlice (buf, start, end) {\n const len = buf.length\n\n if (!start || start < 0) start = 0\n if (!end || end < 0 || end > len) end = len\n\n let out = ''\n for (let i = start; i < end; ++i) {\n out += hexSliceLookupTable[buf[i]]\n }\n return out\n}\n\nfunction utf16leSlice (buf, start, end) {\n const bytes = buf.slice(start, end)\n let res = ''\n // If bytes.length is odd, the last 8 bits must be ignored (same as node.js)\n for (let i = 0; i < bytes.length - 1; i += 2) {\n res += String.fromCharCode(bytes[i] + (bytes[i + 1] * 256))\n }\n return res\n}\n\nBuffer.prototype.slice = function slice (start, end) {\n const len = this.length\n start = ~~start\n end = end === undefined ? len : ~~end\n\n if (start < 0) {\n start += len\n if (start < 0) start = 0\n } else if (start > len) {\n start = len\n }\n\n if (end < 0) {\n end += len\n if (end < 0) end = 0\n } else if (end > len) {\n end = len\n }\n\n if (end < start) end = start\n\n const newBuf = this.subarray(start, end)\n // Return an augmented `Uint8Array` instance\n Object.setPrototypeOf(newBuf, Buffer.prototype)\n\n return newBuf\n}\n\n/*\n * Need to make sure that buffer isn't trying to write out of bounds.\n */\nfunction checkOffset (offset, ext, length) {\n if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')\n if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')\n}\n\nBuffer.prototype.readUintLE =\nBuffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n let val = this[offset]\n let mul = 1\n let i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUintBE =\nBuffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n checkOffset(offset, byteLength, this.length)\n }\n\n let val = this[offset + --byteLength]\n let mul = 1\n while (byteLength > 0 && (mul *= 0x100)) {\n val += this[offset + --byteLength] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUint8 =\nBuffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 1, this.length)\n return this[offset]\n}\n\nBuffer.prototype.readUint16LE =\nBuffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n return this[offset] | (this[offset + 1] << 8)\n}\n\nBuffer.prototype.readUint16BE =\nBuffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n return (this[offset] << 8) | this[offset + 1]\n}\n\nBuffer.prototype.readUint32LE =\nBuffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return ((this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16)) +\n (this[offset + 3] * 0x1000000)\n}\n\nBuffer.prototype.readUint32BE =\nBuffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] * 0x1000000) +\n ((this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n this[offset + 3])\n}\n\nBuffer.prototype.readBigUInt64LE = defineBigIntMethod(function readBigUInt64LE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const lo = first +\n this[++offset] * 2 ** 8 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 24\n\n const hi = this[++offset] +\n this[++offset] * 2 ** 8 +\n this[++offset] * 2 ** 16 +\n last * 2 ** 24\n\n return BigInt(lo) + (BigInt(hi) << BigInt(32))\n})\n\nBuffer.prototype.readBigUInt64BE = defineBigIntMethod(function readBigUInt64BE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const hi = first * 2 ** 24 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n this[++offset]\n\n const lo = this[++offset] * 2 ** 24 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n last\n\n return (BigInt(hi) << BigInt(32)) + BigInt(lo)\n})\n\nBuffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n let val = this[offset]\n let mul = 1\n let i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n let i = byteLength\n let mul = 1\n let val = this[offset + --i]\n while (i > 0 && (mul *= 0x100)) {\n val += this[offset + --i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readInt8 = function readInt8 (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 1, this.length)\n if (!(this[offset] & 0x80)) return (this[offset])\n return ((0xff - this[offset] + 1) * -1)\n}\n\nBuffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n const val = this[offset] | (this[offset + 1] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n const val = this[offset + 1] | (this[offset] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16) |\n (this[offset + 3] << 24)\n}\n\nBuffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] << 24) |\n (this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n (this[offset + 3])\n}\n\nBuffer.prototype.readBigInt64LE = defineBigIntMethod(function readBigInt64LE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const val = this[offset + 4] +\n this[offset + 5] * 2 ** 8 +\n this[offset + 6] * 2 ** 16 +\n (last << 24) // Overflow\n\n return (BigInt(val) << BigInt(32)) +\n BigInt(first +\n this[++offset] * 2 ** 8 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 24)\n})\n\nBuffer.prototype.readBigInt64BE = defineBigIntMethod(function readBigInt64BE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const val = (first << 24) + // Overflow\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n this[++offset]\n\n return (BigInt(val) << BigInt(32)) +\n BigInt(this[++offset] * 2 ** 24 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n last)\n})\n\nBuffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, true, 23, 4)\n}\n\nBuffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, false, 23, 4)\n}\n\nBuffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, true, 52, 8)\n}\n\nBuffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, false, 52, 8)\n}\n\nfunction checkInt (buf, value, offset, ext, max, min) {\n if (!Buffer.isBuffer(buf)) throw new TypeError('\"buffer\" argument must be a Buffer instance')\n if (value > max || value < min) throw new RangeError('\"value\" argument is out of bounds')\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n}\n\nBuffer.prototype.writeUintLE =\nBuffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n const maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n let mul = 1\n let i = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUintBE =\nBuffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n const maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n let i = byteLength - 1\n let mul = 1\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUint8 =\nBuffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nBuffer.prototype.writeUint16LE =\nBuffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n return offset + 2\n}\n\nBuffer.prototype.writeUint16BE =\nBuffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n return offset + 2\n}\n\nBuffer.prototype.writeUint32LE =\nBuffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n this[offset + 3] = (value >>> 24)\n this[offset + 2] = (value >>> 16)\n this[offset + 1] = (value >>> 8)\n this[offset] = (value & 0xff)\n return offset + 4\n}\n\nBuffer.prototype.writeUint32BE =\nBuffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n return offset + 4\n}\n\nfunction wrtBigUInt64LE (buf, value, offset, min, max) {\n checkIntBI(value, min, max, buf, offset, 7)\n\n let lo = Number(value & BigInt(0xffffffff))\n buf[offset++] = lo\n lo = lo >> 8\n buf[offset++] = lo\n lo = lo >> 8\n buf[offset++] = lo\n lo = lo >> 8\n buf[offset++] = lo\n let hi = Number(value >> BigInt(32) & BigInt(0xffffffff))\n buf[offset++] = hi\n hi = hi >> 8\n buf[offset++] = hi\n hi = hi >> 8\n buf[offset++] = hi\n hi = hi >> 8\n buf[offset++] = hi\n return offset\n}\n\nfunction wrtBigUInt64BE (buf, value, offset, min, max) {\n checkIntBI(value, min, max, buf, offset, 7)\n\n let lo = Number(value & BigInt(0xffffffff))\n buf[offset + 7] = lo\n lo = lo >> 8\n buf[offset + 6] = lo\n lo = lo >> 8\n buf[offset + 5] = lo\n lo = lo >> 8\n buf[offset + 4] = lo\n let hi = Number(value >> BigInt(32) & BigInt(0xffffffff))\n buf[offset + 3] = hi\n hi = hi >> 8\n buf[offset + 2] = hi\n hi = hi >> 8\n buf[offset + 1] = hi\n hi = hi >> 8\n buf[offset] = hi\n return offset + 8\n}\n\nBuffer.prototype.writeBigUInt64LE = defineBigIntMethod(function writeBigUInt64LE (value, offset = 0) {\n return wrtBigUInt64LE(this, value, offset, BigInt(0), BigInt('0xffffffffffffffff'))\n})\n\nBuffer.prototype.writeBigUInt64BE = defineBigIntMethod(function writeBigUInt64BE (value, offset = 0) {\n return wrtBigUInt64BE(this, value, offset, BigInt(0), BigInt('0xffffffffffffffff'))\n})\n\nBuffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n const limit = Math.pow(2, (8 * byteLength) - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n let i = 0\n let mul = 1\n let sub = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n const limit = Math.pow(2, (8 * byteLength) - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n let i = byteLength - 1\n let mul = 1\n let sub = 0\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)\n if (value < 0) value = 0xff + value + 1\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nBuffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n return offset + 2\n}\n\nBuffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n return offset + 2\n}\n\nBuffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n this[offset + 2] = (value >>> 16)\n this[offset + 3] = (value >>> 24)\n return offset + 4\n}\n\nBuffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n if (value < 0) value = 0xffffffff + value + 1\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n return offset + 4\n}\n\nBuffer.prototype.writeBigInt64LE = defineBigIntMethod(function writeBigInt64LE (value, offset = 0) {\n return wrtBigUInt64LE(this, value, offset, -BigInt('0x8000000000000000'), BigInt('0x7fffffffffffffff'))\n})\n\nBuffer.prototype.writeBigInt64BE = defineBigIntMethod(function writeBigInt64BE (value, offset = 0) {\n return wrtBigUInt64BE(this, value, offset, -BigInt('0x8000000000000000'), BigInt('0x7fffffffffffffff'))\n})\n\nfunction checkIEEE754 (buf, value, offset, ext, max, min) {\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n if (offset < 0) throw new RangeError('Index out of range')\n}\n\nfunction writeFloat (buf, value, offset, littleEndian, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)\n }\n ieee754.write(buf, value, offset, littleEndian, 23, 4)\n return offset + 4\n}\n\nBuffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {\n return writeFloat(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {\n return writeFloat(this, value, offset, false, noAssert)\n}\n\nfunction writeDouble (buf, value, offset, littleEndian, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)\n }\n ieee754.write(buf, value, offset, littleEndian, 52, 8)\n return offset + 8\n}\n\nBuffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {\n return writeDouble(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {\n return writeDouble(this, value, offset, false, noAssert)\n}\n\n// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)\nBuffer.prototype.copy = function copy (target, targetStart, start, end) {\n if (!Buffer.isBuffer(target)) throw new TypeError('argument should be a Buffer')\n if (!start) start = 0\n if (!end && end !== 0) end = this.length\n if (targetStart >= target.length) targetStart = target.length\n if (!targetStart) targetStart = 0\n if (end > 0 && end < start) end = start\n\n // Copy 0 bytes; we're done\n if (end === start) return 0\n if (target.length === 0 || this.length === 0) return 0\n\n // Fatal error conditions\n if (targetStart < 0) {\n throw new RangeError('targetStart out of bounds')\n }\n if (start < 0 || start >= this.length) throw new RangeError('Index out of range')\n if (end < 0) throw new RangeError('sourceEnd out of bounds')\n\n // Are we oob?\n if (end > this.length) end = this.length\n if (target.length - targetStart < end - start) {\n end = target.length - targetStart + start\n }\n\n const len = end - start\n\n if (this === target && typeof Uint8Array.prototype.copyWithin === 'function') {\n // Use built-in when available, missing from IE11\n this.copyWithin(targetStart, start, end)\n } else {\n Uint8Array.prototype.set.call(\n target,\n this.subarray(start, end),\n targetStart\n )\n }\n\n return len\n}\n\n// Usage:\n// buffer.fill(number[, offset[, end]])\n// buffer.fill(buffer[, offset[, end]])\n// buffer.fill(string[, offset[, end]][, encoding])\nBuffer.prototype.fill = function fill (val, start, end, encoding) {\n // Handle string cases:\n if (typeof val === 'string') {\n if (typeof start === 'string') {\n encoding = start\n start = 0\n end = this.length\n } else if (typeof end === 'string') {\n encoding = end\n end = this.length\n }\n if (encoding !== undefined && typeof encoding !== 'string') {\n throw new TypeError('encoding must be a string')\n }\n if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {\n throw new TypeError('Unknown encoding: ' + encoding)\n }\n if (val.length === 1) {\n const code = val.charCodeAt(0)\n if ((encoding === 'utf8' && code < 128) ||\n encoding === 'latin1') {\n // Fast path: If `val` fits into a single byte, use that numeric value.\n val = code\n }\n }\n } else if (typeof val === 'number') {\n val = val & 255\n } else if (typeof val === 'boolean') {\n val = Number(val)\n }\n\n // Invalid ranges are not set to a default, so can range check early.\n if (start < 0 || this.length < start || this.length < end) {\n throw new RangeError('Out of range index')\n }\n\n if (end <= start) {\n return this\n }\n\n start = start >>> 0\n end = end === undefined ? this.length : end >>> 0\n\n if (!val) val = 0\n\n let i\n if (typeof val === 'number') {\n for (i = start; i < end; ++i) {\n this[i] = val\n }\n } else {\n const bytes = Buffer.isBuffer(val)\n ? val\n : Buffer.from(val, encoding)\n const len = bytes.length\n if (len === 0) {\n throw new TypeError('The value \"' + val +\n '\" is invalid for argument \"value\"')\n }\n for (i = 0; i < end - start; ++i) {\n this[i + start] = bytes[i % len]\n }\n }\n\n return this\n}\n\n// CUSTOM ERRORS\n// =============\n\n// Simplified versions from Node, changed for Buffer-only usage\nconst errors = {}\nfunction E (sym, getMessage, Base) {\n errors[sym] = class NodeError extends Base {\n constructor () {\n super()\n\n Object.defineProperty(this, 'message', {\n value: getMessage.apply(this, arguments),\n writable: true,\n configurable: true\n })\n\n // Add the error code to the name to include it in the stack trace.\n this.name = `${this.name} [${sym}]`\n // Access the stack to generate the error message including the error code\n // from the name.\n this.stack // eslint-disable-line no-unused-expressions\n // Reset the name to the actual name.\n delete this.name\n }\n\n get code () {\n return sym\n }\n\n set code (value) {\n Object.defineProperty(this, 'code', {\n configurable: true,\n enumerable: true,\n value,\n writable: true\n })\n }\n\n toString () {\n return `${this.name} [${sym}]: ${this.message}`\n }\n }\n}\n\nE('ERR_BUFFER_OUT_OF_BOUNDS',\n function (name) {\n if (name) {\n return `${name} is outside of buffer bounds`\n }\n\n return 'Attempt to access memory outside buffer bounds'\n }, RangeError)\nE('ERR_INVALID_ARG_TYPE',\n function (name, actual) {\n return `The \"${name}\" argument must be of type number. Received type ${typeof actual}`\n }, TypeError)\nE('ERR_OUT_OF_RANGE',\n function (str, range, input) {\n let msg = `The value of \"${str}\" is out of range.`\n let received = input\n if (Number.isInteger(input) && Math.abs(input) > 2 ** 32) {\n received = addNumericalSeparator(String(input))\n } else if (typeof input === 'bigint') {\n received = String(input)\n if (input > BigInt(2) ** BigInt(32) || input < -(BigInt(2) ** BigInt(32))) {\n received = addNumericalSeparator(received)\n }\n received += 'n'\n }\n msg += ` It must be ${range}. Received ${received}`\n return msg\n }, RangeError)\n\nfunction addNumericalSeparator (val) {\n let res = ''\n let i = val.length\n const start = val[0] === '-' ? 1 : 0\n for (; i >= start + 4; i -= 3) {\n res = `_${val.slice(i - 3, i)}${res}`\n }\n return `${val.slice(0, i)}${res}`\n}\n\n// CHECK FUNCTIONS\n// ===============\n\nfunction checkBounds (buf, offset, byteLength) {\n validateNumber(offset, 'offset')\n if (buf[offset] === undefined || buf[offset + byteLength] === undefined) {\n boundsError(offset, buf.length - (byteLength + 1))\n }\n}\n\nfunction checkIntBI (value, min, max, buf, offset, byteLength) {\n if (value > max || value < min) {\n const n = typeof min === 'bigint' ? 'n' : ''\n let range\n if (byteLength > 3) {\n if (min === 0 || min === BigInt(0)) {\n range = `>= 0${n} and < 2${n} ** ${(byteLength + 1) * 8}${n}`\n } else {\n range = `>= -(2${n} ** ${(byteLength + 1) * 8 - 1}${n}) and < 2 ** ` +\n `${(byteLength + 1) * 8 - 1}${n}`\n }\n } else {\n range = `>= ${min}${n} and <= ${max}${n}`\n }\n throw new errors.ERR_OUT_OF_RANGE('value', range, value)\n }\n checkBounds(buf, offset, byteLength)\n}\n\nfunction validateNumber (value, name) {\n if (typeof value !== 'number') {\n throw new errors.ERR_INVALID_ARG_TYPE(name, 'number', value)\n }\n}\n\nfunction boundsError (value, length, type) {\n if (Math.floor(value) !== value) {\n validateNumber(value, type)\n throw new errors.ERR_OUT_OF_RANGE(type || 'offset', 'an integer', value)\n }\n\n if (length < 0) {\n throw new errors.ERR_BUFFER_OUT_OF_BOUNDS()\n }\n\n throw new errors.ERR_OUT_OF_RANGE(type || 'offset',\n `>= ${type ? 1 : 0} and <= ${length}`,\n value)\n}\n\n// HELPER FUNCTIONS\n// ================\n\nconst INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g\n\nfunction base64clean (str) {\n // Node takes equal signs as end of the Base64 encoding\n str = str.split('=')[0]\n // Node strips out invalid characters like \\n and \\t from the string, base64-js does not\n str = str.trim().replace(INVALID_BASE64_RE, '')\n // Node converts strings with length < 2 to ''\n if (str.length < 2) return ''\n // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not\n while (str.length % 4 !== 0) {\n str = str + '='\n }\n return str\n}\n\nfunction utf8ToBytes (string, units) {\n units = units || Infinity\n let codePoint\n const length = string.length\n let leadSurrogate = null\n const bytes = []\n\n for (let i = 0; i < length; ++i) {\n codePoint = string.charCodeAt(i)\n\n // is surrogate component\n if (codePoint > 0xD7FF && codePoint < 0xE000) {\n // last char was a lead\n if (!leadSurrogate) {\n // no lead yet\n if (codePoint > 0xDBFF) {\n // unexpected trail\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n } else if (i + 1 === length) {\n // unpaired lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n }\n\n // valid lead\n leadSurrogate = codePoint\n\n continue\n }\n\n // 2 leads in a row\n if (codePoint < 0xDC00) {\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n leadSurrogate = codePoint\n continue\n }\n\n // valid surrogate pair\n codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000\n } else if (leadSurrogate) {\n // valid bmp char, but last char was a lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n }\n\n leadSurrogate = null\n\n // encode utf8\n if (codePoint < 0x80) {\n if ((units -= 1) < 0) break\n bytes.push(codePoint)\n } else if (codePoint < 0x800) {\n if ((units -= 2) < 0) break\n bytes.push(\n codePoint >> 0x6 | 0xC0,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x10000) {\n if ((units -= 3) < 0) break\n bytes.push(\n codePoint >> 0xC | 0xE0,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x110000) {\n if ((units -= 4) < 0) break\n bytes.push(\n codePoint >> 0x12 | 0xF0,\n codePoint >> 0xC & 0x3F | 0x80,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else {\n throw new Error('Invalid code point')\n }\n }\n\n return bytes\n}\n\nfunction asciiToBytes (str) {\n const byteArray = []\n for (let i = 0; i < str.length; ++i) {\n // Node's code seems to be doing this and not & 0x7F..\n byteArray.push(str.charCodeAt(i) & 0xFF)\n }\n return byteArray\n}\n\nfunction utf16leToBytes (str, units) {\n let c, hi, lo\n const byteArray = []\n for (let i = 0; i < str.length; ++i) {\n if ((units -= 2) < 0) break\n\n c = str.charCodeAt(i)\n hi = c >> 8\n lo = c % 256\n byteArray.push(lo)\n byteArray.push(hi)\n }\n\n return byteArray\n}\n\nfunction base64ToBytes (str) {\n return base64.toByteArray(base64clean(str))\n}\n\nfunction blitBuffer (src, dst, offset, length) {\n let i\n for (i = 0; i < length; ++i) {\n if ((i + offset >= dst.length) || (i >= src.length)) break\n dst[i + offset] = src[i]\n }\n return i\n}\n\n// ArrayBuffer or Uint8Array objects from other contexts (i.e. iframes) do not pass\n// the `instanceof` check but they should be treated as of that type.\n// See: https://github.com/feross/buffer/issues/166\nfunction isInstance (obj, type) {\n return obj instanceof type ||\n (obj != null && obj.constructor != null && obj.constructor.name != null &&\n obj.constructor.name === type.name)\n}\nfunction numberIsNaN (obj) {\n // For IE11 support\n return obj !== obj // eslint-disable-line no-self-compare\n}\n\n// Create lookup table for `toString('hex')`\n// See: https://github.com/feross/buffer/issues/219\nconst hexSliceLookupTable = (function () {\n const alphabet = '0123456789abcdef'\n const table = new Array(256)\n for (let i = 0; i < 16; ++i) {\n const i16 = i * 16\n for (let j = 0; j < 16; ++j) {\n table[i16 + j] = alphabet[i] + alphabet[j]\n }\n }\n return table\n})()\n\n// Return not function with Error if BigInt not supported\nfunction defineBigIntMethod (fn) {\n return typeof BigInt === 'undefined' ? BufferBigIntNotDefined : fn\n}\n\nfunction BufferBigIntNotDefined () {\n throw new Error('BigInt not supported')\n}\n", "/**\n * @module nostr-crypto-utils\n * @description Core cryptographic utilities for Nostr protocol\n */\n\n// Core types\nexport type {\n NostrEvent,\n UnsignedNostrEvent,\n SignedNostrEvent,\n NostrFilter,\n NostrSubscription,\n PublicKey,\n KeyPair,\n NostrMessageTuple,\n} from './types';\n\n// Event kinds, message types, and NIP-46 types\nexport { NostrEventKind, NostrMessageType, Nip46Method } from './types';\nexport type {\n Nip46Request,\n Nip46Response,\n Nip46Session,\n Nip46SessionInfo,\n BunkerURI,\n BunkerValidationResult,\n} from './types';\n\n// Core crypto functions\nexport {\n generateKeyPair,\n getPublicKey,\n getPublicKeySync,\n validateKeyPair,\n createEvent,\n signEvent,\n finalizeEvent,\n verifySignature,\n encrypt,\n decrypt,\n} from './crypto';\n\n// Validation functions\nexport {\n validateEvent,\n validateEventId,\n validateEventSignature,\n validateSignedEvent,\n validateEventBase,\n validateFilter,\n validateSubscription,\n validateResponse,\n} from './validation';\n\n// Event functions\nexport {\n calculateEventId,\n} from './event';\n\n// NIP-04 encryption\nexport {\n computeSharedSecret,\n encryptMessage,\n decryptMessage,\n} from './nips/nip-04';\n\n// Re-export NIPs\nexport * as nip01 from './nips/nip-01';\nexport * as nip04 from './nips/nip-04';\nexport * as nip19 from './nips/nip-19';\nexport * as nip26 from './nips/nip-26';\nexport * as nip44 from './nips/nip-44';\nexport * as nip46 from './nips/nip-46';\nexport * as nip49 from './nips/nip-49';\n\n// Utils\nexport {\n hexToBytes,\n bytesToHex,\n utf8ToBytes,\n bytesToUtf8,\n} from './utils/encoding';\n", "/**\n * @module types/base\n * @description Core type definitions for Nostr protocol\n */\n\n// Key Types\nexport type PublicKeyHex = string;\nexport type PrivateKeyHex = string;\n\nexport interface PublicKeyDetails {\n /** Public key in hex format */\n hex: string;\n /** NIP-05 identifier */\n nip05: string;\n /** Public key in bytes format */\n bytes: Uint8Array;\n}\n\nexport type PublicKey = PublicKeyHex | PublicKeyDetails;\n\nexport interface KeyPair {\n /** Private key in hex format */\n privateKey: PrivateKeyHex;\n /** Public key details */\n publicKey: PublicKeyDetails;\n}\n\n// Event Types\nexport enum NostrEventKind {\n // NIP-01: Core Protocol\n SET_METADATA = 0,\n TEXT_NOTE = 1,\n RECOMMEND_SERVER = 2,\n CONTACTS = 3,\n ENCRYPTED_DIRECT_MESSAGE = 4,\n EVENT_DELETION = 5,\n REPOST = 6,\n REACTION = 7,\n\n // NIP-28: Public Chat\n CHANNEL_CREATION = 40,\n CHANNEL_METADATA = 41,\n CHANNEL_MESSAGE = 42,\n CHANNEL_HIDE_MESSAGE = 43,\n CHANNEL_MUTE_USER = 44,\n\n // NIP-42: Authentication\n AUTH = 22242,\n AUTH_RESPONSE = 22243\n}\n\n/** Base interface for all Nostr events */\nexport interface BaseNostrEvent {\n /** Event kind as defined in NIPs */\n kind: number;\n /** Content of the event */\n content: string;\n /** Array of tags */\n tags: string[][];\n /** Unix timestamp in seconds */\n created_at: number;\n}\n\n/** Interface for events that haven't been signed yet */\nexport interface UnsignedNostrEvent extends BaseNostrEvent {\n /** Optional public key */\n pubkey?: string;\n}\n\n/** Interface for signed events */\nexport interface SignedNostrEvent extends BaseNostrEvent {\n /** Public key of the event creator */\n pubkey: string;\n /** Event ID (sha256 of the serialized event) */\n id: string;\n /** Schnorr signature of the event ID */\n sig: string;\n}\n\n/** Alias for backward compatibility */\nexport type NostrEvent = SignedNostrEvent;\n\n/** Type for creating new events */\nexport type UnsignedEvent = Omit<NostrEvent, 'id' | 'sig'>;\n\n// Filter Types\nexport interface NostrFilter {\n ids?: string[];\n authors?: string[];\n kinds?: NostrEventKind[];\n since?: number;\n until?: number;\n limit?: number;\n '#e'?: string[];\n '#p'?: string[];\n search?: string;\n /** Support for arbitrary tags (NIP-12) */\n [key: `#${string}`]: string[] | undefined;\n}\n\nexport interface NostrSubscription {\n id: string;\n filters: NostrFilter[];\n}\n\n// Message Types\nexport enum NostrMessageType {\n EVENT = 'EVENT',\n NOTICE = 'NOTICE',\n OK = 'OK',\n EOSE = 'EOSE',\n REQ = 'REQ',\n CLOSE = 'CLOSE',\n AUTH = 'AUTH'\n}\n\nexport interface NostrMessage {\n type: NostrMessageType;\n event?: SignedNostrEvent;\n subscriptionId?: string;\n filters?: NostrFilter[];\n eventId?: string;\n accepted?: boolean;\n message?: string;\n count?: number;\n payload?: string | (string | boolean)[]; \n}\n\nexport interface NostrResponse {\n type: NostrMessageType;\n event?: SignedNostrEvent;\n subscriptionId?: string;\n filters?: NostrFilter[];\n eventId?: string;\n accepted?: boolean;\n message?: string;\n count?: number;\n}\n\n// Utility Types\nexport interface ValidationResult {\n isValid: boolean;\n error?: string;\n}\n\nexport interface NostrError {\n code: string;\n message: string;\n details?: Record<string, unknown>;\n}\n", "/**\n * @module types/nip46\n * @description Type definitions for NIP-46 (Nostr Connect / Remote Signing)\n * @see https://github.com/nostr-protocol/nips/blob/master/46.md\n */\n\n/**\n * NIP-46 remote signing methods\n */\nexport enum Nip46Method {\n CONNECT = 'connect',\n PING = 'ping',\n GET_PUBLIC_KEY = 'get_public_key',\n SIGN_EVENT = 'sign_event',\n NIP04_ENCRYPT = 'nip04_encrypt',\n NIP04_DECRYPT = 'nip04_decrypt',\n NIP44_ENCRYPT = 'nip44_encrypt',\n NIP44_DECRYPT = 'nip44_decrypt',\n GET_RELAYS = 'get_relays',\n}\n\n/**\n * Parsed bunker:// URI\n */\nexport interface BunkerURI {\n /** Remote signer's public key (hex) */\n remotePubkey: string;\n /** Relay URLs for communication */\n relays: string[];\n /** Optional secret for initial connection */\n secret?: string;\n}\n\n/**\n * NIP-46 JSON-RPC request (client -> signer)\n */\nexport interface Nip46Request {\n id: string;\n method: Nip46Method | string;\n params: string[];\n}\n\n/**\n * NIP-46 JSON-RPC response (signer -> client)\n */\nexport interface Nip46Response {\n id: string;\n result?: string;\n error?: string;\n}\n\n/**\n * A NIP-46 session containing the ephemeral keypair and conversation key\n */\nexport interface Nip46Session {\n /** Client's ephemeral private key (hex) */\n clientSecretKey: string;\n /** Client's ephemeral public key (hex) */\n clientPubkey: string;\n /** Remote signer's public key (hex) */\n remotePubkey: string;\n /** NIP-44 conversation key (derived from ECDH) */\n conversationKey: Uint8Array;\n}\n\n/**\n * Public session info (safe to expose; excludes private key and conversation key)\n */\nexport interface Nip46SessionInfo {\n clientPubkey: string;\n remotePubkey: string;\n}\n\n/**\n * Result of validating a bunker:// URI\n */\nexport interface BunkerValidationResult {\n isValid: boolean;\n error?: string;\n uri?: BunkerURI;\n}\n", "/**\n * @module types\n * @description Type definitions for Nostr\n */\n\nexport interface PublicKeyDetails {\n hex: string;\n bytes: Uint8Array;\n}\n\nexport interface KeyPair {\n privateKey: string;\n publicKey: PublicKeyDetails;\n}\n\nexport interface NostrEvent {\n kind: number;\n created_at: number;\n tags: string[][];\n content: string;\n pubkey: string;\n}\n\nexport interface SignedNostrEvent extends NostrEvent {\n id: string;\n sig: string;\n}\n\nexport interface PublicKey {\n hex: string;\n bytes?: Uint8Array;\n}\n\nexport interface ValidationResult {\n isValid: boolean;\n error?: string;\n}\n\nexport enum NostrEventKind {\n SET_METADATA = 0,\n TEXT_NOTE = 1,\n RECOMMEND_SERVER = 2,\n CONTACT_LIST = 3,\n ENCRYPTED_DIRECT_MESSAGE = 4,\n DELETE = 5,\n REPOST = 6,\n REACTION = 7,\n BADGE_AWARD = 8,\n CHANNEL_CREATE = 40,\n CHANNEL_METADATA = 41,\n CHANNEL_MESSAGE = 42,\n CHANNEL_HIDE_MESSAGE = 43,\n CHANNEL_MUTE_USER = 44,\n CHANNEL_RESERVE = 45,\n REPORTING = 1984,\n ZAP_REQUEST = 9734,\n ZAP = 9735,\n MUTE_LIST = 10000,\n PIN_LIST = 10001,\n RELAY_LIST_METADATA = 10002,\n CLIENT_AUTH = 22242,\n AUTH_RESPONSE = 22243,\n NOSTR_CONNECT = 24133,\n CATEGORIZED_PEOPLE = 30000,\n CATEGORIZED_BOOKMARKS = 30001,\n PROFILE_BADGES = 30008,\n BADGE_DEFINITION = 30009,\n LONG_FORM = 30023,\n APPLICATION_SPECIFIC = 30078\n}\n\n/**\n * Re-export all types from base module\n * @packageDocumentation\n */\nexport * from './base';\n\n/** Re-export protocol types */\nexport * from './protocol';\n\n/** Re-export message types */\nexport * from './messages';\n\n/** Re-export type guards */\nexport * from './guards';\n\n// Re-export NIP-19 types\nexport type {\n Nip19DataType\n} from '../nips/nip-19';\n\n/** Re-export NIP-46 types */\nexport * from './nip46';\n", "/**\n * Internal webcrypto alias.\n * We use WebCrypto aka globalThis.crypto, which exists in browsers and node.js 16+.\n * See utils.ts for details.\n * @module\n */\ndeclare const globalThis: Record<string, any> | undefined;\nexport const crypto: any =\n typeof globalThis === 'object' && 'crypto' in globalThis ? globalThis.crypto : undefined;\n", "/**\n * Utilities for hex, bytes, CSPRNG.\n * @module\n */\n/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */\n\n// We use WebCrypto aka globalThis.crypto, which exists in browsers and node.js 16+.\n// node.js versions earlier than v19 don't declare it in global scope.\n// For node.js, package.json#exports field mapping rewrites import\n// from `crypto` to `cryptoNode`, which imports native module.\n// Makes the utils un-importable in browsers without a bundler.\n// Once node.js 18 is deprecated (2025-04-30), we can just drop the import.\nimport { crypto } from '@noble/hashes/crypto';\n\n/** Checks if something is Uint8Array. Be careful: nodejs Buffer will return true. */\nexport function isBytes(a: unknown): a is Uint8Array {\n return a instanceof Uint8Array || (ArrayBuffer.isView(a) && a.constructor.name === 'Uint8Array');\n}\n\n/** Asserts something is positive integer. */\nexport function anumber(n: number): void {\n if (!Number.isSafeInteger(n) || n < 0) throw new Error('positive integer expected, got ' + n);\n}\n\n/** Asserts something is Uint8Array. */\nexport function abytes(b: Uint8Array | undefined, ...lengths: number[]): void {\n if (!isBytes(b)) throw new Error('Uint8Array expected');\n if (lengths.length > 0 && !lengths.includes(b.length))\n throw new Error('Uint8Array expected of length ' + lengths + ', got length=' + b.length);\n}\n\n/** Asserts something is hash */\nexport function ahash(h: IHash): void {\n if (typeof h !== 'function' || typeof h.create !== 'function')\n throw new Error('Hash should be wrapped by utils.createHasher');\n anumber(h.outputLen);\n anumber(h.blockLen);\n}\n\n/** Asserts a hash instance has not been destroyed / finished */\nexport function aexists(instance: any, checkFinished = true): void {\n if (instance.destroyed) throw new Error('Hash instance has been destroyed');\n if (checkFinished && instance.finished) throw new Error('Hash#digest() has already been called');\n}\n\n/** Asserts output is properly-sized byte array */\nexport function aoutput(out: any, instance: any): void {\n abytes(out);\n const min = instance.outputLen;\n if (out.length < min) {\n throw new Error('digestInto() expects output buffer of length at least ' + min);\n }\n}\n\n/** Generic type encompassing 8/16/32-byte arrays - but not 64-byte. */\n// prettier-ignore\nexport type TypedArray = Int8Array | Uint8ClampedArray | Uint8Array |\n Uint16Array | Int16Array | Uint32Array | Int32Array;\n\n/** Cast u8 / u16 / u32 to u8. */\nexport function u8(arr: TypedArray): Uint8Array {\n return new Uint8Array(arr.buffer, arr.byteOffset, arr.byteLength);\n}\n\n/** Cast u8 / u16 / u32 to u32. */\nexport function u32(arr: TypedArray): Uint32Array {\n return new Uint32Array(arr.buffer, arr.byteOffset, Math.floor(arr.byteLength / 4));\n}\n\n/** Zeroize a byte array. Warning: JS provides no guarantees. */\nexport function clean(...arrays: TypedArray[]): void {\n for (let i = 0; i < arrays.length; i++) {\n arrays[i].fill(0);\n }\n}\n\n/** Create DataView of an array for easy byte-level manipulation. */\nexport function createView(arr: TypedArray): DataView {\n return new DataView(arr.buffer, arr.byteOffset, arr.byteLength);\n}\n\n/** The rotate right (circular right shift) operation for uint32 */\nexport function rotr(word: number, shift: number): number {\n return (word << (32 - shift)) | (word >>> shift);\n}\n\n/** The rotate left (circular left shift) operation for uint32 */\nexport function rotl(word: number, shift: number): number {\n return (word << shift) | ((word >>> (32 - shift)) >>> 0);\n}\n\n/** Is current platform little-endian? Most are. Big-Endian platform: IBM */\nexport const isLE: boolean = /* @__PURE__ */ (() =>\n new Uint8Array(new Uint32Array([0x11223344]).buffer)[0] === 0x44)();\n\n/** The byte swap operation for uint32 */\nexport function byteSwap(word: number): number {\n return (\n ((word << 24) & 0xff000000) |\n ((word << 8) & 0xff0000) |\n ((word >>> 8) & 0xff00) |\n ((word >>> 24) & 0xff)\n );\n}\n/** Conditionally byte swap if on a big-endian platform */\nexport const swap8IfBE: (n: number) => number = isLE\n ? (n: number) => n\n : (n: number) => byteSwap(n);\n\n/** @deprecated */\nexport const byteSwapIfBE: typeof swap8IfBE = swap8IfBE;\n/** In place byte swap for Uint32Array */\nexport function byteSwap32(arr: Uint32Array): Uint32Array {\n for (let i = 0; i < arr.length; i++) {\n arr[i] = byteSwap(arr[i]);\n }\n return arr;\n}\n\nexport const swap32IfBE: (u: Uint32Array) => Uint32Array = isLE\n ? (u: Uint32Array) => u\n : byteSwap32;\n\n// Built-in hex conversion https://caniuse.com/mdn-javascript_builtins_uint8array_fromhex\nconst hasHexBuiltin: boolean = /* @__PURE__ */ (() =>\n // @ts-ignore\n typeof Uint8Array.from([]).toHex === 'function' && typeof Uint8Array.fromHex === 'function')();\n\n// Array where index 0xf0 (240) is mapped to string 'f0'\nconst hexes = /* @__PURE__ */ Array.from({ length: 256 }, (_, i) =>\n i.toString(16).padStart(2, '0')\n);\n\n/**\n * Convert byte array to hex string. Uses built-in function, when available.\n * @example bytesToHex(Uint8Array.from([0xca, 0xfe, 0x01, 0x23])) // 'cafe0123'\n */\nexport function bytesToHex(bytes: Uint8Array): string {\n abytes(bytes);\n // @ts-ignore\n if (hasHexBuiltin) return bytes.toHex();\n // pre-caching improves the speed 6x\n let hex = '';\n for (let i = 0; i < bytes.length; i++) {\n hex += hexes[bytes[i]];\n }\n return hex;\n}\n\n// We use optimized technique to convert hex string to byte array\nconst asciis = { _0: 48, _9: 57, A: 65, F: 70, a: 97, f: 102 } as const;\nfunction asciiToBase16(ch: number): number | undefined {\n if (ch >= asciis._0 && ch <= asciis._9) return ch - asciis._0; // '2' => 50-48\n if (ch >= asciis.A && ch <= asciis.F) return ch - (asciis.A - 10); // 'B' => 66-(65-10)\n if (ch >= asciis.a && ch <= asciis.f) return ch - (asciis.a - 10); // 'b' => 98-(97-10)\n return;\n}\n\n/**\n * Convert hex string to byte array. Uses built-in function, when available.\n * @example hexToBytes('cafe0123') // Uint8Array.from([0xca, 0xfe, 0x01, 0x23])\n */\nexport function hexToBytes(hex: string): Uint8Array {\n if (typeof hex !== 'string') throw new Error('hex string expected, got ' + typeof hex);\n // @ts-ignore\n if (hasHexBuiltin) return Uint8Array.fromHex(hex);\n const hl = hex.length;\n const al = hl / 2;\n if (hl % 2) throw new Error('hex string expected, got unpadded hex of length ' + hl);\n const array = new Uint8Array(al);\n for (let ai = 0, hi = 0; ai < al; ai++, hi += 2) {\n const n1 = asciiToBase16(hex.charCodeAt(hi));\n const n2 = asciiToBase16(hex.charCodeAt(hi + 1));\n if (n1 === undefined || n2 === undefined) {\n const char = hex[hi] + hex[hi + 1];\n throw new Error('hex string expected, got non-hex character \"' + char + '\" at index ' + hi);\n }\n array[ai] = n1 * 16 + n2; // multiply first octet, e.g. 'a3' => 10*16+3 => 160 + 3 => 163\n }\n return array;\n}\n\n/**\n * There is no setImmediate in browser and setTimeout is slow.\n * Call of async fn will return Promise, which will be fullfiled only on\n * next scheduler queue processing step and this is exactly what we need.\n */\nexport const nextTick = async (): Promise<void> => {};\n\n/** Returns control to thread each 'tick' ms to avoid blocking. */\nexport async function asyncLoop(\n iters: number,\n tick: number,\n cb: (i: number) => void\n): Promise<void> {\n let ts = Date.now();\n for (let i = 0; i < iters; i++) {\n cb(i);\n // Date.now() is not monotonic, so in case if clock goes backwards we return return control too\n const diff = Date.now() - ts;\n if (diff >= 0 && diff < tick) continue;\n await nextTick();\n ts += diff;\n }\n}\n\n// Global symbols, but ts doesn't see them: https://github.com/microsoft/TypeScript/issues/31535\ndeclare const TextEncoder: any;\ndeclare const TextDecoder: any;\n\n/**\n * Converts string to bytes using UTF8 encoding.\n * @example utf8ToBytes('abc') // Uint8Array.from([97, 98, 99])\n */\nexport function utf8ToBytes(str: string): Uint8Array {\n if (typeof str !== 'string') throw new Error('string expected');\n return new Uint8Array(new TextEncoder().encode(str)); // https://bugzil.la/1681809\n}\n\n/**\n * Converts bytes to string using UTF8 encoding.\n * @example bytesToUtf8(Uint8Array.from([97, 98, 99])) // 'abc'\n */\nexport function bytesToUtf8(bytes: Uint8Array): string {\n return new TextDecoder().decode(bytes);\n}\n\n/** Accepted input of hash functions. Strings are converted to byte arrays. */\nexport type Input = string | Uint8Array;\n/**\n * Normalizes (non-hex) string or Uint8Array to Uint8Array.\n * Warning: when Uint8Array is passed, it would NOT get copied.\n * Keep in mind for future mutable operations.\n */\nexport function toBytes(data: Input): Uint8Array {\n if (typeof data === 'string') data = utf8ToBytes(data);\n abytes(data);\n return data;\n}\n\n/** KDFs can accept string or Uint8Array for user convenience. */\nexport type KDFInput = string | Uint8Array;\n/**\n * Helper for KDFs: consumes uint8array or string.\n * When string is passed, does utf8 decoding, using TextDecoder.\n */\nexport function kdfInputToBytes(data: KDFInput): Uint8Array {\n if (typeof data === 'string') data = utf8ToBytes(data);\n abytes(data);\n return data;\n}\n\n/** Copies several Uint8Arrays into one. */\nexport function concatBytes(...arrays: Uint8Array[]): Uint8Array {\n let sum = 0;\n for (let i = 0; i < arrays.length; i++) {\n const a = arrays[i];\n abytes(a);\n sum += a.length;\n }\n const res = new Uint8Array(sum);\n for (let i = 0, pad = 0; i < arrays.length; i++) {\n const a = arrays[i];\n res.set(a, pad);\n pad += a.length;\n }\n return res;\n}\n\ntype EmptyObj = {};\nexport function checkOpts<T1 extends EmptyObj, T2 extends EmptyObj>(\n defaults: T1,\n opts?: T2\n): T1 & T2 {\n if (opts !== undefined && {}.toString.call(opts) !== '[object Object]')\n throw new Error('options should be object or undefined');\n const merged = Object.assign(defaults, opts);\n return merged as T1 & T2;\n}\n\n/** Hash interface. */\nexport type IHash = {\n (data: Uint8Array): Uint8Array;\n blockLen: number;\n outputLen: number;\n create: any;\n};\n\n/** For runtime check if class implements interface */\nexport abstract class Hash<T extends Hash<T>> {\n abstract blockLen: number; // Bytes per block\n abstract outputLen: number; // Bytes in output\n abstract update(buf: Input): this;\n // Writes digest into buf\n abstract digestInto(buf: Uint8Array): void;\n abstract digest(): Uint8Array;\n /**\n * Resets internal state. Makes Hash instance unusable.\n * Reset is impossible for keyed hashes if key is consumed into state. If digest is not consumed\n * by user, they will need to manually call `destroy()` when zeroing is necessary.\n */\n abstract destroy(): void;\n /**\n * Clones hash instance. Unsafe: doesn't check whether `to` is valid. Can be used as `clone()`\n * when no options are passed.\n * Reasons to use `_cloneInto` instead of clone: 1) performance 2) reuse instance => all internal\n * buffers are overwritten => causes buffer overwrite which is used for digest in some cases.\n * There are no guarantees for clean-up because it's impossible in JS.\n */\n abstract _cloneInto(to?: T): T;\n // Safe version that clones internal state\n abstract clone(): T;\n}\n\n/**\n * XOF: streaming API to read digest in chunks.\n * Same as 'squeeze' in keccak/k12 and 'seek' in blake3, but more generic name.\n * When hash used in XOF mode it is up to user to call '.destroy' afterwards, since we cannot\n * destroy state, next call can require more bytes.\n */\nexport type HashXOF<T extends Hash<T>> = Hash<T> & {\n xof(bytes: number): Uint8Array; // Read 'bytes' bytes from digest stream\n xofInto(buf: Uint8Array): Uint8Array; // read buf.length bytes from digest stream into buf\n};\n\n/** Hash function */\nexport type CHash = ReturnType<typeof createHasher>;\n/** Hash function with output */\nexport type CHashO = ReturnType<typeof createOptHasher>;\n/** XOF with output */\nexport type CHashXO = ReturnType<typeof createXOFer>;\n\n/** Wraps hash function, creating an interface on top of it */\nexport function createHasher<T extends Hash<T>>(\n hashCons: () => Hash<T>\n): {\n (msg: Input): Uint8Array;\n outputLen: number;\n blockLen: number;\n create(): Hash<T>;\n} {\n const hashC = (msg: Input): Uint8Array => hashCons().update(toBytes(msg)).digest();\n const tmp = hashCons();\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = () => hashCons();\n return hashC;\n}\n\nexport function createOptHasher<H extends Hash<H>, T extends Object>(\n hashCons: (opts?: T) => Hash<H>\n): {\n (msg: Input, opts?: T): Uint8Array;\n outputLen: number;\n blockLen: number;\n create(opts?: T): Hash<H>;\n} {\n const hashC = (msg: Input, opts?: T): Uint8Array => hashCons(opts).update(toBytes(msg)).digest();\n const tmp = hashCons({} as T);\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = (opts?: T) => hashCons(opts);\n return hashC;\n}\n\nexport function createXOFer<H extends HashXOF<H>, T extends Object>(\n hashCons: (opts?: T) => HashXOF<H>\n): {\n (msg: Input, opts?: T): Uint8Array;\n outputLen: number;\n blockLen: number;\n create(opts?: T): HashXOF<H>;\n} {\n const hashC = (msg: Input, opts?: T): Uint8Array => hashCons(opts).update(toBytes(msg)).digest();\n const tmp = hashCons({} as T);\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = (opts?: T) => hashCons(opts);\n return hashC;\n}\nexport const wrapConstructor: typeof createHasher = createHasher;\nexport const wrapConstructorWithOpts: typeof createOptHasher = createOptHasher;\nexport const wrapXOFConstructorWithOpts: typeof createXOFer = createXOFer;\n\n/** Cryptographically secure PRNG. Uses internal OS-level `crypto.getRandomValues`. */\nexport function randomBytes(bytesLength = 32): Uint8Array {\n if (crypto && typeof crypto.getRandomValues === 'function') {\n return crypto.getRandomValues(new Uint8Array(bytesLength));\n }\n // Legacy Node.js compatibility\n if (crypto && typeof crypto.randomBytes === 'function') {\n return Uint8Array.from(crypto.randomBytes(bytesLength));\n }\n throw new Error('crypto.getRandomValues must be defined');\n}\n", "/**\n * Internal Merkle-Damgard hash utils.\n * @module\n */\nimport { type Input, Hash, abytes, aexists, aoutput, clean, createView, toBytes } from './utils.ts';\n\n/** Polyfill for Safari 14. https://caniuse.com/mdn-javascript_builtins_dataview_setbiguint64 */\nexport function setBigUint64(\n view: DataView,\n byteOffset: number,\n value: bigint,\n isLE: boolean\n): void {\n if (typeof view.setBigUint64 === 'function') return view.setBigUint64(byteOffset, value, isLE);\n const _32n = BigInt(32);\n const _u32_max = BigInt(0xffffffff);\n const wh = Number((value >> _32n) & _u32_max);\n const wl = Number(value & _u32_max);\n const h = isLE ? 4 : 0;\n const l = isLE ? 0 : 4;\n view.setUint32(byteOffset + h, wh, isLE);\n view.setUint32(byteOffset + l, wl, isLE);\n}\n\n/** Choice: a ? b : c */\nexport function Chi(a: number, b: number, c: number): number {\n return (a & b) ^ (~a & c);\n}\n\n/** Majority function, true if any two inputs is true. */\nexport function Maj(a: number, b: number, c: number): number {\n return (a & b) ^ (a & c) ^ (b & c);\n}\n\n/**\n * Merkle-Damgard hash construction base class.\n * Could be used to create MD5, RIPEMD, SHA1, SHA2.\n */\nexport abstract class HashMD<T extends HashMD<T>> extends Hash<T> {\n protected abstract process(buf: DataView, offset: number): void;\n protected abstract get(): number[];\n protected abstract set(...args: number[]): void;\n abstract destroy(): void;\n protected abstract roundClean(): void;\n\n readonly blockLen: number;\n readonly outputLen: number;\n readonly padOffset: number;\n readonly isLE: boolean;\n\n // For partial updates less than block size\n protected buffer: Uint8Array;\n protected view: DataView;\n protected finished = false;\n protected length = 0;\n protected pos = 0;\n protected destroyed = false;\n\n constructor(blockLen: number, outputLen: number, padOffset: number, isLE: boolean) {\n super();\n this.blockLen = blockLen;\n this.outputLen = outputLen;\n this.padOffset = padOffset;\n this.isLE = isLE;\n this.buffer = new Uint8Array(blockLen);\n this.view = createView(this.buffer);\n }\n update(data: Input): this {\n aexists(this);\n data = toBytes(data);\n abytes(data);\n const { view, buffer, blockLen } = this;\n const len = data.length;\n for (let pos = 0; pos < len; ) {\n const take = Math.min(blockLen - this.pos, len - pos);\n // Fast path: we have at least one block in input, cast it to view and process\n if (take === blockLen) {\n const dataView = createView(data);\n for (; blockLen <= len - pos; pos += blockLen) this.process(dataView, pos);\n continue;\n }\n buffer.set(data.subarray(pos, pos + take), this.pos);\n this.pos += take;\n pos += take;\n if (this.pos === blockLen) {\n this.process(view, 0);\n this.pos = 0;\n }\n }\n this.length += data.length;\n this.roundClean();\n return this;\n }\n digestInto(out: Uint8Array): void {\n aexists(this);\n aoutput(out, this);\n this.finished = true;\n // Padding\n // We can avoid allocation of buffer for padding completely if it\n // was previously not allocated here. But it won't change performance.\n const { buffer, view, blockLen, isLE } = this;\n let { pos } = this;\n // append the bit '1' to the message\n buffer[pos++] = 0b10000000;\n clean(this.buffer.subarray(pos));\n // we have less than padOffset left in buffer, so we cannot put length in\n // current block, need process it and pad again\n if (this.padOffset > blockLen - pos) {\n this.process(view, 0);\n pos = 0;\n }\n // Pad until full block byte with zeros\n for (let i = pos; i < blockLen; i++) buffer[i] = 0;\n // Note: sha512 requires length to be 128bit integer, but length in JS will overflow before that\n // You need to write around 2 exabytes (u64_max / 8 / (1024**6)) for this to happen.\n // So we just write lowest 64 bits of that value.\n setBigUint64(view, blockLen - 8, BigInt(this.length * 8), isLE);\n this.process(view, 0);\n const oview = createView(out);\n const len = this.outputLen;\n // NOTE: we do division by 4 later, which should be fused in single op with modulo by JIT\n if (len % 4) throw new Error('_sha2: outputLen should be aligned to 32bit');\n const outLen = len / 4;\n const state = this.get();\n if (outLen > state.length) throw new Error('_sha2: outputLen bigger than state');\n for (let i = 0; i < outLen; i++) oview.setUint32(4 * i, state[i], isLE);\n }\n digest(): Uint8Array {\n const { buffer, outputLen } = this;\n this.digestInto(buffer);\n const res = buffer.slice(0, outputLen);\n this.destroy();\n return res;\n }\n _cloneInto(to?: T): T {\n to ||= new (this.constructor as any)() as T;\n to.set(...this.get());\n const { blockLen, buffer, length, finished, destroyed, pos } = this;\n to.destroyed = destroyed;\n to.finished = finished;\n to.length = length;\n to.pos = pos;\n if (length % blockLen) to.buffer.set(buffer);\n return to;\n }\n clone(): T {\n return this._cloneInto();\n }\n}\n\n/**\n * Initial SHA-2 state: fractional parts of square roots of first 16 primes 2..53.\n * Check out `test/misc/sha2-gen-iv.js` for recomputation guide.\n */\n\n/** Initial SHA256 state. Bits 0..32 of frac part of sqrt of primes 2..19 */\nexport const SHA256_IV: Uint32Array = /* @__PURE__ */ Uint32Array.from([\n 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19,\n]);\n\n/** Initial SHA224 state. Bits 32..64 of frac part of sqrt of primes 23..53 */\nexport const SHA224_IV: Uint32Array = /* @__PURE__ */ Uint32Array.from([\n 0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4,\n]);\n\n/** Initial SHA384 state. Bits 0..64 of frac part of sqrt of primes 23..53 */\nexport const SHA384_IV: Uint32Array = /* @__PURE__ */ Uint32Array.from([\n 0xcbbb9d5d, 0xc1059ed8, 0x629a292a, 0x367cd507, 0x9159015a, 0x3070dd17, 0x152fecd8, 0xf70e5939,\n 0x67332667, 0xffc00b31, 0x8eb44a87, 0x68581511, 0xdb0c2e0d, 0x64f98fa7, 0x47b5481d, 0xbefa4fa4,\n]);\n\n/** Initial SHA512 state. Bits 0..64 of frac part of sqrt of primes 2..19 */\nexport const SHA512_IV: Uint32Array = /* @__PURE__ */ Uint32Array.from([\n 0x6a09e667, 0xf3bcc908, 0xbb67ae85, 0x84caa73b, 0x3c6ef372, 0xfe94f82b, 0xa54ff53a, 0x5f1d36f1,\n 0x510e527f, 0xade682d1, 0x9b05688c, 0x2b3e6c1f, 0x1f83d9ab, 0xfb41bd6b, 0x5be0cd19, 0x137e2179,\n]);\n", "/**\n * SHA2 hash function. A.k.a. sha256, sha384, sha512, sha512_224, sha512_256.\n * SHA256 is the fastest hash implementable in JS, even faster than Blake3.\n * Check out [RFC 4634](https://datatracker.ietf.org/doc/html/rfc4634) and\n * [FIPS 180-4](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf).\n * @module\n */\nimport { Chi, HashMD, Maj, SHA224_IV, SHA256_IV, SHA384_IV, SHA512_IV } from './_md.ts';\nimport * as u64 from './_u64.ts';\nimport { type CHash, clean, createHasher, rotr } from './utils.ts';\n\n/**\n * Round constants:\n * First 32 bits of fractional parts of the cube roots of the first 64 primes 2..311)\n */\n// prettier-ignore\nconst SHA256_K = /* @__PURE__ */ Uint32Array.from([\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2\n]);\n\n/** Reusable temporary buffer. \"W\" comes straight from spec. */\nconst SHA256_W = /* @__PURE__ */ new Uint32Array(64);\nexport class SHA256 extends HashMD<SHA256> {\n // We cannot use array here since array allows indexing by variable\n // which means optimizer/compiler cannot use registers.\n protected A: number = SHA256_IV[0] | 0;\n protected B: number = SHA256_IV[1] | 0;\n protected C: number = SHA256_IV[2] | 0;\n protected D: number = SHA256_IV[3] | 0;\n protected E: number = SHA256_IV[4] | 0;\n protected F: number = SHA256_IV[5] | 0;\n protected G: number = SHA256_IV[6] | 0;\n protected H: number = SHA256_IV[7] | 0;\n\n constructor(outputLen: number = 32) {\n super(64, outputLen, 8, false);\n }\n protected get(): [number, number, number, number, number, number, number, number] {\n const { A, B, C, D, E, F, G, H } = this;\n return [A, B, C, D, E, F, G, H];\n }\n // prettier-ignore\n protected set(\n A: number, B: number, C: number, D: number, E: number, F: number, G: number, H: number\n ): void {\n this.A = A | 0;\n this.B = B | 0;\n this.C = C | 0;\n this.D = D | 0;\n this.E = E | 0;\n this.F = F | 0;\n this.G = G | 0;\n this.H = H | 0;\n }\n protected process(view: DataView, offset: number): void {\n // Extend the first 16 words into the remaining 48 words w[16..63] of the message schedule array\n for (let i = 0; i < 16; i++, offset += 4) SHA256_W[i] = view.getUint32(offset, false);\n for (let i = 16; i < 64; i++) {\n const W15 = SHA256_W[i - 15];\n const W2 = SHA256_W[i - 2];\n const s0 = rotr(W15, 7) ^ rotr(W15, 18) ^ (W15 >>> 3);\n const s1 = rotr(W2, 17) ^ rotr(W2, 19) ^ (W2 >>> 10);\n SHA256_W[i] = (s1 + SHA256_W[i - 7] + s0 + SHA256_W[i - 16]) | 0;\n }\n // Compression function main loop, 64 rounds\n let { A, B, C, D, E, F, G, H } = this;\n for (let i = 0; i < 64; i++) {\n const sigma1 = rotr(E, 6) ^ rotr(E, 11) ^ rotr(E, 25);\n const T1 = (H + sigma1 + Chi(E, F, G) + SHA256_K[i] + SHA256_W[i]) | 0;\n const sigma0 = rotr(A, 2) ^ rotr(A, 13) ^ rotr(A, 22);\n const T2 = (sigma0 + Maj(A, B, C)) | 0;\n H = G;\n G = F;\n F = E;\n E = (D + T1) | 0;\n D = C;\n C = B;\n B = A;\n A = (T1 + T2) | 0;\n }\n // Add the compressed chunk to the current hash value\n A = (A + this.A) | 0;\n B = (B + this.B) | 0;\n C = (C + this.C) | 0;\n D = (D + this.D) | 0;\n E = (E + this.E) | 0;\n F = (F + this.F) | 0;\n G = (G + this.G) | 0;\n H = (H + this.H) | 0;\n this.set(A, B, C, D, E, F, G, H);\n }\n protected roundClean(): void {\n clean(SHA256_W);\n }\n destroy(): void {\n this.set(0, 0, 0, 0, 0, 0, 0, 0);\n clean(this.buffer);\n }\n}\n\nexport class SHA224 extends SHA256 {\n protected A: number = SHA224_IV[0] | 0;\n protected B: number = SHA224_IV[1] | 0;\n protected C: number = SHA224_IV[2] | 0;\n protected D: number = SHA224_IV[3] | 0;\n protected E: number = SHA224_IV[4] | 0;\n protected F: number = SHA224_IV[5] | 0;\n protected G: number = SHA224_IV[6] | 0;\n protected H: number = SHA224_IV[7] | 0;\n constructor() {\n super(28);\n }\n}\n\n// SHA2-512 is slower than sha256 in js because u64 operations are slow.\n\n// Round contants\n// First 32 bits of the fractional parts of the cube roots of the first 80 primes 2..409\n// prettier-ignore\nconst K512 = /* @__PURE__ */ (() => u64.split([\n '0x428a2f98d728ae22', '0x7137449123ef65cd', '0xb5c0fbcfec4d3b2f', '0xe9b5dba58189dbbc',\n '0x3956c25bf348b538', '0x59f111f1b605d019', '0x923f82a4af194f9b', '0xab1c5ed5da6d8118',\n '0xd807aa98a3030242', '0x12835b0145706fbe', '0x243185be4ee4b28c', '0x550c7dc3d5ffb4e2',\n '0x72be5d74f27b896f', '0x80deb1fe3b1696b1', '0x9bdc06a725c71235', '0xc19bf174cf692694',\n '0xe49b69c19ef14ad2', '0xefbe4786384f25e3', '0x0fc19dc68b8cd5b5', '0x240ca1cc77ac9c65',\n '0x2de92c6f592b0275', '0x4a7484aa6ea6e483', '0x5cb0a9dcbd41fbd4', '0x76f988da831153b5',\n '0x983e5152ee66dfab', '0xa831c66d2db43210', '0xb00327c898fb213f', '0xbf597fc7beef0ee4',\n '0xc6e00bf33da88fc2', '0xd5a79147930aa725', '0x06ca6351e003826f', '0x142929670a0e6e70',\n '0x27b70a8546d22ffc', '0x2e1b21385c26c926', '0x4d2c6dfc5ac42aed', '0x53380d139d95b3df',\n '0x650a73548baf63de', '0x766a0abb3c77b2a8', '0x81c2c92e47edaee6', '0x92722c851482353b',\n '0xa2bfe8a14cf10364', '0xa81a664bbc423001', '0xc24b8b70d0f89791', '0xc76c51a30654be30',\n '0xd192e819d6ef5218', '0xd69906245565a910', '0xf40e35855771202a', '0x106aa07032bbd1b8',\n '0x19a4c116b8d2d0c8', '0x1e376c085141ab53', '0x2748774cdf8eeb99', '0x34b0bcb5e19b48a8',\n '0x391c0cb3c5c95a63', '0x4ed8aa4ae3418acb', '0x5b9cca4f7763e373', '0x682e6ff3d6b2b8a3',\n '0x748f82ee5defb2fc', '0x78a5636f43172f60', '0x84c87814a1f0ab72', '0x8cc702081a6439ec',\n '0x90befffa23631e28', '0xa4506cebde82bde9', '0xbef9a3f7b2c67915', '0xc67178f2e372532b',\n '0xca273eceea26619c', '0xd186b8c721c0c207', '0xeada7dd6cde0eb1e', '0xf57d4f7fee6ed178',\n '0x06f067aa72176fba', '0x0a637dc5a2c898a6', '0x113f9804bef90dae', '0x1b710b35131c471b',\n '0x28db77f523047d84', '0x32caab7b40c72493', '0x3c9ebe0a15c9bebc', '0x431d67c49c100d4c',\n '0x4cc5d4becb3e42b6', '0x597f299cfc657e2a', '0x5fcb6fab3ad6faec', '0x6c44198c4a475817'\n].map(n => BigInt(n))))();\nconst SHA512_Kh = /* @__PURE__ */ (() => K512[0])();\nconst SHA512_Kl = /* @__PURE__ */ (() => K512[1])();\n\n// Reusable temporary buffers\nconst SHA512_W_H = /* @__PURE__ */ new Uint32Array(80);\nconst SHA512_W_L = /* @__PURE__ */ new Uint32Array(80);\n\nexport class SHA512 extends HashMD<SHA512> {\n // We cannot use array here since array allows indexing by variable\n // which means optimizer/compiler cannot use registers.\n // h -- high 32 bits, l -- low 32 bits\n protected Ah: number = SHA512_IV[0] | 0;\n protected Al: number = SHA512_IV[1] | 0;\n protected Bh: number = SHA512_IV[2] | 0;\n protected Bl: number = SHA512_IV[3] | 0;\n protected Ch: number = SHA512_IV[4] | 0;\n protected Cl: number = SHA512_IV[5] | 0;\n protected Dh: number = SHA512_IV[6] | 0;\n protected Dl: number = SHA512_IV[7] | 0;\n protected Eh: number = SHA512_IV[8] | 0;\n protected El: number = SHA512_IV[9] | 0;\n protected Fh: number = SHA512_IV[10] | 0;\n protected Fl: number = SHA512_IV[11] | 0;\n protected Gh: number = SHA512_IV[12] | 0;\n protected Gl: number = SHA512_IV[13] | 0;\n protected Hh: number = SHA512_IV[14] | 0;\n protected Hl: number = SHA512_IV[15] | 0;\n\n constructor(outputLen: number = 64) {\n super(128, outputLen, 16, false);\n }\n // prettier-ignore\n protected get(): [\n number, number, number, number, number, number, number, number,\n number, number, number, number, number, number, number, number\n ] {\n const { Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl } = this;\n return [Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl];\n }\n // prettier-ignore\n protected set(\n Ah: number, Al: number, Bh: number, Bl: number, Ch: number, Cl: number, Dh: number, Dl: number,\n Eh: number, El: number, Fh: number, Fl: number, Gh: number, Gl: number, Hh: number, Hl: number\n ): void {\n this.Ah = Ah | 0;\n this.Al = Al | 0;\n this.Bh = Bh | 0;\n this.Bl = Bl | 0;\n this.Ch = Ch | 0;\n this.Cl = Cl | 0;\n this.Dh = Dh | 0;\n this.Dl = Dl | 0;\n this.Eh = Eh | 0;\n this.El = El | 0;\n this.Fh = Fh | 0;\n this.Fl = Fl | 0;\n this.Gh = Gh | 0;\n this.Gl = Gl | 0;\n this.Hh = Hh | 0;\n this.Hl = Hl | 0;\n }\n protected process(view: DataView, offset: number): void {\n // Extend the first 16 words into the remaining 64 words w[16..79] of the message schedule array\n for (let i = 0; i < 16; i++, offset += 4) {\n SHA512_W_H[i] = view.getUint32(offset);\n SHA512_W_L[i] = view.getUint32((offset += 4));\n }\n for (let i = 16; i < 80; i++) {\n // s0 := (w[i-15] rightrotate 1) xor (w[i-15] rightrotate 8) xor (w[i-15] rightshift 7)\n const W15h = SHA512_W_H[i - 15] | 0;\n const W15l = SHA512_W_L[i - 15] | 0;\n const s0h = u64.rotrSH(W15h, W15l, 1) ^ u64.rotrSH(W15h, W15l, 8) ^ u64.shrSH(W15h, W15l, 7);\n const s0l = u64.rotrSL(W15h, W15l, 1) ^ u64.rotrSL(W15h, W15l, 8) ^ u64.shrSL(W15h, W15l, 7);\n // s1 := (w[i-2] rightrotate 19) xor (w[i-2] rightrotate 61) xor (w[i-2] rightshift 6)\n const W2h = SHA512_W_H[i - 2] | 0;\n const W2l = SHA512_W_L[i - 2] | 0;\n const s1h = u64.rotrSH(W2h, W2l, 19) ^ u64.rotrBH(W2h, W2l, 61) ^ u64.shrSH(W2h, W2l, 6);\n const s1l = u64.rotrSL(W2h, W2l, 19) ^ u64.rotrBL(W2h, W2l, 61) ^ u64.shrSL(W2h, W2l, 6);\n // SHA256_W[i] = s0 + s1 + SHA256_W[i - 7] + SHA256_W[i - 16];\n const SUMl = u64.add4L(s0l, s1l, SHA512_W_L[i - 7], SHA512_W_L[i - 16]);\n const SUMh = u64.add4H(SUMl, s0h, s1h, SHA512_W_H[i - 7], SHA512_W_H[i - 16]);\n SHA512_W_H[i] = SUMh | 0;\n SHA512_W_L[i] = SUMl | 0;\n }\n let { Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl } = this;\n // Compression function main loop, 80 rounds\n for (let i = 0; i < 80; i++) {\n // S1 := (e rightrotate 14) xor (e rightrotate 18) xor (e rightrotate 41)\n const sigma1h = u64.rotrSH(Eh, El, 14) ^ u64.rotrSH(Eh, El, 18) ^ u64.rotrBH(Eh, El, 41);\n const sigma1l = u64.rotrSL(Eh, El, 14) ^ u64.rotrSL(Eh, El, 18) ^ u64.rotrBL(Eh, El, 41);\n //const T1 = (H + sigma1 + Chi(E, F, G) + SHA256_K[i] + SHA256_W[i]) | 0;\n const CHIh = (Eh & Fh) ^ (~Eh & Gh);\n const CHIl = (El & Fl) ^ (~El & Gl);\n // T1 = H + sigma1 + Chi(E, F, G) + SHA512_K[i] + SHA512_W[i]\n // prettier-ignore\n const T1ll = u64.add5L(Hl, sigma1l, CHIl, SHA512_Kl[i], SHA512_W_L[i]);\n const T1h = u64.add5H(T1ll, Hh, sigma1h, CHIh, SHA512_Kh[i], SHA512_W_H[i]);\n const T1l = T1ll | 0;\n // S0 := (a rightrotate 28) xor (a rightrotate 34) xor (a rightrotate 39)\n const sigma0h = u64.rotrSH(Ah, Al, 28) ^ u64.rotrBH(Ah, Al, 34) ^ u64.rotrBH(Ah, Al, 39);\n const sigma0l = u64.rotrSL(Ah, Al, 28) ^ u64.rotrBL(Ah, Al, 34) ^ u64.rotrBL(Ah, Al, 39);\n const MAJh = (Ah & Bh) ^ (Ah & Ch) ^ (Bh & Ch);\n const MAJl = (Al & Bl) ^ (Al & Cl) ^ (Bl & Cl);\n Hh = Gh | 0;\n Hl = Gl | 0;\n Gh = Fh | 0;\n Gl = Fl | 0;\n Fh = Eh | 0;\n Fl = El | 0;\n ({ h: Eh, l: El } = u64.add(Dh | 0, Dl | 0, T1h | 0, T1l | 0));\n Dh = Ch | 0;\n Dl = Cl | 0;\n Ch = Bh | 0;\n Cl = Bl | 0;\n Bh = Ah | 0;\n Bl = Al | 0;\n const All = u64.add3L(T1l, sigma0l, MAJl);\n Ah = u64.add3H(All, T1h, sigma0h, MAJh);\n Al = All | 0;\n }\n // Add the compressed chunk to the current hash value\n ({ h: Ah, l: Al } = u64.add(this.Ah | 0, this.Al | 0, Ah | 0, Al | 0));\n ({ h: Bh, l: Bl } = u64.add(this.Bh | 0, this.Bl | 0, Bh | 0, Bl | 0));\n ({ h: Ch, l: Cl } = u64.add(this.Ch | 0, this.Cl | 0, Ch | 0, Cl | 0));\n ({ h: Dh, l: Dl } = u64.add(this.Dh | 0, this.Dl | 0, Dh | 0, Dl | 0));\n ({ h: Eh, l: El } = u64.add(this.Eh | 0, this.El | 0, Eh | 0, El | 0));\n ({ h: Fh, l: Fl } = u64.add(this.Fh | 0, this.Fl | 0, Fh | 0, Fl | 0));\n ({ h: Gh, l: Gl } = u64.add(this.Gh | 0, this.Gl | 0, Gh | 0, Gl | 0));\n ({ h: Hh, l: Hl } = u64.add(this.Hh | 0, this.Hl | 0, Hh | 0, Hl | 0));\n this.set(Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl);\n }\n protected roundClean(): void {\n clean(SHA512_W_H, SHA512_W_L);\n }\n destroy(): void {\n clean(this.buffer);\n this.set(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);\n }\n}\n\nexport class SHA384 extends SHA512 {\n protected Ah: number = SHA384_IV[0] | 0;\n protected Al: number = SHA384_IV[1] | 0;\n protected Bh: number = SHA384_IV[2] | 0;\n protected Bl: number = SHA384_IV[3] | 0;\n protected Ch: number = SHA384_IV[4] | 0;\n protected Cl: number = SHA384_IV[5] | 0;\n protected Dh: number = SHA384_IV[6] | 0;\n protected Dl: number = SHA384_IV[7] | 0;\n protected Eh: number = SHA384_IV[8] | 0;\n protected El: number = SHA384_IV[9] | 0;\n protected Fh: number = SHA384_IV[10] | 0;\n protected Fl: number = SHA384_IV[11] | 0;\n protected Gh: number = SHA384_IV[12] | 0;\n protected Gl: number = SHA384_IV[13] | 0;\n protected Hh: number = SHA384_IV[14] | 0;\n protected Hl: number = SHA384_IV[15] | 0;\n\n constructor() {\n super(48);\n }\n}\n\n/**\n * Truncated SHA512/256 and SHA512/224.\n * SHA512_IV is XORed with 0xa5a5a5a5a5a5a5a5, then used as \"intermediary\" IV of SHA512/t.\n * Then t hashes string to produce result IV.\n * See `test/misc/sha2-gen-iv.js`.\n */\n\n/** SHA512/224 IV */\nconst T224_IV = /* @__PURE__ */ Uint32Array.from([\n 0x8c3d37c8, 0x19544da2, 0x73e19966, 0x89dcd4d6, 0x1dfab7ae, 0x32ff9c82, 0x679dd514, 0x582f9fcf,\n 0x0f6d2b69, 0x7bd44da8, 0x77e36f73, 0x04c48942, 0x3f9d85a8, 0x6a1d36c8, 0x1112e6ad, 0x91d692a1,\n]);\n\n/** SHA512/256 IV */\nconst T256_IV = /* @__PURE__ */ Uint32Array.from([\n 0x22312194, 0xfc2bf72c, 0x9f555fa3, 0xc84c64c2, 0x2393b86b, 0x6f53b151, 0x96387719, 0x5940eabd,\n 0x96283ee2, 0xa88effe3, 0xbe5e1e25, 0x53863992, 0x2b0199fc, 0x2c85b8aa, 0x0eb72ddc, 0x81c52ca2,\n]);\n\nexport class SHA512_224 extends SHA512 {\n protected Ah: number = T224_IV[0] | 0;\n protected Al: number = T224_IV[1] | 0;\n protected Bh: number = T224_IV[2] | 0;\n protected Bl: number = T224_IV[3] | 0;\n protected Ch: number = T224_IV[4] | 0;\n protected Cl: number = T224_IV[5] | 0;\n protected Dh: number = T224_IV[6] | 0;\n protected Dl: number = T224_IV[7] | 0;\n protected Eh: number = T224_IV[8] | 0;\n protected El: number = T224_IV[9] | 0;\n protected Fh: number = T224_IV[10] | 0;\n protected Fl: number = T224_IV[11] | 0;\n protected Gh: number = T224_IV[12] | 0;\n protected Gl: number = T224_IV[13] | 0;\n protected Hh: number = T224_IV[14] | 0;\n protected Hl: number = T224_IV[15] | 0;\n\n constructor() {\n super(28);\n }\n}\n\nexport class SHA512_256 extends SHA512 {\n protected Ah: number = T256_IV[0] | 0;\n protected Al: number = T256_IV[1] | 0;\n protected Bh: number = T256_IV[2] | 0;\n protected Bl: number = T256_IV[3] | 0;\n protected Ch: number = T256_IV[4] | 0;\n protected Cl: number = T256_IV[5] | 0;\n protected Dh: number = T256_IV[6] | 0;\n protected Dl: number = T256_IV[7] | 0;\n protected Eh: number = T256_IV[8] | 0;\n protected El: number = T256_IV[9] | 0;\n protected Fh: number = T256_IV[10] | 0;\n protected Fl: number = T256_IV[11] | 0;\n protected Gh: number = T256_IV[12] | 0;\n protected Gl: number = T256_IV[13] | 0;\n protected Hh: number = T256_IV[14] | 0;\n protected Hl: number = T256_IV[15] | 0;\n\n constructor() {\n super(32);\n }\n}\n\n/**\n * SHA2-256 hash function from RFC 4634.\n *\n * It is the fastest JS hash, even faster than Blake3.\n * To break sha256 using birthday attack, attackers need to try 2^128 hashes.\n * BTC network is doing 2^70 hashes/sec (2^95 hashes/year) as per 2025.\n */\nexport const sha256: CHash = /* @__PURE__ */ createHasher(() => new SHA256());\n/** SHA2-224 hash function from RFC 4634 */\nexport const sha224: CHash = /* @__PURE__ */ createHasher(() => new SHA224());\n\n/** SHA2-512 hash function from RFC 4634. */\nexport const sha512: CHash = /* @__PURE__ */ createHasher(() => new SHA512());\n/** SHA2-384 hash function from RFC 4634. */\nexport const sha384: CHash = /* @__PURE__ */ createHasher(() => new SHA384());\n\n/**\n * SHA2-512/256 \"truncated\" hash function, with improved resistance to length extension attacks.\n * See the paper on [truncated SHA512](https://eprint.iacr.org/2010/548.pdf).\n */\nexport const sha512_256: CHash = /* @__PURE__ */ createHasher(() => new SHA512_256());\n/**\n * SHA2-512/224 \"truncated\" hash function, with improved resistance to length extension attacks.\n * See the paper on [truncated SHA512](https://eprint.iacr.org/2010/548.pdf).\n */\nexport const sha512_224: CHash = /* @__PURE__ */ createHasher(() => new SHA512_224());\n", "/**\n * HMAC: RFC2104 message authentication code.\n * @module\n */\nimport { abytes, aexists, ahash, clean, Hash, toBytes, type CHash, type Input } from './utils.ts';\n\nexport class HMAC<T extends Hash<T>> extends Hash<HMAC<T>> {\n oHash: T;\n iHash: T;\n blockLen: number;\n outputLen: number;\n private finished = false;\n private destroyed = false;\n\n constructor(hash: CHash, _key: Input) {\n super();\n ahash(hash);\n const key = toBytes(_key);\n this.iHash = hash.create() as T;\n if (typeof this.iHash.update !== 'function')\n throw new Error('Expected instance of class which extends utils.Hash');\n this.blockLen = this.iHash.blockLen;\n this.outputLen = this.iHash.outputLen;\n const blockLen = this.blockLen;\n const pad = new Uint8Array(blockLen);\n // blockLen can be bigger than outputLen\n pad.set(key.length > blockLen ? hash.create().update(key).digest() : key);\n for (let i = 0; i < pad.length; i++) pad[i] ^= 0x36;\n this.iHash.update(pad);\n // By doing update (processing of first block) of outer hash here we can re-use it between multiple calls via clone\n this.oHash = hash.create() as T;\n // Undo internal XOR && apply outer XOR\n for (let i = 0; i < pad.length; i++) pad[i] ^= 0x36 ^ 0x5c;\n this.oHash.update(pad);\n clean(pad);\n }\n update(buf: Input): this {\n aexists(this);\n this.iHash.update(buf);\n return this;\n }\n digestInto(out: Uint8Array): void {\n aexists(this);\n abytes(out, this.outputLen);\n this.finished = true;\n this.iHash.digestInto(out);\n this.oHash.update(out);\n this.oHash.digestInto(out);\n this.destroy();\n }\n digest(): Uint8Array {\n const out = new Uint8Array(this.oHash.outputLen);\n this.digestInto(out);\n return out;\n }\n _cloneInto(to?: HMAC<T>): HMAC<T> {\n // Create new instance without calling constructor since key already in state and we don't know it.\n to ||= Object.create(Object.getPrototypeOf(this), {});\n const { oHash, iHash, finished, destroyed, blockLen, outputLen } = this;\n to = to as this;\n to.finished = finished;\n to.destroyed = destroyed;\n to.blockLen = blockLen;\n to.outputLen = outputLen;\n to.oHash = oHash._cloneInto(to.oHash);\n to.iHash = iHash._cloneInto(to.iHash);\n return to;\n }\n clone(): HMAC<T> {\n return this._cloneInto();\n }\n destroy(): void {\n this.destroyed = true;\n this.oHash.destroy();\n this.iHash.destroy();\n }\n}\n\n/**\n * HMAC: RFC2104 message authentication code.\n * @param hash - function that would be used e.g. sha256\n * @param key - message key\n * @param message - message data\n * @example\n * import { hmac } from '@noble/hashes/hmac';\n * import { sha256 } from '@noble/hashes/sha2';\n * const mac1 = hmac(sha256, 'key', 'message');\n */\nexport const hmac: {\n (hash: CHash, key: Input, message: Input): Uint8Array;\n create(hash: CHash, key: Input): HMAC<any>;\n} = (hash: CHash, key: Input, message: Input): Uint8Array =>\n new HMAC<any>(hash, key).update(message).digest();\nhmac.create = (hash: CHash, key: Input) => new HMAC<any>(hash, key);\n", "/**\n * Hex, bytes and number utilities.\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport {\n abytes as abytes_,\n bytesToHex as bytesToHex_,\n concatBytes as concatBytes_,\n hexToBytes as hexToBytes_,\n isBytes as isBytes_,\n} from '@noble/hashes/utils.js';\nexport {\n abytes,\n anumber,\n bytesToHex,\n bytesToUtf8,\n concatBytes,\n hexToBytes,\n isBytes,\n randomBytes,\n utf8ToBytes,\n} from '@noble/hashes/utils.js';\nconst _0n = /* @__PURE__ */ BigInt(0);\nconst _1n = /* @__PURE__ */ BigInt(1);\nexport type Hex = Uint8Array | string; // hex strings are accepted for simplicity\nexport type PrivKey = Hex | bigint; // bigints are accepted to ease learning curve\nexport type CHash = {\n (message: Uint8Array | string): Uint8Array;\n blockLen: number;\n outputLen: number;\n create(opts?: { dkLen?: number }): any; // For shake\n};\nexport type FHash = (message: Uint8Array | string) => Uint8Array;\n\nexport function abool(title: string, value: boolean): void {\n if (typeof value !== 'boolean') throw new Error(title + ' boolean expected, got ' + value);\n}\n\n// tmp name until v2\nexport function _abool2(value: boolean, title: string = ''): boolean {\n if (typeof value !== 'boolean') {\n const prefix = title && `\"${title}\"`;\n throw new Error(prefix + 'expected boolean, got type=' + typeof value);\n }\n return value;\n}\n\n// tmp name until v2\n/** Asserts something is Uint8Array. */\nexport function _abytes2(value: Uint8Array, length?: number, title: string = ''): Uint8Array {\n const bytes = isBytes_(value);\n const len = value?.length;\n const needsLen = length !== undefined;\n if (!bytes || (needsLen && len !== length)) {\n const prefix = title && `\"${title}\" `;\n const ofLen = needsLen ? ` of length ${length}` : '';\n const got = bytes ? `length=${len}` : `type=${typeof value}`;\n throw new Error(prefix + 'expected Uint8Array' + ofLen + ', got ' + got);\n }\n return value;\n}\n\n// Used in weierstrass, der\nexport function numberToHexUnpadded(num: number | bigint): string {\n const hex = num.toString(16);\n return hex.length & 1 ? '0' + hex : hex;\n}\n\nexport function hexToNumber(hex: string): bigint {\n if (typeof hex !== 'string') throw new Error('hex string expected, got ' + typeof hex);\n return hex === '' ? _0n : BigInt('0x' + hex); // Big Endian\n}\n\n// BE: Big Endian, LE: Little Endian\nexport function bytesToNumberBE(bytes: Uint8Array): bigint {\n return hexToNumber(bytesToHex_(bytes));\n}\nexport function bytesToNumberLE(bytes: Uint8Array): bigint {\n abytes_(bytes);\n return hexToNumber(bytesToHex_(Uint8Array.from(bytes).reverse()));\n}\n\nexport function numberToBytesBE(n: number | bigint, len: number): Uint8Array {\n return hexToBytes_(n.toString(16).padStart(len * 2, '0'));\n}\nexport function numberToBytesLE(n: number | bigint, len: number): Uint8Array {\n return numberToBytesBE(n, len).reverse();\n}\n// Unpadded, rarely used\nexport function numberToVarBytesBE(n: number | bigint): Uint8Array {\n return hexToBytes_(numberToHexUnpadded(n));\n}\n\n/**\n * Takes hex string or Uint8Array, converts to Uint8Array.\n * Validates output length.\n * Will throw error for other types.\n * @param title descriptive title for an error e.g. 'secret key'\n * @param hex hex string or Uint8Array\n * @param expectedLength optional, will compare to result array's length\n * @returns\n */\nexport function ensureBytes(title: string, hex: Hex, expectedLength?: number): Uint8Array {\n let res: Uint8Array;\n if (typeof hex === 'string') {\n try {\n res = hexToBytes_(hex);\n } catch (e) {\n throw new Error(title + ' must be hex string or Uint8Array, cause: ' + e);\n }\n } else if (isBytes_(hex)) {\n // Uint8Array.from() instead of hash.slice() because node.js Buffer\n // is instance of Uint8Array, and its slice() creates **mutable** copy\n res = Uint8Array.from(hex);\n } else {\n throw new Error(title + ' must be hex string or Uint8Array');\n }\n const len = res.length;\n if (typeof expectedLength === 'number' && len !== expectedLength)\n throw new Error(title + ' of length ' + expectedLength + ' expected, got ' + len);\n return res;\n}\n\n// Compares 2 u8a-s in kinda constant time\nexport function equalBytes(a: Uint8Array, b: Uint8Array): boolean {\n if (a.length !== b.length) return false;\n let diff = 0;\n for (let i = 0; i < a.length; i++) diff |= a[i] ^ b[i];\n return diff === 0;\n}\n/**\n * Copies Uint8Array. We can't use u8a.slice(), because u8a can be Buffer,\n * and Buffer#slice creates mutable copy. Never use Buffers!\n */\nexport function copyBytes(bytes: Uint8Array): Uint8Array {\n return Uint8Array.from(bytes);\n}\n\n/**\n * Decodes 7-bit ASCII string to Uint8Array, throws on non-ascii symbols\n * Should be safe to use for things expected to be ASCII.\n * Returns exact same result as utf8ToBytes for ASCII or throws.\n */\nexport function asciiToBytes(ascii: string): Uint8Array {\n return Uint8Array.from(ascii, (c, i) => {\n const charCode = c.charCodeAt(0);\n if (c.length !== 1 || charCode > 127) {\n throw new Error(\n `string contains non-ASCII character \"${ascii[i]}\" with code ${charCode} at position ${i}`\n );\n }\n return charCode;\n });\n}\n\n/**\n * @example utf8ToBytes('abc') // new Uint8Array([97, 98, 99])\n */\n// export const utf8ToBytes: typeof utf8ToBytes_ = utf8ToBytes_;\n/**\n * Converts bytes to string using UTF8 encoding.\n * @example bytesToUtf8(Uint8Array.from([97, 98, 99])) // 'abc'\n */\n// export const bytesToUtf8: typeof bytesToUtf8_ = bytesToUtf8_;\n\n// Is positive bigint\nconst isPosBig = (n: bigint) => typeof n === 'bigint' && _0n <= n;\n\nexport function inRange(n: bigint, min: bigint, max: bigint): boolean {\n return isPosBig(n) && isPosBig(min) && isPosBig(max) && min <= n && n < max;\n}\n\n/**\n * Asserts min <= n < max. NOTE: It's < max and not <= max.\n * @example\n * aInRange('x', x, 1n, 256n); // would assume x is in (1n..255n)\n */\nexport function aInRange(title: string, n: bigint, min: bigint, max: bigint): void {\n // Why min <= n < max and not a (min < n < max) OR b (min <= n <= max)?\n // consider P=256n, min=0n, max=P\n // - a for min=0 would require -1: `inRange('x', x, -1n, P)`\n // - b would commonly require subtraction: `inRange('x', x, 0n, P - 1n)`\n // - our way is the cleanest: `inRange('x', x, 0n, P)\n if (!inRange(n, min, max))\n throw new Error('expected valid ' + title + ': ' + min + ' <= n < ' + max + ', got ' + n);\n}\n\n// Bit operations\n\n/**\n * Calculates amount of bits in a bigint.\n * Same as `n.toString(2).length`\n * TODO: merge with nLength in modular\n */\nexport function bitLen(n: bigint): number {\n let len;\n for (len = 0; n > _0n; n >>= _1n, len += 1);\n return len;\n}\n\n/**\n * Gets single bit at position.\n * NOTE: first bit position is 0 (same as arrays)\n * Same as `!!+Array.from(n.toString(2)).reverse()[pos]`\n */\nexport function bitGet(n: bigint, pos: number): bigint {\n return (n >> BigInt(pos)) & _1n;\n}\n\n/**\n * Sets single bit at position.\n */\nexport function bitSet(n: bigint, pos: number, value: boolean): bigint {\n return n | ((value ? _1n : _0n) << BigInt(pos));\n}\n\n/**\n * Calculate mask for N bits. Not using ** operator with bigints because of old engines.\n * Same as BigInt(`0b${Array(i).fill('1').join('')}`)\n */\nexport const bitMask = (n: number): bigint => (_1n << BigInt(n)) - _1n;\n\n// DRBG\n\ntype Pred<T> = (v: Uint8Array) => T | undefined;\n/**\n * Minimal HMAC-DRBG from NIST 800-90 for RFC6979 sigs.\n * @returns function that will call DRBG until 2nd arg returns something meaningful\n * @example\n * const drbg = createHmacDRBG<Key>(32, 32, hmac);\n * drbg(seed, bytesToKey); // bytesToKey must return Key or undefined\n */\nexport function createHmacDrbg<T>(\n hashLen: number,\n qByteLen: number,\n hmacFn: (key: Uint8Array, ...messages: Uint8Array[]) => Uint8Array\n): (seed: Uint8Array, predicate: Pred<T>) => T {\n if (typeof hashLen !== 'number' || hashLen < 2) throw new Error('hashLen must be a number');\n if (typeof qByteLen !== 'number' || qByteLen < 2) throw new Error('qByteLen must be a number');\n if (typeof hmacFn !== 'function') throw new Error('hmacFn must be a function');\n // Step B, Step C: set hashLen to 8*ceil(hlen/8)\n const u8n = (len: number) => new Uint8Array(len); // creates Uint8Array\n const u8of = (byte: number) => Uint8Array.of(byte); // another shortcut\n let v = u8n(hashLen); // Minimal non-full-spec HMAC-DRBG from NIST 800-90 for RFC6979 sigs.\n let k = u8n(hashLen); // Steps B and C of RFC6979 3.2: set hashLen, in our case always same\n let i = 0; // Iterations counter, will throw when over 1000\n const reset = () => {\n v.fill(1);\n k.fill(0);\n i = 0;\n };\n const h = (...b: Uint8Array[]) => hmacFn(k, v, ...b); // hmac(k)(v, ...values)\n const reseed = (seed = u8n(0)) => {\n // HMAC-DRBG reseed() function. Steps D-G\n k = h(u8of(0x00), seed); // k = hmac(k || v || 0x00 || seed)\n v = h(); // v = hmac(k || v)\n if (seed.length === 0) return;\n k = h(u8of(0x01), seed); // k = hmac(k || v || 0x01 || seed)\n v = h(); // v = hmac(k || v)\n };\n const gen = () => {\n // HMAC-DRBG generate() function\n if (i++ >= 1000) throw new Error('drbg: tried 1000 values');\n let len = 0;\n const out: Uint8Array[] = [];\n while (len < qByteLen) {\n v = h();\n const sl = v.slice();\n out.push(sl);\n len += v.length;\n }\n return concatBytes_(...out);\n };\n const genUntil = (seed: Uint8Array, pred: Pred<T>): T => {\n reset();\n reseed(seed); // Steps D-G\n let res: T | undefined = undefined; // Step H: grind until k is in [1..n-1]\n while (!(res = pred(gen()))) reseed();\n reset();\n return res;\n };\n return genUntil;\n}\n\n// Validating curves and fields\n\nconst validatorFns = {\n bigint: (val: any): boolean => typeof val === 'bigint',\n function: (val: any): boolean => typeof val === 'function',\n boolean: (val: any): boolean => typeof val === 'boolean',\n string: (val: any): boolean => typeof val === 'string',\n stringOrUint8Array: (val: any): boolean => typeof val === 'string' || isBytes_(val),\n isSafeInteger: (val: any): boolean => Number.isSafeInteger(val),\n array: (val: any): boolean => Array.isArray(val),\n field: (val: any, object: any): any => (object as any).Fp.isValid(val),\n hash: (val: any): boolean => typeof val === 'function' && Number.isSafeInteger(val.outputLen),\n} as const;\ntype Validator = keyof typeof validatorFns;\ntype ValMap<T extends Record<string, any>> = { [K in keyof T]?: Validator };\n// type Record<K extends string | number | symbol, T> = { [P in K]: T; }\n\nexport function validateObject<T extends Record<string, any>>(\n object: T,\n validators: ValMap<T>,\n optValidators: ValMap<T> = {}\n): T {\n const checkField = (fieldName: keyof T, type: Validator, isOptional: boolean) => {\n const checkVal = validatorFns[type];\n if (typeof checkVal !== 'function') throw new Error('invalid validator function');\n\n const val = object[fieldName as keyof typeof object];\n if (isOptional && val === undefined) return;\n if (!checkVal(val, object)) {\n throw new Error(\n 'param ' + String(fieldName) + ' is invalid. Expected ' + type + ', got ' + val\n );\n }\n };\n for (const [fieldName, type] of Object.entries(validators)) checkField(fieldName, type!, false);\n for (const [fieldName, type] of Object.entries(optValidators)) checkField(fieldName, type!, true);\n return object;\n}\n// validate type tests\n// const o: { a: number; b: number; c: number } = { a: 1, b: 5, c: 6 };\n// const z0 = validateObject(o, { a: 'isSafeInteger' }, { c: 'bigint' }); // Ok!\n// // Should fail type-check\n// const z1 = validateObject(o, { a: 'tmp' }, { c: 'zz' });\n// const z2 = validateObject(o, { a: 'isSafeInteger' }, { c: 'zz' });\n// const z3 = validateObject(o, { test: 'boolean', z: 'bug' });\n// const z4 = validateObject(o, { a: 'boolean', z: 'bug' });\n\nexport function isHash(val: CHash): boolean {\n return typeof val === 'function' && Number.isSafeInteger(val.outputLen);\n}\nexport function _validateObject(\n object: Record<string, any>,\n fields: Record<string, string>,\n optFields: Record<string, string> = {}\n): void {\n if (!object || typeof object !== 'object') throw new Error('expected valid options object');\n type Item = keyof typeof object;\n function checkField(fieldName: Item, expectedType: string, isOpt: boolean) {\n const val = object[fieldName];\n if (isOpt && val === undefined) return;\n const current = typeof val;\n if (current !== expectedType || val === null)\n throw new Error(`param \"${fieldName}\" is invalid: expected ${expectedType}, got ${current}`);\n }\n Object.entries(fields).forEach(([k, v]) => checkField(k, v, false));\n Object.entries(optFields).forEach(([k, v]) => checkField(k, v, true));\n}\n\n/**\n * throws not implemented error\n */\nexport const notImplemented = (): never => {\n throw new Error('not implemented');\n};\n\n/**\n * Memoizes (caches) computation result.\n * Uses WeakMap: the value is going auto-cleaned by GC after last reference is removed.\n */\nexport function memoized<T extends object, R, O extends any[]>(\n fn: (arg: T, ...args: O) => R\n): (arg: T, ...args: O) => R {\n const map = new WeakMap<T, R>();\n return (arg: T, ...args: O): R => {\n const val = map.get(arg);\n if (val !== undefined) return val;\n const computed = fn(arg, ...args);\n map.set(arg, computed);\n return computed;\n };\n}\n", "/**\n * Utils for modular division and fields.\n * Field over 11 is a finite (Galois) field is integer number operations `mod 11`.\n * There is no division: it is replaced by modular multiplicative inverse.\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport {\n _validateObject,\n anumber,\n bitMask,\n bytesToNumberBE,\n bytesToNumberLE,\n ensureBytes,\n numberToBytesBE,\n numberToBytesLE,\n} from '../utils.ts';\n\n// prettier-ignore\nconst _0n = BigInt(0), _1n = BigInt(1), _2n = /* @__PURE__ */ BigInt(2), _3n = /* @__PURE__ */ BigInt(3);\n// prettier-ignore\nconst _4n = /* @__PURE__ */ BigInt(4), _5n = /* @__PURE__ */ BigInt(5), _7n = /* @__PURE__ */ BigInt(7);\n// prettier-ignore\nconst _8n = /* @__PURE__ */ BigInt(8), _9n = /* @__PURE__ */ BigInt(9), _16n = /* @__PURE__ */ BigInt(16);\n\n// Calculates a modulo b\nexport function mod(a: bigint, b: bigint): bigint {\n const result = a % b;\n return result >= _0n ? result : b + result;\n}\n/**\n * Efficiently raise num to power and do modular division.\n * Unsafe in some contexts: uses ladder, so can expose bigint bits.\n * @example\n * pow(2n, 6n, 11n) // 64n % 11n == 9n\n */\nexport function pow(num: bigint, power: bigint, modulo: bigint): bigint {\n return FpPow(Field(modulo), num, power);\n}\n\n/** Does `x^(2^power)` mod p. `pow2(30, 4)` == `30^(2^4)` */\nexport function pow2(x: bigint, power: bigint, modulo: bigint): bigint {\n let res = x;\n while (power-- > _0n) {\n res *= res;\n res %= modulo;\n }\n return res;\n}\n\n/**\n * Inverses number over modulo.\n * Implemented using [Euclidean GCD](https://brilliant.org/wiki/extended-euclidean-algorithm/).\n */\nexport function invert(number: bigint, modulo: bigint): bigint {\n if (number === _0n) throw new Error('invert: expected non-zero number');\n if (modulo <= _0n) throw new Error('invert: expected positive modulus, got ' + modulo);\n // Fermat's little theorem \"CT-like\" version inv(n) = n^(m-2) mod m is 30x slower.\n let a = mod(number, modulo);\n let b = modulo;\n // prettier-ignore\n let x = _0n, y = _1n, u = _1n, v = _0n;\n while (a !== _0n) {\n // JIT applies optimization if those two lines follow each other\n const q = b / a;\n const r = b % a;\n const m = x - u * q;\n const n = y - v * q;\n // prettier-ignore\n b = a, a = r, x = u, y = v, u = m, v = n;\n }\n const gcd = b;\n if (gcd !== _1n) throw new Error('invert: does not exist');\n return mod(x, modulo);\n}\n\nfunction assertIsSquare<T>(Fp: IField<T>, root: T, n: T): void {\n if (!Fp.eql(Fp.sqr(root), n)) throw new Error('Cannot find square root');\n}\n\n// Not all roots are possible! Example which will throw:\n// const NUM =\n// n = 72057594037927816n;\n// Fp = Field(BigInt('0x1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaab'));\nfunction sqrt3mod4<T>(Fp: IField<T>, n: T) {\n const p1div4 = (Fp.ORDER + _1n) / _4n;\n const root = Fp.pow(n, p1div4);\n assertIsSquare(Fp, root, n);\n return root;\n}\n\nfunction sqrt5mod8<T>(Fp: IField<T>, n: T) {\n const p5div8 = (Fp.ORDER - _5n) / _8n;\n const n2 = Fp.mul(n, _2n);\n const v = Fp.pow(n2, p5div8);\n const nv = Fp.mul(n, v);\n const i = Fp.mul(Fp.mul(nv, _2n), v);\n const root = Fp.mul(nv, Fp.sub(i, Fp.ONE));\n assertIsSquare(Fp, root, n);\n return root;\n}\n\n// Based on RFC9380, Kong algorithm\n// prettier-ignore\nfunction sqrt9mod16(P: bigint): <T>(Fp: IField<T>, n: T) => T {\n const Fp_ = Field(P);\n const tn = tonelliShanks(P);\n const c1 = tn(Fp_, Fp_.neg(Fp_.ONE));// 1. c1 = sqrt(-1) in F, i.e., (c1^2) == -1 in F\n const c2 = tn(Fp_, c1); // 2. c2 = sqrt(c1) in F, i.e., (c2^2) == c1 in F\n const c3 = tn(Fp_, Fp_.neg(c1)); // 3. c3 = sqrt(-c1) in F, i.e., (c3^2) == -c1 in F\n const c4 = (P + _7n) / _16n; // 4. c4 = (q + 7) / 16 # Integer arithmetic\n return <T>(Fp: IField<T>, n: T) => {\n let tv1 = Fp.pow(n, c4); // 1. tv1 = x^c4\n let tv2 = Fp.mul(tv1, c1); // 2. tv2 = c1 * tv1\n const tv3 = Fp.mul(tv1, c2); // 3. tv3 = c2 * tv1\n const tv4 = Fp.mul(tv1, c3); // 4. tv4 = c3 * tv1\n const e1 = Fp.eql(Fp.sqr(tv2), n); // 5. e1 = (tv2^2) == x\n const e2 = Fp.eql(Fp.sqr(tv3), n); // 6. e2 = (tv3^2) == x\n tv1 = Fp.cmov(tv1, tv2, e1); // 7. tv1 = CMOV(tv1, tv2, e1) # Select tv2 if (tv2^2) == x\n tv2 = Fp.cmov(tv4, tv3, e2); // 8. tv2 = CMOV(tv4, tv3, e2) # Select tv3 if (tv3^2) == x\n const e3 = Fp.eql(Fp.sqr(tv2), n); // 9. e3 = (tv2^2) == x\n const root = Fp.cmov(tv1, tv2, e3);// 10. z = CMOV(tv1, tv2, e3) # Select sqrt from tv1 & tv2\n assertIsSquare(Fp, root, n);\n return root;\n };\n}\n\n/**\n * Tonelli-Shanks square root search algorithm.\n * 1. https://eprint.iacr.org/2012/685.pdf (page 12)\n * 2. Square Roots from 1; 24, 51, 10 to Dan Shanks\n * @param P field order\n * @returns function that takes field Fp (created from P) and number n\n */\nexport function tonelliShanks(P: bigint): <T>(Fp: IField<T>, n: T) => T {\n // Initialization (precomputation).\n // Caching initialization could boost perf by 7%.\n if (P < _3n) throw new Error('sqrt is not defined for small field');\n // Factor P - 1 = Q * 2^S, where Q is odd\n let Q = P - _1n;\n let S = 0;\n while (Q % _2n === _0n) {\n Q /= _2n;\n S++;\n }\n\n // Find the first quadratic non-residue Z >= 2\n let Z = _2n;\n const _Fp = Field(P);\n while (FpLegendre(_Fp, Z) === 1) {\n // Basic primality test for P. After x iterations, chance of\n // not finding quadratic non-residue is 2^x, so 2^1000.\n if (Z++ > 1000) throw new Error('Cannot find square root: probably non-prime P');\n }\n // Fast-path; usually done before Z, but we do \"primality test\".\n if (S === 1) return sqrt3mod4;\n\n // Slow-path\n // TODO: test on Fp2 and others\n let cc = _Fp.pow(Z, Q); // c = z^Q\n const Q1div2 = (Q + _1n) / _2n;\n return function tonelliSlow<T>(Fp: IField<T>, n: T): T {\n if (Fp.is0(n)) return n;\n // Check if n is a quadratic residue using Legendre symbol\n if (FpLegendre(Fp, n) !== 1) throw new Error('Cannot find square root');\n\n // Initialize variables for the main loop\n let M = S;\n let c = Fp.mul(Fp.ONE, cc); // c = z^Q, move cc from field _Fp into field Fp\n let t = Fp.pow(n, Q); // t = n^Q, first guess at the fudge factor\n let R = Fp.pow(n, Q1div2); // R = n^((Q+1)/2), first guess at the square root\n\n // Main loop\n // while t != 1\n while (!Fp.eql(t, Fp.ONE)) {\n if (Fp.is0(t)) return Fp.ZERO; // if t=0 return R=0\n let i = 1;\n\n // Find the smallest i >= 1 such that t^(2^i) \u2261 1 (mod P)\n let t_tmp = Fp.sqr(t); // t^(2^1)\n while (!Fp.eql(t_tmp, Fp.ONE)) {\n i++;\n t_tmp = Fp.sqr(t_tmp); // t^(2^2)...\n if (i === M) throw new Error('Cannot find square root');\n }\n\n // Calculate the exponent for b: 2^(M - i - 1)\n const exponent = _1n << BigInt(M - i - 1); // bigint is important\n const b = Fp.pow(c, exponent); // b = 2^(M - i - 1)\n\n // Update variables\n M = i;\n c = Fp.sqr(b); // c = b^2\n t = Fp.mul(t, c); // t = (t * b^2)\n R = Fp.mul(R, b); // R = R*b\n }\n return R;\n };\n}\n\n/**\n * Square root for a finite field. Will try optimized versions first:\n *\n * 1. P \u2261 3 (mod 4)\n * 2. P \u2261 5 (mod 8)\n * 3. P \u2261 9 (mod 16)\n * 4. Tonelli-Shanks algorithm\n *\n * Different algorithms can give different roots, it is up to user to decide which one they want.\n * For example there is FpSqrtOdd/FpSqrtEven to choice root based on oddness (used for hash-to-curve).\n */\nexport function FpSqrt(P: bigint): <T>(Fp: IField<T>, n: T) => T {\n // P \u2261 3 (mod 4) => \u221An = n^((P+1)/4)\n if (P % _4n === _3n) return sqrt3mod4;\n // P \u2261 5 (mod 8) => Atkin algorithm, page 10 of https://eprint.iacr.org/2012/685.pdf\n if (P % _8n === _5n) return sqrt5mod8;\n // P \u2261 9 (mod 16) => Kong algorithm, page 11 of https://eprint.iacr.org/2012/685.pdf (algorithm 4)\n if (P % _16n === _9n) return sqrt9mod16(P);\n // Tonelli-Shanks algorithm\n return tonelliShanks(P);\n}\n\n// Little-endian check for first LE bit (last BE bit);\nexport const isNegativeLE = (num: bigint, modulo: bigint): boolean =>\n (mod(num, modulo) & _1n) === _1n;\n\n/** Field is not always over prime: for example, Fp2 has ORDER(q)=p^m. */\nexport interface IField<T> {\n ORDER: bigint;\n isLE: boolean;\n BYTES: number;\n BITS: number;\n MASK: bigint;\n ZERO: T;\n ONE: T;\n // 1-arg\n create: (num: T) => T;\n isValid: (num: T) => boolean;\n is0: (num: T) => boolean;\n isValidNot0: (num: T) => boolean;\n neg(num: T): T;\n inv(num: T): T;\n sqrt(num: T): T;\n sqr(num: T): T;\n // 2-args\n eql(lhs: T, rhs: T): boolean;\n add(lhs: T, rhs: T): T;\n sub(lhs: T, rhs: T): T;\n mul(lhs: T, rhs: T | bigint): T;\n pow(lhs: T, power: bigint): T;\n div(lhs: T, rhs: T | bigint): T;\n // N for NonNormalized (for now)\n addN(lhs: T, rhs: T): T;\n subN(lhs: T, rhs: T): T;\n mulN(lhs: T, rhs: T | bigint): T;\n sqrN(num: T): T;\n\n // Optional\n // Should be same as sgn0 function in\n // [RFC9380](https://www.rfc-editor.org/rfc/rfc9380#section-4.1).\n // NOTE: sgn0 is 'negative in LE', which is same as odd. And negative in LE is kinda strange definition anyway.\n isOdd?(num: T): boolean; // Odd instead of even since we have it for Fp2\n allowedLengths?: number[];\n // legendre?(num: T): T;\n invertBatch: (lst: T[]) => T[];\n toBytes(num: T): Uint8Array;\n fromBytes(bytes: Uint8Array, skipValidation?: boolean): T;\n // If c is False, CMOV returns a, otherwise it returns b.\n cmov(a: T, b: T, c: boolean): T;\n}\n// prettier-ignore\nconst FIELD_FIELDS = [\n 'create', 'isValid', 'is0', 'neg', 'inv', 'sqrt', 'sqr',\n 'eql', 'add', 'sub', 'mul', 'pow', 'div',\n 'addN', 'subN', 'mulN', 'sqrN'\n] as const;\nexport function validateField<T>(field: IField<T>): IField<T> {\n const initial = {\n ORDER: 'bigint',\n MASK: 'bigint',\n BYTES: 'number',\n BITS: 'number',\n } as Record<string, string>;\n const opts = FIELD_FIELDS.reduce((map, val: string) => {\n map[val] = 'function';\n return map;\n }, initial);\n _validateObject(field, opts);\n // const max = 16384;\n // if (field.BYTES < 1 || field.BYTES > max) throw new Error('invalid field');\n // if (field.BITS < 1 || field.BITS > 8 * max) throw new Error('invalid field');\n return field;\n}\n\n// Generic field functions\n\n/**\n * Same as `pow` but for Fp: non-constant-time.\n * Unsafe in some contexts: uses ladder, so can expose bigint bits.\n */\nexport function FpPow<T>(Fp: IField<T>, num: T, power: bigint): T {\n if (power < _0n) throw new Error('invalid exponent, negatives unsupported');\n if (power === _0n) return Fp.ONE;\n if (power === _1n) return num;\n let p = Fp.ONE;\n let d = num;\n while (power > _0n) {\n if (power & _1n) p = Fp.mul(p, d);\n d = Fp.sqr(d);\n power >>= _1n;\n }\n return p;\n}\n\n/**\n * Efficiently invert an array of Field elements.\n * Exception-free. Will return `undefined` for 0 elements.\n * @param passZero map 0 to 0 (instead of undefined)\n */\nexport function FpInvertBatch<T>(Fp: IField<T>, nums: T[], passZero = false): T[] {\n const inverted = new Array(nums.length).fill(passZero ? Fp.ZERO : undefined);\n // Walk from first to last, multiply them by each other MOD p\n const multipliedAcc = nums.reduce((acc, num, i) => {\n if (Fp.is0(num)) return acc;\n inverted[i] = acc;\n return Fp.mul(acc, num);\n }, Fp.ONE);\n // Invert last element\n const invertedAcc = Fp.inv(multipliedAcc);\n // Walk from last to first, multiply them by inverted each other MOD p\n nums.reduceRight((acc, num, i) => {\n if (Fp.is0(num)) return acc;\n inverted[i] = Fp.mul(acc, inverted[i]);\n return Fp.mul(acc, num);\n }, invertedAcc);\n return inverted;\n}\n\n// TODO: remove\nexport function FpDiv<T>(Fp: IField<T>, lhs: T, rhs: T | bigint): T {\n return Fp.mul(lhs, typeof rhs === 'bigint' ? invert(rhs, Fp.ORDER) : Fp.inv(rhs));\n}\n\n/**\n * Legendre symbol.\n * Legendre constant is used to calculate Legendre symbol (a | p)\n * which denotes the value of a^((p-1)/2) (mod p).\n *\n * * (a | p) \u2261 1 if a is a square (mod p), quadratic residue\n * * (a | p) \u2261 -1 if a is not a square (mod p), quadratic non residue\n * * (a | p) \u2261 0 if a \u2261 0 (mod p)\n */\nexport function FpLegendre<T>(Fp: IField<T>, n: T): -1 | 0 | 1 {\n // We can use 3rd argument as optional cache of this value\n // but seems unneeded for now. The operation is very fast.\n const p1mod2 = (Fp.ORDER - _1n) / _2n;\n const powered = Fp.pow(n, p1mod2);\n const yes = Fp.eql(powered, Fp.ONE);\n const zero = Fp.eql(powered, Fp.ZERO);\n const no = Fp.eql(powered, Fp.neg(Fp.ONE));\n if (!yes && !zero && !no) throw new Error('invalid Legendre symbol result');\n return yes ? 1 : zero ? 0 : -1;\n}\n\n// This function returns True whenever the value x is a square in the field F.\nexport function FpIsSquare<T>(Fp: IField<T>, n: T): boolean {\n const l = FpLegendre(Fp, n);\n return l === 1;\n}\n\nexport type NLength = { nByteLength: number; nBitLength: number };\n// CURVE.n lengths\nexport function nLength(n: bigint, nBitLength?: number): NLength {\n // Bit size, byte size of CURVE.n\n if (nBitLength !== undefined) anumber(nBitLength);\n const _nBitLength = nBitLength !== undefined ? nBitLength : n.toString(2).length;\n const nByteLength = Math.ceil(_nBitLength / 8);\n return { nBitLength: _nBitLength, nByteLength };\n}\n\ntype FpField = IField<bigint> & Required<Pick<IField<bigint>, 'isOdd'>>;\ntype SqrtFn = (n: bigint) => bigint;\ntype FieldOpts = Partial<{\n sqrt: SqrtFn;\n isLE: boolean;\n BITS: number;\n modFromBytes: boolean; // bls12-381 requires mod(n) instead of rejecting keys >= n\n allowedLengths?: readonly number[]; // for P521 (adds padding for smaller sizes)\n}>;\n/**\n * Creates a finite field. Major performance optimizations:\n * * 1. Denormalized operations like mulN instead of mul.\n * * 2. Identical object shape: never add or remove keys.\n * * 3. `Object.freeze`.\n * Fragile: always run a benchmark on a change.\n * Security note: operations don't check 'isValid' for all elements for performance reasons,\n * it is caller responsibility to check this.\n * This is low-level code, please make sure you know what you're doing.\n *\n * Note about field properties:\n * * CHARACTERISTIC p = prime number, number of elements in main subgroup.\n * * ORDER q = similar to cofactor in curves, may be composite `q = p^m`.\n *\n * @param ORDER field order, probably prime, or could be composite\n * @param bitLen how many bits the field consumes\n * @param isLE (default: false) if encoding / decoding should be in little-endian\n * @param redef optional faster redefinitions of sqrt and other methods\n */\nexport function Field(\n ORDER: bigint,\n bitLenOrOpts?: number | FieldOpts, // TODO: use opts only in v2?\n isLE = false,\n opts: { sqrt?: SqrtFn } = {}\n): Readonly<FpField> {\n if (ORDER <= _0n) throw new Error('invalid field: expected ORDER > 0, got ' + ORDER);\n let _nbitLength: number | undefined = undefined;\n let _sqrt: SqrtFn | undefined = undefined;\n let modFromBytes: boolean = false;\n let allowedLengths: undefined | readonly number[] = undefined;\n if (typeof bitLenOrOpts === 'object' && bitLenOrOpts != null) {\n if (opts.sqrt || isLE) throw new Error('cannot specify opts in two arguments');\n const _opts = bitLenOrOpts;\n if (_opts.BITS) _nbitLength = _opts.BITS;\n if (_opts.sqrt) _sqrt = _opts.sqrt;\n if (typeof _opts.isLE === 'boolean') isLE = _opts.isLE;\n if (typeof _opts.modFromBytes === 'boolean') modFromBytes = _opts.modFromBytes;\n allowedLengths = _opts.allowedLengths;\n } else {\n if (typeof bitLenOrOpts === 'number') _nbitLength = bitLenOrOpts;\n if (opts.sqrt) _sqrt = opts.sqrt;\n }\n const { nBitLength: BITS, nByteLength: BYTES } = nLength(ORDER, _nbitLength);\n if (BYTES > 2048) throw new Error('invalid field: expected ORDER of <= 2048 bytes');\n let sqrtP: ReturnType<typeof FpSqrt>; // cached sqrtP\n const f: Readonly<FpField> = Object.freeze({\n ORDER,\n isLE,\n BITS,\n BYTES,\n MASK: bitMask(BITS),\n ZERO: _0n,\n ONE: _1n,\n allowedLengths: allowedLengths,\n create: (num) => mod(num, ORDER),\n isValid: (num) => {\n if (typeof num !== 'bigint')\n throw new Error('invalid field element: expected bigint, got ' + typeof num);\n return _0n <= num && num < ORDER; // 0 is valid element, but it's not invertible\n },\n is0: (num) => num === _0n,\n // is valid and invertible\n isValidNot0: (num: bigint) => !f.is0(num) && f.isValid(num),\n isOdd: (num) => (num & _1n) === _1n,\n neg: (num) => mod(-num, ORDER),\n eql: (lhs, rhs) => lhs === rhs,\n\n sqr: (num) => mod(num * num, ORDER),\n add: (lhs, rhs) => mod(lhs + rhs, ORDER),\n sub: (lhs, rhs) => mod(lhs - rhs, ORDER),\n mul: (lhs, rhs) => mod(lhs * rhs, ORDER),\n pow: (num, power) => FpPow(f, num, power),\n div: (lhs, rhs) => mod(lhs * invert(rhs, ORDER), ORDER),\n\n // Same as above, but doesn't normalize\n sqrN: (num) => num * num,\n addN: (lhs, rhs) => lhs + rhs,\n subN: (lhs, rhs) => lhs - rhs,\n mulN: (lhs, rhs) => lhs * rhs,\n\n inv: (num) => invert(num, ORDER),\n sqrt:\n _sqrt ||\n ((n) => {\n if (!sqrtP) sqrtP = FpSqrt(ORDER);\n return sqrtP(f, n);\n }),\n toBytes: (num) => (isLE ? numberToBytesLE(num, BYTES) : numberToBytesBE(num, BYTES)),\n fromBytes: (bytes, skipValidation = true) => {\n if (allowedLengths) {\n if (!allowedLengths.includes(bytes.length) || bytes.length > BYTES) {\n throw new Error(\n 'Field.fromBytes: expected ' + allowedLengths + ' bytes, got ' + bytes.length\n );\n }\n const padded = new Uint8Array(BYTES);\n // isLE add 0 to right, !isLE to the left.\n padded.set(bytes, isLE ? 0 : padded.length - bytes.length);\n bytes = padded;\n }\n if (bytes.length !== BYTES)\n throw new Error('Field.fromBytes: expected ' + BYTES + ' bytes, got ' + bytes.length);\n let scalar = isLE ? bytesToNumberLE(bytes) : bytesToNumberBE(bytes);\n if (modFromBytes) scalar = mod(scalar, ORDER);\n if (!skipValidation)\n if (!f.isValid(scalar)) throw new Error('invalid field element: outside of range 0..ORDER');\n // NOTE: we don't validate scalar here, please use isValid. This done such way because some\n // protocol may allow non-reduced scalar that reduced later or changed some other way.\n return scalar;\n },\n // TODO: we don't need it here, move out to separate fn\n invertBatch: (lst) => FpInvertBatch(f, lst),\n // We can't move this out because Fp6, Fp12 implement it\n // and it's unclear what to return in there.\n cmov: (a, b, c) => (c ? b : a),\n } as FpField);\n return Object.freeze(f);\n}\n\n// Generic random scalar, we can do same for other fields if via Fp2.mul(Fp2.ONE, Fp2.random)?\n// This allows unsafe methods like ignore bias or zero. These unsafe, but often used in different protocols (if deterministic RNG).\n// which mean we cannot force this via opts.\n// Not sure what to do with randomBytes, we can accept it inside opts if wanted.\n// Probably need to export getMinHashLength somewhere?\n// random(bytes?: Uint8Array, unsafeAllowZero = false, unsafeAllowBias = false) {\n// const LEN = !unsafeAllowBias ? getMinHashLength(ORDER) : BYTES;\n// if (bytes === undefined) bytes = randomBytes(LEN); // _opts.randomBytes?\n// const num = isLE ? bytesToNumberLE(bytes) : bytesToNumberBE(bytes);\n// // `mod(x, 11)` can sometimes produce 0. `mod(x, 10) + 1` is the same, but no 0\n// const reduced = unsafeAllowZero ? mod(num, ORDER) : mod(num, ORDER - _1n) + _1n;\n// return reduced;\n// },\n\nexport function FpSqrtOdd<T>(Fp: IField<T>, elm: T): T {\n if (!Fp.isOdd) throw new Error(\"Field doesn't have isOdd\");\n const root = Fp.sqrt(elm);\n return Fp.isOdd(root) ? root : Fp.neg(root);\n}\n\nexport function FpSqrtEven<T>(Fp: IField<T>, elm: T): T {\n if (!Fp.isOdd) throw new Error(\"Field doesn't have isOdd\");\n const root = Fp.sqrt(elm);\n return Fp.isOdd(root) ? Fp.neg(root) : root;\n}\n\n/**\n * \"Constant-time\" private key generation utility.\n * Same as mapKeyToField, but accepts less bytes (40 instead of 48 for 32-byte field).\n * Which makes it slightly more biased, less secure.\n * @deprecated use `mapKeyToField` instead\n */\nexport function hashToPrivateScalar(\n hash: string | Uint8Array,\n groupOrder: bigint,\n isLE = false\n): bigint {\n hash = ensureBytes('privateHash', hash);\n const hashLen = hash.length;\n const minLen = nLength(groupOrder).nByteLength + 8;\n if (minLen < 24 || hashLen < minLen || hashLen > 1024)\n throw new Error(\n 'hashToPrivateScalar: expected ' + minLen + '-1024 bytes of input, got ' + hashLen\n );\n const num = isLE ? bytesToNumberLE(hash) : bytesToNumberBE(hash);\n return mod(num, groupOrder - _1n) + _1n;\n}\n\n/**\n * Returns total number of bytes consumed by the field element.\n * For example, 32 bytes for usual 256-bit weierstrass curve.\n * @param fieldOrder number of field elements, usually CURVE.n\n * @returns byte length of field\n */\nexport function getFieldBytesLength(fieldOrder: bigint): number {\n if (typeof fieldOrder !== 'bigint') throw new Error('field order must be bigint');\n const bitLength = fieldOrder.toString(2).length;\n return Math.ceil(bitLength / 8);\n}\n\n/**\n * Returns minimal amount of bytes that can be safely reduced\n * by field order.\n * Should be 2^-128 for 128-bit curve such as P256.\n * @param fieldOrder number of field elements, usually CURVE.n\n * @returns byte length of target hash\n */\nexport function getMinHashLength(fieldOrder: bigint): number {\n const length = getFieldBytesLength(fieldOrder);\n return length + Math.ceil(length / 2);\n}\n\n/**\n * \"Constant-time\" private key generation utility.\n * Can take (n + n/2) or more bytes of uniform input e.g. from CSPRNG or KDF\n * and convert them into private scalar, with the modulo bias being negligible.\n * Needs at least 48 bytes of input for 32-byte private key.\n * https://research.kudelskisecurity.com/2020/07/28/the-definitive-guide-to-modulo-bias-and-how-to-avoid-it/\n * FIPS 186-5, A.2 https://csrc.nist.gov/publications/detail/fips/186/5/final\n * RFC 9380, https://www.rfc-editor.org/rfc/rfc9380#section-5\n * @param hash hash output from SHA3 or a similar function\n * @param groupOrder size of subgroup - (e.g. secp256k1.CURVE.n)\n * @param isLE interpret hash bytes as LE num\n * @returns valid private scalar\n */\nexport function mapHashToField(key: Uint8Array, fieldOrder: bigint, isLE = false): Uint8Array {\n const len = key.length;\n const fieldLen = getFieldBytesLength(fieldOrder);\n const minLen = getMinHashLength(fieldOrder);\n // No small numbers: need to understand bias story. No huge numbers: easier to detect JS timings.\n if (len < 16 || len < minLen || len > 1024)\n throw new Error('expected ' + minLen + '-1024 bytes of input, got ' + len);\n const num = isLE ? bytesToNumberLE(key) : bytesToNumberBE(key);\n // `mod(x, 11)` can sometimes produce 0. `mod(x, 10) + 1` is the same, but no 0\n const reduced = mod(num, fieldOrder - _1n) + _1n;\n return isLE ? numberToBytesLE(reduced, fieldLen) : numberToBytesBE(reduced, fieldLen);\n}\n", "/**\n * Methods for elliptic curve multiplication by scalars.\n * Contains wNAF, pippenger.\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport { bitLen, bitMask, validateObject } from '../utils.ts';\nimport { Field, FpInvertBatch, nLength, validateField, type IField } from './modular.ts';\n\nconst _0n = BigInt(0);\nconst _1n = BigInt(1);\n\nexport type AffinePoint<T> = {\n x: T;\n y: T;\n} & { Z?: never };\n\n// This was initialy do this way to re-use montgomery ladder in field (add->mul,double->sqr), but\n// that didn't happen and there is probably not much reason to have separate Group like this?\nexport interface Group<T extends Group<T>> {\n double(): T;\n negate(): T;\n add(other: T): T;\n subtract(other: T): T;\n equals(other: T): boolean;\n multiply(scalar: bigint): T;\n toAffine?(invertedZ?: any): AffinePoint<any>;\n}\n\n// We can't \"abstract out\" coordinates (X, Y, Z; and T in Edwards): argument names of constructor\n// are not accessible. See Typescript gh-56093, gh-41594.\n//\n// We have to use recursive types, so it will return actual point, not constained `CurvePoint`.\n// If, at any point, P is `any`, it will erase all types and replace it\n// with `any`, because of recursion, `any implements CurvePoint`,\n// but we lose all constrains on methods.\n\n/** Base interface for all elliptic curve Points. */\nexport interface CurvePoint<F, P extends CurvePoint<F, P>> extends Group<P> {\n /** Affine x coordinate. Different from projective / extended X coordinate. */\n x: F;\n /** Affine y coordinate. Different from projective / extended Y coordinate. */\n y: F;\n Z?: F;\n double(): P;\n negate(): P;\n add(other: P): P;\n subtract(other: P): P;\n equals(other: P): boolean;\n multiply(scalar: bigint): P;\n assertValidity(): void;\n clearCofactor(): P;\n is0(): boolean;\n isTorsionFree(): boolean;\n isSmallOrder(): boolean;\n multiplyUnsafe(scalar: bigint): P;\n /**\n * Massively speeds up `p.multiply(n)` by using precompute tables (caching). See {@link wNAF}.\n * @param isLazy calculate cache now. Default (true) ensures it's deferred to first `multiply()`\n */\n precompute(windowSize?: number, isLazy?: boolean): P;\n /** Converts point to 2D xy affine coordinates */\n toAffine(invertedZ?: F): AffinePoint<F>;\n toBytes(): Uint8Array;\n toHex(): string;\n}\n\n/** Base interface for all elliptic curve Point constructors. */\nexport interface CurvePointCons<P extends CurvePoint<any, P>> {\n [Symbol.hasInstance]: (item: unknown) => boolean;\n BASE: P;\n ZERO: P;\n /** Field for basic curve math */\n Fp: IField<P_F<P>>;\n /** Scalar field, for scalars in multiply and others */\n Fn: IField<bigint>;\n /** Creates point from x, y. Does NOT validate if the point is valid. Use `.assertValidity()`. */\n fromAffine(p: AffinePoint<P_F<P>>): P;\n fromBytes(bytes: Uint8Array): P;\n fromHex(hex: Uint8Array | string): P;\n}\n\n// Type inference helpers: PC - PointConstructor, P - Point, Fp - Field element\n// Short names, because we use them a lot in result types:\n// * we can't do 'P = GetCurvePoint<PC>': this is default value and doesn't constrain anything\n// * we can't do 'type X = GetCurvePoint<PC>': it won't be accesible for arguments/return types\n// * `CurvePointCons<P extends CurvePoint<any, P>>` constraints from interface definition\n// won't propagate, if `PC extends CurvePointCons<any>`: the P would be 'any', which is incorrect\n// * PC could be super specific with super specific P, which implements CurvePoint<any, P>.\n// this means we need to do stuff like\n// `function test<P extends CurvePoint<any, P>, PC extends CurvePointCons<P>>(`\n// if we want type safety around P, otherwise PC_P<PC> will be any\n\n/** Returns Fp type from Point (P_F<P> == P.F) */\nexport type P_F<P extends CurvePoint<any, P>> = P extends CurvePoint<infer F, P> ? F : never;\n/** Returns Fp type from PointCons (PC_F<PC> == PC.P.F) */\nexport type PC_F<PC extends CurvePointCons<CurvePoint<any, any>>> = PC['Fp']['ZERO'];\n/** Returns Point type from PointCons (PC_P<PC> == PC.P) */\nexport type PC_P<PC extends CurvePointCons<CurvePoint<any, any>>> = PC['ZERO'];\n\n// Ugly hack to get proper type inference, because in typescript fails to infer resursively.\n// The hack allows to do up to 10 chained operations without applying type erasure.\n//\n// Types which won't work:\n// * `CurvePointCons<CurvePoint<any, any>>`, will return `any` after 1 operation\n// * `CurvePointCons<any>: WeierstrassPointCons<bigint> extends CurvePointCons<any> = false`\n// * `P extends CurvePoint, PC extends CurvePointCons<P>`\n// * It can't infer P from PC alone\n// * Too many relations between F, P & PC\n// * It will infer P/F if `arg: CurvePointCons<F, P>`, but will fail if PC is generic\n// * It will work correctly if there is an additional argument of type P\n// * But generally, we don't want to parametrize `CurvePointCons` over `F`: it will complicate\n// types, making them un-inferable\n// prettier-ignore\nexport type PC_ANY = CurvePointCons<\n CurvePoint<any,\n CurvePoint<any,\n CurvePoint<any,\n CurvePoint<any,\n CurvePoint<any,\n CurvePoint<any,\n CurvePoint<any,\n CurvePoint<any,\n CurvePoint<any,\n CurvePoint<any, any>\n >>>>>>>>>\n>;\n\nexport interface CurveLengths {\n secretKey?: number;\n publicKey?: number;\n publicKeyUncompressed?: number;\n publicKeyHasPrefix?: boolean;\n signature?: number;\n seed?: number;\n}\nexport type GroupConstructor<T> = {\n BASE: T;\n ZERO: T;\n};\n/** @deprecated */\nexport type ExtendedGroupConstructor<T> = GroupConstructor<T> & {\n Fp: IField<any>;\n Fn: IField<bigint>;\n fromAffine(ap: AffinePoint<any>): T;\n};\nexport type Mapper<T> = (i: T[]) => T[];\n\nexport function negateCt<T extends { negate: () => T }>(condition: boolean, item: T): T {\n const neg = item.negate();\n return condition ? neg : item;\n}\n\n/**\n * Takes a bunch of Projective Points but executes only one\n * inversion on all of them. Inversion is very slow operation,\n * so this improves performance massively.\n * Optimization: converts a list of projective points to a list of identical points with Z=1.\n */\nexport function normalizeZ<P extends CurvePoint<any, P>, PC extends CurvePointCons<P>>(\n c: PC,\n points: P[]\n): P[] {\n const invertedZs = FpInvertBatch(\n c.Fp,\n points.map((p) => p.Z!)\n );\n return points.map((p, i) => c.fromAffine(p.toAffine(invertedZs[i])));\n}\n\nfunction validateW(W: number, bits: number) {\n if (!Number.isSafeInteger(W) || W <= 0 || W > bits)\n throw new Error('invalid window size, expected [1..' + bits + '], got W=' + W);\n}\n\n/** Internal wNAF opts for specific W and scalarBits */\nexport type WOpts = {\n windows: number;\n windowSize: number;\n mask: bigint;\n maxNumber: number;\n shiftBy: bigint;\n};\n\nfunction calcWOpts(W: number, scalarBits: number): WOpts {\n validateW(W, scalarBits);\n const windows = Math.ceil(scalarBits / W) + 1; // W=8 33. Not 32, because we skip zero\n const windowSize = 2 ** (W - 1); // W=8 128. Not 256, because we skip zero\n const maxNumber = 2 ** W; // W=8 256\n const mask = bitMask(W); // W=8 255 == mask 0b11111111\n const shiftBy = BigInt(W); // W=8 8\n return { windows, windowSize, mask, maxNumber, shiftBy };\n}\n\nfunction calcOffsets(n: bigint, window: number, wOpts: WOpts) {\n const { windowSize, mask, maxNumber, shiftBy } = wOpts;\n let wbits = Number(n & mask); // extract W bits.\n let nextN = n >> shiftBy; // shift number by W bits.\n\n // What actually happens here:\n // const highestBit = Number(mask ^ (mask >> 1n));\n // let wbits2 = wbits - 1; // skip zero\n // if (wbits2 & highestBit) { wbits2 ^= Number(mask); // (~);\n\n // split if bits > max: +224 => 256-32\n if (wbits > windowSize) {\n // we skip zero, which means instead of `>= size-1`, we do `> size`\n wbits -= maxNumber; // -32, can be maxNumber - wbits, but then we need to set isNeg here.\n nextN += _1n; // +256 (carry)\n }\n const offsetStart = window * windowSize;\n const offset = offsetStart + Math.abs(wbits) - 1; // -1 because we skip zero\n const isZero = wbits === 0; // is current window slice a 0?\n const isNeg = wbits < 0; // is current window slice negative?\n const isNegF = window % 2 !== 0; // fake random statement for noise\n const offsetF = offsetStart; // fake offset for noise\n return { nextN, offset, isZero, isNeg, isNegF, offsetF };\n}\n\nfunction validateMSMPoints(points: any[], c: any) {\n if (!Array.isArray(points)) throw new Error('array expected');\n points.forEach((p, i) => {\n if (!(p instanceof c)) throw new Error('invalid point at index ' + i);\n });\n}\nfunction validateMSMScalars(scalars: any[], field: any) {\n if (!Array.isArray(scalars)) throw new Error('array of scalars expected');\n scalars.forEach((s, i) => {\n if (!field.isValid(s)) throw new Error('invalid scalar at index ' + i);\n });\n}\n\n// Since points in different groups cannot be equal (different object constructor),\n// we can have single place to store precomputes.\n// Allows to make points frozen / immutable.\nconst pointPrecomputes = new WeakMap<any, any[]>();\nconst pointWindowSizes = new WeakMap<any, number>();\n\nfunction getW(P: any): number {\n // To disable precomputes:\n // return 1;\n return pointWindowSizes.get(P) || 1;\n}\n\nfunction assert0(n: bigint): void {\n if (n !== _0n) throw new Error('invalid wNAF');\n}\n\n/**\n * Elliptic curve multiplication of Point by scalar. Fragile.\n * Table generation takes **30MB of ram and 10ms on high-end CPU**,\n * but may take much longer on slow devices. Actual generation will happen on\n * first call of `multiply()`. By default, `BASE` point is precomputed.\n *\n * Scalars should always be less than curve order: this should be checked inside of a curve itself.\n * Creates precomputation tables for fast multiplication:\n * - private scalar is split by fixed size windows of W bits\n * - every window point is collected from window's table & added to accumulator\n * - since windows are different, same point inside tables won't be accessed more than once per calc\n * - each multiplication is 'Math.ceil(CURVE_ORDER / \uD835\uDC4A) + 1' point additions (fixed for any scalar)\n * - +1 window is neccessary for wNAF\n * - wNAF reduces table size: 2x less memory + 2x faster generation, but 10% slower multiplication\n *\n * @todo Research returning 2d JS array of windows, instead of a single window.\n * This would allow windows to be in different memory locations\n */\nexport class wNAF<PC extends PC_ANY> {\n private readonly BASE: PC_P<PC>;\n private readonly ZERO: PC_P<PC>;\n private readonly Fn: PC['Fn'];\n readonly bits: number;\n\n // Parametrized with a given Point class (not individual point)\n constructor(Point: PC, bits: number) {\n this.BASE = Point.BASE;\n this.ZERO = Point.ZERO;\n this.Fn = Point.Fn;\n this.bits = bits;\n }\n\n // non-const time multiplication ladder\n _unsafeLadder(elm: PC_P<PC>, n: bigint, p: PC_P<PC> = this.ZERO): PC_P<PC> {\n let d: PC_P<PC> = elm;\n while (n > _0n) {\n if (n & _1n) p = p.add(d);\n d = d.double();\n n >>= _1n;\n }\n return p;\n }\n\n /**\n * Creates a wNAF precomputation window. Used for caching.\n * Default window size is set by `utils.precompute()` and is equal to 8.\n * Number of precomputed points depends on the curve size:\n * 2^(\uD835\uDC4A\u22121) * (Math.ceil(\uD835\uDC5B / \uD835\uDC4A) + 1), where:\n * - \uD835\uDC4A is the window size\n * - \uD835\uDC5B is the bitlength of the curve order.\n * For a 256-bit curve and window size 8, the number of precomputed points is 128 * 33 = 4224.\n * @param point Point instance\n * @param W window size\n * @returns precomputed point tables flattened to a single array\n */\n private precomputeWindow(point: PC_P<PC>, W: number): PC_P<PC>[] {\n const { windows, windowSize } = calcWOpts(W, this.bits);\n const points: PC_P<PC>[] = [];\n let p: PC_P<PC> = point;\n let base = p;\n for (let window = 0; window < windows; window++) {\n base = p;\n points.push(base);\n // i=1, bc we skip 0\n for (let i = 1; i < windowSize; i++) {\n base = base.add(p);\n points.push(base);\n }\n p = base.double();\n }\n return points;\n }\n\n /**\n * Implements ec multiplication using precomputed tables and w-ary non-adjacent form.\n * More compact implementation:\n * https://github.com/paulmillr/noble-secp256k1/blob/47cb1669b6e506ad66b35fe7d76132ae97465da2/index.ts#L502-L541\n * @returns real and fake (for const-time) points\n */\n private wNAF(W: number, precomputes: PC_P<PC>[], n: bigint): { p: PC_P<PC>; f: PC_P<PC> } {\n // Scalar should be smaller than field order\n if (!this.Fn.isValid(n)) throw new Error('invalid scalar');\n // Accumulators\n let p = this.ZERO;\n let f = this.BASE;\n // This code was first written with assumption that 'f' and 'p' will never be infinity point:\n // since each addition is multiplied by 2 ** W, it cannot cancel each other. However,\n // there is negate now: it is possible that negated element from low value\n // would be the same as high element, which will create carry into next window.\n // It's not obvious how this can fail, but still worth investigating later.\n const wo = calcWOpts(W, this.bits);\n for (let window = 0; window < wo.windows; window++) {\n // (n === _0n) is handled and not early-exited. isEven and offsetF are used for noise\n const { nextN, offset, isZero, isNeg, isNegF, offsetF } = calcOffsets(n, window, wo);\n n = nextN;\n if (isZero) {\n // bits are 0: add garbage to fake point\n // Important part for const-time getPublicKey: add random \"noise\" point to f.\n f = f.add(negateCt(isNegF, precomputes[offsetF]));\n } else {\n // bits are 1: add to result point\n p = p.add(negateCt(isNeg, precomputes[offset]));\n }\n }\n assert0(n);\n // Return both real and fake points: JIT won't eliminate f.\n // At this point there is a way to F be infinity-point even if p is not,\n // which makes it less const-time: around 1 bigint multiply.\n return { p, f };\n }\n\n /**\n * Implements ec unsafe (non const-time) multiplication using precomputed tables and w-ary non-adjacent form.\n * @param acc accumulator point to add result of multiplication\n * @returns point\n */\n private wNAFUnsafe(\n W: number,\n precomputes: PC_P<PC>[],\n n: bigint,\n acc: PC_P<PC> = this.ZERO\n ): PC_P<PC> {\n const wo = calcWOpts(W, this.bits);\n for (let window = 0; window < wo.windows; window++) {\n if (n === _0n) break; // Early-exit, skip 0 value\n const { nextN, offset, isZero, isNeg } = calcOffsets(n, window, wo);\n n = nextN;\n if (isZero) {\n // Window bits are 0: skip processing.\n // Move to next window.\n continue;\n } else {\n const item = precomputes[offset];\n acc = acc.add(isNeg ? item.negate() : item); // Re-using acc allows to save adds in MSM\n }\n }\n assert0(n);\n return acc;\n }\n\n private getPrecomputes(W: number, point: PC_P<PC>, transform?: Mapper<PC_P<PC>>): PC_P<PC>[] {\n // Calculate precomputes on a first run, reuse them after\n let comp = pointPrecomputes.get(point);\n if (!comp) {\n comp = this.precomputeWindow(point, W) as PC_P<PC>[];\n if (W !== 1) {\n // Doing transform outside of if brings 15% perf hit\n if (typeof transform === 'function') comp = transform(comp);\n pointPrecomputes.set(point, comp);\n }\n }\n return comp;\n }\n\n cached(\n point: PC_P<PC>,\n scalar: bigint,\n transform?: Mapper<PC_P<PC>>\n ): { p: PC_P<PC>; f: PC_P<PC> } {\n const W = getW(point);\n return this.wNAF(W, this.getPrecomputes(W, point, transform), scalar);\n }\n\n unsafe(point: PC_P<PC>, scalar: bigint, transform?: Mapper<PC_P<PC>>, prev?: PC_P<PC>): PC_P<PC> {\n const W = getW(point);\n if (W === 1) return this._unsafeLadder(point, scalar, prev); // For W=1 ladder is ~x2 faster\n return this.wNAFUnsafe(W, this.getPrecomputes(W, point, transform), scalar, prev);\n }\n\n // We calculate precomputes for elliptic curve point multiplication\n // using windowed method. This specifies window size and\n // stores precomputed values. Usually only base point would be precomputed.\n createCache(P: PC_P<PC>, W: number): void {\n validateW(W, this.bits);\n pointWindowSizes.set(P, W);\n pointPrecomputes.delete(P);\n }\n\n hasCache(elm: PC_P<PC>): boolean {\n return getW(elm) !== 1;\n }\n}\n\n/**\n * Endomorphism-specific multiplication for Koblitz curves.\n * Cost: 128 dbl, 0-256 adds.\n */\nexport function mulEndoUnsafe<P extends CurvePoint<any, P>, PC extends CurvePointCons<P>>(\n Point: PC,\n point: P,\n k1: bigint,\n k2: bigint\n): { p1: P; p2: P } {\n let acc = point;\n let p1 = Point.ZERO;\n let p2 = Point.ZERO;\n while (k1 > _0n || k2 > _0n) {\n if (k1 & _1n) p1 = p1.add(acc);\n if (k2 & _1n) p2 = p2.add(acc);\n acc = acc.double();\n k1 >>= _1n;\n k2 >>= _1n;\n }\n return { p1, p2 };\n}\n\n/**\n * Pippenger algorithm for multi-scalar multiplication (MSM, Pa + Qb + Rc + ...).\n * 30x faster vs naive addition on L=4096, 10x faster than precomputes.\n * For N=254bit, L=1, it does: 1024 ADD + 254 DBL. For L=5: 1536 ADD + 254 DBL.\n * Algorithmically constant-time (for same L), even when 1 point + scalar, or when scalar = 0.\n * @param c Curve Point constructor\n * @param fieldN field over CURVE.N - important that it's not over CURVE.P\n * @param points array of L curve points\n * @param scalars array of L scalars (aka secret keys / bigints)\n */\nexport function pippenger<P extends CurvePoint<any, P>, PC extends CurvePointCons<P>>(\n c: PC,\n fieldN: IField<bigint>,\n points: P[],\n scalars: bigint[]\n): P {\n // If we split scalars by some window (let's say 8 bits), every chunk will only\n // take 256 buckets even if there are 4096 scalars, also re-uses double.\n // TODO:\n // - https://eprint.iacr.org/2024/750.pdf\n // - https://tches.iacr.org/index.php/TCHES/article/view/10287\n // 0 is accepted in scalars\n validateMSMPoints(points, c);\n validateMSMScalars(scalars, fieldN);\n const plength = points.length;\n const slength = scalars.length;\n if (plength !== slength) throw new Error('arrays of points and scalars must have equal length');\n // if (plength === 0) throw new Error('array must be of length >= 2');\n const zero = c.ZERO;\n const wbits = bitLen(BigInt(plength));\n let windowSize = 1; // bits\n if (wbits > 12) windowSize = wbits - 3;\n else if (wbits > 4) windowSize = wbits - 2;\n else if (wbits > 0) windowSize = 2;\n const MASK = bitMask(windowSize);\n const buckets = new Array(Number(MASK) + 1).fill(zero); // +1 for zero array\n const lastBits = Math.floor((fieldN.BITS - 1) / windowSize) * windowSize;\n let sum = zero;\n for (let i = lastBits; i >= 0; i -= windowSize) {\n buckets.fill(zero);\n for (let j = 0; j < slength; j++) {\n const scalar = scalars[j];\n const wbits = Number((scalar >> BigInt(i)) & MASK);\n buckets[wbits] = buckets[wbits].add(points[j]);\n }\n let resI = zero; // not using this will do small speed-up, but will lose ct\n // Skip first bucket, because it is zero\n for (let j = buckets.length - 1, sumI = zero; j > 0; j--) {\n sumI = sumI.add(buckets[j]);\n resI = resI.add(sumI);\n }\n sum = sum.add(resI);\n if (i !== 0) for (let j = 0; j < windowSize; j++) sum = sum.double();\n }\n return sum as P;\n}\n/**\n * Precomputed multi-scalar multiplication (MSM, Pa + Qb + Rc + ...).\n * @param c Curve Point constructor\n * @param fieldN field over CURVE.N - important that it's not over CURVE.P\n * @param points array of L curve points\n * @returns function which multiplies points with scaars\n */\nexport function precomputeMSMUnsafe<P extends CurvePoint<any, P>, PC extends CurvePointCons<P>>(\n c: PC,\n fieldN: IField<bigint>,\n points: P[],\n windowSize: number\n): (scalars: bigint[]) => P {\n /**\n * Performance Analysis of Window-based Precomputation\n *\n * Base Case (256-bit scalar, 8-bit window):\n * - Standard precomputation requires:\n * - 31 additions per scalar \u00D7 256 scalars = 7,936 ops\n * - Plus 255 summary additions = 8,191 total ops\n * Note: Summary additions can be optimized via accumulator\n *\n * Chunked Precomputation Analysis:\n * - Using 32 chunks requires:\n * - 255 additions per chunk\n * - 256 doublings\n * - Total: (255 \u00D7 32) + 256 = 8,416 ops\n *\n * Memory Usage Comparison:\n * Window Size | Standard Points | Chunked Points\n * ------------|-----------------|---------------\n * 4-bit | 520 | 15\n * 8-bit | 4,224 | 255\n * 10-bit | 13,824 | 1,023\n * 16-bit | 557,056 | 65,535\n *\n * Key Advantages:\n * 1. Enables larger window sizes due to reduced memory overhead\n * 2. More efficient for smaller scalar counts:\n * - 16 chunks: (16 \u00D7 255) + 256 = 4,336 ops\n * - ~2x faster than standard 8,191 ops\n *\n * Limitations:\n * - Not suitable for plain precomputes (requires 256 constant doublings)\n * - Performance degrades with larger scalar counts:\n * - Optimal for ~256 scalars\n * - Less efficient for 4096+ scalars (Pippenger preferred)\n */\n validateW(windowSize, fieldN.BITS);\n validateMSMPoints(points, c);\n const zero = c.ZERO;\n const tableSize = 2 ** windowSize - 1; // table size (without zero)\n const chunks = Math.ceil(fieldN.BITS / windowSize); // chunks of item\n const MASK = bitMask(windowSize);\n const tables = points.map((p: P) => {\n const res = [];\n for (let i = 0, acc = p; i < tableSize; i++) {\n res.push(acc);\n acc = acc.add(p);\n }\n return res;\n });\n return (scalars: bigint[]): P => {\n validateMSMScalars(scalars, fieldN);\n if (scalars.length > points.length)\n throw new Error('array of scalars must be smaller than array of points');\n let res = zero;\n for (let i = 0; i < chunks; i++) {\n // No need to double if accumulator is still zero.\n if (res !== zero) for (let j = 0; j < windowSize; j++) res = res.double();\n const shiftBy = BigInt(chunks * windowSize - (i + 1) * windowSize);\n for (let j = 0; j < scalars.length; j++) {\n const n = scalars[j];\n const curr = Number((n >> shiftBy) & MASK);\n if (!curr) continue; // skip zero scalars chunks\n res = res.add(tables[j][curr - 1]);\n }\n }\n return res;\n };\n}\n\n// TODO: remove\n/**\n * Generic BasicCurve interface: works even for polynomial fields (BLS): P, n, h would be ok.\n * Though generator can be different (Fp2 / Fp6 for BLS).\n */\nexport type BasicCurve<T> = {\n Fp: IField<T>; // Field over which we'll do calculations (Fp)\n n: bigint; // Curve order, total count of valid points in the field\n nBitLength?: number; // bit length of curve order\n nByteLength?: number; // byte length of curve order\n h: bigint; // cofactor. we can assign default=1, but users will just ignore it w/o validation\n hEff?: bigint; // Number to multiply to clear cofactor\n Gx: T; // base point X coordinate\n Gy: T; // base point Y coordinate\n allowInfinityPoint?: boolean; // bls12-381 requires it. ZERO point is valid, but invalid pubkey\n};\n\n// TODO: remove\n/** @deprecated */\nexport function validateBasic<FP, T>(\n curve: BasicCurve<FP> & T\n): Readonly<\n {\n readonly nBitLength: number;\n readonly nByteLength: number;\n } & BasicCurve<FP> &\n T & {\n p: bigint;\n }\n> {\n validateField(curve.Fp);\n validateObject(\n curve,\n {\n n: 'bigint',\n h: 'bigint',\n Gx: 'field',\n Gy: 'field',\n },\n {\n nBitLength: 'isSafeInteger',\n nByteLength: 'isSafeInteger',\n }\n );\n // Set defaults\n return Object.freeze({\n ...nLength(curve.n, curve.nBitLength),\n ...curve,\n ...{ p: curve.Fp.ORDER },\n } as const);\n}\n\nexport type ValidCurveParams<T> = {\n p: bigint;\n n: bigint;\n h: bigint;\n a: T;\n b?: T;\n d?: T;\n Gx: T;\n Gy: T;\n};\n\nfunction createField<T>(order: bigint, field?: IField<T>, isLE?: boolean): IField<T> {\n if (field) {\n if (field.ORDER !== order) throw new Error('Field.ORDER must match order: Fp == p, Fn == n');\n validateField(field);\n return field;\n } else {\n return Field(order, { isLE }) as unknown as IField<T>;\n }\n}\nexport type FpFn<T> = { Fp: IField<T>; Fn: IField<bigint> };\n\n/** Validates CURVE opts and creates fields */\nexport function _createCurveFields<T>(\n type: 'weierstrass' | 'edwards',\n CURVE: ValidCurveParams<T>,\n curveOpts: Partial<FpFn<T>> = {},\n FpFnLE?: boolean\n): FpFn<T> & { CURVE: ValidCurveParams<T> } {\n if (FpFnLE === undefined) FpFnLE = type === 'edwards';\n if (!CURVE || typeof CURVE !== 'object') throw new Error(`expected valid ${type} CURVE object`);\n for (const p of ['p', 'n', 'h'] as const) {\n const val = CURVE[p];\n if (!(typeof val === 'bigint' && val > _0n))\n throw new Error(`CURVE.${p} must be positive bigint`);\n }\n const Fp = createField(CURVE.p, curveOpts.Fp, FpFnLE);\n const Fn = createField(CURVE.n, curveOpts.Fn, FpFnLE);\n const _b: 'b' | 'd' = type === 'weierstrass' ? 'b' : 'd';\n const params = ['Gx', 'Gy', 'a', _b] as const;\n for (const p of params) {\n // @ts-ignore\n if (!Fp.isValid(CURVE[p]))\n throw new Error(`CURVE.${p} must be valid field element of CURVE.Fp`);\n }\n CURVE = Object.freeze(Object.assign({}, CURVE));\n return { CURVE, Fp, Fn };\n}\n", "/**\n * Short Weierstrass curve methods. The formula is: y\u00B2 = x\u00B3 + ax + b.\n *\n * ### Design rationale for types\n *\n * * Interaction between classes from different curves should fail:\n * `k256.Point.BASE.add(p256.Point.BASE)`\n * * For this purpose we want to use `instanceof` operator, which is fast and works during runtime\n * * Different calls of `curve()` would return different classes -\n * `curve(params) !== curve(params)`: if somebody decided to monkey-patch their curve,\n * it won't affect others\n *\n * TypeScript can't infer types for classes created inside a function. Classes is one instance\n * of nominative types in TypeScript and interfaces only check for shape, so it's hard to create\n * unique type for every function call.\n *\n * We can use generic types via some param, like curve opts, but that would:\n * 1. Enable interaction between `curve(params)` and `curve(params)` (curves of same params)\n * which is hard to debug.\n * 2. Params can be generic and we can't enforce them to be constant value:\n * if somebody creates curve from non-constant params,\n * it would be allowed to interact with other curves with non-constant params\n *\n * @todo https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-7.html#unique-symbol\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport { hmac as nobleHmac } from '@noble/hashes/hmac.js';\nimport { ahash } from '@noble/hashes/utils';\nimport {\n _validateObject,\n _abool2 as abool,\n _abytes2 as abytes,\n aInRange,\n bitLen,\n bitMask,\n bytesToHex,\n bytesToNumberBE,\n concatBytes,\n createHmacDrbg,\n ensureBytes,\n hexToBytes,\n inRange,\n isBytes,\n memoized,\n numberToHexUnpadded,\n randomBytes as randomBytesWeb,\n type CHash,\n type Hex,\n type PrivKey,\n} from '../utils.ts';\nimport {\n _createCurveFields,\n mulEndoUnsafe,\n negateCt,\n normalizeZ,\n pippenger,\n wNAF,\n type AffinePoint,\n type BasicCurve,\n type CurveLengths,\n type CurvePoint,\n type CurvePointCons,\n} from './curve.ts';\nimport {\n Field,\n FpInvertBatch,\n getMinHashLength,\n mapHashToField,\n nLength,\n validateField,\n type IField,\n type NLength,\n} from './modular.ts';\n\nexport type { AffinePoint };\nexport type HmacFnSync = (key: Uint8Array, ...messages: Uint8Array[]) => Uint8Array;\n\ntype EndoBasis = [[bigint, bigint], [bigint, bigint]];\n/**\n * When Weierstrass curve has `a=0`, it becomes Koblitz curve.\n * Koblitz curves allow using **efficiently-computable GLV endomorphism \u03C8**.\n * Endomorphism uses 2x less RAM, speeds up precomputation by 2x and ECDH / key recovery by 20%.\n * For precomputed wNAF it trades off 1/2 init time & 1/3 ram for 20% perf hit.\n *\n * Endomorphism consists of beta, lambda and splitScalar:\n *\n * 1. GLV endomorphism \u03C8 transforms a point: `P = (x, y) \u21A6 \u03C8(P) = (\u03B2\u00B7x mod p, y)`\n * 2. GLV scalar decomposition transforms a scalar: `k \u2261 k\u2081 + k\u2082\u00B7\u03BB (mod n)`\n * 3. Then these are combined: `k\u00B7P = k\u2081\u00B7P + k\u2082\u00B7\u03C8(P)`\n * 4. Two 128-bit point-by-scalar multiplications + one point addition is faster than\n * one 256-bit multiplication.\n *\n * where\n * * beta: \u03B2 \u2208 F\u209A with \u03B2\u00B3 = 1, \u03B2 \u2260 1\n * * lambda: \u03BB \u2208 F\u2099 with \u03BB\u00B3 = 1, \u03BB \u2260 1\n * * splitScalar decomposes k \u21A6 k\u2081, k\u2082, by using reduced basis vectors.\n * Gauss lattice reduction calculates them from initial basis vectors `(n, 0), (-\u03BB, 0)`\n *\n * Check out `test/misc/endomorphism.js` and\n * [gist](https://gist.github.com/paulmillr/eb670806793e84df628a7c434a873066).\n */\nexport type EndomorphismOpts = {\n beta: bigint;\n basises?: EndoBasis;\n splitScalar?: (k: bigint) => { k1neg: boolean; k1: bigint; k2neg: boolean; k2: bigint };\n};\n\n// We construct basis in such way that den is always positive and equals n, but num sign depends on basis (not on secret value)\nconst divNearest = (num: bigint, den: bigint) => (num + (num >= 0 ? den : -den) / _2n) / den;\n\nexport type ScalarEndoParts = { k1neg: boolean; k1: bigint; k2neg: boolean; k2: bigint };\n\n/**\n * Splits scalar for GLV endomorphism.\n */\nexport function _splitEndoScalar(k: bigint, basis: EndoBasis, n: bigint): ScalarEndoParts {\n // Split scalar into two such that part is ~half bits: `abs(part) < sqrt(N)`\n // Since part can be negative, we need to do this on point.\n // TODO: verifyScalar function which consumes lambda\n const [[a1, b1], [a2, b2]] = basis;\n const c1 = divNearest(b2 * k, n);\n const c2 = divNearest(-b1 * k, n);\n // |k1|/|k2| is < sqrt(N), but can be negative.\n // If we do `k1 mod N`, we'll get big scalar (`> sqrt(N)`): so, we do cheaper negation instead.\n let k1 = k - c1 * a1 - c2 * a2;\n let k2 = -c1 * b1 - c2 * b2;\n const k1neg = k1 < _0n;\n const k2neg = k2 < _0n;\n if (k1neg) k1 = -k1;\n if (k2neg) k2 = -k2;\n // Double check that resulting scalar less than half bits of N: otherwise wNAF will fail.\n // This should only happen on wrong basises. Also, math inside is too complex and I don't trust it.\n const MAX_NUM = bitMask(Math.ceil(bitLen(n) / 2)) + _1n; // Half bits of N\n if (k1 < _0n || k1 >= MAX_NUM || k2 < _0n || k2 >= MAX_NUM) {\n throw new Error('splitScalar (endomorphism): failed, k=' + k);\n }\n return { k1neg, k1, k2neg, k2 };\n}\n\nexport type ECDSASigFormat = 'compact' | 'recovered' | 'der';\nexport type ECDSARecoverOpts = {\n prehash?: boolean;\n};\nexport type ECDSAVerifyOpts = {\n prehash?: boolean;\n lowS?: boolean;\n format?: ECDSASigFormat;\n};\nexport type ECDSASignOpts = {\n prehash?: boolean;\n lowS?: boolean;\n format?: ECDSASigFormat;\n extraEntropy?: Uint8Array | boolean;\n};\n\nfunction validateSigFormat(format: string): ECDSASigFormat {\n if (!['compact', 'recovered', 'der'].includes(format))\n throw new Error('Signature format must be \"compact\", \"recovered\", or \"der\"');\n return format as ECDSASigFormat;\n}\n\nfunction validateSigOpts<T extends ECDSASignOpts, D extends Required<ECDSASignOpts>>(\n opts: T,\n def: D\n): Required<ECDSASignOpts> {\n const optsn: ECDSASignOpts = {};\n for (let optName of Object.keys(def)) {\n // @ts-ignore\n optsn[optName] = opts[optName] === undefined ? def[optName] : opts[optName];\n }\n abool(optsn.lowS!, 'lowS');\n abool(optsn.prehash!, 'prehash');\n if (optsn.format !== undefined) validateSigFormat(optsn.format);\n return optsn as Required<ECDSASignOpts>;\n}\n\n/** Instance methods for 3D XYZ projective points. */\nexport interface WeierstrassPoint<T> extends CurvePoint<T, WeierstrassPoint<T>> {\n /** projective X coordinate. Different from affine x. */\n readonly X: T;\n /** projective Y coordinate. Different from affine y. */\n readonly Y: T;\n /** projective z coordinate */\n readonly Z: T;\n /** affine x coordinate. Different from projective X. */\n get x(): T;\n /** affine y coordinate. Different from projective Y. */\n get y(): T;\n /** Encodes point using IEEE P1363 (DER) encoding. First byte is 2/3/4. Default = isCompressed. */\n toBytes(isCompressed?: boolean): Uint8Array;\n toHex(isCompressed?: boolean): string;\n\n /** @deprecated use `.X` */\n readonly px: T;\n /** @deprecated use `.Y` */\n readonly py: T;\n /** @deprecated use `.Z` */\n readonly pz: T;\n /** @deprecated use `toBytes` */\n toRawBytes(isCompressed?: boolean): Uint8Array;\n /** @deprecated use `multiplyUnsafe` */\n multiplyAndAddUnsafe(\n Q: WeierstrassPoint<T>,\n a: bigint,\n b: bigint\n ): WeierstrassPoint<T> | undefined;\n /** @deprecated use `p.y % 2n === 0n` */\n hasEvenY(): boolean;\n /** @deprecated use `p.precompute(windowSize)` */\n _setWindowSize(windowSize: number): void;\n}\n\n/** Static methods for 3D XYZ projective points. */\nexport interface WeierstrassPointCons<T> extends CurvePointCons<WeierstrassPoint<T>> {\n /** Does NOT validate if the point is valid. Use `.assertValidity()`. */\n new (X: T, Y: T, Z: T): WeierstrassPoint<T>;\n CURVE(): WeierstrassOpts<T>;\n /** @deprecated use `Point.BASE.multiply(Point.Fn.fromBytes(privateKey))` */\n fromPrivateKey(privateKey: PrivKey): WeierstrassPoint<T>;\n /** @deprecated use `import { normalizeZ } from '@noble/curves/abstract/curve.js';` */\n normalizeZ(points: WeierstrassPoint<T>[]): WeierstrassPoint<T>[];\n /** @deprecated use `import { pippenger } from '@noble/curves/abstract/curve.js';` */\n msm(points: WeierstrassPoint<T>[], scalars: bigint[]): WeierstrassPoint<T>;\n}\n\n/**\n * Weierstrass curve options.\n *\n * * p: prime characteristic (order) of finite field, in which arithmetics is done\n * * n: order of prime subgroup a.k.a total amount of valid curve points\n * * h: cofactor, usually 1. h*n is group order; n is subgroup order\n * * a: formula param, must be in field of p\n * * b: formula param, must be in field of p\n * * Gx: x coordinate of generator point a.k.a. base point\n * * Gy: y coordinate of generator point\n */\nexport type WeierstrassOpts<T> = Readonly<{\n p: bigint;\n n: bigint;\n h: bigint;\n a: T;\n b: T;\n Gx: T;\n Gy: T;\n}>;\n\n// When a cofactor != 1, there can be an effective methods to:\n// 1. Determine whether a point is torsion-free\n// 2. Clear torsion component\n// wrapPrivateKey: bls12-381 requires mod(n) instead of rejecting keys >= n\nexport type WeierstrassExtraOpts<T> = Partial<{\n Fp: IField<T>;\n Fn: IField<bigint>;\n allowInfinityPoint: boolean;\n endo: EndomorphismOpts;\n isTorsionFree: (c: WeierstrassPointCons<T>, point: WeierstrassPoint<T>) => boolean;\n clearCofactor: (c: WeierstrassPointCons<T>, point: WeierstrassPoint<T>) => WeierstrassPoint<T>;\n fromBytes: (bytes: Uint8Array) => AffinePoint<T>;\n toBytes: (\n c: WeierstrassPointCons<T>,\n point: WeierstrassPoint<T>,\n isCompressed: boolean\n ) => Uint8Array;\n}>;\n\n/**\n * Options for ECDSA signatures over a Weierstrass curve.\n *\n * * lowS: (default: true) whether produced / verified signatures occupy low half of ecdsaOpts.p. Prevents malleability.\n * * hmac: (default: noble-hashes hmac) function, would be used to init hmac-drbg for k generation.\n * * randomBytes: (default: webcrypto os-level CSPRNG) custom method for fetching secure randomness.\n * * bits2int, bits2int_modN: used in sigs, sometimes overridden by curves\n */\nexport type ECDSAOpts = Partial<{\n lowS: boolean;\n hmac: HmacFnSync;\n randomBytes: (bytesLength?: number) => Uint8Array;\n bits2int: (bytes: Uint8Array) => bigint;\n bits2int_modN: (bytes: Uint8Array) => bigint;\n}>;\n\n/**\n * Elliptic Curve Diffie-Hellman interface.\n * Provides keygen, secret-to-public conversion, calculating shared secrets.\n */\nexport interface ECDH {\n keygen: (seed?: Uint8Array) => { secretKey: Uint8Array; publicKey: Uint8Array };\n getPublicKey: (secretKey: PrivKey, isCompressed?: boolean) => Uint8Array;\n getSharedSecret: (secretKeyA: PrivKey, publicKeyB: Hex, isCompressed?: boolean) => Uint8Array;\n Point: WeierstrassPointCons<bigint>;\n utils: {\n isValidSecretKey: (secretKey: PrivKey) => boolean;\n isValidPublicKey: (publicKey: Uint8Array, isCompressed?: boolean) => boolean;\n randomSecretKey: (seed?: Uint8Array) => Uint8Array;\n /** @deprecated use `randomSecretKey` */\n randomPrivateKey: (seed?: Uint8Array) => Uint8Array;\n /** @deprecated use `isValidSecretKey` */\n isValidPrivateKey: (secretKey: PrivKey) => boolean;\n /** @deprecated use `Point.Fn.fromBytes()` */\n normPrivateKeyToScalar: (key: PrivKey) => bigint;\n /** @deprecated use `point.precompute()` */\n precompute: (windowSize?: number, point?: WeierstrassPoint<bigint>) => WeierstrassPoint<bigint>;\n };\n lengths: CurveLengths;\n}\n\n/**\n * ECDSA interface.\n * Only supported for prime fields, not Fp2 (extension fields).\n */\nexport interface ECDSA extends ECDH {\n sign: (message: Hex, secretKey: PrivKey, opts?: ECDSASignOpts) => ECDSASigRecovered;\n verify: (\n signature: Uint8Array,\n message: Uint8Array,\n publicKey: Uint8Array,\n opts?: ECDSAVerifyOpts\n ) => boolean;\n recoverPublicKey(signature: Uint8Array, message: Uint8Array, opts?: ECDSARecoverOpts): Uint8Array;\n Signature: ECDSASignatureCons;\n}\nexport class DERErr extends Error {\n constructor(m = '') {\n super(m);\n }\n}\nexport type IDER = {\n // asn.1 DER encoding utils\n Err: typeof DERErr;\n // Basic building block is TLV (Tag-Length-Value)\n _tlv: {\n encode: (tag: number, data: string) => string;\n // v - value, l - left bytes (unparsed)\n decode(tag: number, data: Uint8Array): { v: Uint8Array; l: Uint8Array };\n };\n // https://crypto.stackexchange.com/a/57734 Leftmost bit of first byte is 'negative' flag,\n // since we always use positive integers here. It must always be empty:\n // - add zero byte if exists\n // - if next byte doesn't have a flag, leading zero is not allowed (minimal encoding)\n _int: {\n encode(num: bigint): string;\n decode(data: Uint8Array): bigint;\n };\n toSig(hex: string | Uint8Array): { r: bigint; s: bigint };\n hexFromSig(sig: { r: bigint; s: bigint }): string;\n};\n/**\n * ASN.1 DER encoding utilities. ASN is very complex & fragile. Format:\n *\n * [0x30 (SEQUENCE), bytelength, 0x02 (INTEGER), intLength, R, 0x02 (INTEGER), intLength, S]\n *\n * Docs: https://letsencrypt.org/docs/a-warm-welcome-to-asn1-and-der/, https://luca.ntop.org/Teaching/Appunti/asn1.html\n */\nexport const DER: IDER = {\n // asn.1 DER encoding utils\n Err: DERErr,\n // Basic building block is TLV (Tag-Length-Value)\n _tlv: {\n encode: (tag: number, data: string): string => {\n const { Err: E } = DER;\n if (tag < 0 || tag > 256) throw new E('tlv.encode: wrong tag');\n if (data.length & 1) throw new E('tlv.encode: unpadded data');\n const dataLen = data.length / 2;\n const len = numberToHexUnpadded(dataLen);\n if ((len.length / 2) & 0b1000_0000) throw new E('tlv.encode: long form length too big');\n // length of length with long form flag\n const lenLen = dataLen > 127 ? numberToHexUnpadded((len.length / 2) | 0b1000_0000) : '';\n const t = numberToHexUnpadded(tag);\n return t + lenLen + len + data;\n },\n // v - value, l - left bytes (unparsed)\n decode(tag: number, data: Uint8Array): { v: Uint8Array; l: Uint8Array } {\n const { Err: E } = DER;\n let pos = 0;\n if (tag < 0 || tag > 256) throw new E('tlv.encode: wrong tag');\n if (data.length < 2 || data[pos++] !== tag) throw new E('tlv.decode: wrong tlv');\n const first = data[pos++];\n const isLong = !!(first & 0b1000_0000); // First bit of first length byte is flag for short/long form\n let length = 0;\n if (!isLong) length = first;\n else {\n // Long form: [longFlag(1bit), lengthLength(7bit), length (BE)]\n const lenLen = first & 0b0111_1111;\n if (!lenLen) throw new E('tlv.decode(long): indefinite length not supported');\n if (lenLen > 4) throw new E('tlv.decode(long): byte length is too big'); // this will overflow u32 in js\n const lengthBytes = data.subarray(pos, pos + lenLen);\n if (lengthBytes.length !== lenLen) throw new E('tlv.decode: length bytes not complete');\n if (lengthBytes[0] === 0) throw new E('tlv.decode(long): zero leftmost byte');\n for (const b of lengthBytes) length = (length << 8) | b;\n pos += lenLen;\n if (length < 128) throw new E('tlv.decode(long): not minimal encoding');\n }\n const v = data.subarray(pos, pos + length);\n if (v.length !== length) throw new E('tlv.decode: wrong value length');\n return { v, l: data.subarray(pos + length) };\n },\n },\n // https://crypto.stackexchange.com/a/57734 Leftmost bit of first byte is 'negative' flag,\n // since we always use positive integers here. It must always be empty:\n // - add zero byte if exists\n // - if next byte doesn't have a flag, leading zero is not allowed (minimal encoding)\n _int: {\n encode(num: bigint): string {\n const { Err: E } = DER;\n if (num < _0n) throw new E('integer: negative integers are not allowed');\n let hex = numberToHexUnpadded(num);\n // Pad with zero byte if negative flag is present\n if (Number.parseInt(hex[0], 16) & 0b1000) hex = '00' + hex;\n if (hex.length & 1) throw new E('unexpected DER parsing assertion: unpadded hex');\n return hex;\n },\n decode(data: Uint8Array): bigint {\n const { Err: E } = DER;\n if (data[0] & 0b1000_0000) throw new E('invalid signature integer: negative');\n if (data[0] === 0x00 && !(data[1] & 0b1000_0000))\n throw new E('invalid signature integer: unnecessary leading zero');\n return bytesToNumberBE(data);\n },\n },\n toSig(hex: string | Uint8Array): { r: bigint; s: bigint } {\n // parse DER signature\n const { Err: E, _int: int, _tlv: tlv } = DER;\n const data = ensureBytes('signature', hex);\n const { v: seqBytes, l: seqLeftBytes } = tlv.decode(0x30, data);\n if (seqLeftBytes.length) throw new E('invalid signature: left bytes after parsing');\n const { v: rBytes, l: rLeftBytes } = tlv.decode(0x02, seqBytes);\n const { v: sBytes, l: sLeftBytes } = tlv.decode(0x02, rLeftBytes);\n if (sLeftBytes.length) throw new E('invalid signature: left bytes after parsing');\n return { r: int.decode(rBytes), s: int.decode(sBytes) };\n },\n hexFromSig(sig: { r: bigint; s: bigint }): string {\n const { _tlv: tlv, _int: int } = DER;\n const rs = tlv.encode(0x02, int.encode(sig.r));\n const ss = tlv.encode(0x02, int.encode(sig.s));\n const seq = rs + ss;\n return tlv.encode(0x30, seq);\n },\n};\n\n// Be friendly to bad ECMAScript parsers by not using bigint literals\n// prettier-ignore\nconst _0n = BigInt(0), _1n = BigInt(1), _2n = BigInt(2), _3n = BigInt(3), _4n = BigInt(4);\n\nexport function _normFnElement(Fn: IField<bigint>, key: PrivKey): bigint {\n const { BYTES: expected } = Fn;\n let num: bigint;\n if (typeof key === 'bigint') {\n num = key;\n } else {\n let bytes = ensureBytes('private key', key);\n try {\n num = Fn.fromBytes(bytes);\n } catch (error) {\n throw new Error(`invalid private key: expected ui8a of size ${expected}, got ${typeof key}`);\n }\n }\n if (!Fn.isValidNot0(num)) throw new Error('invalid private key: out of range [1..N-1]');\n return num;\n}\n\n/**\n * Creates weierstrass Point constructor, based on specified curve options.\n *\n * @example\n```js\nconst opts = {\n p: BigInt('0xffffffff00000001000000000000000000000000ffffffffffffffffffffffff'),\n n: BigInt('0xffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551'),\n h: BigInt(1),\n a: BigInt('0xffffffff00000001000000000000000000000000fffffffffffffffffffffffc'),\n b: BigInt('0x5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b'),\n Gx: BigInt('0x6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296'),\n Gy: BigInt('0x4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5'),\n};\nconst p256_Point = weierstrass(opts);\n```\n */\nexport function weierstrassN<T>(\n params: WeierstrassOpts<T>,\n extraOpts: WeierstrassExtraOpts<T> = {}\n): WeierstrassPointCons<T> {\n const validated = _createCurveFields('weierstrass', params, extraOpts);\n const { Fp, Fn } = validated;\n let CURVE = validated.CURVE as WeierstrassOpts<T>;\n const { h: cofactor, n: CURVE_ORDER } = CURVE;\n _validateObject(\n extraOpts,\n {},\n {\n allowInfinityPoint: 'boolean',\n clearCofactor: 'function',\n isTorsionFree: 'function',\n fromBytes: 'function',\n toBytes: 'function',\n endo: 'object',\n wrapPrivateKey: 'boolean',\n }\n );\n\n const { endo } = extraOpts;\n if (endo) {\n // validateObject(endo, { beta: 'bigint', splitScalar: 'function' });\n if (!Fp.is0(CURVE.a) || typeof endo.beta !== 'bigint' || !Array.isArray(endo.basises)) {\n throw new Error('invalid endo: expected \"beta\": bigint and \"basises\": array');\n }\n }\n\n const lengths = getWLengths(Fp, Fn);\n\n function assertCompressionIsSupported() {\n if (!Fp.isOdd) throw new Error('compression is not supported: Field does not have .isOdd()');\n }\n\n // Implements IEEE P1363 point encoding\n function pointToBytes(\n _c: WeierstrassPointCons<T>,\n point: WeierstrassPoint<T>,\n isCompressed: boolean\n ): Uint8Array {\n const { x, y } = point.toAffine();\n const bx = Fp.toBytes(x);\n abool(isCompressed, 'isCompressed');\n if (isCompressed) {\n assertCompressionIsSupported();\n const hasEvenY = !Fp.isOdd!(y);\n return concatBytes(pprefix(hasEvenY), bx);\n } else {\n return concatBytes(Uint8Array.of(0x04), bx, Fp.toBytes(y));\n }\n }\n function pointFromBytes(bytes: Uint8Array) {\n abytes(bytes, undefined, 'Point');\n const { publicKey: comp, publicKeyUncompressed: uncomp } = lengths; // e.g. for 32-byte: 33, 65\n const length = bytes.length;\n const head = bytes[0];\n const tail = bytes.subarray(1);\n // No actual validation is done here: use .assertValidity()\n if (length === comp && (head === 0x02 || head === 0x03)) {\n const x = Fp.fromBytes(tail);\n if (!Fp.isValid(x)) throw new Error('bad point: is not on curve, wrong x');\n const y2 = weierstrassEquation(x); // y\u00B2 = x\u00B3 + ax + b\n let y: T;\n try {\n y = Fp.sqrt(y2); // y = y\u00B2 ^ (p+1)/4\n } catch (sqrtError) {\n const err = sqrtError instanceof Error ? ': ' + sqrtError.message : '';\n throw new Error('bad point: is not on curve, sqrt error' + err);\n }\n assertCompressionIsSupported();\n const isYOdd = Fp.isOdd!(y); // (y & _1n) === _1n;\n const isHeadOdd = (head & 1) === 1; // ECDSA-specific\n if (isHeadOdd !== isYOdd) y = Fp.neg(y);\n return { x, y };\n } else if (length === uncomp && head === 0x04) {\n // TODO: more checks\n const L = Fp.BYTES;\n const x = Fp.fromBytes(tail.subarray(0, L));\n const y = Fp.fromBytes(tail.subarray(L, L * 2));\n if (!isValidXY(x, y)) throw new Error('bad point: is not on curve');\n return { x, y };\n } else {\n throw new Error(\n `bad point: got length ${length}, expected compressed=${comp} or uncompressed=${uncomp}`\n );\n }\n }\n\n const encodePoint = extraOpts.toBytes || pointToBytes;\n const decodePoint = extraOpts.fromBytes || pointFromBytes;\n function weierstrassEquation(x: T): T {\n const x2 = Fp.sqr(x); // x * x\n const x3 = Fp.mul(x2, x); // x\u00B2 * x\n return Fp.add(Fp.add(x3, Fp.mul(x, CURVE.a)), CURVE.b); // x\u00B3 + a * x + b\n }\n\n // TODO: move top-level\n /** Checks whether equation holds for given x, y: y\u00B2 == x\u00B3 + ax + b */\n function isValidXY(x: T, y: T): boolean {\n const left = Fp.sqr(y); // y\u00B2\n const right = weierstrassEquation(x); // x\u00B3 + ax + b\n return Fp.eql(left, right);\n }\n\n // Validate whether the passed curve params are valid.\n // Test 1: equation y\u00B2 = x\u00B3 + ax + b should work for generator point.\n if (!isValidXY(CURVE.Gx, CURVE.Gy)) throw new Error('bad curve params: generator point');\n\n // Test 2: discriminant \u0394 part should be non-zero: 4a\u00B3 + 27b\u00B2 != 0.\n // Guarantees curve is genus-1, smooth (non-singular).\n const _4a3 = Fp.mul(Fp.pow(CURVE.a, _3n), _4n);\n const _27b2 = Fp.mul(Fp.sqr(CURVE.b), BigInt(27));\n if (Fp.is0(Fp.add(_4a3, _27b2))) throw new Error('bad curve params: a or b');\n\n /** Asserts coordinate is valid: 0 <= n < Fp.ORDER. */\n function acoord(title: string, n: T, banZero = false) {\n if (!Fp.isValid(n) || (banZero && Fp.is0(n))) throw new Error(`bad point coordinate ${title}`);\n return n;\n }\n\n function aprjpoint(other: unknown) {\n if (!(other instanceof Point)) throw new Error('ProjectivePoint expected');\n }\n\n function splitEndoScalarN(k: bigint) {\n if (!endo || !endo.basises) throw new Error('no endo');\n return _splitEndoScalar(k, endo.basises, Fn.ORDER);\n }\n\n // Memoized toAffine / validity check. They are heavy. Points are immutable.\n\n // Converts Projective point to affine (x, y) coordinates.\n // Can accept precomputed Z^-1 - for example, from invertBatch.\n // (X, Y, Z) \u220B (x=X/Z, y=Y/Z)\n const toAffineMemo = memoized((p: Point, iz?: T): AffinePoint<T> => {\n const { X, Y, Z } = p;\n // Fast-path for normalized points\n if (Fp.eql(Z, Fp.ONE)) return { x: X, y: Y };\n const is0 = p.is0();\n // If invZ was 0, we return zero point. However we still want to execute\n // all operations, so we replace invZ with a random number, 1.\n if (iz == null) iz = is0 ? Fp.ONE : Fp.inv(Z);\n const x = Fp.mul(X, iz);\n const y = Fp.mul(Y, iz);\n const zz = Fp.mul(Z, iz);\n if (is0) return { x: Fp.ZERO, y: Fp.ZERO };\n if (!Fp.eql(zz, Fp.ONE)) throw new Error('invZ was invalid');\n return { x, y };\n });\n // NOTE: on exception this will crash 'cached' and no value will be set.\n // Otherwise true will be return\n const assertValidMemo = memoized((p: Point) => {\n if (p.is0()) {\n // (0, 1, 0) aka ZERO is invalid in most contexts.\n // In BLS, ZERO can be serialized, so we allow it.\n // (0, 0, 0) is invalid representation of ZERO.\n if (extraOpts.allowInfinityPoint && !Fp.is0(p.Y)) return;\n throw new Error('bad point: ZERO');\n }\n // Some 3rd-party test vectors require different wording between here & `fromCompressedHex`\n const { x, y } = p.toAffine();\n if (!Fp.isValid(x) || !Fp.isValid(y)) throw new Error('bad point: x or y not field elements');\n if (!isValidXY(x, y)) throw new Error('bad point: equation left != right');\n if (!p.isTorsionFree()) throw new Error('bad point: not in prime-order subgroup');\n return true;\n });\n\n function finishEndo(\n endoBeta: EndomorphismOpts['beta'],\n k1p: Point,\n k2p: Point,\n k1neg: boolean,\n k2neg: boolean\n ) {\n k2p = new Point(Fp.mul(k2p.X, endoBeta), k2p.Y, k2p.Z);\n k1p = negateCt(k1neg, k1p);\n k2p = negateCt(k2neg, k2p);\n return k1p.add(k2p);\n }\n\n /**\n * Projective Point works in 3d / projective (homogeneous) coordinates:(X, Y, Z) \u220B (x=X/Z, y=Y/Z).\n * Default Point works in 2d / affine coordinates: (x, y).\n * We're doing calculations in projective, because its operations don't require costly inversion.\n */\n class Point implements WeierstrassPoint<T> {\n // base / generator point\n static readonly BASE = new Point(CURVE.Gx, CURVE.Gy, Fp.ONE);\n // zero / infinity / identity point\n static readonly ZERO = new Point(Fp.ZERO, Fp.ONE, Fp.ZERO); // 0, 1, 0\n // math field\n static readonly Fp = Fp;\n // scalar field\n static readonly Fn = Fn;\n\n readonly X: T;\n readonly Y: T;\n readonly Z: T;\n\n /** Does NOT validate if the point is valid. Use `.assertValidity()`. */\n constructor(X: T, Y: T, Z: T) {\n this.X = acoord('x', X);\n this.Y = acoord('y', Y, true);\n this.Z = acoord('z', Z);\n Object.freeze(this);\n }\n\n static CURVE(): WeierstrassOpts<T> {\n return CURVE;\n }\n\n /** Does NOT validate if the point is valid. Use `.assertValidity()`. */\n static fromAffine(p: AffinePoint<T>): Point {\n const { x, y } = p || {};\n if (!p || !Fp.isValid(x) || !Fp.isValid(y)) throw new Error('invalid affine point');\n if (p instanceof Point) throw new Error('projective point not allowed');\n // (0, 0) would've produced (0, 0, 1) - instead, we need (0, 1, 0)\n if (Fp.is0(x) && Fp.is0(y)) return Point.ZERO;\n return new Point(x, y, Fp.ONE);\n }\n\n static fromBytes(bytes: Uint8Array): Point {\n const P = Point.fromAffine(decodePoint(abytes(bytes, undefined, 'point')));\n P.assertValidity();\n return P;\n }\n static fromHex(hex: Hex): Point {\n return Point.fromBytes(ensureBytes('pointHex', hex));\n }\n\n get x(): T {\n return this.toAffine().x;\n }\n get y(): T {\n return this.toAffine().y;\n }\n\n /**\n *\n * @param windowSize\n * @param isLazy true will defer table computation until the first multiplication\n * @returns\n */\n precompute(windowSize: number = 8, isLazy = true): Point {\n wnaf.createCache(this, windowSize);\n if (!isLazy) this.multiply(_3n); // random number\n return this;\n }\n\n // TODO: return `this`\n /** A point on curve is valid if it conforms to equation. */\n assertValidity(): void {\n assertValidMemo(this);\n }\n\n hasEvenY(): boolean {\n const { y } = this.toAffine();\n if (!Fp.isOdd) throw new Error(\"Field doesn't support isOdd\");\n return !Fp.isOdd(y);\n }\n\n /** Compare one point to another. */\n equals(other: Point): boolean {\n aprjpoint(other);\n const { X: X1, Y: Y1, Z: Z1 } = this;\n const { X: X2, Y: Y2, Z: Z2 } = other;\n const U1 = Fp.eql(Fp.mul(X1, Z2), Fp.mul(X2, Z1));\n const U2 = Fp.eql(Fp.mul(Y1, Z2), Fp.mul(Y2, Z1));\n return U1 && U2;\n }\n\n /** Flips point to one corresponding to (x, -y) in Affine coordinates. */\n negate(): Point {\n return new Point(this.X, Fp.neg(this.Y), this.Z);\n }\n\n // Renes-Costello-Batina exception-free doubling formula.\n // There is 30% faster Jacobian formula, but it is not complete.\n // https://eprint.iacr.org/2015/1060, algorithm 3\n // Cost: 8M + 3S + 3*a + 2*b3 + 15add.\n double() {\n const { a, b } = CURVE;\n const b3 = Fp.mul(b, _3n);\n const { X: X1, Y: Y1, Z: Z1 } = this;\n let X3 = Fp.ZERO, Y3 = Fp.ZERO, Z3 = Fp.ZERO; // prettier-ignore\n let t0 = Fp.mul(X1, X1); // step 1\n let t1 = Fp.mul(Y1, Y1);\n let t2 = Fp.mul(Z1, Z1);\n let t3 = Fp.mul(X1, Y1);\n t3 = Fp.add(t3, t3); // step 5\n Z3 = Fp.mul(X1, Z1);\n Z3 = Fp.add(Z3, Z3);\n X3 = Fp.mul(a, Z3);\n Y3 = Fp.mul(b3, t2);\n Y3 = Fp.add(X3, Y3); // step 10\n X3 = Fp.sub(t1, Y3);\n Y3 = Fp.add(t1, Y3);\n Y3 = Fp.mul(X3, Y3);\n X3 = Fp.mul(t3, X3);\n Z3 = Fp.mul(b3, Z3); // step 15\n t2 = Fp.mul(a, t2);\n t3 = Fp.sub(t0, t2);\n t3 = Fp.mul(a, t3);\n t3 = Fp.add(t3, Z3);\n Z3 = Fp.add(t0, t0); // step 20\n t0 = Fp.add(Z3, t0);\n t0 = Fp.add(t0, t2);\n t0 = Fp.mul(t0, t3);\n Y3 = Fp.add(Y3, t0);\n t2 = Fp.mul(Y1, Z1); // step 25\n t2 = Fp.add(t2, t2);\n t0 = Fp.mul(t2, t3);\n X3 = Fp.sub(X3, t0);\n Z3 = Fp.mul(t2, t1);\n Z3 = Fp.add(Z3, Z3); // step 30\n Z3 = Fp.add(Z3, Z3);\n return new Point(X3, Y3, Z3);\n }\n\n // Renes-Costello-Batina exception-free addition formula.\n // There is 30% faster Jacobian formula, but it is not complete.\n // https://eprint.iacr.org/2015/1060, algorithm 1\n // Cost: 12M + 0S + 3*a + 3*b3 + 23add.\n add(other: Point): Point {\n aprjpoint(other);\n const { X: X1, Y: Y1, Z: Z1 } = this;\n const { X: X2, Y: Y2, Z: Z2 } = other;\n let X3 = Fp.ZERO, Y3 = Fp.ZERO, Z3 = Fp.ZERO; // prettier-ignore\n const a = CURVE.a;\n const b3 = Fp.mul(CURVE.b, _3n);\n let t0 = Fp.mul(X1, X2); // step 1\n let t1 = Fp.mul(Y1, Y2);\n let t2 = Fp.mul(Z1, Z2);\n let t3 = Fp.add(X1, Y1);\n let t4 = Fp.add(X2, Y2); // step 5\n t3 = Fp.mul(t3, t4);\n t4 = Fp.add(t0, t1);\n t3 = Fp.sub(t3, t4);\n t4 = Fp.add(X1, Z1);\n let t5 = Fp.add(X2, Z2); // step 10\n t4 = Fp.mul(t4, t5);\n t5 = Fp.add(t0, t2);\n t4 = Fp.sub(t4, t5);\n t5 = Fp.add(Y1, Z1);\n X3 = Fp.add(Y2, Z2); // step 15\n t5 = Fp.mul(t5, X3);\n X3 = Fp.add(t1, t2);\n t5 = Fp.sub(t5, X3);\n Z3 = Fp.mul(a, t4);\n X3 = Fp.mul(b3, t2); // step 20\n Z3 = Fp.add(X3, Z3);\n X3 = Fp.sub(t1, Z3);\n Z3 = Fp.add(t1, Z3);\n Y3 = Fp.mul(X3, Z3);\n t1 = Fp.add(t0, t0); // step 25\n t1 = Fp.add(t1, t0);\n t2 = Fp.mul(a, t2);\n t4 = Fp.mul(b3, t4);\n t1 = Fp.add(t1, t2);\n t2 = Fp.sub(t0, t2); // step 30\n t2 = Fp.mul(a, t2);\n t4 = Fp.add(t4, t2);\n t0 = Fp.mul(t1, t4);\n Y3 = Fp.add(Y3, t0);\n t0 = Fp.mul(t5, t4); // step 35\n X3 = Fp.mul(t3, X3);\n X3 = Fp.sub(X3, t0);\n t0 = Fp.mul(t3, t1);\n Z3 = Fp.mul(t5, Z3);\n Z3 = Fp.add(Z3, t0); // step 40\n return new Point(X3, Y3, Z3);\n }\n\n subtract(other: Point) {\n return this.add(other.negate());\n }\n\n is0(): boolean {\n return this.equals(Point.ZERO);\n }\n\n /**\n * Constant time multiplication.\n * Uses wNAF method. Windowed method may be 10% faster,\n * but takes 2x longer to generate and consumes 2x memory.\n * Uses precomputes when available.\n * Uses endomorphism for Koblitz curves.\n * @param scalar by which the point would be multiplied\n * @returns New point\n */\n multiply(scalar: bigint): Point {\n const { endo } = extraOpts;\n if (!Fn.isValidNot0(scalar)) throw new Error('invalid scalar: out of range'); // 0 is invalid\n let point: Point, fake: Point; // Fake point is used to const-time mult\n const mul = (n: bigint) => wnaf.cached(this, n, (p) => normalizeZ(Point, p));\n /** See docs for {@link EndomorphismOpts} */\n if (endo) {\n const { k1neg, k1, k2neg, k2 } = splitEndoScalarN(scalar);\n const { p: k1p, f: k1f } = mul(k1);\n const { p: k2p, f: k2f } = mul(k2);\n fake = k1f.add(k2f);\n point = finishEndo(endo.beta, k1p, k2p, k1neg, k2neg);\n } else {\n const { p, f } = mul(scalar);\n point = p;\n fake = f;\n }\n // Normalize `z` for both points, but return only real one\n return normalizeZ(Point, [point, fake])[0];\n }\n\n /**\n * Non-constant-time multiplication. Uses double-and-add algorithm.\n * It's faster, but should only be used when you don't care about\n * an exposed secret key e.g. sig verification, which works over *public* keys.\n */\n multiplyUnsafe(sc: bigint): Point {\n const { endo } = extraOpts;\n const p = this as Point;\n if (!Fn.isValid(sc)) throw new Error('invalid scalar: out of range'); // 0 is valid\n if (sc === _0n || p.is0()) return Point.ZERO;\n if (sc === _1n) return p; // fast-path\n if (wnaf.hasCache(this)) return this.multiply(sc);\n if (endo) {\n const { k1neg, k1, k2neg, k2 } = splitEndoScalarN(sc);\n const { p1, p2 } = mulEndoUnsafe(Point, p, k1, k2); // 30% faster vs wnaf.unsafe\n return finishEndo(endo.beta, p1, p2, k1neg, k2neg);\n } else {\n return wnaf.unsafe(p, sc);\n }\n }\n\n multiplyAndAddUnsafe(Q: Point, a: bigint, b: bigint): Point | undefined {\n const sum = this.multiplyUnsafe(a).add(Q.multiplyUnsafe(b));\n return sum.is0() ? undefined : sum;\n }\n\n /**\n * Converts Projective point to affine (x, y) coordinates.\n * @param invertedZ Z^-1 (inverted zero) - optional, precomputation is useful for invertBatch\n */\n toAffine(invertedZ?: T): AffinePoint<T> {\n return toAffineMemo(this, invertedZ);\n }\n\n /**\n * Checks whether Point is free of torsion elements (is in prime subgroup).\n * Always torsion-free for cofactor=1 curves.\n */\n isTorsionFree(): boolean {\n const { isTorsionFree } = extraOpts;\n if (cofactor === _1n) return true;\n if (isTorsionFree) return isTorsionFree(Point, this);\n return wnaf.unsafe(this, CURVE_ORDER).is0();\n }\n\n clearCofactor(): Point {\n const { clearCofactor } = extraOpts;\n if (cofactor === _1n) return this; // Fast-path\n if (clearCofactor) return clearCofactor(Point, this) as Point;\n return this.multiplyUnsafe(cofactor);\n }\n\n isSmallOrder(): boolean {\n // can we use this.clearCofactor()?\n return this.multiplyUnsafe(cofactor).is0();\n }\n\n toBytes(isCompressed = true): Uint8Array {\n abool(isCompressed, 'isCompressed');\n this.assertValidity();\n return encodePoint(Point, this, isCompressed);\n }\n\n toHex(isCompressed = true): string {\n return bytesToHex(this.toBytes(isCompressed));\n }\n\n toString() {\n return `<Point ${this.is0() ? 'ZERO' : this.toHex()}>`;\n }\n\n // TODO: remove\n get px(): T {\n return this.X;\n }\n get py(): T {\n return this.X;\n }\n get pz(): T {\n return this.Z;\n }\n toRawBytes(isCompressed = true): Uint8Array {\n return this.toBytes(isCompressed);\n }\n _setWindowSize(windowSize: number) {\n this.precompute(windowSize);\n }\n static normalizeZ(points: Point[]): Point[] {\n return normalizeZ(Point, points);\n }\n static msm(points: Point[], scalars: bigint[]): Point {\n return pippenger(Point, Fn, points, scalars);\n }\n static fromPrivateKey(privateKey: PrivKey) {\n return Point.BASE.multiply(_normFnElement(Fn, privateKey));\n }\n }\n const bits = Fn.BITS;\n const wnaf = new wNAF(Point, extraOpts.endo ? Math.ceil(bits / 2) : bits);\n Point.BASE.precompute(8); // Enable precomputes. Slows down first publicKey computation by 20ms.\n return Point;\n}\n\n/** Methods of ECDSA signature instance. */\nexport interface ECDSASignature {\n readonly r: bigint;\n readonly s: bigint;\n readonly recovery?: number;\n addRecoveryBit(recovery: number): ECDSASigRecovered;\n hasHighS(): boolean;\n toBytes(format?: string): Uint8Array;\n toHex(format?: string): string;\n\n /** @deprecated */\n assertValidity(): void;\n /** @deprecated */\n normalizeS(): ECDSASignature;\n /** @deprecated use standalone method `curve.recoverPublicKey(sig.toBytes('recovered'), msg)` */\n recoverPublicKey(msgHash: Hex): WeierstrassPoint<bigint>;\n /** @deprecated use `.toBytes('compact')` */\n toCompactRawBytes(): Uint8Array;\n /** @deprecated use `.toBytes('compact')` */\n toCompactHex(): string;\n /** @deprecated use `.toBytes('der')` */\n toDERRawBytes(): Uint8Array;\n /** @deprecated use `.toBytes('der')` */\n toDERHex(): string;\n}\nexport type ECDSASigRecovered = ECDSASignature & {\n readonly recovery: number;\n};\n/** Methods of ECDSA signature constructor. */\nexport type ECDSASignatureCons = {\n new (r: bigint, s: bigint, recovery?: number): ECDSASignature;\n fromBytes(bytes: Uint8Array, format?: ECDSASigFormat): ECDSASignature;\n fromHex(hex: string, format?: ECDSASigFormat): ECDSASignature;\n\n /** @deprecated use `.fromBytes(bytes, 'compact')` */\n fromCompact(hex: Hex): ECDSASignature;\n /** @deprecated use `.fromBytes(bytes, 'der')` */\n fromDER(hex: Hex): ECDSASignature;\n};\n\n// Points start with byte 0x02 when y is even; otherwise 0x03\nfunction pprefix(hasEvenY: boolean): Uint8Array {\n return Uint8Array.of(hasEvenY ? 0x02 : 0x03);\n}\n\n/**\n * Implementation of the Shallue and van de Woestijne method for any weierstrass curve.\n * TODO: check if there is a way to merge this with uvRatio in Edwards; move to modular.\n * b = True and y = sqrt(u / v) if (u / v) is square in F, and\n * b = False and y = sqrt(Z * (u / v)) otherwise.\n * @param Fp\n * @param Z\n * @returns\n */\nexport function SWUFpSqrtRatio<T>(\n Fp: IField<T>,\n Z: T\n): (u: T, v: T) => { isValid: boolean; value: T } {\n // Generic implementation\n const q = Fp.ORDER;\n let l = _0n;\n for (let o = q - _1n; o % _2n === _0n; o /= _2n) l += _1n;\n const c1 = l; // 1. c1, the largest integer such that 2^c1 divides q - 1.\n // We need 2n ** c1 and 2n ** (c1-1). We can't use **; but we can use <<.\n // 2n ** c1 == 2n << (c1-1)\n const _2n_pow_c1_1 = _2n << (c1 - _1n - _1n);\n const _2n_pow_c1 = _2n_pow_c1_1 * _2n;\n const c2 = (q - _1n) / _2n_pow_c1; // 2. c2 = (q - 1) / (2^c1) # Integer arithmetic\n const c3 = (c2 - _1n) / _2n; // 3. c3 = (c2 - 1) / 2 # Integer arithmetic\n const c4 = _2n_pow_c1 - _1n; // 4. c4 = 2^c1 - 1 # Integer arithmetic\n const c5 = _2n_pow_c1_1; // 5. c5 = 2^(c1 - 1) # Integer arithmetic\n const c6 = Fp.pow(Z, c2); // 6. c6 = Z^c2\n const c7 = Fp.pow(Z, (c2 + _1n) / _2n); // 7. c7 = Z^((c2 + 1) / 2)\n let sqrtRatio = (u: T, v: T): { isValid: boolean; value: T } => {\n let tv1 = c6; // 1. tv1 = c6\n let tv2 = Fp.pow(v, c4); // 2. tv2 = v^c4\n let tv3 = Fp.sqr(tv2); // 3. tv3 = tv2^2\n tv3 = Fp.mul(tv3, v); // 4. tv3 = tv3 * v\n let tv5 = Fp.mul(u, tv3); // 5. tv5 = u * tv3\n tv5 = Fp.pow(tv5, c3); // 6. tv5 = tv5^c3\n tv5 = Fp.mul(tv5, tv2); // 7. tv5 = tv5 * tv2\n tv2 = Fp.mul(tv5, v); // 8. tv2 = tv5 * v\n tv3 = Fp.mul(tv5, u); // 9. tv3 = tv5 * u\n let tv4 = Fp.mul(tv3, tv2); // 10. tv4 = tv3 * tv2\n tv5 = Fp.pow(tv4, c5); // 11. tv5 = tv4^c5\n let isQR = Fp.eql(tv5, Fp.ONE); // 12. isQR = tv5 == 1\n tv2 = Fp.mul(tv3, c7); // 13. tv2 = tv3 * c7\n tv5 = Fp.mul(tv4, tv1); // 14. tv5 = tv4 * tv1\n tv3 = Fp.cmov(tv2, tv3, isQR); // 15. tv3 = CMOV(tv2, tv3, isQR)\n tv4 = Fp.cmov(tv5, tv4, isQR); // 16. tv4 = CMOV(tv5, tv4, isQR)\n // 17. for i in (c1, c1 - 1, ..., 2):\n for (let i = c1; i > _1n; i--) {\n let tv5 = i - _2n; // 18. tv5 = i - 2\n tv5 = _2n << (tv5 - _1n); // 19. tv5 = 2^tv5\n let tvv5 = Fp.pow(tv4, tv5); // 20. tv5 = tv4^tv5\n const e1 = Fp.eql(tvv5, Fp.ONE); // 21. e1 = tv5 == 1\n tv2 = Fp.mul(tv3, tv1); // 22. tv2 = tv3 * tv1\n tv1 = Fp.mul(tv1, tv1); // 23. tv1 = tv1 * tv1\n tvv5 = Fp.mul(tv4, tv1); // 24. tv5 = tv4 * tv1\n tv3 = Fp.cmov(tv2, tv3, e1); // 25. tv3 = CMOV(tv2, tv3, e1)\n tv4 = Fp.cmov(tvv5, tv4, e1); // 26. tv4 = CMOV(tv5, tv4, e1)\n }\n return { isValid: isQR, value: tv3 };\n };\n if (Fp.ORDER % _4n === _3n) {\n // sqrt_ratio_3mod4(u, v)\n const c1 = (Fp.ORDER - _3n) / _4n; // 1. c1 = (q - 3) / 4 # Integer arithmetic\n const c2 = Fp.sqrt(Fp.neg(Z)); // 2. c2 = sqrt(-Z)\n sqrtRatio = (u: T, v: T) => {\n let tv1 = Fp.sqr(v); // 1. tv1 = v^2\n const tv2 = Fp.mul(u, v); // 2. tv2 = u * v\n tv1 = Fp.mul(tv1, tv2); // 3. tv1 = tv1 * tv2\n let y1 = Fp.pow(tv1, c1); // 4. y1 = tv1^c1\n y1 = Fp.mul(y1, tv2); // 5. y1 = y1 * tv2\n const y2 = Fp.mul(y1, c2); // 6. y2 = y1 * c2\n const tv3 = Fp.mul(Fp.sqr(y1), v); // 7. tv3 = y1^2; 8. tv3 = tv3 * v\n const isQR = Fp.eql(tv3, u); // 9. isQR = tv3 == u\n let y = Fp.cmov(y2, y1, isQR); // 10. y = CMOV(y2, y1, isQR)\n return { isValid: isQR, value: y }; // 11. return (isQR, y) isQR ? y : y*c2\n };\n }\n // No curves uses that\n // if (Fp.ORDER % _8n === _5n) // sqrt_ratio_5mod8\n return sqrtRatio;\n}\n/**\n * Simplified Shallue-van de Woestijne-Ulas Method\n * https://www.rfc-editor.org/rfc/rfc9380#section-6.6.2\n */\nexport function mapToCurveSimpleSWU<T>(\n Fp: IField<T>,\n opts: {\n A: T;\n B: T;\n Z: T;\n }\n): (u: T) => { x: T; y: T } {\n validateField(Fp);\n const { A, B, Z } = opts;\n if (!Fp.isValid(A) || !Fp.isValid(B) || !Fp.isValid(Z))\n throw new Error('mapToCurveSimpleSWU: invalid opts');\n const sqrtRatio = SWUFpSqrtRatio(Fp, Z);\n if (!Fp.isOdd) throw new Error('Field does not have .isOdd()');\n // Input: u, an element of F.\n // Output: (x, y), a point on E.\n return (u: T): { x: T; y: T } => {\n // prettier-ignore\n let tv1, tv2, tv3, tv4, tv5, tv6, x, y;\n tv1 = Fp.sqr(u); // 1. tv1 = u^2\n tv1 = Fp.mul(tv1, Z); // 2. tv1 = Z * tv1\n tv2 = Fp.sqr(tv1); // 3. tv2 = tv1^2\n tv2 = Fp.add(tv2, tv1); // 4. tv2 = tv2 + tv1\n tv3 = Fp.add(tv2, Fp.ONE); // 5. tv3 = tv2 + 1\n tv3 = Fp.mul(tv3, B); // 6. tv3 = B * tv3\n tv4 = Fp.cmov(Z, Fp.neg(tv2), !Fp.eql(tv2, Fp.ZERO)); // 7. tv4 = CMOV(Z, -tv2, tv2 != 0)\n tv4 = Fp.mul(tv4, A); // 8. tv4 = A * tv4\n tv2 = Fp.sqr(tv3); // 9. tv2 = tv3^2\n tv6 = Fp.sqr(tv4); // 10. tv6 = tv4^2\n tv5 = Fp.mul(tv6, A); // 11. tv5 = A * tv6\n tv2 = Fp.add(tv2, tv5); // 12. tv2 = tv2 + tv5\n tv2 = Fp.mul(tv2, tv3); // 13. tv2 = tv2 * tv3\n tv6 = Fp.mul(tv6, tv4); // 14. tv6 = tv6 * tv4\n tv5 = Fp.mul(tv6, B); // 15. tv5 = B * tv6\n tv2 = Fp.add(tv2, tv5); // 16. tv2 = tv2 + tv5\n x = Fp.mul(tv1, tv3); // 17. x = tv1 * tv3\n const { isValid, value } = sqrtRatio(tv2, tv6); // 18. (is_gx1_square, y1) = sqrt_ratio(tv2, tv6)\n y = Fp.mul(tv1, u); // 19. y = tv1 * u -> Z * u^3 * y1\n y = Fp.mul(y, value); // 20. y = y * y1\n x = Fp.cmov(x, tv3, isValid); // 21. x = CMOV(x, tv3, is_gx1_square)\n y = Fp.cmov(y, value, isValid); // 22. y = CMOV(y, y1, is_gx1_square)\n const e1 = Fp.isOdd!(u) === Fp.isOdd!(y); // 23. e1 = sgn0(u) == sgn0(y)\n y = Fp.cmov(Fp.neg(y), y, e1); // 24. y = CMOV(-y, y, e1)\n const tv4_inv = FpInvertBatch(Fp, [tv4], true)[0];\n x = Fp.mul(x, tv4_inv); // 25. x = x / tv4\n return { x, y };\n };\n}\n\nfunction getWLengths<T>(Fp: IField<T>, Fn: IField<bigint>) {\n return {\n secretKey: Fn.BYTES,\n publicKey: 1 + Fp.BYTES,\n publicKeyUncompressed: 1 + 2 * Fp.BYTES,\n publicKeyHasPrefix: true,\n signature: 2 * Fn.BYTES,\n };\n}\n\n/**\n * Sometimes users only need getPublicKey, getSharedSecret, and secret key handling.\n * This helper ensures no signature functionality is present. Less code, smaller bundle size.\n */\nexport function ecdh(\n Point: WeierstrassPointCons<bigint>,\n ecdhOpts: { randomBytes?: (bytesLength?: number) => Uint8Array } = {}\n): ECDH {\n const { Fn } = Point;\n const randomBytes_ = ecdhOpts.randomBytes || randomBytesWeb;\n const lengths = Object.assign(getWLengths(Point.Fp, Fn), { seed: getMinHashLength(Fn.ORDER) });\n\n function isValidSecretKey(secretKey: PrivKey) {\n try {\n return !!_normFnElement(Fn, secretKey);\n } catch (error) {\n return false;\n }\n }\n\n function isValidPublicKey(publicKey: Uint8Array, isCompressed?: boolean): boolean {\n const { publicKey: comp, publicKeyUncompressed } = lengths;\n try {\n const l = publicKey.length;\n if (isCompressed === true && l !== comp) return false;\n if (isCompressed === false && l !== publicKeyUncompressed) return false;\n return !!Point.fromBytes(publicKey);\n } catch (error) {\n return false;\n }\n }\n\n /**\n * Produces cryptographically secure secret key from random of size\n * (groupLen + ceil(groupLen / 2)) with modulo bias being negligible.\n */\n function randomSecretKey(seed = randomBytes_(lengths.seed)): Uint8Array {\n return mapHashToField(abytes(seed, lengths.seed, 'seed'), Fn.ORDER);\n }\n\n /**\n * Computes public key for a secret key. Checks for validity of the secret key.\n * @param isCompressed whether to return compact (default), or full key\n * @returns Public key, full when isCompressed=false; short when isCompressed=true\n */\n function getPublicKey(secretKey: PrivKey, isCompressed = true): Uint8Array {\n return Point.BASE.multiply(_normFnElement(Fn, secretKey)).toBytes(isCompressed);\n }\n\n function keygen(seed?: Uint8Array) {\n const secretKey = randomSecretKey(seed);\n return { secretKey, publicKey: getPublicKey(secretKey) };\n }\n\n /**\n * Quick and dirty check for item being public key. Does not validate hex, or being on-curve.\n */\n function isProbPub(item: PrivKey | PubKey): boolean | undefined {\n if (typeof item === 'bigint') return false;\n if (item instanceof Point) return true;\n const { secretKey, publicKey, publicKeyUncompressed } = lengths;\n if (Fn.allowedLengths || secretKey === publicKey) return undefined;\n const l = ensureBytes('key', item).length;\n return l === publicKey || l === publicKeyUncompressed;\n }\n\n /**\n * ECDH (Elliptic Curve Diffie Hellman).\n * Computes shared public key from secret key A and public key B.\n * Checks: 1) secret key validity 2) shared key is on-curve.\n * Does NOT hash the result.\n * @param isCompressed whether to return compact (default), or full key\n * @returns shared public key\n */\n function getSharedSecret(secretKeyA: PrivKey, publicKeyB: Hex, isCompressed = true): Uint8Array {\n if (isProbPub(secretKeyA) === true) throw new Error('first arg must be private key');\n if (isProbPub(publicKeyB) === false) throw new Error('second arg must be public key');\n const s = _normFnElement(Fn, secretKeyA);\n const b = Point.fromHex(publicKeyB); // checks for being on-curve\n return b.multiply(s).toBytes(isCompressed);\n }\n\n const utils = {\n isValidSecretKey,\n isValidPublicKey,\n randomSecretKey,\n\n // TODO: remove\n isValidPrivateKey: isValidSecretKey,\n randomPrivateKey: randomSecretKey,\n normPrivateKeyToScalar: (key: PrivKey) => _normFnElement(Fn, key),\n precompute(windowSize = 8, point = Point.BASE): WeierstrassPoint<bigint> {\n return point.precompute(windowSize, false);\n },\n };\n\n return Object.freeze({ getPublicKey, getSharedSecret, keygen, Point, utils, lengths });\n}\n\n/**\n * Creates ECDSA signing interface for given elliptic curve `Point` and `hash` function.\n * We need `hash` for 2 features:\n * 1. Message prehash-ing. NOT used if `sign` / `verify` are called with `prehash: false`\n * 2. k generation in `sign`, using HMAC-drbg(hash)\n *\n * ECDSAOpts are only rarely needed.\n *\n * @example\n * ```js\n * const p256_Point = weierstrass(...);\n * const p256_sha256 = ecdsa(p256_Point, sha256);\n * const p256_sha224 = ecdsa(p256_Point, sha224);\n * const p256_sha224_r = ecdsa(p256_Point, sha224, { randomBytes: (length) => { ... } });\n * ```\n */\nexport function ecdsa(\n Point: WeierstrassPointCons<bigint>,\n hash: CHash,\n ecdsaOpts: ECDSAOpts = {}\n): ECDSA {\n ahash(hash);\n _validateObject(\n ecdsaOpts,\n {},\n {\n hmac: 'function',\n lowS: 'boolean',\n randomBytes: 'function',\n bits2int: 'function',\n bits2int_modN: 'function',\n }\n );\n\n const randomBytes = ecdsaOpts.randomBytes || randomBytesWeb;\n const hmac: HmacFnSync =\n ecdsaOpts.hmac ||\n (((key, ...msgs) => nobleHmac(hash, key, concatBytes(...msgs))) satisfies HmacFnSync);\n\n const { Fp, Fn } = Point;\n const { ORDER: CURVE_ORDER, BITS: fnBits } = Fn;\n const { keygen, getPublicKey, getSharedSecret, utils, lengths } = ecdh(Point, ecdsaOpts);\n const defaultSigOpts: Required<ECDSASignOpts> = {\n prehash: false,\n lowS: typeof ecdsaOpts.lowS === 'boolean' ? ecdsaOpts.lowS : false,\n format: undefined as any, //'compact' as ECDSASigFormat,\n extraEntropy: false,\n };\n const defaultSigOpts_format = 'compact';\n\n function isBiggerThanHalfOrder(number: bigint) {\n const HALF = CURVE_ORDER >> _1n;\n return number > HALF;\n }\n function validateRS(title: string, num: bigint): bigint {\n if (!Fn.isValidNot0(num))\n throw new Error(`invalid signature ${title}: out of range 1..Point.Fn.ORDER`);\n return num;\n }\n function validateSigLength(bytes: Uint8Array, format: ECDSASigFormat) {\n validateSigFormat(format);\n const size = lengths.signature!;\n const sizer = format === 'compact' ? size : format === 'recovered' ? size + 1 : undefined;\n return abytes(bytes, sizer, `${format} signature`);\n }\n\n /**\n * ECDSA signature with its (r, s) properties. Supports compact, recovered & DER representations.\n */\n class Signature implements ECDSASignature {\n readonly r: bigint;\n readonly s: bigint;\n readonly recovery?: number;\n constructor(r: bigint, s: bigint, recovery?: number) {\n this.r = validateRS('r', r); // r in [1..N-1];\n this.s = validateRS('s', s); // s in [1..N-1];\n if (recovery != null) this.recovery = recovery;\n Object.freeze(this);\n }\n\n static fromBytes(bytes: Uint8Array, format: ECDSASigFormat = defaultSigOpts_format): Signature {\n validateSigLength(bytes, format);\n let recid: number | undefined;\n if (format === 'der') {\n const { r, s } = DER.toSig(abytes(bytes));\n return new Signature(r, s);\n }\n if (format === 'recovered') {\n recid = bytes[0];\n format = 'compact';\n bytes = bytes.subarray(1);\n }\n const L = Fn.BYTES;\n const r = bytes.subarray(0, L);\n const s = bytes.subarray(L, L * 2);\n return new Signature(Fn.fromBytes(r), Fn.fromBytes(s), recid);\n }\n\n static fromHex(hex: string, format?: ECDSASigFormat) {\n return this.fromBytes(hexToBytes(hex), format);\n }\n\n addRecoveryBit(recovery: number): RecoveredSignature {\n return new Signature(this.r, this.s, recovery) as RecoveredSignature;\n }\n\n recoverPublicKey(messageHash: Hex): WeierstrassPoint<bigint> {\n const FIELD_ORDER = Fp.ORDER;\n const { r, s, recovery: rec } = this;\n if (rec == null || ![0, 1, 2, 3].includes(rec)) throw new Error('recovery id invalid');\n\n // ECDSA recovery is hard for cofactor > 1 curves.\n // In sign, `r = q.x mod n`, and here we recover q.x from r.\n // While recovering q.x >= n, we need to add r+n for cofactor=1 curves.\n // However, for cofactor>1, r+n may not get q.x:\n // r+n*i would need to be done instead where i is unknown.\n // To easily get i, we either need to:\n // a. increase amount of valid recid values (4, 5...); OR\n // b. prohibit non-prime-order signatures (recid > 1).\n const hasCofactor = CURVE_ORDER * _2n < FIELD_ORDER;\n if (hasCofactor && rec > 1) throw new Error('recovery id is ambiguous for h>1 curve');\n\n const radj = rec === 2 || rec === 3 ? r + CURVE_ORDER : r;\n if (!Fp.isValid(radj)) throw new Error('recovery id 2 or 3 invalid');\n const x = Fp.toBytes(radj);\n const R = Point.fromBytes(concatBytes(pprefix((rec & 1) === 0), x));\n const ir = Fn.inv(radj); // r^-1\n const h = bits2int_modN(ensureBytes('msgHash', messageHash)); // Truncate hash\n const u1 = Fn.create(-h * ir); // -hr^-1\n const u2 = Fn.create(s * ir); // sr^-1\n // (sr^-1)R-(hr^-1)G = -(hr^-1)G + (sr^-1). unsafe is fine: there is no private data.\n const Q = Point.BASE.multiplyUnsafe(u1).add(R.multiplyUnsafe(u2));\n if (Q.is0()) throw new Error('point at infinify');\n Q.assertValidity();\n return Q;\n }\n\n // Signatures should be low-s, to prevent malleability.\n hasHighS(): boolean {\n return isBiggerThanHalfOrder(this.s);\n }\n\n toBytes(format: ECDSASigFormat = defaultSigOpts_format) {\n validateSigFormat(format);\n if (format === 'der') return hexToBytes(DER.hexFromSig(this));\n const r = Fn.toBytes(this.r);\n const s = Fn.toBytes(this.s);\n if (format === 'recovered') {\n if (this.recovery == null) throw new Error('recovery bit must be present');\n return concatBytes(Uint8Array.of(this.recovery), r, s);\n }\n return concatBytes(r, s);\n }\n\n toHex(format?: ECDSASigFormat) {\n return bytesToHex(this.toBytes(format));\n }\n\n // TODO: remove\n assertValidity(): void {}\n static fromCompact(hex: Hex) {\n return Signature.fromBytes(ensureBytes('sig', hex), 'compact');\n }\n static fromDER(hex: Hex) {\n return Signature.fromBytes(ensureBytes('sig', hex), 'der');\n }\n normalizeS() {\n return this.hasHighS() ? new Signature(this.r, Fn.neg(this.s), this.recovery) : this;\n }\n toDERRawBytes() {\n return this.toBytes('der');\n }\n toDERHex() {\n return bytesToHex(this.toBytes('der'));\n }\n toCompactRawBytes() {\n return this.toBytes('compact');\n }\n toCompactHex() {\n return bytesToHex(this.toBytes('compact'));\n }\n }\n type RecoveredSignature = Signature & { recovery: number };\n\n // RFC6979: ensure ECDSA msg is X bytes and < N. RFC suggests optional truncating via bits2octets.\n // FIPS 186-4 4.6 suggests the leftmost min(nBitLen, outLen) bits, which matches bits2int.\n // bits2int can produce res>N, we can do mod(res, N) since the bitLen is the same.\n // int2octets can't be used; pads small msgs with 0: unacceptatble for trunc as per RFC vectors\n const bits2int =\n ecdsaOpts.bits2int ||\n function bits2int_def(bytes: Uint8Array): bigint {\n // Our custom check \"just in case\", for protection against DoS\n if (bytes.length > 8192) throw new Error('input is too large');\n // For curves with nBitLength % 8 !== 0: bits2octets(bits2octets(m)) !== bits2octets(m)\n // for some cases, since bytes.length * 8 is not actual bitLength.\n const num = bytesToNumberBE(bytes); // check for == u8 done here\n const delta = bytes.length * 8 - fnBits; // truncate to nBitLength leftmost bits\n return delta > 0 ? num >> BigInt(delta) : num;\n };\n const bits2int_modN =\n ecdsaOpts.bits2int_modN ||\n function bits2int_modN_def(bytes: Uint8Array): bigint {\n return Fn.create(bits2int(bytes)); // can't use bytesToNumberBE here\n };\n // Pads output with zero as per spec\n const ORDER_MASK = bitMask(fnBits);\n /** Converts to bytes. Checks if num in `[0..ORDER_MASK-1]` e.g.: `[0..2^256-1]`. */\n function int2octets(num: bigint): Uint8Array {\n // IMPORTANT: the check ensures working for case `Fn.BYTES != Fn.BITS * 8`\n aInRange('num < 2^' + fnBits, num, _0n, ORDER_MASK);\n return Fn.toBytes(num);\n }\n\n function validateMsgAndHash(message: Uint8Array, prehash: boolean) {\n abytes(message, undefined, 'message');\n return prehash ? abytes(hash(message), undefined, 'prehashed message') : message;\n }\n\n /**\n * Steps A, D of RFC6979 3.2.\n * Creates RFC6979 seed; converts msg/privKey to numbers.\n * Used only in sign, not in verify.\n *\n * Warning: we cannot assume here that message has same amount of bytes as curve order,\n * this will be invalid at least for P521. Also it can be bigger for P224 + SHA256.\n */\n function prepSig(message: Uint8Array, privateKey: PrivKey, opts: ECDSASignOpts) {\n if (['recovered', 'canonical'].some((k) => k in opts))\n throw new Error('sign() legacy options not supported');\n const { lowS, prehash, extraEntropy } = validateSigOpts(opts, defaultSigOpts);\n message = validateMsgAndHash(message, prehash); // RFC6979 3.2 A: h1 = H(m)\n // We can't later call bits2octets, since nested bits2int is broken for curves\n // with fnBits % 8 !== 0. Because of that, we unwrap it here as int2octets call.\n // const bits2octets = (bits) => int2octets(bits2int_modN(bits))\n const h1int = bits2int_modN(message);\n const d = _normFnElement(Fn, privateKey); // validate secret key, convert to bigint\n const seedArgs = [int2octets(d), int2octets(h1int)];\n // extraEntropy. RFC6979 3.6: additional k' (optional).\n if (extraEntropy != null && extraEntropy !== false) {\n // K = HMAC_K(V || 0x00 || int2octets(x) || bits2octets(h1) || k')\n // gen random bytes OR pass as-is\n const e = extraEntropy === true ? randomBytes(lengths.secretKey) : extraEntropy;\n seedArgs.push(ensureBytes('extraEntropy', e)); // check for being bytes\n }\n const seed = concatBytes(...seedArgs); // Step D of RFC6979 3.2\n const m = h1int; // NOTE: no need to call bits2int second time here, it is inside truncateHash!\n // Converts signature params into point w r/s, checks result for validity.\n // To transform k => Signature:\n // q = k\u22C5G\n // r = q.x mod n\n // s = k^-1(m + rd) mod n\n // Can use scalar blinding b^-1(bm + bdr) where b \u2208 [1,q\u22121] according to\n // https://tches.iacr.org/index.php/TCHES/article/view/7337/6509. We've decided against it:\n // a) dependency on CSPRNG b) 15% slowdown c) doesn't really help since bigints are not CT\n function k2sig(kBytes: Uint8Array): RecoveredSignature | undefined {\n // RFC 6979 Section 3.2, step 3: k = bits2int(T)\n // Important: all mod() calls here must be done over N\n const k = bits2int(kBytes); // mod n, not mod p\n if (!Fn.isValidNot0(k)) return; // Valid scalars (including k) must be in 1..N-1\n const ik = Fn.inv(k); // k^-1 mod n\n const q = Point.BASE.multiply(k).toAffine(); // q = k\u22C5G\n const r = Fn.create(q.x); // r = q.x mod n\n if (r === _0n) return;\n const s = Fn.create(ik * Fn.create(m + r * d)); // Not using blinding here, see comment above\n if (s === _0n) return;\n let recovery = (q.x === r ? 0 : 2) | Number(q.y & _1n); // recovery bit (2 or 3, when q.x > n)\n let normS = s;\n if (lowS && isBiggerThanHalfOrder(s)) {\n normS = Fn.neg(s); // if lowS was passed, ensure s is always\n recovery ^= 1; // // in the bottom half of N\n }\n return new Signature(r, normS, recovery) as RecoveredSignature; // use normS, not s\n }\n return { seed, k2sig };\n }\n\n /**\n * Signs message hash with a secret key.\n *\n * ```\n * sign(m, d) where\n * k = rfc6979_hmac_drbg(m, d)\n * (x, y) = G \u00D7 k\n * r = x mod n\n * s = (m + dr) / k mod n\n * ```\n */\n function sign(message: Hex, secretKey: PrivKey, opts: ECDSASignOpts = {}): RecoveredSignature {\n message = ensureBytes('message', message);\n const { seed, k2sig } = prepSig(message, secretKey, opts); // Steps A, D of RFC6979 3.2.\n const drbg = createHmacDrbg<RecoveredSignature>(hash.outputLen, Fn.BYTES, hmac);\n const sig = drbg(seed, k2sig); // Steps B, C, D, E, F, G\n return sig;\n }\n\n function tryParsingSig(sg: Hex | SignatureLike) {\n // Try to deduce format\n let sig: Signature | undefined = undefined;\n const isHex = typeof sg === 'string' || isBytes(sg);\n const isObj =\n !isHex &&\n sg !== null &&\n typeof sg === 'object' &&\n typeof sg.r === 'bigint' &&\n typeof sg.s === 'bigint';\n if (!isHex && !isObj)\n throw new Error('invalid signature, expected Uint8Array, hex string or Signature instance');\n if (isObj) {\n sig = new Signature(sg.r, sg.s);\n } else if (isHex) {\n try {\n sig = Signature.fromBytes(ensureBytes('sig', sg), 'der');\n } catch (derError) {\n if (!(derError instanceof DER.Err)) throw derError;\n }\n if (!sig) {\n try {\n sig = Signature.fromBytes(ensureBytes('sig', sg), 'compact');\n } catch (error) {\n return false;\n }\n }\n }\n if (!sig) return false;\n return sig;\n }\n\n /**\n * Verifies a signature against message and public key.\n * Rejects lowS signatures by default: see {@link ECDSAVerifyOpts}.\n * Implements section 4.1.4 from https://www.secg.org/sec1-v2.pdf:\n *\n * ```\n * verify(r, s, h, P) where\n * u1 = hs^-1 mod n\n * u2 = rs^-1 mod n\n * R = u1\u22C5G + u2\u22C5P\n * mod(R.x, n) == r\n * ```\n */\n function verify(\n signature: Hex | SignatureLike,\n message: Hex,\n publicKey: Hex,\n opts: ECDSAVerifyOpts = {}\n ): boolean {\n const { lowS, prehash, format } = validateSigOpts(opts, defaultSigOpts);\n publicKey = ensureBytes('publicKey', publicKey);\n message = validateMsgAndHash(ensureBytes('message', message), prehash);\n if ('strict' in opts) throw new Error('options.strict was renamed to lowS');\n const sig =\n format === undefined\n ? tryParsingSig(signature)\n : Signature.fromBytes(ensureBytes('sig', signature as Hex), format);\n if (sig === false) return false;\n try {\n const P = Point.fromBytes(publicKey);\n if (lowS && sig.hasHighS()) return false;\n const { r, s } = sig;\n const h = bits2int_modN(message); // mod n, not mod p\n const is = Fn.inv(s); // s^-1 mod n\n const u1 = Fn.create(h * is); // u1 = hs^-1 mod n\n const u2 = Fn.create(r * is); // u2 = rs^-1 mod n\n const R = Point.BASE.multiplyUnsafe(u1).add(P.multiplyUnsafe(u2)); // u1\u22C5G + u2\u22C5P\n if (R.is0()) return false;\n const v = Fn.create(R.x); // v = r.x mod n\n return v === r;\n } catch (e) {\n return false;\n }\n }\n\n function recoverPublicKey(\n signature: Uint8Array,\n message: Uint8Array,\n opts: ECDSARecoverOpts = {}\n ): Uint8Array {\n const { prehash } = validateSigOpts(opts, defaultSigOpts);\n message = validateMsgAndHash(message, prehash);\n return Signature.fromBytes(signature, 'recovered').recoverPublicKey(message).toBytes();\n }\n\n return Object.freeze({\n keygen,\n getPublicKey,\n getSharedSecret,\n utils,\n lengths,\n Point,\n sign,\n verify,\n recoverPublicKey,\n Signature,\n hash,\n });\n}\n\n// TODO: remove everything below\n/** @deprecated use ECDSASignature */\nexport type SignatureType = ECDSASignature;\n/** @deprecated use ECDSASigRecovered */\nexport type RecoveredSignatureType = ECDSASigRecovered;\n/** @deprecated switch to Uint8Array signatures in format 'compact' */\nexport type SignatureLike = { r: bigint; s: bigint };\nexport type ECDSAExtraEntropy = Hex | boolean;\n/** @deprecated use `ECDSAExtraEntropy` */\nexport type Entropy = Hex | boolean;\nexport type BasicWCurve<T> = BasicCurve<T> & {\n // Params: a, b\n a: T;\n b: T;\n\n // Optional params\n allowedPrivateKeyLengths?: readonly number[]; // for P521\n wrapPrivateKey?: boolean; // bls12-381 requires mod(n) instead of rejecting keys >= n\n endo?: EndomorphismOpts;\n // When a cofactor != 1, there can be an effective methods to:\n // 1. Determine whether a point is torsion-free\n isTorsionFree?: (c: WeierstrassPointCons<T>, point: WeierstrassPoint<T>) => boolean;\n // 2. Clear torsion component\n clearCofactor?: (c: WeierstrassPointCons<T>, point: WeierstrassPoint<T>) => WeierstrassPoint<T>;\n};\n/** @deprecated use ECDSASignOpts */\nexport type SignOpts = ECDSASignOpts;\n/** @deprecated use ECDSASignOpts */\nexport type VerOpts = ECDSAVerifyOpts;\n\n/** @deprecated use WeierstrassPoint */\nexport type ProjPointType<T> = WeierstrassPoint<T>;\n/** @deprecated use WeierstrassPointCons */\nexport type ProjConstructor<T> = WeierstrassPointCons<T>;\n/** @deprecated use ECDSASignatureCons */\nexport type SignatureConstructor = ECDSASignatureCons;\n\n// TODO: remove\nexport type CurvePointsType<T> = BasicWCurve<T> & {\n fromBytes?: (bytes: Uint8Array) => AffinePoint<T>;\n toBytes?: (\n c: WeierstrassPointCons<T>,\n point: WeierstrassPoint<T>,\n isCompressed: boolean\n ) => Uint8Array;\n};\n\n// LegacyWeierstrassOpts\nexport type CurvePointsTypeWithLength<T> = Readonly<CurvePointsType<T> & Partial<NLength>>;\n\n// LegacyWeierstrass\nexport type CurvePointsRes<T> = {\n Point: WeierstrassPointCons<T>;\n\n /** @deprecated use `Point.CURVE()` */\n CURVE: CurvePointsType<T>;\n /** @deprecated use `Point` */\n ProjectivePoint: WeierstrassPointCons<T>;\n /** @deprecated use `Point.Fn.fromBytes(privateKey)` */\n normPrivateKeyToScalar: (key: PrivKey) => bigint;\n /** @deprecated */\n weierstrassEquation: (x: T) => T;\n /** @deprecated use `Point.Fn.isValidNot0(num)` */\n isWithinCurveOrder: (num: bigint) => boolean;\n};\n\n// Aliases to legacy types\n// export type CurveType = LegacyECDSAOpts;\n// export type CurveFn = LegacyECDSA;\n// export type CurvePointsRes<T> = LegacyWeierstrass<T>;\n// export type CurvePointsType<T> = LegacyWeierstrassOpts<T>;\n// export type CurvePointsTypeWithLength<T> = LegacyWeierstrassOpts<T>;\n// export type BasicWCurve<T> = LegacyWeierstrassOpts<T>;\n\n/** @deprecated use `Uint8Array` */\nexport type PubKey = Hex | WeierstrassPoint<bigint>;\nexport type CurveType = BasicWCurve<bigint> & {\n hash: CHash; // CHash not FHash because we need outputLen for DRBG\n hmac?: HmacFnSync;\n randomBytes?: (bytesLength?: number) => Uint8Array;\n lowS?: boolean;\n bits2int?: (bytes: Uint8Array) => bigint;\n bits2int_modN?: (bytes: Uint8Array) => bigint;\n};\nexport type CurveFn = {\n /** @deprecated use `Point.CURVE()` */\n CURVE: CurvePointsType<bigint>;\n keygen: ECDSA['keygen'];\n getPublicKey: ECDSA['getPublicKey'];\n getSharedSecret: ECDSA['getSharedSecret'];\n sign: ECDSA['sign'];\n verify: ECDSA['verify'];\n Point: WeierstrassPointCons<bigint>;\n /** @deprecated use `Point` */\n ProjectivePoint: WeierstrassPointCons<bigint>;\n Signature: ECDSASignatureCons;\n utils: ECDSA['utils'];\n lengths: ECDSA['lengths'];\n};\n/** @deprecated use `weierstrass` in newer releases */\nexport function weierstrassPoints<T>(c: CurvePointsTypeWithLength<T>): CurvePointsRes<T> {\n const { CURVE, curveOpts } = _weierstrass_legacy_opts_to_new(c);\n const Point = weierstrassN(CURVE, curveOpts);\n return _weierstrass_new_output_to_legacy(c, Point);\n}\nexport type WsPointComposed<T> = {\n CURVE: WeierstrassOpts<T>;\n curveOpts: WeierstrassExtraOpts<T>;\n};\nexport type WsComposed = {\n /** @deprecated use `Point.CURVE()` */\n CURVE: WeierstrassOpts<bigint>;\n hash: CHash;\n curveOpts: WeierstrassExtraOpts<bigint>;\n ecdsaOpts: ECDSAOpts;\n};\nfunction _weierstrass_legacy_opts_to_new<T>(c: CurvePointsType<T>): WsPointComposed<T> {\n const CURVE: WeierstrassOpts<T> = {\n a: c.a,\n b: c.b,\n p: c.Fp.ORDER,\n n: c.n,\n h: c.h,\n Gx: c.Gx,\n Gy: c.Gy,\n };\n const Fp = c.Fp;\n let allowedLengths = c.allowedPrivateKeyLengths\n ? Array.from(new Set(c.allowedPrivateKeyLengths.map((l) => Math.ceil(l / 2))))\n : undefined;\n const Fn = Field(CURVE.n, {\n BITS: c.nBitLength,\n allowedLengths: allowedLengths,\n modFromBytes: c.wrapPrivateKey,\n });\n const curveOpts: WeierstrassExtraOpts<T> = {\n Fp,\n Fn,\n allowInfinityPoint: c.allowInfinityPoint,\n endo: c.endo,\n isTorsionFree: c.isTorsionFree,\n clearCofactor: c.clearCofactor,\n fromBytes: c.fromBytes,\n toBytes: c.toBytes,\n };\n return { CURVE, curveOpts };\n}\nfunction _ecdsa_legacy_opts_to_new(c: CurveType): WsComposed {\n const { CURVE, curveOpts } = _weierstrass_legacy_opts_to_new(c);\n const ecdsaOpts: ECDSAOpts = {\n hmac: c.hmac,\n randomBytes: c.randomBytes,\n lowS: c.lowS,\n bits2int: c.bits2int,\n bits2int_modN: c.bits2int_modN,\n };\n return { CURVE, curveOpts, hash: c.hash, ecdsaOpts };\n}\nexport function _legacyHelperEquat<T>(Fp: IField<T>, a: T, b: T): (x: T) => T {\n /**\n * y\u00B2 = x\u00B3 + ax + b: Short weierstrass curve formula. Takes x, returns y\u00B2.\n * @returns y\u00B2\n */\n function weierstrassEquation(x: T): T {\n const x2 = Fp.sqr(x); // x * x\n const x3 = Fp.mul(x2, x); // x\u00B2 * x\n return Fp.add(Fp.add(x3, Fp.mul(x, a)), b); // x\u00B3 + a * x + b\n }\n return weierstrassEquation;\n}\nfunction _weierstrass_new_output_to_legacy<T>(\n c: CurvePointsType<T>,\n Point: WeierstrassPointCons<T>\n): CurvePointsRes<T> {\n const { Fp, Fn } = Point;\n function isWithinCurveOrder(num: bigint): boolean {\n return inRange(num, _1n, Fn.ORDER);\n }\n const weierstrassEquation = _legacyHelperEquat(Fp, c.a, c.b);\n return Object.assign(\n {},\n {\n CURVE: c,\n Point: Point,\n ProjectivePoint: Point,\n normPrivateKeyToScalar: (key: PrivKey) => _normFnElement(Fn, key),\n weierstrassEquation,\n isWithinCurveOrder,\n }\n );\n}\nfunction _ecdsa_new_output_to_legacy(c: CurveType, _ecdsa: ECDSA): CurveFn {\n const Point = _ecdsa.Point;\n return Object.assign({}, _ecdsa, {\n ProjectivePoint: Point,\n CURVE: Object.assign({}, c, nLength(Point.Fn.ORDER, Point.Fn.BITS)),\n });\n}\n\n// _ecdsa_legacy\nexport function weierstrass(c: CurveType): CurveFn {\n const { CURVE, curveOpts, hash, ecdsaOpts } = _ecdsa_legacy_opts_to_new(c);\n const Point = weierstrassN(CURVE, curveOpts);\n const signs = ecdsa(Point, hash, ecdsaOpts);\n return _ecdsa_new_output_to_legacy(c, signs);\n}\n", "/**\n * Utilities for short weierstrass curves, combined with noble-hashes.\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport { type CurveFn, type CurveType, weierstrass } from './abstract/weierstrass.ts';\nimport type { CHash } from './utils.ts';\n\n/** connects noble-curves to noble-hashes */\nexport function getHash(hash: CHash): { hash: CHash } {\n return { hash };\n}\n/** Same API as @noble/hashes, with ability to create curve with custom hash */\nexport type CurveDef = Readonly<Omit<CurveType, 'hash'>>;\nexport type CurveFnWithCreate = CurveFn & { create: (hash: CHash) => CurveFn };\n\n/** @deprecated use new `weierstrass()` and `ecdsa()` methods */\nexport function createCurve(curveDef: CurveDef, defHash: CHash): CurveFnWithCreate {\n const create = (hash: CHash): CurveFn => weierstrass({ ...curveDef, hash: hash });\n return { ...create(defHash), create };\n}\n", "/**\n * SECG secp256k1. See [pdf](https://www.secg.org/sec2-v2.pdf).\n *\n * Belongs to Koblitz curves: it has efficiently-computable GLV endomorphism \u03C8,\n * check out {@link EndomorphismOpts}. Seems to be rigid (not backdoored).\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport { sha256 } from '@noble/hashes/sha2.js';\nimport { randomBytes } from '@noble/hashes/utils.js';\nimport { createCurve, type CurveFnWithCreate } from './_shortw_utils.ts';\nimport type { CurveLengths } from './abstract/curve.ts';\nimport {\n createHasher,\n type H2CHasher,\n type H2CMethod,\n isogenyMap,\n} from './abstract/hash-to-curve.ts';\nimport { Field, mapHashToField, mod, pow2 } from './abstract/modular.ts';\nimport {\n _normFnElement,\n type EndomorphismOpts,\n mapToCurveSimpleSWU,\n type WeierstrassPoint as PointType,\n type WeierstrassOpts,\n type WeierstrassPointCons,\n} from './abstract/weierstrass.ts';\nimport type { Hex, PrivKey } from './utils.ts';\nimport {\n bytesToNumberBE,\n concatBytes,\n ensureBytes,\n inRange,\n numberToBytesBE,\n utf8ToBytes,\n} from './utils.ts';\n\n// Seems like generator was produced from some seed:\n// `Point.BASE.multiply(Point.Fn.inv(2n, N)).toAffine().x`\n// // gives short x 0x3b78ce563f89a0ed9414f5aa28ad0d96d6795f9c63n\nconst secp256k1_CURVE: WeierstrassOpts<bigint> = {\n p: BigInt('0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f'),\n n: BigInt('0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141'),\n h: BigInt(1),\n a: BigInt(0),\n b: BigInt(7),\n Gx: BigInt('0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798'),\n Gy: BigInt('0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8'),\n};\n\nconst secp256k1_ENDO: EndomorphismOpts = {\n beta: BigInt('0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee'),\n basises: [\n [BigInt('0x3086d221a7d46bcde86c90e49284eb15'), -BigInt('0xe4437ed6010e88286f547fa90abfe4c3')],\n [BigInt('0x114ca50f7a8e2f3f657c1108d9d44cfd8'), BigInt('0x3086d221a7d46bcde86c90e49284eb15')],\n ],\n};\n\nconst _0n = /* @__PURE__ */ BigInt(0);\nconst _1n = /* @__PURE__ */ BigInt(1);\nconst _2n = /* @__PURE__ */ BigInt(2);\n\n/**\n * \u221An = n^((p+1)/4) for fields p = 3 mod 4. We unwrap the loop and multiply bit-by-bit.\n * (P+1n/4n).toString(2) would produce bits [223x 1, 0, 22x 1, 4x 0, 11, 00]\n */\nfunction sqrtMod(y: bigint): bigint {\n const P = secp256k1_CURVE.p;\n // prettier-ignore\n const _3n = BigInt(3), _6n = BigInt(6), _11n = BigInt(11), _22n = BigInt(22);\n // prettier-ignore\n const _23n = BigInt(23), _44n = BigInt(44), _88n = BigInt(88);\n const b2 = (y * y * y) % P; // x^3, 11\n const b3 = (b2 * b2 * y) % P; // x^7\n const b6 = (pow2(b3, _3n, P) * b3) % P;\n const b9 = (pow2(b6, _3n, P) * b3) % P;\n const b11 = (pow2(b9, _2n, P) * b2) % P;\n const b22 = (pow2(b11, _11n, P) * b11) % P;\n const b44 = (pow2(b22, _22n, P) * b22) % P;\n const b88 = (pow2(b44, _44n, P) * b44) % P;\n const b176 = (pow2(b88, _88n, P) * b88) % P;\n const b220 = (pow2(b176, _44n, P) * b44) % P;\n const b223 = (pow2(b220, _3n, P) * b3) % P;\n const t1 = (pow2(b223, _23n, P) * b22) % P;\n const t2 = (pow2(t1, _6n, P) * b2) % P;\n const root = pow2(t2, _2n, P);\n if (!Fpk1.eql(Fpk1.sqr(root), y)) throw new Error('Cannot find square root');\n return root;\n}\n\nconst Fpk1 = Field(secp256k1_CURVE.p, { sqrt: sqrtMod });\n\n/**\n * secp256k1 curve, ECDSA and ECDH methods.\n *\n * Field: `2n**256n - 2n**32n - 2n**9n - 2n**8n - 2n**7n - 2n**6n - 2n**4n - 1n`\n *\n * @example\n * ```js\n * import { secp256k1 } from '@noble/curves/secp256k1';\n * const { secretKey, publicKey } = secp256k1.keygen();\n * const msg = new TextEncoder().encode('hello');\n * const sig = secp256k1.sign(msg, secretKey);\n * const isValid = secp256k1.verify(sig, msg, publicKey) === true;\n * ```\n */\nexport const secp256k1: CurveFnWithCreate = createCurve(\n { ...secp256k1_CURVE, Fp: Fpk1, lowS: true, endo: secp256k1_ENDO },\n sha256\n);\n\n// Schnorr signatures are superior to ECDSA from above. Below is Schnorr-specific BIP0340 code.\n// https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki\n/** An object mapping tags to their tagged hash prefix of [SHA256(tag) | SHA256(tag)] */\nconst TAGGED_HASH_PREFIXES: { [tag: string]: Uint8Array } = {};\nfunction taggedHash(tag: string, ...messages: Uint8Array[]): Uint8Array {\n let tagP = TAGGED_HASH_PREFIXES[tag];\n if (tagP === undefined) {\n const tagH = sha256(utf8ToBytes(tag));\n tagP = concatBytes(tagH, tagH);\n TAGGED_HASH_PREFIXES[tag] = tagP;\n }\n return sha256(concatBytes(tagP, ...messages));\n}\n\n// ECDSA compact points are 33-byte. Schnorr is 32: we strip first byte 0x02 or 0x03\nconst pointToBytes = (point: PointType<bigint>) => point.toBytes(true).slice(1);\nconst Pointk1 = /* @__PURE__ */ (() => secp256k1.Point)();\nconst hasEven = (y: bigint) => y % _2n === _0n;\n\n// Calculate point, scalar and bytes\nfunction schnorrGetExtPubKey(priv: PrivKey) {\n const { Fn, BASE } = Pointk1;\n const d_ = _normFnElement(Fn, priv);\n const p = BASE.multiply(d_); // P = d'\u22C5G; 0 < d' < n check is done inside\n const scalar = hasEven(p.y) ? d_ : Fn.neg(d_);\n return { scalar, bytes: pointToBytes(p) };\n}\n/**\n * lift_x from BIP340. Convert 32-byte x coordinate to elliptic curve point.\n * @returns valid point checked for being on-curve\n */\nfunction lift_x(x: bigint): PointType<bigint> {\n const Fp = Fpk1;\n if (!Fp.isValidNot0(x)) throw new Error('invalid x: Fail if x \u2265 p');\n const xx = Fp.create(x * x);\n const c = Fp.create(xx * x + BigInt(7)); // Let c = x\u00B3 + 7 mod p.\n let y = Fp.sqrt(c); // Let y = c^(p+1)/4 mod p. Same as sqrt().\n // Return the unique point P such that x(P) = x and\n // y(P) = y if y mod 2 = 0 or y(P) = p-y otherwise.\n if (!hasEven(y)) y = Fp.neg(y);\n const p = Pointk1.fromAffine({ x, y });\n p.assertValidity();\n return p;\n}\nconst num = bytesToNumberBE;\n/**\n * Create tagged hash, convert it to bigint, reduce modulo-n.\n */\nfunction challenge(...args: Uint8Array[]): bigint {\n return Pointk1.Fn.create(num(taggedHash('BIP0340/challenge', ...args)));\n}\n\n/**\n * Schnorr public key is just `x` coordinate of Point as per BIP340.\n */\nfunction schnorrGetPublicKey(secretKey: Hex): Uint8Array {\n return schnorrGetExtPubKey(secretKey).bytes; // d'=int(sk). Fail if d'=0 or d'\u2265n. Ret bytes(d'\u22C5G)\n}\n\n/**\n * Creates Schnorr signature as per BIP340. Verifies itself before returning anything.\n * auxRand is optional and is not the sole source of k generation: bad CSPRNG won't be dangerous.\n */\nfunction schnorrSign(message: Hex, secretKey: PrivKey, auxRand: Hex = randomBytes(32)): Uint8Array {\n const { Fn } = Pointk1;\n const m = ensureBytes('message', message);\n const { bytes: px, scalar: d } = schnorrGetExtPubKey(secretKey); // checks for isWithinCurveOrder\n const a = ensureBytes('auxRand', auxRand, 32); // Auxiliary random data a: a 32-byte array\n const t = Fn.toBytes(d ^ num(taggedHash('BIP0340/aux', a))); // Let t be the byte-wise xor of bytes(d) and hash/aux(a)\n const rand = taggedHash('BIP0340/nonce', t, px, m); // Let rand = hash/nonce(t || bytes(P) || m)\n // Let k' = int(rand) mod n. Fail if k' = 0. Let R = k'\u22C5G\n const { bytes: rx, scalar: k } = schnorrGetExtPubKey(rand);\n const e = challenge(rx, px, m); // Let e = int(hash/challenge(bytes(R) || bytes(P) || m)) mod n.\n const sig = new Uint8Array(64); // Let sig = bytes(R) || bytes((k + ed) mod n).\n sig.set(rx, 0);\n sig.set(Fn.toBytes(Fn.create(k + e * d)), 32);\n // If Verify(bytes(P), m, sig) (see below) returns failure, abort\n if (!schnorrVerify(sig, m, px)) throw new Error('sign: Invalid signature produced');\n return sig;\n}\n\n/**\n * Verifies Schnorr signature.\n * Will swallow errors & return false except for initial type validation of arguments.\n */\nfunction schnorrVerify(signature: Hex, message: Hex, publicKey: Hex): boolean {\n const { Fn, BASE } = Pointk1;\n const sig = ensureBytes('signature', signature, 64);\n const m = ensureBytes('message', message);\n const pub = ensureBytes('publicKey', publicKey, 32);\n try {\n const P = lift_x(num(pub)); // P = lift_x(int(pk)); fail if that fails\n const r = num(sig.subarray(0, 32)); // Let r = int(sig[0:32]); fail if r \u2265 p.\n if (!inRange(r, _1n, secp256k1_CURVE.p)) return false;\n const s = num(sig.subarray(32, 64)); // Let s = int(sig[32:64]); fail if s \u2265 n.\n if (!inRange(s, _1n, secp256k1_CURVE.n)) return false;\n // int(challenge(bytes(r)||bytes(P)||m))%n\n const e = challenge(Fn.toBytes(r), pointToBytes(P), m);\n // R = s\u22C5G - e\u22C5P, where -eP == (n-e)P\n const R = BASE.multiplyUnsafe(s).add(P.multiplyUnsafe(Fn.neg(e)));\n const { x, y } = R.toAffine();\n // Fail if is_infinite(R) / not has_even_y(R) / x(R) \u2260 r.\n if (R.is0() || !hasEven(y) || x !== r) return false;\n return true;\n } catch (error) {\n return false;\n }\n}\n\nexport type SecpSchnorr = {\n keygen: (seed?: Uint8Array) => { secretKey: Uint8Array; publicKey: Uint8Array };\n getPublicKey: typeof schnorrGetPublicKey;\n sign: typeof schnorrSign;\n verify: typeof schnorrVerify;\n Point: WeierstrassPointCons<bigint>;\n utils: {\n randomSecretKey: (seed?: Uint8Array) => Uint8Array;\n pointToBytes: (point: PointType<bigint>) => Uint8Array;\n lift_x: typeof lift_x;\n taggedHash: typeof taggedHash;\n\n /** @deprecated use `randomSecretKey` */\n randomPrivateKey: (seed?: Uint8Array) => Uint8Array;\n /** @deprecated use `utils` */\n numberToBytesBE: typeof numberToBytesBE;\n /** @deprecated use `utils` */\n bytesToNumberBE: typeof bytesToNumberBE;\n /** @deprecated use `modular` */\n mod: typeof mod;\n };\n lengths: CurveLengths;\n};\n/**\n * Schnorr signatures over secp256k1.\n * https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki\n * @example\n * ```js\n * import { schnorr } from '@noble/curves/secp256k1';\n * const { secretKey, publicKey } = schnorr.keygen();\n * // const publicKey = schnorr.getPublicKey(secretKey);\n * const msg = new TextEncoder().encode('hello');\n * const sig = schnorr.sign(msg, secretKey);\n * const isValid = schnorr.verify(sig, msg, publicKey);\n * ```\n */\nexport const schnorr: SecpSchnorr = /* @__PURE__ */ (() => {\n const size = 32;\n const seedLength = 48;\n const randomSecretKey = (seed = randomBytes(seedLength)): Uint8Array => {\n return mapHashToField(seed, secp256k1_CURVE.n);\n };\n // TODO: remove\n secp256k1.utils.randomSecretKey;\n function keygen(seed?: Uint8Array) {\n const secretKey = randomSecretKey(seed);\n return { secretKey, publicKey: schnorrGetPublicKey(secretKey) };\n }\n return {\n keygen,\n getPublicKey: schnorrGetPublicKey,\n sign: schnorrSign,\n verify: schnorrVerify,\n Point: Pointk1,\n utils: {\n randomSecretKey: randomSecretKey,\n randomPrivateKey: randomSecretKey,\n taggedHash,\n\n // TODO: remove\n lift_x,\n pointToBytes,\n numberToBytesBE,\n bytesToNumberBE,\n mod,\n },\n lengths: {\n secretKey: size,\n publicKey: size,\n publicKeyHasPrefix: false,\n signature: size * 2,\n seed: seedLength,\n },\n };\n})();\n\nconst isoMap = /* @__PURE__ */ (() =>\n isogenyMap(\n Fpk1,\n [\n // xNum\n [\n '0x8e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38daaaaa8c7',\n '0x7d3d4c80bc321d5b9f315cea7fd44c5d595d2fc0bf63b92dfff1044f17c6581',\n '0x534c328d23f234e6e2a413deca25caece4506144037c40314ecbd0b53d9dd262',\n '0x8e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38daaaaa88c',\n ],\n // xDen\n [\n '0xd35771193d94918a9ca34ccbb7b640dd86cd409542f8487d9fe6b745781eb49b',\n '0xedadc6f64383dc1df7c4b2d51b54225406d36b641f5e41bbc52a56612a8c6d14',\n '0x0000000000000000000000000000000000000000000000000000000000000001', // LAST 1\n ],\n // yNum\n [\n '0x4bda12f684bda12f684bda12f684bda12f684bda12f684bda12f684b8e38e23c',\n '0xc75e0c32d5cb7c0fa9d0a54b12a0a6d5647ab046d686da6fdffc90fc201d71a3',\n '0x29a6194691f91a73715209ef6512e576722830a201be2018a765e85a9ecee931',\n '0x2f684bda12f684bda12f684bda12f684bda12f684bda12f684bda12f38e38d84',\n ],\n // yDen\n [\n '0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffff93b',\n '0x7a06534bb8bdb49fd5e9e6632722c2989467c1bfc8e8d978dfb425d2685c2573',\n '0x6484aa716545ca2cf3a70c3fa8fe337e0a3d21162f0d6299a7bf8192bfd2a76f',\n '0x0000000000000000000000000000000000000000000000000000000000000001', // LAST 1\n ],\n ].map((i) => i.map((j) => BigInt(j))) as [bigint[], bigint[], bigint[], bigint[]]\n ))();\nconst mapSWU = /* @__PURE__ */ (() =>\n mapToCurveSimpleSWU(Fpk1, {\n A: BigInt('0x3f8731abdd661adca08a5558f0f5d272e953d363cb6f0e5d405447c01a444533'),\n B: BigInt('1771'),\n Z: Fpk1.create(BigInt('-11')),\n }))();\n\n/** Hashing / encoding to secp256k1 points / field. RFC 9380 methods. */\nexport const secp256k1_hasher: H2CHasher<bigint> = /* @__PURE__ */ (() =>\n createHasher(\n secp256k1.Point,\n (scalars: bigint[]) => {\n const { x, y } = mapSWU(Fpk1.create(scalars[0]));\n return isoMap(x, y);\n },\n {\n DST: 'secp256k1_XMD:SHA-256_SSWU_RO_',\n encodeDST: 'secp256k1_XMD:SHA-256_SSWU_NU_',\n p: Fpk1.ORDER,\n m: 1,\n k: 128,\n expand: 'xmd',\n hash: sha256,\n }\n ))();\n\n/** @deprecated use `import { secp256k1_hasher } from '@noble/curves/secp256k1.js';` */\nexport const hashToCurve: H2CMethod<bigint> = /* @__PURE__ */ (() =>\n secp256k1_hasher.hashToCurve)();\n\n/** @deprecated use `import { secp256k1_hasher } from '@noble/curves/secp256k1.js';` */\nexport const encodeToCurve: H2CMethod<bigint> = /* @__PURE__ */ (() =>\n secp256k1_hasher.encodeToCurve)();\n", "/**\n * Deprecated module: moved from curves/abstract/utils.js to curves/utils.js\n * @module\n */\nimport * as u from '../utils.ts';\n\n/** @deprecated moved to `@noble/curves/utils.js` */\nexport type Hex = u.Hex;\n/** @deprecated moved to `@noble/curves/utils.js` */\nexport type PrivKey = u.PrivKey;\n/** @deprecated moved to `@noble/curves/utils.js` */\nexport type CHash = u.CHash;\n/** @deprecated moved to `@noble/curves/utils.js` */\nexport type FHash = u.FHash;\n\n/** @deprecated moved to `@noble/curves/utils.js` */\nexport const abytes: typeof u.abytes = u.abytes;\n/** @deprecated moved to `@noble/curves/utils.js` */\nexport const anumber: typeof u.anumber = u.anumber;\n/** @deprecated moved to `@noble/curves/utils.js` */\nexport const bytesToHex: typeof u.bytesToHex = u.bytesToHex;\n/** @deprecated moved to `@noble/curves/utils.js` */\nexport const bytesToUtf8: typeof u.bytesToUtf8 = u.bytesToUtf8;\n/** @deprecated moved to `@noble/curves/utils.js` */\nexport const concatBytes: typeof u.concatBytes = u.concatBytes;\n/** @deprecated moved to `@noble/curves/utils.js` */\nexport const hexToBytes: typeof u.hexToBytes = u.hexToBytes;\n/** @deprecated moved to `@noble/curves/utils.js` */\nexport const isBytes: typeof u.isBytes = u.isBytes;\n/** @deprecated moved to `@noble/curves/utils.js` */\nexport const randomBytes: typeof u.randomBytes = u.randomBytes;\n/** @deprecated moved to `@noble/curves/utils.js` */\nexport const utf8ToBytes: typeof u.utf8ToBytes = u.utf8ToBytes;\n\n/** @deprecated moved to `@noble/curves/utils.js` */\nexport const abool: typeof u.abool = u.abool;\n/** @deprecated moved to `@noble/curves/utils.js` */\nexport const numberToHexUnpadded: typeof u.numberToHexUnpadded = u.numberToHexUnpadded;\n/** @deprecated moved to `@noble/curves/utils.js` */\nexport const hexToNumber: typeof u.hexToNumber = u.hexToNumber;\n/** @deprecated moved to `@noble/curves/utils.js` */\nexport const bytesToNumberBE: typeof u.bytesToNumberBE = u.bytesToNumberBE;\n/** @deprecated moved to `@noble/curves/utils.js` */\nexport const bytesToNumberLE: typeof u.bytesToNumberLE = u.bytesToNumberLE;\n/** @deprecated moved to `@noble/curves/utils.js` */\nexport const numberToBytesBE: typeof u.numberToBytesBE = u.numberToBytesBE;\n/** @deprecated moved to `@noble/curves/utils.js` */\nexport const numberToBytesLE: typeof u.numberToBytesLE = u.numberToBytesLE;\n/** @deprecated moved to `@noble/curves/utils.js` */\nexport const numberToVarBytesBE: typeof u.numberToVarBytesBE = u.numberToVarBytesBE;\n/** @deprecated moved to `@noble/curves/utils.js` */\nexport const ensureBytes: typeof u.ensureBytes = u.ensureBytes;\n/** @deprecated moved to `@noble/curves/utils.js` */\nexport const equalBytes: typeof u.equalBytes = u.equalBytes;\n/** @deprecated moved to `@noble/curves/utils.js` */\nexport const copyBytes: typeof u.copyBytes = u.copyBytes;\n/** @deprecated moved to `@noble/curves/utils.js` */\nexport const asciiToBytes: typeof u.asciiToBytes = u.asciiToBytes;\n/** @deprecated moved to `@noble/curves/utils.js` */\nexport const inRange: typeof u.inRange = u.inRange;\n/** @deprecated moved to `@noble/curves/utils.js` */\nexport const aInRange: typeof u.aInRange = u.aInRange;\n/** @deprecated moved to `@noble/curves/utils.js` */\nexport const bitLen: typeof u.bitLen = u.bitLen;\n/** @deprecated moved to `@noble/curves/utils.js` */\nexport const bitGet: typeof u.bitGet = u.bitGet;\n/** @deprecated moved to `@noble/curves/utils.js` */\nexport const bitSet: typeof u.bitSet = u.bitSet;\n/** @deprecated moved to `@noble/curves/utils.js` */\nexport const bitMask: typeof u.bitMask = u.bitMask;\n/** @deprecated moved to `@noble/curves/utils.js` */\nexport const createHmacDrbg: typeof u.createHmacDrbg = u.createHmacDrbg;\n/** @deprecated moved to `@noble/curves/utils.js` */\nexport const notImplemented: typeof u.notImplemented = u.notImplemented;\n/** @deprecated moved to `@noble/curves/utils.js` */\nexport const memoized: typeof u.memoized = u.memoized;\n/** @deprecated moved to `@noble/curves/utils.js` */\nexport const validateObject: typeof u.validateObject = u.validateObject;\n/** @deprecated moved to `@noble/curves/utils.js` */\nexport const isHash: typeof u.isHash = u.isHash;\n", "/**\n * SHA2-256 a.k.a. sha256. In JS, it is the fastest hash, even faster than Blake3.\n *\n * To break sha256 using birthday attack, attackers need to try 2^128 hashes.\n * BTC network is doing 2^70 hashes/sec (2^95 hashes/year) as per 2025.\n *\n * Check out [FIPS 180-4](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf).\n * @module\n * @deprecated\n */\nimport {\n SHA224 as SHA224n,\n sha224 as sha224n,\n SHA256 as SHA256n,\n sha256 as sha256n,\n} from './sha2.ts';\n/** @deprecated Use import from `noble/hashes/sha2` module */\nexport const SHA256: typeof SHA256n = SHA256n;\n/** @deprecated Use import from `noble/hashes/sha2` module */\nexport const sha256: typeof sha256n = sha256n;\n/** @deprecated Use import from `noble/hashes/sha2` module */\nexport const SHA224: typeof SHA224n = SHA224n;\n/** @deprecated Use import from `noble/hashes/sha2` module */\nexport const sha224: typeof sha224n = sha224n;\n", "/**\n * @module logger\n * @description Logger utility for the application\n */\n\nenum LogLevel {\n DEBUG,\n INFO,\n WARN,\n ERROR\n}\n\nimport pino from 'pino';\n\n/**\n * Create a logger instance with consistent configuration\n * @param name - Component or module name for the logger\n * @returns Configured pino logger instance\n */\nexport function createLogger(name: string): pino.Logger {\n return pino({\n name,\n level: process.env.LOG_LEVEL || 'info',\n transport: process.env.NODE_ENV === 'development' ? {\n target: 'pino-pretty',\n options: {\n colorize: true,\n translateTime: 'HH:MM:ss',\n ignore: 'pid,hostname',\n }\n } : undefined,\n formatters: {\n level: (label) => {\n return { level: label.toUpperCase() };\n }\n }\n });\n}\n\n/**\n * Simple log function for basic logging needs\n * @param message - Message to log\n * @param data - Optional data to include\n */\nexport function log(message: string, data?: unknown): void {\n console.log(message, data);\n}\n\n/**\n * Default logger instance for the application\n * Includes enhanced error handling and formatting\n */\nexport const logger: pino.Logger = pino({\n name: 'nostr-crypto-utils',\n level: process.env.LOG_LEVEL || 'info',\n transport: process.env.NODE_ENV === 'development' ? {\n target: 'pino-pretty',\n options: {\n colorize: true,\n translateTime: 'HH:MM:ss',\n ignore: 'pid,hostname',\n }\n } : undefined,\n formatters: {\n level: (label) => {\n return { level: label.toUpperCase() };\n },\n log: (obj: Record<string, unknown>) => {\n // Convert error objects to strings for better logging\n if (obj && typeof obj === 'object' && 'err' in obj) {\n const newObj = { ...obj };\n if (newObj.err instanceof Error) {\n const err = newObj.err as Error;\n newObj.err = {\n message: err.message,\n stack: err.stack,\n name: err.name,\n };\n }\n return newObj;\n }\n return obj;\n }\n }\n});\n\nexport class CustomLogger {\n private _level: LogLevel;\n\n constructor(level: LogLevel = LogLevel.INFO) {\n this._level = level;\n }\n\n setLevel(level: LogLevel): void {\n this._level = level;\n }\n\n private _log(level: LogLevel, message: string, context?: Record<string, unknown>): void {\n if (level >= this._level) {\n const timestamp = new Date().toISOString();\n const levelName = LogLevel[level];\n const contextStr = context ? ` ${JSON.stringify(context)}` : '';\n console.log(`[${timestamp}] ${levelName}: ${message}${contextStr}`);\n }\n }\n\n debug(message: string, context?: Record<string, unknown>): void {\n this._log(LogLevel.DEBUG, message, context);\n }\n\n info(message: string, context?: Record<string, unknown>): void {\n this._log(LogLevel.INFO, message, context);\n }\n\n warn(message: string, context?: Record<string, unknown>): void {\n this._log(LogLevel.WARN, message, context);\n }\n\n error(message: string | Error | unknown, context?: Record<string, unknown>): void {\n const errorMessage = message instanceof Error ? message.message : String(message);\n this._log(LogLevel.ERROR, errorMessage, context);\n }\n}\n\n// Re-export the Logger type for use in other files\nexport type { Logger } from 'pino';\n", "/**\n * Base64 encoding utilities for Nostr\n * Provides consistent base64 encoding/decoding across all Nostr-related projects\n */\n\n/**\n * Convert string to base64\n * @param str String to convert\n * @returns Base64 string\n */\nexport function stringToBase64(str: string): string {\n return Buffer.from(str, 'utf8').toString('base64');\n}\n\n/**\n * Convert base64 to string\n * @param base64 Base64 string to convert\n * @returns UTF-8 string\n * @throws Error if base64 string is invalid\n */\nexport function base64ToString(base64: string): string {\n if (!isValidBase64(base64)) {\n throw new Error('Invalid base64 string');\n }\n return Buffer.from(base64, 'base64').toString('utf8');\n}\n\n/**\n * Convert buffer to base64\n * @param buffer Buffer to convert\n * @returns Base64 string\n */\nexport function bufferToBase64(buffer: Buffer): string {\n return buffer.toString('base64');\n}\n\n/**\n * Convert base64 to buffer\n * @param base64 Base64 string to convert\n * @returns Buffer\n * @throws Error if base64 string is invalid\n */\nexport function base64ToBuffer(base64: string): Buffer {\n if (!isValidBase64(base64)) {\n throw new Error('Invalid base64 string');\n }\n return Buffer.from(base64, 'base64');\n}\n\n/**\n * Check if string is valid base64\n * @param base64 String to check\n * @returns True if valid base64\n */\nexport function isValidBase64(base64: string): boolean {\n try {\n return Boolean(base64.match(/^[A-Za-z0-9+/]*={0,2}$/));\n } catch {\n return false;\n }\n}\n\n/**\n * Convert base64 to URL-safe base64\n * @param base64 Standard base64 string\n * @returns URL-safe base64 string\n */\nexport function toBase64Url(base64: string): string {\n return base64.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\n}\n\n/**\n * Convert URL-safe base64 to standard base64\n * @param base64url URL-safe base64 string\n * @returns Standard base64 string\n */\nexport function fromBase64Url(base64url: string): string {\n const base64 = base64url.replace(/-/g, '+').replace(/_/g, '/');\n const padding = '='.repeat((4 - base64.length % 4) % 4);\n return base64 + padding;\n}\n\n/**\n * Convert hex string to base64\n * @param hex Hex string to convert\n * @returns Base64 string\n * @throws Error if hex string is invalid\n */\nexport function hexToBase64(hex: string): string {\n if (!hex.match(/^[0-9a-fA-F]*$/)) {\n throw new Error('Invalid hex string');\n }\n return Buffer.from(hex, 'hex').toString('base64');\n}\n\n/**\n * Convert base64 to hex string\n * @param base64 Base64 string to convert\n * @returns Hex string\n * @throws Error if base64 string is invalid\n */\nexport function base64ToHex(base64: string): string {\n if (!isValidBase64(base64)) {\n throw new Error('Invalid base64 string');\n }\n return Buffer.from(base64, 'base64').toString('hex');\n}\n\n/**\n * Create base64 string from byte array\n * @param bytes Byte array\n * @returns Base64 string\n */\nexport function bytesToBase64(bytes: Uint8Array): string {\n return Buffer.from(bytes).toString('base64');\n}\n\n/**\n * Convert base64 to byte array\n * @param base64 Base64 string\n * @returns Byte array\n * @throws Error if base64 string is invalid\n */\nexport function base64ToBytes(base64: string): Uint8Array {\n if (!isValidBase64(base64)) {\n throw new Error('Invalid base64 string');\n }\n return new Uint8Array(Buffer.from(base64, 'base64'));\n}\n\n/**\n * Calculate padded length for base64 string\n * @param dataLength Length of raw data\n * @returns Length of padded base64 string\n */\nexport function calculateBase64Length(dataLength: number): number {\n return Math.ceil(dataLength / 3) * 4;\n}\n\n/**\n * Remove base64 padding\n * @param base64 Base64 string\n * @returns Base64 string without padding\n */\nexport function removeBase64Padding(base64: string): string {\n return base64.replace(/=+$/, '');\n}\n\n/**\n * Add base64 padding\n * @param base64 Base64 string without padding\n * @returns Properly padded base64 string\n */\nexport function addBase64Padding(base64: string): string {\n const padding = '='.repeat((4 - base64.length % 4) % 4);\n return base64 + padding;\n}\n", "/**\n * @module crypto\n * @description Cryptographic utilities for Nostr\n * \n * IMPORTANT: Nostr Protocol Cryptographic Requirements\n * While secp256k1 is the underlying elliptic curve used by Nostr, the protocol specifically\n * requires schnorr signatures as defined in NIP-01. This means:\n * \n * 1. Always use schnorr-specific functions:\n * - schnorr.getPublicKey() for public key generation\n * - schnorr.sign() for signing\n * - schnorr.verify() for verification\n * \n * 2. Avoid using secp256k1 functions directly:\n * - DON'T use secp256k1.getPublicKey()\n * - DON'T use secp256k1.sign()\n * - DON'T use secp256k1.verify()\n * \n * While both might work in some cases (as they use the same curve), the schnorr signature\n * scheme has specific requirements for key and signature formats that aren't guaranteed\n * when using the lower-level secp256k1 functions directly.\n */\n\nimport { schnorr, secp256k1 } from '@noble/curves/secp256k1';\nimport { bytesToHex, hexToBytes } from '@noble/curves/abstract/utils';\nimport { sha256 } from '@noble/hashes/sha256';\nimport { randomBytes } from '@noble/hashes/utils';\nimport { KeyPair, PublicKeyDetails, NostrEvent, SignedNostrEvent, PublicKey } from './types/index';\nimport { logger } from './utils/logger';\nimport { bytesToBase64, base64ToBytes } from './encoding/base64';\n\n\n/**\n * Custom crypto interface for cross-platform compatibility\n */\nexport interface CryptoSubtle {\n subtle: {\n generateKey(\n algorithm: RsaHashedKeyGenParams | EcKeyGenParams,\n extractable: boolean,\n keyUsages: readonly KeyUsage[]\n ): Promise<CryptoKeyPair>;\n importKey(\n format: 'raw' | 'pkcs8' | 'spki',\n keyData: ArrayBuffer,\n algorithm: RsaHashedImportParams | EcKeyImportParams | AesKeyAlgorithm,\n extractable: boolean,\n keyUsages: readonly KeyUsage[]\n ): Promise<CryptoKey>;\n encrypt(\n algorithm: { name: string; iv: Uint8Array },\n key: CryptoKey,\n data: ArrayBuffer\n ): Promise<ArrayBuffer>;\n decrypt(\n algorithm: { name: string; iv: Uint8Array },\n key: CryptoKey,\n data: ArrayBuffer\n ): Promise<ArrayBuffer>;\n };\n getRandomValues<T extends Uint8Array | Int8Array | Uint16Array | Int16Array | Uint32Array | Int32Array>(array: T): T;\n}\n\ndeclare global {\n interface Window {\n crypto: CryptoSubtle;\n }\n interface Global {\n crypto: CryptoSubtle;\n }\n}\n\n// Get the appropriate crypto implementation\nconst getCrypto = async (): Promise<CryptoSubtle> => {\n if (typeof window !== 'undefined' && window.crypto) {\n return window.crypto;\n }\n if (typeof global !== 'undefined' && (global as Global).crypto) {\n return (global as Global).crypto;\n }\n try {\n const cryptoModule = await import('crypto');\n if (cryptoModule.webcrypto) {\n return cryptoModule.webcrypto as CryptoSubtle;\n }\n } catch {\n logger.debug('Node crypto not available');\n }\n\n throw new Error('No WebCrypto implementation available');\n};\n\n/**\n * Crypto implementation that works in both Node.js and browser environments\n */\nclass CustomCrypto {\n private cryptoInstance: CryptoSubtle | null = null;\n private initPromise: Promise<void>;\n\n constructor() {\n this.initPromise = this.initialize();\n }\n\n private async initialize(): Promise<void> {\n this.cryptoInstance = await getCrypto();\n }\n\n private async ensureInitialized(): Promise<CryptoSubtle> {\n await this.initPromise;\n if (!this.cryptoInstance) {\n throw new Error('Crypto implementation not initialized');\n }\n return this.cryptoInstance;\n }\n\n async getSubtle(): Promise<CryptoSubtle['subtle']> {\n const crypto = await this.ensureInitialized();\n return crypto.subtle;\n }\n\n async getRandomValues<T extends Uint8Array | Int8Array | Uint16Array | Int16Array | Uint32Array | Int32Array>(array: T): Promise<T> {\n const crypto = await this.ensureInitialized();\n return crypto.getRandomValues(array);\n }\n}\n\n// Create and export default instance\nexport const customCrypto = new CustomCrypto();\n\n// Export schnorr functions\nexport const signSchnorr = schnorr.sign;\nexport const verifySchnorrSignature = schnorr.verify;\n\n/**\n * Gets the compressed public key (33 bytes with prefix)\n */\nexport function getCompressedPublicKey(privateKeyBytes: Uint8Array): Uint8Array {\n return secp256k1.getPublicKey(privateKeyBytes, true);\n}\n\n/**\n * Gets the schnorr public key (32 bytes x-coordinate) as per BIP340\n */\nexport function getSchnorrPublicKey(privateKeyBytes: Uint8Array): Uint8Array {\n return schnorr.getPublicKey(privateKeyBytes);\n}\n\n/**\n * Generates a new key pair\n */\nexport async function generateKeyPair(): Promise<KeyPair> {\n const privateKeyBytes = randomBytes(32);\n const privateKey = bytesToHex(privateKeyBytes);\n privateKeyBytes.fill(0); // zero source material\n const publicKey = await getPublicKey(privateKey);\n\n return {\n privateKey,\n publicKey\n };\n}\n\n/**\n * Gets a public key from a private key\n */\nexport async function getPublicKey(privateKey: string): Promise<PublicKeyDetails> {\n try {\n const privateKeyBytes = hexToBytes(privateKey);\n const publicKeyBytes = schnorr.getPublicKey(privateKeyBytes);\n return {\n hex: bytesToHex(publicKeyBytes),\n bytes: publicKeyBytes\n };\n } catch (error) {\n logger.error({ error }, 'Failed to get public key');\n throw error;\n }\n}\n\n/**\n * Validates a key pair\n */\nexport async function validateKeyPair(keyPair: KeyPair): Promise<boolean> {\n try {\n const derivedPubKey = await getPublicKey(keyPair.privateKey);\n return derivedPubKey.hex === keyPair.publicKey.hex;\n } catch (error) {\n logger.error({ error }, 'Failed to validate key pair');\n return false;\n }\n}\n\n/**\n * Creates a new event\n */\nexport function createEvent(event: Partial<NostrEvent>): NostrEvent {\n const timestamp = Math.floor(Date.now() / 1000);\n\n return {\n ...event,\n created_at: event.created_at || timestamp,\n tags: event.tags || [],\n content: event.content || '',\n kind: event.kind || 1\n } as NostrEvent;\n}\n\n/**\n * Signs an event\n */\nexport async function signEvent(event: NostrEvent, privateKey: string): Promise<SignedNostrEvent> {\n try {\n // Serialize event for signing (NIP-01 format)\n const serialized = JSON.stringify([\n 0,\n event.pubkey,\n event.created_at,\n event.kind,\n event.tags,\n event.content\n ]);\n\n // Calculate event hash\n const eventHash = sha256(new TextEncoder().encode(serialized));\n\n // Convert private key to bytes and sign\n const privateKeyBytes = hexToBytes(privateKey);\n const signatureBytes = schnorr.sign(eventHash, privateKeyBytes);\n\n // Create signed event\n return {\n ...event,\n id: bytesToHex(eventHash),\n sig: bytesToHex(signatureBytes)\n };\n } catch (error) {\n logger.error({ error }, 'Failed to sign event');\n throw error;\n }\n}\n\n/**\n * Gets a public key hex string from a private key hex string (synchronous)\n * @param privateKey - Hex-encoded private key\n * @returns Hex-encoded public key (32-byte x-only schnorr key)\n */\nexport function getPublicKeySync(privateKey: string): string {\n const privateKeyBytes = hexToBytes(privateKey);\n const publicKeyBytes = schnorr.getPublicKey(privateKeyBytes);\n return bytesToHex(publicKeyBytes);\n}\n\n/**\n * Creates, hashes, and signs a Nostr event in one step\n * @param event - Partial event (kind, content, tags required; pubkey derived if missing)\n * @param privateKey - Hex-encoded private key\n * @returns Fully signed event with id, pubkey, and sig\n */\nexport async function finalizeEvent(\n event: Partial<NostrEvent>,\n privateKey: string\n): Promise<SignedNostrEvent> {\n const pubkey = event.pubkey || getPublicKeySync(privateKey);\n const timestamp = event.created_at || Math.floor(Date.now() / 1000);\n\n const fullEvent: NostrEvent = {\n kind: event.kind || 1,\n created_at: timestamp,\n tags: event.tags || [],\n content: event.content || '',\n pubkey,\n };\n\n return signEvent(fullEvent, privateKey);\n}\n\n/**\n * Verifies an event signature\n */\nexport async function verifySignature(event: SignedNostrEvent): Promise<boolean> {\n try {\n // Serialize event for verification (NIP-01 format)\n const serialized = JSON.stringify([\n 0,\n event.pubkey,\n event.created_at,\n event.kind,\n event.tags,\n event.content\n ]);\n\n // Calculate event hash\n const eventHash = sha256(new TextEncoder().encode(serialized));\n\n // Verify event ID\n const calculatedId = bytesToHex(eventHash);\n if (calculatedId !== event.id) {\n logger.error('Event ID mismatch');\n return false;\n }\n\n // Convert hex strings to bytes\n const signatureBytes = hexToBytes(event.sig);\n const pubkeyBytes = hexToBytes(event.pubkey);\n\n // Verify signature\n return schnorr.verify(signatureBytes, eventHash, pubkeyBytes);\n } catch (error) {\n logger.error({ error }, 'Failed to verify signature');\n return false;\n }\n}\n\n/**\n * Encrypts a message using NIP-04\n */\nexport async function encrypt(\n message: string,\n recipientPubKey: PublicKey | string,\n senderPrivKey: string\n): Promise<string> {\n try {\n const recipientPubKeyHex = typeof recipientPubKey === 'string' ? recipientPubKey : recipientPubKey.hex;\n const sharedPoint = secp256k1.getSharedSecret(hexToBytes(senderPrivKey), hexToBytes(recipientPubKeyHex));\n const sharedX = sharedPoint.slice(1, 33);\n\n // Generate random IV\n const iv = randomBytes(16);\n const key = await customCrypto.getSubtle().then((subtle) => subtle.importKey(\n 'raw',\n sharedX.buffer,\n { name: 'AES-CBC', length: 256 },\n false,\n ['encrypt']\n ));\n\n // Zero shared secret material now that AES key is imported\n sharedX.fill(0);\n sharedPoint.fill(0);\n\n // Encrypt the message\n const data = new TextEncoder().encode(message);\n const encrypted = await customCrypto.getSubtle().then((subtle) => subtle.encrypt(\n { name: 'AES-CBC', iv },\n key,\n data.buffer\n ));\n\n // NIP-04 standard format: base64(ciphertext) + \"?iv=\" + base64(iv)\n const ciphertextBase64 = bytesToBase64(new Uint8Array(encrypted));\n const ivBase64 = bytesToBase64(iv);\n\n return ciphertextBase64 + '?iv=' + ivBase64;\n } catch (error) {\n logger.error({ error }, 'Failed to encrypt message');\n throw error;\n }\n}\n\n/**\n * Decrypts a message using NIP-04\n */\nexport async function decrypt(\n encryptedMessage: string,\n senderPubKey: PublicKey | string,\n recipientPrivKey: string\n): Promise<string> {\n try {\n const senderPubKeyHex = typeof senderPubKey === 'string' ? senderPubKey : senderPubKey.hex;\n const sharedPoint = secp256k1.getSharedSecret(hexToBytes(recipientPrivKey), hexToBytes(senderPubKeyHex));\n const sharedX = sharedPoint.slice(1, 33);\n\n // Parse NIP-04 standard format: base64(ciphertext) + \"?iv=\" + base64(iv)\n // Also support legacy hex format (iv + ciphertext concatenated) as fallback\n let iv: Uint8Array;\n let ciphertext: Uint8Array;\n\n if (encryptedMessage.includes('?iv=')) {\n // NIP-04 standard format\n const [ciphertextBase64, ivBase64] = encryptedMessage.split('?iv=');\n ciphertext = base64ToBytes(ciphertextBase64);\n iv = base64ToBytes(ivBase64);\n } else {\n // Legacy hex format fallback: first 16 bytes are IV, rest is ciphertext\n const encrypted = hexToBytes(encryptedMessage);\n iv = encrypted.slice(0, 16);\n ciphertext = encrypted.slice(16);\n }\n\n const key = await customCrypto.getSubtle().then((subtle) => subtle.importKey(\n 'raw',\n sharedX.buffer,\n { name: 'AES-CBC', length: 256 },\n false,\n ['decrypt']\n ));\n\n // Zero shared secret material now that AES key is imported\n sharedX.fill(0);\n sharedPoint.fill(0);\n\n const decrypted = await customCrypto.getSubtle().then((subtle) => subtle.decrypt(\n { name: 'AES-CBC', iv },\n key,\n ciphertext.buffer as ArrayBuffer\n ));\n\n return new TextDecoder().decode(decrypted);\n } catch (error) {\n logger.error({ error }, 'Failed to decrypt message');\n throw error;\n }\n}\n", "/**\n * @module validation\n * @description Validation utilities for Nostr events, messages, and related data structures.\n * Provides functions to validate events, signatures, filters, and subscriptions according to the Nostr protocol.\n */\n\nimport { \n NostrEvent, \n SignedNostrEvent, \n NostrFilter, \n NostrSubscription, \n ValidationResult, \n PublicKey,\n NostrMessageType\n} from '../types/index';\n\nimport { logger } from '../utils/logger';\n\nimport { sha256 } from '@noble/hashes/sha256';\nimport { bytesToHex } from '@noble/curves/abstract/utils';\nimport { schnorr } from '@noble/curves/secp256k1';\n\n/**\n * Gets the hex string from a PublicKey or string\n */\nfunction getPublicKeyHex(pubkey: PublicKey | string): string {\n return typeof pubkey === 'string' ? pubkey : pubkey.hex;\n}\n\nfunction hexToBytes(hex: string): Uint8Array {\n return new Uint8Array(hex.match(/.{1,2}/g)!.map(byte => parseInt(byte, 16)));\n}\n\n/**\n * Validates a Nostr event ID by checking if it matches the SHA-256 hash of the canonical event serialization.\n * \n * @param {SignedNostrEvent} event - The event to validate\n * @returns {ValidationResult} Object containing validation result and any error message\n * @example\n * ```typescript\n * const result = validateEventId(event);\n * if (!result.isValid) {\n * console.error(result.error);\n * }\n * ```\n */\nexport function validateEventId(event: SignedNostrEvent): ValidationResult {\n try {\n const serialized = JSON.stringify([\n 0,\n getPublicKeyHex(event.pubkey),\n event.created_at,\n event.kind,\n event.tags,\n event.content\n ]);\n const hash = bytesToHex(sha256(new TextEncoder().encode(serialized)));\n return {\n isValid: hash === event.id,\n error: hash === event.id ? undefined : 'Invalid event ID'\n };\n } catch (error) {\n logger.error({ error }, 'Failed to validate event ID');\n return {\n isValid: false,\n error: 'Failed to validate event ID'\n };\n }\n}\n\n/**\n * Validates a Nostr event signature using Schnorr signature verification.\n * \n * @param {SignedNostrEvent} event - The event to validate\n * @returns {ValidationResult} Object containing validation result and any error message\n * @example\n * ```typescript\n * const result = validateEventSignature(event);\n * if (!result.isValid) {\n * console.error(result.error);\n * }\n * ```\n */\nexport function validateEventSignature(event: SignedNostrEvent): ValidationResult {\n try {\n // Verify the signature\n const serialized = JSON.stringify([\n 0,\n getPublicKeyHex(event.pubkey),\n event.created_at,\n event.kind,\n event.tags,\n event.content\n ]);\n const hash = sha256(new TextEncoder().encode(serialized));\n const pubkeyHex = getPublicKeyHex(event.pubkey);\n const pubkeyBytes = hexToBytes(pubkeyHex);\n const isValid = schnorr.verify(event.sig, hash, pubkeyBytes);\n \n return {\n isValid,\n error: isValid ? undefined : 'Invalid signature'\n };\n } catch (error) {\n logger.error({ error }, 'Failed to validate event signature');\n return {\n isValid: false,\n error: 'Failed to validate event signature'\n };\n }\n}\n\n/**\n * Validates a complete Nostr event by checking its structure, timestamps, ID, and signature.\n * \n * @param {SignedNostrEvent} event - The event to validate\n * @returns {ValidationResult} Object containing validation result and any error message\n * @example\n * ```typescript\n * const result = validateEvent(event);\n * if (!result.isValid) {\n * console.error(result.error);\n * }\n * ```\n */\nexport function validateEvent(event: SignedNostrEvent): ValidationResult {\n // First validate the event structure\n const baseValidation = validateEventBase(event);\n if (!baseValidation.isValid) {\n return baseValidation;\n }\n\n // Then validate the event ID\n const idValidation = validateEventId(event);\n if (!idValidation.isValid) {\n return idValidation;\n }\n\n // Finally validate the signature\n return validateEventSignature(event);\n}\n\n/**\n * Validates a signed Nostr event by checking its structure and signature format.\n * \n * @param {SignedNostrEvent} event - The event to validate\n * @returns {ValidationResult} Object containing validation result and any error message\n * @example\n * ```typescript\n * const result = validateSignedEvent(event);\n * if (!result.isValid) {\n * console.error(result.error);\n * }\n * ```\n */\nexport function validateSignedEvent(event: SignedNostrEvent): ValidationResult {\n try {\n // Check basic event structure\n const baseValidation = validateEventBase(event);\n if (!baseValidation.isValid) {\n return baseValidation;\n }\n\n // Get pubkey hex\n const pubkeyHex = getPublicKeyHex(event.pubkey);\n\n // Validate pubkey format\n if (!pubkeyHex || typeof pubkeyHex !== 'string' || pubkeyHex.length !== 64) {\n return {\n isValid: false,\n error: 'Invalid public key format'\n };\n }\n\n // Validate signature format\n if (!event.sig || typeof event.sig !== 'string' || event.sig.length !== 128) {\n return {\n isValid: false,\n error: 'Invalid signature format'\n };\n }\n\n // Validate ID format\n if (!event.id || typeof event.id !== 'string' || event.id.length !== 64) {\n return {\n isValid: false,\n error: 'Invalid event ID format'\n };\n }\n\n return { isValid: true };\n } catch (error) {\n logger.error({ error }, 'Failed to validate signed event');\n return {\n isValid: false,\n error: 'Failed to validate signed event'\n };\n }\n}\n\n/**\n * Validates a Nostr event by checking its structure and fields.\n * @param event - The event to validate\n * @returns Validation result and any error message\n */\nexport function validateEventBase(event: NostrEvent | SignedNostrEvent): ValidationResult {\n // Check required fields\n if (!event || typeof event !== 'object') {\n return { isValid: false, error: 'Invalid event structure' };\n }\n\n // Validate kind\n if (typeof event.kind !== 'number' || event.kind < 0) {\n return { isValid: false, error: 'Event kind must be a non-negative integer' };\n }\n\n // Validate timestamp\n const now = Math.floor(Date.now() / 1000);\n if (typeof event.created_at !== 'number' || event.created_at > now + 60) {\n return { isValid: false, error: 'Event timestamp cannot be in the future' };\n }\n\n // Validate content\n if (typeof event.content !== 'string') {\n return { isValid: false, error: 'Event content must be a string' };\n }\n\n // Validate pubkey format\n if (!event.pubkey) {\n return { isValid: false, error: 'Missing public key' };\n }\n\n // Get pubkey hex\n const pubkeyHex = getPublicKeyHex(event.pubkey);\n if (typeof pubkeyHex !== 'string' || !/^[0-9a-f]{64}$/.test(pubkeyHex)) {\n return { isValid: false, error: 'Invalid public key format' };\n }\n\n // Validate tags\n if (!Array.isArray(event.tags)) {\n return { isValid: false, error: 'Event tags must be an array' };\n }\n\n for (const tag of event.tags) {\n if (!Array.isArray(tag)) {\n return { isValid: false, error: 'Each tag must be an array' };\n }\n if (tag.length === 0) {\n return { isValid: false, error: 'Empty tags are not allowed' };\n }\n if (typeof tag[0] !== 'string') {\n return { isValid: false, error: 'Tag identifier must be a string' };\n }\n }\n\n return { isValid: true };\n}\n\n/**\n * Validates a Nostr filter by checking its structure and fields.\n * \n * @param {NostrFilter} filter - The filter to validate\n * @returns {ValidationResult} Object containing validation result and any error message\n * @example\n * ```typescript\n * const result = validateFilter(filter);\n * if (!result.isValid) {\n * console.error(result.error);\n * }\n * ```\n */\nexport function validateFilter(filter: NostrFilter): ValidationResult {\n try {\n // Validate filter structure\n if (!filter || typeof filter !== 'object') {\n return { isValid: false, error: 'Invalid filter structure' };\n }\n\n // Validate ids array if present\n if (filter.ids && (!Array.isArray(filter.ids) || !filter.ids.every(id => typeof id === 'string'))) {\n return { isValid: false, error: 'Filter ids must be an array of strings' };\n }\n\n // Validate authors array if present\n if (filter.authors && (!Array.isArray(filter.authors) || !filter.authors.every(author => typeof author === 'string'))) {\n return { isValid: false, error: 'Filter authors must be an array of strings' };\n }\n\n // Validate kinds array if present\n if (filter.kinds) {\n if (!Array.isArray(filter.kinds)) {\n return { isValid: false, error: 'Filter kinds must be an array of numbers' };\n }\n if (!filter.kinds.every(kind => typeof kind === 'number' && Number.isInteger(kind) && kind >= 0)) {\n return { isValid: false, error: 'Filter kinds must be non-negative integers' };\n }\n }\n\n // Validate timestamps\n if (filter.since && typeof filter.since !== 'number') {\n return { isValid: false, error: 'Filter since must be a number' };\n }\n if (filter.until && typeof filter.until !== 'number') {\n return { isValid: false, error: 'Filter until must be a number' };\n }\n\n // Validate limit\n if (filter.limit && typeof filter.limit !== 'number') {\n return { isValid: false, error: 'Filter limit must be a number' };\n }\n\n // Validate search\n if (filter.search && typeof filter.search !== 'string') {\n return { isValid: false, error: 'Filter search must be a string' };\n }\n\n return { isValid: true };\n } catch (error) {\n logger.error({ error }, 'Failed to validate filter');\n return { isValid: false, error: 'Failed to validate filter' };\n }\n}\n\n/**\n * Validates a Nostr subscription by checking its structure and filters.\n * \n * @param {NostrSubscription} subscription - The subscription to validate\n * @returns {ValidationResult} Object containing validation result and any error message\n * @example\n * ```typescript\n * const result = validateSubscription(subscription);\n * if (!result.isValid) {\n * console.error(result.error);\n * }\n * ```\n */\nexport function validateSubscription(subscription: NostrSubscription): ValidationResult {\n try {\n // Validate subscription structure\n if (!subscription || typeof subscription !== 'object') {\n return { isValid: false, error: 'Invalid subscription structure' };\n }\n\n // Validate subscription ID\n if (!subscription.id || typeof subscription.id !== 'string') {\n return { isValid: false, error: 'Subscription must have a string ID' };\n }\n\n // Validate filters array\n if (!Array.isArray(subscription.filters)) {\n return { isValid: false, error: 'Subscription filters must be an array' };\n }\n\n // Validate each filter\n for (const filter of subscription.filters) {\n const filterValidation = validateFilter(filter);\n if (!filterValidation.isValid) {\n return filterValidation;\n }\n }\n\n return { isValid: true };\n } catch (error) {\n logger.error({ error }, 'Failed to validate subscription');\n return { isValid: false, error: 'Failed to validate subscription' };\n }\n}\n\n/**\n * Validates a Nostr relay response message.\n * \n * @param {unknown} message - The message to validate\n * @returns {ValidationResult} Object containing validation result and any error message\n * @example\n * ```typescript\n * const result = validateResponse(['EVENT', eventObj]);\n * if (!result.isValid) {\n * console.error(result.error);\n * }\n * ```\n */\nexport function validateResponse(message: unknown): ValidationResult {\n // Check if message is an array\n if (!Array.isArray(message)) {\n return {\n isValid: false,\n error: 'Invalid message format: must be an array'\n };\n }\n\n // Check if message has at least one element\n if (message.length === 0) {\n return {\n isValid: false,\n error: 'Invalid message format: array is empty'\n };\n }\n\n // Check if first element is a valid message type\n const type = message[0];\n if (!Object.values(NostrMessageType).includes(type as NostrMessageType)) {\n return {\n isValid: false,\n error: `Invalid message type: ${type}`\n };\n }\n\n // Type-specific validation\n switch (type) {\n case NostrMessageType.EVENT:\n if (message.length !== 2) {\n return {\n isValid: false,\n error: 'EVENT message must have exactly 2 elements'\n };\n }\n return validateSignedEvent(message[1] as SignedNostrEvent);\n\n case NostrMessageType.NOTICE:\n if (message.length !== 2 || typeof message[1] !== 'string') {\n return {\n isValid: false,\n error: 'NOTICE message must have exactly 2 elements with a string message'\n };\n }\n return { isValid: true };\n\n case NostrMessageType.OK:\n if (message.length !== 4 || \n typeof message[1] !== 'string' || \n typeof message[2] !== 'boolean' || \n typeof message[3] !== 'string') {\n return {\n isValid: false,\n error: 'OK message must have exactly 4 elements: [type, eventId, success, message]'\n };\n }\n return { isValid: true };\n\n case NostrMessageType.EOSE:\n if (message.length !== 2 || typeof message[1] !== 'string') {\n return {\n isValid: false,\n error: 'EOSE message must have exactly 2 elements with a subscription ID'\n };\n }\n return { isValid: true };\n\n case NostrMessageType.REQ:\n if (message.length < 2) {\n return {\n isValid: false,\n error: 'REQ message must have at least 2 elements'\n };\n }\n if (typeof message[1] !== 'string') {\n return {\n isValid: false,\n error: 'REQ message must have a string subscription ID'\n };\n }\n // Validate each filter if present\n for (let i = 2; i < message.length; i++) {\n const filterResult = validateFilter(message[i] as NostrFilter);\n if (!filterResult.isValid) {\n return filterResult;\n }\n }\n return { isValid: true };\n\n case NostrMessageType.CLOSE:\n if (message.length !== 2 || typeof message[1] !== 'string') {\n return {\n isValid: false,\n error: 'CLOSE message must have exactly 2 elements with a subscription ID'\n };\n }\n return { isValid: true };\n\n case NostrMessageType.AUTH:\n if (message.length !== 2) {\n return {\n isValid: false,\n error: 'AUTH message must have exactly 2 elements'\n };\n }\n return validateSignedEvent(message[1] as SignedNostrEvent);\n\n default:\n return {\n isValid: false,\n error: `Unsupported message type: ${type}`\n };\n }\n}\n", "/**\n * @module event/creation\n * @description Event creation and serialization utilities for Nostr\n */\n\nimport { sha256 } from '@noble/hashes/sha256';\nimport { bytesToHex } from '@noble/hashes/utils';\nimport { logger } from '../utils/logger';\nimport type { NostrEvent, NostrEventKind } from '../types/index';\n\n/**\n * Creates a new Nostr event with the specified parameters\n * @param params - Event parameters\n * @returns Created event\n */\nexport function createEvent(params: {\n kind: NostrEventKind;\n content: string;\n tags?: string[][];\n created_at?: number;\n pubkey?: string;\n}): NostrEvent {\n const { \n kind, \n content, \n tags = [], \n created_at = Math.floor(Date.now() / 1000), \n pubkey = '' \n } = params;\n \n return {\n kind,\n content,\n tags,\n created_at,\n pubkey,\n };\n}\n\n/**\n * Serializes a Nostr event for signing/hashing (NIP-01)\n * @param event - Event to serialize\n * @returns Serialized event JSON string\n */\nexport function serializeEvent(event: NostrEvent): string {\n return JSON.stringify([\n 0,\n event.pubkey,\n event.created_at,\n event.kind,\n event.tags,\n event.content\n ]);\n}\n\n/**\n * Calculates the hash of a Nostr event (NIP-01)\n * @param event - Event to hash\n * @returns Event hash in hex format\n */\nexport async function getEventHash(event: NostrEvent): Promise<string> {\n try {\n const serialized = serializeEvent(event);\n const hash = await sha256(new TextEncoder().encode(serialized));\n return bytesToHex(hash);\n } catch (error) {\n logger.error({ error }, 'Failed to get event hash');\n throw error;\n }\n}\n", "/**\n * @module event/signing\n * @description Event signing and verification utilities for Nostr\n */\n\nimport { schnorr } from '@noble/curves/secp256k1';\nimport { bytesToHex, hexToBytes } from '@noble/curves/abstract/utils';\nimport { logger } from '../utils/logger';\nimport { getEventHash } from './creation';\nimport type { NostrEvent, SignedNostrEvent } from '../types';\n\n/**\n * Signs a Nostr event with a private key (NIP-01)\n * @param event - Event to sign\n * @param privateKey - Private key in hex format\n * @returns Signed event\n */\nexport async function signEvent(\n event: NostrEvent, \n privateKey: string\n): Promise<SignedNostrEvent> {\n try {\n const hash = await getEventHash(event);\n const sig = schnorr.sign(hash, privateKey);\n \n return {\n ...event,\n id: hash,\n sig: bytesToHex(sig),\n };\n } catch (error) {\n logger.error({ error }, 'Failed to sign event');\n throw error;\n }\n}\n\n/**\n * Verifies the signature of a signed Nostr event (NIP-01)\n * @param event - Event to verify\n * @returns True if signature is valid\n */\nexport function verifySignature(event: SignedNostrEvent): boolean {\n try {\n return schnorr.verify(\n hexToBytes(event.sig),\n hexToBytes(event.id),\n hexToBytes(event.pubkey)\n );\n } catch (error) {\n logger.error({ error }, 'Failed to verify signature');\n return false;\n }\n}\n\n/**\n * Validates a Nostr event\n * @param event - Event to validate\n * @returns True if event is valid\n */\nexport function validateEvent(event: SignedNostrEvent): boolean {\n try {\n // Check required fields\n if (!event.id || !event.pubkey || !event.sig) {\n return false;\n }\n\n // Verify signature\n return verifySignature(event);\n } catch (error) {\n logger.error('Error validating event:', error);\n return false;\n }\n}\n\n/**\n * Calculates the event ID for a Nostr event\n * @param event - Event to calculate ID for\n * @returns Event ID\n */\nexport function calculateEventId(event: NostrEvent): Promise<string> {\n return getEventHash(event);\n}\n", "/**\n * @module nips/nip-04\n * @description Implementation of NIP-04 (Encrypted Direct Messages)\n * @see https://github.com/nostr-protocol/nips/blob/master/04.md\n */\n\nimport { secp256k1 } from '@noble/curves/secp256k1';\nimport { hexToBytes } from '@noble/curves/abstract/utils';\nimport { logger } from '../utils/logger';\nimport { bytesToBase64, base64ToBytes } from '../encoding/base64';\nimport type { CryptoSubtle } from '../crypto';\n\n\n// Configure crypto for Node.js and test environments\ndeclare global {\n interface Window {\n crypto: CryptoSubtle;\n }\n interface Global {\n crypto: CryptoSubtle;\n }\n}\n\nconst getCrypto = async (): Promise<CryptoSubtle> => {\n if (typeof window !== 'undefined' && window.crypto) {\n return window.crypto;\n }\n if (typeof global !== 'undefined' && (global as Global).crypto) {\n return (global as Global).crypto;\n }\n try {\n const cryptoModule = await import('crypto');\n if (cryptoModule.webcrypto) {\n return cryptoModule.webcrypto as CryptoSubtle;\n }\n } catch {\n logger.debug('Node crypto not available');\n }\n\n throw new Error('No WebCrypto implementation available');\n};\n\nclass CryptoImplementation {\n private cryptoInstance: CryptoSubtle | null = null;\n private initPromise: Promise<void>;\n\n constructor() {\n this.initPromise = this.initialize();\n }\n\n private async initialize(): Promise<void> {\n this.cryptoInstance = await getCrypto();\n }\n\n private async ensureInitialized(): Promise<CryptoSubtle> {\n await this.initPromise;\n if (!this.cryptoInstance) {\n throw new Error('Crypto implementation not initialized');\n }\n return this.cryptoInstance;\n }\n\n async getSubtle(): Promise<CryptoSubtle['subtle']> {\n const crypto = await this.ensureInitialized();\n return crypto.subtle;\n }\n\n async getRandomValues<T extends Uint8Array | Int8Array | Uint16Array | Int16Array | Uint32Array | Int32Array>(array: T): Promise<T> {\n const crypto = await this.ensureInitialized();\n return crypto.getRandomValues(array);\n }\n}\n\nconst cryptoImpl = new CryptoImplementation();\n\ninterface SharedSecret {\n sharedSecret: Uint8Array;\n}\n\n/**\n * Encrypts a message using NIP-04 encryption\n * @param message - Message to encrypt\n * @param senderPrivKey - Sender's private key\n * @param recipientPubKey - Recipient's public key\n * @returns Encrypted message string\n */\nexport async function encryptMessage(\n message: string,\n senderPrivKey: string,\n recipientPubKey: string\n): Promise<string> {\n try {\n if (!message || !senderPrivKey || !recipientPubKey) {\n throw new Error('Invalid input parameters');\n }\n\n // Validate keys\n if (!/^[0-9a-f]{64}$/i.test(senderPrivKey)) {\n throw new Error('Invalid private key format');\n }\n\n // Ensure public key is in correct format\n const pubKeyHex = recipientPubKey.startsWith('02') || recipientPubKey.startsWith('03') \n ? recipientPubKey \n : '02' + recipientPubKey;\n\n // Generate shared secret\n const sharedPoint = secp256k1.getSharedSecret(senderPrivKey, pubKeyHex);\n const sharedX = sharedPoint.slice(1, 33); // Use only x-coordinate\n\n // Import key for AES\n const sharedKey = await (await cryptoImpl.getSubtle()).importKey(\n 'raw',\n sharedX.buffer,\n { name: 'AES-CBC', length: 256 },\n false,\n ['encrypt']\n );\n\n // Zero shared secret material now that AES key is imported\n sharedX.fill(0);\n sharedPoint.fill(0);\n\n // Generate IV and encrypt\n const iv = new Uint8Array(16);\n await cryptoImpl.getRandomValues(iv);\n\n const encoded = new TextEncoder().encode(message);\n const encrypted = await (await cryptoImpl.getSubtle()).encrypt(\n { name: 'AES-CBC', iv },\n sharedKey,\n encoded.buffer\n );\n\n // NIP-04 standard format: base64(ciphertext) + \"?iv=\" + base64(iv)\n const ciphertextBase64 = bytesToBase64(new Uint8Array(encrypted));\n const ivBase64 = bytesToBase64(iv);\n\n return ciphertextBase64 + '?iv=' + ivBase64;\n } catch (error) {\n logger.error({ error }, 'Failed to encrypt message');\n throw error;\n }\n}\n\n/**\n * Decrypts a message using NIP-04 decryption\n * @param encryptedMessage - Encrypted message string\n * @param recipientPrivKey - Recipient's private key\n * @param senderPubKey - Sender's public key\n * @returns Decrypted message string\n */\nexport async function decryptMessage(\n encryptedMessage: string,\n recipientPrivKey: string,\n senderPubKey: string\n): Promise<string> {\n try {\n if (!encryptedMessage || !recipientPrivKey || !senderPubKey) {\n throw new Error('Invalid input parameters');\n }\n\n // Validate keys\n if (!/^[0-9a-f]{64}$/i.test(recipientPrivKey)) {\n throw new Error('Invalid private key format');\n }\n\n // Ensure public key is in correct format\n const pubKeyHex = senderPubKey.startsWith('02') || senderPubKey.startsWith('03')\n ? senderPubKey\n : '02' + senderPubKey;\n\n // Generate shared secret\n const sharedPoint = secp256k1.getSharedSecret(recipientPrivKey, pubKeyHex);\n const sharedX = sharedPoint.slice(1, 33); // Use only x-coordinate\n\n // Import key for AES\n const sharedKey = await (await cryptoImpl.getSubtle()).importKey(\n 'raw',\n sharedX.buffer,\n { name: 'AES-CBC', length: 256 },\n false,\n ['decrypt']\n );\n\n // Zero shared secret material now that AES key is imported\n sharedX.fill(0);\n sharedPoint.fill(0);\n\n // Parse NIP-04 standard format: base64(ciphertext) + \"?iv=\" + base64(iv)\n // Also support legacy hex format (iv + ciphertext concatenated) as fallback\n let iv: Uint8Array;\n let ciphertext: Uint8Array;\n\n if (encryptedMessage.includes('?iv=')) {\n // NIP-04 standard format\n const [ciphertextBase64, ivBase64] = encryptedMessage.split('?iv=');\n ciphertext = base64ToBytes(ciphertextBase64);\n iv = base64ToBytes(ivBase64);\n } else {\n // Legacy hex format fallback: first 16 bytes are IV, rest is ciphertext\n const encrypted = hexToBytes(encryptedMessage);\n iv = encrypted.slice(0, 16);\n ciphertext = encrypted.slice(16);\n }\n\n // Decrypt\n const decrypted = await (await cryptoImpl.getSubtle()).decrypt(\n { name: 'AES-CBC', iv },\n sharedKey,\n ciphertext.buffer as ArrayBuffer\n );\n\n return new TextDecoder().decode(decrypted);\n } catch (error) {\n logger.error({ error }, 'Failed to decrypt message');\n throw error;\n }\n}\n\n/**\n * Generates a shared secret for NIP-04 encryption\n * @param privateKey - Private key\n * @param publicKey - Public key\n * @returns Shared secret\n */\nexport function generateSharedSecret(\n privateKey: string,\n publicKey: string\n): SharedSecret {\n try {\n if (!privateKey || !publicKey) {\n throw new Error('Invalid input parameters');\n }\n\n // Validate keys\n if (!/^[0-9a-f]{64}$/i.test(privateKey)) {\n throw new Error('Invalid private key format');\n }\n\n // Ensure public key is in correct format\n const pubKeyHex = publicKey.startsWith('02') || publicKey.startsWith('03')\n ? publicKey\n : '02' + publicKey;\n\n // Generate shared secret\n const sharedPoint = secp256k1.getSharedSecret(privateKey, pubKeyHex);\n return { sharedSecret: sharedPoint.slice(1, 33) }; // Return only x-coordinate\n } catch (error) {\n logger.error({ error }, 'Failed to generate shared secret');\n throw error;\n }\n}\n\nexport { generateSharedSecret as computeSharedSecret };\n", "/**\n * @module nips/nip-01\n * @description Implementation of NIP-01: Basic Protocol Flow Description\n * @see https://github.com/nostr-protocol/nips/blob/master/01.md\n */\n\nimport { schnorr } from '@noble/curves/secp256k1';\nimport { sha256 } from '@noble/hashes/sha256';\nimport { bytesToHex, hexToBytes } from '@noble/curves/abstract/utils';\nimport { logger } from '../utils/logger';\nimport type { NostrEvent, SignedNostrEvent } from '../types';\n\n/**\n * Creates a new Nostr event with the specified parameters (NIP-01)\n * @param params - Event parameters\n * @returns Created event\n */\nexport function createEvent(params: {\n kind: number;\n content: string;\n tags?: string[][];\n created_at?: number;\n pubkey?: string;\n}): NostrEvent {\n const { \n kind, \n content, \n tags = [], \n created_at = Math.floor(Date.now() / 1000), \n pubkey = '' \n } = params;\n \n return {\n kind,\n content,\n tags,\n created_at,\n pubkey,\n };\n}\n\n/**\n * Serializes a Nostr event for signing/hashing (NIP-01)\n * @param event - Event to serialize\n * @returns Serialized event JSON string\n */\nexport function serializeEvent(event: NostrEvent): string {\n return JSON.stringify([\n 0,\n event.pubkey,\n event.created_at,\n event.kind,\n event.tags,\n event.content\n ]);\n}\n\n/**\n * Calculates the hash of a Nostr event (NIP-01)\n * @param event - Event to hash\n * @returns Event hash in hex format\n */\nexport async function getEventHash(event: NostrEvent): Promise<string> {\n try {\n const serialized = serializeEvent(event);\n const hash = sha256(new TextEncoder().encode(serialized));\n return bytesToHex(hash);\n } catch (error) {\n logger.error({ error }, 'Failed to get event hash');\n throw error;\n }\n}\n\n/**\n * Signs a Nostr event with a private key (NIP-01)\n * @param event - Event to sign\n * @param privateKey - Private key in hex format\n * @returns Signed event\n */\nexport async function signEvent(\n event: NostrEvent, \n privateKey: string\n): Promise<SignedNostrEvent> {\n try {\n const hash = await getEventHash(event);\n const sig = schnorr.sign(hexToBytes(hash), privateKey);\n \n return {\n ...event,\n id: hash,\n sig: bytesToHex(sig),\n };\n } catch (error) {\n logger.error({ error }, 'Failed to sign event');\n throw error;\n }\n}\n\n/**\n * Verifies the signature of a signed Nostr event (NIP-01)\n * @param event - Event to verify\n * @returns True if signature is valid\n */\nexport function verifySignature(event: SignedNostrEvent): boolean {\n try {\n // Verify event ID\n const expectedId = calculateEventId(event);\n if (event.id !== expectedId) {\n return false;\n }\n\n // Verify signature\n return schnorr.verify(\n hexToBytes(event.sig),\n hexToBytes(event.id),\n hexToBytes(event.pubkey)\n );\n } catch (error) {\n logger.error({ error }, 'Failed to verify signature');\n return false;\n }\n}\n\n/**\n * Calculates the event ID according to NIP-01\n * @param event - Event to calculate ID for\n * @returns Event ID in hex format\n */\nexport function calculateEventId(event: NostrEvent): string {\n const serialized = serializeEvent(event);\n const hash = sha256(new TextEncoder().encode(serialized));\n return bytesToHex(hash);\n}\n\n/**\n * Validates a Nostr event structure (NIP-01)\n * @param event - Event to validate\n * @returns True if event structure is valid\n */\nexport function validateEvent(event: NostrEvent): boolean {\n try {\n if (typeof event.content !== 'string') return false;\n if (typeof event.created_at !== 'number') return false;\n if (typeof event.kind !== 'number') return false;\n if (!Array.isArray(event.tags)) return false;\n if (typeof event.pubkey !== 'string') return false;\n \n // Validate tags structure\n for (const tag of event.tags) {\n if (!Array.isArray(tag)) return false;\n if (tag.length === 0) return false;\n if (typeof tag[0] !== 'string') return false;\n }\n \n return true;\n } catch (error) {\n logger.error({ error }, 'Failed to validate event');\n return false;\n }\n}\n", "/**\n * NIP-19: bech32-encoded entities\n * Implements encoding and decoding of Nostr entities using bech32 format\n */\n\nimport { bech32 } from 'bech32';\nimport { Buffer } from 'buffer';\n\nexport type Nip19DataType = 'npub' | 'nsec' | 'note' | 'nprofile' | 'nevent' | 'naddr' | 'nrelay';\n\nconst VALID_PREFIXES: Nip19DataType[] = ['npub', 'nsec', 'note', 'nprofile', 'nevent', 'naddr', 'nrelay'];\n\nexport interface Nip19Data {\n type: Nip19DataType;\n data: string;\n relays?: string[];\n author?: string;\n kind?: number;\n identifier?: string; // For naddr\n}\n\n// TLV type constants\nconst TLV_TYPES = {\n SPECIAL: 0, // Main data (hex)\n RELAY: 1, // Relay URL (utf8)\n AUTHOR: 2, // Author pubkey (hex)\n KIND: 3, // Event kind (uint8)\n IDENTIFIER: 4 // Identifier (utf8)\n} as const;\n\n/**\n * Encode a public key as an npub\n * @param pubkey Public key in hex format\n * @returns bech32-encoded npub string\n * @throws {Error} If pubkey is invalid\n */\nexport function npubEncode(pubkey: string): string {\n validateHexString(pubkey, 64);\n const data = Buffer.from(pubkey, 'hex');\n const words = bech32.toWords(data);\n return bech32.encode('npub', words, 1000);\n}\n\n/**\n * Encode a private key as an nsec\n * @param privkey Private key in hex format\n * @returns bech32-encoded nsec string\n * @throws {Error} If privkey is invalid\n */\nexport function nsecEncode(privkey: string): string {\n validateHexString(privkey, 64);\n const data = Buffer.from(privkey, 'hex');\n const words = bech32.toWords(data);\n return bech32.encode('nsec', words, 1000);\n}\n\n/**\n * Encode an event ID as a note\n * @param eventId Event ID in hex format\n * @returns bech32-encoded note string\n * @throws {Error} If eventId is invalid\n */\nexport function noteEncode(eventId: string): string {\n validateHexString(eventId, 64);\n const data = Buffer.from(eventId, 'hex');\n const words = bech32.toWords(data);\n return bech32.encode('note', words, 1000);\n}\n\n/**\n * Encode profile information\n * @param pubkey Public key in hex format\n * @param relays Optional relay URLs\n * @returns bech32-encoded nprofile string\n * @throws {Error} If pubkey is invalid or relays are malformed\n */\nexport function nprofileEncode(pubkey: string, relays?: string[]): string {\n validateHexString(pubkey, 64);\n if (relays) {\n relays.forEach(validateRelayUrl);\n }\n\n const data = encodeTLV({\n type: 'nprofile',\n data: pubkey,\n relays\n });\n return bech32.encode('nprofile', data, 1000);\n}\n\n/**\n * Encode event information\n * @param eventId Event ID in hex format\n * @param relays Optional relay URLs\n * @param author Optional author public key\n * @param kind Optional event kind\n * @returns bech32-encoded nevent string\n * @throws {Error} If parameters are invalid\n */\nexport function neventEncode(\n eventId: string,\n relays?: string[],\n author?: string,\n kind?: number\n): string {\n validateHexString(eventId, 64);\n if (relays) {\n relays.forEach(validateRelayUrl);\n }\n if (author) {\n validateHexString(author, 64);\n }\n if (kind !== undefined && !Number.isInteger(kind)) {\n throw new Error('Invalid event kind');\n }\n\n const data = encodeTLV({\n type: 'nevent',\n data: eventId,\n relays,\n author,\n kind\n });\n return bech32.encode('nevent', data, 1000);\n}\n\n/**\n * Encode an address (NIP-33)\n * @param pubkey Author's public key\n * @param kind Event kind\n * @param identifier String identifier\n * @param relays Optional relay URLs\n * @returns bech32-encoded naddr string\n * @throws {Error} If parameters are invalid\n */\nexport function naddrEncode(\n pubkey: string,\n kind: number,\n identifier: string,\n relays?: string[]\n): string {\n validateHexString(pubkey, 64);\n if (!Number.isInteger(kind)) {\n throw new Error('Invalid event kind');\n }\n if (!identifier) {\n throw new Error('Identifier is required');\n }\n if (relays) {\n relays.forEach(validateRelayUrl);\n }\n\n const data = encodeTLV({\n type: 'naddr',\n data: pubkey,\n kind,\n identifier,\n relays\n });\n return bech32.encode('naddr', data, 1000);\n}\n\n/**\n * Encode a relay URL\n * @param url Relay URL\n * @returns bech32-encoded nrelay string\n * @throws {Error} If URL is invalid\n */\nexport function nrelayEncode(url: string): string {\n validateRelayUrl(url);\n const data = Buffer.from(url, 'utf8');\n const words = bech32.toWords(data);\n return bech32.encode('nrelay', words, 1000);\n}\n\n/**\n * Decode a bech32-encoded Nostr entity\n * @param str bech32-encoded string\n * @returns Decoded data with type and metadata\n * @throws {Error} If string is invalid or malformed\n */\nexport function decode(str: string): Nip19Data {\n if (!str.includes('1')) {\n throw new Error('Invalid bech32 string');\n }\n\n const prefix = str.split('1')[0].toLowerCase();\n if (!VALID_PREFIXES.includes(prefix as Nip19DataType)) {\n throw new Error('Unknown prefix');\n }\n\n try {\n const decoded = bech32.decode(str, 1000);\n const data = Buffer.from(bech32.fromWords(decoded.words));\n\n // For nrelay type\n let url: string;\n // For TLV types\n let decodedData: Nip19Data;\n\n switch (decoded.prefix) {\n case 'npub':\n case 'nsec':\n case 'note':\n validateHexString(data.toString('hex'), 64);\n return {\n type: decoded.prefix as Nip19DataType,\n data: data.toString('hex')\n };\n case 'nrelay':\n url = data.toString('utf8');\n validateRelayUrl(url);\n return {\n type: 'nrelay',\n data: url\n };\n case 'nprofile':\n case 'nevent':\n case 'naddr':\n decodedData = decodeTLV(decoded.prefix as Nip19DataType, data);\n return decodedData;\n default:\n throw new Error('Unknown prefix');\n }\n } catch (error: unknown) {\n if (error instanceof Error) {\n throw error;\n }\n throw new Error('Invalid bech32 string');\n }\n}\n\n// Helper functions\n\nfunction validateHexString(str: string, length?: number): void {\n if (!/^[0-9a-fA-F]+$/.test(str)) {\n throw new Error('Invalid hex string');\n }\n if (length && str.length !== length) {\n throw new Error(`Invalid hex string length (expected ${length})`);\n }\n}\n\nfunction validateRelayUrl(url: string): void {\n try {\n const parsed = new URL(url);\n if (!['ws:', 'wss:'].includes(parsed.protocol)) {\n throw new Error('Invalid relay URL protocol');\n }\n } catch {\n throw new Error('Invalid relay URL');\n }\n}\n\nfunction encodeTLV(data: Nip19Data): number[] {\n const result: number[] = [];\n \n // Special (type 0): main data\n const bytes = Buffer.from(data.data, 'hex');\n result.push(TLV_TYPES.SPECIAL, bytes.length);\n result.push(...bytes);\n\n // Relay (type 1): relay URLs\n if (data.relays?.length) {\n for (const relay of data.relays) {\n const relayBytes = Buffer.from(relay, 'utf8');\n result.push(TLV_TYPES.RELAY, relayBytes.length);\n result.push(...relayBytes);\n }\n }\n\n // Author (type 2): author pubkey\n if (data.author) {\n const authorBytes = Buffer.from(data.author, 'hex');\n result.push(TLV_TYPES.AUTHOR, authorBytes.length);\n result.push(...authorBytes);\n }\n\n // Kind (type 3): event kind\n if (data.kind !== undefined) {\n const kindBytes = Buffer.alloc(4);\n kindBytes.writeUInt32BE(data.kind);\n result.push(TLV_TYPES.KIND, kindBytes.length);\n result.push(...kindBytes);\n }\n\n // Identifier (type 4): for naddr\n if (data.identifier) {\n const identifierBytes = Buffer.from(data.identifier, 'utf8');\n result.push(TLV_TYPES.IDENTIFIER, identifierBytes.length);\n result.push(...identifierBytes);\n }\n\n return bech32.toWords(Buffer.from(result));\n}\n\nfunction decodeTLV(prefix: Nip19DataType, data: Buffer): Nip19Data {\n const result: Nip19Data = {\n type: prefix,\n data: '',\n relays: []\n };\n\n let i = 0;\n // For relay type\n let relay: string;\n\n while (i < data.length) {\n const type = data[i];\n const length = data[i + 1];\n \n if (i + 2 + length > data.length) {\n throw new Error('Invalid TLV data');\n }\n \n const value = data.slice(i + 2, i + 2 + length);\n\n switch (type) {\n case TLV_TYPES.SPECIAL:\n result.data = value.toString('hex');\n validateHexString(result.data, 64);\n break;\n case TLV_TYPES.RELAY:\n relay = value.toString('utf8');\n validateRelayUrl(relay);\n result.relays = result.relays || [];\n result.relays.push(relay);\n break;\n case TLV_TYPES.AUTHOR:\n result.author = value.toString('hex');\n validateHexString(result.author, 64);\n break;\n case TLV_TYPES.KIND:\n result.kind = value.readUInt32BE();\n break;\n case TLV_TYPES.IDENTIFIER:\n result.identifier = value.toString('utf8');\n break;\n default:\n // Skip unknown TLV types\n break;\n }\n\n i += 2 + length;\n }\n\n return result;\n}\n", "/**\n * NIP-26: Delegated Event Signing\n * Implements delegation of event signing capabilities\n */\n\nimport { sha256 } from '@noble/hashes/sha256';\nimport { NostrEvent } from '../types';\nimport { signSchnorr, verifySchnorrSignature } from '../crypto';\nimport { bytesToHex, hexToBytes } from '@noble/curves/abstract/utils';\nimport { schnorr } from '@noble/curves/secp256k1';\n\nexport interface DelegationConditions {\n kind?: number;\n since?: number;\n until?: number;\n}\n\nexport interface Delegation {\n delegator: string;\n delegatee: string;\n conditions: DelegationConditions;\n token: string;\n}\n\n/**\n * Create a delegation token\n * @param delegatorPrivateKey Delegator's private key (used for signing only, never returned)\n * @param delegatee Delegatee's public key\n * @param conditions Delegation conditions\n * @returns Delegation token (delegator field contains the PUBLIC key, not the private key)\n */\nexport function createDelegation(\n delegatorPrivateKey: string,\n delegatee: string,\n conditions: DelegationConditions\n): Delegation {\n const conditionsString = serializeConditions(conditions);\n const token = signDelegation(delegatorPrivateKey, delegatee, conditionsString);\n\n // Derive the public key from the private key \u2014 NEVER return the private key\n const delegatorPublicKey = bytesToHex(schnorr.getPublicKey(hexToBytes(delegatorPrivateKey)));\n\n return {\n delegator: delegatorPublicKey,\n delegatee,\n conditions,\n token\n };\n}\n\n/**\n * Verify a delegation token\n * @param delegation Delegation to verify\n * @returns True if valid, false otherwise\n */\nexport async function verifyDelegation(delegation: Delegation): Promise<boolean> {\n const conditionsString = serializeConditions(delegation.conditions);\n return await verifyDelegationSignature(\n delegation.delegator,\n delegation.delegatee,\n conditionsString,\n delegation.token\n );\n}\n\n/**\n * Check if an event meets delegation conditions\n * @param event Event to check\n * @param conditions Delegation conditions\n * @returns True if conditions are met\n */\nexport function checkDelegationConditions(\n event: NostrEvent,\n conditions: DelegationConditions\n): boolean {\n if (conditions.kind !== undefined && event.kind !== conditions.kind) {\n return false;\n }\n\n if (conditions.since !== undefined && event.created_at < conditions.since) {\n return false;\n }\n\n if (conditions.until !== undefined && event.created_at > conditions.until) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Add delegation tag to an event\n * @param event Event to add delegation to\n * @param delegation Delegation to add\n * @returns Updated event\n */\nexport function addDelegationTag(\n event: NostrEvent,\n delegation: Delegation\n): NostrEvent {\n const tag = [\n 'delegation',\n delegation.delegator,\n serializeConditions(delegation.conditions),\n delegation.token\n ];\n\n return {\n ...event,\n tags: [...event.tags, tag]\n };\n}\n\n/**\n * Extract delegation from an event\n * @param event Event to extract delegation from\n * @returns Delegation or null if not found\n */\nexport function extractDelegation(event: NostrEvent): Delegation | null {\n const tag = event.tags.find(t => t[0] === 'delegation');\n if (!tag || tag.length !== 4) {\n return null;\n }\n\n return {\n delegator: tag[1],\n delegatee: event.pubkey,\n conditions: parseConditions(tag[2]),\n token: tag[3]\n };\n}\n\n// Helper functions\nfunction serializeConditions(conditions: DelegationConditions): string {\n const parts: string[] = [];\n\n if (conditions.kind !== undefined) {\n parts.push(`kind=${conditions.kind}`);\n }\n if (conditions.since !== undefined) {\n parts.push(`created_at>${conditions.since}`);\n }\n if (conditions.until !== undefined) {\n parts.push(`created_at<${conditions.until}`);\n }\n\n return parts.join('&');\n}\n\nfunction parseConditions(conditionsString: string): DelegationConditions {\n const conditions: DelegationConditions = {};\n const parts = conditionsString.split('&');\n\n for (const part of parts) {\n if (part.startsWith('kind=')) {\n conditions.kind = parseInt(part.slice(5));\n } else if (part.startsWith('created_at>')) {\n conditions.since = parseInt(part.slice(11));\n } else if (part.startsWith('created_at<')) {\n conditions.until = parseInt(part.slice(11));\n }\n }\n\n return conditions;\n}\n\nfunction signDelegation(\n delegator: string,\n delegatee: string,\n conditions: string\n): string {\n const message = `nostr:delegation:${delegatee}:${conditions}`;\n const hash = sha256(new TextEncoder().encode(message));\n const signature = signSchnorr(hash, delegator);\n return bytesToHex(signature);\n}\n\nasync function verifyDelegationSignature(\n delegator: string,\n delegatee: string,\n conditions: string,\n signature: string\n): Promise<boolean> {\n const msgHash = sha256(new TextEncoder().encode(`nostr:delegation:${delegatee}:${conditions}`));\n\n return verifySchnorrSignature(signature, msgHash, delegator);\n}\n", "/**\n * @module nips/nip-44\n * @description Implementation of NIP-44 (Versioned Encrypted Payloads)\n * @see https://github.com/nostr-protocol/nips/blob/master/44.md\n */\n\nimport { chacha20 } from '@noble/ciphers/chacha.js';\nimport { equalBytes } from '@noble/ciphers/utils.js';\nimport { secp256k1 } from '@noble/curves/secp256k1';\nimport { extract as hkdf_extract, expand as hkdf_expand } from '@noble/hashes/hkdf';\nimport { hmac } from '@noble/hashes/hmac';\nimport { sha256 } from '@noble/hashes/sha256';\nimport { concatBytes, randomBytes } from '@noble/hashes/utils';\nimport { base64 } from '@scure/base';\n\nconst utf8Encoder = new TextEncoder();\nconst utf8Decoder = new TextDecoder();\n\nconst minPlaintextSize = 1;\nconst maxPlaintextSize = 65535;\n\n/**\n * Calculate padded length for NIP-44 message padding\n */\nfunction calcPaddedLen(len: number): number {\n if (!Number.isSafeInteger(len) || len < 1) throw new Error('expected positive integer');\n if (len <= 32) return 32;\n const nextPower = 1 << (Math.floor(Math.log2(len - 1)) + 1);\n const chunk = nextPower <= 256 ? 32 : nextPower / 8;\n return chunk * (Math.floor((len - 1) / chunk) + 1);\n}\n\n/**\n * Pad plaintext per NIP-44 spec\n */\nfunction pad(plaintext: string): Uint8Array {\n const unpadded = utf8Encoder.encode(plaintext);\n const unpaddedLen = unpadded.length;\n if (unpaddedLen < minPlaintextSize || unpaddedLen > maxPlaintextSize)\n throw new Error('invalid plaintext length: must be between 1 and 65535 bytes');\n const prefix = new Uint8Array(2);\n new DataView(prefix.buffer).setUint16(0, unpaddedLen, false); // big-endian\n const suffix = new Uint8Array(calcPaddedLen(unpaddedLen) - unpaddedLen);\n return concatBytes(prefix, unpadded, suffix);\n}\n\n/**\n * Unpad decrypted message per NIP-44 spec\n */\nfunction unpad(padded: Uint8Array): string {\n const unpaddedLen = new DataView(padded.buffer, padded.byteOffset).getUint16(0, false);\n const unpadded = padded.subarray(2, 2 + unpaddedLen);\n if (\n unpaddedLen < minPlaintextSize ||\n unpaddedLen > maxPlaintextSize ||\n unpadded.length !== unpaddedLen ||\n padded.length !== 2 + calcPaddedLen(unpaddedLen)\n ) {\n throw new Error('invalid padding');\n }\n return utf8Decoder.decode(unpadded);\n}\n\n/**\n * Derive conversation key from private key and public key using ECDH + HKDF\n */\nfunction getConversationKey(privkeyA: Uint8Array, pubkeyB: string): Uint8Array {\n const sharedPoint = secp256k1.getSharedSecret(privkeyA, '02' + pubkeyB);\n const sharedX = sharedPoint.subarray(1, 33);\n return hkdf_extract(sha256, sharedX, utf8Encoder.encode('nip44-v2'));\n}\n\n/**\n * Derive message keys (chacha key, chacha nonce, hmac key) from conversation key and nonce\n */\nfunction getMessageKeys(conversationKey: Uint8Array, nonce: Uint8Array): {\n chacha_key: Uint8Array;\n chacha_nonce: Uint8Array;\n hmac_key: Uint8Array;\n} {\n const keys = hkdf_expand(sha256, conversationKey, nonce, 76);\n return {\n chacha_key: keys.subarray(0, 32),\n chacha_nonce: keys.subarray(32, 44),\n hmac_key: keys.subarray(44, 76),\n };\n}\n\n/**\n * Encrypt plaintext using NIP-44 v2\n * @param plaintext - The message to encrypt\n * @param conversationKey - 32-byte conversation key from getConversationKey\n * @param nonce - Optional 32-byte nonce (random if not provided)\n * @returns Base64-encoded encrypted payload\n */\nfunction encrypt(plaintext: string, conversationKey: Uint8Array, nonce: Uint8Array = randomBytes(32)): string {\n const { chacha_key, chacha_nonce, hmac_key } = getMessageKeys(conversationKey, nonce);\n const padded = pad(plaintext);\n const ciphertext = chacha20(chacha_key, chacha_nonce, padded);\n const mac = hmac(sha256, hmac_key, concatBytes(nonce, ciphertext));\n return base64.encode(concatBytes(new Uint8Array([2]), nonce, ciphertext, mac));\n}\n\n/**\n * Decrypt a NIP-44 v2 payload\n * @param payload - Base64-encoded encrypted payload\n * @param conversationKey - 32-byte conversation key from getConversationKey\n * @returns Decrypted plaintext string\n */\nfunction decrypt(payload: string, conversationKey: Uint8Array): string {\n const data = base64.decode(payload);\n const version = data[0];\n if (version !== 2) throw new Error(`unknown encryption version: ${version}`);\n if (data.length < 99 || data.length > 65603) throw new Error('invalid payload size');\n const nonce = data.subarray(1, 33);\n const ciphertext = data.subarray(33, data.length - 32);\n const mac = data.subarray(data.length - 32);\n const { chacha_key, chacha_nonce, hmac_key } = getMessageKeys(conversationKey, nonce);\n const expectedMac = hmac(sha256, hmac_key, concatBytes(nonce, ciphertext));\n if (!equalBytes(mac, expectedMac)) throw new Error('invalid MAC');\n const padded = chacha20(chacha_key, chacha_nonce, ciphertext);\n return unpad(padded);\n}\n\n/**\n * v2 API object matching nostr-tools shape for compatibility\n */\nexport const v2 = {\n utils: {\n getConversationKey,\n calcPaddedLen,\n },\n encrypt,\n decrypt,\n};\n\nexport { getConversationKey, encrypt, decrypt, calcPaddedLen };\n", "/**\n * Utilities for hex, bytes, CSPRNG.\n * @module\n */\n/*! noble-ciphers - MIT License (c) 2023 Paul Miller (paulmillr.com) */\n\n/** Checks if something is Uint8Array. Be careful: nodejs Buffer will return true. */\nexport function isBytes(a: unknown): a is Uint8Array {\n return a instanceof Uint8Array || (ArrayBuffer.isView(a) && a.constructor.name === 'Uint8Array');\n}\n\n/** Asserts something is boolean. */\nexport function abool(b: boolean): void {\n if (typeof b !== 'boolean') throw new Error(`boolean expected, not ${b}`);\n}\n\n/** Asserts something is positive integer. */\nexport function anumber(n: number): void {\n if (!Number.isSafeInteger(n) || n < 0) throw new Error('positive integer expected, got ' + n);\n}\n\n/** Asserts something is Uint8Array. */\nexport function abytes(value: Uint8Array, length?: number, title: string = ''): Uint8Array {\n const bytes = isBytes(value);\n const len = value?.length;\n const needsLen = length !== undefined;\n if (!bytes || (needsLen && len !== length)) {\n const prefix = title && `\"${title}\" `;\n const ofLen = needsLen ? ` of length ${length}` : '';\n const got = bytes ? `length=${len}` : `type=${typeof value}`;\n throw new Error(prefix + 'expected Uint8Array' + ofLen + ', got ' + got);\n }\n return value;\n}\n\n/** Asserts a hash instance has not been destroyed / finished */\nexport function aexists(instance: any, checkFinished = true): void {\n if (instance.destroyed) throw new Error('Hash instance has been destroyed');\n if (checkFinished && instance.finished) throw new Error('Hash#digest() has already been called');\n}\n\n/** Asserts output is properly-sized byte array */\nexport function aoutput(out: any, instance: any): void {\n abytes(out, undefined, 'output');\n const min = instance.outputLen;\n if (out.length < min) {\n throw new Error('digestInto() expects output buffer of length at least ' + min);\n }\n}\n\nexport type IHash = {\n (data: string | Uint8Array): Uint8Array;\n blockLen: number;\n outputLen: number;\n create: any;\n};\n\n/** Generic type encompassing 8/16/32-byte arrays - but not 64-byte. */\n// prettier-ignore\nexport type TypedArray = Int8Array | Uint8ClampedArray | Uint8Array |\n Uint16Array | Int16Array | Uint32Array | Int32Array;\n\n/** Cast u8 / u16 / u32 to u8. */\nexport function u8(arr: TypedArray): Uint8Array {\n return new Uint8Array(arr.buffer, arr.byteOffset, arr.byteLength);\n}\n\n/** Cast u8 / u16 / u32 to u32. */\nexport function u32(arr: TypedArray): Uint32Array {\n return new Uint32Array(arr.buffer, arr.byteOffset, Math.floor(arr.byteLength / 4));\n}\n\n/** Zeroize a byte array. Warning: JS provides no guarantees. */\nexport function clean(...arrays: TypedArray[]): void {\n for (let i = 0; i < arrays.length; i++) {\n arrays[i].fill(0);\n }\n}\n\n/** Create DataView of an array for easy byte-level manipulation. */\nexport function createView(arr: TypedArray): DataView {\n return new DataView(arr.buffer, arr.byteOffset, arr.byteLength);\n}\n\n/** Is current platform little-endian? Most are. Big-Endian platform: IBM */\nexport const isLE: boolean = /* @__PURE__ */ (() =>\n new Uint8Array(new Uint32Array([0x11223344]).buffer)[0] === 0x44)();\n\n// Built-in hex conversion https://caniuse.com/mdn-javascript_builtins_uint8array_fromhex\nconst hasHexBuiltin: boolean = /* @__PURE__ */ (() =>\n // @ts-ignore\n typeof Uint8Array.from([]).toHex === 'function' && typeof Uint8Array.fromHex === 'function')();\n\n// Array where index 0xf0 (240) is mapped to string 'f0'\nconst hexes = /* @__PURE__ */ Array.from({ length: 256 }, (_, i) =>\n i.toString(16).padStart(2, '0')\n);\n\n/**\n * Convert byte array to hex string. Uses built-in function, when available.\n * @example bytesToHex(Uint8Array.from([0xca, 0xfe, 0x01, 0x23])) // 'cafe0123'\n */\nexport function bytesToHex(bytes: Uint8Array): string {\n abytes(bytes);\n // @ts-ignore\n if (hasHexBuiltin) return bytes.toHex();\n // pre-caching improves the speed 6x\n let hex = '';\n for (let i = 0; i < bytes.length; i++) {\n hex += hexes[bytes[i]];\n }\n return hex;\n}\n\n// We use optimized technique to convert hex string to byte array\nconst asciis = { _0: 48, _9: 57, A: 65, F: 70, a: 97, f: 102 } as const;\nfunction asciiToBase16(ch: number): number | undefined {\n if (ch >= asciis._0 && ch <= asciis._9) return ch - asciis._0; // '2' => 50-48\n if (ch >= asciis.A && ch <= asciis.F) return ch - (asciis.A - 10); // 'B' => 66-(65-10)\n if (ch >= asciis.a && ch <= asciis.f) return ch - (asciis.a - 10); // 'b' => 98-(97-10)\n return;\n}\n\n/**\n * Convert hex string to byte array. Uses built-in function, when available.\n * @example hexToBytes('cafe0123') // Uint8Array.from([0xca, 0xfe, 0x01, 0x23])\n */\nexport function hexToBytes(hex: string): Uint8Array {\n if (typeof hex !== 'string') throw new Error('hex string expected, got ' + typeof hex);\n // @ts-ignore\n if (hasHexBuiltin) return Uint8Array.fromHex(hex);\n const hl = hex.length;\n const al = hl / 2;\n if (hl % 2) throw new Error('hex string expected, got unpadded hex of length ' + hl);\n const array = new Uint8Array(al);\n for (let ai = 0, hi = 0; ai < al; ai++, hi += 2) {\n const n1 = asciiToBase16(hex.charCodeAt(hi));\n const n2 = asciiToBase16(hex.charCodeAt(hi + 1));\n if (n1 === undefined || n2 === undefined) {\n const char = hex[hi] + hex[hi + 1];\n throw new Error('hex string expected, got non-hex character \"' + char + '\" at index ' + hi);\n }\n array[ai] = n1 * 16 + n2; // multiply first octet, e.g. 'a3' => 10*16+3 => 160 + 3 => 163\n }\n return array;\n}\n\n// Used in micro\nexport function hexToNumber(hex: string): bigint {\n if (typeof hex !== 'string') throw new Error('hex string expected, got ' + typeof hex);\n return BigInt(hex === '' ? '0' : '0x' + hex); // Big Endian\n}\n\n// Used in ff1\n// BE: Big Endian, LE: Little Endian\nexport function bytesToNumberBE(bytes: Uint8Array): bigint {\n return hexToNumber(bytesToHex(bytes));\n}\n\n// Used in micro, ff1\nexport function numberToBytesBE(n: number | bigint, len: number): Uint8Array {\n return hexToBytes(n.toString(16).padStart(len * 2, '0'));\n}\n\n// Global symbols, but ts doesn't see them: https://github.com/microsoft/TypeScript/issues/31535\ndeclare const TextEncoder: any;\ndeclare const TextDecoder: any;\n\n/**\n * Converts string to bytes using UTF8 encoding.\n * @example utf8ToBytes('abc') // new Uint8Array([97, 98, 99])\n */\nexport function utf8ToBytes(str: string): Uint8Array {\n if (typeof str !== 'string') throw new Error('string expected');\n return new Uint8Array(new TextEncoder().encode(str)); // https://bugzil.la/1681809\n}\n\n/**\n * Converts bytes to string using UTF8 encoding.\n * @example bytesToUtf8(new Uint8Array([97, 98, 99])) // 'abc'\n */\nexport function bytesToUtf8(bytes: Uint8Array): string {\n return new TextDecoder().decode(bytes);\n}\n\n/**\n * Checks if two U8A use same underlying buffer and overlaps.\n * This is invalid and can corrupt data.\n */\nexport function overlapBytes(a: Uint8Array, b: Uint8Array): boolean {\n return (\n a.buffer === b.buffer && // best we can do, may fail with an obscure Proxy\n a.byteOffset < b.byteOffset + b.byteLength && // a starts before b end\n b.byteOffset < a.byteOffset + a.byteLength // b starts before a end\n );\n}\n\n/**\n * If input and output overlap and input starts before output, we will overwrite end of input before\n * we start processing it, so this is not supported for most ciphers (except chacha/salse, which designed with this)\n */\nexport function complexOverlapBytes(input: Uint8Array, output: Uint8Array): void {\n // This is very cursed. It works somehow, but I'm completely unsure,\n // reasoning about overlapping aligned windows is very hard.\n if (overlapBytes(input, output) && input.byteOffset < output.byteOffset)\n throw new Error('complex overlap of input and output is not supported');\n}\n\n/**\n * Copies several Uint8Arrays into one.\n */\nexport function concatBytes(...arrays: Uint8Array[]): Uint8Array {\n let sum = 0;\n for (let i = 0; i < arrays.length; i++) {\n const a = arrays[i];\n abytes(a);\n sum += a.length;\n }\n const res = new Uint8Array(sum);\n for (let i = 0, pad = 0; i < arrays.length; i++) {\n const a = arrays[i];\n res.set(a, pad);\n pad += a.length;\n }\n return res;\n}\n\n// Used in ARX only\ntype EmptyObj = {};\nexport function checkOpts<T1 extends EmptyObj, T2 extends EmptyObj>(\n defaults: T1,\n opts: T2\n): T1 & T2 {\n if (opts == null || typeof opts !== 'object') throw new Error('options must be defined');\n const merged = Object.assign(defaults, opts);\n return merged as T1 & T2;\n}\n\n/** Compares 2 uint8array-s in kinda constant time. */\nexport function equalBytes(a: Uint8Array, b: Uint8Array): boolean {\n if (a.length !== b.length) return false;\n let diff = 0;\n for (let i = 0; i < a.length; i++) diff |= a[i] ^ b[i];\n return diff === 0;\n}\n\n// TODO: remove\nexport interface IHash2 {\n blockLen: number; // Bytes per block\n outputLen: number; // Bytes in output\n update(buf: string | Uint8Array): this;\n // Writes digest into buf\n digestInto(buf: Uint8Array): void;\n digest(): Uint8Array;\n /**\n * Resets internal state. Makes Hash instance unusable.\n * Reset is impossible for keyed hashes if key is consumed into state. If digest is not consumed\n * by user, they will need to manually call `destroy()` when zeroing is necessary.\n */\n destroy(): void;\n}\n\n// This will allow to re-use with composable things like packed & base encoders\n// Also, we probably can make tags composable\n\n/** Sync cipher: takes byte array and returns byte array. */\nexport type Cipher = {\n encrypt(plaintext: Uint8Array): Uint8Array;\n decrypt(ciphertext: Uint8Array): Uint8Array;\n};\n\n/** Async cipher e.g. from built-in WebCrypto. */\nexport type AsyncCipher = {\n encrypt(plaintext: Uint8Array): Promise<Uint8Array>;\n decrypt(ciphertext: Uint8Array): Promise<Uint8Array>;\n};\n\n/** Cipher with `output` argument which can optimize by doing 1 less allocation. */\nexport type CipherWithOutput = Cipher & {\n encrypt(plaintext: Uint8Array, output?: Uint8Array): Uint8Array;\n decrypt(ciphertext: Uint8Array, output?: Uint8Array): Uint8Array;\n};\n\n/**\n * Params are outside of return type, so it is accessible before calling constructor.\n * If function support multiple nonceLength's, we return the best one.\n */\nexport type CipherParams = {\n blockSize: number;\n nonceLength?: number;\n tagLength?: number;\n varSizeNonce?: boolean;\n};\n/** ARX cipher, like salsa or chacha. */\nexport type ARXCipher = ((\n key: Uint8Array,\n nonce: Uint8Array,\n AAD?: Uint8Array\n) => CipherWithOutput) & {\n blockSize: number;\n nonceLength: number;\n tagLength: number;\n};\nexport type CipherCons<T extends any[]> = (key: Uint8Array, ...args: T) => Cipher;\n/**\n * Wraps a cipher: validates args, ensures encrypt() can only be called once.\n * @__NO_SIDE_EFFECTS__\n */\nexport const wrapCipher = <C extends CipherCons<any>, P extends CipherParams>(\n params: P,\n constructor: C\n): C & P => {\n function wrappedCipher(key: Uint8Array, ...args: any[]): CipherWithOutput {\n // Validate key\n abytes(key, undefined, 'key');\n\n // Big-Endian hardware is rare. Just in case someone still decides to run ciphers:\n if (!isLE) throw new Error('Non little-endian hardware is not yet supported');\n\n // Validate nonce if nonceLength is present\n if (params.nonceLength !== undefined) {\n const nonce = args[0];\n abytes(nonce, params.varSizeNonce ? undefined : params.nonceLength, 'nonce');\n }\n\n // Validate AAD if tagLength present\n const tagl = params.tagLength;\n if (tagl && args[1] !== undefined) abytes(args[1], undefined, 'AAD');\n\n const cipher = constructor(key, ...args);\n const checkOutput = (fnLength: number, output?: Uint8Array) => {\n if (output !== undefined) {\n if (fnLength !== 2) throw new Error('cipher output not supported');\n abytes(output, undefined, 'output');\n }\n };\n // Create wrapped cipher with validation and single-use encryption\n let called = false;\n const wrCipher = {\n encrypt(data: Uint8Array, output?: Uint8Array) {\n if (called) throw new Error('cannot encrypt() twice with same key + nonce');\n called = true;\n abytes(data);\n checkOutput(cipher.encrypt.length, output);\n return (cipher as CipherWithOutput).encrypt(data, output);\n },\n decrypt(data: Uint8Array, output?: Uint8Array) {\n abytes(data);\n if (tagl && data.length < tagl)\n throw new Error('\"ciphertext\" expected length bigger than tagLength=' + tagl);\n checkOutput(cipher.decrypt.length, output);\n return (cipher as CipherWithOutput).decrypt(data, output);\n },\n };\n\n return wrCipher;\n }\n\n Object.assign(wrappedCipher, params);\n return wrappedCipher as C & P;\n};\n\n/** Represents salsa / chacha stream. */\nexport type XorStream = (\n key: Uint8Array,\n nonce: Uint8Array,\n data: Uint8Array,\n output?: Uint8Array,\n counter?: number\n) => Uint8Array;\n\n/**\n * By default, returns u8a of length.\n * When out is available, it checks it for validity and uses it.\n */\nexport function getOutput(\n expectedLength: number,\n out?: Uint8Array,\n onlyAligned = true\n): Uint8Array {\n if (out === undefined) return new Uint8Array(expectedLength);\n if (out.length !== expectedLength)\n throw new Error(\n '\"output\" expected Uint8Array of length ' + expectedLength + ', got: ' + out.length\n );\n if (onlyAligned && !isAligned32(out)) throw new Error('invalid output, must be aligned');\n return out;\n}\n\nexport function u64Lengths(dataLength: number, aadLength: number, isLE: boolean): Uint8Array {\n abool(isLE);\n const num = new Uint8Array(16);\n const view = createView(num);\n view.setBigUint64(0, BigInt(aadLength), isLE);\n view.setBigUint64(8, BigInt(dataLength), isLE);\n return num;\n}\n\n// Is byte array aligned to 4 byte offset (u32)?\nexport function isAligned32(bytes: Uint8Array): boolean {\n return bytes.byteOffset % 4 === 0;\n}\n\n// copy bytes to new u8a (aligned). Because Buffer.slice is broken.\nexport function copyBytes(bytes: Uint8Array): Uint8Array {\n return Uint8Array.from(bytes);\n}\n\n/** Cryptographically secure PRNG. Uses internal OS-level `crypto.getRandomValues`. */\nexport function randomBytes(bytesLength = 32): Uint8Array {\n const cr = typeof globalThis === 'object' ? (globalThis as any).crypto : null;\n if (typeof cr?.getRandomValues !== 'function')\n throw new Error('crypto.getRandomValues must be defined');\n return cr.getRandomValues(new Uint8Array(bytesLength));\n}\n\n/**\n * The pseudorandom number generator doesn't wipe current state:\n * instead, it generates new one based on previous state + entropy.\n * Not reseed/rekey, since AES CTR DRBG does rekey on each randomBytes,\n * which is in fact `reseed`, since it changes counter too.\n */\nexport interface PRG {\n addEntropy(seed: Uint8Array): void;\n randomBytes(length: number): Uint8Array;\n clean(): void;\n}\n\ntype RemoveNonceInner<T extends any[], Ret> = ((...args: T) => Ret) extends (\n arg0: any,\n arg1: any,\n ...rest: infer R\n) => any\n ? (key: Uint8Array, ...args: R) => Ret\n : never;\n\nexport type RemoveNonce<T extends (...args: any) => any> = RemoveNonceInner<\n Parameters<T>,\n ReturnType<T>\n>;\nexport type CipherWithNonce = ((\n key: Uint8Array,\n nonce: Uint8Array,\n ...args: any[]\n) => Cipher | AsyncCipher) & {\n nonceLength: number;\n};\n\n/**\n * Uses CSPRG for nonce, nonce injected in ciphertext.\n * For `encrypt`, a `nonceBytes`-length buffer is fetched from CSPRNG and\n * prepended to encrypted ciphertext. For `decrypt`, first `nonceBytes` of ciphertext\n * are treated as nonce.\n *\n * NOTE: Under the same key, using random nonces (e.g. `managedNonce`) with AES-GCM and ChaCha\n * should be limited to `2**23` (8M) messages to get a collision chance of `2**-50`. Stretching to * `2**32` (4B) messages, chance would become `2**-33` - still negligible, but creeping up.\n * @example\n * const gcm = managedNonce(aes.gcm);\n * const ciphr = gcm(key).encrypt(data);\n * const plain = gcm(key).decrypt(ciph);\n */\nexport function managedNonce<T extends CipherWithNonce>(\n fn: T,\n randomBytes_: typeof randomBytes = randomBytes\n): RemoveNonce<T> {\n const { nonceLength } = fn;\n anumber(nonceLength);\n const addNonce = (nonce: Uint8Array, ciphertext: Uint8Array) => {\n const out = concatBytes(nonce, ciphertext);\n ciphertext.fill(0);\n return out;\n };\n // NOTE: we cannot support DST here, it would be mistake:\n // - we don't know how much dst length cipher requires\n // - nonce may unalign dst and break everything\n // - we create new u8a anyway (concatBytes)\n // - previously we passed all args to cipher, but that was mistake!\n return ((key: Uint8Array, ...args: any[]): any => ({\n encrypt(plaintext: Uint8Array) {\n abytes(plaintext);\n const nonce = randomBytes_(nonceLength);\n const encrypted = fn(key, nonce, ...args).encrypt(plaintext);\n // @ts-ignore\n if (encrypted instanceof Promise) return encrypted.then((ct) => addNonce(nonce, ct));\n return addNonce(nonce, encrypted);\n },\n decrypt(ciphertext: Uint8Array) {\n abytes(ciphertext);\n const nonce = ciphertext.subarray(0, nonceLength);\n const decrypted = ciphertext.subarray(nonceLength);\n return fn(key, nonce, ...args).decrypt(decrypted);\n },\n })) as RemoveNonce<T>;\n}\n\n// workaround for TS 5.9 language mess:\nexport type Uint8ArrayBuffer = ReturnType<typeof Uint8Array.of>;\n", "/**\n * Basic utils for ARX (add-rotate-xor) salsa and chacha ciphers.\n\nRFC8439 requires multi-step cipher stream, where\nauthKey starts with counter: 0, actual msg with counter: 1.\n\nFor this, we need a way to re-use nonce / counter:\n\n const counter = new Uint8Array(4);\n chacha(..., counter, ...); // counter is now 1\n chacha(..., counter, ...); // counter is now 2\n\nThis is complicated:\n\n- 32-bit counters are enough, no need for 64-bit: max ArrayBuffer size in JS is 4GB\n- Original papers don't allow mutating counters\n- Counter overflow is undefined [^1]\n- Idea A: allow providing (nonce | counter) instead of just nonce, re-use it\n- Caveat: Cannot be re-used through all cases:\n- * chacha has (counter | nonce)\n- * xchacha has (nonce16 | counter | nonce16)\n- Idea B: separate nonce / counter and provide separate API for counter re-use\n- Caveat: there are different counter sizes depending on an algorithm.\n- salsa & chacha also differ in structures of key & sigma:\n salsa20: s[0] | k(4) | s[1] | nonce(2) | cnt(2) | s[2] | k(4) | s[3]\n chacha: s(4) | k(8) | cnt(1) | nonce(3)\n chacha20orig: s(4) | k(8) | cnt(2) | nonce(2)\n- Idea C: helper method such as `setSalsaState(key, nonce, sigma, data)`\n- Caveat: we can't re-use counter array\n\nxchacha [^2] uses the subkey and remaining 8 byte nonce with ChaCha20 as normal\n(prefixed by 4 NUL bytes, since [RFC8439] specifies a 12-byte nonce).\n\n[^1]: https://mailarchive.ietf.org/arch/msg/cfrg/gsOnTJzcbgG6OqD8Sc0GO5aR_tU/\n[^2]: https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-xchacha#appendix-A.2\n\n * @module\n */\nimport {\n type PRG,\n type XorStream,\n abool,\n abytes,\n anumber,\n checkOpts,\n clean,\n copyBytes,\n randomBytes,\n u32,\n} from './utils.ts';\n\n// Replaces `TextEncoder`, which is not available in all environments\nconst encodeStr = (str: string) => Uint8Array.from(str.split(''), (c) => c.charCodeAt(0));\nconst sigma16 = encodeStr('expand 16-byte k');\nconst sigma32 = encodeStr('expand 32-byte k');\nconst sigma16_32 = u32(sigma16);\nconst sigma32_32 = u32(sigma32);\n\n/** Rotate left. */\nexport function rotl(a: number, b: number): number {\n return (a << b) | (a >>> (32 - b));\n}\n\n/** Ciphers must use u32 for efficiency. */\nexport type CipherCoreFn = (\n sigma: Uint32Array,\n key: Uint32Array,\n nonce: Uint32Array,\n output: Uint32Array,\n counter: number,\n rounds?: number\n) => void;\n\n/** Method which extends key + short nonce into larger nonce / diff key. */\nexport type ExtendNonceFn = (\n sigma: Uint32Array,\n key: Uint32Array,\n input: Uint32Array,\n output: Uint32Array\n) => void;\n\n/** ARX cipher options.\n * * `allowShortKeys` for 16-byte keys\n * * `counterLength` in bytes\n * * `counterRight`: right: `nonce|counter`; left: `counter|nonce`\n * */\nexport type CipherOpts = {\n allowShortKeys?: boolean; // Original salsa / chacha allow 16-byte keys\n extendNonceFn?: ExtendNonceFn;\n counterLength?: number;\n counterRight?: boolean;\n rounds?: number;\n};\n\n// Is byte array aligned to 4 byte offset (u32)?\nfunction isAligned32(b: Uint8Array) {\n return b.byteOffset % 4 === 0;\n}\n\n// Salsa and Chacha block length is always 512-bit\nconst BLOCK_LEN = 64;\nconst BLOCK_LEN32 = 16;\n\n// new Uint32Array([2**32]) // => Uint32Array(1) [ 0 ]\n// new Uint32Array([2**32-1]) // => Uint32Array(1) [ 4294967295 ]\nconst MAX_COUNTER = 2 ** 32 - 1;\n\nconst U32_EMPTY = Uint32Array.of();\nfunction runCipher(\n core: CipherCoreFn,\n sigma: Uint32Array,\n key: Uint32Array,\n nonce: Uint32Array,\n data: Uint8Array,\n output: Uint8Array,\n counter: number,\n rounds: number\n): void {\n const len = data.length;\n const block = new Uint8Array(BLOCK_LEN);\n const b32 = u32(block);\n // Make sure that buffers aligned to 4 bytes\n const isAligned = isAligned32(data) && isAligned32(output);\n const d32 = isAligned ? u32(data) : U32_EMPTY;\n const o32 = isAligned ? u32(output) : U32_EMPTY;\n for (let pos = 0; pos < len; counter++) {\n core(sigma, key, nonce, b32, counter, rounds);\n if (counter >= MAX_COUNTER) throw new Error('arx: counter overflow');\n const take = Math.min(BLOCK_LEN, len - pos);\n // aligned to 4 bytes\n if (isAligned && take === BLOCK_LEN) {\n const pos32 = pos / 4;\n if (pos % 4 !== 0) throw new Error('arx: invalid block position');\n for (let j = 0, posj: number; j < BLOCK_LEN32; j++) {\n posj = pos32 + j;\n o32[posj] = d32[posj] ^ b32[j];\n }\n pos += BLOCK_LEN;\n continue;\n }\n for (let j = 0, posj; j < take; j++) {\n posj = pos + j;\n output[posj] = data[posj] ^ block[j];\n }\n pos += take;\n }\n}\n\n/** Creates ARX-like (ChaCha, Salsa) cipher stream from core function. */\nexport function createCipher(core: CipherCoreFn, opts: CipherOpts): XorStream {\n const { allowShortKeys, extendNonceFn, counterLength, counterRight, rounds } = checkOpts(\n { allowShortKeys: false, counterLength: 8, counterRight: false, rounds: 20 },\n opts\n );\n if (typeof core !== 'function') throw new Error('core must be a function');\n anumber(counterLength);\n anumber(rounds);\n abool(counterRight);\n abool(allowShortKeys);\n return (\n key: Uint8Array,\n nonce: Uint8Array,\n data: Uint8Array,\n output?: Uint8Array,\n counter = 0\n ): Uint8Array => {\n abytes(key, undefined, 'key');\n abytes(nonce, undefined, 'nonce');\n abytes(data, undefined, 'data');\n const len = data.length;\n if (output === undefined) output = new Uint8Array(len);\n abytes(output, undefined, 'output');\n anumber(counter);\n if (counter < 0 || counter >= MAX_COUNTER) throw new Error('arx: counter overflow');\n if (output.length < len)\n throw new Error(`arx: output (${output.length}) is shorter than data (${len})`);\n const toClean = [];\n\n // Key & sigma\n // key=16 -> sigma16, k=key|key\n // key=32 -> sigma32, k=key\n let l = key.length;\n let k: Uint8Array;\n let sigma: Uint32Array;\n if (l === 32) {\n toClean.push((k = copyBytes(key)));\n sigma = sigma32_32;\n } else if (l === 16 && allowShortKeys) {\n k = new Uint8Array(32);\n k.set(key);\n k.set(key, 16);\n sigma = sigma16_32;\n toClean.push(k);\n } else {\n abytes(key, 32, 'arx key');\n throw new Error('invalid key size');\n // throw new Error(`\"arx key\" expected Uint8Array of length 32, got length=${l}`);\n }\n\n // Nonce\n // salsa20: 8 (8-byte counter)\n // chacha20orig: 8 (8-byte counter)\n // chacha20: 12 (4-byte counter)\n // xsalsa20: 24 (16 -> hsalsa, 8 -> old nonce)\n // xchacha20: 24 (16 -> hchacha, 8 -> old nonce)\n // Align nonce to 4 bytes\n if (!isAligned32(nonce)) toClean.push((nonce = copyBytes(nonce)));\n\n const k32 = u32(k);\n // hsalsa & hchacha: handle extended nonce\n if (extendNonceFn) {\n if (nonce.length !== 24) throw new Error(`arx: extended nonce must be 24 bytes`);\n extendNonceFn(sigma, k32, u32(nonce.subarray(0, 16)), k32);\n nonce = nonce.subarray(16);\n }\n\n // Handle nonce counter\n const nonceNcLen = 16 - counterLength;\n if (nonceNcLen !== nonce.length)\n throw new Error(`arx: nonce must be ${nonceNcLen} or 16 bytes`);\n\n // Pad counter when nonce is 64 bit\n if (nonceNcLen !== 12) {\n const nc = new Uint8Array(12);\n nc.set(nonce, counterRight ? 0 : 12 - nonce.length);\n nonce = nc;\n toClean.push(nonce);\n }\n const n32 = u32(nonce);\n runCipher(core, sigma, k32, n32, data, output, counter, rounds);\n clean(...toClean);\n return output;\n };\n}\n\n/** Internal class which wraps chacha20 or chacha8 to create CSPRNG. */\nexport class _XorStreamPRG implements PRG {\n readonly blockLen: number;\n readonly keyLen: number;\n readonly nonceLen: number;\n private state: Uint8Array;\n private buf: Uint8Array;\n private key: Uint8Array;\n private nonce: Uint8Array;\n private pos: number;\n private ctr: number;\n private cipher: XorStream;\n constructor(\n cipher: XorStream,\n blockLen: number,\n keyLen: number,\n nonceLen: number,\n seed: Uint8Array\n ) {\n this.cipher = cipher;\n this.blockLen = blockLen;\n this.keyLen = keyLen;\n this.nonceLen = nonceLen;\n this.state = new Uint8Array(this.keyLen + this.nonceLen);\n this.reseed(seed);\n this.ctr = 0;\n this.pos = this.blockLen;\n this.buf = new Uint8Array(this.blockLen);\n this.key = this.state.subarray(0, this.keyLen);\n this.nonce = this.state.subarray(this.keyLen);\n }\n private reseed(seed: Uint8Array) {\n abytes(seed);\n if (!seed || seed.length === 0) throw new Error('entropy required');\n for (let i = 0; i < seed.length; i++) this.state[i % this.state.length] ^= seed[i];\n this.ctr = 0;\n this.pos = this.blockLen;\n }\n addEntropy(seed: Uint8Array): void {\n this.state.set(this.randomBytes(this.state.length));\n this.reseed(seed);\n }\n randomBytes(len: number): Uint8Array {\n anumber(len);\n if (len === 0) return new Uint8Array(0);\n const out = new Uint8Array(len);\n let outPos = 0;\n // Leftovers\n if (this.pos < this.blockLen) {\n const take = Math.min(len, this.blockLen - this.pos);\n out.set(this.buf.subarray(this.pos, this.pos + take), 0);\n this.pos += take;\n outPos += take;\n if (outPos === len) return out; // fast path\n }\n // Full blocks directly to out\n const blocks = Math.floor((len - outPos) / this.blockLen);\n if (blocks > 0) {\n const blockBytes = blocks * this.blockLen;\n const b = out.subarray(outPos, outPos + blockBytes);\n this.cipher(this.key, this.nonce, b, b, this.ctr);\n this.ctr += blocks;\n outPos += blockBytes;\n }\n // Save leftovers\n const left = len - outPos;\n if (left > 0) {\n this.buf.fill(0);\n // NOTE: cipher will handle overflow\n this.cipher(this.key, this.nonce, this.buf, this.buf, this.ctr++);\n out.set(this.buf.subarray(0, left), outPos);\n this.pos = left;\n }\n return out;\n }\n clone(): _XorStreamPRG {\n return new _XorStreamPRG(\n this.cipher,\n this.blockLen,\n this.keyLen,\n this.nonceLen,\n this.randomBytes(this.state.length)\n );\n }\n clean(): void {\n this.pos = 0;\n this.ctr = 0;\n this.buf.fill(0);\n this.state.fill(0);\n }\n}\n\nexport type XorPRG = (seed?: Uint8Array) => _XorStreamPRG;\n\nexport const createPRG = (\n cipher: XorStream,\n blockLen: number,\n keyLen: number,\n nonceLen: number\n): XorPRG => {\n return (seed: Uint8Array = randomBytes(32)): _XorStreamPRG =>\n new _XorStreamPRG(cipher, blockLen, keyLen, nonceLen, seed);\n};\n", "/**\n * Poly1305 ([PDF](https://cr.yp.to/mac/poly1305-20050329.pdf),\n * [wiki](https://en.wikipedia.org/wiki/Poly1305))\n * is a fast and parallel secret-key message-authentication code suitable for\n * a wide variety of applications. It was standardized in\n * [RFC 8439](https://www.rfc-editor.org/rfc/rfc8439) and is now used in TLS 1.3.\n *\n * Polynomial MACs are not perfect for every situation:\n * they lack Random Key Robustness: the MAC can be forged, and can't be used in PAKE schemes.\n * See [invisible salamanders attack](https://keymaterial.net/2020/09/07/invisible-salamanders-in-aes-gcm-siv/).\n * To combat invisible salamanders, `hash(key)` can be included in ciphertext,\n * however, this would violate ciphertext indistinguishability:\n * an attacker would know which key was used - so `HKDF(key, i)`\n * could be used instead.\n *\n * Check out [original website](https://cr.yp.to/mac.html).\n * Based on Public Domain [poly1305-donna](https://github.com/floodyberry/poly1305-donna).\n * @module\n */\n// prettier-ignore\nimport {\n abytes, aexists, aoutput, bytesToHex,\n clean, concatBytes, copyBytes, hexToNumber, numberToBytesBE,\n type IHash2\n} from './utils.ts';\n\nfunction u8to16(a: Uint8Array, i: number) {\n return (a[i++] & 0xff) | ((a[i++] & 0xff) << 8);\n}\n\nfunction bytesToNumberLE(bytes: Uint8Array): bigint {\n return hexToNumber(bytesToHex(Uint8Array.from(bytes).reverse()));\n}\n\n/** Small version of `poly1305` without loop unrolling. Unused, provided for auditability. */\nfunction poly1305_small(msg: Uint8Array, key: Uint8Array): Uint8Array {\n abytes(msg);\n abytes(key, 32, 'key');\n const POW_2_130_5 = BigInt(2) ** BigInt(130) - BigInt(5); // 2^130-5\n const POW_2_128_1 = BigInt(2) ** BigInt(128) - BigInt(1); // 2^128-1\n const CLAMP_R = BigInt('0x0ffffffc0ffffffc0ffffffc0fffffff');\n const r = bytesToNumberLE(key.subarray(0, 16)) & CLAMP_R;\n const s = bytesToNumberLE(key.subarray(16));\n // Process by 16 byte chunks\n let acc = BigInt(0);\n for (let i = 0; i < msg.length; i += 16) {\n const m = msg.subarray(i, i + 16);\n const n = bytesToNumberLE(m) | (BigInt(1) << BigInt(8 * m.length));\n acc = ((acc + n) * r) % POW_2_130_5;\n }\n const res = (acc + s) & POW_2_128_1;\n return numberToBytesBE(res, 16).reverse(); // LE\n}\n\n// Can be used to replace `computeTag` in chacha.ts. Unused, provided for auditability.\n// @ts-expect-error\nfunction poly1305_computeTag_small(\n authKey: Uint8Array,\n lengths: Uint8Array,\n ciphertext: Uint8Array,\n AAD?: Uint8Array\n): Uint8Array {\n const res = [];\n const updatePadded2 = (msg: Uint8Array) => {\n res.push(msg);\n const leftover = msg.length % 16;\n if (leftover) res.push(new Uint8Array(16).slice(leftover));\n };\n if (AAD) updatePadded2(AAD);\n updatePadded2(ciphertext);\n res.push(lengths);\n return poly1305_small(concatBytes(...res), authKey);\n}\n\n/** Poly1305 class. Prefer poly1305() function instead. */\nexport class Poly1305 implements IHash2 {\n readonly blockLen = 16;\n readonly outputLen = 16;\n private buffer = new Uint8Array(16);\n private r = new Uint16Array(10); // Allocating 1 array with .subarray() here is slower than 3\n private h = new Uint16Array(10);\n private pad = new Uint16Array(8);\n private pos = 0;\n protected finished = false;\n\n // Can be speed-up using BigUint64Array, at the cost of complexity\n constructor(key: Uint8Array) {\n key = copyBytes(abytes(key, 32, 'key'));\n const t0 = u8to16(key, 0);\n const t1 = u8to16(key, 2);\n const t2 = u8to16(key, 4);\n const t3 = u8to16(key, 6);\n const t4 = u8to16(key, 8);\n const t5 = u8to16(key, 10);\n const t6 = u8to16(key, 12);\n const t7 = u8to16(key, 14);\n\n // https://github.com/floodyberry/poly1305-donna/blob/e6ad6e091d30d7f4ec2d4f978be1fcfcbce72781/poly1305-donna-16.h#L47\n this.r[0] = t0 & 0x1fff;\n this.r[1] = ((t0 >>> 13) | (t1 << 3)) & 0x1fff;\n this.r[2] = ((t1 >>> 10) | (t2 << 6)) & 0x1f03;\n this.r[3] = ((t2 >>> 7) | (t3 << 9)) & 0x1fff;\n this.r[4] = ((t3 >>> 4) | (t4 << 12)) & 0x00ff;\n this.r[5] = (t4 >>> 1) & 0x1ffe;\n this.r[6] = ((t4 >>> 14) | (t5 << 2)) & 0x1fff;\n this.r[7] = ((t5 >>> 11) | (t6 << 5)) & 0x1f81;\n this.r[8] = ((t6 >>> 8) | (t7 << 8)) & 0x1fff;\n this.r[9] = (t7 >>> 5) & 0x007f;\n for (let i = 0; i < 8; i++) this.pad[i] = u8to16(key, 16 + 2 * i);\n }\n\n private process(data: Uint8Array, offset: number, isLast = false) {\n const hibit = isLast ? 0 : 1 << 11;\n const { h, r } = this;\n const r0 = r[0];\n const r1 = r[1];\n const r2 = r[2];\n const r3 = r[3];\n const r4 = r[4];\n const r5 = r[5];\n const r6 = r[6];\n const r7 = r[7];\n const r8 = r[8];\n const r9 = r[9];\n\n const t0 = u8to16(data, offset + 0);\n const t1 = u8to16(data, offset + 2);\n const t2 = u8to16(data, offset + 4);\n const t3 = u8to16(data, offset + 6);\n const t4 = u8to16(data, offset + 8);\n const t5 = u8to16(data, offset + 10);\n const t6 = u8to16(data, offset + 12);\n const t7 = u8to16(data, offset + 14);\n\n let h0 = h[0] + (t0 & 0x1fff);\n let h1 = h[1] + (((t0 >>> 13) | (t1 << 3)) & 0x1fff);\n let h2 = h[2] + (((t1 >>> 10) | (t2 << 6)) & 0x1fff);\n let h3 = h[3] + (((t2 >>> 7) | (t3 << 9)) & 0x1fff);\n let h4 = h[4] + (((t3 >>> 4) | (t4 << 12)) & 0x1fff);\n let h5 = h[5] + ((t4 >>> 1) & 0x1fff);\n let h6 = h[6] + (((t4 >>> 14) | (t5 << 2)) & 0x1fff);\n let h7 = h[7] + (((t5 >>> 11) | (t6 << 5)) & 0x1fff);\n let h8 = h[8] + (((t6 >>> 8) | (t7 << 8)) & 0x1fff);\n let h9 = h[9] + ((t7 >>> 5) | hibit);\n\n let c = 0;\n\n let d0 = c + h0 * r0 + h1 * (5 * r9) + h2 * (5 * r8) + h3 * (5 * r7) + h4 * (5 * r6);\n c = d0 >>> 13;\n d0 &= 0x1fff;\n d0 += h5 * (5 * r5) + h6 * (5 * r4) + h7 * (5 * r3) + h8 * (5 * r2) + h9 * (5 * r1);\n c += d0 >>> 13;\n d0 &= 0x1fff;\n\n let d1 = c + h0 * r1 + h1 * r0 + h2 * (5 * r9) + h3 * (5 * r8) + h4 * (5 * r7);\n c = d1 >>> 13;\n d1 &= 0x1fff;\n d1 += h5 * (5 * r6) + h6 * (5 * r5) + h7 * (5 * r4) + h8 * (5 * r3) + h9 * (5 * r2);\n c += d1 >>> 13;\n d1 &= 0x1fff;\n\n let d2 = c + h0 * r2 + h1 * r1 + h2 * r0 + h3 * (5 * r9) + h4 * (5 * r8);\n c = d2 >>> 13;\n d2 &= 0x1fff;\n d2 += h5 * (5 * r7) + h6 * (5 * r6) + h7 * (5 * r5) + h8 * (5 * r4) + h9 * (5 * r3);\n c += d2 >>> 13;\n d2 &= 0x1fff;\n\n let d3 = c + h0 * r3 + h1 * r2 + h2 * r1 + h3 * r0 + h4 * (5 * r9);\n c = d3 >>> 13;\n d3 &= 0x1fff;\n d3 += h5 * (5 * r8) + h6 * (5 * r7) + h7 * (5 * r6) + h8 * (5 * r5) + h9 * (5 * r4);\n c += d3 >>> 13;\n d3 &= 0x1fff;\n\n let d4 = c + h0 * r4 + h1 * r3 + h2 * r2 + h3 * r1 + h4 * r0;\n c = d4 >>> 13;\n d4 &= 0x1fff;\n d4 += h5 * (5 * r9) + h6 * (5 * r8) + h7 * (5 * r7) + h8 * (5 * r6) + h9 * (5 * r5);\n c += d4 >>> 13;\n d4 &= 0x1fff;\n\n let d5 = c + h0 * r5 + h1 * r4 + h2 * r3 + h3 * r2 + h4 * r1;\n c = d5 >>> 13;\n d5 &= 0x1fff;\n d5 += h5 * r0 + h6 * (5 * r9) + h7 * (5 * r8) + h8 * (5 * r7) + h9 * (5 * r6);\n c += d5 >>> 13;\n d5 &= 0x1fff;\n\n let d6 = c + h0 * r6 + h1 * r5 + h2 * r4 + h3 * r3 + h4 * r2;\n c = d6 >>> 13;\n d6 &= 0x1fff;\n d6 += h5 * r1 + h6 * r0 + h7 * (5 * r9) + h8 * (5 * r8) + h9 * (5 * r7);\n c += d6 >>> 13;\n d6 &= 0x1fff;\n\n let d7 = c + h0 * r7 + h1 * r6 + h2 * r5 + h3 * r4 + h4 * r3;\n c = d7 >>> 13;\n d7 &= 0x1fff;\n d7 += h5 * r2 + h6 * r1 + h7 * r0 + h8 * (5 * r9) + h9 * (5 * r8);\n c += d7 >>> 13;\n d7 &= 0x1fff;\n\n let d8 = c + h0 * r8 + h1 * r7 + h2 * r6 + h3 * r5 + h4 * r4;\n c = d8 >>> 13;\n d8 &= 0x1fff;\n d8 += h5 * r3 + h6 * r2 + h7 * r1 + h8 * r0 + h9 * (5 * r9);\n c += d8 >>> 13;\n d8 &= 0x1fff;\n\n let d9 = c + h0 * r9 + h1 * r8 + h2 * r7 + h3 * r6 + h4 * r5;\n c = d9 >>> 13;\n d9 &= 0x1fff;\n d9 += h5 * r4 + h6 * r3 + h7 * r2 + h8 * r1 + h9 * r0;\n c += d9 >>> 13;\n d9 &= 0x1fff;\n\n c = ((c << 2) + c) | 0;\n c = (c + d0) | 0;\n d0 = c & 0x1fff;\n c = c >>> 13;\n d1 += c;\n\n h[0] = d0;\n h[1] = d1;\n h[2] = d2;\n h[3] = d3;\n h[4] = d4;\n h[5] = d5;\n h[6] = d6;\n h[7] = d7;\n h[8] = d8;\n h[9] = d9;\n }\n\n private finalize() {\n const { h, pad } = this;\n const g = new Uint16Array(10);\n let c = h[1] >>> 13;\n h[1] &= 0x1fff;\n for (let i = 2; i < 10; i++) {\n h[i] += c;\n c = h[i] >>> 13;\n h[i] &= 0x1fff;\n }\n h[0] += c * 5;\n c = h[0] >>> 13;\n h[0] &= 0x1fff;\n h[1] += c;\n c = h[1] >>> 13;\n h[1] &= 0x1fff;\n h[2] += c;\n\n g[0] = h[0] + 5;\n c = g[0] >>> 13;\n g[0] &= 0x1fff;\n for (let i = 1; i < 10; i++) {\n g[i] = h[i] + c;\n c = g[i] >>> 13;\n g[i] &= 0x1fff;\n }\n g[9] -= 1 << 13;\n\n let mask = (c ^ 1) - 1;\n for (let i = 0; i < 10; i++) g[i] &= mask;\n mask = ~mask;\n for (let i = 0; i < 10; i++) h[i] = (h[i] & mask) | g[i];\n h[0] = (h[0] | (h[1] << 13)) & 0xffff;\n h[1] = ((h[1] >>> 3) | (h[2] << 10)) & 0xffff;\n h[2] = ((h[2] >>> 6) | (h[3] << 7)) & 0xffff;\n h[3] = ((h[3] >>> 9) | (h[4] << 4)) & 0xffff;\n h[4] = ((h[4] >>> 12) | (h[5] << 1) | (h[6] << 14)) & 0xffff;\n h[5] = ((h[6] >>> 2) | (h[7] << 11)) & 0xffff;\n h[6] = ((h[7] >>> 5) | (h[8] << 8)) & 0xffff;\n h[7] = ((h[8] >>> 8) | (h[9] << 5)) & 0xffff;\n\n let f = h[0] + pad[0];\n h[0] = f & 0xffff;\n for (let i = 1; i < 8; i++) {\n f = (((h[i] + pad[i]) | 0) + (f >>> 16)) | 0;\n h[i] = f & 0xffff;\n }\n clean(g);\n }\n update(data: Uint8Array): this {\n aexists(this);\n abytes(data);\n data = copyBytes(data);\n const { buffer, blockLen } = this;\n const len = data.length;\n\n for (let pos = 0; pos < len; ) {\n const take = Math.min(blockLen - this.pos, len - pos);\n // Fast path: we have at least one block in input\n if (take === blockLen) {\n for (; blockLen <= len - pos; pos += blockLen) this.process(data, pos);\n continue;\n }\n buffer.set(data.subarray(pos, pos + take), this.pos);\n this.pos += take;\n pos += take;\n if (this.pos === blockLen) {\n this.process(buffer, 0, false);\n this.pos = 0;\n }\n }\n return this;\n }\n destroy(): void {\n clean(this.h, this.r, this.buffer, this.pad);\n }\n digestInto(out: Uint8Array): Uint8Array {\n aexists(this);\n aoutput(out, this);\n this.finished = true;\n const { buffer, h } = this;\n let { pos } = this;\n if (pos) {\n buffer[pos++] = 1;\n for (; pos < 16; pos++) buffer[pos] = 0;\n this.process(buffer, 0, true);\n }\n this.finalize();\n let opos = 0;\n for (let i = 0; i < 8; i++) {\n out[opos++] = h[i] >>> 0;\n out[opos++] = h[i] >>> 8;\n }\n return out;\n }\n digest(): Uint8Array {\n const { buffer, outputLen } = this;\n this.digestInto(buffer);\n const res = buffer.slice(0, outputLen);\n this.destroy();\n return res;\n }\n}\n\nexport type CHash = ReturnType<typeof wrapConstructorWithKey>;\nexport function wrapConstructorWithKey<H extends IHash2>(\n hashCons: (key: Uint8Array) => H\n): {\n (msg: Uint8Array, key: Uint8Array): Uint8Array;\n outputLen: number;\n blockLen: number;\n create(key: Uint8Array): H;\n} {\n const hashC = (msg: Uint8Array, key: Uint8Array): Uint8Array =>\n hashCons(key).update(msg).digest();\n const tmp = hashCons(new Uint8Array(32)); // tmp array, used just once below\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = (key: Uint8Array) => hashCons(key);\n return hashC;\n}\n\n/** Poly1305 MAC from RFC 8439. */\nexport const poly1305: CHash = /** @__PURE__ */ (() =>\n wrapConstructorWithKey((key) => new Poly1305(key)))();\n", "/**\n * ChaCha stream cipher, released\n * in 2008. Developed after Salsa20, ChaCha aims to increase diffusion per round.\n * It was standardized in [RFC 8439](https://www.rfc-editor.org/rfc/rfc8439) and\n * is now used in TLS 1.3.\n *\n * [XChaCha20](https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-xchacha)\n * extended-nonce variant is also provided. Similar to XSalsa, it's safe to use with\n * randomly-generated nonces.\n *\n * Check out [PDF](http://cr.yp.to/chacha/chacha-20080128.pdf) and\n * [wiki](https://en.wikipedia.org/wiki/Salsa20) and\n * [website](https://cr.yp.to/chacha.html).\n *\n * @module\n */\nimport { type XorPRG, createCipher, createPRG, rotl } from './_arx.ts';\nimport { poly1305 } from './_poly1305.ts';\nimport {\n type ARXCipher,\n type CipherWithOutput,\n type XorStream,\n abytes,\n clean,\n equalBytes,\n getOutput,\n u64Lengths,\n wrapCipher,\n} from './utils.ts';\n\n/**\n * ChaCha core function. It is implemented twice:\n * 1. Simple loop (chachaCore_small, hchacha_small)\n * 2. Unrolled loop (chachaCore, hchacha) - 4x faster, but larger & harder to read\n * The specific implementation is selected in `createCipher` below.\n */\n\n/** quarter-round */\n// prettier-ignore\nfunction chachaQR(x: Uint32Array, a: number, b: number, c: number, d: number) {\n x[a] = (x[a] + x[b]) | 0; x[d] = rotl(x[d] ^ x[a], 16);\n x[c] = (x[c] + x[d]) | 0; x[b] = rotl(x[b] ^ x[c], 12);\n x[a] = (x[a] + x[b]) | 0; x[d] = rotl(x[d] ^ x[a], 8);\n x[c] = (x[c] + x[d]) | 0; x[b] = rotl(x[b] ^ x[c], 7);\n}\n\n/** single round */\nfunction chachaRound(x: Uint32Array, rounds = 20) {\n for (let r = 0; r < rounds; r += 2) {\n chachaQR(x, 0, 4, 8, 12);\n chachaQR(x, 1, 5, 9, 13);\n chachaQR(x, 2, 6, 10, 14);\n chachaQR(x, 3, 7, 11, 15);\n chachaQR(x, 0, 5, 10, 15);\n chachaQR(x, 1, 6, 11, 12);\n chachaQR(x, 2, 7, 8, 13);\n chachaQR(x, 3, 4, 9, 14);\n }\n}\n\nconst ctmp = /* @__PURE__ */ new Uint32Array(16);\n\n/** Small version of chacha without loop unrolling. Unused, provided for auditability. */\n// prettier-ignore\nfunction chacha(\n s: Uint32Array, k: Uint32Array, i: Uint32Array, out: Uint32Array,\n isHChacha: boolean = true, rounds: number = 20\n): void {\n // Create initial array using common pattern\n const y = Uint32Array.from([\n s[0], s[1], s[2], s[3], // \"expa\" \"nd 3\" \"2-by\" \"te k\"\n k[0], k[1], k[2], k[3], // Key Key Key Key\n k[4], k[5], k[6], k[7], // Key Key Key Key\n i[0], i[1], i[2], i[3], // Counter Counter Nonce Nonce\n ]);\n const x = ctmp;\n x.set(y);\n chachaRound(x, rounds);\n\n // hchacha extracts 8 specific bytes, chacha adds orig to result\n if (isHChacha) {\n const xindexes = [0, 1, 2, 3, 12, 13, 14, 15];\n for (let i = 0; i < 8; i++) out[i] = x[xindexes[i]];\n } else {\n for (let i = 0; i < 16; i++) out[i] = (y[i] + x[i]) | 0;\n }\n}\n\n/** Identical to `chachaCore`. Unused. */\n// @ts-ignore\nconst chachaCore_small: typeof chachaCore = (s, k, n, out, cnt, rounds) =>\n chacha(s, k, Uint32Array.from([n[0], n[1], cnt, 0]), out, false, rounds);\n/** Identical to `hchacha`. Unused. */\n// @ts-ignore\nconst hchacha_small: typeof hchacha = chacha;\n\n/** Identical to `chachaCore_small`. Unused. */\n// prettier-ignore\nfunction chachaCore(\n s: Uint32Array, k: Uint32Array, n: Uint32Array, out: Uint32Array, cnt: number, rounds = 20\n): void {\n let y00 = s[0], y01 = s[1], y02 = s[2], y03 = s[3], // \"expa\" \"nd 3\" \"2-by\" \"te k\"\n y04 = k[0], y05 = k[1], y06 = k[2], y07 = k[3], // Key Key Key Key\n y08 = k[4], y09 = k[5], y10 = k[6], y11 = k[7], // Key Key Key Key\n y12 = cnt, y13 = n[0], y14 = n[1], y15 = n[2]; // Counter Counter\tNonce Nonce\n // Save state to temporary variables\n let x00 = y00, x01 = y01, x02 = y02, x03 = y03,\n x04 = y04, x05 = y05, x06 = y06, x07 = y07,\n x08 = y08, x09 = y09, x10 = y10, x11 = y11,\n x12 = y12, x13 = y13, x14 = y14, x15 = y15;\n for (let r = 0; r < rounds; r += 2) {\n x00 = (x00 + x04) | 0; x12 = rotl(x12 ^ x00, 16);\n x08 = (x08 + x12) | 0; x04 = rotl(x04 ^ x08, 12);\n x00 = (x00 + x04) | 0; x12 = rotl(x12 ^ x00, 8);\n x08 = (x08 + x12) | 0; x04 = rotl(x04 ^ x08, 7);\n\n x01 = (x01 + x05) | 0; x13 = rotl(x13 ^ x01, 16);\n x09 = (x09 + x13) | 0; x05 = rotl(x05 ^ x09, 12);\n x01 = (x01 + x05) | 0; x13 = rotl(x13 ^ x01, 8);\n x09 = (x09 + x13) | 0; x05 = rotl(x05 ^ x09, 7);\n\n x02 = (x02 + x06) | 0; x14 = rotl(x14 ^ x02, 16);\n x10 = (x10 + x14) | 0; x06 = rotl(x06 ^ x10, 12);\n x02 = (x02 + x06) | 0; x14 = rotl(x14 ^ x02, 8);\n x10 = (x10 + x14) | 0; x06 = rotl(x06 ^ x10, 7);\n\n x03 = (x03 + x07) | 0; x15 = rotl(x15 ^ x03, 16);\n x11 = (x11 + x15) | 0; x07 = rotl(x07 ^ x11, 12);\n x03 = (x03 + x07) | 0; x15 = rotl(x15 ^ x03, 8)\n x11 = (x11 + x15) | 0; x07 = rotl(x07 ^ x11, 7);\n\n x00 = (x00 + x05) | 0; x15 = rotl(x15 ^ x00, 16);\n x10 = (x10 + x15) | 0; x05 = rotl(x05 ^ x10, 12);\n x00 = (x00 + x05) | 0; x15 = rotl(x15 ^ x00, 8);\n x10 = (x10 + x15) | 0; x05 = rotl(x05 ^ x10, 7);\n\n x01 = (x01 + x06) | 0; x12 = rotl(x12 ^ x01, 16);\n x11 = (x11 + x12) | 0; x06 = rotl(x06 ^ x11, 12);\n x01 = (x01 + x06) | 0; x12 = rotl(x12 ^ x01, 8);\n x11 = (x11 + x12) | 0; x06 = rotl(x06 ^ x11, 7);\n\n x02 = (x02 + x07) | 0; x13 = rotl(x13 ^ x02, 16);\n x08 = (x08 + x13) | 0; x07 = rotl(x07 ^ x08, 12);\n x02 = (x02 + x07) | 0; x13 = rotl(x13 ^ x02, 8);\n x08 = (x08 + x13) | 0; x07 = rotl(x07 ^ x08, 7);\n\n x03 = (x03 + x04) | 0; x14 = rotl(x14 ^ x03, 16)\n x09 = (x09 + x14) | 0; x04 = rotl(x04 ^ x09, 12);\n x03 = (x03 + x04) | 0; x14 = rotl(x14 ^ x03, 8);\n x09 = (x09 + x14) | 0; x04 = rotl(x04 ^ x09, 7);\n }\n // Write output\n let oi = 0;\n out[oi++] = (y00 + x00) | 0; out[oi++] = (y01 + x01) | 0;\n out[oi++] = (y02 + x02) | 0; out[oi++] = (y03 + x03) | 0;\n out[oi++] = (y04 + x04) | 0; out[oi++] = (y05 + x05) | 0;\n out[oi++] = (y06 + x06) | 0; out[oi++] = (y07 + x07) | 0;\n out[oi++] = (y08 + x08) | 0; out[oi++] = (y09 + x09) | 0;\n out[oi++] = (y10 + x10) | 0; out[oi++] = (y11 + x11) | 0;\n out[oi++] = (y12 + x12) | 0; out[oi++] = (y13 + x13) | 0;\n out[oi++] = (y14 + x14) | 0; out[oi++] = (y15 + x15) | 0;\n}\n/**\n * hchacha hashes key and nonce into key' and nonce' for xchacha20.\n * Identical to `hchacha_small`.\n * Need to find a way to merge it with `chachaCore` without 25% performance hit.\n */\n// prettier-ignore\nexport function hchacha(\n s: Uint32Array, k: Uint32Array, i: Uint32Array, out: Uint32Array\n): void {\n let x00 = s[0], x01 = s[1], x02 = s[2], x03 = s[3],\n x04 = k[0], x05 = k[1], x06 = k[2], x07 = k[3],\n x08 = k[4], x09 = k[5], x10 = k[6], x11 = k[7],\n x12 = i[0], x13 = i[1], x14 = i[2], x15 = i[3];\n for (let r = 0; r < 20; r += 2) {\n x00 = (x00 + x04) | 0; x12 = rotl(x12 ^ x00, 16);\n x08 = (x08 + x12) | 0; x04 = rotl(x04 ^ x08, 12);\n x00 = (x00 + x04) | 0; x12 = rotl(x12 ^ x00, 8);\n x08 = (x08 + x12) | 0; x04 = rotl(x04 ^ x08, 7);\n\n x01 = (x01 + x05) | 0; x13 = rotl(x13 ^ x01, 16);\n x09 = (x09 + x13) | 0; x05 = rotl(x05 ^ x09, 12);\n x01 = (x01 + x05) | 0; x13 = rotl(x13 ^ x01, 8);\n x09 = (x09 + x13) | 0; x05 = rotl(x05 ^ x09, 7);\n\n x02 = (x02 + x06) | 0; x14 = rotl(x14 ^ x02, 16);\n x10 = (x10 + x14) | 0; x06 = rotl(x06 ^ x10, 12);\n x02 = (x02 + x06) | 0; x14 = rotl(x14 ^ x02, 8);\n x10 = (x10 + x14) | 0; x06 = rotl(x06 ^ x10, 7);\n\n x03 = (x03 + x07) | 0; x15 = rotl(x15 ^ x03, 16);\n x11 = (x11 + x15) | 0; x07 = rotl(x07 ^ x11, 12);\n x03 = (x03 + x07) | 0; x15 = rotl(x15 ^ x03, 8)\n x11 = (x11 + x15) | 0; x07 = rotl(x07 ^ x11, 7);\n\n x00 = (x00 + x05) | 0; x15 = rotl(x15 ^ x00, 16);\n x10 = (x10 + x15) | 0; x05 = rotl(x05 ^ x10, 12);\n x00 = (x00 + x05) | 0; x15 = rotl(x15 ^ x00, 8);\n x10 = (x10 + x15) | 0; x05 = rotl(x05 ^ x10, 7);\n\n x01 = (x01 + x06) | 0; x12 = rotl(x12 ^ x01, 16);\n x11 = (x11 + x12) | 0; x06 = rotl(x06 ^ x11, 12);\n x01 = (x01 + x06) | 0; x12 = rotl(x12 ^ x01, 8);\n x11 = (x11 + x12) | 0; x06 = rotl(x06 ^ x11, 7);\n\n x02 = (x02 + x07) | 0; x13 = rotl(x13 ^ x02, 16);\n x08 = (x08 + x13) | 0; x07 = rotl(x07 ^ x08, 12);\n x02 = (x02 + x07) | 0; x13 = rotl(x13 ^ x02, 8);\n x08 = (x08 + x13) | 0; x07 = rotl(x07 ^ x08, 7);\n\n x03 = (x03 + x04) | 0; x14 = rotl(x14 ^ x03, 16)\n x09 = (x09 + x14) | 0; x04 = rotl(x04 ^ x09, 12);\n x03 = (x03 + x04) | 0; x14 = rotl(x14 ^ x03, 8);\n x09 = (x09 + x14) | 0; x04 = rotl(x04 ^ x09, 7);\n }\n let oi = 0;\n out[oi++] = x00; out[oi++] = x01;\n out[oi++] = x02; out[oi++] = x03;\n out[oi++] = x12; out[oi++] = x13;\n out[oi++] = x14; out[oi++] = x15;\n}\n\n/** Original, non-RFC chacha20 from DJB. 8-byte nonce, 8-byte counter. */\nexport const chacha20orig: XorStream = /* @__PURE__ */ createCipher(chachaCore, {\n counterRight: false,\n counterLength: 8,\n allowShortKeys: true,\n});\n/**\n * ChaCha stream cipher. Conforms to RFC 8439 (IETF, TLS). 12-byte nonce, 4-byte counter.\n * With smaller nonce, it's not safe to make it random (CSPRNG), due to collision chance.\n */\nexport const chacha20: XorStream = /* @__PURE__ */ createCipher(chachaCore, {\n counterRight: false,\n counterLength: 4,\n allowShortKeys: false,\n});\n\n/**\n * XChaCha eXtended-nonce ChaCha. With 24-byte nonce, it's safe to make it random (CSPRNG).\n * See [IRTF draft](https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-xchacha).\n */\nexport const xchacha20: XorStream = /* @__PURE__ */ createCipher(chachaCore, {\n counterRight: false,\n counterLength: 8,\n extendNonceFn: hchacha,\n allowShortKeys: false,\n});\n\n/** Reduced 8-round chacha, described in original paper. */\nexport const chacha8: XorStream = /* @__PURE__ */ createCipher(chachaCore, {\n counterRight: false,\n counterLength: 4,\n rounds: 8,\n});\n\n/** Reduced 12-round chacha, described in original paper. */\nexport const chacha12: XorStream = /* @__PURE__ */ createCipher(chachaCore, {\n counterRight: false,\n counterLength: 4,\n rounds: 12,\n});\n\nconst ZEROS16 = /* @__PURE__ */ new Uint8Array(16);\n// Pad to digest size with zeros\nconst updatePadded = (h: ReturnType<typeof poly1305.create>, msg: Uint8Array) => {\n h.update(msg);\n const leftover = msg.length % 16;\n if (leftover) h.update(ZEROS16.subarray(leftover));\n};\n\nconst ZEROS32 = /* @__PURE__ */ new Uint8Array(32);\nfunction computeTag(\n fn: XorStream,\n key: Uint8Array,\n nonce: Uint8Array,\n ciphertext: Uint8Array,\n AAD?: Uint8Array\n): Uint8Array {\n if (AAD !== undefined) abytes(AAD, undefined, 'AAD');\n const authKey = fn(key, nonce, ZEROS32);\n const lengths = u64Lengths(ciphertext.length, AAD ? AAD.length : 0, true);\n\n // Methods below can be replaced with\n // return poly1305_computeTag_small(authKey, lengths, ciphertext, AAD)\n const h = poly1305.create(authKey);\n if (AAD) updatePadded(h, AAD);\n updatePadded(h, ciphertext);\n h.update(lengths);\n const res = h.digest();\n clean(authKey, lengths);\n return res;\n}\n\n/**\n * AEAD algorithm from RFC 8439.\n * Salsa20 and chacha (RFC 8439) use poly1305 differently.\n * We could have composed them, but it's hard because of authKey:\n * In salsa20, authKey changes position in salsa stream.\n * In chacha, authKey can't be computed inside computeTag, it modifies the counter.\n */\nexport const _poly1305_aead =\n (xorStream: XorStream) =>\n (key: Uint8Array, nonce: Uint8Array, AAD?: Uint8Array): CipherWithOutput => {\n const tagLength = 16;\n return {\n encrypt(plaintext: Uint8Array, output?: Uint8Array) {\n const plength = plaintext.length;\n output = getOutput(plength + tagLength, output, false);\n output.set(plaintext);\n const oPlain = output.subarray(0, -tagLength);\n // Actual encryption\n xorStream(key, nonce, oPlain, oPlain, 1);\n const tag = computeTag(xorStream, key, nonce, oPlain, AAD);\n output.set(tag, plength); // append tag\n clean(tag);\n return output;\n },\n decrypt(ciphertext: Uint8Array, output?: Uint8Array) {\n output = getOutput(ciphertext.length - tagLength, output, false);\n const data = ciphertext.subarray(0, -tagLength);\n const passedTag = ciphertext.subarray(-tagLength);\n const tag = computeTag(xorStream, key, nonce, data, AAD);\n if (!equalBytes(passedTag, tag)) throw new Error('invalid tag');\n output.set(ciphertext.subarray(0, -tagLength));\n // Actual decryption\n xorStream(key, nonce, output, output, 1); // start stream with i=1\n clean(tag);\n return output;\n },\n };\n };\n\n/**\n * ChaCha20-Poly1305 from RFC 8439.\n *\n * Unsafe to use random nonces under the same key, due to collision chance.\n * Prefer XChaCha instead.\n */\nexport const chacha20poly1305: ARXCipher = /* @__PURE__ */ wrapCipher(\n { blockSize: 64, nonceLength: 12, tagLength: 16 },\n _poly1305_aead(chacha20)\n);\n/**\n * XChaCha20-Poly1305 extended-nonce chacha.\n *\n * Can be safely used with random nonces (CSPRNG).\n * See [IRTF draft](https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-xchacha).\n */\nexport const xchacha20poly1305: ARXCipher = /* @__PURE__ */ wrapCipher(\n { blockSize: 64, nonceLength: 24, tagLength: 16 },\n _poly1305_aead(xchacha20)\n);\n\n/**\n * Chacha20 CSPRNG (cryptographically secure pseudorandom number generator).\n * It's best to limit usage to non-production, non-critical cases: for example, test-only.\n * Compatible with libtomcrypt. It does not have a specification, so unclear how secure it is.\n */\nexport const rngChacha20: XorPRG = /* @__PURE__ */ createPRG(chacha20orig, 64, 32, 8);\n/**\n * Chacha20/8 CSPRNG (cryptographically secure pseudorandom number generator).\n * It's best to limit usage to non-production, non-critical cases: for example, test-only.\n * Faster than `rngChacha20`.\n */\nexport const rngChacha8: XorPRG = /* @__PURE__ */ createPRG(chacha8, 64, 32, 12);\n", "/**\n * HKDF (RFC 5869): extract + expand in one step.\n * See https://soatok.blog/2021/11/17/understanding-hkdf/.\n * @module\n */\nimport { hmac } from './hmac.ts';\nimport { ahash, anumber, type CHash, clean, type Input, toBytes } from './utils.ts';\n\n/**\n * HKDF-extract from spec. Less important part. `HKDF-Extract(IKM, salt) -> PRK`\n * Arguments position differs from spec (IKM is first one, since it is not optional)\n * @param hash - hash function that would be used (e.g. sha256)\n * @param ikm - input keying material, the initial key\n * @param salt - optional salt value (a non-secret random value)\n */\nexport function extract(hash: CHash, ikm: Input, salt?: Input): Uint8Array {\n ahash(hash);\n // NOTE: some libraries treat zero-length array as 'not provided';\n // we don't, since we have undefined as 'not provided'\n // https://github.com/RustCrypto/KDFs/issues/15\n if (salt === undefined) salt = new Uint8Array(hash.outputLen);\n return hmac(hash, toBytes(salt), toBytes(ikm));\n}\n\nconst HKDF_COUNTER = /* @__PURE__ */ Uint8Array.from([0]);\nconst EMPTY_BUFFER = /* @__PURE__ */ Uint8Array.of();\n\n/**\n * HKDF-expand from the spec. The most important part. `HKDF-Expand(PRK, info, L) -> OKM`\n * @param hash - hash function that would be used (e.g. sha256)\n * @param prk - a pseudorandom key of at least HashLen octets (usually, the output from the extract step)\n * @param info - optional context and application specific information (can be a zero-length string)\n * @param length - length of output keying material in bytes\n */\nexport function expand(hash: CHash, prk: Input, info?: Input, length: number = 32): Uint8Array {\n ahash(hash);\n anumber(length);\n const olen = hash.outputLen;\n if (length > 255 * olen) throw new Error('Length should be <= 255*HashLen');\n const blocks = Math.ceil(length / olen);\n if (info === undefined) info = EMPTY_BUFFER;\n // first L(ength) octets of T\n const okm = new Uint8Array(blocks * olen);\n // Re-use HMAC instance between blocks\n const HMAC = hmac.create(hash, prk);\n const HMACTmp = HMAC._cloneInto();\n const T = new Uint8Array(HMAC.outputLen);\n for (let counter = 0; counter < blocks; counter++) {\n HKDF_COUNTER[0] = counter + 1;\n // T(0) = empty string (zero length)\n // T(N) = HMAC-Hash(PRK, T(N-1) | info | N)\n HMACTmp.update(counter === 0 ? EMPTY_BUFFER : T)\n .update(info)\n .update(HKDF_COUNTER)\n .digestInto(T);\n okm.set(T, olen * counter);\n HMAC._cloneInto(HMACTmp);\n }\n HMAC.destroy();\n HMACTmp.destroy();\n clean(T, HKDF_COUNTER);\n return okm.slice(0, length);\n}\n\n/**\n * HKDF (RFC 5869): derive keys from an initial input.\n * Combines hkdf_extract + hkdf_expand in one step\n * @param hash - hash function that would be used (e.g. sha256)\n * @param ikm - input keying material, the initial key\n * @param salt - optional salt value (a non-secret random value)\n * @param info - optional context and application specific information (can be a zero-length string)\n * @param length - length of output keying material in bytes\n * @example\n * import { hkdf } from '@noble/hashes/hkdf';\n * import { sha256 } from '@noble/hashes/sha2';\n * import { randomBytes } from '@noble/hashes/utils';\n * const inputKey = randomBytes(32);\n * const salt = randomBytes(32);\n * const info = 'application-key';\n * const hk1 = hkdf(sha256, inputKey, salt, info, 32);\n */\nexport const hkdf = (\n hash: CHash,\n ikm: Input,\n salt: Input | undefined,\n info: Input | undefined,\n length: number\n): Uint8Array => expand(hash, extract(hash, ikm, salt), info, length);\n", "/*! scure-base - MIT License (c) 2022 Paul Miller (paulmillr.com) */\n\nexport interface Coder<F, T> {\n encode(from: F): T;\n decode(to: T): F;\n}\n\nexport interface BytesCoder extends Coder<Uint8Array, string> {\n encode: (data: Uint8Array) => string;\n decode: (str: string) => Uint8Array;\n}\n\nfunction isBytes(a: unknown): a is Uint8Array {\n return a instanceof Uint8Array || (ArrayBuffer.isView(a) && a.constructor.name === 'Uint8Array');\n}\n/** Asserts something is Uint8Array. */\nfunction abytes(b: Uint8Array | undefined): void {\n if (!isBytes(b)) throw new Error('Uint8Array expected');\n}\n\nfunction isArrayOf(isString: boolean, arr: any[]) {\n if (!Array.isArray(arr)) return false;\n if (arr.length === 0) return true;\n if (isString) {\n return arr.every((item) => typeof item === 'string');\n } else {\n return arr.every((item) => Number.isSafeInteger(item));\n }\n}\n\nfunction afn(input: Function): input is Function {\n if (typeof input !== 'function') throw new Error('function expected');\n return true;\n}\n\nfunction astr(label: string, input: unknown): input is string {\n if (typeof input !== 'string') throw new Error(`${label}: string expected`);\n return true;\n}\n\nfunction anumber(n: number): void {\n if (!Number.isSafeInteger(n)) throw new Error(`invalid integer: ${n}`);\n}\n\nfunction aArr(input: any[]) {\n if (!Array.isArray(input)) throw new Error('array expected');\n}\nfunction astrArr(label: string, input: string[]) {\n if (!isArrayOf(true, input)) throw new Error(`${label}: array of strings expected`);\n}\nfunction anumArr(label: string, input: number[]) {\n if (!isArrayOf(false, input)) throw new Error(`${label}: array of numbers expected`);\n}\n\n// TODO: some recusive type inference so it would check correct order of input/output inside rest?\n// like <string, number>, <number, bytes>, <bytes, float>\ntype Chain = [Coder<any, any>, ...Coder<any, any>[]];\n// Extract info from Coder type\ntype Input<F> = F extends Coder<infer T, any> ? T : never;\ntype Output<F> = F extends Coder<any, infer T> ? T : never;\n// Generic function for arrays\ntype First<T> = T extends [infer U, ...any[]] ? U : never;\ntype Last<T> = T extends [...any[], infer U] ? U : never;\ntype Tail<T> = T extends [any, ...infer U] ? U : never;\n\ntype AsChain<C extends Chain, Rest = Tail<C>> = {\n // C[K] = Coder<Input<C[K]>, Input<Rest[k]>>\n [K in keyof C]: Coder<Input<C[K]>, Input<K extends keyof Rest ? Rest[K] : any>>;\n};\n\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction chain<T extends Chain & AsChain<T>>(...args: T): Coder<Input<First<T>>, Output<Last<T>>> {\n const id = (a: any) => a;\n // Wrap call in closure so JIT can inline calls\n const wrap = (a: any, b: any) => (c: any) => a(b(c));\n // Construct chain of args[-1].encode(args[-2].encode([...]))\n const encode = args.map((x) => x.encode).reduceRight(wrap, id);\n // Construct chain of args[0].decode(args[1].decode(...))\n const decode = args.map((x) => x.decode).reduce(wrap, id);\n return { encode, decode };\n}\n\n/**\n * Encodes integer radix representation to array of strings using alphabet and back.\n * Could also be array of strings.\n * @__NO_SIDE_EFFECTS__\n */\nfunction alphabet(letters: string | string[]): Coder<number[], string[]> {\n // mapping 1 to \"b\"\n const lettersA = typeof letters === 'string' ? letters.split('') : letters;\n const len = lettersA.length;\n astrArr('alphabet', lettersA);\n\n // mapping \"b\" to 1\n const indexes = new Map(lettersA.map((l, i) => [l, i]));\n return {\n encode: (digits: number[]) => {\n aArr(digits);\n return digits.map((i) => {\n if (!Number.isSafeInteger(i) || i < 0 || i >= len)\n throw new Error(\n `alphabet.encode: digit index outside alphabet \"${i}\". Allowed: ${letters}`\n );\n return lettersA[i]!;\n });\n },\n decode: (input: string[]): number[] => {\n aArr(input);\n return input.map((letter) => {\n astr('alphabet.decode', letter);\n const i = indexes.get(letter);\n if (i === undefined) throw new Error(`Unknown letter: \"${letter}\". Allowed: ${letters}`);\n return i;\n });\n },\n };\n}\n\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction join(separator = ''): Coder<string[], string> {\n astr('join', separator);\n return {\n encode: (from) => {\n astrArr('join.decode', from);\n return from.join(separator);\n },\n decode: (to) => {\n astr('join.decode', to);\n return to.split(separator);\n },\n };\n}\n\n/**\n * Pad strings array so it has integer number of bits\n * @__NO_SIDE_EFFECTS__\n */\nfunction padding(bits: number, chr = '='): Coder<string[], string[]> {\n anumber(bits);\n astr('padding', chr);\n return {\n encode(data: string[]): string[] {\n astrArr('padding.encode', data);\n while ((data.length * bits) % 8) data.push(chr);\n return data;\n },\n decode(input: string[]): string[] {\n astrArr('padding.decode', input);\n let end = input.length;\n if ((end * bits) % 8)\n throw new Error('padding: invalid, string should have whole number of bytes');\n for (; end > 0 && input[end - 1] === chr; end--) {\n const last = end - 1;\n const byte = last * bits;\n if (byte % 8 === 0) throw new Error('padding: invalid, string has too much padding');\n }\n return input.slice(0, end);\n },\n };\n}\n\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction normalize<T>(fn: (val: T) => T): Coder<T, T> {\n afn(fn);\n return { encode: (from: T) => from, decode: (to: T) => fn(to) };\n}\n\n/**\n * Slow: O(n^2) time complexity\n */\nfunction convertRadix(data: number[], from: number, to: number): number[] {\n // base 1 is impossible\n if (from < 2) throw new Error(`convertRadix: invalid from=${from}, base cannot be less than 2`);\n if (to < 2) throw new Error(`convertRadix: invalid to=${to}, base cannot be less than 2`);\n aArr(data);\n if (!data.length) return [];\n let pos = 0;\n const res = [];\n const digits = Array.from(data, (d) => {\n anumber(d);\n if (d < 0 || d >= from) throw new Error(`invalid integer: ${d}`);\n return d;\n });\n const dlen = digits.length;\n while (true) {\n let carry = 0;\n let done = true;\n for (let i = pos; i < dlen; i++) {\n const digit = digits[i]!;\n const fromCarry = from * carry;\n const digitBase = fromCarry + digit;\n if (\n !Number.isSafeInteger(digitBase) ||\n fromCarry / from !== carry ||\n digitBase - digit !== fromCarry\n ) {\n throw new Error('convertRadix: carry overflow');\n }\n const div = digitBase / to;\n carry = digitBase % to;\n const rounded = Math.floor(div);\n digits[i] = rounded;\n if (!Number.isSafeInteger(rounded) || rounded * to + carry !== digitBase)\n throw new Error('convertRadix: carry overflow');\n if (!done) continue;\n else if (!rounded) pos = i;\n else done = false;\n }\n res.push(carry);\n if (done) break;\n }\n for (let i = 0; i < data.length - 1 && data[i] === 0; i++) res.push(0);\n return res.reverse();\n}\n\nconst gcd = (a: number, b: number): number => (b === 0 ? a : gcd(b, a % b));\nconst radix2carry = /* @__NO_SIDE_EFFECTS__ */ (from: number, to: number) =>\n from + (to - gcd(from, to));\nconst powers: number[] = /* @__PURE__ */ (() => {\n let res = [];\n for (let i = 0; i < 40; i++) res.push(2 ** i);\n return res;\n})();\n/**\n * Implemented with numbers, because BigInt is 5x slower\n */\nfunction convertRadix2(data: number[], from: number, to: number, padding: boolean): number[] {\n aArr(data);\n if (from <= 0 || from > 32) throw new Error(`convertRadix2: wrong from=${from}`);\n if (to <= 0 || to > 32) throw new Error(`convertRadix2: wrong to=${to}`);\n if (radix2carry(from, to) > 32) {\n throw new Error(\n `convertRadix2: carry overflow from=${from} to=${to} carryBits=${radix2carry(from, to)}`\n );\n }\n let carry = 0;\n let pos = 0; // bitwise position in current element\n const max = powers[from]!;\n const mask = powers[to]! - 1;\n const res: number[] = [];\n for (const n of data) {\n anumber(n);\n if (n >= max) throw new Error(`convertRadix2: invalid data word=${n} from=${from}`);\n carry = (carry << from) | n;\n if (pos + from > 32) throw new Error(`convertRadix2: carry overflow pos=${pos} from=${from}`);\n pos += from;\n for (; pos >= to; pos -= to) res.push(((carry >> (pos - to)) & mask) >>> 0);\n const pow = powers[pos];\n if (pow === undefined) throw new Error('invalid carry');\n carry &= pow - 1; // clean carry, otherwise it will cause overflow\n }\n carry = (carry << (to - pos)) & mask;\n if (!padding && pos >= from) throw new Error('Excess padding');\n if (!padding && carry > 0) throw new Error(`Non-zero padding: ${carry}`);\n if (padding && pos > 0) res.push(carry >>> 0);\n return res;\n}\n\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction radix(num: number): Coder<Uint8Array, number[]> {\n anumber(num);\n const _256 = 2 ** 8;\n return {\n encode: (bytes: Uint8Array) => {\n if (!isBytes(bytes)) throw new Error('radix.encode input should be Uint8Array');\n return convertRadix(Array.from(bytes), _256, num);\n },\n decode: (digits: number[]) => {\n anumArr('radix.decode', digits);\n return Uint8Array.from(convertRadix(digits, num, _256));\n },\n };\n}\n\n/**\n * If both bases are power of same number (like `2**8 <-> 2**64`),\n * there is a linear algorithm. For now we have implementation for power-of-two bases only.\n * @__NO_SIDE_EFFECTS__\n */\nfunction radix2(bits: number, revPadding = false): Coder<Uint8Array, number[]> {\n anumber(bits);\n if (bits <= 0 || bits > 32) throw new Error('radix2: bits should be in (0..32]');\n if (radix2carry(8, bits) > 32 || radix2carry(bits, 8) > 32)\n throw new Error('radix2: carry overflow');\n return {\n encode: (bytes: Uint8Array) => {\n if (!isBytes(bytes)) throw new Error('radix2.encode input should be Uint8Array');\n return convertRadix2(Array.from(bytes), 8, bits, !revPadding);\n },\n decode: (digits: number[]) => {\n anumArr('radix2.decode', digits);\n return Uint8Array.from(convertRadix2(digits, bits, 8, revPadding));\n },\n };\n}\n\ntype ArgumentTypes<F extends Function> = F extends (...args: infer A) => any ? A : never;\nfunction unsafeWrapper<T extends (...args: any) => any>(fn: T) {\n afn(fn);\n return function (...args: ArgumentTypes<T>): ReturnType<T> | void {\n try {\n return fn.apply(null, args);\n } catch (e) {}\n };\n}\n\nfunction checksum(\n len: number,\n fn: (data: Uint8Array) => Uint8Array\n): Coder<Uint8Array, Uint8Array> {\n anumber(len);\n afn(fn);\n return {\n encode(data: Uint8Array) {\n if (!isBytes(data)) throw new Error('checksum.encode: input should be Uint8Array');\n const sum = fn(data).slice(0, len);\n const res = new Uint8Array(data.length + len);\n res.set(data);\n res.set(sum, data.length);\n return res;\n },\n decode(data: Uint8Array) {\n if (!isBytes(data)) throw new Error('checksum.decode: input should be Uint8Array');\n const payload = data.slice(0, -len);\n const oldChecksum = data.slice(-len);\n const newChecksum = fn(payload).slice(0, len);\n for (let i = 0; i < len; i++)\n if (newChecksum[i] !== oldChecksum[i]) throw new Error('Invalid checksum');\n return payload;\n },\n };\n}\n\n// prettier-ignore\nexport const utils: { alphabet: typeof alphabet; chain: typeof chain; checksum: typeof checksum; convertRadix: typeof convertRadix; convertRadix2: typeof convertRadix2; radix: typeof radix; radix2: typeof radix2; join: typeof join; padding: typeof padding; } = {\n alphabet, chain, checksum, convertRadix, convertRadix2, radix, radix2, join, padding,\n};\n\n// RFC 4648 aka RFC 3548\n// ---------------------\n\n/**\n * base16 encoding from RFC 4648.\n * @example\n * ```js\n * base16.encode(Uint8Array.from([0x12, 0xab]));\n * // => '12AB'\n * ```\n */\nexport const base16: BytesCoder = chain(radix2(4), alphabet('0123456789ABCDEF'), join(''));\n\n/**\n * base32 encoding from RFC 4648. Has padding.\n * Use `base32nopad` for unpadded version.\n * Also check out `base32hex`, `base32hexnopad`, `base32crockford`.\n * @example\n * ```js\n * base32.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'CKVQ===='\n * base32.decode('CKVQ====');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32: BytesCoder = chain(\n radix2(5),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'),\n padding(5),\n join('')\n);\n\n/**\n * base32 encoding from RFC 4648. No padding.\n * Use `base32` for padded version.\n * Also check out `base32hex`, `base32hexnopad`, `base32crockford`.\n * @example\n * ```js\n * base32nopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'CKVQ'\n * base32nopad.decode('CKVQ');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32nopad: BytesCoder = chain(\n radix2(5),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'),\n join('')\n);\n/**\n * base32 encoding from RFC 4648. Padded. Compared to ordinary `base32`, slightly different alphabet.\n * Use `base32hexnopad` for unpadded version.\n * @example\n * ```js\n * base32hex.encode(Uint8Array.from([0x12, 0xab]));\n * // => '2ALG===='\n * base32hex.decode('2ALG====');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32hex: BytesCoder = chain(\n radix2(5),\n alphabet('0123456789ABCDEFGHIJKLMNOPQRSTUV'),\n padding(5),\n join('')\n);\n\n/**\n * base32 encoding from RFC 4648. No padding. Compared to ordinary `base32`, slightly different alphabet.\n * Use `base32hex` for padded version.\n * @example\n * ```js\n * base32hexnopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => '2ALG'\n * base32hexnopad.decode('2ALG');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32hexnopad: BytesCoder = chain(\n radix2(5),\n alphabet('0123456789ABCDEFGHIJKLMNOPQRSTUV'),\n join('')\n);\n/**\n * base32 encoding from RFC 4648. Doug Crockford's version.\n * https://www.crockford.com/base32.html\n * @example\n * ```js\n * base32crockford.encode(Uint8Array.from([0x12, 0xab]));\n * // => '2ANG'\n * base32crockford.decode('2ANG');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32crockford: BytesCoder = chain(\n radix2(5),\n alphabet('0123456789ABCDEFGHJKMNPQRSTVWXYZ'),\n join(''),\n normalize((s: string) => s.toUpperCase().replace(/O/g, '0').replace(/[IL]/g, '1'))\n);\n\n// Built-in base64 conversion https://caniuse.com/mdn-javascript_builtins_uint8array_frombase64\n// prettier-ignore\nconst hasBase64Builtin: boolean = /* @__PURE__ */ (() =>\n typeof (Uint8Array as any).from([]).toBase64 === 'function' &&\n typeof (Uint8Array as any).fromBase64 === 'function')();\n\nconst decodeBase64Builtin = (s: string, isUrl: boolean) => {\n astr('base64', s);\n const re = isUrl ? /^[A-Za-z0-9=_-]+$/ : /^[A-Za-z0-9=+/]+$/;\n const alphabet = isUrl ? 'base64url' : 'base64';\n if (s.length > 0 && !re.test(s)) throw new Error('invalid base64');\n return (Uint8Array as any).fromBase64(s, { alphabet, lastChunkHandling: 'strict' });\n};\n\n/**\n * base64 from RFC 4648. Padded.\n * Use `base64nopad` for unpadded version.\n * Also check out `base64url`, `base64urlnopad`.\n * Falls back to built-in function, when available.\n * @example\n * ```js\n * base64.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs='\n * base64.decode('Eqs=');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\n// prettier-ignore\nexport const base64: BytesCoder = hasBase64Builtin ? {\n encode(b) { abytes(b); return (b as any).toBase64(); },\n decode(s) { return decodeBase64Builtin(s, false); },\n} : chain(\n radix2(6),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'),\n padding(6),\n join('')\n);\n/**\n * base64 from RFC 4648. No padding.\n * Use `base64` for padded version.\n * @example\n * ```js\n * base64nopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs'\n * base64nopad.decode('Eqs');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base64nopad: BytesCoder = chain(\n radix2(6),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'),\n join('')\n);\n\n/**\n * base64 from RFC 4648, using URL-safe alphabet. Padded.\n * Use `base64urlnopad` for unpadded version.\n * Falls back to built-in function, when available.\n * @example\n * ```js\n * base64url.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs='\n * base64url.decode('Eqs=');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\n// prettier-ignore\nexport const base64url: BytesCoder = hasBase64Builtin ? {\n encode(b) { abytes(b); return (b as any).toBase64({ alphabet: 'base64url' }); },\n decode(s) { return decodeBase64Builtin(s, true); },\n} : chain(\n radix2(6),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'),\n padding(6),\n join('')\n);\n\n/**\n * base64 from RFC 4648, using URL-safe alphabet. No padding.\n * Use `base64url` for padded version.\n * @example\n * ```js\n * base64urlnopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs'\n * base64urlnopad.decode('Eqs');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base64urlnopad: BytesCoder = chain(\n radix2(6),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'),\n join('')\n);\n\n// base58 code\n// -----------\nconst genBase58 = /* @__NO_SIDE_EFFECTS__ */ (abc: string) =>\n chain(radix(58), alphabet(abc), join(''));\n\n/**\n * base58: base64 without ambigous characters +, /, 0, O, I, l.\n * Quadratic (O(n^2)) - so, can't be used on large inputs.\n * @example\n * ```js\n * base58.decode('01abcdef');\n * // => '3UhJW'\n * ```\n */\nexport const base58: BytesCoder = genBase58(\n '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'\n);\n/**\n * base58: flickr version. Check out `base58`.\n */\nexport const base58flickr: BytesCoder = genBase58(\n '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ'\n);\n/**\n * base58: XRP version. Check out `base58`.\n */\nexport const base58xrp: BytesCoder = genBase58(\n 'rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz'\n);\n\n// Data len (index) -> encoded block len\nconst XMR_BLOCK_LEN = [0, 2, 3, 5, 6, 7, 9, 10, 11];\n\n/**\n * base58: XMR version. Check out `base58`.\n * Done in 8-byte blocks (which equals 11 chars in decoding). Last (non-full) block padded with '1' to size in XMR_BLOCK_LEN.\n * Block encoding significantly reduces quadratic complexity of base58.\n */\nexport const base58xmr: BytesCoder = {\n encode(data: Uint8Array) {\n let res = '';\n for (let i = 0; i < data.length; i += 8) {\n const block = data.subarray(i, i + 8);\n res += base58.encode(block).padStart(XMR_BLOCK_LEN[block.length]!, '1');\n }\n return res;\n },\n decode(str: string) {\n let res: number[] = [];\n for (let i = 0; i < str.length; i += 11) {\n const slice = str.slice(i, i + 11);\n const blockLen = XMR_BLOCK_LEN.indexOf(slice.length);\n const block = base58.decode(slice);\n for (let j = 0; j < block.length - blockLen; j++) {\n if (block[j] !== 0) throw new Error('base58xmr: wrong padding');\n }\n res = res.concat(Array.from(block.slice(block.length - blockLen)));\n }\n return Uint8Array.from(res);\n },\n};\n\n/**\n * Method, which creates base58check encoder.\n * Requires function, calculating sha256.\n */\nexport const createBase58check = (sha256: (data: Uint8Array) => Uint8Array): BytesCoder =>\n chain(\n checksum(4, (data) => sha256(sha256(data))),\n base58\n );\n\n/**\n * Use `createBase58check` instead.\n * @deprecated\n */\nexport const base58check: (sha256: (data: Uint8Array) => Uint8Array) => BytesCoder =\n createBase58check;\n\n// Bech32 code\n// -----------\nexport interface Bech32Decoded<Prefix extends string = string> {\n prefix: Prefix;\n words: number[];\n}\nexport interface Bech32DecodedWithArray<Prefix extends string = string> {\n prefix: Prefix;\n words: number[];\n bytes: Uint8Array;\n}\n\nconst BECH_ALPHABET: Coder<number[], string> = chain(\n alphabet('qpzry9x8gf2tvdw0s3jn54khce6mua7l'),\n join('')\n);\n\nconst POLYMOD_GENERATORS = [0x3b6a57b2, 0x26508e6d, 0x1ea119fa, 0x3d4233dd, 0x2a1462b3];\nfunction bech32Polymod(pre: number): number {\n const b = pre >> 25;\n let chk = (pre & 0x1ffffff) << 5;\n for (let i = 0; i < POLYMOD_GENERATORS.length; i++) {\n if (((b >> i) & 1) === 1) chk ^= POLYMOD_GENERATORS[i]!;\n }\n return chk;\n}\n\nfunction bechChecksum(prefix: string, words: number[], encodingConst = 1): string {\n const len = prefix.length;\n let chk = 1;\n for (let i = 0; i < len; i++) {\n const c = prefix.charCodeAt(i);\n if (c < 33 || c > 126) throw new Error(`Invalid prefix (${prefix})`);\n chk = bech32Polymod(chk) ^ (c >> 5);\n }\n chk = bech32Polymod(chk);\n for (let i = 0; i < len; i++) chk = bech32Polymod(chk) ^ (prefix.charCodeAt(i) & 0x1f);\n for (let v of words) chk = bech32Polymod(chk) ^ v;\n for (let i = 0; i < 6; i++) chk = bech32Polymod(chk);\n chk ^= encodingConst;\n return BECH_ALPHABET.encode(convertRadix2([chk % powers[30]!], 30, 5, false));\n}\n\nexport interface Bech32 {\n encode<Prefix extends string>(\n prefix: Prefix,\n words: number[] | Uint8Array,\n limit?: number | false\n ): `${Lowercase<Prefix>}1${string}`;\n decode<Prefix extends string>(\n str: `${Prefix}1${string}`,\n limit?: number | false\n ): Bech32Decoded<Prefix>;\n encodeFromBytes(prefix: string, bytes: Uint8Array): string;\n decodeToBytes(str: string): Bech32DecodedWithArray;\n decodeUnsafe(str: string, limit?: number | false): void | Bech32Decoded<string>;\n fromWords(to: number[]): Uint8Array;\n fromWordsUnsafe(to: number[]): void | Uint8Array;\n toWords(from: Uint8Array): number[];\n}\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction genBech32(encoding: 'bech32' | 'bech32m'): Bech32 {\n const ENCODING_CONST = encoding === 'bech32' ? 1 : 0x2bc830a3;\n const _words = radix2(5);\n const fromWords = _words.decode;\n const toWords = _words.encode;\n const fromWordsUnsafe = unsafeWrapper(fromWords);\n\n function encode<Prefix extends string>(\n prefix: Prefix,\n words: number[] | Uint8Array,\n limit: number | false = 90\n ): `${Lowercase<Prefix>}1${string}` {\n astr('bech32.encode prefix', prefix);\n if (isBytes(words)) words = Array.from(words);\n anumArr('bech32.encode', words);\n const plen = prefix.length;\n if (plen === 0) throw new TypeError(`Invalid prefix length ${plen}`);\n const actualLength = plen + 7 + words.length;\n if (limit !== false && actualLength > limit)\n throw new TypeError(`Length ${actualLength} exceeds limit ${limit}`);\n const lowered = prefix.toLowerCase();\n const sum = bechChecksum(lowered, words, ENCODING_CONST);\n return `${lowered}1${BECH_ALPHABET.encode(words)}${sum}` as `${Lowercase<Prefix>}1${string}`;\n }\n\n function decode<Prefix extends string>(\n str: `${Prefix}1${string}`,\n limit?: number | false\n ): Bech32Decoded<Prefix>;\n function decode(str: string, limit?: number | false): Bech32Decoded;\n function decode(str: string, limit: number | false = 90): Bech32Decoded {\n astr('bech32.decode input', str);\n const slen = str.length;\n if (slen < 8 || (limit !== false && slen > limit))\n throw new TypeError(`invalid string length: ${slen} (${str}). Expected (8..${limit})`);\n // don't allow mixed case\n const lowered = str.toLowerCase();\n if (str !== lowered && str !== str.toUpperCase())\n throw new Error(`String must be lowercase or uppercase`);\n const sepIndex = lowered.lastIndexOf('1');\n if (sepIndex === 0 || sepIndex === -1)\n throw new Error(`Letter \"1\" must be present between prefix and data only`);\n const prefix = lowered.slice(0, sepIndex);\n const data = lowered.slice(sepIndex + 1);\n if (data.length < 6) throw new Error('Data must be at least 6 characters long');\n const words = BECH_ALPHABET.decode(data).slice(0, -6);\n const sum = bechChecksum(prefix, words, ENCODING_CONST);\n if (!data.endsWith(sum)) throw new Error(`Invalid checksum in ${str}: expected \"${sum}\"`);\n return { prefix, words };\n }\n\n const decodeUnsafe = unsafeWrapper(decode);\n\n function decodeToBytes(str: string): Bech32DecodedWithArray {\n const { prefix, words } = decode(str, false);\n return { prefix, words, bytes: fromWords(words) };\n }\n\n function encodeFromBytes(prefix: string, bytes: Uint8Array) {\n return encode(prefix, toWords(bytes));\n }\n\n return {\n encode,\n decode,\n encodeFromBytes,\n decodeToBytes,\n decodeUnsafe,\n fromWords,\n fromWordsUnsafe,\n toWords,\n };\n}\n\n/**\n * bech32 from BIP 173. Operates on words.\n * For high-level, check out scure-btc-signer:\n * https://github.com/paulmillr/scure-btc-signer.\n */\nexport const bech32: Bech32 = genBech32('bech32');\n\n/**\n * bech32m from BIP 350. Operates on words.\n * It was to mitigate `bech32` weaknesses.\n * For high-level, check out scure-btc-signer:\n * https://github.com/paulmillr/scure-btc-signer.\n */\nexport const bech32m: Bech32 = genBech32('bech32m');\n\ndeclare const TextEncoder: any;\ndeclare const TextDecoder: any;\n\n/**\n * UTF-8-to-byte decoder. Uses built-in TextDecoder / TextEncoder.\n * @example\n * ```js\n * const b = utf8.decode(\"hey\"); // => new Uint8Array([ 104, 101, 121 ])\n * const str = utf8.encode(b); // \"hey\"\n * ```\n */\nexport const utf8: BytesCoder = {\n encode: (data) => new TextDecoder().decode(data),\n decode: (str) => new TextEncoder().encode(str),\n};\n\n// Built-in hex conversion https://caniuse.com/mdn-javascript_builtins_uint8array_fromhex\n// prettier-ignore\nconst hasHexBuiltin: boolean = /* @__PURE__ */ (() =>\n typeof (Uint8Array as any).from([]).toHex === 'function' &&\n typeof (Uint8Array as any).fromHex === 'function')();\n// prettier-ignore\nconst hexBuiltin: BytesCoder = {\n encode(data) { abytes(data); return (data as any).toHex(); },\n decode(s) { astr('hex', s); return (Uint8Array as any).fromHex(s); },\n};\n/**\n * hex string decoder. Uses built-in function, when available.\n * @example\n * ```js\n * const b = hex.decode(\"0102ff\"); // => new Uint8Array([ 1, 2, 255 ])\n * const str = hex.encode(b); // \"0102ff\"\n * ```\n */\nexport const hex: BytesCoder = hasHexBuiltin\n ? hexBuiltin\n : chain(\n radix2(4),\n alphabet('0123456789abcdef'),\n join(''),\n normalize((s: string) => {\n if (typeof s !== 'string' || s.length % 2 !== 0)\n throw new TypeError(\n `hex.decode: expected string, got ${typeof s} with length ${s.length}`\n );\n return s.toLowerCase();\n })\n );\n\nexport type SomeCoders = {\n utf8: BytesCoder;\n hex: BytesCoder;\n base16: BytesCoder;\n base32: BytesCoder;\n base64: BytesCoder;\n base64url: BytesCoder;\n base58: BytesCoder;\n base58xmr: BytesCoder;\n};\n// prettier-ignore\nconst CODERS: SomeCoders = {\n utf8, hex, base16, base32, base64, base64url, base58, base58xmr\n};\ntype CoderType = keyof SomeCoders;\nconst coderTypeError =\n 'Invalid encoding type. Available types: utf8, hex, base16, base32, base64, base64url, base58, base58xmr';\n\n/** @deprecated */\nexport const bytesToString = (type: CoderType, bytes: Uint8Array): string => {\n if (typeof type !== 'string' || !CODERS.hasOwnProperty(type)) throw new TypeError(coderTypeError);\n if (!isBytes(bytes)) throw new TypeError('bytesToString() expects Uint8Array');\n return CODERS[type].encode(bytes);\n};\n\n/** @deprecated */\nexport const str: (type: CoderType, bytes: Uint8Array) => string = bytesToString; // as in python, but for bytes only\n\n/** @deprecated */\nexport const stringToBytes = (type: CoderType, str: string): Uint8Array => {\n if (!CODERS.hasOwnProperty(type)) throw new TypeError(coderTypeError);\n if (typeof str !== 'string') throw new TypeError('stringToBytes() expects string');\n return CODERS[type].decode(str);\n};\n/** @deprecated */\nexport const bytes: (type: CoderType, str: string) => Uint8Array = stringToBytes;\n", "/**\n * @module nips/nip-46\n * @description Implementation of NIP-46 (Nostr Connect / Remote Signing)\n *\n * Pure protocol layer \u2014 crypto, encoding, message formatting.\n * No WebSocket, no relay connections, no I/O.\n * Consumers provide their own transport.\n *\n * @see https://github.com/nostr-protocol/nips/blob/master/46.md\n */\n\nimport { schnorr } from '@noble/curves/secp256k1';\nimport { bytesToHex, hexToBytes } from '@noble/curves/abstract/utils';\nimport { sha256 } from '@noble/hashes/sha256';\nimport { randomBytes } from '@noble/hashes/utils';\nimport {\n getConversationKey as nip44GetConversationKey,\n encrypt as nip44Encrypt,\n decrypt as nip44Decrypt,\n} from './nip-44';\nimport type {\n BunkerURI,\n BunkerValidationResult,\n Nip46Request,\n Nip46Response,\n Nip46Session,\n Nip46SessionInfo,\n SignedNostrEvent,\n} from '../types';\nimport { Nip46Method } from '../types';\n\n// \u2500\u2500\u2500 1. Bunker URI \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Parse a bunker:// URI into its components\n * @param uri - bunker://&lt;remote-pubkey&gt;?relay=...&secret=...\n * @returns Parsed BunkerURI or throws on invalid input\n */\nexport function parseBunkerURI(uri: string): BunkerURI {\n if (!uri.startsWith('bunker://')) {\n throw new Error('invalid bunker URI: must start with bunker://');\n }\n\n const url = new URL(uri.replace('bunker://', 'https://'));\n const remotePubkey = url.hostname;\n\n if (!/^[0-9a-f]{64}$/.test(remotePubkey)) {\n throw new Error('invalid bunker URI: remote pubkey must be 64 hex characters');\n }\n\n const relays = url.searchParams.getAll('relay');\n if (relays.length === 0) {\n throw new Error('invalid bunker URI: at least one relay is required');\n }\n\n const secret = url.searchParams.get('secret') || undefined;\n\n return { remotePubkey, relays, secret };\n}\n\n/**\n * Create a bunker:// URI string\n * @param remotePubkey - Remote signer's public key (hex)\n * @param relays - Relay URLs\n * @param secret - Optional connection secret\n * @returns bunker:// URI string\n */\nexport function createBunkerURI(remotePubkey: string, relays: string[], secret?: string): string {\n if (!/^[0-9a-f]{64}$/.test(remotePubkey)) {\n throw new Error('remotePubkey must be 64 hex characters');\n }\n if (relays.length === 0) {\n throw new Error('at least one relay is required');\n }\n\n const params = relays.map(r => `relay=${encodeURIComponent(r)}`);\n if (secret) {\n params.push(`secret=${encodeURIComponent(secret)}`);\n }\n\n return `bunker://${remotePubkey}?${params.join('&')}`;\n}\n\n/**\n * Validate a bunker:// URI and return structured result\n */\nexport function validateBunkerURI(uri: string): BunkerValidationResult {\n try {\n const parsed = parseBunkerURI(uri);\n return { isValid: true, uri: parsed };\n } catch (e) {\n return { isValid: false, error: (e as Error).message };\n }\n}\n\n// \u2500\u2500\u2500 2. Session Management \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Create a new NIP-46 session with an ephemeral keypair\n * @param remotePubkey - Remote signer's public key (hex)\n * @returns Session containing ephemeral keys and NIP-44 conversation key\n */\nexport function createSession(remotePubkey: string): Nip46Session {\n if (!/^[0-9a-f]{64}$/.test(remotePubkey)) {\n throw new Error('remotePubkey must be 64 hex characters');\n }\n\n const clientSecretKeyBytes = randomBytes(32);\n const clientSecretKey = bytesToHex(clientSecretKeyBytes);\n const clientPubkeyBytes = schnorr.getPublicKey(clientSecretKeyBytes);\n const clientPubkey = bytesToHex(clientPubkeyBytes);\n\n const conversationKey = nip44GetConversationKey(clientSecretKeyBytes, remotePubkey);\n\n return {\n clientSecretKey,\n clientPubkey,\n remotePubkey,\n conversationKey,\n };\n}\n\n/**\n * Restore a session from a previously saved ephemeral private key\n * @param clientSecretKey - Hex-encoded ephemeral private key\n * @param remotePubkey - Remote signer's public key (hex)\n * @returns Restored session\n */\nexport function restoreSession(clientSecretKey: string, remotePubkey: string): Nip46Session {\n const clientSecretKeyBytes = hexToBytes(clientSecretKey);\n const clientPubkeyBytes = schnorr.getPublicKey(clientSecretKeyBytes);\n const clientPubkey = bytesToHex(clientPubkeyBytes);\n\n const conversationKey = nip44GetConversationKey(clientSecretKeyBytes, remotePubkey);\n\n return {\n clientSecretKey,\n clientPubkey,\n remotePubkey,\n conversationKey,\n };\n}\n\n/**\n * Get public session info (safe to expose)\n */\nexport function getSessionInfo(session: Nip46Session): Nip46SessionInfo {\n return {\n clientPubkey: session.clientPubkey,\n remotePubkey: session.remotePubkey,\n };\n}\n\n// \u2500\u2500\u2500 3. JSON-RPC Messages \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Create a NIP-46 JSON-RPC request\n * @param method - RPC method name\n * @param params - Array of string parameters\n * @param id - Optional request ID (random if not provided)\n * @returns JSON-RPC request object\n */\nexport function createRequest(method: Nip46Method | string, params: string[], id?: string): Nip46Request {\n return {\n id: id || bytesToHex(randomBytes(16)),\n method,\n params,\n };\n}\n\n/**\n * Create a NIP-46 JSON-RPC response\n * @param id - Request ID being responded to\n * @param result - Result string (on success)\n * @param error - Error string (on failure)\n * @returns JSON-RPC response object\n */\nexport function createResponse(id: string, result?: string, error?: string): Nip46Response {\n const response: Nip46Response = { id };\n if (result !== undefined) response.result = result;\n if (error !== undefined) response.error = error;\n return response;\n}\n\n/**\n * Parse a JSON string into a NIP-46 request or response\n * @param json - JSON string to parse\n * @returns Parsed request or response\n */\nexport function parsePayload(json: string): Nip46Request | Nip46Response {\n const obj = JSON.parse(json) as Record<string, unknown>;\n if (typeof obj.id !== 'string') {\n throw new Error('invalid NIP-46 payload: missing id');\n }\n return obj as unknown as Nip46Request | Nip46Response;\n}\n\n/**\n * Check if a payload is a NIP-46 request\n */\nexport function isRequest(payload: Nip46Request | Nip46Response): payload is Nip46Request {\n return 'method' in payload && 'params' in payload;\n}\n\n/**\n * Check if a payload is a NIP-46 response\n */\nexport function isResponse(payload: Nip46Request | Nip46Response): payload is Nip46Response {\n return 'result' in payload || 'error' in payload;\n}\n\n// \u2500\u2500\u2500 4. Event Wrapping (Kind 24133) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Encrypt and wrap a NIP-46 payload into a kind 24133 signed event\n * @param payload - JSON-RPC request or response to encrypt\n * @param session - NIP-46 session\n * @param recipientPubkey - The recipient's pubkey (hex)\n * @returns Signed kind 24133 event\n */\nexport async function wrapEvent(\n payload: Nip46Request | Nip46Response,\n session: Nip46Session,\n recipientPubkey: string\n): Promise<SignedNostrEvent> {\n const json = JSON.stringify(payload);\n const encrypted = nip44Encrypt(json, session.conversationKey);\n\n const created_at = Math.floor(Date.now() / 1000);\n const event = {\n kind: 24133,\n created_at,\n tags: [['p', recipientPubkey]],\n content: encrypted,\n pubkey: session.clientPubkey,\n };\n\n // Serialize for NIP-01 event ID\n const serialized = JSON.stringify([\n 0,\n event.pubkey,\n event.created_at,\n event.kind,\n event.tags,\n event.content,\n ]);\n\n const eventHash = sha256(new TextEncoder().encode(serialized));\n const privateKeyBytes = hexToBytes(session.clientSecretKey);\n const signatureBytes = schnorr.sign(eventHash, privateKeyBytes);\n\n return {\n ...event,\n id: bytesToHex(eventHash),\n sig: bytesToHex(signatureBytes),\n };\n}\n\n/**\n * Decrypt and parse a kind 24133 event\n * @param event - Signed kind 24133 event\n * @param session - NIP-46 session\n * @returns Decrypted JSON-RPC request or response\n */\nexport function unwrapEvent(\n event: SignedNostrEvent,\n session: Nip46Session\n): Nip46Request | Nip46Response {\n if (event.kind !== 24133) {\n throw new Error(`expected kind 24133, got ${event.kind}`);\n }\n\n const json = nip44Decrypt(event.content, session.conversationKey);\n return parsePayload(json);\n}\n\n// \u2500\u2500\u2500 5. Convenience Request Creators \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Create a 'connect' request\n * @param remotePubkey - Remote signer's pubkey\n * @param secret - Optional connection secret from bunker URI\n * @param permissions - Optional comma-separated permission string\n */\nexport function connectRequest(remotePubkey: string, secret?: string, permissions?: string): Nip46Request {\n const params = [remotePubkey];\n if (secret) params.push(secret);\n else if (permissions) params.push('');\n if (permissions) params.push(permissions);\n return createRequest(Nip46Method.CONNECT, params);\n}\n\n/** Create a 'ping' request */\nexport function pingRequest(): Nip46Request {\n return createRequest(Nip46Method.PING, []);\n}\n\n/** Create a 'get_public_key' request */\nexport function getPublicKeyRequest(): Nip46Request {\n return createRequest(Nip46Method.GET_PUBLIC_KEY, []);\n}\n\n/**\n * Create a 'sign_event' request\n * @param eventJson - JSON-stringified unsigned event\n */\nexport function signEventRequest(eventJson: string): Nip46Request {\n return createRequest(Nip46Method.SIGN_EVENT, [eventJson]);\n}\n\n/**\n * Create a 'nip04_encrypt' request\n * @param thirdPartyPubkey - Public key of the message recipient\n * @param plaintext - Message to encrypt\n */\nexport function nip04EncryptRequest(thirdPartyPubkey: string, plaintext: string): Nip46Request {\n return createRequest(Nip46Method.NIP04_ENCRYPT, [thirdPartyPubkey, plaintext]);\n}\n\n/**\n * Create a 'nip04_decrypt' request\n * @param thirdPartyPubkey - Public key of the message sender\n * @param ciphertext - Encrypted message to decrypt\n */\nexport function nip04DecryptRequest(thirdPartyPubkey: string, ciphertext: string): Nip46Request {\n return createRequest(Nip46Method.NIP04_DECRYPT, [thirdPartyPubkey, ciphertext]);\n}\n\n/**\n * Create a 'nip44_encrypt' request\n * @param thirdPartyPubkey - Public key of the message recipient\n * @param plaintext - Message to encrypt\n */\nexport function nip44EncryptRequest(thirdPartyPubkey: string, plaintext: string): Nip46Request {\n return createRequest(Nip46Method.NIP44_ENCRYPT, [thirdPartyPubkey, plaintext]);\n}\n\n/**\n * Create a 'nip44_decrypt' request\n * @param thirdPartyPubkey - Public key of the message sender\n * @param ciphertext - Encrypted message to decrypt\n */\nexport function nip44DecryptRequest(thirdPartyPubkey: string, ciphertext: string): Nip46Request {\n return createRequest(Nip46Method.NIP44_DECRYPT, [thirdPartyPubkey, ciphertext]);\n}\n\n/** Create a 'get_relays' request */\nexport function getRelaysRequest(): Nip46Request {\n return createRequest(Nip46Method.GET_RELAYS, []);\n}\n\n// \u2500\u2500\u2500 6. Filter Helper \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Create a Nostr filter for subscribing to NIP-46 response events\n * @param clientPubkey - Our ephemeral public key (hex)\n * @param since - Optional since timestamp\n * @returns Filter object for kind 24133 events tagged to us\n */\nexport function createResponseFilter(\n clientPubkey: string,\n since?: number\n): { kinds: number[]; '#p': string[]; since?: number } {\n const filter: { kinds: number[]; '#p': string[]; since?: number } = {\n kinds: [24133],\n '#p': [clientPubkey],\n };\n if (since !== undefined) {\n filter.since = since;\n }\n return filter;\n}\n", "/**\n * @module nips/nip-49\n * @description Implementation of NIP-49 (Private Key Encryption / ncryptsec)\n * @see https://github.com/nostr-protocol/nips/blob/master/49.md\n */\n\nimport { xchacha20poly1305 } from '@noble/ciphers/chacha.js';\nimport { scrypt } from '@noble/hashes/scrypt';\nimport { concatBytes, randomBytes } from '@noble/hashes/utils';\nimport { bech32 as scureBech32 } from '@scure/base';\n\ntype KeySecurityByte = 0x00 | 0x01 | 0x02;\n\n/**\n * Encrypt a Nostr private key with a password, producing an ncryptsec bech32 string\n * @param sec - 32-byte secret key\n * @param password - Password for encryption\n * @param logn - Scrypt log2(N) parameter (default: 16, meaning N=65536)\n * @param ksb - Key security byte: 0x00=unknown, 0x01=unsafe, 0x02=safe (default: 0x02)\n * @returns bech32-encoded ncryptsec string\n */\nexport function encrypt(\n sec: Uint8Array,\n password: string,\n logn: number = 16,\n ksb: KeySecurityByte = 0x02\n): string {\n const salt = randomBytes(16);\n const n = 2 ** logn;\n const normalizedPassword = password.normalize('NFKC');\n const key = scrypt(normalizedPassword, salt, { N: n, r: 8, p: 1, dkLen: 32 });\n const nonce = randomBytes(24);\n const aad = Uint8Array.from([ksb]);\n const cipher = xchacha20poly1305(key, nonce, aad);\n const ciphertext = cipher.encrypt(sec);\n // Binary format: version(1) + logn(1) + salt(16) + nonce(24) + ksb(1) + ciphertext(48 = 32 + 16 tag)\n const payload = concatBytes(\n Uint8Array.from([0x02]),\n Uint8Array.from([logn]),\n salt,\n nonce,\n aad,\n ciphertext\n );\n const words = scureBech32.toWords(payload);\n return scureBech32.encode('ncryptsec', words, 200);\n}\n\n/**\n * Decrypt an ncryptsec bech32 string back to the 32-byte secret key\n * @param ncryptsec - bech32-encoded ncryptsec string\n * @param password - Password used for encryption\n * @returns 32-byte secret key as Uint8Array\n */\nexport function decrypt(ncryptsec: string, password: string): Uint8Array {\n const { prefix, words } = scureBech32.decode(ncryptsec as `${string}1${string}`, 200);\n if (prefix !== 'ncryptsec') throw new Error('invalid ncryptsec prefix');\n const data = new Uint8Array(scureBech32.fromWords(words));\n const version = data[0];\n if (version !== 0x02) throw new Error(`unknown ncryptsec version: ${version}`);\n const logn = data[1];\n const salt = data.subarray(2, 18);\n const nonce = data.subarray(18, 42);\n const ksb = data[42];\n const ciphertext = data.subarray(43);\n const n = 2 ** logn;\n const normalizedPassword = password.normalize('NFKC');\n const key = scrypt(normalizedPassword, salt, { N: n, r: 8, p: 1, dkLen: 32 });\n const aad = Uint8Array.from([ksb]);\n const cipher = xchacha20poly1305(key, nonce, aad);\n return cipher.decrypt(ciphertext);\n}\n", "/**\n * PBKDF (RFC 2898). Can be used to create a key from password and salt.\n * @module\n */\nimport { hmac } from './hmac.ts';\n// prettier-ignore\nimport {\n ahash, anumber,\n asyncLoop, checkOpts, clean, createView, Hash, kdfInputToBytes,\n type CHash,\n type KDFInput\n} from './utils.ts';\n\nexport type Pbkdf2Opt = {\n c: number; // Iterations\n dkLen?: number; // Desired key length in bytes (Intended output length in octets of the derived key\n asyncTick?: number; // Maximum time in ms for which async function can block execution\n};\n// Common prologue and epilogue for sync/async functions\nfunction pbkdf2Init(hash: CHash, _password: KDFInput, _salt: KDFInput, _opts: Pbkdf2Opt) {\n ahash(hash);\n const opts = checkOpts({ dkLen: 32, asyncTick: 10 }, _opts);\n const { c, dkLen, asyncTick } = opts;\n anumber(c);\n anumber(dkLen);\n anumber(asyncTick);\n if (c < 1) throw new Error('iterations (c) should be >= 1');\n const password = kdfInputToBytes(_password);\n const salt = kdfInputToBytes(_salt);\n // DK = PBKDF2(PRF, Password, Salt, c, dkLen);\n const DK = new Uint8Array(dkLen);\n // U1 = PRF(Password, Salt + INT_32_BE(i))\n const PRF = hmac.create(hash, password);\n const PRFSalt = PRF._cloneInto().update(salt);\n return { c, dkLen, asyncTick, DK, PRF, PRFSalt };\n}\n\nfunction pbkdf2Output<T extends Hash<T>>(\n PRF: Hash<T>,\n PRFSalt: Hash<T>,\n DK: Uint8Array,\n prfW: Hash<T>,\n u: Uint8Array\n) {\n PRF.destroy();\n PRFSalt.destroy();\n if (prfW) prfW.destroy();\n clean(u);\n return DK;\n}\n\n/**\n * PBKDF2-HMAC: RFC 2898 key derivation function\n * @param hash - hash function that would be used e.g. sha256\n * @param password - password from which a derived key is generated\n * @param salt - cryptographic salt\n * @param opts - {c, dkLen} where c is work factor and dkLen is output message size\n * @example\n * const key = pbkdf2(sha256, 'password', 'salt', { dkLen: 32, c: Math.pow(2, 18) });\n */\nexport function pbkdf2(\n hash: CHash,\n password: KDFInput,\n salt: KDFInput,\n opts: Pbkdf2Opt\n): Uint8Array {\n const { c, dkLen, DK, PRF, PRFSalt } = pbkdf2Init(hash, password, salt, opts);\n let prfW: any; // Working copy\n const arr = new Uint8Array(4);\n const view = createView(arr);\n const u = new Uint8Array(PRF.outputLen);\n // DK = T1 + T2 + \u22EF + Tdklen/hlen\n for (let ti = 1, pos = 0; pos < dkLen; ti++, pos += PRF.outputLen) {\n // Ti = F(Password, Salt, c, i)\n const Ti = DK.subarray(pos, pos + PRF.outputLen);\n view.setInt32(0, ti, false);\n // F(Password, Salt, c, i) = U1 ^ U2 ^ \u22EF ^ Uc\n // U1 = PRF(Password, Salt + INT_32_BE(i))\n (prfW = PRFSalt._cloneInto(prfW)).update(arr).digestInto(u);\n Ti.set(u.subarray(0, Ti.length));\n for (let ui = 1; ui < c; ui++) {\n // Uc = PRF(Password, Uc\u22121)\n PRF._cloneInto(prfW).update(u).digestInto(u);\n for (let i = 0; i < Ti.length; i++) Ti[i] ^= u[i];\n }\n }\n return pbkdf2Output(PRF, PRFSalt, DK, prfW, u);\n}\n\n/**\n * PBKDF2-HMAC: RFC 2898 key derivation function. Async version.\n * @example\n * await pbkdf2Async(sha256, 'password', 'salt', { dkLen: 32, c: 500_000 });\n */\nexport async function pbkdf2Async(\n hash: CHash,\n password: KDFInput,\n salt: KDFInput,\n opts: Pbkdf2Opt\n): Promise<Uint8Array> {\n const { c, dkLen, asyncTick, DK, PRF, PRFSalt } = pbkdf2Init(hash, password, salt, opts);\n let prfW: any; // Working copy\n const arr = new Uint8Array(4);\n const view = createView(arr);\n const u = new Uint8Array(PRF.outputLen);\n // DK = T1 + T2 + \u22EF + Tdklen/hlen\n for (let ti = 1, pos = 0; pos < dkLen; ti++, pos += PRF.outputLen) {\n // Ti = F(Password, Salt, c, i)\n const Ti = DK.subarray(pos, pos + PRF.outputLen);\n view.setInt32(0, ti, false);\n // F(Password, Salt, c, i) = U1 ^ U2 ^ \u22EF ^ Uc\n // U1 = PRF(Password, Salt + INT_32_BE(i))\n (prfW = PRFSalt._cloneInto(prfW)).update(arr).digestInto(u);\n Ti.set(u.subarray(0, Ti.length));\n await asyncLoop(c - 1, asyncTick, () => {\n // Uc = PRF(Password, Uc\u22121)\n PRF._cloneInto(prfW).update(u).digestInto(u);\n for (let i = 0; i < Ti.length; i++) Ti[i] ^= u[i];\n });\n }\n return pbkdf2Output(PRF, PRFSalt, DK, prfW, u);\n}\n", "/**\n * RFC 7914 Scrypt KDF. Can be used to create a key from password and salt.\n * @module\n */\nimport { pbkdf2 } from './pbkdf2.ts';\nimport { sha256 } from './sha2.ts';\n// prettier-ignore\nimport {\n anumber, asyncLoop,\n checkOpts, clean,\n type KDFInput, rotl,\n swap32IfBE,\n u32\n} from './utils.ts';\n\n// The main Scrypt loop: uses Salsa extensively.\n// Six versions of the function were tried, this is the fastest one.\n// prettier-ignore\nfunction XorAndSalsa(\n prev: Uint32Array,\n pi: number,\n input: Uint32Array,\n ii: number,\n out: Uint32Array,\n oi: number\n) {\n // Based on https://cr.yp.to/salsa20.html\n // Xor blocks\n let y00 = prev[pi++] ^ input[ii++], y01 = prev[pi++] ^ input[ii++];\n let y02 = prev[pi++] ^ input[ii++], y03 = prev[pi++] ^ input[ii++];\n let y04 = prev[pi++] ^ input[ii++], y05 = prev[pi++] ^ input[ii++];\n let y06 = prev[pi++] ^ input[ii++], y07 = prev[pi++] ^ input[ii++];\n let y08 = prev[pi++] ^ input[ii++], y09 = prev[pi++] ^ input[ii++];\n let y10 = prev[pi++] ^ input[ii++], y11 = prev[pi++] ^ input[ii++];\n let y12 = prev[pi++] ^ input[ii++], y13 = prev[pi++] ^ input[ii++];\n let y14 = prev[pi++] ^ input[ii++], y15 = prev[pi++] ^ input[ii++];\n // Save state to temporary variables (salsa)\n let x00 = y00, x01 = y01, x02 = y02, x03 = y03,\n x04 = y04, x05 = y05, x06 = y06, x07 = y07,\n x08 = y08, x09 = y09, x10 = y10, x11 = y11,\n x12 = y12, x13 = y13, x14 = y14, x15 = y15;\n // Main loop (salsa)\n for (let i = 0; i < 8; i += 2) {\n x04 ^= rotl(x00 + x12 | 0, 7); x08 ^= rotl(x04 + x00 | 0, 9);\n x12 ^= rotl(x08 + x04 | 0, 13); x00 ^= rotl(x12 + x08 | 0, 18);\n x09 ^= rotl(x05 + x01 | 0, 7); x13 ^= rotl(x09 + x05 | 0, 9);\n x01 ^= rotl(x13 + x09 | 0, 13); x05 ^= rotl(x01 + x13 | 0, 18);\n x14 ^= rotl(x10 + x06 | 0, 7); x02 ^= rotl(x14 + x10 | 0, 9);\n x06 ^= rotl(x02 + x14 | 0, 13); x10 ^= rotl(x06 + x02 | 0, 18);\n x03 ^= rotl(x15 + x11 | 0, 7); x07 ^= rotl(x03 + x15 | 0, 9);\n x11 ^= rotl(x07 + x03 | 0, 13); x15 ^= rotl(x11 + x07 | 0, 18);\n x01 ^= rotl(x00 + x03 | 0, 7); x02 ^= rotl(x01 + x00 | 0, 9);\n x03 ^= rotl(x02 + x01 | 0, 13); x00 ^= rotl(x03 + x02 | 0, 18);\n x06 ^= rotl(x05 + x04 | 0, 7); x07 ^= rotl(x06 + x05 | 0, 9);\n x04 ^= rotl(x07 + x06 | 0, 13); x05 ^= rotl(x04 + x07 | 0, 18);\n x11 ^= rotl(x10 + x09 | 0, 7); x08 ^= rotl(x11 + x10 | 0, 9);\n x09 ^= rotl(x08 + x11 | 0, 13); x10 ^= rotl(x09 + x08 | 0, 18);\n x12 ^= rotl(x15 + x14 | 0, 7); x13 ^= rotl(x12 + x15 | 0, 9);\n x14 ^= rotl(x13 + x12 | 0, 13); x15 ^= rotl(x14 + x13 | 0, 18);\n }\n // Write output (salsa)\n out[oi++] = (y00 + x00) | 0; out[oi++] = (y01 + x01) | 0;\n out[oi++] = (y02 + x02) | 0; out[oi++] = (y03 + x03) | 0;\n out[oi++] = (y04 + x04) | 0; out[oi++] = (y05 + x05) | 0;\n out[oi++] = (y06 + x06) | 0; out[oi++] = (y07 + x07) | 0;\n out[oi++] = (y08 + x08) | 0; out[oi++] = (y09 + x09) | 0;\n out[oi++] = (y10 + x10) | 0; out[oi++] = (y11 + x11) | 0;\n out[oi++] = (y12 + x12) | 0; out[oi++] = (y13 + x13) | 0;\n out[oi++] = (y14 + x14) | 0; out[oi++] = (y15 + x15) | 0;\n}\n\nfunction BlockMix(input: Uint32Array, ii: number, out: Uint32Array, oi: number, r: number) {\n // The block B is r 128-byte chunks (which is equivalent of 2r 64-byte chunks)\n let head = oi + 0;\n let tail = oi + 16 * r;\n for (let i = 0; i < 16; i++) out[tail + i] = input[ii + (2 * r - 1) * 16 + i]; // X \u2190 B[2r\u22121]\n for (let i = 0; i < r; i++, head += 16, ii += 16) {\n // We write odd & even Yi at same time. Even: 0bXXXXX0 Odd: 0bXXXXX1\n XorAndSalsa(out, tail, input, ii, out, head); // head[i] = Salsa(blockIn[2*i] ^ tail[i-1])\n if (i > 0) tail += 16; // First iteration overwrites tmp value in tail\n XorAndSalsa(out, head, input, (ii += 16), out, tail); // tail[i] = Salsa(blockIn[2*i+1] ^ head[i])\n }\n}\n\nexport type ScryptOpts = {\n N: number; // cost factor\n r: number; // block size\n p: number; // parallelization\n dkLen?: number; // key length\n asyncTick?: number; // block execution max time\n maxmem?: number;\n onProgress?: (progress: number) => void;\n};\n\n// Common prologue and epilogue for sync/async functions\nfunction scryptInit(password: KDFInput, salt: KDFInput, _opts?: ScryptOpts) {\n // Maxmem - 1GB+1KB by default\n const opts = checkOpts(\n {\n dkLen: 32,\n asyncTick: 10,\n maxmem: 1024 ** 3 + 1024,\n },\n _opts\n );\n const { N, r, p, dkLen, asyncTick, maxmem, onProgress } = opts;\n anumber(N);\n anumber(r);\n anumber(p);\n anumber(dkLen);\n anumber(asyncTick);\n anumber(maxmem);\n if (onProgress !== undefined && typeof onProgress !== 'function')\n throw new Error('progressCb should be function');\n const blockSize = 128 * r;\n const blockSize32 = blockSize / 4;\n\n // Max N is 2^32 (Integrify is 32-bit). Real limit is 2^22: JS engines Uint8Array limit is 4GB in 2024.\n // Spec check `N >= 2^(blockSize / 8)` is not done for compat with popular libs,\n // which used incorrect r: 1, p: 8. Also, the check seems to be a spec error:\n // https://www.rfc-editor.org/errata_search.php?rfc=7914\n const pow32 = Math.pow(2, 32);\n if (N <= 1 || (N & (N - 1)) !== 0 || N > pow32) {\n throw new Error('Scrypt: N must be larger than 1, a power of 2, and less than 2^32');\n }\n if (p < 0 || p > ((pow32 - 1) * 32) / blockSize) {\n throw new Error(\n 'Scrypt: p must be a positive integer less than or equal to ((2^32 - 1) * 32) / (128 * r)'\n );\n }\n if (dkLen < 0 || dkLen > (pow32 - 1) * 32) {\n throw new Error(\n 'Scrypt: dkLen should be positive integer less than or equal to (2^32 - 1) * 32'\n );\n }\n const memUsed = blockSize * (N + p);\n if (memUsed > maxmem) {\n throw new Error(\n 'Scrypt: memused is bigger than maxMem. Expected 128 * r * (N + p) > maxmem of ' + maxmem\n );\n }\n // [B0...Bp\u22121] \u2190 PBKDF2HMAC-SHA256(Passphrase, Salt, 1, blockSize*ParallelizationFactor)\n // Since it has only one iteration there is no reason to use async variant\n const B = pbkdf2(sha256, password, salt, { c: 1, dkLen: blockSize * p });\n const B32 = u32(B);\n // Re-used between parallel iterations. Array(iterations) of B\n const V = u32(new Uint8Array(blockSize * N));\n const tmp = u32(new Uint8Array(blockSize));\n let blockMixCb = () => {};\n if (onProgress) {\n const totalBlockMix = 2 * N * p;\n // Invoke callback if progress changes from 10.01 to 10.02\n // Allows to draw smooth progress bar on up to 8K screen\n const callbackPer = Math.max(Math.floor(totalBlockMix / 10000), 1);\n let blockMixCnt = 0;\n blockMixCb = () => {\n blockMixCnt++;\n if (onProgress && (!(blockMixCnt % callbackPer) || blockMixCnt === totalBlockMix))\n onProgress(blockMixCnt / totalBlockMix);\n };\n }\n return { N, r, p, dkLen, blockSize32, V, B32, B, tmp, blockMixCb, asyncTick };\n}\n\nfunction scryptOutput(\n password: KDFInput,\n dkLen: number,\n B: Uint8Array,\n V: Uint32Array,\n tmp: Uint32Array\n) {\n const res = pbkdf2(sha256, password, B, { c: 1, dkLen });\n clean(B, V, tmp);\n return res;\n}\n\n/**\n * Scrypt KDF from RFC 7914.\n * @param password - pass\n * @param salt - salt\n * @param opts - parameters\n * - `N` is cpu/mem work factor (power of 2 e.g. 2**18)\n * - `r` is block size (8 is common), fine-tunes sequential memory read size and performance\n * - `p` is parallelization factor (1 is common)\n * - `dkLen` is output key length in bytes e.g. 32.\n * - `asyncTick` - (default: 10) max time in ms for which async function can block execution\n * - `maxmem` - (default: `1024 ** 3 + 1024` aka 1GB+1KB). A limit that the app could use for scrypt\n * - `onProgress` - callback function that would be executed for progress report\n * @returns Derived key\n * @example\n * scrypt('password', 'salt', { N: 2**18, r: 8, p: 1, dkLen: 32 });\n */\nexport function scrypt(password: KDFInput, salt: KDFInput, opts: ScryptOpts): Uint8Array {\n const { N, r, p, dkLen, blockSize32, V, B32, B, tmp, blockMixCb } = scryptInit(\n password,\n salt,\n opts\n );\n swap32IfBE(B32);\n for (let pi = 0; pi < p; pi++) {\n const Pi = blockSize32 * pi;\n for (let i = 0; i < blockSize32; i++) V[i] = B32[Pi + i]; // V[0] = B[i]\n for (let i = 0, pos = 0; i < N - 1; i++) {\n BlockMix(V, pos, V, (pos += blockSize32), r); // V[i] = BlockMix(V[i-1]);\n blockMixCb();\n }\n BlockMix(V, (N - 1) * blockSize32, B32, Pi, r); // Process last element\n blockMixCb();\n for (let i = 0; i < N; i++) {\n // First u32 of the last 64-byte block (u32 is LE)\n const j = B32[Pi + blockSize32 - 16] % N; // j = Integrify(X) % iterations\n for (let k = 0; k < blockSize32; k++) tmp[k] = B32[Pi + k] ^ V[j * blockSize32 + k]; // tmp = B ^ V[j]\n BlockMix(tmp, 0, B32, Pi, r); // B = BlockMix(B ^ V[j])\n blockMixCb();\n }\n }\n swap32IfBE(B32);\n return scryptOutput(password, dkLen, B, V, tmp);\n}\n\n/**\n * Scrypt KDF from RFC 7914. Async version.\n * @example\n * await scryptAsync('password', 'salt', { N: 2**18, r: 8, p: 1, dkLen: 32 });\n */\nexport async function scryptAsync(\n password: KDFInput,\n salt: KDFInput,\n opts: ScryptOpts\n): Promise<Uint8Array> {\n const { N, r, p, dkLen, blockSize32, V, B32, B, tmp, blockMixCb, asyncTick } = scryptInit(\n password,\n salt,\n opts\n );\n swap32IfBE(B32);\n for (let pi = 0; pi < p; pi++) {\n const Pi = blockSize32 * pi;\n for (let i = 0; i < blockSize32; i++) V[i] = B32[Pi + i]; // V[0] = B[i]\n let pos = 0;\n await asyncLoop(N - 1, asyncTick, () => {\n BlockMix(V, pos, V, (pos += blockSize32), r); // V[i] = BlockMix(V[i-1]);\n blockMixCb();\n });\n BlockMix(V, (N - 1) * blockSize32, B32, Pi, r); // Process last element\n blockMixCb();\n await asyncLoop(N, asyncTick, () => {\n // First u32 of the last 64-byte block (u32 is LE)\n const j = B32[Pi + blockSize32 - 16] % N; // j = Integrify(X) % iterations\n for (let k = 0; k < blockSize32; k++) tmp[k] = B32[Pi + k] ^ V[j * blockSize32 + k]; // tmp = B ^ V[j]\n BlockMix(tmp, 0, B32, Pi, r); // B = BlockMix(B ^ V[j])\n blockMixCb();\n });\n }\n swap32IfBE(B32);\n return scryptOutput(password, dkLen, B, V, tmp);\n}\n", "/**\n * Utility functions for encoding and decoding data\n */\n\n/**\n * Convert a hex string to Uint8Array\n * @param hex Hex string to convert\n * @returns Uint8Array of bytes\n */\nexport function hexToBytes(hex: string): Uint8Array {\n const bytes = new Uint8Array(hex.length / 2);\n for (let i = 0; i < hex.length; i += 2) {\n bytes[i / 2] = parseInt(hex.slice(i, i + 2), 16);\n }\n return bytes;\n}\n\n/**\n * Convert Uint8Array to hex string\n * @param bytes Uint8Array to convert\n * @returns Hex string\n */\nexport function bytesToHex(bytes: Uint8Array): string {\n return Array.from(bytes)\n .map(b => b.toString(16).padStart(2, '0'))\n .join('');\n}\n\n/**\n * Convert a UTF-8 string to Uint8Array\n * @param str UTF-8 string to convert\n * @returns Uint8Array of bytes\n */\nexport function utf8ToBytes(str: string): Uint8Array {\n return new TextEncoder().encode(str);\n}\n\n/**\n * Convert Uint8Array to UTF-8 string\n * @param bytes Uint8Array to convert\n * @returns UTF-8 string\n */\nexport function bytesToUtf8(bytes: Uint8Array): string {\n return new TextDecoder().decode(bytes);\n}\n"],
5
+ "mappings": "q1BAAA,IAAAA,GAAAC,GAAA,CAAAC,GAAAC,KAAA,cACA,SAASC,GAAcC,EAAG,CACxB,GAAI,CAAE,OAAO,KAAK,UAAUA,CAAC,CAAE,MAAW,CAAE,MAAO,cAAe,CACpE,CAEAF,GAAO,QAAUG,GAEjB,SAASA,GAAOC,EAAGC,EAAMC,EAAM,CAC7B,IAAIC,EAAMD,GAAQA,EAAK,WAAcL,GACjCO,EAAS,EACb,GAAI,OAAOJ,GAAM,UAAYA,IAAM,KAAM,CACvC,IAAIK,EAAMJ,EAAK,OAASG,EACxB,GAAIC,IAAQ,EAAG,OAAOL,EACtB,IAAIM,EAAU,IAAI,MAAMD,CAAG,EAC3BC,EAAQ,CAAC,EAAIH,EAAGH,CAAC,EACjB,QAASO,EAAQ,EAAGA,EAAQF,EAAKE,IAC/BD,EAAQC,CAAK,EAAIJ,EAAGF,EAAKM,CAAK,CAAC,EAEjC,OAAOD,EAAQ,KAAK,GAAG,CACzB,CACA,GAAI,OAAON,GAAM,SACf,OAAOA,EAET,IAAIQ,EAASP,EAAK,OAClB,GAAIO,IAAW,EAAG,OAAOR,EAKzB,QAJIS,EAAM,GACNC,EAAI,EAAIN,EACRO,EAAU,GACVC,EAAQZ,GAAKA,EAAE,QAAW,EACrBa,EAAI,EAAGA,EAAID,GAAO,CACzB,GAAIZ,EAAE,WAAWa,CAAC,IAAM,IAAMA,EAAI,EAAID,EAAM,CAE1C,OADAD,EAAUA,EAAU,GAAKA,EAAU,EAC3BX,EAAE,WAAWa,EAAI,CAAC,EAAG,CAC3B,IAAK,KACL,IAAK,KAGH,GAFIH,GAAKF,GAELP,EAAKS,CAAC,GAAK,KAAO,MAClBC,EAAUE,IACZJ,GAAOT,EAAE,MAAMW,EAASE,CAAC,GAC3BJ,GAAO,OAAOR,EAAKS,CAAC,CAAC,EACrBC,EAAUE,EAAI,EACdA,IACA,MACF,IAAK,KAGH,GAFIH,GAAKF,GAELP,EAAKS,CAAC,GAAK,KAAO,MAClBC,EAAUE,IACZJ,GAAOT,EAAE,MAAMW,EAASE,CAAC,GAC3BJ,GAAO,KAAK,MAAM,OAAOR,EAAKS,CAAC,CAAC,CAAC,EACjCC,EAAUE,EAAI,EACdA,IACA,MACF,IAAK,IACL,IAAK,KACL,IAAK,KAGH,GAFIH,GAAKF,GAELP,EAAKS,CAAC,IAAM,OAAW,MACvBC,EAAUE,IACZJ,GAAOT,EAAE,MAAMW,EAASE,CAAC,GAC3B,IAAIC,EAAO,OAAOb,EAAKS,CAAC,EACxB,GAAII,IAAS,SAAU,CACrBL,GAAO,IAAOR,EAAKS,CAAC,EAAI,IACxBC,EAAUE,EAAI,EACdA,IACA,KACF,CACA,GAAIC,IAAS,WAAY,CACvBL,GAAOR,EAAKS,CAAC,EAAE,MAAQ,cACvBC,EAAUE,EAAI,EACdA,IACA,KACF,CACAJ,GAAON,EAAGF,EAAKS,CAAC,CAAC,EACjBC,EAAUE,EAAI,EACdA,IACA,MACF,IAAK,KACH,GAAIH,GAAKF,EACP,MACEG,EAAUE,IACZJ,GAAOT,EAAE,MAAMW,EAASE,CAAC,GAC3BJ,GAAO,OAAOR,EAAKS,CAAC,CAAC,EACrBC,EAAUE,EAAI,EACdA,IACA,MACF,IAAK,IACCF,EAAUE,IACZJ,GAAOT,EAAE,MAAMW,EAASE,CAAC,GAC3BJ,GAAO,IACPE,EAAUE,EAAI,EACdA,IACAH,IACA,KACJ,CACA,EAAEA,CACJ,CACA,EAAEG,CACJ,CACA,OAAIF,IAAY,GACPX,GACAW,EAAUC,IACjBH,GAAOT,EAAE,MAAMW,CAAO,GAGjBF,EACT,IC5GA,IAAAM,GAAAC,GAAA,CAAAC,GAAAC,KAAA,cAEA,IAAMC,GAAS,KAEfD,GAAO,QAAUE,GAEjB,IAAMC,GAAWC,GAAuB,EAAE,SAAW,CAAC,EAChDC,GAAiB,CACrB,eAAgBC,GAChB,gBAAiBA,GACjB,sBAAuBC,GACvB,uBAAwBA,GACxB,oBAAqBA,GACrB,IAAKD,GACL,IAAKA,GACL,IAAKE,GACL,aAAcA,EAChB,EACA,SAASC,GAAcC,EAAOC,EAAQ,CACpC,OAAOD,IAAU,SACb,IACAC,EAAO,OAAO,OAAOD,CAAK,CAChC,CACA,IAAME,GAAwB,OAAO,eAAe,EAC9CC,GAAkB,OAAO,gBAAgB,EAEzCC,GAAiB,CACrB,MAAO,MACP,MAAO,QACP,KAAM,QACN,KAAM,MACN,MAAO,MACP,MAAO,KACT,EAEA,SAASC,GAAmBC,EAAcC,EAAa,CACrD,IAAMC,EAAW,CACf,OAAQD,EACR,OAAQD,EAAaH,EAAe,CACtC,EACAI,EAAYJ,EAAe,EAAIK,CACjC,CAEA,SAASC,GAAuBR,EAAQS,EAAQC,EAAO,CACrD,IAAMC,EAAe,CAAC,EACtBF,EAAO,QAAQV,GAAS,CACtBY,EAAaZ,CAAK,EAAIW,EAAMX,CAAK,EAAIW,EAAMX,CAAK,EAAKP,GAASO,CAAK,GAAKP,GAASW,GAAeJ,CAAK,GAAK,KAAK,GAAKa,EACtH,CAAC,EACDZ,EAAOC,EAAqB,EAAIU,CAClC,CAEA,SAASE,GAAiBC,EAAWC,EAAa,CAChD,OAAI,MAAM,QAAQD,CAAS,EACLA,EAAU,OAAO,SAAUE,EAAG,CAChD,OAAOA,IAAM,qBACf,CAAC,EAEQF,IAAc,GAChB,OAAO,KAAKC,CAAW,EAGzB,EACT,CAEA,SAASxB,GAAM0B,EAAM,CACnBA,EAAOA,GAAQ,CAAC,EAChBA,EAAK,QAAUA,EAAK,SAAW,CAAC,EAEhC,IAAMC,EAAWD,EAAK,QAAQ,SAC9B,GAAIC,GAAY,OAAOA,EAAS,MAAS,WAAc,MAAM,MAAM,iDAAiD,EAEpH,IAAMR,EAAQO,EAAK,QAAQ,OAASzB,GAChCyB,EAAK,QAAQ,QAAOA,EAAK,QAAQ,SAAW,IAChD,IAAMF,EAAcE,EAAK,aAAe,CAAC,EACnCH,EAAYD,GAAgBI,EAAK,QAAQ,UAAWF,CAAW,EACjEI,EAAkBF,EAAK,QAAQ,UAGjC,MAAM,QAAQA,EAAK,QAAQ,SAAS,GACpCA,EAAK,QAAQ,UAAU,QAAQ,qBAAqB,EAAI,KACxDE,EAAkB,IAEpB,IAAMC,EAAe,OAAO,KAAKH,EAAK,cAAgB,CAAC,CAAC,EAClDR,EAAS,CAAC,QAAS,QAAS,OAAQ,OAAQ,QAAS,OAAO,EAAE,OAAOW,CAAY,EAEnF,OAAOV,GAAU,YACnBD,EAAO,QAAQ,SAAUV,EAAO,CAC9BW,EAAMX,CAAK,EAAIW,CACjB,CAAC,GAECO,EAAK,UAAY,IAASA,EAAK,QAAQ,YAAUA,EAAK,MAAQ,UAClE,IAAMlB,EAAQkB,EAAK,OAAS,OACtBjB,EAAS,OAAO,OAAOU,CAAK,EAC7BV,EAAO,MAAKA,EAAO,IAAMY,IAE9BJ,GAAsBR,EAAQS,EAAQC,CAAK,EAE3CN,GAAkB,CAAC,EAAGJ,CAAM,EAE5B,OAAO,eAAeA,EAAQ,WAAY,CACxC,IAAKqB,CACP,CAAC,EACD,OAAO,eAAerB,EAAQ,QAAS,CACrC,IAAKsB,EACL,IAAKC,CACP,CAAC,EAED,IAAMC,EAAU,CACd,SAAAN,EACA,UAAAJ,EACA,SAAUG,EAAK,QAAQ,SACvB,WAAYA,EAAK,QAAQ,WACzB,OAAAR,EACA,UAAWgB,GAAgBR,CAAI,CACjC,EACAjB,EAAO,OAAS0B,GAAUT,CAAI,EAC9BjB,EAAO,MAAQD,EAEfC,EAAO,gBAAkBA,EAAO,gBAChCA,EAAO,KAAOA,EAAO,YAAcA,EAAO,GAC1CA,EAAO,gBAAkBA,EAAO,KAChCA,EAAO,oBAAsBA,EAAO,eACpCA,EAAO,mBAAqBA,EAAO,UACnCA,EAAO,cAAgBA,EAAO,WAC9BA,EAAO,MAAQA,EAAO,MAAQY,GAC9BZ,EAAO,YAAce,EACrBf,EAAO,WAAac,EACpBd,EAAO,iBAAmBmB,EAC1BnB,EAAO,MAAQ2B,EAEXT,IAAUlB,EAAO,UAAY4B,GAAoB,GAErD,SAASP,GAAe,CACtB,OAAOvB,GAAa,KAAK,MAAO,IAAI,CACtC,CAEA,SAASwB,GAAY,CACnB,OAAO,KAAK,MACd,CACA,SAASC,EAAUxB,EAAO,CACxB,GAAIA,IAAU,UAAY,CAAC,KAAK,OAAO,OAAOA,CAAK,EACjD,MAAM,MAAM,iBAAmBA,CAAK,EAEtC,KAAK,OAASA,EAEd8B,GAAI,KAAML,EAASxB,EAAQ,OAAO,EAClC6B,GAAI,KAAML,EAASxB,EAAQ,OAAO,EAClC6B,GAAI,KAAML,EAASxB,EAAQ,MAAM,EACjC6B,GAAI,KAAML,EAASxB,EAAQ,MAAM,EACjC6B,GAAI,KAAML,EAASxB,EAAQ,OAAO,EAClC6B,GAAI,KAAML,EAASxB,EAAQ,OAAO,EAElCoB,EAAa,QAASrB,GAAU,CAC9B8B,GAAI,KAAML,EAASxB,EAAQD,CAAK,CAClC,CAAC,CACH,CAEA,SAAS4B,EAAOG,EAAUC,EAAc,CACtC,GAAI,CAACD,EACH,MAAM,IAAI,MAAM,iCAAiC,EAEnDC,EAAeA,GAAgB,CAAC,EAC5BjB,GAAagB,EAAS,cACxBC,EAAa,YAAcD,EAAS,aAEtC,IAAME,EAA0BD,EAAa,YAC7C,GAAIjB,GAAakB,EAAyB,CACxC,IAAIC,EAAmB,OAAO,OAAO,CAAC,EAAGlB,EAAaiB,CAAuB,EACzEE,EAAiBjB,EAAK,QAAQ,YAAc,GAC5C,OAAO,KAAKgB,CAAgB,EAC5BnB,EACJ,OAAOgB,EAAS,YAChBK,GAAiB,CAACL,CAAQ,EAAGI,EAAgBD,EAAkB,KAAK,gBAAgB,CACtF,CACA,SAASG,EAAOC,EAAQ,CACtB,KAAK,aAAeA,EAAO,YAAc,GAAK,EAG9C,KAAK,SAAWP,EAEZG,IACF,KAAK,YAAcA,EACnB,KAAK,WAAaC,GAEhBhB,IACF,KAAK,UAAYU,GACf,CAAC,EAAE,OAAOS,EAAO,UAAU,SAAUP,CAAQ,CAC/C,EAEJ,CACAM,EAAM,UAAY,KAClB,IAAME,EAAY,IAAIF,EAAM,IAAI,EAGhC,OAAAhC,GAAkB,KAAMkC,CAAS,EAEjCA,EAAU,MAAQ,KAAK,MAEhBA,CACT,CACA,OAAOtC,CACT,CAEA,SAAS0B,GAAWT,EAAM,CACxB,IAAMG,EAAeH,EAAK,cAAgB,CAAC,EAErCsB,EAAS,OAAO,OAAO,CAAC,EAAGhD,GAAK,OAAO,OAAQ6B,CAAY,EAC3DoB,EAAS,OAAO,OAAO,CAAC,EAAGjD,GAAK,OAAO,OAAQkD,GAAarB,CAAY,CAAC,EAE/E,MAAO,CACL,OAAAmB,EACA,OAAAC,CACF,CACF,CAEA,SAASC,GAAcC,EAAK,CAC1B,IAAMC,EAAW,CAAC,EAClB,cAAO,KAAKD,CAAG,EAAE,QAAQ,SAAUE,EAAK,CACtCD,EAASD,EAAIE,CAAG,CAAC,EAAIA,CACvB,CAAC,EACMD,CACT,CAEApD,GAAK,OAAS,CACZ,OAAQ,CACN,MAAO,GACP,MAAO,GACP,KAAM,GACN,KAAM,GACN,MAAO,GACP,MAAO,EACT,EACA,OAAQ,CACN,GAAI,QACJ,GAAI,QACJ,GAAI,OACJ,GAAI,OACJ,GAAI,QACJ,GAAI,OACN,CACF,EAEAA,GAAK,eAAiBG,GACtBH,GAAK,iBAAmB,OAAO,OAAO,CAAC,EAAG,CAAE,SAAAsD,GAAU,UAAAC,GAAW,SAAAC,GAAU,QAAAC,EAAQ,CAAC,EAEpF,SAASC,GAAiBjD,EAAQ,CAChC,IAAM8B,EAAW,CAAC,EACd9B,EAAO,UACT8B,EAAS,KAAK9B,EAAO,QAAQ,EAI/B,IAAIkD,EAAYlD,EAAOE,EAAe,EACtC,KAAOgD,EAAU,QACfA,EAAYA,EAAU,OAClBA,EAAU,OAAO,UACnBpB,EAAS,KAAKoB,EAAU,OAAO,QAAQ,EAI3C,OAAOpB,EAAS,QAAQ,CAC1B,CAEA,SAASD,GAAKsB,EAAMlC,EAAMmC,EAAYrD,EAAO,CAW3C,GATA,OAAO,eAAeoD,EAAMpD,EAAO,CACjC,MAAQD,GAAaqD,EAAK,MAAOC,CAAU,EAAItD,GAAaC,EAAOqD,CAAU,EACzExC,GACAwC,EAAWnD,EAAqB,EAAEF,CAAK,EAC3C,SAAU,GACV,WAAY,GACZ,aAAc,EAChB,CAAC,EAEG,CAACkB,EAAK,UAAYkC,EAAKpD,CAAK,IAAMa,GACpC,OAIFuC,EAAKpD,CAAK,EAAIsD,GAAWF,EAAMlC,EAAMmC,EAAYrD,CAAK,EAGtD,IAAM+B,EAAWmB,GAAgBE,CAAI,EACjCrB,EAAS,SAAW,IAIxBqB,EAAKpD,CAAK,EAAIuD,GAA2BxB,EAAUqB,EAAKpD,CAAK,CAAC,EAChE,CAEA,SAASuD,GAA4BxB,EAAUyB,EAAS,CACtD,OAAO,UAAY,CACjB,OAAOA,EAAQ,MAAM,KAAM,CAAC,GAAGzB,EAAU,GAAG,SAAS,CAAC,CACxD,CACF,CAEA,SAASuB,GAAYF,EAAMlC,EAAMmC,EAAYrD,EAAO,CAClD,OAAQ,SAAUyD,EAAO,CACvB,OAAO,UAAgB,CACrB,IAAMC,EAAKxC,EAAK,UAAU,EACpByC,EAAO,IAAI,MAAM,UAAU,MAAM,EACjChD,EAAS,OAAO,gBAAkB,OAAO,eAAe,IAAI,IAAMlB,GAAYA,GAAW,KAC/F,QAASmE,EAAI,EAAGA,EAAID,EAAK,OAAQC,IAAKD,EAAKC,CAAC,EAAI,UAAUA,CAAC,EAS3D,GAPI1C,EAAK,WAAa,CAACA,EAAK,UAC1BkB,GAAiBuB,EAAM,KAAK,WAAY,KAAK,YAAa,KAAK,gBAAgB,EAE7EzC,EAAK,UAAYA,EAAK,WACxBuC,EAAM,KAAK9C,EAAOkD,GAAS,KAAM7D,EAAO2D,EAAMD,EAAIxC,EAAK,UAAU,CAAC,EAC7DuC,EAAM,MAAM9C,EAAOgD,CAAI,EAE1BzC,EAAK,SAAU,CACjB,IAAM4C,EAAgB5C,EAAK,SAAS,OAASkC,EAAK,OAC5CW,EAAgBV,EAAW,OAAO,OAAOS,CAAa,EACtDE,EAAcX,EAAW,OAAO,OAAOrD,CAAK,EAClD,GAAIgE,EAAcD,EAAe,OACjC5C,GAAS,KAAM,CACb,GAAAuC,EACA,YAAa1D,EACb,YAAAgE,EACA,cAAAF,EACA,cAAeT,EAAW,OAAO,OAAOnC,EAAK,SAAS,OAASkC,EAAK,MAAM,EAC1E,KAAMlC,EAAK,SAAS,KACpB,IAAKnB,GAAaqD,EAAK,OAAQC,CAAU,CAC3C,EAAGM,CAAI,CACT,CACF,CACF,GAAGP,EAAKlD,EAAqB,EAAEF,CAAK,CAAC,CACvC,CAEA,SAAS6D,GAAU5D,EAAQD,EAAO2D,EAAMD,EAAIO,EAAa,CAAC,EAAG,CAC3D,GAAM,CACJ,MAAOC,EAAiB,IAAMjE,EAAO,OAAO,OAAOD,CAAK,EACxD,IAAKmE,EAAsBxB,GAAQA,CACrC,EAAIsB,EACAhE,EAAO,YAAYmC,GAAiBuB,EAAM1D,EAAO,WAAYA,EAAO,YAAaA,EAAO,gBAAgB,EAC5G,IAAMmE,EAAaT,EAAK,MAAM,EAC1BU,EAAMD,EAAW,CAAC,EAChBE,EAAY,CAAC,EACfZ,IACFY,EAAU,KAAOZ,GAEnBY,EAAU,MAAQJ,EAAelE,EAAOC,EAAO,OAAO,OAAOD,CAAK,CAAC,EAEnE,IAAIuE,GAAOtE,EAAO,YAAc,GAAK,EAGrC,GAFIsE,EAAM,IAAGA,EAAM,GAEfF,IAAQ,MAAQ,OAAOA,GAAQ,SAAU,CAC3C,KAAOE,KAAS,OAAOH,EAAW,CAAC,GAAM,UACvC,OAAO,OAAOE,EAAWF,EAAW,MAAM,CAAC,EAE7CC,EAAMD,EAAW,OAAS7E,GAAO6E,EAAW,MAAM,EAAGA,CAAU,EAAI,MACrE,MAAW,OAAOC,GAAQ,WAAUA,EAAM9E,GAAO6E,EAAW,MAAM,EAAGA,CAAU,GAC/E,OAAIC,IAAQ,SAAWC,EAAU,IAAMD,GAEZF,EAAmBG,CAAS,CAEzD,CAEA,SAASlC,GAAkBuB,EAAM5C,EAAWC,EAAaI,EAAiB,CACxE,QAAWwC,KAAKD,EACd,GAAIvC,GAAmBuC,EAAKC,CAAC,YAAa,MACxCD,EAAKC,CAAC,EAAIpE,GAAK,eAAe,IAAImE,EAAKC,CAAC,CAAC,UAChC,OAAOD,EAAKC,CAAC,GAAM,UAAY,CAAC,MAAM,QAAQD,EAAKC,CAAC,CAAC,EAC9D,QAAW3C,KAAK0C,EAAKC,CAAC,EAChB7C,GAAaA,EAAU,QAAQE,CAAC,EAAI,IAAMA,KAAKD,IACjD2C,EAAKC,CAAC,EAAE3C,CAAC,EAAID,EAAYC,CAAC,EAAE0C,EAAKC,CAAC,EAAE3C,CAAC,CAAC,EAKhD,CAEA,SAASE,GAAUlB,EAAQiB,EAAMyC,EAAM,CACrC,IAAMa,EAAOtD,EAAK,KACZwC,EAAKxC,EAAK,GACVuD,EAAcvD,EAAK,YACnB8C,EAAc9C,EAAK,YACnBwD,EAAMxD,EAAK,IACXa,EAAW9B,EAAO,UAAU,SAElCmC,GACEuB,EACA1D,EAAO,YAAc,OAAO,KAAKA,EAAO,WAAW,EACnDA,EAAO,YACPA,EAAO,mBAAqB,OAAY,GAAOA,EAAO,gBACxD,EACAA,EAAO,UAAU,GAAKyD,EACtBzD,EAAO,UAAU,SAAW0D,EAAK,OAAO,SAAUgB,EAAK,CAErD,OAAO5C,EAAS,QAAQ4C,CAAG,IAAM,EACnC,CAAC,EAED1E,EAAO,UAAU,MAAM,MAAQwE,EAC/BxE,EAAO,UAAU,MAAM,MAAQ+D,EAE/BQ,EAAKC,EAAaxE,EAAO,UAAWyE,CAAG,EAEvCzE,EAAO,UAAY4B,GAAoBE,CAAQ,CACjD,CAEA,SAASF,GAAqBE,EAAU,CACtC,MAAO,CACL,GAAI,EACJ,SAAU,CAAC,EACX,SAAUA,GAAY,CAAC,EACvB,MAAO,CAAE,MAAO,GAAI,MAAO,CAAE,CAC/B,CACF,CAEA,SAASjC,GAAY8E,EAAK,CACxB,IAAMjC,EAAM,CACV,KAAMiC,EAAI,YAAY,KACtB,IAAKA,EAAI,QACT,MAAOA,EAAI,KACb,EACA,QAAW/B,KAAO+B,EACZjC,EAAIE,CAAG,IAAM,SACfF,EAAIE,CAAG,EAAI+B,EAAI/B,CAAG,GAGtB,OAAOF,CACT,CAEA,SAASjB,GAAiBR,EAAM,CAC9B,OAAI,OAAOA,EAAK,WAAc,WACrBA,EAAK,UAEVA,EAAK,YAAc,GACd4B,GAEFC,EACT,CAEA,SAASnD,IAAQ,CAAE,MAAO,CAAC,CAAE,CAC7B,SAASC,GAAagF,EAAG,CAAE,OAAOA,CAAE,CACpC,SAAShE,IAAQ,CAAC,CAElB,SAASiC,IAAY,CAAE,MAAO,EAAM,CACpC,SAASC,IAAa,CAAE,OAAO,KAAK,IAAI,CAAE,CAC1C,SAASC,IAAY,CAAE,OAAO,KAAK,MAAM,KAAK,IAAI,EAAI,GAAM,CAAE,CAC9D,SAASC,IAAW,CAAE,OAAO,IAAI,KAAK,KAAK,IAAI,CAAC,EAAE,YAAY,CAAE,CAIhE,SAASvD,IAA0B,CACjC,SAASoF,EAAMC,EAAG,CAAE,OAAO,OAAOA,EAAM,KAAeA,CAAE,CACzD,GAAI,CACF,OAAI,OAAO,WAAe,KAC1B,OAAO,eAAe,OAAO,UAAW,aAAc,CACpD,IAAK,UAAY,CACf,cAAO,OAAO,UAAU,WAChB,KAAK,WAAa,IAC5B,EACA,aAAc,EAChB,CAAC,EACM,UACT,MAAY,CACV,OAAOD,EAAK,IAAI,GAAKA,EAAK,MAAM,GAAKA,EAAK,IAAI,GAAK,CAAC,CACtD,CACF,CAGAxF,GAAO,QAAQ,QAAUE,GACzBF,GAAO,QAAQ,KAAOE,KChdtB,IAAAwF,GAAA,GAAAC,GAAAD,GAAA,aAAAE,KAAA,IAAOA,GAAPC,GAAAC,GAAA,KAAOF,GAAQ,CAAC,ICAhB,IAAAG,GAAAC,GAAAC,IAAA,cACA,OAAO,eAAeA,GAAS,aAAc,CAAE,MAAO,EAAK,CAAC,EAC5DA,GAAQ,QAAUA,GAAQ,OAAS,OACnC,IAAMC,GAAW,mCACXC,GAAe,CAAC,EACtB,QAASC,EAAI,EAAGA,EAAIF,GAAS,OAAQE,IAAK,CACtC,IAAMC,EAAIH,GAAS,OAAOE,CAAC,EAC3BD,GAAaE,CAAC,EAAID,CACtB,CACA,SAASE,GAAYC,EAAK,CACtB,IAAMC,EAAID,GAAO,GACjB,OAAUA,EAAM,WAAc,EACzB,EAAGC,GAAK,EAAK,GAAK,UAClB,EAAGA,GAAK,EAAK,GAAK,UAClB,EAAGA,GAAK,EAAK,GAAK,UAClB,EAAGA,GAAK,EAAK,GAAK,WAClB,EAAGA,GAAK,EAAK,GAAK,SAC3B,CACA,SAASC,GAAUC,EAAQ,CACvB,IAAIC,EAAM,EACV,QAASC,EAAI,EAAGA,EAAIF,EAAO,OAAQ,EAAEE,EAAG,CACpC,IAAMC,EAAIH,EAAO,WAAWE,CAAC,EAC7B,GAAIC,EAAI,IAAMA,EAAI,IACd,MAAO,mBAAqBH,EAAS,IACzCC,EAAML,GAAYK,CAAG,EAAKE,GAAK,CACnC,CACAF,EAAML,GAAYK,CAAG,EACrB,QAASC,EAAI,EAAGA,EAAIF,EAAO,OAAQ,EAAEE,EAAG,CACpC,IAAME,EAAIJ,EAAO,WAAWE,CAAC,EAC7BD,EAAML,GAAYK,CAAG,EAAKG,EAAI,EAClC,CACA,OAAOH,CACX,CACA,SAASI,GAAQC,EAAMC,EAAQC,EAASC,EAAK,CACzC,IAAIC,EAAQ,EACRC,EAAO,EACLC,GAAQ,GAAKJ,GAAW,EACxBK,EAAS,CAAC,EAChB,QAASX,EAAI,EAAGA,EAAII,EAAK,OAAQ,EAAEJ,EAG/B,IAFAQ,EAASA,GAASH,EAAUD,EAAKJ,CAAC,EAClCS,GAAQJ,EACDI,GAAQH,GACXG,GAAQH,EACRK,EAAO,KAAMH,GAASC,EAAQC,CAAI,EAG1C,GAAIH,EACIE,EAAO,GACPE,EAAO,KAAMH,GAAUF,EAAUG,EAASC,CAAI,MAGjD,CACD,GAAID,GAAQJ,EACR,MAAO,iBACX,GAAKG,GAAUF,EAAUG,EAASC,EAC9B,MAAO,kBACf,CACA,OAAOC,CACX,CACA,SAASC,GAAQC,EAAO,CACpB,OAAOV,GAAQU,EAAO,EAAG,EAAG,EAAI,CACpC,CACA,SAASC,GAAgBC,EAAO,CAC5B,IAAMC,EAAMb,GAAQY,EAAO,EAAG,EAAG,EAAK,EACtC,GAAI,MAAM,QAAQC,CAAG,EACjB,OAAOA,CACf,CACA,SAASC,GAAUF,EAAO,CACtB,IAAMC,EAAMb,GAAQY,EAAO,EAAG,EAAG,EAAK,EACtC,GAAI,MAAM,QAAQC,CAAG,EACjB,OAAOA,EACX,MAAM,IAAI,MAAMA,CAAG,CACvB,CACA,SAASE,GAAuBC,EAAU,CACtC,IAAIC,EACAD,IAAa,SACbC,EAAiB,EAGjBA,EAAiB,UAErB,SAASC,EAAOvB,EAAQiB,EAAOO,EAAO,CAElC,GADAA,EAAQA,GAAS,GACbxB,EAAO,OAAS,EAAIiB,EAAM,OAASO,EACnC,MAAM,IAAI,UAAU,sBAAsB,EAC9CxB,EAASA,EAAO,YAAY,EAE5B,IAAIC,EAAMF,GAAUC,CAAM,EAC1B,GAAI,OAAOC,GAAQ,SACf,MAAM,IAAI,MAAMA,CAAG,EACvB,IAAIY,EAASb,EAAS,IACtB,QAASE,EAAI,EAAGA,EAAIe,EAAM,OAAQ,EAAEf,EAAG,CACnC,IAAMP,EAAIsB,EAAMf,CAAC,EACjB,GAAIP,GAAK,IAAM,EACX,MAAM,IAAI,MAAM,gBAAgB,EACpCM,EAAML,GAAYK,CAAG,EAAIN,EACzBkB,GAAUrB,GAAS,OAAOG,CAAC,CAC/B,CACA,QAASO,EAAI,EAAGA,EAAI,EAAG,EAAEA,EACrBD,EAAML,GAAYK,CAAG,EAEzBA,GAAOqB,EACP,QAASpB,EAAI,EAAGA,EAAI,EAAG,EAAEA,EAAG,CACxB,IAAME,EAAKH,IAAS,EAAIC,GAAK,EAAM,GACnCW,GAAUrB,GAAS,OAAOY,CAAC,CAC/B,CACA,OAAOS,CACX,CACA,SAASY,EAASC,EAAKF,EAAO,CAE1B,GADAA,EAAQA,GAAS,GACbE,EAAI,OAAS,EACb,OAAOA,EAAM,aACjB,GAAIA,EAAI,OAASF,EACb,MAAO,uBAEX,IAAMG,EAAUD,EAAI,YAAY,EAC1BE,EAAUF,EAAI,YAAY,EAChC,GAAIA,IAAQC,GAAWD,IAAQE,EAC3B,MAAO,qBAAuBF,EAClCA,EAAMC,EACN,IAAME,EAAQH,EAAI,YAAY,GAAG,EACjC,GAAIG,IAAU,GACV,MAAO,8BAAgCH,EAC3C,GAAIG,IAAU,EACV,MAAO,sBAAwBH,EACnC,IAAM1B,EAAS0B,EAAI,MAAM,EAAGG,CAAK,EAC3BC,EAAYJ,EAAI,MAAMG,EAAQ,CAAC,EACrC,GAAIC,EAAU,OAAS,EACnB,MAAO,iBACX,IAAI7B,EAAMF,GAAUC,CAAM,EAC1B,GAAI,OAAOC,GAAQ,SACf,OAAOA,EACX,IAAMgB,EAAQ,CAAC,EACf,QAASf,EAAI,EAAGA,EAAI4B,EAAU,OAAQ,EAAE5B,EAAG,CACvC,IAAMC,EAAI2B,EAAU,OAAO5B,CAAC,EACtBE,EAAIX,GAAaU,CAAC,EACxB,GAAIC,IAAM,OACN,MAAO,qBAAuBD,EAClCF,EAAML,GAAYK,CAAG,EAAIG,EAErB,EAAAF,EAAI,GAAK4B,EAAU,SAEvBb,EAAM,KAAKb,CAAC,CAChB,CACA,OAAIH,IAAQqB,EACD,wBAA0BI,EAC9B,CAAE,OAAA1B,EAAQ,MAAAiB,CAAM,CAC3B,CACA,SAASc,EAAaL,EAAKF,EAAO,CAC9B,IAAMN,EAAMO,EAASC,EAAKF,CAAK,EAC/B,GAAI,OAAON,GAAQ,SACf,OAAOA,CACf,CACA,SAASc,EAAON,EAAKF,EAAO,CACxB,IAAMN,EAAMO,EAASC,EAAKF,CAAK,EAC/B,GAAI,OAAON,GAAQ,SACf,OAAOA,EACX,MAAM,IAAI,MAAMA,CAAG,CACvB,CACA,MAAO,CACH,aAAAa,EACA,OAAAC,EACA,OAAAT,EACA,QAAAT,GACA,gBAAAE,GACA,UAAAG,EACJ,CACJ,CACA5B,GAAQ,OAAS6B,GAAuB,QAAQ,EAChD7B,GAAQ,QAAU6B,GAAuB,SAAS,ICzKlD,IAAAa,GAAAC,GAAAC,IAAA,cAEAA,GAAQ,WAAaC,GACrBD,GAAQ,YAAcE,GACtBF,GAAQ,cAAgBG,GAExB,IAAIC,GAAS,CAAC,EACVC,GAAY,CAAC,EACbC,GAAM,OAAO,WAAe,IAAc,WAAa,MAEvDC,GAAO,mEACX,IAASC,GAAI,EAAGC,GAAMF,GAAK,OAAQC,GAAIC,GAAK,EAAED,GAC5CJ,GAAOI,EAAC,EAAID,GAAKC,EAAC,EAClBH,GAAUE,GAAK,WAAWC,EAAC,CAAC,EAAIA,GAFzB,IAAAA,GAAOC,GAOhBJ,GAAU,EAAiB,EAAI,GAC/BA,GAAU,EAAiB,EAAI,GAE/B,SAASK,GAASC,EAAK,CACrB,IAAIF,EAAME,EAAI,OAEd,GAAIF,EAAM,EAAI,EACZ,MAAM,IAAI,MAAM,gDAAgD,EAKlE,IAAIG,EAAWD,EAAI,QAAQ,GAAG,EAC1BC,IAAa,KAAIA,EAAWH,GAEhC,IAAII,EAAkBD,IAAaH,EAC/B,EACA,EAAKG,EAAW,EAEpB,MAAO,CAACA,EAAUC,CAAe,CACnC,CAGA,SAASZ,GAAYU,EAAK,CACxB,IAAIG,EAAOJ,GAAQC,CAAG,EAClBC,EAAWE,EAAK,CAAC,EACjBD,EAAkBC,EAAK,CAAC,EAC5B,OAASF,EAAWC,GAAmB,EAAI,EAAKA,CAClD,CAEA,SAASE,GAAaJ,EAAKC,EAAUC,EAAiB,CACpD,OAASD,EAAWC,GAAmB,EAAI,EAAKA,CAClD,CAEA,SAASX,GAAaS,EAAK,CACzB,IAAIK,EACAF,EAAOJ,GAAQC,CAAG,EAClBC,EAAWE,EAAK,CAAC,EACjBD,EAAkBC,EAAK,CAAC,EAExBG,EAAM,IAAIX,GAAIS,GAAYJ,EAAKC,EAAUC,CAAe,CAAC,EAEzDK,EAAU,EAGVT,EAAMI,EAAkB,EACxBD,EAAW,EACXA,EAEAJ,EACJ,IAAKA,EAAI,EAAGA,EAAIC,EAAKD,GAAK,EACxBQ,EACGX,GAAUM,EAAI,WAAWH,CAAC,CAAC,GAAK,GAChCH,GAAUM,EAAI,WAAWH,EAAI,CAAC,CAAC,GAAK,GACpCH,GAAUM,EAAI,WAAWH,EAAI,CAAC,CAAC,GAAK,EACrCH,GAAUM,EAAI,WAAWH,EAAI,CAAC,CAAC,EACjCS,EAAIC,GAAS,EAAKF,GAAO,GAAM,IAC/BC,EAAIC,GAAS,EAAKF,GAAO,EAAK,IAC9BC,EAAIC,GAAS,EAAIF,EAAM,IAGzB,OAAIH,IAAoB,IACtBG,EACGX,GAAUM,EAAI,WAAWH,CAAC,CAAC,GAAK,EAChCH,GAAUM,EAAI,WAAWH,EAAI,CAAC,CAAC,GAAK,EACvCS,EAAIC,GAAS,EAAIF,EAAM,KAGrBH,IAAoB,IACtBG,EACGX,GAAUM,EAAI,WAAWH,CAAC,CAAC,GAAK,GAChCH,GAAUM,EAAI,WAAWH,EAAI,CAAC,CAAC,GAAK,EACpCH,GAAUM,EAAI,WAAWH,EAAI,CAAC,CAAC,GAAK,EACvCS,EAAIC,GAAS,EAAKF,GAAO,EAAK,IAC9BC,EAAIC,GAAS,EAAIF,EAAM,KAGlBC,CACT,CAEA,SAASE,GAAiBC,EAAK,CAC7B,OAAOhB,GAAOgB,GAAO,GAAK,EAAI,EAC5BhB,GAAOgB,GAAO,GAAK,EAAI,EACvBhB,GAAOgB,GAAO,EAAI,EAAI,EACtBhB,GAAOgB,EAAM,EAAI,CACrB,CAEA,SAASC,GAAaC,EAAOC,EAAOC,EAAK,CAGvC,QAFIR,EACAS,EAAS,CAAC,EACL,EAAIF,EAAO,EAAIC,EAAK,GAAK,EAChCR,GACIM,EAAM,CAAC,GAAK,GAAM,WAClBA,EAAM,EAAI,CAAC,GAAK,EAAK,QACtBA,EAAM,EAAI,CAAC,EAAI,KAClBG,EAAO,KAAKN,GAAgBH,CAAG,CAAC,EAElC,OAAOS,EAAO,KAAK,EAAE,CACvB,CAEA,SAAStB,GAAemB,EAAO,CAQ7B,QAPIN,EACAP,EAAMa,EAAM,OACZI,EAAajB,EAAM,EACnBkB,EAAQ,CAAC,EACTC,EAAiB,MAGZpB,EAAI,EAAGqB,EAAOpB,EAAMiB,EAAYlB,EAAIqB,EAAMrB,GAAKoB,EACtDD,EAAM,KAAKN,GAAYC,EAAOd,EAAIA,EAAIoB,EAAkBC,EAAOA,EAAQrB,EAAIoB,CAAe,CAAC,EAI7F,OAAIF,IAAe,GACjBV,EAAMM,EAAMb,EAAM,CAAC,EACnBkB,EAAM,KACJvB,GAAOY,GAAO,CAAC,EACfZ,GAAQY,GAAO,EAAK,EAAI,EACxB,IACF,GACSU,IAAe,IACxBV,GAAOM,EAAMb,EAAM,CAAC,GAAK,GAAKa,EAAMb,EAAM,CAAC,EAC3CkB,EAAM,KACJvB,GAAOY,GAAO,EAAE,EAChBZ,GAAQY,GAAO,EAAK,EAAI,EACxBZ,GAAQY,GAAO,EAAK,EAAI,EACxB,GACF,GAGKW,EAAM,KAAK,EAAE,CACtB,ICrJA,IAAAG,GAAAC,GAAAC,IAAA,CACAA,GAAQ,KAAO,SAAUC,EAAQC,EAAQC,EAAMC,EAAMC,EAAQ,CAC3D,IAAIC,EAAGC,EACHC,EAAQH,EAAS,EAAKD,EAAO,EAC7BK,GAAQ,GAAKD,GAAQ,EACrBE,EAAQD,GAAQ,EAChBE,EAAQ,GACRC,EAAIT,EAAQE,EAAS,EAAK,EAC1B,EAAIF,EAAO,GAAK,EAChBU,EAAIZ,EAAOC,EAASU,CAAC,EAOzB,IALAA,GAAK,EAELN,EAAIO,GAAM,GAAM,CAACF,GAAU,EAC3BE,IAAO,CAACF,EACRA,GAASH,EACFG,EAAQ,EAAGL,EAAKA,EAAI,IAAOL,EAAOC,EAASU,CAAC,EAAGA,GAAK,EAAGD,GAAS,EAAG,CAK1E,IAHAJ,EAAID,GAAM,GAAM,CAACK,GAAU,EAC3BL,IAAO,CAACK,EACRA,GAASP,EACFO,EAAQ,EAAGJ,EAAKA,EAAI,IAAON,EAAOC,EAASU,CAAC,EAAGA,GAAK,EAAGD,GAAS,EAAG,CAE1E,GAAIL,IAAM,EACRA,EAAI,EAAII,MACH,IAAIJ,IAAMG,EACf,OAAOF,EAAI,KAAQM,EAAI,GAAK,GAAK,MAEjCN,EAAIA,EAAI,KAAK,IAAI,EAAGH,CAAI,EACxBE,EAAIA,EAAII,EAEV,OAAQG,EAAI,GAAK,GAAKN,EAAI,KAAK,IAAI,EAAGD,EAAIF,CAAI,CAChD,EAEAJ,GAAQ,MAAQ,SAAUC,EAAQa,EAAOZ,EAAQC,EAAMC,EAAMC,EAAQ,CACnE,IAAIC,EAAGC,EAAGQ,EACNP,EAAQH,EAAS,EAAKD,EAAO,EAC7BK,GAAQ,GAAKD,GAAQ,EACrBE,EAAQD,GAAQ,EAChBO,EAAMZ,IAAS,GAAK,KAAK,IAAI,EAAG,GAAG,EAAI,KAAK,IAAI,EAAG,GAAG,EAAI,EAC1DQ,EAAIT,EAAO,EAAKE,EAAS,EACzBY,EAAId,EAAO,EAAI,GACfU,EAAIC,EAAQ,GAAMA,IAAU,GAAK,EAAIA,EAAQ,EAAK,EAAI,EAmC1D,IAjCAA,EAAQ,KAAK,IAAIA,CAAK,EAElB,MAAMA,CAAK,GAAKA,IAAU,KAC5BP,EAAI,MAAMO,CAAK,EAAI,EAAI,EACvBR,EAAIG,IAEJH,EAAI,KAAK,MAAM,KAAK,IAAIQ,CAAK,EAAI,KAAK,GAAG,EACrCA,GAASC,EAAI,KAAK,IAAI,EAAG,CAACT,CAAC,GAAK,IAClCA,IACAS,GAAK,GAEHT,EAAII,GAAS,EACfI,GAASE,EAAKD,EAEdD,GAASE,EAAK,KAAK,IAAI,EAAG,EAAIN,CAAK,EAEjCI,EAAQC,GAAK,IACfT,IACAS,GAAK,GAGHT,EAAII,GAASD,GACfF,EAAI,EACJD,EAAIG,GACKH,EAAII,GAAS,GACtBH,GAAMO,EAAQC,EAAK,GAAK,KAAK,IAAI,EAAGX,CAAI,EACxCE,EAAIA,EAAII,IAERH,EAAIO,EAAQ,KAAK,IAAI,EAAGJ,EAAQ,CAAC,EAAI,KAAK,IAAI,EAAGN,CAAI,EACrDE,EAAI,IAIDF,GAAQ,EAAGH,EAAOC,EAASU,CAAC,EAAIL,EAAI,IAAMK,GAAKK,EAAGV,GAAK,IAAKH,GAAQ,EAAG,CAI9E,IAFAE,EAAKA,GAAKF,EAAQG,EAClBC,GAAQJ,EACDI,EAAO,EAAGP,EAAOC,EAASU,CAAC,EAAIN,EAAI,IAAMM,GAAKK,EAAGX,GAAK,IAAKE,GAAQ,EAAG,CAE7EP,EAAOC,EAASU,EAAIK,CAAC,GAAKJ,EAAI,GAChC,ICpFA,IAAAK,GAAAC,GAAAC,IAAA,cAUA,IAAMC,GAAS,KACTC,GAAU,KACVC,GACH,OAAO,QAAW,YAAc,OAAO,OAAO,KAAW,WACtD,OAAO,IAAO,4BAA4B,EAC1C,KAENH,GAAQ,OAASI,EACjBJ,GAAQ,WAAaK,GACrBL,GAAQ,kBAAoB,GAE5B,IAAMM,GAAe,WACrBN,GAAQ,WAAaM,GAgBrBF,EAAO,oBAAsBG,GAAkB,EAE3C,CAACH,EAAO,qBAAuB,OAAO,QAAY,KAClD,OAAO,QAAQ,OAAU,YAC3B,QAAQ,MACN,+IAEF,EAGF,SAASG,IAAqB,CAE5B,GAAI,CACF,IAAMC,EAAM,IAAI,WAAW,CAAC,EACtBC,EAAQ,CAAE,IAAK,UAAY,CAAE,MAAO,GAAG,CAAE,EAC/C,cAAO,eAAeA,EAAO,WAAW,SAAS,EACjD,OAAO,eAAeD,EAAKC,CAAK,EACzBD,EAAI,IAAI,IAAM,EACvB,MAAY,CACV,MAAO,EACT,CACF,CAEA,OAAO,eAAeJ,EAAO,UAAW,SAAU,CAChD,WAAY,GACZ,IAAK,UAAY,CACf,GAAKA,EAAO,SAAS,IAAI,EACzB,OAAO,KAAK,MACd,CACF,CAAC,EAED,OAAO,eAAeA,EAAO,UAAW,SAAU,CAChD,WAAY,GACZ,IAAK,UAAY,CACf,GAAKA,EAAO,SAAS,IAAI,EACzB,OAAO,KAAK,UACd,CACF,CAAC,EAED,SAASM,GAAcC,EAAQ,CAC7B,GAAIA,EAASL,GACX,MAAM,IAAI,WAAW,cAAgBK,EAAS,gCAAgC,EAGhF,IAAMC,EAAM,IAAI,WAAWD,CAAM,EACjC,cAAO,eAAeC,EAAKR,EAAO,SAAS,EACpCQ,CACT,CAYA,SAASR,EAAQS,EAAKC,EAAkBH,EAAQ,CAE9C,GAAI,OAAOE,GAAQ,SAAU,CAC3B,GAAI,OAAOC,GAAqB,SAC9B,MAAM,IAAI,UACR,oEACF,EAEF,OAAOC,GAAYF,CAAG,CACxB,CACA,OAAOG,GAAKH,EAAKC,EAAkBH,CAAM,CAC3C,CAEAP,EAAO,SAAW,KAElB,SAASY,GAAMC,EAAOH,EAAkBH,EAAQ,CAC9C,GAAI,OAAOM,GAAU,SACnB,OAAOC,GAAWD,EAAOH,CAAgB,EAG3C,GAAI,YAAY,OAAOG,CAAK,EAC1B,OAAOE,GAAcF,CAAK,EAG5B,GAAIA,GAAS,KACX,MAAM,IAAI,UACR,kHAC0C,OAAOA,CACnD,EAQF,GALIG,GAAWH,EAAO,WAAW,GAC5BA,GAASG,GAAWH,EAAM,OAAQ,WAAW,GAI9C,OAAO,kBAAsB,MAC5BG,GAAWH,EAAO,iBAAiB,GACnCA,GAASG,GAAWH,EAAM,OAAQ,iBAAiB,GACtD,OAAOI,GAAgBJ,EAAOH,EAAkBH,CAAM,EAGxD,GAAI,OAAOM,GAAU,SACnB,MAAM,IAAI,UACR,uEACF,EAGF,IAAMK,EAAUL,EAAM,SAAWA,EAAM,QAAQ,EAC/C,GAAIK,GAAW,MAAQA,IAAYL,EACjC,OAAOb,EAAO,KAAKkB,EAASR,EAAkBH,CAAM,EAGtD,IAAMY,EAAIC,GAAWP,CAAK,EAC1B,GAAIM,EAAG,OAAOA,EAEd,GAAI,OAAO,OAAW,KAAe,OAAO,aAAe,MACvD,OAAON,EAAM,OAAO,WAAW,GAAM,WACvC,OAAOb,EAAO,KAAKa,EAAM,OAAO,WAAW,EAAE,QAAQ,EAAGH,EAAkBH,CAAM,EAGlF,MAAM,IAAI,UACR,kHAC0C,OAAOM,CACnD,CACF,CAUAb,EAAO,KAAO,SAAUa,EAAOH,EAAkBH,EAAQ,CACvD,OAAOK,GAAKC,EAAOH,EAAkBH,CAAM,CAC7C,EAIA,OAAO,eAAeP,EAAO,UAAW,WAAW,SAAS,EAC5D,OAAO,eAAeA,EAAQ,UAAU,EAExC,SAASqB,GAAYC,EAAM,CACzB,GAAI,OAAOA,GAAS,SAClB,MAAM,IAAI,UAAU,wCAAwC,EACvD,GAAIA,EAAO,EAChB,MAAM,IAAI,WAAW,cAAgBA,EAAO,gCAAgC,CAEhF,CAEA,SAASC,GAAOD,EAAME,EAAMC,EAAU,CAEpC,OADAJ,GAAWC,CAAI,EACXA,GAAQ,EACHhB,GAAagB,CAAI,EAEtBE,IAAS,OAIJ,OAAOC,GAAa,SACvBnB,GAAagB,CAAI,EAAE,KAAKE,EAAMC,CAAQ,EACtCnB,GAAagB,CAAI,EAAE,KAAKE,CAAI,EAE3BlB,GAAagB,CAAI,CAC1B,CAMAtB,EAAO,MAAQ,SAAUsB,EAAME,EAAMC,EAAU,CAC7C,OAAOF,GAAMD,EAAME,EAAMC,CAAQ,CACnC,EAEA,SAASd,GAAaW,EAAM,CAC1B,OAAAD,GAAWC,CAAI,EACRhB,GAAagB,EAAO,EAAI,EAAII,GAAQJ,CAAI,EAAI,CAAC,CACtD,CAKAtB,EAAO,YAAc,SAAUsB,EAAM,CACnC,OAAOX,GAAYW,CAAI,CACzB,EAIAtB,EAAO,gBAAkB,SAAUsB,EAAM,CACvC,OAAOX,GAAYW,CAAI,CACzB,EAEA,SAASR,GAAYa,EAAQF,EAAU,CAKrC,IAJI,OAAOA,GAAa,UAAYA,IAAa,MAC/CA,EAAW,QAGT,CAACzB,EAAO,WAAWyB,CAAQ,EAC7B,MAAM,IAAI,UAAU,qBAAuBA,CAAQ,EAGrD,IAAMlB,EAASqB,GAAWD,EAAQF,CAAQ,EAAI,EAC1CjB,EAAMF,GAAaC,CAAM,EAEvBsB,EAASrB,EAAI,MAAMmB,EAAQF,CAAQ,EAEzC,OAAII,IAAWtB,IAIbC,EAAMA,EAAI,MAAM,EAAGqB,CAAM,GAGpBrB,CACT,CAEA,SAASsB,GAAeC,EAAO,CAC7B,IAAMxB,EAASwB,EAAM,OAAS,EAAI,EAAIL,GAAQK,EAAM,MAAM,EAAI,EACxDvB,EAAMF,GAAaC,CAAM,EAC/B,QAASyB,EAAI,EAAGA,EAAIzB,EAAQyB,GAAK,EAC/BxB,EAAIwB,CAAC,EAAID,EAAMC,CAAC,EAAI,IAEtB,OAAOxB,CACT,CAEA,SAASO,GAAekB,EAAW,CACjC,GAAIjB,GAAWiB,EAAW,UAAU,EAAG,CACrC,IAAMC,EAAO,IAAI,WAAWD,CAAS,EACrC,OAAOhB,GAAgBiB,EAAK,OAAQA,EAAK,WAAYA,EAAK,UAAU,CACtE,CACA,OAAOJ,GAAcG,CAAS,CAChC,CAEA,SAAShB,GAAiBc,EAAOI,EAAY5B,EAAQ,CACnD,GAAI4B,EAAa,GAAKJ,EAAM,WAAaI,EACvC,MAAM,IAAI,WAAW,sCAAsC,EAG7D,GAAIJ,EAAM,WAAaI,GAAc5B,GAAU,GAC7C,MAAM,IAAI,WAAW,sCAAsC,EAG7D,IAAIC,EACJ,OAAI2B,IAAe,QAAa5B,IAAW,OACzCC,EAAM,IAAI,WAAWuB,CAAK,EACjBxB,IAAW,OACpBC,EAAM,IAAI,WAAWuB,EAAOI,CAAU,EAEtC3B,EAAM,IAAI,WAAWuB,EAAOI,EAAY5B,CAAM,EAIhD,OAAO,eAAeC,EAAKR,EAAO,SAAS,EAEpCQ,CACT,CAEA,SAASY,GAAYgB,EAAK,CACxB,GAAIpC,EAAO,SAASoC,CAAG,EAAG,CACxB,IAAMC,EAAMX,GAAQU,EAAI,MAAM,EAAI,EAC5B5B,EAAMF,GAAa+B,CAAG,EAE5B,OAAI7B,EAAI,SAAW,GAInB4B,EAAI,KAAK5B,EAAK,EAAG,EAAG6B,CAAG,EAChB7B,CACT,CAEA,GAAI4B,EAAI,SAAW,OACjB,OAAI,OAAOA,EAAI,QAAW,UAAYE,GAAYF,EAAI,MAAM,EACnD9B,GAAa,CAAC,EAEhBwB,GAAcM,CAAG,EAG1B,GAAIA,EAAI,OAAS,UAAY,MAAM,QAAQA,EAAI,IAAI,EACjD,OAAON,GAAcM,EAAI,IAAI,CAEjC,CAEA,SAASV,GAASnB,EAAQ,CAGxB,GAAIA,GAAUL,GACZ,MAAM,IAAI,WAAW,0DACaA,GAAa,SAAS,EAAE,EAAI,QAAQ,EAExE,OAAOK,EAAS,CAClB,CAEA,SAASN,GAAYM,EAAQ,CAC3B,MAAI,CAACA,GAAUA,IACbA,EAAS,GAEJP,EAAO,MAAM,CAACO,CAAM,CAC7B,CAEAP,EAAO,SAAW,SAAmBmB,EAAG,CACtC,OAAOA,GAAK,MAAQA,EAAE,YAAc,IAClCA,IAAMnB,EAAO,SACjB,EAEAA,EAAO,QAAU,SAAkBuC,EAAGpB,EAAG,CAGvC,GAFIH,GAAWuB,EAAG,UAAU,IAAGA,EAAIvC,EAAO,KAAKuC,EAAGA,EAAE,OAAQA,EAAE,UAAU,GACpEvB,GAAWG,EAAG,UAAU,IAAGA,EAAInB,EAAO,KAAKmB,EAAGA,EAAE,OAAQA,EAAE,UAAU,GACpE,CAACnB,EAAO,SAASuC,CAAC,GAAK,CAACvC,EAAO,SAASmB,CAAC,EAC3C,MAAM,IAAI,UACR,uEACF,EAGF,GAAIoB,IAAMpB,EAAG,MAAO,GAEpB,IAAIqB,EAAID,EAAE,OACNE,EAAItB,EAAE,OAEV,QAAS,EAAI,EAAGkB,EAAM,KAAK,IAAIG,EAAGC,CAAC,EAAG,EAAIJ,EAAK,EAAE,EAC/C,GAAIE,EAAE,CAAC,IAAMpB,EAAE,CAAC,EAAG,CACjBqB,EAAID,EAAE,CAAC,EACPE,EAAItB,EAAE,CAAC,EACP,KACF,CAGF,OAAIqB,EAAIC,EAAU,GACdA,EAAID,EAAU,EACX,CACT,EAEAxC,EAAO,WAAa,SAAqByB,EAAU,CACjD,OAAQ,OAAOA,CAAQ,EAAE,YAAY,EAAG,CACtC,IAAK,MACL,IAAK,OACL,IAAK,QACL,IAAK,QACL,IAAK,SACL,IAAK,SACL,IAAK,SACL,IAAK,OACL,IAAK,QACL,IAAK,UACL,IAAK,WACH,MAAO,GACT,QACE,MAAO,EACX,CACF,EAEAzB,EAAO,OAAS,SAAiB0C,EAAMnC,EAAQ,CAC7C,GAAI,CAAC,MAAM,QAAQmC,CAAI,EACrB,MAAM,IAAI,UAAU,6CAA6C,EAGnE,GAAIA,EAAK,SAAW,EAClB,OAAO1C,EAAO,MAAM,CAAC,EAGvB,IAAIgC,EACJ,GAAIzB,IAAW,OAEb,IADAA,EAAS,EACJyB,EAAI,EAAGA,EAAIU,EAAK,OAAQ,EAAEV,EAC7BzB,GAAUmC,EAAKV,CAAC,EAAE,OAItB,IAAMW,EAAS3C,EAAO,YAAYO,CAAM,EACpCqC,EAAM,EACV,IAAKZ,EAAI,EAAGA,EAAIU,EAAK,OAAQ,EAAEV,EAAG,CAChC,IAAIxB,EAAMkC,EAAKV,CAAC,EAChB,GAAIhB,GAAWR,EAAK,UAAU,EACxBoC,EAAMpC,EAAI,OAASmC,EAAO,QACvB3C,EAAO,SAASQ,CAAG,IAAGA,EAAMR,EAAO,KAAKQ,CAAG,GAChDA,EAAI,KAAKmC,EAAQC,CAAG,GAEpB,WAAW,UAAU,IAAI,KACvBD,EACAnC,EACAoC,CACF,UAEQ5C,EAAO,SAASQ,CAAG,EAG7BA,EAAI,KAAKmC,EAAQC,CAAG,MAFpB,OAAM,IAAI,UAAU,6CAA6C,EAInEA,GAAOpC,EAAI,MACb,CACA,OAAOmC,CACT,EAEA,SAASf,GAAYD,EAAQF,EAAU,CACrC,GAAIzB,EAAO,SAAS2B,CAAM,EACxB,OAAOA,EAAO,OAEhB,GAAI,YAAY,OAAOA,CAAM,GAAKX,GAAWW,EAAQ,WAAW,EAC9D,OAAOA,EAAO,WAEhB,GAAI,OAAOA,GAAW,SACpB,MAAM,IAAI,UACR,2FACmB,OAAOA,CAC5B,EAGF,IAAMU,EAAMV,EAAO,OACbkB,EAAa,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,GAC5D,GAAI,CAACA,GAAaR,IAAQ,EAAG,MAAO,GAGpC,IAAIS,EAAc,GAClB,OACE,OAAQrB,EAAU,CAChB,IAAK,QACL,IAAK,SACL,IAAK,SACH,OAAOY,EACT,IAAK,OACL,IAAK,QACH,OAAOU,GAAYpB,CAAM,EAAE,OAC7B,IAAK,OACL,IAAK,QACL,IAAK,UACL,IAAK,WACH,OAAOU,EAAM,EACf,IAAK,MACH,OAAOA,IAAQ,EACjB,IAAK,SACH,OAAOW,GAAcrB,CAAM,EAAE,OAC/B,QACE,GAAImB,EACF,OAAOD,EAAY,GAAKE,GAAYpB,CAAM,EAAE,OAE9CF,GAAY,GAAKA,GAAU,YAAY,EACvCqB,EAAc,EAClB,CAEJ,CACA9C,EAAO,WAAa4B,GAEpB,SAASqB,GAAcxB,EAAUyB,EAAOC,EAAK,CAC3C,IAAIL,EAAc,GA8BlB,IArBII,IAAU,QAAaA,EAAQ,KACjCA,EAAQ,GAINA,EAAQ,KAAK,UAIbC,IAAQ,QAAaA,EAAM,KAAK,UAClCA,EAAM,KAAK,QAGTA,GAAO,KAKXA,KAAS,EACTD,KAAW,EAEPC,GAAOD,GACT,MAAO,GAKT,IAFKzB,IAAUA,EAAW,UAGxB,OAAQA,EAAU,CAChB,IAAK,MACH,OAAO2B,GAAS,KAAMF,EAAOC,CAAG,EAElC,IAAK,OACL,IAAK,QACH,OAAOE,GAAU,KAAMH,EAAOC,CAAG,EAEnC,IAAK,QACH,OAAOG,GAAW,KAAMJ,EAAOC,CAAG,EAEpC,IAAK,SACL,IAAK,SACH,OAAOI,GAAY,KAAML,EAAOC,CAAG,EAErC,IAAK,SACH,OAAOK,GAAY,KAAMN,EAAOC,CAAG,EAErC,IAAK,OACL,IAAK,QACL,IAAK,UACL,IAAK,WACH,OAAOM,GAAa,KAAMP,EAAOC,CAAG,EAEtC,QACE,GAAIL,EAAa,MAAM,IAAI,UAAU,qBAAuBrB,CAAQ,EACpEA,GAAYA,EAAW,IAAI,YAAY,EACvCqB,EAAc,EAClB,CAEJ,CAQA9C,EAAO,UAAU,UAAY,GAE7B,SAAS0D,GAAMvC,EAAGwC,EAAGC,EAAG,CACtB,IAAM5B,EAAIb,EAAEwC,CAAC,EACbxC,EAAEwC,CAAC,EAAIxC,EAAEyC,CAAC,EACVzC,EAAEyC,CAAC,EAAI5B,CACT,CAEAhC,EAAO,UAAU,OAAS,UAAmB,CAC3C,IAAMqC,EAAM,KAAK,OACjB,GAAIA,EAAM,IAAM,EACd,MAAM,IAAI,WAAW,2CAA2C,EAElE,QAASL,EAAI,EAAGA,EAAIK,EAAKL,GAAK,EAC5B0B,GAAK,KAAM1B,EAAGA,EAAI,CAAC,EAErB,OAAO,IACT,EAEAhC,EAAO,UAAU,OAAS,UAAmB,CAC3C,IAAMqC,EAAM,KAAK,OACjB,GAAIA,EAAM,IAAM,EACd,MAAM,IAAI,WAAW,2CAA2C,EAElE,QAASL,EAAI,EAAGA,EAAIK,EAAKL,GAAK,EAC5B0B,GAAK,KAAM1B,EAAGA,EAAI,CAAC,EACnB0B,GAAK,KAAM1B,EAAI,EAAGA,EAAI,CAAC,EAEzB,OAAO,IACT,EAEAhC,EAAO,UAAU,OAAS,UAAmB,CAC3C,IAAMqC,EAAM,KAAK,OACjB,GAAIA,EAAM,IAAM,EACd,MAAM,IAAI,WAAW,2CAA2C,EAElE,QAASL,EAAI,EAAGA,EAAIK,EAAKL,GAAK,EAC5B0B,GAAK,KAAM1B,EAAGA,EAAI,CAAC,EACnB0B,GAAK,KAAM1B,EAAI,EAAGA,EAAI,CAAC,EACvB0B,GAAK,KAAM1B,EAAI,EAAGA,EAAI,CAAC,EACvB0B,GAAK,KAAM1B,EAAI,EAAGA,EAAI,CAAC,EAEzB,OAAO,IACT,EAEAhC,EAAO,UAAU,SAAW,UAAqB,CAC/C,IAAMO,EAAS,KAAK,OACpB,OAAIA,IAAW,EAAU,GACrB,UAAU,SAAW,EAAU8C,GAAU,KAAM,EAAG9C,CAAM,EACrD0C,GAAa,MAAM,KAAM,SAAS,CAC3C,EAEAjD,EAAO,UAAU,eAAiBA,EAAO,UAAU,SAEnDA,EAAO,UAAU,OAAS,SAAiBmB,EAAG,CAC5C,GAAI,CAACnB,EAAO,SAASmB,CAAC,EAAG,MAAM,IAAI,UAAU,2BAA2B,EACxE,OAAI,OAASA,EAAU,GAChBnB,EAAO,QAAQ,KAAMmB,CAAC,IAAM,CACrC,EAEAnB,EAAO,UAAU,QAAU,UAAoB,CAC7C,IAAI6D,EAAM,GACJC,EAAMlE,GAAQ,kBACpB,OAAAiE,EAAM,KAAK,SAAS,MAAO,EAAGC,CAAG,EAAE,QAAQ,UAAW,KAAK,EAAE,KAAK,EAC9D,KAAK,OAASA,IAAKD,GAAO,SACvB,WAAaA,EAAM,GAC5B,EACI9D,KACFC,EAAO,UAAUD,EAAmB,EAAIC,EAAO,UAAU,SAG3DA,EAAO,UAAU,QAAU,SAAkB+D,EAAQb,EAAOC,EAAKa,EAAWC,EAAS,CAInF,GAHIjD,GAAW+C,EAAQ,UAAU,IAC/BA,EAAS/D,EAAO,KAAK+D,EAAQA,EAAO,OAAQA,EAAO,UAAU,GAE3D,CAAC/D,EAAO,SAAS+D,CAAM,EACzB,MAAM,IAAI,UACR,iFACoB,OAAOA,CAC7B,EAgBF,GAbIb,IAAU,SACZA,EAAQ,GAENC,IAAQ,SACVA,EAAMY,EAASA,EAAO,OAAS,GAE7BC,IAAc,SAChBA,EAAY,GAEVC,IAAY,SACdA,EAAU,KAAK,QAGbf,EAAQ,GAAKC,EAAMY,EAAO,QAAUC,EAAY,GAAKC,EAAU,KAAK,OACtE,MAAM,IAAI,WAAW,oBAAoB,EAG3C,GAAID,GAAaC,GAAWf,GAASC,EACnC,MAAO,GAET,GAAIa,GAAaC,EACf,MAAO,GAET,GAAIf,GAASC,EACX,MAAO,GAQT,GALAD,KAAW,EACXC,KAAS,EACTa,KAAe,EACfC,KAAa,EAET,OAASF,EAAQ,MAAO,GAE5B,IAAIvB,EAAIyB,EAAUD,EACdvB,EAAIU,EAAMD,EACRb,EAAM,KAAK,IAAIG,EAAGC,CAAC,EAEnByB,EAAW,KAAK,MAAMF,EAAWC,CAAO,EACxCE,EAAaJ,EAAO,MAAMb,EAAOC,CAAG,EAE1C,QAASnB,EAAI,EAAGA,EAAIK,EAAK,EAAEL,EACzB,GAAIkC,EAASlC,CAAC,IAAMmC,EAAWnC,CAAC,EAAG,CACjCQ,EAAI0B,EAASlC,CAAC,EACdS,EAAI0B,EAAWnC,CAAC,EAChB,KACF,CAGF,OAAIQ,EAAIC,EAAU,GACdA,EAAID,EAAU,EACX,CACT,EAWA,SAAS4B,GAAsBzB,EAAQ0B,EAAKlC,EAAYV,EAAU6C,EAAK,CAErE,GAAI3B,EAAO,SAAW,EAAG,MAAO,GAmBhC,GAhBI,OAAOR,GAAe,UACxBV,EAAWU,EACXA,EAAa,GACJA,EAAa,WACtBA,EAAa,WACJA,EAAa,cACtBA,EAAa,aAEfA,EAAa,CAACA,EACVG,GAAYH,CAAU,IAExBA,EAAamC,EAAM,EAAK3B,EAAO,OAAS,GAItCR,EAAa,IAAGA,EAAaQ,EAAO,OAASR,GAC7CA,GAAcQ,EAAO,OAAQ,CAC/B,GAAI2B,EAAK,MAAO,GACXnC,EAAaQ,EAAO,OAAS,CACpC,SAAWR,EAAa,EACtB,GAAImC,EAAKnC,EAAa,MACjB,OAAO,GASd,GALI,OAAOkC,GAAQ,WACjBA,EAAMrE,EAAO,KAAKqE,EAAK5C,CAAQ,GAI7BzB,EAAO,SAASqE,CAAG,EAErB,OAAIA,EAAI,SAAW,EACV,GAEFE,GAAa5B,EAAQ0B,EAAKlC,EAAYV,EAAU6C,CAAG,EACrD,GAAI,OAAOD,GAAQ,SAExB,OADAA,EAAMA,EAAM,IACR,OAAO,WAAW,UAAU,SAAY,WACtCC,EACK,WAAW,UAAU,QAAQ,KAAK3B,EAAQ0B,EAAKlC,CAAU,EAEzD,WAAW,UAAU,YAAY,KAAKQ,EAAQ0B,EAAKlC,CAAU,EAGjEoC,GAAa5B,EAAQ,CAAC0B,CAAG,EAAGlC,EAAYV,EAAU6C,CAAG,EAG9D,MAAM,IAAI,UAAU,sCAAsC,CAC5D,CAEA,SAASC,GAAcnE,EAAKiE,EAAKlC,EAAYV,EAAU6C,EAAK,CAC1D,IAAIE,EAAY,EACZC,EAAYrE,EAAI,OAChBsE,EAAYL,EAAI,OAEpB,GAAI5C,IAAa,SACfA,EAAW,OAAOA,CAAQ,EAAE,YAAY,EACpCA,IAAa,QAAUA,IAAa,SACpCA,IAAa,WAAaA,IAAa,YAAY,CACrD,GAAIrB,EAAI,OAAS,GAAKiE,EAAI,OAAS,EACjC,MAAO,GAETG,EAAY,EACZC,GAAa,EACbC,GAAa,EACbvC,GAAc,CAChB,CAGF,SAASwC,EAAMnE,EAAKwB,EAAG,CACrB,OAAIwC,IAAc,EACThE,EAAIwB,CAAC,EAELxB,EAAI,aAAawB,EAAIwC,CAAS,CAEzC,CAEA,IAAIxC,EACJ,GAAIsC,EAAK,CACP,IAAIM,EAAa,GACjB,IAAK5C,EAAIG,EAAYH,EAAIyC,EAAWzC,IAClC,GAAI2C,EAAKvE,EAAK4B,CAAC,IAAM2C,EAAKN,EAAKO,IAAe,GAAK,EAAI5C,EAAI4C,CAAU,GAEnE,GADIA,IAAe,KAAIA,EAAa5C,GAChCA,EAAI4C,EAAa,IAAMF,EAAW,OAAOE,EAAaJ,OAEtDI,IAAe,KAAI5C,GAAKA,EAAI4C,GAChCA,EAAa,EAGnB,KAEE,KADIzC,EAAauC,EAAYD,IAAWtC,EAAasC,EAAYC,GAC5D1C,EAAIG,EAAYH,GAAK,EAAGA,IAAK,CAChC,IAAI6C,EAAQ,GACZ,QAASC,EAAI,EAAGA,EAAIJ,EAAWI,IAC7B,GAAIH,EAAKvE,EAAK4B,EAAI8C,CAAC,IAAMH,EAAKN,EAAKS,CAAC,EAAG,CACrCD,EAAQ,GACR,KACF,CAEF,GAAIA,EAAO,OAAO7C,CACpB,CAGF,MAAO,EACT,CAEAhC,EAAO,UAAU,SAAW,SAAmBqE,EAAKlC,EAAYV,EAAU,CACxE,OAAO,KAAK,QAAQ4C,EAAKlC,EAAYV,CAAQ,IAAM,EACrD,EAEAzB,EAAO,UAAU,QAAU,SAAkBqE,EAAKlC,EAAYV,EAAU,CACtE,OAAO2C,GAAqB,KAAMC,EAAKlC,EAAYV,EAAU,EAAI,CACnE,EAEAzB,EAAO,UAAU,YAAc,SAAsBqE,EAAKlC,EAAYV,EAAU,CAC9E,OAAO2C,GAAqB,KAAMC,EAAKlC,EAAYV,EAAU,EAAK,CACpE,EAEA,SAASsD,GAAUvE,EAAKmB,EAAQqD,EAAQzE,EAAQ,CAC9CyE,EAAS,OAAOA,CAAM,GAAK,EAC3B,IAAMC,EAAYzE,EAAI,OAASwE,EAC1BzE,GAGHA,EAAS,OAAOA,CAAM,EAClBA,EAAS0E,IACX1E,EAAS0E,IAJX1E,EAAS0E,EAQX,IAAMC,EAASvD,EAAO,OAElBpB,EAAS2E,EAAS,IACpB3E,EAAS2E,EAAS,GAEpB,IAAIlD,EACJ,IAAKA,EAAI,EAAGA,EAAIzB,EAAQ,EAAEyB,EAAG,CAC3B,IAAMmD,EAAS,SAASxD,EAAO,OAAOK,EAAI,EAAG,CAAC,EAAG,EAAE,EACnD,GAAIM,GAAY6C,CAAM,EAAG,OAAOnD,EAChCxB,EAAIwE,EAAShD,CAAC,EAAImD,CACpB,CACA,OAAOnD,CACT,CAEA,SAASoD,GAAW5E,EAAKmB,EAAQqD,EAAQzE,EAAQ,CAC/C,OAAO8E,GAAWtC,GAAYpB,EAAQnB,EAAI,OAASwE,CAAM,EAAGxE,EAAKwE,EAAQzE,CAAM,CACjF,CAEA,SAAS+E,GAAY9E,EAAKmB,EAAQqD,EAAQzE,EAAQ,CAChD,OAAO8E,GAAWE,GAAa5D,CAAM,EAAGnB,EAAKwE,EAAQzE,CAAM,CAC7D,CAEA,SAASiF,GAAahF,EAAKmB,EAAQqD,EAAQzE,EAAQ,CACjD,OAAO8E,GAAWrC,GAAcrB,CAAM,EAAGnB,EAAKwE,EAAQzE,CAAM,CAC9D,CAEA,SAASkF,GAAWjF,EAAKmB,EAAQqD,EAAQzE,EAAQ,CAC/C,OAAO8E,GAAWK,GAAe/D,EAAQnB,EAAI,OAASwE,CAAM,EAAGxE,EAAKwE,EAAQzE,CAAM,CACpF,CAEAP,EAAO,UAAU,MAAQ,SAAgB2B,EAAQqD,EAAQzE,EAAQkB,EAAU,CAEzE,GAAIuD,IAAW,OACbvD,EAAW,OACXlB,EAAS,KAAK,OACdyE,EAAS,UAEAzE,IAAW,QAAa,OAAOyE,GAAW,SACnDvD,EAAWuD,EACXzE,EAAS,KAAK,OACdyE,EAAS,UAEA,SAASA,CAAM,EACxBA,EAASA,IAAW,EAChB,SAASzE,CAAM,GACjBA,EAASA,IAAW,EAChBkB,IAAa,SAAWA,EAAW,UAEvCA,EAAWlB,EACXA,EAAS,YAGX,OAAM,IAAI,MACR,yEACF,EAGF,IAAM0E,EAAY,KAAK,OAASD,EAGhC,IAFIzE,IAAW,QAAaA,EAAS0E,KAAW1E,EAAS0E,GAEpDtD,EAAO,OAAS,IAAMpB,EAAS,GAAKyE,EAAS,IAAOA,EAAS,KAAK,OACrE,MAAM,IAAI,WAAW,wCAAwC,EAG1DvD,IAAUA,EAAW,QAE1B,IAAIqB,EAAc,GAClB,OACE,OAAQrB,EAAU,CAChB,IAAK,MACH,OAAOsD,GAAS,KAAMpD,EAAQqD,EAAQzE,CAAM,EAE9C,IAAK,OACL,IAAK,QACH,OAAO6E,GAAU,KAAMzD,EAAQqD,EAAQzE,CAAM,EAE/C,IAAK,QACL,IAAK,SACL,IAAK,SACH,OAAO+E,GAAW,KAAM3D,EAAQqD,EAAQzE,CAAM,EAEhD,IAAK,SAEH,OAAOiF,GAAY,KAAM7D,EAAQqD,EAAQzE,CAAM,EAEjD,IAAK,OACL,IAAK,QACL,IAAK,UACL,IAAK,WACH,OAAOkF,GAAU,KAAM9D,EAAQqD,EAAQzE,CAAM,EAE/C,QACE,GAAIuC,EAAa,MAAM,IAAI,UAAU,qBAAuBrB,CAAQ,EACpEA,GAAY,GAAKA,GAAU,YAAY,EACvCqB,EAAc,EAClB,CAEJ,EAEA9C,EAAO,UAAU,OAAS,UAAmB,CAC3C,MAAO,CACL,KAAM,SACN,KAAM,MAAM,UAAU,MAAM,KAAK,KAAK,MAAQ,KAAM,CAAC,CACvD,CACF,EAEA,SAASwD,GAAahD,EAAK0C,EAAOC,EAAK,CACrC,OAAID,IAAU,GAAKC,IAAQ3C,EAAI,OACtBX,GAAO,cAAcW,CAAG,EAExBX,GAAO,cAAcW,EAAI,MAAM0C,EAAOC,CAAG,CAAC,CAErD,CAEA,SAASE,GAAW7C,EAAK0C,EAAOC,EAAK,CACnCA,EAAM,KAAK,IAAI3C,EAAI,OAAQ2C,CAAG,EAC9B,IAAMwC,EAAM,CAAC,EAET3D,EAAIkB,EACR,KAAOlB,EAAImB,GAAK,CACd,IAAMyC,EAAYpF,EAAIwB,CAAC,EACnB6D,EAAY,KACZC,EAAoBF,EAAY,IAChC,EACCA,EAAY,IACT,EACCA,EAAY,IACT,EACA,EAEZ,GAAI5D,EAAI8D,GAAoB3C,EAAK,CAC/B,IAAI4C,EAAYC,EAAWC,EAAYC,EAEvC,OAAQJ,EAAkB,CACxB,IAAK,GACCF,EAAY,MACdC,EAAYD,GAEd,MACF,IAAK,GACHG,EAAavF,EAAIwB,EAAI,CAAC,GACjB+D,EAAa,OAAU,MAC1BG,GAAiBN,EAAY,KAAS,EAAOG,EAAa,GACtDG,EAAgB,MAClBL,EAAYK,IAGhB,MACF,IAAK,GACHH,EAAavF,EAAIwB,EAAI,CAAC,EACtBgE,EAAYxF,EAAIwB,EAAI,CAAC,GAChB+D,EAAa,OAAU,MAASC,EAAY,OAAU,MACzDE,GAAiBN,EAAY,KAAQ,IAAOG,EAAa,KAAS,EAAOC,EAAY,GACjFE,EAAgB,OAAUA,EAAgB,OAAUA,EAAgB,SACtEL,EAAYK,IAGhB,MACF,IAAK,GACHH,EAAavF,EAAIwB,EAAI,CAAC,EACtBgE,EAAYxF,EAAIwB,EAAI,CAAC,EACrBiE,EAAazF,EAAIwB,EAAI,CAAC,GACjB+D,EAAa,OAAU,MAASC,EAAY,OAAU,MAASC,EAAa,OAAU,MACzFC,GAAiBN,EAAY,KAAQ,IAAQG,EAAa,KAAS,IAAOC,EAAY,KAAS,EAAOC,EAAa,GAC/GC,EAAgB,OAAUA,EAAgB,UAC5CL,EAAYK,GAGpB,CACF,CAEIL,IAAc,MAGhBA,EAAY,MACZC,EAAmB,GACVD,EAAY,QAErBA,GAAa,MACbF,EAAI,KAAKE,IAAc,GAAK,KAAQ,KAAM,EAC1CA,EAAY,MAASA,EAAY,MAGnCF,EAAI,KAAKE,CAAS,EAClB7D,GAAK8D,CACP,CAEA,OAAOK,GAAsBR,CAAG,CAClC,CAKA,IAAMS,GAAuB,KAE7B,SAASD,GAAuBE,EAAY,CAC1C,IAAMhE,EAAMgE,EAAW,OACvB,GAAIhE,GAAO+D,GACT,OAAO,OAAO,aAAa,MAAM,OAAQC,CAAU,EAIrD,IAAIV,EAAM,GACN3D,EAAI,EACR,KAAOA,EAAIK,GACTsD,GAAO,OAAO,aAAa,MACzB,OACAU,EAAW,MAAMrE,EAAGA,GAAKoE,EAAoB,CAC/C,EAEF,OAAOT,CACT,CAEA,SAASrC,GAAY9C,EAAK0C,EAAOC,EAAK,CACpC,IAAImD,EAAM,GACVnD,EAAM,KAAK,IAAI3C,EAAI,OAAQ2C,CAAG,EAE9B,QAASnB,EAAIkB,EAAOlB,EAAImB,EAAK,EAAEnB,EAC7BsE,GAAO,OAAO,aAAa9F,EAAIwB,CAAC,EAAI,GAAI,EAE1C,OAAOsE,CACT,CAEA,SAAS/C,GAAa/C,EAAK0C,EAAOC,EAAK,CACrC,IAAImD,EAAM,GACVnD,EAAM,KAAK,IAAI3C,EAAI,OAAQ2C,CAAG,EAE9B,QAASnB,EAAIkB,EAAOlB,EAAImB,EAAK,EAAEnB,EAC7BsE,GAAO,OAAO,aAAa9F,EAAIwB,CAAC,CAAC,EAEnC,OAAOsE,CACT,CAEA,SAASlD,GAAU5C,EAAK0C,EAAOC,EAAK,CAClC,IAAMd,EAAM7B,EAAI,QAEZ,CAAC0C,GAASA,EAAQ,KAAGA,EAAQ,IAC7B,CAACC,GAAOA,EAAM,GAAKA,EAAMd,KAAKc,EAAMd,GAExC,IAAIkE,EAAM,GACV,QAAS,EAAIrD,EAAO,EAAIC,EAAK,EAAE,EAC7BoD,GAAOC,GAAoBhG,EAAI,CAAC,CAAC,EAEnC,OAAO+F,CACT,CAEA,SAAS9C,GAAcjD,EAAK0C,EAAOC,EAAK,CACtC,IAAMsD,EAAQjG,EAAI,MAAM0C,EAAOC,CAAG,EAC9BwC,EAAM,GAEV,QAAS,EAAI,EAAG,EAAIc,EAAM,OAAS,EAAG,GAAK,EACzCd,GAAO,OAAO,aAAac,EAAM,CAAC,EAAKA,EAAM,EAAI,CAAC,EAAI,GAAI,EAE5D,OAAOd,CACT,CAEA3F,EAAO,UAAU,MAAQ,SAAgBkD,EAAOC,EAAK,CACnD,IAAMd,EAAM,KAAK,OACjBa,EAAQ,CAAC,CAACA,EACVC,EAAMA,IAAQ,OAAYd,EAAM,CAAC,CAACc,EAE9BD,EAAQ,GACVA,GAASb,EACLa,EAAQ,IAAGA,EAAQ,IACdA,EAAQb,IACjBa,EAAQb,GAGNc,EAAM,GACRA,GAAOd,EACHc,EAAM,IAAGA,EAAM,IACVA,EAAMd,IACfc,EAAMd,GAGJc,EAAMD,IAAOC,EAAMD,GAEvB,IAAMwD,EAAS,KAAK,SAASxD,EAAOC,CAAG,EAEvC,cAAO,eAAeuD,EAAQ1G,EAAO,SAAS,EAEvC0G,CACT,EAKA,SAASC,GAAa3B,EAAQ4B,EAAKrG,EAAQ,CACzC,GAAKyE,EAAS,IAAO,GAAKA,EAAS,EAAG,MAAM,IAAI,WAAW,oBAAoB,EAC/E,GAAIA,EAAS4B,EAAMrG,EAAQ,MAAM,IAAI,WAAW,uCAAuC,CACzF,CAEAP,EAAO,UAAU,WACjBA,EAAO,UAAU,WAAa,SAAqBgF,EAAQpD,EAAYiF,EAAU,CAC/E7B,EAASA,IAAW,EACpBpD,EAAaA,IAAe,EACvBiF,GAAUF,GAAY3B,EAAQpD,EAAY,KAAK,MAAM,EAE1D,IAAIyC,EAAM,KAAKW,CAAM,EACjB8B,EAAM,EACN9E,EAAI,EACR,KAAO,EAAEA,EAAIJ,IAAekF,GAAO,MACjCzC,GAAO,KAAKW,EAAShD,CAAC,EAAI8E,EAG5B,OAAOzC,CACT,EAEArE,EAAO,UAAU,WACjBA,EAAO,UAAU,WAAa,SAAqBgF,EAAQpD,EAAYiF,EAAU,CAC/E7B,EAASA,IAAW,EACpBpD,EAAaA,IAAe,EACvBiF,GACHF,GAAY3B,EAAQpD,EAAY,KAAK,MAAM,EAG7C,IAAIyC,EAAM,KAAKW,EAAS,EAAEpD,CAAU,EAChCkF,EAAM,EACV,KAAOlF,EAAa,IAAMkF,GAAO,MAC/BzC,GAAO,KAAKW,EAAS,EAAEpD,CAAU,EAAIkF,EAGvC,OAAOzC,CACT,EAEArE,EAAO,UAAU,UACjBA,EAAO,UAAU,UAAY,SAAoBgF,EAAQ6B,EAAU,CACjE,OAAA7B,EAASA,IAAW,EACf6B,GAAUF,GAAY3B,EAAQ,EAAG,KAAK,MAAM,EAC1C,KAAKA,CAAM,CACpB,EAEAhF,EAAO,UAAU,aACjBA,EAAO,UAAU,aAAe,SAAuBgF,EAAQ6B,EAAU,CACvE,OAAA7B,EAASA,IAAW,EACf6B,GAAUF,GAAY3B,EAAQ,EAAG,KAAK,MAAM,EAC1C,KAAKA,CAAM,EAAK,KAAKA,EAAS,CAAC,GAAK,CAC7C,EAEAhF,EAAO,UAAU,aACjBA,EAAO,UAAU,aAAe,SAAuBgF,EAAQ6B,EAAU,CACvE,OAAA7B,EAASA,IAAW,EACf6B,GAAUF,GAAY3B,EAAQ,EAAG,KAAK,MAAM,EACzC,KAAKA,CAAM,GAAK,EAAK,KAAKA,EAAS,CAAC,CAC9C,EAEAhF,EAAO,UAAU,aACjBA,EAAO,UAAU,aAAe,SAAuBgF,EAAQ6B,EAAU,CACvE,OAAA7B,EAASA,IAAW,EACf6B,GAAUF,GAAY3B,EAAQ,EAAG,KAAK,MAAM,GAExC,KAAKA,CAAM,EACf,KAAKA,EAAS,CAAC,GAAK,EACpB,KAAKA,EAAS,CAAC,GAAK,IACpB,KAAKA,EAAS,CAAC,EAAI,QAC1B,EAEAhF,EAAO,UAAU,aACjBA,EAAO,UAAU,aAAe,SAAuBgF,EAAQ6B,EAAU,CACvE,OAAA7B,EAASA,IAAW,EACf6B,GAAUF,GAAY3B,EAAQ,EAAG,KAAK,MAAM,EAEzC,KAAKA,CAAM,EAAI,UACnB,KAAKA,EAAS,CAAC,GAAK,GACrB,KAAKA,EAAS,CAAC,GAAK,EACrB,KAAKA,EAAS,CAAC,EACnB,EAEAhF,EAAO,UAAU,gBAAkB+G,GAAmB,SAA0B/B,EAAQ,CACtFA,EAASA,IAAW,EACpBgC,GAAehC,EAAQ,QAAQ,EAC/B,IAAMiC,EAAQ,KAAKjC,CAAM,EACnBkC,EAAO,KAAKlC,EAAS,CAAC,GACxBiC,IAAU,QAAaC,IAAS,SAClCC,GAAYnC,EAAQ,KAAK,OAAS,CAAC,EAGrC,IAAMoC,EAAKH,EACT,KAAK,EAAEjC,CAAM,EAAI,GAAK,EACtB,KAAK,EAAEA,CAAM,EAAI,GAAK,GACtB,KAAK,EAAEA,CAAM,EAAI,GAAK,GAElBqC,EAAK,KAAK,EAAErC,CAAM,EACtB,KAAK,EAAEA,CAAM,EAAI,GAAK,EACtB,KAAK,EAAEA,CAAM,EAAI,GAAK,GACtBkC,EAAO,GAAK,GAEd,OAAO,OAAOE,CAAE,GAAK,OAAOC,CAAE,GAAK,OAAO,EAAE,EAC9C,CAAC,EAEDrH,EAAO,UAAU,gBAAkB+G,GAAmB,SAA0B/B,EAAQ,CACtFA,EAASA,IAAW,EACpBgC,GAAehC,EAAQ,QAAQ,EAC/B,IAAMiC,EAAQ,KAAKjC,CAAM,EACnBkC,EAAO,KAAKlC,EAAS,CAAC,GACxBiC,IAAU,QAAaC,IAAS,SAClCC,GAAYnC,EAAQ,KAAK,OAAS,CAAC,EAGrC,IAAMqC,EAAKJ,EAAQ,GAAK,GACtB,KAAK,EAAEjC,CAAM,EAAI,GAAK,GACtB,KAAK,EAAEA,CAAM,EAAI,GAAK,EACtB,KAAK,EAAEA,CAAM,EAEToC,EAAK,KAAK,EAAEpC,CAAM,EAAI,GAAK,GAC/B,KAAK,EAAEA,CAAM,EAAI,GAAK,GACtB,KAAK,EAAEA,CAAM,EAAI,GAAK,EACtBkC,EAEF,OAAQ,OAAOG,CAAE,GAAK,OAAO,EAAE,GAAK,OAAOD,CAAE,CAC/C,CAAC,EAEDpH,EAAO,UAAU,UAAY,SAAoBgF,EAAQpD,EAAYiF,EAAU,CAC7E7B,EAASA,IAAW,EACpBpD,EAAaA,IAAe,EACvBiF,GAAUF,GAAY3B,EAAQpD,EAAY,KAAK,MAAM,EAE1D,IAAIyC,EAAM,KAAKW,CAAM,EACjB8B,EAAM,EACN9E,EAAI,EACR,KAAO,EAAEA,EAAIJ,IAAekF,GAAO,MACjCzC,GAAO,KAAKW,EAAShD,CAAC,EAAI8E,EAE5B,OAAAA,GAAO,IAEHzC,GAAOyC,IAAKzC,GAAO,KAAK,IAAI,EAAG,EAAIzC,CAAU,GAE1CyC,CACT,EAEArE,EAAO,UAAU,UAAY,SAAoBgF,EAAQpD,EAAYiF,EAAU,CAC7E7B,EAASA,IAAW,EACpBpD,EAAaA,IAAe,EACvBiF,GAAUF,GAAY3B,EAAQpD,EAAY,KAAK,MAAM,EAE1D,IAAII,EAAIJ,EACJkF,EAAM,EACNzC,EAAM,KAAKW,EAAS,EAAEhD,CAAC,EAC3B,KAAOA,EAAI,IAAM8E,GAAO,MACtBzC,GAAO,KAAKW,EAAS,EAAEhD,CAAC,EAAI8E,EAE9B,OAAAA,GAAO,IAEHzC,GAAOyC,IAAKzC,GAAO,KAAK,IAAI,EAAG,EAAIzC,CAAU,GAE1CyC,CACT,EAEArE,EAAO,UAAU,SAAW,SAAmBgF,EAAQ6B,EAAU,CAG/D,OAFA7B,EAASA,IAAW,EACf6B,GAAUF,GAAY3B,EAAQ,EAAG,KAAK,MAAM,EAC3C,KAAKA,CAAM,EAAI,KACZ,IAAO,KAAKA,CAAM,EAAI,GAAK,GADA,KAAKA,CAAM,CAEjD,EAEAhF,EAAO,UAAU,YAAc,SAAsBgF,EAAQ6B,EAAU,CACrE7B,EAASA,IAAW,EACf6B,GAAUF,GAAY3B,EAAQ,EAAG,KAAK,MAAM,EACjD,IAAMX,EAAM,KAAKW,CAAM,EAAK,KAAKA,EAAS,CAAC,GAAK,EAChD,OAAQX,EAAM,MAAUA,EAAM,WAAaA,CAC7C,EAEArE,EAAO,UAAU,YAAc,SAAsBgF,EAAQ6B,EAAU,CACrE7B,EAASA,IAAW,EACf6B,GAAUF,GAAY3B,EAAQ,EAAG,KAAK,MAAM,EACjD,IAAMX,EAAM,KAAKW,EAAS,CAAC,EAAK,KAAKA,CAAM,GAAK,EAChD,OAAQX,EAAM,MAAUA,EAAM,WAAaA,CAC7C,EAEArE,EAAO,UAAU,YAAc,SAAsBgF,EAAQ6B,EAAU,CACrE,OAAA7B,EAASA,IAAW,EACf6B,GAAUF,GAAY3B,EAAQ,EAAG,KAAK,MAAM,EAEzC,KAAKA,CAAM,EAChB,KAAKA,EAAS,CAAC,GAAK,EACpB,KAAKA,EAAS,CAAC,GAAK,GACpB,KAAKA,EAAS,CAAC,GAAK,EACzB,EAEAhF,EAAO,UAAU,YAAc,SAAsBgF,EAAQ6B,EAAU,CACrE,OAAA7B,EAASA,IAAW,EACf6B,GAAUF,GAAY3B,EAAQ,EAAG,KAAK,MAAM,EAEzC,KAAKA,CAAM,GAAK,GACrB,KAAKA,EAAS,CAAC,GAAK,GACpB,KAAKA,EAAS,CAAC,GAAK,EACpB,KAAKA,EAAS,CAAC,CACpB,EAEAhF,EAAO,UAAU,eAAiB+G,GAAmB,SAAyB/B,EAAQ,CACpFA,EAASA,IAAW,EACpBgC,GAAehC,EAAQ,QAAQ,EAC/B,IAAMiC,EAAQ,KAAKjC,CAAM,EACnBkC,EAAO,KAAKlC,EAAS,CAAC,GACxBiC,IAAU,QAAaC,IAAS,SAClCC,GAAYnC,EAAQ,KAAK,OAAS,CAAC,EAGrC,IAAMX,EAAM,KAAKW,EAAS,CAAC,EACzB,KAAKA,EAAS,CAAC,EAAI,GAAK,EACxB,KAAKA,EAAS,CAAC,EAAI,GAAK,IACvBkC,GAAQ,IAEX,OAAQ,OAAO7C,CAAG,GAAK,OAAO,EAAE,GAC9B,OAAO4C,EACP,KAAK,EAAEjC,CAAM,EAAI,GAAK,EACtB,KAAK,EAAEA,CAAM,EAAI,GAAK,GACtB,KAAK,EAAEA,CAAM,EAAI,GAAK,EAAE,CAC5B,CAAC,EAEDhF,EAAO,UAAU,eAAiB+G,GAAmB,SAAyB/B,EAAQ,CACpFA,EAASA,IAAW,EACpBgC,GAAehC,EAAQ,QAAQ,EAC/B,IAAMiC,EAAQ,KAAKjC,CAAM,EACnBkC,EAAO,KAAKlC,EAAS,CAAC,GACxBiC,IAAU,QAAaC,IAAS,SAClCC,GAAYnC,EAAQ,KAAK,OAAS,CAAC,EAGrC,IAAMX,GAAO4C,GAAS,IACpB,KAAK,EAAEjC,CAAM,EAAI,GAAK,GACtB,KAAK,EAAEA,CAAM,EAAI,GAAK,EACtB,KAAK,EAAEA,CAAM,EAEf,OAAQ,OAAOX,CAAG,GAAK,OAAO,EAAE,GAC9B,OAAO,KAAK,EAAEW,CAAM,EAAI,GAAK,GAC7B,KAAK,EAAEA,CAAM,EAAI,GAAK,GACtB,KAAK,EAAEA,CAAM,EAAI,GAAK,EACtBkC,CAAI,CACR,CAAC,EAEDlH,EAAO,UAAU,YAAc,SAAsBgF,EAAQ6B,EAAU,CACrE,OAAA7B,EAASA,IAAW,EACf6B,GAAUF,GAAY3B,EAAQ,EAAG,KAAK,MAAM,EAC1ClF,GAAQ,KAAK,KAAMkF,EAAQ,GAAM,GAAI,CAAC,CAC/C,EAEAhF,EAAO,UAAU,YAAc,SAAsBgF,EAAQ6B,EAAU,CACrE,OAAA7B,EAASA,IAAW,EACf6B,GAAUF,GAAY3B,EAAQ,EAAG,KAAK,MAAM,EAC1ClF,GAAQ,KAAK,KAAMkF,EAAQ,GAAO,GAAI,CAAC,CAChD,EAEAhF,EAAO,UAAU,aAAe,SAAuBgF,EAAQ6B,EAAU,CACvE,OAAA7B,EAASA,IAAW,EACf6B,GAAUF,GAAY3B,EAAQ,EAAG,KAAK,MAAM,EAC1ClF,GAAQ,KAAK,KAAMkF,EAAQ,GAAM,GAAI,CAAC,CAC/C,EAEAhF,EAAO,UAAU,aAAe,SAAuBgF,EAAQ6B,EAAU,CACvE,OAAA7B,EAASA,IAAW,EACf6B,GAAUF,GAAY3B,EAAQ,EAAG,KAAK,MAAM,EAC1ClF,GAAQ,KAAK,KAAMkF,EAAQ,GAAO,GAAI,CAAC,CAChD,EAEA,SAASsC,GAAU9G,EAAKK,EAAOmE,EAAQ4B,EAAK9C,EAAKyD,EAAK,CACpD,GAAI,CAACvH,EAAO,SAASQ,CAAG,EAAG,MAAM,IAAI,UAAU,6CAA6C,EAC5F,GAAIK,EAAQiD,GAAOjD,EAAQ0G,EAAK,MAAM,IAAI,WAAW,mCAAmC,EACxF,GAAIvC,EAAS4B,EAAMpG,EAAI,OAAQ,MAAM,IAAI,WAAW,oBAAoB,CAC1E,CAEAR,EAAO,UAAU,YACjBA,EAAO,UAAU,YAAc,SAAsBa,EAAOmE,EAAQpD,EAAYiF,EAAU,CAIxF,GAHAhG,EAAQ,CAACA,EACTmE,EAASA,IAAW,EACpBpD,EAAaA,IAAe,EACxB,CAACiF,EAAU,CACb,IAAMW,EAAW,KAAK,IAAI,EAAG,EAAI5F,CAAU,EAAI,EAC/C0F,GAAS,KAAMzG,EAAOmE,EAAQpD,EAAY4F,EAAU,CAAC,CACvD,CAEA,IAAIV,EAAM,EACN9E,EAAI,EAER,IADA,KAAKgD,CAAM,EAAInE,EAAQ,IAChB,EAAEmB,EAAIJ,IAAekF,GAAO,MACjC,KAAK9B,EAAShD,CAAC,EAAKnB,EAAQiG,EAAO,IAGrC,OAAO9B,EAASpD,CAClB,EAEA5B,EAAO,UAAU,YACjBA,EAAO,UAAU,YAAc,SAAsBa,EAAOmE,EAAQpD,EAAYiF,EAAU,CAIxF,GAHAhG,EAAQ,CAACA,EACTmE,EAASA,IAAW,EACpBpD,EAAaA,IAAe,EACxB,CAACiF,EAAU,CACb,IAAMW,EAAW,KAAK,IAAI,EAAG,EAAI5F,CAAU,EAAI,EAC/C0F,GAAS,KAAMzG,EAAOmE,EAAQpD,EAAY4F,EAAU,CAAC,CACvD,CAEA,IAAI,EAAI5F,EAAa,EACjBkF,EAAM,EAEV,IADA,KAAK9B,EAAS,CAAC,EAAInE,EAAQ,IACpB,EAAE,GAAK,IAAMiG,GAAO,MACzB,KAAK9B,EAAS,CAAC,EAAKnE,EAAQiG,EAAO,IAGrC,OAAO9B,EAASpD,CAClB,EAEA5B,EAAO,UAAU,WACjBA,EAAO,UAAU,WAAa,SAAqBa,EAAOmE,EAAQ6B,EAAU,CAC1E,OAAAhG,EAAQ,CAACA,EACTmE,EAASA,IAAW,EACf6B,GAAUS,GAAS,KAAMzG,EAAOmE,EAAQ,EAAG,IAAM,CAAC,EACvD,KAAKA,CAAM,EAAKnE,EAAQ,IACjBmE,EAAS,CAClB,EAEAhF,EAAO,UAAU,cACjBA,EAAO,UAAU,cAAgB,SAAwBa,EAAOmE,EAAQ6B,EAAU,CAChF,OAAAhG,EAAQ,CAACA,EACTmE,EAASA,IAAW,EACf6B,GAAUS,GAAS,KAAMzG,EAAOmE,EAAQ,EAAG,MAAQ,CAAC,EACzD,KAAKA,CAAM,EAAKnE,EAAQ,IACxB,KAAKmE,EAAS,CAAC,EAAKnE,IAAU,EACvBmE,EAAS,CAClB,EAEAhF,EAAO,UAAU,cACjBA,EAAO,UAAU,cAAgB,SAAwBa,EAAOmE,EAAQ6B,EAAU,CAChF,OAAAhG,EAAQ,CAACA,EACTmE,EAASA,IAAW,EACf6B,GAAUS,GAAS,KAAMzG,EAAOmE,EAAQ,EAAG,MAAQ,CAAC,EACzD,KAAKA,CAAM,EAAKnE,IAAU,EAC1B,KAAKmE,EAAS,CAAC,EAAKnE,EAAQ,IACrBmE,EAAS,CAClB,EAEAhF,EAAO,UAAU,cACjBA,EAAO,UAAU,cAAgB,SAAwBa,EAAOmE,EAAQ6B,EAAU,CAChF,OAAAhG,EAAQ,CAACA,EACTmE,EAASA,IAAW,EACf6B,GAAUS,GAAS,KAAMzG,EAAOmE,EAAQ,EAAG,WAAY,CAAC,EAC7D,KAAKA,EAAS,CAAC,EAAKnE,IAAU,GAC9B,KAAKmE,EAAS,CAAC,EAAKnE,IAAU,GAC9B,KAAKmE,EAAS,CAAC,EAAKnE,IAAU,EAC9B,KAAKmE,CAAM,EAAKnE,EAAQ,IACjBmE,EAAS,CAClB,EAEAhF,EAAO,UAAU,cACjBA,EAAO,UAAU,cAAgB,SAAwBa,EAAOmE,EAAQ6B,EAAU,CAChF,OAAAhG,EAAQ,CAACA,EACTmE,EAASA,IAAW,EACf6B,GAAUS,GAAS,KAAMzG,EAAOmE,EAAQ,EAAG,WAAY,CAAC,EAC7D,KAAKA,CAAM,EAAKnE,IAAU,GAC1B,KAAKmE,EAAS,CAAC,EAAKnE,IAAU,GAC9B,KAAKmE,EAAS,CAAC,EAAKnE,IAAU,EAC9B,KAAKmE,EAAS,CAAC,EAAKnE,EAAQ,IACrBmE,EAAS,CAClB,EAEA,SAASyC,GAAgBjH,EAAKK,EAAOmE,EAAQuC,EAAKzD,EAAK,CACrD4D,GAAW7G,EAAO0G,EAAKzD,EAAKtD,EAAKwE,EAAQ,CAAC,EAE1C,IAAIoC,EAAK,OAAOvG,EAAQ,OAAO,UAAU,CAAC,EAC1CL,EAAIwE,GAAQ,EAAIoC,EAChBA,EAAKA,GAAM,EACX5G,EAAIwE,GAAQ,EAAIoC,EAChBA,EAAKA,GAAM,EACX5G,EAAIwE,GAAQ,EAAIoC,EAChBA,EAAKA,GAAM,EACX5G,EAAIwE,GAAQ,EAAIoC,EAChB,IAAIC,EAAK,OAAOxG,GAAS,OAAO,EAAE,EAAI,OAAO,UAAU,CAAC,EACxD,OAAAL,EAAIwE,GAAQ,EAAIqC,EAChBA,EAAKA,GAAM,EACX7G,EAAIwE,GAAQ,EAAIqC,EAChBA,EAAKA,GAAM,EACX7G,EAAIwE,GAAQ,EAAIqC,EAChBA,EAAKA,GAAM,EACX7G,EAAIwE,GAAQ,EAAIqC,EACTrC,CACT,CAEA,SAAS2C,GAAgBnH,EAAKK,EAAOmE,EAAQuC,EAAKzD,EAAK,CACrD4D,GAAW7G,EAAO0G,EAAKzD,EAAKtD,EAAKwE,EAAQ,CAAC,EAE1C,IAAIoC,EAAK,OAAOvG,EAAQ,OAAO,UAAU,CAAC,EAC1CL,EAAIwE,EAAS,CAAC,EAAIoC,EAClBA,EAAKA,GAAM,EACX5G,EAAIwE,EAAS,CAAC,EAAIoC,EAClBA,EAAKA,GAAM,EACX5G,EAAIwE,EAAS,CAAC,EAAIoC,EAClBA,EAAKA,GAAM,EACX5G,EAAIwE,EAAS,CAAC,EAAIoC,EAClB,IAAIC,EAAK,OAAOxG,GAAS,OAAO,EAAE,EAAI,OAAO,UAAU,CAAC,EACxD,OAAAL,EAAIwE,EAAS,CAAC,EAAIqC,EAClBA,EAAKA,GAAM,EACX7G,EAAIwE,EAAS,CAAC,EAAIqC,EAClBA,EAAKA,GAAM,EACX7G,EAAIwE,EAAS,CAAC,EAAIqC,EAClBA,EAAKA,GAAM,EACX7G,EAAIwE,CAAM,EAAIqC,EACPrC,EAAS,CAClB,CAEAhF,EAAO,UAAU,iBAAmB+G,GAAmB,SAA2BlG,EAAOmE,EAAS,EAAG,CACnG,OAAOyC,GAAe,KAAM5G,EAAOmE,EAAQ,OAAO,CAAC,EAAG,OAAO,oBAAoB,CAAC,CACpF,CAAC,EAEDhF,EAAO,UAAU,iBAAmB+G,GAAmB,SAA2BlG,EAAOmE,EAAS,EAAG,CACnG,OAAO2C,GAAe,KAAM9G,EAAOmE,EAAQ,OAAO,CAAC,EAAG,OAAO,oBAAoB,CAAC,CACpF,CAAC,EAEDhF,EAAO,UAAU,WAAa,SAAqBa,EAAOmE,EAAQpD,EAAYiF,EAAU,CAGtF,GAFAhG,EAAQ,CAACA,EACTmE,EAASA,IAAW,EAChB,CAAC6B,EAAU,CACb,IAAMe,EAAQ,KAAK,IAAI,EAAI,EAAIhG,EAAc,CAAC,EAE9C0F,GAAS,KAAMzG,EAAOmE,EAAQpD,EAAYgG,EAAQ,EAAG,CAACA,CAAK,CAC7D,CAEA,IAAI,EAAI,EACJd,EAAM,EACNe,EAAM,EAEV,IADA,KAAK7C,CAAM,EAAInE,EAAQ,IAChB,EAAE,EAAIe,IAAekF,GAAO,MAC7BjG,EAAQ,GAAKgH,IAAQ,GAAK,KAAK7C,EAAS,EAAI,CAAC,IAAM,IACrD6C,EAAM,GAER,KAAK7C,EAAS,CAAC,GAAMnE,EAAQiG,GAAQ,GAAKe,EAAM,IAGlD,OAAO7C,EAASpD,CAClB,EAEA5B,EAAO,UAAU,WAAa,SAAqBa,EAAOmE,EAAQpD,EAAYiF,EAAU,CAGtF,GAFAhG,EAAQ,CAACA,EACTmE,EAASA,IAAW,EAChB,CAAC6B,EAAU,CACb,IAAMe,EAAQ,KAAK,IAAI,EAAI,EAAIhG,EAAc,CAAC,EAE9C0F,GAAS,KAAMzG,EAAOmE,EAAQpD,EAAYgG,EAAQ,EAAG,CAACA,CAAK,CAC7D,CAEA,IAAI,EAAIhG,EAAa,EACjBkF,EAAM,EACNe,EAAM,EAEV,IADA,KAAK7C,EAAS,CAAC,EAAInE,EAAQ,IACpB,EAAE,GAAK,IAAMiG,GAAO,MACrBjG,EAAQ,GAAKgH,IAAQ,GAAK,KAAK7C,EAAS,EAAI,CAAC,IAAM,IACrD6C,EAAM,GAER,KAAK7C,EAAS,CAAC,GAAMnE,EAAQiG,GAAQ,GAAKe,EAAM,IAGlD,OAAO7C,EAASpD,CAClB,EAEA5B,EAAO,UAAU,UAAY,SAAoBa,EAAOmE,EAAQ6B,EAAU,CACxE,OAAAhG,EAAQ,CAACA,EACTmE,EAASA,IAAW,EACf6B,GAAUS,GAAS,KAAMzG,EAAOmE,EAAQ,EAAG,IAAM,IAAK,EACvDnE,EAAQ,IAAGA,EAAQ,IAAOA,EAAQ,GACtC,KAAKmE,CAAM,EAAKnE,EAAQ,IACjBmE,EAAS,CAClB,EAEAhF,EAAO,UAAU,aAAe,SAAuBa,EAAOmE,EAAQ6B,EAAU,CAC9E,OAAAhG,EAAQ,CAACA,EACTmE,EAASA,IAAW,EACf6B,GAAUS,GAAS,KAAMzG,EAAOmE,EAAQ,EAAG,MAAQ,MAAO,EAC/D,KAAKA,CAAM,EAAKnE,EAAQ,IACxB,KAAKmE,EAAS,CAAC,EAAKnE,IAAU,EACvBmE,EAAS,CAClB,EAEAhF,EAAO,UAAU,aAAe,SAAuBa,EAAOmE,EAAQ6B,EAAU,CAC9E,OAAAhG,EAAQ,CAACA,EACTmE,EAASA,IAAW,EACf6B,GAAUS,GAAS,KAAMzG,EAAOmE,EAAQ,EAAG,MAAQ,MAAO,EAC/D,KAAKA,CAAM,EAAKnE,IAAU,EAC1B,KAAKmE,EAAS,CAAC,EAAKnE,EAAQ,IACrBmE,EAAS,CAClB,EAEAhF,EAAO,UAAU,aAAe,SAAuBa,EAAOmE,EAAQ6B,EAAU,CAC9E,OAAAhG,EAAQ,CAACA,EACTmE,EAASA,IAAW,EACf6B,GAAUS,GAAS,KAAMzG,EAAOmE,EAAQ,EAAG,WAAY,WAAW,EACvE,KAAKA,CAAM,EAAKnE,EAAQ,IACxB,KAAKmE,EAAS,CAAC,EAAKnE,IAAU,EAC9B,KAAKmE,EAAS,CAAC,EAAKnE,IAAU,GAC9B,KAAKmE,EAAS,CAAC,EAAKnE,IAAU,GACvBmE,EAAS,CAClB,EAEAhF,EAAO,UAAU,aAAe,SAAuBa,EAAOmE,EAAQ6B,EAAU,CAC9E,OAAAhG,EAAQ,CAACA,EACTmE,EAASA,IAAW,EACf6B,GAAUS,GAAS,KAAMzG,EAAOmE,EAAQ,EAAG,WAAY,WAAW,EACnEnE,EAAQ,IAAGA,EAAQ,WAAaA,EAAQ,GAC5C,KAAKmE,CAAM,EAAKnE,IAAU,GAC1B,KAAKmE,EAAS,CAAC,EAAKnE,IAAU,GAC9B,KAAKmE,EAAS,CAAC,EAAKnE,IAAU,EAC9B,KAAKmE,EAAS,CAAC,EAAKnE,EAAQ,IACrBmE,EAAS,CAClB,EAEAhF,EAAO,UAAU,gBAAkB+G,GAAmB,SAA0BlG,EAAOmE,EAAS,EAAG,CACjG,OAAOyC,GAAe,KAAM5G,EAAOmE,EAAQ,CAAC,OAAO,oBAAoB,EAAG,OAAO,oBAAoB,CAAC,CACxG,CAAC,EAEDhF,EAAO,UAAU,gBAAkB+G,GAAmB,SAA0BlG,EAAOmE,EAAS,EAAG,CACjG,OAAO2C,GAAe,KAAM9G,EAAOmE,EAAQ,CAAC,OAAO,oBAAoB,EAAG,OAAO,oBAAoB,CAAC,CACxG,CAAC,EAED,SAAS8C,GAActH,EAAKK,EAAOmE,EAAQ4B,EAAK9C,EAAKyD,EAAK,CACxD,GAAIvC,EAAS4B,EAAMpG,EAAI,OAAQ,MAAM,IAAI,WAAW,oBAAoB,EACxE,GAAIwE,EAAS,EAAG,MAAM,IAAI,WAAW,oBAAoB,CAC3D,CAEA,SAAS+C,GAAYvH,EAAKK,EAAOmE,EAAQgD,EAAcnB,EAAU,CAC/D,OAAAhG,EAAQ,CAACA,EACTmE,EAASA,IAAW,EACf6B,GACHiB,GAAatH,EAAKK,EAAOmE,EAAQ,EAAG,qBAAwB,qBAAuB,EAErFlF,GAAQ,MAAMU,EAAKK,EAAOmE,EAAQgD,EAAc,GAAI,CAAC,EAC9ChD,EAAS,CAClB,CAEAhF,EAAO,UAAU,aAAe,SAAuBa,EAAOmE,EAAQ6B,EAAU,CAC9E,OAAOkB,GAAW,KAAMlH,EAAOmE,EAAQ,GAAM6B,CAAQ,CACvD,EAEA7G,EAAO,UAAU,aAAe,SAAuBa,EAAOmE,EAAQ6B,EAAU,CAC9E,OAAOkB,GAAW,KAAMlH,EAAOmE,EAAQ,GAAO6B,CAAQ,CACxD,EAEA,SAASoB,GAAazH,EAAKK,EAAOmE,EAAQgD,EAAcnB,EAAU,CAChE,OAAAhG,EAAQ,CAACA,EACTmE,EAASA,IAAW,EACf6B,GACHiB,GAAatH,EAAKK,EAAOmE,EAAQ,EAAG,sBAAyB,sBAAwB,EAEvFlF,GAAQ,MAAMU,EAAKK,EAAOmE,EAAQgD,EAAc,GAAI,CAAC,EAC9ChD,EAAS,CAClB,CAEAhF,EAAO,UAAU,cAAgB,SAAwBa,EAAOmE,EAAQ6B,EAAU,CAChF,OAAOoB,GAAY,KAAMpH,EAAOmE,EAAQ,GAAM6B,CAAQ,CACxD,EAEA7G,EAAO,UAAU,cAAgB,SAAwBa,EAAOmE,EAAQ6B,EAAU,CAChF,OAAOoB,GAAY,KAAMpH,EAAOmE,EAAQ,GAAO6B,CAAQ,CACzD,EAGA7G,EAAO,UAAU,KAAO,SAAe+D,EAAQmE,EAAahF,EAAOC,EAAK,CACtE,GAAI,CAACnD,EAAO,SAAS+D,CAAM,EAAG,MAAM,IAAI,UAAU,6BAA6B,EAS/E,GARKb,IAAOA,EAAQ,GAChB,CAACC,GAAOA,IAAQ,IAAGA,EAAM,KAAK,QAC9B+E,GAAenE,EAAO,SAAQmE,EAAcnE,EAAO,QAClDmE,IAAaA,EAAc,GAC5B/E,EAAM,GAAKA,EAAMD,IAAOC,EAAMD,GAG9BC,IAAQD,GACRa,EAAO,SAAW,GAAK,KAAK,SAAW,EAAG,MAAO,GAGrD,GAAImE,EAAc,EAChB,MAAM,IAAI,WAAW,2BAA2B,EAElD,GAAIhF,EAAQ,GAAKA,GAAS,KAAK,OAAQ,MAAM,IAAI,WAAW,oBAAoB,EAChF,GAAIC,EAAM,EAAG,MAAM,IAAI,WAAW,yBAAyB,EAGvDA,EAAM,KAAK,SAAQA,EAAM,KAAK,QAC9BY,EAAO,OAASmE,EAAc/E,EAAMD,IACtCC,EAAMY,EAAO,OAASmE,EAAchF,GAGtC,IAAMb,EAAMc,EAAMD,EAElB,OAAI,OAASa,GAAU,OAAO,WAAW,UAAU,YAAe,WAEhE,KAAK,WAAWmE,EAAahF,EAAOC,CAAG,EAEvC,WAAW,UAAU,IAAI,KACvBY,EACA,KAAK,SAASb,EAAOC,CAAG,EACxB+E,CACF,EAGK7F,CACT,EAMArC,EAAO,UAAU,KAAO,SAAeqE,EAAKnB,EAAOC,EAAK1B,EAAU,CAEhE,GAAI,OAAO4C,GAAQ,SAAU,CAS3B,GARI,OAAOnB,GAAU,UACnBzB,EAAWyB,EACXA,EAAQ,EACRC,EAAM,KAAK,QACF,OAAOA,GAAQ,WACxB1B,EAAW0B,EACXA,EAAM,KAAK,QAET1B,IAAa,QAAa,OAAOA,GAAa,SAChD,MAAM,IAAI,UAAU,2BAA2B,EAEjD,GAAI,OAAOA,GAAa,UAAY,CAACzB,EAAO,WAAWyB,CAAQ,EAC7D,MAAM,IAAI,UAAU,qBAAuBA,CAAQ,EAErD,GAAI4C,EAAI,SAAW,EAAG,CACpB,IAAM8D,EAAO9D,EAAI,WAAW,CAAC,GACxB5C,IAAa,QAAU0G,EAAO,KAC/B1G,IAAa,YAEf4C,EAAM8D,EAEV,CACF,MAAW,OAAO9D,GAAQ,SACxBA,EAAMA,EAAM,IACH,OAAOA,GAAQ,YACxBA,EAAM,OAAOA,CAAG,GAIlB,GAAInB,EAAQ,GAAK,KAAK,OAASA,GAAS,KAAK,OAASC,EACpD,MAAM,IAAI,WAAW,oBAAoB,EAG3C,GAAIA,GAAOD,EACT,OAAO,KAGTA,EAAQA,IAAU,EAClBC,EAAMA,IAAQ,OAAY,KAAK,OAASA,IAAQ,EAE3CkB,IAAKA,EAAM,GAEhB,IAAI,EACJ,GAAI,OAAOA,GAAQ,SACjB,IAAK,EAAInB,EAAO,EAAIC,EAAK,EAAE,EACzB,KAAK,CAAC,EAAIkB,MAEP,CACL,IAAMoC,EAAQzG,EAAO,SAASqE,CAAG,EAC7BA,EACArE,EAAO,KAAKqE,EAAK5C,CAAQ,EACvBY,EAAMoE,EAAM,OAClB,GAAIpE,IAAQ,EACV,MAAM,IAAI,UAAU,cAAgBgC,EAClC,mCAAmC,EAEvC,IAAK,EAAI,EAAG,EAAIlB,EAAMD,EAAO,EAAE,EAC7B,KAAK,EAAIA,CAAK,EAAIuD,EAAM,EAAIpE,CAAG,CAEnC,CAEA,OAAO,IACT,EAMA,IAAM+F,GAAS,CAAC,EAChB,SAASC,GAAGC,EAAKC,EAAYC,EAAM,CACjCJ,GAAOE,CAAG,EAAI,cAAwBE,CAAK,CACzC,aAAe,CACb,MAAM,EAEN,OAAO,eAAe,KAAM,UAAW,CACrC,MAAOD,EAAW,MAAM,KAAM,SAAS,EACvC,SAAU,GACV,aAAc,EAChB,CAAC,EAGD,KAAK,KAAO,GAAG,KAAK,IAAI,KAAKD,CAAG,IAGhC,KAAK,MAEL,OAAO,KAAK,IACd,CAEA,IAAI,MAAQ,CACV,OAAOA,CACT,CAEA,IAAI,KAAMzH,EAAO,CACf,OAAO,eAAe,KAAM,OAAQ,CAClC,aAAc,GACd,WAAY,GACZ,MAAAA,EACA,SAAU,EACZ,CAAC,CACH,CAEA,UAAY,CACV,MAAO,GAAG,KAAK,IAAI,KAAKyH,CAAG,MAAM,KAAK,OAAO,EAC/C,CACF,CACF,CAEAD,GAAE,2BACA,SAAUI,EAAM,CACd,OAAIA,EACK,GAAGA,CAAI,+BAGT,gDACT,EAAG,UAAU,EACfJ,GAAE,uBACA,SAAUI,EAAM5G,EAAQ,CACtB,MAAO,QAAQ4G,CAAI,oDAAoD,OAAO5G,CAAM,EACtF,EAAG,SAAS,EACdwG,GAAE,mBACA,SAAUxE,EAAK6E,EAAOC,EAAO,CAC3B,IAAIC,EAAM,iBAAiB/E,CAAG,qBAC1BgF,EAAWF,EACf,OAAI,OAAO,UAAUA,CAAK,GAAK,KAAK,IAAIA,CAAK,EAAI,GAAK,GACpDE,EAAWC,GAAsB,OAAOH,CAAK,CAAC,EACrC,OAAOA,GAAU,WAC1BE,EAAW,OAAOF,CAAK,GACnBA,EAAQ,OAAO,CAAC,GAAK,OAAO,EAAE,GAAKA,EAAQ,EAAE,OAAO,CAAC,GAAK,OAAO,EAAE,MACrEE,EAAWC,GAAsBD,CAAQ,GAE3CA,GAAY,KAEdD,GAAO,eAAeF,CAAK,cAAcG,CAAQ,GAC1CD,CACT,EAAG,UAAU,EAEf,SAASE,GAAuBzE,EAAK,CACnC,IAAIsB,EAAM,GACN3D,EAAIqC,EAAI,OACNnB,EAAQmB,EAAI,CAAC,IAAM,IAAM,EAAI,EACnC,KAAOrC,GAAKkB,EAAQ,EAAGlB,GAAK,EAC1B2D,EAAM,IAAItB,EAAI,MAAMrC,EAAI,EAAGA,CAAC,CAAC,GAAG2D,CAAG,GAErC,MAAO,GAAGtB,EAAI,MAAM,EAAGrC,CAAC,CAAC,GAAG2D,CAAG,EACjC,CAKA,SAASoD,GAAavI,EAAKwE,EAAQpD,EAAY,CAC7CoF,GAAehC,EAAQ,QAAQ,GAC3BxE,EAAIwE,CAAM,IAAM,QAAaxE,EAAIwE,EAASpD,CAAU,IAAM,SAC5DuF,GAAYnC,EAAQxE,EAAI,QAAUoB,EAAa,EAAE,CAErD,CAEA,SAAS8F,GAAY7G,EAAO0G,EAAKzD,EAAKtD,EAAKwE,EAAQpD,EAAY,CAC7D,GAAIf,EAAQiD,GAAOjD,EAAQ0G,EAAK,CAC9B,IAAM5D,EAAI,OAAO4D,GAAQ,SAAW,IAAM,GACtCmB,EACJ,MAAI9G,EAAa,EACX2F,IAAQ,GAAKA,IAAQ,OAAO,CAAC,EAC/BmB,EAAQ,OAAO/E,CAAC,WAAWA,CAAC,QAAQ/B,EAAa,GAAK,CAAC,GAAG+B,CAAC,GAE3D+E,EAAQ,SAAS/E,CAAC,QAAQ/B,EAAa,GAAK,EAAI,CAAC,GAAG+B,CAAC,iBACzC/B,EAAa,GAAK,EAAI,CAAC,GAAG+B,CAAC,GAGzC+E,EAAQ,MAAMnB,CAAG,GAAG5D,CAAC,WAAWG,CAAG,GAAGH,CAAC,GAEnC,IAAIyE,GAAO,iBAAiB,QAASM,EAAO7H,CAAK,CACzD,CACAkI,GAAYvI,EAAKwE,EAAQpD,CAAU,CACrC,CAEA,SAASoF,GAAgBnG,EAAO4H,EAAM,CACpC,GAAI,OAAO5H,GAAU,SACnB,MAAM,IAAIuH,GAAO,qBAAqBK,EAAM,SAAU5H,CAAK,CAE/D,CAEA,SAASsG,GAAatG,EAAON,EAAQyI,EAAM,CACzC,MAAI,KAAK,MAAMnI,CAAK,IAAMA,GACxBmG,GAAenG,EAAOmI,CAAI,EACpB,IAAIZ,GAAO,iBAAiBY,GAAQ,SAAU,aAAcnI,CAAK,GAGrEN,EAAS,EACL,IAAI6H,GAAO,yBAGb,IAAIA,GAAO,iBAAiBY,GAAQ,SACR,MAAMA,EAAO,EAAI,CAAC,WAAWzI,CAAM,GACnCM,CAAK,CACzC,CAKA,IAAMoI,GAAoB,oBAE1B,SAASC,GAAarF,EAAK,CAMzB,GAJAA,EAAMA,EAAI,MAAM,GAAG,EAAE,CAAC,EAEtBA,EAAMA,EAAI,KAAK,EAAE,QAAQoF,GAAmB,EAAE,EAE1CpF,EAAI,OAAS,EAAG,MAAO,GAE3B,KAAOA,EAAI,OAAS,IAAM,GACxBA,EAAMA,EAAM,IAEd,OAAOA,CACT,CAEA,SAASd,GAAapB,EAAQwH,EAAO,CACnCA,EAAQA,GAAS,IACjB,IAAItD,EACEtF,EAASoB,EAAO,OAClByH,EAAgB,KACd3C,EAAQ,CAAC,EAEf,QAASzE,EAAI,EAAGA,EAAIzB,EAAQ,EAAEyB,EAAG,CAI/B,GAHA6D,EAAYlE,EAAO,WAAWK,CAAC,EAG3B6D,EAAY,OAAUA,EAAY,MAAQ,CAE5C,GAAI,CAACuD,EAAe,CAElB,GAAIvD,EAAY,MAAQ,EAEjBsD,GAAS,GAAK,IAAI1C,EAAM,KAAK,IAAM,IAAM,GAAI,EAClD,QACF,SAAWzE,EAAI,IAAMzB,EAAQ,EAEtB4I,GAAS,GAAK,IAAI1C,EAAM,KAAK,IAAM,IAAM,GAAI,EAClD,QACF,CAGA2C,EAAgBvD,EAEhB,QACF,CAGA,GAAIA,EAAY,MAAQ,EACjBsD,GAAS,GAAK,IAAI1C,EAAM,KAAK,IAAM,IAAM,GAAI,EAClD2C,EAAgBvD,EAChB,QACF,CAGAA,GAAauD,EAAgB,OAAU,GAAKvD,EAAY,OAAU,KACpE,MAAWuD,IAEJD,GAAS,GAAK,IAAI1C,EAAM,KAAK,IAAM,IAAM,GAAI,EAMpD,GAHA2C,EAAgB,KAGZvD,EAAY,IAAM,CACpB,IAAKsD,GAAS,GAAK,EAAG,MACtB1C,EAAM,KAAKZ,CAAS,CACtB,SAAWA,EAAY,KAAO,CAC5B,IAAKsD,GAAS,GAAK,EAAG,MACtB1C,EAAM,KACJZ,GAAa,EAAM,IACnBA,EAAY,GAAO,GACrB,CACF,SAAWA,EAAY,MAAS,CAC9B,IAAKsD,GAAS,GAAK,EAAG,MACtB1C,EAAM,KACJZ,GAAa,GAAM,IACnBA,GAAa,EAAM,GAAO,IAC1BA,EAAY,GAAO,GACrB,CACF,SAAWA,EAAY,QAAU,CAC/B,IAAKsD,GAAS,GAAK,EAAG,MACtB1C,EAAM,KACJZ,GAAa,GAAO,IACpBA,GAAa,GAAM,GAAO,IAC1BA,GAAa,EAAM,GAAO,IAC1BA,EAAY,GAAO,GACrB,CACF,KACE,OAAM,IAAI,MAAM,oBAAoB,CAExC,CAEA,OAAOY,CACT,CAEA,SAASlB,GAAc1B,EAAK,CAC1B,IAAMwF,EAAY,CAAC,EACnB,QAASrH,EAAI,EAAGA,EAAI6B,EAAI,OAAQ,EAAE7B,EAEhCqH,EAAU,KAAKxF,EAAI,WAAW7B,CAAC,EAAI,GAAI,EAEzC,OAAOqH,CACT,CAEA,SAAS3D,GAAgB7B,EAAKsF,EAAO,CACnC,IAAIG,EAAGjC,EAAID,EACLiC,EAAY,CAAC,EACnB,QAASrH,EAAI,EAAGA,EAAI6B,EAAI,QACjB,GAAAsF,GAAS,GAAK,GADW,EAAEnH,EAGhCsH,EAAIzF,EAAI,WAAW7B,CAAC,EACpBqF,EAAKiC,GAAK,EACVlC,EAAKkC,EAAI,IACTD,EAAU,KAAKjC,CAAE,EACjBiC,EAAU,KAAKhC,CAAE,EAGnB,OAAOgC,CACT,CAEA,SAASrG,GAAea,EAAK,CAC3B,OAAOhE,GAAO,YAAYqJ,GAAYrF,CAAG,CAAC,CAC5C,CAEA,SAASwB,GAAYkE,EAAKC,EAAKxE,EAAQzE,EAAQ,CAC7C,IAAIyB,EACJ,IAAKA,EAAI,EAAGA,EAAIzB,GACT,EAAAyB,EAAIgD,GAAUwE,EAAI,QAAYxH,GAAKuH,EAAI,QADtB,EAAEvH,EAExBwH,EAAIxH,EAAIgD,CAAM,EAAIuE,EAAIvH,CAAC,EAEzB,OAAOA,CACT,CAKA,SAAShB,GAAYoB,EAAK4G,EAAM,CAC9B,OAAO5G,aAAe4G,GACnB5G,GAAO,MAAQA,EAAI,aAAe,MAAQA,EAAI,YAAY,MAAQ,MACjEA,EAAI,YAAY,OAAS4G,EAAK,IACpC,CACA,SAAS1G,GAAaF,EAAK,CAEzB,OAAOA,IAAQA,CACjB,CAIA,IAAMoE,IAAuB,UAAY,CACvC,IAAMiD,EAAW,mBACXC,EAAQ,IAAI,MAAM,GAAG,EAC3B,QAAS1H,EAAI,EAAGA,EAAI,GAAI,EAAEA,EAAG,CAC3B,IAAM2H,EAAM3H,EAAI,GAChB,QAAS8C,EAAI,EAAGA,EAAI,GAAI,EAAEA,EACxB4E,EAAMC,EAAM7E,CAAC,EAAI2E,EAASzH,CAAC,EAAIyH,EAAS3E,CAAC,CAE7C,CACA,OAAO4E,CACT,GAAG,EAGH,SAAS3C,GAAoB6C,EAAI,CAC/B,OAAO,OAAO,OAAW,IAAcC,GAAyBD,CAClE,CAEA,SAASC,IAA0B,CACjC,MAAM,IAAI,MAAM,sBAAsB,CACxC,ICzjEA,IAAAC,GAAA,GAAAC,GAAAD,GAAA,iBAAAE,GAAA,mBAAAC,GAAA,qBAAAC,GAAA,eAAAC,GAAA,gBAAAC,GAAA,qBAAAC,GAAA,wBAAAC,GAAA,gBAAAC,GAAA,YAAAC,GAAA,mBAAAC,GAAA,YAAAC,GAAA,mBAAAC,GAAA,kBAAAC,GAAA,oBAAAC,GAAA,iBAAAC,GAAA,qBAAAC,GAAA,eAAAC,GAAA,UAAAC,GAAA,UAAAC,GAAA,UAAAC,GAAA,UAAAC,GAAA,UAAAC,GAAA,UAAAC,GAAA,UAAAC,GAAA,cAAAC,GAAA,gBAAAC,GAAA,kBAAAC,GAAA,sBAAAC,GAAA,oBAAAC,GAAA,2BAAAC,GAAA,mBAAAC,GAAA,oBAAAC,GAAA,qBAAAC,GAAA,wBAAAC,GAAA,yBAAAC,GAAA,oBAAAC,KC0GO,IAAKC,QACVA,EAAA,MAAQ,QACRA,EAAA,OAAS,SACTA,EAAA,GAAK,KACLA,EAAA,KAAO,OACPA,EAAA,IAAM,MACNA,EAAA,MAAQ,QACRA,EAAA,KAAO,OAPGA,QAAA,ICjGL,IAAKC,QACVA,EAAA,QAAU,UACVA,EAAA,KAAO,OACPA,EAAA,eAAiB,iBACjBA,EAAA,WAAa,aACbA,EAAA,cAAgB,gBAChBA,EAAA,cAAgB,gBAChBA,EAAA,cAAgB,gBAChBA,EAAA,cAAgB,gBAChBA,EAAA,WAAa,aATHA,QAAA,IC6BL,IAAKC,QACVA,IAAA,aAAe,GAAf,eACAA,IAAA,UAAY,GAAZ,YACAA,IAAA,iBAAmB,GAAnB,mBACAA,IAAA,aAAe,GAAf,eACAA,IAAA,yBAA2B,GAA3B,2BACAA,IAAA,OAAS,GAAT,SACAA,IAAA,OAAS,GAAT,SACAA,IAAA,SAAW,GAAX,WACAA,IAAA,YAAc,GAAd,cACAA,IAAA,eAAiB,IAAjB,iBACAA,IAAA,iBAAmB,IAAnB,mBACAA,IAAA,gBAAkB,IAAlB,kBACAA,IAAA,qBAAuB,IAAvB,uBACAA,IAAA,kBAAoB,IAApB,oBACAA,IAAA,gBAAkB,IAAlB,kBACAA,IAAA,UAAY,MAAZ,YACAA,IAAA,YAAc,MAAd,cACAA,IAAA,IAAM,MAAN,MACAA,IAAA,UAAY,KAAZ,YACAA,IAAA,SAAW,OAAX,WACAA,IAAA,oBAAsB,OAAtB,sBACAA,IAAA,YAAc,OAAd,cACAA,IAAA,cAAgB,OAAhB,gBACAA,IAAA,cAAgB,OAAhB,gBACAA,IAAA,mBAAqB,KAArB,qBACAA,IAAA,sBAAwB,OAAxB,wBACAA,IAAA,eAAiB,OAAjB,iBACAA,IAAA,iBAAmB,OAAnB,mBACAA,IAAA,UAAY,OAAZ,YACAA,IAAA,qBAAuB,OAAvB,uBA9BUA,QAAA,IC/BL,IAAMC,GACX,OAAO,YAAe,UAAY,WAAY,WAAa,WAAW,OAAS,OCO3E,SAAUC,GAAQC,EAAU,CAChC,OAAOA,aAAa,YAAe,YAAY,OAAOA,CAAC,GAAKA,EAAE,YAAY,OAAS,YACrF,CAGM,SAAUC,GAAQC,EAAS,CAC/B,GAAI,CAAC,OAAO,cAAcA,CAAC,GAAKA,EAAI,EAAG,MAAM,IAAI,MAAM,kCAAoCA,CAAC,CAC9F,CAGM,SAAUC,GAAOC,KAA8BC,EAAiB,CACpE,GAAI,CAACN,GAAQK,CAAC,EAAG,MAAM,IAAI,MAAM,qBAAqB,EACtD,GAAIC,EAAQ,OAAS,GAAK,CAACA,EAAQ,SAASD,EAAE,MAAM,EAClD,MAAM,IAAI,MAAM,iCAAmCC,EAAU,gBAAkBD,EAAE,MAAM,CAC3F,CAGM,SAAUE,GAAMC,EAAQ,CAC5B,GAAI,OAAOA,GAAM,YAAc,OAAOA,EAAE,QAAW,WACjD,MAAM,IAAI,MAAM,8CAA8C,EAChEN,GAAQM,EAAE,SAAS,EACnBN,GAAQM,EAAE,QAAQ,CACpB,CAGM,SAAUC,GAAQC,EAAeC,EAAgB,GAAI,CACzD,GAAID,EAAS,UAAW,MAAM,IAAI,MAAM,kCAAkC,EAC1E,GAAIC,GAAiBD,EAAS,SAAU,MAAM,IAAI,MAAM,uCAAuC,CACjG,CAGM,SAAUE,GAAQC,EAAUH,EAAa,CAC7CN,GAAOS,CAAG,EACV,IAAMC,EAAMJ,EAAS,UACrB,GAAIG,EAAI,OAASC,EACf,MAAM,IAAI,MAAM,yDAA2DA,CAAG,CAElF,CAaM,SAAUC,GAAIC,EAAe,CACjC,OAAO,IAAI,YAAYA,EAAI,OAAQA,EAAI,WAAY,KAAK,MAAMA,EAAI,WAAa,CAAC,CAAC,CACnF,CAGM,SAAUC,MAASC,EAAoB,CAC3C,QAASC,EAAI,EAAGA,EAAID,EAAO,OAAQC,IACjCD,EAAOC,CAAC,EAAE,KAAK,CAAC,CAEpB,CAGM,SAAUC,GAAWJ,EAAe,CACxC,OAAO,IAAI,SAASA,EAAI,OAAQA,EAAI,WAAYA,EAAI,UAAU,CAChE,CAGM,SAAUK,GAAKC,EAAcC,EAAa,CAC9C,OAAQD,GAAS,GAAKC,EAAWD,IAASC,CAC5C,CAGM,SAAUC,EAAKF,EAAcC,EAAa,CAC9C,OAAQD,GAAQC,EAAWD,IAAU,GAAKC,IAAY,CACxD,CAGO,IAAME,GACX,IAAI,WAAW,IAAI,YAAY,CAAC,SAAU,CAAC,EAAE,MAAM,EAAE,CAAC,IAAM,GAGxD,SAAUC,GAASJ,EAAY,CACnC,OACIA,GAAQ,GAAM,WACdA,GAAQ,EAAK,SACbA,IAAS,EAAK,MACdA,IAAS,GAAM,GAErB,CASM,SAAUK,GAAWC,EAAgB,CACzC,QAASC,EAAI,EAAGA,EAAID,EAAI,OAAQC,IAC9BD,EAAIC,CAAC,EAAIC,GAASF,EAAIC,CAAC,CAAC,EAE1B,OAAOD,CACT,CAEO,IAAMG,GAA8CC,GACtDC,GAAmBA,EACpBN,GAGEO,GAEJ,OAAO,WAAW,KAAK,CAAA,CAAE,EAAE,OAAU,YAAc,OAAO,WAAW,SAAY,WAG7EC,GAAwB,MAAM,KAAK,CAAE,OAAQ,GAAG,EAAI,CAACC,EAAGP,IAC5DA,EAAE,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,CAAC,EAO3B,SAAUQ,GAAWC,EAAiB,CAG1C,GAFAC,GAAOD,CAAK,EAERJ,GAAe,OAAOI,EAAM,MAAK,EAErC,IAAIE,EAAM,GACV,QAASX,EAAI,EAAGA,EAAIS,EAAM,OAAQT,IAChCW,GAAOL,GAAMG,EAAMT,CAAC,CAAC,EAEvB,OAAOW,CACT,CAGA,IAAMC,GAAS,CAAE,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAG,EAC5D,SAASC,GAAcC,EAAU,CAC/B,GAAIA,GAAMF,GAAO,IAAME,GAAMF,GAAO,GAAI,OAAOE,EAAKF,GAAO,GAC3D,GAAIE,GAAMF,GAAO,GAAKE,GAAMF,GAAO,EAAG,OAAOE,GAAMF,GAAO,EAAI,IAC9D,GAAIE,GAAMF,GAAO,GAAKE,GAAMF,GAAO,EAAG,OAAOE,GAAMF,GAAO,EAAI,GAEhE,CAMM,SAAUG,GAAWJ,EAAW,CACpC,GAAI,OAAOA,GAAQ,SAAU,MAAM,IAAI,MAAM,4BAA8B,OAAOA,CAAG,EAErF,GAAIN,GAAe,OAAO,WAAW,QAAQM,CAAG,EAChD,IAAMK,EAAKL,EAAI,OACTM,EAAKD,EAAK,EAChB,GAAIA,EAAK,EAAG,MAAM,IAAI,MAAM,mDAAqDA,CAAE,EACnF,IAAME,EAAQ,IAAI,WAAWD,CAAE,EAC/B,QAASE,EAAK,EAAGC,EAAK,EAAGD,EAAKF,EAAIE,IAAMC,GAAM,EAAG,CAC/C,IAAMC,EAAKR,GAAcF,EAAI,WAAWS,CAAE,CAAC,EACrCE,EAAKT,GAAcF,EAAI,WAAWS,EAAK,CAAC,CAAC,EAC/C,GAAIC,IAAO,QAAaC,IAAO,OAAW,CACxC,IAAMC,EAAOZ,EAAIS,CAAE,EAAIT,EAAIS,EAAK,CAAC,EACjC,MAAM,IAAI,MAAM,+CAAiDG,EAAO,cAAgBH,CAAE,CAC5F,CACAF,EAAMC,CAAE,EAAIE,EAAK,GAAKC,CACxB,CACA,OAAOJ,CACT,CAkCM,SAAUM,GAAYC,EAAW,CACrC,GAAI,OAAOA,GAAQ,SAAU,MAAM,IAAI,MAAM,iBAAiB,EAC9D,OAAO,IAAI,WAAW,IAAI,YAAW,EAAG,OAAOA,CAAG,CAAC,CACrD,CAiBM,SAAUC,GAAQC,EAAW,CACjC,OAAI,OAAOA,GAAS,WAAUA,EAAOC,GAAYD,CAAI,GACrDE,GAAOF,CAAI,EACJA,CACT,CAQM,SAAUG,GAAgBH,EAAc,CAC5C,OAAI,OAAOA,GAAS,WAAUA,EAAOC,GAAYD,CAAI,GACrDE,GAAOF,CAAI,EACJA,CACT,CAGM,SAAUI,KAAeC,EAAoB,CACjD,IAAIC,EAAM,EACV,QAASC,EAAI,EAAGA,EAAIF,EAAO,OAAQE,IAAK,CACtC,IAAMC,EAAIH,EAAOE,CAAC,EAClBL,GAAOM,CAAC,EACRF,GAAOE,EAAE,MACX,CACA,IAAMC,EAAM,IAAI,WAAWH,CAAG,EAC9B,QAASC,EAAI,EAAGG,EAAM,EAAGH,EAAIF,EAAO,OAAQE,IAAK,CAC/C,IAAMC,EAAIH,EAAOE,CAAC,EAClBE,EAAI,IAAID,EAAGE,CAAG,EACdA,GAAOF,EAAE,MACX,CACA,OAAOC,CACT,CAGM,SAAUE,GACdC,EACAC,EAAS,CAET,GAAIA,IAAS,QAAa,CAAA,EAAG,SAAS,KAAKA,CAAI,IAAM,kBACnD,MAAM,IAAI,MAAM,uCAAuC,EAEzD,OADe,OAAO,OAAOD,EAAUC,CAAI,CAE7C,CAWM,IAAgBC,GAAhB,KAAoB,GA4CpB,SAAUC,GACdC,EAAuB,CAOvB,IAAMC,EAASC,GAA2BF,EAAQ,EAAG,OAAOjB,GAAQmB,CAAG,CAAC,EAAE,OAAM,EAC1EC,EAAMH,EAAQ,EACpB,OAAAC,EAAM,UAAYE,EAAI,UACtBF,EAAM,SAAWE,EAAI,SACrBF,EAAM,OAAS,IAAMD,EAAQ,EACtBC,CACT,CAsCM,SAAUG,GAAYC,EAAc,GAAE,CAC1C,GAAIC,IAAU,OAAOA,GAAO,iBAAoB,WAC9C,OAAOA,GAAO,gBAAgB,IAAI,WAAWD,CAAW,CAAC,EAG3D,GAAIC,IAAU,OAAOA,GAAO,aAAgB,WAC1C,OAAO,WAAW,KAAKA,GAAO,YAAYD,CAAW,CAAC,EAExD,MAAM,IAAI,MAAM,wCAAwC,CAC1D,CCnYM,SAAUE,GACdC,EACAC,EACAC,EACAC,EAAa,CAEb,GAAI,OAAOH,EAAK,cAAiB,WAAY,OAAOA,EAAK,aAAaC,EAAYC,EAAOC,CAAI,EAC7F,IAAMC,EAAO,OAAO,EAAE,EAChBC,EAAW,OAAO,UAAU,EAC5BC,EAAK,OAAQJ,GAASE,EAAQC,CAAQ,EACtCE,EAAK,OAAOL,EAAQG,CAAQ,EAC5BG,EAAIL,EAAO,EAAI,EACfM,EAAIN,EAAO,EAAI,EACrBH,EAAK,UAAUC,EAAaO,EAAGF,EAAIH,CAAI,EACvCH,EAAK,UAAUC,EAAaQ,EAAGF,EAAIJ,CAAI,CACzC,CAGM,SAAUO,GAAIC,EAAWC,EAAWC,EAAS,CACjD,OAAQF,EAAIC,EAAM,CAACD,EAAIE,CACzB,CAGM,SAAUC,GAAIH,EAAWC,EAAWC,EAAS,CACjD,OAAQF,EAAIC,EAAMD,EAAIE,EAAMD,EAAIC,CAClC,CAMM,IAAgBE,GAAhB,cAAoDC,EAAO,CAoB/D,YAAYC,EAAkBC,EAAmBC,EAAmBhB,EAAa,CAC/E,MAAK,EANG,KAAA,SAAW,GACX,KAAA,OAAS,EACT,KAAA,IAAM,EACN,KAAA,UAAY,GAIpB,KAAK,SAAWc,EAChB,KAAK,UAAYC,EACjB,KAAK,UAAYC,EACjB,KAAK,KAAOhB,EACZ,KAAK,OAAS,IAAI,WAAWc,CAAQ,EACrC,KAAK,KAAOG,GAAW,KAAK,MAAM,CACpC,CACA,OAAOC,EAAW,CAChBC,GAAQ,IAAI,EACZD,EAAOE,GAAQF,CAAI,EACnBG,GAAOH,CAAI,EACX,GAAM,CAAE,KAAArB,EAAM,OAAAyB,EAAQ,SAAAR,CAAQ,EAAK,KAC7BS,EAAML,EAAK,OACjB,QAASM,EAAM,EAAGA,EAAMD,GAAO,CAC7B,IAAME,EAAO,KAAK,IAAIX,EAAW,KAAK,IAAKS,EAAMC,CAAG,EAEpD,GAAIC,IAASX,EAAU,CACrB,IAAMY,EAAWT,GAAWC,CAAI,EAChC,KAAOJ,GAAYS,EAAMC,EAAKA,GAAOV,EAAU,KAAK,QAAQY,EAAUF,CAAG,EACzE,QACF,CACAF,EAAO,IAAIJ,EAAK,SAASM,EAAKA,EAAMC,CAAI,EAAG,KAAK,GAAG,EACnD,KAAK,KAAOA,EACZD,GAAOC,EACH,KAAK,MAAQX,IACf,KAAK,QAAQjB,EAAM,CAAC,EACpB,KAAK,IAAM,EAEf,CACA,YAAK,QAAUqB,EAAK,OACpB,KAAK,WAAU,EACR,IACT,CACA,WAAWS,EAAe,CACxBR,GAAQ,IAAI,EACZS,GAAQD,EAAK,IAAI,EACjB,KAAK,SAAW,GAIhB,GAAM,CAAE,OAAAL,EAAQ,KAAAzB,EAAM,SAAAiB,EAAU,KAAAd,CAAI,EAAK,KACrC,CAAE,IAAAwB,CAAG,EAAK,KAEdF,EAAOE,GAAK,EAAI,IAChBK,GAAM,KAAK,OAAO,SAASL,CAAG,CAAC,EAG3B,KAAK,UAAYV,EAAWU,IAC9B,KAAK,QAAQ3B,EAAM,CAAC,EACpB2B,EAAM,GAGR,QAASM,EAAIN,EAAKM,EAAIhB,EAAUgB,IAAKR,EAAOQ,CAAC,EAAI,EAIjDlC,GAAaC,EAAMiB,EAAW,EAAG,OAAO,KAAK,OAAS,CAAC,EAAGd,CAAI,EAC9D,KAAK,QAAQH,EAAM,CAAC,EACpB,IAAMkC,EAAQd,GAAWU,CAAG,EACtBJ,EAAM,KAAK,UAEjB,GAAIA,EAAM,EAAG,MAAM,IAAI,MAAM,6CAA6C,EAC1E,IAAMS,EAAST,EAAM,EACfU,EAAQ,KAAK,IAAG,EACtB,GAAID,EAASC,EAAM,OAAQ,MAAM,IAAI,MAAM,oCAAoC,EAC/E,QAASH,EAAI,EAAGA,EAAIE,EAAQF,IAAKC,EAAM,UAAU,EAAID,EAAGG,EAAMH,CAAC,EAAG9B,CAAI,CACxE,CACA,QAAM,CACJ,GAAM,CAAE,OAAAsB,EAAQ,UAAAP,CAAS,EAAK,KAC9B,KAAK,WAAWO,CAAM,EACtB,IAAMY,EAAMZ,EAAO,MAAM,EAAGP,CAAS,EACrC,YAAK,QAAO,EACLmB,CACT,CACA,WAAWC,EAAM,CACfA,IAAAA,EAAO,IAAK,KAAK,aACjBA,EAAG,IAAI,GAAG,KAAK,IAAG,CAAE,EACpB,GAAM,CAAE,SAAArB,EAAU,OAAAQ,EAAQ,OAAAc,EAAQ,SAAAC,EAAU,UAAAC,EAAW,IAAAd,CAAG,EAAK,KAC/D,OAAAW,EAAG,UAAYG,EACfH,EAAG,SAAWE,EACdF,EAAG,OAASC,EACZD,EAAG,IAAMX,EACLY,EAAStB,GAAUqB,EAAG,OAAO,IAAIb,CAAM,EACpCa,CACT,CACA,OAAK,CACH,OAAO,KAAK,WAAU,CACxB,GASWI,GAAyC,YAAY,KAAK,CACrE,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,UAAY,WACrF,EC9ID,IAAMC,GAA2B,YAAY,KAAK,CAChD,WAAY,WAAY,WAAY,WAAY,UAAY,WAAY,WAAY,WACpF,WAAY,UAAY,UAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,UAAY,UAAY,UAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,UAAY,UACpF,UAAY,UAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,UACpF,UAAY,UAAY,UAAY,UAAY,UAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACrF,EAGKC,GAA2B,IAAI,YAAY,EAAE,EACtCC,GAAP,cAAsBC,EAAc,CAYxC,YAAYC,EAAoB,GAAE,CAChC,MAAM,GAAIA,EAAW,EAAG,EAAK,EAVrB,KAAA,EAAYC,GAAU,CAAC,EAAI,EAC3B,KAAA,EAAYA,GAAU,CAAC,EAAI,EAC3B,KAAA,EAAYA,GAAU,CAAC,EAAI,EAC3B,KAAA,EAAYA,GAAU,CAAC,EAAI,EAC3B,KAAA,EAAYA,GAAU,CAAC,EAAI,EAC3B,KAAA,EAAYA,GAAU,CAAC,EAAI,EAC3B,KAAA,EAAYA,GAAU,CAAC,EAAI,EAC3B,KAAA,EAAYA,GAAU,CAAC,EAAI,CAIrC,CACU,KAAG,CACX,GAAM,CAAE,EAAAC,EAAG,EAAAC,EAAG,EAAAC,EAAG,EAAAC,EAAG,EAAAC,EAAG,EAAAC,EAAG,EAAAC,EAAG,EAAAC,CAAC,EAAK,KACnC,MAAO,CAACP,EAAGC,EAAGC,EAAGC,EAAGC,EAAGC,EAAGC,EAAGC,CAAC,CAChC,CAEU,IACRP,EAAWC,EAAWC,EAAWC,EAAWC,EAAWC,EAAWC,EAAWC,EAAS,CAEtF,KAAK,EAAIP,EAAI,EACb,KAAK,EAAIC,EAAI,EACb,KAAK,EAAIC,EAAI,EACb,KAAK,EAAIC,EAAI,EACb,KAAK,EAAIC,EAAI,EACb,KAAK,EAAIC,EAAI,EACb,KAAK,EAAIC,EAAI,EACb,KAAK,EAAIC,EAAI,CACf,CACU,QAAQC,EAAgBC,EAAc,CAE9C,QAASC,EAAI,EAAGA,EAAI,GAAIA,IAAKD,GAAU,EAAGd,GAASe,CAAC,EAAIF,EAAK,UAAUC,EAAQ,EAAK,EACpF,QAASC,EAAI,GAAIA,EAAI,GAAIA,IAAK,CAC5B,IAAMC,EAAMhB,GAASe,EAAI,EAAE,EACrBE,EAAKjB,GAASe,EAAI,CAAC,EACnBG,EAAKC,GAAKH,EAAK,CAAC,EAAIG,GAAKH,EAAK,EAAE,EAAKA,IAAQ,EAC7CI,EAAKD,GAAKF,EAAI,EAAE,EAAIE,GAAKF,EAAI,EAAE,EAAKA,IAAO,GACjDjB,GAASe,CAAC,EAAKK,EAAKpB,GAASe,EAAI,CAAC,EAAIG,EAAKlB,GAASe,EAAI,EAAE,EAAK,CACjE,CAEA,GAAI,CAAE,EAAAV,EAAG,EAAAC,EAAG,EAAAC,EAAG,EAAAC,EAAG,EAAAC,EAAG,EAAAC,EAAG,EAAAC,EAAG,EAAAC,CAAC,EAAK,KACjC,QAASG,EAAI,EAAGA,EAAI,GAAIA,IAAK,CAC3B,IAAMM,EAASF,GAAKV,EAAG,CAAC,EAAIU,GAAKV,EAAG,EAAE,EAAIU,GAAKV,EAAG,EAAE,EAC9Ca,EAAMV,EAAIS,EAASE,GAAId,EAAGC,EAAGC,CAAC,EAAIZ,GAASgB,CAAC,EAAIf,GAASe,CAAC,EAAK,EAE/DS,GADSL,GAAKd,EAAG,CAAC,EAAIc,GAAKd,EAAG,EAAE,EAAIc,GAAKd,EAAG,EAAE,GAC/BoB,GAAIpB,EAAGC,EAAGC,CAAC,EAAK,EACrCK,EAAID,EACJA,EAAID,EACJA,EAAID,EACJA,EAAKD,EAAIc,EAAM,EACfd,EAAID,EACJA,EAAID,EACJA,EAAID,EACJA,EAAKiB,EAAKE,EAAM,CAClB,CAEAnB,EAAKA,EAAI,KAAK,EAAK,EACnBC,EAAKA,EAAI,KAAK,EAAK,EACnBC,EAAKA,EAAI,KAAK,EAAK,EACnBC,EAAKA,EAAI,KAAK,EAAK,EACnBC,EAAKA,EAAI,KAAK,EAAK,EACnBC,EAAKA,EAAI,KAAK,EAAK,EACnBC,EAAKA,EAAI,KAAK,EAAK,EACnBC,EAAKA,EAAI,KAAK,EAAK,EACnB,KAAK,IAAIP,EAAGC,EAAGC,EAAGC,EAAGC,EAAGC,EAAGC,EAAGC,CAAC,CACjC,CACU,YAAU,CAClBc,GAAM1B,EAAQ,CAChB,CACA,SAAO,CACL,KAAK,IAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAC,EAC/B0B,GAAM,KAAK,MAAM,CACnB,GAuRK,IAAMC,GAAgCC,GAAa,IAAM,IAAIC,EAAQ,ECzXtE,IAAOC,GAAP,cAAuCC,EAAa,CAQxD,YAAYC,EAAaC,EAAW,CAClC,MAAK,EAJC,KAAA,SAAW,GACX,KAAA,UAAY,GAIlBC,GAAMF,CAAI,EACV,IAAMG,EAAMC,GAAQH,CAAI,EAExB,GADA,KAAK,MAAQD,EAAK,OAAM,EACpB,OAAO,KAAK,MAAM,QAAW,WAC/B,MAAM,IAAI,MAAM,qDAAqD,EACvE,KAAK,SAAW,KAAK,MAAM,SAC3B,KAAK,UAAY,KAAK,MAAM,UAC5B,IAAMK,EAAW,KAAK,SAChBC,EAAM,IAAI,WAAWD,CAAQ,EAEnCC,EAAI,IAAIH,EAAI,OAASE,EAAWL,EAAK,OAAM,EAAG,OAAOG,CAAG,EAAE,OAAM,EAAKA,CAAG,EACxE,QAASI,EAAI,EAAGA,EAAID,EAAI,OAAQC,IAAKD,EAAIC,CAAC,GAAK,GAC/C,KAAK,MAAM,OAAOD,CAAG,EAErB,KAAK,MAAQN,EAAK,OAAM,EAExB,QAASO,EAAI,EAAGA,EAAID,EAAI,OAAQC,IAAKD,EAAIC,CAAC,GAAK,IAC/C,KAAK,MAAM,OAAOD,CAAG,EACrBE,GAAMF,CAAG,CACX,CACA,OAAOG,EAAU,CACf,OAAAC,GAAQ,IAAI,EACZ,KAAK,MAAM,OAAOD,CAAG,EACd,IACT,CACA,WAAWE,EAAe,CACxBD,GAAQ,IAAI,EACZE,GAAOD,EAAK,KAAK,SAAS,EAC1B,KAAK,SAAW,GAChB,KAAK,MAAM,WAAWA,CAAG,EACzB,KAAK,MAAM,OAAOA,CAAG,EACrB,KAAK,MAAM,WAAWA,CAAG,EACzB,KAAK,QAAO,CACd,CACA,QAAM,CACJ,IAAMA,EAAM,IAAI,WAAW,KAAK,MAAM,SAAS,EAC/C,YAAK,WAAWA,CAAG,EACZA,CACT,CACA,WAAWE,EAAY,CAErBA,IAAAA,EAAO,OAAO,OAAO,OAAO,eAAe,IAAI,EAAG,CAAA,CAAE,GACpD,GAAM,CAAE,MAAAC,EAAO,MAAAC,EAAO,SAAAC,EAAU,UAAAC,EAAW,SAAAZ,EAAU,UAAAa,CAAS,EAAK,KACnE,OAAAL,EAAKA,EACLA,EAAG,SAAWG,EACdH,EAAG,UAAYI,EACfJ,EAAG,SAAWR,EACdQ,EAAG,UAAYK,EACfL,EAAG,MAAQC,EAAM,WAAWD,EAAG,KAAK,EACpCA,EAAG,MAAQE,EAAM,WAAWF,EAAG,KAAK,EAC7BA,CACT,CACA,OAAK,CACH,OAAO,KAAK,WAAU,CACxB,CACA,SAAO,CACL,KAAK,UAAY,GACjB,KAAK,MAAM,QAAO,EAClB,KAAK,MAAM,QAAO,CACpB,GAaWM,GAGT,CAACnB,EAAaG,EAAYiB,IAC5B,IAAItB,GAAUE,EAAMG,CAAG,EAAE,OAAOiB,CAAO,EAAE,OAAM,EACjDD,GAAK,OAAS,CAACnB,EAAaG,IAAe,IAAIL,GAAUE,EAAMG,CAAG,ECtElE,IAAMkB,GAAsB,OAAO,CAAC,EAC9BC,GAAsB,OAAO,CAAC,EAgB9B,SAAUC,GAAQC,EAAgBC,EAAgB,GAAE,CACxD,GAAI,OAAOD,GAAU,UAAW,CAC9B,IAAME,EAASD,GAAS,IAAIA,CAAK,IACjC,MAAM,IAAI,MAAMC,EAAS,8BAAgC,OAAOF,CAAK,CACvE,CACA,OAAOA,CACT,CAIM,SAAUG,GAASH,EAAmBI,EAAiBH,EAAgB,GAAE,CAC7E,IAAMI,EAAQC,GAASN,CAAK,EACtBO,EAAMP,GAAO,OACbQ,EAAWJ,IAAW,OAC5B,GAAI,CAACC,GAAUG,GAAYD,IAAQH,EAAS,CAC1C,IAAMF,EAASD,GAAS,IAAIA,CAAK,KAC3BQ,EAAQD,EAAW,cAAcJ,CAAM,GAAK,GAC5CM,EAAML,EAAQ,UAAUE,CAAG,GAAK,QAAQ,OAAOP,CAAK,GAC1D,MAAM,IAAI,MAAME,EAAS,sBAAwBO,EAAQ,SAAWC,CAAG,CACzE,CACA,OAAOV,CACT,CAGM,SAAUW,GAAoBC,EAAoB,CACtD,IAAMC,EAAMD,EAAI,SAAS,EAAE,EAC3B,OAAOC,EAAI,OAAS,EAAI,IAAMA,EAAMA,CACtC,CAEM,SAAUC,GAAYD,EAAW,CACrC,GAAI,OAAOA,GAAQ,SAAU,MAAM,IAAI,MAAM,4BAA8B,OAAOA,CAAG,EACrF,OAAOA,IAAQ,GAAKE,GAAM,OAAO,KAAOF,CAAG,CAC7C,CAGM,SAAUG,GAAgBX,EAAiB,CAC/C,OAAOS,GAAYG,GAAYZ,CAAK,CAAC,CACvC,CACM,SAAUa,GAAgBb,EAAiB,CAC/C,OAAAc,GAAQd,CAAK,EACNS,GAAYG,GAAY,WAAW,KAAKZ,CAAK,EAAE,QAAO,CAAE,CAAC,CAClE,CAEM,SAAUe,GAAgBC,EAAoBd,EAAW,CAC7D,OAAOe,GAAYD,EAAE,SAAS,EAAE,EAAE,SAASd,EAAM,EAAG,GAAG,CAAC,CAC1D,CACM,SAAUgB,GAAgBF,EAAoBd,EAAW,CAC7D,OAAOa,GAAgBC,EAAGd,CAAG,EAAE,QAAO,CACxC,CAeM,SAAUiB,EAAYC,EAAeC,EAAUC,EAAuB,CAC1E,IAAIC,EACJ,GAAI,OAAOF,GAAQ,SACjB,GAAI,CACFE,EAAMC,GAAYH,CAAG,CACvB,OAASI,EAAG,CACV,MAAM,IAAI,MAAML,EAAQ,6CAA+CK,CAAC,CAC1E,SACSC,GAASL,CAAG,EAGrBE,EAAM,WAAW,KAAKF,CAAG,MAEzB,OAAM,IAAI,MAAMD,EAAQ,mCAAmC,EAE7D,IAAMO,EAAMJ,EAAI,OAChB,GAAI,OAAOD,GAAmB,UAAYK,IAAQL,EAChD,MAAM,IAAI,MAAMF,EAAQ,cAAgBE,EAAiB,kBAAoBK,CAAG,EAClF,OAAOJ,CACT,CA6CA,IAAMK,GAAYC,GAAc,OAAOA,GAAM,UAAYC,IAAOD,EAE1D,SAAUE,GAAQF,EAAWG,EAAaC,EAAW,CACzD,OAAOL,GAASC,CAAC,GAAKD,GAASI,CAAG,GAAKJ,GAASK,CAAG,GAAKD,GAAOH,GAAKA,EAAII,CAC1E,CAOM,SAAUC,GAASC,EAAeN,EAAWG,EAAaC,EAAW,CAMzE,GAAI,CAACF,GAAQF,EAAGG,EAAKC,CAAG,EACtB,MAAM,IAAI,MAAM,kBAAoBE,EAAQ,KAAOH,EAAM,WAAaC,EAAM,SAAWJ,CAAC,CAC5F,CASM,SAAUO,GAAOP,EAAS,CAC9B,IAAIQ,EACJ,IAAKA,EAAM,EAAGR,EAAIC,GAAKD,IAAMS,GAAKD,GAAO,EAAE,CAC3C,OAAOA,CACT,CAsBO,IAAME,GAAWC,IAAuBC,IAAO,OAAOD,CAAC,GAAKC,GAY7D,SAAUC,GACdC,EACAC,EACAC,EAAkE,CAElE,GAAI,OAAOF,GAAY,UAAYA,EAAU,EAAG,MAAM,IAAI,MAAM,0BAA0B,EAC1F,GAAI,OAAOC,GAAa,UAAYA,EAAW,EAAG,MAAM,IAAI,MAAM,2BAA2B,EAC7F,GAAI,OAAOC,GAAW,WAAY,MAAM,IAAI,MAAM,2BAA2B,EAE7E,IAAMC,EAAOC,GAAgB,IAAI,WAAWA,CAAG,EACzCC,EAAQC,GAAiB,WAAW,GAAGA,CAAI,EAC7CC,EAAIJ,EAAIH,CAAO,EACfQ,EAAIL,EAAIH,CAAO,EACfS,EAAI,EACFC,EAAQ,IAAK,CACjBH,EAAE,KAAK,CAAC,EACRC,EAAE,KAAK,CAAC,EACRC,EAAI,CACN,EACME,EAAI,IAAIC,IAAoBV,EAAOM,EAAGD,EAAG,GAAGK,CAAC,EAC7CC,EAAS,CAACC,EAAOX,EAAI,CAAC,IAAK,CAE/BK,EAAIG,EAAEN,EAAK,CAAI,EAAGS,CAAI,EACtBP,EAAII,EAAC,EACDG,EAAK,SAAW,IACpBN,EAAIG,EAAEN,EAAK,CAAI,EAAGS,CAAI,EACtBP,EAAII,EAAC,EACP,EACMI,EAAM,IAAK,CAEf,GAAIN,KAAO,IAAM,MAAM,IAAI,MAAM,yBAAyB,EAC1D,IAAIL,EAAM,EACJY,EAAoB,CAAA,EAC1B,KAAOZ,EAAMH,GAAU,CACrBM,EAAII,EAAC,EACL,IAAMM,EAAKV,EAAE,MAAK,EAClBS,EAAI,KAAKC,CAAE,EACXb,GAAOG,EAAE,MACX,CACA,OAAOW,EAAa,GAAGF,CAAG,CAC5B,EASA,MARiB,CAACF,EAAkBK,IAAoB,CACtDT,EAAK,EACLG,EAAOC,CAAI,EACX,IAAIM,EACJ,KAAO,EAAEA,EAAMD,EAAKJ,EAAG,CAAE,IAAIF,EAAM,EACnC,OAAAH,EAAK,EACEU,CACT,CAEF,CAoDM,SAAUC,GACdC,EACAC,EACAC,EAAoC,CAAA,EAAE,CAEtC,GAAI,CAACF,GAAU,OAAOA,GAAW,SAAU,MAAM,IAAI,MAAM,+BAA+B,EAE1F,SAASG,EAAWC,EAAiBC,EAAsBC,EAAc,CACvE,IAAMC,EAAMP,EAAOI,CAAS,EAC5B,GAAIE,GAASC,IAAQ,OAAW,OAChC,IAAMC,EAAU,OAAOD,EACvB,GAAIC,IAAYH,GAAgBE,IAAQ,KACtC,MAAM,IAAI,MAAM,UAAUH,CAAS,0BAA0BC,CAAY,SAASG,CAAO,EAAE,CAC/F,CACA,OAAO,QAAQP,CAAM,EAAE,QAAQ,CAAC,CAACQ,EAAGC,CAAC,IAAMP,EAAWM,EAAGC,EAAG,EAAK,CAAC,EAClE,OAAO,QAAQR,CAAS,EAAE,QAAQ,CAAC,CAACO,EAAGC,CAAC,IAAMP,EAAWM,EAAGC,EAAG,EAAI,CAAC,CACtE,CAaM,SAAUC,GACdC,EAA6B,CAE7B,IAAMC,EAAM,IAAI,QAChB,MAAO,CAACC,KAAWC,IAAc,CAC/B,IAAMC,EAAMH,EAAI,IAAIC,CAAG,EACvB,GAAIE,IAAQ,OAAW,OAAOA,EAC9B,IAAMC,EAAWL,EAAGE,EAAK,GAAGC,CAAI,EAChC,OAAAF,EAAI,IAAIC,EAAKG,CAAQ,EACdA,CACT,CACF,CCpWA,IAAMC,GAAM,OAAO,CAAC,EAAGC,GAAM,OAAO,CAAC,EAAGC,GAAsB,OAAO,CAAC,EAAGC,GAAsB,OAAO,CAAC,EAEjGC,GAAsB,OAAO,CAAC,EAAGC,GAAsB,OAAO,CAAC,EAAGC,GAAsB,OAAO,CAAC,EAEhGC,GAAsB,OAAO,CAAC,EAAGC,GAAsB,OAAO,CAAC,EAAGC,GAAuB,OAAO,EAAE,EAGlG,SAAUC,GAAIC,EAAWC,EAAS,CACtC,IAAMC,EAASF,EAAIC,EACnB,OAAOC,GAAUb,GAAMa,EAASD,EAAIC,CACtC,CAYM,SAAUC,GAAKC,EAAWC,EAAeC,EAAc,CAC3D,IAAIC,EAAMH,EACV,KAAOC,KAAUG,IACfD,GAAOA,EACPA,GAAOD,EAET,OAAOC,CACT,CAMM,SAAUE,GAAOC,EAAgBJ,EAAc,CACnD,GAAII,IAAWF,GAAK,MAAM,IAAI,MAAM,kCAAkC,EACtE,GAAIF,GAAUE,GAAK,MAAM,IAAI,MAAM,0CAA4CF,CAAM,EAErF,IAAIK,EAAIC,GAAIF,EAAQJ,CAAM,EACtBO,EAAIP,EAEJF,EAAII,GAAKM,EAAIC,GAAKC,EAAID,GAAKE,EAAIT,GACnC,KAAOG,IAAMH,IAAK,CAEhB,IAAMU,EAAIL,EAAIF,EACRQ,EAAIN,EAAIF,EACRS,EAAIhB,EAAIY,EAAIE,EACZG,EAAIP,EAAIG,EAAIC,EAElBL,EAAIF,EAAGA,EAAIQ,EAAGf,EAAIY,EAAGF,EAAIG,EAAGD,EAAII,EAAGH,EAAII,CACzC,CAEA,GADYR,IACAE,GAAK,MAAM,IAAI,MAAM,wBAAwB,EACzD,OAAOH,GAAIR,EAAGE,CAAM,CACtB,CAEA,SAASgB,GAAkBC,EAAeC,EAASH,EAAI,CACrD,GAAI,CAACE,EAAG,IAAIA,EAAG,IAAIC,CAAI,EAAGH,CAAC,EAAG,MAAM,IAAI,MAAM,yBAAyB,CACzE,CAMA,SAASI,GAAaF,EAAeF,EAAI,CACvC,IAAMK,GAAUH,EAAG,MAAQR,IAAOY,GAC5BH,EAAOD,EAAG,IAAIF,EAAGK,CAAM,EAC7B,OAAAJ,GAAeC,EAAIC,EAAMH,CAAC,EACnBG,CACT,CAEA,SAASI,GAAaL,EAAeF,EAAI,CACvC,IAAMQ,GAAUN,EAAG,MAAQO,IAAOC,GAC5BC,EAAKT,EAAG,IAAIF,EAAGY,EAAG,EAClBhB,EAAIM,EAAG,IAAIS,EAAIH,CAAM,EACrBK,EAAKX,EAAG,IAAIF,EAAGJ,CAAC,EAChBkB,EAAIZ,EAAG,IAAIA,EAAG,IAAIW,EAAID,EAAG,EAAGhB,CAAC,EAC7BO,EAAOD,EAAG,IAAIW,EAAIX,EAAG,IAAIY,EAAGZ,EAAG,GAAG,CAAC,EACzC,OAAAD,GAAeC,EAAIC,EAAMH,CAAC,EACnBG,CACT,CAIA,SAASY,GAAWC,EAAS,CAC3B,IAAMC,EAAMC,GAAMF,CAAC,EACbG,EAAKC,GAAcJ,CAAC,EACpBK,EAAKF,EAAGF,EAAKA,EAAI,IAAIA,EAAI,GAAG,CAAC,EAC7BK,EAAKH,EAAGF,EAAKI,CAAE,EACfE,EAAKJ,EAAGF,EAAKA,EAAI,IAAII,CAAE,CAAC,EACxBG,GAAMR,EAAIS,IAAOC,GACvB,MAAO,CAAIxB,EAAeF,IAAQ,CAChC,IAAI2B,EAAMzB,EAAG,IAAIF,EAAGwB,CAAE,EAClBI,EAAM1B,EAAG,IAAIyB,EAAKN,CAAE,EAClBQ,EAAM3B,EAAG,IAAIyB,EAAKL,CAAE,EACpBQ,EAAM5B,EAAG,IAAIyB,EAAKJ,CAAE,EACpBQ,EAAK7B,EAAG,IAAIA,EAAG,IAAI0B,CAAG,EAAG5B,CAAC,EAC1BgC,EAAK9B,EAAG,IAAIA,EAAG,IAAI2B,CAAG,EAAG7B,CAAC,EAChC2B,EAAMzB,EAAG,KAAKyB,EAAKC,EAAKG,CAAE,EAC1BH,EAAM1B,EAAG,KAAK4B,EAAKD,EAAKG,CAAE,EAC1B,IAAMC,EAAK/B,EAAG,IAAIA,EAAG,IAAI0B,CAAG,EAAG5B,CAAC,EAC1BG,EAAOD,EAAG,KAAKyB,EAAKC,EAAKK,CAAE,EACjC,OAAAhC,GAAeC,EAAIC,EAAMH,CAAC,EACnBG,CACT,CACF,CASM,SAAUiB,GAAcJ,EAAS,CAGrC,GAAIA,EAAIkB,GAAK,MAAM,IAAI,MAAM,qCAAqC,EAElE,IAAIC,EAAInB,EAAItB,GACR0C,EAAI,EACR,KAAOD,EAAIvB,KAAQzB,IACjBgD,GAAKvB,GACLwB,IAIF,IAAIC,EAAIzB,GACF0B,EAAMpB,GAAMF,CAAC,EACnB,KAAOuB,GAAWD,EAAKD,CAAC,IAAM,GAG5B,GAAIA,IAAM,IAAM,MAAM,IAAI,MAAM,+CAA+C,EAGjF,GAAID,IAAM,EAAG,OAAOhC,GAIpB,IAAIoC,EAAKF,EAAI,IAAID,EAAGF,CAAC,EACfM,GAAUN,EAAIzC,IAAOkB,GAC3B,OAAO,SAAwBV,EAAeF,EAAI,CAChD,GAAIE,EAAG,IAAIF,CAAC,EAAG,OAAOA,EAEtB,GAAIuC,GAAWrC,EAAIF,CAAC,IAAM,EAAG,MAAM,IAAI,MAAM,yBAAyB,EAGtE,IAAI0C,EAAIN,EACJO,EAAIzC,EAAG,IAAIA,EAAG,IAAKsC,CAAE,EACrBI,EAAI1C,EAAG,IAAIF,EAAGmC,CAAC,EACfU,EAAI3C,EAAG,IAAIF,EAAGyC,CAAM,EAIxB,KAAO,CAACvC,EAAG,IAAI0C,EAAG1C,EAAG,GAAG,GAAG,CACzB,GAAIA,EAAG,IAAI0C,CAAC,EAAG,OAAO1C,EAAG,KACzB,IAAIY,EAAI,EAGJgC,EAAQ5C,EAAG,IAAI0C,CAAC,EACpB,KAAO,CAAC1C,EAAG,IAAI4C,EAAO5C,EAAG,GAAG,GAG1B,GAFAY,IACAgC,EAAQ5C,EAAG,IAAI4C,CAAK,EAChBhC,IAAM4B,EAAG,MAAM,IAAI,MAAM,yBAAyB,EAIxD,IAAMK,EAAWrD,IAAO,OAAOgD,EAAI5B,EAAI,CAAC,EAClCtB,EAAIU,EAAG,IAAIyC,EAAGI,CAAQ,EAG5BL,EAAI5B,EACJ6B,EAAIzC,EAAG,IAAIV,CAAC,EACZoD,EAAI1C,EAAG,IAAI0C,EAAGD,CAAC,EACfE,EAAI3C,EAAG,IAAI2C,EAAGrD,CAAC,CACjB,CACA,OAAOqD,CACT,CACF,CAaM,SAAUG,GAAOhC,EAAS,CAE9B,OAAIA,EAAIV,KAAQ4B,GAAY9B,GAExBY,EAAIN,KAAQD,GAAYF,GAExBS,EAAIU,KAASuB,GAAYlC,GAAWC,CAAC,EAElCI,GAAcJ,CAAC,CACxB,CAmDA,IAAMkC,GAAe,CACnB,SAAU,UAAW,MAAO,MAAO,MAAO,OAAQ,MAClD,MAAO,MAAO,MAAO,MAAO,MAAO,MACnC,OAAQ,OAAQ,OAAQ,QAEpB,SAAUC,GAAiBC,EAAgB,CAC/C,IAAMC,EAAU,CACd,MAAO,SACP,KAAM,SACN,MAAO,SACP,KAAM,UAEFC,EAAOJ,GAAa,OAAO,CAACK,EAAKC,KACrCD,EAAIC,CAAG,EAAI,WACJD,GACNF,CAAO,EACV,OAAAI,GAAgBL,EAAOE,CAAI,EAIpBF,CACT,CAQM,SAAUM,GAASC,EAAeC,EAAQC,EAAa,CAC3D,GAAIA,EAAQC,GAAK,MAAM,IAAI,MAAM,yCAAyC,EAC1E,GAAID,IAAUC,GAAK,OAAOH,EAAG,IAC7B,GAAIE,IAAUE,GAAK,OAAOH,EAC1B,IAAII,EAAIL,EAAG,IACPM,EAAIL,EACR,KAAOC,EAAQC,IACTD,EAAQE,KAAKC,EAAIL,EAAG,IAAIK,EAAGC,CAAC,GAChCA,EAAIN,EAAG,IAAIM,CAAC,EACZJ,IAAUE,GAEZ,OAAOC,CACT,CAOM,SAAUE,GAAiBP,EAAeQ,EAAWC,EAAW,GAAK,CACzE,IAAMC,EAAW,IAAI,MAAMF,EAAK,MAAM,EAAE,KAAKC,EAAWT,EAAG,KAAO,MAAS,EAErEW,EAAgBH,EAAK,OAAO,CAACI,EAAKX,EAAKY,IACvCb,EAAG,IAAIC,CAAG,EAAUW,GACxBF,EAASG,CAAC,EAAID,EACPZ,EAAG,IAAIY,EAAKX,CAAG,GACrBD,EAAG,GAAG,EAEHc,EAAcd,EAAG,IAAIW,CAAa,EAExC,OAAAH,EAAK,YAAY,CAACI,EAAKX,EAAKY,IACtBb,EAAG,IAAIC,CAAG,EAAUW,GACxBF,EAASG,CAAC,EAAIb,EAAG,IAAIY,EAAKF,EAASG,CAAC,CAAC,EAC9Bb,EAAG,IAAIY,EAAKX,CAAG,GACrBa,CAAW,EACPJ,CACT,CAgBM,SAAUK,GAAcC,EAAeC,EAAI,CAG/C,IAAMC,GAAUF,EAAG,MAAQG,IAAOC,GAC5BC,EAAUL,EAAG,IAAIC,EAAGC,CAAM,EAC1BI,EAAMN,EAAG,IAAIK,EAASL,EAAG,GAAG,EAC5BO,EAAOP,EAAG,IAAIK,EAASL,EAAG,IAAI,EAC9BQ,EAAKR,EAAG,IAAIK,EAASL,EAAG,IAAIA,EAAG,GAAG,CAAC,EACzC,GAAI,CAACM,GAAO,CAACC,GAAQ,CAACC,EAAI,MAAM,IAAI,MAAM,gCAAgC,EAC1E,OAAOF,EAAM,EAAIC,EAAO,EAAI,EAC9B,CAUM,SAAUE,GAAQC,EAAWC,EAAmB,CAEhDA,IAAe,QAAWC,GAAQD,CAAU,EAChD,IAAME,EAAcF,IAAe,OAAYA,EAAaD,EAAE,SAAS,CAAC,EAAE,OACpEI,EAAc,KAAK,KAAKD,EAAc,CAAC,EAC7C,MAAO,CAAE,WAAYA,EAAa,YAAAC,CAAW,CAC/C,CA8BM,SAAUC,GACdC,EACAC,EACAC,EAAO,GACPC,EAA0B,CAAA,EAAE,CAE5B,GAAIH,GAASI,GAAK,MAAM,IAAI,MAAM,0CAA4CJ,CAAK,EACnF,IAAIK,EACAC,EACAC,EAAwB,GACxBC,EACJ,GAAI,OAAOP,GAAiB,UAAYA,GAAgB,KAAM,CAC5D,GAAIE,EAAK,MAAQD,EAAM,MAAM,IAAI,MAAM,sCAAsC,EAC7E,IAAMO,EAAQR,EACVQ,EAAM,OAAMJ,EAAcI,EAAM,MAChCA,EAAM,OAAMH,EAAQG,EAAM,MAC1B,OAAOA,EAAM,MAAS,YAAWP,EAAOO,EAAM,MAC9C,OAAOA,EAAM,cAAiB,YAAWF,EAAeE,EAAM,cAClED,EAAiBC,EAAM,cACzB,MACM,OAAOR,GAAiB,WAAUI,EAAcJ,GAChDE,EAAK,OAAMG,EAAQH,EAAK,MAE9B,GAAM,CAAE,WAAYO,EAAM,YAAaC,CAAK,EAAKlB,GAAQO,EAAOK,CAAW,EAC3E,GAAIM,EAAQ,KAAM,MAAM,IAAI,MAAM,gDAAgD,EAClF,IAAIC,EACEC,EAAuB,OAAO,OAAO,CACzC,MAAAb,EACA,KAAAE,EACA,KAAAQ,EACA,MAAAC,EACA,KAAMG,GAAQJ,CAAI,EAClB,KAAMN,GACN,IAAKW,GACL,eAAgBP,EAChB,OAASQ,GAAQC,GAAID,EAAKhB,CAAK,EAC/B,QAAUgB,GAAO,CACf,GAAI,OAAOA,GAAQ,SACjB,MAAM,IAAI,MAAM,+CAAiD,OAAOA,CAAG,EAC7E,OAAOZ,IAAOY,GAAOA,EAAMhB,CAC7B,EACA,IAAMgB,GAAQA,IAAQZ,GAEtB,YAAcY,GAAgB,CAACH,EAAE,IAAIG,CAAG,GAAKH,EAAE,QAAQG,CAAG,EAC1D,MAAQA,IAASA,EAAMD,MAASA,GAChC,IAAMC,GAAQC,GAAI,CAACD,EAAKhB,CAAK,EAC7B,IAAK,CAACkB,EAAKC,IAAQD,IAAQC,EAE3B,IAAMH,GAAQC,GAAID,EAAMA,EAAKhB,CAAK,EAClC,IAAK,CAACkB,EAAKC,IAAQF,GAAIC,EAAMC,EAAKnB,CAAK,EACvC,IAAK,CAACkB,EAAKC,IAAQF,GAAIC,EAAMC,EAAKnB,CAAK,EACvC,IAAK,CAACkB,EAAKC,IAAQF,GAAIC,EAAMC,EAAKnB,CAAK,EACvC,IAAK,CAACgB,EAAKI,IAAUC,GAAMR,EAAGG,EAAKI,CAAK,EACxC,IAAK,CAACF,EAAKC,IAAQF,GAAIC,EAAMI,GAAOH,EAAKnB,CAAK,EAAGA,CAAK,EAGtD,KAAOgB,GAAQA,EAAMA,EACrB,KAAM,CAACE,EAAKC,IAAQD,EAAMC,EAC1B,KAAM,CAACD,EAAKC,IAAQD,EAAMC,EAC1B,KAAM,CAACD,EAAKC,IAAQD,EAAMC,EAE1B,IAAMH,GAAQM,GAAON,EAAKhB,CAAK,EAC/B,KACEM,IACEZ,IACKkB,IAAOA,EAAQW,GAAOvB,CAAK,GACzBY,EAAMC,EAAGnB,CAAC,IAErB,QAAUsB,GAASd,EAAOsB,GAAgBR,EAAKL,CAAK,EAAIc,GAAgBT,EAAKL,CAAK,EAClF,UAAW,CAACe,EAAOC,EAAiB,KAAQ,CAC1C,GAAInB,EAAgB,CAClB,GAAI,CAACA,EAAe,SAASkB,EAAM,MAAM,GAAKA,EAAM,OAASf,EAC3D,MAAM,IAAI,MACR,6BAA+BH,EAAiB,eAAiBkB,EAAM,MAAM,EAGjF,IAAME,EAAS,IAAI,WAAWjB,CAAK,EAEnCiB,EAAO,IAAIF,EAAOxB,EAAO,EAAI0B,EAAO,OAASF,EAAM,MAAM,EACzDA,EAAQE,CACV,CACA,GAAIF,EAAM,SAAWf,EACnB,MAAM,IAAI,MAAM,6BAA+BA,EAAQ,eAAiBe,EAAM,MAAM,EACtF,IAAIG,EAAS3B,EAAO4B,GAAgBJ,CAAK,EAAIK,GAAgBL,CAAK,EAElE,GADInB,IAAcsB,EAASZ,GAAIY,EAAQ7B,CAAK,GACxC,CAAC2B,GACC,CAACd,EAAE,QAAQgB,CAAM,EAAG,MAAM,IAAI,MAAM,kDAAkD,EAG5F,OAAOA,CACT,EAEA,YAAcG,GAAQC,GAAcpB,EAAGmB,CAAG,EAG1C,KAAM,CAACE,EAAGC,EAAGC,IAAOA,EAAID,EAAID,EAClB,EACZ,OAAO,OAAO,OAAOrB,CAAC,CACxB,CAwDM,SAAUwB,GAAoBC,EAAkB,CACpD,GAAI,OAAOA,GAAe,SAAU,MAAM,IAAI,MAAM,4BAA4B,EAChF,IAAMC,EAAYD,EAAW,SAAS,CAAC,EAAE,OACzC,OAAO,KAAK,KAAKC,EAAY,CAAC,CAChC,CASM,SAAUC,GAAiBF,EAAkB,CACjD,IAAMG,EAASJ,GAAoBC,CAAU,EAC7C,OAAOG,EAAS,KAAK,KAAKA,EAAS,CAAC,CACtC,CAeM,SAAUC,GAAeC,EAAiBL,EAAoBM,EAAO,GAAK,CAC9E,IAAMC,EAAMF,EAAI,OACVG,EAAWT,GAAoBC,CAAU,EACzCS,EAASP,GAAiBF,CAAU,EAE1C,GAAIO,EAAM,IAAMA,EAAME,GAAUF,EAAM,KACpC,MAAM,IAAI,MAAM,YAAcE,EAAS,6BAA+BF,CAAG,EAC3E,IAAMG,EAAMJ,EAAOK,GAAgBN,CAAG,EAAIO,GAAgBP,CAAG,EAEvDQ,EAAUC,GAAIJ,EAAKV,EAAae,EAAG,EAAIA,GAC7C,OAAOT,EAAOU,GAAgBH,EAASL,CAAQ,EAAIS,GAAgBJ,EAASL,CAAQ,CACtF,CCnlBA,IAAMU,GAAM,OAAO,CAAC,EACdC,GAAM,OAAO,CAAC,EA0Id,SAAUC,GAAwCC,EAAoBC,EAAO,CACjF,IAAMC,EAAMD,EAAK,OAAM,EACvB,OAAOD,EAAYE,EAAMD,CAC3B,CAQM,SAAUE,GACdC,EACAC,EAAW,CAEX,IAAMC,EAAaC,GACjBH,EAAE,GACFC,EAAO,IAAKG,GAAMA,EAAE,CAAE,CAAC,EAEzB,OAAOH,EAAO,IAAI,CAACG,EAAGC,IAAML,EAAE,WAAWI,EAAE,SAASF,EAAWG,CAAC,CAAC,CAAC,CAAC,CACrE,CAEA,SAASC,GAAUC,EAAWC,EAAY,CACxC,GAAI,CAAC,OAAO,cAAcD,CAAC,GAAKA,GAAK,GAAKA,EAAIC,EAC5C,MAAM,IAAI,MAAM,qCAAuCA,EAAO,YAAcD,CAAC,CACjF,CAWA,SAASE,GAAUF,EAAWG,EAAkB,CAC9CJ,GAAUC,EAAGG,CAAU,EACvB,IAAMC,EAAU,KAAK,KAAKD,EAAaH,CAAC,EAAI,EACtCK,EAAa,IAAML,EAAI,GACvBM,EAAY,GAAKN,EACjBO,EAAOC,GAAQR,CAAC,EAChBS,EAAU,OAAOT,CAAC,EACxB,MAAO,CAAE,QAAAI,EAAS,WAAAC,EAAY,KAAAE,EAAM,UAAAD,EAAW,QAAAG,CAAO,CACxD,CAEA,SAASC,GAAYC,EAAWC,EAAgBC,EAAY,CAC1D,GAAM,CAAE,WAAAR,EAAY,KAAAE,EAAM,UAAAD,EAAW,QAAAG,CAAO,EAAKI,EAC7CC,EAAQ,OAAOH,EAAIJ,CAAI,EACvBQ,EAAQJ,GAAKF,EAQbK,EAAQT,IAEVS,GAASR,EACTS,GAAS5B,IAEX,IAAM6B,EAAcJ,EAASP,EACvBY,EAASD,EAAc,KAAK,IAAIF,CAAK,EAAI,EACzCI,EAASJ,IAAU,EACnBK,EAAQL,EAAQ,EAChBM,EAASR,EAAS,IAAM,EAE9B,MAAO,CAAE,MAAAG,EAAO,OAAAE,EAAQ,OAAAC,EAAQ,MAAAC,EAAO,OAAAC,EAAQ,QAD/BJ,CACsC,CACxD,CAEA,SAASK,GAAkB3B,EAAeD,EAAM,CAC9C,GAAI,CAAC,MAAM,QAAQC,CAAM,EAAG,MAAM,IAAI,MAAM,gBAAgB,EAC5DA,EAAO,QAAQ,CAACG,EAAGC,IAAK,CACtB,GAAI,EAAED,aAAaJ,GAAI,MAAM,IAAI,MAAM,0BAA4BK,CAAC,CACtE,CAAC,CACH,CACA,SAASwB,GAAmBC,EAAgBC,EAAU,CACpD,GAAI,CAAC,MAAM,QAAQD,CAAO,EAAG,MAAM,IAAI,MAAM,2BAA2B,EACxEA,EAAQ,QAAQ,CAACE,EAAG3B,IAAK,CACvB,GAAI,CAAC0B,EAAM,QAAQC,CAAC,EAAG,MAAM,IAAI,MAAM,2BAA6B3B,CAAC,CACvE,CAAC,CACH,CAKA,IAAM4B,GAAmB,IAAI,QACvBC,GAAmB,IAAI,QAE7B,SAASC,GAAKC,EAAM,CAGlB,OAAOF,GAAiB,IAAIE,CAAC,GAAK,CACpC,CAEA,SAASC,GAAQnB,EAAS,CACxB,GAAIA,IAAMzB,GAAK,MAAM,IAAI,MAAM,cAAc,CAC/C,CAoBM,IAAO6C,GAAP,KAAW,CAOf,YAAYC,EAAW/B,EAAY,CACjC,KAAK,KAAO+B,EAAM,KAClB,KAAK,KAAOA,EAAM,KAClB,KAAK,GAAKA,EAAM,GAChB,KAAK,KAAO/B,CACd,CAGA,cAAcgC,EAAetB,EAAWd,EAAc,KAAK,KAAI,CAC7D,IAAIqC,EAAcD,EAClB,KAAOtB,EAAIzB,IACLyB,EAAIxB,KAAKU,EAAIA,EAAE,IAAIqC,CAAC,GACxBA,EAAIA,EAAE,OAAM,EACZvB,IAAMxB,GAER,OAAOU,CACT,CAcQ,iBAAiBsC,EAAiBnC,EAAS,CACjD,GAAM,CAAE,QAAAI,EAAS,WAAAC,CAAU,EAAKH,GAAUF,EAAG,KAAK,IAAI,EAChDN,EAAqB,CAAA,EACvBG,EAAcsC,EACdC,EAAOvC,EACX,QAASe,EAAS,EAAGA,EAASR,EAASQ,IAAU,CAC/CwB,EAAOvC,EACPH,EAAO,KAAK0C,CAAI,EAEhB,QAAStC,EAAI,EAAGA,EAAIO,EAAYP,IAC9BsC,EAAOA,EAAK,IAAIvC,CAAC,EACjBH,EAAO,KAAK0C,CAAI,EAElBvC,EAAIuC,EAAK,OAAM,CACjB,CACA,OAAO1C,CACT,CAQQ,KAAKM,EAAWqC,EAAyB,EAAS,CAExD,GAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,EAAG,MAAM,IAAI,MAAM,gBAAgB,EAEzD,IAAIxC,EAAI,KAAK,KACTyC,EAAI,KAAK,KAMPC,EAAKrC,GAAUF,EAAG,KAAK,IAAI,EACjC,QAASY,EAAS,EAAGA,EAAS2B,EAAG,QAAS3B,IAAU,CAElD,GAAM,CAAE,MAAAG,EAAO,OAAAE,EAAQ,OAAAC,EAAQ,MAAAC,EAAO,OAAAC,EAAQ,QAAAoB,CAAO,EAAK9B,GAAY,EAAGE,EAAQ2B,CAAE,EACnF,EAAIxB,EACAG,EAGFoB,EAAIA,EAAE,IAAIlD,GAASgC,EAAQiB,EAAYG,CAAO,CAAC,CAAC,EAGhD3C,EAAIA,EAAE,IAAIT,GAAS+B,EAAOkB,EAAYpB,CAAM,CAAC,CAAC,CAElD,CACA,OAAAa,GAAQ,CAAC,EAIF,CAAE,EAAAjC,EAAG,EAAAyC,CAAC,CACf,CAOQ,WACNtC,EACAqC,EACA,EACAI,EAAgB,KAAK,KAAI,CAEzB,IAAMF,EAAKrC,GAAUF,EAAG,KAAK,IAAI,EACjC,QAASY,EAAS,EAAGA,EAAS2B,EAAG,SAC3B,IAAMrD,GAD8B0B,IAAU,CAElD,GAAM,CAAE,MAAAG,EAAO,OAAAE,EAAQ,OAAAC,EAAQ,MAAAC,CAAK,EAAKT,GAAY,EAAGE,EAAQ2B,CAAE,EAElE,GADA,EAAIxB,EACA,CAAAG,EAIG,CACL,IAAM5B,EAAO+C,EAAYpB,CAAM,EAC/BwB,EAAMA,EAAI,IAAItB,EAAQ7B,EAAK,OAAM,EAAKA,CAAI,CAC5C,CACF,CACA,OAAAwC,GAAQ,CAAC,EACFW,CACT,CAEQ,eAAezC,EAAWmC,EAAiBO,EAA4B,CAE7E,IAAIC,EAAOjB,GAAiB,IAAIS,CAAK,EACrC,OAAKQ,IACHA,EAAO,KAAK,iBAAiBR,EAAOnC,CAAC,EACjCA,IAAM,IAEJ,OAAO0C,GAAc,aAAYC,EAAOD,EAAUC,CAAI,GAC1DjB,GAAiB,IAAIS,EAAOQ,CAAI,IAG7BA,CACT,CAEA,OACER,EACAS,EACAF,EAA4B,CAE5B,IAAM1C,EAAI4B,GAAKO,CAAK,EACpB,OAAO,KAAK,KAAKnC,EAAG,KAAK,eAAeA,EAAGmC,EAAOO,CAAS,EAAGE,CAAM,CACtE,CAEA,OAAOT,EAAiBS,EAAgBF,EAA8BG,EAAe,CACnF,IAAM7C,EAAI4B,GAAKO,CAAK,EACpB,OAAInC,IAAM,EAAU,KAAK,cAAcmC,EAAOS,EAAQC,CAAI,EACnD,KAAK,WAAW7C,EAAG,KAAK,eAAeA,EAAGmC,EAAOO,CAAS,EAAGE,EAAQC,CAAI,CAClF,CAKA,YAAYhB,EAAa7B,EAAS,CAChCD,GAAUC,EAAG,KAAK,IAAI,EACtB2B,GAAiB,IAAIE,EAAG7B,CAAC,EACzB0B,GAAiB,OAAOG,CAAC,CAC3B,CAEA,SAASI,EAAa,CACpB,OAAOL,GAAKK,CAAG,IAAM,CACvB,GAOI,SAAUa,GACdd,EACAG,EACAY,EACAC,EAAU,CAEV,IAAIP,EAAMN,EACNc,EAAKjB,EAAM,KACXkB,EAAKlB,EAAM,KACf,KAAOe,EAAK7D,IAAO8D,EAAK9D,IAClB6D,EAAK5D,KAAK8D,EAAKA,EAAG,IAAIR,CAAG,GACzBO,EAAK7D,KAAK+D,EAAKA,EAAG,IAAIT,CAAG,GAC7BA,EAAMA,EAAI,OAAM,EAChBM,IAAO5D,GACP6D,IAAO7D,GAET,MAAO,CAAE,GAAA8D,EAAI,GAAAC,CAAE,CACjB,CAYM,SAAUC,GACd1D,EACA2D,EACA1D,EACA6B,EAAiB,CAQjBF,GAAkB3B,EAAQD,CAAC,EAC3B6B,GAAmBC,EAAS6B,CAAM,EAClC,IAAMC,EAAU3D,EAAO,OACjB4D,EAAU/B,EAAQ,OACxB,GAAI8B,IAAYC,EAAS,MAAM,IAAI,MAAM,qDAAqD,EAE9F,IAAMC,EAAO9D,EAAE,KACTqB,EAAQ0C,GAAO,OAAOH,CAAO,CAAC,EAChChD,EAAa,EACbS,EAAQ,GAAIT,EAAaS,EAAQ,EAC5BA,EAAQ,EAAGT,EAAaS,EAAQ,EAChCA,EAAQ,IAAGT,EAAa,GACjC,IAAMoD,EAAOjD,GAAQH,CAAU,EACzBqD,EAAU,IAAI,MAAM,OAAOD,CAAI,EAAI,CAAC,EAAE,KAAKF,CAAI,EAC/CI,EAAW,KAAK,OAAOP,EAAO,KAAO,GAAK/C,CAAU,EAAIA,EAC1DuD,EAAML,EACV,QAASzD,EAAI6D,EAAU7D,GAAK,EAAGA,GAAKO,EAAY,CAC9CqD,EAAQ,KAAKH,CAAI,EACjB,QAASM,EAAI,EAAGA,EAAIP,EAASO,IAAK,CAChC,IAAMjB,EAASrB,EAAQsC,CAAC,EAClB/C,EAAQ,OAAQ8B,GAAU,OAAO9C,CAAC,EAAK2D,CAAI,EACjDC,EAAQ5C,CAAK,EAAI4C,EAAQ5C,CAAK,EAAE,IAAIpB,EAAOmE,CAAC,CAAC,CAC/C,CACA,IAAIC,EAAOP,EAEX,QAASM,EAAIH,EAAQ,OAAS,EAAGK,EAAOR,EAAMM,EAAI,EAAGA,IACnDE,EAAOA,EAAK,IAAIL,EAAQG,CAAC,CAAC,EAC1BC,EAAOA,EAAK,IAAIC,CAAI,EAGtB,GADAH,EAAMA,EAAI,IAAIE,CAAI,EACdhE,IAAM,EAAG,QAAS+D,EAAI,EAAGA,EAAIxD,EAAYwD,IAAKD,EAAMA,EAAI,OAAM,CACpE,CACA,OAAOA,CACT,CAkJA,SAASI,GAAeC,EAAeC,EAAmBC,EAAc,CACtE,GAAID,EAAO,CACT,GAAIA,EAAM,QAAUD,EAAO,MAAM,IAAI,MAAM,gDAAgD,EAC3F,OAAAG,GAAcF,CAAK,EACZA,CACT,KACE,QAAOG,GAAMJ,EAAO,CAAE,KAAAE,CAAI,CAAE,CAEhC,CAIM,SAAUG,GACdC,EACAC,EACAC,EAA8B,CAAA,EAC9BC,EAAgB,CAGhB,GADIA,IAAW,SAAWA,EAASH,IAAS,WACxC,CAACC,GAAS,OAAOA,GAAU,SAAU,MAAM,IAAI,MAAM,kBAAkBD,CAAI,eAAe,EAC9F,QAAWI,IAAK,CAAC,IAAK,IAAK,GAAG,EAAY,CACxC,IAAMC,EAAMJ,EAAMG,CAAC,EACnB,GAAI,EAAE,OAAOC,GAAQ,UAAYA,EAAMC,IACrC,MAAM,IAAI,MAAM,SAASF,CAAC,0BAA0B,CACxD,CACA,IAAMG,EAAKd,GAAYQ,EAAM,EAAGC,EAAU,GAAIC,CAAM,EAC9CK,EAAKf,GAAYQ,EAAM,EAAGC,EAAU,GAAIC,CAAM,EAE9CM,EAAS,CAAC,KAAM,KAAM,IADNT,IAAS,cAAgB,IAAM,GAClB,EACnC,QAAWI,KAAKK,EAEd,GAAI,CAACF,EAAG,QAAQN,EAAMG,CAAC,CAAC,EACtB,MAAM,IAAI,MAAM,SAASA,CAAC,0CAA0C,EAExE,OAAAH,EAAQ,OAAO,OAAO,OAAO,OAAO,CAAA,EAAIA,CAAK,CAAC,EACvC,CAAE,MAAAA,EAAO,GAAAM,EAAI,GAAAC,CAAE,CACxB,CCtkBA,IAAME,GAAa,CAACC,EAAaC,KAAiBD,GAAOA,GAAO,EAAIC,EAAM,CAACA,GAAOC,IAAOD,EAOnF,SAAUE,GAAiBC,EAAWC,EAAkBC,EAAS,CAIrE,GAAM,CAAC,CAACC,EAAIC,CAAE,EAAG,CAACC,EAAIC,CAAE,CAAC,EAAIL,EACvBM,EAAKZ,GAAWW,EAAKN,EAAGE,CAAC,EACzBM,EAAKb,GAAW,CAACS,EAAKJ,EAAGE,CAAC,EAG5BO,EAAKT,EAAIO,EAAKJ,EAAKK,EAAKH,EACxBK,EAAK,CAACH,EAAKH,EAAKI,EAAKF,EACnBK,EAAQF,EAAKG,GACbC,EAAQH,EAAKE,GACfD,IAAOF,EAAK,CAACA,GACbI,IAAOH,EAAK,CAACA,GAGjB,IAAMI,EAAUC,GAAQ,KAAK,KAAKC,GAAOd,CAAC,EAAI,CAAC,CAAC,EAAIe,GACpD,GAAIR,EAAKG,IAAOH,GAAMK,GAAWJ,EAAKE,IAAOF,GAAMI,EACjD,MAAM,IAAI,MAAM,yCAA2Cd,CAAC,EAE9D,MAAO,CAAE,MAAAW,EAAO,GAAAF,EAAI,MAAAI,EAAO,GAAAH,CAAE,CAC/B,CAkBA,SAASQ,GAAkBC,EAAc,CACvC,GAAI,CAAC,CAAC,UAAW,YAAa,KAAK,EAAE,SAASA,CAAM,EAClD,MAAM,IAAI,MAAM,2DAA2D,EAC7E,OAAOA,CACT,CAEA,SAASC,GACPC,EACAC,EAAM,CAEN,IAAMC,EAAuB,CAAA,EAC7B,QAASC,KAAW,OAAO,KAAKF,CAAG,EAEjCC,EAAMC,CAAO,EAAIH,EAAKG,CAAO,IAAM,OAAYF,EAAIE,CAAO,EAAIH,EAAKG,CAAO,EAE5E,OAAAC,GAAMF,EAAM,KAAO,MAAM,EACzBE,GAAMF,EAAM,QAAU,SAAS,EAC3BA,EAAM,SAAW,QAAWL,GAAkBK,EAAM,MAAM,EACvDA,CACT,CAmJM,IAAOG,GAAP,cAAsB,KAAK,CAC/B,YAAYC,EAAI,GAAE,CAChB,MAAMA,CAAC,CACT,GA6BWC,GAAY,CAEvB,IAAKF,GAEL,KAAM,CACJ,OAAQ,CAACG,EAAaC,IAAwB,CAC5C,GAAM,CAAE,IAAKC,CAAC,EAAKH,GACnB,GAAIC,EAAM,GAAKA,EAAM,IAAK,MAAM,IAAIE,EAAE,uBAAuB,EAC7D,GAAID,EAAK,OAAS,EAAG,MAAM,IAAIC,EAAE,2BAA2B,EAC5D,IAAMC,EAAUF,EAAK,OAAS,EACxBG,EAAMC,GAAoBF,CAAO,EACvC,GAAKC,EAAI,OAAS,EAAK,IAAa,MAAM,IAAIF,EAAE,sCAAsC,EAEtF,IAAMI,EAASH,EAAU,IAAME,GAAqBD,EAAI,OAAS,EAAK,GAAW,EAAI,GAErF,OADUC,GAAoBL,CAAG,EACtBM,EAASF,EAAMH,CAC5B,EAEA,OAAOD,EAAaC,EAAgB,CAClC,GAAM,CAAE,IAAKC,CAAC,EAAKH,GACfQ,EAAM,EACV,GAAIP,EAAM,GAAKA,EAAM,IAAK,MAAM,IAAIE,EAAE,uBAAuB,EAC7D,GAAID,EAAK,OAAS,GAAKA,EAAKM,GAAK,IAAMP,EAAK,MAAM,IAAIE,EAAE,uBAAuB,EAC/E,IAAMM,EAAQP,EAAKM,GAAK,EAClBE,EAAS,CAAC,EAAED,EAAQ,KACtBE,EAAS,EACb,GAAI,CAACD,EAAQC,EAASF,MACjB,CAEH,IAAMF,EAASE,EAAQ,IACvB,GAAI,CAACF,EAAQ,MAAM,IAAIJ,EAAE,mDAAmD,EAC5E,GAAII,EAAS,EAAG,MAAM,IAAIJ,EAAE,0CAA0C,EACtE,IAAMS,EAAcV,EAAK,SAASM,EAAKA,EAAMD,CAAM,EACnD,GAAIK,EAAY,SAAWL,EAAQ,MAAM,IAAIJ,EAAE,uCAAuC,EACtF,GAAIS,EAAY,CAAC,IAAM,EAAG,MAAM,IAAIT,EAAE,sCAAsC,EAC5E,QAAWU,KAAKD,EAAaD,EAAUA,GAAU,EAAKE,EAEtD,GADAL,GAAOD,EACHI,EAAS,IAAK,MAAM,IAAIR,EAAE,wCAAwC,CACxE,CACA,IAAMW,EAAIZ,EAAK,SAASM,EAAKA,EAAMG,CAAM,EACzC,GAAIG,EAAE,SAAWH,EAAQ,MAAM,IAAIR,EAAE,gCAAgC,EACrE,MAAO,CAAE,EAAAW,EAAG,EAAGZ,EAAK,SAASM,EAAMG,CAAM,CAAC,CAC5C,GAMF,KAAM,CACJ,OAAO3C,EAAW,CAChB,GAAM,CAAE,IAAKmC,CAAC,EAAKH,GACnB,GAAIhC,EAAMgB,GAAK,MAAM,IAAImB,EAAE,4CAA4C,EACvE,IAAIY,EAAMT,GAAoBtC,CAAG,EAGjC,GADI,OAAO,SAAS+C,EAAI,CAAC,EAAG,EAAE,EAAI,IAAQA,EAAM,KAAOA,GACnDA,EAAI,OAAS,EAAG,MAAM,IAAIZ,EAAE,gDAAgD,EAChF,OAAOY,CACT,EACA,OAAOb,EAAgB,CACrB,GAAM,CAAE,IAAKC,CAAC,EAAKH,GACnB,GAAIE,EAAK,CAAC,EAAI,IAAa,MAAM,IAAIC,EAAE,qCAAqC,EAC5E,GAAID,EAAK,CAAC,IAAM,GAAQ,EAAEA,EAAK,CAAC,EAAI,KAClC,MAAM,IAAIC,EAAE,qDAAqD,EACnE,OAAOa,GAAgBd,CAAI,CAC7B,GAEF,MAAMa,EAAwB,CAE5B,GAAM,CAAE,IAAKZ,EAAG,KAAMc,EAAK,KAAMC,CAAG,EAAKlB,GACnCE,EAAOiB,EAAY,YAAaJ,CAAG,EACnC,CAAE,EAAGK,EAAU,EAAGC,CAAY,EAAKH,EAAI,OAAO,GAAMhB,CAAI,EAC9D,GAAImB,EAAa,OAAQ,MAAM,IAAIlB,EAAE,6CAA6C,EAClF,GAAM,CAAE,EAAGmB,EAAQ,EAAGC,CAAU,EAAKL,EAAI,OAAO,EAAME,CAAQ,EACxD,CAAE,EAAGI,EAAQ,EAAGC,CAAU,EAAKP,EAAI,OAAO,EAAMK,CAAU,EAChE,GAAIE,EAAW,OAAQ,MAAM,IAAItB,EAAE,6CAA6C,EAChF,MAAO,CAAE,EAAGc,EAAI,OAAOK,CAAM,EAAG,EAAGL,EAAI,OAAOO,CAAM,CAAC,CACvD,EACA,WAAWE,EAA6B,CACtC,GAAM,CAAE,KAAMR,EAAK,KAAMD,CAAG,EAAKjB,GAC3B2B,EAAKT,EAAI,OAAO,EAAMD,EAAI,OAAOS,EAAI,CAAC,CAAC,EACvCE,EAAKV,EAAI,OAAO,EAAMD,EAAI,OAAOS,EAAI,CAAC,CAAC,EACvCG,EAAMF,EAAKC,EACjB,OAAOV,EAAI,OAAO,GAAMW,CAAG,CAC7B,GAKI7C,GAAM,OAAO,CAAC,EAAGK,GAAM,OAAO,CAAC,EAAGnB,GAAM,OAAO,CAAC,EAAG4D,GAAM,OAAO,CAAC,EAAGC,GAAM,OAAO,CAAC,EAElF,SAAUC,GAAeC,EAAoBC,EAAY,CAC7D,GAAM,CAAE,MAAOC,CAAQ,EAAKF,EACxBjE,EACJ,GAAI,OAAOkE,GAAQ,SACjBlE,EAAMkE,MACD,CACL,IAAIE,EAAQjB,EAAY,cAAee,CAAG,EAC1C,GAAI,CACFlE,EAAMiE,EAAG,UAAUG,CAAK,CAC1B,MAAgB,CACd,MAAM,IAAI,MAAM,8CAA8CD,CAAQ,SAAS,OAAOD,CAAG,EAAE,CAC7F,CACF,CACA,GAAI,CAACD,EAAG,YAAYjE,CAAG,EAAG,MAAM,IAAI,MAAM,4CAA4C,EACtF,OAAOA,CACT,CAmBM,SAAUqE,GACdC,EACAC,EAAqC,CAAA,EAAE,CAEvC,IAAMC,EAAYC,GAAmB,cAAeH,EAAQC,CAAS,EAC/D,CAAE,GAAAG,EAAI,GAAAT,CAAE,EAAKO,EACfG,EAAQH,EAAU,MAChB,CAAE,EAAGI,EAAU,EAAGC,CAAW,EAAKF,EACxCG,GACEP,EACA,CAAA,EACA,CACE,mBAAoB,UACpB,cAAe,WACf,cAAe,WACf,UAAW,WACX,QAAS,WACT,KAAM,SACN,eAAgB,UACjB,EAGH,GAAM,CAAE,KAAAQ,CAAI,EAAKR,EACjB,GAAIQ,IAEE,CAACL,EAAG,IAAIC,EAAM,CAAC,GAAK,OAAOI,EAAK,MAAS,UAAY,CAAC,MAAM,QAAQA,EAAK,OAAO,GAClF,MAAM,IAAI,MAAM,4DAA4D,EAIhF,IAAMC,EAAUC,GAAYP,EAAIT,CAAE,EAElC,SAASiB,GAA4B,CACnC,GAAI,CAACR,EAAG,MAAO,MAAM,IAAI,MAAM,4DAA4D,CAC7F,CAGA,SAASS,EACPC,EACAC,EACAC,EAAqB,CAErB,GAAM,CAAE,EAAAC,EAAG,EAAAC,CAAC,EAAKH,EAAM,SAAQ,EACzBI,EAAKf,EAAG,QAAQa,CAAC,EAEvB,GADA1D,GAAMyD,EAAc,cAAc,EAC9BA,EAAc,CAChBJ,EAA4B,EAC5B,IAAMQ,EAAW,CAAChB,EAAG,MAAOc,CAAC,EAC7B,OAAOG,EAAYC,GAAQF,CAAQ,EAAGD,CAAE,CAC1C,KACE,QAAOE,EAAY,WAAW,GAAG,CAAI,EAAGF,EAAIf,EAAG,QAAQc,CAAC,CAAC,CAE7D,CACA,SAASK,EAAezB,EAAiB,CACvC0B,GAAO1B,EAAO,OAAW,OAAO,EAChC,GAAM,CAAE,UAAW2B,EAAM,sBAAuBC,CAAM,EAAKhB,EACrDrC,EAASyB,EAAM,OACf6B,EAAO7B,EAAM,CAAC,EACd8B,EAAO9B,EAAM,SAAS,CAAC,EAE7B,GAAIzB,IAAWoD,IAASE,IAAS,GAAQA,IAAS,GAAO,CACvD,IAAMV,EAAIb,EAAG,UAAUwB,CAAI,EAC3B,GAAI,CAACxB,EAAG,QAAQa,CAAC,EAAG,MAAM,IAAI,MAAM,qCAAqC,EACzE,IAAMY,EAAKC,EAAoBb,CAAC,EAC5BC,EACJ,GAAI,CACFA,EAAId,EAAG,KAAKyB,CAAE,CAChB,OAASE,EAAW,CAClB,IAAMC,EAAMD,aAAqB,MAAQ,KAAOA,EAAU,QAAU,GACpE,MAAM,IAAI,MAAM,yCAA2CC,CAAG,CAChE,CACApB,EAA4B,EAC5B,IAAMqB,EAAS7B,EAAG,MAAOc,CAAC,EAE1B,OADmBS,EAAO,KAAO,IACfM,IAAQf,EAAId,EAAG,IAAIc,CAAC,GAC/B,CAAE,EAAAD,EAAG,EAAAC,CAAC,CACf,SAAW7C,IAAWqD,GAAUC,IAAS,EAAM,CAE7C,IAAMO,EAAI9B,EAAG,MACPa,EAAIb,EAAG,UAAUwB,EAAK,SAAS,EAAGM,CAAC,CAAC,EACpChB,EAAId,EAAG,UAAUwB,EAAK,SAASM,EAAGA,EAAI,CAAC,CAAC,EAC9C,GAAI,CAACC,EAAUlB,EAAGC,CAAC,EAAG,MAAM,IAAI,MAAM,4BAA4B,EAClE,MAAO,CAAE,EAAAD,EAAG,EAAAC,CAAC,CACf,KACE,OAAM,IAAI,MACR,yBAAyB7C,CAAM,yBAAyBoD,CAAI,oBAAoBC,CAAM,EAAE,CAG9F,CAEA,IAAMU,EAAcnC,EAAU,SAAWY,EACnCwB,EAAcpC,EAAU,WAAasB,EAC3C,SAASO,EAAoBb,EAAI,CAC/B,IAAMqB,EAAKlC,EAAG,IAAIa,CAAC,EACbsB,EAAKnC,EAAG,IAAIkC,EAAIrB,CAAC,EACvB,OAAOb,EAAG,IAAIA,EAAG,IAAImC,EAAInC,EAAG,IAAIa,EAAGZ,EAAM,CAAC,CAAC,EAAGA,EAAM,CAAC,CACvD,CAIA,SAAS8B,EAAUlB,EAAMC,EAAI,CAC3B,IAAMsB,EAAOpC,EAAG,IAAIc,CAAC,EACfuB,EAAQX,EAAoBb,CAAC,EACnC,OAAOb,EAAG,IAAIoC,EAAMC,CAAK,CAC3B,CAIA,GAAI,CAACN,EAAU9B,EAAM,GAAIA,EAAM,EAAE,EAAG,MAAM,IAAI,MAAM,mCAAmC,EAIvF,IAAMqC,EAAOtC,EAAG,IAAIA,EAAG,IAAIC,EAAM,EAAGb,EAAG,EAAGC,EAAG,EACvCkD,EAAQvC,EAAG,IAAIA,EAAG,IAAIC,EAAM,CAAC,EAAG,OAAO,EAAE,CAAC,EAChD,GAAID,EAAG,IAAIA,EAAG,IAAIsC,EAAMC,CAAK,CAAC,EAAG,MAAM,IAAI,MAAM,0BAA0B,EAG3E,SAASC,EAAOC,EAAe7G,EAAM8G,EAAU,GAAK,CAClD,GAAI,CAAC1C,EAAG,QAAQpE,CAAC,GAAM8G,GAAW1C,EAAG,IAAIpE,CAAC,EAAI,MAAM,IAAI,MAAM,wBAAwB6G,CAAK,EAAE,EAC7F,OAAO7G,CACT,CAEA,SAAS+G,EAAUC,EAAc,CAC/B,GAAI,EAAEA,aAAiBC,GAAQ,MAAM,IAAI,MAAM,0BAA0B,CAC3E,CAEA,SAASC,EAAiBpH,EAAS,CACjC,GAAI,CAAC2E,GAAQ,CAACA,EAAK,QAAS,MAAM,IAAI,MAAM,SAAS,EACrD,OAAO5E,GAAiBC,EAAG2E,EAAK,QAASd,EAAG,KAAK,CACnD,CAOA,IAAMwD,EAAeC,GAAS,CAACC,EAAUC,IAA0B,CACjE,GAAM,CAAE,EAAAC,EAAG,EAAAC,EAAG,EAAAC,CAAC,EAAKJ,EAEpB,GAAIjD,EAAG,IAAIqD,EAAGrD,EAAG,GAAG,EAAG,MAAO,CAAE,EAAGmD,EAAG,EAAGC,CAAC,EAC1C,IAAME,EAAML,EAAE,IAAG,EAGbC,GAAM,OAAMA,EAAKI,EAAMtD,EAAG,IAAMA,EAAG,IAAIqD,CAAC,GAC5C,IAAMxC,EAAIb,EAAG,IAAImD,EAAGD,CAAE,EAChBpC,EAAId,EAAG,IAAIoD,EAAGF,CAAE,EAChBK,EAAKvD,EAAG,IAAIqD,EAAGH,CAAE,EACvB,GAAII,EAAK,MAAO,CAAE,EAAGtD,EAAG,KAAM,EAAGA,EAAG,IAAI,EACxC,GAAI,CAACA,EAAG,IAAIuD,EAAIvD,EAAG,GAAG,EAAG,MAAM,IAAI,MAAM,kBAAkB,EAC3D,MAAO,CAAE,EAAAa,EAAG,EAAAC,CAAC,CACf,CAAC,EAGK0C,EAAkBR,GAAUC,GAAY,CAC5C,GAAIA,EAAE,IAAG,EAAI,CAIX,GAAIpD,EAAU,oBAAsB,CAACG,EAAG,IAAIiD,EAAE,CAAC,EAAG,OAClD,MAAM,IAAI,MAAM,iBAAiB,CACnC,CAEA,GAAM,CAAE,EAAApC,EAAG,EAAAC,CAAC,EAAKmC,EAAE,SAAQ,EAC3B,GAAI,CAACjD,EAAG,QAAQa,CAAC,GAAK,CAACb,EAAG,QAAQc,CAAC,EAAG,MAAM,IAAI,MAAM,sCAAsC,EAC5F,GAAI,CAACiB,EAAUlB,EAAGC,CAAC,EAAG,MAAM,IAAI,MAAM,mCAAmC,EACzE,GAAI,CAACmC,EAAE,cAAa,EAAI,MAAM,IAAI,MAAM,wCAAwC,EAChF,MAAO,EACT,CAAC,EAED,SAASQ,EACPC,EACAC,EACAC,EACAvH,EACAE,EAAc,CAEd,OAAAqH,EAAM,IAAIf,EAAM7C,EAAG,IAAI4D,EAAI,EAAGF,CAAQ,EAAGE,EAAI,EAAGA,EAAI,CAAC,EACrDD,EAAME,GAASxH,EAAOsH,CAAG,EACzBC,EAAMC,GAAStH,EAAOqH,CAAG,EAClBD,EAAI,IAAIC,CAAG,CACpB,CAOA,MAAMf,CAAK,CAeT,YAAYM,EAAMC,EAAMC,EAAI,CAC1B,KAAK,EAAIb,EAAO,IAAKW,CAAC,EACtB,KAAK,EAAIX,EAAO,IAAKY,EAAG,EAAI,EAC5B,KAAK,EAAIZ,EAAO,IAAKa,CAAC,EACtB,OAAO,OAAO,IAAI,CACpB,CAEA,OAAO,OAAK,CACV,OAAOpD,CACT,CAGA,OAAO,WAAWgD,EAAiB,CACjC,GAAM,CAAE,EAAApC,EAAG,EAAAC,CAAC,EAAKmC,GAAK,CAAA,EACtB,GAAI,CAACA,GAAK,CAACjD,EAAG,QAAQa,CAAC,GAAK,CAACb,EAAG,QAAQc,CAAC,EAAG,MAAM,IAAI,MAAM,sBAAsB,EAClF,GAAImC,aAAaJ,EAAO,MAAM,IAAI,MAAM,8BAA8B,EAEtE,OAAI7C,EAAG,IAAIa,CAAC,GAAKb,EAAG,IAAIc,CAAC,EAAU+B,EAAM,KAClC,IAAIA,EAAMhC,EAAGC,EAAGd,EAAG,GAAG,CAC/B,CAEA,OAAO,UAAUN,EAAiB,CAChC,IAAMoE,EAAIjB,EAAM,WAAWZ,EAAYb,GAAO1B,EAAO,OAAW,OAAO,CAAC,CAAC,EACzE,OAAAoE,EAAE,eAAc,EACTA,CACT,CACA,OAAO,QAAQzF,EAAQ,CACrB,OAAOwE,EAAM,UAAUpE,EAAY,WAAYJ,CAAG,CAAC,CACrD,CAEA,IAAI,GAAC,CACH,OAAO,KAAK,SAAQ,EAAG,CACzB,CACA,IAAI,GAAC,CACH,OAAO,KAAK,SAAQ,EAAG,CACzB,CAQA,WAAW0F,EAAqB,EAAGC,EAAS,GAAI,CAC9C,OAAAC,EAAK,YAAY,KAAMF,CAAU,EAC5BC,GAAQ,KAAK,SAAS5E,EAAG,EACvB,IACT,CAIA,gBAAc,CACZoE,EAAgB,IAAI,CACtB,CAEA,UAAQ,CACN,GAAM,CAAE,EAAA1C,CAAC,EAAK,KAAK,SAAQ,EAC3B,GAAI,CAACd,EAAG,MAAO,MAAM,IAAI,MAAM,6BAA6B,EAC5D,MAAO,CAACA,EAAG,MAAMc,CAAC,CACpB,CAGA,OAAO8B,EAAY,CACjBD,EAAUC,CAAK,EACf,GAAM,CAAE,EAAGsB,EAAI,EAAGC,EAAI,EAAGC,CAAE,EAAK,KAC1B,CAAE,EAAGC,EAAI,EAAGC,EAAI,EAAGC,CAAE,EAAK3B,EAC1B4B,EAAKxE,EAAG,IAAIA,EAAG,IAAIkE,EAAIK,CAAE,EAAGvE,EAAG,IAAIqE,EAAID,CAAE,CAAC,EAC1CK,EAAKzE,EAAG,IAAIA,EAAG,IAAImE,EAAII,CAAE,EAAGvE,EAAG,IAAIsE,EAAIF,CAAE,CAAC,EAChD,OAAOI,GAAMC,CACf,CAGA,QAAM,CACJ,OAAO,IAAI5B,EAAM,KAAK,EAAG7C,EAAG,IAAI,KAAK,CAAC,EAAG,KAAK,CAAC,CACjD,CAMA,QAAM,CACJ,GAAM,CAAE,EAAA0E,EAAG,EAAAvG,CAAC,EAAK8B,EACX0E,EAAK3E,EAAG,IAAI7B,EAAGiB,EAAG,EAClB,CAAE,EAAG8E,EAAI,EAAGC,EAAI,EAAGC,CAAE,EAAK,KAC5BQ,EAAK5E,EAAG,KAAM6E,EAAK7E,EAAG,KAAM8E,EAAK9E,EAAG,KACpC+E,EAAK/E,EAAG,IAAIkE,EAAIA,CAAE,EAClBc,EAAKhF,EAAG,IAAImE,EAAIA,CAAE,EAClBc,EAAKjF,EAAG,IAAIoE,EAAIA,CAAE,EAClBc,EAAKlF,EAAG,IAAIkE,EAAIC,CAAE,EACtB,OAAAe,EAAKlF,EAAG,IAAIkF,EAAIA,CAAE,EAClBJ,EAAK9E,EAAG,IAAIkE,EAAIE,CAAE,EAClBU,EAAK9E,EAAG,IAAI8E,EAAIA,CAAE,EAClBF,EAAK5E,EAAG,IAAI0E,EAAGI,CAAE,EACjBD,EAAK7E,EAAG,IAAI2E,EAAIM,CAAE,EAClBJ,EAAK7E,EAAG,IAAI4E,EAAIC,CAAE,EAClBD,EAAK5E,EAAG,IAAIgF,EAAIH,CAAE,EAClBA,EAAK7E,EAAG,IAAIgF,EAAIH,CAAE,EAClBA,EAAK7E,EAAG,IAAI4E,EAAIC,CAAE,EAClBD,EAAK5E,EAAG,IAAIkF,EAAIN,CAAE,EAClBE,EAAK9E,EAAG,IAAI2E,EAAIG,CAAE,EAClBG,EAAKjF,EAAG,IAAI0E,EAAGO,CAAE,EACjBC,EAAKlF,EAAG,IAAI+E,EAAIE,CAAE,EAClBC,EAAKlF,EAAG,IAAI0E,EAAGQ,CAAE,EACjBA,EAAKlF,EAAG,IAAIkF,EAAIJ,CAAE,EAClBA,EAAK9E,EAAG,IAAI+E,EAAIA,CAAE,EAClBA,EAAK/E,EAAG,IAAI8E,EAAIC,CAAE,EAClBA,EAAK/E,EAAG,IAAI+E,EAAIE,CAAE,EAClBF,EAAK/E,EAAG,IAAI+E,EAAIG,CAAE,EAClBL,EAAK7E,EAAG,IAAI6E,EAAIE,CAAE,EAClBE,EAAKjF,EAAG,IAAImE,EAAIC,CAAE,EAClBa,EAAKjF,EAAG,IAAIiF,EAAIA,CAAE,EAClBF,EAAK/E,EAAG,IAAIiF,EAAIC,CAAE,EAClBN,EAAK5E,EAAG,IAAI4E,EAAIG,CAAE,EAClBD,EAAK9E,EAAG,IAAIiF,EAAID,CAAE,EAClBF,EAAK9E,EAAG,IAAI8E,EAAIA,CAAE,EAClBA,EAAK9E,EAAG,IAAI8E,EAAIA,CAAE,EACX,IAAIjC,EAAM+B,EAAIC,EAAIC,CAAE,CAC7B,CAMA,IAAIlC,EAAY,CACdD,EAAUC,CAAK,EACf,GAAM,CAAE,EAAGsB,EAAI,EAAGC,EAAI,EAAGC,CAAE,EAAK,KAC1B,CAAE,EAAGC,EAAI,EAAGC,EAAI,EAAGC,CAAE,EAAK3B,EAC5BgC,EAAK5E,EAAG,KAAM6E,EAAK7E,EAAG,KAAM8E,EAAK9E,EAAG,KAClC0E,EAAIzE,EAAM,EACV0E,EAAK3E,EAAG,IAAIC,EAAM,EAAGb,EAAG,EAC1B2F,EAAK/E,EAAG,IAAIkE,EAAIG,CAAE,EAClBW,EAAKhF,EAAG,IAAImE,EAAIG,CAAE,EAClBW,EAAKjF,EAAG,IAAIoE,EAAIG,CAAE,EAClBW,EAAKlF,EAAG,IAAIkE,EAAIC,CAAE,EAClBgB,EAAKnF,EAAG,IAAIqE,EAAIC,CAAE,EACtBY,EAAKlF,EAAG,IAAIkF,EAAIC,CAAE,EAClBA,EAAKnF,EAAG,IAAI+E,EAAIC,CAAE,EAClBE,EAAKlF,EAAG,IAAIkF,EAAIC,CAAE,EAClBA,EAAKnF,EAAG,IAAIkE,EAAIE,CAAE,EAClB,IAAIgB,GAAKpF,EAAG,IAAIqE,EAAIE,CAAE,EACtB,OAAAY,EAAKnF,EAAG,IAAImF,EAAIC,EAAE,EAClBA,GAAKpF,EAAG,IAAI+E,EAAIE,CAAE,EAClBE,EAAKnF,EAAG,IAAImF,EAAIC,EAAE,EAClBA,GAAKpF,EAAG,IAAImE,EAAIC,CAAE,EAClBQ,EAAK5E,EAAG,IAAIsE,EAAIC,CAAE,EAClBa,GAAKpF,EAAG,IAAIoF,GAAIR,CAAE,EAClBA,EAAK5E,EAAG,IAAIgF,EAAIC,CAAE,EAClBG,GAAKpF,EAAG,IAAIoF,GAAIR,CAAE,EAClBE,EAAK9E,EAAG,IAAI0E,EAAGS,CAAE,EACjBP,EAAK5E,EAAG,IAAI2E,EAAIM,CAAE,EAClBH,EAAK9E,EAAG,IAAI4E,EAAIE,CAAE,EAClBF,EAAK5E,EAAG,IAAIgF,EAAIF,CAAE,EAClBA,EAAK9E,EAAG,IAAIgF,EAAIF,CAAE,EAClBD,EAAK7E,EAAG,IAAI4E,EAAIE,CAAE,EAClBE,EAAKhF,EAAG,IAAI+E,EAAIA,CAAE,EAClBC,EAAKhF,EAAG,IAAIgF,EAAID,CAAE,EAClBE,EAAKjF,EAAG,IAAI0E,EAAGO,CAAE,EACjBE,EAAKnF,EAAG,IAAI2E,EAAIQ,CAAE,EAClBH,EAAKhF,EAAG,IAAIgF,EAAIC,CAAE,EAClBA,EAAKjF,EAAG,IAAI+E,EAAIE,CAAE,EAClBA,EAAKjF,EAAG,IAAI0E,EAAGO,CAAE,EACjBE,EAAKnF,EAAG,IAAImF,EAAIF,CAAE,EAClBF,EAAK/E,EAAG,IAAIgF,EAAIG,CAAE,EAClBN,EAAK7E,EAAG,IAAI6E,EAAIE,CAAE,EAClBA,EAAK/E,EAAG,IAAIoF,GAAID,CAAE,EAClBP,EAAK5E,EAAG,IAAIkF,EAAIN,CAAE,EAClBA,EAAK5E,EAAG,IAAI4E,EAAIG,CAAE,EAClBA,EAAK/E,EAAG,IAAIkF,EAAIF,CAAE,EAClBF,EAAK9E,EAAG,IAAIoF,GAAIN,CAAE,EAClBA,EAAK9E,EAAG,IAAI8E,EAAIC,CAAE,EACX,IAAIlC,EAAM+B,EAAIC,EAAIC,CAAE,CAC7B,CAEA,SAASlC,EAAY,CACnB,OAAO,KAAK,IAAIA,EAAM,OAAM,CAAE,CAChC,CAEA,KAAG,CACD,OAAO,KAAK,OAAOC,EAAM,IAAI,CAC/B,CAWA,SAASwC,EAAc,CACrB,GAAM,CAAE,KAAAhF,CAAI,EAAKR,EACjB,GAAI,CAACN,EAAG,YAAY8F,CAAM,EAAG,MAAM,IAAI,MAAM,8BAA8B,EAC3E,IAAI1E,EAAc2E,EACZC,EAAO3J,GAAcqI,EAAK,OAAO,KAAMrI,EAAIqH,GAAMuC,GAAW3C,EAAOI,CAAC,CAAC,EAE3E,GAAI5C,EAAM,CACR,GAAM,CAAE,MAAAhE,EAAO,GAAAF,EAAI,MAAAI,EAAO,GAAAH,CAAE,EAAK0G,EAAiBuC,CAAM,EAClD,CAAE,EAAG1B,EAAK,EAAG8B,CAAG,EAAKF,EAAIpJ,CAAE,EAC3B,CAAE,EAAGyH,EAAK,EAAG8B,CAAG,EAAKH,EAAInJ,CAAE,EACjCkJ,EAAOG,EAAI,IAAIC,CAAG,EAClB/E,EAAQ8C,EAAWpD,EAAK,KAAMsD,EAAKC,EAAKvH,EAAOE,CAAK,CACtD,KAAO,CACL,GAAM,CAAE,EAAA0G,EAAG,EAAA0C,CAAC,EAAKJ,EAAIF,CAAM,EAC3B1E,EAAQsC,EACRqC,EAAOK,CACT,CAEA,OAAOH,GAAW3C,EAAO,CAAClC,EAAO2E,CAAI,CAAC,EAAE,CAAC,CAC3C,CAOA,eAAeM,EAAU,CACvB,GAAM,CAAE,KAAAvF,CAAI,EAAKR,EACXoD,EAAI,KACV,GAAI,CAAC1D,EAAG,QAAQqG,CAAE,EAAG,MAAM,IAAI,MAAM,8BAA8B,EACnE,GAAIA,IAAOtJ,IAAO2G,EAAE,IAAG,EAAI,OAAOJ,EAAM,KACxC,GAAI+C,IAAOjJ,GAAK,OAAOsG,EACvB,GAAIgB,EAAK,SAAS,IAAI,EAAG,OAAO,KAAK,SAAS2B,CAAE,EAChD,GAAIvF,EAAM,CACR,GAAM,CAAE,MAAAhE,EAAO,GAAAF,EAAI,MAAAI,EAAO,GAAAH,CAAE,EAAK0G,EAAiB8C,CAAE,EAC9C,CAAE,GAAAC,EAAI,GAAAC,CAAE,EAAKC,GAAclD,EAAOI,EAAG9G,EAAIC,CAAE,EACjD,OAAOqH,EAAWpD,EAAK,KAAMwF,EAAIC,EAAIzJ,EAAOE,CAAK,CACnD,KACE,QAAO0H,EAAK,OAAOhB,EAAG2C,CAAE,CAE5B,CAEA,qBAAqBI,EAAUtB,EAAWvG,EAAS,CACjD,IAAM8H,EAAM,KAAK,eAAevB,CAAC,EAAE,IAAIsB,EAAE,eAAe7H,CAAC,CAAC,EAC1D,OAAO8H,EAAI,IAAG,EAAK,OAAYA,CACjC,CAMA,SAASC,EAAa,CACpB,OAAOnD,EAAa,KAAMmD,CAAS,CACrC,CAMA,eAAa,CACX,GAAM,CAAE,cAAAC,CAAa,EAAKtG,EAC1B,OAAIK,IAAavD,GAAY,GACzBwJ,EAAsBA,EAActD,EAAO,IAAI,EAC5CoB,EAAK,OAAO,KAAM9D,CAAW,EAAE,IAAG,CAC3C,CAEA,eAAa,CACX,GAAM,CAAE,cAAAiG,CAAa,EAAKvG,EAC1B,OAAIK,IAAavD,GAAY,KACzByJ,EAAsBA,EAAcvD,EAAO,IAAI,EAC5C,KAAK,eAAe3C,CAAQ,CACrC,CAEA,cAAY,CAEV,OAAO,KAAK,eAAeA,CAAQ,EAAE,IAAG,CAC1C,CAEA,QAAQU,EAAe,GAAI,CACzB,OAAAzD,GAAMyD,EAAc,cAAc,EAClC,KAAK,eAAc,EACZoB,EAAYa,EAAO,KAAMjC,CAAY,CAC9C,CAEA,MAAMA,EAAe,GAAI,CACvB,OAAOyF,GAAW,KAAK,QAAQzF,CAAY,CAAC,CAC9C,CAEA,UAAQ,CACN,MAAO,UAAU,KAAK,IAAG,EAAK,OAAS,KAAK,MAAK,CAAE,GACrD,CAGA,IAAI,IAAE,CACJ,OAAO,KAAK,CACd,CACA,IAAI,IAAE,CACJ,OAAO,KAAK,CACd,CACA,IAAI,IAAE,CACJ,OAAO,KAAK,CACd,CACA,WAAWA,EAAe,GAAI,CAC5B,OAAO,KAAK,QAAQA,CAAY,CAClC,CACA,eAAemD,EAAkB,CAC/B,KAAK,WAAWA,CAAU,CAC5B,CACA,OAAO,WAAWuC,EAAe,CAC/B,OAAOd,GAAW3C,EAAOyD,CAAM,CACjC,CACA,OAAO,IAAIA,EAAiBC,EAAiB,CAC3C,OAAOC,GAAU3D,EAAOtD,EAAI+G,EAAQC,CAAO,CAC7C,CACA,OAAO,eAAeE,EAAmB,CACvC,OAAO5D,EAAM,KAAK,SAASvD,GAAeC,EAAIkH,CAAU,CAAC,CAC3D,EA/TgB5D,EAAA,KAAO,IAAIA,EAAM5C,EAAM,GAAIA,EAAM,GAAID,EAAG,GAAG,EAE3C6C,EAAA,KAAO,IAAIA,EAAM7C,EAAG,KAAMA,EAAG,IAAKA,EAAG,IAAI,EAEzC6C,EAAA,GAAK7C,EAEL6C,EAAA,GAAKtD,EA2TvB,IAAMmH,EAAOnH,EAAG,KACV0E,EAAO,IAAI0C,GAAK9D,EAAOhD,EAAU,KAAO,KAAK,KAAK6G,EAAO,CAAC,EAAIA,CAAI,EACxE,OAAA7D,EAAM,KAAK,WAAW,CAAC,EAChBA,CACT,CA2CA,SAAS3B,GAAQF,EAAiB,CAChC,OAAO,WAAW,GAAGA,EAAW,EAAO,CAAI,CAC7C,CAuIA,SAAS4F,GAAeC,EAAeC,EAAkB,CACvD,MAAO,CACL,UAAWA,EAAG,MACd,UAAW,EAAID,EAAG,MAClB,sBAAuB,EAAI,EAAIA,EAAG,MAClC,mBAAoB,GACpB,UAAW,EAAIC,EAAG,MAEtB,CAMM,SAAUC,GACdC,EACAC,EAAmE,CAAA,EAAE,CAErE,GAAM,CAAE,GAAAH,CAAE,EAAKE,EACTE,EAAeD,EAAS,aAAeE,GACvCC,EAAU,OAAO,OAAOR,GAAYI,EAAM,GAAIF,CAAE,EAAG,CAAE,KAAMO,GAAiBP,EAAG,KAAK,CAAC,CAAE,EAE7F,SAASQ,EAAiBC,EAAkB,CAC1C,GAAI,CACF,MAAO,CAAC,CAACC,GAAeV,EAAIS,CAAS,CACvC,MAAgB,CACd,MAAO,EACT,CACF,CAEA,SAASE,EAAiBC,EAAuBC,EAAsB,CACrE,GAAM,CAAE,UAAWC,EAAM,sBAAAC,CAAqB,EAAKT,EACnD,GAAI,CACF,IAAMU,EAAIJ,EAAU,OAEpB,OADIC,IAAiB,IAAQG,IAAMF,GAC/BD,IAAiB,IAASG,IAAMD,EAA8B,GAC3D,CAAC,CAACb,EAAM,UAAUU,CAAS,CACpC,MAAgB,CACd,MAAO,EACT,CACF,CAMA,SAASK,EAAgBC,EAAOd,EAAaE,EAAQ,IAAI,EAAC,CACxD,OAAOa,GAAeC,GAAOF,EAAMZ,EAAQ,KAAM,MAAM,EAAGN,EAAG,KAAK,CACpE,CAOA,SAASqB,EAAaZ,EAAoBI,EAAe,GAAI,CAC3D,OAAOX,EAAM,KAAK,SAASQ,GAAeV,EAAIS,CAAS,CAAC,EAAE,QAAQI,CAAY,CAChF,CAEA,SAASS,EAAOJ,EAAiB,CAC/B,IAAMT,EAAYQ,EAAgBC,CAAI,EACtC,MAAO,CAAE,UAAAT,EAAW,UAAWY,EAAaZ,CAAS,CAAC,CACxD,CAKA,SAASc,EAAUC,EAAsB,CACvC,GAAI,OAAOA,GAAS,SAAU,MAAO,GACrC,GAAIA,aAAgBtB,EAAO,MAAO,GAClC,GAAM,CAAE,UAAAO,EAAW,UAAAG,EAAW,sBAAAG,CAAqB,EAAKT,EACxD,GAAIN,EAAG,gBAAkBS,IAAcG,EAAW,OAClD,IAAMI,EAAIS,EAAY,MAAOD,CAAI,EAAE,OACnC,OAAOR,IAAMJ,GAAaI,IAAMD,CAClC,CAUA,SAASW,EAAgBC,EAAqBC,EAAiBf,EAAe,GAAI,CAChF,GAAIU,EAAUI,CAAU,IAAM,GAAM,MAAM,IAAI,MAAM,+BAA+B,EACnF,GAAIJ,EAAUK,CAAU,IAAM,GAAO,MAAM,IAAI,MAAM,+BAA+B,EACpF,IAAMC,EAAInB,GAAeV,EAAI2B,CAAU,EAEvC,OADUzB,EAAM,QAAQ0B,CAAU,EACzB,SAASC,CAAC,EAAE,QAAQhB,CAAY,CAC3C,CAgBA,OAAO,OAAO,OAAO,CAAE,aAAAQ,EAAc,gBAAAK,EAAiB,OAAAJ,EAAQ,MAAApB,EAAO,MAdvD,CACZ,iBAAAM,EACA,iBAAAG,EACA,gBAAAM,EAGA,kBAAmBT,EACnB,iBAAkBS,EAClB,uBAAyBa,GAAiBpB,GAAeV,EAAI8B,CAAG,EAChE,WAAWC,EAAa,EAAGC,EAAQ9B,EAAM,KAAI,CAC3C,OAAO8B,EAAM,WAAWD,EAAY,EAAK,CAC3C,GAG0E,QAAAzB,CAAO,CAAE,CACvF,CAkBM,SAAU2B,GACd/B,EACAgC,EACAC,EAAuB,CAAA,EAAE,CAEzBC,GAAMF,CAAI,EACVG,GACEF,EACA,CAAA,EACA,CACE,KAAM,WACN,KAAM,UACN,YAAa,WACb,SAAU,WACV,cAAe,WAChB,EAGH,IAAM9B,EAAc8B,EAAU,aAAe9B,GACvCiC,EACJH,EAAU,OACR,CAACL,KAAQS,IAASD,GAAUJ,EAAMJ,EAAKU,EAAY,GAAGD,CAAI,CAAC,GAEzD,CAAE,GAAAxC,EAAI,GAAAC,CAAE,EAAKE,EACb,CAAE,MAAOuC,EAAa,KAAMC,CAAM,EAAK1C,EACvC,CAAE,OAAAsB,EAAQ,aAAAD,EAAc,gBAAAK,EAAiB,MAAAiB,EAAO,QAAArC,CAAO,EAAKL,GAAKC,EAAOiC,CAAS,EACjFS,EAA0C,CAC9C,QAAS,GACT,KAAM,OAAOT,EAAU,MAAS,UAAYA,EAAU,KAAO,GAC7D,OAAQ,OACR,aAAc,IAEVU,EAAwB,UAE9B,SAASC,EAAsBC,EAAc,CAC3C,IAAMC,EAAOP,GAAeQ,GAC5B,OAAOF,EAASC,CAClB,CACA,SAASE,EAAWC,EAAeC,EAAW,CAC5C,GAAI,CAACpD,EAAG,YAAYoD,CAAG,EACrB,MAAM,IAAI,MAAM,qBAAqBD,CAAK,kCAAkC,EAC9E,OAAOC,CACT,CACA,SAASC,EAAkBC,EAAmBC,EAAsB,CAClEC,GAAkBD,CAAM,EACxB,IAAME,EAAOnD,EAAQ,UACfoD,EAAQH,IAAW,UAAYE,EAAOF,IAAW,YAAcE,EAAO,EAAI,OAChF,OAAOrC,GAAOkC,EAAOI,EAAO,GAAGH,CAAM,YAAY,CACnD,CAKA,MAAMI,CAAS,CAIb,YAAYC,EAAW/B,EAAWgC,EAAiB,CACjD,KAAK,EAAIX,EAAW,IAAKU,CAAC,EAC1B,KAAK,EAAIV,EAAW,IAAKrB,CAAC,EACtBgC,GAAY,OAAM,KAAK,SAAWA,GACtC,OAAO,OAAO,IAAI,CACpB,CAEA,OAAO,UAAUP,EAAmBC,EAAyBV,EAAqB,CAChFQ,EAAkBC,EAAOC,CAAM,EAC/B,IAAIO,EACJ,GAAIP,IAAW,MAAO,CACpB,GAAM,CAAE,EAAAK,EAAG,EAAA/B,CAAC,EAAKkC,GAAI,MAAM3C,GAAOkC,CAAK,CAAC,EACxC,OAAO,IAAIK,EAAUC,EAAG/B,CAAC,CAC3B,CACI0B,IAAW,cACbO,EAAQR,EAAM,CAAC,EACfC,EAAS,UACTD,EAAQA,EAAM,SAAS,CAAC,GAE1B,IAAMU,EAAIhE,EAAG,MACP4D,EAAIN,EAAM,SAAS,EAAGU,CAAC,EACvBnC,EAAIyB,EAAM,SAASU,EAAGA,EAAI,CAAC,EACjC,OAAO,IAAIL,EAAU3D,EAAG,UAAU4D,CAAC,EAAG5D,EAAG,UAAU6B,CAAC,EAAGiC,CAAK,CAC9D,CAEA,OAAO,QAAQG,EAAaV,EAAuB,CACjD,OAAO,KAAK,UAAUW,GAAWD,CAAG,EAAGV,CAAM,CAC/C,CAEA,eAAeM,EAAgB,CAC7B,OAAO,IAAIF,EAAU,KAAK,EAAG,KAAK,EAAGE,CAAQ,CAC/C,CAEA,iBAAiBM,EAAgB,CAC/B,IAAMC,EAAcrE,EAAG,MACjB,CAAE,EAAA6D,EAAG,EAAA/B,EAAG,SAAUwC,CAAG,EAAK,KAChC,GAAIA,GAAO,MAAQ,CAAC,CAAC,EAAG,EAAG,EAAG,CAAC,EAAE,SAASA,CAAG,EAAG,MAAM,IAAI,MAAM,qBAAqB,EAWrF,GADoB5B,EAAc6B,GAAMF,GACrBC,EAAM,EAAG,MAAM,IAAI,MAAM,wCAAwC,EAEpF,IAAME,EAAOF,IAAQ,GAAKA,IAAQ,EAAIT,EAAInB,EAAcmB,EACxD,GAAI,CAAC7D,EAAG,QAAQwE,CAAI,EAAG,MAAM,IAAI,MAAM,4BAA4B,EACnE,IAAMC,EAAIzE,EAAG,QAAQwE,CAAI,EACnBE,EAAIvE,EAAM,UAAUsC,EAAYkC,IAASL,EAAM,KAAO,CAAC,EAAGG,CAAC,CAAC,EAC5DG,EAAK3E,EAAG,IAAIuE,CAAI,EAChBK,EAAIC,EAAcpD,EAAY,UAAW0C,CAAW,CAAC,EACrDW,EAAK9E,EAAG,OAAO,CAAC4E,EAAID,CAAE,EACtBI,EAAK/E,EAAG,OAAO6B,EAAI8C,CAAE,EAErB,EAAIzE,EAAM,KAAK,eAAe4E,CAAE,EAAE,IAAIL,EAAE,eAAeM,CAAE,CAAC,EAChE,GAAI,EAAE,IAAG,EAAI,MAAM,IAAI,MAAM,mBAAmB,EAChD,SAAE,eAAc,EACT,CACT,CAGA,UAAQ,CACN,OAAOjC,EAAsB,KAAK,CAAC,CACrC,CAEA,QAAQS,EAAyBV,EAAqB,CAEpD,GADAW,GAAkBD,CAAM,EACpBA,IAAW,MAAO,OAAOW,GAAWH,GAAI,WAAW,IAAI,CAAC,EAC5D,IAAMH,EAAI5D,EAAG,QAAQ,KAAK,CAAC,EACrB6B,EAAI7B,EAAG,QAAQ,KAAK,CAAC,EAC3B,GAAIuD,IAAW,YAAa,CAC1B,GAAI,KAAK,UAAY,KAAM,MAAM,IAAI,MAAM,8BAA8B,EACzE,OAAOf,EAAY,WAAW,GAAG,KAAK,QAAQ,EAAGoB,EAAG/B,CAAC,CACvD,CACA,OAAOW,EAAYoB,EAAG/B,CAAC,CACzB,CAEA,MAAM0B,EAAuB,CAC3B,OAAOyB,GAAW,KAAK,QAAQzB,CAAM,CAAC,CACxC,CAGA,gBAAc,CAAU,CACxB,OAAO,YAAYU,EAAQ,CACzB,OAAON,EAAU,UAAUlC,EAAY,MAAOwC,CAAG,EAAG,SAAS,CAC/D,CACA,OAAO,QAAQA,EAAQ,CACrB,OAAON,EAAU,UAAUlC,EAAY,MAAOwC,CAAG,EAAG,KAAK,CAC3D,CACA,YAAU,CACR,OAAO,KAAK,SAAQ,EAAK,IAAIN,EAAU,KAAK,EAAG3D,EAAG,IAAI,KAAK,CAAC,EAAG,KAAK,QAAQ,EAAI,IAClF,CACA,eAAa,CACX,OAAO,KAAK,QAAQ,KAAK,CAC3B,CACA,UAAQ,CACN,OAAOgF,GAAW,KAAK,QAAQ,KAAK,CAAC,CACvC,CACA,mBAAiB,CACf,OAAO,KAAK,QAAQ,SAAS,CAC/B,CACA,cAAY,CACV,OAAOA,GAAW,KAAK,QAAQ,SAAS,CAAC,CAC3C,EAQF,IAAMC,EACJ9C,EAAU,UACV,SAAsBmB,EAAiB,CAErC,GAAIA,EAAM,OAAS,KAAM,MAAM,IAAI,MAAM,oBAAoB,EAG7D,IAAMF,EAAM8B,GAAgB5B,CAAK,EAC3B6B,EAAQ7B,EAAM,OAAS,EAAIZ,EACjC,OAAOyC,EAAQ,EAAI/B,GAAO,OAAO+B,CAAK,EAAI/B,CAC5C,EACIyB,EACJ1C,EAAU,eACV,SAA2BmB,EAAiB,CAC1C,OAAOtD,EAAG,OAAOiF,EAAS3B,CAAK,CAAC,CAClC,EAEI8B,EAAaC,GAAQ3C,CAAM,EAEjC,SAAS4C,EAAWlC,EAAW,CAE7B,OAAAmC,GAAS,WAAa7C,EAAQU,EAAKoC,GAAKJ,CAAU,EAC3CpF,EAAG,QAAQoD,CAAG,CACvB,CAEA,SAASqC,EAAmBC,EAAqBC,EAAgB,CAC/D,OAAAvE,GAAOsE,EAAS,OAAW,SAAS,EAC7BC,EAAUvE,GAAOc,EAAKwD,CAAO,EAAG,OAAW,mBAAmB,EAAIA,CAC3E,CAUA,SAASE,EAAQF,EAAqBG,EAAqBC,EAAmB,CAC5E,GAAI,CAAC,YAAa,WAAW,EAAE,KAAMC,GAAMA,KAAKD,CAAI,EAClD,MAAM,IAAI,MAAM,qCAAqC,EACvD,GAAM,CAAE,KAAAE,EAAM,QAAAL,EAAS,aAAAM,CAAY,EAAKC,GAAgBJ,EAAMlD,CAAc,EAC5E8C,EAAUD,EAAmBC,EAASC,CAAO,EAI7C,IAAMQ,EAAQtB,EAAca,CAAO,EAC7BU,EAAI1F,GAAeV,EAAI6F,CAAU,EACjCQ,EAAW,CAACf,EAAWc,CAAC,EAAGd,EAAWa,CAAK,CAAC,EAElD,GAAIF,GAAgB,MAAQA,IAAiB,GAAO,CAGlD,IAAMK,EAAIL,IAAiB,GAAO5F,EAAYC,EAAQ,SAAS,EAAI2F,EACnEI,EAAS,KAAK5E,EAAY,eAAgB6E,CAAC,CAAC,CAC9C,CACA,IAAMpF,EAAOsB,EAAY,GAAG6D,CAAQ,EAC9BE,EAAIJ,EASV,SAASK,EAAMC,EAAkB,CAG/B,IAAMV,EAAId,EAASwB,CAAM,EACzB,GAAI,CAACzG,EAAG,YAAY+F,CAAC,EAAG,OACxB,IAAMW,EAAK1G,EAAG,IAAI+F,CAAC,EACbY,EAAIzG,EAAM,KAAK,SAAS6F,CAAC,EAAE,SAAQ,EACnCnC,GAAI5D,EAAG,OAAO2G,EAAE,CAAC,EACvB,GAAI/C,KAAM4B,GAAK,OACf,IAAM3D,GAAI7B,EAAG,OAAO0G,EAAK1G,EAAG,OAAOuG,EAAI3C,GAAIwC,CAAC,CAAC,EAC7C,GAAIvE,KAAM2D,GAAK,OACf,IAAI3B,IAAY8C,EAAE,IAAM/C,GAAI,EAAI,GAAK,OAAO+C,EAAE,EAAI1D,EAAG,EACjD2D,GAAQ/E,GACZ,OAAImE,GAAQlD,EAAsBjB,EAAC,IACjC+E,GAAQ5G,EAAG,IAAI6B,EAAC,EAChBgC,IAAY,GAEP,IAAIF,EAAUC,GAAGgD,GAAO/C,EAAQ,CACzC,CACA,MAAO,CAAE,KAAA3C,EAAM,MAAAsF,CAAK,CACtB,CAaA,SAASK,EAAKnB,EAAcjF,EAAoBqF,EAAsB,CAAA,EAAE,CACtEJ,EAAUjE,EAAY,UAAWiE,CAAO,EACxC,GAAM,CAAE,KAAAxE,EAAM,MAAAsF,CAAK,EAAKZ,EAAQF,EAASjF,EAAWqF,CAAI,EAGxD,OAFagB,GAAmC5E,EAAK,UAAWlC,EAAG,MAAOsC,CAAI,EAC7DpB,EAAMsF,CAAK,CAE9B,CAEA,SAASO,EAAcC,EAAuB,CAE5C,IAAIC,EACEC,EAAQ,OAAOF,GAAO,UAAYG,GAAQH,CAAE,EAC5CI,EACJ,CAACF,GACDF,IAAO,MACP,OAAOA,GAAO,UACd,OAAOA,EAAG,GAAM,UAChB,OAAOA,EAAG,GAAM,SAClB,GAAI,CAACE,GAAS,CAACE,EACb,MAAM,IAAI,MAAM,0EAA0E,EAC5F,GAAIA,EACFH,EAAM,IAAItD,EAAUqD,EAAG,EAAGA,EAAG,CAAC,UACrBE,EAAO,CAChB,GAAI,CACFD,EAAMtD,EAAU,UAAUlC,EAAY,MAAOuF,CAAE,EAAG,KAAK,CACzD,OAASK,EAAU,CACjB,GAAI,EAAEA,aAAoBtD,GAAI,KAAM,MAAMsD,CAC5C,CACA,GAAI,CAACJ,EACH,GAAI,CACFA,EAAMtD,EAAU,UAAUlC,EAAY,MAAOuF,CAAE,EAAG,SAAS,CAC7D,MAAgB,CACd,MAAO,EACT,CAEJ,CACA,OAAKC,GAAY,EAEnB,CAeA,SAASK,EACPC,EACA7B,EACA9E,EACAkF,EAAwB,CAAA,EAAE,CAE1B,GAAM,CAAE,KAAAE,EAAM,QAAAL,EAAS,OAAApC,CAAM,EAAK2C,GAAgBJ,EAAMlD,CAAc,EAGtE,GAFAhC,EAAYa,EAAY,YAAab,CAAS,EAC9C8E,EAAUD,EAAmBhE,EAAY,UAAWiE,CAAO,EAAGC,CAAO,EACjE,WAAYG,EAAM,MAAM,IAAI,MAAM,oCAAoC,EAC1E,IAAMmB,EACJ1D,IAAW,OACPwD,EAAcQ,CAAS,EACvB5D,EAAU,UAAUlC,EAAY,MAAO8F,CAAgB,EAAGhE,CAAM,EACtE,GAAI0D,IAAQ,GAAO,MAAO,GAC1B,GAAI,CACF,IAAMO,EAAItH,EAAM,UAAUU,CAAS,EACnC,GAAIoF,GAAQiB,EAAI,SAAQ,EAAI,MAAO,GACnC,GAAM,CAAE,EAAArD,EAAG,EAAA/B,CAAC,EAAKoF,EACXrC,EAAIC,EAAca,CAAO,EACzB+B,EAAKzH,EAAG,IAAI6B,CAAC,EACbiD,EAAK9E,EAAG,OAAO4E,EAAI6C,CAAE,EACrB1C,EAAK/E,EAAG,OAAO4D,EAAI6D,CAAE,EACrBhD,EAAIvE,EAAM,KAAK,eAAe4E,CAAE,EAAE,IAAI0C,EAAE,eAAezC,CAAE,CAAC,EAChE,OAAIN,EAAE,IAAG,EAAW,GACVzE,EAAG,OAAOyE,EAAE,CAAC,IACVb,CACf,MAAY,CACV,MAAO,EACT,CACF,CAEA,SAAS8D,EACPH,EACA7B,EACAI,EAAyB,CAAA,EAAE,CAE3B,GAAM,CAAE,QAAAH,CAAO,EAAKO,GAAgBJ,EAAMlD,CAAc,EACxD,OAAA8C,EAAUD,EAAmBC,EAASC,CAAO,EACtChC,EAAU,UAAU4D,EAAW,WAAW,EAAE,iBAAiB7B,CAAO,EAAE,QAAO,CACtF,CAEA,OAAO,OAAO,OAAO,CACnB,OAAApE,EACA,aAAAD,EACA,gBAAAK,EACA,MAAAiB,EACA,QAAArC,EACA,MAAAJ,EACA,KAAA2G,EACA,OAAAS,EACA,iBAAAI,EACA,UAAA/D,EACA,KAAAzB,EACD,CACH,CAsHA,SAASyF,GAAmCC,EAAqB,CAC/D,IAAMC,EAA4B,CAChC,EAAGD,EAAE,EACL,EAAGA,EAAE,EACL,EAAGA,EAAE,GAAG,MACR,EAAGA,EAAE,EACL,EAAGA,EAAE,EACL,GAAIA,EAAE,GACN,GAAIA,EAAE,IAEFE,EAAKF,EAAE,GACTG,EAAiBH,EAAE,yBACnB,MAAM,KAAK,IAAI,IAAIA,EAAE,yBAAyB,IAAKI,GAAM,KAAK,KAAKA,EAAI,CAAC,CAAC,CAAC,CAAC,EAC3E,OACEC,EAAKC,GAAML,EAAM,EAAG,CACxB,KAAMD,EAAE,WACR,eAAgBG,EAChB,aAAcH,EAAE,eACjB,EACKO,EAAqC,CACzC,GAAAL,EACA,GAAAG,EACA,mBAAoBL,EAAE,mBACtB,KAAMA,EAAE,KACR,cAAeA,EAAE,cACjB,cAAeA,EAAE,cACjB,UAAWA,EAAE,UACb,QAASA,EAAE,SAEb,MAAO,CAAE,MAAAC,EAAO,UAAAM,CAAS,CAC3B,CACA,SAASC,GAA0BR,EAAY,CAC7C,GAAM,CAAE,MAAAC,EAAO,UAAAM,CAAS,EAAKR,GAAgCC,CAAC,EACxDS,EAAuB,CAC3B,KAAMT,EAAE,KACR,YAAaA,EAAE,YACf,KAAMA,EAAE,KACR,SAAUA,EAAE,SACZ,cAAeA,EAAE,eAEnB,MAAO,CAAE,MAAAC,EAAO,UAAAM,EAAW,KAAMP,EAAE,KAAM,UAAAS,CAAS,CACpD,CAkCA,SAASC,GAA4BC,EAAcC,EAAa,CAC9D,IAAMC,EAAQD,EAAO,MACrB,OAAO,OAAO,OAAO,CAAA,EAAIA,EAAQ,CAC/B,gBAAiBC,EACjB,MAAO,OAAO,OAAO,CAAA,EAAIF,EAAGG,GAAQD,EAAM,GAAG,MAAOA,EAAM,GAAG,IAAI,CAAC,EACnE,CACH,CAGM,SAAUE,GAAYJ,EAAY,CACtC,GAAM,CAAE,MAAAK,EAAO,UAAAC,EAAW,KAAAC,EAAM,UAAAC,CAAS,EAAKC,GAA0BT,CAAC,EACnEE,EAAQQ,GAAaL,EAAOC,CAAS,EACrCK,EAAQC,GAAMV,EAAOK,EAAMC,CAAS,EAC1C,OAAOT,GAA4BC,EAAGW,CAAK,CAC7C,CC10DM,SAAUE,GAAYC,EAAoBC,EAAc,CAC5D,IAAMC,EAAUC,GAAyBC,GAAY,CAAE,GAAGJ,EAAU,KAAMG,CAAI,CAAE,EAChF,MAAO,CAAE,GAAGD,EAAOD,CAAO,EAAG,OAAAC,CAAM,CACrC,CCoBA,IAAMG,GAA2C,CAC/C,EAAG,OAAO,oEAAoE,EAC9E,EAAG,OAAO,oEAAoE,EAC9E,EAAG,OAAO,CAAC,EACX,EAAG,OAAO,CAAC,EACX,EAAG,OAAO,CAAC,EACX,GAAI,OAAO,oEAAoE,EAC/E,GAAI,OAAO,oEAAoE,GAG3EC,GAAmC,CACvC,KAAM,OAAO,oEAAoE,EACjF,QAAS,CACP,CAAC,OAAO,oCAAoC,EAAG,CAAC,OAAO,oCAAoC,CAAC,EAC5F,CAAC,OAAO,qCAAqC,EAAG,OAAO,oCAAoC,CAAC,IAI1FC,GAAsB,OAAO,CAAC,EAC9BC,GAAsB,OAAO,CAAC,EAC9BC,GAAsB,OAAO,CAAC,EAMpC,SAASC,GAAQC,EAAS,CACxB,IAAMC,EAAIP,GAAgB,EAEpBQ,EAAM,OAAO,CAAC,EAAGC,EAAM,OAAO,CAAC,EAAGC,EAAO,OAAO,EAAE,EAAGC,EAAO,OAAO,EAAE,EAErEC,EAAO,OAAO,EAAE,EAAGC,EAAO,OAAO,EAAE,EAAGC,EAAO,OAAO,EAAE,EACtDC,EAAMT,EAAIA,EAAIA,EAAKC,EACnBS,EAAMD,EAAKA,EAAKT,EAAKC,EACrBU,EAAMC,GAAKF,EAAIR,EAAKD,CAAC,EAAIS,EAAMT,EAC/BY,EAAMD,GAAKD,EAAIT,EAAKD,CAAC,EAAIS,EAAMT,EAC/Ba,EAAOF,GAAKC,EAAIf,GAAKG,CAAC,EAAIQ,EAAMR,EAChCc,EAAOH,GAAKE,EAAKV,EAAMH,CAAC,EAAIa,EAAOb,EACnCe,EAAOJ,GAAKG,EAAKV,EAAMJ,CAAC,EAAIc,EAAOd,EACnCgB,EAAOL,GAAKI,EAAKT,EAAMN,CAAC,EAAIe,EAAOf,EACnCiB,EAAQN,GAAKK,EAAKT,EAAMP,CAAC,EAAIgB,EAAOhB,EACpCkB,EAAQP,GAAKM,EAAMX,EAAMN,CAAC,EAAIe,EAAOf,EACrCmB,EAAQR,GAAKO,EAAMjB,EAAKD,CAAC,EAAIS,EAAMT,EACnCoB,EAAMT,GAAKQ,EAAMd,EAAML,CAAC,EAAIc,EAAOd,EACnCqB,EAAMV,GAAKS,EAAIlB,EAAKF,CAAC,EAAIQ,EAAMR,EAC/BsB,EAAOX,GAAKU,EAAIxB,GAAKG,CAAC,EAC5B,GAAI,CAACuB,GAAK,IAAIA,GAAK,IAAID,CAAI,EAAGvB,CAAC,EAAG,MAAM,IAAI,MAAM,yBAAyB,EAC3E,OAAOuB,CACT,CAEA,IAAMC,GAAOC,GAAM/B,GAAgB,EAAG,CAAE,KAAMK,EAAO,CAAE,EAgB1C2B,GAA+BC,GAC1C,CAAE,GAAGjC,GAAiB,GAAI8B,GAAM,KAAM,GAAM,KAAM7B,EAAc,EAChEiC,EAAM,EAMFC,GAAsD,CAAA,EAC5D,SAASC,GAAWC,KAAgBC,EAAsB,CACxD,IAAIC,EAAOJ,GAAqBE,CAAG,EACnC,GAAIE,IAAS,OAAW,CACtB,IAAMC,EAAON,GAAOO,GAAYJ,CAAG,CAAC,EACpCE,EAAOG,EAAYF,EAAMA,CAAI,EAC7BL,GAAqBE,CAAG,EAAIE,CAC9B,CACA,OAAOL,GAAOQ,EAAYH,EAAM,GAAGD,CAAQ,CAAC,CAC9C,CAGA,IAAMK,GAAgBC,GAA6BA,EAAM,QAAQ,EAAI,EAAE,MAAM,CAAC,EACxEC,GAAiCb,GAAU,MAC3Cc,GAAWxC,GAAcA,EAAIF,KAAQF,GAG3C,SAAS6C,GAAoBC,EAAa,CACxC,GAAM,CAAE,GAAAC,EAAI,KAAAC,CAAI,EAAKL,GACfM,EAAKC,GAAeH,EAAID,CAAI,EAC5BK,EAAIH,EAAK,SAASC,CAAE,EAE1B,MAAO,CAAE,OADML,GAAQO,EAAE,CAAC,EAAIF,EAAKF,EAAG,IAAIE,CAAE,EAC3B,MAAOR,GAAaU,CAAC,CAAC,CACzC,CAKA,SAASC,GAAOC,EAAS,CACvB,IAAMC,EAAK1B,GACX,GAAI,CAAC0B,EAAG,YAAYD,CAAC,EAAG,MAAM,IAAI,MAAM,+BAA0B,EAClE,IAAME,EAAKD,EAAG,OAAOD,EAAIA,CAAC,EACpBG,EAAIF,EAAG,OAAOC,EAAKF,EAAI,OAAO,CAAC,CAAC,EAClCjD,EAAIkD,EAAG,KAAKE,CAAC,EAGZZ,GAAQxC,CAAC,IAAGA,EAAIkD,EAAG,IAAIlD,CAAC,GAC7B,IAAM+C,EAAIR,GAAQ,WAAW,CAAE,EAAAU,EAAG,EAAAjD,CAAC,CAAE,EACrC,OAAA+C,EAAE,eAAc,EACTA,CACT,CACA,IAAMM,GAAMC,GAIZ,SAASC,MAAaC,EAAkB,CACtC,OAAOjB,GAAQ,GAAG,OAAOc,GAAIvB,GAAW,oBAAqB,GAAG0B,CAAI,CAAC,CAAC,CACxE,CAKA,SAASC,GAAoBC,EAAc,CACzC,OAAOjB,GAAoBiB,CAAS,EAAE,KACxC,CAMA,SAASC,GAAYC,EAAcF,EAAoBG,EAAeC,GAAY,EAAE,EAAC,CACnF,GAAM,CAAE,GAAAnB,CAAE,EAAKJ,GACTwB,EAAIC,EAAY,UAAWJ,CAAO,EAClC,CAAE,MAAOK,EAAI,OAAQC,CAAC,EAAKzB,GAAoBiB,CAAS,EACxDS,EAAIH,EAAY,UAAWH,EAAS,EAAE,EACtCO,EAAIzB,EAAG,QAAQuB,EAAIb,GAAIvB,GAAW,cAAeqC,CAAC,CAAC,CAAC,EACpDE,EAAOvC,GAAW,gBAAiBsC,EAAGH,EAAIF,CAAC,EAE3C,CAAE,MAAOO,EAAI,OAAQC,CAAC,EAAK9B,GAAoB4B,CAAI,EACnDG,EAAIjB,GAAUe,EAAIL,EAAIF,CAAC,EACvBU,EAAM,IAAI,WAAW,EAAE,EAI7B,GAHAA,EAAI,IAAIH,EAAI,CAAC,EACbG,EAAI,IAAI9B,EAAG,QAAQA,EAAG,OAAO4B,EAAIC,EAAIN,CAAC,CAAC,EAAG,EAAE,EAExC,CAACQ,GAAcD,EAAKV,EAAGE,CAAE,EAAG,MAAM,IAAI,MAAM,kCAAkC,EAClF,OAAOQ,CACT,CAMA,SAASC,GAAcC,EAAgBf,EAAcgB,EAAc,CACjE,GAAM,CAAE,GAAAjC,EAAI,KAAAC,CAAI,EAAKL,GACfkC,EAAMT,EAAY,YAAaW,EAAW,EAAE,EAC5CZ,EAAIC,EAAY,UAAWJ,CAAO,EAClCiB,EAAMb,EAAY,YAAaY,EAAW,EAAE,EAClD,GAAI,CACF,IAAM3E,EAAI+C,GAAOK,GAAIwB,CAAG,CAAC,EACnBC,EAAIzB,GAAIoB,EAAI,SAAS,EAAG,EAAE,CAAC,EACjC,GAAI,CAACM,GAAQD,EAAGjF,GAAKH,GAAgB,CAAC,EAAG,MAAO,GAChD,IAAMsF,EAAI3B,GAAIoB,EAAI,SAAS,GAAI,EAAE,CAAC,EAClC,GAAI,CAACM,GAAQC,EAAGnF,GAAKH,GAAgB,CAAC,EAAG,MAAO,GAEhD,IAAM8E,EAAIjB,GAAUZ,EAAG,QAAQmC,CAAC,EAAGzC,GAAapC,CAAC,EAAG8D,CAAC,EAE/CkB,EAAIrC,EAAK,eAAeoC,CAAC,EAAE,IAAI/E,EAAE,eAAe0C,EAAG,IAAI6B,CAAC,CAAC,CAAC,EAC1D,CAAE,EAAAvB,EAAG,EAAAjD,CAAC,EAAKiF,EAAE,SAAQ,EAE3B,MAAI,EAAAA,EAAE,IAAG,GAAM,CAACzC,GAAQxC,CAAC,GAAKiD,IAAM6B,EAEtC,MAAgB,CACd,MAAO,EACT,CACF,CAsCO,IAAMI,IAAwC,IAAK,CAGxD,IAAMC,EAAkB,CAACC,EAAOtB,GAAY,EAAU,IAC7CuB,GAAeD,EAAM1F,GAAgB,CAAC,EAG/CgC,GAAU,MAAM,gBAChB,SAAS4D,EAAOF,EAAiB,CAC/B,IAAM1B,EAAYyB,EAAgBC,CAAI,EACtC,MAAO,CAAE,UAAA1B,EAAW,UAAWD,GAAoBC,CAAS,CAAC,CAC/D,CACA,MAAO,CACL,OAAA4B,EACA,aAAc7B,GACd,KAAME,GACN,OAAQe,GACR,MAAOnC,GACP,MAAO,CACL,gBAAiB4C,EACjB,iBAAkBA,EAClB,WAAArD,GAGA,OAAAkB,GACA,aAAAX,GACA,gBAAAkD,GACA,gBAAAjC,GACA,IAAAkC,IAEF,QAAS,CACP,UAAW,GACX,UAAW,GACX,mBAAoB,GACpB,UAAW,GACX,KAAM,IAGZ,GAAE,EClRK,IAAMC,EAAoCA,GAM1C,IAAMC,EAAoCA,GCP1C,IAAMC,GAAyBA,GCPtC,IAAAC,GAAiB,SAwCV,IAAMC,KAAsB,GAAAC,SAAK,CACtC,KAAM,qBACN,MAAO,QAAQ,IAAI,WAAa,OAChC,UAOI,OACJ,WAAY,CACV,MAAQC,IACC,CAAE,MAAOA,EAAM,YAAY,CAAE,GAEtC,IAAMC,GAAiC,CAErC,GAAIA,GAAO,OAAOA,GAAQ,UAAY,QAASA,EAAK,CAClD,IAAMC,EAAS,CAAE,GAAGD,CAAI,EACxB,GAAIC,EAAO,eAAe,MAAO,CAC/B,IAAMC,EAAMD,EAAO,IACnBA,EAAO,IAAM,CACX,QAASC,EAAI,QACb,MAAOA,EAAI,MACX,KAAMA,EAAI,IACZ,CACF,CACA,OAAOD,CACT,CACA,OAAOD,CACT,CACF,CACF,CAAC,EC9BM,SAASG,GAAcC,EAAyB,CACrD,GAAI,CACF,MAAO,EAAQA,EAAO,MAAM,wBAAwB,CACtD,MAAQ,CACN,MAAO,EACT,CACF,CAqDO,SAASC,GAAcC,EAA2B,CACvD,OAAO,OAAO,KAAKA,CAAK,EAAE,SAAS,QAAQ,CAC7C,CAQO,SAASC,GAAcC,EAA4B,CACxD,GAAI,CAACC,GAAcD,CAAM,EACvB,MAAM,IAAI,MAAM,uBAAuB,EAEzC,OAAO,IAAI,WAAW,OAAO,KAAKA,EAAQ,QAAQ,CAAC,CACrD,CCvDA,IAAME,GAAY,SAAmC,CACnD,GAAI,OAAO,OAAW,KAAe,OAAO,OAC1C,OAAO,OAAO,OAEhB,GAAI,OAAO,OAAW,KAAgB,OAAkB,OACtD,OAAQ,OAAkB,OAE5B,GAAI,CACF,IAAMC,EAAe,KAAM,uCAC3B,GAAIA,EAAa,UACf,OAAOA,EAAa,SAExB,MAAQ,CACNC,EAAO,MAAM,2BAA2B,CAC1C,CAEA,MAAM,IAAI,MAAM,uCAAuC,CACzD,EAKMC,GAAN,KAAmB,CAIjB,aAAc,CAHdC,GAAA,KAAQ,iBAAsC,MAC9CA,GAAA,KAAQ,eAGN,KAAK,YAAc,KAAK,WAAW,CACrC,CAEA,MAAc,YAA4B,CACxC,KAAK,eAAiB,MAAMJ,GAAU,CACxC,CAEA,MAAc,mBAA2C,CAEvD,GADA,MAAM,KAAK,YACP,CAAC,KAAK,eACR,MAAM,IAAI,MAAM,uCAAuC,EAEzD,OAAO,KAAK,cACd,CAEA,MAAM,WAA6C,CAEjD,OADe,MAAM,KAAK,kBAAkB,GAC9B,MAChB,CAEA,MAAM,gBAAwGK,EAAsB,CAElI,OADe,MAAM,KAAK,kBAAkB,GAC9B,gBAAgBA,CAAK,CACrC,CACF,EAGaC,GAAe,IAAIH,GAGnBI,GAAcC,GAAQ,KACtBC,GAAyBD,GAAQ,OAmB9C,eAAsBE,IAAoC,CACxD,IAAMC,EAAkBC,GAAY,EAAE,EAChCC,EAAaC,EAAWH,CAAe,EAC7CA,EAAgB,KAAK,CAAC,EACtB,IAAMI,EAAY,MAAMC,GAAaH,CAAU,EAE/C,MAAO,CACL,WAAAA,EACA,UAAAE,CACF,CACF,CAKA,eAAsBC,GAAaH,EAA+C,CAChF,GAAI,CACF,IAAMF,EAAkBM,EAAWJ,CAAU,EACvCK,EAAiBC,GAAQ,aAAaR,CAAe,EAC3D,MAAO,CACL,IAAKG,EAAWI,CAAc,EAC9B,MAAOA,CACT,CACF,OAASE,EAAO,CACd,MAAAC,EAAO,MAAM,CAAE,MAAAD,CAAM,EAAG,0BAA0B,EAC5CA,CACR,CACF,CAKA,eAAsBE,GAAgBC,EAAoC,CACxE,GAAI,CAEF,OADsB,MAAMP,GAAaO,EAAQ,UAAU,GACtC,MAAQA,EAAQ,UAAU,GACjD,OAASH,EAAO,CACd,OAAAC,EAAO,MAAM,CAAE,MAAAD,CAAM,EAAG,6BAA6B,EAC9C,EACT,CACF,CAKO,SAASI,GAAYC,EAAwC,CAClE,IAAMC,EAAY,KAAK,MAAM,KAAK,IAAI,EAAI,GAAI,EAE9C,MAAO,CACL,GAAGD,EACH,WAAYA,EAAM,YAAcC,EAChC,KAAMD,EAAM,MAAQ,CAAC,EACrB,QAASA,EAAM,SAAW,GAC1B,KAAMA,EAAM,MAAQ,CACtB,CACF,CAKA,eAAsBE,GAAUF,EAAmBZ,EAA+C,CAChG,GAAI,CAEF,IAAMe,EAAa,KAAK,UAAU,CAChC,EACAH,EAAM,OACNA,EAAM,WACNA,EAAM,KACNA,EAAM,KACNA,EAAM,OACR,CAAC,EAGKI,EAAYC,GAAO,IAAI,YAAY,EAAE,OAAOF,CAAU,CAAC,EAGvDjB,EAAkBM,EAAWJ,CAAU,EACvCkB,EAAiBZ,GAAQ,KAAKU,EAAWlB,CAAe,EAG9D,MAAO,CACL,GAAGc,EACH,GAAIX,EAAWe,CAAS,EACxB,IAAKf,EAAWiB,CAAc,CAChC,CACF,OAASX,EAAO,CACd,MAAAC,EAAO,MAAM,CAAE,MAAAD,CAAM,EAAG,sBAAsB,EACxCA,CACR,CACF,CAOO,SAASY,GAAiBnB,EAA4B,CAC3D,IAAMF,EAAkBM,EAAWJ,CAAU,EACvCK,EAAiBC,GAAQ,aAAaR,CAAe,EAC3D,OAAOG,EAAWI,CAAc,CAClC,CAQA,eAAsBe,GACpBR,EACAZ,EAC2B,CAC3B,IAAMqB,EAAST,EAAM,QAAUO,GAAiBnB,CAAU,EACpDa,EAAYD,EAAM,YAAc,KAAK,MAAM,KAAK,IAAI,EAAI,GAAI,EAE5DU,EAAwB,CAC5B,KAAMV,EAAM,MAAQ,EACpB,WAAYC,EACZ,KAAMD,EAAM,MAAQ,CAAC,EACrB,QAASA,EAAM,SAAW,GAC1B,OAAAS,CACF,EAEA,OAAOP,GAAUQ,EAAWtB,CAAU,CACxC,CAKA,eAAsBuB,GAAgBX,EAA2C,CAC/E,GAAI,CAEF,IAAMG,EAAa,KAAK,UAAU,CAChC,EACAH,EAAM,OACNA,EAAM,WACNA,EAAM,KACNA,EAAM,KACNA,EAAM,OACR,CAAC,EAGKI,EAAYC,GAAO,IAAI,YAAY,EAAE,OAAOF,CAAU,CAAC,EAI7D,GADqBd,EAAWe,CAAS,IACpBJ,EAAM,GACzB,OAAAJ,EAAO,MAAM,mBAAmB,EACzB,GAIT,IAAMU,EAAiBd,EAAWQ,EAAM,GAAG,EACrCY,EAAcpB,EAAWQ,EAAM,MAAM,EAG3C,OAAON,GAAQ,OAAOY,EAAgBF,EAAWQ,CAAW,CAC9D,OAASjB,EAAO,CACd,OAAAC,EAAO,MAAM,CAAE,MAAAD,CAAM,EAAG,4BAA4B,EAC7C,EACT,CACF,CAKA,eAAsBkB,GACpBC,EACAC,EACAC,EACiB,CACjB,GAAI,CACF,IAAMC,EAAqB,OAAOF,GAAoB,SAAWA,EAAkBA,EAAgB,IAC7FG,EAAcC,GAAU,gBAAgB3B,EAAWwB,CAAa,EAAGxB,EAAWyB,CAAkB,CAAC,EACjGG,EAAUF,EAAY,MAAM,EAAG,EAAE,EAGjCG,EAAKlC,GAAY,EAAE,EACnBmC,EAAM,MAAMC,GAAa,UAAU,EAAE,KAAMC,GAAWA,EAAO,UACjE,MACAJ,EAAQ,OACR,CAAE,KAAM,UAAW,OAAQ,GAAI,EAC/B,GACA,CAAC,SAAS,CACZ,CAAC,EAGDA,EAAQ,KAAK,CAAC,EACdF,EAAY,KAAK,CAAC,EAGlB,IAAMO,EAAO,IAAI,YAAY,EAAE,OAAOX,CAAO,EACvCY,EAAY,MAAMH,GAAa,UAAU,EAAE,KAAMC,GAAWA,EAAO,QACvE,CAAE,KAAM,UAAW,GAAAH,CAAG,EACtBC,EACAG,EAAK,MACP,CAAC,EAGKE,EAAmBC,GAAc,IAAI,WAAWF,CAAS,CAAC,EAC1DG,EAAWD,GAAcP,CAAE,EAEjC,OAAOM,EAAmB,OAASE,CACrC,OAASlC,EAAO,CACd,MAAAC,EAAO,MAAM,CAAE,MAAAD,CAAM,EAAG,2BAA2B,EAC7CA,CACR,CACF,CAKA,eAAsBmC,GACpBC,EACAC,EACAC,EACiB,CACjB,GAAI,CACF,IAAMC,EAAkB,OAAOF,GAAiB,SAAWA,EAAeA,EAAa,IACjFd,EAAcC,GAAU,gBAAgB3B,EAAWyC,CAAgB,EAAGzC,EAAW0C,CAAe,CAAC,EACjGd,EAAUF,EAAY,MAAM,EAAG,EAAE,EAInCG,EACAc,EAEJ,GAAIJ,EAAiB,SAAS,MAAM,EAAG,CAErC,GAAM,CAACJ,EAAkBE,CAAQ,EAAIE,EAAiB,MAAM,MAAM,EAClEI,EAAaC,GAAcT,CAAgB,EAC3CN,EAAKe,GAAcP,CAAQ,CAC7B,KAAO,CAEL,IAAMH,EAAYlC,EAAWuC,CAAgB,EAC7CV,EAAKK,EAAU,MAAM,EAAG,EAAE,EAC1BS,EAAaT,EAAU,MAAM,EAAE,CACjC,CAEA,IAAMJ,EAAM,MAAMC,GAAa,UAAU,EAAE,KAAMC,GAAWA,EAAO,UACjE,MACAJ,EAAQ,OACR,CAAE,KAAM,UAAW,OAAQ,GAAI,EAC/B,GACA,CAAC,SAAS,CACZ,CAAC,EAGDA,EAAQ,KAAK,CAAC,EACdF,EAAY,KAAK,CAAC,EAElB,IAAMmB,EAAY,MAAMd,GAAa,UAAU,EAAE,KAAMC,GAAWA,EAAO,QACvE,CAAE,KAAM,UAAW,GAAAH,CAAG,EACtBC,EACAa,EAAW,MACb,CAAC,EAED,OAAO,IAAI,YAAY,EAAE,OAAOE,CAAS,CAC3C,OAAS1C,EAAO,CACd,MAAAC,EAAO,MAAM,CAAE,MAAAD,CAAM,EAAG,2BAA2B,EAC7CA,CACR,CACF,CCnYA,SAAS2C,GAAgBC,EAAoC,CAC3D,OAAO,OAAOA,GAAW,SAAWA,EAASA,EAAO,GACtD,CAEA,SAASC,GAAWC,EAAyB,CAC3C,OAAO,IAAI,WAAWA,EAAI,MAAM,SAAS,EAAG,IAAIC,GAAQ,SAASA,EAAM,EAAE,CAAC,CAAC,CAC7E,CAeO,SAASC,GAAgBC,EAA2C,CACzE,GAAI,CACF,IAAMC,EAAa,KAAK,UAAU,CAChC,EACAP,GAAgBM,EAAM,MAAM,EAC5BA,EAAM,WACNA,EAAM,KACNA,EAAM,KACNA,EAAM,OACR,CAAC,EACKE,EAAOC,EAAWC,GAAO,IAAI,YAAY,EAAE,OAAOH,CAAU,CAAC,CAAC,EACpE,MAAO,CACL,QAASC,IAASF,EAAM,GACxB,MAAOE,IAASF,EAAM,GAAK,OAAY,kBACzC,CACF,OAASK,EAAO,CACd,OAAAC,EAAO,MAAM,CAAE,MAAAD,CAAM,EAAG,6BAA6B,EAC9C,CACL,QAAS,GACT,MAAO,6BACT,CACF,CACF,CAeO,SAASE,GAAuBP,EAA2C,CAChF,GAAI,CAEF,IAAMC,EAAa,KAAK,UAAU,CAChC,EACAP,GAAgBM,EAAM,MAAM,EAC5BA,EAAM,WACNA,EAAM,KACNA,EAAM,KACNA,EAAM,OACR,CAAC,EACKE,EAAOE,GAAO,IAAI,YAAY,EAAE,OAAOH,CAAU,CAAC,EAClDO,EAAYd,GAAgBM,EAAM,MAAM,EACxCS,EAAcb,GAAWY,CAAS,EAClCE,EAAUC,GAAQ,OAAOX,EAAM,IAAKE,EAAMO,CAAW,EAE3D,MAAO,CACL,QAAAC,EACA,MAAOA,EAAU,OAAY,mBAC/B,CACF,OAASL,EAAO,CACd,OAAAC,EAAO,MAAM,CAAE,MAAAD,CAAM,EAAG,oCAAoC,EACrD,CACL,QAAS,GACT,MAAO,oCACT,CACF,CACF,CAeO,SAASO,GAAcZ,EAA2C,CAEvE,IAAMa,EAAiBC,GAAkBd,CAAK,EAC9C,GAAI,CAACa,EAAe,QAClB,OAAOA,EAIT,IAAME,EAAehB,GAAgBC,CAAK,EAC1C,OAAKe,EAAa,QAKXR,GAAuBP,CAAK,EAJ1Be,CAKX,CAeO,SAASC,GAAoBhB,EAA2C,CAC7E,GAAI,CAEF,IAAMa,EAAiBC,GAAkBd,CAAK,EAC9C,GAAI,CAACa,EAAe,QAClB,OAAOA,EAIT,IAAML,EAAYd,GAAgBM,EAAM,MAAM,EAG9C,MAAI,CAACQ,GAAa,OAAOA,GAAc,UAAYA,EAAU,SAAW,GAC/D,CACL,QAAS,GACT,MAAO,2BACT,EAIE,CAACR,EAAM,KAAO,OAAOA,EAAM,KAAQ,UAAYA,EAAM,IAAI,SAAW,IAC/D,CACL,QAAS,GACT,MAAO,0BACT,EAIE,CAACA,EAAM,IAAM,OAAOA,EAAM,IAAO,UAAYA,EAAM,GAAG,SAAW,GAC5D,CACL,QAAS,GACT,MAAO,yBACT,EAGK,CAAE,QAAS,EAAK,CACzB,OAASK,EAAO,CACd,OAAAC,EAAO,MAAM,CAAE,MAAAD,CAAM,EAAG,iCAAiC,EAClD,CACL,QAAS,GACT,MAAO,iCACT,CACF,CACF,CAOO,SAASS,GAAkBd,EAAwD,CAExF,GAAI,CAACA,GAAS,OAAOA,GAAU,SAC7B,MAAO,CAAE,QAAS,GAAO,MAAO,yBAA0B,EAI5D,GAAI,OAAOA,EAAM,MAAS,UAAYA,EAAM,KAAO,EACjD,MAAO,CAAE,QAAS,GAAO,MAAO,2CAA4C,EAI9E,IAAMiB,EAAM,KAAK,MAAM,KAAK,IAAI,EAAI,GAAI,EACxC,GAAI,OAAOjB,EAAM,YAAe,UAAYA,EAAM,WAAaiB,EAAM,GACnE,MAAO,CAAE,QAAS,GAAO,MAAO,yCAA0C,EAI5E,GAAI,OAAOjB,EAAM,SAAY,SAC3B,MAAO,CAAE,QAAS,GAAO,MAAO,gCAAiC,EAInE,GAAI,CAACA,EAAM,OACT,MAAO,CAAE,QAAS,GAAO,MAAO,oBAAqB,EAIvD,IAAMQ,EAAYd,GAAgBM,EAAM,MAAM,EAC9C,GAAI,OAAOQ,GAAc,UAAY,CAAC,iBAAiB,KAAKA,CAAS,EACnE,MAAO,CAAE,QAAS,GAAO,MAAO,2BAA4B,EAI9D,GAAI,CAAC,MAAM,QAAQR,EAAM,IAAI,EAC3B,MAAO,CAAE,QAAS,GAAO,MAAO,6BAA8B,EAGhE,QAAWkB,KAAOlB,EAAM,KAAM,CAC5B,GAAI,CAAC,MAAM,QAAQkB,CAAG,EACpB,MAAO,CAAE,QAAS,GAAO,MAAO,2BAA4B,EAE9D,GAAIA,EAAI,SAAW,EACjB,MAAO,CAAE,QAAS,GAAO,MAAO,4BAA6B,EAE/D,GAAI,OAAOA,EAAI,CAAC,GAAM,SACpB,MAAO,CAAE,QAAS,GAAO,MAAO,iCAAkC,CAEtE,CAEA,MAAO,CAAE,QAAS,EAAK,CACzB,CAeO,SAASC,GAAeC,EAAuC,CACpE,GAAI,CAEF,GAAI,CAACA,GAAU,OAAOA,GAAW,SAC/B,MAAO,CAAE,QAAS,GAAO,MAAO,0BAA2B,EAI7D,GAAIA,EAAO,MAAQ,CAAC,MAAM,QAAQA,EAAO,GAAG,GAAK,CAACA,EAAO,IAAI,MAAMC,GAAM,OAAOA,GAAO,QAAQ,GAC7F,MAAO,CAAE,QAAS,GAAO,MAAO,wCAAyC,EAI3E,GAAID,EAAO,UAAY,CAAC,MAAM,QAAQA,EAAO,OAAO,GAAK,CAACA,EAAO,QAAQ,MAAME,GAAU,OAAOA,GAAW,QAAQ,GACjH,MAAO,CAAE,QAAS,GAAO,MAAO,4CAA6C,EAI/E,GAAIF,EAAO,MAAO,CAChB,GAAI,CAAC,MAAM,QAAQA,EAAO,KAAK,EAC7B,MAAO,CAAE,QAAS,GAAO,MAAO,0CAA2C,EAE7E,GAAI,CAACA,EAAO,MAAM,MAAMG,GAAQ,OAAOA,GAAS,UAAY,OAAO,UAAUA,CAAI,GAAKA,GAAQ,CAAC,EAC7F,MAAO,CAAE,QAAS,GAAO,MAAO,4CAA6C,CAEjF,CAGA,OAAIH,EAAO,OAAS,OAAOA,EAAO,OAAU,SACnC,CAAE,QAAS,GAAO,MAAO,+BAAgC,EAE9DA,EAAO,OAAS,OAAOA,EAAO,OAAU,SACnC,CAAE,QAAS,GAAO,MAAO,+BAAgC,EAI9DA,EAAO,OAAS,OAAOA,EAAO,OAAU,SACnC,CAAE,QAAS,GAAO,MAAO,+BAAgC,EAI9DA,EAAO,QAAU,OAAOA,EAAO,QAAW,SACrC,CAAE,QAAS,GAAO,MAAO,gCAAiC,EAG5D,CAAE,QAAS,EAAK,CACzB,OAASf,EAAO,CACd,OAAAC,EAAO,MAAM,CAAE,MAAAD,CAAM,EAAG,2BAA2B,EAC5C,CAAE,QAAS,GAAO,MAAO,2BAA4B,CAC9D,CACF,CAeO,SAASmB,GAAqBC,EAAmD,CACtF,GAAI,CAEF,GAAI,CAACA,GAAgB,OAAOA,GAAiB,SAC3C,MAAO,CAAE,QAAS,GAAO,MAAO,gCAAiC,EAInE,GAAI,CAACA,EAAa,IAAM,OAAOA,EAAa,IAAO,SACjD,MAAO,CAAE,QAAS,GAAO,MAAO,oCAAqC,EAIvE,GAAI,CAAC,MAAM,QAAQA,EAAa,OAAO,EACrC,MAAO,CAAE,QAAS,GAAO,MAAO,uCAAwC,EAI1E,QAAWL,KAAUK,EAAa,QAAS,CACzC,IAAMC,EAAmBP,GAAeC,CAAM,EAC9C,GAAI,CAACM,EAAiB,QACpB,OAAOA,CAEX,CAEA,MAAO,CAAE,QAAS,EAAK,CACzB,OAASrB,EAAO,CACd,OAAAC,EAAO,MAAM,CAAE,MAAAD,CAAM,EAAG,iCAAiC,EAClD,CAAE,QAAS,GAAO,MAAO,iCAAkC,CACpE,CACF,CAeO,SAASsB,GAAiBC,EAAoC,CAEnE,GAAI,CAAC,MAAM,QAAQA,CAAO,EACxB,MAAO,CACL,QAAS,GACT,MAAO,0CACT,EAIF,GAAIA,EAAQ,SAAW,EACrB,MAAO,CACL,QAAS,GACT,MAAO,wCACT,EAIF,IAAMC,EAAOD,EAAQ,CAAC,EACtB,GAAI,CAAC,OAAO,OAAOE,EAAgB,EAAE,SAASD,CAAwB,EACpE,MAAO,CACL,QAAS,GACT,MAAO,yBAAyBA,CAAI,EACtC,EAIF,OAAQA,EAAM,CACZ,YACE,OAAID,EAAQ,SAAW,EACd,CACL,QAAS,GACT,MAAO,4CACT,EAEKZ,GAAoBY,EAAQ,CAAC,CAAqB,EAE3D,aACE,OAAIA,EAAQ,SAAW,GAAK,OAAOA,EAAQ,CAAC,GAAM,SACzC,CACL,QAAS,GACT,MAAO,mEACT,EAEK,CAAE,QAAS,EAAK,EAEzB,SACE,OAAIA,EAAQ,SAAW,GACnB,OAAOA,EAAQ,CAAC,GAAM,UACtB,OAAOA,EAAQ,CAAC,GAAM,WACtB,OAAOA,EAAQ,CAAC,GAAM,SACjB,CACL,QAAS,GACT,MAAO,4EACT,EAEK,CAAE,QAAS,EAAK,EAEzB,WACE,OAAIA,EAAQ,SAAW,GAAK,OAAOA,EAAQ,CAAC,GAAM,SACzC,CACL,QAAS,GACT,MAAO,kEACT,EAEK,CAAE,QAAS,EAAK,EAEzB,UACE,GAAIA,EAAQ,OAAS,EACnB,MAAO,CACL,QAAS,GACT,MAAO,2CACT,EAEF,GAAI,OAAOA,EAAQ,CAAC,GAAM,SACxB,MAAO,CACL,QAAS,GACT,MAAO,gDACT,EAGF,QAASG,EAAI,EAAGA,EAAIH,EAAQ,OAAQG,IAAK,CACvC,IAAMC,EAAeb,GAAeS,EAAQG,CAAC,CAAgB,EAC7D,GAAI,CAACC,EAAa,QAChB,OAAOA,CAEX,CACA,MAAO,CAAE,QAAS,EAAK,EAEzB,YACE,OAAIJ,EAAQ,SAAW,GAAK,OAAOA,EAAQ,CAAC,GAAM,SACzC,CACL,QAAS,GACT,MAAO,mEACT,EAEK,CAAE,QAAS,EAAK,EAEzB,WACE,OAAIA,EAAQ,SAAW,EACd,CACL,QAAS,GACT,MAAO,2CACT,EAEKZ,GAAoBY,EAAQ,CAAC,CAAqB,EAE3D,QACE,MAAO,CACL,QAAS,GACT,MAAO,6BAA6BC,CAAI,EAC1C,CACJ,CACF,CClcO,SAASI,GAAeC,EAA2B,CACxD,OAAO,KAAK,UAAU,CACpB,EACAA,EAAM,OACNA,EAAM,WACNA,EAAM,KACNA,EAAM,KACNA,EAAM,OACR,CAAC,CACH,CAOA,eAAsBC,GAAaD,EAAoC,CACrE,GAAI,CACF,IAAME,EAAaH,GAAeC,CAAK,EACjCG,EAAO,MAAMC,GAAO,IAAI,YAAY,EAAE,OAAOF,CAAU,CAAC,EAC9D,OAAOG,GAAWF,CAAI,CACxB,OAASG,EAAO,CACd,MAAAC,EAAO,MAAM,CAAE,MAAAD,CAAM,EAAG,0BAA0B,EAC5CA,CACR,CACF,CCUO,SAASE,GAAiBC,EAAoC,CACnE,OAAOC,GAAaD,CAAK,CAC3B,CCjFA,IAAAE,GAAA,GAAAC,GAAAD,GAAA,yBAAAE,GAAA,mBAAAC,GAAA,mBAAAC,GAAA,yBAAAF,KAuBA,IAAMG,GAAY,SAAmC,CACnD,GAAI,OAAO,OAAW,KAAe,OAAO,OAC1C,OAAO,OAAO,OAEhB,GAAI,OAAO,OAAW,KAAgB,OAAkB,OACtD,OAAQ,OAAkB,OAE5B,GAAI,CACF,IAAMC,EAAe,KAAM,uCAC3B,GAAIA,EAAa,UACf,OAAOA,EAAa,SAExB,MAAQ,CACNC,EAAO,MAAM,2BAA2B,CAC1C,CAEA,MAAM,IAAI,MAAM,uCAAuC,CACzD,EAEMC,GAAN,KAA2B,CAIzB,aAAc,CAHdC,GAAA,KAAQ,iBAAsC,MAC9CA,GAAA,KAAQ,eAGN,KAAK,YAAc,KAAK,WAAW,CACrC,CAEA,MAAc,YAA4B,CACxC,KAAK,eAAiB,MAAMJ,GAAU,CACxC,CAEA,MAAc,mBAA2C,CAEvD,GADA,MAAM,KAAK,YACP,CAAC,KAAK,eACR,MAAM,IAAI,MAAM,uCAAuC,EAEzD,OAAO,KAAK,cACd,CAEA,MAAM,WAA6C,CAEjD,OADe,MAAM,KAAK,kBAAkB,GAC9B,MAChB,CAEA,MAAM,gBAAwGK,EAAsB,CAElI,OADe,MAAM,KAAK,kBAAkB,GAC9B,gBAAgBA,CAAK,CACrC,CACF,EAEMC,GAAa,IAAIH,GAavB,eAAsBI,GACpBC,EACAC,EACAC,EACiB,CACjB,GAAI,CACF,GAAI,CAACF,GAAW,CAACC,GAAiB,CAACC,EACjC,MAAM,IAAI,MAAM,0BAA0B,EAI5C,GAAI,CAAC,kBAAkB,KAAKD,CAAa,EACvC,MAAM,IAAI,MAAM,4BAA4B,EAI9C,IAAME,EAAYD,EAAgB,WAAW,IAAI,GAAKA,EAAgB,WAAW,IAAI,EACjFA,EACA,KAAOA,EAGLE,EAAcC,GAAU,gBAAgBJ,EAAeE,CAAS,EAChEG,EAAUF,EAAY,MAAM,EAAG,EAAE,EAGjCG,EAAY,MAAO,MAAMT,GAAW,UAAU,GAAG,UACrD,MACAQ,EAAQ,OACR,CAAE,KAAM,UAAW,OAAQ,GAAI,EAC/B,GACA,CAAC,SAAS,CACZ,EAGAA,EAAQ,KAAK,CAAC,EACdF,EAAY,KAAK,CAAC,EAGlB,IAAMI,EAAK,IAAI,WAAW,EAAE,EAC5B,MAAMV,GAAW,gBAAgBU,CAAE,EAEnC,IAAMC,EAAU,IAAI,YAAY,EAAE,OAAOT,CAAO,EAC1CU,EAAY,MAAO,MAAMZ,GAAW,UAAU,GAAG,QACrD,CAAE,KAAM,UAAW,GAAAU,CAAG,EACtBD,EACAE,EAAQ,MACV,EAGME,EAAmBC,GAAc,IAAI,WAAWF,CAAS,CAAC,EAC1DG,EAAWD,GAAcJ,CAAE,EAEjC,OAAOG,EAAmB,OAASE,CACrC,OAASC,EAAO,CACd,MAAApB,EAAO,MAAM,CAAE,MAAAoB,CAAM,EAAG,2BAA2B,EAC7CA,CACR,CACF,CASA,eAAsBC,GACpBC,EACAC,EACAC,EACiB,CACjB,GAAI,CACF,GAAI,CAACF,GAAoB,CAACC,GAAoB,CAACC,EAC7C,MAAM,IAAI,MAAM,0BAA0B,EAI5C,GAAI,CAAC,kBAAkB,KAAKD,CAAgB,EAC1C,MAAM,IAAI,MAAM,4BAA4B,EAI9C,IAAMd,EAAYe,EAAa,WAAW,IAAI,GAAKA,EAAa,WAAW,IAAI,EAC3EA,EACA,KAAOA,EAGLd,EAAcC,GAAU,gBAAgBY,EAAkBd,CAAS,EACnEG,EAAUF,EAAY,MAAM,EAAG,EAAE,EAGjCG,EAAY,MAAO,MAAMT,GAAW,UAAU,GAAG,UACrD,MACAQ,EAAQ,OACR,CAAE,KAAM,UAAW,OAAQ,GAAI,EAC/B,GACA,CAAC,SAAS,CACZ,EAGAA,EAAQ,KAAK,CAAC,EACdF,EAAY,KAAK,CAAC,EAIlB,IAAII,EACAW,EAEJ,GAAIH,EAAiB,SAAS,MAAM,EAAG,CAErC,GAAM,CAACL,EAAkBE,CAAQ,EAAIG,EAAiB,MAAM,MAAM,EAClEG,EAAaC,GAAcT,CAAgB,EAC3CH,EAAKY,GAAcP,CAAQ,CAC7B,KAAO,CAEL,IAAMH,EAAYW,EAAWL,CAAgB,EAC7CR,EAAKE,EAAU,MAAM,EAAG,EAAE,EAC1BS,EAAaT,EAAU,MAAM,EAAE,CACjC,CAGA,IAAMY,EAAY,MAAO,MAAMxB,GAAW,UAAU,GAAG,QACrD,CAAE,KAAM,UAAW,GAAAU,CAAG,EACtBD,EACAY,EAAW,MACb,EAEA,OAAO,IAAI,YAAY,EAAE,OAAOG,CAAS,CAC3C,OAASR,EAAO,CACd,MAAApB,EAAO,MAAM,CAAE,MAAAoB,CAAM,EAAG,2BAA2B,EAC7CA,CACR,CACF,CAQO,SAASS,GACdC,EACAC,EACc,CACd,GAAI,CACF,GAAI,CAACD,GAAc,CAACC,EAClB,MAAM,IAAI,MAAM,0BAA0B,EAI5C,GAAI,CAAC,kBAAkB,KAAKD,CAAU,EACpC,MAAM,IAAI,MAAM,4BAA4B,EAI9C,IAAMrB,EAAYsB,EAAU,WAAW,IAAI,GAAKA,EAAU,WAAW,IAAI,EACrEA,EACA,KAAOA,EAIX,MAAO,CAAE,aADWpB,GAAU,gBAAgBmB,EAAYrB,CAAS,EAChC,MAAM,EAAG,EAAE,CAAE,CAClD,OAASW,EAAO,CACd,MAAApB,EAAO,MAAM,CAAE,MAAAoB,CAAM,EAAG,kCAAkC,EACpDA,CACR,CACF,CC5PA,IAAAY,GAAA,GAAAC,GAAAD,GAAA,sBAAAE,GAAA,gBAAAC,GAAA,iBAAAC,GAAA,mBAAAC,GAAA,cAAAC,GAAA,kBAAAC,GAAA,oBAAAC,KAiBO,SAASC,GAAYC,EAMb,CACb,GAAM,CACJ,KAAAC,EACA,QAAAC,EACA,KAAAC,EAAO,CAAC,EACR,WAAAC,EAAa,KAAK,MAAM,KAAK,IAAI,EAAI,GAAI,EACzC,OAAAC,EAAS,EACX,EAAIL,EAEJ,MAAO,CACL,KAAAC,EACA,QAAAC,EACA,KAAAC,EACA,WAAAC,EACA,OAAAC,CACF,CACF,CAOO,SAASC,GAAeC,EAA2B,CACxD,OAAO,KAAK,UAAU,CACpB,EACAA,EAAM,OACNA,EAAM,WACNA,EAAM,KACNA,EAAM,KACNA,EAAM,OACR,CAAC,CACH,CAOA,eAAsBC,GAAaD,EAAoC,CACrE,GAAI,CACF,IAAME,EAAaH,GAAeC,CAAK,EACjCG,EAAOC,GAAO,IAAI,YAAY,EAAE,OAAOF,CAAU,CAAC,EACxD,OAAOG,EAAWF,CAAI,CACxB,OAASG,EAAO,CACd,MAAAC,EAAO,MAAM,CAAE,MAAAD,CAAM,EAAG,0BAA0B,EAC5CA,CACR,CACF,CAQA,eAAsBE,GACpBR,EACAS,EAC2B,CAC3B,GAAI,CACF,IAAMN,EAAO,MAAMF,GAAaD,CAAK,EAC/BU,EAAMC,GAAQ,KAAKC,EAAWT,CAAI,EAAGM,CAAU,EAErD,MAAO,CACL,GAAGT,EACH,GAAIG,EACJ,IAAKE,EAAWK,CAAG,CACrB,CACF,OAASJ,EAAO,CACd,MAAAC,EAAO,MAAM,CAAE,MAAAD,CAAM,EAAG,sBAAsB,EACxCA,CACR,CACF,CAOO,SAASO,GAAgBb,EAAkC,CAChE,GAAI,CAEF,IAAMc,EAAaC,GAAiBf,CAAK,EACzC,OAAIA,EAAM,KAAOc,EACR,GAIFH,GAAQ,OACbC,EAAWZ,EAAM,GAAG,EACpBY,EAAWZ,EAAM,EAAE,EACnBY,EAAWZ,EAAM,MAAM,CACzB,CACF,OAASM,EAAO,CACd,OAAAC,EAAO,MAAM,CAAE,MAAAD,CAAM,EAAG,4BAA4B,EAC7C,EACT,CACF,CAOO,SAASS,GAAiBf,EAA2B,CAC1D,IAAME,EAAaH,GAAeC,CAAK,EACjCG,EAAOC,GAAO,IAAI,YAAY,EAAE,OAAOF,CAAU,CAAC,EACxD,OAAOG,EAAWF,CAAI,CACxB,CAOO,SAASa,GAAchB,EAA4B,CACxD,GAAI,CAKF,GAJI,OAAOA,EAAM,SAAY,UACzB,OAAOA,EAAM,YAAe,UAC5B,OAAOA,EAAM,MAAS,UACtB,CAAC,MAAM,QAAQA,EAAM,IAAI,GACzB,OAAOA,EAAM,QAAW,SAAU,MAAO,GAG7C,QAAWiB,KAAOjB,EAAM,KAGtB,GAFI,CAAC,MAAM,QAAQiB,CAAG,GAClBA,EAAI,SAAW,GACf,OAAOA,EAAI,CAAC,GAAM,SAAU,MAAO,GAGzC,MAAO,EACT,OAASX,EAAO,CACd,OAAAC,EAAO,MAAM,CAAE,MAAAD,CAAM,EAAG,0BAA0B,EAC3C,EACT,CACF,CC/JA,IAAAY,GAAA,GAAAC,GAAAD,GAAA,YAAAE,GAAA,gBAAAC,GAAA,iBAAAC,GAAA,eAAAC,GAAA,mBAAAC,GAAA,eAAAC,GAAA,iBAAAC,GAAA,eAAAC,KAKA,IAAAC,GAAuB,SACvBC,GAAuB,SAIjBC,GAAkC,CAAC,OAAQ,OAAQ,OAAQ,WAAY,SAAU,QAAS,QAAQ,EAYlGC,GAAY,CAChB,QAAS,EACT,MAAO,EACP,OAAQ,EACR,KAAM,EACN,WAAY,CACd,EAQO,SAASN,GAAWO,EAAwB,CACjDC,GAAkBD,EAAQ,EAAE,EAC5B,IAAME,EAAO,UAAO,KAAKF,EAAQ,KAAK,EAChCG,EAAQ,UAAO,QAAQD,CAAI,EACjC,OAAO,UAAO,OAAO,OAAQC,EAAO,GAAI,CAC1C,CAQO,SAASR,GAAWS,EAAyB,CAClDH,GAAkBG,EAAS,EAAE,EAC7B,IAAMF,EAAO,UAAO,KAAKE,EAAS,KAAK,EACjCD,EAAQ,UAAO,QAAQD,CAAI,EACjC,OAAO,UAAO,OAAO,OAAQC,EAAO,GAAI,CAC1C,CAQO,SAASZ,GAAWc,EAAyB,CAClDJ,GAAkBI,EAAS,EAAE,EAC7B,IAAMH,EAAO,UAAO,KAAKG,EAAS,KAAK,EACjCF,EAAQ,UAAO,QAAQD,CAAI,EACjC,OAAO,UAAO,OAAO,OAAQC,EAAO,GAAI,CAC1C,CASO,SAASX,GAAeQ,EAAgBM,EAA2B,CACxEL,GAAkBD,EAAQ,EAAE,EACxBM,GACFA,EAAO,QAAQC,EAAgB,EAGjC,IAAML,EAAOM,GAAU,CACrB,KAAM,WACN,KAAMR,EACN,OAAAM,CACF,CAAC,EACD,OAAO,UAAO,OAAO,WAAYJ,EAAM,GAAI,CAC7C,CAWO,SAASZ,GACde,EACAC,EACAG,EACAC,EACQ,CAQR,GAPAT,GAAkBI,EAAS,EAAE,EACzBC,GACFA,EAAO,QAAQC,EAAgB,EAE7BE,GACFR,GAAkBQ,EAAQ,EAAE,EAE1BC,IAAS,QAAa,CAAC,OAAO,UAAUA,CAAI,EAC9C,MAAM,IAAI,MAAM,oBAAoB,EAGtC,IAAMR,EAAOM,GAAU,CACrB,KAAM,SACN,KAAMH,EACN,OAAAC,EACA,OAAAG,EACA,KAAAC,CACF,CAAC,EACD,OAAO,UAAO,OAAO,SAAUR,EAAM,GAAI,CAC3C,CAWO,SAASb,GACdW,EACAU,EACAC,EACAL,EACQ,CAER,GADAL,GAAkBD,EAAQ,EAAE,EACxB,CAAC,OAAO,UAAUU,CAAI,EACxB,MAAM,IAAI,MAAM,oBAAoB,EAEtC,GAAI,CAACC,EACH,MAAM,IAAI,MAAM,wBAAwB,EAEtCL,GACFA,EAAO,QAAQC,EAAgB,EAGjC,IAAML,EAAOM,GAAU,CACrB,KAAM,QACN,KAAMR,EACN,KAAAU,EACA,WAAAC,EACA,OAAAL,CACF,CAAC,EACD,OAAO,UAAO,OAAO,QAASJ,EAAM,GAAI,CAC1C,CAQO,SAASR,GAAakB,EAAqB,CAChDL,GAAiBK,CAAG,EACpB,IAAMV,EAAO,UAAO,KAAKU,EAAK,MAAM,EAC9BT,EAAQ,UAAO,QAAQD,CAAI,EACjC,OAAO,UAAO,OAAO,SAAUC,EAAO,GAAI,CAC5C,CAQO,SAASf,GAAOyB,EAAwB,CAC7C,GAAI,CAACA,EAAI,SAAS,GAAG,EACnB,MAAM,IAAI,MAAM,uBAAuB,EAGzC,IAAMC,EAASD,EAAI,MAAM,GAAG,EAAE,CAAC,EAAE,YAAY,EAC7C,GAAI,CAACf,GAAe,SAASgB,CAAuB,EAClD,MAAM,IAAI,MAAM,gBAAgB,EAGlC,GAAI,CACF,IAAMC,EAAU,UAAO,OAAOF,EAAK,GAAI,EACjCX,EAAO,UAAO,KAAK,UAAO,UAAUa,EAAQ,KAAK,CAAC,EAGpDH,EAEAI,EAEJ,OAAQD,EAAQ,OAAQ,CACtB,IAAK,OACL,IAAK,OACL,IAAK,OACH,OAAAd,GAAkBC,EAAK,SAAS,KAAK,EAAG,EAAE,EACnC,CACL,KAAMa,EAAQ,OACd,KAAMb,EAAK,SAAS,KAAK,CAC3B,EACF,IAAK,SACH,OAAAU,EAAMV,EAAK,SAAS,MAAM,EAC1BK,GAAiBK,CAAG,EACb,CACL,KAAM,SACN,KAAMA,CACR,EACF,IAAK,WACL,IAAK,SACL,IAAK,QACH,OAAAI,EAAcC,GAAUF,EAAQ,OAAyBb,CAAI,EACtDc,EACT,QACE,MAAM,IAAI,MAAM,gBAAgB,CACpC,CACF,OAASE,EAAgB,CACvB,MAAIA,aAAiB,MACbA,EAEF,IAAI,MAAM,uBAAuB,CACzC,CACF,CAIA,SAASjB,GAAkBY,EAAaM,EAAuB,CAC7D,GAAI,CAAC,iBAAiB,KAAKN,CAAG,EAC5B,MAAM,IAAI,MAAM,oBAAoB,EAEtC,GAAIM,GAAUN,EAAI,SAAWM,EAC3B,MAAM,IAAI,MAAM,uCAAuCA,CAAM,GAAG,CAEpE,CAEA,SAASZ,GAAiBK,EAAmB,CAC3C,GAAI,CACF,IAAMQ,EAAS,IAAI,IAAIR,CAAG,EAC1B,GAAI,CAAC,CAAC,MAAO,MAAM,EAAE,SAASQ,EAAO,QAAQ,EAC3C,MAAM,IAAI,MAAM,4BAA4B,CAEhD,MAAQ,CACN,MAAM,IAAI,MAAM,mBAAmB,CACrC,CACF,CAEA,SAASZ,GAAUN,EAA2B,CAC5C,IAAMmB,EAAmB,CAAC,EAGpBC,EAAQ,UAAO,KAAKpB,EAAK,KAAM,KAAK,EAK1C,GAJAmB,EAAO,KAAKtB,GAAU,QAASuB,EAAM,MAAM,EAC3CD,EAAO,KAAK,GAAGC,CAAK,EAGhBpB,EAAK,QAAQ,OACf,QAAWqB,KAASrB,EAAK,OAAQ,CAC/B,IAAMsB,EAAa,UAAO,KAAKD,EAAO,MAAM,EAC5CF,EAAO,KAAKtB,GAAU,MAAOyB,EAAW,MAAM,EAC9CH,EAAO,KAAK,GAAGG,CAAU,CAC3B,CAIF,GAAItB,EAAK,OAAQ,CACf,IAAMuB,EAAc,UAAO,KAAKvB,EAAK,OAAQ,KAAK,EAClDmB,EAAO,KAAKtB,GAAU,OAAQ0B,EAAY,MAAM,EAChDJ,EAAO,KAAK,GAAGI,CAAW,CAC5B,CAGA,GAAIvB,EAAK,OAAS,OAAW,CAC3B,IAAMwB,EAAY,UAAO,MAAM,CAAC,EAChCA,EAAU,cAAcxB,EAAK,IAAI,EACjCmB,EAAO,KAAKtB,GAAU,KAAM2B,EAAU,MAAM,EAC5CL,EAAO,KAAK,GAAGK,CAAS,CAC1B,CAGA,GAAIxB,EAAK,WAAY,CACnB,IAAMyB,EAAkB,UAAO,KAAKzB,EAAK,WAAY,MAAM,EAC3DmB,EAAO,KAAKtB,GAAU,WAAY4B,EAAgB,MAAM,EACxDN,EAAO,KAAK,GAAGM,CAAe,CAChC,CAEA,OAAO,UAAO,QAAQ,UAAO,KAAKN,CAAM,CAAC,CAC3C,CAEA,SAASJ,GAAUH,EAAuBZ,EAAyB,CACjE,IAAMmB,EAAoB,CACxB,KAAMP,EACN,KAAM,GACN,OAAQ,CAAC,CACX,EAEIc,EAAI,EAEJL,EAEJ,KAAOK,EAAI1B,EAAK,QAAQ,CACtB,IAAM2B,EAAO3B,EAAK0B,CAAC,EACbT,EAASjB,EAAK0B,EAAI,CAAC,EAEzB,GAAIA,EAAI,EAAIT,EAASjB,EAAK,OACxB,MAAM,IAAI,MAAM,kBAAkB,EAGpC,IAAM4B,EAAQ5B,EAAK,MAAM0B,EAAI,EAAGA,EAAI,EAAIT,CAAM,EAE9C,OAAQU,EAAM,CACZ,KAAK9B,GAAU,QACbsB,EAAO,KAAOS,EAAM,SAAS,KAAK,EAClC7B,GAAkBoB,EAAO,KAAM,EAAE,EACjC,MACF,KAAKtB,GAAU,MACbwB,EAAQO,EAAM,SAAS,MAAM,EAC7BvB,GAAiBgB,CAAK,EACtBF,EAAO,OAASA,EAAO,QAAU,CAAC,EAClCA,EAAO,OAAO,KAAKE,CAAK,EACxB,MACF,KAAKxB,GAAU,OACbsB,EAAO,OAASS,EAAM,SAAS,KAAK,EACpC7B,GAAkBoB,EAAO,OAAQ,EAAE,EACnC,MACF,KAAKtB,GAAU,KACbsB,EAAO,KAAOS,EAAM,aAAa,EACjC,MACF,KAAK/B,GAAU,WACbsB,EAAO,WAAaS,EAAM,SAAS,MAAM,EACzC,MACF,QAEE,KACJ,CAEAF,GAAK,EAAIT,CACX,CAEA,OAAOE,CACT,CC3VA,IAAAU,GAAA,GAAAC,GAAAD,GAAA,sBAAAE,GAAA,8BAAAC,GAAA,qBAAAC,GAAA,sBAAAC,GAAA,qBAAAC,KA+BO,SAASC,GACdC,EACAC,EACAC,EACY,CACZ,IAAMC,EAAmBC,GAAoBF,CAAU,EACjDG,EAAQC,GAAeN,EAAqBC,EAAWE,CAAgB,EAK7E,MAAO,CACL,UAHyBI,EAAWC,GAAQ,aAAaC,EAAWT,CAAmB,CAAC,CAAC,EAIzF,UAAAC,EACA,WAAAC,EACA,MAAAG,CACF,CACF,CAOA,eAAsBK,GAAiBC,EAA0C,CAC/E,IAAMR,EAAmBC,GAAoBO,EAAW,UAAU,EAClE,OAAO,MAAMC,GACXD,EAAW,UACXA,EAAW,UACXR,EACAQ,EAAW,KACb,CACF,CAQO,SAASE,GACdC,EACAZ,EACS,CAST,MARI,EAAAA,EAAW,OAAS,QAAaY,EAAM,OAASZ,EAAW,MAI3DA,EAAW,QAAU,QAAaY,EAAM,WAAaZ,EAAW,OAIhEA,EAAW,QAAU,QAAaY,EAAM,WAAaZ,EAAW,MAKtE,CAQO,SAASa,GACdD,EACAH,EACY,CACZ,IAAMK,EAAM,CACV,aACAL,EAAW,UACXP,GAAoBO,EAAW,UAAU,EACzCA,EAAW,KACb,EAEA,MAAO,CACL,GAAGG,EACH,KAAM,CAAC,GAAGA,EAAM,KAAME,CAAG,CAC3B,CACF,CAOO,SAASC,GAAkBH,EAAsC,CACtE,IAAME,EAAMF,EAAM,KAAK,KAAKI,GAAKA,EAAE,CAAC,IAAM,YAAY,EACtD,MAAI,CAACF,GAAOA,EAAI,SAAW,EAClB,KAGF,CACL,UAAWA,EAAI,CAAC,EAChB,UAAWF,EAAM,OACjB,WAAYK,GAAgBH,EAAI,CAAC,CAAC,EAClC,MAAOA,EAAI,CAAC,CACd,CACF,CAGA,SAASZ,GAAoBF,EAA0C,CACrE,IAAMkB,EAAkB,CAAC,EAEzB,OAAIlB,EAAW,OAAS,QACtBkB,EAAM,KAAK,QAAQlB,EAAW,IAAI,EAAE,EAElCA,EAAW,QAAU,QACvBkB,EAAM,KAAK,cAAclB,EAAW,KAAK,EAAE,EAEzCA,EAAW,QAAU,QACvBkB,EAAM,KAAK,cAAclB,EAAW,KAAK,EAAE,EAGtCkB,EAAM,KAAK,GAAG,CACvB,CAEA,SAASD,GAAgBhB,EAAgD,CACvE,IAAMD,EAAmC,CAAC,EACpCkB,EAAQjB,EAAiB,MAAM,GAAG,EAExC,QAAWkB,KAAQD,EACbC,EAAK,WAAW,OAAO,EACzBnB,EAAW,KAAO,SAASmB,EAAK,MAAM,CAAC,CAAC,EAC/BA,EAAK,WAAW,aAAa,EACtCnB,EAAW,MAAQ,SAASmB,EAAK,MAAM,EAAE,CAAC,EACjCA,EAAK,WAAW,aAAa,IACtCnB,EAAW,MAAQ,SAASmB,EAAK,MAAM,EAAE,CAAC,GAI9C,OAAOnB,CACT,CAEA,SAASI,GACPgB,EACArB,EACAC,EACQ,CACR,IAAMqB,EAAU,oBAAoBtB,CAAS,IAAIC,CAAU,GACrDsB,EAAOC,GAAO,IAAI,YAAY,EAAE,OAAOF,CAAO,CAAC,EAC/CG,EAAYC,GAAYH,EAAMF,CAAS,EAC7C,OAAOf,EAAWmB,CAAS,CAC7B,CAEA,eAAed,GACbU,EACArB,EACAC,EACAwB,EACkB,CAClB,IAAME,EAAUH,GAAO,IAAI,YAAY,EAAE,OAAO,oBAAoBxB,CAAS,IAAIC,CAAU,EAAE,CAAC,EAE9F,OAAO2B,GAAuBH,EAAWE,EAASN,CAAS,CAC7D,CC1LA,IAAAQ,GAAA,GAAAC,GAAAD,GAAA,mBAAAE,GAAA,YAAAC,GAAA,YAAAC,GAAA,uBAAAC,GAAA,OAAAC,KCOM,SAAUC,GAAQC,EAAU,CAChC,OAAOA,aAAa,YAAe,YAAY,OAAOA,CAAC,GAAKA,EAAE,YAAY,OAAS,YACrF,CAGM,SAAUC,GAAMC,EAAU,CAC9B,GAAI,OAAOA,GAAM,UAAW,MAAM,IAAI,MAAM,yBAAyBA,CAAC,EAAE,CAC1E,CAGM,SAAUC,GAAQC,EAAS,CAC/B,GAAI,CAAC,OAAO,cAAcA,CAAC,GAAKA,EAAI,EAAG,MAAM,IAAI,MAAM,kCAAoCA,CAAC,CAC9F,CAGM,SAAUC,GAAOC,EAAmBC,EAAiBC,EAAgB,GAAE,CAC3E,IAAMC,EAAQV,GAAQO,CAAK,EACrBI,EAAMJ,GAAO,OACbK,EAAWJ,IAAW,OAC5B,GAAI,CAACE,GAAUE,GAAYD,IAAQH,EAAS,CAC1C,IAAMK,EAASJ,GAAS,IAAIA,CAAK,KAC3BK,EAAQF,EAAW,cAAcJ,CAAM,GAAK,GAC5CO,EAAML,EAAQ,UAAUC,CAAG,GAAK,QAAQ,OAAOJ,CAAK,GAC1D,MAAM,IAAI,MAAMM,EAAS,sBAAwBC,EAAQ,SAAWC,CAAG,CACzE,CACA,OAAOR,CACT,CAGM,SAAUS,GAAQC,EAAeC,EAAgB,GAAI,CACzD,GAAID,EAAS,UAAW,MAAM,IAAI,MAAM,kCAAkC,EAC1E,GAAIC,GAAiBD,EAAS,SAAU,MAAM,IAAI,MAAM,uCAAuC,CACjG,CAGM,SAAUE,GAAQC,EAAUH,EAAa,CAC7CX,GAAOc,EAAK,OAAW,QAAQ,EAC/B,IAAMC,EAAMJ,EAAS,UACrB,GAAIG,EAAI,OAASC,EACf,MAAM,IAAI,MAAM,yDAA2DA,CAAG,CAElF,CAoBM,SAAUC,GAAIC,EAAe,CACjC,OAAO,IAAI,YAAYA,EAAI,OAAQA,EAAI,WAAY,KAAK,MAAMA,EAAI,WAAa,CAAC,CAAC,CACnF,CAGM,SAAUC,MAASC,EAAoB,CAC3C,QAASC,EAAI,EAAGA,EAAID,EAAO,OAAQC,IACjCD,EAAOC,CAAC,EAAE,KAAK,CAAC,CAEpB,CAGM,SAAUC,GAAWJ,EAAe,CACxC,OAAO,IAAI,SAASA,EAAI,OAAQA,EAAI,WAAYA,EAAI,UAAU,CAChE,CAGO,IAAMK,GACX,IAAI,WAAW,IAAI,YAAY,CAAC,SAAU,CAAC,EAAE,MAAM,EAAE,CAAC,IAAM,GA+IxD,SAAUC,GACdC,EACAC,EAAQ,CAER,GAAIA,GAAQ,MAAQ,OAAOA,GAAS,SAAU,MAAM,IAAI,MAAM,yBAAyB,EAEvF,OADe,OAAO,OAAOD,EAAUC,CAAI,CAE7C,CAGM,SAAUC,GAAWC,EAAeC,EAAa,CACrD,GAAID,EAAE,SAAWC,EAAE,OAAQ,MAAO,GAClC,IAAIC,EAAO,EACX,QAASC,EAAI,EAAGA,EAAIH,EAAE,OAAQG,IAAKD,GAAQF,EAAEG,CAAC,EAAIF,EAAEE,CAAC,EACrD,OAAOD,IAAS,CAClB,CAgEO,IAAME,GAAa,CACxBC,EACAC,IACS,CACT,SAASC,EAAcC,KAAoBC,EAAW,CAKpD,GAHAC,GAAOF,EAAK,OAAW,KAAK,EAGxB,CAACG,GAAM,MAAM,IAAI,MAAM,iDAAiD,EAG5E,GAAIN,EAAO,cAAgB,OAAW,CACpC,IAAMO,EAAQH,EAAK,CAAC,EACpBC,GAAOE,EAAOP,EAAO,aAAe,OAAYA,EAAO,YAAa,OAAO,CAC7E,CAGA,IAAMQ,EAAOR,EAAO,UAChBQ,GAAQJ,EAAK,CAAC,IAAM,QAAWC,GAAOD,EAAK,CAAC,EAAG,OAAW,KAAK,EAEnE,IAAMK,EAASR,EAAYE,EAAK,GAAGC,CAAI,EACjCM,EAAc,CAACC,EAAkBC,IAAuB,CAC5D,GAAIA,IAAW,OAAW,CACxB,GAAID,IAAa,EAAG,MAAM,IAAI,MAAM,6BAA6B,EACjEN,GAAOO,EAAQ,OAAW,QAAQ,CACpC,CACF,EAEIC,EAAS,GAkBb,MAjBiB,CACf,QAAQC,EAAkBF,EAAmB,CAC3C,GAAIC,EAAQ,MAAM,IAAI,MAAM,8CAA8C,EAC1E,OAAAA,EAAS,GACTR,GAAOS,CAAI,EACXJ,EAAYD,EAAO,QAAQ,OAAQG,CAAM,EACjCH,EAA4B,QAAQK,EAAMF,CAAM,CAC1D,EACA,QAAQE,EAAkBF,EAAmB,CAE3C,GADAP,GAAOS,CAAI,EACPN,GAAQM,EAAK,OAASN,EACxB,MAAM,IAAI,MAAM,sDAAwDA,CAAI,EAC9E,OAAAE,EAAYD,EAAO,QAAQ,OAAQG,CAAM,EACjCH,EAA4B,QAAQK,EAAMF,CAAM,CAC1D,EAIJ,CAEA,cAAO,OAAOV,EAAeF,CAAM,EAC5BE,CACT,EAeM,SAAUa,GACdC,EACAC,EACAC,EAAc,GAAI,CAElB,GAAID,IAAQ,OAAW,OAAO,IAAI,WAAWD,CAAc,EAC3D,GAAIC,EAAI,SAAWD,EACjB,MAAM,IAAI,MACR,0CAA4CA,EAAiB,UAAYC,EAAI,MAAM,EAEvF,GAAIC,GAAe,CAACC,GAAYF,CAAG,EAAG,MAAM,IAAI,MAAM,iCAAiC,EACvF,OAAOA,CACT,CAEM,SAAUG,GAAWC,EAAoBC,EAAmBhB,EAAa,CAC7EiB,GAAMjB,CAAI,EACV,IAAMkB,EAAM,IAAI,WAAW,EAAE,EACvBC,EAAOC,GAAWF,CAAG,EAC3B,OAAAC,EAAK,aAAa,EAAG,OAAOH,CAAS,EAAGhB,CAAI,EAC5CmB,EAAK,aAAa,EAAG,OAAOJ,CAAU,EAAGf,CAAI,EACtCkB,CACT,CAGM,SAAUL,GAAYQ,EAAiB,CAC3C,OAAOA,EAAM,WAAa,IAAM,CAClC,CAGM,SAAUC,GAAUD,EAAiB,CACzC,OAAO,WAAW,KAAKA,CAAK,CAC9B,CClWA,IAAME,GAAaC,GAAgB,WAAW,KAAKA,EAAI,MAAM,EAAE,EAAIC,GAAMA,EAAE,WAAW,CAAC,CAAC,EAClFC,GAAUH,GAAU,kBAAkB,EACtCI,GAAUJ,GAAU,kBAAkB,EACtCK,GAAaC,GAAIH,EAAO,EACxBI,GAAaD,GAAIF,EAAO,EAGxB,SAAUI,EAAKC,EAAWC,EAAS,CACvC,OAAQD,GAAKC,EAAMD,IAAO,GAAKC,CACjC,CAkCA,SAASC,GAAYD,EAAa,CAChC,OAAOA,EAAE,WAAa,IAAM,CAC9B,CAGA,IAAME,GAAY,GACZC,GAAc,GAIdC,GAAc,GAAK,GAAK,EAExBC,GAAY,YAAY,GAAE,EAChC,SAASC,GACPC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAAc,CAEd,IAAMC,EAAMJ,EAAK,OACXK,EAAQ,IAAI,WAAWd,EAAS,EAChCe,EAAMrB,GAAIoB,CAAK,EAEfE,EAAYjB,GAAYU,CAAI,GAAKV,GAAYW,CAAM,EACnDO,EAAMD,EAAYtB,GAAIe,CAAI,EAAIN,GAC9Be,EAAMF,EAAYtB,GAAIgB,CAAM,EAAIP,GACtC,QAASgB,EAAM,EAAGA,EAAMN,EAAKF,IAAW,CAEtC,GADAN,EAAKC,EAAOC,EAAKC,EAAOO,EAAKJ,EAASC,CAAM,EACxCD,GAAWT,GAAa,MAAM,IAAI,MAAM,uBAAuB,EACnE,IAAMkB,EAAO,KAAK,IAAIpB,GAAWa,EAAMM,CAAG,EAE1C,GAAIH,GAAaI,IAASpB,GAAW,CACnC,IAAMqB,EAAQF,EAAM,EACpB,GAAIA,EAAM,IAAM,EAAG,MAAM,IAAI,MAAM,6BAA6B,EAChE,QAASG,EAAI,EAAGC,EAAcD,EAAIrB,GAAaqB,IAC7CC,EAAOF,EAAQC,EACfJ,EAAIK,CAAI,EAAIN,EAAIM,CAAI,EAAIR,EAAIO,CAAC,EAE/BH,GAAOnB,GACP,QACF,CACA,QAASsB,EAAI,EAAGC,EAAMD,EAAIF,EAAME,IAC9BC,EAAOJ,EAAMG,EACbZ,EAAOa,CAAI,EAAId,EAAKc,CAAI,EAAIT,EAAMQ,CAAC,EAErCH,GAAOC,CACT,CACF,CAGM,SAAUI,GAAanB,EAAoBoB,EAAgB,CAC/D,GAAM,CAAE,eAAAC,EAAgB,cAAAC,EAAe,cAAAC,EAAe,aAAAC,EAAc,OAAAjB,CAAM,EAAKkB,GAC7E,CAAE,eAAgB,GAAO,cAAe,EAAG,aAAc,GAAO,OAAQ,EAAE,EAC1EL,CAAI,EAEN,GAAI,OAAOpB,GAAS,WAAY,MAAM,IAAI,MAAM,yBAAyB,EACzE,OAAA0B,GAAQH,CAAa,EACrBG,GAAQnB,CAAM,EACdoB,GAAMH,CAAY,EAClBG,GAAMN,CAAc,EACb,CACLnB,EACAC,EACAC,EACAC,EACAC,EAAU,IACI,CACdsB,GAAO1B,EAAK,OAAW,KAAK,EAC5B0B,GAAOzB,EAAO,OAAW,OAAO,EAChCyB,GAAOxB,EAAM,OAAW,MAAM,EAC9B,IAAMI,EAAMJ,EAAK,OAIjB,GAHIC,IAAW,SAAWA,EAAS,IAAI,WAAWG,CAAG,GACrDoB,GAAOvB,EAAQ,OAAW,QAAQ,EAClCqB,GAAQpB,CAAO,EACXA,EAAU,GAAKA,GAAWT,GAAa,MAAM,IAAI,MAAM,uBAAuB,EAClF,GAAIQ,EAAO,OAASG,EAClB,MAAM,IAAI,MAAM,gBAAgBH,EAAO,MAAM,2BAA2BG,CAAG,GAAG,EAChF,IAAMqB,EAAU,CAAA,EAKZC,EAAI5B,EAAI,OACR6B,EACA9B,EACJ,GAAI6B,IAAM,GACRD,EAAQ,KAAME,EAAIC,GAAU9B,CAAG,CAAE,EACjCD,EAAQX,WACCwC,IAAM,IAAMT,EACrBU,EAAI,IAAI,WAAW,EAAE,EACrBA,EAAE,IAAI7B,CAAG,EACT6B,EAAE,IAAI7B,EAAK,EAAE,EACbD,EAAQb,GACRyC,EAAQ,KAAKE,CAAC,MAEd,OAAAH,GAAO1B,EAAK,GAAI,SAAS,EACnB,IAAI,MAAM,kBAAkB,EAW/BR,GAAYS,CAAK,GAAG0B,EAAQ,KAAM1B,EAAQ6B,GAAU7B,CAAK,CAAE,EAEhE,IAAM8B,EAAM5C,GAAI0C,CAAC,EAEjB,GAAIT,EAAe,CACjB,GAAInB,EAAM,SAAW,GAAI,MAAM,IAAI,MAAM,sCAAsC,EAC/EmB,EAAcrB,EAAOgC,EAAK5C,GAAIc,EAAM,SAAS,EAAG,EAAE,CAAC,EAAG8B,CAAG,EACzD9B,EAAQA,EAAM,SAAS,EAAE,CAC3B,CAGA,IAAM+B,EAAa,GAAKX,EACxB,GAAIW,IAAe/B,EAAM,OACvB,MAAM,IAAI,MAAM,sBAAsB+B,CAAU,cAAc,EAGhE,GAAIA,IAAe,GAAI,CACrB,IAAMC,EAAK,IAAI,WAAW,EAAE,EAC5BA,EAAG,IAAIhC,EAAOqB,EAAe,EAAI,GAAKrB,EAAM,MAAM,EAClDA,EAAQgC,EACRN,EAAQ,KAAK1B,CAAK,CACpB,CACA,IAAMiC,EAAM/C,GAAIc,CAAK,EACrB,OAAAJ,GAAUC,EAAMC,EAAOgC,EAAKG,EAAKhC,EAAMC,EAAQC,EAASC,CAAM,EAC9D8B,GAAM,GAAGR,CAAO,EACTxB,CACT,CACF,CC/MA,SAASiC,GAAOC,EAAeC,EAAS,CACtC,OAAQD,EAAEC,GAAG,EAAI,KAAUD,EAAEC,GAAG,EAAI,MAAS,CAC/C,CA+CM,IAAOC,GAAP,KAAe,CAWnB,YAAYC,EAAe,CAVlBC,GAAA,gBAAW,IACXA,GAAA,iBAAY,IACbA,GAAA,cAAS,IAAI,WAAW,EAAE,GAC1BA,GAAA,SAAI,IAAI,YAAY,EAAE,GACtBA,GAAA,SAAI,IAAI,YAAY,EAAE,GACtBA,GAAA,WAAM,IAAI,YAAY,CAAC,GACvBA,GAAA,WAAM,GACJA,GAAA,gBAAW,IAInBD,EAAME,GAAUC,GAAOH,EAAK,GAAI,KAAK,CAAC,EACtC,IAAMI,EAAKC,GAAOL,EAAK,CAAC,EAClBM,EAAKD,GAAOL,EAAK,CAAC,EAClBO,EAAKF,GAAOL,EAAK,CAAC,EAClBQ,EAAKH,GAAOL,EAAK,CAAC,EAClBS,EAAKJ,GAAOL,EAAK,CAAC,EAClBU,EAAKL,GAAOL,EAAK,EAAE,EACnBW,EAAKN,GAAOL,EAAK,EAAE,EACnBY,EAAKP,GAAOL,EAAK,EAAE,EAGzB,KAAK,EAAE,CAAC,EAAII,EAAK,KACjB,KAAK,EAAE,CAAC,GAAMA,IAAO,GAAOE,GAAM,GAAM,KACxC,KAAK,EAAE,CAAC,GAAMA,IAAO,GAAOC,GAAM,GAAM,KACxC,KAAK,EAAE,CAAC,GAAMA,IAAO,EAAMC,GAAM,GAAM,KACvC,KAAK,EAAE,CAAC,GAAMA,IAAO,EAAMC,GAAM,IAAO,IACxC,KAAK,EAAE,CAAC,EAAKA,IAAO,EAAK,KACzB,KAAK,EAAE,CAAC,GAAMA,IAAO,GAAOC,GAAM,GAAM,KACxC,KAAK,EAAE,CAAC,GAAMA,IAAO,GAAOC,GAAM,GAAM,KACxC,KAAK,EAAE,CAAC,GAAMA,IAAO,EAAMC,GAAM,GAAM,KACvC,KAAK,EAAE,CAAC,EAAKA,IAAO,EAAK,IACzB,QAASC,EAAI,EAAGA,EAAI,EAAGA,IAAK,KAAK,IAAIA,CAAC,EAAIR,GAAOL,EAAK,GAAK,EAAIa,CAAC,CAClE,CAEQ,QAAQC,EAAkBC,EAAgBC,EAAS,GAAK,CAC9D,IAAMC,EAAQD,EAAS,EAAI,KACrB,CAAE,EAAAE,EAAG,EAAAC,CAAC,EAAK,KACXC,EAAKD,EAAE,CAAC,EACRE,EAAKF,EAAE,CAAC,EACRG,EAAKH,EAAE,CAAC,EACRI,EAAKJ,EAAE,CAAC,EACRK,EAAKL,EAAE,CAAC,EACRM,EAAKN,EAAE,CAAC,EACRO,EAAKP,EAAE,CAAC,EACRQ,EAAKR,EAAE,CAAC,EACRS,EAAKT,EAAE,CAAC,EACRU,EAAKV,EAAE,CAAC,EAERf,EAAKC,GAAOS,EAAMC,EAAS,CAAC,EAC5BT,EAAKD,GAAOS,EAAMC,EAAS,CAAC,EAC5BR,EAAKF,GAAOS,EAAMC,EAAS,CAAC,EAC5BP,EAAKH,GAAOS,EAAMC,EAAS,CAAC,EAC5BN,EAAKJ,GAAOS,EAAMC,EAAS,CAAC,EAC5BL,EAAKL,GAAOS,EAAMC,EAAS,EAAE,EAC7BJ,EAAKN,GAAOS,EAAMC,EAAS,EAAE,EAC7BH,EAAKP,GAAOS,EAAMC,EAAS,EAAE,EAE/Be,EAAKZ,EAAE,CAAC,GAAKd,EAAK,MAClB2B,EAAKb,EAAE,CAAC,IAAOd,IAAO,GAAOE,GAAM,GAAM,MACzC0B,EAAKd,EAAE,CAAC,IAAOZ,IAAO,GAAOC,GAAM,GAAM,MACzC0B,EAAKf,EAAE,CAAC,IAAOX,IAAO,EAAMC,GAAM,GAAM,MACxC0B,EAAKhB,EAAE,CAAC,IAAOV,IAAO,EAAMC,GAAM,IAAO,MACzC0B,EAAKjB,EAAE,CAAC,GAAMT,IAAO,EAAK,MAC1B2B,EAAKlB,EAAE,CAAC,IAAOT,IAAO,GAAOC,GAAM,GAAM,MACzC2B,EAAKnB,EAAE,CAAC,IAAOR,IAAO,GAAOC,GAAM,GAAM,MACzC2B,EAAKpB,EAAE,CAAC,IAAOP,IAAO,EAAMC,GAAM,GAAM,MACxC2B,EAAKrB,EAAE,CAAC,GAAMN,IAAO,EAAKK,GAE1BuB,EAAI,EAEJC,EAAKD,EAAIV,EAAKV,EAAKW,GAAM,EAAIF,GAAMG,GAAM,EAAIJ,GAAMK,GAAM,EAAIN,GAAMO,GAAM,EAAIR,GACjFc,EAAIC,IAAO,GACXA,GAAM,KACNA,GAAMN,GAAM,EAAIV,GAAMW,GAAM,EAAIZ,GAAMa,GAAM,EAAId,GAAMe,GAAM,EAAIhB,GAAMiB,GAAM,EAAIlB,GAChFmB,GAAKC,IAAO,GACZA,GAAM,KAEN,IAAIC,EAAKF,EAAIV,EAAKT,EAAKU,EAAKX,EAAKY,GAAM,EAAIH,GAAMI,GAAM,EAAIL,GAAMM,GAAM,EAAIP,GAC3Ea,EAAIE,IAAO,GACXA,GAAM,KACNA,GAAMP,GAAM,EAAIT,GAAMU,GAAM,EAAIX,GAAMY,GAAM,EAAIb,GAAMc,GAAM,EAAIf,GAAMgB,GAAM,EAAIjB,GAChFkB,GAAKE,IAAO,GACZA,GAAM,KAEN,IAAIC,EAAKH,EAAIV,EAAKR,EAAKS,EAAKV,EAAKW,EAAKZ,EAAKa,GAAM,EAAIJ,GAAMK,GAAM,EAAIN,GACrEY,EAAIG,IAAO,GACXA,GAAM,KACNA,GAAMR,GAAM,EAAIR,GAAMS,GAAM,EAAIV,GAAMW,GAAM,EAAIZ,GAAMa,GAAM,EAAId,GAAMe,GAAM,EAAIhB,GAChFiB,GAAKG,IAAO,GACZA,GAAM,KAEN,IAAIC,EAAKJ,EAAIV,EAAKP,EAAKQ,EAAKT,EAAKU,EAAKX,EAAKY,EAAKb,EAAKc,GAAM,EAAIL,GAC/DW,EAAII,IAAO,GACXA,GAAM,KACNA,GAAMT,GAAM,EAAIP,GAAMQ,GAAM,EAAIT,GAAMU,GAAM,EAAIX,GAAMY,GAAM,EAAIb,GAAMc,GAAM,EAAIf,GAChFgB,GAAKI,IAAO,GACZA,GAAM,KAEN,IAAIC,EAAKL,EAAIV,EAAKN,EAAKO,EAAKR,EAAKS,EAAKV,EAAKW,EAAKZ,EAAKa,EAAKd,EAC1DoB,EAAIK,IAAO,GACXA,GAAM,KACNA,GAAMV,GAAM,EAAIN,GAAMO,GAAM,EAAIR,GAAMS,GAAM,EAAIV,GAAMW,GAAM,EAAIZ,GAAMa,GAAM,EAAId,GAChFe,GAAKK,IAAO,GACZA,GAAM,KAEN,IAAIC,EAAKN,EAAIV,EAAKL,EAAKM,EAAKP,EAAKQ,EAAKT,EAAKU,EAAKX,EAAKY,EAAKb,EAC1DmB,EAAIM,IAAO,GACXA,GAAM,KACNA,GAAMX,EAAKf,EAAKgB,GAAM,EAAIP,GAAMQ,GAAM,EAAIT,GAAMU,GAAM,EAAIX,GAAMY,GAAM,EAAIb,GAC1Ec,GAAKM,IAAO,GACZA,GAAM,KAEN,IAAIC,EAAKP,EAAIV,EAAKJ,EAAKK,EAAKN,EAAKO,EAAKR,EAAKS,EAAKV,EAAKW,EAAKZ,EAC1DkB,EAAIO,IAAO,GACXA,GAAM,KACNA,GAAMZ,EAAKd,EAAKe,EAAKhB,EAAKiB,GAAM,EAAIR,GAAMS,GAAM,EAAIV,GAAMW,GAAM,EAAIZ,GACpEa,GAAKO,IAAO,GACZA,GAAM,KAEN,IAAIC,EAAKR,EAAIV,EAAKH,EAAKI,EAAKL,EAAKM,EAAKP,EAAKQ,EAAKT,EAAKU,EAAKX,EAC1DiB,EAAIQ,IAAO,GACXA,GAAM,KACNA,GAAMb,EAAKb,EAAKc,EAAKf,EAAKgB,EAAKjB,EAAKkB,GAAM,EAAIT,GAAMU,GAAM,EAAIX,GAC9DY,GAAKQ,IAAO,GACZA,GAAM,KAEN,IAAIC,EAAKT,EAAIV,EAAKF,EAAKG,EAAKJ,EAAKK,EAAKN,EAAKO,EAAKR,EAAKS,EAAKV,EAC1DgB,EAAIS,IAAO,GACXA,GAAM,KACNA,GAAMd,EAAKZ,EAAKa,EAAKd,EAAKe,EAAKhB,EAAKiB,EAAKlB,EAAKmB,GAAM,EAAIV,GACxDW,GAAKS,IAAO,GACZA,GAAM,KAEN,IAAIC,EAAKV,EAAIV,EAAKD,EAAKE,EAAKH,EAAKI,EAAKL,EAAKM,EAAKP,EAAKQ,EAAKT,EAC1De,EAAIU,IAAO,GACXA,GAAM,KACNA,GAAMf,EAAKX,EAAKY,EAAKb,EAAKc,EAAKf,EAAKgB,EAAKjB,EAAKkB,EAAKnB,EACnDoB,GAAKU,IAAO,GACZA,GAAM,KAENV,GAAMA,GAAK,GAAKA,EAAK,EACrBA,EAAKA,EAAIC,EAAM,EACfA,EAAKD,EAAI,KACTA,EAAIA,IAAM,GACVE,GAAMF,EAENtB,EAAE,CAAC,EAAIuB,EACPvB,EAAE,CAAC,EAAIwB,EACPxB,EAAE,CAAC,EAAIyB,EACPzB,EAAE,CAAC,EAAI0B,EACP1B,EAAE,CAAC,EAAI2B,EACP3B,EAAE,CAAC,EAAI4B,EACP5B,EAAE,CAAC,EAAI6B,EACP7B,EAAE,CAAC,EAAI8B,EACP9B,EAAE,CAAC,EAAI+B,EACP/B,EAAE,CAAC,EAAIgC,CACT,CAEQ,UAAQ,CACd,GAAM,CAAE,EAAAhC,EAAG,IAAAiC,CAAG,EAAK,KACbC,EAAI,IAAI,YAAY,EAAE,EACxBZ,EAAItB,EAAE,CAAC,IAAM,GACjBA,EAAE,CAAC,GAAK,KACR,QAASL,EAAI,EAAGA,EAAI,GAAIA,IACtBK,EAAEL,CAAC,GAAK2B,EACRA,EAAItB,EAAEL,CAAC,IAAM,GACbK,EAAEL,CAAC,GAAK,KAEVK,EAAE,CAAC,GAAKsB,EAAI,EACZA,EAAItB,EAAE,CAAC,IAAM,GACbA,EAAE,CAAC,GAAK,KACRA,EAAE,CAAC,GAAKsB,EACRA,EAAItB,EAAE,CAAC,IAAM,GACbA,EAAE,CAAC,GAAK,KACRA,EAAE,CAAC,GAAKsB,EAERY,EAAE,CAAC,EAAIlC,EAAE,CAAC,EAAI,EACdsB,EAAIY,EAAE,CAAC,IAAM,GACbA,EAAE,CAAC,GAAK,KACR,QAASvC,EAAI,EAAGA,EAAI,GAAIA,IACtBuC,EAAEvC,CAAC,EAAIK,EAAEL,CAAC,EAAI2B,EACdA,EAAIY,EAAEvC,CAAC,IAAM,GACbuC,EAAEvC,CAAC,GAAK,KAEVuC,EAAE,CAAC,GAAK,KAER,IAAIC,GAAQb,EAAI,GAAK,EACrB,QAAS3B,EAAI,EAAGA,EAAI,GAAIA,IAAKuC,EAAEvC,CAAC,GAAKwC,EACrCA,EAAO,CAACA,EACR,QAASxC,EAAI,EAAGA,EAAI,GAAIA,IAAKK,EAAEL,CAAC,EAAKK,EAAEL,CAAC,EAAIwC,EAAQD,EAAEvC,CAAC,EACvDK,EAAE,CAAC,GAAKA,EAAE,CAAC,EAAKA,EAAE,CAAC,GAAK,IAAO,MAC/BA,EAAE,CAAC,GAAMA,EAAE,CAAC,IAAM,EAAMA,EAAE,CAAC,GAAK,IAAO,MACvCA,EAAE,CAAC,GAAMA,EAAE,CAAC,IAAM,EAAMA,EAAE,CAAC,GAAK,GAAM,MACtCA,EAAE,CAAC,GAAMA,EAAE,CAAC,IAAM,EAAMA,EAAE,CAAC,GAAK,GAAM,MACtCA,EAAE,CAAC,GAAMA,EAAE,CAAC,IAAM,GAAOA,EAAE,CAAC,GAAK,EAAMA,EAAE,CAAC,GAAK,IAAO,MACtDA,EAAE,CAAC,GAAMA,EAAE,CAAC,IAAM,EAAMA,EAAE,CAAC,GAAK,IAAO,MACvCA,EAAE,CAAC,GAAMA,EAAE,CAAC,IAAM,EAAMA,EAAE,CAAC,GAAK,GAAM,MACtCA,EAAE,CAAC,GAAMA,EAAE,CAAC,IAAM,EAAMA,EAAE,CAAC,GAAK,GAAM,MAEtC,IAAIoC,EAAIpC,EAAE,CAAC,EAAIiC,EAAI,CAAC,EACpBjC,EAAE,CAAC,EAAIoC,EAAI,MACX,QAASzC,EAAI,EAAGA,EAAI,EAAGA,IACrByC,GAAOpC,EAAEL,CAAC,EAAIsC,EAAItC,CAAC,EAAK,IAAMyC,IAAM,IAAO,EAC3CpC,EAAEL,CAAC,EAAIyC,EAAI,MAEbC,GAAMH,CAAC,CACT,CACA,OAAOtC,EAAgB,CACrB0C,GAAQ,IAAI,EACZrD,GAAOW,CAAI,EACXA,EAAOZ,GAAUY,CAAI,EACrB,GAAM,CAAE,OAAA2C,EAAQ,SAAAC,CAAQ,EAAK,KACvBC,EAAM7C,EAAK,OAEjB,QAAS8C,EAAM,EAAGA,EAAMD,GAAO,CAC7B,IAAME,EAAO,KAAK,IAAIH,EAAW,KAAK,IAAKC,EAAMC,CAAG,EAEpD,GAAIC,IAASH,EAAU,CACrB,KAAOA,GAAYC,EAAMC,EAAKA,GAAOF,EAAU,KAAK,QAAQ5C,EAAM8C,CAAG,EACrE,QACF,CACAH,EAAO,IAAI3C,EAAK,SAAS8C,EAAKA,EAAMC,CAAI,EAAG,KAAK,GAAG,EACnD,KAAK,KAAOA,EACZD,GAAOC,EACH,KAAK,MAAQH,IACf,KAAK,QAAQD,EAAQ,EAAG,EAAK,EAC7B,KAAK,IAAM,EAEf,CACA,OAAO,IACT,CACA,SAAO,CACLF,GAAM,KAAK,EAAG,KAAK,EAAG,KAAK,OAAQ,KAAK,GAAG,CAC7C,CACA,WAAWO,EAAe,CACxBN,GAAQ,IAAI,EACZO,GAAQD,EAAK,IAAI,EACjB,KAAK,SAAW,GAChB,GAAM,CAAE,OAAAL,EAAQ,EAAAvC,CAAC,EAAK,KAClB,CAAE,IAAA0C,CAAG,EAAK,KACd,GAAIA,EAAK,CAEP,IADAH,EAAOG,GAAK,EAAI,EACTA,EAAM,GAAIA,IAAOH,EAAOG,CAAG,EAAI,EACtC,KAAK,QAAQH,EAAQ,EAAG,EAAI,CAC9B,CACA,KAAK,SAAQ,EACb,IAAIO,EAAO,EACX,QAASnD,EAAI,EAAGA,EAAI,EAAGA,IACrBiD,EAAIE,GAAM,EAAI9C,EAAEL,CAAC,IAAM,EACvBiD,EAAIE,GAAM,EAAI9C,EAAEL,CAAC,IAAM,EAEzB,OAAOiD,CACT,CACA,QAAM,CACJ,GAAM,CAAE,OAAAL,EAAQ,UAAAQ,CAAS,EAAK,KAC9B,KAAK,WAAWR,CAAM,EACtB,IAAMS,EAAMT,EAAO,MAAM,EAAGQ,CAAS,EACrC,YAAK,QAAO,EACLC,CACT,GAII,SAAUC,GACdC,EAAgC,CAOhC,IAAMC,EAAQ,CAACC,EAAiBtE,IAC9BoE,EAASpE,CAAG,EAAE,OAAOsE,CAAG,EAAE,OAAM,EAC5BC,EAAMH,EAAS,IAAI,WAAW,EAAE,CAAC,EACvC,OAAAC,EAAM,UAAYE,EAAI,UACtBF,EAAM,SAAWE,EAAI,SACrBF,EAAM,OAAUrE,GAAoBoE,EAASpE,CAAG,EACzCqE,CACT,CAGO,IAAMG,GACXL,GAAwBnE,GAAQ,IAAID,GAASC,CAAG,CAAC,ECrQnD,SAASyE,GACPC,EAAgBC,EAAgBC,EAAgBC,EAAkBC,EAAaC,EAAS,GAAE,CAE1F,IAAIC,EAAMN,EAAE,CAAC,EAAGO,EAAMP,EAAE,CAAC,EAAGQ,EAAMR,EAAE,CAAC,EAAGS,EAAMT,EAAE,CAAC,EAC7CU,EAAMT,EAAE,CAAC,EAAGU,EAAMV,EAAE,CAAC,EAAGW,EAAMX,EAAE,CAAC,EAAGY,EAAMZ,EAAE,CAAC,EAC7Ca,EAAMb,EAAE,CAAC,EAAGc,EAAMd,EAAE,CAAC,EAAGe,EAAMf,EAAE,CAAC,EAAGgB,EAAMhB,EAAE,CAAC,EAC7CiB,EAAMd,EAAMe,EAAMjB,EAAE,CAAC,EAAGkB,EAAMlB,EAAE,CAAC,EAAGmB,EAAMnB,EAAE,CAAC,EAE7CoB,EAAMhB,EAAKiB,EAAMhB,EAAKiB,EAAMhB,EAAKiB,EAAMhB,EACvCiB,EAAMhB,EAAKiB,EAAMhB,EAAKiB,EAAMhB,EAAKiB,EAAMhB,EACvCiB,EAAMhB,EAAKiB,EAAMhB,EAAKiB,EAAMhB,EAAKiB,EAAMhB,EACvCiB,EAAMhB,EAAKiB,EAAMhB,EAAKiB,EAAMhB,EAAKiB,EAAMhB,EAC3C,QAASiB,EAAI,EAAGA,EAAIjC,EAAQiC,GAAK,EAC/BhB,EAAOA,EAAMI,EAAO,EAAGQ,EAAMK,EAAKL,EAAMZ,EAAK,EAAE,EAC/CQ,EAAOA,EAAMI,EAAO,EAAGR,EAAMa,EAAKb,EAAMI,EAAK,EAAE,EAC/CR,EAAOA,EAAMI,EAAO,EAAGQ,EAAMK,EAAKL,EAAMZ,EAAK,CAAC,EAC9CQ,EAAOA,EAAMI,EAAO,EAAGR,EAAMa,EAAKb,EAAMI,EAAK,CAAC,EAE9CP,EAAOA,EAAMI,EAAO,EAAGQ,EAAMI,EAAKJ,EAAMZ,EAAK,EAAE,EAC/CQ,EAAOA,EAAMI,EAAO,EAAGR,EAAMY,EAAKZ,EAAMI,EAAK,EAAE,EAC/CR,EAAOA,EAAMI,EAAO,EAAGQ,EAAMI,EAAKJ,EAAMZ,EAAK,CAAC,EAC9CQ,EAAOA,EAAMI,EAAO,EAAGR,EAAMY,EAAKZ,EAAMI,EAAK,CAAC,EAE9CP,EAAOA,EAAMI,EAAO,EAAGQ,EAAMG,EAAKH,EAAMZ,EAAK,EAAE,EAC/CQ,EAAOA,EAAMI,EAAO,EAAGR,EAAMW,EAAKX,EAAMI,EAAK,EAAE,EAC/CR,EAAOA,EAAMI,EAAO,EAAGQ,EAAMG,EAAKH,EAAMZ,EAAK,CAAC,EAC9CQ,EAAOA,EAAMI,EAAO,EAAGR,EAAMW,EAAKX,EAAMI,EAAK,CAAC,EAE9CP,EAAOA,EAAMI,EAAO,EAAGQ,EAAME,EAAKF,EAAMZ,EAAK,EAAE,EAC/CQ,EAAOA,EAAMI,EAAO,EAAGR,EAAMU,EAAKV,EAAMI,EAAK,EAAE,EAC/CR,EAAOA,EAAMI,EAAO,EAAGQ,EAAME,EAAKF,EAAMZ,EAAK,CAAC,EAC9CQ,EAAOA,EAAMI,EAAO,EAAGR,EAAMU,EAAKV,EAAMI,EAAK,CAAC,EAE9CX,EAAOA,EAAMK,EAAO,EAAGU,EAAME,EAAKF,EAAMf,EAAK,EAAE,EAC/CU,EAAOA,EAAMK,EAAO,EAAGV,EAAMY,EAAKZ,EAAMK,EAAK,EAAE,EAC/CV,EAAOA,EAAMK,EAAO,EAAGU,EAAME,EAAKF,EAAMf,EAAK,CAAC,EAC9CU,EAAOA,EAAMK,EAAO,EAAGV,EAAMY,EAAKZ,EAAMK,EAAK,CAAC,EAE9CT,EAAOA,EAAMK,EAAO,EAAGM,EAAMK,EAAKL,EAAMX,EAAK,EAAE,EAC/CU,EAAOA,EAAMC,EAAO,EAAGN,EAAMW,EAAKX,EAAMK,EAAK,EAAE,EAC/CV,EAAOA,EAAMK,EAAO,EAAGM,EAAMK,EAAKL,EAAMX,EAAK,CAAC,EAC9CU,EAAOA,EAAMC,EAAO,EAAGN,EAAMW,EAAKX,EAAMK,EAAK,CAAC,EAE9CT,EAAOA,EAAMK,EAAO,EAAGM,EAAMI,EAAKJ,EAAMX,EAAK,EAAE,EAC/CM,EAAOA,EAAMK,EAAO,EAAGN,EAAMU,EAAKV,EAAMC,EAAK,EAAE,EAC/CN,EAAOA,EAAMK,EAAO,EAAGM,EAAMI,EAAKJ,EAAMX,EAAK,CAAC,EAC9CM,EAAOA,EAAMK,EAAO,EAAGN,EAAMU,EAAKV,EAAMC,EAAK,CAAC,EAE9CL,EAAOA,EAAMC,EAAO,EAAGU,EAAMG,EAAKH,EAAMX,EAAK,EAAE,EAC/CM,EAAOA,EAAMK,EAAO,EAAGV,EAAMa,EAAKb,EAAMK,EAAK,EAAE,EAC/CN,EAAOA,EAAMC,EAAO,EAAGU,EAAMG,EAAKH,EAAMX,EAAK,CAAC,EAC9CM,EAAOA,EAAMK,EAAO,EAAGV,EAAMa,EAAKb,EAAMK,EAAK,CAAC,EAGhD,IAAIS,EAAK,EACTrC,EAAIqC,GAAI,EAAKlC,EAAMgB,EAAO,EAAGnB,EAAIqC,GAAI,EAAKjC,EAAMgB,EAAO,EACvDpB,EAAIqC,GAAI,EAAKhC,EAAMgB,EAAO,EAAGrB,EAAIqC,GAAI,EAAK/B,EAAMgB,EAAO,EACvDtB,EAAIqC,GAAI,EAAK9B,EAAMgB,EAAO,EAAGvB,EAAIqC,GAAI,EAAK7B,EAAMgB,EAAO,EACvDxB,EAAIqC,GAAI,EAAK5B,EAAMgB,EAAO,EAAGzB,EAAIqC,GAAI,EAAK3B,EAAMgB,EAAO,EACvD1B,EAAIqC,GAAI,EAAK1B,EAAMgB,EAAO,EAAG3B,EAAIqC,GAAI,EAAKzB,EAAMgB,EAAO,EACvD5B,EAAIqC,GAAI,EAAKxB,EAAMgB,EAAO,EAAG7B,EAAIqC,GAAI,EAAKvB,EAAMgB,EAAO,EACvD9B,EAAIqC,GAAI,EAAKtB,EAAMgB,EAAO,EAAG/B,EAAIqC,GAAI,EAAKrB,EAAMgB,EAAO,EACvDhC,EAAIqC,GAAI,EAAKpB,EAAMgB,EAAO,EAAGjC,EAAIqC,GAAI,EAAKnB,EAAMgB,EAAO,CACzD,CAOM,SAAUI,GACdzC,EAAgBC,EAAgByC,EAAgBvC,EAAgB,CAEhE,IAAImB,EAAMtB,EAAE,CAAC,EAAGuB,EAAMvB,EAAE,CAAC,EAAGwB,EAAMxB,EAAE,CAAC,EAAGyB,EAAMzB,EAAE,CAAC,EAC7C0B,EAAMzB,EAAE,CAAC,EAAG0B,EAAM1B,EAAE,CAAC,EAAG2B,EAAM3B,EAAE,CAAC,EAAG4B,EAAM5B,EAAE,CAAC,EAC7C6B,EAAM7B,EAAE,CAAC,EAAG8B,EAAM9B,EAAE,CAAC,EAAG+B,EAAM/B,EAAE,CAAC,EAAGgC,EAAMhC,EAAE,CAAC,EAC7CiC,EAAMQ,EAAE,CAAC,EAAGP,EAAMO,EAAE,CAAC,EAAGN,EAAMM,EAAE,CAAC,EAAGL,EAAMK,EAAE,CAAC,EACjD,QAASJ,EAAI,EAAGA,EAAI,GAAIA,GAAK,EAC3BhB,EAAOA,EAAMI,EAAO,EAAGQ,EAAMK,EAAKL,EAAMZ,EAAK,EAAE,EAC/CQ,EAAOA,EAAMI,EAAO,EAAGR,EAAMa,EAAKb,EAAMI,EAAK,EAAE,EAC/CR,EAAOA,EAAMI,EAAO,EAAGQ,EAAMK,EAAKL,EAAMZ,EAAK,CAAC,EAC9CQ,EAAOA,EAAMI,EAAO,EAAGR,EAAMa,EAAKb,EAAMI,EAAK,CAAC,EAE9CP,EAAOA,EAAMI,EAAO,EAAGQ,EAAMI,EAAKJ,EAAMZ,EAAK,EAAE,EAC/CQ,EAAOA,EAAMI,EAAO,EAAGR,EAAMY,EAAKZ,EAAMI,EAAK,EAAE,EAC/CR,EAAOA,EAAMI,EAAO,EAAGQ,EAAMI,EAAKJ,EAAMZ,EAAK,CAAC,EAC9CQ,EAAOA,EAAMI,EAAO,EAAGR,EAAMY,EAAKZ,EAAMI,EAAK,CAAC,EAE9CP,EAAOA,EAAMI,EAAO,EAAGQ,EAAMG,EAAKH,EAAMZ,EAAK,EAAE,EAC/CQ,EAAOA,EAAMI,EAAO,EAAGR,EAAMW,EAAKX,EAAMI,EAAK,EAAE,EAC/CR,EAAOA,EAAMI,EAAO,EAAGQ,EAAMG,EAAKH,EAAMZ,EAAK,CAAC,EAC9CQ,EAAOA,EAAMI,EAAO,EAAGR,EAAMW,EAAKX,EAAMI,EAAK,CAAC,EAE9CP,EAAOA,EAAMI,EAAO,EAAGQ,EAAME,EAAKF,EAAMZ,EAAK,EAAE,EAC/CQ,EAAOA,EAAMI,EAAO,EAAGR,EAAMU,EAAKV,EAAMI,EAAK,EAAE,EAC/CR,EAAOA,EAAMI,EAAO,EAAGQ,EAAME,EAAKF,EAAMZ,EAAK,CAAC,EAC9CQ,EAAOA,EAAMI,EAAO,EAAGR,EAAMU,EAAKV,EAAMI,EAAK,CAAC,EAE9CX,EAAOA,EAAMK,EAAO,EAAGU,EAAME,EAAKF,EAAMf,EAAK,EAAE,EAC/CU,EAAOA,EAAMK,EAAO,EAAGV,EAAMY,EAAKZ,EAAMK,EAAK,EAAE,EAC/CV,EAAOA,EAAMK,EAAO,EAAGU,EAAME,EAAKF,EAAMf,EAAK,CAAC,EAC9CU,EAAOA,EAAMK,EAAO,EAAGV,EAAMY,EAAKZ,EAAMK,EAAK,CAAC,EAE9CT,EAAOA,EAAMK,EAAO,EAAGM,EAAMK,EAAKL,EAAMX,EAAK,EAAE,EAC/CU,EAAOA,EAAMC,EAAO,EAAGN,EAAMW,EAAKX,EAAMK,EAAK,EAAE,EAC/CV,EAAOA,EAAMK,EAAO,EAAGM,EAAMK,EAAKL,EAAMX,EAAK,CAAC,EAC9CU,EAAOA,EAAMC,EAAO,EAAGN,EAAMW,EAAKX,EAAMK,EAAK,CAAC,EAE9CT,EAAOA,EAAMK,EAAO,EAAGM,EAAMI,EAAKJ,EAAMX,EAAK,EAAE,EAC/CM,EAAOA,EAAMK,EAAO,EAAGN,EAAMU,EAAKV,EAAMC,EAAK,EAAE,EAC/CN,EAAOA,EAAMK,EAAO,EAAGM,EAAMI,EAAKJ,EAAMX,EAAK,CAAC,EAC9CM,EAAOA,EAAMK,EAAO,EAAGN,EAAMU,EAAKV,EAAMC,EAAK,CAAC,EAE9CL,EAAOA,EAAMC,EAAO,EAAGU,EAAMG,EAAKH,EAAMX,EAAK,EAAE,EAC/CM,EAAOA,EAAMK,EAAO,EAAGV,EAAMa,EAAKb,EAAMK,EAAK,EAAE,EAC/CN,EAAOA,EAAMC,EAAO,EAAGU,EAAMG,EAAKH,EAAMX,EAAK,CAAC,EAC9CM,EAAOA,EAAMK,EAAO,EAAGV,EAAMa,EAAKb,EAAMK,EAAK,CAAC,EAEhD,IAAIS,EAAK,EACTrC,EAAIqC,GAAI,EAAIlB,EAAKnB,EAAIqC,GAAI,EAAIjB,EAC7BpB,EAAIqC,GAAI,EAAIhB,EAAKrB,EAAIqC,GAAI,EAAIf,EAC7BtB,EAAIqC,GAAI,EAAIN,EAAK/B,EAAIqC,GAAI,EAAIL,EAC7BhC,EAAIqC,GAAI,EAAIJ,EAAKjC,EAAIqC,GAAI,EAAIH,CAC/B,CAYO,IAAMM,GAAsCC,GAAaC,GAAY,CAC1E,aAAc,GACd,cAAe,EACf,eAAgB,GACjB,EAMYC,GAAuCF,GAAaC,GAAY,CAC3E,aAAc,GACd,cAAe,EACf,cAAeE,GACf,eAAgB,GACjB,EAgBD,IAAMC,GAA0B,IAAI,WAAW,EAAE,EAE3CC,GAAe,CAACC,EAAuCC,IAAmB,CAC9ED,EAAE,OAAOC,CAAG,EACZ,IAAMC,EAAWD,EAAI,OAAS,GAC1BC,GAAUF,EAAE,OAAOF,GAAQ,SAASI,CAAQ,CAAC,CACnD,EAEMC,GAA0B,IAAI,WAAW,EAAE,EACjD,SAASC,GACPC,EACAC,EACAC,EACAC,EACAC,EAAgB,CAEZA,IAAQ,QAAWC,GAAOD,EAAK,OAAW,KAAK,EACnD,IAAME,EAAUN,EAAGC,EAAKC,EAAOJ,EAAO,EAChCS,EAAUC,GAAWL,EAAW,OAAQC,EAAMA,EAAI,OAAS,EAAG,EAAI,EAIlET,EAAIc,GAAS,OAAOH,CAAO,EAC7BF,GAAKV,GAAaC,EAAGS,CAAG,EAC5BV,GAAaC,EAAGQ,CAAU,EAC1BR,EAAE,OAAOY,CAAO,EAChB,IAAMG,EAAMf,EAAE,OAAM,EACpB,OAAAgB,GAAML,EAASC,CAAO,EACfG,CACT,CASO,IAAME,GACVC,GACD,CAACZ,EAAiBC,EAAmBE,KAE5B,CACL,QAAQU,EAAuBC,EAAmB,CAChD,IAAMC,EAAUF,EAAU,OAC1BC,EAASE,GAAUD,EAAU,GAAWD,EAAQ,EAAK,EACrDA,EAAO,IAAID,CAAS,EACpB,IAAMI,EAASH,EAAO,SAAS,EAAG,GAAU,EAE5CF,EAAUZ,EAAKC,EAAOgB,EAAQA,EAAQ,CAAC,EACvC,IAAMC,EAAMpB,GAAWc,EAAWZ,EAAKC,EAAOgB,EAAQd,CAAG,EACzD,OAAAW,EAAO,IAAII,EAAKH,CAAO,EACvBL,GAAMQ,CAAG,EACFJ,CACT,EACA,QAAQZ,EAAwBY,EAAmB,CACjDA,EAASE,GAAUd,EAAW,OAAS,GAAWY,EAAQ,EAAK,EAC/D,IAAMK,EAAOjB,EAAW,SAAS,EAAG,GAAU,EACxCkB,EAAYlB,EAAW,SAAS,GAAU,EAC1CgB,EAAMpB,GAAWc,EAAWZ,EAAKC,EAAOkB,EAAMhB,CAAG,EACvD,GAAI,CAACkB,GAAWD,EAAWF,CAAG,EAAG,MAAM,IAAI,MAAM,aAAa,EAC9D,OAAAJ,EAAO,IAAIZ,EAAW,SAAS,EAAG,GAAU,CAAC,EAE7CU,EAAUZ,EAAKC,EAAOa,EAAQA,EAAQ,CAAC,EACvCJ,GAAMQ,CAAG,EACFJ,CACT,IAUOQ,GAA8CC,GACzD,CAAE,UAAW,GAAI,YAAa,GAAI,UAAW,EAAE,EAC/CZ,GAAea,EAAQ,CAAC,EAQbC,GAA+CF,GAC1D,CAAE,UAAW,GAAI,YAAa,GAAI,UAAW,EAAE,EAC/CZ,GAAee,EAAS,CAAC,ECjVrB,SAAUC,GAAQC,EAAaC,EAAYC,EAAY,CAC3D,OAAAC,GAAMH,CAAI,EAINE,IAAS,SAAWA,EAAO,IAAI,WAAWF,EAAK,SAAS,GACrDI,GAAKJ,EAAMK,GAAQH,CAAI,EAAGG,GAAQJ,CAAG,CAAC,CAC/C,CAEA,IAAMK,GAA+B,WAAW,KAAK,CAAC,CAAC,CAAC,EAClDC,GAA+B,WAAW,GAAE,EAS5C,SAAUC,GAAOR,EAAaS,EAAYC,EAAcC,EAAiB,GAAE,CAC/ER,GAAMH,CAAI,EACVY,GAAQD,CAAM,EACd,IAAME,EAAOb,EAAK,UAClB,GAAIW,EAAS,IAAME,EAAM,MAAM,IAAI,MAAM,iCAAiC,EAC1E,IAAMC,EAAS,KAAK,KAAKH,EAASE,CAAI,EAClCH,IAAS,SAAWA,EAAOH,IAE/B,IAAMQ,EAAM,IAAI,WAAWD,EAASD,CAAI,EAElCG,EAAOZ,GAAK,OAAOJ,EAAMS,CAAG,EAC5BQ,EAAUD,EAAK,WAAU,EACzBE,EAAI,IAAI,WAAWF,EAAK,SAAS,EACvC,QAASG,EAAU,EAAGA,EAAUL,EAAQK,IACtCb,GAAa,CAAC,EAAIa,EAAU,EAG5BF,EAAQ,OAAOE,IAAY,EAAIZ,GAAeW,CAAC,EAC5C,OAAOR,CAAI,EACX,OAAOJ,EAAY,EACnB,WAAWY,CAAC,EACfH,EAAI,IAAIG,EAAGL,EAAOM,CAAO,EACzBH,EAAK,WAAWC,CAAO,EAEzB,OAAAD,EAAK,QAAO,EACZC,EAAQ,QAAO,EACfG,GAAMF,EAAGZ,EAAY,EACdS,EAAI,MAAM,EAAGJ,CAAM,CAC5B,CClDA,SAASU,GAAQC,EAAU,CACzB,OAAOA,aAAa,YAAe,YAAY,OAAOA,CAAC,GAAKA,EAAE,YAAY,OAAS,YACrF,CAEA,SAASC,GAAOC,EAAyB,CACvC,GAAI,CAACH,GAAQG,CAAC,EAAG,MAAM,IAAI,MAAM,qBAAqB,CACxD,CAEA,SAASC,GAAUC,EAAmBC,EAAU,CAC9C,OAAK,MAAM,QAAQA,CAAG,EAClBA,EAAI,SAAW,EAAU,GACzBD,EACKC,EAAI,MAAOC,GAAS,OAAOA,GAAS,QAAQ,EAE5CD,EAAI,MAAOC,GAAS,OAAO,cAAcA,CAAI,CAAC,EALvB,EAOlC,CAEA,SAASC,GAAIC,EAAe,CAC1B,GAAI,OAAOA,GAAU,WAAY,MAAM,IAAI,MAAM,mBAAmB,EACpE,MAAO,EACT,CAEA,SAASC,GAAKC,EAAeF,EAAc,CACzC,GAAI,OAAOA,GAAU,SAAU,MAAM,IAAI,MAAM,GAAGE,CAAK,mBAAmB,EAC1E,MAAO,EACT,CAEA,SAASC,GAAQC,EAAS,CACxB,GAAI,CAAC,OAAO,cAAcA,CAAC,EAAG,MAAM,IAAI,MAAM,oBAAoBA,CAAC,EAAE,CACvE,CAEA,SAASC,GAAKL,EAAY,CACxB,GAAI,CAAC,MAAM,QAAQA,CAAK,EAAG,MAAM,IAAI,MAAM,gBAAgB,CAC7D,CACA,SAASM,GAAQJ,EAAeF,EAAe,CAC7C,GAAI,CAACL,GAAU,GAAMK,CAAK,EAAG,MAAM,IAAI,MAAM,GAAGE,CAAK,6BAA6B,CACpF,CACA,SAASK,GAAQL,EAAeF,EAAe,CAC7C,GAAI,CAACL,GAAU,GAAOK,CAAK,EAAG,MAAM,IAAI,MAAM,GAAGE,CAAK,6BAA6B,CACrF,CAqBA,SAASM,MAAuCC,EAAO,CACrD,IAAMC,EAAMlB,GAAWA,EAEjBmB,EAAO,CAACnB,EAAQE,IAAY,GAAWF,EAAEE,EAAE,CAAC,CAAC,EAE7CkB,EAASH,EAAK,IAAKI,GAAMA,EAAE,MAAM,EAAE,YAAYF,EAAMD,CAAE,EAEvDI,EAASL,EAAK,IAAKI,GAAMA,EAAE,MAAM,EAAE,OAAOF,EAAMD,CAAE,EACxD,MAAO,CAAE,OAAAE,EAAQ,OAAAE,CAAM,CACzB,CAOA,SAASC,GAASC,EAA0B,CAE1C,IAAMC,EAAW,OAAOD,GAAY,SAAWA,EAAQ,MAAM,EAAE,EAAIA,EAC7DE,EAAMD,EAAS,OACrBX,GAAQ,WAAYW,CAAQ,EAG5B,IAAME,EAAU,IAAI,IAAIF,EAAS,IAAI,CAACG,EAAG,IAAM,CAACA,EAAG,CAAC,CAAC,CAAC,EACtD,MAAO,CACL,OAASC,IACPhB,GAAKgB,CAAM,EACJA,EAAO,IAAK,GAAK,CACtB,GAAI,CAAC,OAAO,cAAc,CAAC,GAAK,EAAI,GAAK,GAAKH,EAC5C,MAAM,IAAI,MACR,kDAAkD,CAAC,eAAeF,CAAO,EAAE,EAE/E,OAAOC,EAAS,CAAC,CACnB,CAAC,GAEH,OAASjB,IACPK,GAAKL,CAAK,EACHA,EAAM,IAAKsB,GAAU,CAC1BrB,GAAK,kBAAmBqB,CAAM,EAC9B,IAAMC,EAAIJ,EAAQ,IAAIG,CAAM,EAC5B,GAAIC,IAAM,OAAW,MAAM,IAAI,MAAM,oBAAoBD,CAAM,eAAeN,CAAO,EAAE,EACvF,OAAOO,CACT,CAAC,GAGP,CAKA,SAASC,GAAKC,EAAY,GAAE,CAC1B,OAAAxB,GAAK,OAAQwB,CAAS,EACf,CACL,OAASC,IACPpB,GAAQ,cAAeoB,CAAI,EACpBA,EAAK,KAAKD,CAAS,GAE5B,OAASE,IACP1B,GAAK,cAAe0B,CAAE,EACfA,EAAG,MAAMF,CAAS,GAG/B,CAMA,SAASG,GAAQC,EAAcC,EAAM,IAAG,CACtC,OAAA3B,GAAQ0B,CAAI,EACZ5B,GAAK,UAAW6B,CAAG,EACZ,CACL,OAAOC,EAAc,CAEnB,IADAzB,GAAQ,iBAAkByB,CAAI,EACtBA,EAAK,OAASF,EAAQ,GAAGE,EAAK,KAAKD,CAAG,EAC9C,OAAOC,CACT,EACA,OAAO/B,EAAe,CACpBM,GAAQ,iBAAkBN,CAAK,EAC/B,IAAIgC,EAAMhC,EAAM,OAChB,GAAKgC,EAAMH,EAAQ,EACjB,MAAM,IAAI,MAAM,4DAA4D,EAC9E,KAAOG,EAAM,GAAKhC,EAAMgC,EAAM,CAAC,IAAMF,EAAKE,IAGxC,IAFaA,EAAM,GACCH,EACT,IAAM,EAAG,MAAM,IAAI,MAAM,+CAA+C,EAErF,OAAO7B,EAAM,MAAM,EAAGgC,CAAG,CAC3B,EAEJ,CA0DA,IAAMC,GAAM,CAACC,EAAWC,IAAuBA,IAAM,EAAID,EAAID,GAAIE,EAAGD,EAAIC,CAAC,EACnEC,GAAyC,CAACC,EAAcC,IAC5DD,GAAQC,EAAKL,GAAII,EAAMC,CAAE,GACrBC,IAAoC,IAAK,CAC7C,IAAIC,EAAM,CAAA,EACV,QAASC,EAAI,EAAGA,EAAI,GAAIA,IAAKD,EAAI,KAAK,GAAKC,CAAC,EAC5C,OAAOD,CACT,GAAE,EAIF,SAASE,GAAcC,EAAgBN,EAAcC,EAAYM,EAAgB,CAE/E,GADAC,GAAKF,CAAI,EACLN,GAAQ,GAAKA,EAAO,GAAI,MAAM,IAAI,MAAM,6BAA6BA,CAAI,EAAE,EAC/E,GAAIC,GAAM,GAAKA,EAAK,GAAI,MAAM,IAAI,MAAM,2BAA2BA,CAAE,EAAE,EACvE,GAAIF,GAAYC,EAAMC,CAAE,EAAI,GAC1B,MAAM,IAAI,MACR,sCAAsCD,CAAI,OAAOC,CAAE,cAAcF,GAAYC,EAAMC,CAAE,CAAC,EAAE,EAG5F,IAAIQ,EAAQ,EACRC,EAAM,EACJC,EAAMT,GAAOF,CAAI,EACjBY,EAAOV,GAAOD,CAAE,EAAK,EACrBE,EAAgB,CAAA,EACtB,QAAWU,KAAKP,EAAM,CAEpB,GADAQ,GAAQD,CAAC,EACLA,GAAKF,EAAK,MAAM,IAAI,MAAM,oCAAoCE,CAAC,SAASb,CAAI,EAAE,EAElF,GADAS,EAASA,GAAST,EAAQa,EACtBH,EAAMV,EAAO,GAAI,MAAM,IAAI,MAAM,qCAAqCU,CAAG,SAASV,CAAI,EAAE,EAE5F,IADAU,GAAOV,EACAU,GAAOT,EAAIS,GAAOT,EAAIE,EAAI,MAAOM,GAAUC,EAAMT,EAAOW,KAAU,CAAC,EAC1E,IAAMG,EAAMb,GAAOQ,CAAG,EACtB,GAAIK,IAAQ,OAAW,MAAM,IAAI,MAAM,eAAe,EACtDN,GAASM,EAAM,CACjB,CAEA,GADAN,EAASA,GAAUR,EAAKS,EAAQE,EAC5B,CAACL,GAAWG,GAAOV,EAAM,MAAM,IAAI,MAAM,gBAAgB,EAC7D,GAAI,CAACO,GAAWE,EAAQ,EAAG,MAAM,IAAI,MAAM,qBAAqBA,CAAK,EAAE,EACvE,OAAIF,GAAWG,EAAM,GAAGP,EAAI,KAAKM,IAAU,CAAC,EACrCN,CACT,CAyBA,SAASa,GAAOC,EAAcC,EAAa,GAAK,CAE9C,GADAC,GAAQF,CAAI,EACRA,GAAQ,GAAKA,EAAO,GAAI,MAAM,IAAI,MAAM,mCAAmC,EAC/E,GAAIG,GAAY,EAAGH,CAAI,EAAI,IAAMG,GAAYH,EAAM,CAAC,EAAI,GACtD,MAAM,IAAI,MAAM,wBAAwB,EAC1C,MAAO,CACL,OAASI,GAAqB,CAC5B,GAAI,CAACC,GAAQD,CAAK,EAAG,MAAM,IAAI,MAAM,0CAA0C,EAC/E,OAAOE,GAAc,MAAM,KAAKF,CAAK,EAAG,EAAGJ,EAAM,CAACC,CAAU,CAC9D,EACA,OAASM,IACPC,GAAQ,gBAAiBD,CAAM,EACxB,WAAW,KAAKD,GAAcC,EAAQP,EAAM,EAAGC,CAAU,CAAC,GAGvE,CAGA,SAASQ,GAA+CC,EAAK,CAC3D,OAAAC,GAAID,CAAE,EACC,YAAaE,EAAsB,CACxC,GAAI,CACF,OAAOF,EAAG,MAAM,KAAME,CAAI,CAC5B,MAAY,CAAC,CACf,CACF,CAyIA,IAAMC,GACJ,OAAQ,WAAmB,KAAK,CAAA,CAAE,EAAE,UAAa,YACjD,OAAQ,WAAmB,YAAe,WAEtCC,GAAsB,CAACC,EAAWC,IAAkB,CACxDC,GAAK,SAAUF,CAAC,EAChB,IAAMG,EAAKF,EAAQ,oBAAsB,oBACnCG,EAAWH,EAAQ,YAAc,SACvC,GAAID,EAAE,OAAS,GAAK,CAACG,EAAG,KAAKH,CAAC,EAAG,MAAM,IAAI,MAAM,gBAAgB,EACjE,OAAQ,WAAmB,WAAWA,EAAG,CAAE,SAAAI,EAAU,kBAAmB,QAAQ,CAAE,CACpF,EAgBaC,GAAqBP,GAAmB,CACnD,OAAOQ,EAAC,CAAI,OAAAC,GAAOD,CAAC,EAAWA,EAAU,SAAQ,CAAI,EACrD,OAAON,EAAC,CAAI,OAAOD,GAAoBC,EAAG,EAAK,CAAG,GAChDQ,GACFC,GAAO,CAAC,EACRL,GAAS,kEAAkE,EAC3EM,GAAQ,CAAC,EACTC,GAAK,EAAE,CAAC,EAsJV,IAAMC,GAAyCC,GAC7CC,GAAS,kCAAkC,EAC3CC,GAAK,EAAE,CAAC,EAGJC,GAAqB,CAAC,UAAY,UAAY,UAAY,WAAY,SAAU,EACtF,SAASC,GAAcC,EAAW,CAChC,IAAMC,EAAID,GAAO,GACbE,GAAOF,EAAM,WAAc,EAC/B,QAASG,EAAI,EAAGA,EAAIL,GAAmB,OAAQK,KACvCF,GAAKE,EAAK,KAAO,IAAGD,GAAOJ,GAAmBK,CAAC,GAEvD,OAAOD,CACT,CAEA,SAASE,GAAaC,EAAgBC,EAAiBC,EAAgB,EAAC,CACtE,IAAMC,EAAMH,EAAO,OACfH,EAAM,EACV,QAAS,EAAI,EAAG,EAAIM,EAAK,IAAK,CAC5B,IAAMC,EAAIJ,EAAO,WAAW,CAAC,EAC7B,GAAII,EAAI,IAAMA,EAAI,IAAK,MAAM,IAAI,MAAM,mBAAmBJ,CAAM,GAAG,EACnEH,EAAMH,GAAcG,CAAG,EAAKO,GAAK,CACnC,CACAP,EAAMH,GAAcG,CAAG,EACvB,QAAS,EAAI,EAAG,EAAIM,EAAK,IAAKN,EAAMH,GAAcG,CAAG,EAAKG,EAAO,WAAW,CAAC,EAAI,GACjF,QAASK,KAAKJ,EAAOJ,EAAMH,GAAcG,CAAG,EAAIQ,EAChD,QAAS,EAAI,EAAG,EAAI,EAAG,IAAKR,EAAMH,GAAcG,CAAG,EACnD,OAAAA,GAAOK,EACAb,GAAc,OAAOiB,GAAc,CAACT,EAAMU,GAAO,EAAE,CAAE,EAAG,GAAI,EAAG,EAAK,CAAC,CAC9E,CAsBA,SAASC,GAAUC,EAA8B,CAC/C,IAAMC,EAAiBD,IAAa,SAAW,EAAI,UAC7CE,EAASC,GAAO,CAAC,EACjBC,EAAYF,EAAO,OACnBG,EAAUH,EAAO,OACjBI,EAAkBC,GAAcH,CAAS,EAE/C,SAASI,EACPjB,EACAC,EACAiB,EAAwB,GAAE,CAE1BC,GAAK,uBAAwBnB,CAAM,EAC/BoB,GAAQnB,CAAK,IAAGA,EAAQ,MAAM,KAAKA,CAAK,GAC5CoB,GAAQ,gBAAiBpB,CAAK,EAC9B,IAAMqB,EAAOtB,EAAO,OACpB,GAAIsB,IAAS,EAAG,MAAM,IAAI,UAAU,yBAAyBA,CAAI,EAAE,EACnE,IAAMC,EAAeD,EAAO,EAAIrB,EAAM,OACtC,GAAIiB,IAAU,IAASK,EAAeL,EACpC,MAAM,IAAI,UAAU,UAAUK,CAAY,kBAAkBL,CAAK,EAAE,EACrE,IAAMM,EAAUxB,EAAO,YAAW,EAC5ByB,EAAM1B,GAAayB,EAASvB,EAAOS,CAAc,EACvD,MAAO,GAAGc,CAAO,IAAInC,GAAc,OAAOY,CAAK,CAAC,GAAGwB,CAAG,EACxD,CAOA,SAASC,EAAOC,EAAaT,EAAwB,GAAE,CACrDC,GAAK,sBAAuBQ,CAAG,EAC/B,IAAMC,EAAOD,EAAI,OACjB,GAAIC,EAAO,GAAMV,IAAU,IAASU,EAAOV,EACzC,MAAM,IAAI,UAAU,0BAA0BU,CAAI,KAAKD,CAAG,mBAAmBT,CAAK,GAAG,EAEvF,IAAMM,EAAUG,EAAI,YAAW,EAC/B,GAAIA,IAAQH,GAAWG,IAAQA,EAAI,YAAW,EAC5C,MAAM,IAAI,MAAM,uCAAuC,EACzD,IAAME,EAAWL,EAAQ,YAAY,GAAG,EACxC,GAAIK,IAAa,GAAKA,IAAa,GACjC,MAAM,IAAI,MAAM,yDAAyD,EAC3E,IAAM7B,EAASwB,EAAQ,MAAM,EAAGK,CAAQ,EAClCC,EAAON,EAAQ,MAAMK,EAAW,CAAC,EACvC,GAAIC,EAAK,OAAS,EAAG,MAAM,IAAI,MAAM,yCAAyC,EAC9E,IAAM7B,EAAQZ,GAAc,OAAOyC,CAAI,EAAE,MAAM,EAAG,EAAE,EAC9CL,EAAM1B,GAAaC,EAAQC,EAAOS,CAAc,EACtD,GAAI,CAACoB,EAAK,SAASL,CAAG,EAAG,MAAM,IAAI,MAAM,uBAAuBE,CAAG,eAAeF,CAAG,GAAG,EACxF,MAAO,CAAE,OAAAzB,EAAQ,MAAAC,CAAK,CACxB,CAEA,IAAM8B,EAAef,GAAcU,CAAM,EAEzC,SAASM,EAAcL,EAAW,CAChC,GAAM,CAAE,OAAA3B,EAAQ,MAAAC,CAAK,EAAKyB,EAAOC,EAAK,EAAK,EAC3C,MAAO,CAAE,OAAA3B,EAAQ,MAAAC,EAAO,MAAOY,EAAUZ,CAAK,CAAC,CACjD,CAEA,SAASgC,EAAgBjC,EAAgBkC,EAAiB,CACxD,OAAOjB,EAAOjB,EAAQc,EAAQoB,CAAK,CAAC,CACtC,CAEA,MAAO,CACL,OAAAjB,EACA,OAAAS,EACA,gBAAAO,EACA,cAAAD,EACA,aAAAD,EACA,UAAAlB,EACA,gBAAAE,EACA,QAAAD,EAEJ,CAOO,IAAMqB,GAAiB3B,GAAU,QAAQ,EN3uBhD,IAAM4B,GAAc,IAAI,YAClBC,GAAc,IAAI,YAElBC,GAAmB,EACnBC,GAAmB,MAKzB,SAASC,GAAcC,EAAqB,CAC1C,GAAI,CAAC,OAAO,cAAcA,CAAG,GAAKA,EAAM,EAAG,MAAM,IAAI,MAAM,2BAA2B,EACtF,GAAIA,GAAO,GAAI,MAAO,IACtB,IAAMC,EAAY,GAAM,KAAK,MAAM,KAAK,KAAKD,EAAM,CAAC,CAAC,EAAI,EACnDE,EAAQD,GAAa,IAAM,GAAKA,EAAY,EAClD,OAAOC,GAAS,KAAK,OAAOF,EAAM,GAAKE,CAAK,EAAI,EAClD,CAKA,SAASC,GAAIC,EAA+B,CAC1C,IAAMC,EAAWV,GAAY,OAAOS,CAAS,EACvCE,EAAcD,EAAS,OAC7B,GAAIC,EAAcT,IAAoBS,EAAcR,GAClD,MAAM,IAAI,MAAM,6DAA6D,EAC/E,IAAMS,EAAS,IAAI,WAAW,CAAC,EAC/B,IAAI,SAASA,EAAO,MAAM,EAAE,UAAU,EAAGD,EAAa,EAAK,EAC3D,IAAME,EAAS,IAAI,WAAWT,GAAcO,CAAW,EAAIA,CAAW,EACtE,OAAOG,EAAYF,EAAQF,EAAUG,CAAM,CAC7C,CAKA,SAASE,GAAMC,EAA4B,CACzC,IAAML,EAAc,IAAI,SAASK,EAAO,OAAQA,EAAO,UAAU,EAAE,UAAU,EAAG,EAAK,EAC/EN,EAAWM,EAAO,SAAS,EAAG,EAAIL,CAAW,EACnD,GACEA,EAAcT,IACdS,EAAcR,IACdO,EAAS,SAAWC,GACpBK,EAAO,SAAW,EAAIZ,GAAcO,CAAW,EAE/C,MAAM,IAAI,MAAM,iBAAiB,EAEnC,OAAOV,GAAY,OAAOS,CAAQ,CACpC,CAKA,SAASO,GAAmBC,EAAsBC,EAA6B,CAE7E,IAAMC,EADcC,GAAU,gBAAgBH,EAAU,KAAOC,CAAO,EAC1C,SAAS,EAAG,EAAE,EAC1C,OAAOG,GAAaC,GAAQH,EAASpB,GAAY,OAAO,UAAU,CAAC,CACrE,CAKA,SAASwB,GAAeC,EAA6BC,EAInD,CACA,IAAMC,EAAOC,GAAYL,GAAQE,EAAiBC,EAAO,EAAE,EAC3D,MAAO,CACL,WAAYC,EAAK,SAAS,EAAG,EAAE,EAC/B,aAAcA,EAAK,SAAS,GAAI,EAAE,EAClC,SAAUA,EAAK,SAAS,GAAI,EAAE,CAChC,CACF,CASA,SAASE,GAAQpB,EAAmBgB,EAA6BC,EAAoBI,GAAY,EAAE,EAAW,CAC5G,GAAM,CAAE,WAAAC,EAAY,aAAAC,EAAc,SAAAC,CAAS,EAAIT,GAAeC,EAAiBC,CAAK,EAC9EV,EAASR,GAAIC,CAAS,EACtByB,EAAaC,GAASJ,EAAYC,EAAchB,CAAM,EACtDoB,EAAMC,GAAKd,GAAQU,EAAUnB,EAAYY,EAAOQ,CAAU,CAAC,EACjE,OAAOI,GAAO,OAAOxB,EAAY,IAAI,WAAW,CAAC,CAAC,CAAC,EAAGY,EAAOQ,EAAYE,CAAG,CAAC,CAC/E,CAQA,SAASG,GAAQC,EAAiBf,EAAqC,CACrE,IAAMgB,EAAOH,GAAO,OAAOE,CAAO,EAC5BE,EAAUD,EAAK,CAAC,EACtB,GAAIC,IAAY,EAAG,MAAM,IAAI,MAAM,+BAA+BA,CAAO,EAAE,EAC3E,GAAID,EAAK,OAAS,IAAMA,EAAK,OAAS,MAAO,MAAM,IAAI,MAAM,sBAAsB,EACnF,IAAMf,EAAQe,EAAK,SAAS,EAAG,EAAE,EAC3BP,EAAaO,EAAK,SAAS,GAAIA,EAAK,OAAS,EAAE,EAC/CL,EAAMK,EAAK,SAASA,EAAK,OAAS,EAAE,EACpC,CAAE,WAAAV,EAAY,aAAAC,EAAc,SAAAC,CAAS,EAAIT,GAAeC,EAAiBC,CAAK,EAC9EiB,EAAcN,GAAKd,GAAQU,EAAUnB,EAAYY,EAAOQ,CAAU,CAAC,EACzE,GAAI,CAACU,GAAWR,EAAKO,CAAW,EAAG,MAAM,IAAI,MAAM,aAAa,EAChE,IAAM3B,EAASmB,GAASJ,EAAYC,EAAcE,CAAU,EAC5D,OAAOnB,GAAMC,CAAM,CACrB,CAKO,IAAM6B,GAAK,CAChB,MAAO,CACL,mBAAA5B,GACA,cAAAb,EACF,EACA,QAAAyB,GACA,QAAAU,EACF,EOtIA,IAAAO,GAAA,GAAAC,GAAAD,GAAA,oBAAAE,GAAA,oBAAAC,GAAA,kBAAAC,GAAA,mBAAAC,GAAA,yBAAAC,GAAA,kBAAAC,GAAA,wBAAAC,GAAA,qBAAAC,GAAA,mBAAAC,GAAA,cAAAC,GAAA,eAAAC,GAAA,wBAAAC,GAAA,wBAAAC,GAAA,wBAAAC,GAAA,wBAAAC,GAAA,mBAAAC,GAAA,iBAAAC,GAAA,gBAAAC,GAAA,mBAAAC,GAAA,qBAAAC,GAAA,gBAAAC,GAAA,sBAAAC,GAAA,cAAAC,KAsCO,SAASC,GAAeC,EAAwB,CACrD,GAAI,CAACA,EAAI,WAAW,WAAW,EAC7B,MAAM,IAAI,MAAM,+CAA+C,EAGjE,IAAMC,EAAM,IAAI,IAAID,EAAI,QAAQ,YAAa,UAAU,CAAC,EAClDE,EAAeD,EAAI,SAEzB,GAAI,CAAC,iBAAiB,KAAKC,CAAY,EACrC,MAAM,IAAI,MAAM,6DAA6D,EAG/E,IAAMC,EAASF,EAAI,aAAa,OAAO,OAAO,EAC9C,GAAIE,EAAO,SAAW,EACpB,MAAM,IAAI,MAAM,oDAAoD,EAGtE,IAAMC,EAASH,EAAI,aAAa,IAAI,QAAQ,GAAK,OAEjD,MAAO,CAAE,aAAAC,EAAc,OAAAC,EAAQ,OAAAC,CAAO,CACxC,CASO,SAASC,GAAgBH,EAAsBC,EAAkBC,EAAyB,CAC/F,GAAI,CAAC,iBAAiB,KAAKF,CAAY,EACrC,MAAM,IAAI,MAAM,wCAAwC,EAE1D,GAAIC,EAAO,SAAW,EACpB,MAAM,IAAI,MAAM,gCAAgC,EAGlD,IAAMG,EAASH,EAAO,IAAII,GAAK,SAAS,mBAAmBA,CAAC,CAAC,EAAE,EAC/D,OAAIH,GACFE,EAAO,KAAK,UAAU,mBAAmBF,CAAM,CAAC,EAAE,EAG7C,YAAYF,CAAY,IAAII,EAAO,KAAK,GAAG,CAAC,EACrD,CAKO,SAASE,GAAkBR,EAAqC,CACrE,GAAI,CAEF,MAAO,CAAE,QAAS,GAAM,IADTD,GAAeC,CAAG,CACG,CACtC,OAASS,EAAG,CACV,MAAO,CAAE,QAAS,GAAO,MAAQA,EAAY,OAAQ,CACvD,CACF,CASO,SAASC,GAAcR,EAAoC,CAChE,GAAI,CAAC,iBAAiB,KAAKA,CAAY,EACrC,MAAM,IAAI,MAAM,wCAAwC,EAG1D,IAAMS,EAAuBC,GAAY,EAAE,EACrCC,EAAkBC,EAAWH,CAAoB,EACjDI,EAAoBC,GAAQ,aAAaL,CAAoB,EAC7DM,EAAeH,EAAWC,CAAiB,EAE3CG,EAAkBC,GAAwBR,EAAsBT,CAAY,EAElF,MAAO,CACL,gBAAAW,EACA,aAAAI,EACA,aAAAf,EACA,gBAAAgB,CACF,CACF,CAQO,SAASE,GAAeP,EAAyBX,EAAoC,CAC1F,IAAMS,EAAuBU,EAAWR,CAAe,EACjDE,EAAoBC,GAAQ,aAAaL,CAAoB,EAC7DM,EAAeH,EAAWC,CAAiB,EAE3CG,EAAkBC,GAAwBR,EAAsBT,CAAY,EAElF,MAAO,CACL,gBAAAW,EACA,aAAAI,EACA,aAAAf,EACA,gBAAAgB,CACF,CACF,CAKO,SAASI,GAAeC,EAAyC,CACtE,MAAO,CACL,aAAcA,EAAQ,aACtB,aAAcA,EAAQ,YACxB,CACF,CAWO,SAASC,GAAcC,EAA8BnB,EAAkBoB,EAA2B,CACvG,MAAO,CACL,GAAIA,GAAMZ,EAAWF,GAAY,EAAE,CAAC,EACpC,OAAAa,EACA,OAAAnB,CACF,CACF,CASO,SAASqB,GAAeD,EAAYE,EAAiBC,EAA+B,CACzF,IAAMC,EAA0B,CAAE,GAAAJ,CAAG,EACrC,OAAIE,IAAW,SAAWE,EAAS,OAASF,GACxCC,IAAU,SAAWC,EAAS,MAAQD,GACnCC,CACT,CAOO,SAASC,GAAaC,EAA4C,CACvE,IAAMC,EAAM,KAAK,MAAMD,CAAI,EAC3B,GAAI,OAAOC,EAAI,IAAO,SACpB,MAAM,IAAI,MAAM,oCAAoC,EAEtD,OAAOA,CACT,CAKO,SAASC,GAAUC,EAAgE,CACxF,MAAO,WAAYA,GAAW,WAAYA,CAC5C,CAKO,SAASC,GAAWD,EAAiE,CAC1F,MAAO,WAAYA,GAAW,UAAWA,CAC3C,CAWA,eAAsBE,GACpBF,EACAZ,EACAe,EAC2B,CAC3B,IAAMN,EAAO,KAAK,UAAUG,CAAO,EAC7BI,EAAYC,GAAaR,EAAMT,EAAQ,eAAe,EAGtDkB,EAAQ,CACZ,KAAM,MACN,WAHiB,KAAK,MAAM,KAAK,IAAI,EAAI,GAAI,EAI7C,KAAM,CAAC,CAAC,IAAKH,CAAe,CAAC,EAC7B,QAASC,EACT,OAAQhB,EAAQ,YAClB,EAGMmB,EAAa,KAAK,UAAU,CAChC,EACAD,EAAM,OACNA,EAAM,WACNA,EAAM,KACNA,EAAM,KACNA,EAAM,OACR,CAAC,EAEKE,EAAYC,GAAO,IAAI,YAAY,EAAE,OAAOF,CAAU,CAAC,EACvDG,EAAkBxB,EAAWE,EAAQ,eAAe,EACpDuB,EAAiB9B,GAAQ,KAAK2B,EAAWE,CAAe,EAE9D,MAAO,CACL,GAAGJ,EACH,GAAI3B,EAAW6B,CAAS,EACxB,IAAK7B,EAAWgC,CAAc,CAChC,CACF,CAQO,SAASC,GACdN,EACAlB,EAC8B,CAC9B,GAAIkB,EAAM,OAAS,MACjB,MAAM,IAAI,MAAM,4BAA4BA,EAAM,IAAI,EAAE,EAG1D,IAAMT,EAAOgB,GAAaP,EAAM,QAASlB,EAAQ,eAAe,EAChE,OAAOQ,GAAaC,CAAI,CAC1B,CAUO,SAASiB,GAAe/C,EAAsBE,EAAiB8C,EAAoC,CACxG,IAAM5C,EAAS,CAACJ,CAAY,EAC5B,OAAIE,EAAQE,EAAO,KAAKF,CAAM,EACrB8C,GAAa5C,EAAO,KAAK,EAAE,EAChC4C,GAAa5C,EAAO,KAAK4C,CAAW,EACjC1B,aAAmClB,CAAM,CAClD,CAGO,SAAS6C,IAA4B,CAC1C,OAAO3B,UAAgC,CAAC,CAAC,CAC3C,CAGO,SAAS4B,IAAoC,CAClD,OAAO5B,oBAA0C,CAAC,CAAC,CACrD,CAMO,SAAS6B,GAAiBC,EAAiC,CAChE,OAAO9B,gBAAsC,CAAC8B,CAAS,CAAC,CAC1D,CAOO,SAASC,GAAoBC,EAA0BC,EAAiC,CAC7F,OAAOjC,mBAAyC,CAACgC,EAAkBC,CAAS,CAAC,CAC/E,CAOO,SAASC,GAAoBF,EAA0BG,EAAkC,CAC9F,OAAOnC,mBAAyC,CAACgC,EAAkBG,CAAU,CAAC,CAChF,CAOO,SAASC,GAAoBJ,EAA0BC,EAAiC,CAC7F,OAAOjC,mBAAyC,CAACgC,EAAkBC,CAAS,CAAC,CAC/E,CAOO,SAASI,GAAoBL,EAA0BG,EAAkC,CAC9F,OAAOnC,mBAAyC,CAACgC,EAAkBG,CAAU,CAAC,CAChF,CAGO,SAASG,IAAiC,CAC/C,OAAOtC,gBAAsC,CAAC,CAAC,CACjD,CAUO,SAASuC,GACd9C,EACA+C,EACqD,CACrD,IAAMC,EAA8D,CAClE,MAAO,CAAC,KAAK,EACb,KAAM,CAAChD,CAAY,CACrB,EACA,OAAI+C,IAAU,SACZC,EAAO,MAAQD,GAEVC,CACT,CCnXA,IAAAC,GAAA,GAAAC,GAAAD,GAAA,aAAAE,GAAA,YAAAC,KCmBA,SAASC,GAAWC,EAAaC,EAAqBC,EAAiBC,EAAgB,CACrFC,GAAMJ,CAAI,EACV,IAAMK,EAAOC,GAAU,CAAE,MAAO,GAAI,UAAW,EAAE,EAAIH,CAAK,EACpD,CAAE,EAAAI,EAAG,MAAAC,EAAO,UAAAC,CAAS,EAAKJ,EAIhC,GAHAK,GAAQH,CAAC,EACTG,GAAQF,CAAK,EACbE,GAAQD,CAAS,EACbF,EAAI,EAAG,MAAM,IAAI,MAAM,+BAA+B,EAC1D,IAAMI,EAAWC,GAAgBX,CAAS,EACpCY,EAAOD,GAAgBV,CAAK,EAE5BY,EAAK,IAAI,WAAWN,CAAK,EAEzBO,EAAMC,GAAK,OAAOhB,EAAMW,CAAQ,EAChCM,EAAUF,EAAI,WAAU,EAAG,OAAOF,CAAI,EAC5C,MAAO,CAAE,EAAAN,EAAG,MAAAC,EAAO,UAAAC,EAAW,GAAAK,EAAI,IAAAC,EAAK,QAAAE,CAAO,CAChD,CAEA,SAASC,GACPH,EACAE,EACAH,EACAK,EACAC,EAAa,CAEb,OAAAL,EAAI,QAAO,EACXE,EAAQ,QAAO,EACXE,GAAMA,EAAK,QAAO,EACtBE,GAAMD,CAAC,EACAN,CACT,CAWM,SAAUQ,GACdtB,EACAW,EACAE,EACAR,EAAe,CAEf,GAAM,CAAE,EAAAE,EAAG,MAAAC,EAAO,GAAAM,EAAI,IAAAC,EAAK,QAAAE,CAAO,EAAKlB,GAAWC,EAAMW,EAAUE,EAAMR,CAAI,EACxEc,EACEI,EAAM,IAAI,WAAW,CAAC,EACtBC,EAAOC,GAAWF,CAAG,EACrBH,EAAI,IAAI,WAAWL,EAAI,SAAS,EAEtC,QAASW,EAAK,EAAGC,EAAM,EAAGA,EAAMnB,EAAOkB,IAAMC,GAAOZ,EAAI,UAAW,CAEjE,IAAMa,EAAKd,EAAG,SAASa,EAAKA,EAAMZ,EAAI,SAAS,EAC/CS,EAAK,SAAS,EAAGE,EAAI,EAAK,GAGzBP,EAAOF,EAAQ,WAAWE,CAAI,GAAG,OAAOI,CAAG,EAAE,WAAWH,CAAC,EAC1DQ,EAAG,IAAIR,EAAE,SAAS,EAAGQ,EAAG,MAAM,CAAC,EAC/B,QAASC,EAAK,EAAGA,EAAKtB,EAAGsB,IAAM,CAE7Bd,EAAI,WAAWI,CAAI,EAAE,OAAOC,CAAC,EAAE,WAAWA,CAAC,EAC3C,QAASU,EAAI,EAAGA,EAAIF,EAAG,OAAQE,IAAKF,EAAGE,CAAC,GAAKV,EAAEU,CAAC,CAClD,CACF,CACA,OAAOZ,GAAaH,EAAKE,EAASH,EAAIK,EAAMC,CAAC,CAC/C,CCrEA,SAASW,GACPC,EACAC,EACAC,EACAC,EACAC,EACAC,EAAU,CAIV,IAAIC,EAAMN,EAAKC,GAAI,EAAIC,EAAMC,GAAI,EAAGI,EAAMP,EAAKC,GAAI,EAAIC,EAAMC,GAAI,EAC7DK,EAAMR,EAAKC,GAAI,EAAIC,EAAMC,GAAI,EAAGM,EAAMT,EAAKC,GAAI,EAAIC,EAAMC,GAAI,EAC7DO,EAAMV,EAAKC,GAAI,EAAIC,EAAMC,GAAI,EAAGQ,EAAMX,EAAKC,GAAI,EAAIC,EAAMC,GAAI,EAC7DS,EAAMZ,EAAKC,GAAI,EAAIC,EAAMC,GAAI,EAAGU,EAAMb,EAAKC,GAAI,EAAIC,EAAMC,GAAI,EAC7DW,EAAMd,EAAKC,GAAI,EAAIC,EAAMC,GAAI,EAAGY,EAAMf,EAAKC,GAAI,EAAIC,EAAMC,GAAI,EAC7Da,EAAMhB,EAAKC,GAAI,EAAIC,EAAMC,GAAI,EAAGc,EAAMjB,EAAKC,GAAI,EAAIC,EAAMC,GAAI,EAC7De,EAAMlB,EAAKC,GAAI,EAAIC,EAAMC,GAAI,EAAGgB,EAAMnB,EAAKC,GAAI,EAAIC,EAAMC,GAAI,EAC7DiB,EAAMpB,EAAKC,GAAI,EAAIC,EAAMC,GAAI,EAAGkB,EAAMrB,EAAKC,GAAI,EAAIC,EAAMC,GAAI,EAE7DmB,EAAMhB,EAAKiB,EAAMhB,EAAKiB,EAAMhB,EAAKiB,EAAMhB,EACvCiB,EAAMhB,EAAKiB,EAAMhB,EAAKiB,EAAMhB,EAAKiB,EAAMhB,EACvCiB,EAAMhB,EAAKiB,EAAMhB,EAAKiB,EAAMhB,EAAKiB,EAAMhB,EACvCiB,EAAMhB,EAAKiB,EAAMhB,EAAKiB,EAAMhB,EAAKiB,EAAMhB,EAE3C,QAASiB,EAAI,EAAGA,EAAI,EAAGA,GAAK,EAC1BZ,GAAOa,EAAKjB,EAAMY,EAAM,EAAI,CAAC,EAAGJ,GAAOS,EAAKb,EAAMJ,EAAM,EAAI,CAAC,EAC7DY,GAAOK,EAAKT,EAAMJ,EAAM,EAAG,EAAE,EAAGJ,GAAOiB,EAAKL,EAAMJ,EAAM,EAAG,EAAE,EAC7DC,GAAOQ,EAAKZ,EAAMJ,EAAM,EAAI,CAAC,EAAGY,GAAOI,EAAKR,EAAMJ,EAAM,EAAI,CAAC,EAC7DJ,GAAOgB,EAAKJ,EAAMJ,EAAM,EAAG,EAAE,EAAGJ,GAAOY,EAAKhB,EAAMY,EAAM,EAAG,EAAE,EAC7DC,GAAOG,EAAKP,EAAMJ,EAAM,EAAI,CAAC,EAAGJ,GAAOe,EAAKH,EAAMJ,EAAM,EAAI,CAAC,EAC7DJ,GAAOW,EAAKf,EAAMY,EAAM,EAAG,EAAE,EAAGJ,GAAOO,EAAKX,EAAMJ,EAAM,EAAG,EAAE,EAC7DC,GAAOc,EAAKF,EAAMJ,EAAM,EAAI,CAAC,EAAGJ,GAAOU,EAAKd,EAAMY,EAAM,EAAI,CAAC,EAC7DJ,GAAOM,EAAKV,EAAMJ,EAAM,EAAG,EAAE,EAAGY,GAAOE,EAAKN,EAAMJ,EAAM,EAAG,EAAE,EAC7DN,GAAOgB,EAAKjB,EAAMG,EAAM,EAAI,CAAC,EAAGD,GAAOe,EAAKhB,EAAMD,EAAM,EAAI,CAAC,EAC7DG,GAAOc,EAAKf,EAAMD,EAAM,EAAG,EAAE,EAAGD,GAAOiB,EAAKd,EAAMD,EAAM,EAAG,EAAE,EAC7DI,GAAOW,EAAKZ,EAAMD,EAAM,EAAI,CAAC,EAAGG,GAAOU,EAAKX,EAAMD,EAAM,EAAI,CAAC,EAC7DD,GAAOa,EAAKV,EAAMD,EAAM,EAAG,EAAE,EAAGD,GAAOY,EAAKb,EAAMG,EAAM,EAAG,EAAE,EAC7DI,GAAOM,EAAKP,EAAMD,EAAM,EAAI,CAAC,EAAGD,GAAOS,EAAKN,EAAMD,EAAM,EAAI,CAAC,EAC7DD,GAAOQ,EAAKT,EAAMG,EAAM,EAAG,EAAE,EAAGD,GAAOO,EAAKR,EAAMD,EAAM,EAAG,EAAE,EAC7DI,GAAOK,EAAKF,EAAMD,EAAM,EAAI,CAAC,EAAGD,GAAOI,EAAKL,EAAMG,EAAM,EAAI,CAAC,EAC7DD,GAAOG,EAAKJ,EAAMD,EAAM,EAAG,EAAE,EAAGG,GAAOE,EAAKH,EAAMD,EAAM,EAAG,EAAE,EAG/D/B,EAAIC,GAAI,EAAKC,EAAMgB,EAAO,EAAGlB,EAAIC,GAAI,EAAKE,EAAMgB,EAAO,EACvDnB,EAAIC,GAAI,EAAKG,EAAMgB,EAAO,EAAGpB,EAAIC,GAAI,EAAKI,EAAMgB,EAAO,EACvDrB,EAAIC,GAAI,EAAKK,EAAMgB,EAAO,EAAGtB,EAAIC,GAAI,EAAKM,EAAMgB,EAAO,EACvDvB,EAAIC,GAAI,EAAKO,EAAMgB,EAAO,EAAGxB,EAAIC,GAAI,EAAKQ,EAAMgB,EAAO,EACvDzB,EAAIC,GAAI,EAAKS,EAAMgB,EAAO,EAAG1B,EAAIC,GAAI,EAAKU,EAAMgB,EAAO,EACvD3B,EAAIC,GAAI,EAAKW,EAAMgB,EAAO,EAAG5B,EAAIC,GAAI,EAAKY,EAAMgB,EAAO,EACvD7B,EAAIC,GAAI,EAAKa,EAAMgB,EAAO,EAAG9B,EAAIC,GAAI,EAAKc,EAAMgB,EAAO,EACvD/B,EAAIC,GAAI,EAAKe,EAAMgB,EAAO,EAAGhC,EAAIC,GAAI,EAAKgB,EAAMgB,EAAO,CACzD,CAEA,SAASG,GAAStC,EAAoBC,EAAYC,EAAkBC,EAAYoC,EAAS,CAEvF,IAAIC,EAAOrC,EAAK,EACZsC,EAAOtC,EAAK,GAAKoC,EACrB,QAASH,EAAI,EAAGA,EAAI,GAAIA,IAAKlC,EAAIuC,EAAOL,CAAC,EAAIpC,EAAMC,GAAM,EAAIsC,EAAI,GAAK,GAAKH,CAAC,EAC5E,QAASA,EAAI,EAAGA,EAAIG,EAAGH,IAAKI,GAAQ,GAAIvC,GAAM,GAE5CJ,GAAYK,EAAKuC,EAAMzC,EAAOC,EAAIC,EAAKsC,CAAI,EACvCJ,EAAI,IAAGK,GAAQ,IACnB5C,GAAYK,EAAKsC,EAAMxC,EAAQC,GAAM,GAAKC,EAAKuC,CAAI,CAEvD,CAaA,SAASC,GAAWC,EAAoBC,EAAgBC,EAAkB,CAExE,IAAMC,EAAOC,GACX,CACE,MAAO,GACP,UAAW,GACX,OAAQ,YAEVF,CAAK,EAED,CAAE,EAAAG,EAAG,EAAAT,EAAG,EAAAU,EAAG,MAAAC,EAAO,UAAAC,EAAW,OAAAC,EAAQ,WAAAC,CAAU,EAAKP,EAO1D,GANAQ,GAAQN,CAAC,EACTM,GAAQf,CAAC,EACTe,GAAQL,CAAC,EACTK,GAAQJ,CAAK,EACbI,GAAQH,CAAS,EACjBG,GAAQF,CAAM,EACVC,IAAe,QAAa,OAAOA,GAAe,WACpD,MAAM,IAAI,MAAM,+BAA+B,EACjD,IAAME,EAAY,IAAMhB,EAClBiB,EAAcD,EAAY,EAM1BE,EAAQ,KAAK,IAAI,EAAG,EAAE,EAC5B,GAAIT,GAAK,IAAMA,EAAKA,EAAI,KAAQ,GAAKA,EAAIS,EACvC,MAAM,IAAI,MAAM,mEAAmE,EAErF,GAAIR,EAAI,GAAKA,GAAMQ,EAAQ,GAAK,GAAMF,EACpC,MAAM,IAAI,MACR,0FAA0F,EAG9F,GAAIL,EAAQ,GAAKA,GAASO,EAAQ,GAAK,GACrC,MAAM,IAAI,MACR,gFAAgF,EAIpF,GADgBF,GAAaP,EAAIC,GACnBG,EACZ,MAAM,IAAI,MACR,iFAAmFA,CAAM,EAK7F,IAAMM,EAAIC,GAAOC,GAAQjB,EAAUC,EAAM,CAAE,EAAG,EAAG,MAAOW,EAAYN,CAAC,CAAE,EACjEY,EAAMC,GAAIJ,CAAC,EAEXK,EAAID,GAAI,IAAI,WAAWP,EAAYP,CAAC,CAAC,EACrCgB,EAAMF,GAAI,IAAI,WAAWP,CAAS,CAAC,EACrCU,EAAa,IAAK,CAAE,EACxB,GAAIZ,EAAY,CACd,IAAMa,EAAgB,EAAIlB,EAAIC,EAGxBkB,EAAc,KAAK,IAAI,KAAK,MAAMD,EAAgB,GAAK,EAAG,CAAC,EAC7DE,EAAc,EAClBH,EAAa,IAAK,CAChBG,IACIf,IAAe,EAAEe,EAAcD,IAAgBC,IAAgBF,IACjEb,EAAWe,EAAcF,CAAa,CAC1C,CACF,CACA,MAAO,CAAE,EAAAlB,EAAG,EAAAT,EAAG,EAAAU,EAAG,MAAAC,EAAO,YAAAM,EAAa,EAAAO,EAAG,IAAAF,EAAK,EAAAH,EAAG,IAAAM,EAAK,WAAAC,EAAY,UAAAd,CAAS,CAC7E,CAEA,SAASkB,GACP1B,EACAO,EACAQ,EACAK,EACAC,EAAgB,CAEhB,IAAMM,EAAMX,GAAOC,GAAQjB,EAAUe,EAAG,CAAE,EAAG,EAAG,MAAAR,CAAK,CAAE,EACvD,OAAAqB,GAAMb,EAAGK,EAAGC,CAAG,EACRM,CACT,CAkBM,SAAUE,GAAO7B,EAAoBC,EAAgBE,EAAgB,CACzE,GAAM,CAAE,EAAAE,EAAG,EAAAT,EAAG,EAAAU,EAAG,MAAAC,EAAO,YAAAM,EAAa,EAAAO,EAAG,IAAAF,EAAK,EAAAH,EAAG,IAAAM,EAAK,WAAAC,CAAU,EAAKvB,GAClEC,EACAC,EACAE,CAAI,EAEN2B,GAAWZ,CAAG,EACd,QAAS9D,EAAK,EAAGA,EAAKkD,EAAGlD,IAAM,CAC7B,IAAM2E,EAAKlB,EAAczD,EACzB,QAASqC,EAAI,EAAGA,EAAIoB,EAAapB,IAAK2B,EAAE3B,CAAC,EAAIyB,EAAIa,EAAKtC,CAAC,EACvD,QAASA,EAAI,EAAGuC,EAAM,EAAGvC,EAAIY,EAAI,EAAGZ,IAClCE,GAASyB,EAAGY,EAAKZ,EAAIY,GAAOnB,EAAcjB,CAAC,EAC3C0B,EAAU,EAEZ3B,GAASyB,GAAIf,EAAI,GAAKQ,EAAaK,EAAKa,EAAInC,CAAC,EAC7C0B,EAAU,EACV,QAAS7B,EAAI,EAAGA,EAAIY,EAAGZ,IAAK,CAE1B,IAAMwC,EAAIf,EAAIa,EAAKlB,EAAc,EAAE,EAAIR,EACvC,QAAS6B,EAAI,EAAGA,EAAIrB,EAAaqB,IAAKb,EAAIa,CAAC,EAAIhB,EAAIa,EAAKG,CAAC,EAAId,EAAEa,EAAIpB,EAAcqB,CAAC,EAClFvC,GAAS0B,EAAK,EAAGH,EAAKa,EAAInC,CAAC,EAC3B0B,EAAU,CACZ,CACF,CACA,OAAAQ,GAAWZ,CAAG,EACPQ,GAAa1B,EAAUO,EAAOQ,EAAGK,EAAGC,CAAG,CAChD,CFrMO,SAASc,GACdC,EACAC,EACAC,EAAe,GACfC,EAAuB,EACf,CACR,IAAMC,EAAOC,GAAY,EAAE,EACrBC,EAAI,GAAKJ,EACTK,EAAqBN,EAAS,UAAU,MAAM,EAC9CO,EAAMC,GAAOF,EAAoBH,EAAM,CAAE,EAAGE,EAAG,EAAG,EAAG,EAAG,EAAG,MAAO,EAAG,CAAC,EACtEI,EAAQL,GAAY,EAAE,EACtBM,EAAM,WAAW,KAAK,CAACR,CAAG,CAAC,EAE3BS,EADSC,GAAkBL,EAAKE,EAAOC,CAAG,EACtB,QAAQX,CAAG,EAE/Bc,EAAUC,EACd,WAAW,KAAK,CAAC,CAAI,CAAC,EACtB,WAAW,KAAK,CAACb,CAAI,CAAC,EACtBE,EACAM,EACAC,EACAC,CACF,EACMI,EAAQC,GAAY,QAAQH,CAAO,EACzC,OAAOG,GAAY,OAAO,YAAaD,EAAO,GAAG,CACnD,CAQO,SAASE,GAAQC,EAAmBlB,EAA8B,CACvE,GAAM,CAAE,OAAAmB,EAAQ,MAAAJ,CAAM,EAAIC,GAAY,OAAOE,EAAoC,GAAG,EACpF,GAAIC,IAAW,YAAa,MAAM,IAAI,MAAM,0BAA0B,EACtE,IAAMC,EAAO,IAAI,WAAWJ,GAAY,UAAUD,CAAK,CAAC,EAClDM,EAAUD,EAAK,CAAC,EACtB,GAAIC,IAAY,EAAM,MAAM,IAAI,MAAM,8BAA8BA,CAAO,EAAE,EAC7E,IAAMpB,EAAOmB,EAAK,CAAC,EACbjB,EAAOiB,EAAK,SAAS,EAAG,EAAE,EAC1BX,EAAQW,EAAK,SAAS,GAAI,EAAE,EAC5BlB,EAAMkB,EAAK,EAAE,EACbT,EAAaS,EAAK,SAAS,EAAE,EAC7Bf,EAAI,GAAKJ,EACTK,EAAqBN,EAAS,UAAU,MAAM,EAC9CO,EAAMC,GAAOF,EAAoBH,EAAM,CAAE,EAAGE,EAAG,EAAG,EAAG,EAAG,EAAG,MAAO,EAAG,CAAC,EACtEK,EAAM,WAAW,KAAK,CAACR,CAAG,CAAC,EAEjC,OADeU,GAAkBL,EAAKE,EAAOC,CAAG,EAClC,QAAQC,CAAU,CAClC,CG9DO,SAASW,GAAWC,EAAyB,CAChD,IAAMC,EAAQ,IAAI,WAAWD,EAAI,OAAS,CAAC,EAC3C,QAASE,EAAI,EAAGA,EAAIF,EAAI,OAAQE,GAAK,EACjCD,EAAMC,EAAI,CAAC,EAAI,SAASF,EAAI,MAAME,EAAGA,EAAI,CAAC,EAAG,EAAE,EAEnD,OAAOD,CACX,CAOO,SAASE,GAAWF,EAA2B,CAClD,OAAO,MAAM,KAAKA,CAAK,EAClB,IAAIG,GAAKA,EAAE,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,CAAC,EACxC,KAAK,EAAE,CAChB,CAOO,SAASC,GAAYC,EAAyB,CACjD,OAAO,IAAI,YAAY,EAAE,OAAOA,CAAG,CACvC,CAOO,SAASC,GAAYN,EAA2B,CACnD,OAAO,IAAI,YAAY,EAAE,OAAOA,CAAK,CACzC",
6
+ "names": ["require_quick_format_unescaped", "__commonJSMin", "exports", "module", "tryStringify", "o", "format", "f", "args", "opts", "ss", "offset", "len", "objects", "index", "argLen", "str", "a", "lastPos", "flen", "i", "type", "require_browser", "__commonJSMin", "exports", "module", "format", "pino", "_console", "pfGlobalThisOrFallback", "stdSerializers", "mock", "passthrough", "asErrValue", "levelToValue", "level", "logger", "baseLogFunctionSymbol", "hierarchySymbol", "logFallbackMap", "appendChildLogger", "parentLogger", "childLogger", "newEntry", "setupBaseLogFunctions", "levels", "proto", "logFunctions", "noop", "shouldSerialize", "serialize", "serializers", "k", "opts", "transmit", "stdErrSerialize", "customLevels", "getLevelVal", "getLevel", "setLevel", "setOpts", "getTimeFunction", "getLevels", "child", "createLogEventShape", "set", "bindings", "childOptions", "childOptionsSerializers", "childSerializers", "childSerialize", "applySerializers", "Child", "parent", "newLogger", "values", "labels", "invertObject", "obj", "inverted", "key", "nullTime", "epochTime", "unixTime", "isoTime", "getBindingChain", "hierarchy", "self", "rootLogger", "createWrap", "prependBindingsInArguments", "logFunc", "write", "ts", "args", "i", "asObject", "transmitLevel", "transmitValue", "methodValue", "formatters", "levelFormatter", "logObjectFormatter", "argsCloned", "msg", "logObject", "lvl", "send", "methodLevel", "val", "arg", "err", "a", "defd", "o", "crypto_exports", "__export", "crypto_default", "init_crypto", "__esmMin", "require_dist", "__commonJSMin", "exports", "ALPHABET", "ALPHABET_MAP", "z", "x", "polymodStep", "pre", "b", "prefixChk", "prefix", "chk", "i", "c", "v", "convert", "data", "inBits", "outBits", "pad", "value", "bits", "maxV", "result", "toWords", "bytes", "fromWordsUnsafe", "words", "res", "fromWords", "getLibraryFromEncoding", "encoding", "ENCODING_CONST", "encode", "LIMIT", "__decode", "str", "lowered", "uppered", "split", "wordChars", "decodeUnsafe", "decode", "require_base64_js", "__commonJSMin", "exports", "byteLength", "toByteArray", "fromByteArray", "lookup", "revLookup", "Arr", "code", "i", "len", "getLens", "b64", "validLen", "placeHoldersLen", "lens", "_byteLength", "tmp", "arr", "curByte", "tripletToBase64", "num", "encodeChunk", "uint8", "start", "end", "output", "extraBytes", "parts", "maxChunkLength", "len2", "require_ieee754", "__commonJSMin", "exports", "buffer", "offset", "isLE", "mLen", "nBytes", "e", "m", "eLen", "eMax", "eBias", "nBits", "i", "s", "value", "c", "rt", "d", "require_buffer", "__commonJSMin", "exports", "base64", "ieee754", "customInspectSymbol", "Buffer", "SlowBuffer", "K_MAX_LENGTH", "typedArraySupport", "arr", "proto", "createBuffer", "length", "buf", "arg", "encodingOrOffset", "allocUnsafe", "from", "value", "fromString", "fromArrayView", "isInstance", "fromArrayBuffer", "valueOf", "b", "fromObject", "assertSize", "size", "alloc", "fill", "encoding", "checked", "string", "byteLength", "actual", "fromArrayLike", "array", "i", "arrayView", "copy", "byteOffset", "obj", "len", "numberIsNaN", "a", "x", "y", "list", "buffer", "pos", "mustMatch", "loweredCase", "utf8ToBytes", "base64ToBytes", "slowToString", "start", "end", "hexSlice", "utf8Slice", "asciiSlice", "latin1Slice", "base64Slice", "utf16leSlice", "swap", "n", "m", "str", "max", "target", "thisStart", "thisEnd", "thisCopy", "targetCopy", "bidirectionalIndexOf", "val", "dir", "arrayIndexOf", "indexSize", "arrLength", "valLength", "read", "foundIndex", "found", "j", "hexWrite", "offset", "remaining", "strLen", "parsed", "utf8Write", "blitBuffer", "asciiWrite", "asciiToBytes", "base64Write", "ucs2Write", "utf16leToBytes", "res", "firstByte", "codePoint", "bytesPerSequence", "secondByte", "thirdByte", "fourthByte", "tempCodePoint", "decodeCodePointsArray", "MAX_ARGUMENTS_LENGTH", "codePoints", "ret", "out", "hexSliceLookupTable", "bytes", "newBuf", "checkOffset", "ext", "noAssert", "mul", "defineBigIntMethod", "validateNumber", "first", "last", "boundsError", "lo", "hi", "checkInt", "min", "maxBytes", "wrtBigUInt64LE", "checkIntBI", "wrtBigUInt64BE", "limit", "sub", "checkIEEE754", "writeFloat", "littleEndian", "writeDouble", "targetStart", "code", "errors", "E", "sym", "getMessage", "Base", "name", "range", "input", "msg", "received", "addNumericalSeparator", "checkBounds", "type", "INVALID_BASE64_RE", "base64clean", "units", "leadSurrogate", "byteArray", "c", "src", "dst", "alphabet", "table", "i16", "fn", "BufferBigIntNotDefined", "index_exports", "__export", "Nip46Method", "NostrEventKind", "NostrMessageType", "bytesToHex", "bytesToUtf8", "calculateEventId", "generateSharedSecret", "createEvent", "decrypt", "decryptMessage", "encrypt", "encryptMessage", "finalizeEvent", "generateKeyPair", "getPublicKey", "getPublicKeySync", "hexToBytes", "nip_01_exports", "nip_04_exports", "nip_19_exports", "nip_26_exports", "nip_44_exports", "nip_46_exports", "nip_49_exports", "signEvent", "utf8ToBytes", "validateEvent", "validateEventBase", "validateEventId", "validateEventSignature", "validateFilter", "validateKeyPair", "validateResponse", "validateSignedEvent", "validateSubscription", "verifySignature", "NostrMessageType", "Nip46Method", "NostrEventKind", "crypto", "isBytes", "a", "anumber", "n", "abytes", "b", "lengths", "ahash", "h", "aexists", "instance", "checkFinished", "aoutput", "out", "min", "u32", "arr", "clean", "arrays", "i", "createView", "rotr", "word", "shift", "rotl", "isLE", "byteSwap", "byteSwap32", "arr", "i", "byteSwap", "swap32IfBE", "isLE", "u", "hasHexBuiltin", "hexes", "_", "bytesToHex", "bytes", "abytes", "hex", "asciis", "asciiToBase16", "ch", "hexToBytes", "hl", "al", "array", "ai", "hi", "n1", "n2", "char", "utf8ToBytes", "str", "toBytes", "data", "utf8ToBytes", "abytes", "kdfInputToBytes", "concatBytes", "arrays", "sum", "i", "a", "res", "pad", "checkOpts", "defaults", "opts", "Hash", "createHasher", "hashCons", "hashC", "msg", "tmp", "randomBytes", "bytesLength", "crypto", "setBigUint64", "view", "byteOffset", "value", "isLE", "_32n", "_u32_max", "wh", "wl", "h", "l", "Chi", "a", "b", "c", "Maj", "HashMD", "Hash", "blockLen", "outputLen", "padOffset", "createView", "data", "aexists", "toBytes", "abytes", "buffer", "len", "pos", "take", "dataView", "out", "aoutput", "clean", "i", "oview", "outLen", "state", "res", "to", "length", "finished", "destroyed", "SHA256_IV", "SHA256_K", "SHA256_W", "SHA256", "HashMD", "outputLen", "SHA256_IV", "A", "B", "C", "D", "E", "F", "G", "H", "view", "offset", "i", "W15", "W2", "s0", "rotr", "s1", "sigma1", "T1", "Chi", "T2", "Maj", "clean", "sha256", "createHasher", "SHA256", "HMAC", "Hash", "hash", "_key", "ahash", "key", "toBytes", "blockLen", "pad", "i", "clean", "buf", "aexists", "out", "abytes", "to", "oHash", "iHash", "finished", "destroyed", "outputLen", "hmac", "message", "_0n", "_1n", "_abool2", "value", "title", "prefix", "_abytes2", "length", "bytes", "isBytes", "len", "needsLen", "ofLen", "got", "numberToHexUnpadded", "num", "hex", "hexToNumber", "_0n", "bytesToNumberBE", "bytesToHex", "bytesToNumberLE", "abytes", "numberToBytesBE", "n", "hexToBytes", "numberToBytesLE", "ensureBytes", "title", "hex", "expectedLength", "res", "hexToBytes", "e", "isBytes", "len", "isPosBig", "n", "_0n", "inRange", "min", "max", "aInRange", "title", "bitLen", "len", "_1n", "bitMask", "n", "_1n", "createHmacDrbg", "hashLen", "qByteLen", "hmacFn", "u8n", "len", "u8of", "byte", "v", "k", "i", "reset", "h", "b", "reseed", "seed", "gen", "out", "sl", "concatBytes", "pred", "res", "_validateObject", "object", "fields", "optFields", "checkField", "fieldName", "expectedType", "isOpt", "val", "current", "k", "v", "memoized", "fn", "map", "arg", "args", "val", "computed", "_0n", "_1n", "_2n", "_3n", "_4n", "_5n", "_7n", "_8n", "_9n", "_16n", "mod", "a", "b", "result", "pow2", "x", "power", "modulo", "res", "_0n", "invert", "number", "a", "mod", "b", "y", "_1n", "u", "v", "q", "r", "m", "n", "assertIsSquare", "Fp", "root", "sqrt3mod4", "p1div4", "_4n", "sqrt5mod8", "p5div8", "_5n", "_8n", "n2", "_2n", "nv", "i", "sqrt9mod16", "P", "Fp_", "Field", "tn", "tonelliShanks", "c1", "c2", "c3", "c4", "_7n", "_16n", "tv1", "tv2", "tv3", "tv4", "e1", "e2", "e3", "_3n", "Q", "S", "Z", "_Fp", "FpLegendre", "cc", "Q1div2", "M", "c", "t", "R", "t_tmp", "exponent", "FpSqrt", "_9n", "FIELD_FIELDS", "validateField", "field", "initial", "opts", "map", "val", "_validateObject", "FpPow", "Fp", "num", "power", "_0n", "_1n", "p", "d", "FpInvertBatch", "nums", "passZero", "inverted", "multipliedAcc", "acc", "i", "invertedAcc", "FpLegendre", "Fp", "n", "p1mod2", "_1n", "_2n", "powered", "yes", "zero", "no", "nLength", "n", "nBitLength", "anumber", "_nBitLength", "nByteLength", "Field", "ORDER", "bitLenOrOpts", "isLE", "opts", "_0n", "_nbitLength", "_sqrt", "modFromBytes", "allowedLengths", "_opts", "BITS", "BYTES", "sqrtP", "f", "bitMask", "_1n", "num", "mod", "lhs", "rhs", "power", "FpPow", "invert", "FpSqrt", "numberToBytesLE", "numberToBytesBE", "bytes", "skipValidation", "padded", "scalar", "bytesToNumberLE", "bytesToNumberBE", "lst", "FpInvertBatch", "a", "b", "c", "getFieldBytesLength", "fieldOrder", "bitLength", "getMinHashLength", "length", "mapHashToField", "key", "isLE", "len", "fieldLen", "minLen", "num", "bytesToNumberLE", "bytesToNumberBE", "reduced", "mod", "_1n", "numberToBytesLE", "numberToBytesBE", "_0n", "_1n", "negateCt", "condition", "item", "neg", "normalizeZ", "c", "points", "invertedZs", "FpInvertBatch", "p", "i", "validateW", "W", "bits", "calcWOpts", "scalarBits", "windows", "windowSize", "maxNumber", "mask", "bitMask", "shiftBy", "calcOffsets", "n", "window", "wOpts", "wbits", "nextN", "offsetStart", "offset", "isZero", "isNeg", "isNegF", "validateMSMPoints", "validateMSMScalars", "scalars", "field", "s", "pointPrecomputes", "pointWindowSizes", "getW", "P", "assert0", "wNAF", "Point", "elm", "d", "point", "base", "precomputes", "f", "wo", "offsetF", "acc", "transform", "comp", "scalar", "prev", "mulEndoUnsafe", "k1", "k2", "p1", "p2", "pippenger", "fieldN", "plength", "slength", "zero", "bitLen", "MASK", "buckets", "lastBits", "sum", "j", "resI", "sumI", "createField", "order", "field", "isLE", "validateField", "Field", "_createCurveFields", "type", "CURVE", "curveOpts", "FpFnLE", "p", "val", "_0n", "Fp", "Fn", "params", "divNearest", "num", "den", "_2n", "_splitEndoScalar", "k", "basis", "n", "a1", "b1", "a2", "b2", "c1", "c2", "k1", "k2", "k1neg", "_0n", "k2neg", "MAX_NUM", "bitMask", "bitLen", "_1n", "validateSigFormat", "format", "validateSigOpts", "opts", "def", "optsn", "optName", "_abool2", "DERErr", "m", "DER", "tag", "data", "E", "dataLen", "len", "numberToHexUnpadded", "lenLen", "pos", "first", "isLong", "length", "lengthBytes", "b", "v", "hex", "bytesToNumberBE", "int", "tlv", "ensureBytes", "seqBytes", "seqLeftBytes", "rBytes", "rLeftBytes", "sBytes", "sLeftBytes", "sig", "rs", "ss", "seq", "_3n", "_4n", "_normFnElement", "Fn", "key", "expected", "bytes", "weierstrassN", "params", "extraOpts", "validated", "_createCurveFields", "Fp", "CURVE", "cofactor", "CURVE_ORDER", "_validateObject", "endo", "lengths", "getWLengths", "assertCompressionIsSupported", "pointToBytes", "_c", "point", "isCompressed", "x", "y", "bx", "hasEvenY", "concatBytes", "pprefix", "pointFromBytes", "_abytes2", "comp", "uncomp", "head", "tail", "y2", "weierstrassEquation", "sqrtError", "err", "isYOdd", "L", "isValidXY", "encodePoint", "decodePoint", "x2", "x3", "left", "right", "_4a3", "_27b2", "acoord", "title", "banZero", "aprjpoint", "other", "Point", "splitEndoScalarN", "toAffineMemo", "memoized", "p", "iz", "X", "Y", "Z", "is0", "zz", "assertValidMemo", "finishEndo", "endoBeta", "k1p", "k2p", "negateCt", "P", "windowSize", "isLazy", "wnaf", "X1", "Y1", "Z1", "X2", "Y2", "Z2", "U1", "U2", "a", "b3", "X3", "Y3", "Z3", "t0", "t1", "t2", "t3", "t4", "t5", "scalar", "fake", "mul", "normalizeZ", "k1f", "k2f", "f", "sc", "p1", "p2", "mulEndoUnsafe", "Q", "sum", "invertedZ", "isTorsionFree", "clearCofactor", "bytesToHex", "points", "scalars", "pippenger", "privateKey", "bits", "wNAF", "getWLengths", "Fp", "Fn", "ecdh", "Point", "ecdhOpts", "randomBytes_", "randomBytes", "lengths", "getMinHashLength", "isValidSecretKey", "secretKey", "_normFnElement", "isValidPublicKey", "publicKey", "isCompressed", "comp", "publicKeyUncompressed", "l", "randomSecretKey", "seed", "mapHashToField", "_abytes2", "getPublicKey", "keygen", "isProbPub", "item", "ensureBytes", "getSharedSecret", "secretKeyA", "publicKeyB", "s", "key", "windowSize", "point", "ecdsa", "hash", "ecdsaOpts", "ahash", "_validateObject", "hmac", "msgs", "concatBytes", "CURVE_ORDER", "fnBits", "utils", "defaultSigOpts", "defaultSigOpts_format", "isBiggerThanHalfOrder", "number", "HALF", "_1n", "validateRS", "title", "num", "validateSigLength", "bytes", "format", "validateSigFormat", "size", "sizer", "Signature", "r", "recovery", "recid", "DER", "L", "hex", "hexToBytes", "messageHash", "FIELD_ORDER", "rec", "_2n", "radj", "x", "R", "pprefix", "ir", "h", "bits2int_modN", "u1", "u2", "bytesToHex", "bits2int", "bytesToNumberBE", "delta", "ORDER_MASK", "bitMask", "int2octets", "aInRange", "_0n", "validateMsgAndHash", "message", "prehash", "prepSig", "privateKey", "opts", "k", "lowS", "extraEntropy", "validateSigOpts", "h1int", "d", "seedArgs", "e", "m", "k2sig", "kBytes", "ik", "q", "normS", "sign", "createHmacDrbg", "tryParsingSig", "sg", "sig", "isHex", "isBytes", "isObj", "derError", "verify", "signature", "P", "is", "recoverPublicKey", "_weierstrass_legacy_opts_to_new", "c", "CURVE", "Fp", "allowedLengths", "l", "Fn", "Field", "curveOpts", "_ecdsa_legacy_opts_to_new", "ecdsaOpts", "_ecdsa_new_output_to_legacy", "c", "_ecdsa", "Point", "nLength", "weierstrass", "CURVE", "curveOpts", "hash", "ecdsaOpts", "_ecdsa_legacy_opts_to_new", "weierstrassN", "signs", "ecdsa", "createCurve", "curveDef", "defHash", "create", "hash", "weierstrass", "secp256k1_CURVE", "secp256k1_ENDO", "_0n", "_1n", "_2n", "sqrtMod", "y", "P", "_3n", "_6n", "_11n", "_22n", "_23n", "_44n", "_88n", "b2", "b3", "b6", "pow2", "b9", "b11", "b22", "b44", "b88", "b176", "b220", "b223", "t1", "t2", "root", "Fpk1", "Field", "secp256k1", "createCurve", "sha256", "TAGGED_HASH_PREFIXES", "taggedHash", "tag", "messages", "tagP", "tagH", "utf8ToBytes", "concatBytes", "pointToBytes", "point", "Pointk1", "hasEven", "schnorrGetExtPubKey", "priv", "Fn", "BASE", "d_", "_normFnElement", "p", "lift_x", "x", "Fp", "xx", "c", "num", "bytesToNumberBE", "challenge", "args", "schnorrGetPublicKey", "secretKey", "schnorrSign", "message", "auxRand", "randomBytes", "m", "ensureBytes", "px", "d", "a", "t", "rand", "rx", "k", "e", "sig", "schnorrVerify", "signature", "publicKey", "pub", "r", "inRange", "s", "R", "schnorr", "randomSecretKey", "seed", "mapHashToField", "keygen", "numberToBytesBE", "mod", "bytesToHex", "hexToBytes", "sha256", "import_pino", "logger", "pino", "label", "obj", "newObj", "err", "isValidBase64", "base64", "bytesToBase64", "bytes", "base64ToBytes", "base64", "isValidBase64", "getCrypto", "cryptoModule", "logger", "CustomCrypto", "__publicField", "array", "customCrypto", "signSchnorr", "schnorr", "verifySchnorrSignature", "generateKeyPair", "privateKeyBytes", "randomBytes", "privateKey", "bytesToHex", "publicKey", "getPublicKey", "hexToBytes", "publicKeyBytes", "schnorr", "error", "logger", "validateKeyPair", "keyPair", "createEvent", "event", "timestamp", "signEvent", "serialized", "eventHash", "sha256", "signatureBytes", "getPublicKeySync", "finalizeEvent", "pubkey", "fullEvent", "verifySignature", "pubkeyBytes", "encrypt", "message", "recipientPubKey", "senderPrivKey", "recipientPubKeyHex", "sharedPoint", "secp256k1", "sharedX", "iv", "key", "customCrypto", "subtle", "data", "encrypted", "ciphertextBase64", "bytesToBase64", "ivBase64", "decrypt", "encryptedMessage", "senderPubKey", "recipientPrivKey", "senderPubKeyHex", "ciphertext", "base64ToBytes", "decrypted", "getPublicKeyHex", "pubkey", "hexToBytes", "hex", "byte", "validateEventId", "event", "serialized", "hash", "bytesToHex", "sha256", "error", "logger", "validateEventSignature", "pubkeyHex", "pubkeyBytes", "isValid", "schnorr", "validateEvent", "baseValidation", "validateEventBase", "idValidation", "validateSignedEvent", "now", "tag", "validateFilter", "filter", "id", "author", "kind", "validateSubscription", "subscription", "filterValidation", "validateResponse", "message", "type", "NostrMessageType", "i", "filterResult", "serializeEvent", "event", "getEventHash", "serialized", "hash", "sha256", "bytesToHex", "error", "logger", "calculateEventId", "event", "getEventHash", "nip_04_exports", "__export", "generateSharedSecret", "decryptMessage", "encryptMessage", "getCrypto", "cryptoModule", "logger", "CryptoImplementation", "__publicField", "array", "cryptoImpl", "encryptMessage", "message", "senderPrivKey", "recipientPubKey", "pubKeyHex", "sharedPoint", "secp256k1", "sharedX", "sharedKey", "iv", "encoded", "encrypted", "ciphertextBase64", "bytesToBase64", "ivBase64", "error", "decryptMessage", "encryptedMessage", "recipientPrivKey", "senderPubKey", "ciphertext", "base64ToBytes", "hexToBytes", "decrypted", "generateSharedSecret", "privateKey", "publicKey", "nip_01_exports", "__export", "calculateEventId", "createEvent", "getEventHash", "serializeEvent", "signEvent", "validateEvent", "verifySignature", "createEvent", "params", "kind", "content", "tags", "created_at", "pubkey", "serializeEvent", "event", "getEventHash", "serialized", "hash", "sha256", "bytesToHex", "error", "logger", "signEvent", "privateKey", "sig", "schnorr", "hexToBytes", "verifySignature", "expectedId", "calculateEventId", "validateEvent", "tag", "nip_19_exports", "__export", "decode", "naddrEncode", "neventEncode", "noteEncode", "nprofileEncode", "npubEncode", "nrelayEncode", "nsecEncode", "import_bech32", "import_buffer", "VALID_PREFIXES", "TLV_TYPES", "pubkey", "validateHexString", "data", "words", "privkey", "eventId", "relays", "validateRelayUrl", "encodeTLV", "author", "kind", "identifier", "url", "str", "prefix", "decoded", "decodedData", "decodeTLV", "error", "length", "parsed", "result", "bytes", "relay", "relayBytes", "authorBytes", "kindBytes", "identifierBytes", "i", "type", "value", "nip_26_exports", "__export", "addDelegationTag", "checkDelegationConditions", "createDelegation", "extractDelegation", "verifyDelegation", "createDelegation", "delegatorPrivateKey", "delegatee", "conditions", "conditionsString", "serializeConditions", "token", "signDelegation", "bytesToHex", "schnorr", "hexToBytes", "verifyDelegation", "delegation", "verifyDelegationSignature", "checkDelegationConditions", "event", "addDelegationTag", "tag", "extractDelegation", "t", "parseConditions", "parts", "part", "delegator", "message", "hash", "sha256", "signature", "signSchnorr", "msgHash", "verifySchnorrSignature", "nip_44_exports", "__export", "calcPaddedLen", "decrypt", "encrypt", "getConversationKey", "v2", "isBytes", "a", "abool", "b", "anumber", "n", "abytes", "value", "length", "title", "bytes", "len", "needsLen", "prefix", "ofLen", "got", "aexists", "instance", "checkFinished", "aoutput", "out", "min", "u32", "arr", "clean", "arrays", "i", "createView", "isLE", "checkOpts", "defaults", "opts", "equalBytes", "a", "b", "diff", "i", "wrapCipher", "params", "constructor", "wrappedCipher", "key", "args", "abytes", "isLE", "nonce", "tagl", "cipher", "checkOutput", "fnLength", "output", "called", "data", "getOutput", "expectedLength", "out", "onlyAligned", "isAligned32", "u64Lengths", "dataLength", "aadLength", "abool", "num", "view", "createView", "bytes", "copyBytes", "encodeStr", "str", "c", "sigma16", "sigma32", "sigma16_32", "u32", "sigma32_32", "rotl", "a", "b", "isAligned32", "BLOCK_LEN", "BLOCK_LEN32", "MAX_COUNTER", "U32_EMPTY", "runCipher", "core", "sigma", "key", "nonce", "data", "output", "counter", "rounds", "len", "block", "b32", "isAligned", "d32", "o32", "pos", "take", "pos32", "j", "posj", "createCipher", "opts", "allowShortKeys", "extendNonceFn", "counterLength", "counterRight", "checkOpts", "anumber", "abool", "abytes", "toClean", "l", "k", "copyBytes", "k32", "nonceNcLen", "nc", "n32", "clean", "u8to16", "a", "i", "Poly1305", "key", "__publicField", "copyBytes", "abytes", "t0", "u8to16", "t1", "t2", "t3", "t4", "t5", "t6", "t7", "i", "data", "offset", "isLast", "hibit", "h", "r", "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "h0", "h1", "h2", "h3", "h4", "h5", "h6", "h7", "h8", "h9", "c", "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "pad", "g", "mask", "f", "clean", "aexists", "buffer", "blockLen", "len", "pos", "take", "out", "aoutput", "opos", "outputLen", "res", "wrapConstructorWithKey", "hashCons", "hashC", "msg", "tmp", "poly1305", "chachaCore", "s", "k", "n", "out", "cnt", "rounds", "y00", "y01", "y02", "y03", "y04", "y05", "y06", "y07", "y08", "y09", "y10", "y11", "y12", "y13", "y14", "y15", "x00", "x01", "x02", "x03", "x04", "x05", "x06", "x07", "x08", "x09", "x10", "x11", "x12", "x13", "x14", "x15", "r", "rotl", "oi", "hchacha", "i", "chacha20", "createCipher", "chachaCore", "xchacha20", "hchacha", "ZEROS16", "updatePadded", "h", "msg", "leftover", "ZEROS32", "computeTag", "fn", "key", "nonce", "ciphertext", "AAD", "abytes", "authKey", "lengths", "u64Lengths", "poly1305", "res", "clean", "_poly1305_aead", "xorStream", "plaintext", "output", "plength", "getOutput", "oPlain", "tag", "data", "passedTag", "equalBytes", "chacha20poly1305", "wrapCipher", "chacha20", "xchacha20poly1305", "xchacha20", "extract", "hash", "ikm", "salt", "ahash", "hmac", "toBytes", "HKDF_COUNTER", "EMPTY_BUFFER", "expand", "prk", "info", "length", "anumber", "olen", "blocks", "okm", "HMAC", "HMACTmp", "T", "counter", "clean", "isBytes", "a", "abytes", "b", "isArrayOf", "isString", "arr", "item", "afn", "input", "astr", "label", "anumber", "n", "aArr", "astrArr", "anumArr", "chain", "args", "id", "wrap", "encode", "x", "decode", "alphabet", "letters", "lettersA", "len", "indexes", "l", "digits", "letter", "i", "join", "separator", "from", "to", "padding", "bits", "chr", "data", "end", "gcd", "a", "b", "radix2carry", "from", "to", "powers", "res", "i", "convertRadix2", "data", "padding", "aArr", "carry", "pos", "max", "mask", "n", "anumber", "pow", "radix2", "bits", "revPadding", "anumber", "radix2carry", "bytes", "isBytes", "convertRadix2", "digits", "anumArr", "unsafeWrapper", "fn", "afn", "args", "hasBase64Builtin", "decodeBase64Builtin", "s", "isUrl", "astr", "re", "alphabet", "base64", "b", "abytes", "chain", "radix2", "padding", "join", "BECH_ALPHABET", "chain", "alphabet", "join", "POLYMOD_GENERATORS", "bech32Polymod", "pre", "b", "chk", "i", "bechChecksum", "prefix", "words", "encodingConst", "len", "c", "v", "convertRadix2", "powers", "genBech32", "encoding", "ENCODING_CONST", "_words", "radix2", "fromWords", "toWords", "fromWordsUnsafe", "unsafeWrapper", "encode", "limit", "astr", "isBytes", "anumArr", "plen", "actualLength", "lowered", "sum", "decode", "str", "slen", "sepIndex", "data", "decodeUnsafe", "decodeToBytes", "encodeFromBytes", "bytes", "bech32", "utf8Encoder", "utf8Decoder", "minPlaintextSize", "maxPlaintextSize", "calcPaddedLen", "len", "nextPower", "chunk", "pad", "plaintext", "unpadded", "unpaddedLen", "prefix", "suffix", "concatBytes", "unpad", "padded", "getConversationKey", "privkeyA", "pubkeyB", "sharedX", "secp256k1", "extract", "sha256", "getMessageKeys", "conversationKey", "nonce", "keys", "expand", "encrypt", "randomBytes", "chacha_key", "chacha_nonce", "hmac_key", "ciphertext", "chacha20", "mac", "hmac", "base64", "decrypt", "payload", "data", "version", "expectedMac", "equalBytes", "v2", "nip_46_exports", "__export", "connectRequest", "createBunkerURI", "createRequest", "createResponse", "createResponseFilter", "createSession", "getPublicKeyRequest", "getRelaysRequest", "getSessionInfo", "isRequest", "isResponse", "nip04DecryptRequest", "nip04EncryptRequest", "nip44DecryptRequest", "nip44EncryptRequest", "parseBunkerURI", "parsePayload", "pingRequest", "restoreSession", "signEventRequest", "unwrapEvent", "validateBunkerURI", "wrapEvent", "parseBunkerURI", "uri", "url", "remotePubkey", "relays", "secret", "createBunkerURI", "params", "r", "validateBunkerURI", "e", "createSession", "clientSecretKeyBytes", "randomBytes", "clientSecretKey", "bytesToHex", "clientPubkeyBytes", "schnorr", "clientPubkey", "conversationKey", "getConversationKey", "restoreSession", "hexToBytes", "getSessionInfo", "session", "createRequest", "method", "id", "createResponse", "result", "error", "response", "parsePayload", "json", "obj", "isRequest", "payload", "isResponse", "wrapEvent", "recipientPubkey", "encrypted", "encrypt", "event", "serialized", "eventHash", "sha256", "privateKeyBytes", "signatureBytes", "unwrapEvent", "decrypt", "connectRequest", "permissions", "pingRequest", "getPublicKeyRequest", "signEventRequest", "eventJson", "nip04EncryptRequest", "thirdPartyPubkey", "plaintext", "nip04DecryptRequest", "ciphertext", "nip44EncryptRequest", "nip44DecryptRequest", "getRelaysRequest", "createResponseFilter", "since", "filter", "nip_49_exports", "__export", "decrypt", "encrypt", "pbkdf2Init", "hash", "_password", "_salt", "_opts", "ahash", "opts", "checkOpts", "c", "dkLen", "asyncTick", "anumber", "password", "kdfInputToBytes", "salt", "DK", "PRF", "hmac", "PRFSalt", "pbkdf2Output", "prfW", "u", "clean", "pbkdf2", "arr", "view", "createView", "ti", "pos", "Ti", "ui", "i", "XorAndSalsa", "prev", "pi", "input", "ii", "out", "oi", "y00", "y01", "y02", "y03", "y04", "y05", "y06", "y07", "y08", "y09", "y10", "y11", "y12", "y13", "y14", "y15", "x00", "x01", "x02", "x03", "x04", "x05", "x06", "x07", "x08", "x09", "x10", "x11", "x12", "x13", "x14", "x15", "i", "rotl", "BlockMix", "r", "head", "tail", "scryptInit", "password", "salt", "_opts", "opts", "checkOpts", "N", "p", "dkLen", "asyncTick", "maxmem", "onProgress", "anumber", "blockSize", "blockSize32", "pow32", "B", "pbkdf2", "sha256", "B32", "u32", "V", "tmp", "blockMixCb", "totalBlockMix", "callbackPer", "blockMixCnt", "scryptOutput", "res", "clean", "scrypt", "swap32IfBE", "Pi", "pos", "j", "k", "encrypt", "sec", "password", "logn", "ksb", "salt", "randomBytes", "n", "normalizedPassword", "key", "scrypt", "nonce", "aad", "ciphertext", "xchacha20poly1305", "payload", "concatBytes", "words", "bech32", "decrypt", "ncryptsec", "prefix", "data", "version", "hexToBytes", "hex", "bytes", "i", "bytesToHex", "b", "utf8ToBytes", "str", "bytesToUtf8"]
7
+ }