{"version":3,"file":"index.cjs","sources":["../src/constants/client.ts","../src/constants/history.ts","../src/constants/proposal.ts","../src/constants/session.ts","../src/constants/engine.ts","../src/constants/pendingRequest.ts","../src/constants/verify.ts","../src/constants/auth.ts","../src/controllers/engine.ts","../src/controllers/proposal.ts","../src/controllers/session.ts","../src/controllers/pendingRequest.ts","../src/controllers/authKey.ts","../src/controllers/authPairingTopic.ts","../src/controllers/authRequest.ts","../src/controllers/authStore.ts","../src/client.ts","../src/index.ts"],"sourcesContent":["import { SignClientTypes } from \"@walletconnect/types\";\n\nexport const SIGN_CLIENT_PROTOCOL = \"wc\";\nexport const SIGN_CLIENT_VERSION = 2;\nexport const SIGN_CLIENT_CONTEXT = \"client\";\n\nexport const SIGN_CLIENT_STORAGE_PREFIX = `${SIGN_CLIENT_PROTOCOL}@${SIGN_CLIENT_VERSION}:${SIGN_CLIENT_CONTEXT}:`;\n\nexport const SIGN_CLIENT_DEFAULT = {\n  name: SIGN_CLIENT_CONTEXT,\n  logger: \"error\",\n  controller: false,\n  relayUrl: \"wss://relay.walletconnect.org\",\n};\n\nexport const SIGN_CLIENT_EVENTS: Record<SignClientTypes.Event, SignClientTypes.Event> = {\n  session_proposal: \"session_proposal\",\n  session_update: \"session_update\",\n  session_extend: \"session_extend\",\n  session_ping: \"session_ping\",\n  session_delete: \"session_delete\",\n  session_expire: \"session_expire\",\n  session_request: \"session_request\",\n  session_request_sent: \"session_request_sent\",\n  session_event: \"session_event\",\n  proposal_expire: \"proposal_expire\",\n  session_authenticate: \"session_authenticate\",\n  session_request_expire: \"session_request_expire\",\n  session_connect: \"session_connect\",\n};\n\nexport const SIGN_CLIENT_STORAGE_OPTIONS = {\n  database: \":memory:\",\n};\n\nexport const WALLETCONNECT_DEEPLINK_CHOICE = \"WALLETCONNECT_DEEPLINK_CHOICE\";\n","export const HISTORY_EVENTS = {\n  created: \"history_created\",\n  updated: \"history_updated\",\n  deleted: \"history_deleted\",\n  sync: \"history_sync\",\n};\n\nexport const HISTORY_CONTEXT = \"history\";\n\nexport const HISTORY_STORAGE_VERSION = \"0.3\";\n","import { THIRTY_DAYS } from \"@walletconnect/time\";\n\nexport const PROPOSAL_CONTEXT = \"proposal\";\n\nexport const PROPOSAL_EXPIRY = THIRTY_DAYS;\n\nexport const PROPOSAL_EXPIRY_MESSAGE = \"Proposal expired\";\n","import { SEVEN_DAYS } from \"@walletconnect/time\";\n\nexport const SESSION_CONTEXT = \"session\";\n\nexport const SESSION_EXPIRY = SEVEN_DAYS;\n","import { FIVE_MINUTES, ONE_DAY, ONE_HOUR, SEVEN_DAYS } from \"@walletconnect/time\";\nimport { EngineTypes } from \"@walletconnect/types\";\n\nexport const ENGINE_CONTEXT = \"engine\";\n\nexport const ENGINE_RPC_OPTS: EngineTypes.RpcOptsMap = {\n  wc_sessionPropose: {\n    req: {\n      ttl: FIVE_MINUTES,\n      prompt: true,\n      tag: 1100,\n    },\n    res: {\n      ttl: FIVE_MINUTES,\n      prompt: false,\n      tag: 1101,\n    },\n    reject: {\n      ttl: FIVE_MINUTES,\n      prompt: false,\n      tag: 1120,\n    },\n    autoReject: {\n      ttl: FIVE_MINUTES,\n      prompt: false,\n      tag: 1121,\n    },\n  },\n  wc_sessionSettle: {\n    req: {\n      ttl: FIVE_MINUTES,\n      prompt: false,\n      tag: 1102,\n    },\n    res: {\n      ttl: FIVE_MINUTES,\n      prompt: false,\n      tag: 1103,\n    },\n  },\n  wc_sessionUpdate: {\n    req: {\n      ttl: ONE_DAY,\n      prompt: false,\n      tag: 1104,\n    },\n    res: {\n      ttl: ONE_DAY,\n      prompt: false,\n      tag: 1105,\n    },\n  },\n  wc_sessionExtend: {\n    req: {\n      ttl: ONE_DAY,\n      prompt: false,\n      tag: 1106,\n    },\n    res: {\n      ttl: ONE_DAY,\n      prompt: false,\n      tag: 1107,\n    },\n  },\n  wc_sessionRequest: {\n    req: {\n      ttl: FIVE_MINUTES * 3,\n      prompt: true,\n      tag: 1108,\n    },\n    res: {\n      ttl: FIVE_MINUTES * 3,\n      prompt: false,\n      tag: 1109,\n    },\n  },\n  wc_sessionEvent: {\n    req: {\n      ttl: FIVE_MINUTES,\n      prompt: true,\n      tag: 1110,\n    },\n    res: {\n      ttl: FIVE_MINUTES,\n      prompt: false,\n      tag: 1111,\n    },\n  },\n\n  wc_sessionDelete: {\n    req: {\n      ttl: ONE_DAY,\n      prompt: false,\n      tag: 1112,\n    },\n    res: {\n      ttl: ONE_DAY,\n      prompt: false,\n      tag: 1113,\n    },\n  },\n  wc_sessionPing: {\n    req: {\n      ttl: ONE_DAY,\n      prompt: false,\n      tag: 1114,\n    },\n    res: {\n      ttl: ONE_DAY,\n      prompt: false,\n      tag: 1115,\n    },\n  },\n  wc_sessionAuthenticate: {\n    req: {\n      ttl: ONE_HOUR,\n      prompt: true,\n      tag: 1116,\n    },\n    res: {\n      ttl: ONE_HOUR,\n      prompt: false,\n      tag: 1117,\n    },\n    reject: {\n      ttl: FIVE_MINUTES,\n      prompt: false,\n      tag: 1118,\n    },\n    autoReject: {\n      ttl: FIVE_MINUTES,\n      prompt: false,\n      tag: 1119,\n    },\n  },\n};\n\nexport const SESSION_REQUEST_EXPIRY_BOUNDARIES = {\n  min: FIVE_MINUTES,\n  max: SEVEN_DAYS,\n};\n\nexport const ENGINE_QUEUE_STATES: { idle: \"IDLE\"; active: \"ACTIVE\" } = {\n  idle: \"IDLE\",\n  active: \"ACTIVE\",\n};\n\nexport const TVF_METHODS = {\n  // evm\n  eth_sendTransaction: {\n    key: \"\",\n  },\n  eth_sendRawTransaction: {\n    key: \"\",\n  },\n  wallet_sendCalls: {\n    key: \"\",\n  },\n\n  // solana\n  solana_signTransaction: {\n    key: \"signature\",\n  },\n  solana_signAllTransactions: {\n    key: \"transactions\",\n  },\n  solana_signAndSendTransaction: {\n    key: \"signature\",\n  },\n\n  // sui\n  sui_signAndExecuteTransaction: {\n    key: \"digest\",\n  },\n  sui_signTransaction: {\n    key: \"\",\n  },\n\n  // hedera\n  hedera_signAndExecuteTransaction: {\n    key: \"transactionId\",\n  },\n  hedera_executeTransaction: {\n    key: \"transactionId\",\n  },\n\n  // near\n  near_signTransaction: {\n    key: \"\",\n  },\n  near_signTransactions: {\n    key: \"\",\n  },\n\n  // tron\n  tron_signTransaction: {\n    key: \"txID\",\n  },\n\n  // xrpl\n  xrpl_signTransaction: {\n    key: \"\",\n  },\n\n  xrpl_signTransactionFor: {\n    key: \"\",\n  },\n\n  // algorand\n  algo_signTxn: {\n    key: \"\",\n  },\n\n  // bitcoin\n  sendTransfer: {\n    key: \"txid\",\n  },\n\n  // stacks\n  stacks_stxTransfer: {\n    key: \"txId\",\n  },\n\n  // polkadot\n  polkadot_signTransaction: {\n    key: \"\",\n  },\n\n  // cosmos\n  cosmos_signDirect: {\n    key: \"\",\n  },\n};\n","export const REQUEST_CONTEXT = \"request\";\n","export const METHODS_TO_VERIFY = [\n  \"wc_sessionPropose\",\n  \"wc_sessionRequest\",\n  \"wc_authRequest\",\n  \"wc_sessionAuthenticate\",\n];\n","export const AUTH_PROTOCOL = \"wc\";\nexport const AUTH_VERSION = 1.5;\nexport const AUTH_CONTEXT = \"auth\";\nexport const AUTH_KEYS_CONTEXT = \"authKeys\";\nexport const AUTH_PAIRING_TOPIC_CONTEXT = \"pairingTopics\";\nexport const AUTH_REQUEST_CONTEXT = \"requests\";\n\nexport const AUTH_STORAGE_PREFIX = `${AUTH_PROTOCOL}@${AUTH_VERSION}:${AUTH_CONTEXT}:`;\nexport const AUTH_PUBLIC_KEY_NAME = `${AUTH_STORAGE_PREFIX}:PUB_KEY`;\n","import {\n  EVENT_CLIENT_AUTHENTICATE_ERRORS,\n  EVENT_CLIENT_AUTHENTICATE_TRACES,\n  EVENT_CLIENT_PAIRING_ERRORS,\n  EVENT_CLIENT_PAIRING_TRACES,\n  EVENT_CLIENT_SESSION_ERRORS,\n  EVENT_CLIENT_SESSION_TRACES,\n  EXPIRER_EVENTS,\n  PAIRING_EVENTS,\n  RELAYER_DEFAULT_PROTOCOL,\n  RELAYER_EVENTS,\n  TRANSPORT_TYPES,\n  VERIFY_SERVER,\n} from \"@walletconnect/core\";\n\nimport {\n  formatJsonRpcError,\n  formatJsonRpcRequest,\n  formatJsonRpcResult,\n  payloadId,\n  isJsonRpcError,\n  isJsonRpcRequest,\n  isJsonRpcResponse,\n  isJsonRpcResult,\n  JsonRpcRequest,\n  ErrorResponse,\n  getBigIntRpcId,\n} from \"@walletconnect/jsonrpc-utils\";\nimport { FIVE_MINUTES, ONE_SECOND, toMiliseconds } from \"@walletconnect/time\";\nimport {\n  EnginePrivate,\n  EngineTypes,\n  ExpirerTypes,\n  IEngine,\n  IEngineEvents,\n  JsonRpcTypes,\n  PendingRequestTypes,\n  Verify,\n  CoreTypes,\n  ProposalTypes,\n  RelayerTypes,\n  SessionTypes,\n  PairingTypes,\n  AuthTypes,\n  EventClientTypes,\n} from \"@walletconnect/types\";\nimport {\n  calcExpiry,\n  createDelayedPromise,\n  engineEvent,\n  getInternalError,\n  getSdkError,\n  isConformingNamespaces,\n  isExpired,\n  isSessionCompatible,\n  isUndefined,\n  isValidController,\n  isValidErrorReason,\n  isValidEvent,\n  isValidId,\n  isValidNamespaces,\n  isValidNamespacesChainId,\n  isValidNamespacesEvent,\n  isValidNamespacesRequest,\n  isValidObject,\n  isValidParams,\n  isValidRelay,\n  isValidRelays,\n  isValidRequest,\n  isValidRequestExpiry,\n  hashMessage,\n  isValidRequiredNamespaces,\n  isValidResponse,\n  isValidString,\n  parseExpirerTarget,\n  TYPE_1,\n  TYPE_2,\n  handleDeeplinkRedirect,\n  MemoryStore,\n  getDeepLink,\n  hashKey,\n  getDidAddress,\n  formatMessage,\n  getMethodsFromRecap,\n  buildNamespacesFromAuth,\n  createEncodedRecap,\n  getChainsFromRecap,\n  mergeEncodedRecaps,\n  getRecapFromResources,\n  validateSignedCacao,\n  getNamespacedDidChainId,\n  parseChainId,\n  getLinkModeURL,\n  BASE64,\n  BASE64URL,\n  getSearchParamFromURL,\n  isReactNative,\n  isTestRun,\n  isValidArray,\n  extractSolanaTransactionId,\n  getSuiDigest,\n  mergeRequiredAndOptionalNamespaces,\n  getNearTransactionIdFromSignedTransaction,\n  getAlgorandTransactionId,\n  buildSignedExtrinsicHash,\n  getSignDirectHash,\n  LimitedSet,\n  getWalletSendCallsHashes,\n  getNamespacesChains,\n  getNamespacesMethods,\n  getNamespacesEvents,\n} from \"@walletconnect/utils\";\nimport EventEmmiter from \"events\";\nimport {\n  ENGINE_CONTEXT,\n  ENGINE_RPC_OPTS,\n  PROPOSAL_EXPIRY_MESSAGE,\n  SESSION_EXPIRY,\n  SESSION_REQUEST_EXPIRY_BOUNDARIES,\n  METHODS_TO_VERIFY,\n  WALLETCONNECT_DEEPLINK_CHOICE,\n  ENGINE_QUEUE_STATES,\n  AUTH_PUBLIC_KEY_NAME,\n  TVF_METHODS,\n} from \"../constants/index.js\";\n\nexport class Engine extends IEngine {\n  public name = ENGINE_CONTEXT;\n\n  private events: IEngineEvents = new EventEmmiter();\n  private initialized = false;\n\n  /**\n   * Queue responsible for processing incoming requests such as session_update, session_event, session_ping etc\n   * It's needed when the client receives multiple requests at once from the mailbox immediately after initialization and to avoid attempting to process them all at the same time\n   */\n  private requestQueue: EngineTypes.EngineQueue<EngineTypes.EventCallback<JsonRpcRequest>> = {\n    state: ENGINE_QUEUE_STATES.idle,\n    queue: [],\n  };\n\n  /**\n   * Queue responsible for processing incoming session_request\n   * The queue emits the next request only after the previous one has been responded to\n   */\n  private sessionRequestQueue: EngineTypes.EngineQueue<PendingRequestTypes.Struct> = {\n    state: ENGINE_QUEUE_STATES.idle,\n    queue: [],\n  };\n\n  // This prevents duplicate emissions due to WalletConnect's at-least-once delivery guarantee.\n  // When disableRequestQueue is enabled, consumers must implement additional deduplication.\n  private emittedSessionRequests = new LimitedSet({ limit: 500 });\n\n  private requestQueueDelay = ONE_SECOND;\n  private expectedPairingMethodMap: Map<string, string[]> = new Map();\n  // Ephemeral (in-memory) map to store recently deleted items\n  private recentlyDeletedMap = new Map<\n    string | number,\n    \"pairing\" | \"session\" | \"proposal\" | \"request\"\n  >();\n\n  private recentlyDeletedLimit = 200;\n  private relayMessageCache: RelayerTypes.MessageEvent[] = [];\n  private pendingSessions: Map<\n    number,\n    {\n      sessionTopic: string;\n      pairingTopic: string;\n      proposalId: number;\n      publicKey: string;\n    }\n  > = new Map();\n\n  constructor(client: IEngine[\"client\"]) {\n    super(client);\n  }\n\n  public init: IEngine[\"init\"] = async () => {\n    if (!this.initialized) {\n      await this.cleanup();\n      this.registerRelayerEvents();\n      this.registerExpirerEvents();\n      this.registerPairingEvents();\n      this.registerSubscriptionCleanup();\n      await this.registerLinkModeListeners();\n      this.client.core.pairing.register({ methods: Object.keys(ENGINE_RPC_OPTS) });\n      this.initialized = true;\n      setTimeout(async () => {\n        await this.processPendingMessageEvents();\n\n        this.sessionRequestQueue.queue = this.getPendingSessionRequests();\n        this.processSessionRequestQueue();\n      }, toMiliseconds(this.requestQueueDelay));\n    }\n  };\n\n  private async processPendingMessageEvents() {\n    try {\n      const topics = this.client.session.keys;\n      const pendingMessages = this.client.core.relayer.messages.getWithoutAck(topics);\n      for (const [topic, messages] of Object.entries(pendingMessages)) {\n        for (const message of messages) {\n          try {\n            await this.onProviderMessageEvent({\n              topic,\n              message,\n              publishedAt: Date.now(),\n            });\n          } catch (error) {\n            this.client.logger.warn(\n              `Error processing pending message event for topic: ${topic}, message: ${message}`,\n            );\n          }\n        }\n      }\n    } catch (error) {\n      this.client.logger.warn(error, \"processPendingMessageEvents failed\");\n    }\n  }\n\n  // ---------- Public ------------------------------------------------ //\n\n  public connect: IEngine[\"connect\"] = async (params) => {\n    this.isInitialized();\n    await this.confirmOnlineStateOrThrow();\n    const connectParams = {\n      ...params,\n      requiredNamespaces: params.requiredNamespaces || {},\n      optionalNamespaces: params.optionalNamespaces || {},\n    };\n    await this.isValidConnect(connectParams);\n\n    // requiredNamespaces are deprecated, assign them to optionalNamespaces\n    connectParams.optionalNamespaces = mergeRequiredAndOptionalNamespaces(\n      connectParams.requiredNamespaces,\n      connectParams.optionalNamespaces,\n    );\n\n    connectParams.requiredNamespaces = {};\n\n    const {\n      pairingTopic,\n      requiredNamespaces,\n      optionalNamespaces,\n      sessionProperties,\n      scopedProperties,\n      relays,\n      authentication,\n      walletPay,\n    } = connectParams;\n\n    const expiryFromAuthentication = authentication?.[0]?.ttl;\n    const expiry =\n      expiryFromAuthentication || ENGINE_RPC_OPTS.wc_sessionPropose.req.ttl || FIVE_MINUTES;\n    this.validateRequestExpiry(expiry);\n\n    let topic = pairingTopic;\n    let uri: string | undefined;\n    let active = false;\n    try {\n      if (topic) {\n        const pairing = this.client.core.pairing.pairings.get(topic);\n        this.client.logger.warn(\n          \"connect() with existing pairing topic is deprecated and will be removed in the next major release.\",\n        );\n        active = pairing.active;\n      }\n    } catch (error) {\n      this.client.logger.error(`connect() -> pairing.get(${topic}) failed`);\n      throw error;\n    }\n    if (!topic || !active) {\n      const { topic: newTopic, uri: newUri } = await this.client.core.pairing.create({\n        internal: { skipSubscribe: true },\n      });\n      topic = newTopic;\n      uri = newUri;\n    }\n    // safety check to ensure pairing topic is available\n    if (!topic) {\n      const { message } = getInternalError(\"NO_MATCHING_KEY\", `connect() pairing topic: ${topic}`);\n      throw new Error(message);\n    }\n\n    const publicKey = await this.client.core.crypto.generateKeyPair();\n\n    const expiryTimestamp = calcExpiry(expiry);\n    const proposal: ProposalTypes.Struct = {\n      requiredNamespaces,\n      optionalNamespaces,\n      relays: relays ?? [{ protocol: RELAYER_DEFAULT_PROTOCOL }],\n      proposer: {\n        publicKey,\n        metadata: this.client.metadata,\n      },\n      expiryTimestamp,\n      pairingTopic: topic,\n      ...(sessionProperties && { sessionProperties }),\n      ...(scopedProperties && { scopedProperties }),\n      id: payloadId(),\n      ...((authentication || walletPay) && {\n        requests: {\n          authentication: authentication?.map((auth) => {\n            const {\n              domain,\n              chains,\n              nonce,\n              uri,\n              exp,\n              nbf,\n              type,\n              statement,\n              requestId,\n              resources,\n              signatureTypes,\n            } = auth;\n            const protocolParams: AuthTypes.AuthenticateParams = {\n              domain,\n              chains,\n              nonce,\n              type: type ?? \"caip122\",\n              aud: uri,\n              version: \"1\",\n              iat: new Date().toISOString(),\n              exp,\n              nbf,\n              statement,\n              requestId,\n              resources,\n              signatureTypes,\n            };\n            return protocolParams;\n          }),\n          walletPay,\n        },\n      }),\n    };\n\n    const sessionConnectTarget = engineEvent(\"session_connect\", proposal.id);\n\n    const {\n      reject,\n      resolve,\n      done: approval,\n    } = createDelayedPromise<SessionTypes.Struct>(expiry, PROPOSAL_EXPIRY_MESSAGE);\n\n    const proposalExpireHandler = ({ id }: { id: number }) => {\n      if (id === proposal.id) {\n        this.client.events.off(\"proposal_expire\", proposalExpireHandler);\n        const pendingSession = this.pendingSessions.get(proposal.id);\n        if (pendingSession) {\n          const { sessionTopic, publicKey } = pendingSession;\n          Promise.all([\n            this.client.core.relayer.unsubscribe(sessionTopic),\n            this.client.core.crypto.keychain.has(sessionTopic)\n              ? this.client.core.crypto.deleteSymKey(sessionTopic)\n              : Promise.resolve(),\n            this.client.core.crypto.keychain.has(publicKey)\n              ? this.client.core.crypto.deleteKeyPair(publicKey)\n              : Promise.resolve(),\n          ]).catch((e) => this.client.logger.warn(e));\n        }\n        this.pendingSessions.delete(proposal.id);\n        this.events.emit(sessionConnectTarget, {\n          error: { message: PROPOSAL_EXPIRY_MESSAGE, code: 0 },\n        });\n      }\n    };\n\n    this.client.events.on(\"proposal_expire\", proposalExpireHandler);\n    this.events.once<\"session_connect\">(sessionConnectTarget, ({ error, session }) => {\n      this.client.events.off(\"proposal_expire\", proposalExpireHandler);\n      if (error) reject(error);\n      else if (session) {\n        resolve(session);\n      }\n    });\n\n    await this.setProposal(proposal.id, proposal);\n\n    await this.sendProposeSession({\n      proposal,\n      publishOpts: {\n        internal: {\n          throwOnFailedPublish: true,\n        },\n        tvf: {\n          correlationId: proposal.id,\n        },\n      },\n    }).catch((error) => {\n      this.deleteProposal(proposal.id);\n      throw error;\n    });\n\n    return { uri, approval };\n  };\n\n  public pair: IEngine[\"pair\"] = async (params) => {\n    this.isInitialized();\n    await this.confirmOnlineStateOrThrow();\n    try {\n      return await this.client.core.pairing.pair(params);\n    } catch (error) {\n      this.client.logger.error(\"pair() failed\");\n      throw error;\n    }\n  };\n\n  public approve: IEngine[\"approve\"] = async (params) => {\n    const configEvent = this.client.core.eventClient.createEvent({\n      properties: {\n        topic: params?.id?.toString(),\n        trace: [EVENT_CLIENT_SESSION_TRACES.session_approve_started],\n      },\n    });\n    try {\n      this.isInitialized();\n      await this.confirmOnlineStateOrThrow();\n    } catch (error) {\n      configEvent.setError(EVENT_CLIENT_SESSION_ERRORS.no_internet_connection);\n      throw error;\n    }\n    try {\n      await this.isValidProposalId(params?.id);\n    } catch (error) {\n      this.client.logger.error(`approve() -> proposal.get(${params?.id}) failed`);\n      configEvent.setError(EVENT_CLIENT_SESSION_ERRORS.proposal_not_found);\n      throw error;\n    }\n\n    try {\n      await this.isValidApprove(params);\n    } catch (error) {\n      this.client.logger.error(\"approve() -> isValidApprove() failed\");\n      configEvent.setError(\n        EVENT_CLIENT_SESSION_ERRORS.session_approve_namespace_validation_failure,\n      );\n      throw error;\n    }\n\n    const {\n      id,\n      relayProtocol,\n      namespaces,\n      sessionProperties,\n      scopedProperties,\n      sessionConfig,\n      proposalRequestsResponses,\n    } = params;\n\n    const proposal = this.client.proposal.get(id);\n\n    this.client.core.eventClient.deleteEvent({ eventId: configEvent.eventId });\n\n    const { pairingTopic, proposer, requiredNamespaces, optionalNamespaces } = proposal;\n\n    let event = this.client.core.eventClient?.getEvent({\n      topic: pairingTopic,\n    }) as EventClientTypes.Event;\n    if (!event) {\n      event = this.client.core.eventClient?.createEvent({\n        type: EVENT_CLIENT_SESSION_TRACES.session_approve_started,\n        properties: {\n          topic: pairingTopic,\n          trace: [\n            EVENT_CLIENT_SESSION_TRACES.session_approve_started,\n            EVENT_CLIENT_SESSION_TRACES.session_namespaces_validation_success,\n          ],\n        },\n      });\n    }\n\n    const selfPublicKey = await this.client.core.crypto.generateKeyPair();\n    const peerPublicKey = proposer.publicKey;\n    const sessionTopic = await this.client.core.crypto.generateSharedKey(\n      selfPublicKey,\n      peerPublicKey,\n    );\n\n    const sessionSettle = {\n      relay: { protocol: relayProtocol ?? \"irn\" },\n      namespaces,\n      controller: { publicKey: selfPublicKey, metadata: this.client.metadata },\n      expiry: calcExpiry(SESSION_EXPIRY),\n      ...(sessionProperties && { sessionProperties }),\n      ...(scopedProperties && { scopedProperties }),\n      ...(sessionConfig && { sessionConfig }),\n      proposalRequestsResponses,\n    };\n    const transportType = TRANSPORT_TYPES.relay;\n    event.addTrace(EVENT_CLIENT_SESSION_TRACES.subscribing_session_topic);\n    try {\n      await this.client.core.relayer.subscribe(sessionTopic, {\n        transportType,\n        internal: { skipSubscribe: true },\n      });\n    } catch (error) {\n      event.setError(EVENT_CLIENT_SESSION_ERRORS.subscribe_session_topic_failure);\n      throw error;\n    }\n\n    event.addTrace(EVENT_CLIENT_SESSION_TRACES.subscribe_session_topic_success);\n\n    const session: SessionTypes.Struct = {\n      ...sessionSettle,\n      topic: sessionTopic,\n      requiredNamespaces,\n      optionalNamespaces,\n      pairingTopic,\n      acknowledged: false,\n      self: sessionSettle.controller,\n      peer: {\n        publicKey: proposer.publicKey,\n        metadata: proposer.metadata,\n      },\n      controller: selfPublicKey,\n      transportType: TRANSPORT_TYPES.relay,\n      authentication: proposalRequestsResponses?.authentication,\n      walletPayResult: proposalRequestsResponses?.walletPay,\n    };\n\n    await this.client.session.set(sessionTopic, session);\n\n    event.addTrace(EVENT_CLIENT_SESSION_TRACES.store_session);\n\n    try {\n      await this.sendApproveSession({\n        sessionTopic,\n        proposal,\n        pairingProposalResponse: {\n          relay: {\n            protocol: relayProtocol ?? \"irn\",\n          },\n          responderPublicKey: selfPublicKey,\n        },\n        sessionSettleRequest: sessionSettle,\n        publishOpts: {\n          internal: {\n            throwOnFailedPublish: true,\n          },\n          tvf: {\n            correlationId: id,\n            ...this.getTVFApproveParams(session),\n          },\n        },\n      });\n\n      event.addTrace(EVENT_CLIENT_SESSION_TRACES.session_approve_publish_success);\n    } catch (error) {\n      this.client.logger.error(error);\n      // if the publish fails, delete the session and throw an error\n      this.client.session.delete(sessionTopic, getSdkError(\"USER_DISCONNECTED\"));\n      await this.client.core.relayer.unsubscribe(sessionTopic);\n      throw error;\n    }\n\n    this.client.core.eventClient.deleteEvent({ eventId: event.eventId });\n\n    await this.client.core.pairing.updateMetadata({\n      topic: pairingTopic,\n      metadata: proposer.metadata,\n    });\n    await this.deleteProposal(id);\n    await this.client.core.pairing.activate({ topic: pairingTopic });\n    await this.setExpiry(sessionTopic, calcExpiry(SESSION_EXPIRY));\n    return {\n      topic: sessionTopic,\n      acknowledged: () => Promise.resolve(this.client.session.get(sessionTopic)),\n    };\n  };\n\n  public reject: IEngine[\"reject\"] = async (params) => {\n    this.isInitialized();\n    await this.confirmOnlineStateOrThrow();\n    try {\n      await this.isValidReject(params);\n    } catch (error) {\n      this.client.logger.error(\"reject() -> isValidReject() failed\");\n      throw error;\n    }\n    const { id, reason } = params;\n    let pairingTopic;\n    try {\n      const proposal = this.client.proposal.get(id);\n      pairingTopic = proposal.pairingTopic;\n    } catch (error) {\n      this.client.logger.error(`reject() -> proposal.get(${id}) failed`);\n      throw error;\n    }\n\n    if (pairingTopic) {\n      await this.sendError({\n        id,\n        topic: pairingTopic,\n        error: reason,\n        rpcOpts: ENGINE_RPC_OPTS.wc_sessionPropose.reject,\n      });\n    }\n\n    await this.deleteProposal(id);\n  };\n\n  public update: IEngine[\"update\"] = async (params) => {\n    this.isInitialized();\n    await this.confirmOnlineStateOrThrow();\n    try {\n      await this.isValidUpdate(params);\n    } catch (error) {\n      this.client.logger.error(\"update() -> isValidUpdate() failed\");\n      throw error;\n    }\n    const { topic, namespaces } = params;\n\n    const {\n      done: acknowledged,\n      resolve,\n      reject,\n    } = createDelayedPromise<void>(\n      FIVE_MINUTES,\n      \"Session update request expired without receiving any acknowledgement\",\n    );\n    const clientRpcId = payloadId();\n    const relayRpcId = getBigIntRpcId().toString() as any;\n\n    const oldNamespaces = this.client.session.get(topic).namespaces;\n    this.events.once(engineEvent(\"session_update\", clientRpcId), ({ error }: any) => {\n      if (error) reject(error);\n      else {\n        resolve();\n      }\n    });\n    // Update the session with the new namespaces, if the publish fails, revert to the old.\n    // This allows the client to use the updated session like emitting events\n    // without waiting for the peer to acknowledge\n    await this.client.session.update(topic, { namespaces });\n    await this.sendRequest({\n      topic,\n      method: \"wc_sessionUpdate\",\n      params: { namespaces },\n      throwOnFailedPublish: true,\n      clientRpcId,\n      relayRpcId,\n    }).catch((error) => {\n      this.client.logger.error(error);\n      this.client.session.update(topic, { namespaces: oldNamespaces });\n      reject(error);\n    });\n    return { acknowledged };\n  };\n\n  public extend: IEngine[\"extend\"] = async (params) => {\n    this.isInitialized();\n    await this.confirmOnlineStateOrThrow();\n    try {\n      await this.isValidExtend(params);\n    } catch (error) {\n      this.client.logger.error(\"extend() -> isValidExtend() failed\");\n      throw error;\n    }\n\n    const { topic } = params;\n    const clientRpcId = payloadId();\n    const {\n      done: acknowledged,\n      resolve,\n      reject,\n    } = createDelayedPromise<void>(\n      FIVE_MINUTES,\n      \"Session extend request expired without receiving any acknowledgement\",\n    );\n    this.events.once(engineEvent(\"session_extend\", clientRpcId), ({ error }: any) => {\n      if (error) reject(error);\n      else resolve();\n    });\n\n    await this.setExpiry(topic, calcExpiry(SESSION_EXPIRY));\n    this.sendRequest({\n      topic,\n      method: \"wc_sessionExtend\",\n      params: {},\n      clientRpcId,\n      throwOnFailedPublish: true,\n    }).catch((e) => {\n      reject(e);\n    });\n\n    return { acknowledged };\n  };\n\n  public request: IEngine[\"request\"] = async <T>(params: EngineTypes.RequestParams) => {\n    this.isInitialized();\n    try {\n      await this.isValidRequest(params);\n    } catch (error) {\n      this.client.logger.error(\"request() -> isValidRequest() failed\");\n      throw error;\n    }\n    const { chainId, request, topic, expiry = ENGINE_RPC_OPTS.wc_sessionRequest.req.ttl } = params;\n    const session = this.client.session.get(topic);\n\n    if (session?.transportType === TRANSPORT_TYPES.relay) {\n      await this.confirmOnlineStateOrThrow();\n    }\n    const clientRpcId = payloadId();\n    const relayRpcId = getBigIntRpcId().toString() as any;\n    const { done, resolve, reject } = createDelayedPromise<T>(\n      expiry,\n      \"Request expired. Please try again.\",\n    );\n    this.events.once<\"session_request\">(\n      engineEvent(\"session_request\", clientRpcId),\n      ({ error, result }) => {\n        if (error) reject(error);\n        else resolve(result);\n      },\n    );\n    const protocolMethod = \"wc_sessionRequest\";\n    const appLink = this.getAppLinkIfEnabled(session.peer.metadata, session.transportType);\n    if (appLink) {\n      await this.sendRequest({\n        clientRpcId,\n        relayRpcId,\n        topic,\n        method: protocolMethod,\n        params: {\n          request: {\n            ...request,\n            expiryTimestamp: calcExpiry(expiry),\n          },\n          chainId,\n        },\n        expiry,\n        throwOnFailedPublish: true,\n        appLink,\n      }).catch((error) => reject(error));\n\n      this.client.events.emit(\"session_request_sent\", {\n        topic,\n        request,\n        chainId,\n        id: clientRpcId,\n      });\n      const result = await done();\n      return result;\n    }\n\n    const protocolRequestParams: JsonRpcTypes.RequestParams[\"wc_sessionRequest\"] = {\n      request: {\n        ...request,\n        expiryTimestamp: calcExpiry(expiry),\n      },\n      chainId,\n    };\n\n    return await Promise.all([\n      new Promise<void>(async (resolve) => {\n        await this.sendRequest({\n          clientRpcId,\n          relayRpcId,\n          topic,\n          method: protocolMethod,\n          params: protocolRequestParams,\n          expiry,\n          throwOnFailedPublish: true,\n          tvf: this.getTVFParams(clientRpcId, protocolRequestParams),\n        }).catch((error) => reject(error));\n        this.client.events.emit(\"session_request_sent\", {\n          topic,\n          request,\n          chainId,\n          id: clientRpcId,\n        });\n        resolve();\n      }),\n      new Promise<void>(async (resolve) => {\n        // only attempt to handle deeplinks if they are not explicitly disabled in the session config\n        if (!session.sessionConfig?.disableDeepLink) {\n          const wcDeepLink = (await getDeepLink(\n            this.client.core.storage,\n            WALLETCONNECT_DEEPLINK_CHOICE,\n          )) as string;\n          await handleDeeplinkRedirect({ id: clientRpcId, topic, wcDeepLink });\n        }\n        resolve();\n      }),\n      done(),\n    ]).then((result) => result[2]); // order is important here, we want to return the result of the `done` promise\n  };\n\n  public respond: IEngine[\"respond\"] = async (params) => {\n    this.isInitialized();\n    const event = this.client.core.eventClient.createEvent({\n      properties: {\n        topic: params?.topic || params?.response?.id?.toString(),\n        trace: [EVENT_CLIENT_SESSION_TRACES.session_request_response_started],\n      },\n    });\n    try {\n      await this.isValidRespond(params);\n    } catch (error) {\n      event.addTrace((error as Error)?.message);\n      event.setError(EVENT_CLIENT_SESSION_ERRORS.session_request_response_validation_failure);\n\n      throw error;\n    }\n\n    event.addTrace(EVENT_CLIENT_SESSION_TRACES.session_request_response_validation_success);\n\n    const { topic, response } = params;\n    const { id } = response;\n    const session = this.client.session.get(topic);\n\n    if (session.transportType === TRANSPORT_TYPES.relay) {\n      await this.confirmOnlineStateOrThrow();\n    }\n\n    const appLink = this.getAppLinkIfEnabled(session.peer.metadata, session.transportType);\n    try {\n      event.addTrace(EVENT_CLIENT_SESSION_TRACES.session_request_response_publish_started);\n      if (isJsonRpcResult(response)) {\n        await this.sendResult({\n          id,\n          topic,\n          result: response.result,\n          throwOnFailedPublish: true,\n          appLink,\n        });\n      } else if (isJsonRpcError(response)) {\n        await this.sendError({ id, topic, error: response.error, appLink });\n      }\n      this.cleanupAfterResponse(params);\n    } catch (error) {\n      event.addTrace((error as Error)?.message);\n      event.setError(EVENT_CLIENT_SESSION_ERRORS.session_request_response_publish_failure);\n      throw error;\n    }\n  };\n\n  public ping: IEngine[\"ping\"] = async (params) => {\n    this.isInitialized();\n    await this.confirmOnlineStateOrThrow();\n    try {\n      await this.isValidPing(params);\n    } catch (error) {\n      this.client.logger.error(\"ping() -> isValidPing() failed\");\n      throw error;\n    }\n    const { topic } = params;\n    if (this.client.session.keys.includes(topic)) {\n      const clientRpcId = payloadId();\n      const relayRpcId = getBigIntRpcId().toString() as any;\n      const { done, resolve, reject } = createDelayedPromise<void>(\n        FIVE_MINUTES,\n        \"Ping request expired without receiving any acknowledgement\",\n      );\n      this.events.once(engineEvent(\"session_ping\", clientRpcId), ({ error }: any) => {\n        if (error) reject(error);\n        else resolve();\n      });\n      await Promise.all([\n        this.sendRequest({\n          topic,\n          method: \"wc_sessionPing\",\n          params: {},\n          throwOnFailedPublish: true,\n          clientRpcId,\n          relayRpcId,\n        }),\n        done(),\n      ]);\n    } else if (this.client.core.pairing.pairings.keys.includes(topic)) {\n      this.client.logger.warn(\n        \"ping() on pairing topic is deprecated and will be removed in the next major release.\",\n      );\n      await this.client.core.pairing.ping({ topic });\n    }\n  };\n\n  public emit: IEngine[\"emit\"] = async (params) => {\n    this.isInitialized();\n    await this.confirmOnlineStateOrThrow();\n    await this.isValidEmit(params);\n    const { topic, event, chainId } = params;\n    const relayRpcId = getBigIntRpcId().toString() as any;\n    const clientRpcId = payloadId();\n    await this.sendRequest({\n      topic,\n      method: \"wc_sessionEvent\",\n      params: { event, chainId },\n      throwOnFailedPublish: true,\n      relayRpcId,\n      clientRpcId,\n    });\n  };\n\n  public disconnect: IEngine[\"disconnect\"] = async (params) => {\n    this.isInitialized();\n    await this.confirmOnlineStateOrThrow();\n    await this.isValidDisconnect(params);\n    const { topic } = params;\n    if (this.client.session.keys.includes(topic)) {\n      // await an ack to ensure the relay has received the disconnect request\n      await this.sendRequest({\n        topic,\n        method: \"wc_sessionDelete\",\n        params: getSdkError(\"USER_DISCONNECTED\"),\n        throwOnFailedPublish: true,\n      });\n      await this.deleteSession({ topic, emitEvent: false });\n    } else if (this.client.core.pairing.pairings.keys.includes(topic)) {\n      await this.client.core.pairing.disconnect({ topic });\n    } else {\n      const { message } = getInternalError(\n        \"MISMATCHED_TOPIC\",\n        `Session or pairing topic not found: ${topic}`,\n      );\n      throw new Error(message);\n    }\n  };\n\n  public find: IEngine[\"find\"] = (params) => {\n    this.isInitialized();\n    return this.client.session.getAll().filter((session) => isSessionCompatible(session, params));\n  };\n\n  public getPendingSessionRequests: IEngine[\"getPendingSessionRequests\"] = () => {\n    return this.client.pendingRequest.getAll();\n  };\n\n  // ---------- Auth ------------------------------------------------ //\n\n  public authenticate: IEngine[\"authenticate\"] = async (params, walletUniversalLink) => {\n    this.isInitialized();\n    this.isValidAuthenticate(params);\n\n    const isLinkMode =\n      walletUniversalLink &&\n      this.client.core.linkModeSupportedApps.includes(walletUniversalLink) &&\n      this.client.metadata.redirect?.linkMode;\n\n    const transportType: RelayerTypes.TransportType = isLinkMode\n      ? TRANSPORT_TYPES.link_mode\n      : TRANSPORT_TYPES.relay;\n\n    if (transportType === TRANSPORT_TYPES.relay) {\n      await this.confirmOnlineStateOrThrow();\n    }\n\n    const {\n      chains,\n      statement = \"\",\n      uri,\n      domain,\n      nonce,\n      type,\n      exp,\n      nbf,\n      methods = [],\n      expiry,\n    } = params;\n    // reassign resources to remove reference as the array is modified and might cause side effects\n    const resources = [...(params.resources || [])];\n\n    const { topic: pairingTopic, uri: connectionUri } = await this.client.core.pairing.create({\n      methods: [\"wc_sessionAuthenticate\"],\n      transportType,\n    });\n\n    this.client.logger.info({\n      message: \"Generated new pairing\",\n      pairing: { topic: pairingTopic, uri: connectionUri },\n    });\n\n    if (this.client.auth.authKeys.keys.includes(AUTH_PUBLIC_KEY_NAME)) {\n      const { responseTopic: oldResponseTopic, publicKey: oldPublicKey } =\n        this.client.auth.authKeys.get(AUTH_PUBLIC_KEY_NAME);\n      if (oldResponseTopic) {\n        await this.client.core.relayer\n          .unsubscribe(oldResponseTopic)\n          .catch((e) => this.client.logger.warn(e));\n        await this.client.auth.pairingTopics\n          .delete(oldResponseTopic, {\n            message: \"replaced\",\n            code: 0,\n          })\n          .catch((e) => this.client.logger.warn(e));\n      }\n      if (oldPublicKey && this.client.core.crypto.keychain.has(oldPublicKey)) {\n        await this.client.core.crypto.deleteKeyPair(oldPublicKey);\n      }\n    }\n\n    const publicKey = await this.client.core.crypto.generateKeyPair();\n    const responseTopic = hashKey(publicKey);\n\n    await Promise.all([\n      this.client.auth.authKeys.set(AUTH_PUBLIC_KEY_NAME, { responseTopic, publicKey }),\n      this.client.auth.pairingTopics.set(responseTopic, { topic: responseTopic, pairingTopic }),\n    ]);\n\n    await this.client.core.relayer.subscribe(responseTopic, { transportType });\n\n    this.client.logger.info(`sending request to new pairing topic: ${pairingTopic}`);\n\n    if (methods.length > 0) {\n      const { namespace } = parseChainId(chains[0]);\n      let recap = createEncodedRecap(namespace, \"request\", methods);\n      const existingRecap = getRecapFromResources(resources);\n      if (existingRecap) {\n        // per Recaps spec, recap must occupy the last position in the resources array\n        // using .pop to remove the element given we already checked it's a recap and will replace it\n        const mergedRecap = mergeEncodedRecaps(recap, resources.pop() as string);\n        recap = mergedRecap;\n      }\n      resources.push(recap);\n    }\n\n    // Ensure the expiry is greater than the minimum required for the request - currently 1h\n    const authRequestExpiry =\n      expiry && expiry > ENGINE_RPC_OPTS.wc_sessionAuthenticate.req.ttl\n        ? expiry\n        : ENGINE_RPC_OPTS.wc_sessionAuthenticate.req.ttl;\n\n    const request: AuthTypes.SessionAuthenticateRequestParams = {\n      authPayload: {\n        type: type ?? \"caip122\",\n        chains,\n        statement,\n        aud: uri,\n        domain,\n        version: \"1\",\n        nonce,\n        iat: new Date().toISOString(),\n        exp,\n        nbf,\n        resources,\n      },\n      requester: { publicKey, metadata: this.client.metadata },\n      expiryTimestamp: calcExpiry(authRequestExpiry),\n    };\n\n    // ----- build namespaces for fallback session proposal ----- //\n    const namespaces = {\n      eip155: {\n        chains,\n        // request `personal_sign` method by default to allow for fallback siwe\n        methods: [...new Set([\"personal_sign\", ...methods])],\n        events: [\"chainChanged\", \"accountsChanged\"],\n      },\n    };\n\n    const proposal = {\n      requiredNamespaces: {},\n      optionalNamespaces: namespaces,\n      relays: [{ protocol: \"irn\" }],\n      pairingTopic,\n      proposer: {\n        publicKey,\n        metadata: this.client.metadata,\n      },\n      expiryTimestamp: calcExpiry(ENGINE_RPC_OPTS.wc_sessionPropose.req.ttl),\n      id: payloadId(),\n    };\n\n    const { done, resolve, reject } = createDelayedPromise(authRequestExpiry, \"Request expired\");\n\n    const authenticateId = payloadId();\n    const sessionConnectEventTarget = engineEvent(\"session_connect\", proposal.id);\n    const authenticateEventTarget = engineEvent(\"session_request\", authenticateId);\n\n    // handle fallback session proposal response\n    const onSessionConnect = async ({ error, session }: any) => {\n      // cleanup listener for authenticate response\n      this.events.off(authenticateEventTarget, onAuthenticate);\n      if (error) reject(error);\n      else if (session) {\n        resolve({\n          session,\n        });\n      }\n    };\n    // handle session authenticate response\n    const onAuthenticate = async (payload: any) => {\n      // delete this auth request on response\n      // we're using payload from the wallet to establish the session so we don't need to keep this around\n      await this.deletePendingAuthRequest(authenticateId, { message: \"fulfilled\", code: 0 });\n      if (payload.error) {\n        // wallets that do not support wc_sessionAuthenticate will return an error\n        // we should not reject the promise in this case as the fallback session proposal will be used\n        const error = getSdkError(\"WC_METHOD_UNSUPPORTED\", \"wc_sessionAuthenticate\");\n        if (payload.error.code === error.code) return;\n\n        // cleanup listener for fallback response\n        this.events.off(sessionConnectEventTarget, onSessionConnect);\n        return reject(payload.error.message);\n      }\n      // delete fallback proposal on successful authenticate as the proposal will not be responded to\n      await this.deleteProposal(proposal.id);\n      // cleanup listener for fallback response\n      this.events.off(sessionConnectEventTarget, onSessionConnect);\n\n      const {\n        cacaos,\n        responder,\n      }: {\n        cacaos: AuthTypes.SessionAuthenticateResponseParams[\"cacaos\"];\n        responder: AuthTypes.SessionAuthenticateResponseParams[\"responder\"];\n      } = payload.result;\n\n      const approvedMethods: string[] = [];\n      const approvedAccounts: string[] = [];\n      for (const cacao of cacaos) {\n        const isValid = await validateSignedCacao({ cacao, projectId: this.client.core.projectId });\n        if (!isValid) {\n          this.client.logger.error(cacao, \"Signature verification failed\");\n          reject(getSdkError(\"SESSION_SETTLEMENT_FAILED\", \"Signature verification failed\"));\n        }\n\n        const { p: payload } = cacao;\n        const recap = getRecapFromResources(payload.resources);\n\n        const approvedChains: string[] = [getNamespacedDidChainId(payload.iss) as string];\n        const parsedAddress = getDidAddress(payload.iss) as string;\n\n        if (recap) {\n          const methodsfromRecap = getMethodsFromRecap(recap);\n          const chainsFromRecap = getChainsFromRecap(recap);\n          approvedMethods.push(...methodsfromRecap);\n          approvedChains.push(...chainsFromRecap);\n        }\n\n        for (const chain of approvedChains) {\n          approvedAccounts.push(`${chain}:${parsedAddress}`);\n        }\n      }\n      const sessionTopic = await this.client.core.crypto.generateSharedKey(\n        publicKey,\n        responder.publicKey,\n      );\n\n      //create session object\n      let session: SessionTypes.Struct | undefined;\n\n      if (approvedMethods.length > 0) {\n        session = {\n          topic: sessionTopic,\n          acknowledged: true,\n          self: {\n            publicKey,\n            metadata: this.client.metadata,\n          },\n          peer: responder,\n          controller: responder.publicKey,\n          expiry: calcExpiry(SESSION_EXPIRY),\n          requiredNamespaces: {},\n          optionalNamespaces: {},\n          relay: { protocol: \"irn\" },\n          pairingTopic,\n          namespaces: buildNamespacesFromAuth(\n            [...new Set(approvedMethods)],\n            [...new Set(approvedAccounts)],\n          ),\n          transportType,\n        };\n\n        await this.client.core.relayer.subscribe(sessionTopic, { transportType });\n        await this.client.session.set(sessionTopic, session);\n        if (pairingTopic) {\n          await this.client.core.pairing.updateMetadata({\n            topic: pairingTopic,\n            metadata: responder.metadata,\n          });\n        }\n\n        session = this.client.session.get(sessionTopic);\n      }\n\n      if (\n        this.client.metadata.redirect?.linkMode &&\n        responder.metadata.redirect?.linkMode &&\n        responder.metadata.redirect?.universal &&\n        walletUniversalLink\n      ) {\n        // save wallet link in array of apps that support linkMode\n        this.client.core.addLinkModeSupportedApp(responder.metadata.redirect.universal);\n\n        this.client.session.update(sessionTopic, {\n          transportType: TRANSPORT_TYPES.link_mode,\n        });\n      }\n\n      resolve({\n        auths: cacaos,\n        session,\n      });\n    };\n\n    // subscribe to response events\n    this.events.once<\"session_connect\">(sessionConnectEventTarget, onSessionConnect);\n    this.events.once(authenticateEventTarget, onAuthenticate);\n\n    let linkModeURL;\n    try {\n      if (isLinkMode) {\n        const payload = formatJsonRpcRequest(\"wc_sessionAuthenticate\", request, authenticateId);\n        this.client.core.history.set(pairingTopic, payload);\n        const message = await this.client.core.crypto.encode(\"\", payload, {\n          type: TYPE_2,\n          encoding: BASE64URL,\n        });\n        linkModeURL = getLinkModeURL(walletUniversalLink, pairingTopic, message);\n      } else {\n        // send both (main & fallback) requests\n        await Promise.all([\n          this.sendRequest({\n            topic: pairingTopic,\n            method: \"wc_sessionAuthenticate\",\n            params: request,\n            expiry: params.expiry,\n            throwOnFailedPublish: true,\n            clientRpcId: authenticateId,\n          }),\n          this.sendRequest({\n            topic: pairingTopic,\n            method: \"wc_sessionPropose\",\n            params: proposal,\n            expiry: ENGINE_RPC_OPTS.wc_sessionPropose.req.ttl,\n            throwOnFailedPublish: true,\n            clientRpcId: proposal.id,\n          }),\n        ]);\n      }\n    } catch (error) {\n      // cleanup listeners on failed publish\n      this.events.off(sessionConnectEventTarget, onSessionConnect);\n      this.events.off(authenticateEventTarget, onAuthenticate);\n      throw error;\n    }\n\n    await this.setProposal(proposal.id, proposal);\n    await this.setAuthRequest(authenticateId, {\n      request: {\n        ...request,\n        verifyContext: {} as any,\n      },\n      pairingTopic,\n      transportType,\n    });\n\n    return {\n      uri: linkModeURL ?? connectionUri,\n      response: done,\n    } as EngineTypes.SessionAuthenticateResponsePromise;\n  };\n\n  public approveSessionAuthenticate: IEngine[\"approveSessionAuthenticate\"] = async (\n    sessionAuthenticateResponseParams,\n  ) => {\n    const { id, auths } = sessionAuthenticateResponseParams;\n\n    const event = this.client.core.eventClient.createEvent({\n      properties: {\n        topic: id.toString(),\n        trace: [EVENT_CLIENT_AUTHENTICATE_TRACES.authenticated_session_approve_started],\n      },\n    });\n\n    try {\n      this.isInitialized();\n    } catch (error) {\n      event.setError(EVENT_CLIENT_AUTHENTICATE_ERRORS.no_internet_connection);\n      throw error;\n    }\n\n    const pendingRequest = this.getPendingAuthRequest(id);\n\n    if (!pendingRequest) {\n      event.setError(\n        EVENT_CLIENT_AUTHENTICATE_ERRORS.authenticated_session_pending_request_not_found,\n      );\n      throw new Error(`Could not find pending auth request with id ${id}`);\n    }\n\n    const transportType = pendingRequest.transportType || TRANSPORT_TYPES.relay;\n    if (transportType === TRANSPORT_TYPES.relay) {\n      await this.confirmOnlineStateOrThrow();\n    }\n\n    const receiverPublicKey = pendingRequest.requester.publicKey;\n    const senderPublicKey = await this.client.core.crypto.generateKeyPair();\n    const responseTopic = hashKey(receiverPublicKey);\n\n    const encodeOpts = {\n      type: TYPE_1,\n      receiverPublicKey,\n      senderPublicKey,\n    };\n\n    const approvedMethods: string[] = [];\n    const approvedAccounts: string[] = [];\n    for (const cacao of auths) {\n      const isValid = await validateSignedCacao({ cacao, projectId: this.client.core.projectId });\n      if (!isValid) {\n        event.setError(EVENT_CLIENT_AUTHENTICATE_ERRORS.invalid_cacao);\n\n        const invalidErr = getSdkError(\n          \"SESSION_SETTLEMENT_FAILED\",\n          \"Signature verification failed\",\n        );\n\n        await this.sendError({\n          id,\n          topic: responseTopic,\n          error: invalidErr,\n          encodeOpts,\n        });\n\n        throw new Error(invalidErr.message);\n      }\n\n      event.addTrace(EVENT_CLIENT_AUTHENTICATE_TRACES.cacaos_verified);\n\n      const { p: payload } = cacao;\n      const recap = getRecapFromResources(payload.resources);\n\n      const approvedChains: string[] = [getNamespacedDidChainId(payload.iss) as string];\n\n      const parsedAddress = getDidAddress(payload.iss) as string;\n\n      if (recap) {\n        const methodsfromRecap = getMethodsFromRecap(recap);\n        const chainsFromRecap = getChainsFromRecap(recap);\n        approvedMethods.push(...methodsfromRecap);\n        approvedChains.push(...chainsFromRecap);\n      }\n      for (const chain of approvedChains) {\n        approvedAccounts.push(`${chain}:${parsedAddress}`);\n      }\n    }\n\n    const sessionTopic = await this.client.core.crypto.generateSharedKey(\n      senderPublicKey,\n      receiverPublicKey,\n    );\n\n    event.addTrace(EVENT_CLIENT_AUTHENTICATE_TRACES.create_authenticated_session_topic);\n\n    let session: SessionTypes.Struct | undefined;\n    if (approvedMethods?.length > 0) {\n      session = {\n        topic: sessionTopic,\n        acknowledged: true,\n        self: {\n          publicKey: senderPublicKey,\n          metadata: this.client.metadata,\n        },\n        peer: {\n          publicKey: receiverPublicKey,\n          metadata: pendingRequest.requester.metadata,\n        },\n        controller: receiverPublicKey,\n        expiry: calcExpiry(SESSION_EXPIRY),\n        authentication: auths,\n        requiredNamespaces: {},\n        optionalNamespaces: {},\n        relay: { protocol: \"irn\" },\n        pairingTopic: pendingRequest.pairingTopic,\n        namespaces: buildNamespacesFromAuth(\n          [...new Set(approvedMethods)],\n          [...new Set(approvedAccounts)],\n        ),\n        transportType,\n      };\n\n      event.addTrace(EVENT_CLIENT_AUTHENTICATE_TRACES.subscribing_authenticated_session_topic);\n\n      try {\n        await this.client.core.relayer.subscribe(sessionTopic, { transportType });\n      } catch (error) {\n        event.setError(\n          EVENT_CLIENT_AUTHENTICATE_ERRORS.subscribe_authenticated_session_topic_failure,\n        );\n        throw error;\n      }\n\n      event.addTrace(\n        EVENT_CLIENT_AUTHENTICATE_TRACES.subscribe_authenticated_session_topic_success,\n      );\n\n      await this.client.session.set(sessionTopic, session);\n\n      event.addTrace(EVENT_CLIENT_AUTHENTICATE_TRACES.store_authenticated_session);\n\n      await this.client.core.pairing.updateMetadata({\n        topic: pendingRequest.pairingTopic,\n        metadata: pendingRequest.requester.metadata,\n      });\n    }\n\n    event.addTrace(EVENT_CLIENT_AUTHENTICATE_TRACES.publishing_authenticated_session_approve);\n\n    try {\n      await this.sendResult<\"wc_sessionAuthenticate\">({\n        topic: responseTopic,\n        id,\n        result: {\n          cacaos: auths,\n          responder: {\n            publicKey: senderPublicKey,\n            metadata: this.client.metadata,\n          },\n        },\n        encodeOpts,\n        throwOnFailedPublish: true,\n        appLink: this.getAppLinkIfEnabled(pendingRequest.requester.metadata, transportType),\n      });\n    } catch (error) {\n      event.setError(\n        EVENT_CLIENT_AUTHENTICATE_ERRORS.authenticated_session_approve_publish_failure,\n      );\n      throw error;\n    }\n\n    await this.client.auth.requests.delete(id, { message: \"fulfilled\", code: 0 });\n    await this.client.core.pairing.activate({ topic: pendingRequest.pairingTopic });\n    this.client.core.eventClient.deleteEvent({ eventId: event.eventId });\n\n    return { session };\n  };\n\n  public rejectSessionAuthenticate: IEngine[\"rejectSessionAuthenticate\"] = async (params) => {\n    this.isInitialized();\n\n    const { id, reason } = params;\n\n    const pendingRequest = this.getPendingAuthRequest(id);\n\n    if (!pendingRequest) {\n      throw new Error(`Could not find pending auth request with id ${id}`);\n    }\n\n    if (pendingRequest.transportType === TRANSPORT_TYPES.relay) {\n      await this.confirmOnlineStateOrThrow();\n    }\n\n    const receiverPublicKey = pendingRequest.requester.publicKey;\n    const senderPublicKey = await this.client.core.crypto.generateKeyPair();\n    const responseTopic = hashKey(receiverPublicKey);\n\n    const encodeOpts = {\n      type: TYPE_1,\n      receiverPublicKey,\n      senderPublicKey,\n    };\n\n    await this.sendError({\n      id,\n      topic: responseTopic,\n      error: reason,\n      encodeOpts,\n      rpcOpts: ENGINE_RPC_OPTS.wc_sessionAuthenticate.reject,\n      appLink: this.getAppLinkIfEnabled(\n        pendingRequest.requester.metadata,\n        pendingRequest.transportType,\n      ),\n    });\n    await this.client.auth.requests.delete(id, { message: \"rejected\", code: 0 });\n    await this.deleteProposal(id);\n  };\n\n  public formatAuthMessage: IEngine[\"formatAuthMessage\"] = (params) => {\n    this.isInitialized();\n    const { request, iss } = params;\n    return formatMessage(request, iss);\n  };\n\n  /**\n   * no longer used as the client initializes instantly without waiting to connect+subscribe\n   * @deprecated\n   */\n  public processRelayMessageCache: IEngine[\"processRelayMessageCache\"] = () => {\n    // process the relay messages cache in the next tick to allow event listeners to be registered by the implementing app\n    setTimeout(async () => {\n      if (this.relayMessageCache.length === 0) return;\n      while (this.relayMessageCache.length > 0) {\n        try {\n          const message = this.relayMessageCache.shift();\n          if (message) {\n            await this.onRelayMessage(message);\n          }\n        } catch (error) {\n          this.client.logger.error(error);\n        }\n      }\n    }, 50);\n  };\n\n  // ---------- Private Helpers --------------------------------------- //\n\n  private cleanupDuplicatePairings: EnginePrivate[\"cleanupDuplicatePairings\"] = async (\n    session: SessionTypes.Struct,\n  ) => {\n    // older SDK versions are missing the `pairingTopic` prop thus we need to check for it\n    if (!session.pairingTopic) return;\n\n    try {\n      const pairing = this.client.core.pairing.pairings.get(session.pairingTopic);\n      const allPairings = this.client.core.pairing.pairings.getAll();\n      const duplicates = allPairings.filter(\n        (p) =>\n          p.peerMetadata?.url &&\n          p.peerMetadata?.url === session.peer.metadata.url &&\n          p.topic &&\n          p.topic !== pairing.topic,\n      );\n      if (duplicates.length === 0) return;\n      this.client.logger.info(`Cleaning up ${duplicates.length} duplicate pairing(s)`);\n      await Promise.all(\n        duplicates.map((p) => this.client.core.pairing.disconnect({ topic: p.topic })),\n      );\n      this.client.logger.info(`Duplicate pairings clean up finished`);\n    } catch (error) {\n      this.client.logger.error(error);\n    }\n  };\n\n  private deleteSession: EnginePrivate[\"deleteSession\"] = async (params) => {\n    const { topic, expirerHasDeleted = false, emitEvent = true, id = 0 } = params;\n    const { self } = this.client.session.get(topic);\n    // Await the unsubscribe first to avoid deleting the symKey too early below.\n    await this.client.core.relayer.unsubscribe(topic);\n    await this.client.session.delete(topic, getSdkError(\"USER_DISCONNECTED\"));\n    this.addToRecentlyDeleted(topic, \"session\");\n    if (this.client.core.crypto.keychain.has(self.publicKey)) {\n      await this.client.core.crypto.deleteKeyPair(self.publicKey);\n    }\n    if (this.client.core.crypto.keychain.has(topic)) {\n      await this.client.core.crypto.deleteSymKey(topic);\n    }\n    if (!expirerHasDeleted) this.client.core.expirer.del(topic);\n    // remove any deeplinks from storage after the session is deleted\n    // to avoid navigating to incorrect deeplink later on\n    this.client.core.storage\n      .removeItem(WALLETCONNECT_DEEPLINK_CHOICE)\n      .catch((e) => this.client.logger.warn(e));\n    // reset the queue state back to idle if a request for the deleted session is still in the queue\n    if (topic === this.sessionRequestQueue.queue[0]?.topic) {\n      this.sessionRequestQueue.state = ENGINE_QUEUE_STATES.idle;\n    }\n\n    await Promise.all(\n      this.getPendingSessionRequests()\n        .filter((r) => r.topic === topic)\n        .map((r) => this.deletePendingSessionRequest(r.id, getSdkError(\"USER_DISCONNECTED\"))),\n    );\n\n    if (emitEvent) this.client.events.emit(\"session_delete\", { id, topic });\n  };\n\n  private deleteProposal: EnginePrivate[\"deleteProposal\"] = async (id, expirerHasDeleted) => {\n    if (expirerHasDeleted) {\n      try {\n        const proposal = this.client.proposal.get(id);\n        const event = this.client.core.eventClient.getEvent({ topic: proposal.pairingTopic });\n        event?.setError(EVENT_CLIENT_SESSION_ERRORS.proposal_expired);\n      } catch (error) {}\n    }\n    await Promise.all([\n      this.client.proposal.delete(id, getSdkError(\"USER_DISCONNECTED\")),\n      expirerHasDeleted ? Promise.resolve() : this.client.core.expirer.del(id),\n    ]);\n    this.addToRecentlyDeleted(id, \"proposal\");\n  };\n\n  private deletePendingSessionRequest: EnginePrivate[\"deletePendingSessionRequest\"] = async (\n    id,\n    reason,\n    expirerHasDeleted = false,\n  ) => {\n    await Promise.all([\n      this.client.pendingRequest.delete(id, reason),\n      expirerHasDeleted ? Promise.resolve() : this.client.core.expirer.del(id),\n    ]);\n    this.addToRecentlyDeleted(id, \"request\");\n    this.sessionRequestQueue.queue = this.sessionRequestQueue.queue.filter((r) => r.id !== id);\n    if (expirerHasDeleted) {\n      this.sessionRequestQueue.state = ENGINE_QUEUE_STATES.idle;\n      this.client.events.emit(\"session_request_expire\", { id });\n    }\n  };\n\n  private deletePendingAuthRequest: EnginePrivate[\"deletePendingAuthRequest\"] = async (\n    id,\n    reason,\n    expirerHasDeleted = false,\n  ) => {\n    await Promise.all([\n      this.client.auth.requests.delete(id, reason),\n      expirerHasDeleted ? Promise.resolve() : this.client.core.expirer.del(id),\n    ]);\n  };\n\n  private setExpiry: EnginePrivate[\"setExpiry\"] = async (topic, expiry) => {\n    if (!this.client.session.keys.includes(topic)) return;\n    this.client.core.expirer.set(topic, expiry);\n    await this.client.session.update(topic, { expiry });\n  };\n\n  private setProposal: EnginePrivate[\"setProposal\"] = async (id, proposal) => {\n    this.client.core.expirer.set(id, calcExpiry(ENGINE_RPC_OPTS.wc_sessionPropose.req.ttl));\n    await this.client.proposal.set(id, proposal);\n  };\n\n  private setAuthRequest: EnginePrivate[\"setAuthRequest\"] = async (id, params) => {\n    const { request, pairingTopic, transportType = TRANSPORT_TYPES.relay } = params;\n    this.client.core.expirer.set(id, request.expiryTimestamp);\n    await this.client.auth.requests.set(id, {\n      authPayload: request.authPayload,\n      requester: request.requester,\n      expiryTimestamp: request.expiryTimestamp,\n      id,\n      pairingTopic,\n      verifyContext: request.verifyContext,\n      transportType,\n    });\n  };\n\n  private setPendingSessionRequest: EnginePrivate[\"setPendingSessionRequest\"] = async (\n    pendingRequest: PendingRequestTypes.Struct,\n  ) => {\n    const { id, topic, params, verifyContext } = pendingRequest;\n    const expiry =\n      params.request.expiryTimestamp || calcExpiry(ENGINE_RPC_OPTS.wc_sessionRequest.req.ttl);\n    this.client.core.expirer.set(id, expiry);\n    await this.client.pendingRequest.set(id, {\n      id,\n      topic,\n      params,\n      verifyContext,\n    });\n  };\n\n  private sendRequest: EnginePrivate[\"sendRequest\"] = async (args) => {\n    const {\n      topic,\n      method,\n      params,\n      expiry,\n      relayRpcId,\n      clientRpcId,\n      throwOnFailedPublish,\n      appLink,\n      tvf,\n      publishOpts = {},\n    } = args;\n    const payload = formatJsonRpcRequest(method, params, clientRpcId);\n\n    let message: string;\n    const isLinkMode = !!appLink;\n\n    try {\n      const encoding = isLinkMode ? BASE64URL : BASE64;\n      message = await this.client.core.crypto.encode(topic, payload, { encoding });\n    } catch (error) {\n      await this.cleanup();\n      this.client.logger.error(`sendRequest() -> core.crypto.encode() for topic ${topic} failed`);\n      throw error;\n    }\n\n    let attestation: string | undefined;\n    if (METHODS_TO_VERIFY.includes(method)) {\n      const decryptedId = hashMessage(JSON.stringify(payload));\n      const id = hashMessage(message);\n      attestation = await this.client.core.verify.register({ id, decryptedId });\n    }\n\n    const opts = {\n      ...ENGINE_RPC_OPTS[method].req,\n      ...publishOpts,\n    };\n\n    opts.attestation = attestation;\n    if (expiry) opts.ttl = expiry;\n    if (relayRpcId) opts.id = relayRpcId;\n    this.client.core.history.set(topic, payload);\n\n    if (isLinkMode) {\n      const redirectURL = getLinkModeURL(appLink, topic, message);\n      await (global as any).Linking.openURL(redirectURL, this.client.name);\n    } else {\n      opts.tvf = {\n        ...tvf,\n        correlationId: payload.id,\n      };\n\n      if (throwOnFailedPublish) {\n        opts.internal = {\n          ...opts.internal,\n          throwOnFailedPublish: true,\n        };\n        await this.client.core.relayer.publish(topic, message, opts);\n      } else {\n        this.client.core.relayer\n          .publish(topic, message, opts)\n          .catch((error) => this.client.logger.error(error));\n      }\n    }\n\n    return payload.id;\n  };\n\n  private sendProposeSession: EnginePrivate[\"sendProposeSession\"] = async (params) => {\n    const { proposal, publishOpts } = params;\n\n    const proposeSessionPayload = formatJsonRpcRequest(\"wc_sessionPropose\", proposal, proposal.id);\n\n    this.client.core.history.set(proposal.pairingTopic, proposeSessionPayload);\n\n    const proposeSessionMessage = await this.client.core.crypto.encode(\n      proposal.pairingTopic,\n      proposeSessionPayload,\n      {\n        encoding: BASE64,\n      },\n    );\n\n    const decryptedId = hashMessage(JSON.stringify(proposeSessionPayload));\n    const attestationId = hashMessage(proposeSessionMessage);\n    const attestation = await this.client.core.verify.register({ id: attestationId, decryptedId });\n\n    await this.client.core.relayer.publishCustom({\n      payload: {\n        pairingTopic: proposal.pairingTopic,\n        sessionProposal: proposeSessionMessage,\n      },\n      opts: {\n        ...publishOpts,\n        publishMethod: \"wc_proposeSession\",\n        attestation,\n      },\n    });\n  };\n\n  private sendApproveSession: EnginePrivate[\"sendApproveSession\"] = async (params) => {\n    const { sessionTopic, pairingProposalResponse, proposal, sessionSettleRequest, publishOpts } =\n      params;\n    const pairingPayload = formatJsonRpcResult(proposal.id, pairingProposalResponse);\n\n    const pairingResponseMessage = await this.client.core.crypto.encode(\n      proposal.pairingTopic,\n      pairingPayload,\n      {\n        encoding: BASE64,\n      },\n    );\n\n    const sessionSettlePayload = formatJsonRpcRequest(\n      \"wc_sessionSettle\",\n      sessionSettleRequest,\n      publishOpts?.id,\n    );\n\n    const sessionSettlementRequestMessage = await this.client.core.crypto.encode(\n      sessionTopic,\n      sessionSettlePayload,\n      {\n        encoding: BASE64,\n      },\n    );\n\n    this.client.core.history.set(sessionTopic, sessionSettlePayload);\n\n    await this.client.core.relayer.publishCustom({\n      payload: {\n        sessionTopic,\n        pairingTopic: proposal.pairingTopic,\n        sessionProposalResponse: pairingResponseMessage,\n        sessionSettlementRequest: sessionSettlementRequestMessage,\n      },\n      opts: {\n        ...publishOpts,\n        publishMethod: \"wc_approveSession\",\n      },\n    });\n  };\n\n  private sendResult: EnginePrivate[\"sendResult\"] = async (args) => {\n    const { id, topic, result, throwOnFailedPublish, encodeOpts, appLink } = args;\n    const payload = formatJsonRpcResult(id, result);\n    let message;\n    const isLinkMode = appLink && typeof (global as any)?.Linking !== \"undefined\";\n\n    try {\n      const encoding = isLinkMode ? BASE64URL : BASE64;\n      message = await this.client.core.crypto.encode(topic, payload, {\n        ...(encodeOpts || {}),\n        encoding,\n      });\n    } catch (error) {\n      // if encoding fails e.g. due to missing keychain, we want to cleanup all related data as its unusable\n      await this.cleanup();\n      this.client.logger.error(`sendResult() -> core.crypto.encode() for topic ${topic} failed`);\n      throw error;\n    }\n    let record;\n    let tvf;\n    try {\n      record = await this.client.core.history.get(topic, id);\n      const request = record.request;\n      try {\n        tvf = this.getTVFParams(id, request.params, result);\n      } catch (error) {\n        this.client.logger.warn(\n          `sendResult() -> getTVFParams() failed: ${(error as Error)?.message}`,\n        );\n      }\n    } catch (error) {\n      this.client.logger.error(`sendResult() -> history.get(${topic}, ${id}) failed`);\n      throw error;\n    }\n\n    if (isLinkMode) {\n      const redirectURL = getLinkModeURL(appLink, topic, message);\n      await (global as any).Linking.openURL(redirectURL, this.client.name);\n    } else {\n      const method = record.request.method as JsonRpcTypes.WcMethod;\n      const opts = ENGINE_RPC_OPTS[method].res;\n\n      opts.tvf = {\n        ...tvf,\n        correlationId: id,\n      };\n\n      if (throwOnFailedPublish) {\n        opts.internal = {\n          ...opts.internal,\n          throwOnFailedPublish: true,\n        };\n        await this.client.core.relayer.publish(topic, message, opts);\n      } else {\n        this.client.core.relayer\n          .publish(topic, message, opts)\n          .catch((error) => this.client.logger.error(error));\n      }\n    }\n\n    await this.client.core.history.resolve(payload);\n  };\n\n  private sendError: EnginePrivate[\"sendError\"] = async (params) => {\n    const { id, topic, error, encodeOpts, rpcOpts, appLink } = params;\n    const payload = formatJsonRpcError(id, error);\n    let message;\n    const isLinkMode = appLink && typeof (global as any)?.Linking !== \"undefined\";\n    try {\n      const encoding = isLinkMode ? BASE64URL : BASE64;\n      message = await this.client.core.crypto.encode(topic, payload, {\n        ...(encodeOpts || {}),\n        encoding,\n      });\n    } catch (error) {\n      await this.cleanup();\n      this.client.logger.error(`sendError() -> core.crypto.encode() for topic ${topic} failed`);\n      throw error;\n    }\n    let record;\n    try {\n      record = await this.client.core.history.get(topic, id);\n    } catch (error) {\n      this.client.logger.error(`sendError() -> history.get(${topic}, ${id}) failed`);\n      throw error;\n    }\n\n    if (isLinkMode) {\n      const redirectURL = getLinkModeURL(appLink, topic, message);\n      await (global as any).Linking.openURL(redirectURL, this.client.name);\n    } else {\n      const method = record.request.method as JsonRpcTypes.WcMethod;\n      const opts = rpcOpts || ENGINE_RPC_OPTS[method].res;\n      // await is intentionally omitted to speed up performance\n      this.client.core.relayer.publish(topic, message, opts);\n    }\n\n    await this.client.core.history.resolve(payload);\n  };\n\n  private cleanup: EnginePrivate[\"cleanup\"] = async () => {\n    const sessionTopics: string[] = [];\n    const proposalIds: number[] = [];\n    this.client.session.getAll().forEach((session) => {\n      let toCleanup = false;\n      if (isExpired(session.expiry)) toCleanup = true;\n      if (!this.client.core.crypto.keychain.has(session.topic)) toCleanup = true;\n      if (toCleanup) sessionTopics.push(session.topic);\n    });\n    this.client.proposal.getAll().forEach((proposal) => {\n      if (isExpired(proposal.expiryTimestamp)) proposalIds.push(proposal.id);\n    });\n    await Promise.all([\n      ...sessionTopics.map((topic) => this.deleteSession({ topic })),\n      ...proposalIds.map((id) => this.deleteProposal(id)),\n    ]);\n  };\n\n  private isInitialized() {\n    if (!this.initialized) {\n      const { message } = getInternalError(\"NOT_INITIALIZED\", this.name);\n      throw new Error(message);\n    }\n  }\n\n  private async confirmOnlineStateOrThrow() {\n    await this.client.core.relayer.confirmOnlineStateOrThrow();\n  }\n\n  // ---------- Relay Events Router ----------------------------------- //\n\n  private registerRelayerEvents() {\n    this.client.core.relayer.on(RELAYER_EVENTS.message, (event: RelayerTypes.MessageEvent) => {\n      this.onProviderMessageEvent(event);\n    });\n  }\n\n  private onProviderMessageEvent = async (event: RelayerTypes.MessageEvent) => {\n    // capture any messages that arrive before the client is initialized so we can process them after initialization is complete\n    if (!this.initialized || this.relayMessageCache.length > 0) {\n      this.relayMessageCache.push(event);\n    } else {\n      await this.onRelayMessage(event);\n    }\n  };\n\n  private async onRelayMessage(event: RelayerTypes.MessageEvent) {\n    const { topic, message, attestation, transportType } = event;\n\n    // Retrieve the public key (if defined) to decrypt possible `auth_request` response\n    const { publicKey } = this.client.auth.authKeys.keys.includes(AUTH_PUBLIC_KEY_NAME)\n      ? this.client.auth.authKeys.get(AUTH_PUBLIC_KEY_NAME)\n      : ({ responseTopic: undefined, publicKey: undefined } as any);\n\n    try {\n      const payload = await this.client.core.crypto.decode(topic, message, {\n        receiverPublicKey: publicKey,\n        encoding: transportType === TRANSPORT_TYPES.link_mode ? BASE64URL : BASE64,\n      });\n\n      if (isJsonRpcRequest(payload)) {\n        this.client.core.history.set(topic, payload);\n        await this.onRelayEventRequest({\n          topic,\n          payload,\n          attestation,\n          transportType,\n          encryptedId: hashMessage(message),\n        });\n      } else if (isJsonRpcResponse(payload)) {\n        await this.client.core.history.resolve(payload);\n        await this.onRelayEventResponse({ topic, payload, transportType });\n        this.client.core.history.delete(topic, payload.id);\n      } else {\n        this.client.logger.error(`onRelayMessage() -> unknown payload: ${JSON.stringify(payload)}`);\n        await this.onRelayEventUnknownPayload({ topic, payload, transportType });\n      }\n      await this.client.core.relayer.messages.ack(topic, message);\n    } catch (error) {\n      this.client.logger.error(\n        `onRelayMessage() -> failed to process an inbound message: ${message}`,\n      );\n      this.client.logger.error(error);\n    }\n  }\n\n  private onRelayEventRequest: EnginePrivate[\"onRelayEventRequest\"] = async (event) => {\n    this.requestQueue.queue.push(event);\n    await this.processRequestsQueue();\n  };\n\n  private processRequestsQueue = async () => {\n    if (this.requestQueue.state === ENGINE_QUEUE_STATES.active) {\n      this.client.logger.info(`Request queue already active, skipping...`);\n      return;\n    }\n\n    this.client.logger.info(\n      `Request queue starting with ${this.requestQueue.queue.length} requests`,\n    );\n\n    while (this.requestQueue.queue.length > 0) {\n      this.requestQueue.state = ENGINE_QUEUE_STATES.active;\n      const request = this.requestQueue.queue.shift();\n      if (!request) continue;\n\n      try {\n        await this.processRequest(request);\n      } catch (error) {\n        this.client.logger.warn(error);\n      }\n    }\n    this.requestQueue.state = ENGINE_QUEUE_STATES.idle;\n  };\n\n  private processRequest: EnginePrivate[\"onRelayEventRequest\"] = async (event) => {\n    const { topic, payload, attestation, transportType, encryptedId } = event;\n\n    const reqMethod = payload.method as JsonRpcTypes.WcMethod;\n\n    if (this.shouldIgnorePairingRequest({ topic, requestMethod: reqMethod })) {\n      return;\n    }\n\n    switch (reqMethod) {\n      case \"wc_sessionPropose\":\n        return await this.onSessionProposeRequest({ topic, payload, attestation, encryptedId });\n      case \"wc_sessionSettle\":\n        return await this.onSessionSettleRequest(topic, payload);\n      case \"wc_sessionUpdate\":\n        return await this.onSessionUpdateRequest(topic, payload);\n      case \"wc_sessionExtend\":\n        return await this.onSessionExtendRequest(topic, payload);\n      case \"wc_sessionPing\":\n        return await this.onSessionPingRequest(topic, payload);\n      case \"wc_sessionDelete\":\n        return await this.onSessionDeleteRequest(topic, payload);\n      case \"wc_sessionRequest\":\n        return await this.onSessionRequest({\n          topic,\n          payload,\n          attestation,\n          encryptedId,\n          transportType,\n        });\n      case \"wc_sessionEvent\":\n        return await this.onSessionEventRequest(topic, payload);\n      case \"wc_sessionAuthenticate\":\n        return await this.onSessionAuthenticateRequest({\n          topic,\n          payload,\n          attestation,\n          encryptedId,\n          transportType,\n        });\n      default:\n        return this.client.logger.info(`Unsupported request method ${reqMethod}`);\n    }\n  };\n\n  private onRelayEventResponse: EnginePrivate[\"onRelayEventResponse\"] = async (event) => {\n    const { topic, payload, transportType } = event;\n    const record = await this.client.core.history.get(topic, payload.id);\n    const resMethod = record.request.method as JsonRpcTypes.WcMethod;\n\n    switch (resMethod) {\n      case \"wc_sessionPropose\":\n        return this.onSessionProposeResponse(topic, payload, transportType);\n      case \"wc_sessionSettle\":\n        return this.onSessionSettleResponse(topic, payload);\n      case \"wc_sessionUpdate\":\n        return this.onSessionUpdateResponse(topic, payload);\n      case \"wc_sessionExtend\":\n        return this.onSessionExtendResponse(topic, payload);\n      case \"wc_sessionPing\":\n        return this.onSessionPingResponse(topic, payload);\n      case \"wc_sessionRequest\":\n        return this.onSessionRequestResponse(topic, payload);\n      case \"wc_sessionAuthenticate\":\n        return this.onSessionAuthenticateResponse(topic, payload);\n      default:\n        return this.client.logger.info(`Unsupported response method ${resMethod}`);\n    }\n  };\n\n  private onRelayEventUnknownPayload: EnginePrivate[\"onRelayEventUnknownPayload\"] = (event) => {\n    const { topic } = event;\n    const { message } = getInternalError(\n      \"MISSING_OR_INVALID\",\n      `Decoded payload on topic ${topic} is not identifiable as a JSON-RPC request or a response.`,\n    );\n    throw new Error(message);\n  };\n\n  private shouldIgnorePairingRequest: EnginePrivate[\"shouldIgnorePairingRequest\"] = (params) => {\n    const { topic, requestMethod } = params;\n    const expectedMethods = this.expectedPairingMethodMap.get(topic);\n    // check if the request method matches the expected method\n    if (!expectedMethods) return false;\n    if (expectedMethods.includes(requestMethod)) return false;\n\n    /**\n     * we want to make sure fallback session proposal is ignored only if there are subscribers\n     * for the `session_authenticate` event, otherwise this would result in no-op for the user\n     */\n    if (expectedMethods.includes(\"wc_sessionAuthenticate\")) {\n      if (this.client.events.listenerCount(\"session_authenticate\") > 0) {\n        return true;\n      }\n    }\n    return false;\n  };\n\n  // ---------- Relay Events Handlers --------------------------------- //\n\n  private onSessionProposeRequest: EnginePrivate[\"onSessionProposeRequest\"] = async (args) => {\n    const { topic, payload, attestation, encryptedId } = args;\n    const { params, id } = payload;\n    try {\n      const event = this.client.core.eventClient.getEvent({ topic });\n\n      if (this.client.events.listenerCount(\"session_proposal\") === 0) {\n        console.warn(\"No listener for session_proposal event\");\n        event?.setError(EVENT_CLIENT_PAIRING_ERRORS.proposal_listener_not_found);\n      }\n\n      this.isValidConnect({ ...payload.params });\n      const expiryTimestamp =\n        params.expiryTimestamp || calcExpiry(ENGINE_RPC_OPTS.wc_sessionPropose.req.ttl);\n      const proposal: ProposalTypes.Struct = {\n        id,\n        pairingTopic: topic,\n        expiryTimestamp,\n        attestation,\n        encryptedId,\n        ...params,\n      };\n      await this.setProposal(id, proposal);\n\n      const verifyContext = await this.getVerifyContext({\n        attestationId: attestation,\n        hash: hashMessage(JSON.stringify(payload)),\n        encryptedId,\n        metadata: proposal.proposer.metadata,\n      });\n\n      event?.addTrace(EVENT_CLIENT_PAIRING_TRACES.emit_session_proposal);\n\n      this.client.events.emit(\"session_proposal\", { id, params: proposal, verifyContext });\n    } catch (err: any) {\n      await this.sendError({\n        id,\n        topic,\n        error: err,\n        rpcOpts: ENGINE_RPC_OPTS.wc_sessionPropose.autoReject,\n      });\n      this.client.logger.error(err);\n    }\n  };\n\n  private onSessionProposeResponse: EnginePrivate[\"onSessionProposeResponse\"] = async (\n    topic,\n    payload,\n    transportType,\n  ) => {\n    const { id } = payload;\n\n    if (isJsonRpcResult(payload)) {\n      const { result } = payload;\n      this.client.logger.trace({ type: \"method\", method: \"onSessionProposeResponse\", result });\n      const proposal = this.client.proposal.get(id);\n      this.client.logger.trace({ type: \"method\", method: \"onSessionProposeResponse\", proposal });\n      const selfPublicKey = proposal.proposer.publicKey;\n      this.client.logger.trace({\n        type: \"method\",\n        method: \"onSessionProposeResponse\",\n        selfPublicKey,\n      });\n      const peerPublicKey = result.responderPublicKey;\n      this.client.logger.trace({\n        type: \"method\",\n        method: \"onSessionProposeResponse\",\n        peerPublicKey,\n      });\n      const sessionTopic = await this.client.core.crypto.generateSharedKey(\n        selfPublicKey,\n        peerPublicKey,\n      );\n      this.pendingSessions.set(id, {\n        sessionTopic,\n        pairingTopic: topic,\n        proposalId: id,\n        publicKey: selfPublicKey,\n      });\n\n      const subscriptionId = await this.client.core.relayer.subscribe(sessionTopic, {\n        transportType,\n      });\n      this.client.logger.trace({\n        type: \"method\",\n        method: \"onSessionProposeResponse\",\n        subscriptionId,\n      });\n      await this.client.core.pairing.activate({ topic });\n    } else if (isJsonRpcError(payload)) {\n      await this.deleteProposal(id);\n      const target = engineEvent(\"session_connect\", id);\n      const listeners = this.events.listenerCount(target);\n      if (listeners === 0) {\n        throw new Error(`emitting ${target} without any listeners, 954`);\n      }\n      this.events.emit(target, { error: payload.error });\n    }\n  };\n\n  private onSessionSettleRequest: EnginePrivate[\"onSessionSettleRequest\"] = async (\n    topic,\n    payload,\n  ) => {\n    const { id, params } = payload;\n    try {\n      this.isValidSessionSettleRequest(params);\n      const {\n        relay,\n        controller,\n        expiry,\n        namespaces,\n        sessionProperties,\n        scopedProperties,\n        sessionConfig,\n        proposalRequestsResponses,\n      } = payload.params;\n      const pendingSession = [...this.pendingSessions.values()].find(\n        (s) => s.sessionTopic === topic,\n      );\n\n      if (!pendingSession) {\n        return this.client.logger.error(`Pending session not found for topic ${topic}`);\n      }\n\n      const proposal = this.client.proposal.get(pendingSession.proposalId);\n\n      const session: SessionTypes.Struct = {\n        topic,\n        relay,\n        expiry,\n        namespaces,\n        acknowledged: true,\n        pairingTopic: pendingSession.pairingTopic,\n        requiredNamespaces: proposal.requiredNamespaces,\n        optionalNamespaces: proposal.optionalNamespaces,\n        controller: controller.publicKey,\n        self: {\n          publicKey: pendingSession.publicKey,\n          metadata: this.client.metadata,\n        },\n        peer: {\n          publicKey: controller.publicKey,\n          metadata: controller.metadata,\n        },\n        ...(sessionProperties && { sessionProperties }),\n        ...(scopedProperties && { scopedProperties }),\n        ...(sessionConfig && { sessionConfig }),\n        transportType: TRANSPORT_TYPES.relay,\n        authentication: proposalRequestsResponses?.authentication,\n        walletPayResult: proposalRequestsResponses?.walletPay,\n      };\n\n      await this.client.session.set(session.topic, session);\n      await this.setExpiry(session.topic, session.expiry);\n\n      await this.client.core.pairing.updateMetadata({\n        topic: pendingSession.pairingTopic,\n        metadata: session.peer.metadata,\n      });\n\n      this.pendingSessions.delete(pendingSession.proposalId);\n      this.deleteProposal(pendingSession.proposalId, false);\n      this.cleanupDuplicatePairings(session);\n\n      await this.sendResult<\"wc_sessionSettle\">({\n        id: payload.id,\n        topic,\n        throwOnFailedPublish: true,\n        result: true,\n      });\n\n      this.client.events.emit(\"session_connect\", { session });\n      this.events.emit(engineEvent(\"session_connect\", pendingSession.proposalId), { session });\n    } catch (err: any) {\n      await this.sendError({\n        id,\n        topic,\n        error: err,\n      });\n      this.client.logger.error(err);\n    }\n  };\n\n  private onSessionSettleResponse: EnginePrivate[\"onSessionSettleResponse\"] = async (\n    topic,\n    payload,\n  ) => {\n    const { id } = payload;\n    if (isJsonRpcResult(payload)) {\n      await this.client.session.update(topic, { acknowledged: true });\n      this.events.emit(engineEvent(\"session_approve\", id), {});\n    } else if (isJsonRpcError(payload)) {\n      await this.deleteSession({ topic, emitEvent: false });\n      this.events.emit(engineEvent(\"session_approve\", id), { error: payload.error });\n    }\n  };\n\n  private onSessionUpdateRequest: EnginePrivate[\"onSessionUpdateRequest\"] = async (\n    topic,\n    payload,\n  ) => {\n    const { params, id } = payload;\n    try {\n      const memoryKey = `${topic}_session_update`;\n      // compare the current request id with the last processed session update\n      // we want to update only if the request is newer than the last processed one\n      const lastSessionUpdateId = MemoryStore.get<number>(memoryKey);\n\n      if (lastSessionUpdateId && this.isRequestOutOfSync(lastSessionUpdateId, id)) {\n        this.client.logger.warn(`Discarding out of sync request - ${id}`);\n        this.sendError({ id, topic, error: getSdkError(\"INVALID_UPDATE_REQUEST\") });\n        return;\n      }\n      this.isValidUpdate({ topic, ...params });\n      try {\n        MemoryStore.set(memoryKey, id);\n        await this.client.session.update(topic, { namespaces: params.namespaces });\n        await this.sendResult<\"wc_sessionUpdate\">({\n          id,\n          topic,\n          result: true,\n        });\n      } catch (e) {\n        MemoryStore.delete(memoryKey);\n        throw e;\n      }\n\n      this.client.events.emit(\"session_update\", { id, topic, params });\n    } catch (err: any) {\n      await this.sendError({\n        id,\n        topic,\n        error: err,\n      });\n      this.client.logger.error(err);\n    }\n  };\n\n  // compares the timestamp of the last processed request with the current request\n  // client <-> client rpc ID is timestamp + 3 random digits\n  private isRequestOutOfSync = (lastId: number, currentId: number) => {\n    return currentId.toString().slice(0, -3) < lastId.toString().slice(0, -3);\n  };\n\n  private onSessionUpdateResponse: EnginePrivate[\"onSessionUpdateResponse\"] = (_topic, payload) => {\n    const { id } = payload;\n    const target = engineEvent(\"session_update\", id);\n    const listeners = this.events.listenerCount(target);\n    if (listeners === 0) {\n      throw new Error(`emitting ${target} without any listeners`);\n    }\n    if (isJsonRpcResult(payload)) {\n      this.events.emit(engineEvent(\"session_update\", id), {});\n    } else if (isJsonRpcError(payload)) {\n      this.events.emit(engineEvent(\"session_update\", id), { error: payload.error });\n    }\n  };\n\n  private onSessionExtendRequest: EnginePrivate[\"onSessionExtendRequest\"] = async (\n    topic,\n    payload,\n  ) => {\n    const { id } = payload;\n    try {\n      this.isValidExtend({ topic });\n      await this.setExpiry(topic, calcExpiry(SESSION_EXPIRY));\n      await this.sendResult<\"wc_sessionExtend\">({\n        id,\n        topic,\n        result: true,\n      });\n      this.client.events.emit(\"session_extend\", { id, topic });\n    } catch (err: any) {\n      await this.sendError({\n        id,\n        topic,\n        error: err,\n      });\n      this.client.logger.error(err);\n    }\n  };\n\n  private onSessionExtendResponse: EnginePrivate[\"onSessionExtendResponse\"] = (_topic, payload) => {\n    const { id } = payload;\n    const target = engineEvent(\"session_extend\", id);\n    const listeners = this.events.listenerCount(target);\n    if (listeners === 0) {\n      throw new Error(`emitting ${target} without any listeners`);\n    }\n    if (isJsonRpcResult(payload)) {\n      this.events.emit(engineEvent(\"session_extend\", id), {});\n    } else if (isJsonRpcError(payload)) {\n      this.events.emit(engineEvent(\"session_extend\", id), { error: payload.error });\n    }\n  };\n\n  private onSessionPingRequest: EnginePrivate[\"onSessionPingRequest\"] = async (topic, payload) => {\n    const { id } = payload;\n    try {\n      this.isValidPing({ topic });\n      await this.sendResult<\"wc_sessionPing\">({\n        id,\n        topic,\n        result: true,\n        throwOnFailedPublish: true,\n      });\n      this.client.events.emit(\"session_ping\", { id, topic });\n    } catch (err: any) {\n      await this.sendError({\n        id,\n        topic,\n        error: err,\n      });\n      this.client.logger.error(err);\n    }\n  };\n\n  private onSessionPingResponse: EnginePrivate[\"onSessionPingResponse\"] = (_topic, payload) => {\n    const { id } = payload;\n    const target = engineEvent(\"session_ping\", id);\n\n    // put at the end of the stack to avoid a race condition\n    // where session_ping listener is not yet initialized\n    setTimeout(() => {\n      const listeners = this.events.listenerCount(target);\n      if (listeners === 0) {\n        throw new Error(`emitting ${target} without any listeners 2176`);\n      }\n\n      if (isJsonRpcResult(payload)) {\n        this.events.emit(engineEvent(\"session_ping\", id), {});\n      } else if (isJsonRpcError(payload)) {\n        this.events.emit(engineEvent(\"session_ping\", id), { error: payload.error });\n      }\n    }, 500);\n  };\n\n  private onSessionDeleteRequest: EnginePrivate[\"onSessionDeleteRequest\"] = async (\n    topic,\n    payload,\n  ) => {\n    const { id } = payload;\n    try {\n      await this.isValidDisconnect({ topic, reason: payload.params });\n      this.cleanupPendingSentRequestsForTopic({ topic, error: getSdkError(\"USER_DISCONNECTED\") });\n      await this.deleteSession({ topic, id });\n    } catch (err: any) {\n      this.client.logger.error(err);\n    }\n  };\n\n  private onSessionRequest: EnginePrivate[\"onSessionRequest\"] = async (args) => {\n    const { topic, payload, attestation, encryptedId, transportType } = args;\n    const { id, params } = payload;\n    try {\n      await this.isValidRequest({ topic, ...params });\n      const session = this.client.session.get(topic);\n      const verifyContext = await this.getVerifyContext({\n        attestationId: attestation,\n        hash: hashMessage(JSON.stringify(formatJsonRpcRequest(\"wc_sessionRequest\", params, id))),\n        encryptedId,\n        metadata: session.peer.metadata,\n        transportType,\n      });\n      const request = {\n        id,\n        topic,\n        params,\n        verifyContext,\n      };\n      await this.setPendingSessionRequest(request);\n\n      if (\n        transportType === TRANSPORT_TYPES.link_mode &&\n        session.peer.metadata.redirect?.universal\n      ) {\n        // save app as supported for link mode\n        this.client.core.addLinkModeSupportedApp(session.peer.metadata.redirect?.universal);\n      }\n\n      // without sequential processing. This bypasses deduplication provided by the queue,\n      // at-least-once delivery guarantee.\n      if (this.client.signConfig?.disableRequestQueue) {\n        this.emitSessionRequest(request);\n      } else {\n        this.addSessionRequestToSessionRequestQueue(request);\n        this.processSessionRequestQueue();\n      }\n    } catch (err: any) {\n      await this.sendError({\n        id,\n        topic,\n        error: err,\n      });\n      this.client.logger.error(err);\n    }\n  };\n\n  private onSessionRequestResponse: EnginePrivate[\"onSessionRequestResponse\"] = (\n    _topic,\n    payload,\n  ) => {\n    const { id } = payload;\n    const target = engineEvent(\"session_request\", id);\n    const listeners = this.events.listenerCount(target);\n    if (listeners === 0) {\n      throw new Error(`emitting ${target} without any listeners`);\n    }\n    if (isJsonRpcResult(payload)) {\n      this.events.emit(engineEvent(\"session_request\", id), { result: payload.result });\n    } else if (isJsonRpcError(payload)) {\n      this.events.emit(engineEvent(\"session_request\", id), { error: payload.error });\n    }\n  };\n\n  private onSessionEventRequest: EnginePrivate[\"onSessionEventRequest\"] = async (\n    topic,\n    payload,\n  ) => {\n    const { id, params } = payload;\n    try {\n      // similar to session update, we want to discard out of sync requests\n      // additionally we have to check the event type as well e.g. chainChanged/accountsChanged\n      const memoryKey = `${topic}_session_event_${params.event.name}`;\n      // compare the current request id with the last processed session update\n      // we want to update only if the request is newer than the last processed one\n      const lastSessionUpdateId = MemoryStore.get<number>(memoryKey);\n      if (lastSessionUpdateId && this.isRequestOutOfSync(lastSessionUpdateId, id)) {\n        this.client.logger.info(`Discarding out of sync request - ${id}`);\n        return;\n      }\n\n      this.isValidEmit({ topic, ...params });\n      this.client.events.emit(\"session_event\", { id, topic, params });\n      MemoryStore.set(memoryKey, id);\n    } catch (err: any) {\n      await this.sendError({\n        id,\n        topic,\n        error: err,\n      });\n      this.client.logger.error(err);\n    }\n  };\n\n  private onSessionAuthenticateResponse: EnginePrivate[\"onSessionAuthenticateResponse\"] = (\n    topic,\n    payload,\n  ) => {\n    const { id } = payload;\n    this.client.logger.trace({\n      type: \"method\",\n      method: \"onSessionAuthenticateResponse\",\n      topic,\n      payload,\n    });\n    if (isJsonRpcResult(payload)) {\n      this.events.emit(engineEvent(\"session_request\", id), { result: payload.result });\n    } else if (isJsonRpcError(payload)) {\n      this.events.emit(engineEvent(\"session_request\", id), { error: payload.error });\n    }\n  };\n\n  private onSessionAuthenticateRequest: EnginePrivate[\"onSessionAuthenticateRequest\"] = async (\n    args,\n  ) => {\n    const { topic, payload, attestation, encryptedId, transportType } = args;\n    try {\n      const { requester, authPayload, expiryTimestamp } = payload.params;\n      const verifyContext = await this.getVerifyContext({\n        attestationId: attestation,\n        hash: hashMessage(JSON.stringify(payload)),\n        encryptedId,\n        metadata: requester.metadata,\n        transportType,\n      });\n      const pendingRequest = {\n        requester,\n        pairingTopic: topic,\n        id: payload.id,\n        authPayload,\n        verifyContext,\n        expiryTimestamp,\n      };\n      await this.setAuthRequest(payload.id, {\n        request: pendingRequest,\n        pairingTopic: topic,\n        transportType,\n      });\n\n      if (transportType === TRANSPORT_TYPES.link_mode && requester.metadata.redirect?.universal) {\n        // save app as supported for link mode\n        this.client.core.addLinkModeSupportedApp(requester.metadata.redirect.universal);\n      }\n\n      this.client.events.emit(\"session_authenticate\", {\n        topic,\n        params: payload.params,\n        id: payload.id,\n        verifyContext,\n      });\n    } catch (err: any) {\n      this.client.logger.error(err);\n\n      const receiverPublicKey = payload.params.requester.publicKey;\n      const senderPublicKey = await this.client.core.crypto.generateKeyPair();\n      const appLink = this.getAppLinkIfEnabled(payload.params.requester.metadata, transportType);\n\n      const encodeOpts = {\n        type: TYPE_1,\n        receiverPublicKey,\n        senderPublicKey,\n      };\n      await this.sendError({\n        id: payload.id,\n        topic,\n        error: err,\n        encodeOpts,\n        rpcOpts: ENGINE_RPC_OPTS.wc_sessionAuthenticate.autoReject,\n        appLink,\n      });\n    }\n  };\n\n  /**\n   * Adds a session request to the sequential processing queue.\n   *\n   * The queue provides built-in deduplication and sequential processing,\n   * which helps handle WalletConnect's at-least-once delivery guarantee.\n   */\n  private addSessionRequestToSessionRequestQueue = (request: PendingRequestTypes.Struct) => {\n    this.sessionRequestQueue.queue.push(request);\n  };\n\n  private cleanupAfterResponse = (params: EngineTypes.RespondParams) => {\n    this.deletePendingSessionRequest(params.response.id, { message: \"fulfilled\", code: 0 });\n    // intentionally delay the emitting of the next pending request a bit\n    setTimeout(() => {\n      this.sessionRequestQueue.state = ENGINE_QUEUE_STATES.idle;\n      this.processSessionRequestQueue();\n    }, toMiliseconds(this.requestQueueDelay));\n  };\n\n  // Allows for cleanup on any sent pending requests if the peer disconnects the session before responding\n  private cleanupPendingSentRequestsForTopic = ({\n    topic,\n    error,\n  }: {\n    topic: string;\n    error: ErrorResponse;\n  }) => {\n    const pendingRequests = this.client.core.history.pending;\n    if (pendingRequests.length > 0) {\n      const forSession = pendingRequests.filter(\n        (r) => r.topic === topic && r.request.method === \"wc_sessionRequest\",\n      );\n      forSession.forEach((r) => {\n        // notify .request() handler of the rejection\n        this.events.emit(engineEvent(\"session_request\", r.request.id), {\n          error,\n        });\n      });\n    }\n  };\n\n  private processSessionRequestQueue = () => {\n    if (this.sessionRequestQueue.state === ENGINE_QUEUE_STATES.active) {\n      this.client.logger.info(\"session request queue is already active.\");\n      return;\n    }\n    // Select the first/oldest request in the array to ensure last-in-first-out (LIFO)\n    const request = this.sessionRequestQueue.queue[0];\n    if (!request) {\n      this.client.logger.info(\"session request queue is empty.\");\n      return;\n    }\n\n    try {\n      this.emitSessionRequest(request);\n    } catch (error) {\n      this.client.logger.error(error);\n    }\n  };\n\n  /**\n   * Emits a session request event with built-in deduplication.\n   *\n   * This method implements deduplication using emittedSessionRequests set to handle\n   * WalletConnect's at-least-once delivery guarantee. However, when disableRequestQueue\n   * is enabled, additional deduplication may be needed at the consumer level.\n   */\n  private emitSessionRequest = (request: PendingRequestTypes.Struct) => {\n    if (this.emittedSessionRequests.has(request.id)) {\n      this.client.logger.warn(\n        {\n          id: request.id,\n        },\n        `Skipping emitting \\`session_request\\` event for duplicate request. id: ${request.id}`,\n      );\n      return;\n    }\n    this.sessionRequestQueue.state = ENGINE_QUEUE_STATES.active;\n    this.emittedSessionRequests.add(request.id);\n    this.client.events.emit(\"session_request\", request);\n  };\n\n  // ---------- Expirer Events ---------------------------------------- //\n\n  private registerExpirerEvents() {\n    this.client.core.expirer.on(EXPIRER_EVENTS.expired, async (event: ExpirerTypes.Expiration) => {\n      const { topic, id } = parseExpirerTarget(event.target);\n      if (id && this.client.pendingRequest.keys.includes(id)) {\n        return await this.deletePendingSessionRequest(id, getInternalError(\"EXPIRED\"), true);\n      }\n      if (id && this.client.auth.requests.keys.includes(id)) {\n        return await this.deletePendingAuthRequest(id, getInternalError(\"EXPIRED\"), true);\n      }\n\n      if (topic) {\n        if (this.client.session.keys.includes(topic)) {\n          await this.deleteSession({ topic, expirerHasDeleted: true });\n          this.client.events.emit(\"session_expire\", { topic });\n        }\n      } else if (id) {\n        await this.deleteProposal(id, true);\n        this.client.events.emit(\"proposal_expire\", { id });\n      }\n    });\n  }\n\n  // ---------- Subscription Cleanup ---------------------------------- //\n  private cleanupInProgress = false;\n\n  private registerSubscriptionCleanup() {\n    this.client.core.heartbeat.on(\"heartbeat_pulse\", async () => {\n      if (this.cleanupInProgress) return;\n      this.cleanupInProgress = true;\n      try {\n        await this.cleanupOrphanedSubscriptions();\n      } catch (error) {\n        this.client.logger.warn(error);\n      } finally {\n        this.cleanupInProgress = false;\n      }\n    });\n  }\n\n  private cleanupOrphanedSubscriptions = async () => {\n    const subscriberTopics = this.client.core.relayer.subscriber.topics;\n    if (subscriberTopics.length === 0) return;\n\n    const sessionTopics = new Set(this.client.session.keys);\n    const pairingTopics = new Set(this.client.core.pairing.pairings.keys);\n    const pendingSessionTopics = new Set(\n      [...this.pendingSessions.values()].map((s) => s.sessionTopic),\n    );\n\n    let authResponseTopic: string | undefined;\n    if (this.client.auth.authKeys.keys.includes(AUTH_PUBLIC_KEY_NAME)) {\n      const { responseTopic } = this.client.auth.authKeys.get(AUTH_PUBLIC_KEY_NAME);\n      authResponseTopic = responseTopic;\n    }\n\n    for (const topic of subscriberTopics) {\n      if (sessionTopics.has(topic)) continue;\n      if (pairingTopics.has(topic)) continue;\n      if (pendingSessionTopics.has(topic)) continue;\n      if (topic === authResponseTopic) continue;\n\n      this.client.logger.info(`Cleaning up orphaned subscriber topic: ${topic}`);\n      try {\n        await this.client.core.relayer.subscriber.unsubscribe(topic);\n      } catch (error) {\n        this.client.logger.warn(error, `Failed to clean up orphaned subscription: ${topic}`);\n      }\n    }\n  };\n\n  // ---------- Pairing Events ---------------------------------------- //\n  private registerPairingEvents() {\n    this.client.core.pairing.events.on(PAIRING_EVENTS.create, (pairing: PairingTypes.Struct) =>\n      this.onPairingCreated(pairing),\n    );\n    this.client.core.pairing.events.on(PAIRING_EVENTS.delete, (pairing: PairingTypes.Struct) => {\n      this.addToRecentlyDeleted(pairing.topic, \"pairing\");\n    });\n  }\n\n  /**\n   * when a pairing is created, we check if there is a pending proposal for it.\n   * if there is, we send it to onSessionProposeRequest to be processed as if it was received from the relay.\n   * It allows QR/URI to be scanned multiple times without having to create new pairing.\n   */\n  private onPairingCreated = (pairing: PairingTypes.Struct) => {\n    if (pairing.methods) {\n      this.expectedPairingMethodMap.set(pairing.topic, pairing.methods);\n    }\n    if (pairing.active) return;\n    const proposals = this.client.proposal.getAll();\n    const proposal = proposals.find((p) => p.pairingTopic === pairing.topic);\n    if (!proposal) return;\n    this.onSessionProposeRequest({\n      topic: pairing.topic,\n      payload: formatJsonRpcRequest(\n        \"wc_sessionPropose\",\n        {\n          ...proposal,\n          requiredNamespaces: proposal.requiredNamespaces,\n          optionalNamespaces: proposal.optionalNamespaces,\n          relays: proposal.relays,\n          proposer: proposal.proposer,\n          sessionProperties: proposal.sessionProperties,\n          scopedProperties: proposal.scopedProperties,\n        },\n        proposal.id,\n      ),\n      attestation: proposal.attestation,\n      encryptedId: proposal.encryptedId,\n    });\n  };\n\n  // ---------- Validation Helpers ------------------------------------ //\n  private isValidPairingTopic(topic: any) {\n    if (!isValidString(topic, false)) {\n      const { message } = getInternalError(\n        \"MISSING_OR_INVALID\",\n        `pairing topic should be a string: ${topic}`,\n      );\n      throw new Error(message);\n    }\n    if (!this.client.core.pairing.pairings.keys.includes(topic)) {\n      const { message } = getInternalError(\n        \"NO_MATCHING_KEY\",\n        `pairing topic doesn't exist: ${topic}`,\n      );\n      throw new Error(message);\n    }\n    if (isExpired(this.client.core.pairing.pairings.get(topic).expiry)) {\n      const { message } = getInternalError(\"EXPIRED\", `pairing topic: ${topic}`);\n      throw new Error(message);\n    }\n  }\n\n  private async isValidSessionTopic(topic: any) {\n    if (!isValidString(topic, false)) {\n      const { message } = getInternalError(\n        \"MISSING_OR_INVALID\",\n        `session topic should be a string: ${topic}`,\n      );\n      throw new Error(message);\n    }\n    // Store will throw custom message if topic was recently deleted\n    this.checkRecentlyDeleted(topic);\n    if (!this.client.session.keys.includes(topic)) {\n      const { message } = getInternalError(\n        \"NO_MATCHING_KEY\",\n        `session topic doesn't exist: ${topic}`,\n      );\n      throw new Error(message);\n    }\n    if (isExpired(this.client.session.get(topic).expiry)) {\n      await this.deleteSession({ topic });\n      const { message } = getInternalError(\"EXPIRED\", `session topic: ${topic}`);\n      throw new Error(message);\n    }\n\n    if (!this.client.core.crypto.keychain.has(topic)) {\n      const { message } = getInternalError(\n        \"MISSING_OR_INVALID\",\n        `session topic does not exist in keychain: ${topic}`,\n      );\n      await this.deleteSession({ topic });\n      throw new Error(message);\n    }\n  }\n\n  private async isValidSessionOrPairingTopic(topic: string) {\n    this.checkRecentlyDeleted(topic);\n    if (this.client.session.keys.includes(topic)) {\n      await this.isValidSessionTopic(topic);\n    } else if (this.client.core.pairing.pairings.keys.includes(topic)) {\n      this.isValidPairingTopic(topic);\n    } else if (!isValidString(topic, false)) {\n      const { message } = getInternalError(\n        \"MISSING_OR_INVALID\",\n        `session or pairing topic should be a string: ${topic}`,\n      );\n      throw new Error(message);\n    } else {\n      const { message } = getInternalError(\n        \"NO_MATCHING_KEY\",\n        `session or pairing topic doesn't exist: ${topic}`,\n      );\n      throw new Error(message);\n    }\n  }\n\n  private async isValidProposalId(id: any) {\n    if (!isValidId(id)) {\n      const { message } = getInternalError(\n        \"MISSING_OR_INVALID\",\n        `proposal id should be a number: ${id}`,\n      );\n      throw new Error(message);\n    }\n    if (!this.client.proposal.keys.includes(id)) {\n      const { message } = getInternalError(\"NO_MATCHING_KEY\", `proposal id doesn't exist: ${id}`);\n      throw new Error(message);\n    }\n    if (isExpired(this.client.proposal.get(id).expiryTimestamp)) {\n      await this.deleteProposal(id);\n      const { message } = getInternalError(\"EXPIRED\", `proposal id: ${id}`);\n      throw new Error(message);\n    }\n  }\n\n  // ---------- Validation  ------------------------------------------- //\n\n  private isValidConnect: EnginePrivate[\"isValidConnect\"] = async (params) => {\n    if (!isValidParams(params)) {\n      const { message } = getInternalError(\n        \"MISSING_OR_INVALID\",\n        `connect() params: ${JSON.stringify(params)}`,\n      );\n      throw new Error(message);\n    }\n    const {\n      pairingTopic,\n      requiredNamespaces,\n      optionalNamespaces,\n      sessionProperties,\n      scopedProperties,\n      relays,\n    } = params;\n    if (!isUndefined(pairingTopic)) await this.isValidPairingTopic(pairingTopic);\n\n    if (!isValidRelays(relays, true)) {\n      const { message } = getInternalError(\"MISSING_OR_INVALID\", `connect() relays: ${relays}`);\n      throw new Error(message);\n    }\n\n    // validate required namespaces only if they are defined\n    if (\n      requiredNamespaces &&\n      !isUndefined(requiredNamespaces) &&\n      isValidObject(requiredNamespaces) !== 0\n    ) {\n      const warning =\n        \"requiredNamespaces are deprecated and are automatically assigned to optionalNamespaces\";\n      // if logger level is one of the following, the logger.warn will not be shown, so we need to use console.warn\n      if ([\"fatal\", \"error\", \"silent\"].includes(this.client.logger.level)) {\n        console.warn(warning);\n      } else {\n        this.client.logger.warn(warning);\n      }\n      this.validateNamespaces(requiredNamespaces, \"requiredNamespaces\");\n    }\n\n    // validate optional namespaces only if they are defined\n    if (\n      optionalNamespaces &&\n      !isUndefined(optionalNamespaces) &&\n      isValidObject(optionalNamespaces) !== 0\n    ) {\n      this.validateNamespaces(optionalNamespaces, \"optionalNamespaces\");\n    }\n\n    // validate session properties only if they are defined\n    if (sessionProperties && !isUndefined(sessionProperties)) {\n      this.validateSessionProps(sessionProperties, \"sessionProperties\");\n    }\n\n    if (scopedProperties && !isUndefined(scopedProperties)) {\n      this.validateSessionProps(scopedProperties, \"scopedProperties\");\n\n      const requestedNamespaces = Object.keys(requiredNamespaces || {}).concat(\n        Object.keys(optionalNamespaces || {}),\n      );\n\n      const scopedNamespaces = Object.keys(scopedProperties);\n      // .split(\":\")[0] to account for inline <namespace>:<chainId>\n      const valid = scopedNamespaces.every((ns) => requestedNamespaces.includes(ns.split(\":\")[0]));\n      if (!valid) {\n        throw new Error(\n          `Scoped properties must be a subset of required/optional namespaces, received: ${JSON.stringify(\n            scopedProperties,\n          )}, required/optional namespaces: ${JSON.stringify(requestedNamespaces)}`,\n        );\n      }\n    }\n  };\n\n  private validateNamespaces = (\n    namespaces: ProposalTypes.RequiredNamespaces | ProposalTypes.OptionalNamespaces,\n    type: string,\n  ) => {\n    const validRequiredNamespacesError = isValidRequiredNamespaces(namespaces, \"connect()\", type);\n    if (validRequiredNamespacesError) throw new Error(validRequiredNamespacesError.message);\n  };\n\n  private isValidApprove: EnginePrivate[\"isValidApprove\"] = async (params) => {\n    if (!isValidParams(params))\n      throw new Error(\n        getInternalError(\"MISSING_OR_INVALID\", `approve() params: ${params}`).message,\n      );\n    const { id, namespaces, relayProtocol, sessionProperties, scopedProperties } = params;\n\n    this.checkRecentlyDeleted(id);\n    await this.isValidProposalId(id);\n    const proposal = this.client.proposal.get(id);\n    const validNamespacesError = isValidNamespaces(namespaces, \"approve()\");\n    if (validNamespacesError) throw new Error(validNamespacesError.message);\n    const conformingNamespacesError = isConformingNamespaces(\n      proposal.requiredNamespaces,\n      namespaces,\n      \"approve()\",\n    );\n    if (conformingNamespacesError) throw new Error(conformingNamespacesError.message);\n    if (!isValidString(relayProtocol, true)) {\n      const { message } = getInternalError(\n        \"MISSING_OR_INVALID\",\n        `approve() relayProtocol: ${relayProtocol}`,\n      );\n      throw new Error(message);\n    }\n\n    if (sessionProperties && !isUndefined(sessionProperties)) {\n      this.validateSessionProps(sessionProperties, \"sessionProperties\");\n    }\n\n    if (scopedProperties && !isUndefined(scopedProperties)) {\n      this.validateSessionProps(scopedProperties, \"scopedProperties\");\n\n      const approvedNamespaces = new Set(Object.keys(namespaces));\n      const scopedNamespaces = Object.keys(scopedProperties);\n\n      // the approved scoped namespaces must be a subset of the approved namespaces\n      // .split(\":\")[0] to account for inline <namespace>:<chainId>\n      const valid = scopedNamespaces.every((ns) => approvedNamespaces.has(ns.split(\":\")[0]));\n      if (!valid) {\n        throw new Error(\n          `Scoped properties must be a subset of approved namespaces, received: ${JSON.stringify(\n            scopedProperties,\n          )}, approved namespaces: ${Array.from(approvedNamespaces).join(\", \")}`,\n        );\n      }\n    }\n  };\n\n  private isValidReject: EnginePrivate[\"isValidReject\"] = async (params) => {\n    if (!isValidParams(params)) {\n      const { message } = getInternalError(\"MISSING_OR_INVALID\", `reject() params: ${params}`);\n      throw new Error(message);\n    }\n    const { id, reason } = params;\n    this.checkRecentlyDeleted(id);\n    await this.isValidProposalId(id);\n    if (!isValidErrorReason(reason)) {\n      const { message } = getInternalError(\n        \"MISSING_OR_INVALID\",\n        `reject() reason: ${JSON.stringify(reason)}`,\n      );\n      throw new Error(message);\n    }\n  };\n\n  private isValidSessionSettleRequest: EnginePrivate[\"isValidSessionSettleRequest\"] = (params) => {\n    if (!isValidParams(params)) {\n      const { message } = getInternalError(\n        \"MISSING_OR_INVALID\",\n        `onSessionSettleRequest() params: ${params}`,\n      );\n      throw new Error(message);\n    }\n    const { relay, controller, namespaces, expiry } = params;\n    if (!isValidRelay(relay)) {\n      const { message } = getInternalError(\n        \"MISSING_OR_INVALID\",\n        `onSessionSettleRequest() relay protocol should be a string`,\n      );\n      throw new Error(message);\n    }\n    const validControllerError = isValidController(controller, \"onSessionSettleRequest()\");\n    if (validControllerError) throw new Error(validControllerError.message);\n    const validNamespacesError = isValidNamespaces(namespaces, \"onSessionSettleRequest()\");\n    if (validNamespacesError) throw new Error(validNamespacesError.message);\n    if (isExpired(expiry)) {\n      const { message } = getInternalError(\"EXPIRED\", `onSessionSettleRequest()`);\n      throw new Error(message);\n    }\n  };\n\n  private isValidUpdate: EnginePrivate[\"isValidUpdate\"] = async (params) => {\n    if (!isValidParams(params)) {\n      const { message } = getInternalError(\"MISSING_OR_INVALID\", `update() params: ${params}`);\n      throw new Error(message);\n    }\n    const { topic, namespaces } = params;\n\n    this.checkRecentlyDeleted(topic);\n    await this.isValidSessionTopic(topic);\n    const session = this.client.session.get(topic);\n    const validNamespacesError = isValidNamespaces(namespaces, \"update()\");\n    if (validNamespacesError) throw new Error(validNamespacesError.message);\n    const conformingNamespacesError = isConformingNamespaces(\n      session.requiredNamespaces,\n      namespaces,\n      \"update()\",\n    );\n    if (conformingNamespacesError) throw new Error(conformingNamespacesError.message);\n    // TODO(ilja) - check if wallet\n  };\n\n  private isValidExtend: EnginePrivate[\"isValidExtend\"] = async (params) => {\n    if (!isValidParams(params)) {\n      const { message } = getInternalError(\"MISSING_OR_INVALID\", `extend() params: ${params}`);\n      throw new Error(message);\n    }\n    const { topic } = params;\n\n    this.checkRecentlyDeleted(topic);\n    await this.isValidSessionTopic(topic);\n  };\n\n  private isValidRequest: EnginePrivate[\"isValidRequest\"] = async (params) => {\n    if (!isValidParams(params)) {\n      const { message } = getInternalError(\"MISSING_OR_INVALID\", `request() params: ${params}`);\n      throw new Error(message);\n    }\n    const { topic, request, chainId, expiry } = params;\n    this.checkRecentlyDeleted(topic);\n    await this.isValidSessionTopic(topic);\n    const { namespaces } = this.client.session.get(topic);\n    if (!isValidNamespacesChainId(namespaces, chainId)) {\n      const { message } = getInternalError(\"MISSING_OR_INVALID\", `request() chainId: ${chainId}`);\n      throw new Error(message);\n    }\n    if (!isValidRequest(request)) {\n      const { message } = getInternalError(\n        \"MISSING_OR_INVALID\",\n        `request() ${JSON.stringify(request)}`,\n      );\n      throw new Error(message);\n    }\n    if (!isValidNamespacesRequest(namespaces, chainId, request.method)) {\n      const { message } = getInternalError(\n        \"MISSING_OR_INVALID\",\n        `request() method: ${request.method}`,\n      );\n      throw new Error(message);\n    }\n    this.validateRequestExpiry(expiry);\n  };\n\n  private validateRequestExpiry(expiry?: number) {\n    if (expiry && !isValidRequestExpiry(expiry, SESSION_REQUEST_EXPIRY_BOUNDARIES)) {\n      const { message } = getInternalError(\n        \"MISSING_OR_INVALID\",\n        `request() expiry: ${expiry}. Expiry must be a number (in seconds) between ${SESSION_REQUEST_EXPIRY_BOUNDARIES.min} and ${SESSION_REQUEST_EXPIRY_BOUNDARIES.max}`,\n      );\n      throw new Error(message);\n    }\n  }\n\n  private isValidRespond: EnginePrivate[\"isValidRespond\"] = async (params) => {\n    if (!isValidParams(params)) {\n      const { message } = getInternalError(\"MISSING_OR_INVALID\", `respond() params: ${params}`);\n      throw new Error(message);\n    }\n    const { topic, response } = params;\n\n    try {\n      // if the session is already disconnected, we can't respond to the request so we need to delete it\n      await this.isValidSessionTopic(topic);\n    } catch (error) {\n      if (params?.response?.id) this.cleanupAfterResponse(params);\n      throw error;\n    }\n    if (!isValidResponse(response)) {\n      const { message } = getInternalError(\n        \"MISSING_OR_INVALID\",\n        `respond() response: ${JSON.stringify(response)}`,\n      );\n      throw new Error(message);\n    }\n\n    const request = this.client.pendingRequest.get(response.id);\n\n    if (request.topic !== topic) {\n      const { message } = getInternalError(\n        \"MISMATCHED_TOPIC\",\n        `Request response topic mismatch. reqId: ${response.id}, expected topic: ${request.topic}, received topic: ${topic}`,\n      );\n      throw new Error(message);\n    }\n  };\n\n  private isValidPing: EnginePrivate[\"isValidPing\"] = async (params) => {\n    if (!isValidParams(params)) {\n      const { message } = getInternalError(\"MISSING_OR_INVALID\", `ping() params: ${params}`);\n      throw new Error(message);\n    }\n    const { topic } = params;\n    await this.isValidSessionOrPairingTopic(topic);\n  };\n\n  private isValidEmit: EnginePrivate[\"isValidEmit\"] = async (params) => {\n    if (!isValidParams(params)) {\n      const { message } = getInternalError(\"MISSING_OR_INVALID\", `emit() params: ${params}`);\n      throw new Error(message);\n    }\n    const { topic, event, chainId } = params;\n    await this.isValidSessionTopic(topic);\n    const { namespaces } = this.client.session.get(topic);\n    if (!isValidNamespacesChainId(namespaces, chainId)) {\n      const { message } = getInternalError(\"MISSING_OR_INVALID\", `emit() chainId: ${chainId}`);\n      throw new Error(message);\n    }\n    if (!isValidEvent(event)) {\n      const { message } = getInternalError(\n        \"MISSING_OR_INVALID\",\n        `emit() event: ${JSON.stringify(event)}`,\n      );\n      throw new Error(message);\n    }\n    if (!isValidNamespacesEvent(namespaces, chainId, event.name)) {\n      const { message } = getInternalError(\n        \"MISSING_OR_INVALID\",\n        `emit() event: ${JSON.stringify(event)}`,\n      );\n      throw new Error(message);\n    }\n  };\n\n  private isValidDisconnect: EnginePrivate[\"isValidDisconnect\"] = async (params) => {\n    if (!isValidParams(params)) {\n      const { message } = getInternalError(\"MISSING_OR_INVALID\", `disconnect() params: ${params}`);\n      throw new Error(message);\n    }\n    const { topic } = params;\n    await this.isValidSessionOrPairingTopic(topic);\n  };\n\n  private isValidAuthenticate = (params: AuthTypes.SessionAuthenticateParams) => {\n    const { chains, uri, domain, nonce } = params;\n\n    // ----- validate params ----- //\n    if (!Array.isArray(chains) || chains.length === 0) {\n      throw new Error(\"chains is required and must be a non-empty array\");\n    }\n    if (!isValidString(uri, false)) {\n      throw new Error(\"uri is required parameter\");\n    }\n    if (!isValidString(domain, false)) {\n      throw new Error(\"domain is required parameter\");\n    }\n    if (!isValidString(nonce, false)) {\n      throw new Error(\"nonce is required parameter\");\n    }\n\n    // ----- reject multi namespaces ----- //\n    const uniqueNamespaces = [...new Set(chains.map((chain) => parseChainId(chain).namespace))];\n    if (uniqueNamespaces.length > 1) {\n      throw new Error(\n        \"Multi-namespace requests are not supported. Please request single namespace only.\",\n      );\n    }\n\n    const { namespace } = parseChainId(chains[0]);\n    if (namespace !== \"eip155\") {\n      throw new Error(\n        \"Only eip155 namespace is supported for authenticated sessions. Please use .connect() for non-eip155 chains.\",\n      );\n    }\n  };\n\n  private getVerifyContext = async (params: {\n    attestationId?: string;\n    hash?: string;\n    encryptedId?: string;\n    metadata: CoreTypes.Metadata;\n    transportType?: RelayerTypes.TransportType;\n  }) => {\n    const { attestationId, hash, encryptedId, metadata, transportType } = params;\n    const context: Verify.Context = {\n      verified: {\n        verifyUrl: metadata.verifyUrl || VERIFY_SERVER,\n        validation: \"UNKNOWN\",\n        origin: metadata.url || \"\",\n      },\n    };\n\n    try {\n      if (transportType === TRANSPORT_TYPES.link_mode) {\n        const applink = this.getAppLinkIfEnabled(metadata, transportType);\n        context.verified.validation =\n          applink && new URL(applink).origin === new URL(metadata.url).origin ? \"VALID\" : \"INVALID\";\n        return context;\n      }\n      const result = await this.client.core.verify.resolve({\n        attestationId,\n        hash,\n        encryptedId,\n        verifyUrl: metadata.verifyUrl,\n      });\n      if (result) {\n        context.verified.origin = result.origin;\n        context.verified.isScam = result.isScam;\n        context.verified.validation =\n          result.origin === new URL(metadata.url).origin ? \"VALID\" : \"INVALID\";\n      }\n    } catch (e) {\n      this.client.logger.warn(e);\n    }\n\n    this.client.logger.debug(`Verify context: ${JSON.stringify(context)}`);\n    return context;\n  };\n\n  private validateSessionProps = (properties: SessionTypes.ScopedProperties, type: string) => {\n    Object.values(properties).forEach((property, index) => {\n      if (property === null || property === undefined) {\n        const { message } = getInternalError(\n          \"MISSING_OR_INVALID\",\n          `${type} must contain an existing value for each key. Received: ${property} for key ${\n            Object.keys(properties)[index]\n          }`,\n        );\n        throw new Error(message);\n      }\n    });\n  };\n\n  private getPendingAuthRequest = (id: number) => {\n    const request = this.client.auth.requests.get(id);\n    return typeof request === \"object\" ? request : undefined;\n  };\n\n  private addToRecentlyDeleted = (\n    id: string | number,\n    type: \"pairing\" | \"session\" | \"proposal\" | \"request\",\n  ) => {\n    this.recentlyDeletedMap.set(id, type);\n    // remove first half of the map if it exceeds the limit\n    if (this.recentlyDeletedMap.size >= this.recentlyDeletedLimit) {\n      let i = 0;\n      const numItemsToDelete = this.recentlyDeletedLimit / 2;\n      for (const k of this.recentlyDeletedMap.keys()) {\n        if (i++ >= numItemsToDelete) {\n          break;\n        }\n        this.recentlyDeletedMap.delete(k);\n      }\n    }\n  };\n\n  private checkRecentlyDeleted = (id: string | number) => {\n    const deletedRecord = this.recentlyDeletedMap.get(id);\n    if (deletedRecord) {\n      const { message } = getInternalError(\n        \"MISSING_OR_INVALID\",\n        `Record was recently deleted - ${deletedRecord}: ${id}`,\n      );\n      throw new Error(message);\n    }\n  };\n\n  private isLinkModeEnabled = (\n    peerMetadata?: CoreTypes.Metadata,\n    transportType?: RelayerTypes.TransportType,\n  ): boolean => {\n    if (!peerMetadata || transportType !== TRANSPORT_TYPES.link_mode) return false;\n\n    return (\n      this.client.metadata?.redirect?.linkMode === true &&\n      this.client.metadata?.redirect?.universal !== undefined &&\n      this.client.metadata?.redirect?.universal !== \"\" &&\n      peerMetadata?.redirect?.universal !== undefined &&\n      peerMetadata?.redirect?.universal !== \"\" &&\n      peerMetadata?.redirect?.linkMode === true &&\n      this.client.core.linkModeSupportedApps.includes(peerMetadata.redirect.universal) &&\n      typeof (global as any)?.Linking !== \"undefined\"\n    );\n  };\n\n  private getAppLinkIfEnabled = (\n    peerMetadata?: CoreTypes.Metadata,\n    transportType?: RelayerTypes.TransportType,\n  ): string | undefined => {\n    return this.isLinkModeEnabled(peerMetadata, transportType)\n      ? peerMetadata?.redirect?.universal\n      : undefined;\n  };\n\n  private handleLinkModeMessage = ({ url }: { url: string }) => {\n    if (!url || !url.includes(\"wc_ev\") || !url.includes(\"topic\")) return;\n\n    const topic = getSearchParamFromURL(url, \"topic\") || \"\";\n    const message = decodeURIComponent(getSearchParamFromURL(url, \"wc_ev\") || \"\");\n\n    const sessionExists = this.client.session.keys.includes(topic);\n\n    if (sessionExists) {\n      this.client.session.update(topic, { transportType: TRANSPORT_TYPES.link_mode });\n    }\n\n    this.client.core.dispatchEnvelope({ topic, message, sessionExists });\n  };\n\n  private registerLinkModeListeners = async () => {\n    if (isTestRun() || (isReactNative() && this.client.metadata.redirect?.linkMode)) {\n      const linking = (global as any)?.Linking;\n      // global.Linking is set by react-native-compat\n      if (typeof linking !== \"undefined\") {\n        // set URL listener\n        linking.addEventListener(\"url\", this.handleLinkModeMessage, this.client.name);\n\n        // check for initial URL -> cold boots\n        const initialUrl = await linking.getInitialURL();\n        if (initialUrl) {\n          // wait to process the message to allow event listeners to be registered by the implementing app\n          setTimeout(() => {\n            this.handleLinkModeMessage({ url: initialUrl });\n          }, 50);\n        }\n      }\n    }\n  };\n\n  private getTVFApproveParams = (session: SessionTypes.Struct) => {\n    try {\n      const approvedChains = getNamespacesChains(session.namespaces);\n      const approvedMethods = getNamespacesMethods(session.namespaces);\n      const approvedEvents = getNamespacesEvents(session.namespaces);\n      const sessionProperties = session.sessionProperties;\n      const scopedProperties = session.scopedProperties;\n      return {\n        approvedChains,\n        approvedMethods,\n        approvedEvents,\n        sessionProperties,\n        scopedProperties,\n      };\n    } catch (e) {\n      this.client.logger.warn(e, \"Error getting TVF approve params\");\n      return {};\n    }\n  };\n\n  private getTVFParams = (\n    id: number,\n    params: JsonRpcTypes.RequestParams[\"wc_sessionRequest\"],\n    result?: any,\n  ) => {\n    // this check will filter all Sign protocol methods since they don't have a method property\n    if (!params.request?.method) {\n      return {};\n    }\n\n    const tvf: RelayerTypes.ITVF = {\n      correlationId: id,\n      rpcMethods: [params.request.method],\n      chainId: params.chainId,\n    };\n    try {\n      const txHashes = this.extractTxHashesFromResult(params.request, result);\n      tvf.txHashes = txHashes;\n      tvf.contractAddresses = this.isValidContractData(params.request.params)\n        ? [params.request.params?.[0]?.to]\n        : [];\n    } catch (e) {\n      this.client.logger.warn(e, \"Error getting TVF params\");\n    }\n    return tvf;\n  };\n\n  private isValidContractData = (params: any) => {\n    if (!params) return false;\n    try {\n      const data = params?.data || params?.[0]?.data;\n\n      if (!data.startsWith(\"0x\")) return false;\n\n      const hexPart = data.slice(2);\n      if (!/^[0-9a-fA-F]*$/.test(hexPart)) return false;\n\n      return hexPart.length % 2 === 0;\n    } catch (e) {}\n    return false;\n  };\n\n  private extractTxHashesFromResult = (\n    request: JsonRpcTypes.RequestParams[\"wc_sessionRequest\"][\"request\"],\n    result: any,\n  ): string[] => {\n    try {\n      if (!result) return [];\n\n      const method = request.method;\n      const methodConfig = TVF_METHODS[method as keyof typeof TVF_METHODS];\n\n      if (method === \"sui_signTransaction\") {\n        return [getSuiDigest(result.transactionBytes)];\n      }\n\n      if (method === \"near_signTransaction\") {\n        return [getNearTransactionIdFromSignedTransaction(result)];\n      }\n\n      if (method === \"near_signTransactions\") {\n        return result.map((tx: any) => getNearTransactionIdFromSignedTransaction(tx));\n      }\n\n      if (method === \"xrpl_signTransactionFor\" || method === \"xrpl_signTransaction\") {\n        return [result.tx_json?.hash];\n      }\n\n      if (method === \"polkadot_signTransaction\") {\n        return [\n          buildSignedExtrinsicHash({\n            transaction: request.params.transactionPayload,\n            signature: result.signature,\n          }),\n        ];\n      }\n\n      if (method === \"algo_signTxn\") {\n        return isValidArray(result)\n          ? result.map((tx: any) => getAlgorandTransactionId(tx))\n          : [getAlgorandTransactionId(result)];\n      }\n\n      if (method === \"cosmos_signDirect\") {\n        return [getSignDirectHash(result)];\n      }\n\n      if (method === \"wallet_sendCalls\") {\n        return getWalletSendCallsHashes(result);\n      }\n\n      // result = 0x...\n      if (typeof result === \"string\") {\n        return [result];\n      }\n\n      // result = { key: [0x...] } or { key: 0x... }\n      const hashes: string[] = result[methodConfig.key];\n\n      // result = { key: [0x...] }\n      if (isValidArray(hashes)) {\n        if (method === \"solana_signAllTransactions\") {\n          return hashes.map((hash) => extractSolanaTransactionId(hash));\n        }\n\n        return hashes;\n\n        // result = { key: 0x... }\n      } else if (typeof hashes === \"string\") {\n        return [hashes];\n      }\n    } catch (e) {\n      this.client.logger.warn(e, \"Error extracting tx hashes from result\");\n    }\n    return [];\n  };\n}\n","import { Store } from \"@walletconnect/core\";\nimport { Logger } from \"@walletconnect/logger\";\nimport { ICore, ProposalTypes } from \"@walletconnect/types\";\n\nimport { SIGN_CLIENT_STORAGE_PREFIX, PROPOSAL_CONTEXT } from \"../constants/index.js\";\n\nexport class Proposal extends Store<number, ProposalTypes.Struct> {\n  constructor(\n    public core: ICore,\n    public logger: Logger,\n  ) {\n    super(core, logger, PROPOSAL_CONTEXT, SIGN_CLIENT_STORAGE_PREFIX);\n  }\n}\n","import { Store } from \"@walletconnect/core\";\nimport { Logger } from \"@walletconnect/logger\";\nimport { ICore, SessionTypes } from \"@walletconnect/types\";\n\nimport { SIGN_CLIENT_STORAGE_PREFIX, SESSION_CONTEXT } from \"../constants/index.js\";\n\nexport class Session extends Store<string, SessionTypes.Struct> {\n  constructor(\n    public core: ICore,\n    public logger: Logger,\n  ) {\n    super(core, logger, SESSION_CONTEXT, SIGN_CLIENT_STORAGE_PREFIX);\n  }\n}\n","import { Store } from \"@walletconnect/core\";\nimport { Logger } from \"@walletconnect/logger\";\nimport { ICore, PendingRequestTypes } from \"@walletconnect/types\";\nimport { REQUEST_CONTEXT, SIGN_CLIENT_STORAGE_PREFIX } from \"../constants/index.js\";\n\nexport class PendingRequest extends Store<number, PendingRequestTypes.Struct> {\n  constructor(\n    public core: ICore,\n    public logger: Logger,\n  ) {\n    super(\n      core,\n      logger,\n      REQUEST_CONTEXT,\n      SIGN_CLIENT_STORAGE_PREFIX,\n      (val: PendingRequestTypes.Struct) => val.id,\n    );\n  }\n}\n","import { Store } from \"@walletconnect/core\";\nimport { Logger } from \"@walletconnect/logger\";\nimport { ICore } from \"@walletconnect/types\";\n\nimport {\n  AUTH_KEYS_CONTEXT,\n  AUTH_STORAGE_PREFIX,\n  AUTH_PUBLIC_KEY_NAME,\n} from \"../constants/index.js\";\n\nexport class AuthKey extends Store<string, { responseTopic: string; publicKey: string }> {\n  constructor(\n    public core: ICore,\n    public logger: Logger,\n  ) {\n    super(core, logger, AUTH_KEYS_CONTEXT, AUTH_STORAGE_PREFIX, () => AUTH_PUBLIC_KEY_NAME);\n  }\n}\n","import { Store } from \"@walletconnect/core\";\nimport { Logger } from \"@walletconnect/logger\";\nimport { ICore } from \"@walletconnect/types\";\n\nimport { AUTH_PAIRING_TOPIC_CONTEXT, AUTH_STORAGE_PREFIX } from \"../constants/index.js\";\n\nexport class AuthPairingTopic extends Store<string, { topic: string; pairingTopic: string }> {\n  constructor(\n    public core: ICore,\n    public logger: Logger,\n  ) {\n    super(core, logger, AUTH_PAIRING_TOPIC_CONTEXT, AUTH_STORAGE_PREFIX);\n  }\n}\n","import { Store } from \"@walletconnect/core\";\nimport { Logger } from \"@walletconnect/logger\";\nimport { AuthTypes, ICore } from \"@walletconnect/types\";\n\nimport { AUTH_STORAGE_PREFIX, AUTH_REQUEST_CONTEXT } from \"../constants/index.js\";\n\nexport class AuthRequest extends Store<number, AuthTypes.PendingRequest> {\n  constructor(\n    public core: ICore,\n    public logger: Logger,\n  ) {\n    super(\n      core,\n      logger,\n      AUTH_REQUEST_CONTEXT,\n      AUTH_STORAGE_PREFIX,\n      (val: AuthTypes.PendingRequest) => val.id,\n    );\n  }\n}\n","import { Logger } from \"@walletconnect/logger\";\nimport { IAuth, ICore } from \"@walletconnect/types\";\nimport { AuthPairingTopic } from \"./authPairingTopic.js\";\nimport { AuthRequest } from \"./authRequest.js\";\nimport { AuthKey } from \"./authKey.js\";\n\nexport class AuthStore {\n  public authKeys: IAuth[\"authKeys\"];\n  public pairingTopics: IAuth[\"pairingTopics\"];\n  public requests: IAuth[\"requests\"];\n\n  constructor(\n    public core: ICore,\n    public logger: Logger,\n  ) {\n    this.authKeys = new AuthKey(this.core, this.logger);\n    this.pairingTopics = new AuthPairingTopic(this.core, this.logger);\n    this.requests = new AuthRequest(this.core, this.logger);\n  }\n\n  public async init() {\n    await this.authKeys.init();\n    await this.pairingTopics.init();\n    await this.requests.init();\n  }\n}\n","import { EventEmitter } from \"events\";\nimport { Core } from \"@walletconnect/core\";\nimport { SignClientTypes, ISignClient, ISignClientEvents, EngineTypes } from \"@walletconnect/types\";\nimport { populateAppMetadata, createLogger } from \"@walletconnect/utils\";\nimport { getLoggerContext } from \"@walletconnect/logger\";\nimport {\n  SIGN_CLIENT_DEFAULT,\n  SIGN_CLIENT_PROTOCOL,\n  SIGN_CLIENT_VERSION,\n} from \"./constants/index.js\";\nimport { AuthStore, Engine, PendingRequest, Proposal, Session } from \"./controllers/index.js\";\n\nexport class SignClient extends ISignClient {\n  public readonly protocol = SIGN_CLIENT_PROTOCOL;\n  public readonly version = SIGN_CLIENT_VERSION;\n  public readonly name: ISignClient[\"name\"] = SIGN_CLIENT_DEFAULT.name;\n  public readonly metadata: ISignClient[\"metadata\"];\n\n  public core: ISignClient[\"core\"];\n  public logger: ISignClient[\"logger\"];\n  public events: ISignClient[\"events\"] = new EventEmitter();\n  public engine: ISignClient[\"engine\"];\n  public session: ISignClient[\"session\"];\n  public proposal: ISignClient[\"proposal\"];\n  public pendingRequest: ISignClient[\"pendingRequest\"];\n  public auth: ISignClient[\"auth\"];\n  public signConfig?: ISignClient[\"signConfig\"];\n\n  static async init(opts?: SignClientTypes.Options) {\n    const client = new SignClient(opts);\n    await client.initialize();\n\n    return client;\n  }\n\n  constructor(opts?: SignClientTypes.Options) {\n    super(opts);\n\n    this.name = opts?.name || SIGN_CLIENT_DEFAULT.name;\n    this.metadata = populateAppMetadata(opts?.metadata);\n    this.signConfig = opts?.signConfig;\n\n    const logger = createLogger({\n      logger: opts?.logger || SIGN_CLIENT_DEFAULT.logger,\n      name: this.name,\n    });\n    this.logger = logger;\n    this.core = opts?.core || new Core(opts);\n    this.session = new Session(this.core, this.logger);\n    this.proposal = new Proposal(this.core, this.logger);\n    this.pendingRequest = new PendingRequest(this.core, this.logger);\n    this.engine = new Engine(this);\n    this.auth = new AuthStore(this.core, this.logger);\n  }\n\n  get context() {\n    return getLoggerContext(this.logger);\n  }\n\n  get pairing() {\n    return this.core.pairing.pairings;\n  }\n\n  // ---------- Events ----------------------------------------------- //\n\n  public on: ISignClientEvents[\"on\"] = (name, listener) => {\n    return this.events.on(name, listener);\n  };\n\n  public once: ISignClientEvents[\"once\"] = (name, listener) => {\n    return this.events.once(name, listener);\n  };\n\n  public off: ISignClientEvents[\"off\"] = (name, listener) => {\n    return this.events.off(name, listener);\n  };\n\n  public removeListener: ISignClientEvents[\"removeListener\"] = (name, listener) => {\n    return this.events.removeListener(name, listener);\n  };\n\n  public removeAllListeners: ISignClientEvents[\"removeAllListeners\"] = (name) => {\n    return this.events.removeAllListeners(name);\n  };\n\n  // ---------- Engine ----------------------------------------------- //\n\n  public connect: ISignClient[\"connect\"] = async (params) => {\n    try {\n      return await this.engine.connect(params);\n    } catch (error: any) {\n      this.logger.error(error.message);\n      throw error;\n    }\n  };\n\n  public pair: ISignClient[\"pair\"] = async (params) => {\n    try {\n      return await this.engine.pair(params);\n    } catch (error: any) {\n      this.logger.error(error.message);\n      throw error;\n    }\n  };\n\n  public approve: ISignClient[\"approve\"] = async (params) => {\n    try {\n      return await this.engine.approve(params);\n    } catch (error: any) {\n      this.logger.error(error.message);\n      throw error;\n    }\n  };\n\n  public reject: ISignClient[\"reject\"] = async (params) => {\n    try {\n      return await this.engine.reject(params);\n    } catch (error: any) {\n      this.logger.error(error.message);\n      throw error;\n    }\n  };\n\n  public update: ISignClient[\"update\"] = async (params) => {\n    try {\n      return await this.engine.update(params);\n    } catch (error: any) {\n      this.logger.error(error.message);\n      throw error;\n    }\n  };\n\n  public extend: ISignClient[\"extend\"] = async (params) => {\n    try {\n      return await this.engine.extend(params);\n    } catch (error: any) {\n      this.logger.error(error.message);\n      throw error;\n    }\n  };\n\n  public request: ISignClient[\"request\"] = async <T>(params: EngineTypes.RequestParams) => {\n    try {\n      return await this.engine.request<T>(params);\n    } catch (error: any) {\n      this.logger.error(error.message);\n      throw error;\n    }\n  };\n\n  public respond: ISignClient[\"respond\"] = async (params) => {\n    try {\n      return await this.engine.respond(params);\n    } catch (error: any) {\n      this.logger.error(error.message);\n      throw error;\n    }\n  };\n\n  public ping: ISignClient[\"ping\"] = async (params) => {\n    try {\n      return await this.engine.ping(params);\n    } catch (error: any) {\n      this.logger.error(error.message);\n      throw error;\n    }\n  };\n\n  public emit: ISignClient[\"emit\"] = async (params) => {\n    try {\n      return await this.engine.emit(params);\n    } catch (error: any) {\n      this.logger.error(error.message);\n      throw error;\n    }\n  };\n\n  public disconnect: ISignClient[\"disconnect\"] = async (params) => {\n    try {\n      return await this.engine.disconnect(params);\n    } catch (error: any) {\n      this.logger.error(error.message);\n      throw error;\n    }\n  };\n\n  public find: ISignClient[\"find\"] = (params) => {\n    try {\n      return this.engine.find(params);\n    } catch (error: any) {\n      this.logger.error(error.message);\n      throw error;\n    }\n  };\n\n  public getPendingSessionRequests: ISignClient[\"getPendingSessionRequests\"] = () => {\n    try {\n      return this.engine.getPendingSessionRequests();\n    } catch (error: any) {\n      this.logger.error(error.message);\n      throw error;\n    }\n  };\n\n  public authenticate: ISignClient[\"authenticate\"] = async (params, walletUniversalLink) => {\n    try {\n      return await this.engine.authenticate(params, walletUniversalLink);\n    } catch (error: any) {\n      this.logger.error(error.message);\n      throw error;\n    }\n  };\n\n  public formatAuthMessage: ISignClient[\"formatAuthMessage\"] = (params) => {\n    try {\n      return this.engine.formatAuthMessage(params);\n    } catch (error: any) {\n      this.logger.error(error.message);\n      throw error;\n    }\n  };\n\n  public approveSessionAuthenticate: ISignClient[\"approveSessionAuthenticate\"] = async (params) => {\n    try {\n      return await this.engine.approveSessionAuthenticate(params);\n    } catch (error: any) {\n      this.logger.error(error.message);\n      throw error;\n    }\n  };\n\n  public rejectSessionAuthenticate: ISignClient[\"rejectSessionAuthenticate\"] = async (params) => {\n    try {\n      return await this.engine.rejectSessionAuthenticate(params);\n    } catch (error: any) {\n      this.logger.error(error.message);\n      throw error;\n    }\n  };\n\n  // ---------- Private ----------------------------------------------- //\n\n  private async initialize() {\n    this.logger.trace(`Initialized`);\n    try {\n      await this.core.start();\n      await this.session.init();\n      await this.proposal.init();\n      await this.pendingRequest.init();\n      await this.auth.init();\n      await this.engine.init();\n      this.logger.info(`SignClient Initialization Success`);\n    } catch (error: any) {\n      this.logger.info(`SignClient Initialization Failure`);\n      this.logger.error(error.message);\n      throw error;\n    }\n  }\n}\n","import { SignClient as Client } from \"./client.js\";\nimport { Session } from \"./controllers/session.js\";\nexport * from \"./constants/index.js\";\n\nexport const SessionStore = Session;\nexport const SignClient = Client;\nexport default Client;\n"],"names":["SIGN_CLIENT_PROTOCOL","SIGN_CLIENT_VERSION","SIGN_CLIENT_CONTEXT","SIGN_CLIENT_STORAGE_PREFIX","SIGN_CLIENT_DEFAULT","SIGN_CLIENT_EVENTS","SIGN_CLIENT_STORAGE_OPTIONS","WALLETCONNECT_DEEPLINK_CHOICE","HISTORY_EVENTS","HISTORY_CONTEXT","HISTORY_STORAGE_VERSION","PROPOSAL_CONTEXT","PROPOSAL_EXPIRY","THIRTY_DAYS","PROPOSAL_EXPIRY_MESSAGE","SESSION_CONTEXT","SESSION_EXPIRY","SEVEN_DAYS","ENGINE_CONTEXT","ENGINE_RPC_OPTS","FIVE_MINUTES","ONE_DAY","ONE_HOUR","SESSION_REQUEST_EXPIRY_BOUNDARIES","ENGINE_QUEUE_STATES","TVF_METHODS","REQUEST_CONTEXT","METHODS_TO_VERIFY","AUTH_PROTOCOL","AUTH_VERSION","AUTH_CONTEXT","AUTH_KEYS_CONTEXT","AUTH_PAIRING_TOPIC_CONTEXT","AUTH_REQUEST_CONTEXT","AUTH_STORAGE_PREFIX","AUTH_PUBLIC_KEY_NAME","Engine","IEngine","client","EventEmmiter","LimitedSet","ONE_SECOND","toMiliseconds","params","connectParams","mergeRequiredAndOptionalNamespaces","pairingTopic","requiredNamespaces","optionalNamespaces","sessionProperties","scopedProperties","relays","authentication","walletPay","expiry","topic","uri","active","pairing","error","newTopic","newUri","message","getInternalError","publicKey","expiryTimestamp","calcExpiry","proposal","RELAYER_DEFAULT_PROTOCOL","payloadId","auth","domain","chains","nonce","exp","nbf","type","statement","requestId","resources","signatureTypes","sessionConnectTarget","engineEvent","reject","resolve","approval","createDelayedPromise","proposalExpireHandler","id","pendingSession","sessionTopic","e","session","configEvent","EVENT_CLIENT_SESSION_TRACES","EVENT_CLIENT_SESSION_ERRORS","relayProtocol","namespaces","sessionConfig","proposalRequestsResponses","proposer","event","selfPublicKey","peerPublicKey","sessionSettle","transportType","TRANSPORT_TYPES","getSdkError","reason","acknowledged","clientRpcId","relayRpcId","getBigIntRpcId","oldNamespaces","chainId","request","done","result","protocolMethod","appLink","protocolRequestParams","wcDeepLink","getDeepLink","handleDeeplinkRedirect","response","isJsonRpcResult","isJsonRpcError","isSessionCompatible","walletUniversalLink","isLinkMode","methods","connectionUri","oldResponseTopic","oldPublicKey","responseTopic","hashKey","namespace","parseChainId","recap","createEncodedRecap","getRecapFromResources","mergeEncodedRecaps","authRequestExpiry","authenticateId","sessionConnectEventTarget","authenticateEventTarget","onSessionConnect","onAuthenticate","payload","cacaos","responder","approvedMethods","approvedAccounts","cacao","validateSignedCacao","approvedChains","getNamespacedDidChainId","parsedAddress","getDidAddress","methodsfromRecap","getMethodsFromRecap","chainsFromRecap","getChainsFromRecap","chain","buildNamespacesFromAuth","linkModeURL","formatJsonRpcRequest","TYPE_2","BASE64URL","getLinkModeURL","sessionAuthenticateResponseParams","auths","EVENT_CLIENT_AUTHENTICATE_TRACES","EVENT_CLIENT_AUTHENTICATE_ERRORS","pendingRequest","receiverPublicKey","senderPublicKey","encodeOpts","TYPE_1","invalidErr","iss","formatMessage","duplicates","p","expirerHasDeleted","emitEvent","self","r","verifyContext","args","method","throwOnFailedPublish","tvf","publishOpts","encoding","BASE64","attestation","decryptedId","hashMessage","opts","redirectURL","proposeSessionPayload","proposeSessionMessage","attestationId","pairingProposalResponse","sessionSettleRequest","pairingPayload","formatJsonRpcResult","pairingResponseMessage","sessionSettlePayload","sessionSettlementRequestMessage","record","rpcOpts","formatJsonRpcError","sessionTopics","proposalIds","toCleanup","isExpired","encryptedId","reqMethod","resMethod","requestMethod","expectedMethods","EVENT_CLIENT_PAIRING_ERRORS","EVENT_CLIENT_PAIRING_TRACES","err","subscriptionId","target","relay","controller","s","memoryKey","lastSessionUpdateId","MemoryStore","lastId","currentId","_topic","requester","authPayload","pendingRequests","subscriberTopics","pairingTopics","pendingSessionTopics","authResponseTopic","isValidParams","isUndefined","isValidRelays","isValidObject","warning","requestedNamespaces","ns","validRequiredNamespacesError","isValidRequiredNamespaces","validNamespacesError","isValidNamespaces","conformingNamespacesError","isConformingNamespaces","isValidString","approvedNamespaces","isValidErrorReason","isValidRelay","validControllerError","isValidController","isValidNamespacesChainId","isValidRequest","isValidNamespacesRequest","isValidResponse","isValidEvent","isValidNamespacesEvent","hash","metadata","context","VERIFY_SERVER","applink","properties","property","index","i","numItemsToDelete","k","deletedRecord","peerMetadata","url","getSearchParamFromURL","sessionExists","isTestRun","isReactNative","linking","initialUrl","getNamespacesChains","getNamespacesMethods","approvedEvents","getNamespacesEvents","txHashes","data","hexPart","methodConfig","getSuiDigest","getNearTransactionIdFromSignedTransaction","tx","buildSignedExtrinsicHash","isValidArray","getAlgorandTransactionId","getSignDirectHash","getWalletSendCallsHashes","hashes","extractSolanaTransactionId","topics","pendingMessages","messages","RELAYER_EVENTS","isJsonRpcRequest","isJsonRpcResponse","EXPIRER_EVENTS","parseExpirerTarget","PAIRING_EVENTS","isValidId","isValidRequestExpiry","Proposal","Store","core","logger","Session","PendingRequest","val","AuthKey","AuthPairingTopic","AuthRequest","AuthStore","SignClient","ISignClient","EventEmitter","name","listener","populateAppMetadata","createLogger","Core","getLoggerContext","SessionStore","Client"],"mappings":"oXAEO,MAAMA,GAAuB,KACvBC,GAAsB,EACtBC,GAAsB,SAEtBC,EAA6B,GAAGH,EAAoB,IAAIC,EAAmB,IAAIC,EAAmB,IAElGE,EAAsB,CACjC,KAAMF,GACN,OAAQ,QACR,WAAY,GACZ,SAAU,+BACZ,EAEaG,GAA2E,CACtF,iBAAkB,mBAClB,eAAgB,iBAChB,eAAgB,iBAChB,aAAc,eACd,eAAgB,iBAChB,eAAgB,iBAChB,gBAAiB,kBACjB,qBAAsB,uBACtB,cAAe,gBACf,gBAAiB,kBACjB,qBAAsB,uBACtB,uBAAwB,yBACxB,gBAAiB,iBACnB,EAEaC,GAA8B,CACzC,SAAU,UACZ,EAEaC,GAAgC,gCCnChCC,GAAiB,CAC5B,QAAS,kBACT,QAAS,kBACT,QAAS,kBACT,KAAM,cACR,EAEaC,GAAkB,UAElBC,GAA0B,MCP1BC,GAAmB,WAEnBC,GAAkBC,EAAAA,YAElBC,GAA0B,mBCJ1BC,GAAkB,UAElBC,EAAiBC,EAAAA,WCDjBC,GAAiB,SAEjBC,EAA0C,CACrD,kBAAmB,CACjB,IAAK,CACH,IAAKC,EAAAA,aACL,OAAQ,GACR,IAAK,IACP,EACA,IAAK,CACH,IAAKA,eACL,OAAQ,GACR,IAAK,IACP,EACA,OAAQ,CACN,IAAKA,EAAAA,aACL,OAAQ,GACR,IAAK,IACP,EACA,WAAY,CACV,IAAKA,eACL,OAAQ,GACR,IAAK,IACP,CACF,EACA,iBAAkB,CAChB,IAAK,CACH,IAAKA,EAAAA,aACL,OAAQ,GACR,IAAK,IACP,EACA,IAAK,CACH,IAAKA,EAAAA,aACL,OAAQ,GACR,IAAK,IACP,CACF,EACA,iBAAkB,CAChB,IAAK,CACH,IAAKC,EAAAA,QACL,OAAQ,GACR,IAAK,IACP,EACA,IAAK,CACH,IAAKA,EAAAA,QACL,OAAQ,GACR,IAAK,IACP,CACF,EACA,iBAAkB,CAChB,IAAK,CACH,IAAKA,EAAAA,QACL,OAAQ,GACR,IAAK,IACP,EACA,IAAK,CACH,IAAKA,EAAAA,QACL,OAAQ,GACR,IAAK,IACP,CACF,EACA,kBAAmB,CACjB,IAAK,CACH,IAAKD,EAAAA,aAAe,EACpB,OAAQ,GACR,IAAK,IACP,EACA,IAAK,CACH,IAAKA,EAAAA,aAAe,EACpB,OAAQ,GACR,IAAK,IACP,CACF,EACA,gBAAiB,CACf,IAAK,CACH,IAAKA,EAAAA,aACL,OAAQ,GACR,IAAK,IACP,EACA,IAAK,CACH,IAAKA,eACL,OAAQ,GACR,IAAK,IACP,CACF,EAEA,iBAAkB,CAChB,IAAK,CACH,IAAKC,EAAAA,QACL,OAAQ,GACR,IAAK,IACP,EACA,IAAK,CACH,IAAKA,EAAAA,QACL,OAAQ,GACR,IAAK,IACP,CACF,EACA,eAAgB,CACd,IAAK,CACH,IAAKA,EAAAA,QACL,OAAQ,GACR,IAAK,IACP,EACA,IAAK,CACH,IAAKA,EAAAA,QACL,OAAQ,GACR,IAAK,IACP,CACF,EACA,uBAAwB,CACtB,IAAK,CACH,IAAKC,EAAAA,SACL,OAAQ,GACR,IAAK,IACP,EACA,IAAK,CACH,IAAKA,EAAAA,SACL,OAAQ,GACR,IAAK,IACP,EACA,OAAQ,CACN,IAAKF,eACL,OAAQ,GACR,IAAK,IACP,EACA,WAAY,CACV,IAAKA,EAAAA,aACL,OAAQ,GACR,IAAK,IACP,CACF,CACF,EAEaG,EAAoC,CAC/C,IAAKH,EAAAA,aACL,IAAKH,EAAAA,UACP,EAEaO,EAA0D,CACrE,KAAM,OACN,OAAQ,QACV,EAEaC,GAAc,CAEzB,oBAAqB,CACnB,IAAK,EACP,EACA,uBAAwB,CACtB,IAAK,EACP,EACA,iBAAkB,CAChB,IAAK,EACP,EAGA,uBAAwB,CACtB,IAAK,WACP,EACA,2BAA4B,CAC1B,IAAK,cACP,EACA,8BAA+B,CAC7B,IAAK,WACP,EAGA,8BAA+B,CAC7B,IAAK,QACP,EACA,oBAAqB,CACnB,IAAK,EACP,EAGA,iCAAkC,CAChC,IAAK,eACP,EACA,0BAA2B,CACzB,IAAK,eACP,EAGA,qBAAsB,CACpB,IAAK,EACP,EACA,sBAAuB,CACrB,IAAK,EACP,EAGA,qBAAsB,CACpB,IAAK,MACP,EAGA,qBAAsB,CACpB,IAAK,EACP,EAEA,wBAAyB,CACvB,IAAK,EACP,EAGA,aAAc,CACZ,IAAK,EACP,EAGA,aAAc,CACZ,IAAK,MACP,EAGA,mBAAoB,CAClB,IAAK,MACP,EAGA,yBAA0B,CACxB,IAAK,EACP,EAGA,kBAAmB,CACjB,IAAK,EACP,CACF,ECxOaC,GAAkB,UCAlBC,GAAoB,CAC/B,oBACA,oBACA,iBACA,wBACF,ECLaC,GAAgB,KAChBC,GAAe,IACfC,GAAe,OACfC,GAAoB,WACpBC,GAA6B,gBAC7BC,GAAuB,WAEvBC,EAAsB,GAAGN,EAAa,IAAI,GAAY,IAAIE,EAAY,IACtEK,EAAuB,GAAGD,CAAmB,iBCsH7CE,WAAeC,GAAAA,OAAQ,CAgDlC,YAAYC,EAA2B,CACrC,MAAMA,CAAM,EAhDd,KAAO,KAAOpB,GAEd,KAAQ,OAAwB,IAAIqB,GAAAA,QACpC,KAAQ,YAAc,GAMtB,KAAQ,aAAmF,CACzF,MAAOf,EAAoB,KAC3B,MAAO,CAAA,CACT,EAMA,KAAQ,oBAA2E,CACjF,MAAOA,EAAoB,KAC3B,MAAO,CAAA,CACT,EAIA,KAAQ,uBAAyB,IAAIgB,EAAAA,WAAW,CAAE,MAAO,GAAI,CAAC,EAE9D,KAAQ,kBAAoBC,EAAAA,WAC5B,KAAQ,yBAAkD,IAAI,IAE9D,KAAQ,mBAAqB,IAAI,IAKjC,KAAQ,qBAAuB,IAC/B,KAAQ,kBAAiD,CAAA,EACzD,KAAQ,gBAQJ,IAAI,IAMR,KAAO,KAAwB,SAAY,CACpC,KAAK,cACR,MAAM,KAAK,QAAA,EACX,KAAK,sBAAA,EACL,KAAK,wBACL,KAAK,wBACL,KAAK,8BACL,MAAM,KAAK,0BAAA,EACX,KAAK,OAAO,KAAK,QAAQ,SAAS,CAAE,QAAS,OAAO,KAAKtB,CAAe,CAAE,CAAC,EAC3E,KAAK,YAAc,GACnB,WAAW,SAAY,CACrB,MAAM,KAAK,8BAEX,KAAK,oBAAoB,MAAQ,KAAK,4BACtC,KAAK,2BAAA,CACP,EAAGuB,EAAAA,cAAc,KAAK,iBAAiB,CAAC,EAE5C,EA4BA,KAAO,QAA8B,MAAOC,GAAW,CACrD,KAAK,cAAA,EACL,MAAM,KAAK,4BACX,MAAMC,EAAgB,CACpB,GAAGD,EACH,mBAAoBA,EAAO,oBAAsB,CAAA,EACjD,mBAAoBA,EAAO,oBAAsB,EACnD,EACA,MAAM,KAAK,eAAeC,CAAa,EAGvCA,EAAc,mBAAqBC,EAAAA,mCACjCD,EAAc,mBACdA,EAAc,kBAChB,EAEAA,EAAc,mBAAqB,CAAA,EAEnC,KAAM,CACJ,aAAAE,EACA,mBAAAC,EACA,mBAAAC,EACA,kBAAAC,EACA,iBAAAC,EACA,OAAAC,EACA,eAAAC,EACA,UAAAC,CACF,EAAIT,EAGEU,EAD2BF,IAAiB,CAAC,GAAG,KAExBjC,EAAgB,kBAAkB,IAAI,KAAOC,EAAAA,aAC3E,KAAK,sBAAsBkC,CAAM,EAEjC,IAAIC,EAAQT,EACRU,EACAC,EAAS,GACb,GAAI,CACF,GAAIF,EAAO,CACT,MAAMG,EAAU,KAAK,OAAO,KAAK,QAAQ,SAAS,IAAIH,CAAK,EAC3D,KAAK,OAAO,OAAO,KACjB,oGACF,EACAE,EAASC,EAAQ,MACnB,CACF,OAASC,EAAO,CACd,MAAA,KAAK,OAAO,OAAO,MAAM,4BAA4BJ,CAAK,UAAU,EAC9DI,CACR,CACA,GAAI,CAACJ,GAAS,CAACE,EAAQ,CACrB,KAAM,CAAE,MAAOG,EAAU,IAAKC,CAAO,EAAI,MAAM,KAAK,OAAO,KAAK,QAAQ,OAAO,CAC7E,SAAU,CAAE,cAAe,EAAK,CAClC,CAAC,EACDN,EAAQK,EACRJ,EAAMK,CACR,CAEA,GAAI,CAACN,EAAO,CACV,KAAM,CAAE,QAAAO,CAAQ,EAAIC,EAAAA,iBAAiB,kBAAmB,4BAA4BR,CAAK,EAAE,EAC3F,MAAM,IAAI,MAAMO,CAAO,CACzB,CAEA,MAAME,EAAY,MAAM,KAAK,OAAO,KAAK,OAAO,kBAE1CC,EAAkBC,EAAAA,WAAWZ,CAAM,EACnCa,EAAiC,CACrC,mBAAApB,EACA,mBAAAC,EACA,OAAQG,GAAU,CAAC,CAAE,SAAUiB,EAAAA,wBAAyB,CAAC,EACzD,SAAU,CACR,UAAAJ,EACA,SAAU,KAAK,OAAO,QACxB,EACA,gBAAAC,EACA,aAAcV,EACd,GAAIN,GAAqB,CAAE,kBAAAA,CAAkB,EAC7C,GAAIC,GAAoB,CAAE,iBAAAA,CAAiB,EAC3C,GAAImB,EAAAA,UAAAA,EACJ,IAAKjB,GAAkBC,IAAc,CACnC,SAAU,CACR,eAAgBD,GAAgB,IAAKkB,GAAS,CAC5C,KAAM,CACJ,OAAAC,EACA,OAAAC,EACA,MAAAC,EACA,IAAAjB,EACA,IAAAkB,EACA,IAAAC,EACA,KAAAC,EACA,UAAAC,EACA,UAAAC,EACA,UAAAC,EACA,eAAAC,CACF,EAAIV,EAgBJ,MAfqD,CACnD,OAAAC,EACA,OAAAC,EACA,MAAAC,EACA,KAAMG,GAAQ,UACd,IAAKpB,EACL,QAAS,IACT,IAAK,IAAI,OAAO,YAAA,EAChB,IAAAkB,EACA,IAAAC,EACA,UAAAE,EACA,UAAAC,EACA,UAAAC,EACA,eAAAC,CACF,CAEF,CAAC,EACD,UAAA3B,CACF,CACF,CACF,EAEM4B,EAAuBC,EAAAA,YAAY,kBAAmBf,EAAS,EAAE,EAEjE,CACJ,OAAAgB,EACA,QAAAC,EACA,KAAMC,CACR,EAAIC,EAAAA,qBAA0ChC,EAAQxC,EAAuB,EAEvEyE,EAAwB,CAAC,CAAE,GAAAC,CAAG,IAAsB,CACxD,GAAIA,IAAOrB,EAAS,GAAI,CACtB,KAAK,OAAO,OAAO,IAAI,kBAAmBoB,CAAqB,EAC/D,MAAME,EAAiB,KAAK,gBAAgB,IAAItB,EAAS,EAAE,EAC3D,GAAIsB,EAAgB,CAClB,KAAM,CAAE,aAAAC,EAAc,UAAA1B,CAAU,EAAIyB,EACpC,QAAQ,IAAI,CACV,KAAK,OAAO,KAAK,QAAQ,YAAYC,CAAY,EACjD,KAAK,OAAO,KAAK,OAAO,SAAS,IAAIA,CAAY,EAC7C,KAAK,OAAO,KAAK,OAAO,aAAaA,CAAY,EACjD,QAAQ,QAAA,EACZ,KAAK,OAAO,KAAK,OAAO,SAAS,IAAI1B,CAAS,EAC1C,KAAK,OAAO,KAAK,OAAO,cAAcA,CAAS,EAC/C,QAAQ,QAAA,CACd,CAAC,EAAE,MAAO2B,GAAM,KAAK,OAAO,OAAO,KAAKA,CAAC,CAAC,CAC5C,CACA,KAAK,gBAAgB,OAAOxB,EAAS,EAAE,EACvC,KAAK,OAAO,KAAKc,EAAsB,CACrC,MAAO,CAAE,QAASnE,GAAyB,KAAM,CAAE,CACrD,CAAC,CACH,CACF,EAEA,OAAA,KAAK,OAAO,OAAO,GAAG,kBAAmByE,CAAqB,EAC9D,KAAK,OAAO,KAAwBN,EAAsB,CAAC,CAAE,MAAAtB,EAAO,QAAAiC,CAAQ,IAAM,CAChF,KAAK,OAAO,OAAO,IAAI,kBAAmBL,CAAqB,EAC3D5B,EAAOwB,EAAOxB,CAAK,EACdiC,GACPR,EAAQQ,CAAO,CAEnB,CAAC,EAED,MAAM,KAAK,YAAYzB,EAAS,GAAIA,CAAQ,EAE5C,MAAM,KAAK,mBAAmB,CAC5B,SAAAA,EACA,YAAa,CACX,SAAU,CACR,qBAAsB,EACxB,EACA,IAAK,CACH,cAAeA,EAAS,EAC1B,CACF,CACF,CAAC,EAAE,MAAOR,GAAU,CAClB,WAAK,eAAeQ,EAAS,EAAE,EACzBR,CACR,CAAC,EAEM,CAAE,IAAAH,EAAK,SAAA6B,CAAS,CACzB,EAEA,KAAO,KAAwB,MAAO1C,GAAW,CAC/C,KAAK,gBACL,MAAM,KAAK,4BACX,GAAI,CACF,OAAO,MAAM,KAAK,OAAO,KAAK,QAAQ,KAAKA,CAAM,CACnD,OAASgB,EAAO,CACd,WAAK,OAAO,OAAO,MAAM,eAAe,EAClCA,CACR,CACF,EAEA,KAAO,QAA8B,MAAOhB,GAAW,CACrD,MAAMkD,EAAc,KAAK,OAAO,KAAK,YAAY,YAAY,CAC3D,WAAY,CACV,MAAOlD,GAAQ,IAAI,SAAA,EACnB,MAAO,CAACmD,8BAA4B,uBAAuB,CAC7D,CACF,CAAC,EACD,GAAI,CACF,KAAK,cAAA,EACL,MAAM,KAAK,2BACb,OAASnC,EAAO,CACd,MAAAkC,EAAY,SAASE,EAAAA,4BAA4B,sBAAsB,EACjEpC,CACR,CACA,GAAI,CACF,MAAM,KAAK,kBAAkBhB,GAAQ,EAAE,CACzC,OAASgB,EAAO,CACd,MAAA,KAAK,OAAO,OAAO,MAAM,6BAA6BhB,GAAQ,EAAE,UAAU,EAC1EkD,EAAY,SAASE,EAAAA,4BAA4B,kBAAkB,EAC7DpC,CACR,CAEA,GAAI,CACF,MAAM,KAAK,eAAehB,CAAM,CAClC,OAASgB,EAAO,CACd,WAAK,OAAO,OAAO,MAAM,sCAAsC,EAC/DkC,EAAY,SACVE,EAAAA,4BAA4B,4CAC9B,EACMpC,CACR,CAEA,KAAM,CACJ,GAAA6B,EACA,cAAAQ,EACA,WAAAC,EACA,kBAAAhD,EACA,iBAAAC,EACA,cAAAgD,EACA,0BAAAC,CACF,EAAIxD,EAEEwB,EAAW,KAAK,OAAO,SAAS,IAAIqB,CAAE,EAE5C,KAAK,OAAO,KAAK,YAAY,YAAY,CAAE,QAASK,EAAY,OAAQ,CAAC,EAEzE,KAAM,CAAE,aAAA/C,EAAc,SAAAsD,EAAU,mBAAArD,EAAoB,mBAAAC,CAAmB,EAAImB,EAE3E,IAAIkC,EAAQ,KAAK,OAAO,KAAK,aAAa,SAAS,CACjD,MAAOvD,CACT,CAAC,EACIuD,IACHA,EAAQ,KAAK,OAAO,KAAK,aAAa,YAAY,CAChD,KAAMP,EAAAA,4BAA4B,wBAClC,WAAY,CACV,MAAOhD,EACP,MAAO,CACLgD,EAAAA,4BAA4B,wBAC5BA,EAAAA,4BAA4B,qCAC9B,CACF,CACF,CAAC,GAGH,MAAMQ,EAAgB,MAAM,KAAK,OAAO,KAAK,OAAO,gBAAA,EAC9CC,EAAgBH,EAAS,UACzBV,EAAe,MAAM,KAAK,OAAO,KAAK,OAAO,kBACjDY,EACAC,CACF,EAEMC,EAAgB,CACpB,MAAO,CAAE,SAAUR,GAAiB,KAAM,EAC1C,WAAAC,EACA,WAAY,CAAE,UAAWK,EAAe,SAAU,KAAK,OAAO,QAAS,EACvE,OAAQpC,EAAAA,WAAWlD,CAAc,EACjC,GAAIiC,GAAqB,CAAE,kBAAAA,CAAkB,EAC7C,GAAIC,GAAoB,CAAE,iBAAAA,CAAiB,EAC3C,GAAIgD,GAAiB,CAAE,cAAAA,CAAc,EACrC,0BAAAC,CACF,EACMM,EAAgBC,EAAAA,gBAAgB,MACtCL,EAAM,SAASP,EAAAA,4BAA4B,yBAAyB,EACpE,GAAI,CACF,MAAM,KAAK,OAAO,KAAK,QAAQ,UAAUJ,EAAc,CACrD,cAAAe,EACA,SAAU,CAAE,cAAe,EAAK,CAClC,CAAC,CACH,OAAS9C,EAAO,CACd,MAAA0C,EAAM,SAASN,EAAAA,4BAA4B,+BAA+B,EACpEpC,CACR,CAEA0C,EAAM,SAASP,EAAAA,4BAA4B,+BAA+B,EAE1E,MAAMF,EAA+B,CACnC,GAAGY,EACH,MAAOd,EACP,mBAAA3C,EACA,mBAAAC,EACA,aAAAF,EACA,aAAc,GACd,KAAM0D,EAAc,WACpB,KAAM,CACJ,UAAWJ,EAAS,UACpB,SAAUA,EAAS,QACrB,EACA,WAAYE,EACZ,cAAeI,EAAAA,gBAAgB,MAC/B,eAAgBP,GAA2B,eAC3C,gBAAiBA,GAA2B,SAC9C,EAEA,MAAM,KAAK,OAAO,QAAQ,IAAIT,EAAcE,CAAO,EAEnDS,EAAM,SAASP,EAAAA,4BAA4B,aAAa,EAExD,GAAI,CACF,MAAM,KAAK,mBAAmB,CAC5B,aAAAJ,EACA,SAAAvB,EACA,wBAAyB,CACvB,MAAO,CACL,SAAU6B,GAAiB,KAC7B,EACA,mBAAoBM,CACtB,EACA,qBAAsBE,EACtB,YAAa,CACX,SAAU,CACR,qBAAsB,EACxB,EACA,IAAK,CACH,cAAehB,EACf,GAAG,KAAK,oBAAoBI,CAAO,CACrC,CACF,CACF,CAAC,EAEDS,EAAM,SAASP,EAAAA,4BAA4B,+BAA+B,CAC5E,OAASnC,EAAO,CACd,MAAA,KAAK,OAAO,OAAO,MAAMA,CAAK,EAE9B,KAAK,OAAO,QAAQ,OAAO+B,EAAciB,EAAAA,YAAY,mBAAmB,CAAC,EACzE,MAAM,KAAK,OAAO,KAAK,QAAQ,YAAYjB,CAAY,EACjD/B,CACR,CAEA,YAAK,OAAO,KAAK,YAAY,YAAY,CAAE,QAAS0C,EAAM,OAAQ,CAAC,EAEnE,MAAM,KAAK,OAAO,KAAK,QAAQ,eAAe,CAC5C,MAAOvD,EACP,SAAUsD,EAAS,QACrB,CAAC,EACD,MAAM,KAAK,eAAeZ,CAAE,EAC5B,MAAM,KAAK,OAAO,KAAK,QAAQ,SAAS,CAAE,MAAO1C,CAAa,CAAC,EAC/D,MAAM,KAAK,UAAU4C,EAAcxB,EAAAA,WAAWlD,CAAc,CAAC,EACtD,CACL,MAAO0E,EACP,aAAc,IAAM,QAAQ,QAAQ,KAAK,OAAO,QAAQ,IAAIA,CAAY,CAAC,CAC3E,CACF,EAEA,KAAO,OAA4B,MAAO/C,GAAW,CACnD,KAAK,cAAA,EACL,MAAM,KAAK,0BAAA,EACX,GAAI,CACF,MAAM,KAAK,cAAcA,CAAM,CACjC,OAASgB,EAAO,CACd,MAAA,KAAK,OAAO,OAAO,MAAM,oCAAoC,EACvDA,CACR,CACA,KAAM,CAAE,GAAA6B,EAAI,OAAAoB,CAAO,EAAIjE,EACvB,IAAIG,EACJ,GAAI,CAEFA,EADiB,KAAK,OAAO,SAAS,IAAI0C,CAAE,EACpB,YAC1B,OAAS7B,EAAO,CACd,MAAA,KAAK,OAAO,OAAO,MAAM,4BAA4B6B,CAAE,UAAU,EAC3D7B,CACR,CAEIb,GACF,MAAM,KAAK,UAAU,CACnB,GAAA0C,EACA,MAAO1C,EACP,MAAO8D,EACP,QAASzF,EAAgB,kBAAkB,MAC7C,CAAC,EAGH,MAAM,KAAK,eAAeqE,CAAE,CAC9B,EAEA,KAAO,OAA4B,MAAO7C,GAAW,CACnD,KAAK,gBACL,MAAM,KAAK,0BAAA,EACX,GAAI,CACF,MAAM,KAAK,cAAcA,CAAM,CACjC,OAASgB,EAAO,CACd,MAAA,KAAK,OAAO,OAAO,MAAM,oCAAoC,EACvDA,CACR,CACA,KAAM,CAAE,MAAAJ,EAAO,WAAA0C,CAAW,EAAItD,EAExB,CACJ,KAAMkE,EACN,QAAAzB,EACA,OAAAD,CACF,EAAIG,uBACFlE,EAAAA,aACA,sEACF,EACM0F,EAAczC,YAAAA,EACd0C,EAAaC,EAAAA,eAAAA,EAAiB,WAE9BC,EAAgB,KAAK,OAAO,QAAQ,IAAI1D,CAAK,EAAE,WACrD,OAAA,KAAK,OAAO,KAAK2B,EAAAA,YAAY,iBAAkB4B,CAAW,EAAG,CAAC,CAAE,MAAAnD,CAAM,IAAW,CAC3EA,EAAOwB,EAAOxB,CAAK,EAErByB,GAEJ,CAAC,EAID,MAAM,KAAK,OAAO,QAAQ,OAAO7B,EAAO,CAAE,WAAA0C,CAAW,CAAC,EACtD,MAAM,KAAK,YAAY,CACrB,MAAA1C,EACA,OAAQ,mBACR,OAAQ,CAAE,WAAA0C,CAAW,EACrB,qBAAsB,GACtB,YAAAa,EACA,WAAAC,CACF,CAAC,EAAE,MAAOpD,GAAU,CAClB,KAAK,OAAO,OAAO,MAAMA,CAAK,EAC9B,KAAK,OAAO,QAAQ,OAAOJ,EAAO,CAAE,WAAY0D,CAAc,CAAC,EAC/D9B,EAAOxB,CAAK,CACd,CAAC,EACM,CAAE,aAAAkD,CAAa,CACxB,EAEA,KAAO,OAA4B,MAAOlE,GAAW,CACnD,KAAK,gBACL,MAAM,KAAK,0BAAA,EACX,GAAI,CACF,MAAM,KAAK,cAAcA,CAAM,CACjC,OAASgB,EAAO,CACd,MAAA,KAAK,OAAO,OAAO,MAAM,oCAAoC,EACvDA,CACR,CAEA,KAAM,CAAE,MAAAJ,CAAM,EAAIZ,EACZmE,EAAczC,EAAAA,YACd,CACJ,KAAMwC,EACN,QAAAzB,EACA,OAAAD,CACF,EAAIG,EAAAA,qBACFlE,EAAAA,aACA,sEACF,EACA,OAAA,KAAK,OAAO,KAAK8D,EAAAA,YAAY,iBAAkB4B,CAAW,EAAG,CAAC,CAAE,MAAAnD,CAAM,IAAW,CAC3EA,EAAOwB,EAAOxB,CAAK,EAClByB,EAAAA,CACP,CAAC,EAED,MAAM,KAAK,UAAU7B,EAAOW,EAAAA,WAAWlD,CAAc,CAAC,EACtD,KAAK,YAAY,CACf,MAAAuC,EACA,OAAQ,mBACR,OAAQ,CAAA,EACR,YAAAuD,EACA,qBAAsB,EACxB,CAAC,EAAE,MAAOnB,GAAM,CACdR,EAAOQ,CAAC,CACV,CAAC,EAEM,CAAE,aAAAkB,CAAa,CACxB,EAEA,KAAO,QAA8B,MAAUlE,GAAsC,CACnF,KAAK,cAAA,EACL,GAAI,CACF,MAAM,KAAK,eAAeA,CAAM,CAClC,OAASgB,EAAO,CACd,MAAA,KAAK,OAAO,OAAO,MAAM,sCAAsC,EACzDA,CACR,CACA,KAAM,CAAE,QAAAuD,EAAS,QAAAC,EAAS,MAAA5D,EAAO,OAAAD,EAASnC,EAAgB,kBAAkB,IAAI,GAAI,EAAIwB,EAClFiD,EAAU,KAAK,OAAO,QAAQ,IAAIrC,CAAK,EAEzCqC,GAAS,gBAAkBc,EAAAA,gBAAgB,OAC7C,MAAM,KAAK,0BAAA,EAEb,MAAMI,EAAczC,EAAAA,UAAAA,EACd0C,EAAaC,EAAAA,iBAAiB,SAAA,EAC9B,CAAE,KAAAI,EAAM,QAAAhC,EAAS,OAAAD,CAAO,EAAIG,EAAAA,qBAChChC,EACA,oCACF,EACA,KAAK,OAAO,KACV4B,EAAAA,YAAY,kBAAmB4B,CAAW,EAC1C,CAAC,CAAE,MAAAnD,EAAO,OAAA0D,CAAO,IAAM,CACjB1D,EAAOwB,EAAOxB,CAAK,EAClByB,EAAQiC,CAAM,CACrB,CACF,EACA,MAAMC,EAAiB,oBACjBC,EAAU,KAAK,oBAAoB3B,EAAQ,KAAK,SAAUA,EAAQ,aAAa,EACrF,GAAI2B,EACF,OAAA,MAAM,KAAK,YAAY,CACrB,YAAAT,EACA,WAAAC,EACA,MAAAxD,EACA,OAAQ+D,EACR,OAAQ,CACN,QAAS,CACP,GAAGH,EACH,gBAAiBjD,EAAAA,WAAWZ,CAAM,CACpC,EACA,QAAA4D,CACF,EACA,OAAA5D,EACA,qBAAsB,GACtB,QAAAiE,CACF,CAAC,EAAE,MAAO5D,GAAUwB,EAAOxB,CAAK,CAAC,EAEjC,KAAK,OAAO,OAAO,KAAK,uBAAwB,CAC9C,MAAAJ,EACA,QAAA4D,EACA,QAAAD,EACA,GAAIJ,CACN,CAAC,EACc,MAAMM,EAAAA,EAIvB,MAAMI,EAAyE,CAC7E,QAAS,CACP,GAAGL,EACH,gBAAiBjD,EAAAA,WAAWZ,CAAM,CACpC,EACA,QAAA4D,CACF,EAEA,OAAO,MAAM,QAAQ,IAAI,CACvB,IAAI,QAAc,MAAO9B,GAAY,CACnC,MAAM,KAAK,YAAY,CACrB,YAAA0B,EACA,WAAAC,EACA,MAAAxD,EACA,OAAQ+D,EACR,OAAQE,EACR,OAAAlE,EACA,qBAAsB,GACtB,IAAK,KAAK,aAAawD,EAAaU,CAAqB,CAC3D,CAAC,EAAE,MAAO7D,GAAUwB,EAAOxB,CAAK,CAAC,EACjC,KAAK,OAAO,OAAO,KAAK,uBAAwB,CAC9C,MAAAJ,EACA,QAAA4D,EACA,QAAAD,EACA,GAAIJ,CACN,CAAC,EACD1B,GACF,CAAC,EACD,IAAI,QAAc,MAAOA,GAAY,CAEnC,GAAI,CAACQ,EAAQ,eAAe,gBAAiB,CAC3C,MAAM6B,EAAc,MAAMC,EAAAA,YACxB,KAAK,OAAO,KAAK,QACjBnH,EACF,EACA,MAAMoH,EAAAA,uBAAuB,CAAE,GAAIb,EAAa,MAAAvD,EAAO,WAAAkE,CAAW,CAAC,CACrE,CACArC,GACF,CAAC,EACDgC,EAAAA,CACF,CAAC,EAAE,KAAMC,GAAWA,EAAO,CAAC,CAAC,CAC/B,EAEA,KAAO,QAA8B,MAAO1E,GAAW,CACrD,KAAK,cAAA,EACL,MAAM0D,EAAQ,KAAK,OAAO,KAAK,YAAY,YAAY,CACrD,WAAY,CACV,MAAO1D,GAAQ,OAASA,GAAQ,UAAU,IAAI,WAC9C,MAAO,CAACmD,EAAAA,4BAA4B,gCAAgC,CACtE,CACF,CAAC,EACD,GAAI,CACF,MAAM,KAAK,eAAenD,CAAM,CAClC,OAASgB,EAAO,CACd,MAAA0C,EAAM,SAAU1C,GAAiB,OAAO,EACxC0C,EAAM,SAASN,EAAAA,4BAA4B,2CAA2C,EAEhFpC,CACR,CAEA0C,EAAM,SAASP,8BAA4B,2CAA2C,EAEtF,KAAM,CAAE,MAAAvC,EAAO,SAAAqE,CAAS,EAAIjF,EACtB,CAAE,GAAA6C,CAAG,EAAIoC,EACThC,EAAU,KAAK,OAAO,QAAQ,IAAIrC,CAAK,EAEzCqC,EAAQ,gBAAkBc,EAAAA,gBAAgB,OAC5C,MAAM,KAAK,0BAAA,EAGb,MAAMa,EAAU,KAAK,oBAAoB3B,EAAQ,KAAK,SAAUA,EAAQ,aAAa,EACrF,GAAI,CACFS,EAAM,SAASP,EAAAA,4BAA4B,wCAAwC,EAC/E+B,EAAAA,gBAAgBD,CAAQ,EAC1B,MAAM,KAAK,WAAW,CACpB,GAAApC,EACA,MAAAjC,EACA,OAAQqE,EAAS,OACjB,qBAAsB,GACtB,QAAAL,CACF,CAAC,EACQO,EAAAA,eAAeF,CAAQ,GAChC,MAAM,KAAK,UAAU,CAAE,GAAApC,EAAI,MAAAjC,EAAO,MAAOqE,EAAS,MAAO,QAAAL,CAAQ,CAAC,EAEpE,KAAK,qBAAqB5E,CAAM,CAClC,OAASgB,EAAO,CACd,MAAA0C,EAAM,SAAU1C,GAAiB,OAAO,EACxC0C,EAAM,SAASN,EAAAA,4BAA4B,wCAAwC,EAC7EpC,CACR,CACF,EAEA,KAAO,KAAwB,MAAOhB,GAAW,CAC/C,KAAK,gBACL,MAAM,KAAK,0BAAA,EACX,GAAI,CACF,MAAM,KAAK,YAAYA,CAAM,CAC/B,OAASgB,EAAO,CACd,MAAA,KAAK,OAAO,OAAO,MAAM,gCAAgC,EACnDA,CACR,CACA,KAAM,CAAE,MAAAJ,CAAM,EAAIZ,EAClB,GAAI,KAAK,OAAO,QAAQ,KAAK,SAASY,CAAK,EAAG,CAC5C,MAAMuD,EAAczC,EAAAA,UAAAA,EACd0C,EAAaC,EAAAA,iBAAiB,SAAA,EAC9B,CAAE,KAAAI,EAAM,QAAAhC,EAAS,OAAAD,CAAO,EAAIG,EAAAA,qBAChClE,EAAAA,aACA,4DACF,EACA,KAAK,OAAO,KAAK8D,EAAAA,YAAY,eAAgB4B,CAAW,EAAG,CAAC,CAAE,MAAAnD,CAAM,IAAW,CACzEA,EAAOwB,EAAOxB,CAAK,EAClByB,GACP,CAAC,EACD,MAAM,QAAQ,IAAI,CAChB,KAAK,YAAY,CACf,MAAA7B,EACA,OAAQ,iBACR,OAAQ,GACR,qBAAsB,GACtB,YAAAuD,EACA,WAAAC,CACF,CAAC,EACDK,EAAAA,CACF,CAAC,CACH,MAAW,KAAK,OAAO,KAAK,QAAQ,SAAS,KAAK,SAAS7D,CAAK,IAC9D,KAAK,OAAO,OAAO,KACjB,sFACF,EACA,MAAM,KAAK,OAAO,KAAK,QAAQ,KAAK,CAAE,MAAAA,CAAM,CAAC,EAEjD,EAEA,KAAO,KAAwB,MAAOZ,GAAW,CAC/C,KAAK,gBACL,MAAM,KAAK,0BAAA,EACX,MAAM,KAAK,YAAYA,CAAM,EAC7B,KAAM,CAAE,MAAAY,EAAO,MAAA8C,EAAO,QAAAa,CAAQ,EAAIvE,EAC5BoE,EAAaC,EAAAA,iBAAiB,WAC9BF,EAAczC,EAAAA,YACpB,MAAM,KAAK,YAAY,CACrB,MAAAd,EACA,OAAQ,kBACR,OAAQ,CAAE,MAAA8C,EAAO,QAAAa,CAAQ,EACzB,qBAAsB,GACtB,WAAAH,EACA,YAAAD,CACF,CAAC,CACH,EAEA,KAAO,WAAoC,MAAOnE,GAAW,CAC3D,KAAK,cAAA,EACL,MAAM,KAAK,4BACX,MAAM,KAAK,kBAAkBA,CAAM,EACnC,KAAM,CAAE,MAAAY,CAAM,EAAIZ,EAClB,GAAI,KAAK,OAAO,QAAQ,KAAK,SAASY,CAAK,EAEzC,MAAM,KAAK,YAAY,CACrB,MAAAA,EACA,OAAQ,mBACR,OAAQoD,cAAY,mBAAmB,EACvC,qBAAsB,EACxB,CAAC,EACD,MAAM,KAAK,cAAc,CAAE,MAAApD,EAAO,UAAW,EAAM,CAAC,UAC3C,KAAK,OAAO,KAAK,QAAQ,SAAS,KAAK,SAASA,CAAK,EAC9D,MAAM,KAAK,OAAO,KAAK,QAAQ,WAAW,CAAE,MAAAA,CAAM,CAAC,MAC9C,CACL,KAAM,CAAE,QAAAO,CAAQ,EAAIC,EAAAA,iBAClB,mBACA,uCAAuCR,CAAK,EAC9C,EACA,MAAM,IAAI,MAAMO,CAAO,CACzB,CACF,EAEA,KAAO,KAAyBnB,IAC9B,KAAK,cAAA,EACE,KAAK,OAAO,QAAQ,OAAA,EAAS,OAAQiD,GAAYmC,EAAAA,oBAAoBnC,EAASjD,CAAM,CAAC,GAG9F,KAAO,0BAAkE,IAChE,KAAK,OAAO,eAAe,SAKpC,KAAO,aAAwC,MAAOA,EAAQqF,IAAwB,CACpF,KAAK,cAAA,EACL,KAAK,oBAAoBrF,CAAM,EAE/B,MAAMsF,EACJD,GACA,KAAK,OAAO,KAAK,sBAAsB,SAASA,CAAmB,GACnE,KAAK,OAAO,SAAS,UAAU,SAE3BvB,EAA4CwB,EAC9CvB,EAAAA,gBAAgB,UAChBA,EAAAA,gBAAgB,MAEhBD,IAAkBC,EAAAA,gBAAgB,OACpC,MAAM,KAAK,4BAGb,KAAM,CACJ,OAAAlC,EACA,UAAAK,EAAY,GACZ,IAAArB,EACA,OAAAe,EACA,MAAAE,EACA,KAAAG,EACA,IAAAF,EACA,IAAAC,EACA,QAAAuD,EAAU,CAAA,EACV,OAAA5E,CACF,EAAIX,EAEEoC,EAAY,CAAC,GAAIpC,EAAO,WAAa,CAAA,CAAG,EAExC,CAAE,MAAOG,EAAc,IAAKqF,CAAc,EAAI,MAAM,KAAK,OAAO,KAAK,QAAQ,OAAO,CACxF,QAAS,CAAC,wBAAwB,EAClC,cAAA1B,CACF,CAAC,EAOD,GALA,KAAK,OAAO,OAAO,KAAK,CACtB,QAAS,wBACT,QAAS,CAAE,MAAO3D,EAAc,IAAKqF,CAAc,CACrD,CAAC,EAEG,KAAK,OAAO,KAAK,SAAS,KAAK,SAAShG,CAAoB,EAAG,CACjE,KAAM,CAAE,cAAeiG,EAAkB,UAAWC,CAAa,EAC/D,KAAK,OAAO,KAAK,SAAS,IAAIlG,CAAoB,EAChDiG,IACF,MAAM,KAAK,OAAO,KAAK,QACpB,YAAYA,CAAgB,EAC5B,MAAOzC,GAAM,KAAK,OAAO,OAAO,KAAKA,CAAC,CAAC,EAC1C,MAAM,KAAK,OAAO,KAAK,cACpB,OAAOyC,EAAkB,CACxB,QAAS,WACT,KAAM,CACR,CAAC,EACA,MAAOzC,GAAM,KAAK,OAAO,OAAO,KAAKA,CAAC,CAAC,GAExC0C,GAAgB,KAAK,OAAO,KAAK,OAAO,SAAS,IAAIA,CAAY,GACnE,MAAM,KAAK,OAAO,KAAK,OAAO,cAAcA,CAAY,CAE5D,CAEA,MAAMrE,EAAY,MAAM,KAAK,OAAO,KAAK,OAAO,gBAAA,EAC1CsE,EAAgBC,EAAAA,QAAQvE,CAAS,EAWvC,GATA,MAAM,QAAQ,IAAI,CAChB,KAAK,OAAO,KAAK,SAAS,IAAI7B,EAAsB,CAAE,cAAAmG,EAAe,UAAAtE,CAAU,CAAC,EAChF,KAAK,OAAO,KAAK,cAAc,IAAIsE,EAAe,CAAE,MAAOA,EAAe,aAAAxF,CAAa,CAAC,CAC1F,CAAC,EAED,MAAM,KAAK,OAAO,KAAK,QAAQ,UAAUwF,EAAe,CAAE,cAAA7B,CAAc,CAAC,EAEzE,KAAK,OAAO,OAAO,KAAK,yCAAyC3D,CAAY,EAAE,EAE3EoF,EAAQ,OAAS,EAAG,CACtB,KAAM,CAAE,UAAAM,CAAU,EAAIC,EAAAA,aAAajE,EAAO,CAAC,CAAC,EAC5C,IAAIkE,EAAQC,EAAAA,mBAAmBH,EAAW,UAAWN,CAAO,EACtCU,EAAAA,sBAAsB7D,CAAS,IAKnD2D,EADoBG,EAAAA,mBAAmBH,EAAO3D,EAAU,IAAA,CAAe,GAGzEA,EAAU,KAAK2D,CAAK,CACtB,CAGA,MAAMI,EACJxF,GAAUA,EAASnC,EAAgB,uBAAuB,IAAI,IAC1DmC,EACAnC,EAAgB,uBAAuB,IAAI,IAE3CgG,EAAsD,CAC1D,YAAa,CACX,KAAMvC,GAAQ,UACd,OAAAJ,EACA,UAAAK,EACA,IAAKrB,EACL,OAAAe,EACA,QAAS,IACT,MAAAE,EACA,IAAK,IAAI,KAAA,EAAO,cAChB,IAAAC,EACA,IAAAC,EACA,UAAAI,CACF,EACA,UAAW,CAAE,UAAAf,EAAW,SAAU,KAAK,OAAO,QAAS,EACvD,gBAAiBE,EAAAA,WAAW4E,CAAiB,CAC/C,EAGM7C,EAAa,CACjB,OAAQ,CACN,OAAAzB,EAEA,QAAS,CAAC,GAAG,IAAI,IAAI,CAAC,gBAAiB,GAAG0D,CAAO,CAAC,CAAC,EACnD,OAAQ,CAAC,eAAgB,iBAAiB,CAC5C,CACF,EAEM/D,EAAW,CACf,mBAAoB,CAAA,EACpB,mBAAoB8B,EACpB,OAAQ,CAAC,CAAE,SAAU,KAAM,CAAC,EAC5B,aAAAnD,EACA,SAAU,CACR,UAAAkB,EACA,SAAU,KAAK,OAAO,QACxB,EACA,gBAAiBE,EAAAA,WAAW/C,EAAgB,kBAAkB,IAAI,GAAG,EACrE,GAAIkD,EAAAA,UAAAA,CACN,EAEM,CAAE,KAAA+C,EAAM,QAAAhC,EAAS,OAAAD,CAAO,EAAIG,EAAAA,qBAAqBwD,EAAmB,iBAAiB,EAErFC,EAAiB1E,YAAAA,EACjB2E,EAA4B9D,cAAY,kBAAmBf,EAAS,EAAE,EACtE8E,EAA0B/D,EAAAA,YAAY,kBAAmB6D,CAAc,EAGvEG,EAAmB,MAAO,CAAE,MAAAvF,EAAO,QAAAiC,CAAQ,IAAW,CAE1D,KAAK,OAAO,IAAIqD,EAAyBE,CAAc,EACnDxF,EAAOwB,EAAOxB,CAAK,EACdiC,GACPR,EAAQ,CACN,QAAAQ,CACF,CAAC,CAEL,EAEMuD,EAAiB,MAAOC,GAAiB,CAI7C,GADA,MAAM,KAAK,yBAAyBL,EAAgB,CAAE,QAAS,YAAa,KAAM,CAAE,CAAC,EACjFK,EAAQ,MAAO,CAGjB,MAAMzF,EAAQgD,EAAAA,YAAY,wBAAyB,wBAAwB,EAC3E,OAAIyC,EAAQ,MAAM,OAASzF,EAAM,KAAM,QAGvC,KAAK,OAAO,IAAIqF,EAA2BE,CAAgB,EACpD/D,EAAOiE,EAAQ,MAAM,OAAO,EACrC,CAEA,MAAM,KAAK,eAAejF,EAAS,EAAE,EAErC,KAAK,OAAO,IAAI6E,EAA2BE,CAAgB,EAE3D,KAAM,CACJ,OAAAG,EACA,UAAAC,CACF,EAGIF,EAAQ,OAENG,EAA4B,CAAA,EAC5BC,GAA6B,CAAA,EACnC,UAAWC,KAASJ,EAAQ,CACV,MAAMK,EAAAA,oBAAoB,CAAE,MAAAD,EAAO,UAAW,KAAK,OAAO,KAAK,SAAU,CAAC,IAExF,KAAK,OAAO,OAAO,MAAMA,EAAO,+BAA+B,EAC/DtE,EAAOwB,EAAAA,YAAY,4BAA6B,+BAA+B,CAAC,GAGlF,KAAM,CAAE,EAAGyC,CAAQ,EAAIK,EACjBf,GAAQE,EAAAA,sBAAsBQ,EAAQ,SAAS,EAE/CO,GAA2B,CAACC,0BAAwBR,EAAQ,GAAG,CAAW,EAC1ES,GAAgBC,EAAAA,cAAcV,EAAQ,GAAG,EAE/C,GAAIV,GAAO,CACT,MAAMqB,GAAmBC,EAAAA,oBAAoBtB,EAAK,EAC5CuB,GAAkBC,EAAAA,mBAAmBxB,EAAK,EAChDa,EAAgB,KAAK,GAAGQ,EAAgB,EACxCJ,GAAe,KAAK,GAAGM,EAAe,CACxC,CAEA,UAAWE,MAASR,GAClBH,GAAiB,KAAK,GAAGW,EAAK,IAAIN,EAAa,EAAE,CAErD,CACA,MAAMnE,EAAe,MAAM,KAAK,OAAO,KAAK,OAAO,kBACjD1B,EACAsF,EAAU,SACZ,EAGA,IAAI1D,EAEA2D,EAAgB,OAAS,IAC3B3D,EAAU,CACR,MAAOF,EACP,aAAc,GACd,KAAM,CACJ,UAAA1B,EACA,SAAU,KAAK,OAAO,QACxB,EACA,KAAMsF,EACN,WAAYA,EAAU,UACtB,OAAQpF,EAAAA,WAAWlD,CAAc,EACjC,mBAAoB,CAAA,EACpB,mBAAoB,GACpB,MAAO,CAAE,SAAU,KAAM,EACzB,aAAA8B,EACA,WAAYsH,EAAAA,wBACV,CAAC,GAAG,IAAI,IAAIb,CAAe,CAAC,EAC5B,CAAC,GAAG,IAAI,IAAIC,EAAgB,CAAC,CAC/B,EACA,cAAA/C,CACF,EAEA,MAAM,KAAK,OAAO,KAAK,QAAQ,UAAUf,EAAc,CAAE,cAAAe,CAAc,CAAC,EACxE,MAAM,KAAK,OAAO,QAAQ,IAAIf,EAAcE,CAAO,EAC/C9C,GACF,MAAM,KAAK,OAAO,KAAK,QAAQ,eAAe,CAC5C,MAAOA,EACP,SAAUwG,EAAU,QACtB,CAAC,EAGH1D,EAAU,KAAK,OAAO,QAAQ,IAAIF,CAAY,GAI9C,KAAK,OAAO,SAAS,UAAU,UAC/B4D,EAAU,SAAS,UAAU,UAC7BA,EAAU,SAAS,UAAU,WAC7BtB,IAGA,KAAK,OAAO,KAAK,wBAAwBsB,EAAU,SAAS,SAAS,SAAS,EAE9E,KAAK,OAAO,QAAQ,OAAO5D,EAAc,CACvC,cAAegB,EAAAA,gBAAgB,SACjC,CAAC,GAGHtB,EAAQ,CACN,MAAOiE,EACP,QAAAzD,CACF,CAAC,CACH,EAGA,KAAK,OAAO,KAAwBoD,EAA2BE,CAAgB,EAC/E,KAAK,OAAO,KAAKD,EAAyBE,CAAc,EAExD,IAAIkB,EACJ,GAAI,CACF,GAAIpC,EAAY,CACd,MAAMmB,EAAUkB,EAAAA,qBAAqB,yBAA0BnD,EAAS4B,CAAc,EACtF,KAAK,OAAO,KAAK,QAAQ,IAAIjG,EAAcsG,CAAO,EAClD,MAAMtF,EAAU,MAAM,KAAK,OAAO,KAAK,OAAO,OAAO,GAAIsF,EAAS,CAChE,KAAMmB,EAAAA,OACN,SAAUC,EAAAA,SACZ,CAAC,EACDH,EAAcI,EAAAA,eAAezC,EAAqBlF,EAAcgB,CAAO,CACzE,MAEE,MAAM,QAAQ,IAAI,CAChB,KAAK,YAAY,CACf,MAAOhB,EACP,OAAQ,yBACR,OAAQqE,EACR,OAAQxE,EAAO,OACf,qBAAsB,GACtB,YAAaoG,CACf,CAAC,EACD,KAAK,YAAY,CACf,MAAOjG,EACP,OAAQ,oBACR,OAAQqB,EACR,OAAQhD,EAAgB,kBAAkB,IAAI,IAC9C,qBAAsB,GACtB,YAAagD,EAAS,EACxB,CAAC,CACH,CAAC,CAEL,OAASR,EAAO,CAEd,WAAK,OAAO,IAAIqF,EAA2BE,CAAgB,EAC3D,KAAK,OAAO,IAAID,EAAyBE,CAAc,EACjDxF,CACR,CAEA,aAAM,KAAK,YAAYQ,EAAS,GAAIA,CAAQ,EAC5C,MAAM,KAAK,eAAe4E,EAAgB,CACxC,QAAS,CACP,GAAG5B,EACH,cAAe,CAAA,CACjB,EACA,aAAArE,EACA,cAAA2D,CACF,CAAC,EAEM,CACL,IAAK4D,GAAelC,EACpB,SAAUf,CACZ,CACF,EAEA,KAAO,2BAAoE,MACzEsD,GACG,CACH,KAAM,CAAE,GAAAlF,EAAI,MAAAmF,CAAM,EAAID,EAEhBrE,EAAQ,KAAK,OAAO,KAAK,YAAY,YAAY,CACrD,WAAY,CACV,MAAOb,EAAG,WACV,MAAO,CAACoF,EAAAA,iCAAiC,qCAAqC,CAChF,CACF,CAAC,EAED,GAAI,CACF,KAAK,cAAA,CACP,OAASjH,EAAO,CACd,MAAA0C,EAAM,SAASwE,EAAAA,iCAAiC,sBAAsB,EAChElH,CACR,CAEA,MAAMmH,EAAiB,KAAK,sBAAsBtF,CAAE,EAEpD,GAAI,CAACsF,EACH,MAAAzE,EAAM,SACJwE,EAAAA,iCAAiC,+CACnC,EACM,IAAI,MAAM,+CAA+CrF,CAAE,EAAE,EAGrE,MAAMiB,EAAgBqE,EAAe,eAAiBpE,EAAAA,gBAAgB,MAClED,IAAkBC,kBAAgB,OACpC,MAAM,KAAK,0BAAA,EAGb,MAAMqE,EAAoBD,EAAe,UAAU,UAC7CE,EAAkB,MAAM,KAAK,OAAO,KAAK,OAAO,kBAChD1C,EAAgBC,EAAAA,QAAQwC,CAAiB,EAEzCE,EAAa,CACjB,KAAMC,SACN,kBAAAH,EACA,gBAAAC,CACF,EAEMzB,EAA4B,CAAA,EAC5BC,EAA6B,CAAA,EACnC,UAAWC,KAASkB,EAAO,CAEzB,GAAI,CADY,MAAMjB,EAAAA,oBAAoB,CAAE,MAAAD,EAAO,UAAW,KAAK,OAAO,KAAK,SAAU,CAAC,EAC5E,CACZpD,EAAM,SAASwE,EAAAA,iCAAiC,aAAa,EAE7D,MAAMM,EAAaxE,EAAAA,YACjB,4BACA,+BACF,EAEA,MAAA,MAAM,KAAK,UAAU,CACnB,GAAAnB,EACA,MAAO8C,EACP,MAAO6C,EACP,WAAAF,CACF,CAAC,EAEK,IAAI,MAAME,EAAW,OAAO,CACpC,CAEA9E,EAAM,SAASuE,EAAAA,iCAAiC,eAAe,EAE/D,KAAM,CAAE,EAAGxB,CAAQ,EAAIK,EACjBf,EAAQE,EAAAA,sBAAsBQ,EAAQ,SAAS,EAE/CO,EAA2B,CAACC,EAAAA,wBAAwBR,EAAQ,GAAG,CAAW,EAE1ES,EAAgBC,EAAAA,cAAcV,EAAQ,GAAG,EAE/C,GAAIV,EAAO,CACT,MAAMqB,EAAmBC,EAAAA,oBAAoBtB,CAAK,EAC5CuB,EAAkBC,EAAAA,mBAAmBxB,CAAK,EAChDa,EAAgB,KAAK,GAAGQ,CAAgB,EACxCJ,EAAe,KAAK,GAAGM,CAAe,CACxC,CACA,UAAWE,KAASR,EAClBH,EAAiB,KAAK,GAAGW,CAAK,IAAIN,CAAa,EAAE,CAErD,CAEA,MAAMnE,EAAe,MAAM,KAAK,OAAO,KAAK,OAAO,kBACjDsF,EACAD,CACF,EAEA1E,EAAM,SAASuE,EAAAA,iCAAiC,kCAAkC,EAElF,IAAIhF,EACJ,GAAI2D,GAAiB,OAAS,EAAG,CAC/B3D,EAAU,CACR,MAAOF,EACP,aAAc,GACd,KAAM,CACJ,UAAWsF,EACX,SAAU,KAAK,OAAO,QACxB,EACA,KAAM,CACJ,UAAWD,EACX,SAAUD,EAAe,UAAU,QACrC,EACA,WAAYC,EACZ,OAAQ7G,EAAAA,WAAWlD,CAAc,EACjC,eAAgB2J,EAChB,mBAAoB,CAAA,EACpB,mBAAoB,GACpB,MAAO,CAAE,SAAU,KAAM,EACzB,aAAcG,EAAe,aAC7B,WAAYV,0BACV,CAAC,GAAG,IAAI,IAAIb,CAAe,CAAC,EAC5B,CAAC,GAAG,IAAI,IAAIC,CAAgB,CAAC,CAC/B,EACA,cAAA/C,CACF,EAEAJ,EAAM,SAASuE,EAAAA,iCAAiC,uCAAuC,EAEvF,GAAI,CACF,MAAM,KAAK,OAAO,KAAK,QAAQ,UAAUlF,EAAc,CAAE,cAAAe,CAAc,CAAC,CAC1E,OAAS9C,EAAO,CACd,MAAA0C,EAAM,SACJwE,EAAAA,iCAAiC,6CACnC,EACMlH,CACR,CAEA0C,EAAM,SACJuE,EAAAA,iCAAiC,6CACnC,EAEA,MAAM,KAAK,OAAO,QAAQ,IAAIlF,EAAcE,CAAO,EAEnDS,EAAM,SAASuE,EAAAA,iCAAiC,2BAA2B,EAE3E,MAAM,KAAK,OAAO,KAAK,QAAQ,eAAe,CAC5C,MAAOE,EAAe,aACtB,SAAUA,EAAe,UAAU,QACrC,CAAC,CACH,CAEAzE,EAAM,SAASuE,EAAAA,iCAAiC,wCAAwC,EAExF,GAAI,CACF,MAAM,KAAK,WAAqC,CAC9C,MAAOtC,EACP,GAAA9C,EACA,OAAQ,CACN,OAAQmF,EACR,UAAW,CACT,UAAWK,EACX,SAAU,KAAK,OAAO,QACxB,CACF,EACA,WAAAC,EACA,qBAAsB,GACtB,QAAS,KAAK,oBAAoBH,EAAe,UAAU,SAAUrE,CAAa,CACpF,CAAC,CACH,OAAS9C,EAAO,CACd,MAAA0C,EAAM,SACJwE,EAAAA,iCAAiC,6CACnC,EACMlH,CACR,CAEA,OAAA,MAAM,KAAK,OAAO,KAAK,SAAS,OAAO6B,EAAI,CAAE,QAAS,YAAa,KAAM,CAAE,CAAC,EAC5E,MAAM,KAAK,OAAO,KAAK,QAAQ,SAAS,CAAE,MAAOsF,EAAe,YAAa,CAAC,EAC9E,KAAK,OAAO,KAAK,YAAY,YAAY,CAAE,QAASzE,EAAM,OAAQ,CAAC,EAE5D,CAAE,QAAAT,CAAQ,CACnB,EAEA,KAAO,0BAAkE,MAAOjD,GAAW,CACzF,KAAK,gBAEL,KAAM,CAAE,GAAA6C,EAAI,OAAAoB,CAAO,EAAIjE,EAEjBmI,EAAiB,KAAK,sBAAsBtF,CAAE,EAEpD,GAAI,CAACsF,EACH,MAAM,IAAI,MAAM,+CAA+CtF,CAAE,EAAE,EAGjEsF,EAAe,gBAAkBpE,EAAAA,gBAAgB,OACnD,MAAM,KAAK,4BAGb,MAAMqE,EAAoBD,EAAe,UAAU,UAC7CE,EAAkB,MAAM,KAAK,OAAO,KAAK,OAAO,gBAAA,EAChD1C,EAAgBC,EAAAA,QAAQwC,CAAiB,EAEzCE,EAAa,CACjB,KAAMC,EAAAA,OACN,kBAAAH,EACA,gBAAAC,CACF,EAEA,MAAM,KAAK,UAAU,CACnB,GAAAxF,EACA,MAAO8C,EACP,MAAO1B,EACP,WAAAqE,EACA,QAAS9J,EAAgB,uBAAuB,OAChD,QAAS,KAAK,oBACZ2J,EAAe,UAAU,SACzBA,EAAe,aACjB,CACF,CAAC,EACD,MAAM,KAAK,OAAO,KAAK,SAAS,OAAOtF,EAAI,CAAE,QAAS,WAAY,KAAM,CAAE,CAAC,EAC3E,MAAM,KAAK,eAAeA,CAAE,CAC9B,EAEA,KAAO,kBAAmD7C,GAAW,CACnE,KAAK,gBACL,KAAM,CAAE,QAAAwE,EAAS,IAAAiE,CAAI,EAAIzI,EACzB,OAAO0I,gBAAclE,EAASiE,CAAG,CACnC,EAMA,KAAO,yBAAgE,IAAM,CAE3E,WAAW,SAAY,CACrB,GAAI,KAAK,kBAAkB,SAAW,EACtC,KAAO,KAAK,kBAAkB,OAAS,GACrC,GAAI,CACF,MAAMtH,EAAU,KAAK,kBAAkB,MAAA,EACnCA,GACF,MAAM,KAAK,eAAeA,CAAO,CAErC,OAASH,EAAO,CACd,KAAK,OAAO,OAAO,MAAMA,CAAK,CAChC,CAEJ,EAAG,EAAE,CACP,EAIA,KAAQ,yBAAsE,MAC5EiC,GACG,CAEH,GAAKA,EAAQ,aAEb,GAAI,CACF,MAAMlC,EAAU,KAAK,OAAO,KAAK,QAAQ,SAAS,IAAIkC,EAAQ,YAAY,EAEpE0F,EADc,KAAK,OAAO,KAAK,QAAQ,SAAS,SACvB,OAC5BC,GACCA,EAAE,cAAc,KAChBA,EAAE,cAAc,MAAQ3F,EAAQ,KAAK,SAAS,KAC9C2F,EAAE,OACFA,EAAE,QAAU7H,EAAQ,KACxB,EACA,GAAI4H,EAAW,SAAW,EAAG,OAC7B,KAAK,OAAO,OAAO,KAAK,eAAeA,EAAW,MAAM,uBAAuB,EAC/E,MAAM,QAAQ,IACZA,EAAW,IAAKC,GAAM,KAAK,OAAO,KAAK,QAAQ,WAAW,CAAE,MAAOA,EAAE,KAAM,CAAC,CAAC,CAC/E,EACA,KAAK,OAAO,OAAO,KAAK,sCAAsC,CAChE,OAAS5H,EAAO,CACd,KAAK,OAAO,OAAO,MAAMA,CAAK,CAChC,CACF,EAEA,KAAQ,cAAgD,MAAOhB,GAAW,CACxE,KAAM,CAAE,MAAAY,EAAO,kBAAAiI,EAAoB,GAAO,UAAAC,EAAY,GAAM,GAAAjG,EAAK,CAAE,EAAI7C,EACjE,CAAE,KAAA+I,CAAK,EAAI,KAAK,OAAO,QAAQ,IAAInI,CAAK,EAE9C,MAAM,KAAK,OAAO,KAAK,QAAQ,YAAYA,CAAK,EAChD,MAAM,KAAK,OAAO,QAAQ,OAAOA,EAAOoD,EAAAA,YAAY,mBAAmB,CAAC,EACxE,KAAK,qBAAqBpD,EAAO,SAAS,EACtC,KAAK,OAAO,KAAK,OAAO,SAAS,IAAImI,EAAK,SAAS,GACrD,MAAM,KAAK,OAAO,KAAK,OAAO,cAAcA,EAAK,SAAS,EAExD,KAAK,OAAO,KAAK,OAAO,SAAS,IAAInI,CAAK,GAC5C,MAAM,KAAK,OAAO,KAAK,OAAO,aAAaA,CAAK,EAE7CiI,GAAmB,KAAK,OAAO,KAAK,QAAQ,IAAIjI,CAAK,EAG1D,KAAK,OAAO,KAAK,QACd,WAAWhD,EAA6B,EACxC,MAAOoF,GAAM,KAAK,OAAO,OAAO,KAAKA,CAAC,CAAC,EAEtCpC,IAAU,KAAK,oBAAoB,MAAM,CAAC,GAAG,QAC/C,KAAK,oBAAoB,MAAQ/B,EAAoB,MAGvD,MAAM,QAAQ,IACZ,KAAK,4BACF,OAAQmK,GAAMA,EAAE,QAAUpI,CAAK,EAC/B,IAAKoI,GAAM,KAAK,4BAA4BA,EAAE,GAAIhF,EAAAA,YAAY,mBAAmB,CAAC,CAAC,CACxF,EAEI8E,GAAW,KAAK,OAAO,OAAO,KAAK,iBAAkB,CAAE,GAAAjG,EAAI,MAAAjC,CAAM,CAAC,CACxE,EAEA,KAAQ,eAAkD,MAAOiC,EAAIgG,IAAsB,CACzF,GAAIA,EACF,GAAI,CACF,MAAMrH,EAAW,KAAK,OAAO,SAAS,IAAIqB,CAAE,EAC9B,KAAK,OAAO,KAAK,YAAY,SAAS,CAAE,MAAOrB,EAAS,YAAa,CAAC,GAC7E,SAAS4B,EAAAA,4BAA4B,gBAAgB,CAC9D,MAAgB,CAAC,CAEnB,MAAM,QAAQ,IAAI,CAChB,KAAK,OAAO,SAAS,OAAOP,EAAImB,EAAAA,YAAY,mBAAmB,CAAC,EAChE6E,EAAoB,QAAQ,UAAY,KAAK,OAAO,KAAK,QAAQ,IAAIhG,CAAE,CACzE,CAAC,EACD,KAAK,qBAAqBA,EAAI,UAAU,CAC1C,EAEA,KAAQ,4BAA4E,MAClFA,EACAoB,EACA4E,EAAoB,KACjB,CACH,MAAM,QAAQ,IAAI,CAChB,KAAK,OAAO,eAAe,OAAOhG,EAAIoB,CAAM,EAC5C4E,EAAoB,QAAQ,QAAA,EAAY,KAAK,OAAO,KAAK,QAAQ,IAAIhG,CAAE,CACzE,CAAC,EACD,KAAK,qBAAqBA,EAAI,SAAS,EACvC,KAAK,oBAAoB,MAAQ,KAAK,oBAAoB,MAAM,OAAQmG,GAAMA,EAAE,KAAOnG,CAAE,EACrFgG,IACF,KAAK,oBAAoB,MAAQhK,EAAoB,KACrD,KAAK,OAAO,OAAO,KAAK,yBAA0B,CAAE,GAAAgE,CAAG,CAAC,EAE5D,EAEA,KAAQ,yBAAsE,MAC5EA,EACAoB,EACA4E,EAAoB,KACjB,CACH,MAAM,QAAQ,IAAI,CAChB,KAAK,OAAO,KAAK,SAAS,OAAOhG,EAAIoB,CAAM,EAC3C4E,EAAoB,QAAQ,QAAA,EAAY,KAAK,OAAO,KAAK,QAAQ,IAAIhG,CAAE,CACzE,CAAC,CACH,EAEA,KAAQ,UAAwC,MAAOjC,EAAOD,IAAW,CAClE,KAAK,OAAO,QAAQ,KAAK,SAASC,CAAK,IAC5C,KAAK,OAAO,KAAK,QAAQ,IAAIA,EAAOD,CAAM,EAC1C,MAAM,KAAK,OAAO,QAAQ,OAAOC,EAAO,CAAE,OAAAD,CAAO,CAAC,EACpD,EAEA,KAAQ,YAA4C,MAAOkC,EAAIrB,IAAa,CAC1E,KAAK,OAAO,KAAK,QAAQ,IAAIqB,EAAItB,EAAAA,WAAW/C,EAAgB,kBAAkB,IAAI,GAAG,CAAC,EACtF,MAAM,KAAK,OAAO,SAAS,IAAIqE,EAAIrB,CAAQ,CAC7C,EAEA,KAAQ,eAAkD,MAAOqB,EAAI7C,IAAW,CAC9E,KAAM,CAAE,QAAAwE,EAAS,aAAArE,EAAc,cAAA2D,EAAgBC,EAAAA,gBAAgB,KAAM,EAAI/D,EACzE,KAAK,OAAO,KAAK,QAAQ,IAAI6C,EAAI2B,EAAQ,eAAe,EACxD,MAAM,KAAK,OAAO,KAAK,SAAS,IAAI3B,EAAI,CACtC,YAAa2B,EAAQ,YACrB,UAAWA,EAAQ,UACnB,gBAAiBA,EAAQ,gBACzB,GAAA3B,EACA,aAAA1C,EACA,cAAeqE,EAAQ,cACvB,cAAAV,CACF,CAAC,CACH,EAEA,KAAQ,yBAAsE,MAC5EqE,GACG,CACH,KAAM,CAAE,GAAAtF,EAAI,MAAAjC,EAAO,OAAAZ,EAAQ,cAAAiJ,CAAc,EAAId,EACvCxH,EACJX,EAAO,QAAQ,iBAAmBuB,aAAW/C,EAAgB,kBAAkB,IAAI,GAAG,EACxF,KAAK,OAAO,KAAK,QAAQ,IAAIqE,EAAIlC,CAAM,EACvC,MAAM,KAAK,OAAO,eAAe,IAAIkC,EAAI,CACvC,GAAAA,EACA,MAAAjC,EACA,OAAAZ,EACA,cAAAiJ,CACF,CAAC,CACH,EAEA,KAAQ,YAA4C,MAAOC,GAAS,CAClE,KAAM,CACJ,MAAAtI,EACA,OAAAuI,EACA,OAAAnJ,EACA,OAAAW,EACA,WAAAyD,EACA,YAAAD,EACA,qBAAAiF,EACA,QAAAxE,EACA,IAAAyE,EACA,YAAAC,EAAc,CAAA,CAChB,EAAIJ,EACEzC,EAAUkB,EAAAA,qBAAqBwB,EAAQnJ,EAAQmE,CAAW,EAEhE,IAAIhD,EACJ,MAAMmE,EAAa,CAAC,CAACV,EAErB,GAAI,CACF,MAAM2E,EAAWjE,EAAauC,EAAAA,UAAY2B,EAAAA,OAC1CrI,EAAU,MAAM,KAAK,OAAO,KAAK,OAAO,OAAOP,EAAO6F,EAAS,CAAE,SAAA8C,CAAS,CAAC,CAC7E,OAASvI,EAAO,CACd,YAAM,KAAK,QAAA,EACX,KAAK,OAAO,OAAO,MAAM,mDAAmDJ,CAAK,SAAS,EACpFI,CACR,CAEA,IAAIyI,EACJ,GAAIzK,GAAkB,SAASmK,CAAM,EAAG,CACtC,MAAMO,EAAcC,EAAAA,YAAY,KAAK,UAAUlD,CAAO,CAAC,EACjD5D,EAAK8G,cAAYxI,CAAO,EAC9BsI,EAAc,MAAM,KAAK,OAAO,KAAK,OAAO,SAAS,CAAE,GAAA5G,EAAI,YAAA6G,CAAY,CAAC,CAC1E,CAEA,MAAME,EAAO,CACX,GAAGpL,EAAgB2K,CAAM,EAAE,IAC3B,GAAGG,CACL,EAOA,GALAM,EAAK,YAAcH,EACf9I,IAAQiJ,EAAK,IAAMjJ,GACnByD,IAAYwF,EAAK,GAAKxF,GAC1B,KAAK,OAAO,KAAK,QAAQ,IAAIxD,EAAO6F,CAAO,EAEvCnB,EAAY,CACd,MAAMuE,EAAc/B,EAAAA,eAAelD,EAAShE,EAAOO,CAAO,EAC1D,MAAO,OAAe,QAAQ,QAAQ0I,EAAa,KAAK,OAAO,IAAI,CACrE,MACED,EAAK,IAAM,CACT,GAAGP,EACH,cAAe5C,EAAQ,EACzB,EAEI2C,GACFQ,EAAK,SAAW,CACd,GAAGA,EAAK,SACR,qBAAsB,EACxB,EACA,MAAM,KAAK,OAAO,KAAK,QAAQ,QAAQhJ,EAAOO,EAASyI,CAAI,GAE3D,KAAK,OAAO,KAAK,QACd,QAAQhJ,EAAOO,EAASyI,CAAI,EAC5B,MAAO5I,GAAU,KAAK,OAAO,OAAO,MAAMA,CAAK,CAAC,EAIvD,OAAOyF,EAAQ,EACjB,EAEA,KAAQ,mBAA0D,MAAOzG,GAAW,CAClF,KAAM,CAAE,SAAAwB,EAAU,YAAA8H,CAAY,EAAItJ,EAE5B8J,EAAwBnC,EAAAA,qBAAqB,oBAAqBnG,EAAUA,EAAS,EAAE,EAE7F,KAAK,OAAO,KAAK,QAAQ,IAAIA,EAAS,aAAcsI,CAAqB,EAEzE,MAAMC,EAAwB,MAAM,KAAK,OAAO,KAAK,OAAO,OAC1DvI,EAAS,aACTsI,EACA,CACE,SAAUN,EAAAA,MACZ,CACF,EAEME,EAAcC,EAAAA,YAAY,KAAK,UAAUG,CAAqB,CAAC,EAC/DE,EAAgBL,cAAYI,CAAqB,EACjDN,EAAc,MAAM,KAAK,OAAO,KAAK,OAAO,SAAS,CAAE,GAAIO,EAAe,YAAAN,CAAY,CAAC,EAE7F,MAAM,KAAK,OAAO,KAAK,QAAQ,cAAc,CAC3C,QAAS,CACP,aAAclI,EAAS,aACvB,gBAAiBuI,CACnB,EACA,KAAM,CACJ,GAAGT,EACH,cAAe,oBACf,YAAAG,CACF,CACF,CAAC,CACH,EAEA,KAAQ,mBAA0D,MAAOzJ,GAAW,CAClF,KAAM,CAAE,aAAA+C,EAAc,wBAAAkH,EAAyB,SAAAzI,EAAU,qBAAA0I,EAAsB,YAAAZ,CAAY,EACzFtJ,EACImK,EAAiBC,sBAAoB5I,EAAS,GAAIyI,CAAuB,EAEzEI,EAAyB,MAAM,KAAK,OAAO,KAAK,OAAO,OAC3D7I,EAAS,aACT2I,EACA,CACE,SAAUX,EAAAA,MACZ,CACF,EAEMc,EAAuB3C,EAAAA,qBAC3B,mBACAuC,EACAZ,GAAa,EACf,EAEMiB,EAAkC,MAAM,KAAK,OAAO,KAAK,OAAO,OACpExH,EACAuH,EACA,CACE,SAAUd,EAAAA,MACZ,CACF,EAEA,KAAK,OAAO,KAAK,QAAQ,IAAIzG,EAAcuH,CAAoB,EAE/D,MAAM,KAAK,OAAO,KAAK,QAAQ,cAAc,CAC3C,QAAS,CACP,aAAAvH,EACA,aAAcvB,EAAS,aACvB,wBAAyB6I,EACzB,yBAA0BE,CAC5B,EACA,KAAM,CACJ,GAAGjB,EACH,cAAe,mBACjB,CACF,CAAC,CACH,EAEA,KAAQ,WAA0C,MAAOJ,GAAS,CAChE,KAAM,CAAE,GAAArG,EAAI,MAAAjC,EAAO,OAAA8D,EAAQ,qBAAA0E,EAAsB,WAAAd,EAAY,QAAA1D,CAAQ,EAAIsE,EACnEzC,EAAU2D,EAAAA,oBAAoBvH,EAAI6B,CAAM,EAC9C,IAAIvD,EACJ,MAAMmE,EAAaV,GAAW,OAAQ,QAAgB,QAAY,IAElE,GAAI,CACF,MAAM2E,EAAWjE,EAAauC,EAAAA,UAAY2B,EAAAA,OAC1CrI,EAAU,MAAM,KAAK,OAAO,KAAK,OAAO,OAAOP,EAAO6F,EAAS,CAC7D,GAAI6B,GAAc,CAAA,EAClB,SAAAiB,CACF,CAAC,CACH,OAASvI,EAAO,CAEd,MAAA,MAAM,KAAK,QAAA,EACX,KAAK,OAAO,OAAO,MAAM,kDAAkDJ,CAAK,SAAS,EACnFI,CACR,CACA,IAAIwJ,EACAnB,EACJ,GAAI,CACFmB,EAAS,MAAM,KAAK,OAAO,KAAK,QAAQ,IAAI5J,EAAOiC,CAAE,EACrD,MAAM2B,EAAUgG,EAAO,QACvB,GAAI,CACFnB,EAAM,KAAK,aAAaxG,EAAI2B,EAAQ,OAAQE,CAAM,CACpD,OAAS1D,EAAO,CACd,KAAK,OAAO,OAAO,KACjB,0CAA2CA,GAAiB,OAAO,EACrE,CACF,CACF,OAASA,EAAO,CACd,WAAK,OAAO,OAAO,MAAM,+BAA+BJ,CAAK,KAAKiC,CAAE,UAAU,EACxE7B,CACR,CAEA,GAAIsE,EAAY,CACd,MAAMuE,EAAc/B,EAAAA,eAAelD,EAAShE,EAAOO,CAAO,EAC1D,MAAO,OAAe,QAAQ,QAAQ0I,EAAa,KAAK,OAAO,IAAI,CACrE,KAAO,CACL,MAAMV,EAASqB,EAAO,QAAQ,OACxBZ,EAAOpL,EAAgB2K,CAAM,EAAE,IAErCS,EAAK,IAAM,CACT,GAAGP,EACH,cAAexG,CACjB,EAEIuG,GACFQ,EAAK,SAAW,CACd,GAAGA,EAAK,SACR,qBAAsB,EACxB,EACA,MAAM,KAAK,OAAO,KAAK,QAAQ,QAAQhJ,EAAOO,EAASyI,CAAI,GAE3D,KAAK,OAAO,KAAK,QACd,QAAQhJ,EAAOO,EAASyI,CAAI,EAC5B,MAAO5I,GAAU,KAAK,OAAO,OAAO,MAAMA,CAAK,CAAC,CAEvD,CAEA,MAAM,KAAK,OAAO,KAAK,QAAQ,QAAQyF,CAAO,CAChD,EAEA,KAAQ,UAAwC,MAAOzG,GAAW,CAChE,KAAM,CAAE,GAAA6C,EAAI,MAAAjC,EAAO,MAAAI,EAAO,WAAAsH,EAAY,QAAAmC,EAAS,QAAA7F,CAAQ,EAAI5E,EACrDyG,EAAUiE,EAAAA,mBAAmB7H,EAAI7B,CAAK,EAC5C,IAAIG,EACJ,MAAMmE,EAAaV,GAAW,OAAQ,QAAgB,QAAY,IAClE,GAAI,CACF,MAAM2E,EAAWjE,EAAauC,EAAAA,UAAY2B,EAAAA,OAC1CrI,EAAU,MAAM,KAAK,OAAO,KAAK,OAAO,OAAOP,EAAO6F,EAAS,CAC7D,GAAI6B,GAAc,CAAA,EAClB,SAAAiB,CACF,CAAC,CACH,OAASvI,EAAO,CACd,MAAA,MAAM,KAAK,QAAA,EACX,KAAK,OAAO,OAAO,MAAM,iDAAiDJ,CAAK,SAAS,EAClFI,CACR,CACA,IAAIwJ,EACJ,GAAI,CACFA,EAAS,MAAM,KAAK,OAAO,KAAK,QAAQ,IAAI5J,EAAOiC,CAAE,CACvD,OAAS7B,EAAO,CACd,WAAK,OAAO,OAAO,MAAM,8BAA8BJ,CAAK,KAAKiC,CAAE,UAAU,EACvE7B,CACR,CAEA,GAAIsE,EAAY,CACd,MAAMuE,EAAc/B,iBAAelD,EAAShE,EAAOO,CAAO,EAC1D,MAAO,OAAe,QAAQ,QAAQ0I,EAAa,KAAK,OAAO,IAAI,CACrE,KAAO,CACL,MAAMV,EAASqB,EAAO,QAAQ,OACxBZ,EAAOa,GAAWjM,EAAgB2K,CAAM,EAAE,IAEhD,KAAK,OAAO,KAAK,QAAQ,QAAQvI,EAAOO,EAASyI,CAAI,CACvD,CAEA,MAAM,KAAK,OAAO,KAAK,QAAQ,QAAQnD,CAAO,CAChD,EAEA,KAAQ,QAAoC,SAAY,CACtD,MAAMkE,EAA0B,CAAA,EAC1BC,EAAwB,CAAA,EAC9B,KAAK,OAAO,QAAQ,SAAS,QAAS3H,GAAY,CAChD,IAAI4H,EAAY,GACZC,EAAAA,UAAU7H,EAAQ,MAAM,IAAG4H,EAAY,IACtC,KAAK,OAAO,KAAK,OAAO,SAAS,IAAI5H,EAAQ,KAAK,IAAG4H,EAAY,IAClEA,GAAWF,EAAc,KAAK1H,EAAQ,KAAK,CACjD,CAAC,EACD,KAAK,OAAO,SAAS,OAAA,EAAS,QAASzB,GAAa,CAC9CsJ,EAAAA,UAAUtJ,EAAS,eAAe,GAAGoJ,EAAY,KAAKpJ,EAAS,EAAE,CACvE,CAAC,EACD,MAAM,QAAQ,IAAI,CAChB,GAAGmJ,EAAc,IAAK/J,GAAU,KAAK,cAAc,CAAE,MAAAA,CAAM,CAAC,CAAC,EAC7D,GAAGgK,EAAY,IAAK/H,GAAO,KAAK,eAAeA,CAAE,CAAC,CACpD,CAAC,CACH,EAqBA,KAAQ,uBAAyB,MAAOa,GAAqC,CAEvE,CAAC,KAAK,aAAe,KAAK,kBAAkB,OAAS,EACvD,KAAK,kBAAkB,KAAKA,CAAK,EAEjC,MAAM,KAAK,eAAeA,CAAK,CAEnC,EA0CA,KAAQ,oBAA4D,MAAOA,GAAU,CACnF,KAAK,aAAa,MAAM,KAAKA,CAAK,EAClC,MAAM,KAAK,sBACb,EAEA,KAAQ,qBAAuB,SAAY,CACzC,GAAI,KAAK,aAAa,QAAU7E,EAAoB,OAAQ,CAC1D,KAAK,OAAO,OAAO,KAAK,2CAA2C,EACnE,MACF,CAMA,IAJA,KAAK,OAAO,OAAO,KACjB,+BAA+B,KAAK,aAAa,MAAM,MAAM,WAC/D,EAEO,KAAK,aAAa,MAAM,OAAS,GAAG,CACzC,KAAK,aAAa,MAAQA,EAAoB,OAC9C,MAAM2F,EAAU,KAAK,aAAa,MAAM,MAAA,EACxC,GAAKA,EAEL,GAAI,CACF,MAAM,KAAK,eAAeA,CAAO,CACnC,OAASxD,EAAO,CACd,KAAK,OAAO,OAAO,KAAKA,CAAK,CAC/B,CACF,CACA,KAAK,aAAa,MAAQnC,EAAoB,IAChD,EAEA,KAAQ,eAAuD,MAAO6E,GAAU,CAC9E,KAAM,CAAE,MAAA9C,EAAO,QAAA6F,EAAS,YAAAgD,EAAa,cAAA3F,EAAe,YAAAiH,CAAY,EAAIrH,EAE9DsH,EAAYvE,EAAQ,OAE1B,GAAI,MAAK,2BAA2B,CAAE,MAAA7F,EAAO,cAAeoK,CAAU,CAAC,EAIvE,OAAQA,EAAAA,CACN,IAAK,oBACH,OAAO,MAAM,KAAK,wBAAwB,CAAE,MAAApK,EAAO,QAAA6F,EAAS,YAAAgD,EAAa,YAAAsB,CAAY,CAAC,EACxF,IAAK,mBACH,OAAO,MAAM,KAAK,uBAAuBnK,EAAO6F,CAAO,EACzD,IAAK,mBACH,OAAO,MAAM,KAAK,uBAAuB7F,EAAO6F,CAAO,EACzD,IAAK,mBACH,OAAO,MAAM,KAAK,uBAAuB7F,EAAO6F,CAAO,EACzD,IAAK,iBACH,OAAO,MAAM,KAAK,qBAAqB7F,EAAO6F,CAAO,EACvD,IAAK,mBACH,OAAO,MAAM,KAAK,uBAAuB7F,EAAO6F,CAAO,EACzD,IAAK,oBACH,OAAO,MAAM,KAAK,iBAAiB,CACjC,MAAA7F,EACA,QAAA6F,EACA,YAAAgD,EACA,YAAAsB,EACA,cAAAjH,CACF,CAAC,EACH,IAAK,kBACH,OAAO,MAAM,KAAK,sBAAsBlD,EAAO6F,CAAO,EACxD,IAAK,yBACH,OAAO,MAAM,KAAK,6BAA6B,CAC7C,MAAA7F,EACA,QAAA6F,EACA,YAAAgD,EACA,YAAAsB,EACA,cAAAjH,CACF,CAAC,EACH,QACE,OAAO,KAAK,OAAO,OAAO,KAAK,8BAA8BkH,CAAS,EAAE,CAC5E,CACF,EAEA,KAAQ,qBAA8D,MAAOtH,GAAU,CACrF,KAAM,CAAE,MAAA9C,EAAO,QAAA6F,EAAS,cAAA3C,CAAc,EAAIJ,EAEpCuH,GADS,MAAM,KAAK,OAAO,KAAK,QAAQ,IAAIrK,EAAO6F,EAAQ,EAAE,GAC1C,QAAQ,OAEjC,OAAQwE,GACN,IAAK,oBACH,OAAO,KAAK,yBAAyBrK,EAAO6F,EAAS3C,CAAa,EACpE,IAAK,mBACH,OAAO,KAAK,wBAAwBlD,EAAO6F,CAAO,EACpD,IAAK,mBACH,OAAO,KAAK,wBAAwB7F,EAAO6F,CAAO,EACpD,IAAK,mBACH,OAAO,KAAK,wBAAwB7F,EAAO6F,CAAO,EACpD,IAAK,iBACH,OAAO,KAAK,sBAAsB7F,EAAO6F,CAAO,EAClD,IAAK,oBACH,OAAO,KAAK,yBAAyB7F,EAAO6F,CAAO,EACrD,IAAK,yBACH,OAAO,KAAK,8BAA8B7F,EAAO6F,CAAO,EAC1D,QACE,OAAO,KAAK,OAAO,OAAO,KAAK,+BAA+BwE,CAAS,EAAE,CAC7E,CACF,EAEA,KAAQ,2BAA2EvH,GAAU,CAC3F,KAAM,CAAE,MAAA9C,CAAM,EAAI8C,EACZ,CAAE,QAAAvC,CAAQ,EAAIC,EAAAA,iBAClB,qBACA,4BAA4BR,CAAK,2DACnC,EACA,MAAM,IAAI,MAAMO,CAAO,CACzB,EAEA,KAAQ,2BAA2EnB,GAAW,CAC5F,KAAM,CAAE,MAAAY,EAAO,cAAAsK,CAAc,EAAIlL,EAC3BmL,EAAkB,KAAK,yBAAyB,IAAIvK,CAAK,EAG/D,MADI,CAACuK,GACDA,EAAgB,SAASD,CAAa,EAAU,GAMhD,CAAA,EAAAC,EAAgB,SAAS,wBAAwB,GAC/C,KAAK,OAAO,OAAO,cAAc,sBAAsB,EAAI,EAKnE,EAIA,KAAQ,wBAAoE,MAAOjC,GAAS,CAC1F,KAAM,CAAE,MAAAtI,EAAO,QAAA6F,EAAS,YAAAgD,EAAa,YAAAsB,CAAY,EAAI7B,EAC/C,CAAE,OAAAlJ,EAAQ,GAAA6C,CAAG,EAAI4D,EACvB,GAAI,CACF,MAAM/C,EAAQ,KAAK,OAAO,KAAK,YAAY,SAAS,CAAE,MAAA9C,CAAM,CAAC,EAEzD,KAAK,OAAO,OAAO,cAAc,kBAAkB,IAAM,IAC3D,QAAQ,KAAK,wCAAwC,EACrD8C,GAAO,SAAS0H,EAAAA,4BAA4B,2BAA2B,GAGzE,KAAK,eAAe,CAAE,GAAG3E,EAAQ,MAAO,CAAC,EACzC,MAAMnF,EACJtB,EAAO,iBAAmBuB,EAAAA,WAAW/C,EAAgB,kBAAkB,IAAI,GAAG,EAC1EgD,EAAiC,CACrC,GAAAqB,EACA,aAAcjC,EACd,gBAAAU,EACA,YAAAmI,EACA,YAAAsB,EACA,GAAG/K,CACL,EACA,MAAM,KAAK,YAAY6C,EAAIrB,CAAQ,EAEnC,MAAMyH,EAAgB,MAAM,KAAK,iBAAiB,CAChD,cAAeQ,EACf,KAAME,EAAAA,YAAY,KAAK,UAAUlD,CAAO,CAAC,EACzC,YAAAsE,EACA,SAAUvJ,EAAS,SAAS,QAC9B,CAAC,EAEDkC,GAAO,SAAS2H,8BAA4B,qBAAqB,EAEjE,KAAK,OAAO,OAAO,KAAK,mBAAoB,CAAE,GAAAxI,EAAI,OAAQrB,EAAU,cAAAyH,CAAc,CAAC,CACrF,OAASqC,EAAU,CACjB,MAAM,KAAK,UAAU,CACnB,GAAAzI,EACA,MAAAjC,EACA,MAAO0K,EACP,QAAS9M,EAAgB,kBAAkB,UAC7C,CAAC,EACD,KAAK,OAAO,OAAO,MAAM8M,CAAG,CAC9B,CACF,EAEA,KAAQ,yBAAsE,MAC5E1K,EACA6F,EACA3C,IACG,CACH,KAAM,CAAE,GAAAjB,CAAG,EAAI4D,EAEf,GAAIvB,EAAAA,gBAAgBuB,CAAO,EAAG,CAC5B,KAAM,CAAE,OAAA/B,CAAO,EAAI+B,EACnB,KAAK,OAAO,OAAO,MAAM,CAAE,KAAM,SAAU,OAAQ,2BAA4B,OAAA/B,CAAO,CAAC,EACvF,MAAMlD,EAAW,KAAK,OAAO,SAAS,IAAIqB,CAAE,EAC5C,KAAK,OAAO,OAAO,MAAM,CAAE,KAAM,SAAU,OAAQ,2BAA4B,SAAArB,CAAS,CAAC,EACzF,MAAMmC,EAAgBnC,EAAS,SAAS,UACxC,KAAK,OAAO,OAAO,MAAM,CACvB,KAAM,SACN,OAAQ,2BACR,cAAAmC,CACF,CAAC,EACD,MAAMC,EAAgBc,EAAO,mBAC7B,KAAK,OAAO,OAAO,MAAM,CACvB,KAAM,SACN,OAAQ,2BACR,cAAAd,CACF,CAAC,EACD,MAAMb,EAAe,MAAM,KAAK,OAAO,KAAK,OAAO,kBACjDY,EACAC,CACF,EACA,KAAK,gBAAgB,IAAIf,EAAI,CAC3B,aAAAE,EACA,aAAcnC,EACd,WAAYiC,EACZ,UAAWc,CACb,CAAC,EAED,MAAM4H,EAAiB,MAAM,KAAK,OAAO,KAAK,QAAQ,UAAUxI,EAAc,CAC5E,cAAAe,CACF,CAAC,EACD,KAAK,OAAO,OAAO,MAAM,CACvB,KAAM,SACN,OAAQ,2BACR,eAAAyH,CACF,CAAC,EACD,MAAM,KAAK,OAAO,KAAK,QAAQ,SAAS,CAAE,MAAA3K,CAAM,CAAC,CACnD,SAAWuE,EAAAA,eAAesB,CAAO,EAAG,CAClC,MAAM,KAAK,eAAe5D,CAAE,EAC5B,MAAM2I,EAASjJ,EAAAA,YAAY,kBAAmBM,CAAE,EAEhD,GADkB,KAAK,OAAO,cAAc2I,CAAM,IAChC,EAChB,MAAM,IAAI,MAAM,YAAYA,CAAM,6BAA6B,EAEjE,KAAK,OAAO,KAAKA,EAAQ,CAAE,MAAO/E,EAAQ,KAAM,CAAC,CACnD,CACF,EAEA,KAAQ,uBAAkE,MACxE7F,EACA6F,IACG,CACH,KAAM,CAAE,GAAA5D,EAAI,OAAA7C,CAAO,EAAIyG,EACvB,GAAI,CACF,KAAK,4BAA4BzG,CAAM,EACvC,KAAM,CACJ,MAAAyL,EACA,WAAAC,EACA,OAAA/K,EACA,WAAA2C,EACA,kBAAAhD,EACA,iBAAAC,EACA,cAAAgD,EACA,0BAAAC,CACF,EAAIiD,EAAQ,OACN3D,EAAiB,CAAC,GAAG,KAAK,gBAAgB,OAAA,CAAQ,EAAE,KACvD6I,GAAMA,EAAE,eAAiB/K,CAC5B,EAEA,GAAI,CAACkC,EACH,OAAO,KAAK,OAAO,OAAO,MAAM,uCAAuClC,CAAK,EAAE,EAGhF,MAAMY,EAAW,KAAK,OAAO,SAAS,IAAIsB,EAAe,UAAU,EAE7DG,EAA+B,CACnC,MAAArC,EACA,MAAA6K,EACA,OAAA9K,EACA,WAAA2C,EACA,aAAc,GACd,aAAcR,EAAe,aAC7B,mBAAoBtB,EAAS,mBAC7B,mBAAoBA,EAAS,mBAC7B,WAAYkK,EAAW,UACvB,KAAM,CACJ,UAAW5I,EAAe,UAC1B,SAAU,KAAK,OAAO,QACxB,EACA,KAAM,CACJ,UAAW4I,EAAW,UACtB,SAAUA,EAAW,QACvB,EACA,GAAIpL,GAAqB,CAAE,kBAAAA,CAAkB,EAC7C,GAAIC,GAAoB,CAAE,iBAAAA,CAAiB,EAC3C,GAAIgD,GAAiB,CAAE,cAAAA,CAAc,EACrC,cAAeQ,EAAAA,gBAAgB,MAC/B,eAAgBP,GAA2B,eAC3C,gBAAiBA,GAA2B,SAC9C,EAEA,MAAM,KAAK,OAAO,QAAQ,IAAIP,EAAQ,MAAOA,CAAO,EACpD,MAAM,KAAK,UAAUA,EAAQ,MAAOA,EAAQ,MAAM,EAElD,MAAM,KAAK,OAAO,KAAK,QAAQ,eAAe,CAC5C,MAAOH,EAAe,aACtB,SAAUG,EAAQ,KAAK,QACzB,CAAC,EAED,KAAK,gBAAgB,OAAOH,EAAe,UAAU,EACrD,KAAK,eAAeA,EAAe,WAAY,EAAK,EACpD,KAAK,yBAAyBG,CAAO,EAErC,MAAM,KAAK,WAA+B,CACxC,GAAIwD,EAAQ,GACZ,MAAA7F,EACA,qBAAsB,GACtB,OAAQ,EACV,CAAC,EAED,KAAK,OAAO,OAAO,KAAK,kBAAmB,CAAE,QAAAqC,CAAQ,CAAC,EACtD,KAAK,OAAO,KAAKV,EAAAA,YAAY,kBAAmBO,EAAe,UAAU,EAAG,CAAE,QAAAG,CAAQ,CAAC,CACzF,OAASqI,EAAU,CACjB,MAAM,KAAK,UAAU,CACnB,GAAAzI,EACA,MAAAjC,EACA,MAAO0K,CACT,CAAC,EACD,KAAK,OAAO,OAAO,MAAMA,CAAG,CAC9B,CACF,EAEA,KAAQ,wBAAoE,MAC1E1K,EACA6F,IACG,CACH,KAAM,CAAE,GAAA5D,CAAG,EAAI4D,EACXvB,EAAAA,gBAAgBuB,CAAO,GACzB,MAAM,KAAK,OAAO,QAAQ,OAAO7F,EAAO,CAAE,aAAc,EAAK,CAAC,EAC9D,KAAK,OAAO,KAAK2B,EAAAA,YAAY,kBAAmBM,CAAE,EAAG,EAAE,GAC9CsC,EAAAA,eAAesB,CAAO,IAC/B,MAAM,KAAK,cAAc,CAAE,MAAA7F,EAAO,UAAW,EAAM,CAAC,EACpD,KAAK,OAAO,KAAK2B,EAAAA,YAAY,kBAAmBM,CAAE,EAAG,CAAE,MAAO4D,EAAQ,KAAM,CAAC,EAEjF,EAEA,KAAQ,uBAAkE,MACxE7F,EACA6F,IACG,CACH,KAAM,CAAE,OAAAzG,EAAQ,GAAA6C,CAAG,EAAI4D,EACvB,GAAI,CACF,MAAMmF,EAAY,GAAGhL,CAAK,kBAGpBiL,EAAsBC,EAAAA,YAAY,IAAYF,CAAS,EAE7D,GAAIC,GAAuB,KAAK,mBAAmBA,EAAqBhJ,CAAE,EAAG,CAC3E,KAAK,OAAO,OAAO,KAAK,oCAAoCA,CAAE,EAAE,EAChE,KAAK,UAAU,CAAE,GAAAA,EAAI,MAAAjC,EAAO,MAAOoD,EAAAA,YAAY,wBAAwB,CAAE,CAAC,EAC1E,MACF,CACA,KAAK,cAAc,CAAE,MAAApD,EAAO,GAAGZ,CAAO,CAAC,EACvC,GAAI,CACF8L,EAAAA,YAAY,IAAIF,EAAW/I,CAAE,EAC7B,MAAM,KAAK,OAAO,QAAQ,OAAOjC,EAAO,CAAE,WAAYZ,EAAO,UAAW,CAAC,EACzE,MAAM,KAAK,WAA+B,CACxC,GAAA6C,EACA,MAAAjC,EACA,OAAQ,EACV,CAAC,CACH,OAASoC,EAAG,CACV,MAAA8I,cAAY,OAAOF,CAAS,EACtB5I,CACR,CAEA,KAAK,OAAO,OAAO,KAAK,iBAAkB,CAAE,GAAAH,EAAI,MAAAjC,EAAO,OAAAZ,CAAO,CAAC,CACjE,OAASsL,EAAU,CACjB,MAAM,KAAK,UAAU,CACnB,GAAAzI,EACA,MAAAjC,EACA,MAAO0K,CACT,CAAC,EACD,KAAK,OAAO,OAAO,MAAMA,CAAG,CAC9B,CACF,EAIA,KAAQ,mBAAqB,CAACS,EAAgBC,IACrCA,EAAU,SAAA,EAAW,MAAM,EAAG,EAAE,EAAID,EAAO,WAAW,MAAM,EAAG,EAAE,EAG1E,KAAQ,wBAAoE,CAACE,EAAQxF,IAAY,CAC/F,KAAM,CAAE,GAAA5D,CAAG,EAAI4D,EACT+E,EAASjJ,EAAAA,YAAY,iBAAkBM,CAAE,EAE/C,GADkB,KAAK,OAAO,cAAc2I,CAAM,IAChC,EAChB,MAAM,IAAI,MAAM,YAAYA,CAAM,wBAAwB,EAExDtG,EAAAA,gBAAgBuB,CAAO,EACzB,KAAK,OAAO,KAAKlE,EAAAA,YAAY,iBAAkBM,CAAE,EAAG,CAAA,CAAE,EAC7CsC,EAAAA,eAAesB,CAAO,GAC/B,KAAK,OAAO,KAAKlE,cAAY,iBAAkBM,CAAE,EAAG,CAAE,MAAO4D,EAAQ,KAAM,CAAC,CAEhF,EAEA,KAAQ,uBAAkE,MACxE7F,EACA6F,IACG,CACH,KAAM,CAAE,GAAA5D,CAAG,EAAI4D,EACf,GAAI,CACF,KAAK,cAAc,CAAE,MAAA7F,CAAM,CAAC,EAC5B,MAAM,KAAK,UAAUA,EAAOW,EAAAA,WAAWlD,CAAc,CAAC,EACtD,MAAM,KAAK,WAA+B,CACxC,GAAAwE,EACA,MAAAjC,EACA,OAAQ,EACV,CAAC,EACD,KAAK,OAAO,OAAO,KAAK,iBAAkB,CAAE,GAAAiC,EAAI,MAAAjC,CAAM,CAAC,CACzD,OAAS0K,EAAU,CACjB,MAAM,KAAK,UAAU,CACnB,GAAAzI,EACA,MAAAjC,EACA,MAAO0K,CACT,CAAC,EACD,KAAK,OAAO,OAAO,MAAMA,CAAG,CAC9B,CACF,EAEA,KAAQ,wBAAoE,CAACW,EAAQxF,IAAY,CAC/F,KAAM,CAAE,GAAA5D,CAAG,EAAI4D,EACT+E,EAASjJ,EAAAA,YAAY,iBAAkBM,CAAE,EAE/C,GADkB,KAAK,OAAO,cAAc2I,CAAM,IAChC,EAChB,MAAM,IAAI,MAAM,YAAYA,CAAM,wBAAwB,EAExDtG,EAAAA,gBAAgBuB,CAAO,EACzB,KAAK,OAAO,KAAKlE,EAAAA,YAAY,iBAAkBM,CAAE,EAAG,CAAA,CAAE,EAC7CsC,EAAAA,eAAesB,CAAO,GAC/B,KAAK,OAAO,KAAKlE,cAAY,iBAAkBM,CAAE,EAAG,CAAE,MAAO4D,EAAQ,KAAM,CAAC,CAEhF,EAEA,KAAQ,qBAA8D,MAAO7F,EAAO6F,IAAY,CAC9F,KAAM,CAAE,GAAA5D,CAAG,EAAI4D,EACf,GAAI,CACF,KAAK,YAAY,CAAE,MAAA7F,CAAM,CAAC,EAC1B,MAAM,KAAK,WAA6B,CACtC,GAAAiC,EACA,MAAAjC,EACA,OAAQ,GACR,qBAAsB,EACxB,CAAC,EACD,KAAK,OAAO,OAAO,KAAK,eAAgB,CAAE,GAAAiC,EAAI,MAAAjC,CAAM,CAAC,CACvD,OAAS0K,EAAU,CACjB,MAAM,KAAK,UAAU,CACnB,GAAAzI,EACA,MAAAjC,EACA,MAAO0K,CACT,CAAC,EACD,KAAK,OAAO,OAAO,MAAMA,CAAG,CAC9B,CACF,EAEA,KAAQ,sBAAgE,CAACW,EAAQxF,IAAY,CAC3F,KAAM,CAAE,GAAA5D,CAAG,EAAI4D,EACT+E,EAASjJ,EAAAA,YAAY,eAAgBM,CAAE,EAI7C,WAAW,IAAM,CAEf,GADkB,KAAK,OAAO,cAAc2I,CAAM,IAChC,EAChB,MAAM,IAAI,MAAM,YAAYA,CAAM,6BAA6B,EAG7DtG,EAAAA,gBAAgBuB,CAAO,EACzB,KAAK,OAAO,KAAKlE,EAAAA,YAAY,eAAgBM,CAAE,EAAG,CAAA,CAAE,EAC3CsC,EAAAA,eAAesB,CAAO,GAC/B,KAAK,OAAO,KAAKlE,EAAAA,YAAY,eAAgBM,CAAE,EAAG,CAAE,MAAO4D,EAAQ,KAAM,CAAC,CAE9E,EAAG,GAAG,CACR,EAEA,KAAQ,uBAAkE,MACxE7F,EACA6F,IACG,CACH,KAAM,CAAE,GAAA5D,CAAG,EAAI4D,EACf,GAAI,CACF,MAAM,KAAK,kBAAkB,CAAE,MAAA7F,EAAO,OAAQ6F,EAAQ,MAAO,CAAC,EAC9D,KAAK,mCAAmC,CAAE,MAAA7F,EAAO,MAAOoD,EAAAA,YAAY,mBAAmB,CAAE,CAAC,EAC1F,MAAM,KAAK,cAAc,CAAE,MAAApD,EAAO,GAAAiC,CAAG,CAAC,CACxC,OAASyI,EAAU,CACjB,KAAK,OAAO,OAAO,MAAMA,CAAG,CAC9B,CACF,EAEA,KAAQ,iBAAsD,MAAOpC,GAAS,CAC5E,KAAM,CAAE,MAAAtI,EAAO,QAAA6F,EAAS,YAAAgD,EAAa,YAAAsB,EAAa,cAAAjH,CAAc,EAAIoF,EAC9D,CAAE,GAAArG,EAAI,OAAA7C,CAAO,EAAIyG,EACvB,GAAI,CACF,MAAM,KAAK,eAAe,CAAE,MAAA7F,EAAO,GAAGZ,CAAO,CAAC,EAC9C,MAAMiD,EAAU,KAAK,OAAO,QAAQ,IAAIrC,CAAK,EACvCqI,EAAgB,MAAM,KAAK,iBAAiB,CAChD,cAAeQ,EACf,KAAME,cAAY,KAAK,UAAUhC,EAAAA,qBAAqB,oBAAqB3H,EAAQ6C,CAAE,CAAC,CAAC,EACvF,YAAAkI,EACA,SAAU9H,EAAQ,KAAK,SACvB,cAAAa,CACF,CAAC,EACKU,EAAU,CACd,GAAA3B,EACA,MAAAjC,EACA,OAAAZ,EACA,cAAAiJ,CACF,EACA,MAAM,KAAK,yBAAyBzE,CAAO,EAGzCV,IAAkBC,EAAAA,gBAAgB,WAClCd,EAAQ,KAAK,SAAS,UAAU,WAGhC,KAAK,OAAO,KAAK,wBAAwBA,EAAQ,KAAK,SAAS,UAAU,SAAS,EAKhF,KAAK,OAAO,YAAY,oBAC1B,KAAK,mBAAmBuB,CAAO,GAE/B,KAAK,uCAAuCA,CAAO,EACnD,KAAK,2BAAA,EAET,OAAS8G,EAAU,CACjB,MAAM,KAAK,UAAU,CACnB,GAAAzI,EACA,MAAAjC,EACA,MAAO0K,CACT,CAAC,EACD,KAAK,OAAO,OAAO,MAAMA,CAAG,CAC9B,CACF,EAEA,KAAQ,yBAAsE,CAC5EW,EACAxF,IACG,CACH,KAAM,CAAE,GAAA5D,CAAG,EAAI4D,EACT+E,EAASjJ,EAAAA,YAAY,kBAAmBM,CAAE,EAEhD,GADkB,KAAK,OAAO,cAAc2I,CAAM,IAChC,EAChB,MAAM,IAAI,MAAM,YAAYA,CAAM,wBAAwB,EAExDtG,EAAAA,gBAAgBuB,CAAO,EACzB,KAAK,OAAO,KAAKlE,EAAAA,YAAY,kBAAmBM,CAAE,EAAG,CAAE,OAAQ4D,EAAQ,MAAO,CAAC,EACtEtB,EAAAA,eAAesB,CAAO,GAC/B,KAAK,OAAO,KAAKlE,EAAAA,YAAY,kBAAmBM,CAAE,EAAG,CAAE,MAAO4D,EAAQ,KAAM,CAAC,CAEjF,EAEA,KAAQ,sBAAgE,MACtE7F,EACA6F,IACG,CACH,KAAM,CAAE,GAAA5D,EAAI,OAAA7C,CAAO,EAAIyG,EACvB,GAAI,CAGF,MAAMmF,EAAY,GAAGhL,CAAK,kBAAkBZ,EAAO,MAAM,IAAI,GAGvD6L,EAAsBC,EAAAA,YAAY,IAAYF,CAAS,EAC7D,GAAIC,GAAuB,KAAK,mBAAmBA,EAAqBhJ,CAAE,EAAG,CAC3E,KAAK,OAAO,OAAO,KAAK,oCAAoCA,CAAE,EAAE,EAChE,MACF,CAEA,KAAK,YAAY,CAAE,MAAAjC,EAAO,GAAGZ,CAAO,CAAC,EACrC,KAAK,OAAO,OAAO,KAAK,gBAAiB,CAAE,GAAA6C,EAAI,MAAAjC,EAAO,OAAAZ,CAAO,CAAC,EAC9D8L,EAAAA,YAAY,IAAIF,EAAW/I,CAAE,CAC/B,OAASyI,EAAU,CACjB,MAAM,KAAK,UAAU,CACnB,GAAAzI,EACA,MAAAjC,EACA,MAAO0K,CACT,CAAC,EACD,KAAK,OAAO,OAAO,MAAMA,CAAG,CAC9B,CACF,EAEA,KAAQ,8BAAgF,CACtF1K,EACA6F,IACG,CACH,KAAM,CAAE,GAAA5D,CAAG,EAAI4D,EACf,KAAK,OAAO,OAAO,MAAM,CACvB,KAAM,SACN,OAAQ,gCACR,MAAA7F,EACA,QAAA6F,CACF,CAAC,EACGvB,EAAAA,gBAAgBuB,CAAO,EACzB,KAAK,OAAO,KAAKlE,EAAAA,YAAY,kBAAmBM,CAAE,EAAG,CAAE,OAAQ4D,EAAQ,MAAO,CAAC,EACtEtB,EAAAA,eAAesB,CAAO,GAC/B,KAAK,OAAO,KAAKlE,EAAAA,YAAY,kBAAmBM,CAAE,EAAG,CAAE,MAAO4D,EAAQ,KAAM,CAAC,CAEjF,EAEA,KAAQ,6BAA8E,MACpFyC,GACG,CACH,KAAM,CAAE,MAAAtI,EAAO,QAAA6F,EAAS,YAAAgD,EAAa,YAAAsB,EAAa,cAAAjH,CAAc,EAAIoF,EACpE,GAAI,CACF,KAAM,CAAE,UAAAgD,EAAW,YAAAC,EAAa,gBAAA7K,CAAgB,EAAImF,EAAQ,OACtDwC,EAAgB,MAAM,KAAK,iBAAiB,CAChD,cAAeQ,EACf,KAAME,EAAAA,YAAY,KAAK,UAAUlD,CAAO,CAAC,EACzC,YAAAsE,EACA,SAAUmB,EAAU,SACpB,cAAApI,CACF,CAAC,EACKqE,EAAiB,CACrB,UAAA+D,EACA,aAActL,EACd,GAAI6F,EAAQ,GACZ,YAAA0F,EACA,cAAAlD,EACA,gBAAA3H,CACF,EACA,MAAM,KAAK,eAAemF,EAAQ,GAAI,CACpC,QAAS0B,EACT,aAAcvH,EACd,cAAAkD,CACF,CAAC,EAEGA,IAAkBC,EAAAA,gBAAgB,WAAamI,EAAU,SAAS,UAAU,WAE9E,KAAK,OAAO,KAAK,wBAAwBA,EAAU,SAAS,SAAS,SAAS,EAGhF,KAAK,OAAO,OAAO,KAAK,uBAAwB,CAC9C,MAAAtL,EACA,OAAQ6F,EAAQ,OAChB,GAAIA,EAAQ,GACZ,cAAAwC,CACF,CAAC,CACH,OAASqC,EAAU,CACjB,KAAK,OAAO,OAAO,MAAMA,CAAG,EAE5B,MAAMlD,EAAoB3B,EAAQ,OAAO,UAAU,UAC7C4B,EAAkB,MAAM,KAAK,OAAO,KAAK,OAAO,kBAChDzD,EAAU,KAAK,oBAAoB6B,EAAQ,OAAO,UAAU,SAAU3C,CAAa,EAEnFwE,EAAa,CACjB,KAAMC,EAAAA,OACN,kBAAAH,EACA,gBAAAC,CACF,EACA,MAAM,KAAK,UAAU,CACnB,GAAI5B,EAAQ,GACZ,MAAA7F,EACA,MAAO0K,EACP,WAAAhD,EACA,QAAS9J,EAAgB,uBAAuB,WAChD,QAAAoG,CACF,CAAC,CACH,CACF,EAQA,KAAQ,uCAA0CJ,GAAwC,CACxF,KAAK,oBAAoB,MAAM,KAAKA,CAAO,CAC7C,EAEA,KAAQ,qBAAwBxE,GAAsC,CACpE,KAAK,4BAA4BA,EAAO,SAAS,GAAI,CAAE,QAAS,YAAa,KAAM,CAAE,CAAC,EAEtF,WAAW,IAAM,CACf,KAAK,oBAAoB,MAAQnB,EAAoB,KACrD,KAAK,2BAAA,CACP,EAAGkB,EAAAA,cAAc,KAAK,iBAAiB,CAAC,CAC1C,EAGA,KAAQ,mCAAqC,CAAC,CAC5C,MAAAa,EACA,MAAAI,CACF,IAGM,CACJ,MAAMoL,EAAkB,KAAK,OAAO,KAAK,QAAQ,QAC7CA,EAAgB,OAAS,GACRA,EAAgB,OAChCpD,GAAMA,EAAE,QAAUpI,GAASoI,EAAE,QAAQ,SAAW,mBACnD,EACW,QAASA,GAAM,CAExB,KAAK,OAAO,KAAKzG,EAAAA,YAAY,kBAAmByG,EAAE,QAAQ,EAAE,EAAG,CAC7D,MAAAhI,CACF,CAAC,CACH,CAAC,CAEL,EAEA,KAAQ,2BAA6B,IAAM,CACzC,GAAI,KAAK,oBAAoB,QAAUnC,EAAoB,OAAQ,CACjE,KAAK,OAAO,OAAO,KAAK,0CAA0C,EAClE,MACF,CAEA,MAAM2F,EAAU,KAAK,oBAAoB,MAAM,CAAC,EAChD,GAAI,CAACA,EAAS,CACZ,KAAK,OAAO,OAAO,KAAK,iCAAiC,EACzD,MACF,CAEA,GAAI,CACF,KAAK,mBAAmBA,CAAO,CACjC,OAASxD,EAAO,CACd,KAAK,OAAO,OAAO,MAAMA,CAAK,CAChC,CACF,EASA,KAAQ,mBAAsBwD,GAAwC,CACpE,GAAI,KAAK,uBAAuB,IAAIA,EAAQ,EAAE,EAAG,CAC/C,KAAK,OAAO,OAAO,KACjB,CACE,GAAIA,EAAQ,EACd,EACA,0EAA0EA,EAAQ,EAAE,EACtF,EACA,MACF,CACA,KAAK,oBAAoB,MAAQ3F,EAAoB,OACrD,KAAK,uBAAuB,IAAI2F,EAAQ,EAAE,EAC1C,KAAK,OAAO,OAAO,KAAK,kBAAmBA,CAAO,CACpD,EA2BA,KAAQ,kBAAoB,GAgB5B,KAAQ,6BAA+B,SAAY,CACjD,MAAM6H,EAAmB,KAAK,OAAO,KAAK,QAAQ,WAAW,OAC7D,GAAIA,EAAiB,SAAW,EAAG,OAEnC,MAAM1B,EAAgB,IAAI,IAAI,KAAK,OAAO,QAAQ,IAAI,EAChD2B,EAAgB,IAAI,IAAI,KAAK,OAAO,KAAK,QAAQ,SAAS,IAAI,EAC9DC,EAAuB,IAAI,IAC/B,CAAC,GAAG,KAAK,gBAAgB,OAAA,CAAQ,EAAE,IAAKZ,GAAMA,EAAE,YAAY,CAC9D,EAEA,IAAIa,EACJ,GAAI,KAAK,OAAO,KAAK,SAAS,KAAK,SAAShN,CAAoB,EAAG,CACjE,KAAM,CAAE,cAAAmG,CAAc,EAAI,KAAK,OAAO,KAAK,SAAS,IAAInG,CAAoB,EAC5EgN,EAAoB7G,CACtB,CAEA,UAAW/E,KAASyL,EAClB,GAAI,CAAA1B,EAAc,IAAI/J,CAAK,GACvB,CAAA0L,EAAc,IAAI1L,CAAK,GACvB,CAAA2L,EAAqB,IAAI3L,CAAK,GAC9BA,IAAU4L,EAEd,MAAK,OAAO,OAAO,KAAK,0CAA0C5L,CAAK,EAAE,EACzE,GAAI,CACF,MAAM,KAAK,OAAO,KAAK,QAAQ,WAAW,YAAYA,CAAK,CAC7D,OAASI,EAAO,CACd,KAAK,OAAO,OAAO,KAAKA,EAAO,6CAA6CJ,CAAK,EAAE,CACrF,CAAA,CAEJ,EAiBA,KAAQ,iBAAoBG,GAAiC,CAI3D,GAHIA,EAAQ,SACV,KAAK,yBAAyB,IAAIA,EAAQ,MAAOA,EAAQ,OAAO,EAE9DA,EAAQ,OAAQ,OAEpB,MAAMS,EADY,KAAK,OAAO,SAAS,OAAA,EACZ,KAAMoH,GAAMA,EAAE,eAAiB7H,EAAQ,KAAK,EAClES,GACL,KAAK,wBAAwB,CAC3B,MAAOT,EAAQ,MACf,QAAS4G,EAAAA,qBACP,oBACA,CACE,GAAGnG,EACH,mBAAoBA,EAAS,mBAC7B,mBAAoBA,EAAS,mBAC7B,OAAQA,EAAS,OACjB,SAAUA,EAAS,SACnB,kBAAmBA,EAAS,kBAC5B,iBAAkBA,EAAS,gBAC7B,EACAA,EAAS,EACX,EACA,YAAaA,EAAS,YACtB,YAAaA,EAAS,WACxB,CAAC,CACH,EAmGA,KAAQ,eAAkD,MAAOxB,GAAW,CAC1E,GAAI,CAACyM,EAAAA,cAAczM,CAAM,EAAG,CAC1B,KAAM,CAAE,QAAAmB,CAAQ,EAAIC,EAAAA,iBAClB,qBACA,qBAAqB,KAAK,UAAUpB,CAAM,CAAC,EAC7C,EACA,MAAM,IAAI,MAAMmB,CAAO,CACzB,CACA,KAAM,CACJ,aAAAhB,EACA,mBAAAC,EACA,mBAAAC,EACA,kBAAAC,EACA,iBAAAC,EACA,OAAAC,CACF,EAAIR,EAGJ,GAFK0M,EAAAA,YAAYvM,CAAY,GAAG,MAAM,KAAK,oBAAoBA,CAAY,EAEvE,CAACwM,EAAAA,cAAcnM,EAAQ,EAAI,EAAG,CAChC,KAAM,CAAE,QAAAW,CAAQ,EAAIC,EAAAA,iBAAiB,qBAAsB,qBAAqBZ,CAAM,EAAE,EACxF,MAAM,IAAI,MAAMW,CAAO,CACzB,CAGA,GACEf,GACA,CAACsM,EAAAA,YAAYtM,CAAkB,GAC/BwM,EAAAA,cAAcxM,CAAkB,IAAM,EACtC,CACA,MAAMyM,EACJ,yFAEE,CAAC,QAAS,QAAS,QAAQ,EAAE,SAAS,KAAK,OAAO,OAAO,KAAK,EAChE,QAAQ,KAAKA,CAAO,EAEpB,KAAK,OAAO,OAAO,KAAKA,CAAO,EAEjC,KAAK,mBAAmBzM,EAAoB,oBAAoB,CAClE,CAgBA,GAZEC,GACA,CAACqM,EAAAA,YAAYrM,CAAkB,GAC/BuM,EAAAA,cAAcvM,CAAkB,IAAM,GAEtC,KAAK,mBAAmBA,EAAoB,oBAAoB,EAI9DC,GAAqB,CAACoM,EAAAA,YAAYpM,CAAiB,GACrD,KAAK,qBAAqBA,EAAmB,mBAAmB,EAG9DC,GAAoB,CAACmM,EAAAA,YAAYnM,CAAgB,EAAG,CACtD,KAAK,qBAAqBA,EAAkB,kBAAkB,EAE9D,MAAMuM,EAAsB,OAAO,KAAK1M,GAAsB,CAAA,CAAE,EAAE,OAChE,OAAO,KAAKC,GAAsB,EAAE,CACtC,EAKA,GAAI,CAHqB,OAAO,KAAKE,CAAgB,EAEtB,MAAOwM,GAAOD,EAAoB,SAASC,EAAG,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,EAEzF,MAAM,IAAI,MACR,iFAAiF,KAAK,UACpFxM,CACF,CAAC,mCAAmC,KAAK,UAAUuM,CAAmB,CAAC,EACzE,CAEJ,CACF,EAEA,KAAQ,mBAAqB,CAC3BxJ,EACArB,IACG,CACH,MAAM+K,EAA+BC,EAAAA,0BAA0B3J,EAAY,YAAarB,CAAI,EAC5F,GAAI+K,EAA8B,MAAM,IAAI,MAAMA,EAA6B,OAAO,CACxF,EAEA,KAAQ,eAAkD,MAAOhN,GAAW,CAC1E,GAAI,CAACyM,EAAAA,cAAczM,CAAM,EACvB,MAAM,IAAI,MACRoB,EAAAA,iBAAiB,qBAAsB,qBAAqBpB,CAAM,EAAE,EAAE,OACxE,EACF,KAAM,CAAE,GAAA6C,EAAI,WAAAS,EAAY,cAAAD,EAAe,kBAAA/C,EAAmB,iBAAAC,CAAiB,EAAIP,EAE/E,KAAK,qBAAqB6C,CAAE,EAC5B,MAAM,KAAK,kBAAkBA,CAAE,EAC/B,MAAMrB,EAAW,KAAK,OAAO,SAAS,IAAIqB,CAAE,EACtCqK,EAAuBC,EAAAA,kBAAkB7J,EAAY,WAAW,EACtE,GAAI4J,EAAsB,MAAM,IAAI,MAAMA,EAAqB,OAAO,EACtE,MAAME,EAA4BC,EAAAA,uBAChC7L,EAAS,mBACT8B,EACA,WACF,EACA,GAAI8J,EAA2B,MAAM,IAAI,MAAMA,EAA0B,OAAO,EAChF,GAAI,CAACE,EAAAA,cAAcjK,EAAe,EAAI,EAAG,CACvC,KAAM,CAAE,QAAAlC,CAAQ,EAAIC,EAAAA,iBAClB,qBACA,4BAA4BiC,CAAa,EAC3C,EACA,MAAM,IAAI,MAAMlC,CAAO,CACzB,CAMA,GAJIb,GAAqB,CAACoM,EAAAA,YAAYpM,CAAiB,GACrD,KAAK,qBAAqBA,EAAmB,mBAAmB,EAG9DC,GAAoB,CAACmM,cAAYnM,CAAgB,EAAG,CACtD,KAAK,qBAAqBA,EAAkB,kBAAkB,EAE9D,MAAMgN,EAAqB,IAAI,IAAI,OAAO,KAAKjK,CAAU,CAAC,EAM1D,GAAI,CALqB,OAAO,KAAK/C,CAAgB,EAItB,MAAOwM,GAAOQ,EAAmB,IAAIR,EAAG,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,EAEnF,MAAM,IAAI,MACR,wEAAwE,KAAK,UAC3ExM,CACF,CAAC,0BAA0B,MAAM,KAAKgN,CAAkB,EAAE,KAAK,IAAI,CAAC,EACtE,CAEJ,CACF,EAEA,KAAQ,cAAgD,MAAOvN,GAAW,CACxE,GAAI,CAACyM,EAAAA,cAAczM,CAAM,EAAG,CAC1B,KAAM,CAAE,QAAAmB,CAAQ,EAAIC,EAAAA,iBAAiB,qBAAsB,oBAAoBpB,CAAM,EAAE,EACvF,MAAM,IAAI,MAAMmB,CAAO,CACzB,CACA,KAAM,CAAE,GAAA0B,EAAI,OAAAoB,CAAO,EAAIjE,EAGvB,GAFA,KAAK,qBAAqB6C,CAAE,EAC5B,MAAM,KAAK,kBAAkBA,CAAE,EAC3B,CAAC2K,EAAAA,mBAAmBvJ,CAAM,EAAG,CAC/B,KAAM,CAAE,QAAA9C,CAAQ,EAAIC,EAAAA,iBAClB,qBACA,oBAAoB,KAAK,UAAU6C,CAAM,CAAC,EAC5C,EACA,MAAM,IAAI,MAAM9C,CAAO,CACzB,CACF,EAEA,KAAQ,4BAA6EnB,GAAW,CAC9F,GAAI,CAACyM,EAAAA,cAAczM,CAAM,EAAG,CAC1B,KAAM,CAAE,QAAAmB,CAAQ,EAAIC,EAAAA,iBAClB,qBACA,oCAAoCpB,CAAM,EAC5C,EACA,MAAM,IAAI,MAAMmB,CAAO,CACzB,CACA,KAAM,CAAE,MAAAsK,EAAO,WAAAC,EAAY,WAAApI,EAAY,OAAA3C,CAAO,EAAIX,EAClD,GAAI,CAACyN,EAAAA,aAAahC,CAAK,EAAG,CACxB,KAAM,CAAE,QAAAtK,CAAQ,EAAIC,EAAAA,iBAClB,qBACA,4DACF,EACA,MAAM,IAAI,MAAMD,CAAO,CACzB,CACA,MAAMuM,EAAuBC,EAAAA,kBAAkBjC,EAAY,0BAA0B,EACrF,GAAIgC,EAAsB,MAAM,IAAI,MAAMA,EAAqB,OAAO,EACtE,MAAMR,EAAuBC,EAAAA,kBAAkB7J,EAAY,0BAA0B,EACrF,GAAI4J,EAAsB,MAAM,IAAI,MAAMA,EAAqB,OAAO,EACtE,GAAIpC,EAAAA,UAAUnK,CAAM,EAAG,CACrB,KAAM,CAAE,QAAAQ,CAAQ,EAAIC,EAAAA,iBAAiB,UAAW,0BAA0B,EAC1E,MAAM,IAAI,MAAMD,CAAO,CACzB,CACF,EAEA,KAAQ,cAAgD,MAAOnB,GAAW,CACxE,GAAI,CAACyM,EAAAA,cAAczM,CAAM,EAAG,CAC1B,KAAM,CAAE,QAAAmB,CAAQ,EAAIC,EAAAA,iBAAiB,qBAAsB,oBAAoBpB,CAAM,EAAE,EACvF,MAAM,IAAI,MAAMmB,CAAO,CACzB,CACA,KAAM,CAAE,MAAAP,EAAO,WAAA0C,CAAW,EAAItD,EAE9B,KAAK,qBAAqBY,CAAK,EAC/B,MAAM,KAAK,oBAAoBA,CAAK,EACpC,MAAMqC,EAAU,KAAK,OAAO,QAAQ,IAAIrC,CAAK,EACvCsM,EAAuBC,EAAAA,kBAAkB7J,EAAY,UAAU,EACrE,GAAI4J,EAAsB,MAAM,IAAI,MAAMA,EAAqB,OAAO,EACtE,MAAME,EAA4BC,EAAAA,uBAChCpK,EAAQ,mBACRK,EACA,UACF,EACA,GAAI8J,EAA2B,MAAM,IAAI,MAAMA,EAA0B,OAAO,CAElF,EAEA,KAAQ,cAAgD,MAAOpN,GAAW,CACxE,GAAI,CAACyM,EAAAA,cAAczM,CAAM,EAAG,CAC1B,KAAM,CAAE,QAAAmB,CAAQ,EAAIC,EAAAA,iBAAiB,qBAAsB,oBAAoBpB,CAAM,EAAE,EACvF,MAAM,IAAI,MAAMmB,CAAO,CACzB,CACA,KAAM,CAAE,MAAAP,CAAM,EAAIZ,EAElB,KAAK,qBAAqBY,CAAK,EAC/B,MAAM,KAAK,oBAAoBA,CAAK,CACtC,EAEA,KAAQ,eAAkD,MAAOZ,GAAW,CAC1E,GAAI,CAACyM,EAAAA,cAAczM,CAAM,EAAG,CAC1B,KAAM,CAAE,QAAAmB,CAAQ,EAAIC,EAAAA,iBAAiB,qBAAsB,qBAAqBpB,CAAM,EAAE,EACxF,MAAM,IAAI,MAAMmB,CAAO,CACzB,CACA,KAAM,CAAE,MAAAP,EAAO,QAAA4D,EAAS,QAAAD,EAAS,OAAA5D,CAAO,EAAIX,EAC5C,KAAK,qBAAqBY,CAAK,EAC/B,MAAM,KAAK,oBAAoBA,CAAK,EACpC,KAAM,CAAE,WAAA0C,CAAW,EAAI,KAAK,OAAO,QAAQ,IAAI1C,CAAK,EACpD,GAAI,CAACgN,EAAAA,yBAAyBtK,EAAYiB,CAAO,EAAG,CAClD,KAAM,CAAE,QAAApD,CAAQ,EAAIC,EAAAA,iBAAiB,qBAAsB,sBAAsBmD,CAAO,EAAE,EAC1F,MAAM,IAAI,MAAMpD,CAAO,CACzB,CACA,GAAI,CAAC0M,EAAAA,eAAerJ,CAAO,EAAG,CAC5B,KAAM,CAAE,QAAArD,CAAQ,EAAIC,EAAAA,iBAClB,qBACA,aAAa,KAAK,UAAUoD,CAAO,CAAC,EACtC,EACA,MAAM,IAAI,MAAMrD,CAAO,CACzB,CACA,GAAI,CAAC2M,2BAAyBxK,EAAYiB,EAASC,EAAQ,MAAM,EAAG,CAClE,KAAM,CAAE,QAAArD,CAAQ,EAAIC,EAAAA,iBAClB,qBACA,qBAAqBoD,EAAQ,MAAM,EACrC,EACA,MAAM,IAAI,MAAMrD,CAAO,CACzB,CACA,KAAK,sBAAsBR,CAAM,CACnC,EAYA,KAAQ,eAAkD,MAAOX,GAAW,CAC1E,GAAI,CAACyM,EAAAA,cAAczM,CAAM,EAAG,CAC1B,KAAM,CAAE,QAAAmB,CAAQ,EAAIC,EAAAA,iBAAiB,qBAAsB,qBAAqBpB,CAAM,EAAE,EACxF,MAAM,IAAI,MAAMmB,CAAO,CACzB,CACA,KAAM,CAAE,MAAAP,EAAO,SAAAqE,CAAS,EAAIjF,EAE5B,GAAI,CAEF,MAAM,KAAK,oBAAoBY,CAAK,CACtC,OAASI,EAAO,CACd,MAAIhB,GAAQ,UAAU,IAAI,KAAK,qBAAqBA,CAAM,EACpDgB,CACR,CACA,GAAI,CAAC+M,EAAAA,gBAAgB9I,CAAQ,EAAG,CAC9B,KAAM,CAAE,QAAA9D,CAAQ,EAAIC,EAAAA,iBAClB,qBACA,uBAAuB,KAAK,UAAU6D,CAAQ,CAAC,EACjD,EACA,MAAM,IAAI,MAAM9D,CAAO,CACzB,CAEA,MAAMqD,EAAU,KAAK,OAAO,eAAe,IAAIS,EAAS,EAAE,EAE1D,GAAIT,EAAQ,QAAU5D,EAAO,CAC3B,KAAM,CAAE,QAAAO,CAAQ,EAAIC,EAAAA,iBAClB,mBACA,2CAA2C6D,EAAS,EAAE,qBAAqBT,EAAQ,KAAK,qBAAqB5D,CAAK,EACpH,EACA,MAAM,IAAI,MAAMO,CAAO,CACzB,CACF,EAEA,KAAQ,YAA4C,MAAOnB,GAAW,CACpE,GAAI,CAACyM,EAAAA,cAAczM,CAAM,EAAG,CAC1B,KAAM,CAAE,QAAAmB,CAAQ,EAAIC,EAAAA,iBAAiB,qBAAsB,kBAAkBpB,CAAM,EAAE,EACrF,MAAM,IAAI,MAAMmB,CAAO,CACzB,CACA,KAAM,CAAE,MAAAP,CAAM,EAAIZ,EAClB,MAAM,KAAK,6BAA6BY,CAAK,CAC/C,EAEA,KAAQ,YAA4C,MAAOZ,GAAW,CACpE,GAAI,CAACyM,EAAAA,cAAczM,CAAM,EAAG,CAC1B,KAAM,CAAE,QAAAmB,CAAQ,EAAIC,EAAAA,iBAAiB,qBAAsB,kBAAkBpB,CAAM,EAAE,EACrF,MAAM,IAAI,MAAMmB,CAAO,CACzB,CACA,KAAM,CAAE,MAAAP,EAAO,MAAA8C,EAAO,QAAAa,CAAQ,EAAIvE,EAClC,MAAM,KAAK,oBAAoBY,CAAK,EACpC,KAAM,CAAE,WAAA0C,CAAW,EAAI,KAAK,OAAO,QAAQ,IAAI1C,CAAK,EACpD,GAAI,CAACgN,EAAAA,yBAAyBtK,EAAYiB,CAAO,EAAG,CAClD,KAAM,CAAE,QAAApD,CAAQ,EAAIC,EAAAA,iBAAiB,qBAAsB,mBAAmBmD,CAAO,EAAE,EACvF,MAAM,IAAI,MAAMpD,CAAO,CACzB,CACA,GAAI,CAAC6M,EAAAA,aAAatK,CAAK,EAAG,CACxB,KAAM,CAAE,QAAAvC,CAAQ,EAAIC,EAAAA,iBAClB,qBACA,iBAAiB,KAAK,UAAUsC,CAAK,CAAC,EACxC,EACA,MAAM,IAAI,MAAMvC,CAAO,CACzB,CACA,GAAI,CAAC8M,EAAAA,uBAAuB3K,EAAYiB,EAASb,EAAM,IAAI,EAAG,CAC5D,KAAM,CAAE,QAAAvC,CAAQ,EAAIC,EAAAA,iBAClB,qBACA,iBAAiB,KAAK,UAAUsC,CAAK,CAAC,EACxC,EACA,MAAM,IAAI,MAAMvC,CAAO,CACzB,CACF,EAEA,KAAQ,kBAAwD,MAAOnB,GAAW,CAChF,GAAI,CAACyM,EAAAA,cAAczM,CAAM,EAAG,CAC1B,KAAM,CAAE,QAAAmB,CAAQ,EAAIC,EAAAA,iBAAiB,qBAAsB,wBAAwBpB,CAAM,EAAE,EAC3F,MAAM,IAAI,MAAMmB,CAAO,CACzB,CACA,KAAM,CAAE,MAAAP,CAAM,EAAIZ,EAClB,MAAM,KAAK,6BAA6BY,CAAK,CAC/C,EAEA,KAAQ,oBAAuBZ,GAAgD,CAC7E,KAAM,CAAE,OAAA6B,EAAQ,IAAAhB,EAAK,OAAAe,EAAQ,MAAAE,CAAM,EAAI9B,EAGvC,GAAI,CAAC,MAAM,QAAQ6B,CAAM,GAAKA,EAAO,SAAW,EAC9C,MAAM,IAAI,MAAM,kDAAkD,EAEpE,GAAI,CAACyL,EAAAA,cAAczM,EAAK,EAAK,EAC3B,MAAM,IAAI,MAAM,2BAA2B,EAE7C,GAAI,CAACyM,gBAAc1L,EAAQ,EAAK,EAC9B,MAAM,IAAI,MAAM,8BAA8B,EAEhD,GAAI,CAAC0L,EAAAA,cAAcxL,EAAO,EAAK,EAC7B,MAAM,IAAI,MAAM,6BAA6B,EAK/C,GADyB,CAAC,GAAG,IAAI,IAAID,EAAO,IAAK2F,GAAU1B,EAAAA,aAAa0B,CAAK,EAAE,SAAS,CAAC,CAAC,EACrE,OAAS,EAC5B,MAAM,IAAI,MACR,mFACF,EAGF,KAAM,CAAE,UAAA3B,CAAU,EAAIC,EAAAA,aAAajE,EAAO,CAAC,CAAC,EAC5C,GAAIgE,IAAc,SAChB,MAAM,IAAI,MACR,6GACF,CAEJ,EAEA,KAAQ,iBAAmB,MAAO7F,GAM5B,CACJ,KAAM,CAAE,cAAAgK,EAAe,KAAAkE,EAAM,YAAAnD,EAAa,SAAAoD,EAAU,cAAArK,CAAc,EAAI9D,EAChEoO,EAA0B,CAC9B,SAAU,CACR,UAAWD,EAAS,WAAaE,gBACjC,WAAY,UACZ,OAAQF,EAAS,KAAO,EAC1B,CACF,EAEA,GAAI,CACF,GAAIrK,IAAkBC,EAAAA,gBAAgB,UAAW,CAC/C,MAAMuK,EAAU,KAAK,oBAAoBH,EAAUrK,CAAa,EAChE,OAAAsK,EAAQ,SAAS,WACfE,GAAW,IAAI,IAAIA,CAAO,EAAE,SAAW,IAAI,IAAIH,EAAS,GAAG,EAAE,OAAS,QAAU,UAC3EC,CACT,CACA,MAAM1J,EAAS,MAAM,KAAK,OAAO,KAAK,OAAO,QAAQ,CACnD,cAAAsF,EACA,KAAAkE,EACA,YAAAnD,EACA,UAAWoD,EAAS,SACtB,CAAC,EACGzJ,IACF0J,EAAQ,SAAS,OAAS1J,EAAO,OACjC0J,EAAQ,SAAS,OAAS1J,EAAO,OACjC0J,EAAQ,SAAS,WACf1J,EAAO,SAAW,IAAI,IAAIyJ,EAAS,GAAG,EAAE,OAAS,QAAU,UAEjE,OAASnL,EAAG,CACV,KAAK,OAAO,OAAO,KAAKA,CAAC,CAC3B,CAEA,OAAA,KAAK,OAAO,OAAO,MAAM,mBAAmB,KAAK,UAAUoL,CAAO,CAAC,EAAE,EAC9DA,CACT,EAEA,KAAQ,qBAAuB,CAACG,EAA2CtM,IAAiB,CAC1F,OAAO,OAAOsM,CAAU,EAAE,QAAQ,CAACC,EAAUC,IAAU,CACrD,GAAID,GAAa,KAAgC,CAC/C,KAAM,CAAE,QAAArN,CAAQ,EAAIC,EAAAA,iBAClB,qBACA,GAAGa,CAAI,2DAA2DuM,CAAQ,YACxE,OAAO,KAAKD,CAAU,EAAEE,CAAK,CAC/B,EACF,EACA,MAAM,IAAI,MAAMtN,CAAO,CACzB,CACF,CAAC,CACH,EAEA,KAAQ,sBAAyB0B,GAAe,CAC9C,MAAM2B,EAAU,KAAK,OAAO,KAAK,SAAS,IAAI3B,CAAE,EAChD,OAAO,OAAO2B,GAAY,SAAWA,EAAU,MACjD,EAEA,KAAQ,qBAAuB,CAC7B3B,EACAZ,IACG,CAGH,GAFA,KAAK,mBAAmB,IAAIY,EAAIZ,CAAI,EAEhC,KAAK,mBAAmB,MAAQ,KAAK,qBAAsB,CAC7D,IAAIyM,EAAI,EACR,MAAMC,EAAmB,KAAK,qBAAuB,EACrD,UAAWC,KAAK,KAAK,mBAAmB,KAAA,EAAQ,CAC9C,GAAIF,KAAOC,EACT,MAEF,KAAK,mBAAmB,OAAOC,CAAC,CAClC,CACF,CACF,EAEA,KAAQ,qBAAwB/L,GAAwB,CACtD,MAAMgM,EAAgB,KAAK,mBAAmB,IAAIhM,CAAE,EACpD,GAAIgM,EAAe,CACjB,KAAM,CAAE,QAAA1N,CAAQ,EAAIC,EAAAA,iBAClB,qBACA,iCAAiCyN,CAAa,KAAKhM,CAAE,EACvD,EACA,MAAM,IAAI,MAAM1B,CAAO,CACzB,CACF,EAEA,KAAQ,kBAAoB,CAC1B2N,EACAhL,IAEI,CAACgL,GAAgBhL,IAAkBC,kBAAgB,UAAkB,GAGvE,KAAK,OAAO,UAAU,UAAU,WAAa,IAC7C,KAAK,OAAO,UAAU,UAAU,YAAc,QAC9C,KAAK,OAAO,UAAU,UAAU,YAAc,IAC9C+K,GAAc,UAAU,YAAc,QACtCA,GAAc,UAAU,YAAc,IACtCA,GAAc,UAAU,WAAa,IACrC,KAAK,OAAO,KAAK,sBAAsB,SAASA,EAAa,SAAS,SAAS,GAC/E,OAAQ,QAAgB,QAAY,IAIxC,KAAQ,oBAAsB,CAC5BA,EACAhL,IAEO,KAAK,kBAAkBgL,EAAchL,CAAa,EACrDgL,GAAc,UAAU,UACxB,OAGN,KAAQ,sBAAwB,CAAC,CAAE,IAAAC,CAAI,IAAuB,CAC5D,GAAI,CAACA,GAAO,CAACA,EAAI,SAAS,OAAO,GAAK,CAACA,EAAI,SAAS,OAAO,EAAG,OAE9D,MAAMnO,EAAQoO,EAAAA,sBAAsBD,EAAK,OAAO,GAAK,GAC/C5N,EAAU,mBAAmB6N,EAAAA,sBAAsBD,EAAK,OAAO,GAAK,EAAE,EAEtEE,EAAgB,KAAK,OAAO,QAAQ,KAAK,SAASrO,CAAK,EAEzDqO,GACF,KAAK,OAAO,QAAQ,OAAOrO,EAAO,CAAE,cAAemD,EAAAA,gBAAgB,SAAU,CAAC,EAGhF,KAAK,OAAO,KAAK,iBAAiB,CAAE,MAAAnD,EAAO,QAAAO,EAAS,cAAA8N,CAAc,CAAC,CACrE,EAEA,KAAQ,0BAA4B,SAAY,CAC9C,GAAIC,EAAAA,UAAAA,GAAgBC,EAAAA,cAAAA,GAAmB,KAAK,OAAO,SAAS,UAAU,SAAW,CAC/E,MAAMC,EAAW,QAAgB,QAEjC,GAAI,OAAOA,EAAY,IAAa,CAElCA,EAAQ,iBAAiB,MAAO,KAAK,sBAAuB,KAAK,OAAO,IAAI,EAG5E,MAAMC,EAAa,MAAMD,EAAQ,cAAA,EAC7BC,GAEF,WAAW,IAAM,CACf,KAAK,sBAAsB,CAAE,IAAKA,CAAW,CAAC,CAChD,EAAG,EAAE,CAET,CACF,CACF,EAEA,KAAQ,oBAAuBpM,GAAiC,CAC9D,GAAI,CACF,MAAM+D,EAAiBsI,EAAAA,oBAAoBrM,EAAQ,UAAU,EACvD2D,EAAkB2I,EAAAA,qBAAqBtM,EAAQ,UAAU,EACzDuM,EAAiBC,EAAAA,oBAAoBxM,EAAQ,UAAU,EACvD3C,EAAoB2C,EAAQ,kBAC5B1C,EAAmB0C,EAAQ,iBACjC,MAAO,CACL,eAAA+D,EACA,gBAAAJ,EACA,eAAA4I,EACA,kBAAAlP,EACA,iBAAAC,CACF,CACF,OAAS,EAAG,CACV,OAAA,KAAK,OAAO,OAAO,KAAK,EAAG,kCAAkC,EACtD,CAAA,CACT,CACF,EAEA,KAAQ,aAAe,CACrBsC,EACA7C,EACA0E,IACG,CAEH,GAAI,CAAC1E,EAAO,SAAS,OACnB,MAAO,CAAA,EAGT,MAAMqJ,EAAyB,CAC7B,cAAexG,EACf,WAAY,CAAC7C,EAAO,QAAQ,MAAM,EAClC,QAASA,EAAO,OAClB,EACA,GAAI,CACF,MAAM0P,EAAW,KAAK,0BAA0B1P,EAAO,QAAS0E,CAAM,EACtE2E,EAAI,SAAWqG,EACfrG,EAAI,kBAAoB,KAAK,oBAAoBrJ,EAAO,QAAQ,MAAM,EAClE,CAACA,EAAO,QAAQ,SAAS,CAAC,GAAG,EAAE,EAC/B,CAAA,CACN,OAASgD,EAAG,CACV,KAAK,OAAO,OAAO,KAAKA,EAAG,0BAA0B,CACvD,CACA,OAAOqG,CACT,EAEA,KAAQ,oBAAuBrJ,GAAgB,CAC7C,GAAI,CAACA,EAAQ,SACb,GAAI,CACF,MAAM2P,EAAO3P,GAAQ,MAAQA,IAAS,CAAC,GAAG,KAE1C,GAAI,CAAC2P,EAAK,WAAW,IAAI,EAAG,MAAO,GAEnC,MAAMC,EAAUD,EAAK,MAAM,CAAC,EAC5B,MAAK,iBAAiB,KAAKC,CAAO,EAE3BA,EAAQ,OAAS,IAAM,EAFc,EAG9C,MAAY,CAAC,CACb,QACF,EAEA,KAAQ,0BAA4B,CAClCpL,EACAE,IACa,CACb,GAAI,CACF,GAAI,CAACA,EAAQ,MAAO,CAAA,EAEpB,MAAMyE,EAAS3E,EAAQ,OACjBqL,EAAe/Q,GAAYqK,CAAkC,EAEnE,GAAIA,IAAW,sBACb,MAAO,CAAC2G,EAAAA,aAAapL,EAAO,gBAAgB,CAAC,EAG/C,GAAIyE,IAAW,uBACb,MAAO,CAAC4G,EAAAA,0CAA0CrL,CAAM,CAAC,EAG3D,GAAIyE,IAAW,wBACb,OAAOzE,EAAO,IAAKsL,GAAYD,EAAAA,0CAA0CC,CAAE,CAAC,EAG9E,GAAI7G,IAAW,2BAA6BA,IAAW,uBACrD,MAAO,CAACzE,EAAO,SAAS,IAAI,EAG9B,GAAIyE,IAAW,2BACb,MAAO,CACL8G,EAAAA,yBAAyB,CACvB,YAAazL,EAAQ,OAAO,mBAC5B,UAAWE,EAAO,SACpB,CAAC,CACH,EAGF,GAAIyE,IAAW,eACb,OAAO+G,EAAAA,aAAaxL,CAAM,EACtBA,EAAO,IAAKsL,GAAYG,2BAAyBH,CAAE,CAAC,EACpD,CAACG,EAAAA,yBAAyBzL,CAAM,CAAC,EAGvC,GAAIyE,IAAW,oBACb,MAAO,CAACiH,EAAAA,kBAAkB1L,CAAM,CAAC,EAGnC,GAAIyE,IAAW,mBACb,OAAOkH,EAAAA,yBAAyB3L,CAAM,EAIxC,GAAI,OAAOA,GAAW,SACpB,MAAO,CAACA,CAAM,EAIhB,MAAM4L,EAAmB5L,EAAOmL,EAAa,GAAG,EAGhD,GAAIK,EAAAA,aAAaI,CAAM,EACrB,OAAInH,IAAW,6BACNmH,EAAO,IAAKpC,GAASqC,EAAAA,2BAA2BrC,CAAI,CAAC,EAGvDoC,EAGF,GAAI,OAAOA,GAAW,SAC3B,MAAO,CAACA,CAAM,CAElB,OAAStN,EAAG,CACV,KAAK,OAAO,OAAO,KAAKA,EAAG,wCAAwC,CACrE,CACA,MAAO,CAAA,CACT,CAh0GA,CAqBA,MAAc,6BAA8B,CAC1C,GAAI,CACF,MAAMwN,EAAS,KAAK,OAAO,QAAQ,KAC7BC,EAAkB,KAAK,OAAO,KAAK,QAAQ,SAAS,cAAcD,CAAM,EAC9E,SAAW,CAAC5P,EAAO8P,CAAQ,IAAK,OAAO,QAAQD,CAAe,EAC5D,UAAWtP,KAAWuP,EACpB,GAAI,CACF,MAAM,KAAK,uBAAuB,CAChC,MAAA9P,EACA,QAAAO,EACA,YAAa,KAAK,IAAA,CACpB,CAAC,CACH,MAAgB,CACd,KAAK,OAAO,OAAO,KACjB,qDAAqDP,CAAK,cAAcO,CAAO,EACjF,CACF,CAGN,OAASH,EAAO,CACd,KAAK,OAAO,OAAO,KAAKA,EAAO,oCAAoC,CACrE,CACF,CAupDQ,eAAgB,CACtB,GAAI,CAAC,KAAK,YAAa,CACrB,KAAM,CAAE,QAAAG,CAAQ,EAAIC,EAAAA,iBAAiB,kBAAmB,KAAK,IAAI,EACjE,MAAM,IAAI,MAAMD,CAAO,CACzB,CACF,CAEA,MAAc,2BAA4B,CACxC,MAAM,KAAK,OAAO,KAAK,QAAQ,0BAAA,CACjC,CAIQ,uBAAwB,CAC9B,KAAK,OAAO,KAAK,QAAQ,GAAGwP,EAAAA,eAAe,QAAUjN,GAAqC,CACxF,KAAK,uBAAuBA,CAAK,CACnC,CAAC,CACH,CAWA,MAAc,eAAeA,EAAkC,CAC7D,KAAM,CAAE,MAAA9C,EAAO,QAAAO,EAAS,YAAAsI,EAAa,cAAA3F,CAAc,EAAIJ,EAGjD,CAAE,UAAArC,CAAU,EAAI,KAAK,OAAO,KAAK,SAAS,KAAK,SAAS7B,CAAoB,EAC9E,KAAK,OAAO,KAAK,SAAS,IAAIA,CAAoB,EACjD,CAA4B,UAAW,MAAU,EAEtD,GAAI,CACF,MAAMiH,EAAU,MAAM,KAAK,OAAO,KAAK,OAAO,OAAO7F,EAAOO,EAAS,CACnE,kBAAmBE,EACnB,SAAUyC,IAAkBC,EAAAA,gBAAgB,UAAY8D,EAAAA,UAAY2B,EAAAA,MACtE,CAAC,EAEGoH,EAAAA,iBAAiBnK,CAAO,GAC1B,KAAK,OAAO,KAAK,QAAQ,IAAI7F,EAAO6F,CAAO,EAC3C,MAAM,KAAK,oBAAoB,CAC7B,MAAA7F,EACA,QAAA6F,EACA,YAAAgD,EACA,cAAA3F,EACA,YAAa6F,EAAAA,YAAYxI,CAAO,CAClC,CAAC,GACQ0P,EAAAA,kBAAkBpK,CAAO,GAClC,MAAM,KAAK,OAAO,KAAK,QAAQ,QAAQA,CAAO,EAC9C,MAAM,KAAK,qBAAqB,CAAE,MAAA7F,EAAO,QAAA6F,EAAS,cAAA3C,CAAc,CAAC,EACjE,KAAK,OAAO,KAAK,QAAQ,OAAOlD,EAAO6F,EAAQ,EAAE,IAEjD,KAAK,OAAO,OAAO,MAAM,wCAAwC,KAAK,UAAUA,CAAO,CAAC,EAAE,EAC1F,MAAM,KAAK,2BAA2B,CAAE,MAAA7F,EAAO,QAAA6F,EAAS,cAAA3C,CAAc,CAAC,GAEzE,MAAM,KAAK,OAAO,KAAK,QAAQ,SAAS,IAAIlD,EAAOO,CAAO,CAC5D,OAASH,EAAO,CACd,KAAK,OAAO,OAAO,MACjB,6DAA6DG,CAAO,EACtE,EACA,KAAK,OAAO,OAAO,MAAMH,CAAK,CAChC,CACF,CAouBQ,uBAAwB,CAC9B,KAAK,OAAO,KAAK,QAAQ,GAAG8P,EAAAA,eAAe,QAAS,MAAOpN,GAAmC,CAC5F,KAAM,CAAE,MAAA9C,EAAO,GAAAiC,CAAG,EAAIkO,EAAAA,mBAAmBrN,EAAM,MAAM,EACrD,GAAIb,GAAM,KAAK,OAAO,eAAe,KAAK,SAASA,CAAE,EACnD,OAAO,MAAM,KAAK,4BAA4BA,EAAIzB,EAAAA,iBAAiB,SAAS,EAAG,EAAI,EAErF,GAAIyB,GAAM,KAAK,OAAO,KAAK,SAAS,KAAK,SAASA,CAAE,EAClD,OAAO,MAAM,KAAK,yBAAyBA,EAAIzB,EAAAA,iBAAiB,SAAS,EAAG,EAAI,EAG9ER,EACE,KAAK,OAAO,QAAQ,KAAK,SAASA,CAAK,IACzC,MAAM,KAAK,cAAc,CAAE,MAAAA,EAAO,kBAAmB,EAAK,CAAC,EAC3D,KAAK,OAAO,OAAO,KAAK,iBAAkB,CAAE,MAAAA,CAAM,CAAC,GAE5CiC,IACT,MAAM,KAAK,eAAeA,EAAI,EAAI,EAClC,KAAK,OAAO,OAAO,KAAK,kBAAmB,CAAE,GAAAA,CAAG,CAAC,EAErD,CAAC,CACH,CAKQ,6BAA8B,CACpC,KAAK,OAAO,KAAK,UAAU,GAAG,kBAAmB,SAAY,CAC3D,GAAI,CAAA,KAAK,kBACT,CAAA,KAAK,kBAAoB,GACzB,GAAI,CACF,MAAM,KAAK,8BACb,OAAS7B,EAAO,CACd,KAAK,OAAO,OAAO,KAAKA,CAAK,CAC/B,SACE,KAAK,kBAAoB,EAC3B,CAAA,CACF,CAAC,CACH,CAkCQ,uBAAwB,CAC9B,KAAK,OAAO,KAAK,QAAQ,OAAO,GAAGgQ,EAAAA,eAAe,OAASjQ,GACzD,KAAK,iBAAiBA,CAAO,CAC/B,EACA,KAAK,OAAO,KAAK,QAAQ,OAAO,GAAGiQ,EAAAA,eAAe,OAASjQ,GAAiC,CAC1F,KAAK,qBAAqBA,EAAQ,MAAO,SAAS,CACpD,CAAC,CACH,CAoCQ,oBAAoBH,EAAY,CACtC,GAAI,CAAC0M,EAAAA,cAAc1M,EAAO,EAAK,EAAG,CAChC,KAAM,CAAE,QAAAO,CAAQ,EAAIC,EAAAA,iBAClB,qBACA,qCAAqCR,CAAK,EAC5C,EACA,MAAM,IAAI,MAAMO,CAAO,CACzB,CACA,GAAI,CAAC,KAAK,OAAO,KAAK,QAAQ,SAAS,KAAK,SAASP,CAAK,EAAG,CAC3D,KAAM,CAAE,QAAAO,CAAQ,EAAIC,mBAClB,kBACA,gCAAgCR,CAAK,EACvC,EACA,MAAM,IAAI,MAAMO,CAAO,CACzB,CACA,GAAI2J,EAAAA,UAAU,KAAK,OAAO,KAAK,QAAQ,SAAS,IAAIlK,CAAK,EAAE,MAAM,EAAG,CAClE,KAAM,CAAE,QAAAO,CAAQ,EAAIC,EAAAA,iBAAiB,UAAW,kBAAkBR,CAAK,EAAE,EACzE,MAAM,IAAI,MAAMO,CAAO,CACzB,CACF,CAEA,MAAc,oBAAoBP,EAAY,CAC5C,GAAI,CAAC0M,EAAAA,cAAc1M,EAAO,EAAK,EAAG,CAChC,KAAM,CAAE,QAAAO,CAAQ,EAAIC,mBAClB,qBACA,qCAAqCR,CAAK,EAC5C,EACA,MAAM,IAAI,MAAMO,CAAO,CACzB,CAGA,GADA,KAAK,qBAAqBP,CAAK,EAC3B,CAAC,KAAK,OAAO,QAAQ,KAAK,SAASA,CAAK,EAAG,CAC7C,KAAM,CAAE,QAAAO,CAAQ,EAAIC,EAAAA,iBAClB,kBACA,gCAAgCR,CAAK,EACvC,EACA,MAAM,IAAI,MAAMO,CAAO,CACzB,CACA,GAAI2J,EAAAA,UAAU,KAAK,OAAO,QAAQ,IAAIlK,CAAK,EAAE,MAAM,EAAG,CACpD,MAAM,KAAK,cAAc,CAAE,MAAAA,CAAM,CAAC,EAClC,KAAM,CAAE,QAAAO,CAAQ,EAAIC,EAAAA,iBAAiB,UAAW,kBAAkBR,CAAK,EAAE,EACzE,MAAM,IAAI,MAAMO,CAAO,CACzB,CAEA,GAAI,CAAC,KAAK,OAAO,KAAK,OAAO,SAAS,IAAIP,CAAK,EAAG,CAChD,KAAM,CAAE,QAAAO,CAAQ,EAAIC,EAAAA,iBAClB,qBACA,6CAA6CR,CAAK,EACpD,EACA,YAAM,KAAK,cAAc,CAAE,MAAAA,CAAM,CAAC,EAC5B,IAAI,MAAMO,CAAO,CACzB,CACF,CAEA,MAAc,6BAA6BP,EAAe,CAExD,GADA,KAAK,qBAAqBA,CAAK,EAC3B,KAAK,OAAO,QAAQ,KAAK,SAASA,CAAK,EACzC,MAAM,KAAK,oBAAoBA,CAAK,UAC3B,KAAK,OAAO,KAAK,QAAQ,SAAS,KAAK,SAASA,CAAK,EAC9D,KAAK,oBAAoBA,CAAK,UACpB0M,EAAAA,cAAc1M,EAAO,EAAK,EAM/B,CACL,KAAM,CAAE,QAAAO,CAAQ,EAAIC,EAAAA,iBAClB,kBACA,2CAA2CR,CAAK,EAClD,EACA,MAAM,IAAI,MAAMO,CAAO,CACzB,KAZyC,CACvC,KAAM,CAAE,QAAAA,CAAQ,EAAIC,EAAAA,iBAClB,qBACA,gDAAgDR,CAAK,EACvD,EACA,MAAM,IAAI,MAAMO,CAAO,CACzB,CAOF,CAEA,MAAc,kBAAkB0B,EAAS,CACvC,GAAI,CAACoO,YAAUpO,CAAE,EAAG,CAClB,KAAM,CAAE,QAAA1B,CAAQ,EAAIC,EAAAA,iBAClB,qBACA,mCAAmCyB,CAAE,EACvC,EACA,MAAM,IAAI,MAAM1B,CAAO,CACzB,CACA,GAAI,CAAC,KAAK,OAAO,SAAS,KAAK,SAAS0B,CAAE,EAAG,CAC3C,KAAM,CAAE,QAAA1B,CAAQ,EAAIC,EAAAA,iBAAiB,kBAAmB,8BAA8ByB,CAAE,EAAE,EAC1F,MAAM,IAAI,MAAM1B,CAAO,CACzB,CACA,GAAI2J,EAAAA,UAAU,KAAK,OAAO,SAAS,IAAIjI,CAAE,EAAE,eAAe,EAAG,CAC3D,MAAM,KAAK,eAAeA,CAAE,EAC5B,KAAM,CAAE,QAAA1B,CAAQ,EAAIC,EAAAA,iBAAiB,UAAW,gBAAgByB,CAAE,EAAE,EACpE,MAAM,IAAI,MAAM1B,CAAO,CACzB,CACF,CAgPQ,sBAAsBR,EAAiB,CAC7C,GAAIA,GAAU,CAACuQ,EAAAA,qBAAqBvQ,EAAQ/B,CAAiC,EAAG,CAC9E,KAAM,CAAE,QAAAuC,CAAQ,EAAIC,EAAAA,iBAClB,qBACA,qBAAqBT,CAAM,kDAAkD/B,EAAkC,GAAG,QAAQA,EAAkC,GAAG,EACjK,EACA,MAAM,IAAI,MAAMuC,CAAO,CACzB,CACF,CAmZF,CC3+GO,MAAMgQ,WAAiBC,EAAAA,KAAoC,CAChE,YACSC,EACAC,EACP,CACA,MAAMD,EAAMC,EAAQtT,GAAkBR,CAA0B,EAHzD,KAAA,KAAA6T,EACA,KAAA,OAAAC,CAGT,CACF,CCPO,MAAMC,WAAgBH,EAAAA,KAAmC,CAC9D,YACSC,EACAC,EACP,CACA,MAAMD,EAAMC,EAAQlT,GAAiBZ,CAA0B,EAHxD,KAAA,KAAA6T,EACA,KAAA,OAAAC,CAGT,CACF,CCRO,MAAME,WAAuBJ,EAAAA,KAA0C,CAC5E,YACSC,EACAC,EACP,CACA,MACED,EACAC,EACAvS,GACAvB,EACCiU,GAAoCA,EAAI,EAC3C,EATO,KAAA,KAAAJ,EACA,KAAA,OAAAC,CAST,CACF,CCRO,MAAMI,WAAgBN,EAAAA,KAA4D,CACvF,YACSC,EACAC,EACP,CACA,MAAMD,EAAMC,EAAQlS,GAAmBG,EAAqB,IAAMC,CAAoB,EAH/E,KAAA,KAAA6R,EACA,KAAA,OAAAC,CAGT,CACF,CCXO,MAAMK,WAAyBP,EAAAA,KAAuD,CAC3F,YACSC,EACAC,EACP,CACA,MAAMD,EAAMC,EAAQjS,GAA4BE,CAAmB,EAH5D,KAAA,KAAA8R,EACA,KAAA,OAAAC,CAGT,CACF,CCPO,MAAMM,WAAoBR,EAAAA,KAAwC,CACvE,YACSC,EACAC,EACP,CACA,MACED,EACAC,EACAhS,GACAC,EACCkS,GAAkCA,EAAI,EACzC,EATO,KAAA,KAAAJ,EACA,KAAA,OAAAC,CAST,CACF,CCbO,MAAMO,EAAU,CAKrB,YACSR,EACAC,EACP,CAFO,KAAA,KAAAD,EACA,KAAA,OAAAC,EAEP,KAAK,SAAW,IAAII,GAAQ,KAAK,KAAM,KAAK,MAAM,EAClD,KAAK,cAAgB,IAAIC,GAAiB,KAAK,KAAM,KAAK,MAAM,EAChE,KAAK,SAAW,IAAIC,GAAY,KAAK,KAAM,KAAK,MAAM,CACxD,CAEA,MAAa,MAAO,CAClB,MAAM,KAAK,SAAS,OACpB,MAAM,KAAK,cAAc,KAAA,EACzB,MAAM,KAAK,SAAS,KAAA,CACtB,CACF,cCbaE,WAAmBC,GAAAA,WAAY,CAuB1C,YAAYnI,EAAgC,CAC1C,MAAMA,CAAI,EAvBZ,KAAgB,SAAWvM,GAC3B,KAAgB,QAAUC,GAC1B,KAAgB,KAA4BG,EAAoB,KAKhE,KAAO,OAAgC,IAAIuU,GAAAA,aA6C3C,KAAO,GAA8B,CAACC,EAAMC,IACnC,KAAK,OAAO,GAAGD,EAAMC,CAAQ,EAGtC,KAAO,KAAkC,CAACD,EAAMC,IACvC,KAAK,OAAO,KAAKD,EAAMC,CAAQ,EAGxC,KAAO,IAAgC,CAACD,EAAMC,IACrC,KAAK,OAAO,IAAID,EAAMC,CAAQ,EAGvC,KAAO,eAAsD,CAACD,EAAMC,IAC3D,KAAK,OAAO,eAAeD,EAAMC,CAAQ,EAGlD,KAAO,mBAA+DD,GAC7D,KAAK,OAAO,mBAAmBA,CAAI,EAK5C,KAAO,QAAkC,MAAOjS,GAAW,CACzD,GAAI,CACF,OAAO,MAAM,KAAK,OAAO,QAAQA,CAAM,CACzC,OAASgB,EAAY,CACnB,MAAA,KAAK,OAAO,MAAMA,EAAM,OAAO,EACzBA,CACR,CACF,EAEA,KAAO,KAA4B,MAAOhB,GAAW,CACnD,GAAI,CACF,OAAO,MAAM,KAAK,OAAO,KAAKA,CAAM,CACtC,OAASgB,EAAY,CACnB,MAAA,KAAK,OAAO,MAAMA,EAAM,OAAO,EACzBA,CACR,CACF,EAEA,KAAO,QAAkC,MAAOhB,GAAW,CACzD,GAAI,CACF,OAAO,MAAM,KAAK,OAAO,QAAQA,CAAM,CACzC,OAASgB,EAAY,CACnB,MAAA,KAAK,OAAO,MAAMA,EAAM,OAAO,EACzBA,CACR,CACF,EAEA,KAAO,OAAgC,MAAOhB,GAAW,CACvD,GAAI,CACF,OAAO,MAAM,KAAK,OAAO,OAAOA,CAAM,CACxC,OAASgB,EAAY,CACnB,MAAA,KAAK,OAAO,MAAMA,EAAM,OAAO,EACzBA,CACR,CACF,EAEA,KAAO,OAAgC,MAAOhB,GAAW,CACvD,GAAI,CACF,OAAO,MAAM,KAAK,OAAO,OAAOA,CAAM,CACxC,OAASgB,EAAY,CACnB,MAAA,KAAK,OAAO,MAAMA,EAAM,OAAO,EACzBA,CACR,CACF,EAEA,KAAO,OAAgC,MAAOhB,GAAW,CACvD,GAAI,CACF,OAAO,MAAM,KAAK,OAAO,OAAOA,CAAM,CACxC,OAASgB,EAAY,CACnB,MAAA,KAAK,OAAO,MAAMA,EAAM,OAAO,EACzBA,CACR,CACF,EAEA,KAAO,QAAkC,MAAUhB,GAAsC,CACvF,GAAI,CACF,OAAO,MAAM,KAAK,OAAO,QAAWA,CAAM,CAC5C,OAASgB,EAAY,CACnB,MAAA,KAAK,OAAO,MAAMA,EAAM,OAAO,EACzBA,CACR,CACF,EAEA,KAAO,QAAkC,MAAOhB,GAAW,CACzD,GAAI,CACF,OAAO,MAAM,KAAK,OAAO,QAAQA,CAAM,CACzC,OAASgB,EAAY,CACnB,MAAA,KAAK,OAAO,MAAMA,EAAM,OAAO,EACzBA,CACR,CACF,EAEA,KAAO,KAA4B,MAAOhB,GAAW,CACnD,GAAI,CACF,OAAO,MAAM,KAAK,OAAO,KAAKA,CAAM,CACtC,OAASgB,EAAY,CACnB,MAAA,KAAK,OAAO,MAAMA,EAAM,OAAO,EACzBA,CACR,CACF,EAEA,KAAO,KAA4B,MAAOhB,GAAW,CACnD,GAAI,CACF,OAAO,MAAM,KAAK,OAAO,KAAKA,CAAM,CACtC,OAASgB,EAAY,CACnB,WAAK,OAAO,MAAMA,EAAM,OAAO,EACzBA,CACR,CACF,EAEA,KAAO,WAAwC,MAAOhB,GAAW,CAC/D,GAAI,CACF,OAAO,MAAM,KAAK,OAAO,WAAWA,CAAM,CAC5C,OAASgB,EAAY,CACnB,WAAK,OAAO,MAAMA,EAAM,OAAO,EACzBA,CACR,CACF,EAEA,KAAO,KAA6BhB,GAAW,CAC7C,GAAI,CACF,OAAO,KAAK,OAAO,KAAKA,CAAM,CAChC,OAASgB,EAAY,CACnB,MAAA,KAAK,OAAO,MAAMA,EAAM,OAAO,EACzBA,CACR,CACF,EAEA,KAAO,0BAAsE,IAAM,CACjF,GAAI,CACF,OAAO,KAAK,OAAO,0BAAA,CACrB,OAASA,EAAY,CACnB,MAAA,KAAK,OAAO,MAAMA,EAAM,OAAO,EACzBA,CACR,CACF,EAEA,KAAO,aAA4C,MAAOhB,EAAQqF,IAAwB,CACxF,GAAI,CACF,OAAO,MAAM,KAAK,OAAO,aAAarF,EAAQqF,CAAmB,CACnE,OAASrE,EAAY,CACnB,WAAK,OAAO,MAAMA,EAAM,OAAO,EACzBA,CACR,CACF,EAEA,KAAO,kBAAuDhB,GAAW,CACvE,GAAI,CACF,OAAO,KAAK,OAAO,kBAAkBA,CAAM,CAC7C,OAASgB,EAAY,CACnB,MAAA,KAAK,OAAO,MAAMA,EAAM,OAAO,EACzBA,CACR,CACF,EAEA,KAAO,2BAAwE,MAAOhB,GAAW,CAC/F,GAAI,CACF,OAAO,MAAM,KAAK,OAAO,2BAA2BA,CAAM,CAC5D,OAASgB,EAAY,CACnB,MAAA,KAAK,OAAO,MAAMA,EAAM,OAAO,EACzBA,CACR,CACF,EAEA,KAAO,0BAAsE,MAAOhB,GAAW,CAC7F,GAAI,CACF,OAAO,MAAM,KAAK,OAAO,0BAA0BA,CAAM,CAC3D,OAASgB,EAAY,CACnB,MAAA,KAAK,OAAO,MAAMA,EAAM,OAAO,EACzBA,CACR,CACF,EAxME,KAAK,KAAO4I,GAAM,MAAQnM,EAAoB,KAC9C,KAAK,SAAW0U,EAAAA,oBAAoBvI,GAAM,QAAQ,EAClD,KAAK,WAAaA,GAAM,WAExB,MAAM0H,EAASc,EAAAA,aAAa,CAC1B,OAAQxI,GAAM,QAAUnM,EAAoB,OAC5C,KAAM,KAAK,IACb,CAAC,EACD,KAAK,OAAS6T,EACd,KAAK,KAAO1H,GAAM,MAAQ,IAAIyI,EAAAA,KAAKzI,CAAI,EACvC,KAAK,QAAU,IAAI2H,GAAQ,KAAK,KAAM,KAAK,MAAM,EACjD,KAAK,SAAW,IAAIJ,GAAS,KAAK,KAAM,KAAK,MAAM,EACnD,KAAK,eAAiB,IAAIK,GAAe,KAAK,KAAM,KAAK,MAAM,EAC/D,KAAK,OAAS,IAAI/R,GAAO,IAAI,EAC7B,KAAK,KAAO,IAAIoS,GAAU,KAAK,KAAM,KAAK,MAAM,CAClD,CAzBA,aAAa,KAAKjI,EAAgC,CAChD,MAAMjK,EAAS,IAAImS,GAAWlI,CAAI,EAClC,OAAA,MAAMjK,EAAO,aAENA,CACT,CAsBA,IAAI,SAAU,CACZ,OAAO2S,GAAAA,iBAAiB,KAAK,MAAM,CACrC,CAEA,IAAI,SAAU,CACZ,OAAO,KAAK,KAAK,QAAQ,QAC3B,CAqLA,MAAc,YAAa,CACzB,KAAK,OAAO,MAAM,aAAa,EAC/B,GAAI,CACF,MAAM,KAAK,KAAK,QAChB,MAAM,KAAK,QAAQ,OACnB,MAAM,KAAK,SAAS,KAAA,EACpB,MAAM,KAAK,eAAe,KAAA,EAC1B,MAAM,KAAK,KAAK,OAChB,MAAM,KAAK,OAAO,KAAA,EAClB,KAAK,OAAO,KAAK,mCAAmC,CACtD,OAAStR,EAAY,CACnB,WAAK,OAAO,KAAK,mCAAmC,EACpD,KAAK,OAAO,MAAMA,EAAM,OAAO,EACzBA,CACR,CACF,CACF,EC9PO,MAAMuR,GAAehB,GACfO,GAAaU"}