@trufnetwork/sdk-js 0.5.9 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/README.md +45 -0
  2. package/dist/cjs/client/client.cjs +45 -20
  3. package/dist/cjs/client/client.cjs.map +2 -2
  4. package/dist/cjs/contracts-api/action.cjs +51 -26
  5. package/dist/cjs/contracts-api/action.cjs.map +2 -2
  6. package/dist/cjs/contracts-api/orderbookAction.cjs +880 -0
  7. package/dist/cjs/contracts-api/orderbookAction.cjs.map +7 -0
  8. package/dist/cjs/internal.cjs +9 -0
  9. package/dist/cjs/internal.cjs.map +2 -2
  10. package/dist/cjs/types/bridge.cjs.map +1 -1
  11. package/dist/cjs/types/orderbook.cjs +19 -0
  12. package/dist/cjs/types/orderbook.cjs.map +7 -0
  13. package/dist/cjs/util/AttestationEncoding.cjs +3 -2
  14. package/dist/cjs/util/AttestationEncoding.cjs.map +2 -2
  15. package/dist/cjs/util/orderbookHelpers.cjs +194 -0
  16. package/dist/cjs/util/orderbookHelpers.cjs.map +7 -0
  17. package/dist/cjs/util/orderbookHelpers.test.cjs +217 -0
  18. package/dist/cjs/util/orderbookHelpers.test.cjs.map +7 -0
  19. package/dist/esm/client/client.mjs +45 -20
  20. package/dist/esm/client/client.mjs.map +2 -2
  21. package/dist/esm/contracts-api/action.mjs +51 -26
  22. package/dist/esm/contracts-api/action.mjs.map +2 -2
  23. package/dist/esm/contracts-api/orderbookAction.mjs +875 -0
  24. package/dist/esm/contracts-api/orderbookAction.mjs.map +7 -0
  25. package/dist/esm/internal.mjs +16 -0
  26. package/dist/esm/internal.mjs.map +2 -2
  27. package/dist/esm/types/orderbook.mjs +1 -0
  28. package/dist/esm/types/orderbook.mjs.map +7 -0
  29. package/dist/esm/util/AttestationEncoding.mjs +3 -2
  30. package/dist/esm/util/AttestationEncoding.mjs.map +2 -2
  31. package/dist/esm/util/orderbookHelpers.mjs +173 -0
  32. package/dist/esm/util/orderbookHelpers.mjs.map +7 -0
  33. package/dist/esm/util/orderbookHelpers.test.mjs +229 -0
  34. package/dist/esm/util/orderbookHelpers.test.mjs.map +7 -0
  35. package/dist/tsconfig.build.tsbuildinfo +1 -1
  36. package/dist/types/client/client.d.ts +36 -16
  37. package/dist/types/client/client.d.ts.map +1 -1
  38. package/dist/types/contracts-api/action.d.ts +47 -22
  39. package/dist/types/contracts-api/action.d.ts.map +1 -1
  40. package/dist/types/contracts-api/orderbookAction.d.ts +303 -0
  41. package/dist/types/contracts-api/orderbookAction.d.ts.map +1 -0
  42. package/dist/types/internal.d.ts +3 -0
  43. package/dist/types/internal.d.ts.map +1 -1
  44. package/dist/types/types/bridge.d.ts +3 -2
  45. package/dist/types/types/bridge.d.ts.map +1 -1
  46. package/dist/types/types/orderbook.d.ts +376 -0
  47. package/dist/types/types/orderbook.d.ts.map +1 -0
  48. package/dist/types/util/AttestationEncoding.d.ts +9 -1
  49. package/dist/types/util/AttestationEncoding.d.ts.map +1 -1
  50. package/dist/types/util/orderbookHelpers.d.ts +161 -0
  51. package/dist/types/util/orderbookHelpers.d.ts.map +1 -0
  52. package/dist/types/util/orderbookHelpers.test.d.ts +2 -0
  53. package/dist/types/util/orderbookHelpers.test.d.ts.map +1 -0
  54. package/package.json +1 -1
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/contracts-api/action.ts"],
4
- "sourcesContent": ["import {KwilSigner, NodeKwil, WebKwil, Types} from \"@trufnetwork/kwil-js\";\nimport { Either } from \"monads-io\";\nimport { WithdrawalProof } from \"../types/bridge\";\nimport { DateString } from \"../types/other\";\nimport { StreamLocator } from \"../types/stream\";\nimport { CacheAwareResponse, GetRecordOptions, GetIndexOptions, GetIndexChangeOptions, GetFirstRecordOptions } from \"../types/cache\";\nimport { EthereumAddress } from \"../util/EthereumAddress\";\nimport { head } from \"../util/head\";\nimport { StreamId } from \"../util/StreamId\";\nimport { toVisibilityEnum, VisibilityEnum } from \"../util/visibility\";\nimport { CacheMetadataParser } from \"../util/cacheMetadataParser\";\nimport { CacheValidation } from \"../util/cacheValidation\";\nimport {\n MetadataKey,\n MetadataKeyValueMap,\n MetadataTableKey,\n MetadataValueTypeForKey,\n StreamType,\n} from \"./contractValues\";\n// ValueType is available as Types.ValueType\n\nexport interface GetRecordInput {\n stream: StreamLocator;\n from?: number;\n to?: number;\n frozenAt?: number;\n baseTime?: DateString | number;\n prefix?: string;\n}\n\nexport interface GetFirstRecordInput {\n stream: StreamLocator;\n after?: number;\n frozenAt?: number;\n}\n\nexport interface StreamRecord {\n eventTime: number;\n value: string;\n}\n\nexport interface GetIndexChangeInput extends GetRecordInput {\n timeInterval: number;\n}\n\nexport interface ListMetadataByHeightParams {\n /** Key reference filter. Default: empty string */\n key?: string;\n /** Value reference filter. Default: null */\n value?: string;\n /** Start height (inclusive). If null, uses earliest available. */\n fromHeight?: number;\n /** End height (inclusive). If null, uses current height. */\n toHeight?: number;\n /** Maximum number of results to return. Default: 1000 */\n limit?: number;\n /** Number of results to skip for pagination. Default: 0 */\n offset?: number;\n}\n\nexport interface MetadataQueryResult {\n streamId: string;\n dataProvider: string;\n rowId: string;\n valueInt: number | null;\n valueFloat: string | null;\n valueBoolean: boolean | null;\n valueString: string | null;\n valueRef: string | null;\n createdAt: number;\n}\n\nexport class Action {\n protected kwilClient: WebKwil | NodeKwil;\n protected kwilSigner: KwilSigner;\n /** Track if deprecation warnings were already emitted */\n private static _legacyWarnEmitted: Record<string, boolean> = {\n getRecord: false,\n getIndex: false,\n getFirstRecord: false,\n getIndexChange: false,\n };\n constructor(\n kwilClient: WebKwil | NodeKwil,\n kwilSigner: KwilSigner,\n ) {\n this.kwilClient = kwilClient;\n this.kwilSigner = kwilSigner;\n }\n\n /**\n * Executes a stream method with named parameters\n * @param method - The action name to execute\n * @param inputs - Named parameters for the action\n * @param types - Optional type specifications for parameters (e.g., NUMERIC)\n * @returns Transaction receipt\n */\n protected async executeWithNamedParams(\n method: string,\n inputs: Types.NamedParams[],\n types?: Record<string, any>,\n ): Promise<Types.GenericResponse<Types.TxReceipt>> {\n return this.kwilClient.execute({\n namespace: \"main\",\n name: method,\n inputs,\n types,\n description: `TN SDK - Executing method on stream: ${method}`,\n },\n this.kwilSigner,\n );\n }\n\n /**\n * Executes a stream action with a complete ActionBody\n * @param inputs - Complete action body with all execution parameters\n * @param synchronous - Whether to wait for transaction to be mined\n * @returns Transaction receipt\n */\n protected async executeWithActionBody(\n inputs: Types.ActionBody,\n synchronous: boolean = false,\n ): Promise<Types.GenericResponse<Types.TxReceipt>> {\n return this.kwilClient.execute(inputs, this.kwilSigner, synchronous);\n }\n\n /**\n * Calls a method on the stream\n */\n protected async call<T>(\n method: string,\n inputs: Types.NamedParams,\n ): Promise<Either<number, T>> {\n const result = await this.kwilClient.call(\n {\n namespace: \"main\",\n name: method,\n inputs: inputs,\n },\n this.kwilSigner,\n );\n\n if (result.status !== 200) {\n return Either.left(result.status);\n }\n\n return Either.right(result.data?.result as T);\n }\n\n /**\n * @deprecated Use getRecord(stream, options?) to leverage cache support and future-proof parameter handling.\n */\n public async getRecord(input: GetRecordInput): Promise<StreamRecord[]>;\n public async getRecord(stream: StreamLocator, options?: GetRecordOptions): Promise<CacheAwareResponse<StreamRecord[]>>;\n public async getRecord(\n inputOrStream: GetRecordInput | StreamLocator,\n options?: GetRecordOptions\n ): Promise<StreamRecord[] | CacheAwareResponse<StreamRecord[]>> {\n // Handle backward compatibility\n if ('stream' in inputOrStream) {\n // Legacy call format\n const input = inputOrStream as GetRecordInput;\n // emit deprecation warning once\n if (!Action._legacyWarnEmitted.getRecord) {\n Action._legacyWarnEmitted.getRecord = true;\n if (typeof console !== 'undefined' && console.warn) {\n console.warn('[TN SDK] Deprecated signature: getRecord(input). Use getRecord(stream, options?) instead.');\n }\n }\n const prefix = input.prefix ? input.prefix : \"\"\n const result = await this.call<{ event_time: number; value: string }[]>(\n prefix + \"get_record\",\n {\n $data_provider: input.stream.dataProvider.getAddress(),\n $stream_id: input.stream.streamId.getId(),\n $from: input.from,\n $to: input.to,\n $frozen_at: input.frozenAt,\n }\n );\n return result\n .mapRight((result) =>\n result.map((row) => ({\n eventTime: row.event_time,\n value: row.value,\n })),\n )\n .throw();\n }\n \n // New cache-aware call format\n const stream = inputOrStream as StreamLocator;\n \n // Validate options if provided\n if (options) {\n CacheValidation.validateGetRecordOptions(options);\n CacheValidation.validateTimeRange(options.from, options.to);\n }\n \n const prefix = options?.prefix ? options.prefix : \"\"\n const params: any = {\n $data_provider: stream.dataProvider.getAddress(),\n $stream_id: stream.streamId.getId(),\n $from: options?.from,\n $to: options?.to,\n $frozen_at: options?.frozenAt,\n };\n \n if (options?.useCache !== undefined) {\n params.$use_cache = options.useCache;\n }\n \n const result = await this.kwilClient.call(\n {\n namespace: \"main\",\n name: prefix + \"get_record\",\n inputs: params,\n },\n this.kwilSigner,\n );\n \n if (result.status !== 200) {\n throw new Error(`Failed to get record: ${result.status}`);\n }\n \n const data = (result.data?.result as { event_time: number; value: string }[]).map((row) => ({\n eventTime: row.event_time,\n value: row.value,\n }));\n \n let cache = CacheMetadataParser.extractFromResponse(result);\n \n // Enhance cache metadata with SDK-provided context\n if (cache) {\n cache = {\n ...cache,\n streamId: stream.streamId.getId(),\n dataProvider: stream.dataProvider.getAddress(),\n from: options?.from,\n to: options?.to,\n frozenAt: options?.frozenAt,\n rowsServed: data.length\n };\n }\n \n return {\n data,\n cache: cache || undefined,\n logs: result.data?.logs ? CacheMetadataParser.parseLogsForMetadata(result.data.logs) : undefined,\n };\n }\n\n /**\n * Returns the index of the stream within the given date range\n * @deprecated Use getIndex(stream, options?) to leverage cache support and future-proof parameter handling.\n */\n public async getIndex(input: GetRecordInput): Promise<StreamRecord[]>;\n public async getIndex(stream: StreamLocator, options?: GetIndexOptions): Promise<CacheAwareResponse<StreamRecord[]>>;\n public async getIndex(\n inputOrStream: GetRecordInput | StreamLocator,\n options?: GetIndexOptions\n ): Promise<StreamRecord[] | CacheAwareResponse<StreamRecord[]>> {\n // Handle backward compatibility\n if ('stream' in inputOrStream) {\n // Legacy call format\n const input = inputOrStream as GetRecordInput;\n if (!Action._legacyWarnEmitted.getIndex) {\n Action._legacyWarnEmitted.getIndex = true;\n if (typeof console !== 'undefined' && console.warn) {\n console.warn('[TN SDK] Deprecated signature: getIndex(input). Use getIndex(stream, options?) instead.');\n }\n }\n const prefix = input.prefix ? input.prefix : \"\"\n const result = await this.call<{ event_time: number; value: string }[]>(\n prefix + \"get_index\",\n {\n $data_provider: input.stream.dataProvider.getAddress(),\n $stream_id: input.stream.streamId.getId(),\n $from: input.from,\n $to: input.to,\n $frozen_at: input.frozenAt,\n $base_time: input.baseTime,\n }\n );\n return result\n .mapRight((result) =>\n result.map((row) => ({\n eventTime: row.event_time,\n value: row.value,\n })),\n )\n .throw();\n }\n \n // New cache-aware call format\n const stream = inputOrStream as StreamLocator;\n \n // Validate options if provided\n if (options) {\n CacheValidation.validateGetIndexOptions(options);\n CacheValidation.validateTimeRange(options.from, options.to);\n }\n \n const prefix = options?.prefix ? options.prefix : \"\"\n const params: any = {\n $data_provider: stream.dataProvider.getAddress(),\n $stream_id: stream.streamId.getId(),\n $from: options?.from,\n $to: options?.to,\n $frozen_at: options?.frozenAt,\n $base_time: options?.baseTime,\n };\n \n if (options?.useCache !== undefined) {\n params.$use_cache = options.useCache;\n }\n \n const result = await this.kwilClient.call(\n {\n namespace: \"main\",\n name: prefix + \"get_index\",\n inputs: params,\n },\n this.kwilSigner,\n );\n \n if (result.status !== 200) {\n throw new Error(`Failed to get index: ${result.status}`);\n }\n \n const data = (result.data?.result as { event_time: number; value: string }[]).map((row) => ({\n eventTime: row.event_time,\n value: row.value,\n }));\n \n let cache = CacheMetadataParser.extractFromResponse(result);\n \n // Enhance cache metadata with SDK-provided context\n if (cache) {\n cache = {\n ...cache,\n streamId: stream.streamId.getId(),\n dataProvider: stream.dataProvider.getAddress(),\n from: options?.from,\n to: options?.to,\n frozenAt: options?.frozenAt,\n rowsServed: data.length\n };\n }\n \n return {\n data,\n cache: cache || undefined,\n logs: result.data?.logs ? CacheMetadataParser.parseLogsForMetadata(result.data.logs) : undefined\n };\n }\n\n /**\n * Returns the type of the stream\n */\n public async getType(\n stream: StreamLocator,\n ): Promise<StreamType> {\n const result = await this.getMetadata(\n stream,\n MetadataKey.TypeKey);\n\n if (!result) {\n throw new Error(\"Failed to get stream type\");\n }\n\n const type = head(result).unwrapOrElse(() => {\n throw new Error(\n \"Failed to get stream type. Check if the stream is initialized.\",\n );\n });\n\n const validTypes = [StreamType.Primitive, StreamType.Composed];\n\n if (!validTypes.includes(type.value as StreamType)) {\n throw new Error(`Invalid stream type: ${type.value}`);\n }\n\n return type.value as StreamType;\n }\n\n /**\n * Returns the first record of the stream\n * @deprecated Use getFirstRecord(stream, options?) to leverage cache support and future-proof parameter handling.\n */\n public async getFirstRecord(\n input: GetFirstRecordInput,\n ): Promise<StreamRecord | null>;\n public async getFirstRecord(\n stream: StreamLocator,\n options?: GetFirstRecordOptions\n ): Promise<CacheAwareResponse<StreamRecord | null>>;\n public async getFirstRecord(\n inputOrStream: GetFirstRecordInput | StreamLocator,\n options?: GetFirstRecordOptions\n ): Promise<StreamRecord | null | CacheAwareResponse<StreamRecord | null>> {\n // Handle backward compatibility\n if ('stream' in inputOrStream) {\n // Legacy call format\n const input = inputOrStream as GetFirstRecordInput;\n if (!Action._legacyWarnEmitted.getFirstRecord) {\n Action._legacyWarnEmitted.getFirstRecord = true;\n if (typeof console !== 'undefined' && console.warn) {\n console.warn('[TN SDK] Deprecated signature: getFirstRecord(input). Use getFirstRecord(stream, options?) instead.');\n }\n }\n const result = await this.call<{ event_time: number; value: string }[]>(\n \"get_first_record\",\n {\n $data_provider: input.stream.dataProvider.getAddress(),\n $stream_id: input.stream.streamId.getId(),\n $after: input.after,\n $frozen_at: input.frozenAt,\n }\n );\n\n return result\n .mapRight(head)\n .mapRight((result) =>\n result\n .map((result) => ({\n eventTime: result.event_time,\n value: result.value,\n }))\n .unwrapOr(null),\n )\n .throw();\n }\n \n // New cache-aware call format\n const stream = inputOrStream as StreamLocator;\n \n // Validate options if provided\n if (options) {\n CacheValidation.validateGetFirstRecordOptions(options);\n }\n \n const params: any = {\n $data_provider: stream.dataProvider.getAddress(),\n $stream_id: stream.streamId.getId(),\n $after: options?.after,\n $frozen_at: options?.frozenAt,\n };\n \n if (options?.useCache !== undefined) {\n params.$use_cache = options.useCache;\n }\n \n const result = await this.kwilClient.call(\n {\n namespace: \"main\",\n name: \"get_first_record\",\n inputs: params,\n },\n this.kwilSigner,\n );\n \n if (result.status !== 200) {\n throw new Error(`Failed to get first record: ${result.status}`);\n }\n \n const rawData = result.data?.result as { event_time: number; value: string }[];\n const data = rawData && rawData.length > 0 ? {\n eventTime: rawData[0].event_time,\n value: rawData[0].value,\n } : null;\n \n let cache = CacheMetadataParser.extractFromResponse(result);\n \n // Enhance cache metadata with SDK-provided context\n if (cache) {\n cache = {\n ...cache,\n streamId: stream.streamId.getId(),\n dataProvider: stream.dataProvider.getAddress(),\n frozenAt: options?.frozenAt,\n rowsServed: data ? 1 : 0\n };\n }\n \n return {\n data,\n cache: cache || undefined,\n logs: result.data?.logs ? CacheMetadataParser.parseLogsForMetadata(result.data.logs) : undefined\n };\n }\n\n protected async setMetadata<K extends MetadataKey>(\n stream: StreamLocator,\n key: K,\n value: MetadataValueTypeForKey<K>,\n ): Promise<Types.GenericResponse<Types.TxReceipt>> {\n return await this.executeWithNamedParams(\"insert_metadata\", [{\n $data_provider: stream.dataProvider.getAddress(),\n $stream_id: stream.streamId.getId(),\n $key: key,\n $value: value,\n $val_type: MetadataKeyValueMap[key],\n },\n ]);\n }\n\n protected async getMetadata<K extends MetadataKey>(\n stream: StreamLocator,\n key: K,\n // onlyLatest: boolean = true,\n filteredRef?: string,\n limit?: number,\n offset?: number,\n orderBy?: string,\n ): Promise<\n { rowId: string; value: MetadataValueTypeForKey<K>; createdAt: number }[]\n > {\n const result = await this.call<\n {\n row_id: string;\n value_i: number;\n value_f: string;\n value_b: boolean;\n value_s: string;\n value_ref: string;\n created_at: number;\n }[]\n >(\"get_metadata\", {\n $data_provider: stream.dataProvider.getAddress(),\n $stream_id: stream.streamId.getId(),\n $key: key,\n $ref: filteredRef,\n $limit: limit,\n $offset: offset,\n $order_by: orderBy,\n },\n );\n return result\n .mapRight((result) =>\n result.map((row) => ({\n rowId: row.row_id,\n value: row[\n MetadataTableKey[MetadataKeyValueMap[key as MetadataKey]]\n ] as MetadataValueTypeForKey<K>,\n createdAt: row.created_at,\n })),\n )\n .throw();\n }\n\n public async listMetadataByHeight<K extends MetadataKey>(\n params: ListMetadataByHeightParams = {},\n ): Promise<MetadataQueryResult[]> {\n type MetadataRawResult = {\n stream_id: string;\n data_provider: string;\n row_id: string;\n value_i: number | null;\n value_f: string | null;\n value_b: boolean | null;\n value_s: string | null;\n value_ref: string | null;\n created_at: number;\n }[];\n const result = await this.call<MetadataRawResult>(\n \"list_metadata_by_height\",\n {\n $key: params.key ?? \"\",\n $ref: params.value ?? null,\n $from_height: params.fromHeight ?? null,\n $to_height: params.toHeight ?? null,\n $limit: params.limit ?? null,\n $offset: params.offset ?? null,\n },\n );\n\n return result\n .mapRight((records) => \n records.map(record => ({\n streamId: record.stream_id,\n dataProvider: record.data_provider,\n rowId: record.row_id,\n valueInt: record.value_i,\n valueFloat: record.value_f,\n valueBoolean: record.value_b,\n valueString: record.value_s,\n valueRef: record.value_ref,\n createdAt: record.created_at,\n }))\n )\n .throw();\n }\n\n /**\n * Sets the read visibility of the stream\n */\n public async setReadVisibility(\n stream: StreamLocator,\n visibility: VisibilityEnum,\n ): Promise<Types.GenericResponse<Types.TxReceipt>> {\n return await this.setMetadata(\n stream,\n MetadataKey.ReadVisibilityKey,\n visibility.toString(),\n );\n }\n\n /**\n * Returns the read visibility of the stream\n */\n public async getReadVisibility(\n stream: StreamLocator,\n ): Promise<VisibilityEnum | null> {\n const result = await this.getMetadata(\n stream,\n MetadataKey.ReadVisibilityKey);\n\n return head(result)\n .map((row) => toVisibilityEnum(row.value))\n .unwrapOr(null);\n }\n\n /**\n * Sets the compose visibility of the stream\n */\n public async setComposeVisibility(\n stream: StreamLocator,\n visibility: VisibilityEnum,\n ): Promise<Types.GenericResponse<Types.TxReceipt>> {\n return await this.setMetadata(\n stream,\n MetadataKey.ComposeVisibilityKey,\n visibility.toString(),\n );\n }\n\n /**\n * Returns the compose visibility of the stream\n */\n public async getComposeVisibility(\n stream: StreamLocator,\n ): Promise<VisibilityEnum | null> {\n const result = await this.getMetadata(\n stream,\n MetadataKey.ComposeVisibilityKey);\n\n return head(result)\n .map((row) => toVisibilityEnum(row.value))\n .unwrapOr(null);\n }\n\n /**\n * Allows a wallet to read the stream\n */\n public async allowReadWallet(\n stream: StreamLocator,\n wallet: EthereumAddress,\n ): Promise<Types.GenericResponse<Types.TxReceipt>> {\n return await this.setMetadata(\n stream,\n MetadataKey.AllowReadWalletKey,\n wallet.getAddress(),\n );\n }\n\n /**\n * Disables a wallet from reading the stream\n */\n public async disableReadWallet(\n stream: StreamLocator,\n wallet: EthereumAddress,\n ): Promise<Types.GenericResponse<Types.TxReceipt>> {\n const result = await this.getMetadata(\n stream,\n MetadataKey.AllowReadWalletKey,\n wallet.getAddress(),\n );\n\n const row_id = head(result)\n .map((row) => row.rowId)\n .unwrapOr(null);\n\n if (!row_id) {\n throw new Error(\"Wallet not found in allowed list\");\n }\n\n return await this.disableMetadata(stream, row_id);\n }\n\n /**\n * Allows a stream to use this stream as child\n */\n public async allowComposeStream(\n stream: StreamLocator,\n wallet: StreamLocator,\n ): Promise<Types.GenericResponse<Types.TxReceipt>> {\n return await this.setMetadata(\n stream,\n MetadataKey.AllowComposeStreamKey,\n wallet.streamId.getId(),\n );\n }\n\n /**\n * Disables a stream from using this stream as child\n */\n public async disableComposeStream(\n stream: StreamLocator,\n wallet: StreamLocator,\n ): Promise<Types.GenericResponse<Types.TxReceipt>> {\n const result = await this.getMetadata(\n stream,\n MetadataKey.AllowComposeStreamKey,\n wallet.toString(),\n );\n\n const row_id = head(result)\n .map((row) => row.rowId)\n .unwrapOr(null);\n\n if (!row_id) {\n throw new Error(\"Stream not found in allowed list\");\n }\n\n return await this.disableMetadata(stream, row_id);\n }\n\n protected async disableMetadata(\n stream: StreamLocator,\n rowId: string,\n ): Promise<Types.GenericResponse<Types.TxReceipt>> {\n return await this.executeWithNamedParams(\"disable_metadata\", [{\n $data_provider: stream.dataProvider.getAddress(),\n $stream_id: stream.streamId.getId(),\n $row_id: rowId,\n }]);\n }\n\n /**\n * Returns the wallets allowed to read the stream\n */\n public async getAllowedReadWallets(\n stream: StreamLocator,\n ): Promise<EthereumAddress[]> {\n const result = await this.getMetadata(\n stream,\n MetadataKey.AllowReadWalletKey);\n\n return result\n .filter((row) => row.value)\n .map((row) => new EthereumAddress(row.value));\n }\n\n /**\n * Returns the streams allowed to compose the stream\n */\n public async getAllowedComposeStreams(\n stream: StreamLocator,\n ): Promise<StreamLocator[]> {\n const result = await this.getMetadata(\n stream,\n MetadataKey.AllowComposeStreamKey);\n\n return result\n .filter((row) => row.value)\n .map((row) => {\n const [streamId, dataProvider] = row.value.split(\":\");\n return {\n streamId: StreamId.fromString(streamId).throw(),\n dataProvider: new EthereumAddress(dataProvider),\n };\n });\n }\n\n /**\n * Returns the index change of the stream within the given date range\n * @deprecated Use getIndexChange(stream, options) to leverage cache support and future-proof parameter handling.\n */\n public async getIndexChange(\n input: GetIndexChangeInput,\n ): Promise<StreamRecord[]>;\n public async getIndexChange(\n stream: StreamLocator,\n options: GetIndexChangeOptions\n ): Promise<CacheAwareResponse<StreamRecord[]>>;\n public async getIndexChange(\n inputOrStream: GetIndexChangeInput | StreamLocator,\n options?: GetIndexChangeOptions\n ): Promise<StreamRecord[] | CacheAwareResponse<StreamRecord[]>> {\n // Handle backward compatibility\n if ('stream' in inputOrStream) {\n // Legacy call format\n const input = inputOrStream as GetIndexChangeInput;\n if (!Action._legacyWarnEmitted.getIndexChange) {\n Action._legacyWarnEmitted.getIndexChange = true;\n if (typeof console !== 'undefined' && console.warn) {\n console.warn('[TN SDK] Deprecated signature: getIndexChange(input). Use getIndexChange(stream, options?) instead.');\n }\n }\n const result = await this.call<{ event_time: number; value: string }[]>(\n \"get_index_change\", \n {\n $data_provider: input.stream.dataProvider.getAddress(),\n $stream_id: input.stream.streamId.getId(),\n $from: input.from,\n $to: input.to,\n $frozen_at: input.frozenAt,\n $base_time: input.baseTime,\n $time_interval: input.timeInterval,\n }\n );\n\n return result\n .mapRight((result) =>\n result.map((row) => ({\n eventTime: row.event_time,\n value: row.value,\n })),\n )\n .throw();\n }\n \n // New cache-aware call format\n const stream = inputOrStream as StreamLocator;\n if (!options) {\n throw new Error('Options parameter is required for cache-aware getIndexChange');\n }\n \n // Validate options\n CacheValidation.validateGetIndexChangeOptions(options);\n CacheValidation.validateTimeRange(options.from, options.to);\n \n const params: any = {\n $data_provider: stream.dataProvider.getAddress(),\n $stream_id: stream.streamId.getId(),\n $from: options.from,\n $to: options.to,\n $frozen_at: options.frozenAt,\n $base_time: options.baseTime,\n $time_interval: options.timeInterval,\n };\n \n if (options.useCache !== undefined) {\n params.$use_cache = options.useCache;\n }\n \n const result = await this.kwilClient.call(\n {\n namespace: \"main\",\n name: \"get_index_change\",\n inputs: params,\n },\n this.kwilSigner,\n );\n \n if (result.status !== 200) {\n throw new Error(`Failed to get index change: ${result.status}`);\n }\n \n const data = (result.data?.result as { event_time: number; value: string }[]).map((row) => ({\n eventTime: row.event_time,\n value: row.value,\n }));\n \n let cache = CacheMetadataParser.extractFromResponse(result);\n \n // Enhance cache metadata with SDK-provided context\n if (cache) {\n cache = {\n ...cache,\n streamId: stream.streamId.getId(),\n dataProvider: stream.dataProvider.getAddress(),\n from: options.from,\n to: options.to,\n frozenAt: options.frozenAt,\n rowsServed: data.length\n };\n }\n \n return {\n data,\n cache: cache || undefined,\n logs: result.data?.logs ? CacheMetadataParser.parseLogsForMetadata(result.data.logs) : undefined\n };\n }\n\n /**\n * A custom method that accepts the procedure name and the input of GetRecordInput\n * Returns the result of the procedure in the same format as StreamRecord\n * I.e. a custom procedure named \"get_price\" that returns a list of date_value and value\n * can be called with customGetProcedure(\"get_price\", { dateFrom: \"2021-01-01\", dateTo: \"2021-01-31\" })\n */\n public async customGetProcedure(\n procedure: string,\n input: GetRecordInput,\n ): Promise<StreamRecord[]> {\n const result = await this.call<{ event_time: number; value: string }[]>(\n procedure,\n {\n $data_provider: input.stream.dataProvider.getAddress(),\n $stream_id: input.stream.streamId.getId(),\n $from: input.from,\n $to: input.to,\n $frozen_at: input.frozenAt\n }\n );\n return result\n .mapRight((result) =>\n result.map((row) => ({\n eventTime: row.event_time,\n value: row.value,\n })),\n )\n .throw();\n }\n\n\n /**\n * A custom method that accepts the procedure name and custom input of type Record<string, any>\n * Returns the result of the procedure in the same format as StreamRecord\n * I.e. a custom procedure named \"get_custom_index\" that returns a list of date_value and value\n * can be called with customProcedureWithArgs(\"get_custom_index\", { $customArg1: \"value1\", $customArg2: \"value2\" })\n * where $customArg1 and $customArg2 are the arguments of the procedure\n * @param procedure\n * @param args\n */\n public async customProcedureWithArgs(\n procedure: string,\n args: Record<string, Types.ValueType | Types.ValueType[]>,\n ){\n const result = await this.call<{ event_time: number; value: string }[]>(\n procedure,\n args\n );\n return result\n .mapRight((result) =>\n result.map((row) => ({\n eventTime: row.event_time,\n value: row.value,\n })),\n )\n .throw();\n }\n\n /**\n * Returns the size of database\n */\n public async getDatabaseSize(): Promise<BigInt> {\n const result = await this.call<{ database_size: BigInt }[]>(\"get_database_size_v2\", {})\n return result\n .map((rows) => {\n const raw = rows[0].database_size;\n const asBigInt = BigInt(raw.toString());\n return asBigInt;\n }).throw();\n }\n\n /**\n * Returns the size of database in human-readable format (e.g., \"22 GB\", \"1.5 TB\")\n */\n public async getDatabaseSizePretty(): Promise<string> {\n const result = await this.call<{ database_size_pretty: string }[]>(\"get_database_size_v2_pretty\", {})\n return result\n .map((rows) => rows[0].database_size_pretty)\n .throw();\n }\n\n /**\n * Gets the wallet balance on any supported blockchain network\n * @param chain The chain identifier (e.g., \"sepolia\", \"mainnet\", \"polygon\", etc.)\n * @param walletAddress The wallet address to check balance for\n * @returns Promise that resolves to the balance as a string, or throws on error\n */\n public async getWalletBalance(\n chain: string,\n walletAddress: string\n ): Promise<string> {\n const result = await this.call<{ balance?: string; }[]>(\n `${chain}_wallet_balance`,\n {\n $wallet_address: walletAddress,\n }\n );\n\n return result\n .mapRight((rows) => {\n if (rows.length === 0) {\n throw new Error(\"You don't have necessary permissions to execute this query\");\n }\n \n const row = rows[0];\n \n if (row.balance === undefined) {\n throw new Error(\"No balance returned from wallet balance query\");\n }\n \n return row.balance;\n })\n .throw();\n }\n\n /**\n * Calls the whoami action to get the caller's wallet address\n * This is useful for verifying wallet authentication with TN\n * @returns Promise that resolves to the caller's wallet address\n */\n public async whoami(): Promise<string> {\n const result = await this.call<{ caller: string }[]>(\n \"whoami\",\n {}\n );\n\n return result\n .mapRight((rows) => {\n if (rows.length === 0) {\n throw new Error(\"No response from whoami action\");\n }\n \n const row = rows[0];\n \n if (!row.caller) {\n throw new Error(\"No caller address returned from whoami\");\n }\n \n return row.caller;\n })\n .throw();\n }\n\n /**\n * Bridges tokens on a blockchain network\n * @param chain The chain identifier (e.g., \"sepolia\", \"mainnet\", \"polygon\", etc.)\n * @param amount The amount to bridge\n * @returns Promise that resolves to GenericResponse<TxReceipt>\n */\n public async bridgeTokens(\n chain: string,\n amount: string,\n recipient: string\n ): Promise<Types.GenericResponse<Types.TxReceipt>> {\n // Validate amount is greater than 0\n const numAmount = parseFloat(amount);\n if (isNaN(numAmount) || numAmount <= 0) {\n throw new Error(`Invalid amount: ${amount}. Amount must be greater than 0.`);\n }\n\n return await this.executeWithNamedParams(`${chain}_bridge_tokens`, [{\n $recipient: recipient,\n $amount: amount\n }]);\n }\n\n /**\n * Lists wallet rewards on a blockchain network\n * @param chain The chain identifier (e.g., \"sepolia\", \"mainnet\", \"polygon\", etc.)\n * @param wallet The wallet address to list rewards for\n * @param withPending Whether to include pending rewards\n * @returns Promise that resolves to the rewards data\n */\n public async listWalletRewards(\n chain: string,\n wallet: string,\n withPending: boolean\n ): Promise<any[]> {\n const result = await this.kwilClient.call(\n {\n namespace: `${chain}_bridge`,\n name: \"list_wallet_rewards\",\n inputs: {\n $param_1: wallet,\n $param_2: withPending,\n },\n },\n this.kwilSigner,\n );\n\n if (result.status !== 200) {\n throw new Error(`Failed to list wallet rewards: ${result.status}`);\n }\n\n return result.data?.result || [];\n }\n\n /**\n * Gets withdrawal proof for a wallet address on a blockchain network\n * Returns merkle proofs and validator signatures needed for withdrawal on target chain\n *\n * This method is used for non-custodial bridge withdrawals where users need to\n * manually claim their withdrawals by submitting proofs to the destination chain.\n *\n * @param chain The chain identifier (e.g., \"hoodi\", \"sepolia\", etc.)\n * @param walletAddress The wallet address to get withdrawal proof for\n * @returns Promise that resolves to array of withdrawal proofs\n *\n * @example\n * ```typescript\n * // Get withdrawal proofs for Hoodi\n * const proofs = await action.getWithdrawalProof(\"hoodi\", \"0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb\");\n * // Returns: [{ chain: \"hoodi\", recipient: \"0x...\", amount: \"100000000000000000000\", ... }]\n * ```\n *\n * @note This method has been tested via integration tests in the node repository.\n * See: https://github.com/trufnetwork/kwil-db/blob/main/node/exts/erc20-bridge/erc20/meta_extension_withdrawal_test.go\n */\n public async getWithdrawalProof(\n chain: string,\n walletAddress: string\n ): Promise<WithdrawalProof[]> {\n const result = await this.call<WithdrawalProof[]>(\n `${chain}_get_withdrawal_proof`,\n {\n $wallet_address: walletAddress,\n }\n );\n\n return result\n .mapRight((rows) => {\n // Return the array of withdrawal proofs\n // May be empty if no unclaimed withdrawals\n return rows || [];\n })\n .throw();\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import {KwilSigner, NodeKwil, WebKwil, Types} from \"@trufnetwork/kwil-js\";\nimport { Either } from \"monads-io\";\nimport { WithdrawalProof } from \"../types/bridge\";\nimport { DateString } from \"../types/other\";\nimport { StreamLocator } from \"../types/stream\";\nimport { CacheAwareResponse, GetRecordOptions, GetIndexOptions, GetIndexChangeOptions, GetFirstRecordOptions } from \"../types/cache\";\nimport { EthereumAddress } from \"../util/EthereumAddress\";\nimport { head } from \"../util/head\";\nimport { StreamId } from \"../util/StreamId\";\nimport { toVisibilityEnum, VisibilityEnum } from \"../util/visibility\";\nimport { CacheMetadataParser } from \"../util/cacheMetadataParser\";\nimport { CacheValidation } from \"../util/cacheValidation\";\nimport {\n MetadataKey,\n MetadataKeyValueMap,\n MetadataTableKey,\n MetadataValueTypeForKey,\n StreamType,\n} from \"./contractValues\";\n// ValueType is available as Types.ValueType\n\nexport interface GetRecordInput {\n stream: StreamLocator;\n from?: number;\n to?: number;\n frozenAt?: number;\n baseTime?: DateString | number;\n prefix?: string;\n}\n\nexport interface GetFirstRecordInput {\n stream: StreamLocator;\n after?: number;\n frozenAt?: number;\n}\n\nexport interface StreamRecord {\n eventTime: number;\n value: string;\n}\n\nexport interface GetIndexChangeInput extends GetRecordInput {\n timeInterval: number;\n}\n\nexport interface ListMetadataByHeightParams {\n /** Key reference filter. Default: empty string */\n key?: string;\n /** Value reference filter. Default: null */\n value?: string;\n /** Start height (inclusive). If null, uses earliest available. */\n fromHeight?: number;\n /** End height (inclusive). If null, uses current height. */\n toHeight?: number;\n /** Maximum number of results to return. Default: 1000 */\n limit?: number;\n /** Number of results to skip for pagination. Default: 0 */\n offset?: number;\n}\n\nexport interface MetadataQueryResult {\n streamId: string;\n dataProvider: string;\n rowId: string;\n valueInt: number | null;\n valueFloat: string | null;\n valueBoolean: boolean | null;\n valueString: string | null;\n valueRef: string | null;\n createdAt: number;\n}\n\nexport class Action {\n protected kwilClient: WebKwil | NodeKwil;\n protected kwilSigner: KwilSigner;\n /** Track if deprecation warnings were already emitted */\n private static _legacyWarnEmitted: Record<string, boolean> = {\n getRecord: false,\n getIndex: false,\n getFirstRecord: false,\n getIndexChange: false,\n };\n constructor(\n kwilClient: WebKwil | NodeKwil,\n kwilSigner: KwilSigner,\n ) {\n this.kwilClient = kwilClient;\n this.kwilSigner = kwilSigner;\n }\n\n /**\n * Executes a stream method with named parameters\n * @param method - The action name to execute\n * @param inputs - Named parameters for the action\n * @param types - Optional type specifications for parameters (e.g., NUMERIC)\n * @returns Transaction receipt\n */\n protected async executeWithNamedParams(\n method: string,\n inputs: Types.NamedParams[],\n types?: Record<string, any>,\n ): Promise<Types.GenericResponse<Types.TxReceipt>> {\n return this.kwilClient.execute({\n namespace: \"main\",\n name: method,\n inputs,\n types,\n description: `TN SDK - Executing method on stream: ${method}`,\n },\n this.kwilSigner,\n );\n }\n\n /**\n * Executes a stream action with a complete ActionBody\n * @param inputs - Complete action body with all execution parameters\n * @param synchronous - Whether to wait for transaction to be mined\n * @returns Transaction receipt\n */\n protected async executeWithActionBody(\n inputs: Types.ActionBody,\n synchronous: boolean = false,\n ): Promise<Types.GenericResponse<Types.TxReceipt>> {\n return this.kwilClient.execute(inputs, this.kwilSigner, synchronous);\n }\n\n /**\n * Calls a method on the stream\n */\n protected async call<T>(\n method: string,\n inputs: Types.NamedParams,\n ): Promise<Either<number, T>> {\n const result = await this.kwilClient.call(\n {\n namespace: \"main\",\n name: method,\n inputs: inputs,\n },\n this.kwilSigner,\n );\n\n if (result.status !== 200) {\n return Either.left(result.status);\n }\n\n return Either.right(result.data?.result as T);\n }\n\n /**\n * @deprecated Use getRecord(stream, options?) to leverage cache support and future-proof parameter handling.\n */\n public async getRecord(input: GetRecordInput): Promise<StreamRecord[]>;\n public async getRecord(stream: StreamLocator, options?: GetRecordOptions): Promise<CacheAwareResponse<StreamRecord[]>>;\n public async getRecord(\n inputOrStream: GetRecordInput | StreamLocator,\n options?: GetRecordOptions\n ): Promise<StreamRecord[] | CacheAwareResponse<StreamRecord[]>> {\n // Handle backward compatibility\n if ('stream' in inputOrStream) {\n // Legacy call format\n const input = inputOrStream as GetRecordInput;\n // emit deprecation warning once\n if (!Action._legacyWarnEmitted.getRecord) {\n Action._legacyWarnEmitted.getRecord = true;\n if (typeof console !== 'undefined' && console.warn) {\n console.warn('[TN SDK] Deprecated signature: getRecord(input). Use getRecord(stream, options?) instead.');\n }\n }\n const prefix = input.prefix ? input.prefix : \"\"\n const result = await this.call<{ event_time: number; value: string }[]>(\n prefix + \"get_record\",\n {\n $data_provider: input.stream.dataProvider.getAddress(),\n $stream_id: input.stream.streamId.getId(),\n $from: input.from,\n $to: input.to,\n $frozen_at: input.frozenAt,\n }\n );\n return result\n .mapRight((result) =>\n result.map((row) => ({\n eventTime: row.event_time,\n value: row.value,\n })),\n )\n .throw();\n }\n \n // New cache-aware call format\n const stream = inputOrStream as StreamLocator;\n \n // Validate options if provided\n if (options) {\n CacheValidation.validateGetRecordOptions(options);\n CacheValidation.validateTimeRange(options.from, options.to);\n }\n \n const prefix = options?.prefix ? options.prefix : \"\"\n const params: any = {\n $data_provider: stream.dataProvider.getAddress(),\n $stream_id: stream.streamId.getId(),\n $from: options?.from,\n $to: options?.to,\n $frozen_at: options?.frozenAt,\n };\n \n if (options?.useCache !== undefined) {\n params.$use_cache = options.useCache;\n }\n \n const result = await this.kwilClient.call(\n {\n namespace: \"main\",\n name: prefix + \"get_record\",\n inputs: params,\n },\n this.kwilSigner,\n );\n \n if (result.status !== 200) {\n throw new Error(`Failed to get record: ${result.status}`);\n }\n \n const data = (result.data?.result as { event_time: number; value: string }[]).map((row) => ({\n eventTime: row.event_time,\n value: row.value,\n }));\n \n let cache = CacheMetadataParser.extractFromResponse(result);\n \n // Enhance cache metadata with SDK-provided context\n if (cache) {\n cache = {\n ...cache,\n streamId: stream.streamId.getId(),\n dataProvider: stream.dataProvider.getAddress(),\n from: options?.from,\n to: options?.to,\n frozenAt: options?.frozenAt,\n rowsServed: data.length\n };\n }\n \n return {\n data,\n cache: cache || undefined,\n logs: result.data?.logs ? CacheMetadataParser.parseLogsForMetadata(result.data.logs) : undefined,\n };\n }\n\n /**\n * Returns the index of the stream within the given date range\n * @deprecated Use getIndex(stream, options?) to leverage cache support and future-proof parameter handling.\n */\n public async getIndex(input: GetRecordInput): Promise<StreamRecord[]>;\n public async getIndex(stream: StreamLocator, options?: GetIndexOptions): Promise<CacheAwareResponse<StreamRecord[]>>;\n public async getIndex(\n inputOrStream: GetRecordInput | StreamLocator,\n options?: GetIndexOptions\n ): Promise<StreamRecord[] | CacheAwareResponse<StreamRecord[]>> {\n // Handle backward compatibility\n if ('stream' in inputOrStream) {\n // Legacy call format\n const input = inputOrStream as GetRecordInput;\n if (!Action._legacyWarnEmitted.getIndex) {\n Action._legacyWarnEmitted.getIndex = true;\n if (typeof console !== 'undefined' && console.warn) {\n console.warn('[TN SDK] Deprecated signature: getIndex(input). Use getIndex(stream, options?) instead.');\n }\n }\n const prefix = input.prefix ? input.prefix : \"\"\n const result = await this.call<{ event_time: number; value: string }[]>(\n prefix + \"get_index\",\n {\n $data_provider: input.stream.dataProvider.getAddress(),\n $stream_id: input.stream.streamId.getId(),\n $from: input.from,\n $to: input.to,\n $frozen_at: input.frozenAt,\n $base_time: input.baseTime,\n }\n );\n return result\n .mapRight((result) =>\n result.map((row) => ({\n eventTime: row.event_time,\n value: row.value,\n })),\n )\n .throw();\n }\n \n // New cache-aware call format\n const stream = inputOrStream as StreamLocator;\n \n // Validate options if provided\n if (options) {\n CacheValidation.validateGetIndexOptions(options);\n CacheValidation.validateTimeRange(options.from, options.to);\n }\n \n const prefix = options?.prefix ? options.prefix : \"\"\n const params: any = {\n $data_provider: stream.dataProvider.getAddress(),\n $stream_id: stream.streamId.getId(),\n $from: options?.from,\n $to: options?.to,\n $frozen_at: options?.frozenAt,\n $base_time: options?.baseTime,\n };\n \n if (options?.useCache !== undefined) {\n params.$use_cache = options.useCache;\n }\n \n const result = await this.kwilClient.call(\n {\n namespace: \"main\",\n name: prefix + \"get_index\",\n inputs: params,\n },\n this.kwilSigner,\n );\n \n if (result.status !== 200) {\n throw new Error(`Failed to get index: ${result.status}`);\n }\n \n const data = (result.data?.result as { event_time: number; value: string }[]).map((row) => ({\n eventTime: row.event_time,\n value: row.value,\n }));\n \n let cache = CacheMetadataParser.extractFromResponse(result);\n \n // Enhance cache metadata with SDK-provided context\n if (cache) {\n cache = {\n ...cache,\n streamId: stream.streamId.getId(),\n dataProvider: stream.dataProvider.getAddress(),\n from: options?.from,\n to: options?.to,\n frozenAt: options?.frozenAt,\n rowsServed: data.length\n };\n }\n \n return {\n data,\n cache: cache || undefined,\n logs: result.data?.logs ? CacheMetadataParser.parseLogsForMetadata(result.data.logs) : undefined\n };\n }\n\n /**\n * Returns the type of the stream\n */\n public async getType(\n stream: StreamLocator,\n ): Promise<StreamType> {\n const result = await this.getMetadata(\n stream,\n MetadataKey.TypeKey);\n\n if (!result) {\n throw new Error(\"Failed to get stream type\");\n }\n\n const type = head(result).unwrapOrElse(() => {\n throw new Error(\n \"Failed to get stream type. Check if the stream is initialized.\",\n );\n });\n\n const validTypes = [StreamType.Primitive, StreamType.Composed];\n\n if (!validTypes.includes(type.value as StreamType)) {\n throw new Error(`Invalid stream type: ${type.value}`);\n }\n\n return type.value as StreamType;\n }\n\n /**\n * Returns the first record of the stream\n * @deprecated Use getFirstRecord(stream, options?) to leverage cache support and future-proof parameter handling.\n */\n public async getFirstRecord(\n input: GetFirstRecordInput,\n ): Promise<StreamRecord | null>;\n public async getFirstRecord(\n stream: StreamLocator,\n options?: GetFirstRecordOptions\n ): Promise<CacheAwareResponse<StreamRecord | null>>;\n public async getFirstRecord(\n inputOrStream: GetFirstRecordInput | StreamLocator,\n options?: GetFirstRecordOptions\n ): Promise<StreamRecord | null | CacheAwareResponse<StreamRecord | null>> {\n // Handle backward compatibility\n if ('stream' in inputOrStream) {\n // Legacy call format\n const input = inputOrStream as GetFirstRecordInput;\n if (!Action._legacyWarnEmitted.getFirstRecord) {\n Action._legacyWarnEmitted.getFirstRecord = true;\n if (typeof console !== 'undefined' && console.warn) {\n console.warn('[TN SDK] Deprecated signature: getFirstRecord(input). Use getFirstRecord(stream, options?) instead.');\n }\n }\n const result = await this.call<{ event_time: number; value: string }[]>(\n \"get_first_record\",\n {\n $data_provider: input.stream.dataProvider.getAddress(),\n $stream_id: input.stream.streamId.getId(),\n $after: input.after,\n $frozen_at: input.frozenAt,\n }\n );\n\n return result\n .mapRight(head)\n .mapRight((result) =>\n result\n .map((result) => ({\n eventTime: result.event_time,\n value: result.value,\n }))\n .unwrapOr(null),\n )\n .throw();\n }\n \n // New cache-aware call format\n const stream = inputOrStream as StreamLocator;\n \n // Validate options if provided\n if (options) {\n CacheValidation.validateGetFirstRecordOptions(options);\n }\n \n const params: any = {\n $data_provider: stream.dataProvider.getAddress(),\n $stream_id: stream.streamId.getId(),\n $after: options?.after,\n $frozen_at: options?.frozenAt,\n };\n \n if (options?.useCache !== undefined) {\n params.$use_cache = options.useCache;\n }\n \n const result = await this.kwilClient.call(\n {\n namespace: \"main\",\n name: \"get_first_record\",\n inputs: params,\n },\n this.kwilSigner,\n );\n \n if (result.status !== 200) {\n throw new Error(`Failed to get first record: ${result.status}`);\n }\n \n const rawData = result.data?.result as { event_time: number; value: string }[];\n const data = rawData && rawData.length > 0 ? {\n eventTime: rawData[0].event_time,\n value: rawData[0].value,\n } : null;\n \n let cache = CacheMetadataParser.extractFromResponse(result);\n \n // Enhance cache metadata with SDK-provided context\n if (cache) {\n cache = {\n ...cache,\n streamId: stream.streamId.getId(),\n dataProvider: stream.dataProvider.getAddress(),\n frozenAt: options?.frozenAt,\n rowsServed: data ? 1 : 0\n };\n }\n \n return {\n data,\n cache: cache || undefined,\n logs: result.data?.logs ? CacheMetadataParser.parseLogsForMetadata(result.data.logs) : undefined\n };\n }\n\n protected async setMetadata<K extends MetadataKey>(\n stream: StreamLocator,\n key: K,\n value: MetadataValueTypeForKey<K>,\n ): Promise<Types.GenericResponse<Types.TxReceipt>> {\n return await this.executeWithNamedParams(\"insert_metadata\", [{\n $data_provider: stream.dataProvider.getAddress(),\n $stream_id: stream.streamId.getId(),\n $key: key,\n $value: value,\n $val_type: MetadataKeyValueMap[key],\n },\n ]);\n }\n\n protected async getMetadata<K extends MetadataKey>(\n stream: StreamLocator,\n key: K,\n // onlyLatest: boolean = true,\n filteredRef?: string,\n limit?: number,\n offset?: number,\n orderBy?: string,\n ): Promise<\n { rowId: string; value: MetadataValueTypeForKey<K>; createdAt: number }[]\n > {\n const result = await this.call<\n {\n row_id: string;\n value_i: number;\n value_f: string;\n value_b: boolean;\n value_s: string;\n value_ref: string;\n created_at: number;\n }[]\n >(\"get_metadata\", {\n $data_provider: stream.dataProvider.getAddress(),\n $stream_id: stream.streamId.getId(),\n $key: key,\n $ref: filteredRef,\n $limit: limit,\n $offset: offset,\n $order_by: orderBy,\n },\n );\n return result\n .mapRight((result) =>\n result.map((row) => ({\n rowId: row.row_id,\n value: row[\n MetadataTableKey[MetadataKeyValueMap[key as MetadataKey]]\n ] as MetadataValueTypeForKey<K>,\n createdAt: row.created_at,\n })),\n )\n .throw();\n }\n\n public async listMetadataByHeight<K extends MetadataKey>(\n params: ListMetadataByHeightParams = {},\n ): Promise<MetadataQueryResult[]> {\n type MetadataRawResult = {\n stream_id: string;\n data_provider: string;\n row_id: string;\n value_i: number | null;\n value_f: string | null;\n value_b: boolean | null;\n value_s: string | null;\n value_ref: string | null;\n created_at: number;\n }[];\n const result = await this.call<MetadataRawResult>(\n \"list_metadata_by_height\",\n {\n $key: params.key ?? \"\",\n $ref: params.value ?? null,\n $from_height: params.fromHeight ?? null,\n $to_height: params.toHeight ?? null,\n $limit: params.limit ?? null,\n $offset: params.offset ?? null,\n },\n );\n\n return result\n .mapRight((records) => \n records.map(record => ({\n streamId: record.stream_id,\n dataProvider: record.data_provider,\n rowId: record.row_id,\n valueInt: record.value_i,\n valueFloat: record.value_f,\n valueBoolean: record.value_b,\n valueString: record.value_s,\n valueRef: record.value_ref,\n createdAt: record.created_at,\n }))\n )\n .throw();\n }\n\n /**\n * Sets the read visibility of the stream\n */\n public async setReadVisibility(\n stream: StreamLocator,\n visibility: VisibilityEnum,\n ): Promise<Types.GenericResponse<Types.TxReceipt>> {\n return await this.setMetadata(\n stream,\n MetadataKey.ReadVisibilityKey,\n visibility.toString(),\n );\n }\n\n /**\n * Returns the read visibility of the stream\n */\n public async getReadVisibility(\n stream: StreamLocator,\n ): Promise<VisibilityEnum | null> {\n const result = await this.getMetadata(\n stream,\n MetadataKey.ReadVisibilityKey);\n\n return head(result)\n .map((row) => toVisibilityEnum(row.value))\n .unwrapOr(null);\n }\n\n /**\n * Sets the compose visibility of the stream\n */\n public async setComposeVisibility(\n stream: StreamLocator,\n visibility: VisibilityEnum,\n ): Promise<Types.GenericResponse<Types.TxReceipt>> {\n return await this.setMetadata(\n stream,\n MetadataKey.ComposeVisibilityKey,\n visibility.toString(),\n );\n }\n\n /**\n * Returns the compose visibility of the stream\n */\n public async getComposeVisibility(\n stream: StreamLocator,\n ): Promise<VisibilityEnum | null> {\n const result = await this.getMetadata(\n stream,\n MetadataKey.ComposeVisibilityKey);\n\n return head(result)\n .map((row) => toVisibilityEnum(row.value))\n .unwrapOr(null);\n }\n\n /**\n * Allows a wallet to read the stream\n */\n public async allowReadWallet(\n stream: StreamLocator,\n wallet: EthereumAddress,\n ): Promise<Types.GenericResponse<Types.TxReceipt>> {\n return await this.setMetadata(\n stream,\n MetadataKey.AllowReadWalletKey,\n wallet.getAddress(),\n );\n }\n\n /**\n * Disables a wallet from reading the stream\n */\n public async disableReadWallet(\n stream: StreamLocator,\n wallet: EthereumAddress,\n ): Promise<Types.GenericResponse<Types.TxReceipt>> {\n const result = await this.getMetadata(\n stream,\n MetadataKey.AllowReadWalletKey,\n wallet.getAddress(),\n );\n\n const row_id = head(result)\n .map((row) => row.rowId)\n .unwrapOr(null);\n\n if (!row_id) {\n throw new Error(\"Wallet not found in allowed list\");\n }\n\n return await this.disableMetadata(stream, row_id);\n }\n\n /**\n * Allows a stream to use this stream as child\n */\n public async allowComposeStream(\n stream: StreamLocator,\n wallet: StreamLocator,\n ): Promise<Types.GenericResponse<Types.TxReceipt>> {\n return await this.setMetadata(\n stream,\n MetadataKey.AllowComposeStreamKey,\n wallet.streamId.getId(),\n );\n }\n\n /**\n * Disables a stream from using this stream as child\n */\n public async disableComposeStream(\n stream: StreamLocator,\n wallet: StreamLocator,\n ): Promise<Types.GenericResponse<Types.TxReceipt>> {\n const result = await this.getMetadata(\n stream,\n MetadataKey.AllowComposeStreamKey,\n wallet.toString(),\n );\n\n const row_id = head(result)\n .map((row) => row.rowId)\n .unwrapOr(null);\n\n if (!row_id) {\n throw new Error(\"Stream not found in allowed list\");\n }\n\n return await this.disableMetadata(stream, row_id);\n }\n\n protected async disableMetadata(\n stream: StreamLocator,\n rowId: string,\n ): Promise<Types.GenericResponse<Types.TxReceipt>> {\n return await this.executeWithNamedParams(\"disable_metadata\", [{\n $data_provider: stream.dataProvider.getAddress(),\n $stream_id: stream.streamId.getId(),\n $row_id: rowId,\n }]);\n }\n\n /**\n * Returns the wallets allowed to read the stream\n */\n public async getAllowedReadWallets(\n stream: StreamLocator,\n ): Promise<EthereumAddress[]> {\n const result = await this.getMetadata(\n stream,\n MetadataKey.AllowReadWalletKey);\n\n return result\n .filter((row) => row.value)\n .map((row) => new EthereumAddress(row.value));\n }\n\n /**\n * Returns the streams allowed to compose the stream\n */\n public async getAllowedComposeStreams(\n stream: StreamLocator,\n ): Promise<StreamLocator[]> {\n const result = await this.getMetadata(\n stream,\n MetadataKey.AllowComposeStreamKey);\n\n return result\n .filter((row) => row.value)\n .map((row) => {\n const [streamId, dataProvider] = row.value.split(\":\");\n return {\n streamId: StreamId.fromString(streamId).throw(),\n dataProvider: new EthereumAddress(dataProvider),\n };\n });\n }\n\n /**\n * Returns the index change of the stream within the given date range\n * @deprecated Use getIndexChange(stream, options) to leverage cache support and future-proof parameter handling.\n */\n public async getIndexChange(\n input: GetIndexChangeInput,\n ): Promise<StreamRecord[]>;\n public async getIndexChange(\n stream: StreamLocator,\n options: GetIndexChangeOptions\n ): Promise<CacheAwareResponse<StreamRecord[]>>;\n public async getIndexChange(\n inputOrStream: GetIndexChangeInput | StreamLocator,\n options?: GetIndexChangeOptions\n ): Promise<StreamRecord[] | CacheAwareResponse<StreamRecord[]>> {\n // Handle backward compatibility\n if ('stream' in inputOrStream) {\n // Legacy call format\n const input = inputOrStream as GetIndexChangeInput;\n if (!Action._legacyWarnEmitted.getIndexChange) {\n Action._legacyWarnEmitted.getIndexChange = true;\n if (typeof console !== 'undefined' && console.warn) {\n console.warn('[TN SDK] Deprecated signature: getIndexChange(input). Use getIndexChange(stream, options?) instead.');\n }\n }\n const result = await this.call<{ event_time: number; value: string }[]>(\n \"get_index_change\", \n {\n $data_provider: input.stream.dataProvider.getAddress(),\n $stream_id: input.stream.streamId.getId(),\n $from: input.from,\n $to: input.to,\n $frozen_at: input.frozenAt,\n $base_time: input.baseTime,\n $time_interval: input.timeInterval,\n }\n );\n\n return result\n .mapRight((result) =>\n result.map((row) => ({\n eventTime: row.event_time,\n value: row.value,\n })),\n )\n .throw();\n }\n \n // New cache-aware call format\n const stream = inputOrStream as StreamLocator;\n if (!options) {\n throw new Error('Options parameter is required for cache-aware getIndexChange');\n }\n \n // Validate options\n CacheValidation.validateGetIndexChangeOptions(options);\n CacheValidation.validateTimeRange(options.from, options.to);\n \n const params: any = {\n $data_provider: stream.dataProvider.getAddress(),\n $stream_id: stream.streamId.getId(),\n $from: options.from,\n $to: options.to,\n $frozen_at: options.frozenAt,\n $base_time: options.baseTime,\n $time_interval: options.timeInterval,\n };\n \n if (options.useCache !== undefined) {\n params.$use_cache = options.useCache;\n }\n \n const result = await this.kwilClient.call(\n {\n namespace: \"main\",\n name: \"get_index_change\",\n inputs: params,\n },\n this.kwilSigner,\n );\n \n if (result.status !== 200) {\n throw new Error(`Failed to get index change: ${result.status}`);\n }\n \n const data = (result.data?.result as { event_time: number; value: string }[]).map((row) => ({\n eventTime: row.event_time,\n value: row.value,\n }));\n \n let cache = CacheMetadataParser.extractFromResponse(result);\n \n // Enhance cache metadata with SDK-provided context\n if (cache) {\n cache = {\n ...cache,\n streamId: stream.streamId.getId(),\n dataProvider: stream.dataProvider.getAddress(),\n from: options.from,\n to: options.to,\n frozenAt: options.frozenAt,\n rowsServed: data.length\n };\n }\n \n return {\n data,\n cache: cache || undefined,\n logs: result.data?.logs ? CacheMetadataParser.parseLogsForMetadata(result.data.logs) : undefined\n };\n }\n\n /**\n * A custom method that accepts the procedure name and the input of GetRecordInput\n * Returns the result of the procedure in the same format as StreamRecord\n * I.e. a custom procedure named \"get_price\" that returns a list of date_value and value\n * can be called with customGetProcedure(\"get_price\", { dateFrom: \"2021-01-01\", dateTo: \"2021-01-31\" })\n */\n public async customGetProcedure(\n procedure: string,\n input: GetRecordInput,\n ): Promise<StreamRecord[]> {\n const result = await this.call<{ event_time: number; value: string }[]>(\n procedure,\n {\n $data_provider: input.stream.dataProvider.getAddress(),\n $stream_id: input.stream.streamId.getId(),\n $from: input.from,\n $to: input.to,\n $frozen_at: input.frozenAt\n }\n );\n return result\n .mapRight((result) =>\n result.map((row) => ({\n eventTime: row.event_time,\n value: row.value,\n })),\n )\n .throw();\n }\n\n\n /**\n * A custom method that accepts the procedure name and custom input of type Record<string, any>\n * Returns the result of the procedure in the same format as StreamRecord\n * I.e. a custom procedure named \"get_custom_index\" that returns a list of date_value and value\n * can be called with customProcedureWithArgs(\"get_custom_index\", { $customArg1: \"value1\", $customArg2: \"value2\" })\n * where $customArg1 and $customArg2 are the arguments of the procedure\n * @param procedure\n * @param args\n */\n public async customProcedureWithArgs(\n procedure: string,\n args: Record<string, Types.ValueType | Types.ValueType[]>,\n ){\n const result = await this.call<{ event_time: number; value: string }[]>(\n procedure,\n args\n );\n return result\n .mapRight((result) =>\n result.map((row) => ({\n eventTime: row.event_time,\n value: row.value,\n })),\n )\n .throw();\n }\n\n /**\n * Returns the size of database\n */\n public async getDatabaseSize(): Promise<BigInt> {\n const result = await this.call<{ database_size: BigInt }[]>(\"get_database_size_v2\", {})\n return result\n .map((rows) => {\n const raw = rows[0].database_size;\n const asBigInt = BigInt(raw.toString());\n return asBigInt;\n }).throw();\n }\n\n /**\n * Returns the size of database in human-readable format (e.g., \"22 GB\", \"1.5 TB\")\n */\n public async getDatabaseSizePretty(): Promise<string> {\n const result = await this.call<{ database_size_pretty: string }[]>(\"get_database_size_v2_pretty\", {})\n return result\n .map((rows) => rows[0].database_size_pretty)\n .throw();\n }\n\n /**\n * Gets the wallet balance for a specific bridge instance\n * @param bridgeIdentifier The bridge instance identifier (e.g., \"sepolia\", \"hoodi_tt\", \"ethereum\")\n * This corresponds to the bridge instance name in TN (e.g., hoodi_tt for Hoodi Test Token bridge)\n * @param walletAddress The wallet address to check balance for\n * @returns Promise that resolves to the balance as a string (in wei), or throws on error\n * @example\n * ```typescript\n * // Simple case - identifier matches network name\n * const balance = await action.getWalletBalance(\"sepolia\", \"0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb\");\n *\n * // Multi-token bridge - specify bridge instance explicitly\n * const balance = await action.getWalletBalance(\"hoodi_tt\", \"0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb\");\n * ```\n */\n public async getWalletBalance(\n bridgeIdentifier: string,\n walletAddress: string\n ): Promise<string> {\n const result = await this.call<{ balance?: string; }[]>(\n `${bridgeIdentifier}_wallet_balance`,\n {\n $wallet_address: walletAddress,\n }\n );\n\n return result\n .mapRight((rows) => {\n if (rows.length === 0) {\n throw new Error(\"You don't have necessary permissions to execute this query\");\n }\n\n const row = rows[0];\n\n if (row.balance === undefined) {\n throw new Error(\"No balance returned from wallet balance query\");\n }\n\n return row.balance;\n })\n .throw();\n }\n\n /**\n * Calls the whoami action to get the caller's wallet address\n * This is useful for verifying wallet authentication with TN\n * @returns Promise that resolves to the caller's wallet address\n */\n public async whoami(): Promise<string> {\n const result = await this.call<{ caller: string }[]>(\n \"whoami\",\n {}\n );\n\n return result\n .mapRight((rows) => {\n if (rows.length === 0) {\n throw new Error(\"No response from whoami action\");\n }\n \n const row = rows[0];\n \n if (!row.caller) {\n throw new Error(\"No caller address returned from whoami\");\n }\n \n return row.caller;\n })\n .throw();\n }\n\n /**\n * Bridges tokens by initiating a withdrawal from TN to a blockchain network\n * @param bridgeIdentifier The bridge instance identifier (e.g., \"sepolia\", \"hoodi_tt\", \"ethereum\")\n * @param amount The amount to bridge in wei (as string to preserve precision)\n * @param recipient The recipient address on the destination chain\n * @returns Promise that resolves to transaction receipt\n * @example\n * ```typescript\n * // Bridge 100 tokens from TN to Sepolia\n * const receipt = await action.bridgeTokens(\"sepolia\", \"100000000000000000000\", \"0x742d35Cc...\");\n *\n * // Bridge from TN to Hoodi Test Token bridge\n * const receipt = await action.bridgeTokens(\"hoodi_tt\", \"50000000000000000000\", \"0x742d35Cc...\");\n * ```\n */\n public async bridgeTokens(\n bridgeIdentifier: string,\n amount: string,\n recipient: string\n ): Promise<Types.GenericResponse<Types.TxReceipt>> {\n // Validate amount is greater than 0\n const numAmount = parseFloat(amount);\n if (isNaN(numAmount) || numAmount <= 0) {\n throw new Error(`Invalid amount: ${amount}. Amount must be greater than 0.`);\n }\n\n return await this.executeWithNamedParams(`${bridgeIdentifier}_bridge_tokens`, [{\n $recipient: recipient,\n $amount: amount\n }]);\n }\n\n /**\n * Lists wallet rewards for a specific bridge instance\n * @param bridgeIdentifier The bridge instance identifier (e.g., \"sepolia\", \"hoodi_tt\")\n * @param wallet The wallet address to list rewards for\n * @param withPending Whether to include pending rewards\n * @returns Promise that resolves to array of reward records\n * @deprecated This method uses the extension namespace directly. Most users should use getWithdrawalProof instead.\n */\n public async listWalletRewards(\n bridgeIdentifier: string,\n wallet: string,\n withPending: boolean\n ): Promise<any[]> {\n const result = await this.kwilClient.call(\n {\n namespace: `${bridgeIdentifier}_bridge`,\n name: \"list_wallet_rewards\",\n inputs: {\n $param_1: wallet,\n $param_2: withPending,\n },\n },\n this.kwilSigner,\n );\n\n if (result.status !== 200) {\n throw new Error(`Failed to list wallet rewards: ${result.status}`);\n }\n\n return result.data?.result || [];\n }\n\n /**\n * Gets withdrawal proof for a wallet address on a specific bridge instance\n * Returns merkle proofs and validator signatures needed for claiming withdrawals on the destination chain\n *\n * This method is used for non-custodial bridge withdrawals where users need to\n * manually claim their withdrawals by submitting proofs to the destination chain contract.\n *\n * @param bridgeIdentifier The bridge instance identifier (e.g., \"hoodi_tt\", \"sepolia\", \"ethereum\")\n * @param walletAddress The wallet address to get withdrawal proof for\n * @returns Promise that resolves to array of withdrawal proofs (empty array if no unclaimed withdrawals)\n *\n * @example\n * ```typescript\n * // Get withdrawal proofs for Hoodi Test Token bridge\n * const proofs = await action.getWithdrawalProof(\"hoodi_tt\", \"0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb\");\n * // Returns: [{ chain: \"hoodi\", recipient: \"0x...\", amount: \"100000000000000000000\", proofs: [...], signatures: [...] }]\n *\n * // Use the proofs to claim withdrawal on destination chain\n * if (proofs.length > 0) {\n * const proof = proofs[0];\n * await bridgeContract.claimWithdrawal(proof.recipient, proof.amount, proof.root, proof.proofs, proof.signatures);\n * }\n * ```\n *\n * @note This method has been tested via integration tests in the node repository.\n * See: https://github.com/trufnetwork/kwil-db/blob/main/node/exts/erc20-bridge/erc20/meta_extension_withdrawal_test.go\n */\n public async getWithdrawalProof(\n bridgeIdentifier: string,\n walletAddress: string\n ): Promise<WithdrawalProof[]> {\n const result = await this.call<WithdrawalProof[]>(\n `${bridgeIdentifier}_get_withdrawal_proof`,\n {\n $wallet_address: walletAddress,\n }\n );\n\n return result\n .mapRight((rows) => {\n // Return the array of withdrawal proofs\n // May be empty if no unclaimed withdrawals\n return rows || [];\n })\n .throw();\n }\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,uBAAuB;AAKvB,6BAAgC;AAChC,kBAAqB;AACrB,sBAAyB;AACzB,wBAAiD;AACjD,iCAAoC;AACpC,6BAAgC;AAChC,4BAMO;AAsDA,IAAM,SAAN,MAAM,QAAO;AAAA,EACR;AAAA,EACA;AAAA;AAAA,EAEV,OAAe,qBAA8C;AAAA,IAC3D,WAAW;AAAA,IACX,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,EAClB;AAAA,EACA,YACE,YACA,YACA;AACA,SAAK,aAAa;AAClB,SAAK,aAAa;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAgB,uBACd,QACA,QACA,OACiD;AACjD,WAAO,KAAK,WAAW;AAAA,MAAQ;AAAA,QACzB,WAAW;AAAA,QACX,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA,aAAa,wCAAwC,MAAM;AAAA,MAC7D;AAAA,MACA,KAAK;AAAA,IACL;AAAA,EACN;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAgB,sBACd,QACA,cAAuB,OAC0B;AACjD,WAAO,KAAK,WAAW,QAAQ,QAAQ,KAAK,YAAY,WAAW;AAAA,EACrE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAgB,KACd,QACA,QAC4B;AAC5B,UAAM,SAAS,MAAM,KAAK,WAAW;AAAA,MACnC;AAAA,QACE,WAAW;AAAA,QACX,MAAM;AAAA,QACN;AAAA,MACF;AAAA,MACA,KAAK;AAAA,IACP;AAEA,QAAI,OAAO,WAAW,KAAK;AACzB,aAAO,wBAAO,KAAK,OAAO,MAAM;AAAA,IAClC;AAEA,WAAO,wBAAO,MAAM,OAAO,MAAM,MAAW;AAAA,EAC9C;AAAA,EAOA,MAAa,UACX,eACA,SAC8D;AAE9D,QAAI,YAAY,eAAe;AAE7B,YAAM,QAAQ;AAEd,UAAI,CAAC,QAAO,mBAAmB,WAAW;AACxC,gBAAO,mBAAmB,YAAY;AACtC,YAAI,OAAO,YAAY,eAAe,QAAQ,MAAM;AAClD,kBAAQ,KAAK,2FAA2F;AAAA,QAC1G;AAAA,MACF;AACA,YAAMA,UAAS,MAAM,SAAS,MAAM,SAAS;AAC7C,YAAMC,UAAS,MAAM,KAAK;AAAA,QACtBD,UAAS;AAAA,QACT;AAAA,UACE,gBAAgB,MAAM,OAAO,aAAa,WAAW;AAAA,UACrD,YAAY,MAAM,OAAO,SAAS,MAAM;AAAA,UACxC,OAAO,MAAM;AAAA,UACb,KAAK,MAAM;AAAA,UACX,YAAY,MAAM;AAAA,QACpB;AAAA,MACJ;AACA,aAAOC,QACJ;AAAA,QAAS,CAACA,YACTA,QAAO,IAAI,CAAC,SAAS;AAAA,UACnB,WAAW,IAAI;AAAA,UACf,OAAO,IAAI;AAAA,QACb,EAAE;AAAA,MACJ,EACC,MAAM;AAAA,IACX;AAGA,UAAM,SAAS;AAGf,QAAI,SAAS;AACX,6CAAgB,yBAAyB,OAAO;AAChD,6CAAgB,kBAAkB,QAAQ,MAAM,QAAQ,EAAE;AAAA,IAC5D;AAEA,UAAM,SAAS,SAAS,SAAS,QAAQ,SAAS;AAClD,UAAM,SAAc;AAAA,MAClB,gBAAgB,OAAO,aAAa,WAAW;AAAA,MAC/C,YAAY,OAAO,SAAS,MAAM;AAAA,MAClC,OAAO,SAAS;AAAA,MAChB,KAAK,SAAS;AAAA,MACd,YAAY,SAAS;AAAA,IACvB;AAEA,QAAI,SAAS,aAAa,QAAW;AACnC,aAAO,aAAa,QAAQ;AAAA,IAC9B;AAEA,UAAM,SAAS,MAAM,KAAK,WAAW;AAAA,MACnC;AAAA,QACE,WAAW;AAAA,QACX,MAAM,SAAS;AAAA,QACf,QAAQ;AAAA,MACV;AAAA,MACA,KAAK;AAAA,IACP;AAEA,QAAI,OAAO,WAAW,KAAK;AACzB,YAAM,IAAI,MAAM,yBAAyB,OAAO,MAAM,EAAE;AAAA,IAC1D;AAEA,UAAM,QAAQ,OAAO,MAAM,QAAmD,IAAI,CAAC,SAAS;AAAA,MAC1F,WAAW,IAAI;AAAA,MACf,OAAO,IAAI;AAAA,IACb,EAAE;AAEF,QAAI,QAAQ,+CAAoB,oBAAoB,MAAM;AAG1D,QAAI,OAAO;AACT,cAAQ;AAAA,QACN,GAAG;AAAA,QACH,UAAU,OAAO,SAAS,MAAM;AAAA,QAChC,cAAc,OAAO,aAAa,WAAW;AAAA,QAC7C,MAAM,SAAS;AAAA,QACf,IAAI,SAAS;AAAA,QACb,UAAU,SAAS;AAAA,QACnB,YAAY,KAAK;AAAA,MACnB;AAAA,IACF;AAEA,WAAO;AAAA,MACL;AAAA,MACA,OAAO,SAAS;AAAA,MAChB,MAAM,OAAO,MAAM,OAAO,+CAAoB,qBAAqB,OAAO,KAAK,IAAI,IAAI;AAAA,IACzF;AAAA,EACF;AAAA,EAQA,MAAa,SACX,eACA,SAC8D;AAE9D,QAAI,YAAY,eAAe;AAE7B,YAAM,QAAQ;AACd,UAAI,CAAC,QAAO,mBAAmB,UAAU;AACvC,gBAAO,mBAAmB,WAAW;AACrC,YAAI,OAAO,YAAY,eAAe,QAAQ,MAAM;AAClD,kBAAQ,KAAK,yFAAyF;AAAA,QACxG;AAAA,MACF;AACA,YAAMD,UAAS,MAAM,SAAS,MAAM,SAAS;AAC7C,YAAMC,UAAS,MAAM,KAAK;AAAA,QACxBD,UAAS;AAAA,QACP;AAAA,UACE,gBAAgB,MAAM,OAAO,aAAa,WAAW;AAAA,UACrD,YAAY,MAAM,OAAO,SAAS,MAAM;AAAA,UACxC,OAAO,MAAM;AAAA,UACb,KAAK,MAAM;AAAA,UACX,YAAY,MAAM;AAAA,UAClB,YAAY,MAAM;AAAA,QACpB;AAAA,MACJ;AACA,aAAOC,QACJ;AAAA,QAAS,CAACA,YACTA,QAAO,IAAI,CAAC,SAAS;AAAA,UACnB,WAAW,IAAI;AAAA,UACf,OAAO,IAAI;AAAA,QACb,EAAE;AAAA,MACJ,EACC,MAAM;AAAA,IACX;AAGA,UAAM,SAAS;AAGf,QAAI,SAAS;AACX,6CAAgB,wBAAwB,OAAO;AAC/C,6CAAgB,kBAAkB,QAAQ,MAAM,QAAQ,EAAE;AAAA,IAC5D;AAEA,UAAM,SAAS,SAAS,SAAS,QAAQ,SAAS;AAClD,UAAM,SAAc;AAAA,MAClB,gBAAgB,OAAO,aAAa,WAAW;AAAA,MAC/C,YAAY,OAAO,SAAS,MAAM;AAAA,MAClC,OAAO,SAAS;AAAA,MAChB,KAAK,SAAS;AAAA,MACd,YAAY,SAAS;AAAA,MACrB,YAAY,SAAS;AAAA,IACvB;AAEA,QAAI,SAAS,aAAa,QAAW;AACnC,aAAO,aAAa,QAAQ;AAAA,IAC9B;AAEA,UAAM,SAAS,MAAM,KAAK,WAAW;AAAA,MACnC;AAAA,QACE,WAAW;AAAA,QACX,MAAM,SAAS;AAAA,QACf,QAAQ;AAAA,MACV;AAAA,MACA,KAAK;AAAA,IACP;AAEA,QAAI,OAAO,WAAW,KAAK;AACzB,YAAM,IAAI,MAAM,wBAAwB,OAAO,MAAM,EAAE;AAAA,IACzD;AAEA,UAAM,QAAQ,OAAO,MAAM,QAAmD,IAAI,CAAC,SAAS;AAAA,MAC1F,WAAW,IAAI;AAAA,MACf,OAAO,IAAI;AAAA,IACb,EAAE;AAEF,QAAI,QAAQ,+CAAoB,oBAAoB,MAAM;AAG1D,QAAI,OAAO;AACT,cAAQ;AAAA,QACN,GAAG;AAAA,QACH,UAAU,OAAO,SAAS,MAAM;AAAA,QAChC,cAAc,OAAO,aAAa,WAAW;AAAA,QAC7C,MAAM,SAAS;AAAA,QACf,IAAI,SAAS;AAAA,QACb,UAAU,SAAS;AAAA,QACnB,YAAY,KAAK;AAAA,MACnB;AAAA,IACF;AAEA,WAAO;AAAA,MACL;AAAA,MACA,OAAO,SAAS;AAAA,MAChB,MAAM,OAAO,MAAM,OAAO,+CAAoB,qBAAqB,OAAO,KAAK,IAAI,IAAI;AAAA,IACzF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,QACT,QACmB;AACrB,UAAM,SAAS,MAAM,KAAK;AAAA,MACtB;AAAA,MACA,kCAAY;AAAA,IAAO;AAEvB,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,MAAM,2BAA2B;AAAA,IAC7C;AAEA,UAAM,WAAO,kBAAK,MAAM,EAAE,aAAa,MAAM;AAC3C,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF,CAAC;AAED,UAAM,aAAa,CAAC,iCAAW,WAAW,iCAAW,QAAQ;AAE7D,QAAI,CAAC,WAAW,SAAS,KAAK,KAAmB,GAAG;AAClD,YAAM,IAAI,MAAM,wBAAwB,KAAK,KAAK,EAAE;AAAA,IACtD;AAEA,WAAO,KAAK;AAAA,EACd;AAAA,EAaA,MAAa,eACX,eACA,SACwE;AAExE,QAAI,YAAY,eAAe;AAE7B,YAAM,QAAQ;AACd,UAAI,CAAC,QAAO,mBAAmB,gBAAgB;AAC7C,gBAAO,mBAAmB,iBAAiB;AAC3C,YAAI,OAAO,YAAY,eAAe,QAAQ,MAAM;AAClD,kBAAQ,KAAK,qGAAqG;AAAA,QACpH;AAAA,MACF;AACA,YAAMA,UAAS,MAAM,KAAK;AAAA,QACxB;AAAA,QACE;AAAA,UACI,gBAAgB,MAAM,OAAO,aAAa,WAAW;AAAA,UACrD,YAAY,MAAM,OAAO,SAAS,MAAM;AAAA,UACxC,QAAQ,MAAM;AAAA,UACd,YAAY,MAAM;AAAA,QACtB;AAAA,MACJ;AAEA,aAAOA,QACJ,SAAS,gBAAI,EACb;AAAA,QAAS,CAACA,YACTA,QACG,IAAI,CAACA,aAAY;AAAA,UAChB,WAAWA,QAAO;AAAA,UAClB,OAAOA,QAAO;AAAA,QAChB,EAAE,EACD,SAAS,IAAI;AAAA,MAClB,EACC,MAAM;AAAA,IACX;AAGA,UAAM,SAAS;AAGf,QAAI,SAAS;AACX,6CAAgB,8BAA8B,OAAO;AAAA,IACvD;AAEA,UAAM,SAAc;AAAA,MAClB,gBAAgB,OAAO,aAAa,WAAW;AAAA,MAC/C,YAAY,OAAO,SAAS,MAAM;AAAA,MAClC,QAAQ,SAAS;AAAA,MACjB,YAAY,SAAS;AAAA,IACvB;AAEA,QAAI,SAAS,aAAa,QAAW;AACnC,aAAO,aAAa,QAAQ;AAAA,IAC9B;AAEA,UAAM,SAAS,MAAM,KAAK,WAAW;AAAA,MACnC;AAAA,QACE,WAAW;AAAA,QACX,MAAM;AAAA,QACN,QAAQ;AAAA,MACV;AAAA,MACA,KAAK;AAAA,IACP;AAEA,QAAI,OAAO,WAAW,KAAK;AACzB,YAAM,IAAI,MAAM,+BAA+B,OAAO,MAAM,EAAE;AAAA,IAChE;AAEA,UAAM,UAAU,OAAO,MAAM;AAC7B,UAAM,OAAO,WAAW,QAAQ,SAAS,IAAI;AAAA,MAC3C,WAAW,QAAQ,CAAC,EAAE;AAAA,MACtB,OAAO,QAAQ,CAAC,EAAE;AAAA,IACpB,IAAI;AAEJ,QAAI,QAAQ,+CAAoB,oBAAoB,MAAM;AAG1D,QAAI,OAAO;AACT,cAAQ;AAAA,QACN,GAAG;AAAA,QACH,UAAU,OAAO,SAAS,MAAM;AAAA,QAChC,cAAc,OAAO,aAAa,WAAW;AAAA,QAC7C,UAAU,SAAS;AAAA,QACnB,YAAY,OAAO,IAAI;AAAA,MACzB;AAAA,IACF;AAEA,WAAO;AAAA,MACL;AAAA,MACA,OAAO,SAAS;AAAA,MAChB,MAAM,OAAO,MAAM,OAAO,+CAAoB,qBAAqB,OAAO,KAAK,IAAI,IAAI;AAAA,IACzF;AAAA,EACF;AAAA,EAEA,MAAgB,YACd,QACA,KACA,OACiD;AACjD,WAAO,MAAM,KAAK,uBAAuB,mBAAmB;AAAA,MAAC;AAAA,QACzD,gBAAgB,OAAO,aAAa,WAAW;AAAA,QAC/C,YAAY,OAAO,SAAS,MAAM;AAAA,QAClC,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,WAAW,0CAAoB,GAAG;AAAA,MAClC;AAAA,IACJ,CAAC;AAAA,EACH;AAAA,EAEA,MAAgB,YACd,QACA,KAEA,aACA,OACA,QACA,SAGA;AACA,UAAM,SAAS,MAAM,KAAK;AAAA,MAUxB;AAAA,MAAgB;AAAA,QACd,gBAAgB,OAAO,aAAa,WAAW;AAAA,QAC/C,YAAY,OAAO,SAAS,MAAM;AAAA,QAClC,MAAM;AAAA,QACN,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,WAAW;AAAA,MACX;AAAA,IACJ;AACA,WAAO,OACJ;AAAA,MAAS,CAACA,YACTA,QAAO,IAAI,CAAC,SAAS;AAAA,QACnB,OAAO,IAAI;AAAA,QACX,OAAO,IACL,uCAAiB,0CAAoB,GAAkB,CAAC,CAC1D;AAAA,QACA,WAAW,IAAI;AAAA,MACjB,EAAE;AAAA,IACJ,EACC,MAAM;AAAA,EACX;AAAA,EAEA,MAAa,qBACX,SAAqC,CAAC,GACN;AAYhC,UAAM,SAAS,MAAM,KAAK;AAAA,MACxB;AAAA,MACA;AAAA,QACE,MAAM,OAAO,OAAO;AAAA,QACpB,MAAM,OAAO,SAAS;AAAA,QACtB,cAAc,OAAO,cAAc;AAAA,QACnC,YAAY,OAAO,YAAY;AAAA,QAC/B,QAAQ,OAAO,SAAS;AAAA,QACxB,SAAS,OAAO,UAAU;AAAA,MAC5B;AAAA,IACF;AAEA,WAAO,OACJ;AAAA,MAAS,CAAC,YACT,QAAQ,IAAI,aAAW;AAAA,QACrB,UAAU,OAAO;AAAA,QACjB,cAAc,OAAO;AAAA,QACrB,OAAO,OAAO;AAAA,QACd,UAAU,OAAO;AAAA,QACjB,YAAY,OAAO;AAAA,QACnB,cAAc,OAAO;AAAA,QACrB,aAAa,OAAO;AAAA,QACpB,UAAU,OAAO;AAAA,QACjB,WAAW,OAAO;AAAA,MACpB,EAAE;AAAA,IACJ,EACC,MAAM;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,kBACX,QACA,YACiD;AACjD,WAAO,MAAM,KAAK;AAAA,MACd;AAAA,MACF,kCAAY;AAAA,MACZ,WAAW,SAAS;AAAA,IACtB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,kBACT,QAC8B;AAChC,UAAM,SAAS,MAAM,KAAK;AAAA,MACtB;AAAA,MACA,kCAAY;AAAA,IAAiB;AAEjC,eAAO,kBAAK,MAAM,EACf,IAAI,CAAC,YAAQ,oCAAiB,IAAI,KAAK,CAAC,EACxC,SAAS,IAAI;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,qBACX,QACA,YACiD;AACjD,WAAO,MAAM,KAAK;AAAA,MAChB;AAAA,MACA,kCAAY;AAAA,MACZ,WAAW,SAAS;AAAA,IACtB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,qBACT,QAC8B;AAChC,UAAM,SAAS,MAAM,KAAK;AAAA,MACxB;AAAA,MACA,kCAAY;AAAA,IAAoB;AAElC,eAAO,kBAAK,MAAM,EACf,IAAI,CAAC,YAAQ,oCAAiB,IAAI,KAAK,CAAC,EACxC,SAAS,IAAI;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,gBACX,QACA,QACiD;AACjD,WAAO,MAAM,KAAK;AAAA,MAChB;AAAA,MACA,kCAAY;AAAA,MACZ,OAAO,WAAW;AAAA,IACpB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,kBACX,QACA,QACiD;AACjD,UAAM,SAAS,MAAM,KAAK;AAAA,MACxB;AAAA,MACA,kCAAY;AAAA,MACZ,OAAO,WAAW;AAAA,IACpB;AAEA,UAAM,aAAS,kBAAK,MAAM,EACvB,IAAI,CAAC,QAAQ,IAAI,KAAK,EACtB,SAAS,IAAI;AAEhB,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,MAAM,kCAAkC;AAAA,IACpD;AAEA,WAAO,MAAM,KAAK,gBAAgB,QAAQ,MAAM;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,mBACX,QACA,QACiD;AACjD,WAAO,MAAM,KAAK;AAAA,MAChB;AAAA,MACA,kCAAY;AAAA,MACZ,OAAO,SAAS,MAAM;AAAA,IACxB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,qBACX,QACA,QACiD;AACjD,UAAM,SAAS,MAAM,KAAK;AAAA,MACxB;AAAA,MACA,kCAAY;AAAA,MACZ,OAAO,SAAS;AAAA,IAClB;AAEA,UAAM,aAAS,kBAAK,MAAM,EACvB,IAAI,CAAC,QAAQ,IAAI,KAAK,EACtB,SAAS,IAAI;AAEhB,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,MAAM,kCAAkC;AAAA,IACpD;AAEA,WAAO,MAAM,KAAK,gBAAgB,QAAQ,MAAM;AAAA,EAClD;AAAA,EAEA,MAAgB,gBACd,QACA,OACiD;AACjD,WAAO,MAAM,KAAK,uBAAuB,oBAAoB,CAAC;AAAA,MACtD,gBAAgB,OAAO,aAAa,WAAW;AAAA,MAC/C,YAAY,OAAO,SAAS,MAAM;AAAA,MAClC,SAAS;AAAA,IACjB,CAAC,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,sBACX,QAC4B;AAC5B,UAAM,SAAS,MAAM,KAAK;AAAA,MACtB;AAAA,MACA,kCAAY;AAAA,IAAkB;AAElC,WAAO,OACJ,OAAO,CAAC,QAAQ,IAAI,KAAK,EACzB,IAAI,CAAC,QAAQ,IAAI,uCAAgB,IAAI,KAAK,CAAC;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,yBACX,QAC0B;AAC1B,UAAM,SAAS,MAAM,KAAK;AAAA,MACtB;AAAA,MACA,kCAAY;AAAA,IAAqB;AAErC,WAAO,OACJ,OAAO,CAAC,QAAQ,IAAI,KAAK,EACzB,IAAI,CAAC,QAAQ;AACZ,YAAM,CAAC,UAAU,YAAY,IAAI,IAAI,MAAM,MAAM,GAAG;AACpD,aAAO;AAAA,QACL,UAAU,yBAAS,WAAW,QAAQ,EAAE,MAAM;AAAA,QAC9C,cAAc,IAAI,uCAAgB,YAAY;AAAA,MAChD;AAAA,IACF,CAAC;AAAA,EACL;AAAA,EAaA,MAAa,eACX,eACA,SAC8D;AAE9D,QAAI,YAAY,eAAe;AAE7B,YAAM,QAAQ;AACd,UAAI,CAAC,QAAO,mBAAmB,gBAAgB;AAC7C,gBAAO,mBAAmB,iBAAiB;AAC3C,YAAI,OAAO,YAAY,eAAe,QAAQ,MAAM;AAClD,kBAAQ,KAAK,qGAAqG;AAAA,QACpH;AAAA,MACF;AACA,YAAMA,UAAS,MAAM,KAAK;AAAA,QACxB;AAAA,QACE;AAAA,UACE,gBAAgB,MAAM,OAAO,aAAa,WAAW;AAAA,UACrD,YAAY,MAAM,OAAO,SAAS,MAAM;AAAA,UACxC,OAAO,MAAM;AAAA,UACb,KAAK,MAAM;AAAA,UACX,YAAY,MAAM;AAAA,UAClB,YAAY,MAAM;AAAA,UAClB,gBAAgB,MAAM;AAAA,QACxB;AAAA,MACJ;AAEA,aAAOA,QACJ;AAAA,QAAS,CAACA,YACTA,QAAO,IAAI,CAAC,SAAS;AAAA,UACnB,WAAW,IAAI;AAAA,UACf,OAAO,IAAI;AAAA,QACb,EAAE;AAAA,MACJ,EACC,MAAM;AAAA,IACX;AAGA,UAAM,SAAS;AACf,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI,MAAM,8DAA8D;AAAA,IAChF;AAGA,2CAAgB,8BAA8B,OAAO;AACrD,2CAAgB,kBAAkB,QAAQ,MAAM,QAAQ,EAAE;AAE1D,UAAM,SAAc;AAAA,MAClB,gBAAgB,OAAO,aAAa,WAAW;AAAA,MAC/C,YAAY,OAAO,SAAS,MAAM;AAAA,MAClC,OAAO,QAAQ;AAAA,MACf,KAAK,QAAQ;AAAA,MACb,YAAY,QAAQ;AAAA,MACpB,YAAY,QAAQ;AAAA,MACpB,gBAAgB,QAAQ;AAAA,IAC1B;AAEA,QAAI,QAAQ,aAAa,QAAW;AAClC,aAAO,aAAa,QAAQ;AAAA,IAC9B;AAEA,UAAM,SAAS,MAAM,KAAK,WAAW;AAAA,MACnC;AAAA,QACE,WAAW;AAAA,QACX,MAAM;AAAA,QACN,QAAQ;AAAA,MACV;AAAA,MACA,KAAK;AAAA,IACP;AAEA,QAAI,OAAO,WAAW,KAAK;AACzB,YAAM,IAAI,MAAM,+BAA+B,OAAO,MAAM,EAAE;AAAA,IAChE;AAEA,UAAM,QAAQ,OAAO,MAAM,QAAmD,IAAI,CAAC,SAAS;AAAA,MAC1F,WAAW,IAAI;AAAA,MACf,OAAO,IAAI;AAAA,IACb,EAAE;AAEF,QAAI,QAAQ,+CAAoB,oBAAoB,MAAM;AAG1D,QAAI,OAAO;AACT,cAAQ;AAAA,QACN,GAAG;AAAA,QACH,UAAU,OAAO,SAAS,MAAM;AAAA,QAChC,cAAc,OAAO,aAAa,WAAW;AAAA,QAC7C,MAAM,QAAQ;AAAA,QACd,IAAI,QAAQ;AAAA,QACZ,UAAU,QAAQ;AAAA,QAClB,YAAY,KAAK;AAAA,MACnB;AAAA,IACF;AAEA,WAAO;AAAA,MACL;AAAA,MACA,OAAO,SAAS;AAAA,MAChB,MAAM,OAAO,MAAM,OAAO,+CAAoB,qBAAqB,OAAO,KAAK,IAAI,IAAI;AAAA,IACzF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAa,mBACX,WACA,OACyB;AACzB,UAAM,SAAS,MAAM,KAAK;AAAA,MACxB;AAAA,MACE;AAAA,QACE,gBAAgB,MAAM,OAAO,aAAa,WAAW;AAAA,QACrD,YAAY,MAAM,OAAO,SAAS,MAAM;AAAA,QACxC,OAAO,MAAM;AAAA,QACb,KAAK,MAAM;AAAA,QACX,YAAY,MAAM;AAAA,MACpB;AAAA,IACJ;AACA,WAAO,OACJ;AAAA,MAAS,CAACA,YACTA,QAAO,IAAI,CAAC,SAAS;AAAA,QACnB,WAAW,IAAI;AAAA,QACf,OAAO,IAAI;AAAA,MACb,EAAE;AAAA,IACJ,EACC,MAAM;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAa,wBACX,WACA,MACD;AACG,UAAM,SAAS,MAAM,KAAK;AAAA,MACtB;AAAA,MACA;AAAA,IACN;AACA,WAAO,OACJ;AAAA,MAAS,CAACA,YACTA,QAAO,IAAI,CAAC,SAAS;AAAA,QACnB,WAAW,IAAI;AAAA,QACf,OAAO,IAAI;AAAA,MACb,EAAE;AAAA,IACJ,EACC,MAAM;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,kBAAmC;AAC9C,UAAM,SAAS,MAAM,KAAK,KAAkC,wBAAwB,CAAC,CAAC;AACtF,WAAO,OACJ,IAAI,CAAC,SAAS;AACb,YAAM,MAAM,KAAK,CAAC,EAAE;AACpB,YAAM,WAAW,OAAO,IAAI,SAAS,CAAC;AACtC,aAAO;AAAA,IACT,CAAC,EAAE,MAAM;AAAA,EACb;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,wBAAyC;AACpD,UAAM,SAAS,MAAM,KAAK,KAAyC,+BAA+B,CAAC,CAAC;AACpG,WAAO,OACJ,IAAI,CAAC,SAAS,KAAK,CAAC,EAAE,oBAAoB,EAC1C,MAAM;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,MAAa,iBACX,kBACA,eACiB;AACjB,UAAM,SAAS,MAAM,KAAK;AAAA,MACxB,GAAG,gBAAgB;AAAA,MACnB;AAAA,QACE,iBAAiB;AAAA,MACnB;AAAA,IACF;AAEA,WAAO,OACJ,SAAS,CAAC,SAAS;AAClB,UAAI,KAAK,WAAW,GAAG;AACrB,cAAM,IAAI,MAAM,4DAA4D;AAAA,MAC9E;AAEA,YAAM,MAAM,KAAK,CAAC;AAElB,UAAI,IAAI,YAAY,QAAW;AAC7B,cAAM,IAAI,MAAM,+CAA+C;AAAA,MACjE;AAEA,aAAO,IAAI;AAAA,IACb,CAAC,EACA,MAAM;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAa,SAA0B;AACrC,UAAM,SAAS,MAAM,KAAK;AAAA,MACxB;AAAA,MACA,CAAC;AAAA,IACH;AAEA,WAAO,OACJ,SAAS,CAAC,SAAS;AAClB,UAAI,KAAK,WAAW,GAAG;AACrB,cAAM,IAAI,MAAM,gCAAgC;AAAA,MAClD;AAEA,YAAM,MAAM,KAAK,CAAC;AAElB,UAAI,CAAC,IAAI,QAAQ;AACf,cAAM,IAAI,MAAM,wCAAwC;AAAA,MAC1D;AAEA,aAAO,IAAI;AAAA,IACb,CAAC,EACA,MAAM;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,MAAa,aACX,kBACA,QACA,WACiD;AAEjD,UAAM,YAAY,WAAW,MAAM;AACnC,QAAI,MAAM,SAAS,KAAK,aAAa,GAAG;AACtC,YAAM,IAAI,MAAM,mBAAmB,MAAM,kCAAkC;AAAA,IAC7E;AAEA,WAAO,MAAM,KAAK,uBAAuB,GAAG,gBAAgB,kBAAkB,CAAC;AAAA,MAC7E,YAAY;AAAA,MACZ,SAAS;AAAA,IACX,CAAC,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAa,kBACX,kBACA,QACA,aACgB;AAChB,UAAM,SAAS,MAAM,KAAK,WAAW;AAAA,MACnC;AAAA,QACE,WAAW,GAAG,gBAAgB;AAAA,QAC9B,MAAM;AAAA,QACN,QAAQ;AAAA,UACN,UAAU;AAAA,UACV,UAAU;AAAA,QACZ;AAAA,MACF;AAAA,MACA,KAAK;AAAA,IACP;AAEA,QAAI,OAAO,WAAW,KAAK;AACzB,YAAM,IAAI,MAAM,kCAAkC,OAAO,MAAM,EAAE;AAAA,IACnE;AAEA,WAAO,OAAO,MAAM,UAAU,CAAC;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA6BA,MAAa,mBACX,kBACA,eAC4B;AAC5B,UAAM,SAAS,MAAM,KAAK;AAAA,MACxB,GAAG,gBAAgB;AAAA,MACnB;AAAA,QACE,iBAAiB;AAAA,MACnB;AAAA,IACF;AAEA,WAAO,OACJ,SAAS,CAAC,SAAS;AAGlB,aAAO,QAAQ,CAAC;AAAA,IAClB,CAAC,EACA,MAAM;AAAA,EACX;AACF;",
6
6
  "names": ["prefix", "result"]
7
7
  }