{"version":3,"file":"GpaBuilder.cjs","sources":["../../src/GpaBuilder.ts"],"sourcesContent":["import { publicKey, PublicKey } from '@metaplex-foundation/umi-public-keys';\nimport type {\n  Serializer,\n  StructToSerializerTuple,\n} from '@metaplex-foundation/umi-serializers';\nimport { base10, base58, base64 } from '@metaplex-foundation/umi-serializers';\nimport type { RpcAccount } from './Account';\nimport type { Context } from './Context';\nimport { SdkError } from './errors';\nimport type {\n  RpcDataFilter,\n  RpcDataSlice,\n  RpcGetProgramAccountsOptions,\n} from './RpcInterface';\n\n/**\n * Callback for sorting raw accounts from `getProgramAccounts` RPC requests.\n * @category Utils — GpaBuilder\n */\nexport type GpaBuilderSortCallback = (a: RpcAccount, b: RpcAccount) => number;\n\n/**\n * Callback for mapping raw accounts into any type.\n * @category Utils — GpaBuilder\n */\nexport type GpaBuilderMapCallback<T> = (account: RpcAccount) => T;\n\n/**\n * Get the GPA field offsets and serializers from their object definition.\n * @category Utils — GpaBuilder\n */\nexport type GpaBuilderFieldSerializers<T extends object, U extends T> = {\n  [K in keyof T]: [number | null, Serializer<T[K], U[K]>];\n};\n\n/**\n * Builder for `getProgramAccounts` RPC requests.\n * @category Utils — GpaBuilder\n */\nexport class GpaBuilder<\n  Account extends object = RpcAccount,\n  Fields extends object = {}\n> {\n  constructor(\n    protected readonly context: Pick<Context, 'rpc'>,\n    readonly programId: PublicKey,\n    readonly options: {\n      readonly fields?: GpaBuilderFieldSerializers<Fields, Fields>;\n      readonly deserializeCallback?: GpaBuilderMapCallback<Account>;\n      readonly dataSlice?: RpcDataSlice;\n      readonly filters?: RpcDataFilter[];\n      readonly sortCallback?: GpaBuilderSortCallback;\n    } = {}\n  ) {}\n\n  reset(): GpaBuilder<Account, Fields> {\n    return new GpaBuilder<Account, Fields>(this.context, this.programId, {\n      fields: this.options.fields,\n      deserializeCallback: this.options.deserializeCallback,\n    });\n  }\n\n  registerFields<T extends object>(\n    fields: GpaBuilderFieldSerializers<T, T>\n  ): GpaBuilder<Account, T> {\n    return new GpaBuilder<Account, T>(this.context, this.programId, {\n      ...this.options,\n      fields,\n    });\n  }\n\n  registerFieldsFromStruct<T extends object>(\n    structFields: StructToSerializerTuple<T, T>\n  ): GpaBuilder<Account, T> {\n    let offset: number | null = 0;\n    const fields = structFields.reduce((acc, [field, serializer]) => {\n      acc[field] = [offset, serializer];\n      offset =\n        offset === null || serializer.fixedSize === null\n          ? null\n          : offset + serializer.fixedSize;\n      return acc;\n    }, {} as GpaBuilderFieldSerializers<T, T>);\n    return this.registerFields(fields);\n  }\n\n  /**\n   * Registers nested struct fields with a parent path prefix.\n   * This allows filtering on nested fields using dot-notation paths.\n   *\n   * @example\n   * ```ts\n   * gpaBuilder\n   *   .registerFieldsFromStruct([\n   *     ['authority', publicKeySerializer],\n   *     ['metadata', metadataSerializer],\n   *   ])\n   *   .registerNestedFieldsFromStruct('metadata', 32, [\n   *     ['name', stringSerializer],\n   *     ['creator', publicKeySerializer],\n   *   ])\n   *   .whereField('metadata.creator', somePublicKey)\n   * ```\n   *\n   * @param parentPath - The dot-notation path prefix for the nested fields\n   * @param parentOffset - The byte offset where the parent struct starts\n   * @param structFields - The nested struct's field definitions\n   */\n  registerNestedFieldsFromStruct<T extends object>(\n    parentPath: string,\n    parentOffset: number,\n    structFields: StructToSerializerTuple<T, T>\n  ): GpaBuilder<\n    Account,\n    Fields & { [K in keyof T as `${typeof parentPath}.${K & string}`]: T[K] }\n  > {\n    let offset: number | null = parentOffset;\n    const nestedFields = structFields.reduce((acc, [field, serializer]) => {\n      const nestedPath = `${parentPath}.${field as string}`;\n      acc[nestedPath as keyof typeof acc] = [offset, serializer] as any;\n      offset =\n        offset === null || serializer.fixedSize === null\n          ? null\n          : offset + serializer.fixedSize;\n      return acc;\n    }, {} as Record<string, [number | null, Serializer<any>]>);\n\n    const mergedFields = {\n      ...this.options.fields,\n      ...nestedFields,\n    } as GpaBuilderFieldSerializers<\n      Fields & { [K in keyof T as `${typeof parentPath}.${K & string}`]: T[K] },\n      Fields & { [K in keyof T as `${typeof parentPath}.${K & string}`]: T[K] }\n    >;\n\n    return new GpaBuilder<\n      Account,\n      Fields & { [K in keyof T as `${typeof parentPath}.${K & string}`]: T[K] }\n    >(this.context, this.programId, {\n      ...this.options,\n      fields: mergedFields,\n    });\n  }\n\n  deserializeUsing<T extends object>(\n    callback: GpaBuilderMapCallback<T>\n  ): GpaBuilder<T, Fields> {\n    return new GpaBuilder<T, Fields>(this.context, this.programId, {\n      ...this.options,\n      deserializeCallback: callback,\n    });\n  }\n\n  slice(offset: number, length: number): GpaBuilder<Account, Fields> {\n    return new GpaBuilder<Account, Fields>(this.context, this.programId, {\n      ...this.options,\n      dataSlice: { offset, length },\n    });\n  }\n\n  sliceField(\n    field: keyof Fields,\n    offset?: number\n  ): GpaBuilder<Account, Fields> {\n    const [effectiveOffset, serializer] = this.getField(field, offset);\n    if (!serializer.fixedSize) {\n      throw new SdkError(\n        `Cannot slice field [${field as string}] because its size is variable.`\n      );\n    }\n    return this.slice(effectiveOffset, serializer.fixedSize);\n  }\n\n  withoutData(): GpaBuilder<Account, Fields> {\n    return this.slice(0, 0);\n  }\n\n  addFilter(...filters: RpcDataFilter[]): GpaBuilder<Account, Fields> {\n    return new GpaBuilder<Account, Fields>(this.context, this.programId, {\n      ...this.options,\n      filters: [...(this.options.filters ?? []), ...filters],\n    });\n  }\n\n  where(\n    offset: number,\n    data: string | bigint | number | boolean | Uint8Array | PublicKey\n  ): GpaBuilder<Account, Fields> {\n    let bytes: Uint8Array;\n    if (typeof data === 'string') {\n      bytes = base58.serialize(data);\n    } else if (\n      typeof data === 'number' ||\n      typeof data === 'bigint' ||\n      typeof data === 'boolean'\n    ) {\n      bytes = base10.serialize(BigInt(data).toString());\n    } else {\n      bytes = new Uint8Array(data);\n    }\n\n    return this.addFilter({ memcmp: { offset, bytes } });\n  }\n\n  whereField<K extends keyof Fields>(\n    field: K,\n    data: Fields[K],\n    offset?: number\n  ): GpaBuilder<Account, Fields> {\n    const [effectiveOffset, serializer] = this.getField(field, offset);\n    return this.where(effectiveOffset, serializer.serialize(data));\n  }\n\n  whereSize(dataSize: number): GpaBuilder<Account, Fields> {\n    return this.addFilter({ dataSize });\n  }\n\n  sortUsing(callback: GpaBuilderSortCallback): GpaBuilder<Account, Fields> {\n    return new GpaBuilder(this.context, this.programId, {\n      ...this.options,\n      sortCallback: callback,\n    });\n  }\n\n  async get(options: RpcGetProgramAccountsOptions = {}): Promise<RpcAccount[]> {\n    const accounts = await this.context.rpc.getProgramAccounts(this.programId, {\n      ...options,\n      dataSlice: options.dataSlice ?? this.options.dataSlice,\n      filters: [...(options.filters ?? []), ...(this.options.filters ?? [])],\n    });\n\n    if (this.options.sortCallback) {\n      accounts.sort(this.options.sortCallback);\n    }\n\n    return accounts;\n  }\n\n  async getAndMap<T>(\n    callback: GpaBuilderMapCallback<T>,\n    options: RpcGetProgramAccountsOptions = {}\n  ): Promise<T[]> {\n    return (await this.get(options)).map(callback);\n  }\n\n  async getDeserialized(\n    options: RpcGetProgramAccountsOptions = {}\n  ): Promise<Account[]> {\n    const rpcAccounts = await this.get(options);\n    if (!this.options.deserializeCallback) return rpcAccounts as Account[];\n    return rpcAccounts.map(this.options.deserializeCallback);\n  }\n\n  async getPublicKeys(\n    options: RpcGetProgramAccountsOptions = {}\n  ): Promise<PublicKey[]> {\n    return this.getAndMap((account) => account.publicKey, options);\n  }\n\n  async getDataAsPublicKeys(\n    options: RpcGetProgramAccountsOptions = {}\n  ): Promise<PublicKey[]> {\n    return this.getAndMap((account) => {\n      try {\n        return publicKey(account.data);\n      } catch (error) {\n        const message =\n          `Following a getProgramAccount call, you are trying to use an ` +\n          `account's data (or a slice of it) as a public key. ` +\n          `However, we encountered an account ` +\n          `[${account.publicKey}] whose data ` +\n          `[base64=${base64.deserialize(account.data)}] ` +\n          `is not a valid public key.`;\n        throw new SdkError(message);\n      }\n    }, options);\n  }\n\n  protected getField<K extends keyof Fields>(\n    fieldName: K,\n    forcedOffset?: number\n  ): [number, Serializer<Fields[K]>] {\n    if (!this.options.fields) {\n      throw new SdkError('Fields are not defined in this GpaBuilder.');\n    }\n\n    const field = this.options.fields[fieldName];\n    if (!field) {\n      throw new SdkError(\n        `Field [${fieldName as string}] is not defined in this GpaBuilder.`\n      );\n    }\n\n    const [offset, serializer] = field;\n    if (forcedOffset !== undefined) {\n      return [forcedOffset, serializer];\n    }\n\n    if (offset === null) {\n      throw new SdkError(\n        `Field [${fieldName as string}] does not have a fixed offset. ` +\n          `This is likely because it is not in the fixed part of ` +\n          `the account's data. In other words, it is located after ` +\n          `a field of variable length which means we cannot find a ` +\n          `fixed offset for the filter. You may go around this by ` +\n          `providing an offset explicitly.`\n      );\n    }\n\n    return [offset, serializer];\n  }\n}\n\n/**\n * Creates a new {@link GpaBuilder} instance.\n * @category Utils — GpaBuilder\n */\nexport const gpaBuilder = (\n  context: Pick<Context, 'rpc'>,\n  programId: PublicKey\n): GpaBuilder => new GpaBuilder(context, programId);\n"],"names":["GpaBuilder","constructor","context","programId","options","reset","fields","deserializeCallback","registerFields","registerFieldsFromStruct","structFields","offset","reduce","acc","field","serializer","fixedSize","registerNestedFieldsFromStruct","parentPath","parentOffset","nestedFields","nestedPath","mergedFields","deserializeUsing","callback","slice","length","dataSlice","sliceField","effectiveOffset","getField","SdkError","withoutData","addFilter","filters","where","data","bytes","base58","serialize","base10","BigInt","toString","Uint8Array","memcmp","whereField","whereSize","dataSize","sortUsing","sortCallback","get","accounts","rpc","getProgramAccounts","sort","getAndMap","map","getDeserialized","rpcAccounts","getPublicKeys","account","publicKey","getDataAsPublicKeys","error","message","base64","deserialize","fieldName","forcedOffset","undefined","gpaBuilder"],"mappings":";;;;;;;;AAmCA;AACA;AACA;AACA;AACO,MAAMA,UAAU,CAGrB;EACAC,WAAW,CACUC,OAA6B,EACvCC,SAAoB,EACpBC,OAMR,GAAG,EAAE,EACN;IAAA,IATmBF,CAAAA,OAA6B,GAA7BA,OAA6B,CAAA;IAAA,IACvCC,CAAAA,SAAoB,GAApBA,SAAoB,CAAA;IAAA,IACpBC,CAAAA,OAMR,GANQA,OAMR,CAAA;AACA,GAAA;AAEHC,EAAAA,KAAK,GAAgC;IACnC,OAAO,IAAIL,UAAU,CAAkB,IAAI,CAACE,OAAO,EAAE,IAAI,CAACC,SAAS,EAAE;AACnEG,MAAAA,MAAM,EAAE,IAAI,CAACF,OAAO,CAACE,MAAM;AAC3BC,MAAAA,mBAAmB,EAAE,IAAI,CAACH,OAAO,CAACG,mBAAAA;AACpC,KAAC,CAAC,CAAA;AACJ,GAAA;EAEAC,cAAc,CACZF,MAAwC,EAChB;IACxB,OAAO,IAAIN,UAAU,CAAa,IAAI,CAACE,OAAO,EAAE,IAAI,CAACC,SAAS,EAAE;MAC9D,GAAG,IAAI,CAACC,OAAO;AACfE,MAAAA,MAAAA;AACF,KAAC,CAAC,CAAA;AACJ,GAAA;EAEAG,wBAAwB,CACtBC,YAA2C,EACnB;IACxB,IAAIC,MAAqB,GAAG,CAAC,CAAA;AAC7B,IAAA,MAAML,MAAM,GAAGI,YAAY,CAACE,MAAM,CAAC,CAACC,GAAG,EAAE,CAACC,KAAK,EAAEC,UAAU,CAAC,KAAK;MAC/DF,GAAG,CAACC,KAAK,CAAC,GAAG,CAACH,MAAM,EAAEI,UAAU,CAAC,CAAA;AACjCJ,MAAAA,MAAM,GACJA,MAAM,KAAK,IAAI,IAAII,UAAU,CAACC,SAAS,KAAK,IAAI,GAC5C,IAAI,GACJL,MAAM,GAAGI,UAAU,CAACC,SAAS,CAAA;AACnC,MAAA,OAAOH,GAAG,CAAA;KACX,EAAE,EAAE,CAAqC,CAAA;AAC1C,IAAA,OAAO,IAAI,CAACL,cAAc,CAACF,MAAM,CAAC,CAAA;AACpC,GAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACEW,EAAAA,8BAA8B,CAC5BC,UAAkB,EAClBC,YAAoB,EACpBT,YAA2C,EAI3C;IACA,IAAIC,MAAqB,GAAGQ,YAAY,CAAA;AACxC,IAAA,MAAMC,YAAY,GAAGV,YAAY,CAACE,MAAM,CAAC,CAACC,GAAG,EAAE,CAACC,KAAK,EAAEC,UAAU,CAAC,KAAK;AACrE,MAAA,MAAMM,UAAU,GAAI,CAAA,EAAEH,UAAW,CAAA,CAAA,EAAGJ,KAAgB,CAAC,CAAA,CAAA;MACrDD,GAAG,CAACQ,UAAU,CAAqB,GAAG,CAACV,MAAM,EAAEI,UAAU,CAAQ,CAAA;AACjEJ,MAAAA,MAAM,GACJA,MAAM,KAAK,IAAI,IAAII,UAAU,CAACC,SAAS,KAAK,IAAI,GAC5C,IAAI,GACJL,MAAM,GAAGI,UAAU,CAACC,SAAS,CAAA;AACnC,MAAA,OAAOH,GAAG,CAAA;KACX,EAAE,EAAE,CAAqD,CAAA;AAE1D,IAAA,MAAMS,YAAY,GAAG;AACnB,MAAA,GAAG,IAAI,CAAClB,OAAO,CAACE,MAAM;MACtB,GAAGc,YAAAA;KAIJ,CAAA;IAED,OAAO,IAAIpB,UAAU,CAGnB,IAAI,CAACE,OAAO,EAAE,IAAI,CAACC,SAAS,EAAE;MAC9B,GAAG,IAAI,CAACC,OAAO;AACfE,MAAAA,MAAM,EAAEgB,YAAAA;AACV,KAAC,CAAC,CAAA;AACJ,GAAA;EAEAC,gBAAgB,CACdC,QAAkC,EACX;IACvB,OAAO,IAAIxB,UAAU,CAAY,IAAI,CAACE,OAAO,EAAE,IAAI,CAACC,SAAS,EAAE;MAC7D,GAAG,IAAI,CAACC,OAAO;AACfG,MAAAA,mBAAmB,EAAEiB,QAAAA;AACvB,KAAC,CAAC,CAAA;AACJ,GAAA;AAEAC,EAAAA,KAAK,CAACd,MAAc,EAAEe,MAAc,EAA+B;IACjE,OAAO,IAAI1B,UAAU,CAAkB,IAAI,CAACE,OAAO,EAAE,IAAI,CAACC,SAAS,EAAE;MACnE,GAAG,IAAI,CAACC,OAAO;AACfuB,MAAAA,SAAS,EAAE;QAAEhB,MAAM;AAAEe,QAAAA,MAAAA;AAAO,OAAA;AAC9B,KAAC,CAAC,CAAA;AACJ,GAAA;AAEAE,EAAAA,UAAU,CACRd,KAAmB,EACnBH,MAAe,EACc;AAC7B,IAAA,MAAM,CAACkB,eAAe,EAAEd,UAAU,CAAC,GAAG,IAAI,CAACe,QAAQ,CAAChB,KAAK,EAAEH,MAAM,CAAC,CAAA;AAClE,IAAA,IAAI,CAACI,UAAU,CAACC,SAAS,EAAE;AACzB,MAAA,MAAM,IAAIe,iBAAQ,CACf,CAAsBjB,oBAAAA,EAAAA,KAAgB,iCAAgC,CACxE,CAAA;AACH,KAAA;IACA,OAAO,IAAI,CAACW,KAAK,CAACI,eAAe,EAAEd,UAAU,CAACC,SAAS,CAAC,CAAA;AAC1D,GAAA;AAEAgB,EAAAA,WAAW,GAAgC;AACzC,IAAA,OAAO,IAAI,CAACP,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;AACzB,GAAA;EAEAQ,SAAS,CAAC,GAAGC,OAAwB,EAA+B;IAClE,OAAO,IAAIlC,UAAU,CAAkB,IAAI,CAACE,OAAO,EAAE,IAAI,CAACC,SAAS,EAAE;MACnE,GAAG,IAAI,CAACC,OAAO;AACf8B,MAAAA,OAAO,EAAE,CAAC,IAAI,IAAI,CAAC9B,OAAO,CAAC8B,OAAO,IAAI,EAAE,CAAC,EAAE,GAAGA,OAAO,CAAA;AACvD,KAAC,CAAC,CAAA;AACJ,GAAA;AAEAC,EAAAA,KAAK,CACHxB,MAAc,EACdyB,IAAiE,EACpC;AAC7B,IAAA,IAAIC,KAAiB,CAAA;AACrB,IAAA,IAAI,OAAOD,IAAI,KAAK,QAAQ,EAAE;AAC5BC,MAAAA,KAAK,GAAGC,qBAAM,CAACC,SAAS,CAACH,IAAI,CAAC,CAAA;AAChC,KAAC,MAAM,IACL,OAAOA,IAAI,KAAK,QAAQ,IACxB,OAAOA,IAAI,KAAK,QAAQ,IACxB,OAAOA,IAAI,KAAK,SAAS,EACzB;AACAC,MAAAA,KAAK,GAAGG,qBAAM,CAACD,SAAS,CAACE,MAAM,CAACL,IAAI,CAAC,CAACM,QAAQ,EAAE,CAAC,CAAA;AACnD,KAAC,MAAM;AACLL,MAAAA,KAAK,GAAG,IAAIM,UAAU,CAACP,IAAI,CAAC,CAAA;AAC9B,KAAA;IAEA,OAAO,IAAI,CAACH,SAAS,CAAC;AAAEW,MAAAA,MAAM,EAAE;QAAEjC,MAAM;AAAE0B,QAAAA,KAAAA;AAAM,OAAA;AAAE,KAAC,CAAC,CAAA;AACtD,GAAA;AAEAQ,EAAAA,UAAU,CACR/B,KAAQ,EACRsB,IAAe,EACfzB,MAAe,EACc;AAC7B,IAAA,MAAM,CAACkB,eAAe,EAAEd,UAAU,CAAC,GAAG,IAAI,CAACe,QAAQ,CAAChB,KAAK,EAAEH,MAAM,CAAC,CAAA;AAClE,IAAA,OAAO,IAAI,CAACwB,KAAK,CAACN,eAAe,EAAEd,UAAU,CAACwB,SAAS,CAACH,IAAI,CAAC,CAAC,CAAA;AAChE,GAAA;EAEAU,SAAS,CAACC,QAAgB,EAA+B;IACvD,OAAO,IAAI,CAACd,SAAS,CAAC;AAAEc,MAAAA,QAAAA;AAAS,KAAC,CAAC,CAAA;AACrC,GAAA;EAEAC,SAAS,CAACxB,QAAgC,EAA+B;IACvE,OAAO,IAAIxB,UAAU,CAAC,IAAI,CAACE,OAAO,EAAE,IAAI,CAACC,SAAS,EAAE;MAClD,GAAG,IAAI,CAACC,OAAO;AACf6C,MAAAA,YAAY,EAAEzB,QAAAA;AAChB,KAAC,CAAC,CAAA;AACJ,GAAA;AAEA,EAAA,MAAM0B,GAAG,CAAC9C,OAAqC,GAAG,EAAE,EAAyB;AAC3E,IAAA,MAAM+C,QAAQ,GAAG,MAAM,IAAI,CAACjD,OAAO,CAACkD,GAAG,CAACC,kBAAkB,CAAC,IAAI,CAAClD,SAAS,EAAE;AACzE,MAAA,GAAGC,OAAO;MACVuB,SAAS,EAAEvB,OAAO,CAACuB,SAAS,IAAI,IAAI,CAACvB,OAAO,CAACuB,SAAS;AACtDO,MAAAA,OAAO,EAAE,CAAC,IAAI9B,OAAO,CAAC8B,OAAO,IAAI,EAAE,CAAC,EAAE,IAAI,IAAI,CAAC9B,OAAO,CAAC8B,OAAO,IAAI,EAAE,CAAC,CAAA;AACvE,KAAC,CAAC,CAAA;AAEF,IAAA,IAAI,IAAI,CAAC9B,OAAO,CAAC6C,YAAY,EAAE;MAC7BE,QAAQ,CAACG,IAAI,CAAC,IAAI,CAAClD,OAAO,CAAC6C,YAAY,CAAC,CAAA;AAC1C,KAAA;AAEA,IAAA,OAAOE,QAAQ,CAAA;AACjB,GAAA;EAEA,MAAMI,SAAS,CACb/B,QAAkC,EAClCpB,OAAqC,GAAG,EAAE,EAC5B;AACd,IAAA,OAAO,CAAC,MAAM,IAAI,CAAC8C,GAAG,CAAC9C,OAAO,CAAC,EAAEoD,GAAG,CAAChC,QAAQ,CAAC,CAAA;AAChD,GAAA;AAEA,EAAA,MAAMiC,eAAe,CACnBrD,OAAqC,GAAG,EAAE,EACtB;IACpB,MAAMsD,WAAW,GAAG,MAAM,IAAI,CAACR,GAAG,CAAC9C,OAAO,CAAC,CAAA;IAC3C,IAAI,CAAC,IAAI,CAACA,OAAO,CAACG,mBAAmB,EAAE,OAAOmD,WAAW,CAAA;IACzD,OAAOA,WAAW,CAACF,GAAG,CAAC,IAAI,CAACpD,OAAO,CAACG,mBAAmB,CAAC,CAAA;AAC1D,GAAA;AAEA,EAAA,MAAMoD,aAAa,CACjBvD,OAAqC,GAAG,EAAE,EACpB;IACtB,OAAO,IAAI,CAACmD,SAAS,CAAEK,OAAO,IAAKA,OAAO,CAACC,SAAS,EAAEzD,OAAO,CAAC,CAAA;AAChE,GAAA;AAEA,EAAA,MAAM0D,mBAAmB,CACvB1D,OAAqC,GAAG,EAAE,EACpB;AACtB,IAAA,OAAO,IAAI,CAACmD,SAAS,CAAEK,OAAO,IAAK;MACjC,IAAI;AACF,QAAA,OAAOC,uBAAS,CAACD,OAAO,CAACxB,IAAI,CAAC,CAAA;OAC/B,CAAC,OAAO2B,KAAK,EAAE;QACd,MAAMC,OAAO,GACV,CAAA,6DAAA,CAA8D,GAC9D,CAAA,mDAAA,CAAoD,GACpD,CAAoC,mCAAA,CAAA,GACpC,CAAGJ,CAAAA,EAAAA,OAAO,CAACC,SAAU,eAAc,GACnC,CAAA,QAAA,EAAUI,qBAAM,CAACC,WAAW,CAACN,OAAO,CAACxB,IAAI,CAAE,CAAG,EAAA,CAAA,GAC9C,CAA2B,0BAAA,CAAA,CAAA;AAC9B,QAAA,MAAM,IAAIL,iBAAQ,CAACiC,OAAO,CAAC,CAAA;AAC7B,OAAA;KACD,EAAE5D,OAAO,CAAC,CAAA;AACb,GAAA;AAEU0B,EAAAA,QAAQ,CAChBqC,SAAY,EACZC,YAAqB,EACY;AACjC,IAAA,IAAI,CAAC,IAAI,CAAChE,OAAO,CAACE,MAAM,EAAE;AACxB,MAAA,MAAM,IAAIyB,iBAAQ,CAAC,4CAA4C,CAAC,CAAA;AAClE,KAAA;IAEA,MAAMjB,KAAK,GAAG,IAAI,CAACV,OAAO,CAACE,MAAM,CAAC6D,SAAS,CAAC,CAAA;IAC5C,IAAI,CAACrD,KAAK,EAAE;AACV,MAAA,MAAM,IAAIiB,iBAAQ,CACf,CAASoC,OAAAA,EAAAA,SAAoB,sCAAqC,CACpE,CAAA;AACH,KAAA;AAEA,IAAA,MAAM,CAACxD,MAAM,EAAEI,UAAU,CAAC,GAAGD,KAAK,CAAA;IAClC,IAAIsD,YAAY,KAAKC,SAAS,EAAE;AAC9B,MAAA,OAAO,CAACD,YAAY,EAAErD,UAAU,CAAC,CAAA;AACnC,KAAA;IAEA,IAAIJ,MAAM,KAAK,IAAI,EAAE;AACnB,MAAA,MAAM,IAAIoB,iBAAQ,CACf,CAASoC,OAAAA,EAAAA,SAAoB,kCAAiC,GAC5D,CAAA,sDAAA,CAAuD,GACvD,CAAA,wDAAA,CAAyD,GACzD,CAAyD,wDAAA,CAAA,GACzD,CAAwD,uDAAA,CAAA,GACxD,iCAAgC,CACpC,CAAA;AACH,KAAA;AAEA,IAAA,OAAO,CAACxD,MAAM,EAAEI,UAAU,CAAC,CAAA;AAC7B,GAAA;AACF,CAAA;;AAEA;AACA;AACA;AACA;AACauD,MAAAA,UAAU,GAAG,CACxBpE,OAA6B,EAC7BC,SAAoB,KACL,IAAIH,UAAU,CAACE,OAAO,EAAEC,SAAS;;;;;"}