@mnee/ts-sdk 1.0.3 → 1.1.0
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/checkout.html +22 -0
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.modern.js +1 -1
- package/dist/index.modern.js.map +1 -1
- package/dist/index.module.js +1 -1
- package/dist/index.module.js.map +1 -1
- package/dist/index.umd.js +1 -1
- package/dist/index.umd.js.map +1 -1
- package/dist/mnee.types.d.ts +5 -0
- package/package.json +2 -2
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../src/utils/stacklessError.ts","../src/mneeCosignTemplate.ts","../src/utils/applyInscription.ts","../src/constants.ts","../src/utils/helper.ts","../src/utils/networkError.ts","../src/batch.ts","../src/mneeService.ts","../src/hdWallet.ts","../src/index.ts"],"sourcesContent":["/**\n * Creates an Error object without a stack trace\n * @param message The error message\n * @returns Error object with no stack trace\n */\nexport function stacklessError(message: string): Error {\n const error = new Error(message);\n error.stack = undefined;\n return error;\n}","import {\n Hash,\n LockingScript,\n OP,\n type PrivateKey,\n type PublicKey,\n type Script,\n type ScriptTemplate,\n type Transaction,\n TransactionSignature,\n UnlockingScript,\n Utils,\n} from \"@bsv/sdk\";\nimport { stacklessError } from \"./utils/stacklessError\";\n\n/**\n * P2PKH (Pay To Public Key Hash) class implementing ScriptTemplate.\n *\n * This class provides methods to create Pay To Public Key Hash locking and unlocking scripts, including the unlocking of P2PKH UTXOs with the private key.\n */\nexport default class CosignTemplate implements ScriptTemplate {\n /**\n * Creates a P2PKH locking script for a given public key hash or address string\n *\n * @param {number[] | string} userPKHash or address - An array or address representing the public key hash of the owning user.\n * @param {PublicKey} approverPubKey - Public key of the approver.\n * @returns {LockingScript} - A P2PKH locking script.\n */\n lock(\n userPKHash: string | number[],\n approverPubKey: PublicKey\n ): LockingScript {\n let pkhash: number[] = [];\n if (typeof userPKHash === \"string\") {\n const hash = Utils.fromBase58Check(userPKHash);\n if (hash.prefix[0] !== 0x00 && hash.prefix[0] !== 0x6f)\n throw stacklessError(\"only P2PKH is supported\");\n pkhash = hash.data as number[];\n } else {\n pkhash = userPKHash;\n }\n const lockingScript = new LockingScript();\n lockingScript\n .writeOpCode(OP.OP_DUP)\n .writeOpCode(OP.OP_HASH160)\n .writeBin(pkhash)\n .writeOpCode(OP.OP_EQUALVERIFY)\n .writeOpCode(OP.OP_CHECKSIGVERIFY)\n .writeBin(approverPubKey.encode(true) as number[])\n .writeOpCode(OP.OP_CHECKSIG);\n\n return lockingScript;\n }\n\n /**\n * Creates a function that generates a P2PKH unlocking script along with its signature and length estimation.\n *\n * The returned object contains:\n * 1. `sign` - A function that, when invoked with a transaction and an input index,\n * produces an unlocking script suitable for a P2PKH locked output.\n * 2. `estimateLength` - A function that returns the estimated length of the unlocking script in bytes.\n *\n * @param {PrivateKey} userPrivateKey - The private key used for signing the transaction.\n * @param {'all'|'none'|'single'} signOutputs - The signature scope for outputs.\n * @param {boolean} anyoneCanPay - Flag indicating if the signature allows for other inputs to be added later.\n * @param {number} sourceSatoshis - Optional. The amount being unlocked. Otherwise the input.sourceTransaction is required.\n * @param {Script} lockingScript - Optional. The lockinScript. Otherwise the input.sourceTransaction is required.\n * @returns {Object} - An object containing the `sign` and `estimateLength` functions.\n */\n userUnlock(\n userPrivateKey: PrivateKey,\n signOutputs: \"all\" | \"none\" | \"single\" = \"all\",\n anyoneCanPay = false,\n sourceSatoshis?: number,\n lockingScript?: Script\n ): {\n sign: (tx: Transaction, inputIndex: number) => Promise<UnlockingScript>;\n estimateLength: () => Promise<182>;\n } {\n return {\n sign: async (tx: Transaction, inputIndex: number) => {\n let signatureScope = TransactionSignature.SIGHASH_FORKID;\n if (signOutputs === \"all\") {\n signatureScope |= TransactionSignature.SIGHASH_ALL;\n }\n if (signOutputs === \"none\") {\n signatureScope |= TransactionSignature.SIGHASH_NONE;\n }\n if (signOutputs === \"single\") {\n signatureScope |= TransactionSignature.SIGHASH_SINGLE;\n }\n if (anyoneCanPay) {\n signatureScope |= TransactionSignature.SIGHASH_ANYONECANPAY;\n }\n\n const input = tx.inputs[inputIndex];\n\n const otherInputs = tx.inputs.filter(\n (_, index) => index !== inputIndex\n );\n\n const sourceTXID = input.sourceTXID\n ? input.sourceTXID\n : input.sourceTransaction?.id(\"hex\");\n if (!sourceTXID) {\n throw stacklessError(\n \"The input sourceTXID or sourceTransaction is required for transaction signing.\"\n );\n }\n sourceSatoshis ||=\n input.sourceTransaction?.outputs[input.sourceOutputIndex].satoshis;\n if (!sourceSatoshis) {\n throw stacklessError(\n \"The sourceSatoshis or input sourceTransaction is required for transaction signing.\"\n );\n }\n lockingScript ||=\n input.sourceTransaction?.outputs[input.sourceOutputIndex]\n .lockingScript;\n if (!lockingScript) {\n throw stacklessError(\n \"The lockingScript or input sourceTransaction is required for transaction signing.\"\n );\n }\n\n const preimage = TransactionSignature.format({\n sourceTXID,\n sourceOutputIndex: input.sourceOutputIndex,\n sourceSatoshis,\n transactionVersion: tx.version,\n otherInputs,\n inputIndex,\n outputs: tx.outputs,\n inputSequence: input.sequence || 0xffffffff,\n subscript: lockingScript,\n lockTime: tx.lockTime,\n scope: signatureScope,\n });\n const rawSignature = userPrivateKey.sign(Hash.sha256(preimage));\n const sig = new TransactionSignature(\n rawSignature.r,\n rawSignature.s,\n signatureScope\n );\n const unlockScript = new UnlockingScript();\n unlockScript.writeBin(sig.toChecksigFormat());\n unlockScript.writeBin(\n userPrivateKey.toPublicKey().encode(true) as number[]\n );\n return unlockScript;\n },\n estimateLength: async () => {\n // public key (1+33) + signature (1+73) + approver signature (1+73)\n // Note: We add 1 to each element's length because of the associated OP_PUSH\n return 182;\n },\n };\n }\n\n /**\n * Creates a function that generates a P2PKH unlocking script along with its signature and length estimation.\n *\n * The returned object contains:\n * 1. `sign` - A function that, when invoked with a transaction and an input index,\n * produces an unlocking script suitable for a P2PKH locked output.\n * 2. `estimateLength` - A function that returns the estimated length of the unlocking script in bytes.\n *\n * @param {PrivateKey} approverPrivateKey - The private key used for signing the transaction.\n * @param {'all'|'none'|'single'} signOutputs - The signature scope for outputs.\n * @param {boolean} anyoneCanPay - Flag indicating if the signature allows for other inputs to be added later.\n * @param {number} sourceSatoshis - Optional. The amount being unlocked. Otherwise the input.sourceTransaction is required.\n * @param {Script} lockingScript - Optional. The lockinScript. Otherwise the input.sourceTransaction is required.\n * @returns {Object} - An object containing the `sign` and `estimateLength` functions.\n */\n unlock(\n approverPrivateKey: PrivateKey,\n userSigScript: Script,\n signOutputs: \"all\" | \"none\" | \"single\" = \"all\",\n anyoneCanPay = false,\n sourceSatoshis?: number,\n lockingScript?: Script\n ): {\n sign: (tx: Transaction, inputIndex: number) => Promise<UnlockingScript>;\n estimateLength: () => Promise<182>;\n } {\n return {\n sign: async (tx: Transaction, inputIndex: number) => {\n let signatureScope = TransactionSignature.SIGHASH_FORKID;\n if (signOutputs === \"all\") {\n signatureScope |= TransactionSignature.SIGHASH_ALL;\n }\n if (signOutputs === \"none\") {\n signatureScope |= TransactionSignature.SIGHASH_NONE;\n }\n if (signOutputs === \"single\") {\n signatureScope |= TransactionSignature.SIGHASH_SINGLE;\n }\n if (anyoneCanPay) {\n signatureScope |= TransactionSignature.SIGHASH_ANYONECANPAY;\n }\n\n const input = tx.inputs[inputIndex];\n\n const otherInputs = tx.inputs.filter(\n (_, index) => index !== inputIndex\n );\n\n const sourceTXID = input.sourceTXID\n ? input.sourceTXID\n : input.sourceTransaction?.id(\"hex\");\n if (!sourceTXID) {\n throw stacklessError(\n \"The input sourceTXID or sourceTransaction is required for transaction signing.\"\n );\n }\n sourceSatoshis ||=\n input.sourceTransaction?.outputs[input.sourceOutputIndex].satoshis;\n if (!sourceSatoshis) {\n throw stacklessError(\n \"The sourceSatoshis or input sourceTransaction is required for transaction signing.\"\n );\n }\n lockingScript ||=\n input.sourceTransaction?.outputs[input.sourceOutputIndex]\n .lockingScript;\n if (!lockingScript) {\n throw stacklessError(\n \"The lockingScript or input sourceTransaction is required for transaction signing.\"\n );\n }\n\n const preimage = TransactionSignature.format({\n sourceTXID,\n sourceOutputIndex: input.sourceOutputIndex,\n sourceSatoshis,\n transactionVersion: tx.version,\n otherInputs,\n inputIndex,\n outputs: tx.outputs,\n inputSequence: input.sequence || 0xffffffff,\n subscript: lockingScript,\n lockTime: tx.lockTime,\n scope: signatureScope,\n });\n const rawSignature = approverPrivateKey.sign(Hash.sha256(preimage));\n const sig = new TransactionSignature(\n rawSignature.r,\n rawSignature.s,\n signatureScope\n );\n const unlockScript = new UnlockingScript();\n unlockScript.writeBin(sig.toChecksigFormat());\n unlockScript.writeScript(userSigScript);\n return unlockScript;\n },\n estimateLength: async () => {\n // public key (1+33) + signature (1+73) + approver signature (1+73)\n // Note: We add 1 to each element's length because of the associated OP_PUSH\n return 182;\n },\n };\n }\n}\n","import { LockingScript } from '@bsv/sdk';\nimport { stacklessError } from './stacklessError';\n\n/**\n * MAP (Magic Attribute Protocol) metadata object with stringified values for writing to the blockchain\n * @typedef {Object} MAP\n * @property {string} app - Application identifier\n * @property {string} type - Metadata type\n * @property {string} [prop] - Optional. Additional metadata properties\n */\nexport type MAP = {\n app: string;\n type: string;\n [prop: string]: string;\n};\n\nexport type Inscription = {\n dataB64: string;\n contentType: string;\n};\n\n/**\n * Converts a string to its hexadecimal representation\n *\n * @param {string} utf8Str - The string to convert\n * @returns {string} The hexadecimal representation of the input string\n */\nconst toHex = (utf8Str: string): string => {\n return Buffer.from(utf8Str).toString('hex');\n};\n\nexport const MAP_PREFIX = '1PuQa7K62MiKCtssSLKy1kh56WWU7MtUR5';\n\nexport const applyInscription = (\n lockingScript: LockingScript,\n inscription?: Inscription,\n metaData?: MAP,\n withSeparator = false,\n) => {\n let ordAsm = '';\n // This can be omitted for reinscriptions that just update metadata\n if (inscription?.dataB64 !== undefined && inscription?.contentType !== undefined) {\n const ordHex = toHex('ord');\n const fsBuffer = Buffer.from(inscription.dataB64, 'base64');\n const fileHex = fsBuffer.toString('hex').trim();\n if (!fileHex) {\n throw stacklessError('Invalid file data');\n }\n const fileMediaType = toHex(inscription.contentType);\n if (!fileMediaType) {\n throw stacklessError('Invalid media type');\n }\n ordAsm = `OP_0 OP_IF ${ordHex} OP_1 ${fileMediaType} OP_0 ${fileHex} OP_ENDIF`;\n }\n\n let inscriptionAsm = `${\n ordAsm ? `${ordAsm} ${withSeparator ? 'OP_CODESEPARATOR ' : ''}` : ''\n }${lockingScript.toASM()}`;\n\n // MAP.app and MAP.type keys are required\n if (metaData && (!metaData.app || !metaData.type)) {\n throw stacklessError('MAP.app and MAP.type are required fields');\n }\n\n if (metaData?.app && metaData?.type) {\n const mapPrefixHex = toHex(MAP_PREFIX);\n const mapCmdValue = toHex('SET');\n inscriptionAsm = `${inscriptionAsm ? `${inscriptionAsm} ` : ''}OP_RETURN ${mapPrefixHex} ${mapCmdValue}`;\n\n for (const [key, value] of Object.entries(metaData)) {\n if (key !== 'cmd') {\n inscriptionAsm = `${inscriptionAsm} ${toHex(key)} ${toHex(value as string)}`;\n }\n }\n }\n\n return LockingScript.fromASM(inscriptionAsm);\n};\n","export const MIN_TRANSFER_AMOUNT = 0.00001;\nexport const MNEE_DECIMALS = 5;\n\n// PROD\nexport const MNEE_PROXY_API_URL = 'https://proxy-api.mnee.net';\nexport const PUBLIC_PROD_MNEE_API_TOKEN = '92982ec1c0975f31979da515d46bae9f';\nexport const PROD_TOKEN_ID = 'ae59f3b898ec61acbdb6cc7a245fabeded0c094bf046f35206a3aec60ef88127_0';\nexport const PROD_APPROVER = '020a177d6a5e6f3a8689acd2e313bd1cf0dcf5a243d1cc67b7218602aee9e04b2f';\nexport const PROD_MINT_ADDRESS = '1inHbiwj2jrEcZPiSYnfgJ8FmS1Bmk4Dh';\n\n// SANDBOX\nexport const SANDBOX_MNEE_API_URL = 'https://sandbox-proxy-api.mnee.net';\nexport const PUBLIC_SANDBOX_MNEE_API_TOKEN = '54f1fd1688ba66a58a67675b82feb93e';\nexport const SANDBOX_TOKEN_ID = '833a7720966a2a435db28d967385e8aa7284b6150ebb39482cc5228b73e1703f_0';\nexport const SANDBOX_APPROVER = '02bed35e894cc41cc9879b4002ad03d33533b615c1b476068c8dd6822a09f93f6c';\nexport const SANDBOX_MINT_ADDRESS = '1AZNdbFYBDFTAEgzZMfPzANxyNrpGJZAUY';\n","import { Hash, OP, Script, Transaction, Utils, PrivateKey } from '@bsv/sdk';\nimport {\n Inscription,\n MNEEConfig,\n MneeInscription,\n MneeSync,\n ParsedCosigner,\n SendMNEE,\n TransferMultiOptions,\n TxHistory,\n TxStatus,\n TxType,\n} from '../mnee.types';\nimport { stacklessError } from './stacklessError';\nimport { MIN_TRANSFER_AMOUNT } from '../constants';\n\nexport const parseInscription = (script: Script) => {\n let fromPos: number | undefined;\n for (let i = 0; i < script.chunks.length; i++) {\n const chunk = script.chunks[i];\n if (\n i >= 2 &&\n chunk.data?.length === 3 &&\n Utils.toUTF8(chunk.data) == 'ord' &&\n script.chunks[i - 1].op == OP.OP_IF &&\n script.chunks[i - 2].op == OP.OP_FALSE\n ) {\n fromPos = i + 1;\n }\n }\n if (fromPos === undefined) return;\n\n const insc = {\n file: { hash: '', size: 0, type: '' },\n fields: {},\n } as Inscription;\n\n for (let i = fromPos; i < script.chunks.length; i += 2) {\n const field = script.chunks[i];\n if (field.op == OP.OP_ENDIF) {\n break;\n }\n if (field.op > OP.OP_16) return;\n const value = script.chunks[i + 1];\n if (value.op > OP.OP_PUSHDATA4) return;\n\n if (field.data?.length) continue;\n\n let fieldNo = 0;\n if (field.op > OP.OP_PUSHDATA4 && field.op <= OP.OP_16) {\n fieldNo = field.op - 80;\n } else if (field.data?.length) {\n fieldNo = field.data[0];\n }\n switch (fieldNo) {\n case 0:\n insc.file!.size = value.data?.length || 0;\n if (!value.data?.length) break;\n insc.file!.hash = Utils.toBase64(Hash.sha256(value.data));\n insc.file!.content = value.data;\n break;\n case 1:\n insc.file!.type = Buffer.from(value.data || []).toString();\n break;\n }\n }\n\n return insc;\n};\n\nexport const parseCosignerScripts = (scripts: Script[]): ParsedCosigner[] => {\n return scripts\n .map((script: Script) => {\n const chunks = script.chunks;\n for (let i = 0; i <= chunks.length - 4; i++) {\n if (\n chunks.length > i + 6 &&\n chunks[0 + i].op === OP.OP_DUP &&\n chunks[1 + i].op === OP.OP_HASH160 &&\n chunks[2 + i].data?.length === 20 &&\n chunks[3 + i].op === OP.OP_EQUALVERIFY &&\n chunks[4 + i].op === OP.OP_CHECKSIGVERIFY &&\n chunks[5 + i].data?.length === 33 &&\n chunks[6 + i].op === OP.OP_CHECKSIG\n ) {\n return {\n cosigner: Utils.toHex(chunks[5 + i].data || []),\n address: Utils.toBase58Check(chunks[2 + i].data || [], [0]),\n };\n } else if (\n // P2PKH\n chunks[0 + i].op === OP.OP_DUP &&\n chunks[1 + i].op === OP.OP_HASH160 &&\n chunks[2 + i].data?.length === 20 &&\n chunks[3 + i].op === OP.OP_EQUALVERIFY &&\n chunks[4 + i].op === OP.OP_CHECKSIG\n ) {\n return {\n cosigner: '',\n address: Utils.toBase58Check(chunks[2 + i].data || [], [0]),\n };\n }\n }\n // Return undefined for scripts that don't match any pattern\n return undefined as any;\n })\n .filter((result): result is ParsedCosigner => result !== undefined);\n};\n\nexport const parseSyncToTxHistory = (sync: MneeSync, address: string, config: MNEEConfig): TxHistory | null => {\n const txType: TxType = sync.senders.includes(address) ? 'send' : 'receive';\n const txStatus: TxStatus = sync.height > 0 ? 'confirmed' : 'unconfirmed';\n\n if (!sync.rawtx) return null;\n\n const txArray = Utils.toArray(sync.rawtx, 'base64');\n const txHex = Utils.toHex(txArray);\n const tx = Transaction.fromHex(txHex);\n\n const outScripts = tx.outputs.map((output) => output.lockingScript);\n const mneeScripts = parseCosignerScripts(outScripts);\n const parsedOutScripts = outScripts.map(parseInscription);\n const mneeAddresses = mneeScripts.map((script) => script.address);\n\n const feeAddressIndex = mneeAddresses.indexOf(config.feeAddress);\n const sender = sync.senders[0]; // only one sender for now\n\n let fee = 0;\n const counterpartyAmounts = new Map<string, number>();\n\n parsedOutScripts.forEach((parsedScript, index) => {\n const content = parsedScript?.file?.content;\n if (!content) return;\n\n const inscriptionData = Utils.toUTF8(content);\n if (!inscriptionData) return;\n\n let inscriptionJson: MneeInscription;\n try {\n inscriptionJson = JSON.parse(inscriptionData);\n } catch (err) {\n console.error('Failed to parse inscription JSON:', err);\n return;\n }\n\n if (inscriptionJson.p !== 'bsv-20' || inscriptionJson.id !== config.tokenId) return;\n\n const inscriptionAmt = parseInt(inscriptionJson.amt, 10);\n if (Number.isNaN(inscriptionAmt)) return;\n\n if (feeAddressIndex === index && sender === address) {\n fee += inscriptionAmt;\n return;\n }\n\n const outAddr = mneeAddresses[index];\n const prevAmt = counterpartyAmounts.get(outAddr) || 0;\n counterpartyAmounts.set(outAddr, prevAmt + inscriptionAmt);\n });\n\n const amountSentToAddress = counterpartyAmounts.get(address) || 0;\n\n if (txType === 'send') {\n const senderAmt = counterpartyAmounts.get(sender) || 0;\n counterpartyAmounts.set(sender, senderAmt - amountSentToAddress);\n }\n\n let counterparties: { address: string; amount: number }[] = [];\n if (txType === 'receive') {\n counterparties = [{ address: sender, amount: amountSentToAddress }];\n } else {\n counterparties = Array.from(counterpartyAmounts.entries())\n .map(([addr, amt]) => ({ address: addr, amount: amt }))\n .filter((cp) => cp.address !== address && cp.address !== config.feeAddress && cp.amount > 0);\n }\n\n const totalCounterpartyAmount = counterparties.reduce((sum, cp) => sum + cp.amount, 0);\n\n return {\n txid: sync.txid,\n height: sync.height,\n type: txType,\n status: txStatus,\n amount: totalCounterpartyAmount,\n fee,\n score: sync.score,\n counterparties,\n };\n};\n\nexport const validateAddress = (address: string) => {\n try {\n const decoded = Utils.fromBase58Check(address);\n // 0x00 = mainnet P2PKH (addresses starting with '1')\n const validPrefixes = [0x00];\n const prefixByte = decoded.prefix[0];\n if (typeof prefixByte !== 'number' || !validPrefixes.includes(prefixByte)) {\n throw stacklessError(`Invalid address prefix: ${prefixByte}`);\n }\n // Ensure the payload is 20 bytes (160 bits) for P2PKH/P2SH\n if (decoded.data.length !== 20) {\n throw stacklessError(`Invalid address payload length: ${decoded.data.length}`);\n }\n return true;\n } catch (error) {\n return false;\n }\n};\n\nexport const validateWIF = (wif: string): { isValid: boolean; error?: string; privateKey?: PrivateKey } => {\n try {\n const privateKey = PrivateKey.fromWif(wif);\n return { isValid: true, privateKey };\n } catch (wifError) {\n if (wifError instanceof Error) {\n const errorMsg = wifError.message.toLowerCase();\n if (errorMsg.includes('invalid base58 character')) {\n return { isValid: false, error: 'Invalid WIF key: contains invalid characters' };\n } else if (errorMsg.includes('invalid checksum')) {\n return { isValid: false, error: 'Invalid WIF key: checksum verification failed' };\n } else if (errorMsg.includes('expected base58 string')) {\n return { isValid: false, error: 'Invalid WIF key: must be a valid base58 encoded string' };\n }\n }\n return { isValid: false, error: 'Invalid WIF key provided' };\n }\n};\n\nexport const validateTransferMultiOptions = (options: TransferMultiOptions): { isValid: boolean; error?: string } => {\n for (const recipient of options.recipients) {\n if (!recipient.address || !recipient.amount) {\n return {\n isValid: false,\n error: `Invalid recipient: ${JSON.stringify(recipient)}. Missing required fields: address, amount`,\n };\n }\n\n if (typeof recipient.amount !== 'number' || isNaN(recipient.amount) || !isFinite(recipient.amount)) {\n return { isValid: false, error: `Invalid amount for ${recipient.address}: amount must be a valid number` };\n }\n\n if (recipient.amount < MIN_TRANSFER_AMOUNT) {\n return {\n isValid: false,\n error: `Invalid amount for ${recipient.address}: minimum transfer amount is ${MIN_TRANSFER_AMOUNT} MNEE`,\n };\n }\n\n if (!validateAddress(recipient.address)) {\n return { isValid: false, error: `Invalid recipient address: ${recipient.address}` };\n }\n }\n\n for (const input of options.inputs) {\n if (!input.txid || typeof input.vout !== 'number' || !input.wif) {\n return {\n isValid: false,\n error: `Invalid input: ${JSON.stringify(input)}. Missing required fields: txid, vout, wif`,\n };\n }\n const wifValidation = validateWIF(input.wif);\n if (!wifValidation.isValid) {\n return { isValid: false, error: `Invalid WIF key: ${input.wif} for input ${input.txid}:${input.vout}` };\n }\n const privateKey = wifValidation.privateKey!;\n const address = privateKey.toAddress();\n if (!validateAddress(address)) {\n return { isValid: false, error: `Invalid input address: ${address}` };\n }\n }\n\n if (options.changeAddress && Array.isArray(options.changeAddress)) {\n for (const change of options.changeAddress) {\n if (change.amount < MIN_TRANSFER_AMOUNT) {\n return {\n isValid: false,\n error: `Invalid amount for ${change.address}: minimum transfer amount is ${MIN_TRANSFER_AMOUNT} MNEE`,\n };\n }\n if (!validateAddress(change.address)) {\n return { isValid: false, error: `Invalid change address: ${change.address}` };\n }\n }\n }\n\n return { isValid: true };\n};\n\nexport const validateTransferOptions = (\n options: SendMNEE[],\n wif: string,\n): { isValid: boolean; totalAmount?: number; privateKey?: PrivateKey; error?: string } => {\n const { isValid, error, privateKey } = validateWIF(wif);\n if (options.length === 0) {\n return { isValid: false, error: 'Empty transfer options provided. Please provide at least one recipient.' };\n }\n\n if (!isValid) {\n return { isValid: false, error: error || 'Invalid WIF key provided' };\n }\n\n // This should never happen, but just in case\n if (!privateKey) {\n return { isValid: false, error: 'Private key not found' };\n }\n\n let totalAmount = 0;\n for (const req of options) {\n if (!validateAddress(req.address)) {\n return { isValid: false, error: `Invalid recipient address: ${req.address}` };\n }\n if (typeof req.amount !== 'number' || isNaN(req.amount) || !isFinite(req.amount)) {\n return { isValid: false, error: `Invalid amount for ${req.address}: amount must be a valid number` };\n }\n if (req.amount < MIN_TRANSFER_AMOUNT) {\n return {\n isValid: false,\n error: `Invalid amount for ${req.address}: minimum transfer amount is ${MIN_TRANSFER_AMOUNT} MNEE`,\n };\n }\n totalAmount += req.amount;\n }\n\n if (totalAmount <= 0) return { isValid: false, error: 'Invalid amount: total must be greater than 0' };\n\n return { isValid: true, totalAmount, privateKey };\n};\n\nexport const isValidHex = (hex: string) => {\n try {\n const hexRegex = /^[a-fA-F0-9]+$/;\n if (!hexRegex.test(hex)) {\n return false;\n }\n Transaction.fromHex(hex);\n return true;\n } catch (error) {\n return false;\n }\n};\n","export interface NetworkErrorInfo {\n code: string;\n message: string;\n hostname?: string;\n originalError?: any;\n}\n\nexport class NetworkError extends Error {\n public code: string;\n public hostname?: string;\n public originalError?: any;\n\n constructor(info: NetworkErrorInfo) {\n super(info.message);\n this.name = 'NetworkError';\n this.code = info.code;\n this.hostname = info.hostname;\n this.originalError = info.originalError;\n }\n}\n\nexport function isNetworkError(error: any): boolean {\n if (!error) return false;\n \n // Check for common network error codes\n const networkErrorCodes = [\n 'ENOTFOUND',\n 'ECONNREFUSED',\n 'ETIMEDOUT',\n 'ECONNRESET',\n 'ENETUNREACH',\n 'EHOSTUNREACH',\n 'EPIPE',\n 'ECONNABORTED'\n ];\n \n // Check direct error code\n if (networkErrorCodes.includes(error.code)) {\n return true;\n }\n \n // Check nested cause\n if (error.cause && networkErrorCodes.includes(error.cause?.code)) {\n return true;\n }\n \n // Check for fetch failures\n if (error.message?.includes('fetch failed') || error.message?.includes('getaddrinfo')) {\n return true;\n }\n \n return false;\n}\n\nexport function parseNetworkError(error: any): NetworkError {\n // Handle fetch errors with nested causes\n if (error.cause && error.cause.code) {\n const cause = error.cause;\n let message = 'Network connection failed';\n \n switch (cause.code) {\n case 'ENOTFOUND':\n message = 'Unable to connect to MNEE network. Please check your internet connection.';\n break;\n case 'ECONNREFUSED':\n message = 'Connection refused by MNEE server. The service may be temporarily unavailable.';\n break;\n case 'ETIMEDOUT':\n message = 'Request timed out. Please check your internet connection and try again.';\n break;\n case 'ECONNRESET':\n message = 'Connection was reset. Please try again.';\n break;\n case 'ENETUNREACH':\n case 'EHOSTUNREACH':\n message = 'Network unreachable. Please check your internet connection.';\n break;\n default:\n message = `Network error: ${cause.code}. Please check your connection and try again.`;\n }\n \n return new NetworkError({\n code: cause.code,\n message,\n hostname: cause.hostname,\n originalError: error\n });\n }\n \n // Handle direct network errors\n if (error.code) {\n let message = 'Network error occurred';\n \n switch (error.code) {\n case 'ENOTFOUND':\n message = 'Unable to connect to MNEE network. Please check your internet connection.';\n break;\n case 'ECONNREFUSED':\n message = 'Connection refused by MNEE server. The service may be temporarily unavailable.';\n break;\n case 'ETIMEDOUT':\n message = 'Request timed out. Please check your internet connection and try again.';\n break;\n default:\n message = `Network error: ${error.code}. Please check your connection and try again.`;\n }\n \n return new NetworkError({\n code: error.code,\n message,\n hostname: error.hostname,\n originalError: error\n });\n }\n \n // Generic network error\n return new NetworkError({\n code: 'NETWORK_ERROR',\n message: 'Network error occurred. Please check your internet connection and try again.',\n originalError: error\n });\n}\n\nexport function logNetworkError(error: any, operation: string): string | undefined {\n if (isNetworkError(error)) {\n const networkError = parseNetworkError(error);\n console.error(`Network error during ${operation}: ${networkError.message}`);\n return networkError.message;\n } else {\n console.error(`Failed to ${operation}:`, error);\n return undefined;\n }\n}","/**\n * Batch operations for MNEE SDK\n * Provides a clean API for batch processing with automatic chunking, rate limiting, and error recovery\n */\n\nimport { MNEEService } from './mneeService.js';\nimport {\n MNEEUtxo,\n MNEEBalance,\n TxHistoryResponse,\n AddressHistoryParams,\n ParseTxResponse,\n ParseTxExtendedResponse,\n ParseOptions,\n} from './mnee.types.js';\nimport { stacklessError } from './utils/stacklessError.js';\n\nexport interface BatchOptions {\n /** Maximum items per API call (default: 20) */\n chunkSize?: number;\n /** API requests per second limit (default: 3). If your API key has a higher limit, set this accordingly */\n requestsPerSecond?: number;\n /** Continue processing if an error occurs (default: false) */\n continueOnError?: boolean;\n /** Maximum retries per chunk (default: 3) */\n maxRetries?: number;\n /** Retry delay in milliseconds (default: 1000) */\n retryDelay?: number;\n /** Progress callback */\n onProgress?: (completed: number, total: number, errors: number) => void;\n}\n\nexport interface BatchError {\n items: string[];\n error: {\n message: string;\n code?: string;\n };\n retryCount: number;\n}\n\nexport interface BatchResult<T> {\n results: T[];\n errors: BatchError[];\n totalProcessed: number;\n totalErrors: number;\n}\n\nexport interface BatchUtxoResult {\n address: string;\n utxos: MNEEUtxo[];\n}\n\nexport interface BatchParseTxResult {\n txid: string;\n parsed: ParseTxResponse | ParseTxExtendedResponse;\n}\n\n/**\n * Batch operations class for MNEE SDK\n * @example\n * const batch = mnee.batch();\n * const result = await batch.getBalances(addresses, { onProgress: ... });\n */\nexport class Batch {\n constructor(private service: MNEEService) {}\n\n /**\n * Get UTXOs for multiple addresses\n * @example\n * const result = await mnee.batch().getUtxos(addresses, {\n * onProgress: (completed, total, errors) => {\n * console.log(`Progress: ${completed}/${total}, Errors: ${errors}`);\n * }\n * });\n */\n async getUtxos(addresses: string[], options: BatchOptions = {}): Promise<BatchResult<BatchUtxoResult>> {\n // Validate input is an array\n if (!Array.isArray(addresses)) {\n throw stacklessError('Input must be an array of addresses');\n }\n \n // Track individual errors within chunks\n const individualErrors: BatchError[] = [];\n\n const modifiedProcessor = async (chunk: string[]) => {\n // First validate addresses\n const validAddresses: string[] = [];\n const invalidAddresses: string[] = [];\n \n for (const address of chunk) {\n if (!address || typeof address !== 'string' || address.trim() === '') {\n invalidAddresses.push(address);\n individualErrors.push({\n items: [address],\n error: { message: 'Invalid address: empty or not a string' },\n retryCount: 0,\n });\n } else {\n // Basic Bitcoin address validation (starts with 1, 3, or bc1)\n const isValid = /^[13][a-km-zA-HJ-NP-Z1-9]{25,34}$|^bc1[a-z0-9]{39,59}$/.test(address);\n if (isValid) {\n validAddresses.push(address);\n } else {\n invalidAddresses.push(address);\n individualErrors.push({\n items: [address],\n error: { message: `Invalid address format: ${address}` },\n retryCount: 0,\n });\n }\n }\n }\n\n // If continueOnError is false and we have invalid addresses, throw\n if (!options.continueOnError && invalidAddresses.length > 0) {\n throw new Error(individualErrors[0].error.message);\n }\n\n // Process only valid addresses\n if (validAddresses.length === 0) {\n return [];\n }\n\n const utxos = await this.service.getUtxos(validAddresses);\n \n // Return results for all addresses in chunk (valid ones get UTXOs, invalid get empty)\n return chunk.map((address) => ({\n address,\n utxos: validAddresses.includes(address) \n ? utxos.filter((utxo) => utxo.owners.includes(address))\n : [],\n }));\n };\n\n const batchResult = await this.processBatch(\n addresses,\n modifiedProcessor,\n options,\n );\n\n // Merge individual errors with any chunk-level errors\n return {\n ...batchResult,\n errors: [...batchResult.errors, ...individualErrors],\n totalErrors: batchResult.errors.length + individualErrors.length,\n };\n }\n\n /**\n * Get balances for multiple addresses\n * @example\n * const result = await mnee.batch().getBalances(addresses);\n * const totalBalance = result.results.reduce((sum, b) => sum + b.decimalAmount, 0);\n */\n async getBalances(addresses: string[], options: BatchOptions = {}): Promise<BatchResult<MNEEBalance>> {\n // Validate input is an array\n if (!Array.isArray(addresses)) {\n throw stacklessError('Input must be an array of addresses');\n }\n \n return this.processBatch(addresses, async (chunk) => this.service.getBalances(chunk), options);\n }\n\n /**\n * Get transaction histories for multiple addresses\n * @example\n * const params = addresses.map(addr => ({ address: addr, limit: 100 }));\n * const result = await mnee.batch().getTxHistories(params);\n */\n async getTxHistories(\n params: AddressHistoryParams[],\n options: BatchOptions = {},\n ): Promise<BatchResult<TxHistoryResponse>> {\n // Validate input is an array\n if (!Array.isArray(params)) {\n throw stacklessError('Input must be an array of address history parameters');\n }\n \n return this.processBatch(\n params,\n async (chunk) => this.service.getRecentTxHistories(chunk),\n options,\n (param) => param.address,\n );\n }\n\n /**\n * Parse multiple transactions\n * @example\n * const result = await mnee.batch().parseTx(txids, {\n * parseOptions: { includeRaw: true }\n * });\n */\n async parseTx(\n txids: string[],\n options: BatchOptions & { parseOptions?: ParseOptions } = {},\n ): Promise<BatchResult<BatchParseTxResult>> {\n // Validate input is an array\n if (!Array.isArray(txids)) {\n throw stacklessError('Input must be an array of transaction IDs');\n }\n \n const { parseOptions, ...batchOptions } = options;\n\n // Track individual errors within chunks\n const individualErrors: BatchError[] = [];\n\n const modifiedProcessor = async (chunk: string[]) => {\n const results = await Promise.allSettled(\n chunk.map(async (txid) => {\n // Validate txid first\n if (!txid || typeof txid !== 'string' || txid.trim() === '') {\n throw new Error('Invalid transaction ID: empty or not a string');\n }\n \n const hexRegex = /^[a-fA-F0-9]{64}$/;\n if (!hexRegex.test(txid)) {\n throw new Error(`Invalid transaction ID format: ${txid}`);\n }\n\n return {\n txid,\n parsed: await this.service.parseTx(txid, parseOptions),\n };\n }),\n );\n\n const successfulResults: BatchParseTxResult[] = [];\n \n results.forEach((result, index) => {\n const txid = chunk[index];\n if (result.status === 'fulfilled') {\n successfulResults.push(result.value);\n } else {\n // Track individual errors\n const errorMessage = result.reason instanceof Error \n ? result.reason.message \n : String(result.reason);\n individualErrors.push({\n items: [txid],\n error: { message: errorMessage },\n retryCount: batchOptions.maxRetries || 3,\n });\n }\n });\n\n // If continueOnError is false and we have errors, throw the first one\n if (!batchOptions.continueOnError && individualErrors.length > 0) {\n throw new Error(individualErrors[0].error.message);\n }\n\n return successfulResults;\n };\n\n const batchResult = await this.processBatch(\n txids,\n modifiedProcessor,\n batchOptions, // Respect user's continueOnError preference\n );\n\n // Merge individual errors with any chunk-level errors\n return {\n ...batchResult,\n errors: [...batchResult.errors, ...individualErrors],\n totalErrors: batchResult.errors.length + individualErrors.length,\n };\n }\n\n /**\n * Generic batch processor\n */\n private async processBatch<T, R>(\n items: T[],\n processor: (chunk: T[]) => Promise<R[]>,\n options: BatchOptions,\n getItemId?: (item: T) => string,\n ): Promise<BatchResult<R>> {\n const {\n chunkSize = 20,\n continueOnError = false,\n onProgress,\n maxRetries = 3,\n retryDelay = 1000,\n requestsPerSecond = 3,\n } = options;\n \n const validChunkSize = chunkSize > 0 ? chunkSize : 20;\n const validRequestsPerSecond = requestsPerSecond > 0 ? requestsPerSecond : 3;\n\n // Create rate limiter based on requests per second\n // For requestsPerSecond < 1, we need to ensure maxConcurrent is at least 1\n // but still respect the intended delay between requests\n const minDelay = Math.ceil(1000 / validRequestsPerSecond);\n const maxConcurrent = Math.max(1, Math.floor(validRequestsPerSecond));\n const rateLimiter = new RateLimiter(maxConcurrent, minDelay);\n\n if (items.length === 0) {\n return { results: [], errors: [], totalProcessed: 0, totalErrors: 0 };\n }\n\n const results: R[] = [];\n const errors: BatchError[] = [];\n let processed = 0;\n\n const chunks = this.chunkArray(items, validChunkSize);\n const totalChunks = chunks.length;\n\n // Process all chunks - rate limiter handles concurrency and timing\n const chunkPromises = chunks.map(async (chunk) => {\n try {\n const chunkResults = await this.processWithRetry(() => processor(chunk), maxRetries, retryDelay, rateLimiter);\n\n results.push(...chunkResults);\n processed++;\n\n if (onProgress) {\n onProgress(processed, totalChunks, errors.length);\n }\n\n return chunkResults;\n } catch (error) {\n if (!continueOnError) {\n throw error;\n }\n\n // When continueOnError is true and chunk processing fails,\n // try to process items individually to salvage partial results\n const partialResults: R[] = [];\n const failedItems: { item: T; error: Error }[] = [];\n\n for (const item of chunk) {\n try {\n // Process single item by wrapping in array\n const singleResult = await this.processWithRetry(\n () => processor([item]),\n maxRetries,\n retryDelay,\n rateLimiter,\n );\n if (singleResult.length > 0) {\n partialResults.push(...singleResult);\n }\n } catch (itemError) {\n const error = itemError instanceof Error \n ? itemError\n : new Error(String(itemError));\n failedItems.push({ item, error });\n }\n }\n\n // Add partial results\n results.push(...partialResults);\n\n // Record errors for failed items\n if (failedItems.length > 0) {\n const itemIds = failedItems.map(({ item }) => (getItemId ? getItemId(item) : (item as unknown as string)));\n const firstError = failedItems[0].error;\n errors.push({\n items: itemIds,\n error: {\n message: firstError.message,\n code: (firstError as any).code,\n },\n retryCount: maxRetries,\n });\n }\n\n processed++;\n if (onProgress) {\n onProgress(processed, totalChunks, errors.length);\n }\n\n return partialResults;\n }\n });\n\n // Wait for all chunks to complete\n await Promise.all(chunkPromises);\n\n return {\n results,\n errors,\n totalProcessed: processed,\n totalErrors: errors.length,\n };\n }\n\n /**\n * Process with retry logic\n */\n private async processWithRetry<T>(\n func: () => Promise<T>,\n maxRetries: number,\n retryDelay: number,\n rateLimiter: RateLimiter,\n ): Promise<T> {\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt < maxRetries; attempt++) {\n try {\n return await rateLimiter.execute(func);\n } catch (error) {\n lastError = error as Error;\n if (attempt < maxRetries - 1) {\n await this.delay(retryDelay * (attempt + 1));\n }\n }\n }\n\n throw lastError || new Error('Max retries exceeded');\n }\n\n /**\n * Split array into chunks\n */\n private chunkArray<T>(array: T[], chunkSize: number): T[][] {\n const chunks: T[][] = [];\n const size = Math.max(1, chunkSize); // Ensure chunk size is at least 1\n for (let i = 0; i < array.length; i += size) {\n chunks.push(array.slice(i, i + size));\n }\n return chunks;\n }\n\n /**\n * Delay execution\n */\n private delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n\n/**\n * Rate limiter for API calls\n */\nexport class RateLimiter {\n private queue: Array<() => void> = [];\n private running = 0;\n\n constructor(private maxConcurrent: number, private minDelay: number) {}\n\n async execute<T>(fn: () => Promise<T>): Promise<T> {\n await this.waitForSlot();\n\n try {\n this.running++;\n const start = Date.now();\n const result = await fn();\n\n // Ensure minimum delay between calls\n const elapsed = Date.now() - start;\n if (elapsed < this.minDelay) {\n await this.delay(this.minDelay - elapsed);\n }\n\n return result;\n } finally {\n this.running--;\n this.processQueue();\n }\n }\n\n private waitForSlot(): Promise<void> {\n if (this.running < this.maxConcurrent) {\n return Promise.resolve();\n }\n\n return new Promise((resolve) => {\n this.queue.push(resolve);\n });\n }\n\n private processQueue(): void {\n if (this.queue.length > 0 && this.running < this.maxConcurrent) {\n const next = this.queue.shift();\n if (next) next();\n }\n }\n\n private delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n","import {\n Hash,\n P2PKH,\n PrivateKey,\n PublicKey,\n Script,\n Transaction,\n TransactionSignature,\n UnlockingScript,\n Utils,\n} from '@bsv/sdk';\nimport {\n Environment,\n GetSignatures,\n MNEEBalance,\n MNEEConfig,\n MneeInscription,\n SdkConfig,\n MneeSync,\n MNEEUtxo,\n ParseTxResponse,\n ParseTxExtendedResponse,\n ParseOptions,\n SendMNEE,\n TransferMultiOptions,\n SignatureRequest,\n SignatureResponse,\n TxHistory,\n TxHistoryResponse,\n TxOperation,\n AddressHistoryParams,\n TxAddressAmount,\n TransferResponse,\n TransferStatus,\n TxInputResponse,\n ProcessedInput,\n TxOutputResponse,\n ProcessedOutput,\n TransferOptions,\n BalanceResponse,\n} from './mnee.types.js';\nimport CosignTemplate from './mneeCosignTemplate.js';\nimport { applyInscription } from './utils/applyInscription.js';\nimport {\n isValidHex,\n parseCosignerScripts,\n parseInscription,\n parseSyncToTxHistory,\n validateAddress,\n validateTransferMultiOptions,\n validateTransferOptions,\n} from './utils/helper.js';\nimport { isNetworkError, logNetworkError } from './utils/networkError.js';\nimport { stacklessError } from './utils/stacklessError.js';\nimport {\n MNEE_PROXY_API_URL,\n SANDBOX_MNEE_API_URL,\n PROD_TOKEN_ID,\n PROD_MINT_ADDRESS,\n PROD_APPROVER,\n PUBLIC_PROD_MNEE_API_TOKEN,\n PUBLIC_SANDBOX_MNEE_API_TOKEN,\n SANDBOX_TOKEN_ID,\n SANDBOX_MINT_ADDRESS,\n SANDBOX_APPROVER,\n MNEE_DECIMALS,\n} from './constants.js';\nimport { RateLimiter } from './batch.js';\n\nexport class MNEEService {\n private mneeApiKey: string;\n private mneeConfig: MNEEConfig | undefined;\n private mneeApi: string;\n\n constructor(config: SdkConfig) {\n if (config.environment !== 'production' && config.environment !== 'sandbox') {\n throw stacklessError('Invalid environment. Must be either \"production\" or \"sandbox\"');\n }\n\n const isProd = config.environment === 'production';\n if (config?.apiKey === '') {\n throw stacklessError('MNEE API key cannot be an empty string');\n }\n if (config?.apiKey) {\n this.mneeApiKey = config.apiKey;\n } else {\n this.mneeApiKey = isProd ? PUBLIC_PROD_MNEE_API_TOKEN : PUBLIC_SANDBOX_MNEE_API_TOKEN;\n }\n this.mneeApi = isProd ? MNEE_PROXY_API_URL : SANDBOX_MNEE_API_URL;\n this.getCosignerConfig().catch(() => {});\n }\n\n public async getCosignerConfig(): Promise<MNEEConfig> {\n try {\n const response = await fetch(`${this.mneeApi}/v1/config?auth_token=${this.mneeApiKey}`, { method: 'GET' });\n\n if (response.status === 401 || response.status === 403) {\n throw stacklessError('Invalid API key');\n }\n\n if (!response.ok) throw stacklessError(`HTTP error! status: ${response.status}`);\n const data: MNEEConfig = await response.json();\n this.mneeConfig = data;\n return data;\n } catch (error) {\n if (isNetworkError(error)) {\n logNetworkError(error, 'fetch config');\n }\n throw error;\n }\n }\n\n public toAtomicAmount(amount: number): number {\n return Math.round(amount * 10 ** MNEE_DECIMALS);\n }\n\n public fromAtomicAmount(amount: number): number {\n return amount / 10 ** MNEE_DECIMALS;\n }\n\n private async createInscription(recipient: string, amount: number, config: MNEEConfig) {\n const inscriptionData = {\n p: 'bsv-20',\n op: 'transfer',\n id: config.tokenId,\n amt: amount.toString(),\n };\n return {\n lockingScript: applyInscription(new CosignTemplate().lock(recipient, PublicKey.fromString(config.approver)), {\n dataB64: Buffer.from(JSON.stringify(inscriptionData)).toString('base64'),\n contentType: 'application/bsv-20',\n }),\n satoshis: 1,\n };\n }\n\n public async getUtxos(\n address: string | string[],\n page?: number,\n size?: number,\n order?: 'asc' | 'desc',\n ): Promise<MNEEUtxo[]> {\n try {\n if (!address) {\n throw stacklessError('Address is required');\n }\n if (page !== undefined) {\n if (typeof page !== 'number' || page <= 0 || !Number.isFinite(page)) {\n throw stacklessError(`Invalid page: ${page}. Must be a positive integer`);\n }\n }\n\n if (size !== undefined) {\n if (typeof size !== 'number' || size <= 0 || !Number.isInteger(size)) {\n throw stacklessError(`Invalid size: ${size}. Must be a positive integer`);\n }\n }\n\n if (order !== undefined) {\n if (order !== 'asc' && order !== 'desc') {\n throw stacklessError(`Invalid order: ${order}. Must be 'asc' or 'desc'`);\n }\n }\n\n // Handle single address\n if (typeof address === 'string') {\n if (!validateAddress(address)) {\n throw stacklessError(`Invalid Bitcoin address: ${address}`);\n }\n const arrayAddress = [address];\n const response = await fetch(\n `${this.mneeApi}/v2/utxos?auth_token=${this.mneeApiKey}${page !== undefined ? `&page=${page}` : ''}${\n size !== undefined ? `&size=${size}` : ''\n }${order ? `&order=${order}` : ''}`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(arrayAddress),\n },\n );\n if (response.status === 401 || response.status === 403) {\n throw stacklessError('Invalid API key');\n }\n if (!response.ok) throw stacklessError(`HTTP error! status: ${response.status}`);\n const data: MNEEUtxo[] = await response.json();\n const ops = ['transfer', 'deploy+mint'];\n return data.filter((utxo) =>\n ops.includes(utxo.data.bsv21.op.toLowerCase() as 'transfer' | 'burn' | 'deploy+mint'),\n );\n }\n\n // Handle array of addresses - filter out invalid ones\n if (Array.isArray(address)) {\n const validAddresses = address.filter((addr) => typeof addr === 'string' && validateAddress(addr));\n\n if (validAddresses.length === 0) {\n throw stacklessError('No valid Bitcoin addresses provided');\n }\n\n // Log warning about invalid addresses\n const invalidAddresses = address.filter((addr) => typeof addr !== 'string' || !validateAddress(addr));\n if (invalidAddresses.length > 0) {\n console.warn(`\\x1b[33m${invalidAddresses.length} invalid bitcoin addresses will be ignored\\x1b[0m`);\n }\n\n const response = await fetch(\n `${this.mneeApi}/v2/utxos?auth_token=${this.mneeApiKey}${page !== undefined ? `&page=${page}` : ''}${\n size !== undefined ? `&size=${size}` : ''\n }${order ? `&order=${order}` : ''}`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(validAddresses),\n },\n );\n if (response.status === 401 || response.status === 403) {\n throw stacklessError('Invalid API key');\n }\n if (!response.ok) throw stacklessError(`HTTP error! status: ${response.status}`);\n const data: MNEEUtxo[] = await response.json();\n const ops = ['transfer', 'deploy+mint'];\n return data.filter((utxo) =>\n ops.includes(utxo.data.bsv21.op.toLowerCase() as 'transfer' | 'burn' | 'deploy+mint'),\n );\n }\n\n throw stacklessError('Invalid input type for address');\n } catch (error) {\n if (isNetworkError(error)) {\n logNetworkError(error, 'fetch UTXOs');\n }\n throw error;\n }\n }\n\n private async fetchRawTx(txid: string, retries: number = 3): Promise<Transaction | undefined> {\n for (let attempt = 0; attempt <= retries; attempt++) {\n try {\n const resp = await fetch(`${this.mneeApi}/v1/tx/${txid}?auth_token=${this.mneeApiKey}`);\n\n if (resp.status === 404) throw stacklessError('Transaction not found');\n if (resp.status === 401 || resp.status === 403) {\n throw stacklessError('Invalid API key');\n }\n\n // Handle rate limiting with retry\n if (resp.status === 429 && attempt < retries) {\n // For rate limiting, use longer delay with exponential backoff\n const delay = Math.min(500 * Math.pow(2, attempt), 2000); // 500ms, 1s, 2s max\n await new Promise((resolve) => setTimeout(resolve, delay));\n continue;\n }\n\n if (resp.status !== 200) {\n throw stacklessError(`${resp.status} - Failed to fetch rawtx for txid: ${txid}`);\n }\n\n const { rawtx } = await resp.json();\n return Transaction.fromHex(Buffer.from(rawtx, 'base64').toString('hex'));\n } catch (error) {\n if (attempt === retries) {\n if (isNetworkError(error)) {\n logNetworkError(error, 'fetch transaction');\n }\n return undefined;\n }\n // For network errors, use a shorter fixed delay\n await new Promise((resolve) => setTimeout(resolve, 200));\n }\n }\n return undefined;\n }\n\n private async getSignatures(\n request: GetSignatures,\n privateKey: PrivateKey,\n ): Promise<{\n sigResponses?: SignatureResponse[];\n error?: { message: string; cause?: any };\n }> {\n try {\n const DEFAULT_SIGHASH_TYPE = 65;\n let tx: Transaction;\n switch (request.format) {\n case 'beef':\n tx = Transaction.fromHexBEEF(request.rawtx);\n break;\n case 'ef':\n tx = Transaction.fromHexEF(request.rawtx);\n break;\n default:\n tx = Transaction.fromHex(request.rawtx);\n break;\n }\n const sigResponses: SignatureResponse[] = request.sigRequests.flatMap((sigReq: SignatureRequest) => {\n return [privateKey].map((privKey: PrivateKey) => {\n const preimage = TransactionSignature.format({\n sourceTXID: sigReq.prevTxid,\n sourceOutputIndex: sigReq.outputIndex,\n sourceSatoshis: sigReq.satoshis,\n transactionVersion: tx.version,\n otherInputs: tx.inputs.filter((_, index) => index !== sigReq.inputIndex),\n inputIndex: sigReq.inputIndex,\n outputs: tx.outputs,\n inputSequence: tx.inputs[sigReq.inputIndex].sequence || 0,\n subscript: sigReq.script\n ? Script.fromHex(sigReq.script)\n : new P2PKH().lock(privKey.toPublicKey().toAddress()),\n lockTime: tx.lockTime,\n scope: sigReq.sigHashType || DEFAULT_SIGHASH_TYPE,\n });\n const rawSignature = privKey.sign(Hash.sha256(preimage));\n const sig = new TransactionSignature(\n rawSignature.r,\n rawSignature.s,\n sigReq.sigHashType || DEFAULT_SIGHASH_TYPE,\n );\n return {\n sig: Utils.toHex(sig.toChecksigFormat()),\n pubKey: privKey.toPublicKey().toString(),\n inputIndex: sigReq.inputIndex,\n sigHashType: sigReq.sigHashType || DEFAULT_SIGHASH_TYPE,\n csIdx: sigReq.csIdx,\n };\n });\n });\n return Promise.resolve({ sigResponses });\n } catch (err: any) {\n if (isNetworkError(err)) {\n logNetworkError(err, 'get signatures');\n }\n return {\n error: {\n message: err.message ?? 'unknown',\n cause: err.cause,\n },\n };\n }\n }\n\n public async getEnoughUtxos(address: string, totalAtomicTokenAmount: number): Promise<MNEEUtxo[]> {\n const config = this.mneeConfig || (await this.getCosignerConfig());\n if (!config) throw stacklessError('Config not fetched');\n const fees = config.fees;\n const fee = fees.find((f) => totalAtomicTokenAmount >= f.min && totalAtomicTokenAmount <= f.max);\n if (!fee) throw stacklessError('Fee not found');\n const feeAmount = fee.fee;\n const requiredAmount = totalAtomicTokenAmount + feeAmount;\n\n const balance = await this.getBalance(address);\n if (balance.amount < requiredAmount) {\n const maxTransferAmount = this.fromAtomicAmount(balance.amount - feeAmount);\n throw stacklessError(`Insufficient MNEE balance. Max transfer amount: ${maxTransferAmount}`);\n }\n\n let page = 1;\n let size = 25;\n let allUtxos: MNEEUtxo[] = [];\n let totalUtxoAmount = 0;\n\n // Collect UTXOs until we have enough\n while (totalUtxoAmount < requiredAmount) {\n const pageUtxos = await this.getUtxos(address, page, size);\n if (pageUtxos.length === 0) {\n // This shouldn't happen given we checked balance, but handle gracefully\n const maxTransferAmount = this.fromAtomicAmount(totalUtxoAmount - feeAmount);\n throw stacklessError(`Insufficient MNEE balance. Max transfer amount: ${maxTransferAmount}`);\n }\n\n allUtxos.push(...pageUtxos);\n totalUtxoAmount = allUtxos.reduce((sum, utxo) => sum + utxo.data.bsv21.amt, 0);\n\n if (totalUtxoAmount >= requiredAmount) {\n break;\n }\n\n page++;\n }\n\n // Sort all collected UTXOs by amount (highest first) for optimal selection\n allUtxos.sort((a, b) => b.data.bsv21.amt - a.data.bsv21.amt);\n\n // Select only the UTXOs we need\n let selectedUtxos: MNEEUtxo[] = [];\n let selectedAmount = 0;\n\n for (const utxo of allUtxos) {\n selectedUtxos.push(utxo);\n selectedAmount += utxo.data.bsv21.amt;\n if (selectedAmount >= requiredAmount) {\n break;\n }\n }\n\n return selectedUtxos;\n }\n\n public async getAllUtxos(address: string): Promise<MNEEUtxo[]> {\n // loop through and get all utxos\n let page = 1;\n let size = 100;\n let utxos: MNEEUtxo[] = [];\n while (true) {\n const pageUtxos = await this.getUtxos(address, page, size);\n if (pageUtxos.length === 0) break;\n utxos.push(...pageUtxos);\n page++;\n }\n return utxos;\n }\n\n public async transfer(\n request: SendMNEE[],\n wif: string,\n transferOptions?: TransferOptions,\n ): Promise<TransferResponse> {\n try {\n const config = this.mneeConfig || (await this.getCosignerConfig());\n if (!config) throw stacklessError('Config not fetched');\n\n const { isValid, totalAmount, privateKey, error } = validateTransferOptions(request, wif);\n if (!isValid) throw stacklessError(error || 'Invalid transfer options');\n if (!privateKey) throw stacklessError('Private key not found');\n if (!totalAmount) throw stacklessError('Invalid amount');\n\n const totalAtomicTokenAmount = this.toAtomicAmount(totalAmount);\n\n const address = privateKey.toAddress();\n const utxos = await this.getEnoughUtxos(address, totalAtomicTokenAmount);\n\n const fee =\n request.find((req) => req.address === config.burnAddress) !== undefined\n ? 0\n : config.fees.find(\n (fee: { min: number; max: number }) =>\n totalAtomicTokenAmount >= fee.min && totalAtomicTokenAmount <= fee.max,\n )?.fee;\n if (fee === undefined) throw stacklessError('Fee ranges inadequate');\n\n const tx = new Transaction(1, [], [], 0);\n let tokensIn = 0;\n let changeAddress = '';\n\n while (tokensIn < totalAtomicTokenAmount + fee) {\n const utxo = utxos.shift();\n if (!utxo) {\n const balance = await this.getBalance(address);\n const maxTransferAmount = this.fromAtomicAmount(balance.amount - fee);\n throw stacklessError('Insufficient MNEE balance. Max transfer amount is ' + maxTransferAmount);\n }\n\n const sourceTransaction = await this.fetchRawTx(utxo.txid);\n if (!sourceTransaction) throw stacklessError(`Failed to fetch source transaction: ${utxo.txid}_${utxo.vout}`);\n\n changeAddress = changeAddress || utxo.owners[0];\n tx.addInput({\n sourceTXID: utxo.txid,\n sourceOutputIndex: utxo.vout,\n sourceTransaction,\n unlockingScript: new UnlockingScript(),\n });\n tokensIn += utxo.data.bsv21.amt;\n }\n\n for (const req of request) {\n tx.addOutput(await this.createInscription(req.address, this.toAtomicAmount(req.amount), config));\n }\n if (fee > 0) tx.addOutput(await this.createInscription(config.feeAddress, fee, config));\n\n const change = tokensIn - totalAtomicTokenAmount - fee;\n if (change > 0) {\n tx.addOutput(await this.createInscription(changeAddress, change, config));\n }\n\n const privateKeys = new Map<number, PrivateKey>();\n for (let i = 0; i < tx.inputs.length; i++) {\n privateKeys.set(i, privateKey);\n }\n\n const signResult = await this.signAllInputs(tx, privateKeys);\n if (signResult.error) throw stacklessError(signResult.error);\n\n const rawtx = tx.toHex();\n\n if (transferOptions?.broadcast === false) {\n return { rawtx };\n }\n\n const { ticketId } = await this.submitRawTx(rawtx, transferOptions);\n if (!ticketId) throw stacklessError('Failed to broadcast transaction');\n return { ticketId };\n } catch (error) {\n if (isNetworkError(error)) {\n logNetworkError(error, 'transfer tokens');\n }\n throw error;\n }\n }\n\n public async submitRawTx(\n rawtx: string,\n transferOptions: TransferOptions = { broadcast: true, callbackUrl: undefined },\n ): Promise<TransferResponse> {\n try {\n if (transferOptions?.broadcast !== false) {\n transferOptions = { ...transferOptions, broadcast: true };\n }\n if (transferOptions?.callbackUrl && transferOptions?.broadcast === false) {\n throw stacklessError('Callback URL cannot be provided when broadcast is false');\n }\n if (!rawtx) {\n throw stacklessError('Raw transaction is required');\n }\n\n // Convert to base64 format for V2 API\n const tx = Transaction.fromHex(rawtx);\n if (!transferOptions?.broadcast) {\n return { rawtx: tx.toHex() };\n }\n const base64Tx = Utils.toBase64(tx.toBinary());\n\n const requestBody = JSON.stringify(\n transferOptions ? { rawtx: base64Tx, callback_url: transferOptions.callbackUrl } : { rawtx: base64Tx },\n );\n\n // Submit to V2 transfer endpoint for async processing\n const response = await fetch(`${this.mneeApi}/v2/transfer?auth_token=${this.mneeApiKey}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: requestBody,\n });\n\n if (!response.ok) {\n throw stacklessError(`Failed to submit transaction`);\n }\n\n const ticketId = await response.text();\n\n return { ticketId };\n } catch (error) {\n if (isNetworkError(error)) {\n logNetworkError(error, 'submit raw transaction');\n }\n throw error;\n }\n }\n\n public async getTxStatus(ticketId: string): Promise<TransferStatus> {\n try {\n if (!ticketId) {\n throw stacklessError('Ticket ID is required');\n }\n\n const response = await fetch(`${this.mneeApi}/v2/ticket?ticketID=${ticketId}&auth_token=${this.mneeApiKey}`, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n throw stacklessError(`Failed to get transaction status`);\n }\n\n const status: TransferStatus = await response.json();\n return status;\n } catch (error) {\n if (isNetworkError(error)) {\n logNetworkError(error, 'get transaction status');\n }\n throw error;\n }\n }\n\n public async getBalance(address: string): Promise<MNEEBalance> {\n // Validate address before making any API calls\n if (!validateAddress(address)) {\n const error = stacklessError(`Invalid Bitcoin address: ${address}`);\n throw error;\n }\n\n try {\n const config = this.mneeConfig || (await this.getCosignerConfig());\n if (!config) throw stacklessError('Config not fetched');\n\n const response = await fetch(`${this.mneeApi}/v2/balance?auth_token=${this.mneeApiKey}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify([address]),\n });\n\n if (!response.ok) {\n throw stacklessError(`Failed to get transaction status: ${response.status}`);\n }\n\n const balanceData: BalanceResponse = await response.json();\n\n // Handle empty array response (no balance for address)\n if (!balanceData || balanceData.length === 0) {\n return {\n address: address,\n amount: 0,\n decimalAmount: 0,\n };\n }\n\n return {\n address: balanceData[0].address,\n amount: balanceData[0].amt,\n decimalAmount: balanceData[0].precised,\n };\n } catch (error) {\n if (isNetworkError(error)) {\n logNetworkError(error, 'fetch balance');\n }\n throw error;\n }\n }\n\n public async getBalances(addresses: string[]): Promise<MNEEBalance[]> {\n if (!Array.isArray(addresses)) {\n throw stacklessError('Addresses must be an array');\n }\n const validAddresses = addresses.filter((addr) => validateAddress(addr));\n if (validAddresses.length === 0) {\n throw stacklessError('You must pass at least 1 valid address');\n }\n const totalInvalidAddresses = addresses.length - validAddresses.length;\n if (totalInvalidAddresses > 0) {\n console.warn(`\\x1b[33m${totalInvalidAddresses} invalid bitcoin addresses will be ignored\\x1b[0m`);\n }\n try {\n const config = this.mneeConfig || (await this.getCosignerConfig());\n if (!config) throw stacklessError('Config not fetched');\n const response = await fetch(`${this.mneeApi}/v2/balance?auth_token=${this.mneeApiKey}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(validAddresses),\n });\n\n if (!response.ok) {\n throw stacklessError(`Failed to get transaction status: ${response.status}`);\n }\n\n const balanceData: BalanceResponse = await response.json();\n\n // If API returns empty array, return all addresses with 0 balance\n if (!balanceData || balanceData.length === 0) {\n return validAddresses.map((addr) => ({\n address: addr,\n amount: 0,\n decimalAmount: 0,\n }));\n }\n\n // Create a map of addresses that have balances\n const balanceMap = new Map();\n balanceData.forEach((balance) => {\n balanceMap.set(balance.address, {\n address: balance.address,\n amount: balance.amt,\n decimalAmount: balance.precised,\n });\n });\n\n // Return all requested addresses, with 0 for those not in response\n return validAddresses.map((addr) => {\n if (balanceMap.has(addr)) {\n return balanceMap.get(addr);\n }\n return {\n address: addr,\n amount: 0,\n decimalAmount: 0,\n };\n });\n } catch (error) {\n if (isNetworkError(error)) {\n logNetworkError(error, 'fetch balances');\n }\n throw error;\n }\n }\n\n private processMneeValidation(tx: Transaction, config: MNEEConfig, request?: SendMNEE[]) {\n try {\n const txid = tx.id('hex');\n const isDeployTx = txid === config.tokenId.split('_')[0];\n\n const scripts = tx.outputs.map((output) => output.lockingScript);\n const parsedScripts = parseCosignerScripts(scripts);\n\n // Build a map of all outputs with their inscriptions\n const outputDetails = tx.outputs.map((output, idx) => {\n const script = output.lockingScript;\n const parsed = parsedScripts[idx];\n const inscription = parseInscription(script);\n\n let inscriptionData = null;\n if (inscription?.file?.content) {\n try {\n const content = Utils.toUTF8(inscription.file.content);\n if (content) {\n inscriptionData = JSON.parse(content);\n }\n } catch (e) {\n // Not a valid JSON inscription, skip\n }\n }\n\n return {\n index: idx,\n address: parsed?.address,\n cosigner: parsed?.cosigner,\n inscription: inscriptionData,\n };\n });\n\n // Check for cosigner presence and validity\n const hasCosigner = outputDetails.some((o) => o.cosigner === config.approver);\n const invalidCosigner = outputDetails.find((o) => o.cosigner !== '' && o.cosigner !== config.approver);\n\n if (invalidCosigner) {\n throw stacklessError('Invalid cosigner detected');\n }\n\n // Get all valid MNEE inscriptions\n const mneeInscriptions = outputDetails.filter((output) => {\n if (!output.inscription) return false;\n\n const insc = output.inscription as MneeInscription;\n if (insc.p !== 'bsv-20') return false;\n\n // Check token ID (skip for deploy transactions)\n if (!isDeployTx && insc.id !== config.tokenId) {\n throw stacklessError(`Invalid token ID: ${insc.id}`);\n }\n\n // Validate amount\n const amt = parseInt(insc.amt, 10);\n if (isNaN(amt) || amt <= 0) {\n throw stacklessError(`Invalid MNEE amount: ${insc.amt}`);\n }\n\n return true;\n });\n\n if (mneeInscriptions.length === 0) {\n throw stacklessError('No valid MNEE inscriptions found in transaction');\n }\n\n // Check what operations we have\n const operations = new Set(mneeInscriptions.map((o) => (o.inscription as MneeInscription).op));\n const hasBurn = operations.has('burn');\n\n // Check for redeem operations (transfer with redeem metadata)\n const hasRedeem = mneeInscriptions.some(\n (o) =>\n (o.inscription as MneeInscription).op === 'transfer' &&\n (o.inscription as MneeInscription).metadata?.action === 'redeem',\n );\n\n // Check if this is a redeem from mint address (which doesn't require cosigner)\n const isRedeemFromMint =\n hasRedeem && outputDetails.some((o) => o.address === SANDBOX_MINT_ADDRESS || o.address === PROD_MINT_ADDRESS);\n\n // Check for regular transfers (not redeems)\n const hasRegularTransfer = operations.has('transfer') && !hasRedeem;\n\n // Require cosigner for regular transfers, burns, and non-mint redeems\n if ((hasRegularTransfer || hasBurn || (hasRedeem && !isRedeemFromMint)) && !hasCosigner) {\n throw stacklessError('Cosigner not found in transaction with transfer/burn/redeem operation');\n }\n\n const mneeOutputsForValidation = mneeInscriptions.filter((output) => {\n const insc = output.inscription as MneeInscription;\n return insc.op === 'transfer' || insc.op === 'burn' || insc.op === 'deploy+mint';\n });\n\n // If request is provided, validate it matches the transaction\n if (request) {\n // Ensure we have enough outputs for all requests (including duplicates)\n const remainingOutputs = [...mneeOutputsForValidation];\n for (const req of request) {\n const outputIndex = remainingOutputs.findIndex(\n (output) =>\n output.address === req.address &&\n (output.inscription as MneeInscription).amt === this.toAtomicAmount(req.amount).toString(),\n );\n\n if (outputIndex === -1) {\n throw stacklessError(`No matching output found for ${req.address} with amount ${req.amount}`);\n }\n\n // Remove the matched output so it can't be matched again\n remainingOutputs.splice(outputIndex, 1);\n }\n }\n\n return true;\n } catch (error) {\n if (isNetworkError(error)) {\n logNetworkError(error, 'validate Mnee transaction');\n }\n return false;\n }\n }\n\n public async validateMneeTx(rawTx: string, request?: SendMNEE[]) {\n try {\n const config = this.mneeConfig || (await this.getCosignerConfig());\n if (!config) throw stacklessError('Config not fetched');\n const tx = Transaction.fromHex(rawTx);\n const isValid = this.processMneeValidation(tx, config, request);\n\n if (!isValid) return false;\n\n const txid = tx.id('hex');\n const isDeployTx = txid === config.tokenId.split('_')[0];\n\n // For non-deploy transactions, validate input/output totals\n if (!isDeployTx) {\n const inputData = await this.processTransactionInputs(tx, config);\n const outputData = this.processTransactionOutputs(tx, config);\n\n if (inputData.total !== outputData.total) {\n return false;\n }\n }\n\n return true;\n } catch (error) {\n if (isNetworkError(error)) {\n logNetworkError(error, 'validate Mnee transaction');\n }\n return false;\n }\n }\n\n private async getMneeSyncs(\n addresses: string | string[],\n fromScore?: number,\n limit?: number,\n order?: 'asc' | 'desc',\n ): Promise<{ address: string; syncs: MneeSync[] }[]> {\n try {\n const addressArray = Array.isArray(addresses) ? addresses : [addresses];\n const response = await fetch(\n `${this.mneeApi}/v1/sync?auth_token=${this.mneeApiKey}${fromScore ? `&from=${fromScore}` : ''}${\n limit ? `&limit=${limit}` : ''\n }${order ? `&order=${order}` : ''}`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(addressArray),\n },\n );\n if (response.status === 401 || response.status === 403) {\n throw stacklessError('Invalid API key');\n }\n if (!response.ok) throw stacklessError(`HTTP error! status: ${response.status}`);\n const data: MneeSync[] = await response.json();\n\n // Group syncs by address\n const syncsByAddress = addressArray.map((address) => {\n const filteredSyncs = data.filter((sync) => sync.senders.includes(address) || sync.receivers.includes(address));\n return { address, syncs: filteredSyncs };\n });\n\n return syncsByAddress;\n } catch (error) {\n if (isNetworkError(error)) {\n logNetworkError(error, 'fetch syncs');\n }\n throw error;\n }\n }\n\n public async getRecentTxHistory(\n address: string,\n fromScore?: number,\n limit?: number,\n order?: 'asc' | 'desc',\n ): Promise<TxHistoryResponse> {\n if (!validateAddress(address)) {\n const error = stacklessError(`Invalid Bitcoin address: ${address}`);\n throw error;\n }\n\n if (fromScore !== undefined) {\n if (typeof fromScore !== 'number' || fromScore < 0 || !Number.isFinite(fromScore)) {\n throw stacklessError(`Invalid fromScore: ${fromScore}. Must be a positive number or 0`);\n }\n }\n\n if (limit !== undefined) {\n if (typeof limit !== 'number' || limit <= 0 || !Number.isInteger(limit)) {\n throw stacklessError(`Invalid limit: ${limit}. Must be a positive integer`);\n }\n }\n\n if (order !== undefined) {\n if (order !== 'asc' && order !== 'desc') {\n throw stacklessError(`Invalid order: ${order}. Must be 'asc' or 'desc'`);\n }\n }\n\n try {\n const config = this.mneeConfig || (await this.getCosignerConfig());\n if (!config) throw stacklessError('Config not fetched');\n\n const syncsByAddress = await this.getMneeSyncs(address, fromScore, limit, order);\n const { syncs } = syncsByAddress[0]; // We're only requesting one address\n\n if (!syncs || syncs.length === 0) return { address, history: [], nextScore: fromScore || 0 };\n\n const txHistory: TxHistory[] = [];\n for (const sync of syncs) {\n const historyItem = parseSyncToTxHistory(sync, address, config);\n if (historyItem) {\n txHistory.push(historyItem);\n }\n }\n\n const nextScore = txHistory.length > 0 ? txHistory[txHistory.length - 1].score : fromScore || 0;\n\n if (limit && txHistory.length > limit) {\n return {\n address,\n history: txHistory.slice(0, limit),\n nextScore,\n };\n }\n\n return {\n address,\n history: txHistory,\n nextScore,\n };\n } catch (error) {\n if (isNetworkError(error)) {\n logNetworkError(error, 'fetch transaction history');\n }\n throw error;\n }\n }\n\n public async getRecentTxHistories(params: AddressHistoryParams[]): Promise<TxHistoryResponse[]> {\n if (!Array.isArray(params)) {\n throw stacklessError('Parameters must be an array');\n }\n\n if (params.length === 0) {\n throw stacklessError('You must pass at least 1 address parameter');\n }\n\n // Filter out invalid addresses and keep only valid ones\n const validParams = params.filter((param) => param && param.address && validateAddress(param.address));\n\n if (validParams.length === 0) {\n throw stacklessError('You must pass at least 1 valid address');\n }\n\n const totalInvalidAddresses = params.length - validParams.length;\n if (totalInvalidAddresses > 0) {\n console.warn(`\\x1b[33m${totalInvalidAddresses} invalid bitcoin addresses will be ignored\\x1b[0m`);\n }\n\n for (const param of validParams) {\n if (param.fromScore !== undefined) {\n if (typeof param.fromScore !== 'number' || param.fromScore < 0 || !Number.isFinite(param.fromScore)) {\n throw stacklessError(\n `Invalid fromScore for address ${param.address}: ${param.fromScore}. Must be a positive number or 0`,\n );\n }\n }\n\n if (param.limit !== undefined) {\n if (typeof param.limit !== 'number' || param.limit <= 0 || !Number.isInteger(param.limit)) {\n throw stacklessError(\n `Invalid limit for address ${param.address}: ${param.limit}. Must be a positive integer`,\n );\n }\n }\n\n if (param.order !== undefined) {\n if (param.order !== 'asc' && param.order !== 'desc') {\n throw stacklessError(`Invalid order for address ${param.address}: ${param.order}. Must be 'asc' or 'desc'`);\n }\n }\n }\n\n try {\n const config = this.mneeConfig || (await this.getCosignerConfig());\n if (!config) throw stacklessError('Config not fetched');\n\n // Group addressParams by fromScore, limit, and order to batch requests efficiently\n const groupedParams: Record<string, AddressHistoryParams[]> = {};\n validParams.forEach((param) => {\n const key = `${param.fromScore || 0}:${param.limit || 100}:${param.order || 'default'}`;\n if (!groupedParams[key]) {\n groupedParams[key] = [];\n }\n groupedParams[key].push(param);\n });\n\n // Process each group in parallel\n const groupPromises = Object.entries(groupedParams).map(async ([key, addressParams]) => {\n const [fromScoreStr, limitStr, orderStr] = key.split(':');\n const fromScore = Number(fromScoreStr);\n const limit = Number(limitStr);\n const order = orderStr === 'default' ? undefined : (orderStr as 'asc' | 'desc');\n const addresses = addressParams.map((p) => p.address);\n\n const syncsByAddress = await this.getMneeSyncs(addresses, fromScore, limit, order);\n\n // Process each address's syncs\n return syncsByAddress.map(({ address, syncs }) => {\n const param = addressParams.find((p) => p.address === address);\n if (!syncs || syncs.length === 0) {\n return {\n address,\n history: [],\n nextScore: param?.fromScore || 0,\n };\n }\n\n const txHistory: TxHistory[] = [];\n const seenTxids = new Set<string>();\n\n for (const sync of syncs) {\n const historyItem = parseSyncToTxHistory(sync, address, config);\n if (historyItem && !seenTxids.has(historyItem.txid)) {\n seenTxids.add(historyItem.txid);\n txHistory.push(historyItem);\n }\n }\n\n const nextScore = txHistory.length > 0 ? txHistory[txHistory.length - 1].score : param?.fromScore || 0;\n const paramLimit = param?.limit;\n\n if (paramLimit && txHistory.length > paramLimit) {\n return {\n address,\n history: txHistory.slice(0, paramLimit),\n nextScore,\n };\n }\n\n return {\n address,\n history: txHistory,\n nextScore,\n };\n });\n });\n\n // Flatten the results\n const results = await Promise.all(groupPromises);\n return results.flat();\n } catch (error) {\n if (isNetworkError(error)) {\n logNetworkError(error, 'fetch transaction histories');\n }\n throw error;\n }\n }\n\n // ============================================\n // parseTransaction HELPERS\n // ============================================\n\n /**\n * Parses inscription data from a script\n * @param script The script to parse\n * @returns The parsed inscription data or null if invalid\n */\n private parseInscriptionData(script: Script): MneeInscription | null {\n try {\n const inscription = parseInscription(script);\n const content = inscription?.file?.content;\n if (!content) return null;\n\n const inscriptionData = Utils.toUTF8(content);\n if (!inscriptionData) return null;\n\n return JSON.parse(inscriptionData) as MneeInscription;\n } catch (error) {\n if (isNetworkError(error)) {\n logNetworkError(error, 'parse inscription data');\n }\n return null;\n }\n }\n\n private determineEnvironment(txid: string, tokenId: string, cosigner: string, address: string): Environment {\n // Highest priority: specific transaction IDs\n if (txid === PROD_TOKEN_ID.split('_')[0]) return 'production'; // genesis (deploy) transaction\n if (txid === SANDBOX_TOKEN_ID.split('_')[0]) return 'sandbox'; // genesis (deploy) transaction\n\n // Production if BOTH token and approver match\n if (tokenId === PROD_TOKEN_ID && cosigner === PROD_APPROVER) {\n return 'production';\n }\n\n // Sandbox if BOTH token and approver match\n if (tokenId === SANDBOX_TOKEN_ID && cosigner === SANDBOX_APPROVER) {\n return 'sandbox';\n }\n\n // Special case: empty cosigner with production address (mint operations)\n if (cosigner === '' && address === PROD_MINT_ADDRESS) {\n return 'production';\n }\n\n // Special case: empty cosigner with sandbox address (mint operations)\n if (cosigner === '' && address === SANDBOX_MINT_ADDRESS) {\n return 'sandbox';\n }\n\n // Default to sandbox for all other cases\n return 'sandbox';\n }\n\n private determineTransactionType(\n operation: string,\n address: string,\n txid: string,\n mintAddress: string,\n tokenId: string,\n ): TxOperation {\n // Highest priority: burn operation\n if (operation === 'burn') return 'burn';\n\n // Deploy+mint operation\n if (operation === 'deploy+mint' || address === mintAddress) {\n // If txid matches the token ID prefix, it's a deploy\n return txid === tokenId.split('_')[0] ? 'deploy' : 'mint';\n }\n\n // Known addresses indicate mint\n if (address === PROD_MINT_ADDRESS || address === SANDBOX_MINT_ADDRESS) {\n return 'mint';\n }\n\n // Default to transfer\n return 'transfer';\n }\n\n private async processTransactionInputs(tx: Transaction, config: MNEEConfig): Promise<TxInputResponse> {\n const txid = tx.id('hex');\n const inputs: ProcessedInput[] = new Array(tx.inputs.length);\n let total = BigInt(0);\n let environment: Environment | undefined;\n let type: TxOperation | undefined;\n\n // Create a rate limiter for 3 requests per second (default MNEE API rate limit ok being hardcoded)\n const rateLimiter = new RateLimiter(3, 334);\n\n const fetchTasks = tx.inputs.map(async (input, index) => {\n if (!input.sourceTXID) {\n return { index, sourceTx: null };\n }\n\n try {\n const sourceTx = await rateLimiter.execute(() => this.fetchRawTx(input.sourceTXID!));\n return { index, sourceTx };\n } catch (error) {\n if (isNetworkError(error)) {\n logNetworkError(error, 'fetch source transaction');\n }\n return { index, sourceTx: null };\n }\n });\n\n const results = await Promise.all(fetchTasks);\n\n for (const { index, sourceTx } of results) {\n const input = tx.inputs[index];\n if (!sourceTx || !input.sourceTXID) {\n inputs[index] = {\n address: undefined,\n amount: 0,\n satoshis: 0,\n inscription: null,\n cosigner: undefined,\n };\n continue;\n }\n\n const sourceOutput = sourceTx.outputs[input.sourceOutputIndex];\n const parsedCosigner = parseCosignerScripts([sourceOutput.lockingScript])[0];\n const inscription = this.parseInscriptionData(sourceOutput.lockingScript);\n\n const processedInput: ProcessedInput = {\n address: parsedCosigner?.address,\n amount: inscription ? parseInt(inscription.amt) : 0,\n satoshis: Number(sourceOutput.satoshis),\n inscription,\n cosigner: parsedCosigner,\n };\n\n inputs[index] = processedInput;\n\n if (inscription && parsedCosigner) {\n total += BigInt(inscription.amt);\n\n // Determine environment if not already set\n if (!environment) {\n environment = this.determineEnvironment(\n txid,\n inscription.id,\n parsedCosigner.cosigner || '',\n parsedCosigner.address || '',\n );\n }\n\n // Determine type if not already set\n if (!type) {\n type = this.determineTransactionType(\n inscription.op,\n parsedCosigner.address || '',\n txid,\n config.mintAddress,\n config.tokenId,\n );\n }\n }\n }\n\n return { inputs, total, environment, type };\n }\n\n private processTransactionOutputs(tx: Transaction, config: MNEEConfig): TxOutputResponse {\n const txid = tx.id('hex');\n const outputs: ProcessedOutput[] = [];\n let total = BigInt(0);\n let environment: Environment | undefined;\n let type: TxOperation | undefined;\n\n for (let i = 0; i < tx.outputs.length; i++) {\n const output = tx.outputs[i];\n\n const parsedCosigner = parseCosignerScripts([output.lockingScript])[0];\n const inscription = this.parseInscriptionData(output.lockingScript);\n\n const processedOutput: ProcessedOutput = {\n address: parsedCosigner?.address,\n amount: inscription ? parseInt(inscription.amt) : 0,\n satoshis: Number(output.satoshis),\n inscription,\n cosigner: parsedCosigner,\n };\n\n outputs.push(processedOutput);\n\n if (inscription && parsedCosigner) {\n total += BigInt(inscription.amt);\n\n environment = this.determineEnvironment(\n txid,\n inscription.id,\n parsedCosigner.cosigner || '',\n parsedCosigner.address || '',\n );\n\n const outputType = this.determineTransactionType(\n inscription.op,\n parsedCosigner.address || '',\n txid,\n config.mintAddress,\n config.tokenId,\n );\n\n if (outputType === 'burn' || outputType === 'deploy') {\n type = outputType;\n } else if (!type) {\n type = outputType;\n }\n }\n }\n\n return { outputs, total, environment, type };\n }\n\n private validateTransaction(\n config: MNEEConfig,\n tx: Transaction,\n type: TxOperation,\n inputTotal: bigint,\n outputTotal: bigint,\n ): boolean {\n const isValidMnee = this.processMneeValidation(tx, config);\n if (!isValidMnee) return false;\n if (type === 'deploy') return true;\n // Redeem transactions follow the same balance rules as transfers\n return inputTotal === outputTotal;\n }\n\n private buildParseResponse(\n txid: string,\n environment: Environment,\n type: TxOperation,\n inputData: { inputs: ProcessedInput[]; total: bigint },\n outputData: { outputs: ProcessedOutput[]; total: bigint },\n isValid: boolean,\n tx: Transaction,\n options?: ParseOptions,\n ): ParseTxResponse | ParseTxExtendedResponse {\n const simpleInputs: TxAddressAmount[] = inputData.inputs\n .filter((input) => input.inscription && input.address)\n .map((input) => ({\n address: input.address!,\n amount: input.amount,\n }));\n\n const simpleOutputs: TxAddressAmount[] = outputData.outputs\n .filter((output) => output.inscription && output.address)\n .map((output) => ({\n address: output.address!,\n amount: output.amount,\n }));\n\n const baseResponse: ParseTxResponse = {\n txid,\n environment,\n type,\n inputs: simpleInputs,\n outputs: simpleOutputs,\n isValid,\n inputTotal: inputData.total.toString(),\n outputTotal: outputData.total.toString(),\n };\n\n if (options?.includeRaw) {\n const extendedResponse: ParseTxExtendedResponse = {\n ...baseResponse,\n raw: {\n txHex: tx.toHex(),\n inputs: tx.inputs.map((input, index) => {\n const processedInput = inputData.inputs[index];\n return {\n txid: input.sourceTXID || '',\n vout: input.sourceOutputIndex,\n scriptSig: input.unlockingScript?.toHex() || '',\n sequence: input.sequence || 0xffffffff,\n address: processedInput?.address,\n satoshis: processedInput?.satoshis || 0,\n tokenData: processedInput?.inscription ? { amount: processedInput.amount } : undefined,\n };\n }),\n outputs: tx.outputs.map((output, index) => {\n const processedOutput = outputData.outputs[index];\n return {\n value: Number(output.satoshis),\n scriptPubKey: output.lockingScript.toHex(),\n address: processedOutput?.address,\n tokenData: processedOutput?.inscription ? { amount: processedOutput.amount } : undefined,\n };\n }),\n },\n };\n return extendedResponse;\n }\n\n return baseResponse;\n }\n\n private async parseTransaction(\n tx: Transaction,\n config: MNEEConfig,\n options?: ParseOptions,\n ): Promise<ParseTxResponse | ParseTxExtendedResponse> {\n const txid = tx.id('hex');\n\n const inputData = await this.processTransactionInputs(tx, config);\n const outputData = this.processTransactionOutputs(tx, config);\n\n const environment = outputData.environment || inputData.environment || 'sandbox';\n\n let type = outputData.type || inputData.type || 'transfer';\n\n if (type === 'transfer') {\n const hasMintInputAddress = inputData.inputs.some(\n (input) => input.inscription && (input.address === PROD_MINT_ADDRESS || input.address === SANDBOX_MINT_ADDRESS),\n );\n\n if (hasMintInputAddress) {\n type = 'mint';\n }\n }\n\n // Check if any output has redeem metadata (check this for any transfer-like operation)\n // This should override mint/transfer types as redeem is a special operation marked by metadata\n if (type === 'transfer' || type === 'mint') {\n const hasRedeemOutput = outputData.outputs.some((output) => output.inscription?.metadata?.action === 'redeem');\n\n if (hasRedeemOutput) {\n type = 'redeem';\n }\n }\n\n // If there are no inputs with inscriptions, it can be nothing but a deploy\n const inputsWithInscriptions = inputData.inputs.filter((input) => input.inscription);\n if (inputsWithInscriptions.length === 0 && inputData.inputs.length > 0) {\n type = 'deploy';\n }\n\n const isValid = this.validateTransaction(config, tx, type, inputData.total, outputData.total);\n\n return this.buildParseResponse(txid, environment, type, inputData, outputData, isValid, tx, options);\n }\n\n public async parseTx(txid: string, options?: ParseOptions): Promise<ParseTxResponse | ParseTxExtendedResponse> {\n const hexRegex = /^[a-fA-F0-9]{64}$/;\n if (!txid || typeof txid !== 'string' || txid.trim() === '' || !hexRegex.test(txid)) {\n throw stacklessError('A valid transaction ID is required');\n }\n\n const config = this.mneeConfig || (await this.getCosignerConfig());\n if (!config) throw stacklessError('Config not fetched');\n const tx = await this.fetchRawTx(txid);\n if (!tx) throw stacklessError('Failed to fetch transaction');\n return await this.parseTransaction(tx, config, options);\n }\n\n public async parseTxFromRawTx(\n rawTxHex: string,\n options?: ParseOptions,\n ): Promise<ParseTxResponse | ParseTxExtendedResponse> {\n if (!rawTxHex || typeof rawTxHex !== 'string' || rawTxHex.trim() === '') {\n throw stacklessError('A valid raw transaction is required');\n }\n if (!isValidHex(rawTxHex)) {\n throw stacklessError('Invalid raw transaction hex');\n }\n const tx = Transaction.fromHex(rawTxHex);\n const config = this.mneeConfig || (await this.getCosignerConfig());\n if (!config) throw stacklessError('Config not fetched');\n return await this.parseTransaction(tx, config, options);\n }\n\n public parseInscription(script: Script) {\n return parseInscription(script);\n }\n\n public parseCosignerScripts(scripts: Script[]) {\n return parseCosignerScripts(scripts);\n }\n\n private validateUniqueInputs(inputs: TransferMultiOptions['inputs']): { error?: string } {\n const inputSet = new Set<string>();\n for (const input of inputs) {\n const inputKey = `${input.txid}:${input.vout}`;\n if (inputSet.has(inputKey)) {\n return { error: `Duplicate input detected: ${inputKey}. Each UTXO can only be spent once.` };\n }\n inputSet.add(inputKey);\n }\n return {};\n }\n\n private async addInputsToTransaction(\n tx: Transaction,\n inputs: TransferMultiOptions['inputs'],\n privateKeys: Map<number, PrivateKey>,\n ): Promise<{ tokensIn: number; error?: string }> {\n let tokensIn = 0;\n\n for (let i = 0; i < inputs.length; i++) {\n const input = inputs[i];\n const sourceTransaction = await this.fetchRawTx(input.txid);\n if (!sourceTransaction)\n return { tokensIn: 0, error: `Failed to fetch source transaction: ${input.txid}_${input.vout}` };\n\n const output = sourceTransaction.outputs[input.vout];\n if (!output) return { tokensIn: 0, error: `Output ${input.vout} not found in transaction ${input.txid}` };\n\n const inscription = this.parseInscriptionData(output.lockingScript);\n if (!inscription) return { tokensIn: 0, error: `No inscription found in output ${input.txid}:${input.vout}` };\n\n const tokenAmount = parseInt(inscription.amt);\n tokensIn += tokenAmount;\n\n privateKeys.set(i, PrivateKey.fromWif(input.wif));\n\n tx.addInput({\n sourceTXID: input.txid,\n sourceOutputIndex: input.vout,\n sourceTransaction,\n unlockingScript: new UnlockingScript(),\n });\n }\n\n return { tokensIn };\n }\n\n private calculateTransferMultiFee(\n tokensIn: number,\n totalAtomicTokenAmount: number,\n changeAddress: TransferMultiOptions['changeAddress'],\n inputAddresses: Set<string>,\n config: MNEEConfig,\n recipients: SendMNEE[],\n ): { fee: number; error?: string } {\n let fee = 0;\n let previousFee = -1;\n\n while (fee !== previousFee) {\n previousFee = fee;\n\n const totalChange = tokensIn - totalAtomicTokenAmount - fee;\n\n // Calculate how much change goes to non-input addresses\n let changeToNonInputAddresses = 0;\n if (totalChange > 0) {\n if (typeof changeAddress === 'string') {\n // Single change address\n if (!inputAddresses.has(changeAddress)) {\n changeToNonInputAddresses = totalChange;\n }\n } else if (Array.isArray(changeAddress)) {\n // Multiple change addresses\n for (const changeOutput of changeAddress) {\n const atomicAmount = this.toAtomicAmount(changeOutput.amount);\n if (!inputAddresses.has(changeOutput.address)) {\n changeToNonInputAddresses += atomicAmount;\n }\n }\n } else {\n // Default to first input address - change goes back to input\n changeToNonInputAddresses = 0;\n }\n }\n\n // Total transfer amount = recipients + change to non-input addresses\n const totalTransferAmount = totalAtomicTokenAmount + changeToNonInputAddresses;\n\n // Get fee based on total transfer amount\n const newFee =\n recipients.find((req) => req.address === config.burnAddress) !== undefined\n ? 0\n : config.fees.find(\n (f: { min: number; max: number }) => totalTransferAmount >= f.min && totalTransferAmount <= f.max,\n )?.fee;\n\n if (newFee === undefined) return { fee: 0, error: 'Fee ranges inadequate' };\n fee = newFee;\n }\n\n return { fee };\n }\n\n private async addChangeOutputs(\n tx: Transaction,\n change: number,\n changeAddress: TransferMultiOptions['changeAddress'],\n privateKeys: Map<number, PrivateKey>,\n config: MNEEConfig,\n tokensIn: number,\n totalAtomicTokenAmount: number,\n fee: number,\n ): Promise<{ error?: string }> {\n if (change <= 0) return {};\n\n if (typeof changeAddress === 'string') {\n // Single change address\n tx.addOutput(await this.createInscription(changeAddress, change, config));\n } else if (Array.isArray(changeAddress)) {\n // Multiple change outputs\n if (changeAddress.length === 0) {\n return {\n error:\n 'Change address array cannot be empty. Provide at least one change output or use a single address string.',\n };\n }\n\n const atomicChangeOutputs = changeAddress.map((c) => ({\n address: c.address,\n amount: this.toAtomicAmount(c.amount),\n }));\n\n const changeSum = atomicChangeOutputs.reduce((sum, c) => sum + c.amount, 0);\n if (changeSum !== change) {\n const changeDecimal = this.fromAtomicAmount(change);\n const changeSumDecimal = this.fromAtomicAmount(changeSum);\n return {\n error: `Change amounts must sum to ${changeDecimal} (${change} atomic units). Total inputs: ${this.fromAtomicAmount(\n tokensIn,\n )} - total outputs: ${this.fromAtomicAmount(totalAtomicTokenAmount)} - fee: ${this.fromAtomicAmount(\n fee,\n )} = ${changeDecimal}. Your change outputs sum to ${changeSumDecimal} (${changeSum} atomic units).`,\n };\n }\n\n for (const changeOutput of changeAddress) {\n if (changeOutput.amount <= 0) {\n return { error: `Invalid change amount: ${changeOutput.amount}. Must be positive.` };\n }\n }\n\n for (const changeOutput of atomicChangeOutputs) {\n tx.addOutput(await this.createInscription(changeOutput.address, changeOutput.amount, config));\n }\n } else {\n // Default to first input's address\n const defaultChangeAddress = privateKeys.get(0)!.toAddress();\n tx.addOutput(await this.createInscription(defaultChangeAddress, change, config));\n }\n\n return {};\n }\n\n private async signAllInputs(tx: Transaction, privateKeys: Map<number, PrivateKey>): Promise<{ error?: string }> {\n const sigRequests: SignatureRequest[] = tx.inputs.map((input, index) => {\n if (!input.sourceTXID) throw stacklessError('Source TXID is undefined');\n return {\n prevTxid: input.sourceTXID,\n outputIndex: input.sourceOutputIndex,\n inputIndex: index,\n address: privateKeys.get(index)!.toAddress(),\n script: input.sourceTransaction?.outputs[input.sourceOutputIndex].lockingScript.toHex(),\n satoshis: input.sourceTransaction?.outputs[input.sourceOutputIndex].satoshis || 1,\n sigHashType:\n TransactionSignature.SIGHASH_ALL |\n TransactionSignature.SIGHASH_ANYONECANPAY |\n TransactionSignature.SIGHASH_FORKID,\n };\n });\n\n const rawtx = tx.toHex();\n const allSigResponses: SignatureResponse[] = [];\n\n for (const [inputIndex, privateKey] of privateKeys.entries()) {\n const inputSigRequest = sigRequests[inputIndex];\n const res = await this.getSignatures({ rawtx, sigRequests: [inputSigRequest] }, privateKey);\n\n if (!res?.sigResponses) {\n return { error: `Failed to get signatures for input ${inputIndex}` };\n }\n\n allSigResponses.push(...res.sigResponses);\n }\n\n for (const sigResponse of allSigResponses) {\n tx.inputs[sigResponse.inputIndex].unlockingScript = new Script()\n .writeBin(Utils.toArray(sigResponse.sig, 'hex'))\n .writeBin(Utils.toArray(sigResponse.pubKey, 'hex'));\n }\n\n return {};\n }\n\n private validateTokenConservation(tx: Transaction, tokensIn: number): { error?: string } {\n let totalOut = 0;\n for (let i = 0; i < tx.outputs.length; i++) {\n const output = tx.outputs[i];\n const inscription = this.parseInscriptionData(output.lockingScript);\n if (inscription) {\n const amt = parseInt(inscription.amt);\n totalOut += amt;\n }\n }\n\n if (tokensIn !== totalOut) {\n return {\n error: `Token conservation violation! Inputs (${this.fromAtomicAmount(\n tokensIn,\n )}) do not equal outputs (${this.fromAtomicAmount(totalOut)}). This would ${\n tokensIn > totalOut ? 'burn' : 'create'\n } ${this.fromAtomicAmount(Math.abs(tokensIn - totalOut))} tokens.`,\n };\n }\n\n return {};\n }\n\n // private async broadcastTransaction(tx: Transaction): Promise<{ txid?: string; rawtx?: string; error?: string }> {\n // try {\n // const base64Tx = Utils.toBase64(tx.toBinary());\n // const response = await fetch(`${this.mneeApi}/v1/transfer?auth_token=${this.mneeApiKey}`, {\n // method: 'POST',\n // headers: { 'Content-Type': 'application/json' },\n // body: JSON.stringify({ rawtx: base64Tx }),\n // });\n\n // if (response.status === 401 || response.status === 403) {\n // throw stacklessError('Invalid API key');\n // }\n\n // if (!response.ok) throw stacklessError(`HTTP error! status: ${response.status}`);\n\n // const { rawtx: responseRawtx } = await response.json();\n // if (!responseRawtx) throw stacklessError('Failed to broadcast transaction');\n\n // const decodedBase64AsBinary = Utils.toArray(responseRawtx, 'base64');\n // const tx2 = Transaction.fromBinary(decodedBase64AsBinary);\n\n // return { txid: tx2.id('hex'), rawtx: Utils.toHex(decodedBase64AsBinary) };\n // } catch (error) {\n // if (isNetworkError(error)) {\n // logNetworkError(error, 'broadcast transaction');\n // }\n // let errorMessage = 'Transaction broadcast failed';\n // if (error instanceof Error) {\n // errorMessage = error.message;\n // }\n // throw stacklessError(errorMessage);\n // }\n // }\n\n public async transferMulti(\n options: TransferMultiOptions,\n transferOptions?: TransferOptions,\n ): Promise<TransferResponse> {\n try {\n const config = this.mneeConfig || (await this.getCosignerConfig());\n if (!config) throw stacklessError('Config not fetched');\n\n const { isValid, error } = validateTransferMultiOptions(options);\n if (!isValid) throw stacklessError(error || 'Invalid transfer options');\n\n const totalAmount = options.recipients.reduce((sum, req) => sum + req.amount, 0);\n if (totalAmount <= 0) throw stacklessError('Invalid amount');\n const totalAtomicTokenAmount = this.toAtomicAmount(totalAmount);\n\n const validationResult = this.validateUniqueInputs(options.inputs);\n if (validationResult.error) throw stacklessError(validationResult.error);\n\n const tx = new Transaction(1, [], [], 0);\n const privateKeys = new Map<number, PrivateKey>();\n\n const inputResult = await this.addInputsToTransaction(tx, options.inputs, privateKeys);\n if (inputResult.error) throw stacklessError(inputResult.error);\n const tokensIn = inputResult.tokensIn;\n\n const inputAddresses = new Set<string>();\n for (let i = 0; i < options.inputs.length; i++) {\n const privKey = PrivateKey.fromWif(options.inputs[i].wif);\n inputAddresses.add(privKey.toAddress());\n }\n\n const feeResult = this.calculateTransferMultiFee(\n tokensIn,\n totalAtomicTokenAmount,\n options.changeAddress,\n inputAddresses,\n config,\n options.recipients,\n );\n if (feeResult.error) throw stacklessError(feeResult.error);\n const fee = feeResult.fee;\n\n if (tokensIn < totalAtomicTokenAmount + fee) {\n const haveDecimal = this.fromAtomicAmount(tokensIn);\n const needDecimal = this.fromAtomicAmount(totalAtomicTokenAmount + fee);\n throw stacklessError(\n `Insufficient tokens. Have: ${haveDecimal}, Need: ${needDecimal} (including fee: ${this.fromAtomicAmount(\n fee,\n )})`,\n );\n }\n\n for (const req of options.recipients) {\n tx.addOutput(await this.createInscription(req.address, this.toAtomicAmount(req.amount), config));\n }\n\n if (fee > 0) {\n tx.addOutput(await this.createInscription(config.feeAddress, fee, config));\n }\n\n const change = tokensIn - totalAtomicTokenAmount - fee;\n const changeResult = await this.addChangeOutputs(\n tx,\n change,\n options.changeAddress,\n privateKeys,\n config,\n tokensIn,\n totalAtomicTokenAmount,\n fee,\n );\n if (changeResult.error) throw stacklessError(changeResult.error);\n\n const signResult = await this.signAllInputs(tx, privateKeys);\n if (signResult.error) throw stacklessError(signResult.error);\n\n const conservationResult = this.validateTokenConservation(tx, tokensIn);\n if (conservationResult.error) throw stacklessError(conservationResult.error);\n\n const rawtx = tx.toHex();\n\n if (!transferOptions?.broadcast) {\n return { rawtx };\n }\n\n const { ticketId } = await this.submitRawTx(rawtx, transferOptions);\n if (!ticketId) throw stacklessError('Failed to broadcast transaction');\n\n return { ticketId };\n } catch (error) {\n if (isNetworkError(error)) {\n logNetworkError(error, 'multi-source transfer');\n }\n throw error;\n }\n }\n}\n","import { HD, Mnemonic } from '@bsv/sdk';\nimport * as bip39 from 'bip39';\nimport { stacklessError } from './utils/stacklessError';\n\n/**\n * Note: We're using the HD class from @bsv/sdk despite it being marked as deprecated.\n * The deprecation is because BSV is moving towards BRC-42 (invoice-based key derivation),\n * but for MNEE token management, standard BIP32/BIP44 HD wallets are still the appropriate\n * choice because:\n * - Users expect standard mnemonic/HD wallet functionality\n * - It needs to be compatible with existing wallet software\n * - The use case is for token management, not the privacy-focused invoice system of BRC-42\n */\n\nexport interface AddressInfo {\n address: string;\n privateKey: string;\n path: string;\n}\n\nexport interface HDWalletOptions {\n derivationPath: string;\n cacheSize?: number;\n}\n\nexport class HDWallet {\n private readonly masterKey: HD;\n private readonly derivationPath: string;\n private readonly cacheSize: number;\n private readonly cache: Map<string, AddressInfo>;\n\n constructor(mnemonic: string, options: HDWalletOptions) {\n if (!bip39.validateMnemonic(mnemonic)) {\n throw stacklessError('Invalid mnemonic phrase');\n }\n\n const seed = Mnemonic.fromString(mnemonic).toSeed();\n this.masterKey = HD.fromSeed(seed);\n this.derivationPath = options.derivationPath;\n this.cacheSize = options.cacheSize || 1000;\n this.cache = new Map();\n }\n\n /**\n * Generate a new random mnemonic phrase\n * @returns A new BIP39 mnemonic phrase (12 words)\n * @example\n * const mnemonic = HDWallet.generateMnemonic();\n * const hdWallet = new HDWallet(mnemonic, { derivationPath: \"m/44'/236'/0'\" });\n */\n static generateMnemonic(): string {\n return bip39.generateMnemonic();\n }\n\n /**\n * Validate a mnemonic phrase\n * @param mnemonic - The mnemonic phrase to validate\n * @returns true if valid, false otherwise\n */\n static isValidMnemonic(mnemonic: string): boolean {\n return bip39.validateMnemonic(mnemonic);\n }\n\n /**\n * Derive individual address with caching\n * @param index - The index of the address to derive\n * @param isChange - Whether this is a change address (default: false)\n * @returns Address information including address, private key, and derivation path\n */\n deriveAddress(index: number, isChange: boolean = false): AddressInfo {\n const changeIndex = isChange ? 1 : 0;\n const fullPath = `${this.derivationPath}/${changeIndex}/${index}`;\n\n if (this.cache.has(fullPath)) {\n return this.cache.get(fullPath)!;\n }\n\n const derivedKey = this.masterKey.derive(fullPath);\n const privateKey = derivedKey.privKey;\n\n if (!privateKey) {\n throw stacklessError(`Failed to derive private key for path: ${fullPath}`);\n }\n\n const addressInfo: AddressInfo = {\n address: privateKey.toAddress(),\n privateKey: privateKey.toWif(),\n path: fullPath,\n };\n\n // Add to cache if within limit\n if (this.cache.size < this.cacheSize) {\n this.cache.set(fullPath, addressInfo);\n }\n\n return addressInfo;\n }\n\n /**\n * Batch derive addresses for performance\n * @param startIndex - Starting index for derivation\n * @param count - Number of addresses to derive\n * @param isChange - Whether these are change addresses (default: false)\n * @returns Array of address information\n */\n async deriveAddresses(startIndex: number, count: number, isChange: boolean = false): Promise<AddressInfo[]> {\n const addresses: AddressInfo[] = [];\n\n // Derive addresses in batch\n for (let i = 0; i < count; i++) {\n const index = startIndex + i;\n const addressInfo = this.deriveAddress(index, isChange);\n addresses.push(addressInfo);\n }\n\n return addresses;\n }\n\n /**\n * Helper for transferMulti integration - get private keys for specific addresses\n * @param addresses - Array of addresses to get private keys for\n * @param options - Optional configuration for the search\n * @returns Object with private keys and derivation paths for each address\n * @throws Error if any addresses cannot be found within the scan limits\n */\n getPrivateKeysForAddresses(\n addresses: string[],\n options?: {\n maxScanReceive?: number; // Max receive addresses to scan (default: 10000)\n maxScanChange?: number; // Max change addresses to scan (default: 10000)\n scanStrategy?: 'sequential' | 'parallel'; // Scanning strategy (default: 'parallel')\n },\n ): {\n privateKeys: { [address: string]: string };\n paths: { [address: string]: string };\n } {\n const maxScanReceive = options?.maxScanReceive || 10000;\n const maxScanChange = options?.maxScanChange || 10000;\n const scanStrategy = options?.scanStrategy || 'parallel';\n\n const privateKeys: { [address: string]: string } = {};\n const paths: { [address: string]: string } = {};\n const addressSet = new Set(addresses);\n\n // First, check the cache for any matching addresses\n for (const [_, info] of this.cache) {\n if (addressSet.has(info.address)) {\n privateKeys[info.address] = info.privateKey;\n paths[info.address] = info.path;\n addressSet.delete(info.address);\n }\n }\n\n // If we found all addresses in cache, return early\n if (addressSet.size === 0) {\n return { privateKeys, paths };\n }\n\n // For missing addresses, we need to scan\n if (scanStrategy === 'sequential') {\n // Sequential scanning - scan receive addresses first, then change\n // This is more memory efficient but potentially slower\n\n // Scan receive addresses\n for (let i = 0; i < maxScanReceive && addressSet.size > 0; i++) {\n const info = this.deriveAddress(i, false);\n\n if (addressSet.has(info.address)) {\n privateKeys[info.address] = info.privateKey;\n paths[info.address] = info.path;\n addressSet.delete(info.address);\n }\n }\n\n // Scan change addresses\n for (let i = 0; i < maxScanChange && addressSet.size > 0; i++) {\n const info = this.deriveAddress(i, true);\n\n if (addressSet.has(info.address)) {\n privateKeys[info.address] = info.privateKey;\n paths[info.address] = info.path;\n addressSet.delete(info.address);\n }\n }\n } else {\n // Parallel scanning - interleave receive and change address scanning\n // This can find addresses faster if they're mixed between receive/change\n const maxScan = Math.max(maxScanReceive, maxScanChange);\n\n for (let i = 0; i < maxScan && addressSet.size > 0; i++) {\n // Scan receive address at this index\n if (i < maxScanReceive) {\n const receiveInfo = this.deriveAddress(i, false);\n if (addressSet.has(receiveInfo.address)) {\n privateKeys[receiveInfo.address] = receiveInfo.privateKey;\n paths[receiveInfo.address] = receiveInfo.path;\n addressSet.delete(receiveInfo.address);\n }\n }\n\n // Scan change address at this index\n if (i < maxScanChange) {\n const changeInfo = this.deriveAddress(i, true);\n if (addressSet.has(changeInfo.address)) {\n privateKeys[changeInfo.address] = changeInfo.privateKey;\n paths[changeInfo.address] = changeInfo.path;\n addressSet.delete(changeInfo.address);\n }\n }\n }\n }\n\n // Check if we found all requested addresses\n if (addressSet.size > 0) {\n const notFound = Array.from(addressSet);\n throw stacklessError(\n `Could not find private keys for ${notFound.length} address(es): ${notFound.join(', ')}. ` +\n `Scanned up to index ${maxScanReceive} for receive addresses and ${maxScanChange} for change addresses.`,\n );\n }\n\n return { privateKeys, paths };\n }\n\n /**\n * Helper for transferMulti integration - get private keys for specific addresses (simplified version)\n * @param addresses - Array of addresses to get private keys for\n * @param options - Optional configuration for the search\n * @returns Object mapping addresses to their private keys (WIF format)\n * @throws Error if any addresses cannot be found within the scan limits\n */\n getPrivateKeys(\n addresses: string[],\n options?: {\n maxScanReceive?: number;\n maxScanChange?: number;\n scanStrategy?: 'sequential' | 'parallel';\n },\n ): { [address: string]: string } {\n const result = this.getPrivateKeysForAddresses(addresses, options);\n return result.privateKeys;\n }\n\n /**\n * Scan for addresses with a gap limit (BIP44 standard)\n * This is useful for finding all used addresses in a wallet\n * @param gapLimit - Number of consecutive unused addresses before stopping (default: 20)\n * @param scanChange - Whether to scan change addresses too (default: true)\n * @param maxScan - Maximum addresses to scan per type (default: 10000)\n * @returns Object with arrays of discovered addresses\n */\n async scanAddressesWithGapLimit(\n checkAddressUsed: (address: string) => Promise<boolean>,\n options?: {\n gapLimit?: number;\n scanChange?: boolean;\n maxScan?: number;\n },\n ): Promise<{\n receive: AddressInfo[];\n change: AddressInfo[];\n }> {\n const gapLimit = options?.gapLimit || 20;\n const scanChange = options?.scanChange !== false;\n const maxScan = options?.maxScan || 10000;\n\n const result = {\n receive: [] as AddressInfo[],\n change: [] as AddressInfo[],\n };\n\n // Scan receive addresses\n let consecutiveUnused = 0;\n for (let i = 0; i < maxScan && consecutiveUnused < gapLimit; i++) {\n const info = this.deriveAddress(i, false);\n const isUsed = await checkAddressUsed(info.address);\n\n if (isUsed) {\n result.receive.push(info);\n consecutiveUnused = 0;\n } else {\n consecutiveUnused++;\n }\n }\n\n // Scan change addresses if requested\n if (scanChange) {\n consecutiveUnused = 0;\n for (let i = 0; i < maxScan && consecutiveUnused < gapLimit; i++) {\n const info = this.deriveAddress(i, true);\n const isUsed = await checkAddressUsed(info.address);\n\n if (isUsed) {\n result.change.push(info);\n consecutiveUnused = 0;\n } else {\n consecutiveUnused++;\n }\n }\n }\n\n return result;\n }\n\n /**\n * Clear the cache to free memory\n */\n clearCache(): void {\n this.cache.clear();\n }\n\n /**\n * Get the current cache size\n */\n getCacheSize(): number {\n return this.cache.size;\n }\n}\n","import { MNEEService } from './mneeService.js';\nimport {\n MNEEBalance,\n MNEEConfig,\n SdkConfig,\n ParseTxResponse,\n ParseTxExtendedResponse,\n ParseOptions,\n SendMNEE,\n TransferResponse,\n TransferStatus,\n TransferMultiOptions,\n TxHistoryResponse,\n AddressHistoryParams,\n Inscription,\n ParsedCosigner,\n MNEEUtxo,\n TransferOptions,\n} from './mnee.types.js';\nimport { Script } from '@bsv/sdk';\nimport { HDWallet, HDWalletOptions } from './hdWallet.js';\nimport { Batch } from './batch.js';\nexport * from './mnee.types.js';\n\nexport interface MneeInterface {\n config(): Promise<MNEEConfig>;\n balance(address: string): Promise<MNEEBalance>;\n balances(addresses: string[]): Promise<MNEEBalance[]>;\n getUtxos(address: string | string[], page?: number, size?: number, order?: 'asc' | 'desc'): Promise<MNEEUtxo[]>;\n getEnoughUtxos(address: string, totalAtomicTokenAmount: number): Promise<MNEEUtxo[]>;\n getAllUtxos(address: string): Promise<MNEEUtxo[]>;\n validateMneeTx(rawTxHex: string, request?: SendMNEE[]): Promise<boolean>;\n transfer(request: SendMNEE[], wif: string, transferOptions?: TransferOptions): Promise<TransferResponse>;\n transferMulti(options: TransferMultiOptions, transferOptions?: TransferOptions): Promise<TransferResponse>;\n submitRawTx(rawTxHex: string): Promise<TransferResponse>;\n getTxStatus(ticketId: string): Promise<TransferStatus>;\n toAtomicAmount(amount: number): number;\n fromAtomicAmount(amount: number): number;\n recentTxHistory(\n address: string,\n fromScore?: number,\n limit?: number,\n order?: 'asc' | 'desc',\n ): Promise<TxHistoryResponse>;\n recentTxHistories(params: AddressHistoryParams[]): Promise<TxHistoryResponse[]>;\n parseTx(txid: string, options?: ParseOptions): Promise<ParseTxResponse | ParseTxExtendedResponse>;\n parseTxFromRawTx(rawTxHex: string, options?: ParseOptions): Promise<ParseTxResponse | ParseTxExtendedResponse>;\n parseInscription(script: Script): Inscription | undefined;\n parseCosignerScripts(scripts: Script[]): ParsedCosigner[];\n HDWallet(mnemonic: string, options: HDWalletOptions): HDWallet;\n batch(): Batch;\n}\n\n/**\n * Represents the Mnee class that provides methods to interact with the MNEE service.\n */\nexport default class Mnee implements MneeInterface {\n private service: MNEEService;\n private _batch?: Batch;\n\n /**\n * Static reference to HDWallet class for accessing static methods\n * @example\n * const mnemonic = Mnee.HDWallet.generateMnemonic();\n * const isValid = Mnee.HDWallet.isValidMnemonic(mnemonic);\n */\n static HDWallet = HDWallet;\n\n constructor(config: SdkConfig) {\n this.service = new MNEEService(config);\n }\n\n /**\n * Validates an MNEE transaction.\n *\n * @param rawTxHex - The raw transaction hex string to validate.\n * @param request - An array of SendMNEE objects representing the transfer details. Use this parameter to validate the transaction against the specified transfer details. If it is not provided, it will only validate that the transaction is well-formed with the cosigner.\n * @returns A promise that resolves to a boolean indicating whether the transaction is valid.\n */\n async validateMneeTx(rawTxHex: string, request?: SendMNEE[]): Promise<boolean> {\n return this.service.validateMneeTx(rawTxHex, request);\n }\n\n /**\n * Converts a given amount to its atomic representation based on the specified number.\n *\n * @param amount - The amount to be converted.\n * @returns The atomic representation of the given amount.\n *\n * @example\n * ```typescript\n * toAtomicAmount(1.5); // 150000\n * ```\n */\n toAtomicAmount(amount: number): number {\n return this.service.toAtomicAmount(amount);\n }\n\n /**\n * Converts a given atomic amount to its human-readable representation.\n *\n * @param amount - The atomic amount to be converted.\n * @returns The human-readable representation of the given atomic amount.\n *\n * @example\n * ```typescript\n * fromAtomicAmount(150000); // 1.5\n * ```\n */\n fromAtomicAmount(amount: number): number {\n return this.service.fromAtomicAmount(amount);\n }\n\n /**\n * Retrieves the configuration for the MNEE service.\n *\n * @returns {Promise<MNEEConfig>} A promise that resolves to the MNEE configuration object.\n */\n async config(): Promise<MNEEConfig> {\n return this.service.getCosignerConfig();\n }\n\n /**\n * Retrieves the balance for a given address.\n *\n * @param address - The address to retrieve the balance for.\n * @returns A promise that resolves to a `MNEEBalance` object containing the balance details.\n */\n async balance(address: string): Promise<MNEEBalance> {\n return this.service.getBalance(address);\n }\n\n /**\n * Retrieves the balances for multiple addresses.\n *\n * @param addresses - An array of addresses to retrieve the balances for.\n * @returns A promise that resolves to an array of `MNEEBalance` objects containing the balance details for each address.\n */\n async balances(addresses: string[]): Promise<MNEEBalance[]> {\n return this.service.getBalances(addresses);\n }\n\n /**\n * Retrieves the UTXOs for a given address.\n *\n * @param address - The address to retrieve the UTXOs for.\n * @returns A promise that resolves to an array of `MNEEUtxo` objects containing the UTXO details.\n */\n async getUtxos(\n address: string | string[],\n page?: number,\n size?: number,\n order?: 'asc' | 'desc',\n ): Promise<MNEEUtxo[]> {\n return this.service.getUtxos(address, page, size, order);\n }\n\n /**\n * Retrieves the UTXOs for a given address that have enough balance to cover the total atomic token amount.\n *\n * @param address - The address to retrieve the UTXOs for.\n * @param totalAtomicTokenAmount - The total atomic token amount to cover.\n * @returns A promise that resolves to an array of `MNEEUtxo` objects containing the UTXO details.\n */\n async getEnoughUtxos(address: string, totalAtomicTokenAmount: number): Promise<MNEEUtxo[]> {\n return this.service.getEnoughUtxos(address, totalAtomicTokenAmount);\n }\n\n /**\n * Retrieves all UTXOs for a given address.\n *\n * @param address - The address to retrieve the UTXOs for.\n * @returns A promise that resolves to an array of `MNEEUtxo` objects containing the UTXO details.\n */\n async getAllUtxos(address: string): Promise<MNEEUtxo[]> {\n return this.service.getAllUtxos(address);\n }\n\n /**\n * Transfers the specified MNEE tokens using the provided WIF (Wallet Import Format) key.\n *\n * @param {SendMNEE[]} request - An array of SendMNEE objects representing the transfer details.\n * @param {string} wif - The Wallet Import Format key used to authorize the transfer.\n * @returns {Promise<TransferResponse>} A promise that resolves to a TransferResponse object containing the result of the transfer.\n */\n async transfer(request: SendMNEE[], wif: string, transferOptions?: TransferOptions): Promise<TransferResponse> {\n return this.service.transfer(request, wif, transferOptions);\n }\n\n /**\n * Transfers MNEE tokens from multiple source UTXOs with different private keys. This is a more advanced method that allows you to control the UTXOs used in the transfer along with associated private keys.\n *\n * @param options - The transfer options including inputs, recipients, and optional change address.\n * @returns A promise that resolves to a TransferResponse object containing the result of the transfer.\n */\n async transferMulti(options: TransferMultiOptions, transferOptions?: TransferOptions): Promise<TransferResponse> {\n return this.service.transferMulti(options, transferOptions);\n }\n\n /**\n * Submits a partially signed raw transaction to the MNEE network. This is useful when you have a raw transaction hex string that you have already signed, but you need to submit it to the MNEE network.\n *\n * @param rawTxHex - The raw transaction hex string to submit.\n * @returns A promise that resolves to a TransferResponse object containing the result of the transfer.\n */\n async submitRawTx(rawTxHex: string, transferOptions?: TransferOptions): Promise<TransferResponse> {\n return this.service.submitRawTx(rawTxHex, transferOptions);\n }\n\n /**\n * Gets the status of a transfer transaction using its ticket ID.\n *\n * @param ticketId - The ticket ID returned from submitRawTx or V2 transfer endpoint.\n * @returns A promise that resolves to a TransferStatus object containing the current status of the transfer.\n */\n async getTxStatus(ticketId: string): Promise<TransferStatus> {\n return this.service.getTxStatus(ticketId);\n }\n\n /**\n * Retrieves the recent transaction history for a given address.\n *\n * @param address - The address to retrieve the transaction history for.\n * @param fromScore - The starting score to retrieve the transaction history from.\n * @param limit - The maximum number of transactions to retrieve.\n * @returns A promise that resolves to a TxHistoryResponse object containing the transaction\n * history and the next score to retrieve additional transactions.\n */\n async recentTxHistory(\n address: string,\n fromScore?: number,\n limit?: number,\n order?: 'asc' | 'desc',\n ): Promise<TxHistoryResponse> {\n return this.service.getRecentTxHistory(address, fromScore, limit, order);\n }\n\n /**\n * Retrieves the recent transaction histories for multiple addresses.\n *\n * @param params - An array of address parameters, each containing an address, optional fromScore, and optional limit.\n * @returns A promise that resolves to an array of TxHistoryResponse objects containing the transaction\n * history for each address with its own pagination state.\n */\n async recentTxHistories(params: AddressHistoryParams[]): Promise<TxHistoryResponse[]> {\n return this.service.getRecentTxHistories(params);\n }\n\n /**\n * Parses a transaction based on the provided transaction ID.\n *\n * @param txid - The unique identifier of the transaction to be parsed.\n * @param options - Optional parsing options. Set includeRaw to true to get extended response with raw transaction data.\n * @returns A promise that resolves to a `ParseTxResponse` or `ParseTxExtendedResponse` containing the parsed transaction details.\n */\n async parseTx(txid: string, options?: ParseOptions): Promise<ParseTxResponse | ParseTxExtendedResponse> {\n return this.service.parseTx(txid, options);\n }\n\n /**\n * Parses a transaction from a raw transaction hex string.\n *\n * @param rawTxHex - The raw transaction hex string to be parsed.\n * @param options - Optional parsing options. Set includeRaw to true to get extended response with raw transaction data.\n * @returns A promise that resolves to a `ParseTxResponse` or `ParseTxExtendedResponse` containing the parsed transaction details.\n */\n async parseTxFromRawTx(rawTxHex: string, options?: ParseOptions): Promise<ParseTxResponse | ParseTxExtendedResponse> {\n return this.service.parseTxFromRawTx(rawTxHex, options);\n }\n\n /**\n * Parses an inscription.\n *\n * @param script - The script to be parsed.\n * @returns A `Inscription` object containing the parsed inscription details.\n */\n parseInscription(script: Script): Inscription | undefined {\n return this.service.parseInscription(script);\n }\n\n /**\n * Parses cosigner scripts to extract cosigner public keys and addresses.\n *\n * @param scripts - An array of Script objects to be parsed.\n * @returns An array of `ParsedCosigner` objects containing the parsed cosigner details.\n */\n parseCosignerScripts(scripts: Script[]): ParsedCosigner[] {\n return this.service.parseCosignerScripts(scripts);\n }\n\n /**\n * Creates a new HDWallet instance for managing hierarchical deterministic wallets.\n * @param mnemonic - The BIP39 mnemonic phrase\n * @param options - Configuration options for the HD wallet\n * @returns A new HDWallet instance\n * @example\n * const mnee = new Mnee(config);\n * const hdWallet = mnee.HDWallet(mnemonic, {\n * derivationPath: \"m/44'/236'/0'\",\n * cacheSize: 1000\n * });\n */\n HDWallet(mnemonic: string, options: HDWalletOptions): HDWallet {\n return new HDWallet(mnemonic, options);\n }\n\n /**\n * Returns a Batch instance for performing batch operations\n * @returns A Batch instance for batch processing\n * @example\n * const batch = mnee.batch();\n * const balances = await batch.getBalances(addresses);\n * const utxos = await batch.getUtxos(addresses);\n */\n batch(): Batch {\n if (!this._batch) {\n this._batch = new Batch(this.service);\n }\n return this._batch;\n }\n}\n"],"names":["stacklessError","message","error","Error","stack","undefined","CosignTemplate","_proto","prototype","lock","userPKHash","approverPubKey","pkhash","hash","Utils","fromBase58Check","prefix","data","lockingScript","LockingScript","writeOpCode","OP","OP_DUP","OP_HASH160","writeBin","OP_EQUALVERIFY","OP_CHECKSIGVERIFY","encode","OP_CHECKSIG","userUnlock","userPrivateKey","signOutputs","anyoneCanPay","sourceSatoshis","sign","tx","inputIndex","_input$sourceTransact","_input$sourceTransact2","_input$sourceTransact3","signatureScope","TransactionSignature","SIGHASH_FORKID","SIGHASH_ALL","SIGHASH_NONE","SIGHASH_SINGLE","SIGHASH_ANYONECANPAY","input","inputs","otherInputs","filter","_","index","sourceTXID","sourceTransaction","id","outputs","sourceOutputIndex","satoshis","preimage","format","transactionVersion","version","inputSequence","sequence","subscript","lockTime","scope","rawSignature","Hash","sha256","sig","r","s","unlockScript","UnlockingScript","toChecksigFormat","toPublicKey","Promise","resolve","e","reject","estimateLength","unlock","approverPrivateKey","userSigScript","_input$sourceTransact4","_input$sourceTransact5","_input$sourceTransact6","writeScript","toHex","utf8Str","Buffer","from","toString","applyInscription","inscription","metaData","withSeparator","ordAsm","dataB64","contentType","ordHex","fileHex","trim","fileMediaType","inscriptionAsm","toASM","app","type","mapCmdValue","_i","_Object$entries","Object","entries","length","_Object$entries$_i","key","value","fromASM","MIN_TRANSFER_AMOUNT","PROD_TOKEN_ID","PROD_MINT_ADDRESS","SANDBOX_TOKEN_ID","SANDBOX_MINT_ADDRESS","parseInscription","script","_value$data","_value$data2","fromPos","i","chunks","_chunk$data","chunk","toUTF8","op","OP_IF","OP_FALSE","insc","file","size","fields","_field$data","_field$data2","field","OP_ENDIF","OP_16","OP_PUSHDATA4","fieldNo","toBase64","content","parseCosignerScripts","scripts","map","_chunks$data","_chunks$data2","_chunks$data3","cosigner","address","toBase58Check","result","parseSyncToTxHistory","sync","config","txType","senders","includes","txStatus","height","rawtx","txArray","toArray","txHex","outScripts","Transaction","fromHex","output","mneeScripts","parsedOutScripts","mneeAddresses","feeAddressIndex","indexOf","feeAddress","sender","fee","counterpartyAmounts","Map","forEach","parsedScript","_parsedScript$file","inscriptionData","inscriptionJson","JSON","parse","err","console","p","tokenId","inscriptionAmt","parseInt","amt","Number","isNaN","outAddr","prevAmt","get","set","amountSentToAddress","senderAmt","counterparties","totalCounterpartyAmount","amount","Array","_ref","cp","reduce","sum","txid","status","score","validateAddress","decoded","prefixByte","validateWIF","wif","isValid","privateKey","PrivateKey","fromWif","wifError","errorMsg","toLowerCase","NetworkError","_Error","info","_this","call","this","code","hostname","originalError","name","_wrapNativeSuper","isNetworkError","_error$cause","_error$message","_error$message2","networkErrorCodes","cause","logNetworkError","operation","networkError","parseNetworkError","_iteratorSymbol","Symbol","iterator","pact","state","_Pact","bind","then","_settle","v","o","onFulfilled","onRejected","callback","thenable","Batch","service","getUtxos","addresses","options","isArray","individualErrors","processBatch","_step","validAddresses","invalidAddresses","_iterator","_createForOfIteratorHelperLoose","done","test","push","items","retryCount","continueOnError","utxos","utxo","owners","batchResult","_extends","errors","concat","totalErrors","getBalances","_this2","getTxHistories","params","_this3","getRecentTxHistories","param","parseTx","txids","_this4","parseOptions","batchOptions","_objectWithoutPropertiesLoose","_excluded","allSettled","_this4$service$parseT","parsed","results","successfulResults","errorMessage","reason","String","maxRetries","processor","getItemId","_this5","_options$chunkSize","chunkSize","_options$continueOnEr","onProgress","_options$maxRetries","_options$retryDelay","retryDelay","_options$requestsPerS","requestsPerSecond","validChunkSize","validRequestsPerSecond","minDelay","Math","ceil","maxConcurrent","max","floor","rateLimiter","RateLimiter","totalProcessed","processed","chunkArray","totalChunks","chunkPromises","_catch","processWithRetry","chunkResults","apply","_temp3","partialResults","failedItems","itemIds","item","firstError","_temp2","target","body","step","next","_isSettledPact","_cycle","_fixup","TypeError","values","array","_forOf","_temp","singleResult","itemError","all","func","_exit","lastError","_temp6","_result2","_this6","attempt","_temp5","update","stage","shouldContinue","updateValue","_resumeAfterTest","_resumeAfterBody","_resumeAfterUpdate","_for","execute","_await$rateLimiter$ex","_temp4","delay","slice","ms","setTimeout","queue","running","_proto2","fn","_this7","waitForSlot","_finallyRethrows","start","Date","now","elapsed","_temp7","_wasThrown","_result3","processQueue","_this8","shift","recover","observer","check","_forTo","MNEEService","mneeApiKey","mneeConfig","mneeApi","environment","isProd","apiKey","getCosignerConfig","fetch","method","response","ok","json","toAtomicAmount","round","pow","fromAtomicAmount","createInscription","recipient","PublicKey","fromString","approver","stringify","page","order","_result","_exit2","addr","warn","headers","ops","_data$filter2","bsv21","isFinite","isInteger","_data$filter","fetchRawTx","retries","_exit3","resp","_Transaction$fromHex","min","_result4","getSignatures","request","fromHexBEEF","fromHexEF","sigResponses","sigRequests","flatMap","sigReq","privKey","prevTxid","outputIndex","Script","P2PKH","toAddress","sigHashType","pubKey","csIdx","_err$message","getEnoughUtxos","totalAtomicTokenAmount","_temp0","fees","find","f","feeAmount","requiredAmount","getBalance","balance","_interrupt","_temp9","_result5","allUtxos","sort","a","b","selectedUtxos","selectedAmount","totalUtxoAmount","_temp8","pageUtxos","_this4$mneeConfig","getAllUtxos","_interrupt2","_temp1","transfer","transferOptions","_temp20","_validateTransferOpti","_validateWIF","_step4","totalAmount","_iterator4","req","validateTransferOptions","_config$fees$find","_temp19","_result7","_temp17","_temp15","_temp13","privateKeys","signAllInputs","signResult","broadcast","submitRawTx","_ref2","ticketId","change","tokensIn","_temp12","_addOutput3","addOutput","changeAddress","_this6$createInscript3","_temp14","_addOutput4","_this6$createInscript2","_temp16","_addOutput","_this6$createInscript","burnAddress","_temp18","_exit5","_temp11","_result6","vout","addInput","unlockingScript","_temp10","_this6$mneeConfig","callbackUrl","_transferOptions","_transferOptions2","_transferOptions3","_transferOptions4","base64Tx","toBinary","requestBody","callback_url","text","getTxStatus","_this9","_temp21","balanceData","decimalAmount","precised","_this9$mneeConfig","_this0","totalInvalidAddresses","_temp22","balanceMap","has","_this0$mneeConfig","processMneeValidation","_this1","isDeployTx","split","parsedScripts","outputDetails","idx","_inscription$file","hasCosigner","some","mneeInscriptions","operations","Set","hasBurn","hasRedeem","_o$inscription$metada","metadata","action","isRedeemFromMint","mneeOutputsForValidation","_step2","remainingOutputs","_loop","findIndex","splice","_iterator2","validateMneeTx","rawTx","_this10","_temp24","_exit6","_temp23","processTransactionInputs","inputData","outputData","processTransactionOutputs","total","_result8","_this10$mneeConfig","getMneeSyncs","fromScore","limit","_this11","addressArray","filteredSyncs","receivers","syncs","getRecentTxHistory","_this12","_temp25","syncsByAddress","history","nextScore","_step3","txHistory","_iterator3","historyItem","_this12$mneeConfig","_this13","validParams","_temp26","groupedParams","groupPromises","_ref3","addressParams","_key$split","limitStr","orderStr","_ref4","_step5","seenTxids","_iterator5","add","paramLimit","flat","_this13$mneeConfig","parseInscriptionData","_inscription$file2","determineEnvironment","determineTransactionType","mintAddress","_this14","BigInt","fetchTasks","sourceTx","_step6","_iterator6","_step6$value","sourceOutput","parsedCosigner","processedInput","processedOutput","outputType","validateTransaction","inputTotal","outputTotal","buildParseResponse","baseResponse","includeRaw","raw","_input$unlockingScrip","scriptSig","tokenData","scriptPubKey","parseTransaction","_this15","_output$inscription","_temp27","_this16","_this16$mneeConfig","parseTxFromRawTx","rawTxHex","_temp28","_this17","hex","isValidHex","_this17$mneeConfig","validateUniqueInputs","_step7","inputSet","_iterator7","inputKey","addInputsToTransaction","_exit7","_temp30","_result9","_this18","_temp29","_tokensIn$error2","tokenAmount","calculateTransferMultiFee","inputAddresses","recipients","_ret","_this19","previousFee","_loop2","_config$fees$find2","totalChange","changeToNonInputAddresses","_step8","_iterator8","changeOutput","atomicAmount","totalTransferAmount","newFee","addChangeOutputs","_exit8","_temp33","_result0","_this20","_temp32","_addOutput5","_this20$createInscrip","defaultChangeAddress","_addOutput7","_this20$createInscrip3","_error","atomicChangeOutputs","c","changeSum","changeDecimal","changeSumDecimal","_error2","_step9","_iterator9","_temp31","_addOutput6","_this20$createInscrip2","_exit9","_temp35","_result10","_step0","_iterator0","allSigResponses","sigResponse","_this21","_temp34","_ref5","res","validateTokenConservation","totalOut","abs","transferMulti","_this22","_temp40","_validateTransferMult","wifValidation","validateTransferMultiOptions","validationResult","inputResult","_temp39","_temp37","changeResult","conservationResult","_ref6","_temp36","_addOutput9","_this22$createInscrip2","feeResult","haveDecimal","_temp38","_addOutput8","_this22$createInscrip","_this22$mneeConfig","HDWallet","mnemonic","masterKey","derivationPath","cacheSize","cache","bip39","validateMnemonic","seed","Mnemonic","toSeed","HD","fromSeed","generateMnemonic","isValidMnemonic","deriveAddress","isChange","fullPath","changeIndex","derive","addressInfo","toWif","path","deriveAddresses","startIndex","count","getPrivateKeysForAddresses","maxScanReceive","maxScanChange","scanStrategy","paths","addressSet","maxScan","receiveInfo","changeInfo","notFound","join","getPrivateKeys","scanAddressesWithGapLimit","checkAddressUsed","scanChange","consecutiveUnused","gapLimit","isUsed","receive","clearCache","clear","getCacheSize","Mnee","_batch","balances","recentTxHistory","recentTxHistories","batch"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/utils/stacklessError.ts","../src/mneeCosignTemplate.ts","../src/utils/applyInscription.ts","../src/constants.ts","../src/utils/helper.ts","../src/utils/networkError.ts","../src/batch.ts","../src/mneeService.ts","../src/hdWallet.ts","../src/index.ts"],"sourcesContent":["/**\n * Creates an Error object without a stack trace\n * @param message The error message\n * @returns Error object with no stack trace\n */\nexport function stacklessError(message: string): Error {\n const error = new Error(message);\n error.stack = undefined;\n return error;\n}","import {\n Hash,\n LockingScript,\n OP,\n type PrivateKey,\n type PublicKey,\n type Script,\n type ScriptTemplate,\n type Transaction,\n TransactionSignature,\n UnlockingScript,\n Utils,\n} from \"@bsv/sdk\";\nimport { stacklessError } from \"./utils/stacklessError\";\n\n/**\n * P2PKH (Pay To Public Key Hash) class implementing ScriptTemplate.\n *\n * This class provides methods to create Pay To Public Key Hash locking and unlocking scripts, including the unlocking of P2PKH UTXOs with the private key.\n */\nexport default class CosignTemplate implements ScriptTemplate {\n /**\n * Creates a P2PKH locking script for a given public key hash or address string\n *\n * @param {number[] | string} userPKHash or address - An array or address representing the public key hash of the owning user.\n * @param {PublicKey} approverPubKey - Public key of the approver.\n * @returns {LockingScript} - A P2PKH locking script.\n */\n lock(\n userPKHash: string | number[],\n approverPubKey: PublicKey\n ): LockingScript {\n let pkhash: number[] = [];\n if (typeof userPKHash === \"string\") {\n const hash = Utils.fromBase58Check(userPKHash);\n if (hash.prefix[0] !== 0x00 && hash.prefix[0] !== 0x6f)\n throw stacklessError(\"only P2PKH is supported\");\n pkhash = hash.data as number[];\n } else {\n pkhash = userPKHash;\n }\n const lockingScript = new LockingScript();\n lockingScript\n .writeOpCode(OP.OP_DUP)\n .writeOpCode(OP.OP_HASH160)\n .writeBin(pkhash)\n .writeOpCode(OP.OP_EQUALVERIFY)\n .writeOpCode(OP.OP_CHECKSIGVERIFY)\n .writeBin(approverPubKey.encode(true) as number[])\n .writeOpCode(OP.OP_CHECKSIG);\n\n return lockingScript;\n }\n\n /**\n * Creates a function that generates a P2PKH unlocking script along with its signature and length estimation.\n *\n * The returned object contains:\n * 1. `sign` - A function that, when invoked with a transaction and an input index,\n * produces an unlocking script suitable for a P2PKH locked output.\n * 2. `estimateLength` - A function that returns the estimated length of the unlocking script in bytes.\n *\n * @param {PrivateKey} userPrivateKey - The private key used for signing the transaction.\n * @param {'all'|'none'|'single'} signOutputs - The signature scope for outputs.\n * @param {boolean} anyoneCanPay - Flag indicating if the signature allows for other inputs to be added later.\n * @param {number} sourceSatoshis - Optional. The amount being unlocked. Otherwise the input.sourceTransaction is required.\n * @param {Script} lockingScript - Optional. The lockinScript. Otherwise the input.sourceTransaction is required.\n * @returns {Object} - An object containing the `sign` and `estimateLength` functions.\n */\n userUnlock(\n userPrivateKey: PrivateKey,\n signOutputs: \"all\" | \"none\" | \"single\" = \"all\",\n anyoneCanPay = false,\n sourceSatoshis?: number,\n lockingScript?: Script\n ): {\n sign: (tx: Transaction, inputIndex: number) => Promise<UnlockingScript>;\n estimateLength: () => Promise<182>;\n } {\n return {\n sign: async (tx: Transaction, inputIndex: number) => {\n let signatureScope = TransactionSignature.SIGHASH_FORKID;\n if (signOutputs === \"all\") {\n signatureScope |= TransactionSignature.SIGHASH_ALL;\n }\n if (signOutputs === \"none\") {\n signatureScope |= TransactionSignature.SIGHASH_NONE;\n }\n if (signOutputs === \"single\") {\n signatureScope |= TransactionSignature.SIGHASH_SINGLE;\n }\n if (anyoneCanPay) {\n signatureScope |= TransactionSignature.SIGHASH_ANYONECANPAY;\n }\n\n const input = tx.inputs[inputIndex];\n\n const otherInputs = tx.inputs.filter(\n (_, index) => index !== inputIndex\n );\n\n const sourceTXID = input.sourceTXID\n ? input.sourceTXID\n : input.sourceTransaction?.id(\"hex\");\n if (!sourceTXID) {\n throw stacklessError(\n \"The input sourceTXID or sourceTransaction is required for transaction signing.\"\n );\n }\n sourceSatoshis ||=\n input.sourceTransaction?.outputs[input.sourceOutputIndex].satoshis;\n if (!sourceSatoshis) {\n throw stacklessError(\n \"The sourceSatoshis or input sourceTransaction is required for transaction signing.\"\n );\n }\n lockingScript ||=\n input.sourceTransaction?.outputs[input.sourceOutputIndex]\n .lockingScript;\n if (!lockingScript) {\n throw stacklessError(\n \"The lockingScript or input sourceTransaction is required for transaction signing.\"\n );\n }\n\n const preimage = TransactionSignature.format({\n sourceTXID,\n sourceOutputIndex: input.sourceOutputIndex,\n sourceSatoshis,\n transactionVersion: tx.version,\n otherInputs,\n inputIndex,\n outputs: tx.outputs,\n inputSequence: input.sequence || 0xffffffff,\n subscript: lockingScript,\n lockTime: tx.lockTime,\n scope: signatureScope,\n });\n const rawSignature = userPrivateKey.sign(Hash.sha256(preimage));\n const sig = new TransactionSignature(\n rawSignature.r,\n rawSignature.s,\n signatureScope\n );\n const unlockScript = new UnlockingScript();\n unlockScript.writeBin(sig.toChecksigFormat());\n unlockScript.writeBin(\n userPrivateKey.toPublicKey().encode(true) as number[]\n );\n return unlockScript;\n },\n estimateLength: async () => {\n // public key (1+33) + signature (1+73) + approver signature (1+73)\n // Note: We add 1 to each element's length because of the associated OP_PUSH\n return 182;\n },\n };\n }\n\n /**\n * Creates a function that generates a P2PKH unlocking script along with its signature and length estimation.\n *\n * The returned object contains:\n * 1. `sign` - A function that, when invoked with a transaction and an input index,\n * produces an unlocking script suitable for a P2PKH locked output.\n * 2. `estimateLength` - A function that returns the estimated length of the unlocking script in bytes.\n *\n * @param {PrivateKey} approverPrivateKey - The private key used for signing the transaction.\n * @param {'all'|'none'|'single'} signOutputs - The signature scope for outputs.\n * @param {boolean} anyoneCanPay - Flag indicating if the signature allows for other inputs to be added later.\n * @param {number} sourceSatoshis - Optional. The amount being unlocked. Otherwise the input.sourceTransaction is required.\n * @param {Script} lockingScript - Optional. The lockinScript. Otherwise the input.sourceTransaction is required.\n * @returns {Object} - An object containing the `sign` and `estimateLength` functions.\n */\n unlock(\n approverPrivateKey: PrivateKey,\n userSigScript: Script,\n signOutputs: \"all\" | \"none\" | \"single\" = \"all\",\n anyoneCanPay = false,\n sourceSatoshis?: number,\n lockingScript?: Script\n ): {\n sign: (tx: Transaction, inputIndex: number) => Promise<UnlockingScript>;\n estimateLength: () => Promise<182>;\n } {\n return {\n sign: async (tx: Transaction, inputIndex: number) => {\n let signatureScope = TransactionSignature.SIGHASH_FORKID;\n if (signOutputs === \"all\") {\n signatureScope |= TransactionSignature.SIGHASH_ALL;\n }\n if (signOutputs === \"none\") {\n signatureScope |= TransactionSignature.SIGHASH_NONE;\n }\n if (signOutputs === \"single\") {\n signatureScope |= TransactionSignature.SIGHASH_SINGLE;\n }\n if (anyoneCanPay) {\n signatureScope |= TransactionSignature.SIGHASH_ANYONECANPAY;\n }\n\n const input = tx.inputs[inputIndex];\n\n const otherInputs = tx.inputs.filter(\n (_, index) => index !== inputIndex\n );\n\n const sourceTXID = input.sourceTXID\n ? input.sourceTXID\n : input.sourceTransaction?.id(\"hex\");\n if (!sourceTXID) {\n throw stacklessError(\n \"The input sourceTXID or sourceTransaction is required for transaction signing.\"\n );\n }\n sourceSatoshis ||=\n input.sourceTransaction?.outputs[input.sourceOutputIndex].satoshis;\n if (!sourceSatoshis) {\n throw stacklessError(\n \"The sourceSatoshis or input sourceTransaction is required for transaction signing.\"\n );\n }\n lockingScript ||=\n input.sourceTransaction?.outputs[input.sourceOutputIndex]\n .lockingScript;\n if (!lockingScript) {\n throw stacklessError(\n \"The lockingScript or input sourceTransaction is required for transaction signing.\"\n );\n }\n\n const preimage = TransactionSignature.format({\n sourceTXID,\n sourceOutputIndex: input.sourceOutputIndex,\n sourceSatoshis,\n transactionVersion: tx.version,\n otherInputs,\n inputIndex,\n outputs: tx.outputs,\n inputSequence: input.sequence || 0xffffffff,\n subscript: lockingScript,\n lockTime: tx.lockTime,\n scope: signatureScope,\n });\n const rawSignature = approverPrivateKey.sign(Hash.sha256(preimage));\n const sig = new TransactionSignature(\n rawSignature.r,\n rawSignature.s,\n signatureScope\n );\n const unlockScript = new UnlockingScript();\n unlockScript.writeBin(sig.toChecksigFormat());\n unlockScript.writeScript(userSigScript);\n return unlockScript;\n },\n estimateLength: async () => {\n // public key (1+33) + signature (1+73) + approver signature (1+73)\n // Note: We add 1 to each element's length because of the associated OP_PUSH\n return 182;\n },\n };\n }\n}\n","import { LockingScript } from '@bsv/sdk';\nimport { stacklessError } from './stacklessError';\n\n/**\n * MAP (Magic Attribute Protocol) metadata object with stringified values for writing to the blockchain\n * @typedef {Object} MAP\n * @property {string} app - Application identifier\n * @property {string} type - Metadata type\n * @property {string} [prop] - Optional. Additional metadata properties\n */\nexport type MAP = {\n app: string;\n type: string;\n [prop: string]: string;\n};\n\nexport type Inscription = {\n dataB64: string;\n contentType: string;\n};\n\n/**\n * Converts a string to its hexadecimal representation\n *\n * @param {string} utf8Str - The string to convert\n * @returns {string} The hexadecimal representation of the input string\n */\nconst toHex = (utf8Str: string): string => {\n return Buffer.from(utf8Str).toString('hex');\n};\n\nexport const MAP_PREFIX = '1PuQa7K62MiKCtssSLKy1kh56WWU7MtUR5';\n\nexport const applyInscription = (\n lockingScript: LockingScript,\n inscription?: Inscription,\n metaData?: MAP,\n withSeparator = false,\n) => {\n let ordAsm = '';\n // This can be omitted for reinscriptions that just update metadata\n if (inscription?.dataB64 !== undefined && inscription?.contentType !== undefined) {\n const ordHex = toHex('ord');\n const fsBuffer = Buffer.from(inscription.dataB64, 'base64');\n const fileHex = fsBuffer.toString('hex').trim();\n if (!fileHex) {\n throw stacklessError('Invalid file data');\n }\n const fileMediaType = toHex(inscription.contentType);\n if (!fileMediaType) {\n throw stacklessError('Invalid media type');\n }\n ordAsm = `OP_0 OP_IF ${ordHex} OP_1 ${fileMediaType} OP_0 ${fileHex} OP_ENDIF`;\n }\n\n let inscriptionAsm = `${\n ordAsm ? `${ordAsm} ${withSeparator ? 'OP_CODESEPARATOR ' : ''}` : ''\n }${lockingScript.toASM()}`;\n\n // MAP.app and MAP.type keys are required\n if (metaData && (!metaData.app || !metaData.type)) {\n throw stacklessError('MAP.app and MAP.type are required fields');\n }\n\n if (metaData?.app && metaData?.type) {\n const mapPrefixHex = toHex(MAP_PREFIX);\n const mapCmdValue = toHex('SET');\n inscriptionAsm = `${inscriptionAsm ? `${inscriptionAsm} ` : ''}OP_RETURN ${mapPrefixHex} ${mapCmdValue}`;\n\n for (const [key, value] of Object.entries(metaData)) {\n if (key !== 'cmd') {\n inscriptionAsm = `${inscriptionAsm} ${toHex(key)} ${toHex(value as string)}`;\n }\n }\n }\n\n return LockingScript.fromASM(inscriptionAsm);\n};\n","export const MIN_TRANSFER_AMOUNT = 0.00001;\nexport const MNEE_DECIMALS = 5;\n\n// PROD\nexport const MNEE_PROXY_API_URL = 'https://proxy-api.mnee.net';\nexport const PUBLIC_PROD_MNEE_API_TOKEN = '92982ec1c0975f31979da515d46bae9f';\nexport const PROD_TOKEN_ID = 'ae59f3b898ec61acbdb6cc7a245fabeded0c094bf046f35206a3aec60ef88127_0';\nexport const PROD_APPROVER = '020a177d6a5e6f3a8689acd2e313bd1cf0dcf5a243d1cc67b7218602aee9e04b2f';\nexport const PROD_MINT_ADDRESS = '1inHbiwj2jrEcZPiSYnfgJ8FmS1Bmk4Dh';\n\n// SANDBOX\nexport const SANDBOX_MNEE_API_URL = 'https://sandbox-proxy-api.mnee.net';\nexport const PUBLIC_SANDBOX_MNEE_API_TOKEN = '54f1fd1688ba66a58a67675b82feb93e';\nexport const SANDBOX_TOKEN_ID = '833a7720966a2a435db28d967385e8aa7284b6150ebb39482cc5228b73e1703f_0';\nexport const SANDBOX_APPROVER = '02bed35e894cc41cc9879b4002ad03d33533b615c1b476068c8dd6822a09f93f6c';\nexport const SANDBOX_MINT_ADDRESS = '1AZNdbFYBDFTAEgzZMfPzANxyNrpGJZAUY';\n","import { Hash, OP, Script, Transaction, Utils, PrivateKey } from '@bsv/sdk';\nimport {\n Inscription,\n MNEEConfig,\n MneeInscription,\n MneeSync,\n ParsedCosigner,\n SendMNEE,\n TransferMultiOptions,\n TxHistory,\n TxStatus,\n TxType,\n} from '../mnee.types';\nimport { stacklessError } from './stacklessError';\nimport { MIN_TRANSFER_AMOUNT } from '../constants';\n\nexport const parseInscription = (script: Script) => {\n let fromPos: number | undefined;\n for (let i = 0; i < script.chunks.length; i++) {\n const chunk = script.chunks[i];\n if (\n i >= 2 &&\n chunk.data?.length === 3 &&\n Utils.toUTF8(chunk.data) == 'ord' &&\n script.chunks[i - 1].op == OP.OP_IF &&\n script.chunks[i - 2].op == OP.OP_FALSE\n ) {\n fromPos = i + 1;\n }\n }\n if (fromPos === undefined) return;\n\n const insc = {\n file: { hash: '', size: 0, type: '' },\n fields: {},\n } as Inscription;\n\n for (let i = fromPos; i < script.chunks.length; i += 2) {\n const field = script.chunks[i];\n if (field.op == OP.OP_ENDIF) {\n break;\n }\n if (field.op > OP.OP_16) return;\n const value = script.chunks[i + 1];\n if (value.op > OP.OP_PUSHDATA4) return;\n\n if (field.data?.length) continue;\n\n let fieldNo = 0;\n if (field.op > OP.OP_PUSHDATA4 && field.op <= OP.OP_16) {\n fieldNo = field.op - 80;\n } else if (field.data?.length) {\n fieldNo = field.data[0];\n }\n switch (fieldNo) {\n case 0:\n insc.file!.size = value.data?.length || 0;\n if (!value.data?.length) break;\n insc.file!.hash = Utils.toBase64(Hash.sha256(value.data));\n insc.file!.content = value.data;\n break;\n case 1:\n insc.file!.type = Buffer.from(value.data || []).toString();\n break;\n }\n }\n\n return insc;\n};\n\nexport const parseCosignerScripts = (scripts: Script[]): ParsedCosigner[] => {\n return scripts\n .map((script: Script) => {\n const chunks = script.chunks;\n for (let i = 0; i <= chunks.length - 4; i++) {\n if (\n chunks.length > i + 6 &&\n chunks[0 + i].op === OP.OP_DUP &&\n chunks[1 + i].op === OP.OP_HASH160 &&\n chunks[2 + i].data?.length === 20 &&\n chunks[3 + i].op === OP.OP_EQUALVERIFY &&\n chunks[4 + i].op === OP.OP_CHECKSIGVERIFY &&\n chunks[5 + i].data?.length === 33 &&\n chunks[6 + i].op === OP.OP_CHECKSIG\n ) {\n return {\n cosigner: Utils.toHex(chunks[5 + i].data || []),\n address: Utils.toBase58Check(chunks[2 + i].data || [], [0]),\n };\n } else if (\n // P2PKH\n chunks[0 + i].op === OP.OP_DUP &&\n chunks[1 + i].op === OP.OP_HASH160 &&\n chunks[2 + i].data?.length === 20 &&\n chunks[3 + i].op === OP.OP_EQUALVERIFY &&\n chunks[4 + i].op === OP.OP_CHECKSIG\n ) {\n return {\n cosigner: '',\n address: Utils.toBase58Check(chunks[2 + i].data || [], [0]),\n };\n }\n }\n // Return undefined for scripts that don't match any pattern\n return undefined as any;\n })\n .filter((result): result is ParsedCosigner => result !== undefined);\n};\n\nexport const parseSyncToTxHistory = (sync: MneeSync, address: string, config: MNEEConfig): TxHistory | null => {\n const txType: TxType = sync.senders.includes(address) ? 'send' : 'receive';\n const txStatus: TxStatus = sync.height > 0 ? 'confirmed' : 'unconfirmed';\n\n if (!sync.rawtx) return null;\n\n const txArray = Utils.toArray(sync.rawtx, 'base64');\n const txHex = Utils.toHex(txArray);\n const tx = Transaction.fromHex(txHex);\n\n const outScripts = tx.outputs.map((output) => output.lockingScript);\n const mneeScripts = parseCosignerScripts(outScripts);\n const parsedOutScripts = outScripts.map(parseInscription);\n const mneeAddresses = mneeScripts.map((script) => script.address);\n\n const feeAddressIndex = mneeAddresses.indexOf(config.feeAddress);\n const sender = sync.senders[0]; // only one sender for now\n\n let fee = 0;\n const counterpartyAmounts = new Map<string, number>();\n\n parsedOutScripts.forEach((parsedScript, index) => {\n const content = parsedScript?.file?.content;\n if (!content) return;\n\n const inscriptionData = Utils.toUTF8(content);\n if (!inscriptionData) return;\n\n let inscriptionJson: MneeInscription;\n try {\n inscriptionJson = JSON.parse(inscriptionData);\n } catch (err) {\n console.error('Failed to parse inscription JSON:', err);\n return;\n }\n\n if (inscriptionJson.p !== 'bsv-20' || inscriptionJson.id !== config.tokenId) return;\n\n const inscriptionAmt = parseInt(inscriptionJson.amt, 10);\n if (Number.isNaN(inscriptionAmt)) return;\n\n if (feeAddressIndex === index && sender === address) {\n fee += inscriptionAmt;\n return;\n }\n\n const outAddr = mneeAddresses[index];\n const prevAmt = counterpartyAmounts.get(outAddr) || 0;\n counterpartyAmounts.set(outAddr, prevAmt + inscriptionAmt);\n });\n\n const amountSentToAddress = counterpartyAmounts.get(address) || 0;\n\n if (txType === 'send') {\n const senderAmt = counterpartyAmounts.get(sender) || 0;\n counterpartyAmounts.set(sender, senderAmt - amountSentToAddress);\n }\n\n let counterparties: { address: string; amount: number }[] = [];\n if (txType === 'receive') {\n counterparties = [{ address: sender, amount: amountSentToAddress }];\n } else {\n counterparties = Array.from(counterpartyAmounts.entries())\n .map(([addr, amt]) => ({ address: addr, amount: amt }))\n .filter((cp) => cp.address !== address && cp.address !== config.feeAddress && cp.amount > 0);\n }\n\n const totalCounterpartyAmount = counterparties.reduce((sum, cp) => sum + cp.amount, 0);\n\n return {\n txid: sync.txid,\n height: sync.height,\n type: txType,\n status: txStatus,\n amount: totalCounterpartyAmount,\n fee,\n score: sync.score,\n counterparties,\n };\n};\n\nexport const validateAddress = (address: string) => {\n try {\n const decoded = Utils.fromBase58Check(address);\n // 0x00 = mainnet P2PKH (addresses starting with '1')\n const validPrefixes = [0x00];\n const prefixByte = decoded.prefix[0];\n if (typeof prefixByte !== 'number' || !validPrefixes.includes(prefixByte)) {\n throw stacklessError(`Invalid address prefix: ${prefixByte}`);\n }\n // Ensure the payload is 20 bytes (160 bits) for P2PKH/P2SH\n if (decoded.data.length !== 20) {\n throw stacklessError(`Invalid address payload length: ${decoded.data.length}`);\n }\n return true;\n } catch (error) {\n return false;\n }\n};\n\nexport const validateWIF = (wif: string): { isValid: boolean; error?: string; privateKey?: PrivateKey } => {\n try {\n const privateKey = PrivateKey.fromWif(wif);\n return { isValid: true, privateKey };\n } catch (wifError) {\n if (wifError instanceof Error) {\n const errorMsg = wifError.message.toLowerCase();\n if (errorMsg.includes('invalid base58 character')) {\n return { isValid: false, error: 'Invalid WIF key: contains invalid characters' };\n } else if (errorMsg.includes('invalid checksum')) {\n return { isValid: false, error: 'Invalid WIF key: checksum verification failed' };\n } else if (errorMsg.includes('expected base58 string')) {\n return { isValid: false, error: 'Invalid WIF key: must be a valid base58 encoded string' };\n }\n }\n return { isValid: false, error: 'Invalid WIF key provided' };\n }\n};\n\nexport const validateTransferMultiOptions = (options: TransferMultiOptions): { isValid: boolean; error?: string } => {\n for (const recipient of options.recipients) {\n if (!recipient.address || !recipient.amount) {\n return {\n isValid: false,\n error: `Invalid recipient: ${JSON.stringify(recipient)}. Missing required fields: address, amount`,\n };\n }\n\n if (typeof recipient.amount !== 'number' || isNaN(recipient.amount) || !isFinite(recipient.amount)) {\n return { isValid: false, error: `Invalid amount for ${recipient.address}: amount must be a valid number` };\n }\n\n if (recipient.amount < MIN_TRANSFER_AMOUNT) {\n return {\n isValid: false,\n error: `Invalid amount for ${recipient.address}: minimum transfer amount is ${MIN_TRANSFER_AMOUNT} MNEE`,\n };\n }\n\n if (!validateAddress(recipient.address)) {\n return { isValid: false, error: `Invalid recipient address: ${recipient.address}` };\n }\n }\n\n for (const input of options.inputs) {\n if (!input.txid || typeof input.vout !== 'number' || !input.wif) {\n return {\n isValid: false,\n error: `Invalid input: ${JSON.stringify(input)}. Missing required fields: txid, vout, wif`,\n };\n }\n const wifValidation = validateWIF(input.wif);\n if (!wifValidation.isValid) {\n return { isValid: false, error: `Invalid WIF key: ${input.wif} for input ${input.txid}:${input.vout}` };\n }\n const privateKey = wifValidation.privateKey!;\n const address = privateKey.toAddress();\n if (!validateAddress(address)) {\n return { isValid: false, error: `Invalid input address: ${address}` };\n }\n }\n\n if (options.changeAddress && Array.isArray(options.changeAddress)) {\n for (const change of options.changeAddress) {\n if (change.amount < MIN_TRANSFER_AMOUNT) {\n return {\n isValid: false,\n error: `Invalid amount for ${change.address}: minimum transfer amount is ${MIN_TRANSFER_AMOUNT} MNEE`,\n };\n }\n if (!validateAddress(change.address)) {\n return { isValid: false, error: `Invalid change address: ${change.address}` };\n }\n }\n }\n\n return { isValid: true };\n};\n\nexport const validateTransferOptions = (\n options: SendMNEE[],\n wif: string,\n): { isValid: boolean; totalAmount?: number; privateKey?: PrivateKey; error?: string } => {\n const { isValid, error, privateKey } = validateWIF(wif);\n if (options.length === 0) {\n return { isValid: false, error: 'Empty transfer options provided. Please provide at least one recipient.' };\n }\n\n if (!isValid) {\n return { isValid: false, error: error || 'Invalid WIF key provided' };\n }\n\n // This should never happen, but just in case\n if (!privateKey) {\n return { isValid: false, error: 'Private key not found' };\n }\n\n let totalAmount = 0;\n for (const req of options) {\n if (!validateAddress(req.address)) {\n return { isValid: false, error: `Invalid recipient address: ${req.address}` };\n }\n if (typeof req.amount !== 'number' || isNaN(req.amount) || !isFinite(req.amount)) {\n return { isValid: false, error: `Invalid amount for ${req.address}: amount must be a valid number` };\n }\n if (req.amount < MIN_TRANSFER_AMOUNT) {\n return {\n isValid: false,\n error: `Invalid amount for ${req.address}: minimum transfer amount is ${MIN_TRANSFER_AMOUNT} MNEE`,\n };\n }\n totalAmount += req.amount;\n }\n\n if (totalAmount <= 0) return { isValid: false, error: 'Invalid amount: total must be greater than 0' };\n\n return { isValid: true, totalAmount, privateKey };\n};\n\nexport const isValidHex = (hex: string) => {\n try {\n const hexRegex = /^[a-fA-F0-9]+$/;\n if (!hexRegex.test(hex)) {\n return false;\n }\n Transaction.fromHex(hex);\n return true;\n } catch (error) {\n return false;\n }\n};\n","export interface NetworkErrorInfo {\n code: string;\n message: string;\n hostname?: string;\n originalError?: any;\n}\n\nexport class NetworkError extends Error {\n public code: string;\n public hostname?: string;\n public originalError?: any;\n\n constructor(info: NetworkErrorInfo) {\n super(info.message);\n this.name = 'NetworkError';\n this.code = info.code;\n this.hostname = info.hostname;\n this.originalError = info.originalError;\n }\n}\n\nexport function isNetworkError(error: any): boolean {\n if (!error) return false;\n \n // Check for common network error codes\n const networkErrorCodes = [\n 'ENOTFOUND',\n 'ECONNREFUSED',\n 'ETIMEDOUT',\n 'ECONNRESET',\n 'ENETUNREACH',\n 'EHOSTUNREACH',\n 'EPIPE',\n 'ECONNABORTED'\n ];\n \n // Check direct error code\n if (networkErrorCodes.includes(error.code)) {\n return true;\n }\n \n // Check nested cause\n if (error.cause && networkErrorCodes.includes(error.cause?.code)) {\n return true;\n }\n \n // Check for fetch failures\n if (error.message?.includes('fetch failed') || error.message?.includes('getaddrinfo')) {\n return true;\n }\n \n return false;\n}\n\nexport function parseNetworkError(error: any): NetworkError {\n // Handle fetch errors with nested causes\n if (error.cause && error.cause.code) {\n const cause = error.cause;\n let message = 'Network connection failed';\n \n switch (cause.code) {\n case 'ENOTFOUND':\n message = 'Unable to connect to MNEE network. Please check your internet connection.';\n break;\n case 'ECONNREFUSED':\n message = 'Connection refused by MNEE server. The service may be temporarily unavailable.';\n break;\n case 'ETIMEDOUT':\n message = 'Request timed out. Please check your internet connection and try again.';\n break;\n case 'ECONNRESET':\n message = 'Connection was reset. Please try again.';\n break;\n case 'ENETUNREACH':\n case 'EHOSTUNREACH':\n message = 'Network unreachable. Please check your internet connection.';\n break;\n default:\n message = `Network error: ${cause.code}. Please check your connection and try again.`;\n }\n \n return new NetworkError({\n code: cause.code,\n message,\n hostname: cause.hostname,\n originalError: error\n });\n }\n \n // Handle direct network errors\n if (error.code) {\n let message = 'Network error occurred';\n \n switch (error.code) {\n case 'ENOTFOUND':\n message = 'Unable to connect to MNEE network. Please check your internet connection.';\n break;\n case 'ECONNREFUSED':\n message = 'Connection refused by MNEE server. The service may be temporarily unavailable.';\n break;\n case 'ETIMEDOUT':\n message = 'Request timed out. Please check your internet connection and try again.';\n break;\n default:\n message = `Network error: ${error.code}. Please check your connection and try again.`;\n }\n \n return new NetworkError({\n code: error.code,\n message,\n hostname: error.hostname,\n originalError: error\n });\n }\n \n // Generic network error\n return new NetworkError({\n code: 'NETWORK_ERROR',\n message: 'Network error occurred. Please check your internet connection and try again.',\n originalError: error\n });\n}\n\nexport function logNetworkError(error: any, operation: string): string | undefined {\n if (isNetworkError(error)) {\n const networkError = parseNetworkError(error);\n console.error(`Network error during ${operation}: ${networkError.message}`);\n return networkError.message;\n } else {\n console.error(`Failed to ${operation}:`, error);\n return undefined;\n }\n}","/**\n * Batch operations for MNEE SDK\n * Provides a clean API for batch processing with automatic chunking, rate limiting, and error recovery\n */\n\nimport { MNEEService } from './mneeService.js';\nimport {\n MNEEUtxo,\n MNEEBalance,\n TxHistoryResponse,\n AddressHistoryParams,\n ParseTxResponse,\n ParseTxExtendedResponse,\n ParseOptions,\n} from './mnee.types.js';\nimport { stacklessError } from './utils/stacklessError.js';\n\nexport interface BatchOptions {\n /** Maximum items per API call (default: 20) */\n chunkSize?: number;\n /** API requests per second limit (default: 3). If your API key has a higher limit, set this accordingly */\n requestsPerSecond?: number;\n /** Continue processing if an error occurs (default: false) */\n continueOnError?: boolean;\n /** Maximum retries per chunk (default: 3) */\n maxRetries?: number;\n /** Retry delay in milliseconds (default: 1000) */\n retryDelay?: number;\n /** Progress callback */\n onProgress?: (completed: number, total: number, errors: number) => void;\n}\n\nexport interface BatchError {\n items: string[];\n error: {\n message: string;\n code?: string;\n };\n retryCount: number;\n}\n\nexport interface BatchResult<T> {\n results: T[];\n errors: BatchError[];\n totalProcessed: number;\n totalErrors: number;\n}\n\nexport interface BatchUtxoResult {\n address: string;\n utxos: MNEEUtxo[];\n}\n\nexport interface BatchParseTxResult {\n txid: string;\n parsed: ParseTxResponse | ParseTxExtendedResponse;\n}\n\n/**\n * Batch operations class for MNEE SDK\n * @example\n * const batch = mnee.batch();\n * const result = await batch.getBalances(addresses, { onProgress: ... });\n */\nexport class Batch {\n constructor(private service: MNEEService) {}\n\n /**\n * Get UTXOs for multiple addresses\n * @example\n * const result = await mnee.batch().getUtxos(addresses, {\n * onProgress: (completed, total, errors) => {\n * console.log(`Progress: ${completed}/${total}, Errors: ${errors}`);\n * }\n * });\n */\n async getUtxos(addresses: string[], options: BatchOptions = {}): Promise<BatchResult<BatchUtxoResult>> {\n // Validate input is an array\n if (!Array.isArray(addresses)) {\n throw stacklessError('Input must be an array of addresses');\n }\n \n // Track individual errors within chunks\n const individualErrors: BatchError[] = [];\n\n const modifiedProcessor = async (chunk: string[]) => {\n // First validate addresses\n const validAddresses: string[] = [];\n const invalidAddresses: string[] = [];\n \n for (const address of chunk) {\n if (!address || typeof address !== 'string' || address.trim() === '') {\n invalidAddresses.push(address);\n individualErrors.push({\n items: [address],\n error: { message: 'Invalid address: empty or not a string' },\n retryCount: 0,\n });\n } else {\n // Basic Bitcoin address validation (starts with 1, 3, or bc1)\n const isValid = /^[13][a-km-zA-HJ-NP-Z1-9]{25,34}$|^bc1[a-z0-9]{39,59}$/.test(address);\n if (isValid) {\n validAddresses.push(address);\n } else {\n invalidAddresses.push(address);\n individualErrors.push({\n items: [address],\n error: { message: `Invalid address format: ${address}` },\n retryCount: 0,\n });\n }\n }\n }\n\n // If continueOnError is false and we have invalid addresses, throw\n if (!options.continueOnError && invalidAddresses.length > 0) {\n throw new Error(individualErrors[0].error.message);\n }\n\n // Process only valid addresses\n if (validAddresses.length === 0) {\n return [];\n }\n\n const utxos = await this.service.getUtxos(validAddresses);\n \n // Return results for all addresses in chunk (valid ones get UTXOs, invalid get empty)\n return chunk.map((address) => ({\n address,\n utxos: validAddresses.includes(address) \n ? utxos.filter((utxo) => utxo.owners.includes(address))\n : [],\n }));\n };\n\n const batchResult = await this.processBatch(\n addresses,\n modifiedProcessor,\n options,\n );\n\n // Merge individual errors with any chunk-level errors\n return {\n ...batchResult,\n errors: [...batchResult.errors, ...individualErrors],\n totalErrors: batchResult.errors.length + individualErrors.length,\n };\n }\n\n /**\n * Get balances for multiple addresses\n * @example\n * const result = await mnee.batch().getBalances(addresses);\n * const totalBalance = result.results.reduce((sum, b) => sum + b.decimalAmount, 0);\n */\n async getBalances(addresses: string[], options: BatchOptions = {}): Promise<BatchResult<MNEEBalance>> {\n // Validate input is an array\n if (!Array.isArray(addresses)) {\n throw stacklessError('Input must be an array of addresses');\n }\n \n return this.processBatch(addresses, async (chunk) => this.service.getBalances(chunk), options);\n }\n\n /**\n * Get transaction histories for multiple addresses\n * @example\n * const params = addresses.map(addr => ({ address: addr, limit: 100 }));\n * const result = await mnee.batch().getTxHistories(params);\n */\n async getTxHistories(\n params: AddressHistoryParams[],\n options: BatchOptions = {},\n ): Promise<BatchResult<TxHistoryResponse>> {\n // Validate input is an array\n if (!Array.isArray(params)) {\n throw stacklessError('Input must be an array of address history parameters');\n }\n \n return this.processBatch(\n params,\n async (chunk) => this.service.getRecentTxHistories(chunk),\n options,\n (param) => param.address,\n );\n }\n\n /**\n * Parse multiple transactions\n * @example\n * const result = await mnee.batch().parseTx(txids, {\n * parseOptions: { includeRaw: true }\n * });\n */\n async parseTx(\n txids: string[],\n options: BatchOptions & { parseOptions?: ParseOptions } = {},\n ): Promise<BatchResult<BatchParseTxResult>> {\n // Validate input is an array\n if (!Array.isArray(txids)) {\n throw stacklessError('Input must be an array of transaction IDs');\n }\n \n const { parseOptions, ...batchOptions } = options;\n\n // Track individual errors within chunks\n const individualErrors: BatchError[] = [];\n\n const modifiedProcessor = async (chunk: string[]) => {\n const results = await Promise.allSettled(\n chunk.map(async (txid) => {\n // Validate txid first\n if (!txid || typeof txid !== 'string' || txid.trim() === '') {\n throw new Error('Invalid transaction ID: empty or not a string');\n }\n \n const hexRegex = /^[a-fA-F0-9]{64}$/;\n if (!hexRegex.test(txid)) {\n throw new Error(`Invalid transaction ID format: ${txid}`);\n }\n\n return {\n txid,\n parsed: await this.service.parseTx(txid, parseOptions),\n };\n }),\n );\n\n const successfulResults: BatchParseTxResult[] = [];\n \n results.forEach((result, index) => {\n const txid = chunk[index];\n if (result.status === 'fulfilled') {\n successfulResults.push(result.value);\n } else {\n // Track individual errors\n const errorMessage = result.reason instanceof Error \n ? result.reason.message \n : String(result.reason);\n individualErrors.push({\n items: [txid],\n error: { message: errorMessage },\n retryCount: batchOptions.maxRetries || 3,\n });\n }\n });\n\n // If continueOnError is false and we have errors, throw the first one\n if (!batchOptions.continueOnError && individualErrors.length > 0) {\n throw new Error(individualErrors[0].error.message);\n }\n\n return successfulResults;\n };\n\n const batchResult = await this.processBatch(\n txids,\n modifiedProcessor,\n batchOptions, // Respect user's continueOnError preference\n );\n\n // Merge individual errors with any chunk-level errors\n return {\n ...batchResult,\n errors: [...batchResult.errors, ...individualErrors],\n totalErrors: batchResult.errors.length + individualErrors.length,\n };\n }\n\n /**\n * Generic batch processor\n */\n private async processBatch<T, R>(\n items: T[],\n processor: (chunk: T[]) => Promise<R[]>,\n options: BatchOptions,\n getItemId?: (item: T) => string,\n ): Promise<BatchResult<R>> {\n const {\n chunkSize = 20,\n continueOnError = false,\n onProgress,\n maxRetries = 3,\n retryDelay = 1000,\n requestsPerSecond = 3,\n } = options;\n \n const validChunkSize = chunkSize > 0 ? chunkSize : 20;\n const validRequestsPerSecond = requestsPerSecond > 0 ? requestsPerSecond : 3;\n\n // Create rate limiter based on requests per second\n // For requestsPerSecond < 1, we need to ensure maxConcurrent is at least 1\n // but still respect the intended delay between requests\n const minDelay = Math.ceil(1000 / validRequestsPerSecond);\n const maxConcurrent = Math.max(1, Math.floor(validRequestsPerSecond));\n const rateLimiter = new RateLimiter(maxConcurrent, minDelay);\n\n if (items.length === 0) {\n return { results: [], errors: [], totalProcessed: 0, totalErrors: 0 };\n }\n\n const results: R[] = [];\n const errors: BatchError[] = [];\n let processed = 0;\n\n const chunks = this.chunkArray(items, validChunkSize);\n const totalChunks = chunks.length;\n\n // Process all chunks - rate limiter handles concurrency and timing\n const chunkPromises = chunks.map(async (chunk) => {\n try {\n const chunkResults = await this.processWithRetry(() => processor(chunk), maxRetries, retryDelay, rateLimiter);\n\n results.push(...chunkResults);\n processed++;\n\n if (onProgress) {\n onProgress(processed, totalChunks, errors.length);\n }\n\n return chunkResults;\n } catch (error) {\n if (!continueOnError) {\n throw error;\n }\n\n // When continueOnError is true and chunk processing fails,\n // try to process items individually to salvage partial results\n const partialResults: R[] = [];\n const failedItems: { item: T; error: Error }[] = [];\n\n for (const item of chunk) {\n try {\n // Process single item by wrapping in array\n const singleResult = await this.processWithRetry(\n () => processor([item]),\n maxRetries,\n retryDelay,\n rateLimiter,\n );\n if (singleResult.length > 0) {\n partialResults.push(...singleResult);\n }\n } catch (itemError) {\n const error = itemError instanceof Error \n ? itemError\n : new Error(String(itemError));\n failedItems.push({ item, error });\n }\n }\n\n // Add partial results\n results.push(...partialResults);\n\n // Record errors for failed items\n if (failedItems.length > 0) {\n const itemIds = failedItems.map(({ item }) => (getItemId ? getItemId(item) : (item as unknown as string)));\n const firstError = failedItems[0].error;\n errors.push({\n items: itemIds,\n error: {\n message: firstError.message,\n code: (firstError as any).code,\n },\n retryCount: maxRetries,\n });\n }\n\n processed++;\n if (onProgress) {\n onProgress(processed, totalChunks, errors.length);\n }\n\n return partialResults;\n }\n });\n\n // Wait for all chunks to complete\n await Promise.all(chunkPromises);\n\n return {\n results,\n errors,\n totalProcessed: processed,\n totalErrors: errors.length,\n };\n }\n\n /**\n * Process with retry logic\n */\n private async processWithRetry<T>(\n func: () => Promise<T>,\n maxRetries: number,\n retryDelay: number,\n rateLimiter: RateLimiter,\n ): Promise<T> {\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt < maxRetries; attempt++) {\n try {\n return await rateLimiter.execute(func);\n } catch (error) {\n lastError = error as Error;\n if (attempt < maxRetries - 1) {\n await this.delay(retryDelay * (attempt + 1));\n }\n }\n }\n\n throw lastError || new Error('Max retries exceeded');\n }\n\n /**\n * Split array into chunks\n */\n private chunkArray<T>(array: T[], chunkSize: number): T[][] {\n const chunks: T[][] = [];\n const size = Math.max(1, chunkSize); // Ensure chunk size is at least 1\n for (let i = 0; i < array.length; i += size) {\n chunks.push(array.slice(i, i + size));\n }\n return chunks;\n }\n\n /**\n * Delay execution\n */\n private delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n\n/**\n * Rate limiter for API calls\n */\nexport class RateLimiter {\n private queue: Array<() => void> = [];\n private running = 0;\n\n constructor(private maxConcurrent: number, private minDelay: number) {}\n\n async execute<T>(fn: () => Promise<T>): Promise<T> {\n await this.waitForSlot();\n\n try {\n this.running++;\n const start = Date.now();\n const result = await fn();\n\n // Ensure minimum delay between calls\n const elapsed = Date.now() - start;\n if (elapsed < this.minDelay) {\n await this.delay(this.minDelay - elapsed);\n }\n\n return result;\n } finally {\n this.running--;\n this.processQueue();\n }\n }\n\n private waitForSlot(): Promise<void> {\n if (this.running < this.maxConcurrent) {\n return Promise.resolve();\n }\n\n return new Promise((resolve) => {\n this.queue.push(resolve);\n });\n }\n\n private processQueue(): void {\n if (this.queue.length > 0 && this.running < this.maxConcurrent) {\n const next = this.queue.shift();\n if (next) next();\n }\n }\n\n private delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n","import {\n Hash,\n P2PKH,\n PrivateKey,\n PublicKey,\n Script,\n Transaction,\n TransactionSignature,\n UnlockingScript,\n Utils,\n OP,\n LockingScript,\n} from '@bsv/sdk';\nimport {\n Environment,\n GetSignatures,\n MNEEBalance,\n MNEEConfig,\n MneeInscription,\n SdkConfig,\n MneeSync,\n MNEEUtxo,\n ParseTxResponse,\n ParseTxExtendedResponse,\n ParseOptions,\n SendMNEE,\n TransferMultiOptions,\n SignatureRequest,\n SignatureResponse,\n TxHistory,\n TxHistoryResponse,\n TxOperation,\n AddressHistoryParams,\n TxAddressAmount,\n TransferResponse,\n TransferStatus,\n TxInputResponse,\n ProcessedInput,\n TxOutputResponse,\n ProcessedOutput,\n TransferOptions,\n BalanceResponse,\n} from './mnee.types.js';\nimport CosignTemplate from './mneeCosignTemplate.js';\nimport { applyInscription } from './utils/applyInscription.js';\nimport {\n isValidHex,\n parseCosignerScripts,\n parseInscription,\n parseSyncToTxHistory,\n validateAddress,\n validateTransferMultiOptions,\n validateTransferOptions,\n} from './utils/helper.js';\nimport { isNetworkError, logNetworkError } from './utils/networkError.js';\nimport { stacklessError } from './utils/stacklessError.js';\nimport {\n MNEE_PROXY_API_URL,\n SANDBOX_MNEE_API_URL,\n PROD_TOKEN_ID,\n PROD_MINT_ADDRESS,\n PROD_APPROVER,\n PUBLIC_PROD_MNEE_API_TOKEN,\n PUBLIC_SANDBOX_MNEE_API_TOKEN,\n SANDBOX_TOKEN_ID,\n SANDBOX_MINT_ADDRESS,\n SANDBOX_APPROVER,\n MNEE_DECIMALS,\n} from './constants.js';\nimport { RateLimiter } from './batch.js';\n\nexport class MNEEService {\n private mneeApiKey: string;\n private mneeConfig: MNEEConfig | undefined;\n private mneeApi: string;\n\n constructor(config: SdkConfig) {\n if (config.environment !== 'production' && config.environment !== 'sandbox') {\n throw stacklessError('Invalid environment. Must be either \"production\" or \"sandbox\"');\n }\n\n const isProd = config.environment === 'production';\n if (config?.apiKey === '') {\n throw stacklessError('MNEE API key cannot be an empty string');\n }\n if (config?.apiKey) {\n this.mneeApiKey = config.apiKey;\n } else {\n this.mneeApiKey = isProd ? PUBLIC_PROD_MNEE_API_TOKEN : PUBLIC_SANDBOX_MNEE_API_TOKEN;\n }\n this.mneeApi = isProd ? MNEE_PROXY_API_URL : SANDBOX_MNEE_API_URL;\n this.getCosignerConfig().catch(() => {});\n }\n\n public async getCosignerConfig(): Promise<MNEEConfig> {\n try {\n const response = await fetch(`${this.mneeApi}/v1/config?auth_token=${this.mneeApiKey}`, { method: 'GET' });\n\n if (response.status === 401 || response.status === 403) {\n throw stacklessError('Invalid API key');\n }\n\n if (!response.ok) throw stacklessError(`HTTP error! status: ${response.status}`);\n const data: MNEEConfig = await response.json();\n this.mneeConfig = data;\n return data;\n } catch (error) {\n if (isNetworkError(error)) {\n logNetworkError(error, 'fetch config');\n }\n throw error;\n }\n }\n\n public toAtomicAmount(amount: number): number {\n return Math.round(amount * 10 ** MNEE_DECIMALS);\n }\n\n public fromAtomicAmount(amount: number): number {\n return amount / 10 ** MNEE_DECIMALS;\n }\n\n private async createInscription(recipient: string, amount: number, config: MNEEConfig) {\n const inscriptionData = {\n p: 'bsv-20',\n op: 'transfer',\n id: config.tokenId,\n amt: amount.toString(),\n };\n return {\n lockingScript: applyInscription(new CosignTemplate().lock(recipient, PublicKey.fromString(config.approver)), {\n dataB64: Buffer.from(JSON.stringify(inscriptionData)).toString('base64'),\n contentType: 'application/bsv-20',\n }),\n satoshis: 1,\n };\n }\n\n public async getUtxos(\n address: string | string[],\n page?: number,\n size?: number,\n order?: 'asc' | 'desc',\n ): Promise<MNEEUtxo[]> {\n try {\n if (!address) {\n throw stacklessError('Address is required');\n }\n if (page !== undefined) {\n if (typeof page !== 'number' || page <= 0 || !Number.isFinite(page)) {\n throw stacklessError(`Invalid page: ${page}. Must be a positive integer`);\n }\n }\n\n if (size !== undefined) {\n if (typeof size !== 'number' || size <= 0 || !Number.isInteger(size)) {\n throw stacklessError(`Invalid size: ${size}. Must be a positive integer`);\n }\n }\n\n if (order !== undefined) {\n if (order !== 'asc' && order !== 'desc') {\n throw stacklessError(`Invalid order: ${order}. Must be 'asc' or 'desc'`);\n }\n }\n\n // Handle single address\n if (typeof address === 'string') {\n if (!validateAddress(address)) {\n throw stacklessError(`Invalid Bitcoin address: ${address}`);\n }\n const arrayAddress = [address];\n const response = await fetch(\n `${this.mneeApi}/v2/utxos?auth_token=${this.mneeApiKey}${page !== undefined ? `&page=${page}` : ''}${\n size !== undefined ? `&size=${size}` : ''\n }${order ? `&order=${order}` : ''}`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(arrayAddress),\n },\n );\n if (response.status === 401 || response.status === 403) {\n throw stacklessError('Invalid API key');\n }\n if (!response.ok) throw stacklessError(`HTTP error! status: ${response.status}`);\n const data: MNEEUtxo[] = await response.json();\n const ops = ['transfer', 'deploy+mint'];\n return data.filter((utxo) =>\n ops.includes(utxo.data.bsv21.op.toLowerCase() as 'transfer' | 'burn' | 'deploy+mint'),\n );\n }\n\n // Handle array of addresses - filter out invalid ones\n if (Array.isArray(address)) {\n const validAddresses = address.filter((addr) => typeof addr === 'string' && validateAddress(addr));\n\n if (validAddresses.length === 0) {\n throw stacklessError('No valid Bitcoin addresses provided');\n }\n\n // Log warning about invalid addresses\n const invalidAddresses = address.filter((addr) => typeof addr !== 'string' || !validateAddress(addr));\n if (invalidAddresses.length > 0) {\n console.warn(`\\x1b[33m${invalidAddresses.length} invalid bitcoin addresses will be ignored\\x1b[0m`);\n }\n\n const response = await fetch(\n `${this.mneeApi}/v2/utxos?auth_token=${this.mneeApiKey}${page !== undefined ? `&page=${page}` : ''}${\n size !== undefined ? `&size=${size}` : ''\n }${order ? `&order=${order}` : ''}`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(validAddresses),\n },\n );\n if (response.status === 401 || response.status === 403) {\n throw stacklessError('Invalid API key');\n }\n if (!response.ok) throw stacklessError(`HTTP error! status: ${response.status}`);\n const data: MNEEUtxo[] = await response.json();\n const ops = ['transfer', 'deploy+mint'];\n return data.filter((utxo) =>\n ops.includes(utxo.data.bsv21.op.toLowerCase() as 'transfer' | 'burn' | 'deploy+mint'),\n );\n }\n\n throw stacklessError('Invalid input type for address');\n } catch (error) {\n if (isNetworkError(error)) {\n logNetworkError(error, 'fetch UTXOs');\n }\n throw error;\n }\n }\n\n private async fetchRawTx(txid: string, retries: number = 3): Promise<Transaction | undefined> {\n for (let attempt = 0; attempt <= retries; attempt++) {\n try {\n const resp = await fetch(`${this.mneeApi}/v1/tx/${txid}?auth_token=${this.mneeApiKey}`);\n\n if (resp.status === 404) throw stacklessError('Transaction not found');\n if (resp.status === 401 || resp.status === 403) {\n throw stacklessError('Invalid API key');\n }\n\n // Handle rate limiting with retry\n if (resp.status === 429 && attempt < retries) {\n // For rate limiting, use longer delay with exponential backoff\n const delay = Math.min(500 * Math.pow(2, attempt), 2000); // 500ms, 1s, 2s max\n await new Promise((resolve) => setTimeout(resolve, delay));\n continue;\n }\n\n if (resp.status !== 200) {\n throw stacklessError(`${resp.status} - Failed to fetch rawtx for txid: ${txid}`);\n }\n\n const { rawtx } = await resp.json();\n return Transaction.fromHex(Buffer.from(rawtx, 'base64').toString('hex'));\n } catch (error) {\n if (attempt === retries) {\n if (isNetworkError(error)) {\n logNetworkError(error, 'fetch transaction');\n }\n return undefined;\n }\n // For network errors, use a shorter fixed delay\n await new Promise((resolve) => setTimeout(resolve, 200));\n }\n }\n return undefined;\n }\n\n private async getSignatures(\n request: GetSignatures,\n privateKey: PrivateKey,\n ): Promise<{\n sigResponses?: SignatureResponse[];\n error?: { message: string; cause?: any };\n }> {\n try {\n const DEFAULT_SIGHASH_TYPE = 65;\n let tx: Transaction;\n switch (request.format) {\n case 'beef':\n tx = Transaction.fromHexBEEF(request.rawtx);\n break;\n case 'ef':\n tx = Transaction.fromHexEF(request.rawtx);\n break;\n default:\n tx = Transaction.fromHex(request.rawtx);\n break;\n }\n const sigResponses: SignatureResponse[] = request.sigRequests.flatMap((sigReq: SignatureRequest) => {\n return [privateKey].map((privKey: PrivateKey) => {\n const preimage = TransactionSignature.format({\n sourceTXID: sigReq.prevTxid,\n sourceOutputIndex: sigReq.outputIndex,\n sourceSatoshis: sigReq.satoshis,\n transactionVersion: tx.version,\n otherInputs: tx.inputs.filter((_, index) => index !== sigReq.inputIndex),\n inputIndex: sigReq.inputIndex,\n outputs: tx.outputs,\n inputSequence: tx.inputs[sigReq.inputIndex].sequence || 0,\n subscript: sigReq.script\n ? Script.fromHex(sigReq.script)\n : new P2PKH().lock(privKey.toPublicKey().toAddress()),\n lockTime: tx.lockTime,\n scope: sigReq.sigHashType || DEFAULT_SIGHASH_TYPE,\n });\n const rawSignature = privKey.sign(Hash.sha256(preimage));\n const sig = new TransactionSignature(\n rawSignature.r,\n rawSignature.s,\n sigReq.sigHashType || DEFAULT_SIGHASH_TYPE,\n );\n return {\n sig: Utils.toHex(sig.toChecksigFormat()),\n pubKey: privKey.toPublicKey().toString(),\n inputIndex: sigReq.inputIndex,\n sigHashType: sigReq.sigHashType || DEFAULT_SIGHASH_TYPE,\n csIdx: sigReq.csIdx,\n };\n });\n });\n return Promise.resolve({ sigResponses });\n } catch (err: any) {\n if (isNetworkError(err)) {\n logNetworkError(err, 'get signatures');\n }\n return {\n error: {\n message: err.message ?? 'unknown',\n cause: err.cause,\n },\n };\n }\n }\n\n public async getEnoughUtxos(address: string, totalAtomicTokenAmount: number): Promise<MNEEUtxo[]> {\n const config = this.mneeConfig || (await this.getCosignerConfig());\n if (!config) throw stacklessError('Config not fetched');\n const fees = config.fees;\n const fee = fees.find((f) => totalAtomicTokenAmount >= f.min && totalAtomicTokenAmount <= f.max);\n if (!fee) throw stacklessError('Fee not found');\n const feeAmount = fee.fee;\n const requiredAmount = totalAtomicTokenAmount + feeAmount;\n\n const balance = await this.getBalance(address);\n if (balance.amount < requiredAmount) {\n const maxTransferAmount = this.fromAtomicAmount(balance.amount - feeAmount);\n throw stacklessError(`Insufficient MNEE balance. Max transfer amount: ${maxTransferAmount}`);\n }\n\n let page = 1;\n let size = 25;\n let allUtxos: MNEEUtxo[] = [];\n let totalUtxoAmount = 0;\n\n // Collect UTXOs until we have enough\n while (totalUtxoAmount < requiredAmount) {\n const pageUtxos = await this.getUtxos(address, page, size);\n if (pageUtxos.length === 0) {\n // This shouldn't happen given we checked balance, but handle gracefully\n const maxTransferAmount = this.fromAtomicAmount(totalUtxoAmount - feeAmount);\n throw stacklessError(`Insufficient MNEE balance. Max transfer amount: ${maxTransferAmount}`);\n }\n\n allUtxos.push(...pageUtxos);\n totalUtxoAmount = allUtxos.reduce((sum, utxo) => sum + utxo.data.bsv21.amt, 0);\n\n if (totalUtxoAmount >= requiredAmount) {\n break;\n }\n\n page++;\n }\n\n // Sort all collected UTXOs by amount (highest first) for optimal selection\n allUtxos.sort((a, b) => b.data.bsv21.amt - a.data.bsv21.amt);\n\n // Select only the UTXOs we need\n let selectedUtxos: MNEEUtxo[] = [];\n let selectedAmount = 0;\n\n for (const utxo of allUtxos) {\n selectedUtxos.push(utxo);\n selectedAmount += utxo.data.bsv21.amt;\n if (selectedAmount >= requiredAmount) {\n break;\n }\n }\n\n return selectedUtxos;\n }\n\n public async getAllUtxos(address: string): Promise<MNEEUtxo[]> {\n // loop through and get all utxos\n let page = 1;\n let size = 100;\n let utxos: MNEEUtxo[] = [];\n while (true) {\n const pageUtxos = await this.getUtxos(address, page, size);\n if (pageUtxos.length === 0) break;\n utxos.push(...pageUtxos);\n page++;\n }\n return utxos;\n }\n\n public async transfer(\n request: SendMNEE[],\n wif: string,\n transferOptions?: TransferOptions,\n ): Promise<TransferResponse> {\n try {\n const config = this.mneeConfig || (await this.getCosignerConfig());\n if (!config) throw stacklessError('Config not fetched');\n\n const { isValid, totalAmount, privateKey, error } = validateTransferOptions(request, wif);\n if (!isValid) throw stacklessError(error || 'Invalid transfer options');\n if (!privateKey) throw stacklessError('Private key not found');\n if (!totalAmount) throw stacklessError('Invalid amount');\n\n const totalAtomicTokenAmount = this.toAtomicAmount(totalAmount);\n\n const address = privateKey.toAddress();\n const utxos = await this.getEnoughUtxos(address, totalAtomicTokenAmount);\n\n const fee =\n request.find((req) => req.address === config.burnAddress) !== undefined\n ? 0\n : config.fees.find(\n (fee: { min: number; max: number }) =>\n totalAtomicTokenAmount >= fee.min && totalAtomicTokenAmount <= fee.max,\n )?.fee;\n if (fee === undefined) throw stacklessError('Fee ranges inadequate');\n\n const tx = new Transaction(1, [], [], 0);\n let tokensIn = 0;\n let changeAddress = '';\n\n while (tokensIn < totalAtomicTokenAmount + fee) {\n const utxo = utxos.shift();\n if (!utxo) {\n const balance = await this.getBalance(address);\n const maxTransferAmount = this.fromAtomicAmount(balance.amount - fee);\n throw stacklessError('Insufficient MNEE balance. Max transfer amount is ' + maxTransferAmount);\n }\n\n const sourceTransaction = await this.fetchRawTx(utxo.txid);\n if (!sourceTransaction) throw stacklessError(`Failed to fetch source transaction: ${utxo.txid}_${utxo.vout}`);\n\n changeAddress = changeAddress || utxo.owners[0];\n tx.addInput({\n sourceTXID: utxo.txid,\n sourceOutputIndex: utxo.vout,\n sourceTransaction,\n unlockingScript: new UnlockingScript(),\n });\n tokensIn += utxo.data.bsv21.amt;\n }\n\n for (const req of request) {\n tx.addOutput(await this.createInscription(req.address, this.toAtomicAmount(req.amount), config));\n }\n if (fee > 0) tx.addOutput(await this.createInscription(config.feeAddress, fee, config));\n\n const change = tokensIn - totalAtomicTokenAmount - fee;\n if (change > 0) {\n tx.addOutput(await this.createInscription(changeAddress, change, config));\n }\n if (transferOptions?.extraData) {\n const items = Array.isArray(transferOptions.extraData)\n ? transferOptions.extraData\n : [transferOptions.extraData];\n\n if (items.length === 0) {\n throw stacklessError('extraData must contain at least one item');\n }\n const buffers: Buffer[] = [];\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n \n if (!item || typeof item.data !== 'string') {\n throw stacklessError(`Invalid extraData at index ${i}: data must be a string`);\n }\n if (item.type === 'utf8') {\n const buf = Buffer.from(item.data, 'utf8');\n if (buf.length === 0) {\n throw stacklessError(`extraData at index ${i} is empty after UTF-8 encoding`);\n }\n buffers.push(buf);\n } else if (item.type === 'hex') {\n const hex = item.data.trim();\n if (!hex) {\n throw stacklessError(`extraData at index ${i} is empty`);\n }\n if (!/^[0-9a-fA-F]+$/.test(hex) || hex.length % 2 !== 0) {\n throw stacklessError(\n `extraData at index ${i} is not valid hex or has odd length: \"${hex}\"`,\n );\n }\n const buf = Buffer.from(hex, 'hex');\n if (buf.length === 0) {\n throw stacklessError(`extraData at index ${i} decoded to an empty buffer`);\n }\n\n buffers.push(buf);\n } else {\n throw stacklessError(`Unsupported extraData type at index ${i}: ${(item as any).type}`);\n }\n }\n const totalBytes = buffers.reduce((sum, b) => sum + b.length, 0);\n if (totalBytes > 512) {\n throw stacklessError(\n `extraData is too large: ${totalBytes} bytes (max allowed is 512 bytes)`,\n );\n }\n\n const script = new Script();\n script.writeOpCode(OP.OP_0);\n script.writeOpCode(OP.OP_RETURN);\n for (const buf of buffers) {\n script.writeBin(Array.from(buf));\n }\n tx.addOutput({\n satoshis: 0,\n lockingScript: LockingScript.fromBinary(script.toBinary()),\n });\n }\n\n \n const privateKeys = new Map<number, PrivateKey>();\n for (let i = 0; i < tx.inputs.length; i++) {\n privateKeys.set(i, privateKey);\n }\n\n const signResult = await this.signAllInputs(tx, privateKeys);\n if (signResult.error) throw stacklessError(signResult.error);\n\n const rawtx = tx.toHex();\n\n if (transferOptions?.broadcast === false) {\n return { rawtx };\n }\n\n const { ticketId } = await this.submitRawTx(rawtx, transferOptions);\n if (!ticketId) throw stacklessError('Failed to broadcast transaction');\n return { ticketId };\n } catch (error) {\n if (isNetworkError(error)) {\n logNetworkError(error, 'transfer tokens');\n }\n throw error;\n }\n }\n\n public async submitRawTx(\n rawtx: string,\n transferOptions: TransferOptions = { broadcast: true, callbackUrl: undefined },\n ): Promise<TransferResponse> {\n try {\n if (transferOptions?.broadcast !== false) {\n transferOptions = { ...transferOptions, broadcast: true };\n }\n if (transferOptions?.callbackUrl && transferOptions?.broadcast === false) {\n throw stacklessError('Callback URL cannot be provided when broadcast is false');\n }\n if (!rawtx) {\n throw stacklessError('Raw transaction is required');\n }\n\n // Convert to base64 format for V2 API\n const tx = Transaction.fromHex(rawtx);\n if (!transferOptions?.broadcast) {\n return { rawtx: tx.toHex() };\n }\n const base64Tx = Utils.toBase64(tx.toBinary());\n\n const requestBody = JSON.stringify(\n transferOptions ? { rawtx: base64Tx, callback_url: transferOptions.callbackUrl } : { rawtx: base64Tx },\n );\n\n // Submit to V2 transfer endpoint for async processing\n const response = await fetch(`${this.mneeApi}/v2/transfer?auth_token=${this.mneeApiKey}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: requestBody,\n });\n\n if (!response.ok) {\n throw stacklessError(`Failed to submit transaction`);\n }\n\n const ticketId = await response.text();\n\n return { ticketId };\n } catch (error) {\n if (isNetworkError(error)) {\n logNetworkError(error, 'submit raw transaction');\n }\n throw error;\n }\n }\n\n public async getTxStatus(ticketId: string): Promise<TransferStatus> {\n try {\n if (!ticketId) {\n throw stacklessError('Ticket ID is required');\n }\n\n const response = await fetch(`${this.mneeApi}/v2/ticket?ticketID=${ticketId}&auth_token=${this.mneeApiKey}`, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n throw stacklessError(`Failed to get transaction status`);\n }\n\n const status: TransferStatus = await response.json();\n return status;\n } catch (error) {\n if (isNetworkError(error)) {\n logNetworkError(error, 'get transaction status');\n }\n throw error;\n }\n }\n\n public async getBalance(address: string): Promise<MNEEBalance> {\n // Validate address before making any API calls\n if (!validateAddress(address)) {\n const error = stacklessError(`Invalid Bitcoin address: ${address}`);\n throw error;\n }\n\n try {\n const config = this.mneeConfig || (await this.getCosignerConfig());\n if (!config) throw stacklessError('Config not fetched');\n\n const response = await fetch(`${this.mneeApi}/v2/balance?auth_token=${this.mneeApiKey}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify([address]),\n });\n\n if (!response.ok) {\n throw stacklessError(`Failed to get transaction status: ${response.status}`);\n }\n\n const balanceData: BalanceResponse = await response.json();\n\n // Handle empty array response (no balance for address)\n if (!balanceData || balanceData.length === 0) {\n return {\n address: address,\n amount: 0,\n decimalAmount: 0,\n };\n }\n\n return {\n address: balanceData[0].address,\n amount: balanceData[0].amt,\n decimalAmount: balanceData[0].precised,\n };\n } catch (error) {\n if (isNetworkError(error)) {\n logNetworkError(error, 'fetch balance');\n }\n throw error;\n }\n }\n\n public async getBalances(addresses: string[]): Promise<MNEEBalance[]> {\n if (!Array.isArray(addresses)) {\n throw stacklessError('Addresses must be an array');\n }\n const validAddresses = addresses.filter((addr) => validateAddress(addr));\n if (validAddresses.length === 0) {\n throw stacklessError('You must pass at least 1 valid address');\n }\n const totalInvalidAddresses = addresses.length - validAddresses.length;\n if (totalInvalidAddresses > 0) {\n console.warn(`\\x1b[33m${totalInvalidAddresses} invalid bitcoin addresses will be ignored\\x1b[0m`);\n }\n try {\n const config = this.mneeConfig || (await this.getCosignerConfig());\n if (!config) throw stacklessError('Config not fetched');\n const response = await fetch(`${this.mneeApi}/v2/balance?auth_token=${this.mneeApiKey}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(validAddresses),\n });\n\n if (!response.ok) {\n throw stacklessError(`Failed to get transaction status: ${response.status}`);\n }\n\n const balanceData: BalanceResponse = await response.json();\n\n // If API returns empty array, return all addresses with 0 balance\n if (!balanceData || balanceData.length === 0) {\n return validAddresses.map((addr) => ({\n address: addr,\n amount: 0,\n decimalAmount: 0,\n }));\n }\n\n // Create a map of addresses that have balances\n const balanceMap = new Map();\n balanceData.forEach((balance) => {\n balanceMap.set(balance.address, {\n address: balance.address,\n amount: balance.amt,\n decimalAmount: balance.precised,\n });\n });\n\n // Return all requested addresses, with 0 for those not in response\n return validAddresses.map((addr) => {\n if (balanceMap.has(addr)) {\n return balanceMap.get(addr);\n }\n return {\n address: addr,\n amount: 0,\n decimalAmount: 0,\n };\n });\n } catch (error) {\n if (isNetworkError(error)) {\n logNetworkError(error, 'fetch balances');\n }\n throw error;\n }\n }\n\n private processMneeValidation(tx: Transaction, config: MNEEConfig, request?: SendMNEE[]) {\n try {\n const txid = tx.id('hex');\n const isDeployTx = txid === config.tokenId.split('_')[0];\n\n const scripts = tx.outputs.map((output) => output.lockingScript);\n const parsedScripts = parseCosignerScripts(scripts);\n\n // Build a map of all outputs with their inscriptions\n const outputDetails = tx.outputs.map((output, idx) => {\n const script = output.lockingScript;\n const parsed = parsedScripts[idx];\n const inscription = parseInscription(script);\n\n let inscriptionData = null;\n if (inscription?.file?.content) {\n try {\n const content = Utils.toUTF8(inscription.file.content);\n if (content) {\n inscriptionData = JSON.parse(content);\n }\n } catch (e) {\n // Not a valid JSON inscription, skip\n }\n }\n\n return {\n index: idx,\n address: parsed?.address,\n cosigner: parsed?.cosigner,\n inscription: inscriptionData,\n };\n });\n\n // Check for cosigner presence and validity\n const hasCosigner = outputDetails.some((o) => o.cosigner === config.approver);\n const invalidCosigner = outputDetails.find((o) => o.cosigner !== '' && o.cosigner !== config.approver);\n\n if (invalidCosigner) {\n throw stacklessError('Invalid cosigner detected');\n }\n\n // Get all valid MNEE inscriptions\n const mneeInscriptions = outputDetails.filter((output) => {\n if (!output.inscription) return false;\n\n const insc = output.inscription as MneeInscription;\n if (insc.p !== 'bsv-20') return false;\n\n // Check token ID (skip for deploy transactions)\n if (!isDeployTx && insc.id !== config.tokenId) {\n throw stacklessError(`Invalid token ID: ${insc.id}`);\n }\n\n // Validate amount\n const amt = parseInt(insc.amt, 10);\n if (isNaN(amt) || amt <= 0) {\n throw stacklessError(`Invalid MNEE amount: ${insc.amt}`);\n }\n\n return true;\n });\n\n if (mneeInscriptions.length === 0) {\n throw stacklessError('No valid MNEE inscriptions found in transaction');\n }\n\n // Check what operations we have\n const operations = new Set(mneeInscriptions.map((o) => (o.inscription as MneeInscription).op));\n const hasBurn = operations.has('burn');\n\n // Check for redeem operations (transfer with redeem metadata)\n const hasRedeem = mneeInscriptions.some(\n (o) =>\n (o.inscription as MneeInscription).op === 'transfer' &&\n (o.inscription as MneeInscription).metadata?.action === 'redeem',\n );\n\n // Check if this is a redeem from mint address (which doesn't require cosigner)\n const isRedeemFromMint =\n hasRedeem && outputDetails.some((o) => o.address === SANDBOX_MINT_ADDRESS || o.address === PROD_MINT_ADDRESS);\n\n // Check for regular transfers (not redeems)\n const hasRegularTransfer = operations.has('transfer') && !hasRedeem;\n\n // Require cosigner for regular transfers, burns, and non-mint redeems\n if ((hasRegularTransfer || hasBurn || (hasRedeem && !isRedeemFromMint)) && !hasCosigner) {\n throw stacklessError('Cosigner not found in transaction with transfer/burn/redeem operation');\n }\n\n const mneeOutputsForValidation = mneeInscriptions.filter((output) => {\n const insc = output.inscription as MneeInscription;\n return insc.op === 'transfer' || insc.op === 'burn' || insc.op === 'deploy+mint';\n });\n\n // If request is provided, validate it matches the transaction\n if (request) {\n // Ensure we have enough outputs for all requests (including duplicates)\n const remainingOutputs = [...mneeOutputsForValidation];\n for (const req of request) {\n const outputIndex = remainingOutputs.findIndex(\n (output) =>\n output.address === req.address &&\n (output.inscription as MneeInscription).amt === this.toAtomicAmount(req.amount).toString(),\n );\n\n if (outputIndex === -1) {\n throw stacklessError(`No matching output found for ${req.address} with amount ${req.amount}`);\n }\n\n // Remove the matched output so it can't be matched again\n remainingOutputs.splice(outputIndex, 1);\n }\n }\n\n return true;\n } catch (error) {\n if (isNetworkError(error)) {\n logNetworkError(error, 'validate Mnee transaction');\n }\n return false;\n }\n }\n\n public async validateMneeTx(rawTx: string, request?: SendMNEE[]) {\n try {\n const config = this.mneeConfig || (await this.getCosignerConfig());\n if (!config) throw stacklessError('Config not fetched');\n const tx = Transaction.fromHex(rawTx);\n const isValid = this.processMneeValidation(tx, config, request);\n\n if (!isValid) return false;\n\n const txid = tx.id('hex');\n const isDeployTx = txid === config.tokenId.split('_')[0];\n\n // For non-deploy transactions, validate input/output totals\n if (!isDeployTx) {\n const inputData = await this.processTransactionInputs(tx, config);\n const outputData = this.processTransactionOutputs(tx, config);\n\n if (inputData.total !== outputData.total) {\n return false;\n }\n }\n\n return true;\n } catch (error) {\n if (isNetworkError(error)) {\n logNetworkError(error, 'validate Mnee transaction');\n }\n return false;\n }\n }\n\n private async getMneeSyncs(\n addresses: string | string[],\n fromScore?: number,\n limit?: number,\n order?: 'asc' | 'desc',\n ): Promise<{ address: string; syncs: MneeSync[] }[]> {\n try {\n const addressArray = Array.isArray(addresses) ? addresses : [addresses];\n const response = await fetch(\n `${this.mneeApi}/v1/sync?auth_token=${this.mneeApiKey}${fromScore ? `&from=${fromScore}` : ''}${\n limit ? `&limit=${limit}` : ''\n }${order ? `&order=${order}` : ''}`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(addressArray),\n },\n );\n if (response.status === 401 || response.status === 403) {\n throw stacklessError('Invalid API key');\n }\n if (!response.ok) throw stacklessError(`HTTP error! status: ${response.status}`);\n const data: MneeSync[] = await response.json();\n\n // Group syncs by address\n const syncsByAddress = addressArray.map((address) => {\n const filteredSyncs = data.filter((sync) => sync.senders.includes(address) || sync.receivers.includes(address));\n return { address, syncs: filteredSyncs };\n });\n\n return syncsByAddress;\n } catch (error) {\n if (isNetworkError(error)) {\n logNetworkError(error, 'fetch syncs');\n }\n throw error;\n }\n }\n\n public async getRecentTxHistory(\n address: string,\n fromScore?: number,\n limit?: number,\n order?: 'asc' | 'desc',\n ): Promise<TxHistoryResponse> {\n if (!validateAddress(address)) {\n const error = stacklessError(`Invalid Bitcoin address: ${address}`);\n throw error;\n }\n\n if (fromScore !== undefined) {\n if (typeof fromScore !== 'number' || fromScore < 0 || !Number.isFinite(fromScore)) {\n throw stacklessError(`Invalid fromScore: ${fromScore}. Must be a positive number or 0`);\n }\n }\n\n if (limit !== undefined) {\n if (typeof limit !== 'number' || limit <= 0 || !Number.isInteger(limit)) {\n throw stacklessError(`Invalid limit: ${limit}. Must be a positive integer`);\n }\n }\n\n if (order !== undefined) {\n if (order !== 'asc' && order !== 'desc') {\n throw stacklessError(`Invalid order: ${order}. Must be 'asc' or 'desc'`);\n }\n }\n\n try {\n const config = this.mneeConfig || (await this.getCosignerConfig());\n if (!config) throw stacklessError('Config not fetched');\n\n const syncsByAddress = await this.getMneeSyncs(address, fromScore, limit, order);\n const { syncs } = syncsByAddress[0]; // We're only requesting one address\n\n if (!syncs || syncs.length === 0) return { address, history: [], nextScore: fromScore || 0 };\n\n const txHistory: TxHistory[] = [];\n for (const sync of syncs) {\n const historyItem = parseSyncToTxHistory(sync, address, config);\n if (historyItem) {\n txHistory.push(historyItem);\n }\n }\n\n const nextScore = txHistory.length > 0 ? txHistory[txHistory.length - 1].score : fromScore || 0;\n\n if (limit && txHistory.length > limit) {\n return {\n address,\n history: txHistory.slice(0, limit),\n nextScore,\n };\n }\n\n return {\n address,\n history: txHistory,\n nextScore,\n };\n } catch (error) {\n if (isNetworkError(error)) {\n logNetworkError(error, 'fetch transaction history');\n }\n throw error;\n }\n }\n\n public async getRecentTxHistories(params: AddressHistoryParams[]): Promise<TxHistoryResponse[]> {\n if (!Array.isArray(params)) {\n throw stacklessError('Parameters must be an array');\n }\n\n if (params.length === 0) {\n throw stacklessError('You must pass at least 1 address parameter');\n }\n\n // Filter out invalid addresses and keep only valid ones\n const validParams = params.filter((param) => param && param.address && validateAddress(param.address));\n\n if (validParams.length === 0) {\n throw stacklessError('You must pass at least 1 valid address');\n }\n\n const totalInvalidAddresses = params.length - validParams.length;\n if (totalInvalidAddresses > 0) {\n console.warn(`\\x1b[33m${totalInvalidAddresses} invalid bitcoin addresses will be ignored\\x1b[0m`);\n }\n\n for (const param of validParams) {\n if (param.fromScore !== undefined) {\n if (typeof param.fromScore !== 'number' || param.fromScore < 0 || !Number.isFinite(param.fromScore)) {\n throw stacklessError(\n `Invalid fromScore for address ${param.address}: ${param.fromScore}. Must be a positive number or 0`,\n );\n }\n }\n\n if (param.limit !== undefined) {\n if (typeof param.limit !== 'number' || param.limit <= 0 || !Number.isInteger(param.limit)) {\n throw stacklessError(\n `Invalid limit for address ${param.address}: ${param.limit}. Must be a positive integer`,\n );\n }\n }\n\n if (param.order !== undefined) {\n if (param.order !== 'asc' && param.order !== 'desc') {\n throw stacklessError(`Invalid order for address ${param.address}: ${param.order}. Must be 'asc' or 'desc'`);\n }\n }\n }\n\n try {\n const config = this.mneeConfig || (await this.getCosignerConfig());\n if (!config) throw stacklessError('Config not fetched');\n\n // Group addressParams by fromScore, limit, and order to batch requests efficiently\n const groupedParams: Record<string, AddressHistoryParams[]> = {};\n validParams.forEach((param) => {\n const key = `${param.fromScore || 0}:${param.limit || 100}:${param.order || 'default'}`;\n if (!groupedParams[key]) {\n groupedParams[key] = [];\n }\n groupedParams[key].push(param);\n });\n\n // Process each group in parallel\n const groupPromises = Object.entries(groupedParams).map(async ([key, addressParams]) => {\n const [fromScoreStr, limitStr, orderStr] = key.split(':');\n const fromScore = Number(fromScoreStr);\n const limit = Number(limitStr);\n const order = orderStr === 'default' ? undefined : (orderStr as 'asc' | 'desc');\n const addresses = addressParams.map((p) => p.address);\n\n const syncsByAddress = await this.getMneeSyncs(addresses, fromScore, limit, order);\n\n // Process each address's syncs\n return syncsByAddress.map(({ address, syncs }) => {\n const param = addressParams.find((p) => p.address === address);\n if (!syncs || syncs.length === 0) {\n return {\n address,\n history: [],\n nextScore: param?.fromScore || 0,\n };\n }\n\n const txHistory: TxHistory[] = [];\n const seenTxids = new Set<string>();\n\n for (const sync of syncs) {\n const historyItem = parseSyncToTxHistory(sync, address, config);\n if (historyItem && !seenTxids.has(historyItem.txid)) {\n seenTxids.add(historyItem.txid);\n txHistory.push(historyItem);\n }\n }\n\n const nextScore = txHistory.length > 0 ? txHistory[txHistory.length - 1].score : param?.fromScore || 0;\n const paramLimit = param?.limit;\n\n if (paramLimit && txHistory.length > paramLimit) {\n return {\n address,\n history: txHistory.slice(0, paramLimit),\n nextScore,\n };\n }\n\n return {\n address,\n history: txHistory,\n nextScore,\n };\n });\n });\n\n // Flatten the results\n const results = await Promise.all(groupPromises);\n return results.flat();\n } catch (error) {\n if (isNetworkError(error)) {\n logNetworkError(error, 'fetch transaction histories');\n }\n throw error;\n }\n }\n\n // ============================================\n // parseTransaction HELPERS\n // ============================================\n\n /**\n * Parses inscription data from a script\n * @param script The script to parse\n * @returns The parsed inscription data or null if invalid\n */\n private parseInscriptionData(script: Script): MneeInscription | null {\n try {\n const inscription = parseInscription(script);\n const content = inscription?.file?.content;\n if (!content) return null;\n\n const inscriptionData = Utils.toUTF8(content);\n if (!inscriptionData) return null;\n\n return JSON.parse(inscriptionData) as MneeInscription;\n } catch (error) {\n if (isNetworkError(error)) {\n logNetworkError(error, 'parse inscription data');\n }\n return null;\n }\n }\n\n private determineEnvironment(txid: string, tokenId: string, cosigner: string, address: string): Environment {\n // Highest priority: specific transaction IDs\n if (txid === PROD_TOKEN_ID.split('_')[0]) return 'production'; // genesis (deploy) transaction\n if (txid === SANDBOX_TOKEN_ID.split('_')[0]) return 'sandbox'; // genesis (deploy) transaction\n\n // Production if BOTH token and approver match\n if (tokenId === PROD_TOKEN_ID && cosigner === PROD_APPROVER) {\n return 'production';\n }\n\n // Sandbox if BOTH token and approver match\n if (tokenId === SANDBOX_TOKEN_ID && cosigner === SANDBOX_APPROVER) {\n return 'sandbox';\n }\n\n // Special case: empty cosigner with production address (mint operations)\n if (cosigner === '' && address === PROD_MINT_ADDRESS) {\n return 'production';\n }\n\n // Special case: empty cosigner with sandbox address (mint operations)\n if (cosigner === '' && address === SANDBOX_MINT_ADDRESS) {\n return 'sandbox';\n }\n\n // Default to sandbox for all other cases\n return 'sandbox';\n }\n\n private determineTransactionType(\n operation: string,\n address: string,\n txid: string,\n mintAddress: string,\n tokenId: string,\n ): TxOperation {\n // Highest priority: burn operation\n if (operation === 'burn') return 'burn';\n\n // Deploy+mint operation\n if (operation === 'deploy+mint' || address === mintAddress) {\n // If txid matches the token ID prefix, it's a deploy\n return txid === tokenId.split('_')[0] ? 'deploy' : 'mint';\n }\n\n // Known addresses indicate mint\n if (address === PROD_MINT_ADDRESS || address === SANDBOX_MINT_ADDRESS) {\n return 'mint';\n }\n\n // Default to transfer\n return 'transfer';\n }\n\n private async processTransactionInputs(tx: Transaction, config: MNEEConfig): Promise<TxInputResponse> {\n const txid = tx.id('hex');\n const inputs: ProcessedInput[] = new Array(tx.inputs.length);\n let total = BigInt(0);\n let environment: Environment | undefined;\n let type: TxOperation | undefined;\n\n // Create a rate limiter for 3 requests per second (default MNEE API rate limit ok being hardcoded)\n const rateLimiter = new RateLimiter(3, 334);\n\n const fetchTasks = tx.inputs.map(async (input, index) => {\n if (!input.sourceTXID) {\n return { index, sourceTx: null };\n }\n\n try {\n const sourceTx = await rateLimiter.execute(() => this.fetchRawTx(input.sourceTXID!));\n return { index, sourceTx };\n } catch (error) {\n if (isNetworkError(error)) {\n logNetworkError(error, 'fetch source transaction');\n }\n return { index, sourceTx: null };\n }\n });\n\n const results = await Promise.all(fetchTasks);\n\n for (const { index, sourceTx } of results) {\n const input = tx.inputs[index];\n if (!sourceTx || !input.sourceTXID) {\n inputs[index] = {\n address: undefined,\n amount: 0,\n satoshis: 0,\n inscription: null,\n cosigner: undefined,\n };\n continue;\n }\n\n const sourceOutput = sourceTx.outputs[input.sourceOutputIndex];\n const parsedCosigner = parseCosignerScripts([sourceOutput.lockingScript])[0];\n const inscription = this.parseInscriptionData(sourceOutput.lockingScript);\n\n const processedInput: ProcessedInput = {\n address: parsedCosigner?.address,\n amount: inscription ? parseInt(inscription.amt) : 0,\n satoshis: Number(sourceOutput.satoshis),\n inscription,\n cosigner: parsedCosigner,\n };\n\n inputs[index] = processedInput;\n\n if (inscription && parsedCosigner) {\n total += BigInt(inscription.amt);\n\n // Determine environment if not already set\n if (!environment) {\n environment = this.determineEnvironment(\n txid,\n inscription.id,\n parsedCosigner.cosigner || '',\n parsedCosigner.address || '',\n );\n }\n\n // Determine type if not already set\n if (!type) {\n type = this.determineTransactionType(\n inscription.op,\n parsedCosigner.address || '',\n txid,\n config.mintAddress,\n config.tokenId,\n );\n }\n }\n }\n\n return { inputs, total, environment, type };\n }\n\n private processTransactionOutputs(tx: Transaction, config: MNEEConfig): TxOutputResponse {\n const txid = tx.id('hex');\n const outputs: ProcessedOutput[] = [];\n let total = BigInt(0);\n let environment: Environment | undefined;\n let type: TxOperation | undefined;\n\n for (let i = 0; i < tx.outputs.length; i++) {\n const output = tx.outputs[i];\n\n const parsedCosigner = parseCosignerScripts([output.lockingScript])[0];\n const inscription = this.parseInscriptionData(output.lockingScript);\n\n const processedOutput: ProcessedOutput = {\n address: parsedCosigner?.address,\n amount: inscription ? parseInt(inscription.amt) : 0,\n satoshis: Number(output.satoshis),\n inscription,\n cosigner: parsedCosigner,\n };\n\n outputs.push(processedOutput);\n\n if (inscription && parsedCosigner) {\n total += BigInt(inscription.amt);\n\n environment = this.determineEnvironment(\n txid,\n inscription.id,\n parsedCosigner.cosigner || '',\n parsedCosigner.address || '',\n );\n\n const outputType = this.determineTransactionType(\n inscription.op,\n parsedCosigner.address || '',\n txid,\n config.mintAddress,\n config.tokenId,\n );\n\n if (outputType === 'burn' || outputType === 'deploy') {\n type = outputType;\n } else if (!type) {\n type = outputType;\n }\n }\n }\n\n return { outputs, total, environment, type };\n }\n\n private validateTransaction(\n config: MNEEConfig,\n tx: Transaction,\n type: TxOperation,\n inputTotal: bigint,\n outputTotal: bigint,\n ): boolean {\n const isValidMnee = this.processMneeValidation(tx, config);\n if (!isValidMnee) return false;\n if (type === 'deploy') return true;\n // Redeem transactions follow the same balance rules as transfers\n return inputTotal === outputTotal;\n }\n\n private buildParseResponse(\n txid: string,\n environment: Environment,\n type: TxOperation,\n inputData: { inputs: ProcessedInput[]; total: bigint },\n outputData: { outputs: ProcessedOutput[]; total: bigint },\n isValid: boolean,\n tx: Transaction,\n options?: ParseOptions,\n ): ParseTxResponse | ParseTxExtendedResponse {\n const simpleInputs: TxAddressAmount[] = inputData.inputs\n .filter((input) => input.inscription && input.address)\n .map((input) => ({\n address: input.address!,\n amount: input.amount,\n }));\n\n const simpleOutputs: TxAddressAmount[] = outputData.outputs\n .filter((output) => output.inscription && output.address)\n .map((output) => ({\n address: output.address!,\n amount: output.amount,\n }));\n\n const baseResponse: ParseTxResponse = {\n txid,\n environment,\n type,\n inputs: simpleInputs,\n outputs: simpleOutputs,\n isValid,\n inputTotal: inputData.total.toString(),\n outputTotal: outputData.total.toString(),\n };\n\n if (options?.includeRaw) {\n const extendedResponse: ParseTxExtendedResponse = {\n ...baseResponse,\n raw: {\n txHex: tx.toHex(),\n inputs: tx.inputs.map((input, index) => {\n const processedInput = inputData.inputs[index];\n return {\n txid: input.sourceTXID || '',\n vout: input.sourceOutputIndex,\n scriptSig: input.unlockingScript?.toHex() || '',\n sequence: input.sequence || 0xffffffff,\n address: processedInput?.address,\n satoshis: processedInput?.satoshis || 0,\n tokenData: processedInput?.inscription ? { amount: processedInput.amount } : undefined,\n };\n }),\n outputs: tx.outputs.map((output, index) => {\n const processedOutput = outputData.outputs[index];\n return {\n value: Number(output.satoshis),\n scriptPubKey: output.lockingScript.toHex(),\n address: processedOutput?.address,\n tokenData: processedOutput?.inscription ? { amount: processedOutput.amount } : undefined,\n };\n }),\n },\n };\n return extendedResponse;\n }\n\n return baseResponse;\n }\n\n private async parseTransaction(\n tx: Transaction,\n config: MNEEConfig,\n options?: ParseOptions,\n ): Promise<ParseTxResponse | ParseTxExtendedResponse> {\n const txid = tx.id('hex');\n\n const inputData = await this.processTransactionInputs(tx, config);\n const outputData = this.processTransactionOutputs(tx, config);\n\n const environment = outputData.environment || inputData.environment || 'sandbox';\n\n let type = outputData.type || inputData.type || 'transfer';\n\n if (type === 'transfer') {\n const hasMintInputAddress = inputData.inputs.some(\n (input) => input.inscription && (input.address === PROD_MINT_ADDRESS || input.address === SANDBOX_MINT_ADDRESS),\n );\n\n if (hasMintInputAddress) {\n type = 'mint';\n }\n }\n\n // Check if any output has redeem metadata (check this for any transfer-like operation)\n // This should override mint/transfer types as redeem is a special operation marked by metadata\n if (type === 'transfer' || type === 'mint') {\n const hasRedeemOutput = outputData.outputs.some((output) => output.inscription?.metadata?.action === 'redeem');\n\n if (hasRedeemOutput) {\n type = 'redeem';\n }\n }\n\n // If there are no inputs with inscriptions, it can be nothing but a deploy\n const inputsWithInscriptions = inputData.inputs.filter((input) => input.inscription);\n if (inputsWithInscriptions.length === 0 && inputData.inputs.length > 0) {\n type = 'deploy';\n }\n\n const isValid = this.validateTransaction(config, tx, type, inputData.total, outputData.total);\n\n return this.buildParseResponse(txid, environment, type, inputData, outputData, isValid, tx, options);\n }\n\n public async parseTx(txid: string, options?: ParseOptions): Promise<ParseTxResponse | ParseTxExtendedResponse> {\n const hexRegex = /^[a-fA-F0-9]{64}$/;\n if (!txid || typeof txid !== 'string' || txid.trim() === '' || !hexRegex.test(txid)) {\n throw stacklessError('A valid transaction ID is required');\n }\n\n const config = this.mneeConfig || (await this.getCosignerConfig());\n if (!config) throw stacklessError('Config not fetched');\n const tx = await this.fetchRawTx(txid);\n if (!tx) throw stacklessError('Failed to fetch transaction');\n return await this.parseTransaction(tx, config, options);\n }\n\n public async parseTxFromRawTx(\n rawTxHex: string,\n options?: ParseOptions,\n ): Promise<ParseTxResponse | ParseTxExtendedResponse> {\n if (!rawTxHex || typeof rawTxHex !== 'string' || rawTxHex.trim() === '') {\n throw stacklessError('A valid raw transaction is required');\n }\n if (!isValidHex(rawTxHex)) {\n throw stacklessError('Invalid raw transaction hex');\n }\n const tx = Transaction.fromHex(rawTxHex);\n const config = this.mneeConfig || (await this.getCosignerConfig());\n if (!config) throw stacklessError('Config not fetched');\n return await this.parseTransaction(tx, config, options);\n }\n\n public parseInscription(script: Script) {\n return parseInscription(script);\n }\n\n public parseCosignerScripts(scripts: Script[]) {\n return parseCosignerScripts(scripts);\n }\n\n private validateUniqueInputs(inputs: TransferMultiOptions['inputs']): { error?: string } {\n const inputSet = new Set<string>();\n for (const input of inputs) {\n const inputKey = `${input.txid}:${input.vout}`;\n if (inputSet.has(inputKey)) {\n return { error: `Duplicate input detected: ${inputKey}. Each UTXO can only be spent once.` };\n }\n inputSet.add(inputKey);\n }\n return {};\n }\n\n private async addInputsToTransaction(\n tx: Transaction,\n inputs: TransferMultiOptions['inputs'],\n privateKeys: Map<number, PrivateKey>,\n ): Promise<{ tokensIn: number; error?: string }> {\n let tokensIn = 0;\n\n for (let i = 0; i < inputs.length; i++) {\n const input = inputs[i];\n const sourceTransaction = await this.fetchRawTx(input.txid);\n if (!sourceTransaction)\n return { tokensIn: 0, error: `Failed to fetch source transaction: ${input.txid}_${input.vout}` };\n\n const output = sourceTransaction.outputs[input.vout];\n if (!output) return { tokensIn: 0, error: `Output ${input.vout} not found in transaction ${input.txid}` };\n\n const inscription = this.parseInscriptionData(output.lockingScript);\n if (!inscription) return { tokensIn: 0, error: `No inscription found in output ${input.txid}:${input.vout}` };\n\n const tokenAmount = parseInt(inscription.amt);\n tokensIn += tokenAmount;\n\n privateKeys.set(i, PrivateKey.fromWif(input.wif));\n\n tx.addInput({\n sourceTXID: input.txid,\n sourceOutputIndex: input.vout,\n sourceTransaction,\n unlockingScript: new UnlockingScript(),\n });\n }\n\n return { tokensIn };\n }\n\n private calculateTransferMultiFee(\n tokensIn: number,\n totalAtomicTokenAmount: number,\n changeAddress: TransferMultiOptions['changeAddress'],\n inputAddresses: Set<string>,\n config: MNEEConfig,\n recipients: SendMNEE[],\n ): { fee: number; error?: string } {\n let fee = 0;\n let previousFee = -1;\n\n while (fee !== previousFee) {\n previousFee = fee;\n\n const totalChange = tokensIn - totalAtomicTokenAmount - fee;\n\n // Calculate how much change goes to non-input addresses\n let changeToNonInputAddresses = 0;\n if (totalChange > 0) {\n if (typeof changeAddress === 'string') {\n // Single change address\n if (!inputAddresses.has(changeAddress)) {\n changeToNonInputAddresses = totalChange;\n }\n } else if (Array.isArray(changeAddress)) {\n // Multiple change addresses\n for (const changeOutput of changeAddress) {\n const atomicAmount = this.toAtomicAmount(changeOutput.amount);\n if (!inputAddresses.has(changeOutput.address)) {\n changeToNonInputAddresses += atomicAmount;\n }\n }\n } else {\n // Default to first input address - change goes back to input\n changeToNonInputAddresses = 0;\n }\n }\n\n // Total transfer amount = recipients + change to non-input addresses\n const totalTransferAmount = totalAtomicTokenAmount + changeToNonInputAddresses;\n\n // Get fee based on total transfer amount\n const newFee =\n recipients.find((req) => req.address === config.burnAddress) !== undefined\n ? 0\n : config.fees.find(\n (f: { min: number; max: number }) => totalTransferAmount >= f.min && totalTransferAmount <= f.max,\n )?.fee;\n\n if (newFee === undefined) return { fee: 0, error: 'Fee ranges inadequate' };\n fee = newFee;\n }\n\n return { fee };\n }\n\n private async addChangeOutputs(\n tx: Transaction,\n change: number,\n changeAddress: TransferMultiOptions['changeAddress'],\n privateKeys: Map<number, PrivateKey>,\n config: MNEEConfig,\n tokensIn: number,\n totalAtomicTokenAmount: number,\n fee: number,\n ): Promise<{ error?: string }> {\n if (change <= 0) return {};\n\n if (typeof changeAddress === 'string') {\n // Single change address\n tx.addOutput(await this.createInscription(changeAddress, change, config));\n } else if (Array.isArray(changeAddress)) {\n // Multiple change outputs\n if (changeAddress.length === 0) {\n return {\n error:\n 'Change address array cannot be empty. Provide at least one change output or use a single address string.',\n };\n }\n\n const atomicChangeOutputs = changeAddress.map((c) => ({\n address: c.address,\n amount: this.toAtomicAmount(c.amount),\n }));\n\n const changeSum = atomicChangeOutputs.reduce((sum, c) => sum + c.amount, 0);\n if (changeSum !== change) {\n const changeDecimal = this.fromAtomicAmount(change);\n const changeSumDecimal = this.fromAtomicAmount(changeSum);\n return {\n error: `Change amounts must sum to ${changeDecimal} (${change} atomic units). Total inputs: ${this.fromAtomicAmount(\n tokensIn,\n )} - total outputs: ${this.fromAtomicAmount(totalAtomicTokenAmount)} - fee: ${this.fromAtomicAmount(\n fee,\n )} = ${changeDecimal}. Your change outputs sum to ${changeSumDecimal} (${changeSum} atomic units).`,\n };\n }\n\n for (const changeOutput of changeAddress) {\n if (changeOutput.amount <= 0) {\n return { error: `Invalid change amount: ${changeOutput.amount}. Must be positive.` };\n }\n }\n\n for (const changeOutput of atomicChangeOutputs) {\n tx.addOutput(await this.createInscription(changeOutput.address, changeOutput.amount, config));\n }\n } else {\n // Default to first input's address\n const defaultChangeAddress = privateKeys.get(0)!.toAddress();\n tx.addOutput(await this.createInscription(defaultChangeAddress, change, config));\n }\n\n return {};\n }\n\n private async signAllInputs(tx: Transaction, privateKeys: Map<number, PrivateKey>): Promise<{ error?: string }> {\n const sigRequests: SignatureRequest[] = tx.inputs.map((input, index) => {\n if (!input.sourceTXID) throw stacklessError('Source TXID is undefined');\n return {\n prevTxid: input.sourceTXID,\n outputIndex: input.sourceOutputIndex,\n inputIndex: index,\n address: privateKeys.get(index)!.toAddress(),\n script: input.sourceTransaction?.outputs[input.sourceOutputIndex].lockingScript.toHex(),\n satoshis: input.sourceTransaction?.outputs[input.sourceOutputIndex].satoshis || 1,\n sigHashType:\n TransactionSignature.SIGHASH_ALL |\n TransactionSignature.SIGHASH_ANYONECANPAY |\n TransactionSignature.SIGHASH_FORKID,\n };\n });\n\n const rawtx = tx.toHex();\n const allSigResponses: SignatureResponse[] = [];\n\n for (const [inputIndex, privateKey] of privateKeys.entries()) {\n const inputSigRequest = sigRequests[inputIndex];\n const res = await this.getSignatures({ rawtx, sigRequests: [inputSigRequest] }, privateKey);\n\n if (!res?.sigResponses) {\n return { error: `Failed to get signatures for input ${inputIndex}` };\n }\n\n allSigResponses.push(...res.sigResponses);\n }\n\n for (const sigResponse of allSigResponses) {\n tx.inputs[sigResponse.inputIndex].unlockingScript = new Script()\n .writeBin(Utils.toArray(sigResponse.sig, 'hex'))\n .writeBin(Utils.toArray(sigResponse.pubKey, 'hex'));\n }\n\n return {};\n }\n\n private validateTokenConservation(tx: Transaction, tokensIn: number): { error?: string } {\n let totalOut = 0;\n for (let i = 0; i < tx.outputs.length; i++) {\n const output = tx.outputs[i];\n const inscription = this.parseInscriptionData(output.lockingScript);\n if (inscription) {\n const amt = parseInt(inscription.amt);\n totalOut += amt;\n }\n }\n\n if (tokensIn !== totalOut) {\n return {\n error: `Token conservation violation! Inputs (${this.fromAtomicAmount(\n tokensIn,\n )}) do not equal outputs (${this.fromAtomicAmount(totalOut)}). This would ${\n tokensIn > totalOut ? 'burn' : 'create'\n } ${this.fromAtomicAmount(Math.abs(tokensIn - totalOut))} tokens.`,\n };\n }\n\n return {};\n }\n\n // private async broadcastTransaction(tx: Transaction): Promise<{ txid?: string; rawtx?: string; error?: string }> {\n // try {\n // const base64Tx = Utils.toBase64(tx.toBinary());\n // const response = await fetch(`${this.mneeApi}/v1/transfer?auth_token=${this.mneeApiKey}`, {\n // method: 'POST',\n // headers: { 'Content-Type': 'application/json' },\n // body: JSON.stringify({ rawtx: base64Tx }),\n // });\n\n // if (response.status === 401 || response.status === 403) {\n // throw stacklessError('Invalid API key');\n // }\n\n // if (!response.ok) throw stacklessError(`HTTP error! status: ${response.status}`);\n\n // const { rawtx: responseRawtx } = await response.json();\n // if (!responseRawtx) throw stacklessError('Failed to broadcast transaction');\n\n // const decodedBase64AsBinary = Utils.toArray(responseRawtx, 'base64');\n // const tx2 = Transaction.fromBinary(decodedBase64AsBinary);\n\n // return { txid: tx2.id('hex'), rawtx: Utils.toHex(decodedBase64AsBinary) };\n // } catch (error) {\n // if (isNetworkError(error)) {\n // logNetworkError(error, 'broadcast transaction');\n // }\n // let errorMessage = 'Transaction broadcast failed';\n // if (error instanceof Error) {\n // errorMessage = error.message;\n // }\n // throw stacklessError(errorMessage);\n // }\n // }\n\n public async transferMulti(\n options: TransferMultiOptions,\n transferOptions?: TransferOptions,\n ): Promise<TransferResponse> {\n try {\n const config = this.mneeConfig || (await this.getCosignerConfig());\n if (!config) throw stacklessError('Config not fetched');\n\n const { isValid, error } = validateTransferMultiOptions(options);\n if (!isValid) throw stacklessError(error || 'Invalid transfer options');\n\n const totalAmount = options.recipients.reduce((sum, req) => sum + req.amount, 0);\n if (totalAmount <= 0) throw stacklessError('Invalid amount');\n const totalAtomicTokenAmount = this.toAtomicAmount(totalAmount);\n\n const validationResult = this.validateUniqueInputs(options.inputs);\n if (validationResult.error) throw stacklessError(validationResult.error);\n\n const tx = new Transaction(1, [], [], 0);\n const privateKeys = new Map<number, PrivateKey>();\n\n const inputResult = await this.addInputsToTransaction(tx, options.inputs, privateKeys);\n if (inputResult.error) throw stacklessError(inputResult.error);\n const tokensIn = inputResult.tokensIn;\n\n const inputAddresses = new Set<string>();\n for (let i = 0; i < options.inputs.length; i++) {\n const privKey = PrivateKey.fromWif(options.inputs[i].wif);\n inputAddresses.add(privKey.toAddress());\n }\n\n const feeResult = this.calculateTransferMultiFee(\n tokensIn,\n totalAtomicTokenAmount,\n options.changeAddress,\n inputAddresses,\n config,\n options.recipients,\n );\n if (feeResult.error) throw stacklessError(feeResult.error);\n const fee = feeResult.fee;\n\n if (tokensIn < totalAtomicTokenAmount + fee) {\n const haveDecimal = this.fromAtomicAmount(tokensIn);\n const needDecimal = this.fromAtomicAmount(totalAtomicTokenAmount + fee);\n throw stacklessError(\n `Insufficient tokens. Have: ${haveDecimal}, Need: ${needDecimal} (including fee: ${this.fromAtomicAmount(\n fee,\n )})`,\n );\n }\n\n for (const req of options.recipients) {\n tx.addOutput(await this.createInscription(req.address, this.toAtomicAmount(req.amount), config));\n }\n\n if (fee > 0) {\n tx.addOutput(await this.createInscription(config.feeAddress, fee, config));\n }\n\n const change = tokensIn - totalAtomicTokenAmount - fee;\n const changeResult = await this.addChangeOutputs(\n tx,\n change,\n options.changeAddress,\n privateKeys,\n config,\n tokensIn,\n totalAtomicTokenAmount,\n fee,\n );\n if (changeResult.error) throw stacklessError(changeResult.error);\n \n // === ADD OP_RETURN LOGIC HERE (SAME AS IN transfer METHOD) ===\n if (transferOptions?.extraData) {\n const items = Array.isArray(transferOptions.extraData)\n ? transferOptions.extraData\n : [transferOptions.extraData];\n\n if (items.length === 0) {\n throw stacklessError('extraData must contain at least one item');\n }\n\n const buffers: Buffer[] = [];\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n \n if (!item || typeof item.data !== 'string') {\n throw stacklessError(`Invalid extraData at index ${i}: data must be a string`);\n }\n\n if (item.type === 'utf8') {\n const buf = Buffer.from(item.data, 'utf8');\n if (buf.length === 0) {\n throw stacklessError(`extraData at index ${i} is empty after UTF-8 encoding`);\n }\n buffers.push(buf);\n } else if (item.type === 'hex') {\n const hex = item.data.trim();\n if (!hex) {\n throw stacklessError(`extraData at index ${i} is empty`);\n }\n if (!/^[0-9a-fA-F]+$/.test(hex) || hex.length % 2 !== 0) {\n throw stacklessError(\n `extraData at index ${i} is not valid hex or has odd length: \"${hex}\"`,\n );\n }\n const buf = Buffer.from(hex, 'hex');\n if (buf.length === 0) {\n throw stacklessError(`extraData at index ${i} decoded to an empty buffer`);\n }\n buffers.push(buf);\n } else {\n throw stacklessError(`Unsupported extraData type at index ${i}: ${(item as any).type}`);\n }\n }\n\n const totalBytes = buffers.reduce((sum, b) => sum + b.length, 0);\n if (totalBytes > 512) {\n throw stacklessError(\n `extraData is too large: ${totalBytes} bytes (max allowed is 512 bytes)`,\n );\n }\n\n const script = new Script();\n script.writeOpCode(OP.OP_0);\n script.writeOpCode(OP.OP_RETURN);\n for (const buf of buffers) {\n script.writeBin(Array.from(buf));\n }\n \n tx.addOutput({\n satoshis: 0,\n lockingScript: LockingScript.fromBinary(script.toBinary()),\n });\n }\n // === END OP_RETURN LOGIC ===\n \n const signResult = await this.signAllInputs(tx, privateKeys);\n if (signResult.error) throw stacklessError(signResult.error);\n\n const conservationResult = this.validateTokenConservation(tx, tokensIn);\n if (conservationResult.error) throw stacklessError(conservationResult.error);\n\n const rawtx = tx.toHex();\n\n if (!transferOptions?.broadcast) {\n return { rawtx };\n }\n\n const { ticketId } = await this.submitRawTx(rawtx, transferOptions);\n if (!ticketId) throw stacklessError('Failed to broadcast transaction');\n\n return { ticketId };\n } catch (error) {\n if (isNetworkError(error)) {\n logNetworkError(error, 'multi-source transfer');\n }\n throw error;\n }\n }\n}\n","import { HD, Mnemonic } from '@bsv/sdk';\nimport * as bip39 from 'bip39';\nimport { stacklessError } from './utils/stacklessError';\n\n/**\n * Note: We're using the HD class from @bsv/sdk despite it being marked as deprecated.\n * The deprecation is because BSV is moving towards BRC-42 (invoice-based key derivation),\n * but for MNEE token management, standard BIP32/BIP44 HD wallets are still the appropriate\n * choice because:\n * - Users expect standard mnemonic/HD wallet functionality\n * - It needs to be compatible with existing wallet software\n * - The use case is for token management, not the privacy-focused invoice system of BRC-42\n */\n\nexport interface AddressInfo {\n address: string;\n privateKey: string;\n path: string;\n}\n\nexport interface HDWalletOptions {\n derivationPath: string;\n cacheSize?: number;\n}\n\nexport class HDWallet {\n private readonly masterKey: HD;\n private readonly derivationPath: string;\n private readonly cacheSize: number;\n private readonly cache: Map<string, AddressInfo>;\n\n constructor(mnemonic: string, options: HDWalletOptions) {\n if (!bip39.validateMnemonic(mnemonic)) {\n throw stacklessError('Invalid mnemonic phrase');\n }\n\n const seed = Mnemonic.fromString(mnemonic).toSeed();\n this.masterKey = HD.fromSeed(seed);\n this.derivationPath = options.derivationPath;\n this.cacheSize = options.cacheSize || 1000;\n this.cache = new Map();\n }\n\n /**\n * Generate a new random mnemonic phrase\n * @returns A new BIP39 mnemonic phrase (12 words)\n * @example\n * const mnemonic = HDWallet.generateMnemonic();\n * const hdWallet = new HDWallet(mnemonic, { derivationPath: \"m/44'/236'/0'\" });\n */\n static generateMnemonic(): string {\n return bip39.generateMnemonic();\n }\n\n /**\n * Validate a mnemonic phrase\n * @param mnemonic - The mnemonic phrase to validate\n * @returns true if valid, false otherwise\n */\n static isValidMnemonic(mnemonic: string): boolean {\n return bip39.validateMnemonic(mnemonic);\n }\n\n /**\n * Derive individual address with caching\n * @param index - The index of the address to derive\n * @param isChange - Whether this is a change address (default: false)\n * @returns Address information including address, private key, and derivation path\n */\n deriveAddress(index: number, isChange: boolean = false): AddressInfo {\n const changeIndex = isChange ? 1 : 0;\n const fullPath = `${this.derivationPath}/${changeIndex}/${index}`;\n\n if (this.cache.has(fullPath)) {\n return this.cache.get(fullPath)!;\n }\n\n const derivedKey = this.masterKey.derive(fullPath);\n const privateKey = derivedKey.privKey;\n\n if (!privateKey) {\n throw stacklessError(`Failed to derive private key for path: ${fullPath}`);\n }\n\n const addressInfo: AddressInfo = {\n address: privateKey.toAddress(),\n privateKey: privateKey.toWif(),\n path: fullPath,\n };\n\n // Add to cache if within limit\n if (this.cache.size < this.cacheSize) {\n this.cache.set(fullPath, addressInfo);\n }\n\n return addressInfo;\n }\n\n /**\n * Batch derive addresses for performance\n * @param startIndex - Starting index for derivation\n * @param count - Number of addresses to derive\n * @param isChange - Whether these are change addresses (default: false)\n * @returns Array of address information\n */\n async deriveAddresses(startIndex: number, count: number, isChange: boolean = false): Promise<AddressInfo[]> {\n const addresses: AddressInfo[] = [];\n\n // Derive addresses in batch\n for (let i = 0; i < count; i++) {\n const index = startIndex + i;\n const addressInfo = this.deriveAddress(index, isChange);\n addresses.push(addressInfo);\n }\n\n return addresses;\n }\n\n /**\n * Helper for transferMulti integration - get private keys for specific addresses\n * @param addresses - Array of addresses to get private keys for\n * @param options - Optional configuration for the search\n * @returns Object with private keys and derivation paths for each address\n * @throws Error if any addresses cannot be found within the scan limits\n */\n getPrivateKeysForAddresses(\n addresses: string[],\n options?: {\n maxScanReceive?: number; // Max receive addresses to scan (default: 10000)\n maxScanChange?: number; // Max change addresses to scan (default: 10000)\n scanStrategy?: 'sequential' | 'parallel'; // Scanning strategy (default: 'parallel')\n },\n ): {\n privateKeys: { [address: string]: string };\n paths: { [address: string]: string };\n } {\n const maxScanReceive = options?.maxScanReceive || 10000;\n const maxScanChange = options?.maxScanChange || 10000;\n const scanStrategy = options?.scanStrategy || 'parallel';\n\n const privateKeys: { [address: string]: string } = {};\n const paths: { [address: string]: string } = {};\n const addressSet = new Set(addresses);\n\n // First, check the cache for any matching addresses\n for (const [_, info] of this.cache) {\n if (addressSet.has(info.address)) {\n privateKeys[info.address] = info.privateKey;\n paths[info.address] = info.path;\n addressSet.delete(info.address);\n }\n }\n\n // If we found all addresses in cache, return early\n if (addressSet.size === 0) {\n return { privateKeys, paths };\n }\n\n // For missing addresses, we need to scan\n if (scanStrategy === 'sequential') {\n // Sequential scanning - scan receive addresses first, then change\n // This is more memory efficient but potentially slower\n\n // Scan receive addresses\n for (let i = 0; i < maxScanReceive && addressSet.size > 0; i++) {\n const info = this.deriveAddress(i, false);\n\n if (addressSet.has(info.address)) {\n privateKeys[info.address] = info.privateKey;\n paths[info.address] = info.path;\n addressSet.delete(info.address);\n }\n }\n\n // Scan change addresses\n for (let i = 0; i < maxScanChange && addressSet.size > 0; i++) {\n const info = this.deriveAddress(i, true);\n\n if (addressSet.has(info.address)) {\n privateKeys[info.address] = info.privateKey;\n paths[info.address] = info.path;\n addressSet.delete(info.address);\n }\n }\n } else {\n // Parallel scanning - interleave receive and change address scanning\n // This can find addresses faster if they're mixed between receive/change\n const maxScan = Math.max(maxScanReceive, maxScanChange);\n\n for (let i = 0; i < maxScan && addressSet.size > 0; i++) {\n // Scan receive address at this index\n if (i < maxScanReceive) {\n const receiveInfo = this.deriveAddress(i, false);\n if (addressSet.has(receiveInfo.address)) {\n privateKeys[receiveInfo.address] = receiveInfo.privateKey;\n paths[receiveInfo.address] = receiveInfo.path;\n addressSet.delete(receiveInfo.address);\n }\n }\n\n // Scan change address at this index\n if (i < maxScanChange) {\n const changeInfo = this.deriveAddress(i, true);\n if (addressSet.has(changeInfo.address)) {\n privateKeys[changeInfo.address] = changeInfo.privateKey;\n paths[changeInfo.address] = changeInfo.path;\n addressSet.delete(changeInfo.address);\n }\n }\n }\n }\n\n // Check if we found all requested addresses\n if (addressSet.size > 0) {\n const notFound = Array.from(addressSet);\n throw stacklessError(\n `Could not find private keys for ${notFound.length} address(es): ${notFound.join(', ')}. ` +\n `Scanned up to index ${maxScanReceive} for receive addresses and ${maxScanChange} for change addresses.`,\n );\n }\n\n return { privateKeys, paths };\n }\n\n /**\n * Helper for transferMulti integration - get private keys for specific addresses (simplified version)\n * @param addresses - Array of addresses to get private keys for\n * @param options - Optional configuration for the search\n * @returns Object mapping addresses to their private keys (WIF format)\n * @throws Error if any addresses cannot be found within the scan limits\n */\n getPrivateKeys(\n addresses: string[],\n options?: {\n maxScanReceive?: number;\n maxScanChange?: number;\n scanStrategy?: 'sequential' | 'parallel';\n },\n ): { [address: string]: string } {\n const result = this.getPrivateKeysForAddresses(addresses, options);\n return result.privateKeys;\n }\n\n /**\n * Scan for addresses with a gap limit (BIP44 standard)\n * This is useful for finding all used addresses in a wallet\n * @param gapLimit - Number of consecutive unused addresses before stopping (default: 20)\n * @param scanChange - Whether to scan change addresses too (default: true)\n * @param maxScan - Maximum addresses to scan per type (default: 10000)\n * @returns Object with arrays of discovered addresses\n */\n async scanAddressesWithGapLimit(\n checkAddressUsed: (address: string) => Promise<boolean>,\n options?: {\n gapLimit?: number;\n scanChange?: boolean;\n maxScan?: number;\n },\n ): Promise<{\n receive: AddressInfo[];\n change: AddressInfo[];\n }> {\n const gapLimit = options?.gapLimit || 20;\n const scanChange = options?.scanChange !== false;\n const maxScan = options?.maxScan || 10000;\n\n const result = {\n receive: [] as AddressInfo[],\n change: [] as AddressInfo[],\n };\n\n // Scan receive addresses\n let consecutiveUnused = 0;\n for (let i = 0; i < maxScan && consecutiveUnused < gapLimit; i++) {\n const info = this.deriveAddress(i, false);\n const isUsed = await checkAddressUsed(info.address);\n\n if (isUsed) {\n result.receive.push(info);\n consecutiveUnused = 0;\n } else {\n consecutiveUnused++;\n }\n }\n\n // Scan change addresses if requested\n if (scanChange) {\n consecutiveUnused = 0;\n for (let i = 0; i < maxScan && consecutiveUnused < gapLimit; i++) {\n const info = this.deriveAddress(i, true);\n const isUsed = await checkAddressUsed(info.address);\n\n if (isUsed) {\n result.change.push(info);\n consecutiveUnused = 0;\n } else {\n consecutiveUnused++;\n }\n }\n }\n\n return result;\n }\n\n /**\n * Clear the cache to free memory\n */\n clearCache(): void {\n this.cache.clear();\n }\n\n /**\n * Get the current cache size\n */\n getCacheSize(): number {\n return this.cache.size;\n }\n}\n","import { MNEEService } from './mneeService.js';\nimport {\n MNEEBalance,\n MNEEConfig,\n SdkConfig,\n ParseTxResponse,\n ParseTxExtendedResponse,\n ParseOptions,\n SendMNEE,\n TransferResponse,\n TransferStatus,\n TransferMultiOptions,\n TxHistoryResponse,\n AddressHistoryParams,\n Inscription,\n ParsedCosigner,\n MNEEUtxo,\n TransferOptions,\n} from './mnee.types.js';\nimport { Script } from '@bsv/sdk';\nimport { HDWallet, HDWalletOptions } from './hdWallet.js';\nimport { Batch } from './batch.js';\nexport * from './mnee.types.js';\n\nexport interface MneeInterface {\n config(): Promise<MNEEConfig>;\n balance(address: string): Promise<MNEEBalance>;\n balances(addresses: string[]): Promise<MNEEBalance[]>;\n getUtxos(address: string | string[], page?: number, size?: number, order?: 'asc' | 'desc'): Promise<MNEEUtxo[]>;\n getEnoughUtxos(address: string, totalAtomicTokenAmount: number): Promise<MNEEUtxo[]>;\n getAllUtxos(address: string): Promise<MNEEUtxo[]>;\n validateMneeTx(rawTxHex: string, request?: SendMNEE[]): Promise<boolean>;\n transfer(request: SendMNEE[], wif: string, transferOptions?: TransferOptions): Promise<TransferResponse>;\n transferMulti(options: TransferMultiOptions, transferOptions?: TransferOptions): Promise<TransferResponse>;\n submitRawTx(rawTxHex: string): Promise<TransferResponse>;\n getTxStatus(ticketId: string): Promise<TransferStatus>;\n toAtomicAmount(amount: number): number;\n fromAtomicAmount(amount: number): number;\n recentTxHistory(\n address: string,\n fromScore?: number,\n limit?: number,\n order?: 'asc' | 'desc',\n ): Promise<TxHistoryResponse>;\n recentTxHistories(params: AddressHistoryParams[]): Promise<TxHistoryResponse[]>;\n parseTx(txid: string, options?: ParseOptions): Promise<ParseTxResponse | ParseTxExtendedResponse>;\n parseTxFromRawTx(rawTxHex: string, options?: ParseOptions): Promise<ParseTxResponse | ParseTxExtendedResponse>;\n parseInscription(script: Script): Inscription | undefined;\n parseCosignerScripts(scripts: Script[]): ParsedCosigner[];\n HDWallet(mnemonic: string, options: HDWalletOptions): HDWallet;\n batch(): Batch;\n}\n\n/**\n * Represents the Mnee class that provides methods to interact with the MNEE service.\n */\nexport default class Mnee implements MneeInterface {\n private service: MNEEService;\n private _batch?: Batch;\n\n /**\n * Static reference to HDWallet class for accessing static methods\n * @example\n * const mnemonic = Mnee.HDWallet.generateMnemonic();\n * const isValid = Mnee.HDWallet.isValidMnemonic(mnemonic);\n */\n static HDWallet = HDWallet;\n\n constructor(config: SdkConfig) {\n this.service = new MNEEService(config);\n }\n\n /**\n * Validates an MNEE transaction.\n *\n * @param rawTxHex - The raw transaction hex string to validate.\n * @param request - An array of SendMNEE objects representing the transfer details. Use this parameter to validate the transaction against the specified transfer details. If it is not provided, it will only validate that the transaction is well-formed with the cosigner.\n * @returns A promise that resolves to a boolean indicating whether the transaction is valid.\n */\n async validateMneeTx(rawTxHex: string, request?: SendMNEE[]): Promise<boolean> {\n return this.service.validateMneeTx(rawTxHex, request);\n }\n\n /**\n * Converts a given amount to its atomic representation based on the specified number.\n *\n * @param amount - The amount to be converted.\n * @returns The atomic representation of the given amount.\n *\n * @example\n * ```typescript\n * toAtomicAmount(1.5); // 150000\n * ```\n */\n toAtomicAmount(amount: number): number {\n return this.service.toAtomicAmount(amount);\n }\n\n /**\n * Converts a given atomic amount to its human-readable representation.\n *\n * @param amount - The atomic amount to be converted.\n * @returns The human-readable representation of the given atomic amount.\n *\n * @example\n * ```typescript\n * fromAtomicAmount(150000); // 1.5\n * ```\n */\n fromAtomicAmount(amount: number): number {\n return this.service.fromAtomicAmount(amount);\n }\n\n /**\n * Retrieves the configuration for the MNEE service.\n *\n * @returns {Promise<MNEEConfig>} A promise that resolves to the MNEE configuration object.\n */\n async config(): Promise<MNEEConfig> {\n return this.service.getCosignerConfig();\n }\n\n /**\n * Retrieves the balance for a given address.\n *\n * @param address - The address to retrieve the balance for.\n * @returns A promise that resolves to a `MNEEBalance` object containing the balance details.\n */\n async balance(address: string): Promise<MNEEBalance> {\n return this.service.getBalance(address);\n }\n\n /**\n * Retrieves the balances for multiple addresses.\n *\n * @param addresses - An array of addresses to retrieve the balances for.\n * @returns A promise that resolves to an array of `MNEEBalance` objects containing the balance details for each address.\n */\n async balances(addresses: string[]): Promise<MNEEBalance[]> {\n return this.service.getBalances(addresses);\n }\n\n /**\n * Retrieves the UTXOs for a given address.\n *\n * @param address - The address to retrieve the UTXOs for.\n * @returns A promise that resolves to an array of `MNEEUtxo` objects containing the UTXO details.\n */\n async getUtxos(\n address: string | string[],\n page?: number,\n size?: number,\n order?: 'asc' | 'desc',\n ): Promise<MNEEUtxo[]> {\n return this.service.getUtxos(address, page, size, order);\n }\n\n /**\n * Retrieves the UTXOs for a given address that have enough balance to cover the total atomic token amount.\n *\n * @param address - The address to retrieve the UTXOs for.\n * @param totalAtomicTokenAmount - The total atomic token amount to cover.\n * @returns A promise that resolves to an array of `MNEEUtxo` objects containing the UTXO details.\n */\n async getEnoughUtxos(address: string, totalAtomicTokenAmount: number): Promise<MNEEUtxo[]> {\n return this.service.getEnoughUtxos(address, totalAtomicTokenAmount);\n }\n\n /**\n * Retrieves all UTXOs for a given address.\n *\n * @param address - The address to retrieve the UTXOs for.\n * @returns A promise that resolves to an array of `MNEEUtxo` objects containing the UTXO details.\n */\n async getAllUtxos(address: string): Promise<MNEEUtxo[]> {\n return this.service.getAllUtxos(address);\n }\n\n /**\n * Transfers the specified MNEE tokens using the provided WIF (Wallet Import Format) key.\n *\n * @param {SendMNEE[]} request - An array of SendMNEE objects representing the transfer details.\n * @param {string} wif - The Wallet Import Format key used to authorize the transfer.\n * @returns {Promise<TransferResponse>} A promise that resolves to a TransferResponse object containing the result of the transfer.\n */\n async transfer(request: SendMNEE[], wif: string, transferOptions?: TransferOptions): Promise<TransferResponse> {\n return this.service.transfer(request, wif, transferOptions);\n }\n\n /**\n * Transfers MNEE tokens from multiple source UTXOs with different private keys. This is a more advanced method that allows you to control the UTXOs used in the transfer along with associated private keys.\n *\n * @param options - The transfer options including inputs, recipients, and optional change address.\n * @returns A promise that resolves to a TransferResponse object containing the result of the transfer.\n */\n async transferMulti(options: TransferMultiOptions, transferOptions?: TransferOptions): Promise<TransferResponse> {\n return this.service.transferMulti(options, transferOptions);\n }\n\n /**\n * Submits a partially signed raw transaction to the MNEE network. This is useful when you have a raw transaction hex string that you have already signed, but you need to submit it to the MNEE network.\n *\n * @param rawTxHex - The raw transaction hex string to submit.\n * @returns A promise that resolves to a TransferResponse object containing the result of the transfer.\n */\n async submitRawTx(rawTxHex: string, transferOptions?: TransferOptions): Promise<TransferResponse> {\n return this.service.submitRawTx(rawTxHex, transferOptions);\n }\n\n /**\n * Gets the status of a transfer transaction using its ticket ID.\n *\n * @param ticketId - The ticket ID returned from submitRawTx or V2 transfer endpoint.\n * @returns A promise that resolves to a TransferStatus object containing the current status of the transfer.\n */\n async getTxStatus(ticketId: string): Promise<TransferStatus> {\n return this.service.getTxStatus(ticketId);\n }\n\n /**\n * Retrieves the recent transaction history for a given address.\n *\n * @param address - The address to retrieve the transaction history for.\n * @param fromScore - The starting score to retrieve the transaction history from.\n * @param limit - The maximum number of transactions to retrieve.\n * @returns A promise that resolves to a TxHistoryResponse object containing the transaction\n * history and the next score to retrieve additional transactions.\n */\n async recentTxHistory(\n address: string,\n fromScore?: number,\n limit?: number,\n order?: 'asc' | 'desc',\n ): Promise<TxHistoryResponse> {\n return this.service.getRecentTxHistory(address, fromScore, limit, order);\n }\n\n /**\n * Retrieves the recent transaction histories for multiple addresses.\n *\n * @param params - An array of address parameters, each containing an address, optional fromScore, and optional limit.\n * @returns A promise that resolves to an array of TxHistoryResponse objects containing the transaction\n * history for each address with its own pagination state.\n */\n async recentTxHistories(params: AddressHistoryParams[]): Promise<TxHistoryResponse[]> {\n return this.service.getRecentTxHistories(params);\n }\n\n /**\n * Parses a transaction based on the provided transaction ID.\n *\n * @param txid - The unique identifier of the transaction to be parsed.\n * @param options - Optional parsing options. Set includeRaw to true to get extended response with raw transaction data.\n * @returns A promise that resolves to a `ParseTxResponse` or `ParseTxExtendedResponse` containing the parsed transaction details.\n */\n async parseTx(txid: string, options?: ParseOptions): Promise<ParseTxResponse | ParseTxExtendedResponse> {\n return this.service.parseTx(txid, options);\n }\n\n /**\n * Parses a transaction from a raw transaction hex string.\n *\n * @param rawTxHex - The raw transaction hex string to be parsed.\n * @param options - Optional parsing options. Set includeRaw to true to get extended response with raw transaction data.\n * @returns A promise that resolves to a `ParseTxResponse` or `ParseTxExtendedResponse` containing the parsed transaction details.\n */\n async parseTxFromRawTx(rawTxHex: string, options?: ParseOptions): Promise<ParseTxResponse | ParseTxExtendedResponse> {\n return this.service.parseTxFromRawTx(rawTxHex, options);\n }\n\n /**\n * Parses an inscription.\n *\n * @param script - The script to be parsed.\n * @returns A `Inscription` object containing the parsed inscription details.\n */\n parseInscription(script: Script): Inscription | undefined {\n return this.service.parseInscription(script);\n }\n\n /**\n * Parses cosigner scripts to extract cosigner public keys and addresses.\n *\n * @param scripts - An array of Script objects to be parsed.\n * @returns An array of `ParsedCosigner` objects containing the parsed cosigner details.\n */\n parseCosignerScripts(scripts: Script[]): ParsedCosigner[] {\n return this.service.parseCosignerScripts(scripts);\n }\n\n /**\n * Creates a new HDWallet instance for managing hierarchical deterministic wallets.\n * @param mnemonic - The BIP39 mnemonic phrase\n * @param options - Configuration options for the HD wallet\n * @returns A new HDWallet instance\n * @example\n * const mnee = new Mnee(config);\n * const hdWallet = mnee.HDWallet(mnemonic, {\n * derivationPath: \"m/44'/236'/0'\",\n * cacheSize: 1000\n * });\n */\n HDWallet(mnemonic: string, options: HDWalletOptions): HDWallet {\n return new HDWallet(mnemonic, options);\n }\n\n /**\n * Returns a Batch instance for performing batch operations\n * @returns A Batch instance for batch processing\n * @example\n * const batch = mnee.batch();\n * const balances = await batch.getBalances(addresses);\n * const utxos = await batch.getUtxos(addresses);\n */\n batch(): Batch {\n if (!this._batch) {\n this._batch = new Batch(this.service);\n }\n return this._batch;\n }\n}\n"],"names":["stacklessError","message","error","Error","stack","undefined","CosignTemplate","_proto","prototype","lock","userPKHash","approverPubKey","pkhash","hash","Utils","fromBase58Check","prefix","data","lockingScript","LockingScript","writeOpCode","OP","OP_DUP","OP_HASH160","writeBin","OP_EQUALVERIFY","OP_CHECKSIGVERIFY","encode","OP_CHECKSIG","userUnlock","userPrivateKey","signOutputs","anyoneCanPay","sourceSatoshis","sign","tx","inputIndex","_input$sourceTransact","_input$sourceTransact2","_input$sourceTransact3","signatureScope","TransactionSignature","SIGHASH_FORKID","SIGHASH_ALL","SIGHASH_NONE","SIGHASH_SINGLE","SIGHASH_ANYONECANPAY","input","inputs","otherInputs","filter","_","index","sourceTXID","sourceTransaction","id","outputs","sourceOutputIndex","satoshis","preimage","format","transactionVersion","version","inputSequence","sequence","subscript","lockTime","scope","rawSignature","Hash","sha256","sig","r","s","unlockScript","UnlockingScript","toChecksigFormat","toPublicKey","Promise","resolve","e","reject","estimateLength","unlock","approverPrivateKey","userSigScript","_input$sourceTransact4","_input$sourceTransact5","_input$sourceTransact6","writeScript","toHex","utf8Str","Buffer","from","toString","applyInscription","inscription","metaData","withSeparator","ordAsm","dataB64","contentType","ordHex","fileHex","trim","fileMediaType","inscriptionAsm","toASM","app","type","mapCmdValue","_i","_Object$entries","Object","entries","length","_Object$entries$_i","key","value","fromASM","MIN_TRANSFER_AMOUNT","PROD_TOKEN_ID","PROD_MINT_ADDRESS","SANDBOX_TOKEN_ID","SANDBOX_MINT_ADDRESS","parseInscription","script","_value$data","_value$data2","fromPos","i","chunks","_chunk$data","chunk","toUTF8","op","OP_IF","OP_FALSE","insc","file","size","fields","_field$data","_field$data2","field","OP_ENDIF","OP_16","OP_PUSHDATA4","fieldNo","toBase64","content","parseCosignerScripts","scripts","map","_chunks$data","_chunks$data2","_chunks$data3","cosigner","address","toBase58Check","result","parseSyncToTxHistory","sync","config","txType","senders","includes","txStatus","height","rawtx","txArray","toArray","txHex","outScripts","Transaction","fromHex","output","mneeScripts","parsedOutScripts","mneeAddresses","feeAddressIndex","indexOf","feeAddress","sender","fee","counterpartyAmounts","Map","forEach","parsedScript","_parsedScript$file","inscriptionData","inscriptionJson","JSON","parse","err","console","p","tokenId","inscriptionAmt","parseInt","amt","Number","isNaN","outAddr","prevAmt","get","set","amountSentToAddress","senderAmt","counterparties","totalCounterpartyAmount","amount","Array","_ref","cp","reduce","sum","txid","status","score","validateAddress","decoded","prefixByte","validateWIF","wif","isValid","privateKey","PrivateKey","fromWif","wifError","errorMsg","toLowerCase","NetworkError","_Error","info","_this","call","this","code","hostname","originalError","name","_wrapNativeSuper","isNetworkError","_error$cause","_error$message","_error$message2","networkErrorCodes","cause","logNetworkError","operation","networkError","parseNetworkError","_iteratorSymbol","Symbol","iterator","pact","state","_Pact","bind","then","_settle","v","o","onFulfilled","onRejected","callback","thenable","Batch","service","getUtxos","addresses","options","isArray","individualErrors","processBatch","_step","validAddresses","invalidAddresses","_iterator","_createForOfIteratorHelperLoose","done","test","push","items","retryCount","continueOnError","utxos","utxo","owners","batchResult","_extends","errors","concat","totalErrors","getBalances","_this2","getTxHistories","params","_this3","getRecentTxHistories","param","parseTx","txids","_this4","parseOptions","batchOptions","_objectWithoutPropertiesLoose","_excluded","allSettled","_this4$service$parseT","parsed","results","successfulResults","errorMessage","reason","String","maxRetries","processor","getItemId","_this5","_options$chunkSize","chunkSize","_options$continueOnEr","onProgress","_options$maxRetries","_options$retryDelay","retryDelay","_options$requestsPerS","requestsPerSecond","validChunkSize","validRequestsPerSecond","minDelay","Math","ceil","maxConcurrent","max","floor","rateLimiter","RateLimiter","totalProcessed","processed","chunkArray","totalChunks","chunkPromises","_catch","processWithRetry","chunkResults","apply","_temp3","partialResults","failedItems","itemIds","item","firstError","_temp2","target","body","step","next","_isSettledPact","_cycle","_fixup","TypeError","values","array","_forOf","_temp","singleResult","itemError","all","func","_exit","lastError","_temp6","_result2","_this6","attempt","_temp5","update","stage","shouldContinue","updateValue","_resumeAfterTest","_resumeAfterBody","_resumeAfterUpdate","_for","execute","_await$rateLimiter$ex","_temp4","delay","slice","ms","setTimeout","queue","running","_proto2","fn","_this7","waitForSlot","_finallyRethrows","start","Date","now","elapsed","_temp7","_wasThrown","_result3","processQueue","_this8","shift","recover","observer","check","_forTo","MNEEService","mneeApiKey","mneeConfig","mneeApi","environment","isProd","apiKey","getCosignerConfig","fetch","method","response","ok","json","toAtomicAmount","round","pow","fromAtomicAmount","createInscription","recipient","PublicKey","fromString","approver","stringify","page","order","_result","_exit2","addr","warn","headers","ops","_data$filter2","bsv21","isFinite","isInteger","_data$filter","fetchRawTx","retries","_exit3","resp","_Transaction$fromHex","min","_result4","getSignatures","request","fromHexBEEF","fromHexEF","sigResponses","sigRequests","flatMap","sigReq","privKey","prevTxid","outputIndex","Script","P2PKH","toAddress","sigHashType","pubKey","csIdx","_err$message","getEnoughUtxos","totalAtomicTokenAmount","_temp0","fees","find","f","feeAmount","requiredAmount","getBalance","balance","_interrupt","_temp9","_result5","allUtxos","sort","a","b","selectedUtxos","selectedAmount","totalUtxoAmount","_temp8","pageUtxos","_this4$mneeConfig","getAllUtxos","_interrupt2","_temp1","transfer","transferOptions","_temp20","_validateTransferOpti","_validateWIF","_step4","totalAmount","_iterator4","req","validateTransferOptions","_config$fees$find","_temp19","_result7","_temp17","_temp15","_temp13","extraData","buffers","buf","hex","totalBytes","OP_0","OP_RETURN","_buffers","addOutput","fromBinary","toBinary","privateKeys","signAllInputs","signResult","broadcast","submitRawTx","_ref2","ticketId","change","tokensIn","_temp12","_addOutput3","changeAddress","_this6$createInscript3","_temp14","_addOutput4","_this6$createInscript2","_temp16","_addOutput","_this6$createInscript","burnAddress","_temp18","_temp11","_result6","vout","addInput","unlockingScript","_temp10","_this6$mneeConfig","callbackUrl","_transferOptions","_transferOptions2","_transferOptions3","_transferOptions4","base64Tx","requestBody","callback_url","text","getTxStatus","_this9","_temp21","balanceData","decimalAmount","precised","_this9$mneeConfig","_this0","totalInvalidAddresses","_temp22","balanceMap","has","_this0$mneeConfig","processMneeValidation","_this1","isDeployTx","split","parsedScripts","outputDetails","idx","_inscription$file","hasCosigner","some","mneeInscriptions","operations","Set","hasBurn","hasRedeem","_o$inscription$metada","metadata","action","isRedeemFromMint","mneeOutputsForValidation","_step2","remainingOutputs","_loop","findIndex","splice","_iterator2","validateMneeTx","rawTx","_this10","_temp24","_exit6","_temp23","processTransactionInputs","inputData","outputData","processTransactionOutputs","total","_result8","_this10$mneeConfig","getMneeSyncs","fromScore","limit","_this11","addressArray","filteredSyncs","receivers","syncs","getRecentTxHistory","_this12","_temp25","syncsByAddress","history","nextScore","_step3","txHistory","_iterator3","historyItem","_this12$mneeConfig","_this13","validParams","_temp26","groupedParams","groupPromises","_ref3","addressParams","_key$split","limitStr","orderStr","_ref4","_step5","seenTxids","_iterator5","add","paramLimit","flat","_this13$mneeConfig","parseInscriptionData","_inscription$file2","determineEnvironment","determineTransactionType","mintAddress","_this14","BigInt","fetchTasks","sourceTx","_iterator6","_step6","_step6$value","sourceOutput","parsedCosigner","processedInput","processedOutput","outputType","validateTransaction","inputTotal","outputTotal","buildParseResponse","baseResponse","includeRaw","raw","_input$unlockingScrip","scriptSig","tokenData","scriptPubKey","parseTransaction","_this15","_output$inscription","_temp27","_this16","_this16$mneeConfig","parseTxFromRawTx","rawTxHex","_temp28","_this17","isValidHex","_this17$mneeConfig","validateUniqueInputs","_step7","inputSet","_iterator7","inputKey","addInputsToTransaction","_exit7","_temp30","_result9","_this18","_temp29","_tokensIn$error","tokenAmount","calculateTransferMultiFee","inputAddresses","recipients","_this19","_ret","previousFee","_loop2","_config$fees$find2","totalChange","changeToNonInputAddresses","_step8","_iterator8","changeOutput","atomicAmount","totalTransferAmount","newFee","addChangeOutputs","_exit8","_temp33","_result0","_this20","_temp32","_addOutput5","_this20$createInscrip","defaultChangeAddress","_addOutput7","_this20$createInscrip3","atomicChangeOutputs","c","changeSum","changeDecimal","changeSumDecimal","_error2","_iterator9","_step9","_temp31","_addOutput6","_this20$createInscrip2","_exit9","_temp35","_result10","_step0","_iterator0","allSigResponses","sigResponse","_this21","_temp34","_ref5","res","_error4","validateTokenConservation","totalOut","abs","transferMulti","_this22","_temp40","_validateTransferMult","wifValidation","validateTransferMultiOptions","validationResult","inputResult","_temp39","_temp37","changeResult","_i5","_buffers2","conservationResult","_ref6","_temp36","_addOutput9","_this22$createInscrip2","feeResult","haveDecimal","needDecimal","_temp38","_addOutput8","_this22$createInscrip","_this22$mneeConfig","HDWallet","mnemonic","masterKey","derivationPath","cacheSize","cache","bip39","validateMnemonic","seed","Mnemonic","toSeed","HD","fromSeed","generateMnemonic","isValidMnemonic","deriveAddress","isChange","fullPath","changeIndex","derive","addressInfo","toWif","path","deriveAddresses","startIndex","count","getPrivateKeysForAddresses","maxScanReceive","maxScanChange","scanStrategy","paths","addressSet","maxScan","receiveInfo","changeInfo","notFound","join","getPrivateKeys","scanAddressesWithGapLimit","checkAddressUsed","scanChange","consecutiveUnused","gapLimit","isUsed","receive","clearCache","clear","getCacheSize","Mnee","_batch","balances","recentTxHistory","recentTxHistories","batch"],"mappings":"m6EAKM,SAAUA,EAAeC,GAC7B,IAAMC,EAAQ,IAAIC,MAAMF,GAExB,OADAC,EAAME,WAAQC,EACPH,CACT,CCIwD,IAOnCI,eAAcA,WAAAA,SAAAA,IAAAC,CAAAA,IAAAA,EAAAD,EAAAE,UAiPhC,OAjPgCD,EAQjCE,KAAA,SACEC,EACAC,GAEA,IAAIC,EAAmB,GACvB,GAA0B,iBAAfF,EAAyB,CAClC,IAAMG,EAAOC,EAAKA,MAACC,gBAAgBL,GACnC,GAAuB,IAAnBG,EAAKG,OAAO,IAAkC,MAAnBH,EAAKG,OAAO,GACzC,MAAMhB,EAAe,2BACvBY,EAASC,EAAKI,IAChB,MACEL,EAASF,EAEX,IAAMQ,EAAgB,IAAIC,EAAAA,cAU1B,OATAD,EACGE,YAAYC,EAAAA,GAAGC,QACfF,YAAYC,EAAEA,GAACE,YACfC,SAASZ,GACTQ,YAAYC,EAAEA,GAACI,gBACfL,YAAYC,EAAAA,GAAGK,mBACfF,SAASb,EAAegB,QAAO,IAC/BP,YAAYC,EAAAA,GAAGO,aAEXV,CACT,EAACX,EAiBDsB,WAAA,SACEC,EACAC,EACAC,EACAC,EACAf,GAKA,YARAa,IAAAA,IAAAA,EAAyC,YACzCC,IAAAA,IAAAA,GAAe,GAOR,CACLE,KAAIA,SAASC,EAAiBC,GAAkB,IAAIC,IAAAA,EAAAC,EAAAC,EAC9CC,EAAiBC,EAAAA,qBAAqBC,eACtB,QAAhBX,IACFS,GAAkBC,EAAAA,qBAAqBE,aAErB,SAAhBZ,IACFS,GAAkBC,EAAAA,qBAAqBG,cAErB,WAAhBb,IACFS,GAAkBC,EAAAA,qBAAqBI,gBAErCb,IACFQ,GAAkBC,EAAoBA,qBAACK,sBAGzC,IAAMC,EAAQZ,EAAGa,OAAOZ,GAElBa,EAAcd,EAAGa,OAAOE,OAC5B,SAACC,EAAGC,GAAU,OAAAA,IAAUhB,CAAU,GAG9BiB,EAAaN,EAAMM,WACrBN,EAAMM,WACiB,OADPhB,EAChBU,EAAMO,wBAAiB,EAAvBjB,EAAyBkB,GAAG,OAChC,IAAKF,EACH,MAAMrD,EACJ,kFAKJ,GAFAiC,IAAAA,EACyB,OADXK,EACZS,EAAMO,wBAAiB,EAAvBhB,EAAyBkB,QAAQT,EAAMU,mBAAmBC,WACvDzB,EACH,MAAMjC,EACJ,sFAMJ,GAHAkB,IAAAA,EACEqB,OADWA,EACXQ,EAAMO,wBAANf,EAAAA,EAAyBiB,QAAQT,EAAMU,mBACpCvC,gBACAA,EACH,MAAMlB,EACJ,qFAIJ,IAAM2D,EAAWlB,EAAoBA,qBAACmB,OAAO,CAC3CP,WAAAA,EACAI,kBAAmBV,EAAMU,kBACzBxB,eAAAA,EACA4B,mBAAoB1B,EAAG2B,QACvBb,YAAAA,EACAb,WAAAA,EACAoB,QAASrB,EAAGqB,QACZO,cAAehB,EAAMiB,UAAY,WACjCC,UAAW/C,EACXgD,SAAU/B,EAAG+B,SACbC,MAAO3B,IAEH4B,EAAetC,EAAeI,KAAKmC,EAAAA,KAAKC,OAAOX,IAC/CY,EAAM,IAAI9B,EAAAA,qBACd2B,EAAaI,EACbJ,EAAaK,EACbjC,GAEIkC,EAAe,IAAIC,EAAAA,gBAKzB,OAJAD,EAAalD,SAAS+C,EAAIK,oBAC1BF,EAAalD,SACXM,EAAe+C,cAAclD,QAAO,IAEtCmD,QAAAC,QAAOL,EACT,CAAC,MAAAM,GAAAF,OAAAA,QAAAG,OAAAD,EACDE,CAAAA,EAAAA,eAAcA,WAGZ,OAAAJ,QAAAC,QAAO,IACT,EAEJ,EAACxE,EAiBD4E,OAAA,SACEC,EACAC,EACAtD,EACAC,EACAC,EACAf,GAKA,YARAa,IAAAA,IAAAA,EAAyC,YACzCC,IAAAA,IAAAA,GAAe,GAOR,CACLE,cAAaC,EAAiBC,GAAsB,IAAA,IAAAkD,EAAAC,EAAAC,EAC9ChD,EAAiBC,EAAAA,qBAAqBC,eACtB,QAAhBX,IACFS,GAAkBC,EAAAA,qBAAqBE,aAErB,SAAhBZ,IACFS,GAAkBC,EAAAA,qBAAqBG,cAErB,WAAhBb,IACFS,GAAkBC,EAAAA,qBAAqBI,gBAErCb,IACFQ,GAAkBC,EAAAA,qBAAqBK,sBAGzC,IAAMC,EAAQZ,EAAGa,OAAOZ,GAElBa,EAAcd,EAAGa,OAAOE,OAC5B,SAACC,EAAGC,UAAUA,IAAUhB,CAAU,GAG9BiB,EAAaN,EAAMM,WACrBN,EAAMM,WACiB,OADPiC,EAChBvC,EAAMO,wBAAiB,EAAvBgC,EAAyB/B,GAAG,OAChC,IAAKF,EACH,MAAMrD,EACJ,kFAKJ,GAFAiC,IAAAA,EACEsD,OADYA,EACZxC,EAAMO,wBAANiC,EAAAA,EAAyB/B,QAAQT,EAAMU,mBAAmBC,WACvDzB,EACH,MAAMjC,EACJ,sFAMJ,GAHAkB,IAAAA,EACEsE,OADWA,EACXzC,EAAMO,wBAANkC,EAAAA,EAAyBhC,QAAQT,EAAMU,mBACpCvC,gBACAA,EACH,MAAMlB,EACJ,qFAIJ,IAAM2D,EAAWlB,EAAoBA,qBAACmB,OAAO,CAC3CP,WAAAA,EACAI,kBAAmBV,EAAMU,kBACzBxB,eAAAA,EACA4B,mBAAoB1B,EAAG2B,QACvBb,YAAAA,EACAb,WAAAA,EACAoB,QAASrB,EAAGqB,QACZO,cAAehB,EAAMiB,UAAY,WACjCC,UAAW/C,EACXgD,SAAU/B,EAAG+B,SACbC,MAAO3B,IAEH4B,EAAegB,EAAmBlD,KAAKmC,EAAAA,KAAKC,OAAOX,IACnDY,EAAM,IAAI9B,EAAAA,qBACd2B,EAAaI,EACbJ,EAAaK,EACbjC,GAEIkC,EAAe,IAAIC,EAAAA,gBAGzB,OAFAD,EAAalD,SAAS+C,EAAIK,oBAC1BF,EAAae,YAAYJ,GACzBP,QAAAC,QAAOL,EACT,CAAC,MAAAM,GAAA,OAAAF,QAAAG,OAAAD,EAAA,CAAA,EACDE,eAAc,WAGZ,OAAAJ,QAAAC,QAAO,IACT,EAEJ,EAACzE,CAAA,CAjPgCA,GCO7BoF,EAAQ,SAACC,GACb,OAAOC,OAAOC,KAAKF,GAASG,SAAS,MACvC,EAIaC,EAAmB,SAC9B7E,EACA8E,EACAC,EACAC,QAAa,IAAbA,IAAAA,GAAgB,GAEhB,IAAIC,EAAS,GAEb,QAA6B9F,WAAzB2F,SAAAA,EAAaI,eAAsD/F,KAA7B2F,MAAAA,OAAAA,EAAAA,EAAaK,aAA2B,CAChF,IAAMC,EAASZ,EAAM,OAEfa,EADWX,OAAOC,KAAKG,EAAYI,QAAS,UACzBN,SAAS,OAAOU,OACzC,IAAKD,EACH,MAAMvG,EAAe,qBAEvB,IAAMyG,EAAgBf,EAAMM,EAAYK,aACxC,IAAKI,EACH,MAAMzG,EAAe,sBAEvBmG,EAAuBG,cAAAA,EAAeG,SAAAA,WAAsBF,EAAO,WACrE,CAEA,IAAIG,GACFP,EAAYA,EAAUD,KAAAA,EAAgB,oBAAsB,IAAO,IAClEhF,EAAcyF,QAGjB,GAAIV,KAAcA,EAASW,MAAQX,EAASY,MAC1C,MAAM7G,EAAe,4CAGvB,GAAIiG,MAAAA,GAAAA,EAAUW,KAAe,MAARX,GAAAA,EAAUY,KAAM,CAGnCH,GAAoBA,EAAoBA,EAAc,IAAM,IAAE,aAFzChB,EAlCC,sCAoCqEoB,IADvEpB,EAAM,OAG1B,IAAAqB,IAAAA,IAAAC,EAA2BC,OAAOC,QAAQjB,GAASc,EAAAC,EAAAG,OAAAJ,IAAE,CAAhD,IAAAK,EAAAJ,EAAAD,GAAOM,EAAGD,EAAEE,GAAAA,EAAKF,EAAA,GACR,QAARC,IACFX,EAAoBA,EAAkBhB,IAAAA,EAAM2B,GAAQ3B,IAAAA,EAAM4B,GAE9D,CACF,CAEA,OAAOnG,EAAaA,cAACoG,QAAQb,EAC/B,EC7Eac,EAAsB,KAMtBC,EAAgB,qEAEhBC,EAAoB,oCAKpBC,EAAmB,qEAEnBC,EAAuB,qCCCvBC,EAAmB,SAACC,GAE/B,IAFiD,IAAAC,EAAAC,EAC7CC,EACKC,EAAI,EAAGA,EAAIJ,EAAOK,OAAOhB,OAAQe,IAAK,CAAAE,IAAAA,EACvCC,EAAQP,EAAOK,OAAOD,GAE1BA,GAAK,GACkB,KAAb,OAAVE,EAAAC,EAAMpH,WAAI,EAAVmH,EAAYjB,SACgB,OAA5BrG,EAAAA,MAAMwH,OAAOD,EAAMpH,OACnB6G,EAAOK,OAAOD,EAAI,GAAGK,IAAMlH,EAAAA,GAAGmH,OAC9BV,EAAOK,OAAOD,EAAI,GAAGK,IAAMlH,EAAAA,GAAGoH,WAE9BR,EAAUC,EAAI,EAElB,CACA,QAAgB7H,IAAZ4H,EAAJ,CAOA,IALA,IAAMS,EAAO,CACXC,KAAM,CAAE9H,KAAM,GAAI+H,KAAM,EAAG/B,KAAM,IACjCgC,OAAQ,CAAA,GAGDX,EAAID,EAASC,EAAIJ,EAAOK,OAAOhB,OAAQe,GAAK,EAAG,CAAAY,IAAAA,EAAAC,EAChDC,EAAQlB,EAAOK,OAAOD,GAC5B,GAAIc,EAAMT,IAAMlH,EAAAA,GAAG4H,SACjB,MAEF,GAAID,EAAMT,GAAKlH,EAAEA,GAAC6H,MAAO,OACzB,IAAM5B,EAAQQ,EAAOK,OAAOD,EAAI,GAChC,GAAIZ,EAAMiB,GAAKlH,EAAEA,GAAC8H,aAAc,OAEhC,GAAc,OAAdL,EAAIE,EAAM/H,QAAN6H,EAAY3B,OAAhB,CAEA,IAAIiC,EAAU,EAMd,OALIJ,EAAMT,GAAKlH,EAAAA,GAAG8H,cAAgBH,EAAMT,IAAMlH,EAAEA,GAAC6H,MAC/CE,EAAUJ,EAAMT,GAAK,GACF,OAAdQ,EAAIC,EAAM/H,OAAN8H,EAAY5B,SACrBiC,EAAUJ,EAAM/H,KAAK,IAEfmI,GACN,KAAK,EAEH,GADAV,EAAKC,KAAMC,MAAiB,OAAVb,EAAAT,EAAMrG,WAAI,EAAV8G,EAAYZ,SAAU,EACnCa,OAADA,EAACV,EAAMrG,QAAN+G,EAAYb,OAAQ,MACzBuB,EAAKC,KAAM9H,KAAOC,EAAKA,MAACuI,SAAShF,EAAIA,KAACC,OAAOgD,EAAMrG,OACnDyH,EAAKC,KAAMW,QAAUhC,EAAMrG,KAC3B,MACF,KAAK,EACHyH,EAAKC,KAAM9B,KAAOjB,OAAOC,KAAKyB,EAAMrG,MAAQ,IAAI6E,WAhB5B,CAmB1B,CAEA,OAAO4C,CAnCP,CAoCF,EAEaa,EAAuB,SAACC,GACnC,OAAOA,EACJC,IAAI,SAAC3B,GAEJ,IADA,IAAMK,EAASL,EAAOK,OACbD,EAAI,EAAGA,GAAKC,EAAOhB,OAAS,EAAGe,IAAK,CAAA,IAAAwB,EAAAC,EAAAC,EAC3C,GACEzB,EAAOhB,OAASe,EAAI,GACpBC,EAAO,EAAID,GAAGK,KAAOlH,EAAAA,GAAGC,QACxB6G,EAAO,EAAID,GAAGK,KAAOlH,EAAEA,GAACE,YACO,MAAb,OAAlBmI,EAAAvB,EAAO,EAAID,GAAGjH,WAAI,EAAlByI,EAAoBvC,SACpBgB,EAAO,EAAID,GAAGK,KAAOlH,EAAEA,GAACI,gBACxB0G,EAAO,EAAID,GAAGK,KAAOlH,EAAEA,GAACK,mBACO,MAA/BiI,OAAAA,EAAAxB,EAAO,EAAID,GAAGjH,WAAd0I,EAAAA,EAAoBxC,SACpBgB,EAAO,EAAID,GAAGK,KAAOlH,KAAGO,YAExB,MAAO,CACLiI,SAAU/I,QAAM4E,MAAMyC,EAAO,EAAID,GAAGjH,MAAQ,IAC5C6I,QAAShJ,EAAKA,MAACiJ,cAAc5B,EAAO,EAAID,GAAGjH,MAAQ,GAAI,CAAC,KAI1DkH,GAAAA,EAAO,EAAID,GAAGK,KAAOlH,EAAAA,GAAGC,QACxB6G,EAAO,EAAID,GAAGK,KAAOlH,EAAAA,GAAGE,YACO,MAAb,OAAlBqI,EAAAzB,EAAO,EAAID,GAAGjH,WAAI,EAAlB2I,EAAoBzC,SACpBgB,EAAO,EAAID,GAAGK,KAAOlH,EAAEA,GAACI,gBACxB0G,EAAO,EAAID,GAAGK,KAAOlH,EAAEA,GAACO,YAExB,MAAO,CACLiI,SAAU,GACVC,QAAShJ,EAAKA,MAACiJ,cAAc5B,EAAO,EAAID,GAAGjH,MAAQ,GAAI,CAAC,IAG9D,CAGF,GACCiC,OAAO,SAAC8G,GAAM,YAA0C3J,IAAX2J,CAAoB,EACtE,EAEaC,EAAuB,SAACC,EAAgBJ,EAAiBK,GACpE,IAAMC,EAAiBF,EAAKG,QAAQC,SAASR,GAAW,OAAS,UAC3DS,EAAqBL,EAAKM,OAAS,EAAI,YAAc,cAE3D,IAAKN,EAAKO,MAAO,OAAO,KAExB,IAAMC,EAAU5J,QAAM6J,QAAQT,EAAKO,MAAO,UACpCG,EAAQ9J,EAAKA,MAAC4E,MAAMgF,GAGpBG,EAFKC,EAAAA,YAAYC,QAAQH,GAETpH,QAAQiG,IAAI,SAACuB,GAAW,OAAAA,EAAO9J,aAAa,GAC5D+J,EAAc1B,EAAqBsB,GACnCK,EAAmBL,EAAWpB,IAAI5B,GAClCsD,EAAgBF,EAAYxB,IAAI,SAAC3B,GAAW,OAAAA,EAAOgC,OAAO,GAE1DsB,EAAkBD,EAAcE,QAAQlB,EAAOmB,YAC/CC,EAASrB,EAAKG,QAAQ,GAExBmB,EAAM,EACJC,EAAsB,IAAIC,IAEhCR,EAAiBS,QAAQ,SAACC,EAAcxI,GAASyI,IAAAA,EACzCvC,EAAsB,MAAZsC,GAAkB,OAANC,EAAZD,EAAcjD,WAAI,EAAlBkD,EAAoBvC,QACpC,GAAKA,EAAL,CAEA,IAAMwC,EAAkBhL,EAAKA,MAACwH,OAAOgB,GACrC,GAAKwC,EAAL,CAEA,IAAIC,EACJ,IACEA,EAAkBC,KAAKC,MAAMH,EAC/B,CAAE,MAAOI,GAEP,YADAC,QAAQjM,MAAM,oCAAqCgM,EAErD,CAEA,GAA0B,WAAtBH,EAAgBK,GAAkBL,EAAgBxI,KAAO4G,EAAOkC,QAApE,CAEA,IAAMC,EAAiBC,SAASR,EAAgBS,IAAK,IACrD,IAAIC,OAAOC,MAAMJ,GAEjB,GAAIlB,IAAoBhI,GAASmI,IAAWzB,EAA5C,CAKA,IAAM6C,EAAUxB,EAAc/H,GACxBwJ,EAAUnB,EAAoBoB,IAAIF,IAAY,EACpDlB,EAAoBqB,IAAIH,EAASC,EAAUN,EAJ3C,MAFEd,GAAOc,CANoE,CAR7E,CAHA,CAwBF,GAEA,IAAMS,EAAsBtB,EAAoBoB,IAAI/C,IAAY,EAEhE,GAAe,SAAXM,EAAmB,CACrB,IAAM4C,EAAYvB,EAAoBoB,IAAItB,IAAW,EACrDE,EAAoBqB,IAAIvB,EAAQyB,EAAYD,EAC9C,CAEA,IAAIE,EAAwD,GAStDC,GAPJD,EADa,YAAX7C,EACe,CAAC,CAAEN,QAASyB,EAAQ4B,OAAQJ,IAE5BK,MAAMvH,KAAK4F,EAAoBvE,WAC7CuC,IAAI,SAAA4D,GAAW,MAAO,CAAEvD,QAAduD,EAAA,GAA6BF,OAAxBE,EAAA,GAAqC,GACpDnK,OAAO,SAACoK,GAAO,OAAAA,EAAGxD,UAAYA,GAAWwD,EAAGxD,UAAYK,EAAOmB,YAAcgC,EAAGH,OAAS,CAAC,IAGhDI,OAAO,SAACC,EAAKF,GAAO,OAAAE,EAAMF,EAAGH,MAAM,EAAE,GAEpF,MAAO,CACLM,KAAMvD,EAAKuD,KACXjD,OAAQN,EAAKM,OACb3D,KAAMuD,EACNsD,OAAQnD,EACR4C,OAAQD,EACR1B,IAAAA,EACAmC,MAAOzD,EAAKyD,MACZV,eAAAA,EAEJ,EAEaW,EAAkB,SAAC9D,GAC9B,IACE,IAAM+D,EAAU/M,EAAAA,MAAMC,gBAAgB+I,GAGhCgE,EAAaD,EAAQ7M,OAAO,GAClC,GAA0B,iBAAf8M,IAFW,CAAC,GAE8BxD,SAASwD,GAC5D,MAAM9N,EAAc,2BAA4B8N,GAGlD,GAA4B,KAAxBD,EAAQ5M,KAAKkG,OACf,MAAMnH,EAAkD6N,mCAAAA,EAAQ5M,KAAKkG,QAEvE,OACF,CAAA,CAAE,MAAOjH,GACP,OAAO,CACT,CACF,EAEa6N,EAAc,SAACC,GAC1B,IAEE,MAAO,CAAEC,SAAS,EAAMC,WADLC,EAAAA,WAAWC,QAAQJ,GAExC,CAAE,MAAOK,GACP,GAAIA,aAAoBlO,MAAO,CAC7B,IAAMmO,EAAWD,EAASpO,QAAQsO,cAClC,GAAID,EAAShE,SAAS,4BACpB,MAAO,CAAE2D,SAAS,EAAO/N,MAAO,gDACvBoO,GAAAA,EAAShE,SAAS,oBAC3B,MAAO,CAAE2D,SAAS,EAAO/N,MAAO,iDACvBoO,GAAAA,EAAShE,SAAS,0BAC3B,MAAO,CAAE2D,SAAS,EAAO/N,MAAO,yDAEpC,CACA,MAAO,CAAE+N,SAAS,EAAO/N,MAAO,2BAClC,CACF,EC3NasO,eAAa,SAAAC,GAKxB,SAAAD,EAAYE,GAAsB,IAAAC,EAKQ,OAJxCA,EAAAF,EAAAG,KAAMF,KAAAA,EAAKzO,UAAQ4O,MALdC,UAAI,EAAAH,EACJI,cAAQJ,EAAAA,EACRK,mBAILL,EAAAA,EAAKM,KAAO,eACZN,EAAKG,KAAOJ,EAAKI,KACjBH,EAAKI,SAAWL,EAAKK,SACrBJ,EAAKK,cAAgBN,EAAKM,cAAcL,CAC1C,SAAC,SAAAF,KAAAD,yEAAAA,CAAA,CAXuB,cAWvBU,EAX+B/O,QAc5B,SAAUgP,EAAejP,GAAUkP,IAAAA,EAAAC,EAAAC,EACvC,IAAKpP,EAAO,OAAY,EAGxB,IAAMqP,EAAoB,CACxB,YACA,eACA,YACA,aACA,cACA,eACA,QACA,gBAIF,QAAIA,EAAkBjF,SAASpK,EAAM4O,UAKjC5O,EAAMsP,QAASD,EAAkBjF,SAAoB,OAAZ8E,EAAClP,EAAMsP,YAAK,EAAXJ,EAAaN,WAK1C,OAAbO,EAAAnP,EAAMD,UAANoP,EAAe/E,SAAS,iBAAgC,OAAjBgF,EAAIpP,EAAMD,UAANqP,EAAehF,SAAS,eAKzE,CAuEgB,SAAAmF,EAAgBvP,EAAYwP,GAC1C,GAAIP,EAAejP,GAAQ,CACzB,IAAMyP,EAvEJ,SAA4BzP,GAEhC,GAAIA,EAAMsP,OAAStP,EAAMsP,MAAMV,KAAM,CACnC,IAAMU,EAAQtP,EAAMsP,MAChBvP,EAAU,4BAEd,OAAQuP,EAAMV,MACZ,IAAK,YACH7O,EAAU,4EACV,MACF,IAAK,eACHA,EAAU,iFACV,MACF,IAAK,YACHA,EAAU,0EACV,MACF,IAAK,aACHA,EAAU,0CACV,MACF,IAAK,cACL,IAAK,eACHA,EAAU,8DACV,MACF,QACEA,EAAO,kBAAqBuP,EAAMV,KAAI,gDAG1C,OAAW,IAAAN,EAAa,CACtBM,KAAMU,EAAMV,KACZ7O,QAAAA,EACA8O,SAAUS,EAAMT,SAChBC,cAAe9O,GAEnB,CAGA,GAAIA,EAAM4O,KAAM,CACd,IAAI7O,EAAU,yBAEd,OAAQC,EAAM4O,MACZ,IAAK,YACH7O,EAAU,4EACV,MACF,IAAK,eACHA,EAAU,iFACV,MACF,IAAK,YACHA,EAAU,0EACV,MACF,QACEA,EAA4BC,kBAAAA,EAAM4O,KAAI,gDAG1C,OAAW,IAAAN,EAAa,CACtBM,KAAM5O,EAAM4O,KACZ7O,QAAAA,EACA8O,SAAU7O,EAAM6O,SAChBC,cAAe9O,GAEnB,CAGA,OAAW,IAAAsO,EAAa,CACtBM,KAAM,gBACN7O,QAAS,+EACT+O,cAAe9O,GAEnB,CAIyB0P,CAAkB1P,GAEvC,OADAiM,QAAQjM,8BAA8BwP,EAAS,KAAKC,EAAa1P,SAC1D0P,EAAa1P,OACtB,CACEkM,QAAQjM,MAAK,aAAcwP,EAAS,IAAKxP,EAG7C,+GCwHM,MAAA2P,EAAyB,oBAAAC,OAAAA,OAAAC,WAAAD,OAAAC,SAAAD,OAAA,oBAAA,wBA/JLE,EAAAC,EAAC3I,YAEf,GAAAA,aAAA4I,EAAO,CACP,IAAA5I,EAAA7C,EAMA,kBADE0L,KAAA,KAASH,EAACC,IAJb,EAAAA,QACFxL,SAMG,GAAA6C,GAAAA,EAAA8I,+BACgB,KAAAJ,EAAAC,GAAMI,EAAAF,KAAA,KAAAH,EAAA,IAGpBA,EAAAvL,EAAAwL,EACDD,EAAAM,EAAAhJ,UACFiJ,OAELP,GAIE,4CAjHLE,QAAAA,EAAA1P,UAAA4P,KAAA,SAAAI,EAAAC,GAYH,IAASzG,EAAA,IAAAkG,EA2CTD,EAAApB,KAAApK,gCAKG4L,EAAArG,EAAA,EAAA0G,EAAA7B,KAAAyB,GACH,CAAM,MAAOtL,GACSqL,EAAArG,EAAA,EAAAhF,EAApB,QAA2BgF,EAE3B,0EAQGyG,EACHJ,EAAcrG,EAAoB,EAAAyG,QAE3BzG,EAAM,EAAA1C,SAEVtC,KAEuCgF,EAAA,EAAAhF,GAGxC,MAKE,eA6B+B2L,GAC/B,OAAAA,aAAIT,GAA8B,EAATS,EAASlM,CAChC,CAzDK,IAAAmM,eACX,WAAA,SAAAA,EAAoBC,GAAoBhC,KAApBgC,aAAA,EAAAhC,KAAOgC,QAAPA,CAAuB,CAAC,IAAAtQ,EAAAqQ,EAAApQ,UA6W3C,OA7W2CD,EAWtCuQ,SAAA,SAASC,EAAqBC,QAAAA,IAAAA,IAAAA,EAAwB,CAAA,GAAE,IAAA,IAAArC,EAgDtCE,KA9CtB,IAAKzB,MAAM6D,QAAQF,GACjB,MAAM/Q,EAAe,uCAIvB,IAAMkR,EAAiC,GAkDrC,OAAApM,QAAAC,QAEwB4J,EAAKwC,aAC7BJ,WAnD+B1I,GAAmB,IAKlD,IAHA,IAG2B+I,EAHrBC,EAA2B,GAC3BC,EAA6B,GAEnCC,EAAAC,EAAsBnJ,KAAK+I,EAAAG,KAAAE,MAAE,CAAlB,IAAA3H,EAAOsH,EAAA9J,MACXwC,GAA8B,iBAAZA,GAA2C,KAAnBA,EAAQtD,OASrC,yDAAyDkL,KAAK5H,GAE5EuH,EAAeM,KAAK7H,IAEpBwH,EAAiBK,KAAK7H,GACtBoH,EAAiBS,KAAK,CACpBC,MAAO,CAAC9H,GACR5J,MAAO,CAAED,QAAoC6J,2BAAAA,GAC7C+H,WAAY,MAhBhBP,EAAiBK,KAAK7H,GACtBoH,EAAiBS,KAAK,CACpBC,MAAO,CAAC9H,GACR5J,MAAO,CAAED,QAAS,0CAClB4R,WAAY,IAgBlB,CAGA,IAAKb,EAAQc,iBAAmBR,EAAiBnK,OAAS,EACxD,MAAU,IAAAhH,MAAM+Q,EAAiB,GAAGhR,MAAMD,SAI5C,OAA8B,IAA1BoR,EAAelK,OACjBrC,QAAAC,QAAO,IACRD,QAAAC,QAEmB4J,EAAKkC,QAAQC,SAASO,IAAejB,KAAnD2B,SAAAA,GAGN,OAAO1J,EAAMoB,IAAI,SAACK,GAAO,MAAM,CAC7BA,QAAAA,EACAiI,MAAOV,EAAe/G,SAASR,GAC3BiI,EAAM7O,OAAO,SAAC8O,GAAS,OAAAA,EAAKC,OAAO3H,SAASR,EAAQ,GACpD,GACL,EAAG,EACN,CAAC,MAAA9E,GAAAF,OAAAA,QAAAG,OAAAD,EAAC,CAAA,EAKAgM,IACDZ,KAAA,SAJK8B,GAON,OAAAC,EACKD,CAAAA,EAAAA,EACHE,CAAAA,OAAMC,GAAAA,OAAMH,EAAYE,OAAWlB,GACnCoB,YAAaJ,EAAYE,OAAOjL,OAAS+J,EAAiB/J,QAC1D,EACJ,CAAC,MAAAnC,GAAAF,OAAAA,QAAAG,OAAAD,KAAAzE,EAQKgS,YAAW,SAACxB,EAAqBC,YAAAA,IAAAA,EAAwB,CAAE,GAAA,IAAAwB,IAAAA,EAMxD3D,KAJP,IAAKzB,MAAM6D,QAAQF,GACjB,MAAM/Q,EAAe,uCAGvB,OAAA8E,QAAAC,QAAOyN,EAAKrB,aAAaJ,EAAkB1I,SAAAA,GAAKvD,IAAAA,OAAAA,QAAAC,QAAKyN,EAAK3B,QAAQ0B,YAAYlK,GAAM,CAAA,MAAArD,GAAA,OAAAF,QAAAG,OAAAD,EAAEgM,CAAAA,EAAAA,GACxF,CAAC,MAAAhM,GAAA,OAAAF,QAAAG,OAAAD,EAAAzE,CAAAA,EAAAA,EAQKkS,eAAA,SACJC,EACA1B,YAAAA,IAAAA,EAAwB,CAAE,GAAA,IAAA,IAAA2B,EAOnB9D,KAJP,IAAKzB,MAAM6D,QAAQyB,GACjB,MAAM1S,EAAe,wDAGvB,OAAA8E,QAAAC,QAAO4N,EAAKxB,aACVuB,EAAM,SACCrK,GAAK,IAAA,OAAAvD,QAAAC,QAAK4N,EAAK9B,QAAQ+B,qBAAqBvK,GAAMrD,CAAAA,MAAAA,GAAAF,OAAAA,QAAAG,OAAAD,EAAA,CAAA,EACzDgM,EACA,SAAC6B,GAAK,OAAKA,EAAM/I,OAAO,GAE5B,CAAC,MAAA9E,GAAAF,OAAAA,QAAAG,OAAAD,EAAA,CAAA,EAAAzE,EASKuS,QAAA,SACJC,EACA/B,YAAAA,IAAAA,EAA0D,QAAEgC,IAAAA,EA2BtCnE,KAxBtB,IAAKzB,MAAM6D,QAAQ8B,GACjB,MAAM/S,EAAe,6CAGvB,IAAQiT,EAAkCjC,EAAlCiC,aAAiBC,6IAAYC,CAAKnC,EAALoC,GAG/BlC,EAAiC,GA+CrC,OAAApM,QAAAC,QAEwBiO,EAAK7B,aAC7B4B,EAhDI,SAA2B1K,GAAe,WAAIvD,QAAAC,QAC5BD,QAAQuO,WAC5BhL,EAAMoB,IAAWgE,SAAAA,OAEf,IAAKA,GAAwB,iBAATA,GAAqC,KAAhBA,EAAKjH,OAC5C,MAAU,IAAArG,MAAM,iDAIlB,IADiB,oBACHuR,KAAKjE,GACjB,MAAU,IAAAtN,MAAK,kCAAmCsN,GACnD,OAAA3I,QAAAC,QAIeiO,EAAKnC,QAAQiC,QAAQrF,EAAMwF,IAAa7C,KAAA,SAAAkD,GAFxD,MAAO,CACL7F,KAAAA,EACA8F,OAAMD,EACN,EACJ,CAAC,MAAAtO,GAAA,OAAAF,QAAAG,OAAAD,EAAA,CAAA,KACFoL,KAAA,SAjBKoD,GAmBN,IAAMC,EAA0C,GAoBhD,GAlBAD,EAAQ7H,QAAQ,SAAC3B,EAAQ5G,GACvB,IAAMqK,EAAOpF,EAAMjF,GACnB,GAAsB,cAAlB4G,EAAO0D,OACT+F,EAAkB9B,KAAK3H,EAAO1C,WACzB,CAEL,IAAMoM,EAAe1J,EAAO2J,kBAAkBxT,MAC1C6J,EAAO2J,OAAO1T,QACd2T,OAAO5J,EAAO2J,QAClBzC,EAAiBS,KAAK,CACpBC,MAAO,CAACnE,GACRvN,MAAO,CAAED,QAASyT,GAClB7B,WAAYqB,EAAaW,YAAc,GAE3C,CACF,IAGKX,EAAapB,iBAAmBZ,EAAiB/J,OAAS,EAC7D,UAAUhH,MAAM+Q,EAAiB,GAAGhR,MAAMD,SAG5C,OAAOwT,CAAkB,EAC3B,CAAC,MAAAzO,UAAAF,QAAAG,OAAAD,EAAA,CAAA,EAKCkO,IACD9C,KAJK8B,SAAAA,GAON,OAAAC,EAAA,CAAA,EACKD,EAAW,CACdE,OAAM,GAAAC,OAAMH,EAAYE,OAAWlB,GACnCoB,YAAaJ,EAAYE,OAAOjL,OAAS+J,EAAiB/J,QAC1D,EACJ,CAAC,MAAAnC,GAAA,OAAAF,QAAAG,OAAAD,EAAAzE,CAAAA,EAAAA,EAKa4Q,aAAA,SACZS,EACAkC,EACA9C,EACA+C,GAA+B,IAAAC,IAAAA,EA6BhBnF,KA3BfoF,EAOIjD,EANFkD,UAAAA,OAAY,IAAHD,EAAG,GAAEA,EAAAE,EAMZnD,EALFc,gBAAAA,OAAkB,IAAHqC,GAAQA,EACvBC,EAIEpD,EAJFoD,WAAUC,EAIRrD,EAHF6C,WAAAA,OAAU,IAAAQ,EAAG,EAACA,EAAAC,EAGZtD,EAFFuD,WAAAA,OAAa,IAAHD,EAAG,IAAIA,EAAAE,EAEfxD,EADFyD,kBAAAA,OAAoB,IAAHD,EAAG,EAACA,EAGjBE,EAAiBR,EAAY,EAAIA,EAAY,GAC7CS,EAAyBF,EAAoB,EAAIA,EAAoB,EAKrEG,EAAWC,KAAKC,KAAK,IAAOH,GAC5BI,EAAgBF,KAAKG,IAAI,EAAGH,KAAKI,MAAMN,IACvCO,EAAc,IAAIC,EAAYJ,EAAeH,GAEnD,GAAqB,IAAjBhD,EAAMzK,OACR,OAAArC,QAAAC,QAAO,CAAEyO,QAAS,GAAIpB,OAAQ,GAAIgD,eAAgB,EAAG9C,YAAa,IAGpE,IAAMkB,EAAe,GACfpB,EAAuB,GACzBiD,EAAY,EAEVlN,EAAS6L,EAAKsB,WAAW1D,EAAO8C,GAChCa,EAAcpN,EAAOhB,OAGrBqO,EAAgBrN,EAAOsB,IAAWpB,SAAAA,GAAS,IAAA,OAAAvD,QAAAC,QAAA0Q,EAAA,WAC3C3Q,OAAAA,QAAAC,QACyBiP,EAAK0B,iBAAiB,kBAAM5B,EAAUzL,EAAM,EAAEwL,EAAYU,EAAYW,IAAY9E,KAAA,SAAvGuF,GASN,OAPAnC,EAAQ7B,KAAIiE,MAAZpC,EAAgBmC,GAChBN,IAEIjB,GACFA,EAAWiB,EAAWE,EAAanD,EAAOjL,QAGrCwO,CAAa,EACtB,EAASzV,SAAAA,GAAO,SAAA2V,IAkCd,GAHArC,EAAQ7B,KAAIiE,MAAZpC,EAAgBsC,GAGZC,EAAY5O,OAAS,EAAG,CAC1B,IAAM6O,EAAUD,EAAYtM,IAAI,SAAA4D,GAAG,IAAA4I,EAAI5I,EAAJ4I,KAAY,OAAAlC,EAAYA,EAAUkC,GAASA,CAA0B,GAClGC,EAAaH,EAAY,GAAG7V,MAClCkS,EAAOT,KAAK,CACVC,MAAOoE,EACP9V,MAAO,CACLD,QAASiW,EAAWjW,QACpB6O,KAAOoH,EAAmBpH,MAE5B+C,WAAYgC,GAEhB,CAOA,OALAwB,IACIjB,GACFA,EAAWiB,EAAWE,EAAanD,EAAOjL,QAGrC2O,CAAe,CAnDtB,IAAKhE,EACH,MAAM5R,EAKR,IAAM4V,EAAsB,GACtBC,EAA2C,GAAGI,WAnEjDC,EAAAC,GACL,GAAc,mBAAdD,EAAcvG,GAAA,KACkByG,EAAGtG,EAAA/K,aACxB+E,OAEf,OAACsM,EAAAvG,EAAAwG,QAAA9E,UAEDzH,EAAAqM,EAAAC,EAAAhP,iBAEG,IAAAkP,EAAAxM,GAiBD,YADAA,EAAMoG,KAAcqG,EAAAxR,IAAYA,EAAOoL,EAASF,UAAMH,EAAA,IAAAE,EAAA,KAf3ClG,IACXsG,EAoBAN,EACAK,EAAAL,EAAmB,EAAAhG,GAGnBgG,EAAIhG,QAEHhF,KAEKgL,IAAOA,EAAW,IAAAE,GAAA,EAAAlL,OArChBoR,EAAMvG,KA0Cd,OAAAE,EAAiB,OAAA,OAEkD,SAAAzI,OAEjEgP,EAAA7E,gBAIE,CAAA,MAAAzM,GAAA,WAMA,GAAAgL,GAAAA,EAAAI,cACDA,KAAAsG,EAAA,SAAA1R,WAAQA,kBAUP,KAAA,WAAAoR,GACE,MAAA,IAAAO,UAAA,0BASI,IADF,IAAAC,EAAA,GACE1O,EAAA,EAAAA,EAAAkO,EAAAjP,OAAAe,4EApJT,OAAAA,EAAA2O,EAAA1P,YACH6C,EAAaqM,EACXnO,KAG6B8B,EAAAoG,KAAA,KACzBoG,EAAOxM,iBAILoG,aAAiCC,OAAW,KAAAL,EAAA,IAAAE,EAAA,KAHhDlG,EAAAA,EAAoBsG,CAQtB,GAIMD,EAAAL,EAAA,EAAKhG,gBAMHqG,EAAAL,IAAAA,uBA6HO,SAAA9H,UAAYmO,EAAAO,EAAA1O,GAAA,EACnB,CAfgD4O,CAEjCzO,EAAR4N,SAAAA,GAAec,IAAAA,EAAAtB,EACpB,WAAA,OAAA3Q,QAAAC,QAEyBiP,EAAK0B,iBAC9B,WAAA,OAAM5B,EAAU,CAACmC,GAAM,EACvBpC,EACAU,EACAW,IACD9E,KALK4G,SAAAA,GAMFA,EAAa7P,OAAS,GACxB2O,EAAenE,KAAIiE,MAAnBE,EAAuBkB,EAE3B,EAAA,EAASC,SAAAA,GACP,IAAM/W,EAAQ+W,aAAqB9W,MAC/B8W,EACA,IAAI9W,MAAMyT,OAAOqD,IACrBlB,EAAYpE,KAAK,CAAEsE,KAAAA,EAAM/V,MAAAA,GAC3B,MAAC6W,GAAAA,EAAA3G,KAAA,OAAA2G,EAAA3G,KACH,WAAA,EAAA,GAAC+F,OAAAA,GAAAA,EAAA/F,KAAA+F,EAAA/F,KAAAyF,GAAAA,GAyBH,GACF,CAAC,MAAA7Q,GAAA,OAAAF,QAAAG,OAAAD,EAAA,CAAA,GAAE,OAAAF,QAAAC,QAGGD,QAAQoS,IAAI1B,IAAcpF,KAEhC,WAAA,MAAO,CACLoD,QAAAA,EACApB,OAAAA,EACAgD,eAAgBC,EAChB/C,YAAaF,EAAOjL,OACpB,EACJ,CAAC,MAAAnC,GAAA,OAAAF,QAAAG,OAAAD,EAAAzE,CAAAA,EAAAA,EAKamV,iBAAA,SACZyB,EACAtD,EACAU,EACAW,GAAwB,IAAA,IAe6BkC,EAbjDC,EAFoBC,EAAA,SAAAC,MAAAH,EAAA,OAAAG,EAexB,MAAMF,GAAa,IAAIlX,MAAM,uBAAwB,EAAAqX,EALzC3I,KANH4I,EAAU,EAACC,WAjBZhG,EAAAiG,EAAAtB,OACN,IAAAuB,WAEAlG,IAKD,GAJF8E,EAAAqB,KAEDA,EAAAA,EAAAvH,IAEGuH,SACW7N,EAQZ,GAAA6N,EAASzH,KAAU,CACjBwH,EAAA,EACE,YACOvB,UACPrM,EAASoG,MACT,IAAAoG,QAGF,OAGF,CALMxM,EAAAA,EAAAvF,EAQR,GAAAkT,EAAA,WAEG,GAAAG,GAAAA,EAAA1H,OAAAoG,EAAAsB,GAAA,CACKF,EAAU,OAEhB,CACA,CACE,OACD,IAAA1H,EACDjL,EAAAoL,EAAcF,KAAA,KAAAH,EAAA,GAGhB,OAFC,MAAA6H,EAAAzH,KAAA2H,GAAA,IAAAH,EAAA5N,EAAAoG,KAAA4H,GAAAF,EAAA1H,KAAA6H,IAAA7H,UAAA,EAAAnL,GAED+K,gBAEGhG,EAAA1C,EACK,EAAA,CACN,GAAAqQ,IACFG,EAACH,MACFG,EAAA1H,OAAAoG,EAAAsB,eAEDA,EAAA1H,KAAA6H,GAAA7H,UAAA,EAAAnL,GAOqD,KAA/B4S,EAAAnG,MAA+B8E,EAAAqB,KAAAA,EAAAvH,EAF3C,YADAD,EAA2BL,EAAG,EAAAhG,QAGLoG,KAAqC,cAAXA,KAAR2H,GAAgB3H,UAAA,EAAAnL,GAKjEuR,EAFAxM,EAAAqM,SAGMrM,EAAQsG,EAEZ,QAAAtG,IAAYA,EAASoG,aAEgB4H,GAAA5H,UAAA,EAAAnL,GAErC,SAAA8S,EAAcF,QAEdxB,MAEArM,SACDoG,KAAA4H,GAAA5H,UAAA,EAAAnL,KACa+E,KAGfgG,EAAA,EAAAhG,GAIG,SAAAiO,OACDvG,KAEDmG,EAAkBzH,KAChByH,EAAUzH,QAAeA,UAAA,EAAAnL,GAE7B8S,EAACF,OAIS,EAAA7N,EACI,EA7EQkO,mBAAAd,GAAEK,EAAU5D,CAAU,EAAA,WAAA,OAAE4D,GAAS,EAAA,WAAEhC,OAAAA,EACjD,WAAA,OAAA3Q,QAAAC,QACWmQ,EAAYiD,QAAQhB,IAAK/G,KAAAgI,SAAAA,GAAA,OAAAhB,EAAA,EAAAgB,CAAA,EACxC,EAAC,SAAQlY,GACPmX,EAAYnX,EAAe,IAAAmY,EAAA,WAAA,GACvBZ,EAAU5D,EAAa,EAAC/O,OAAAA,QAAAC,QACpByS,EAAKc,MAAM/D,GAAckD,EAAU,KAAGrH,KAAA,aAAA,CAFnB,GAEmB,OAAAiI,GAAAA,EAAAjI,KAAAiI,EAAAjI,yBAEhD,EACF,GAAC,OAAAtL,QAAAC,QAAA2S,GAAAA,EAAAtH,KAAAsH,EAAAtH,KAAAkH,GAAAA,EAAAI,GAGH,CAAC,MAAA1S,UAAAF,QAAAG,OAAAD,EAAA,CAAA,EAAAzE,EAKO+U,WAAA,SAAcuB,EAAY3C,GAGhC,IAFA,IAAM/L,EAAgB,GAChBS,EAAOiM,KAAKG,IAAI,EAAGd,GAChBhM,EAAI,EAAGA,EAAI2O,EAAM1P,OAAQe,GAAKU,EACrCT,EAAOwJ,KAAKkF,EAAM0B,MAAMrQ,EAAGA,EAAIU,IAEjC,OAAOT,CACT,EAAC5H,EAKO+X,MAAA,SAAME,GACZ,OAAO,IAAI1T,QAAQ,SAACC,GAAY,OAAA0T,WAAW1T,EAASyT,EAAG,EACzD,EAAC5H,CAAA,CA7WD,GAmXWuE,eAIX,WAAA,SAAAA,EAAoBJ,EAA+BH,GAA/BG,KAAAA,mBAA+BH,EAAAA,KAAAA,qBAH3C8D,MAA2B,GAAE7J,KAC7B8J,QAAU,EAEE9J,KAAakG,cAAbA,EAA+BlG,KAAQ+F,SAARA,CAAmB,CAAC,IAAAgE,EAAAzD,EAAA3U,UA0CtE,OA1CsEoY,EAEjET,QAAO,SAAIU,OAAoBC,IAAAA,EAC7BjK,KAAI/J,OAAAA,QAAAC,QAAJ+T,EAAKC,eAAa3I,KAAA4I,WAAAA,+BAEpB,WACFF,EAAKH,UACL,IAAMM,EAAQC,KAAKC,MAAM,OAAArU,QAAAC,QACJ8T,KAAIzI,KAAnBpG,SAAAA,GAGN,IAAMoP,EAAUF,KAAKC,MAAQF,EAAMI,EAAA,WAAA,GAC/BD,EAAUN,EAAKlE,SAAQ9P,OAAAA,QAAAC,QACnB+T,EAAKR,MAAMQ,EAAKlE,SAAWwE,IAAQhJ,KAAA,WAAA,EAAA,CAFR,GAEQ,OAAAiJ,GAAAA,EAAAjJ,KAAAiJ,EAAAjJ,KAG3C,WAAA,OAAOpG,CAAO,GAAPA,CAAM,EACf,6FAdwBgP,CAEpB,EAYH,SAAAM,EAAAC,GAEqB,GADpBT,EAAKH,UACLG,EAAKU,eAAeF,EAAAC,MAAAA,EAAAA,OAAAA,CAAA,EAExB,EAAA,CAAC,MAAAvU,GAAA,OAAAF,QAAAG,OAAAD,EAAA4T,CAAAA,EAAAA,EAEOG,YAAA,WAAW,IAAAU,EAAA5K,KACjB,OAAIA,KAAK8J,QAAU9J,KAAKkG,cACfjQ,QAAQC,UAGN,IAAAD,QAAQ,SAACC,GAClB0U,EAAKf,MAAM/G,KAAK5M,EAClB,EACF,EAAC6T,EAEOY,aAAA,WACN,GAAI3K,KAAK6J,MAAMvR,OAAS,GAAK0H,KAAK8J,QAAU9J,KAAKkG,cAAe,CAC9D,IAAMwB,EAAO1H,KAAK6J,MAAMgB,QACpBnD,GAAMA,GACZ,CACF,EAACqC,EAEON,MAAA,SAAME,GACZ,OAAW,IAAA1T,QAAQ,SAACC,GAAO,OAAK0T,WAAW1T,EAASyT,EAAG,EACzD,EAACrD,CAAA,CA1CD,GCwRO,SAAAM,EAAGY,EAAAsD,aAGyCtD,GAC/C,CAAA,MAAArR,GACA,OAAA2U,EAAA3U,EACE,aACSoL,iBACD,EAASuJ,GAEhB3P,CACH,CAlnBA,SAAAqG,EAAYL,EAAAC,EAAA3I,SACb7C,EAAA,iBAAQyL,EAAQ,CACf,IAAA5I,EAAA7C,cAOG6C,EAAAiJ,EAAAF,EAA6BF,KAAA,KAAAH,EAAAC,IAN9B,EAAAA,MACD3I,EAAA7C,KAEF6C,EAAAgJ,CAOI,CACL,GAAAhJ,GAAOA,EAAM8I,KAGP,cAFPA,KAAAC,EAAAF,KAAA,KAAAH,EAAAC,GAAAI,EAAAF,KAAA,KAAAH,EAAA,IAIGA,EAAAvL,EAAAwL,EACAD,EAAAM,EAAAhJ,QACU0I,EAAQO,EAClBqJ,KACA5J,GAGE,CAxFD,IAAAE,eAAoB,WAC3B,SAAAA,IAAS,QACTA,EAAO1P,UACK4P,KACU,SAAAI,KAOtB,MAAuB,IAAAN,EACdD,EAAApB,KAAApK,EACF,GAAAwL,EACa,CAYpB,IAASS,EAAmB,EAART,IAAqBQ,EAEzC,KAAwB,CACd,IACAJ,EAAArG,EAAmC,EAAA0G,EAAA7B,KAAAyB,GACnC,CAAA,MAAgBtL,GAExBqL,EAAArG,EAA6B,EAAAhF,EAC3B,CACE,OAAAgF,EAGF,OACA6E,IACE,CAgBE,cAfH,SAAAF,GACD,IACE,IAAArH,EAAeqH,EAAA2B,EAChB,EAAD3B,EAAClK,IAAMuF,EAAC,EAAAwG,EAAAA,EAAAlJ,GAAAA,GACNmJ,IACDzG,EAAA,EAAAyG,EAAAnJ,MAEI0C,EAAiB,EAAA1C,EAGjB,CAAA,MAAuBtC,GAC5BqL,EAAIrG,EAAC,EAAAhF,GAGH,EACEgF,KAxDmB,cA0FnB2G,GACF,OAAAA,aAAAT,GAAW,EAAAS,EAAAlM,EAqOb,SAAAyT,EAAsBxG,EAAAiG,EAAiBtB,GAErC,IADA,IAAAuB,IACA,OAC0ElG,IAK1E,KAJQmG,KACNA,EAAAA,MAGFA,gBAIQzH,KAAA,KAGR,YAGyEiG,UACnErM,EAAOoG,KAAM,OAEWpG,GAE5B,CAEJ4N,EAAA,EACE,QAJE5N,EAAAvF,CAMF,aAECkT,UACFG,EAAA1H,OAAAoG,EAAAsB,GAAA,CAEDF,EAAA,EACF,cAKM,IAAA1H,IACAG,EAAsBF,KAAC,KAAAH,EAAA,GAEzB,OADK,MAAA6H,EAAOzH,KAAA2H,GAAA,IAAAH,EAAA5N,EAAAoG,KAAA4H,GAAAF,EAAA1H,KAAA6H,IAAA7H,UAAA,EAAAnL,GACZ+K,EACA,SAAAgI,EAAoB1Q,OACpB,EAAA,CACA,GAAAqQ,MACDA,MACYG,EAAA1H,OAAAoG,EAAAsB,GAGR,YAFNA,EAAA1H,KAAA6H,GAAA7H,UAAA,EAAAnL,GASgB,KAAb4S,EAAWnG,MAAsB8E,EAAqBqB,KAAEA,EAAAvH,EAGxD,YADAD,EAAAL,EAAM,EAAShG,GAEf,GAAA6N,EAAezH,KACf,YADiByH,EAAAzH,KAAoB2H,GAAwB3H,UAAA,EAAAnL,GAK7DuR,IAFAH,SAGMrM,EAAAsG,EAIF,QAAAtG,IAAGA,EAAAoG,gBACeA,UACb,EACCnL,GAEa,SAAA8S,EAAoBF,GAE3CA,KACAxB,MACIrM,EAAAoG,KAEJpG,EAAAoG,KAAA4H,GAAkB5H,UAAA,EAAAnL,KAEX+E,GAGHqG,EAAAL,EAAA,EAAAhG,GAIF,SAAAiO,KAAwBJ,EAAAnG,OAEXtB,OACVA,QAASA,UAAA,EAAAnL,KAEO4S,GAGlBxH,EAAAL,EAAA,EAAEhG,GAIL,KA7MC6F,EAAA,oBAAAC,OAAAA,OAAAC,WAAAD,OAAAC,SAAAD,OAAA,oBAAA,wBA9DE+G,EAAAR,EAAAwD,SAEqC5U,yBAChC+E,GACN,eACS7C,UAAM0S,IAAWA,cACzB3R,KAEK8B,EAAAoG,KAAW,CAKb,IAAAoG,EAAAxM,GAKJ,YAFGA,EAAAoG,KACFqG,EAACxR,IAAAA,EAAAoL,EAAAF,KAAA,KAAAH,EAAA,IAAAE,EAAA,KAHElG,EAAAA,EAAAsG,IAQJD,EAAAL,EAAA,EAAAhG,MAOF,CAAA,MAAAhF,KACDgL,IAAAA,EAAA,IAAAE,GAAA,EAAAlL,GACC,CACEyR,IAEF,CA+BM,SAAAK,EAAAV,EAAAC,EAAAwD,MACD,wBAAA,CAAA,IACgBvD,EAAAtG,EAAA/K,aAClB+E,OAED,QAAAsM,EAAAvG,EAAUwG,cAAqBsD,GAAUA,YAC1CxD,EAAAC,EAAAhP,SACF0C,EAAAoG,KAAA,CACD,IAAAoG,EAAiBxM,eAUjBA,EAAKoG,KAAAqG,EAAAxR,IAAAA,EAAAoL,EAAAF,KAAA,KAAAH,EAAA,IAAAE,EAAA,KATNlG,EAAAA,EAAAsG,CAYG,SAGUtG,MAIR,CAAA,MAAAhF,SACIgL,SAAe,EAAQhL,KA3BzB+K,EAAAqG,EAAAvG,qBA+BK,CACL,IAAA6G,EAAA,SAAApP,yBAKE,CAAA,MAAAtC,GAAA,SAGA,+BAEG,SAAQA,GACT,MAAA0R,EAAA1R,KAGH0R,GACD,CACA,OAAA1G,EAOE,KAAA,WAAAoG,iDAKJ,aAAAlO,EAAA,EAACA,EAAEkO,EAAAjP,OAAAe,IACL0O,EAAAjF,KAAEyE,EAAClO,WAEL4R,EAAClD,EAAA,SAAA1O,GAAA,OAAAmO,EAAAO,EAAA1O,GAAA,EAAA2R,GAlQL,IAAaE,0BAKX,SAAAA,EAAY5P,GACV,GAD2B0E,KAJrBmL,gBACAC,EAAAA,KAAAA,gBACAC,EAAAA,KAAAA,aAGN,EAA2B,eAAvB/P,EAAOgQ,aAAuD,YAAvBhQ,EAAOgQ,YAChD,MAAMna,EAAe,iEAGvB,IAAMoa,EAAgC,eAAvBjQ,EAAOgQ,YACtB,GAAuB,MAAnBhQ,MAAAA,OAAAA,EAAAA,EAAQkQ,QACV,MAAMra,EAAe,0CAGrB6O,KAAKmL,WADH7P,MAAAA,GAAAA,EAAQkQ,OACQlQ,EAAOkQ,OAEPD,EJnFkB,mCAOG,mCI8EzCvL,KAAKqL,QAAUE,EJtFe,6BAOE,qCIgFhCvL,KAAKyL,0BAA0B,aACjC,CAAC,IAAA/Z,EAAAwZ,EAAAvZ,UAuzDA,OAvzDAD,EAEY+Z,kBAAA,WAAiB,IAAA3L,IAAAA,EAEME,YAAI/J,QAAAC,QAAA0Q,aADlC3Q,OAAAA,QAAAC,QACqBwV,MAAS5L,EAAKuL,QAAgCvL,yBAAAA,EAAKqL,WAAc,CAAEQ,OAAQ,SAAQpK,KAApGqK,SAAAA,GAEN,GAAwB,MAApBA,EAAS/M,QAAsC,MAApB+M,EAAS/M,OACtC,MAAM1N,EAAe,mBAGvB,IAAKya,EAASC,GAAI,MAAM1a,EAAc,uBAAwBya,EAAS/M,QAAU,OAAA5I,QAAAC,QAClD0V,EAASE,QAAMvK,KAAxCnP,SAAAA,GAEN,OADA0N,EAAKsL,WAAahZ,EACXA,CAAK,IACd,EAAC,SAAQf,GAIP,MAHIiP,EAAejP,IACjBuP,EAAgBvP,EAAO,gBAEnBA,CACR,GACF,CAAC,MAAA8E,GAAA,OAAAF,QAAAG,OAAAD,EAAAzE,CAAAA,EAAAA,EAEMqa,eAAA,SAAezN,GACpB,OAAO0H,KAAKgG,MAAM1N,EAAM0H,KAAAiG,IAAG,GJlHF,GImH3B,EAACva,EAEMwa,iBAAA,SAAiB5N,GACtB,OAAOA,EAAM0H,KAAAiG,IAAG,GJtHS,EIuH3B,EAACva,EAEaya,kBAAiB,SAACC,EAAmB9N,EAAgBhD,GAAkB,IACnF,IAAM2B,EAAkB,CACtBM,EAAG,SACH7D,GAAI,WACJhF,GAAI4G,EAAOkC,QACXG,IAAKW,EAAOrH,YAEd,OAAAhB,QAAAC,QAAO,CACL7D,cAAe6E,GAAiB,IAAIzF,GAAiBG,KAAKwa,EAAWC,EAAAA,UAAUC,WAAWhR,EAAOiR,WAAY,CAC3GhV,QAASR,OAAOC,KAAKmG,KAAKqP,UAAUvP,IAAkBhG,SAAS,UAC/DO,YAAa,uBAEf3C,SAAU,GAEd,CAAC,MAAAsB,GAAAF,OAAAA,QAAAG,OAAAD,EAAAzE,CAAAA,EAAAA,EAEYuQ,SAAA,SACXhH,EACAwR,EACA1S,EACA2S,GAAsB,IAAA,IAAAnE,EAAA5E,EA+Bb3D,YAAI/J,QAAAC,QAAA0Q,EA7BT,WAAA,SAAA4C,EAAAmD,OAAAC,EAAA,GAAArE,EAAAoE,OAAAA,WAAArF,EAAAoB,GAAAkE,GAAAA,EAAAlE,OAAAA,EAoFF,MAAMvX,EAAe,iCAAkC,CAAA+W,IAAAA,EAlCnD3J,WAAAA,GAAAA,MAAM6D,QAAQnH,IAChB,IAAMuH,EAAiBvH,EAAQ5G,OAAO,SAACwY,GAAS,MAAgB,iBAATA,GAAqB9N,EAAgB8N,EAAK,GAEjG,GAA8B,IAA1BrK,EAAelK,OACjB,MAAMnH,EAAe,uCAIvB,IAAMsR,EAAmBxH,EAAQ5G,OAAO,SAACwY,SAAyB,iBAATA,IAAsB9N,EAAgB8N,EAAK,GAGnG,OAFGpK,EAAiBnK,OAAS,GAC5BgF,QAAQwP,KAAI,QAAYrK,EAAiBnK,yDAC1CrC,QAAAC,QAEsBwV,MAClB/H,EAAK0H,gCAA+B1H,EAAKwH,iBAAsB3Z,IAATib,EAA8BA,SAAAA,EAAS,UACrFjb,IAATuI,WAA8BA,EAAS,KACtC2S,EAAK,UAAaA,EAAU,IAC/B,CACEf,OAAQ,OACRoB,QAAS,CAAE,eAAgB,oBAC3BvF,KAAMrK,KAAKqP,UAAUhK,MAExBjB,cATKqK,GAUN,GAAwB,MAApBA,EAAS/M,QAAsC,MAApB+M,EAAS/M,OACtC,MAAM1N,EAAe,mBAEvB,IAAKya,EAASC,GAAI,MAAM1a,EAAc,uBAAwBya,EAAS/M,QAAU,OAAA5I,QAAAC,QAClD0V,EAASE,QAAMvK,KAAA,SAAxCnP,GACN,IAAM4a,EAAM,CAAC,WAAY,eAAeC,EACjC7a,EAAKiC,OAAO,SAAC8O,GAClB,OAAA6J,EAAIvR,SAAS0H,EAAK/Q,KAAK8a,MAAMxT,GAAGgG,cAAqD,UACtFkN,IAAAK,CAAA,EAAA,EAAA,CAAA,CA/BC1O,GA+BD,OAAA2J,GAAAA,EAAA3G,KAAA2G,EAAA3G,KAAA+F,GAAAA,EAAAY,EAhFH,CAAA,IAAKjN,EACH,MAAM9J,EAAe,uBAEvB,QAAaK,IAATib,IACkB,iBAATA,GAAqBA,GAAQ,IAAM7O,OAAOuP,SAASV,IAC5D,MAAMtb,EAAgCsb,iBAAAA,kCAI1C,QAAajb,IAATuI,IACkB,iBAATA,GAAqBA,GAAQ,IAAM6D,OAAOwP,UAAUrT,IAC7D,MAAM5I,EAAc,iBAAkB4I,EAAI,gCAI9C,QAAcvI,IAAVkb,GACY,QAAVA,GAA6B,SAAVA,EACrB,MAAMvb,EAAiCub,kBAAAA,EAAgC,6BAE1E,IAAA1F,EAGG,WAAA,GAAmB,iBAAZ/L,EAAoB,CAC7B,IAAK8D,EAAgB9D,GACnB,MAAM9J,EAA2C8J,4BAAAA,GAEpB,OAAAhF,QAAAC,QACRwV,MAClB/H,EAAK0H,QAAO,wBAAwB1H,EAAKwH,iBAAsB3Z,IAATib,WAA8BA,EAAS,UACrFjb,IAATuI,EAAkB,SAAYA,EAAS,KACtC2S,EAAkBA,UAAAA,EAAU,IAC/B,CACEf,OAAQ,OACRoB,QAAS,CAAE,eAAgB,oBAC3BvF,KAAMrK,KAAKqP,UARM,CAACvR,OAUrBsG,KAAA,SATKqK,GAUN,GAAwB,MAApBA,EAAS/M,QAAsC,MAApB+M,EAAS/M,OACtC,MAAM1N,EAAe,mBAEvB,IAAKya,EAASC,GAAI,MAAM1a,EAAc,uBAAwBya,EAAS/M,QAAU,OAAA5I,QAAAC,QAClD0V,EAASE,QAAMvK,KAAxCnP,SAAAA,GACN,IAAM4a,EAAM,CAAC,WAAY,eAAeK,EACjCjb,EAAKiC,OAAO,SAAC8O,UAClB6J,EAAIvR,SAAS0H,EAAK/Q,KAAK8a,MAAMxT,GAAGgG,cAAqD,GACtF2N,OAAA9E,EAAA8E,EAAAA,CAAA,EAAArG,EAAAA,CAAAA,CAvBC,GAuBDA,OAAAA,GAAAA,EAAAzF,KAAAyF,EAAAzF,KAAAiI,GAAAA,EAAAxC,EAuCL,WAAS3V,GAIP,MAHIiP,EAAejP,IACjBuP,EAAgBvP,EAAO,eAEnBA,CACR,GACF,CAAC,MAAA8E,UAAAF,QAAAG,OAAAD,EAAAzE,CAAAA,EAAAA,EAEa4b,oBAAW1O,EAAc2O,QAAAA,IAAAA,IAAAA,EAAkB,OAACC,IAAAA,EAAA1J,EAGxB9D,KAFvB4I,EAAU,EAAC4B,EAAAnB,EAAAmE,WAAAA,OAAAA,GAAE5E,GAAW2E,CAAO,EAAA,WAAA,OAAE3E,GAAS,EAAE,WAAA,OAAAhC,EAC/C,WAAA,OAAA3Q,QAAAC,QACiBwV,MAAS5H,EAAKuH,QAAO,UAAUzM,EAAmBkF,eAAAA,EAAKqH,aAAa5J,KAAjFkM,SAAAA,YAAIhF,IAeV,GAAoB,MAAhBgF,EAAK5O,OACP,MAAM1N,EAAkBsc,EAAK5O,OAAM,sCAAsCD,GAC1E,OAAA3I,QAAAC,QAEuBuX,EAAK3B,QAAMvK,KAAA,SAAA/C,GAAA,IAAtBkP,EACNzR,EAAAA,YAAYC,QAAQnF,OAAOC,KADrBwH,EAAL5C,MACsC,UAAU3E,SAAS,QAAOyW,OAAAF,EAAAE,EAAAA,CAAA,GAlBxE,GAAoB,MAAhBD,EAAK5O,OAAgB,MAAM1N,EAAe,yBAC9C,GAAoB,MAAhBsc,EAAK5O,QAAkC,MAAhB4O,EAAK5O,OAC9B,MAAM1N,EAAe,mBACtB,IAAA0X,EAAA,WAAA,GAGmB,MAAhB4E,EAAK5O,QAAkB+J,EAAU2E,EAAO,CAE1C,IAAM9D,EAAQzD,KAAK2H,IAAI,IAAM3H,KAAKiG,IAAI,EAAGrD,GAAU,KAAM,OAAA3S,QAAAC,QACnD,IAAID,QAAQ,SAACC,GAAY,OAAA0T,WAAW1T,EAASuT,EAAM,IAAClI,KAAA,WAAA,EAAA,CAAA,CAN3D,GAM2D,OAAAsH,GAAAA,EAAAtH,KAAAsH,EAAAtH,KAAAkH,GAAAA,GAAA,EAU9D,EAAC,SAAQpX,GACP,OAAIuX,IAAY2E,GACVjN,EAAejP,IACjBuP,EAAgBvP,EAAO,0BACxBmc,EACM,IACRvX,QAAAC,QAEK,IAAID,QAAQ,SAACC,GAAY,OAAA0T,WAAW1T,EAAS,IAAI,IAACqL,KAC1D,WAAA,EAAA,EACF,UAACtL,QAAAC,QAAAsU,GAAAA,EAAAjJ,KAAAiJ,EAAAjJ,KAAAqM,SAAAA,UAAAJ,EAAAI,OACMpc,CAAS,GAAAgc,EAAAhD,OAAThZ,EACT,CAAC,MAAA2E,UAAAF,QAAAG,OAAAD,EAAA,CAAA,EAAAzE,EAEamc,uBACZC,EACAzO,GAAsB,IAKtB,IACE,IACI/L,EACJ,OAAQwa,EAAQ/Y,QACd,IAAK,OACHzB,EAAK2I,cAAY8R,YAAYD,EAAQlS,OACrC,MACF,IAAK,KACHtI,EAAK2I,EAAWA,YAAC+R,UAAUF,EAAQlS,OACnC,MACF,QACEtI,EAAK2I,cAAYC,QAAQ4R,EAAQlS,OAGrC,IAAMqS,EAAoCH,EAAQI,YAAYC,QAAQ,SAACC,GACrE,MAAO,CAAC/O,GAAYzE,IAAI,SAACyT,GACvB,IAAMvZ,EAAWlB,EAAoBA,qBAACmB,OAAO,CAC3CP,WAAY4Z,EAAOE,SACnB1Z,kBAAmBwZ,EAAOG,YAC1Bnb,eAAgBgb,EAAOvZ,SACvBG,mBAAoB1B,EAAG2B,QACvBb,YAAad,EAAGa,OAAOE,OAAO,SAACC,EAAGC,UAAUA,IAAU6Z,EAAO7a,UAAU,GACvEA,WAAY6a,EAAO7a,WACnBoB,QAASrB,EAAGqB,QACZO,cAAe5B,EAAGa,OAAOia,EAAO7a,YAAY4B,UAAY,EACxDC,UAAWgZ,EAAOnV,OACduV,EAAMA,OAACtS,QAAQkS,EAAOnV,SACtB,IAAIwV,EAAKA,OAAG7c,KAAKyc,EAAQrY,cAAc0Y,aAC3CrZ,SAAU/B,EAAG+B,SACbC,MAAO8Y,EAAOO,aA5BS,KA8BnBpZ,EAAe8Y,EAAQhb,KAAKmC,EAAIA,KAACC,OAAOX,IACxCY,EAAM,IAAI9B,EAAoBA,qBAClC2B,EAAaI,EACbJ,EAAaK,EACbwY,EAAOO,aAlCgB,IAoCzB,MAAO,CACLjZ,IAAKzD,EAAKA,MAAC4E,MAAMnB,EAAIK,oBACrB6Y,OAAQP,EAAQrY,cAAciB,WAC9B1D,WAAY6a,EAAO7a,WACnBob,YAAaP,EAAOO,aAxCG,GAyCvBE,MAAOT,EAAOS,MAElB,EACF,GACA,OAAO5Y,QAAQC,QAAQ,CAAE+X,aAAAA,GAC3B,CAAE,MAAO5Q,GAAUyR,IAAAA,EAIjB,OAHIxO,EAAejD,IACjBuD,EAAgBvD,EAAK,kBAEvBpH,QAAAC,QAAO,CACL7E,MAAO,CACLD,QAAoB,OAAb0d,EAAEzR,EAAIjM,SAAO0d,EAAI,UACxBnO,MAAOtD,EAAIsD,QAGjB,CACF,CAAC,MAAAxK,GAAAF,OAAAA,QAAAG,OAAAD,EAAA,CAAA,EAAAzE,EAEYqd,wBAAe9T,EAAiB+T,OAA8BC,IAAAA,WACnE3T,GACN,IAAKA,EAAQ,MAAMnK,EAAe,sBAClC,IACMwL,EADOrB,EAAO4T,KACHC,KAAK,SAACC,GAAM,OAAAJ,GAA0BI,EAAEzB,KAAOqB,GAA0BI,EAAEjJ,GAAG,GAC/F,IAAKxJ,EAAK,MAAMxL,EAAe,iBAC/B,IAAMke,EAAY1S,EAAIA,IAChB2S,EAAiBN,EAAyBK,EAAU,OAAApZ,QAAAC,QAEpCiO,EAAKoL,WAAWtU,IAAQsG,KAAxCiO,SAAAA,OAAOC,EAAAC,SAAAA,EAAAC,GA+BbC,EAASC,KAAK,SAACC,EAAGC,GAAC,OAAKA,EAAE3d,KAAK8a,MAAMvP,IAAMmS,EAAE1d,KAAK8a,MAAMvP,GAAG,GAM3D,IAHA,IAG2B4E,EAHvByN,EAA4B,GAC5BC,EAAiB,EAErBvN,EAAAC,EAAmBiN,KAAQrN,EAAAG,KAAAE,MAAE,CAAlB,IAAAO,EAAIZ,EAAA9J,MAGb,GAFAuX,EAAclN,KAAKK,IACnB8M,GAAkB9M,EAAK/Q,KAAK8a,MAAMvP,MACZ2R,EACpB,KAEJ,CAEA,OAAOU,CAAc,CA5CrB,GAAIR,EAAQlR,OAASgR,EAEnB,MAAMne,qDADoBgT,EAAK+H,iBAAiBsD,EAAQlR,OAAS+Q,IAInE,IAAI5C,EAAO,EAEPmD,EAAuB,GACvBM,EAAkB,EAAEC,EAAA9G,EAAAoG,WAAAA,OAAAA,GAGjBS,EAAkBZ,CAAc,OAAE,EAAA,WAAA,OAAArZ,QAAAC,QACfiO,EAAKlC,SAAShH,EAASwR,EANtC,KAMiDlL,KAApD6O,SAAAA,GACN,GAAyB,IAArBA,EAAU9X,OAGZ,MAAMnH,EAAc,mDADMgT,EAAK+H,iBAAiBgE,EAAkBb,IAIpEO,EAAS9M,KAAIiE,MAAb6I,EAAiBQ,IACjBF,EAAkBN,EAASlR,OAAO,SAACC,EAAKwE,GAAS,OAAAxE,EAAMwE,EAAK/Q,KAAK8a,MAAMvP,GAAG,EAAE,KAErD2R,EAAgBG,EAAA,EAIvChD,GAAO,EACT,GAAC0D,OAAAA,GAAAA,EAAA5O,KAAA4O,EAAA5O,KAAAmO,GAAAA,GAAAvL,EAAAA,EAAAA,EApCcnE,KAAIqQ,EAAJlM,EAAKiH,WAAUnV,OAAAA,QAAAC,QAAAma,EAAApB,EAAAoB,GAAApa,QAAAC,QAAWiO,EAAKsH,qBAAmBlK,KAAA0N,GAsDnE,CAAC,MAAA9Y,UAAAF,QAAAG,OAAAD,KAAAzE,EAEY4e,YAAW,SAACrV,GAAe,QAAAsV,EAAApL,EAMZnF,KAJtByM,EAAO,EAEPvJ,EAAoB,GAAGsN,EAAAnH,oBAAAkH,CAAA,OAAA,EAAA,WACdta,OAAAA,QAAAC,QACaiP,EAAKlD,SAAShH,EAASwR,EAHtC,MAGiDlL,cAApD6O,GACmB,IAArBA,EAAU9X,QACd4K,EAAMJ,KAAIiE,MAAV7D,EAAckN,GACd3D,KAF0B8D,EAC1BrN,CACO,EACT,GAACjN,OAAAA,QAAAC,QAAAsa,GAAAA,EAAAjP,KAAAiP,EAAAjP,KAAA,WACD,OAAO2B,CAAM,GAANA,EACT,CAAC,MAAA/M,GAAA,OAAAF,QAAAG,OAAAD,EAAA,CAAA,EAAAzE,EAEY+e,SAAA,SACX3C,EACA3O,EACAuR,GAAiC,QAAA/H,EAGhB3I,KAAI,OAAA/J,QAAAC,QAAA0Q,aADjB+J,SAAAA,EACIrV,GACN,IAAKA,EAAQ,MAAMnK,EAAe,sBAElC,IAAAyf,EHtIiC,SACrCzO,EACAhD,GAEA,IAAA0R,EAAuC3R,EAAYC,GAA3BE,EAAUwR,EAAVxR,WACxB,GAAuB,IAAnB8C,EAAQ7J,OACV,MAAO,CAAE8G,SAAS,EAAO/N,MAAO,2EAGlC,IALewf,EAAPzR,QAMN,MAAO,CAAEA,SAAS,EAAO/N,MANLwf,EAALxf,OAM0B,4BAI3C,IAAKgO,EACH,MAAO,CAAED,SAAS,EAAO/N,MAAO,yBAIlC,IADA,IACyByf,EADrBC,EAAc,EAClBC,EAAArO,EAAkBR,KAAO2O,EAAAE,KAAApO,MAAE,CAAhB,IAAAqO,EAAGH,EAAArY,MACZ,IAAKsG,EAAgBkS,EAAIhW,SACvB,MAAO,CAAEmE,SAAS,EAAO/N,MAAK,8BAAgC4f,EAAIhW,SAEpE,GAA0B,iBAAfgW,EAAI3S,QAAuBT,MAAMoT,EAAI3S,UAAY6O,SAAS8D,EAAI3S,QACvE,MAAO,CAAEc,SAAS,EAAO/N,MAA6B4f,sBAAAA,EAAIhW,2CAE5D,GAAIgW,EAAI3S,OAAS3F,EACf,MAAO,CACLyG,SAAS,EACT/N,MAA6B4f,sBAAAA,EAAIhW,QAAuCtC,gCAAAA,WAG5EoY,GAAeE,EAAI3S,MACrB,CAEA,OAAIyS,GAAe,EAAU,CAAE3R,SAAS,EAAO/N,MAAO,gDAE/C,CAAE+N,SAAS,EAAM2R,YAAAA,EAAa1R,WAAAA,EACvC,CGgG0D6R,CAAwBpD,EAAS3O,GAApE4R,EAAWH,EAAXG,YAAa1R,EAAUuR,EAAVvR,WAC9B,IADeuR,EAAPxR,QACM,MAAMjO,EAD2Byf,EAALvf,OACE,4BAC5C,IAAKgO,EAAY,MAAMlO,EAAe,yBACtC,IAAK4f,EAAa,MAAM5f,EAAe,kBAEvC,IAAM6d,EAAyBrG,EAAKoD,eAAegF,GAE7C9V,EAAUoE,EAAWqP,YAAY,OAAAzY,QAAAC,QACnByS,EAAKoG,eAAe9T,EAAS+T,IAAuBzN,KAAlE2B,SAAAA,GAAKiO,IAAAA,WAAAC,EAAAC,GAAAC,SAAAA,IAAAC,SAAAA,IAAAC,SAAAA,IA6CX,SAAId,GAAAA,EAAiBe,UAAW,CAC9B,IAAM1O,EAAQxE,MAAM6D,QAAQsO,EAAgBe,WACxCf,EAAgBe,UAChB,CAACf,EAAgBe,WAErB,GAAqB,IAAjB1O,EAAMzK,OACR,MAAMnH,EAAe,4CAGvB,IADA,IAAMugB,EAAoB,GACjBrY,EAAI,EAAGA,EAAI0J,EAAMzK,OAAQe,IAAK,CACrC,IAAM+N,EAAOrE,EAAM1J,GAErB,IAAK+N,GAA6B,iBAAdA,EAAKhV,KACvB,MAAMjB,EAA6CkI,8BAAAA,6BAErD,GAAkB,SAAd+N,EAAKpP,KAAiB,CACxB,IAAM2Z,EAAM5a,OAAOC,KAAKoQ,EAAKhV,KAAM,QACnC,GAAmB,IAAfuf,EAAIrZ,OACN,MAAMnH,EAAqCkI,sBAAAA,oCAE7CqY,EAAQ5O,KAAK6O,EACf,KAAWvK,IAAc,QAAdA,EAAKpP,KAiBd,MAAM7G,yCAAsDkI,EAAC,KAAM+N,EAAapP,MAhBhF,IAAM4Z,EAAMxK,EAAKhV,KAAKuF,OACtB,IAAKia,EACH,MAAMzgB,EAAqCkI,sBAAAA,EAAY,aAEzD,IAAK,iBAAiBwJ,KAAK+O,IAAQA,EAAItZ,OAAS,GAAM,EACpD,MAAMnH,EACkBkI,sBAAAA,EAA0CuY,yCAAAA,EAAM,KAG1E,IAAMD,EAAM5a,OAAOC,KAAK4a,EAAK,OAC7B,GAAmB,IAAfD,EAAIrZ,OACN,MAAMnH,EAAc,sBAAuBkI,EAA8B,+BAG3EqY,EAAQ5O,KAAK6O,EAGf,CACF,CACA,IAAME,EAAaH,EAAQhT,OAAO,SAACC,EAAKoR,GAAM,OAAApR,EAAMoR,EAAEzX,MAAM,EAAE,GAC9D,GAAIuZ,EAAa,IACf,MAAM1gB,EAAc,2BACS0gB,EAA6C,qCAI5E,IAAM5Y,EAAS,IAAIuV,EAAAA,OACnBvV,EAAO1G,YAAYC,EAAEA,GAACsf,MACtB7Y,EAAO1G,YAAYC,EAAEA,GAACuf,WACtB,IAAA,IAAA7Z,EAAA,EAAA8Z,EAAkBN,EAAOxZ,EAAA8Z,EAAA1Z,OAAAJ,IACvBe,EAAOtG,SAAS4L,MAAMvH,KADVgb,EAAA9Z,KAGd5E,EAAG2e,UAAU,CACXpd,SAAU,EACVxC,cAAeC,EAAaA,cAAC4f,WAAWjZ,EAAOkZ,aAElD,CAIC,IADA,IAAMC,EAAc,IAAIvV,IACfxD,EAAI,EAAGA,EAAI/F,EAAGa,OAAOmE,OAAQe,IACpC+Y,EAAYnU,IAAI5E,EAAGgG,GACpB,OAAApJ,QAAAC,QAEwByS,EAAK0J,cAAc/e,EAAI8e,IAAY7Q,KAAtD+Q,SAAAA,GACN,GAAIA,EAAWjhB,MAAO,MAAMF,EAAemhB,EAAWjhB,OAEtD,IAAMuK,EAAQtI,EAAGuD,QAAQ,OAEU,KAAhB,MAAf6Z,OAAe,EAAfA,EAAiB6B,WACZ,CAAE3W,MAAAA,GAAO3F,QAAAC,QAGSyS,EAAK6J,YAAY5W,EAAO8U,IAAgBnP,KAAAkR,SAAAA,GAA3D,IAAAC,EAAQD,EAARC,SACR,IAAKA,EAAU,MAAMvhB,EAAe,mCACpC,MAAO,CAAEuhB,SAAAA,EAAW,EAAA,EAAA,CAjFpB,IAAMC,EAASC,EAAW5D,EAAyBrS,EAAIkW,EAAA,WAAA,GACnDF,EAAS,EAACG,CAAAA,IAAAA,EACZxf,EAAG2e,UAAShc,OAAAA,QAAAC,QAAOyS,EAAKwD,kBAAkB4G,EAAeJ,EAAQrX,IAAOiG,KAAAyR,SAAAA,GAAxEF,EAAA/S,KAAAzM,EAAE0f,EAAwE,EAAAH,CAAAA,CAFrB,GAEqBA,OAAAA,GAAAA,EAAAtR,KAAAsR,EAAAtR,KAAAiQ,GAAAA,GAAA,CAAA,IAAAyB,EAJxEtW,WAAAA,GAAAA,EAAM,EAAC,CAAA,IAAAuW,EAAE5f,EAAG2e,UAAShc,OAAAA,QAAAC,QAAOyS,EAAKwD,kBAAkB7Q,EAAOmB,WAAYE,EAAKrB,IAAOiG,KAAA4R,SAAAA,GAAzED,EAAAnT,KAAAzM,EAAE6f,EAAyE,EAAA,CAAA,CAApFxW,GAAoF,OAAAsW,GAAAA,EAAA1R,KAAA0R,EAAA1R,KAAAgQ,GAAAA,GAAA,CAAA,IAAA6B,EAAAnL,EAHtE6F,EAAPmD,SAAAA,GAAgBoC,IAAAA,EACzB/f,EAAG2e,UAAShc,OAAAA,QAAAC,QAAOyS,EAAKwD,kBAAkB8E,EAAIhW,QAAS0N,EAAKoD,eAAekF,EAAI3S,QAAShD,IAAOiG,KAAA+R,SAAAA,GAA/FD,EAAAtT,KAAAzM,EAAEggB,EAA+F,EACnG,GAACF,OAAAA,GAAAA,EAAA7R,KAAA6R,EAAA7R,KAAA+P,GAAAA,GAAA,CApCD,IAAM3U,OAC0DnL,IAA9Dsc,EAAQqB,KAAK,SAAC8B,GAAG,OAAKA,EAAIhW,UAAYK,EAAOiY,WAAW,GACpD,EAIC,OAJApC,EACD7V,EAAO4T,KAAKC,KACV,SAACxS,GACC,OAAAqS,GAA0BrS,EAAIgR,KAAOqB,GAA0BrS,EAAIwJ,GAAG,SACzE,EAHDgL,EAGGxU,IACT,QAAYnL,IAARmL,EAAmB,MAAMxL,EAAe,yBAE5C,IAAMmC,EAAK,IAAI2I,cAAY,EAAG,GAAI,GAAI,GAClC2W,EAAW,EACXG,EAAgB,GAAGS,EAAAnK,oBAEhBuJ,EAAW5D,EAAyBrS,CAAG,OAAE,EAAA,WAAA,SAAA8W,EAAAC,GAAA,OAAAzd,QAAAC,QAQdyS,EAAK2E,WAAWnK,EAAKvE,OAAK2C,KAApD9M,SAAAA,GACN,IAAKA,EAAmB,MAAMtD,EAAc,uCAAwCgS,EAAKvE,KAAI,IAAIuE,EAAKwQ,MAEtGZ,EAAgBA,GAAiB5P,EAAKC,OAAO,GAC7C9P,EAAGsgB,SAAS,CACVpf,WAAY2O,EAAKvE,KACjBhK,kBAAmBuO,EAAKwQ,KACxBlf,kBAAAA,EACAof,gBAAiB,IAAI/d,EACtBA,kBACD8c,GAAYzP,EAAK/Q,KAAK8a,MAAMvP,GAAI,EAAA,CAjBhC,IAAMwF,EAAOD,EAAM2H,QAAQiJ,EAAA,WAAA,IACtB3Q,EAAI,OAAAlN,QAAAC,QACeyS,EAAK4G,WAAWtU,IAAQsG,KAAA,SAAxCiO,GAEN,MAAMre,EAAe,qDADKwX,EAAKuD,iBAAiBsD,EAAQlR,OAAS3B,GAC8B,EAAA,CAJtE,GAIsE,OAAAmX,GAAAA,EAAAvS,KAAAuS,EAAAvS,KAAAkS,GAAAA,GAcnG,GAACD,OAAAA,GAAAA,EAAAjS,KAAAiS,EAAAjS,KAAA6P,GAAAA,GAAA2C,EAAAA,CAAAA,IAAAA,EA7CcpL,EAAKyC,WAAU2I,OAAAA,EAAApD,EAAAoD,GAAA9d,QAAAC,QAAWyS,EAAK8C,qBAAmBlK,KAAAoP,EAsInE,WAAStf,GAIP,MAHIiP,EAAejP,IACjBuP,EAAgBvP,EAAO,mBAEnBA,CACR,GACF,CAAC,MAAA8E,UAAAF,QAAAG,OAAAD,EAAAzE,CAAAA,EAAAA,EAEY8gB,qBACX5W,EACA8U,QAAAA,IAAAA,IAAAA,EAAmC,CAAE6B,WAAW,EAAMyB,iBAAaxiB,IAAW,IAAAyY,IAAAA,EAyB5CjK,YAAI/J,QAAAC,QAAA0Q,aAvBlCqN,IAAAA,EAAAC,EAAAC,EAAAC,EAIF,IAHmC,KAAhB,OAAfH,EAAAvD,QAAe,EAAfuD,EAAiB1B,aACnB7B,EAAepN,KAAQoN,EAAe,CAAE6B,WAAW,YAEjD2B,EAAAxD,IAAAwD,EAAiBF,cAA8C,KAAhB,OAAfG,EAAAzD,QAAe,EAAfyD,EAAiB5B,WACnD,MAAMphB,EAAe,2DAEvB,IAAKyK,EACH,MAAMzK,EAAe,+BAIvB,IAAMmC,EAAK2I,EAAAA,YAAYC,QAAQN,GAC/B,UAAIwY,EAAC1D,KAAA0D,EAAiB7B,UACpB,MAAO,CAAE3W,MAAOtI,EAAGuD,SAErB,IAAMwd,EAAWpiB,EAAAA,MAAMuI,SAASlH,EAAG6e,YAE7BmC,EAAcnX,KAAKqP,UACvBkE,EAAkB,CAAE9U,MAAOyY,EAAUE,aAAc7D,EAAgBsD,aAAgB,CAAEpY,MAAOyY,IAC5F,OAAApe,QAAAC,QAGqBwV,MAASzB,EAAKoB,QAAO,2BAA2BpB,EAAKkB,WAAc,CACxFQ,OAAQ,OACRoB,QAAS,CACP,eAAgB,oBAElBvF,KAAM8M,KACN/S,KANIqK,SAAAA,GAQN,IAAKA,EAASC,GACZ,MAAM1a,EAA6C,gCACpD,OAAA8E,QAAAC,QAEsB0V,EAAS4I,QAAMjT,cAAhCmR,GAEN,MAAO,CAAEA,SAAAA,EAAW,EACtB,EAAA,EAASrhB,SAAAA,GAIP,MAHIiP,EAAejP,IACjBuP,EAAgBvP,EAAO,0BAEnBA,CACR,GACF,CAAC,MAAA8E,GAAAF,OAAAA,QAAAG,OAAAD,EAAAzE,CAAAA,EAAAA,EAEY+iB,YAAW,SAAC/B,OAAgB9H,IAAAA,EAML5K,KAAI,OAAA/J,QAAAC,QAAA0Q,EALlC,WACF,IAAK8L,EACH,MAAMvhB,EAAe,yBACtB,OAAA8E,QAAAC,QAEsBwV,MAASd,EAAKS,QAA8BqH,uBAAAA,EAAuB9H,eAAAA,EAAKO,WAAc,CAC3GQ,OAAQ,MACRoB,QAAS,CACP,eAAgB,uBAElBxL,cALIqK,GAON,IAAKA,EAASC,GACZ,MAAM1a,sCACP,OAAA8E,QAAAC,QAEoC0V,EAASE,SAEhD,EAAC,SAAQza,GAIP,MAHIiP,EAAejP,IACjBuP,EAAgBvP,EAAO,0BAEnBA,CACR,GACF,CAAC,MAAA8E,GAAA,OAAAF,QAAAG,OAAAD,EAAAzE,CAAAA,EAAAA,EAEY6d,WAAU,SAACtU,GAAe,IAAAyZ,IAAAA,EAQpB1U,KANjB,IAAKjB,EAAgB9D,GAEnB,MADc9J,8BAA2C8J,GAE1D,OAAAhF,QAAAC,QAAA0Q,EAEG,WAAA,SAAA+N,EACIrZ,GACN,IAAKA,EAAQ,MAAMnK,EAAe,sBAAsB,OAAA8E,QAAAC,QAEjCwV,MAASgJ,EAAKrJ,QAAiCqJ,0BAAAA,EAAKvJ,WAAc,CACvFQ,OAAQ,OACRoB,QAAS,CACP,eAAgB,oBAElBvF,KAAMrK,KAAKqP,UAAU,CAACvR,OACtBsG,KAAA,SANIqK,GAQN,IAAKA,EAASC,GACZ,MAAM1a,EAAc,qCAAsCya,EAAS/M,QACpE,OAAA5I,QAAAC,QAE0C0V,EAASE,QAAMvK,KAAA,SAApDqT,GAGF,OAACA,GAAsC,IAAvBA,EAAYtc,OAQzB,CACL2C,QAAS2Z,EAAY,GAAG3Z,QACxBqD,OAAQsW,EAAY,GAAGjX,IACvBkX,cAAeD,EAAY,GAAGE,UAVvB,CACL7Z,QAASA,EACTqD,OAAQ,EACRuW,cAAe,EAQlB,EAAAE,EAAAA,CAAAA,IAAAA,EA9BcL,EAAKtJ,WAAU,OAAA2J,EAAAJ,EAAAI,GAAA9e,QAAAC,QAAWwe,EAAKjJ,qBAAmBlK,KAAAoT,EA+BnE,WAAStjB,GAIP,MAHIiP,EAAejP,IACjBuP,EAAgBvP,EAAO,iBAEnBA,CACR,GACF,CAAC,MAAA8E,UAAAF,QAAAG,OAAAD,EAAA,CAAA,EAAAzE,EAEYgS,qBAAYxB,GAAmB,IAAA8S,IAAAA,EAazBhV,KAZjB,IAAKzB,MAAM6D,QAAQF,GACjB,MAAM/Q,EAAe,8BAEvB,IAAMqR,EAAiBN,EAAU7N,OAAO,SAACwY,GAAI,OAAK9N,EAAgB8N,EAAK,GACvE,GAA8B,IAA1BrK,EAAelK,OACjB,MAAMnH,EAAe,0CAEvB,IAAM8jB,EAAwB/S,EAAU5J,OAASkK,EAAelK,OAG/D,OAFG2c,EAAwB,GAC1B3X,QAAQwP,KAAgBmI,QAAAA,oDACzBhf,QAAAC,QAAA0Q,aACGsO,SAAAA,EACI5Z,GACN,IAAKA,EAAQ,MAAMnK,EAAe,sBAAsB,OAAA8E,QAAAC,QACjCwV,MAASsJ,EAAK3J,kCAAiC2J,EAAK7J,WAAc,CACvFQ,OAAQ,OACRoB,QAAS,CACP,eAAgB,oBAElBvF,KAAMrK,KAAKqP,UAAUhK,MACrBjB,KAAA,SANIqK,GAQN,IAAKA,EAASC,GACZ,MAAM1a,EAAc,qCAAsCya,EAAS/M,QACpE,OAAA5I,QAAAC,QAE0C0V,EAASE,QAAMvK,KAAA,SAApDqT,GAGN,IAAKA,GAAsC,IAAvBA,EAAYtc,OAC9B,OAAOkK,EAAe5H,IAAI,SAACiS,GAAU,MAAA,CACnC5R,QAAS4R,EACTvO,OAAQ,EACRuW,cAAe,EAChB,GAIH,IAAMM,EAAa,IAAItY,IAUvB,OATA+X,EAAY9X,QAAQ,SAAC0S,GACnB2F,EAAWlX,IAAIuR,EAAQvU,QAAS,CAC9BA,QAASuU,EAAQvU,QACjBqD,OAAQkR,EAAQ7R,IAChBkX,cAAerF,EAAQsF,UAE3B,GAGOtS,EAAe5H,IAAI,SAACiS,GACzB,OAAIsI,EAAWC,IAAIvI,GACVsI,EAAWnX,IAAI6O,GAEjB,CACL5R,QAAS4R,EACTvO,OAAQ,EACRuW,cAAe,EAEnB,EAAG,EAAA,EAAA,CAAA,IAAAQ,EA7CYL,EAAK5J,WAAU,OAAAiK,EAAAH,EAAAG,GAAApf,QAAAC,QAAW8e,EAAKvJ,qBAAmBlK,KAAA2T,EA8CnE,EAAS7jB,SAAAA,GAIP,MAHIiP,EAAejP,IACjBuP,EAAgBvP,EAAO,kBAEnBA,CACR,GACF,CAAC,MAAA8E,GAAAF,OAAAA,QAAAG,OAAAD,EAAA,CAAA,EAAAzE,EAEO4jB,sBAAA,SAAsBhiB,EAAiBgI,EAAoBwS,GAAoByH,IAAAA,OACrF,IACE,IACMC,EADOliB,EAAGoB,GAAG,SACS4G,EAAOkC,QAAQiY,MAAM,KAAK,GAEhD9a,EAAUrH,EAAGqB,QAAQiG,IAAI,SAACuB,GAAM,OAAKA,EAAO9J,aAAa,GACzDqjB,EAAgBhb,EAAqBC,GAGrCgb,EAAgBriB,EAAGqB,QAAQiG,IAAI,SAACuB,EAAQyZ,GAAO,IAAAC,EAE7CnR,EAASgR,EAAcE,GACvBze,EAAc6B,EAFLmD,EAAO9J,eAIlB4K,EAAkB,KACtB,GAAe,MAAX9F,GAAA0e,OAAWA,EAAX1e,EAAa2C,OAAb+b,EAAmBpb,QACrB,IACE,IAAMA,EAAUxI,QAAMwH,OAAOtC,EAAY2C,KAAKW,SAC1CA,IACFwC,EAAkBE,KAAKC,MAAM3C,GAEjC,CAAE,MAAOtE,IAKX,MAAO,CACL5B,MAAOqhB,EACP3a,QAASyJ,MAAAA,OAAAA,EAAAA,EAAQzJ,QACjBD,SAAU0J,MAAAA,OAAAA,EAAAA,EAAQ1J,SAClB7D,YAAa8F,EAEjB,GAGM6Y,EAAcH,EAAcI,KAAK,SAACrU,GAAC,OAAKA,EAAE1G,WAAaM,EAAOiR,QAAQ,GAG5E,GAFwBoJ,EAAcxG,KAAK,SAACzN,SAAqB,KAAfA,EAAE1G,UAAmB0G,EAAE1G,WAAaM,EAAOiR,QAAQ,GAGnG,MAAMpb,EAAe,6BAIvB,IAAM6kB,EAAmBL,EAActhB,OAAO,SAAC8H,GAC7C,IAAKA,EAAOhF,YAAa,OAAO,EAEhC,IAAM0C,EAAOsC,EAAOhF,YACpB,GAAe,WAAX0C,EAAK0D,EAAgB,SAGzB,IAAKiY,GAAc3b,EAAKnF,KAAO4G,EAAOkC,QACpC,MAAMrM,EAAc,qBAAsB0I,EAAKnF,IAIjD,IAAMiJ,EAAMD,SAAS7D,EAAK8D,IAAK,IAC/B,GAAIE,MAAMF,IAAQA,GAAO,EACvB,MAAMxM,EAAc,wBAAyB0I,EAAK8D,KAGpD,QACF,GAEA,GAAgC,IAA5BqY,EAAiB1d,OACnB,MAAMnH,EAAe,mDAIvB,IAAM8kB,EAAa,IAAIC,IAAIF,EAAiBpb,IAAI,SAAC8G,UAAOA,EAAEvK,YAAgCuC,EAAE,IACtFyc,EAAUF,EAAWb,IAAI,QAGzBgB,EAAYJ,EAAiBD,KACjC,SAACrU,GAAC,IAAA2U,EACC,MAAyC,aAAzC3U,EAAEvK,YAAgCuC,IACqB,YAAb,OAA1C2c,EAAA3U,EAAEvK,YAAgCmf,eAAQ,EAA1CD,EAA4CE,OAAmB,GAI9DC,EACJJ,GAAaT,EAAcI,KAAK,SAACrU,UAAMA,EAAEzG,UAAYlC,GAAwB2I,EAAEzG,UAAYpC,CAAiB,GAM9G,IAH2Bod,EAAWb,IAAI,cAAgBgB,GAG/BD,GAAYC,IAAcI,KAAuBV,EAC1E,MAAM3kB,EAAe,yEAGvB,IAAMslB,EAA2BT,EAAiB3hB,OAAO,SAAC8H,GACxD,IAAMtC,EAAOsC,EAAOhF,YACpB,MAAmB,aAAZ0C,EAAKH,IAAiC,SAAZG,EAAKH,IAA6B,gBAAZG,EAAKH,EAC9D,GAGA,GAAIoU,EAGF,IADA,IACyB4I,EADnBC,KAAgBnT,OAAOiT,GAA0BG,EAAAA,WAC5C,IAAA3F,EAAGyF,EAAAje,MACN8V,EAAcoI,EAAiBE,UACnC,SAAC1a,UACCA,EAAOlB,UAAYgW,EAAIhW,SACtBkB,EAAOhF,YAAgCwG,MAAQ4X,EAAKxJ,eAAekF,EAAI3S,QAAQrH,UAAU,GAG9F,IAAqB,IAAjBsX,EACF,MAAMpd,EAA+C8f,gCAAAA,EAAIhW,QAAuBgW,gBAAAA,EAAI3S,QAItFqY,EAAiBG,OAAOvI,EAAa,EACvC,EAbAwI,EAAApU,EAAkBmL,KAAO4I,EAAAK,KAAAnU,MAAAgU,IAgB3B,OACF,CAAA,CAAE,MAAOvlB,GAIP,OAHIiP,EAAejP,IACjBuP,EAAgBvP,EAAO,8BAElB,CACT,CACF,EAACK,EAEYslB,eAAA,SAAeC,EAAenJ,OAAoBoJ,IAAAA,EAE5ClX,KAAI,OAAA/J,QAAAC,QAAA0Q,EADjB,WAAA,SAAAuQ,EACI7b,GAAM,IAAA8b,EACZ,IAAK9b,EAAQ,MAAMnK,EAAe,sBAClC,IAAMmC,EAAK2I,EAAAA,YAAYC,QAAQ+a,GAG/B,IAFgBC,EAAK5B,sBAAsBhiB,EAAIgI,EAAQwS,GAEzC,OAAY,EAE1B,IACM0H,EADOliB,EAAGoB,GAAG,SACS4G,EAAOkC,QAAQiY,MAAM,KAAK,GAAG4B,EAAA,WAAA,IAGpD7B,EAAU,OAAAvf,QAAAC,QACWghB,EAAKI,yBAAyBhkB,EAAIgI,IAAOiG,KAAA,SAA3DgW,GACN,IAAMC,EAAaN,EAAKO,0BAA0BnkB,EAAIgI,GAAQ,GAE1Dic,EAAUG,QAAUF,EAAWE,MAAK,OAAAN,EAAA,GAC1B,CAAA,EAAA,CARyC,GAQzC,OAAAC,GAAAA,EAAA9V,KAAA8V,EAAA9V,KAAAoW,SAAAA,GAAAP,OAAAA,GAAAO,CAIL,IAAAP,GAAAC,CAAA,CAAA,IAAAO,EApBIV,EAAK9L,kBAAUwM,EAAAT,EAAAS,GAAA3hB,QAAAC,QAAWghB,EAAKzL,qBAAmBlK,KAAA4V,EAqBnE,EAAC,SAAQ9lB,GAIP,OAHIiP,EAAejP,IACjBuP,EAAgBvP,EAAO,8BAElB,CACT,GACF,CAAC,MAAA8E,GAAAF,OAAAA,QAAAG,OAAAD,EAAAzE,CAAAA,EAAAA,EAEammB,aAAY,SACxB3V,EACA4V,EACAC,EACArL,OAAsBsL,IAAAA,EAKfhY,KAAI/J,OAAAA,QAAAC,QAAA0Q,EAHP,WACF,IAAMqR,EAAe1Z,MAAM6D,QAAQF,GAAaA,EAAY,CAACA,GAAW,OAAAjM,QAAAC,QACjDwV,MAClBsM,EAAK3M,QAAO,uBAAuB2M,EAAK7M,YAAa2M,EAAqBA,SAAAA,EAAc,KACzFC,EAAkBA,UAAAA,EAAU,KAC3BrL,YAAkBA,EAAU,IAC/B,CACEf,OAAQ,OACRoB,QAAS,CAAE,eAAgB,oBAC3BvF,KAAMrK,KAAKqP,UAAUyL,MAExB1W,KATKqK,SAAAA,GAUN,GAAwB,MAApBA,EAAS/M,QAAsC,MAApB+M,EAAS/M,OACtC,MAAM1N,EAAe,mBAEvB,IAAKya,EAASC,GAAI,MAAM1a,EAAsCya,uBAAAA,EAAS/M,QAAU,OAAA5I,QAAAC,QAClD0V,EAASE,QAAMvK,cAAxCnP,GAQN,OALuB6lB,EAAard,IAAI,SAACK,GACvC,IAAMid,EAAgB9lB,EAAKiC,OAAO,SAACgH,GAAI,OAAKA,EAAKG,QAAQC,SAASR,IAAYI,EAAK8c,UAAU1c,SAASR,EAAQ,GAC9G,MAAO,CAAEA,QAAAA,EAASmd,MAAOF,EAC3B,EAEsB,IACxB,EAAC,SAAQ7mB,GAIP,MAHIiP,EAAejP,IACjBuP,EAAgBvP,EAAO,eAEnBA,CACR,GACF,CAAC,MAAA8E,GAAA,OAAAF,QAAAG,OAAAD,EAAA,CAAA,EAAAzE,EAEY2mB,mBAAkB,SAC7Bpd,EACA6c,EACAC,EACArL,GAAsB,IAAA4L,IAAAA,EA0BLtY,KAxBjB,IAAKjB,EAAgB9D,GAEnB,MADc9J,8BAA2C8J,GAI3D,QAAkBzJ,IAAdsmB,IACuB,iBAAdA,GAA0BA,EAAY,IAAMla,OAAOuP,SAAS2K,IACrE,MAAM3mB,EAAqC2mB,sBAAAA,sCAI/C,QAActmB,IAAVumB,IACmB,iBAAVA,GAAsBA,GAAS,IAAMna,OAAOwP,UAAU2K,IAC/D,MAAM5mB,EAAc,kBAAmB4mB,EAAK,gCAIhD,QAAcvmB,IAAVkb,GACY,QAAVA,GAA6B,SAAVA,EACrB,MAAMvb,EAAiCub,kBAAAA,EAAgC,6BAE1E,OAAAzW,QAAAC,QAAA0Q,EAAA,WAEG2R,SAAAA,EACIjd,GACN,IAAKA,EAAQ,MAAMnK,EAAe,sBAAsB,OAAA8E,QAAAC,QAE3BoiB,EAAKT,aAAa5c,EAAS6c,EAAWC,EAAOrL,IAAMnL,KAA1EiX,SAAAA,GACN,IAAQJ,EAAUI,EAAe,GAAzBJ,MAER,IAAKA,GAA0B,IAAjBA,EAAM9f,OAAc,MAAO,CAAE2C,QAAAA,EAASwd,QAAS,GAAIC,UAAWZ,GAAa,GAGzF,IADA,IACwBa,EADlBC,EAAyB,GAC/BC,EAAAlW,EAAmByV,KAAKO,EAAAE,KAAAjW,MAAE,CAAA,IAClBkW,EAAc1d,EADPud,EAAAlgB,MACkCwC,EAASK,GACpDwd,GACFF,EAAU9V,KAAKgW,EAEnB,CAEA,IAAMJ,EAAYE,EAAUtgB,OAAS,EAAIsgB,EAAUA,EAAUtgB,OAAS,GAAGwG,MAAQgZ,GAAa,EAAE,OAE5FC,GAASa,EAAUtgB,OAASyf,EACvB,CACL9c,QAAAA,EACAwd,QAASG,EAAUlP,MAAM,EAAGqO,GAC5BW,UAAAA,GAIG,CACLzd,QAAAA,EACAwd,QAASG,EACTF,UAAAA,EACD,OAAAK,EA9BcT,EAAKlN,kBAAU2N,EAAAR,EAAAQ,GAAA9iB,QAAAC,QAAWoiB,EAAK7M,qBAAmBlK,KAAAgX,EA+BnE,EAAC,SAAQlnB,GAIP,MAHIiP,EAAejP,IACjBuP,EAAgBvP,EAAO,6BAEnBA,CACR,GACF,CAAC,MAAA8E,GAAA,OAAAF,QAAAG,OAAAD,EAAA,CAAA,EAAAzE,EAEYqS,qBAAoB,SAACF,GAA8B,IAAA,IAAAmV,EA8C7ChZ,KA7CjB,IAAKzB,MAAM6D,QAAQyB,GACjB,MAAM1S,EAAe,+BAGvB,GAAsB,IAAlB0S,EAAOvL,OACT,MAAMnH,EAAe,8CAIvB,IAAM8nB,EAAcpV,EAAOxP,OAAO,SAAC2P,UAAUA,GAASA,EAAM/I,SAAW8D,EAAgBiF,EAAM/I,QAAQ,GAErG,GAA2B,IAAvBge,EAAY3gB,OACd,MAAMnH,EAAe,0CAGvB,IAAM8jB,EAAwBpR,EAAOvL,OAAS2gB,EAAY3gB,OACtD2c,EAAwB,GAC1B3X,QAAQwP,aAAgBmI,EAAqB,kDAG/C,IAAA,IAA+BnE,EAA/BE,EAAArO,EAAoBsW,KAAWnI,EAAAE,KAAApO,MAAE,CAAtB,IAAAoB,EAAK8M,EAAArY,MACd,QAAwBjH,IAApBwS,EAAM8T,YACuB,iBAApB9T,EAAM8T,WAA0B9T,EAAM8T,UAAY,IAAMla,OAAOuP,SAASnJ,EAAM8T,YACvF,MAAM3mB,mCAC6B6S,EAAM/I,QAAY+I,KAAAA,EAAM8T,UAAS,oCAKxE,QAAoBtmB,IAAhBwS,EAAM+T,QACmB,iBAAhB/T,EAAM+T,OAAsB/T,EAAM+T,OAAS,IAAMna,OAAOwP,UAAUpJ,EAAM+T,QACjF,MAAM5mB,EAAc,6BACW6S,EAAM/I,QAAY+I,KAAAA,EAAM+T,MAAK,gCAKhE,QAAoBvmB,IAAhBwS,EAAM0I,OACY,QAAhB1I,EAAM0I,OAAmC,SAAhB1I,EAAM0I,MACjC,MAAMvb,EAAc,6BAA8B6S,EAAM/I,QAAO,KAAK+I,EAAM0I,kCAGhF,CAAC,OAAAzW,QAAAC,QAAA0Q,EAEG,WAAA,SAAAsS,EACI5d,GACN,IAAKA,EAAQ,MAAMnK,EAAe,sBAGlC,IAAMgoB,EAAwD,CAAE,EAChEF,EAAYnc,QAAQ,SAACkH,GACnB,IAAMxL,GAASwL,EAAM8T,WAAa,GAAC,KAAI9T,EAAM+T,OAAS,KAAG,KAAI/T,EAAM0I,OAAS,WACvEyM,EAAc3gB,KACjB2gB,EAAc3gB,GAAO,IAEvB2gB,EAAc3gB,GAAKsK,KAAKkB,EAC1B,GAGA,IAAMoV,EAAgBhhB,OAAOC,QAAQ8gB,GAAeve,aAAGye,GAAA,IAAS7gB,EAAG6gB,EAAA,GAAEC,EAAaD,EAAK,GAAA,IACrF,IAAAE,EAA2C/gB,EAAIid,MAAM,KAAhC+D,EAAQD,EAAEE,GAAAA,EAAQF,EACvC,GAAMzB,EAAYla,OADC2b,MAEbxB,EAAQna,OAAO4b,GACf9M,EAAqB,YAAb+M,OAAyBjoB,EAAaioB,EAC9CvX,EAAYoX,EAAc1e,IAAI,SAAC2C,UAAMA,EAAEtC,OAAO,GAAE,OAAAhF,QAAAC,QAEzB8iB,EAAKnB,aAAa3V,EAAW4V,EAAWC,EAAOrL,IAAMnL,cAA5EiX,GAGN,OAAOA,EAAe5d,IAAI,SAAA8e,GAAuB,IAApBze,EAAOye,EAAPze,QAASmd,EAAKsB,EAALtB,MAC9BpU,EAAQsV,EAAcnK,KAAK,SAAC5R,GAAC,OAAKA,EAAEtC,UAAYA,CAAO,GAC7D,IAAKmd,GAA0B,IAAjBA,EAAM9f,OAClB,MAAO,CACL2C,QAAAA,EACAwd,QAAS,GACTC,WAAgB,MAAL1U,OAAK,EAALA,EAAO8T,YAAa,GAOnC,IAHA,IAGwB6B,EAHlBf,EAAyB,GACzBgB,EAAY,IAAI1D,IAEtB2D,EAAAlX,EAAmByV,KAAKuB,EAAAE,KAAAjX,MAAE,KAClBkW,EAAc1d,EADPue,EAAAlhB,MACkCwC,EAASK,GACpDwd,IAAgBc,EAAUxE,IAAI0D,EAAYla,QAC5Cgb,EAAUE,IAAIhB,EAAYla,MAC1Bga,EAAU9V,KAAKgW,GAEnB,CAEA,IAAMJ,EAAYE,EAAUtgB,OAAS,EAAIsgB,EAAUA,EAAUtgB,OAAS,GAAGwG,OAAQkF,MAAAA,OAAAA,EAAAA,EAAO8T,YAAa,EAC/FiC,QAAa/V,SAAAA,EAAO+T,MAE1B,OAAIgC,GAAcnB,EAAUtgB,OAASyhB,EAC5B,CACL9e,QAAAA,EACAwd,QAASG,EAAUlP,MAAM,EAAGqQ,GAC5BrB,UAAAA,GAIG,CACLzd,QAAAA,EACAwd,QAASG,EACTF,UAAAA,EAEJ,EAAG,EACL,CAAC,MAAAviB,GAAA,OAAAF,QAAAG,OAAAD,EAAC,CAAA,GAAC,OAAAF,QAAAC,QAGmBD,QAAQoS,IAAI+Q,IAAc7X,cAA1CoD,GACN,OAAOA,EAAQqV,MAAO,EAAA,CAAA,IAAAC,EAlEPjB,EAAK5N,kBAAU6O,EAAAf,EAAAe,GAAAhkB,QAAAC,QAAW8iB,EAAKvN,qBAAmBlK,KAAA2X,EAmEnE,EAAC,SAAQ7nB,GAIP,MAHIiP,EAAejP,IACjBuP,EAAgBvP,EAAO,+BAEnBA,CACR,GACF,CAAC,MAAA8E,GAAA,OAAAF,QAAAG,OAAAD,EAAA,CAAA,EAAAzE,EAWOwoB,qBAAA,SAAqBjhB,GAC3B,IAAIkhB,IAAAA,EACIhjB,EAAc6B,EAAiBC,GAC/BwB,EAAqB,MAAXtD,GAAAgjB,OAAWA,EAAXhjB,EAAa2C,WAAbqgB,EAAAA,EAAmB1f,QACnC,IAAKA,EAAS,OAAW,KAEzB,IAAMwC,EAAkBhL,QAAMwH,OAAOgB,GACrC,OAAKwC,EAEEE,KAAKC,MAAMH,OACpB,CAAE,MAAO5L,GAIP,OAHIiP,EAAejP,IACjBuP,EAAgBvP,EAAO,0BAG3B,IAAA,CACF,EAACK,EAEO0oB,qBAAA,SAAqBxb,EAAcpB,EAAiBxC,EAAkBC,GAE5E,OAAI2D,IAAShG,EAAc6c,MAAM,KAAK,GAAW,aAC7C7W,IAAS9F,EAAiB2c,MAAM,KAAK,GAAW,UAGhDjY,IAAY5E,GJ1oCS,uEI0oCQoC,EACxB,aAILwC,IAAY1E,GJxoCY,uEIwoCQkC,EAC3B,UAIQ,KAAbA,GAAmBC,IAAYpC,EAC1B,aAKA,SAKX,EAACnH,EAEO2oB,yBAAA,SACNxZ,EACA5F,EACA2D,EACA0b,EACA9c,GAGA,MAAkB,SAAdqD,EAA6B,OAGf,gBAAdA,GAA+B5F,IAAYqf,EAEtC1b,IAASpB,EAAQiY,MAAM,KAAK,GAAK,SAAW,OAIjDxa,IAAYpC,GAAqBoC,IAAYlC,EACxC,OAIF,UACT,EAACrH,EAEa4lB,yBAAA,SAAyBhkB,EAAiBgI,GAAkB,IAAA,IAIpEgQ,EACAtT,EALoEuiB,EAgBnBva,KAf/CpB,EAAOtL,EAAGoB,GAAG,OACbP,EAA2B,IAAIoK,MAAMjL,EAAGa,OAAOmE,QACjDof,EAAQ8C,OAAO,GAKbnU,EAAc,IAAIC,EAAY,EAAG,KAEjCmU,EAAannB,EAAGa,OAAOyG,IAAW1G,SAAAA,EAAOK,GAAS,IACtD,OAEC0B,QAAAC,QAFIhC,EAAMM,WAEVoS,aAEG3Q,OAAAA,QAAAC,QACqBmQ,EAAYiD,QAAQ,kBAAMiR,EAAKjN,WAAWpZ,EAAMM,WAAY,IAAC+M,cAA9EmZ,GACN,MAAO,CAAEnmB,MAAAA,EAAOmmB,SAAAA,EAAW,EAC7B,EAAC,SAAQrpB,GAIP,OAHIiP,EAAejP,IACjBuP,EAAgBvP,EAAO,4BAElB,CAAEkD,MAAAA,EAAOmmB,SAAU,KAC5B,GAXS,CAAEnmB,MAAAA,EAAOmmB,SAAU,MAY9B,CAAC,MAAAvkB,GAAAF,OAAAA,QAAAG,OAAAD,EAAA,CAAA,GAAE,OAAAF,QAAAC,QAEmBD,QAAQoS,IAAIoS,IAAWlZ,KAAvCoD,SAAAA,GAEN,IAAAgW,IAAyCC,EAAzCD,EAAAhY,EAAkCgC,KAAOiW,EAAAD,KAAA/X,MAAE,CAAAiY,IAAAA,EAAAD,EAAAniB,MAA9BlE,EAAKsmB,EAALtmB,MAAOmmB,EAAQG,EAARH,SACZxmB,EAAQZ,EAAGa,OAAOI,GACxB,GAAKmmB,GAAaxmB,EAAMM,WAAxB,CAWA,IAAMsmB,EAAeJ,EAAS/lB,QAAQT,EAAMU,mBACtCmmB,EAAiBrgB,EAAqB,CAACogB,EAAazoB,gBAAgB,GACpE8E,EAAcojB,EAAKL,qBAAqBY,EAAazoB,eAErD2oB,EAAiC,CACrC/f,QAAS8f,MAAAA,OAAAA,EAAAA,EAAgB9f,QACzBqD,OAAQnH,EAAcuG,SAASvG,EAAYwG,KAAO,EAClD9I,SAAU+I,OAAOkd,EAAajmB,UAC9BsC,YAAAA,EACA6D,SAAU+f,GAGZ5mB,EAAOI,GAASymB,EAEZ7jB,GAAe4jB,IACjBrD,GAAS8C,OAAOrjB,EAAYwG,KAGvB2N,IACHA,EAAciP,EAAKH,qBACjBxb,EACAzH,EAAYzC,GACZqmB,EAAe/f,UAAY,GAC3B+f,EAAe9f,SAAW,KAKzBjD,IACHA,EAAOuiB,EAAKF,yBACVljB,EAAYuC,GACZqhB,EAAe9f,SAAW,GAC1B2D,EACAtD,EAAOgf,YACPhf,EAAOkC,UApCb,MARErJ,EAAOI,GAAS,CACd0G,aAASzJ,EACT8M,OAAQ,EACRzJ,SAAU,EACVsC,YAAa,KACb6D,cAAUxJ,EA2ChB,CAEA,MAAO,CAAE2C,OAAAA,EAAQujB,MAAAA,EAAOpM,YAAAA,EAAatT,KAAAA,EAAO,EAC9C,CAAC,MAAA7B,UAAAF,QAAAG,OAAAD,KAAAzE,EAEO+lB,0BAAA,SAA0BnkB,EAAiBgI,GAOjD,IANA,IAGIgQ,EACAtT,EAJE4G,EAAOtL,EAAGoB,GAAG,OACbC,EAA6B,GAC/B+iB,EAAQ8C,OAAO,GAIVnhB,EAAI,EAAGA,EAAI/F,EAAGqB,QAAQ2D,OAAQe,IAAK,CAC1C,IAAM8C,EAAS7I,EAAGqB,QAAQ0E,GAEpB0hB,EAAiBrgB,EAAqB,CAACyB,EAAO9J,gBAAgB,GAC9D8E,EAAc6I,KAAKka,qBAAqB/d,EAAO9J,eAE/C4oB,EAAmC,CACvChgB,cAAS8f,SAAAA,EAAgB9f,QACzBqD,OAAQnH,EAAcuG,SAASvG,EAAYwG,KAAO,EAClD9I,SAAU+I,OAAOzB,EAAOtH,UACxBsC,YAAAA,EACA6D,SAAU+f,GAKZ,GAFApmB,EAAQmO,KAAKmY,GAET9jB,GAAe4jB,EAAgB,CACjCrD,GAAS8C,OAAOrjB,EAAYwG,KAE5B2N,EAActL,KAAKoa,qBACjBxb,EACAzH,EAAYzC,GACZqmB,EAAe/f,UAAY,GAC3B+f,EAAe9f,SAAW,IAG5B,IAAMigB,EAAalb,KAAKqa,yBACtBljB,EAAYuC,GACZqhB,EAAe9f,SAAW,GAC1B2D,EACAtD,EAAOgf,YACPhf,EAAOkC,SAGU,SAAf0d,GAAwC,WAAfA,EAC3BljB,EAAOkjB,EACGljB,IACVA,EAAOkjB,EAEX,CACF,CAEA,MAAO,CAAEvmB,QAAAA,EAAS+iB,MAAAA,EAAOpM,YAAAA,EAAatT,KAAAA,EACxC,EAACtG,EAEOypB,oBAAA,SACN7f,EACAhI,EACA0E,EACAojB,EACAC,GAGA,QADoBrb,KAAKsV,sBAAsBhiB,EAAIgI,KAEtC,WAATtD,GAEGojB,IAAeC,EACxB,EAAC3pB,EAEO4pB,mBAAA,SACN1c,EACA0M,EACAtT,EACAuf,EACAC,EACApY,EACA9L,EACA6O,GAEA,IAcMoZ,EAAgC,CACpC3c,KAAAA,EACA0M,YAAAA,EACAtT,KAAAA,EACA7D,OAlBsCojB,EAAUpjB,OAC/CE,OAAO,SAACH,UAAUA,EAAMiD,aAAejD,EAAM+G,OAAO,GACpDL,IAAI,SAAC1G,GAAK,MAAM,CACf+G,QAAS/G,EAAM+G,QACfqD,OAAQpK,EAAMoK,OACf,GAcD3J,QAZuC6iB,EAAW7iB,QACjDN,OAAO,SAAC8H,GAAM,OAAKA,EAAOhF,aAAegF,EAAOlB,OAAO,GACvDL,IAAI,SAACuB,GAAM,MAAM,CAChBlB,QAASkB,EAAOlB,QAChBqD,OAAQnC,EAAOmC,OAChB,GAQDc,QAAAA,EACAgc,WAAY7D,EAAUG,MAAMzgB,WAC5BokB,YAAa7D,EAAWE,MAAMzgB,YAGhC,OAAIkL,MAAAA,GAAAA,EAASqZ,WACWlY,EAAA,CAAA,EACjBiY,EACHE,CAAAA,IAAK,CACH1f,MAAOzI,EAAGuD,QACV1C,OAAQb,EAAGa,OAAOyG,IAAI,SAAC1G,EAAOK,OAASmnB,EAC/BV,EAAiBzD,EAAUpjB,OAAOI,GACxC,MAAO,CACLqK,KAAM1K,EAAMM,YAAc,GAC1Bmf,KAAMzf,EAAMU,kBACZ+mB,WAAgC,OAArBD,EAAAxnB,EAAM2f,sBAAe,EAArB6H,EAAuB7kB,UAAW,GAC7C1B,SAAUjB,EAAMiB,UAAY,WAC5B8F,cAAS+f,SAAAA,EAAgB/f,QACzBpG,UAAwB,MAAdmmB,OAAc,EAAdA,EAAgBnmB,WAAY,EACtC+mB,UAAyB,MAAdZ,GAAAA,EAAgB7jB,YAAc,CAAEmH,OAAQ0c,EAAe1c,aAAW9M,EAEjF,GACAmD,QAASrB,EAAGqB,QAAQiG,IAAI,SAACuB,EAAQ5H,GAC/B,IAAM0mB,EAAkBzD,EAAW7iB,QAAQJ,GAC3C,MAAO,CACLkE,MAAOmF,OAAOzB,EAAOtH,UACrBgnB,aAAc1f,EAAO9J,cAAcwE,QACnCoE,QAASggB,MAAAA,OAAAA,EAAAA,EAAiBhgB,QAC1B2gB,UAAWX,MAAAA,GAAAA,EAAiB9jB,YAAc,CAAEmH,OAAQ2c,EAAgB3c,aAAW9M,EAEnF,MAMC+pB,CACT,EAAC7pB,EAEaoqB,0BACZxoB,EACAgI,EACA6G,GAAsB,QAAA4Z,EAIE/b,KAFlBpB,EAAOtL,EAAGoB,GAAG,OAAO,OAAAuB,QAAAC,QAEF6lB,EAAKzE,yBAAyBhkB,EAAIgI,IAAOiG,KAAA,SAA3DgW,GACN,IAAMC,EAAauE,EAAKtE,0BAA0BnkB,EAAIgI,GAEhDgQ,EAAckM,EAAWlM,aAAeiM,EAAUjM,aAAe,UAEnEtT,EAAOwf,EAAWxf,MAAQuf,EAAUvf,MAAQ,WAEnC,aAATA,GAC0Buf,EAAUpjB,OAAO4hB,KAC3C,SAAC7hB,GAAK,OAAKA,EAAMiD,cAAgBjD,EAAM+G,UAAYpC,GAAqB3E,EAAM+G,UAAYlC,EAAqB,KAI/Gf,EAAO,QAME,aAATA,GAAgC,SAATA,GACDwf,EAAW7iB,QAAQohB,KAAK,SAAC5Z,GAAM6f,IAAAA,QAA8C,YAAvB,OAAlBA,EAAA7f,EAAOhF,qBAAW6kB,EAAlBA,EAAoB1F,iBAApB0F,EAA8BzF,OAAmB,KAG3Gve,EAAO,UAM2B,IADPuf,EAAUpjB,OAAOE,OAAO,SAACH,UAAUA,EAAMiD,WAAW,GACxDmB,QAAgBif,EAAUpjB,OAAOmE,OAAS,IACnEN,EAAO,UAGT,IAAMoH,EAAU2c,EAAKZ,oBAAoB7f,EAAQhI,EAAI0E,EAAMuf,EAAUG,MAAOF,EAAWE,OAEvF,OAAOqE,EAAKT,mBAAmB1c,EAAM0M,EAAatT,EAAMuf,EAAWC,EAAYpY,EAAS9L,EAAI6O,EAAS,EACvG,CAAC,MAAAhM,GAAAF,OAAAA,QAAAG,OAAAD,EAAA,CAAA,EAAAzE,EAEYuS,QAAA,SAAQrF,EAAcuD,GAAsB,IAAA8Z,IAAAA,EAAAA,SAMjD3gB,GACN,IAAKA,EAAQ,MAAMnK,EAAe,sBAAsB,OAAA8E,QAAAC,QACvCgmB,EAAK5O,WAAW1O,IAAK2C,cAAhCjO,GACN,IAAKA,EAAI,MAAMnC,EAAe,+BAA+B,OAAA8E,QAAAC,QAChDgmB,EAAKJ,iBAAiBxoB,EAAIgI,EAAQ6G,OAAQ+Z,EAJxClc,KAJf,IAAKpB,GAAwB,iBAATA,GAAqC,KAAhBA,EAAKjH,SAD7B,oBACwDkL,KAAKjE,GAC5E,MAAMzN,EAAe,sCACtB,IAAAgrB,EAEcD,EAAK9Q,WAAU,OAAAnV,QAAAC,QAAAimB,EAAAF,EAAAE,GAAAlmB,QAAAC,QAAWgmB,EAAKzQ,qBAAmBlK,KAAA0a,GAKnE,CAAC,MAAA9lB,GAAAF,OAAAA,QAAAG,OAAAD,EAAA,CAAA,EAAAzE,EAEY0qB,iBAAA,SACXC,EACAla,GAAsB,IAAAma,IAAAA,EAAAA,SAShBhhB,GACN,IAAKA,EAAQ,MAAMnK,EAAe,sBAAsB,OAAA8E,QAAAC,QAC3CqmB,EAAKT,iBAAiBxoB,EAAIgI,EAAQ6G,GAAQ,EAAAoa,EAFxCvc,KAPf,IAAKqc,GAAgC,iBAAbA,GAA6C,KAApBA,EAAS1kB,OACxD,MAAMxG,EAAe,uCAEvB,IHrpCsB,SAACygB,GACzB,IAEE,QADiB,iBACH/O,KAAK+O,KAGnB3V,EAAAA,YAAYC,QAAQ0V,IAEtB,EAAA,CAAE,MAAOvgB,GACP,OAAO,CACT,CACF,CG0oCSmrB,CAAWH,GACd,MAAMlrB,EAAe,+BAEvB,IAAMmC,EAAK2I,EAAAA,YAAYC,QAAQmgB,GAAUI,EAC1BF,EAAKnR,kBAAUnV,QAAAC,QAAAumB,EAAAH,EAAAG,GAAAxmB,QAAAC,QAAWqmB,EAAK9Q,qBAAmBlK,KAAA+a,GAGnE,CAAC,MAAAnmB,GAAA,OAAAF,QAAAG,OAAAD,EAAA,CAAA,EAAAzE,EAEMsH,iBAAA,SAAiBC,GACtB,OAAOD,EAAiBC,EAC1B,EAACvH,EAEMgJ,qBAAA,SAAqBC,GAC1B,OAAOD,EAAqBC,EAC9B,EAACjJ,EAEOgrB,qBAAA,SAAqBvoB,GAE3B,IADA,IAC0BwoB,EADpBC,EAAW,IAAI1G,IACrB2G,EAAAla,EAAoBxO,KAAMwoB,EAAAE,KAAAja,MAAE,KAAjB1O,EAAKyoB,EAAAlkB,MACRqkB,EAAc5oB,EAAM0K,KAAI,IAAI1K,EAAMyf,KACxC,GAAIiJ,EAASxH,IAAI0H,GACf,MAAO,CAAEzrB,mCAAoCyrB,EAAQ,uCAEvDF,EAAS9C,IAAIgD,EACf,CACA,MAAO,CACT,CAAA,EAACprB,EAEaqrB,gCACZzpB,EACAa,EACAie,GAAoC,IAAA,IA6BjB4K,EA7BiBC,EAAA,SAAAC,GAAA,OAAAF,EAAAE,EA6B7B,CAAEtK,SAAAA,EAAU,EAAAuK,EAvBend,KAJ9B4S,EAAW,EAAEwK,EAAAnS,EAEG9W,EAAM,SAAjBkF,GACP,IAAMnF,EAAQC,EAAOkF,GAAG,OAAApD,QAAAC,QACQinB,EAAK7P,WAAWpZ,EAAM0K,OAAK2C,KAArD9M,SAAAA,GACN,IAAKA,EAC6F4oB,OAAAL,EAAAK,EAAzF,CAAEzK,SAAU,EAAGvhB,MAA8C6C,uCAAAA,EAAM0K,SAAQ1K,EAAMyf,MAE1F,IAAMxX,EAAS1H,EAAkBE,QAAQT,EAAMyf,MAC/C,IAAKxX,EAAoG,OAAA6gB,EAAA,EAArF,CAAEpK,SAAU,EAAGvhB,gBAAiB6C,EAAMyf,KAAiCzf,6BAAAA,EAAM0K,MAEjG,IAAMzH,EAAcgmB,EAAKjD,qBAAqB/d,EAAO9J,eACrD,IAAK8E,EAAwG,OAAA6lB,EAAA,EAApF,CAAEpK,SAAU,EAAGvhB,MAAK,kCAAoC6C,EAAM0K,KAAQ1K,IAAAA,EAAMyf,MAErG,IAAM2J,EAAc5f,SAASvG,EAAYwG,KACzCiV,GAAY0K,EAEZlL,EAAYnU,IAAI5E,EAAGiG,EAAAA,WAAWC,QAAQrL,EAAMiL,MAE5C7L,EAAGsgB,SAAS,CACVpf,WAAYN,EAAM0K,KAClBhK,kBAAmBV,EAAMyf,KACzBlf,kBAAAA,EACAof,gBAAiB,IAAI/d,EACtBA,iBAAE,EACL,EAACknB,WAAAA,OAAAA,CAAA,GAAA/mB,OAAAA,QAAAC,QAAAknB,GAAAA,EAAA7b,KAAA6b,EAAA7b,KAAA0b,GAAAA,EAAAG,GAGH,CAAC,MAAAjnB,GAAAF,OAAAA,QAAAG,OAAAD,KAAAzE,EAEO6rB,0BAAA,SACN3K,EACA5D,EACA+D,EACAyK,EACAliB,EACAmiB,GAKA,IALsBC,IA6CrBC,EA7CqBD,EAEtB1d,KAAIrD,EAAM,EACNihB,GAAe,EAAEC,EAAA,WAEO,IAAAC,EAC1BF,EAAcjhB,EAEd,IAAMohB,EAAcnL,EAAW5D,EAAyBrS,EAGpDqhB,EAA4B,EAChC,GAAID,EAAc,EAChB,GAA6B,iBAAlBhL,EAEJyK,EAAepI,IAAIrC,KACtBiL,EAA4BD,WAErBxf,MAAM6D,QAAQ2Q,GAEvB,IAAA,IAAwCkL,EAAxCC,EAAAvb,EAA2BoQ,KAAakL,EAAAC,KAAAtb,MAAE,CAA/B,IAAAub,EAAYF,EAAAxlB,MACf2lB,EAAeV,EAAK3R,eAAeoS,EAAa7f,QACjDkf,EAAepI,IAAI+I,EAAaljB,WACnC+iB,GAA6BI,EAEjC,MAGAJ,EAA4B,EAKhC,IAAMK,EAAsBrP,EAAyBgP,EAG/CM,OAC6D9sB,IAAjEisB,EAAWtO,KAAK,SAAC8B,UAAQA,EAAIhW,UAAYK,EAAOiY,WAAW,GACvD,SAACuK,EACDxiB,EAAO4T,KAAKC,KACV,SAACC,GAA+B,OAAKiP,GAAuBjP,EAAEzB,KAAO0Q,GAAuBjP,EAAEjJ,GAAG,WADnG2X,EAEGnhB,IAET,QAAenL,IAAX8sB,EAAoB7c,MAAAA,CAAAA,EAAS,CAAE9E,IAAK,EAAGtL,MAAO,0BAClDsL,EAAM2hB,CACR,EAxCO3hB,IAAQihB,GAAWD,GAAAA,EAAAE,WAAAF,EAAAlc,EA0C1B,MAAO,CAAE9E,IAAAA,EACX,EAACjL,EAEa6sB,0BACZjrB,EACAqf,EACAI,EACAX,EACA9W,EACAsX,EACA5D,EACArS,GAAW,IAAA,IAiDF6hB,EAjDEC,EAAA,SAAAC,GAAA,OAAAF,EAAAE,EAiDJ,CAAE,CAAA,EAAAC,EA3CY3e,KAJrB,GAAI2S,GAAU,EAAG,OAAA1c,QAAAC,QAAO,CAAA,GAAG,IAAA0oB,EAAA,WAAA,GAEE,iBAAlB7L,EAA0B8L,CAAAA,IAAAA,EAEnCvrB,EAAG2e,UAAShc,OAAAA,QAAAC,QAAOyoB,EAAKxS,kBAAkB4G,EAAeJ,EAAQrX,IAAOiG,KAAA,SAAAud,GAAxED,EAAA9e,KAAAzM,EAAEwrB,EAAwE,yBACjEvgB,MAAM6D,QAAQ2Q,IAsCvB,IAAMgM,EAAuB3M,EAAYpU,IAAI,GAAI0Q,YAAYsQ,EAC7D1rB,EAAG2e,UAAS,OAAAhc,QAAAC,QAAOyoB,EAAKxS,kBAAkB4S,EAAsBpM,EAAQrX,IAAOiG,cAAA0d,GAA/ED,EAAAjf,KAAAzM,EAAE2rB,EAA+E,EAAAhpB,CArCjF,GAA6B,IAAzB8c,EAAcza,OAIf,OAAAkmB,EAAA,EAHM,CACLntB,MACE,4GAIN,IAAM6tB,EAAsBnM,EAAcnY,IAAI,SAACukB,GAAC,MAAM,CACpDlkB,QAASkkB,EAAElkB,QACXqD,OAAQqgB,EAAK5S,eAAeoT,EAAE7gB,QAC/B,GAEK8gB,EAAYF,EAAoBxgB,OAAO,SAACC,EAAKwgB,UAAMxgB,EAAMwgB,EAAE7gB,MAAM,EAAE,GACzE,GAAI8gB,IAAczM,EAAQ,CACxB,IAAM0M,EAAgBV,EAAKzS,iBAAiByG,GACtC2M,EAAmBX,EAAKzS,iBAAiBkT,GAAWG,EACnD,CACLluB,MAAK,8BAAgCguB,EAAkB1M,KAAAA,EAAuCgM,iCAAAA,EAAKzS,iBACjG0G,wBACoB+L,EAAKzS,iBAAiB8C,GAAuB,WAAW2P,EAAKzS,iBACjFvP,GACK0iB,MAAAA,kCAA6CC,EAAgB,KAAKF,EAAS,mBACnFG,OAAAf,EAAAe,EAAAA,CACH,CAEA,IAAAC,IAAwCC,EAAxCD,EAAA7c,EAA2BoQ,KAAa0M,EAAAD,KAAA5c,MAAE,KAA/Bub,EAAYsB,EAAAhnB,MACrB,GAAI0lB,EAAa7f,QAAU,EAC2D,OAAAkgB,EAAA,EAA7E,CAAEntB,gCAAiC8sB,EAAa7f,OAA2B,sBAEtF,CAAC,IAAAohB,EAAAzX,EAE0BiX,EAAmB,SAAnCf,GAAqC,IAAAwB,EAC9CrsB,EAAG2e,UAAShc,OAAAA,QAAAC,QAAOyoB,EAAKxS,kBAAkBgS,EAAaljB,QAASkjB,EAAa7f,OAAQhD,IAAOiG,KAAAqe,SAAAA,GAA5FD,EAAA5f,KAAAzM,EAAEssB,EAA4F,EAChG,GAACF,OAAAA,GAAAA,EAAAne,KAAAme,EAAAne,wBAAAme,CAIgFzpB,GAAAA,CA5CxD,GA4CwDA,OAAAA,QAAAC,QAAA0oB,GAAAA,EAAArd,KAAAqd,EAAArd,KAAAkd,GAAAA,EAAAG,GAIrF,CAAC,MAAAzoB,UAAAF,QAAAG,OAAAD,EAAAzE,CAAAA,EAAAA,EAEa2gB,uBAAc/e,EAAiB8e,GAAoC,IAAA,IAqCrEyN,EArCqEC,EAAA,SAAAC,MAAAF,EAAA,OAAAE,EA+B/E,IAAA,IAAyCC,EAAzCC,EAAAtd,EAA0Bud,KAAeF,EAAAC,KAAArd,MAAE,CAAhC,IAAAud,EAAWH,EAAAvnB,MACpBnF,EAAGa,OAAOgsB,EAAY5sB,YAAYsgB,iBAAkB,IAAIrF,EAAMA,QAC3D7b,SAASV,EAAAA,MAAM6J,QAAQqkB,EAAYzqB,IAAK,QACxC/C,SAASV,QAAM6J,QAAQqkB,EAAYvR,OAAQ,OAChD,CAEA,MAAO,CAAA,CAAG,EAAAwR,EAfUpgB,KArBdkO,EAAkC5a,EAAGa,OAAOyG,IAAI,SAAC1G,EAAOK,GAASf,IAAAA,EAAAC,EACrE,IAAKS,EAAMM,WAAY,MAAMrD,EAAe,4BAC5C,MAAO,CACLmd,SAAUpa,EAAMM,WAChB+Z,YAAara,EAAMU,kBACnBrB,WAAYgB,EACZ0G,QAASmX,EAAYpU,IAAIzJ,GAAQma,YACjCzV,OAAQzF,OAAFA,EAAEU,EAAMO,wBAANjB,EAAAA,EAAyBmB,QAAQT,EAAMU,mBAAmBvC,cAAcwE,QAChFhC,UAAUpB,OAAAA,EAAAS,EAAMO,wBAANhB,EAAAA,EAAyBkB,QAAQT,EAAMU,mBAAmBC,WAAY,EAChF8Z,YACE/a,EAAoBA,qBAACE,YACrBF,EAAAA,qBAAqBK,qBACrBL,EAAAA,qBAAqBC,eAE3B,GAEM+H,EAAQtI,EAAGuD,QACXqpB,EAAuC,GAAGG,EAAApY,EAETmK,EAAY/Z,UAASioB,SAAAA,GAAhD,IAAA/sB,EAAU+sB,EAAEjhB,GAC0B,OAAApJ,QAAAC,QAC9BkqB,EAAKvS,cAAc,CAAEjS,MAAAA,EAAOsS,YAAa,CADnCA,EAAY3a,KADJ+sB,OAE2D/e,KAArFgf,SAAAA,GAEN,GAAQ,MAAHA,IAAAA,EAAKtS,aAC4DuS,OAAAX,EAAAW,EAA7D,CAAEnvB,MAAK,sCAAwCkC,GAGxD2sB,EAAgBpd,KAAIiE,MAApBmZ,EAAwBK,EAAItS,aAAc,EAC5C,EAAC,WAAA,OAAA4R,CAAA,GAAA,OAAA5pB,QAAAC,QAAAmqB,GAAAA,EAAA9e,KAAA8e,EAAA9e,KAAAue,GAAAA,EAAAO,GASH,CAAC,MAAAlqB,GAAA,OAAAF,QAAAG,OAAAD,EAAAzE,CAAAA,EAAAA,EAEO+uB,0BAAA,SAA0BntB,EAAiBsf,GAEjD,IADA,IAAI8N,EAAW,EACNrnB,EAAI,EAAGA,EAAI/F,EAAGqB,QAAQ2D,OAAQe,IAAK,CAC1C,IACMlC,EAAc6I,KAAKka,qBADV5mB,EAAGqB,QAAQ0E,GAC2BhH,eACjD8E,IAEFupB,GADYhjB,SAASvG,EAAYwG,KAGrC,CAEA,OAAIiV,IAAa8N,EACR,CACLrvB,MAAgD,yCAAA2O,KAAKkM,iBACnD0G,GACD,2BAA2B5S,KAAKkM,iBAAiBwU,GAAS,kBACzD9N,EAAW8N,EAAW,OAAS,UACjC,IAAI1gB,KAAKkM,iBAAiBlG,KAAK2a,IAAI/N,EAAW8N,gBAI3C,CACT,CAAA,EAAChvB,EAoCYkvB,cAAA,SACXze,EACAuO,OAAiCmQ,IAAAA,EAGhB7gB,KAAI,OAAA/J,QAAAC,QAAA0Q,EADjB,WAAA,SAAAka,EACIxlB,GACN,IAAKA,EAAQ,MAAMnK,EAAe,sBAElC,IAAA4vB,EHvhDsC,SAAC5e,GAC3C,QAA0CI,EAA1CG,EAAAC,EAAwBR,EAAQsb,cAAUlb,EAAAG,KAAAE,MAAE,CAAA,IAAjCwJ,EAAS7J,EAAA9J,MAClB,IAAK2T,EAAUnR,UAAYmR,EAAU9N,OACnC,MAAO,CACLc,SAAS,EACT/N,4BAA6B8L,KAAKqP,UAAUJ,iDAIhD,GAAgC,iBAArBA,EAAU9N,QAAuBT,MAAMuO,EAAU9N,UAAY6O,SAASf,EAAU9N,QACzF,MAAO,CAAEc,SAAS,EAAO/N,MAA6B+a,sBAAAA,EAAUnR,2CAGlE,GAAImR,EAAU9N,OAAS3F,EACrB,MAAO,CACLyG,SAAS,EACT/N,MAA6B+a,sBAAAA,EAAUnR,QAAuCtC,gCAAAA,WAIlF,IAAKoG,EAAgBqN,EAAUnR,SAC7B,MAAO,CAAEmE,SAAS,EAAO/N,MAAqC+a,8BAAAA,EAAUnR,QAE5E,CAEA,IAAA,IAAkCyb,EAAlCK,EAAApU,EAAoBR,EAAQhO,UAAMuiB,EAAAK,KAAAnU,MAAE,CAAA,IAAzB1O,EAAKwiB,EAAAje,MACd,IAAKvE,EAAM0K,MAA8B,iBAAf1K,EAAMyf,OAAsBzf,EAAMiL,IAC1D,MAAO,CACLC,SAAS,EACT/N,MAAK,kBAAoB8L,KAAKqP,UAAUtY,iDAG5C,IAAM8sB,EAAgB9hB,EAAYhL,EAAMiL,KACxC,IAAK6hB,EAAc5hB,QACjB,MAAO,CAAEA,SAAS,EAAO/N,MAAK,oBAAsB6C,EAAMiL,IAAG,cAAcjL,EAAM0K,KAAQ1K,IAAAA,EAAMyf,MAEjG,IACM1Y,EADa+lB,EAAc3hB,WACNqP,YAC3B,IAAK3P,EAAgB9D,GACnB,MAAO,CAAEmE,SAAS,EAAO/N,MAAiC4J,0BAAAA,EAE9D,CAEA,GAAIkH,EAAQ4Q,eAAiBxU,MAAM6D,QAAQD,EAAQ4Q,eACjD,IAAA8F,IAA0CF,EAA1CE,EAAAlW,EAAqBR,EAAQ4Q,iBAAa4F,EAAAE,KAAAjW,MAAE,CAAjC,IAAA+P,EAAMgG,EAAAlgB,MACf,GAAIka,EAAOrU,OAAS3F,EAClB,MAAO,CACLyG,SAAS,EACT/N,MAAK,sBAAwBshB,EAAO1X,QAAO,gCAAgCtC,WAG/E,IAAKoG,EAAgB4T,EAAO1X,SAC1B,MAAO,CAAEmE,SAAS,EAAO/N,MAAkCshB,2BAAAA,EAAO1X,QAEtE,CAGF,MAAO,CAAEmE,SAAS,EACpB,CG69CiC6hB,CAA6B9e,GACxD,IADe4e,EAAP3hB,QACM,MAAMjO,EADE4vB,EAAL1vB,OAC2B,4BAE5C,IAAM0f,EAAc5O,EAAQsb,WAAW/e,OAAO,SAACC,EAAKsS,GAAG,OAAKtS,EAAMsS,EAAI3S,MAAM,EAAE,GAC9E,GAAIyS,GAAe,EAAG,MAAM5f,EAAe,kBAC3C,IAAM6d,EAAyB6R,EAAK9U,eAAegF,GAE7CmQ,EAAmBL,EAAKnE,qBAAqBva,EAAQhO,QAC3D,GAAI+sB,EAAiB7vB,MAAO,MAAMF,EAAe+vB,EAAiB7vB,OAElE,IAAMiC,EAAK,IAAI2I,EAAWA,YAAC,EAAG,GAAI,GAAI,GAChCmW,EAAc,IAAIvV,IAA0B,OAAA5G,QAAAC,QAExB2qB,EAAK9D,uBAAuBzpB,EAAI6O,EAAQhO,OAAQie,IAAY7Q,cAAhF4f,GAAW,SAAAC,IAAAC,SAAAA,IAuCsC,OAAAprB,QAAAC,QAC5B2qB,EAAKtC,iBAC9BjrB,EAFasf,EAAW5D,EAAyBrS,EAIjDwF,EAAQ4Q,cACRX,EACA9W,EACAsX,EACA5D,EACArS,IACD4E,KATK+f,SAAAA,GAUN,GAAIA,EAAajwB,MAAO,MAAMF,EAAemwB,EAAajwB,OAG1D,SAAIqf,GAAAA,EAAiBe,UAAW,CAC9B,IAAM1O,EAAQxE,MAAM6D,QAAQsO,EAAgBe,WACxCf,EAAgBe,UAChB,CAACf,EAAgBe,WAErB,GAAqB,IAAjB1O,EAAMzK,OACR,MAAMnH,EAAe,4CAIvB,IADA,IAAMugB,EAAoB,GACjBrY,EAAI,EAAGA,EAAI0J,EAAMzK,OAAQe,IAAK,CACrC,IAAM+N,EAAOrE,EAAM1J,GAEnB,IAAK+N,GAA6B,iBAAdA,EAAKhV,KACvB,MAAMjB,EAAc,8BAA+BkI,EAA0B,2BAG/E,GAAkB,SAAd+N,EAAKpP,KAAiB,CACxB,IAAM2Z,EAAM5a,OAAOC,KAAKoQ,EAAKhV,KAAM,QACnC,GAAmB,IAAfuf,EAAIrZ,OACN,MAAMnH,EAAc,sBAAuBkI,EAAiC,kCAE9EqY,EAAQ5O,KAAK6O,EACf,KAAO,IAAkB,QAAdvK,EAAKpP,KAgBd,MAAM7G,yCAAsDkI,EAAC,KAAM+N,EAAapP,MAfhF,IAAM4Z,EAAMxK,EAAKhV,KAAKuF,OACtB,IAAKia,EACH,MAAMzgB,EAAqCkI,sBAAAA,eAE7C,IAAK,iBAAiBwJ,KAAK+O,IAAQA,EAAItZ,OAAS,GAAM,EACpD,MAAMnH,EACkBkI,sBAAAA,2CAA0CuY,EAAG,KAGvE,IAAMD,EAAM5a,OAAOC,KAAK4a,EAAK,OAC7B,GAAmB,IAAfD,EAAIrZ,OACN,MAAMnH,EAAqCkI,sBAAAA,EAA8B,+BAE3EqY,EAAQ5O,KAAK6O,EAGf,CACF,CAEA,IAAME,EAAaH,EAAQhT,OAAO,SAACC,EAAKoR,GAAC,OAAKpR,EAAMoR,EAAEzX,MAAM,EAAE,GAC9D,GAAIuZ,EAAa,IACf,MAAM1gB,EAAc,2BACS0gB,EAA6C,qCAI5E,IAAM5Y,EAAS,IAAIuV,EAAQA,OAC3BvV,EAAO1G,YAAYC,KAAGsf,MACtB7Y,EAAO1G,YAAYC,EAAAA,GAAGuf,WACtB,IAAAwP,IAAAA,EAAAC,EAAAA,EAAkB9P,EAAO6P,EAAAC,EAAAlpB,OAAAipB,IACvBtoB,EAAOtG,SAAS4L,MAAMvH,KADVwqB,EAAAD,KAIdjuB,EAAG2e,UAAU,CACXpd,SAAU,EACVxC,cAAeC,EAAAA,cAAc4f,WAAWjZ,EAAOkZ,aAEnD,CAAC,OAAAlc,QAAAC,QAGwB2qB,EAAKxO,cAAc/e,EAAI8e,IAAY7Q,KAAtD+Q,SAAAA,GACN,GAAIA,EAAWjhB,MAAO,MAAMF,EAAemhB,EAAWjhB,OAEtD,IAAMowB,EAAqBZ,EAAKJ,0BAA0BntB,EAAIsf,GAC9D,GAAI6O,EAAmBpwB,MAAO,MAAMF,EAAeswB,EAAmBpwB,OAEtE,IAAMuK,EAAQtI,EAAGuD,QAAQ,OAEpB6Z,MAAAA,GAAAA,EAAiB6B,UAAStc,QAAAC,QAIJ2qB,EAAKrO,YAAY5W,EAAO8U,IAAgBnP,KAAA,SAAAmgB,GAA3D,IAAAhP,EAAQgP,EAARhP,SACR,IAAKA,EAAU,MAAMvhB,EAAe,mCAEpC,MAAO,CAAEuhB,SAAAA,EAAW,GANX,CAAE9W,MAAAA,EAAO,EAAA+lB,EAAAA,CAAAA,IAAAA,EA3FdhlB,WAAAA,GAAAA,EAAM,EAAC,CAAA,IAAAilB,EACTtuB,EAAG2e,UAAS,OAAAhc,QAAAC,QAAO2qB,EAAK1U,kBAAkB7Q,EAAOmB,WAAYE,EAAKrB,IAAOiG,KAAAsgB,SAAAA,GAAzED,EAAA7hB,KAAAzM,EAAEuuB,EAAyE,EAAA,CAAA,CADzEllB,GACyE,OAAAglB,GAAAA,EAAApgB,KAAAogB,EAAApgB,KAAA8f,GAAAA,GAAA,CAnC7E,GAAIF,EAAY9vB,MAAO,MAAMF,EAAegwB,EAAY9vB,OAIxD,IAHA,IAAMuhB,EAAWuO,EAAYvO,SAEvB4K,EAAiB,IAAItH,IAClB7c,EAAI,EAAGA,EAAI8I,EAAQhO,OAAOmE,OAAQe,IAAK,CAC9C,IAAMgV,EAAU/O,EAAUA,WAACC,QAAQ4C,EAAQhO,OAAOkF,GAAG8F,KACrDqe,EAAe1D,IAAIzL,EAAQK,YAC7B,CAEA,IAAMoT,EAAYjB,EAAKtD,0BACrB3K,EACA5D,EACA7M,EAAQ4Q,cACRyK,EACAliB,EACA6G,EAAQsb,YAEV,GAAIqE,EAAUzwB,MAAO,MAAMF,EAAe2wB,EAAUzwB,OACpD,IAAMsL,EAAMmlB,EAAUnlB,IAEtB,GAAIiW,EAAW5D,EAAyBrS,EAGtC,MAAMxL,EAC0B4wB,8BAHZlB,EAAK3U,iBAAiB0G,GAGYoP,WAFlCnB,EAAK3U,iBAAiB8C,EAAyBrS,GAEkBkkB,oBAAAA,EAAK3U,iBACtFvP,GACD,KAEJ,IAAAslB,EAAAha,EAEiB9F,EAAQsb,oBAAfxM,OAA2BiR,EACpC5uB,EAAG2e,UAAS,OAAAhc,QAAAC,QAAO2qB,EAAK1U,kBAAkB8E,EAAIhW,QAAS4lB,EAAK9U,eAAekF,EAAI3S,QAAShD,IAAOiG,KAAA,SAAA4gB,GAA/FD,EAAAniB,KAAAzM,EAAE6uB,EAA+F,EACnG,GAAC,OAAAF,GAAAA,EAAA1gB,KAAA0gB,EAAA1gB,KAAA6f,GAAAA,GAAA,EAAA,CAAA,IAAAgB,EAjDcvB,EAAKzV,WAAU,OAAAgX,EAAAtB,EAAAsB,GAAAnsB,QAAAC,QAAW2qB,EAAKpV,qBAAmBlK,KAAAuf,EAqJnE,EAASzvB,SAAAA,GAIP,MAHIiP,EAAejP,IACjBuP,EAAgBvP,EAAO,yBAEnBA,CACR,GACF,CAAC,MAAA8E,GAAAF,OAAAA,QAAAG,OAAAD,EAAA,CAAA,EAAA+U,CAAA,+BC/0DE,GAAAzS,aAAA4I,EAAA,CACH,IAAA5I,EAAA7C,EASE,cADM8L,EAAAF,EAAAF,KAAa,KAAKH,EAAAC,IAPlB,EAANA,MACM3I,EAAA7C,KAGJ6C,EAAOgJ,CAOP,OACDhJ,EAAA8I,KAGC,YADF9I,EAAA8I,KAAMC,OAA2B,KAAAL,EAAAC,GAAAI,EAAAF,KAAA,KAAAH,EAAA,IAG/BA,EAAAvL,EAAAwL,MACA3I,QAEFsS,EAA+B5J,EAAAO,OAE7BP,EAGF,EA9FG,IAAKE,eAAmB,WAC/B,SAAAA,IAuBAA,QAAAA,YAAqBE,KAAA,SAAAI,EAAAC,GACF,IAAAzG,EAAc,IAAAkG,EACdD,EAAApB,KAAuBpK,EACvB,GAAAwL,EAAS,CACT,IAAKS,EAA2B,EAAAT,EAAAO,EAAAC,KAErCC,EAAA,KAERL,EAAArG,EAAoB,EAAA0G,EAAC7B,KAAyByB,UAC/CtL,KAEKgF,EAAO,EAAAhF,GAEb,OAAAgF,EAEA,WAGF,+DAMGyG,EACHJ,EAAuBrG,EAAA,EAAAyG,EAAAnJ,IAEtB+I,EAAArG,EAAA,EAAA1C,qBAME,EACG0C,CACJ,GAGF,CA9D6B,0sBAwBlB,IAAAknB,eAAQ,WAMnB,SAAAA,EAAYC,EAAkBngB,GAC5B,GANeogB,KAAAA,eACAC,EAAAA,KAAAA,oBACAC,EAAAA,KAAAA,eACAC,EAAAA,KAAAA,WAGf,GAAKC,EAAMC,iBAAiBN,GAC1B,MAAMnxB,EAAe,2BAGvB,IAAM0xB,EAAOC,EAAAA,SAASxW,WAAWgW,GAAUS,SAC3C/iB,KAAKuiB,UAAYS,EAAEA,GAACC,SAASJ,GAC7B7iB,KAAKwiB,eAAiBrgB,EAAQqgB,eAC9BxiB,KAAKyiB,UAAYtgB,EAAQsgB,WAAa,IACtCziB,KAAK0iB,MAAQ,IAAI7lB,GACnB,CAACwlB,EASMa,iBAAP,WACE,OAAOP,EAAMO,kBACf,EAACb,EAOMc,gBAAP,SAAuBb,GACrB,OAAOK,EAAMC,iBAAiBN,EAChC,EAAC,IAAA5wB,EAAA2wB,EAAA1wB,iBAAAD,EAQD0xB,cAAA,SAAc7uB,EAAe8uB,QAAA,IAAAA,IAAAA,GAAoB,GAC/C,IACMC,EAActjB,KAAKwiB,eAAkBe,KADvBF,EAAW,EAAI,GACuB9uB,IAAAA,EAE1D,GAAIyL,KAAK0iB,MAAMtN,IAAIkO,GACjB,OAAWtjB,KAAC0iB,MAAM1kB,IAAIslB,GAGxB,IACMjkB,EADaW,KAAKuiB,UAAUiB,OAAOF,GACXjV,QAE9B,IAAKhP,EACH,MAAMlO,EAAc,0CAA2CmyB,GAGjE,IAAMG,EAA2B,CAC/BxoB,QAASoE,EAAWqP,YACpBrP,WAAYA,EAAWqkB,QACvBC,KAAML,GAQR,OAJItjB,KAAK0iB,MAAM3oB,KAAOiG,KAAKyiB,WACzBziB,KAAK0iB,MAAMzkB,IAAIqlB,EAAUG,GAGpBA,CACT,EAAC/xB,EASKkyB,gBAAe,SAACC,EAAoBC,EAAeT,QAAAA,IAAAA,IAAAA,GAAoB,GAAK,IAIhF,IAJgF,IAC1EnhB,EAA2B,GAGxB7I,EAAI,EAAGA,EAAIyqB,EAAOzqB,IAAK,CAC9B,IACMoqB,EAAczjB,KAAKojB,cADXS,EAAaxqB,EACmBgqB,GAC9CnhB,EAAUY,KAAK2gB,EACjB,CAEA,OAAAxtB,QAAAC,QAAOgM,EACT,CAAC,MAAA/L,GAAA,OAAAF,QAAAG,OAAAD,EAAA,CAAA,EAAAzE,EASDqyB,2BAAA,SACE7hB,EACAC,GAkBA,IATA,IASkCI,EAT5ByhB,GAAiB7hB,MAAAA,OAAAA,EAAAA,EAAS6hB,iBAAkB,IAC5CC,GAAuB,MAAP9hB,OAAO,EAAPA,EAAS8hB,gBAAiB,IAC1CC,GAAsB,MAAP/hB,OAAO,EAAPA,EAAS+hB,eAAgB,WAExC9R,EAA6C,CAAE,EAC/C+R,EAAuC,CAAA,EACvCC,EAAa,IAAIlO,IAAIhU,GAG3BQ,EAAAC,EAAwB3C,KAAK0iB,SAAKngB,EAAAG,KAAAE,MAAE,CAAA,IAArB/C,EAAqB0C,EAAA9J,MAAjB,GACb2rB,EAAWhP,IAAIvV,EAAK5E,WACtBmX,EAAYvS,EAAK5E,SAAW4E,EAAKR,WACjC8kB,EAAMtkB,EAAK5E,SAAW4E,EAAK8jB,KAC3BS,EAAU,OAAQvkB,EAAK5E,SAE3B,CAGA,GAAwB,IAApBmpB,EAAWrqB,KACb,MAAO,CAAEqY,YAAAA,EAAa+R,MAAAA,GAIxB,GAAqB,eAAjBD,EAA+B,CAKjC,IAAK,IAAI7qB,EAAI,EAAGA,EAAI2qB,GAAkBI,EAAWrqB,KAAO,EAAGV,IAAK,CAC9D,IAAMwG,EAAOG,KAAKojB,cAAc/pB,GAAG,GAE/B+qB,EAAWhP,IAAIvV,EAAK5E,WACtBmX,EAAYvS,EAAK5E,SAAW4E,EAAKR,WACjC8kB,EAAMtkB,EAAK5E,SAAW4E,EAAK8jB,KAC3BS,EAAU,OAAQvkB,EAAK5E,SAE3B,CAGA,IAAK,IAAI5B,EAAI,EAAGA,EAAI4qB,GAAiBG,EAAWrqB,KAAO,EAAGV,IAAK,CAC7D,IAAMwG,EAAOG,KAAKojB,cAAc/pB,GAAG,GAE/B+qB,EAAWhP,IAAIvV,EAAK5E,WACtBmX,EAAYvS,EAAK5E,SAAW4E,EAAKR,WACjC8kB,EAAMtkB,EAAK5E,SAAW4E,EAAK8jB,KAC3BS,EAAU,OAAQvkB,EAAK5E,SAE3B,CACF,MAKE,IAFA,IAAMopB,EAAUre,KAAKG,IAAI6d,EAAgBC,GAEhC5qB,EAAI,EAAGA,EAAIgrB,GAAWD,EAAWrqB,KAAO,EAAGV,IAAK,CAEvD,GAAIA,EAAI2qB,EAAgB,CACtB,IAAMM,EAActkB,KAAKojB,cAAc/pB,GAAG,GACtC+qB,EAAWhP,IAAIkP,EAAYrpB,WAC7BmX,EAAYkS,EAAYrpB,SAAWqpB,EAAYjlB,WAC/C8kB,EAAMG,EAAYrpB,SAAWqpB,EAAYX,KACzCS,EAAU,OAAQE,EAAYrpB,SAElC,CAGA,GAAI5B,EAAI4qB,EAAe,CACrB,IAAMM,EAAavkB,KAAKojB,cAAc/pB,GAAG,GACrC+qB,EAAWhP,IAAImP,EAAWtpB,WAC5BmX,EAAYmS,EAAWtpB,SAAWspB,EAAWllB,WAC7C8kB,EAAMI,EAAWtpB,SAAWspB,EAAWZ,KACvCS,EAAiB,OAACG,EAAWtpB,SAEjC,CACF,CAIF,GAAImpB,EAAWrqB,KAAO,EAAG,CACvB,IAAMyqB,EAAWjmB,MAAMvH,KAAKotB,GAC5B,MAAMjzB,EACJ,mCAAmCqzB,EAASlsB,OAAuBksB,iBAAAA,EAASC,KAAK,MAAjF,yBACyBT,EAAc,8BAA8BC,EAAa,yBAEtF,CAEA,MAAO,CAAE7R,YAAAA,EAAa+R,MAAAA,EACxB,EAACzyB,EASDgzB,eAAA,SACExiB,EACAC,GAOA,OADenC,KAAK+jB,2BAA2B7hB,EAAWC,GAC5CiQ,WAChB,EAAC1gB,EAUKizB,0BAAA,SACJC,EACAziB,GAIC,IAAAqH,IAAAA,EAAAA,WAAAlC,IAAAA,EA6BGud,WAAAA,GAAAA,EACFC,CAAAA,EAAoB,EACf,IAAIzrB,EAAI,EAAC6O,EAAAmB,EAAA,WAAA,OAAEhQ,EAAIgrB,GAAWS,EAAoBC,CAAQ,EAAE,WAAA,OAAA1rB,GAAG,EAAE,WAChE,IAAMwG,EAAO8D,EAAKyf,cAAc/pB,GAAG,GAAM,OAAApD,QAAAC,QACpB0uB,EAAiB/kB,EAAK5E,UAAQsG,KAAA,SAA7CyjB,GAEFA,GACF7pB,EAAOwX,OAAO7P,KAAKjD,GACnBilB,EAAoB,GAEpBA,GAAoB,EAExB,GAAC,GAAA5c,GAAAA,EAAA3G,KAAA,OAAA2G,EAAA3G,KAAA,WAAA,EAAA,CAAA,CAZCsjB,GAYD,OAAAvd,GAAAA,EAAA/F,KAAA+F,EAAA/F,KAAA,WAGH,OAAOpG,CAAO,GAAPA,CAAM,EAAAwI,EA3BE3D,KAZT+kB,GAAkB,MAAP5iB,OAAO,EAAPA,EAAS4iB,WAAY,GAChCF,GAAqC,KAAxB1iB,MAAAA,OAAAA,EAAAA,EAAS0iB,YACtBR,GAAUliB,MAAAA,OAAAA,EAAAA,EAASkiB,UAAW,IAE9BlpB,EAAS,CACb8pB,QAAS,GACTtS,OAAQ,IAINmS,EAAoB,EACfzrB,EAAI,EAAC2N,EAAAqC,EAAA,WAAA,OAAEhQ,EAAIgrB,GAAWS,EAAoBC,CAAQ,EAAE,WAAA,OAAA1rB,GAAG,EAAE,WAChE,IAAMwG,EAAO8D,EAAKyf,cAAc/pB,GAAG,GAAO,OAAApD,QAAAC,QACrB0uB,EAAiB/kB,EAAK5E,UAAQsG,KAAA,SAA7CyjB,GAEFA,GACF7pB,EAAO8pB,QAAQniB,KAAKjD,GACpBilB,EAAoB,GAEpBA,GAAoB,EAExB,GAAC7uB,OAAAA,QAAAC,QAAA8Q,GAAAA,EAAAzF,KAAAyF,EAAAzF,KAAAiI,GAAAA,IAmBH,CAAC,MAAArT,GAAAF,OAAAA,QAAAG,OAAAD,EAAAzE,CAAAA,EAAAA,EAKDwzB,WAAA,WACEllB,KAAK0iB,MAAMyC,OACb,EAACzzB,EAKD0zB,aAAA,WACE,OAAWplB,KAAC0iB,MAAM3oB,IACpB,EAACsoB,CAAA,CAnSkB,GC+BAgD,0BAYnB,SAAAA,EAAY/pB,GAAiB0E,KAXrBgC,aACAsjB,EAAAA,KAAAA,YAWN,EAAAtlB,KAAKgC,QAAU,IAAIkJ,EAAY5P,EACjC,CAAC,IAAA5J,EAAA2zB,EAAA1zB,iBAAAD,EASKslB,eAAc,SAACqF,EAAkBvO,GAAoB,IACzD,OAAA7X,QAAAC,QAAO8J,KAAKgC,QAAQgV,eAAeqF,EAAUvO,GAC/C,CAAC,MAAA3X,GAAAF,OAAAA,QAAAG,OAAAD,EAAAzE,CAAAA,EAAAA,EAaDqa,eAAA,SAAezN,GACb,YAAY0D,QAAQ+J,eAAezN,EACrC,EAAC5M,EAaDwa,iBAAA,SAAiB5N,GACf,OAAW0B,KAACgC,QAAQkK,iBAAiB5N,EACvC,EAAC5M,EAOK4J,OAAA,WAAM,IACV,OAAArF,QAAAC,QAAO8J,KAAKgC,QAAQyJ,oBACtB,CAAC,MAAAtV,GAAAF,OAAAA,QAAAG,OAAAD,EAAAzE,CAAAA,EAAAA,EAQK8d,QAAO,SAACvU,OACZ,OAAAhF,QAAAC,QAAO8J,KAAKgC,QAAQuN,WAAWtU,GACjC,CAAC,MAAA9E,GAAA,OAAAF,QAAAG,OAAAD,KAAAzE,EAQK6zB,SAAA,SAASrjB,GAAmB,IAChC,OAAAjM,QAAAC,QAAO8J,KAAKgC,QAAQ0B,YAAYxB,GAClC,CAAC,MAAA/L,GAAAF,OAAAA,QAAAG,OAAAD,EAAA,CAAA,EAAAzE,EAQKuQ,kBACJhH,EACAwR,EACA1S,EACA2S,GAAsB,IAEtB,OAAAzW,QAAAC,QAAO8J,KAAKgC,QAAQC,SAAShH,EAASwR,EAAM1S,EAAM2S,GACpD,CAAC,MAAAvW,GAAAF,OAAAA,QAAAG,OAAAD,KAAAzE,EASKqd,eAAA,SAAe9T,EAAiB+T,GAA8B,IAClE,OAAA/Y,QAAAC,QAAO8J,KAAKgC,QAAQ+M,eAAe9T,EAAS+T,GAC9C,CAAC,MAAA7Y,GAAA,OAAAF,QAAAG,OAAAD,KAAAzE,EAQK4e,YAAA,SAAYrV,GAAe,IAC/B,OAAAhF,QAAAC,QAAO8J,KAAKgC,QAAQsO,YAAYrV,GAClC,CAAC,MAAA9E,GAAAF,OAAAA,QAAAG,OAAAD,EAAA,CAAA,EAAAzE,EASK+e,kBAAS3C,EAAqB3O,EAAauR,GAAiC,IAChF,OAAAza,QAAAC,QAAO8J,KAAKgC,QAAQyO,SAAS3C,EAAS3O,EAAKuR,GAC7C,CAAC,MAAAva,UAAAF,QAAAG,OAAAD,EAAAzE,CAAAA,EAAAA,EAQKkvB,uBAAcze,EAA+BuO,GAAiC,IAClF,OAAAza,QAAAC,QAAO8J,KAAKgC,QAAQ4e,cAAcze,EAASuO,GAC7C,CAAC,MAAAva,UAAAF,QAAAG,OAAAD,EAAA,CAAA,EAAAzE,EAQK8gB,qBAAY6J,EAAkB3L,GAAiC,IACnE,OAAAza,QAAAC,QAAO8J,KAAKgC,QAAQwQ,YAAY6J,EAAU3L,GAC5C,CAAC,MAAAva,GAAAF,OAAAA,QAAAG,OAAAD,EAAA,CAAA,EAAAzE,EAQK+iB,qBAAY/B,GAAgB,IAChC,OAAAzc,QAAAC,QAAO8J,KAAKgC,QAAQyS,YAAY/B,GAClC,CAAC,MAAAvc,GAAA,OAAAF,QAAAG,OAAAD,EAAAzE,CAAAA,EAAAA,EAWK8zB,gBAAe,SACnBvqB,EACA6c,EACAC,EACArL,OAEA,OAAAzW,QAAAC,QAAO8J,KAAKgC,QAAQqW,mBAAmBpd,EAAS6c,EAAWC,EAAOrL,GACpE,CAAC,MAAAvW,UAAAF,QAAAG,OAAAD,EAAA,CAAA,EAAAzE,EASK+zB,2BAAkB5hB,GAA8B,IACpD,OAAA5N,QAAAC,QAAO8J,KAAKgC,QAAQ+B,qBAAqBF,GAC3C,CAAC,MAAA1N,GAAA,OAAAF,QAAAG,OAAAD,EAAAzE,CAAAA,EAAAA,EASKuS,QAAO,SAACrF,EAAcuD,GAAsB,IAChD,OAAAlM,QAAAC,QAAO8J,KAAKgC,QAAQiC,QAAQrF,EAAMuD,GACpC,CAAC,MAAAhM,GAAA,OAAAF,QAAAG,OAAAD,EAAAzE,CAAAA,EAAAA,EASK0qB,iBAAgB,SAACC,EAAkBla,GAAsB,IAC7D,OAAAlM,QAAAC,QAAO8J,KAAKgC,QAAQoa,iBAAiBC,EAAUla,GACjD,CAAC,MAAAhM,GAAAF,OAAAA,QAAAG,OAAAD,EAAAzE,CAAAA,EAAAA,EAQDsH,iBAAA,SAAiBC,GACf,YAAY+I,QAAQhJ,iBAAiBC,EACvC,EAACvH,EAQDgJ,qBAAA,SAAqBC,GACnB,OAAWqF,KAACgC,QAAQtH,qBAAqBC,EAC3C,EAACjJ,EAcD2wB,SAAA,SAASC,EAAkBngB,GACzB,OAAO,IAAIkgB,EAASC,EAAUngB,EAChC,EAACzQ,EAUDg0B,MAAA,WAIE,OAHK1lB,KAAKslB,SACRtlB,KAAKslB,OAAS,IAAIvjB,EAAM/B,KAAKgC,UAEpBhC,KAACslB,MACd,EAACD,CAAA,IAvQkBA,EAUZhD,SAAWA"}
|