@helia/trustless-gateway-client 0.0.0-9114743f
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.
- package/README.md +71 -0
- package/dist/index.min.js +33 -0
- package/dist/index.min.js.map +7 -0
- package/dist/src/broker.d.ts +44 -0
- package/dist/src/broker.d.ts.map +1 -0
- package/dist/src/broker.js +75 -0
- package/dist/src/broker.js.map +1 -0
- package/dist/src/index.d.ts +64 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +19 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/session.d.ts +30 -0
- package/dist/src/session.d.ts.map +1 -0
- package/dist/src/session.js +89 -0
- package/dist/src/session.js.map +1 -0
- package/dist/src/trustless-gateway.d.ts +64 -0
- package/dist/src/trustless-gateway.d.ts.map +1 -0
- package/dist/src/trustless-gateway.js +217 -0
- package/dist/src/trustless-gateway.js.map +1 -0
- package/dist/src/utils.d.ts +27 -0
- package/dist/src/utils.d.ts.map +1 -0
- package/dist/src/utils.js +106 -0
- package/dist/src/utils.js.map +1 -0
- package/package.json +78 -0
- package/src/broker.ts +112 -0
- package/src/index.ts +81 -0
- package/src/session.ts +119 -0
- package/src/trustless-gateway.ts +279 -0
- package/src/utils.ts +141 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../node_modules/hashlru/index.js", "../../../node_modules/netmask/dist/netmask4.js", "../../../node_modules/netmask/dist/netmask6.js", "../../../node_modules/netmask/dist/netmask.js", "../src/index.ts", "../../../node_modules/uint8arrays/src/alloc.ts", "../../../node_modules/uint8-varint/src/index.ts", "../../../node_modules/uint8arrays/src/with-array-buffer.ts", "../../../node_modules/multiformats/src/bases/base10.ts", "../../../node_modules/multiformats/src/bytes.ts", "../../../node_modules/multiformats/src/vendor/base-x.js", "../../../node_modules/multiformats/src/bases/base.ts", "../../../node_modules/multiformats/src/bases/base16.ts", "../../../node_modules/multiformats/src/bases/base2.ts", "../../../node_modules/multiformats/src/bases/base256emoji.ts", "../../../node_modules/multiformats/src/bases/base32.ts", "../../../node_modules/multiformats/src/bases/base36.ts", "../../../node_modules/multiformats/src/bases/base58.ts", "../../../node_modules/multiformats/src/bases/base64.ts", "../../../node_modules/multiformats/src/bases/base8.ts", "../../../node_modules/multiformats/src/bases/identity.ts", "../../../node_modules/multiformats/src/codecs/json.ts", "../../../node_modules/multiformats/src/hashes/identity.ts", "../../../node_modules/multiformats/src/vendor/varint.js", "../../../node_modules/multiformats/src/varint.ts", "../../../node_modules/multiformats/src/hashes/digest.ts", "../../../node_modules/multiformats/src/hashes/sha2-browser.ts", "../../../node_modules/multiformats/src/hashes/hasher.ts", "../../../node_modules/multiformats/src/cid.ts", "../../../node_modules/multiformats/src/basics.ts", "../../../node_modules/uint8arrays/src/util/bases.ts", "../../../node_modules/uint8arrays/src/from-string.ts", "../../../node_modules/uint8arrays/src/to-string.ts", "../../../node_modules/interface-datastore/src/key.ts", "../../../node_modules/uint8arrays/src/util/as-uint8array.ts", "../../../node_modules/uint8arrays/src/concat.ts", "../../../node_modules/uint8arrays/src/equals.ts", "../../../node_modules/uint8arraylist/src/index.ts", "../../../node_modules/@libp2p/interface/src/errors.ts", "../../../node_modules/main-event/src/index.ts", "../../../node_modules/progress-events/src/index.ts", "../../../node_modules/p-timeout/index.js", "../../../node_modules/@multiformats/dns/src/utils/cache.ts", "../../../node_modules/@multiformats/dns/src/index.ts", "../../../node_modules/weald/node_modules/ms/dist/index.js", "../../../node_modules/weald/src/common.ts", "../../../node_modules/weald/src/browser.ts", "../../../node_modules/weald/src/index.ts", "../../../node_modules/@libp2p/logger/src/index.ts", "../../../node_modules/p-defer/index.js", "../../../node_modules/race-signal/src/index.ts", "../../../node_modules/blockstore-core/src/tiered.ts", "../../../node_modules/datastore-core/src/shard.ts", "../../../node_modules/it-pushable/src/fifo.ts", "../../../node_modules/it-pushable/src/index.ts", "../../../node_modules/datastore-core/src/sharding.ts", "../../../node_modules/datastore-core/src/tiered.ts", "../../../node_modules/@sindresorhus/fnv1a/index.js", "../../../node_modules/@libp2p/utils/src/filters/hashes.ts", "../../../node_modules/@libp2p/utils/src/filters/fingerprint.ts", "../../../node_modules/@libp2p/utils/src/filters/utils.ts", "../../../node_modules/@libp2p/utils/src/filters/bucket.ts", "../../../node_modules/@libp2p/utils/src/filters/cuckoo-filter.ts", "../../../node_modules/@libp2p/utils/src/filters/scalable-cuckoo-filter.ts", "../../../node_modules/@libp2p/utils/src/multiaddr/get-net-config.ts", "../../../node_modules/@chainsafe/is-ip/src/parser.ts", "../../../node_modules/@chainsafe/is-ip/src/parse.ts", "../../../node_modules/@chainsafe/is-ip/src/is-ip.ts", "../../../node_modules/@libp2p/utils/src/private-ip.ts", "../../../node_modules/@libp2p/utils/src/multiaddr/is-private.ts", "../../../node_modules/@multiformats/multiaddr/src/errors.ts", "../../../node_modules/@multiformats/multiaddr/src/utils.ts", "../../../node_modules/@multiformats/multiaddr/src/validation.ts", "../../../node_modules/@multiformats/multiaddr/src/registry.ts", "../../../node_modules/@multiformats/multiaddr/src/components.ts", "../../../node_modules/@multiformats/multiaddr/src/multiaddr.ts", "../../../node_modules/@multiformats/multiaddr/src/index.ts", "../../../node_modules/@multiformats/multiaddr-matcher/src/utils.ts", "../../../node_modules/@multiformats/multiaddr-matcher/src/index.ts", "../../../node_modules/@libp2p/utils/node_modules/p-event/index.js", "../../../node_modules/@libp2p/utils/src/debounce.ts", "../../../node_modules/@libp2p/utils/src/errors.ts", "../../../node_modules/@libp2p/utils/src/queue/recipient.ts", "../../../node_modules/@libp2p/utils/src/queue/job.ts", "../../../node_modules/@libp2p/utils/src/queue/index.ts", "../../interface/src/errors.ts", "../../utils/src/abstract-session.ts", "../../utils/src/utils/is-cid.ts", "../../../node_modules/@multiformats/multiaddr-to-uri/src/index.ts", "../../../node_modules/ip-regex/index.js", "../../../node_modules/is-ip/node_modules/function-timeout/browser.js", "../../../node_modules/is-regexp/index.js", "../../../node_modules/clone-regexp/index.js", "../../../node_modules/is-ip/node_modules/super-regex/index.js", "../../../node_modules/is-ip/index.js", "../../../node_modules/@multiformats/uri-to-multiaddr/src/index.ts", "../src/utils.ts", "../src/trustless-gateway.ts", "../src/session.ts", "../src/broker.ts"],
|
|
4
|
+
"sourcesContent": ["module.exports = function (max) {\n\n if (!max) throw Error('hashlru must have a max value, of type number, greater than 0')\n\n var size = 0, cache = Object.create(null), _cache = Object.create(null)\n\n function update (key, value) {\n cache[key] = value\n size ++\n if(size >= max) {\n size = 0\n _cache = cache\n cache = Object.create(null)\n }\n }\n\n return {\n has: function (key) {\n return cache[key] !== undefined || _cache[key] !== undefined\n },\n remove: function (key) {\n if(cache[key] !== undefined)\n cache[key] = undefined\n if(_cache[key] !== undefined)\n _cache[key] = undefined\n },\n get: function (key) {\n var v = cache[key]\n if(v !== undefined) return v\n if((v = _cache[key]) !== undefined) {\n update(key, v)\n return v\n }\n },\n set: function (key, value) {\n if(cache[key] !== undefined) cache[key] = value\n else update(key, value)\n },\n clear: function () {\n cache = Object.create(null)\n _cache = Object.create(null)\n }\n }\n}\n\n\n\n\n\n\n\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Netmask4Impl = void 0;\nexports.ip2long = ip2long;\nexports.long2ip = long2ip;\nfunction long2ip(long) {\n const a = (long & (0xff << 24)) >>> 24;\n const b = (long & (0xff << 16)) >>> 16;\n const c = (long & (0xff << 8)) >>> 8;\n const d = long & 0xff;\n return [a, b, c, d].join('.');\n}\nconst chr0 = '0'.charCodeAt(0);\nconst chra = 'a'.charCodeAt(0);\nconst chrA = 'A'.charCodeAt(0);\nfunction parseNum(s) {\n let n = 0;\n let base = 10;\n let dmax = '9';\n let i = 0;\n if (s.length > 1 && s[i] === '0') {\n if (s[i + 1] === 'x' || s[i + 1] === 'X') {\n i += 2;\n base = 16;\n }\n else if ('0' <= s[i + 1] && s[i + 1] <= '9') {\n i++;\n base = 8;\n dmax = '7';\n }\n }\n const start = i;\n while (i < s.length) {\n if ('0' <= s[i] && s[i] <= dmax) {\n n = (n * base + (s.charCodeAt(i) - chr0)) >>> 0;\n }\n else if (base === 16) {\n if ('a' <= s[i] && s[i] <= 'f') {\n n = (n * base + (10 + s.charCodeAt(i) - chra)) >>> 0;\n }\n else if ('A' <= s[i] && s[i] <= 'F') {\n n = (n * base + (10 + s.charCodeAt(i) - chrA)) >>> 0;\n }\n else {\n break;\n }\n }\n else {\n break;\n }\n if (n > 0xFFFFFFFF) {\n throw new Error('too large');\n }\n i++;\n }\n if (i === start) {\n throw new Error('empty octet');\n }\n return [n, i];\n}\nfunction ip2long(ip) {\n const b = [];\n for (let i = 0; i <= 3; i++) {\n if (ip.length === 0) {\n break;\n }\n if (i > 0) {\n if (ip[0] !== '.') {\n throw new Error('Invalid IP');\n }\n ip = ip.substring(1);\n }\n const [n, c] = parseNum(ip);\n ip = ip.substring(c);\n b.push(n);\n }\n if (ip.length !== 0) {\n throw new Error('Invalid IP');\n }\n switch (b.length) {\n case 1:\n if (b[0] > 0xFFFFFFFF) {\n throw new Error('Invalid IP');\n }\n return b[0] >>> 0;\n case 2:\n if (b[0] > 0xFF || b[1] > 0xFFFFFF) {\n throw new Error('Invalid IP');\n }\n return (b[0] << 24 | b[1]) >>> 0;\n case 3:\n if (b[0] > 0xFF || b[1] > 0xFF || b[2] > 0xFFFF) {\n throw new Error('Invalid IP');\n }\n return (b[0] << 24 | b[1] << 16 | b[2]) >>> 0;\n case 4:\n if (b[0] > 0xFF || b[1] > 0xFF || b[2] > 0xFF || b[3] > 0xFF) {\n throw new Error('Invalid IP');\n }\n return (b[0] << 24 | b[1] << 16 | b[2] << 8 | b[3]) >>> 0;\n default:\n throw new Error('Invalid IP');\n }\n}\nclass Netmask4Impl {\n constructor(net, mask) {\n if (typeof net !== 'string') {\n throw new Error(\"Missing `net' parameter\");\n }\n let maskStr = mask;\n if (!maskStr) {\n const parts = net.split('/', 2);\n net = parts[0];\n maskStr = parts[1];\n }\n if (!maskStr) {\n maskStr = 32;\n }\n if (typeof maskStr === 'string' && maskStr.indexOf('.') > -1) {\n try {\n this.maskLong = ip2long(maskStr);\n }\n catch (error) {\n throw new Error(\"Invalid mask: \" + maskStr);\n }\n this.bitmask = NaN;\n for (let i = 32; i >= 0; i--) {\n if (this.maskLong === (0xffffffff << (32 - i)) >>> 0) {\n this.bitmask = i;\n break;\n }\n }\n }\n else if (maskStr || maskStr === 0) {\n this.bitmask = parseInt(maskStr, 10);\n this.maskLong = 0;\n if (this.bitmask > 0) {\n this.maskLong = (0xffffffff << (32 - this.bitmask)) >>> 0;\n }\n }\n else {\n throw new Error(\"Invalid mask: empty\");\n }\n try {\n this.netLong = (ip2long(net) & this.maskLong) >>> 0;\n }\n catch (error) {\n throw new Error(\"Invalid net address: \" + net);\n }\n if (!(this.bitmask <= 32)) {\n throw new Error(\"Invalid mask for ip4: \" + maskStr);\n }\n this.size = Math.pow(2, 32 - this.bitmask);\n this.base = long2ip(this.netLong);\n this.mask = long2ip(this.maskLong);\n this.hostmask = long2ip(~this.maskLong);\n this.first = this.bitmask <= 30 ? long2ip(this.netLong + 1) : this.base;\n this.last = this.bitmask <= 30 ? long2ip(this.netLong + this.size - 2) : long2ip(this.netLong + this.size - 1);\n this.broadcast = this.bitmask <= 30 ? long2ip(this.netLong + this.size - 1) : undefined;\n }\n contains(ip) {\n if (typeof ip === 'string' && (ip.indexOf('/') > 0 || ip.split('.').length !== 4)) {\n ip = new Netmask4Impl(ip);\n }\n if (ip instanceof Netmask4Impl) {\n return this.contains(ip.base) && this.contains((ip.broadcast || ip.last));\n }\n else {\n return (ip2long(ip) & this.maskLong) >>> 0 === (this.netLong & this.maskLong) >>> 0;\n }\n }\n next(count = 1) {\n return new Netmask4Impl(long2ip(this.netLong + (this.size * count)), this.mask);\n }\n forEach(fn) {\n let long = ip2long(this.first);\n const lastLong = ip2long(this.last);\n let index = 0;\n while (long <= lastLong) {\n fn(long2ip(long), long, index);\n index++;\n long++;\n }\n }\n toString() {\n return this.base + \"/\" + this.bitmask;\n }\n}\nexports.Netmask4Impl = Netmask4Impl;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Netmask6Impl = void 0;\nexports.ip6bigint = ip6bigint;\nexports.bigint2ip6 = bigint2ip6;\nconst netmask4_1 = require(\"./netmask4\");\nconst MAX_IPV6 = (1n << 128n) - 1n;\nfunction ip6bigint(ip) {\n // Strip zone ID (e.g. %eth0)\n const zoneIdx = ip.indexOf('%');\n if (zoneIdx !== -1) {\n ip = ip.substring(0, zoneIdx);\n }\n // Handle mixed IPv4-mapped (e.g. ::ffff:192.168.1.1)\n const lastColon = ip.lastIndexOf(':');\n if (lastColon !== -1 && ip.indexOf('.', lastColon) !== -1) {\n const ipv4Part = ip.substring(lastColon + 1);\n const ipv4Long = (0, netmask4_1.ip2long)(ipv4Part);\n // IPv4 part replaces last 2 groups (32 bits), expand prefix to 6 groups\n const ipv6Prefix = ip.substring(0, lastColon + 1) + '0:0';\n const prefixVal = parseIPv6Pure(ipv6Prefix);\n return (prefixVal & ~0xffffffffn) | BigInt(ipv4Long);\n }\n return parseIPv6Pure(ip);\n}\nfunction parseIPv6Pure(ip) {\n const doubleColonIdx = ip.indexOf('::');\n let groups;\n if (doubleColonIdx !== -1) {\n const left = ip.substring(0, doubleColonIdx);\n const right = ip.substring(doubleColonIdx + 2);\n const leftGroups = left === '' ? [] : left.split(':');\n const rightGroups = right === '' ? [] : right.split(':');\n const missing = 8 - leftGroups.length - rightGroups.length;\n if (missing < 0) {\n throw new Error('Invalid IPv6: too many groups');\n }\n groups = [...leftGroups, ...Array(missing).fill('0'), ...rightGroups];\n }\n else {\n groups = ip.split(':');\n }\n if (groups.length !== 8) {\n throw new Error('Invalid IPv6: expected 8 groups, got ' + groups.length);\n }\n let result = 0n;\n for (let i = 0; i < 8; i++) {\n const g = groups[i];\n if (g.length === 0 || g.length > 4) {\n throw new Error('Invalid IPv6: bad group \"' + g + '\"');\n }\n const val = parseInt(g, 16);\n if (isNaN(val) || val < 0 || val > 0xffff) {\n throw new Error('Invalid IPv6: bad group \"' + g + '\"');\n }\n result = (result << 16n) | BigInt(val);\n }\n return result;\n}\nfunction bigint2ip6(n) {\n if (n < 0n || n > MAX_IPV6) {\n throw new Error('Invalid IPv6 address value');\n }\n const groups = [];\n for (let i = 0; i < 8; i++) {\n groups.unshift(Number(n & 0xffffn));\n n >>= 16n;\n }\n // RFC 5952: find longest run of consecutive zero groups\n let bestStart = -1;\n let bestLen = 0;\n let curStart = -1;\n let curLen = 0;\n for (let i = 0; i < 8; i++) {\n if (groups[i] === 0) {\n if (curStart === -1) {\n curStart = i;\n curLen = 1;\n }\n else {\n curLen++;\n }\n }\n else {\n if (curLen > bestLen && curLen >= 2) {\n bestStart = curStart;\n bestLen = curLen;\n }\n curStart = -1;\n curLen = 0;\n }\n }\n if (curLen > bestLen && curLen >= 2) {\n bestStart = curStart;\n bestLen = curLen;\n }\n if (bestStart !== -1 && bestStart + bestLen === 8 && bestStart > 0) {\n const before = groups.slice(0, bestStart).map(g => g.toString(16));\n return before.join(':') + '::';\n }\n else if (bestStart === 0) {\n const after = groups.slice(bestLen).map(g => g.toString(16));\n return '::' + after.join(':');\n }\n else if (bestStart > 0) {\n const before = groups.slice(0, bestStart).map(g => g.toString(16));\n const after = groups.slice(bestStart + bestLen).map(g => g.toString(16));\n return before.join(':') + '::' + after.join(':');\n }\n else {\n return groups.map(g => g.toString(16)).join(':');\n }\n}\nclass Netmask6Impl {\n constructor(net, mask) {\n if (typeof net !== 'string') {\n throw new Error(\"Missing `net' parameter\");\n }\n let prefixLen = mask;\n if (prefixLen === undefined || prefixLen === null) {\n const slashIdx = net.indexOf('/');\n if (slashIdx !== -1) {\n prefixLen = parseInt(net.substring(slashIdx + 1), 10);\n net = net.substring(0, slashIdx);\n }\n else {\n prefixLen = 128;\n }\n }\n if (isNaN(prefixLen) || prefixLen < 0 || prefixLen > 128) {\n throw new Error('Invalid mask for IPv6: ' + prefixLen);\n }\n this.bitmask = prefixLen;\n if (this.bitmask === 0) {\n this.maskBigint = 0n;\n }\n else {\n this.maskBigint = (MAX_IPV6 >> BigInt(128 - this.bitmask)) << BigInt(128 - this.bitmask);\n }\n try {\n this.netBigint = ip6bigint(net) & this.maskBigint;\n }\n catch (error) {\n throw new Error('Invalid IPv6 net address: ' + net);\n }\n this.size = Number(1n << BigInt(128 - this.bitmask));\n this.base = bigint2ip6(this.netBigint);\n this.mask = bigint2ip6(this.maskBigint);\n this.hostmask = bigint2ip6(~this.maskBigint & MAX_IPV6);\n this.first = this.base;\n this.last = bigint2ip6(this.netBigint + (1n << BigInt(128 - this.bitmask)) - 1n);\n this.broadcast = undefined;\n }\n contains(ip) {\n if (typeof ip === 'string') {\n if (ip.indexOf('/') > 0) {\n ip = new Netmask6Impl(ip);\n }\n }\n if (ip instanceof Netmask6Impl) {\n return this.contains(ip.base) && this.contains(ip.last);\n }\n else {\n const addr = ip6bigint(ip);\n return (addr & this.maskBigint) === this.netBigint;\n }\n }\n next(count = 1) {\n const sizeBig = 1n << BigInt(128 - this.bitmask);\n return new Netmask6Impl(bigint2ip6(this.netBigint + sizeBig * BigInt(count)), this.bitmask);\n }\n forEach(fn) {\n let addr = this.netBigint;\n const sizeBig = 1n << BigInt(128 - this.bitmask);\n const lastAddr = this.netBigint + sizeBig - 1n;\n let index = 0;\n while (addr <= lastAddr) {\n fn(bigint2ip6(addr), Number(addr), index);\n index++;\n addr++;\n }\n }\n toString() {\n return this.base + '/' + this.bitmask;\n }\n}\nexports.Netmask6Impl = Netmask6Impl;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.long2ip = exports.ip2long = exports.Netmask = void 0;\nconst netmask4_1 = require(\"./netmask4\");\nObject.defineProperty(exports, \"ip2long\", { enumerable: true, get: function () { return netmask4_1.ip2long; } });\nObject.defineProperty(exports, \"long2ip\", { enumerable: true, get: function () { return netmask4_1.long2ip; } });\nconst netmask6_1 = require(\"./netmask6\");\nclass Netmask {\n constructor(net, mask) {\n if (typeof net !== 'string') {\n throw new Error(\"Missing `net' parameter\");\n }\n // Detect IPv6: check the address part (before any /) for ':'\n const addrPart = net.indexOf('/') !== -1 ? net.substring(0, net.indexOf('/')) : net;\n if (addrPart.indexOf(':') !== -1) {\n this._impl = new netmask6_1.Netmask6Impl(net, mask);\n }\n else {\n this._impl = new netmask4_1.Netmask4Impl(net, mask);\n }\n this.base = this._impl.base;\n this.mask = this._impl.mask;\n this.hostmask = this._impl.hostmask;\n this.bitmask = this._impl.bitmask;\n this.size = this._impl.size;\n this.first = this._impl.first;\n this.last = this._impl.last;\n this.broadcast = this._impl.broadcast;\n if (this._impl instanceof netmask4_1.Netmask4Impl) {\n this.maskLong = this._impl.maskLong;\n this.netLong = this._impl.netLong;\n }\n else {\n this.maskLong = 0;\n this.netLong = 0;\n }\n }\n contains(ip) {\n if (typeof ip === 'string') {\n // If it has a '/', it's a CIDR block \u2014 wrap it\n if (ip.indexOf('/') > 0) {\n ip = new Netmask(ip);\n }\n // IPv4 shorthand (fewer than 4 octets, no colons) \u2014 wrap it\n else if (ip.indexOf(':') === -1 && ip.split('.').length !== 4) {\n ip = new Netmask(ip);\n }\n }\n if (ip instanceof Netmask) {\n return this.contains(ip.base) && this.contains(ip.broadcast || ip.last);\n }\n // Plain IP string \u2014 delegate to impl\n return this._impl.contains(ip);\n }\n next(count = 1) {\n const nextImpl = this._impl.next(count);\n const result = new Netmask(nextImpl.base, nextImpl.bitmask);\n return result;\n }\n /** @deprecated */\n forEach(fn) {\n this._impl.forEach(fn);\n }\n toString() {\n return this._impl.toString();\n }\n}\nexports.Netmask = Netmask;\n", "/**\n * @packageDocumentation\n *\n * A Trustless Gateway is an HTTP endpoint that can be used to download blocks\n * or CAR files in a verifiable way.\n */\n\nimport { TrustlessGatewayBlockBroker } from './broker.ts'\nimport type { TransformRequestInit } from './trustless-gateway.ts'\nimport type { Routing, BlockBroker, RoutingFindProvidersProgressEvents, BlockBrokerGetBlockProgressEvents } from '@helia/interface'\nimport type { ComponentLogger } from 'birnam'\nimport type { CID } from 'multiformats'\nimport type { ProgressEvent } from 'progress-events'\n\nexport const DEFAULT_ALLOW_INSECURE = false\nexport const DEFAULT_ALLOW_LOCAL = false\n/**\n * The maximum number of bytes to allow when fetching a raw block.\n *\n * @see https://specs.ipfs.tech/bitswap-protocol/#block-sizes\n */\nexport const DEFAULT_MAX_SIZE = 2_097_152\n\nexport interface TrustlessGatewayProvider {\n /**\n * The type of provider\n */\n type: 'trustless-gateway'\n\n /**\n * The CID that the provider can provide the block for\n */\n cid: CID\n\n /**\n * The provider's URL\n */\n url: string\n\n /**\n * Which routing implementation found the provider\n */\n routing: string\n}\n\nexport type TrustlessGatewayGetBlockProgressEvents =\n ProgressEvent<'trustless-gateway:get-block:fetch', URL> |\n ProgressEvent<'trustless-gateway:found-provider', TrustlessGatewayProvider> |\n RoutingFindProvidersProgressEvents |\n BlockBrokerGetBlockProgressEvents\n\nexport interface TrustlessGatewayBlockBrokerInit {\n /**\n * By default we will only connect to peers with HTTPS addresses, pass true\n * to also connect to HTTP addresses.\n *\n * @default false\n */\n allowInsecure?: boolean\n\n /**\n * By default we will only connect to peers with public or DNS addresses, pass\n * true to also connect to private addresses.\n *\n * @default false\n */\n allowLocal?: boolean\n /**\n * Provide a function that will be called before querying trustless-gateways. This lets you modify the fetch options to pass custom headers or other necessary things.\n */\n transformRequestInit?: TransformRequestInit\n}\n\nexport interface TrustlessGatewayBlockBrokerComponents {\n routing: Routing\n logger: ComponentLogger\n}\n\nexport function trustlessGatewayBlockBroker (init: TrustlessGatewayBlockBrokerInit = {}): (components: TrustlessGatewayBlockBrokerComponents) => BlockBroker<TrustlessGatewayGetBlockProgressEvents> {\n return (components) => new TrustlessGatewayBlockBroker(components, init)\n}\n", "/**\n * Returns a `Uint8Array` of the requested size. Referenced memory will\n * be initialized to 0.\n */\nexport function alloc (size: number = 0): Uint8Array<ArrayBuffer> {\n return new Uint8Array(size)\n}\n\n/**\n * Where possible returns a Uint8Array of the requested size that references\n * uninitialized memory. Only use if you are certain you will immediately\n * overwrite every value in the returned `Uint8Array`.\n */\nexport function allocUnsafe (size: number = 0): Uint8Array<ArrayBuffer> {\n return new Uint8Array(size)\n}\n", "/* eslint-disable no-fallthrough */\nimport { allocUnsafe } from 'uint8arrays/alloc'\nimport type { Uint8ArrayList } from 'uint8arraylist'\n\nconst N1 = Math.pow(2, 7)\nconst N2 = Math.pow(2, 14)\nconst N3 = Math.pow(2, 21)\nconst N4 = Math.pow(2, 28)\nconst N5 = Math.pow(2, 35)\nconst N6 = Math.pow(2, 42)\nconst N7 = Math.pow(2, 49)\n\n/** Most significant bit of a byte */\nconst MSB = 0x80\n/** Rest of the bits in a byte */\nconst REST = 0x7f\n\nexport function encodingLength (value: number): number {\n if (value < N1) {\n return 1\n }\n\n if (value < N2) {\n return 2\n }\n\n if (value < N3) {\n return 3\n }\n\n if (value < N4) {\n return 4\n }\n\n if (value < N5) {\n return 5\n }\n\n if (value < N6) {\n return 6\n }\n\n if (value < N7) {\n return 7\n }\n\n if (Number.MAX_SAFE_INTEGER != null && value > Number.MAX_SAFE_INTEGER) {\n throw new RangeError('Could not encode varint')\n }\n\n return 8\n}\n\nexport function encodeUint8Array <T extends ArrayBufferLike> (value: number, buf: Uint8Array<T>, offset: number = 0): Uint8Array<T> {\n switch (encodingLength(value)) {\n case 8: {\n buf[offset++] = (value & 0xFF) | MSB\n value /= 128\n }\n case 7: {\n buf[offset++] = (value & 0xFF) | MSB\n value /= 128\n }\n case 6: {\n buf[offset++] = (value & 0xFF) | MSB\n value /= 128\n }\n case 5: {\n buf[offset++] = (value & 0xFF) | MSB\n value /= 128\n }\n case 4: {\n buf[offset++] = (value & 0xFF) | MSB\n value >>>= 7\n }\n case 3: {\n buf[offset++] = (value & 0xFF) | MSB\n value >>>= 7\n }\n case 2: {\n buf[offset++] = (value & 0xFF) | MSB\n value >>>= 7\n }\n case 1: {\n buf[offset++] = (value & 0xFF)\n value >>>= 7\n break\n }\n default: throw new Error('unreachable')\n }\n return buf\n}\n\nexport function encodeUint8ArrayList <T extends ArrayBufferLike> (value: number, buf: Uint8ArrayList<T>, offset: number = 0): Uint8ArrayList<T> {\n switch (encodingLength(value)) {\n case 8: {\n buf.set(offset++, (value & 0xFF) | MSB)\n value /= 128\n }\n case 7: {\n buf.set(offset++, (value & 0xFF) | MSB)\n value /= 128\n }\n case 6: {\n buf.set(offset++, (value & 0xFF) | MSB)\n value /= 128\n }\n case 5: {\n buf.set(offset++, (value & 0xFF) | MSB)\n value /= 128\n }\n case 4: {\n buf.set(offset++, (value & 0xFF) | MSB)\n value >>>= 7\n }\n case 3: {\n buf.set(offset++, (value & 0xFF) | MSB)\n value >>>= 7\n }\n case 2: {\n buf.set(offset++, (value & 0xFF) | MSB)\n value >>>= 7\n }\n case 1: {\n buf.set(offset++, (value & 0xFF))\n value >>>= 7\n break\n }\n default: throw new Error('unreachable')\n }\n return buf\n}\n\nexport function decodeUint8Array (buf: Uint8Array, offset: number): number {\n let b = buf[offset]\n let res = 0\n\n res += b & REST\n if (b < MSB) {\n return res\n }\n\n b = buf[offset + 1]\n res += (b & REST) << 7\n if (b < MSB) {\n return res\n }\n\n b = buf[offset + 2]\n res += (b & REST) << 14\n if (b < MSB) {\n return res\n }\n\n b = buf[offset + 3]\n res += (b & REST) << 21\n if (b < MSB) {\n return res\n }\n\n b = buf[offset + 4]\n res += (b & REST) * N4\n if (b < MSB) {\n return res\n }\n\n b = buf[offset + 5]\n res += (b & REST) * N5\n if (b < MSB) {\n return res\n }\n\n b = buf[offset + 6]\n res += (b & REST) * N6\n if (b < MSB) {\n return res\n }\n\n b = buf[offset + 7]\n res += (b & REST) * N7\n if (b < MSB) {\n return res\n }\n\n throw new RangeError('Could not decode varint')\n}\n\nexport function decodeUint8ArrayList (buf: Uint8ArrayList, offset: number): number {\n let b = buf.get(offset)\n let res = 0\n\n res += b & REST\n if (b < MSB) {\n return res\n }\n\n b = buf.get(offset + 1)\n res += (b & REST) << 7\n if (b < MSB) {\n return res\n }\n\n b = buf.get(offset + 2)\n res += (b & REST) << 14\n if (b < MSB) {\n return res\n }\n\n b = buf.get(offset + 3)\n res += (b & REST) << 21\n if (b < MSB) {\n return res\n }\n\n b = buf.get(offset + 4)\n res += (b & REST) * N4\n if (b < MSB) {\n return res\n }\n\n b = buf.get(offset + 5)\n res += (b & REST) * N5\n if (b < MSB) {\n return res\n }\n\n b = buf.get(offset + 6)\n res += (b & REST) * N6\n if (b < MSB) {\n return res\n }\n\n b = buf.get(offset + 7)\n res += (b & REST) * N7\n if (b < MSB) {\n return res\n }\n\n throw new RangeError('Could not decode varint')\n}\n\nexport function encode (value: number): Uint8Array<ArrayBuffer>\nexport function encode <T extends ArrayBufferLike> (value: number, buf: Uint8Array<T>, offset?: number): Uint8Array<T>\nexport function encode <T extends ArrayBufferLike> (value: number, buf: Uint8ArrayList<T>, offset?: number): Uint8ArrayList<T>\nexport function encode <B extends ArrayBufferLike, T extends Uint8Array<B> | Uint8ArrayList<B> = Uint8Array<B>> (value: number, buf?: T, offset: number = 0): T {\n if (buf == null) {\n buf = allocUnsafe(encodingLength(value)) as T\n }\n if (buf instanceof Uint8Array) {\n return encodeUint8Array(value, buf, offset) as T\n } else {\n return encodeUint8ArrayList(value, buf, offset) as T\n }\n}\n\nexport function decode (buf: Uint8ArrayList | Uint8Array, offset: number = 0): number {\n if (buf instanceof Uint8Array) {\n return decodeUint8Array(buf, offset)\n } else {\n return decodeUint8ArrayList(buf, offset)\n }\n}\n", "function isArrayBufferBacked (arr: Uint8Array): arr is Uint8Array<ArrayBuffer> {\n return arr.buffer instanceof ArrayBuffer\n}\n\n/**\n * If the passed `arr` is of type `Uint8Array<ArrayBuffer>`, it is returned\n * unchanged, otherwise a new `Uint8Array<ArrayBuffer>` is created with the\n * data being a copy of the data in the passed `arr`.\n */\nexport function withArrayBuffer (arr: Uint8Array): Uint8Array<ArrayBuffer> {\n if (isArrayBufferBacked(arr)) {\n return arr\n }\n\n return arr.slice()\n}\n", "import { baseX } from './base.ts'\n\nexport const base10 = baseX({\n prefix: '9',\n name: 'base10',\n alphabet: '0123456789'\n})\n", "export const empty = new Uint8Array(0)\n\nexport function toHex (d: Uint8Array): string {\n return d.reduce((hex, byte) => hex + byte.toString(16).padStart(2, '0'), '')\n}\n\nexport function fromHex (hex: string): Uint8Array<ArrayBuffer> {\n const hexes = hex.match(/../g)\n return hexes != null ? new Uint8Array(hexes.map(b => parseInt(b, 16))) : empty\n}\n\nexport function equals (aa: Uint8Array, bb: Uint8Array): boolean {\n if (aa === bb) { return true }\n if (aa.byteLength !== bb.byteLength) {\n return false\n }\n\n for (let ii = 0; ii < aa.byteLength; ii++) {\n if (aa[ii] !== bb[ii]) {\n return false\n }\n }\n\n return true\n}\n\n/**\r\n * Normalize binary input to a plain `Uint8Array` backed by an `ArrayBuffer`.\r\n *\r\n * Returns the input itself when it is already a plain `Uint8Array` over an\r\n * `ArrayBuffer`, otherwise a fresh view (or, for `SharedArrayBuffer`-backed\r\n * input, a copy) over the same bytes.\r\n *\r\n * Throws if input is not a recognised binary type.\r\n */\r\nexport function coerce (o: ArrayBufferView | ArrayBuffer | Uint8Array): Uint8Array<ArrayBuffer> {\r\n if (o instanceof Uint8Array && o.constructor.name === 'Uint8Array') {\n return toArrayBufferBackedArray(o)\n }\n if (o instanceof ArrayBuffer) {\n return new Uint8Array(o)\n }\n if (ArrayBuffer.isView(o)) {\n return toArrayBufferBackedArray(new Uint8Array(o.buffer, o.byteOffset, o.byteLength))\n }\n throw new Error('Unknown type, must be binary type')\n}\n\nexport function isBinary (o: unknown): o is ArrayBuffer | ArrayBufferView {\n return o instanceof ArrayBuffer || ArrayBuffer.isView(o)\n}\n\nexport function fromString (str: string): Uint8Array<ArrayBuffer> {\n return new TextEncoder().encode(str)\n}\n\nexport function toString (b: Uint8Array): string {\n return new TextDecoder().decode(b)\n}\n\nfunction isByteArrayWithArrayBuffer (b?: Uint8Array): b is Uint8Array<ArrayBuffer> {\n return b?.buffer instanceof ArrayBuffer\n}\n\n/**\n * Ensures `b` is backed by an ArrayBuffer - if not a new Uint8Array will be\n * created and the contents of `b` copied into it.\n */\nexport function toArrayBufferBackedArray (b: Uint8Array): Uint8Array<ArrayBuffer> {\n if (isByteArrayWithArrayBuffer(b)) {\n return b\n }\n\n return b.slice()\n}\n", "/* eslint-disable */\n// base-x encoding / decoding\n// Copyright (c) 2018 base-x contributors\n// Copyright (c) 2014-2018 The Bitcoin Core developers (base58.cpp)\n// Distributed under the MIT software license, see the accompanying\n// file LICENSE or http://www.opensource.org/licenses/mit-license.php.\n/**\n * @param {string} ALPHABET\n * @param {any} name\n */\nfunction base (ALPHABET, name) {\n if (ALPHABET.length >= 255) { throw new TypeError('Alphabet too long') }\n var BASE_MAP = new Uint8Array(256);\n for (var j = 0; j < BASE_MAP.length; j++) {\n BASE_MAP[j] = 255;\n }\n for (var i = 0; i < ALPHABET.length; i++) {\n var x = ALPHABET.charAt(i);\n var xc = x.charCodeAt(0);\n if (BASE_MAP[xc] !== 255) { throw new TypeError(x + ' is ambiguous') }\n BASE_MAP[xc] = i;\n }\n var BASE = ALPHABET.length;\n var LEADER = ALPHABET.charAt(0);\n var FACTOR = Math.log(BASE) / Math.log(256); // log(BASE) / log(256), rounded up\n var iFACTOR = Math.log(256) / Math.log(BASE); // log(256) / log(BASE), rounded up\n /**\n * @param {any[] | Iterable<number>} source\n */\n function encode (source) {\n // @ts-ignore\n if (source instanceof Uint8Array) ; else if (ArrayBuffer.isView(source)) {\n source = new Uint8Array(source.buffer, source.byteOffset, source.byteLength);\n } else if (Array.isArray(source)) {\n source = Uint8Array.from(source);\n }\n if (!(source instanceof Uint8Array)) { throw new TypeError('Expected Uint8Array') }\n if (source.length === 0) { return '' }\n // Skip & count leading zeroes.\n var zeroes = 0;\n var length = 0;\n var pbegin = 0;\n var pend = source.length;\n while (pbegin !== pend && source[pbegin] === 0) {\n pbegin++;\n zeroes++;\n }\n // Allocate enough space in big-endian base58 representation.\n var size = ((pend - pbegin) * iFACTOR + 1) >>> 0;\n var b58 = new Uint8Array(size);\n // Process the bytes.\n while (pbegin !== pend) {\n var carry = source[pbegin];\n // Apply \"b58 = b58 * 256 + ch\".\n var i = 0;\n for (var it1 = size - 1; (carry !== 0 || i < length) && (it1 !== -1); it1--, i++) {\n carry += (256 * b58[it1]) >>> 0;\n b58[it1] = (carry % BASE) >>> 0;\n carry = (carry / BASE) >>> 0;\n }\n if (carry !== 0) { throw new Error('Non-zero carry') }\n length = i;\n pbegin++;\n }\n // Skip leading zeroes in base58 result.\n var it2 = size - length;\n while (it2 !== size && b58[it2] === 0) {\n it2++;\n }\n // Translate the result into a string.\n var str = LEADER.repeat(zeroes);\n for (; it2 < size; ++it2) { str += ALPHABET.charAt(b58[it2]); }\n return str\n }\n /**\n * @param {string | string[]} source\n */\n function decodeUnsafe (source) {\n if (typeof source !== 'string') { throw new TypeError('Expected String') }\n if (source.length === 0) { return new Uint8Array() }\n var psz = 0;\n // Skip leading spaces.\n if (source[psz] === ' ') { return }\n // Skip and count leading '1's.\n var zeroes = 0;\n var length = 0;\n while (source[psz] === LEADER) {\n zeroes++;\n psz++;\n }\n // Allocate enough space in big-endian base256 representation.\n var size = (((source.length - psz) * FACTOR) + 1) >>> 0; // log(58) / log(256), rounded up.\n var b256 = new Uint8Array(size);\n // Process the characters.\n while (source[psz]) {\n // Decode character\n var carry = BASE_MAP[source.charCodeAt(psz)];\n // Invalid character\n if (carry === 255) { return }\n var i = 0;\n for (var it3 = size - 1; (carry !== 0 || i < length) && (it3 !== -1); it3--, i++) {\n carry += (BASE * b256[it3]) >>> 0;\n b256[it3] = (carry % 256) >>> 0;\n carry = (carry / 256) >>> 0;\n }\n if (carry !== 0) { throw new Error('Non-zero carry') }\n length = i;\n psz++;\n }\n // Skip trailing spaces.\n if (source[psz] === ' ') { return }\n // Skip leading zeroes in b256.\n var it4 = size - length;\n while (it4 !== size && b256[it4] === 0) {\n it4++;\n }\n var vch = new Uint8Array(zeroes + (size - it4));\n var j = zeroes;\n while (it4 !== size) {\n vch[j++] = b256[it4++];\n }\n return vch\n }\n /**\n * @param {string | string[]} string\n */\n function decode (string) {\n var buffer = decodeUnsafe(string);\n if (buffer) { return buffer }\n throw new Error(`Non-${name} character`)\n }\n return {\n encode: encode,\n decodeUnsafe: decodeUnsafe,\n decode: decode\n }\n}\nvar src = base;\n\nvar _brrp__multiformats_scope_baseX = src;\n\nexport default _brrp__multiformats_scope_baseX;\n", "import { coerce } from '../bytes.ts'\nimport basex from '../vendor/base-x.js'\nimport type { BaseCodec, BaseDecoder, BaseEncoder, CombobaseDecoder, Multibase, MultibaseCodec, MultibaseDecoder, MultibaseEncoder, UnibaseDecoder } from './interface.ts'\n\ninterface EncodeFn { (bytes: Uint8Array): string }\ninterface DecodeFn { (text: string): Uint8Array<ArrayBuffer> }\n\n/**\n * Class represents both BaseEncoder and MultibaseEncoder meaning it\n * can be used to encode to multibase or base encode without multibase\n * prefix.\n */\nclass Encoder<Base extends string, Prefix extends string> implements MultibaseEncoder<Prefix>, BaseEncoder {\n readonly name: Base\n readonly prefix: Prefix\n readonly baseEncode: EncodeFn\n\n constructor (name: Base, prefix: Prefix, baseEncode: EncodeFn) {\n this.name = name\n this.prefix = prefix\n this.baseEncode = baseEncode\n }\n\n encode (bytes: Uint8Array): Multibase<Prefix> {\n if (bytes instanceof Uint8Array) {\n return `${this.prefix}${this.baseEncode(bytes)}`\n } else {\n throw Error('Unknown type, must be binary type')\n }\n }\n}\n\n/**\n * Class represents both BaseDecoder and MultibaseDecoder so it could be used\n * to decode multibases (with matching prefix) or just base decode strings\n * with corresponding base encoding.\n */\nclass Decoder<Base extends string, Prefix extends string> implements MultibaseDecoder<Prefix>, UnibaseDecoder<Prefix>, BaseDecoder {\n readonly name: Base\n readonly prefix: Prefix\n readonly baseDecode: DecodeFn\n private readonly prefixCodePoint: number\n\n constructor (name: Base, prefix: Prefix, baseDecode: DecodeFn) {\n this.name = name\n this.prefix = prefix\n const prefixCodePoint = prefix.codePointAt(0)\n /* c8 ignore next 3 */\n if (prefixCodePoint === undefined) {\n throw new Error('Invalid prefix character')\n }\n this.prefixCodePoint = prefixCodePoint\n this.baseDecode = baseDecode\n }\n\n decode (text: string): Uint8Array<ArrayBuffer> {\n if (typeof text === 'string') {\n if (text.codePointAt(0) !== this.prefixCodePoint) {\n throw Error(`Unable to decode multibase string ${JSON.stringify(text)}, ${this.name} decoder only supports inputs prefixed with ${this.prefix}`)\n }\n return this.baseDecode(text.slice(this.prefix.length))\n } else {\n throw Error('Can only multibase decode strings')\n }\n }\n\n or<OtherPrefix extends string> (decoder: UnibaseDecoder<OtherPrefix> | ComposedDecoder<OtherPrefix>): ComposedDecoder<Prefix | OtherPrefix> {\n return or(this, decoder)\n }\n}\n\ntype Decoders<Prefix extends string> = Record<Prefix, UnibaseDecoder<Prefix>>\n\nclass ComposedDecoder<Prefix extends string> implements MultibaseDecoder<Prefix>, CombobaseDecoder<Prefix> {\n readonly decoders: Decoders<Prefix>\n\n constructor (decoders: Decoders<Prefix>) {\n this.decoders = decoders\n }\n\n or <OtherPrefix extends string> (decoder: UnibaseDecoder<OtherPrefix> | ComposedDecoder<OtherPrefix>): ComposedDecoder<Prefix | OtherPrefix> {\n return or(this, decoder)\n }\n\n decode (input: string): Uint8Array<ArrayBuffer> {\n const prefix = input[0] as Prefix\n const decoder = this.decoders[prefix]\n if (decoder != null) {\n return decoder.decode(input)\n } else {\n throw RangeError(`Unable to decode multibase string ${JSON.stringify(input)}, only inputs prefixed with ${Object.keys(this.decoders)} are supported`)\n }\n }\n}\n\nexport function or <L extends string, R extends string> (left: UnibaseDecoder<L> | CombobaseDecoder<L>, right: UnibaseDecoder<R> | CombobaseDecoder<R>): ComposedDecoder<L | R> {\n return new ComposedDecoder({\n ...(left.decoders ?? { [(left as UnibaseDecoder<L>).prefix]: left }),\n ...(right.decoders ?? { [(right as UnibaseDecoder<R>).prefix]: right })\n } as Decoders<L | R>)\n}\n\nexport class Codec<Base extends string, Prefix extends string> implements MultibaseCodec<Prefix>, MultibaseEncoder<Prefix>, MultibaseDecoder<Prefix>, BaseCodec, BaseEncoder, BaseDecoder {\n readonly name: Base\n readonly prefix: Prefix\n readonly baseEncode: EncodeFn\n readonly baseDecode: DecodeFn\n readonly encoder: Encoder<Base, Prefix>\n readonly decoder: Decoder<Base, Prefix>\n\n constructor (name: Base, prefix: Prefix, baseEncode: EncodeFn, baseDecode: DecodeFn) {\n this.name = name\n this.prefix = prefix\n this.baseEncode = baseEncode\n this.baseDecode = baseDecode\n this.encoder = new Encoder(name, prefix, baseEncode)\n this.decoder = new Decoder(name, prefix, baseDecode)\n }\n\n encode (input: Uint8Array): string {\n return this.encoder.encode(input)\n }\n\n decode (input: string): Uint8Array<ArrayBuffer> {\n return this.decoder.decode(input)\n }\n}\n\nexport function from <Base extends string, Prefix extends string> ({ name, prefix, encode, decode }: { name: Base, prefix: Prefix, encode: EncodeFn, decode: DecodeFn }): Codec<Base, Prefix> {\n return new Codec(name, prefix, encode, decode)\n}\n\nexport function baseX <Base extends string, Prefix extends string> ({ name, prefix, alphabet }: { name: Base, prefix: Prefix, alphabet: string }): Codec<Base, Prefix> {\n const { encode, decode } = basex(alphabet, name)\n return from({\n prefix,\n name,\n encode,\n decode: (text: string): Uint8Array<ArrayBuffer> => coerce(decode(text))\n })\n}\n\nfunction decode (string: string, alphabetIdx: Record<string, number>, bitsPerChar: number, name: string): Uint8Array<ArrayBuffer> {\n // Count the padding bytes:\n let end = string.length\n while (string[end - 1] === '=') {\n --end\n }\n\n // Allocate the output:\n const out = new Uint8Array((end * bitsPerChar / 8) | 0)\n\n // Parse the data:\n let bits = 0 // Number of bits currently in the buffer\n let buffer = 0 // Bits waiting to be written out, MSB first\n let written = 0 // Next byte to write\n for (let i = 0; i < end; ++i) {\n // Read one character from the string:\n const value = alphabetIdx[string[i]]\n if (value === undefined) {\n throw new SyntaxError(`Non-${name} character`)\n }\n\n // Append the bits to the buffer:\n buffer = (buffer << bitsPerChar) | value\n bits += bitsPerChar\n\n // Write out some bits if the buffer has a byte's worth:\n if (bits >= 8) {\n bits -= 8\n out[written++] = 0xff & (buffer >> bits)\n }\n }\n\n // Verify that we have received just enough bits:\n if (bits >= bitsPerChar || (0xff & (buffer << (8 - bits))) !== 0) {\n throw new SyntaxError('Unexpected end of data')\n }\n\n return out\n}\n\nfunction encode (data: Uint8Array, alphabet: string, bitsPerChar: number): string {\n const pad = alphabet[alphabet.length - 1] === '='\n const mask = (1 << bitsPerChar) - 1\n let out = ''\n\n let bits = 0 // Number of bits currently in the buffer\n let buffer = 0 // Bits waiting to be written out, MSB first\n for (let i = 0; i < data.length; ++i) {\n // Slurp data into the buffer:\n buffer = (buffer << 8) | data[i]\n bits += 8\n\n // Write out as much as we can:\n while (bits > bitsPerChar) {\n bits -= bitsPerChar\n out += alphabet[mask & (buffer >> bits)]\n }\n }\n\n // Partial character:\n if (bits !== 0) {\n out += alphabet[mask & (buffer << (bitsPerChar - bits))]\n }\n\n // Add padding characters until we hit a byte boundary:\n if (pad) {\n while (((out.length * bitsPerChar) & 7) !== 0) {\n out += '='\n }\n }\n\n return out\n}\n\nfunction createAlphabetIdx (alphabet: string): Record<string, number> {\n // Build the character lookup table:\n const alphabetIdx: Record<string, number> = {}\n for (let i = 0; i < alphabet.length; ++i) {\n alphabetIdx[alphabet[i]] = i\n }\n return alphabetIdx\n}\n\n/**\n * RFC4648 Factory\n */\nexport function rfc4648 <Base extends string, Prefix extends string> ({ name, prefix, bitsPerChar, alphabet }: { name: Base, prefix: Prefix, bitsPerChar: number, alphabet: string }): Codec<Base, Prefix> {\n const alphabetIdx = createAlphabetIdx(alphabet)\n return from({\n prefix,\n name,\n encode (input: Uint8Array): string {\n return encode(input, alphabet, bitsPerChar)\n },\n decode (input: string): Uint8Array<ArrayBuffer> {\n return decode(input, alphabetIdx, bitsPerChar, name)\n }\n })\n}\n", "import { rfc4648 } from './base.ts'\n\nexport const base16 = rfc4648({\n prefix: 'f',\n name: 'base16',\n alphabet: '0123456789abcdef',\n bitsPerChar: 4\n})\n\nexport const base16upper = rfc4648({\n prefix: 'F',\n name: 'base16upper',\n alphabet: '0123456789ABCDEF',\n bitsPerChar: 4\n})\n", "import { rfc4648 } from './base.ts'\n\nexport const base2 = rfc4648({\n prefix: '0',\n name: 'base2',\n alphabet: '01',\n bitsPerChar: 1\n})\n", "import { from } from './base.ts'\n\nconst alphabet = Array.from('\uD83D\uDE80\uD83E\uDE90\u2604\uD83D\uDEF0\uD83C\uDF0C\uD83C\uDF11\uD83C\uDF12\uD83C\uDF13\uD83C\uDF14\uD83C\uDF15\uD83C\uDF16\uD83C\uDF17\uD83C\uDF18\uD83C\uDF0D\uD83C\uDF0F\uD83C\uDF0E\uD83D\uDC09\u2600\uD83D\uDCBB\uD83D\uDDA5\uD83D\uDCBE\uD83D\uDCBF\uD83D\uDE02\u2764\uD83D\uDE0D\uD83E\uDD23\uD83D\uDE0A\uD83D\uDE4F\uD83D\uDC95\uD83D\uDE2D\uD83D\uDE18\uD83D\uDC4D\uD83D\uDE05\uD83D\uDC4F\uD83D\uDE01\uD83D\uDD25\uD83E\uDD70\uD83D\uDC94\uD83D\uDC96\uD83D\uDC99\uD83D\uDE22\uD83E\uDD14\uD83D\uDE06\uD83D\uDE44\uD83D\uDCAA\uD83D\uDE09\u263A\uD83D\uDC4C\uD83E\uDD17\uD83D\uDC9C\uD83D\uDE14\uD83D\uDE0E\uD83D\uDE07\uD83C\uDF39\uD83E\uDD26\uD83C\uDF89\uD83D\uDC9E\u270C\u2728\uD83E\uDD37\uD83D\uDE31\uD83D\uDE0C\uD83C\uDF38\uD83D\uDE4C\uD83D\uDE0B\uD83D\uDC97\uD83D\uDC9A\uD83D\uDE0F\uD83D\uDC9B\uD83D\uDE42\uD83D\uDC93\uD83E\uDD29\uD83D\uDE04\uD83D\uDE00\uD83D\uDDA4\uD83D\uDE03\uD83D\uDCAF\uD83D\uDE48\uD83D\uDC47\uD83C\uDFB6\uD83D\uDE12\uD83E\uDD2D\u2763\uD83D\uDE1C\uD83D\uDC8B\uD83D\uDC40\uD83D\uDE2A\uD83D\uDE11\uD83D\uDCA5\uD83D\uDE4B\uD83D\uDE1E\uD83D\uDE29\uD83D\uDE21\uD83E\uDD2A\uD83D\uDC4A\uD83E\uDD73\uD83D\uDE25\uD83E\uDD24\uD83D\uDC49\uD83D\uDC83\uD83D\uDE33\u270B\uD83D\uDE1A\uD83D\uDE1D\uD83D\uDE34\uD83C\uDF1F\uD83D\uDE2C\uD83D\uDE43\uD83C\uDF40\uD83C\uDF37\uD83D\uDE3B\uD83D\uDE13\u2B50\u2705\uD83E\uDD7A\uD83C\uDF08\uD83D\uDE08\uD83E\uDD18\uD83D\uDCA6\u2714\uD83D\uDE23\uD83C\uDFC3\uD83D\uDC90\u2639\uD83C\uDF8A\uD83D\uDC98\uD83D\uDE20\u261D\uD83D\uDE15\uD83C\uDF3A\uD83C\uDF82\uD83C\uDF3B\uD83D\uDE10\uD83D\uDD95\uD83D\uDC9D\uD83D\uDE4A\uD83D\uDE39\uD83D\uDDE3\uD83D\uDCAB\uD83D\uDC80\uD83D\uDC51\uD83C\uDFB5\uD83E\uDD1E\uD83D\uDE1B\uD83D\uDD34\uD83D\uDE24\uD83C\uDF3C\uD83D\uDE2B\u26BD\uD83E\uDD19\u2615\uD83C\uDFC6\uD83E\uDD2B\uD83D\uDC48\uD83D\uDE2E\uD83D\uDE46\uD83C\uDF7B\uD83C\uDF43\uD83D\uDC36\uD83D\uDC81\uD83D\uDE32\uD83C\uDF3F\uD83E\uDDE1\uD83C\uDF81\u26A1\uD83C\uDF1E\uD83C\uDF88\u274C\u270A\uD83D\uDC4B\uD83D\uDE30\uD83E\uDD28\uD83D\uDE36\uD83E\uDD1D\uD83D\uDEB6\uD83D\uDCB0\uD83C\uDF53\uD83D\uDCA2\uD83E\uDD1F\uD83D\uDE41\uD83D\uDEA8\uD83D\uDCA8\uD83E\uDD2C\u2708\uD83C\uDF80\uD83C\uDF7A\uD83E\uDD13\uD83D\uDE19\uD83D\uDC9F\uD83C\uDF31\uD83D\uDE16\uD83D\uDC76\uD83E\uDD74\u25B6\u27A1\u2753\uD83D\uDC8E\uD83D\uDCB8\u2B07\uD83D\uDE28\uD83C\uDF1A\uD83E\uDD8B\uD83D\uDE37\uD83D\uDD7A\u26A0\uD83D\uDE45\uD83D\uDE1F\uD83D\uDE35\uD83D\uDC4E\uD83E\uDD32\uD83E\uDD20\uD83E\uDD27\uD83D\uDCCC\uD83D\uDD35\uD83D\uDC85\uD83E\uDDD0\uD83D\uDC3E\uD83C\uDF52\uD83D\uDE17\uD83E\uDD11\uD83C\uDF0A\uD83E\uDD2F\uD83D\uDC37\u260E\uD83D\uDCA7\uD83D\uDE2F\uD83D\uDC86\uD83D\uDC46\uD83C\uDFA4\uD83D\uDE47\uD83C\uDF51\u2744\uD83C\uDF34\uD83D\uDCA3\uD83D\uDC38\uD83D\uDC8C\uD83D\uDCCD\uD83E\uDD40\uD83E\uDD22\uD83D\uDC45\uD83D\uDCA1\uD83D\uDCA9\uD83D\uDC50\uD83D\uDCF8\uD83D\uDC7B\uD83E\uDD10\uD83E\uDD2E\uD83C\uDFBC\uD83E\uDD75\uD83D\uDEA9\uD83C\uDF4E\uD83C\uDF4A\uD83D\uDC7C\uD83D\uDC8D\uD83D\uDCE3\uD83E\uDD42')\nconst alphabetBytesToChars: string[] = (alphabet.reduce<string[]>((p, c, i) => { p[i] = c; return p }, ([])))\nconst alphabetCharsToBytes: number[] = (alphabet.reduce<number[]>((p, c, i) => {\n const codePoint = c.codePointAt(0)\n if (codePoint == null) {\n throw new Error(`Invalid character: ${c}`)\n }\n p[codePoint] = i\n return p\n}, ([])))\n\nfunction encode (data: Uint8Array): string {\n return data.reduce((p, c) => {\n p += alphabetBytesToChars[c]\n return p\n }, '')\n}\n\nfunction decode (str: string): Uint8Array<ArrayBuffer> {\n const byts = []\n for (const char of str) {\n const codePoint = char.codePointAt(0)\n if (codePoint == null) {\n throw new Error(`Invalid character: ${char}`)\n }\n const byt = alphabetCharsToBytes[codePoint]\n if (byt == null) {\n throw new Error(`Non-base256emoji character: ${char}`)\n }\n byts.push(byt)\n }\n return new Uint8Array(byts)\n}\n\nexport const base256emoji = from({\n prefix: '\uD83D\uDE80',\n name: 'base256emoji',\n encode,\n decode\n})\n", "import { rfc4648 } from './base.ts'\n\nexport const base32 = rfc4648({\n prefix: 'b',\n name: 'base32',\n alphabet: 'abcdefghijklmnopqrstuvwxyz234567',\n bitsPerChar: 5\n})\n\nexport const base32upper = rfc4648({\n prefix: 'B',\n name: 'base32upper',\n alphabet: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567',\n bitsPerChar: 5\n})\n\nexport const base32pad = rfc4648({\n prefix: 'c',\n name: 'base32pad',\n alphabet: 'abcdefghijklmnopqrstuvwxyz234567=',\n bitsPerChar: 5\n})\n\nexport const base32padupper = rfc4648({\n prefix: 'C',\n name: 'base32padupper',\n alphabet: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567=',\n bitsPerChar: 5\n})\n\nexport const base32hex = rfc4648({\n prefix: 'v',\n name: 'base32hex',\n alphabet: '0123456789abcdefghijklmnopqrstuv',\n bitsPerChar: 5\n})\n\nexport const base32hexupper = rfc4648({\n prefix: 'V',\n name: 'base32hexupper',\n alphabet: '0123456789ABCDEFGHIJKLMNOPQRSTUV',\n bitsPerChar: 5\n})\n\nexport const base32hexpad = rfc4648({\n prefix: 't',\n name: 'base32hexpad',\n alphabet: '0123456789abcdefghijklmnopqrstuv=',\n bitsPerChar: 5\n})\n\nexport const base32hexpadupper = rfc4648({\n prefix: 'T',\n name: 'base32hexpadupper',\n alphabet: '0123456789ABCDEFGHIJKLMNOPQRSTUV=',\n bitsPerChar: 5\n})\n\nexport const base32z = rfc4648({\n prefix: 'h',\n name: 'base32z',\n alphabet: 'ybndrfg8ejkmcpqxot1uwisza345h769',\n bitsPerChar: 5\n})\n", "import { baseX } from './base.ts'\n\nexport const base36 = baseX({\n prefix: 'k',\n name: 'base36',\n alphabet: '0123456789abcdefghijklmnopqrstuvwxyz'\n})\n\nexport const base36upper = baseX({\n prefix: 'K',\n name: 'base36upper',\n alphabet: '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'\n})\n", "import { baseX } from './base.ts'\n\nexport const base58btc = baseX({\n name: 'base58btc',\n prefix: 'z',\n alphabet: '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'\n})\n\nexport const base58flickr = baseX({\n name: 'base58flickr',\n prefix: 'Z',\n alphabet: '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ'\n})\n", "import { rfc4648 } from './base.ts'\n\nexport const base64 = rfc4648({\n prefix: 'm',\n name: 'base64',\n alphabet: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',\n bitsPerChar: 6\n})\n\nexport const base64pad = rfc4648({\n prefix: 'M',\n name: 'base64pad',\n alphabet: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=',\n bitsPerChar: 6\n})\n\nexport const base64url = rfc4648({\n prefix: 'u',\n name: 'base64url',\n alphabet: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_',\n bitsPerChar: 6\n})\n\nexport const base64urlpad = rfc4648({\n prefix: 'U',\n name: 'base64urlpad',\n alphabet: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_=',\n bitsPerChar: 6\n})\n", "import { rfc4648 } from './base.ts'\n\nexport const base8 = rfc4648({\n prefix: '7',\n name: 'base8',\n alphabet: '01234567',\n bitsPerChar: 3\n})\n", "import { fromString, toString } from '../bytes.ts'\nimport { from } from './base.ts'\n\nexport const identity = from({\n prefix: '\\x00',\n name: 'identity',\n encode: (buf) => toString(buf),\n decode: (str) => fromString(str)\n})\n", "import type { ArrayBufferView, ByteView } from './interface.ts'\n\nconst textEncoder = new TextEncoder()\nconst textDecoder = new TextDecoder()\n\nexport const name = 'json'\nexport const code = 0x0200\n\nexport function encode <T> (node: T): ByteView<T> {\n return textEncoder.encode(JSON.stringify(node))\n}\n\nexport function decode <T> (data: ByteView<T> | ArrayBufferView<T>): T {\n return JSON.parse(textDecoder.decode(data))\n}\n", "import { coerce } from '../bytes.ts'\nimport * as Digest from './digest.ts'\nimport type { DigestOptions } from './hasher.ts'\nimport type { SyncMultihashHasher } from './interface.ts'\n\nconst code: 0x0 = 0x0\nconst name = 'identity'\n\nconst encode: (input: Uint8Array) => Uint8Array<ArrayBuffer> = coerce\n\nfunction digest (input: Uint8Array, options?: DigestOptions): Digest.Digest<typeof code, number> {\n if (options?.truncate != null && options.truncate !== input.byteLength) {\n if (options.truncate < 0 || options.truncate > input.byteLength) {\n throw new Error(`Invalid truncate option, must be less than or equal to ${input.byteLength}`)\n }\n\n input = input.subarray(0, options.truncate)\n }\n\n return Digest.create(code, encode(input))\n}\n\nexport const identity: SyncMultihashHasher<0x00> = { code, name, encode, digest }\n", "/* eslint-disable */\nvar encode_1 = encode;\n\nvar MSB = 0x80\n , REST = 0x7F\n , MSBALL = ~REST\n , INT = Math.pow(2, 31);\n\n/**\n * @param {number} num\n * @param {number[]} out\n * @param {number} offset\n */\nfunction encode(num, out, offset) {\n out = out || [];\n offset = offset || 0;\n var oldOffset = offset;\n\n while(num >= INT) {\n out[offset++] = (num & 0xFF) | MSB;\n num /= 128;\n }\n while(num & MSBALL) {\n out[offset++] = (num & 0xFF) | MSB;\n num >>>= 7;\n }\n out[offset] = num | 0;\n \n // @ts-ignore\n encode.bytes = offset - oldOffset + 1;\n \n return out\n}\n\nvar decode = read;\n\nvar MSB$1 = 0x80\n , REST$1 = 0x7F;\n\n/**\n * @param {string | any[]} buf\n * @param {number} offset\n */\nfunction read(buf, offset) {\n var res = 0\n , offset = offset || 0\n , shift = 0\n , counter = offset\n , b\n , l = buf.length;\n\n do {\n if (counter >= l) {\n // @ts-ignore\n read.bytes = 0;\n throw new RangeError('Could not decode varint')\n }\n b = buf[counter++];\n res += shift < 28\n ? (b & REST$1) << shift\n : (b & REST$1) * Math.pow(2, shift);\n shift += 7;\n } while (b >= MSB$1)\n\n // @ts-ignore\n read.bytes = counter - offset;\n\n return res\n}\n\nvar N1 = Math.pow(2, 7);\nvar N2 = Math.pow(2, 14);\nvar N3 = Math.pow(2, 21);\nvar N4 = Math.pow(2, 28);\nvar N5 = Math.pow(2, 35);\nvar N6 = Math.pow(2, 42);\nvar N7 = Math.pow(2, 49);\nvar N8 = Math.pow(2, 56);\nvar N9 = Math.pow(2, 63);\n\nvar length = function (/** @type {number} */ value) {\n return (\n value < N1 ? 1\n : value < N2 ? 2\n : value < N3 ? 3\n : value < N4 ? 4\n : value < N5 ? 5\n : value < N6 ? 6\n : value < N7 ? 7\n : value < N8 ? 8\n : value < N9 ? 9\n : 10\n )\n};\n\nvar varint = {\n encode: encode_1\n , decode: decode\n , encodingLength: length\n};\n\nvar _brrp_varint = varint;\n\nexport default _brrp_varint;\n", "import varint from './vendor/varint.js'\n\nexport function decode (data: Uint8Array, offset = 0): [number, number] {\n const code = varint.decode(data, offset)\n return [code, varint.decode.bytes]\n}\n\nexport function encodeTo (int: number, target: Uint8Array, offset = 0): Uint8Array {\n varint.encode(int, target, offset)\n return target\n}\n\nexport function encodingLength (int: number): number {\n return varint.encodingLength(int)\n}\n", "import { coerce, equals as equalBytes, toArrayBufferBackedArray } from '../bytes.ts'\nimport * as varint from '../varint.ts'\nimport type { MultihashDigest } from './interface.ts'\n\n/**\n * Creates a multihash digest.\n */\nexport function create <Code extends number> (code: Code, digest: Uint8Array): Digest<Code, number> {\n const size = digest.byteLength\n const sizeOffset = varint.encodingLength(code)\n const digestOffset = sizeOffset + varint.encodingLength(size)\n\n const bytes = new Uint8Array(digestOffset + size)\n varint.encodeTo(code, bytes, 0)\n varint.encodeTo(size, bytes, sizeOffset)\n bytes.set(digest, digestOffset)\n\n return new Digest(code, size, digest, bytes)\n}\n\n/**\n * Turns bytes representation of multihash digest into an instance.\n */\nexport function decode (multihash: Uint8Array): MultihashDigest {\n const bytes = coerce(multihash)\n const [code, sizeOffset] = varint.decode(bytes)\n const [size, digestOffset] = varint.decode(bytes.subarray(sizeOffset))\n const digest = bytes.subarray(sizeOffset + digestOffset)\n\n if (digest.byteLength !== size) {\n throw new Error('Incorrect length')\n }\n\n return new Digest(code, size, digest, bytes)\n}\n\nexport function equals (a: MultihashDigest, b: unknown): b is MultihashDigest {\n if (a === b) {\n return true\n } else {\n const data = b as { code?: unknown, size?: unknown, bytes?: unknown }\n\n return (\n a.code === data.code &&\n a.size === data.size &&\n data.bytes instanceof Uint8Array &&\n equalBytes(a.bytes, data.bytes)\n )\n }\n}\n\n/**\n * Represents a multihash digest which carries information about the\n * hashing algorithm and an actual hash digest.\n */\nexport class Digest<Code extends number, Size extends number> implements MultihashDigest {\n readonly code: Code\n readonly size: Size\n readonly digest: Uint8Array<ArrayBuffer>\n readonly bytes: Uint8Array<ArrayBuffer>\n\n /**\n * Creates a multihash digest.\n */\n constructor (code: Code, size: Size, digest: Uint8Array, bytes: Uint8Array) {\n this.code = code\n this.size = size\n this.digest = toArrayBufferBackedArray(digest)\n this.bytes = toArrayBufferBackedArray(bytes)\n }\n}\n\n/**\n * Used to check that the passed multihash has the passed code\n */\nexport function hasCode <T extends number> (digest: MultihashDigest, code: T): digest is MultihashDigest<T> {\n return digest.code === code\n}\n", "import { from } from './hasher.ts'\n\nfunction sha (name: AlgorithmIdentifier): (data: Uint8Array<ArrayBuffer>) => Promise<Uint8Array<ArrayBuffer>> {\n return async data => new Uint8Array(await crypto.subtle.digest(name, data))\n}\n\nexport const sha256 = from({\n name: 'sha2-256',\n code: 0x12,\n encode: sha('SHA-256')\n})\n\nexport const sha512 = from({\n name: 'sha2-512',\n code: 0x13,\n encode: sha('SHA-512')\n})\n", "import * as Digest from './digest.ts'\nimport type { MultihashHasher } from './interface.ts'\n\ntype Await<T> = Promise<T> | T\n\nconst DEFAULT_MIN_DIGEST_LENGTH = 20\n\nexport interface HasherInit <Name extends string, Code extends number> {\n name: Name\n code: Code\n encode(input: Uint8Array): Await<Uint8Array<ArrayBuffer>>\n\n /**\n * The minimum length a hash is allowed to be truncated to in bytes\n *\n * @default 20\n */\n minDigestLength?: number\n\n /**\n * The maximum length a hash is allowed to be truncated to in bytes. If not\n * specified it will be inferred from the length of the digest.\n */\n maxDigestLength?: number\n}\n\nexport function from <Name extends string, Code extends number> ({ name, code, encode, minDigestLength, maxDigestLength }: HasherInit<Name, Code>): MultihashHasher<Code> {\n return new Hasher(name, code, encode, minDigestLength, maxDigestLength)\n}\n\nexport interface DigestOptions {\n /**\n * Truncate the returned digest to this number of bytes.\n *\n * This may cause the digest method to throw/reject if the passed value is\n * greater than the digest length or below a threshold under which the risk of\n * hash collisions is significant.\n *\n * The actual value of this threshold can depend on the hashing algorithm in\n * use.\n */\n truncate?: number\n}\n\n/**\n * Hasher represents a hashing algorithm implementation that produces as\n * `MultihashDigest`.\n */\nexport class Hasher<Name extends string, Code extends number> implements MultihashHasher<Code> {\n readonly name: Name\n readonly code: Code\n readonly encode: (input: Uint8Array) => Await<Uint8Array<ArrayBuffer>>\n readonly minDigestLength: number\n readonly maxDigestLength?: number\n\n constructor (name: Name, code: Code, encode: (input: Uint8Array) => Await<Uint8Array<ArrayBuffer>>, minDigestLength?: number, maxDigestLength?: number) {\n this.name = name\n this.code = code\n this.encode = encode\n this.minDigestLength = minDigestLength ?? DEFAULT_MIN_DIGEST_LENGTH\n this.maxDigestLength = maxDigestLength\n }\n\n digest (input: Uint8Array, options?: DigestOptions): Await<Digest.Digest<Code, number>> {\n if (options?.truncate != null) {\n if (options.truncate < this.minDigestLength) {\n throw new Error(`Invalid truncate option, must be greater than or equal to ${this.minDigestLength}`)\n }\n\n if (this.maxDigestLength != null && options.truncate > this.maxDigestLength) {\n throw new Error(`Invalid truncate option, must be less than or equal to ${this.maxDigestLength}`)\n }\n }\n\n if (input instanceof Uint8Array) {\n const result = this.encode(input)\n\n if (result instanceof Uint8Array) {\n return createDigest(result, this.code, options?.truncate)\n }\n\n return result.then(digest => createDigest(digest, this.code, options?.truncate))\n } else {\n throw Error('Unknown type, must be binary type')\n /* c8 ignore next 1 */\n }\n }\n}\n\n/**\n * Create a Digest from the passed uint8array and code, optionally truncating it\n * first.\n */\nfunction createDigest <Code extends number> (digest: Uint8Array, code: Code, truncate?: number): Digest.Digest<Code, number> {\n if (truncate != null && truncate !== digest.byteLength) {\n if (truncate > digest.byteLength) {\n throw new Error(`Invalid truncate option, must be less than or equal to ${digest.byteLength}`)\n }\n\n digest = digest.subarray(0, truncate)\n }\n\n return Digest.create(code, digest)\n}\n", "import { base32 } from './bases/base32.ts'\nimport { base36 } from './bases/base36.ts'\nimport { base58btc } from './bases/base58.ts'\nimport { coerce, toArrayBufferBackedArray } from './bytes.ts'\nimport * as Digest from './hashes/digest.ts'\nimport * as varint from './varint.ts'\nimport type * as API from './link/interface.ts'\n\n// This way TS will also expose all the types from module\nexport * from './link/interface.ts'\n\nexport function format <T extends API.Link<unknown, number, number, API.Version>, Prefix extends string> (link: T, base?: API.MultibaseEncoder<Prefix>): API.ToString<T, Prefix> {\n const { bytes, version } = link\n switch (version) {\n case 0:\n return toStringV0(\n bytes,\n baseCache(link),\n base as API.MultibaseEncoder<'z'> ?? base58btc.encoder\n )\n default:\n return toStringV1(\n bytes,\n baseCache(link),\n (base ?? base32.encoder) as API.MultibaseEncoder<Prefix>\n )\n }\n}\n\nexport function toJSON <Link extends API.UnknownLink> (link: Link): API.LinkJSON<Link> {\n return {\n '/': format(link)\n }\n}\n\nexport function fromJSON <Link extends API.UnknownLink> (json: API.LinkJSON<Link>): CID<unknown, number, number, API.Version> {\n return CID.parse(json['/'])\n}\n\nconst cache = new WeakMap<API.UnknownLink, Map<string, string>>()\n\nfunction baseCache (cid: API.UnknownLink): Map<string, string> {\n const baseCache = cache.get(cid)\n if (baseCache == null) {\n const baseCache = new Map()\n cache.set(cid, baseCache)\n return baseCache\n }\n return baseCache\n}\n\nexport class CID<Data = unknown, Format extends number = number, Alg extends number = number, Version extends API.Version = API.Version> implements API.Link<Data, Format, Alg, Version> {\n readonly code: Format\n readonly version: Version\n readonly multihash: API.MultihashDigest<Alg>\n readonly bytes: Uint8Array<ArrayBuffer>\n readonly '/': Uint8Array<ArrayBuffer>\n\n /**\n * @param version - Version of the CID\n * @param code - Code of the codec content is encoded in, see https://github.com/multiformats/multicodec/blob/master/table.csv\n * @param multihash - (Multi)hash of the of the content.\n */\n constructor (version: Version, code: Format, multihash: API.MultihashDigest<Alg>, bytes: Uint8Array) {\n this.code = code\n this.version = version\n this.multihash = multihash\n this.bytes = toArrayBufferBackedArray(bytes)\n\n // flag to serializers that this is a CID and\n // should be treated specially\n this['/'] = this.bytes\n }\n\n /**\n * Signalling `cid.asCID === cid` has been replaced with `cid['/'] === cid.bytes`\n * please either use `CID.asCID(cid)` or switch to new signalling mechanism\n *\n * @deprecated\n */\n get asCID (): this {\n return this\n }\n\n // ArrayBufferView\n get byteOffset (): number {\n return this.bytes.byteOffset\n }\n\n // ArrayBufferView\n get byteLength (): number {\n return this.bytes.byteLength\n }\n\n toV0 (): CID<Data, API.DAG_PB, API.SHA_256, 0> {\n switch (this.version) {\n case 0: {\n return this as CID<Data, API.DAG_PB, API.SHA_256, 0>\n }\n case 1: {\n const { code, multihash } = this\n\n if (code !== DAG_PB_CODE) {\n throw new Error('Cannot convert a non dag-pb CID to CIDv0')\n }\n\n // sha2-256\n if (multihash.code !== SHA_256_CODE) {\n throw new Error('Cannot convert non sha2-256 multihash CID to CIDv0')\n }\n\n return (\n CID.createV0(\n multihash as API.MultihashDigest<API.SHA_256>\n )\n )\n }\n default: {\n throw Error(\n `Can not convert CID version ${this.version} to version 0. This is a bug please report`\n )\n }\n }\n }\n\n toV1 (): CID<Data, Format, Alg, 1> {\n switch (this.version) {\n case 0: {\n const { code, digest } = this.multihash\n const multihash = Digest.create(code, digest)\n return (\n CID.createV1(this.code, multihash)\n )\n }\n case 1: {\n return this as CID<Data, Format, Alg, 1>\n }\n default: {\n throw Error(\n `Can not convert CID version ${this.version} to version 1. This is a bug please report`\n )\n }\n }\n }\n\n equals (other: unknown): other is CID<Data, Format, Alg, Version> {\n return CID.equals(this, other)\n }\n\n static equals <Data, Format extends number, Alg extends number, Version extends API.Version>(self: API.Link<Data, Format, Alg, Version>, other: unknown): other is CID {\n const unknown = other as { code?: unknown, version?: unknown, multihash?: unknown }\n return (\n unknown != null &&\n self.code === unknown.code &&\n self.version === unknown.version &&\n Digest.equals(self.multihash, unknown.multihash)\n )\n }\n\n toString (base?: API.MultibaseEncoder<string>): string {\n return format(this, base)\n }\n\n toJSON (): API.LinkJSON<this> {\n return { '/': format(this) }\n }\n\n link (): this {\n return this\n }\n\n readonly [Symbol.toStringTag] = 'CID';\n\n // Legacy\n\n [Symbol.for('nodejs.util.inspect.custom')] (): string {\n return `CID(${this.toString()})`\n }\n\n /**\n * Takes any input `value` and returns a `CID` instance if it was\n * a `CID` otherwise returns `null`. If `value` is instanceof `CID`\n * it will return value back. If `value` is not instance of this CID\n * class, but is compatible CID it will return new instance of this\n * `CID` class. Otherwise returns null.\n *\n * This allows two different incompatible versions of CID library to\n * co-exist and interop as long as binary interface is compatible.\n */\n static asCID <Data, Format extends number, Alg extends number, Version extends API.Version, U>(input: API.Link<Data, Format, Alg, Version> | U): CID<Data, Format, Alg, Version> | null {\n if (input == null) {\n return null\n }\n\n const value = input as any\n if (value instanceof CID) {\n // If value is instance of CID then we're all set.\n return value\n } else if ((value['/'] != null && value['/'] === value.bytes) || value.asCID === value) {\n // If value isn't instance of this CID class but `this.asCID === this` or\n // `value['/'] === value.bytes` is true it is CID instance coming from a\n // different implementation (diff version or duplicate). In that case we\n // rebase it to this `CID` implementation so caller is guaranteed to get\n // instance with expected API.\n const { version, code, multihash, bytes } = value\n return new CID(\n version,\n code,\n multihash as API.MultihashDigest<Alg>,\n bytes ?? encodeCID(version, code, multihash.bytes)\n )\n } else if (value[cidSymbol] === true) {\n // If value is a CID from older implementation that used to be tagged via\n // symbol we still rebase it to the this `CID` implementation by\n // delegating that to a constructor.\n const { version, multihash, code } = value\n const digest = Digest.decode(multihash) as API.MultihashDigest<Alg>\n return CID.create(version, code, digest)\n } else {\n // Otherwise value is not a CID (or an incompatible version of it) in\n // which case we return `null`.\n return null\n }\n }\n\n /**\n * @param version - Version of the CID\n * @param code - Code of the codec content is encoded in, see https://github.com/multiformats/multicodec/blob/master/table.csv\n * @param digest - (Multi)hash of the of the content.\n */\n static create <Data, Format extends number, Alg extends number, Version extends API.Version>(version: Version, code: Format, digest: API.MultihashDigest<Alg>): CID<Data, Format, Alg, Version> {\n if (typeof code !== 'number') {\n throw new Error('String codecs are no longer supported')\n }\n\n if (!(digest.bytes instanceof Uint8Array)) {\n throw new Error('Invalid digest')\n }\n\n switch (version) {\n case 0: {\n if (code !== DAG_PB_CODE) {\n throw new Error(\n `Version 0 CID must use dag-pb (code: ${DAG_PB_CODE}) block encoding`\n )\n } else {\n return new CID(version, code, digest, digest.bytes)\n }\n }\n case 1: {\n const bytes = encodeCID(version, code, digest.bytes)\n return new CID(version, code, digest, bytes)\n }\n default: {\n throw new Error('Invalid version')\n }\n }\n }\n\n /**\n * Simplified version of `create` for CIDv0.\n */\n static createV0 <T = unknown>(digest: API.MultihashDigest<typeof SHA_256_CODE>): CID<T, typeof DAG_PB_CODE, typeof SHA_256_CODE, 0> {\n return CID.create(0, DAG_PB_CODE, digest)\n }\n\n /**\n * Simplified version of `create` for CIDv1.\n *\n * @param code - Content encoding format code.\n * @param digest - Multihash of the content.\n */\n static createV1 <Data, Code extends number, Alg extends number>(code: Code, digest: API.MultihashDigest<Alg>): CID<Data, Code, Alg, 1> {\n return CID.create(1, code, digest)\n }\n\n /**\n * Decoded a CID from its binary representation. The byte array must contain\n * only the CID with no additional bytes.\n *\n * An error will be thrown if the bytes provided do not contain a valid\n * binary representation of a CID.\n */\n static decode <Data, Code extends number, Alg extends number, Version extends API.Version>(bytes: API.ByteView<API.Link<Data, Code, Alg, Version>>): CID<Data, Code, Alg, Version> {\n const [cid, remainder] = CID.decodeFirst(bytes)\n if (remainder.length !== 0) {\n throw new Error('Incorrect length')\n }\n return cid\n }\n\n /**\n * Decoded a CID from its binary representation at the beginning of a byte\n * array.\n *\n * Returns an array with the first element containing the CID and the second\n * element containing the remainder of the original byte array. The remainder\n * will be a zero-length byte array if the provided bytes only contained a\n * binary CID representation.\n */\n static decodeFirst <T, C extends number, A extends number, V extends API.Version>(bytes: API.ByteView<API.Link<T, C, A, V>>): [CID<T, C, A, V>, Uint8Array] {\n const specs = CID.inspectBytes(bytes)\n const prefixSize = specs.size - specs.multihashSize\n const multihashBytes = coerce(\n bytes.subarray(prefixSize, prefixSize + specs.multihashSize)\n )\n if (multihashBytes.byteLength !== specs.multihashSize) {\n throw new Error('Incorrect length')\n }\n const digestBytes = multihashBytes.subarray(\n specs.multihashSize - specs.digestSize\n )\n const digest = new Digest.Digest(\n specs.multihashCode,\n specs.digestSize,\n digestBytes,\n multihashBytes\n )\n const cid =\n specs.version === 0\n ? CID.createV0(digest as API.MultihashDigest<API.SHA_256>)\n : CID.createV1(specs.codec, digest)\n return [cid as CID<T, C, A, V>, bytes.subarray(specs.size)]\n }\n\n /**\n * Inspect the initial bytes of a CID to determine its properties.\n *\n * Involves decoding up to 4 varints. Typically this will require only 4 to 6\n * bytes but for larger multicodec code values and larger multihash digest\n * lengths these varints can be quite large. It is recommended that at least\n * 10 bytes be made available in the `initialBytes` argument for a complete\n * inspection.\n */\n static inspectBytes <T, C extends number, A extends number, V extends API.Version>(initialBytes: API.ByteView<API.Link<T, C, A, V>>): { version: V, codec: C, multihashCode: A, digestSize: number, multihashSize: number, size: number } {\n let offset = 0\n const next = (): number => {\n const [i, length] = varint.decode(initialBytes.subarray(offset))\n offset += length\n return i\n }\n\n let version = next() as V\n let codec = DAG_PB_CODE as C\n if (version as number === 18) {\n // CIDv0\n version = 0 as V\n offset = 0\n } else {\n codec = next() as C\n }\n\n if (version !== 0 && version !== 1) {\n throw new RangeError(`Invalid CID version ${version}`)\n }\n\n const prefixSize = offset\n const multihashCode = next() as A // multihash code\n const digestSize = next() // multihash length\n const size = offset + digestSize\n const multihashSize = size - prefixSize\n\n return { version, codec, multihashCode, digestSize, multihashSize, size }\n }\n\n /**\n * Takes cid in a string representation and creates an instance. If `base`\n * decoder is not provided will use a default from the configuration. It will\n * throw an error if encoding of the CID is not compatible with supplied (or\n * a default decoder).\n */\n static parse <Prefix extends string, Data, Code extends number, Alg extends number, Version extends API.Version>(source: API.ToString<API.Link<Data, Code, Alg, Version>, Prefix>, base?: API.MultibaseDecoder<Prefix>): CID<Data, Code, Alg, Version> {\n const [prefix, bytes] = parseCIDtoBytes(source, base)\n\n const cid = CID.decode(bytes)\n\n if (cid.version === 0 && source[0] !== 'Q') {\n throw Error('Version 0 CID string must not include multibase prefix')\n }\n\n // Cache string representation to avoid computing it on `this.toString()`\n baseCache(cid).set(prefix, source)\n\n return cid\n }\n}\n\nfunction parseCIDtoBytes <Prefix extends string, Data, Code extends number, Alg extends number, Version extends API.Version> (source: API.ToString<API.Link<Data, Code, Alg, Version>, Prefix>, base?: API.MultibaseDecoder<Prefix>): [Prefix, API.ByteView<API.Link<Data, Code, Alg, Version>>] {\n switch (source[0]) {\n // CIDv0 is parsed differently\n case 'Q': {\n const decoder = base ?? base58btc\n return [\n base58btc.prefix as Prefix,\n decoder.decode(`${base58btc.prefix}${source}`)\n ]\n }\n case base58btc.prefix: {\n const decoder = base ?? base58btc\n return [base58btc.prefix as Prefix, decoder.decode(source)]\n }\n case base32.prefix: {\n const decoder = base ?? base32\n return [base32.prefix as Prefix, decoder.decode(source)]\n }\n case base36.prefix: {\n const decoder = base ?? base36\n return [base36.prefix as Prefix, decoder.decode(source)]\n }\n default: {\n if (base == null) {\n throw Error(\n 'To parse non base32, base36 or base58btc encoded CID multibase decoder must be provided'\n )\n }\n return [source[0] as Prefix, base.decode(source)]\n }\n }\n}\n\nfunction toStringV0 (bytes: Uint8Array, cache: Map<string, string>, base: API.MultibaseEncoder<'z'>): string {\n const { prefix } = base\n if (prefix !== base58btc.prefix) {\n throw Error(`Cannot string encode V0 in ${base.name} encoding`)\n }\n\n const cid = cache.get(prefix)\n if (cid == null) {\n const cid = base.encode(bytes).slice(1)\n cache.set(prefix, cid)\n return cid\n } else {\n return cid\n }\n}\n\nfunction toStringV1 <Prefix extends string> (bytes: Uint8Array, cache: Map<string, string>, base: API.MultibaseEncoder<Prefix>): string {\n const { prefix } = base\n const cid = cache.get(prefix)\n if (cid == null) {\n const cid = base.encode(bytes)\n cache.set(prefix, cid)\n return cid\n } else {\n return cid\n }\n}\n\nconst DAG_PB_CODE = 0x70\nconst SHA_256_CODE = 0x12\n\nfunction encodeCID (version: API.Version, code: number, multihash: Uint8Array): Uint8Array {\n const codeOffset = varint.encodingLength(version)\n const hashOffset = codeOffset + varint.encodingLength(code)\n const bytes = new Uint8Array(hashOffset + multihash.byteLength)\n varint.encodeTo(version, bytes, 0)\n varint.encodeTo(code, bytes, codeOffset)\n bytes.set(multihash, hashOffset)\n return bytes\n}\n\nconst cidSymbol = Symbol.for('@ipld/js-cid/CID')\n", "import * as base10 from './bases/base10.ts'\nimport * as base16 from './bases/base16.ts'\nimport * as base2 from './bases/base2.ts'\nimport * as base256emoji from './bases/base256emoji.ts'\nimport * as base32 from './bases/base32.ts'\nimport * as base36 from './bases/base36.ts'\nimport * as base58 from './bases/base58.ts'\nimport * as base64 from './bases/base64.ts'\nimport * as base8 from './bases/base8.ts'\nimport * as identityBase from './bases/identity.ts'\nimport * as json from './codecs/json.ts'\nimport * as raw from './codecs/raw.ts'\nimport * as identity from './hashes/identity.ts'\nimport * as sha2 from './hashes/sha2.ts'\nimport { CID, hasher, digest, varint, bytes } from './index.ts'\n\nexport const bases = { ...identityBase, ...base2, ...base8, ...base10, ...base16, ...base32, ...base36, ...base58, ...base64, ...base256emoji }\nexport const hashes = { ...sha2, ...identity }\nexport const codecs = { raw, json }\n\nexport { CID, hasher, digest, varint, bytes }\n", "import { bases } from 'multiformats/basics'\nimport type { MultibaseCodec } from 'multiformats'\nimport { allocUnsafe } from '#alloc'\n\nfunction createCodec (name: string, prefix: string, encode: (buf: Uint8Array) => string, decode: (str: string) => Uint8Array<ArrayBuffer>): MultibaseCodec<any> {\n return {\n name,\n prefix,\n encoder: {\n name,\n prefix,\n encode\n },\n decoder: {\n decode\n }\n }\n}\n\nconst string = createCodec('utf8', 'u', (buf) => {\n const decoder = new TextDecoder('utf8')\n return 'u' + decoder.decode(buf)\n}, (str) => {\n const encoder = new TextEncoder()\n return encoder.encode(str.substring(1))\n})\n\nconst ascii = createCodec('ascii', 'a', (buf) => {\n let string = 'a'\n\n for (let i = 0; i < buf.length; i++) {\n string += String.fromCharCode(buf[i])\n }\n return string\n}, (str) => {\n str = str.substring(1)\n const buf = allocUnsafe(str.length)\n\n for (let i = 0; i < str.length; i++) {\n buf[i] = str.charCodeAt(i)\n }\n\n return buf\n})\n\nexport type SupportedEncodings = 'utf8' | 'utf-8' | 'hex' | 'latin1' | 'ascii' | 'binary' | keyof typeof bases\n\nconst BASES: Record<SupportedEncodings, MultibaseCodec<any>> = {\n utf8: string,\n 'utf-8': string,\n hex: bases.base16,\n latin1: ascii,\n ascii,\n binary: ascii,\n\n ...bases\n}\n\nexport default BASES\n", "import bases from './util/bases.ts'\nimport type { SupportedEncodings } from './util/bases.ts'\n\nexport type { SupportedEncodings }\n\n/**\n * Create a `Uint8Array` from the passed string\n *\n * Supports `utf8`, `utf-8`, `hex`, and any encoding supported by the multiformats module.\n *\n * Also `ascii` which is similar to node's 'binary' encoding.\n */\nexport function fromString (string: string, encoding: SupportedEncodings = 'utf8'): Uint8Array<ArrayBuffer> {\n const base = bases[encoding]\n\n if (base == null) {\n throw new Error(`Unsupported encoding \"${encoding}\"`)\n }\n\n // add multibase prefix\n return base.decoder.decode(`${base.prefix}${string}`)\n}\n", "import bases from './util/bases.ts'\nimport type { SupportedEncodings } from './util/bases.ts'\n\nexport type { SupportedEncodings }\n\n/**\n * Turns a `Uint8Array` into a string.\n *\n * Supports `utf8`, `utf-8` and any encoding supported by the multibase module.\n *\n * Also `ascii` which is similar to node's 'binary' encoding.\n */\nexport function toString (array: Uint8Array, encoding: SupportedEncodings = 'utf8'): string {\n const base = bases[encoding]\n\n if (base == null) {\n throw new Error(`Unsupported encoding \"${encoding}\"`)\n }\n\n // strip multibase prefix\n return base.encoder.encode(array).substring(1)\n}\n", "import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string'\nimport { toString as uint8ArrayToString } from 'uint8arrays/to-string'\nimport type { SupportedEncodings } from 'uint8arrays/to-string'\n\nconst pathSepS = '/'\nconst pathSepB = new TextEncoder().encode(pathSepS)\nconst pathSep = pathSepB[0]\n\n/**\n * A Key represents the unique identifier of an object.\n * Our Key scheme is inspired by file systems and Google App Engine key model.\n * Keys are meant to be unique across a system. Keys are hierarchical,\n * incorporating more and more specific namespaces. Thus keys can be deemed\n * 'children' or 'ancestors' of other keys:\n * - `new Key('/Comedy')`\n * - `new Key('/Comedy/MontyPython')`\n * Also, every namespace can be parametrized to embed relevant object\n * information. For example, the Key `name` (most specific namespace) could\n * include the object type:\n * - `new Key('/Comedy/MontyPython/Actor:JohnCleese')`\n * - `new Key('/Comedy/MontyPython/Sketch:CheeseShop')`\n * - `new Key('/Comedy/MontyPython/Sketch:CheeseShop/Character:Mousebender')`\n *\n */\nexport class Key {\n private _buf: Uint8Array\n\n /**\n * @param {string | Uint8Array} s\n * @param {boolean} [clean]\n */\n constructor (s: string | Uint8Array, clean?: boolean) {\n if (typeof s === 'string') {\n this._buf = uint8ArrayFromString(s)\n } else if (s instanceof Uint8Array) {\n this._buf = s\n } else {\n throw new Error('Invalid key, should be String of Uint8Array')\n }\n\n if (clean == null) {\n clean = true\n }\n\n if (clean) {\n this.clean()\n }\n\n if (this._buf.byteLength === 0 || this._buf[0] !== pathSep) {\n throw new Error('Invalid key')\n }\n }\n\n /**\n * Convert to the string representation\n *\n * @param {import('uint8arrays/to-string').SupportedEncodings} [encoding] - The encoding to use.\n * @returns {string}\n */\n toString (encoding: SupportedEncodings = 'utf8'): string {\n return uint8ArrayToString(this._buf, encoding)\n }\n\n /**\n * Return the Uint8Array representation of the key\n *\n * @returns {Uint8Array}\n */\n uint8Array (): Uint8Array {\n return this._buf\n }\n\n /**\n * Return string representation of the key\n *\n * @returns {string}\n */\n get [Symbol.toStringTag] (): string {\n return `Key(${this.toString()})`\n }\n\n /**\n * Constructs a key out of a namespace array.\n *\n * @param {Array<string>} list - The array of namespaces\n * @returns {Key}\n *\n * @example\n * ```js\n * Key.withNamespaces(['one', 'two'])\n * // => Key('/one/two')\n * ```\n */\n static withNamespaces (list: string[]): Key {\n return new Key(list.join(pathSepS))\n }\n\n /**\n * Returns a randomly (uuid) generated key.\n *\n * @returns {Key}\n *\n * @example\n * ```js\n * Key.random()\n * // => Key('/344502982398')\n * ```\n */\n static random (): Key {\n return new Key(Math.random().toString().substring(2))\n }\n\n /**\n * @param {*} other\n */\n static asKey (other: any): Key | null {\n if (other instanceof Uint8Array || typeof other === 'string') {\n // we can create a key from this\n return new Key(other)\n }\n\n if (typeof other.uint8Array === 'function') {\n // this is an older version or may have crossed the esm/cjs boundary\n return new Key(other.uint8Array())\n }\n\n return null\n }\n\n /**\n * Cleanup the current key\n *\n * @returns {void}\n */\n clean (): void {\n if (this._buf == null || this._buf.byteLength === 0) {\n this._buf = pathSepB\n }\n\n if (this._buf[0] !== pathSep) {\n const bytes = new Uint8Array(this._buf.byteLength + 1)\n bytes.fill(pathSep, 0, 1)\n bytes.set(this._buf, 1)\n this._buf = bytes\n }\n\n // normalize does not remove trailing slashes\n while (this._buf.byteLength > 1 && this._buf[this._buf.byteLength - 1] === pathSep) {\n this._buf = this._buf.subarray(0, -1)\n }\n }\n\n /**\n * Check if the given key is sorted lower than ourself.\n *\n * @param {Key} key - The other Key to check against\n * @returns {boolean}\n */\n less (key: Key): boolean {\n const list1 = this.list()\n const list2 = key.list()\n\n for (let i = 0; i < list1.length; i++) {\n if (list2.length < i + 1) {\n return false\n }\n\n const c1 = list1[i]\n const c2 = list2[i]\n\n if (c1 < c2) {\n return true\n } else if (c1 > c2) {\n return false\n }\n }\n\n return list1.length < list2.length\n }\n\n /**\n * Returns the key with all parts in reversed order.\n *\n * @returns {Key}\n *\n * @example\n * ```js\n * new Key('/Comedy/MontyPython/Actor:JohnCleese').reverse()\n * // => Key('/Actor:JohnCleese/MontyPython/Comedy')\n * ```\n */\n reverse (): Key {\n return Key.withNamespaces(this.list().slice().reverse())\n }\n\n /**\n * Returns the `namespaces` making up this Key.\n *\n * @returns {Array<string>}\n */\n namespaces (): string[] {\n return this.list()\n }\n\n /**\n * Returns the \"base\" namespace of this key.\n *\n * @returns {string}\n *\n * @example\n * ```js\n * new Key('/Comedy/MontyPython/Actor:JohnCleese').baseNamespace()\n * // => 'Actor:JohnCleese'\n * ```\n */\n baseNamespace (): string {\n const ns = this.namespaces()\n return ns[ns.length - 1]\n }\n\n /**\n * Returns the `list` representation of this key.\n *\n * @returns {Array<string>}\n *\n * @example\n * ```js\n * new Key('/Comedy/MontyPython/Actor:JohnCleese').list()\n * // => ['Comedy', 'MontyPythong', 'Actor:JohnCleese']\n * ```\n */\n list (): string[] {\n return this.toString().split(pathSepS).slice(1)\n }\n\n /**\n * Returns the \"type\" of this key (value of last namespace).\n *\n * @returns {string}\n *\n * @example\n * ```js\n * new Key('/Comedy/MontyPython/Actor:JohnCleese').type()\n * // => 'Actor'\n * ```\n */\n type (): string {\n return namespaceType(this.baseNamespace())\n }\n\n /**\n * Returns the \"name\" of this key (field of last namespace).\n *\n * @returns {string}\n *\n * @example\n * ```js\n * new Key('/Comedy/MontyPython/Actor:JohnCleese').name()\n * // => 'JohnCleese'\n * ```\n */\n name (): string {\n return namespaceValue(this.baseNamespace())\n }\n\n /**\n * Returns an \"instance\" of this type key (appends value to namespace).\n *\n * @param {string} s - The string to append.\n * @returns {Key}\n *\n * @example\n * ```js\n * new Key('/Comedy/MontyPython/Actor').instance('JohnClesse')\n * // => Key('/Comedy/MontyPython/Actor:JohnCleese')\n * ```\n */\n instance (s: string): Key {\n return new Key(this.toString() + ':' + s)\n }\n\n /**\n * Returns the \"path\" of this key (parent + type).\n *\n * @returns {Key}\n *\n * @example\n * ```js\n * new Key('/Comedy/MontyPython/Actor:JohnCleese').path()\n * // => Key('/Comedy/MontyPython/Actor')\n * ```\n */\n path (): Key {\n let p = this.parent().toString()\n if (!p.endsWith(pathSepS)) {\n p += pathSepS\n }\n p += this.type()\n return new Key(p)\n }\n\n /**\n * Returns the `parent` Key of this Key.\n *\n * @returns {Key}\n *\n * @example\n * ```js\n * new Key(\"/Comedy/MontyPython/Actor:JohnCleese\").parent()\n * // => Key(\"/Comedy/MontyPython\")\n * ```\n */\n parent (): Key {\n const list = this.list()\n if (list.length === 1) {\n return new Key(pathSepS)\n }\n\n return new Key(list.slice(0, -1).join(pathSepS))\n }\n\n /**\n * Returns the `child` Key of this Key.\n *\n * @param {Key} key - The child Key to add\n * @returns {Key}\n *\n * @example\n * ```js\n * new Key('/Comedy/MontyPython').child(new Key('Actor:JohnCleese'))\n * // => Key('/Comedy/MontyPython/Actor:JohnCleese')\n * ```\n */\n child (key: Key): Key {\n if (this.toString() === pathSepS) {\n return key\n } else if (key.toString() === pathSepS) {\n return this\n }\n\n return new Key(this.toString() + key.toString(), false)\n }\n\n /**\n * Returns whether this key is a prefix of `other`\n *\n * @param {Key} other - The other key to test against\n * @returns {boolean}\n *\n * @example\n * ```js\n * new Key('/Comedy').isAncestorOf('/Comedy/MontyPython')\n * // => true\n * ```\n */\n isAncestorOf (other: Key): boolean {\n if (other.toString() === this.toString()) {\n return false\n }\n\n return other.toString().startsWith(this.toString())\n }\n\n /**\n * Returns whether this key is a contains another as prefix.\n *\n * @param {Key} other - The other Key to test against\n * @returns {boolean}\n *\n * @example\n * ```js\n * new Key('/Comedy/MontyPython').isDecendantOf('/Comedy')\n * // => true\n * ```\n */\n isDecendantOf (other: Key): boolean {\n if (other.toString() === this.toString()) {\n return false\n }\n\n return this.toString().startsWith(other.toString())\n }\n\n /**\n * Checks if this key has only one namespace.\n *\n * @returns {boolean}\n */\n isTopLevel (): boolean {\n return this.list().length === 1\n }\n\n /**\n * Concats one or more Keys into one new Key.\n *\n * @param {Array<Key>} keys - The array of keys to concatenate\n * @returns {Key}\n */\n concat (...keys: Key[]): Key {\n return Key.withNamespaces([...this.namespaces(), ...flatten(keys.map(key => key.namespaces()))])\n }\n}\n\n/**\n * The first component of a namespace. `foo` in `foo:bar`\n *\n * @param {string} ns\n * @returns {string}\n */\nfunction namespaceType (ns: string): string {\n const parts = ns.split(':')\n if (parts.length < 2) {\n return ''\n }\n return parts.slice(0, -1).join(':')\n}\n\n/**\n * The last component of a namespace, `baz` in `foo:bar:baz`.\n *\n * @param {string} ns\n * @returns {string}\n */\nfunction namespaceValue (ns: string): string {\n const parts = ns.split(':')\n return parts[parts.length - 1]\n}\n\n/**\n * Flatten array of arrays (only one level)\n *\n * @template T\n * @param {Array<any>} arr\n * @returns {T[]}\n */\nfunction flatten (arr: any[]): string[] {\n return ([]).concat(...arr)\n}\n", "function isByteArrayWithArrayBuffer (b?: Uint8Array): b is Uint8Array<ArrayBuffer> {\n return b?.buffer instanceof ArrayBuffer\n}\n\n/**\n * To guarantee Uint8Array semantics, convert nodejs Buffers\n * into vanilla Uint8Arrays\n */\nexport function asUint8Array (buf: Uint8Array): Uint8Array<ArrayBuffer> {\n if (isByteArrayWithArrayBuffer(buf)) {\n return buf\n }\n\n const b = buf.slice()\n\n return new Uint8Array(b.buffer, 0, b.byteLength)\n}\n", "import { allocUnsafe } from '#alloc'\nimport { asUint8Array } from '#util/as-uint8array'\n\n/**\n * Returns a new Uint8Array created by concatenating the passed Uint8Arrays\n */\nexport function concat (arrays: Uint8Array[], length?: number): Uint8Array<ArrayBuffer> {\n if (length == null) {\n length = arrays.reduce((acc, curr) => acc + curr.length, 0)\n }\n\n const output = allocUnsafe(length)\n let offset = 0\n\n for (const arr of arrays) {\n output.set(arr, offset)\n offset += arr.length\n }\n\n return asUint8Array(output)\n}\n", "/**\n * Returns true if the two passed Uint8Arrays have the same content\n */\nexport function equals (a: Uint8Array, b: Uint8Array): boolean {\n if (a === b) {\n return true\n }\n\n if (a.byteLength !== b.byteLength) {\n return false\n }\n\n for (let i = 0; i < a.byteLength; i++) {\n if (a[i] !== b[i]) {\n return false\n }\n }\n\n return true\n}\n", "/**\n * @packageDocumentation\n *\n * A class that lets you do operations over a list of Uint8Arrays without\n * copying them.\n *\n * ```js\n * import { Uint8ArrayList } from 'uint8arraylist'\n *\n * const list = new Uint8ArrayList()\n * list.append(Uint8Array.from([0, 1, 2]))\n * list.append(Uint8Array.from([3, 4, 5]))\n *\n * list.subarray()\n * // -> Uint8Array([0, 1, 2, 3, 4, 5])\n *\n * list.consume(3)\n * list.subarray()\n * // -> Uint8Array([3, 4, 5])\n *\n * // you can also iterate over the list\n * for (const buf of list) {\n * // ..do something with `buf`\n * }\n *\n * list.subarray(0, 1)\n * // -> Uint8Array([0])\n * ```\n *\n * ## Converting Uint8ArrayLists to Uint8Arrays\n *\n * There are two ways to turn a `Uint8ArrayList` into a `Uint8Array` - `.slice` and `.subarray` and one way to turn a `Uint8ArrayList` into a `Uint8ArrayList` with different contents - `.sublist`.\n *\n * ### slice\n *\n * Slice follows the same semantics as [Uint8Array.slice](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/slice) in that it creates a new `Uint8Array` and copies bytes into it using an optional offset & length.\n *\n * ```js\n * const list = new Uint8ArrayList()\n * list.append(Uint8Array.from([0, 1, 2]))\n * list.append(Uint8Array.from([3, 4, 5]))\n *\n * list.slice(0, 1)\n * // -> Uint8Array([0])\n * ```\n *\n * ### subarray\n *\n * Subarray attempts to follow the same semantics as [Uint8Array.subarray](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/subarray) with one important different - this is a no-copy operation, unless the requested bytes span two internal buffers in which case it is a copy operation.\n *\n * ```js\n * const list = new Uint8ArrayList()\n * list.append(Uint8Array.from([0, 1, 2]))\n * list.append(Uint8Array.from([3, 4, 5]))\n *\n * list.subarray(0, 1)\n * // -> Uint8Array([0]) - no-copy\n *\n * list.subarray(2, 5)\n * // -> Uint8Array([2, 3, 4]) - copy\n * ```\n *\n * ### sublist\n *\n * Sublist creates and returns a new `Uint8ArrayList` that shares the underlying buffers with the original so is always a no-copy operation.\n *\n * ```js\n * const list = new Uint8ArrayList()\n * list.append(Uint8Array.from([0, 1, 2]))\n * list.append(Uint8Array.from([3, 4, 5]))\n *\n * list.sublist(0, 1)\n * // -> Uint8ArrayList([0]) - no-copy\n *\n * list.sublist(2, 5)\n * // -> Uint8ArrayList([2], [3, 4]) - no-copy\n * ```\n *\n * ## Inspiration\n *\n * Borrows liberally from [bl](https://www.npmjs.com/package/bl) but only uses native JS types.\n */\nimport { allocUnsafe, alloc } from 'uint8arrays/alloc'\nimport { concat } from 'uint8arrays/concat'\nimport { equals } from 'uint8arrays/equals'\n\nconst symbol = Symbol.for('@achingbrain/uint8arraylist')\n\nexport type Appendable<T extends ArrayBufferLike = ArrayBuffer> = Uint8ArrayList<T> | Uint8Array<T>\n\nfunction findBufAndOffset (bufs: Uint8Array[], index: number): { buf: Uint8Array, index: number } {\n if (index == null || index < 0) {\n throw new RangeError('index is out of bounds')\n }\n\n let offset = 0\n\n for (const buf of bufs) {\n const bufEnd = offset + buf.byteLength\n\n if (index < bufEnd) {\n return {\n buf,\n index: index - offset\n }\n }\n\n offset = bufEnd\n }\n\n throw new RangeError('index is out of bounds')\n}\n\n/**\n * Check if object is a CID instance\n *\n * @example\n *\n * ```js\n * import { isUint8ArrayList, Uint8ArrayList } from 'uint8arraylist'\n *\n * isUint8ArrayList(true) // false\n * isUint8ArrayList([]) // false\n * isUint8ArrayList(new Uint8ArrayList()) // true\n * ```\n */\nexport function isUint8ArrayList (value: any): value is Uint8ArrayList {\n return Boolean(value?.[symbol])\n}\n\nexport class Uint8ArrayList <T extends ArrayBufferLike = ArrayBufferLike> implements Iterable<Uint8Array<T>> {\n private bufs: Uint8Array<T>[]\n public length: number\n public readonly [symbol] = true\n\n constructor (...data: Appendable<T>[]) {\n this.bufs = []\n this.length = 0\n\n if (data.length > 0) {\n this.appendAll(data)\n }\n }\n\n * [Symbol.iterator] (): Iterator<Uint8Array<T>> {\n yield * this.bufs\n }\n\n get byteLength (): number {\n return this.length\n }\n\n /**\n * Add one or more `bufs` to the end of this Uint8ArrayList\n */\n append (...bufs: Appendable<T>[]): void {\n this.appendAll(bufs)\n }\n\n /**\n * Add all `bufs` to the end of this Uint8ArrayList\n */\n appendAll (bufs: Appendable<T>[]): void {\n let length = 0\n\n for (const buf of bufs) {\n if (buf instanceof Uint8Array) {\n length += buf.byteLength\n this.bufs.push(buf)\n } else if (isUint8ArrayList(buf)) {\n length += buf.byteLength\n for (const chunk of buf.bufs) {\n this.bufs.push(chunk)\n }\n } else {\n throw new Error('Could not append value, must be an Uint8Array or a Uint8ArrayList')\n }\n }\n\n this.length += length\n }\n\n /**\n * Add one or more `bufs` to the start of this Uint8ArrayList\n */\n prepend (...bufs: Appendable<T>[]): void {\n this.prependAll(bufs)\n }\n\n /**\n * Add all `bufs` to the start of this Uint8ArrayList\n */\n prependAll (bufs: Appendable<T>[]): void {\n let length = 0\n\n for (const buf of bufs.reverse()) {\n if (buf instanceof Uint8Array) {\n length += buf.byteLength\n this.bufs.unshift(buf)\n } else if (isUint8ArrayList(buf)) {\n length += buf.byteLength\n this.bufs.unshift(...buf.bufs)\n } else {\n throw new Error('Could not prepend value, must be an Uint8Array or a Uint8ArrayList')\n }\n }\n\n this.length += length\n }\n\n /**\n * Read the value at `index`\n */\n get (index: number): number {\n const res = findBufAndOffset(this.bufs, index)\n\n return res.buf[res.index]\n }\n\n /**\n * Set the value at `index` to `value`\n */\n set (index: number, value: number): void {\n const res = findBufAndOffset(this.bufs, index)\n\n res.buf[res.index] = value\n }\n\n /**\n * Copy bytes from `buf` to the index specified by `offset`\n */\n write (buf: Appendable<T | ArrayBuffer>, offset: number = 0): void {\n if (buf instanceof Uint8Array) {\n for (let i = 0; i < buf.length; i++) {\n this.set(offset + i, buf[i])\n }\n } else if (isUint8ArrayList(buf)) {\n for (let i = 0; i < buf.length; i++) {\n this.set(offset + i, buf.get(i))\n }\n } else {\n throw new Error('Could not write value, must be an Uint8Array or a Uint8ArrayList')\n }\n }\n\n /**\n * Remove bytes from the front of the pool\n */\n consume (bytes: number): void {\n // first, normalize the argument, in accordance with how Buffer does it\n bytes = Math.trunc(bytes)\n\n // do nothing if not a positive number\n if (Number.isNaN(bytes) || bytes <= 0) {\n return\n }\n\n // if consuming all bytes, skip iterating\n if (bytes === this.byteLength) {\n this.bufs = []\n this.length = 0\n return\n }\n\n while (this.bufs.length > 0) {\n if (bytes >= this.bufs[0].byteLength) {\n bytes -= this.bufs[0].byteLength\n this.length -= this.bufs[0].byteLength\n this.bufs.shift()\n } else {\n this.bufs[0] = this.bufs[0].subarray(bytes)\n this.length -= bytes\n break\n }\n }\n }\n\n /**\n * Extracts a section of an array and returns a new array.\n *\n * This is a copy operation as it is with Uint8Arrays and Arrays\n * - note this is different to the behaviour of Node Buffers.\n */\n slice (beginInclusive?: number, endExclusive?: number): Uint8Array<ArrayBuffer> {\n const { bufs, length } = this._subList(beginInclusive, endExclusive)\n\n return concat(bufs, length)\n }\n\n /**\n * Returns a section of the array from the given start and end element index.\n *\n * This is a no-copy operation where the data extracted data comes from a\n * single Uint8Array internally, otherwise it is a copy operation.\n */\n subarray (beginInclusive?: number, endExclusive?: number): Uint8Array<T | ArrayBuffer> {\n const { bufs, length } = this._subList(beginInclusive, endExclusive)\n\n if (bufs.length === 1) {\n return bufs[0]\n }\n\n return concat(bufs, length)\n }\n\n /**\n * Returns a new Uint8ArrayList from the given start and end element index.\n *\n * This is a no-copy operation.\n */\n sublist (beginInclusive?: number, endExclusive?: number): Uint8ArrayList<T> {\n const { bufs, length } = this._subList(beginInclusive, endExclusive)\n\n const list = new Uint8ArrayList<T>()\n list.length = length\n // don't loop, just set the bufs\n list.bufs = bufs\n\n return list\n }\n\n private _subList (beginInclusive?: number, endExclusive?: number): { bufs: Uint8Array<T>[], length: number } {\n beginInclusive = beginInclusive ?? 0\n endExclusive = endExclusive ?? this.length\n\n if (beginInclusive < 0) {\n beginInclusive = this.length + beginInclusive\n }\n\n if (endExclusive < 0) {\n endExclusive = this.length + endExclusive\n }\n\n if (beginInclusive < 0 || endExclusive > this.length) {\n throw new RangeError('index is out of bounds')\n }\n\n if (beginInclusive === endExclusive) {\n return { bufs: [], length: 0 }\n }\n\n if (beginInclusive === 0 && endExclusive === this.length) {\n return { bufs: [...this.bufs], length: this.length }\n }\n\n const bufs: Uint8Array<T>[] = []\n let offset = 0\n\n for (let i = 0; i < this.bufs.length; i++) {\n const buf = this.bufs[i]\n const bufStart = offset\n const bufEnd = bufStart + buf.byteLength\n\n // for next loop\n offset = bufEnd\n\n if (beginInclusive >= bufEnd) {\n // start after this buf\n continue\n }\n\n const sliceStartInBuf = beginInclusive >= bufStart && beginInclusive < bufEnd\n const sliceEndsInBuf = endExclusive > bufStart && endExclusive <= bufEnd\n\n if (sliceStartInBuf && sliceEndsInBuf) {\n // slice is wholly contained within this buffer\n if (beginInclusive === bufStart && endExclusive === bufEnd) {\n // requested whole buffer\n bufs.push(buf)\n break\n }\n\n // requested part of buffer\n const start = beginInclusive - bufStart\n bufs.push(buf.subarray(start, start + (endExclusive - beginInclusive)))\n break\n }\n\n if (sliceStartInBuf) {\n // slice starts in this buffer\n if (beginInclusive === 0) {\n // requested whole buffer\n bufs.push(buf)\n continue\n }\n\n // requested part of buffer\n bufs.push(buf.subarray(beginInclusive - bufStart))\n continue\n }\n\n if (sliceEndsInBuf) {\n if (endExclusive === bufEnd) {\n // requested whole buffer\n bufs.push(buf)\n break\n }\n\n // requested part of buffer\n bufs.push(buf.subarray(0, endExclusive - bufStart))\n break\n }\n\n // slice started before this buffer and ends after it\n bufs.push(buf)\n }\n\n return { bufs, length: endExclusive - beginInclusive }\n }\n\n indexOf (search: Uint8ArrayList | Uint8Array, offset: number = 0): number {\n if (!isUint8ArrayList(search) && !(search instanceof Uint8Array)) {\n throw new TypeError('The \"value\" argument must be a Uint8ArrayList or Uint8Array')\n }\n\n const needle = search instanceof Uint8Array ? search : search.subarray()\n\n offset = Number(offset ?? 0)\n\n if (isNaN(offset)) {\n offset = 0\n }\n\n if (offset < 0) {\n offset = this.length + offset\n }\n\n if (offset < 0) {\n offset = 0\n }\n\n if (search.length === 0) {\n return offset > this.length ? this.length : offset\n }\n\n // https://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_string-search_algorithm\n const M: number = needle.byteLength\n\n if (M === 0) {\n throw new TypeError('search must be at least 1 byte long')\n }\n\n // radix\n const radix: number = 256\n const rightmostPositions: Int32Array = new Int32Array(radix)\n\n // position of the rightmost occurrence of the byte c in the pattern\n for (let c: number = 0; c < radix; c++) {\n // -1 for bytes not in pattern\n rightmostPositions[c] = -1\n }\n\n for (let j = 0; j < M; j++) {\n // rightmost position for bytes in pattern\n rightmostPositions[needle[j]] = j\n }\n\n // Return offset of first match, -1 if no match\n const right = rightmostPositions\n const lastIndex = this.byteLength - needle.byteLength\n const lastPatIndex = needle.byteLength - 1\n let skip: number\n\n for (let i = offset; i <= lastIndex; i += skip) {\n skip = 0\n\n for (let j = lastPatIndex; j >= 0; j--) {\n const char: number = this.get(i + j)\n\n if (needle[j] !== char) {\n skip = Math.max(1, j - right[char])\n break\n }\n }\n\n if (skip === 0) {\n return i\n }\n }\n\n return -1\n }\n\n getInt8 (byteOffset: number): number {\n const buf = this.subarray(byteOffset, byteOffset + 1)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n\n return view.getInt8(0)\n }\n\n setInt8 (byteOffset: number, value: number): void {\n const buf = allocUnsafe(1)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n view.setInt8(0, value)\n\n this.write(buf, byteOffset)\n }\n\n getInt16 (byteOffset: number, littleEndian?: boolean): number {\n const buf = this.subarray(byteOffset, byteOffset + 2)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n\n return view.getInt16(0, littleEndian)\n }\n\n setInt16 (byteOffset: number, value: number, littleEndian?: boolean): void {\n const buf = alloc(2)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n view.setInt16(0, value, littleEndian)\n\n this.write(buf, byteOffset)\n }\n\n getInt32 (byteOffset: number, littleEndian?: boolean): number {\n const buf = this.subarray(byteOffset, byteOffset + 4)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n\n return view.getInt32(0, littleEndian)\n }\n\n setInt32 (byteOffset: number, value: number, littleEndian?: boolean): void {\n const buf = alloc(4)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n view.setInt32(0, value, littleEndian)\n\n this.write(buf, byteOffset)\n }\n\n getBigInt64 (byteOffset: number, littleEndian?: boolean): bigint {\n const buf = this.subarray(byteOffset, byteOffset + 8)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n\n return view.getBigInt64(0, littleEndian)\n }\n\n setBigInt64 (byteOffset: number, value: bigint, littleEndian?: boolean): void {\n const buf = alloc(8)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n view.setBigInt64(0, value, littleEndian)\n\n this.write(buf, byteOffset)\n }\n\n getUint8 (byteOffset: number): number {\n const buf = this.subarray(byteOffset, byteOffset + 1)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n\n return view.getUint8(0)\n }\n\n setUint8 (byteOffset: number, value: number): void {\n const buf = allocUnsafe(1)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n view.setUint8(0, value)\n\n this.write(buf, byteOffset)\n }\n\n getUint16 (byteOffset: number, littleEndian?: boolean): number {\n const buf = this.subarray(byteOffset, byteOffset + 2)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n\n return view.getUint16(0, littleEndian)\n }\n\n setUint16 (byteOffset: number, value: number, littleEndian?: boolean): void {\n const buf = alloc(2)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n view.setUint16(0, value, littleEndian)\n\n this.write(buf, byteOffset)\n }\n\n getUint32 (byteOffset: number, littleEndian?: boolean): number {\n const buf = this.subarray(byteOffset, byteOffset + 4)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n\n return view.getUint32(0, littleEndian)\n }\n\n setUint32 (byteOffset: number, value: number, littleEndian?: boolean): void {\n const buf = alloc(4)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n view.setUint32(0, value, littleEndian)\n\n this.write(buf, byteOffset)\n }\n\n getBigUint64 (byteOffset: number, littleEndian?: boolean): bigint {\n const buf = this.subarray(byteOffset, byteOffset + 8)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n\n return view.getBigUint64(0, littleEndian)\n }\n\n setBigUint64 (byteOffset: number, value: bigint, littleEndian?: boolean): void {\n const buf = alloc(8)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n view.setBigUint64(0, value, littleEndian)\n\n this.write(buf, byteOffset)\n }\n\n getFloat32 (byteOffset: number, littleEndian?: boolean): number {\n const buf = this.subarray(byteOffset, byteOffset + 4)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n\n return view.getFloat32(0, littleEndian)\n }\n\n setFloat32 (byteOffset: number, value: number, littleEndian?: boolean): void {\n const buf = alloc(4)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n view.setFloat32(0, value, littleEndian)\n\n this.write(buf, byteOffset)\n }\n\n getFloat64 (byteOffset: number, littleEndian?: boolean): number {\n const buf = this.subarray(byteOffset, byteOffset + 8)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n\n return view.getFloat64(0, littleEndian)\n }\n\n setFloat64 (byteOffset: number, value: number, littleEndian?: boolean): void {\n const buf = alloc(8)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n view.setFloat64(0, value, littleEndian)\n\n this.write(buf, byteOffset)\n }\n\n equals (other: any): other is Uint8ArrayList {\n if (other == null) {\n return false\n }\n\n if (!(other instanceof Uint8ArrayList)) {\n return false\n }\n\n if (other.bufs.length !== this.bufs.length) {\n return false\n }\n\n for (let i = 0; i < this.bufs.length; i++) {\n if (!equals(this.bufs[i], other.bufs[i])) {\n return false\n }\n }\n\n return true\n }\n\n /**\n * Create a Uint8ArrayList from a pre-existing list of Uint8Arrays. Use this\n * method if you know the total size of all the Uint8Arrays ahead of time.\n */\n static fromUint8Arrays <T extends ArrayBufferLike> (bufs: Uint8Array<T>[], length?: number): Uint8ArrayList<T> {\n const list = new Uint8ArrayList<T>()\n list.bufs = bufs\n\n if (length == null) {\n length = bufs.reduce((acc, curr) => acc + curr.byteLength, 0)\n }\n\n list.length = length\n\n return list\n }\n}\n\n/*\nfunction indexOf (needle: Uint8Array, haystack: Uint8Array, offset = 0) {\n for (let i = offset; i < haystack.byteLength; i++) {\n for (let j = 0; j < needle.length; j++) {\n if (haystack[i + j] !== needle[j]) {\n break\n }\n\n if (j === needle.byteLength -1) {\n return i\n }\n }\n\n if (haystack.byteLength - i < needle.byteLength) {\n break\n }\n }\n\n return -1\n}\n*/\n", "/**\n * When this error is thrown it means an operation was aborted,\n * usually in response to the `abort` event being emitted by an\n * AbortSignal.\n */\nexport class AbortError extends Error {\n static name = 'AbortError'\n\n constructor (message: string = 'The operation was aborted') {\n super(message)\n this.name = 'AbortError'\n }\n}\n\n/**\n * Thrown when a remote Peer ID does not match the expected one\n */\nexport class UnexpectedPeerError extends Error {\n static name = 'UnexpectedPeerError'\n\n constructor (message = 'Unexpected Peer') {\n super(message)\n this.name = 'UnexpectedPeerError'\n }\n}\n\n/**\n * Thrown when a crypto exchange fails\n */\nexport class InvalidCryptoExchangeError extends Error {\n static name = 'InvalidCryptoExchangeError'\n\n constructor (message = 'Invalid crypto exchange') {\n super(message)\n this.name = 'InvalidCryptoExchangeError'\n }\n}\n\n/**\n * Thrown when invalid parameters are passed to a function or method call\n */\nexport class InvalidParametersError extends Error {\n static name = 'InvalidParametersError'\n\n constructor (message = 'Invalid parameters') {\n super(message)\n this.name = 'InvalidParametersError'\n }\n}\n\n/**\n * Thrown when a public key is invalid\n */\nexport class InvalidPublicKeyError extends Error {\n static name = 'InvalidPublicKeyError'\n\n constructor (message = 'Invalid public key') {\n super(message)\n this.name = 'InvalidPublicKeyError'\n }\n}\n\n/**\n * Thrown when a private key is invalid\n */\nexport class InvalidPrivateKeyError extends Error {\n static name = 'InvalidPrivateKeyError'\n\n constructor (message = 'Invalid private key') {\n super(message)\n this.name = 'InvalidPrivateKeyError'\n }\n}\n\n/**\n * Thrown when a operation is unsupported\n */\nexport class UnsupportedOperationError extends Error {\n static name = 'UnsupportedOperationError'\n\n constructor (message = 'Unsupported operation') {\n super(message)\n this.name = 'UnsupportedOperationError'\n }\n}\n\n/**\n * Thrown when a connection is closing\n */\nexport class ConnectionClosingError extends Error {\n static name = 'ConnectionClosingError'\n\n constructor (message = 'The connection is closing') {\n super(message)\n this.name = 'ConnectionClosingError'\n }\n}\n\n/**\n * Thrown when a connection is closed\n */\nexport class ConnectionClosedError extends Error {\n static name = 'ConnectionClosedError'\n\n constructor (message = 'The connection is closed') {\n super(message)\n this.name = 'ConnectionClosedError'\n }\n}\n\n/**\n * Thrown when a connection fails\n */\nexport class ConnectionFailedError extends Error {\n static name = 'ConnectionFailedError'\n\n constructor (message = 'Connection failed') {\n super(message)\n this.name = 'ConnectionFailedError'\n }\n}\n\n/**\n * Thrown when the muxer is closed and an attempt to open a stream occurs\n */\nexport class MuxerClosedError extends Error {\n static name = 'MuxerClosedError'\n\n constructor (message = 'The muxer is closed') {\n super(message)\n this.name = 'MuxerClosedError'\n }\n}\n\n/**\n * Thrown when a protocol stream is reset by the remote muxer\n */\nexport class StreamResetError extends Error {\n static name = 'StreamResetError'\n\n constructor (message = 'The stream has been reset') {\n super(message)\n this.name = 'StreamResetError'\n }\n}\n\n/**\n * Thrown when a protocol stream is aborted locally\n */\nexport class StreamAbortedError extends Error {\n static name = 'StreamAbortedError'\n\n constructor (message = 'The stream has been aborted') {\n super(message)\n this.name = 'StreamAbortedError'\n }\n}\n\n/**\n * Thrown when a stream is in an invalid state\n */\nexport class StreamStateError extends Error {\n static name = 'StreamStateError'\n\n constructor (message = 'The stream is in an invalid state') {\n super(message)\n this.name = 'StreamStateError'\n }\n}\n\n/**\n * Thrown when a stream buffer is full\n */\nexport class StreamBufferError extends Error {\n static name = 'StreamBufferError'\n\n constructor (message = 'The stream buffer was full') {\n super(message)\n this.name = 'StreamBufferError'\n }\n}\n\n/**\n * Thrown when a value could not be found\n */\nexport class NotFoundError extends Error {\n static name = 'NotFoundError'\n\n constructor (message = 'Not found') {\n super(message)\n this.name = 'NotFoundError'\n }\n}\n\n/**\n * Thrown when an invalid peer ID is encountered\n */\nexport class InvalidPeerIdError extends Error {\n static name = 'InvalidPeerIdError'\n\n constructor (message = 'Invalid PeerID') {\n super(message)\n this.name = 'InvalidPeerIdError'\n }\n}\n\n/**\n * Thrown when an invalid multiaddr is encountered\n */\nexport class InvalidMultiaddrError extends Error {\n static name = 'InvalidMultiaddrError'\n\n constructor (message = 'Invalid multiaddr') {\n super(message)\n this.name = 'InvalidMultiaddrError'\n }\n}\n\n/**\n * Thrown when an invalid CID is encountered\n */\nexport class InvalidCIDError extends Error {\n static name = 'InvalidCIDError'\n\n constructor (message = 'Invalid CID') {\n super(message)\n this.name = 'InvalidCIDError'\n }\n}\n\n/**\n * Thrown when an invalid multihash is encountered\n */\nexport class InvalidMultihashError extends Error {\n static name = 'InvalidMultihashError'\n\n constructor (message = 'Invalid Multihash') {\n super(message)\n this.name = 'InvalidMultihashError'\n }\n}\n\n/**\n * Thrown when a protocol is not supported\n */\nexport class UnsupportedProtocolError extends Error {\n static name = 'UnsupportedProtocolError'\n\n constructor (message = 'Unsupported protocol error') {\n super(message)\n this.name = 'UnsupportedProtocolError'\n }\n}\n\n/**\n * An invalid or malformed message was encountered during a protocol exchange\n */\nexport class InvalidMessageError extends Error {\n static name = 'InvalidMessageError'\n\n constructor (message = 'Invalid message') {\n super(message)\n this.name = 'InvalidMessageError'\n }\n}\n\n/**\n * Thrown when a remote peer sends a structurally valid message that does not\n * comply with the protocol\n */\nexport class ProtocolError extends Error {\n static name = 'ProtocolError'\n\n constructor (message = 'Protocol error') {\n super(message)\n this.name = 'ProtocolError'\n }\n}\n\n/**\n * Throw when an operation times out\n */\nexport class TimeoutError extends Error {\n static name = 'TimeoutError'\n\n constructor (message = 'Timed out') {\n super(message)\n this.name = 'TimeoutError'\n }\n}\n\n/**\n * Thrown when a startable component is interacted with but it has not been\n * started yet\n */\nexport class NotStartedError extends Error {\n static name = 'NotStartedError'\n\n constructor (message = 'Not started') {\n super(message)\n this.name = 'NotStartedError'\n }\n}\n\n/**\n * Thrown when a component is started that has already been started\n */\nexport class AlreadyStartedError extends Error {\n static name = 'AlreadyStartedError'\n\n constructor (message = 'Already started') {\n super(message)\n this.name = 'AlreadyStartedError'\n }\n}\n\n/**\n * Thrown when dialing an address failed\n */\nexport class DialError extends Error {\n static name = 'DialError'\n\n constructor (message = 'Dial error') {\n super(message)\n this.name = 'DialError'\n }\n}\n\n/**\n * Thrown when listening on an address failed\n */\nexport class ListenError extends Error {\n static name = 'ListenError'\n\n constructor (message = 'Listen error') {\n super(message)\n this.name = 'ListenError'\n }\n}\n\n/**\n * This error is thrown when a limited connection is encountered, i.e. if the\n * user tried to open a stream on a connection for a protocol that is not\n * configured to run over limited connections.\n */\nexport class LimitedConnectionError extends Error {\n static name = 'LimitedConnectionError'\n\n constructor (message = 'Limited connection') {\n super(message)\n this.name = 'LimitedConnectionError'\n }\n}\n\n/**\n * This error is thrown where there are too many inbound protocols streams open\n */\nexport class TooManyInboundProtocolStreamsError extends Error {\n static name = 'TooManyInboundProtocolStreamsError'\n\n constructor (message = 'Too many inbound protocol streams') {\n super(message)\n this.name = 'TooManyInboundProtocolStreamsError'\n }\n}\n\n/**\n * This error is thrown where there are too many outbound protocols streams open\n */\nexport class TooManyOutboundProtocolStreamsError extends Error {\n static name = 'TooManyOutboundProtocolStreamsError'\n\n constructor (message = 'Too many outbound protocol streams') {\n super(message)\n this.name = 'TooManyOutboundProtocolStreamsError'\n }\n}\n\n/**\n * Thrown when an attempt to operate on an unsupported key was made\n */\nexport class UnsupportedKeyTypeError extends Error {\n static name = 'UnsupportedKeyTypeError'\n\n constructor (message = 'Unsupported key type') {\n super(message)\n this.name = 'UnsupportedKeyTypeError'\n }\n}\n\n/**\n * Thrown when an operation has not been implemented\n */\nexport class NotImplementedError extends Error {\n static name = 'NotImplementedError'\n\n constructor (message = 'Not implemented') {\n super(message)\n this.name = 'NotImplementedError'\n }\n}\n", "/**\n * @packageDocumentation\n *\n * Adds types to the EventTarget class.\n *\n * Hopefully this won't be necessary\n * forever:\n *\n * - https://github.com/microsoft/TypeScript/issues/28357\n * - https://github.com/microsoft/TypeScript/issues/43477\n * - https://github.com/microsoft/TypeScript/issues/299\n * - https://www.npmjs.com/package/typed-events\n * - https://www.npmjs.com/package/typed-event-emitter\n * - https://www.npmjs.com/package/typed-event-target\n * - etc\n *\n * In addition to types, a `safeDispatchEvent` method is available which\n * prevents dispatching events that aren't in the event map, and a\n * `listenerCount` method which reports the number of listeners that are\n * currently registered for a given event.\n *\n * @example\n *\n * ```ts\n * import { TypedEventEmitter } from 'main-event'\n * import type { TypedEventTarget } from 'main-event'\n *\n * interface EventTypes {\n * 'test': CustomEvent<string>\n * }\n *\n * const target = new TypedEventEmitter<EventTypes>()\n *\n * // it's a regular EventTarget\n * console.info(target instanceof EventTarget) // true\n *\n * // register listeners normally\n * target.addEventListener('test', (evt) => {\n * // evt is CustomEvent<string>\n * })\n *\n * // @ts-expect-error 'derp' is not in the event map\n * target.addEventListener('derp', () => {})\n *\n * // use normal dispatchEvent method\n * target.dispatchEvent(new CustomEvent('test', {\n * detail: 'hello'\n * }))\n *\n * // use type safe dispatch method\n * target.safeDispatchEvent('test', {\n * detail: 'world'\n * })\n *\n * // report listener count\n * console.info(target.listenerCount('test')) // 0\n *\n * // event emitters can be used purely as interfaces too\n * function acceptTarget (target: TypedEventTarget<EventTypes>) {\n * // ...\n * }\n * ```\n */\n\nimport { setMaxListeners } from './events.ts'\n\nexport interface EventCallback<EventType> { (evt: EventType): void }\nexport interface EventObject<EventType> { handleEvent: EventCallback<EventType> }\nexport type EventHandler<EventType> = EventCallback<EventType> | EventObject<EventType>\n\ninterface Listener {\n once: boolean\n callback: any\n}\n\n/**\n *\n */\nexport interface TypedEventTarget <EventMap extends Record<string, any>> extends EventTarget {\n addEventListener<K extends keyof EventMap>(type: K, listener: EventHandler<EventMap[K]> | null, options?: boolean | AddEventListenerOptions): void\n\n listenerCount (type: string): number\n\n removeEventListener<K extends keyof EventMap>(type: K, listener?: EventHandler<EventMap[K]> | null, options?: boolean | EventListenerOptions): void\n\n removeEventListener (type: string, listener?: EventHandler<Event>, options?: boolean | EventListenerOptions): void\n\n safeDispatchEvent<Detail>(type: keyof EventMap, detail?: CustomEventInit<Detail>): boolean\n}\n\nfunction isEventObject <EventType> (obj?: any): obj is EventObject<EventType> {\n return typeof obj?.handleEvent === 'function'\n}\n\nfunction isOnce (options?: boolean | AddEventListenerOptions): boolean {\n return (options !== true && options !== false && options?.once) ?? false\n}\n\n/**\n * An implementation of a typed event target\n */\nexport class TypedEventEmitter<EventMap extends Record<string, any>> extends EventTarget implements TypedEventTarget<EventMap> {\n readonly #listeners = new Map<any, Listener[]>()\n\n constructor () {\n super()\n\n // silence MaxListenersExceededWarning warning on Node.js, this is a red\n // herring almost all of the time\n setMaxListeners(Infinity, this)\n }\n\n listenerCount (type: string): number {\n const listeners = this.#listeners.get(type)\n\n if (listeners == null) {\n return 0\n }\n\n return listeners.length\n }\n\n addEventListener<K extends keyof EventMap>(type: K, listener: EventHandler<EventMap[K]> | null, options?: boolean | AddEventListenerOptions): void\n addEventListener (type: string, listener: EventHandler<Event>, options?: boolean | AddEventListenerOptions): void {\n const once = isOnce(options)\n\n super.addEventListener(type, (evt) => {\n if (once) {\n let list = this.#listeners.get(evt.type)\n\n if (list != null) {\n list = list.filter(({ callback }) => callback !== listener)\n this.#listeners.set(evt.type, list)\n }\n }\n\n if (isEventObject<Event>(listener)) {\n listener.handleEvent(evt)\n } else {\n listener(evt)\n }\n }, options)\n\n let list = this.#listeners.get(type)\n\n if (list == null) {\n list = []\n this.#listeners.set(type, list)\n }\n\n list.push({\n callback: listener,\n once\n })\n }\n\n removeEventListener<K extends keyof EventMap>(type: K, listener?: EventHandler<EventMap[K]> | null, options?: boolean | EventListenerOptions): void\n removeEventListener (type: string, listener?: EventHandler<Event>, options?: boolean | EventListenerOptions): void {\n super.removeEventListener(type.toString(), listener ?? null, options)\n\n let list = this.#listeners.get(type)\n\n if (list == null) {\n return\n }\n\n list = list.filter(({ callback }) => callback !== listener)\n this.#listeners.set(type, list)\n }\n\n safeDispatchEvent<Detail>(type: keyof EventMap, detail: CustomEventInit<Detail> = {}): boolean {\n return this.dispatchEvent(new CustomEvent<Detail>(type as string, detail))\n }\n}\n\nexport { setMaxListeners }\n", "/**\n * Progress events are emitted during long running operations\n */\nexport interface ProgressEvent<T extends string = any, D = unknown> {\n /**\n * The event type\n */\n type: T\n\n /**\n * Context-specific event information\n */\n detail: D\n}\n\n/**\n * A callback function that receives progress events\n */\nexport interface ProgressEventListener<E extends ProgressEvent = any> {\n (evt: E): void\n}\n\n/**\n * An implementation of the ProgressEvent interface, this is essentially\n * a typed `CustomEvent` with a `type` property that lets us disambiguate\n * events passed to `progress` callbacks.\n */\nexport class CustomProgressEvent<D = unknown, T extends string = any> extends Event implements ProgressEvent<T, D> {\n public type: T\n public detail: D\n\n constructor (type: T, detail?: D) {\n super(type)\n\n this.type = type\n // @ts-expect-error detail may be undefined\n this.detail = detail\n }\n}\n\n/**\n * Define an `onProgress` callback that can be invoked with `ProgressEvent`s\n *\n * @example\n *\n * ```typescript\n * type MyOperationProgressEvents =\n * ProgressEvent<'operation:start'> |\n * ProgressEvent<'operation:success', Result> |\n * ProgressEvent<'operation:error', Error>\n *\n * export interface MyOperationOptions extends ProgressOptions<MyOperationProgressEvents> {\n * // define options here\n * }\n * ```\n */\nexport interface ProgressOptions<Event extends ProgressEvent = any> {\n onProgress?: ProgressEventListener<Event>\n}\n", "export class TimeoutError extends Error {\n\tname = 'TimeoutError';\n\n\tconstructor(message, options) {\n\t\tsuper(message, options);\n\t\tError.captureStackTrace?.(this, TimeoutError);\n\t}\n}\n\nconst getAbortedReason = signal => signal.reason ?? new DOMException('This operation was aborted.', 'AbortError');\n\nexport default function pTimeout(promise, options) {\n\tconst {\n\t\tmilliseconds,\n\t\tfallback,\n\t\tmessage,\n\t\tcustomTimers = {setTimeout, clearTimeout},\n\t\tsignal,\n\t} = options;\n\n\tlet timer;\n\tlet abortHandler;\n\n\tconst wrappedPromise = new Promise((resolve, reject) => {\n\t\tif (typeof milliseconds !== 'number' || Math.sign(milliseconds) !== 1) {\n\t\t\tthrow new TypeError(`Expected \\`milliseconds\\` to be a positive number, got \\`${milliseconds}\\``);\n\t\t}\n\n\t\tif (signal?.aborted) {\n\t\t\treject(getAbortedReason(signal));\n\t\t\treturn;\n\t\t}\n\n\t\tif (signal) {\n\t\t\tabortHandler = () => {\n\t\t\t\treject(getAbortedReason(signal));\n\t\t\t};\n\n\t\t\tsignal.addEventListener('abort', abortHandler, {once: true});\n\t\t}\n\n\t\t// Use .then() instead of async IIFE to preserve stack traces\n\t\t// eslint-disable-next-line promise/prefer-await-to-then, promise/prefer-catch\n\t\tpromise.then(resolve, reject);\n\n\t\tif (milliseconds === Number.POSITIVE_INFINITY) {\n\t\t\treturn;\n\t\t}\n\n\t\t// We create the error outside of `setTimeout` to preserve the stack trace.\n\t\tconst timeoutError = new TimeoutError();\n\n\t\t// `.call(undefined, ...)` is needed for custom timers to avoid context issues\n\t\ttimer = customTimers.setTimeout.call(undefined, () => {\n\t\t\tif (fallback) {\n\t\t\t\ttry {\n\t\t\t\t\tresolve(fallback());\n\t\t\t\t} catch (error) {\n\t\t\t\t\treject(error);\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (typeof promise.cancel === 'function') {\n\t\t\t\tpromise.cancel();\n\t\t\t}\n\n\t\t\tif (message === false) {\n\t\t\t\tresolve();\n\t\t\t} else if (message instanceof Error) {\n\t\t\t\treject(message);\n\t\t\t} else {\n\t\t\t\ttimeoutError.message = message ?? `Promise timed out after ${milliseconds} milliseconds`;\n\t\t\t\treject(timeoutError);\n\t\t\t}\n\t\t}, milliseconds);\n\t});\n\n\t// eslint-disable-next-line promise/prefer-await-to-then\n\tconst cancelablePromise = wrappedPromise.finally(() => {\n\t\tcancelablePromise.clear();\n\t\tif (abortHandler && signal) {\n\t\t\tsignal.removeEventListener('abort', abortHandler);\n\t\t}\n\t});\n\n\tcancelablePromise.clear = () => {\n\t\t// `.call(undefined, ...)` is needed for custom timers to avoid context issues\n\t\tcustomTimers.clearTimeout.call(undefined, timer);\n\t\ttimer = undefined;\n\t};\n\n\treturn cancelablePromise;\n}\n", "import hashlru from 'hashlru'\nimport { RecordType } from '../index.js'\nimport { DEFAULT_TTL, toDNSResponse } from './to-dns-response.js'\nimport type { Answer, DNSResponse } from '../index.js'\n\ninterface CachedAnswer {\n expires: number\n value: Answer\n}\n\nexport interface AnswerCache {\n get (fqdn: string, types: RecordType[]): DNSResponse | undefined\n add (domain: string, answer: Answer): void\n remove (domain: string, type: ResponseType): void\n clear (): void\n}\n\n/**\n * Time Aware Least Recent Used Cache\n *\n * @see https://arxiv.org/pdf/1801.00390\n */\nclass CachedAnswers {\n private readonly lru: any\n\n constructor (maxSize: number) {\n // @ts-expect-error types are broken - https://github.com/dominictarr/hashlru/pull/24\n this.lru = hashlru(maxSize)\n }\n\n get (fqdn: string, types: RecordType[]): DNSResponse | undefined {\n let foundAllAnswers = true\n const answers: Answer[] = []\n\n for (const type of types) {\n const cached = this.getAnswers(fqdn, type)\n\n if (cached.length === 0) {\n foundAllAnswers = false\n break\n }\n\n answers.push(...cached)\n }\n\n if (foundAllAnswers) {\n return toDNSResponse({ answers })\n }\n }\n\n private getAnswers (domain: string, type: RecordType): Answer[] {\n const key = `${domain.toLowerCase()}-${type}`\n const answers: CachedAnswer[] = this.lru.get(key)\n\n if (answers != null) {\n const cachedAnswers = answers\n .filter((entry) => {\n return entry.expires > Date.now()\n })\n .map(({ expires, value }) => ({\n ...value,\n TTL: Math.round((expires - Date.now()) / 1000),\n type: RecordType[value.type]\n }))\n\n if (cachedAnswers.length === 0) {\n this.lru.remove(key)\n }\n\n // @ts-expect-error hashlru stringifies stored types which turns enums\n // into strings, we convert back into enums above but tsc doesn't know\n return cachedAnswers\n }\n\n return []\n }\n\n add (domain: string, answer: Answer): void {\n const key = `${domain.toLowerCase()}-${answer.type}`\n\n const answers: CachedAnswer[] = this.lru.get(key) ?? []\n answers.push({\n expires: Date.now() + ((answer.TTL ?? DEFAULT_TTL) * 1000),\n value: answer\n })\n\n this.lru.set(key, answers)\n }\n\n remove (domain: string, type: ResponseType): void {\n const key = `${domain.toLowerCase()}-${type}`\n\n this.lru.remove(key)\n }\n\n clear (): void {\n this.lru.clear()\n }\n}\n\n/**\n * Avoid sending multiple queries for the same hostname by caching results\n */\nexport function cache (size: number): AnswerCache {\n return new CachedAnswers(size)\n}\n", "/**\n * @packageDocumentation\n *\n * Query DNS records using `node:dns`, DNS over HTTP and/or DNSJSON over HTTP.\n *\n * A list of publicly accessible servers can be found [here](https://github.com/curl/curl/wiki/DNS-over-HTTPS#publicly-available-servers).\n *\n * @example Using the default resolver\n *\n * ```TypeScript\n * import { dns } from '@multiformats/dns'\n *\n * const resolver = dns()\n *\n * // resolve A records with a 5s timeout\n * const result = await dns.query('google.com', {\n * signal: AbortSignal.timeout(5000)\n * })\n * ```\n *\n * @example Using per-TLD resolvers\n *\n * ```TypeScript\n * import { dns } from '@multiformats/dns'\n * import { dnsJsonOverHttps } from '@multiformats/dns/resolvers'\n *\n * const resolver = dns({\n * resolvers: {\n * // will only be used to resolve `.com` addresses\n * 'com.': dnsJsonOverHttps('https://cloudflare-dns.com/dns-query'),\n *\n * // this can also be an array, resolvers will be shuffled and tried in\n * // series\n * 'net.': [\n * dnsJsonOverHttps('https://dns.google/resolve'),\n * dnsJsonOverHttps('https://dns.pub/dns-query')\n * ],\n *\n * // will only be used to resolve all other addresses\n * '.': dnsJsonOverHttps('https://dnsforge.de/dns-query'),\n * }\n * })\n * ```\n *\n * @example Query for specific record types\n *\n * ```TypeScript\n * import { dns, RecordType } from '@multiformats/dns'\n *\n * const resolver = dns()\n *\n * // resolve only TXT records\n * const result = await dns.query('google.com', {\n * types: [\n * RecordType.TXT\n * ]\n * })\n * ```\n *\n * ## Caching\n *\n * Individual Aanswers are cached so. If you make a request, for which all\n * record types are cached, all values will be pulled from the cache.\n *\n * If any of the record types are not cached, a new request will be resolved as\n * if none of the records were cached, and the cache will be updated to include\n * the new results.\n *\n * @example Ignoring the cache\n *\n * ```TypeScript\n * import { dns, RecordType } from '@multiformats/dns'\n *\n * const resolver = dns()\n *\n * // do not used cached results, always resolve a new query\n * const result = await dns.query('google.com', {\n * cached: false\n * })\n * ```\n */\n\nimport { DNS as DNSClass } from './dns.js'\nimport type { DNSResolver } from './resolvers/index.js'\nimport type { ComponentLogger } from '@libp2p/interface'\nimport type { ProgressEvent, ProgressOptions } from 'progress-events'\n\n/**\n * A subset of DNS Record Types\n *\n * @see https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#dns-parameters-4.\n */\nexport enum RecordType {\n A = 1,\n CNAME = 5,\n TXT = 16,\n AAAA = 28\n}\n\nexport interface Question {\n /**\n * The record name requested.\n */\n name: string\n\n /**\n * The type of DNS record requested.\n *\n * @see https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#dns-parameters-4.\n */\n type: RecordType\n}\n\nexport interface Answer {\n /**\n * The record owner.\n */\n name: string\n\n /**\n * The type of DNS record.\n *\n * @see https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#dns-parameters-4\n */\n type: RecordType\n\n /**\n * The number of seconds the answer can be stored in cache before it is\n * considered stale.\n */\n TTL: number\n\n /**\n * The value of the DNS record for the given name and type. The data will be\n * in text for standardized record types and in hex for unknown types.\n */\n data: string\n}\n\nexport interface DNSResponse {\n /**\n * The Response Code of the DNS Query.\n *\n * @see https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#dns-parameters-6\n */\n Status: number\n\n /**\n * If true, it means the truncated bit was set. This happens when the DNS\n * answer is larger than a single UDP or TCP packet.\n */\n TC: boolean\n\n /**\n * If true, it means the Recursive Desired bit was set.\n */\n RD: boolean\n\n /**\n * If true, it means the Recursion Available bit was set.\n */\n RA: boolean\n\n /**\n * If true, it means that every record in the answer was verified with DNSSEC.\n */\n AD: boolean\n\n /**\n * If true, the client asked to disable DNSSEC validation.\n */\n CD: boolean\n\n /**\n * The records that were requested.\n */\n Question: Question[]\n\n /**\n * Values for the records that were requested.\n */\n Answer: Answer[]\n}\n\n/**\n * The default maximum amount of recursion allowed during a query\n */\nexport const MAX_RECURSIVE_DEPTH = 32\n\nexport interface QueryOptions extends ProgressOptions<ResolveDnsProgressEvents> {\n signal?: AbortSignal\n\n /**\n * Do not use cached DNS entries\n *\n * @default false\n */\n cached?: boolean\n\n /**\n * The type or types of DNS records to resolve\n *\n * @default [RecordType.A, RecordType.AAAA]\n */\n types?: RecordType | RecordType[]\n\n /**\n * An optional logger\n */\n logger?: ComponentLogger\n}\n\nexport interface DNS {\n query(fqdn: string, options?: QueryOptions): Promise<DNSResponse>\n}\n\nexport type ResolveDnsProgressEvents =\n ProgressEvent<'dns:cache', string> |\n ProgressEvent<'dns:query', string> |\n ProgressEvent<'dns:response', DNSResponse> |\n ProgressEvent<'dns:error', Error>\n\nexport type DNSResolvers = Record<string, DNSResolver | DNSResolver[]>\n\nexport interface DNSInit {\n /**\n * A set of resolvers used to answer DNS queries\n *\n * String keys control which resolvers are used for which TLDs.\n *\n * @example\n *\n * ```TypeScript\n * import { dns } from '@multiformats/dns'\n * import { dnsOverHttps } from '@multiformats/dns'\n *\n * const resolver = dns({\n * resolvers: {\n * // only used for .com domains\n * 'com.': dnsOverHttps('https://example-1.com'),\n *\n * // only used for .net domains, can be an array\n * 'net.': [\n * dnsOverHttps('https://example-2.com'),\n * dnsOverHttps('https://example-3.com'),\n * ],\n *\n * // used for everything else (can be an array)\n * '.': dnsOverHttps('https://example-4.com')\n * }\n * })\n * ```\n */\n resolvers?: DNSResolvers\n\n /**\n * To avoid repeating DNS lookups, successful answers are cached according to\n * their TTL. To avoid exhausting memory, this option controls how many\n * answers to cache.\n *\n * @default 1000\n */\n cacheSize?: number\n\n /**\n * An optional logger\n */\n logger?: ComponentLogger\n}\n\nexport function dns (init: DNSInit = {}): DNS {\n return new DNSClass(init)\n}\n", "//#region src/index.ts\nconst s = 1e3;\nconst m = s * 60;\nconst h = m * 60;\nconst d = h * 24;\nconst w = d * 7;\nconst y = d * 365.25;\nconst mo = y / 12;\nfunction ms(value, options) {\n\tif (typeof value === \"string\") return parse(value);\n\telse if (typeof value === \"number\") return format(value, options);\n\tthrow new Error(`Value provided to ms() must be a string or number. value=${JSON.stringify(value)}`);\n}\n/**\n* Parse the given string and return milliseconds.\n*\n* @param str - A string to parse to milliseconds\n* @returns The parsed value in milliseconds, or `NaN` if the string can't be\n* parsed\n*/\nfunction parse(str) {\n\tif (typeof str !== \"string\" || str.length === 0 || str.length > 100) throw new Error(`Value provided to ms.parse() must be a string with length between 1 and 99. value=${JSON.stringify(str)}`);\n\tconst match = /^(?<value>-?\\d*\\.?\\d+) *(?<unit>milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|months?|mo|years?|yrs?|y)?$/i.exec(str);\n\tif (!match?.groups) return NaN;\n\tconst { value, unit = \"ms\" } = match.groups;\n\tconst n = parseFloat(value);\n\tconst matchUnit = unit.toLowerCase();\n\t/* istanbul ignore next - istanbul doesn't understand, but thankfully the TypeScript the exhaustiveness check in the default case keeps us type safe here */\n\tswitch (matchUnit) {\n\t\tcase \"years\":\n\t\tcase \"year\":\n\t\tcase \"yrs\":\n\t\tcase \"yr\":\n\t\tcase \"y\": return n * y;\n\t\tcase \"months\":\n\t\tcase \"month\":\n\t\tcase \"mo\": return n * mo;\n\t\tcase \"weeks\":\n\t\tcase \"week\":\n\t\tcase \"w\": return n * w;\n\t\tcase \"days\":\n\t\tcase \"day\":\n\t\tcase \"d\": return n * d;\n\t\tcase \"hours\":\n\t\tcase \"hour\":\n\t\tcase \"hrs\":\n\t\tcase \"hr\":\n\t\tcase \"h\": return n * h;\n\t\tcase \"minutes\":\n\t\tcase \"minute\":\n\t\tcase \"mins\":\n\t\tcase \"min\":\n\t\tcase \"m\": return n * m;\n\t\tcase \"seconds\":\n\t\tcase \"second\":\n\t\tcase \"secs\":\n\t\tcase \"sec\":\n\t\tcase \"s\": return n * s;\n\t\tcase \"milliseconds\":\n\t\tcase \"millisecond\":\n\t\tcase \"msecs\":\n\t\tcase \"msec\":\n\t\tcase \"ms\": return n;\n\t\tdefault: throw new Error(`Unknown unit \"${matchUnit}\" provided to ms.parse(). value=${JSON.stringify(str)}`);\n\t}\n}\n/**\n* Parse the given StringValue and return milliseconds.\n*\n* @param value - A typesafe StringValue to parse to milliseconds\n* @returns The parsed value in milliseconds, or `NaN` if the string can't be\n* parsed\n*/\nfunction parseStrict(value) {\n\treturn parse(value);\n}\n/**\n* Short format for `ms`.\n*/\nfunction fmtShort(ms$1) {\n\tconst msAbs = Math.abs(ms$1);\n\tif (msAbs >= y) return `${Math.round(ms$1 / y)}y`;\n\tif (msAbs >= mo) return `${Math.round(ms$1 / mo)}mo`;\n\tif (msAbs >= w) return `${Math.round(ms$1 / w)}w`;\n\tif (msAbs >= d) return `${Math.round(ms$1 / d)}d`;\n\tif (msAbs >= h) return `${Math.round(ms$1 / h)}h`;\n\tif (msAbs >= m) return `${Math.round(ms$1 / m)}m`;\n\tif (msAbs >= s) return `${Math.round(ms$1 / s)}s`;\n\treturn `${ms$1}ms`;\n}\n/**\n* Long format for `ms`.\n*/\nfunction fmtLong(ms$1) {\n\tconst msAbs = Math.abs(ms$1);\n\tif (msAbs >= y) return plural(ms$1, msAbs, y, \"year\");\n\tif (msAbs >= mo) return plural(ms$1, msAbs, mo, \"month\");\n\tif (msAbs >= w) return plural(ms$1, msAbs, w, \"week\");\n\tif (msAbs >= d) return plural(ms$1, msAbs, d, \"day\");\n\tif (msAbs >= h) return plural(ms$1, msAbs, h, \"hour\");\n\tif (msAbs >= m) return plural(ms$1, msAbs, m, \"minute\");\n\tif (msAbs >= s) return plural(ms$1, msAbs, s, \"second\");\n\treturn `${ms$1} ms`;\n}\n/**\n* Format the given integer as a string.\n*\n* @param ms - milliseconds\n* @param options - Options for the conversion\n* @returns The formatted string\n*/\nfunction format(ms$1, options) {\n\tif (typeof ms$1 !== \"number\" || !Number.isFinite(ms$1)) throw new Error(\"Value provided to ms.format() must be of type number.\");\n\treturn options?.long ? fmtLong(ms$1) : fmtShort(ms$1);\n}\n/**\n* Pluralization helper.\n*/\nfunction plural(ms$1, msAbs, n, name) {\n\tconst isPlural = msAbs >= n * 1.5;\n\treturn `${Math.round(ms$1 / n)} ${name}${isPlural ? \"s\" : \"\"}`;\n}\n\n//#endregion\nexport { format, ms, parse, parseStrict };", "/* eslint-disable no-console */\n\n/**\n * This is the common logic for both the Node.js and web browser\n * implementations of `debug()`.\n */\nimport { ms as humanize } from 'ms'\nimport type { Debug, Debugger, Options } from './index.ts'\n\nexport default function setup (env: any): Debug {\n createDebug.debug = createDebug\n createDebug.default = createDebug\n createDebug.coerce = coerce\n createDebug.disable = disable\n createDebug.enable = enable\n createDebug.enabled = enabled\n createDebug.humanize = humanize\n createDebug.destroy = destroy\n\n Object.keys(env).forEach(key => {\n // @ts-expect-error cannot use string to index type\n createDebug[key] = env[key]\n })\n\n /**\n * The currently active debug mode names, and names to skip.\n */\n\n createDebug.names = [] as any[]\n createDebug.skips = [] as any[]\n\n /**\n * Map of special \"%n\" handling functions, for the debug \"format\" argument.\n *\n * Valid key names are a single, lower or upper-case letter, i.e. \"n\" and \"N\".\n */\n createDebug.formatters = {} satisfies Record<string, any>\n\n /**\n * Selects a color for a debug namespace\n *\n * @param {string} namespace - The namespace string for the debug instance to be colored\n * @returns {number | string} An ANSI color code for the given namespace\n */\n function selectColor (namespace: string): number | string {\n let hash = 0\n\n for (let i = 0; i < namespace.length; i++) {\n hash = ((hash << 5) - hash) + namespace.charCodeAt(i)\n hash |= 0 // Convert to 32bit integer\n }\n\n // @ts-expect-error colors is not in the types\n return createDebug.colors[Math.abs(hash) % createDebug.colors.length]\n }\n createDebug.selectColor = selectColor\n\n /**\n * Create a debugger with the given `namespace`.\n *\n * @param {string} namespace\n * @returns {Function}\n */\n function createDebug (namespace: string, options?: Options): Debugger {\n let prevTime: any\n let enableOverride: any = null\n let namespacesCache: any\n let enabledCache: any\n\n function debug (...args: any[]): void {\n // Disabled?\n // @ts-expect-error enabled is not in the types\n if (!debug.enabled) {\n return\n }\n\n const self: any = debug\n\n // Set `diff` timestamp\n const curr = Number(new Date())\n const ms = curr - (prevTime || curr)\n self.diff = ms\n self.prev = prevTime\n self.curr = curr\n prevTime = curr\n\n args[0] = createDebug.coerce(args[0])\n\n if (typeof args[0] !== 'string') {\n // Anything else let's inspect with %O\n args.unshift('%O')\n }\n\n // Apply any `formatters` transformations\n let index = 0\n args[0] = args[0].replace(/%([a-zA-Z%])/g, (match: any, format: any): any => {\n // If we encounter an escaped % then don't increase the array index\n if (match === '%%') {\n return '%'\n }\n index++\n // @ts-expect-error formatters is not in the types\n const formatter = createDebug.formatters[format]\n if (typeof formatter === 'function') {\n const val = args[index]\n match = formatter.call(self, val)\n\n // Now we need to remove `args[index]` since it's inlined in the `format`\n args.splice(index, 1)\n index--\n }\n return match\n })\n\n // Apply env-specific formatting (colors, etc.)\n // @ts-expect-error formatArgs is not in the types\n createDebug.formatArgs.call(self, args)\n\n if (options?.onLog != null) {\n options.onLog(...args)\n }\n\n // @ts-expect-error log is not in the types\n const logFn = self.log || createDebug.log\n logFn.apply(self, args)\n }\n\n debug.namespace = namespace\n // @ts-expect-error useColors is not in the types\n debug.useColors = createDebug.useColors()\n debug.color = createDebug.selectColor(namespace)\n debug.extend = extend\n debug.destroy = createDebug.destroy // XXX Temporary. Will be removed in the next major release.\n\n Object.defineProperty(debug, 'enabled', {\n enumerable: true,\n configurable: false,\n get: () => {\n if (enableOverride !== null) {\n return enableOverride\n }\n // @ts-expect-error namespaces is not in the types\n if (namespacesCache !== createDebug.namespaces) {\n // @ts-expect-error namespaces is not in the types\n namespacesCache = createDebug.namespaces\n enabledCache = createDebug.enabled(namespace)\n }\n\n return enabledCache\n },\n set: v => {\n enableOverride = v\n }\n })\n\n // Env-specific initialization logic for debug instances\n // @ts-expect-error init is not in the types\n if (typeof createDebug.init === 'function') {\n // @ts-expect-error init is not in the types\n createDebug.init(debug)\n }\n\n // @ts-expect-error some properties are added dynamically\n return debug\n }\n\n function extend (this: any, namespace: string, delimiter: string): any {\n const newDebug = createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace)\n newDebug.log = this.log\n return newDebug\n }\n\n /**\n * Enables a debug mode by namespaces. This can include modes\n * separated by a colon and wildcards.\n *\n * @param {string} namespaces\n */\n function enable (namespaces: string): void {\n // @ts-expect-error save is not in the types\n createDebug.save(namespaces)\n // @ts-expect-error namespaces is not in the types\n createDebug.namespaces = namespaces\n\n createDebug.names = []\n createDebug.skips = []\n\n let i\n const split = (typeof namespaces === 'string' ? namespaces : '').split(/[\\s,]+/)\n const len = split.length\n\n for (i = 0; i < len; i++) {\n if (!split[i]) {\n // ignore empty strings\n continue\n }\n\n namespaces = split[i].replace(/\\*/g, '.*?')\n\n if (namespaces[0] === '-') {\n createDebug.skips.push(new RegExp('^' + namespaces.substr(1) + '$'))\n } else {\n createDebug.names.push(new RegExp('^' + namespaces + '$'))\n }\n }\n }\n\n /**\n * Disable debug output.\n *\n * @returns {string} namespaces\n */\n function disable (): string {\n const namespaces = [\n ...createDebug.names.map(toNamespace),\n ...createDebug.skips.map(toNamespace).map(namespace => '-' + namespace)\n ].join(',')\n createDebug.enable('')\n return namespaces\n }\n\n /**\n * Returns true if the given mode name is enabled, false otherwise.\n *\n * @param {string} name\n * @returns {boolean}\n */\n function enabled (name: string): boolean {\n if (name[name.length - 1] === '*') {\n return true\n }\n\n let i\n let len\n\n for (i = 0, len = createDebug.skips.length; i < len; i++) {\n if (createDebug.skips[i].test(name)) {\n return false\n }\n }\n\n for (i = 0, len = createDebug.names.length; i < len; i++) {\n if (createDebug.names[i].test(name)) {\n return true\n }\n }\n\n return false\n }\n\n /**\n * Convert regexp to namespace\n */\n function toNamespace (regexp: RegExp): string {\n return regexp.toString()\n .substring(2, regexp.toString().length - 2)\n .replace(/\\.\\*\\?$/, '*')\n }\n\n /**\n * Coerce `val`.\n */\n function coerce (val: any): any {\n if (val instanceof Error) {\n return val.stack ?? val.message\n }\n return val\n }\n\n /**\n * XXX DO NOT USE. This is a temporary stub function.\n * XXX It WILL be removed in the next major release.\n */\n function destroy (): void {\n console.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.')\n }\n\n // @ts-expect-error setupFormatters is not in the types\n createDebug.setupFormatters(createDebug.formatters)\n\n // @ts-expect-error load is not in the types\n createDebug.enable(createDebug.load())\n\n // @ts-expect-error some properties are added dynamically\n return createDebug\n}\n", "/* eslint-disable no-console */\n\n/* eslint-env browser */\n\n/**\n * This is the web browser implementation of `debug()`.\n */\nimport { ms as humanize } from 'ms'\nimport setup from './common.ts'\n\nconst storage = localstorage()\n\n/**\n * Colors.\n */\nconst colors = [\n '#0000CC',\n '#0000FF',\n '#0033CC',\n '#0033FF',\n '#0066CC',\n '#0066FF',\n '#0099CC',\n '#0099FF',\n '#00CC00',\n '#00CC33',\n '#00CC66',\n '#00CC99',\n '#00CCCC',\n '#00CCFF',\n '#3300CC',\n '#3300FF',\n '#3333CC',\n '#3333FF',\n '#3366CC',\n '#3366FF',\n '#3399CC',\n '#3399FF',\n '#33CC00',\n '#33CC33',\n '#33CC66',\n '#33CC99',\n '#33CCCC',\n '#33CCFF',\n '#6600CC',\n '#6600FF',\n '#6633CC',\n '#6633FF',\n '#66CC00',\n '#66CC33',\n '#9900CC',\n '#9900FF',\n '#9933CC',\n '#9933FF',\n '#99CC00',\n '#99CC33',\n '#CC0000',\n '#CC0033',\n '#CC0066',\n '#CC0099',\n '#CC00CC',\n '#CC00FF',\n '#CC3300',\n '#CC3333',\n '#CC3366',\n '#CC3399',\n '#CC33CC',\n '#CC33FF',\n '#CC6600',\n '#CC6633',\n '#CC9900',\n '#CC9933',\n '#CCCC00',\n '#CCCC33',\n '#FF0000',\n '#FF0033',\n '#FF0066',\n '#FF0099',\n '#FF00CC',\n '#FF00FF',\n '#FF3300',\n '#FF3333',\n '#FF3366',\n '#FF3399',\n '#FF33CC',\n '#FF33FF',\n '#FF6600',\n '#FF6633',\n '#FF9900',\n '#FF9933',\n '#FFCC00',\n '#FFCC33'\n]\n\n/**\n * Currently only WebKit-based Web Inspectors, Firefox >= v31,\n * and the Firebug extension (any Firefox version) are known\n * to support \"%c\" CSS customizations.\n *\n * TODO: add a `localStorage` variable to explicitly enable/disable colors\n */\n\n// eslint-disable-next-line complexity\nfunction useColors (): boolean {\n // NB: In an Electron preload script, document will be defined but not fully\n // initialized. Since we know we're in Chrome, we'll just detect this case\n // explicitly\n // @ts-expect-error window.process.type and window.process.__nwjs are not in the types\n if (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) {\n return true\n }\n\n // Internet Explorer and Edge do not support colors.\n if (typeof navigator !== 'undefined' && (navigator.userAgent?.toLowerCase().match(/(edge|trident)\\/(\\d+)/) != null)) {\n return false\n }\n\n // Is webkit? http://stackoverflow.com/a/16459606/376773\n // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632\n // @ts-expect-error document.documentElement.style.WebkitAppearance is not in the types\n return (typeof document !== 'undefined' && document.documentElement?.style?.WebkitAppearance) ||\n // Is firebug? http://stackoverflow.com/a/398120/376773\n // @ts-expect-error window.console.firebug and window.console.exception are not in the types\n (typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||\n // Is firefox >= v31?\n // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages\n (typeof navigator !== 'undefined' && (navigator.userAgent?.toLowerCase().match(/firefox\\/(\\d+)/) != null) && parseInt(RegExp.$1, 10) >= 31) ||\n // Double check webkit in userAgent just in case we are in a worker\n (typeof navigator !== 'undefined' && navigator.userAgent?.toLowerCase().match(/applewebkit\\/(\\d+)/))\n}\n\n/**\n * Colorize log arguments if enabled.\n */\nfunction formatArgs (this: any, args: any[]): void {\n args[0] = (this.useColors ? '%c' : '') +\n this.namespace +\n (this.useColors ? ' %c' : ' ') +\n args[0] +\n (this.useColors ? '%c ' : ' ') +\n '+' + humanize(this.diff)\n\n if (!this.useColors) {\n return\n }\n\n const c = 'color: ' + this.color\n args.splice(1, 0, c, 'color: inherit')\n\n // The final \"%c\" is somewhat tricky, because there could be other\n // arguments passed either before or after the %c, so we need to\n // figure out the correct index to insert the CSS into\n let index = 0\n let lastC = 0\n args[0].replace(/%[a-zA-Z%]/g, (match: string) => {\n if (match === '%%') {\n return\n }\n index++\n if (match === '%c') {\n // We only are interested in the *last* %c\n // (the user may have provided their own)\n lastC = index\n }\n })\n\n args.splice(lastC, 0, c)\n}\n\n/**\n * Invokes `console.debug()` when available.\n * No-op when `console.debug` is not a \"function\".\n * If `console.debug` is not available, falls back\n * to `console.log`.\n */\nconst log = console.debug ?? console.log ?? (() => { })\n\n/**\n * Save `namespaces`.\n *\n * @param {string} namespaces\n */\nfunction save (namespaces: string): void {\n try {\n if (namespaces) {\n storage?.setItem('debug', namespaces)\n } else {\n storage?.removeItem('debug')\n }\n } catch (error) {\n // Swallow\n // XXX (@Qix-) should we be logging these?\n }\n}\n\n/**\n * Load `namespaces`.\n *\n * @returns {string} returns the previously persisted debug modes\n */\nfunction load (): string | null | undefined {\n let r\n try {\n r = storage?.getItem('debug')\n } catch (error) {\n // Swallow\n // XXX (@Qix-) should we be logging these?\n }\n\n // If debug isn't set in LS, and we're in Electron, try to load $DEBUG\n if (!r && typeof globalThis.process !== 'undefined' && 'env' in globalThis.process) {\n r = globalThis.process.env.DEBUG\n }\n\n return r\n}\n\n/**\n * Localstorage attempts to return the localstorage.\n *\n * This is necessary because safari throws\n * when a user disables cookies/localstorage\n * and you attempt to access it.\n */\nfunction localstorage (): Storage | undefined {\n try {\n // TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context\n // The Browser also has localStorage in the global context.\n return localStorage\n } catch (error) {\n // Swallow\n // XXX (@Qix-) should we be logging these?\n }\n}\n\nfunction setupFormatters (formatters: any): void {\n /**\n * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.\n */\n formatters.j = function (v: any) {\n try {\n return JSON.stringify(v)\n } catch (error: any) {\n return '[UnexpectedJSONParseError]: ' + error.message\n }\n }\n}\n\nexport default setup({ formatArgs, save, load, useColors, setupFormatters, colors, storage, log })\n", "/**\n * @packageDocumentation\n *\n * This module is a fork of the [debug](https://www.npmjs.com/package/debug) module. It has been converted to TypeScript and the output is ESM.\n *\n * It is API compatible with no extra features or bug fixes, it should only be used if you want a 100% ESM application.\n *\n * ESM should be arriving in `debug@5.x.x` so this module can be retired after that.\n *\n * Please see [debug](https://www.npmjs.com/package/debug) for API details.\n */\n\n/**\n * Module dependencies.\n */\nimport weald from './node.ts'\nimport type { ms } from 'ms'\n\nexport interface Options {\n /**\n * Receives log lines. The default transport writes the log line to\n * `process.stderr`, `console.debug` or `console.log` depending on what is\n * available in the environment.\n *\n * The args are not formatted - they can be passed to `util.format` from\n * Node.js or to `format` exported from this module as `weald/format`.\n *\n * @example Receiving log lines\n *\n * ```ts\n * import debug from 'weald'\n * import { format } from 'weald/format'\n *\n * const logger = debug('my-namespace', {\n * onLog (...args: any[]) {\n * const line = format(...args)\n * // do something with `line`\n * }\n * })\n * ```\n */\n onLog?(...args: any[]): void\n}\n\nexport interface Debug {\n (namespace: string, options?: Options): Debugger\n coerce(val: any): any\n disable(...args: string[]): string\n enable(namespaces: string | boolean): void\n enabled(namespaces: string): boolean\n formatArgs(this: Debugger, args: any[]): void\n log(fmt: string, ...args: any[]): unknown\n selectColor(namespace: string): string | number\n humanize: typeof ms\n useColors(): boolean\n\n names: RegExp[]\n skips: RegExp[]\n\n formatters: Formatters\n\n inspectOpts?: {\n hideDate?: boolean | number | null\n colors?: boolean | number | null\n depth?: boolean | number | null\n showHidden?: boolean | number | null\n }\n}\n\nexport type Formatters = Record<string, (v: any) => string>\n\nexport interface Debugger {\n (formatter: any, ...args: any[]): void\n\n color: string\n diff: number\n enabled: boolean\n log(fmt: string, ...args: any[]): unknown\n namespace: string\n destroy(): boolean\n extend(namespace: string, delimiter?: string): Debugger\n useColors(): boolean\n}\n\nexport default weald\n", "/**\n * @packageDocumentation\n *\n * A logger for libp2p based on [weald](https://www.npmjs.com/package/weald), a TypeScript port of the venerable [debug](https://www.npmjs.com/package/debug) module.\n *\n * @example\n *\n * ```TypeScript\n * import { logger } from '@libp2p/logger'\n *\n * const log = logger('libp2p:my:component:name')\n *\n * try {\n * // an operation\n * log('something happened: %s', 'it was ok')\n * } catch (err) {\n * log.error('something bad happened: %e', err)\n * }\n *\n * log('with this peer: %p', {})\n * log('and this base58btc: %b', Uint8Array.from([0, 1, 2, 3]))\n * log('and this base32: %t', Uint8Array.from([4, 5, 6, 7]))\n * ```\n *\n * ```console\n * $ DEBUG=libp2p:* node index.js\n * something happened: it was ok\n * something bad happened: <stack trace>\n * with this peer: 12D3Foo\n * with this base58btc: Qmfoo\n * with this base32: bafyfoo\n * ```\n */\n\nimport { base32 } from 'multiformats/bases/base32'\nimport { base58btc } from 'multiformats/bases/base58'\nimport { base64 } from 'multiformats/bases/base64'\nimport debug from 'weald'\nimport { truncatePeerId } from './utils.ts'\nimport type { PeerId, Logger, ComponentLogger } from '@libp2p/interface'\nimport type { Multiaddr } from '@multiformats/multiaddr'\nimport type { Key } from 'interface-datastore'\nimport type { CID } from 'multiformats/cid'\nimport type { Debugger, Options as LoggerOptions } from 'weald'\n\nexport type { LoggerOptions }\n\n// Add a formatter for converting to a base58 string\ndebug.formatters.b = (v?: Uint8Array): string => {\n return v == null ? 'undefined' : base58btc.baseEncode(v)\n}\n\n// Add a formatter for converting to a base32 string\ndebug.formatters.t = (v?: Uint8Array): string => {\n return v == null ? 'undefined' : base32.baseEncode(v)\n}\n\n// Add a formatter for converting to a base64 string\ndebug.formatters.m = (v?: Uint8Array): string => {\n return v == null ? 'undefined' : base64.baseEncode(v)\n}\n\n// Add a formatter for stringifying peer ids\ndebug.formatters.p = (v?: PeerId): string => {\n return v == null ? 'undefined' : v.toString()\n}\n\n// Add a formatter for stringifying CIDs\ndebug.formatters.c = (v?: CID): string => {\n return v == null ? 'undefined' : v.toString()\n}\n\n// Add a formatter for stringifying Datastore keys\ndebug.formatters.k = (v: Key): string => {\n return v == null ? 'undefined' : v.toString()\n}\n\n// Add a formatter for stringifying Multiaddrs\ndebug.formatters.a = (v?: Multiaddr): string => {\n return v == null ? 'undefined' : v.toString()\n}\n\nfunction formatError (v: Error, indent = ''): string {\n const message = notEmpty(v.message)\n const stack = notEmpty(v.stack)\n\n // some browser errors (mostly from Firefox) have no message or no stack,\n // sometimes both, sometimes neither. Sometimes the message is in the stack,\n // sometimes is isn't so try to do *something* useful\n if (message != null && stack != null) {\n if (stack.includes(message)) {\n return `${stack.split('\\n').join(`\\n${indent}`)}`\n }\n\n return `${message}\\n${indent}${stack.split('\\n').join(`\\n${indent}`)}`\n }\n\n if (stack != null) {\n return `${stack.split('\\n').join(`\\n${indent}`)}`\n }\n\n if (message != null) {\n return `${message}`\n }\n\n return `${v.toString()}`\n}\n\nfunction isAggregateError (err?: any): err is AggregateError {\n return err instanceof AggregateError || (err?.name === 'AggregateError' && Array.isArray(err.errors))\n}\n\nfunction printError (err: Error, indent = ''): string {\n if (isAggregateError(err)) {\n let output = formatError(err, indent)\n\n if (err.errors.length > 0) {\n indent = `${indent} `\n\n output += `\\n${indent}${\n err.errors\n .map(err => `${printError(err, `${indent}`)}`)\n .join(`\\n${indent}`)\n }`\n } else {\n output += `\\n${indent}[Error list was empty]`\n }\n\n return output.trim()\n }\n\n return formatError(err, indent)\n}\n\n// Add a formatter for stringifying Errors\ndebug.formatters.e = (v?: Error): string => {\n if (v == null) {\n return 'undefined'\n }\n\n return printError(v)\n}\n\nexport type { Logger, ComponentLogger }\n\nfunction createDisabledLogger (namespace: string): Debugger {\n const logger = (): void => {}\n logger.enabled = false\n logger.color = ''\n logger.diff = 0\n logger.log = (): void => {}\n logger.namespace = namespace\n logger.destroy = () => true\n logger.extend = () => logger\n logger.useColors = () => false\n\n return logger\n}\n\nexport interface PeerLoggerOptions extends LoggerOptions {\n prefixLength?: number\n suffixLength?: number\n}\n\n/**\n * Create a component logger that will prefix any log messages with a truncated\n * peer id.\n *\n * @example\n *\n * ```TypeScript\n * import { peerLogger } from '@libp2p/logger'\n * import { peerIdFromString } from '@libp2p/peer-id'\n *\n * const peerId = peerIdFromString('12D3FooBar')\n * const logger = peerLogger(peerId)\n *\n * const log = logger.forComponent('my-component')\n * log.info('hello world')\n * // logs \"12\u2026oBar:my-component hello world\"\n * ```\n */\nexport function peerLogger (peerId: PeerId, options: PeerLoggerOptions = {}): ComponentLogger {\n return prefixLogger(truncatePeerId(peerId, options), options)\n}\n\n/**\n * Create a component logger that will prefix any log messages with the passed\n * string.\n *\n * @example\n *\n * ```TypeScript\n * import { prefixLogger } from '@libp2p/logger'\n *\n * const logger = prefixLogger('my-node')\n *\n * const log = logger.forComponent('my-component')\n * log.info('hello world')\n * // logs \"my-node:my-component hello world\"\n * ```\n */\nexport function prefixLogger (prefix: string, options?: LoggerOptions): ComponentLogger {\n return {\n forComponent (name: string) {\n return logger(`${prefix}:${name}`, options)\n }\n }\n}\n\n/**\n * Create a component logger\n *\n * @example\n *\n * ```TypeScript\n * import { defaultLogger } from '@libp2p/logger'\n * import { peerIdFromString } from '@libp2p/peer-id'\n *\n * const logger = defaultLogger()\n *\n * const log = logger.forComponent('my-component')\n * log.info('hello world')\n * // logs \"my-component hello world\"\n * ```\n */\nexport function defaultLogger (options?: LoggerOptions): ComponentLogger {\n return {\n forComponent (name: string) {\n return logger(name, options)\n }\n }\n}\n\n/**\n * Creates a logger for the passed component name.\n *\n * @example\n *\n * ```TypeScript\n * import { logger } from '@libp2p/logger'\n *\n * const log = logger('my-component')\n * log.info('hello world')\n * // logs \"my-component hello world\"\n * ```\n */\nexport function logger (name: string, options?: LoggerOptions): Logger {\n // trace logging is a no-op by default\n let trace: Debugger = createDisabledLogger(`${name}:trace`)\n\n // look at all the debug names and see if trace logging has explicitly been enabled\n if (debug.enabled(`${name}:trace`) && debug.names.map((r: any) => r.toString()).find((n: string) => n.includes(':trace')) != null) {\n trace = debug(`${name}:trace`, options)\n }\n\n return Object.assign(debug(name, options), {\n error: debug(`${name}:error`, options),\n trace,\n newScope: (scope: string) => logger(`${name}:${scope}`, options)\n })\n}\n\nexport function disable (): void {\n debug.disable()\n}\n\nexport function enable (namespaces: string): void {\n debug.enable(namespaces)\n}\n\nexport function enabled (namespaces: string): boolean {\n return debug.enabled(namespaces)\n}\n\nfunction notEmpty (str?: string): string | undefined {\n if (str == null) {\n return\n }\n\n str = str.trim()\n\n if (str.length === 0) {\n return\n }\n\n return str\n}\n", "export default function pDefer() {\n\tconst deferred = {};\n\n\tdeferred.promise = new Promise((resolve, reject) => {\n\t\tdeferred.resolve = resolve;\n\t\tdeferred.reject = reject;\n\t});\n\n\treturn deferred;\n}\n", "/**\n * @packageDocumentation\n *\n * Pass a promise and an abort signal and await the result.\n *\n * @example Basic usage\n *\n * ```ts\n * import { raceSignal } from 'race-signal'\n *\n * const controller = new AbortController()\n *\n * const promise = new Promise((resolve, reject) => {\n * setTimeout(() => {\n * resolve('a value')\n * }, 1000)\n * })\n *\n * setTimeout(() => {\n * controller.abort()\n * }, 500)\n *\n * // throws an AbortError\n * const resolve = await raceSignal(promise, controller.signal)\n * ```\n *\n * @example Overriding errors\n *\n * By default the thrown error is the `.reason` property of the signal but it's\n * possible to override this behaviour with the `translateError` option:\n *\n * ```ts\n * import { raceSignal } from 'race-signal'\n *\n * const controller = new AbortController()\n *\n * const promise = new Promise((resolve, reject) => {\n * setTimeout(() => {\n * resolve('a value')\n * }, 1000)\n * })\n *\n * setTimeout(() => {\n * controller.abort()\n * }, 500)\n *\n * // throws `Error('Oh no!')`\n * const resolve = await raceSignal(promise, controller.signal, {\n * translateError: (signal) => {\n * // use `signal`, or don't\n * return new Error('Oh no!')\n * }\n * })\n * ```\n */\n\nexport interface RaceSignalOptions {\n /**\n * By default the rejection reason will be taken from the `.reason` field of\n * the aborted signal.\n *\n * Passing a function here allows overriding the default error.\n */\n translateError?(signal: AbortSignal): Error\n}\n\nfunction defaultTranslate (signal: AbortSignal): Error {\n return signal.reason\n}\n\n/**\n * Race a promise against an abort signal\n */\nexport async function raceSignal <T> (promise: Promise<T>, signal?: AbortSignal, opts?: RaceSignalOptions): Promise<T> {\n if (signal == null) {\n return promise\n }\n\n const translateError = opts?.translateError ?? defaultTranslate\n\n if (signal.aborted) {\n // the passed promise may yet resolve or reject but the use has signalled\n // they are no longer interested so smother the error\n promise.catch(() => {})\n return Promise.reject(translateError(signal))\n }\n\n let listener\n\n try {\n return await Promise.race([\n promise,\n new Promise<T>((resolve, reject) => {\n listener = () => {\n reject(translateError(signal))\n }\n signal.addEventListener('abort', listener)\n })\n ])\n } finally {\n if (listener != null) {\n signal.removeEventListener('abort', listener)\n }\n }\n}\n", "import { logger } from '@libp2p/logger'\nimport { NotFoundError } from 'interface-store'\nimport filter from 'it-filter'\nimport merge from 'it-merge'\nimport { BaseBlockstore } from './base.ts'\nimport type { AbortOptions } from 'abort-error'\nimport type { Blockstore, InputPair, Pair } from 'interface-blockstore'\nimport type { CID } from 'multiformats/cid'\n\nconst log = logger('blockstore:core:tiered')\n\n/**\n * A blockstore that can combine multiple stores. Puts and deletes\n * will write through to all blockstores. Has and get will\n * try each store sequentially. getAll will use every store but also\n * deduplicate any yielded pairs.\n */\nexport class TieredBlockstore extends BaseBlockstore {\n private readonly stores: Blockstore[]\n\n constructor (stores: Blockstore[]) {\n super()\n\n this.stores = stores.slice()\n }\n\n async put (key: CID, value: Uint8Array | Iterable<Uint8Array> | AsyncIterable<Uint8Array>, options?: AbortOptions): Promise<CID> {\n await Promise.all(\n this.stores.map(async store => {\n await store.put(key, value, options)\n })\n )\n\n return key\n }\n\n async * get (key: CID, options?: AbortOptions): Generator<Uint8Array> | AsyncGenerator<Uint8Array> {\n let error: Error | undefined\n\n for (const store of this.stores) {\n try {\n yield * store.get(key, options)\n return\n } catch (err: any) {\n error = err\n log.error(err)\n }\n }\n\n throw error ?? new NotFoundError()\n }\n\n async has (key: CID, options?: AbortOptions): Promise<boolean> {\n for (const s of this.stores) {\n if (await s.has(key, options)) {\n return true\n }\n }\n\n return false\n }\n\n async delete (key: CID, options?: AbortOptions): Promise<void> {\n await Promise.all(\n this.stores.map(async store => {\n await store.delete(key, options)\n })\n )\n }\n\n async * putMany (source: Iterable<InputPair> | AsyncIterable<InputPair>, options: AbortOptions = {}): Generator<CID> | AsyncGenerator<CID> {\n for await (const pair of source) {\n await this.put(pair.cid, pair.bytes, options)\n yield pair.cid\n }\n }\n\n async * deleteMany (source: Iterable<CID> | AsyncIterable<CID>, options: AbortOptions = {}): Generator<CID> | AsyncGenerator<CID> {\n for await (const cid of source) {\n await this.delete(cid, options)\n yield cid\n }\n }\n\n async * getAll (options?: AbortOptions): Generator<Pair> | AsyncGenerator<Pair> {\n // deduplicate yielded pairs\n const seen = new Set<string>()\n\n yield * filter(merge(...this.stores.map(s => s.getAll(options))), (pair) => {\n const cidStr = pair.cid.toString()\n\n if (seen.has(cidStr)) {\n return false\n }\n\n seen.add(cidStr)\n\n return true\n })\n }\n}\n", "import { Key } from 'interface-datastore/key'\nimport type { Shard } from './index.ts'\nimport type { Datastore } from 'interface-datastore'\n\nexport const PREFIX = '/repo/flatfs/shard/'\nexport const SHARDING_FN = 'SHARDING'\n\nexport class ShardBase implements Shard {\n public param: number\n public name: string\n public _padding: string\n\n constructor (param: number) {\n this.param = param\n this.name = 'base'\n this._padding = ''\n }\n\n fun (s: string): string {\n return 'implement me'\n }\n\n toString (): string {\n return `${PREFIX}v1/${this.name}/${this.param}`\n }\n}\n\nexport class Prefix extends ShardBase {\n constructor (prefixLen: number) {\n super(prefixLen)\n this._padding = ''.padStart(prefixLen, '_')\n this.name = 'prefix'\n }\n\n fun (noslash: string): string {\n return (noslash + this._padding).slice(0, this.param)\n }\n}\n\nexport class Suffix extends ShardBase {\n constructor (suffixLen: number) {\n super(suffixLen)\n\n this._padding = ''.padStart(suffixLen, '_')\n this.name = 'suffix'\n }\n\n fun (noslash: string): string {\n const s = this._padding + noslash\n return s.slice(s.length - this.param)\n }\n}\n\nexport class NextToLast extends ShardBase {\n constructor (suffixLen: number) {\n super(suffixLen)\n this._padding = ''.padStart(suffixLen + 1, '_')\n this.name = 'next-to-last'\n }\n\n fun (noslash: string): string {\n const s = this._padding + noslash\n const offset = s.length - this.param - 1\n return s.slice(offset, offset + this.param)\n }\n}\n\n/**\n * Convert a given string to the matching sharding function\n */\nexport function parseShardFun (str: string): Shard {\n str = str.trim()\n\n if (str.length === 0) {\n throw new Error('empty shard string')\n }\n\n if (!str.startsWith(PREFIX)) {\n throw new Error(`invalid or no path prefix: ${str}`)\n }\n\n const parts = str.slice(PREFIX.length).split('/')\n const version = parts[0]\n\n if (version !== 'v1') {\n throw new Error(`expect 'v1' version, got '${version}'`)\n }\n\n const name = parts[1]\n\n if (parts[2] == null || parts[2] === '') {\n throw new Error('missing param')\n }\n\n const param = parseInt(parts[2], 10)\n\n switch (name) {\n case 'prefix':\n return new Prefix(param)\n case 'suffix':\n return new Suffix(param)\n case 'next-to-last':\n return new NextToLast(param)\n default:\n throw new Error(`unkown sharding function: ${name}`)\n }\n}\n\nexport const readShardFun = async (path: string | Uint8Array, store: Datastore): Promise<Shard> => {\n const key = new Key(path).child(new Key(SHARDING_FN))\n // @ts-expect-error not all stores have this\n const get = typeof store.getRaw === 'function' ? store.getRaw.bind(store) : store.get.bind(store)\n const res = await get(key)\n return parseShardFun(new TextDecoder().decode(res ?? '').trim())\n}\n", "// ported from https://www.npmjs.com/package/fast-fifo\n\nexport interface Next<T> {\n done?: boolean\n error?: Error\n value?: T\n}\n\nclass FixedFIFO<T> {\n public buffer: Array<Next<T> | undefined>\n private readonly mask: number\n private top: number\n private btm: number\n public next: FixedFIFO<T> | null\n\n constructor (hwm: number) {\n if (!(hwm > 0) || ((hwm - 1) & hwm) !== 0) {\n throw new Error('Max size for a FixedFIFO should be a power of two')\n }\n\n this.buffer = new Array(hwm)\n this.mask = hwm - 1\n this.top = 0\n this.btm = 0\n this.next = null\n }\n\n push (data: Next<T>): boolean {\n if (this.buffer[this.top] !== undefined) {\n return false\n }\n\n this.buffer[this.top] = data\n this.top = (this.top + 1) & this.mask\n\n return true\n }\n\n shift (): Next<T> | undefined {\n const last = this.buffer[this.btm]\n\n if (last === undefined) {\n return undefined\n }\n\n this.buffer[this.btm] = undefined\n this.btm = (this.btm + 1) & this.mask\n return last\n }\n\n isEmpty (): boolean {\n return this.buffer[this.btm] === undefined\n }\n}\n\nexport interface FIFOOptions {\n /**\n * When the queue reaches this size, it will be split into head/tail parts\n */\n splitLimit?: number\n}\n\nexport class FIFO<T> {\n public size: number\n private readonly hwm: number\n private head: FixedFIFO<T>\n private tail: FixedFIFO<T>\n\n constructor (options: FIFOOptions = {}) {\n this.hwm = options.splitLimit ?? 16\n this.head = new FixedFIFO<T>(this.hwm)\n this.tail = this.head\n this.size = 0\n }\n\n calculateSize (obj: any): number {\n if (obj?.byteLength != null) {\n return obj.byteLength\n }\n\n return 1\n }\n\n push (val: Next<T>): void {\n if (val?.value != null) {\n this.size += this.calculateSize(val.value)\n }\n\n if (!this.head.push(val)) {\n const prev = this.head\n this.head = prev.next = new FixedFIFO<T>(2 * this.head.buffer.length)\n this.head.push(val)\n }\n }\n\n shift (): Next<T> | undefined {\n let val = this.tail.shift()\n\n if (val === undefined && (this.tail.next != null)) {\n const next = this.tail.next\n this.tail.next = null\n this.tail = next\n val = this.tail.shift()\n }\n\n if (val?.value != null) {\n this.size -= this.calculateSize(val.value)\n }\n\n return val\n }\n\n isEmpty (): boolean {\n return this.head.isEmpty()\n }\n}\n", "/**\n * @packageDocumentation\n *\n * An iterable that you can push values into.\n *\n * @example\n *\n * ```js\n * import { pushable } from 'it-pushable'\n *\n * const source = pushable()\n *\n * setTimeout(() => source.push('hello'), 100)\n * setTimeout(() => source.push('world'), 200)\n * setTimeout(() => source.end(), 300)\n *\n * const start = Date.now()\n *\n * for await (const value of source) {\n * console.log(`got \"${value}\" after ${Date.now() - start}ms`)\n * }\n * console.log(`done after ${Date.now() - start}ms`)\n *\n * // Output:\n * // got \"hello\" after 105ms\n * // got \"world\" after 207ms\n * // done after 309ms\n * ```\n *\n * @example\n *\n * ```js\n * import { pushableV } from 'it-pushable'\n * import all from 'it-all'\n *\n * const source = pushableV()\n *\n * source.push(1)\n * source.push(2)\n * source.push(3)\n * source.end()\n *\n * console.info(await all(source))\n *\n * // Output:\n * // [ [1, 2, 3] ]\n * ```\n */\n\nimport deferred from 'p-defer'\nimport { FIFO } from './fifo.ts'\nimport type { Next } from './fifo.ts'\n\nexport class AbortError extends Error {\n type: string\n code: string\n\n constructor (message?: string, code?: string) {\n super(message ?? 'The operation was aborted')\n this.type = 'aborted'\n this.code = code ?? 'ABORT_ERR'\n }\n}\n\nexport interface AbortOptions {\n signal?: AbortSignal\n}\n\ninterface BasePushable<T> {\n /**\n * End the iterable after all values in the buffer (if any) have been yielded. If an\n * error is passed the buffer is cleared immediately and the next iteration will\n * throw the passed error\n */\n end(err?: Error): this\n\n /**\n * Push a value into the iterable. Values are yielded from the iterable in the order\n * they are pushed. Values not yet consumed from the iterable are buffered.\n */\n push(value: T): this\n\n /**\n * Returns a promise that resolves when the underlying queue becomes empty (e.g.\n * this.readableLength === 0).\n *\n * If an AbortSignal is passed as an option and that signal aborts, it only\n * causes the returned promise to reject - it does not end the pushable.\n */\n onEmpty(options?: AbortOptions): Promise<void>\n\n /**\n * This property contains the number of bytes (or objects) in the queue ready to be read.\n *\n * If `objectMode` is true, this is the number of objects in the queue, if false it's the\n * total number of bytes in the queue.\n */\n readableLength: number\n}\n\n/**\n * An iterable that you can push values into.\n */\nexport interface Pushable<T, R = void, N = unknown> extends AsyncGenerator<T, R, N>, BasePushable<T> {}\n\n/**\n * Similar to `pushable`, except it yields multiple buffered chunks at a time. All values yielded from the iterable will be arrays.\n */\nexport interface PushableV<T, R = void, N = unknown> extends AsyncGenerator<T[], R, N>, BasePushable<T> {}\n\nexport interface Options {\n /**\n * A boolean value that means non-`Uint8Array`s will be passed to `.push`, default: `false`\n */\n objectMode?: boolean\n\n /**\n * A function called after *all* values have been yielded from the iterator (including\n * buffered values). In the case when the iterator is ended with an error it will be\n * passed the error as a parameter.\n */\n onEnd?(err?: Error): void\n}\n\nexport interface DoneResult { done: true }\nexport interface ValueResult<T> { done: false, value: T }\nexport type NextResult<T> = ValueResult<T> | DoneResult\n\ninterface getNext<T, V = T> { (buffer: FIFO<T>): NextResult<V> }\n\nexport interface ObjectPushableOptions extends Options {\n objectMode: true\n}\n\nexport interface BytePushableOptions extends Options {\n objectMode?: false\n}\n\n/**\n * Create a new async iterable. The values yielded from calls to `.next()`\n * or when used in a `for await of`loop are \"pushed\" into the iterable.\n * Returns an async iterable object with additional methods.\n */\nexport function pushable<T extends { byteLength: number } = Uint8Array> (options?: BytePushableOptions): Pushable<T>\nexport function pushable<T> (options: ObjectPushableOptions): Pushable<T>\nexport function pushable<T> (options: Options = {}): Pushable<T> {\n const getNext = (buffer: FIFO<T>): NextResult<T> => {\n const next: Next<T> | undefined = buffer.shift()\n\n if (next == null) {\n return { done: true }\n }\n\n if (next.error != null) {\n throw next.error\n }\n\n return {\n done: next.done === true,\n // @ts-expect-error if done is false, value will be present\n value: next.value\n }\n }\n\n return _pushable<T, T, Pushable<T>>(getNext, options)\n}\n\nexport function pushableV<T extends { byteLength: number } = Uint8Array> (options?: BytePushableOptions): PushableV<T>\nexport function pushableV<T> (options: ObjectPushableOptions): PushableV<T>\nexport function pushableV<T> (options: Options = {}): PushableV<T> {\n const getNext = (buffer: FIFO<T>): NextResult<T[]> => {\n let next: Next<T> | undefined\n const values: T[] = []\n\n while (!buffer.isEmpty()) {\n next = buffer.shift()\n\n if (next == null) {\n break\n }\n\n if (next.error != null) {\n throw next.error\n }\n\n if (next.done === false) {\n // @ts-expect-error if done is false value should be pushed\n values.push(next.value)\n }\n }\n\n if (next == null) {\n return { done: true }\n }\n\n return {\n done: next.done === true,\n value: values\n }\n }\n\n return _pushable<T, T[], PushableV<T>>(getNext, options)\n}\n\nfunction _pushable<PushType, ValueType, ReturnType> (getNext: getNext<PushType, ValueType>, options?: Options): ReturnType {\n options = options ?? {}\n let onEnd = options.onEnd\n let buffer = new FIFO<PushType>()\n let pushable: any\n let onNext: ((next: Next<PushType>) => ReturnType) | null\n let ended: boolean\n let drain = deferred()\n\n const waitNext = async (): Promise<NextResult<ValueType>> => {\n try {\n if (!buffer.isEmpty()) {\n return getNext(buffer)\n }\n\n if (ended) {\n return { done: true }\n }\n\n return await new Promise<NextResult<ValueType>>((resolve, reject) => {\n onNext = (next: Next<PushType>) => {\n onNext = null\n buffer.push(next)\n\n try {\n resolve(getNext(buffer))\n } catch (err) {\n reject(err)\n }\n\n return pushable\n }\n })\n } finally {\n if (buffer.isEmpty()) {\n // settle promise in the microtask queue to give consumers a chance to\n // await after calling .push\n queueMicrotask(() => {\n drain.resolve()\n drain = deferred()\n })\n }\n }\n }\n\n const bufferNext = (next: Next<PushType>): ReturnType => {\n if (onNext != null) {\n return onNext(next)\n }\n\n buffer.push(next)\n return pushable\n }\n\n const bufferError = (err: Error): ReturnType => {\n buffer = new FIFO()\n\n if (onNext != null) {\n return onNext({ error: err })\n }\n\n buffer.push({ error: err })\n return pushable\n }\n\n const push = (value: PushType): ReturnType => {\n if (ended) {\n return pushable\n }\n\n // @ts-expect-error `byteLength` is not declared on PushType\n if (options?.objectMode !== true && value?.byteLength == null) {\n throw new Error('objectMode was not true but tried to push non-Uint8Array value')\n }\n\n return bufferNext({ done: false, value })\n }\n const end = (err?: Error): ReturnType => {\n if (ended) { return pushable }\n ended = true\n\n return (err != null) ? bufferError(err) : bufferNext({ done: true })\n }\n const _return = (): DoneResult => {\n buffer = new FIFO()\n end()\n\n return { done: true }\n }\n const _throw = (err: Error): DoneResult => {\n end(err)\n\n return { done: true }\n }\n\n pushable = {\n [Symbol.asyncIterator] () { return this },\n next: waitNext,\n return: _return,\n throw: _throw,\n push,\n end,\n get readableLength (): number {\n return buffer.size\n },\n onEmpty: async (options?: AbortOptions) => {\n const signal = options?.signal\n signal?.throwIfAborted()\n\n if (buffer.isEmpty()) {\n return\n }\n\n let cancel: Promise<void> | undefined\n let listener: (() => void) | undefined\n\n if (signal != null) {\n cancel = new Promise((resolve, reject) => {\n listener = () => {\n reject(new AbortError())\n }\n\n signal.addEventListener('abort', listener)\n })\n }\n\n try {\n await Promise.race([\n drain.promise,\n cancel\n ])\n } finally {\n if (listener != null && signal != null) {\n signal?.removeEventListener('abort', listener)\n }\n }\n }\n }\n\n if (onEnd == null) {\n return pushable\n }\n\n const _pushable = pushable\n\n pushable = {\n [Symbol.asyncIterator] () { return this },\n next () {\n return _pushable.next()\n },\n throw (err: Error) {\n _pushable.throw(err)\n\n if (onEnd != null) {\n onEnd(err)\n onEnd = undefined\n }\n\n return { done: true }\n },\n return () {\n _pushable.return()\n\n if (onEnd != null) {\n onEnd()\n onEnd = undefined\n }\n\n return { done: true }\n },\n push,\n end (err: Error) {\n _pushable.end(err)\n\n if (onEnd != null) {\n onEnd(err)\n onEnd = undefined\n }\n\n return pushable\n },\n get readableLength () {\n return _pushable.readableLength\n },\n onEmpty: (opts?: AbortOptions) => {\n return _pushable.onEmpty(opts)\n }\n }\n\n return pushable\n}\n", "import { Key } from 'interface-datastore'\nimport { OpenFailedError } from 'interface-store'\nimport { BaseDatastore } from './base.ts'\nimport { KeyTransformDatastore } from './keytransform.ts'\nimport {\n readShardFun,\n SHARDING_FN\n} from './shard.ts'\nimport type { Shard } from './index.ts'\nimport type { AbortOptions } from 'abort-error'\nimport type { Batch, KeyQuery, KeyQueryFilter, Pair, Query, QueryFilter, Datastore } from 'interface-datastore'\n\nconst shardKey = new Key(SHARDING_FN)\n\n/**\n * Backend independent abstraction of go-ds-flatfs.\n *\n * Wraps another datastore such that all values are stored\n * sharded according to the given sharding function.\n */\nexport class ShardingDatastore extends BaseDatastore {\n private readonly child: KeyTransformDatastore\n private shard: Shard\n\n constructor (store: Datastore, shard: Shard) {\n super()\n\n this.child = new KeyTransformDatastore(store, {\n convert: this._convertKey.bind(this),\n invert: this._invertKey.bind(this)\n })\n this.shard = shard\n }\n\n async open (): Promise<void> {\n this.shard = await ShardingDatastore.create(this.child, this.shard)\n }\n\n _convertKey (key: Key): Key {\n const s = key.toString()\n if (s === shardKey.toString()) {\n return key\n }\n\n const parent = new Key(this.shard.fun(s))\n return parent.child(key)\n }\n\n _invertKey (key: Key): Key {\n const s = key.toString()\n if (s === shardKey.toString()) {\n return key\n }\n return Key.withNamespaces(key.list().slice(1))\n }\n\n static async create (store: Datastore, shard?: Shard): Promise<Shard> {\n const hasShard = await store.has(shardKey)\n\n if (!hasShard) {\n if (shard == null) {\n throw new OpenFailedError('Shard is required when datastore doesn\\'t have a shard key already')\n }\n\n await store.put(shardKey, new TextEncoder().encode(shard.toString() + '\\n'))\n }\n\n if (shard == null) {\n shard = await readShardFun('/', store)\n }\n\n // test shards\n const diskShard = await readShardFun('/', store)\n const a = diskShard.toString()\n const b = shard.toString()\n\n if (a !== b) {\n throw new Error(`specified fun ${b} does not match repo shard fun ${a}`)\n }\n\n return diskShard\n }\n\n async put (key: Key, val: Uint8Array, options?: AbortOptions): Promise<Key> {\n await this.child.put(key, val, options)\n\n return key\n }\n\n async get (key: Key, options?: AbortOptions): Promise<Uint8Array> {\n return this.child.get(key, options)\n }\n\n async has (key: Key, options?: AbortOptions): Promise<boolean> {\n return this.child.has(key, options)\n }\n\n async delete (key: Key, options?: AbortOptions): Promise<void> {\n await this.child.delete(key, options)\n }\n\n async * putMany (source: Iterable<Pair> | AsyncIterable<Pair>, options: AbortOptions = {}): Generator<Key> | AsyncGenerator<Key> {\n yield * this.child.putMany(source, options)\n }\n\n async * getMany (source: Iterable<Key> | AsyncIterable<Key>, options: AbortOptions = {}): Generator<Pair> | AsyncGenerator<Pair> {\n yield * this.child.getMany(source, options)\n }\n\n async * deleteMany (source: Iterable<Key> | AsyncIterable<Key>, options: AbortOptions = {}): Generator<Key> | AsyncGenerator<Key> {\n yield * this.child.deleteMany(source, options)\n }\n\n batch (): Batch {\n return this.child.batch()\n }\n\n query (q: Query, options?: AbortOptions): Generator<Pair> | AsyncGenerator<Pair> {\n const omitShard: QueryFilter = ({ key }) => key.toString() !== shardKey.toString()\n\n const tq: Query = {\n ...q,\n filters: [\n omitShard\n ].concat(q.filters ?? [])\n }\n\n return this.child.query(tq, options)\n }\n\n queryKeys (q: KeyQuery, options?: AbortOptions): Generator<Key> | AsyncGenerator<Key> {\n const omitShard: KeyQueryFilter = (key) => key.toString() !== shardKey.toString()\n\n const tq: KeyQuery = {\n ...q,\n filters: [\n omitShard\n ].concat(q.filters ?? [])\n }\n\n return this.child.queryKeys(tq, options)\n }\n}\n", "import { logger } from '@libp2p/logger'\nimport { NotFoundError } from 'interface-store'\nimport { BaseDatastore } from './base.ts'\nimport type { AbortOptions } from 'abort-error'\nimport type { Batch, Datastore, Key, KeyQuery, Pair, Query } from 'interface-datastore'\n\nconst log = logger('datastore:core:tiered')\n\n/**\n * A datastore that can combine multiple stores. Puts and deletes\n * will write through to all datastores. Has and get will\n * try each store sequentially. Query will always try the\n * last one first.\n *\n */\nexport class TieredDatastore extends BaseDatastore {\n private readonly stores: Datastore[]\n\n constructor (stores: Datastore[]) {\n super()\n\n this.stores = stores.slice()\n }\n\n async put (key: Key, value: Uint8Array, options?: AbortOptions): Promise<Key> {\n await Promise.all(\n this.stores.map(async store => {\n await store.put(key, value, options)\n })\n )\n\n return key\n }\n\n async get (key: Key, options?: AbortOptions): Promise<Uint8Array> {\n let error: Error | undefined\n\n for (const store of this.stores) {\n try {\n const res = await store.get(key, options)\n\n if (res != null) {\n return res\n }\n } catch (err: any) {\n error = err\n log.error(err)\n }\n }\n\n throw error ?? new NotFoundError()\n }\n\n async has (key: Key, options?: AbortOptions): Promise<boolean> {\n for (const s of this.stores) {\n if (await s.has(key, options)) {\n return true\n }\n }\n\n return false\n }\n\n async delete (key: Key, options?: AbortOptions): Promise<void> {\n await Promise.all(\n this.stores.map(async store => {\n await store.delete(key, options)\n })\n )\n }\n\n async * putMany (source: Iterable<Pair> | AsyncIterable<Pair>, options: AbortOptions = {}): Generator<Key> | AsyncGenerator<Key> {\n for await (const pair of source) {\n await this.put(pair.key, pair.value, options)\n yield pair.key\n }\n }\n\n async * deleteMany (source: Iterable<Key> | AsyncIterable<Key>, options: AbortOptions = {}): Generator<Key> | AsyncGenerator<Key> {\n for await (const key of source) {\n await this.delete(key, options)\n yield key\n }\n }\n\n batch (): Batch {\n const batches = this.stores.map(store => store.batch())\n\n return {\n put: (key, value) => {\n batches.forEach(b => { b.put(key, value) })\n },\n delete: (key) => {\n batches.forEach(b => { b.delete(key) })\n },\n commit: async (options) => {\n for (const batch of batches) {\n await batch.commit(options)\n }\n }\n }\n }\n\n query (q: Query, options?: AbortOptions): Generator<Pair> | AsyncGenerator<Pair> {\n return this.stores[this.stores.length - 1].query(q, options)\n }\n\n queryKeys (q: KeyQuery, options?: AbortOptions): Generator<Key> | AsyncGenerator<Key> {\n return this.stores[this.stores.length - 1].queryKeys(q, options)\n }\n}\n", "// FNV_PRIMES and FNV_OFFSETS from\n// http://www.isthe.com/chongo/tech/comp/fnv/index.html#FNV-param\n\nconst FNV_PRIMES = {\n\t32: 16_777_619n,\n\t64: 1_099_511_628_211n,\n\t128: 309_485_009_821_345_068_724_781_371n,\n\t256: 374_144_419_156_711_147_060_143_317_175_368_453_031_918_731_002_211n,\n\t512: 35_835_915_874_844_867_368_919_076_489_095_108_449_946_327_955_754_392_558_399_825_615_420_669_938_882_575_126_094_039_892_345_713_852_759n,\n\t1024: 5_016_456_510_113_118_655_434_598_811_035_278_955_030_765_345_404_790_744_303_017_523_831_112_055_108_147_451_509_157_692_220_295_382_716_162_651_878_526_895_249_385_292_291_816_524_375_083_746_691_371_804_094_271_873_160_484_737_966_720_260_389_217_684_476_157_468_082_573n,\n};\n\nconst FNV_OFFSETS = {\n\t32: 2_166_136_261n,\n\t64: 14_695_981_039_346_656_037n,\n\t128: 144_066_263_297_769_815_596_495_629_667_062_367_629n,\n\t256: 100_029_257_958_052_580_907_070_968_620_625_704_837_092_796_014_241_193_945_225_284_501_741_471_925_557n,\n\t512: 9_659_303_129_496_669_498_009_435_400_716_310_466_090_418_745_672_637_896_108_374_329_434_462_657_994_582_932_197_716_438_449_813_051_892_206_539_805_784_495_328_239_340_083_876_191_928_701_583_869_517_785n,\n\t1024: 14_197_795_064_947_621_068_722_070_641_403_218_320_880_622_795_441_933_960_878_474_914_617_582_723_252_296_732_303_717_722_150_864_096_521_202_355_549_365_628_174_669_108_571_814_760_471_015_076_148_029_755_969_804_077_320_157_692_458_563_003_215_304_957_150_157_403_644_460_363_550_505_412_711_285_966_361_610_267_868_082_893_823_963_790_439_336_411_086_884_584_107_735_010_676_915n,\n};\n\nconst cachedEncoder = new globalThis.TextEncoder();\n\nfunction fnv1aUint8Array(uint8Array, size) {\n\tconst fnvPrime = FNV_PRIMES[size];\n\tlet hash = FNV_OFFSETS[size];\n\n\t// eslint-disable-next-line unicorn/no-for-loop -- This is a performance-sensitive loop\n\tfor (let index = 0; index < uint8Array.length; index++) {\n\t\thash ^= BigInt(uint8Array[index]);\n\t\thash = BigInt.asUintN(size, hash * fnvPrime);\n\t}\n\n\treturn hash;\n}\n\nfunction fnv1aEncodeInto(string, size, utf8Buffer) {\n\tif (utf8Buffer.length === 0) {\n\t\tthrow new Error('The `utf8Buffer` option must have a length greater than zero');\n\t}\n\n\tconst fnvPrime = FNV_PRIMES[size];\n\tlet hash = FNV_OFFSETS[size];\n\tlet remaining = string;\n\n\twhile (remaining.length > 0) {\n\t\tconst result = cachedEncoder.encodeInto(remaining, utf8Buffer);\n\t\tremaining = remaining.slice(result.read);\n\t\tfor (let index = 0; index < result.written; index++) {\n\t\t\thash ^= BigInt(utf8Buffer[index]);\n\t\t\thash = BigInt.asUintN(size, hash * fnvPrime);\n\t\t}\n\t}\n\n\treturn hash;\n}\n\nexport default function fnv1a(value, {size = 32, utf8Buffer} = {}) {\n\tif (!FNV_PRIMES[size]) {\n\t\tthrow new Error('The `size` option must be one of 32, 64, 128, 256, 512, or 1024');\n\t}\n\n\tif (typeof value === 'string') {\n\t\tif (utf8Buffer) {\n\t\t\treturn fnv1aEncodeInto(value, size, utf8Buffer);\n\t\t}\n\n\t\tvalue = cachedEncoder.encode(value);\n\t}\n\n\treturn fnv1aUint8Array(value, size);\n}\n", "import fnv1aHash from '@sindresorhus/fnv1a'\nimport { fromString as uint8ArrayFromString } from 'uint8arrays/from-string'\n\nexport interface Hash {\n hash(input: Uint8Array, seed: number): number\n hashV(input: Uint8Array, seed: number): Uint8Array\n}\n\nexport const fnv1a: Hash = {\n hash: (input) => {\n return Number(fnv1aHash(input, {\n size: 32\n }))\n },\n hashV: (input, seed) => {\n return numberToBuffer(fnv1a.hash(input, seed))\n }\n}\n\nexport function numberToBuffer (num: bigint | number): Uint8Array {\n let hex = num.toString(16)\n\n if (hex.length % 2 === 1) {\n hex = `0${hex}`\n }\n\n return uint8ArrayFromString(hex, 'base16')\n}\n", "import { alloc as uint8ArrayAlloc } from 'uint8arrays/alloc'\nimport { equals as uint8ArrayEquals } from 'uint8arrays/equals'\nimport type { Hash } from './hashes.ts'\n\nexport const MAX_FINGERPRINT_SIZE = 64\n\nexport class Fingerprint {\n private readonly fp: Uint8Array\n private readonly h: Hash\n private readonly seed: number\n\n constructor (buf: Uint8Array, hash: Hash, seed: number, fingerprintSize: number = 2) {\n if (fingerprintSize > MAX_FINGERPRINT_SIZE) {\n throw new TypeError('Invalid Fingerprint Size')\n }\n\n const fnv = hash.hashV(buf, seed)\n const fp = uint8ArrayAlloc(fingerprintSize)\n\n for (let i = 0; i < fp.length; i++) {\n fp[i] = fnv[i]\n }\n\n if (fp.length === 0) {\n fp[0] = 7\n }\n\n this.fp = fp\n this.h = hash\n this.seed = seed\n }\n\n hash (): number {\n return this.h.hash(this.fp, this.seed)\n }\n\n equals (other?: any): boolean {\n if (!(other?.fp instanceof Uint8Array)) {\n return false\n }\n\n return uint8ArrayEquals(this.fp, other.fp)\n }\n}\n", "export function getRandomInt (min: number, max: number): number {\n return Math.floor(Math.random() * (max - min)) + min\n}\n", "import { Fingerprint } from './fingerprint.ts'\nimport { getRandomInt } from './utils.ts'\n\nexport class Bucket {\n private readonly contents: Array<Fingerprint | null>\n\n constructor (size: number) {\n this.contents = new Array(size).fill(null)\n }\n\n has (fingerprint: Fingerprint): boolean {\n if (!(fingerprint instanceof Fingerprint)) {\n throw new TypeError('Invalid Fingerprint')\n }\n\n return this.contents.some((fp) => {\n return fingerprint.equals(fp)\n })\n }\n\n add (fingerprint: Fingerprint): boolean {\n if (!(fingerprint instanceof Fingerprint)) {\n throw new TypeError('Invalid Fingerprint')\n }\n\n for (let i = 0; i < this.contents.length; i++) {\n if (this.contents[i] == null) {\n this.contents[i] = fingerprint\n return true\n }\n }\n\n return true\n }\n\n swap (fingerprint: Fingerprint): Fingerprint | null {\n if (!(fingerprint instanceof Fingerprint)) {\n throw new TypeError('Invalid Fingerprint')\n }\n\n const i = getRandomInt(0, this.contents.length - 1)\n const current = this.contents[i]\n this.contents[i] = fingerprint\n\n return current\n }\n\n remove (fingerprint: Fingerprint): boolean {\n if (!(fingerprint instanceof Fingerprint)) {\n throw new TypeError('Invalid Fingerprint')\n }\n\n const found = this.contents.findIndex((fp) => {\n return fingerprint.equals(fp)\n })\n\n if (found > -1) {\n this.contents[found] = null\n return true\n } else {\n return false\n }\n }\n}\n", "import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string'\nimport { Bucket } from './bucket.ts'\nimport { Fingerprint, MAX_FINGERPRINT_SIZE } from './fingerprint.ts'\nimport { fnv1a } from './hashes.ts'\nimport { getRandomInt } from './utils.ts'\nimport type { Hash } from './hashes.ts'\nimport type { Filter } from './index.ts'\n\nconst maxCuckooCount = 500\n\nexport interface CuckooFilterInit {\n /**\n * How many items the filter is expected to contain\n */\n filterSize: number\n\n /**\n * How many items to put in each bucket\n */\n bucketSize?: number\n\n /**\n * How many bytes the fingerprint is expected to be\n */\n fingerprintSize?: number\n\n /**\n * A non-cryptographic hash implementation\n */\n hash?: Hash\n\n /**\n * A number used to seed the hash\n */\n seed?: number\n}\n\nexport class CuckooFilter implements Filter {\n private readonly bucketSize: number\n private readonly filterSize: number\n private readonly fingerprintSize: number\n private readonly buckets: Bucket[]\n public count: number\n private readonly hash: Hash\n private readonly seed: number\n\n constructor (init: CuckooFilterInit) {\n this.filterSize = init.filterSize\n this.bucketSize = init.bucketSize ?? 4\n this.fingerprintSize = init.fingerprintSize ?? 2\n this.count = 0\n this.buckets = []\n this.hash = init.hash ?? fnv1a\n this.seed = init.seed ?? getRandomInt(0, Math.pow(2, 10))\n }\n\n add (item: Uint8Array | string): boolean {\n if (typeof item === 'string') {\n item = uint8ArrayFromString(item)\n }\n\n const fingerprint = new Fingerprint(item, this.hash, this.seed, this.fingerprintSize)\n const j = this.hash.hash(item, this.seed) % this.filterSize\n const k = (j ^ fingerprint.hash()) % this.filterSize\n\n if (this.buckets[j] == null) {\n this.buckets[j] = new Bucket(this.bucketSize)\n }\n\n if (this.buckets[k] == null) {\n this.buckets[k] = new Bucket(this.bucketSize)\n }\n\n if (this.buckets[j].add(fingerprint) || this.buckets[k].add(fingerprint)) {\n this.count++\n return true\n }\n\n const rand = [j, k]\n let i = rand[getRandomInt(0, rand.length - 1)]\n\n if (this.buckets[i] == null) {\n this.buckets[i] = new Bucket(this.bucketSize)\n }\n\n for (let n = 0; n < maxCuckooCount; n++) {\n const swapped = this.buckets[i].swap(fingerprint)\n\n if (swapped == null) {\n continue\n }\n\n i = (i ^ swapped.hash()) % this.filterSize\n\n if (this.buckets[i] == null) {\n this.buckets[i] = new Bucket(this.bucketSize)\n }\n\n if (this.buckets[i].add(swapped)) {\n this.count++\n\n return true\n } else {\n continue\n }\n }\n\n return false\n }\n\n has (item: Uint8Array | string): boolean {\n if (typeof item === 'string') {\n item = uint8ArrayFromString(item)\n }\n\n const fingerprint = new Fingerprint(item, this.hash, this.seed, this.fingerprintSize)\n const j = this.hash.hash(item, this.seed) % this.filterSize\n const inJ = this.buckets[j]?.has(fingerprint) ?? false\n\n if (inJ) {\n return inJ\n }\n\n const k = (j ^ fingerprint.hash()) % this.filterSize\n\n return this.buckets[k]?.has(fingerprint) ?? false\n }\n\n remove (item: Uint8Array | string): boolean {\n if (typeof item === 'string') {\n item = uint8ArrayFromString(item)\n }\n\n const fingerprint = new Fingerprint(item, this.hash, this.seed, this.fingerprintSize)\n const j = this.hash.hash(item, this.seed) % this.filterSize\n const inJ = this.buckets[j]?.remove(fingerprint) ?? false\n\n if (inJ) {\n this.count--\n return inJ\n }\n\n const k = (j ^ fingerprint.hash()) % this.filterSize\n const inK = this.buckets[k]?.remove(fingerprint) ?? false\n\n if (inK) {\n this.count--\n }\n\n return inK\n }\n\n get reliable (): boolean {\n return Math.floor(100 * (this.count / this.filterSize)) <= 90\n }\n}\n\n// max load constants, defined in the cuckoo paper\nconst MAX_LOAD = {\n 1: 0.5,\n 2: 0.84,\n 4: 0.95,\n 8: 0.98\n}\n\nfunction calculateBucketSize (errorRate: number = 0.001): 2 | 4 | 8 {\n if (errorRate > 0.002) {\n return 2\n }\n\n if (errorRate > 0.00001) {\n return 4\n }\n\n return 8\n}\n\nexport function optimize (maxItems: number, errorRate: number = 0.001): CuckooFilterInit {\n // https://www.eecs.harvard.edu/~michaelm/postscripts/cuckoo-conext2014.pdf\n // Section 5.1 Optimal Bucket Size\n const bucketSize = calculateBucketSize(errorRate)\n const load = MAX_LOAD[bucketSize]\n\n // https://stackoverflow.com/questions/57555236/how-to-size-a-cuckoo-filter/57617208#57617208\n const filterSize = Math.round(maxItems / load)\n const fingerprintSize = Math.min(Math.ceil(Math.log2(1 / errorRate) + Math.log2(2 * bucketSize)), MAX_FINGERPRINT_SIZE)\n\n return {\n filterSize,\n bucketSize,\n fingerprintSize\n }\n}\n\nexport function createCuckooFilter (maxItems: number, errorRate: number = 0.005): Filter {\n const opts = optimize(maxItems, errorRate)\n return new CuckooFilter(opts)\n}\n", "import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string'\nimport { CuckooFilter, optimize } from './cuckoo-filter.ts'\nimport { fnv1a } from './hashes.ts'\nimport { getRandomInt } from './utils.ts'\nimport type { CuckooFilterInit } from './cuckoo-filter.ts'\nimport type { Hash } from './hashes.ts'\nimport type { Filter } from './index.ts'\n\nexport interface ScalableCuckooFilterInit extends CuckooFilterInit {\n /**\n * A number to multiply maxItems by when adding new sub-filters\n */\n scale?: number\n}\n\nexport class ScalableCuckooFilter implements Filter {\n private readonly filterSize: number\n private readonly bucketSize: number\n private readonly fingerprintSize: number\n private readonly scale: number\n private readonly filterSeries: CuckooFilter[]\n private readonly hash: Hash\n private readonly seed: number\n\n constructor (init: ScalableCuckooFilterInit) {\n this.bucketSize = init.bucketSize ?? 4\n this.filterSize = init.filterSize ?? (1 << 18) / this.bucketSize\n this.fingerprintSize = init.fingerprintSize ?? 2\n this.scale = init.scale ?? 2\n this.hash = init.hash ?? fnv1a\n this.seed = init.seed ?? getRandomInt(0, Math.pow(2, 10))\n this.filterSeries = [\n new CuckooFilter({\n filterSize: this.filterSize,\n bucketSize: this.bucketSize,\n fingerprintSize: this.fingerprintSize,\n hash: this.hash,\n seed: this.seed\n })\n ]\n }\n\n add (item: Uint8Array | string): boolean {\n if (typeof item === 'string') {\n item = uint8ArrayFromString(item)\n }\n\n if (this.has(item)) {\n return true\n }\n\n let current = this.filterSeries.find((cuckoo) => {\n return cuckoo.reliable\n })\n\n if (current == null) {\n const curSize = this.filterSize * Math.pow(this.scale, this.filterSeries.length)\n\n current = new CuckooFilter({\n filterSize: curSize,\n bucketSize: this.bucketSize,\n fingerprintSize: this.fingerprintSize,\n hash: this.hash,\n seed: this.seed\n })\n\n this.filterSeries.push(current)\n }\n\n return current.add(item)\n }\n\n has (item: Uint8Array | string): boolean {\n if (typeof item === 'string') {\n item = uint8ArrayFromString(item)\n }\n\n for (let i = 0; i < this.filterSeries.length; i++) {\n if (this.filterSeries[i].has(item)) {\n return true\n }\n }\n\n return false\n }\n\n remove (item: Uint8Array | string): boolean {\n if (typeof item === 'string') {\n item = uint8ArrayFromString(item)\n }\n\n for (let i = 0; i < this.filterSeries.length; i++) {\n if (this.filterSeries[i].remove(item)) {\n return true\n }\n }\n\n return false\n }\n\n get count (): number {\n return this.filterSeries.reduce((acc, curr) => {\n return acc + curr.count\n }, 0)\n }\n}\n\nexport function createScalableCuckooFilter (maxItems: number, errorRate: number = 0.001, options?: Pick<ScalableCuckooFilterInit, 'hash' | 'seed' | 'scale'>): Filter {\n return new ScalableCuckooFilter({\n ...optimize(maxItems, errorRate),\n ...(options ?? {})\n })\n}\n", "import { InvalidParametersError } from '@libp2p/interface'\nimport type { Multiaddr } from '@multiformats/multiaddr'\n\nexport interface IP4NetConfig {\n type: 'ip4'\n host: string\n protocol?: 'tcp' | 'udp'\n port?: number\n cidr?: number\n sni?: string\n}\n\nexport interface IP6NetConfig {\n type: 'ip6'\n host: string\n protocol?: 'tcp' | 'udp'\n port?: number\n zone?: string\n cidr?: string\n sni?: string\n}\n\nexport interface DNSNetConfig {\n type: 'dns'\n host: string\n protocol?: 'tcp' | 'udp'\n port: number\n cidr?: number\n}\n\nexport interface DNS4NetConfig {\n type: 'dns4'\n host: string\n protocol?: 'tcp' | 'udp'\n port: number\n cidr?: number\n}\n\nexport interface DNS6NetConfig {\n type: 'dns6'\n host: string\n protocol?: 'tcp' | 'udp'\n port: number\n cidr?: number\n}\n\nexport interface DNSAddrNetConfig {\n type: 'dnsaddr'\n host: string\n protocol?: 'tcp' | 'udp'\n port: number\n cidr?: number\n}\n\nexport type NetConfig = IP4NetConfig | IP6NetConfig | DNSNetConfig | DNS4NetConfig | DNS6NetConfig | DNSAddrNetConfig\n\n/**\n * Returns host/port/etc information for a multiaddr if it starts with a\n * network address (IPv4, IPv6, DNS, DNS4, DNS6 or DNSADDR), or null otherwise.\n */\nexport function tryGetNetConfig (ma: Multiaddr): NetConfig | null {\n const components = ma.getComponents()\n const config: any = {}\n let index = 0\n\n if (components[index]?.name === 'ip6zone') {\n config.zone = `${components[index].value}`\n index++\n }\n\n if (components[index]?.name === 'ip4' || components[index]?.name === 'ip6') {\n config.type = components[index].name\n config.host = components[index].value\n index++\n } else if (components[index]?.name === 'dns' || components[index]?.name === 'dns4' || components[index]?.name === 'dns6') {\n config.type = components[index].name\n config.host = components[index].value\n index++\n } else if (components[index]?.name === 'dnsaddr') {\n config.type = components[index].name\n config.host = `_dnsaddr.${components[index].value}`\n index++\n }\n\n if (components[index]?.name === 'tcp' || components[index]?.name === 'udp') {\n config.protocol = components[index].name === 'tcp' ? 'tcp' : 'udp'\n config.port = parseInt(`${components[index].value}`)\n index++\n }\n\n if (components[index]?.name === 'ipcidr') {\n if (config.type === 'ip4') {\n config.cidr = parseInt(`${components[index].value}`)\n } else if (config.type === 'ip6') {\n config.cidr = `${components[index].value}`\n }\n index++\n }\n\n if (config.type == null || config.host == null) {\n return null\n }\n\n if (components[index]?.name === 'tls' && components[index + 1]?.name === 'sni') {\n config.sni = components[index + 1].value\n index += 2\n }\n\n return config\n}\n\n/**\n * Like `tryGetNetConfig` but throws `InvalidParametersError` when the multiaddr\n * does not start with a network address.\n */\nexport function getNetConfig (ma: Multiaddr): NetConfig {\n const config = tryGetNetConfig(ma)\n\n if (config == null) {\n throw new InvalidParametersError(`Multiaddr ${ma} was not an IPv4, IPv6, DNS, DNS4, DNS6 or DNSADDR address`)\n }\n\n return config\n}\n", "/* eslint-disable @typescript-eslint/no-unsafe-return */\n\n// Heavily inspired by https://doc.rust-lang.org/src/std/net/parser.rs.html\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype Fn = (...foo: any) => any;\n\nexport class Parser {\n private index = 0;\n private input = \"\";\n\n new(input: string): this {\n this.index = 0;\n this.input = input;\n return this;\n }\n\n /** Run a parser, and restore the pre-parse state if it fails. */\n readAtomically<T extends Fn>(fn: T): ReturnType<T> {\n const index = this.index;\n const result = fn();\n if (result === undefined) {\n this.index = index;\n }\n return result;\n }\n\n /** Run a parser, but fail if the entire input wasn't consumed. Doesn't run atomically. */\n parseWith<T extends Fn>(fn: T): ReturnType<T> | undefined {\n const result = fn();\n if (this.index !== this.input.length) {\n return undefined;\n }\n return result;\n }\n\n /** Peek the next character from the input */\n peekChar(): string | undefined {\n if (this.index >= this.input.length) {\n return undefined;\n }\n return this.input[this.index];\n }\n\n /** Read the next character from the input */\n readChar(): string | undefined {\n if (this.index >= this.input.length) {\n return undefined;\n }\n return this.input[this.index++];\n }\n\n /** Read the next character from the input if it matches the target. */\n readGivenChar(target: string): string | undefined {\n return this.readAtomically(() => {\n const char = this.readChar();\n if (char !== target) {\n return undefined;\n }\n return char;\n });\n }\n\n /**\n * Helper for reading separators in an indexed loop. Reads the separator\n * character iff index > 0, then runs the parser. When used in a loop,\n * the separator character will only be read on index > 0 (see\n * readIPv4Addr for an example)\n */\n readSeparator<T extends Fn>(sep: string, index: number, inner: T): ReturnType<T> {\n return this.readAtomically(() => {\n if (index > 0) {\n if (this.readGivenChar(sep) === undefined) {\n return undefined;\n }\n }\n return inner();\n });\n }\n\n /**\n * Read a number off the front of the input in the given radix, stopping\n * at the first non-digit character or eof. Fails if the number has more\n * digits than max_digits or if there is no number.\n */\n readNumber(\n radix: number,\n maxDigits: number | undefined,\n allowZeroPrefix: boolean,\n maxBytes: number\n ): number | undefined {\n return this.readAtomically(() => {\n let result = 0;\n let digitCount = 0;\n\n const leadingChar = this.peekChar();\n if (leadingChar === undefined) {\n return undefined;\n }\n const hasLeadingZero = leadingChar === \"0\";\n const maxValue = 2 ** (8 * maxBytes) - 1;\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const digit = this.readAtomically(() => {\n const char = this.readChar();\n if (char === undefined) {\n return undefined;\n }\n const num = Number.parseInt(char, radix);\n if (Number.isNaN(num)) {\n return undefined;\n }\n return num;\n });\n if (digit === undefined) {\n break;\n }\n result *= radix;\n result += digit;\n if (result > maxValue) {\n return undefined;\n }\n digitCount += 1;\n if (maxDigits !== undefined) {\n if (digitCount > maxDigits) {\n return undefined;\n }\n }\n }\n\n if (digitCount === 0) {\n return undefined;\n } else if (!allowZeroPrefix && hasLeadingZero && digitCount > 1) {\n return undefined;\n } else {\n return result;\n }\n });\n }\n\n /** Read an IPv4 address. */\n readIPv4Addr(): Uint8Array | undefined {\n return this.readAtomically(() => {\n const out = new Uint8Array(4);\n\n for (let i = 0; i < out.length; i++) {\n const ix = this.readSeparator(\".\", i, () => this.readNumber(10, 3, false, 1));\n if (ix === undefined) {\n return undefined;\n }\n out[i] = ix;\n }\n\n return out;\n });\n }\n\n /** Read an IPv6 Address. */\n readIPv6Addr(): Uint8Array | undefined {\n /**\n * Read a chunk of an IPv6 address into `groups`. Returns the number\n * of groups read, along with a bool indicating if an embedded\n * trailing IPv4 address was read. Specifically, read a series of\n * colon-separated IPv6 groups (0x0000 - 0xFFFF), with an optional\n * trailing embedded IPv4 address.\n */\n const readGroups = (groups: Uint8Array): [number, boolean] => {\n for (let i = 0; i < groups.length / 2; i++) {\n const ix = i * 2;\n // Try to read a trailing embedded IPv4 address. There must be at least 4 groups left.\n if (i < groups.length - 3) {\n const ipv4 = this.readSeparator(\":\", i, () => this.readIPv4Addr());\n if (ipv4 !== undefined) {\n groups[ix] = ipv4[0];\n groups[ix + 1] = ipv4[1];\n groups[ix + 2] = ipv4[2];\n groups[ix + 3] = ipv4[3];\n\n return [ix + 4, true];\n }\n }\n\n const group = this.readSeparator(\":\", i, () => this.readNumber(16, 4, true, 2));\n if (group === undefined) {\n return [ix, false];\n }\n groups[ix] = group >> 8;\n groups[ix + 1] = group & 255;\n }\n return [groups.length, false];\n };\n\n return this.readAtomically(() => {\n // Read the front part of the address; either the whole thing, or up to the first ::\n const head = new Uint8Array(16);\n const [headSize, headIp4] = readGroups(head);\n\n if (headSize === 16) {\n return head;\n }\n\n // IPv4 part is not allowed before `::`\n if (headIp4) {\n return undefined;\n }\n\n // Read `::` if previous code parsed less than 8 groups.\n // `::` indicates one or more groups of 16 bits of zeros.\n if (this.readGivenChar(\":\") === undefined) {\n return undefined;\n }\n if (this.readGivenChar(\":\") === undefined) {\n return undefined;\n }\n\n // Read the back part of the address. The :: must contain at least one\n // set of zeroes, so our max length is 7.\n const tail = new Uint8Array(14);\n const limit = 16 - (headSize + 2);\n const [tailSize] = readGroups(tail.subarray(0, limit));\n\n // Concat the head and tail of the IP address\n head.set(tail.subarray(0, tailSize), 16 - tailSize);\n\n return head;\n });\n }\n\n /** Read an IP Address, either IPv4 or IPv6. */\n readIPAddr(): Uint8Array | undefined {\n return this.readIPv4Addr() ?? this.readIPv6Addr();\n }\n}\n", "import { Parser } from \"./parser.js\";\n\n// See https://stackoverflow.com/questions/166132/maximum-length-of-the-textual-representation-of-an-ipv6-address\nconst MAX_IPV6_LENGTH = 45;\nconst MAX_IPV4_LENGTH = 15;\n\nconst parser = new Parser();\n\n/** Parse `input` into IPv4 bytes. */\nexport function parseIPv4(input: string): Uint8Array | undefined {\n if (input.length > MAX_IPV4_LENGTH) {\n return undefined;\n }\n return parser.new(input).parseWith(() => parser.readIPv4Addr());\n}\n\n/** Parse IPv4 `input` into IPv6 with IPv4-mapped bytes, eg ::ffff:1.2.3.4 */\nexport function parseIPv4Mapped(input: string): Uint8Array | undefined {\n if (input.length > MAX_IPV4_LENGTH) {\n return undefined;\n }\n\n const ipv4 = parser.new(input).parseWith(() => parser.readIPv4Addr());\n if (ipv4 === undefined) {\n return undefined;\n }\n\n return Uint8Array.from([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xff, ipv4[0], ipv4[1], ipv4[2], ipv4[3]]);\n}\n\n/** Parse `input` into IPv6 bytes. */\nexport function parseIPv6(input: string): Uint8Array | undefined {\n // strip zone index if it is present\n if (input.includes(\"%\")) {\n input = input.split(\"%\")[0];\n }\n if (input.length > MAX_IPV6_LENGTH) {\n return undefined;\n }\n return parser.new(input).parseWith(() => parser.readIPv6Addr());\n}\n\n/** Parse `input` into IPv4 or IPv6 bytes. */\nexport function parseIP(input: string, mapIPv4ToIPv6 = false): Uint8Array | undefined {\n // strip zone index if it is present\n if (input.includes(\"%\")) {\n input = input.split(\"%\")[0];\n }\n\n if (input.length > MAX_IPV6_LENGTH) {\n return undefined;\n }\n\n const addr = parser.new(input).parseWith(() => parser.readIPAddr());\n if (!addr) {\n return undefined;\n }\n\n if (mapIPv4ToIPv6 && addr.length === 4) {\n return Uint8Array.from([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xff, addr[0], addr[1], addr[2], addr[3]]);\n }\n\n return addr;\n}\n", "import { parseIP, parseIPv4, parseIPv6 } from \"./parse.js\";\n\n/** Check if `input` is IPv4. */\nexport function isIPv4(input: string): boolean {\n return Boolean(parseIPv4(input));\n}\n\n/** Check if `input` is IPv6. */\nexport function isIPv6(input: string): boolean {\n return Boolean(parseIPv6(input));\n}\n\n/** Check if `input` is IPv4 or IPv6. */\nexport function isIP(input: string): boolean {\n return Boolean(parseIP(input));\n}\n\n/**\n * @returns `6` if `input` is IPv6, `4` if `input` is IPv4, or `undefined` if `input` is neither.\n */\nexport function ipVersion(input: string): 4 | 6 | undefined {\n if (isIPv4(input)) {\n return 4;\n } else if (isIPv6(input)) {\n return 6;\n } else {\n return undefined;\n }\n}\n", "import { isIPv4, isIPv6 } from '@chainsafe/is-ip'\nimport { Netmask } from 'netmask'\n\nconst PRIVATE_IP_RANGES = [\n '0.0.0.0/8',\n '10.0.0.0/8',\n '100.64.0.0/10',\n '127.0.0.0/8',\n '169.254.0.0/16',\n '172.16.0.0/12',\n '192.0.0.0/24',\n '192.0.0.0/29',\n '192.0.0.8/32',\n '192.0.0.9/32',\n '192.0.0.10/32',\n '192.0.0.170/32',\n '192.0.0.171/32',\n '192.0.2.0/24',\n '192.31.196.0/24',\n '192.52.193.0/24',\n '192.88.99.0/24',\n '192.168.0.0/16',\n '192.175.48.0/24',\n '198.18.0.0/15',\n '198.51.100.0/24',\n '203.0.113.0/24',\n '240.0.0.0/4',\n '255.255.255.255/32'\n]\n\nconst NETMASK_RANGES = PRIVATE_IP_RANGES.map(ipRange => new Netmask(ipRange))\n\nfunction ipv4Check (ipAddr: string): boolean {\n for (const r of NETMASK_RANGES) {\n if (r.contains(ipAddr)) { return true }\n }\n\n return false\n}\n\nfunction isIpv4MappedIpv6 (ipAddr: string): boolean {\n return /^::ffff:([0-9a-fA-F]{1,4}):([0-9a-fA-F]{1,4})$/.test(ipAddr)\n}\n\n/**\n * @see https://datatracker.ietf.org/doc/html/rfc4291#section-2.5.5.2\n */\nfunction ipv4MappedIpv6Check (ipAddr: string): boolean {\n const parts = ipAddr.split(':')\n\n if (parts.length < 2) {\n return false\n }\n\n const octet34 = parts[parts.length - 1].padStart(4, '0')\n const octet12 = parts[parts.length - 2].padStart(4, '0')\n\n const ip4 = `${parseInt(octet12.substring(0, 2), 16)}.${parseInt(octet12.substring(2), 16)}.${parseInt(octet34.substring(0, 2), 16)}.${parseInt(octet34.substring(2), 16)}`\n\n return ipv4Check(ip4)\n}\n\n/**\n * @see https://datatracker.ietf.org/doc/html/rfc4291#section-2.2 example 3\n */\nfunction isIpv4EmbeddedIpv6 (ipAddr: string): boolean {\n return /^::ffff:([0-9]{1,3})\\.([0-9]{1,3})\\.([0-9]{1,3})\\.([0-9]{1,3})$/.test(ipAddr)\n}\n\nfunction ipv4EmbeddedIpv6Check (ipAddr: string): boolean {\n const parts = ipAddr.split(':')\n const ip4 = parts[parts.length - 1]\n\n return ipv4Check(ip4)\n}\n\nfunction ipv6Check (ipAddr: string): boolean {\n return /^::$/.test(ipAddr) ||\n /^::1$/.test(ipAddr) ||\n /^64:ff9b::([0-9]{1,3})\\.([0-9]{1,3})\\.([0-9]{1,3})\\.([0-9]{1,3})$/.test(ipAddr) ||\n /^100::([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4})$/.test(ipAddr) ||\n /^2001::([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4})$/.test(ipAddr) ||\n /^2001:2[0-9a-fA-F]:([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4})$/.test(ipAddr) ||\n /^2001:db8:([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4})$/.test(ipAddr) ||\n /^2002:([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4})$/.test(ipAddr) ||\n /^f[c-d]([0-9a-fA-F]{2,2}):/i.test(ipAddr) ||\n /^fe[8-9a-bA-B][0-9a-fA-F]:/i.test(ipAddr) ||\n /^ff([0-9a-fA-F]{2,2}):/i.test(ipAddr)\n}\n\nexport function isPrivateIp (ip: string): boolean | undefined {\n if (isIPv4(ip)) {\n return ipv4Check(ip)\n }\n\n if (isIpv4MappedIpv6(ip)) {\n return ipv4MappedIpv6Check(ip)\n }\n\n if (isIpv4EmbeddedIpv6(ip)) {\n return ipv4EmbeddedIpv6Check(ip)\n }\n\n if (isIPv6(ip)) {\n return ipv6Check(ip)\n }\n}\n", "import { isPrivateIp } from '../private-ip.ts'\nimport { getNetConfig } from './get-net-config.ts'\nimport type { Multiaddr } from '@multiformats/multiaddr'\n\n/**\n * Check if a given multiaddr starts with a private address\n */\nexport function isPrivate (ma: Multiaddr): boolean {\n try {\n const config = getNetConfig(ma)\n\n switch (config.type) {\n case 'ip4':\n case 'ip6':\n return isPrivateIp(config.host) ?? false\n default:\n return config.host === 'localhost'\n }\n } catch {\n return false\n }\n}\n", "/**\n * Thrown when an invalid multiaddr is encountered\n */\nexport class InvalidMultiaddrError extends Error {\n static name = 'InvalidMultiaddrError'\n name = 'InvalidMultiaddrError'\n}\n\nexport class ValidationError extends Error {\n static name = 'ValidationError'\n name = 'ValidationError'\n}\n\nexport class InvalidParametersError extends Error {\n static name = 'InvalidParametersError'\n name = 'InvalidParametersError'\n}\n\nexport class UnknownProtocolError extends Error {\n static name = 'UnknownProtocolError'\n name = 'UnknownProtocolError'\n}\n", "import { isIPv4 } from '@chainsafe/is-ip'\nimport { base32 } from 'multiformats/bases/base32'\nimport { bases } from 'multiformats/basics'\nimport { concat as uint8ArrayConcat } from 'uint8arrays/concat'\nimport { fromString as uint8ArrayFromString } from 'uint8arrays/from-string'\nimport { toString as uint8ArrayToString } from 'uint8arrays/to-string'\nimport { InvalidMultiaddrError } from './errors.ts'\nimport type { MultibaseCodec } from 'multiformats'\nimport type { SupportedEncodings } from 'uint8arrays/to-string'\n\nexport function bytesToString (base: SupportedEncodings): (buf: Uint8Array) => string {\n return (buf) => {\n return uint8ArrayToString(buf, base)\n }\n}\n\nexport function stringToBytes (base: SupportedEncodings): (value: string) => Uint8Array<ArrayBuffer> {\n return (buf) => {\n return uint8ArrayFromString(buf, base)\n }\n}\n\nexport function bytes2port (buf: Uint8Array): string {\n const view = new DataView(buf.buffer)\n return view.getUint16(buf.byteOffset).toString()\n}\n\nexport function port2bytes (port: string | number): Uint8Array<ArrayBuffer> {\n const buf = new ArrayBuffer(2)\n const view = new DataView(buf)\n view.setUint16(0, typeof port === 'string' ? parseInt(port) : port)\n\n return new Uint8Array(buf)\n}\n\nexport function onion2bytes (str: string): Uint8Array<ArrayBuffer> {\n const addr = str.split(':')\n\n if (addr.length !== 2) {\n throw new Error(`failed to parse onion addr: [\"'${addr.join('\", \"')}'\"]' does not contain a port number`)\n }\n\n if (addr[0].length !== 16) {\n throw new Error(`failed to parse onion addr: ${addr[0]} not a Tor onion address.`)\n }\n\n // onion addresses do not include the multibase prefix, add it before decoding\n const buf = uint8ArrayFromString(addr[0], 'base32')\n\n // onion port number\n const port = parseInt(addr[1], 10)\n\n if (port < 1 || port > 65536) {\n throw new Error('Port number is not in range(1, 65536)')\n }\n\n const portBuf = port2bytes(port)\n\n return uint8ArrayConcat([buf, portBuf], buf.length + portBuf.length)\n}\n\nexport function onion32bytes (str: string): Uint8Array<ArrayBuffer> {\n const addr = str.split(':')\n\n if (addr.length !== 2) {\n throw new Error(`failed to parse onion addr: [\"'${addr.join('\", \"')}'\"]' does not contain a port number`)\n }\n\n if (addr[0].length !== 56) {\n throw new Error(`failed to parse onion addr: ${addr[0]} not a Tor onion3 address.`)\n }\n\n // onion addresses do not include the multibase prefix, add it before decoding\n const buf = base32.decode(`b${addr[0]}`)\n\n // onion port number\n const port = parseInt(addr[1], 10)\n\n if (port < 1 || port > 65536) {\n throw new Error('Port number is not in range(1, 65536)')\n }\n\n const portBuf = port2bytes(port)\n\n return uint8ArrayConcat([buf, portBuf], buf.length + portBuf.length)\n}\n\nexport function bytes2onion (buf: Uint8Array): string {\n const addrBytes = buf.subarray(0, buf.length - 2)\n const portBytes = buf.subarray(buf.length - 2)\n const addr = uint8ArrayToString(addrBytes, 'base32')\n const port = bytes2port(portBytes)\n return `${addr}:${port}`\n}\n\n// Copied from https://github.com/indutny/node-ip/blob/master/lib/ip.js#L7\n// but with buf/offset args removed because we don't use them\nexport const ip4ToBytes = function (ip: string): Uint8Array<ArrayBuffer> {\n ip = ip.toString().trim()\n\n const bytes = new Uint8Array(4)\n\n ip.split(/\\./g).forEach((byte, index) => {\n const value = parseInt(byte, 10)\n\n if (isNaN(value) || value < 0 || value > 0xff) {\n throw new InvalidMultiaddrError('Invalid byte value in IP address')\n }\n\n bytes[index] = value\n })\n\n return bytes\n}\n\n// Copied from https://github.com/indutny/node-ip/blob/master/lib/ip.js#L7\n// but with buf/offset args removed because we don't use them\nexport const ip6ToBytes = function (ip: string): Uint8Array<ArrayBuffer> {\n let offset = 0\n ip = ip.toString().trim()\n\n const sections = ip.split(':', 8)\n\n let i\n for (i = 0; i < sections.length; i++) {\n const isv4 = isIPv4(sections[i])\n let v4Buffer: Uint8Array | undefined\n\n if (isv4) {\n v4Buffer = ip4ToBytes(sections[i])\n sections[i] = uint8ArrayToString(v4Buffer.subarray(0, 2), 'base16')\n }\n\n if (v4Buffer != null && ++i < 8) {\n sections.splice(i, 0, uint8ArrayToString(v4Buffer.subarray(2, 4), 'base16'))\n }\n }\n\n if (sections[0] === '') {\n while (sections.length < 8) { sections.unshift('0') }\n } else if (sections[sections.length - 1] === '') {\n while (sections.length < 8) { sections.push('0') }\n } else if (sections.length < 8) {\n for (i = 0; i < sections.length && sections[i] !== ''; i++) { }\n const argv: [number, number, ...string[]] = [i, 1]\n for (i = 9 - sections.length; i > 0; i--) {\n argv.push('0')\n }\n sections.splice.apply(sections, argv)\n }\n\n const bytes = new Uint8Array(offset + 16)\n\n for (i = 0; i < sections.length; i++) {\n if (sections[i] === '') {\n sections[i] = '0'\n }\n\n const word = parseInt(sections[i], 16)\n\n if (isNaN(word) || word < 0 || word > 0xffff) {\n throw new InvalidMultiaddrError('Invalid byte value in IP address')\n }\n\n bytes[offset++] = (word >> 8) & 0xff\n bytes[offset++] = word & 0xff\n }\n\n return bytes\n}\n\n// Copied from https://github.com/indutny/node-ip/blob/master/lib/ip.js#L63\nexport const ip4ToString = function (buf: Uint8Array): string {\n if (buf.byteLength !== 4) {\n throw new InvalidMultiaddrError('IPv4 address was incorrect length')\n }\n\n const result = []\n\n for (let i = 0; i < buf.byteLength; i++) {\n result.push(buf[i])\n }\n\n return result.join('.')\n}\n\nexport const ip6ToString = function (buf: Uint8Array): string {\n if (buf.byteLength !== 16) {\n throw new InvalidMultiaddrError('IPv6 address was incorrect length')\n }\n\n const result: string[] = []\n\n for (let i = 0; i < buf.byteLength; i += 2) {\n const byte1 = buf[i]\n const byte2 = buf[i + 1]\n\n const tuple = `${byte1.toString(16).padStart(2, '0')}${byte2.toString(16).padStart(2, '0')}`\n\n result.push(tuple)\n }\n\n const ip = result.join(':')\n\n try {\n const url = new URL(`http://[${ip}]`)\n\n return url.hostname.substring(1, url.hostname.length - 1)\n } catch {\n throw new InvalidMultiaddrError(`Invalid IPv6 address \"${ip}\"`)\n }\n}\n\nexport function ip6StringToValue (str: string): string {\n try {\n const url = new URL(`http://[${str}]`)\n\n return url.hostname.substring(1, url.hostname.length - 1)\n } catch {\n throw new InvalidMultiaddrError(`Invalid IPv6 address \"${str}\"`)\n }\n}\n\nconst decoders = Object.values(bases).map((c) => c.decoder)\nconst anybaseDecoder = (function () {\n let acc = decoders[0].or(decoders[1])\n decoders.slice(2).forEach((d) => (acc = acc.or(d)))\n return acc\n})()\n\nexport function mb2bytes (mbstr: string): Uint8Array<ArrayBuffer> {\n return anybaseDecoder.decode(mbstr)\n}\n\nexport function bytes2mb (base: MultibaseCodec<any>): (buf: Uint8Array) => string {\n return (buf) => {\n return base.encoder.encode(buf)\n }\n}\n", "import { ValidationError } from './errors.ts'\n\nexport function integer (value: string): void {\n const int = parseInt(value)\n\n if (int.toString() !== value) {\n throw new ValidationError('Value must be an integer')\n }\n}\n\nexport function positive (value: any): void {\n if (value < 0) {\n throw new ValidationError('Value must be a positive integer, or zero')\n }\n}\n\nexport function maxValue (max: number): (value: any) => void {\n return (value) => {\n if (value > max) {\n throw new ValidationError(`Value must be smaller than or equal to ${max}`)\n }\n }\n}\n\nexport function validate (...funcs: Array<(value: string) => void>): (value: string) => void {\n return (value) => {\n for (const fn of funcs) {\n fn(value)\n }\n }\n}\n\nexport const validatePort = validate(\n integer,\n positive,\n maxValue(65_535)\n)\n", "import { isIPv4, isIPv6 } from '@chainsafe/is-ip'\nimport { CID } from 'multiformats'\nimport { base64url } from 'multiformats/bases/base64'\nimport { CODE_CERTHASH, CODE_DCCP, CODE_DNS, CODE_DNS4, CODE_DNS6, CODE_DNSADDR, CODE_GARLIC32, CODE_GARLIC64, CODE_HTTP, CODE_HTTP_PATH, CODE_HTTPS, CODE_IP4, CODE_IP6, CODE_IP6ZONE, CODE_IPCIDR, CODE_MEMORY, CODE_NOISE, CODE_ONION, CODE_ONION3, CODE_P2P, CODE_P2P_CIRCUIT, CODE_P2P_STARDUST, CODE_P2P_WEBRTC_DIRECT, CODE_P2P_WEBRTC_STAR, CODE_P2P_WEBSOCKET_STAR, CODE_QUIC, CODE_QUIC_V1, CODE_SCTP, CODE_SNI, CODE_TCP, CODE_TLS, CODE_UDP, CODE_UDT, CODE_UNIX, CODE_UTP, CODE_WEBRTC, CODE_WEBRTC_DIRECT, CODE_WEBTRANSPORT, CODE_WS, CODE_WSS } from './constants.ts'\nimport { UnknownProtocolError, ValidationError } from './errors.ts'\nimport { bytes2mb, bytes2onion, bytes2port, bytesToString, ip4ToBytes, ip4ToString, ip6StringToValue, ip6ToBytes, ip6ToString, mb2bytes, onion2bytes, onion32bytes, port2bytes, stringToBytes } from './utils.ts'\nimport { validatePort } from './validation.ts'\nimport type { Registry as RegistryInterface } from './index.ts'\n\nexport const V = -1\n\nexport interface ProtocolCodec {\n /**\n * A numeric code that will be used in the binary representation of the tuple.\n */\n code: number\n\n /**\n * A string name that will be used in the string representation of the addr.\n */\n name: string\n\n /**\n * Size defines the expected length of the address part of the tuple - valid\n * values are `-1` (or the `V` constant) for variable length (this will be\n * varint encoded in the binary representation), `0` for no address part or a\n * number that represents a fixed-length address.\n */\n size?: number\n\n /**\n * If specified this protocol codec will also be used to decode tuples with\n * these names from string multiaddrs.\n */\n aliases?: string[]\n\n /**\n * Where the multiaddr has been encoded as a string, decode the value if\n * necessary, unescaping any escaped values\n */\n stringToValue?(value: string): string\n\n /**\n * To encode the multiaddr as a string, escape any necessary values\n */\n valueToString?(value: string): string\n\n /**\n * To encode the multiaddr as bytes, convert the value to bytes\n */\n valueToBytes?(value: string): Uint8Array<ArrayBuffer>\n\n /**\n * To decode bytes to a multiaddr, convert the value bytes to a string\n */\n bytesToValue?(bytes: Uint8Array): string\n\n /**\n * Perform any necessary validation on the string value\n */\n validate?(value: string): void\n}\n\nclass Registry implements RegistryInterface {\n private protocolsByCode = new Map<number, ProtocolCodec>()\n private protocolsByName = new Map<string, ProtocolCodec>()\n\n getProtocol (key: string | number): ProtocolCodec {\n let codec: ProtocolCodec | undefined\n\n if (typeof key === 'string') {\n codec = this.protocolsByName.get(key)\n } else {\n codec = this.protocolsByCode.get(key)\n }\n\n if (codec == null) {\n throw new UnknownProtocolError(`Protocol ${key} was unknown`)\n }\n\n return codec\n }\n\n addProtocol (codec: ProtocolCodec): void {\n this.protocolsByCode.set(codec.code, codec)\n this.protocolsByName.set(codec.name, codec)\n\n codec.aliases?.forEach(alias => {\n this.protocolsByName.set(alias, codec)\n })\n }\n\n removeProtocol (code: number): void {\n const codec = this.protocolsByCode.get(code)\n\n if (codec == null) {\n return\n }\n\n this.protocolsByCode.delete(codec.code)\n this.protocolsByName.delete(codec.name)\n\n codec.aliases?.forEach(alias => {\n this.protocolsByName.delete(alias)\n })\n }\n}\n\nexport const registry: RegistryInterface = new Registry()\n\nconst codecs: ProtocolCodec[] = [{\n code: CODE_IP4,\n name: 'ip4',\n size: 32,\n valueToBytes: ip4ToBytes,\n bytesToValue: ip4ToString,\n validate: (value) => {\n if (!isIPv4(value)) {\n throw new ValidationError(`Invalid IPv4 address \"${value}\"`)\n }\n }\n}, {\n code: CODE_TCP,\n name: 'tcp',\n size: 16,\n valueToBytes: port2bytes,\n bytesToValue: bytes2port,\n validate: validatePort\n}, {\n code: CODE_UDP,\n name: 'udp',\n size: 16,\n valueToBytes: port2bytes,\n bytesToValue: bytes2port,\n validate: validatePort\n}, {\n code: CODE_DCCP,\n name: 'dccp',\n size: 16,\n valueToBytes: port2bytes,\n bytesToValue: bytes2port,\n validate: validatePort\n}, {\n code: CODE_IP6,\n name: 'ip6',\n size: 128,\n valueToBytes: ip6ToBytes,\n bytesToValue: ip6ToString,\n stringToValue: ip6StringToValue,\n validate: (value) => {\n if (!isIPv6(value)) {\n throw new ValidationError(`Invalid IPv6 address \"${value}\"`)\n }\n }\n}, {\n code: CODE_IP6ZONE,\n name: 'ip6zone',\n size: V\n}, {\n code: CODE_IPCIDR,\n name: 'ipcidr',\n size: 8,\n bytesToValue: bytesToString('base10'),\n valueToBytes: stringToBytes('base10')\n}, {\n code: CODE_DNS,\n name: 'dns',\n size: V\n}, {\n code: CODE_DNS4,\n name: 'dns4',\n size: V\n}, {\n code: CODE_DNS6,\n name: 'dns6',\n size: V\n}, {\n code: CODE_DNSADDR,\n name: 'dnsaddr',\n size: V\n}, {\n code: CODE_SCTP,\n name: 'sctp',\n size: 16,\n valueToBytes: port2bytes,\n bytesToValue: bytes2port,\n validate: validatePort\n}, {\n code: CODE_UDT,\n name: 'udt'\n}, {\n code: CODE_UTP,\n name: 'utp'\n}, {\n code: CODE_UNIX,\n name: 'unix',\n size: V,\n stringToValue: (str) => decodeURIComponent(str),\n valueToString: (val) => encodeURIComponent(val)\n}, {\n code: CODE_P2P,\n name: 'p2p',\n aliases: ['ipfs'],\n size: V,\n bytesToValue: bytesToString('base58btc'),\n valueToBytes: (val) => {\n if (val.startsWith('Q') || val.startsWith('1')) {\n return stringToBytes('base58btc')(val)\n }\n\n return CID.parse(val).multihash.bytes\n }\n}, {\n code: CODE_ONION,\n name: 'onion',\n size: 96,\n bytesToValue: bytes2onion,\n valueToBytes: onion2bytes\n}, {\n code: CODE_ONION3,\n name: 'onion3',\n size: 296,\n bytesToValue: bytes2onion,\n valueToBytes: onion32bytes\n}, {\n code: CODE_GARLIC64,\n name: 'garlic64',\n size: V\n}, {\n code: CODE_GARLIC32,\n name: 'garlic32',\n size: V\n}, {\n code: CODE_TLS,\n name: 'tls'\n}, {\n code: CODE_SNI,\n name: 'sni',\n size: V\n}, {\n code: CODE_NOISE,\n name: 'noise'\n}, {\n code: CODE_QUIC,\n name: 'quic'\n}, {\n code: CODE_QUIC_V1,\n name: 'quic-v1'\n}, {\n code: CODE_WEBTRANSPORT,\n name: 'webtransport'\n}, {\n code: CODE_CERTHASH,\n name: 'certhash',\n size: V,\n bytesToValue: bytes2mb(base64url),\n valueToBytes: mb2bytes\n}, {\n code: CODE_HTTP,\n name: 'http'\n}, {\n code: CODE_HTTP_PATH,\n name: 'http-path',\n size: V,\n stringToValue: (str) => `/${decodeURIComponent(str)}`,\n valueToString: (val) => encodeURIComponent(val.substring(1))\n}, {\n code: CODE_HTTPS,\n name: 'https'\n}, {\n code: CODE_WS,\n name: 'ws'\n}, {\n code: CODE_WSS,\n name: 'wss'\n}, {\n code: CODE_P2P_WEBSOCKET_STAR,\n name: 'p2p-websocket-star'\n}, {\n code: CODE_P2P_STARDUST,\n name: 'p2p-stardust'\n}, {\n code: CODE_P2P_WEBRTC_STAR,\n name: 'p2p-webrtc-star'\n}, {\n code: CODE_P2P_WEBRTC_DIRECT,\n name: 'p2p-webrtc-direct'\n}, {\n code: CODE_WEBRTC_DIRECT,\n name: 'webrtc-direct'\n}, {\n code: CODE_WEBRTC,\n name: 'webrtc'\n}, {\n code: CODE_P2P_CIRCUIT,\n name: 'p2p-circuit'\n}, {\n code: CODE_MEMORY,\n name: 'memory',\n size: V\n}]\n\ncodecs.forEach(codec => {\n registry.addProtocol(codec)\n})\n", "import * as varint from 'uint8-varint'\nimport { withArrayBuffer } from 'uint8arrays'\nimport { concat as uint8ArrayConcat } from 'uint8arrays/concat'\nimport { fromString as uint8ArrayFromString } from 'uint8arrays/from-string'\nimport { toString as uint8ArrayToString } from 'uint8arrays/to-string'\nimport { InvalidMultiaddrError } from './errors.ts'\nimport { registry, V } from './registry.ts'\nimport type { Component } from './index.js'\nimport type { ProtocolCodec } from './registry.ts'\n\nexport function bytesToComponents (bytes: Uint8Array): Component[] {\n const components: Component[] = []\n\n let i = 0\n while (i < bytes.length) {\n const code = varint.decode(bytes, i)\n const codec = registry.getProtocol(code)\n const codeLength = varint.encodingLength(code)\n const size = sizeForAddr(codec, bytes, i + codeLength)\n let sizeLength = 0\n\n if (size > 0 && codec.size === V) {\n sizeLength = varint.encodingLength(size)\n }\n\n const componentLength = codeLength + sizeLength + size\n\n const component: Component = {\n code,\n name: codec.name,\n bytes: withArrayBuffer(bytes.subarray(i, i + componentLength))\n }\n\n if (size > 0) {\n const valueOffset = i + codeLength + sizeLength\n const valueBytes = bytes.subarray(valueOffset, valueOffset + size)\n\n component.value = codec.bytesToValue?.(valueBytes) ?? uint8ArrayToString(valueBytes)\n }\n\n components.push(component)\n\n i += componentLength\n }\n\n return components\n}\n\nexport function componentsToBytes (components: Component[]): Uint8Array<ArrayBuffer> {\n let length = 0\n const bytes: Uint8Array[] = []\n\n for (const component of components) {\n if (component.bytes == null) {\n const codec = registry.getProtocol(component.code)\n const codecLength = varint.encodingLength(component.code)\n let valueBytes: Uint8Array | undefined\n let valueLength = 0\n let valueLengthLength = 0\n\n if (component.value != null) {\n valueBytes = codec.valueToBytes?.(component.value) ?? uint8ArrayFromString(component.value)\n valueLength = valueBytes.byteLength\n\n if (codec.size === V) {\n valueLengthLength = varint.encodingLength(valueLength)\n }\n }\n\n const bytes = new Uint8Array(codecLength + valueLengthLength + valueLength)\n\n // encode the protocol code\n let offset = 0\n varint.encodeUint8Array(component.code, bytes, offset)\n offset += codecLength\n\n // if there is a value\n if (valueBytes != null) {\n // if the value has variable length, encode the length\n if (codec.size === V) {\n varint.encodeUint8Array(valueLength, bytes, offset)\n offset += valueLengthLength\n }\n\n // finally encode the value\n bytes.set(valueBytes, offset)\n }\n\n component.bytes = bytes\n }\n\n bytes.push(component.bytes)\n length += component.bytes.byteLength\n }\n\n return uint8ArrayConcat(bytes, length)\n}\n\nexport function stringToComponents (string: string): Component[] {\n if (string.charAt(0) !== '/') {\n throw new InvalidMultiaddrError('String multiaddr must start with \"/\"')\n }\n\n const components: Component[] = []\n let collecting: 'protocol' | 'value' = 'protocol'\n let value = ''\n let protocol = ''\n\n for (let i = 1; i < string.length; i++) {\n const char = string.charAt(i)\n\n if (char !== '/') {\n if (collecting === 'protocol') {\n protocol += string.charAt(i)\n } else {\n value += string.charAt(i)\n }\n }\n\n const ended = i === string.length - 1\n\n if (char === '/' || ended) {\n const codec = registry.getProtocol(protocol)\n\n if (collecting === 'protocol') {\n if (codec.size == null || codec.size === 0) {\n // a protocol without an address, eg. `/tls`\n components.push({\n code: codec.code,\n name: codec.name\n })\n\n value = ''\n protocol = ''\n collecting = 'protocol'\n\n continue\n } else if (ended) {\n throw new InvalidMultiaddrError(`Component ${protocol} was missing value`)\n }\n\n // continue collecting value\n collecting = 'value'\n } else if (collecting === 'value') {\n const component: Component = {\n code: codec.code,\n name: codec.name\n }\n\n if (codec.size != null && codec.size !== 0) {\n if (value === '') {\n throw new InvalidMultiaddrError(`Component ${protocol} was missing value`)\n }\n\n component.value = codec.stringToValue?.(value) ?? value\n }\n\n components.push(component)\n\n value = ''\n protocol = ''\n collecting = 'protocol'\n }\n }\n }\n\n if (protocol !== '' && value !== '') {\n throw new InvalidMultiaddrError('Incomplete multiaddr')\n }\n\n return components\n}\n\nexport function componentsToString (components: Component[]): string {\n return `/${components.flatMap(component => {\n if (component.value == null) {\n return component.name\n }\n\n const codec = registry.getProtocol(component.code)\n\n if (codec == null) {\n throw new InvalidMultiaddrError(`Unknown protocol code ${component.code}`)\n }\n\n return [\n component.name,\n codec.valueToString?.(component.value) ?? component.value\n ]\n }).join('/')}`\n}\n\n/**\n * For the passed address, return the serialized size\n */\nfunction sizeForAddr (codec: ProtocolCodec, bytes: Uint8Array, offset: number): number {\n if (codec.size == null || codec.size === 0) {\n return 0\n }\n\n if (codec.size > 0) {\n return codec.size / 8\n }\n\n return varint.decode(bytes, offset)\n}\n", "import { equals as uint8ArrayEquals } from 'uint8arrays/equals'\nimport { bytesToComponents, componentsToBytes, componentsToString, stringToComponents } from './components.ts'\nimport { InvalidMultiaddrError, InvalidParametersError } from './errors.ts'\nimport { isMultiaddr } from './index.ts'\nimport { registry } from './registry.ts'\nimport type { MultiaddrInput, Multiaddr as MultiaddrInterface, Component } from './index.ts'\n\nconst inspect = Symbol.for('nodejs.util.inspect.custom')\nexport const symbol = Symbol.for('@multiformats/multiaddr')\n\nfunction toComponents (addr: MultiaddrInput): Component[] {\n if (addr == null) {\n addr = '/'\n }\n\n if (isMultiaddr(addr)) {\n return addr.getComponents()\n }\n\n if (addr instanceof Uint8Array) {\n return bytesToComponents(addr)\n }\n\n if (typeof addr === 'string') {\n addr = addr\n .replace(/\\/(\\/)+/, '/')\n .replace(/(\\/)+$/, '')\n\n if (addr === '') {\n addr = '/'\n }\n\n return stringToComponents(addr)\n }\n\n if (Array.isArray(addr)) {\n return addr\n }\n\n throw new InvalidMultiaddrError('Must be a string, Uint8Array, Component[], or another Multiaddr')\n}\n\ninterface MultiaddrOptions {\n validate?: boolean\n}\n\n/**\n * Creates a {@link Multiaddr} from a {@link MultiaddrInput}\n */\nexport class Multiaddr implements MultiaddrInterface {\n [symbol]: boolean = true\n readonly #components: Component[]\n\n // cache string representation\n #string: string | undefined\n // cache byte representation\n #bytes: Uint8Array<ArrayBuffer> | undefined\n\n constructor (addr: MultiaddrInput | Component[] = '/', options: MultiaddrOptions = {}) {\n this.#components = toComponents(addr)\n\n if (options.validate !== false) {\n validate(this)\n }\n }\n\n get bytes (): Uint8Array<ArrayBuffer> {\n if (this.#bytes == null) {\n this.#bytes = componentsToBytes(this.#components)\n }\n\n return this.#bytes\n }\n\n toString (): string {\n if (this.#string == null) {\n this.#string = componentsToString(this.#components)\n }\n\n return this.#string\n }\n\n toJSON (): string {\n return this.toString()\n }\n\n getComponents (): Component[] {\n return [\n ...this.#components.map(c => ({ ...c }))\n ]\n }\n\n encapsulate (addr: MultiaddrInput): MultiaddrInterface {\n const ma = new Multiaddr(addr)\n\n return new Multiaddr([\n ...this.#components,\n ...ma.getComponents()\n ], {\n validate: false\n })\n }\n\n decapsulate (addr: Multiaddr | string): MultiaddrInterface {\n const addrString = addr.toString()\n const s = this.toString()\n const i = s.lastIndexOf(addrString)\n\n if (i < 0) {\n throw new InvalidParametersError(`Address ${this.toString()} does not contain subaddress: ${addrString}`)\n }\n\n return new Multiaddr(s.slice(0, i), {\n validate: false\n })\n }\n\n decapsulateCode (code: number): Multiaddr {\n let index\n\n for (let i = this.#components.length - 1; i > -1; i--) {\n if (this.#components[i].code === code) {\n index = i\n break\n }\n }\n\n return new Multiaddr(this.#components.slice(0, index), {\n validate: false\n })\n }\n\n equals (addr: { bytes: Uint8Array }): boolean {\n return uint8ArrayEquals(this.bytes, addr.bytes)\n }\n\n /**\n * Returns Multiaddr as a human-readable string\n * https://nodejs.org/api/util.html#utilinspectcustom\n *\n * @example\n * ```js\n * import { multiaddr } from '@multiformats/multiaddr'\n *\n * console.info(multiaddr('/ip4/127.0.0.1/tcp/4001'))\n * // 'Multiaddr(/ip4/127.0.0.1/tcp/4001)'\n * ```\n */\n [inspect] (): string {\n return `Multiaddr(${this.toString()})`\n }\n}\n\n/**\n * Ensures all multiaddr tuples are correct. Throws if any invalid protocols or\n * values are encountered.\n */\nexport function validate (addr: Multiaddr): void {\n addr.getComponents()\n .forEach(component => {\n const codec = registry.getProtocol(component.code)\n\n if (component.value == null) {\n return\n }\n\n codec.validate?.(component.value)\n })\n}\n", "/**\n * @packageDocumentation\n *\n * A standard way to represent addresses that\n *\n * - support any standard network protocol\n * - have a binary packed format\n * - have a nice string representation\n * - encapsulate well\n *\n * @example\n *\n * ```TypeScript\n * import { multiaddr } from '@multiformats/multiaddr'\n *\n * const addr = multiaddr('/ip4/127.0.0.1/udp/1234')\n * // Multiaddr(/ip4/127.0.0.1/udp/1234)\n *\n * addr.bytes\n * // <Uint8Array 04 7f 00 00 01 11 04 d2>\n *\n * addr.toString()\n * // '/ip4/127.0.0.1/udp/1234'\n *\n * addr.getComponents()\n * // [\n * // { code: 4, name: 'ip4', value: '127.0.0.1' },\n * // { code: 273, name: 'udp', value: '1234' }\n * // ]\n *\n * addr.encapsulate('/sctp/5678')\n * // Multiaddr(/ip4/127.0.0.1/udp/1234/sctp/5678)\n * ```\n *\n * @example Adding custom protocols\n *\n * To add application-specific or experimental protocols, add a protocol codec\n * to the protocol registry:\n *\n * ```ts\n * import { registry, V, multiaddr } from '@multiformats/multiaddr'\n * import type { ProtocolCodec } from '@multiformats/multiaddr'\n *\n * const maWithCustomTuple = '/custom-protocol/hello'\n *\n * // throws UnknownProtocolError\n * multiaddr(maWithCustomTuple)\n *\n * const protocol: ProtocolCodec = {\n * code: 2059,\n * name: 'custom-protocol',\n * size: V\n * // V means variable length, can also be 0, a positive integer (e.g. a fixed\n * // length or omitted\n * }\n *\n * registry.addProtocol(protocol)\n *\n * // does not throw UnknownProtocolError\n * multiaddr(maWithCustomTuple)\n *\n * // protocols can also be removed\n * registry.removeProtocol(protocol.code)\n * ```\n */\n\nimport { Multiaddr as MultiaddrClass, symbol } from './multiaddr.ts'\nimport { registry, V } from './registry.ts'\nimport type { ProtocolCodec } from './registry.ts'\n\n/**\n * The protocol registry stores protocol codecs that allow transformation of\n * multiaddr tuples from bytes to string and back again, and also validation of\n * the address values.\n */\nexport interface Registry {\n /**\n * Retrieve a protocol definition by it's code or name\n */\n getProtocol (key: string | number): ProtocolCodec\n\n /**\n * Add a new protocol definition\n */\n addProtocol (codec: ProtocolCodec): void\n\n /**\n * Remove a protocol definition by it's code\n */\n removeProtocol (code: number): void\n}\n\n/**\n * These types can be parsed into a {@link Multiaddr} object\n */\nexport type MultiaddrInput = string | Multiaddr | Uint8Array | null | Component[]\n\n/**\n * A Component is a section of a multiaddr with a name/code, possibly with a\n * value.\n *\n * Component names/codes are defined in the protocol table.\n *\n * @see https://github.com/multiformats/multiaddr/blob/master/protocols.csv\n */\nexport interface Component {\n /**\n * The code of the component as defined in the protocol table\n */\n code: number\n\n /**\n * The name of the component as defined in the protocol table\n */\n name: string\n\n /**\n * The component value, if one is present\n */\n value?: string\n\n /**\n * The bytes that make up the component. This will be set if the multiaddr\n * was parsed from a `Uint8Array`, or if `.bytes` has been accessed on it.\n */\n bytes?: Uint8Array<ArrayBuffer>\n}\n\nexport interface Multiaddr {\n bytes: Uint8Array<ArrayBuffer>\n\n /**\n * Returns Multiaddr as a String\n *\n * @example\n * ```js\n * import { multiaddr } from '@multiformats/multiaddr'\n *\n * multiaddr('/ip4/127.0.0.1/tcp/4001').toString()\n * // '/ip4/127.0.0.1/tcp/4001'\n * ```\n */\n toString(): string\n\n /**\n * Returns Multiaddr as a JSON encoded object\n *\n * @example\n * ```js\n * import { multiaddr } from '@multiformats/multiaddr'\n *\n * JSON.stringify(multiaddr('/ip4/127.0.0.1/tcp/4001'))\n * // '/ip4/127.0.0.1/tcp/4001'\n * ```\n */\n toJSON(): string\n\n /**\n * Returns the components that make up this Multiaddr\n *\n * @example\n * ```ts\n * import { multiaddr } from '@multiformats/multiaddr'\n *\n * multiaddr('/ip4/127.0.0.1/tcp/4001').getComponents()\n * // [{ name: 'ip4', code: 4, value: '127.0.0.1' }, { name: 'tcp', code: 6, value: '4001' }]\n * ```\n */\n getComponents(): Component[]\n\n /**\n * Encapsulates a Multiaddr in another Multiaddr\n *\n * @example\n * ```js\n * import { multiaddr } from '@multiformats/multiaddr'\n *\n * const mh1 = multiaddr('/ip4/8.8.8.8/tcp/1080')\n * // Multiaddr(/ip4/8.8.8.8/tcp/1080)\n *\n * const mh2 = multiaddr('/ip4/127.0.0.1/tcp/4001')\n * // Multiaddr(/ip4/127.0.0.1/tcp/4001)\n *\n * const mh3 = mh1.encapsulate(mh2)\n * // Multiaddr(/ip4/8.8.8.8/tcp/1080/ip4/127.0.0.1/tcp/4001)\n *\n * mh3.toString()\n * // '/ip4/8.8.8.8/tcp/1080/ip4/127.0.0.1/tcp/4001'\n * ```\n *\n * @param {MultiaddrInput} addr - Multiaddr to add into this Multiaddr\n */\n encapsulate(addr: MultiaddrInput): Multiaddr\n\n /**\n * Decapsulates a Multiaddr from another Multiaddr\n *\n * @example\n * ```js\n * import { multiaddr } from '@multiformats/multiaddr'\n *\n * const mh1 = multiaddr('/ip4/8.8.8.8/tcp/1080')\n * // Multiaddr(/ip4/8.8.8.8/tcp/1080)\n *\n * const mh2 = multiaddr('/ip4/127.0.0.1/tcp/4001')\n * // Multiaddr(/ip4/127.0.0.1/tcp/4001)\n *\n * const mh3 = mh1.encapsulate(mh2)\n * // Multiaddr(/ip4/8.8.8.8/tcp/1080/ip4/127.0.0.1/tcp/4001)\n *\n * mh3.decapsulate(mh2).toString()\n * // '/ip4/8.8.8.8/tcp/1080'\n * ```\n *\n * @param {Multiaddr | string} addr - Multiaddr to remove from this Multiaddr\n */\n decapsulate(addr: Multiaddr | string): Multiaddr\n\n /**\n * A more reliable version of `decapsulate` if you are targeting a specific\n * code, such as 421 (the `p2p` protocol code). The last index of the code\n * will be removed from the `Multiaddr`, and a new instance will be returned.\n * If the code is not present, the original `Multiaddr` is returned.\n *\n * @example\n * ```js\n * import { multiaddr } from '@multiformats/multiaddr'\n *\n * const addr = multiaddr('/ip4/0.0.0.0/tcp/8080/p2p/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSupNKC')\n * // Multiaddr(/ip4/0.0.0.0/tcp/8080/p2p/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSupNKC)\n *\n * addr.decapsulateCode(421).toString()\n * // '/ip4/0.0.0.0/tcp/8080'\n *\n * multiaddr('/ip4/127.0.0.1/tcp/8080').decapsulateCode(421).toString()\n * // '/ip4/127.0.0.1/tcp/8080'\n * ```\n */\n decapsulateCode(code: number): Multiaddr\n\n /**\n * Checks if two Multiaddrs are the same\n *\n * @example\n * ```js\n * import { multiaddr } from '@multiformats/multiaddr'\n *\n * const mh1 = multiaddr('/ip4/8.8.8.8/tcp/1080')\n * // Multiaddr(/ip4/8.8.8.8/tcp/1080)\n *\n * const mh2 = multiaddr('/ip4/127.0.0.1/tcp/4001')\n * // Multiaddr(/ip4/127.0.0.1/tcp/4001)\n *\n * mh1.equals(mh1)\n * // true\n *\n * mh1.equals(mh2)\n * // false\n * ```\n */\n equals(addr?: any): boolean\n}\n\n/**\n * Check if object is a {@link Multiaddr} instance\n *\n * @example\n *\n * ```js\n * import { isMultiaddr, multiaddr } from '@multiformats/multiaddr'\n *\n * isMultiaddr(5)\n * // false\n * isMultiaddr(multiaddr('/ip4/127.0.0.1'))\n * // true\n * ```\n */\nexport function isMultiaddr (value: any): value is Multiaddr {\n return Boolean(value?.[symbol])\n}\n\n/**\n * A function that takes a {@link MultiaddrInput} and returns a {@link Multiaddr}\n *\n * @example\n * ```js\n * import { multiaddr } from '@libp2p/multiaddr'\n *\n * multiaddr('/ip4/127.0.0.1/tcp/4001')\n * // Multiaddr(/ip4/127.0.0.1/tcp/4001)\n * ```\n *\n * @param {MultiaddrInput} [addr] - If String or Uint8Array, needs to adhere to the address format of a [multiaddr](https://github.com/multiformats/multiaddr#string-format)\n */\nexport function multiaddr (addr?: MultiaddrInput): Multiaddr {\n return new MultiaddrClass(addr)\n}\n\n/**\n * Export all table.csv codes. These are all named exports so can be tree-shaken\n * out by bundlers.\n */\nexport * from './constants.ts'\nexport { registry, V }\nexport type { ProtocolCodec }\n", "import type { Matcher, MultiaddrMatcher } from './index.js'\nimport type { Multiaddr, Component } from '@multiformats/multiaddr'\n\n/**\n * Matches a multiaddr component with the specified code but no value\n */\nexport const code = (code: number): Matcher => {\n return {\n match: (vals) => {\n const component = vals[0]\n\n if (component == null) {\n return false\n }\n\n if (component.code !== code) {\n return false\n }\n\n if (component.value != null) {\n return false\n }\n\n return vals.slice(1)\n }\n }\n}\n\n/**\n * Matches a multiaddr component with the specified code and value. If the value\n * is omitted any non-undefined value is matched.\n */\nexport const value = (code: number, value?: string): Matcher => {\n return {\n match: (vals) => {\n const component = vals[0]\n\n if (component?.code !== code) {\n return false\n }\n\n if (component.value == null) {\n return false\n }\n\n if (value != null && component.value !== value) {\n return false\n }\n\n return vals.slice(1)\n }\n }\n}\n\n/**\n * Matches a multiaddr component with the specified code and value. If the value\n * is omitted any non-undefined value is matched.\n */\nexport const not = (matcher: Matcher): Matcher => {\n return {\n match: (vals) => {\n const result = matcher.match(vals)\n\n if (result === false) {\n return vals\n }\n\n return false\n }\n }\n}\n\n/**\n * An optional matcher\n */\nexport const optional = (matcher: Matcher): Matcher => {\n return {\n match: (vals) => {\n const result = matcher.match(vals)\n\n if (result === false) {\n return vals\n }\n\n return result\n }\n }\n}\n\n/**\n * Matches any one of the passed matches\n */\nexport const or = (...matchers: Matcher[]): Matcher => {\n return {\n match: (vals) => {\n let matches: Component[] | undefined\n\n for (const matcher of matchers) {\n const result = matcher.match(vals)\n\n // no match\n if (result === false) {\n continue\n }\n\n // choose greediest matcher\n if (matches == null || result.length < matches.length) {\n matches = result\n }\n }\n\n if (matches == null) {\n return false\n }\n\n return matches\n }\n }\n}\n\n/**\n * Matches all of the passed matchers\n */\nexport const and = (...matchers: Matcher[]): Matcher => {\n return {\n match: (vals) => {\n for (const matcher of matchers) {\n // pass what's left of the array\n const result = matcher.match(vals)\n\n // no match\n if (result === false) {\n return false\n }\n\n vals = result\n }\n\n return vals\n }\n }\n}\n\n/**\n * Create a multiaddr matcher from the passed component matchers\n */\nexport function fmt (...matchers: Matcher[]): MultiaddrMatcher {\n function match (ma?: Multiaddr): Component[] | false {\n if (ma == null) {\n return false\n }\n\n let parts = ma.getComponents()\n\n for (const matcher of matchers) {\n const result = matcher.match(parts)\n\n if (result === false) {\n return false\n }\n\n parts = result\n }\n\n return parts\n }\n\n function matches (ma?: Multiaddr): boolean {\n const result = match(ma)\n\n return result !== false\n }\n\n function exactMatch (ma?: Multiaddr): boolean {\n const result = match(ma)\n\n if (result === false) {\n return false\n }\n\n return result.length === 0\n }\n\n return {\n matchers,\n matches,\n exactMatch\n }\n}\n", "/**\n * @packageDocumentation\n *\n * This module exports various matchers that can be used to infer the type of a\n * passed multiaddr.\n *\n * @example\n *\n * ```ts\n * import { multiaddr } from '@multiformats/multiaddr'\n * import { DNS } from '@multiformats/multiaddr-matcher'\n *\n * const ma = multiaddr('/dnsaddr/example.org')\n *\n * DNS.matches(ma) // true - this is a multiaddr with a DNS address at the start\n * ```\n *\n * @example\n *\n * The default matching behaviour ignores any subsequent tuples in the multiaddr.\n * If you want stricter matching you can use `.exactMatch`:\n *\n * ```ts\n * import { multiaddr } from '@multiformats/multiaddr'\n * import { DNS, Circuit } from '@multiformats/multiaddr-matcher'\n *\n * const ma = multiaddr('/dnsaddr/example.org/p2p/QmFoo/p2p-circuit/p2p/QmBar')\n *\n * DNS.exactMatch(ma) // false - this address has extra tuples after the DNS component\n * Circuit.matches(ma) // true\n * Circuit.exactMatch(ma) // true - the extra tuples are circuit relay related\n * ```\n */\n\nimport { CODE_P2P, CODE_DNS4, CODE_DNS6, CODE_DNSADDR, CODE_DNS, CODE_IP4, CODE_IP6, CODE_TCP, CODE_UDP, CODE_QUIC, CODE_QUIC_V1, CODE_WS, CODE_WSS, CODE_TLS, CODE_SNI, CODE_WEBRTC_DIRECT, CODE_CERTHASH, CODE_WEBTRANSPORT, CODE_P2P_CIRCUIT, CODE_WEBRTC, CODE_HTTP, CODE_UNIX, CODE_HTTPS, CODE_MEMORY, CODE_IP6ZONE, CODE_IPCIDR, CODE_HTTP_PATH } from '@multiformats/multiaddr'\nimport { and, or, optional, fmt, code, value, not } from './utils.js'\nimport type { Multiaddr, Component } from '@multiformats/multiaddr'\n\n/**\n * A matcher accepts multiaddr components and either fails to match and returns\n * false or returns a sublist of unmatched components\n */\nexport interface Matcher {\n match(parts: Component[]): Component[] | false\n}\n\n/**\n * A MultiaddrMatcher allows interpreting a multiaddr as a certain type of\n * multiaddr\n */\nexport interface MultiaddrMatcher {\n /**\n * The matchers that make up this MultiaddrMatcher - useful if you want to\n * make your own custom matchers\n */\n matchers: Matcher[]\n\n /**\n * Returns true if the passed multiaddr can be treated as this type of\n * multiaddr\n */\n matches(ma?: Multiaddr): boolean\n\n /**\n * Returns true if the passed multiaddr terminates as this type of\n * multiaddr\n */\n exactMatch(ma?: Multiaddr): boolean\n}\n\n/**\n * Matches PeerId addresses\n *\n * @example\n *\n * ```ts\n * import { multiaddr } from '@multiformats/multiaddr'\n * import { PEER_ID } from '@multiformats/multiaddr-matcher'\n *\n * PEER_ID.matches(multiaddr('/p2p/Qmfoo')) // true\n * PEER_ID.matches(multiaddr('/ipfs/Qmfoo')) // true\n * ```\n */\nconst _PEER_ID = value(CODE_P2P)\n\nexport const PEER_ID = fmt(_PEER_ID)\n\n/**\n * DNS matchers\n */\nconst _DNS4 = value(CODE_DNS4)\nconst _DNS6 = value(CODE_DNS6)\nconst _DNSADDR = value(CODE_DNSADDR)\nconst _DNS = value(CODE_DNS)\n\n/**\n * Matches dns4 addresses.\n *\n * Use {@link DNS DNS} instead to match any type of DNS address.\n *\n * @example\n *\n * ```ts\n * import { multiaddr } from '@multiformats/multiaddr'\n * import { DNS4 } from '@multiformats/multiaddr-matcher'\n *\n * DNS4.matches(multiaddr('/dns4/example.org')) // true\n * ```\n */\nexport const DNS4 = fmt(_DNS4, optional(value(CODE_P2P)))\n\n/**\n * Matches dns6 addresses.\n *\n * Use {@link DNS DNS} instead to match any type of DNS address.\n *\n * @example\n *\n * ```ts\n * import { multiaddr } from '@multiformats/multiaddr'\n * import { DNS6 } from '@multiformats/multiaddr-matcher'\n *\n * DNS6.matches(multiaddr('/dns6/example.org')) // true\n * ```\n */\nexport const DNS6 = fmt(_DNS6, optional(value(CODE_P2P)))\n\n/**\n * Matches dnsaddr addresses.\n *\n * Use {@link DNS DNS} instead to match any type of DNS address.\n *\n * @example\n *\n * ```ts\n * import { multiaddr } from '@multiformats/multiaddr'\n * import { DNSADDR } from '@multiformats/multiaddr-matcher'\n *\n * DNSADDR.matches(multiaddr('/dnsaddr/example.org')) // true\n * DNSADDR.matches(multiaddr('/dnsaddr/example.org/p2p/Qmfoo')) // true\n * ```\n */\nexport const DNSADDR = fmt(_DNSADDR, optional(value(CODE_P2P)))\n\n/**\n * Matches any dns address.\n *\n * @example\n *\n * ```ts\n * import { multiaddr } from '@multiformats/multiaddr'\n * import { DNS } from '@multiformats/multiaddr-matcher'\n *\n * DNS.matches(multiaddr('/dnsaddr/example.org')) // true\n * DNS.matches(multiaddr('/dns4/example.org')) // true\n * DNS.matches(multiaddr('/dns6/example.org')) // true\n * DNS.matches(multiaddr('/dns6/example.org/p2p/Qmfoo')) // true\n * ```\n */\nexport const DNS = fmt(or(_DNS, _DNSADDR, _DNS4, _DNS6), optional(value(CODE_P2P)))\n\nconst _IP4 = and(\n value(CODE_IP4),\n optional(value(CODE_IPCIDR))\n)\nconst _IP6 = and(\n optional(value(CODE_IP6ZONE)),\n value(CODE_IP6),\n optional(value(CODE_IPCIDR))\n)\nconst _IP = or(_IP4, _IP6)\n\nconst _IP_OR_DOMAIN = or(_IP, _DNS, _DNS4, _DNS6, _DNSADDR)\n\n/**\n * A matcher for addresses that start with IP or DNS tuples.\n *\n * @example\n *\n * ```ts\n * import { multiaddr } from '@multiformats/multiaddr'\n * import { IP_OR_DOMAIN } from '@multiformats/multiaddr-matcher'\n *\n * IP_OR_DOMAIN.matches(multiaddr('/ip4/123.123.123.123')) // true\n * IP_OR_DOMAIN.matches(multiaddr('/ip4/123.123.123.123/p2p/QmFoo')) // true\n * IP_OR_DOMAIN.matches(multiaddr('/dns/example.com/p2p/QmFoo')) // true\n * IP_OR_DOMAIN.matches(multiaddr('/p2p/QmFoo')) // false\n * ```\n */\nexport const IP_OR_DOMAIN = fmt(or(_IP, and(or(_DNS, _DNSADDR, _DNS4, _DNS6), optional(value(CODE_P2P)))))\n\n/**\n * Matches ip4 addresses.\n *\n * Use {@link IP IP} instead to match any ip4/ip6 address.\n *\n * @example\n *\n * ```ts\n * import { multiaddr } from '@multiformats/multiaddr'\n * import { IP4 } from '@multiformats/multiaddr-matcher'\n *\n * const ma = multiaddr('/ip4/123.123.123.123')\n *\n * IP4.matches(ma) // true\n * ```\n */\nexport const IP4 = fmt(_IP4)\n\n/**\n * Matches ip6 addresses.\n *\n * Use {@link IP IP} instead to match any ip4/ip6 address.\n *\n * @example\n *\n * ```ts\n * import { multiaddr } from '@multiformats/multiaddr'\n * import { IP6 } from '@multiformats/multiaddr-matcher'\n *\n * const ma = multiaddr('/ip6/fe80::1cc1:a3b8:322f:cf22')\n *\n * IP6.matches(ma) // true\n * ```\n */\nexport const IP6 = fmt(_IP6)\n\n/**\n * Matches ip4 or ip6 addresses.\n *\n * @example\n *\n * ```ts\n * import { multiaddr } from '@multiformats/multiaddr'\n * import { IP } from '@multiformats/multiaddr-matcher'\n *\n * IP.matches(multiaddr('/ip4/123.123.123.123')) // true\n * IP.matches(multiaddr('/ip6/fe80::1cc1:a3b8:322f:cf22')) // true\n * ```\n */\nexport const IP = fmt(_IP)\n\nconst _TCP = and(_IP_OR_DOMAIN, value(CODE_TCP))\nconst _UDP = and(_IP_OR_DOMAIN, value(CODE_UDP))\n\n/**\n * Matches TCP addresses.\n *\n * @example\n *\n * ```ts\n * import { multiaddr } from '@multiformats/multiaddr'\n * import { TCP } from '@multiformats/multiaddr-matcher'\n *\n * TCP.matches(multiaddr('/ip4/123.123.123.123/tcp/1234')) // true\n * ```\n */\nexport const TCP = fmt(and(_TCP, optional(value(CODE_P2P))))\n\n/**\n * Matches UDP addresses.\n *\n * @example\n *\n * ```ts\n * import { multiaddr } from '@multiformats/multiaddr'\n * import { UDP } from '@multiformats/multiaddr-matcher'\n *\n * UDP.matches(multiaddr('/ip4/123.123.123.123/udp/1234')) // true\n * ```\n */\nexport const UDP = fmt(_UDP)\n\nconst _QUIC = and(_UDP, code(CODE_QUIC), optional(value(CODE_P2P)))\nconst _QUIC_V1 = and(_UDP, code(CODE_QUIC_V1), optional(value(CODE_P2P)))\n\nconst QUIC_V0_OR_V1 = or(_QUIC, _QUIC_V1)\n\n/**\n * Matches QUIC addresses.\n *\n * @example\n *\n * ```ts\n * import { multiaddr } from '@multiformats/multiaddr'\n * import { QUIC } from '@multiformats/multiaddr-matcher'\n *\n * QUIC.matches(multiaddr('/ip4/123.123.123.123/udp/1234/quic')) // true\n * ```\n */\nexport const QUIC = fmt(_QUIC)\n\n/**\n * Matches QUICv1 addresses.\n *\n * @example\n *\n * ```ts\n * import { multiaddr } from '@multiformats/multiaddr'\n * import { QUIC_V1 } from '@multiformats/multiaddr-matcher'\n *\n * QUIC_V1.matches(multiaddr('/ip4/123.123.123.123/udp/1234/quic-v1')) // true\n * ```\n */\nexport const QUIC_V1 = fmt(_QUIC_V1)\n\nconst _WEB = or(\n _IP_OR_DOMAIN,\n _TCP,\n _UDP,\n _QUIC,\n _QUIC_V1\n)\n\nconst _WebSockets = or(\n and(_WEB, code(CODE_WS), optional(value(CODE_P2P)))\n)\n\n/**\n * Matches WebSocket addresses.\n *\n * @example\n *\n * ```ts\n * import { multiaddr } from '@multiformats/multiaddr'\n * import { WebSockets } from '@multiformats/multiaddr-matcher'\n *\n * WebSockets.matches(multiaddr('/ip4/123.123.123.123/tcp/1234/ws')) // true\n * ```\n */\nexport const WebSockets = fmt(_WebSockets)\n\nconst _WebSocketsSecure = or(\n and(_WEB, code(CODE_WSS), optional(value(CODE_P2P))),\n and(_WEB, code(CODE_TLS), optional(value(CODE_SNI)), code(CODE_WS), optional(value(CODE_P2P)))\n)\n\n/**\n * Matches secure WebSocket addresses.\n *\n * @example\n *\n * ```ts\n * import { multiaddr } from '@multiformats/multiaddr'\n * import { WebSocketsSecure } from '@multiformats/multiaddr-matcher'\n *\n * WebSocketsSecure.matches(multiaddr('/ip4/123.123.123.123/tcp/1234/wss')) // true\n * ```\n */\nexport const WebSocketsSecure = fmt(_WebSocketsSecure)\n\nconst _WebRTCDirect = and(_UDP, code(CODE_WEBRTC_DIRECT), optional(value(CODE_CERTHASH)), optional(value(CODE_CERTHASH)), optional(value(CODE_P2P)))\n\n/**\n * Matches WebRTC-direct addresses.\n *\n * @example\n *\n * ```ts\n * import { multiaddr } from '@multiformats/multiaddr'\n * import { WebRTCDirect } from '@multiformats/multiaddr-matcher'\n *\n * WebRTCDirect.matches(multiaddr('/ip4/123.123.123.123/tcp/1234/p2p/QmFoo/webrtc-direct/certhash/u....')) // true\n * ```\n */\nexport const WebRTCDirect = fmt(_WebRTCDirect)\n\nconst _WebTransport = and(_QUIC_V1, code(CODE_WEBTRANSPORT), optional(value(CODE_CERTHASH)), optional(value(CODE_CERTHASH)), optional(value(CODE_P2P)))\n\n/**\n * Matches WebTransport addresses.\n *\n * @example\n *\n * ```ts\n * import { multiaddr } from '@multiformats/multiaddr'\n * import { WebRTCDirect } from '@multiformats/multiaddr-matcher'\n *\n * WebRTCDirect.matches(multiaddr('/ip4/123.123.123.123/udp/1234/quic-v1/webtransport/certhash/u..../certhash/u..../p2p/QmFoo')) // true\n * ```\n */\nexport const WebTransport = fmt(_WebTransport)\n\nconst _P2P = or(\n _WebSockets,\n _WebSocketsSecure,\n and(_TCP, optional(value(CODE_P2P))),\n and(QUIC_V0_OR_V1, optional(value(CODE_P2P))),\n and(_IP_OR_DOMAIN, optional(value(CODE_P2P))),\n _WebRTCDirect,\n _WebTransport,\n value(CODE_P2P)\n)\n\n/**\n * Matches peer addresses\n *\n * @example\n *\n * ```ts\n * import { multiaddr } from '@multiformats/multiaddr'\n * import { P2P } from '@multiformats/multiaddr-matcher'\n *\n * P2P.matches(multiaddr('/ip4/123.123.123.123/tcp/1234/p2p/QmFoo')) // true\n * ```\n */\nexport const P2P = fmt(_P2P)\n\nconst _Circuit = and(optional(_P2P), code(CODE_P2P_CIRCUIT), not(code(CODE_WEBRTC)), optional(value(CODE_P2P)))\n\n/**\n * Matches circuit relay addresses\n *\n * @example\n *\n * ```ts\n * import { multiaddr } from '@multiformats/multiaddr'\n * import { Circuit } from '@multiformats/multiaddr-matcher'\n *\n * Circuit.matches(multiaddr('/ip4/123.123.123.123/tcp/1234/p2p/QmRelay/p2p-circuit/p2p/QmTarget')) // true\n * ```\n */\nexport const Circuit = fmt(_Circuit)\n\nconst _WebRTC = or(\n and(_P2P, code(CODE_P2P_CIRCUIT), code(CODE_WEBRTC), optional(value(CODE_P2P))),\n and(_P2P, code(CODE_WEBRTC), optional(value(CODE_P2P))),\n and(code(CODE_WEBRTC), optional(value(CODE_P2P)))\n)\n\n/**\n * Matches WebRTC addresses\n *\n * @example\n *\n * ```ts\n * import { multiaddr } from '@multiformats/multiaddr'\n * import { WebRTC } from '@multiformats/multiaddr-matcher'\n *\n * WebRTC.matches(multiaddr('/ip4/123.123.123.123/tcp/1234/p2p/QmRelay/p2p-circuit/webrtc/p2p/QmTarget')) // true\n * ```\n */\nexport const WebRTC = fmt(_WebRTC)\n\nconst _HTTP = and(_IP_OR_DOMAIN, or(\n and(value(CODE_TCP, '80')),\n and(value(CODE_TCP), code(CODE_HTTP)),\n code(CODE_HTTP)\n), optional(value(CODE_HTTP_PATH)), optional(value(CODE_P2P))\n)\n\n/**\n * Matches HTTP addresses\n *\n * @example\n *\n * ```ts\n * import { multiaddr } from '@multiformats/multiaddr'\n * import { HTTP } from '@multiformats/multiaddr-matcher'\n *\n * HTTP.matches(multiaddr('/dns/example.org/http')) // true\n * ```\n */\nexport const HTTP = fmt(_HTTP)\n\nconst _HTTPS = and(_IP_OR_DOMAIN, or(\n and(value(CODE_TCP, '443')),\n and(value(CODE_TCP, '443'), code(CODE_HTTP)),\n and(value(CODE_TCP), code(CODE_HTTPS)),\n and(value(CODE_TCP), code(CODE_TLS), code(CODE_HTTP)),\n and(code(CODE_TLS), code(CODE_HTTP)),\n code(CODE_TLS),\n code(CODE_HTTPS)\n), optional(value(CODE_HTTP_PATH)), optional(value(CODE_P2P))\n)\n\n/**\n * Matches HTTPS addresses\n *\n * @example\n *\n * ```ts\n * import { multiaddr } from '@multiformats/multiaddr'\n * import { HTTP } from '@multiformats/multiaddr-matcher'\n *\n * HTTP.matches(multiaddr('/dns/example.org/tls/http')) // true\n * ```\n */\nexport const HTTPS = fmt(_HTTPS)\n\nconst _Memory = or(\n and(value(CODE_MEMORY), optional(value(CODE_P2P)))\n)\n\n/**\n * Matches Memory addresses\n *\n * @example\n *\n * ```ts\n * import { multiaddr } from '@multiformats/multiaddr'\n * import { Memory } from '@multiformats/multiaddr-matcher'\n *\n * Memory.matches(multiaddr('/memory/0xDEADBEEF')) // true\n * ```\n */\nexport const Memory = fmt(_Memory)\n\nconst _Unix = or(\n and(value(CODE_UNIX), optional(value(CODE_P2P)))\n)\n\n/**\n * Matches Unix addresses\n *\n * @example\n *\n * ```ts\n * import { multiaddr } from '@multiformats/multiaddr'\n * import { Unix } from '@multiformats/multiaddr-matcher'\n *\n * Unix.matches(multiaddr('/unix/%2Fpath%2Fto%2Funix.socket')) // true\n * ```\n */\nexport const Unix = fmt(_Unix)\n", "import pTimeout from 'p-timeout';\n\nconst normalizeEmitter = emitter => {\n\tconst addListener = emitter.addEventListener || emitter.on || emitter.addListener;\n\tconst removeListener = emitter.removeEventListener || emitter.off || emitter.removeListener;\n\n\tif (!addListener || !removeListener) {\n\t\tthrow new TypeError('Emitter is not compatible');\n\t}\n\n\treturn {\n\t\taddListener: addListener.bind(emitter),\n\t\tremoveListener: removeListener.bind(emitter),\n\t};\n};\n\nexport function pEventMultiple(emitter, event, options) {\n\tlet cancel;\n\tconst returnValue = new Promise((resolve, reject) => {\n\t\toptions = {\n\t\t\trejectionEvents: ['error'],\n\t\t\tmultiArgs: false,\n\t\t\trejectionMultiArgs: false,\n\t\t\tresolveImmediately: false,\n\t\t\t...options,\n\t\t};\n\n\t\tif (!(options.count >= 0 && (options.count === Number.POSITIVE_INFINITY || Number.isInteger(options.count)))) {\n\t\t\tthrow new TypeError('The `count` option should be at least 0 or more');\n\t\t}\n\n\t\toptions.signal?.throwIfAborted();\n\n\t\t// Allow multiple events\n\t\tconst events = [event].flat();\n\n\t\tconst items = [];\n\t\tconst {addListener, removeListener} = normalizeEmitter(emitter);\n\n\t\tconst onItem = async (...arguments_) => {\n\t\t\tconst value = options.multiArgs ? arguments_ : arguments_[0];\n\n\t\t\tif (options.filter) {\n\t\t\t\ttry {\n\t\t\t\t\tif (!(await options.filter(value))) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t} catch (error) {\n\t\t\t\t\tcancel();\n\t\t\t\t\treject(error);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\titems.push(value);\n\n\t\t\tif (options.count === items.length) {\n\t\t\t\tcancel();\n\t\t\t\tresolve(items);\n\t\t\t}\n\t\t};\n\n\t\tconst rejectHandler = (...arguments_) => {\n\t\t\tcancel();\n\t\t\treject(options.rejectionMultiArgs ? arguments_ : arguments_[0]);\n\t\t};\n\n\t\tcancel = () => {\n\t\t\tfor (const event of events) {\n\t\t\t\tremoveListener(event, onItem);\n\t\t\t}\n\n\t\t\tfor (const rejectionEvent of options.rejectionEvents) {\n\t\t\t\t// Only remove rejection handler if we actually registered it\n\t\t\t\tif (!events.includes(rejectionEvent)) {\n\t\t\t\t\tremoveListener(rejectionEvent, rejectHandler);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tfor (const event of events) {\n\t\t\taddListener(event, onItem);\n\t\t}\n\n\t\tfor (const rejectionEvent of options.rejectionEvents) {\n\t\t\t// Skip registering rejection handler if we're already listening to this event\n\t\t\t// as the main event takes priority (as documented)\n\t\t\tif (!events.includes(rejectionEvent)) {\n\t\t\t\taddListener(rejectionEvent, rejectHandler);\n\t\t\t}\n\t\t}\n\n\t\tif (options.signal) {\n\t\t\toptions.signal.addEventListener('abort', () => {\n\t\t\t\trejectHandler(options.signal.reason);\n\t\t\t}, {once: true});\n\t\t}\n\n\t\tif (options.resolveImmediately) {\n\t\t\tresolve(items);\n\t\t}\n\t});\n\n\treturnValue.cancel = cancel;\n\n\tif (typeof options.timeout === 'number') {\n\t\tconst timeout = pTimeout(returnValue, {milliseconds: options.timeout});\n\t\t// When cancelling, also clear the timeout timer\n\t\ttimeout.cancel = () => {\n\t\t\tcancel();\n\t\t\ttimeout.clear();\n\t\t};\n\n\t\treturn timeout;\n\t}\n\n\treturn returnValue;\n}\n\nexport function pEvent(emitter, event, options) {\n\tif (typeof options === 'function') {\n\t\toptions = {filter: options};\n\t}\n\n\toptions = {\n\t\t...options,\n\t\tcount: 1,\n\t\tresolveImmediately: false,\n\t};\n\n\tconst arrayPromise = pEventMultiple(emitter, event, options);\n\tconst promise = arrayPromise.then(array => array[0]); // eslint-disable-line promise/prefer-await-to-then\n\tpromise.cancel = arrayPromise.cancel;\n\n\treturn promise;\n}\n\nexport function pEventIterator(emitter, event, options) {\n\tif (typeof options === 'function') {\n\t\toptions = {filter: options};\n\t}\n\n\t// Allow multiple events\n\tconst events = [event].flat();\n\n\toptions = {\n\t\trejectionEvents: ['error'],\n\t\tresolutionEvents: [],\n\t\tlimit: Number.POSITIVE_INFINITY,\n\t\tmultiArgs: false,\n\t\trejectionMultiArgs: false,\n\t\t...options,\n\t};\n\n\tconst {limit} = options;\n\tconst isValidLimit = limit >= 0 && (limit === Number.POSITIVE_INFINITY || Number.isInteger(limit));\n\tif (!isValidLimit) {\n\t\tthrow new TypeError('The `limit` option should be a non-negative integer or Infinity');\n\t}\n\n\toptions.signal?.throwIfAborted();\n\n\tif (limit === 0) {\n\t\t// Return an empty async iterator to avoid any further cost\n\t\treturn {\n\t\t\t[Symbol.asyncIterator]() {\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tasync next() {\n\t\t\t\treturn {\n\t\t\t\t\tdone: true,\n\t\t\t\t\tvalue: undefined,\n\t\t\t\t};\n\t\t\t},\n\t\t};\n\t}\n\n\tconst {addListener, removeListener} = normalizeEmitter(emitter);\n\n\tlet isDone = false;\n\tlet error;\n\tlet hasPendingError = false;\n\tconst nextQueue = [];\n\tconst valueQueue = [];\n\tlet eventCount = 0;\n\tlet isLimitReached = false;\n\n\tconst valueHandler = (...arguments_) => {\n\t\teventCount++;\n\t\tisLimitReached = eventCount === limit;\n\n\t\tconst value = options.multiArgs ? arguments_ : arguments_[0];\n\n\t\tif (nextQueue.length > 0) {\n\t\t\tconst {resolve} = nextQueue.shift();\n\n\t\t\tresolve({done: false, value});\n\n\t\t\tif (isLimitReached) {\n\t\t\t\tcancel();\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tvalueQueue.push(value);\n\n\t\tif (isLimitReached) {\n\t\t\tcancel();\n\t\t}\n\t};\n\n\tconst cancel = () => {\n\t\tisDone = true;\n\n\t\tfor (const event of events) {\n\t\t\tremoveListener(event, valueHandler);\n\t\t}\n\n\t\tfor (const rejectionEvent of options.rejectionEvents) {\n\t\t\tremoveListener(rejectionEvent, rejectHandler);\n\t\t}\n\n\t\tfor (const resolutionEvent of options.resolutionEvents) {\n\t\t\tremoveListener(resolutionEvent, resolveHandler);\n\t\t}\n\n\t\twhile (nextQueue.length > 0) {\n\t\t\tconst {resolve} = nextQueue.shift();\n\t\t\tresolve({done: true, value: undefined});\n\t\t}\n\t};\n\n\tconst rejectHandler = (...arguments_) => {\n\t\terror = options.rejectionMultiArgs ? arguments_ : arguments_[0];\n\n\t\tif (nextQueue.length > 0) {\n\t\t\tconst {reject} = nextQueue.shift();\n\t\t\treject(error);\n\t\t} else {\n\t\t\thasPendingError = true;\n\t\t}\n\n\t\tcancel();\n\t};\n\n\tconst resolveHandler = async (...arguments_) => {\n\t\tconst value = options.multiArgs ? arguments_ : arguments_[0];\n\n\t\tif (options.filter) {\n\t\t\ttry {\n\t\t\t\tif (!(await options.filter(value))) {\n\t\t\t\t\tcancel();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} catch (filterError) {\n\t\t\t\tcancel();\n\t\t\t\tif (nextQueue.length > 0) {\n\t\t\t\t\tconst {reject} = nextQueue.shift();\n\t\t\t\t\treject(filterError);\n\t\t\t\t} else {\n\t\t\t\t\t// Store error for next iterator call\n\t\t\t\t\thasPendingError = true;\n\t\t\t\t\terror = filterError;\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (nextQueue.length > 0) {\n\t\t\tconst {resolve} = nextQueue.shift();\n\t\t\tresolve({done: true, value});\n\t\t} else {\n\t\t\tvalueQueue.push(value);\n\t\t}\n\n\t\tcancel();\n\t};\n\n\tfor (const event of events) {\n\t\taddListener(event, valueHandler);\n\t}\n\n\tfor (const rejectionEvent of options.rejectionEvents) {\n\t\taddListener(rejectionEvent, rejectHandler);\n\t}\n\n\tfor (const resolutionEvent of options.resolutionEvents) {\n\t\taddListener(resolutionEvent, resolveHandler);\n\t}\n\n\tif (options.signal) {\n\t\toptions.signal.addEventListener('abort', () => {\n\t\t\trejectHandler(options.signal.reason);\n\t\t}, {once: true});\n\t}\n\n\treturn {\n\t\t[Symbol.asyncIterator]() {\n\t\t\treturn this;\n\t\t},\n\t\tasync next() {\n\t\t\tif (valueQueue.length > 0) {\n\t\t\t\tconst value = valueQueue.shift();\n\t\t\t\treturn {\n\t\t\t\t\tdone: isDone && valueQueue.length === 0 && !isLimitReached,\n\t\t\t\t\tvalue,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (hasPendingError) {\n\t\t\t\thasPendingError = false;\n\t\t\t\tthrow error;\n\t\t\t}\n\n\t\t\tif (isDone) {\n\t\t\t\treturn {\n\t\t\t\t\tdone: true,\n\t\t\t\t\tvalue: undefined,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\tnextQueue.push({resolve, reject});\n\t\t\t});\n\t\t},\n\t\tasync return(value) {\n\t\t\tcancel();\n\t\t\treturn {\n\t\t\t\tdone: isDone,\n\t\t\t\tvalue,\n\t\t\t};\n\t\t},\n\t};\n}\n\nexport {TimeoutError} from 'p-timeout';\n", "import type { Startable } from '@libp2p/interface'\n\nexport interface DebouncedFunction extends Startable {\n (): void\n}\n\n/**\n * Returns a function wrapper that will only call the passed function once\n *\n * Important - the passed function should not throw or reject\n */\nexport function debounce (func: () => void | Promise<void>, wait: number): DebouncedFunction {\n let timeout: ReturnType<typeof setTimeout> | undefined\n\n const output = function (): void {\n const later = function (): void {\n timeout = undefined\n void func()\n }\n\n clearTimeout(timeout)\n timeout = setTimeout(later, wait)\n }\n output.start = (): void => {}\n output.stop = (): void => {\n clearTimeout(timeout)\n }\n\n return output\n}\n", "import type { RateLimiterResult } from './rate-limiter.ts'\n\n/**\n * A rate limit was hit\n */\nexport class RateLimitError extends Error {\n remainingPoints: number\n msBeforeNext: number\n consumedPoints: number\n isFirstInDuration: boolean\n\n constructor (message = 'Rate limit exceeded', props: RateLimiterResult) {\n super(message)\n this.name = 'RateLimitError'\n this.remainingPoints = props.remainingPoints\n this.msBeforeNext = props.msBeforeNext\n this.consumedPoints = props.consumedPoints\n this.isFirstInDuration = props.isFirstInDuration\n }\n}\n\nexport class QueueFullError extends Error {\n static name = 'QueueFullError'\n\n constructor (message: string = 'The queue was full') {\n super(message)\n this.name = 'QueueFullError'\n }\n}\n\nexport class UnexpectedEOFError extends Error {\n static name = 'UnexpectedEOFError'\n name = 'UnexpectedEOFError'\n}\n\nexport class MaxEarlyStreamsError extends Error {\n static name = 'MaxEarlyStreamsError'\n name = 'MaxEarlyStreamsError'\n}\n\nexport class StreamClosedError extends Error {\n static name = 'StreamClosedError'\n name = 'StreamClosedError'\n}\n", "import { AbortError } from '@libp2p/interface'\nimport pDefer from 'p-defer'\nimport type { AbortOptions } from '@libp2p/interface'\nimport type { DeferredPromise } from 'p-defer'\nimport type { ProgressOptions, ProgressEventListener } from 'progress-events'\n\nexport class JobRecipient<JobReturnType, JobOptions extends AbortOptions & ProgressOptions = any> {\n public deferred: DeferredPromise<JobReturnType>\n public signal?: AbortSignal\n public onProgress?: ProgressEventListener\n\n constructor (options?: Partial<Pick<JobOptions, 'signal' | 'onProgress'>>) {\n this.signal = options?.signal\n this.onProgress = options?.onProgress\n this.deferred = pDefer()\n\n this.onAbort = this.onAbort.bind(this)\n this.signal?.addEventListener('abort', this.onAbort)\n }\n\n onAbort (): void {\n this.deferred.reject(this.signal?.reason ?? new AbortError())\n }\n\n cleanup (): void {\n this.signal?.removeEventListener('abort', this.onAbort)\n }\n}\n", "import { AbortError } from '@libp2p/interface'\nimport { setMaxListeners } from 'main-event'\nimport { raceSignal } from 'race-signal'\nimport { JobRecipient } from './recipient.ts'\nimport type { JobStatus } from './index.ts'\nimport type { AbortOptions } from '@libp2p/interface'\nimport type { ProgressOptions } from 'progress-events'\n\n/**\n * Returns a random string\n */\nfunction randomId (): string {\n return `${(parseInt(String(Math.random() * 1e9), 10)).toString()}${Date.now()}`\n}\n\nexport interface JobTimeline {\n created: number\n started?: number\n finished?: number\n}\n\nexport class Job <JobOptions extends AbortOptions & ProgressOptions = AbortOptions, JobReturnType = unknown> {\n public id: string\n public fn: (options: JobOptions) => Promise<JobReturnType>\n public options: JobOptions\n public recipients: Array<JobRecipient<JobReturnType>>\n public status: JobStatus\n public readonly timeline: JobTimeline\n private readonly controller: AbortController\n private dispatchingProgress: boolean\n\n constructor (fn: (options: JobOptions) => Promise<JobReturnType>, options: any) {\n this.id = randomId()\n this.status = 'queued'\n this.fn = fn\n this.options = options\n this.recipients = []\n this.timeline = {\n created: Date.now()\n }\n\n this.controller = new AbortController()\n setMaxListeners(Infinity, this.controller.signal)\n\n this.dispatchingProgress = false\n\n this.onAbort = this.onAbort.bind(this)\n }\n\n abort (err: Error): void {\n this.controller.abort(err)\n }\n\n onAbort (): void {\n const allAborted = this.recipients.reduce((acc, curr) => {\n return acc && (curr.signal?.aborted === true)\n }, true)\n\n // if all recipients have aborted the job, actually abort the job\n if (allAborted) {\n this.controller.abort(new AbortError())\n this.cleanup()\n }\n }\n\n async join (options?: Partial<Pick<JobOptions, 'signal' | 'onProgress'>>): Promise<JobReturnType> {\n const recipient = new JobRecipient<JobReturnType>(options)\n this.recipients.push(recipient)\n\n options?.signal?.addEventListener('abort', this.onAbort)\n\n return recipient.deferred.promise\n }\n\n async run (): Promise<void> {\n this.status = 'running'\n this.timeline.started = Date.now()\n\n try {\n this.controller.signal.throwIfAborted()\n\n const result = await raceSignal(this.fn({\n ...(this.options ?? {}),\n signal: this.controller.signal,\n onProgress: (evt: any): void => {\n // Recipients can transitively re-enter this dispatcher; without\n // this guard a single event recurses until the stack overflows.\n if (this.dispatchingProgress) {\n return\n }\n\n this.dispatchingProgress = true\n\n try {\n this.recipients.forEach(recipient => {\n recipient.onProgress?.(evt)\n })\n } finally {\n this.dispatchingProgress = false\n }\n }\n }), this.controller.signal)\n\n this.recipients.forEach(recipient => {\n recipient.deferred.resolve(result)\n })\n\n this.status = 'complete'\n } catch (err) {\n this.recipients.forEach(recipient => {\n recipient.deferred.reject(err)\n })\n\n this.status = 'errored'\n } finally {\n this.timeline.finished = Date.now()\n this.cleanup()\n }\n }\n\n cleanup (): void {\n this.recipients.forEach(recipient => {\n recipient.cleanup()\n recipient.signal?.removeEventListener('abort', this.onAbort)\n })\n }\n}\n", "import { AbortError } from '@libp2p/interface'\nimport { pushable } from 'it-pushable'\nimport { TypedEventEmitter } from 'main-event'\nimport { pEvent } from 'p-event'\nimport { debounce } from '../debounce.ts'\nimport { QueueFullError } from '../errors.ts'\nimport { Job } from './job.ts'\nimport type { AbortOptions, Metrics } from '@libp2p/interface'\nimport type { ProgressOptions } from 'progress-events'\n\nexport type { Job, JobTimeline } from './job.ts'\nexport type { JobRecipient } from './recipient.ts'\n\nexport interface Comparator<T> {\n (a: T, b: T): -1 | 0 | 1\n}\n\nexport interface QueueInit<JobReturnType, JobOptions extends AbortOptions = AbortOptions> {\n /**\n * Concurrency limit.\n *\n * Minimum: `1`.\n *\n * @default Infinity\n */\n concurrency?: number\n\n /**\n * If the queue size grows to larger than this number the promise returned\n * from the add function will reject\n *\n * @default Infinity\n */\n maxSize?: number\n\n /**\n * The name of the metric for the queue length\n */\n metricName?: string\n\n /**\n * An implementation of the libp2p Metrics interface\n */\n metrics?: Metrics\n\n /**\n * An optional function that will sort the queue after a job has been added\n */\n sort?: Comparator<Job<JobOptions, JobReturnType>>\n}\n\nexport type JobStatus = 'queued' | 'running' | 'errored' | 'complete'\n\nexport interface RunFunction<Options extends AbortOptions = AbortOptions, ReturnType = void> {\n (options: Options): Promise<ReturnType>\n}\n\nexport interface JobMatcher<JobOptions extends AbortOptions = AbortOptions> {\n (options?: Partial<JobOptions>): boolean\n}\n\nexport interface QueueJobSuccess<JobReturnType, JobOptions extends AbortOptions = AbortOptions> {\n job: Job<JobOptions, JobReturnType>\n result: JobReturnType\n}\n\nexport interface QueueJobFailure<JobReturnType, JobOptions extends AbortOptions = AbortOptions> {\n job: Job<JobOptions, JobReturnType>\n error: Error\n}\n\nexport interface QueueEvents<JobReturnType, JobOptions extends AbortOptions = AbortOptions> {\n /**\n * A job is about to start running\n */\n active: CustomEvent\n\n /**\n * All jobs have finished and the queue is empty\n */\n idle: CustomEvent\n\n /**\n * The queue is empty, jobs may be running\n */\n empty: CustomEvent\n\n /**\n * A job was added to the queue\n */\n add: CustomEvent\n\n /**\n * A job has finished or failed\n */\n next: CustomEvent\n\n /**\n * A job has finished successfully\n */\n completed: CustomEvent<JobReturnType>\n\n /**\n * Emitted just after `\"completed\", a job has finished successfully - this\n * event gives access to the job and it's result\n */\n success: CustomEvent<QueueJobSuccess<JobReturnType, JobOptions>>\n\n /**\n * Emitted just after `\"error\", a job has failed - this event gives access to\n * the job and the thrown error\n */\n failure: CustomEvent<QueueJobFailure<JobReturnType, JobOptions>>\n}\n\n/**\n * Heavily influence by `p-queue` with the following differences:\n *\n * 1. Items remain at the head of the queue while they are running so `queue.size` includes `queue.pending` items - this is so interested parties can join the results of a queue item while it is running\n * 2. The options for a job are stored separately to the job in order for them to be modified while they are still in the queue\n */\nexport class Queue<JobReturnType = unknown, JobOptions extends AbortOptions & ProgressOptions = AbortOptions> extends TypedEventEmitter<QueueEvents<JobReturnType, JobOptions>> {\n public concurrency: number\n public maxSize: number\n public queue: Array<Job<JobOptions, JobReturnType>>\n private pending: number\n private readonly sort?: Comparator<Job<JobOptions, JobReturnType>>\n private paused: boolean\n\n constructor (init: QueueInit<JobReturnType, JobOptions> = {}) {\n super()\n\n this.concurrency = init.concurrency ?? Number.POSITIVE_INFINITY\n this.maxSize = init.maxSize ?? Number.POSITIVE_INFINITY\n this.pending = 0\n this.paused = false\n\n if (init.metricName != null) {\n init.metrics?.registerMetricGroup(init.metricName, {\n calculate: () => {\n return {\n size: this.queue.length,\n running: this.pending,\n queued: this.queue.length - this.pending\n }\n }\n })\n }\n\n this.sort = init.sort\n this.queue = []\n\n this.emitEmpty = debounce(this.emitEmpty.bind(this), 1)\n this.emitIdle = debounce(this.emitIdle.bind(this), 1)\n }\n\n emitEmpty (): void {\n if (this.size !== 0) {\n return\n }\n\n this.safeDispatchEvent('empty')\n }\n\n emitIdle (): void {\n if (this.running !== 0) {\n return\n }\n\n this.safeDispatchEvent('idle')\n }\n\n pause (): void {\n this.paused = true\n }\n\n resume (): void {\n if (!this.paused) {\n return\n }\n\n this.paused = false\n this.tryToStartAnother()\n }\n\n private tryToStartAnother (): boolean {\n if (this.paused) {\n return false\n }\n\n if (this.size === 0) {\n this.emitEmpty()\n\n if (this.running === 0) {\n this.emitIdle()\n }\n\n return false\n }\n\n if (this.pending < this.concurrency) {\n let job: Job<JobOptions, JobReturnType> | undefined\n\n for (const j of this.queue) {\n if (j.status === 'queued') {\n job = j\n break\n }\n }\n\n if (job == null) {\n return false\n }\n\n this.safeDispatchEvent('active')\n\n this.pending++\n\n void job.run()\n .finally(() => {\n // remove the job from the queue\n for (let i = 0; i < this.queue.length; i++) {\n if (this.queue[i] === job) {\n this.queue.splice(i, 1)\n break\n }\n }\n\n this.pending--\n this.tryToStartAnother()\n this.safeDispatchEvent('next')\n })\n\n return true\n }\n\n return false\n }\n\n private enqueue (job: Job<JobOptions, JobReturnType>): void {\n this.queue.push(job)\n\n if (this.sort != null) {\n this.queue.sort(this.sort)\n }\n }\n\n /**\n * Adds a sync or async task to the queue. Always returns a promise.\n */\n async add (fn: RunFunction<JobOptions, JobReturnType>, options?: JobOptions): Promise<JobReturnType> {\n options?.signal?.throwIfAborted()\n\n if (this.size === this.maxSize) {\n throw new QueueFullError()\n }\n\n const job = new Job<JobOptions, JobReturnType>(fn, options)\n this.enqueue(job)\n this.safeDispatchEvent('add')\n\n const result = job.join(options)\n .then(result => {\n this.safeDispatchEvent('completed', { detail: result })\n this.safeDispatchEvent('success', { detail: { job, result } })\n\n return result\n })\n .catch(err => {\n if (job.status === 'queued') {\n // job was aborted before it started - remove the job from the queue\n for (let i = 0; i < this.queue.length; i++) {\n if (this.queue[i] === job) {\n this.queue.splice(i, 1)\n break\n }\n }\n }\n\n this.safeDispatchEvent('failure', { detail: { job, error: err } })\n\n throw err\n })\n\n this.tryToStartAnother()\n\n return result\n }\n\n /**\n * Clear the queue\n */\n clear (): void {\n this.queue.splice(0, this.queue.length)\n }\n\n /**\n * Abort all jobs in the queue and clear it\n */\n abort (): void {\n this.queue.forEach(job => {\n job.abort(new AbortError())\n })\n\n this.clear()\n }\n\n /**\n * Can be called multiple times. Useful if you for example add additional items at a later time.\n *\n * @returns A promise that settles when the queue becomes empty.\n */\n async onEmpty (options?: AbortOptions): Promise<void> {\n // Instantly resolve if the queue is empty\n if (this.size === 0) {\n return\n }\n\n await pEvent(this, 'empty', options)\n }\n\n /**\n * @returns A promise that settles when the queue size is less than the given\n * limit: `queue.size < limit`.\n *\n * If you want to avoid having the queue grow beyond a certain size you can\n * `await queue.onSizeLessThan()` before adding a new item.\n *\n * Note that this only limits the number of items waiting to start. There\n * could still be up to `concurrency` jobs already running that this call does\n * not include in its calculation.\n */\n async onSizeLessThan (limit: number, options?: AbortOptions): Promise<void> {\n // Instantly resolve if the queue is empty.\n if (this.size < limit) {\n return\n }\n\n await pEvent(this, 'next', {\n ...options,\n filter: () => this.size < limit\n })\n }\n\n /**\n * The difference with `.onEmpty` is that `.onIdle` guarantees that all work\n * from the queue has finished. `.onEmpty` merely signals that the queue is\n * empty, but it could mean that some promises haven't completed yet.\n *\n * @returns A promise that settles when the queue becomes empty, and all\n * promises have completed; `queue.size === 0 && queue.pending === 0`.\n */\n async onIdle (options?: AbortOptions): Promise<void> {\n // Instantly resolve if none pending and if nothing else is queued\n if (this.pending === 0 && this.size === 0) {\n return\n }\n\n await pEvent(this, 'idle', options)\n }\n\n /**\n * Size of the queue including running items\n */\n get size (): number {\n return this.queue.length\n }\n\n /**\n * The number of queued items waiting to run.\n */\n get queued (): number {\n return this.queue.length - this.pending\n }\n\n /**\n * The number of items currently running.\n */\n get running (): number {\n return this.pending\n }\n\n /**\n * Returns an async generator that makes it easy to iterate over the results\n * of jobs added to the queue.\n *\n * The generator will end when the queue becomes idle, that is there are no\n * jobs running and no jobs that have yet to run.\n *\n * If you need to keep the queue open indefinitely, consider using it-pushable\n * instead.\n */\n async * toGenerator (options?: AbortOptions): AsyncGenerator<JobReturnType, void, unknown> {\n options?.signal?.throwIfAborted()\n\n const stream = pushable<JobReturnType>({\n objectMode: true\n })\n\n const cleanup = (err?: Error): void => {\n if (err != null) {\n this.abort()\n } else {\n this.clear()\n }\n\n stream.end(err)\n }\n\n const onQueueJobComplete = (evt: CustomEvent<JobReturnType>): void => {\n if (evt.detail != null) {\n stream.push(evt.detail)\n }\n }\n\n const onQueueFailure = (evt: CustomEvent<QueueJobFailure<JobReturnType, JobOptions>>): void => {\n cleanup(evt.detail.error)\n }\n\n const onQueueIdle = (): void => {\n cleanup()\n }\n\n // clear the queue and throw if the query is aborted\n const onSignalAbort = (): void => {\n cleanup(new AbortError('Queue aborted'))\n }\n\n // add listeners\n this.addEventListener('completed', onQueueJobComplete)\n this.addEventListener('failure', onQueueFailure)\n this.addEventListener('idle', onQueueIdle)\n options?.signal?.addEventListener('abort', onSignalAbort)\n\n try {\n yield * stream\n } finally {\n // remove listeners\n this.removeEventListener('completed', onQueueJobComplete)\n this.removeEventListener('failure', onQueueFailure)\n this.removeEventListener('idle', onQueueIdle)\n options?.signal?.removeEventListener('abort', onSignalAbort)\n\n // empty the queue for when the user has broken out of a loop early\n cleanup()\n }\n }\n}\n", "export class InsufficientProvidersError extends Error {\n static name = 'InsufficientProvidersError'\n\n constructor (message = 'Insufficient providers found') {\n super(message)\n this.name = 'InsufficientProvidersError'\n }\n}\n\nexport class NoRoutersAvailableError extends Error {\n static name = 'NoRoutersAvailableError'\n\n constructor (message = 'No routers available') {\n super(message)\n this.name = 'NoRoutersAvailableError'\n }\n}\n\nexport class UnknownHashAlgorithmError extends Error {\n static name = 'UnknownHashAlgorithmError'\n\n constructor (message = 'Unknown hash algorithm') {\n super(message)\n this.name = 'UnknownHashAlgorithmError'\n }\n}\n\nexport class UnknownCodecError extends Error {\n static name = 'UnknownCodecError'\n\n constructor (message = 'Unknown codec') {\n super(message)\n this.name = 'UnknownCodecError'\n }\n}\n\nexport class InvalidCodecError extends Error {\n static name = 'InvalidCodecError'\n\n constructor (message = 'Invalid codec') {\n super(message)\n this.name = 'InvalidCodecError'\n }\n}\n\nexport class UnknownCryptoError extends Error {\n static name = 'UnknownCryptoError'\n name = 'UnknownCryptoError'\n}\n", "import { DEFAULT_SESSION_MIN_PROVIDERS, DEFAULT_SESSION_MAX_PROVIDERS, DEFAULT_CID_PEER_FILTER_SIZE, InsufficientProvidersError } from '@helia/interface'\nimport { AbortError, TypedEventEmitter, setMaxListeners } from '@libp2p/interface'\nimport { createScalableCuckooFilter, Queue } from '@libp2p/utils'\nimport { base64 } from 'multiformats/bases/base64'\nimport pDefer from 'p-defer'\nimport { raceSignal } from 'race-signal'\nimport type { BlockBroker, BlockRetrievalOptions, CreateSessionOptions } from '@helia/interface'\nimport type { AbortOptions, ComponentLogger, Logger } from '@libp2p/interface'\nimport type { Filter } from '@libp2p/utils'\nimport type { Multiaddr } from '@multiformats/multiaddr'\nimport type { CID } from 'multiformats/cid'\nimport type { DeferredPromise } from 'p-defer'\nimport type { ProgressEvent } from 'progress-events'\n\nexport interface AbstractSessionComponents {\n logger: ComponentLogger\n}\n\nexport interface AbstractCreateSessionOptions extends CreateSessionOptions {\n name: string\n}\n\nexport interface BlockstoreSessionEvents<Provider> {\n provider: CustomEvent<Provider>\n}\n\ninterface Request {\n promise: Promise<Uint8Array>\n observers: number\n queryFilter: Filter\n}\n\nexport abstract class AbstractSession<Provider, RetrieveBlockProgressEvents extends ProgressEvent> extends TypedEventEmitter<BlockstoreSessionEvents<Provider>> implements BlockBroker<RetrieveBlockProgressEvents> {\n public abstract name: string\n private initialPeerSearchComplete?: Promise<void>\n private readonly requests: Map<string, Request>\n private readonly logName: string\n protected log: Logger\n protected logger: ComponentLogger\n private readonly minProviders: number\n private readonly maxProviders: number\n public readonly providers: Provider[]\n private readonly evictionFilter: Filter\n private readonly initialProviders: Array<CID | Multiaddr | Multiaddr[]>\n private readonly cidPeerFilterSize: number\n\n constructor (components: AbstractSessionComponents, init: AbstractCreateSessionOptions) {\n super()\n\n setMaxListeners(Infinity, this)\n this.logName = init.name\n this.logger = components.logger\n this.log = components.logger.forComponent(this.logName)\n this.requests = new Map()\n this.minProviders = init.minProviders ?? DEFAULT_SESSION_MIN_PROVIDERS\n this.maxProviders = init.maxProviders ?? DEFAULT_SESSION_MAX_PROVIDERS\n this.cidPeerFilterSize = init.cidPeerFilterSize ?? DEFAULT_CID_PEER_FILTER_SIZE\n this.providers = []\n this.evictionFilter = createScalableCuckooFilter(this.maxProviders)\n this.initialProviders = [...(init.providers ?? [])]\n }\n\n async retrieve (cid: CID, options: BlockRetrievalOptions<RetrieveBlockProgressEvents> = {}): Promise<Uint8Array> {\n // see if we are already requesting this CID in this session\n const cidStr = base64.encode(cid.multihash.bytes)\n const existingJob = this.requests.get(cidStr)\n\n if (existingJob != null) {\n this.log('join existing request for %c', cid)\n existingJob.observers++\n return existingJob.promise\n }\n\n const deferred: DeferredPromise<Uint8Array> = pDefer()\n const request = {\n promise: deferred.promise,\n observers: 1,\n queryFilter: createScalableCuckooFilter(this.cidPeerFilterSize)\n }\n this.requests.set(cidStr, request)\n\n // if this is the first time this session has been used\n let first = false\n\n if (this.initialPeerSearchComplete == null) {\n first = true\n this.log = this.logger.forComponent(`${this.logName}:${cid}`)\n this.initialPeerSearchComplete = this.findProviders(cid, this.minProviders, options)\n }\n\n let foundBlock = false\n\n // this queue manages outgoing requests - as new peers are added to the\n // session they will be added to the queue so we can request the current\n // block from multiple peers as they are discovered\n const queue = new Queue<Uint8Array, { provider: Provider, priority?: number } & AbortOptions>({\n concurrency: this.maxProviders\n })\n queue.addEventListener('failure', (evt) => {\n this.log.error('error querying provider %s, evicting from session - %e', evt.detail.job.options.provider, evt.detail.error)\n this.evict(evt.detail.job.options.provider)\n })\n queue.addEventListener('success', (evt) => {\n // peer has sent block, return it to the caller\n foundBlock = true\n deferred.resolve(evt.detail.result)\n })\n queue.addEventListener('idle', () => {\n if (foundBlock) {\n this.log.trace('session idle, found block')\n // we either found the block or the user gave up\n return\n }\n\n if (options.signal?.aborted === true) {\n this.log.trace('session idle, signal aborted')\n return\n }\n\n // find more session peers and retry\n Promise.resolve()\n .then(async () => {\n this.log('no session peers had block for for %c, finding new providers', cid)\n\n // evict this.minProviders random providers to make room for more\n for (let i = 0; i < this.minProviders; i++) {\n if (this.providers.length === 0) {\n break\n }\n\n const provider = this.providers[Math.floor(Math.random() * this.providers.length)]\n this.evict(provider)\n }\n\n // find new providers for the CID\n await this.findProviders(cid, this.minProviders, options)\n\n // keep trying until the abort signal fires\n this.log('found new providers re-retrieving %c', cid)\n this.requests.delete(cidStr)\n deferred.resolve(await this.retrieve(cid, options))\n })\n .catch(err => {\n this.log.error('could not find new providers for %c - %e', cid, err)\n deferred.reject(err)\n })\n })\n\n const peerAddedToSessionListener = (event: CustomEvent<Provider>): void => {\n const filterKey = this.toFilterKey(event.detail)\n\n if (request.queryFilter.has(filterKey)) {\n return\n }\n\n request.queryFilter.add(filterKey)\n\n // dispatch progress notification\n this.emitFoundProviderProgressEvent(cid, event.detail, options)\n\n queue.add(async () => {\n return this.queryProvider(cid, event.detail, options)\n }, {\n provider: event.detail\n })\n .catch(err => {\n if (options.signal?.aborted === true) {\n // skip logging error if signal was aborted because abort can happen\n // on success (e.g. another session found the block)\n return\n }\n\n this.log.error('error retrieving session block for %c - %e', cid, err)\n })\n }\n\n // add new session peers to query as they are discovered\n this.addEventListener('provider', peerAddedToSessionListener)\n\n if (first) {\n try {\n await raceSignal(this.initialPeerSearchComplete, options.signal)\n\n if (first) {\n this.log('found initial session peers for %c', cid)\n }\n } catch (err) {\n if (first) {\n this.log('failed to find initial session peers for %c - %e', cid, err)\n }\n\n this.requests.delete(cidStr)\n\n if (request.observers > 1) {\n // only need to reject request if another context is now also waiting\n // for the result - otherwise we can end up with an unhandled promise\n // rejection\n deferred.reject(err)\n }\n\n throw err\n }\n }\n\n // query each session peer directly\n Promise.all(\n [...this.providers]\n .filter(provider => {\n const filterKey = this.toFilterKey(provider)\n const has = request.queryFilter.has(filterKey)\n\n if (!has) {\n request.queryFilter.add(this.toFilterKey(provider))\n }\n\n return !has\n })\n .map(async (provider) => {\n return queue.add(async () => this.queryProvider(cid, provider, options), {\n provider\n })\n })\n )\n .catch(err => {\n if (options.signal?.aborted === true) {\n // skip logging error if signal was aborted because abort can happen\n // on success (e.g. another session found the block)\n return\n }\n\n this.log.error('error retrieving session block for %c - %e', cid, err)\n })\n\n const signalAbortedListener = (): void => {\n deferred.reject(new AbortError(options.signal?.reason ?? 'Session aborted'))\n queue.abort()\n }\n\n options.signal?.addEventListener('abort', signalAbortedListener)\n\n try {\n return await deferred.promise\n } finally {\n this.removeEventListener('provider', peerAddedToSessionListener)\n options.signal?.removeEventListener('abort', signalAbortedListener)\n queue.clear()\n this.requests.delete(cidStr)\n }\n }\n\n evict (provider: Provider): void {\n this.evictionFilter.add(this.toFilterKey(provider))\n const index = this.providers.findIndex(prov => this.equals(prov, provider))\n\n if (index === -1) {\n return\n }\n\n this.providers.splice(index, 1)\n }\n\n isEvicted (provider: Provider): boolean {\n return this.evictionFilter.has(this.toFilterKey(provider))\n }\n\n hasProvider (provider: Provider): boolean {\n // dedupe existing gateways\n if (this.providers.find(prov => this.equals(prov, provider)) != null) {\n return true\n }\n\n // dedupe failed session peers\n if (this.isEvicted(provider)) {\n return true\n }\n\n return false\n }\n\n async addPeer (peer: CID | Multiaddr | Multiaddr[], options?: AbortOptions): Promise<void> {\n const provider = await this.convertToProvider(peer, 'manually-added', options)\n\n if (provider == null || this.hasProvider(provider)) {\n return\n }\n\n this.providers.push(provider)\n\n // let the new peer join current queries\n this.safeDispatchEvent('provider', {\n detail: provider\n })\n }\n\n private async findProviders (cid: CID, count: number, options: BlockRetrievalOptions<RetrieveBlockProgressEvents>): Promise<void> {\n const deferred: DeferredPromise<void> = pDefer()\n let found = 0\n\n // run async to resolve the deferred promise when `count` providers are\n // found but continue util this.providers reaches this.maxProviders\n void Promise.resolve()\n .then(async () => {\n this.log('finding %d-%d new provider(s) for %c - %d initial providers', count, this.maxProviders, cid, this.initialProviders.length)\n\n const self = this\n\n // process any specific providers for this session\n const initialProviders = async function * (): AsyncGenerator<Provider> {\n while (self.initialProviders.length > 0) {\n const initialProvider = self.initialProviders.pop()\n\n if (initialProvider == null) {\n continue\n }\n\n const provider = await self.convertToProvider(initialProvider, 'manual', options)\n\n if (provider == null) {\n continue\n }\n\n yield provider\n }\n }\n\n const providers = async function * (): AsyncGenerator<Provider> {\n yield * initialProviders()\n yield * self.findNewProviders(cid, options)\n }\n\n // still not got enough providers, search routing for more\n for await (const provider of providers()) {\n if (this.providers.length === this.maxProviders || options.signal?.aborted === true) {\n break\n }\n\n if (this.hasProvider(provider)) {\n continue\n }\n\n this.log('found %d providers, %d in session', found, this.providers.length)\n this.providers.push(provider)\n\n // let the new peer join current queries\n this.safeDispatchEvent('provider', {\n detail: provider\n })\n\n found++\n\n if (this.providers.length === count) {\n this.log('session is ready with %d peer(s), new peers present', this.providers.length)\n deferred.resolve()\n // continue finding peers until we reach this.maxProviders\n }\n\n if (this.providers.length === this.maxProviders) {\n this.log('found max session peers %d', this.providers.length)\n break\n }\n }\n\n this.log('found %d new session peers while trying to find %d, %d in session', found, count, this.providers.length)\n\n if (this.providers.length < count) {\n throw new InsufficientProvidersError(`Found ${found} of ${count} ${this.name} providers for ${cid}, ${this.providers.length} in session after evictions`)\n }\n })\n .catch(err => {\n this.log.error('error searching routing for potential session peers for %c - %e', cid, err)\n deferred.reject(err)\n })\n\n return deferred.promise\n }\n\n /**\n * If this session was created with specific providers, convert one of them\n * into the format required or return `undefined` if the provider is not\n * compatible with this session implementation\n */\n abstract convertToProvider (provider: CID | Multiaddr | Multiaddr[], routing: string, options?: AbortOptions): Promise<Provider | undefined>\n\n /**\n * This method should search for new providers and yield them.\n */\n abstract findNewProviders (cid: CID, options: BlockRetrievalOptions<RetrieveBlockProgressEvents>): AsyncGenerator<Provider>\n\n /**\n * The subclass should contact the provider and request the block from it.\n *\n * If the provider cannot provide the block an error should be thrown.\n *\n * The provider will then be excluded from ongoing queries.\n */\n abstract queryProvider (cid: CID, provider: Provider, options: AbortOptions): Promise<Uint8Array>\n\n /**\n * Turn a provider into a concise Uint8Array representation for use in a Bloom\n * or Cuckoo filter\n */\n abstract toFilterKey (provider: Provider): Uint8Array | string\n\n /**\n * Return `true` if we consider one provider to be the same as another\n */\n abstract equals (providerA: Provider, providerB: Provider): boolean\n\n /**\n * Invoke the progress handler with the session-specific found provider event\n */\n abstract emitFoundProviderProgressEvent (cid: CID, provider: Provider, options: BlockRetrievalOptions<RetrieveBlockProgressEvents>): void\n}\n", "import { CID } from 'multiformats/cid'\n\nexport function isCID (obj?: any): obj is CID {\n if (obj == null) {\n return false\n }\n\n return CID.asCID(obj) != null\n}\n", "/**\n * @packageDocumentation\n *\n * This module allows easy conversion of Multiaddrs to string URIs.\n *\n * @example Converting multiaddrs to string URIs\n *\n * ```js\n * import { multiaddrToUri } from '@multiformats/multiaddr-to-uri'\n *\n * console.log(multiaddrToUri('/dnsaddr/protocol.ai/https'))\n * // -> https://protocol.ai\n *\n * console.log(multiaddrToUri('/ip4/127.0.0.1/tcp/8080'))\n * // -> http://127.0.0.1:8080\n *\n * console.log(multiaddrToUri('/ip4/127.0.0.1/tcp/8080', { assumeHttp: false }))\n * // -> tcp://127.0.0.1:8080\n * ```\n *\n * Note:\n *\n * - When `/tcp` is the last (terminating) protocol HTTP is assumed by default (implicit `assumeHttp: true`)\n * - this means produced URIs will start with `http://` instead of `tcp://`\n * - passing `{ assumeHttp: false }` disables this behavior\n * - Might be lossy - e.g. a DNSv6 multiaddr\n * - Can throw if the passed multiaddr:\n * - is not a valid multiaddr\n * - is not supported as a URI e.g. circuit\n */\n\nimport { CODE_TCP, CODE_DNS, CODE_DNS4, CODE_DNS6, CODE_DNSADDR, multiaddr, CODE_TLS, CODE_IP6 } from '@multiformats/multiaddr'\nimport type { Component, Multiaddr } from '@multiformats/multiaddr'\n\nexport interface MultiaddrToUriOpts {\n assumeHttp?: boolean\n}\n\nconst ASSUME_HTTP_CODES = [\n CODE_TCP,\n CODE_DNS,\n CODE_DNSADDR,\n CODE_DNS4,\n CODE_DNS6\n]\n\ninterface Interpreter {\n (head: Component, rest: Component[]): string | undefined\n}\n\nfunction extractSNI (ma: Component[]): string | undefined {\n return extractTuple('sni', ma)?.value\n}\n\nfunction extractPort (ma: Component[]): string {\n const port = extractTuple('tcp', ma)?.value\n\n if (port == null) {\n return ''\n }\n\n return `:${port}`\n}\n\nfunction extractTuple (name: string, ma: Component[]): Component | undefined {\n return ma.find(component => component.name === name)\n}\n\nfunction hasTLS (ma: Component[]): boolean {\n return ma.some(({ code }) => code === CODE_TLS)\n}\n\nfunction interpretNext (head: Component, rest: Component[]): string | undefined {\n const interpreter = interpreters[head.name]\n if (interpreter == null) {\n throw new Error(`Can't interpret protocol ${head.name}`)\n }\n const restVal = interpreter(head, rest)\n if (head.code === CODE_IP6) {\n return `[${restVal}]`\n }\n return restVal\n}\n\nconst interpreters: Record<string, Interpreter> = {\n ip4: (head, rest) => head.value,\n ip6: (head, rest) => {\n if (rest.length === 0) {\n return head.value\n }\n return `[${head.value}]`\n },\n tcp: (head, rest) => {\n const tail = rest.pop()\n if (tail == null) {\n throw new Error('Unexpected end of multiaddr')\n }\n return `tcp://${interpretNext(tail, rest)}:${head.value}`\n },\n udp: (head, rest) => {\n const tail = rest.pop()\n if (tail == null) {\n throw new Error('Unexpected end of multiaddr')\n }\n return `udp://${interpretNext(tail, rest)}:${head.value}`\n },\n dnsaddr: (head, rest) => head.value,\n dns4: (head, rest) => head.value,\n dns6: (head, rest) => head.value,\n dns: (head, rest) => head.value,\n ipfs: (head, rest) => {\n const tail = rest.pop()\n if (tail == null) {\n throw new Error('Unexpected end of multiaddr')\n }\n return `${interpretNext(tail, rest)}`\n },\n p2p: (head, rest) => {\n const tail = rest.pop()\n if (tail == null) {\n throw new Error('Unexpected end of multiaddr')\n }\n return `${interpretNext(tail, rest)}`\n },\n http: (head, rest) => {\n const maHasTLS = hasTLS(rest)\n const sni = extractSNI(rest)\n const port = extractPort(rest)\n if (maHasTLS && sni != null) {\n return `https://${sni}${port}`\n }\n const protocol = maHasTLS ? 'https://' : 'http://'\n const tail = rest.pop()\n if (tail == null) {\n throw new Error('Unexpected end of multiaddr')\n }\n let baseVal = interpretNext(tail, rest)\n // We are reinterpreting the base as http, so we need to remove the tcp:// if it's there\n baseVal = baseVal?.replace('tcp://', '')\n return `${protocol}${baseVal}`\n },\n 'http-path': (head, rest) => {\n const tail = rest.pop()\n if (tail == null) {\n throw new Error('Unexpected end of multiaddr')\n }\n const baseVal = interpretNext(tail, rest)\n const decodedValue = decodeURIComponent(head.value ?? '')\n return `${baseVal}${decodedValue}`\n },\n tls: (head, rest) => {\n // Noop, the parent context knows that it's tls. We don't need to do\n // anything here\n const tail = rest.pop()\n if (tail == null) {\n throw new Error('Unexpected end of multiaddr')\n }\n return interpretNext(tail, rest)\n },\n sni: (head, rest) => {\n // Noop, the parent context uses the sni information, we don't need to do\n // anything here\n const tail = rest.pop()\n if (tail == null) {\n throw new Error('Unexpected end of multiaddr')\n }\n return interpretNext(tail, rest)\n },\n https: (head, rest) => {\n const tail = rest.pop()\n if (tail == null) {\n throw new Error('Unexpected end of multiaddr')\n }\n let baseVal = interpretNext(tail, rest)\n // We are reinterpreting the base as http, so we need to remove the tcp:// if it's there\n baseVal = baseVal?.replace('tcp://', '')\n return `https://${baseVal}`\n },\n ws: (head, rest) => {\n const maHasTLS = hasTLS(rest)\n const sni = extractSNI(rest)\n const port = extractPort(rest)\n if (maHasTLS && sni != null) {\n return `wss://${sni}${port}`\n }\n const protocol = maHasTLS ? 'wss://' : 'ws://'\n const tail = rest.pop()\n if (tail == null) {\n throw new Error('Unexpected end of multiaddr')\n }\n let baseVal = interpretNext(tail, rest)\n // We are reinterpreting the base, so we need to remove the tcp:// if it's there\n baseVal = baseVal?.replace('tcp://', '')\n return `${protocol}${baseVal}`\n },\n wss: (head, rest) => {\n const tail = rest.pop()\n if (tail == null) {\n throw new Error('Unexpected end of multiaddr')\n }\n let baseVal = interpretNext(tail, rest)\n // We are reinterpreting the base as http, so we need to remove the tcp:// if it's there\n baseVal = baseVal?.replace('tcp://', '')\n return `wss://${baseVal}`\n }\n}\n\nexport function multiaddrToUri (input: Multiaddr | string | Uint8Array, opts?: MultiaddrToUriOpts): string {\n const ma = multiaddr(input)\n const components = ma.getComponents()\n const head = components.pop()\n if (head == null) {\n throw new Error('Unexpected end of multiaddr')\n }\n\n const interpreter = interpreters[head.name]\n\n if (interpreter == null) {\n throw new Error(`No interpreter found for ${head.name}`)\n }\n\n let uri = interpreter(head, components) ?? ''\n\n if (opts?.assumeHttp !== false && ASSUME_HTTP_CODES.includes(head.code)) {\n // strip any declared protocol\n uri = uri.replace(/^.*:\\/\\//, '')\n\n if (head.value === '443') {\n uri = `https://${uri}`\n } else {\n uri = `http://${uri}`\n }\n }\n\n if (uri.startsWith('http://') || uri.startsWith('https://') || uri.startsWith('ws://') || uri.startsWith('wss://')) {\n // this will strip default ports while keeping paths intact\n uri = new URL(uri).toString()\n\n // strip trailing slash, e.g. http://127.0.0.1/ -> http://127.0.0.1\n if (uri.endsWith('/')) {\n uri = uri.substring(0, uri.length - 1)\n }\n }\n\n return uri\n}\n", "const word = '[a-fA-F\\\\d:]';\n\nconst boundry = options => options && options.includeBoundaries\n\t? `(?:(?<=\\\\s|^)(?=${word})|(?<=${word})(?=\\\\s|$))`\n\t: '';\n\nconst v4 = '(?:25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]\\\\d|\\\\d)(?:\\\\.(?:25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]\\\\d|\\\\d)){3}';\n\nconst v6segment = '[a-fA-F\\\\d]{1,4}';\n\nconst v6 = `\n(?:\n(?:${v6segment}:){7}(?:${v6segment}|:)| // 1:2:3:4:5:6:7:: 1:2:3:4:5:6:7:8\n(?:${v6segment}:){6}(?:${v4}|:${v6segment}|:)| // 1:2:3:4:5:6:: 1:2:3:4:5:6::8 1:2:3:4:5:6::8 1:2:3:4:5:6::1.2.3.4\n(?:${v6segment}:){5}(?::${v4}|(?::${v6segment}){1,2}|:)| // 1:2:3:4:5:: 1:2:3:4:5::7:8 1:2:3:4:5::8 1:2:3:4:5::7:1.2.3.4\n(?:${v6segment}:){4}(?:(?::${v6segment}){0,1}:${v4}|(?::${v6segment}){1,3}|:)| // 1:2:3:4:: 1:2:3:4::6:7:8 1:2:3:4::8 1:2:3:4::6:7:1.2.3.4\n(?:${v6segment}:){3}(?:(?::${v6segment}){0,2}:${v4}|(?::${v6segment}){1,4}|:)| // 1:2:3:: 1:2:3::5:6:7:8 1:2:3::8 1:2:3::5:6:7:1.2.3.4\n(?:${v6segment}:){2}(?:(?::${v6segment}){0,3}:${v4}|(?::${v6segment}){1,5}|:)| // 1:2:: 1:2::4:5:6:7:8 1:2::8 1:2::4:5:6:7:1.2.3.4\n(?:${v6segment}:){1}(?:(?::${v6segment}){0,4}:${v4}|(?::${v6segment}){1,6}|:)| // 1:: 1::3:4:5:6:7:8 1::8 1::3:4:5:6:7:1.2.3.4\n(?::(?:(?::${v6segment}){0,5}:${v4}|(?::${v6segment}){1,7}|:)) // ::2:3:4:5:6:7:8 ::2:3:4:5:6:7:8 ::8 ::1.2.3.4\n)(?:%[0-9a-zA-Z]{1,})? // %eth0 %1\n`.replace(/\\s*\\/\\/.*$/gm, '').replace(/\\n/g, '').trim();\n\n// Pre-compile only the exact regexes because adding a global flag make regexes stateful\nconst v46Exact = new RegExp(`(?:^${v4}$)|(?:^${v6}$)`);\nconst v4exact = new RegExp(`^${v4}$`);\nconst v6exact = new RegExp(`^${v6}$`);\n\nconst ipRegex = options => options && options.exact\n\t? v46Exact\n\t: new RegExp(`(?:${boundry(options)}${v4}${boundry(options)})|(?:${boundry(options)}${v6}${boundry(options)})`, 'g');\n\nipRegex.v4 = options => options && options.exact ? v4exact : new RegExp(`${boundry(options)}${v4}${boundry(options)}`, 'g');\nipRegex.v6 = options => options && options.exact ? v6exact : new RegExp(`${boundry(options)}${v6}${boundry(options)}`, 'g');\n\nexport default ipRegex;\n", "// Even though the browser version is a no-op, we wrap it to ensure consistent behavior.\nexport default function functionTimeout(function_) {\n\tconst wrappedFunction = (...arguments_) => function_(...arguments_);\n\n\tObject.defineProperty(wrappedFunction, 'name', {\n\t\tvalue: `functionTimeout(${function_.name || '<anonymous>'})`,\n\t\tconfigurable: true,\n\t});\n\n\treturn wrappedFunction;\n}\n\nexport function isTimeoutError() {\n\treturn false;\n}\n", "const {toString} = Object.prototype;\n\nexport default function isRegexp(value) {\n\treturn toString.call(value) === '[object RegExp]';\n}\n", "import isRegexp from 'is-regexp';\n\nconst flagMap = {\n\tglobal: 'g',\n\tignoreCase: 'i',\n\tmultiline: 'm',\n\tdotAll: 's',\n\tsticky: 'y',\n\tunicode: 'u'\n};\n\nexport default function clonedRegexp(regexp, options = {}) {\n\tif (!isRegexp(regexp)) {\n\t\tthrow new TypeError('Expected a RegExp instance');\n\t}\n\n\tconst flags = Object.keys(flagMap).map(flag => (\n\t\t(typeof options[flag] === 'boolean' ? options[flag] : regexp[flag]) ? flagMap[flag] : ''\n\t)).join('');\n\n\tconst clonedRegexp = new RegExp(options.source || regexp.source, flags);\n\n\tclonedRegexp.lastIndex = typeof options.lastIndex === 'number' ?\n\t\toptions.lastIndex :\n\t\tregexp.lastIndex;\n\n\treturn clonedRegexp;\n}\n", "import functionTimeout, {isTimeoutError} from 'function-timeout';\nimport timeSpan from 'time-span';\nimport cloneRegexp from 'clone-regexp'; // TODO: Use `structuredClone` instead when targeting Node.js 18.\n\nconst resultToMatch = result => ({\n\tmatch: result[0],\n\tindex: result.index,\n\tgroups: result.slice(1),\n\tnamedGroups: result.groups ?? {},\n\tinput: result.input,\n});\n\nexport function isMatch(regex, string, {timeout} = {}) {\n\ttry {\n\t\treturn functionTimeout(() => cloneRegexp(regex).test(string), {timeout})();\n\t} catch (error) {\n\t\tif (isTimeoutError(error)) {\n\t\t\treturn false;\n\t\t}\n\n\t\tthrow error;\n\t}\n}\n\nexport function firstMatch(regex, string, {timeout} = {}) {\n\ttry {\n\t\tconst result = functionTimeout(() => cloneRegexp(regex).exec(string), {timeout})();\n\n\t\tif (result === null) {\n\t\t\treturn;\n\t\t}\n\n\t\treturn resultToMatch(result);\n\t} catch (error) {\n\t\tif (isTimeoutError(error)) {\n\t\t\treturn;\n\t\t}\n\n\t\tthrow error;\n\t}\n}\n\nexport function matches(regex, string, {timeout = Number.POSITIVE_INFINITY, matchTimeout = Number.POSITIVE_INFINITY} = {}) {\n\tif (!regex.global) {\n\t\tthrow new Error('The regex must have the global flag, otherwise, use `firstMatch()` instead');\n\t}\n\n\treturn {\n\t\t* [Symbol.iterator]() {\n\t\t\ttry {\n\t\t\t\tconst matches = string.matchAll(regex); // The regex is only executed when iterated over.\n\n\t\t\t\twhile (true) {\n\t\t\t\t\tconst nextMatch = functionTimeout(() => matches.next(), {timeout: (timeout !== Number.POSITIVE_INFINITY || matchTimeout !== Number.POSITIVE_INFINITY) ? Math.min(timeout, matchTimeout) : undefined}); // `matches.next` must be called within an arrow function so that it doesn't loose its context.\n\n\t\t\t\t\tconst end = timeSpan();\n\t\t\t\t\tconst {value, done} = nextMatch();\n\t\t\t\t\ttimeout -= Math.ceil(end());\n\n\t\t\t\t\tif (done) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tyield resultToMatch(value);\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tif (!isTimeoutError(error)) {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t};\n}\n", "import ipRegex from 'ip-regex';\nimport {isMatch} from 'super-regex';\n\nconst maxIPv4Length = 15;\nconst maxIPv6Length = 45;\n\nconst options = {\n\ttimeout: 400,\n};\n\nexport function isIP(string) {\n\tif (string.length > maxIPv6Length) {\n\t\treturn false;\n\t}\n\n\treturn isMatch(ipRegex({exact: true}), string, options);\n}\n\nexport function isIPv6(string) {\n\tif (string.length > maxIPv6Length) {\n\t\treturn false;\n\t}\n\n\treturn isMatch(ipRegex.v6({exact: true}), string, options);\n}\n\nexport function isIPv4(string) {\n\tif (string.length > maxIPv4Length) {\n\t\treturn false;\n\t}\n\n\treturn isMatch(ipRegex.v4({exact: true}), string, options);\n}\n\nexport function ipVersion(string) {\n\tif (isIPv6(string)) {\n\t\treturn 6;\n\t}\n\n\tif (isIPv4(string)) {\n\t\treturn 4;\n\t}\n}\n", "/**\n * @packageDocumentation\n *\n * ```typescript\n * import { uriToMultiaddr } from '@multiformats/uri-to-multiaddr'\n *\n * console.log(uriToMultiaddr('https://protocol.ai'))\n * // -> /dns4/protocol.ai/tcp/443/https\n * ```\n *\n * Domain names can represent one of\n *\n * - `/dns4` - domain resolves to an ipv4 address (**default**)\n * - `/dns6` - domain resolves to an ipv6 address\n * - `/dnsaddr` - domain has a [DNSLink](https://docs.ipfs.io/guides/concepts/dnslink/) TXT record pointing to an IPFS CID\n *\n * This library assumes `/dns4` when it finds a domain name in the input string.\n * It makes no attempt query DNS. To override the default assumption, you can pass\n * in an options object as the second parameter to override it:\n *\n * ```typescript\n * import { uriToMultiaddr } from '@multiformats/uri-to-multiaddr'\n *\n * console.log(uriToMultiaddr('https://protocol.ai'), { defaultDnsType: 'dns6' })\n * // -> /dns6/protocol.ai/tcp/443/https\n * ```\n *\n * See [test.js](./test.js) for the currently supported conversions.\n *\n * **Note**: `uri-to-multiaddr` will throw if the passed URI:\n *\n * - is not a valid, according the WHATWG URL spec implementation used.\n * - is not supported yet\n *\n * ## Related\n *\n * - [@multiformats/multiaddr-to-uri](https://github.com/multiformats/js-multiaddr-to-uri) - convert it back again\n */\n\nimport { multiaddr } from '@multiformats/multiaddr'\nimport { isIPv4, isIPv6 } from 'is-ip'\nimport type { Multiaddr } from '@multiformats/multiaddr'\n\nconst portFor: Record<string, string> = {\n http: '80',\n https: '443',\n ws: '80',\n wss: '443'\n}\n\nconst BROWSER_SCHEMES = ['http', 'https', 'ws', 'wss']\n\nexport interface MultiaddrFromUriOpts {\n /**\n * If a URI contains a domain name, by default the `/dns/` tuple will be used\n * to define it. If you wish to use `/dnsaddr` or something more specific like\n * `/dns4` or `/dns6`, pass it as an option here.\n *\n * @default 'dns'\n */\n defaultDnsType?: 'dns' | 'dns4' | 'dns6' | 'dnsaddr'\n}\n\n/**\n * Convert a URI to a multiaddr\n *\n * http://foobar.com => /dns/foobar.com/tcp/80/http\n * https://foobar.com => /dns/foobar.com/tcp/443/https\n * https://foobar.com:5001 => /dns/foobar.com/tcp/5001/https\n * https://127.0.0.1:8080 => /ip4/127.0.0.1/tcp/8080/https\n * http://[::1]:8080 => /ip6/::1/tcp/8080/http\n * tcp://foobar.com:8080 => /dns/foobar.com/tcp/8080\n * udp://foobar.com:8080 => /dns/foobar.com/udp/8080\n */\n\nexport function uriToMultiaddr (uriStr: string, opts?: MultiaddrFromUriOpts): Multiaddr {\n opts = opts ?? {}\n const defaultDnsType = opts.defaultDnsType ?? 'dns'\n const { scheme, hostname, port, path } = parseUri(uriStr)\n const parts = [\n tupleForHostname(hostname, defaultDnsType),\n tupleForPort(port, scheme),\n tupleForScheme(scheme)\n ]\n\n if (path != null) {\n parts.push(tupleForPath(path))\n }\n\n const multiaddrStr = '/' + parts\n .filter(x => Boolean(x))\n // @ts-expect-error ts cannot see we filter falsy values\n .reduce((a, b) => a.concat(b), [])\n .join('/')\n\n return multiaddr(multiaddrStr)\n}\n\nfunction parseUri (uriStr: string): { scheme: string, hostname: string, port: string, path?: string } {\n const [scheme] = uriStr.split(':')\n\n // browsers will only parse URLs with schemes they understand\n if (!BROWSER_SCHEMES.includes(scheme)) {\n uriStr = 'http' + uriStr.substring(scheme.length)\n }\n\n // Use the WHATWG URL global, in node >= 10 and the browser\n let { protocol, hostname, port, pathname, search } = new URL(uriStr)\n\n if (port == null || port === '') {\n const protocolPort = portForProtocol(scheme)\n\n if (protocolPort != null) {\n port = protocolPort\n }\n\n // browsers will omit the port when it's common\n if (protocolPort == null && protocol === 'http:') {\n // we overrode the protocol with http, set the port to 80\n port = '80'\n }\n }\n\n let path: string | undefined\n\n if (pathname != null && pathname !== '' && pathname !== '/') {\n if (pathname.startsWith('/')) {\n pathname = pathname.substring(1)\n }\n\n path = pathname\n }\n\n if (search != null && search !== '') {\n path = path ?? ''\n path += search\n }\n\n return { scheme, hostname, port, path }\n}\n\nfunction tupleForHostname (hostname: string, defaultDnsType: string): [string, string] | undefined {\n if (hostname == null || hostname === '') {\n return undefined\n }\n\n if (isIPv4(hostname)) {\n return ['ip4', hostname]\n }\n\n if (isIPv6(hostname)) {\n return ['ip6', hostname]\n }\n\n // literal ipv6 in url should be wrapped in square brackets [x:y:z]\n // https://www.ietf.org/rfc/rfc2732.txt\n if (hostname[0] === '[') {\n const trimmed = hostname.substring(1, hostname.length - 1)\n if (isIPv6(trimmed)) {\n return ['ip6', trimmed]\n }\n }\n // assumes that any non-ip hostname is a dns4 address.\n return [defaultDnsType, hostname]\n}\n\nfunction tupleForPort (port: string, scheme: string): [string, string] | undefined {\n if (port == null || port === '') {\n return undefined\n }\n\n if (scheme === 'udp') {\n return ['udp', port]\n }\n\n return ['tcp', port]\n}\n\nfunction tupleForScheme (scheme: string): [string] | undefined {\n if (scheme.match(/^tcp$|^udp$/) != null) {\n return undefined\n }\n\n if (scheme === 'https') {\n return ['/tls/http']\n }\n\n if (scheme === 'wss') {\n return ['/tls/ws']\n }\n\n return [scheme]\n}\n\nfunction tupleForPath (path: string): [string, string] | undefined {\n if (path == null || path === '') {\n return undefined\n }\n\n return ['http-path', encodeURIComponent(path)]\n}\n\nfunction portForProtocol (protocol: string): string | undefined {\n if (protocol == null || protocol === '' || portFor[protocol] == null) {\n return undefined\n }\n\n return portFor[protocol]\n}\n", "import { getNetConfig, isPrivate } from '@libp2p/utils'\nimport { DNS, HTTP, HTTPS } from '@multiformats/multiaddr-matcher'\nimport { multiaddrToUri } from '@multiformats/multiaddr-to-uri'\nimport { Uint8ArrayList } from 'uint8arraylist'\nimport { TrustlessGateway } from './trustless-gateway.ts'\nimport type { TrustlessGatewayGetBlockProgressEvents } from './index.ts'\nimport type { TransformRequestInit } from './trustless-gateway.ts'\nimport type { Routing } from '@helia/interface'\nimport type { Multiaddr } from '@multiformats/multiaddr'\nimport type { AbortOptions } from 'abort-error'\nimport type { ComponentLogger, Logger } from 'birnam'\nimport type { CID } from 'multiformats/cid'\nimport type { ProgressOptions } from 'progress-events'\n\nexport function filterNonHTTPMultiaddrs (multiaddrs: Multiaddr[], allowInsecure: boolean, allowLocal: boolean): Multiaddr[] {\n return multiaddrs.filter(ma => {\n const isHttps = HTTPS.exactMatch(ma)\n const isHttp = HTTP.exactMatch(ma)\n\n if (!isHttps && !isHttp) {\n return false\n }\n\n if (isHttps || (allowInsecure && isHttp)) {\n if (allowLocal) {\n return true\n }\n\n if (DNS.matches(ma)) {\n return true\n }\n\n return isPrivate(ma) === false\n }\n\n // When allowInsecure is false and allowLocal is true, allow multiaddrs with\n // \"127.0.0.1\", \"localhost\", or any subdomain ending with \".localhost\"\n if (!allowInsecure && allowLocal) {\n const { host } = getNetConfig(ma)\n\n if (host === '127.0.0.1' || host === 'localhost' || host.endsWith('.localhost')) {\n return true\n }\n }\n\n return false\n })\n}\n\nexport interface FindHttpGatewayProvidersOptions extends AbortOptions, ProgressOptions<TrustlessGatewayGetBlockProgressEvents> {\n transformRequestInit?: TransformRequestInit\n}\n\nexport async function * findHttpGatewayProviders (cid: CID, routing: Routing, logger: ComponentLogger, allowInsecure: boolean, allowLocal: boolean, options: FindHttpGatewayProvidersOptions = {}): AsyncGenerator<TrustlessGateway> {\n for await (const provider of routing.findProviders(cid, options)) {\n // require http(s) addresses\n const httpAddresses = filterNonHTTPMultiaddrs(provider.multiaddrs, allowInsecure, allowLocal)\n\n if (httpAddresses.length === 0) {\n continue\n }\n\n // take first address?\n // /ip4/x.x.x.x/tcp/31337/http\n // /ip4/x.x.x.x/tcp/31337/https\n // etc\n const uri = new URL(multiaddrToUri(httpAddresses[0]))\n\n yield new TrustlessGateway(uri, {\n logger,\n transformRequestInit: options.transformRequestInit,\n routing: provider.routing\n })\n }\n}\n\ninterface LimitedResponseOptions {\n signal?: AbortSignal\n log?: Logger\n}\n\n/**\n * A function that handles ensuring the content-length header and the response body is less than a given byte limit.\n *\n * If the response contains a content-length header greater than the limit or the actual bytes returned are greater than\n * the limit, an error is thrown.\n */\nexport async function limitedResponse (response: Response, byteLimit: number, options?: LimitedResponseOptions): Promise<Uint8Array> {\n const { signal, log } = options ?? {}\n const contentLength = response.headers.get('content-length')\n if (contentLength != null) {\n const contentLengthNumber = parseInt(contentLength, 10)\n if (contentLengthNumber > byteLimit) {\n log?.error('content-length header (%d) is greater than the limit (%d)', contentLengthNumber, byteLimit)\n if (response.body != null) {\n await response.body.cancel().catch(err => {\n log?.error('error cancelling response body after content-length check - %e', err)\n })\n }\n throw new Error(`Content-Length header (${contentLengthNumber}) is greater than the limit (${byteLimit}).`)\n }\n }\n\n const reader = response.body?.getReader()\n if (reader == null) {\n // no body to consume if reader is null\n throw new Error('Response body is not readable')\n }\n\n const chunkList = new Uint8ArrayList()\n\n try {\n while (true) {\n if (signal?.aborted === true) {\n throw new Error('Response body read was aborted.')\n }\n\n const { done, value } = await reader.read()\n if (done) {\n break\n }\n\n chunkList.append(value)\n\n if (chunkList.byteLength > byteLimit) {\n // No need to consume body here, as we were streaming and hit the limit\n throw new Error(`Response body is greater than the limit (${byteLimit}), received ${chunkList.byteLength} bytes.`)\n }\n }\n } finally {\n reader.cancel()\n .catch(err => {\n log?.error('error cancelling reader - %e', err)\n })\n .finally(() => {\n reader.releaseLock()\n })\n }\n\n return chunkList.subarray()\n}\n", "import { uriToMultiaddr } from '@multiformats/uri-to-multiaddr'\nimport { base64 } from 'multiformats/bases/base64'\nimport { CID } from 'multiformats/cid'\nimport { identity } from 'multiformats/hashes/identity'\nimport { CustomProgressEvent } from 'progress-events'\nimport { fromString as uint8ArrayFromString } from 'uint8arrays/from-string'\nimport { DEFAULT_MAX_SIZE } from './index.ts'\nimport { limitedResponse } from './utils.ts'\nimport type { BlockBrokerConnectedProgressEvent, BlockBrokerConnectProgressEvent, BlockBrokerGetBlockProgressEvents, BlockBrokerReceiveBlockProgressEvent, BlockBrokerRequestBlockProgressEvent } from '@helia/interface'\nimport type { ComponentLogger, Logger } from 'birnam'\nimport type { ProgressOptions } from 'progress-events'\n\nconst TRANSPORT_IPFS_GATEWAY_HTTP_CODE = 0x0920\n\nexport interface TrustlessGatewayStats {\n attempts: number\n errors: number\n invalidBlocks: number\n successes: number\n pendingResponses?: number\n}\n\nexport interface TransformRequestInit {\n (defaultReqInit: RequestInit): Promise<RequestInit> | RequestInit\n}\n\nexport interface TrustlessGatewayComponents {\n logger: ComponentLogger\n transformRequestInit?: TransformRequestInit\n routing: string\n}\n\nexport interface GetRawBlockOptions extends ProgressOptions<BlockBrokerGetBlockProgressEvents> {\n signal?: AbortSignal\n\n /**\n * The maximum number of bytes to allow when fetching a raw block.\n *\n * @default 2_097_152 (2MiB)\n */\n maxSize?: number\n}\n\n/**\n * A `TrustlessGateway` keeps track of the number of attempts, errors, and\n * successes for a given gateway url so that we can prioritize gateways that\n * have been more reliable in the past, and ensure that requests are distributed\n * across all gateways within a given `TrustlessGatewayBlockBroker` instance.\n */\nexport class TrustlessGateway {\n public readonly url: URL\n private readonly peer: CID\n\n /**\n * The number of times this gateway has been attempted to be used to fetch a\n * block. This includes successful, errored, and aborted attempts. By counting\n * even aborted attempts, slow gateways that are out-raced by others will be\n * considered less reliable.\n */\n #attempts = 0\n\n /**\n * The number of times this gateway has errored while attempting to fetch a\n * block. This includes `response.ok === false` and any other errors that\n * throw while attempting to fetch a block. This does not include aborted\n * attempts.\n */\n #errors = 0\n\n /**\n * The number of times this gateway has returned an invalid block. A gateway\n * that returns the wrong blocks for a CID should be considered for removal\n * from the list of gateways to fetch blocks from.\n */\n #invalidBlocks = 0\n\n /**\n * The number of times this gateway has successfully fetched a block.\n */\n #successes = 0\n\n /**\n * A map of pending responses for this gateway. This is used to ensure that\n * only one request per CID is made to a given gateway at a time, and that we\n * don't make multiple in-flight requests for the same CID to the same gateway.\n */\n readonly #pendingResponses = new Map<string, Promise<Uint8Array>>()\n\n private readonly log: Logger\n private readonly transformRequestInit?: TransformRequestInit\n\n public readonly routing: string\n\n constructor (url: URL | string, { logger, transformRequestInit, routing }: TrustlessGatewayComponents) {\n this.url = url instanceof URL ? url : new URL(url)\n this.transformRequestInit = transformRequestInit\n this.log = logger.forComponent(`helia:trustless-gateway-block-broker:${this.url.host}`)\n this.routing = routing\n this.peer = CID.createV1(TRANSPORT_IPFS_GATEWAY_HTTP_CODE, identity.digest(uint8ArrayFromString(this.url.toString())))\n }\n\n /**\n * This function returns a unique string for the multihash.bytes of the CID.\n *\n * Some useful resources for why this is needed can be found using the links below:\n *\n * - https://github.com/ipfs/helia/pull/503#discussion_r1572451331\n * - https://github.com/ipfs/kubo/issues/6815\n * - https://www.notion.so/pl-strflt/Handling-ambiguity-around-CIDs-9d5e14f6516f438980b01ef188efe15d#d9d45cd1ed8b4d349b96285de4aed5ab\n */\n #uniqueBlockId (cid: CID): string {\n const multihashBytes = cid.multihash.bytes\n return base64.encode(multihashBytes)\n }\n\n /**\n * Fetch a raw block from `this.url` following the specification defined at\n * https://specs.ipfs.tech/http-gateways/trustless-gateway/\n */\n async getRawBlock (cid: CID, options: GetRawBlockOptions = {}): Promise<Uint8Array> {\n const gwUrl = new URL(this.url.toString())\n gwUrl.pathname = `/ipfs/${cid.toString()}`\n const maxSize = options.maxSize ?? DEFAULT_MAX_SIZE\n\n // necessary as not every gateway supports dag-cbor, but every should support\n // sending raw block as-is\n gwUrl.search = '?format=raw'\n\n if (options.signal?.aborted === true) {\n throw new Error(`Signal to fetch raw block for CID ${cid} from gateway ${this.url} was aborted prior to fetch`)\n }\n\n const blockId = this.#uniqueBlockId(cid)\n\n // workaround for https://github.com/nodejs/node/issues/52635\n const innerController = new AbortController()\n const abortInnerSignal = (): void => {\n innerController.abort()\n }\n options.signal?.addEventListener('abort', abortInnerSignal)\n\n try {\n let pendingResponse: Promise<Uint8Array> | undefined = this.#pendingResponses.get(blockId)\n if (pendingResponse == null) {\n this.#attempts++\n const defaultReqInit: RequestInit = {\n signal: innerController.signal,\n headers: {\n Accept: 'application/vnd.ipld.raw'\n },\n cache: 'force-cache'\n }\n\n const reqInit: RequestInit = this.transformRequestInit != null ? await this.transformRequestInit(defaultReqInit) : defaultReqInit\n\n const headers = new Headers(reqInit.headers)\n this.log(`sending request\n%s %s HTTP/1.1\n%s\n`, reqInit.method ?? 'GET', gwUrl, [...headers.entries()].map(([key, value]) => `${key}: ${value}`).join('\\n'))\n\n options.onProgress?.(new CustomProgressEvent<BlockBrokerConnectProgressEvent>('helia:block-broker:connect', {\n broker: 'trustless-gateway',\n type: 'connect',\n provider: this.peer,\n cid\n }))\n\n pendingResponse = fetch(gwUrl.toString(), reqInit).then(async (res) => {\n this.log(`received response\nHTTP/1.1 %d %s\n%s\n`, res.status, res.statusText, [...res.headers.entries()].map(([key, value]) => `${key}: ${value}`).join('\\n'))\n\n if (!res.ok) {\n this.#errors++\n throw new Error(`Unable to fetch raw block for CID ${cid} from gateway ${this.url}, received ${res.status} ${res.statusText}`)\n }\n\n options.onProgress?.(new CustomProgressEvent<BlockBrokerConnectedProgressEvent>('helia:block-broker:connected', {\n broker: 'trustless-gateway',\n type: 'connected',\n provider: this.peer,\n address: uriToMultiaddr(gwUrl.toString()),\n cid\n }))\n\n options.onProgress?.(new CustomProgressEvent<BlockBrokerRequestBlockProgressEvent>('helia:block-broker:request-block', {\n broker: 'trustless-gateway',\n type: 'request-block',\n provider: this.peer,\n cid\n }))\n\n // limited Response ensures the body is less than 2MiB (or configurable maxSize)\n // see https://github.com/ipfs/helia/issues/790\n const body = await limitedResponse(res, maxSize, { signal: innerController.signal, log: this.log })\n\n options.onProgress?.(new CustomProgressEvent<BlockBrokerReceiveBlockProgressEvent>('helia:block-broker:receive-block', {\n broker: 'trustless-gateway',\n type: 'receive-block',\n provider: this.peer,\n cid\n }))\n\n this.#successes++\n return body\n })\n this.#pendingResponses.set(blockId, pendingResponse)\n }\n return await pendingResponse\n } catch (cause: any) {\n // @ts-expect-error - TS thinks signal?.aborted can only be false now\n // because it was checked for true above.\n if (options.signal?.aborted === true) {\n throw new Error(`Fetching raw block for CID ${cid} from gateway ${this.url} was aborted`)\n }\n this.#errors++\n throw new Error(`Unable to fetch raw block for CID ${cid} - ${cause.message}`)\n } finally {\n options.signal?.removeEventListener('abort', abortInnerSignal)\n this.#pendingResponses.delete(blockId)\n }\n }\n\n /**\n * Encapsulate the logic for determining whether a gateway is considered\n * reliable, for prioritization. This is based on the number of successful attempts made\n * and the number of errors encountered.\n *\n * Unused gateways have 100% reliability; They will be prioritized over\n * gateways with a 100% success rate to ensure that we attempt all gateways.\n */\n reliability (): number {\n /**\n * if we have never tried to use this gateway, it is considered the most\n * reliable until we determine otherwise (prioritize unused gateways)\n */\n if (this.#attempts === 0) {\n return 1\n }\n\n if (this.#invalidBlocks > 0) {\n // this gateway may not be trustworthy..\n return -Infinity\n }\n\n /**\n * We have attempted the gateway, so we need to calculate the reliability\n * based on the number of attempts, errors, and successes. Gateways that\n * return a single error should drop their reliability score more than a\n * single success increases it.\n *\n * Play around with the below reliability function at https://www.desmos.com/calculator/d6hfhf5ukm\n */\n return this.#successes / (this.#attempts + (this.#errors * 3))\n }\n\n /**\n * Increment the number of invalid blocks returned by this gateway.\n */\n incrementInvalidBlocks (): void {\n this.#invalidBlocks++\n }\n\n getStats (): TrustlessGatewayStats {\n return {\n attempts: this.#attempts,\n errors: this.#errors,\n invalidBlocks: this.#invalidBlocks,\n successes: this.#successes,\n pendingResponses: this.#pendingResponses.size\n }\n }\n\n toString (): string {\n return `TrustlessGateway(${this.url})`\n }\n}\n", "import { AbstractSession, isCID } from '@helia/utils'\nimport { multiaddrToUri } from '@multiformats/multiaddr-to-uri'\nimport { CID } from 'multiformats/cid'\nimport { CustomProgressEvent } from 'progress-events'\nimport { DEFAULT_ALLOW_INSECURE, DEFAULT_ALLOW_LOCAL } from './index.ts'\nimport { TrustlessGateway } from './trustless-gateway.ts'\nimport { filterNonHTTPMultiaddrs, findHttpGatewayProviders } from './utils.ts'\nimport type { CreateTrustlessGatewaySessionOptions } from './broker.ts'\nimport type { TrustlessGatewayGetBlockProgressEvents, TrustlessGatewayProvider } from './index.ts'\nimport type { TransformRequestInit } from './trustless-gateway.ts'\nimport type { BlockRetrievalOptions, Routing } from '@helia/interface'\nimport type { Multiaddr } from '@multiformats/multiaddr'\nimport type { AbortOptions } from 'abort-error'\nimport type { ComponentLogger } from 'birnam'\n\nexport interface TrustlessGatewaySessionComponents {\n logger: ComponentLogger\n routing: Routing\n}\n\nclass TrustlessGatewaySession extends AbstractSession<TrustlessGateway, TrustlessGatewayGetBlockProgressEvents> {\n public readonly name = 'trustless-gateway-session'\n private readonly routing: Routing\n private readonly allowInsecure: boolean\n private readonly allowLocal: boolean\n private readonly transformRequestInit?: TransformRequestInit\n\n constructor (components: TrustlessGatewaySessionComponents, init: CreateTrustlessGatewaySessionOptions) {\n super(components, {\n ...init,\n name: 'helia:trustless-gateway:session'\n })\n\n this.routing = components.routing\n this.allowInsecure = init.allowInsecure ?? DEFAULT_ALLOW_INSECURE\n this.allowLocal = init.allowLocal ?? DEFAULT_ALLOW_LOCAL\n this.transformRequestInit = init.transformRequestInit\n }\n\n async queryProvider (cid: CID, provider: TrustlessGateway, options: BlockRetrievalOptions): Promise<Uint8Array> {\n this.log('fetching BLOCK for %c from %s', cid, provider.url)\n\n options?.onProgress?.(new CustomProgressEvent('helia:block-brokers:query-provider:start', {\n blockBroker: 'trustless-gateway',\n provider: provider.url,\n transport: 'http',\n cid\n }))\n\n let block: Uint8Array\n\n try {\n block = await provider.getRawBlock(cid, options)\n this.log.trace('got block for %c from %s', cid, provider.url)\n } finally {\n options?.onProgress?.(new CustomProgressEvent('helia:block-brokers:query-provider:end', {\n blockBroker: 'trustless-gateway',\n provider: provider.url,\n transport: 'http',\n cid\n }))\n }\n\n await options.validateFn?.(block)\n\n return block\n }\n\n async * findNewProviders (cid: CID, options: AbortOptions = {}): AsyncGenerator<TrustlessGateway> {\n yield * findHttpGatewayProviders(cid, this.routing, this.logger, this.allowInsecure, this.allowLocal, { ...options, transformRequestInit: this.transformRequestInit })\n }\n\n toFilterKey (provider: TrustlessGateway): Uint8Array | string {\n return provider.url.toString()\n }\n\n equals (providerA: TrustlessGateway, providerB: TrustlessGateway): boolean {\n return providerA.url.toString() === providerB.url.toString()\n }\n\n async convertToProvider (provider: CID | Multiaddr | Multiaddr[], routing: string, options?: AbortOptions): Promise<TrustlessGateway | undefined> {\n options?.signal?.throwIfAborted()\n\n if (isCID(provider)) {\n return\n }\n\n const httpAddresses = filterNonHTTPMultiaddrs(Array.isArray(provider) ? provider : [provider], this.allowInsecure, this.allowLocal)\n\n if (httpAddresses.length === 0) {\n return\n }\n\n // take first address?\n // /ip4/x.x.x.x/tcp/31337/http\n // /ip4/x.x.x.x/tcp/31337/https\n // etc\n const uri = multiaddrToUri(httpAddresses[0])\n\n return new TrustlessGateway(uri, {\n logger: this.logger,\n transformRequestInit: this.transformRequestInit,\n routing\n })\n }\n\n emitFoundProviderProgressEvent (cid: CID, provider: TrustlessGateway, options: BlockRetrievalOptions<TrustlessGatewayGetBlockProgressEvents>): void {\n options?.onProgress?.(new CustomProgressEvent<TrustlessGatewayProvider>('trustless-gateway:found-provider', {\n type: 'trustless-gateway',\n cid,\n url: provider.url.toJSON(),\n routing: provider.routing\n }))\n }\n}\n\nexport function createTrustlessGatewaySession (components: TrustlessGatewaySessionComponents, init: CreateTrustlessGatewaySessionOptions): TrustlessGatewaySession {\n return new TrustlessGatewaySession(components, init)\n}\n", "import { DEFAULT_ALLOW_INSECURE, DEFAULT_ALLOW_LOCAL } from './index.ts'\nimport { createTrustlessGatewaySession } from './session.ts'\nimport { findHttpGatewayProviders } from './utils.ts'\nimport type { TrustlessGatewayBlockBrokerInit, TrustlessGatewayBlockBrokerComponents, TrustlessGatewayGetBlockProgressEvents } from './index.ts'\nimport type { TransformRequestInit } from './trustless-gateway.ts'\nimport type { Routing, BlockRetrievalOptions, BlockBroker, CreateSessionOptions, SessionBlockBroker } from '@helia/interface'\nimport type { ComponentLogger, Logger } from 'birnam'\nimport type { CID } from 'multiformats/cid'\n\nexport interface CreateTrustlessGatewaySessionOptions extends CreateSessionOptions<TrustlessGatewayGetBlockProgressEvents> {\n /**\n * By default we will only connect to peers with HTTPS addresses, pass true\n * to also connect to HTTP addresses.\n *\n * @default false\n */\n allowInsecure?: boolean\n\n /**\n * By default we will only connect to peers with public or DNS addresses, pass\n * true to also connect to private addresses.\n *\n * @default false\n */\n allowLocal?: boolean\n\n /**\n * Provide a function that will be called before querying trustless-gateways.\n *\n * This lets you modify the fetch options to pass custom headers or other\n * necessary things.\n */\n transformRequestInit?: TransformRequestInit\n}\n\n/**\n * A class that accepts a list of trustless gateways that are queried\n * for blocks.\n */\nexport class TrustlessGatewayBlockBroker implements BlockBroker<TrustlessGatewayGetBlockProgressEvents> {\n public readonly name = 'trustless-gateway'\n private readonly allowInsecure: boolean\n private readonly allowLocal: boolean\n private readonly transformRequestInit?: TransformRequestInit\n private readonly routing: Routing\n private readonly log: Logger\n private readonly logger: ComponentLogger\n\n constructor (components: TrustlessGatewayBlockBrokerComponents, init: TrustlessGatewayBlockBrokerInit = {}) {\n this.log = components.logger.forComponent('helia:trustless-gateway-block-broker')\n this.logger = components.logger\n this.routing = components.routing\n this.allowInsecure = init.allowInsecure ?? DEFAULT_ALLOW_INSECURE\n this.allowLocal = init.allowLocal ?? DEFAULT_ALLOW_LOCAL\n this.transformRequestInit = init.transformRequestInit\n }\n\n async retrieve (cid: CID, options: BlockRetrievalOptions<TrustlessGatewayGetBlockProgressEvents> = {}): Promise<Uint8Array> {\n const aggregateErrors: Error[] = []\n\n for await (const gateway of findHttpGatewayProviders(cid, this.routing, this.logger, this.allowInsecure, this.allowLocal, { ...options, transformRequestInit: this.transformRequestInit })) {\n this.log('getting block for %c from %s', cid, gateway.url)\n\n try {\n const block = await gateway.getRawBlock(cid, options)\n this.log.trace('got block for %c from %s', cid, gateway.url)\n\n try {\n await options.validateFn?.(block)\n } catch (err) {\n this.log.error('failed to validate block for %c from %s - %e', cid, gateway.url, err)\n // try another gateway\n continue\n }\n\n return block\n } catch (err: unknown) {\n this.log.error('failed to get block for %c from %s - %e', cid, gateway.url, err)\n\n if (err instanceof Error) {\n aggregateErrors.push(err)\n } else {\n aggregateErrors.push(new Error(`Unable to fetch raw block for CID ${cid} from gateway ${gateway.url}`))\n }\n\n // if signal was aborted, exit the loop\n if (options.signal?.aborted === true) {\n this.log.trace('request aborted while fetching raw block for CID %c from gateway %s', cid, gateway.url)\n break\n }\n }\n }\n\n if (aggregateErrors.length > 0) {\n throw new AggregateError(aggregateErrors, `Unable to fetch raw block for CID ${cid} from any gateway`)\n } else {\n throw new Error(`Unable to fetch raw block for CID ${cid} from any gateway`)\n }\n }\n\n createSession (options: CreateTrustlessGatewaySessionOptions = {}): SessionBlockBroker<TrustlessGatewayGetBlockProgressEvents> {\n return createTrustlessGatewaySession({\n logger: this.logger,\n routing: this.routing\n }, {\n ...options,\n allowLocal: this.allowLocal,\n allowInsecure: this.allowInsecure,\n transformRequestInit: this.transformRequestInit\n })\n }\n}\n"],
|
|
5
|
+
"mappings": ";gtBAAA,IAAAA,GAAAC,GAAA,CAAAC,GAAAC,KAAA,CAAAA,GAAO,QAAU,SAAUC,EAAK,CAE9B,GAAI,CAACA,EAAK,MAAM,MAAM,+DAA+D,EAErF,IAAIC,EAAO,EAAGC,EAAQ,OAAO,OAAO,IAAI,EAAGC,EAAS,OAAO,OAAO,IAAI,EAEtE,SAASC,EAAQC,EAAKC,EAAO,CAC3BJ,EAAMG,CAAG,EAAIC,EACbL,IACGA,GAAQD,IACTC,EAAO,EACPE,EAASD,EACTA,EAAQ,OAAO,OAAO,IAAI,EAE9B,CAEA,MAAO,CACL,IAAK,SAAUG,EAAK,CAClB,OAAOH,EAAMG,CAAG,IAAM,QAAaF,EAAOE,CAAG,IAAM,MACrD,EACA,OAAQ,SAAUA,EAAK,CAClBH,EAAMG,CAAG,IAAM,SAChBH,EAAMG,CAAG,EAAI,QACZF,EAAOE,CAAG,IAAM,SACjBF,EAAOE,CAAG,EAAI,OAClB,EACA,IAAK,SAAUA,EAAK,CAClB,IAAIE,EAAIL,EAAMG,CAAG,EACjB,GAAGE,IAAM,OAAW,OAAOA,EAC3B,IAAIA,EAAIJ,EAAOE,CAAG,KAAO,OACvB,OAAAD,EAAOC,EAAKE,CAAC,EACNA,CAEX,EACA,IAAK,SAAUF,EAAKC,EAAO,CACtBJ,EAAMG,CAAG,IAAM,OAAWH,EAAMG,CAAG,EAAIC,EACrCF,EAAOC,EAAKC,CAAK,CACxB,EACA,MAAO,UAAY,CACjBJ,EAAQ,OAAO,OAAO,IAAI,EAC1BC,EAAS,OAAO,OAAO,IAAI,CAC7B,CACF,CACF,IC3CA,IAAAK,GAAAC,GAAAC,IAAA,cACA,OAAO,eAAeA,GAAS,aAAc,CAAE,MAAO,EAAK,CAAC,EAC5DA,GAAQ,aAAe,OACvBA,GAAQ,QAAUC,GAClBD,GAAQ,QAAUE,EAClB,SAASA,EAAQC,EAAM,CACnB,IAAMC,GAAKD,EAAQ,aAAiB,GAC9BE,GAAKF,EAAQ,KAAQ,MAAS,GAC9BG,GAAKH,EAAQ,SAAgB,EAC7BI,EAAIJ,EAAO,IACjB,MAAO,CAACC,EAAGC,EAAGC,EAAGC,CAAC,EAAE,KAAK,GAAG,CAChC,CACA,IAAMC,GAAO,GACPC,GAAO,GACPC,GAAO,GACb,SAASC,GAASC,EAAG,CACjB,IAAIC,EAAI,EACJC,EAAO,GACPC,EAAO,IACPC,EAAI,EACJJ,EAAE,OAAS,GAAKA,EAAEI,CAAC,IAAM,MACrBJ,EAAEI,EAAI,CAAC,IAAM,KAAOJ,EAAEI,EAAI,CAAC,IAAM,KACjCA,GAAK,EACLF,EAAO,IAEF,KAAOF,EAAEI,EAAI,CAAC,GAAKJ,EAAEI,EAAI,CAAC,GAAK,MACpCA,IACAF,EAAO,EACPC,EAAO,MAGf,IAAME,EAAQD,EACd,KAAOA,EAAIJ,EAAE,QAAQ,CACjB,GAAI,KAAOA,EAAEI,CAAC,GAAKJ,EAAEI,CAAC,GAAKD,EACvBF,EAAKA,EAAIC,GAAQF,EAAE,WAAWI,CAAC,EAAIR,MAAW,UAEzCM,IAAS,GACd,GAAI,KAAOF,EAAEI,CAAC,GAAKJ,EAAEI,CAAC,GAAK,IACvBH,EAAKA,EAAIC,GAAQ,GAAKF,EAAE,WAAWI,CAAC,EAAIP,MAAW,UAE9C,KAAOG,EAAEI,CAAC,GAAKJ,EAAEI,CAAC,GAAK,IAC5BH,EAAKA,EAAIC,GAAQ,GAAKF,EAAE,WAAWI,CAAC,EAAIN,MAAW,MAGnD,WAIJ,OAEJ,GAAIG,EAAI,WACJ,MAAM,IAAI,MAAM,WAAW,EAE/BG,GACJ,CACA,GAAIA,IAAMC,EACN,MAAM,IAAI,MAAM,aAAa,EAEjC,MAAO,CAACJ,EAAGG,CAAC,CAChB,CACA,SAASf,GAAQiB,EAAI,CACjB,IAAMb,EAAI,CAAC,EACX,QAASW,EAAI,EAAGA,GAAK,GACbE,EAAG,SAAW,EADEF,IAAK,CAIzB,GAAIA,EAAI,EAAG,CACP,GAAIE,EAAG,CAAC,IAAM,IACV,MAAM,IAAI,MAAM,YAAY,EAEhCA,EAAKA,EAAG,UAAU,CAAC,CACvB,CACA,GAAM,CAAC,EAAGZ,CAAC,EAAIK,GAASO,CAAE,EAC1BA,EAAKA,EAAG,UAAUZ,CAAC,EACnBD,EAAE,KAAK,CAAC,CACZ,CACA,GAAIa,EAAG,SAAW,EACd,MAAM,IAAI,MAAM,YAAY,EAEhC,OAAQb,EAAE,OAAQ,CACd,IAAK,GACD,GAAIA,EAAE,CAAC,EAAI,WACP,MAAM,IAAI,MAAM,YAAY,EAEhC,OAAOA,EAAE,CAAC,IAAM,EACpB,IAAK,GACD,GAAIA,EAAE,CAAC,EAAI,KAAQA,EAAE,CAAC,EAAI,SACtB,MAAM,IAAI,MAAM,YAAY,EAEhC,OAAQA,EAAE,CAAC,GAAK,GAAKA,EAAE,CAAC,KAAO,EACnC,IAAK,GACD,GAAIA,EAAE,CAAC,EAAI,KAAQA,EAAE,CAAC,EAAI,KAAQA,EAAE,CAAC,EAAI,MACrC,MAAM,IAAI,MAAM,YAAY,EAEhC,OAAQA,EAAE,CAAC,GAAK,GAAKA,EAAE,CAAC,GAAK,GAAKA,EAAE,CAAC,KAAO,EAChD,IAAK,GACD,GAAIA,EAAE,CAAC,EAAI,KAAQA,EAAE,CAAC,EAAI,KAAQA,EAAE,CAAC,EAAI,KAAQA,EAAE,CAAC,EAAI,IACpD,MAAM,IAAI,MAAM,YAAY,EAEhC,OAAQA,EAAE,CAAC,GAAK,GAAKA,EAAE,CAAC,GAAK,GAAKA,EAAE,CAAC,GAAK,EAAIA,EAAE,CAAC,KAAO,EAC5D,QACI,MAAM,IAAI,MAAM,YAAY,CACpC,CACJ,CACA,IAAMc,GAAN,MAAMC,CAAa,CACf,YAAYC,EAAKC,EAAM,CACnB,GAAI,OAAOD,GAAQ,SACf,MAAM,IAAI,MAAM,yBAAyB,EAE7C,IAAIE,EAAUD,EACd,GAAI,CAACC,EAAS,CACV,IAAMC,EAAQH,EAAI,MAAM,IAAK,CAAC,EAC9BA,EAAMG,EAAM,CAAC,EACbD,EAAUC,EAAM,CAAC,CACrB,CAIA,GAHKD,IACDA,EAAU,IAEV,OAAOA,GAAY,UAAYA,EAAQ,QAAQ,GAAG,EAAI,GAAI,CAC1D,GAAI,CACA,KAAK,SAAWtB,GAAQsB,CAAO,CACnC,MACc,CACV,MAAM,IAAI,MAAM,iBAAmBA,CAAO,CAC9C,CACA,KAAK,QAAU,IACf,QAASP,EAAI,GAAIA,GAAK,EAAGA,IACrB,GAAI,KAAK,WAAc,YAAe,GAAKA,IAAQ,EAAG,CAClD,KAAK,QAAUA,EACf,KACJ,CAER,SACSO,GAAWA,IAAY,EAC5B,KAAK,QAAU,SAASA,EAAS,EAAE,EACnC,KAAK,SAAW,EACZ,KAAK,QAAU,IACf,KAAK,SAAY,YAAe,GAAK,KAAK,UAAc,OAI5D,OAAM,IAAI,MAAM,qBAAqB,EAEzC,GAAI,CACA,KAAK,SAAWtB,GAAQoB,CAAG,EAAI,KAAK,YAAc,CACtD,MACc,CACV,MAAM,IAAI,MAAM,wBAA0BA,CAAG,CACjD,CACA,GAAI,EAAE,KAAK,SAAW,IAClB,MAAM,IAAI,MAAM,yBAA2BE,CAAO,EAEtD,KAAK,KAAO,KAAK,IAAI,EAAG,GAAK,KAAK,OAAO,EACzC,KAAK,KAAOrB,EAAQ,KAAK,OAAO,EAChC,KAAK,KAAOA,EAAQ,KAAK,QAAQ,EACjC,KAAK,SAAWA,EAAQ,CAAC,KAAK,QAAQ,EACtC,KAAK,MAAQ,KAAK,SAAW,GAAKA,EAAQ,KAAK,QAAU,CAAC,EAAI,KAAK,KACnE,KAAK,KAAO,KAAK,SAAW,GAAKA,EAAQ,KAAK,QAAU,KAAK,KAAO,CAAC,EAAIA,EAAQ,KAAK,QAAU,KAAK,KAAO,CAAC,EAC7G,KAAK,UAAY,KAAK,SAAW,GAAKA,EAAQ,KAAK,QAAU,KAAK,KAAO,CAAC,EAAI,MAClF,CACA,SAASgB,EAAI,CAIT,OAHI,OAAOA,GAAO,WAAaA,EAAG,QAAQ,GAAG,EAAI,GAAKA,EAAG,MAAM,GAAG,EAAE,SAAW,KAC3EA,EAAK,IAAIE,EAAaF,CAAE,GAExBA,aAAcE,EACP,KAAK,SAASF,EAAG,IAAI,GAAK,KAAK,SAAUA,EAAG,WAAaA,EAAG,IAAK,GAGhEjB,GAAQiB,CAAE,EAAI,KAAK,YAAc,KAAO,KAAK,QAAU,KAAK,YAAc,CAE1F,CACA,KAAKO,EAAQ,EAAG,CACZ,OAAO,IAAIL,EAAalB,EAAQ,KAAK,QAAW,KAAK,KAAOuB,CAAM,EAAG,KAAK,IAAI,CAClF,CACA,QAAQC,EAAI,CACR,IAAIvB,EAAOF,GAAQ,KAAK,KAAK,EACvB0B,EAAW1B,GAAQ,KAAK,IAAI,EAC9B2B,EAAQ,EACZ,KAAOzB,GAAQwB,GACXD,EAAGxB,EAAQC,CAAI,EAAGA,EAAMyB,CAAK,EAC7BA,IACAzB,GAER,CACA,UAAW,CACP,OAAO,KAAK,KAAO,IAAM,KAAK,OAClC,CACJ,EACAH,GAAQ,aAAemB,KC5LvB,IAAAU,GAAAC,GAAAC,IAAA,cACA,OAAO,eAAeA,GAAS,aAAc,CAAE,MAAO,EAAK,CAAC,EAC5DA,GAAQ,aAAe,OACvBA,GAAQ,UAAYC,GACpBD,GAAQ,WAAaE,GACrB,IAAMC,GAAa,KACbC,IAAY,IAAM,MAAQ,GAChC,SAASH,GAAUI,EAAI,CAEnB,IAAMC,EAAUD,EAAG,QAAQ,GAAG,EAC1BC,IAAY,KACZD,EAAKA,EAAG,UAAU,EAAGC,CAAO,GAGhC,IAAMC,EAAYF,EAAG,YAAY,GAAG,EACpC,GAAIE,IAAc,IAAMF,EAAG,QAAQ,IAAKE,CAAS,IAAM,GAAI,CACvD,IAAMC,EAAWH,EAAG,UAAUE,EAAY,CAAC,EACrCE,KAAeN,GAAW,SAASK,CAAQ,EAE3CE,EAAaL,EAAG,UAAU,EAAGE,EAAY,CAAC,EAAI,MAEpD,OADkBI,GAAcD,CAAU,EACtB,CAAC,YAAe,OAAOD,CAAQ,CACvD,CACA,OAAOE,GAAcN,CAAE,CAC3B,CACA,SAASM,GAAcN,EAAI,CACvB,IAAMO,EAAiBP,EAAG,QAAQ,IAAI,EAClCQ,EACJ,GAAID,IAAmB,GAAI,CACvB,IAAME,EAAOT,EAAG,UAAU,EAAGO,CAAc,EACrCG,EAAQV,EAAG,UAAUO,EAAiB,CAAC,EACvCI,EAAaF,IAAS,GAAK,CAAC,EAAIA,EAAK,MAAM,GAAG,EAC9CG,EAAcF,IAAU,GAAK,CAAC,EAAIA,EAAM,MAAM,GAAG,EACjDG,EAAU,EAAIF,EAAW,OAASC,EAAY,OACpD,GAAIC,EAAU,EACV,MAAM,IAAI,MAAM,+BAA+B,EAEnDL,EAAS,CAAC,GAAGG,EAAY,GAAG,MAAME,CAAO,EAAE,KAAK,GAAG,EAAG,GAAGD,CAAW,CACxE,MAEIJ,EAASR,EAAG,MAAM,GAAG,EAEzB,GAAIQ,EAAO,SAAW,EAClB,MAAM,IAAI,MAAM,wCAA0CA,EAAO,MAAM,EAE3E,IAAIM,EAAS,GACb,QAASC,EAAI,EAAGA,EAAI,EAAGA,IAAK,CACxB,IAAMC,EAAIR,EAAOO,CAAC,EAClB,GAAIC,EAAE,SAAW,GAAKA,EAAE,OAAS,EAC7B,MAAM,IAAI,MAAM,4BAA8BA,EAAI,GAAG,EAEzD,IAAMC,EAAM,SAASD,EAAG,EAAE,EAC1B,GAAI,MAAMC,CAAG,GAAKA,EAAM,GAAKA,EAAM,MAC/B,MAAM,IAAI,MAAM,4BAA8BD,EAAI,GAAG,EAEzDF,EAAUA,GAAU,IAAO,OAAOG,CAAG,CACzC,CACA,OAAOH,CACX,CACA,SAASjB,GAAWqB,EAAG,CACnB,GAAIA,EAAI,IAAMA,EAAInB,GACd,MAAM,IAAI,MAAM,4BAA4B,EAEhD,IAAMS,EAAS,CAAC,EAChB,QAAS,EAAI,EAAG,EAAI,EAAG,IACnBA,EAAO,QAAQ,OAAOU,EAAI,OAAO,CAAC,EAClCA,IAAM,IAGV,IAAIC,EAAY,GACZC,EAAU,EACVC,EAAW,GACXC,EAAS,EACb,QAAS,EAAI,EAAG,EAAI,EAAG,IACfd,EAAO,CAAC,IAAM,EACVa,IAAa,IACbA,EAAW,EACXC,EAAS,GAGTA,KAIAA,EAASF,GAAWE,GAAU,IAC9BH,EAAYE,EACZD,EAAUE,GAEdD,EAAW,GACXC,EAAS,GAOjB,GAJIA,EAASF,GAAWE,GAAU,IAC9BH,EAAYE,EACZD,EAAUE,GAEVH,IAAc,IAAMA,EAAYC,IAAY,GAAKD,EAAY,EAE7D,OADeX,EAAO,MAAM,EAAGW,CAAS,EAAE,IAAIH,GAAKA,EAAE,SAAS,EAAE,CAAC,EACnD,KAAK,GAAG,EAAI,KAEzB,GAAIG,IAAc,EAEnB,MAAO,KADOX,EAAO,MAAMY,CAAO,EAAE,IAAIJ,GAAKA,EAAE,SAAS,EAAE,CAAC,EACvC,KAAK,GAAG,EAE3B,GAAIG,EAAY,EAAG,CACpB,IAAMI,EAASf,EAAO,MAAM,EAAGW,CAAS,EAAE,IAAIH,GAAKA,EAAE,SAAS,EAAE,CAAC,EAC3DQ,EAAQhB,EAAO,MAAMW,EAAYC,CAAO,EAAE,IAAIJ,GAAKA,EAAE,SAAS,EAAE,CAAC,EACvE,OAAOO,EAAO,KAAK,GAAG,EAAI,KAAOC,EAAM,KAAK,GAAG,CACnD,KAEI,QAAOhB,EAAO,IAAIQ,GAAKA,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,GAAG,CAEvD,CACA,IAAMS,GAAN,MAAMC,CAAa,CACf,YAAYC,EAAKC,EAAM,CACnB,GAAI,OAAOD,GAAQ,SACf,MAAM,IAAI,MAAM,yBAAyB,EAE7C,IAAIE,EAAYD,EAChB,GAA+BC,GAAc,KAAM,CAC/C,IAAMC,EAAWH,EAAI,QAAQ,GAAG,EAC5BG,IAAa,IACbD,EAAY,SAASF,EAAI,UAAUG,EAAW,CAAC,EAAG,EAAE,EACpDH,EAAMA,EAAI,UAAU,EAAGG,CAAQ,GAG/BD,EAAY,GAEpB,CACA,GAAI,MAAMA,CAAS,GAAKA,EAAY,GAAKA,EAAY,IACjD,MAAM,IAAI,MAAM,0BAA4BA,CAAS,EAEzD,KAAK,QAAUA,EACX,KAAK,UAAY,EACjB,KAAK,WAAa,GAGlB,KAAK,WAAc9B,IAAY,OAAO,IAAM,KAAK,OAAO,GAAM,OAAO,IAAM,KAAK,OAAO,EAE3F,GAAI,CACA,KAAK,UAAYH,GAAU+B,CAAG,EAAI,KAAK,UAC3C,MACc,CACV,MAAM,IAAI,MAAM,6BAA+BA,CAAG,CACtD,CACA,KAAK,KAAO,OAAO,IAAM,OAAO,IAAM,KAAK,OAAO,CAAC,EACnD,KAAK,KAAO9B,GAAW,KAAK,SAAS,EACrC,KAAK,KAAOA,GAAW,KAAK,UAAU,EACtC,KAAK,SAAWA,GAAW,CAAC,KAAK,WAAaE,EAAQ,EACtD,KAAK,MAAQ,KAAK,KAClB,KAAK,KAAOF,GAAW,KAAK,WAAa,IAAM,OAAO,IAAM,KAAK,OAAO,GAAK,EAAE,EAC/E,KAAK,UAAY,MACrB,CACA,SAASG,EAAI,CAMT,OALI,OAAOA,GAAO,UACVA,EAAG,QAAQ,GAAG,EAAI,IAClBA,EAAK,IAAI0B,EAAa1B,CAAE,GAG5BA,aAAc0B,EACP,KAAK,SAAS1B,EAAG,IAAI,GAAK,KAAK,SAASA,EAAG,IAAI,GAGzCJ,GAAUI,CAAE,EACV,KAAK,cAAgB,KAAK,SAEjD,CACA,KAAK+B,EAAQ,EAAG,CACZ,IAAMC,EAAU,IAAM,OAAO,IAAM,KAAK,OAAO,EAC/C,OAAO,IAAIN,EAAa7B,GAAW,KAAK,UAAYmC,EAAU,OAAOD,CAAK,CAAC,EAAG,KAAK,OAAO,CAC9F,CACA,QAAQE,EAAI,CACR,IAAIC,EAAO,KAAK,UACVF,EAAU,IAAM,OAAO,IAAM,KAAK,OAAO,EACzCG,EAAW,KAAK,UAAYH,EAAU,GACxCI,EAAQ,EACZ,KAAOF,GAAQC,GACXF,EAAGpC,GAAWqC,CAAI,EAAG,OAAOA,CAAI,EAAGE,CAAK,EACxCA,IACAF,GAER,CACA,UAAW,CACP,OAAO,KAAK,KAAO,IAAM,KAAK,OAClC,CACJ,EACAvC,GAAQ,aAAe8B,KC1LvB,IAAAY,GAAAC,GAAAC,IAAA,cACA,OAAO,eAAeA,GAAS,aAAc,CAAE,MAAO,EAAK,CAAC,EAC5DA,GAAQ,QAAUA,GAAQ,QAAUA,GAAQ,QAAU,OACtD,IAAMC,GAAa,KACnB,OAAO,eAAeD,GAAS,UAAW,CAAE,WAAY,GAAM,IAAK,UAAY,CAAE,OAAOC,GAAW,OAAS,CAAE,CAAC,EAC/G,OAAO,eAAeD,GAAS,UAAW,CAAE,WAAY,GAAM,IAAK,UAAY,CAAE,OAAOC,GAAW,OAAS,CAAE,CAAC,EAC/G,IAAMC,GAAa,KACbC,GAAN,MAAMC,CAAQ,CACV,YAAYC,EAAKC,EAAM,CACnB,GAAI,OAAOD,GAAQ,SACf,MAAM,IAAI,MAAM,yBAAyB,GAG5BA,EAAI,QAAQ,GAAG,IAAM,GAAKA,EAAI,UAAU,EAAGA,EAAI,QAAQ,GAAG,CAAC,EAAIA,GACnE,QAAQ,GAAG,IAAM,GAC1B,KAAK,MAAQ,IAAIH,GAAW,aAAaG,EAAKC,CAAI,EAGlD,KAAK,MAAQ,IAAIL,GAAW,aAAaI,EAAKC,CAAI,EAEtD,KAAK,KAAO,KAAK,MAAM,KACvB,KAAK,KAAO,KAAK,MAAM,KACvB,KAAK,SAAW,KAAK,MAAM,SAC3B,KAAK,QAAU,KAAK,MAAM,QAC1B,KAAK,KAAO,KAAK,MAAM,KACvB,KAAK,MAAQ,KAAK,MAAM,MACxB,KAAK,KAAO,KAAK,MAAM,KACvB,KAAK,UAAY,KAAK,MAAM,UACxB,KAAK,iBAAiBL,GAAW,cACjC,KAAK,SAAW,KAAK,MAAM,SAC3B,KAAK,QAAU,KAAK,MAAM,UAG1B,KAAK,SAAW,EAChB,KAAK,QAAU,EAEvB,CACA,SAASM,EAAI,CAWT,OAVI,OAAOA,GAAO,WAEVA,EAAG,QAAQ,GAAG,EAAI,EAClBA,EAAK,IAAIH,EAAQG,CAAE,EAGdA,EAAG,QAAQ,GAAG,IAAM,IAAMA,EAAG,MAAM,GAAG,EAAE,SAAW,IACxDA,EAAK,IAAIH,EAAQG,CAAE,IAGvBA,aAAcH,EACP,KAAK,SAASG,EAAG,IAAI,GAAK,KAAK,SAASA,EAAG,WAAaA,EAAG,IAAI,EAGnE,KAAK,MAAM,SAASA,CAAE,CACjC,CACA,KAAKC,EAAQ,EAAG,CACZ,IAAMC,EAAW,KAAK,MAAM,KAAKD,CAAK,EAEtC,OADe,IAAIJ,EAAQK,EAAS,KAAMA,EAAS,OAAO,CAE9D,CAEA,QAAQC,EAAI,CACR,KAAK,MAAM,QAAQA,CAAE,CACzB,CACA,UAAW,CACP,OAAO,KAAK,MAAM,SAAS,CAC/B,CACJ,EACAV,GAAQ,QAAUG,KCnElB,IAAAQ,GAAA,GAAAC,EAAAD,GAAA,4BAAAE,GAAA,wBAAAC,GAAA,qBAAAC,GAAA,gCAAAC,KCIM,SAAUC,EAAOC,EAAe,EAAC,CACrC,OAAO,IAAI,WAAWA,CAAI,CAC5B,CAOM,SAAUC,EAAaD,EAAe,EAAC,CAC3C,OAAO,IAAI,WAAWA,CAAI,CAC5B,CCXA,IAAME,GAAK,KAAK,IAAI,EAAG,CAAC,EAClBC,GAAK,KAAK,IAAI,EAAG,EAAE,EACnBC,GAAK,KAAK,IAAI,EAAG,EAAE,EACnBC,GAAK,KAAK,IAAI,EAAG,EAAE,EACnBC,GAAK,KAAK,IAAI,EAAG,EAAE,EACnBC,GAAK,KAAK,IAAI,EAAG,EAAE,EACnBC,GAAK,KAAK,IAAI,EAAG,EAAE,EAGnBC,EAAM,IAENC,EAAO,IAEP,SAAUC,GAAgBC,EAAa,CAC3C,GAAIA,EAAQV,GACV,MAAO,GAGT,GAAIU,EAAQT,GACV,MAAO,GAGT,GAAIS,EAAQR,GACV,MAAO,GAGT,GAAIQ,EAAQP,GACV,MAAO,GAGT,GAAIO,EAAQN,GACV,MAAO,GAGT,GAAIM,EAAQL,GACV,MAAO,GAGT,GAAIK,EAAQJ,GACV,MAAO,GAGT,GAAI,OAAO,kBAAoB,MAAQI,EAAQ,OAAO,iBACpD,MAAM,IAAI,WAAW,yBAAyB,EAGhD,MAAO,EACT,CAEM,SAAUC,GAA8CD,EAAeE,EAAoBC,EAAiB,EAAC,CACjH,OAAQJ,GAAeC,CAAK,EAAG,CAC7B,IAAK,GACHE,EAAIC,GAAQ,EAAKH,EAAQ,IAAQH,EACjCG,GAAS,IAEX,IAAK,GACHE,EAAIC,GAAQ,EAAKH,EAAQ,IAAQH,EACjCG,GAAS,IAEX,IAAK,GACHE,EAAIC,GAAQ,EAAKH,EAAQ,IAAQH,EACjCG,GAAS,IAEX,IAAK,GACHE,EAAIC,GAAQ,EAAKH,EAAQ,IAAQH,EACjCG,GAAS,IAEX,IAAK,GACHE,EAAIC,GAAQ,EAAKH,EAAQ,IAAQH,EACjCG,KAAW,EAEb,IAAK,GACHE,EAAIC,GAAQ,EAAKH,EAAQ,IAAQH,EACjCG,KAAW,EAEb,IAAK,GACHE,EAAIC,GAAQ,EAAKH,EAAQ,IAAQH,EACjCG,KAAW,EAEb,IAAK,GAAG,CACNE,EAAIC,GAAQ,EAAKH,EAAQ,IACzBA,KAAW,EACX,KACF,CACA,QAAS,MAAM,IAAI,MAAM,aAAa,CACxC,CACA,OAAOE,CACT,CA0CM,SAAUE,GAAkBC,EAAiBC,EAAc,CAC/D,IAAIC,EAAIF,EAAIC,CAAM,EACdE,EAAM,EA6CV,GA3CAA,GAAOD,EAAIE,EACPF,EAAIG,IAIRH,EAAIF,EAAIC,EAAS,CAAC,EAClBE,IAAQD,EAAIE,IAAS,EACjBF,EAAIG,KAIRH,EAAIF,EAAIC,EAAS,CAAC,EAClBE,IAAQD,EAAIE,IAAS,GACjBF,EAAIG,KAIRH,EAAIF,EAAIC,EAAS,CAAC,EAClBE,IAAQD,EAAIE,IAAS,GACjBF,EAAIG,KAIRH,EAAIF,EAAIC,EAAS,CAAC,EAClBE,IAAQD,EAAIE,GAAQE,GAChBJ,EAAIG,KAIRH,EAAIF,EAAIC,EAAS,CAAC,EAClBE,IAAQD,EAAIE,GAAQG,GAChBL,EAAIG,KAIRH,EAAIF,EAAIC,EAAS,CAAC,EAClBE,IAAQD,EAAIE,GAAQI,GAChBN,EAAIG,KAIRH,EAAIF,EAAIC,EAAS,CAAC,EAClBE,IAAQD,EAAIE,GAAQK,GAChBP,EAAIG,GACN,OAAOF,EAGT,MAAM,IAAI,WAAW,yBAAyB,CAChD,CAEM,SAAUO,GAAsBV,EAAqBC,EAAc,CACvE,IAAIC,EAAIF,EAAI,IAAIC,CAAM,EAClBE,EAAM,EA6CV,GA3CAA,GAAOD,EAAIE,EACPF,EAAIG,IAIRH,EAAIF,EAAI,IAAIC,EAAS,CAAC,EACtBE,IAAQD,EAAIE,IAAS,EACjBF,EAAIG,KAIRH,EAAIF,EAAI,IAAIC,EAAS,CAAC,EACtBE,IAAQD,EAAIE,IAAS,GACjBF,EAAIG,KAIRH,EAAIF,EAAI,IAAIC,EAAS,CAAC,EACtBE,IAAQD,EAAIE,IAAS,GACjBF,EAAIG,KAIRH,EAAIF,EAAI,IAAIC,EAAS,CAAC,EACtBE,IAAQD,EAAIE,GAAQE,GAChBJ,EAAIG,KAIRH,EAAIF,EAAI,IAAIC,EAAS,CAAC,EACtBE,IAAQD,EAAIE,GAAQG,GAChBL,EAAIG,KAIRH,EAAIF,EAAI,IAAIC,EAAS,CAAC,EACtBE,IAAQD,EAAIE,GAAQI,GAChBN,EAAIG,KAIRH,EAAIF,EAAI,IAAIC,EAAS,CAAC,EACtBE,IAAQD,EAAIE,GAAQK,GAChBP,EAAIG,GACN,OAAOF,EAGT,MAAM,IAAI,WAAW,yBAAyB,CAChD,CAgBM,SAAUQ,GAAQC,EAAkCC,EAAiB,EAAC,CAC1E,OAAID,aAAe,WACVE,GAAiBF,EAAKC,CAAM,EAE5BE,GAAqBH,EAAKC,CAAM,CAE3C,CCrQA,SAASG,GAAqBC,EAAe,CAC3C,OAAOA,EAAI,kBAAkB,WAC/B,CAOM,SAAUC,GAAiBD,EAAe,CAC9C,OAAID,GAAoBC,CAAG,EAClBA,EAGFA,EAAI,MAAK,CAClB,CCfA,IAAAE,GAAA,GAAAC,EAAAD,GAAA,YAAAE,KCAO,IAAMC,GAAQ,IAAI,WAAW,CAAC,EAW/B,SAAUC,GAAQC,EAAgBC,EAAc,CACpD,GAAID,IAAOC,EAAM,MAAO,GACxB,GAAID,EAAG,aAAeC,EAAG,WACvB,MAAO,GAGT,QAASC,EAAK,EAAGA,EAAKF,EAAG,WAAYE,IACnC,GAAIF,EAAGE,CAAE,IAAMD,EAAGC,CAAE,EAClB,MAAO,GAIX,MAAO,EACT,CAWM,SAAUC,GAAQC,EAA6C,CACnE,GAAIA,aAAa,YAAcA,EAAE,YAAY,OAAS,aACpD,OAAOC,GAAyBD,CAAC,EAEnC,GAAIA,aAAa,YACf,OAAO,IAAI,WAAWA,CAAC,EAEzB,GAAI,YAAY,OAAOA,CAAC,EACtB,OAAOC,GAAyB,IAAI,WAAWD,EAAE,OAAQA,EAAE,WAAYA,EAAE,UAAU,CAAC,EAEtF,MAAM,IAAI,MAAM,mCAAmC,CACrD,CAMM,SAAUE,GAAYC,EAAW,CACrC,OAAO,IAAI,YAAW,EAAG,OAAOA,CAAG,CACrC,CAEM,SAAUC,GAAUC,EAAa,CACrC,OAAO,IAAI,YAAW,EAAG,OAAOA,CAAC,CACnC,CAEA,SAASC,GAA4BD,EAAc,CACjD,OAAOA,GAAG,kBAAkB,WAC9B,CAMM,SAAUE,GAA0BF,EAAa,CACrD,OAAIC,GAA2BD,CAAC,EACvBA,EAGFA,EAAE,MAAK,CAChB,CChEA,SAASG,GAAMC,EAAUC,EAAI,CAC3B,GAAID,EAAS,QAAU,IAAO,MAAM,IAAI,UAAU,mBAAmB,EAErE,QADIE,EAAW,IAAI,WAAW,GAAG,EACxBC,EAAI,EAAGA,EAAID,EAAS,OAAQC,IACnCD,EAASC,CAAC,EAAI,IAEhB,QAASC,EAAI,EAAGA,EAAIJ,EAAS,OAAQI,IAAK,CACxC,IAAIC,EAAIL,EAAS,OAAOI,CAAC,EACrBE,EAAKD,EAAE,WAAW,CAAC,EACvB,GAAIH,EAASI,CAAE,IAAM,IAAO,MAAM,IAAI,UAAUD,EAAI,eAAe,EACnEH,EAASI,CAAE,EAAIF,CACjB,CACA,IAAIG,EAAOP,EAAS,OAChBQ,EAASR,EAAS,OAAO,CAAC,EAC1BS,EAAS,KAAK,IAAIF,CAAI,EAAI,KAAK,IAAI,GAAG,EACtCG,EAAU,KAAK,IAAI,GAAG,EAAI,KAAK,IAAIH,CAAI,EAI3C,SAASI,EAAQC,EAAM,CAOrB,GALIA,aAAkB,aAAuB,YAAY,OAAOA,CAAM,EACpEA,EAAS,IAAI,WAAWA,EAAO,OAAQA,EAAO,WAAYA,EAAO,UAAU,EAClE,MAAM,QAAQA,CAAM,IAC7BA,EAAS,WAAW,KAAKA,CAAM,IAE7B,EAAEA,aAAkB,YAAe,MAAM,IAAI,UAAU,qBAAqB,EAChF,GAAIA,EAAO,SAAW,EAAK,MAAO,GAMlC,QAJIC,EAAS,EACTC,EAAS,EACTC,EAAS,EACTC,EAAOJ,EAAO,OACXG,IAAWC,GAAQJ,EAAOG,CAAM,IAAM,GAC3CA,IACAF,IAMF,QAHII,GAASD,EAAOD,GAAUL,EAAU,IAAO,EAC3CQ,EAAM,IAAI,WAAWD,CAAI,EAEtBF,IAAWC,GAAM,CAItB,QAHIG,EAAQP,EAAOG,CAAM,EAErBX,EAAI,EACCgB,EAAMH,EAAO,GAAIE,IAAU,GAAKf,EAAIU,IAAYM,IAAQ,GAAKA,IAAOhB,IAC3Ee,GAAU,IAAMD,EAAIE,CAAG,IAAO,EAC9BF,EAAIE,CAAG,EAAKD,EAAQZ,IAAU,EAC9BY,EAASA,EAAQZ,IAAU,EAE7B,GAAIY,IAAU,EAAK,MAAM,IAAI,MAAM,gBAAgB,EACnDL,EAASV,EACTW,GACF,CAGA,QADIM,EAAMJ,EAAOH,EACVO,IAAQJ,GAAQC,EAAIG,CAAG,IAAM,GAClCA,IAIF,QADIC,GAAMd,EAAO,OAAOK,CAAM,EACvBQ,EAAMJ,EAAM,EAAEI,EAAOC,IAAOtB,EAAS,OAAOkB,EAAIG,CAAG,CAAC,EAC3D,OAAOC,EACT,CAIA,SAASC,EAAcX,EAAM,CAC3B,GAAI,OAAOA,GAAW,SAAY,MAAM,IAAI,UAAU,iBAAiB,EACvE,GAAIA,EAAO,SAAW,EAAK,OAAO,IAAI,WACtC,IAAIY,EAAM,EAEV,GAAIZ,EAAOY,CAAG,IAAM,IAIpB,SAFIX,EAAS,EACTC,EAAS,EACNF,EAAOY,CAAG,IAAMhB,GACrBK,IACAW,IAMF,QAHIP,GAAUL,EAAO,OAASY,GAAOf,EAAU,IAAO,EAClDgB,EAAO,IAAI,WAAWR,CAAI,EAEvBL,EAAOY,CAAG,GAAG,CAElB,IAAIL,EAAQjB,EAASU,EAAO,WAAWY,CAAG,CAAC,EAE3C,GAAIL,IAAU,IAAO,OAErB,QADIf,EAAI,EACCsB,EAAMT,EAAO,GAAIE,IAAU,GAAKf,EAAIU,IAAYY,IAAQ,GAAKA,IAAOtB,IAC3Ee,GAAUZ,EAAOkB,EAAKC,CAAG,IAAO,EAChCD,EAAKC,CAAG,EAAKP,EAAQ,MAAS,EAC9BA,EAASA,EAAQ,MAAS,EAE5B,GAAIA,IAAU,EAAK,MAAM,IAAI,MAAM,gBAAgB,EACnDL,EAASV,EACToB,GACF,CAEA,GAAIZ,EAAOY,CAAG,IAAM,IAGpB,SADIG,EAAMV,EAAOH,EACVa,IAAQV,GAAQQ,EAAKE,CAAG,IAAM,GACnCA,IAIF,QAFIC,EAAM,IAAI,WAAWf,GAAUI,EAAOU,EAAI,EAC1CxB,GAAIU,EACDc,IAAQV,GACbW,EAAIzB,IAAG,EAAIsB,EAAKE,GAAK,EAEvB,OAAOC,GACT,CAIA,SAASC,EAAQC,EAAM,CACrB,IAAIC,EAASR,EAAaO,CAAM,EAChC,GAAIC,EAAU,OAAOA,EACrB,MAAM,IAAI,MAAM,OAAO9B,CAAI,YAAY,CACzC,CACA,MAAO,CACL,OAAQU,EACR,aAAcY,EACd,OAAQM,EAEZ,CACA,IAAIG,GAAMjC,GAENkC,GAAkCD,GAEtCE,GAAeD,GCjIf,IAAME,GAAN,KAAa,CACF,KACA,OACA,WAET,YAAaC,EAAYC,EAAgBC,EAAoB,CAC3D,KAAK,KAAOF,EACZ,KAAK,OAASC,EACd,KAAK,WAAaC,CACpB,CAEA,OAAQC,EAAiB,CACvB,GAAIA,aAAiB,WACnB,MAAO,GAAG,KAAK,MAAM,GAAG,KAAK,WAAWA,CAAK,CAAC,GAE9C,MAAM,MAAM,mCAAmC,CAEnD,GAQIC,GAAN,KAAa,CACF,KACA,OACA,WACQ,gBAEjB,YAAaJ,EAAYC,EAAgBI,EAAoB,CAC3D,KAAK,KAAOL,EACZ,KAAK,OAASC,EACd,IAAMK,EAAkBL,EAAO,YAAY,CAAC,EAE5C,GAAIK,IAAoB,OACtB,MAAM,IAAI,MAAM,0BAA0B,EAE5C,KAAK,gBAAkBA,EACvB,KAAK,WAAaD,CACpB,CAEA,OAAQE,EAAY,CAClB,GAAI,OAAOA,GAAS,SAAU,CAC5B,GAAIA,EAAK,YAAY,CAAC,IAAM,KAAK,gBAC/B,MAAM,MAAM,qCAAqC,KAAK,UAAUA,CAAI,CAAC,KAAK,KAAK,IAAI,+CAA+C,KAAK,MAAM,EAAE,EAEjJ,OAAO,KAAK,WAAWA,EAAK,MAAM,KAAK,OAAO,MAAM,CAAC,CACvD,KACE,OAAM,MAAM,mCAAmC,CAEnD,CAEA,GAAgCC,EAAmE,CACjG,OAAOC,GAAG,KAAMD,CAAO,CACzB,GAKIE,GAAN,KAAqB,CACV,SAET,YAAaC,EAA0B,CACrC,KAAK,SAAWA,CAClB,CAEA,GAAiCH,EAAmE,CAClG,OAAOC,GAAG,KAAMD,CAAO,CACzB,CAEA,OAAQI,EAAa,CACnB,IAAMX,EAASW,EAAM,CAAC,EAChBJ,EAAU,KAAK,SAASP,CAAM,EACpC,GAAIO,GAAW,KACb,OAAOA,EAAQ,OAAOI,CAAK,EAE3B,MAAM,WAAW,qCAAqC,KAAK,UAAUA,CAAK,CAAC,+BAA+B,OAAO,KAAK,KAAK,QAAQ,CAAC,gBAAgB,CAExJ,GAGI,SAAUH,GAAyCI,EAA+CC,EAA8C,CACpJ,OAAO,IAAIJ,GAAgB,CACzB,GAAIG,EAAK,UAAY,CAAE,CAAEA,EAA2B,MAAM,EAAGA,CAAI,EACjE,GAAIC,EAAM,UAAY,CAAE,CAAEA,EAA4B,MAAM,EAAGA,CAAK,EAClD,CACtB,CAEM,IAAOC,GAAP,KAAY,CACP,KACA,OACA,WACA,WACA,QACA,QAET,YAAaf,EAAYC,EAAgBC,EAAsBG,EAAoB,CACjF,KAAK,KAAOL,EACZ,KAAK,OAASC,EACd,KAAK,WAAaC,EAClB,KAAK,WAAaG,EAClB,KAAK,QAAU,IAAIN,GAAQC,EAAMC,EAAQC,CAAU,EACnD,KAAK,QAAU,IAAIE,GAAQJ,EAAMC,EAAQI,CAAU,CACrD,CAEA,OAAQO,EAAiB,CACvB,OAAO,KAAK,QAAQ,OAAOA,CAAK,CAClC,CAEA,OAAQA,EAAa,CACnB,OAAO,KAAK,QAAQ,OAAOA,CAAK,CAClC,GAGI,SAAUI,GAAmD,CAAE,KAAAhB,EAAM,OAAAC,EAAQ,OAAAgB,EAAQ,OAAAC,CAAM,EAAsE,CACrK,OAAO,IAAIH,GAAMf,EAAMC,EAAQgB,EAAQC,CAAM,CAC/C,CAEM,SAAUC,GAAoD,CAAE,KAAAnB,EAAM,OAAAC,EAAQ,SAAAmB,CAAQ,EAAoD,CAC9I,GAAM,CAAE,OAAAH,EAAQ,OAAAC,CAAM,EAAKG,GAAMD,EAAUpB,CAAI,EAC/C,OAAOgB,GAAK,CACV,OAAAf,EACA,KAAAD,EACA,OAAAiB,EACA,OAASV,GAA0Ce,GAAOJ,EAAOX,CAAI,CAAC,EACvE,CACH,CAEA,SAASW,GAAQK,EAAgBC,EAAqCC,EAAqBzB,EAAY,CAErG,IAAI0B,EAAMH,EAAO,OACjB,KAAOA,EAAOG,EAAM,CAAC,IAAM,KACzB,EAAEA,EAIJ,IAAMC,EAAM,IAAI,WAAYD,EAAMD,EAAc,EAAK,CAAC,EAGlDG,EAAO,EACPC,EAAS,EACTC,EAAU,EACd,QAASC,EAAI,EAAGA,EAAIL,EAAK,EAAEK,EAAG,CAE5B,IAAMC,EAAQR,EAAYD,EAAOQ,CAAC,CAAC,EACnC,GAAIC,IAAU,OACZ,MAAM,IAAI,YAAY,OAAOhC,CAAI,YAAY,EAI/C6B,EAAUA,GAAUJ,EAAeO,EACnCJ,GAAQH,EAGJG,GAAQ,IACVA,GAAQ,EACRD,EAAIG,GAAS,EAAI,IAAQD,GAAUD,EAEvC,CAGA,GAAIA,GAAQH,IAAgB,IAAQI,GAAW,EAAID,KAAY,EAC7D,MAAM,IAAI,YAAY,wBAAwB,EAGhD,OAAOD,CACT,CAEA,SAASV,GAAQgB,EAAkBb,EAAkBK,EAAmB,CACtE,IAAMS,EAAMd,EAASA,EAAS,OAAS,CAAC,IAAM,IACxCe,GAAQ,GAAKV,GAAe,EAC9BE,EAAM,GAENC,EAAO,EACPC,EAAS,EACb,QAASE,EAAI,EAAGA,EAAIE,EAAK,OAAQ,EAAEF,EAMjC,IAJAF,EAAUA,GAAU,EAAKI,EAAKF,CAAC,EAC/BH,GAAQ,EAGDA,EAAOH,GACZG,GAAQH,EACRE,GAAOP,EAASe,EAAQN,GAAUD,CAAK,EAU3C,GALIA,IAAS,IACXD,GAAOP,EAASe,EAAQN,GAAWJ,EAAcG,CAAM,GAIrDM,EACF,MAASP,EAAI,OAASF,EAAe,KAAO,GAC1CE,GAAO,IAIX,OAAOA,CACT,CAEA,SAASS,GAAmBhB,EAAgB,CAE1C,IAAMI,EAAsC,CAAA,EAC5C,QAASO,EAAI,EAAGA,EAAIX,EAAS,OAAQ,EAAEW,EACrCP,EAAYJ,EAASW,CAAC,CAAC,EAAIA,EAE7B,OAAOP,CACT,CAKM,SAAUa,EAAsD,CAAE,KAAArC,EAAM,OAAAC,EAAQ,YAAAwB,EAAa,SAAAL,CAAQ,EAAyE,CAClL,IAAMI,EAAcY,GAAkBhB,CAAQ,EAC9C,OAAOJ,GAAK,CACV,OAAAf,EACA,KAAAD,EACA,OAAQY,EAAiB,CACvB,OAAOK,GAAOL,EAAOQ,EAAUK,CAAW,CAC5C,EACA,OAAQb,EAAa,CACnB,OAAOM,GAAON,EAAOY,EAAaC,EAAazB,CAAI,CACrD,EACD,CACH,CH9OO,IAAMsC,GAASC,GAAM,CAC1B,OAAQ,IACR,KAAM,SACN,SAAU,aACX,EIND,IAAAC,GAAA,GAAAC,EAAAD,GAAA,YAAAE,GAAA,gBAAAC,KAEO,IAAMC,GAASC,EAAQ,CAC5B,OAAQ,IACR,KAAM,SACN,SAAU,mBACV,YAAa,EACd,EAEYC,GAAcD,EAAQ,CACjC,OAAQ,IACR,KAAM,cACN,SAAU,mBACV,YAAa,EACd,ECdD,IAAAE,GAAA,GAAAC,EAAAD,GAAA,WAAAE,KAEO,IAAMC,GAAQC,EAAQ,CAC3B,OAAQ,IACR,KAAM,QACN,SAAU,KACV,YAAa,EACd,ECPD,IAAAC,GAAA,GAAAC,EAAAD,GAAA,kBAAAE,KAEA,IAAMC,GAAW,MAAM,KAAK,orEAAwe,EAC9fC,GAAkCD,GAAS,OAAiB,CAACE,EAAGC,EAAGC,KAAQF,EAAEE,CAAC,EAAID,EAAUD,GAAM,CAAA,CAAG,EACrGG,GAAkCL,GAAS,OAAiB,CAACE,EAAGC,EAAGC,IAAK,CAC5E,IAAME,EAAYH,EAAE,YAAY,CAAC,EACjC,GAAIG,GAAa,KACf,MAAM,IAAI,MAAM,sBAAsBH,CAAC,EAAE,EAE3C,OAAAD,EAAEI,CAAS,EAAIF,EACRF,CACT,EAAI,CAAA,CAAG,EAEP,SAASK,GAAQC,EAAgB,CAC/B,OAAOA,EAAK,OAAO,CAACN,EAAGC,KACrBD,GAAKD,GAAqBE,CAAC,EACpBD,GACN,EAAE,CACP,CAEA,SAASO,GAAQC,EAAW,CAC1B,IAAMC,EAAO,CAAA,EACb,QAAWC,KAAQF,EAAK,CACtB,IAAMJ,EAAYM,EAAK,YAAY,CAAC,EACpC,GAAIN,GAAa,KACf,MAAM,IAAI,MAAM,sBAAsBM,CAAI,EAAE,EAE9C,IAAMC,EAAMR,GAAqBC,CAAS,EAC1C,GAAIO,GAAO,KACT,MAAM,IAAI,MAAM,+BAA+BD,CAAI,EAAE,EAEvDD,EAAK,KAAKE,CAAG,CACf,CACA,OAAO,IAAI,WAAWF,CAAI,CAC5B,CAEO,IAAMG,GAAeC,GAAK,CAC/B,OAAQ,YACR,KAAM,eACN,OAAAR,GACA,OAAAE,GACD,ECzCD,IAAAO,GAAA,GAAAC,EAAAD,GAAA,YAAAE,EAAA,cAAAC,GAAA,iBAAAC,GAAA,sBAAAC,GAAA,mBAAAC,GAAA,cAAAC,GAAA,mBAAAC,GAAA,gBAAAC,GAAA,YAAAC,KAEO,IAAMC,EAASC,EAAQ,CAC5B,OAAQ,IACR,KAAM,SACN,SAAU,mCACV,YAAa,EACd,EAEYC,GAAcD,EAAQ,CACjC,OAAQ,IACR,KAAM,cACN,SAAU,mCACV,YAAa,EACd,EAEYE,GAAYF,EAAQ,CAC/B,OAAQ,IACR,KAAM,YACN,SAAU,oCACV,YAAa,EACd,EAEYG,GAAiBH,EAAQ,CACpC,OAAQ,IACR,KAAM,iBACN,SAAU,oCACV,YAAa,EACd,EAEYI,GAAYJ,EAAQ,CAC/B,OAAQ,IACR,KAAM,YACN,SAAU,mCACV,YAAa,EACd,EAEYK,GAAiBL,EAAQ,CACpC,OAAQ,IACR,KAAM,iBACN,SAAU,mCACV,YAAa,EACd,EAEYM,GAAeN,EAAQ,CAClC,OAAQ,IACR,KAAM,eACN,SAAU,oCACV,YAAa,EACd,EAEYO,GAAoBP,EAAQ,CACvC,OAAQ,IACR,KAAM,oBACN,SAAU,oCACV,YAAa,EACd,EAEYQ,GAAUR,EAAQ,CAC7B,OAAQ,IACR,KAAM,UACN,SAAU,mCACV,YAAa,EACd,EC/DD,IAAAS,GAAA,GAAAC,EAAAD,GAAA,YAAAE,GAAA,gBAAAC,KAEO,IAAMC,GAASC,GAAM,CAC1B,OAAQ,IACR,KAAM,SACN,SAAU,uCACX,EAEYC,GAAcD,GAAM,CAC/B,OAAQ,IACR,KAAM,cACN,SAAU,uCACX,ECZD,IAAAE,GAAA,GAAAC,EAAAD,GAAA,eAAAE,EAAA,iBAAAC,KAEO,IAAMC,EAAYC,GAAM,CAC7B,KAAM,YACN,OAAQ,IACR,SAAU,6DACX,EAEYC,GAAeD,GAAM,CAChC,KAAM,eACN,OAAQ,IACR,SAAU,6DACX,ECZD,IAAAE,GAAA,GAAAC,EAAAD,GAAA,YAAAE,GAAA,cAAAC,GAAA,cAAAC,GAAA,iBAAAC,KAEO,IAAMC,GAASC,EAAQ,CAC5B,OAAQ,IACR,KAAM,SACN,SAAU,mEACV,YAAa,EACd,EAEYC,GAAYD,EAAQ,CAC/B,OAAQ,IACR,KAAM,YACN,SAAU,oEACV,YAAa,EACd,EAEYE,GAAYF,EAAQ,CAC/B,OAAQ,IACR,KAAM,YACN,SAAU,mEACV,YAAa,EACd,EAEYG,GAAeH,EAAQ,CAClC,OAAQ,IACR,KAAM,eACN,SAAU,oEACV,YAAa,EACd,EC5BD,IAAAI,GAAA,GAAAC,EAAAD,GAAA,WAAAE,KAEO,IAAMC,GAAQC,EAAQ,CAC3B,OAAQ,IACR,KAAM,QACN,SAAU,WACV,YAAa,EACd,ECPD,IAAAC,GAAA,GAAAC,EAAAD,GAAA,cAAAE,KAGO,IAAMC,GAAWC,GAAK,CAC3B,OAAQ,KACR,KAAM,WACN,OAASC,GAAQC,GAASD,CAAG,EAC7B,OAASE,GAAQC,GAAWD,CAAG,EAChC,ECND,IAAME,GAAc,IAAI,YAClBC,GAAc,IAAI,YCHxB,IAAAC,GAAA,GAAAC,EAAAD,GAAA,cAAAE,KCCA,IAAIC,GAAWC,GAEXC,GAAM,IACNC,GAAO,IACPC,GAAS,CAACD,GACVE,GAAM,KAAK,IAAI,EAAG,EAAE,EAOxB,SAASJ,GAAOK,EAAKC,EAAKC,EAAM,CAC9BD,EAAMA,GAAO,CAAA,EACbC,EAASA,GAAU,EAGnB,QAFIC,EAAYD,EAEVF,GAAOD,IACXE,EAAIC,GAAQ,EAAKF,EAAM,IAAQJ,GAC/BI,GAAO,IAET,KAAMA,EAAMF,IACVG,EAAIC,GAAQ,EAAKF,EAAM,IAAQJ,GAC/BI,KAAS,EAEX,OAAAC,EAAIC,CAAM,EAAIF,EAAM,EAGpBL,GAAO,MAAQO,EAASC,EAAY,EAE7BF,CACT,CAEA,IAAIG,GAASC,GAETC,GAAQ,IACRC,GAAS,IAMb,SAASF,GAAKG,EAAKN,EAAM,CACvB,IAAIO,EAAS,EACTP,EAASA,GAAU,EACnBQ,EAAS,EACTC,EAAUT,EACVU,EACAC,EAAIL,EAAI,OAEZ,EAAG,CACD,GAAIG,GAAWE,EAEb,MAAAR,GAAK,MAAQ,EACP,IAAI,WAAW,yBAAyB,EAEhDO,EAAIJ,EAAIG,GAAS,EACjBF,GAAOC,EAAQ,IACVE,EAAIL,KAAWG,GACfE,EAAIL,IAAU,KAAK,IAAI,EAAGG,CAAK,EACpCA,GAAS,CACX,OAASE,GAAKN,IAGd,OAAAD,GAAK,MAAQM,EAAUT,EAEhBO,CACT,CAEA,IAAIK,GAAK,KAAK,IAAI,EAAI,CAAC,EACnBC,GAAK,KAAK,IAAI,EAAG,EAAE,EACnBC,GAAK,KAAK,IAAI,EAAG,EAAE,EACnBC,GAAK,KAAK,IAAI,EAAG,EAAE,EACnBC,GAAK,KAAK,IAAI,EAAG,EAAE,EACnBC,GAAK,KAAK,IAAI,EAAG,EAAE,EACnBC,GAAK,KAAK,IAAI,EAAG,EAAE,EACnBC,GAAK,KAAK,IAAI,EAAG,EAAE,EACnBC,GAAK,KAAK,IAAI,EAAG,EAAE,EAEnBC,GAAS,SAAgCC,EAAK,CAChD,OACEA,EAAQV,GAAK,EACbU,EAAQT,GAAK,EACbS,EAAQR,GAAK,EACbQ,EAAQP,GAAK,EACbO,EAAQN,GAAK,EACbM,EAAQL,GAAK,EACbK,EAAQJ,GAAK,EACbI,EAAQH,GAAK,EACbG,EAAQF,GAAK,EACA,EAEjB,EAEIG,GAAS,CACT,OAAQ/B,GACR,OAAQU,GACR,eAAgBmB,IAGhBG,GAAeD,GAEnBE,GAAeD,GCrGT,SAAUE,GAAQC,EAAkBC,EAAS,EAAC,CAElD,MAAO,CADMC,GAAO,OAAOF,EAAMC,CAAM,EACzBC,GAAO,OAAO,KAAK,CACnC,CAEM,SAAUC,GAAUC,EAAaC,EAAoBJ,EAAS,EAAC,CACnE,OAAAC,GAAO,OAAOE,EAAKC,EAAQJ,CAAM,EAC1BI,CACT,CAEM,SAAUC,GAAgBF,EAAW,CACzC,OAAOF,GAAO,eAAeE,CAAG,CAClC,CCPM,SAAUG,GAA8BC,EAAYC,EAAkB,CAC1E,IAAMC,EAAOD,EAAO,WACdE,EAAoBC,GAAeJ,CAAI,EACvCK,EAAeF,EAAoBC,GAAeF,CAAI,EAEtDI,EAAQ,IAAI,WAAWD,EAAeH,CAAI,EAChD,OAAOK,GAASP,EAAMM,EAAO,CAAC,EACvBC,GAASL,EAAMI,EAAOH,CAAU,EACvCG,EAAM,IAAIL,EAAQI,CAAY,EAEvB,IAAIG,GAAOR,EAAME,EAAMD,EAAQK,CAAK,CAC7C,CAKM,SAAUG,GAAQC,EAAqB,CAC3C,IAAMJ,EAAQK,GAAOD,CAAS,EACxB,CAACV,EAAMG,CAAU,EAAWM,GAAOH,CAAK,EACxC,CAACJ,EAAMG,CAAY,EAAWI,GAAOH,EAAM,SAASH,CAAU,CAAC,EAC/DF,EAASK,EAAM,SAASH,EAAaE,CAAY,EAEvD,GAAIJ,EAAO,aAAeC,EACxB,MAAM,IAAI,MAAM,kBAAkB,EAGpC,OAAO,IAAIM,GAAOR,EAAME,EAAMD,EAAQK,CAAK,CAC7C,CAEM,SAAUM,GAAQC,EAAoBC,EAAU,CACpD,GAAID,IAAMC,EACR,MAAO,GACF,CACL,IAAMC,EAAOD,EAEb,OACED,EAAE,OAASE,EAAK,MAChBF,EAAE,OAASE,EAAK,MAChBA,EAAK,iBAAiB,YACtBH,GAAWC,EAAE,MAAOE,EAAK,KAAK,CAElC,CACF,CAMM,IAAOP,GAAP,KAAa,CACR,KACA,KACA,OACA,MAKT,YAAaR,EAAYE,EAAYD,EAAoBK,EAAiB,CACxE,KAAK,KAAON,EACZ,KAAK,KAAOE,EACZ,KAAK,OAASc,GAAyBf,CAAM,EAC7C,KAAK,MAAQe,GAAyBV,CAAK,CAC7C,GHhEF,IAAMW,GAAY,EACZC,GAAO,WAEPC,GAAyDC,GAE/D,SAASC,GAAQC,EAAmBC,EAAuB,CACzD,GAAIA,GAAS,UAAY,MAAQA,EAAQ,WAAaD,EAAM,WAAY,CACtE,GAAIC,EAAQ,SAAW,GAAKA,EAAQ,SAAWD,EAAM,WACnD,MAAM,IAAI,MAAM,0DAA0DA,EAAM,UAAU,EAAE,EAG9FA,EAAQA,EAAM,SAAS,EAAGC,EAAQ,QAAQ,CAC5C,CAEA,OAAcC,GAAOP,GAAME,GAAOG,CAAK,CAAC,CAC1C,CAEO,IAAMG,GAAsC,CAAE,KAAAR,GAAM,KAAAC,GAAM,OAAAC,GAAQ,OAAAE,EAAM,EItB/E,IAAAK,GAAA,GAAAC,EAAAD,GAAA,YAAAE,GAAA,WAAAC,KCKA,IAAMC,GAA4B,GAqB5B,SAAUC,GAAiD,CAAE,KAAAC,EAAM,KAAAC,EAAM,OAAAC,EAAQ,gBAAAC,EAAiB,gBAAAC,CAAe,EAA0B,CAC/I,OAAO,IAAIC,GAAOL,EAAMC,EAAMC,EAAQC,EAAiBC,CAAe,CACxE,CAoBM,IAAOC,GAAP,KAAa,CACR,KACA,KACA,OACA,gBACA,gBAET,YAAaL,EAAYC,EAAYC,EAA+DC,EAA0BC,EAAwB,CACpJ,KAAK,KAAOJ,EACZ,KAAK,KAAOC,EACZ,KAAK,OAASC,EACd,KAAK,gBAAkBC,GAAmBL,GAC1C,KAAK,gBAAkBM,CACzB,CAEA,OAAQE,EAAmBC,EAAuB,CAChD,GAAIA,GAAS,UAAY,KAAM,CAC7B,GAAIA,EAAQ,SAAW,KAAK,gBAC1B,MAAM,IAAI,MAAM,6DAA6D,KAAK,eAAe,EAAE,EAGrG,GAAI,KAAK,iBAAmB,MAAQA,EAAQ,SAAW,KAAK,gBAC1D,MAAM,IAAI,MAAM,0DAA0D,KAAK,eAAe,EAAE,CAEpG,CAEA,GAAID,aAAiB,WAAY,CAC/B,IAAME,EAAS,KAAK,OAAOF,CAAK,EAEhC,OAAIE,aAAkB,WACbC,GAAaD,EAAQ,KAAK,KAAMD,GAAS,QAAQ,EAGnDC,EAAO,KAAKE,GAAUD,GAAaC,EAAQ,KAAK,KAAMH,GAAS,QAAQ,CAAC,CACjF,KACE,OAAM,MAAM,mCAAmC,CAGnD,GAOF,SAASE,GAAoCC,EAAoBT,EAAYU,EAAiB,CAC5F,GAAIA,GAAY,MAAQA,IAAaD,EAAO,WAAY,CACtD,GAAIC,EAAWD,EAAO,WACpB,MAAM,IAAI,MAAM,0DAA0DA,EAAO,UAAU,EAAE,EAG/FA,EAASA,EAAO,SAAS,EAAGC,CAAQ,CACtC,CAEA,OAAcC,GAAOX,EAAMS,CAAM,CACnC,CDrGA,SAASG,GAAKC,EAAyB,CACrC,MAAO,OAAMC,GAAQ,IAAI,WAAW,MAAM,OAAO,OAAO,OAAOD,EAAMC,CAAI,CAAC,CAC5E,CAEO,IAAMC,GAASC,GAAK,CACzB,KAAM,WACN,KAAM,GACN,OAAQJ,GAAI,SAAS,EACtB,EAEYK,GAASD,GAAK,CACzB,KAAM,WACN,KAAM,GACN,OAAQJ,GAAI,SAAS,EACtB,EELK,SAAUM,GAA0FC,EAASC,EAAmC,CACpJ,GAAM,CAAE,MAAAC,EAAO,QAAAC,CAAO,EAAKH,EAC3B,OAAQG,IACD,EACIC,GACLF,EACAG,GAAUL,CAAI,EACdC,GAAqCK,EAAU,OAAO,EAGjDC,GACLL,EACAG,GAAUL,CAAI,EACbC,GAAQO,EAAO,OAAwC,CAGhE,CAYA,IAAMC,GAAQ,IAAI,QAElB,SAASC,GAAWC,EAAoB,CACtC,IAAMD,EAAYD,GAAM,IAAIE,CAAG,EAC/B,GAAID,GAAa,KAAM,CACrB,IAAMA,EAAY,IAAI,IACtB,OAAAD,GAAM,IAAIE,EAAKD,CAAS,EACjBA,CACT,CACA,OAAOA,CACT,CAEM,IAAOE,EAAP,MAAOC,CAAG,CACL,KACA,QACA,UACA,MACA,IAOT,YAAaC,EAAkBC,EAAcC,EAAqCC,EAAiB,CACjG,KAAK,KAAOF,EACZ,KAAK,QAAUD,EACf,KAAK,UAAYE,EACjB,KAAK,MAAQE,GAAyBD,CAAK,EAI3C,KAAK,GAAG,EAAI,KAAK,KACnB,CAQA,IAAI,OAAK,CACP,OAAO,IACT,CAGA,IAAI,YAAU,CACZ,OAAO,KAAK,MAAM,UACpB,CAGA,IAAI,YAAU,CACZ,OAAO,KAAK,MAAM,UACpB,CAEA,MAAI,CACF,OAAQ,KAAK,QAAS,CACpB,IAAK,GACH,OAAO,KAET,IAAK,GAAG,CACN,GAAM,CAAE,KAAAF,EAAM,UAAAC,CAAS,EAAK,KAE5B,GAAID,IAASI,GACX,MAAM,IAAI,MAAM,0CAA0C,EAI5D,GAAIH,EAAU,OAASI,GACrB,MAAM,IAAI,MAAM,oDAAoD,EAGtE,OACEP,EAAI,SACFG,CAA6C,CAGnD,CACA,QACE,MAAM,MACJ,+BAA+B,KAAK,OAAO,4CAA4C,CAG7F,CACF,CAEA,MAAI,CACF,OAAQ,KAAK,QAAS,CACpB,IAAK,GAAG,CACN,GAAM,CAAE,KAAAD,EAAM,OAAAM,CAAM,EAAK,KAAK,UACxBL,EAAmBM,GAAOP,EAAMM,CAAM,EAC5C,OACER,EAAI,SAAS,KAAK,KAAMG,CAAS,CAErC,CACA,IAAK,GACH,OAAO,KAET,QACE,MAAM,MACJ,+BAA+B,KAAK,OAAO,4CAA4C,CAG7F,CACF,CAEA,OAAQO,EAAc,CACpB,OAAOV,EAAI,OAAO,KAAMU,CAAK,CAC/B,CAEA,OAAO,OAAsFC,EAA4CD,EAAc,CACrJ,IAAME,EAAUF,EAChB,OACEE,GAAW,MACXD,EAAK,OAASC,EAAQ,MACtBD,EAAK,UAAYC,EAAQ,SAClBC,GAAOF,EAAK,UAAWC,EAAQ,SAAS,CAEnD,CAEA,SAAUE,EAAmC,CAC3C,OAAOC,GAAO,KAAMD,CAAI,CAC1B,CAEA,QAAM,CACJ,MAAO,CAAE,IAAKC,GAAO,IAAI,CAAC,CAC5B,CAEA,MAAI,CACF,OAAO,IACT,CAES,CAAC,OAAO,WAAW,EAAI,MAIhC,CAAC,OAAO,IAAI,4BAA4B,CAAC,GAAC,CACxC,MAAO,OAAO,KAAK,SAAQ,CAAE,GAC/B,CAYA,OAAO,MAAwFC,EAA+C,CAC5I,GAAIA,GAAS,KACX,OAAO,KAGT,IAAMC,EAAQD,EACd,GAAIC,aAAiBjB,EAEnB,OAAOiB,EACF,GAAKA,EAAM,GAAG,GAAK,MAAQA,EAAM,GAAG,IAAMA,EAAM,OAAUA,EAAM,QAAUA,EAAO,CAMtF,GAAM,CAAE,QAAAhB,EAAS,KAAAC,EAAM,UAAAC,EAAW,MAAAC,CAAK,EAAKa,EAC5C,OAAO,IAAIjB,EACTC,EACAC,EACAC,EACAC,GAASc,GAAUjB,EAASC,EAAMC,EAAU,KAAK,CAAC,CAEtD,SAAWc,EAAME,EAAS,IAAM,GAAM,CAIpC,GAAM,CAAE,QAAAlB,EAAS,UAAAE,EAAW,KAAAD,CAAI,EAAKe,EAC/BT,EAAgBY,GAAOjB,CAAS,EACtC,OAAOH,EAAI,OAAOC,EAASC,EAAMM,CAAM,CACzC,KAGE,QAAO,IAEX,CAOA,OAAO,OAAsFP,EAAkBC,EAAcM,EAAgC,CAC3J,GAAI,OAAON,GAAS,SAClB,MAAM,IAAI,MAAM,uCAAuC,EAGzD,GAAI,EAAEM,EAAO,iBAAiB,YAC5B,MAAM,IAAI,MAAM,gBAAgB,EAGlC,OAAQP,EAAS,CACf,IAAK,GAAG,CACN,GAAIC,IAASI,GACX,MAAM,IAAI,MACR,wCAAwCA,EAAW,kBAAkB,EAGvE,OAAO,IAAIN,EAAIC,EAASC,EAAMM,EAAQA,EAAO,KAAK,CAEtD,CACA,IAAK,GAAG,CACN,IAAMJ,EAAQc,GAAUjB,EAASC,EAAMM,EAAO,KAAK,EACnD,OAAO,IAAIR,EAAIC,EAASC,EAAMM,EAAQJ,CAAK,CAC7C,CACA,QACE,MAAM,IAAI,MAAM,iBAAiB,CAErC,CACF,CAKA,OAAO,SAAuBI,EAAgD,CAC5E,OAAOR,EAAI,OAAO,EAAGM,GAAaE,CAAM,CAC1C,CAQA,OAAO,SAAyDN,EAAYM,EAAgC,CAC1G,OAAOR,EAAI,OAAO,EAAGE,EAAMM,CAAM,CACnC,CASA,OAAO,OAAoFJ,EAAuD,CAChJ,GAAM,CAACN,EAAKuB,CAAS,EAAIrB,EAAI,YAAYI,CAAK,EAC9C,GAAIiB,EAAU,SAAW,EACvB,MAAM,IAAI,MAAM,kBAAkB,EAEpC,OAAOvB,CACT,CAWA,OAAO,YAA2EM,EAAyC,CACzH,IAAMkB,EAAQtB,EAAI,aAAaI,CAAK,EAC9BmB,EAAaD,EAAM,KAAOA,EAAM,cAChCE,EAAiBC,GACrBrB,EAAM,SAASmB,EAAYA,EAAaD,EAAM,aAAa,CAAC,EAE9D,GAAIE,EAAe,aAAeF,EAAM,cACtC,MAAM,IAAI,MAAM,kBAAkB,EAEpC,IAAMI,EAAcF,EAAe,SACjCF,EAAM,cAAgBA,EAAM,UAAU,EAElCd,EAAS,IAAWmB,GACxBL,EAAM,cACNA,EAAM,WACNI,EACAF,CAAc,EAMhB,MAAO,CAHLF,EAAM,UAAY,EACdtB,EAAI,SAASQ,CAA0C,EACvDR,EAAI,SAASsB,EAAM,MAAOd,CAAM,EACNJ,EAAM,SAASkB,EAAM,IAAI,CAAC,CAC5D,CAWA,OAAO,aAA4EM,EAAgD,CACjI,IAAIC,EAAS,EACPC,EAAO,IAAa,CACxB,GAAM,CAACC,EAAGC,CAAM,EAAWZ,GAAOQ,EAAa,SAASC,CAAM,CAAC,EAC/D,OAAAA,GAAUG,EACHD,CACT,EAEI9B,EAAU6B,EAAI,EACdG,EAAQ3B,GASZ,GARIL,IAAsB,IAExBA,EAAU,EACV4B,EAAS,GAETI,EAAQH,EAAI,EAGV7B,IAAY,GAAKA,IAAY,EAC/B,MAAM,IAAI,WAAW,uBAAuBA,CAAO,EAAE,EAGvD,IAAMsB,EAAaM,EACbK,EAAgBJ,EAAI,EACpBK,EAAaL,EAAI,EACjBM,EAAOP,EAASM,EAChBE,EAAgBD,EAAOb,EAE7B,MAAO,CAAE,QAAAtB,EAAS,MAAAgC,EAAO,cAAAC,EAAe,WAAAC,EAAY,cAAAE,EAAe,KAAAD,CAAI,CACzE,CAQA,OAAO,MAA0GE,EAAkExB,EAAmC,CACpN,GAAM,CAACyB,EAAQnC,CAAK,EAAIoC,GAAgBF,EAAQxB,CAAI,EAE9ChB,EAAME,EAAI,OAAOI,CAAK,EAE5B,GAAIN,EAAI,UAAY,GAAKwC,EAAO,CAAC,IAAM,IACrC,MAAM,MAAM,wDAAwD,EAItE,OAAAzC,GAAUC,CAAG,EAAE,IAAIyC,EAAQD,CAAM,EAE1BxC,CACT,GAGF,SAAS0C,GAAqHF,EAAkExB,EAAmC,CACjO,OAAQwB,EAAO,CAAC,EAAG,CAEjB,IAAK,IAAK,CACR,IAAMG,EAAU3B,GAAQ4B,EACxB,MAAO,CACLA,EAAU,OACVD,EAAQ,OAAO,GAAGC,EAAU,MAAM,GAAGJ,CAAM,EAAE,EAEjD,CACA,KAAKI,EAAU,OAAQ,CACrB,IAAMD,EAAU3B,GAAQ4B,EACxB,MAAO,CAACA,EAAU,OAAkBD,EAAQ,OAAOH,CAAM,CAAC,CAC5D,CACA,KAAKK,EAAO,OAAQ,CAClB,IAAMF,EAAU3B,GAAQ6B,EACxB,MAAO,CAACA,EAAO,OAAkBF,EAAQ,OAAOH,CAAM,CAAC,CACzD,CACA,KAAKM,GAAO,OAAQ,CAClB,IAAMH,EAAU3B,GAAQ8B,GACxB,MAAO,CAACA,GAAO,OAAkBH,EAAQ,OAAOH,CAAM,CAAC,CACzD,CACA,QAAS,CACP,GAAIxB,GAAQ,KACV,MAAM,MACJ,yFAAyF,EAG7F,MAAO,CAACwB,EAAO,CAAC,EAAaxB,EAAK,OAAOwB,CAAM,CAAC,CAClD,CACF,CACF,CAEA,SAASO,GAAYzC,EAAmBR,EAA4BkB,EAA+B,CACjG,GAAM,CAAE,OAAAyB,CAAM,EAAKzB,EACnB,GAAIyB,IAAWG,EAAU,OACvB,MAAM,MAAM,8BAA8B5B,EAAK,IAAI,WAAW,EAGhE,IAAMhB,EAAMF,EAAM,IAAI2C,CAAM,EAC5B,GAAIzC,GAAO,KAAM,CACf,IAAMA,EAAMgB,EAAK,OAAOV,CAAK,EAAE,MAAM,CAAC,EACtC,OAAAR,EAAM,IAAI2C,EAAQzC,CAAG,EACdA,CACT,KACE,QAAOA,CAEX,CAEA,SAASgD,GAAoC1C,EAAmBR,EAA4BkB,EAAkC,CAC5H,GAAM,CAAE,OAAAyB,CAAM,EAAKzB,EACbhB,EAAMF,EAAM,IAAI2C,CAAM,EAC5B,GAAIzC,GAAO,KAAM,CACf,IAAMA,EAAMgB,EAAK,OAAOV,CAAK,EAC7B,OAAAR,EAAM,IAAI2C,EAAQzC,CAAG,EACdA,CACT,KACE,QAAOA,CAEX,CAEA,IAAMQ,GAAc,IACdC,GAAe,GAErB,SAASW,GAAWjB,EAAsBC,EAAcC,EAAqB,CAC3E,IAAM4C,EAAoBC,GAAe/C,CAAO,EAC1CgD,EAAaF,EAAoBC,GAAe9C,CAAI,EACpDE,EAAQ,IAAI,WAAW6C,EAAa9C,EAAU,UAAU,EAC9D,OAAO+C,GAASjD,EAASG,EAAO,CAAC,EAC1B8C,GAAShD,EAAME,EAAO2C,CAAU,EACvC3C,EAAM,IAAID,EAAW8C,CAAU,EACxB7C,CACT,CAEA,IAAMe,GAAY,OAAO,IAAI,kBAAkB,EC7bxC,IAAMgC,GAAQ,CAAE,GAAGC,GAAc,GAAGC,GAAO,GAAGC,GAAO,GAAGC,GAAQ,GAAGC,GAAQ,GAAGC,GAAQ,GAAGC,GAAQ,GAAGC,GAAQ,GAAGC,GAAQ,GAAGC,EAAY,EAChIC,GAAS,CAAE,GAAGC,GAAM,GAAGX,EAAQ,ECb5C,SAASY,GAAaC,EAAcC,EAAgBC,EAAqCC,EAAgD,CACvI,MAAO,CACL,KAAAH,EACA,OAAAC,EACA,QAAS,CACP,KAAAD,EACA,OAAAC,EACA,OAAAC,GAEF,QAAS,CACP,OAAAC,GAGN,CAEA,IAAMC,GAASL,GAAY,OAAQ,IAAMM,GAEhC,IADS,IAAI,YAAY,MAAM,EACjB,OAAOA,CAAG,EAC7BC,GACc,IAAI,YAAW,EAChB,OAAOA,EAAI,UAAU,CAAC,CAAC,CACvC,EAEKC,GAAQR,GAAY,QAAS,IAAMM,GAAO,CAC9C,IAAID,EAAS,IAEb,QAASI,EAAI,EAAGA,EAAIH,EAAI,OAAQG,IAC9BJ,GAAU,OAAO,aAAaC,EAAIG,CAAC,CAAC,EAEtC,OAAOJ,CACT,EAAIE,GAAO,CACTA,EAAMA,EAAI,UAAU,CAAC,EACrB,IAAMD,EAAMI,EAAYH,EAAI,MAAM,EAElC,QAASE,EAAI,EAAGA,EAAIF,EAAI,OAAQE,IAC9BH,EAAIG,CAAC,EAAIF,EAAI,WAAWE,CAAC,EAG3B,OAAOH,CACT,CAAC,EAIKK,GAAyD,CAC7D,KAAMN,GACN,QAASA,GACT,IAAKO,GAAM,OACX,OAAQJ,GACR,MAAAA,GACA,OAAQA,GAER,GAAGI,IAGLC,GAAeF,GC9CT,SAAUG,EAAYC,EAAgBC,EAA+B,OAAM,CAC/E,IAAMC,EAAOC,GAAMF,CAAQ,EAE3B,GAAIC,GAAQ,KACV,MAAM,IAAI,MAAM,yBAAyBD,CAAQ,GAAG,EAItD,OAAOC,EAAK,QAAQ,OAAO,GAAGA,EAAK,MAAM,GAAGF,CAAM,EAAE,CACtD,CCTM,SAAUI,EAAUC,EAAmBC,EAA+B,OAAM,CAChF,IAAMC,EAAOC,GAAMF,CAAQ,EAE3B,GAAIC,GAAQ,KACV,MAAM,IAAI,MAAM,yBAAyBD,CAAQ,GAAG,EAItD,OAAOC,EAAK,QAAQ,OAAOF,CAAK,EAAE,UAAU,CAAC,CAC/C,CCjBA,IAAMI,GAAW,IACXC,GAAW,IAAI,YAAW,EAAG,OAAOD,EAAQ,EAC5CE,GAAUD,GAAS,CAAC,EAkBbE,GAAP,MAAOC,CAAG,CACN,KAMR,YAAaC,EAAwBC,EAAe,CAClD,GAAI,OAAOD,GAAM,SACf,KAAK,KAAOE,EAAqBF,CAAC,UACzBA,aAAa,WACtB,KAAK,KAAOA,MAEZ,OAAM,IAAI,MAAM,6CAA6C,EAW/D,GARIC,GAAS,OACXA,EAAQ,IAGNA,GACF,KAAK,MAAK,EAGR,KAAK,KAAK,aAAe,GAAK,KAAK,KAAK,CAAC,IAAMJ,GACjD,MAAM,IAAI,MAAM,aAAa,CAEjC,CAQA,SAAUM,EAA+B,OAAM,CAC7C,OAAOC,EAAmB,KAAK,KAAMD,CAAQ,CAC/C,CAOA,YAAU,CACR,OAAO,KAAK,IACd,CAOA,IAAK,OAAO,WAAW,GAAC,CACtB,MAAO,OAAO,KAAK,SAAQ,CAAE,GAC/B,CAcA,OAAO,eAAgBE,EAAc,CACnC,OAAO,IAAIN,EAAIM,EAAK,KAAKV,EAAQ,CAAC,CACpC,CAaA,OAAO,QAAM,CACX,OAAO,IAAII,EAAI,KAAK,OAAM,EAAG,SAAQ,EAAG,UAAU,CAAC,CAAC,CACtD,CAKA,OAAO,MAAOO,EAAU,CACtB,OAAIA,aAAiB,YAAc,OAAOA,GAAU,SAE3C,IAAIP,EAAIO,CAAK,EAGlB,OAAOA,EAAM,YAAe,WAEvB,IAAIP,EAAIO,EAAM,WAAU,CAAE,EAG5B,IACT,CAOA,OAAK,CAKH,IAJI,KAAK,MAAQ,MAAQ,KAAK,KAAK,aAAe,KAChD,KAAK,KAAOV,IAGV,KAAK,KAAK,CAAC,IAAMC,GAAS,CAC5B,IAAMU,EAAQ,IAAI,WAAW,KAAK,KAAK,WAAa,CAAC,EACrDA,EAAM,KAAKV,GAAS,EAAG,CAAC,EACxBU,EAAM,IAAI,KAAK,KAAM,CAAC,EACtB,KAAK,KAAOA,CACd,CAGA,KAAO,KAAK,KAAK,WAAa,GAAK,KAAK,KAAK,KAAK,KAAK,WAAa,CAAC,IAAMV,IACzE,KAAK,KAAO,KAAK,KAAK,SAAS,EAAG,EAAE,CAExC,CAQA,KAAMW,EAAQ,CACZ,IAAMC,EAAQ,KAAK,KAAI,EACjBC,EAAQF,EAAI,KAAI,EAEtB,QAASG,EAAI,EAAGA,EAAIF,EAAM,OAAQE,IAAK,CACrC,GAAID,EAAM,OAASC,EAAI,EACrB,MAAO,GAGT,IAAMC,EAAKH,EAAME,CAAC,EACZE,EAAKH,EAAMC,CAAC,EAElB,GAAIC,EAAKC,EACP,MAAO,GACF,GAAID,EAAKC,EACd,MAAO,EAEX,CAEA,OAAOJ,EAAM,OAASC,EAAM,MAC9B,CAaA,SAAO,CACL,OAAOX,EAAI,eAAe,KAAK,KAAI,EAAG,MAAK,EAAG,QAAO,CAAE,CACzD,CAOA,YAAU,CACR,OAAO,KAAK,KAAI,CAClB,CAaA,eAAa,CACX,IAAMe,EAAK,KAAK,WAAU,EAC1B,OAAOA,EAAGA,EAAG,OAAS,CAAC,CACzB,CAaA,MAAI,CACF,OAAO,KAAK,SAAQ,EAAG,MAAMnB,EAAQ,EAAE,MAAM,CAAC,CAChD,CAaA,MAAI,CACF,OAAOoB,GAAc,KAAK,cAAa,CAAE,CAC3C,CAaA,MAAI,CACF,OAAOC,GAAe,KAAK,cAAa,CAAE,CAC5C,CAcA,SAAUhB,EAAS,CACjB,OAAO,IAAID,EAAI,KAAK,SAAQ,EAAK,IAAMC,CAAC,CAC1C,CAaA,MAAI,CACF,IAAIiB,EAAI,KAAK,OAAM,EAAG,SAAQ,EAC9B,OAAKA,EAAE,SAAStB,EAAQ,IACtBsB,GAAKtB,IAEPsB,GAAK,KAAK,KAAI,EACP,IAAIlB,EAAIkB,CAAC,CAClB,CAaA,QAAM,CACJ,IAAMZ,EAAO,KAAK,KAAI,EACtB,OAAIA,EAAK,SAAW,EACX,IAAIN,EAAIJ,EAAQ,EAGlB,IAAII,EAAIM,EAAK,MAAM,EAAG,EAAE,EAAE,KAAKV,EAAQ,CAAC,CACjD,CAcA,MAAOa,EAAQ,CACb,OAAI,KAAK,SAAQ,IAAOb,GACfa,EACEA,EAAI,SAAQ,IAAOb,GACrB,KAGF,IAAII,EAAI,KAAK,SAAQ,EAAKS,EAAI,SAAQ,EAAI,EAAK,CACxD,CAcA,aAAcF,EAAU,CACtB,OAAIA,EAAM,SAAQ,IAAO,KAAK,SAAQ,EAC7B,GAGFA,EAAM,SAAQ,EAAG,WAAW,KAAK,SAAQ,CAAE,CACpD,CAcA,cAAeA,EAAU,CACvB,OAAIA,EAAM,SAAQ,IAAO,KAAK,SAAQ,EAC7B,GAGF,KAAK,SAAQ,EAAG,WAAWA,EAAM,SAAQ,CAAE,CACpD,CAOA,YAAU,CACR,OAAO,KAAK,KAAI,EAAG,SAAW,CAChC,CAQA,UAAWY,EAAW,CACpB,OAAOnB,EAAI,eAAe,CAAC,GAAG,KAAK,WAAU,EAAI,GAAGoB,GAAQD,EAAK,IAAIV,GAAOA,EAAI,WAAU,CAAE,CAAC,CAAC,CAAC,CACjG,GASF,SAASO,GAAeD,EAAU,CAChC,IAAMM,EAAQN,EAAG,MAAM,GAAG,EAC1B,OAAIM,EAAM,OAAS,EACV,GAEFA,EAAM,MAAM,EAAG,EAAE,EAAE,KAAK,GAAG,CACpC,CAQA,SAASJ,GAAgBF,EAAU,CACjC,IAAMM,EAAQN,EAAG,MAAM,GAAG,EAC1B,OAAOM,EAAMA,EAAM,OAAS,CAAC,CAC/B,CASA,SAASD,GAASE,EAAU,CAC1B,MAAQ,CAAA,EAAI,OAAO,GAAGA,CAAG,CAC3B,CCrbA,SAASC,GAA4BC,EAAc,CACjD,OAAOA,GAAG,kBAAkB,WAC9B,CAMM,SAAUC,GAAcC,EAAe,CAC3C,GAAIH,GAA2BG,CAAG,EAChC,OAAOA,EAGT,IAAMF,EAAIE,EAAI,MAAK,EAEnB,OAAO,IAAI,WAAWF,EAAE,OAAQ,EAAGA,EAAE,UAAU,CACjD,CCVM,SAAUG,GAAQC,EAAsBC,EAAe,CACvDA,GAAU,OACZA,EAASD,EAAO,OAAO,CAACE,EAAKC,IAASD,EAAMC,EAAK,OAAQ,CAAC,GAG5D,IAAMC,EAASC,EAAYJ,CAAM,EAC7BK,EAAS,EAEb,QAAWC,KAAOP,EAChBI,EAAO,IAAIG,EAAKD,CAAM,EACtBA,GAAUC,EAAI,OAGhB,OAAOC,GAAaJ,CAAM,CAC5B,CCjBM,SAAUK,GAAQC,EAAeC,EAAa,CAClD,GAAID,IAAMC,EACR,MAAO,GAGT,GAAID,EAAE,aAAeC,EAAE,WACrB,MAAO,GAGT,QAASC,EAAI,EAAGA,EAAIF,EAAE,WAAYE,IAChC,GAAIF,EAAEE,CAAC,IAAMD,EAAEC,CAAC,EACd,MAAO,GAIX,MAAO,EACT,CCmEA,IAAMC,GAAS,OAAO,IAAI,6BAA6B,EAIvD,SAASC,GAAkBC,EAAoBC,EAAa,CAC1D,GAAIA,GAAS,MAAQA,EAAQ,EAC3B,MAAM,IAAI,WAAW,wBAAwB,EAG/C,IAAIC,EAAS,EAEb,QAAWC,KAAOH,EAAM,CACtB,IAAMI,EAASF,EAASC,EAAI,WAE5B,GAAIF,EAAQG,EACV,MAAO,CACL,IAAAD,EACA,MAAOF,EAAQC,GAInBA,EAASE,CACX,CAEA,MAAM,IAAI,WAAW,wBAAwB,CAC/C,CAeM,SAAUC,GAAkBC,EAAU,CAC1C,MAAO,EAAQA,IAAQR,EAAM,CAC/B,CAEM,IAAOS,GAAP,MAAOC,CAAc,CACjB,KACD,OACS,CAACV,EAAM,EAAI,GAE3B,eAAgBW,EAAqB,CACnC,KAAK,KAAO,CAAA,EACZ,KAAK,OAAS,EAEVA,EAAK,OAAS,GAChB,KAAK,UAAUA,CAAI,CAEvB,CAEA,EAAG,OAAO,QAAQ,GAAC,CACjB,MAAQ,KAAK,IACf,CAEA,IAAI,YAAU,CACZ,OAAO,KAAK,MACd,CAKA,UAAWT,EAAqB,CAC9B,KAAK,UAAUA,CAAI,CACrB,CAKA,UAAWA,EAAqB,CAC9B,IAAIU,EAAS,EAEb,QAAWP,KAAOH,EAChB,GAAIG,aAAe,WACjBO,GAAUP,EAAI,WACd,KAAK,KAAK,KAAKA,CAAG,UACTE,GAAiBF,CAAG,EAAG,CAChCO,GAAUP,EAAI,WACd,QAAWQ,KAASR,EAAI,KACtB,KAAK,KAAK,KAAKQ,CAAK,CAExB,KACE,OAAM,IAAI,MAAM,mEAAmE,EAIvF,KAAK,QAAUD,CACjB,CAKA,WAAYV,EAAqB,CAC/B,KAAK,WAAWA,CAAI,CACtB,CAKA,WAAYA,EAAqB,CAC/B,IAAIU,EAAS,EAEb,QAAWP,KAAOH,EAAK,QAAO,EAC5B,GAAIG,aAAe,WACjBO,GAAUP,EAAI,WACd,KAAK,KAAK,QAAQA,CAAG,UACZE,GAAiBF,CAAG,EAC7BO,GAAUP,EAAI,WACd,KAAK,KAAK,QAAQ,GAAGA,EAAI,IAAI,MAE7B,OAAM,IAAI,MAAM,oEAAoE,EAIxF,KAAK,QAAUO,CACjB,CAKA,IAAKT,EAAa,CAChB,IAAMW,EAAMb,GAAiB,KAAK,KAAME,CAAK,EAE7C,OAAOW,EAAI,IAAIA,EAAI,KAAK,CAC1B,CAKA,IAAKX,EAAeK,EAAa,CAC/B,IAAMM,EAAMb,GAAiB,KAAK,KAAME,CAAK,EAE7CW,EAAI,IAAIA,EAAI,KAAK,EAAIN,CACvB,CAKA,MAAOH,EAAkCD,EAAiB,EAAC,CACzD,GAAIC,aAAe,WACjB,QAASU,EAAI,EAAGA,EAAIV,EAAI,OAAQU,IAC9B,KAAK,IAAIX,EAASW,EAAGV,EAAIU,CAAC,CAAC,UAEpBR,GAAiBF,CAAG,EAC7B,QAASU,EAAI,EAAGA,EAAIV,EAAI,OAAQU,IAC9B,KAAK,IAAIX,EAASW,EAAGV,EAAI,IAAIU,CAAC,CAAC,MAGjC,OAAM,IAAI,MAAM,kEAAkE,CAEtF,CAKA,QAASC,EAAa,CAKpB,GAHAA,EAAQ,KAAK,MAAMA,CAAK,EAGpB,SAAO,MAAMA,CAAK,GAAKA,GAAS,GAKpC,IAAIA,IAAU,KAAK,WAAY,CAC7B,KAAK,KAAO,CAAA,EACZ,KAAK,OAAS,EACd,MACF,CAEA,KAAO,KAAK,KAAK,OAAS,GACxB,GAAIA,GAAS,KAAK,KAAK,CAAC,EAAE,WACxBA,GAAS,KAAK,KAAK,CAAC,EAAE,WACtB,KAAK,QAAU,KAAK,KAAK,CAAC,EAAE,WAC5B,KAAK,KAAK,MAAK,MACV,CACL,KAAK,KAAK,CAAC,EAAI,KAAK,KAAK,CAAC,EAAE,SAASA,CAAK,EAC1C,KAAK,QAAUA,EACf,KACF,EAEJ,CAQA,MAAOC,EAAyBC,EAAqB,CACnD,GAAM,CAAE,KAAAhB,EAAM,OAAAU,CAAM,EAAK,KAAK,SAASK,EAAgBC,CAAY,EAEnE,OAAOC,GAAOjB,EAAMU,CAAM,CAC5B,CAQA,SAAUK,EAAyBC,EAAqB,CACtD,GAAM,CAAE,KAAAhB,EAAM,OAAAU,CAAM,EAAK,KAAK,SAASK,EAAgBC,CAAY,EAEnE,OAAIhB,EAAK,SAAW,EACXA,EAAK,CAAC,EAGRiB,GAAOjB,EAAMU,CAAM,CAC5B,CAOA,QAASK,EAAyBC,EAAqB,CACrD,GAAM,CAAE,KAAAhB,EAAM,OAAAU,CAAM,EAAK,KAAK,SAASK,EAAgBC,CAAY,EAE7DE,EAAO,IAAIV,EACjB,OAAAU,EAAK,OAASR,EAEdQ,EAAK,KAAOlB,EAELkB,CACT,CAEQ,SAAUH,EAAyBC,EAAqB,CAY9D,GAXAD,EAAiBA,GAAkB,EACnCC,EAAeA,GAAgB,KAAK,OAEhCD,EAAiB,IACnBA,EAAiB,KAAK,OAASA,GAG7BC,EAAe,IACjBA,EAAe,KAAK,OAASA,GAG3BD,EAAiB,GAAKC,EAAe,KAAK,OAC5C,MAAM,IAAI,WAAW,wBAAwB,EAG/C,GAAID,IAAmBC,EACrB,MAAO,CAAE,KAAM,CAAA,EAAI,OAAQ,CAAC,EAG9B,GAAID,IAAmB,GAAKC,IAAiB,KAAK,OAChD,MAAO,CAAE,KAAM,CAAC,GAAG,KAAK,IAAI,EAAG,OAAQ,KAAK,MAAM,EAGpD,IAAMhB,EAAwB,CAAA,EAC1BE,EAAS,EAEb,QAASW,EAAI,EAAGA,EAAI,KAAK,KAAK,OAAQA,IAAK,CACzC,IAAMV,EAAM,KAAK,KAAKU,CAAC,EACjBM,EAAWjB,EACXE,EAASe,EAAWhB,EAAI,WAK9B,GAFAD,EAASE,EAELW,GAAkBX,EAEpB,SAGF,IAAMgB,EAAkBL,GAAkBI,GAAYJ,EAAiBX,EACjEiB,EAAiBL,EAAeG,GAAYH,GAAgBZ,EAElE,GAAIgB,GAAmBC,EAAgB,CAErC,GAAIN,IAAmBI,GAAYH,IAAiBZ,EAAQ,CAE1DJ,EAAK,KAAKG,CAAG,EACb,KACF,CAGA,IAAMmB,EAAQP,EAAiBI,EAC/BnB,EAAK,KAAKG,EAAI,SAASmB,EAAOA,GAASN,EAAeD,EAAe,CAAC,EACtE,KACF,CAEA,GAAIK,EAAiB,CAEnB,GAAIL,IAAmB,EAAG,CAExBf,EAAK,KAAKG,CAAG,EACb,QACF,CAGAH,EAAK,KAAKG,EAAI,SAASY,EAAiBI,CAAQ,CAAC,EACjD,QACF,CAEA,GAAIE,EAAgB,CAClB,GAAIL,IAAiBZ,EAAQ,CAE3BJ,EAAK,KAAKG,CAAG,EACb,KACF,CAGAH,EAAK,KAAKG,EAAI,SAAS,EAAGa,EAAeG,CAAQ,CAAC,EAClD,KACF,CAGAnB,EAAK,KAAKG,CAAG,CACf,CAEA,MAAO,CAAE,KAAAH,EAAM,OAAQgB,EAAeD,CAAc,CACtD,CAEA,QAASQ,EAAqCrB,EAAiB,EAAC,CAC9D,GAAI,CAACG,GAAiBkB,CAAM,GAAK,EAAEA,aAAkB,YACnD,MAAM,IAAI,UAAU,6DAA6D,EAGnF,IAAMC,EAASD,aAAkB,WAAaA,EAASA,EAAO,SAAQ,EAgBtE,GAdArB,EAAS,OAAOA,GAAU,CAAC,EAEvB,MAAMA,CAAM,IACdA,EAAS,GAGPA,EAAS,IACXA,EAAS,KAAK,OAASA,GAGrBA,EAAS,IACXA,EAAS,GAGPqB,EAAO,SAAW,EACpB,OAAOrB,EAAS,KAAK,OAAS,KAAK,OAASA,EAI9C,IAAMuB,EAAYD,EAAO,WAEzB,GAAIC,IAAM,EACR,MAAM,IAAI,UAAU,qCAAqC,EAI3D,IAAMC,EAAgB,IAChBC,EAAiC,IAAI,WAAWD,CAAK,EAG3D,QAASE,EAAY,EAAGA,EAAIF,EAAOE,IAEjCD,EAAmBC,CAAC,EAAI,GAG1B,QAASC,EAAI,EAAGA,EAAIJ,EAAGI,IAErBF,EAAmBH,EAAOK,CAAC,CAAC,EAAIA,EAIlC,IAAMC,EAAQH,EACRI,EAAY,KAAK,WAAaP,EAAO,WACrCQ,EAAeR,EAAO,WAAa,EACrCS,EAEJ,QAASpB,EAAIX,EAAQW,GAAKkB,EAAWlB,GAAKoB,EAAM,CAC9CA,EAAO,EAEP,QAASJ,EAAIG,EAAcH,GAAK,EAAGA,IAAK,CACtC,IAAMK,EAAe,KAAK,IAAIrB,EAAIgB,CAAC,EAEnC,GAAIL,EAAOK,CAAC,IAAMK,EAAM,CACtBD,EAAO,KAAK,IAAI,EAAGJ,EAAIC,EAAMI,CAAI,CAAC,EAClC,KACF,CACF,CAEA,GAAID,IAAS,EACX,OAAOpB,CAEX,CAEA,MAAO,EACT,CAEA,QAASsB,EAAkB,CACzB,IAAMhC,EAAM,KAAK,SAASgC,EAAYA,EAAa,CAAC,EAGpD,OAFa,IAAI,SAAShC,EAAI,OAAQA,EAAI,WAAYA,EAAI,UAAU,EAExD,QAAQ,CAAC,CACvB,CAEA,QAASgC,EAAoB7B,EAAa,CACxC,IAAMH,EAAMiC,EAAY,CAAC,EACZ,IAAI,SAASjC,EAAI,OAAQA,EAAI,WAAYA,EAAI,UAAU,EAC/D,QAAQ,EAAGG,CAAK,EAErB,KAAK,MAAMH,EAAKgC,CAAU,CAC5B,CAEA,SAAUA,EAAoBE,EAAsB,CAClD,IAAMlC,EAAM,KAAK,SAASgC,EAAYA,EAAa,CAAC,EAGpD,OAFa,IAAI,SAAShC,EAAI,OAAQA,EAAI,WAAYA,EAAI,UAAU,EAExD,SAAS,EAAGkC,CAAY,CACtC,CAEA,SAAUF,EAAoB7B,EAAe+B,EAAsB,CACjE,IAAMlC,EAAMmC,EAAM,CAAC,EACN,IAAI,SAASnC,EAAI,OAAQA,EAAI,WAAYA,EAAI,UAAU,EAC/D,SAAS,EAAGG,EAAO+B,CAAY,EAEpC,KAAK,MAAMlC,EAAKgC,CAAU,CAC5B,CAEA,SAAUA,EAAoBE,EAAsB,CAClD,IAAMlC,EAAM,KAAK,SAASgC,EAAYA,EAAa,CAAC,EAGpD,OAFa,IAAI,SAAShC,EAAI,OAAQA,EAAI,WAAYA,EAAI,UAAU,EAExD,SAAS,EAAGkC,CAAY,CACtC,CAEA,SAAUF,EAAoB7B,EAAe+B,EAAsB,CACjE,IAAMlC,EAAMmC,EAAM,CAAC,EACN,IAAI,SAASnC,EAAI,OAAQA,EAAI,WAAYA,EAAI,UAAU,EAC/D,SAAS,EAAGG,EAAO+B,CAAY,EAEpC,KAAK,MAAMlC,EAAKgC,CAAU,CAC5B,CAEA,YAAaA,EAAoBE,EAAsB,CACrD,IAAMlC,EAAM,KAAK,SAASgC,EAAYA,EAAa,CAAC,EAGpD,OAFa,IAAI,SAAShC,EAAI,OAAQA,EAAI,WAAYA,EAAI,UAAU,EAExD,YAAY,EAAGkC,CAAY,CACzC,CAEA,YAAaF,EAAoB7B,EAAe+B,EAAsB,CACpE,IAAMlC,EAAMmC,EAAM,CAAC,EACN,IAAI,SAASnC,EAAI,OAAQA,EAAI,WAAYA,EAAI,UAAU,EAC/D,YAAY,EAAGG,EAAO+B,CAAY,EAEvC,KAAK,MAAMlC,EAAKgC,CAAU,CAC5B,CAEA,SAAUA,EAAkB,CAC1B,IAAMhC,EAAM,KAAK,SAASgC,EAAYA,EAAa,CAAC,EAGpD,OAFa,IAAI,SAAShC,EAAI,OAAQA,EAAI,WAAYA,EAAI,UAAU,EAExD,SAAS,CAAC,CACxB,CAEA,SAAUgC,EAAoB7B,EAAa,CACzC,IAAMH,EAAMiC,EAAY,CAAC,EACZ,IAAI,SAASjC,EAAI,OAAQA,EAAI,WAAYA,EAAI,UAAU,EAC/D,SAAS,EAAGG,CAAK,EAEtB,KAAK,MAAMH,EAAKgC,CAAU,CAC5B,CAEA,UAAWA,EAAoBE,EAAsB,CACnD,IAAMlC,EAAM,KAAK,SAASgC,EAAYA,EAAa,CAAC,EAGpD,OAFa,IAAI,SAAShC,EAAI,OAAQA,EAAI,WAAYA,EAAI,UAAU,EAExD,UAAU,EAAGkC,CAAY,CACvC,CAEA,UAAWF,EAAoB7B,EAAe+B,EAAsB,CAClE,IAAMlC,EAAMmC,EAAM,CAAC,EACN,IAAI,SAASnC,EAAI,OAAQA,EAAI,WAAYA,EAAI,UAAU,EAC/D,UAAU,EAAGG,EAAO+B,CAAY,EAErC,KAAK,MAAMlC,EAAKgC,CAAU,CAC5B,CAEA,UAAWA,EAAoBE,EAAsB,CACnD,IAAMlC,EAAM,KAAK,SAASgC,EAAYA,EAAa,CAAC,EAGpD,OAFa,IAAI,SAAShC,EAAI,OAAQA,EAAI,WAAYA,EAAI,UAAU,EAExD,UAAU,EAAGkC,CAAY,CACvC,CAEA,UAAWF,EAAoB7B,EAAe+B,EAAsB,CAClE,IAAMlC,EAAMmC,EAAM,CAAC,EACN,IAAI,SAASnC,EAAI,OAAQA,EAAI,WAAYA,EAAI,UAAU,EAC/D,UAAU,EAAGG,EAAO+B,CAAY,EAErC,KAAK,MAAMlC,EAAKgC,CAAU,CAC5B,CAEA,aAAcA,EAAoBE,EAAsB,CACtD,IAAMlC,EAAM,KAAK,SAASgC,EAAYA,EAAa,CAAC,EAGpD,OAFa,IAAI,SAAShC,EAAI,OAAQA,EAAI,WAAYA,EAAI,UAAU,EAExD,aAAa,EAAGkC,CAAY,CAC1C,CAEA,aAAcF,EAAoB7B,EAAe+B,EAAsB,CACrE,IAAMlC,EAAMmC,EAAM,CAAC,EACN,IAAI,SAASnC,EAAI,OAAQA,EAAI,WAAYA,EAAI,UAAU,EAC/D,aAAa,EAAGG,EAAO+B,CAAY,EAExC,KAAK,MAAMlC,EAAKgC,CAAU,CAC5B,CAEA,WAAYA,EAAoBE,EAAsB,CACpD,IAAMlC,EAAM,KAAK,SAASgC,EAAYA,EAAa,CAAC,EAGpD,OAFa,IAAI,SAAShC,EAAI,OAAQA,EAAI,WAAYA,EAAI,UAAU,EAExD,WAAW,EAAGkC,CAAY,CACxC,CAEA,WAAYF,EAAoB7B,EAAe+B,EAAsB,CACnE,IAAMlC,EAAMmC,EAAM,CAAC,EACN,IAAI,SAASnC,EAAI,OAAQA,EAAI,WAAYA,EAAI,UAAU,EAC/D,WAAW,EAAGG,EAAO+B,CAAY,EAEtC,KAAK,MAAMlC,EAAKgC,CAAU,CAC5B,CAEA,WAAYA,EAAoBE,EAAsB,CACpD,IAAMlC,EAAM,KAAK,SAASgC,EAAYA,EAAa,CAAC,EAGpD,OAFa,IAAI,SAAShC,EAAI,OAAQA,EAAI,WAAYA,EAAI,UAAU,EAExD,WAAW,EAAGkC,CAAY,CACxC,CAEA,WAAYF,EAAoB7B,EAAe+B,EAAsB,CACnE,IAAMlC,EAAMmC,EAAM,CAAC,EACN,IAAI,SAASnC,EAAI,OAAQA,EAAI,WAAYA,EAAI,UAAU,EAC/D,WAAW,EAAGG,EAAO+B,CAAY,EAEtC,KAAK,MAAMlC,EAAKgC,CAAU,CAC5B,CAEA,OAAQI,EAAU,CAShB,GARIA,GAAS,MAIT,EAAEA,aAAiB/B,IAInB+B,EAAM,KAAK,SAAW,KAAK,KAAK,OAClC,MAAO,GAGT,QAAS1B,EAAI,EAAGA,EAAI,KAAK,KAAK,OAAQA,IACpC,GAAI,CAAC2B,GAAO,KAAK,KAAK3B,CAAC,EAAG0B,EAAM,KAAK1B,CAAC,CAAC,EACrC,MAAO,GAIX,MAAO,EACT,CAMA,OAAO,gBAA6Cb,EAAuBU,EAAe,CACxF,IAAMQ,EAAO,IAAIV,EACjB,OAAAU,EAAK,KAAOlB,EAERU,GAAU,OACZA,EAASV,EAAK,OAAO,CAACyC,EAAKC,IAASD,EAAMC,EAAK,WAAY,CAAC,GAG9DxB,EAAK,OAASR,EAEPQ,CACT,GCzpBI,IAAOyB,EAAP,cAA0B,KAAK,CACnC,OAAO,KAAO,aAEd,YAAaC,EAAkB,4BAA2B,CACxD,MAAMA,CAAO,EACb,KAAK,KAAO,YACd,GA8BI,IAAOC,GAAP,cAAsC,KAAK,CAC/C,OAAO,KAAO,yBAEd,YAAaC,EAAU,qBAAoB,CACzC,MAAMA,CAAO,EACb,KAAK,KAAO,wBACd,GC2CF,SAASC,GAA2BC,EAAS,CAC3C,OAAO,OAAOA,GAAK,aAAgB,UACrC,CAEA,SAASC,GAAQC,EAA2C,CAC1D,OAAQA,IAAY,IAAQA,IAAY,IAASA,GAAS,OAAS,EACrE,CAKM,IAAOC,GAAP,cAAuE,WAAW,CAC7EC,GAAa,IAAI,IAE1B,aAAA,CACE,MAAK,CAKP,CAEA,cAAeC,EAAY,CACzB,IAAMC,EAAY,KAAKF,GAAW,IAAIC,CAAI,EAE1C,OAAIC,GAAa,KACR,EAGFA,EAAU,MACnB,CAGA,iBAAkBD,EAAcE,EAA+BL,EAA2C,CACxG,IAAMM,EAAOP,GAAOC,CAAO,EAE3B,MAAM,iBAAiBG,EAAOI,GAAO,CACnC,GAAID,EAAM,CACR,IAAIE,EAAO,KAAKN,GAAW,IAAIK,EAAI,IAAI,EAEnCC,GAAQ,OACVA,EAAOA,EAAK,OAAO,CAAC,CAAE,SAAAC,CAAQ,IAAOA,IAAaJ,CAAQ,EAC1D,KAAKH,GAAW,IAAIK,EAAI,KAAMC,CAAI,EAEtC,CAEIX,GAAqBQ,CAAQ,EAC/BA,EAAS,YAAYE,CAAG,EAExBF,EAASE,CAAG,CAEhB,EAAGP,CAAO,EAEV,IAAIQ,EAAO,KAAKN,GAAW,IAAIC,CAAI,EAE/BK,GAAQ,OACVA,EAAO,CAAA,EACP,KAAKN,GAAW,IAAIC,EAAMK,CAAI,GAGhCA,EAAK,KAAK,CACR,SAAUH,EACV,KAAAC,EACD,CACH,CAGA,oBAAqBH,EAAcE,EAAgCL,EAAwC,CACzG,MAAM,oBAAoBG,EAAK,SAAQ,EAAIE,GAAY,KAAML,CAAO,EAEpE,IAAIQ,EAAO,KAAKN,GAAW,IAAIC,CAAI,EAE/BK,GAAQ,OAIZA,EAAOA,EAAK,OAAO,CAAC,CAAE,SAAAC,CAAQ,IAAOA,IAAaJ,CAAQ,EAC1D,KAAKH,GAAW,IAAIC,EAAMK,CAAI,EAChC,CAEA,kBAA0BL,EAAsBO,EAAkC,CAAA,EAAE,CAClF,OAAO,KAAK,cAAc,IAAI,YAAoBP,EAAgBO,CAAM,CAAC,CAC3E,GCjJI,IAAOC,EAAP,cAAwE,KAAK,CAC1E,KACA,OAEP,YAAaC,EAASC,EAAU,CAC9B,MAAMD,CAAI,EAEV,KAAK,KAAOA,EAEZ,KAAK,OAASC,CAChB,GCrCK,IAAMC,GAAN,MAAMC,UAAqB,KAAM,CACvC,KAAO,eAEP,YAAYC,EAASC,EAAS,CAC7B,MAAMD,EAASC,CAAO,EACtB,MAAM,oBAAoB,KAAMF,CAAY,CAC7C,CACD,EAEMG,GAAmBC,GAAUA,EAAO,QAAU,IAAI,aAAa,8BAA+B,YAAY,EAEjG,SAARC,GAA0BC,EAASJ,EAAS,CAClD,GAAM,CACL,aAAAK,EACA,SAAAC,EACA,QAAAP,EACA,aAAAQ,EAAe,CAAC,WAAY,YAAY,EACxC,OAAAL,CACD,EAAIF,EAEAQ,EACAC,EA2DEC,EAzDiB,IAAI,QAAQ,CAACC,EAASC,IAAW,CACvD,GAAI,OAAOP,GAAiB,UAAY,KAAK,KAAKA,CAAY,IAAM,EACnE,MAAM,IAAI,UAAU,4DAA4DA,CAAY,IAAI,EAGjG,GAAIH,GAAQ,QAAS,CACpBU,EAAOX,GAAiBC,CAAM,CAAC,EAC/B,MACD,CAcA,GAZIA,IACHO,EAAe,IAAM,CACpBG,EAAOX,GAAiBC,CAAM,CAAC,CAChC,EAEAA,EAAO,iBAAiB,QAASO,EAAc,CAAC,KAAM,EAAI,CAAC,GAK5DL,EAAQ,KAAKO,EAASC,CAAM,EAExBP,IAAiB,OAAO,kBAC3B,OAID,IAAMQ,EAAe,IAAIhB,GAGzBW,EAAQD,EAAa,WAAW,KAAK,OAAW,IAAM,CACrD,GAAID,EAAU,CACb,GAAI,CACHK,EAAQL,EAAS,CAAC,CACnB,OAASQ,EAAO,CACfF,EAAOE,CAAK,CACb,CAEA,MACD,CAEI,OAAOV,EAAQ,QAAW,YAC7BA,EAAQ,OAAO,EAGZL,IAAY,GACfY,EAAQ,EACEZ,aAAmB,MAC7Ba,EAAOb,CAAO,GAEdc,EAAa,QAAUd,GAAW,2BAA2BM,CAAY,gBACzEO,EAAOC,CAAY,EAErB,EAAGR,CAAY,CAChB,CAAC,EAGwC,QAAQ,IAAM,CACtDK,EAAkB,MAAM,EACpBD,GAAgBP,GACnBA,EAAO,oBAAoB,QAASO,CAAY,CAElD,CAAC,EAED,OAAAC,EAAkB,MAAQ,IAAM,CAE/BH,EAAa,aAAa,KAAK,OAAWC,CAAK,EAC/CA,EAAQ,MACT,EAEOE,CACR,CC9FA,IAAAK,GAAoB,WC4FpB,IAAYC,IAAZ,SAAYA,EAAU,CACpBA,EAAAA,EAAA,EAAA,CAAA,EAAA,IACAA,EAAAA,EAAA,MAAA,CAAA,EAAA,QACAA,EAAAA,EAAA,IAAA,EAAA,EAAA,MACAA,EAAAA,EAAA,KAAA,EAAA,EAAA,MACF,GALYA,KAAAA,GAAU,CAAA,EAAA,ECpFtB,SAASC,GAAGC,EAAOC,EAAS,CAC3B,GAAI,OAAOD,GAAU,SAAU,OAAOE,GAAMF,CAAK,EAC5C,GAAI,OAAOA,GAAU,SAAU,OAAOG,GAAOH,EAAOC,CAAO,EAChE,MAAM,IAAI,MAAM,4DAA4D,KAAK,UAAUD,CAAK,CAAC,EAAE,CACpG,CAQA,SAASE,GAAME,EAAK,CACnB,GAAI,OAAOA,GAAQ,UAAYA,EAAI,SAAW,GAAKA,EAAI,OAAS,IAAK,MAAM,IAAI,MAAM,qFAAqF,KAAK,UAAUA,CAAG,CAAC,EAAE,EAC/L,IAAMC,EAAQ,wJAAwJ,KAAKD,CAAG,EAC9K,GAAI,CAACC,GAAO,OAAQ,MAAO,KAC3B,GAAM,CAAE,MAAAL,EAAO,KAAAM,EAAO,IAAK,EAAID,EAAM,OAC/BE,EAAI,WAAWP,CAAK,EACpBQ,EAAYF,EAAK,YAAY,EAEnC,OAAQE,EAAW,CAClB,IAAK,QACL,IAAK,OACL,IAAK,MACL,IAAK,KACL,IAAK,IAAK,OAAOD,EAAI,SACrB,IAAK,SACL,IAAK,QACL,IAAK,KAAM,OAAOA,EAAI,QACtB,IAAK,QACL,IAAK,OACL,IAAK,IAAK,OAAOA,EAAI,OACrB,IAAK,OACL,IAAK,MACL,IAAK,IAAK,OAAOA,EAAI,MACrB,IAAK,QACL,IAAK,OACL,IAAK,MACL,IAAK,KACL,IAAK,IAAK,OAAOA,EAAI,KACrB,IAAK,UACL,IAAK,SACL,IAAK,OACL,IAAK,MACL,IAAK,IAAK,OAAOA,EAAI,IACrB,IAAK,UACL,IAAK,SACL,IAAK,OACL,IAAK,MACL,IAAK,IAAK,OAAOA,EAAI,IACrB,IAAK,eACL,IAAK,cACL,IAAK,QACL,IAAK,OACL,IAAK,KAAM,OAAOA,EAClB,QAAS,MAAM,IAAI,MAAM,iBAAiBC,CAAS,mCAAmC,KAAK,UAAUJ,CAAG,CAAC,EAAE,CAC5G,CACD,CAcA,SAASK,GAASC,EAAM,CACvB,IAAMC,EAAQ,KAAK,IAAID,CAAI,EAC3B,OAAIC,GAAS,SAAU,GAAG,KAAK,MAAMD,EAAO,QAAC,CAAC,IAC1CC,GAAS,QAAW,GAAG,KAAK,MAAMD,EAAO,OAAE,CAAC,KAC5CC,GAAS,OAAU,GAAG,KAAK,MAAMD,EAAO,MAAC,CAAC,IAC1CC,GAAS,MAAU,GAAG,KAAK,MAAMD,EAAO,KAAC,CAAC,IAC1CC,GAAS,KAAU,GAAG,KAAK,MAAMD,EAAO,IAAC,CAAC,IAC1CC,GAAS,IAAU,GAAG,KAAK,MAAMD,EAAO,GAAC,CAAC,IAC1CC,GAAS,IAAU,GAAG,KAAK,MAAMD,EAAO,GAAC,CAAC,IACvC,GAAGA,CAAI,IACf,CAIA,SAASE,GAAQF,EAAM,CACtB,IAAMC,EAAQ,KAAK,IAAID,CAAI,EAC3B,OAAIC,GAAS,SAAUE,GAAOH,EAAMC,EAAO,SAAG,MAAM,EAChDA,GAAS,QAAWE,GAAOH,EAAMC,EAAO,QAAI,OAAO,EACnDA,GAAS,OAAUE,GAAOH,EAAMC,EAAO,OAAG,MAAM,EAChDA,GAAS,MAAUE,GAAOH,EAAMC,EAAO,MAAG,KAAK,EAC/CA,GAAS,KAAUE,GAAOH,EAAMC,EAAO,KAAG,MAAM,EAChDA,GAAS,IAAUE,GAAOH,EAAMC,EAAO,IAAG,QAAQ,EAClDA,GAAS,IAAUE,GAAOH,EAAMC,EAAO,IAAG,QAAQ,EAC/C,GAAGD,CAAI,KACf,CAQA,SAASI,GAAOJ,EAAMK,EAAS,CAC9B,GAAI,OAAOL,GAAS,UAAY,CAAC,OAAO,SAASA,CAAI,EAAG,MAAM,IAAI,MAAM,uDAAuD,EAC/H,OAAOK,GAAS,KAAOH,GAAQF,CAAI,EAAID,GAASC,CAAI,CACrD,CAIA,SAASG,GAAOH,EAAMC,EAAOK,EAAGC,EAAM,CACrC,IAAMC,EAAWP,GAASK,EAAI,IAC9B,MAAO,GAAG,KAAK,MAAMN,EAAOM,CAAC,CAAC,IAAIC,CAAI,GAAGC,EAAW,IAAM,EAAE,EAC7D,CChHc,SAAPC,GAAwBC,EAAQ,CACrCC,EAAY,MAAQA,EACpBA,EAAY,QAAUA,EACtBA,EAAY,OAASC,EACrBD,EAAY,QAAUE,EACtBF,EAAY,OAASG,EACrBH,EAAY,QAAUI,EACtBJ,EAAY,SAAWK,GACvBL,EAAY,QAAUM,EAEtB,OAAO,KAAKP,CAAG,EAAE,QAAQQ,GAAM,CAE7BP,EAAYO,CAAG,EAAIR,EAAIQ,CAAG,CAC5B,CAAC,EAMDP,EAAY,MAAQ,CAAA,EACpBA,EAAY,MAAQ,CAAA,EAOpBA,EAAY,WAAa,CAAA,EAQzB,SAASQ,EAAaC,EAAiB,CACrC,IAAIC,EAAO,EAEX,QAASC,EAAI,EAAGA,EAAIF,EAAU,OAAQE,IACpCD,GAASA,GAAQ,GAAKA,EAAQD,EAAU,WAAWE,CAAC,EACpDD,GAAQ,EAIV,OAAOV,EAAY,OAAO,KAAK,IAAIU,CAAI,EAAIV,EAAY,OAAO,MAAM,CACtE,CACAA,EAAY,YAAcQ,EAQ1B,SAASR,EAAaS,EAAmBG,EAAiB,CACxD,IAAIC,EACAC,EAAsB,KACtBC,EACAC,EAEJ,SAASC,KAAUC,EAAW,CAG5B,GAAI,CAACD,EAAM,QACT,OAGF,IAAME,EAAYF,EAGZG,EAAO,OAAO,IAAI,IAAM,EACxBf,EAAKe,GAAQP,GAAYO,GAC/BD,EAAK,KAAOd,EACZc,EAAK,KAAON,EACZM,EAAK,KAAOC,EACZP,EAAWO,EAEXF,EAAK,CAAC,EAAIlB,EAAY,OAAOkB,EAAK,CAAC,CAAC,EAEhC,OAAOA,EAAK,CAAC,GAAM,UAErBA,EAAK,QAAQ,IAAI,EAInB,IAAIG,EAAQ,EACZH,EAAK,CAAC,EAAIA,EAAK,CAAC,EAAE,QAAQ,gBAAiB,CAACI,EAAYC,IAAoB,CAE1E,GAAID,IAAU,KACZ,MAAO,IAETD,IAEA,IAAMG,GAAYxB,EAAY,WAAWuB,CAAM,EAC/C,GAAI,OAAOC,IAAc,WAAY,CACnC,IAAMC,GAAMP,EAAKG,CAAK,EACtBC,EAAQE,GAAU,KAAKL,EAAMM,EAAG,EAGhCP,EAAK,OAAOG,EAAO,CAAC,EACpBA,GACF,CACA,OAAOC,CACT,CAAC,EAIDtB,EAAY,WAAW,KAAKmB,EAAMD,CAAI,EAElCN,GAAS,OAAS,MACpBA,EAAQ,MAAM,GAAGM,CAAI,GAITC,EAAK,KAAOnB,EAAY,KAChC,MAAMmB,EAAMD,CAAI,CACxB,CAEA,OAAAD,EAAM,UAAYR,EAElBQ,EAAM,UAAYjB,EAAY,UAAS,EACvCiB,EAAM,MAAQjB,EAAY,YAAYS,CAAS,EAC/CQ,EAAM,OAASS,EACfT,EAAM,QAAUjB,EAAY,QAE5B,OAAO,eAAeiB,EAAO,UAAW,CACtC,WAAY,GACZ,aAAc,GACd,IAAK,IACCH,IAAmB,KACdA,GAGLC,IAAoBf,EAAY,aAElCe,EAAkBf,EAAY,WAC9BgB,EAAehB,EAAY,QAAQS,CAAS,GAGvCO,GAET,IAAKW,GAAI,CACPb,EAAiBa,CACnB,EACD,EAIG,OAAO3B,EAAY,MAAS,YAE9BA,EAAY,KAAKiB,CAAK,EAIjBA,CACT,CAEA,SAASS,EAAmBjB,EAAmBmB,EAAiB,CAC9D,IAAMC,EAAW7B,EAAY,KAAK,WAAa,OAAO4B,EAAc,IAAc,IAAMA,GAAanB,CAAS,EAC9G,OAAAoB,EAAS,IAAM,KAAK,IACbA,CACT,CAQA,SAAS1B,EAAQ2B,EAAkB,CAEjC9B,EAAY,KAAK8B,CAAU,EAE3B9B,EAAY,WAAa8B,EAEzB9B,EAAY,MAAQ,CAAA,EACpBA,EAAY,MAAQ,CAAA,EAEpB,IAAIW,EACEoB,GAAS,OAAOD,GAAe,SAAWA,EAAa,IAAI,MAAM,QAAQ,EACzEE,EAAMD,EAAM,OAElB,IAAKpB,EAAI,EAAGA,EAAIqB,EAAKrB,IACdoB,EAAMpB,CAAC,IAKZmB,EAAaC,EAAMpB,CAAC,EAAE,QAAQ,MAAO,KAAK,EAEtCmB,EAAW,CAAC,IAAM,IACpB9B,EAAY,MAAM,KAAK,IAAI,OAAO,IAAM8B,EAAW,OAAO,CAAC,EAAI,GAAG,CAAC,EAEnE9B,EAAY,MAAM,KAAK,IAAI,OAAO,IAAM8B,EAAa,GAAG,CAAC,EAG/D,CAOA,SAAS5B,GAAO,CACd,IAAM4B,EAAa,CACjB,GAAG9B,EAAY,MAAM,IAAIiC,CAAW,EACpC,GAAGjC,EAAY,MAAM,IAAIiC,CAAW,EAAE,IAAIxB,GAAa,IAAMA,CAAS,GACtE,KAAK,GAAG,EACV,OAAAT,EAAY,OAAO,EAAE,EACd8B,CACT,CAQA,SAAS1B,EAAS8B,EAAY,CAC5B,GAAIA,EAAKA,EAAK,OAAS,CAAC,IAAM,IAC5B,MAAO,GAGT,IAAIvB,EACAqB,EAEJ,IAAKrB,EAAI,EAAGqB,EAAMhC,EAAY,MAAM,OAAQW,EAAIqB,EAAKrB,IACnD,GAAIX,EAAY,MAAMW,CAAC,EAAE,KAAKuB,CAAI,EAChC,MAAO,GAIX,IAAKvB,EAAI,EAAGqB,EAAMhC,EAAY,MAAM,OAAQW,EAAIqB,EAAKrB,IACnD,GAAIX,EAAY,MAAMW,CAAC,EAAE,KAAKuB,CAAI,EAChC,MAAO,GAIX,MAAO,EACT,CAKA,SAASD,EAAaE,EAAc,CAClC,OAAOA,EAAO,SAAQ,EACnB,UAAU,EAAGA,EAAO,SAAQ,EAAG,OAAS,CAAC,EACzC,QAAQ,UAAW,GAAG,CAC3B,CAKA,SAASlC,EAAQwB,EAAQ,CACvB,OAAIA,aAAe,MACVA,EAAI,OAASA,EAAI,QAEnBA,CACT,CAMA,SAASnB,GAAO,CACd,QAAQ,KAAK,uIAAuI,CACtJ,CAGA,OAAAN,EAAY,gBAAgBA,EAAY,UAAU,EAGlDA,EAAY,OAAOA,EAAY,KAAI,CAAE,EAG9BA,CACT,CCnRA,IAAMoC,GAAUC,GAAY,EAKtBC,GAAS,CACb,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,WAYF,SAASC,IAAS,CAKhB,OAAI,OAAO,OAAW,KAAe,OAAO,UAAY,OAAO,QAAQ,OAAS,YAAc,OAAO,QAAQ,QACpG,GAIL,OAAO,UAAc,KAAgB,UAAU,WAAW,YAAW,EAAG,MAAM,uBAAuB,GAAK,KACrG,GAMD,OAAO,SAAa,KAAe,SAAS,iBAAiB,OAAO,kBAGzE,OAAO,OAAW,KAAe,OAAO,UAAY,OAAO,QAAQ,SAAY,OAAO,QAAQ,WAAa,OAAO,QAAQ,QAG1H,OAAO,UAAc,KAAgB,UAAU,WAAW,YAAW,EAAG,MAAM,gBAAgB,GAAK,MAAS,SAAS,OAAO,GAAI,EAAE,GAAK,IAEvI,OAAO,UAAc,KAAe,UAAU,WAAW,YAAW,EAAG,MAAM,oBAAoB,CACtG,CAKA,SAASC,GAAuBC,EAAW,CAQzC,GAPAA,EAAK,CAAC,GAAK,KAAK,UAAY,KAAO,IACjC,KAAK,WACJ,KAAK,UAAY,MAAQ,KAC1BA,EAAK,CAAC,GACL,KAAK,UAAY,MAAQ,KAC1B,IAAMC,GAAS,KAAK,IAAI,EAEtB,CAAC,KAAK,UACR,OAGF,IAAMC,EAAI,UAAY,KAAK,MAC3BF,EAAK,OAAO,EAAG,EAAGE,EAAG,gBAAgB,EAKrC,IAAIC,EAAQ,EACRC,EAAQ,EACZJ,EAAK,CAAC,EAAE,QAAQ,cAAgBK,GAAiB,CAC3CA,IAAU,OAGdF,IACIE,IAAU,OAGZD,EAAQD,GAEZ,CAAC,EAEDH,EAAK,OAAOI,EAAO,EAAGF,CAAC,CACzB,CAQA,IAAMI,GAAM,QAAQ,OAAS,QAAQ,MAAQ,IAAK,CAAG,GAOrD,SAASC,GAAMC,EAAkB,CAC/B,GAAI,CACEA,EACFb,IAAS,QAAQ,QAASa,CAAU,EAEpCb,IAAS,WAAW,OAAO,CAE/B,MAAgB,CAGhB,CACF,CAOA,SAASc,IAAI,CACX,IAAI,EACJ,GAAI,CACF,EAAId,IAAS,QAAQ,OAAO,CAC9B,MAAgB,CAGhB,CAGA,MAAI,CAAC,GAAK,OAAO,WAAW,QAAY,KAAe,QAAS,WAAW,UACzE,EAAI,WAAW,QAAQ,IAAI,OAGtB,CACT,CASA,SAASC,IAAY,CACnB,GAAI,CAGF,OAAO,YACT,MAAgB,CAGhB,CACF,CAEA,SAASc,GAAiBC,EAAe,CAIvCA,EAAW,EAAI,SAAUC,EAAM,CAC7B,GAAI,CACF,OAAO,KAAK,UAAUA,CAAC,CACzB,OAASC,EAAY,CACnB,MAAO,+BAAiCA,EAAM,OAChD,CACF,CACF,CAEA,IAAAC,GAAeC,GAAM,CAAE,WAAAhB,GAAY,KAAAQ,GAAM,KAAAE,GAAM,UAAAX,GAAW,gBAAAY,GAAiB,OAAAb,GAAQ,QAAAF,GAAS,IAAAW,EAAG,CAAE,ECpKjG,IAAAU,EAAeC,GCpCfC,EAAM,WAAW,EAAKC,GACbA,GAAK,KAAO,YAAcC,EAAU,WAAWD,CAAC,EAIzDD,EAAM,WAAW,EAAKC,GACbA,GAAK,KAAO,YAAcE,EAAO,WAAWF,CAAC,EAItDD,EAAM,WAAW,EAAKC,GACbA,GAAK,KAAO,YAAcG,GAAO,WAAWH,CAAC,EAItDD,EAAM,WAAW,EAAKC,GACbA,GAAK,KAAO,YAAcA,EAAE,SAAQ,EAI7CD,EAAM,WAAW,EAAKC,GACbA,GAAK,KAAO,YAAcA,EAAE,SAAQ,EAI7CD,EAAM,WAAW,EAAKC,GACbA,GAAK,KAAO,YAAcA,EAAE,SAAQ,EAI7CD,EAAM,WAAW,EAAKC,GACbA,GAAK,KAAO,YAAcA,EAAE,SAAQ,EAG7C,SAASI,GAAaJ,EAAUK,EAAS,GAAE,CACzC,IAAMC,EAAUC,GAASP,EAAE,OAAO,EAC5BQ,EAAQD,GAASP,EAAE,KAAK,EAK9B,OAAIM,GAAW,MAAQE,GAAS,KAC1BA,EAAM,SAASF,CAAO,EACjB,GAAGE,EAAM,MAAM;CAAI,EAAE,KAAK;EAAKH,CAAM,EAAE,CAAC,GAG1C,GAAGC,CAAO;EAAKD,CAAM,GAAGG,EAAM,MAAM;CAAI,EAAE,KAAK;EAAKH,CAAM,EAAE,CAAC,GAGlEG,GAAS,KACJ,GAAGA,EAAM,MAAM;CAAI,EAAE,KAAK;EAAKH,CAAM,EAAE,CAAC,GAG7CC,GAAW,KACN,GAAGA,CAAO,GAGZ,GAAGN,EAAE,SAAQ,CAAE,EACxB,CAEA,SAASS,GAAkBC,EAAS,CAClC,OAAOA,aAAe,gBAAmBA,GAAK,OAAS,kBAAoB,MAAM,QAAQA,EAAI,MAAM,CACrG,CAEA,SAASC,GAAYD,EAAYL,EAAS,GAAE,CAC1C,GAAII,GAAiBC,CAAG,EAAG,CACzB,IAAIE,EAASR,GAAYM,EAAKL,CAAM,EAEpC,OAAIK,EAAI,OAAO,OAAS,GACtBL,EAAS,GAAGA,CAAM,OAElBO,GAAU;EAAKP,CAAM,GACnBK,EAAI,OACH,IAAIA,GAAO,GAAGC,GAAWD,EAAK,GAAGL,CAAM,EAAE,CAAC,EAAE,EAC5C,KAAK;EAAKA,CAAM,EAAE,CACrB,IAEAO,GAAU;EAAKP,CAAM,yBAGhBO,EAAO,KAAI,CACpB,CAEA,OAAOR,GAAYM,EAAKL,CAAM,CAChC,CAGAN,EAAM,WAAW,EAAKC,GAChBA,GAAK,KACA,YAGFW,GAAWX,CAAC,EAKrB,SAASa,GAAsBC,EAAiB,CAC9C,IAAMC,EAAS,IAAW,CAAE,EAC5B,OAAAA,EAAO,QAAU,GACjBA,EAAO,MAAQ,GACfA,EAAO,KAAO,EACdA,EAAO,IAAM,IAAW,CAAE,EAC1BA,EAAO,UAAYD,EACnBC,EAAO,QAAU,IAAM,GACvBA,EAAO,OAAS,IAAMA,EACtBA,EAAO,UAAY,IAAM,GAElBA,CACT,CA0FM,SAAUC,GAAQC,EAAcC,EAAuB,CAE3D,IAAIC,EAAkBC,GAAqB,GAAGH,CAAI,QAAQ,EAG1D,OAAII,EAAM,QAAQ,GAAGJ,CAAI,QAAQ,GAAKI,EAAM,MAAM,IAAKC,GAAWA,EAAE,SAAQ,CAAE,EAAE,KAAM,GAAc,EAAE,SAAS,QAAQ,CAAC,GAAK,OAC3HH,EAAQE,EAAM,GAAGJ,CAAI,SAAUC,CAAO,GAGjC,OAAO,OAAOG,EAAMJ,EAAMC,CAAO,EAAG,CACzC,MAAOG,EAAM,GAAGJ,CAAI,SAAUC,CAAO,EACrC,MAAAC,EACA,SAAWI,GAAkBP,GAAO,GAAGC,CAAI,IAAIM,CAAK,GAAIL,CAAO,EAChE,CACH,CAcA,SAASM,GAAUC,EAAY,CAC7B,GAAIA,GAAO,OAIXA,EAAMA,EAAI,KAAI,EAEVA,EAAI,SAAW,GAInB,OAAOA,CACT,CC/Re,SAARC,IAA0B,CAChC,IAAMC,EAAW,CAAC,EAElB,OAAAA,EAAS,QAAU,IAAI,QAAQ,CAACC,EAASC,IAAW,CACnDF,EAAS,QAAUC,EACnBD,EAAS,OAASE,CACnB,CAAC,EAEMF,CACR,CCyDA,SAASG,GAAkBC,EAAmB,CAC5C,OAAOA,EAAO,MAChB,CAKA,eAAsBC,GAAgBC,EAAqBF,EAAsBG,EAAwB,CACvG,GAAIH,GAAU,KACZ,OAAOE,EAGT,IAAME,EAAiBD,GAAM,gBAAkBJ,GAE/C,GAAIC,EAAO,QAGT,OAAAE,EAAQ,MAAM,IAAK,CAAE,CAAC,EACf,QAAQ,OAAOE,EAAeJ,CAAM,CAAC,EAG9C,IAAIK,EAEJ,GAAI,CACF,OAAO,MAAM,QAAQ,KAAK,CACxBH,EACA,IAAI,QAAW,CAACI,EAASC,IAAU,CACjCF,EAAW,IAAK,CACdE,EAAOH,EAAeJ,CAAM,CAAC,CAC/B,EACAA,EAAO,iBAAiB,QAASK,CAAQ,CAC3C,CAAC,EACF,CACH,SACMA,GAAY,MACdL,EAAO,oBAAoB,QAASK,CAAQ,CAEhD,CACF,CC/FA,IAAMG,GAAMC,GAAO,wBAAwB,ECJpC,IAAMC,GAAc,WCG3B,IAAMC,GAAN,KAAe,CACN,OACU,KACT,IACA,IACD,KAEP,YAAaC,EAAW,CACtB,GAAI,EAAEA,EAAM,KAAQA,EAAM,EAAKA,KAAS,EACtC,MAAM,IAAI,MAAM,mDAAmD,EAGrE,KAAK,OAAS,IAAI,MAAMA,CAAG,EAC3B,KAAK,KAAOA,EAAM,EAClB,KAAK,IAAM,EACX,KAAK,IAAM,EACX,KAAK,KAAO,IACd,CAEA,KAAMC,EAAa,CACjB,OAAI,KAAK,OAAO,KAAK,GAAG,IAAM,OACrB,IAGT,KAAK,OAAO,KAAK,GAAG,EAAIA,EACxB,KAAK,IAAO,KAAK,IAAM,EAAK,KAAK,KAE1B,GACT,CAEA,OAAK,CACH,IAAMC,EAAO,KAAK,OAAO,KAAK,GAAG,EAEjC,GAAIA,IAAS,OAIb,YAAK,OAAO,KAAK,GAAG,EAAI,OACxB,KAAK,IAAO,KAAK,IAAM,EAAK,KAAK,KAC1BA,CACT,CAEA,SAAO,CACL,OAAO,KAAK,OAAO,KAAK,GAAG,IAAM,MACnC,GAUWC,GAAP,KAAW,CACR,KACU,IACT,KACA,KAER,YAAaC,EAAuB,CAAA,EAAE,CACpC,KAAK,IAAMA,EAAQ,YAAc,GACjC,KAAK,KAAO,IAAIL,GAAa,KAAK,GAAG,EACrC,KAAK,KAAO,KAAK,KACjB,KAAK,KAAO,CACd,CAEA,cAAeM,EAAQ,CACrB,OAAIA,GAAK,YAAc,KACdA,EAAI,WAGN,CACT,CAEA,KAAMC,EAAY,CAKhB,GAJIA,GAAK,OAAS,OAChB,KAAK,MAAQ,KAAK,cAAcA,EAAI,KAAK,GAGvC,CAAC,KAAK,KAAK,KAAKA,CAAG,EAAG,CACxB,IAAMC,EAAO,KAAK,KAClB,KAAK,KAAOA,EAAK,KAAO,IAAIR,GAAa,EAAI,KAAK,KAAK,OAAO,MAAM,EACpE,KAAK,KAAK,KAAKO,CAAG,CACpB,CACF,CAEA,OAAK,CACH,IAAIA,EAAM,KAAK,KAAK,MAAK,EAEzB,GAAIA,IAAQ,QAAc,KAAK,KAAK,MAAQ,KAAO,CACjD,IAAME,EAAO,KAAK,KAAK,KACvB,KAAK,KAAK,KAAO,KACjB,KAAK,KAAOA,EACZF,EAAM,KAAK,KAAK,MAAK,CACvB,CAEA,OAAIA,GAAK,OAAS,OAChB,KAAK,MAAQ,KAAK,cAAcA,EAAI,KAAK,GAGpCA,CACT,CAEA,SAAO,CACL,OAAO,KAAK,KAAK,QAAO,CAC1B,GC7DI,IAAOG,GAAP,cAA0B,KAAK,CACnC,KACA,KAEA,YAAaC,EAAkBC,EAAa,CAC1C,MAAMD,GAAW,2BAA2B,EAC5C,KAAK,KAAO,UACZ,KAAK,KAAOC,GAAQ,WACtB,GAoFI,SAAUC,GAAaC,EAAmB,CAAA,EAAE,CAmBhD,OAAOC,GAlBUC,GAAkC,CACjD,IAAMC,EAA4BD,EAAO,MAAK,EAE9C,GAAIC,GAAQ,KACV,MAAO,CAAE,KAAM,EAAI,EAGrB,GAAIA,EAAK,OAAS,KAChB,MAAMA,EAAK,MAGb,MAAO,CACL,KAAMA,EAAK,OAAS,GAEpB,MAAOA,EAAK,MAEhB,EAE6CH,CAAO,CACtD,CAuCA,SAASI,GAA4CC,EAAuCC,EAAiB,CAC3GA,EAAUA,GAAW,CAAA,EACrB,IAAIC,EAAQD,EAAQ,MAChBE,EAAS,IAAIC,GACbC,EACAC,EACAC,EACAC,EAAQC,GAAQ,EAEdC,EAAW,SAA2C,CAC1D,GAAI,CACF,OAAKP,EAAO,QAAO,EAIfI,EACK,CAAE,KAAM,EAAI,EAGd,MAAM,IAAI,QAA+B,CAACI,EAASC,IAAU,CAClEN,EAAUO,GAAwB,CAChCP,EAAS,KACTH,EAAO,KAAKU,CAAI,EAEhB,GAAI,CACFF,EAAQX,EAAQG,CAAM,CAAC,CACzB,OAASW,EAAK,CACZF,EAAOE,CAAG,CACZ,CAEA,OAAOT,CACT,CACF,CAAC,EApBQL,EAAQG,CAAM,CAqBzB,SACMA,EAAO,QAAO,GAGhB,eAAe,IAAK,CAClBK,EAAM,QAAO,EACbA,EAAQC,GAAQ,CAClB,CAAC,CAEL,CACF,EAEMM,EAAcF,GACdP,GAAU,KACLA,EAAOO,CAAI,GAGpBV,EAAO,KAAKU,CAAI,EACTR,GAGHW,EAAeF,IACnBX,EAAS,IAAIC,GAETE,GAAU,KACLA,EAAO,CAAE,MAAOQ,CAAG,CAAE,GAG9BX,EAAO,KAAK,CAAE,MAAOW,CAAG,CAAE,EACnBT,IAGHY,EAAQC,GAA+B,CAC3C,GAAIX,EACF,OAAOF,EAIT,GAAIJ,GAAS,aAAe,IAAQiB,GAAO,YAAc,KACvD,MAAM,IAAI,MAAM,gEAAgE,EAGlF,OAAOH,EAAW,CAAE,KAAM,GAAO,MAAAG,CAAK,CAAE,CAC1C,EACMC,EAAOL,GACPP,EAAgBF,GACpBE,EAAQ,GAEAO,GAAO,KAAQE,EAAYF,CAAG,EAAIC,EAAW,CAAE,KAAM,EAAI,CAAE,GAE/DK,EAAU,KACdjB,EAAS,IAAIC,GACbe,EAAG,EAEI,CAAE,KAAM,EAAI,GAEfE,EAAUP,IACdK,EAAIL,CAAG,EAEA,CAAE,KAAM,EAAI,GA+CrB,GA5CAT,EAAW,CACT,CAAC,OAAO,aAAa,GAAC,CAAM,OAAO,IAAK,EACxC,KAAMK,EACN,OAAQU,EACR,MAAOC,EACP,KAAAJ,EACA,IAAAE,EACA,IAAI,gBAAc,CAChB,OAAOhB,EAAO,IAChB,EACA,QAAS,MAAOF,GAA0B,CACxC,IAAMqB,EAASrB,GAAS,OAGxB,GAFAqB,GAAQ,eAAc,EAElBnB,EAAO,QAAO,EAChB,OAGF,IAAIoB,EACAC,EAEAF,GAAU,OACZC,EAAS,IAAI,QAAQ,CAACZ,EAASC,IAAU,CACvCY,EAAW,IAAK,CACdZ,EAAO,IAAIa,EAAY,CACzB,EAEAH,EAAO,iBAAiB,QAASE,CAAQ,CAC3C,CAAC,GAGH,GAAI,CACF,MAAM,QAAQ,KAAK,CACjBhB,EAAM,QACNe,EACD,CACH,SACMC,GAAY,MAAQF,GAAU,MAChCA,GAAQ,oBAAoB,QAASE,CAAQ,CAEjD,CACF,GAGEtB,GAAS,KACX,OAAOG,EAGT,IAAMN,EAAYM,EAElB,OAAAA,EAAW,CACT,CAAC,OAAO,aAAa,GAAC,CAAM,OAAO,IAAK,EACxC,MAAI,CACF,OAAON,EAAU,KAAI,CACvB,EACA,MAAOe,EAAU,CACf,OAAAf,EAAU,MAAMe,CAAG,EAEfZ,GAAS,OACXA,EAAMY,CAAG,EACTZ,EAAQ,QAGH,CAAE,KAAM,EAAI,CACrB,EACA,QAAM,CACJ,OAAAH,EAAU,OAAM,EAEZG,GAAS,OACXA,EAAK,EACLA,EAAQ,QAGH,CAAE,KAAM,EAAI,CACrB,EACA,KAAAe,EACA,IAAKH,EAAU,CACb,OAAAf,EAAU,IAAIe,CAAG,EAEbZ,GAAS,OACXA,EAAMY,CAAG,EACTZ,EAAQ,QAGHG,CACT,EACA,IAAI,gBAAc,CAChB,OAAON,EAAU,cACnB,EACA,QAAU2B,GACD3B,EAAU,QAAQ2B,CAAI,GAI1BrB,CACT,CC9XA,IAAMsB,GAAW,IAAIC,GAAIC,EAAW,ECNpC,IAAMC,GAAMC,GAAO,uBAAuB,ECH1C,IAAMC,GAAa,CAClB,GAAI,UACJ,GAAI,eACJ,IAAK,6BACL,IAAK,qDACL,IAAK,0GACL,KAAM,8MACP,EAEMC,GAAc,CACnB,GAAI,YACJ,GAAI,sBACJ,IAAK,yCACL,IAAK,gFACL,IAAK,4JACL,KAAM,gSACP,EAEMC,GAAgB,IAAI,WAAW,YAErC,SAASC,GAAgBC,EAAYC,EAAM,CAC1C,IAAMC,EAAWN,GAAWK,CAAI,EAC5BE,EAAON,GAAYI,CAAI,EAG3B,QAASG,EAAQ,EAAGA,EAAQJ,EAAW,OAAQI,IAC9CD,GAAQ,OAAOH,EAAWI,CAAK,CAAC,EAChCD,EAAO,OAAO,QAAQF,EAAME,EAAOD,CAAQ,EAG5C,OAAOC,CACR,CAEA,SAASE,GAAgBC,EAAQL,EAAMM,EAAY,CAClD,GAAIA,EAAW,SAAW,EACzB,MAAM,IAAI,MAAM,8DAA8D,EAG/E,IAAML,EAAWN,GAAWK,CAAI,EAC5BE,EAAON,GAAYI,CAAI,EACvBO,EAAYF,EAEhB,KAAOE,EAAU,OAAS,GAAG,CAC5B,IAAMC,EAASX,GAAc,WAAWU,EAAWD,CAAU,EAC7DC,EAAYA,EAAU,MAAMC,EAAO,IAAI,EACvC,QAASL,EAAQ,EAAGA,EAAQK,EAAO,QAASL,IAC3CD,GAAQ,OAAOI,EAAWH,CAAK,CAAC,EAChCD,EAAO,OAAO,QAAQF,EAAME,EAAOD,CAAQ,CAE7C,CAEA,OAAOC,CACR,CAEe,SAARO,GAAuBC,EAAO,CAAC,KAAAV,EAAO,GAAI,WAAAM,CAAU,EAAI,CAAC,EAAG,CAClE,GAAI,CAACX,GAAWK,CAAI,EACnB,MAAM,IAAI,MAAM,iEAAiE,EAGlF,GAAI,OAAOU,GAAU,SAAU,CAC9B,GAAIJ,EACH,OAAOF,GAAgBM,EAAOV,EAAMM,CAAU,EAG/CI,EAAQb,GAAc,OAAOa,CAAK,CACnC,CAEA,OAAOZ,GAAgBY,EAAOV,CAAI,CACnC,CC/DO,IAAMW,GAAc,CACzB,KAAOC,GACE,OAAOD,GAAUC,EAAO,CAC7B,KAAM,GACP,CAAC,EAEJ,MAAO,CAACA,EAAOC,IACNC,GAAeH,GAAM,KAAKC,EAAOC,CAAI,CAAC,GAI3C,SAAUC,GAAgBC,EAAoB,CAClD,IAAIC,EAAMD,EAAI,SAAS,EAAE,EAEzB,OAAIC,EAAI,OAAS,IAAM,IACrBA,EAAM,IAAIA,CAAG,IAGRC,EAAqBD,EAAK,QAAQ,CAC3C,CCvBO,IAAME,GAAuB,GAEvBC,EAAP,KAAkB,CACL,GACA,EACA,KAEjB,YAAaC,EAAiBC,EAAYC,EAAcC,EAA0B,EAAC,CACjF,GAAIA,EAAkBL,GACpB,MAAM,IAAI,UAAU,0BAA0B,EAGhD,IAAMM,EAAMH,EAAK,MAAMD,EAAKE,CAAI,EAC1BG,EAAKC,EAAgBH,CAAe,EAE1C,QAASI,EAAI,EAAGA,EAAIF,EAAG,OAAQE,IAC7BF,EAAGE,CAAC,EAAIH,EAAIG,CAAC,EAGXF,EAAG,SAAW,IAChBA,EAAG,CAAC,EAAI,GAGV,KAAK,GAAKA,EACV,KAAK,EAAIJ,EACT,KAAK,KAAOC,CACd,CAEA,MAAI,CACF,OAAO,KAAK,EAAE,KAAK,KAAK,GAAI,KAAK,IAAI,CACvC,CAEA,OAAQM,EAAW,CACjB,OAAMA,GAAO,cAAc,WAIpBC,GAAiB,KAAK,GAAID,EAAM,EAAE,EAHhC,EAIX,GC1CI,SAAUE,GAAcC,EAAaC,EAAW,CACpD,OAAO,KAAK,MAAM,KAAK,OAAM,GAAMA,EAAMD,EAAI,EAAIA,CACnD,CCCM,IAAOE,GAAP,KAAa,CACA,SAEjB,YAAaC,EAAY,CACvB,KAAK,SAAW,IAAI,MAAMA,CAAI,EAAE,KAAK,IAAI,CAC3C,CAEA,IAAKC,EAAwB,CAC3B,GAAI,EAAEA,aAAuBC,GAC3B,MAAM,IAAI,UAAU,qBAAqB,EAG3C,OAAO,KAAK,SAAS,KAAMC,GAClBF,EAAY,OAAOE,CAAE,CAC7B,CACH,CAEA,IAAKF,EAAwB,CAC3B,GAAI,EAAEA,aAAuBC,GAC3B,MAAM,IAAI,UAAU,qBAAqB,EAG3C,QAASE,EAAI,EAAGA,EAAI,KAAK,SAAS,OAAQA,IACxC,GAAI,KAAK,SAASA,CAAC,GAAK,KACtB,YAAK,SAASA,CAAC,EAAIH,EACZ,GAIX,MAAO,EACT,CAEA,KAAMA,EAAwB,CAC5B,GAAI,EAAEA,aAAuBC,GAC3B,MAAM,IAAI,UAAU,qBAAqB,EAG3C,IAAME,EAAIC,GAAa,EAAG,KAAK,SAAS,OAAS,CAAC,EAC5CC,EAAU,KAAK,SAASF,CAAC,EAC/B,YAAK,SAASA,CAAC,EAAIH,EAEZK,CACT,CAEA,OAAQL,EAAwB,CAC9B,GAAI,EAAEA,aAAuBC,GAC3B,MAAM,IAAI,UAAU,qBAAqB,EAG3C,IAAMK,EAAQ,KAAK,SAAS,UAAWJ,GAC9BF,EAAY,OAAOE,CAAE,CAC7B,EAED,OAAII,EAAQ,IACV,KAAK,SAASA,CAAK,EAAI,KAChB,IAEA,EAEX,GCtDF,IAAMC,GAAiB,IA6BVC,GAAP,KAAmB,CACN,WACA,WACA,gBACA,QACV,MACU,KACA,KAEjB,YAAaC,EAAsB,CACjC,KAAK,WAAaA,EAAK,WACvB,KAAK,WAAaA,EAAK,YAAc,EACrC,KAAK,gBAAkBA,EAAK,iBAAmB,EAC/C,KAAK,MAAQ,EACb,KAAK,QAAU,CAAA,EACf,KAAK,KAAOA,EAAK,MAAQC,GACzB,KAAK,KAAOD,EAAK,MAAQE,GAAa,EAAG,KAAK,IAAI,EAAG,EAAE,CAAC,CAC1D,CAEA,IAAKC,EAAyB,CACxB,OAAOA,GAAS,WAClBA,EAAOC,EAAqBD,CAAI,GAGlC,IAAME,EAAc,IAAIC,EAAYH,EAAM,KAAK,KAAM,KAAK,KAAM,KAAK,eAAe,EAC9EI,EAAI,KAAK,KAAK,KAAKJ,EAAM,KAAK,IAAI,EAAI,KAAK,WAC3CK,GAAKD,EAAIF,EAAY,KAAI,GAAM,KAAK,WAU1C,GARI,KAAK,QAAQE,CAAC,GAAK,OACrB,KAAK,QAAQA,CAAC,EAAI,IAAIE,GAAO,KAAK,UAAU,GAG1C,KAAK,QAAQD,CAAC,GAAK,OACrB,KAAK,QAAQA,CAAC,EAAI,IAAIC,GAAO,KAAK,UAAU,GAG1C,KAAK,QAAQF,CAAC,EAAE,IAAIF,CAAW,GAAK,KAAK,QAAQG,CAAC,EAAE,IAAIH,CAAW,EACrE,YAAK,QACE,GAGT,IAAMK,EAAO,CAACH,EAAGC,CAAC,EACd,EAAIE,EAAKR,GAAa,EAAGQ,EAAK,OAAS,CAAC,CAAC,EAEzC,KAAK,QAAQ,CAAC,GAAK,OACrB,KAAK,QAAQ,CAAC,EAAI,IAAID,GAAO,KAAK,UAAU,GAG9C,QAASE,EAAI,EAAGA,EAAIb,GAAgBa,IAAK,CACvC,IAAMC,EAAU,KAAK,QAAQ,CAAC,EAAE,KAAKP,CAAW,EAEhD,GAAIO,GAAW,OAIf,GAAK,EAAIA,EAAQ,KAAI,GAAM,KAAK,WAE5B,KAAK,QAAQ,CAAC,GAAK,OACrB,KAAK,QAAQ,CAAC,EAAI,IAAIH,GAAO,KAAK,UAAU,GAG1C,KAAK,QAAQ,CAAC,EAAE,IAAIG,CAAO,GAC7B,YAAK,QAEE,EAIX,CAEA,MAAO,EACT,CAEA,IAAKT,EAAyB,CACxB,OAAOA,GAAS,WAClBA,EAAOC,EAAqBD,CAAI,GAGlC,IAAME,EAAc,IAAIC,EAAYH,EAAM,KAAK,KAAM,KAAK,KAAM,KAAK,eAAe,EAC9EI,EAAI,KAAK,KAAK,KAAKJ,EAAM,KAAK,IAAI,EAAI,KAAK,WAC3CU,EAAM,KAAK,QAAQN,CAAC,GAAG,IAAIF,CAAW,GAAK,GAEjD,GAAIQ,EACF,OAAOA,EAGT,IAAML,GAAKD,EAAIF,EAAY,KAAI,GAAM,KAAK,WAE1C,OAAO,KAAK,QAAQG,CAAC,GAAG,IAAIH,CAAW,GAAK,EAC9C,CAEA,OAAQF,EAAyB,CAC3B,OAAOA,GAAS,WAClBA,EAAOC,EAAqBD,CAAI,GAGlC,IAAME,EAAc,IAAIC,EAAYH,EAAM,KAAK,KAAM,KAAK,KAAM,KAAK,eAAe,EAC9EI,EAAI,KAAK,KAAK,KAAKJ,EAAM,KAAK,IAAI,EAAI,KAAK,WAC3CU,EAAM,KAAK,QAAQN,CAAC,GAAG,OAAOF,CAAW,GAAK,GAEpD,GAAIQ,EACF,YAAK,QACEA,EAGT,IAAML,GAAKD,EAAIF,EAAY,KAAI,GAAM,KAAK,WACpCS,EAAM,KAAK,QAAQN,CAAC,GAAG,OAAOH,CAAW,GAAK,GAEpD,OAAIS,GACF,KAAK,QAGAA,CACT,CAEA,IAAI,UAAQ,CACV,OAAO,KAAK,MAAM,KAAO,KAAK,MAAQ,KAAK,WAAW,GAAK,EAC7D,GAIIC,GAAW,CACf,EAAG,GACH,EAAG,IACH,EAAG,IACH,EAAG,KAGL,SAASC,GAAqBC,EAAoB,KAAK,CACrD,OAAIA,EAAY,KACP,EAGLA,EAAY,KACP,EAGF,CACT,CAEM,SAAUC,GAAUC,EAAkBF,EAAoB,KAAK,CAGnE,IAAMG,EAAaJ,GAAoBC,CAAS,EAC1CI,EAAON,GAASK,CAAU,EAG1BE,EAAa,KAAK,MAAMH,EAAWE,CAAI,EACvCE,EAAkB,KAAK,IAAI,KAAK,KAAK,KAAK,KAAK,EAAIN,CAAS,EAAI,KAAK,KAAK,EAAIG,CAAU,CAAC,EAAGI,EAAoB,EAEtH,MAAO,CACL,WAAAF,EACA,WAAAF,EACA,gBAAAG,EAEJ,CCjLM,IAAOE,GAAP,KAA2B,CACd,WACA,WACA,gBACA,MACA,aACA,KACA,KAEjB,YAAaC,EAA8B,CACzC,KAAK,WAAaA,EAAK,YAAc,EACrC,KAAK,WAAaA,EAAK,aAAe,GAAK,IAAM,KAAK,WACtD,KAAK,gBAAkBA,EAAK,iBAAmB,EAC/C,KAAK,MAAQA,EAAK,OAAS,EAC3B,KAAK,KAAOA,EAAK,MAAQC,GACzB,KAAK,KAAOD,EAAK,MAAQE,GAAa,EAAG,KAAK,IAAI,EAAG,EAAE,CAAC,EACxD,KAAK,aAAe,CAClB,IAAIC,GAAa,CACf,WAAY,KAAK,WACjB,WAAY,KAAK,WACjB,gBAAiB,KAAK,gBACtB,KAAM,KAAK,KACX,KAAM,KAAK,KACZ,EAEL,CAEA,IAAKC,EAAyB,CAK5B,GAJI,OAAOA,GAAS,WAClBA,EAAOC,EAAqBD,CAAI,GAG9B,KAAK,IAAIA,CAAI,EACf,MAAO,GAGT,IAAIE,EAAU,KAAK,aAAa,KAAMC,GAC7BA,EAAO,QACf,EAED,GAAID,GAAW,KAAM,CACnB,IAAME,EAAU,KAAK,WAAa,KAAK,IAAI,KAAK,MAAO,KAAK,aAAa,MAAM,EAE/EF,EAAU,IAAIH,GAAa,CACzB,WAAYK,EACZ,WAAY,KAAK,WACjB,gBAAiB,KAAK,gBACtB,KAAM,KAAK,KACX,KAAM,KAAK,KACZ,EAED,KAAK,aAAa,KAAKF,CAAO,CAChC,CAEA,OAAOA,EAAQ,IAAIF,CAAI,CACzB,CAEA,IAAKA,EAAyB,CACxB,OAAOA,GAAS,WAClBA,EAAOC,EAAqBD,CAAI,GAGlC,QAASK,EAAI,EAAGA,EAAI,KAAK,aAAa,OAAQA,IAC5C,GAAI,KAAK,aAAaA,CAAC,EAAE,IAAIL,CAAI,EAC/B,MAAO,GAIX,MAAO,EACT,CAEA,OAAQA,EAAyB,CAC3B,OAAOA,GAAS,WAClBA,EAAOC,EAAqBD,CAAI,GAGlC,QAASK,EAAI,EAAGA,EAAI,KAAK,aAAa,OAAQA,IAC5C,GAAI,KAAK,aAAaA,CAAC,EAAE,OAAOL,CAAI,EAClC,MAAO,GAIX,MAAO,EACT,CAEA,IAAI,OAAK,CACP,OAAO,KAAK,aAAa,OAAO,CAACM,EAAKC,IAC7BD,EAAMC,EAAK,MACjB,CAAC,CACN,GAGI,SAAUC,GAA4BC,EAAkBC,EAAoB,KAAOC,EAAmE,CAC1J,OAAO,IAAIhB,GAAqB,CAC9B,GAAGiB,GAASH,EAAUC,CAAS,EAC/B,GAAIC,GAAW,CAAA,EAChB,CACH,CCpDM,SAAUE,GAAiBC,EAAa,CAC5C,IAAMC,EAAaD,EAAG,cAAa,EAC7BE,EAAc,CAAA,EAChBC,EAAQ,EAoCZ,OAlCIF,EAAWE,CAAK,GAAG,OAAS,YAC9BD,EAAO,KAAO,GAAGD,EAAWE,CAAK,EAAE,KAAK,GACxCA,KAGEF,EAAWE,CAAK,GAAG,OAAS,OAASF,EAAWE,CAAK,GAAG,OAAS,OAI1DF,EAAWE,CAAK,GAAG,OAAS,OAASF,EAAWE,CAAK,GAAG,OAAS,QAAUF,EAAWE,CAAK,GAAG,OAAS,QAHhHD,EAAO,KAAOD,EAAWE,CAAK,EAAE,KAChCD,EAAO,KAAOD,EAAWE,CAAK,EAAE,MAChCA,KAKSF,EAAWE,CAAK,GAAG,OAAS,YACrCD,EAAO,KAAOD,EAAWE,CAAK,EAAE,KAChCD,EAAO,KAAO,YAAYD,EAAWE,CAAK,EAAE,KAAK,GACjDA,MAGEF,EAAWE,CAAK,GAAG,OAAS,OAASF,EAAWE,CAAK,GAAG,OAAS,SACnED,EAAO,SAAWD,EAAWE,CAAK,EAAE,OAAS,MAAQ,MAAQ,MAC7DD,EAAO,KAAO,SAAS,GAAGD,EAAWE,CAAK,EAAE,KAAK,EAAE,EACnDA,KAGEF,EAAWE,CAAK,GAAG,OAAS,WAC1BD,EAAO,OAAS,MAClBA,EAAO,KAAO,SAAS,GAAGD,EAAWE,CAAK,EAAE,KAAK,EAAE,EAC1CD,EAAO,OAAS,QACzBA,EAAO,KAAO,GAAGD,EAAWE,CAAK,EAAE,KAAK,IAE1CA,KAGED,EAAO,MAAQ,MAAQA,EAAO,MAAQ,KACjC,MAGLD,EAAWE,CAAK,GAAG,OAAS,OAASF,EAAWE,EAAQ,CAAC,GAAG,OAAS,QACvED,EAAO,IAAMD,EAAWE,EAAQ,CAAC,EAAE,MACnCA,GAAS,GAGJD,EACT,CAMM,SAAUE,GAAcJ,EAAa,CACzC,IAAME,EAASH,GAAgBC,CAAE,EAEjC,GAAIE,GAAU,KACZ,MAAM,IAAIG,GAAuB,aAAaL,CAAE,4DAA4D,EAG9G,OAAOE,CACT,CCpHM,IAAOI,GAAP,KAAa,CACT,MAAQ,EACR,MAAQ,GAEhB,IAAIC,EAAa,CACf,YAAK,MAAQ,EACb,KAAK,MAAQA,EACN,IACT,CAGA,eAA6BC,EAAK,CAChC,IAAMC,EAAQ,KAAK,MACbC,EAASF,EAAE,EACjB,OAAIE,IAAW,SACb,KAAK,MAAQD,GAERC,CACT,CAGA,UAAwBF,EAAK,CAC3B,IAAME,EAASF,EAAE,EACjB,GAAI,KAAK,QAAU,KAAK,MAAM,OAG9B,OAAOE,CACT,CAGA,UAAQ,CACN,GAAI,OAAK,OAAS,KAAK,MAAM,QAG7B,OAAO,KAAK,MAAM,KAAK,KAAK,CAC9B,CAGA,UAAQ,CACN,GAAI,OAAK,OAAS,KAAK,MAAM,QAG7B,OAAO,KAAK,MAAM,KAAK,OAAO,CAChC,CAGA,cAAcC,EAAc,CAC1B,OAAO,KAAK,eAAe,IAAK,CAC9B,IAAMC,EAAO,KAAK,SAAQ,EAC1B,GAAIA,IAASD,EAGb,OAAOC,CACT,CAAC,CACH,CAQA,cAA4BC,EAAaJ,EAAeK,EAAQ,CAC9D,OAAO,KAAK,eAAe,IAAK,CAC9B,GAAI,EAAAL,EAAQ,GACN,KAAK,cAAcI,CAAG,IAAM,QAIlC,OAAOC,EAAK,CACd,CAAC,CACH,CAOA,WACEC,EACAC,EACAC,EACAC,EAAgB,CAEhB,OAAO,KAAK,eAAe,IAAK,CAC9B,IAAIR,EAAS,EACTS,EAAa,EAEXC,EAAc,KAAK,SAAQ,EACjC,GAAIA,IAAgB,OAClB,OAEF,IAAMC,EAAiBD,IAAgB,IACjCE,EAAW,IAAM,EAAIJ,GAAY,EAGvC,OAAa,CACX,IAAMK,EAAQ,KAAK,eAAe,IAAK,CACrC,IAAMX,EAAO,KAAK,SAAQ,EAC1B,GAAIA,IAAS,OACX,OAEF,IAAMY,EAAM,OAAO,SAASZ,EAAMG,CAAK,EACvC,GAAI,QAAO,MAAMS,CAAG,EAGpB,OAAOA,CACT,CAAC,EACD,GAAID,IAAU,OACZ,MAQF,GANAb,GAAUK,EACVL,GAAUa,EACNb,EAASY,IAGbH,GAAc,EACVH,IAAc,QACZG,EAAaH,GACf,OAKN,GAAIG,IAAe,EAEZ,MAAI,CAACF,GAAmBI,GAAkBF,EAAa,EAC5D,OAEOT,CAEX,CAAC,CACH,CAGA,cAAY,CACV,OAAO,KAAK,eAAe,IAAK,CAC9B,IAAMe,EAAM,IAAI,WAAW,CAAC,EAE5B,QAASC,EAAI,EAAGA,EAAID,EAAI,OAAQC,IAAK,CACnC,IAAMC,EAAK,KAAK,cAAc,IAAKD,EAAG,IAAM,KAAK,WAAW,GAAI,EAAG,GAAO,CAAC,CAAC,EAC5E,GAAIC,IAAO,OACT,OAEFF,EAAIC,CAAC,EAAIC,EAGX,OAAOF,CACT,CAAC,CACH,CAGA,cAAY,CAQV,IAAMG,EAAcC,GAAyC,CAC3D,QAASH,EAAI,EAAGA,EAAIG,EAAO,OAAS,EAAGH,IAAK,CAC1C,IAAMC,EAAKD,EAAI,EAEf,GAAIA,EAAIG,EAAO,OAAS,EAAG,CACzB,IAAMC,EAAO,KAAK,cAAc,IAAKJ,EAAG,IAAM,KAAK,aAAY,CAAE,EACjE,GAAII,IAAS,OACX,OAAAD,EAAOF,CAAE,EAAIG,EAAK,CAAC,EACnBD,EAAOF,EAAK,CAAC,EAAIG,EAAK,CAAC,EACvBD,EAAOF,EAAK,CAAC,EAAIG,EAAK,CAAC,EACvBD,EAAOF,EAAK,CAAC,EAAIG,EAAK,CAAC,EAEhB,CAACH,EAAK,EAAG,EAAI,EAIxB,IAAMI,EAAQ,KAAK,cAAc,IAAKL,EAAG,IAAM,KAAK,WAAW,GAAI,EAAG,GAAM,CAAC,CAAC,EAC9E,GAAIK,IAAU,OACZ,MAAO,CAACJ,EAAI,EAAK,EAEnBE,EAAOF,CAAE,EAAII,GAAS,EACtBF,EAAOF,EAAK,CAAC,EAAII,EAAQ,IAE3B,MAAO,CAACF,EAAO,OAAQ,EAAK,CAC9B,EAEA,OAAO,KAAK,eAAe,IAAK,CAE9B,IAAMG,EAAO,IAAI,WAAW,EAAE,EACxB,CAACC,EAAUC,CAAO,EAAIN,EAAWI,CAAI,EAE3C,GAAIC,IAAa,GACf,OAAOD,EAaT,GATIE,GAMA,KAAK,cAAc,GAAG,IAAM,QAG5B,KAAK,cAAc,GAAG,IAAM,OAC9B,OAKF,IAAMC,EAAO,IAAI,WAAW,EAAE,EACxBC,EAAQ,IAAMH,EAAW,GACzB,CAACI,CAAQ,EAAIT,EAAWO,EAAK,SAAS,EAAGC,CAAK,CAAC,EAGrD,OAAAJ,EAAK,IAAIG,EAAK,SAAS,EAAGE,CAAQ,EAAG,GAAKA,CAAQ,EAE3CL,CACT,CAAC,CACH,CAGA,YAAU,CACR,OAAO,KAAK,aAAY,GAAM,KAAK,aAAY,CACjD,GCrOF,IAAMM,GAAkB,GAClBC,GAAkB,GAElBC,GAAS,IAAIC,GAGb,SAAUC,GAAUC,EAAa,CACrC,GAAI,EAAAA,EAAM,OAASJ,IAGnB,OAAOC,GAAO,IAAIG,CAAK,EAAE,UAAU,IAAMH,GAAO,aAAY,CAAE,CAChE,CAiBM,SAAUI,GAAUC,EAAa,CAKrC,GAHIA,EAAM,SAAS,GAAG,IACpBA,EAAQA,EAAM,MAAM,GAAG,EAAE,CAAC,GAExB,EAAAA,EAAM,OAASC,IAGnB,OAAOC,GAAO,IAAIF,CAAK,EAAE,UAAU,IAAME,GAAO,aAAY,CAAE,CAChE,CCrCM,SAAUC,GAAOC,EAAa,CAClC,MAAO,EAAQC,GAAUD,CAAK,CAChC,CAGM,SAAUE,GAAOF,EAAa,CAClC,MAAO,EAAQG,GAAUH,CAAK,CAChC,CCTA,IAAAI,GAAwB,WAElBC,GAAoB,CACxB,YACA,aACA,gBACA,cACA,iBACA,gBACA,eACA,eACA,eACA,eACA,gBACA,iBACA,iBACA,eACA,kBACA,kBACA,iBACA,iBACA,kBACA,gBACA,kBACA,iBACA,cACA,sBAGIC,GAAiBD,GAAkB,IAAIE,GAAW,IAAI,WAAQA,CAAO,CAAC,EAE5E,SAASC,GAAWC,EAAc,CAChC,QAAWC,KAAKJ,GACd,GAAII,EAAE,SAASD,CAAM,EAAK,MAAO,GAGnC,MAAO,EACT,CAEA,SAASE,GAAkBF,EAAc,CACvC,MAAO,iDAAiD,KAAKA,CAAM,CACrE,CAKA,SAASG,GAAqBH,EAAc,CAC1C,IAAMI,EAAQJ,EAAO,MAAM,GAAG,EAE9B,GAAII,EAAM,OAAS,EACjB,MAAO,GAGT,IAAMC,EAAUD,EAAMA,EAAM,OAAS,CAAC,EAAE,SAAS,EAAG,GAAG,EACjDE,EAAUF,EAAMA,EAAM,OAAS,CAAC,EAAE,SAAS,EAAG,GAAG,EAEjDG,EAAM,GAAG,SAASD,EAAQ,UAAU,EAAG,CAAC,EAAG,EAAE,CAAC,IAAI,SAASA,EAAQ,UAAU,CAAC,EAAG,EAAE,CAAC,IAAI,SAASD,EAAQ,UAAU,EAAG,CAAC,EAAG,EAAE,CAAC,IAAI,SAASA,EAAQ,UAAU,CAAC,EAAG,EAAE,CAAC,GAEzK,OAAON,GAAUQ,CAAG,CACtB,CAKA,SAASC,GAAoBR,EAAc,CACzC,MAAO,kEAAkE,KAAKA,CAAM,CACtF,CAEA,SAASS,GAAuBT,EAAc,CAC5C,IAAMI,EAAQJ,EAAO,MAAM,GAAG,EACxBO,EAAMH,EAAMA,EAAM,OAAS,CAAC,EAElC,OAAOL,GAAUQ,CAAG,CACtB,CAEA,SAASG,GAAWV,EAAc,CAChC,MAAO,OAAO,KAAKA,CAAM,GACvB,QAAQ,KAAKA,CAAM,GACnB,oEAAoE,KAAKA,CAAM,GAC/E,wFAAwF,KAAKA,CAAM,GACnG,iIAAiI,KAAKA,CAAM,GAC5I,6IAA6I,KAAKA,CAAM,GACxJ,oIAAoI,KAAKA,CAAM,GAC/I,oJAAoJ,KAAKA,CAAM,GAC/J,8BAA8B,KAAKA,CAAM,GACzC,8BAA8B,KAAKA,CAAM,GACzC,0BAA0B,KAAKA,CAAM,CACzC,CAEM,SAAUW,GAAaC,EAAU,CACrC,GAAIC,GAAOD,CAAE,EACX,OAAOb,GAAUa,CAAE,EAGrB,GAAIV,GAAiBU,CAAE,EACrB,OAAOT,GAAoBS,CAAE,EAG/B,GAAIJ,GAAmBI,CAAE,EACvB,OAAOH,GAAsBG,CAAE,EAGjC,GAAIE,GAAOF,CAAE,EACX,OAAOF,GAAUE,CAAE,CAEvB,CCnGM,SAAUG,GAAWC,EAAa,CACtC,GAAI,CACF,IAAMC,EAASC,GAAaF,CAAE,EAE9B,OAAQC,EAAO,KAAM,CACnB,IAAK,MACL,IAAK,MACH,OAAOE,GAAYF,EAAO,IAAI,GAAK,GACrC,QACE,OAAOA,EAAO,OAAS,WAC3B,CACF,MAAQ,CACN,MAAO,EACT,CACF,CClBM,IAAOG,EAAP,cAAqC,KAAK,CAC9C,OAAO,KAAO,wBACd,KAAO,yBAGIC,GAAP,cAA+B,KAAK,CACxC,OAAO,KAAO,kBACd,KAAO,mBAGIC,GAAP,cAAsC,KAAK,CAC/C,OAAO,KAAO,yBACd,KAAO,0BAGIC,GAAP,cAAoC,KAAK,CAC7C,OAAO,KAAO,uBACd,KAAO,wBCVH,SAAUC,GAAeC,EAAwB,CACrD,OAAQC,GACCC,EAAmBD,EAAKD,CAAI,CAEvC,CAEM,SAAUG,GAAeH,EAAwB,CACrD,OAAQC,GACCG,EAAqBH,EAAKD,CAAI,CAEzC,CAEM,SAAUK,GAAYJ,EAAe,CAEzC,OADa,IAAI,SAASA,EAAI,MAAM,EACxB,UAAUA,EAAI,UAAU,EAAE,SAAQ,CAChD,CAEM,SAAUK,GAAYC,EAAqB,CAC/C,IAAMN,EAAM,IAAI,YAAY,CAAC,EAE7B,OADa,IAAI,SAASA,CAAG,EACxB,UAAU,EAAG,OAAOM,GAAS,SAAW,SAASA,CAAI,EAAIA,CAAI,EAE3D,IAAI,WAAWN,CAAG,CAC3B,CAEM,SAAUO,GAAaC,EAAW,CACtC,IAAMC,EAAOD,EAAI,MAAM,GAAG,EAE1B,GAAIC,EAAK,SAAW,EAClB,MAAM,IAAI,MAAM,kCAAkCA,EAAK,KAAK,MAAM,CAAC,qCAAqC,EAG1G,GAAIA,EAAK,CAAC,EAAE,SAAW,GACrB,MAAM,IAAI,MAAM,+BAA+BA,EAAK,CAAC,CAAC,2BAA2B,EAInF,IAAMT,EAAMG,EAAqBM,EAAK,CAAC,EAAG,QAAQ,EAG5CH,EAAO,SAASG,EAAK,CAAC,EAAG,EAAE,EAEjC,GAAIH,EAAO,GAAKA,EAAO,MACrB,MAAM,IAAI,MAAM,uCAAuC,EAGzD,IAAMI,EAAUL,GAAWC,CAAI,EAE/B,OAAOK,GAAiB,CAACX,EAAKU,CAAO,EAAGV,EAAI,OAASU,EAAQ,MAAM,CACrE,CAEM,SAAUE,GAAcJ,EAAW,CACvC,IAAMC,EAAOD,EAAI,MAAM,GAAG,EAE1B,GAAIC,EAAK,SAAW,EAClB,MAAM,IAAI,MAAM,kCAAkCA,EAAK,KAAK,MAAM,CAAC,qCAAqC,EAG1G,GAAIA,EAAK,CAAC,EAAE,SAAW,GACrB,MAAM,IAAI,MAAM,+BAA+BA,EAAK,CAAC,CAAC,4BAA4B,EAIpF,IAAMT,EAAMa,EAAO,OAAO,IAAIJ,EAAK,CAAC,CAAC,EAAE,EAGjCH,EAAO,SAASG,EAAK,CAAC,EAAG,EAAE,EAEjC,GAAIH,EAAO,GAAKA,EAAO,MACrB,MAAM,IAAI,MAAM,uCAAuC,EAGzD,IAAMI,EAAUL,GAAWC,CAAI,EAE/B,OAAOK,GAAiB,CAACX,EAAKU,CAAO,EAAGV,EAAI,OAASU,EAAQ,MAAM,CACrE,CAEM,SAAUI,GAAad,EAAe,CAC1C,IAAMe,EAAYf,EAAI,SAAS,EAAGA,EAAI,OAAS,CAAC,EAC1CgB,EAAYhB,EAAI,SAASA,EAAI,OAAS,CAAC,EACvCS,EAAOR,EAAmBc,EAAW,QAAQ,EAC7CT,EAAOF,GAAWY,CAAS,EACjC,MAAO,GAAGP,CAAI,IAAIH,CAAI,EACxB,CAIO,IAAMW,GAAa,SAAUC,EAAU,CAC5CA,EAAKA,EAAG,SAAQ,EAAG,KAAI,EAEvB,IAAMC,EAAQ,IAAI,WAAW,CAAC,EAE9B,OAAAD,EAAG,MAAM,KAAK,EAAE,QAAQ,CAACE,EAAMC,IAAS,CACtC,IAAMC,EAAQ,SAASF,EAAM,EAAE,EAE/B,GAAI,MAAME,CAAK,GAAKA,EAAQ,GAAKA,EAAQ,IACvC,MAAM,IAAIC,EAAsB,kCAAkC,EAGpEJ,EAAME,CAAK,EAAIC,CACjB,CAAC,EAEMH,CACT,EAIaK,GAAa,SAAUN,EAAU,CAC5C,IAAIO,EAAS,EACbP,EAAKA,EAAG,SAAQ,EAAG,KAAI,EAEvB,IAAMQ,EAAWR,EAAG,MAAM,IAAK,CAAC,EAE5BS,EACJ,IAAKA,EAAI,EAAGA,EAAID,EAAS,OAAQC,IAAK,CACpC,IAAMC,EAAOC,GAAOH,EAASC,CAAC,CAAC,EAC3BG,EAEAF,IACFE,EAAWb,GAAWS,EAASC,CAAC,CAAC,EACjCD,EAASC,CAAC,EAAI1B,EAAmB6B,EAAS,SAAS,EAAG,CAAC,EAAG,QAAQ,GAGhEA,GAAY,MAAQ,EAAEH,EAAI,GAC5BD,EAAS,OAAOC,EAAG,EAAG1B,EAAmB6B,EAAS,SAAS,EAAG,CAAC,EAAG,QAAQ,CAAC,CAE/E,CAEA,GAAIJ,EAAS,CAAC,IAAM,GAClB,KAAOA,EAAS,OAAS,GAAKA,EAAS,QAAQ,GAAG,UACzCA,EAASA,EAAS,OAAS,CAAC,IAAM,GAC3C,KAAOA,EAAS,OAAS,GAAKA,EAAS,KAAK,GAAG,UACtCA,EAAS,OAAS,EAAG,CAC9B,IAAKC,EAAI,EAAGA,EAAID,EAAS,QAAUA,EAASC,CAAC,IAAM,GAAIA,IAAK,CAC5D,IAAMI,EAAsC,CAACJ,EAAG,CAAC,EACjD,IAAKA,EAAI,EAAID,EAAS,OAAQC,EAAI,EAAGA,IACnCI,EAAK,KAAK,GAAG,EAEfL,EAAS,OAAO,MAAMA,EAAUK,CAAI,CACtC,CAEA,IAAMZ,EAAQ,IAAI,WAAWM,EAAS,EAAE,EAExC,IAAKE,EAAI,EAAGA,EAAID,EAAS,OAAQC,IAAK,CAChCD,EAASC,CAAC,IAAM,KAClBD,EAASC,CAAC,EAAI,KAGhB,IAAMK,EAAO,SAASN,EAASC,CAAC,EAAG,EAAE,EAErC,GAAI,MAAMK,CAAI,GAAKA,EAAO,GAAKA,EAAO,MACpC,MAAM,IAAIT,EAAsB,kCAAkC,EAGpEJ,EAAMM,GAAQ,EAAKO,GAAQ,EAAK,IAChCb,EAAMM,GAAQ,EAAIO,EAAO,GAC3B,CAEA,OAAOb,CACT,EAGac,GAAc,SAAUjC,EAAe,CAClD,GAAIA,EAAI,aAAe,EACrB,MAAM,IAAIuB,EAAsB,mCAAmC,EAGrE,IAAMW,EAAS,CAAA,EAEf,QAASP,EAAI,EAAGA,EAAI3B,EAAI,WAAY2B,IAClCO,EAAO,KAAKlC,EAAI2B,CAAC,CAAC,EAGpB,OAAOO,EAAO,KAAK,GAAG,CACxB,EAEaC,GAAc,SAAUnC,EAAe,CAClD,GAAIA,EAAI,aAAe,GACrB,MAAM,IAAIuB,EAAsB,mCAAmC,EAGrE,IAAMW,EAAmB,CAAA,EAEzB,QAASP,EAAI,EAAGA,EAAI3B,EAAI,WAAY2B,GAAK,EAAG,CAC1C,IAAMS,EAAQpC,EAAI2B,CAAC,EACbU,EAAQrC,EAAI2B,EAAI,CAAC,EAEjBW,EAAQ,GAAGF,EAAM,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,CAAC,GAAGC,EAAM,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,CAAC,GAE1FH,EAAO,KAAKI,CAAK,CACnB,CAEA,IAAMpB,EAAKgB,EAAO,KAAK,GAAG,EAE1B,GAAI,CACF,IAAMK,EAAM,IAAI,IAAI,WAAWrB,CAAE,GAAG,EAEpC,OAAOqB,EAAI,SAAS,UAAU,EAAGA,EAAI,SAAS,OAAS,CAAC,CAC1D,MAAQ,CACN,MAAM,IAAIhB,EAAsB,yBAAyBL,CAAE,GAAG,CAChE,CACF,EAEM,SAAUsB,GAAkBhC,EAAW,CAC3C,GAAI,CACF,IAAM+B,EAAM,IAAI,IAAI,WAAW/B,CAAG,GAAG,EAErC,OAAO+B,EAAI,SAAS,UAAU,EAAGA,EAAI,SAAS,OAAS,CAAC,CAC1D,MAAQ,CACN,MAAM,IAAIhB,EAAsB,yBAAyBf,CAAG,GAAG,CACjE,CACF,CAEA,IAAMiC,GAAW,OAAO,OAAOC,EAAK,EAAE,IAAKC,GAAMA,EAAE,OAAO,EACpDC,IAAkB,UAAA,CACtB,IAAIC,EAAMJ,GAAS,CAAC,EAAE,GAAGA,GAAS,CAAC,CAAC,EACpC,OAAAA,GAAS,MAAM,CAAC,EAAE,QAASK,GAAOD,EAAMA,EAAI,GAAGC,CAAC,CAAE,EAC3CD,CACT,GAAE,EAEI,SAAUE,GAAUC,EAAa,CACrC,OAAOJ,GAAe,OAAOI,CAAK,CACpC,CAEM,SAAUC,GAAUlD,EAAyB,CACjD,OAAQC,GACCD,EAAK,QAAQ,OAAOC,CAAG,CAElC,CC5OM,SAAUkD,GAASC,EAAa,CAGpC,GAFY,SAASA,CAAK,EAElB,SAAQ,IAAOA,EACrB,MAAM,IAAIC,GAAgB,0BAA0B,CAExD,CAEM,SAAUC,GAAUF,EAAU,CAClC,GAAIA,EAAQ,EACV,MAAM,IAAIC,GAAgB,2CAA2C,CAEzE,CAEM,SAAUE,GAAUC,EAAW,CACnC,OAAQJ,GAAS,CACf,GAAIA,EAAQI,EACV,MAAM,IAAIH,GAAgB,0CAA0CG,CAAG,EAAE,CAE7E,CACF,CAEM,SAAUC,MAAaC,EAAqC,CAChE,OAAQN,GAAS,CACf,QAAWO,KAAMD,EACfC,EAAGP,CAAK,CAEZ,CACF,CAEO,IAAMQ,GAAeH,GAC1BN,GACAG,GACAC,GAAS,KAAM,CAAC,EC1BX,IAAMM,EAAI,GAsDXC,GAAN,KAAc,CACJ,gBAAkB,IAAI,IACtB,gBAAkB,IAAI,IAE9B,YAAaC,EAAoB,CAC/B,IAAIC,EAQJ,GANI,OAAOD,GAAQ,SACjBC,EAAQ,KAAK,gBAAgB,IAAID,CAAG,EAEpCC,EAAQ,KAAK,gBAAgB,IAAID,CAAG,EAGlCC,GAAS,KACX,MAAM,IAAIC,GAAqB,YAAYF,CAAG,cAAc,EAG9D,OAAOC,CACT,CAEA,YAAaA,EAAoB,CAC/B,KAAK,gBAAgB,IAAIA,EAAM,KAAMA,CAAK,EAC1C,KAAK,gBAAgB,IAAIA,EAAM,KAAMA,CAAK,EAE1CA,EAAM,SAAS,QAAQE,GAAQ,CAC7B,KAAK,gBAAgB,IAAIA,EAAOF,CAAK,CACvC,CAAC,CACH,CAEA,eAAgBG,EAAY,CAC1B,IAAMH,EAAQ,KAAK,gBAAgB,IAAIG,CAAI,EAEvCH,GAAS,OAIb,KAAK,gBAAgB,OAAOA,EAAM,IAAI,EACtC,KAAK,gBAAgB,OAAOA,EAAM,IAAI,EAEtCA,EAAM,SAAS,QAAQE,GAAQ,CAC7B,KAAK,gBAAgB,OAAOA,CAAK,CACnC,CAAC,EACH,GAGWE,GAA8B,IAAIN,GAEzCO,GAA0B,CAAC,CAC/B,KAAM,EACN,KAAM,MACN,KAAM,GACN,aAAcC,GACd,aAAcC,GACd,SAAWC,GAAS,CAClB,GAAI,CAACC,GAAOD,CAAK,EACf,MAAM,IAAIE,GAAgB,yBAAyBF,CAAK,GAAG,CAE/D,GACC,CACD,KAAM,EACN,KAAM,MACN,KAAM,GACN,aAAcG,GACd,aAAcC,GACd,SAAUC,IACT,CACD,KAAM,IACN,KAAM,MACN,KAAM,GACN,aAAcF,GACd,aAAcC,GACd,SAAUC,IACT,CACD,KAAM,GACN,KAAM,OACN,KAAM,GACN,aAAcF,GACd,aAAcC,GACd,SAAUC,IACT,CACD,KAAM,GACN,KAAM,MACN,KAAM,IACN,aAAcC,GACd,aAAcC,GACd,cAAeC,GACf,SAAWR,GAAS,CAClB,GAAI,CAACS,GAAOT,CAAK,EACf,MAAM,IAAIE,GAAgB,yBAAyBF,CAAK,GAAG,CAE/D,GACC,CACD,KAAM,GACN,KAAM,UACN,KAAMX,GACL,CACD,KAAM,GACN,KAAM,SACN,KAAM,EACN,aAAcqB,GAAc,QAAQ,EACpC,aAAcC,GAAc,QAAQ,GACnC,CACD,KAAM,GACN,KAAM,MACN,KAAMtB,GACL,CACD,KAAM,GACN,KAAM,OACN,KAAMA,GACL,CACD,KAAM,GACN,KAAM,OACN,KAAMA,GACL,CACD,KAAM,GACN,KAAM,UACN,KAAMA,GACL,CACD,KAAM,IACN,KAAM,OACN,KAAM,GACN,aAAcc,GACd,aAAcC,GACd,SAAUC,IACT,CACD,KAAM,IACN,KAAM,OACL,CACD,KAAM,IACN,KAAM,OACL,CACD,KAAM,IACN,KAAM,OACN,KAAMhB,EACN,cAAgBuB,GAAQ,mBAAmBA,CAAG,EAC9C,cAAgBC,GAAQ,mBAAmBA,CAAG,GAC7C,CACD,KAAM,IACN,KAAM,MACN,QAAS,CAAC,MAAM,EAChB,KAAMxB,EACN,aAAcqB,GAAc,WAAW,EACvC,aAAeG,GACTA,EAAI,WAAW,GAAG,GAAKA,EAAI,WAAW,GAAG,EACpCF,GAAc,WAAW,EAAEE,CAAG,EAGhCC,EAAI,MAAMD,CAAG,EAAE,UAAU,OAEjC,CACD,KAAM,IACN,KAAM,QACN,KAAM,GACN,aAAcE,GACd,aAAcC,IACb,CACD,KAAM,IACN,KAAM,SACN,KAAM,IACN,aAAcD,GACd,aAAcE,IACb,CACD,KAAM,IACN,KAAM,WACN,KAAM5B,GACL,CACD,KAAM,IACN,KAAM,WACN,KAAMA,GACL,CACD,KAAM,IACN,KAAM,OACL,CACD,KAAM,IACN,KAAM,MACN,KAAMA,GACL,CACD,KAAM,IACN,KAAM,SACL,CACD,KAAM,IACN,KAAM,QACL,CACD,KAAM,IACN,KAAM,WACL,CACD,KAAM,IACN,KAAM,gBACL,CACD,KAAM,IACN,KAAM,WACN,KAAMA,EACN,aAAc6B,GAASC,EAAS,EAChC,aAAcC,IACb,CACD,KAAM,IACN,KAAM,QACL,CACD,KAAM,IACN,KAAM,YACN,KAAM/B,EACN,cAAgBuB,GAAQ,IAAI,mBAAmBA,CAAG,CAAC,GACnD,cAAgBC,GAAQ,mBAAmBA,EAAI,UAAU,CAAC,CAAC,GAC1D,CACD,KAAM,IACN,KAAM,SACL,CACD,KAAM,IACN,KAAM,MACL,CACD,KAAM,IACN,KAAM,OACL,CACD,KAAM,IACN,KAAM,sBACL,CACD,KAAM,IACN,KAAM,gBACL,CACD,KAAM,IACN,KAAM,mBACL,CACD,KAAM,IACN,KAAM,qBACL,CACD,KAAM,IACN,KAAM,iBACL,CACD,KAAM,IACN,KAAM,UACL,CACD,KAAM,IACN,KAAM,eACL,CACD,KAAM,IACN,KAAM,SACN,KAAMxB,EACP,EAEDQ,GAAO,QAAQL,GAAQ,CACrBI,GAAS,YAAYJ,CAAK,CAC5B,CAAC,ECtSK,SAAU6B,GAAmBC,EAAiB,CAClD,IAAMC,EAA0B,CAAA,EAE5BC,EAAI,EACR,KAAOA,EAAIF,EAAM,QAAQ,CACvB,IAAMG,EAAcC,GAAOJ,EAAOE,CAAC,EAC7BG,EAAQC,GAAS,YAAYH,CAAI,EACjCI,EAAoBC,GAAeL,CAAI,EACvCM,EAAOC,GAAYL,EAAOL,EAAOE,EAAIK,CAAU,EACjDI,EAAa,EAEbF,EAAO,GAAKJ,EAAM,OAASO,IAC7BD,EAAoBH,GAAeC,CAAI,GAGzC,IAAMI,EAAkBN,EAAaI,EAAaF,EAE5CK,EAAuB,CAC3B,KAAAX,EACA,KAAME,EAAM,KACZ,MAAOU,GAAgBf,EAAM,SAASE,EAAGA,EAAIW,CAAe,CAAC,GAG/D,GAAIJ,EAAO,EAAG,CACZ,IAAMO,EAAcd,EAAIK,EAAaI,EAC/BM,EAAajB,EAAM,SAASgB,EAAaA,EAAcP,CAAI,EAEjEK,EAAU,MAAQT,EAAM,eAAeY,CAAU,GAAKC,EAAmBD,CAAU,CACrF,CAEAhB,EAAW,KAAKa,CAAS,EAEzBZ,GAAKW,CACP,CAEA,OAAOZ,CACT,CAEM,SAAUkB,GAAmBlB,EAAuB,CACxD,IAAImB,EAAS,EACPpB,EAAsB,CAAA,EAE5B,QAAWc,KAAab,EAAY,CAClC,GAAIa,EAAU,OAAS,KAAM,CAC3B,IAAMT,EAAQC,GAAS,YAAYQ,EAAU,IAAI,EAC3CO,EAAqBb,GAAeM,EAAU,IAAI,EACpDG,EACAK,EAAc,EACdC,EAAoB,EAEpBT,EAAU,OAAS,OACrBG,EAAaZ,EAAM,eAAeS,EAAU,KAAK,GAAKU,EAAqBV,EAAU,KAAK,EAC1FQ,EAAcL,EAAW,WAErBZ,EAAM,OAASO,IACjBW,EAA2Bf,GAAec,CAAW,IAIzD,IAAMtB,EAAQ,IAAI,WAAWqB,EAAcE,EAAoBD,CAAW,EAGtEG,EAAS,EACNC,GAAiBZ,EAAU,KAAMd,EAAOyB,CAAM,EACrDA,GAAUJ,EAGNJ,GAAc,OAEZZ,EAAM,OAASO,IACVc,GAAiBJ,EAAatB,EAAOyB,CAAM,EAClDA,GAAUF,GAIZvB,EAAM,IAAIiB,EAAYQ,CAAM,GAG9BX,EAAU,MAAQd,CACpB,CAEAA,EAAM,KAAKc,EAAU,KAAK,EAC1BM,GAAUN,EAAU,MAAM,UAC5B,CAEA,OAAOa,GAAiB3B,EAAOoB,CAAM,CACvC,CAEM,SAAUQ,GAAoBC,EAAc,CAChD,GAAIA,EAAO,OAAO,CAAC,IAAM,IACvB,MAAM,IAAIC,EAAsB,sCAAsC,EAGxE,IAAM7B,EAA0B,CAAA,EAC5B8B,EAAmC,WACnCC,EAAQ,GACRC,EAAW,GAEf,QAAS/B,EAAI,EAAGA,EAAI2B,EAAO,OAAQ3B,IAAK,CACtC,IAAMgC,EAAOL,EAAO,OAAO3B,CAAC,EAExBgC,IAAS,MACPH,IAAe,WACjBE,GAAYJ,EAAO,OAAO3B,CAAC,EAE3B8B,GAASH,EAAO,OAAO3B,CAAC,GAI5B,IAAMiC,EAAQjC,IAAM2B,EAAO,OAAS,EAEpC,GAAIK,IAAS,KAAOC,EAAO,CACzB,IAAM9B,EAAQC,GAAS,YAAY2B,CAAQ,EAE3C,GAAIF,IAAe,WAAY,CAC7B,GAAI1B,EAAM,MAAQ,MAAQA,EAAM,OAAS,EAAG,CAE1CJ,EAAW,KAAK,CACd,KAAMI,EAAM,KACZ,KAAMA,EAAM,KACb,EAED2B,EAAQ,GACRC,EAAW,GACXF,EAAa,WAEb,QACF,SAAWI,EACT,MAAM,IAAIL,EAAsB,aAAaG,CAAQ,oBAAoB,EAI3EF,EAAa,OACf,SAAWA,IAAe,QAAS,CACjC,IAAMjB,EAAuB,CAC3B,KAAMT,EAAM,KACZ,KAAMA,EAAM,MAGd,GAAIA,EAAM,MAAQ,MAAQA,EAAM,OAAS,EAAG,CAC1C,GAAI2B,IAAU,GACZ,MAAM,IAAIF,EAAsB,aAAaG,CAAQ,oBAAoB,EAG3EnB,EAAU,MAAQT,EAAM,gBAAgB2B,CAAK,GAAKA,CACpD,CAEA/B,EAAW,KAAKa,CAAS,EAEzBkB,EAAQ,GACRC,EAAW,GACXF,EAAa,UACf,CACF,CACF,CAEA,GAAIE,IAAa,IAAMD,IAAU,GAC/B,MAAM,IAAIF,EAAsB,sBAAsB,EAGxD,OAAO7B,CACT,CAEM,SAAUmC,GAAoBnC,EAAuB,CACzD,MAAO,IAAIA,EAAW,QAAQa,GAAY,CACtC,GAAIA,EAAU,OAAS,KACrB,OAAOA,EAAU,KAGnB,IAAMT,EAAQC,GAAS,YAAYQ,EAAU,IAAI,EAEjD,GAAIT,GAAS,KACX,MAAM,IAAIyB,EAAsB,yBAAyBhB,EAAU,IAAI,EAAE,EAG3E,MAAO,CACLA,EAAU,KACVT,EAAM,gBAAgBS,EAAU,KAAK,GAAKA,EAAU,MAExD,CAAC,EAAE,KAAK,GAAG,CAAC,EAChB,CAKA,SAASJ,GAAaL,EAAsBL,EAAmByB,EAAc,CAC3E,OAAIpB,EAAM,MAAQ,MAAQA,EAAM,OAAS,EAChC,EAGLA,EAAM,KAAO,EACRA,EAAM,KAAO,EAGRD,GAAOJ,EAAOyB,CAAM,CACpC,CCtMA,IAAMY,GAAU,OAAO,IAAI,4BAA4B,EAC1CC,GAAS,OAAO,IAAI,yBAAyB,EAE1D,SAASC,GAAcC,EAAoB,CAKzC,GAJIA,GAAQ,OACVA,EAAO,KAGLC,GAAYD,CAAI,EAClB,OAAOA,EAAK,cAAa,EAG3B,GAAIA,aAAgB,WAClB,OAAOE,GAAkBF,CAAI,EAG/B,GAAI,OAAOA,GAAS,SAClB,OAAAA,EAAOA,EACJ,QAAQ,UAAW,GAAG,EACtB,QAAQ,SAAU,EAAE,EAEnBA,IAAS,KACXA,EAAO,KAGFG,GAAmBH,CAAI,EAGhC,GAAI,MAAM,QAAQA,CAAI,EACpB,OAAOA,EAGT,MAAM,IAAII,EAAsB,iEAAiE,CACnG,CASM,IAAOC,GAAP,MAAOC,CAAS,CACpB,CAACR,EAAM,EAAa,GACXS,GAGTC,GAEAC,GAEA,YAAaT,EAAqC,IAAKU,EAA4B,CAAA,EAAE,CACnF,KAAKH,GAAcR,GAAaC,CAAI,EAEhCU,EAAQ,WAAa,IACvBC,GAAS,IAAI,CAEjB,CAEA,IAAI,OAAK,CACP,OAAI,KAAKF,IAAU,OACjB,KAAKA,GAASG,GAAkB,KAAKL,EAAW,GAG3C,KAAKE,EACd,CAEA,UAAQ,CACN,OAAI,KAAKD,IAAW,OAClB,KAAKA,GAAUK,GAAmB,KAAKN,EAAW,GAG7C,KAAKC,EACd,CAEA,QAAM,CACJ,OAAO,KAAK,SAAQ,CACtB,CAEA,eAAa,CACX,MAAO,CACL,GAAG,KAAKD,GAAY,IAAIO,IAAM,CAAE,GAAGA,CAAC,EAAG,EAE3C,CAEA,YAAad,EAAoB,CAC/B,IAAMe,EAAK,IAAIT,EAAUN,CAAI,EAE7B,OAAO,IAAIM,EAAU,CACnB,GAAG,KAAKC,GACR,GAAGQ,EAAG,cAAa,GAClB,CACD,SAAU,GACX,CACH,CAEA,YAAaf,EAAwB,CACnC,IAAMgB,EAAahB,EAAK,SAAQ,EAC1BiB,EAAI,KAAK,SAAQ,EACjBC,EAAID,EAAE,YAAYD,CAAU,EAElC,GAAIE,EAAI,EACN,MAAM,IAAIC,GAAuB,WAAW,KAAK,SAAQ,CAAE,iCAAiCH,CAAU,EAAE,EAG1G,OAAO,IAAIV,EAAUW,EAAE,MAAM,EAAGC,CAAC,EAAG,CAClC,SAAU,GACX,CACH,CAEA,gBAAiBE,EAAY,CAC3B,IAAIC,EAEJ,QAASH,EAAI,KAAKX,GAAY,OAAS,EAAGW,EAAI,GAAIA,IAChD,GAAI,KAAKX,GAAYW,CAAC,EAAE,OAASE,EAAM,CACrCC,EAAQH,EACR,KACF,CAGF,OAAO,IAAIZ,EAAU,KAAKC,GAAY,MAAM,EAAGc,CAAK,EAAG,CACrD,SAAU,GACX,CACH,CAEA,OAAQrB,EAA2B,CACjC,OAAOsB,GAAiB,KAAK,MAAOtB,EAAK,KAAK,CAChD,CAcA,CAACH,EAAO,GAAC,CACP,MAAO,aAAa,KAAK,SAAQ,CAAE,GACrC,GAOI,SAAUc,GAAUX,EAAe,CACvCA,EAAK,cAAa,EACf,QAAQuB,GAAY,CACnB,IAAMC,EAAQC,GAAS,YAAYF,EAAU,IAAI,EAE7CA,EAAU,OAAS,MAIvBC,EAAM,WAAWD,EAAU,KAAK,CAClC,CAAC,CACL,CC6GM,SAAUG,GAAaC,EAAU,CACrC,MAAO,EAAQA,IAAQC,EAAM,CAC/B,CAeM,SAAUC,GAAWC,EAAqB,CAC9C,OAAO,IAAIC,GAAeD,CAAI,CAChC,CClSO,IAAME,EAAQA,IACZ,CACL,MAAQC,GAAQ,CACd,IAAMC,EAAYD,EAAK,CAAC,EAUxB,OARIC,GAAa,MAIbA,EAAU,OAASF,GAInBE,EAAU,OAAS,KACd,GAGFD,EAAK,MAAM,CAAC,CACrB,IAQSE,EAAQ,CAACH,EAAcG,KAC3B,CACL,MAAQF,GAAQ,CACd,IAAMC,EAAYD,EAAK,CAAC,EAUxB,OARIC,GAAW,OAASF,GAIpBE,EAAU,OAAS,MAInBC,GAAS,MAAQD,EAAU,QAAUC,EAChC,GAGFF,EAAK,MAAM,CAAC,CACrB,IAQSG,GAAOC,IACX,CACL,MAAQJ,GACSI,EAAQ,MAAMJ,CAAI,IAElB,GACNA,EAGF,KAQAK,EAAYD,IAChB,CACL,MAAQJ,GAAQ,CACd,IAAMM,EAASF,EAAQ,MAAMJ,CAAI,EAEjC,OAAIM,IAAW,GACNN,EAGFM,CACT,IAOSC,EAAK,IAAIC,KACb,CACL,MAAQR,GAAQ,CACd,IAAIS,EAEJ,QAAWL,KAAWI,EAAU,CAC9B,IAAMF,EAASF,EAAQ,MAAMJ,CAAI,EAG7BM,IAAW,KAKXG,GAAW,MAAQH,EAAO,OAASG,EAAQ,UAC7CA,EAAUH,EAEd,CAEA,OAAIG,GACK,EAIX,IAOSC,EAAM,IAAIF,KACd,CACL,MAAQR,GAAQ,CACd,QAAWI,KAAWI,EAAU,CAE9B,IAAMF,EAASF,EAAQ,MAAMJ,CAAI,EAGjC,GAAIM,IAAW,GACb,MAAO,GAGTN,EAAOM,CACT,CAEA,OAAON,CACT,IAOE,SAAUW,KAAQH,EAAmB,CACzC,SAASI,EAAOC,EAAc,CAC5B,GAAIA,GAAM,KACR,MAAO,GAGT,IAAIC,EAAQD,EAAG,cAAa,EAE5B,QAAWT,KAAWI,EAAU,CAC9B,IAAMF,EAASF,EAAQ,MAAMU,CAAK,EAElC,GAAIR,IAAW,GACb,MAAO,GAGTQ,EAAQR,CACV,CAEA,OAAOQ,CACT,CAEA,SAASL,EAASI,EAAc,CAG9B,OAFeD,EAAMC,CAAE,IAEL,EACpB,CAEA,SAASE,EAAYF,EAAc,CACjC,IAAMP,EAASM,EAAMC,CAAE,EAEvB,OAAIP,IAAW,GACN,GAGFA,EAAO,SAAW,CAC3B,CAEA,MAAO,CACL,SAAAE,EACA,QAAAC,EACA,WAAAM,EAEJ,CCzGA,IAAMC,GAAWC,EAAM,GAAQ,EAElBC,GAAUC,EAAIH,EAAQ,EAK7BI,GAAQH,EAAM,EAAS,EACvBI,GAAQJ,EAAM,EAAS,EACvBK,GAAWL,EAAM,EAAY,EAC7BM,GAAON,EAAM,EAAQ,EAgBdO,GAAOL,EAAIC,GAAOK,EAASR,EAAM,GAAQ,CAAC,CAAC,EAgB3CS,GAAOP,EAAIE,GAAOI,EAASR,EAAM,GAAQ,CAAC,CAAC,EAiB3CU,GAAUR,EAAIG,GAAUG,EAASR,EAAM,GAAQ,CAAC,CAAC,EAiBjDW,GAAMT,EAAIU,EAAGN,GAAMD,GAAUF,GAAOC,EAAK,EAAGI,EAASR,EAAM,GAAQ,CAAC,CAAC,EAE5Ea,GAAOC,EACXd,EAAM,CAAQ,EACdQ,EAASR,EAAM,EAAW,CAAC,CAAC,EAExBe,GAAOD,EACXN,EAASR,EAAM,EAAY,CAAC,EAC5BA,EAAM,EAAQ,EACdQ,EAASR,EAAM,EAAW,CAAC,CAAC,EAExBgB,GAAMJ,EAAGC,GAAME,EAAI,EAEnBE,GAAgBL,EAAGI,GAAKV,GAAMH,GAAOC,GAAOC,EAAQ,EAiB7Ca,GAAehB,EAAIU,EAAGI,GAAKF,EAAIF,EAAGN,GAAMD,GAAUF,GAAOC,EAAK,EAAGI,EAASR,EAAM,GAAQ,CAAC,CAAC,CAAC,CAAC,EAkB5FmB,GAAMjB,EAAIW,EAAI,EAkBdO,GAAMlB,EAAIa,EAAI,EAedM,GAAKnB,EAAIc,EAAG,EAEnBM,GAAOR,EAAIG,GAAejB,EAAM,CAAQ,CAAC,EACzCuB,GAAOT,EAAIG,GAAejB,EAAM,GAAQ,CAAC,EAclCwB,GAAMtB,EAAIY,EAAIQ,GAAMd,EAASR,EAAM,GAAQ,CAAC,CAAC,CAAC,EAc9CyB,GAAMvB,EAAIqB,EAAI,EAErBG,GAAQZ,EAAIS,GAAMI,EAAK,GAAS,EAAGnB,EAASR,EAAM,GAAQ,CAAC,CAAC,EAC5D4B,GAAWd,EAAIS,GAAMI,EAAK,GAAY,EAAGnB,EAASR,EAAM,GAAQ,CAAC,CAAC,EAElE6B,GAAgBjB,EAAGc,GAAOE,EAAQ,EAc3BE,GAAO5B,EAAIwB,EAAK,EAchBK,GAAU7B,EAAI0B,EAAQ,EAE7BI,GAAOpB,EACXK,GACAK,GACAC,GACAG,GACAE,EAAQ,EAGJK,GAAcrB,EAClBE,EAAIkB,GAAML,EAAK,GAAO,EAAGnB,EAASR,EAAM,GAAQ,CAAC,CAAC,CAAC,EAexCkC,GAAahC,EAAI+B,EAAW,EAEnCE,GAAoBvB,EACxBE,EAAIkB,GAAML,EAAK,GAAQ,EAAGnB,EAASR,EAAM,GAAQ,CAAC,CAAC,EACnDc,EAAIkB,GAAML,EAAK,GAAQ,EAAGnB,EAASR,EAAM,GAAQ,CAAC,EAAG2B,EAAK,GAAO,EAAGnB,EAASR,EAAM,GAAQ,CAAC,CAAC,CAAC,EAenFoC,GAAmBlC,EAAIiC,EAAiB,EAE/CE,GAAgBvB,EAAIS,GAAMI,EAAK,GAAkB,EAAGnB,EAASR,EAAM,GAAa,CAAC,EAAGQ,EAASR,EAAM,GAAa,CAAC,EAAGQ,EAASR,EAAM,GAAQ,CAAC,CAAC,EActIsC,GAAepC,EAAImC,EAAa,EAEvCE,GAAgBzB,EAAIc,GAAUD,EAAK,GAAiB,EAAGnB,EAASR,EAAM,GAAa,CAAC,EAAGQ,EAASR,EAAM,GAAa,CAAC,EAAGQ,EAASR,EAAM,GAAQ,CAAC,CAAC,EAczIwC,GAAetC,EAAIqC,EAAa,EAEvCE,GAAO7B,EACXqB,GACAE,GACArB,EAAIQ,GAAMd,EAASR,EAAM,GAAQ,CAAC,CAAC,EACnCc,EAAIe,GAAerB,EAASR,EAAM,GAAQ,CAAC,CAAC,EAC5Cc,EAAIG,GAAeT,EAASR,EAAM,GAAQ,CAAC,CAAC,EAC5CqC,GACAE,GACAvC,EAAM,GAAQ,CAAC,EAeJ0C,GAAMxC,EAAIuC,EAAI,EAErBE,GAAW7B,EAAIN,EAASiC,EAAI,EAAGd,EAAK,GAAgB,EAAGiB,GAAIjB,EAAK,GAAW,CAAC,EAAGnB,EAASR,EAAM,GAAQ,CAAC,CAAC,EAcjG6C,GAAU3C,EAAIyC,EAAQ,EAE7BG,GAAUlC,EACdE,EAAI2B,GAAMd,EAAK,GAAgB,EAAGA,EAAK,GAAW,EAAGnB,EAASR,EAAM,GAAQ,CAAC,CAAC,EAC9Ec,EAAI2B,GAAMd,EAAK,GAAW,EAAGnB,EAASR,EAAM,GAAQ,CAAC,CAAC,EACtDc,EAAIa,EAAK,GAAW,EAAGnB,EAASR,EAAM,GAAQ,CAAC,CAAC,CAAC,EAetC+C,GAAS7C,EAAI4C,EAAO,EAE3BE,GAAQlC,EAAIG,GAAeL,EAC/BE,EAAId,EAAM,EAAU,IAAI,CAAC,EACzBc,EAAId,EAAM,CAAQ,EAAG2B,EAAK,GAAS,CAAC,EACpCA,EAAK,GAAS,CAAC,EACdnB,EAASR,EAAM,GAAc,CAAC,EAAGQ,EAASR,EAAM,GAAQ,CAAC,CAAC,EAehDiD,GAAO/C,EAAI8C,EAAK,EAEvBE,GAASpC,EAAIG,GAAeL,EAChCE,EAAId,EAAM,EAAU,KAAK,CAAC,EAC1Bc,EAAId,EAAM,EAAU,KAAK,EAAG2B,EAAK,GAAS,CAAC,EAC3Cb,EAAId,EAAM,CAAQ,EAAG2B,EAAK,GAAU,CAAC,EACrCb,EAAId,EAAM,CAAQ,EAAG2B,EAAK,GAAQ,EAAGA,EAAK,GAAS,CAAC,EACpDb,EAAIa,EAAK,GAAQ,EAAGA,EAAK,GAAS,CAAC,EACnCA,EAAK,GAAQ,EACbA,EAAK,GAAU,CAAC,EACfnB,EAASR,EAAM,GAAc,CAAC,EAAGQ,EAASR,EAAM,GAAQ,CAAC,CAAC,EAehDmD,GAAQjD,EAAIgD,EAAM,EAEzBE,GAAUxC,EACdE,EAAId,EAAM,GAAW,EAAGQ,EAASR,EAAM,GAAQ,CAAC,CAAC,CAAC,EAevCqD,GAASnD,EAAIkD,EAAO,EAE3BE,GAAQ1C,EACZE,EAAId,EAAM,GAAS,EAAGQ,EAASR,EAAM,GAAQ,CAAC,CAAC,CAAC,EAerCuD,GAAOrD,EAAIoD,EAAK,EC1gB7B,IAAME,GAAmBC,GAAW,CACnC,IAAMC,EAAcD,EAAQ,kBAAoBA,EAAQ,IAAMA,EAAQ,YAChEE,EAAiBF,EAAQ,qBAAuBA,EAAQ,KAAOA,EAAQ,eAE7E,GAAI,CAACC,GAAe,CAACC,EACpB,MAAM,IAAI,UAAU,2BAA2B,EAGhD,MAAO,CACN,YAAaD,EAAY,KAAKD,CAAO,EACrC,eAAgBE,EAAe,KAAKF,CAAO,CAC5C,CACD,EAEO,SAASG,GAAeH,EAASI,EAAOC,EAAS,CACvD,IAAIC,EACEC,EAAc,IAAI,QAAQ,CAACC,EAASC,IAAW,CASpD,GARAJ,EAAU,CACT,gBAAiB,CAAC,OAAO,EACzB,UAAW,GACX,mBAAoB,GACpB,mBAAoB,GACpB,GAAGA,CACJ,EAEI,EAAEA,EAAQ,OAAS,IAAMA,EAAQ,QAAU,OAAO,mBAAqB,OAAO,UAAUA,EAAQ,KAAK,IACxG,MAAM,IAAI,UAAU,iDAAiD,EAGtEA,EAAQ,QAAQ,eAAe,EAG/B,IAAMK,EAAS,CAACN,CAAK,EAAE,KAAK,EAEtBO,EAAQ,CAAC,EACT,CAAC,YAAAV,EAAa,eAAAC,CAAc,EAAIH,GAAiBC,CAAO,EAExDY,EAAS,SAAUC,IAAe,CACvC,IAAMC,EAAQT,EAAQ,UAAYQ,EAAaA,EAAW,CAAC,EAE3D,GAAIR,EAAQ,OACX,GAAI,CACH,GAAI,CAAE,MAAMA,EAAQ,OAAOS,CAAK,EAC/B,MAEF,OAASC,EAAO,CACfT,EAAO,EACPG,EAAOM,CAAK,EACZ,MACD,CAGDJ,EAAM,KAAKG,CAAK,EAEZT,EAAQ,QAAUM,EAAM,SAC3BL,EAAO,EACPE,EAAQG,CAAK,EAEf,EAEMK,EAAgB,IAAIH,IAAe,CACxCP,EAAO,EACPG,EAAOJ,EAAQ,mBAAqBQ,EAAaA,EAAW,CAAC,CAAC,CAC/D,EAEAP,EAAS,IAAM,CACd,QAAWF,KAASM,EACnBR,EAAeE,EAAOQ,CAAM,EAG7B,QAAWK,KAAkBZ,EAAQ,gBAE/BK,EAAO,SAASO,CAAc,GAClCf,EAAee,EAAgBD,CAAa,CAG/C,EAEA,QAAWZ,KAASM,EACnBT,EAAYG,EAAOQ,CAAM,EAG1B,QAAWK,KAAkBZ,EAAQ,gBAG/BK,EAAO,SAASO,CAAc,GAClChB,EAAYgB,EAAgBD,CAAa,EAIvCX,EAAQ,QACXA,EAAQ,OAAO,iBAAiB,QAAS,IAAM,CAC9CW,EAAcX,EAAQ,OAAO,MAAM,CACpC,EAAG,CAAC,KAAM,EAAI,CAAC,EAGZA,EAAQ,oBACXG,EAAQG,CAAK,CAEf,CAAC,EAID,GAFAJ,EAAY,OAASD,EAEjB,OAAOD,EAAQ,SAAY,SAAU,CACxC,IAAMa,EAAUC,GAASZ,EAAa,CAAC,aAAcF,EAAQ,OAAO,CAAC,EAErE,OAAAa,EAAQ,OAAS,IAAM,CACtBZ,EAAO,EACPY,EAAQ,MAAM,CACf,EAEOA,CACR,CAEA,OAAOX,CACR,CAEO,SAASa,GAAOpB,EAASI,EAAOC,EAAS,CAC3C,OAAOA,GAAY,aACtBA,EAAU,CAAC,OAAQA,CAAO,GAG3BA,EAAU,CACT,GAAGA,EACH,MAAO,EACP,mBAAoB,EACrB,EAEA,IAAMgB,EAAelB,GAAeH,EAASI,EAAOC,CAAO,EACrDiB,EAAUD,EAAa,KAAKE,GAASA,EAAM,CAAC,CAAC,EACnD,OAAAD,EAAQ,OAASD,EAAa,OAEvBC,CACR,CC5HM,SAAUE,GAAUC,EAAkCC,EAAY,CACtE,IAAIC,EAEEC,EAAS,UAAA,CACb,IAAMC,EAAQ,UAAA,CACZF,EAAU,OACLF,EAAI,CACX,EAEA,aAAaE,CAAO,EACpBA,EAAU,WAAWE,EAAOH,CAAI,CAClC,EACA,OAAAE,EAAO,MAAQ,IAAW,CAAE,EAC5BA,EAAO,KAAO,IAAW,CACvB,aAAaD,CAAO,CACtB,EAEOC,CACT,CCRM,IAAOE,GAAP,cAA8B,KAAK,CACvC,OAAO,KAAO,iBAEd,YAAaC,EAAkB,qBAAoB,CACjD,MAAMA,CAAO,EACb,KAAK,KAAO,gBACd,GCrBI,IAAOC,GAAP,KAAmB,CAChB,SACA,OACA,WAEP,YAAaC,EAA4D,CACvE,KAAK,OAASA,GAAS,OACvB,KAAK,WAAaA,GAAS,WAC3B,KAAK,SAAWC,GAAM,EAEtB,KAAK,QAAU,KAAK,QAAQ,KAAK,IAAI,EACrC,KAAK,QAAQ,iBAAiB,QAAS,KAAK,OAAO,CACrD,CAEA,SAAO,CACL,KAAK,SAAS,OAAO,KAAK,QAAQ,QAAU,IAAIC,CAAY,CAC9D,CAEA,SAAO,CACL,KAAK,QAAQ,oBAAoB,QAAS,KAAK,OAAO,CACxD,GCfF,SAASC,IAAQ,CACf,MAAO,GAAI,SAAS,OAAO,KAAK,OAAM,EAAK,GAAG,EAAG,EAAE,EAAG,SAAQ,CAAE,GAAG,KAAK,IAAG,CAAE,EAC/E,CAQM,IAAOC,GAAP,KAAU,CACP,GACA,GACA,QACA,WACA,OACS,SACC,WACT,oBAER,YAAaC,EAAqDC,EAAY,CAC5E,KAAK,GAAKH,GAAQ,EAClB,KAAK,OAAS,SACd,KAAK,GAAKE,EACV,KAAK,QAAUC,EACf,KAAK,WAAa,CAAA,EAClB,KAAK,SAAW,CACd,QAAS,KAAK,IAAG,GAGnB,KAAK,WAAa,IAAI,gBACI,KAAK,WAAW,OAE1C,KAAK,oBAAsB,GAE3B,KAAK,QAAU,KAAK,QAAQ,KAAK,IAAI,CACvC,CAEA,MAAOC,EAAU,CACf,KAAK,WAAW,MAAMA,CAAG,CAC3B,CAEA,SAAO,CACc,KAAK,WAAW,OAAO,CAACC,EAAKC,IACvCD,GAAQC,EAAK,QAAQ,UAAY,GACvC,EAAI,IAIL,KAAK,WAAW,MAAM,IAAIC,CAAY,EACtC,KAAK,QAAO,EAEhB,CAEA,MAAM,KAAMJ,EAA4D,CACtE,IAAMK,EAAY,IAAIC,GAA4BN,CAAO,EACzD,YAAK,WAAW,KAAKK,CAAS,EAE9BL,GAAS,QAAQ,iBAAiB,QAAS,KAAK,OAAO,EAEhDK,EAAU,SAAS,OAC5B,CAEA,MAAM,KAAG,CACP,KAAK,OAAS,UACd,KAAK,SAAS,QAAU,KAAK,IAAG,EAEhC,GAAI,CACF,KAAK,WAAW,OAAO,eAAc,EAErC,IAAME,EAAS,MAAMC,GAAW,KAAK,GAAG,CACtC,GAAI,KAAK,SAAW,CAAA,EACpB,OAAQ,KAAK,WAAW,OACxB,WAAaC,GAAkB,CAG7B,GAAI,MAAK,oBAIT,MAAK,oBAAsB,GAE3B,GAAI,CACF,KAAK,WAAW,QAAQJ,GAAY,CAClCA,EAAU,aAAaI,CAAG,CAC5B,CAAC,CACH,SACE,KAAK,oBAAsB,EAC7B,EACF,EACD,EAAG,KAAK,WAAW,MAAM,EAE1B,KAAK,WAAW,QAAQJ,GAAY,CAClCA,EAAU,SAAS,QAAQE,CAAM,CACnC,CAAC,EAED,KAAK,OAAS,UAChB,OAASN,EAAK,CACZ,KAAK,WAAW,QAAQI,GAAY,CAClCA,EAAU,SAAS,OAAOJ,CAAG,CAC/B,CAAC,EAED,KAAK,OAAS,SAChB,SACE,KAAK,SAAS,SAAW,KAAK,IAAG,EACjC,KAAK,QAAO,CACd,CACF,CAEA,SAAO,CACL,KAAK,WAAW,QAAQI,GAAY,CAClCA,EAAU,QAAO,EACjBA,EAAU,QAAQ,oBAAoB,QAAS,KAAK,OAAO,CAC7D,CAAC,CACH,GCJI,IAAOK,GAAP,cAAgHC,EAAyD,CACtK,YACA,QACA,MACC,QACS,KACT,OAER,YAAaC,EAA6C,CAAA,EAAE,CAC1D,MAAK,EAEL,KAAK,YAAcA,EAAK,aAAe,OAAO,kBAC9C,KAAK,QAAUA,EAAK,SAAW,OAAO,kBACtC,KAAK,QAAU,EACf,KAAK,OAAS,GAEVA,EAAK,YAAc,MACrBA,EAAK,SAAS,oBAAoBA,EAAK,WAAY,CACjD,UAAW,KACF,CACL,KAAM,KAAK,MAAM,OACjB,QAAS,KAAK,QACd,OAAQ,KAAK,MAAM,OAAS,KAAK,UAGtC,EAGH,KAAK,KAAOA,EAAK,KACjB,KAAK,MAAQ,CAAA,EAEb,KAAK,UAAYC,GAAS,KAAK,UAAU,KAAK,IAAI,EAAG,CAAC,EACtD,KAAK,SAAWA,GAAS,KAAK,SAAS,KAAK,IAAI,EAAG,CAAC,CACtD,CAEA,WAAS,CACH,KAAK,OAAS,GAIlB,KAAK,kBAAkB,OAAO,CAChC,CAEA,UAAQ,CACF,KAAK,UAAY,GAIrB,KAAK,kBAAkB,MAAM,CAC/B,CAEA,OAAK,CACH,KAAK,OAAS,EAChB,CAEA,QAAM,CACC,KAAK,SAIV,KAAK,OAAS,GACd,KAAK,kBAAiB,EACxB,CAEQ,mBAAiB,CACvB,GAAI,KAAK,OACP,MAAO,GAGT,GAAI,KAAK,OAAS,EAChB,YAAK,UAAS,EAEV,KAAK,UAAY,GACnB,KAAK,SAAQ,EAGR,GAGT,GAAI,KAAK,QAAU,KAAK,YAAa,CACnC,IAAIC,EAEJ,QAAWC,KAAK,KAAK,MACnB,GAAIA,EAAE,SAAW,SAAU,CACzBD,EAAMC,EACN,KACF,CAGF,OAAID,GAAO,KACF,IAGT,KAAK,kBAAkB,QAAQ,EAE/B,KAAK,UAEAA,EAAI,IAAG,EACT,QAAQ,IAAK,CAEZ,QAASE,EAAI,EAAGA,EAAI,KAAK,MAAM,OAAQA,IACrC,GAAI,KAAK,MAAMA,CAAC,IAAMF,EAAK,CACzB,KAAK,MAAM,OAAOE,EAAG,CAAC,EACtB,KACF,CAGF,KAAK,UACL,KAAK,kBAAiB,EACtB,KAAK,kBAAkB,MAAM,CAC/B,CAAC,EAEI,GACT,CAEA,MAAO,EACT,CAEQ,QAASF,EAAmC,CAClD,KAAK,MAAM,KAAKA,CAAG,EAEf,KAAK,MAAQ,MACf,KAAK,MAAM,KAAK,KAAK,IAAI,CAE7B,CAKA,MAAM,IAAKG,EAA4CC,EAAoB,CAGzE,GAFAA,GAAS,QAAQ,eAAc,EAE3B,KAAK,OAAS,KAAK,QACrB,MAAM,IAAIC,GAGZ,IAAML,EAAM,IAAIM,GAA+BH,EAAIC,CAAO,EAC1D,KAAK,QAAQJ,CAAG,EAChB,KAAK,kBAAkB,KAAK,EAE5B,IAAMO,EAASP,EAAI,KAAKI,CAAO,EAC5B,KAAKG,IACJ,KAAK,kBAAkB,YAAa,CAAE,OAAQA,CAAM,CAAE,EACtD,KAAK,kBAAkB,UAAW,CAAE,OAAQ,CAAE,IAAAP,EAAK,OAAAO,CAAM,CAAE,CAAE,EAEtDA,EACR,EACA,MAAMC,GAAM,CACX,GAAIR,EAAI,SAAW,UAEjB,QAAS,EAAI,EAAG,EAAI,KAAK,MAAM,OAAQ,IACrC,GAAI,KAAK,MAAM,CAAC,IAAMA,EAAK,CACzB,KAAK,MAAM,OAAO,EAAG,CAAC,EACtB,KACF,EAIJ,WAAK,kBAAkB,UAAW,CAAE,OAAQ,CAAE,IAAAA,EAAK,MAAOQ,CAAG,CAAE,CAAE,EAE3DA,CACR,CAAC,EAEH,YAAK,kBAAiB,EAEfD,CACT,CAKA,OAAK,CACH,KAAK,MAAM,OAAO,EAAG,KAAK,MAAM,MAAM,CACxC,CAKA,OAAK,CACH,KAAK,MAAM,QAAQP,GAAM,CACvBA,EAAI,MAAM,IAAIS,CAAY,CAC5B,CAAC,EAED,KAAK,MAAK,CACZ,CAOA,MAAM,QAASL,EAAsB,CAE/B,KAAK,OAAS,GAIlB,MAAMM,GAAO,KAAM,QAASN,CAAO,CACrC,CAaA,MAAM,eAAgBO,EAAeP,EAAsB,CAErD,KAAK,KAAOO,GAIhB,MAAMD,GAAO,KAAM,OAAQ,CACzB,GAAGN,EACH,OAAQ,IAAM,KAAK,KAAOO,EAC3B,CACH,CAUA,MAAM,OAAQP,EAAsB,CAE9B,KAAK,UAAY,GAAK,KAAK,OAAS,GAIxC,MAAMM,GAAO,KAAM,OAAQN,CAAO,CACpC,CAKA,IAAI,MAAI,CACN,OAAO,KAAK,MAAM,MACpB,CAKA,IAAI,QAAM,CACR,OAAO,KAAK,MAAM,OAAS,KAAK,OAClC,CAKA,IAAI,SAAO,CACT,OAAO,KAAK,OACd,CAYA,MAAQ,YAAaA,EAAsB,CACzCA,GAAS,QAAQ,eAAc,EAE/B,IAAMQ,EAASC,GAAwB,CACrC,WAAY,GACb,EAEKC,EAAWN,GAAqB,CAChCA,GAAO,KACT,KAAK,MAAK,EAEV,KAAK,MAAK,EAGZI,EAAO,IAAIJ,CAAG,CAChB,EAEMO,EAAsBC,GAAyC,CAC/DA,EAAI,QAAU,MAChBJ,EAAO,KAAKI,EAAI,MAAM,CAE1B,EAEMC,EAAkBD,GAAsE,CAC5FF,EAAQE,EAAI,OAAO,KAAK,CAC1B,EAEME,EAAc,IAAW,CAC7BJ,EAAO,CACT,EAGMK,EAAgB,IAAW,CAC/BL,EAAQ,IAAIL,EAAW,eAAe,CAAC,CACzC,EAGA,KAAK,iBAAiB,YAAaM,CAAkB,EACrD,KAAK,iBAAiB,UAAWE,CAAc,EAC/C,KAAK,iBAAiB,OAAQC,CAAW,EACzCd,GAAS,QAAQ,iBAAiB,QAASe,CAAa,EAExD,GAAI,CACF,MAAQP,CACV,SAEE,KAAK,oBAAoB,YAAaG,CAAkB,EACxD,KAAK,oBAAoB,UAAWE,CAAc,EAClD,KAAK,oBAAoB,OAAQC,CAAW,EAC5Cd,GAAS,QAAQ,oBAAoB,QAASe,CAAa,EAG3DL,EAAO,CACT,CACF,GC9bI,IAAOM,GAAP,cAA0C,KAAK,CACnD,OAAO,KAAO,6BAEd,YAAaC,EAAU,+BAA8B,CACnD,MAAMA,CAAO,EACb,KAAK,KAAO,4BACd,GC0BI,IAAgBC,GAAhB,cAAqGC,EAAoD,CAErJ,0BACS,SACA,QACP,IACA,OACO,aACA,aACD,UACC,eACA,iBACA,kBAEjB,YAAaC,EAAuCC,EAAkC,CACpF,MAAK,EAGL,KAAK,QAAUA,EAAK,KACpB,KAAK,OAASD,EAAW,OACzB,KAAK,IAAMA,EAAW,OAAO,aAAa,KAAK,OAAO,EACtD,KAAK,SAAW,IAAI,IACpB,KAAK,aAAeC,EAAK,cAAgB,EACzC,KAAK,aAAeA,EAAK,cAAgB,EACzC,KAAK,kBAAoBA,EAAK,mBAAqB,IACnD,KAAK,UAAY,CAAA,EACjB,KAAK,eAAiBC,GAA2B,KAAK,YAAY,EAClE,KAAK,iBAAmB,CAAC,GAAID,EAAK,WAAa,CAAA,CAAG,CACpD,CAEA,MAAM,SAAUE,EAAUC,EAA8D,CAAA,EAAE,CAExF,IAAMC,EAASC,GAAO,OAAOH,EAAI,UAAU,KAAK,EAC1CI,EAAc,KAAK,SAAS,IAAIF,CAAM,EAE5C,GAAIE,GAAe,KACjB,YAAK,IAAI,+BAAgCJ,CAAG,EAC5CI,EAAY,YACLA,EAAY,QAGrB,IAAMC,EAAwCC,GAAM,EAC9CC,EAAU,CACd,QAASF,EAAS,QAClB,UAAW,EACX,YAAaN,GAA2B,KAAK,iBAAiB,GAEhE,KAAK,SAAS,IAAIG,EAAQK,CAAO,EAGjC,IAAIC,EAAQ,GAER,KAAK,2BAA6B,OACpCA,EAAQ,GACR,KAAK,IAAM,KAAK,OAAO,aAAa,GAAG,KAAK,OAAO,IAAIR,CAAG,EAAE,EAC5D,KAAK,0BAA4B,KAAK,cAAcA,EAAK,KAAK,aAAcC,CAAO,GAGrF,IAAIQ,EAAa,GAKXC,EAAQ,IAAIC,GAA4E,CAC5F,YAAa,KAAK,aACnB,EACDD,EAAM,iBAAiB,UAAYE,GAAO,CACxC,KAAK,IAAI,MAAM,yDAA0DA,EAAI,OAAO,IAAI,QAAQ,SAAUA,EAAI,OAAO,KAAK,EAC1H,KAAK,MAAMA,EAAI,OAAO,IAAI,QAAQ,QAAQ,CAC5C,CAAC,EACDF,EAAM,iBAAiB,UAAYE,GAAO,CAExCH,EAAa,GACbJ,EAAS,QAAQO,EAAI,OAAO,MAAM,CACpC,CAAC,EACDF,EAAM,iBAAiB,OAAQ,IAAK,CAClC,GAAID,EAAY,CACd,KAAK,IAAI,MAAM,2BAA2B,EAE1C,MACF,CAEA,GAAIR,EAAQ,QAAQ,UAAY,GAAM,CACpC,KAAK,IAAI,MAAM,8BAA8B,EAC7C,MACF,CAGA,QAAQ,QAAO,EACZ,KAAK,SAAW,CACf,KAAK,IAAI,+DAAgED,CAAG,EAG5E,QAASa,EAAI,EAAGA,EAAI,KAAK,cACnB,KAAK,UAAU,SAAW,EADOA,IAAK,CAK1C,IAAMC,EAAW,KAAK,UAAU,KAAK,MAAM,KAAK,OAAM,EAAK,KAAK,UAAU,MAAM,CAAC,EACjF,KAAK,MAAMA,CAAQ,CACrB,CAGA,MAAM,KAAK,cAAcd,EAAK,KAAK,aAAcC,CAAO,EAGxD,KAAK,IAAI,uCAAwCD,CAAG,EACpD,KAAK,SAAS,OAAOE,CAAM,EAC3BG,EAAS,QAAQ,MAAM,KAAK,SAASL,EAAKC,CAAO,CAAC,CACpD,CAAC,EACA,MAAMc,GAAM,CACX,KAAK,IAAI,MAAM,2CAA4Cf,EAAKe,CAAG,EACnEV,EAAS,OAAOU,CAAG,CACrB,CAAC,CACL,CAAC,EAED,IAAMC,EAA8BC,GAAsC,CACxE,IAAMC,EAAY,KAAK,YAAYD,EAAM,MAAM,EAE3CV,EAAQ,YAAY,IAAIW,CAAS,IAIrCX,EAAQ,YAAY,IAAIW,CAAS,EAGjC,KAAK,+BAA+BlB,EAAKiB,EAAM,OAAQhB,CAAO,EAE9DS,EAAM,IAAI,SACD,KAAK,cAAcV,EAAKiB,EAAM,OAAQhB,CAAO,EACnD,CACD,SAAUgB,EAAM,OACjB,EACE,MAAMF,GAAM,CACPd,EAAQ,QAAQ,UAAY,IAMhC,KAAK,IAAI,MAAM,6CAA8CD,EAAKe,CAAG,CACvE,CAAC,EACL,EAKA,GAFA,KAAK,iBAAiB,WAAYC,CAA0B,EAExDR,EACF,GAAI,CACF,MAAMW,GAAW,KAAK,0BAA2BlB,EAAQ,MAAM,EAE3DO,GACF,KAAK,IAAI,qCAAsCR,CAAG,CAEtD,OAASe,EAAK,CACZ,MAAIP,GACF,KAAK,IAAI,mDAAoDR,EAAKe,CAAG,EAGvE,KAAK,SAAS,OAAOb,CAAM,EAEvBK,EAAQ,UAAY,GAItBF,EAAS,OAAOU,CAAG,EAGfA,CACR,CAIF,QAAQ,IACN,CAAC,GAAG,KAAK,SAAS,EACf,OAAOD,GAAW,CACjB,IAAMI,EAAY,KAAK,YAAYJ,CAAQ,EACrCM,EAAMb,EAAQ,YAAY,IAAIW,CAAS,EAE7C,OAAKE,GACHb,EAAQ,YAAY,IAAI,KAAK,YAAYO,CAAQ,CAAC,EAG7C,CAACM,CACV,CAAC,EACA,IAAI,MAAON,GACHJ,EAAM,IAAI,SAAY,KAAK,cAAcV,EAAKc,EAAUb,CAAO,EAAG,CACvE,SAAAa,EACD,CACF,CAAC,EAEH,MAAMC,GAAM,CACPd,EAAQ,QAAQ,UAAY,IAMhC,KAAK,IAAI,MAAM,6CAA8CD,EAAKe,CAAG,CACvE,CAAC,EAEH,IAAMM,EAAwB,IAAW,CACvChB,EAAS,OAAO,IAAIiB,EAAWrB,EAAQ,QAAQ,QAAU,iBAAiB,CAAC,EAC3ES,EAAM,MAAK,CACb,EAEAT,EAAQ,QAAQ,iBAAiB,QAASoB,CAAqB,EAE/D,GAAI,CACF,OAAO,MAAMhB,EAAS,OACxB,SACE,KAAK,oBAAoB,WAAYW,CAA0B,EAC/Df,EAAQ,QAAQ,oBAAoB,QAASoB,CAAqB,EAClEX,EAAM,MAAK,EACX,KAAK,SAAS,OAAOR,CAAM,CAC7B,CACF,CAEA,MAAOY,EAAkB,CACvB,KAAK,eAAe,IAAI,KAAK,YAAYA,CAAQ,CAAC,EAClD,IAAMS,EAAQ,KAAK,UAAU,UAAUC,GAAQ,KAAK,OAAOA,EAAMV,CAAQ,CAAC,EAEtES,IAAU,IAId,KAAK,UAAU,OAAOA,EAAO,CAAC,CAChC,CAEA,UAAWT,EAAkB,CAC3B,OAAO,KAAK,eAAe,IAAI,KAAK,YAAYA,CAAQ,CAAC,CAC3D,CAEA,YAAaA,EAAkB,CAO7B,MALI,QAAK,UAAU,KAAKU,GAAQ,KAAK,OAAOA,EAAMV,CAAQ,CAAC,GAAK,MAK5D,KAAK,UAAUA,CAAQ,EAK7B,CAEA,MAAM,QAASW,EAAqCxB,EAAsB,CACxE,IAAMa,EAAW,MAAM,KAAK,kBAAkBW,EAAM,iBAAkBxB,CAAO,EAEzEa,GAAY,MAAQ,KAAK,YAAYA,CAAQ,IAIjD,KAAK,UAAU,KAAKA,CAAQ,EAG5B,KAAK,kBAAkB,WAAY,CACjC,OAAQA,EACT,EACH,CAEQ,MAAM,cAAed,EAAU0B,EAAezB,EAA2D,CAC/G,IAAMI,EAAkCC,GAAM,EAC1CqB,EAAQ,EAIZ,OAAK,QAAQ,QAAO,EACjB,KAAK,SAAW,CACf,KAAK,IAAI,8DAA+DD,EAAO,KAAK,aAAc1B,EAAK,KAAK,iBAAiB,MAAM,EAEnI,IAAM4B,EAAO,KAGPC,EAAmB,iBAAgB,CACvC,KAAOD,EAAK,iBAAiB,OAAS,GAAG,CACvC,IAAME,EAAkBF,EAAK,iBAAiB,IAAG,EAEjD,GAAIE,GAAmB,KACrB,SAGF,IAAMhB,EAAW,MAAMc,EAAK,kBAAkBE,EAAiB,SAAU7B,CAAO,EAE5Ea,GAAY,OAIhB,MAAMA,EACR,CACF,EAEMiB,EAAY,iBAAgB,CAChC,MAAQF,EAAgB,EACxB,MAAQD,EAAK,iBAAiB5B,EAAKC,CAAO,CAC5C,EAGA,cAAiBa,KAAYiB,EAAS,EAAI,CACxC,GAAI,KAAK,UAAU,SAAW,KAAK,cAAgB9B,EAAQ,QAAQ,UAAY,GAC7E,MAGF,GAAI,MAAK,YAAYa,CAAQ,IAI7B,KAAK,IAAI,oCAAqCa,EAAO,KAAK,UAAU,MAAM,EAC1E,KAAK,UAAU,KAAKb,CAAQ,EAG5B,KAAK,kBAAkB,WAAY,CACjC,OAAQA,EACT,EAEDa,IAEI,KAAK,UAAU,SAAWD,IAC5B,KAAK,IAAI,sDAAuD,KAAK,UAAU,MAAM,EACrFrB,EAAS,QAAO,GAId,KAAK,UAAU,SAAW,KAAK,cAAc,CAC/C,KAAK,IAAI,6BAA8B,KAAK,UAAU,MAAM,EAC5D,KACF,CACF,CAIA,GAFA,KAAK,IAAI,oEAAqEsB,EAAOD,EAAO,KAAK,UAAU,MAAM,EAE7G,KAAK,UAAU,OAASA,EAC1B,MAAM,IAAIM,GAA2B,SAASL,CAAK,OAAOD,CAAK,IAAI,KAAK,IAAI,kBAAkB1B,CAAG,KAAK,KAAK,UAAU,MAAM,6BAA6B,CAE5J,CAAC,EACA,MAAMe,GAAM,CACX,KAAK,IAAI,MAAM,kEAAmEf,EAAKe,CAAG,EAC1FV,EAAS,OAAOU,CAAG,CACrB,CAAC,EAEIV,EAAS,OAClB,GCpXI,SAAU4B,GAAOC,EAAS,CAC9B,OAAIA,GAAO,KACF,GAGFC,EAAI,MAAMD,CAAG,GAAK,IAC3B,CC8BA,IAAME,GAAoB,CACxB,EACA,GACA,GACA,GACA,IAOF,SAASC,GAAYC,EAAe,CAClC,OAAOC,GAAa,MAAOD,CAAE,GAAG,KAClC,CAEA,SAASE,GAAaF,EAAe,CACnC,IAAMG,EAAOF,GAAa,MAAOD,CAAE,GAAG,MAEtC,OAAIG,GAAQ,KACH,GAGF,IAAIA,CAAI,EACjB,CAEA,SAASF,GAAcG,EAAcJ,EAAe,CAClD,OAAOA,EAAG,KAAKK,GAAaA,EAAU,OAASD,CAAI,CACrD,CAEA,SAASE,GAAQN,EAAe,CAC9B,OAAOA,EAAG,KAAK,CAAC,CAAE,KAAAO,CAAI,IAAOA,IAAS,GAAQ,CAChD,CAEA,SAASC,EAAeC,EAAiBC,EAAiB,CACxD,IAAMC,EAAcC,GAAaH,EAAK,IAAI,EAC1C,GAAIE,GAAe,KACjB,MAAM,IAAI,MAAM,4BAA4BF,EAAK,IAAI,EAAE,EAEzD,IAAMI,EAAUF,EAAYF,EAAMC,CAAI,EACtC,OAAID,EAAK,OAAS,GACT,IAAII,CAAO,IAEbA,CACT,CAEA,IAAMD,GAA4C,CAChD,IAAK,CAACH,EAAMC,IAASD,EAAK,MAC1B,IAAK,CAACA,EAAMC,IACNA,EAAK,SAAW,EACXD,EAAK,MAEP,IAAIA,EAAK,KAAK,IAEvB,IAAK,CAACA,EAAMC,IAAQ,CAClB,IAAMI,EAAOJ,EAAK,IAAG,EACrB,GAAII,GAAQ,KACV,MAAM,IAAI,MAAM,6BAA6B,EAE/C,MAAO,SAASN,EAAcM,EAAMJ,CAAI,CAAC,IAAID,EAAK,KAAK,EACzD,EACA,IAAK,CAACA,EAAMC,IAAQ,CAClB,IAAMI,EAAOJ,EAAK,IAAG,EACrB,GAAII,GAAQ,KACV,MAAM,IAAI,MAAM,6BAA6B,EAE/C,MAAO,SAASN,EAAcM,EAAMJ,CAAI,CAAC,IAAID,EAAK,KAAK,EACzD,EACA,QAAS,CAACA,EAAMC,IAASD,EAAK,MAC9B,KAAM,CAACA,EAAMC,IAASD,EAAK,MAC3B,KAAM,CAACA,EAAMC,IAASD,EAAK,MAC3B,IAAK,CAACA,EAAMC,IAASD,EAAK,MAC1B,KAAM,CAACA,EAAMC,IAAQ,CACnB,IAAMI,EAAOJ,EAAK,IAAG,EACrB,GAAII,GAAQ,KACV,MAAM,IAAI,MAAM,6BAA6B,EAE/C,MAAO,GAAGN,EAAcM,EAAMJ,CAAI,CAAC,EACrC,EACA,IAAK,CAACD,EAAMC,IAAQ,CAClB,IAAMI,EAAOJ,EAAK,IAAG,EACrB,GAAII,GAAQ,KACV,MAAM,IAAI,MAAM,6BAA6B,EAE/C,MAAO,GAAGN,EAAcM,EAAMJ,CAAI,CAAC,EACrC,EACA,KAAM,CAACD,EAAMC,IAAQ,CACnB,IAAMK,EAAWT,GAAOI,CAAI,EACtBM,EAAMjB,GAAWW,CAAI,EACrBP,EAAOD,GAAYQ,CAAI,EAC7B,GAAIK,GAAYC,GAAO,KACrB,MAAO,WAAWA,CAAG,GAAGb,CAAI,GAE9B,IAAMc,EAAWF,EAAW,WAAa,UACnCD,EAAOJ,EAAK,IAAG,EACrB,GAAII,GAAQ,KACV,MAAM,IAAI,MAAM,6BAA6B,EAE/C,IAAII,EAAUV,EAAcM,EAAMJ,CAAI,EAEtC,OAAAQ,EAAUA,GAAS,QAAQ,SAAU,EAAE,EAChC,GAAGD,CAAQ,GAAGC,CAAO,EAC9B,EACA,YAAa,CAACT,EAAMC,IAAQ,CAC1B,IAAMI,EAAOJ,EAAK,IAAG,EACrB,GAAII,GAAQ,KACV,MAAM,IAAI,MAAM,6BAA6B,EAE/C,IAAMI,EAAUV,EAAcM,EAAMJ,CAAI,EAClCS,EAAe,mBAAmBV,EAAK,OAAS,EAAE,EACxD,MAAO,GAAGS,CAAO,GAAGC,CAAY,EAClC,EACA,IAAK,CAACV,EAAMC,IAAQ,CAGlB,IAAMI,EAAOJ,EAAK,IAAG,EACrB,GAAII,GAAQ,KACV,MAAM,IAAI,MAAM,6BAA6B,EAE/C,OAAON,EAAcM,EAAMJ,CAAI,CACjC,EACA,IAAK,CAACD,EAAMC,IAAQ,CAGlB,IAAMI,EAAOJ,EAAK,IAAG,EACrB,GAAII,GAAQ,KACV,MAAM,IAAI,MAAM,6BAA6B,EAE/C,OAAON,EAAcM,EAAMJ,CAAI,CACjC,EACA,MAAO,CAACD,EAAMC,IAAQ,CACpB,IAAMI,EAAOJ,EAAK,IAAG,EACrB,GAAII,GAAQ,KACV,MAAM,IAAI,MAAM,6BAA6B,EAE/C,IAAII,EAAUV,EAAcM,EAAMJ,CAAI,EAEtC,OAAAQ,EAAUA,GAAS,QAAQ,SAAU,EAAE,EAChC,WAAWA,CAAO,EAC3B,EACA,GAAI,CAACT,EAAMC,IAAQ,CACjB,IAAMK,EAAWT,GAAOI,CAAI,EACtBM,EAAMjB,GAAWW,CAAI,EACrBP,EAAOD,GAAYQ,CAAI,EAC7B,GAAIK,GAAYC,GAAO,KACrB,MAAO,SAASA,CAAG,GAAGb,CAAI,GAE5B,IAAMc,EAAWF,EAAW,SAAW,QACjCD,EAAOJ,EAAK,IAAG,EACrB,GAAII,GAAQ,KACV,MAAM,IAAI,MAAM,6BAA6B,EAE/C,IAAII,EAAUV,EAAcM,EAAMJ,CAAI,EAEtC,OAAAQ,EAAUA,GAAS,QAAQ,SAAU,EAAE,EAChC,GAAGD,CAAQ,GAAGC,CAAO,EAC9B,EACA,IAAK,CAACT,EAAMC,IAAQ,CAClB,IAAMI,EAAOJ,EAAK,IAAG,EACrB,GAAII,GAAQ,KACV,MAAM,IAAI,MAAM,6BAA6B,EAE/C,IAAII,EAAUV,EAAcM,EAAMJ,CAAI,EAEtC,OAAAQ,EAAUA,GAAS,QAAQ,SAAU,EAAE,EAChC,SAASA,CAAO,EACzB,GAGI,SAAUE,GAAgBC,EAAwCC,EAAyB,CAE/F,IAAMC,EADKC,GAAUH,CAAK,EACJ,cAAa,EAC7BZ,EAAOc,EAAW,IAAG,EAC3B,GAAId,GAAQ,KACV,MAAM,IAAI,MAAM,6BAA6B,EAG/C,IAAME,EAAcC,GAAaH,EAAK,IAAI,EAE1C,GAAIE,GAAe,KACjB,MAAM,IAAI,MAAM,4BAA4BF,EAAK,IAAI,EAAE,EAGzD,IAAIgB,EAAMd,EAAYF,EAAMc,CAAU,GAAK,GAE3C,OAAID,GAAM,aAAe,IAASxB,GAAkB,SAASW,EAAK,IAAI,IAEpEgB,EAAMA,EAAI,QAAQ,WAAY,EAAE,EAE5BhB,EAAK,QAAU,MACjBgB,EAAM,WAAWA,CAAG,GAEpBA,EAAM,UAAUA,CAAG,KAInBA,EAAI,WAAW,SAAS,GAAKA,EAAI,WAAW,UAAU,GAAKA,EAAI,WAAW,OAAO,GAAKA,EAAI,WAAW,QAAQ,KAE/GA,EAAM,IAAI,IAAIA,CAAG,EAAE,SAAQ,EAGvBA,EAAI,SAAS,GAAG,IAClBA,EAAMA,EAAI,UAAU,EAAGA,EAAI,OAAS,CAAC,IAIlCA,CACT,CCrPA,IAAMC,GAAO,eAEPC,GAAUC,GAAWA,GAAWA,EAAQ,kBAC3C,mBAAmBF,EAAI,SAASA,EAAI,cACpC,GAEGG,EAAK,iGAELC,EAAY,mBAEZC,GAAK;AAAA;AAAA,KAEND,CAAS,WAAWA,CAAS;AAAA,KAC7BA,CAAS,WAAWD,CAAE,KAAKC,CAAS;AAAA,KACpCA,CAAS,YAAYD,CAAE,QAAQC,CAAS;AAAA,KACxCA,CAAS,eAAeA,CAAS,UAAUD,CAAE,QAAQC,CAAS;AAAA,KAC9DA,CAAS,eAAeA,CAAS,UAAUD,CAAE,QAAQC,CAAS;AAAA,KAC9DA,CAAS,eAAeA,CAAS,UAAUD,CAAE,QAAQC,CAAS;AAAA,KAC9DA,CAAS,eAAeA,CAAS,UAAUD,CAAE,QAAQC,CAAS;AAAA,aACtDA,CAAS,UAAUD,CAAE,QAAQC,CAAS;AAAA;AAAA,EAEjD,QAAQ,eAAgB,EAAE,EAAE,QAAQ,MAAO,EAAE,EAAE,KAAK,EAGhDE,GAAW,IAAI,OAAO,OAAOH,CAAE,UAAUE,EAAE,IAAI,EAC/CE,GAAU,IAAI,OAAO,IAAIJ,CAAE,GAAG,EAC9BK,GAAU,IAAI,OAAO,IAAIH,EAAE,GAAG,EAE9BI,GAAUP,GAAWA,GAAWA,EAAQ,MAC3CI,GACA,IAAI,OAAO,MAAML,GAAQC,CAAO,CAAC,GAAGC,CAAE,GAAGF,GAAQC,CAAO,CAAC,QAAQD,GAAQC,CAAO,CAAC,GAAGG,EAAE,GAAGJ,GAAQC,CAAO,CAAC,IAAK,GAAG,EAEpHO,GAAQ,GAAKP,GAAWA,GAAWA,EAAQ,MAAQK,GAAU,IAAI,OAAO,GAAGN,GAAQC,CAAO,CAAC,GAAGC,CAAE,GAAGF,GAAQC,CAAO,CAAC,GAAI,GAAG,EAC1HO,GAAQ,GAAKP,GAAWA,GAAWA,EAAQ,MAAQM,GAAU,IAAI,OAAO,GAAGP,GAAQC,CAAO,CAAC,GAAGG,EAAE,GAAGJ,GAAQC,CAAO,CAAC,GAAI,GAAG,EAE1H,IAAOQ,GAAQD,GClCA,SAARE,GAAiCC,EAAW,CAClD,IAAMC,EAAkB,IAAIC,IAAeF,EAAU,GAAGE,CAAU,EAElE,cAAO,eAAeD,EAAiB,OAAQ,CAC9C,MAAO,mBAAmBD,EAAU,MAAQ,aAAa,IACzD,aAAc,EACf,CAAC,EAEMC,CACR,CAEO,SAASE,IAAiB,CAChC,MAAO,EACR,CCdA,GAAM,CAAC,SAAAC,EAAQ,EAAI,OAAO,UAEX,SAARC,GAA0BC,EAAO,CACvC,OAAOF,GAAS,KAAKE,CAAK,IAAM,iBACjC,CCFA,IAAMC,GAAU,CACf,OAAQ,IACR,WAAY,IACZ,UAAW,IACX,OAAQ,IACR,OAAQ,IACR,QAAS,GACV,EAEe,SAARC,GAA8BC,EAAQC,EAAU,CAAC,EAAG,CAC1D,GAAI,CAACC,GAASF,CAAM,EACnB,MAAM,IAAI,UAAU,4BAA4B,EAGjD,IAAMG,EAAQ,OAAO,KAAKL,EAAO,EAAE,IAAIM,IACrC,OAAOH,EAAQG,CAAI,GAAM,UAAYH,EAAQG,CAAI,EAAIJ,EAAOI,CAAI,GAAKN,GAAQM,CAAI,EAAI,EACtF,EAAE,KAAK,EAAE,EAEJL,EAAe,IAAI,OAAOE,EAAQ,QAAUD,EAAO,OAAQG,CAAK,EAEtE,OAAAJ,EAAa,UAAY,OAAOE,EAAQ,WAAc,SACrDA,EAAQ,UACRD,EAAO,UAEDD,CACR,CCfO,SAASM,GAAQC,EAAOC,EAAQ,CAAC,QAAAC,CAAO,EAAI,CAAC,EAAG,CACtD,GAAI,CACH,OAAOC,GAAgB,IAAMC,GAAYJ,CAAK,EAAE,KAAKC,CAAM,EAAG,CAAC,QAAAC,CAAO,CAAC,EAAE,CAC1E,OAASG,EAAO,CACf,GAAIC,GAAeD,CAAK,EACvB,MAAO,GAGR,MAAMA,CACP,CACD,CCnBA,IAAME,GAAgB,GAChBC,GAAgB,GAEhBC,GAAU,CACf,QAAS,GACV,EAUO,SAASC,GAAOC,EAAQ,CAC9B,OAAIA,EAAO,OAASC,GACZ,GAGDC,GAAQC,GAAQ,GAAG,CAAC,MAAO,EAAI,CAAC,EAAGH,EAAQI,EAAO,CAC1D,CAEO,SAASC,GAAOL,EAAQ,CAC9B,OAAIA,EAAO,OAASM,GACZ,GAGDJ,GAAQC,GAAQ,GAAG,CAAC,MAAO,EAAI,CAAC,EAAGH,EAAQI,EAAO,CAC1D,CCWA,IAAMG,GAAkC,CACtC,KAAM,KACN,MAAO,MACP,GAAI,KACJ,IAAK,OAGDC,GAAkB,CAAC,OAAQ,QAAS,KAAM,KAAK,EAyB/C,SAAUC,GAAgBC,EAAgBC,EAA2B,CACzEA,EAAOA,GAAQ,CAAA,EACf,IAAMC,EAAiBD,EAAK,gBAAkB,MACxC,CAAE,OAAAE,EAAQ,SAAAC,EAAU,KAAAC,EAAM,KAAAC,CAAI,EAAKC,GAASP,CAAM,EAClDQ,EAAQ,CACZC,GAAiBL,EAAUF,CAAc,EACzCQ,GAAaL,EAAMF,CAAM,EACzBQ,GAAeR,CAAM,GAGnBG,GAAQ,MACVE,EAAM,KAAKI,GAAaN,CAAI,CAAC,EAG/B,IAAMO,EAAe,IAAML,EACxB,OAAOM,GAAK,EAAQA,CAAE,EAEtB,OAAO,CAACC,EAAGC,IAAMD,EAAE,OAAOC,CAAC,EAAG,CAAA,CAAE,EAChC,KAAK,GAAG,EAEX,OAAOC,GAAUJ,CAAY,CAC/B,CAEA,SAASN,GAAUP,EAAc,CAC/B,GAAM,CAACG,CAAM,EAAIH,EAAO,MAAM,GAAG,EAG5BF,GAAgB,SAASK,CAAM,IAClCH,EAAS,OAASA,EAAO,UAAUG,EAAO,MAAM,GAIlD,GAAI,CAAE,SAAAe,EAAU,SAAAd,EAAU,KAAAC,EAAM,SAAAc,EAAU,OAAAC,CAAM,EAAK,IAAI,IAAIpB,CAAM,EAEnE,GAAIK,GAAQ,MAAQA,IAAS,GAAI,CAC/B,IAAMgB,EAAeC,GAAgBnB,CAAM,EAEvCkB,GAAgB,OAClBhB,EAAOgB,GAILA,GAAgB,MAAQH,IAAa,UAEvCb,EAAO,KAEX,CAEA,IAAIC,EAEJ,OAAIa,GAAY,MAAQA,IAAa,IAAMA,IAAa,MAClDA,EAAS,WAAW,GAAG,IACzBA,EAAWA,EAAS,UAAU,CAAC,GAGjCb,EAAOa,GAGLC,GAAU,MAAQA,IAAW,KAC/Bd,EAAOA,GAAQ,GACfA,GAAQc,GAGH,CAAE,OAAAjB,EAAQ,SAAAC,EAAU,KAAAC,EAAM,KAAAC,CAAI,CACvC,CAEA,SAASG,GAAkBL,EAAkBF,EAAsB,CACjE,GAAI,EAAAE,GAAY,MAAQA,IAAa,IAIrC,IAAImB,GAAOnB,CAAQ,EACjB,MAAO,CAAC,MAAOA,CAAQ,EAGzB,GAAIoB,GAAOpB,CAAQ,EACjB,MAAO,CAAC,MAAOA,CAAQ,EAKzB,GAAIA,EAAS,CAAC,IAAM,IAAK,CACvB,IAAMqB,EAAUrB,EAAS,UAAU,EAAGA,EAAS,OAAS,CAAC,EACzD,GAAIoB,GAAOC,CAAO,EAChB,MAAO,CAAC,MAAOA,CAAO,CAE1B,CAEA,MAAO,CAACvB,EAAgBE,CAAQ,EAClC,CAEA,SAASM,GAAcL,EAAcF,EAAc,CACjD,GAAI,EAAAE,GAAQ,MAAQA,IAAS,IAI7B,OAAIF,IAAW,MACN,CAAC,MAAOE,CAAI,EAGd,CAAC,MAAOA,CAAI,CACrB,CAEA,SAASM,GAAgBR,EAAc,CACrC,GAAIA,EAAO,MAAM,aAAa,GAAK,KAInC,OAAIA,IAAW,QACN,CAAC,WAAW,EAGjBA,IAAW,MACN,CAAC,SAAS,EAGZ,CAACA,CAAM,CAChB,CAEA,SAASS,GAAcN,EAAY,CACjC,GAAI,EAAAA,GAAQ,MAAQA,IAAS,IAI7B,MAAO,CAAC,YAAa,mBAAmBA,CAAI,CAAC,CAC/C,CAEA,SAASgB,GAAiBJ,EAAgB,CACxC,GAAI,EAAAA,GAAY,MAAQA,IAAa,IAAMrB,GAAQqB,CAAQ,GAAK,MAIhE,OAAOrB,GAAQqB,CAAQ,CACzB,CClMM,SAAUQ,GAAyBC,EAAyBC,EAAwBC,EAAmB,CAC3G,OAAOF,EAAW,OAAOG,GAAK,CAC5B,IAAMC,EAAUC,GAAM,WAAWF,CAAE,EAC7BG,EAASC,GAAK,WAAWJ,CAAE,EAEjC,GAAI,CAACC,GAAW,CAACE,EACf,MAAO,GAGT,GAAIF,GAAYH,GAAiBK,EAK/B,OAJIJ,GAIAM,GAAI,QAAQL,CAAE,EACT,GAGFM,GAAUN,CAAE,IAAM,GAK3B,GAAI,CAACF,GAAiBC,EAAY,CAChC,GAAM,CAAE,KAAAQ,CAAI,EAAKC,GAAaR,CAAE,EAEhC,GAAIO,IAAS,aAAeA,IAAS,aAAeA,EAAK,SAAS,YAAY,EAC5E,MAAO,EAEX,CAEA,MAAO,EACT,CAAC,CACH,CAMA,eAAwBE,GAA0BC,EAAUC,EAAkBC,EAAyBd,EAAwBC,EAAqBc,EAA2C,CAAA,EAAE,CAC/L,cAAiBC,KAAYH,EAAQ,cAAcD,EAAKG,CAAO,EAAG,CAEhE,IAAME,EAAgBnB,GAAwBkB,EAAS,WAAYhB,EAAeC,CAAU,EAE5F,GAAIgB,EAAc,SAAW,EAC3B,SAOF,IAAMC,EAAM,IAAI,IAAIC,GAAeF,EAAc,CAAC,CAAC,CAAC,EAEpD,MAAM,IAAIG,GAAiBF,EAAK,CAC9B,OAAAJ,EACA,qBAAsBC,EAAQ,qBAC9B,QAASC,EAAS,QACnB,CACH,CACF,CAaA,eAAsBK,GAAiBC,EAAoBC,EAAmBR,EAAgC,CAC5G,GAAM,CAAE,OAAAS,EAAQ,IAAAC,CAAG,EAAKV,GAAW,CAAA,EAC7BW,EAAgBJ,EAAS,QAAQ,IAAI,gBAAgB,EAC3D,GAAII,GAAiB,KAAM,CACzB,IAAMC,EAAsB,SAASD,EAAe,EAAE,EACtD,GAAIC,EAAsBJ,EACxB,MAAAE,GAAK,MAAM,4DAA6DE,EAAqBJ,CAAS,EAClGD,EAAS,MAAQ,MACnB,MAAMA,EAAS,KAAK,OAAM,EAAG,MAAMM,GAAM,CACvCH,GAAK,MAAM,iEAAkEG,CAAG,CAClF,CAAC,EAEG,IAAI,MAAM,0BAA0BD,CAAmB,gCAAgCJ,CAAS,IAAI,CAE9G,CAEA,IAAMM,EAASP,EAAS,MAAM,UAAS,EACvC,GAAIO,GAAU,KAEZ,MAAM,IAAI,MAAM,+BAA+B,EAGjD,IAAMC,EAAY,IAAIC,GAEtB,GAAI,CACF,OAAa,CACX,GAAIP,GAAQ,UAAY,GACtB,MAAM,IAAI,MAAM,iCAAiC,EAGnD,GAAM,CAAE,KAAAQ,EAAM,MAAAC,CAAK,EAAK,MAAMJ,EAAO,KAAI,EACzC,GAAIG,EACF,MAKF,GAFAF,EAAU,OAAOG,CAAK,EAElBH,EAAU,WAAaP,EAEzB,MAAM,IAAI,MAAM,4CAA4CA,CAAS,eAAeO,EAAU,UAAU,SAAS,CAErH,CACF,SACED,EAAO,OAAM,EACV,MAAMD,GAAM,CACXH,GAAK,MAAM,+BAAgCG,CAAG,CAChD,CAAC,EACA,QAAQ,IAAK,CACZC,EAAO,YAAW,CACpB,CAAC,CACL,CAEA,OAAOC,EAAU,SAAQ,CAC3B,CChIA,IAAMI,GAAmC,KAqC5BC,GAAP,KAAuB,CACX,IACC,KAQjBC,GAAY,EAQZC,GAAU,EAOVC,GAAiB,EAKjBC,GAAa,EAOJC,GAAoB,IAAI,IAEhB,IACA,qBAED,QAEhB,YAAaC,EAAmB,CAAE,OAAAC,EAAQ,qBAAAC,EAAsB,QAAAC,CAAO,EAA8B,CACnG,KAAK,IAAMH,aAAe,IAAMA,EAAM,IAAI,IAAIA,CAAG,EACjD,KAAK,qBAAuBE,EAC5B,KAAK,IAAMD,EAAO,aAAa,wCAAwC,KAAK,IAAI,IAAI,EAAE,EACtF,KAAK,QAAUE,EACf,KAAK,KAAOC,EAAI,SAASX,GAAkCY,GAAS,OAAOC,EAAqB,KAAK,IAAI,SAAQ,CAAE,CAAC,CAAC,CACvH,CAWAC,GAAgBC,EAAQ,CACtB,IAAMC,EAAiBD,EAAI,UAAU,MACrC,OAAOE,GAAO,OAAOD,CAAc,CACrC,CAMA,MAAM,YAAaD,EAAUG,EAA8B,CAAA,EAAE,CAC3D,IAAMC,EAAQ,IAAI,IAAI,KAAK,IAAI,SAAQ,CAAE,EACzCA,EAAM,SAAW,SAASJ,EAAI,SAAQ,CAAE,GACxC,IAAMK,EAAUF,EAAQ,SAAWG,GAMnC,GAFAF,EAAM,OAAS,cAEXD,EAAQ,QAAQ,UAAY,GAC9B,MAAM,IAAI,MAAM,qCAAqCH,CAAG,iBAAiB,KAAK,GAAG,6BAA6B,EAGhH,IAAMO,EAAU,KAAKR,GAAeC,CAAG,EAGjCQ,EAAkB,IAAI,gBACtBC,EAAmB,IAAW,CAClCD,EAAgB,MAAK,CACvB,EACAL,EAAQ,QAAQ,iBAAiB,QAASM,CAAgB,EAE1D,GAAI,CACF,IAAIC,EAAmD,KAAKnB,GAAkB,IAAIgB,CAAO,EACzF,GAAIG,GAAmB,KAAM,CAC3B,KAAKvB,KACL,IAAMwB,EAA8B,CAClC,OAAQH,EAAgB,OACxB,QAAS,CACP,OAAQ,4BAEV,MAAO,eAGHI,EAAuB,KAAK,sBAAwB,KAAO,MAAM,KAAK,qBAAqBD,CAAc,EAAIA,EAE7GE,EAAU,IAAI,QAAQD,EAAQ,OAAO,EAC3C,KAAK,IAAI;;;EAGdA,EAAQ,QAAU,MAAOR,EAAO,CAAC,GAAGS,EAAQ,QAAO,CAAE,EAAE,IAAI,CAAC,CAACC,EAAKC,CAAK,IAAM,GAAGD,CAAG,KAAKC,CAAK,EAAE,EAAE,KAAK;CAAI,CAAC,EAEtGZ,EAAQ,aAAa,IAAIa,EAAqD,6BAA8B,CAC1G,OAAQ,oBACR,KAAM,UACN,SAAU,KAAK,KACf,IAAAhB,EACD,CAAC,EAEFU,EAAkB,MAAMN,EAAM,SAAQ,EAAIQ,CAAO,EAAE,KAAK,MAAOK,GAAO,CAMpE,GALA,KAAK,IAAI;;;EAGhBA,EAAI,OAAQA,EAAI,WAAY,CAAC,GAAGA,EAAI,QAAQ,QAAO,CAAE,EAAE,IAAI,CAAC,CAACH,EAAKC,CAAK,IAAM,GAAGD,CAAG,KAAKC,CAAK,EAAE,EAAE,KAAK;CAAI,CAAC,EAEhG,CAACE,EAAI,GACP,WAAK7B,KACC,IAAI,MAAM,qCAAqCY,CAAG,iBAAiB,KAAK,GAAG,cAAciB,EAAI,MAAM,IAAIA,EAAI,UAAU,EAAE,EAG/Hd,EAAQ,aAAa,IAAIa,EAAuD,+BAAgC,CAC9G,OAAQ,oBACR,KAAM,YACN,SAAU,KAAK,KACf,QAASE,GAAed,EAAM,SAAQ,CAAE,EACxC,IAAAJ,EACD,CAAC,EAEFG,EAAQ,aAAa,IAAIa,EAA0D,mCAAoC,CACrH,OAAQ,oBACR,KAAM,gBACN,SAAU,KAAK,KACf,IAAAhB,EACD,CAAC,EAIF,IAAMmB,EAAO,MAAMC,GAAgBH,EAAKZ,EAAS,CAAE,OAAQG,EAAgB,OAAQ,IAAK,KAAK,GAAG,CAAE,EAElG,OAAAL,EAAQ,aAAa,IAAIa,EAA0D,mCAAoC,CACrH,OAAQ,oBACR,KAAM,gBACN,SAAU,KAAK,KACf,IAAAhB,EACD,CAAC,EAEF,KAAKV,KACE6B,CACT,CAAC,EACD,KAAK5B,GAAkB,IAAIgB,EAASG,CAAe,CACrD,CACA,OAAO,MAAMA,CACf,OAASW,EAAY,CAGnB,MAAIlB,EAAQ,QAAQ,UAAY,GACxB,IAAI,MAAM,8BAA8BH,CAAG,iBAAiB,KAAK,GAAG,cAAc,GAE1F,KAAKZ,KACC,IAAI,MAAM,qCAAqCY,CAAG,MAAMqB,EAAM,OAAO,EAAE,EAC/E,SACElB,EAAQ,QAAQ,oBAAoB,QAASM,CAAgB,EAC7D,KAAKlB,GAAkB,OAAOgB,CAAO,CACvC,CACF,CAUA,aAAW,CAKT,OAAI,KAAKpB,KAAc,EACd,EAGL,KAAKE,GAAiB,EAEjB,KAWF,KAAKC,IAAc,KAAKH,GAAa,KAAKC,GAAU,EAC7D,CAKA,wBAAsB,CACpB,KAAKC,IACP,CAEA,UAAQ,CACN,MAAO,CACL,SAAU,KAAKF,GACf,OAAQ,KAAKC,GACb,cAAe,KAAKC,GACpB,UAAW,KAAKC,GAChB,iBAAkB,KAAKC,GAAkB,KAE7C,CAEA,UAAQ,CACN,MAAO,oBAAoB,KAAK,GAAG,GACrC,GCjQF,IAAM+B,GAAN,cAAsCC,EAAyE,CAC7F,KAAO,4BACN,QACA,cACA,WACA,qBAEjB,YAAaC,EAA+CC,EAA0C,CACpG,MAAMD,EAAY,CAChB,GAAGC,EACH,KAAM,kCACP,EAED,KAAK,QAAUD,EAAW,QAC1B,KAAK,cAAgBC,EAAK,eAAiBC,GAC3C,KAAK,WAAaD,EAAK,YAAcE,GACrC,KAAK,qBAAuBF,EAAK,oBACnC,CAEA,MAAM,cAAeG,EAAUC,EAA4BC,EAA8B,CACvF,KAAK,IAAI,gCAAiCF,EAAKC,EAAS,GAAG,EAE3DC,GAAS,aAAa,IAAIC,EAAoB,2CAA4C,CACxF,YAAa,oBACb,SAAUF,EAAS,IACnB,UAAW,OACX,IAAAD,EACD,CAAC,EAEF,IAAII,EAEJ,GAAI,CACFA,EAAQ,MAAMH,EAAS,YAAYD,EAAKE,CAAO,EAC/C,KAAK,IAAI,MAAM,2BAA4BF,EAAKC,EAAS,GAAG,CAC9D,SACEC,GAAS,aAAa,IAAIC,EAAoB,yCAA0C,CACtF,YAAa,oBACb,SAAUF,EAAS,IACnB,UAAW,OACX,IAAAD,EACD,CAAC,CACJ,CAEA,aAAME,EAAQ,aAAaE,CAAK,EAEzBA,CACT,CAEA,MAAQ,iBAAkBJ,EAAUE,EAAwB,CAAA,EAAE,CAC5D,MAAQG,GAAyBL,EAAK,KAAK,QAAS,KAAK,OAAQ,KAAK,cAAe,KAAK,WAAY,CAAE,GAAGE,EAAS,qBAAsB,KAAK,oBAAoB,CAAE,CACvK,CAEA,YAAaD,EAA0B,CACrC,OAAOA,EAAS,IAAI,SAAQ,CAC9B,CAEA,OAAQK,EAA6BC,EAA2B,CAC9D,OAAOD,EAAU,IAAI,SAAQ,IAAOC,EAAU,IAAI,SAAQ,CAC5D,CAEA,MAAM,kBAAmBN,EAAyCO,EAAiBN,EAAsB,CAGvG,GAFAA,GAAS,QAAQ,eAAc,EAE3BO,GAAMR,CAAQ,EAChB,OAGF,IAAMS,EAAgBC,GAAwB,MAAM,QAAQV,CAAQ,EAAIA,EAAW,CAACA,CAAQ,EAAG,KAAK,cAAe,KAAK,UAAU,EAElI,GAAIS,EAAc,SAAW,EAC3B,OAOF,IAAME,EAAMC,GAAeH,EAAc,CAAC,CAAC,EAE3C,OAAO,IAAII,GAAiBF,EAAK,CAC/B,OAAQ,KAAK,OACb,qBAAsB,KAAK,qBAC3B,QAAAJ,EACD,CACH,CAEA,+BAAgCR,EAAUC,EAA4BC,EAAsE,CAC1IA,GAAS,aAAa,IAAIC,EAA8C,mCAAoC,CAC1G,KAAM,oBACN,IAAAH,EACA,IAAKC,EAAS,IAAI,OAAM,EACxB,QAASA,EAAS,QACnB,CAAC,CACJ,GAGI,SAAUc,GAA+BnB,EAA+CC,EAA0C,CACtI,OAAO,IAAIH,GAAwBE,EAAYC,CAAI,CACrD,CC/EM,IAAOmB,GAAP,KAAkC,CACtB,KAAO,oBACN,cACA,WACA,qBACA,QACA,IACA,OAEjB,YAAaC,EAAmDC,EAAwC,CAAA,EAAE,CACxG,KAAK,IAAMD,EAAW,OAAO,aAAa,sCAAsC,EAChF,KAAK,OAASA,EAAW,OACzB,KAAK,QAAUA,EAAW,QAC1B,KAAK,cAAgBC,EAAK,eAAiBC,GAC3C,KAAK,WAAaD,EAAK,YAAcE,GACrC,KAAK,qBAAuBF,EAAK,oBACnC,CAEA,MAAM,SAAUG,EAAUC,EAAyE,CAAA,EAAE,CACnG,IAAMC,EAA2B,CAAA,EAEjC,cAAiBC,KAAWC,GAAyBJ,EAAK,KAAK,QAAS,KAAK,OAAQ,KAAK,cAAe,KAAK,WAAY,CAAE,GAAGC,EAAS,qBAAsB,KAAK,oBAAoB,CAAE,EAAG,CAC1L,KAAK,IAAI,+BAAgCD,EAAKG,EAAQ,GAAG,EAEzD,GAAI,CACF,IAAME,EAAQ,MAAMF,EAAQ,YAAYH,EAAKC,CAAO,EACpD,KAAK,IAAI,MAAM,2BAA4BD,EAAKG,EAAQ,GAAG,EAE3D,GAAI,CACF,MAAMF,EAAQ,aAAaI,CAAK,CAClC,OAASC,EAAK,CACZ,KAAK,IAAI,MAAM,+CAAgDN,EAAKG,EAAQ,IAAKG,CAAG,EAEpF,QACF,CAEA,OAAOD,CACT,OAASC,EAAc,CAUrB,GATA,KAAK,IAAI,MAAM,0CAA2CN,EAAKG,EAAQ,IAAKG,CAAG,EAE3EA,aAAe,MACjBJ,EAAgB,KAAKI,CAAG,EAExBJ,EAAgB,KAAK,IAAI,MAAM,qCAAqCF,CAAG,iBAAiBG,EAAQ,GAAG,EAAE,CAAC,EAIpGF,EAAQ,QAAQ,UAAY,GAAM,CACpC,KAAK,IAAI,MAAM,sEAAuED,EAAKG,EAAQ,GAAG,EACtG,KACF,CACF,CACF,CAEA,MAAID,EAAgB,OAAS,EACrB,IAAI,eAAeA,EAAiB,qCAAqCF,CAAG,mBAAmB,EAE/F,IAAI,MAAM,qCAAqCA,CAAG,mBAAmB,CAE/E,CAEA,cAAeC,EAAgD,CAAA,EAAE,CAC/D,OAAOM,GAA8B,CACnC,OAAQ,KAAK,OACb,QAAS,KAAK,SACb,CACD,GAAGN,EACH,WAAY,KAAK,WACjB,cAAe,KAAK,cACpB,qBAAsB,KAAK,qBAC5B,CACH,G/FhGK,IAAMO,GAAyB,GACzBC,GAAsB,GAMtBC,GAAmB,QAyD1B,SAAUC,GAA6BC,EAAwC,CAAA,EAAE,CACrF,OAAQC,GAAe,IAAIC,GAA4BD,EAAYD,CAAI,CACzE",
|
|
6
|
+
"names": ["require_hashlru", "__commonJSMin", "exports", "module", "max", "size", "cache", "_cache", "update", "key", "value", "v", "require_netmask4", "__commonJSMin", "exports", "ip2long", "long2ip", "long", "a", "b", "c", "d", "chr0", "chra", "chrA", "parseNum", "s", "n", "base", "dmax", "i", "start", "ip", "Netmask4Impl", "_Netmask4Impl", "net", "mask", "maskStr", "parts", "count", "fn", "lastLong", "index", "require_netmask6", "__commonJSMin", "exports", "ip6bigint", "bigint2ip6", "netmask4_1", "MAX_IPV6", "ip", "zoneIdx", "lastColon", "ipv4Part", "ipv4Long", "ipv6Prefix", "parseIPv6Pure", "doubleColonIdx", "groups", "left", "right", "leftGroups", "rightGroups", "missing", "result", "i", "g", "val", "n", "bestStart", "bestLen", "curStart", "curLen", "before", "after", "Netmask6Impl", "_Netmask6Impl", "net", "mask", "prefixLen", "slashIdx", "count", "sizeBig", "fn", "addr", "lastAddr", "index", "require_netmask", "__commonJSMin", "exports", "netmask4_1", "netmask6_1", "Netmask", "_Netmask", "net", "mask", "ip", "count", "nextImpl", "fn", "index_exports", "__export", "DEFAULT_ALLOW_INSECURE", "DEFAULT_ALLOW_LOCAL", "DEFAULT_MAX_SIZE", "trustlessGatewayBlockBroker", "alloc", "size", "allocUnsafe", "N1", "N2", "N3", "N4", "N5", "N6", "N7", "MSB", "REST", "encodingLength", "value", "encodeUint8Array", "buf", "offset", "decodeUint8Array", "buf", "offset", "b", "res", "REST", "MSB", "N4", "N5", "N6", "N7", "decodeUint8ArrayList", "decode", "buf", "offset", "decodeUint8Array", "decodeUint8ArrayList", "isArrayBufferBacked", "arr", "withArrayBuffer", "base10_exports", "__export", "base10", "empty", "equals", "aa", "bb", "ii", "coerce", "o", "toArrayBufferBackedArray", "fromString", "str", "toString", "b", "isByteArrayWithArrayBuffer", "toArrayBufferBackedArray", "base", "ALPHABET", "name", "BASE_MAP", "j", "i", "x", "xc", "BASE", "LEADER", "FACTOR", "iFACTOR", "encode", "source", "zeroes", "length", "pbegin", "pend", "size", "b58", "carry", "it1", "it2", "str", "decodeUnsafe", "psz", "b256", "it3", "it4", "vch", "decode", "string", "buffer", "src", "_brrp__multiformats_scope_baseX", "base_x_default", "Encoder", "name", "prefix", "baseEncode", "bytes", "Decoder", "baseDecode", "prefixCodePoint", "text", "decoder", "or", "ComposedDecoder", "decoders", "input", "left", "right", "Codec", "from", "encode", "decode", "baseX", "alphabet", "base_x_default", "coerce", "string", "alphabetIdx", "bitsPerChar", "end", "out", "bits", "buffer", "written", "i", "value", "data", "pad", "mask", "createAlphabetIdx", "rfc4648", "base10", "baseX", "base16_exports", "__export", "base16", "base16upper", "base16", "rfc4648", "base16upper", "base2_exports", "__export", "base2", "base2", "rfc4648", "base256emoji_exports", "__export", "base256emoji", "alphabet", "alphabetBytesToChars", "p", "c", "i", "alphabetCharsToBytes", "codePoint", "encode", "data", "decode", "str", "byts", "char", "byt", "base256emoji", "from", "base32_exports", "__export", "base32", "base32hex", "base32hexpad", "base32hexpadupper", "base32hexupper", "base32pad", "base32padupper", "base32upper", "base32z", "base32", "rfc4648", "base32upper", "base32pad", "base32padupper", "base32hex", "base32hexupper", "base32hexpad", "base32hexpadupper", "base32z", "base36_exports", "__export", "base36", "base36upper", "base36", "baseX", "base36upper", "base58_exports", "__export", "base58btc", "base58flickr", "base58btc", "baseX", "base58flickr", "base64_exports", "__export", "base64", "base64pad", "base64url", "base64urlpad", "base64", "rfc4648", "base64pad", "base64url", "base64urlpad", "base8_exports", "__export", "base8", "base8", "rfc4648", "identity_exports", "__export", "identity", "identity", "from", "buf", "toString", "str", "fromString", "textEncoder", "textDecoder", "identity_exports", "__export", "identity", "encode_1", "encode", "MSB", "REST", "MSBALL", "INT", "num", "out", "offset", "oldOffset", "decode", "read", "MSB$1", "REST$1", "buf", "res", "shift", "counter", "b", "l", "N1", "N2", "N3", "N4", "N5", "N6", "N7", "N8", "N9", "length", "value", "varint", "_brrp_varint", "varint_default", "decode", "data", "offset", "varint_default", "encodeTo", "int", "target", "encodingLength", "create", "code", "digest", "size", "sizeOffset", "encodingLength", "digestOffset", "bytes", "encodeTo", "Digest", "decode", "multihash", "coerce", "equals", "a", "b", "data", "toArrayBufferBackedArray", "code", "name", "encode", "coerce", "digest", "input", "options", "create", "identity", "sha2_browser_exports", "__export", "sha256", "sha512", "DEFAULT_MIN_DIGEST_LENGTH", "from", "name", "code", "encode", "minDigestLength", "maxDigestLength", "Hasher", "input", "options", "result", "createDigest", "digest", "truncate", "create", "sha", "name", "data", "sha256", "from", "sha512", "format", "link", "base", "bytes", "version", "toStringV0", "baseCache", "base58btc", "toStringV1", "base32", "cache", "baseCache", "cid", "CID", "_CID", "version", "code", "multihash", "bytes", "toArrayBufferBackedArray", "DAG_PB_CODE", "SHA_256_CODE", "digest", "create", "other", "self", "unknown", "equals", "base", "format", "input", "value", "encodeCID", "cidSymbol", "decode", "remainder", "specs", "prefixSize", "multihashBytes", "coerce", "digestBytes", "Digest", "initialBytes", "offset", "next", "i", "length", "codec", "multihashCode", "digestSize", "size", "multihashSize", "source", "prefix", "parseCIDtoBytes", "decoder", "base58btc", "base32", "base36", "toStringV0", "toStringV1", "codeOffset", "encodingLength", "hashOffset", "encodeTo", "bases", "identity_exports", "base2_exports", "base8_exports", "base10_exports", "base16_exports", "base32_exports", "base36_exports", "base58_exports", "base64_exports", "base256emoji_exports", "hashes", "sha2_browser_exports", "createCodec", "name", "prefix", "encode", "decode", "string", "buf", "str", "ascii", "i", "allocUnsafe", "BASES", "bases", "bases_default", "fromString", "string", "encoding", "base", "bases_default", "toString", "array", "encoding", "base", "bases_default", "pathSepS", "pathSepB", "pathSep", "Key", "_Key", "s", "clean", "fromString", "encoding", "toString", "list", "other", "bytes", "key", "list1", "list2", "i", "c1", "c2", "ns", "namespaceType", "namespaceValue", "p", "keys", "flatten", "parts", "arr", "isByteArrayWithArrayBuffer", "b", "asUint8Array", "buf", "concat", "arrays", "length", "acc", "curr", "output", "allocUnsafe", "offset", "arr", "asUint8Array", "equals", "a", "b", "i", "symbol", "findBufAndOffset", "bufs", "index", "offset", "buf", "bufEnd", "isUint8ArrayList", "value", "Uint8ArrayList", "_Uint8ArrayList", "data", "length", "chunk", "res", "i", "bytes", "beginInclusive", "endExclusive", "concat", "list", "bufStart", "sliceStartInBuf", "sliceEndsInBuf", "start", "search", "needle", "M", "radix", "rightmostPositions", "c", "j", "right", "lastIndex", "lastPatIndex", "skip", "char", "byteOffset", "allocUnsafe", "littleEndian", "alloc", "other", "equals", "acc", "curr", "AbortError", "message", "InvalidParametersError", "message", "isEventObject", "obj", "isOnce", "options", "TypedEventEmitter", "#listeners", "type", "listeners", "listener", "once", "evt", "list", "callback", "detail", "CustomProgressEvent", "type", "detail", "TimeoutError", "_TimeoutError", "message", "options", "getAbortedReason", "signal", "pTimeout", "promise", "milliseconds", "fallback", "customTimers", "timer", "abortHandler", "cancelablePromise", "resolve", "reject", "timeoutError", "error", "import_hashlru", "RecordType", "ms", "value", "options", "parse", "format", "str", "match", "unit", "n", "matchUnit", "fmtShort", "ms$1", "msAbs", "fmtLong", "plural", "format", "options", "n", "name", "isPlural", "setup", "env", "createDebug", "coerce", "disable", "enable", "enabled", "ms", "destroy", "key", "selectColor", "namespace", "hash", "i", "options", "prevTime", "enableOverride", "namespacesCache", "enabledCache", "debug", "args", "self", "curr", "index", "match", "format", "formatter", "val", "extend", "v", "delimiter", "newDebug", "namespaces", "split", "len", "toNamespace", "name", "regexp", "storage", "localstorage", "colors", "useColors", "formatArgs", "args", "ms", "c", "index", "lastC", "match", "log", "save", "namespaces", "load", "setupFormatters", "formatters", "v", "error", "browser_default", "setup", "src_default", "browser_default", "src_default", "v", "base58btc", "base32", "base64", "formatError", "indent", "message", "notEmpty", "stack", "isAggregateError", "err", "printError", "output", "createDisabledLogger", "namespace", "logger", "logger", "name", "options", "trace", "createDisabledLogger", "src_default", "r", "scope", "notEmpty", "str", "pDefer", "deferred", "resolve", "reject", "defaultTranslate", "signal", "raceSignal", "promise", "opts", "translateError", "listener", "resolve", "reject", "log", "logger", "SHARDING_FN", "FixedFIFO", "hwm", "data", "last", "FIFO", "options", "obj", "val", "prev", "next", "AbortError", "message", "code", "pushable", "options", "_pushable", "buffer", "next", "_pushable", "getNext", "options", "onEnd", "buffer", "FIFO", "pushable", "onNext", "ended", "drain", "pDefer", "waitNext", "resolve", "reject", "next", "err", "bufferNext", "bufferError", "push", "value", "end", "_return", "_throw", "signal", "cancel", "listener", "AbortError", "opts", "shardKey", "Key", "SHARDING_FN", "log", "logger", "FNV_PRIMES", "FNV_OFFSETS", "cachedEncoder", "fnv1aUint8Array", "uint8Array", "size", "fnvPrime", "hash", "index", "fnv1aEncodeInto", "string", "utf8Buffer", "remaining", "result", "fnv1a", "value", "fnv1a", "input", "seed", "numberToBuffer", "num", "hex", "fromString", "MAX_FINGERPRINT_SIZE", "Fingerprint", "buf", "hash", "seed", "fingerprintSize", "fnv", "fp", "alloc", "i", "other", "equals", "getRandomInt", "min", "max", "Bucket", "size", "fingerprint", "Fingerprint", "fp", "i", "getRandomInt", "current", "found", "maxCuckooCount", "CuckooFilter", "init", "fnv1a", "getRandomInt", "item", "fromString", "fingerprint", "Fingerprint", "j", "k", "Bucket", "rand", "n", "swapped", "inJ", "inK", "MAX_LOAD", "calculateBucketSize", "errorRate", "optimize", "maxItems", "bucketSize", "load", "filterSize", "fingerprintSize", "MAX_FINGERPRINT_SIZE", "ScalableCuckooFilter", "init", "fnv1a", "getRandomInt", "CuckooFilter", "item", "fromString", "current", "cuckoo", "curSize", "i", "acc", "curr", "createScalableCuckooFilter", "maxItems", "errorRate", "options", "optimize", "tryGetNetConfig", "ma", "components", "config", "index", "getNetConfig", "InvalidParametersError", "Parser", "input", "fn", "index", "result", "target", "char", "sep", "inner", "radix", "maxDigits", "allowZeroPrefix", "maxBytes", "digitCount", "leadingChar", "hasLeadingZero", "maxValue", "digit", "num", "out", "i", "ix", "readGroups", "groups", "ipv4", "group", "head", "headSize", "headIp4", "tail", "limit", "tailSize", "MAX_IPV6_LENGTH", "MAX_IPV4_LENGTH", "parser", "Parser", "parseIPv4", "input", "parseIPv6", "input", "MAX_IPV6_LENGTH", "parser", "isIPv4", "input", "parseIPv4", "isIPv6", "parseIPv6", "import_netmask", "PRIVATE_IP_RANGES", "NETMASK_RANGES", "ipRange", "ipv4Check", "ipAddr", "r", "isIpv4MappedIpv6", "ipv4MappedIpv6Check", "parts", "octet34", "octet12", "ip4", "isIpv4EmbeddedIpv6", "ipv4EmbeddedIpv6Check", "ipv6Check", "isPrivateIp", "ip", "isIPv4", "isIPv6", "isPrivate", "ma", "config", "getNetConfig", "isPrivateIp", "InvalidMultiaddrError", "ValidationError", "InvalidParametersError", "UnknownProtocolError", "bytesToString", "base", "buf", "toString", "stringToBytes", "fromString", "bytes2port", "port2bytes", "port", "onion2bytes", "str", "addr", "portBuf", "concat", "onion32bytes", "base32", "bytes2onion", "addrBytes", "portBytes", "ip4ToBytes", "ip", "bytes", "byte", "index", "value", "InvalidMultiaddrError", "ip6ToBytes", "offset", "sections", "i", "isv4", "isIPv4", "v4Buffer", "argv", "word", "ip4ToString", "result", "ip6ToString", "byte1", "byte2", "tuple", "url", "ip6StringToValue", "decoders", "bases", "c", "anybaseDecoder", "acc", "d", "mb2bytes", "mbstr", "bytes2mb", "integer", "value", "ValidationError", "positive", "maxValue", "max", "validate", "funcs", "fn", "validatePort", "V", "Registry", "key", "codec", "UnknownProtocolError", "alias", "code", "registry", "codecs", "ip4ToBytes", "ip4ToString", "value", "isIPv4", "ValidationError", "port2bytes", "bytes2port", "validatePort", "ip6ToBytes", "ip6ToString", "ip6StringToValue", "isIPv6", "bytesToString", "stringToBytes", "str", "val", "CID", "bytes2onion", "onion2bytes", "onion32bytes", "bytes2mb", "base64url", "mb2bytes", "bytesToComponents", "bytes", "components", "i", "code", "decode", "codec", "registry", "codeLength", "encodingLength", "size", "sizeForAddr", "sizeLength", "V", "componentLength", "component", "withArrayBuffer", "valueOffset", "valueBytes", "toString", "componentsToBytes", "length", "codecLength", "valueLength", "valueLengthLength", "fromString", "offset", "encodeUint8Array", "concat", "stringToComponents", "string", "InvalidMultiaddrError", "collecting", "value", "protocol", "char", "ended", "componentsToString", "inspect", "symbol", "toComponents", "addr", "isMultiaddr", "bytesToComponents", "stringToComponents", "InvalidMultiaddrError", "Multiaddr", "_Multiaddr", "#components", "#string", "#bytes", "options", "validate", "componentsToBytes", "componentsToString", "c", "ma", "addrString", "s", "i", "InvalidParametersError", "code", "index", "equals", "component", "codec", "registry", "isMultiaddr", "value", "symbol", "multiaddr", "addr", "Multiaddr", "code", "vals", "component", "value", "not", "matcher", "optional", "result", "or", "matchers", "matches", "and", "fmt", "match", "ma", "parts", "exactMatch", "_PEER_ID", "value", "PEER_ID", "fmt", "_DNS4", "_DNS6", "_DNSADDR", "_DNS", "DNS4", "optional", "DNS6", "DNSADDR", "DNS", "or", "_IP4", "and", "_IP6", "_IP", "_IP_OR_DOMAIN", "IP_OR_DOMAIN", "IP4", "IP6", "IP", "_TCP", "_UDP", "TCP", "UDP", "_QUIC", "code", "_QUIC_V1", "QUIC_V0_OR_V1", "QUIC", "QUIC_V1", "_WEB", "_WebSockets", "WebSockets", "_WebSocketsSecure", "WebSocketsSecure", "_WebRTCDirect", "WebRTCDirect", "_WebTransport", "WebTransport", "_P2P", "P2P", "_Circuit", "not", "Circuit", "_WebRTC", "WebRTC", "_HTTP", "HTTP", "_HTTPS", "HTTPS", "_Memory", "Memory", "_Unix", "Unix", "normalizeEmitter", "emitter", "addListener", "removeListener", "pEventMultiple", "event", "options", "cancel", "returnValue", "resolve", "reject", "events", "items", "onItem", "arguments_", "value", "error", "rejectHandler", "rejectionEvent", "timeout", "pTimeout", "pEvent", "arrayPromise", "promise", "array", "debounce", "func", "wait", "timeout", "output", "later", "QueueFullError", "message", "JobRecipient", "options", "pDefer", "AbortError", "randomId", "Job", "fn", "options", "err", "acc", "curr", "AbortError", "recipient", "JobRecipient", "result", "raceSignal", "evt", "Queue", "TypedEventEmitter", "init", "debounce", "job", "j", "i", "fn", "options", "QueueFullError", "Job", "result", "err", "AbortError", "pEvent", "limit", "stream", "pushable", "cleanup", "onQueueJobComplete", "evt", "onQueueFailure", "onQueueIdle", "onSignalAbort", "InsufficientProvidersError", "message", "AbstractSession", "TypedEventEmitter", "components", "init", "createScalableCuckooFilter", "cid", "options", "cidStr", "base64", "existingJob", "deferred", "pDefer", "request", "first", "foundBlock", "queue", "Queue", "evt", "i", "provider", "err", "peerAddedToSessionListener", "event", "filterKey", "raceSignal", "has", "signalAbortedListener", "AbortError", "index", "prov", "peer", "count", "found", "self", "initialProviders", "initialProvider", "providers", "InsufficientProvidersError", "isCID", "obj", "CID", "ASSUME_HTTP_CODES", "extractSNI", "ma", "extractTuple", "extractPort", "port", "name", "component", "hasTLS", "code", "interpretNext", "head", "rest", "interpreter", "interpreters", "restVal", "tail", "maHasTLS", "sni", "protocol", "baseVal", "decodedValue", "multiaddrToUri", "input", "opts", "components", "multiaddr", "uri", "word", "boundry", "options", "v4", "v6segment", "v6", "v46Exact", "v4exact", "v6exact", "ipRegex", "ip_regex_default", "functionTimeout", "function_", "wrappedFunction", "arguments_", "isTimeoutError", "toString", "isRegexp", "value", "flagMap", "clonedRegexp", "regexp", "options", "isRegexp", "flags", "flag", "isMatch", "regex", "string", "timeout", "functionTimeout", "clonedRegexp", "error", "isTimeoutError", "maxIPv4Length", "maxIPv6Length", "options", "isIPv6", "string", "maxIPv6Length", "isMatch", "ip_regex_default", "options", "isIPv4", "maxIPv4Length", "portFor", "BROWSER_SCHEMES", "uriToMultiaddr", "uriStr", "opts", "defaultDnsType", "scheme", "hostname", "port", "path", "parseUri", "parts", "tupleForHostname", "tupleForPort", "tupleForScheme", "tupleForPath", "multiaddrStr", "x", "a", "b", "multiaddr", "protocol", "pathname", "search", "protocolPort", "portForProtocol", "isIPv4", "isIPv6", "trimmed", "filterNonHTTPMultiaddrs", "multiaddrs", "allowInsecure", "allowLocal", "ma", "isHttps", "HTTPS", "isHttp", "HTTP", "DNS", "isPrivate", "host", "getNetConfig", "findHttpGatewayProviders", "cid", "routing", "logger", "options", "provider", "httpAddresses", "uri", "multiaddrToUri", "TrustlessGateway", "limitedResponse", "response", "byteLimit", "signal", "log", "contentLength", "contentLengthNumber", "err", "reader", "chunkList", "Uint8ArrayList", "done", "value", "TRANSPORT_IPFS_GATEWAY_HTTP_CODE", "TrustlessGateway", "#attempts", "#errors", "#invalidBlocks", "#successes", "#pendingResponses", "url", "logger", "transformRequestInit", "routing", "CID", "identity", "fromString", "#uniqueBlockId", "cid", "multihashBytes", "base64", "options", "gwUrl", "maxSize", "DEFAULT_MAX_SIZE", "blockId", "innerController", "abortInnerSignal", "pendingResponse", "defaultReqInit", "reqInit", "headers", "key", "value", "CustomProgressEvent", "res", "uriToMultiaddr", "body", "limitedResponse", "cause", "TrustlessGatewaySession", "AbstractSession", "components", "init", "DEFAULT_ALLOW_INSECURE", "DEFAULT_ALLOW_LOCAL", "cid", "provider", "options", "CustomProgressEvent", "block", "findHttpGatewayProviders", "providerA", "providerB", "routing", "isCID", "httpAddresses", "filterNonHTTPMultiaddrs", "uri", "multiaddrToUri", "TrustlessGateway", "createTrustlessGatewaySession", "TrustlessGatewayBlockBroker", "components", "init", "DEFAULT_ALLOW_INSECURE", "DEFAULT_ALLOW_LOCAL", "cid", "options", "aggregateErrors", "gateway", "findHttpGatewayProviders", "block", "err", "createTrustlessGatewaySession", "DEFAULT_ALLOW_INSECURE", "DEFAULT_ALLOW_LOCAL", "DEFAULT_MAX_SIZE", "trustlessGatewayBlockBroker", "init", "components", "TrustlessGatewayBlockBroker"]
|
|
7
|
+
}
|