@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.
- package/dist/cjs/src/lib/constants.d.ts +21 -2
- package/dist/cjs/src/lib/constants.d.ts.map +1 -1
- package/dist/cjs/src/lib/constants.js +22 -2
- package/dist/cjs/src/lib/iface.d.ts +59 -2
- package/dist/cjs/src/lib/iface.d.ts.map +1 -1
- package/dist/cjs/src/lib/iface.js +1 -1
- package/dist/cjs/src/lib/index.d.ts +1 -0
- package/dist/cjs/src/lib/index.d.ts.map +1 -1
- package/dist/cjs/src/lib/index.js +6 -2
- package/dist/cjs/src/lib/instructionParamsFactory.d.ts +2 -1
- package/dist/cjs/src/lib/instructionParamsFactory.d.ts.map +1 -1
- package/dist/cjs/src/lib/instructionParamsFactory.js +42 -1
- package/dist/cjs/src/lib/solInstructionFactory.d.ts.map +1 -1
- package/dist/cjs/src/lib/solInstructionFactory.js +60 -20
- package/dist/cjs/src/lib/token2022Resolve.d.ts +106 -0
- package/dist/cjs/src/lib/token2022Resolve.d.ts.map +1 -0
- package/dist/cjs/src/lib/token2022Resolve.js +199 -0
- package/dist/cjs/src/lib/tokenTransferBuilder.d.ts +27 -1
- package/dist/cjs/src/lib/tokenTransferBuilder.d.ts.map +1 -1
- package/dist/cjs/src/lib/tokenTransferBuilder.js +44 -3
- package/dist/cjs/src/lib/transferBuilderV2.d.ts +27 -1
- package/dist/cjs/src/lib/transferBuilderV2.d.ts.map +1 -1
- package/dist/cjs/src/lib/transferBuilderV2.js +44 -3
- package/dist/cjs/src/lib/utils.d.ts.map +1 -1
- package/dist/cjs/src/lib/utils.js +4 -1
- package/dist/cjs/src/sol.d.ts +58 -2
- package/dist/cjs/src/sol.d.ts.map +1 -1
- package/dist/cjs/src/sol.js +90 -1
- package/dist/cjs/test/unit/sol.js +248 -1
- package/dist/cjs/test/unit/solInstructionFactory.js +127 -17
- package/dist/cjs/test/unit/token2022Resolve.d.ts +2 -0
- package/dist/cjs/test/unit/token2022Resolve.d.ts.map +1 -0
- package/dist/cjs/test/unit/token2022Resolve.js +252 -0
- package/dist/cjs/test/unit/transactionBuilder/tokenTransferBuilder.js +100 -1
- package/dist/cjs/tsconfig.tsbuildinfo +1 -1
- package/dist/esm/lib/constants.d.ts +21 -2
- package/dist/esm/lib/constants.d.ts.map +1 -1
- package/dist/esm/lib/constants.js +21 -1
- package/dist/esm/lib/iface.d.ts +59 -2
- package/dist/esm/lib/iface.d.ts.map +1 -1
- package/dist/esm/lib/iface.js +1 -1
- package/dist/esm/lib/index.d.ts +1 -0
- package/dist/esm/lib/index.d.ts.map +1 -1
- package/dist/esm/lib/index.js +2 -1
- package/dist/esm/lib/instructionParamsFactory.d.ts +2 -1
- package/dist/esm/lib/instructionParamsFactory.d.ts.map +1 -1
- package/dist/esm/lib/instructionParamsFactory.js +41 -1
- package/dist/esm/lib/solInstructionFactory.d.ts.map +1 -1
- package/dist/esm/lib/solInstructionFactory.js +61 -21
- package/dist/esm/lib/token2022Resolve.d.ts +106 -0
- package/dist/esm/lib/token2022Resolve.d.ts.map +1 -0
- package/dist/esm/lib/token2022Resolve.js +194 -0
- package/dist/esm/lib/tokenTransferBuilder.d.ts +27 -1
- package/dist/esm/lib/tokenTransferBuilder.d.ts.map +1 -1
- package/dist/esm/lib/tokenTransferBuilder.js +44 -3
- package/dist/esm/lib/transferBuilderV2.d.ts +27 -1
- package/dist/esm/lib/transferBuilderV2.d.ts.map +1 -1
- package/dist/esm/lib/transferBuilderV2.js +44 -3
- package/dist/esm/lib/utils.d.ts.map +1 -1
- package/dist/esm/lib/utils.js +5 -2
- package/dist/esm/sol.d.ts +58 -2
- package/dist/esm/sol.d.ts.map +1 -1
- package/dist/esm/sol.js +90 -1
- package/package.json +7 -7
- package/dist/cjs/src/config/token2022StaticConfig.d.ts +0 -3
- package/dist/cjs/src/config/token2022StaticConfig.d.ts.map +0 -1
- package/dist/cjs/src/config/token2022StaticConfig.js +0 -50
- package/dist/cjs/src/lib/token2022Config.d.ts +0 -44
- package/dist/cjs/src/lib/token2022Config.d.ts.map +0 -1
- package/dist/cjs/src/lib/token2022Config.js +0 -27
- package/dist/esm/config/token2022StaticConfig.d.ts +0 -3
- package/dist/esm/config/token2022StaticConfig.d.ts.map +0 -1
- package/dist/esm/config/token2022StaticConfig.js +0 -47
- package/dist/esm/lib/token2022Config.d.ts +0 -44
- package/dist/esm/lib/token2022Config.d.ts.map +0 -1
- 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,
|
|
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 = [
|
|
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,
|
|
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"}
|