@bitgo/sdk-coin-iota 1.5.0 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/dist/src/iota.d.ts +123 -27
  2. package/dist/src/iota.d.ts.map +1 -1
  3. package/dist/src/iota.js +219 -99
  4. package/dist/src/lib/constants.d.ts +50 -1
  5. package/dist/src/lib/constants.d.ts.map +1 -1
  6. package/dist/src/lib/constants.js +68 -4
  7. package/dist/src/lib/iface.d.ts +143 -3
  8. package/dist/src/lib/iface.d.ts.map +1 -1
  9. package/dist/src/lib/iface.js +1 -1
  10. package/dist/src/lib/keyPair.d.ts +100 -6
  11. package/dist/src/lib/keyPair.d.ts.map +1 -1
  12. package/dist/src/lib/keyPair.js +103 -10
  13. package/dist/src/lib/transaction.d.ts +124 -15
  14. package/dist/src/lib/transaction.d.ts.map +1 -1
  15. package/dist/src/lib/transaction.js +215 -66
  16. package/dist/src/lib/transactionBuilder.d.ts +73 -34
  17. package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
  18. package/dist/src/lib/transactionBuilder.js +90 -45
  19. package/dist/src/lib/transactionBuilderFactory.d.ts +89 -6
  20. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
  21. package/dist/src/lib/transactionBuilderFactory.js +108 -16
  22. package/dist/src/lib/transferBuilder.d.ts +43 -0
  23. package/dist/src/lib/transferBuilder.d.ts.map +1 -1
  24. package/dist/src/lib/transferBuilder.js +50 -5
  25. package/dist/src/lib/transferTransaction.d.ts +97 -1
  26. package/dist/src/lib/transferTransaction.d.ts.map +1 -1
  27. package/dist/src/lib/transferTransaction.js +223 -52
  28. package/dist/src/lib/utils.d.ts +108 -8
  29. package/dist/src/lib/utils.d.ts.map +1 -1
  30. package/dist/src/lib/utils.js +140 -21
  31. package/dist/test/resources/iota.d.ts +12 -0
  32. package/dist/test/resources/iota.d.ts.map +1 -1
  33. package/dist/test/resources/iota.js +21 -2
  34. package/dist/test/unit/helpers/testHelpers.d.ts +57 -0
  35. package/dist/test/unit/helpers/testHelpers.d.ts.map +1 -0
  36. package/dist/test/unit/helpers/testHelpers.js +176 -0
  37. package/dist/test/unit/iota.js +81 -158
  38. package/dist/test/unit/keyPair.js +34 -61
  39. package/dist/test/unit/transactionBuilder/transactionBuilder.js +137 -255
  40. package/dist/test/unit/transactionBuilder/transactionBuilderFactory.js +43 -107
  41. package/dist/test/unit/transactionBuilder/transferBuilder.js +361 -234
  42. package/dist/test/unit/transferTransaction.js +147 -275
  43. package/dist/test/unit/utils.js +177 -167
  44. package/dist/tsconfig.tsbuildinfo +1 -1
  45. package/package.json +6 -6
package/dist/src/iota.js CHANGED
@@ -45,6 +45,10 @@ const sdk_lib_mpc_1 = require("@bitgo/sdk-lib-mpc");
45
45
  const bignumber_js_1 = __importDefault(require("bignumber.js"));
46
46
  const _ = __importStar(require("lodash"));
47
47
  const transferTransaction_1 = require("./lib/transferTransaction");
48
+ /**
49
+ * IOTA coin implementation.
50
+ * Supports TSS (Threshold Signature Scheme) with EDDSA algorithm.
51
+ */
48
52
  class Iota extends sdk_core_1.BaseCoin {
49
53
  constructor(bitgo, staticsCoin) {
50
54
  super(bitgo);
@@ -53,9 +57,15 @@ class Iota extends sdk_core_1.BaseCoin {
53
57
  }
54
58
  this._staticsCoin = staticsCoin;
55
59
  }
60
+ /**
61
+ * Factory method to create an IOTA coin instance.
62
+ */
56
63
  static createInstance(bitgo, staticsCoin) {
57
64
  return new Iota(bitgo, staticsCoin);
58
65
  }
66
+ // ========================================
67
+ // Coin Configuration Methods
68
+ // ========================================
59
69
  getBaseFactor() {
60
70
  return Math.pow(10, this._staticsCoin.decimalPlaces);
61
71
  }
@@ -68,123 +78,100 @@ class Iota extends sdk_core_1.BaseCoin {
68
78
  getFullName() {
69
79
  return this._staticsCoin.fullName;
70
80
  }
71
- /** @inheritDoc */
81
+ // ========================================
82
+ // Multi-Signature and TSS Support
83
+ // ========================================
72
84
  supportsTss() {
73
85
  return true;
74
86
  }
75
- /** inherited doc */
76
87
  getDefaultMultisigType() {
77
88
  return sdk_core_1.multisigTypes.tss;
78
89
  }
79
90
  getMPCAlgorithm() {
80
91
  return sdk_core_1.MPCType.EDDSA;
81
92
  }
93
+ // ========================================
94
+ // Address and Public Key Validation
95
+ // ========================================
82
96
  /**
83
- * Check if an address is valid
84
- * @param address the address to be validated
97
+ * Validates an IOTA address.
98
+ * @param address - The address to validate (64-character hex string)
85
99
  * @returns true if the address is valid
86
100
  */
87
101
  isValidAddress(address) {
88
- // IOTA addresses are 64-character hex strings
89
102
  return utils_1.default.isValidAddress(address);
90
103
  }
91
104
  /**
92
- * @inheritDoc
105
+ * Validates a public key.
106
+ * @param pub - The public key to validate
107
+ * @returns true if the public key is valid
108
+ */
109
+ isValidPub(pub) {
110
+ return utils_1.default.isValidPublicKey(pub);
111
+ }
112
+ /**
113
+ * Verifies if an address belongs to a TSS wallet.
114
+ * @param params - Verification parameters including wallet address and user/backup public keys
115
+ * @returns true if the address belongs to the wallet
116
+ */
117
+ async isWalletAddress(params) {
118
+ return (0, sdk_core_1.verifyEddsaTssWalletAddress)(params, (address) => this.isValidAddress(address), (publicKey) => utils_1.default.getAddressFromPublicKey(publicKey));
119
+ }
120
+ // ========================================
121
+ // Transaction Explanation and Verification
122
+ // ========================================
123
+ /**
124
+ * Explains a transaction by parsing its hex representation.
125
+ * @param params - Parameters containing the transaction hex
126
+ * @returns Detailed explanation of the transaction
127
+ * @throws Error if txHex is missing or transaction cannot be explained
93
128
  */
94
129
  async explainTransaction(params) {
95
- const rawTx = params.txBase64;
96
- if (!rawTx) {
97
- throw new Error('missing required tx prebuild property txBase64');
98
- }
130
+ const rawTx = this.validateAndExtractTxHex(params.txHex, 'explain');
99
131
  const transaction = await this.rebuildTransaction(rawTx);
100
- if (!transaction) {
101
- throw new Error('failed to explain transaction');
102
- }
103
132
  return transaction.explainTransaction();
104
133
  }
105
134
  /**
106
- * Verifies that a transaction prebuild complies with the original intention
107
- * @param params
135
+ * Verifies that a transaction prebuild matches the original transaction parameters.
136
+ * Ensures recipients and amounts align with the intended transaction.
137
+ *
138
+ * @param params - Verification parameters containing prebuild and original params
139
+ * @returns true if verification succeeds
140
+ * @throws Error if verification fails
108
141
  */
109
142
  async verifyTransaction(params) {
110
- const { txPrebuild: txPrebuild, txParams: txParams } = params;
111
- const rawTx = txPrebuild.txBase64;
112
- if (!rawTx) {
113
- throw new Error('missing required tx prebuild property txBase64');
114
- }
143
+ const { txPrebuild, txParams } = params;
144
+ const rawTx = this.validateAndExtractTxHex(txPrebuild.txHex, 'verify');
115
145
  const transaction = await this.rebuildTransaction(rawTx);
116
- if (!transaction) {
117
- throw new Error('failed to verify transaction');
118
- }
146
+ this.validateTransactionType(transaction);
119
147
  if (txParams.recipients !== undefined) {
120
- if (!(transaction instanceof transferTransaction_1.TransferTransaction)) {
121
- throw new Error('Tx not a transfer transaction');
122
- }
123
- const txData = transaction.toJson();
124
- if (!txData.recipients || !_.isEqual(txParams.recipients, txData.recipients)) {
125
- throw new Error('Tx recipients does not match with expected txParams recipients');
126
- }
148
+ this.verifyTransactionRecipients(transaction, txParams.recipients);
127
149
  }
128
150
  return true;
129
151
  }
130
152
  /**
131
- * Check if an address belongs to a wallet
132
- * @param params
133
- */
134
- async isWalletAddress(params) {
135
- return (0, sdk_core_1.verifyEddsaTssWalletAddress)(params, (address) => this.isValidAddress(address), (publicKey) => utils_1.default.getAddressFromPublicKey(publicKey));
136
- }
137
- /**
138
- * Parse a transaction
139
- * @param params
153
+ * Parses a transaction and extracts inputs, outputs, and fees.
154
+ * @param params - Parameters containing the transaction hex
155
+ * @returns Parsed transaction with inputs, outputs, and fee information
140
156
  */
141
157
  async parseTransaction(params) {
142
- const transactionExplanation = await this.explainTransaction({ txBase64: params.txBase64 });
143
- if (!transactionExplanation) {
144
- throw new Error('Invalid transaction');
145
- }
146
- let fee = new bignumber_js_1.default(0);
147
- if (transactionExplanation.outputs.length <= 0) {
148
- return {
149
- inputs: [],
150
- outputs: [],
151
- fee,
152
- };
153
- }
154
- const senderAddress = transactionExplanation.outputs[0].address;
155
- if (transactionExplanation.fee.fee !== '') {
156
- fee = new bignumber_js_1.default(transactionExplanation.fee.fee);
158
+ const transactionExplanation = await this.explainTransaction({ txHex: params.txHex });
159
+ if (!transactionExplanation || transactionExplanation.outputs.length === 0) {
160
+ return this.createEmptyParsedTransaction();
157
161
  }
158
- const outputAmount = transactionExplanation.sponsor
159
- ? new bignumber_js_1.default(transactionExplanation.outputAmount).toFixed()
160
- : new bignumber_js_1.default(transactionExplanation.outputAmount).plus(fee).toFixed(); // assume 1 sender, who is also the fee payer
161
- const inputs = [
162
- {
163
- address: senderAddress,
164
- amount: outputAmount,
165
- },
166
- ];
167
- if (transactionExplanation.sponsor) {
168
- inputs.push({
169
- address: transactionExplanation.sponsor,
170
- amount: fee.toFixed(),
171
- });
172
- }
173
- const outputs = transactionExplanation.outputs.map((output) => {
174
- return {
175
- address: output.address,
176
- amount: new bignumber_js_1.default(output.amount).toFixed(),
177
- };
178
- });
179
- return {
180
- inputs,
181
- outputs,
182
- fee,
183
- };
162
+ const fee = this.calculateTransactionFee(transactionExplanation);
163
+ const inputs = this.buildTransactionInputs(transactionExplanation, fee);
164
+ const outputs = this.buildTransactionOutputs(transactionExplanation);
165
+ return { inputs, outputs, fee };
184
166
  }
167
+ // ========================================
168
+ // Key Generation and Signing
169
+ // ========================================
185
170
  /**
186
- * Generate a key pair
187
- * @param seed Optional seed to generate key pair from
171
+ * Generates a key pair for IOTA transactions.
172
+ * @param seed - Optional seed to generate deterministic key pair
173
+ * @returns Key pair with public and private keys
174
+ * @throws Error if private key generation fails
188
175
  */
189
176
  generateKeyPair(seed) {
190
177
  const keyPair = seed ? new lib_1.KeyPair({ seed }) : new lib_1.KeyPair();
@@ -198,22 +185,16 @@ class Iota extends sdk_core_1.BaseCoin {
198
185
  };
199
186
  }
200
187
  /**
201
- * Check if a public key is valid
202
- * @param pub Public key to check
203
- */
204
- isValidPub(pub) {
205
- return utils_1.default.isValidPublicKey(pub);
206
- }
207
- /**
208
- * Sign a transaction
209
- * @param params
188
+ * Signs a transaction (not implemented for IOTA).
189
+ * IOTA transactions are signed externally using TSS.
210
190
  */
211
191
  async signTransaction(params) {
212
192
  throw new Error('Method not implemented.');
213
193
  }
214
194
  /**
215
- * Audit a decrypted private key to ensure it's valid
216
- * @param params
195
+ * Audits a decrypted private key to ensure it's valid for the given public key.
196
+ * @param params - Parameters containing multiSigType, private key, and public key
197
+ * @throws Error if multiSigType is not TSS or if key validation fails
217
198
  */
218
199
  auditDecryptedKey({ multiSigType, prv, publicKey }) {
219
200
  if (multiSigType !== sdk_core_1.multisigTypes.tss) {
@@ -221,29 +202,168 @@ class Iota extends sdk_core_1.BaseCoin {
221
202
  }
222
203
  (0, sdk_lib_mpc_1.auditEddsaPrivateKey)(prv, publicKey ?? '');
223
204
  }
224
- /** @inheritDoc */
205
+ /**
206
+ * Extracts the signable payload from a serialized transaction.
207
+ * @param serializedTx - The serialized transaction hex
208
+ * @returns Buffer containing the signable payload
209
+ */
225
210
  async getSignablePayload(serializedTx) {
226
211
  const rebuiltTransaction = await this.rebuildTransaction(serializedTx);
227
212
  return rebuiltTransaction.signablePayload;
228
213
  }
229
- /** inherited doc */
214
+ /**
215
+ * Sets coin-specific fields in the transaction intent.
216
+ * @param intent - The populated intent object to modify
217
+ * @param params - Parameters containing unspents data
218
+ */
230
219
  setCoinSpecificFieldsInIntent(intent, params) {
231
220
  intent.unspents = params.unspents;
232
221
  }
222
+ // ========================================
223
+ // Private Helper Methods
224
+ // ========================================
225
+ /**
226
+ * Validates and extracts transaction hex from parameters.
227
+ * @param txHex - The transaction hex to validate
228
+ * @param operation - The operation being performed (for error messages)
229
+ * @returns The validated transaction hex
230
+ * @throws Error if txHex is missing
231
+ */
232
+ validateAndExtractTxHex(txHex, operation) {
233
+ if (!txHex) {
234
+ throw new Error(`missing required tx prebuild property txHex for ${operation} operation`);
235
+ }
236
+ return txHex;
237
+ }
238
+ /**
239
+ * Validates that the transaction is a TransferTransaction.
240
+ * @param transaction - The transaction to validate
241
+ * @throws Error if transaction is not a TransferTransaction
242
+ */
243
+ validateTransactionType(transaction) {
244
+ if (!(transaction instanceof transferTransaction_1.TransferTransaction)) {
245
+ throw new Error('Tx not a transfer transaction');
246
+ }
247
+ }
248
+ /**
249
+ * Verifies that transaction recipients match the expected recipients.
250
+ * @param transaction - The transfer transaction to verify
251
+ * @param expectedRecipients - The expected recipients from transaction params
252
+ * @throws Error if recipients don't match
253
+ */
254
+ verifyTransactionRecipients(transaction, expectedRecipients) {
255
+ const txData = transaction.toJson();
256
+ if (!txData.recipients) {
257
+ throw new Error('Tx recipients does not match with expected txParams recipients');
258
+ }
259
+ const actualRecipients = this.normalizeRecipients(txData.recipients);
260
+ const expected = this.normalizeRecipients(expectedRecipients);
261
+ if (!this.recipientsMatch(expected, actualRecipients)) {
262
+ throw new Error('Tx recipients does not match with expected txParams recipients');
263
+ }
264
+ }
265
+ /**
266
+ * Normalizes recipients by extracting only relevant fields.
267
+ * @param recipients - Recipients to normalize
268
+ * @returns Normalized recipients with address, amount, and tokenName only
269
+ */
270
+ normalizeRecipients(recipients) {
271
+ return recipients.map((recipient) => _.pick(recipient, ['address', 'amount', 'tokenName']));
272
+ }
273
+ /**
274
+ * Checks if expected recipients match actual recipients.
275
+ * @param expected - Expected recipients
276
+ * @param actual - Actual recipients from transaction
277
+ * @returns true if all expected recipients are found in actual recipients
278
+ */
279
+ recipientsMatch(expected, actual) {
280
+ return expected.every((expectedRecipient) => actual.some((actualRecipient) => _.isEqual(expectedRecipient, actualRecipient)));
281
+ }
282
+ /**
283
+ * Creates an empty parsed transaction result.
284
+ * Used when transaction has no outputs.
285
+ */
286
+ createEmptyParsedTransaction() {
287
+ return {
288
+ inputs: [],
289
+ outputs: [],
290
+ fee: new bignumber_js_1.default(0),
291
+ };
292
+ }
293
+ /**
294
+ * Calculates the transaction fee from the explanation.
295
+ * @param explanation - The transaction explanation
296
+ * @returns The fee as a BigNumber
297
+ */
298
+ calculateTransactionFee(explanation) {
299
+ if (explanation.fee.fee === '') {
300
+ return new bignumber_js_1.default(0);
301
+ }
302
+ return new bignumber_js_1.default(explanation.fee.fee);
303
+ }
304
+ /**
305
+ * Builds the inputs array for a parsed transaction.
306
+ * Includes sender input and optionally sponsor input if present.
307
+ *
308
+ * @param explanation - The transaction explanation
309
+ * @param fee - The calculated transaction fee
310
+ * @returns Array of transaction inputs
311
+ */
312
+ buildTransactionInputs(explanation, fee) {
313
+ const senderAddress = explanation.outputs[0].address;
314
+ const outputAmount = new bignumber_js_1.default(explanation.outputAmount);
315
+ // If there's a sponsor, sender only pays for outputs
316
+ // Otherwise, sender pays for outputs + fee
317
+ const senderAmount = explanation.sponsor ? outputAmount.toFixed() : outputAmount.plus(fee).toFixed();
318
+ const inputs = [
319
+ {
320
+ address: senderAddress,
321
+ amount: senderAmount,
322
+ },
323
+ ];
324
+ // Add sponsor input if present
325
+ if (explanation.sponsor) {
326
+ inputs.push({
327
+ address: explanation.sponsor,
328
+ amount: fee.toFixed(),
329
+ });
330
+ }
331
+ return inputs;
332
+ }
333
+ /**
334
+ * Builds the outputs array for a parsed transaction.
335
+ * @param explanation - The transaction explanation
336
+ * @returns Array of transaction outputs
337
+ */
338
+ buildTransactionOutputs(explanation) {
339
+ return explanation.outputs.map((output) => ({
340
+ address: output.address,
341
+ amount: new bignumber_js_1.default(output.amount).toFixed(),
342
+ }));
343
+ }
344
+ /**
345
+ * Creates a transaction builder factory instance.
346
+ * @returns TransactionBuilderFactory for this coin
347
+ */
233
348
  getTxBuilderFactory() {
234
349
  return new lib_1.TransactionBuilderFactory(statics_1.coins.get(this.getChain()));
235
350
  }
351
+ /**
352
+ * Rebuilds a transaction from its hex representation.
353
+ * @param txHex - The transaction hex to rebuild
354
+ * @returns The rebuilt transaction
355
+ * @throws Error if transaction cannot be rebuilt
356
+ */
236
357
  async rebuildTransaction(txHex) {
237
358
  const txBuilderFactory = this.getTxBuilderFactory();
238
359
  try {
239
360
  const txBuilder = txBuilderFactory.from(txHex);
240
- txBuilder.transaction.isSimulateTx = false;
241
361
  return (await txBuilder.build());
242
362
  }
243
- catch {
244
- throw new Error('Failed to rebuild transaction');
363
+ catch (err) {
364
+ throw new Error(`Failed to rebuild transaction: ${err.toString()}`);
245
365
  }
246
366
  }
247
367
  }
248
368
  exports.Iota = Iota;
249
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW90YS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pb3RhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDhDQWlCeUI7QUFDekIsNENBQWdGO0FBQ2hGLHdEQUFnQztBQUNoQywrQkFBdUY7QUFDdkYsb0RBQTBEO0FBQzFELGdFQUFxQztBQUNyQywwQ0FBNEI7QUFPNUIsbUVBQWdFO0FBRWhFLE1BQWEsSUFBSyxTQUFRLG1CQUFRO0lBR2hDLFlBQXNCLEtBQWdCLEVBQUUsV0FBdUM7UUFDN0UsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRWIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsb0RBQW9ELENBQUMsQ0FBQztRQUN4RSxDQUFDO1FBRUQsSUFBSSxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUM7SUFDbEMsQ0FBQztJQUVELE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBZ0IsRUFBRSxXQUF1QztRQUM3RSxPQUFPLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsYUFBYTtRQUNYLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsUUFBUTtRQUNOLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUM7SUFDaEMsQ0FBQztJQUVELFNBQVM7UUFDUCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDO0lBQ2xDLENBQUM7SUFFRCxXQUFXO1FBQ1QsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQztJQUNwQyxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLFdBQVc7UUFDVCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFF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b3J0IHtcbiAgQXVkaXREZWNyeXB0ZWRLZXlQYXJhbXMsXG4gIEJhc2VDb2luLFxuICBCaXRHb0Jhc2UsXG4gIEtleVBhaXIsXG4gIFBhcnNlZFRyYW5zYWN0aW9uLFxuICBTaWduVHJhbnNhY3Rpb25PcHRpb25zLFxuICBTaWduZWRUcmFuc2FjdGlvbixcbiAgVmVyaWZ5VHJhbnNhY3Rpb25PcHRpb25zLFxuICBNdWx0aXNpZ1R5cGUsXG4gIG11bHRpc2lnVHlwZXMsXG4gIE1QQ0FsZ29yaXRobSxcbiAgVHNzVmVyaWZ5QWRkcmVzc09wdGlvbnMsXG4gIE1QQ1R5cGUsXG4gIFBvcHVsYXRlZEludGVudCxcbiAgUHJlYnVpbGRUcmFuc2FjdGlvbldpdGhJbnRlbnRPcHRpb25zLFxuICB2ZXJpZnlFZGRzYVRzc1dhbGxldEFkZHJlc3MsXG59IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyBCYXNlQ29pbiBhcyBTdGF0aWNzQmFzZUNvaW4sIENvaW5GYW1pbHksIGNvaW5zIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuaW1wb3J0IHV0aWxzIGZyb20gJy4vbGliL3V0aWxzJztcbmltcG9ydCB7IEtleVBhaXIgYXMgSW90YUtleVBhaXIsIFRyYW5zYWN0aW9uLCBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5IH0gZnJvbSAnLi9saWInO1xuaW1wb3J0IHsgYXVkaXRFZGRzYVByaXZhdGVLZXkgfSBmcm9tICdAYml0Z28vc2RrLWxpYi1tcGMnO1xuaW1wb3J0IEJpZ051bWJlciBmcm9tICdiaWdudW1iZXIuanMnO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHtcbiAgRXhwbGFpblRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgSW90YVBhcnNlVHJhbnNhY3Rpb25PcHRpb25zLFxuICBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uLFxuICBUcmFuc2ZlclR4RGF0YSxcbn0gZnJvbSAnLi9saWIvaWZhY2UnO1xuaW1wb3J0IHsgVHJhbnNmZXJUcmFuc2FjdGlvbiB9IGZyb20gJy4vbGliL3RyYW5zZmVyVHJhbnNhY3Rpb24nO1xuXG5leHBvcnQgY2xhc3MgSW90YSBleHRlbmRzIEJhc2VDb2luIHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9zdGF0aWNzQ29pbjogUmVhZG9ubHk8U3RhdGljc0Jhc2VDb2luPjtcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoYml0Z286IEJpdEdvQmFzZSwgc3RhdGljc0NvaW4/OiBSZWFkb25seTxTdGF0aWNzQmFzZUNvaW4+KSB7XG4gICAgc3VwZXIoYml0Z28pO1xuXG4gICAgaWYgKCFzdGF0aWNzQ29pbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIGNvbnN0cnVjdG9yIHBhcmFtZXRlciBzdGF0aWNzQ29pbicpO1xuICAgIH1cblxuICAgIHRoaXMuX3N0YXRpY3NDb2luID0gc3RhdGljc0NvaW47XG4gIH1cblxuICBzdGF0aWMgY3JlYXRlSW5zdGFuY2UoYml0Z286IEJpdEdvQmFzZSwgc3RhdGljc0NvaW4/OiBSZWFkb25seTxTdGF0aWNzQmFzZUNvaW4+KTogQmFzZUNvaW4ge1xuICAgIHJldHVybiBuZXcgSW90YShiaXRnbywgc3RhdGljc0NvaW4pO1xuICB9XG5cbiAgZ2V0QmFzZUZhY3RvcigpOiBzdHJpbmcgfCBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLnBvdygxMCwgdGhpcy5fc3RhdGljc0NvaW4uZGVjaW1hbFBsYWNlcyk7XG4gIH1cblxuICBnZXRDaGFpbigpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGljc0NvaW4ubmFtZTtcbiAgfVxuXG4gIGdldEZhbWlseSgpOiBDb2luRmFtaWx5IHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGljc0NvaW4uZmFtaWx5O1xuICB9XG5cbiAgZ2V0RnVsbE5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRpY3NDb2luLmZ1bGxOYW1lO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIHN1cHBvcnRzVHNzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqIGluaGVyaXRlZCBkb2MgKi9cbiAgZ2V0RGVmYXVsdE11bHRpc2lnVHlwZSgpOiBNdWx0aXNpZ1R5cGUge1xuICAgIHJldHVybiBtdWx0aXNpZ1R5cGVzLnRzcztcbiAgfVxuXG4gIGdldE1QQ0FsZ29yaXRobSgpOiBNUENBbGdvcml0aG0ge1xuICAgIHJldHVybiBNUENUeXBlLkVERFNBO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGFuIGFkZHJlc3MgaXMgdmFsaWRcbiAgICogQHBhcmFtIGFkZHJlc3MgdGhlIGFkZHJlc3MgdG8gYmUgdmFsaWRhdGVkXG4gICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIGFkZHJlc3MgaXMgdmFsaWRcbiAgICovXG4gIGlzVmFsaWRBZGRyZXNzKGFkZHJlc3M6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIC8vIElPVEEgYWRkcmVzc2VzIGFyZSA2NC1jaGFyYWN0ZXIgaGV4IHN0cmluZ3NcbiAgICByZXR1cm4gdXRpbHMuaXNWYWxpZEFkZHJlc3MoYWRkcmVzcyk7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIGFzeW5jIGV4cGxhaW5UcmFuc2FjdGlvbihwYXJhbXM6IEV4cGxhaW5UcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPFRyYW5zYWN0aW9uRXhwbGFuYXRpb24+IHtcbiAgICBjb25zdCByYXdUeCA9IHBhcmFtcy50eEJhc2U2NDtcbiAgICBpZiAoIXJhd1R4KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgdHggcHJlYnVpbGQgcHJvcGVydHkgdHhCYXNlNjQnKTtcbiAgICB9XG4gICAgY29uc3QgdHJhbnNhY3Rpb24gPSBhd2FpdCB0aGlzLnJlYnVpbGRUcmFuc2FjdGlvbihyYXdUeCk7XG4gICAgaWYgKCF0cmFuc2FjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdmYWlsZWQgdG8gZXhwbGFpbiB0cmFuc2FjdGlvbicpO1xuICAgIH1cbiAgICByZXR1cm4gdHJhbnNhY3Rpb24uZXhwbGFpblRyYW5zYWN0aW9uKCk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgdGhhdCBhIHRyYW5zYWN0aW9uIHByZWJ1aWxkIGNvbXBsaWVzIHdpdGggdGhlIG9yaWdpbmFsIGludGVudGlvblxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyB2ZXJpZnlUcmFuc2FjdGlvbihwYXJhbXM6IFZlcmlmeVRyYW5zYWN0aW9uT3B0aW9ucyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHsgdHhQcmVidWlsZDogdHhQcmVidWlsZCwgdHhQYXJhbXM6IHR4UGFyYW1zIH0gPSBwYXJhbXM7XG4gICAgY29uc3QgcmF3VHggPSB0eFByZWJ1aWxkLnR4QmFzZTY0O1xuICAgIGlmICghcmF3VHgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCB0eCBwcmVidWlsZCBwcm9wZXJ0eSB0eEJhc2U2NCcpO1xuICAgIH1cbiAgICBjb25zdCB0cmFuc2FjdGlvbiA9IGF3YWl0IHRoaXMucmVidWlsZFRyYW5zYWN0aW9uKHJhd1R4KTtcbiAgICBpZiAoIXRyYW5zYWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZhaWxlZCB0byB2ZXJpZnkgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG4gICAgaWYgKHR4UGFyYW1zLnJlY2lwaWVudHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKCEodHJhbnNhY3Rpb24gaW5zdGFuY2VvZiBUcmFuc2ZlclRyYW5zYWN0aW9uKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1R4IG5vdCBhIHRyYW5zZmVyIHRyYW5zYWN0aW9uJyk7XG4gICAgICB9XG4gICAgICBjb25zdCB0eERhdGEgPSB0cmFuc2FjdGlvbi50b0pzb24oKSBhcyBUcmFuc2ZlclR4RGF0YTtcbiAgICAgIGlmICghdHhEYXRhLnJlY2lwaWVudHMgfHwgIV8uaXNFcXVhbCh0eFBhcmFtcy5yZWNpcGllbnRzLCB0eERhdGEucmVjaXBpZW50cykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUeCByZWNpcGllbnRzIGRvZXMgbm90IG1hdGNoIHdpdGggZXhwZWN0ZWQgdHhQYXJhbXMgcmVjaXBpZW50cycpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhbiBhZGRyZXNzIGJlbG9uZ3MgdG8gYSB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgaXNXYWxsZXRBZGRyZXNzKHBhcmFtczogVHNzVmVyaWZ5QWRkcmVzc09wdGlvbnMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdmVyaWZ5RWRkc2FUc3NXYWxsZXRBZGRyZXNzKFxuICAgICAgcGFyYW1zLFxuICAgICAgKGFkZHJlc3MpID0+IHRoaXMuaXNWYWxpZEFkZHJlc3MoYWRkcmVzcyksXG4gICAgICAocHVibGljS2V5KSA9PiB1dGlscy5nZXRBZGRyZXNzRnJvbVB1YmxpY0tleShwdWJsaWNLZXkpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBhIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIHBhcnNlVHJhbnNhY3Rpb24ocGFyYW1zOiBJb3RhUGFyc2VUcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPFBhcnNlZFRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgdHJhbnNhY3Rpb25FeHBsYW5hdGlvbiA9IGF3YWl0IHRoaXMuZXhwbGFpblRyYW5zYWN0aW9uKHsgdHhCYXNlNjQ6IHBhcmFtcy50eEJhc2U2NCB9KTtcblxuICAgIGlmICghdHJhbnNhY3Rpb25FeHBsYW5hdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuXG4gICAgbGV0IGZlZSA9IG5ldyBCaWdOdW1iZXIoMCk7XG5cbiAgICBpZiAodHJhbnNhY3Rpb25FeHBsYW5hdGlvbi5vdXRwdXRzLmxlbmd0aCA8PSAwKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpbnB1dHM6IFtdLFxuICAgICAgICBvdXRwdXRzOiBbXSxcbiAgICAgICAgZmVlLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBzZW5kZXJBZGRyZXNzID0gdHJhbnNhY3Rpb25FeHBsYW5hdGlvbi5vdXRwdXRzWzBdLmFkZHJlc3M7XG4gICAgaWYgKHRyYW5zYWN0aW9uRXhwbGFuYXRpb24uZmVlLmZlZSAhPT0gJycpIHtcbiAgICAgIGZlZSA9IG5ldyBCaWdOdW1iZXIodHJhbnNhY3Rpb25FeHBsYW5hdGlvbi5mZWUuZmVlKTtcbiAgICB9XG5cbiAgICBjb25zdCBvdXRwdXRBbW91bnQgPSB0cmFuc2FjdGlvbkV4cGxhbmF0aW9uLnNwb25zb3JcbiAgICAgID8gbmV3IEJpZ051bWJlcih0cmFuc2FjdGlvbkV4cGxhbmF0aW9uLm91dHB1dEFtb3VudCkudG9GaXhlZCgpXG4gICAgICA6IG5ldyBCaWdOdW1iZXIodHJhbnNhY3Rpb25FeHBsYW5hdGlvbi5vdXRwdXRBbW91bnQpLnBsdXMoZmVlKS50b0ZpeGVkKCk7IC8vIGFzc3VtZSAxIHNlbmRlciwgd2hvIGlzIGFsc28gdGhlIGZlZSBwYXllclxuXG4gICAgY29uc3QgaW5wdXRzID0gW1xuICAgICAge1xuICAgICAgICBhZGRyZXNzOiBzZW5kZXJBZGRyZXNzLFxuICAgICAgICBhbW91bnQ6IG91dHB1dEFtb3VudCxcbiAgICAgIH0sXG4gICAgXTtcbiAgICBpZiAodHJhbnNhY3Rpb25FeHBsYW5hdGlvbi5zcG9uc29yKSB7XG4gICAgICBpbnB1dHMucHVzaCh7XG4gICAgICAgIGFkZHJlc3M6IHRyYW5zYWN0aW9uRXhwbGFuYXRpb24uc3BvbnNvcixcbiAgICAgICAgYW1vdW50OiBmZWUudG9GaXhlZCgpLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3V0cHV0czoge1xuICAgICAgYWRkcmVzczogc3RyaW5nO1xuICAgICAgYW1vdW50OiBzdHJpbmc7XG4gICAgfVtdID0gdHJhbnNhY3Rpb25FeHBsYW5hdGlvbi5vdXRwdXRzLm1hcCgob3V0cHV0KSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhZGRyZXNzOiBvdXRwdXQuYWRkcmVzcyxcbiAgICAgICAgYW1vdW50OiBuZXcgQmlnTnVtYmVyKG91dHB1dC5hbW91bnQpLnRvRml4ZWQoKSxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgaW5wdXRzLFxuICAgICAgb3V0cHV0cyxcbiAgICAgIGZlZSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIGEga2V5IHBhaXJcbiAgICogQHBhcmFtIHNlZWQgT3B0aW9uYWwgc2VlZCB0byBnZW5lcmF0ZSBrZXkgcGFpciBmcm9tXG4gICAqL1xuICBnZW5lcmF0ZUtleVBhaXIoc2VlZD86IEJ1ZmZlcik6IEtleVBhaXIge1xuICAgIGNvbnN0IGtleVBhaXIgPSBzZWVkID8gbmV3IElvdGFLZXlQYWlyKHsgc2VlZCB9KSA6IG5ldyBJb3RhS2V5UGFpcigpO1xuICAgIGNvbnN0IGtleXMgPSBrZXlQYWlyLmdldEtleXMoKTtcbiAgICBpZiAoIWtleXMucHJ2KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgcHJ2IGluIGtleSBnZW5lcmF0aW9uLicpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgcHViOiBrZXlzLnB1YixcbiAgICAgIHBydjoga2V5cy5wcnYsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIHB1YmxpYyBrZXkgaXMgdmFsaWRcbiAgICogQHBhcmFtIHB1YiBQdWJsaWMga2V5IHRvIGNoZWNrXG4gICAqL1xuICBpc1ZhbGlkUHViKHB1Yjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHV0aWxzLmlzVmFsaWRQdWJsaWNLZXkocHViKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWduIGEgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgc2lnblRyYW5zYWN0aW9uKHBhcmFtczogU2lnblRyYW5zYWN0aW9uT3B0aW9ucyk6IFByb21pc2U8U2lnbmVkVHJhbnNhY3Rpb24+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH1cblxuICAvKipcbiAgICogQXVkaXQgYSBkZWNyeXB0ZWQgcHJpdmF0ZSBrZXkgdG8gZW5zdXJlIGl0J3MgdmFsaWRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXVkaXREZWNyeXB0ZWRLZXkoeyBtdWx0aVNpZ1R5cGUsIHBydiwgcHVibGljS2V5IH06IEF1ZGl0RGVjcnlwdGVkS2V5UGFyYW1zKTogdm9pZCB7XG4gICAgaWYgKG11bHRpU2lnVHlwZSAhPT0gbXVsdGlzaWdUeXBlcy50c3MpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgbXVsdGlTaWdUeXBlJyk7XG4gICAgfVxuICAgIGF1ZGl0RWRkc2FQcml2YXRlS2V5KHBydiwgcHVibGljS2V5ID8/ICcnKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBhc3luYyBnZXRTaWduYWJsZVBheWxvYWQoc2VyaWFsaXplZFR4OiBzdHJpbmcpOiBQcm9taXNlPEJ1ZmZlcj4ge1xuICAgIGNvbnN0IHJlYnVpbHRUcmFuc2FjdGlvbiA9IGF3YWl0IHRoaXMucmVidWlsZFRyYW5zYWN0aW9uKHNlcmlhbGl6ZWRUeCk7XG4gICAgcmV0dXJuIHJlYnVpbHRUcmFuc2FjdGlvbi5zaWduYWJsZVBheWxvYWQ7XG4gIH1cblxuICAvKiogaW5oZXJpdGVkIGRvYyAqL1xuICBzZXRDb2luU3BlY2lmaWNGaWVsZHNJbkludGVudChpbnRlbnQ6IFBvcHVsYXRlZEludGVudCwgcGFyYW1zOiBQcmVidWlsZFRyYW5zYWN0aW9uV2l0aEludGVudE9wdGlvbnMpOiB2b2lkIHtcbiAgICBpbnRlbnQudW5zcGVudHMgPSBwYXJhbXMudW5zcGVudHM7XG4gIH1cblxuICBwcml2YXRlIGdldFR4QnVpbGRlckZhY3RvcnkoKTogVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeSB7XG4gICAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCh0aGlzLmdldENoYWluKCkpKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVidWlsZFRyYW5zYWN0aW9uKHR4SGV4OiBzdHJpbmcpOiBQcm9taXNlPFRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgdHhCdWlsZGVyRmFjdG9yeSA9IHRoaXMuZ2V0VHhCdWlsZGVyRmFjdG9yeSgpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSB0eEJ1aWxkZXJGYWN0b3J5LmZyb20odHhIZXgpO1xuICAgICAgdHhCdWlsZGVyLnRyYW5zYWN0aW9uLmlzU2ltdWxhdGVUeCA9IGZhbHNlO1xuICAgICAgcmV0dXJuIChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgfSBjYXRjaCB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byByZWJ1aWxkIHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuICB9XG59XG4iXX0=
369
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW90YS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pb3RhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDhDQWtCeUI7QUFDekIsNENBQWdGO0FBQ2hGLHdEQUFnQztBQUNoQywrQkFBdUY7QUFDdkYsb0RBQTBEO0FBQzFELGdFQUFxQztBQUNyQywwQ0FBNEI7QUFPNUIsbUVBQWdFO0FBRWhFOzs7R0FHRztBQUNILE1BQWEsSUFBSyxTQUFRLG1CQUFRO0lBR2hDLFlBQXNCLEtBQWdCLEVBQUUsV0FBdUM7UUFDN0UsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRWIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsb0RBQW9ELENBQUMsQ0FBQztRQUN4RSxDQUFDO1FBRUQsSUFBSSxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUM7SUFDbEMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFnQixFQUFFLFdBQXVDO1FBQzdFLE9BQU8sSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCwyQ0FBMkM7SUFDM0MsNkJBQTZCO0lBQzdCLDJDQUEyQztJQUUzQyxhQUFhO1FBQ1gsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRCxRQUFRO1FBQ04sT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQztJQUNoQyxDQUFDO0lBRUQsU0FBUztRQUNQLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUM7SUFDbEMsQ0FBQztJQUVELFdBQVc7UUFDVCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDO0lBQ3BD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QUMsQ0FBQztJQUNuRSxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxLQUFLLENBQUMsa0JBQWtCLENBQUMsS0FBYTtRQUM1QyxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQ3BELElBQUksQ0FBQztZQUNILE1BQU0sU0FBUyxHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMvQyxPQUFPLENBQUMsTUFBTSxTQUFTLENBQUMsS0FBSyxFQUFFLENBQWdCLENBQUM7UUFDbEQsQ0FBQztRQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDYixNQUFNLElBQUksS0FBSyxDQUFDLGtDQUFrQyxHQUFHLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3RFLENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUFuWUQsb0JBbVlDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQXVkaXREZWNyeXB0ZWRLZXlQYXJhbXMsXG4gIEJhc2VDb2luLFxuICBCaXRHb0Jhc2UsXG4gIEtleVBhaXIsXG4gIFBhcnNlZFRyYW5zYWN0aW9uLFxuICBTaWduVHJhbnNhY3Rpb25PcHRpb25zLFxuICBTaWduZWRUcmFuc2FjdGlvbixcbiAgVmVyaWZ5VHJhbnNhY3Rpb25PcHRpb25zLFxuICBNdWx0aXNpZ1R5cGUsXG4gIG11bHRpc2lnVHlwZXMsXG4gIE1QQ0FsZ29yaXRobSxcbiAgVHNzVmVyaWZ5QWRkcmVzc09wdGlvbnMsXG4gIE1QQ1R5cGUsXG4gIFBvcHVsYXRlZEludGVudCxcbiAgUHJlYnVpbGRUcmFuc2FjdGlvbldpdGhJbnRlbnRPcHRpb25zLFxuICBUcmFuc2FjdGlvblJlY2lwaWVudCxcbiAgdmVyaWZ5RWRkc2FUc3NXYWxsZXRBZGRyZXNzLFxufSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgQmFzZUNvaW4gYXMgU3RhdGljc0Jhc2VDb2luLCBDb2luRmFtaWx5LCBjb2lucyB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcbmltcG9ydCB1dGlscyBmcm9tICcuL2xpYi91dGlscyc7XG5pbXBvcnQgeyBLZXlQYWlyIGFzIElvdGFLZXlQYWlyLCBUcmFuc2FjdGlvbiwgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeSB9IGZyb20gJy4vbGliJztcbmltcG9ydCB7IGF1ZGl0RWRkc2FQcml2YXRlS2V5IH0gZnJvbSAnQGJpdGdvL3Nkay1saWItbXBjJztcbmltcG9ydCBCaWdOdW1iZXIgZnJvbSAnYmlnbnVtYmVyLmpzJztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7XG4gIEV4cGxhaW5UcmFuc2FjdGlvbk9wdGlvbnMsXG4gIElvdGFQYXJzZVRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgVHJhbnNhY3Rpb25FeHBsYW5hdGlvbixcbiAgVHJhbnNmZXJUeERhdGEsXG59IGZyb20gJy4vbGliL2lmYWNlJztcbmltcG9ydCB7IFRyYW5zZmVyVHJhbnNhY3Rpb24gfSBmcm9tICcuL2xpYi90cmFuc2ZlclRyYW5zYWN0aW9uJztcblxuLyoqXG4gKiBJT1RBIGNvaW4gaW1wbGVtZW50YXRpb24uXG4gKiBTdXBwb3J0cyBUU1MgKFRocmVzaG9sZCBTaWduYXR1cmUgU2NoZW1lKSB3aXRoIEVERFNBIGFsZ29yaXRobS5cbiAqL1xuZXhwb3J0IGNsYXNzIElvdGEgZXh0ZW5kcyBCYXNlQ29pbiB7XG4gIHByb3RlY3RlZCByZWFkb25seSBfc3RhdGljc0NvaW46IFJlYWRvbmx5PFN0YXRpY3NCYXNlQ29pbj47XG5cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKGJpdGdvOiBCaXRHb0Jhc2UsIHN0YXRpY3NDb2luPzogUmVhZG9ubHk8U3RhdGljc0Jhc2VDb2luPikge1xuICAgIHN1cGVyKGJpdGdvKTtcblxuICAgIGlmICghc3RhdGljc0NvaW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgc3RhdGljc0NvaW4nKTtcbiAgICB9XG5cbiAgICB0aGlzLl9zdGF0aWNzQ29pbiA9IHN0YXRpY3NDb2luO1xuICB9XG5cbiAgLyoqXG4gICAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhbiBJT1RBIGNvaW4gaW5zdGFuY2UuXG4gICAqL1xuICBzdGF0aWMgY3JlYXRlSW5zdGFuY2UoYml0Z286IEJpdEdvQmFzZSwgc3RhdGljc0NvaW4/OiBSZWFkb25seTxTdGF0aWNzQmFzZUNvaW4+KTogQmFzZUNvaW4ge1xuICAgIHJldHVybiBuZXcgSW90YShiaXRnbywgc3RhdGljc0NvaW4pO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBDb2luIENvbmZpZ3VyYXRpb24gTWV0aG9kc1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgZ2V0QmFzZUZhY3RvcigpOiBzdHJpbmcgfCBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLnBvdygxMCwgdGhpcy5fc3RhdGljc0NvaW4uZGVjaW1hbFBsYWNlcyk7XG4gIH1cblxuICBnZXRDaGFpbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zdGF0aWNzQ29pbi5uYW1lO1xuICB9XG5cbiAgZ2V0RmFtaWx5KCk6IENvaW5GYW1pbHkge1xuICAgIHJldHVybiB0aGlzLl9zdGF0aWNzQ29pbi5mYW1pbHk7XG4gIH1cblxuICBnZXRGdWxsTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zdGF0aWNzQ29pbi5mdWxsTmFtZTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gTXVsdGktU2lnbmF0dXJlIGFuZCBUU1MgU3VwcG9ydFxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgc3VwcG9ydHNUc3MoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBnZXREZWZhdWx0TXVsdGlzaWdUeXBlKCk6IE11bHRpc2lnVHlwZSB7XG4gICAgcmV0dXJuIG11bHRpc2lnVHlwZXMudHNzO1xuICB9XG5cbiAgZ2V0TVBDQWxnb3JpdGhtKCk6IE1QQ0FsZ29yaXRobSB7XG4gICAgcmV0dXJuIE1QQ1R5cGUuRUREU0E7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEFkZHJlc3MgYW5kIFB1YmxpYyBLZXkgVmFsaWRhdGlvblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBhbiBJT1RBIGFkZHJlc3MuXG4gICAqIEBwYXJhbSBhZGRyZXNzIC0gVGhlIGFkZHJlc3MgdG8gdmFsaWRhdGUgKDY0LWNoYXJhY3RlciBoZXggc3RyaW5nKVxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBhZGRyZXNzIGlzIHZhbGlkXG4gICAqL1xuICBpc1ZhbGlkQWRkcmVzcyhhZGRyZXNzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdXRpbHMuaXNWYWxpZEFkZHJlc3MoYWRkcmVzcyk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIGEgcHVibGljIGtleS5cbiAgICogQHBhcmFtIHB1YiAtIFRoZSBwdWJsaWMga2V5IHRvIHZhbGlkYXRlXG4gICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIHB1YmxpYyBrZXkgaXMgdmFsaWRcbiAgICovXG4gIGlzVmFsaWRQdWIocHViOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdXRpbHMuaXNWYWxpZFB1YmxpY0tleShwdWIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIGlmIGFuIGFkZHJlc3MgYmVsb25ncyB0byBhIFRTUyB3YWxsZXQuXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBWZXJpZmljYXRpb24gcGFyYW1ldGVycyBpbmNsdWRpbmcgd2FsbGV0IGFkZHJlc3MgYW5kIHVzZXIvYmFja3VwIHB1YmxpYyBrZXlzXG4gICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIGFkZHJlc3MgYmVsb25ncyB0byB0aGUgd2FsbGV0XG4gICAqL1xuICBhc3luYyBpc1dhbGxldEFkZHJlc3MocGFyYW1zOiBUc3NWZXJpZnlBZGRyZXNzT3B0aW9ucyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB2ZXJpZnlFZGRzYVRzc1dhbGxldEFkZHJlc3MoXG4gICAgICBwYXJhbXMsXG4gICAgICAoYWRkcmVzcykgPT4gdGhpcy5pc1ZhbGlkQWRkcmVzcyhhZGRyZXNzKSxcbiAgICAgIChwdWJsaWNLZXkpID0+IHV0aWxzLmdldEFkZHJlc3NGcm9tUHVibGljS2V5KHB1YmxpY0tleSlcbiAgICApO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBUcmFuc2FjdGlvbiBFeHBsYW5hdGlvbiBhbmQgVmVyaWZpY2F0aW9uXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogRXhwbGFpbnMgYSB0cmFuc2FjdGlvbiBieSBwYXJzaW5nIGl0cyBoZXggcmVwcmVzZW50YXRpb24uXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBQYXJhbWV0ZXJzIGNvbnRhaW5pbmcgdGhlIHRyYW5zYWN0aW9uIGhleFxuICAgKiBAcmV0dXJucyBEZXRhaWxlZCBleHBsYW5hdGlvbiBvZiB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHRocm93cyBFcnJvciBpZiB0eEhleCBpcyBtaXNzaW5nIG9yIHRyYW5zYWN0aW9uIGNhbm5vdCBiZSBleHBsYWluZWRcbiAgICovXG4gIGFzeW5jIGV4cGxhaW5UcmFuc2FjdGlvbihwYXJhbXM6IEV4cGxhaW5UcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPFRyYW5zYWN0aW9uRXhwbGFuYXRpb24+IHtcbiAgICBjb25zdCByYXdUeCA9IHRoaXMudmFsaWRhdGVBbmRFeHRyYWN0VHhIZXgocGFyYW1zLnR4SGV4LCAnZXhwbGFpbicpO1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gYXdhaXQgdGhpcy5yZWJ1aWxkVHJhbnNhY3Rpb24ocmF3VHgpO1xuICAgIHJldHVybiB0cmFuc2FjdGlvbi5leHBsYWluVHJhbnNhY3Rpb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGF0IGEgdHJhbnNhY3Rpb24gcHJlYnVpbGQgbWF0Y2hlcyB0aGUgb3JpZ2luYWwgdHJhbnNhY3Rpb24gcGFyYW1ldGVycy5cbiAgICogRW5zdXJlcyByZWNpcGllbnRzIGFuZCBhbW91bnRzIGFsaWduIHdpdGggdGhlIGludGVuZGVkIHRyYW5zYWN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVmVyaWZpY2F0aW9uIHBhcmFtZXRlcnMgY29udGFpbmluZyBwcmVidWlsZCBhbmQgb3JpZ2luYWwgcGFyYW1zXG4gICAqIEByZXR1cm5zIHRydWUgaWYgdmVyaWZpY2F0aW9uIHN1Y2NlZWRzXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgdmVyaWZpY2F0aW9uIGZhaWxzXG4gICAqL1xuICBhc3luYyB2ZXJpZnlUcmFuc2FjdGlvbihwYXJhbXM6IFZlcmlmeVRyYW5zYWN0aW9uT3B0aW9ucyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHsgdHhQcmVidWlsZCwgdHhQYXJhbXMgfSA9IHBhcmFtcztcbiAgICBjb25zdCByYXdUeCA9IHRoaXMudmFsaWRhdGVBbmRFeHRyYWN0VHhIZXgodHhQcmVidWlsZC50eEhleCwgJ3ZlcmlmeScpO1xuXG4gICAgY29uc3QgdHJhbnNhY3Rpb24gPSBhd2FpdCB0aGlzLnJlYnVpbGRUcmFuc2FjdGlvbihyYXdUeCk7XG4gICAgdGhpcy52YWxpZGF0ZVRyYW5zYWN0aW9uVHlwZSh0cmFuc2FjdGlvbik7XG5cbiAgICBpZiAodHhQYXJhbXMucmVjaXBpZW50cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnZlcmlmeVRyYW5zYWN0aW9uUmVjaXBpZW50cyh0cmFuc2FjdGlvbiBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uLCB0eFBhcmFtcy5yZWNpcGllbnRzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZXMgYSB0cmFuc2FjdGlvbiBhbmQgZXh0cmFjdHMgaW5wdXRzLCBvdXRwdXRzLCBhbmQgZmVlcy5cbiAgICogQHBhcmFtIHBhcmFtcyAtIFBhcmFtZXRlcnMgY29udGFpbmluZyB0aGUgdHJhbnNhY3Rpb24gaGV4XG4gICAqIEByZXR1cm5zIFBhcnNlZCB0cmFuc2FjdGlvbiB3aXRoIGlucHV0cywgb3V0cHV0cywgYW5kIGZlZSBpbmZvcm1hdGlvblxuICAgKi9cbiAgYXN5bmMgcGFyc2VUcmFuc2FjdGlvbihwYXJhbXM6IElvdGFQYXJzZVRyYW5zYWN0aW9uT3B0aW9ucyk6IFByb21pc2U8UGFyc2VkVHJhbnNhY3Rpb24+IHtcbiAgICBjb25zdCB0cmFuc2FjdGlvbkV4cGxhbmF0aW9uID0gYXdhaXQgdGhpcy5leHBsYWluVHJhbnNhY3Rpb24oeyB0eEhleDogcGFyYW1zLnR4SGV4IH0pO1xuXG4gICAgaWYgKCF0cmFuc2FjdGlvbkV4cGxhbmF0aW9uIHx8IHRyYW5zYWN0aW9uRXhwbGFuYXRpb24ub3V0cHV0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUVtcHR5UGFyc2VkVHJhbnNhY3Rpb24oKTtcbiAgICB9XG5cbiAgICBjb25zdCBmZWUgPSB0aGlzLmNhbGN1bGF0ZVRyYW5zYWN0aW9uRmVlKHRyYW5zYWN0aW9uRXhwbGFuYXRpb24pO1xuICAgIGNvbnN0IGlucHV0cyA9IHRoaXMuYnVpbGRUcmFuc2FjdGlvbklucHV0cyh0cmFuc2FjdGlvbkV4cGxhbmF0aW9uLCBmZWUpO1xuICAgIGNvbnN0IG91dHB1dHMgPSB0aGlzLmJ1aWxkVHJhbnNhY3Rpb25PdXRwdXRzKHRyYW5zYWN0aW9uRXhwbGFuYXRpb24pO1xuXG4gICAgcmV0dXJuIHsgaW5wdXRzLCBvdXRwdXRzLCBmZWUgfTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gS2V5IEdlbmVyYXRpb24gYW5kIFNpZ25pbmdcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYSBrZXkgcGFpciBmb3IgSU9UQSB0cmFuc2FjdGlvbnMuXG4gICAqIEBwYXJhbSBzZWVkIC0gT3B0aW9uYWwgc2VlZCB0byBnZW5lcmF0ZSBkZXRlcm1pbmlzdGljIGtleSBwYWlyXG4gICAqIEByZXR1cm5zIEtleSBwYWlyIHdpdGggcHVibGljIGFuZCBwcml2YXRlIGtleXNcbiAgICogQHRocm93cyBFcnJvciBpZiBwcml2YXRlIGtleSBnZW5lcmF0aW9uIGZhaWxzXG4gICAqL1xuICBnZW5lcmF0ZUtleVBhaXIoc2VlZD86IEJ1ZmZlcik6IEtleVBhaXIge1xuICAgIGNvbnN0IGtleVBhaXIgPSBzZWVkID8gbmV3IElvdGFLZXlQYWlyKHsgc2VlZCB9KSA6IG5ldyBJb3RhS2V5UGFpcigpO1xuICAgIGNvbnN0IGtleXMgPSBrZXlQYWlyLmdldEtleXMoKTtcblxuICAgIGlmICgha2V5cy5wcnYpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBwcnYgaW4ga2V5IGdlbmVyYXRpb24uJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHB1Yjoga2V5cy5wdWIsXG4gICAgICBwcnY6IGtleXMucHJ2LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogU2lnbnMgYSB0cmFuc2FjdGlvbiAobm90IGltcGxlbWVudGVkIGZvciBJT1RBKS5cbiAgICogSU9UQSB0cmFuc2FjdGlvbnMgYXJlIHNpZ25lZCBleHRlcm5hbGx5IHVzaW5nIFRTUy5cbiAgICovXG4gIGFzeW5jIHNpZ25UcmFuc2FjdGlvbihwYXJhbXM6IFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPFNpZ25lZFRyYW5zYWN0aW9uPiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEF1ZGl0cyBhIGRlY3J5cHRlZCBwcml2YXRlIGtleSB0byBlbnN1cmUgaXQncyB2YWxpZCBmb3IgdGhlIGdpdmVuIHB1YmxpYyBrZXkuXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBQYXJhbWV0ZXJzIGNvbnRhaW5pbmcgbXVsdGlTaWdUeXBlLCBwcml2YXRlIGtleSwgYW5kIHB1YmxpYyBrZXlcbiAgICogQHRocm93cyBFcnJvciBpZiBtdWx0aVNpZ1R5cGUgaXMgbm90IFRTUyBvciBpZiBrZXkgdmFsaWRhdGlvbiBmYWlsc1xuICAgKi9cbiAgYXVkaXREZWNyeXB0ZWRLZXkoeyBtdWx0aVNpZ1R5cGUsIHBydiwgcHVibGljS2V5IH06IEF1ZGl0RGVjcnlwdGVkS2V5UGFyYW1zKTogdm9pZCB7XG4gICAgaWYgKG11bHRpU2lnVHlwZSAhPT0gbXVsdGlzaWdUeXBlcy50c3MpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgbXVsdGlTaWdUeXBlJyk7XG4gICAgfVxuICAgIGF1ZGl0RWRkc2FQcml2YXRlS2V5KHBydiwgcHVibGljS2V5ID8/ICcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRyYWN0cyB0aGUgc2lnbmFibGUgcGF5bG9hZCBmcm9tIGEgc2VyaWFsaXplZCB0cmFuc2FjdGlvbi5cbiAgICogQHBhcmFtIHNlcmlhbGl6ZWRUeCAtIFRoZSBzZXJpYWxpemVkIHRyYW5zYWN0aW9uIGhleFxuICAgKiBAcmV0dXJucyBCdWZmZXIgY29udGFpbmluZyB0aGUgc2lnbmFibGUgcGF5bG9hZFxuICAgKi9cbiAgYXN5bmMgZ2V0U2lnbmFibGVQYXlsb2FkKHNlcmlhbGl6ZWRUeDogc3RyaW5nKTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgICBjb25zdCByZWJ1aWx0VHJhbnNhY3Rpb24gPSBhd2FpdCB0aGlzLnJlYnVpbGRUcmFuc2FjdGlvbihzZXJpYWxpemVkVHgpO1xuICAgIHJldHVybiByZWJ1aWx0VHJhbnNhY3Rpb24uc2lnbmFibGVQYXlsb2FkO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgY29pbi1zcGVjaWZpYyBmaWVsZHMgaW4gdGhlIHRyYW5zYWN0aW9uIGludGVudC5cbiAgICogQHBhcmFtIGludGVudCAtIFRoZSBwb3B1bGF0ZWQgaW50ZW50IG9iamVjdCB0byBtb2RpZnlcbiAgICogQHBhcmFtIHBhcmFtcyAtIFBhcmFtZXRlcnMgY29udGFpbmluZyB1bnNwZW50cyBkYXRhXG4gICAqL1xuICBzZXRDb2luU3BlY2lmaWNGaWVsZHNJbkludGVudChpbnRlbnQ6IFBvcHVsYXRlZEludGVudCwgcGFyYW1zOiBQcmVidWlsZFRyYW5zYWN0aW9uV2l0aEludGVudE9wdGlvbnMpOiB2b2lkIHtcbiAgICBpbnRlbnQudW5zcGVudHMgPSBwYXJhbXMudW5zcGVudHM7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFByaXZhdGUgSGVscGVyIE1ldGhvZHNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgYW5kIGV4dHJhY3RzIHRyYW5zYWN0aW9uIGhleCBmcm9tIHBhcmFtZXRlcnMuXG4gICAqIEBwYXJhbSB0eEhleCAtIFRoZSB0cmFuc2FjdGlvbiBoZXggdG8gdmFsaWRhdGVcbiAgICogQHBhcmFtIG9wZXJhdGlvbiAtIFRoZSBvcGVyYXRpb24gYmVpbmcgcGVyZm9ybWVkIChmb3IgZXJyb3IgbWVzc2FnZXMpXG4gICAqIEByZXR1cm5zIFRoZSB2YWxpZGF0ZWQgdHJhbnNhY3Rpb24gaGV4XG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgdHhIZXggaXMgbWlzc2luZ1xuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZUFuZEV4dHJhY3RUeEhleCh0eEhleDogc3RyaW5nIHwgdW5kZWZpbmVkLCBvcGVyYXRpb246IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCF0eEhleCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBtaXNzaW5nIHJlcXVpcmVkIHR4IHByZWJ1aWxkIHByb3BlcnR5IHR4SGV4IGZvciAke29wZXJhdGlvbn0gb3BlcmF0aW9uYCk7XG4gICAgfVxuICAgIHJldHVybiB0eEhleDtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhhdCB0aGUgdHJhbnNhY3Rpb24gaXMgYSBUcmFuc2ZlclRyYW5zYWN0aW9uLlxuICAgKiBAcGFyYW0gdHJhbnNhY3Rpb24gLSBUaGUgdHJhbnNhY3Rpb24gdG8gdmFsaWRhdGVcbiAgICogQHRocm93cyBFcnJvciBpZiB0cmFuc2FjdGlvbiBpcyBub3QgYSBUcmFuc2ZlclRyYW5zYWN0aW9uXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlVHJhbnNhY3Rpb25UeXBlKHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbik6IHZvaWQge1xuICAgIGlmICghKHRyYW5zYWN0aW9uIGluc3RhbmNlb2YgVHJhbnNmZXJUcmFuc2FjdGlvbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVHggbm90IGEgdHJhbnNmZXIgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgdGhhdCB0cmFuc2FjdGlvbiByZWNpcGllbnRzIG1hdGNoIHRoZSBleHBlY3RlZCByZWNpcGllbnRzLlxuICAgKiBAcGFyYW0gdHJhbnNhY3Rpb24gLSBUaGUgdHJhbnNmZXIgdHJhbnNhY3Rpb24gdG8gdmVyaWZ5XG4gICAqIEBwYXJhbSBleHBlY3RlZFJlY2lwaWVudHMgLSBUaGUgZXhwZWN0ZWQgcmVjaXBpZW50cyBmcm9tIHRyYW5zYWN0aW9uIHBhcmFtc1xuICAgKiBAdGhyb3dzIEVycm9yIGlmIHJlY2lwaWVudHMgZG9uJ3QgbWF0Y2hcbiAgICovXG4gIHByaXZhdGUgdmVyaWZ5VHJhbnNhY3Rpb25SZWNpcGllbnRzKFxuICAgIHRyYW5zYWN0aW9uOiBUcmFuc2ZlclRyYW5zYWN0aW9uLFxuICAgIGV4cGVjdGVkUmVjaXBpZW50czogVHJhbnNhY3Rpb25SZWNpcGllbnRbXVxuICApOiB2b2lkIHtcbiAgICBjb25zdCB0eERhdGEgPSB0cmFuc2FjdGlvbi50b0pzb24oKSBhcyBUcmFuc2ZlclR4RGF0YTtcblxuICAgIGlmICghdHhEYXRhLnJlY2lwaWVudHMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVHggcmVjaXBpZW50cyBkb2VzIG5vdCBtYXRjaCB3aXRoIGV4cGVjdGVkIHR4UGFyYW1zIHJlY2lwaWVudHMnKTtcbiAgICB9XG5cbiAgICBjb25zdCBhY3R1YWxSZWNpcGllbnRzID0gdGhpcy5ub3JtYWxpemVSZWNpcGllbnRzKHR4RGF0YS5yZWNpcGllbnRzKTtcbiAgICBjb25zdCBleHBlY3RlZCA9IHRoaXMubm9ybWFsaXplUmVjaXBpZW50cyhleHBlY3RlZFJlY2lwaWVudHMpO1xuXG4gICAgaWYgKCF0aGlzLnJlY2lwaWVudHNNYXRjaChleHBlY3RlZCwgYWN0dWFsUmVjaXBpZW50cykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVHggcmVjaXBpZW50cyBkb2VzIG5vdCBtYXRjaCB3aXRoIGV4cGVjdGVkIHR4UGFyYW1zIHJlY2lwaWVudHMnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTm9ybWFsaXplcyByZWNpcGllbnRzIGJ5IGV4dHJhY3Rpbmcgb25seSByZWxldmFudCBmaWVsZHMuXG4gICAqIEBwYXJhbSByZWNpcGllbnRzIC0gUmVjaXBpZW50cyB0byBub3JtYWxpemVcbiAgICogQHJldHVybnMgTm9ybWFsaXplZCByZWNpcGllbnRzIHdpdGggYWRkcmVzcywgYW1vdW50LCBhbmQgdG9rZW5OYW1lIG9ubHlcbiAgICovXG4gIHByaXZhdGUgbm9ybWFsaXplUmVjaXBpZW50cyhyZWNpcGllbnRzOiBUcmFuc2FjdGlvblJlY2lwaWVudFtdKTogVHJhbnNhY3Rpb25SZWNpcGllbnRbXSB7XG4gICAgcmV0dXJuIHJlY2lwaWVudHMubWFwKChyZWNpcGllbnQpID0+IF8ucGljayhyZWNpcGllbnQsIFsnYWRkcmVzcycsICdhbW91bnQnLCAndG9rZW5OYW1lJ10pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgZXhwZWN0ZWQgcmVjaXBpZW50cyBtYXRjaCBhY3R1YWwgcmVjaXBpZW50cy5cbiAgICogQHBhcmFtIGV4cGVjdGVkIC0gRXhwZWN0ZWQgcmVjaXBpZW50c1xuICAgKiBAcGFyYW0gYWN0dWFsIC0gQWN0dWFsIHJlY2lwaWVudHMgZnJvbSB0cmFuc2FjdGlvblxuICAgKiBAcmV0dXJucyB0cnVlIGlmIGFsbCBleHBlY3RlZCByZWNpcGllbnRzIGFyZSBmb3VuZCBpbiBhY3R1YWwgcmVjaXBpZW50c1xuICAgKi9cbiAgcHJpdmF0ZSByZWNpcGllbnRzTWF0Y2goZXhwZWN0ZWQ6IFRyYW5zYWN0aW9uUmVjaXBpZW50W10sIGFjdHVhbDogVHJhbnNhY3Rpb25SZWNpcGllbnRbXSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBleHBlY3RlZC5ldmVyeSgoZXhwZWN0ZWRSZWNpcGllbnQpID0+XG4gICAgICBhY3R1YWwuc29tZSgoYWN0dWFsUmVjaXBpZW50KSA9PiBfLmlzRXF1YWwoZXhwZWN0ZWRSZWNpcGllbnQsIGFjdHVhbFJlY2lwaWVudCkpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGVtcHR5IHBhcnNlZCB0cmFuc2FjdGlvbiByZXN1bHQuXG4gICAqIFVzZWQgd2hlbiB0cmFuc2FjdGlvbiBoYXMgbm8gb3V0cHV0cy5cbiAgICovXG4gIHByaXZhdGUgY3JlYXRlRW1wdHlQYXJzZWRUcmFuc2FjdGlvbigpOiBQYXJzZWRUcmFuc2FjdGlvbiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlucHV0czogW10sXG4gICAgICBvdXRwdXRzOiBbXSxcbiAgICAgIGZlZTogbmV3IEJpZ051bWJlcigwKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZXMgdGhlIHRyYW5zYWN0aW9uIGZlZSBmcm9tIHRoZSBleHBsYW5hdGlvbi5cbiAgICogQHBhcmFtIGV4cGxhbmF0aW9uIC0gVGhlIHRyYW5zYWN0aW9uIGV4cGxhbmF0aW9uXG4gICAqIEByZXR1cm5zIFRoZSBmZWUgYXMgYSBCaWdOdW1iZXJcbiAgICovXG4gIHByaXZhdGUgY2FsY3VsYXRlVHJhbnNhY3Rpb25GZWUoZXhwbGFuYXRpb246IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24pOiBCaWdOdW1iZXIge1xuICAgIGlmIChleHBsYW5hdGlvbi5mZWUuZmVlID09PSAnJykge1xuICAgICAgcmV0dXJuIG5ldyBCaWdOdW1iZXIoMCk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgQmlnTnVtYmVyKGV4cGxhbmF0aW9uLmZlZS5mZWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgaW5wdXRzIGFycmF5IGZvciBhIHBhcnNlZCB0cmFuc2FjdGlvbi5cbiAgICogSW5jbHVkZXMgc2VuZGVyIGlucHV0IGFuZCBvcHRpb25hbGx5IHNwb25zb3IgaW5wdXQgaWYgcHJlc2VudC5cbiAgICpcbiAgICogQHBhcmFtIGV4cGxhbmF0aW9uIC0gVGhlIHRyYW5zYWN0aW9uIGV4cGxhbmF0aW9uXG4gICAqIEBwYXJhbSBmZWUgLSBUaGUgY2FsY3VsYXRlZCB0cmFuc2FjdGlvbiBmZWVcbiAgICogQHJldHVybnMgQXJyYXkgb2YgdHJhbnNhY3Rpb24gaW5wdXRzXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkVHJhbnNhY3Rpb25JbnB1dHMoXG4gICAgZXhwbGFuYXRpb246IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24sXG4gICAgZmVlOiBCaWdOdW1iZXJcbiAgKTogQXJyYXk8e1xuICAgIGFkZHJlc3M6IHN0cmluZztcbiAgICBhbW91bnQ6IHN0cmluZztcbiAgfT4ge1xuICAgIGNvbnN0IHNlbmRlckFkZHJlc3MgPSBleHBsYW5hdGlvbi5vdXRwdXRzWzBdLmFkZHJlc3M7XG4gICAgY29uc3Qgb3V0cHV0QW1vdW50ID0gbmV3IEJpZ051bWJlcihleHBsYW5hdGlvbi5vdXRwdXRBbW91bnQpO1xuXG4gICAgLy8gSWYgdGhlcmUncyBhIHNwb25zb3IsIHNlbmRlciBvbmx5IHBheXMgZm9yIG91dHB1dHNcbiAgICAvLyBPdGhlcndpc2UsIHNlbmRlciBwYXlzIGZvciBvdXRwdXRzICsgZmVlXG4gICAgY29uc3Qgc2VuZGVyQW1vdW50ID0gZXhwbGFuYXRpb24uc3BvbnNvciA/IG91dHB1dEFtb3VudC50b0ZpeGVkKCkgOiBvdXRwdXRBbW91bnQucGx1cyhmZWUpLnRvRml4ZWQoKTtcblxuICAgIGNvbnN0IGlucHV0cyA9IFtcbiAgICAgIHtcbiAgICAgICAgYWRkcmVzczogc2VuZGVyQWRkcmVzcyxcbiAgICAgICAgYW1vdW50OiBzZW5kZXJBbW91bnQsXG4gICAgICB9LFxuICAgIF07XG5cbiAgICAvLyBBZGQgc3BvbnNvciBpbnB1dCBpZiBwcmVzZW50XG4gICAgaWYgKGV4cGxhbmF0aW9uLnNwb25zb3IpIHtcbiAgICAgIGlucHV0cy5wdXNoKHtcbiAgICAgICAgYWRkcmVzczogZXhwbGFuYXRpb24uc3BvbnNvcixcbiAgICAgICAgYW1vdW50OiBmZWUudG9GaXhlZCgpLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGlucHV0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIG91dHB1dHMgYXJyYXkgZm9yIGEgcGFyc2VkIHRyYW5zYWN0aW9uLlxuICAgKiBAcGFyYW0gZXhwbGFuYXRpb24gLSBUaGUgdHJhbnNhY3Rpb24gZXhwbGFuYXRpb25cbiAgICogQHJldHVybnMgQXJyYXkgb2YgdHJhbnNhY3Rpb24gb3V0cHV0c1xuICAgKi9cbiAgcHJpdmF0ZSBidWlsZFRyYW5zYWN0aW9uT3V0cHV0cyhleHBsYW5hdGlvbjogVHJhbnNhY3Rpb25FeHBsYW5hdGlvbik6IEFycmF5PHtcbiAgICBhZGRyZXNzOiBzdHJpbmc7XG4gICAgYW1vdW50OiBzdHJpbmc7XG4gIH0+IHtcbiAgICByZXR1cm4gZXhwbGFuYXRpb24ub3V0cHV0cy5tYXAoKG91dHB1dCkgPT4gKHtcbiAgICAgIGFkZHJlc3M6IG91dHB1dC5hZGRyZXNzLFxuICAgICAgYW1vdW50OiBuZXcgQmlnTnVtYmVyKG91dHB1dC5hbW91bnQpLnRvRml4ZWQoKSxcbiAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHRyYW5zYWN0aW9uIGJ1aWxkZXIgZmFjdG9yeSBpbnN0YW5jZS5cbiAgICogQHJldHVybnMgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeSBmb3IgdGhpcyBjb2luXG4gICAqL1xuICBwcml2YXRlIGdldFR4QnVpbGRlckZhY3RvcnkoKTogVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeSB7XG4gICAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCh0aGlzLmdldENoYWluKCkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWJ1aWxkcyBhIHRyYW5zYWN0aW9uIGZyb20gaXRzIGhleCByZXByZXNlbnRhdGlvbi5cbiAgICogQHBhcmFtIHR4SGV4IC0gVGhlIHRyYW5zYWN0aW9uIGhleCB0byByZWJ1aWxkXG4gICAqIEByZXR1cm5zIFRoZSByZWJ1aWx0IHRyYW5zYWN0aW9uXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgdHJhbnNhY3Rpb24gY2Fubm90IGJlIHJlYnVpbHRcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVidWlsZFRyYW5zYWN0aW9uKHR4SGV4OiBzdHJpbmcpOiBQcm9taXNlPFRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgdHhCdWlsZGVyRmFjdG9yeSA9IHRoaXMuZ2V0VHhCdWlsZGVyRmFjdG9yeSgpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSB0eEJ1aWxkZXJGYWN0b3J5LmZyb20odHhIZXgpO1xuICAgICAgcmV0dXJuIChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byByZWJ1aWxkIHRyYW5zYWN0aW9uOiAke2Vyci50b1N0cmluZygpfWApO1xuICAgIH1cbiAgfVxufVxuIl19
@@ -1,12 +1,61 @@
1
+ /**
2
+ * Length of IOTA addresses in characters (excluding 0x prefix).
3
+ * IOTA uses 64-character hexadecimal addresses.
4
+ */
1
5
  export declare const IOTA_ADDRESS_LENGTH = 64;
6
+ /**
7
+ * Length of transaction digest in bytes.
8
+ * Used for transaction IDs and hashes.
9
+ */
2
10
  export declare const IOTA_TRANSACTION_DIGEST_LENGTH = 32;
11
+ /**
12
+ * Length of block digest in bytes.
13
+ * Used for block IDs and references.
14
+ */
3
15
  export declare const IOTA_BLOCK_DIGEST_LENGTH = 32;
16
+ /**
17
+ * Length of Ed25519 signatures in bytes.
18
+ * IOTA uses Ed25519 for transaction signing.
19
+ */
4
20
  export declare const IOTA_SIGNATURE_LENGTH = 64;
21
+ /**
22
+ * Length of Ed25519 public keys in bytes.
23
+ * Standard Ed25519 key size.
24
+ */
5
25
  export declare const IOTA_KEY_BYTES_LENGTH = 32;
26
+ /**
27
+ * Maximum number of input objects allowed in a single transaction.
28
+ * This limit ensures transactions can be processed efficiently by the network.
29
+ */
6
30
  export declare const MAX_INPUT_OBJECTS = 2048;
31
+ /**
32
+ * Maximum number of gas payment objects allowed per transaction.
33
+ * When exceeded, objects must be merged before the transaction can be built.
34
+ * This prevents transaction size from becoming too large.
35
+ */
7
36
  export declare const MAX_GAS_PAYMENT_OBJECTS = 256;
37
+ /**
38
+ * Maximum number of recipients in a transfer transaction.
39
+ * Limits the number of outputs to keep transaction size manageable.
40
+ */
41
+ export declare const MAX_RECIPIENTS = 256;
42
+ /**
43
+ * Maximum gas budget allowed for a transaction.
44
+ * Used for dry-run simulations to estimate gas costs.
45
+ * Set to a very high value (50 billion) to ensure simulation completes.
46
+ */
8
47
  export declare const MAX_GAS_BUDGET = 50000000000;
48
+ /**
49
+ * Maximum gas price for simulated transactions.
50
+ * Used when building dry-run transactions for gas estimation.
51
+ */
9
52
  export declare const MAX_GAS_PRICE = 100000;
10
- export declare const MAX_RECIPIENTS = 256;
53
+ /**
54
+ * Valid command types for transfer transactions.
55
+ * Transfer transactions can only contain these three command types:
56
+ * - SplitCoins: Split a coin into multiple coins with specified amounts
57
+ * - MergeCoins: Merge multiple coins into a single coin
58
+ * - TransferObjects: Transfer coins/objects to recipients
59
+ */
11
60
  export declare const TRANSFER_TRANSACTION_COMMANDS: string[];
12
61
  //# sourceMappingURL=constants.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/lib/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,mBAAmB,KAAK,CAAC;AACtC,eAAO,MAAM,8BAA8B,KAAK,CAAC;AACjD,eAAO,MAAM,wBAAwB,KAAK,CAAC;AAC3C,eAAO,MAAM,qBAAqB,KAAK,CAAC;AACxC,eAAO,MAAM,qBAAqB,KAAK,CAAC;AACxC,eAAO,MAAM,iBAAiB,OAAO,CAAC;AACtC,eAAO,MAAM,uBAAuB,MAAM,CAAC;AAC3C,eAAO,MAAM,cAAc,cAAc,CAAC;AAC1C,eAAO,MAAM,aAAa,SAAS,CAAC;AACpC,eAAO,MAAM,cAAc,MAAM,CAAC;AAClC,eAAO,MAAM,6BAA6B,UAAkD,CAAC"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/lib/constants.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,eAAO,MAAM,mBAAmB,KAAK,CAAC;AAEtC;;;GAGG;AACH,eAAO,MAAM,8BAA8B,KAAK,CAAC;AAEjD;;;GAGG;AACH,eAAO,MAAM,wBAAwB,KAAK,CAAC;AAM3C;;;GAGG;AACH,eAAO,MAAM,qBAAqB,KAAK,CAAC;AAExC;;;GAGG;AACH,eAAO,MAAM,qBAAqB,KAAK,CAAC;AAMxC;;;GAGG;AACH,eAAO,MAAM,iBAAiB,OAAO,CAAC;AAEtC;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,MAAM,CAAC;AAE3C;;;GAGG;AACH,eAAO,MAAM,cAAc,MAAM,CAAC;AAMlC;;;;GAIG;AACH,eAAO,MAAM,cAAc,cAAc,CAAC;AAE1C;;;GAGG;AACH,eAAO,MAAM,aAAa,SAAS,CAAC;AAMpC;;;;;;GAMG;AACH,eAAO,MAAM,6BAA6B,UAAkD,CAAC"}