@bitgo-beta/sdk-coin-sol 7.6.4-beta.613 → 7.6.4-beta.615

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 (76) hide show
  1. package/dist/cjs/src/lib/constants.d.ts +21 -2
  2. package/dist/cjs/src/lib/constants.d.ts.map +1 -1
  3. package/dist/cjs/src/lib/constants.js +22 -2
  4. package/dist/cjs/src/lib/iface.d.ts +59 -2
  5. package/dist/cjs/src/lib/iface.d.ts.map +1 -1
  6. package/dist/cjs/src/lib/iface.js +1 -1
  7. package/dist/cjs/src/lib/index.d.ts +1 -0
  8. package/dist/cjs/src/lib/index.d.ts.map +1 -1
  9. package/dist/cjs/src/lib/index.js +6 -2
  10. package/dist/cjs/src/lib/instructionParamsFactory.d.ts +2 -1
  11. package/dist/cjs/src/lib/instructionParamsFactory.d.ts.map +1 -1
  12. package/dist/cjs/src/lib/instructionParamsFactory.js +42 -1
  13. package/dist/cjs/src/lib/solInstructionFactory.d.ts.map +1 -1
  14. package/dist/cjs/src/lib/solInstructionFactory.js +60 -20
  15. package/dist/cjs/src/lib/token2022Resolve.d.ts +106 -0
  16. package/dist/cjs/src/lib/token2022Resolve.d.ts.map +1 -0
  17. package/dist/cjs/src/lib/token2022Resolve.js +199 -0
  18. package/dist/cjs/src/lib/tokenTransferBuilder.d.ts +27 -1
  19. package/dist/cjs/src/lib/tokenTransferBuilder.d.ts.map +1 -1
  20. package/dist/cjs/src/lib/tokenTransferBuilder.js +44 -3
  21. package/dist/cjs/src/lib/transferBuilderV2.d.ts +27 -1
  22. package/dist/cjs/src/lib/transferBuilderV2.d.ts.map +1 -1
  23. package/dist/cjs/src/lib/transferBuilderV2.js +44 -3
  24. package/dist/cjs/src/lib/utils.d.ts.map +1 -1
  25. package/dist/cjs/src/lib/utils.js +4 -1
  26. package/dist/cjs/src/sol.d.ts +58 -2
  27. package/dist/cjs/src/sol.d.ts.map +1 -1
  28. package/dist/cjs/src/sol.js +90 -1
  29. package/dist/cjs/test/unit/sol.js +248 -1
  30. package/dist/cjs/test/unit/solInstructionFactory.js +127 -17
  31. package/dist/cjs/test/unit/token2022Resolve.d.ts +2 -0
  32. package/dist/cjs/test/unit/token2022Resolve.d.ts.map +1 -0
  33. package/dist/cjs/test/unit/token2022Resolve.js +252 -0
  34. package/dist/cjs/test/unit/transactionBuilder/tokenTransferBuilder.js +100 -1
  35. package/dist/cjs/tsconfig.tsbuildinfo +1 -1
  36. package/dist/esm/lib/constants.d.ts +21 -2
  37. package/dist/esm/lib/constants.d.ts.map +1 -1
  38. package/dist/esm/lib/constants.js +21 -1
  39. package/dist/esm/lib/iface.d.ts +59 -2
  40. package/dist/esm/lib/iface.d.ts.map +1 -1
  41. package/dist/esm/lib/iface.js +1 -1
  42. package/dist/esm/lib/index.d.ts +1 -0
  43. package/dist/esm/lib/index.d.ts.map +1 -1
  44. package/dist/esm/lib/index.js +2 -1
  45. package/dist/esm/lib/instructionParamsFactory.d.ts +2 -1
  46. package/dist/esm/lib/instructionParamsFactory.d.ts.map +1 -1
  47. package/dist/esm/lib/instructionParamsFactory.js +41 -1
  48. package/dist/esm/lib/solInstructionFactory.d.ts.map +1 -1
  49. package/dist/esm/lib/solInstructionFactory.js +61 -21
  50. package/dist/esm/lib/token2022Resolve.d.ts +106 -0
  51. package/dist/esm/lib/token2022Resolve.d.ts.map +1 -0
  52. package/dist/esm/lib/token2022Resolve.js +194 -0
  53. package/dist/esm/lib/tokenTransferBuilder.d.ts +27 -1
  54. package/dist/esm/lib/tokenTransferBuilder.d.ts.map +1 -1
  55. package/dist/esm/lib/tokenTransferBuilder.js +44 -3
  56. package/dist/esm/lib/transferBuilderV2.d.ts +27 -1
  57. package/dist/esm/lib/transferBuilderV2.d.ts.map +1 -1
  58. package/dist/esm/lib/transferBuilderV2.js +44 -3
  59. package/dist/esm/lib/utils.d.ts.map +1 -1
  60. package/dist/esm/lib/utils.js +5 -2
  61. package/dist/esm/sol.d.ts +58 -2
  62. package/dist/esm/sol.d.ts.map +1 -1
  63. package/dist/esm/sol.js +90 -1
  64. package/package.json +7 -7
  65. package/dist/cjs/src/config/token2022StaticConfig.d.ts +0 -3
  66. package/dist/cjs/src/config/token2022StaticConfig.d.ts.map +0 -1
  67. package/dist/cjs/src/config/token2022StaticConfig.js +0 -50
  68. package/dist/cjs/src/lib/token2022Config.d.ts +0 -44
  69. package/dist/cjs/src/lib/token2022Config.d.ts.map +0 -1
  70. package/dist/cjs/src/lib/token2022Config.js +0 -27
  71. package/dist/esm/config/token2022StaticConfig.d.ts +0 -3
  72. package/dist/esm/config/token2022StaticConfig.d.ts.map +0 -1
  73. package/dist/esm/config/token2022StaticConfig.js +0 -47
  74. package/dist/esm/lib/token2022Config.d.ts +0 -44
  75. package/dist/esm/lib/token2022Config.d.ts.map +0 -1
  76. package/dist/esm/lib/token2022Config.js +0 -23
@@ -0,0 +1,194 @@
1
+ /**
2
+ * @prettier
3
+ *
4
+ * Reusable Token-2022 resolution logic (Transfer Hook extra accounts and sRFC-37
5
+ * Token ACL permissionless thaw), decoupled from the `Sol` coin class so any caller
6
+ * with its own account-fetcher (e.g. wallet-platform reading chain state via IMS RPC)
7
+ * can resolve these dependencies offline of the SDK's node transport.
8
+ *
9
+ * The resolution functions take a `Connection` (only `getAccountInfo` is required);
10
+ * {@link buildSolAccountConnection} adapts a plain {@link SolAccountFetcher} into the
11
+ * shape `@solana/spl-token`'s transfer-hook helpers expect.
12
+ */
13
+ import { TOKEN_2022_PROGRAM_ID, addExtraAccountMetasForExecute, createTransferCheckedInstruction, getExtraAccountMetas, getTransferHook, resolveExtraAccountMeta, unpackMint, } from '@solana/spl-token';
14
+ import { PublicKey as SolPublicKey, SystemProgram, } from '@solana/web3.js';
15
+ import { THAW_PERMISSIONLESS_IDEMPOTENT_DISCRIMINATOR, TOKEN_ACL_FLAG_ACCOUNT_SEED, TOKEN_ACL_MINT_CONFIG_SEED, TOKEN_ACL_PROGRAM_ID, TOKEN_ACL_THAW_EXTRA_METAS_SEED, } from './constants';
16
+ /**
17
+ * Build a minimal `Connection`-like shim backed by a {@link SolAccountFetcher}.
18
+ *
19
+ * `@solana/spl-token`'s transfer-hook resolution helpers only require
20
+ * `getAccountInfo(publicKey)` returning an `AccountInfo<Buffer>`. This adapts a
21
+ * plain address-based fetcher to that shape so any transport can drive the
22
+ * resolution below without opening a dedicated RPC connection.
23
+ *
24
+ * @param {SolAccountFetcher} fetch - fetcher returning decoded account info by address
25
+ * @returns {Connection} a shim exposing `getAccountInfo`, cast to `Connection`
26
+ */
27
+ export function buildSolAccountConnection(fetch) {
28
+ const getAccountInfo = async (publicKey, _commitmentOrConfig) => {
29
+ return fetch(publicKey.toBase58());
30
+ };
31
+ return { getAccountInfo };
32
+ }
33
+ /**
34
+ * Map the extra keys appended to a resolved transfer instruction into the
35
+ * serializable {@link ExtraAccountMeta} shape.
36
+ */
37
+ function toExtraAccountMetas(instruction, baseKeyCount) {
38
+ return instruction.keys.slice(baseKeyCount).map((meta) => ({
39
+ pubkey: meta.pubkey.toBase58(),
40
+ isSigner: meta.isSigner,
41
+ isWritable: meta.isWritable,
42
+ }));
43
+ }
44
+ /**
45
+ * Decode the fields of a Token ACL MintConfig account we depend on.
46
+ *
47
+ * Layout: `u8 discriminator, u8 bump, bool enablePermissionlessThaw, bool enablePermissionlessFreeze,
48
+ * pubkey mint(32), pubkey freezeAuthority(32), pubkey gatingProgram(32)`.
49
+ */
50
+ function decodeTokenAclMintConfig(data) {
51
+ const enablePermissionlessThaw = data[2] === 1;
52
+ const gatingProgram = new SolPublicKey(data.subarray(68, 100));
53
+ return { enablePermissionlessThaw, gatingProgram };
54
+ }
55
+ /**
56
+ * Resolve the gating program's thaw ExtraAccountMetaList onto a can-thaw context.
57
+ *
58
+ * Mirrors the reference `resolveExtraMetas`: fetch the extra-metas account, unpack its
59
+ * ExtraAccountMeta entries, then resolve each one (fixed address, PDA, or account-data derived)
60
+ * against the accumulating metas using the spl-token transfer-hook helpers. When the extra-metas
61
+ * account does not exist, there are no extras to append.
62
+ */
63
+ async function resolveTokenAclExtraMetas(connection, extraMetasAddress, previousMetas, gatingProgram) {
64
+ const instructionData = Buffer.from([THAW_PERMISSIONLESS_IDEMPOTENT_DISCRIMINATOR]);
65
+ const resolvedMetas = [...previousMetas];
66
+ const extraMetasAccount = await connection.getAccountInfo(extraMetasAddress);
67
+ if (!extraMetasAccount) {
68
+ return resolvedMetas;
69
+ }
70
+ const extraAccountMetas = getExtraAccountMetas(extraMetasAccount);
71
+ for (const extraAccountMeta of extraAccountMetas) {
72
+ const resolvedMeta = await resolveExtraAccountMeta(connection, extraAccountMeta, resolvedMetas, instructionData, gatingProgram);
73
+ resolvedMetas.push(resolvedMeta);
74
+ }
75
+ return resolvedMetas;
76
+ }
77
+ /**
78
+ * Resolve the Token-2022 Transfer Hook extra accounts for a specific transfer.
79
+ *
80
+ * This is generic: it works for any Token-2022 mint by reading the mint's
81
+ * TransferHook extension and the hook program's ExtraAccountMetaList live from
82
+ * the node, then resolving each extra account (including seed-derived PDAs) via
83
+ * the standard `spl-transfer-hook-interface` helpers. The returned metas are in
84
+ * the exact order the hook requires and are suitable for
85
+ * `TokenTransfer.params.transferHookAccounts`.
86
+ *
87
+ * When the mint has no Transfer Hook, this returns an empty array and callers can
88
+ * omit the param.
89
+ *
90
+ * @param {Connection} connection - a `Connection` (or shim) exposing `getAccountInfo`
91
+ * @param params - the transfer parameters
92
+ * @param {string} params.mint - the Token-2022 mint address
93
+ * @param {string} params.source - the source token account (sender ATA)
94
+ * @param {string} params.destination - the destination token account (recipient ATA)
95
+ * @param {string} params.owner - the source account owner / transfer authority
96
+ * @param {string} params.amount - the raw transfer amount in base units
97
+ * @returns {Promise<ExtraAccountMeta[]>} ordered extra account metas, or [] when no hook
98
+ */
99
+ export async function resolveTransferHookAccounts(connection, params) {
100
+ const { mint, source, destination, owner, amount } = params;
101
+ const mintPubkey = new SolPublicKey(mint);
102
+ // Read the mint and detect whether a Transfer Hook extension is configured.
103
+ const mintAccountInfo = await connection.getAccountInfo(mintPubkey);
104
+ if (!mintAccountInfo) {
105
+ return [];
106
+ }
107
+ const mintState = unpackMint(mintPubkey, mintAccountInfo, TOKEN_2022_PROGRAM_ID);
108
+ const transferHook = getTransferHook(mintState);
109
+ if (!transferHook || transferHook.programId.equals(SolPublicKey.default)) {
110
+ return [];
111
+ }
112
+ const sourcePubkey = new SolPublicKey(source);
113
+ const destinationPubkey = new SolPublicKey(destination);
114
+ const ownerPubkey = new SolPublicKey(owner);
115
+ const transferAmount = BigInt(amount);
116
+ // Start from a base transferChecked instruction; addExtraAccountMetasForExecute
117
+ // appends the resolved extra accounts, the hook program, and the validation
118
+ // state account in the required order.
119
+ const instruction = createTransferCheckedInstruction(sourcePubkey, mintPubkey, destinationPubkey, ownerPubkey, transferAmount, mintState.decimals, [], TOKEN_2022_PROGRAM_ID);
120
+ const baseKeyCount = instruction.keys.length;
121
+ await addExtraAccountMetasForExecute(connection, instruction, transferHook.programId, sourcePubkey, mintPubkey, destinationPubkey, ownerPubkey, transferAmount);
122
+ return toExtraAccountMetas(instruction, baseKeyCount);
123
+ }
124
+ /**
125
+ * Resolve the sRFC-37 Token ACL permissionless-thaw dependencies for a token account.
126
+ *
127
+ * This is generic: it works for ANY allowlist/blocklist (DefaultAccountState) Token-2022 mint
128
+ * gated by the Token ACL program — no issuer is hardcoded. It reads the mint's MintConfig PDA
129
+ * live from the node, and only when permissionless thaw is enabled does it derive the flag /
130
+ * mint-config / thaw-extra-metas PDAs and resolve the gating program's extra account metas (in
131
+ * the exact order the gating program requires, mirroring `resolveExtraMetas`).
132
+ *
133
+ * When the mint is not a Token ACL mint, or permissionless thaw is disabled, this returns
134
+ * `{ applicable: false }` and callers skip the thaw.
135
+ *
136
+ * @param {Connection} connection - a `Connection` (or shim) exposing `getAccountInfo`
137
+ * @param params - the thaw parameters
138
+ * @param {string} params.mint - the Token-2022 mint address
139
+ * @param {string} params.tokenAccount - the token account (ATA) to thaw
140
+ * @param {string} params.tokenAccountOwner - the owner of the token account
141
+ * @param {string} params.authority - the signer invoking the thaw (fee payer / authority)
142
+ * @returns {Promise<ResolvePermissionlessThawResult>} the resolved thaw params, or `{ applicable: false }`
143
+ */
144
+ export async function resolvePermissionlessThaw(connection, params) {
145
+ const { mint, tokenAccount, tokenAccountOwner, authority } = params;
146
+ const mintPubkey = new SolPublicKey(mint);
147
+ const tokenAccountPubkey = new SolPublicKey(tokenAccount);
148
+ const tokenAccountOwnerPubkey = new SolPublicKey(tokenAccountOwner);
149
+ const authorityPubkey = new SolPublicKey(authority);
150
+ const tokenAclProgramId = new SolPublicKey(TOKEN_ACL_PROGRAM_ID);
151
+ // 1. Read the mint's MintConfig PDA. Absent => the mint is not a Token ACL mint.
152
+ const [mintConfigPda] = SolPublicKey.findProgramAddressSync([Buffer.from(TOKEN_ACL_MINT_CONFIG_SEED), mintPubkey.toBuffer()], tokenAclProgramId);
153
+ const mintConfigAccount = await connection.getAccountInfo(mintConfigPda);
154
+ if (!mintConfigAccount) {
155
+ return { applicable: false };
156
+ }
157
+ // 2. Decode the MintConfig; permissionless thaw must be enabled.
158
+ const mintConfig = decodeTokenAclMintConfig(mintConfigAccount.data);
159
+ if (!mintConfig.enablePermissionlessThaw) {
160
+ return { applicable: false };
161
+ }
162
+ const gatingProgramPubkey = mintConfig.gatingProgram;
163
+ // 3. Derive the remaining PDAs (flag account under Token ACL, thaw extra metas under gating).
164
+ const [flagAccountPda] = SolPublicKey.findProgramAddressSync([Buffer.from(TOKEN_ACL_FLAG_ACCOUNT_SEED), tokenAccountPubkey.toBuffer()], tokenAclProgramId);
165
+ const [thawExtraMetasPda] = SolPublicKey.findProgramAddressSync([Buffer.from(TOKEN_ACL_THAW_EXTRA_METAS_SEED), mintPubkey.toBuffer()], gatingProgramPubkey);
166
+ // 4. Build the 6-account can-thaw context (all readonly), then resolve the gating program's
167
+ // extra account metas onto it.
168
+ const canThawContext = [
169
+ { pubkey: authorityPubkey, isSigner: false, isWritable: false },
170
+ { pubkey: tokenAccountPubkey, isSigner: false, isWritable: false },
171
+ { pubkey: mintPubkey, isSigner: false, isWritable: false },
172
+ { pubkey: tokenAccountOwnerPubkey, isSigner: false, isWritable: false },
173
+ { pubkey: flagAccountPda, isSigner: false, isWritable: false },
174
+ { pubkey: thawExtraMetasPda, isSigner: false, isWritable: false },
175
+ ];
176
+ const resolvedMetas = await resolveTokenAclExtraMetas(connection, thawExtraMetasPda, canThawContext, gatingProgramPubkey);
177
+ // 5. Drop the first five context accounts; the remainder ([thawExtraMetas, ...extras]) are the
178
+ // accounts appended after the thaw instruction's fixed nine.
179
+ const extraAccounts = resolvedMetas.slice(5).map((meta) => ({
180
+ pubkey: meta.pubkey.toBase58(),
181
+ isSigner: meta.isSigner,
182
+ isWritable: meta.isWritable,
183
+ }));
184
+ return {
185
+ applicable: true,
186
+ gatingProgram: gatingProgramPubkey.toBase58(),
187
+ flagAccount: flagAccountPda.toBase58(),
188
+ mintConfig: mintConfigPda.toBase58(),
189
+ tokenProgram: TOKEN_2022_PROGRAM_ID.toBase58(),
190
+ systemProgram: SystemProgram.programId.toBase58(),
191
+ extraAccounts,
192
+ };
193
+ }
194
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4yMDIyUmVzb2x2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvdG9rZW4yMDIyUmVzb2x2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7R0FXRztBQUVILE9BQU8sRUFDTCxxQkFBcUIsRUFDckIsOEJBQThCLEVBQzlCLGdDQUFnQyxFQUNoQyxvQkFBb0IsRUFDcEIsZUFBZSxFQUNmLHVCQUF1QixFQUN2QixVQUFVLEdBQ1gsTUFBTSxtQkFBbUIsQ0FBQztBQUMzQixPQUFPLEVBS0wsU0FBUyxJQUFJLFlBQVksRUFDekIsYUFBYSxHQUVkLE1BQU0saUJBQWlCLENBQUM7QUFFekIsT0FBTyxFQUNMLDRDQUE0QyxFQUM1QywyQkFBMkIsRUFDM0IsMEJBQTBCLEVBQzFCLG9CQUFvQixFQUNwQiwrQkFBK0IsR0FDaEMsTUFBTSxhQUFhLENBQUM7QUE2QnJCOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLFVBQVUseUJBQXlCLENBQUMsS0FBd0I7SUFDaEUsTUFBTSxjQUFjLEdBQUcsS0FBSyxFQUMxQixTQUF1QixFQUN2QixtQkFBZ0MsRUFDSyxFQUFFO1FBQ3ZDLE9BQU8sS0FBSyxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQ3JDLENBQUMsQ0FBQztJQUNGLE9BQU8sRUFBRSxjQUFjLEVBQTJCLENBQUM7QUFDckQsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsbUJBQW1CLENBQUMsV0FBbUMsRUFBRSxZQUFvQjtJQUNwRixPQUFPLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN6RCxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUU7UUFDOUIsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO1FBQ3ZCLFVBQVUsRUFBRSxJQUFJLENB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RSx1QkFBdUIsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUU7UUFDdkUsRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRTtRQUM5RCxFQUFFLE1BQU0sRUFBRSxpQkFBaUIsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUU7S0FDbEUsQ0FBQztJQUNGLE1BQU0sYUFBYSxHQUFHLE1BQU0seUJBQXlCLENBQ25ELFVBQVUsRUFDVixpQkFBaUIsRUFDakIsY0FBYyxFQUNkLG1CQUFtQixDQUNwQixDQUFDO0lBRUYsK0ZBQStGO0lBQy9GLGdFQUFnRTtJQUNoRSxNQUFNLGFBQWEsR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztRQUMxRCxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUU7UUFDOUIsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO1FBQ3ZCLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVTtLQUM1QixDQUFDLENBQUMsQ0FBQztJQUVKLE9BQU87UUFDTCxVQUFVLEVBQUUsSUFBSTtRQUNoQixhQUFhLEVBQUUsbUJBQW1CLENBQUMsUUFBUSxFQUFFO1FBQzdDLFdBQVcsRUFBRSxjQUFjLENBQUMsUUFBUSxFQUFFO1FBQ3RDLFVBQVUsRUFBRSxhQUFhLENBQUMsUUFBUSxFQUFFO1FBQ3BDLFlBQVksRUFBRSxxQkFBcUIsQ0FBQyxRQUFRLEVBQUU7UUFDOUMsYUFBYSxFQUFFLGFBQWEsQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFO1FBQ2pELGFBQWE7S0FDZCxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQHByZXR0aWVyXG4gKlxuICogUmV1c2FibGUgVG9rZW4tMjAyMiByZXNvbHV0aW9uIGxvZ2ljIChUcmFuc2ZlciBIb29rIGV4dHJhIGFjY291bnRzIGFuZCBzUkZDLTM3XG4gKiBUb2tlbiBBQ0wgcGVybWlzc2lvbmxlc3MgdGhhdyksIGRlY291cGxlZCBmcm9tIHRoZSBgU29sYCBjb2luIGNsYXNzIHNvIGFueSBjYWxsZXJcbiAqIHdpdGggaXRzIG93biBhY2NvdW50LWZldGNoZXIgKGUuZy4gd2FsbGV0LXBsYXRmb3JtIHJlYWRpbmcgY2hhaW4gc3RhdGUgdmlhIElNUyBSUEMpXG4gKiBjYW4gcmVzb2x2ZSB0aGVzZSBkZXBlbmRlbmNpZXMgb2ZmbGluZSBvZiB0aGUgU0RLJ3Mgbm9kZSB0cmFuc3BvcnQuXG4gKlxuICogVGhlIHJlc29sdXRpb24gZnVuY3Rpb25zIHRha2UgYSBgQ29ubmVjdGlvbmAgKG9ubHkgYGdldEFjY291bnRJbmZvYCBpcyByZXF1aXJlZCk7XG4gKiB7QGxpbmsgYnVpbGRTb2xBY2NvdW50Q29ubmVjdGlvbn0gYWRhcHRzIGEgcGxhaW4ge0BsaW5rIFNvbEFjY291bnRGZXRjaGVyfSBpbnRvIHRoZVxuICogc2hhcGUgYEBzb2xhbmEvc3BsLXRva2VuYCdzIHRyYW5zZmVyLWhvb2sgaGVscGVycyBleHBlY3QuXG4gKi9cblxuaW1wb3J0IHtcbiAgVE9LRU5fMjAyMl9QUk9HUkFNX0lELFxuICBhZGRFeHRyYUFjY291bnRNZXRhc0ZvckV4ZWN1dGUsXG4gIGNyZWF0ZVRyYW5zZmVyQ2hlY2tlZEluc3RydWN0aW9uLFxuICBnZXRFeHRyYUFjY291bnRNZXRhcyxcbiAgZ2V0VHJhbnNmZXJIb29rLFxuICByZXNvbHZlRXh0cmFBY2NvdW50TWV0YSxcbiAgdW5wYWNrTWludCxcbn0gZnJvbSAnQHNvbGFuYS9zcGwtdG9rZW4nO1xuaW1wb3J0IHtcbiAgQWNjb3VudEluZm8sXG4gIEFjY291bnRNZXRhLFxuICBDb21taXRtZW50LFxuICBDb25uZWN0aW9uLFxuICBQdWJsaWNLZXkgYXMgU29sUHVibGljS2V5LFxuICBTeXN0ZW1Qcm9ncmFtLFxuICBUcmFuc2FjdGlvbkluc3RydWN0aW9uLFxufSBmcm9tICdAc29sYW5hL3dlYjMuanMnO1xuXG5pbXBvcnQge1xuICBUSEFXX1BFUk1JU1NJT05MRVNTX0lERU1QT1RFTlRfRElTQ1JJTUlOQVRPUixcbiAgVE9LRU5fQUNMX0ZMQUdfQUNDT1VOVF9TRUVELFxuICBUT0tFTl9BQ0xfTUlOVF9DT05GSUdfU0VFRCxcbiAgVE9LRU5fQUNMX1BST0dSQU1fSUQsXG4gIFRPS0VOX0FDTF9USEFXX0VYVFJBX01FVEFTX1NFRUQsXG59IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7IEV4dHJhQWNjb3VudE1ldGEgfSBmcm9tICcuL2lmYWNlJztcblxuLyoqXG4gKiBBIG1pbmltYWwgYWNjb3VudC1mZXRjaGVyOiBnaXZlbiBhIGJhc2U1OCBhZGRyZXNzLCByZXR1cm4gaXRzIG9uLWNoYWluXG4gKiB7QGxpbmsgQWNjb3VudEluZm99ICh3aXRoIGBkYXRhYCBhbHJlYWR5IGRlY29kZWQgaW50byBhIGBCdWZmZXJgKSBvciBgbnVsbGBcbiAqIHdoZW4gdGhlIGFjY291bnQgZG9lcyBub3QgZXhpc3QuIENhbGxlcnMgc3VwcGx5IHRoZWlyIG93biB0cmFuc3BvcnQgKFNESyBub2RlXG4gKiByZXF1ZXN0LCB3YWxsZXQtcGxhdGZvcm0gSU1TIFJQQywgYSBmdWxsIGBDb25uZWN0aW9uYCwgZXRjLikuXG4gKi9cbmV4cG9ydCB0eXBlIFNvbEFjY291bnRGZXRjaGVyID0gKGFkZHJlc3M6IHN0cmluZykgPT4gUHJvbWlzZTxBY2NvdW50SW5mbzxCdWZmZXI+IHwgbnVsbD47XG5cbi8qKlxuICogUmVzdWx0IG9mIHJlc29sdmluZyB0aGUgc1JGQy0zNyBUb2tlbiBBQ0wgcGVybWlzc2lvbmxlc3MgdGhhdyBmb3IgYSBtaW50IC8gdG9rZW4gYWNjb3VudC5cbiAqXG4gKiBXaGVuIGBhcHBsaWNhYmxlYCBpcyBmYWxzZSAodGhlIG1pbnQgaGFzIG5vIFRva2VuIEFDTCBNaW50Q29uZmlnLCBvciBwZXJtaXNzaW9ubGVzcyB0aGF3IGlzXG4gKiBkaXNhYmxlZCkgYWxsIG90aGVyIGZpZWxkcyBhcmUgb21pdHRlZCBhbmQgdGhlIGNhbGxlciBzaG91bGQgbm90IGVtaXQgYSB0aGF3IGluc3RydWN0aW9uLlxuICogV2hlbiBgYXBwbGljYWJsZWAgaXMgdHJ1ZSwgdGhlIGZpZWxkcyBhcmUgcmVhZHkgdG8gdGhyZWFkIGludG8gdGhlIHRva2VuLXRyYW5zZmVyIGJ1aWxkZXIgdmlhXG4gKiBgcGVybWlzc2lvbmxlc3NUaGF3KC4uLilgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVQZXJtaXNzaW9ubGVzc1RoYXdSZXN1bHQge1xuICBhcHBsaWNhYmxlOiBib29sZWFuO1xuICBnYXRpbmdQcm9ncmFtPzogc3RyaW5nO1xuICBmbGFnQWNjb3VudD86IHN0cmluZztcbiAgbWludENvbmZpZz86IHN0cmluZztcbiAgdG9rZW5Qcm9ncmFtPzogc3RyaW5nO1xuICBzeXN0ZW1Qcm9ncmFtPzogc3RyaW5nO1xuICBleHRyYUFjY291bnRzPzogRXh0cmFBY2NvdW50TWV0YVtdO1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgbWluaW1hbCBgQ29ubmVjdGlvbmAtbGlrZSBzaGltIGJhY2tlZCBieSBhIHtAbGluayBTb2xBY2NvdW50RmV0Y2hlcn0uXG4gKlxuICogYEBzb2xhbmEvc3BsLXRva2VuYCdzIHRyYW5zZmVyLWhvb2sgcmVzb2x1dGlvbiBoZWxwZXJzIG9ubHkgcmVxdWlyZVxuICogYGdldEFjY291bnRJbmZvKHB1YmxpY0tleSlgIHJldHVybmluZyBhbiBgQWNjb3VudEluZm88QnVmZmVyPmAuIFRoaXMgYWRhcHRzIGFcbiAqIHBsYWluIGFkZHJlc3MtYmFzZWQgZmV0Y2hlciB0byB0aGF0IHNoYXBlIHNvIGFueSB0cmFuc3BvcnQgY2FuIGRyaXZlIHRoZVxuICogcmVzb2x1dGlvbiBiZWxvdyB3aXRob3V0IG9wZW5pbmcgYSBkZWRpY2F0ZWQgUlBDIGNvbm5lY3Rpb24uXG4gKlxuICogQHBhcmFtIHtTb2xBY2NvdW50RmV0Y2hlcn0gZmV0Y2ggLSBmZXRjaGVyIHJldHVybmluZyBkZWNvZGVkIGFjY291bnQgaW5mbyBieSBhZGRyZXNzXG4gKiBAcmV0dXJucyB7Q29ubmVjdGlvbn0gYSBzaGltIGV4cG9zaW5nIGBnZXRBY2NvdW50SW5mb2AsIGNhc3QgdG8gYENvbm5lY3Rpb25gXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFNvbEFjY291bnRDb25uZWN0aW9uKGZldGNoOiBTb2xBY2NvdW50RmV0Y2hlcik6IENvbm5lY3Rpb24ge1xuICBjb25zdCBnZXRBY2NvdW50SW5mbyA9IGFzeW5jIChcbiAgICBwdWJsaWNLZXk6IFNvbFB1YmxpY0tleSxcbiAgICBfY29tbWl0bWVudE9yQ29uZmlnPzogQ29tbWl0bWVudFxuICApOiBQcm9taXNlPEFjY291bnRJbmZvPEJ1ZmZlcj4gfCBudWxsPiA9PiB7XG4gICAgcmV0dXJuIGZldGNoKHB1YmxpY0tleS50b0Jhc2U1OCgpKTtcbiAgfTtcbiAgcmV0dXJuIHsgZ2V0QWNjb3VudEluZm8gfSBhcyB1bmtub3duIGFzIENvbm5lY3Rpb247XG59XG5cbi8qKlxuICogTWFwIHRoZSBleHRyYSBrZXlzIGFwcGVuZGVkIHRvIGEgcmVzb2x2ZWQgdHJhbnNmZXIgaW5zdHJ1Y3Rpb24gaW50byB0aGVcbiAqIHNlcmlhbGl6YWJsZSB7QGxpbmsgRXh0cmFBY2NvdW50TWV0YX0gc2hhcGUuXG4gKi9cbmZ1bmN0aW9uIHRvRXh0cmFBY2NvdW50TWV0YXMoaW5zdHJ1Y3Rpb246IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24sIGJhc2VLZXlDb3VudDogbnVtYmVyKTogRXh0cmFBY2NvdW50TWV0YVtdIHtcbiAgcmV0dXJuIGluc3RydWN0aW9uLmtleXMuc2xpY2UoYmFzZUtleUNvdW50KS5tYXAoKG1ldGEpID0+ICh7XG4gICAgcHVia2V5OiBtZXRhLnB1YmtleS50b0Jhc2U1OCgpLFxuICAgIGlzU2lnbmVyOiBtZXRhLmlzU2lnbmVyLFxuICAgIGlzV3JpdGFibGU6IG1ldGEuaXNXcml0YWJsZSxcbiAgfSkpO1xufVxuXG4vKipcbiAqIERlY29kZSB0aGUgZmllbGRzIG9mIGEgVG9rZW4gQUNMIE1pbnRDb25maWcgYWNjb3VudCB3ZSBkZXBlbmQgb24uXG4gKlxuICogTGF5b3V0OiBgdTggZGlzY3JpbWluYXRvciwgdTggYnVtcCwgYm9vbCBlbmFibGVQZXJtaXNzaW9ubGVzc1RoYXcsIGJvb2wgZW5hYmxlUGVybWlzc2lvbmxlc3NGcmVlemUsXG4gKiBwdWJrZXkgbWludCgzMiksIHB1YmtleSBmcmVlemVBdXRob3JpdHkoMzIpLCBwdWJrZXkgZ2F0aW5nUHJvZ3JhbSgzMilgLlxuICovXG5mdW5jdGlvbiBkZWNvZGVUb2tlbkFjbE1pbnRDb25maWcoZGF0YTogQnVmZmVyKTogeyBlbmFibGVQZXJtaXNzaW9ubGVzc1RoYXc6IGJvb2xlYW47IGdhdGluZ1Byb2dyYW06IFNvbFB1YmxpY0tleSB9IHtcbiAgY29uc3QgZW5hYmxlUGVybWlzc2lvbmxlc3NUaGF3ID0gZGF0YVsyXSA9PT0gMTtcbiAgY29uc3QgZ2F0aW5nUHJvZ3JhbSA9IG5ldyBTb2xQdWJsaWNLZXkoZGF0YS5zdWJhcnJheSg2OCwgMTAwKSk7XG4gIHJldHVybiB7IGVuYWJsZVBlcm1pc3Npb25sZXNzVGhhdywgZ2F0aW5nUHJvZ3JhbSB9O1xufVxuXG4vKipcbiAqIFJlc29sdmUgdGhlIGdhdGluZyBwcm9ncmFtJ3MgdGhhdyBFeHRyYUFjY291bnRNZXRhTGlzdCBvbnRvIGEgY2FuLXRoYXcgY29udGV4dC5cbiAqXG4gKiBNaXJyb3JzIHRoZSByZWZlcmVuY2UgYHJlc29sdmVFeHRyYU1ldGFzYDogZmV0Y2ggdGhlIGV4dHJhLW1ldGFzIGFjY291bnQsIHVucGFjayBpdHNcbiAqIEV4dHJhQWNjb3VudE1ldGEgZW50cmllcywgdGhlbiByZXNvbHZlIGVhY2ggb25lIChmaXhlZCBhZGRyZXNzLCBQREEsIG9yIGFjY291bnQtZGF0YSBkZXJpdmVkKVxuICogYWdhaW5zdCB0aGUgYWNjdW11bGF0aW5nIG1ldGFzIHVzaW5nIHRoZSBzcGwtdG9rZW4gdHJhbnNmZXItaG9vayBoZWxwZXJzLiBXaGVuIHRoZSBleHRyYS1tZXRhc1xuICogYWNjb3VudCBkb2VzIG5vdCBleGlzdCwgdGhlcmUgYXJlIG5vIGV4dHJhcyB0byBhcHBlbmQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVUb2tlbkFjbEV4dHJhTWV0YXMoXG4gIGNvbm5lY3Rpb246IENvbm5lY3Rpb24sXG4gIGV4dHJhTWV0YXNBZGRyZXNzOiBTb2xQdWJsaWNLZXksXG4gIHByZXZpb3VzTWV0YXM6IEFjY291bnRNZXRhW10sXG4gIGdhdGluZ1Byb2dyYW06IFNvbFB1YmxpY0tleVxuKTogUHJvbWlzZTxBY2NvdW50TWV0YVtdPiB7XG4gIGNvbnN0IGluc3RydWN0aW9uRGF0YSA9IEJ1ZmZlci5mcm9tKFtUSEFXX1BFUk1JU1NJT05MRVNTX0lERU1QT1RFTlRfRElTQ1JJTUlOQVRPUl0pO1xuICBjb25zdCByZXNvbHZlZE1ldGFzOiBBY2NvdW50TWV0YVtdID0gWy4uLnByZXZpb3VzTWV0YXNdO1xuICBjb25zdCBleHRyYU1ldGFzQWNjb3VudCA9IGF3YWl0IGNvbm5lY3Rpb24uZ2V0QWNjb3VudEluZm8oZXh0cmFNZXRhc0FkZHJlc3MpO1xuICBpZiAoIWV4dHJhTWV0YXNBY2NvdW50KSB7XG4gICAgcmV0dXJuIHJlc29sdmVkTWV0YXM7XG4gIH1cbiAgY29uc3QgZXh0cmFBY2NvdW50TWV0YXMgPSBnZXRFeHRyYUFjY291bnRNZXRhcyhleHRyYU1ldGFzQWNjb3VudCk7XG4gIGZvciAoY29uc3QgZXh0cmFBY2NvdW50TWV0YSBvZiBleHRyYUFjY291bnRNZXRhcykge1xuICAgIGNvbnN0IHJlc29sdmVkTWV0YSA9IGF3YWl0IHJlc29sdmVFeHRyYUFjY291bnRNZXRhKFxuICAgICAgY29ubmVjdGlvbixcbiAgICAgIGV4dHJhQWNjb3VudE1ldGEsXG4gICAgICByZXNvbHZlZE1ldGFzLFxuICAgICAgaW5zdHJ1Y3Rpb25EYXRhLFxuICAgICAgZ2F0aW5nUHJvZ3JhbVxuICAgICk7XG4gICAgcmVzb2x2ZWRNZXRhcy5wdXNoKHJlc29sdmVkTWV0YSk7XG4gIH1cbiAgcmV0dXJuIHJlc29sdmVkTWV0YXM7XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgVG9rZW4tMjAyMiBUcmFuc2ZlciBIb29rIGV4dHJhIGFjY291bnRzIGZvciBhIHNwZWNpZmljIHRyYW5zZmVyLlxuICpcbiAqIFRoaXMgaXMgZ2VuZXJpYzogaXQgd29ya3MgZm9yIGFueSBUb2tlbi0yMDIyIG1pbnQgYnkgcmVhZGluZyB0aGUgbWludCdzXG4gKiBUcmFuc2Zlckhvb2sgZXh0ZW5zaW9uIGFuZCB0aGUgaG9vayBwcm9ncmFtJ3MgRXh0cmFBY2NvdW50TWV0YUxpc3QgbGl2ZSBmcm9tXG4gKiB0aGUgbm9kZSwgdGhlbiByZXNvbHZpbmcgZWFjaCBleHRyYSBhY2NvdW50IChpbmNsdWRpbmcgc2VlZC1kZXJpdmVkIFBEQXMpIHZpYVxuICogdGhlIHN0YW5kYXJkIGBzcGwtdHJhbnNmZXItaG9vay1pbnRlcmZhY2VgIGhlbHBlcnMuIFRoZSByZXR1cm5lZCBtZXRhcyBhcmUgaW5cbiAqIHRoZSBleGFjdCBvcmRlciB0aGUgaG9vayByZXF1aXJlcyBhbmQgYXJlIHN1aXRhYmxlIGZvclxuICogYFRva2VuVHJhbnNmZXIucGFyYW1zLnRyYW5zZmVySG9va0FjY291bnRzYC5cbiAqXG4gKiBXaGVuIHRoZSBtaW50IGhhcyBubyBUcmFuc2ZlciBIb29rLCB0aGlzIHJldHVybnMgYW4gZW1wdHkgYXJyYXkgYW5kIGNhbGxlcnMgY2FuXG4gKiBvbWl0IHRoZSBwYXJhbS5cbiAqXG4gKiBAcGFyYW0ge0Nvbm5lY3Rpb259IGNvbm5lY3Rpb24gLSBhIGBDb25uZWN0aW9uYCAob3Igc2hpbSkgZXhwb3NpbmcgYGdldEFjY291bnRJbmZvYFxuICogQHBhcmFtIHBhcmFtcyAtIHRoZSB0cmFuc2ZlciBwYXJhbWV0ZXJzXG4gKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLm1pbnQgLSB0aGUgVG9rZW4tMjAyMiBtaW50IGFkZHJlc3NcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMuc291cmNlIC0gdGhlIHNvdXJjZSB0b2tlbiBhY2NvdW50IChzZW5kZXIgQVRBKVxuICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5kZXN0aW5hdGlvbiAtIHRoZSBkZXN0aW5hdGlvbiB0b2tlbiBhY2NvdW50IChyZWNpcGllbnQgQVRBKVxuICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5vd25lciAtIHRoZSBzb3VyY2UgYWNjb3VudCBvd25lciAvIHRyYW5zZmVyIGF1dGhvcml0eVxuICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5hbW91bnQgLSB0aGUgcmF3IHRyYW5zZmVyIGFtb3VudCBpbiBiYXNlIHVuaXRzXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxFeHRyYUFjY291bnRNZXRhW10+fSBvcmRlcmVkIGV4dHJhIGFjY291bnQgbWV0YXMsIG9yIFtdIHdoZW4gbm8gaG9va1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVRyYW5zZmVySG9va0FjY291bnRzKFxuICBjb25uZWN0aW9uOiBDb25uZWN0aW9uLFxuICBwYXJhbXM6IHsgbWludDogc3RyaW5nOyBzb3VyY2U6IHN0cmluZzsgZGVzdGluYXRpb246IHN0cmluZzsgb3duZXI6IHN0cmluZzsgYW1vdW50OiBzdHJpbmcgfVxuKTogUHJvbWlzZTxFeHRyYUFjY291bnRNZXRhW10+IHtcbiAgY29uc3QgeyBtaW50LCBzb3VyY2UsIGRlc3RpbmF0aW9uLCBvd25lciwgYW1vdW50IH0gPSBwYXJhbXM7XG4gIGNvbnN0IG1pbnRQdWJrZXkgPSBuZXcgU29sUHVibGljS2V5KG1pbnQpO1xuXG4gIC8vIFJlYWQgdGhlIG1pbnQgYW5kIGRldGVjdCB3aGV0aGVyIGEgVHJhbnNmZXIgSG9vayBleHRlbnNpb24gaXMgY29uZmlndXJlZC5cbiAgY29uc3QgbWludEFjY291bnRJbmZvID0gYXdhaXQgY29ubmVjdGlvbi5nZXRBY2NvdW50SW5mbyhtaW50UHVia2V5KTtcbiAgaWYgKCFtaW50QWNjb3VudEluZm8pIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgY29uc3QgbWludFN0YXRlID0gdW5wYWNrTWludChtaW50UHVia2V5LCBtaW50QWNjb3VudEluZm8sIFRPS0VOXzIwMjJfUFJPR1JBTV9JRCk7XG4gIGNvbnN0IHRyYW5zZmVySG9vayA9IGdldFRyYW5zZmVySG9vayhtaW50U3RhdGUpO1xuICBpZiAoIXRyYW5zZmVySG9vayB8fCB0cmFuc2Zlckhvb2sucHJvZ3JhbUlkLmVxdWFscyhTb2xQdWJsaWNLZXkuZGVmYXVsdCkpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCBzb3VyY2VQdWJrZXkgPSBuZXcgU29sUHVibGljS2V5KHNvdXJjZSk7XG4gIGNvbnN0IGRlc3RpbmF0aW9uUHVia2V5ID0gbmV3IFNvbFB1YmxpY0tleShkZXN0aW5hdGlvbik7XG4gIGNvbnN0IG93bmVyUHVia2V5ID0gbmV3IFNvbFB1YmxpY0tleShvd25lcik7XG4gIGNvbnN0IHRyYW5zZmVyQW1vdW50ID0gQmlnSW50KGFtb3VudCk7XG5cbiAgLy8gU3RhcnQgZnJvbSBhIGJhc2UgdHJhbnNmZXJDaGVja2VkIGluc3RydWN0aW9uOyBhZGRFeHRyYUFjY291bnRNZXRhc0ZvckV4ZWN1dGVcbiAgLy8gYXBwZW5kcyB0aGUgcmVzb2x2ZWQgZXh0cmEgYWNjb3VudHMsIHRoZSBob29rIHByb2dyYW0sIGFuZCB0aGUgdmFsaWRhdGlvblxuICAvLyBzdGF0ZSBhY2NvdW50IGluIHRoZSByZXF1aXJlZCBvcmRlci5cbiAgY29uc3QgaW5zdHJ1Y3Rpb24gPSBjcmVhdGVUcmFuc2ZlckNoZWNrZWRJbnN0cnVjdGlvbihcbiAgICBzb3VyY2VQdWJrZXksXG4gICAgbWludFB1YmtleSxcbiAgICBkZXN0aW5hdGlvblB1YmtleSxcbiAgICBvd25lclB1YmtleSxcbiAgICB0cmFuc2ZlckFtb3VudCxcbiAgICBtaW50U3RhdGUuZGVjaW1hbHMsXG4gICAgW10sXG4gICAgVE9LRU5fMjAyMl9QUk9HUkFNX0lEXG4gICk7XG4gIGNvbnN0IGJhc2VLZXlDb3VudCA9IGluc3RydWN0aW9uLmtleXMubGVuZ3RoO1xuICBhd2FpdCBhZGRFeHRyYUFjY291bnRNZXRhc0ZvckV4ZWN1dGUoXG4gICAgY29ubmVjdGlvbixcbiAgICBpbnN0cnVjdGlvbixcbiAgICB0cmFuc2Zlckhvb2sucHJvZ3JhbUlkLFxuICAgIHNvdXJjZVB1YmtleSxcbiAgICBtaW50UHVia2V5LFxuICAgIGRlc3RpbmF0aW9uUHVia2V5LFxuICAgIG93bmVyUHVia2V5LFxuICAgIHRyYW5zZmVyQW1vdW50XG4gICk7XG5cbiAgcmV0dXJuIHRvRXh0cmFBY2NvdW50TWV0YXMoaW5zdHJ1Y3Rpb24sIGJhc2VLZXlDb3VudCk7XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgc1JGQy0zNyBUb2tlbiBBQ0wgcGVybWlzc2lvbmxlc3MtdGhhdyBkZXBlbmRlbmNpZXMgZm9yIGEgdG9rZW4gYWNjb3VudC5cbiAqXG4gKiBUaGlzIGlzIGdlbmVyaWM6IGl0IHdvcmtzIGZvciBBTlkgYWxsb3dsaXN0L2Jsb2NrbGlzdCAoRGVmYXVsdEFjY291bnRTdGF0ZSkgVG9rZW4tMjAyMiBtaW50XG4gKiBnYXRlZCBieSB0aGUgVG9rZW4gQUNMIHByb2dyYW0g4oCUIG5vIGlzc3VlciBpcyBoYXJkY29kZWQuIEl0IHJlYWRzIHRoZSBtaW50J3MgTWludENvbmZpZyBQREFcbiAqIGxpdmUgZnJvbSB0aGUgbm9kZSwgYW5kIG9ubHkgd2hlbiBwZXJtaXNzaW9ubGVzcyB0aGF3IGlzIGVuYWJsZWQgZG9lcyBpdCBkZXJpdmUgdGhlIGZsYWcgL1xuICogbWludC1jb25maWcgLyB0aGF3LWV4dHJhLW1ldGFzIFBEQXMgYW5kIHJlc29sdmUgdGhlIGdhdGluZyBwcm9ncmFtJ3MgZXh0cmEgYWNjb3VudCBtZXRhcyAoaW5cbiAqIHRoZSBleGFjdCBvcmRlciB0aGUgZ2F0aW5nIHByb2dyYW0gcmVxdWlyZXMsIG1pcnJvcmluZyBgcmVzb2x2ZUV4dHJhTWV0YXNgKS5cbiAqXG4gKiBXaGVuIHRoZSBtaW50IGlzIG5vdCBhIFRva2VuIEFDTCBtaW50LCBvciBwZXJtaXNzaW9ubGVzcyB0aGF3IGlzIGRpc2FibGVkLCB0aGlzIHJldHVybnNcbiAqIGB7IGFwcGxpY2FibGU6IGZhbHNlIH1gIGFuZCBjYWxsZXJzIHNraXAgdGhlIHRoYXcuXG4gKlxuICogQHBhcmFtIHtDb25uZWN0aW9ufSBjb25uZWN0aW9uIC0gYSBgQ29ubmVjdGlvbmAgKG9yIHNoaW0pIGV4cG9zaW5nIGBnZXRBY2NvdW50SW5mb2BcbiAqIEBwYXJhbSBwYXJhbXMgLSB0aGUgdGhhdyBwYXJhbWV0ZXJzXG4gKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLm1pbnQgLSB0aGUgVG9rZW4tMjAyMiBtaW50IGFkZHJlc3NcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMudG9rZW5BY2NvdW50IC0gdGhlIHRva2VuIGFjY291bnQgKEFUQSkgdG8gdGhhd1xuICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy50b2tlbkFjY291bnRPd25lciAtIHRoZSBvd25lciBvZiB0aGUgdG9rZW4gYWNjb3VudFxuICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5hdXRob3JpdHkgLSB0aGUgc2lnbmVyIGludm9raW5nIHRoZSB0aGF3IChmZWUgcGF5ZXIgLyBhdXRob3JpdHkpXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxSZXNvbHZlUGVybWlzc2lvbmxlc3NUaGF3UmVzdWx0Pn0gdGhlIHJlc29sdmVkIHRoYXcgcGFyYW1zLCBvciBgeyBhcHBsaWNhYmxlOiBmYWxzZSB9YFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVBlcm1pc3Npb25sZXNzVGhhdyhcbiAgY29ubmVjdGlvbjogQ29ubmVjdGlvbixcbiAgcGFyYW1zOiB7IG1pbnQ6IHN0cmluZzsgdG9rZW5BY2NvdW50OiBzdHJpbmc7IHRva2VuQWNjb3VudE93bmVyOiBzdHJpbmc7IGF1dGhvcml0eTogc3RyaW5nIH1cbik6IFByb21pc2U8UmVzb2x2ZVBlcm1pc3Npb25sZXNzVGhhd1Jlc3VsdD4ge1xuICBjb25zdCB7IG1pbnQsIHRva2VuQWNjb3VudCwgdG9rZW5BY2NvdW50T3duZXIsIGF1dGhvcml0eSB9ID0gcGFyYW1zO1xuICBjb25zdCBtaW50UHVia2V5ID0gbmV3IFNvbFB1YmxpY0tleShtaW50KTtcbiAgY29uc3QgdG9rZW5BY2NvdW50UHVia2V5ID0gbmV3IFNvbFB1YmxpY0tleSh0b2tlbkFjY291bnQpO1xuICBjb25zdCB0b2tlbkFjY291bnRPd25lclB1YmtleSA9IG5ldyBTb2xQdWJsaWNLZXkodG9rZW5BY2NvdW50T3duZXIpO1xuICBjb25zdCBhdXRob3JpdHlQdWJrZXkgPSBuZXcgU29sUHVibGljS2V5KGF1dGhvcml0eSk7XG4gIGNvbnN0IHRva2VuQWNsUHJvZ3JhbUlkID0gbmV3IFNvbFB1YmxpY0tleShUT0tFTl9BQ0xfUFJPR1JBTV9JRCk7XG5cbiAgLy8gMS4gUmVhZCB0aGUgbWludCdzIE1pbnRDb25maWcgUERBLiBBYnNlbnQgPT4gdGhlIG1pbnQgaXMgbm90IGEgVG9rZW4gQUNMIG1pbnQuXG4gIGNvbnN0IFttaW50Q29uZmlnUGRhXSA9IFNvbFB1YmxpY0tleS5maW5kUHJvZ3JhbUFkZHJlc3NTeW5jKFxuICAgIFtCdWZmZXIuZnJvbShUT0tFTl9BQ0xfTUlOVF9DT05GSUdfU0VFRCksIG1pbnRQdWJrZXkudG9CdWZmZXIoKV0sXG4gICAgdG9rZW5BY2xQcm9ncmFtSWRcbiAgKTtcbiAgY29uc3QgbWludENvbmZpZ0FjY291bnQgPSBhd2FpdCBjb25uZWN0aW9uLmdldEFjY291bnRJbmZvKG1pbnRDb25maWdQZGEpO1xuICBpZiAoIW1pbnRDb25maWdBY2NvdW50KSB7XG4gICAgcmV0dXJuIHsgYXBwbGljYWJsZTogZmFsc2UgfTtcbiAgfVxuXG4gIC8vIDIuIERlY29kZSB0aGUgTWludENvbmZpZzsgcGVybWlzc2lvbmxlc3MgdGhhdyBtdXN0IGJlIGVuYWJsZWQuXG4gIGNvbnN0IG1pbnRDb25maWcgPSBkZWNvZGVUb2tlbkFjbE1pbnRDb25maWcobWludENvbmZpZ0FjY291bnQuZGF0YSk7XG4gIGlmICghbWludENvbmZpZy5lbmFibGVQZXJtaXNzaW9ubGVzc1RoYXcpIHtcbiAgICByZXR1cm4geyBhcHBsaWNhYmxlOiBmYWxzZSB9O1xuICB9XG4gIGNvbnN0IGdhdGluZ1Byb2dyYW1QdWJrZXkgPSBtaW50Q29uZmlnLmdhdGluZ1Byb2dyYW07XG5cbiAgLy8gMy4gRGVyaXZlIHRoZSByZW1haW5pbmcgUERBcyAoZmxhZyBhY2NvdW50IHVuZGVyIFRva2VuIEFDTCwgdGhhdyBleHRyYSBtZXRhcyB1bmRlciBnYXRpbmcpLlxuICBjb25zdCBbZmxhZ0FjY291bnRQZGFdID0gU29sUHVibGljS2V5LmZpbmRQcm9ncmFtQWRkcmVzc1N5bmMoXG4gICAgW0J1ZmZlci5mcm9tKFRPS0VOX0FDTF9GTEFHX0FDQ09VTlRfU0VFRCksIHRva2VuQWNjb3VudFB1YmtleS50b0J1ZmZlcigpXSxcbiAgICB0b2tlbkFjbFByb2dyYW1JZFxuICApO1xuICBjb25zdCBbdGhhd0V4dHJhTWV0YXNQZGFdID0gU29sUHVibGljS2V5LmZpbmRQcm9ncmFtQWRkcmVzc1N5bmMoXG4gICAgW0J1ZmZlci5mcm9tKFRPS0VOX0FDTF9USEFXX0VYVFJBX01FVEFTX1NFRUQpLCBtaW50UHVia2V5LnRvQnVmZmVyKCldLFxuICAgIGdhdGluZ1Byb2dyYW1QdWJrZXlcbiAgKTtcblxuICAvLyA0LiBCdWlsZCB0aGUgNi1hY2NvdW50IGNhbi10aGF3IGNvbnRleHQgKGFsbCByZWFkb25seSksIHRoZW4gcmVzb2x2ZSB0aGUgZ2F0aW5nIHByb2dyYW0nc1xuICAvLyAgICBleHRyYSBhY2NvdW50IG1ldGFzIG9udG8gaXQuXG4gIGNvbnN0IGNhblRoYXdDb250ZXh0OiBBY2NvdW50TWV0YVtdID0gW1xuICAgIHsgcHVia2V5OiBhdXRob3JpdHlQdWJrZXksIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogZmFsc2UgfSxcbiAgICB7IHB1YmtleTogdG9rZW5BY2NvdW50UHVia2V5LCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IGZhbHNlIH0sXG4gICAgeyBwdWJrZXk6IG1pbnRQdWJrZXksIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogZmFsc2UgfSxcbiAgICB7IHB1YmtleTogdG9rZW5BY2NvdW50T3duZXJQdWJrZXksIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogZmFsc2UgfSxcbiAgICB7IHB1YmtleTogZmxhZ0FjY291bnRQZGEsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogZmFsc2UgfSxcbiAgICB7IHB1YmtleTogdGhhd0V4dHJhTWV0YXNQZGEsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogZmFsc2UgfSxcbiAgXTtcbiAgY29uc3QgcmVzb2x2ZWRNZXRhcyA9IGF3YWl0IHJlc29sdmVUb2tlbkFjbEV4dHJhTWV0YXMoXG4gICAgY29ubmVjdGlvbixcbiAgICB0aGF3RXh0cmFNZXRhc1BkYSxcbiAgICBjYW5UaGF3Q29udGV4dCxcbiAgICBnYXRpbmdQcm9ncmFtUHVia2V5XG4gICk7XG5cbiAgLy8gNS4gRHJvcCB0aGUgZmlyc3QgZml2ZSBjb250ZXh0IGFjY291bnRzOyB0aGUgcmVtYWluZGVyIChbdGhhd0V4dHJhTWV0YXMsIC4uLmV4dHJhc10pIGFyZSB0aGVcbiAgLy8gICAgYWNjb3VudHMgYXBwZW5kZWQgYWZ0ZXIgdGhlIHRoYXcgaW5zdHJ1Y3Rpb24ncyBmaXhlZCBuaW5lLlxuICBjb25zdCBleHRyYUFjY291bnRzID0gcmVzb2x2ZWRNZXRhcy5zbGljZSg1KS5tYXAoKG1ldGEpID0+ICh7XG4gICAgcHVia2V5OiBtZXRhLnB1YmtleS50b0Jhc2U1OCgpLFxuICAgIGlzU2lnbmVyOiBtZXRhLmlzU2lnbmVyLFxuICAgIGlzV3JpdGFibGU6IG1ldGEuaXNXcml0YWJsZSxcbiAgfSkpO1xuXG4gIHJldHVybiB7XG4gICAgYXBwbGljYWJsZTogdHJ1ZSxcbiAgICBnYXRpbmdQcm9ncmFtOiBnYXRpbmdQcm9ncmFtUHVia2V5LnRvQmFzZTU4KCksXG4gICAgZmxhZ0FjY291bnQ6IGZsYWdBY2NvdW50UGRhLnRvQmFzZTU4KCksXG4gICAgbWludENvbmZpZzogbWludENvbmZpZ1BkYS50b0Jhc2U1OCgpLFxuICAgIHRva2VuUHJvZ3JhbTogVE9LRU5fMjAyMl9QUk9HUkFNX0lELnRvQmFzZTU4KCksXG4gICAgc3lzdGVtUHJvZ3JhbTogU3lzdGVtUHJvZ3JhbS5wcm9ncmFtSWQudG9CYXNlNTgoKSxcbiAgICBleHRyYUFjY291bnRzLFxuICB9O1xufVxuIl19
@@ -1,7 +1,7 @@
1
1
  import { BaseCoin as CoinConfig } from '@bitgo-beta/statics';
2
2
  import { TransactionType } from '@bitgo-beta/sdk-core';
3
3
  import { Transaction } from './transaction';
4
- import { TokenAssociateRecipient } from './iface';
4
+ import { ExtraAccountMeta, PermissionlessThawIdempotent, TokenAssociateRecipient } from './iface';
5
5
  import { TransactionBuilder } from './transactionBuilder';
6
6
  export interface SendParams {
7
7
  address: string;
@@ -14,7 +14,33 @@ export interface SendParams {
14
14
  export declare class TokenTransferBuilder extends TransactionBuilder {
15
15
  private _sendParams;
16
16
  private _createAtaParams;
17
+ private _transferHookAccounts?;
18
+ private _permissionlessThaw?;
17
19
  constructor(_coinConfig: Readonly<CoinConfig>);
20
+ /**
21
+ * Set the resolved sRFC-37 Token ACL permissionless-thaw params for this transfer.
22
+ *
23
+ * These must be resolved live by the caller (e.g. via `Sol.resolvePermissionlessThaw`) since
24
+ * builders remain offline and never perform RPC. When set, the built transaction bundles a
25
+ * `PermissionlessThawIdempotent` instruction after any ATA creation and before the transfer, so
26
+ * a freshly created (frozen) allowlist/blocklist token account is thawed atomically with the
27
+ * transfer — all-or-nothing.
28
+ *
29
+ * @param {PermissionlessThawIdempotent['params']} params - resolved thaw params
30
+ * @returns {TokenTransferBuilder} This transaction builder
31
+ */
32
+ permissionlessThaw(params: PermissionlessThawIdempotent['params']): this;
33
+ /**
34
+ * Set the resolved Token-2022 Transfer Hook extra account metas for this transfer.
35
+ *
36
+ * These must be resolved live by the caller (e.g. via `Sol.resolveTransferHookAccounts`)
37
+ * since builders remain offline and never perform RPC. The order is significant and
38
+ * must match the hook's ExtraAccountMetaList.
39
+ *
40
+ * @param {ExtraAccountMeta[]} metas - resolved extra account metas, in hook order
41
+ * @returns {TokenTransferBuilder} This transaction builder
42
+ */
43
+ transferHookAccounts(metas: ExtraAccountMeta[]): this;
18
44
  protected get transactionType(): TransactionType;
19
45
  initBuilder(tx: Transaction): void;
20
46
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"tokenTransferBuilder.d.ts","sourceRoot":"","sources":["../../../src/lib/tokenTransferBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAyB,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC9E,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAU5C,OAAO,EAAW,uBAAuB,EAAiC,MAAM,SAAS,CAAC;AAE1F,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAG1D,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAID,qBAAa,oBAAqB,SAAQ,kBAAkB;IAC1D,OAAO,CAAC,WAAW,CAAoB;IACvC,OAAO,CAAC,gBAAgB,CAA4B;gBAExC,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;IAK7C,SAAS,KAAK,eAAe,IAAI,eAAe,CAE/C;IAED,WAAW,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI;IA6BlC;;;;;;;;OAQG;IACH,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,EAAE,UAAU,GAAG,IAAI;IAa9F;;;;;;OAMG;IACH,4BAA4B,CAAC,SAAS,EAAE,uBAAuB,GAAG,IAAI;IAmBtE,kBAAkB;cACF,mBAAmB,IAAI,OAAO,CAAC,WAAW,CAAC;CAkG5D"}
1
+ {"version":3,"file":"tokenTransferBuilder.d.ts","sourceRoot":"","sources":["../../../src/lib/tokenTransferBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAyB,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC9E,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAU5C,OAAO,EAEL,gBAAgB,EAChB,4BAA4B,EAC5B,uBAAuB,EAGxB,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAG1D,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAID,qBAAa,oBAAqB,SAAQ,kBAAkB;IAC1D,OAAO,CAAC,WAAW,CAAoB;IACvC,OAAO,CAAC,gBAAgB,CAA4B;IACpD,OAAO,CAAC,qBAAqB,CAAC,CAAqB;IACnD,OAAO,CAAC,mBAAmB,CAAC,CAAyC;gBAEzD,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;IAK7C;;;;;;;;;;;OAWG;IACH,kBAAkB,CAAC,MAAM,EAAE,4BAA4B,CAAC,QAAQ,CAAC,GAAG,IAAI;IAKxE;;;;;;;;;OASG;IACH,oBAAoB,CAAC,KAAK,EAAE,gBAAgB,EAAE,GAAG,IAAI;IAKrD,SAAS,KAAK,eAAe,IAAI,eAAe,CAE/C;IAED,WAAW,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI;IA6BlC;;;;;;;;OAQG;IACH,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,EAAE,UAAU,GAAG,IAAI;IAa9F;;;;;;OAMG;IACH,4BAA4B,CAAC,SAAS,EAAE,uBAAuB,GAAG,IAAI;IAmBtE,kBAAkB;cACF,mBAAmB,IAAI,OAAO,CAAC,WAAW,CAAC;CA8G5D"}
@@ -11,6 +11,36 @@ export class TokenTransferBuilder extends TransactionBuilder {
11
11
  this._sendParams = [];
12
12
  this._createAtaParams = [];
13
13
  }
14
+ /**
15
+ * Set the resolved sRFC-37 Token ACL permissionless-thaw params for this transfer.
16
+ *
17
+ * These must be resolved live by the caller (e.g. via `Sol.resolvePermissionlessThaw`) since
18
+ * builders remain offline and never perform RPC. When set, the built transaction bundles a
19
+ * `PermissionlessThawIdempotent` instruction after any ATA creation and before the transfer, so
20
+ * a freshly created (frozen) allowlist/blocklist token account is thawed atomically with the
21
+ * transfer — all-or-nothing.
22
+ *
23
+ * @param {PermissionlessThawIdempotent['params']} params - resolved thaw params
24
+ * @returns {TokenTransferBuilder} This transaction builder
25
+ */
26
+ permissionlessThaw(params) {
27
+ this._permissionlessThaw = params;
28
+ return this;
29
+ }
30
+ /**
31
+ * Set the resolved Token-2022 Transfer Hook extra account metas for this transfer.
32
+ *
33
+ * These must be resolved live by the caller (e.g. via `Sol.resolveTransferHookAccounts`)
34
+ * since builders remain offline and never perform RPC. The order is significant and
35
+ * must match the hook's ExtraAccountMetaList.
36
+ *
37
+ * @param {ExtraAccountMeta[]} metas - resolved extra account metas, in hook order
38
+ * @returns {TokenTransferBuilder} This transaction builder
39
+ */
40
+ transferHookAccounts(metas) {
41
+ this._transferHookAccounts = metas;
42
+ return this;
43
+ }
14
44
  get transactionType() {
15
45
  return TransactionType.Send;
16
46
  }
@@ -125,6 +155,7 @@ export class TokenTransferBuilder extends TransactionBuilder {
125
155
  tokenAddress: tokenAddress,
126
156
  programId: programId,
127
157
  decimalPlaces: decimals,
158
+ ...(this._transferHookAccounts ? { transferHookAccounts: this._transferHookAccounts } : {}),
128
159
  },
129
160
  };
130
161
  }));
@@ -176,14 +207,24 @@ export class TokenTransferBuilder extends TransactionBuilder {
176
207
  fee: this._priorityFee,
177
208
  },
178
209
  };
210
+ // When resolved, emit the permissionless thaw between ATA creation and the transfer so the
211
+ // built order is [CreateATA?, PermissionlessThawIdempotent, TokenTransfer].
212
+ const thawInstructions = this._permissionlessThaw
213
+ ? [{ type: InstructionBuilderTypes.PermissionlessThawIdempotent, params: this._permissionlessThaw }]
214
+ : [];
179
215
  if (!this._priorityFee || this._priorityFee === Number(0)) {
180
- this._instructionsData = [...createAtaInstructions, ...sendInstructions];
216
+ this._instructionsData = [...createAtaInstructions, ...thawInstructions, ...sendInstructions];
181
217
  }
182
218
  else {
183
219
  // order is important, createAtaInstructions must be before sendInstructions
184
- this._instructionsData = [addPriorityFeeInstruction, ...createAtaInstructions, ...sendInstructions];
220
+ this._instructionsData = [
221
+ addPriorityFeeInstruction,
222
+ ...createAtaInstructions,
223
+ ...thawInstructions,
224
+ ...sendInstructions,
225
+ ];
185
226
  }
186
227
  return await super.buildImplementation();
187
228
  }
188
229
  }
189
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW5UcmFuc2ZlckJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3Rva2VuVHJhbnNmZXJCdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxlQUFlLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUU5RSxPQUFPLEVBQ0wsZ0NBQWdDLEVBQ2hDLHdCQUF3QixFQUN4QixhQUFhLEVBQ2IsZUFBZSxFQUNmLG1CQUFtQixFQUNuQixvQkFBb0IsR0FDckIsTUFBTSxTQUFTLENBQUM7QUFDakIsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRXRELE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMxRCxPQUFPLENBQUMsTUFBTSxRQUFRLENBQUM7QUFXdkIsTUFBTSxtQkFBbUIsR0FBRyxNQUFNLENBQUMsc0JBQXNCLENBQUMsQ0FBQztBQUUzRCxNQUFNLE9BQU8sb0JBQXFCLFNBQVEsa0JBQWtCO0lBSTFELFlBQVksV0FBaUM7UUFDM0MsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBSmIsZ0JBQVcsR0FBaUIsRUFBRSxDQUFDO1FBS3JDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVELElBQWMsZUFBZTtRQUMzQixPQUFPLGVBQWUsQ0FBQyxJQUFJLENBQUM7SUFDOUIsQ0FBQztJQUVELFdBQVcsQ0FBQyxFQUFlO1FBQ3pCLEtBQUssQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFdEIsS0FBSyxNQUFNLFdBQVcsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUNqRCxJQUFJLFdBQVcsQ0FBQyxJQUFJLEtBQUssdUJBQXVCLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQy9ELE1BQU0sbUJB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QUMsY0FBYztZQUM1QyxNQUFNLEVBQUU7Z0JBQ04sR0FBRyxFQUFFLElBQUksQ0FBQyxZQUFZO2FBQ3ZCO1NBQ0YsQ0FBQztRQUVGLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxZQUFZLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDMUQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLENBQUMsR0FBRyxxQkFBcUIsRUFBRSxHQUFHLGdCQUFnQixDQUFDLENBQUM7UUFDM0UsQ0FBQzthQUFNLENBQUM7WUFDTiw0RUFBNEU7WUFDNUUsSUFBSSxDQUFDLGlCQUFpQixHQUFHLENBQUMseUJBQXlCLEVBQUUsR0FBRyxxQkFBcUIsRUFBRSxHQUFHLGdCQUFnQixDQUFDLENBQUM7UUFDdEcsQ0FBQztRQUNELE9BQU8sTUFBTSxLQUFLLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUMzQyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlQ29pbiBhcyBDb2luQ29uZmlnIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IsIFRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uIH0gZnJvbSAnLi90cmFuc2FjdGlvbic7XG5pbXBvcnQge1xuICBnZXRBc3NvY2lhdGVkVG9rZW5BY2NvdW50QWRkcmVzcyxcbiAgZ2V0U29sVG9rZW5Gcm9tVG9rZW5OYW1lLFxuICBpc1ZhbGlkQW1vdW50LFxuICB2YWxpZGF0ZUFkZHJlc3MsXG4gIHZhbGlkYXRlTWludEFkZHJlc3MsXG4gIHZhbGlkYXRlT3duZXJBZGRyZXNzLFxufSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IEluc3RydWN0aW9uQnVpbGRlclR5cGVzIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgQXRhSW5pdCwgVG9rZW5Bc3NvY2lhdGVSZWNpcGllbnQsIFRva2VuVHJhbnNmZXIsIFNldFByaW9yaXR5RmVlIH0gZnJvbSAnLi9pZmFjZSc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkJ1aWxkZXIgfSBmcm9tICcuL3RyYW5zYWN0aW9uQnVpbGRlcic7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNlbmRQYXJhbXMge1xuICBhZGRyZXNzOiBzdHJpbmc7XG4gIGFtb3VudDogc3RyaW5nO1xuICB0b2tlbk5hbWU6IHN0cmluZztcbiAgdG9rZW5BZGRyZXNzPzogc3RyaW5nO1xuICBwcm9ncmFtSWQ/OiBzdHJpbmc7XG4gIGRlY2ltYWxQbGFjZXM/OiBudW1iZXI7XG59XG5cbmNvbnN0IFVOU0lHTkVEX0JJR0lOVF9NQVggPSBCaWdJbnQoJzE4NDQ2NzQ0MDczNzA5NTUxNjE1Jyk7XG5cbmV4cG9ydCBjbGFzcyBUb2tlblRyYW5zZmVyQnVpbGRlciBleHRlbmRzIFRyYW5zYWN0aW9uQnVpbGRlciB7XG4gIHByaXZhdGUgX3NlbmRQYXJhbXM6IFNlbmRQYXJhbXNbXSA9IFtdO1xuICBwcml2YXRlIF9jcmVhdGVBdGFQYXJhbXM6IFRva2VuQXNzb2NpYXRlUmVjaXBpZW50W107XG5cbiAgY29uc3RydWN0b3IoX2NvaW5Db25maWc6IFJlYWRvbmx5PENvaW5Db25maWc+KSB7XG4gICAgc3VwZXIoX2NvaW5Db25maWcpO1xuICAgIHRoaXMuX2NyZWF0ZUF0YVBhcmFtcyA9IFtdO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCB0cmFuc2FjdGlvblR5cGUoKTogVHJhbnNhY3Rpb25UeXBlIHtcbiAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLlNlbmQ7XG4gIH1cblxuICBpbml0QnVpbGRlcih0eDogVHJhbnNhY3Rpb24pOiB2b2lkIHtcbiAgICBzdXBlci5pbml0QnVpbGRlcih0eCk7XG5cbiAgICBmb3IgKGNvbnN0IGluc3RydWN0aW9uIG9mIHRoaXMuX2luc3RydWN0aW9uc0RhdGEpIHtcbiAgICAgIGlmIChpbnN0cnVjdGlvbi50eXBlID09PSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5Ub2tlblRyYW5zZmVyKSB7XG4gICAgICAgIGNvbnN0IHRyYW5zZmVySW5zdHJ1Y3Rpb246IFRva2VuVHJhbnNmZXIgPSBpbnN0cnVjdGlvbjtcbiAgICAgICAgdGhpcy5zZW5kZXIodHJhbnNmZXJJbnN0cnVjdGlvbi5wYXJhbXMuZnJvbUFkZHJlc3MpO1xuICAgICAgICB0aGlzLnNlbmQoe1xuICAgICAgICAgIGFkZHJlc3M6IHRyYW5zZmVySW5zdHJ1Y3Rpb24ucGFyYW1zLnRvQWRkcmVzcyxcbiAgICAgICAgICBhbW91bnQ6IHRyYW5zZmVySW5zdHJ1Y3Rpb24ucGFyYW1zLmFtb3VudCxcbiAgICAgICAgICB0b2tlbk5hbWU6IHRyYW5zZmVySW5zdHJ1Y3Rpb24ucGFyYW1zLnRva2VuTmFtZSxcbiAgICAgICAgICB0b2tlbkFkZHJlc3M6IHRyYW5zZmVySW5zdHJ1Y3Rpb24ucGFyYW1zLnRva2VuQWRkcmVzcyxcbiAgICAgICAgICBwcm9ncmFtSWQ6IHRyYW5zZmVySW5zdHJ1Y3Rpb24ucGFyYW1zLnByb2dyYW1JZCxcbiAgICAgICAgICBkZWNpbWFsUGxhY2VzOiB0cmFuc2Zlckluc3RydWN0aW9uLnBhcmFtcy5kZWNpbWFsUGxhY2VzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChpbnN0cnVjdGlvbi50eXBlID09PSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5DcmVhdGVBc3NvY2lhdGVkVG9rZW5BY2NvdW50KSB7XG4gICAgICAgIGNvbnN0IGF0YUluaXRJbnN0cnVjdGlvbjogQXRhSW5pdCA9IGluc3RydWN0aW9uO1xuICAgICAgICB0aGlzLl9jcmVhdGVBdGFQYXJhbXMucHVzaCh7XG4gICAgICAgICAgb3duZXJBZGRyZXNzOiBhdGFJbml0SW5zdHJ1Y3Rpb24ucGFyYW1zLm93bmVyQWRkcmVzcyxcbiAgICAgICAgICB0b2tlbk5hbWU6IGF0YUluaXRJbnN0cnVjdGlvbi5wYXJhbXMudG9rZW5OYW1lLFxuICAgICAgICAgIGF0YUFkZHJlc3M6IGF0YUluaXRJbnN0cnVjdGlvbi5wYXJhbXMuYXRhQWRkcmVzcyxcbiAgICAgICAgICB0b2tlbkFkZHJlc3M6IGF0YUluaXRJbnN0cnVjdGlvbi5wYXJhbXMubWludEFkZHJlc3MsXG4gICAgICAgICAgcHJvZ3JhbUlkOiBhdGFJbml0SW5zdHJ1Y3Rpb24ucGFyYW1zLnByb2dyYW1JZCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqICBTZXQgYSB0cmFuc2ZlclxuICAgKlxuICAgKiBAcGFyYW0ge1NlbmRQYXJhbXN9IHBhcmFtcyAtIHBhcmFtcyBmb3IgdGhlIHRyYW5zZmVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMuYWRkcmVzcyAtIHRoZSByZWNlaXZlciB0b2tlbiBhZGRyZXNzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMuYW1vdW50IC0gdGhlIGFtb3VudCBzZW50XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMudG9rZW5OYW1lIC0gbmFtZSBvZiB0b2tlbiB0aGF0IGlzIGludGVuZGVkIHRvIHNlbmRcbiAgICogQHJldHVybnMge1RyYW5zYWN0aW9uQnVpbGRlcn0gVGhpcyB0cmFuc2FjdGlvbiBidWlsZGVyXG4gICAqL1xuICBzZW5kKHsgYWRkcmVzcywgYW1vdW50LCB0b2tlbk5hbWUsIHRva2VuQWRkcmVzcywgcHJvZ3JhbUlkLCBkZWNpbWFsUGxhY2VzIH06IFNlbmRQYXJhbXMpOiB0aGlzIHtcbiAgICB2YWxpZGF0ZUFkZHJlc3MoYWRkcmVzcywgJ2FkZHJlc3MnKTtcbiAgICBpZiAoIWFtb3VudCB8fCAhaXNWYWxpZEFtb3VudChhbW91bnQpKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdJbnZhbGlkIG9yIG1pc3NpbmcgYW1vdW50LCBnb3Q6ICcgKyBhbW91bnQpO1xuICAgIH1cbiAgICBpZiAoQmlnSW50KGFtb3VudCkgPiBVTlNJR05FRF9CSUdJTlRfTUFYKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKGBpbnB1dCBhbW91bnQgJHthbW91bnR9IGV4Y2VlZHMgYmlnIGludCBsaW1pdCAke1VOU0lHTkVEX0JJR0lOVF9NQVh9YCk7XG4gICAgfVxuXG4gICAgdGhpcy5fc2VuZFBhcmFtcy5wdXNoKHsgYWRkcmVzcywgYW1vdW50LCB0b2tlbk5hbWU6IHRva2VuTmFtZSwgdG9rZW5BZGRyZXNzLCBwcm9ncmFtSWQsIGRlY2ltYWxQbGFjZXMgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtUb2tlbkFzc29jaWF0ZVJlY2lwaWVudH0gcmVjaXBpZW50IC0gcmVjaXBpZW50IG9mIHRoZSBhc3NvY2lhdGVkIHRva2VuIGFjY291bnQgY3JlYXRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlY2lwaWVudC5vd25lckFkZHJlc3MgLSBvd25lciBvZiB0aGUgYXNzb2NpYXRlZCB0b2tlbiBhY2NvdW50XG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWNpcGllbnQudG9rZW5OYW1lIC0gbmFtZSBvZiB0aGUgdG9rZW4gdGhhdCBpcyBpbnRlbmRlZCB0byBhc3NvY2lhdGVcbiAgICogQHJldHVybnMge1RyYW5zYWN0aW9uQnVpbGRlcn0gVGhpcyB0cmFuc2FjdGlvbiBidWlsZGVyXG4gICAqL1xuICBjcmVhdGVBc3NvY2lhdGVkVG9rZW5BY2NvdW50KHJlY2lwaWVudDogVG9rZW5Bc3NvY2lhdGVSZWNpcGllbnQpOiB0aGlzIHtcbiAgICB2YWxpZGF0ZU93bmVyQWRkcmVzcyhyZWNpcGllbnQub3duZXJBZGRyZXNzKTtcbiAgICBsZXQgdG9rZW5BZGRyZXNzOiBzdHJpbmc7XG4gICAgaWYgKHJlY2lwaWVudC50b2tlbkFkZHJlc3MpIHtcbiAgICAgIHRva2VuQWRkcmVzcyA9IHJlY2lwaWVudC50b2tlbkFkZHJlc3M7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHRva2VuID0gZ2V0U29sVG9rZW5Gcm9tVG9rZW5OYW1lKHJlY2lwaWVudC50b2tlbk5hbWUpO1xuICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgIHRva2VuQWRkcmVzcyA9IHRva2VuLnRva2VuQWRkcmVzcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgdG9rZW4gbmFtZSwgZ290OiAnICsgcmVjaXBpZW50LnRva2VuTmFtZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHZhbGlkYXRlTWludEFkZHJlc3ModG9rZW5BZGRyZXNzKTtcblxuICAgIHRoaXMuX2NyZWF0ZUF0YVBhcmFtcy5wdXNoKHJlY2lwaWVudCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGJ1aWxkSW1wbGVtZW50YXRpb24oKTogUHJvbWlzZTxUcmFuc2FjdGlvbj4ge1xuICAgIGFzc2VydCh0aGlzLl9zZW5kZXIsICdTZW5kZXIgbXVzdCBiZSBzZXQgYmVmb3JlIGJ1aWxkaW5nIHRoZSB0cmFuc2FjdGlvbicpO1xuICAgIGNvbnN0IHNlbmRJbnN0cnVjdGlvbnMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHRoaXMuX3NlbmRQYXJhbXMubWFwKGFzeW5jIChzZW5kUGFyYW1zOiBTZW5kUGFyYW1zKTogUHJvbWlzZTxUb2tlblRyYW5zZmVyPiA9PiB7XG4gICAgICAgIGxldCB0b2tlbkFkZHJlc3M6IHN0cmluZztcbiAgICAgICAgbGV0IHRva2VuTmFtZTogc3RyaW5nO1xuICAgICAgICBsZXQgcHJvZ3JhbUlkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIGxldCBkZWNpbWFsczogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAoc2VuZFBhcmFtcy50b2tlbkFkZHJlc3MgJiYgc2VuZFBhcmFtcy5wcm9ncmFtSWQgJiYgc2VuZFBhcmFtcy5kZWNpbWFsUGxhY2VzICE9IG51bGwpIHtcbiAgICAgICAgICB0b2tlbkFkZHJlc3MgPSBzZW5kUGFyYW1zLnRva2VuQWRkcmVzcztcbiAgICAgICAgICB0b2tlbk5hbWUgPSBzZW5kUGFyYW1zLnRva2VuTmFtZTtcbiAgICAgICAgICBwcm9ncmFtSWQgPSBzZW5kUGFyYW1zLnByb2dyYW1JZDtcbiAgICAgICAgICBkZWNpbWFscyA9IHNlbmRQYXJhbXMuZGVjaW1hbFBsYWNlcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBjb2luID0gZ2V0U29sVG9rZW5Gcm9tVG9rZW5OYW1lKHNlbmRQYXJhbXMudG9rZW5OYW1lKTtcbiAgICAgICAgICBpZiAoY29pbikge1xuICAgICAgICAgICAgdG9rZW5BZGRyZXNzID0gY29pbi50b2tlbkFkZHJlc3M7XG4gICAgICAgICAgICB0b2tlbk5hbWUgPSBjb2luLm5hbWU7XG4gICAgICAgICAgICBwcm9ncmFtSWQgPSBjb2luLnByb2dyYW1JZDtcbiAgICAgICAgICAgIGRlY2ltYWxzID0gY29pbi5kZWNpbWFsUGxhY2VzO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBkZXRlcm1pbmUgdG9rZW4gaW5mb3JtYXRpb24gZm9yICR7c2VuZFBhcmFtcy50b2tlbk5hbWV9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNvdXJjZUFkZHJlc3MgPSBhd2FpdCBnZXRBc3NvY2lhdGVkVG9rZW5BY2NvdW50QWRkcmVzcyh0b2tlbkFkZHJlc3MsIHRoaXMuX3NlbmRlciwgZmFsc2UsIHByb2dyYW1JZCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuVG9rZW5UcmFuc2ZlcixcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIGZyb21BZGRyZXNzOiB0aGlzLl9zZW5kZXIsXG4gICAgICAgICAgICB0b0FkZHJlc3M6IHNlbmRQYXJhbXMuYWRkcmVzcyxcbiAgICAgICAgICAgIGFtb3VudDogc2VuZFBhcmFtcy5hbW91bnQsXG4gICAgICAgICAgICB0b2tlbk5hbWU6IHRva2VuTmFtZSxcbiAgICAgICAgICAgIHNvdXJjZUFkZHJlc3M6IHNvdXJjZUFkZHJlc3MsXG4gICAgICAgICAgICB0b2tlbkFkZHJlc3M6IHRva2VuQWRkcmVzcyxcbiAgICAgICAgICAgIHByb2dyYW1JZDogcHJvZ3JhbUlkLFxuICAgICAgICAgICAgZGVjaW1hbFBsYWNlczogZGVjaW1hbHMsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICBjb25zdCB1bmlxdWVDcmVhdGVBdGFQYXJhbXMgPSBfLnVuaXFCeSh0aGlzLl9jcmVhdGVBdGFQYXJhbXMsIChyZWNpcGllbnQ6IFRva2VuQXNzb2NpYXRlUmVjaXBpZW50KSA9PiB7XG4gICAgICByZXR1cm4gcmVjaXBpZW50Lm93bmVyQWRkcmVzcyArIHJlY2lwaWVudC50b2tlbk5hbWU7XG4gICAgfSk7XG4gICAgY29uc3QgY3JlYXRlQXRhSW5zdHJ1Y3Rpb25zID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICB1bmlxdWVDcmVhdGVBdGFQYXJhbXMubWFwKGFzeW5jIChyZWNpcGllbnQ6IFRva2VuQXNzb2NpYXRlUmVjaXBpZW50KTogUHJvbWlzZTxBdGFJbml0PiA9PiB7XG4gICAgICAgIGxldCB0b2tlbkFkZHJlc3M6IHN0cmluZztcbiAgICAgICAgbGV0IHRva2VuTmFtZTogc3RyaW5nO1xuICAgICAgICBsZXQgcHJvZ3JhbUlkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChyZWNpcGllbnQudG9rZW5BZGRyZXNzICYmIHJlY2lwaWVudC5wcm9ncmFtSWQpIHtcbiAgICAgICAgICB0b2tlbk5hbWUgPSByZWNpcGllbnQudG9rZW5OYW1lO1xuICAgICAgICAgIHRva2VuQWRkcmVzcyA9IHJlY2lwaWVudC50b2tlbkFkZHJlc3M7XG4gICAgICAgICAgcHJvZ3JhbUlkID0gcmVjaXBpZW50LnByb2dyYW1JZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBjb2luID0gZ2V0U29sVG9rZW5Gcm9tVG9rZW5OYW1lKHJlY2lwaWVudC50b2tlbk5hbWUpO1xuICAgICAgICAgIGlmIChjb2luKSB7XG4gICAgICAgICAgICB0b2tlbk5hbWUgPSBjb2luLm5hbWU7XG4gICAgICAgICAgICB0b2tlbkFkZHJlc3MgPSBjb2luLnRva2VuQWRkcmVzcztcbiAgICAgICAgICAgIHByb2dyYW1JZCA9IGNvaW4ucHJvZ3JhbUlkO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBkZXRlcm1pbmUgdG9rZW4gaW5mb3JtYXRpb24gZm9yICR7cmVjaXBpZW50LnRva2VuTmFtZX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVc2UgdGhlIHByb3ZpZGVkIGF0YUFkZHJlc3MgaWYgaXQgZXhpc3RzLCBvdGhlcndpc2UgY2FsY3VsYXRlIGl0XG4gICAgICAgIGxldCBhdGFBZGRyZXNzID0gcmVjaXBpZW50LmF0YUFkZHJlc3M7XG4gICAgICAgIGlmICghYXRhQWRkcmVzcykge1xuICAgICAgICAgIGF0YUFkZHJlc3MgPSBhd2FpdCBnZXRBc3NvY2lhdGVkVG9rZW5BY2NvdW50QWRkcmVzcyh0b2tlbkFkZHJlc3MsIHJlY2lwaWVudC5vd25lckFkZHJlc3MsIGZhbHNlLCBwcm9ncmFtSWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuQ3JlYXRlQXNzb2NpYXRlZFRva2VuQWNjb3VudCxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIG93bmVyQWRkcmVzczogcmVjaXBpZW50Lm93bmVyQWRkcmVzcyxcbiAgICAgICAgICAgIG1pbnRBZGRyZXNzOiB0b2tlbkFkZHJlc3MsXG4gICAgICAgICAgICBhdGFBZGRyZXNzLFxuICAgICAgICAgICAgLy8gTWF0Y2ggdHJhbnNhY3Rpb25CdWlsZGVyIGZlZSBwYXllciBzZWxlY3Rpb246IHdoZW4gYSBkaXN0aW5jdCBmZWUgcGF5ZXJcbiAgICAgICAgICAgIC8vIGlzIHNldCAoZS5nLiBnYXMgdGFuayksIGl0IG11c3QgZnVuZCBBVEEgcmVudCDigJQgbm90IHRoZSB0b2tlbiBzZW5kZXIuXG4gICAgICAgICAgICBwYXllckFkZHJlc3M6IHRoaXMuX2ZlZVBheWVyID8/IHRoaXMuX3NlbmRlcixcbiAgICAgICAgICAgIHRva2VuTmFtZTogdG9rZW5OYW1lLFxuICAgICAgICAgICAgcHJvZ3JhbUlkOiBwcm9ncmFtSWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICBjb25zdCBhZGRQcmlvcml0eUZlZUluc3RydWN0aW9uOiBTZXRQcmlvcml0eUZlZSA9IHtcbiAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlNldFByaW9yaXR5RmVlLFxuICAgICAgcGFyYW1zOiB7XG4gICAgICAgIGZlZTogdGhpcy5fcHJpb3JpdHlGZWUsXG4gICAgICB9LFxuICAgIH07XG5cbiAgICBpZiAoIXRoaXMuX3ByaW9yaXR5RmVlIHx8IHRoaXMuX3ByaW9yaXR5RmVlID09PSBOdW1iZXIoMCkpIHtcbiAgICAgIHRoaXMuX2luc3RydWN0aW9uc0RhdGEgPSBbLi4uY3JlYXRlQXRhSW5zdHJ1Y3Rpb25zLCAuLi5zZW5kSW5zdHJ1Y3Rpb25zXTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gb3JkZXIgaXMgaW1wb3J0YW50LCBjcmVhdGVBdGFJbnN0cnVjdGlvbnMgbXVzdCBiZSBiZWZvcmUgc2VuZEluc3RydWN0aW9uc1xuICAgICAgdGhpcy5faW5zdHJ1Y3Rpb25zRGF0YSA9IFthZGRQcmlvcml0eUZlZUluc3RydWN0aW9uLCAuLi5jcmVhdGVBdGFJbnN0cnVjdGlvbnMsIC4uLnNlbmRJbnN0cnVjdGlvbnNdO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgc3VwZXIuYnVpbGRJbXBsZW1lbnRhdGlvbigpO1xuICB9XG59XG4iXX0=
230
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW5UcmFuc2ZlckJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3Rva2VuVHJhbnNmZXJCdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxlQUFlLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUU5RSxPQUFPLEVBQ0wsZ0NBQWdDLEVBQ2hDLHdCQUF3QixFQUN4QixhQUFhLEVBQ2IsZUFBZSxFQUNmLG1CQUFtQixFQUNuQixvQkFBb0IsR0FDckIsTUFBTSxTQUFTLENBQUM7QUFDakIsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBU3RELE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMxRCxPQUFPLENBQUMsTUFBTSxRQUFRLENBQUM7QUFXdkIsTUFBTSxtQkFBbUIsR0FBRyxNQUFNLENBQUMsc0JBQXNCLENBQUMsQ0FBQztBQUUzRCxNQUFNLE9BQU8sb0JBQXFCLFNBQVEsa0JBQWtCO0lBTTFELFlBQVksV0FBaUM7UUFDM0MsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBTmIsZ0JBQVcsR0FBaUIsRUFBRSxDQUFDO1FBT3JDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVEOzs7Ozs7Ozs7OztPQVdHO0lBQ0gsa0JBQWtCLENBQUMsTUFBOEM7UUFDL0QsSUFBSSxDQUFDLG1CQUFtQixHQUFHLE1BQU0sQ0FBQztRQUNsQyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSCxvQkFBb0IsQ0FBQyxLQUF5QjtRQUM1QyxJQUFJLENBQUMscUJBQXFCLEdBQUcsS0FBSyxDQUFDO1FBQ25DLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELElBQWMsZUFBZTtRQUMzQixP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O2FBQ3BCLENBQUM7UUFDSixDQUFDO1FBQ0QsT0FBTyxNQUFNLEtBQUssQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO0lBQzNDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJhc2VDb2luIGFzIENvaW5Db25maWcgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCB7IEJ1aWxkVHJhbnNhY3Rpb25FcnJvciwgVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb24gfSBmcm9tICcuL3RyYW5zYWN0aW9uJztcbmltcG9ydCB7XG4gIGdldEFzc29jaWF0ZWRUb2tlbkFjY291bnRBZGRyZXNzLFxuICBnZXRTb2xUb2tlbkZyb21Ub2tlbk5hbWUsXG4gIGlzVmFsaWRBbW91bnQsXG4gIHZhbGlkYXRlQWRkcmVzcyxcbiAgdmFsaWRhdGVNaW50QWRkcmVzcyxcbiAgdmFsaWRhdGVPd25lckFkZHJlc3MsXG59IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQge1xuICBBdGFJbml0LFxuICBFeHRyYUFjY291bnRNZXRhLFxuICBQZXJtaXNzaW9ubGVzc1RoYXdJZGVtcG90ZW50LFxuICBUb2tlbkFzc29jaWF0ZVJlY2lwaWVudCxcbiAgVG9rZW5UcmFuc2ZlcixcbiAgU2V0UHJpb3JpdHlGZWUsXG59IGZyb20gJy4vaWZhY2UnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25CdWlsZGVyIH0gZnJvbSAnLi90cmFuc2FjdGlvbkJ1aWxkZXInO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcblxuZXhwb3J0IGludGVyZmFjZSBTZW5kUGFyYW1zIHtcbiAgYWRkcmVzczogc3RyaW5nO1xuICBhbW91bnQ6IHN0cmluZztcbiAgdG9rZW5OYW1lOiBzdHJpbmc7XG4gIHRva2VuQWRkcmVzcz86IHN0cmluZztcbiAgcHJvZ3JhbUlkPzogc3RyaW5nO1xuICBkZWNpbWFsUGxhY2VzPzogbnVtYmVyO1xufVxuXG5jb25zdCBVTlNJR05FRF9CSUdJTlRfTUFYID0gQmlnSW50KCcxODQ0Njc0NDA3MzcwOTU1MTYxNScpO1xuXG5leHBvcnQgY2xhc3MgVG9rZW5UcmFuc2ZlckJ1aWxkZXIgZXh0ZW5kcyBUcmFuc2FjdGlvbkJ1aWxkZXIge1xuICBwcml2YXRlIF9zZW5kUGFyYW1zOiBTZW5kUGFyYW1zW10gPSBbXTtcbiAgcHJpdmF0ZSBfY3JlYXRlQXRhUGFyYW1zOiBUb2tlbkFzc29jaWF0ZVJlY2lwaWVudFtdO1xuICBwcml2YXRlIF90cmFuc2Zlckhvb2tBY2NvdW50cz86IEV4dHJhQWNjb3VudE1ldGFbXTtcbiAgcHJpdmF0ZSBfcGVybWlzc2lvbmxlc3NUaGF3PzogUGVybWlzc2lvbmxlc3NUaGF3SWRlbXBvdGVudFsncGFyYW1zJ107XG5cbiAgY29uc3RydWN0b3IoX2NvaW5Db25maWc6IFJlYWRvbmx5PENvaW5Db25maWc+KSB7XG4gICAgc3VwZXIoX2NvaW5Db25maWcpO1xuICAgIHRoaXMuX2NyZWF0ZUF0YVBhcmFtcyA9IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgcmVzb2x2ZWQgc1JGQy0zNyBUb2tlbiBBQ0wgcGVybWlzc2lvbmxlc3MtdGhhdyBwYXJhbXMgZm9yIHRoaXMgdHJhbnNmZXIuXG4gICAqXG4gICAqIFRoZXNlIG11c3QgYmUgcmVzb2x2ZWQgbGl2ZSBieSB0aGUgY2FsbGVyIChlLmcuIHZpYSBgU29sLnJlc29sdmVQZXJtaXNzaW9ubGVzc1RoYXdgKSBzaW5jZVxuICAgKiBidWlsZGVycyByZW1haW4gb2ZmbGluZSBhbmQgbmV2ZXIgcGVyZm9ybSBSUEMuIFdoZW4gc2V0LCB0aGUgYnVpbHQgdHJhbnNhY3Rpb24gYnVuZGxlcyBhXG4gICAqIGBQZXJtaXNzaW9ubGVzc1RoYXdJZGVtcG90ZW50YCBpbnN0cnVjdGlvbiBhZnRlciBhbnkgQVRBIGNyZWF0aW9uIGFuZCBiZWZvcmUgdGhlIHRyYW5zZmVyLCBzb1xuICAgKiBhIGZyZXNobHkgY3JlYXRlZCAoZnJvemVuKSBhbGxvd2xpc3QvYmxvY2tsaXN0IHRva2VuIGFjY291bnQgaXMgdGhhd2VkIGF0b21pY2FsbHkgd2l0aCB0aGVcbiAgICogdHJhbnNmZXIg4oCUIGFsbC1vci1ub3RoaW5nLlxuICAgKlxuICAgKiBAcGFyYW0ge1Blcm1pc3Npb25sZXNzVGhhd0lkZW1wb3RlbnRbJ3BhcmFtcyddfSBwYXJhbXMgLSByZXNvbHZlZCB0aGF3IHBhcmFtc1xuICAgKiBAcmV0dXJucyB7VG9rZW5UcmFuc2ZlckJ1aWxkZXJ9IFRoaXMgdHJhbnNhY3Rpb24gYnVpbGRlclxuICAgKi9cbiAgcGVybWlzc2lvbmxlc3NUaGF3KHBhcmFtczogUGVybWlzc2lvbmxlc3NUaGF3SWRlbXBvdGVudFsncGFyYW1zJ10pOiB0aGlzIHtcbiAgICB0aGlzLl9wZXJtaXNzaW9ubGVzc1RoYXcgPSBwYXJhbXM7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSByZXNvbHZlZCBUb2tlbi0yMDIyIFRyYW5zZmVyIEhvb2sgZXh0cmEgYWNjb3VudCBtZXRhcyBmb3IgdGhpcyB0cmFuc2Zlci5cbiAgICpcbiAgICogVGhlc2UgbXVzdCBiZSByZXNvbHZlZCBsaXZlIGJ5IHRoZSBjYWxsZXIgKGUuZy4gdmlhIGBTb2wucmVzb2x2ZVRyYW5zZmVySG9va0FjY291bnRzYClcbiAgICogc2luY2UgYnVpbGRlcnMgcmVtYWluIG9mZmxpbmUgYW5kIG5ldmVyIHBlcmZvcm0gUlBDLiBUaGUgb3JkZXIgaXMgc2lnbmlmaWNhbnQgYW5kXG4gICAqIG11c3QgbWF0Y2ggdGhlIGhvb2sncyBFeHRyYUFjY291bnRNZXRhTGlzdC5cbiAgICpcbiAgICogQHBhcmFtIHtFeHRyYUFjY291bnRNZXRhW119IG1ldGFzIC0gcmVzb2x2ZWQgZXh0cmEgYWNjb3VudCBtZXRhcywgaW4gaG9vayBvcmRlclxuICAgKiBAcmV0dXJucyB7VG9rZW5UcmFuc2ZlckJ1aWxkZXJ9IFRoaXMgdHJhbnNhY3Rpb24gYnVpbGRlclxuICAgKi9cbiAgdHJhbnNmZXJIb29rQWNjb3VudHMobWV0YXM6IEV4dHJhQWNjb3VudE1ldGFbXSk6IHRoaXMge1xuICAgIHRoaXMuX3RyYW5zZmVySG9va0FjY291bnRzID0gbWV0YXM7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IHRyYW5zYWN0aW9uVHlwZSgpOiBUcmFuc2FjdGlvblR5cGUge1xuICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuU2VuZDtcbiAgfVxuXG4gIGluaXRCdWlsZGVyKHR4OiBUcmFuc2FjdGlvbik6IHZvaWQge1xuICAgIHN1cGVyLmluaXRCdWlsZGVyKHR4KTtcblxuICAgIGZvciAoY29uc3QgaW5zdHJ1Y3Rpb24gb2YgdGhpcy5faW5zdHJ1Y3Rpb25zRGF0YSkge1xuICAgICAgaWYgKGluc3RydWN0aW9uLnR5cGUgPT09IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlRva2VuVHJhbnNmZXIpIHtcbiAgICAgICAgY29uc3QgdHJhbnNmZXJJbnN0cnVjdGlvbjogVG9rZW5UcmFuc2ZlciA9IGluc3RydWN0aW9uO1xuICAgICAgICB0aGlzLnNlbmRlcih0cmFuc2Zlckluc3RydWN0aW9uLnBhcmFtcy5mcm9tQWRkcmVzcyk7XG4gICAgICAgIHRoaXMuc2VuZCh7XG4gICAgICAgICAgYWRkcmVzczogdHJhbnNmZXJJbnN0cnVjdGlvbi5wYXJhbXMudG9BZGRyZXNzLFxuICAgICAgICAgIGFtb3VudDogdHJhbnNmZXJJbnN0cnVjdGlvbi5wYXJhbXMuYW1vdW50LFxuICAgICAgICAgIHRva2VuTmFtZTogdHJhbnNmZXJJbnN0cnVjdGlvbi5wYXJhbXMudG9rZW5OYW1lLFxuICAgICAgICAgIHRva2VuQWRkcmVzczogdHJhbnNmZXJJbnN0cnVjdGlvbi5wYXJhbXMudG9rZW5BZGRyZXNzLFxuICAgICAgICAgIHByb2dyYW1JZDogdHJhbnNmZXJJbnN0cnVjdGlvbi5wYXJhbXMucHJvZ3JhbUlkLFxuICAgICAgICAgIGRlY2ltYWxQbGFjZXM6IHRyYW5zZmVySW5zdHJ1Y3Rpb24ucGFyYW1zLmRlY2ltYWxQbGFjZXMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGluc3RydWN0aW9uLnR5cGUgPT09IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLkNyZWF0ZUFzc29jaWF0ZWRUb2tlbkFjY291bnQpIHtcbiAgICAgICAgY29uc3QgYXRhSW5pdEluc3RydWN0aW9uOiBBdGFJbml0ID0gaW5zdHJ1Y3Rpb247XG4gICAgICAgIHRoaXMuX2NyZWF0ZUF0YVBhcmFtcy5wdXNoKHtcbiAgICAgICAgICBvd25lckFkZHJlc3M6IGF0YUluaXRJbnN0cnVjdGlvbi5wYXJhbXMub3duZXJBZGRyZXNzLFxuICAgICAgICAgIHRva2VuTmFtZTogYXRhSW5pdEluc3RydWN0aW9uLnBhcmFtcy50b2tlbk5hbWUsXG4gICAgICAgICAgYXRhQWRkcmVzczogYXRhSW5pdEluc3RydWN0aW9uLnBhcmFtcy5hdGFBZGRyZXNzLFxuICAgICAgICAgIHRva2VuQWRkcmVzczogYXRhSW5pdEluc3RydWN0aW9uLnBhcmFtcy5taW50QWRkcmVzcyxcbiAgICAgICAgICBwcm9ncmFtSWQ6IGF0YUluaXRJbnN0cnVjdGlvbi5wYXJhbXMucHJvZ3JhbUlkLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogIFNldCBhIHRyYW5zZmVyXG4gICAqXG4gICAqIEBwYXJhbSB7U2VuZFBhcmFtc30gcGFyYW1zIC0gcGFyYW1zIGZvciB0aGUgdHJhbnNmZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5hZGRyZXNzIC0gdGhlIHJlY2VpdmVyIHRva2VuIGFkZHJlc3NcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5hbW91bnQgLSB0aGUgYW1vdW50IHNlbnRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy50b2tlbk5hbWUgLSBuYW1lIG9mIHRva2VuIHRoYXQgaXMgaW50ZW5kZWQgdG8gc2VuZFxuICAgKiBAcmV0dXJucyB7VHJhbnNhY3Rpb25CdWlsZGVyfSBUaGlzIHRyYW5zYWN0aW9uIGJ1aWxkZXJcbiAgICovXG4gIHNlbmQoeyBhZGRyZXNzLCBhbW91bnQsIHRva2VuTmFtZSwgdG9rZW5BZGRyZXNzLCBwcm9ncmFtSWQsIGRlY2ltYWxQbGFjZXMgfTogU2VuZFBhcmFtcyk6IHRoaXMge1xuICAgIHZhbGlkYXRlQWRkcmVzcyhhZGRyZXNzLCAnYWRkcmVzcycpO1xuICAgIGlmICghYW1vdW50IHx8ICFpc1ZhbGlkQW1vdW50KGFtb3VudCkpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgb3IgbWlzc2luZyBhbW91bnQsIGdvdDogJyArIGFtb3VudCk7XG4gICAgfVxuICAgIGlmIChCaWdJbnQoYW1vdW50KSA+IFVOU0lHTkVEX0JJR0lOVF9NQVgpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoYGlucHV0IGFtb3VudCAke2Ftb3VudH0gZXhjZWVkcyBiaWcgaW50IGxpbWl0ICR7VU5TSUdORURfQklHSU5UX01BWH1gKTtcbiAgICB9XG5cbiAgICB0aGlzLl9zZW5kUGFyYW1zLnB1c2goeyBhZGRyZXNzLCBhbW91bnQsIHRva2VuTmFtZTogdG9rZW5OYW1lLCB0b2tlbkFkZHJlc3MsIHByb2dyYW1JZCwgZGVjaW1hbFBsYWNlcyB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge1Rva2VuQXNzb2NpYXRlUmVjaXBpZW50fSByZWNpcGllbnQgLSByZWNpcGllbnQgb2YgdGhlIGFzc29jaWF0ZWQgdG9rZW4gYWNjb3VudCBjcmVhdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVjaXBpZW50Lm93bmVyQWRkcmVzcyAtIG93bmVyIG9mIHRoZSBhc3NvY2lhdGVkIHRva2VuIGFjY291bnRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlY2lwaWVudC50b2tlbk5hbWUgLSBuYW1lIG9mIHRoZSB0b2tlbiB0aGF0IGlzIGludGVuZGVkIHRvIGFzc29jaWF0ZVxuICAgKiBAcmV0dXJucyB7VHJhbnNhY3Rpb25CdWlsZGVyfSBUaGlzIHRyYW5zYWN0aW9uIGJ1aWxkZXJcbiAgICovXG4gIGNyZWF0ZUFzc29jaWF0ZWRUb2tlbkFjY291bnQocmVjaXBpZW50OiBUb2tlbkFzc29jaWF0ZVJlY2lwaWVudCk6IHRoaXMge1xuICAgIHZhbGlkYXRlT3duZXJBZGRyZXNzKHJlY2lwaWVudC5vd25lckFkZHJlc3MpO1xuICAgIGxldCB0b2tlbkFkZHJlc3M6IHN0cmluZztcbiAgICBpZiAocmVjaXBpZW50LnRva2VuQWRkcmVzcykge1xuICAgICAgdG9rZW5BZGRyZXNzID0gcmVjaXBpZW50LnRva2VuQWRkcmVzcztcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdG9rZW4gPSBnZXRTb2xUb2tlbkZyb21Ub2tlbk5hbWUocmVjaXBpZW50LnRva2VuTmFtZSk7XG4gICAgICBpZiAodG9rZW4pIHtcbiAgICAgICAgdG9rZW5BZGRyZXNzID0gdG9rZW4udG9rZW5BZGRyZXNzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCB0b2tlbiBuYW1lLCBnb3Q6ICcgKyByZWNpcGllbnQudG9rZW5OYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFsaWRhdGVNaW50QWRkcmVzcyh0b2tlbkFkZHJlc3MpO1xuXG4gICAgdGhpcy5fY3JlYXRlQXRhUGFyYW1zLnB1c2gocmVjaXBpZW50KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgYnVpbGRJbXBsZW1lbnRhdGlvbigpOiBQcm9taXNlPFRyYW5zYWN0aW9uPiB7XG4gICAgYXNzZXJ0KHRoaXMuX3NlbmRlciwgJ1NlbmRlciBtdXN0IGJlIHNldCBiZWZvcmUgYnVpbGRpbmcgdGhlIHRyYW5zYWN0aW9uJyk7XG4gICAgY29uc3Qgc2VuZEluc3RydWN0aW9ucyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgdGhpcy5fc2VuZFBhcmFtcy5tYXAoYXN5bmMgKHNlbmRQYXJhbXM6IFNlbmRQYXJhbXMpOiBQcm9taXNlPFRva2VuVHJhbnNmZXI+ID0+IHtcbiAgICAgICAgbGV0IHRva2VuQWRkcmVzczogc3RyaW5nO1xuICAgICAgICBsZXQgdG9rZW5OYW1lOiBzdHJpbmc7XG4gICAgICAgIGxldCBwcm9ncmFtSWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IGRlY2ltYWxzOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChzZW5kUGFyYW1zLnRva2VuQWRkcmVzcyAmJiBzZW5kUGFyYW1zLnByb2dyYW1JZCAmJiBzZW5kUGFyYW1zLmRlY2ltYWxQbGFjZXMgIT0gbnVsbCkge1xuICAgICAgICAgIHRva2VuQWRkcmVzcyA9IHNlbmRQYXJhbXMudG9rZW5BZGRyZXNzO1xuICAgICAgICAgIHRva2VuTmFtZSA9IHNlbmRQYXJhbXMudG9rZW5OYW1lO1xuICAgICAgICAgIHByb2dyYW1JZCA9IHNlbmRQYXJhbXMucHJvZ3JhbUlkO1xuICAgICAgICAgIGRlY2ltYWxzID0gc2VuZFBhcmFtcy5kZWNpbWFsUGxhY2VzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGNvaW4gPSBnZXRTb2xUb2tlbkZyb21Ub2tlbk5hbWUoc2VuZFBhcmFtcy50b2tlbk5hbWUpO1xuICAgICAgICAgIGlmIChjb2luKSB7XG4gICAgICAgICAgICB0b2tlbkFkZHJlc3MgPSBjb2luLnRva2VuQWRkcmVzcztcbiAgICAgICAgICAgIHRva2VuTmFtZSA9IGNvaW4ubmFtZTtcbiAgICAgICAgICAgIHByb2dyYW1JZCA9IGNvaW4ucHJvZ3JhbUlkO1xuICAgICAgICAgICAgZGVjaW1hbHMgPSBjb2luLmRlY2ltYWxQbGFjZXM7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGRldGVybWluZSB0b2tlbiBpbmZvcm1hdGlvbiBmb3IgJHtzZW5kUGFyYW1zLnRva2VuTmFtZX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc291cmNlQWRkcmVzcyA9IGF3YWl0IGdldEFzc29jaWF0ZWRUb2tlbkFjY291bnRBZGRyZXNzKHRva2VuQWRkcmVzcywgdGhpcy5fc2VuZGVyLCBmYWxzZSwgcHJvZ3JhbUlkKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5Ub2tlblRyYW5zZmVyLFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgZnJvbUFkZHJlc3M6IHRoaXMuX3NlbmRlcixcbiAgICAgICAgICAgIHRvQWRkcmVzczogc2VuZFBhcmFtcy5hZGRyZXNzLFxuICAgICAgICAgICAgYW1vdW50OiBzZW5kUGFyYW1zLmFtb3VudCxcbiAgICAgICAgICAgIHRva2VuTmFtZTogdG9rZW5OYW1lLFxuICAgICAgICAgICAgc291cmNlQWRkcmVzczogc291cmNlQWRkcmVzcyxcbiAgICAgICAgICAgIHRva2VuQWRkcmVzczogdG9rZW5BZGRyZXNzLFxuICAgICAgICAgICAgcHJvZ3JhbUlkOiBwcm9ncmFtSWQsXG4gICAgICAgICAgICBkZWNpbWFsUGxhY2VzOiBkZWNpbWFscyxcbiAgICAgICAgICAgIC4uLih0aGlzLl90cmFuc2Zlckhvb2tBY2NvdW50cyA/IHsgdHJhbnNmZXJIb29rQWNjb3VudHM6IHRoaXMuX3RyYW5zZmVySG9va0FjY291bnRzIH0gOiB7fSksXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICBjb25zdCB1bmlxdWVDcmVhdGVBdGFQYXJhbXMgPSBfLnVuaXFCeSh0aGlzLl9jcmVhdGVBdGFQYXJhbXMsIChyZWNpcGllbnQ6IFRva2VuQXNzb2NpYXRlUmVjaXBpZW50KSA9PiB7XG4gICAgICByZXR1cm4gcmVjaXBpZW50Lm93bmVyQWRkcmVzcyArIHJlY2lwaWVudC50b2tlbk5hbWU7XG4gICAgfSk7XG4gICAgY29uc3QgY3JlYXRlQXRhSW5zdHJ1Y3Rpb25zID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICB1bmlxdWVDcmVhdGVBdGFQYXJhbXMubWFwKGFzeW5jIChyZWNpcGllbnQ6IFRva2VuQXNzb2NpYXRlUmVjaXBpZW50KTogUHJvbWlzZTxBdGFJbml0PiA9PiB7XG4gICAgICAgIGxldCB0b2tlbkFkZHJlc3M6IHN0cmluZztcbiAgICAgICAgbGV0IHRva2VuTmFtZTogc3RyaW5nO1xuICAgICAgICBsZXQgcHJvZ3JhbUlkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChyZWNpcGllbnQudG9rZW5BZGRyZXNzICYmIHJlY2lwaWVudC5wcm9ncmFtSWQpIHtcbiAgICAgICAgICB0b2tlbk5hbWUgPSByZWNpcGllbnQudG9rZW5OYW1lO1xuICAgICAgICAgIHRva2VuQWRkcmVzcyA9IHJlY2lwaWVudC50b2tlbkFkZHJlc3M7XG4gICAgICAgICAgcHJvZ3JhbUlkID0gcmVjaXBpZW50LnByb2dyYW1JZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBjb2luID0gZ2V0U29sVG9rZW5Gcm9tVG9rZW5OYW1lKHJlY2lwaWVudC50b2tlbk5hbWUpO1xuICAgICAgICAgIGlmIChjb2luKSB7XG4gICAgICAgICAgICB0b2tlbk5hbWUgPSBjb2luLm5hbWU7XG4gICAgICAgICAgICB0b2tlbkFkZHJlc3MgPSBjb2luLnRva2VuQWRkcmVzcztcbiAgICAgICAgICAgIHByb2dyYW1JZCA9IGNvaW4ucHJvZ3JhbUlkO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBkZXRlcm1pbmUgdG9rZW4gaW5mb3JtYXRpb24gZm9yICR7cmVjaXBpZW50LnRva2VuTmFtZX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVc2UgdGhlIHByb3ZpZGVkIGF0YUFkZHJlc3MgaWYgaXQgZXhpc3RzLCBvdGhlcndpc2UgY2FsY3VsYXRlIGl0XG4gICAgICAgIGxldCBhdGFBZGRyZXNzID0gcmVjaXBpZW50LmF0YUFkZHJlc3M7XG4gICAgICAgIGlmICghYXRhQWRkcmVzcykge1xuICAgICAgICAgIGF0YUFkZHJlc3MgPSBhd2FpdCBnZXRBc3NvY2lhdGVkVG9rZW5BY2NvdW50QWRkcmVzcyh0b2tlbkFkZHJlc3MsIHJlY2lwaWVudC5vd25lckFkZHJlc3MsIGZhbHNlLCBwcm9ncmFtSWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuQ3JlYXRlQXNzb2NpYXRlZFRva2VuQWNjb3VudCxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIG93bmVyQWRkcmVzczogcmVjaXBpZW50Lm93bmVyQWRkcmVzcyxcbiAgICAgICAgICAgIG1pbnRBZGRyZXNzOiB0b2tlbkFkZHJlc3MsXG4gICAgICAgICAgICBhdGFBZGRyZXNzLFxuICAgICAgICAgICAgLy8gTWF0Y2ggdHJhbnNhY3Rpb25CdWlsZGVyIGZlZSBwYXllciBzZWxlY3Rpb246IHdoZW4gYSBkaXN0aW5jdCBmZWUgcGF5ZXJcbiAgICAgICAgICAgIC8vIGlzIHNldCAoZS5nLiBnYXMgdGFuayksIGl0IG11c3QgZnVuZCBBVEEgcmVudCDigJQgbm90IHRoZSB0b2tlbiBzZW5kZXIuXG4gICAgICAgICAgICBwYXllckFkZHJlc3M6IHRoaXMuX2ZlZVBheWVyID8/IHRoaXMuX3NlbmRlcixcbiAgICAgICAgICAgIHRva2VuTmFtZTogdG9rZW5OYW1lLFxuICAgICAgICAgICAgcHJvZ3JhbUlkOiBwcm9ncmFtSWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICBjb25zdCBhZGRQcmlvcml0eUZlZUluc3RydWN0aW9uOiBTZXRQcmlvcml0eUZlZSA9IHtcbiAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlNldFByaW9yaXR5RmVlLFxuICAgICAgcGFyYW1zOiB7XG4gICAgICAgIGZlZTogdGhpcy5fcHJpb3JpdHlGZWUsXG4gICAgICB9LFxuICAgIH07XG5cbiAgICAvLyBXaGVuIHJlc29sdmVkLCBlbWl0IHRoZSBwZXJtaXNzaW9ubGVzcyB0aGF3IGJldHdlZW4gQVRBIGNyZWF0aW9uIGFuZCB0aGUgdHJhbnNmZXIgc28gdGhlXG4gICAgLy8gYnVpbHQgb3JkZXIgaXMgW0NyZWF0ZUFUQT8sIFBlcm1pc3Npb25sZXNzVGhhd0lkZW1wb3RlbnQsIFRva2VuVHJhbnNmZXJdLlxuICAgIGNvbnN0IHRoYXdJbnN0cnVjdGlvbnM6IFBlcm1pc3Npb25sZXNzVGhhd0lkZW1wb3RlbnRbXSA9IHRoaXMuX3Blcm1pc3Npb25sZXNzVGhhd1xuICAgICAgPyBbeyB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5QZXJtaXNzaW9ubGVzc1RoYXdJZGVtcG90ZW50LCBwYXJhbXM6IHRoaXMuX3Blcm1pc3Npb25sZXNzVGhhdyB9XVxuICAgICAgOiBbXTtcblxuICAgIGlmICghdGhpcy5fcHJpb3JpdHlGZWUgfHwgdGhpcy5fcHJpb3JpdHlGZWUgPT09IE51bWJlcigwKSkge1xuICAgICAgdGhpcy5faW5zdHJ1Y3Rpb25zRGF0YSA9IFsuLi5jcmVhdGVBdGFJbnN0cnVjdGlvbnMsIC4uLnRoYXdJbnN0cnVjdGlvbnMsIC4uLnNlbmRJbnN0cnVjdGlvbnNdO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBvcmRlciBpcyBpbXBvcnRhbnQsIGNyZWF0ZUF0YUluc3RydWN0aW9ucyBtdXN0IGJlIGJlZm9yZSBzZW5kSW5zdHJ1Y3Rpb25zXG4gICAgICB0aGlzLl9pbnN0cnVjdGlvbnNEYXRhID0gW1xuICAgICAgICBhZGRQcmlvcml0eUZlZUluc3RydWN0aW9uLFxuICAgICAgICAuLi5jcmVhdGVBdGFJbnN0cnVjdGlvbnMsXG4gICAgICAgIC4uLnRoYXdJbnN0cnVjdGlvbnMsXG4gICAgICAgIC4uLnNlbmRJbnN0cnVjdGlvbnMsXG4gICAgICBdO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgc3VwZXIuYnVpbGRJbXBsZW1lbnRhdGlvbigpO1xuICB9XG59XG4iXX0=
@@ -2,7 +2,7 @@ import { TransactionBuilder } from './transactionBuilder';
2
2
  import { TransactionType } from '@bitgo-beta/sdk-core';
3
3
  import { Transaction } from './transaction';
4
4
  import { BaseCoin as CoinConfig } from '@bitgo-beta/statics';
5
- import { TokenAssociateRecipient } from './iface';
5
+ import { ExtraAccountMeta, PermissionlessThawIdempotent, TokenAssociateRecipient } from './iface';
6
6
  export interface SendParams {
7
7
  address: string;
8
8
  amount: string;
@@ -14,7 +14,33 @@ export interface SendParams {
14
14
  export declare class TransferBuilderV2 extends TransactionBuilder {
15
15
  private _sendParams;
16
16
  private _createAtaParams;
17
+ private _transferHookAccounts?;
18
+ private _permissionlessThaw?;
17
19
  constructor(_coinConfig: Readonly<CoinConfig>);
20
+ /**
21
+ * Set the resolved sRFC-37 Token ACL permissionless-thaw params for this transfer.
22
+ *
23
+ * These must be resolved live by the caller (e.g. via `Sol.resolvePermissionlessThaw`) since
24
+ * builders remain offline and never perform RPC. When set, the built transaction bundles a
25
+ * `PermissionlessThawIdempotent` instruction after any ATA creation and before the transfer, so
26
+ * a freshly created (frozen) allowlist/blocklist token account is thawed atomically with the
27
+ * transfer — all-or-nothing.
28
+ *
29
+ * @param {PermissionlessThawIdempotent['params']} params - resolved thaw params
30
+ * @returns {TransferBuilderV2} This transaction builder
31
+ */
32
+ permissionlessThaw(params: PermissionlessThawIdempotent['params']): this;
33
+ /**
34
+ * Set the resolved Token-2022 Transfer Hook extra account metas for this transfer.
35
+ *
36
+ * These must be resolved live by the caller (e.g. via `Sol.resolveTransferHookAccounts`)
37
+ * since builders remain offline and never perform RPC. The order is significant and
38
+ * must match the hook's ExtraAccountMetaList.
39
+ *
40
+ * @param {ExtraAccountMeta[]} metas - resolved extra account metas, in hook order
41
+ * @returns {TransferBuilderV2} This transaction builder
42
+ */
43
+ transferHookAccounts(metas: ExtraAccountMeta[]): this;
18
44
  protected get transactionType(): TransactionType;
19
45
  initBuilder(tx: Transaction): void;
20
46
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"transferBuilderV2.d.ts","sourceRoot":"","sources":["../../../src/lib/transferBuilderV2.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAyB,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC9E,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAS5C,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAE7D,OAAO,EAAW,uBAAuB,EAA2C,MAAM,SAAS,CAAC;AAIpG,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAID,qBAAa,iBAAkB,SAAQ,kBAAkB;IACvD,OAAO,CAAC,WAAW,CAAoB;IACvC,OAAO,CAAC,gBAAgB,CAA4B;gBACxC,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;IAK7C,SAAS,KAAK,eAAe,IAAI,eAAe,CAE/C;IAED,WAAW,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI;IA8BlC;;;OAGG;IACH,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;IAMpC;;;;;OAKG;IACH,IAAI,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI;IAiBlC;;;;;;OAMG;IACH,4BAA4B,CAAC,SAAS,EAAE,uBAAuB,GAAG,IAAI;IAmBtE,kBAAkB;cACF,mBAAmB,IAAI,OAAO,CAAC,WAAW,CAAC;CAgH5D"}
1
+ {"version":3,"file":"transferBuilderV2.d.ts","sourceRoot":"","sources":["../../../src/lib/transferBuilderV2.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAyB,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC9E,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAS5C,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAE7D,OAAO,EAEL,gBAAgB,EAChB,4BAA4B,EAC5B,uBAAuB,EAIxB,MAAM,SAAS,CAAC;AAIjB,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAID,qBAAa,iBAAkB,SAAQ,kBAAkB;IACvD,OAAO,CAAC,WAAW,CAAoB;IACvC,OAAO,CAAC,gBAAgB,CAA4B;IACpD,OAAO,CAAC,qBAAqB,CAAC,CAAqB;IACnD,OAAO,CAAC,mBAAmB,CAAC,CAAyC;gBACzD,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;IAK7C;;;;;;;;;;;OAWG;IACH,kBAAkB,CAAC,MAAM,EAAE,4BAA4B,CAAC,QAAQ,CAAC,GAAG,IAAI;IAKxE;;;;;;;;;OASG;IACH,oBAAoB,CAAC,KAAK,EAAE,gBAAgB,EAAE,GAAG,IAAI;IAKrD,SAAS,KAAK,eAAe,IAAI,eAAe,CAE/C;IAED,WAAW,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI;IA8BlC;;;OAGG;IACH,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;IAMpC;;;;;OAKG;IACH,IAAI,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI;IAiBlC;;;;;;OAMG;IACH,4BAA4B,CAAC,SAAS,EAAE,uBAAuB,GAAG,IAAI;IAmBtE,kBAAkB;cACF,mBAAmB,IAAI,OAAO,CAAC,WAAW,CAAC;CA4H5D"}