@dynamic-labs-wallet/forward-mpc-client 0.5.4 → 0.6.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/dist/index.cjs +55 -17
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +32 -5
- package/dist/index.d.ts +32 -5
- package/dist/index.js +55 -17
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/attestation/constants.ts","../src/attestation/verifier.ts","../src/client.ts","../src/client-v2/errors.ts","../src/client-v2/transport.ts","../src/client-v2/session.ts","../src/client-v2/logger.ts","../src/client-v2/client-v2.ts","../src/client-v2/singleton.ts"],"names":["ATTESTATION_CONSTANTS","MAX_ATTESTATION_AGE","NitroAttestationVerifier","config","wasmInitPromise","strictCertValidation","maxAge","ensureWasmInitialized","initWasm","then","undefined","catch","error","Error","message","process","versions","node","readFileSync","createRequire","require","wasmPath","resolve","initSync","module","init","verify","attestationDocBase64","expectedChallenge","nonce","expectedPcrs","PCRs","empty","pcr8","expectedPcr8","isValid","validateAttestationDocPcrs","valid","errors","timestamp","Date","now","userData","getUserData","userDataString","TextDecoder","decode","String","extractedNonceRaw","getNonce","extractedNonce","nonceString","atob","binaryString","Uint8Array","length","i","charCodeAt","Buffer","from","decodeError","diff","isWindow","globalThis","window","WebSocketImpl","WebSocket","ForwardMPCClient","EventEmitter","ws","url","options","attestationVerifier","isConnected","messageId","pendingRequests","Map","sharedSecret","decapsulationKey","connectionId","handshakeNonce","attestationPromise","reconnectAttempts","reconnectInterval","connectionTimeout","heartbeatInterval","attestationConfig","bypassAttestation","connect","Promise","reject","timeout","setTimeout","onopen","clearTimeout","emit","onerror","_error","onmessage","event","handleMessage","data","onclose","cleanup","on","toString","disconnect","close","request","clear","fill","ensureWsConnection","handshake","parsed","JSON","parse","requestId","deserializeMessage","stringify","has","get","delete","type","errorMsg","endsWith","responseData","getData","sendRequest","messageWithId","set","serializedMessage","serializeMessage","send","encode","encoded","messageRegistry","result","either","isLeft","right","traceContext","encapsulationKey","generateMlKem768Keypair","nonceBytes","randomBytes","HandshakeV1RequestMessage","challenge","response","encapsulatedSharedSecret","cipherText","hexToBytes","decapsulateMlKem768","attestationDoc","verifyAttestationDocument","signMessage","params","messageToSign","cleanHex","startsWith","slice","encryptedKeyshare","encryptKeyshare","keyshare","signingAlgo","SignMessageV1RequestMessage","relayDomain","hashAlgo","derivationPath","tweak","roomUuid","userId","environmentId","keygen","SigningAlgorithm","ED25519","encryptedKeygenInit","encryptKeygenInit","keygenInit","KeygenV1RequestMessage","numParties","threshold","keygenIds","keygenResult","decryptKeygenResult","receiveKey","ReceiveKeyV1RequestMessage","connected","challengeHash","sha256","Array","map","b","padStart","join","ErrorCode","CONNECTION_FAILED","CONNECTION_TIMEOUT","NOT_CONNECTED","HANDSHAKE_FAILED","HANDSHAKE_INVALID_RESPONSE","ATTESTATION_FAILED","ATTESTATION_NONCE_MISSING","REQUEST_TIMEOUT","SESSION_DISPOSED","SERVER_ERROR","MESSAGE_PARSE_FAILED","SESSION_ESTABLISH_FAILED","UNSUPPORTED_ALGORITHM","ForwardMPCErrorType","TRANSPORT","SESSION","CLIENT","ForwardMPCError","code","context","name","Object","setPrototypeOf","prototype","toJSON","stack","TransportError","SessionError","ClientError","TransportConnectionError","TransportConnectionTimeoutError","TransportNotConnectedError","SessionHandshakeError","reason","SessionHandshakeInvalidResponseError","SessionAttestationError","SessionAttestationNonceMissingError","SessionRequestTimeoutError","SessionDisposedError","SessionServerError","SessionMessageParseError","SessionRemoteError","serverError","ClientUnsupportedAlgorithmError","ClientSessionEstablishFailedError","ForwardMPCTransport","_isConnected","_destroyed","_hadSuccessfulConnection","_midSessionReconnectCount","_connectPromise","logger","_connectWithRetry","finally","WebSocketCloseCode","NORMAL","lastError","attempt","_connectOnce","timeoutHandle","debug","err","closeCode","maybeReconnect","IDLE_TIMEOUT","maxAttempts","isWebSocketError","v","Session","_disposed","_abort","AbortController","transport","_connectionId","_sharedSecret","requestTimeout","doRequest","verifyAttestation","signal","dispose","abort","generateRequestId","aborted","off","handler","removeEventListener","onAbort","addEventListener","once","rawData","_rid","body","msg","isRight","serializeWithRequestId","rand","verifier","Logger","MESSAGE_PREFIX","externalLogger","messageContext","info","warn","ForwardMPCClientV2","sessionOptions","session","_handshaking","_disconnectedIntentionally","dangerouslyBypassAttestation","console","transportOptions","onTransportConnected","onTransportDisconnected","_doConnect","ensureSession","hex","fromDynamicSigningAlgorithm","signature","_runHandshake","doHandshake","intentional","ForwardMPCClientSingleton"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BO,IAAMA,qBAAAA,GAAwB;;AAEnCC,EAAAA,mBAAAA,EAAqB,IAAI,EAAA,GAAK,GAUhC,CAAA;ACvBO,IAAMC,2BAAN,MAAMA;EAhBb;;;AAiBmBC,EAAAA,MAAAA;EACTC,eAAAA,GAAwC,IAAA;AAEhD,EAAA,WAAA,CAAYD,MAAAA,EAAuC;AACjD,IAAA,IAAA,CAAKA,MAAAA,GAAS;MACZE,oBAAAA,EAAsB,IAAA;AACtBC,MAAAA,MAAAA,EAAQN,qBAAAA,CAAsBC,mBAAAA;MAC9B,GAAGE;AACL,KAAA;AACF,EAAA;;;;;;EAOQI,qBAAAA,GAAuC;AAC7C,IAAA,IAAA,CAAKH,eAAAA,KAAoB,IAAA,CAAKI,QAAAA,EAAQ,CACnCC,IAAAA,CAAK,MAAMC,MAAAA,CAAAA,CACXC,KAAAA,CAAM,CAACC,KAAAA,KAAAA;AACN,MAAA,IAAA,CAAKR,eAAAA,GAAkB,IAAA;AACvB,MAAA,MAAM,IAAIS,MACR,CAAA,kCAAA,EAAqCD,KAAAA,YAAiBC,QAAQD,KAAAA,CAAME,OAAAA,GAAU,eAAA,CAAA,CAAiB,CAAA;IAEnG,CAAA,CAAA;AACF,IAAA,OAAO,IAAA,CAAKV,eAAAA;AACd,EAAA;;;;;;AAOA,EAAA,MAAcI,QAAAA,GAA0B;AACtC,IAAA,IAAI,OAAOO,OAAAA,KAAY,WAAA,IAAeA,OAAAA,CAAQC,UAAUC,IAAAA,EAAM;AAC5D,MAAA,MAAM,EAAEC,YAAAA,EAAY,GAAK,MAAM,OAAO,IAAA,CAAA;AACtC,MAAA,MAAM,EAAEC,aAAAA,EAAa,GAAK,MAAM,OAAO,QAAA,CAAA;AACvC,MAAA,MAAMC,QAAAA,GAAUD,aAAAA,CAAc,2PAAe,CAAA;AAC7C,MAAA,MAAME,QAAAA,GAAWD,QAAAA,CAAQE,OAAAA,CACvB,oDAAA,CAAA;AAEF,MAAA,MAAM,EAAEC,QAAAA,EAAQ,GAAK,MAAM,OAAO,sCAAA,CAAA;AAClCA,MAAAA,QAAAA,CAAS;AAAEC,QAAAA,MAAAA,EAAQN,aAAaG,QAAAA;OAAU,CAAA;IAC5C,CAAA,MAAO;AACL,MAAA,MAAMI,qBAAAA,EAAAA;AACR,IAAA;AACF,EAAA;;;;;;;;;EAUA,MAAMC,MAAAA,CACJC,oBAAAA,EACAC,iBAAAA,EACAC,KAAAA,EACwC;AACxC,IAAA,IAAI;AAEF,MAAA,MAAM,KAAKtB,qBAAAA,EAAqB;AAGhC,MAAA,MAAMuB,YAAAA,GAAeC,UAAKC,KAAAA,EAAK;AAC/BF,MAAAA,YAAAA,CAAaG,IAAAA,GAAO,KAAK9B,MAAAA,CAAO+B,YAAAA;AAGhC,MAAA,MAAMC,OAAAA,GAAUC,gCAA2BT,oBAAAA,EAAsB;AAC/DG,QAAAA;AACD,OAAA,CAAA;AAED,MAAA,IAAI,CAACK,OAAAA,EAAS;AACZ,QAAA,OAAO;UACLE,KAAAA,EAAO,KAAA;UACPC,MAAAA,EAAQ;AAAC,YAAA;;AACTC,UAAAA,SAAAA,EAAWC,KAAKC,GAAAA;AAClB,SAAA;AACF,MAAA;AAKA,MAAA,IAAI,CAACb,iBAAAA,EAAmB;AACtB,QAAA,OAAO;UACLS,KAAAA,EAAO,KAAA;UACPC,MAAAA,EAAQ;AACN,YAAA;;AAEFC,UAAAA,SAAAA,EAAWC,KAAKC,GAAAA;AAClB,SAAA;AACF,MAAA;AAEA,MAAA,IAAI;AACF,QAAA,MAAMC,QAAAA,GAAWC,iBAAYhB,oBAAAA,CAAAA;AAC7B,QAAA,IAAI,CAACe,QAAAA,EAAU;AACb,UAAA,OAAO;YACLL,KAAAA,EAAO,KAAA;YACPC,MAAAA,EAAQ;AAAC,cAAA;;AACTC,YAAAA,SAAAA,EAAWC,KAAKC,GAAAA;AAClB,WAAA;AACF,QAAA;AAIA,QAAA,MAAMG,iBAAiB,IAAIC,WAAAA,CAAY,OAAA,CAAA,CAASC,OAAOJ,QAAAA,CAAAA;AAEvD,QAAA,IAAIE,mBAAmBhB,iBAAAA,EAAmB;AACxC,UAAA,OAAO;YACLS,KAAAA,EAAO,KAAA;YACPC,MAAAA,EAAQ;AACN,cAAA;;AAEFC,YAAAA,SAAAA,EAAWC,KAAKC,GAAAA;AAClB,WAAA;AACF,QAAA;AACF,MAAA,CAAA,CAAA,OAAS7B,KAAAA,EAAO;AACd,QAAA,OAAO;UACLyB,KAAAA,EAAO,KAAA;UACPC,MAAAA,EAAQ;AACN,YAAA,CAAA,6CAAA,EAAgD1B,iBAAiBC,KAAAA,GAAQD,KAAAA,CAAME,OAAAA,GAAUiC,MAAAA,CAAOnC,KAAAA,CAAAA,CAAAA;;AAElG2B,UAAAA,SAAAA,EAAWC,KAAKC,GAAAA;AAClB,SAAA;AACF,MAAA;AAGA,MAAA,IAAI;AAEF,QAAA,MAAMO,iBAAAA,GAAoBC,cAAStB,oBAAAA,CAAAA;AAEnC,QAAA,IAAI,CAACqB,iBAAAA,EAAmB;AACtB,UAAA,OAAO;YACLX,KAAAA,EAAO,KAAA;YACPC,MAAAA,EAAQ;AAAC,cAAA;;AACTC,YAAAA,SAAAA,EAAWC,KAAKC,GAAAA;AAClB,WAAA;AACF,QAAA;AAIA,QAAA,IAAIS,cAAAA;AACJ,QAAA,IAAI;AACF,UAAA,MAAMC,WAAAA,GAAc,IAAIN,WAAAA,EAAAA,CAAcC,OAAOE,iBAAAA,CAAAA;AAG7C,UAAA,IAAI,OAAOI,SAAS,WAAA,EAAa;AAC/B,YAAA,MAAMC,YAAAA,GAAeD,KAAKD,WAAAA,CAAAA;AAC1BD,YAAAA,cAAAA,GAAiB,IAAII,UAAAA,CAAWD,YAAAA,CAAaE,MAAM,CAAA;AACnD,YAAA,KAAA,IAASC,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAIH,YAAAA,CAAaE,QAAQC,CAAAA,EAAAA,EAAK;AAC5CN,cAAAA,cAAAA,CAAeM,CAAAA,CAAAA,GAAKH,YAAAA,CAAaI,UAAAA,CAAWD,CAAAA,CAAAA;AAC9C,YAAA;UACF,CAAA,MAAO;AACLN,YAAAA,cAAAA,GAAiB,IAAII,UAAAA,CAAWI,MAAAA,CAAOC,IAAAA,CAAKR,WAAAA,EAAa,QAAA,CAAA,CAAA;AAC3D,UAAA;AACF,QAAA,CAAA,CAAA,OAASS,WAAAA,EAAa;AACpB,UAAA,OAAO;YACLvB,KAAAA,EAAO,KAAA;YACPC,MAAAA,EAAQ;AACN,cAAA,CAAA,oCAAA,EAAuCsB,uBAAuB/C,KAAAA,GAAQ+C,WAAAA,CAAY9C,OAAAA,GAAUiC,MAAAA,CAAOa,WAAAA,CAAAA,CAAAA;;AAErGrB,YAAAA,SAAAA,EAAWC,KAAKC,GAAAA;AAClB,WAAA;AACF,QAAA;AAGA,QAAA,IAAIS,cAAAA,CAAeK,MAAAA,KAAW1B,KAAAA,CAAM0B,MAAAA,EAAQ;AAC1C,UAAA,OAAO;YACLlB,KAAAA,EAAO,KAAA;YACPC,MAAAA,EAAQ;AACN,cAAA,CAAA,gCAAA,EAAmCT,KAAAA,CAAM0B,MAAM,CAAA,YAAA,EAAeL,cAAAA,CAAeK,MAAM,CAAA,MAAA;;AAErFhB,YAAAA,SAAAA,EAAWC,KAAKC,GAAAA;AAClB,WAAA;AACF,QAAA;AAIA,QAAA,IAAIoB,IAAAA,GAAO,CAAA;AACX,QAAA,KAAA,IAASL,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAI3B,KAAAA,CAAM0B,QAAQC,CAAAA,EAAAA,EAAK;AACrCK,UAAAA,IAAAA,IAAQX,cAAAA,CAAeM,CAAAA,CAAAA,GAAK3B,KAAAA,CAAM2B,CAAAA,CAAAA;AACpC,QAAA;AAEA,QAAA,IAAIK,SAAS,CAAA,EAAG;AACd,UAAA,OAAO;YACLxB,KAAAA,EAAO,KAAA;YACPC,MAAAA,EAAQ;AAAC,cAAA;;AACTC,YAAAA,SAAAA,EAAWC,KAAKC,GAAAA;AAClB,WAAA;AACF,QAAA;AACF,MAAA,CAAA,CAAA,OAAS7B,KAAAA,EAAO;AACd,QAAA,OAAO;UACLyB,KAAAA,EAAO,KAAA;UACPC,MAAAA,EAAQ;AACN,YAAA,CAAA,mCAAA,EAAsC1B,iBAAiBC,KAAAA,GAAQD,KAAAA,CAAME,OAAAA,GAAUiC,MAAAA,CAAOnC,KAAAA,CAAAA,CAAAA;;AAExF2B,UAAAA,SAAAA,EAAWC,KAAKC,GAAAA;AAClB,SAAA;AACF,MAAA;AAEA,MAAA,OAAO;QACLJ,KAAAA,EAAO,IAAA;AACPC,QAAAA,MAAAA,EAAQ,EAAA;AACRC,QAAAA,SAAAA,EAAWC,KAAKC,GAAAA;AAClB,OAAA;AACF,IAAA,CAAA,CAAA,OAAS7B,KAAAA,EAAO;AACd,MAAA,OAAO;QACLyB,KAAAA,EAAO,KAAA;QACPC,MAAAA,EAAQ;AACN,UAAA,CAAA,gCAAA,EAAmC1B,iBAAiBC,KAAAA,GAAQD,KAAAA,CAAME,OAAAA,GAAUiC,MAAAA,CAAOnC,KAAAA,CAAAA,CAAAA;;AAErF2B,QAAAA,SAAAA,EAAWC,KAAKC,GAAAA;AAClB,OAAA;AACF,IAAA;AACF,EAAA;AACF;AC1OA,IAAMqB,WACJ,OAAOC,UAAAA,KAAe,WAAA,IACtB,OAAQA,WAAmBC,MAAAA,KAAW,WAAA;AACxC,IAAMC,aAAAA,GAAgBH,QAAAA,GAAYC,UAAAA,CAAmBG,SAAAA,GAAeA,aAAAA,CAAAA,SAAAA;AA6C7D,IAAMC,gBAAAA,GAAN,cAA+BC,0BAAAA,CAAAA;EApDtC;;;EAqDUC,EAAAA,GAAU,IAAA;AACVC,EAAAA,GAAAA;AACAC,EAAAA,OAAAA;EAMAC,mBAAAA,GAAkC,IAAA;EAClCC,WAAAA,GAAc,KAAA;EACdC,SAAAA,GAAY,CAAA;AACZC,EAAAA,eAAAA,uBAAsBC,GAAAA,EAAAA;EAQtBC,YAAAA,GAAkC,IAAA;EAClCC,gBAAAA,GAAsC,IAAA;AACtCC,EAAAA,YAAAA;EACAC,cAAAA,GAAoC,IAAA;EACpCC,kBAAAA,GAA2C,IAAA;EAEnD,WAAA,CAAYX,GAAAA,EAAaC,OAAAA,GAAmC,EAAC,EAAG;AAC9D,IAAA,KAAA,EAAK;AAEL,IAAA,IAAA,CAAKD,GAAAA,GAAMA,GAAAA;AACX,IAAA,IAAA,CAAKS,YAAAA,GAAe,EAAA;AACpB,IAAA,IAAA,CAAKR,OAAAA,GAAU;AACbW,MAAAA,iBAAAA,EAAmBX,QAAQW,iBAAAA,IAAqB,CAAA;AAChDC,MAAAA,iBAAAA,EAAmBZ,QAAQY,iBAAAA,IAAqB,GAAA;AAChDC,MAAAA,iBAAAA,EAAmBb,QAAQa,iBAAAA,IAAqB,GAAA;AAChDC,MAAAA,iBAAAA,EAAmBd,QAAQc,iBAAAA,IAAqB,GAAA;AAChDC,MAAAA,iBAAAA,EAAmBf,OAAAA,CAAQe,iBAAAA;AAC3Bd,MAAAA,mBAAAA,EAAqBD,OAAAA,CAAQC,mBAAAA;AAC7Be,MAAAA,iBAAAA,EAAmBhB,QAAQgB,iBAAAA,IAAqB;AAClD,KAAA;AAGA,IAAA,IAAIhB,QAAQC,mBAAAA,EAAqB;AAC/B,MAAA,IAAA,CAAKA,sBAAsBD,OAAAA,CAAQC,mBAAAA;IACrC,CAAA,MAAA,IAAW,IAAA,CAAKD,QAAQe,iBAAAA,EAAmB;AACzC,MAAA,IAAA,CAAKd,mBAAAA,GAAsB,IAAItE,wBAAAA,CAC7B,IAAA,CAAKqE,QAAQe,iBAAiB,CAAA;AAElC,IAAA;AACF,EAAA;AAEA,EAAA,MAAME,OAAAA,GAAyB;AAC7B,IAAA,OAAO,IAAIC,OAAAA,CAAQ,CAACnE,OAAAA,EAASoE,MAAAA,KAAAA;AAC3B,MAAA,IAAI,KAAKjB,WAAAA,EAAa;AACpBnD,QAAAA,OAAAA,EAAAA;AACA,QAAA;AACF,MAAA;AAEA,MAAA,MAAMqE,OAAAA,GAAUC,WAAW,MAAA;AACzBF,QAAAA,MAAAA,CAAO,IAAI7E,KAAAA,CAAM,oBAAA,CAAA,CAAA;MACnB,CAAA,EAAG,IAAA,CAAK0D,QAAQa,iBAAiB,CAAA;AAEjC,MAAA,IAAA,CAAKf,EAAAA,GAAK,IAAIJ,aAAAA,CAAc,IAAA,CAAKK,GAAG,CAAA;AAGpC,MAAA,IAAIR,QAAAA,EAAU;AAEZ,QAAA,IAAA,CAAKO,EAAAA,CAAGwB,SAAS,MAAA;AACfC,UAAAA,YAAAA,CAAaH,OAAAA,CAAAA;AACb,UAAA,IAAA,CAAKlB,WAAAA,GAAc,IAAA;AACnB,UAAA,IAAA,CAAKsB,KAAK,WAAA,CAAA;AACVzE,UAAAA,OAAAA,EAAAA;AACF,QAAA,CAAA;AAEA,QAAA,IAAA,CAAK+C,EAAAA,CAAG2B,OAAAA,GAAU,CAACC,MAAAA,KAAAA;AACjBH,UAAAA,YAAAA,CAAaH,OAAAA,CAAAA;AACb,UAAA,IAAA,CAAKI,IAAAA,CAAK,OAAA,EAAS,IAAIlF,KAAAA,CAAM,iBAAA,CAAA,CAAA;AAC7B6E,UAAAA,MAAAA,CAAO,IAAI7E,KAAAA,CAAM,iBAAA,CAAA,CAAA;AACnB,QAAA,CAAA;AAEA,QAAA,IAAA,CAAKwD,EAAAA,CAAG6B,SAAAA,GAAY,CAACC,KAAAA,KAAAA;AACnB,UAAA,IAAA,CAAKC,aAAAA,CAAcD,MAAME,IAAI,CAAA;AAC/B,QAAA,CAAA;AAEA,QAAA,IAAA,CAAKhC,EAAAA,CAAGiC,UAAU,MAAA;AAChB,UAAA,IAAA,CAAK7B,WAAAA,GAAc,KAAA;AACnB,UAAA,IAAA,CAAKsB,KAAK,cAAA,CAAA;AACV,UAAA,IAAA,CAAKQ,OAAAA,EAAO;AACd,QAAA,CAAA;MACF,CAAA,MAAO;AAEL,QAAA,IAAA,CAAKlC,EAAAA,CAAGmC,EAAAA,CAAG,MAAA,EAAQ,MAAA;AACjBV,UAAAA,YAAAA,CAAaH,OAAAA,CAAAA;AACb,UAAA,IAAA,CAAKlB,WAAAA,GAAc,IAAA;AACnB,UAAA,IAAA,CAAKsB,KAAK,WAAA,CAAA;AACVzE,UAAAA,OAAAA,EAAAA;QACF,CAAA,CAAA;AAEA,QAAA,IAAA,CAAK+C,EAAAA,CAAGmC,EAAAA,CAAG,OAAA,EAAS,CAAC5F,KAAAA,KAAAA;AACnBkF,UAAAA,YAAAA,CAAaH,OAAAA,CAAAA;AACb,UAAA,IAAA,CAAKI,IAAAA,CAAK,SAASnF,KAAAA,CAAAA;AACnB8E,UAAAA,MAAAA,CAAO9E,KAAAA,CAAAA;QACT,CAAA,CAAA;AAEA,QAAA,IAAA,CAAKyD,EAAAA,CAAGmC,EAAAA,CAAG,SAAA,EAAW,CAACH,IAAAA,KAAAA;AACrB,UAAA,IAAA,CAAKD,aAAAA,CAAcC,IAAAA,CAAKI,QAAAA,EAAQ,CAAA;QAClC,CAAA,CAAA;AAEA,QAAA,IAAA,CAAKpC,EAAAA,CAAGmC,EAAAA,CAAG,OAAA,EAAS,MAAA;AAClB,UAAA,IAAA,CAAK/B,WAAAA,GAAc,KAAA;AACnB,UAAA,IAAA,CAAKsB,KAAK,cAAA,CAAA;AACV,UAAA,IAAA,CAAKQ,OAAAA,EAAO;QACd,CAAA,CAAA;AACF,MAAA;IACF,CAAA,CAAA;AACF,EAAA;EAEAG,UAAAA,GAAmB;AACjB,IAAA,IAAI,KAAKrC,EAAAA,EAAI;AACX,MAAA,IAAA,CAAKA,GAAGsC,KAAAA,EAAK;AACb,MAAA,IAAA,CAAKtC,EAAAA,GAAK,IAAA;AACZ,IAAA;AACA,IAAA,IAAA,CAAKkC,OAAAA,EAAO;AACd,EAAA;EAEQA,OAAAA,GAAgB;AAEtB,IAAA,KAAA,MAAW,GAAGK,OAAAA,CAAAA,IAAY,KAAKjC,eAAAA,EAAiB;AAC9CmB,MAAAA,YAAAA,CAAac,QAAQjB,OAAO,CAAA;AAC5BiB,MAAAA,OAAAA,CAAQlB,MAAAA,CAAO,IAAI7E,KAAAA,CAAM,mBAAA,CAAA,CAAA;AAC3B,IAAA;AACA,IAAA,IAAA,CAAK8D,gBAAgBkC,KAAAA,EAAK;AAG1B,IAAA,IAAI,KAAKhC,YAAAA,EAAc;AACrB,MAAA,IAAA,CAAKA,YAAAA,CAAaiC,KAAK,CAAA,CAAA;AACvB,MAAA,IAAA,CAAKjC,YAAAA,GAAe,IAAA;AACtB,IAAA;AACA,IAAA,IAAI,KAAKC,gBAAAA,EAAkB;AACzB,MAAA,IAAA,CAAKA,gBAAAA,CAAiBgC,KAAK,CAAA,CAAA;AAC3B,MAAA,IAAA,CAAKhC,gBAAAA,GAAmB,IAAA;AAC1B,IAAA;AACA,IAAA,IAAI,KAAKE,cAAAA,EAAgB;AACvB,MAAA,IAAA,CAAKA,cAAAA,CAAe8B,KAAK,CAAA,CAAA;AACzB,MAAA,IAAA,CAAK9B,cAAAA,GAAiB,IAAA;AACxB,IAAA;AAGA,IAAA,IAAA,CAAKD,YAAAA,GAAe,EAAA;AAGpB,IAAA,IAAA,CAAKE,kBAAAA,GAAqB,IAAA;AAC5B,EAAA;;;;;;;AAQA,EAAA,MAAM8B,kBAAAA,GAGH;AAED,IAAA,IAAI,CAAC,IAAA,CAAKtC,WAAAA,IAAe,CAAC,KAAKJ,EAAAA,EAAI;AACjC,MAAA,MAAM,KAAKmB,OAAAA,EAAO;AACpB,IAAA;AAGA,IAAA,IAAI,CAAC,IAAA,CAAKX,YAAAA,IAAgB,CAAC,KAAKE,YAAAA,EAAc;AAC5C,MAAA,MAAM,KAAKiC,SAAAA,EAAS;AACtB,IAAA;AAGA,IAAA,IACE,IAAA,CAAKxC,uBACL,CAAC,IAAA,CAAKD,QAAQgB,iBAAAA,IACd,CAAC,KAAKN,kBAAAA,EACN;AACA,MAAA,MAAM,IAAIpE,MACR,mEAAA,CAAA;AAEJ,IAAA;AAGA,IAAA,IAAI,KAAKoE,kBAAAA,EAAoB;AAC3B,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,CAAKA,kBAAAA;AACb,MAAA,CAAA,CAAA,OAASrE,KAAAA,EAAO;AAGd,QAAA,IAAA,CAAK8F,UAAAA,EAAU;AACf,QAAA,MAAM9F,KAAAA;AACR,MAAA;AACF,IAAA;AAGA,IAAA,IAAI,CAAC,IAAA,CAAKiE,YAAAA,IAAgB,CAAC,KAAKE,YAAAA,EAAc;AAC5C,MAAA,MAAM,IAAIlE,MAAM,8CAAA,CAAA;AAClB,IAAA;AAEA,IAAA,OAAO;AACLgE,MAAAA,YAAAA,EAAc,IAAA,CAAKA,YAAAA;AACnBE,MAAAA,YAAAA,EAAc,IAAA,CAAKA;AACrB,KAAA;AACF,EAAA;AAEQqB,EAAAA,aAAAA,CAAcC,IAAAA,EAAoB;AACxC,IAAA,IAAI;AAEF,MAAA,MAAMY,MAAAA,GAASC,IAAAA,CAAKC,KAAAA,CAAMd,IAAAA,CAAAA;AAC1B,MAAA,MAAMe,YAAYH,MAAAA,CAAOG,SAAAA;AAGzB,MAAA,IAAIA,SAAAA,EAAW;AACb,QAAA,OAAOH,MAAAA,CAAOG,SAAAA;AAChB,MAAA;AAGA,MAAA,MAAMtG,UAAU,IAAA,CAAKuG,kBAAAA,CAAmBH,IAAAA,CAAKI,SAAAA,CAAUL,MAAAA,CAAAA,CAAAA;AAGvD,MAAA,IAAIG,SAAAA,IAAa,IAAA,CAAKzC,eAAAA,CAAgB4C,GAAAA,CAAIH,SAAAA,CAAAA,EAAY;AACpD,QAAA,MAAMR,OAAAA,GAAU,IAAA,CAAKjC,eAAAA,CAAgB6C,GAAAA,CAAIJ,SAAAA,CAAAA;AACzC,QAAA,IAAA,CAAKzC,eAAAA,CAAgB8C,OAAOL,SAAAA,CAAAA;AAC5BtB,QAAAA,YAAAA,CAAac,QAAQjB,OAAO,CAAA;AAG5B,QAAA,IAAI7E,OAAAA,CAAQ4G,SAAS,OAAA,EAAS;AAE5B,UAAA,MAAMC,QAAAA,GAAW7G,OAAAA;AACjB8F,UAAAA,OAAAA,CAAQlB,OAAO,IAAI7E,KAAAA,CAAM8G,QAAAA,CAAS/G,KAAAA,CAAME,OAAO,CAAA,CAAA;AACjD,QAAA,CAAA,MAAA,IAAWA,OAAAA,CAAQ4G,IAAAA,CAAKE,QAAAA,CAAS,WAAA,CAAA,EAAc;AAE7C,UAAA,MAAMC,YAAAA,GAAgB/G,OAAAA,CAAgBgH,OAAAA,GACjChH,OAAAA,CAAgBgH,SAAO,GACxBhH,OAAAA;AACJ,UAAA,IAAI+G,aAAajH,KAAAA,EAAO;AACtBgG,YAAAA,OAAAA,CAAQlB,OAAO,IAAI7E,KAAAA,CAAMgH,YAAAA,CAAajH,KAAAA,CAAME,OAAO,CAAA,CAAA;UACrD,CAAA,MAAO;AACL8F,YAAAA,OAAAA,CAAQtF,QAAQR,OAAAA,CAAAA;AAClB,UAAA;QACF,CAAA,MAAO;AACL8F,UAAAA,OAAAA,CAAQtF,QAAQR,OAAAA,CAAAA;AAClB,QAAA;AACA,QAAA;AACF,MAAA;AAEA,MAAA,IAAA,CAAKiF,IAAAA,CAAK,WAAWjF,OAAAA,CAAAA;AACvB,IAAA,CAAA,CAAA,OAASF,KAAAA,EAAO;AACd,MAAA,IAAA,CAAKmF,KAAK,OAAA,EAAS,IAAIlF,MAAM,CAAA,yBAAA,EAA4BD,KAAAA,EAAO,CAAA,CAAA;AAClE,IAAA;AACF,EAAA;AAEQmH,EAAAA,WAAAA,CAAejH,OAAAA,EAA0B;AAC/C,IAAA,OAAO,IAAI2E,OAAAA,CAAQ,CAACnE,OAAAA,EAASoE,MAAAA,KAAAA;AAC3B,MAAA,IAAI,CAAC,IAAA,CAAKjB,WAAAA,IAAe,CAAC,KAAKJ,EAAAA,EAAI;AACjCqB,QAAAA,MAAAA,CAAO,IAAI7E,KAAAA,CAAM,eAAA,CAAA,CAAA;AACjB,QAAA;AACF,MAAA;AAEA,MAAA,MAAMuG,SAAAA,GAAY,OAAO,EAAE,IAAA,CAAK1C,SAAS,CAAA,CAAA,EAAIlC,IAAAA,CAAKC,KAAG,CAAA,CAAA;AAErD,MAAA,MAAMuF,aAAAA,GAAgBlH,OAAAA;AACtBkH,MAAAA,aAAAA,CAAcZ,SAAAA,GAAYA,SAAAA;AAE1B,MAAA,MAAMzB,OAAAA,GAAUC,WAAW,MAAA;AACzB,QAAA,IAAA,CAAKjB,eAAAA,CAAgB8C,OAAOL,SAAAA,CAAAA;AAC5B1B,QAAAA,MAAAA,CAAO,IAAI7E,KAAAA,CAAM,iBAAA,CAAA,CAAA;AACnB,MAAA,CAAA,EAAG,GAAA,CAAA;AAEH,MAAA,IAAA,CAAK8D,eAAAA,CAAgBsD,IAAIb,SAAAA,EAAW;AAAE9F,QAAAA,OAAAA;AAASoE,QAAAA,MAAAA;AAAQC,QAAAA;OAAQ,CAAA;AAE/D,MAAA,IAAI;AAEF,QAAA,MAAMuC,iBAAAA,GAAoB,IAAA,CAAKC,gBAAAA,CAAiBH,aAAAA,CAAAA;AAChD,QAAA,IAAA,CAAK3D,EAAAA,CAAG+D,KAAKF,iBAAAA,CAAAA;AACf,MAAA,CAAA,CAAA,OAAStH,KAAAA,EAAO;AACd,QAAA,IAAA,CAAK+D,eAAAA,CAAgB8C,OAAOL,SAAAA,CAAAA;AAC5BtB,QAAAA,YAAAA,CAAaH,OAAAA,CAAAA;AACbD,QAAAA,MAAAA,CAAO9E,KAAAA,CAAAA;AACT,MAAA;IACF,CAAA,CAAA;AACF,EAAA;AAEQuH,EAAAA,gBAAAA,CAAiBrH,OAAAA,EAAsB;AAC7C,IAAA,IAAI;AAEF,MAAA,IAAIA,OAAAA,IAAW,OAAOA,OAAAA,CAAQuH,MAAAA,KAAW,UAAA,EAAY;AACnD,QAAA,MAAMC,OAAAA,GAAUxH,QAAQuH,MAAAA,EAAM;AAE9B,QAAA,IAAIvH,QAAQsG,SAAAA,EAAW;AACrBkB,UAAAA,OAAAA,CAAQlB,YAAYtG,OAAAA,CAAQsG,SAAAA;AAC9B,QAAA;AACA,QAAA,OAAOF,IAAAA,CAAKI,UAAUgB,OAAAA,CAAAA;AACxB,MAAA;AAGA,MAAA,OAAOpB,IAAAA,CAAKI,UAAUxG,OAAAA,CAAAA;AACxB,IAAA,CAAA,CAAA,OAASF,KAAAA,EAAO;AACd,MAAA,MAAM,IAAIC,KAAAA,CACR,CAAA,6BAAA,EACED,KAAAA,YAAiBC,KAAAA,GAAQD,MAAME,OAAAA,GAAUiC,MAAAA,CAAOnC,KAAAA,CAAAA,CAAAA,CAChD,CAAA;AAEN,IAAA;AACF,EAAA;AAEQyG,EAAAA,kBAAAA,CAAmBhB,IAAAA,EAAmB;AAC5C,IAAA,IAAI;AACF,MAAA,MAAMY,MAAAA,GAASC,IAAAA,CAAKC,KAAAA,CAAMd,IAAAA,CAAAA;AAG1B,MAAA,IAAI,CAACkC,gCAAAA,EAAiB;AACpB,QAAA,MAAM,IAAI1H,MAAM,8BAAA,CAAA;AAClB,MAAA;AAEA,MAAA,IAAI,OAAO0H,gCAAAA,CAAgBzF,MAAAA,KAAW,UAAA,EAAY;AAChD,QAAA,MAAM,IAAIjC,MAAM,0CAAA,CAAA;AAClB,MAAA;AAGA,MAAA,MAAM2H,MAAAA,GAASD,gCAAAA,CAAgBzF,MAAAA,CAAOmE,MAAAA,CAAAA;AACtC,MAAA,IAAIwB,WAAAA,CAAOC,MAAAA,CAAOF,MAAAA,CAAAA,EAAS;AAEzB,QAAA,OAAOvB,MAAAA;AACT,MAAA;AAEA,MAAA,OAAOuB,MAAAA,CAAOG,KAAAA;AAChB,IAAA,CAAA,CAAA,OAAS/H,KAAAA,EAAO;AACd,MAAA,MAAM,IAAIC,KAAAA,CACR,CAAA,+BAAA,EACED,KAAAA,YAAiBC,KAAAA,GAAQD,MAAME,OAAAA,GAAUiC,MAAAA,CAAOnC,KAAAA,CAAAA,CAAAA,CAChD,CAAA;AAEN,IAAA;AACF,EAAA;AAEA,EAAA,MAAMoG,UAAU4B,YAAAA,EAA2C;AAEzD,IAAA,MAAM,EAAEC,gBAAAA,EAAkB/D,gBAAAA,EAAgB,GAAKgE,wCAAAA,EAAAA;AAG/C,IAAA,IAAA,CAAKhE,gBAAAA,GAAmBA,gBAAAA;AAGxB,IAAA,MAAMiE,UAAAA,GAAaC,qBAAY,EAAA,CAAA;AAG/B,IAAA,IAAA,CAAKhE,cAAAA,GAAiB+D,UAAAA;AAEtB,IAAA,MAAMnC,OAAAA,GAAU,IAAIqC,0CAAAA,CAA0B;MAC5CC,SAAAA,EAAWL,gBAAAA;MACXhH,KAAAA,EAAOkH,UAAAA;AACPH,MAAAA;KACF,CAAA;AAEA,IAAA,MAAMO,QAAAA,GAAW,MAAM,IAAA,CAAKpB,WAAAA,CAAiBnB,OAAAA,CAAAA;AAG7C,IAAA,MAAMiB,YAAAA,GAAesB,SAASrB,OAAAA,EAAO;AACrC,IAAA,IACED,YAAAA,CAAauB,wBAAAA,IACbvB,YAAAA,CAAa9C,YAAAA,IACb,KAAKD,gBAAAA,EACL;AAEA,MAAA,IAAA,CAAKC,eAAe8C,YAAAA,CAAa9C,YAAAA;AAGjC,MAAA,MAAMsE,UAAAA,GAAaC,mBAAAA,CAAWzB,YAAAA,CAAauB,wBAAwB,CAAA;AAGnE,MAAA,IAAA,CAAKvE,YAAAA,GAAe0E,oCAAAA,CAClB,IAAA,CAAKzE,gBAAAA,EACLuE,UAAAA,CAAAA;AAEJ,IAAA;AAGA,IAAA,IACE,IAAA,CAAK7E,uBACLqD,YAAAA,CAAa2B,cAAAA,IACb3B,aAAauB,wBAAAA,IACb,CAAC,IAAA,CAAK7E,OAAAA,CAAQgB,iBAAAA,EACd;AAEA,MAAA,MAAM8D,UAAAA,GAAaC,mBAAAA,CAAWzB,YAAAA,CAAauB,wBAAwB,CAAA;AAGnE,MAAA,IAAA,CAAKnE,kBAAAA,GAAqB,IAAA,CAAKwE,yBAAAA,CAC7B5B,YAAAA,CAAa2B,gBACbH,UAAAA,CAAAA;AAEJ,IAAA;AAEA,IAAA,OAAOF,QAAAA;AACT,EAAA;AAEA,EAAA,MAAMO,YAAYC,MAAAA,EAYD;AAEf,IAAA,MAAM,EAAE9E,YAAAA,EAAcE,YAAAA,EAAY,GAAK,MAAM,KAAKgC,kBAAAA,EAAkB;AAGpE,IAAA,IAAI6C,aAAAA;AACJ,IAAA,IAAI,OAAOD,MAAAA,CAAO7I,OAAAA,KAAY,QAAA,EAAU;AAEtC,MAAA,MAAM+I,QAAAA,GAAWF,MAAAA,CAAO7I,OAAAA,CAAQgJ,UAAAA,CAAW,IAAA,CAAA,GACvCH,MAAAA,CAAO7I,OAAAA,CAAQiJ,KAAAA,CAAM,CAAA,CAAA,GACrBJ,MAAAA,CAAO7I,OAAAA;AACX8I,MAAAA,aAAAA,GAAgBN,oBAAWO,QAAAA,CAAAA;IAC7B,CAAA,MAAO;AAELD,MAAAA,aAAAA,GAAgBD,MAAAA,CAAO7I,OAAAA;AACzB,IAAA;AAGA,IAAA,MAAMkJ,iBAAAA,GAAoB,MAAMC,gCAAAA,CAC9BN,MAAAA,CAAOO,UACPrF,YAAAA,EACAE,YAAAA,EACA4E,OAAOQ,WAAW,CAAA;AAGpB,IAAA,MAAMvD,OAAAA,GAAU,IAAIwD,4CAAAA,CAA4B;AAC9CC,MAAAA,WAAAA,EAAaV,MAAAA,CAAOU,WAAAA;AACpBF,MAAAA,WAAAA,EAAaR,MAAAA,CAAOQ,WAAAA;AACpBG,MAAAA,QAAAA,EAAUX,MAAAA,CAAOW,QAAAA;AACjBC,MAAAA,cAAAA,EAAgBZ,MAAAA,CAAOY,cAAAA;AACvBC,MAAAA,KAAAA,EAAOb,MAAAA,CAAOa,KAAAA;MACdN,QAAAA,EAAUF,iBAAAA;MACVlJ,OAAAA,EAAS8I,aAAAA;AACTa,MAAAA,QAAAA,EAAUd,MAAAA,CAAOc,QAAAA;AACjB7B,MAAAA,YAAAA,EAAce,MAAAA,CAAOf,YAAAA;AACrB8B,MAAAA,MAAAA,EAAQf,MAAAA,CAAOe,MAAAA;AACfC,MAAAA,aAAAA,EAAehB,MAAAA,CAAOgB;KACxB,CAAA;AAEA,IAAA,OAAO,IAAA,CAAK5C,YAAiBnB,OAAAA,CAAAA;AAC/B,EAAA;;;;;AAMA,EAAA,MAAMgE,OAAOjB,MAAAA,EAW4C;AAEvD,IAAA,IAAIA,MAAAA,CAAOQ,WAAAA,KAAgBU,qBAAAA,CAAiBC,OAAAA,EAAS;AACnD,MAAA,MAAM,IAAIjK,MACR,4FAAA,CAAA;AAEJ,IAAA;AAGA,IAAA,MAAM,EAAEgE,YAAAA,EAAcE,YAAAA,EAAY,GAAK,MAAM,KAAKgC,kBAAAA,EAAkB;AAGpE,IAAA,MAAMgE,mBAAAA,GAAsBC,kCAAAA,CAC1BrB,MAAAA,CAAOsB,UAAAA,EACPpG,cACAE,YAAAA,CAAAA;AAKF,IAAA,MAAM6B,OAAAA,GAAU,IAAIsE,uCAAAA,CAAuB;AACzCb,MAAAA,WAAAA,EAAaV,MAAAA,CAAOU,WAAAA;AACpBF,MAAAA,WAAAA,EAAaR,MAAAA,CAAOQ,WAAAA;AACpBM,MAAAA,QAAAA,EAAUd,MAAAA,CAAOc,QAAAA;AACjBU,MAAAA,UAAAA,EAAYxB,MAAAA,CAAOwB,UAAAA;AACnBC,MAAAA,SAAAA,EAAWzB,MAAAA,CAAOyB,SAAAA;MAClBH,UAAAA,EAAYF,mBAAAA;AACZM,MAAAA,SAAAA,EAAW1B,MAAAA,CAAO0B,SAAAA;AAClBzC,MAAAA,YAAAA,EAAce,MAAAA,CAAOf,YAAAA;AACrB8B,MAAAA,MAAAA,EAAQf,MAAAA,CAAOe,MAAAA;AACfC,MAAAA,aAAAA,EAAehB,MAAAA,CAAOgB;KACxB,CAAA;AAGA,IAAA,MAAMxB,QAAAA,GAAW,MAAM,IAAA,CAAKpB,WAAAA,CAAiBnB,OAAAA,CAAAA;AAC7C,IAAA,MAAMiB,YAAAA,GAAesB,SAASrB,OAAAA,EAAO;AAGrC,IAAA,MAAMwD,YAAAA,GAAeC,oCAAAA,CACnB1D,YAAAA,CAAayD,YAAAA,EACbzG,cACAE,YAAAA,CAAAA;AAGF,IAAA,OAAOuG,YAAAA;AACT,EAAA;;;;;AAMA,EAAA,MAAME,WAAW7B,MAAAA,EAUwC;AAEvD,IAAA,MAAM,EAAE9E,YAAAA,EAAcE,YAAAA,EAAY,GAAK,MAAM,KAAKgC,kBAAAA,EAAkB;AAGpE,IAAA,MAAMgE,mBAAAA,GAAsBC,kCAAAA,CAC1BrB,MAAAA,CAAOsB,UAAAA,EACPpG,cACAE,YAAAA,CAAAA;AAIF,IAAA,MAAM6B,OAAAA,GAAU,IAAI6E,2CAAAA,CAA2B;AAC7CpB,MAAAA,WAAAA,EAAaV,MAAAA,CAAOU,WAAAA;MACpBF,WAAAA,EAAa,SAAA;AACbM,MAAAA,QAAAA,EAAUd,MAAAA,CAAOc,QAAAA;AACjBU,MAAAA,UAAAA,EAAYxB,MAAAA,CAAOwB,UAAAA;AACnBC,MAAAA,SAAAA,EAAWzB,MAAAA,CAAOyB,SAAAA;MAClBH,UAAAA,EAAYF,mBAAAA;AACZM,MAAAA,SAAAA,EAAW1B,MAAAA,CAAO0B,SAAAA;AAClBzC,MAAAA,YAAAA,EAAce,MAAAA,CAAOf,YAAAA;AACrB8B,MAAAA,MAAAA,EAAQf,MAAAA,CAAOe,MAAAA;AACfC,MAAAA,aAAAA,EAAehB,MAAAA,CAAOgB;KACxB,CAAA;AAGA,IAAA,MAAMxB,QAAAA,GAAW,MAAM,IAAA,CAAKpB,WAAAA,CAAiBnB,OAAAA,CAAAA;AAC7C,IAAA,MAAMiB,YAAAA,GAAesB,SAASrB,OAAAA,EAAO;AAGrC,IAAA,MAAMwD,YAAAA,GAAeC,oCAAAA,CACnB1D,YAAAA,CAAayD,YAAAA,EACbzG,cACAE,YAAAA,CAAAA;AAGF,IAAA,OAAOuG,YAAAA;AACT,EAAA;AAEA,EAAA,IAAII,SAAAA,GAAqB;AACvB,IAAA,OAAO,IAAA,CAAKjH,WAAAA;AACd,EAAA;;;;;;;;EAUA,MAAcgF,yBAAAA,CACZ9H,sBACA0H,UAAAA,EACe;AACf,IAAA,IAAI,CAAC,KAAK7E,mBAAAA,EAAqB;AAC7B,MAAA;AACF,IAAA;AAEA,IAAA,IAAI;AAEF,MAAA,MAAMmH,aAAAA,GAAgBC,eAAOvC,UAAAA,CAAAA;AAC7B,MAAA,MAAMzH,oBAAoBiK,KAAAA,CAAMlI,IAAAA,CAAKgI,aAAAA,CAAAA,CAClCG,GAAAA,CAAI,CAACC,CAAAA,KAAcA,CAAAA,CAAEtF,QAAAA,CAAS,EAAA,EAAIuF,QAAAA,CAAS,CAAA,EAAG,GAAA,CAAA,CAAA,CAC9CC,KAAK,EAAA,CAAA;AAIR,MAAA,IAAI,CAAC,KAAKjH,cAAAA,EAAgB;AACxB,QAAA,MAAM,IAAInE,MACR,6DAAA,CAAA;AAEJ,MAAA;AAEA,MAAA,MAAM2H,MAAAA,GAAS,MAAM,IAAA,CAAKhE,mBAAAA,CAAoB9C,OAC5CC,oBAAAA,EACAC,iBAAAA,EACA,KAAKoD,cAAc,CAAA;AAGrB,MAAA,IAAI,CAACwD,OAAOnG,KAAAA,EAAO;AACjB,QAAA,MAAMsF,WAAW,CAAA,iCAAA,EAAoCa,MAAAA,CAAOlG,MAAAA,CAAO2J,IAAAA,CACjE,IAAA,CAAA,CAAA,CAAA;AAEF,QAAA,IAAA,CAAKlG,IAAAA,CAAK,OAAA,EAAS,IAAIlF,KAAAA,CAAM8G,QAAAA,CAAAA,CAAAA;AAC7B,QAAA,MAAM,IAAI9G,MAAM8G,QAAAA,CAAAA;AAClB,MAAA;AAGA,MAAA,IAAA,CAAK5B,KAAK,SAAA,EAAW;QACnB2B,IAAAA,EAAM,sBAAA;AACNnF,QAAAA,SAAAA,EAAWC,KAAKC,GAAAA,EAAG;QACnB4D,IAAAA,EAAMmC;OACR,CAAA;AACF,IAAA,CAAA,CAAA,OAAS5H,KAAAA,EAAO;AACd,MAAA,MAAM+G,QAAAA,GAAW,mCACf/G,KAAAA,YAAiBC,KAAAA,GAAQD,MAAME,OAAAA,GAAUiC,MAAAA,CAAOnC,KAAAA,CAAAA,CAAAA,CAAAA;AAElD,MAAA,IAAA,CAAKmF,IAAAA,CAAK,OAAA,EAAS,IAAIlF,KAAAA,CAAM8G,QAAAA,CAAAA,CAAAA;AAC7B,MAAA,MAAM,IAAI9G,MAAM8G,QAAAA,CAAAA;AAClB,IAAA;AACF,EAAA;AACF;ACnqBO,IAAMuE,SAAAA,GAAY;;EAEvBC,iBAAAA,EAAmB,mBAAA;EACnBC,kBAAAA,EAAoB,oBAAA;EACpBC,aAAAA,EAAe,eAAA;;EAEfC,gBAAAA,EAAkB,kBAAA;EAClBC,0BAAAA,EAA4B,4BAAA;EAC5BC,kBAAAA,EAAoB,oBAAA;EACpBC,yBAAAA,EAA2B,2BAAA;EAC3BC,eAAAA,EAAiB,iBAAA;EACjBC,gBAAAA,EAAkB,kBAAA;EAClBC,YAAAA,EAAc,cAAA;EACdC,oBAAAA,EAAsB,sBAAA;;EAEtBC,wBAAAA,EAA0B,0BAAA;EAC1BC,qBAAAA,EAAuB;AACzB;AAMO,IAAMC,mBAAAA,GAAsB;EACjCC,SAAAA,EAAW,WAAA;EACXC,OAAAA,EAAS,SAAA;EACTC,MAAAA,EAAQ;AACV;AAWO,IAAeC,eAAAA,GAAf,cAAuCvM,KAAAA,CAAAA;EA/C9C;;;AAgDkBwM,EAAAA,IAAAA;AACA3F,EAAAA,IAAAA;AACA4F,EAAAA,OAAAA;EAEhB,WAAA,CACExM,OAAAA,EACAuM,IAAAA,EACA3F,IAAAA,EACA4F,OAAAA,EACA;AACA,IAAA,KAAA,CAAMxM,OAAAA,CAAAA;AACN,IAAA,IAAA,CAAKyM,IAAAA,GAAO,KAAK,WAAA,CAAYA,IAAAA;AAC7B,IAAA,IAAA,CAAKF,IAAAA,GAAOA,IAAAA;AACZ,IAAA,IAAA,CAAK3F,IAAAA,GAAOA,IAAAA;AACZ,IAAA,IAAA,CAAK4F,OAAAA,GAAUA,OAAAA;AACfE,IAAAA,MAAAA,CAAOC,cAAAA,CAAe,IAAA,EAAM,GAAA,CAAA,MAAA,CAAWC,SAAS,CAAA;AAClD,EAAA;EAEAC,MAAAA,GAAkC;AAChC,IAAA,OAAO;AACLJ,MAAAA,IAAAA,EAAM,IAAA,CAAKA,IAAAA;AACXzM,MAAAA,OAAAA,EAAS,IAAA,CAAKA,OAAAA;AACduM,MAAAA,IAAAA,EAAM,IAAA,CAAKA,IAAAA;AACX3F,MAAAA,IAAAA,EAAM,IAAA,CAAKA,IAAAA;AACXkG,MAAAA,KAAAA,EAAO,IAAA,CAAKA,KAAAA;AACZN,MAAAA,OAAAA,EAAS,IAAA,CAAKA;AAChB,KAAA;AACF,EAAA;AACF;AAKO,IAAeO,cAAAA,GAAf,cAAsCT,eAAAA,CAAAA;EAjF7C;;;EAkFE,WAAA,CACEtM,OAAAA,EACAuM,MACAC,OAAAA,EACA;AACA,IAAA,KAAA,CAAMxM,OAAAA,EAASuM,IAAAA,EAAML,mBAAAA,CAAoBC,SAAAA,EAAWK,OAAAA,CAAAA;AACtD,EAAA;AACF;AAGO,IAAeQ,YAAAA,GAAf,cAAoCV,eAAAA,CAAAA;EA5F3C;;;EA6FE,WAAA,CACEtM,OAAAA,EACAuM,MACAC,OAAAA,EACA;AACA,IAAA,KAAA,CAAMxM,OAAAA,EAASuM,IAAAA,EAAML,mBAAAA,CAAoBE,OAAAA,EAASI,OAAAA,CAAAA;AACpD,EAAA;AACF;AAGO,IAAeS,WAAAA,GAAf,cAAmCX,eAAAA,CAAAA;EAvG1C;;;EAwGE,WAAA,CACEtM,OAAAA,EACAuM,MACAC,OAAAA,EACA;AACA,IAAA,KAAA,CAAMxM,OAAAA,EAASuM,IAAAA,EAAML,mBAAAA,CAAoBG,MAAAA,EAAQG,OAAAA,CAAAA;AACnD,EAAA;AACF;AAIO,IAAMU,wBAAAA,GAAN,cAAuCH,cAAAA,CAAAA;EAnH9C;;;AAoHE,EAAA,WAAA,CAAYP,OAAAA,EAAmC;AAC7C,IAAA,KAAA,CAAM,6BAAA,EAA+BpB,SAAAA,CAAUC,iBAAAA,EAAmBmB,OAAAA,CAAAA;AACpE,EAAA;AACF;AAEO,IAAMW,+BAAAA,GAAN,cAA8CJ,cAAAA,CAAAA;EAzHrD;;;AA0HE,EAAA,WAAA,CAAYP,OAAAA,EAAmC;AAC7C,IAAA,KAAA,CACE,gCAAA,EACApB,SAAAA,CAAUE,kBAAAA,EACVkB,OAAAA,CAAAA;AAEJ,EAAA;AACF;AAEO,IAAMY,0BAAAA,GAAN,cAAyCL,cAAAA,CAAAA;EAnIhD;;;AAoIE,EAAA,WAAA,CAAYP,OAAAA,EAAmC;AAC7C,IAAA,KAAA,CAAM,4BAAA,EAA8BpB,SAAAA,CAAUG,aAAAA,EAAeiB,OAAAA,CAAAA;AAC/D,EAAA;AACF;AAIO,IAAMa,qBAAAA,GAAN,cAAoCL,YAAAA,CAAAA;EA3I3C;;;AA4IE,EAAA,WAAA,CAAYM,QAAgBd,OAAAA,EAAmC;AAC7D,IAAA,KAAA,CACE,CAAA,6BAAA,EAAgCc,MAAAA,CAAAA,CAAAA,EAChClC,SAAAA,CAAUI,gBAAAA,EACV;AAAE8B,MAAAA,MAAAA;MAAQ,GAAGd;KAAQ,CAAA;AAEzB,EAAA;AACF;AAEO,IAAMe,oCAAAA,GAAN,cAAmDP,YAAAA,CAAAA;EArJ1D;;;AAsJE,EAAA,WAAA,CAAYR,OAAAA,EAAmC;AAC7C,IAAA,KAAA,CACE,8CAAA,EACApB,SAAAA,CAAUK,0BAAAA,EACVe,OAAAA,CAAAA;AAEJ,EAAA;AACF;AAEO,IAAMgB,uBAAAA,GAAN,cAAsCR,YAAAA,CAAAA;EA/J7C;;;AAgKE,EAAA,WAAA,CAAYR,OAAAA,EAAmC;AAC7C,IAAA,KAAA,CACE,iCAAA,EACApB,SAAAA,CAAUM,kBAAAA,EACVc,OAAAA,CAAAA;AAEJ,EAAA;AACF;AAEO,IAAMiB,mCAAAA,GAAN,cAAkDT,YAAAA,CAAAA;EAzKzD;;;AA0KE,EAAA,WAAA,CAAYR,OAAAA,EAAmC;AAC7C,IAAA,KAAA,CACE,yCAAA,EACApB,SAAAA,CAAUO,yBAAAA,EACVa,OAAAA,CAAAA;AAEJ,EAAA;AACF;AAEO,IAAMkB,0BAAAA,GAAN,cAAyCV,YAAAA,CAAAA;EAnLhD;;;AAoLE,EAAA,WAAA,CAAYR,OAAAA,EAAmC;AAC7C,IAAA,KAAA,CACE,+CAAA,EACApB,SAAAA,CAAUQ,eAAAA,EACVY,OAAAA,CAAAA;AAEJ,EAAA;AACF;AAEO,IAAMmB,oBAAAA,GAAN,cAAmCX,YAAAA,CAAAA;EA7L1C;;;AA8LE,EAAA,WAAA,CAAYR,OAAAA,EAAmC;AAC7C,IAAA,KAAA,CAAM,2BAAA,EAA6BpB,SAAAA,CAAUS,gBAAAA,EAAkBW,OAAAA,CAAAA;AACjE,EAAA;AACF;AAEO,IAAMoB,kBAAAA,GAAN,cAAiCZ,YAAAA,CAAAA;EAnMxC;;;AAoME,EAAA,WAAA,CAAYM,QAAgBd,OAAAA,EAAmC;AAC7D,IAAA,KAAA,CACE,CAAA,mCAAA,EAAsCc,MAAAA,CAAAA,CAAAA,EACtClC,SAAAA,CAAUU,YAAAA,EACV;AAAEwB,MAAAA,MAAAA;MAAQ,GAAGd;KAAQ,CAAA;AAEzB,EAAA;AACF;AAEO,IAAMqB,wBAAAA,GAAN,cAAuCb,YAAAA,CAAAA;EA7M9C;;;AA8ME,EAAA,WAAA,CAAYR,OAAAA,EAAmC;AAC7C,IAAA,KAAA,CACE,gCAAA,EACApB,SAAAA,CAAUW,oBAAAA,EACVS,OAAAA,CAAAA;AAEJ,EAAA;AACF;AAOO,IAAMsB,kBAAAA,GAAN,cAAiCd,YAAAA,CAAAA;EA5NxC;;;;AA6NE,EAAA,WAAA,CACkBe,aAChBvB,OAAAA,EACA;AACA,IAAA,KAAA,CAAMuB,YAAY/N,OAAAA,EAASoL,SAAAA,CAAUU,cAAcU,OAAAA,CAAAA,EAAAA,KAHnCuB,WAAAA,GAAAA,WAAAA;AAIlB,EAAA;AACF;AAIO,IAAMC,+BAAAA,GAAN,cAA8Cf,WAAAA,CAAAA;EAvOrD;;;AAwOE,EAAA,WAAA,CAAYT,OAAAA,EAAmC;AAC7C,IAAA,KAAA,CACE,oCAAA,EACApB,SAAAA,CAAUa,qBAAAA,EACVO,OAAAA,CAAAA;AAEJ,EAAA;AACF;AAEO,IAAMyB,iCAAAA,GAAN,cAAgDhB,WAAAA,CAAAA;EAjPvD;;;AAkPE,EAAA,WAAA,CAAYT,OAAAA,EAAmC;AAC7C,IAAA,KAAA,CACE,6BAAA,EACApB,SAAAA,CAAUY,wBAAAA,EACVQ,OAAAA,CAAAA;AAEJ,EAAA;AACF;;;ACjOO,IAAM0B,mBAAAA,GAAN,cAAkC5K,8BAAAA,CAAAA;EAxBzC;;;;EAyBUC,EAAAA,GAAuB,IAAA;EACvB4K,YAAAA,GAAe,KAAA;EACfC,UAAAA,GAAa,KAAA;EACbC,wBAAAA,GAA2B,KAAA;EAC3BC,yBAAAA,GAA4B,CAAA;EAC5BC,eAAAA,GAAwC,IAAA;AAC/B9K,EAAAA,OAAAA;AAGA+K,EAAAA,MAAAA;EAEjB,WAAA,CACmBhL,GAAAA,EACjBC,OAAAA,GAAsC,EAAC,EACvC;AACA,IAAA,KAAA,EAAK,EAAA,KAHYD,GAAAA,GAAAA,GAAAA;AAIjB,IAAA,IAAA,CAAKgL,SAAS/K,OAAAA,CAAQ+K,MAAAA;AACtB,IAAA,IAAA,CAAK/K,OAAAA,GAAU;AACbW,MAAAA,iBAAAA,EAAmBX,QAAQW,iBAAAA,IAAqB,CAAA;AAChDC,MAAAA,iBAAAA,EAAmBZ,QAAQY,iBAAAA,IAAqB,GAAA;AAChDC,MAAAA,iBAAAA,EAAmBb,QAAQa,iBAAAA,IAAqB;AAClD,KAAA;AACF,EAAA;AAEA,EAAA,IAAIsG,SAAAA,GAAqB;AACvB,IAAA,OAAO,IAAA,CAAKuD,YAAAA;AACd,EAAA;;;;;;AAOA,EAAA,MAAMzJ,OAAAA,GAAyB;AAC7B,IAAA,IAAA,CAAK0J,UAAAA,GAAa,KAAA;AAClB,IAAA,IAAI,KAAKD,YAAAA,EAAc;AACvB,IAAA,IAAI,IAAA,CAAKI,eAAAA,EAAiB,OAAO,IAAA,CAAKA,eAAAA;AAEtC,IAAA,IAAA,CAAKA,eAAAA,GAAkB,IAAA,CAAKE,iBAAAA,EAAiB,CAAGC,QAAQ,MAAA;AACtD,MAAA,IAAA,CAAKH,eAAAA,GAAkB,IAAA;IACzB,CAAA,CAAA;AACA,IAAA,OAAO,IAAA,CAAKA,eAAAA;AACd,EAAA;EAEA3I,UAAAA,GAAmB;AACjB,IAAA,IAAA,CAAKwI,UAAAA,GAAa,IAAA;AAClB,IAAA,IAAI,KAAK7K,EAAAA,EAAI;AACX,MAAA,IAAA,CAAKA,GAAGsC,KAAAA,EAAK;AACb,MAAA,IAAA,CAAKtC,EAAAA,GAAK,IAAA;AACZ,IAAA;AACA,IAAA,IAAA,CAAK4K,YAAAA,GAAe,KAAA;AACpB,IAAA,IAAA,CAAKlJ,IAAAA,CAAK,cAAA,EAAgB0J,mCAAAA,CAAmBC,MAAM,CAAA;AACrD,EAAA;AAEAtH,EAAAA,IAAAA,CAAK/B,IAAAA,EAAoB;AACvB,IAAA,IAAI,CAAC,IAAA,CAAK4I,YAAAA,IAAgB,CAAC,KAAK5K,EAAAA,EAAI;AAClC,MAAA,MAAM,IAAI6J,0BAAAA,EAAAA;AACZ,IAAA;AACA,IAAA,IAAA,CAAK7J,EAAAA,CAAG+D,KAAK/B,IAAAA,CAAAA;AACf,EAAA;;;;;AAMA,EAAA,MAAckJ,iBAAAA,GAAmC;AAC/C,IAAA,IAAII,SAAAA;AACJ,IAAA,KAAA,IACMC,UAAU,CAAA,EACdA,OAAAA,IAAW,IAAA,CAAKrL,OAAAA,CAAQW,mBACxB0K,OAAAA,EAAAA,EACA;AACA,MAAA,IAAI;AACF,QAAA,MAAM,KAAKC,YAAAA,EAAY;AACvB,QAAA;AACF,MAAA,CAAA,CAAA,OAASjP,KAAAA,EAAO;AACd+O,QAAAA,SAAAA,GAAY/O,KAAAA;AACd,MAAA;AACF,IAAA;AACA,IAAA,MAAM+O,SAAAA;AACR,EAAA;EAEQE,YAAAA,GAA8B;AACpC,IAAA,OAAO,IAAIpK,OAAAA,CAAQ,CAACnE,OAAAA,EAASoE,MAAAA,KAAAA;AAC3B,MAAA,MAAMoK,aAAAA,GAAgBlK,WAAW,MAAA;AAC/B,QAAA,IAAA,CAAKvB,IAAIsC,KAAAA,EAAAA;AACTjB,QAAAA,MAAAA,CAAO,IAAIuI,+BAAAA,CAAgC;AAAE3J,UAAAA,GAAAA,EAAK,IAAA,CAAKA;AAAI,SAAA,CAAA,CAAA;MAC7D,CAAA,EAAG,IAAA,CAAKC,QAAQa,iBAAiB,CAAA;AAEjC,MAAA,IAAA,CAAKf,EAAAA,GAAK,IAAIH,eAAAA,CAAU,IAAA,CAAKI,GAAG,CAAA;AAEhC,MAAA,IAAA,CAAKD,EAAAA,CAAGwB,SAAS,MAAA;AACfC,QAAAA,YAAAA,CAAagK,aAAAA,CAAAA;AACb,QAAA,IAAA,CAAKb,YAAAA,GAAe,IAAA;AACpB,QAAA,IAAA,CAAKE,wBAAAA,GAA2B,IAAA;AAChC,QAAA,IAAA,CAAKC,yBAAAA,GAA4B,CAAA;AACjC,QAAA,IAAA,CAAKE,MAAAA,EAAQS,MAAM,sBAAA,EAAwB;AAAEzL,UAAAA,GAAAA,EAAK,IAAA,CAAKA;SAAI,CAAA;AAC3D,QAAA,IAAA,CAAKyB,KAAK,WAAA,CAAA;AACVzE,QAAAA,OAAAA,EAAAA;AACF,MAAA,CAAA;AAEA,MAAA,IAAA,CAAK+C,EAAAA,CAAG2B,UAAU,MAAA;AAChBF,QAAAA,YAAAA,CAAagK,aAAAA,CAAAA;AACb,QAAA,MAAME,GAAAA,GAAM,IAAIhC,wBAAAA,CAAyB;AAAE1J,UAAAA,GAAAA,EAAK,IAAA,CAAKA;SAAI,CAAA;AACzD,QAAA,IAAA,CAAKyB,IAAAA,CAAK,SAASiK,GAAAA,CAAAA;AACnBtK,QAAAA,MAAAA,CAAOsK,GAAAA,CAAAA;AACT,MAAA,CAAA;AAEA,MAAA,IAAA,CAAK3L,EAAAA,CAAG6B,SAAAA,GAAY,CAACC,KAAAA,KAAAA;AACnB,QAAA,IAAA,CAAKmJ,MAAAA,EAAQS,MAAM,6BAAA,EAA+B;AAAE1J,UAAAA,IAAAA,EAAMF,KAAAA,CAAME;SAAK,CAAA;AACrE,QAAA,IAAA,CAAKN,IAAAA,CAAK,SAAA,EAAWI,KAAAA,CAAME,IAAI,CAAA;AACjC,MAAA,CAAA;AAEA,MAAA,IAAA,CAAKhC,EAAAA,CAAGiC,OAAAA,GAAU,CAACH,KAAAA,KAAAA;AACjB,QAAA,IAAA,CAAK8I,YAAAA,GAAe,KAAA;AACpB,QAAA,IAAA,CAAKK,MAAAA,EAAQS,MAAM,mBAAA,EAAqB;AACtCzL,UAAAA,GAAAA,EAAK,IAAA,CAAKA,GAAAA;AACV2L,UAAAA,SAAAA,EAAW9J,KAAAA,CAAMkH;SACnB,CAAA;AACA,QAAA,IAAI,CAAC,KAAK6B,UAAAA,EAAY;AACpB,UAAA,IAAA,CAAKnJ,IAAAA,CAAK,cAAA,EAAgBI,KAAAA,CAAMkH,IAAI,CAAA;AACtC,QAAA;AACA,QAAA,IAAA,CAAK6C,cAAAA,CAAe/J,MAAMkH,IAAI,CAAA;AAChC,MAAA,CAAA;IACF,CAAA,CAAA;AACF,EAAA;;;;;;AAOQ6C,EAAAA,cAAAA,CAAeD,SAAAA,EAAyB;AAC9C,IAAA,IAAI,KAAKf,UAAAA,EAAY;AACrB,IAAA,IAAI,CAAC,KAAKC,wBAAAA,EAA0B;AACpC,IAAA,IAAI,IAAA,CAAKC,yBAAAA,IAA6B,IAAA,CAAK7K,OAAAA,CAAQW,iBAAAA,EACjD;AACF,IAAA,IACE+K,SAAAA,KAAcR,mCAAAA,CAAmBC,MAAAA,IACjCO,SAAAA,KAAcR,oCAAmBU,YAAAA,EACjC;AACA,MAAA,IAAA,CAAKb,MAAAA,EAAQS,MAAM,sDAAA,EAAmD;AACpEzL,QAAAA,GAAAA,EAAK,IAAA,CAAKA,GAAAA;AACV2L,QAAAA;OACF,CAAA;AACA,MAAA;AACF,IAAA;AAEA,IAAA,IAAA,CAAKb,yBAAAA,EAAAA;AACL,IAAA,IAAA,CAAKE,MAAAA,EAAQS,MAAM,qDAAA,EAAkD;AACnEzL,MAAAA,GAAAA,EAAK,IAAA,CAAKA,GAAAA;AACVsL,MAAAA,OAAAA,EAAS,IAAA,CAAKR,yBAAAA;AACdgB,MAAAA,WAAAA,EAAa,KAAK7L,OAAAA,CAAQW;KAC5B,CAAA;AAEAU,IAAAA,UAAAA,CAAW,MAAA;AACT,MAAA,IAAA,CAAKiK,YAAAA,EAAY,CAAGlP,KAAAA,CAAM,CAACC,KAAAA,KAAAA;AACzB,QAAA,MAAMoP,GAAAA,GAAMpP,iBAAiBC,KAAAA,GAAQD,KAAAA,GAAQ,IAAIC,KAAAA,CAAMkC,MAAAA,CAAOnC,KAAAA,CAAAA,CAAAA;AAC9D,QAAA,IAAA,CAAK0O,MAAAA,EAAQS,MACX,6BAAA,EACA;AAAEH,UAAAA,OAAAA,EAAS,IAAA,CAAKR;AAA0B,SAAA,EAC1CY,GAAAA,CAAAA;AAEF,QAAA,IAAA,CAAKV,MAAAA,EAAQ1O,MAAM,wCAAA,CAAA;AACnB,QAAA,IAAA,CAAKmF,IAAAA,CAAK,SAASiK,GAAAA,CAAAA;MACrB,CAAA,CAAA;IACF,CAAA,EAAG,IAAA,CAAKzL,QAAQY,iBAAiB,CAAA;AACnC,EAAA;AACF,CAAA;AC5JA,SAASkL,iBAAiBC,CAAAA,EAAU;AAClC,EAAA,OACE,OAAOA,CAAAA,KAAM,QAAA,IACbA,CAAAA,KAAM,IAAA,IACN,OAAQA,CAAAA,CAA8B,SAAA,CAAA,KAAe,QAAA,IACrD,OAAQA,CAAAA,CAA8B,MAAA,CAAA,KAAY,QAAA;AAEtD;AAPSD,MAAAA,CAAAA,gBAAAA,EAAAA,kBAAAA,CAAAA;AASF,IAAME,OAAAA,GAAN,MAAMA,QAAAA,CAAAA;EA9Cb;;;;;;;;EA+CUC,SAAAA,GAAY,KAAA;AACHC,EAAAA,MAAAA,GAAS,IAAIC,eAAAA,EAAAA;;;;;;AAO9B,EAAA,WAAA,CACmBC,SAAAA,EACAC,aAAAA,EACAC,aAAAA,EACAC,cAAAA,EACAxB,MAAAA,EACjB;SALiBqB,SAAAA,GAAAA,SAAAA;SACAC,aAAAA,GAAAA,aAAAA;SACAC,aAAAA,GAAAA,aAAAA;SACAC,cAAAA,GAAAA,cAAAA;SACAxB,MAAAA,GAAAA,MAAAA;AAChB,EAAA;AAEH,EAAA,IAAIvK,YAAAA,GAAuB;AACzB,IAAA,OAAO,IAAA,CAAK6L,aAAAA;AACd,EAAA;AAEA,EAAA,IAAI/L,YAAAA,GAA2B;AAC7B,IAAA,IAAI,KAAK2L,SAAAA,EAAW;AAClB,MAAA,MAAM,IAAI/B,oBAAAA,EAAAA;AACZ,IAAA;AACA,IAAA,OAAO,IAAA,CAAKoC,aAAAA;AACd,EAAA;;;;;;;;;AAUA,EAAA,aAAa7J,UACX2J,SAAAA,EACA/H,YAAAA,EACArE,OAAAA,GAA0B,IAC1B+K,MAAAA,EACkB;AAClB,IAAA,MAAMwB,cAAAA,GAAiBvM,QAAQuM,cAAAA,IAAkB,GAAA;AACjD,IAAA,MAAM,EAAEjI,gBAAAA,EAAkB/D,gBAAAA,EAAgB,GAAKgE,wCAAAA,EAAAA;AAC/C,IAAA,MAAMC,UAAAA,GAAaC,qBAAY,EAAA,CAAA;AAE/B,IAAA,MAAMpC,OAAAA,GAAU,IAAIqC,0CAAAA,CAA0B;MAC5CC,SAAAA,EAAWL,gBAAAA;MACXhH,KAAAA,EAAOkH,UAAAA;AACPH,MAAAA;KACF,CAAA;AAEA,IAAA,IAAIvC,IAAAA;AACJ,IAAA,IAAI;AACFA,MAAAA,IAAAA,GAAO,MAAMkK,QAAAA,CAAQQ,SAAAA,CACnBJ,SAAAA,EACA/J,SACAkK,cAAAA,CAAAA;AAEJ,IAAA,CAAA,CAAA,OAASlQ,KAAAA,EAAO;AACdkE,MAAAA,gBAAAA,CAAiBgC,KAAK,CAAA,CAAA;AACtBiC,MAAAA,UAAAA,CAAWjC,KAAK,CAAA,CAAA;AAChB,MAAA,MAAMhG,UAAUF,KAAAA,YAAiBC,KAAAA,GAAQD,KAAAA,CAAME,OAAAA,GAAUiC,OAAOnC,KAAAA,CAAAA;AAChE,MAAA,MAAM,IAAIuN,sBAAsBrN,OAAAA,CAAAA;AAClC,IAAA;AAEA,IAAA,IAAI,CAACuF,IAAAA,CAAK+C,wBAAAA,IAA4B,CAAC/C,KAAKtB,YAAAA,EAAc;AACxDD,MAAAA,gBAAAA,CAAiBgC,KAAK,CAAA,CAAA;AACtBiC,MAAAA,UAAAA,CAAWjC,KAAK,CAAA,CAAA;AAChB,MAAA,MAAM,IAAIuH,oCAAAA,EAAAA;AACZ,IAAA;AAEA,IAAA,MAAMtJ,eAAesB,IAAAA,CAAKtB,YAAAA;AAC1B,IAAA,MAAMsE,UAAAA,GAAaC,mBAAAA,CAAWjD,IAAAA,CAAK+C,wBAAwB,CAAA;AAC3D,IAAA,MAAMvE,YAAAA,GAAe0E,oCAAAA,CAAoBzE,gBAAAA,EAAkBuE,UAAAA,CAAAA;AAC3DvE,IAAAA,gBAAAA,CAAiBgC,KAAK,CAAA,CAAA;AAEtB,IAAA,IAAIvC,OAAAA,CAAQC,mBAAAA,IAAuB,CAACD,OAAAA,CAAQgB,iBAAAA,EAAmB;AAC7D,MAAA,IAAI,CAACc,KAAKmD,cAAAA,EAAgB;AACxB3E,QAAAA,YAAAA,CAAaiC,KAAK,CAAA,CAAA;AAClBiC,QAAAA,UAAAA,CAAWjC,KAAK,CAAA,CAAA;AAChB,QAAA,MAAM,IAAIwH,uBAAAA,CAAwB;UAChCF,MAAAA,EAAQ;SACV,CAAA;AACF,MAAA;AACA,MAAA,IAAI;AACF,QAAA,MAAMmC,SAAQS,iBAAAA,CACZ3K,IAAAA,CAAKmD,gBACLH,UAAAA,EACAN,UAAAA,EACAxE,QAAQC,mBAAmB,CAAA;AAE/B,MAAA,CAAA,CAAA,OAAS5D,KAAAA,EAAO;AACdiE,QAAAA,YAAAA,CAAaiC,KAAK,CAAA,CAAA;AAClBiC,QAAAA,UAAAA,CAAWjC,KAAK,CAAA,CAAA;AAChB,QAAA,MAAMlG,KAAAA;AACR,MAAA;AACF,IAAA;AAEAmI,IAAAA,UAAAA,CAAWjC,KAAK,CAAA,CAAA;AAChBwI,IAAAA,MAAAA,EAAQS,MAAM,qBAAA,EAAuB;AAAEhL,MAAAA;KAAa,CAAA;AAEpD,IAAA,OAAO,IAAIwL,QAAAA,CACTI,SAAAA,EACA5L,YAAAA,EACAF,YAAAA,EACAiM,gBACAxB,MAAAA,CAAAA;AAEJ,EAAA;AAEAvH,EAAAA,WAAAA,CAAejH,OAAAA,EAA8B;AAC3C,IAAA,IAAI,KAAK0P,SAAAA,EAAW;AAClB,MAAA,OAAO/K,OAAAA,CAAQC,MAAAA,CAAO,IAAI+I,oBAAAA,EAAAA,CAAAA;AAC5B,IAAA;AACA,IAAA,OAAO8B,QAAAA,CAAQQ,UACb,IAAA,CAAKJ,SAAAA,EACL7P,SACA,IAAA,CAAKgQ,cAAAA,EACL,IAAA,CAAKL,MAAAA,CAAOQ,MAAM,CAAA;AAEtB,EAAA;EAEAC,OAAAA,GAAgB;AACd,IAAA,IAAI,KAAKV,SAAAA,EAAW;AACpB,IAAA,IAAA,CAAKA,SAAAA,GAAY,IAAA;AACjB,IAAA,IAAA,CAAKC,OAAOU,KAAAA,EAAK;AACjB,IAAA,IAAA,CAAKN,aAAAA,CAAc/J,KAAK,CAAA,CAAA;AACxB,IAAA,IAAA,CAAKwI,MAAAA,EAAQS,MAAM,kBAAA,EAAoB;AACrChL,MAAAA,YAAAA,EAAc,IAAA,CAAK6L;KACrB,CAAA;AACF,EAAA;;;;;;AAOA,EAAA,OAAeG,SAAAA,CACbJ,SAAAA,EACA7P,OAAAA,EACA6E,OAAAA,EACAsL,MAAAA,EACY;AACZ,IAAA,MAAM7J,SAAAA,GAAYmJ,SAAQa,iBAAAA,EAAiB;AAE3C,IAAA,OAAO,IAAI3L,OAAAA,CAAW,CAACnE,OAAAA,EAASoE,MAAAA,KAAAA;AAC9B,MAAA,IAAIuL,QAAQI,OAAAA,EAAS;AACnB3L,QAAAA,MAAAA,CAAO,IAAI+I,sBAAAA,CAAAA;AACX,QAAA;AACF,MAAA;AAEA,MAAA,MAAMlI,0BAAU,MAAA,CAAA,MAAA;AACdT,QAAAA,YAAAA,CAAagK,aAAAA,CAAAA;AACba,QAAAA,SAAAA,CAAUW,GAAAA,CAAI,WAAWC,OAAAA,CAAAA;AACzBN,QAAAA,MAAAA,EAAQO,mBAAAA,CAAoB,SAASC,OAAAA,CAAAA;MACvC,CAAA,EAJgB,SAAA,CAAA;AAMhB,MAAA,MAAMA,0BAAU,MAAA,CAAA,MAAA;AACdlL,QAAAA,OAAAA,EAAAA;AACAb,QAAAA,MAAAA,CAAO,IAAI+I,sBAAAA,CAAAA;MACb,CAAA,EAHgB,SAAA,CAAA;AAKhBwC,MAAAA,MAAAA,EAAQS,gBAAAA,CAAiB,SAASD,OAAAA,EAAS;QAAEE,IAAAA,EAAM;OAAK,CAAA;AAExD,MAAA,MAAM7B,aAAAA,GAAgBlK,WAAW,MAAA;AAC/BW,QAAAA,OAAAA,EAAAA;AACAb,QAAAA,MAAAA,CAAO,IAAI8I,0BAAAA,CAA2B;AAAEpH,UAAAA;AAAU,SAAA,CAAA,CAAA;AACpD,MAAA,CAAA,EAAGzB,OAAAA,CAAAA;AAEH,MAAA,MAAM4L,OAAAA,2BAAWK,OAAAA,KAAAA;AACf,QAAA,IAAI3K,MAAAA;AACJ,QAAA,IAAI;AACFA,UAAAA,MAAAA,GAASC,IAAAA,CAAKC,MAAMyK,OAAAA,CAAAA;QACtB,CAAA,CAAA,MAAQ;AACN,UAAA;AACF,QAAA;AACA,QAAA,IAAI3K,MAAAA,CAAO,WAAA,CAAA,KAAiBG,SAAAA,EAAW;AAEvCb,QAAAA,OAAAA,EAAAA;AAEA,QAAA,MAAM,EAAEa,SAAAA,EAAWyK,IAAAA,EAAM,GAAGC,MAAAA,GAAS7K,MAAAA;AAGrC,QAAA,IAAI8K,GAAAA,GAA6B,IAAA;AACjC,QAAA,IAAI;AACF,UAAA,MAAMvJ,MAAAA,GAASD,gCAAAA,CAAgBzF,MAAAA,CAAOgP,IAAAA,CAAAA;AACtC,UAAA,IAAIrJ,WAAAA,CAAOuJ,OAAAA,CAAQxJ,MAAAA,CAAAA,QAAeA,MAAAA,CAAOG,KAAAA;QAC3C,CAAA,CAAA,MAAQ;AAER,QAAA;AAEA,QAAA,IAAIoJ,QAAQ,IAAA,EAAM;AAChBrM,UAAAA,MAAAA,CAAO,IAAIiJ,wBAAAA,CAAyB;AAAEvH,YAAAA;AAAU,WAAA,CAAA,CAAA;AAChD,UAAA;AACF,QAAA;AAEA,QAAA,IAAI2K,GAAAA,CAAIrK,SAAS,OAAA,EAAS;AACxBhC,UAAAA,MAAAA,CACE2K,gBAAAA,CAAiB0B,GAAAA,CAAInR,KAAK,CAAA,GACtB,IAAIgO,mBAAmBmD,GAAAA,CAAInR,KAAK,CAAA,GAChC,IAAI+N,wBAAAA,CAAyB;AAAEvH,YAAAA;AAAU,WAAA,CAAA,CAAA;QAEjD,CAAA,MAAO;AACL9F,UAAAA,OAAAA,CAAQyQ,GAAAA,CAAIjK,SAAO,CAAA;AACrB,QAAA;MACF,CAAA,EApCgB,SAAA,CAAA;AAsChB6I,MAAAA,SAAAA,CAAUnK,EAAAA,CAAG,WAAW+K,OAAAA,CAAAA;AAExB,MAAA,IAAI;AACFZ,QAAAA,SAAAA,CAAUvI,IAAAA,CAAKmI,QAAAA,CAAQ0B,sBAAAA,CAAuBnR,OAAAA,EAASsG,SAAAA,CAAAA,CAAAA;AACzD,MAAA,CAAA,CAAA,OAASxG,KAAAA,EAAO;AACd2F,QAAAA,OAAAA,EAAAA;AACAb,QAAAA,MAAAA,CAAO9E,KAAAA,YAAiBC,QAAQD,KAAAA,GAAQ,IAAIC,MAAMkC,MAAAA,CAAOnC,KAAAA,CAAAA,CAAAA,CAAAA;AAC3D,MAAA;IACF,CAAA,CAAA;AACF,EAAA;;;;;;EAOA,OAAeqR,sBAAAA,CACbnR,SACAsG,SAAAA,EACQ;AACR,IAAA,MAAM2K,GAAAA,GAAMjR,OAAAA;AACZ,IAAA,IAAI,OAAOiR,GAAAA,CAAI,QAAA,CAAA,KAAc,UAAA,EAAY;AACvC,MAAA,MAAMzJ,OAAAA,GAAmCyJ,GAAAA,CAAI,QAAA,CAAA,EAAS;AACtDzJ,MAAAA,OAAAA,CAAQ,WAAA,CAAA,GAAelB,SAAAA;AACvB,MAAA,OAAOF,IAAAA,CAAKI,UAAUgB,OAAAA,CAAAA;AACxB,IAAA;AACA,IAAA,OAAOpB,KAAKI,SAAAA,CAAU;MAAE,GAAGyK,GAAAA;AAAK3K,MAAAA;KAAU,CAAA;AAC5C,EAAA;AAEA,EAAA,OAAegK,iBAAAA,GAA4B;AACzC,IAAA,MAAMc,IAAAA,GAAOlJ,qBAAY,CAAA,CAAA;AACzB,IAAA,OAAO,OAAO6C,KAAAA,CAAMlI,IAAAA,CAAKuO,IAAAA,CAAAA,CACtBpG,GAAAA,CAAI,CAACC,CAAAA,KAAMA,CAAAA,CAAEtF,SAAS,EAAA,CAAA,CAAIuF,SAAS,CAAA,EAAG,GAAA,CAAA,CAAA,CACtCC,IAAAA,CAAK,EAAA,CAAA,CAAA,CAAA;AACV,EAAA;AAEA,EAAA,aAAqB+E,iBAAAA,CACnBrP,oBAAAA,EACA0H,UAAAA,EACAxH,KAAAA,EACAsQ,QAAAA,EACe;AACf,IAAA,MAAMxG,aAAAA,GAAgBC,eAAOvC,UAAAA,CAAAA;AAC7B,IAAA,MAAMzH,oBAAoBiK,KAAAA,CAAMlI,IAAAA,CAAKgI,aAAAA,CAAAA,CAClCG,GAAAA,CAAI,CAACC,CAAAA,KAAcA,CAAAA,CAAEtF,QAAAA,CAAS,EAAA,EAAIuF,QAAAA,CAAS,CAAA,EAAG,GAAA,CAAA,CAAA,CAC9CC,KAAK,EAAA,CAAA;AAER,IAAA,MAAMzD,SAAS,MAAM2J,QAAAA,CAASzQ,MAAAA,CAC5BC,oBAAAA,EACAC,mBACAC,KAAAA,CAAAA;AAGF,IAAA,IAAI,CAAC2G,OAAOnG,KAAAA,EAAO;AACjB,MAAA,MAAM,IAAIiM,uBAAAA,CAAwB;AAAEhM,QAAAA,MAAAA,EAAQkG,MAAAA,CAAOlG;OAAO,CAAA;AAC5D,IAAA;AACF,EAAA;AACF,CAAA;;;ACzSO,IAAM8P,SAAN,MAAMA;EAdb;;;;EAemBC,cAAAA,GAAiB,oBAAA;AAClC,EAAA,WAAA,CAA6BC,cAAAA,EAAiC;SAAjCA,cAAAA,GAAAA,cAAAA;AAAkC,EAAA;EAE/DvC,KAAAA,CAAMjP,OAAAA,EAAiByR,gBAAyB3R,KAAAA,EAAqB;AACnE,IAAA,IAAA,CAAK0R,cAAAA,EAAgBvC,MACnB,CAAA,EAAG,IAAA,CAAKsC,cAAc,CAAA,CAAA,EAAIvR,OAAAA,CAAAA,CAAAA,EAC1ByR,cAAAA,EACA3R,KAAAA,CAAAA;AAEJ,EAAA;EAEA4R,IAAAA,CAAK1R,OAAAA,EAAiByR,gBAAyB3R,KAAAA,EAAqB;AAClE,IAAA,IAAA,CAAK0R,cAAAA,EAAgBE,KACnB,CAAA,EAAG,IAAA,CAAKH,cAAc,CAAA,CAAA,EAAIvR,OAAAA,CAAAA,CAAAA,EAC1ByR,cAAAA,EACA3R,KAAAA,CAAAA;AAEJ,EAAA;EAEA6R,IAAAA,CAAK3R,OAAAA,EAAiByR,gBAAyB3R,KAAAA,EAAqB;AAClE,IAAA,IAAA,CAAK0R,cAAAA,EAAgBG,KACnB,CAAA,EAAG,IAAA,CAAKJ,cAAc,CAAA,CAAA,EAAIvR,OAAAA,CAAAA,CAAAA,EAC1ByR,cAAAA,EACA3R,KAAAA,CAAAA;AAEJ,EAAA;EAEAA,KAAAA,CAAME,OAAAA,EAAiByR,gBAAyB3R,KAAAA,EAAqB;AACnE,IAAA,IAAA,CAAK0R,cAAAA,EAAgB1R,MACnB,CAAA,EAAG,IAAA,CAAKyR,cAAc,CAAA,CAAA,EAAIvR,OAAAA,CAAAA,CAAAA,EAC1ByR,cAAAA,EACA3R,KAAAA,CAAAA;AAEJ,EAAA;AACF,CAAA;;;ACiBO,IAAM8R,kBAAAA,GAAN,cAAiCtO,8BAAAA,CAAAA;EAlExC;;;AAmEqBE,EAAAA,GAAAA;AACAC,EAAAA,OAAAA;AACFoM,EAAAA,SAAAA;AACAgC,EAAAA,cAAAA;AACArD,EAAAA,MAAAA;EACTsD,OAAAA,GAA0B,IAAA;EAC1BvD,eAAAA,GAAwC,IAAA;EACxCwD,YAAAA,GAAe,KAAA;EACfC,0BAAAA,GAA6B,KAAA;EAErC,WAAA,CAAYxO,GAAAA,EAAaC,OAAAA,GAAqC,EAAC,EAAG;AAChE,IAAA,KAAA,EAAK;AAEL,IAAA,IAAA,CAAKD,GAAAA,GAAMA,GAAAA;AACX,IAAA,IAAA,CAAKC,OAAAA,GAAUA,OAAAA;AACf,IAAA,IAAIA,QAAQwO,4BAAAA,EAA8B;AACxCC,MAAAA,OAAAA,CAAQP,KACN,qIACE,CAAA;AAEN,IAAA,CAAA,MAAA,IAAW,CAAClO,OAAAA,CAAQC,mBAAAA,IAAuB,CAACD,QAAQe,iBAAAA,EAAmB;AACrE0N,MAAAA,OAAAA,CAAQP,KACN,kIACE,CAAA;AAEN,IAAA;AAEA,IAAA,IAAA,CAAKnD,MAAAA,GAAS,IAAI8C,MAAAA,CAAO,IAAA,CAAK7N,QAAQ+K,MAAM,CAAA;AAE5C,IAAA,MAAM2D,gBAAAA,GAA+C;AACnD/N,MAAAA,iBAAAA,EAAmB,KAAKX,OAAAA,CAAQW,iBAAAA;AAChCC,MAAAA,iBAAAA,EAAmB,KAAKZ,OAAAA,CAAQY,iBAAAA;AAChCC,MAAAA,iBAAAA,EAAmB,KAAKb,OAAAA,CAAQa,iBAAAA;AAChCkK,MAAAA,MAAAA,EAAQ,IAAA,CAAKA;AACf,KAAA;AAEA,IAAA,IAAA,CAAKqB,SAAAA,GAAY,IAAI3B,mBAAAA,CAAoB1K,GAAAA,EAAK2O,gBAAAA,CAAAA;AAE9C,IAAA,MAAMzO,mBAAAA,GACJD,QAAQC,mBAAAA,KACPD,OAAAA,CAAQe,oBACL,IAAIpF,wBAAAA,CAAyBqE,OAAAA,CAAQe,iBAAiB,CAAA,GACtD5E,MAAAA,CAAAA;AAEN,IAAA,IAAA,CAAKiS,cAAAA,GAAiB;AACpBnO,MAAAA,mBAAAA;AACAe,MAAAA,iBAAAA,EAAmBhB,OAAAA,CAAQwO,4BAAAA;AAC3BjC,MAAAA,cAAAA,EAAgBvM,OAAAA,CAAQuM;AAC1B,KAAA;AAEA,IAAA,IAAA,CAAKH,UAAUnK,EAAAA,CAAG,WAAA,EAAa,MAAM,IAAA,CAAK0M,sBAAoB,CAAA;AAC9D,IAAA,IAAA,CAAKvC,SAAAA,CAAUnK,GAAG,cAAA,EAAgB,CAACyJ,cACjC,IAAA,CAAKkD,uBAAAA,CAAwBlD,SAAAA,CAAAA,CAAAA;AAE/B,IAAA,IAAA,CAAKU,SAAAA,CAAUnK,GAAG,OAAA,EAAS,CAAC5F,UAAU,IAAA,CAAKmF,IAAAA,CAAK,OAAA,EAASnF,KAAAA,CAAAA,CAAAA;AAC3D,EAAA;AAEA,EAAA,IAAI8K,SAAAA,GAAqB;AACvB,IAAA,OAAO,IAAA,CAAKiF,SAAAA,CAAUjF,SAAAA,IAAa,IAAA,CAAKkH,OAAAA,KAAY,IAAA;AACtD,EAAA;;;;;;AAOA,EAAA,MAAMpN,QAAQoD,YAAAA,EAA4C;AACxD,IAAA,IAAI,KAAKgK,OAAAA,EAAS;AAClB,IAAA,IAAI,IAAA,CAAKvD,eAAAA,EAAiB,OAAO,IAAA,CAAKA,eAAAA;AAEtC,IAAA,IAAA,CAAKA,kBAAkB,IAAA,CAAK+D,UAAAA,CAAWxK,YAAAA,CAAAA,CAAc4G,QAAQ,MAAA;AAC3D,MAAA,IAAA,CAAKH,eAAAA,GAAkB,IAAA;IACzB,CAAA,CAAA;AACA,IAAA,OAAO,IAAA,CAAKA,eAAAA;AACd,EAAA;;;;EAKA3I,UAAAA,GAAmB;AACjB,IAAA,IAAA,CAAKoM,0BAAAA,GAA6B,IAAA;AAClC,IAAA,IAAA,CAAKF,SAAS1B,OAAAA,EAAAA;AACd,IAAA,IAAA,CAAK0B,OAAAA,GAAU,IAAA;AACf,IAAA,IAAA,CAAKjC,UAAUjK,UAAAA,EAAU;AAE3B,EAAA;AAEA,EAAA,MAAMgD,YAAYC,MAAAA,EAAuD;AACvE,IAAA,MAAMiJ,OAAAA,GAAU,MAAM,IAAA,CAAKS,aAAAA,EAAa;AAExC,IAAA,IAAIzJ,aAAAA;AACJ,IAAA,IAAI,OAAOD,MAAAA,CAAO7I,OAAAA,KAAY,QAAA,EAAU;AACtC,MAAA,MAAMwS,GAAAA,GAAM3J,MAAAA,CAAO7I,OAAAA,CAAQgJ,UAAAA,CAAW,IAAA,CAAA,GAClCH,MAAAA,CAAO7I,OAAAA,CAAQiJ,KAAAA,CAAM,CAAA,CAAA,GACrBJ,MAAAA,CAAO7I,OAAAA;AACX8I,MAAAA,aAAAA,GAAgBN,oBAAWgK,GAAAA,CAAAA;IAC7B,CAAA,MAAO;AACL1J,MAAAA,aAAAA,GAAgBD,MAAAA,CAAO7I,OAAAA;AACzB,IAAA;AAEA,IAAA,MAAMkJ,iBAAAA,GAAoBC,gCAAAA,CACxBN,MAAAA,CAAOO,QAAAA,EACP0I,OAAAA,CAAQ/N,YAAAA,EACR+N,OAAAA,CAAQ7N,YAAAA,EACRwO,4CAAAA,CAA4B5J,MAAAA,CAAOQ,WAAW,CAAA,CAAA;AAGhD,IAAA,MAAMvD,OAAAA,GAAU,IAAIwD,4CAAAA,CAA4B;AAC9CC,MAAAA,WAAAA,EAAaV,MAAAA,CAAOU,WAAAA;AACpBF,MAAAA,WAAAA,EAAaR,MAAAA,CAAOQ,WAAAA;AACpBG,MAAAA,QAAAA,EAAUX,MAAAA,CAAOW,QAAAA;AACjBC,MAAAA,cAAAA,EAAgBZ,MAAAA,CAAOY,cAAAA;AACvBC,MAAAA,KAAAA,EAAOb,MAAAA,CAAOa,KAAAA;MACdN,QAAAA,EAAUF,iBAAAA;MACVlJ,OAAAA,EAAS8I,aAAAA;AACTa,MAAAA,QAAAA,EAAUd,MAAAA,CAAOc,QAAAA;AACjB7B,MAAAA,YAAAA,EAAce,MAAAA,CAAOf,YAAAA;AACrB8B,MAAAA,MAAAA,EAAQf,MAAAA,CAAOe,MAAAA;AACfC,MAAAA,aAAAA,EAAehB,MAAAA,CAAOgB;KACxB,CAAA;AAEA,IAAA,MAAM,EAAE6I,SAAAA,EAAS,GACf,MAAMZ,OAAAA,CAAQ7K,YAAqCnB,OAAAA,CAAAA;AAErD,IAAA,IAAI,CAAC4M,SAAAA,EAAW;AACd,MAAA,MAAM,IAAI9E,mBAAmB,0BAAA,CAAA;AAC/B,IAAA;AAEA,IAAA,OAAO;AAAE8E,MAAAA;AAAU,KAAA;AACrB,EAAA;;;;;AAMA,EAAA,MAAM5I,OAAOjB,MAAAA,EAA6C;AACxD,IAAA,IAAIA,MAAAA,CAAOQ,WAAAA,KAAgBU,qBAAAA,CAAiBC,OAAAA,EAAS;AACnD,MAAA,MAAM,IAAIgE,+BAAAA,EAAAA;AACZ,IAAA;AAEA,IAAA,MAAM8D,OAAAA,GAAU,MAAM,IAAA,CAAKS,aAAAA,EAAa;AAExC,IAAA,MAAMtI,sBAAsBC,kCAAAA,CAC1BrB,MAAAA,CAAOsB,YACP2H,OAAAA,CAAQ/N,YAAAA,EACR+N,QAAQ7N,YAAY,CAAA;AAGtB,IAAA,MAAM6B,OAAAA,GAAU,IAAIsE,uCAAAA,CAAuB;AACzCb,MAAAA,WAAAA,EAAaV,MAAAA,CAAOU,WAAAA;AACpBF,MAAAA,WAAAA,EAAaR,MAAAA,CAAOQ,WAAAA;AACpBM,MAAAA,QAAAA,EAAUd,MAAAA,CAAOc,QAAAA;AACjBU,MAAAA,UAAAA,EAAYxB,MAAAA,CAAOwB,UAAAA;AACnBC,MAAAA,SAAAA,EAAWzB,MAAAA,CAAOyB,SAAAA;MAClBH,UAAAA,EAAYF,mBAAAA;AACZM,MAAAA,SAAAA,EAAW1B,MAAAA,CAAO0B,SAAAA;AAClBzC,MAAAA,YAAAA,EAAce,MAAAA,CAAOf,YAAAA;AACrB8B,MAAAA,MAAAA,EAAQf,MAAAA,CAAOe,MAAAA;AACfC,MAAAA,aAAAA,EAAehB,MAAAA,CAAOgB;KACxB,CAAA;AAEA,IAAA,MAAM,EAAEW,YAAAA,EAAY,GAClB,MAAMsH,OAAAA,CAAQ7K,YAAgCnB,OAAAA,CAAAA;AAEhD,IAAA,IAAI,CAAC0E,YAAAA,EAAc;AACjB,MAAA,MAAM,IAAIoD,mBAAmB,8BAAA,CAAA;AAC/B,IAAA;AAEA,IAAA,OAAOnD,oCAAAA,CACLD,YAAAA,EACAsH,OAAAA,CAAQ/N,YAAAA,EACR+N,QAAQ7N,YAAY,CAAA;AAExB,EAAA;;;;AAKA,EAAA,MAAMyG,WAAW7B,MAAAA,EAAqD;AACpE,IAAA,MAAMiJ,OAAAA,GAAU,MAAM,IAAA,CAAKS,aAAAA,EAAa;AAExC,IAAA,MAAMtI,sBAAsBC,kCAAAA,CAC1BrB,MAAAA,CAAOsB,YACP2H,OAAAA,CAAQ/N,YAAAA,EACR+N,QAAQ7N,YAAY,CAAA;AAGtB,IAAA,MAAM6B,OAAAA,GAAU,IAAI6E,2CAAAA,CAA2B;AAC7CpB,MAAAA,WAAAA,EAAaV,MAAAA,CAAOU,WAAAA;MACpBF,WAAAA,EAAa,SAAA;AACbM,MAAAA,QAAAA,EAAUd,MAAAA,CAAOc,QAAAA;AACjBU,MAAAA,UAAAA,EAAYxB,MAAAA,CAAOwB,UAAAA;AACnBC,MAAAA,SAAAA,EAAWzB,MAAAA,CAAOyB,SAAAA;MAClBH,UAAAA,EAAYF,mBAAAA;AACZM,MAAAA,SAAAA,EAAW1B,MAAAA,CAAO0B,SAAAA;AAClBzC,MAAAA,YAAAA,EAAce,MAAAA,CAAOf,YAAAA;AACrB8B,MAAAA,MAAAA,EAAQf,MAAAA,CAAOe,MAAAA;AACfC,MAAAA,aAAAA,EAAehB,MAAAA,CAAOgB;KACxB,CAAA;AAEA,IAAA,MAAM,EAAEW,YAAAA,EAAY,GAClB,MAAMsH,OAAAA,CAAQ7K,YAAoCnB,OAAAA,CAAAA;AAEpD,IAAA,IAAI,CAAC0E,YAAAA,EAAc;AACjB,MAAA,MAAM,IAAIoD,mBAAmB,8BAAA,CAAA;AAC/B,IAAA;AAEA,IAAA,OAAOnD,oCAAAA,CACLD,YAAAA,EACAsH,OAAAA,CAAQ/N,YAAAA,EACR+N,QAAQ7N,YAAY,CAAA;AAExB,EAAA;;;;AAKA,EAAA,MAAcsO,aAAAA,GAAkC;AAC9C,IAAA,IAAI,IAAA,CAAKT,OAAAA,EAAS,OAAO,IAAA,CAAKA,OAAAA;AAC9B,IAAA,MAAM,KAAKpN,OAAAA,EAAO;AAClB,IAAA,IAAI,CAAC,KAAKoN,OAAAA,EAAS;AACjB,MAAA,MAAM,IAAI7D,iCAAAA,EAAAA;AACZ,IAAA;AACA,IAAA,OAAO,IAAA,CAAK6D,OAAAA;AACd,EAAA;AAEA,EAAA,MAAca,cAAc7K,YAAAA,EAA4C;AACtE,IAAA,IAAA,CAAKgK,OAAAA,GAAU,MAAMrC,OAAAA,CAAQvJ,SAAAA,CAC3B,IAAA,CAAK2J,WACL/H,YAAAA,EACA,IAAA,CAAK+J,cAAAA,EACL,IAAA,CAAKrD,MAAM,CAAA;AAEb,IAAA,IAAA,CAAKvJ,KAAK,WAAA,CAAA;AACZ,EAAA;AAEA,EAAA,MAAcqN,WAAWxK,YAAAA,EAA4C;AACnE,IAAA,IAAA,CAAKiK,YAAAA,GAAe,IAAA;AACpB,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAKlC,UAAUnL,OAAAA,EAAO;AAC5B,MAAA,MAAM,IAAA,CAAKiO,cAAc7K,YAAAA,CAAAA;IAC3B,CAAA,SAAA;AACE,MAAA,IAAA,CAAKiK,YAAAA,GAAe,KAAA;AACtB,IAAA;AACF,EAAA;;;;;;;;;;EAWQK,oBAAAA,GAA6B;AACnC,IAAA,IAAI,KAAKL,YAAAA,EAAc;AACvB,IAAA,IAAA,CAAKA,YAAAA,GAAe,IAAA;AAEpB,IAAA,MAAMa,8BAAc,MAAA,CAAA,YAAA;AAClB,MAAA,IAAI;AACF,QAAA,MAAM,KAAKD,aAAAA,EAAa;AAC1B,MAAA,CAAA,CAAA,OAAS7S,KAAAA,EAAO;AACd,QAAA,IAAA,CAAKmF,IAAAA,CACH,OAAA,EACAnF,KAAAA,YAAiBC,KAAAA,GAAQD,KAAAA,GAAQ,IAAIC,KAAAA,CAAMkC,MAAAA,CAAOnC,KAAAA,CAAAA,CAAAA,CAAAA;MAEtD,CAAA,SAAA;AACE,QAAA,IAAA,CAAKiS,YAAAA,GAAe,KAAA;AACpB,QAAA,IAAA,CAAKxD,eAAAA,GAAkB,IAAA;AACzB,MAAA;IACF,CAAA,EAZoB,aAAA,CAAA;AAcpB,IAAA,IAAA,CAAKA,kBAAkBqE,WAAAA,EAAAA;AACzB,EAAA;AAEQP,EAAAA,uBAAAA,CAAwBlD,SAAAA,EAAyB;AACvD,IAAA,MAAM0D,cAAc,IAAA,CAAKb,0BAAAA;AACzB,IAAA,IAAA,CAAKA,0BAAAA,GAA6B,KAAA;AAClC,IAAA,IAAA,CAAKF,SAAS1B,OAAAA,EAAAA;AACd,IAAA,IAAA,CAAK0B,OAAAA,GAAU,IAAA;AACf,IAAA,IAAI,CAACe,WAAAA,EAAa;AAChB,MAAA,IAAA,CAAKrE,MAAAA,CAAOS,MAAM,kCAAA,CAAA;AACpB,IAAA;AACA,IAAA,IAAA,CAAKhK,IAAAA,CAAK,gBAAgBkK,SAAAA,CAAAA;AAC5B,EAAA;AACF;;;AC3VO,IAAM2D,yBAAAA,GAAN,cAAwClB,kBAAAA,CAAAA;EAN/C;;;AAMmE","file":"index.cjs","sourcesContent":["/**\n * AWS Nitro Security Module (NSM) Root Certificate\n * This is the official AWS root certificate used to verify attestation documents\n */\nexport const AWS_NITRO_ROOT_CERTIFICATE = `-----BEGIN CERTIFICATE-----\nMIICETCCAZagAwIBAgIRAPkxdWgbkK/hHUbMtOTn+FYwCgYIKoZIzj0EAwMwSTEL\nMAkGA1UEBhMCVVMxDzANBgNVBAoMBkFtYXpvbjEMMAoGA1UECwwDQVdTMRswGQYD\nVQQDDBJhd3Mubml0cm8tZW5jbGF2ZXMwHhcNMTkxMDI4MTMyODA1WhcNNDkxMDI4\nMTQyODA1WjBJMQswCQYDVQQGEwJVUzEPMA0GA1UECgwGQW1hem9uMQwwCgYDVQQL\nDANBV1MxGzAZBgNVBAMMEmF3cy5uaXRyby1lbmNsYXZlczB2MBAGByqGSM49AgEG\nBSuBBAAiA2IABPwCVOumCMHzaHDimtqQvkY4MpJzbolL//Zy2YlES1BR5TSksfbb\n48C8WBoyt7F2Bw7eEtaaP+ohG2bnUs990d0JX28TcPQXCEPZ3BABIeTPYwEoCWZE\nh8l5YoQwTcU/9KNCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUkCW1DdkF\nR+eWw5b6cp3PmanfS5YwDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMDA2kAMGYC\nMQCjfy+Rocm9Xue4YnwWmNJVA44fA0P5W2OpYow9OYCVRaEevL8uO1XYru5xtMPW\nrfMCMQCi85sWBbJwKKXdS6BptQFuZbT73o/gBh1qUxl/nNr12UO8Yfwr6wPLb+6N\nIwLz3/Y=\n-----END CERTIFICATE-----`;\n\n/**\n * Expected PCR values for different environments\n */\nexport const EXPECTED_PCR_VALUES = {\n // Production PCR8 values would be set based on actual enclave builds\n // These would be configured via environment variables in production\n // Development values should be set in the application configuration, not here\n} as const;\n\n/**\n * Attestation document validation constants\n */\nexport const ATTESTATION_CONSTANTS = {\n // Maximum age of attestation document in milliseconds\n MAX_ATTESTATION_AGE: 5 * 60 * 1000, // 5 minutes\n\n // Expected digest algorithm\n EXPECTED_DIGEST: 'SHA384',\n\n // Expected module ID pattern\n MODULE_ID_PATTERN: /^i-[0-9a-f]{8,17}-enc[0-9a-f]{8,17}$/,\n\n // PCR indices that must be present\n REQUIRED_PCRS: [0, 1, 2, 8] as const,\n} as const;\n","import {\n AttestationVerificationResult,\n AttestationVerificationConfig,\n} from './types';\nimport { ATTESTATION_CONSTANTS } from './constants';\n\n// Import Evervault WASM attestation bindings\nimport init, {\n validateAttestationDocPcrs,\n PCRs,\n getUserData,\n getNonce,\n} from '@evervault/wasm-attestation-bindings';\nimport { type AttestationVerifier } from './types';\n\n/**\n * Nitro Enclave Attestation Document Verifier\n * Uses Evervault's official WASM attestation bindings\n * Optimized for client-side usage with hex string input\n */\nexport class NitroAttestationVerifier implements AttestationVerifier {\n private readonly config: AttestationVerificationConfig;\n private wasmInitPromise: Promise<void> | null = null;\n\n constructor(config: AttestationVerificationConfig) {\n this.config = {\n strictCertValidation: true,\n maxAge: ATTESTATION_CONSTANTS.MAX_ATTESTATION_AGE,\n ...config,\n };\n }\n\n /**\n * Initialises the WASM module exactly once. Concurrent callers share the\n * same in-flight promise, preventing duplicate initialisation.\n * On failure the promise is cleared so the next call may retry.\n */\n private ensureWasmInitialized(): Promise<void> {\n this.wasmInitPromise ??= this.initWasm()\n .then(() => undefined)\n .catch((error) => {\n this.wasmInitPromise = null;\n throw new Error(\n `Failed to initialize WASM module: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n });\n return this.wasmInitPromise;\n }\n\n /**\n * Initialises the WASM module with environment-appropriate loading.\n * In Node.js, fetch() does not support file:// URLs, so we read the\n * .wasm binary from disk and use initSync() instead.\n */\n private async initWasm(): Promise<void> {\n if (typeof process !== 'undefined' && process.versions?.node) {\n const { readFileSync } = await import('node:fs');\n const { createRequire } = await import('node:module');\n const require = createRequire(import.meta.url);\n const wasmPath = require.resolve(\n '@evervault/wasm-attestation-bindings/index_bg.wasm'\n );\n const { initSync } = await import('@evervault/wasm-attestation-bindings');\n initSync({ module: readFileSync(wasmPath) });\n } else {\n await init();\n }\n }\n\n /**\n * Verify an attestation document using Evervault WASM bindings\n * Accepts base64-encoded attestation document directly\n *\n * @param attestationDocBase64 - Base64-encoded attestation document\n * @param expectedChallenge - Expected challenge (ciphertext hash)\n * @param nonce - Expected nonce (REQUIRED for security)\n */\n async verify(\n attestationDocBase64: string,\n expectedChallenge: string,\n nonce: Uint8Array\n ): Promise<AttestationVerificationResult> {\n try {\n // Ensure WASM module is initialized\n await this.ensureWasmInitialized();\n\n // Create PCRs container with expected values\n const expectedPcrs = PCRs.empty();\n expectedPcrs.pcr8 = this.config.expectedPcr8;\n\n // Use Evervault WASM bindings to verify the attestation document (already in base64)\n const isValid = validateAttestationDocPcrs(attestationDocBase64, [\n expectedPcrs,\n ]);\n\n if (!isValid) {\n return {\n valid: false,\n errors: ['Attestation document PCR verification failed'],\n timestamp: Date.now(),\n };\n }\n\n // Challenge (ciphertext hash) is required — an empty value would allow a\n // replayed attestation document to pass PCR verification without being\n // bound to this specific handshake.\n if (!expectedChallenge) {\n return {\n valid: false,\n errors: [\n 'No challenge provided — ciphertext binding cannot be verified',\n ],\n timestamp: Date.now(),\n };\n }\n\n try {\n const userData = getUserData(attestationDocBase64);\n if (!userData) {\n return {\n valid: false,\n errors: ['No user data found in attestation document'],\n timestamp: Date.now(),\n };\n }\n\n // The challenge should be the hex-encoded hash of the ciphertext.\n // Use strict equality — substring matches would allow spoofing.\n const userDataString = new TextDecoder('utf-8').decode(userData);\n\n if (userDataString !== expectedChallenge) {\n return {\n valid: false,\n errors: [\n 'Ciphertext hash verification failed - challenge mismatch in attestation user data',\n ],\n timestamp: Date.now(),\n };\n }\n } catch (error) {\n return {\n valid: false,\n errors: [\n `Failed to extract or verify ciphertext hash: ${error instanceof Error ? error.message : String(error)}`,\n ],\n timestamp: Date.now(),\n };\n }\n\n // Verify nonce (REQUIRED for security - prevents replay attacks)\n try {\n // Use WASM getNonce function to extract nonce from attestation document\n const extractedNonceRaw = getNonce(attestationDocBase64);\n\n if (!extractedNonceRaw) {\n return {\n valid: false,\n errors: ['No nonce found in attestation document'],\n timestamp: Date.now(),\n };\n }\n\n // The attestation document stores the nonce as a base64-encoded string.\n // Decode it back to the original bytes.\n let extractedNonce: Uint8Array;\n try {\n const nonceString = new TextDecoder().decode(extractedNonceRaw);\n\n // Isomorphic base64 decoding\n if (typeof atob !== 'undefined') {\n const binaryString = atob(nonceString);\n extractedNonce = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n extractedNonce[i] = binaryString.charCodeAt(i);\n }\n } else {\n extractedNonce = new Uint8Array(Buffer.from(nonceString, 'base64'));\n }\n } catch (decodeError) {\n return {\n valid: false,\n errors: [\n `Failed to decode nonce from base64: ${decodeError instanceof Error ? decodeError.message : String(decodeError)}`,\n ],\n timestamp: Date.now(),\n };\n }\n\n // Length check first — lengths are public, so early exit is safe.\n if (extractedNonce.length !== nonce.length) {\n return {\n valid: false,\n errors: [\n `Nonce length mismatch: expected ${nonce.length} bytes, got ${extractedNonce.length} bytes`,\n ],\n timestamp: Date.now(),\n };\n }\n\n // Constant-time byte comparison via XOR accumulator — no early exit,\n // preventing timing side-channels that could reveal nonce bytes.\n let diff = 0;\n for (let i = 0; i < nonce.length; i++) {\n diff |= extractedNonce[i] ^ nonce[i];\n }\n\n if (diff !== 0) {\n return {\n valid: false,\n errors: ['Nonce verification failed - nonce mismatch'],\n timestamp: Date.now(),\n };\n }\n } catch (error) {\n return {\n valid: false,\n errors: [\n `Failed to extract or verify nonce: ${error instanceof Error ? error.message : String(error)}`,\n ],\n timestamp: Date.now(),\n };\n }\n\n return {\n valid: true,\n errors: [],\n timestamp: Date.now(),\n };\n } catch (error) {\n return {\n valid: false,\n errors: [\n `Attestation verification error: ${error instanceof Error ? error.message : String(error)}`,\n ],\n timestamp: Date.now(),\n };\n }\n }\n}\n","// Browser/Node.js compatibility\nimport { EventEmitter } from 'eventemitter3';\nimport * as ws from 'ws';\n\nconst isWindow =\n typeof globalThis !== 'undefined' &&\n typeof (globalThis as any).window !== 'undefined';\nconst WebSocketImpl = isWindow ? (globalThis as any).WebSocket : ws.WebSocket;\n\nimport {\n BaseWebSocketMessage,\n ErrorResponse,\n} from '@dynamic-labs-wallet/forward-mpc-shared';\nimport {\n HandshakeV1RequestMessage,\n SignMessageV1RequestMessage,\n KeygenV1RequestMessage,\n ReceiveKeyV1RequestMessage,\n messageRegistry,\n HashAlgorithm,\n generateMlKem768Keypair,\n decapsulateMlKem768,\n encryptKeyshare,\n encryptKeygenInit,\n decryptKeygenResult,\n type SigningAlgorithmName,\n type TraceContext,\n} from '@dynamic-labs-wallet/forward-mpc-shared';\nimport { NitroAttestationVerifier } from './attestation';\nimport { AttestationVerificationConfig } from './attestation/types';\nimport { sha256 } from '@noble/hashes/sha2.js';\nimport { hexToBytes, randomBytes } from '@noble/hashes/utils.js';\nimport { either } from 'fp-ts';\nimport { SigningAlgorithm } from '@dynamic-labs-wallet/core';\n\nexport interface ForwardMPCClientOptions {\n reconnectAttempts?: number;\n reconnectInterval?: number;\n connectionTimeout?: number;\n heartbeatInterval?: number;\n attestationConfig?: AttestationVerificationConfig;\n attestationVerifier?: any; // Allow custom verifier (mock or real)\n bypassAttestation?: boolean; // Default: false. Only for testing!\n}\n\nexport interface ClientEvents {\n connected: () => void;\n disconnected: () => void;\n error: (error: Error) => void;\n message: (message: BaseWebSocketMessage) => void;\n}\n\nexport class ForwardMPCClient extends EventEmitter {\n private ws: any = null;\n private url: string;\n private options: Required<\n Omit<ForwardMPCClientOptions, 'attestationVerifier' | 'attestationConfig'>\n > & {\n attestationVerifier?: any;\n attestationConfig?: AttestationVerificationConfig;\n };\n private attestationVerifier: any | null = null; // Can be NitroAttestationVerifier or mock\n private isConnected = false;\n private messageId = 0;\n private pendingRequests = new Map<\n string,\n {\n resolve: (value: any) => void;\n reject: (error: Error) => void;\n timeout: NodeJS.Timeout;\n }\n >();\n private sharedSecret: Uint8Array | null = null;\n private decapsulationKey: Uint8Array | null = null;\n private connectionId: string;\n private handshakeNonce: Uint8Array | null = null;\n private attestationPromise: Promise<void> | null = null;\n\n constructor(url: string, options: ForwardMPCClientOptions = {}) {\n super();\n\n this.url = url;\n this.connectionId = ''; // Will be set by server during handshake\n this.options = {\n reconnectAttempts: options.reconnectAttempts ?? 3,\n reconnectInterval: options.reconnectInterval ?? 1000,\n connectionTimeout: options.connectionTimeout ?? 10000,\n heartbeatInterval: options.heartbeatInterval ?? 30000,\n attestationConfig: options.attestationConfig,\n attestationVerifier: options.attestationVerifier,\n bypassAttestation: options.bypassAttestation ?? false,\n };\n\n // Initialize attestation verifier - use custom verifier if provided, otherwise create from config\n if (options.attestationVerifier) {\n this.attestationVerifier = options.attestationVerifier;\n } else if (this.options.attestationConfig) {\n this.attestationVerifier = new NitroAttestationVerifier(\n this.options.attestationConfig\n );\n }\n }\n\n async connect(): Promise<void> {\n return new Promise((resolve, reject) => {\n if (this.isConnected) {\n resolve();\n return;\n }\n\n const timeout = setTimeout(() => {\n reject(new Error('Connection timeout'));\n }, this.options.connectionTimeout);\n\n this.ws = new WebSocketImpl(this.url);\n\n // Handle both browser and Node.js WebSocket APIs\n if (isWindow) {\n // Browser WebSocket API\n this.ws.onopen = () => {\n clearTimeout(timeout);\n this.isConnected = true;\n this.emit('connected');\n resolve();\n };\n\n this.ws.onerror = (_error: any) => {\n clearTimeout(timeout);\n this.emit('error', new Error('WebSocket error'));\n reject(new Error('WebSocket error'));\n };\n\n this.ws.onmessage = (event: any) => {\n this.handleMessage(event.data);\n };\n\n this.ws.onclose = () => {\n this.isConnected = false;\n this.emit('disconnected');\n this.cleanup();\n };\n } else {\n // Node.js WebSocket API\n this.ws.on('open', () => {\n clearTimeout(timeout);\n this.isConnected = true;\n this.emit('connected');\n resolve();\n });\n\n this.ws.on('error', (error: any) => {\n clearTimeout(timeout);\n this.emit('error', error);\n reject(error);\n });\n\n this.ws.on('message', (data: any) => {\n this.handleMessage(data.toString());\n });\n\n this.ws.on('close', () => {\n this.isConnected = false;\n this.emit('disconnected');\n this.cleanup();\n });\n }\n });\n }\n\n disconnect(): void {\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n this.cleanup();\n }\n\n private cleanup(): void {\n // Reject all pending requests\n for (const [, request] of this.pendingRequests) {\n clearTimeout(request.timeout);\n request.reject(new Error('Connection closed'));\n }\n this.pendingRequests.clear();\n\n // Clear sensitive cryptographic material\n if (this.sharedSecret) {\n this.sharedSecret.fill(0);\n this.sharedSecret = null;\n }\n if (this.decapsulationKey) {\n this.decapsulationKey.fill(0);\n this.decapsulationKey = null;\n }\n if (this.handshakeNonce) {\n this.handshakeNonce.fill(0);\n this.handshakeNonce = null;\n }\n\n // Clear connection ID\n this.connectionId = '';\n\n // Reset attestation state\n this.attestationPromise = null;\n }\n\n /**\n * Ensures the WebSocket connection is active and handshake is completed.\n * Automatically connects and performs handshake if needed.\n * @returns Object containing the shared secret and connection ID\n * @throws Error if connection or handshake fails\n */\n async ensureWsConnection(): Promise<{\n sharedSecret: Uint8Array;\n connectionId: string;\n }> {\n // Check if we need to connect\n if (!this.isConnected || !this.ws) {\n await this.connect();\n }\n\n // Check if we need to perform handshake\n if (!this.sharedSecret || !this.connectionId) {\n await this.handshake();\n }\n\n // Defensive check: if attestation verifier is configured, promise must exist\n if (\n this.attestationVerifier &&\n !this.options.bypassAttestation &&\n !this.attestationPromise\n ) {\n throw new Error(\n 'Attestation verifier configured but attestation was not performed'\n );\n }\n\n // Await attestation completion (throws if failed)\n if (this.attestationPromise) {\n try {\n await this.attestationPromise;\n } catch (error) {\n // Handle attestation failure by disconnecting\n // Side effect is here in the caller's context, not in the promise\n this.disconnect();\n throw error; // Re-throw for the caller\n }\n }\n\n // Final validation - should never happen but defensive check\n if (!this.sharedSecret || !this.connectionId) {\n throw new Error('Failed to establish connection and handshake');\n }\n\n return {\n sharedSecret: this.sharedSecret,\n connectionId: this.connectionId,\n };\n }\n\n private handleMessage(data: string): void {\n try {\n // Parse the raw message first to extract requestId\n const parsed = JSON.parse(data);\n const requestId = parsed.requestId;\n\n // Remove requestId from the message before deserializing\n if (requestId) {\n delete parsed.requestId;\n }\n\n // Now deserialize the message without requestId\n const message = this.deserializeMessage(JSON.stringify(parsed));\n\n // Check if this is a response to a pending request\n if (requestId && this.pendingRequests.has(requestId)) {\n const request = this.pendingRequests.get(requestId)!;\n this.pendingRequests.delete(requestId);\n clearTimeout(request.timeout);\n\n // Handle unified response format with embedded errors\n if (message.type === 'error') {\n // Legacy error response format\n const errorMsg = message as ErrorResponse;\n request.reject(new Error(errorMsg.error.message));\n } else if (message.type.endsWith('_response')) {\n // Check if the response contains an error field\n const responseData = (message as any).getData\n ? (message as any).getData()\n : message;\n if (responseData.error) {\n request.reject(new Error(responseData.error.message));\n } else {\n request.resolve(message);\n }\n } else {\n request.resolve(message);\n }\n return;\n }\n\n this.emit('message', message);\n } catch (error) {\n this.emit('error', new Error(`Failed to parse message: ${error}`));\n }\n }\n\n private sendRequest<T>(message: any): Promise<T> {\n return new Promise((resolve, reject) => {\n if (!this.isConnected || !this.ws) {\n reject(new Error('Not connected'));\n return;\n }\n\n const requestId = `req_${++this.messageId}_${Date.now()}`;\n // Add requestId to message (works for both objects and Message instances)\n const messageWithId = message;\n messageWithId.requestId = requestId;\n\n const timeout = setTimeout(() => {\n this.pendingRequests.delete(requestId);\n reject(new Error('Request timeout'));\n }, 30000); // 30 second timeout for attestation verification\n\n this.pendingRequests.set(requestId, { resolve, reject, timeout });\n\n try {\n // Use custom serializer that encodes using io-ts schemas\n const serializedMessage = this.serializeMessage(messageWithId);\n this.ws.send(serializedMessage);\n } catch (error) {\n this.pendingRequests.delete(requestId);\n clearTimeout(timeout);\n reject(error);\n }\n });\n }\n\n private serializeMessage(message: any): string {\n try {\n // If it's a Message class instance, use its encode method\n if (message && typeof message.encode === 'function') {\n const encoded = message.encode();\n // Add requestId if present\n if (message.requestId) {\n encoded.requestId = message.requestId;\n }\n return JSON.stringify(encoded);\n }\n\n // Fallback to regular JSON for other objects\n return JSON.stringify(message);\n } catch (error) {\n throw new Error(\n `Failed to serialize message: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n }\n\n private deserializeMessage(data: string): any {\n try {\n const parsed = JSON.parse(data);\n\n // Check if messageRegistry exists and has decode method\n if (!messageRegistry) {\n throw new Error('messageRegistry is undefined');\n }\n\n if (typeof messageRegistry.decode !== 'function') {\n throw new Error('messageRegistry.decode is not a function');\n }\n\n // Use message registry to decode\n const result = messageRegistry.decode(parsed);\n if (either.isLeft(result)) {\n // If registry can't decode it, return as-is (might be error response, etc.)\n return parsed;\n }\n\n return result.right;\n } catch (error) {\n throw new Error(\n `Failed to deserialize message: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n }\n\n async handshake(traceContext?: TraceContext): Promise<any> {\n // Generate ML-KEM-768 keypair and use encapsulation key as challenge\n const { encapsulationKey, decapsulationKey } = generateMlKem768Keypair();\n\n // Store decapsulation key for later use\n this.decapsulationKey = decapsulationKey;\n\n // Generate a cryptographically secure nonce for attestation\n const nonceBytes = randomBytes(32); // 256-bit nonce\n\n // Store original bytes for verification\n this.handshakeNonce = nonceBytes;\n\n const request = new HandshakeV1RequestMessage({\n challenge: encapsulationKey, // ML-KEM-768 encapsulation key (will be encoded to hex by the message class)\n nonce: nonceBytes, // User data nonce for attestation document\n traceContext,\n });\n\n const response = await this.sendRequest<any>(request);\n\n // Extract shared secret from response using ML-KEM decapsulation\n const responseData = response.getData();\n if (\n responseData.encapsulatedSharedSecret &&\n responseData.connectionId &&\n this.decapsulationKey\n ) {\n // Use the server's connection ID for consistent key derivation\n this.connectionId = responseData.connectionId;\n\n // Convert hex string back to bytes for decapsulation\n const cipherText = hexToBytes(responseData.encapsulatedSharedSecret);\n\n // Perform ML-KEM decapsulation to derive shared secret\n this.sharedSecret = decapsulateMlKem768(\n this.decapsulationKey,\n cipherText\n );\n }\n\n // Verify attestation document (store promise for later await)\n if (\n this.attestationVerifier &&\n responseData.attestationDoc &&\n responseData.encapsulatedSharedSecret &&\n !this.options.bypassAttestation\n ) {\n // Convert hex string back to bytes for challenge verification\n const cipherText = hexToBytes(responseData.encapsulatedSharedSecret);\n\n // Store promise - method already throws on failure\n this.attestationPromise = this.verifyAttestationDocument(\n responseData.attestationDoc,\n cipherText\n );\n }\n\n return response;\n }\n\n async signMessage(params: {\n keyshare: any; // Keyshare object from Dynamic Wallet SDK\n message: Uint8Array | string; // Message to sign (supports hex string or Uint8Array)\n relayDomain: string;\n signingAlgo: SigningAlgorithm;\n hashAlgo?: HashAlgorithm;\n derivationPath?: Uint32Array;\n tweak?: Uint8Array;\n roomUuid: string; // MPC room UUID for signing ceremony\n traceContext?: TraceContext;\n userId?: string;\n environmentId?: string;\n }): Promise<any> {\n // Ensure connection is active and handshake is completed (auto-connect if needed)\n const { sharedSecret, connectionId } = await this.ensureWsConnection();\n\n // Convert hex string to Uint8Array if needed\n let messageToSign: Uint8Array;\n if (typeof params.message === 'string') {\n // Handle hex strings (with or without 0x prefix)\n const cleanHex = params.message.startsWith('0x')\n ? params.message.slice(2)\n : params.message;\n messageToSign = hexToBytes(cleanHex);\n } else {\n // Already a Uint8Array\n messageToSign = params.message;\n }\n\n // Encrypt the keyshare using AES-256-GCM\n const encryptedKeyshare = await encryptKeyshare(\n params.keyshare,\n sharedSecret,\n connectionId,\n params.signingAlgo as unknown as SigningAlgorithmName\n );\n\n const request = new SignMessageV1RequestMessage({\n relayDomain: params.relayDomain,\n signingAlgo: params.signingAlgo,\n hashAlgo: params.hashAlgo,\n derivationPath: params.derivationPath,\n tweak: params.tweak,\n keyshare: encryptedKeyshare,\n message: messageToSign, // Always pass Uint8Array to the message class\n roomUuid: params.roomUuid,\n traceContext: params.traceContext,\n userId: params.userId,\n environmentId: params.environmentId,\n });\n\n return this.sendRequest<any>(request);\n }\n\n /**\n * Perform MPC keygen for ECDSA and BIP340 algorithms\n * For ED25519, use sampleKey() or receiveKey() methods instead\n */\n async keygen(params: {\n keygenInit: { keygenId: string; keygenSecret: string };\n relayDomain: string;\n signingAlgo: SigningAlgorithm;\n roomUuid: string;\n numParties: number;\n threshold: number;\n keygenIds: string[];\n traceContext?: TraceContext;\n userId?: string;\n environmentId?: string;\n }): Promise<{ pubkey: Uint8Array; secretShare: string }> {\n // Validate algorithm (only ECDSA and BIP340 supported)\n if (params.signingAlgo === SigningAlgorithm.ED25519) {\n throw new Error(\n 'ED25519 keygen not supported via keygen() method. Use sampleKey() or receiveKey() instead.'\n );\n }\n\n // Ensure connection is active and handshake is completed (auto-connect if needed)\n const { sharedSecret, connectionId } = await this.ensureWsConnection();\n\n // Encrypt the keygen init data\n const encryptedKeygenInit = encryptKeygenInit(\n params.keygenInit,\n sharedSecret,\n connectionId\n );\n\n // Create ECDSA or BIP340 keygen request\n // The message encoder will convert the enum to lowercase on the wire\n const request = new KeygenV1RequestMessage({\n relayDomain: params.relayDomain,\n signingAlgo: params.signingAlgo,\n roomUuid: params.roomUuid,\n numParties: params.numParties,\n threshold: params.threshold,\n keygenInit: encryptedKeygenInit,\n keygenIds: params.keygenIds,\n traceContext: params.traceContext,\n userId: params.userId,\n environmentId: params.environmentId,\n });\n\n // Send request and get encrypted response\n const response = await this.sendRequest<any>(request);\n const responseData = response.getData();\n\n // Decrypt the keygen result\n const keygenResult = decryptKeygenResult(\n responseData.keygenResult,\n sharedSecret,\n connectionId\n );\n\n return keygenResult;\n }\n\n /**\n * Receive an ED25519 key (one party receives the key generated by another)\n * Uses ExportableEd25519 - the receiving party gets the key sampled by another party\n */\n async receiveKey(params: {\n keygenInit: { keygenId: string; keygenSecret: string };\n relayDomain: string;\n roomUuid: string;\n numParties: number;\n threshold: number;\n keygenIds: string[];\n traceContext?: TraceContext;\n userId?: string;\n environmentId?: string;\n }): Promise<{ pubkey: Uint8Array; secretShare: string }> {\n // Ensure connection is active and handshake is completed (auto-connect if needed)\n const { sharedSecret, connectionId } = await this.ensureWsConnection();\n\n // Encrypt the keygen init data\n const encryptedKeygenInit = encryptKeygenInit(\n params.keygenInit,\n sharedSecret,\n connectionId\n );\n\n // Create receiveKey request\n const request = new ReceiveKeyV1RequestMessage({\n relayDomain: params.relayDomain,\n signingAlgo: 'ed25519',\n roomUuid: params.roomUuid,\n numParties: params.numParties,\n threshold: params.threshold,\n keygenInit: encryptedKeygenInit,\n keygenIds: params.keygenIds,\n traceContext: params.traceContext,\n userId: params.userId,\n environmentId: params.environmentId,\n });\n\n // Send request and get encrypted response\n const response = await this.sendRequest<any>(request);\n const responseData = response.getData();\n\n // Decrypt the keygen result\n const keygenResult = decryptKeygenResult(\n responseData.keygenResult,\n sharedSecret,\n connectionId\n );\n\n return keygenResult;\n }\n\n get connected(): boolean {\n return this.isConnected;\n }\n\n /**\n * Generate a unique connection ID\n */\n\n /**\n * Verify attestation document from handshake response\n * Uses base64-encoded attestation document directly\n */\n private async verifyAttestationDocument(\n attestationDocBase64: string,\n cipherText: Uint8Array\n ): Promise<void> {\n if (!this.attestationVerifier) {\n return; // No verifier configured\n }\n\n try {\n // Generate the expected challenge (hash of cipher text from ML-KEM encapsulation)\n const challengeHash = sha256(cipherText);\n const expectedChallenge = Array.from(challengeHash)\n .map((b: number) => b.toString(16).padStart(2, '0'))\n .join('');\n\n // Verify the attestation document directly with base64 string (no conversion needed!)\n // Nonce is required for security (prevents replay attacks)\n if (!this.handshakeNonce) {\n throw new Error(\n 'Nonce not found - handshake may not have completed properly'\n );\n }\n\n const result = await this.attestationVerifier.verify(\n attestationDocBase64,\n expectedChallenge,\n this.handshakeNonce\n );\n\n if (!result.valid) {\n const errorMsg = `Attestation verification failed: ${result.errors.join(\n ', '\n )}`;\n this.emit('error', new Error(errorMsg));\n throw new Error(errorMsg);\n }\n\n // Emit success event with verification result\n this.emit('message', {\n type: 'attestation-verified',\n timestamp: Date.now(),\n data: result,\n } as any);\n } catch (error) {\n const errorMsg = `Attestation verification error: ${\n error instanceof Error ? error.message : String(error)\n }`;\n this.emit('error', new Error(errorMsg));\n throw new Error(errorMsg);\n }\n }\n}\n","import {\n type WebSocketError,\n WebSocketCloseCode,\n} from '@dynamic-labs-wallet/forward-mpc-shared';\n\nexport { WebSocketCloseCode };\n\n// ─── Error codes ──────────────────────────────────────────────────────────────\n\nexport const ErrorCode = {\n // Transport\n CONNECTION_FAILED: 'CONNECTION_FAILED',\n CONNECTION_TIMEOUT: 'CONNECTION_TIMEOUT',\n NOT_CONNECTED: 'NOT_CONNECTED',\n // Session\n HANDSHAKE_FAILED: 'HANDSHAKE_FAILED',\n HANDSHAKE_INVALID_RESPONSE: 'HANDSHAKE_INVALID_RESPONSE',\n ATTESTATION_FAILED: 'ATTESTATION_FAILED',\n ATTESTATION_NONCE_MISSING: 'ATTESTATION_NONCE_MISSING',\n REQUEST_TIMEOUT: 'REQUEST_TIMEOUT',\n SESSION_DISPOSED: 'SESSION_DISPOSED',\n SERVER_ERROR: 'SERVER_ERROR',\n MESSAGE_PARSE_FAILED: 'MESSAGE_PARSE_FAILED',\n // Client\n SESSION_ESTABLISH_FAILED: 'SESSION_ESTABLISH_FAILED',\n UNSUPPORTED_ALGORITHM: 'UNSUPPORTED_ALGORITHM',\n} as const;\n\nexport type ErrorCode = (typeof ErrorCode)[keyof typeof ErrorCode];\n\n// ─── Error types ──────────────────────────────────────────────────────────────\n\nexport const ForwardMPCErrorType = {\n TRANSPORT: 'transport',\n SESSION: 'session',\n CLIENT: 'client',\n} as const;\n\nexport type ForwardMPCErrorType =\n (typeof ForwardMPCErrorType)[keyof typeof ForwardMPCErrorType];\n\n// ─── Root base class ──────────────────────────────────────────────────────────\n\n/**\n * Abstract root for all Forward MPC errors.\n * `instanceof ForwardMPCError` is true for every error thrown by this library.\n */\nexport abstract class ForwardMPCError extends Error {\n public readonly code: ErrorCode;\n public readonly type: ForwardMPCErrorType;\n public readonly context?: Record<string, unknown>;\n\n constructor(\n message: string,\n code: ErrorCode,\n type: ForwardMPCErrorType,\n context?: Record<string, unknown>\n ) {\n super(message);\n this.name = this.constructor.name;\n this.code = code;\n this.type = type;\n this.context = context;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n message: this.message,\n code: this.code,\n type: this.type,\n stack: this.stack,\n context: this.context,\n };\n }\n}\n\n// ─── Layer base classes ───────────────────────────────────────────────────────\n\n/** Abstract base for errors originating from the WebSocket / transport layer. */\nexport abstract class TransportError extends ForwardMPCError {\n constructor(\n message: string,\n code: ErrorCode,\n context?: Record<string, unknown>\n ) {\n super(message, code, ForwardMPCErrorType.TRANSPORT, context);\n }\n}\n\n/** Abstract base for errors originating from the session / crypto / protocol layer. */\nexport abstract class SessionError extends ForwardMPCError {\n constructor(\n message: string,\n code: ErrorCode,\n context?: Record<string, unknown>\n ) {\n super(message, code, ForwardMPCErrorType.SESSION, context);\n }\n}\n\n/** Abstract base for errors originating from the client / application layer. */\nexport abstract class ClientError extends ForwardMPCError {\n constructor(\n message: string,\n code: ErrorCode,\n context?: Record<string, unknown>\n ) {\n super(message, code, ForwardMPCErrorType.CLIENT, context);\n }\n}\n\n// ─── Transport errors ─────────────────────────────────────────────────────────\n\nexport class TransportConnectionError extends TransportError {\n constructor(context?: Record<string, unknown>) {\n super('WebSocket connection failed', ErrorCode.CONNECTION_FAILED, context);\n }\n}\n\nexport class TransportConnectionTimeoutError extends TransportError {\n constructor(context?: Record<string, unknown>) {\n super(\n 'WebSocket connection timed out',\n ErrorCode.CONNECTION_TIMEOUT,\n context\n );\n }\n}\n\nexport class TransportNotConnectedError extends TransportError {\n constructor(context?: Record<string, unknown>) {\n super('WebSocket is not connected', ErrorCode.NOT_CONNECTED, context);\n }\n}\n\n// ─── Session errors ───────────────────────────────────────────────────────────\n\nexport class SessionHandshakeError extends SessionError {\n constructor(reason: string, context?: Record<string, unknown>) {\n super(\n `ML-KEM-768 handshake failed: ${reason}`,\n ErrorCode.HANDSHAKE_FAILED,\n { reason, ...context }\n );\n }\n}\n\nexport class SessionHandshakeInvalidResponseError extends SessionError {\n constructor(context?: Record<string, unknown>) {\n super(\n 'Handshake response was invalid or incomplete',\n ErrorCode.HANDSHAKE_INVALID_RESPONSE,\n context\n );\n }\n}\n\nexport class SessionAttestationError extends SessionError {\n constructor(context?: Record<string, unknown>) {\n super(\n 'Attestation verification failed',\n ErrorCode.ATTESTATION_FAILED,\n context\n );\n }\n}\n\nexport class SessionAttestationNonceMissingError extends SessionError {\n constructor(context?: Record<string, unknown>) {\n super(\n 'Nonce missing from attestation document',\n ErrorCode.ATTESTATION_NONCE_MISSING,\n context\n );\n }\n}\n\nexport class SessionRequestTimeoutError extends SessionError {\n constructor(context?: Record<string, unknown>) {\n super(\n 'Request timed out waiting for server response',\n ErrorCode.REQUEST_TIMEOUT,\n context\n );\n }\n}\n\nexport class SessionDisposedError extends SessionError {\n constructor(context?: Record<string, unknown>) {\n super('Session has been disposed', ErrorCode.SESSION_DISPOSED, context);\n }\n}\n\nexport class SessionServerError extends SessionError {\n constructor(reason: string, context?: Record<string, unknown>) {\n super(\n `Server returned an error response: ${reason}`,\n ErrorCode.SERVER_ERROR,\n { reason, ...context }\n );\n }\n}\n\nexport class SessionMessageParseError extends SessionError {\n constructor(context?: Record<string, unknown>) {\n super(\n 'Failed to parse server message',\n ErrorCode.MESSAGE_PARSE_FAILED,\n context\n );\n }\n}\n\n/**\n * The remote server returned an explicit error response.\n * Carries the full WebSocketError payload so callers can inspect\n * `serverError.type` and `serverError.details`.\n */\nexport class SessionRemoteError extends SessionError {\n constructor(\n public readonly serverError: WebSocketError,\n context?: Record<string, unknown>\n ) {\n super(serverError.message, ErrorCode.SERVER_ERROR, context);\n }\n}\n\n// ─── Client errors ────────────────────────────────────────────────────────────\n\nexport class ClientUnsupportedAlgorithmError extends ClientError {\n constructor(context?: Record<string, unknown>) {\n super(\n 'Signing algorithm is not supported',\n ErrorCode.UNSUPPORTED_ALGORITHM,\n context\n );\n }\n}\n\nexport class ClientSessionEstablishFailedError extends ClientError {\n constructor(context?: Record<string, unknown>) {\n super(\n 'Failed to establish session',\n ErrorCode.SESSION_ESTABLISH_FAILED,\n context\n );\n }\n}\n","import EventEmitter from 'eventemitter3';\nimport { WebSocket } from 'isows';\nimport {\n TransportConnectionError,\n TransportConnectionTimeoutError,\n TransportNotConnectedError,\n WebSocketCloseCode,\n} from './errors';\nimport { type Logger } from './logger';\n\nexport interface ForwardMPCTransportOptions {\n reconnectAttempts?: number;\n reconnectInterval?: number;\n connectionTimeout?: number;\n logger?: Logger;\n}\n\nexport interface TransportEvents {\n connected: () => void;\n disconnected: (closeCode: number) => void;\n error: (error: Error) => void;\n message: (data: string) => void;\n}\n\nexport class ForwardMPCTransport extends EventEmitter<TransportEvents> {\n private ws: WebSocket | null = null;\n private _isConnected = false;\n private _destroyed = false;\n private _hadSuccessfulConnection = false;\n private _midSessionReconnectCount = 0;\n private _connectPromise: Promise<void> | null = null;\n private readonly options: Required<\n Omit<ForwardMPCTransportOptions, 'logger'>\n >;\n private readonly logger?: Logger;\n\n constructor(\n private readonly url: string,\n options: ForwardMPCTransportOptions = {}\n ) {\n super();\n this.logger = options.logger;\n this.options = {\n reconnectAttempts: options.reconnectAttempts ?? 1,\n reconnectInterval: options.reconnectInterval ?? 1000,\n connectionTimeout: options.connectionTimeout ?? 10000,\n };\n }\n\n get connected(): boolean {\n return this._isConnected;\n }\n\n /**\n * Opens the WebSocket connection. Concurrent callers coalesce on a single\n * in-flight promise. `reconnectAttempts` controls how many silent retries\n * are attempted before the promise rejects (default: 1 retry = 2 total tries).\n */\n async connect(): Promise<void> {\n this._destroyed = false;\n if (this._isConnected) return;\n if (this._connectPromise) return this._connectPromise;\n\n this._connectPromise = this._connectWithRetry().finally(() => {\n this._connectPromise = null;\n });\n return this._connectPromise;\n }\n\n disconnect(): void {\n this._destroyed = true;\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n this._isConnected = false;\n this.emit('disconnected', WebSocketCloseCode.NORMAL);\n }\n\n send(data: string): void {\n if (!this._isConnected || !this.ws) {\n throw new TransportNotConnectedError();\n }\n this.ws.send(data);\n }\n\n /**\n * Attempts the initial connection, then silently retries up to\n * `reconnectAttempts` times before surfacing an error.\n */\n private async _connectWithRetry(): Promise<void> {\n let lastError: unknown;\n for (\n let attempt = 0;\n attempt <= this.options.reconnectAttempts;\n attempt++\n ) {\n try {\n await this._connectOnce();\n return;\n } catch (error) {\n lastError = error;\n }\n }\n throw lastError;\n }\n\n private _connectOnce(): Promise<void> {\n return new Promise((resolve, reject) => {\n const timeoutHandle = setTimeout(() => {\n this.ws?.close();\n reject(new TransportConnectionTimeoutError({ url: this.url }));\n }, this.options.connectionTimeout);\n\n this.ws = new WebSocket(this.url);\n\n this.ws.onopen = () => {\n clearTimeout(timeoutHandle);\n this._isConnected = true;\n this._hadSuccessfulConnection = true;\n this._midSessionReconnectCount = 0;\n this.logger?.debug('MPC Socket connected', { url: this.url });\n this.emit('connected');\n resolve();\n };\n\n this.ws.onerror = () => {\n clearTimeout(timeoutHandle);\n const err = new TransportConnectionError({ url: this.url });\n this.emit('error', err);\n reject(err);\n };\n\n this.ws.onmessage = (event: MessageEvent) => {\n this.logger?.debug('MPC Socket message received', { data: event.data });\n this.emit('message', event.data as string);\n };\n\n this.ws.onclose = (event: { code: number }) => {\n this._isConnected = false;\n this.logger?.debug('MPC Socket closed', {\n url: this.url,\n closeCode: event.code,\n });\n if (!this._destroyed) {\n this.emit('disconnected', event.code);\n }\n this.maybeReconnect(event.code);\n };\n });\n }\n\n /**\n * Attempts mid-session reconnects after a drop, up to `reconnectAttempts`\n * times. Only fires when a successful connection was previously established\n * and the close was unexpected (not a normal or idle-timeout close).\n */\n private maybeReconnect(closeCode: number): void {\n if (this._destroyed) return;\n if (!this._hadSuccessfulConnection) return;\n if (this._midSessionReconnectCount >= this.options.reconnectAttempts)\n return;\n if (\n closeCode === WebSocketCloseCode.NORMAL ||\n closeCode === WebSocketCloseCode.IDLE_TIMEOUT\n ) {\n this.logger?.debug('MPC Socket closed gracefully — not reconnecting', {\n url: this.url,\n closeCode,\n });\n return;\n }\n\n this._midSessionReconnectCount++;\n this.logger?.debug('MPC Socket disconnected — attempting reconnect', {\n url: this.url,\n attempt: this._midSessionReconnectCount,\n maxAttempts: this.options.reconnectAttempts,\n });\n\n setTimeout(() => {\n this._connectOnce().catch((error) => {\n const err = error instanceof Error ? error : new Error(String(error));\n this.logger?.debug(\n 'MPC Socket reconnect failed',\n { attempt: this._midSessionReconnectCount },\n err\n );\n this.logger?.error('Connection failed to MPC socket server');\n this.emit('error', err);\n });\n }, this.options.reconnectInterval);\n }\n}\n","import {\n HandshakeV1RequestMessage,\n messageRegistry,\n generateMlKem768Keypair,\n decapsulateMlKem768,\n type TraceContext,\n type WebSocketError,\n type HandshakeResponseData,\n} from '@dynamic-labs-wallet/forward-mpc-shared';\nimport { hexToBytes, randomBytes } from '@noble/hashes/utils.js';\nimport { sha256 } from '@noble/hashes/sha2.js';\nimport { either } from 'fp-ts';\nimport { ForwardMPCTransport } from './transport';\nimport { type AttestationVerifier } from '../attestation/types';\nimport {\n SessionHandshakeError,\n SessionHandshakeInvalidResponseError,\n SessionAttestationError,\n SessionRequestTimeoutError,\n SessionDisposedError,\n SessionMessageParseError,\n SessionRemoteError,\n} from './errors';\nimport { type Logger } from './logger';\n\nexport interface SessionOptions {\n attestationVerifier?: AttestationVerifier;\n bypassAttestation?: boolean;\n requestTimeout?: number;\n}\n\ninterface DecodedMessage {\n type: string;\n getData(): unknown;\n error?: unknown;\n}\n\nfunction isWebSocketError(v: unknown): v is WebSocketError {\n return (\n typeof v === 'object' &&\n v !== null &&\n typeof (v as Record<string, unknown>)['message'] === 'string' &&\n typeof (v as Record<string, unknown>)['type'] === 'string'\n );\n}\n\nexport class Session {\n private _disposed = false;\n private readonly _abort = new AbortController();\n\n /**\n * Session is only constructed with fully-validated crypto material.\n * All handshake and attestation work is done in the static handshake() factory\n * before this constructor is called.\n */\n private constructor(\n private readonly transport: ForwardMPCTransport,\n private readonly _connectionId: string,\n private readonly _sharedSecret: Uint8Array,\n private readonly requestTimeout: number,\n private readonly logger?: Logger\n ) {}\n\n get connectionId(): string {\n return this._connectionId;\n }\n\n get sharedSecret(): Uint8Array {\n if (this._disposed) {\n throw new SessionDisposedError();\n }\n return this._sharedSecret;\n }\n\n /**\n * Performs the ML-KEM-768 handshake over an established transport connection\n * and returns a fully authenticated Session. All crypto material is derived\n * before the Session object is created — the constructor never receives\n * partially-initialised state.\n *\n * Attestation is verified (when configured) before the Session is returned.\n */\n static async handshake(\n transport: ForwardMPCTransport,\n traceContext?: TraceContext,\n options: SessionOptions = {},\n logger?: Logger\n ): Promise<Session> {\n const requestTimeout = options.requestTimeout ?? 30000;\n const { encapsulationKey, decapsulationKey } = generateMlKem768Keypair();\n const nonceBytes = randomBytes(32);\n\n const request = new HandshakeV1RequestMessage({\n challenge: encapsulationKey,\n nonce: nonceBytes,\n traceContext,\n });\n\n let data: HandshakeResponseData;\n try {\n data = await Session.doRequest<HandshakeResponseData>(\n transport,\n request,\n requestTimeout\n );\n } catch (error) {\n decapsulationKey.fill(0);\n nonceBytes.fill(0);\n const message = error instanceof Error ? error.message : String(error);\n throw new SessionHandshakeError(message);\n }\n\n if (!data.encapsulatedSharedSecret || !data.connectionId) {\n decapsulationKey.fill(0);\n nonceBytes.fill(0);\n throw new SessionHandshakeInvalidResponseError();\n }\n\n const connectionId = data.connectionId;\n const cipherText = hexToBytes(data.encapsulatedSharedSecret);\n const sharedSecret = decapsulateMlKem768(decapsulationKey, cipherText);\n decapsulationKey.fill(0);\n\n if (options.attestationVerifier && !options.bypassAttestation) {\n if (!data.attestationDoc) {\n sharedSecret.fill(0);\n nonceBytes.fill(0);\n throw new SessionAttestationError({\n reason: 'Server did not return an attestation document',\n });\n }\n try {\n await Session.verifyAttestation(\n data.attestationDoc,\n cipherText,\n nonceBytes,\n options.attestationVerifier\n );\n } catch (error) {\n sharedSecret.fill(0);\n nonceBytes.fill(0);\n throw error;\n }\n }\n\n nonceBytes.fill(0);\n logger?.debug('Handshake completed', { connectionId });\n\n return new Session(\n transport,\n connectionId,\n sharedSecret,\n requestTimeout,\n logger\n );\n }\n\n sendRequest<T>(message: unknown): Promise<T> {\n if (this._disposed) {\n return Promise.reject(new SessionDisposedError());\n }\n return Session.doRequest<T>(\n this.transport,\n message,\n this.requestTimeout,\n this._abort.signal\n );\n }\n\n dispose(): void {\n if (this._disposed) return;\n this._disposed = true;\n this._abort.abort();\n this._sharedSecret.fill(0);\n this.logger?.debug('Session disposed', {\n connectionId: this._connectionId,\n });\n }\n\n /**\n * Sends a single request and resolves with the decoded response data.\n * Used by both handshake() and sendRequest(). The optional AbortSignal\n * allows dispose() to cancel all in-flight requests immediately.\n */\n private static doRequest<T>(\n transport: ForwardMPCTransport,\n message: unknown,\n timeout: number,\n signal?: AbortSignal\n ): Promise<T> {\n const requestId = Session.generateRequestId();\n\n return new Promise<T>((resolve, reject) => {\n if (signal?.aborted) {\n reject(new SessionDisposedError());\n return;\n }\n\n const cleanup = () => {\n clearTimeout(timeoutHandle);\n transport.off('message', handler);\n signal?.removeEventListener('abort', onAbort);\n };\n\n const onAbort = () => {\n cleanup();\n reject(new SessionDisposedError());\n };\n\n signal?.addEventListener('abort', onAbort, { once: true });\n\n const timeoutHandle = setTimeout(() => {\n cleanup();\n reject(new SessionRequestTimeoutError({ requestId }));\n }, timeout);\n\n const handler = (rawData: string) => {\n let parsed: Record<string, unknown>;\n try {\n parsed = JSON.parse(rawData);\n } catch {\n return;\n }\n if (parsed['requestId'] !== requestId) return;\n\n cleanup();\n\n const { requestId: _rid, ...body } = parsed;\n\n // Attempt decode; treat both thrown exceptions and Left results as parse failures.\n let msg: DecodedMessage | null = null;\n try {\n const result = messageRegistry.decode(body);\n if (either.isRight(result)) msg = result.right as DecodedMessage;\n } catch {\n /* fall through to null check below */\n }\n\n if (msg === null) {\n reject(new SessionMessageParseError({ requestId }));\n return;\n }\n\n if (msg.type === 'error') {\n reject(\n isWebSocketError(msg.error)\n ? new SessionRemoteError(msg.error)\n : new SessionMessageParseError({ requestId })\n );\n } else {\n resolve(msg.getData() as T);\n }\n };\n\n transport.on('message', handler);\n\n try {\n transport.send(Session.serializeWithRequestId(message, requestId));\n } catch (error) {\n cleanup();\n reject(error instanceof Error ? error : new Error(String(error)));\n }\n });\n }\n\n /**\n * Serialises a message with the given requestId injected without mutating\n * the original message object. Handles both encodeable (registry) messages\n * and plain objects.\n */\n private static serializeWithRequestId(\n message: unknown,\n requestId: string\n ): string {\n const msg = message as Record<string, unknown>;\n if (typeof msg['encode'] === 'function') {\n const encoded: Record<string, unknown> = msg['encode']();\n encoded['requestId'] = requestId;\n return JSON.stringify(encoded);\n }\n return JSON.stringify({ ...msg, requestId });\n }\n\n private static generateRequestId(): string {\n const rand = randomBytes(8);\n return `req_${Array.from(rand)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('')}`;\n }\n\n private static async verifyAttestation(\n attestationDocBase64: string,\n cipherText: Uint8Array,\n nonce: Uint8Array,\n verifier: AttestationVerifier\n ): Promise<void> {\n const challengeHash = sha256(cipherText);\n const expectedChallenge = Array.from(challengeHash)\n .map((b: number) => b.toString(16).padStart(2, '0'))\n .join('');\n\n const result = await verifier.verify(\n attestationDocBase64,\n expectedChallenge,\n nonce\n );\n\n if (!result.valid) {\n throw new SessionAttestationError({ errors: result.errors });\n }\n }\n}\n","/**\n * When an ExternalLogger is provided, the library routes all log calls through\n * it. The signature matches the Datadog Browser SDK logger so that the same\n * instance can be passed directly.\n *\n * Compatible with the Datadog Browser SDK logger interface (@datadog/browser-logs).\n */\nexport interface ExternalLogger {\n debug(message: string, messageContext?: object, error?: Error): void;\n info(message: string, messageContext?: object, error?: Error): void;\n warn(message: string, messageContext?: object, error?: Error): void;\n error(message: string, messageContext?: object, error?: Error): void;\n}\n\nexport class Logger {\n private readonly MESSAGE_PREFIX = '[DynamicMpcClient]';\n constructor(private readonly externalLogger?: ExternalLogger) {}\n\n debug(message: string, messageContext?: object, error?: Error): void {\n this.externalLogger?.debug(\n `${this.MESSAGE_PREFIX} ${message}`,\n messageContext,\n error\n );\n }\n\n info(message: string, messageContext?: object, error?: Error): void {\n this.externalLogger?.info(\n `${this.MESSAGE_PREFIX} ${message}`,\n messageContext,\n error\n );\n }\n\n warn(message: string, messageContext?: object, error?: Error): void {\n this.externalLogger?.warn(\n `${this.MESSAGE_PREFIX} ${message}`,\n messageContext,\n error\n );\n }\n\n error(message: string, messageContext?: object, error?: Error): void {\n this.externalLogger?.error(\n `${this.MESSAGE_PREFIX} ${message}`,\n messageContext,\n error\n );\n }\n}\n","import EventEmitter from 'eventemitter3';\nimport {\n SignMessageV1RequestMessage,\n KeygenV1RequestMessage,\n ReceiveKeyV1RequestMessage,\n encryptKeyshare,\n encryptKeygenInit,\n decryptKeygenResult,\n fromDynamicSigningAlgorithm,\n type TraceContext,\n type SignMessageResponseData,\n type KeygenResponseData,\n type ReceiveKeyResponseData,\n} from '@dynamic-labs-wallet/forward-mpc-shared';\nimport { hexToBytes } from '@noble/hashes/utils.js';\nimport { NitroAttestationVerifier } from '../attestation';\nimport {\n type AttestationVerificationConfig,\n type AttestationVerifier,\n} from '../attestation/types';\nimport {\n ForwardMPCTransport,\n type ForwardMPCTransportOptions,\n} from './transport';\nimport { Session, type SessionOptions } from './session';\nimport {\n SessionServerError,\n ClientUnsupportedAlgorithmError,\n ClientSessionEstablishFailedError,\n} from './errors';\nimport { Logger, type ExternalLogger } from './logger';\nimport {\n type SignMessageParams,\n type KeygenParams,\n type ReceiveKeyParams,\n type SignMessageResult,\n type KeygenResult,\n type ReceiveKeyResult,\n SigningAlgorithm,\n} from './types';\n\nexport interface ForwardMPCClientV2Options {\n // Transport\n reconnectAttempts?: number;\n reconnectInterval?: number;\n connectionTimeout?: number;\n // Session\n requestTimeout?: number;\n // Attestation\n attestationConfig?: AttestationVerificationConfig;\n attestationVerifier?: AttestationVerifier;\n /**\n * Disables attestation verification. DO NOT use in production.\n * @deprecated Use only for local development and testing.\n */\n dangerouslyBypassAttestation?: boolean;\n // Logging\n logger?: ExternalLogger;\n}\n\nexport interface ClientV2Events {\n connected: () => void;\n disconnected: (closeCode: number) => void;\n error: (error: Error) => void;\n}\n\nexport class ForwardMPCClientV2 extends EventEmitter<ClientV2Events> {\n protected readonly url: string;\n protected readonly options: ForwardMPCClientV2Options;\n private readonly transport: ForwardMPCTransport;\n private readonly sessionOptions: SessionOptions;\n private readonly logger: Logger;\n private session: Session | null = null;\n private _connectPromise: Promise<void> | null = null;\n private _handshaking = false;\n private _disconnectedIntentionally = false;\n\n constructor(url: string, options: ForwardMPCClientV2Options = {}) {\n super();\n\n this.url = url;\n this.options = options;\n if (options.dangerouslyBypassAttestation) {\n console.warn(\n '[ForwardMPCClientV2] dangerouslyBypassAttestation is enabled — ' +\n 'attestation verification is disabled. Do not use in production.'\n );\n } else if (!options.attestationVerifier && !options.attestationConfig) {\n console.warn(\n '[ForwardMPCClientV2] No attestation verifier configured — ' +\n 'connections will not be attested. This is insecure in production.'\n );\n }\n\n this.logger = new Logger(this.options.logger);\n\n const transportOptions: ForwardMPCTransportOptions = {\n reconnectAttempts: this.options.reconnectAttempts,\n reconnectInterval: this.options.reconnectInterval,\n connectionTimeout: this.options.connectionTimeout,\n logger: this.logger,\n };\n\n this.transport = new ForwardMPCTransport(url, transportOptions);\n\n const attestationVerifier =\n options.attestationVerifier ??\n (options.attestationConfig\n ? new NitroAttestationVerifier(options.attestationConfig)\n : undefined);\n\n this.sessionOptions = {\n attestationVerifier,\n bypassAttestation: options.dangerouslyBypassAttestation,\n requestTimeout: options.requestTimeout,\n };\n\n this.transport.on('connected', () => this.onTransportConnected());\n this.transport.on('disconnected', (closeCode) =>\n this.onTransportDisconnected(closeCode)\n );\n this.transport.on('error', (error) => this.emit('error', error));\n }\n\n get connected(): boolean {\n return this.transport.connected && this.session !== null;\n }\n\n /**\n * Opens the WebSocket connection and performs the ML-KEM-768 handshake.\n * Resolves once the session is fully established (and attested, if configured).\n * Concurrent calls coalesce on a single in-flight promise.\n */\n async connect(traceContext?: TraceContext): Promise<void> {\n if (this.session) return;\n if (this._connectPromise) return this._connectPromise;\n\n this._connectPromise = this._doConnect(traceContext).finally(() => {\n this._connectPromise = null;\n });\n return this._connectPromise;\n }\n\n /**\n * Disposes the current session (zeroing crypto material) and closes the transport.\n */\n disconnect(): void {\n this._disconnectedIntentionally = true;\n this.session?.dispose();\n this.session = null;\n this.transport.disconnect();\n // 'disconnected' will be emitted by onTransportDisconnected when the socket closes\n }\n\n async signMessage(params: SignMessageParams): Promise<SignMessageResult> {\n const session = await this.ensureSession();\n\n let messageToSign: Uint8Array;\n if (typeof params.message === 'string') {\n const hex = params.message.startsWith('0x')\n ? params.message.slice(2)\n : params.message;\n messageToSign = hexToBytes(hex);\n } else {\n messageToSign = params.message;\n }\n\n const encryptedKeyshare = encryptKeyshare(\n params.keyshare,\n session.sharedSecret,\n session.connectionId,\n fromDynamicSigningAlgorithm(params.signingAlgo)\n );\n\n const request = new SignMessageV1RequestMessage({\n relayDomain: params.relayDomain,\n signingAlgo: params.signingAlgo,\n hashAlgo: params.hashAlgo,\n derivationPath: params.derivationPath,\n tweak: params.tweak,\n keyshare: encryptedKeyshare,\n message: messageToSign,\n roomUuid: params.roomUuid,\n traceContext: params.traceContext,\n userId: params.userId,\n environmentId: params.environmentId,\n });\n\n const { signature } =\n await session.sendRequest<SignMessageResponseData>(request);\n\n if (!signature) {\n throw new SessionServerError('No signature in response');\n }\n\n return { signature };\n }\n\n /**\n * MPC key generation for ECDSA and BIP340.\n * ED25519 is not supported here — use receiveKey() instead.\n */\n async keygen(params: KeygenParams): Promise<KeygenResult> {\n if (params.signingAlgo === SigningAlgorithm.ED25519) {\n throw new ClientUnsupportedAlgorithmError();\n }\n\n const session = await this.ensureSession();\n\n const encryptedKeygenInit = encryptKeygenInit(\n params.keygenInit,\n session.sharedSecret,\n session.connectionId\n );\n\n const request = new KeygenV1RequestMessage({\n relayDomain: params.relayDomain,\n signingAlgo: params.signingAlgo,\n roomUuid: params.roomUuid,\n numParties: params.numParties,\n threshold: params.threshold,\n keygenInit: encryptedKeygenInit,\n keygenIds: params.keygenIds,\n traceContext: params.traceContext,\n userId: params.userId,\n environmentId: params.environmentId,\n });\n\n const { keygenResult } =\n await session.sendRequest<KeygenResponseData>(request);\n\n if (!keygenResult) {\n throw new SessionServerError('No keygen result in response');\n }\n\n return decryptKeygenResult(\n keygenResult,\n session.sharedSecret,\n session.connectionId\n );\n }\n\n /**\n * Receives an ED25519 key generated by another party (ExportableEd25519).\n */\n async receiveKey(params: ReceiveKeyParams): Promise<ReceiveKeyResult> {\n const session = await this.ensureSession();\n\n const encryptedKeygenInit = encryptKeygenInit(\n params.keygenInit,\n session.sharedSecret,\n session.connectionId\n );\n\n const request = new ReceiveKeyV1RequestMessage({\n relayDomain: params.relayDomain,\n signingAlgo: 'ed25519',\n roomUuid: params.roomUuid,\n numParties: params.numParties,\n threshold: params.threshold,\n keygenInit: encryptedKeygenInit,\n keygenIds: params.keygenIds,\n traceContext: params.traceContext,\n userId: params.userId,\n environmentId: params.environmentId,\n });\n\n const { keygenResult } =\n await session.sendRequest<ReceiveKeyResponseData>(request);\n\n if (!keygenResult) {\n throw new SessionServerError('No keygen result in response');\n }\n\n return decryptKeygenResult(\n keygenResult,\n session.sharedSecret,\n session.connectionId\n );\n }\n\n /**\n * Ensures an active session exists, auto-connecting if needed.\n */\n private async ensureSession(): Promise<Session> {\n if (this.session) return this.session;\n await this.connect();\n if (!this.session) {\n throw new ClientSessionEstablishFailedError();\n }\n return this.session;\n }\n\n private async _runHandshake(traceContext?: TraceContext): Promise<void> {\n this.session = await Session.handshake(\n this.transport,\n traceContext,\n this.sessionOptions,\n this.logger\n );\n this.emit('connected');\n }\n\n private async _doConnect(traceContext?: TraceContext): Promise<void> {\n this._handshaking = true;\n try {\n await this.transport.connect();\n await this._runHandshake(traceContext);\n } finally {\n this._handshaking = false;\n }\n }\n\n /**\n * Called when the transport connects (both initial and after auto-reconnect).\n * The `_handshaking` flag is set synchronously at the top of `_doConnect`\n * before any await, so it reliably indicates when we already own the handshake.\n *\n * For transport-initiated reconnects, `_connectPromise` is set so that\n * concurrent `connect()` or `ensureSession()` callers coalesce on the\n * in-flight handshake rather than initiating a second one.\n */\n private onTransportConnected(): void {\n if (this._handshaking) return;\n this._handshaking = true;\n\n const doHandshake = async () => {\n try {\n await this._runHandshake();\n } catch (error) {\n this.emit(\n 'error',\n error instanceof Error ? error : new Error(String(error))\n );\n } finally {\n this._handshaking = false;\n this._connectPromise = null;\n }\n };\n\n this._connectPromise = doHandshake();\n }\n\n private onTransportDisconnected(closeCode: number): void {\n const intentional = this._disconnectedIntentionally;\n this._disconnectedIntentionally = false;\n this.session?.dispose();\n this.session = null;\n if (!intentional) {\n this.logger.debug('Unexpected MPC Socket disconnect');\n }\n this.emit('disconnected', closeCode);\n }\n}\n","import { ForwardMPCClientV2 } from './client-v2';\n\n/**\n * @deprecated Use {@link ForwardMPCClientV2} directly and manage the instance\n * lifecycle yourself. This class will be removed in a future version.\n */\nexport class ForwardMPCClientSingleton extends ForwardMPCClientV2 {}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/attestation/constants.ts","../src/attestation/verifier.ts","../src/client.ts","../src/client-v2/errors.ts","../src/client-v2/transport.ts","../src/client-v2/session.ts","../src/client-v2/logger.ts","../src/client-v2/client-v2.ts","../src/client-v2/singleton.ts"],"names":["ATTESTATION_CONSTANTS","MAX_ATTESTATION_AGE","NitroAttestationVerifier","config","wasmInitPromise","strictCertValidation","maxAge","ensureWasmInitialized","initWasm","then","undefined","catch","error","Error","message","process","versions","node","readFileSync","createRequire","require","wasmPath","resolve","initSync","module","init","verify","attestationDocBase64","expectedChallenge","nonce","expectedPcrs","PCRs","empty","pcr8","expectedPcr8","isValid","validateAttestationDocPcrs","valid","errors","timestamp","Date","now","userData","getUserData","userDataString","TextDecoder","decode","String","extractedNonceRaw","getNonce","extractedNonce","nonceString","atob","binaryString","Uint8Array","length","i","charCodeAt","Buffer","from","decodeError","diff","isWindow","globalThis","window","WebSocketImpl","WebSocket","ForwardMPCClient","EventEmitter","ws","url","options","attestationVerifier","isConnected","messageId","pendingRequests","Map","sharedSecret","decapsulationKey","connectionId","handshakeNonce","attestationPromise","reconnectAttempts","reconnectInterval","connectionTimeout","heartbeatInterval","attestationConfig","bypassAttestation","connect","Promise","reject","timeout","setTimeout","onopen","clearTimeout","emit","onerror","_error","onmessage","event","handleMessage","data","onclose","cleanup","on","toString","disconnect","close","request","clear","fill","ensureWsConnection","handshake","parsed","JSON","parse","requestId","deserializeMessage","stringify","has","get","delete","type","errorMsg","endsWith","responseData","getData","sendRequest","messageWithId","set","serializedMessage","serializeMessage","send","encode","encoded","messageRegistry","result","either","isLeft","right","traceContext","encapsulationKey","generateMlKem768Keypair","nonceBytes","randomBytes","HandshakeV1RequestMessage","challenge","response","encapsulatedSharedSecret","cipherText","hexToBytes","decapsulateMlKem768","attestationDoc","verifyAttestationDocument","signMessage","params","messageToSign","cleanHex","startsWith","slice","encryptedKeyshare","encryptKeyshare","keyshare","signingAlgo","SignMessageV1RequestMessage","relayDomain","hashAlgo","derivationPath","tweak","roomUuid","userId","walletId","environmentId","keygen","SigningAlgorithm","ED25519","encryptedKeygenInit","encryptKeygenInit","keygenInit","KeygenV1RequestMessage","numParties","threshold","keygenIds","keygenResult","decryptKeygenResult","receiveKey","ReceiveKeyV1RequestMessage","connected","challengeHash","sha256","Array","map","b","padStart","join","ErrorCode","CONNECTION_FAILED","CONNECTION_TIMEOUT","NOT_CONNECTED","HANDSHAKE_FAILED","HANDSHAKE_INVALID_RESPONSE","ATTESTATION_FAILED","ATTESTATION_PCR_MISMATCH","ATTESTATION_CHALLENGE_MISMATCH","ATTESTATION_NONCE_MISMATCH","ATTESTATION_NONCE_MISSING","ATTESTATION_DOCUMENT_MISSING","REQUEST_TIMEOUT","SESSION_DISPOSED","SERVER_ERROR","MESSAGE_PARSE_FAILED","SESSION_ESTABLISH_FAILED","UNSUPPORTED_ALGORITHM","AttestationErrorCode","FAILED","PCR_MISMATCH","CHALLENGE_MISMATCH","NONCE_MISMATCH","NONCE_MISSING","DOCUMENT_MISSING","ForwardMPCErrorType","TRANSPORT","SESSION","CLIENT","ForwardMPCError","code","context","name","Object","setPrototypeOf","prototype","toJSON","stack","TransportError","SessionError","ClientError","TransportConnectionError","TransportConnectionTimeoutError","TransportNotConnectedError","SessionHandshakeError","reason","SessionHandshakeInvalidResponseError","SessionAttestationError","cause","SessionRequestTimeoutError","SessionDisposedError","SessionServerError","SessionMessageParseError","SessionRemoteError","serverError","ClientUnsupportedAlgorithmError","ClientSessionEstablishFailedError","ForwardMPCTransport","_isConnected","_destroyed","_hadSuccessfulConnection","_midSessionReconnectCount","_connectPromise","logger","_connectWithRetry","finally","WebSocketCloseCode","NORMAL","lastError","attempt","_connectOnce","timeoutHandle","debug","err","closeCode","maybeReconnect","IDLE_TIMEOUT","maxAttempts","isWebSocketError","v","Session","_disposed","_abort","AbortController","transport","_connectionId","_sharedSecret","requestTimeout","doRequest","verifyAttestation","signal","dispose","abort","generateRequestId","aborted","off","handler","removeEventListener","onAbort","addEventListener","once","rawData","_rid","body","msg","isRight","maybeError","serializeWithRequestId","rand","verifier","primaryError","classifyAttestationError","includes","Logger","MESSAGE_PREFIX","externalLogger","messageContext","info","warn","ForwardMPCClientV2","sessionOptions","session","_handshaking","_disconnectedIntentionally","dangerouslyBypassAttestation","console","transportOptions","onTransportConnected","onTransportDisconnected","_doConnect","ensureSession","hex","fromDynamicSigningAlgorithm","signature","_runHandshake","doHandshake","intentional","ForwardMPCClientSingleton"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BO,IAAMA,qBAAAA,GAAwB;;AAEnCC,EAAAA,mBAAAA,EAAqB,IAAI,EAAA,GAAK,GAUhC,CAAA;ACvBO,IAAMC,2BAAN,MAAMA;EAhBb;;;AAiBmBC,EAAAA,MAAAA;EACTC,eAAAA,GAAwC,IAAA;AAEhD,EAAA,WAAA,CAAYD,MAAAA,EAAuC;AACjD,IAAA,IAAA,CAAKA,MAAAA,GAAS;MACZE,oBAAAA,EAAsB,IAAA;AACtBC,MAAAA,MAAAA,EAAQN,qBAAAA,CAAsBC,mBAAAA;MAC9B,GAAGE;AACL,KAAA;AACF,EAAA;;;;;;EAOQI,qBAAAA,GAAuC;AAC7C,IAAA,IAAA,CAAKH,eAAAA,KAAoB,IAAA,CAAKI,QAAAA,EAAQ,CACnCC,IAAAA,CAAK,MAAMC,MAAAA,CAAAA,CACXC,KAAAA,CAAM,CAACC,KAAAA,KAAAA;AACN,MAAA,IAAA,CAAKR,eAAAA,GAAkB,IAAA;AACvB,MAAA,MAAM,IAAIS,MACR,CAAA,kCAAA,EAAqCD,KAAAA,YAAiBC,QAAQD,KAAAA,CAAME,OAAAA,GAAU,eAAA,CAAA,CAAiB,CAAA;IAEnG,CAAA,CAAA;AACF,IAAA,OAAO,IAAA,CAAKV,eAAAA;AACd,EAAA;;;;;;AAOA,EAAA,MAAcI,QAAAA,GAA0B;AACtC,IAAA,IAAI,OAAOO,OAAAA,KAAY,WAAA,IAAeA,OAAAA,CAAQC,UAAUC,IAAAA,EAAM;AAC5D,MAAA,MAAM,EAAEC,YAAAA,EAAY,GAAK,MAAM,OAAO,IAAA,CAAA;AACtC,MAAA,MAAM,EAAEC,aAAAA,EAAa,GAAK,MAAM,OAAO,QAAA,CAAA;AACvC,MAAA,MAAMC,QAAAA,GAAUD,aAAAA,CAAc,2PAAe,CAAA;AAC7C,MAAA,MAAME,QAAAA,GAAWD,QAAAA,CAAQE,OAAAA,CACvB,oDAAA,CAAA;AAEF,MAAA,MAAM,EAAEC,QAAAA,EAAQ,GAAK,MAAM,OAAO,sCAAA,CAAA;AAClCA,MAAAA,QAAAA,CAAS;AAAEC,QAAAA,MAAAA,EAAQN,aAAaG,QAAAA;OAAU,CAAA;IAC5C,CAAA,MAAO;AACL,MAAA,MAAMI,qBAAAA,EAAAA;AACR,IAAA;AACF,EAAA;;;;;;;;;EAUA,MAAMC,MAAAA,CACJC,oBAAAA,EACAC,iBAAAA,EACAC,KAAAA,EACwC;AACxC,IAAA,IAAI;AAEF,MAAA,MAAM,KAAKtB,qBAAAA,EAAqB;AAGhC,MAAA,MAAMuB,YAAAA,GAAeC,UAAKC,KAAAA,EAAK;AAC/BF,MAAAA,YAAAA,CAAaG,IAAAA,GAAO,KAAK9B,MAAAA,CAAO+B,YAAAA;AAGhC,MAAA,MAAMC,OAAAA,GAAUC,gCAA2BT,oBAAAA,EAAsB;AAC/DG,QAAAA;AACD,OAAA,CAAA;AAED,MAAA,IAAI,CAACK,OAAAA,EAAS;AACZ,QAAA,OAAO;UACLE,KAAAA,EAAO,KAAA;UACPC,MAAAA,EAAQ;AAAC,YAAA;;AACTC,UAAAA,SAAAA,EAAWC,KAAKC,GAAAA;AAClB,SAAA;AACF,MAAA;AAKA,MAAA,IAAI,CAACb,iBAAAA,EAAmB;AACtB,QAAA,OAAO;UACLS,KAAAA,EAAO,KAAA;UACPC,MAAAA,EAAQ;AACN,YAAA;;AAEFC,UAAAA,SAAAA,EAAWC,KAAKC,GAAAA;AAClB,SAAA;AACF,MAAA;AAEA,MAAA,IAAI;AACF,QAAA,MAAMC,QAAAA,GAAWC,iBAAYhB,oBAAAA,CAAAA;AAC7B,QAAA,IAAI,CAACe,QAAAA,EAAU;AACb,UAAA,OAAO;YACLL,KAAAA,EAAO,KAAA;YACPC,MAAAA,EAAQ;AAAC,cAAA;;AACTC,YAAAA,SAAAA,EAAWC,KAAKC,GAAAA;AAClB,WAAA;AACF,QAAA;AAIA,QAAA,MAAMG,iBAAiB,IAAIC,WAAAA,CAAY,OAAA,CAAA,CAASC,OAAOJ,QAAAA,CAAAA;AAEvD,QAAA,IAAIE,mBAAmBhB,iBAAAA,EAAmB;AACxC,UAAA,OAAO;YACLS,KAAAA,EAAO,KAAA;YACPC,MAAAA,EAAQ;AACN,cAAA;;AAEFC,YAAAA,SAAAA,EAAWC,KAAKC,GAAAA;AAClB,WAAA;AACF,QAAA;AACF,MAAA,CAAA,CAAA,OAAS7B,KAAAA,EAAO;AACd,QAAA,OAAO;UACLyB,KAAAA,EAAO,KAAA;UACPC,MAAAA,EAAQ;AACN,YAAA,CAAA,6CAAA,EAAgD1B,iBAAiBC,KAAAA,GAAQD,KAAAA,CAAME,OAAAA,GAAUiC,MAAAA,CAAOnC,KAAAA,CAAAA,CAAAA;;AAElG2B,UAAAA,SAAAA,EAAWC,KAAKC,GAAAA;AAClB,SAAA;AACF,MAAA;AAGA,MAAA,IAAI;AAEF,QAAA,MAAMO,iBAAAA,GAAoBC,cAAStB,oBAAAA,CAAAA;AAEnC,QAAA,IAAI,CAACqB,iBAAAA,EAAmB;AACtB,UAAA,OAAO;YACLX,KAAAA,EAAO,KAAA;YACPC,MAAAA,EAAQ;AAAC,cAAA;;AACTC,YAAAA,SAAAA,EAAWC,KAAKC,GAAAA;AAClB,WAAA;AACF,QAAA;AAIA,QAAA,IAAIS,cAAAA;AACJ,QAAA,IAAI;AACF,UAAA,MAAMC,WAAAA,GAAc,IAAIN,WAAAA,EAAAA,CAAcC,OAAOE,iBAAAA,CAAAA;AAG7C,UAAA,IAAI,OAAOI,SAAS,WAAA,EAAa;AAC/B,YAAA,MAAMC,YAAAA,GAAeD,KAAKD,WAAAA,CAAAA;AAC1BD,YAAAA,cAAAA,GAAiB,IAAII,UAAAA,CAAWD,YAAAA,CAAaE,MAAM,CAAA;AACnD,YAAA,KAAA,IAASC,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAIH,YAAAA,CAAaE,QAAQC,CAAAA,EAAAA,EAAK;AAC5CN,cAAAA,cAAAA,CAAeM,CAAAA,CAAAA,GAAKH,YAAAA,CAAaI,UAAAA,CAAWD,CAAAA,CAAAA;AAC9C,YAAA;UACF,CAAA,MAAO;AACLN,YAAAA,cAAAA,GAAiB,IAAII,UAAAA,CAAWI,MAAAA,CAAOC,IAAAA,CAAKR,WAAAA,EAAa,QAAA,CAAA,CAAA;AAC3D,UAAA;AACF,QAAA,CAAA,CAAA,OAASS,WAAAA,EAAa;AACpB,UAAA,OAAO;YACLvB,KAAAA,EAAO,KAAA;YACPC,MAAAA,EAAQ;AACN,cAAA,CAAA,oCAAA,EAAuCsB,uBAAuB/C,KAAAA,GAAQ+C,WAAAA,CAAY9C,OAAAA,GAAUiC,MAAAA,CAAOa,WAAAA,CAAAA,CAAAA;;AAErGrB,YAAAA,SAAAA,EAAWC,KAAKC,GAAAA;AAClB,WAAA;AACF,QAAA;AAGA,QAAA,IAAIS,cAAAA,CAAeK,MAAAA,KAAW1B,KAAAA,CAAM0B,MAAAA,EAAQ;AAC1C,UAAA,OAAO;YACLlB,KAAAA,EAAO,KAAA;YACPC,MAAAA,EAAQ;AACN,cAAA,CAAA,gCAAA,EAAmCT,KAAAA,CAAM0B,MAAM,CAAA,YAAA,EAAeL,cAAAA,CAAeK,MAAM,CAAA,MAAA;;AAErFhB,YAAAA,SAAAA,EAAWC,KAAKC,GAAAA;AAClB,WAAA;AACF,QAAA;AAIA,QAAA,IAAIoB,IAAAA,GAAO,CAAA;AACX,QAAA,KAAA,IAASL,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAI3B,KAAAA,CAAM0B,QAAQC,CAAAA,EAAAA,EAAK;AACrCK,UAAAA,IAAAA,IAAQX,cAAAA,CAAeM,CAAAA,CAAAA,GAAK3B,KAAAA,CAAM2B,CAAAA,CAAAA;AACpC,QAAA;AAEA,QAAA,IAAIK,SAAS,CAAA,EAAG;AACd,UAAA,OAAO;YACLxB,KAAAA,EAAO,KAAA;YACPC,MAAAA,EAAQ;AAAC,cAAA;;AACTC,YAAAA,SAAAA,EAAWC,KAAKC,GAAAA;AAClB,WAAA;AACF,QAAA;AACF,MAAA,CAAA,CAAA,OAAS7B,KAAAA,EAAO;AACd,QAAA,OAAO;UACLyB,KAAAA,EAAO,KAAA;UACPC,MAAAA,EAAQ;AACN,YAAA,CAAA,mCAAA,EAAsC1B,iBAAiBC,KAAAA,GAAQD,KAAAA,CAAME,OAAAA,GAAUiC,MAAAA,CAAOnC,KAAAA,CAAAA,CAAAA;;AAExF2B,UAAAA,SAAAA,EAAWC,KAAKC,GAAAA;AAClB,SAAA;AACF,MAAA;AAEA,MAAA,OAAO;QACLJ,KAAAA,EAAO,IAAA;AACPC,QAAAA,MAAAA,EAAQ,EAAA;AACRC,QAAAA,SAAAA,EAAWC,KAAKC,GAAAA;AAClB,OAAA;AACF,IAAA,CAAA,CAAA,OAAS7B,KAAAA,EAAO;AACd,MAAA,OAAO;QACLyB,KAAAA,EAAO,KAAA;QACPC,MAAAA,EAAQ;AACN,UAAA,CAAA,gCAAA,EAAmC1B,iBAAiBC,KAAAA,GAAQD,KAAAA,CAAME,OAAAA,GAAUiC,MAAAA,CAAOnC,KAAAA,CAAAA,CAAAA;;AAErF2B,QAAAA,SAAAA,EAAWC,KAAKC,GAAAA;AAClB,OAAA;AACF,IAAA;AACF,EAAA;AACF;AC1OA,IAAMqB,WACJ,OAAOC,UAAAA,KAAe,WAAA,IACtB,OAAQA,WAAmBC,MAAAA,KAAW,WAAA;AACxC,IAAMC,aAAAA,GAAgBH,QAAAA,GAAYC,UAAAA,CAAmBG,SAAAA,GAAeA,aAAAA,CAAAA,SAAAA;AA6C7D,IAAMC,gBAAAA,GAAN,cAA+BC,0BAAAA,CAAAA;EApDtC;;;EAqDUC,EAAAA,GAAU,IAAA;AACVC,EAAAA,GAAAA;AACAC,EAAAA,OAAAA;EAMAC,mBAAAA,GAAkC,IAAA;EAClCC,WAAAA,GAAc,KAAA;EACdC,SAAAA,GAAY,CAAA;AACZC,EAAAA,eAAAA,uBAAsBC,GAAAA,EAAAA;EAQtBC,YAAAA,GAAkC,IAAA;EAClCC,gBAAAA,GAAsC,IAAA;AACtCC,EAAAA,YAAAA;EACAC,cAAAA,GAAoC,IAAA;EACpCC,kBAAAA,GAA2C,IAAA;EAEnD,WAAA,CAAYX,GAAAA,EAAaC,OAAAA,GAAmC,EAAC,EAAG;AAC9D,IAAA,KAAA,EAAK;AAEL,IAAA,IAAA,CAAKD,GAAAA,GAAMA,GAAAA;AACX,IAAA,IAAA,CAAKS,YAAAA,GAAe,EAAA;AACpB,IAAA,IAAA,CAAKR,OAAAA,GAAU;AACbW,MAAAA,iBAAAA,EAAmBX,QAAQW,iBAAAA,IAAqB,CAAA;AAChDC,MAAAA,iBAAAA,EAAmBZ,QAAQY,iBAAAA,IAAqB,GAAA;AAChDC,MAAAA,iBAAAA,EAAmBb,QAAQa,iBAAAA,IAAqB,GAAA;AAChDC,MAAAA,iBAAAA,EAAmBd,QAAQc,iBAAAA,IAAqB,GAAA;AAChDC,MAAAA,iBAAAA,EAAmBf,OAAAA,CAAQe,iBAAAA;AAC3Bd,MAAAA,mBAAAA,EAAqBD,OAAAA,CAAQC,mBAAAA;AAC7Be,MAAAA,iBAAAA,EAAmBhB,QAAQgB,iBAAAA,IAAqB;AAClD,KAAA;AAGA,IAAA,IAAIhB,QAAQC,mBAAAA,EAAqB;AAC/B,MAAA,IAAA,CAAKA,sBAAsBD,OAAAA,CAAQC,mBAAAA;IACrC,CAAA,MAAA,IAAW,IAAA,CAAKD,QAAQe,iBAAAA,EAAmB;AACzC,MAAA,IAAA,CAAKd,mBAAAA,GAAsB,IAAItE,wBAAAA,CAC7B,IAAA,CAAKqE,QAAQe,iBAAiB,CAAA;AAElC,IAAA;AACF,EAAA;AAEA,EAAA,MAAME,OAAAA,GAAyB;AAC7B,IAAA,OAAO,IAAIC,OAAAA,CAAQ,CAACnE,OAAAA,EAASoE,MAAAA,KAAAA;AAC3B,MAAA,IAAI,KAAKjB,WAAAA,EAAa;AACpBnD,QAAAA,OAAAA,EAAAA;AACA,QAAA;AACF,MAAA;AAEA,MAAA,MAAMqE,OAAAA,GAAUC,WAAW,MAAA;AACzBF,QAAAA,MAAAA,CAAO,IAAI7E,KAAAA,CAAM,oBAAA,CAAA,CAAA;MACnB,CAAA,EAAG,IAAA,CAAK0D,QAAQa,iBAAiB,CAAA;AAEjC,MAAA,IAAA,CAAKf,EAAAA,GAAK,IAAIJ,aAAAA,CAAc,IAAA,CAAKK,GAAG,CAAA;AAGpC,MAAA,IAAIR,QAAAA,EAAU;AAEZ,QAAA,IAAA,CAAKO,EAAAA,CAAGwB,SAAS,MAAA;AACfC,UAAAA,YAAAA,CAAaH,OAAAA,CAAAA;AACb,UAAA,IAAA,CAAKlB,WAAAA,GAAc,IAAA;AACnB,UAAA,IAAA,CAAKsB,KAAK,WAAA,CAAA;AACVzE,UAAAA,OAAAA,EAAAA;AACF,QAAA,CAAA;AAEA,QAAA,IAAA,CAAK+C,EAAAA,CAAG2B,OAAAA,GAAU,CAACC,MAAAA,KAAAA;AACjBH,UAAAA,YAAAA,CAAaH,OAAAA,CAAAA;AACb,UAAA,IAAA,CAAKI,IAAAA,CAAK,OAAA,EAAS,IAAIlF,KAAAA,CAAM,iBAAA,CAAA,CAAA;AAC7B6E,UAAAA,MAAAA,CAAO,IAAI7E,KAAAA,CAAM,iBAAA,CAAA,CAAA;AACnB,QAAA,CAAA;AAEA,QAAA,IAAA,CAAKwD,EAAAA,CAAG6B,SAAAA,GAAY,CAACC,KAAAA,KAAAA;AACnB,UAAA,IAAA,CAAKC,aAAAA,CAAcD,MAAME,IAAI,CAAA;AAC/B,QAAA,CAAA;AAEA,QAAA,IAAA,CAAKhC,EAAAA,CAAGiC,UAAU,MAAA;AAChB,UAAA,IAAA,CAAK7B,WAAAA,GAAc,KAAA;AACnB,UAAA,IAAA,CAAKsB,KAAK,cAAA,CAAA;AACV,UAAA,IAAA,CAAKQ,OAAAA,EAAO;AACd,QAAA,CAAA;MACF,CAAA,MAAO;AAEL,QAAA,IAAA,CAAKlC,EAAAA,CAAGmC,EAAAA,CAAG,MAAA,EAAQ,MAAA;AACjBV,UAAAA,YAAAA,CAAaH,OAAAA,CAAAA;AACb,UAAA,IAAA,CAAKlB,WAAAA,GAAc,IAAA;AACnB,UAAA,IAAA,CAAKsB,KAAK,WAAA,CAAA;AACVzE,UAAAA,OAAAA,EAAAA;QACF,CAAA,CAAA;AAEA,QAAA,IAAA,CAAK+C,EAAAA,CAAGmC,EAAAA,CAAG,OAAA,EAAS,CAAC5F,KAAAA,KAAAA;AACnBkF,UAAAA,YAAAA,CAAaH,OAAAA,CAAAA;AACb,UAAA,IAAA,CAAKI,IAAAA,CAAK,SAASnF,KAAAA,CAAAA;AACnB8E,UAAAA,MAAAA,CAAO9E,KAAAA,CAAAA;QACT,CAAA,CAAA;AAEA,QAAA,IAAA,CAAKyD,EAAAA,CAAGmC,EAAAA,CAAG,SAAA,EAAW,CAACH,IAAAA,KAAAA;AACrB,UAAA,IAAA,CAAKD,aAAAA,CAAcC,IAAAA,CAAKI,QAAAA,EAAQ,CAAA;QAClC,CAAA,CAAA;AAEA,QAAA,IAAA,CAAKpC,EAAAA,CAAGmC,EAAAA,CAAG,OAAA,EAAS,MAAA;AAClB,UAAA,IAAA,CAAK/B,WAAAA,GAAc,KAAA;AACnB,UAAA,IAAA,CAAKsB,KAAK,cAAA,CAAA;AACV,UAAA,IAAA,CAAKQ,OAAAA,EAAO;QACd,CAAA,CAAA;AACF,MAAA;IACF,CAAA,CAAA;AACF,EAAA;EAEAG,UAAAA,GAAmB;AACjB,IAAA,IAAI,KAAKrC,EAAAA,EAAI;AACX,MAAA,IAAA,CAAKA,GAAGsC,KAAAA,EAAK;AACb,MAAA,IAAA,CAAKtC,EAAAA,GAAK,IAAA;AACZ,IAAA;AACA,IAAA,IAAA,CAAKkC,OAAAA,EAAO;AACd,EAAA;EAEQA,OAAAA,GAAgB;AAEtB,IAAA,KAAA,MAAW,GAAGK,OAAAA,CAAAA,IAAY,KAAKjC,eAAAA,EAAiB;AAC9CmB,MAAAA,YAAAA,CAAac,QAAQjB,OAAO,CAAA;AAC5BiB,MAAAA,OAAAA,CAAQlB,MAAAA,CAAO,IAAI7E,KAAAA,CAAM,mBAAA,CAAA,CAAA;AAC3B,IAAA;AACA,IAAA,IAAA,CAAK8D,gBAAgBkC,KAAAA,EAAK;AAG1B,IAAA,IAAI,KAAKhC,YAAAA,EAAc;AACrB,MAAA,IAAA,CAAKA,YAAAA,CAAaiC,KAAK,CAAA,CAAA;AACvB,MAAA,IAAA,CAAKjC,YAAAA,GAAe,IAAA;AACtB,IAAA;AACA,IAAA,IAAI,KAAKC,gBAAAA,EAAkB;AACzB,MAAA,IAAA,CAAKA,gBAAAA,CAAiBgC,KAAK,CAAA,CAAA;AAC3B,MAAA,IAAA,CAAKhC,gBAAAA,GAAmB,IAAA;AAC1B,IAAA;AACA,IAAA,IAAI,KAAKE,cAAAA,EAAgB;AACvB,MAAA,IAAA,CAAKA,cAAAA,CAAe8B,KAAK,CAAA,CAAA;AACzB,MAAA,IAAA,CAAK9B,cAAAA,GAAiB,IAAA;AACxB,IAAA;AAGA,IAAA,IAAA,CAAKD,YAAAA,GAAe,EAAA;AAGpB,IAAA,IAAA,CAAKE,kBAAAA,GAAqB,IAAA;AAC5B,EAAA;;;;;;;AAQA,EAAA,MAAM8B,kBAAAA,GAGH;AAED,IAAA,IAAI,CAAC,IAAA,CAAKtC,WAAAA,IAAe,CAAC,KAAKJ,EAAAA,EAAI;AACjC,MAAA,MAAM,KAAKmB,OAAAA,EAAO;AACpB,IAAA;AAGA,IAAA,IAAI,CAAC,IAAA,CAAKX,YAAAA,IAAgB,CAAC,KAAKE,YAAAA,EAAc;AAC5C,MAAA,MAAM,KAAKiC,SAAAA,EAAS;AACtB,IAAA;AAGA,IAAA,IACE,IAAA,CAAKxC,uBACL,CAAC,IAAA,CAAKD,QAAQgB,iBAAAA,IACd,CAAC,KAAKN,kBAAAA,EACN;AACA,MAAA,MAAM,IAAIpE,MACR,mEAAA,CAAA;AAEJ,IAAA;AAGA,IAAA,IAAI,KAAKoE,kBAAAA,EAAoB;AAC3B,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,CAAKA,kBAAAA;AACb,MAAA,CAAA,CAAA,OAASrE,KAAAA,EAAO;AAGd,QAAA,IAAA,CAAK8F,UAAAA,EAAU;AACf,QAAA,MAAM9F,KAAAA;AACR,MAAA;AACF,IAAA;AAGA,IAAA,IAAI,CAAC,IAAA,CAAKiE,YAAAA,IAAgB,CAAC,KAAKE,YAAAA,EAAc;AAC5C,MAAA,MAAM,IAAIlE,MAAM,8CAAA,CAAA;AAClB,IAAA;AAEA,IAAA,OAAO;AACLgE,MAAAA,YAAAA,EAAc,IAAA,CAAKA,YAAAA;AACnBE,MAAAA,YAAAA,EAAc,IAAA,CAAKA;AACrB,KAAA;AACF,EAAA;AAEQqB,EAAAA,aAAAA,CAAcC,IAAAA,EAAoB;AACxC,IAAA,IAAI;AAEF,MAAA,MAAMY,MAAAA,GAASC,IAAAA,CAAKC,KAAAA,CAAMd,IAAAA,CAAAA;AAC1B,MAAA,MAAMe,YAAYH,MAAAA,CAAOG,SAAAA;AAGzB,MAAA,IAAIA,SAAAA,EAAW;AACb,QAAA,OAAOH,MAAAA,CAAOG,SAAAA;AAChB,MAAA;AAGA,MAAA,MAAMtG,UAAU,IAAA,CAAKuG,kBAAAA,CAAmBH,IAAAA,CAAKI,SAAAA,CAAUL,MAAAA,CAAAA,CAAAA;AAGvD,MAAA,IAAIG,SAAAA,IAAa,IAAA,CAAKzC,eAAAA,CAAgB4C,GAAAA,CAAIH,SAAAA,CAAAA,EAAY;AACpD,QAAA,MAAMR,OAAAA,GAAU,IAAA,CAAKjC,eAAAA,CAAgB6C,GAAAA,CAAIJ,SAAAA,CAAAA;AACzC,QAAA,IAAA,CAAKzC,eAAAA,CAAgB8C,OAAOL,SAAAA,CAAAA;AAC5BtB,QAAAA,YAAAA,CAAac,QAAQjB,OAAO,CAAA;AAG5B,QAAA,IAAI7E,OAAAA,CAAQ4G,SAAS,OAAA,EAAS;AAE5B,UAAA,MAAMC,QAAAA,GAAW7G,OAAAA;AACjB8F,UAAAA,OAAAA,CAAQlB,OAAO,IAAI7E,KAAAA,CAAM8G,QAAAA,CAAS/G,KAAAA,CAAME,OAAO,CAAA,CAAA;AACjD,QAAA,CAAA,MAAA,IAAWA,OAAAA,CAAQ4G,IAAAA,CAAKE,QAAAA,CAAS,WAAA,CAAA,EAAc;AAE7C,UAAA,MAAMC,YAAAA,GAAgB/G,OAAAA,CAAgBgH,OAAAA,GACjChH,OAAAA,CAAgBgH,SAAO,GACxBhH,OAAAA;AACJ,UAAA,IAAI+G,aAAajH,KAAAA,EAAO;AACtBgG,YAAAA,OAAAA,CAAQlB,OAAO,IAAI7E,KAAAA,CAAMgH,YAAAA,CAAajH,KAAAA,CAAME,OAAO,CAAA,CAAA;UACrD,CAAA,MAAO;AACL8F,YAAAA,OAAAA,CAAQtF,QAAQR,OAAAA,CAAAA;AAClB,UAAA;QACF,CAAA,MAAO;AACL8F,UAAAA,OAAAA,CAAQtF,QAAQR,OAAAA,CAAAA;AAClB,QAAA;AACA,QAAA;AACF,MAAA;AAEA,MAAA,IAAA,CAAKiF,IAAAA,CAAK,WAAWjF,OAAAA,CAAAA;AACvB,IAAA,CAAA,CAAA,OAASF,KAAAA,EAAO;AACd,MAAA,IAAA,CAAKmF,KAAK,OAAA,EAAS,IAAIlF,MAAM,CAAA,yBAAA,EAA4BD,KAAAA,EAAO,CAAA,CAAA;AAClE,IAAA;AACF,EAAA;AAEQmH,EAAAA,WAAAA,CAAejH,OAAAA,EAA0B;AAC/C,IAAA,OAAO,IAAI2E,OAAAA,CAAQ,CAACnE,OAAAA,EAASoE,MAAAA,KAAAA;AAC3B,MAAA,IAAI,CAAC,IAAA,CAAKjB,WAAAA,IAAe,CAAC,KAAKJ,EAAAA,EAAI;AACjCqB,QAAAA,MAAAA,CAAO,IAAI7E,KAAAA,CAAM,eAAA,CAAA,CAAA;AACjB,QAAA;AACF,MAAA;AAEA,MAAA,MAAMuG,SAAAA,GAAY,OAAO,EAAE,IAAA,CAAK1C,SAAS,CAAA,CAAA,EAAIlC,IAAAA,CAAKC,KAAG,CAAA,CAAA;AAErD,MAAA,MAAMuF,aAAAA,GAAgBlH,OAAAA;AACtBkH,MAAAA,aAAAA,CAAcZ,SAAAA,GAAYA,SAAAA;AAE1B,MAAA,MAAMzB,OAAAA,GAAUC,WAAW,MAAA;AACzB,QAAA,IAAA,CAAKjB,eAAAA,CAAgB8C,OAAOL,SAAAA,CAAAA;AAC5B1B,QAAAA,MAAAA,CAAO,IAAI7E,KAAAA,CAAM,iBAAA,CAAA,CAAA;AACnB,MAAA,CAAA,EAAG,GAAA,CAAA;AAEH,MAAA,IAAA,CAAK8D,eAAAA,CAAgBsD,IAAIb,SAAAA,EAAW;AAAE9F,QAAAA,OAAAA;AAASoE,QAAAA,MAAAA;AAAQC,QAAAA;OAAQ,CAAA;AAE/D,MAAA,IAAI;AAEF,QAAA,MAAMuC,iBAAAA,GAAoB,IAAA,CAAKC,gBAAAA,CAAiBH,aAAAA,CAAAA;AAChD,QAAA,IAAA,CAAK3D,EAAAA,CAAG+D,KAAKF,iBAAAA,CAAAA;AACf,MAAA,CAAA,CAAA,OAAStH,KAAAA,EAAO;AACd,QAAA,IAAA,CAAK+D,eAAAA,CAAgB8C,OAAOL,SAAAA,CAAAA;AAC5BtB,QAAAA,YAAAA,CAAaH,OAAAA,CAAAA;AACbD,QAAAA,MAAAA,CAAO9E,KAAAA,CAAAA;AACT,MAAA;IACF,CAAA,CAAA;AACF,EAAA;AAEQuH,EAAAA,gBAAAA,CAAiBrH,OAAAA,EAAsB;AAC7C,IAAA,IAAI;AAEF,MAAA,IAAIA,OAAAA,IAAW,OAAOA,OAAAA,CAAQuH,MAAAA,KAAW,UAAA,EAAY;AACnD,QAAA,MAAMC,OAAAA,GAAUxH,QAAQuH,MAAAA,EAAM;AAE9B,QAAA,IAAIvH,QAAQsG,SAAAA,EAAW;AACrBkB,UAAAA,OAAAA,CAAQlB,YAAYtG,OAAAA,CAAQsG,SAAAA;AAC9B,QAAA;AACA,QAAA,OAAOF,IAAAA,CAAKI,UAAUgB,OAAAA,CAAAA;AACxB,MAAA;AAGA,MAAA,OAAOpB,IAAAA,CAAKI,UAAUxG,OAAAA,CAAAA;AACxB,IAAA,CAAA,CAAA,OAASF,KAAAA,EAAO;AACd,MAAA,MAAM,IAAIC,KAAAA,CACR,CAAA,6BAAA,EACED,KAAAA,YAAiBC,KAAAA,GAAQD,MAAME,OAAAA,GAAUiC,MAAAA,CAAOnC,KAAAA,CAAAA,CAAAA,CAChD,CAAA;AAEN,IAAA;AACF,EAAA;AAEQyG,EAAAA,kBAAAA,CAAmBhB,IAAAA,EAAmB;AAC5C,IAAA,IAAI;AACF,MAAA,MAAMY,MAAAA,GAASC,IAAAA,CAAKC,KAAAA,CAAMd,IAAAA,CAAAA;AAG1B,MAAA,IAAI,CAACkC,gCAAAA,EAAiB;AACpB,QAAA,MAAM,IAAI1H,MAAM,8BAAA,CAAA;AAClB,MAAA;AAEA,MAAA,IAAI,OAAO0H,gCAAAA,CAAgBzF,MAAAA,KAAW,UAAA,EAAY;AAChD,QAAA,MAAM,IAAIjC,MAAM,0CAAA,CAAA;AAClB,MAAA;AAGA,MAAA,MAAM2H,MAAAA,GAASD,gCAAAA,CAAgBzF,MAAAA,CAAOmE,MAAAA,CAAAA;AACtC,MAAA,IAAIwB,WAAAA,CAAOC,MAAAA,CAAOF,MAAAA,CAAAA,EAAS;AAEzB,QAAA,OAAOvB,MAAAA;AACT,MAAA;AAEA,MAAA,OAAOuB,MAAAA,CAAOG,KAAAA;AAChB,IAAA,CAAA,CAAA,OAAS/H,KAAAA,EAAO;AACd,MAAA,MAAM,IAAIC,KAAAA,CACR,CAAA,+BAAA,EACED,KAAAA,YAAiBC,KAAAA,GAAQD,MAAME,OAAAA,GAAUiC,MAAAA,CAAOnC,KAAAA,CAAAA,CAAAA,CAChD,CAAA;AAEN,IAAA;AACF,EAAA;AAEA,EAAA,MAAMoG,UAAU4B,YAAAA,EAA2C;AAEzD,IAAA,MAAM,EAAEC,gBAAAA,EAAkB/D,gBAAAA,EAAgB,GAAKgE,wCAAAA,EAAAA;AAG/C,IAAA,IAAA,CAAKhE,gBAAAA,GAAmBA,gBAAAA;AAGxB,IAAA,MAAMiE,UAAAA,GAAaC,qBAAY,EAAA,CAAA;AAG/B,IAAA,IAAA,CAAKhE,cAAAA,GAAiB+D,UAAAA;AAEtB,IAAA,MAAMnC,OAAAA,GAAU,IAAIqC,0CAAAA,CAA0B;MAC5CC,SAAAA,EAAWL,gBAAAA;MACXhH,KAAAA,EAAOkH,UAAAA;AACPH,MAAAA;KACF,CAAA;AAEA,IAAA,MAAMO,QAAAA,GAAW,MAAM,IAAA,CAAKpB,WAAAA,CAAiBnB,OAAAA,CAAAA;AAG7C,IAAA,MAAMiB,YAAAA,GAAesB,SAASrB,OAAAA,EAAO;AACrC,IAAA,IACED,YAAAA,CAAauB,wBAAAA,IACbvB,YAAAA,CAAa9C,YAAAA,IACb,KAAKD,gBAAAA,EACL;AAEA,MAAA,IAAA,CAAKC,eAAe8C,YAAAA,CAAa9C,YAAAA;AAGjC,MAAA,MAAMsE,UAAAA,GAAaC,mBAAAA,CAAWzB,YAAAA,CAAauB,wBAAwB,CAAA;AAGnE,MAAA,IAAA,CAAKvE,YAAAA,GAAe0E,oCAAAA,CAClB,IAAA,CAAKzE,gBAAAA,EACLuE,UAAAA,CAAAA;AAEJ,IAAA;AAGA,IAAA,IACE,IAAA,CAAK7E,uBACLqD,YAAAA,CAAa2B,cAAAA,IACb3B,aAAauB,wBAAAA,IACb,CAAC,IAAA,CAAK7E,OAAAA,CAAQgB,iBAAAA,EACd;AAEA,MAAA,MAAM8D,UAAAA,GAAaC,mBAAAA,CAAWzB,YAAAA,CAAauB,wBAAwB,CAAA;AAGnE,MAAA,IAAA,CAAKnE,kBAAAA,GAAqB,IAAA,CAAKwE,yBAAAA,CAC7B5B,YAAAA,CAAa2B,gBACbH,UAAAA,CAAAA;AAEJ,IAAA;AAEA,IAAA,OAAOF,QAAAA;AACT,EAAA;AAEA,EAAA,MAAMO,YAAYC,MAAAA,EAaD;AAEf,IAAA,MAAM,EAAE9E,YAAAA,EAAcE,YAAAA,EAAY,GAAK,MAAM,KAAKgC,kBAAAA,EAAkB;AAGpE,IAAA,IAAI6C,aAAAA;AACJ,IAAA,IAAI,OAAOD,MAAAA,CAAO7I,OAAAA,KAAY,QAAA,EAAU;AAEtC,MAAA,MAAM+I,QAAAA,GAAWF,MAAAA,CAAO7I,OAAAA,CAAQgJ,UAAAA,CAAW,IAAA,CAAA,GACvCH,MAAAA,CAAO7I,OAAAA,CAAQiJ,KAAAA,CAAM,CAAA,CAAA,GACrBJ,MAAAA,CAAO7I,OAAAA;AACX8I,MAAAA,aAAAA,GAAgBN,oBAAWO,QAAAA,CAAAA;IAC7B,CAAA,MAAO;AAELD,MAAAA,aAAAA,GAAgBD,MAAAA,CAAO7I,OAAAA;AACzB,IAAA;AAGA,IAAA,MAAMkJ,iBAAAA,GAAoB,MAAMC,gCAAAA,CAC9BN,MAAAA,CAAOO,UACPrF,YAAAA,EACAE,YAAAA,EACA4E,OAAOQ,WAAW,CAAA;AAGpB,IAAA,MAAMvD,OAAAA,GAAU,IAAIwD,4CAAAA,CAA4B;AAC9CC,MAAAA,WAAAA,EAAaV,MAAAA,CAAOU,WAAAA;AACpBF,MAAAA,WAAAA,EAAaR,MAAAA,CAAOQ,WAAAA;AACpBG,MAAAA,QAAAA,EAAUX,MAAAA,CAAOW,QAAAA;AACjBC,MAAAA,cAAAA,EAAgBZ,MAAAA,CAAOY,cAAAA;AACvBC,MAAAA,KAAAA,EAAOb,MAAAA,CAAOa,KAAAA;MACdN,QAAAA,EAAUF,iBAAAA;MACVlJ,OAAAA,EAAS8I,aAAAA;AACTa,MAAAA,QAAAA,EAAUd,MAAAA,CAAOc,QAAAA;AACjB7B,MAAAA,YAAAA,EAAce,MAAAA,CAAOf,YAAAA;AACrB8B,MAAAA,MAAAA,EAAQf,MAAAA,CAAOe,MAAAA;AACfC,MAAAA,QAAAA,EAAUhB,MAAAA,CAAOgB,QAAAA;AACjBC,MAAAA,aAAAA,EAAejB,MAAAA,CAAOiB;KACxB,CAAA;AAEA,IAAA,OAAO,IAAA,CAAK7C,YAAiBnB,OAAAA,CAAAA;AAC/B,EAAA;;;;;AAMA,EAAA,MAAMiE,OAAOlB,MAAAA,EAW4C;AAEvD,IAAA,IAAIA,MAAAA,CAAOQ,WAAAA,KAAgBW,qBAAAA,CAAiBC,OAAAA,EAAS;AACnD,MAAA,MAAM,IAAIlK,MACR,4FAAA,CAAA;AAEJ,IAAA;AAGA,IAAA,MAAM,EAAEgE,YAAAA,EAAcE,YAAAA,EAAY,GAAK,MAAM,KAAKgC,kBAAAA,EAAkB;AAGpE,IAAA,MAAMiE,mBAAAA,GAAsBC,kCAAAA,CAC1BtB,MAAAA,CAAOuB,UAAAA,EACPrG,cACAE,YAAAA,CAAAA;AAKF,IAAA,MAAM6B,OAAAA,GAAU,IAAIuE,uCAAAA,CAAuB;AACzCd,MAAAA,WAAAA,EAAaV,MAAAA,CAAOU,WAAAA;AACpBF,MAAAA,WAAAA,EAAaR,MAAAA,CAAOQ,WAAAA;AACpBM,MAAAA,QAAAA,EAAUd,MAAAA,CAAOc,QAAAA;AACjBW,MAAAA,UAAAA,EAAYzB,MAAAA,CAAOyB,UAAAA;AACnBC,MAAAA,SAAAA,EAAW1B,MAAAA,CAAO0B,SAAAA;MAClBH,UAAAA,EAAYF,mBAAAA;AACZM,MAAAA,SAAAA,EAAW3B,MAAAA,CAAO2B,SAAAA;AAClB1C,MAAAA,YAAAA,EAAce,MAAAA,CAAOf,YAAAA;AACrB8B,MAAAA,MAAAA,EAAQf,MAAAA,CAAOe,MAAAA;AACfE,MAAAA,aAAAA,EAAejB,MAAAA,CAAOiB;KACxB,CAAA;AAGA,IAAA,MAAMzB,QAAAA,GAAW,MAAM,IAAA,CAAKpB,WAAAA,CAAiBnB,OAAAA,CAAAA;AAC7C,IAAA,MAAMiB,YAAAA,GAAesB,SAASrB,OAAAA,EAAO;AAGrC,IAAA,MAAMyD,YAAAA,GAAeC,oCAAAA,CACnB3D,YAAAA,CAAa0D,YAAAA,EACb1G,cACAE,YAAAA,CAAAA;AAGF,IAAA,OAAOwG,YAAAA;AACT,EAAA;;;;;AAMA,EAAA,MAAME,WAAW9B,MAAAA,EAUwC;AAEvD,IAAA,MAAM,EAAE9E,YAAAA,EAAcE,YAAAA,EAAY,GAAK,MAAM,KAAKgC,kBAAAA,EAAkB;AAGpE,IAAA,MAAMiE,mBAAAA,GAAsBC,kCAAAA,CAC1BtB,MAAAA,CAAOuB,UAAAA,EACPrG,cACAE,YAAAA,CAAAA;AAIF,IAAA,MAAM6B,OAAAA,GAAU,IAAI8E,2CAAAA,CAA2B;AAC7CrB,MAAAA,WAAAA,EAAaV,MAAAA,CAAOU,WAAAA;MACpBF,WAAAA,EAAa,SAAA;AACbM,MAAAA,QAAAA,EAAUd,MAAAA,CAAOc,QAAAA;AACjBW,MAAAA,UAAAA,EAAYzB,MAAAA,CAAOyB,UAAAA;AACnBC,MAAAA,SAAAA,EAAW1B,MAAAA,CAAO0B,SAAAA;MAClBH,UAAAA,EAAYF,mBAAAA;AACZM,MAAAA,SAAAA,EAAW3B,MAAAA,CAAO2B,SAAAA;AAClB1C,MAAAA,YAAAA,EAAce,MAAAA,CAAOf,YAAAA;AACrB8B,MAAAA,MAAAA,EAAQf,MAAAA,CAAOe,MAAAA;AACfE,MAAAA,aAAAA,EAAejB,MAAAA,CAAOiB;KACxB,CAAA;AAGA,IAAA,MAAMzB,QAAAA,GAAW,MAAM,IAAA,CAAKpB,WAAAA,CAAiBnB,OAAAA,CAAAA;AAC7C,IAAA,MAAMiB,YAAAA,GAAesB,SAASrB,OAAAA,EAAO;AAGrC,IAAA,MAAMyD,YAAAA,GAAeC,oCAAAA,CACnB3D,YAAAA,CAAa0D,YAAAA,EACb1G,cACAE,YAAAA,CAAAA;AAGF,IAAA,OAAOwG,YAAAA;AACT,EAAA;AAEA,EAAA,IAAII,SAAAA,GAAqB;AACvB,IAAA,OAAO,IAAA,CAAKlH,WAAAA;AACd,EAAA;;;;;;;;EAUA,MAAcgF,yBAAAA,CACZ9H,sBACA0H,UAAAA,EACe;AACf,IAAA,IAAI,CAAC,KAAK7E,mBAAAA,EAAqB;AAC7B,MAAA;AACF,IAAA;AAEA,IAAA,IAAI;AAEF,MAAA,MAAMoH,aAAAA,GAAgBC,eAAOxC,UAAAA,CAAAA;AAC7B,MAAA,MAAMzH,oBAAoBkK,KAAAA,CAAMnI,IAAAA,CAAKiI,aAAAA,CAAAA,CAClCG,GAAAA,CAAI,CAACC,CAAAA,KAAcA,CAAAA,CAAEvF,QAAAA,CAAS,EAAA,EAAIwF,QAAAA,CAAS,CAAA,EAAG,GAAA,CAAA,CAAA,CAC9CC,KAAK,EAAA,CAAA;AAIR,MAAA,IAAI,CAAC,KAAKlH,cAAAA,EAAgB;AACxB,QAAA,MAAM,IAAInE,MACR,6DAAA,CAAA;AAEJ,MAAA;AAEA,MAAA,MAAM2H,MAAAA,GAAS,MAAM,IAAA,CAAKhE,mBAAAA,CAAoB9C,OAC5CC,oBAAAA,EACAC,iBAAAA,EACA,KAAKoD,cAAc,CAAA;AAGrB,MAAA,IAAI,CAACwD,OAAOnG,KAAAA,EAAO;AACjB,QAAA,MAAMsF,WAAW,CAAA,iCAAA,EAAoCa,MAAAA,CAAOlG,MAAAA,CAAO4J,IAAAA,CACjE,IAAA,CAAA,CAAA,CAAA;AAEF,QAAA,IAAA,CAAKnG,IAAAA,CAAK,OAAA,EAAS,IAAIlF,KAAAA,CAAM8G,QAAAA,CAAAA,CAAAA;AAC7B,QAAA,MAAM,IAAI9G,MAAM8G,QAAAA,CAAAA;AAClB,MAAA;AAGA,MAAA,IAAA,CAAK5B,KAAK,SAAA,EAAW;QACnB2B,IAAAA,EAAM,sBAAA;AACNnF,QAAAA,SAAAA,EAAWC,KAAKC,GAAAA,EAAG;QACnB4D,IAAAA,EAAMmC;OACR,CAAA;AACF,IAAA,CAAA,CAAA,OAAS5H,KAAAA,EAAO;AACd,MAAA,MAAM+G,QAAAA,GAAW,mCACf/G,KAAAA,YAAiBC,KAAAA,GAAQD,MAAME,OAAAA,GAAUiC,MAAAA,CAAOnC,KAAAA,CAAAA,CAAAA,CAAAA;AAElD,MAAA,IAAA,CAAKmF,IAAAA,CAAK,OAAA,EAAS,IAAIlF,KAAAA,CAAM8G,QAAAA,CAAAA,CAAAA;AAC7B,MAAA,MAAM,IAAI9G,MAAM8G,QAAAA,CAAAA;AAClB,IAAA;AACF,EAAA;AACF;ACrqBO,IAAMwE,SAAAA,GAAY;;EAEvBC,iBAAAA,EAAmB,mBAAA;EACnBC,kBAAAA,EAAoB,oBAAA;EACpBC,aAAAA,EAAe,eAAA;;EAEfC,gBAAAA,EAAkB,kBAAA;EAClBC,0BAAAA,EAA4B,4BAAA;EAC5BC,kBAAAA,EAAoB,oBAAA;EACpBC,wBAAAA,EAA0B,0BAAA;EAC1BC,8BAAAA,EAAgC,gCAAA;EAChCC,0BAAAA,EAA4B,4BAAA;EAC5BC,yBAAAA,EAA2B,2BAAA;EAC3BC,4BAAAA,EAA8B,8BAAA;EAC9BC,eAAAA,EAAiB,iBAAA;EACjBC,gBAAAA,EAAkB,kBAAA;EAClBC,YAAAA,EAAc,cAAA;EACdC,oBAAAA,EAAsB,sBAAA;;EAEtBC,wBAAAA,EAA0B,0BAAA;EAC1BC,qBAAAA,EAAuB;AACzB;AAQO,IAAMC,oBAAAA,GAAuB;;AAElCC,EAAAA,MAAAA,EAAQnB,SAAAA,CAAUM,kBAAAA;;AAElBc,EAAAA,YAAAA,EAAcpB,SAAAA,CAAUO,wBAAAA;;AAExBc,EAAAA,kBAAAA,EAAoBrB,SAAAA,CAAUQ,8BAAAA;;AAE9Bc,EAAAA,cAAAA,EAAgBtB,SAAAA,CAAUS,0BAAAA;;AAE1Bc,EAAAA,aAAAA,EAAevB,SAAAA,CAAUU,yBAAAA;;AAEzBc,EAAAA,gBAAAA,EAAkBxB,SAAAA,CAAUW;AAC9B;AAOO,IAAMc,mBAAAA,GAAsB;EACjCC,SAAAA,EAAW,WAAA;EACXC,OAAAA,EAAS,SAAA;EACTC,MAAAA,EAAQ;AACV;AAWO,IAAeC,eAAAA,GAAf,cAAuCnN,KAAAA,CAAAA;EAzE9C;;;AA0EkBoN,EAAAA,IAAAA;AACAvG,EAAAA,IAAAA;AACAwG,EAAAA,OAAAA;EAEhB,WAAA,CACEpN,OAAAA,EACAmN,IAAAA,EACAvG,IAAAA,EACAwG,OAAAA,EACA;AACA,IAAA,KAAA,CAAMpN,OAAAA,CAAAA;AACN,IAAA,IAAA,CAAKqN,IAAAA,GAAO,KAAK,WAAA,CAAYA,IAAAA;AAC7B,IAAA,IAAA,CAAKF,IAAAA,GAAOA,IAAAA;AACZ,IAAA,IAAA,CAAKvG,IAAAA,GAAOA,IAAAA;AACZ,IAAA,IAAA,CAAKwG,OAAAA,GAAUA,OAAAA;AACfE,IAAAA,MAAAA,CAAOC,cAAAA,CAAe,IAAA,EAAM,GAAA,CAAA,MAAA,CAAWC,SAAS,CAAA;AAClD,EAAA;EAEAC,MAAAA,GAAkC;AAChC,IAAA,OAAO;AACLJ,MAAAA,IAAAA,EAAM,IAAA,CAAKA,IAAAA;AACXrN,MAAAA,OAAAA,EAAS,IAAA,CAAKA,OAAAA;AACdmN,MAAAA,IAAAA,EAAM,IAAA,CAAKA,IAAAA;AACXvG,MAAAA,IAAAA,EAAM,IAAA,CAAKA,IAAAA;AACX8G,MAAAA,KAAAA,EAAO,IAAA,CAAKA,KAAAA;AACZN,MAAAA,OAAAA,EAAS,IAAA,CAAKA;AAChB,KAAA;AACF,EAAA;AACF;AAKO,IAAeO,cAAAA,GAAf,cAAsCT,eAAAA,CAAAA;EA3G7C;;;EA4GE,WAAA,CACElN,OAAAA,EACAmN,MACAC,OAAAA,EACA;AACA,IAAA,KAAA,CAAMpN,OAAAA,EAASmN,IAAAA,EAAML,mBAAAA,CAAoBC,SAAAA,EAAWK,OAAAA,CAAAA;AACtD,EAAA;AACF;AAGO,IAAeQ,YAAAA,GAAf,cAAoCV,eAAAA,CAAAA;EAtH3C;;;EAuHE,WAAA,CACElN,OAAAA,EACAmN,MACAC,OAAAA,EACA;AACA,IAAA,KAAA,CAAMpN,OAAAA,EAASmN,IAAAA,EAAML,mBAAAA,CAAoBE,OAAAA,EAASI,OAAAA,CAAAA;AACpD,EAAA;AACF;AAGO,IAAeS,WAAAA,GAAf,cAAmCX,eAAAA,CAAAA;EAjI1C;;;EAkIE,WAAA,CACElN,OAAAA,EACAmN,MACAC,OAAAA,EACA;AACA,IAAA,KAAA,CAAMpN,OAAAA,EAASmN,IAAAA,EAAML,mBAAAA,CAAoBG,MAAAA,EAAQG,OAAAA,CAAAA;AACnD,EAAA;AACF;AAIO,IAAMU,wBAAAA,GAAN,cAAuCH,cAAAA,CAAAA;EA7I9C;;;AA8IE,EAAA,WAAA,CAAYP,OAAAA,EAAmC;AAC7C,IAAA,KAAA,CAAM,6BAAA,EAA+B/B,SAAAA,CAAUC,iBAAAA,EAAmB8B,OAAAA,CAAAA;AACpE,EAAA;AACF;AAEO,IAAMW,+BAAAA,GAAN,cAA8CJ,cAAAA,CAAAA;EAnJrD;;;AAoJE,EAAA,WAAA,CAAYP,OAAAA,EAAmC;AAC7C,IAAA,KAAA,CACE,gCAAA,EACA/B,SAAAA,CAAUE,kBAAAA,EACV6B,OAAAA,CAAAA;AAEJ,EAAA;AACF;AAEO,IAAMY,0BAAAA,GAAN,cAAyCL,cAAAA,CAAAA;EA7JhD;;;AA8JE,EAAA,WAAA,CAAYP,OAAAA,EAAmC;AAC7C,IAAA,KAAA,CAAM,4BAAA,EAA8B/B,SAAAA,CAAUG,aAAAA,EAAe4B,OAAAA,CAAAA;AAC/D,EAAA;AACF;AAIO,IAAMa,qBAAAA,GAAN,cAAoCL,YAAAA,CAAAA;EArK3C;;;AAsKE,EAAA,WAAA,CAAYM,QAAgBd,OAAAA,EAAmC;AAC7D,IAAA,KAAA,CACE,CAAA,6BAAA,EAAgCc,MAAAA,CAAAA,CAAAA,EAChC7C,SAAAA,CAAUI,gBAAAA,EACV;AAAEyC,MAAAA,MAAAA;MAAQ,GAAGd;KAAQ,CAAA;AAEzB,EAAA;AACF;AAEO,IAAMe,oCAAAA,GAAN,cAAmDP,YAAAA,CAAAA;EA/K1D;;;AAgLE,EAAA,WAAA,CAAYR,OAAAA,EAAmC;AAC7C,IAAA,KAAA,CACE,8CAAA,EACA/B,SAAAA,CAAUK,0BAAAA,EACV0B,OAAAA,CAAAA;AAEJ,EAAA;AACF;AAOO,IAAMgB,uBAAAA,GAAN,cAAsCR,YAAAA,CAAAA;EA9L7C;;;AA+LkBS,EAAAA,KAAAA;AAEhB,EAAA,WAAA,CACErO,UAAkB,iCAAA,EAClBmN,IAAAA,GAAkB9B,SAAAA,CAAUM,kBAAAA,EAC5ByB,SACAiB,KAAAA,EACA;AACA,IAAA,KAAA,CAAMrO,OAAAA,EAASmN,MAAMC,OAAAA,CAAAA;AACrB,IAAA,IAAIiB,UAAUzO,MAAAA,EAAW;AACvB,MAAA,IAAA,CAAKyO,KAAAA,GAAQA,KAAAA;AACf,IAAA;AACF,EAAA;AACF;AAEO,IAAMC,0BAAAA,GAAN,cAAyCV,YAAAA,CAAAA;EA9MhD;;;AA+ME,EAAA,WAAA,CAAYR,OAAAA,EAAmC;AAC7C,IAAA,KAAA,CACE,+CAAA,EACA/B,SAAAA,CAAUY,eAAAA,EACVmB,OAAAA,CAAAA;AAEJ,EAAA;AACF;AAEO,IAAMmB,oBAAAA,GAAN,cAAmCX,YAAAA,CAAAA;EAxN1C;;;AAyNE,EAAA,WAAA,CAAYR,OAAAA,EAAmC;AAC7C,IAAA,KAAA,CAAM,2BAAA,EAA6B/B,SAAAA,CAAUa,gBAAAA,EAAkBkB,OAAAA,CAAAA;AACjE,EAAA;AACF;AAEO,IAAMoB,kBAAAA,GAAN,cAAiCZ,YAAAA,CAAAA;EA9NxC;;;AA+NE,EAAA,WAAA,CAAYM,QAAgBd,OAAAA,EAAmC;AAC7D,IAAA,KAAA,CACE,CAAA,mCAAA,EAAsCc,MAAAA,CAAAA,CAAAA,EACtC7C,SAAAA,CAAUc,YAAAA,EACV;AAAE+B,MAAAA,MAAAA;MAAQ,GAAGd;KAAQ,CAAA;AAEzB,EAAA;AACF;AAEO,IAAMqB,wBAAAA,GAAN,cAAuCb,YAAAA,CAAAA;EAxO9C;;;AAyOE,EAAA,WAAA,CAAYR,OAAAA,EAAmC;AAC7C,IAAA,KAAA,CACE,gCAAA,EACA/B,SAAAA,CAAUe,oBAAAA,EACVgB,OAAAA,CAAAA;AAEJ,EAAA;AACF;AAOO,IAAMsB,kBAAAA,GAAN,cAAiCd,YAAAA,CAAAA;EAvPxC;;;;AAwPE,EAAA,WAAA,CACkBe,aAChBvB,OAAAA,EACA;AACA,IAAA,KAAA,CAAMuB,YAAY3O,OAAAA,EAASqL,SAAAA,CAAUc,cAAciB,OAAAA,CAAAA,EAAAA,KAHnCuB,WAAAA,GAAAA,WAAAA;AAIlB,EAAA;AACF;AAIO,IAAMC,+BAAAA,GAAN,cAA8Cf,WAAAA,CAAAA;EAlQrD;;;AAmQE,EAAA,WAAA,CAAYT,OAAAA,EAAmC;AAC7C,IAAA,KAAA,CACE,oCAAA,EACA/B,SAAAA,CAAUiB,qBAAAA,EACVc,OAAAA,CAAAA;AAEJ,EAAA;AACF;AAEO,IAAMyB,iCAAAA,GAAN,cAAgDhB,WAAAA,CAAAA;EA5QvD;;;AA6QE,EAAA,WAAA,CAAYT,OAAAA,EAAmC;AAC7C,IAAA,KAAA,CACE,6BAAA,EACA/B,SAAAA,CAAUgB,wBAAAA,EACVe,OAAAA,CAAAA;AAEJ,EAAA;AACF;;;AC5PO,IAAM0B,mBAAAA,GAAN,cAAkCxL,8BAAAA,CAAAA;EAxBzC;;;;EAyBUC,EAAAA,GAAuB,IAAA;EACvBwL,YAAAA,GAAe,KAAA;EACfC,UAAAA,GAAa,KAAA;EACbC,wBAAAA,GAA2B,KAAA;EAC3BC,yBAAAA,GAA4B,CAAA;EAC5BC,eAAAA,GAAwC,IAAA;AAC/B1L,EAAAA,OAAAA;AAGA2L,EAAAA,MAAAA;EAEjB,WAAA,CACmB5L,GAAAA,EACjBC,OAAAA,GAAsC,EAAC,EACvC;AACA,IAAA,KAAA,EAAK,EAAA,KAHYD,GAAAA,GAAAA,GAAAA;AAIjB,IAAA,IAAA,CAAK4L,SAAS3L,OAAAA,CAAQ2L,MAAAA;AACtB,IAAA,IAAA,CAAK3L,OAAAA,GAAU;AACbW,MAAAA,iBAAAA,EAAmBX,QAAQW,iBAAAA,IAAqB,CAAA;AAChDC,MAAAA,iBAAAA,EAAmBZ,QAAQY,iBAAAA,IAAqB,GAAA;AAChDC,MAAAA,iBAAAA,EAAmBb,QAAQa,iBAAAA,IAAqB;AAClD,KAAA;AACF,EAAA;AAEA,EAAA,IAAIuG,SAAAA,GAAqB;AACvB,IAAA,OAAO,IAAA,CAAKkE,YAAAA;AACd,EAAA;;;;;;AAOA,EAAA,MAAMrK,OAAAA,GAAyB;AAC7B,IAAA,IAAA,CAAKsK,UAAAA,GAAa,KAAA;AAClB,IAAA,IAAI,KAAKD,YAAAA,EAAc;AACvB,IAAA,IAAI,IAAA,CAAKI,eAAAA,EAAiB,OAAO,IAAA,CAAKA,eAAAA;AAEtC,IAAA,IAAA,CAAKA,eAAAA,GAAkB,IAAA,CAAKE,iBAAAA,EAAiB,CAAGC,QAAQ,MAAA;AACtD,MAAA,IAAA,CAAKH,eAAAA,GAAkB,IAAA;IACzB,CAAA,CAAA;AACA,IAAA,OAAO,IAAA,CAAKA,eAAAA;AACd,EAAA;EAEAvJ,UAAAA,GAAmB;AACjB,IAAA,IAAA,CAAKoJ,UAAAA,GAAa,IAAA;AAClB,IAAA,IAAI,KAAKzL,EAAAA,EAAI;AACX,MAAA,IAAA,CAAKA,GAAGsC,KAAAA,EAAK;AACb,MAAA,IAAA,CAAKtC,EAAAA,GAAK,IAAA;AACZ,IAAA;AACA,IAAA,IAAA,CAAKwL,YAAAA,GAAe,KAAA;AACpB,IAAA,IAAA,CAAK9J,IAAAA,CAAK,cAAA,EAAgBsK,mCAAAA,CAAmBC,MAAM,CAAA;AACrD,EAAA;AAEAlI,EAAAA,IAAAA,CAAK/B,IAAAA,EAAoB;AACvB,IAAA,IAAI,CAAC,IAAA,CAAKwJ,YAAAA,IAAgB,CAAC,KAAKxL,EAAAA,EAAI;AAClC,MAAA,MAAM,IAAIyK,0BAAAA,EAAAA;AACZ,IAAA;AACA,IAAA,IAAA,CAAKzK,EAAAA,CAAG+D,KAAK/B,IAAAA,CAAAA;AACf,EAAA;;;;;AAMA,EAAA,MAAc8J,iBAAAA,GAAmC;AAC/C,IAAA,IAAII,SAAAA;AACJ,IAAA,KAAA,IACMC,UAAU,CAAA,EACdA,OAAAA,IAAW,IAAA,CAAKjM,OAAAA,CAAQW,mBACxBsL,OAAAA,EAAAA,EACA;AACA,MAAA,IAAI;AACF,QAAA,MAAM,KAAKC,YAAAA,EAAY;AACvB,QAAA;AACF,MAAA,CAAA,CAAA,OAAS7P,KAAAA,EAAO;AACd2P,QAAAA,SAAAA,GAAY3P,KAAAA;AACd,MAAA;AACF,IAAA;AACA,IAAA,MAAM2P,SAAAA;AACR,EAAA;EAEQE,YAAAA,GAA8B;AACpC,IAAA,OAAO,IAAIhL,OAAAA,CAAQ,CAACnE,OAAAA,EAASoE,MAAAA,KAAAA;AAC3B,MAAA,MAAMgL,aAAAA,GAAgB9K,WAAW,MAAA;AAC/B,QAAA,IAAA,CAAKvB,IAAIsC,KAAAA,EAAAA;AACTjB,QAAAA,MAAAA,CAAO,IAAImJ,+BAAAA,CAAgC;AAAEvK,UAAAA,GAAAA,EAAK,IAAA,CAAKA;AAAI,SAAA,CAAA,CAAA;MAC7D,CAAA,EAAG,IAAA,CAAKC,QAAQa,iBAAiB,CAAA;AAEjC,MAAA,IAAA,CAAKf,EAAAA,GAAK,IAAIH,eAAAA,CAAU,IAAA,CAAKI,GAAG,CAAA;AAEhC,MAAA,IAAA,CAAKD,EAAAA,CAAGwB,SAAS,MAAA;AACfC,QAAAA,YAAAA,CAAa4K,aAAAA,CAAAA;AACb,QAAA,IAAA,CAAKb,YAAAA,GAAe,IAAA;AACpB,QAAA,IAAA,CAAKE,wBAAAA,GAA2B,IAAA;AAChC,QAAA,IAAA,CAAKC,yBAAAA,GAA4B,CAAA;AACjC,QAAA,IAAA,CAAKE,MAAAA,EAAQS,MAAM,sBAAA,EAAwB;AAAErM,UAAAA,GAAAA,EAAK,IAAA,CAAKA;SAAI,CAAA;AAC3D,QAAA,IAAA,CAAKyB,KAAK,WAAA,CAAA;AACVzE,QAAAA,OAAAA,EAAAA;AACF,MAAA,CAAA;AAEA,MAAA,IAAA,CAAK+C,EAAAA,CAAG2B,UAAU,MAAA;AAChBF,QAAAA,YAAAA,CAAa4K,aAAAA,CAAAA;AACb,QAAA,MAAME,GAAAA,GAAM,IAAIhC,wBAAAA,CAAyB;AAAEtK,UAAAA,GAAAA,EAAK,IAAA,CAAKA;SAAI,CAAA;AACzD,QAAA,IAAA,CAAKyB,IAAAA,CAAK,SAAS6K,GAAAA,CAAAA;AACnBlL,QAAAA,MAAAA,CAAOkL,GAAAA,CAAAA;AACT,MAAA,CAAA;AAEA,MAAA,IAAA,CAAKvM,EAAAA,CAAG6B,SAAAA,GAAY,CAACC,KAAAA,KAAAA;AACnB,QAAA,IAAA,CAAK+J,MAAAA,EAAQS,MAAM,6BAAA,EAA+B;AAAEtK,UAAAA,IAAAA,EAAMF,KAAAA,CAAME;SAAK,CAAA;AACrE,QAAA,IAAA,CAAKN,IAAAA,CAAK,SAAA,EAAWI,KAAAA,CAAME,IAAI,CAAA;AACjC,MAAA,CAAA;AAEA,MAAA,IAAA,CAAKhC,EAAAA,CAAGiC,OAAAA,GAAU,CAACH,KAAAA,KAAAA;AACjB,QAAA,IAAA,CAAK0J,YAAAA,GAAe,KAAA;AACpB,QAAA,IAAA,CAAKK,MAAAA,EAAQS,MAAM,mBAAA,EAAqB;AACtCrM,UAAAA,GAAAA,EAAK,IAAA,CAAKA,GAAAA;AACVuM,UAAAA,SAAAA,EAAW1K,KAAAA,CAAM8H;SACnB,CAAA;AACA,QAAA,IAAI,CAAC,KAAK6B,UAAAA,EAAY;AACpB,UAAA,IAAA,CAAK/J,IAAAA,CAAK,cAAA,EAAgBI,KAAAA,CAAM8H,IAAI,CAAA;AACtC,QAAA;AACA,QAAA,IAAA,CAAK6C,cAAAA,CAAe3K,MAAM8H,IAAI,CAAA;AAChC,MAAA,CAAA;IACF,CAAA,CAAA;AACF,EAAA;;;;;;AAOQ6C,EAAAA,cAAAA,CAAeD,SAAAA,EAAyB;AAC9C,IAAA,IAAI,KAAKf,UAAAA,EAAY;AACrB,IAAA,IAAI,CAAC,KAAKC,wBAAAA,EAA0B;AACpC,IAAA,IAAI,IAAA,CAAKC,yBAAAA,IAA6B,IAAA,CAAKzL,OAAAA,CAAQW,iBAAAA,EACjD;AACF,IAAA,IACE2L,SAAAA,KAAcR,mCAAAA,CAAmBC,MAAAA,IACjCO,SAAAA,KAAcR,oCAAmBU,YAAAA,EACjC;AACA,MAAA,IAAA,CAAKb,MAAAA,EAAQS,MAAM,sDAAA,EAAmD;AACpErM,QAAAA,GAAAA,EAAK,IAAA,CAAKA,GAAAA;AACVuM,QAAAA;OACF,CAAA;AACA,MAAA;AACF,IAAA;AAEA,IAAA,IAAA,CAAKb,yBAAAA,EAAAA;AACL,IAAA,IAAA,CAAKE,MAAAA,EAAQS,MAAM,qDAAA,EAAkD;AACnErM,MAAAA,GAAAA,EAAK,IAAA,CAAKA,GAAAA;AACVkM,MAAAA,OAAAA,EAAS,IAAA,CAAKR,yBAAAA;AACdgB,MAAAA,WAAAA,EAAa,KAAKzM,OAAAA,CAAQW;KAC5B,CAAA;AAEAU,IAAAA,UAAAA,CAAW,MAAA;AACT,MAAA,IAAA,CAAK6K,YAAAA,EAAY,CAAG9P,KAAAA,CAAM,CAACC,KAAAA,KAAAA;AACzB,QAAA,MAAMgQ,GAAAA,GAAMhQ,iBAAiBC,KAAAA,GAAQD,KAAAA,GAAQ,IAAIC,KAAAA,CAAMkC,MAAAA,CAAOnC,KAAAA,CAAAA,CAAAA;AAC9D,QAAA,IAAA,CAAKsP,MAAAA,EAAQS,MACX,6BAAA,EACA;AAAEH,UAAAA,OAAAA,EAAS,IAAA,CAAKR;AAA0B,SAAA,EAC1CY,GAAAA,CAAAA;AAEF,QAAA,IAAA,CAAKV,MAAAA,EAAQtP,MAAM,wCAAA,CAAA;AACnB,QAAA,IAAA,CAAKmF,IAAAA,CAAK,SAAS6K,GAAAA,CAAAA;MACrB,CAAA,CAAA;IACF,CAAA,EAAG,IAAA,CAAKrM,QAAQY,iBAAiB,CAAA;AACnC,EAAA;AACF,CAAA;AC3JA,SAAS8L,iBAAiBC,CAAAA,EAAU;AAClC,EAAA,OACE,OAAOA,CAAAA,KAAM,QAAA,IACbA,CAAAA,KAAM,IAAA,IACN,OAAQA,CAAAA,CAA8B,SAAA,CAAA,KAAe,QAAA,IACrD,OAAQA,CAAAA,CAA8B,MAAA,CAAA,KAAY,QAAA;AAEtD;AAPSD,MAAAA,CAAAA,gBAAAA,EAAAA,kBAAAA,CAAAA;AASF,IAAME,OAAAA,GAAN,MAAMA,QAAAA,CAAAA;EA/Cb;;;;;;;;EAgDUC,SAAAA,GAAY,KAAA;AACHC,EAAAA,MAAAA,GAAS,IAAIC,eAAAA,EAAAA;;;;;;AAO9B,EAAA,WAAA,CACmBC,SAAAA,EACAC,aAAAA,EACAC,aAAAA,EACAC,cAAAA,EACAxB,MAAAA,EACjB;SALiBqB,SAAAA,GAAAA,SAAAA;SACAC,aAAAA,GAAAA,aAAAA;SACAC,aAAAA,GAAAA,aAAAA;SACAC,cAAAA,GAAAA,cAAAA;SACAxB,MAAAA,GAAAA,MAAAA;AAChB,EAAA;AAEH,EAAA,IAAInL,YAAAA,GAAuB;AACzB,IAAA,OAAO,IAAA,CAAKyM,aAAAA;AACd,EAAA;AAEA,EAAA,IAAI3M,YAAAA,GAA2B;AAC7B,IAAA,IAAI,KAAKuM,SAAAA,EAAW;AAClB,MAAA,MAAM,IAAI/B,oBAAAA,EAAAA;AACZ,IAAA;AACA,IAAA,OAAO,IAAA,CAAKoC,aAAAA;AACd,EAAA;;;;;;;;;AAUA,EAAA,aAAazK,UACXuK,SAAAA,EACA3I,YAAAA,EACArE,OAAAA,GAA0B,IAC1B2L,MAAAA,EACkB;AAClB,IAAA,MAAMwB,cAAAA,GAAiBnN,QAAQmN,cAAAA,IAAkB,GAAA;AACjD,IAAA,MAAM,EAAE7I,gBAAAA,EAAkB/D,gBAAAA,EAAgB,GAAKgE,wCAAAA,EAAAA;AAC/C,IAAA,MAAMC,UAAAA,GAAaC,qBAAY,EAAA,CAAA;AAE/B,IAAA,MAAMpC,OAAAA,GAAU,IAAIqC,0CAAAA,CAA0B;MAC5CC,SAAAA,EAAWL,gBAAAA;MACXhH,KAAAA,EAAOkH,UAAAA;AACPH,MAAAA;KACF,CAAA;AAEA,IAAA,IAAIvC,IAAAA;AACJ,IAAA,IAAI;AACFA,MAAAA,IAAAA,GAAO,MAAM8K,QAAAA,CAAQQ,SAAAA,CACnBJ,SAAAA,EACA3K,SACA8K,cAAAA,CAAAA;AAEJ,IAAA,CAAA,CAAA,OAAS9Q,KAAAA,EAAO;AACdkE,MAAAA,gBAAAA,CAAiBgC,KAAK,CAAA,CAAA;AACtBiC,MAAAA,UAAAA,CAAWjC,KAAK,CAAA,CAAA;AAChB,MAAA,MAAMhG,UAAUF,KAAAA,YAAiBC,KAAAA,GAAQD,KAAAA,CAAME,OAAAA,GAAUiC,OAAOnC,KAAAA,CAAAA;AAChE,MAAA,MAAM,IAAImO,sBAAsBjO,OAAAA,CAAAA;AAClC,IAAA;AAEA,IAAA,IAAI,CAACuF,IAAAA,CAAK+C,wBAAAA,IAA4B,CAAC/C,KAAKtB,YAAAA,EAAc;AACxDD,MAAAA,gBAAAA,CAAiBgC,KAAK,CAAA,CAAA;AACtBiC,MAAAA,UAAAA,CAAWjC,KAAK,CAAA,CAAA;AAChB,MAAA,MAAM,IAAImI,oCAAAA,EAAAA;AACZ,IAAA;AAEA,IAAA,MAAMlK,eAAesB,IAAAA,CAAKtB,YAAAA;AAC1B,IAAA,MAAMsE,UAAAA,GAAaC,mBAAAA,CAAWjD,IAAAA,CAAK+C,wBAAwB,CAAA;AAC3D,IAAA,MAAMvE,YAAAA,GAAe0E,oCAAAA,CAAoBzE,gBAAAA,EAAkBuE,UAAAA,CAAAA;AAC3DvE,IAAAA,gBAAAA,CAAiBgC,KAAK,CAAA,CAAA;AAEtB,IAAA,IAAIvC,OAAAA,CAAQC,mBAAAA,IAAuB,CAACD,OAAAA,CAAQgB,iBAAAA,EAAmB;AAC7D,MAAA,IAAI,CAACc,KAAKmD,cAAAA,EAAgB;AACxB3E,QAAAA,YAAAA,CAAaiC,KAAK,CAAA,CAAA;AAClBiC,QAAAA,UAAAA,CAAWjC,KAAK,CAAA,CAAA;AAChB,QAAA,MAAM,IAAIoI,uBAAAA,CACR,+CAAA,EACA/C,SAAAA,CAAUW,4BAA4B,CAAA;AAE1C,MAAA;AACA,MAAA,IAAI;AACF,QAAA,MAAMqE,SAAQS,iBAAAA,CACZvL,IAAAA,CAAKmD,gBACLH,UAAAA,EACAN,UAAAA,EACAxE,QAAQC,mBAAmB,CAAA;AAE/B,MAAA,CAAA,CAAA,OAAS5D,KAAAA,EAAO;AACdiE,QAAAA,YAAAA,CAAaiC,KAAK,CAAA,CAAA;AAClBiC,QAAAA,UAAAA,CAAWjC,KAAK,CAAA,CAAA;AAChB,QAAA,MAAMlG,KAAAA;AACR,MAAA;AACF,IAAA;AAEAmI,IAAAA,UAAAA,CAAWjC,KAAK,CAAA,CAAA;AAChBoJ,IAAAA,MAAAA,EAAQS,MAAM,qBAAA,EAAuB;AAAE5L,MAAAA;KAAa,CAAA;AAEpD,IAAA,OAAO,IAAIoM,QAAAA,CACTI,SAAAA,EACAxM,YAAAA,EACAF,YAAAA,EACA6M,gBACAxB,MAAAA,CAAAA;AAEJ,EAAA;AAEAnI,EAAAA,WAAAA,CAAejH,OAAAA,EAA8B;AAC3C,IAAA,IAAI,KAAKsQ,SAAAA,EAAW;AAClB,MAAA,OAAO3L,OAAAA,CAAQC,MAAAA,CAAO,IAAI2J,oBAAAA,EAAAA,CAAAA;AAC5B,IAAA;AACA,IAAA,OAAO8B,QAAAA,CAAQQ,UACb,IAAA,CAAKJ,SAAAA,EACLzQ,SACA,IAAA,CAAK4Q,cAAAA,EACL,IAAA,CAAKL,MAAAA,CAAOQ,MAAM,CAAA;AAEtB,EAAA;EAEAC,OAAAA,GAAgB;AACd,IAAA,IAAI,KAAKV,SAAAA,EAAW;AACpB,IAAA,IAAA,CAAKA,SAAAA,GAAY,IAAA;AACjB,IAAA,IAAA,CAAKC,OAAOU,KAAAA,EAAK;AACjB,IAAA,IAAA,CAAKN,aAAAA,CAAc3K,KAAK,CAAA,CAAA;AACxB,IAAA,IAAA,CAAKoJ,MAAAA,EAAQS,MAAM,kBAAA,EAAoB;AACrC5L,MAAAA,YAAAA,EAAc,IAAA,CAAKyM;KACrB,CAAA;AACF,EAAA;;;;;;AAOA,EAAA,OAAeG,SAAAA,CACbJ,SAAAA,EACAzQ,OAAAA,EACA6E,OAAAA,EACAkM,MAAAA,EACY;AACZ,IAAA,MAAMzK,SAAAA,GAAY+J,SAAQa,iBAAAA,EAAiB;AAE3C,IAAA,OAAO,IAAIvM,OAAAA,CAAW,CAACnE,OAAAA,EAASoE,MAAAA,KAAAA;AAC9B,MAAA,IAAImM,QAAQI,OAAAA,EAAS;AACnBvM,QAAAA,MAAAA,CAAO,IAAI2J,sBAAAA,CAAAA;AACX,QAAA;AACF,MAAA;AAEA,MAAA,MAAM9I,0BAAU,MAAA,CAAA,MAAA;AACdT,QAAAA,YAAAA,CAAa4K,aAAAA,CAAAA;AACba,QAAAA,SAAAA,CAAUW,GAAAA,CAAI,WAAWC,OAAAA,CAAAA;AACzBN,QAAAA,MAAAA,EAAQO,mBAAAA,CAAoB,SAASC,OAAAA,CAAAA;MACvC,CAAA,EAJgB,SAAA,CAAA;AAMhB,MAAA,MAAMA,0BAAU,MAAA,CAAA,MAAA;AACd9L,QAAAA,OAAAA,EAAAA;AACAb,QAAAA,MAAAA,CAAO,IAAI2J,sBAAAA,CAAAA;MACb,CAAA,EAHgB,SAAA,CAAA;AAKhBwC,MAAAA,MAAAA,EAAQS,gBAAAA,CAAiB,SAASD,OAAAA,EAAS;QAAEE,IAAAA,EAAM;OAAK,CAAA;AAExD,MAAA,MAAM7B,aAAAA,GAAgB9K,WAAW,MAAA;AAC/BW,QAAAA,OAAAA,EAAAA;AACAb,QAAAA,MAAAA,CAAO,IAAI0J,0BAAAA,CAA2B;AAAEhI,UAAAA;AAAU,SAAA,CAAA,CAAA;AACpD,MAAA,CAAA,EAAGzB,OAAAA,CAAAA;AAEH,MAAA,MAAMwM,OAAAA,2BAAWK,OAAAA,KAAAA;AACf,QAAA,IAAIvL,MAAAA;AACJ,QAAA,IAAI;AACFA,UAAAA,MAAAA,GAASC,IAAAA,CAAKC,MAAMqL,OAAAA,CAAAA;QACtB,CAAA,CAAA,MAAQ;AACN,UAAA;AACF,QAAA;AACA,QAAA,IAAIvL,MAAAA,CAAO,WAAA,CAAA,KAAiBG,SAAAA,EAAW;AAEvCb,QAAAA,OAAAA,EAAAA;AAEA,QAAA,MAAM,EAAEa,SAAAA,EAAWqL,IAAAA,EAAM,GAAGC,MAAAA,GAASzL,MAAAA;AAGrC,QAAA,IAAI0L,GAAAA,GAA6B,IAAA;AACjC,QAAA,IAAI;AACF,UAAA,MAAMnK,MAAAA,GAASD,gCAAAA,CAAgBzF,MAAAA,CAAO4P,IAAAA,CAAAA;AACtC,UAAA,IAAIjK,WAAAA,CAAOmK,OAAAA,CAAQpK,MAAAA,CAAAA,QAAeA,MAAAA,CAAOG,KAAAA;QAC3C,CAAA,CAAA,MAAQ;AAER,QAAA;AAEA,QAAA,IAAIgK,QAAQ,IAAA,EAAM;AAChBjN,UAAAA,MAAAA,CAAO,IAAI6J,wBAAAA,CAAyB;AAAEnI,YAAAA;AAAU,WAAA,CAAA,CAAA;AAChD,UAAA;AACF,QAAA;AAEA,QAAA,IAAIuL,GAAAA,CAAIjL,SAAS,OAAA,EAAS;AACxBhC,UAAAA,MAAAA,CACEuL,gBAAAA,CAAiB0B,GAAAA,CAAI/R,KAAK,CAAA,GACtB,IAAI4O,mBAAmBmD,GAAAA,CAAI/R,KAAK,CAAA,GAChC,IAAI2O,wBAAAA,CAAyB;AAAEnI,YAAAA;AAAU,WAAA,CAAA,CAAA;QAEjD,CAAA,MAAO;AACL,UAAA,MAAMf,IAAAA,GAAOsM,IAAI7K,OAAAA,EAAO;AACxB,UAAA,MAAM+K,UAAAA,GACJxM,SAAS,IAAA,IAAQ,OAAOA,SAAS,QAAA,IAAY,OAAA,IAAWA,IAAAA,GACnDA,IAAAA,CAAiCzF,KAAAA,GAClCF,MAAAA;AACN,UAAA,IAAIuQ,gBAAAA,CAAiB4B,UAAAA,CAAAA,EAAa;AAChCnN,YAAAA,MAAAA,CAAO,IAAI8J,kBAAAA,CAAmBqD,UAAAA,CAAAA,CAAAA;UAChC,CAAA,MAAO;AACLvR,YAAAA,OAAAA,CAAQ+E,IAAAA,CAAAA;AACV,UAAA;AACF,QAAA;MACF,CAAA,EA7CgB,SAAA,CAAA;AA+ChBkL,MAAAA,SAAAA,CAAU/K,EAAAA,CAAG,WAAW2L,OAAAA,CAAAA;AAExB,MAAA,IAAI;AACFZ,QAAAA,SAAAA,CAAUnJ,IAAAA,CAAK+I,QAAAA,CAAQ2B,sBAAAA,CAAuBhS,OAAAA,EAASsG,SAAAA,CAAAA,CAAAA;AACzD,MAAA,CAAA,CAAA,OAASxG,KAAAA,EAAO;AACd2F,QAAAA,OAAAA,EAAAA;AACAb,QAAAA,MAAAA,CAAO9E,KAAAA,YAAiBC,QAAQD,KAAAA,GAAQ,IAAIC,MAAMkC,MAAAA,CAAOnC,KAAAA,CAAAA,CAAAA,CAAAA;AAC3D,MAAA;IACF,CAAA,CAAA;AACF,EAAA;;;;;;EAOA,OAAekS,sBAAAA,CACbhS,SACAsG,SAAAA,EACQ;AACR,IAAA,MAAMuL,GAAAA,GAAM7R,OAAAA;AACZ,IAAA,IAAI,OAAO6R,GAAAA,CAAI,QAAA,CAAA,KAAc,UAAA,EAAY;AACvC,MAAA,MAAMrK,OAAAA,GAAmCqK,GAAAA,CAAI,QAAA,CAAA,EAAS;AACtDrK,MAAAA,OAAAA,CAAQ,WAAA,CAAA,GAAelB,SAAAA;AACvB,MAAA,OAAOF,IAAAA,CAAKI,UAAUgB,OAAAA,CAAAA;AACxB,IAAA;AACA,IAAA,OAAOpB,KAAKI,SAAAA,CAAU;MAAE,GAAGqL,GAAAA;AAAKvL,MAAAA;KAAU,CAAA;AAC5C,EAAA;AAEA,EAAA,OAAe4K,iBAAAA,GAA4B;AACzC,IAAA,MAAMe,IAAAA,GAAO/J,qBAAY,CAAA,CAAA;AACzB,IAAA,OAAO,OAAO8C,KAAAA,CAAMnI,IAAAA,CAAKoP,IAAAA,CAAAA,CACtBhH,GAAAA,CAAI,CAACC,CAAAA,KAAMA,CAAAA,CAAEvF,SAAS,EAAA,CAAA,CAAIwF,SAAS,CAAA,EAAG,GAAA,CAAA,CAAA,CACtCC,IAAAA,CAAK,EAAA,CAAA,CAAA,CAAA;AACV,EAAA;AAEA,EAAA,aAAqB0F,iBAAAA,CACnBjQ,oBAAAA,EACA0H,UAAAA,EACAxH,KAAAA,EACAmR,QAAAA,EACe;AACf,IAAA,MAAMpH,aAAAA,GAAgBC,eAAOxC,UAAAA,CAAAA;AAC7B,IAAA,MAAMzH,oBAAoBkK,KAAAA,CAAMnI,IAAAA,CAAKiI,aAAAA,CAAAA,CAClCG,GAAAA,CAAI,CAACC,CAAAA,KAAcA,CAAAA,CAAEvF,QAAAA,CAAS,EAAA,EAAIwF,QAAAA,CAAS,CAAA,EAAG,GAAA,CAAA,CAAA,CAC9CC,KAAK,EAAA,CAAA;AAER,IAAA,MAAM1D,SAAS,MAAMwK,QAAAA,CAAStR,MAAAA,CAC5BC,oBAAAA,EACAC,mBACAC,KAAAA,CAAAA;AAGF,IAAA,IAAI,CAAC2G,OAAOnG,KAAAA,EAAO;AACjB,MAAA,MAAM4Q,YAAAA,GAAezK,MAAAA,CAAOlG,MAAAA,CAAO,CAAA,CAAA,IAAM,EAAA;AACzC,MAAA,MAAM,IAAI4M,uBAAAA,CACR,iCAAA,EACAiC,QAAAA,CAAQ+B,wBAAAA,CAAyBD,YAAAA,CAAAA,EACjC;AAAE3Q,QAAAA,MAAAA,EAAQkG,MAAAA,CAAOlG;AAAO,OAAA,EACxB2Q,YAAAA,CAAAA;AAEJ,IAAA;AACF,EAAA;;;;AAKA,EAAA,OAAeC,yBAAyBD,YAAAA,EAAiC;AACvE,IAAA,IAAIA,YAAAA,CAAaE,QAAAA,CAAS,yBAAA,CAAA,EAA4B;AACpD,MAAA,OAAOhH,SAAAA,CAAUO,wBAAAA;AACnB,IAAA;AACA,IAAA,IACEuG,YAAAA,CAAaE,QAAAA,CAAS,oBAAA,CAAA,IACtBF,aAAaE,QAAAA,CAAS,iBAAA,CAAA,IACtBF,YAAAA,CAAaE,SAAS,WAAA,CAAA,IACtBF,YAAAA,CAAaE,QAAAA,CAAS,oBAAA,CAAA,EACtB;AACA,MAAA,OAAOhH,SAAAA,CAAUQ,8BAAAA;AACnB,IAAA;AACA,IAAA,IAAIsG,YAAAA,CAAaE,QAAAA,CAAS,gBAAA,CAAA,EAAmB;AAC3C,MAAA,OAAOhH,SAAAA,CAAUU,yBAAAA;AACnB,IAAA;AACA,IAAA,IACEoG,YAAAA,CAAaE,QAAAA,CAAS,gBAAA,CAAA,IACtBF,YAAAA,CAAaE,QAAAA,CAAS,uBAAA,CAAA,IACtBF,YAAAA,CAAaE,QAAAA,CAAS,2BAAA,CAAA,EACtB;AACA,MAAA,OAAOhH,SAAAA,CAAUS,0BAAAA;AACnB,IAAA;AACA,IAAA,OAAOT,SAAAA,CAAUM,kBAAAA;AACnB,EAAA;AACF,CAAA;;;ACtVO,IAAM2G,SAAN,MAAMA;EAdb;;;;EAemBC,cAAAA,GAAiB,oBAAA;AAClC,EAAA,WAAA,CAA6BC,cAAAA,EAAiC;SAAjCA,cAAAA,GAAAA,cAAAA;AAAkC,EAAA;EAE/D3C,KAAAA,CAAM7P,OAAAA,EAAiByS,gBAAyB3S,KAAAA,EAAqB;AACnE,IAAA,IAAA,CAAK0S,cAAAA,EAAgB3C,MACnB,CAAA,EAAG,IAAA,CAAK0C,cAAc,CAAA,CAAA,EAAIvS,OAAAA,CAAAA,CAAAA,EAC1ByS,cAAAA,EACA3S,KAAAA,CAAAA;AAEJ,EAAA;EAEA4S,IAAAA,CAAK1S,OAAAA,EAAiByS,gBAAyB3S,KAAAA,EAAqB;AAClE,IAAA,IAAA,CAAK0S,cAAAA,EAAgBE,KACnB,CAAA,EAAG,IAAA,CAAKH,cAAc,CAAA,CAAA,EAAIvS,OAAAA,CAAAA,CAAAA,EAC1ByS,cAAAA,EACA3S,KAAAA,CAAAA;AAEJ,EAAA;EAEA6S,IAAAA,CAAK3S,OAAAA,EAAiByS,gBAAyB3S,KAAAA,EAAqB;AAClE,IAAA,IAAA,CAAK0S,cAAAA,EAAgBG,KACnB,CAAA,EAAG,IAAA,CAAKJ,cAAc,CAAA,CAAA,EAAIvS,OAAAA,CAAAA,CAAAA,EAC1ByS,cAAAA,EACA3S,KAAAA,CAAAA;AAEJ,EAAA;EAEAA,KAAAA,CAAME,OAAAA,EAAiByS,gBAAyB3S,KAAAA,EAAqB;AACnE,IAAA,IAAA,CAAK0S,cAAAA,EAAgB1S,MACnB,CAAA,EAAG,IAAA,CAAKyS,cAAc,CAAA,CAAA,EAAIvS,OAAAA,CAAAA,CAAAA,EAC1ByS,cAAAA,EACA3S,KAAAA,CAAAA;AAEJ,EAAA;AACF,CAAA;;;ACiBO,IAAM8S,kBAAAA,GAAN,cAAiCtP,8BAAAA,CAAAA;EAlExC;;;AAmEqBE,EAAAA,GAAAA;AACAC,EAAAA,OAAAA;AACFgN,EAAAA,SAAAA;AACAoC,EAAAA,cAAAA;AACAzD,EAAAA,MAAAA;EACT0D,OAAAA,GAA0B,IAAA;EAC1B3D,eAAAA,GAAwC,IAAA;EACxC4D,YAAAA,GAAe,KAAA;EACfC,0BAAAA,GAA6B,KAAA;EAErC,WAAA,CAAYxP,GAAAA,EAAaC,OAAAA,GAAqC,EAAC,EAAG;AAChE,IAAA,KAAA,EAAK;AAEL,IAAA,IAAA,CAAKD,GAAAA,GAAMA,GAAAA;AACX,IAAA,IAAA,CAAKC,OAAAA,GAAUA,OAAAA;AACf,IAAA,IAAIA,QAAQwP,4BAAAA,EAA8B;AACxCC,MAAAA,OAAAA,CAAQP,KACN,qIACE,CAAA;AAEN,IAAA,CAAA,MAAA,IAAW,CAAClP,OAAAA,CAAQC,mBAAAA,IAAuB,CAACD,QAAQe,iBAAAA,EAAmB;AACrE0O,MAAAA,OAAAA,CAAQP,KACN,kIACE,CAAA;AAEN,IAAA;AAEA,IAAA,IAAA,CAAKvD,MAAAA,GAAS,IAAIkD,MAAAA,CAAO,IAAA,CAAK7O,QAAQ2L,MAAM,CAAA;AAE5C,IAAA,MAAM+D,gBAAAA,GAA+C;AACnD/O,MAAAA,iBAAAA,EAAmB,KAAKX,OAAAA,CAAQW,iBAAAA;AAChCC,MAAAA,iBAAAA,EAAmB,KAAKZ,OAAAA,CAAQY,iBAAAA;AAChCC,MAAAA,iBAAAA,EAAmB,KAAKb,OAAAA,CAAQa,iBAAAA;AAChC8K,MAAAA,MAAAA,EAAQ,IAAA,CAAKA;AACf,KAAA;AAEA,IAAA,IAAA,CAAKqB,SAAAA,GAAY,IAAI3B,mBAAAA,CAAoBtL,GAAAA,EAAK2P,gBAAAA,CAAAA;AAE9C,IAAA,MAAMzP,mBAAAA,GACJD,QAAQC,mBAAAA,KACPD,OAAAA,CAAQe,oBACL,IAAIpF,wBAAAA,CAAyBqE,OAAAA,CAAQe,iBAAiB,CAAA,GACtD5E,MAAAA,CAAAA;AAEN,IAAA,IAAA,CAAKiT,cAAAA,GAAiB;AACpBnP,MAAAA,mBAAAA;AACAe,MAAAA,iBAAAA,EAAmBhB,OAAAA,CAAQwP,4BAAAA;AAC3BrC,MAAAA,cAAAA,EAAgBnN,OAAAA,CAAQmN;AAC1B,KAAA;AAEA,IAAA,IAAA,CAAKH,UAAU/K,EAAAA,CAAG,WAAA,EAAa,MAAM,IAAA,CAAK0N,sBAAoB,CAAA;AAC9D,IAAA,IAAA,CAAK3C,SAAAA,CAAU/K,GAAG,cAAA,EAAgB,CAACqK,cACjC,IAAA,CAAKsD,uBAAAA,CAAwBtD,SAAAA,CAAAA,CAAAA;AAE/B,IAAA,IAAA,CAAKU,SAAAA,CAAU/K,GAAG,OAAA,EAAS,CAAC5F,UAAU,IAAA,CAAKmF,IAAAA,CAAK,OAAA,EAASnF,KAAAA,CAAAA,CAAAA;AAC3D,EAAA;AAEA,EAAA,IAAI+K,SAAAA,GAAqB;AACvB,IAAA,OAAO,IAAA,CAAK4F,SAAAA,CAAU5F,SAAAA,IAAa,IAAA,CAAKiI,OAAAA,KAAY,IAAA;AACtD,EAAA;;;;;;AAOA,EAAA,MAAMpO,QAAQoD,YAAAA,EAA4C;AACxD,IAAA,IAAI,KAAKgL,OAAAA,EAAS;AAClB,IAAA,IAAI,IAAA,CAAK3D,eAAAA,EAAiB,OAAO,IAAA,CAAKA,eAAAA;AAEtC,IAAA,IAAA,CAAKA,kBAAkB,IAAA,CAAKmE,UAAAA,CAAWxL,YAAAA,CAAAA,CAAcwH,QAAQ,MAAA;AAC3D,MAAA,IAAA,CAAKH,eAAAA,GAAkB,IAAA;IACzB,CAAA,CAAA;AACA,IAAA,OAAO,IAAA,CAAKA,eAAAA;AACd,EAAA;;;;EAKAvJ,UAAAA,GAAmB;AACjB,IAAA,IAAA,CAAKoN,0BAAAA,GAA6B,IAAA;AAClC,IAAA,IAAA,CAAKF,SAAS9B,OAAAA,EAAAA;AACd,IAAA,IAAA,CAAK8B,OAAAA,GAAU,IAAA;AACf,IAAA,IAAA,CAAKrC,UAAU7K,UAAAA,EAAU;AAE3B,EAAA;AAEA,EAAA,MAAMgD,YAAYC,MAAAA,EAAuD;AACvE,IAAA,MAAMiK,OAAAA,GAAU,MAAM,IAAA,CAAKS,aAAAA,EAAa;AAExC,IAAA,IAAIzK,aAAAA;AACJ,IAAA,IAAI,OAAOD,MAAAA,CAAO7I,OAAAA,KAAY,QAAA,EAAU;AACtC,MAAA,MAAMwT,GAAAA,GAAM3K,MAAAA,CAAO7I,OAAAA,CAAQgJ,UAAAA,CAAW,IAAA,CAAA,GAClCH,MAAAA,CAAO7I,OAAAA,CAAQiJ,KAAAA,CAAM,CAAA,CAAA,GACrBJ,MAAAA,CAAO7I,OAAAA;AACX8I,MAAAA,aAAAA,GAAgBN,oBAAWgL,GAAAA,CAAAA;IAC7B,CAAA,MAAO;AACL1K,MAAAA,aAAAA,GAAgBD,MAAAA,CAAO7I,OAAAA;AACzB,IAAA;AAEA,IAAA,MAAMkJ,iBAAAA,GAAoBC,gCAAAA,CACxBN,MAAAA,CAAOO,QAAAA,EACP0J,OAAAA,CAAQ/O,YAAAA,EACR+O,OAAAA,CAAQ7O,YAAAA,EACRwP,4CAAAA,CAA4B5K,MAAAA,CAAOQ,WAAW,CAAA,CAAA;AAGhD,IAAA,MAAMvD,OAAAA,GAAU,IAAIwD,4CAAAA,CAA4B;AAC9CC,MAAAA,WAAAA,EAAaV,MAAAA,CAAOU,WAAAA;AACpBF,MAAAA,WAAAA,EAAaR,MAAAA,CAAOQ,WAAAA;AACpBG,MAAAA,QAAAA,EAAUX,MAAAA,CAAOW,QAAAA;AACjBC,MAAAA,cAAAA,EAAgBZ,MAAAA,CAAOY,cAAAA;AACvBC,MAAAA,KAAAA,EAAOb,MAAAA,CAAOa,KAAAA;MACdN,QAAAA,EAAUF,iBAAAA;MACVlJ,OAAAA,EAAS8I,aAAAA;AACTa,MAAAA,QAAAA,EAAUd,MAAAA,CAAOc,QAAAA;AACjB7B,MAAAA,YAAAA,EAAce,MAAAA,CAAOf,YAAAA;AACrB8B,MAAAA,MAAAA,EAAQf,MAAAA,CAAOe,MAAAA;AACfE,MAAAA,aAAAA,EAAejB,MAAAA,CAAOiB;KACxB,CAAA;AAEA,IAAA,MAAM,EAAE4J,SAAAA,EAAS,GACf,MAAMZ,OAAAA,CAAQ7L,YAAqCnB,OAAAA,CAAAA;AAErD,IAAA,IAAI,CAAC4N,SAAAA,EAAW;AACd,MAAA,MAAM,IAAIlF,mBAAmB,0BAAA,CAAA;AAC/B,IAAA;AAEA,IAAA,OAAO;AAAEkF,MAAAA;AAAU,KAAA;AACrB,EAAA;;;;;AAMA,EAAA,MAAM3J,OAAOlB,MAAAA,EAA6C;AACxD,IAAA,IAAIA,MAAAA,CAAOQ,WAAAA,KAAgBW,qBAAAA,CAAiBC,OAAAA,EAAS;AACnD,MAAA,MAAM,IAAI2E,+BAAAA,EAAAA;AACZ,IAAA;AAEA,IAAA,MAAMkE,OAAAA,GAAU,MAAM,IAAA,CAAKS,aAAAA,EAAa;AAExC,IAAA,MAAMrJ,sBAAsBC,kCAAAA,CAC1BtB,MAAAA,CAAOuB,YACP0I,OAAAA,CAAQ/O,YAAAA,EACR+O,QAAQ7O,YAAY,CAAA;AAGtB,IAAA,MAAM6B,OAAAA,GAAU,IAAIuE,uCAAAA,CAAuB;AACzCd,MAAAA,WAAAA,EAAaV,MAAAA,CAAOU,WAAAA;AACpBF,MAAAA,WAAAA,EAAaR,MAAAA,CAAOQ,WAAAA;AACpBM,MAAAA,QAAAA,EAAUd,MAAAA,CAAOc,QAAAA;AACjBW,MAAAA,UAAAA,EAAYzB,MAAAA,CAAOyB,UAAAA;AACnBC,MAAAA,SAAAA,EAAW1B,MAAAA,CAAO0B,SAAAA;MAClBH,UAAAA,EAAYF,mBAAAA;AACZM,MAAAA,SAAAA,EAAW3B,MAAAA,CAAO2B,SAAAA;AAClB1C,MAAAA,YAAAA,EAAce,MAAAA,CAAOf,YAAAA;AACrB8B,MAAAA,MAAAA,EAAQf,MAAAA,CAAOe,MAAAA;AACfE,MAAAA,aAAAA,EAAejB,MAAAA,CAAOiB;KACxB,CAAA;AAEA,IAAA,MAAM,EAAEW,YAAAA,EAAY,GAClB,MAAMqI,OAAAA,CAAQ7L,YAAgCnB,OAAAA,CAAAA;AAEhD,IAAA,IAAI,CAAC2E,YAAAA,EAAc;AACjB,MAAA,MAAM,IAAI+D,mBAAmB,8BAAA,CAAA;AAC/B,IAAA;AAEA,IAAA,OAAO9D,oCAAAA,CACLD,YAAAA,EACAqI,OAAAA,CAAQ/O,YAAAA,EACR+O,QAAQ7O,YAAY,CAAA;AAExB,EAAA;;;;AAKA,EAAA,MAAM0G,WAAW9B,MAAAA,EAAqD;AACpE,IAAA,MAAMiK,OAAAA,GAAU,MAAM,IAAA,CAAKS,aAAAA,EAAa;AAExC,IAAA,MAAMrJ,sBAAsBC,kCAAAA,CAC1BtB,MAAAA,CAAOuB,YACP0I,OAAAA,CAAQ/O,YAAAA,EACR+O,QAAQ7O,YAAY,CAAA;AAGtB,IAAA,MAAM6B,OAAAA,GAAU,IAAI8E,2CAAAA,CAA2B;AAC7CrB,MAAAA,WAAAA,EAAaV,MAAAA,CAAOU,WAAAA;MACpBF,WAAAA,EAAa,SAAA;AACbM,MAAAA,QAAAA,EAAUd,MAAAA,CAAOc,QAAAA;AACjBW,MAAAA,UAAAA,EAAYzB,MAAAA,CAAOyB,UAAAA;AACnBC,MAAAA,SAAAA,EAAW1B,MAAAA,CAAO0B,SAAAA;MAClBH,UAAAA,EAAYF,mBAAAA;AACZM,MAAAA,SAAAA,EAAW3B,MAAAA,CAAO2B,SAAAA;AAClB1C,MAAAA,YAAAA,EAAce,MAAAA,CAAOf,YAAAA;AACrB8B,MAAAA,MAAAA,EAAQf,MAAAA,CAAOe,MAAAA;AACfE,MAAAA,aAAAA,EAAejB,MAAAA,CAAOiB;KACxB,CAAA;AAEA,IAAA,MAAM,EAAEW,YAAAA,EAAY,GAClB,MAAMqI,OAAAA,CAAQ7L,YAAoCnB,OAAAA,CAAAA;AAEpD,IAAA,IAAI,CAAC2E,YAAAA,EAAc;AACjB,MAAA,MAAM,IAAI+D,mBAAmB,8BAAA,CAAA;AAC/B,IAAA;AAEA,IAAA,OAAO9D,oCAAAA,CACLD,YAAAA,EACAqI,OAAAA,CAAQ/O,YAAAA,EACR+O,QAAQ7O,YAAY,CAAA;AAExB,EAAA;;;;AAKA,EAAA,MAAcsP,aAAAA,GAAkC;AAC9C,IAAA,IAAI,IAAA,CAAKT,OAAAA,EAAS,OAAO,IAAA,CAAKA,OAAAA;AAC9B,IAAA,MAAM,KAAKpO,OAAAA,EAAO;AAClB,IAAA,IAAI,CAAC,KAAKoO,OAAAA,EAAS;AACjB,MAAA,MAAM,IAAIjE,iCAAAA,EAAAA;AACZ,IAAA;AACA,IAAA,OAAO,IAAA,CAAKiE,OAAAA;AACd,EAAA;AAEA,EAAA,MAAca,cAAc7L,YAAAA,EAA4C;AACtE,IAAA,IAAA,CAAKgL,OAAAA,GAAU,MAAMzC,OAAAA,CAAQnK,SAAAA,CAC3B,IAAA,CAAKuK,WACL3I,YAAAA,EACA,IAAA,CAAK+K,cAAAA,EACL,IAAA,CAAKzD,MAAM,CAAA;AAEb,IAAA,IAAA,CAAKnK,KAAK,WAAA,CAAA;AACZ,EAAA;AAEA,EAAA,MAAcqO,WAAWxL,YAAAA,EAA4C;AACnE,IAAA,IAAA,CAAKiL,YAAAA,GAAe,IAAA;AACpB,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAKtC,UAAU/L,OAAAA,EAAO;AAC5B,MAAA,MAAM,IAAA,CAAKiP,cAAc7L,YAAAA,CAAAA;IAC3B,CAAA,SAAA;AACE,MAAA,IAAA,CAAKiL,YAAAA,GAAe,KAAA;AACtB,IAAA;AACF,EAAA;;;;;;;;;;EAWQK,oBAAAA,GAA6B;AACnC,IAAA,IAAI,KAAKL,YAAAA,EAAc;AACvB,IAAA,IAAA,CAAKA,YAAAA,GAAe,IAAA;AAEpB,IAAA,MAAMa,8BAAc,MAAA,CAAA,YAAA;AAClB,MAAA,IAAI;AACF,QAAA,MAAM,KAAKD,aAAAA,EAAa;AAC1B,MAAA,CAAA,CAAA,OAAS7T,KAAAA,EAAO;AACd,QAAA,IAAA,CAAKmF,IAAAA,CACH,OAAA,EACAnF,KAAAA,YAAiBC,KAAAA,GAAQD,KAAAA,GAAQ,IAAIC,KAAAA,CAAMkC,MAAAA,CAAOnC,KAAAA,CAAAA,CAAAA,CAAAA;MAEtD,CAAA,SAAA;AACE,QAAA,IAAA,CAAKiT,YAAAA,GAAe,KAAA;AACpB,QAAA,IAAA,CAAK5D,eAAAA,GAAkB,IAAA;AACzB,MAAA;IACF,CAAA,EAZoB,aAAA,CAAA;AAcpB,IAAA,IAAA,CAAKA,kBAAkByE,WAAAA,EAAAA;AACzB,EAAA;AAEQP,EAAAA,uBAAAA,CAAwBtD,SAAAA,EAAyB;AACvD,IAAA,MAAM8D,cAAc,IAAA,CAAKb,0BAAAA;AACzB,IAAA,IAAA,CAAKA,0BAAAA,GAA6B,KAAA;AAClC,IAAA,IAAA,CAAKF,SAAS9B,OAAAA,EAAAA;AACd,IAAA,IAAA,CAAK8B,OAAAA,GAAU,IAAA;AACf,IAAA,IAAI,CAACe,WAAAA,EAAa;AAChB,MAAA,IAAA,CAAKzE,MAAAA,CAAOS,MAAM,kCAAA,CAAA;AACpB,IAAA;AACA,IAAA,IAAA,CAAK5K,IAAAA,CAAK,gBAAgB8K,SAAAA,CAAAA;AAC5B,EAAA;AACF;;;AC3VO,IAAM+D,yBAAAA,GAAN,cAAwClB,kBAAAA,CAAAA;EAN/C;;;AAMmE","file":"index.cjs","sourcesContent":["/**\n * AWS Nitro Security Module (NSM) Root Certificate\n * This is the official AWS root certificate used to verify attestation documents\n */\nexport const AWS_NITRO_ROOT_CERTIFICATE = `-----BEGIN CERTIFICATE-----\nMIICETCCAZagAwIBAgIRAPkxdWgbkK/hHUbMtOTn+FYwCgYIKoZIzj0EAwMwSTEL\nMAkGA1UEBhMCVVMxDzANBgNVBAoMBkFtYXpvbjEMMAoGA1UECwwDQVdTMRswGQYD\nVQQDDBJhd3Mubml0cm8tZW5jbGF2ZXMwHhcNMTkxMDI4MTMyODA1WhcNNDkxMDI4\nMTQyODA1WjBJMQswCQYDVQQGEwJVUzEPMA0GA1UECgwGQW1hem9uMQwwCgYDVQQL\nDANBV1MxGzAZBgNVBAMMEmF3cy5uaXRyby1lbmNsYXZlczB2MBAGByqGSM49AgEG\nBSuBBAAiA2IABPwCVOumCMHzaHDimtqQvkY4MpJzbolL//Zy2YlES1BR5TSksfbb\n48C8WBoyt7F2Bw7eEtaaP+ohG2bnUs990d0JX28TcPQXCEPZ3BABIeTPYwEoCWZE\nh8l5YoQwTcU/9KNCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUkCW1DdkF\nR+eWw5b6cp3PmanfS5YwDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMDA2kAMGYC\nMQCjfy+Rocm9Xue4YnwWmNJVA44fA0P5W2OpYow9OYCVRaEevL8uO1XYru5xtMPW\nrfMCMQCi85sWBbJwKKXdS6BptQFuZbT73o/gBh1qUxl/nNr12UO8Yfwr6wPLb+6N\nIwLz3/Y=\n-----END CERTIFICATE-----`;\n\n/**\n * Expected PCR values for different environments\n */\nexport const EXPECTED_PCR_VALUES = {\n // Production PCR8 values would be set based on actual enclave builds\n // These would be configured via environment variables in production\n // Development values should be set in the application configuration, not here\n} as const;\n\n/**\n * Attestation document validation constants\n */\nexport const ATTESTATION_CONSTANTS = {\n // Maximum age of attestation document in milliseconds\n MAX_ATTESTATION_AGE: 5 * 60 * 1000, // 5 minutes\n\n // Expected digest algorithm\n EXPECTED_DIGEST: 'SHA384',\n\n // Expected module ID pattern\n MODULE_ID_PATTERN: /^i-[0-9a-f]{8,17}-enc[0-9a-f]{8,17}$/,\n\n // PCR indices that must be present\n REQUIRED_PCRS: [0, 1, 2, 8] as const,\n} as const;\n","import {\n AttestationVerificationResult,\n AttestationVerificationConfig,\n} from './types';\nimport { ATTESTATION_CONSTANTS } from './constants';\n\n// Import Evervault WASM attestation bindings\nimport init, {\n validateAttestationDocPcrs,\n PCRs,\n getUserData,\n getNonce,\n} from '@evervault/wasm-attestation-bindings';\nimport { type AttestationVerifier } from './types';\n\n/**\n * Nitro Enclave Attestation Document Verifier\n * Uses Evervault's official WASM attestation bindings\n * Optimized for client-side usage with hex string input\n */\nexport class NitroAttestationVerifier implements AttestationVerifier {\n private readonly config: AttestationVerificationConfig;\n private wasmInitPromise: Promise<void> | null = null;\n\n constructor(config: AttestationVerificationConfig) {\n this.config = {\n strictCertValidation: true,\n maxAge: ATTESTATION_CONSTANTS.MAX_ATTESTATION_AGE,\n ...config,\n };\n }\n\n /**\n * Initialises the WASM module exactly once. Concurrent callers share the\n * same in-flight promise, preventing duplicate initialisation.\n * On failure the promise is cleared so the next call may retry.\n */\n private ensureWasmInitialized(): Promise<void> {\n this.wasmInitPromise ??= this.initWasm()\n .then(() => undefined)\n .catch((error) => {\n this.wasmInitPromise = null;\n throw new Error(\n `Failed to initialize WASM module: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n });\n return this.wasmInitPromise;\n }\n\n /**\n * Initialises the WASM module with environment-appropriate loading.\n * In Node.js, fetch() does not support file:// URLs, so we read the\n * .wasm binary from disk and use initSync() instead.\n */\n private async initWasm(): Promise<void> {\n if (typeof process !== 'undefined' && process.versions?.node) {\n const { readFileSync } = await import('node:fs');\n const { createRequire } = await import('node:module');\n const require = createRequire(import.meta.url);\n const wasmPath = require.resolve(\n '@evervault/wasm-attestation-bindings/index_bg.wasm'\n );\n const { initSync } = await import('@evervault/wasm-attestation-bindings');\n initSync({ module: readFileSync(wasmPath) });\n } else {\n await init();\n }\n }\n\n /**\n * Verify an attestation document using Evervault WASM bindings\n * Accepts base64-encoded attestation document directly\n *\n * @param attestationDocBase64 - Base64-encoded attestation document\n * @param expectedChallenge - Expected challenge (ciphertext hash)\n * @param nonce - Expected nonce (REQUIRED for security)\n */\n async verify(\n attestationDocBase64: string,\n expectedChallenge: string,\n nonce: Uint8Array\n ): Promise<AttestationVerificationResult> {\n try {\n // Ensure WASM module is initialized\n await this.ensureWasmInitialized();\n\n // Create PCRs container with expected values\n const expectedPcrs = PCRs.empty();\n expectedPcrs.pcr8 = this.config.expectedPcr8;\n\n // Use Evervault WASM bindings to verify the attestation document (already in base64)\n const isValid = validateAttestationDocPcrs(attestationDocBase64, [\n expectedPcrs,\n ]);\n\n if (!isValid) {\n return {\n valid: false,\n errors: ['Attestation document PCR verification failed'],\n timestamp: Date.now(),\n };\n }\n\n // Challenge (ciphertext hash) is required — an empty value would allow a\n // replayed attestation document to pass PCR verification without being\n // bound to this specific handshake.\n if (!expectedChallenge) {\n return {\n valid: false,\n errors: [\n 'No challenge provided — ciphertext binding cannot be verified',\n ],\n timestamp: Date.now(),\n };\n }\n\n try {\n const userData = getUserData(attestationDocBase64);\n if (!userData) {\n return {\n valid: false,\n errors: ['No user data found in attestation document'],\n timestamp: Date.now(),\n };\n }\n\n // The challenge should be the hex-encoded hash of the ciphertext.\n // Use strict equality — substring matches would allow spoofing.\n const userDataString = new TextDecoder('utf-8').decode(userData);\n\n if (userDataString !== expectedChallenge) {\n return {\n valid: false,\n errors: [\n 'Ciphertext hash verification failed - challenge mismatch in attestation user data',\n ],\n timestamp: Date.now(),\n };\n }\n } catch (error) {\n return {\n valid: false,\n errors: [\n `Failed to extract or verify ciphertext hash: ${error instanceof Error ? error.message : String(error)}`,\n ],\n timestamp: Date.now(),\n };\n }\n\n // Verify nonce (REQUIRED for security - prevents replay attacks)\n try {\n // Use WASM getNonce function to extract nonce from attestation document\n const extractedNonceRaw = getNonce(attestationDocBase64);\n\n if (!extractedNonceRaw) {\n return {\n valid: false,\n errors: ['No nonce found in attestation document'],\n timestamp: Date.now(),\n };\n }\n\n // The attestation document stores the nonce as a base64-encoded string.\n // Decode it back to the original bytes.\n let extractedNonce: Uint8Array;\n try {\n const nonceString = new TextDecoder().decode(extractedNonceRaw);\n\n // Isomorphic base64 decoding\n if (typeof atob !== 'undefined') {\n const binaryString = atob(nonceString);\n extractedNonce = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n extractedNonce[i] = binaryString.charCodeAt(i);\n }\n } else {\n extractedNonce = new Uint8Array(Buffer.from(nonceString, 'base64'));\n }\n } catch (decodeError) {\n return {\n valid: false,\n errors: [\n `Failed to decode nonce from base64: ${decodeError instanceof Error ? decodeError.message : String(decodeError)}`,\n ],\n timestamp: Date.now(),\n };\n }\n\n // Length check first — lengths are public, so early exit is safe.\n if (extractedNonce.length !== nonce.length) {\n return {\n valid: false,\n errors: [\n `Nonce length mismatch: expected ${nonce.length} bytes, got ${extractedNonce.length} bytes`,\n ],\n timestamp: Date.now(),\n };\n }\n\n // Constant-time byte comparison via XOR accumulator — no early exit,\n // preventing timing side-channels that could reveal nonce bytes.\n let diff = 0;\n for (let i = 0; i < nonce.length; i++) {\n diff |= extractedNonce[i] ^ nonce[i];\n }\n\n if (diff !== 0) {\n return {\n valid: false,\n errors: ['Nonce verification failed - nonce mismatch'],\n timestamp: Date.now(),\n };\n }\n } catch (error) {\n return {\n valid: false,\n errors: [\n `Failed to extract or verify nonce: ${error instanceof Error ? error.message : String(error)}`,\n ],\n timestamp: Date.now(),\n };\n }\n\n return {\n valid: true,\n errors: [],\n timestamp: Date.now(),\n };\n } catch (error) {\n return {\n valid: false,\n errors: [\n `Attestation verification error: ${error instanceof Error ? error.message : String(error)}`,\n ],\n timestamp: Date.now(),\n };\n }\n }\n}\n","// Browser/Node.js compatibility\nimport { EventEmitter } from 'eventemitter3';\nimport * as ws from 'ws';\n\nconst isWindow =\n typeof globalThis !== 'undefined' &&\n typeof (globalThis as any).window !== 'undefined';\nconst WebSocketImpl = isWindow ? (globalThis as any).WebSocket : ws.WebSocket;\n\nimport {\n BaseWebSocketMessage,\n ErrorResponse,\n} from '@dynamic-labs-wallet/forward-mpc-shared';\nimport {\n HandshakeV1RequestMessage,\n SignMessageV1RequestMessage,\n KeygenV1RequestMessage,\n ReceiveKeyV1RequestMessage,\n messageRegistry,\n HashAlgorithm,\n generateMlKem768Keypair,\n decapsulateMlKem768,\n encryptKeyshare,\n encryptKeygenInit,\n decryptKeygenResult,\n type SigningAlgorithmName,\n type TraceContext,\n} from '@dynamic-labs-wallet/forward-mpc-shared';\nimport { NitroAttestationVerifier } from './attestation';\nimport { AttestationVerificationConfig } from './attestation/types';\nimport { sha256 } from '@noble/hashes/sha2.js';\nimport { hexToBytes, randomBytes } from '@noble/hashes/utils.js';\nimport { either } from 'fp-ts';\nimport { SigningAlgorithm } from '@dynamic-labs-wallet/core';\n\nexport interface ForwardMPCClientOptions {\n reconnectAttempts?: number;\n reconnectInterval?: number;\n connectionTimeout?: number;\n heartbeatInterval?: number;\n attestationConfig?: AttestationVerificationConfig;\n attestationVerifier?: any; // Allow custom verifier (mock or real)\n bypassAttestation?: boolean; // Default: false. Only for testing!\n}\n\nexport interface ClientEvents {\n connected: () => void;\n disconnected: () => void;\n error: (error: Error) => void;\n message: (message: BaseWebSocketMessage) => void;\n}\n\nexport class ForwardMPCClient extends EventEmitter {\n private ws: any = null;\n private url: string;\n private options: Required<\n Omit<ForwardMPCClientOptions, 'attestationVerifier' | 'attestationConfig'>\n > & {\n attestationVerifier?: any;\n attestationConfig?: AttestationVerificationConfig;\n };\n private attestationVerifier: any | null = null; // Can be NitroAttestationVerifier or mock\n private isConnected = false;\n private messageId = 0;\n private pendingRequests = new Map<\n string,\n {\n resolve: (value: any) => void;\n reject: (error: Error) => void;\n timeout: NodeJS.Timeout;\n }\n >();\n private sharedSecret: Uint8Array | null = null;\n private decapsulationKey: Uint8Array | null = null;\n private connectionId: string;\n private handshakeNonce: Uint8Array | null = null;\n private attestationPromise: Promise<void> | null = null;\n\n constructor(url: string, options: ForwardMPCClientOptions = {}) {\n super();\n\n this.url = url;\n this.connectionId = ''; // Will be set by server during handshake\n this.options = {\n reconnectAttempts: options.reconnectAttempts ?? 3,\n reconnectInterval: options.reconnectInterval ?? 1000,\n connectionTimeout: options.connectionTimeout ?? 10000,\n heartbeatInterval: options.heartbeatInterval ?? 30000,\n attestationConfig: options.attestationConfig,\n attestationVerifier: options.attestationVerifier,\n bypassAttestation: options.bypassAttestation ?? false,\n };\n\n // Initialize attestation verifier - use custom verifier if provided, otherwise create from config\n if (options.attestationVerifier) {\n this.attestationVerifier = options.attestationVerifier;\n } else if (this.options.attestationConfig) {\n this.attestationVerifier = new NitroAttestationVerifier(\n this.options.attestationConfig\n );\n }\n }\n\n async connect(): Promise<void> {\n return new Promise((resolve, reject) => {\n if (this.isConnected) {\n resolve();\n return;\n }\n\n const timeout = setTimeout(() => {\n reject(new Error('Connection timeout'));\n }, this.options.connectionTimeout);\n\n this.ws = new WebSocketImpl(this.url);\n\n // Handle both browser and Node.js WebSocket APIs\n if (isWindow) {\n // Browser WebSocket API\n this.ws.onopen = () => {\n clearTimeout(timeout);\n this.isConnected = true;\n this.emit('connected');\n resolve();\n };\n\n this.ws.onerror = (_error: any) => {\n clearTimeout(timeout);\n this.emit('error', new Error('WebSocket error'));\n reject(new Error('WebSocket error'));\n };\n\n this.ws.onmessage = (event: any) => {\n this.handleMessage(event.data);\n };\n\n this.ws.onclose = () => {\n this.isConnected = false;\n this.emit('disconnected');\n this.cleanup();\n };\n } else {\n // Node.js WebSocket API\n this.ws.on('open', () => {\n clearTimeout(timeout);\n this.isConnected = true;\n this.emit('connected');\n resolve();\n });\n\n this.ws.on('error', (error: any) => {\n clearTimeout(timeout);\n this.emit('error', error);\n reject(error);\n });\n\n this.ws.on('message', (data: any) => {\n this.handleMessage(data.toString());\n });\n\n this.ws.on('close', () => {\n this.isConnected = false;\n this.emit('disconnected');\n this.cleanup();\n });\n }\n });\n }\n\n disconnect(): void {\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n this.cleanup();\n }\n\n private cleanup(): void {\n // Reject all pending requests\n for (const [, request] of this.pendingRequests) {\n clearTimeout(request.timeout);\n request.reject(new Error('Connection closed'));\n }\n this.pendingRequests.clear();\n\n // Clear sensitive cryptographic material\n if (this.sharedSecret) {\n this.sharedSecret.fill(0);\n this.sharedSecret = null;\n }\n if (this.decapsulationKey) {\n this.decapsulationKey.fill(0);\n this.decapsulationKey = null;\n }\n if (this.handshakeNonce) {\n this.handshakeNonce.fill(0);\n this.handshakeNonce = null;\n }\n\n // Clear connection ID\n this.connectionId = '';\n\n // Reset attestation state\n this.attestationPromise = null;\n }\n\n /**\n * Ensures the WebSocket connection is active and handshake is completed.\n * Automatically connects and performs handshake if needed.\n * @returns Object containing the shared secret and connection ID\n * @throws Error if connection or handshake fails\n */\n async ensureWsConnection(): Promise<{\n sharedSecret: Uint8Array;\n connectionId: string;\n }> {\n // Check if we need to connect\n if (!this.isConnected || !this.ws) {\n await this.connect();\n }\n\n // Check if we need to perform handshake\n if (!this.sharedSecret || !this.connectionId) {\n await this.handshake();\n }\n\n // Defensive check: if attestation verifier is configured, promise must exist\n if (\n this.attestationVerifier &&\n !this.options.bypassAttestation &&\n !this.attestationPromise\n ) {\n throw new Error(\n 'Attestation verifier configured but attestation was not performed'\n );\n }\n\n // Await attestation completion (throws if failed)\n if (this.attestationPromise) {\n try {\n await this.attestationPromise;\n } catch (error) {\n // Handle attestation failure by disconnecting\n // Side effect is here in the caller's context, not in the promise\n this.disconnect();\n throw error; // Re-throw for the caller\n }\n }\n\n // Final validation - should never happen but defensive check\n if (!this.sharedSecret || !this.connectionId) {\n throw new Error('Failed to establish connection and handshake');\n }\n\n return {\n sharedSecret: this.sharedSecret,\n connectionId: this.connectionId,\n };\n }\n\n private handleMessage(data: string): void {\n try {\n // Parse the raw message first to extract requestId\n const parsed = JSON.parse(data);\n const requestId = parsed.requestId;\n\n // Remove requestId from the message before deserializing\n if (requestId) {\n delete parsed.requestId;\n }\n\n // Now deserialize the message without requestId\n const message = this.deserializeMessage(JSON.stringify(parsed));\n\n // Check if this is a response to a pending request\n if (requestId && this.pendingRequests.has(requestId)) {\n const request = this.pendingRequests.get(requestId)!;\n this.pendingRequests.delete(requestId);\n clearTimeout(request.timeout);\n\n // Handle unified response format with embedded errors\n if (message.type === 'error') {\n // Legacy error response format\n const errorMsg = message as ErrorResponse;\n request.reject(new Error(errorMsg.error.message));\n } else if (message.type.endsWith('_response')) {\n // Check if the response contains an error field\n const responseData = (message as any).getData\n ? (message as any).getData()\n : message;\n if (responseData.error) {\n request.reject(new Error(responseData.error.message));\n } else {\n request.resolve(message);\n }\n } else {\n request.resolve(message);\n }\n return;\n }\n\n this.emit('message', message);\n } catch (error) {\n this.emit('error', new Error(`Failed to parse message: ${error}`));\n }\n }\n\n private sendRequest<T>(message: any): Promise<T> {\n return new Promise((resolve, reject) => {\n if (!this.isConnected || !this.ws) {\n reject(new Error('Not connected'));\n return;\n }\n\n const requestId = `req_${++this.messageId}_${Date.now()}`;\n // Add requestId to message (works for both objects and Message instances)\n const messageWithId = message;\n messageWithId.requestId = requestId;\n\n const timeout = setTimeout(() => {\n this.pendingRequests.delete(requestId);\n reject(new Error('Request timeout'));\n }, 30000); // 30 second timeout for attestation verification\n\n this.pendingRequests.set(requestId, { resolve, reject, timeout });\n\n try {\n // Use custom serializer that encodes using io-ts schemas\n const serializedMessage = this.serializeMessage(messageWithId);\n this.ws.send(serializedMessage);\n } catch (error) {\n this.pendingRequests.delete(requestId);\n clearTimeout(timeout);\n reject(error);\n }\n });\n }\n\n private serializeMessage(message: any): string {\n try {\n // If it's a Message class instance, use its encode method\n if (message && typeof message.encode === 'function') {\n const encoded = message.encode();\n // Add requestId if present\n if (message.requestId) {\n encoded.requestId = message.requestId;\n }\n return JSON.stringify(encoded);\n }\n\n // Fallback to regular JSON for other objects\n return JSON.stringify(message);\n } catch (error) {\n throw new Error(\n `Failed to serialize message: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n }\n\n private deserializeMessage(data: string): any {\n try {\n const parsed = JSON.parse(data);\n\n // Check if messageRegistry exists and has decode method\n if (!messageRegistry) {\n throw new Error('messageRegistry is undefined');\n }\n\n if (typeof messageRegistry.decode !== 'function') {\n throw new Error('messageRegistry.decode is not a function');\n }\n\n // Use message registry to decode\n const result = messageRegistry.decode(parsed);\n if (either.isLeft(result)) {\n // If registry can't decode it, return as-is (might be error response, etc.)\n return parsed;\n }\n\n return result.right;\n } catch (error) {\n throw new Error(\n `Failed to deserialize message: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n }\n\n async handshake(traceContext?: TraceContext): Promise<any> {\n // Generate ML-KEM-768 keypair and use encapsulation key as challenge\n const { encapsulationKey, decapsulationKey } = generateMlKem768Keypair();\n\n // Store decapsulation key for later use\n this.decapsulationKey = decapsulationKey;\n\n // Generate a cryptographically secure nonce for attestation\n const nonceBytes = randomBytes(32); // 256-bit nonce\n\n // Store original bytes for verification\n this.handshakeNonce = nonceBytes;\n\n const request = new HandshakeV1RequestMessage({\n challenge: encapsulationKey, // ML-KEM-768 encapsulation key (will be encoded to hex by the message class)\n nonce: nonceBytes, // User data nonce for attestation document\n traceContext,\n });\n\n const response = await this.sendRequest<any>(request);\n\n // Extract shared secret from response using ML-KEM decapsulation\n const responseData = response.getData();\n if (\n responseData.encapsulatedSharedSecret &&\n responseData.connectionId &&\n this.decapsulationKey\n ) {\n // Use the server's connection ID for consistent key derivation\n this.connectionId = responseData.connectionId;\n\n // Convert hex string back to bytes for decapsulation\n const cipherText = hexToBytes(responseData.encapsulatedSharedSecret);\n\n // Perform ML-KEM decapsulation to derive shared secret\n this.sharedSecret = decapsulateMlKem768(\n this.decapsulationKey,\n cipherText\n );\n }\n\n // Verify attestation document (store promise for later await)\n if (\n this.attestationVerifier &&\n responseData.attestationDoc &&\n responseData.encapsulatedSharedSecret &&\n !this.options.bypassAttestation\n ) {\n // Convert hex string back to bytes for challenge verification\n const cipherText = hexToBytes(responseData.encapsulatedSharedSecret);\n\n // Store promise - method already throws on failure\n this.attestationPromise = this.verifyAttestationDocument(\n responseData.attestationDoc,\n cipherText\n );\n }\n\n return response;\n }\n\n async signMessage(params: {\n keyshare: any; // Keyshare object from Dynamic Wallet SDK\n message: Uint8Array | string; // Message to sign (supports hex string or Uint8Array)\n relayDomain: string;\n signingAlgo: SigningAlgorithm;\n hashAlgo?: HashAlgorithm;\n derivationPath?: Uint32Array;\n tweak?: Uint8Array;\n roomUuid: string; // MPC room UUID for signing ceremony\n traceContext?: TraceContext;\n userId?: string;\n walletId?: string;\n environmentId?: string;\n }): Promise<any> {\n // Ensure connection is active and handshake is completed (auto-connect if needed)\n const { sharedSecret, connectionId } = await this.ensureWsConnection();\n\n // Convert hex string to Uint8Array if needed\n let messageToSign: Uint8Array;\n if (typeof params.message === 'string') {\n // Handle hex strings (with or without 0x prefix)\n const cleanHex = params.message.startsWith('0x')\n ? params.message.slice(2)\n : params.message;\n messageToSign = hexToBytes(cleanHex);\n } else {\n // Already a Uint8Array\n messageToSign = params.message;\n }\n\n // Encrypt the keyshare using AES-256-GCM\n const encryptedKeyshare = await encryptKeyshare(\n params.keyshare,\n sharedSecret,\n connectionId,\n params.signingAlgo as unknown as SigningAlgorithmName\n );\n\n const request = new SignMessageV1RequestMessage({\n relayDomain: params.relayDomain,\n signingAlgo: params.signingAlgo,\n hashAlgo: params.hashAlgo,\n derivationPath: params.derivationPath,\n tweak: params.tweak,\n keyshare: encryptedKeyshare,\n message: messageToSign, // Always pass Uint8Array to the message class\n roomUuid: params.roomUuid,\n traceContext: params.traceContext,\n userId: params.userId,\n walletId: params.walletId,\n environmentId: params.environmentId,\n });\n\n return this.sendRequest<any>(request);\n }\n\n /**\n * Perform MPC keygen for ECDSA and BIP340 algorithms\n * For ED25519, use sampleKey() or receiveKey() methods instead\n */\n async keygen(params: {\n keygenInit: { keygenId: string; keygenSecret: string };\n relayDomain: string;\n signingAlgo: SigningAlgorithm;\n roomUuid: string;\n numParties: number;\n threshold: number;\n keygenIds: string[];\n traceContext?: TraceContext;\n userId?: string;\n environmentId?: string;\n }): Promise<{ pubkey: Uint8Array; secretShare: string }> {\n // Validate algorithm (only ECDSA and BIP340 supported)\n if (params.signingAlgo === SigningAlgorithm.ED25519) {\n throw new Error(\n 'ED25519 keygen not supported via keygen() method. Use sampleKey() or receiveKey() instead.'\n );\n }\n\n // Ensure connection is active and handshake is completed (auto-connect if needed)\n const { sharedSecret, connectionId } = await this.ensureWsConnection();\n\n // Encrypt the keygen init data\n const encryptedKeygenInit = encryptKeygenInit(\n params.keygenInit,\n sharedSecret,\n connectionId\n );\n\n // Create ECDSA or BIP340 keygen request\n // The message encoder will convert the enum to lowercase on the wire\n const request = new KeygenV1RequestMessage({\n relayDomain: params.relayDomain,\n signingAlgo: params.signingAlgo,\n roomUuid: params.roomUuid,\n numParties: params.numParties,\n threshold: params.threshold,\n keygenInit: encryptedKeygenInit,\n keygenIds: params.keygenIds,\n traceContext: params.traceContext,\n userId: params.userId,\n environmentId: params.environmentId,\n });\n\n // Send request and get encrypted response\n const response = await this.sendRequest<any>(request);\n const responseData = response.getData();\n\n // Decrypt the keygen result\n const keygenResult = decryptKeygenResult(\n responseData.keygenResult,\n sharedSecret,\n connectionId\n );\n\n return keygenResult;\n }\n\n /**\n * Receive an ED25519 key (one party receives the key generated by another)\n * Uses ExportableEd25519 - the receiving party gets the key sampled by another party\n */\n async receiveKey(params: {\n keygenInit: { keygenId: string; keygenSecret: string };\n relayDomain: string;\n roomUuid: string;\n numParties: number;\n threshold: number;\n keygenIds: string[];\n traceContext?: TraceContext;\n userId?: string;\n environmentId?: string;\n }): Promise<{ pubkey: Uint8Array; secretShare: string }> {\n // Ensure connection is active and handshake is completed (auto-connect if needed)\n const { sharedSecret, connectionId } = await this.ensureWsConnection();\n\n // Encrypt the keygen init data\n const encryptedKeygenInit = encryptKeygenInit(\n params.keygenInit,\n sharedSecret,\n connectionId\n );\n\n // Create receiveKey request\n const request = new ReceiveKeyV1RequestMessage({\n relayDomain: params.relayDomain,\n signingAlgo: 'ed25519',\n roomUuid: params.roomUuid,\n numParties: params.numParties,\n threshold: params.threshold,\n keygenInit: encryptedKeygenInit,\n keygenIds: params.keygenIds,\n traceContext: params.traceContext,\n userId: params.userId,\n environmentId: params.environmentId,\n });\n\n // Send request and get encrypted response\n const response = await this.sendRequest<any>(request);\n const responseData = response.getData();\n\n // Decrypt the keygen result\n const keygenResult = decryptKeygenResult(\n responseData.keygenResult,\n sharedSecret,\n connectionId\n );\n\n return keygenResult;\n }\n\n get connected(): boolean {\n return this.isConnected;\n }\n\n /**\n * Generate a unique connection ID\n */\n\n /**\n * Verify attestation document from handshake response\n * Uses base64-encoded attestation document directly\n */\n private async verifyAttestationDocument(\n attestationDocBase64: string,\n cipherText: Uint8Array\n ): Promise<void> {\n if (!this.attestationVerifier) {\n return; // No verifier configured\n }\n\n try {\n // Generate the expected challenge (hash of cipher text from ML-KEM encapsulation)\n const challengeHash = sha256(cipherText);\n const expectedChallenge = Array.from(challengeHash)\n .map((b: number) => b.toString(16).padStart(2, '0'))\n .join('');\n\n // Verify the attestation document directly with base64 string (no conversion needed!)\n // Nonce is required for security (prevents replay attacks)\n if (!this.handshakeNonce) {\n throw new Error(\n 'Nonce not found - handshake may not have completed properly'\n );\n }\n\n const result = await this.attestationVerifier.verify(\n attestationDocBase64,\n expectedChallenge,\n this.handshakeNonce\n );\n\n if (!result.valid) {\n const errorMsg = `Attestation verification failed: ${result.errors.join(\n ', '\n )}`;\n this.emit('error', new Error(errorMsg));\n throw new Error(errorMsg);\n }\n\n // Emit success event with verification result\n this.emit('message', {\n type: 'attestation-verified',\n timestamp: Date.now(),\n data: result,\n } as any);\n } catch (error) {\n const errorMsg = `Attestation verification error: ${\n error instanceof Error ? error.message : String(error)\n }`;\n this.emit('error', new Error(errorMsg));\n throw new Error(errorMsg);\n }\n }\n}\n","import {\n type WebSocketError,\n WebSocketCloseCode,\n} from '@dynamic-labs-wallet/forward-mpc-shared';\n\nexport { WebSocketCloseCode };\n\n// ─── Error codes ──────────────────────────────────────────────────────────────\n\nexport const ErrorCode = {\n // Transport\n CONNECTION_FAILED: 'CONNECTION_FAILED',\n CONNECTION_TIMEOUT: 'CONNECTION_TIMEOUT',\n NOT_CONNECTED: 'NOT_CONNECTED',\n // Session\n HANDSHAKE_FAILED: 'HANDSHAKE_FAILED',\n HANDSHAKE_INVALID_RESPONSE: 'HANDSHAKE_INVALID_RESPONSE',\n ATTESTATION_FAILED: 'ATTESTATION_FAILED',\n ATTESTATION_PCR_MISMATCH: 'ATTESTATION_PCR_MISMATCH',\n ATTESTATION_CHALLENGE_MISMATCH: 'ATTESTATION_CHALLENGE_MISMATCH',\n ATTESTATION_NONCE_MISMATCH: 'ATTESTATION_NONCE_MISMATCH',\n ATTESTATION_NONCE_MISSING: 'ATTESTATION_NONCE_MISSING',\n ATTESTATION_DOCUMENT_MISSING: 'ATTESTATION_DOCUMENT_MISSING',\n REQUEST_TIMEOUT: 'REQUEST_TIMEOUT',\n SESSION_DISPOSED: 'SESSION_DISPOSED',\n SERVER_ERROR: 'SERVER_ERROR',\n MESSAGE_PARSE_FAILED: 'MESSAGE_PARSE_FAILED',\n // Client\n SESSION_ESTABLISH_FAILED: 'SESSION_ESTABLISH_FAILED',\n UNSUPPORTED_ALGORITHM: 'UNSUPPORTED_ALGORITHM',\n} as const;\n\nexport type ErrorCode = (typeof ErrorCode)[keyof typeof ErrorCode];\n\n/**\n * Focused subset of ErrorCode for attestation verification failures.\n * Use with `error.code` to distinguish failure modes on SessionAttestationError.\n */\nexport const AttestationErrorCode = {\n /** Generic / unrecognised attestation failure */\n FAILED: ErrorCode.ATTESTATION_FAILED,\n /** PCR8 hash mismatch — enclave measurement changed */\n PCR_MISMATCH: ErrorCode.ATTESTATION_PCR_MISMATCH,\n /** Challenge / ciphertext binding mismatch */\n CHALLENGE_MISMATCH: ErrorCode.ATTESTATION_CHALLENGE_MISMATCH,\n /** Nonce value mismatch — possible tampering */\n NONCE_MISMATCH: ErrorCode.ATTESTATION_NONCE_MISMATCH,\n /** Nonce field missing from attestation document */\n NONCE_MISSING: ErrorCode.ATTESTATION_NONCE_MISSING,\n /** Server did not return an attestation document */\n DOCUMENT_MISSING: ErrorCode.ATTESTATION_DOCUMENT_MISSING,\n} as const;\n\nexport type AttestationErrorCode =\n (typeof AttestationErrorCode)[keyof typeof AttestationErrorCode];\n\n// ─── Error types ──────────────────────────────────────────────────────────────\n\nexport const ForwardMPCErrorType = {\n TRANSPORT: 'transport',\n SESSION: 'session',\n CLIENT: 'client',\n} as const;\n\nexport type ForwardMPCErrorType =\n (typeof ForwardMPCErrorType)[keyof typeof ForwardMPCErrorType];\n\n// ─── Root base class ──────────────────────────────────────────────────────────\n\n/**\n * Abstract root for all Forward MPC errors.\n * `instanceof ForwardMPCError` is true for every error thrown by this library.\n */\nexport abstract class ForwardMPCError extends Error {\n public readonly code: ErrorCode;\n public readonly type: ForwardMPCErrorType;\n public readonly context?: Record<string, unknown>;\n\n constructor(\n message: string,\n code: ErrorCode,\n type: ForwardMPCErrorType,\n context?: Record<string, unknown>\n ) {\n super(message);\n this.name = this.constructor.name;\n this.code = code;\n this.type = type;\n this.context = context;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n message: this.message,\n code: this.code,\n type: this.type,\n stack: this.stack,\n context: this.context,\n };\n }\n}\n\n// ─── Layer base classes ───────────────────────────────────────────────────────\n\n/** Abstract base for errors originating from the WebSocket / transport layer. */\nexport abstract class TransportError extends ForwardMPCError {\n constructor(\n message: string,\n code: ErrorCode,\n context?: Record<string, unknown>\n ) {\n super(message, code, ForwardMPCErrorType.TRANSPORT, context);\n }\n}\n\n/** Abstract base for errors originating from the session / crypto / protocol layer. */\nexport abstract class SessionError extends ForwardMPCError {\n constructor(\n message: string,\n code: ErrorCode,\n context?: Record<string, unknown>\n ) {\n super(message, code, ForwardMPCErrorType.SESSION, context);\n }\n}\n\n/** Abstract base for errors originating from the client / application layer. */\nexport abstract class ClientError extends ForwardMPCError {\n constructor(\n message: string,\n code: ErrorCode,\n context?: Record<string, unknown>\n ) {\n super(message, code, ForwardMPCErrorType.CLIENT, context);\n }\n}\n\n// ─── Transport errors ─────────────────────────────────────────────────────────\n\nexport class TransportConnectionError extends TransportError {\n constructor(context?: Record<string, unknown>) {\n super('WebSocket connection failed', ErrorCode.CONNECTION_FAILED, context);\n }\n}\n\nexport class TransportConnectionTimeoutError extends TransportError {\n constructor(context?: Record<string, unknown>) {\n super(\n 'WebSocket connection timed out',\n ErrorCode.CONNECTION_TIMEOUT,\n context\n );\n }\n}\n\nexport class TransportNotConnectedError extends TransportError {\n constructor(context?: Record<string, unknown>) {\n super('WebSocket is not connected', ErrorCode.NOT_CONNECTED, context);\n }\n}\n\n// ─── Session errors ───────────────────────────────────────────────────────────\n\nexport class SessionHandshakeError extends SessionError {\n constructor(reason: string, context?: Record<string, unknown>) {\n super(\n `ML-KEM-768 handshake failed: ${reason}`,\n ErrorCode.HANDSHAKE_FAILED,\n { reason, ...context }\n );\n }\n}\n\nexport class SessionHandshakeInvalidResponseError extends SessionError {\n constructor(context?: Record<string, unknown>) {\n super(\n 'Handshake response was invalid or incomplete',\n ErrorCode.HANDSHAKE_INVALID_RESPONSE,\n context\n );\n }\n}\n\n/**\n * Attestation verification failure.\n * Use `error.code` to distinguish failure reasons (e.g. ATTESTATION_PCR_MISMATCH)\n * and `error.cause` to inspect the original verifier error.\n */\nexport class SessionAttestationError extends SessionError {\n public readonly cause?: unknown;\n\n constructor(\n message: string = 'Attestation verification failed',\n code: ErrorCode = ErrorCode.ATTESTATION_FAILED,\n context?: Record<string, unknown>,\n cause?: unknown\n ) {\n super(message, code, context);\n if (cause !== undefined) {\n this.cause = cause;\n }\n }\n}\n\nexport class SessionRequestTimeoutError extends SessionError {\n constructor(context?: Record<string, unknown>) {\n super(\n 'Request timed out waiting for server response',\n ErrorCode.REQUEST_TIMEOUT,\n context\n );\n }\n}\n\nexport class SessionDisposedError extends SessionError {\n constructor(context?: Record<string, unknown>) {\n super('Session has been disposed', ErrorCode.SESSION_DISPOSED, context);\n }\n}\n\nexport class SessionServerError extends SessionError {\n constructor(reason: string, context?: Record<string, unknown>) {\n super(\n `Server returned an error response: ${reason}`,\n ErrorCode.SERVER_ERROR,\n { reason, ...context }\n );\n }\n}\n\nexport class SessionMessageParseError extends SessionError {\n constructor(context?: Record<string, unknown>) {\n super(\n 'Failed to parse server message',\n ErrorCode.MESSAGE_PARSE_FAILED,\n context\n );\n }\n}\n\n/**\n * The remote server returned an explicit error response.\n * Carries the full WebSocketError payload so callers can inspect\n * `serverError.type` and `serverError.details`.\n */\nexport class SessionRemoteError extends SessionError {\n constructor(\n public readonly serverError: WebSocketError,\n context?: Record<string, unknown>\n ) {\n super(serverError.message, ErrorCode.SERVER_ERROR, context);\n }\n}\n\n// ─── Client errors ────────────────────────────────────────────────────────────\n\nexport class ClientUnsupportedAlgorithmError extends ClientError {\n constructor(context?: Record<string, unknown>) {\n super(\n 'Signing algorithm is not supported',\n ErrorCode.UNSUPPORTED_ALGORITHM,\n context\n );\n }\n}\n\nexport class ClientSessionEstablishFailedError extends ClientError {\n constructor(context?: Record<string, unknown>) {\n super(\n 'Failed to establish session',\n ErrorCode.SESSION_ESTABLISH_FAILED,\n context\n );\n }\n}\n","import EventEmitter from 'eventemitter3';\nimport { WebSocket } from 'isows';\nimport {\n TransportConnectionError,\n TransportConnectionTimeoutError,\n TransportNotConnectedError,\n WebSocketCloseCode,\n} from './errors';\nimport { type Logger } from './logger';\n\nexport interface ForwardMPCTransportOptions {\n reconnectAttempts?: number;\n reconnectInterval?: number;\n connectionTimeout?: number;\n logger?: Logger;\n}\n\nexport interface TransportEvents {\n connected: () => void;\n disconnected: (closeCode: number) => void;\n error: (error: Error) => void;\n message: (data: string) => void;\n}\n\nexport class ForwardMPCTransport extends EventEmitter<TransportEvents> {\n private ws: WebSocket | null = null;\n private _isConnected = false;\n private _destroyed = false;\n private _hadSuccessfulConnection = false;\n private _midSessionReconnectCount = 0;\n private _connectPromise: Promise<void> | null = null;\n private readonly options: Required<\n Omit<ForwardMPCTransportOptions, 'logger'>\n >;\n private readonly logger?: Logger;\n\n constructor(\n private readonly url: string,\n options: ForwardMPCTransportOptions = {}\n ) {\n super();\n this.logger = options.logger;\n this.options = {\n reconnectAttempts: options.reconnectAttempts ?? 1,\n reconnectInterval: options.reconnectInterval ?? 1000,\n connectionTimeout: options.connectionTimeout ?? 10000,\n };\n }\n\n get connected(): boolean {\n return this._isConnected;\n }\n\n /**\n * Opens the WebSocket connection. Concurrent callers coalesce on a single\n * in-flight promise. `reconnectAttempts` controls how many silent retries\n * are attempted before the promise rejects (default: 1 retry = 2 total tries).\n */\n async connect(): Promise<void> {\n this._destroyed = false;\n if (this._isConnected) return;\n if (this._connectPromise) return this._connectPromise;\n\n this._connectPromise = this._connectWithRetry().finally(() => {\n this._connectPromise = null;\n });\n return this._connectPromise;\n }\n\n disconnect(): void {\n this._destroyed = true;\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n this._isConnected = false;\n this.emit('disconnected', WebSocketCloseCode.NORMAL);\n }\n\n send(data: string): void {\n if (!this._isConnected || !this.ws) {\n throw new TransportNotConnectedError();\n }\n this.ws.send(data);\n }\n\n /**\n * Attempts the initial connection, then silently retries up to\n * `reconnectAttempts` times before surfacing an error.\n */\n private async _connectWithRetry(): Promise<void> {\n let lastError: unknown;\n for (\n let attempt = 0;\n attempt <= this.options.reconnectAttempts;\n attempt++\n ) {\n try {\n await this._connectOnce();\n return;\n } catch (error) {\n lastError = error;\n }\n }\n throw lastError;\n }\n\n private _connectOnce(): Promise<void> {\n return new Promise((resolve, reject) => {\n const timeoutHandle = setTimeout(() => {\n this.ws?.close();\n reject(new TransportConnectionTimeoutError({ url: this.url }));\n }, this.options.connectionTimeout);\n\n this.ws = new WebSocket(this.url);\n\n this.ws.onopen = () => {\n clearTimeout(timeoutHandle);\n this._isConnected = true;\n this._hadSuccessfulConnection = true;\n this._midSessionReconnectCount = 0;\n this.logger?.debug('MPC Socket connected', { url: this.url });\n this.emit('connected');\n resolve();\n };\n\n this.ws.onerror = () => {\n clearTimeout(timeoutHandle);\n const err = new TransportConnectionError({ url: this.url });\n this.emit('error', err);\n reject(err);\n };\n\n this.ws.onmessage = (event: MessageEvent) => {\n this.logger?.debug('MPC Socket message received', { data: event.data });\n this.emit('message', event.data as string);\n };\n\n this.ws.onclose = (event: { code: number }) => {\n this._isConnected = false;\n this.logger?.debug('MPC Socket closed', {\n url: this.url,\n closeCode: event.code,\n });\n if (!this._destroyed) {\n this.emit('disconnected', event.code);\n }\n this.maybeReconnect(event.code);\n };\n });\n }\n\n /**\n * Attempts mid-session reconnects after a drop, up to `reconnectAttempts`\n * times. Only fires when a successful connection was previously established\n * and the close was unexpected (not a normal or idle-timeout close).\n */\n private maybeReconnect(closeCode: number): void {\n if (this._destroyed) return;\n if (!this._hadSuccessfulConnection) return;\n if (this._midSessionReconnectCount >= this.options.reconnectAttempts)\n return;\n if (\n closeCode === WebSocketCloseCode.NORMAL ||\n closeCode === WebSocketCloseCode.IDLE_TIMEOUT\n ) {\n this.logger?.debug('MPC Socket closed gracefully — not reconnecting', {\n url: this.url,\n closeCode,\n });\n return;\n }\n\n this._midSessionReconnectCount++;\n this.logger?.debug('MPC Socket disconnected — attempting reconnect', {\n url: this.url,\n attempt: this._midSessionReconnectCount,\n maxAttempts: this.options.reconnectAttempts,\n });\n\n setTimeout(() => {\n this._connectOnce().catch((error) => {\n const err = error instanceof Error ? error : new Error(String(error));\n this.logger?.debug(\n 'MPC Socket reconnect failed',\n { attempt: this._midSessionReconnectCount },\n err\n );\n this.logger?.error('Connection failed to MPC socket server');\n this.emit('error', err);\n });\n }, this.options.reconnectInterval);\n }\n}\n","import {\n HandshakeV1RequestMessage,\n messageRegistry,\n generateMlKem768Keypair,\n decapsulateMlKem768,\n type TraceContext,\n type WebSocketError,\n type HandshakeResponseData,\n} from '@dynamic-labs-wallet/forward-mpc-shared';\nimport { hexToBytes, randomBytes } from '@noble/hashes/utils.js';\nimport { sha256 } from '@noble/hashes/sha2.js';\nimport { either } from 'fp-ts';\nimport { ForwardMPCTransport } from './transport';\nimport { type AttestationVerifier } from '../attestation/types';\nimport {\n SessionHandshakeError,\n SessionHandshakeInvalidResponseError,\n SessionAttestationError,\n ErrorCode,\n SessionRequestTimeoutError,\n SessionDisposedError,\n SessionMessageParseError,\n SessionRemoteError,\n} from './errors';\nimport { type Logger } from './logger';\n\nexport interface SessionOptions {\n attestationVerifier?: AttestationVerifier;\n bypassAttestation?: boolean;\n requestTimeout?: number;\n}\n\ninterface DecodedMessage {\n type: string;\n getData(): unknown;\n error?: unknown;\n}\n\nfunction isWebSocketError(v: unknown): v is WebSocketError {\n return (\n typeof v === 'object' &&\n v !== null &&\n typeof (v as Record<string, unknown>)['message'] === 'string' &&\n typeof (v as Record<string, unknown>)['type'] === 'string'\n );\n}\n\nexport class Session {\n private _disposed = false;\n private readonly _abort = new AbortController();\n\n /**\n * Session is only constructed with fully-validated crypto material.\n * All handshake and attestation work is done in the static handshake() factory\n * before this constructor is called.\n */\n private constructor(\n private readonly transport: ForwardMPCTransport,\n private readonly _connectionId: string,\n private readonly _sharedSecret: Uint8Array,\n private readonly requestTimeout: number,\n private readonly logger?: Logger\n ) {}\n\n get connectionId(): string {\n return this._connectionId;\n }\n\n get sharedSecret(): Uint8Array {\n if (this._disposed) {\n throw new SessionDisposedError();\n }\n return this._sharedSecret;\n }\n\n /**\n * Performs the ML-KEM-768 handshake over an established transport connection\n * and returns a fully authenticated Session. All crypto material is derived\n * before the Session object is created — the constructor never receives\n * partially-initialised state.\n *\n * Attestation is verified (when configured) before the Session is returned.\n */\n static async handshake(\n transport: ForwardMPCTransport,\n traceContext?: TraceContext,\n options: SessionOptions = {},\n logger?: Logger\n ): Promise<Session> {\n const requestTimeout = options.requestTimeout ?? 30000;\n const { encapsulationKey, decapsulationKey } = generateMlKem768Keypair();\n const nonceBytes = randomBytes(32);\n\n const request = new HandshakeV1RequestMessage({\n challenge: encapsulationKey,\n nonce: nonceBytes,\n traceContext,\n });\n\n let data: HandshakeResponseData;\n try {\n data = await Session.doRequest<HandshakeResponseData>(\n transport,\n request,\n requestTimeout\n );\n } catch (error) {\n decapsulationKey.fill(0);\n nonceBytes.fill(0);\n const message = error instanceof Error ? error.message : String(error);\n throw new SessionHandshakeError(message);\n }\n\n if (!data.encapsulatedSharedSecret || !data.connectionId) {\n decapsulationKey.fill(0);\n nonceBytes.fill(0);\n throw new SessionHandshakeInvalidResponseError();\n }\n\n const connectionId = data.connectionId;\n const cipherText = hexToBytes(data.encapsulatedSharedSecret);\n const sharedSecret = decapsulateMlKem768(decapsulationKey, cipherText);\n decapsulationKey.fill(0);\n\n if (options.attestationVerifier && !options.bypassAttestation) {\n if (!data.attestationDoc) {\n sharedSecret.fill(0);\n nonceBytes.fill(0);\n throw new SessionAttestationError(\n 'Server did not return an attestation document',\n ErrorCode.ATTESTATION_DOCUMENT_MISSING\n );\n }\n try {\n await Session.verifyAttestation(\n data.attestationDoc,\n cipherText,\n nonceBytes,\n options.attestationVerifier\n );\n } catch (error) {\n sharedSecret.fill(0);\n nonceBytes.fill(0);\n throw error;\n }\n }\n\n nonceBytes.fill(0);\n logger?.debug('Handshake completed', { connectionId });\n\n return new Session(\n transport,\n connectionId,\n sharedSecret,\n requestTimeout,\n logger\n );\n }\n\n sendRequest<T>(message: unknown): Promise<T> {\n if (this._disposed) {\n return Promise.reject(new SessionDisposedError());\n }\n return Session.doRequest<T>(\n this.transport,\n message,\n this.requestTimeout,\n this._abort.signal\n );\n }\n\n dispose(): void {\n if (this._disposed) return;\n this._disposed = true;\n this._abort.abort();\n this._sharedSecret.fill(0);\n this.logger?.debug('Session disposed', {\n connectionId: this._connectionId,\n });\n }\n\n /**\n * Sends a single request and resolves with the decoded response data.\n * Used by both handshake() and sendRequest(). The optional AbortSignal\n * allows dispose() to cancel all in-flight requests immediately.\n */\n private static doRequest<T>(\n transport: ForwardMPCTransport,\n message: unknown,\n timeout: number,\n signal?: AbortSignal\n ): Promise<T> {\n const requestId = Session.generateRequestId();\n\n return new Promise<T>((resolve, reject) => {\n if (signal?.aborted) {\n reject(new SessionDisposedError());\n return;\n }\n\n const cleanup = () => {\n clearTimeout(timeoutHandle);\n transport.off('message', handler);\n signal?.removeEventListener('abort', onAbort);\n };\n\n const onAbort = () => {\n cleanup();\n reject(new SessionDisposedError());\n };\n\n signal?.addEventListener('abort', onAbort, { once: true });\n\n const timeoutHandle = setTimeout(() => {\n cleanup();\n reject(new SessionRequestTimeoutError({ requestId }));\n }, timeout);\n\n const handler = (rawData: string) => {\n let parsed: Record<string, unknown>;\n try {\n parsed = JSON.parse(rawData);\n } catch {\n return;\n }\n if (parsed['requestId'] !== requestId) return;\n\n cleanup();\n\n const { requestId: _rid, ...body } = parsed;\n\n // Attempt decode; treat both thrown exceptions and Left results as parse failures.\n let msg: DecodedMessage | null = null;\n try {\n const result = messageRegistry.decode(body);\n if (either.isRight(result)) msg = result.right as DecodedMessage;\n } catch {\n /* fall through to null check below */\n }\n\n if (msg === null) {\n reject(new SessionMessageParseError({ requestId }));\n return;\n }\n\n if (msg.type === 'error') {\n reject(\n isWebSocketError(msg.error)\n ? new SessionRemoteError(msg.error)\n : new SessionMessageParseError({ requestId })\n );\n } else {\n const data = msg.getData() as T;\n const maybeError =\n data !== null && typeof data === 'object' && 'error' in data\n ? (data as Record<string, unknown>).error\n : undefined;\n if (isWebSocketError(maybeError)) {\n reject(new SessionRemoteError(maybeError));\n } else {\n resolve(data);\n }\n }\n };\n\n transport.on('message', handler);\n\n try {\n transport.send(Session.serializeWithRequestId(message, requestId));\n } catch (error) {\n cleanup();\n reject(error instanceof Error ? error : new Error(String(error)));\n }\n });\n }\n\n /**\n * Serialises a message with the given requestId injected without mutating\n * the original message object. Handles both encodeable (registry) messages\n * and plain objects.\n */\n private static serializeWithRequestId(\n message: unknown,\n requestId: string\n ): string {\n const msg = message as Record<string, unknown>;\n if (typeof msg['encode'] === 'function') {\n const encoded: Record<string, unknown> = msg['encode']();\n encoded['requestId'] = requestId;\n return JSON.stringify(encoded);\n }\n return JSON.stringify({ ...msg, requestId });\n }\n\n private static generateRequestId(): string {\n const rand = randomBytes(8);\n return `req_${Array.from(rand)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('')}`;\n }\n\n private static async verifyAttestation(\n attestationDocBase64: string,\n cipherText: Uint8Array,\n nonce: Uint8Array,\n verifier: AttestationVerifier\n ): Promise<void> {\n const challengeHash = sha256(cipherText);\n const expectedChallenge = Array.from(challengeHash)\n .map((b: number) => b.toString(16).padStart(2, '0'))\n .join('');\n\n const result = await verifier.verify(\n attestationDocBase64,\n expectedChallenge,\n nonce\n );\n\n if (!result.valid) {\n const primaryError = result.errors[0] || '';\n throw new SessionAttestationError(\n 'Attestation verification failed',\n Session.classifyAttestationError(primaryError),\n { errors: result.errors },\n primaryError\n );\n }\n }\n\n /**\n * Classifies an attestation verifier error message into a specific ErrorCode.\n */\n private static classifyAttestationError(primaryError: string): ErrorCode {\n if (primaryError.includes('PCR verification failed')) {\n return ErrorCode.ATTESTATION_PCR_MISMATCH;\n }\n if (\n primaryError.includes('challenge mismatch') ||\n primaryError.includes('ciphertext hash') ||\n primaryError.includes('user data') ||\n primaryError.includes('ciphertext binding')\n ) {\n return ErrorCode.ATTESTATION_CHALLENGE_MISMATCH;\n }\n if (primaryError.includes('No nonce found')) {\n return ErrorCode.ATTESTATION_NONCE_MISSING;\n }\n if (\n primaryError.includes('nonce mismatch') ||\n primaryError.includes('Nonce length mismatch') ||\n primaryError.includes('Nonce verification failed')\n ) {\n return ErrorCode.ATTESTATION_NONCE_MISMATCH;\n }\n return ErrorCode.ATTESTATION_FAILED;\n }\n}\n","/**\n * When an ExternalLogger is provided, the library routes all log calls through\n * it. The signature matches the Datadog Browser SDK logger so that the same\n * instance can be passed directly.\n *\n * Compatible with the Datadog Browser SDK logger interface (@datadog/browser-logs).\n */\nexport interface ExternalLogger {\n debug(message: string, messageContext?: object, error?: Error): void;\n info(message: string, messageContext?: object, error?: Error): void;\n warn(message: string, messageContext?: object, error?: Error): void;\n error(message: string, messageContext?: object, error?: Error): void;\n}\n\nexport class Logger {\n private readonly MESSAGE_PREFIX = '[DynamicMpcClient]';\n constructor(private readonly externalLogger?: ExternalLogger) {}\n\n debug(message: string, messageContext?: object, error?: Error): void {\n this.externalLogger?.debug(\n `${this.MESSAGE_PREFIX} ${message}`,\n messageContext,\n error\n );\n }\n\n info(message: string, messageContext?: object, error?: Error): void {\n this.externalLogger?.info(\n `${this.MESSAGE_PREFIX} ${message}`,\n messageContext,\n error\n );\n }\n\n warn(message: string, messageContext?: object, error?: Error): void {\n this.externalLogger?.warn(\n `${this.MESSAGE_PREFIX} ${message}`,\n messageContext,\n error\n );\n }\n\n error(message: string, messageContext?: object, error?: Error): void {\n this.externalLogger?.error(\n `${this.MESSAGE_PREFIX} ${message}`,\n messageContext,\n error\n );\n }\n}\n","import EventEmitter from 'eventemitter3';\nimport {\n SignMessageV1RequestMessage,\n KeygenV1RequestMessage,\n ReceiveKeyV1RequestMessage,\n encryptKeyshare,\n encryptKeygenInit,\n decryptKeygenResult,\n fromDynamicSigningAlgorithm,\n type TraceContext,\n type SignMessageResponseData,\n type KeygenResponseData,\n type ReceiveKeyResponseData,\n} from '@dynamic-labs-wallet/forward-mpc-shared';\nimport { hexToBytes } from '@noble/hashes/utils.js';\nimport { NitroAttestationVerifier } from '../attestation';\nimport {\n type AttestationVerificationConfig,\n type AttestationVerifier,\n} from '../attestation/types';\nimport {\n ForwardMPCTransport,\n type ForwardMPCTransportOptions,\n} from './transport';\nimport { Session, type SessionOptions } from './session';\nimport {\n SessionServerError,\n ClientUnsupportedAlgorithmError,\n ClientSessionEstablishFailedError,\n} from './errors';\nimport { Logger, type ExternalLogger } from './logger';\nimport {\n type SignMessageParams,\n type KeygenParams,\n type ReceiveKeyParams,\n type SignMessageResult,\n type KeygenResult,\n type ReceiveKeyResult,\n SigningAlgorithm,\n} from './types';\n\nexport interface ForwardMPCClientV2Options {\n // Transport\n reconnectAttempts?: number;\n reconnectInterval?: number;\n connectionTimeout?: number;\n // Session\n requestTimeout?: number;\n // Attestation\n attestationConfig?: AttestationVerificationConfig;\n attestationVerifier?: AttestationVerifier;\n /**\n * Disables attestation verification. DO NOT use in production.\n * @deprecated Use only for local development and testing.\n */\n dangerouslyBypassAttestation?: boolean;\n // Logging\n logger?: ExternalLogger;\n}\n\nexport interface ClientV2Events {\n connected: () => void;\n disconnected: (closeCode: number) => void;\n error: (error: Error) => void;\n}\n\nexport class ForwardMPCClientV2 extends EventEmitter<ClientV2Events> {\n protected readonly url: string;\n protected readonly options: ForwardMPCClientV2Options;\n private readonly transport: ForwardMPCTransport;\n private readonly sessionOptions: SessionOptions;\n private readonly logger: Logger;\n private session: Session | null = null;\n private _connectPromise: Promise<void> | null = null;\n private _handshaking = false;\n private _disconnectedIntentionally = false;\n\n constructor(url: string, options: ForwardMPCClientV2Options = {}) {\n super();\n\n this.url = url;\n this.options = options;\n if (options.dangerouslyBypassAttestation) {\n console.warn(\n '[ForwardMPCClientV2] dangerouslyBypassAttestation is enabled — ' +\n 'attestation verification is disabled. Do not use in production.'\n );\n } else if (!options.attestationVerifier && !options.attestationConfig) {\n console.warn(\n '[ForwardMPCClientV2] No attestation verifier configured — ' +\n 'connections will not be attested. This is insecure in production.'\n );\n }\n\n this.logger = new Logger(this.options.logger);\n\n const transportOptions: ForwardMPCTransportOptions = {\n reconnectAttempts: this.options.reconnectAttempts,\n reconnectInterval: this.options.reconnectInterval,\n connectionTimeout: this.options.connectionTimeout,\n logger: this.logger,\n };\n\n this.transport = new ForwardMPCTransport(url, transportOptions);\n\n const attestationVerifier =\n options.attestationVerifier ??\n (options.attestationConfig\n ? new NitroAttestationVerifier(options.attestationConfig)\n : undefined);\n\n this.sessionOptions = {\n attestationVerifier,\n bypassAttestation: options.dangerouslyBypassAttestation,\n requestTimeout: options.requestTimeout,\n };\n\n this.transport.on('connected', () => this.onTransportConnected());\n this.transport.on('disconnected', (closeCode) =>\n this.onTransportDisconnected(closeCode)\n );\n this.transport.on('error', (error) => this.emit('error', error));\n }\n\n get connected(): boolean {\n return this.transport.connected && this.session !== null;\n }\n\n /**\n * Opens the WebSocket connection and performs the ML-KEM-768 handshake.\n * Resolves once the session is fully established (and attested, if configured).\n * Concurrent calls coalesce on a single in-flight promise.\n */\n async connect(traceContext?: TraceContext): Promise<void> {\n if (this.session) return;\n if (this._connectPromise) return this._connectPromise;\n\n this._connectPromise = this._doConnect(traceContext).finally(() => {\n this._connectPromise = null;\n });\n return this._connectPromise;\n }\n\n /**\n * Disposes the current session (zeroing crypto material) and closes the transport.\n */\n disconnect(): void {\n this._disconnectedIntentionally = true;\n this.session?.dispose();\n this.session = null;\n this.transport.disconnect();\n // 'disconnected' will be emitted by onTransportDisconnected when the socket closes\n }\n\n async signMessage(params: SignMessageParams): Promise<SignMessageResult> {\n const session = await this.ensureSession();\n\n let messageToSign: Uint8Array;\n if (typeof params.message === 'string') {\n const hex = params.message.startsWith('0x')\n ? params.message.slice(2)\n : params.message;\n messageToSign = hexToBytes(hex);\n } else {\n messageToSign = params.message;\n }\n\n const encryptedKeyshare = encryptKeyshare(\n params.keyshare,\n session.sharedSecret,\n session.connectionId,\n fromDynamicSigningAlgorithm(params.signingAlgo)\n );\n\n const request = new SignMessageV1RequestMessage({\n relayDomain: params.relayDomain,\n signingAlgo: params.signingAlgo,\n hashAlgo: params.hashAlgo,\n derivationPath: params.derivationPath,\n tweak: params.tweak,\n keyshare: encryptedKeyshare,\n message: messageToSign,\n roomUuid: params.roomUuid,\n traceContext: params.traceContext,\n userId: params.userId,\n environmentId: params.environmentId,\n });\n\n const { signature } =\n await session.sendRequest<SignMessageResponseData>(request);\n\n if (!signature) {\n throw new SessionServerError('No signature in response');\n }\n\n return { signature };\n }\n\n /**\n * MPC key generation for ECDSA and BIP340.\n * ED25519 is not supported here — use receiveKey() instead.\n */\n async keygen(params: KeygenParams): Promise<KeygenResult> {\n if (params.signingAlgo === SigningAlgorithm.ED25519) {\n throw new ClientUnsupportedAlgorithmError();\n }\n\n const session = await this.ensureSession();\n\n const encryptedKeygenInit = encryptKeygenInit(\n params.keygenInit,\n session.sharedSecret,\n session.connectionId\n );\n\n const request = new KeygenV1RequestMessage({\n relayDomain: params.relayDomain,\n signingAlgo: params.signingAlgo,\n roomUuid: params.roomUuid,\n numParties: params.numParties,\n threshold: params.threshold,\n keygenInit: encryptedKeygenInit,\n keygenIds: params.keygenIds,\n traceContext: params.traceContext,\n userId: params.userId,\n environmentId: params.environmentId,\n });\n\n const { keygenResult } =\n await session.sendRequest<KeygenResponseData>(request);\n\n if (!keygenResult) {\n throw new SessionServerError('No keygen result in response');\n }\n\n return decryptKeygenResult(\n keygenResult,\n session.sharedSecret,\n session.connectionId\n );\n }\n\n /**\n * Receives an ED25519 key generated by another party (ExportableEd25519).\n */\n async receiveKey(params: ReceiveKeyParams): Promise<ReceiveKeyResult> {\n const session = await this.ensureSession();\n\n const encryptedKeygenInit = encryptKeygenInit(\n params.keygenInit,\n session.sharedSecret,\n session.connectionId\n );\n\n const request = new ReceiveKeyV1RequestMessage({\n relayDomain: params.relayDomain,\n signingAlgo: 'ed25519',\n roomUuid: params.roomUuid,\n numParties: params.numParties,\n threshold: params.threshold,\n keygenInit: encryptedKeygenInit,\n keygenIds: params.keygenIds,\n traceContext: params.traceContext,\n userId: params.userId,\n environmentId: params.environmentId,\n });\n\n const { keygenResult } =\n await session.sendRequest<ReceiveKeyResponseData>(request);\n\n if (!keygenResult) {\n throw new SessionServerError('No keygen result in response');\n }\n\n return decryptKeygenResult(\n keygenResult,\n session.sharedSecret,\n session.connectionId\n );\n }\n\n /**\n * Ensures an active session exists, auto-connecting if needed.\n */\n private async ensureSession(): Promise<Session> {\n if (this.session) return this.session;\n await this.connect();\n if (!this.session) {\n throw new ClientSessionEstablishFailedError();\n }\n return this.session;\n }\n\n private async _runHandshake(traceContext?: TraceContext): Promise<void> {\n this.session = await Session.handshake(\n this.transport,\n traceContext,\n this.sessionOptions,\n this.logger\n );\n this.emit('connected');\n }\n\n private async _doConnect(traceContext?: TraceContext): Promise<void> {\n this._handshaking = true;\n try {\n await this.transport.connect();\n await this._runHandshake(traceContext);\n } finally {\n this._handshaking = false;\n }\n }\n\n /**\n * Called when the transport connects (both initial and after auto-reconnect).\n * The `_handshaking` flag is set synchronously at the top of `_doConnect`\n * before any await, so it reliably indicates when we already own the handshake.\n *\n * For transport-initiated reconnects, `_connectPromise` is set so that\n * concurrent `connect()` or `ensureSession()` callers coalesce on the\n * in-flight handshake rather than initiating a second one.\n */\n private onTransportConnected(): void {\n if (this._handshaking) return;\n this._handshaking = true;\n\n const doHandshake = async () => {\n try {\n await this._runHandshake();\n } catch (error) {\n this.emit(\n 'error',\n error instanceof Error ? error : new Error(String(error))\n );\n } finally {\n this._handshaking = false;\n this._connectPromise = null;\n }\n };\n\n this._connectPromise = doHandshake();\n }\n\n private onTransportDisconnected(closeCode: number): void {\n const intentional = this._disconnectedIntentionally;\n this._disconnectedIntentionally = false;\n this.session?.dispose();\n this.session = null;\n if (!intentional) {\n this.logger.debug('Unexpected MPC Socket disconnect');\n }\n this.emit('disconnected', closeCode);\n }\n}\n","import { ForwardMPCClientV2 } from './client-v2';\n\n/**\n * @deprecated Use {@link ForwardMPCClientV2} directly and manage the instance\n * lifecycle yourself. This class will be removed in a future version.\n */\nexport class ForwardMPCClientSingleton extends ForwardMPCClientV2 {}\n"]}
|