@bitgo/sdk-coin-flrp 1.9.0 → 1.9.2

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.
@@ -2,7 +2,7 @@ import { TypeSymbols, Credential } from '@flarenetwork/flarejs';
2
2
  import { TransactionType } from '@bitgo/sdk-core';
3
3
  import { BaseCoin as CoinConfig } from '@bitgo/statics';
4
4
  import { Transaction } from './transaction';
5
- import { TransactionBuilder } from './transactionBuilder';
5
+ import { AtomicTransactionBuilder } from './atomicTransactionBuilder';
6
6
  import { FlrpFeeState } from '@bitgo/public-types';
7
7
  import { Tx } from './iface';
8
8
  /**
@@ -13,8 +13,11 @@ import { Tx } from './iface';
13
13
  * - No BLS keys required
14
14
  * - Delegates to an existing validator's nodeID
15
15
  * - Rewards go to corresponding C-chain address
16
+ *
17
+ * Extends AtomicTransactionBuilder to inherit address sorting and credential management
18
+ * logic needed for proper multisig UTXO handling.
16
19
  */
17
- export declare class PermissionlessDelegatorTxBuilder extends TransactionBuilder {
20
+ export declare class PermissionlessDelegatorTxBuilder extends AtomicTransactionBuilder {
18
21
  protected _nodeID: string;
19
22
  protected _startTime: bigint;
20
23
  protected _endTime: bigint;
@@ -73,14 +76,28 @@ export declare class PermissionlessDelegatorTxBuilder extends TransactionBuilder
73
76
  * @param type TypeSymbol from parsed transaction
74
77
  */
75
78
  verifyTxType(type: TypeSymbols): boolean;
79
+ /**
80
+ * Recover UTXOs from transaction inputs.
81
+ * Uses fromAddresses as proxy for UTXO addresses since we're reconstructing from a parsed transaction.
82
+ *
83
+ * @param inputs Array of TransferableInput from baseTx
84
+ * @param fromAddresses Wallet addresses to use as proxy for UTXO addresses
85
+ * @returns Array of decoded UTXO objects
86
+ * @private
87
+ */
88
+ private recoverUtxosFromInputs;
76
89
  protected buildImplementation(): Promise<Transaction>;
77
90
  /**
78
- * Get the user's address (index 0) for delegation.
91
+ * Get the user's address (index 0) for default reward address.
92
+ *
93
+ * BitGo Convention for fromAddresses:
94
+ * - Index 0: User key (signer in normal mode)
95
+ * - Index 1: BitGo key (always a signer)
96
+ * - Index 2: Backup key (signer in recovery mode)
79
97
  *
80
- * For delegation transactions, we use only the user key because:
81
- * 1. On-chain rewards go to the C-chain address derived from the delegator's public key
82
- * 2. Using the user key ensures rewards go to the user's corresponding C-chain address
83
- * 3. The user key is at index 0 in the fromAddresses array (BitGo convention: [user, bitgo, backup])
98
+ * For delegation transactions, the user's address at index 0 is used as the default
99
+ * reward address parameter (though the parameter has no on-chain effect - rewards
100
+ * go to C-chain addresses derived from the P-chain addresses in stake outputs).
84
101
  *
85
102
  * @returns Buffer containing the user's address
86
103
  * @protected
@@ -91,11 +108,26 @@ export declare class PermissionlessDelegatorTxBuilder extends TransactionBuilder
91
108
  * Uses pvm.e.newAddPermissionlessDelegatorTx (post-Etna API).
92
109
  *
93
110
  * Note: The rewardAddresses parameter is accepted by the API but does NOT affect
94
- * where rewards are sent on-chain - rewards always go to the C-chain address
95
- * derived from the delegator's public key (user key at index 0).
111
+ * where rewards are sent on-chain. Rewards accrue to C-chain addresses derived
112
+ * from the P-chain addresses in the stake outputs. The stake outputs contain the
113
+ * addresses from fromAddressesBytes (sorted to match UTXO owner order).
96
114
  * @protected
97
115
  */
98
116
  protected buildFlareTransaction(): void;
117
+ /**
118
+ * Create a corrected AddPermissionlessDelegatorTx with the given change outputs.
119
+ * This is necessary because FlareJS's newAddPermissionlessDelegatorTx doesn't support setting
120
+ * the threshold and locktime for change outputs - it defaults to threshold=1.
121
+ *
122
+ * FlareJS declares baseTx.outputs as readonly, so we use Object.defineProperty
123
+ * to override the property with the corrected outputs. This is a workaround until
124
+ * FlareJS adds proper support for change output thresholds.
125
+ *
126
+ * @param originalTx - The original AddPermissionlessDelegatorTx
127
+ * @param correctedOutputs - The corrected change outputs with proper threshold
128
+ * @returns A new AddPermissionlessDelegatorTx with the corrected change outputs
129
+ */
130
+ private createCorrectedDelegatorTx;
99
131
  /**
100
132
  * Verify if the transaction type matches AddPermissionlessDelegatorTx
101
133
  * @param type TypeSymbol from parsed transaction
@@ -1 +1 @@
1
- {"version":3,"file":"permissionlessDelegatorTxBuilder.d.ts","sourceRoot":"","sources":["../../../src/lib/permissionlessDelegatorTxBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,WAAW,EAKX,UAAU,EAEX,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAuC,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvF,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAE7B;;;;;;;;GAQG;AACH,qBAAa,gCAAiC,SAAQ,kBAAkB;IACtE,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,UAAU,EAAE,MAAM,CAAC;IAC7B,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,YAAY,EAAE,MAAM,CAAC;IAC/B,SAAS,CAAC,SAAS,EAAE,YAAY,GAAG,SAAS,CAAC;gBAElC,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC;IAK5C,SAAS,KAAK,eAAe,IAAI,eAAe,CAE/C;IAGD,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAYpC,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAM/D,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAYzC;;;;;;;;OAQG;IACH,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAKpC;;;OAGG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAM5B;;;OAGG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAKvC;;;OAGG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAKrC;;;OAGG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAOzC;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI;IAMtC;;;;;;;OAOG;IACH,WAAW,CAAC,EAAE,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,iBAAiB,CAAC,EAAE,UAAU,EAAE,GAAG,IAAI;IAgD9E;;;OAGG;IACH,YAAY,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO;cAIxB,mBAAmB,IAAI,OAAO,CAAC,WAAW,CAAC;IAW3D;;;;;;;;;;OAUG;IACH,SAAS,CAAC,cAAc,IAAI,MAAM;IAYlC;;;;;;;;OAQG;IACH,SAAS,CAAC,qBAAqB,IAAI,IAAI;IA4DvC;;;OAGG;IACH,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO;IAI/C,kBAAkB;IAClB,SAAS,KAAK,WAAW,IAAI,WAAW,CAEvC;IAED,SAAS,KAAK,WAAW,CAAC,WAAW,EAAE,WAAW,EAEjD;CACF"}
1
+ {"version":3,"file":"permissionlessDelegatorTxBuilder.d.ts","sourceRoot":"","sources":["../../../src/lib/permissionlessDelegatorTxBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,WAAW,EAKX,UAAU,EAKX,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAuC,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvF,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAEtE,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,EAAE,EAAkB,MAAM,SAAS,CAAC;AAE7C;;;;;;;;;;;GAWG;AACH,qBAAa,gCAAiC,SAAQ,wBAAwB;IAC5E,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,UAAU,EAAE,MAAM,CAAC;IAC7B,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,YAAY,EAAE,MAAM,CAAC;IAC/B,SAAS,CAAC,SAAS,EAAE,YAAY,GAAG,SAAS,CAAC;gBAElC,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC;IAK5C,SAAS,KAAK,eAAe,IAAI,eAAe,CAE/C;IAGD,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAYpC,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAQ/D,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAYzC;;;;;;;;OAQG;IACH,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAKpC;;;OAGG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAM5B;;;OAGG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAKvC;;;OAGG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAKrC;;;OAGG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAOzC;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI;IAMtC;;;;;;;OAOG;IACH,WAAW,CAAC,EAAE,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,iBAAiB,CAAC,EAAE,UAAU,EAAE,GAAG,IAAI;IAkF9E;;;OAGG;IACH,YAAY,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO;IAIxC;;;;;;;;OAQG;IACH,OAAO,CAAC,sBAAsB;cAuBd,mBAAmB,IAAI,OAAO,CAAC,WAAW,CAAC;IAW3D;;;;;;;;;;;;;;OAcG;IACH,SAAS,CAAC,cAAc,IAAI,MAAM;IAYlC;;;;;;;;;OASG;IACH,SAAS,CAAC,qBAAqB,IAAI,IAAI;IA0IvC;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,0BAA0B;IAiBlC;;;OAGG;IACH,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO;IAI/C,kBAAkB;IAClB,SAAS,KAAK,WAAW,IAAI,WAAW,CAEvC;IAED,SAAS,KAAK,WAAW,CAAC,WAAW,EAAE,WAAW,EAEjD;CAIF"}
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.PermissionlessDelegatorTxBuilder = void 0;
7
7
  const flarejs_1 = require("@flarenetwork/flarejs");
8
8
  const sdk_core_1 = require("@bitgo/sdk-core");
9
- const transactionBuilder_1 = require("./transactionBuilder");
9
+ const atomicTransactionBuilder_1 = require("./atomicTransactionBuilder");
10
10
  const utils_1 = __importDefault(require("./utils"));
11
11
  /**
12
12
  * Builder for AddPermissionlessDelegator transactions on Flare P-Chain.
@@ -16,8 +16,11 @@ const utils_1 = __importDefault(require("./utils"));
16
16
  * - No BLS keys required
17
17
  * - Delegates to an existing validator's nodeID
18
18
  * - Rewards go to corresponding C-chain address
19
+ *
20
+ * Extends AtomicTransactionBuilder to inherit address sorting and credential management
21
+ * logic needed for proper multisig UTXO handling.
19
22
  */
20
- class PermissionlessDelegatorTxBuilder extends transactionBuilder_1.TransactionBuilder {
23
+ class PermissionlessDelegatorTxBuilder extends atomicTransactionBuilder_1.AtomicTransactionBuilder {
21
24
  constructor(coinConfig) {
22
25
  super(coinConfig);
23
26
  this.transaction._fee.fee = this.transaction._network.txFee;
@@ -41,6 +44,8 @@ class PermissionlessDelegatorTxBuilder extends transactionBuilder_1.TransactionB
41
44
  if (endTime < startTime) {
42
45
  throw new sdk_core_1.BuildTransactionError('End date cannot be less than start date');
43
46
  }
47
+ // Note: Minimum duration validation is handled by the network.
48
+ // Flare P-chain requires minimum 14 days for delegation.
44
49
  }
45
50
  validateStakeAmount(amount) {
46
51
  const minDelegationStake = BigInt(this.transaction._network.minDelegationStake || this.transaction._network.minStake);
@@ -142,13 +147,39 @@ class PermissionlessDelegatorTxBuilder extends transactionBuilder_1.TransactionB
142
147
  if (rewardsOwner && rewardsOwner.addrs && rewardsOwner.addrs.length > 0) {
143
148
  this.transaction._rewardAddresses = rewardsOwner.addrs.map((addr) => Buffer.from(addr.toBytes()));
144
149
  }
150
+ // Recover UTXOs from baseTx inputs using stake output addresses as proxy
151
+ this.transaction._utxos = this.recoverUtxosFromInputs([...delegatorTx.baseTx.inputs], this.transaction._fromAddresses);
145
152
  const credentials = parsedCredentials || [];
146
153
  if (rawBytes && credentials.length > 0) {
147
154
  this.transaction._rawSignedBytes = rawBytes;
148
155
  }
149
- // Create the UnsignedTx with parsed credentials
150
- // AddressMaps will be empty as they're computed during signing
151
- const unsignedTx = new flarejs_1.UnsignedTx(delegatorTx, [], new flarejs_1.utils.AddressMaps([]), credentials);
156
+ // Compute addressesIndex to map wallet positions to sorted UTXO positions
157
+ // Force recompute to ensure fresh mapping from parsed transaction
158
+ this.computeAddressesIndex(true);
159
+ // Use parsed credentials if available, otherwise create new ones based on sigIndices
160
+ // The sigIndices from the parsed transaction (stored in addressesIndex) determine
161
+ // the correct credential ordering for on-chain verification
162
+ const txCredentials = credentials.length > 0
163
+ ? credentials
164
+ : this.transaction._utxos.map((utxo) => {
165
+ const utxoThreshold = utxo.threshold || this.transaction._threshold;
166
+ const sigIndices = utxo.addressesIndex ?? [];
167
+ // Use sigIndices-based method if we have valid sigIndices from parsed transaction
168
+ if (sigIndices.length >= utxoThreshold && sigIndices.every((idx) => idx >= 0)) {
169
+ return this.createCredentialForUtxo(utxo, utxoThreshold, sigIndices);
170
+ }
171
+ return this.createCredentialForUtxo(utxo, utxoThreshold);
172
+ });
173
+ // Create addressMaps using sigIndices from parsed transaction for consistency
174
+ const addressMaps = this.transaction._utxos.map((utxo) => {
175
+ const utxoThreshold = utxo.threshold || this.transaction._threshold;
176
+ const sigIndices = utxo.addressesIndex ?? [];
177
+ if (sigIndices.length >= utxoThreshold && sigIndices.every((idx) => idx >= 0)) {
178
+ return this.createAddressMapForUtxo(utxo, utxoThreshold, sigIndices);
179
+ }
180
+ return this.createAddressMapForUtxo(utxo, utxoThreshold);
181
+ });
182
+ const unsignedTx = new flarejs_1.UnsignedTx(delegatorTx, [], new flarejs_1.utils.AddressMaps(addressMaps), txCredentials);
152
183
  this.transaction.setTransaction(unsignedTx);
153
184
  return this;
154
185
  }
@@ -159,6 +190,33 @@ class PermissionlessDelegatorTxBuilder extends transactionBuilder_1.TransactionB
159
190
  verifyTxType(type) {
160
191
  return PermissionlessDelegatorTxBuilder.verifyTxType(type);
161
192
  }
193
+ /**
194
+ * Recover UTXOs from transaction inputs.
195
+ * Uses fromAddresses as proxy for UTXO addresses since we're reconstructing from a parsed transaction.
196
+ *
197
+ * @param inputs Array of TransferableInput from baseTx
198
+ * @param fromAddresses Wallet addresses to use as proxy for UTXO addresses
199
+ * @returns Array of decoded UTXO objects
200
+ * @private
201
+ */
202
+ recoverUtxosFromInputs(inputs, fromAddresses) {
203
+ const proxyAddresses = fromAddresses.map((addr) => utils_1.default.addressToString(this.transaction._network.hrp, this.transaction._network.alias, Buffer.from(addr)));
204
+ return inputs.map((input) => {
205
+ const utxoId = input.utxoID;
206
+ const transferInput = input.input;
207
+ const sigIndicies = transferInput.sigIndicies();
208
+ const utxo = {
209
+ outputID: 7, // SECP256K1 Transfer Output type
210
+ amount: input.amount().toString(),
211
+ txid: utils_1.default.cb58Encode(Buffer.from(utxoId.txID.toBytes())),
212
+ outputidx: utxoId.outputIdx.value().toString(),
213
+ threshold: sigIndicies.length || this.transaction._threshold,
214
+ addresses: proxyAddresses,
215
+ addressesIndex: sigIndicies,
216
+ };
217
+ return utxo;
218
+ });
219
+ }
162
220
  async buildImplementation() {
163
221
  this.buildFlareTransaction();
164
222
  this.transaction.setTransactionType(this.transactionType);
@@ -170,18 +228,22 @@ class PermissionlessDelegatorTxBuilder extends transactionBuilder_1.TransactionB
170
228
  return this.transaction;
171
229
  }
172
230
  /**
173
- * Get the user's address (index 0) for delegation.
231
+ * Get the user's address (index 0) for default reward address.
232
+ *
233
+ * BitGo Convention for fromAddresses:
234
+ * - Index 0: User key (signer in normal mode)
235
+ * - Index 1: BitGo key (always a signer)
236
+ * - Index 2: Backup key (signer in recovery mode)
174
237
  *
175
- * For delegation transactions, we use only the user key because:
176
- * 1. On-chain rewards go to the C-chain address derived from the delegator's public key
177
- * 2. Using the user key ensures rewards go to the user's corresponding C-chain address
178
- * 3. The user key is at index 0 in the fromAddresses array (BitGo convention: [user, bitgo, backup])
238
+ * For delegation transactions, the user's address at index 0 is used as the default
239
+ * reward address parameter (though the parameter has no on-chain effect - rewards
240
+ * go to C-chain addresses derived from the P-chain addresses in stake outputs).
179
241
  *
180
242
  * @returns Buffer containing the user's address
181
243
  * @protected
182
244
  */
183
245
  getUserAddress() {
184
- const userIndex = 0;
246
+ const userIndex = 0; // BitGo convention: user is always at index 0
185
247
  if (!this.transaction._fromAddresses || this.transaction._fromAddresses.length <= userIndex) {
186
248
  throw new sdk_core_1.BuildTransactionError('User address (index 0) is required for delegation');
187
249
  }
@@ -196,8 +258,9 @@ class PermissionlessDelegatorTxBuilder extends transactionBuilder_1.TransactionB
196
258
  * Uses pvm.e.newAddPermissionlessDelegatorTx (post-Etna API).
197
259
  *
198
260
  * Note: The rewardAddresses parameter is accepted by the API but does NOT affect
199
- * where rewards are sent on-chain - rewards always go to the C-chain address
200
- * derived from the delegator's public key (user key at index 0).
261
+ * where rewards are sent on-chain. Rewards accrue to C-chain addresses derived
262
+ * from the P-chain addresses in the stake outputs. The stake outputs contain the
263
+ * addresses from fromAddressesBytes (sorted to match UTXO owner order).
201
264
  * @protected
202
265
  */
203
266
  buildFlareTransaction() {
@@ -226,20 +289,26 @@ class PermissionlessDelegatorTxBuilder extends transactionBuilder_1.TransactionB
226
289
  throw new sdk_core_1.BuildTransactionError('Fee state is required for delegation');
227
290
  }
228
291
  this.validateStakeDuration(this._startTime, this._endTime);
292
+ // Compute addressesIndex to map wallet key indices to sorted UTXO address positions
293
+ this.computeAddressesIndex();
229
294
  // Convert decoded UTXOs to FlareJS Utxo objects
230
295
  if (!this.transaction._utxos || this.transaction._utxos.length === 0) {
231
296
  throw new sdk_core_1.BuildTransactionError('UTXOs are required for delegation');
232
297
  }
233
298
  const utxos = utils_1.default.decodedToUtxos(this.transaction._utxos, this.transaction._network.assetId);
234
- // Use only the user key (index 0) for fromAddressesBytes
235
- // This ensures the C-chain reward address is derived from the user's public key
299
+ // Get user address for default reward address derivation
236
300
  const userAddress = this.getUserAddress();
237
301
  const rewardAddresses = this.transaction._rewardAddresses.length > 0 ? this.transaction._rewardAddresses : [userAddress];
238
302
  // Use Etna (post-fork) API - pvm.e.newAddPermissionlessDelegatorTx
303
+ // IMPORTANT: Use getSigningAddresses() to get the correct 2 signing keys
304
+ // This ensures proper key selection for both normal and recovery modes:
305
+ // - Normal mode: user (index 0) + bitgo (index 1)
306
+ // - Recovery mode: backup (index 2) + bitgo (index 1)
307
+ const signingAddresses = this.getSigningAddresses();
239
308
  const delegatorTx = flarejs_1.pvm.e.newAddPermissionlessDelegatorTx({
240
309
  end: this._endTime,
241
310
  feeState: this._feeState,
242
- fromAddressesBytes: [userAddress],
311
+ fromAddressesBytes: signingAddresses,
243
312
  nodeId: this._nodeID,
244
313
  rewardAddresses: rewardAddresses,
245
314
  start: this._startTime,
@@ -247,7 +316,72 @@ class PermissionlessDelegatorTxBuilder extends transactionBuilder_1.TransactionB
247
316
  utxos,
248
317
  weight: this._stakeAmount,
249
318
  }, this.transaction._context);
250
- this.transaction.setTransaction(delegatorTx);
319
+ // Fix change output threshold bug (same as ExportInPTxBuilder)
320
+ const flareUnsignedTx = delegatorTx;
321
+ const innerTx = flareUnsignedTx.getTx();
322
+ const changeOutputs = innerTx.baseTx.outputs;
323
+ let correctedDelegatorTx = innerTx;
324
+ if (changeOutputs.length > 0 && this.transaction._threshold > 1) {
325
+ // Only apply fix for multisig wallets (threshold > 1)
326
+ const allWalletAddresses = this.transaction._fromAddresses.map((addr) => Buffer.from(addr));
327
+ const correctedChangeOutputs = changeOutputs.map((output) => {
328
+ const transferOut = output.output;
329
+ const assetIdStr = utils_1.default.flareIdString(Buffer.from(output.assetId.toBytes()).toString('hex')).toString();
330
+ return flarejs_1.TransferableOutput.fromNative(assetIdStr, transferOut.amount(), allWalletAddresses, this.transaction._locktime, this.transaction._threshold // Fix: use wallet's threshold instead of FlareJS's default (1)
331
+ );
332
+ });
333
+ correctedDelegatorTx = this.createCorrectedDelegatorTx(innerTx, correctedChangeOutputs);
334
+ }
335
+ // Recreate credentials and addressMaps from corrected transaction inputs
336
+ // This follows the same pattern as ExportInPTxBuilder to ensure proper signing
337
+ const utxosWithIndex = correctedDelegatorTx.baseTx.inputs.map((input) => {
338
+ const inputTxid = utils_1.default.cb58Encode(Buffer.from(input.utxoID.txID.toBytes()));
339
+ const inputOutputIdx = input.utxoID.outputIdx.value().toString();
340
+ const originalUtxo = this.transaction._utxos.find((utxo) => utxo.txid === inputTxid && utxo.outputidx === inputOutputIdx);
341
+ if (!originalUtxo) {
342
+ throw new sdk_core_1.BuildTransactionError(`Could not find matching UTXO for input ${inputTxid}:${inputOutputIdx}`);
343
+ }
344
+ const transferInput = input.input;
345
+ const actualSigIndices = transferInput.sigIndicies();
346
+ return {
347
+ ...originalUtxo,
348
+ addressesIndex: originalUtxo.addressesIndex,
349
+ addresses: originalUtxo.addresses,
350
+ threshold: originalUtxo.threshold || this.transaction._threshold,
351
+ actualSigIndices,
352
+ };
353
+ });
354
+ this.transaction._utxos = utxosWithIndex;
355
+ const txCredentials = utxosWithIndex.map((utxo) => this.createCredentialForUtxo(utxo, utxo.threshold, utxo.actualSigIndices));
356
+ const addressMaps = utxosWithIndex.map((utxo) => this.createAddressMapForUtxo(utxo, utxo.threshold, utxo.actualSigIndices));
357
+ // Create new UnsignedTx with corrected change outputs and proper credentials
358
+ const fixedUnsignedTx = new flarejs_1.UnsignedTx(correctedDelegatorTx, [], new flarejs_1.utils.AddressMaps(addressMaps), txCredentials);
359
+ this.transaction.setTransaction(fixedUnsignedTx);
360
+ }
361
+ /**
362
+ * Create a corrected AddPermissionlessDelegatorTx with the given change outputs.
363
+ * This is necessary because FlareJS's newAddPermissionlessDelegatorTx doesn't support setting
364
+ * the threshold and locktime for change outputs - it defaults to threshold=1.
365
+ *
366
+ * FlareJS declares baseTx.outputs as readonly, so we use Object.defineProperty
367
+ * to override the property with the corrected outputs. This is a workaround until
368
+ * FlareJS adds proper support for change output thresholds.
369
+ *
370
+ * @param originalTx - The original AddPermissionlessDelegatorTx
371
+ * @param correctedOutputs - The corrected change outputs with proper threshold
372
+ * @returns A new AddPermissionlessDelegatorTx with the corrected change outputs
373
+ */
374
+ createCorrectedDelegatorTx(originalTx, correctedOutputs) {
375
+ // FlareJS declares baseTx.outputs as `public readonly outputs: readonly TransferableOutput[]`
376
+ // We use Object.defineProperty to override the readonly property with our corrected outputs.
377
+ // This is necessary because FlareJS's newAddPermissionlessDelegatorTx doesn't support change output threshold/locktime.
378
+ Object.defineProperty(originalTx.baseTx, 'outputs', {
379
+ value: correctedOutputs,
380
+ writable: false,
381
+ enumerable: true,
382
+ configurable: true,
383
+ });
384
+ return originalTx;
251
385
  }
252
386
  /**
253
387
  * Verify if the transaction type matches AddPermissionlessDelegatorTx
@@ -265,4 +399,4 @@ class PermissionlessDelegatorTxBuilder extends transactionBuilder_1.TransactionB
265
399
  }
266
400
  }
267
401
  exports.PermissionlessDelegatorTxBuilder = PermissionlessDelegatorTxBuilder;
268
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbmxlc3NEZWxlZ2F0b3JUeEJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3Blcm1pc3Npb25sZXNzRGVsZWdhdG9yVHhCdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLG1EQVMrQjtBQUMvQiw4Q0FBdUY7QUFHdkYsNkRBQTBEO0FBQzFELG9EQUE0QjtBQUk1Qjs7Ozs7Ozs7R0FRRztBQUNILE1BQWEsZ0NBQWlDLFNBQVEsdUNBQWtCO0lBT3RFLFlBQVksVUFBZ0M7UUFDMUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2xCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7SUFDOUQsQ0FBQztJQUVELElBQWMsZUFBZTtRQUMzQixPQUFPLDBCQUFlLENBQUMsMEJBQTBCLENBQUM7SUFDcEQsQ0FBQztJQUVELHFCQUFxQjtJQUNyQixjQUFjLENBQUMsTUFBYztRQUMzQixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWixNQUFNLElBQUksZ0NBQXFCLENBQUMscUNBQXFDLENBQUMsQ0FBQztRQUN6RSxDQUFDO1FBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUNsQyxNQUFNLElBQUksZ0NBQXFCLENBQUMseUNBQXlDLENBQUMsQ0FBQztRQUM3RSxDQUFDO1FBQ0QsSUFBSSxDQUFDLGVBQUssQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUNqQyxNQUFNLElBQUksZ0NBQXFCLENBQUMsbURBQW1ELENBQUMsQ0FBQztRQUN2RixDQUFDO0lBQ0gsQ0FBQztJQUVELHFCQUFxQixDQUFDLFNBQWlCLEVBQUUsT0FBZTtRQUN0RCxJQUFJLE9BQU8sR0FBRyxTQUFTLEVBQUUsQ0FBQztZQUN4QixN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SUFBSSxDQUFDLFNBQVM7WUFDeEIsa0JBQWtCLEVBQUUsQ0FBQyxXQUFXLENBQUM7WUFDakMsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQ3BCLGVBQWUsRUFBRSxlQUFlO1lBQ2hDLEtBQUssRUFBRSxJQUFJLENBQUMsVUFBVTtZQUN0QixRQUFRLEVBQUUsb0JBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUU7WUFDaEQsS0FBSztZQUNMLE1BQU0sRUFBRSxJQUFJLENBQUMsWUFBWTtTQUMxQixFQUNELElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUMxQixDQUFDO1FBRUYsSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsV0FBeUIsQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFRDs7O09BR0c7SUFDSCxNQUFNLENBQUMsWUFBWSxDQUFDLElBQWlCO1FBQ25DLE9BQU8sSUFBSSxLQUFLLHFCQUFXLENBQUMsNEJBQTRCLENBQUM7SUFDM0QsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixJQUFjLFdBQVc7UUFDdkIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzNCLENBQUM7SUFFRCxJQUFjLFdBQVcsQ0FBQyxXQUF3QjtRQUNoRCxJQUFJLENBQUMsWUFBWSxHQUFHLFdBQVcsQ0FBQztJQUNsQyxDQUFDO0NBQ0Y7QUFwU0QsNEVBb1NDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgdXRpbHMgYXMgRmxhcmVVdGlscyxcbiAgVHlwZVN5bWJvbHMsXG4gIHB2bSxcbiAgbmV0d29ya0lEcyxcbiAgVW5zaWduZWRUeCxcbiAgcHZtU2VyaWFsLFxuICBDcmVkZW50aWFsLFxuICBUcmFuc2Zlck91dHB1dCxcbn0gZnJvbSAnQGZsYXJlbmV0d29yay9mbGFyZWpzJztcbmltcG9ydCB7IEJ1aWxkVHJhbnNhY3Rpb25FcnJvciwgTm90U3VwcG9ydGVkLCBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgQmFzZUNvaW4gYXMgQ29pbkNvbmZpZyB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uIH0gZnJvbSAnLi90cmFuc2FjdGlvbic7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkJ1aWxkZXIgfSBmcm9tICcuL3RyYW5zYWN0aW9uQnVpbGRlcic7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBGbHJwRmVlU3RhdGUgfSBmcm9tICdAYml0Z28vcHVibGljLXR5cGVzJztcbmltcG9ydCB7IFR4IH0gZnJvbSAnLi9pZmFjZSc7XG5cbi8qKlxuICogQnVpbGRlciBmb3IgQWRkUGVybWlzc2lvbmxlc3NEZWxlZ2F0b3IgdHJhbnNhY3Rpb25zIG9uIEZsYXJlIFAtQ2hhaW4uXG4gKlxuICogVGhpcyBidWlsZGVyIGNyZWF0ZXMgZGVsZWdhdGlvbiB0cmFuc2FjdGlvbnMgd2hlcmUgYSB1c2VyIGRlbGVnYXRlcyBzdGFrZVxuICogdG8gYW4gZXhpc3RpbmcgdmFsaWRhdG9yLiBVbmxpa2UgQWRkUGVybWlzc2lvbmxlc3NWYWxpZGF0b3I6XG4gKiAtIE5vIEJMUyBrZXlzIHJlcXVpcmVkXG4gKiAtIERlbGVnYXRlcyB0byBhbiBleGlzdGluZyB2YWxpZGF0b3IncyBub2RlSURcbiAqIC0gUmV3YXJkcyBnbyB0byBjb3JyZXNwb25kaW5nIEMtY2hhaW4gYWRkcmVzc1xuICovXG5leHBvcnQgY2xhc3MgUGVybWlzc2lvbmxlc3NEZWxlZ2F0b3JUeEJ1aWxkZXIgZXh0ZW5kcyBUcmFuc2FjdGlvbkJ1aWxkZXIge1xuICBwcm90ZWN0ZWQgX25vZGVJRDogc3RyaW5nO1xuICBwcm90ZWN0ZWQgX3N0YXJ0VGltZTogYmlnaW50O1xuICBwcm90ZWN0ZWQgX2VuZFRpbWU6IGJpZ2ludDtcbiAgcHJvdGVjdGVkIF9zdGFrZUFtb3VudDogYmlnaW50O1xuICBwcm90ZWN0ZWQgX2ZlZVN0YXRlOiBGbHJwRmVlU3RhdGUgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoY29pbkNvbmZpZzogUmVhZG9ubHk8Q29pbkNvbmZpZz4pIHtcbiAgICBzdXBlcihjb2luQ29uZmlnKTtcbiAgICB0aGlzLnRyYW5zYWN0aW9uLl9mZWUuZmVlID0gdGhpcy50cmFuc2FjdGlvbi5fbmV0d29yay50eEZlZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgdHJhbnNhY3Rpb25UeXBlKCk6IFRyYW5zYWN0aW9uVHlwZSB7XG4gICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5BZGRQZXJtaXNzaW9ubGVzc0RlbGVnYXRvcjtcbiAgfVxuXG4gIC8vIFZhbGlkYXRpb24gbWV0aG9kc1xuICB2YWxpZGF0ZU5vZGVJRChub2RlSUQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghbm9kZUlEKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdJbnZhbGlkIHRyYW5zYWN0aW9uOiBtaXNzaW5nIG5vZGVJRCcpO1xuICAgIH1cbiAgICBpZiAoIW5vZGVJRC5zdGFydHNXaXRoKCdOb2RlSUQtJykpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgdHJhbnNhY3Rpb246IGludmFsaWQgTm9kZUlEIHRhZycpO1xuICAgIH1cbiAgICBpZiAoIXV0aWxzLmlzVmFsaWROb2RlSUQobm9kZUlEKSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCB0cmFuc2FjdGlvbjogTm9kZUlEIGlzIG5vdCBpbiBjYjU4IGZvcm1hdCcpO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlU3Rha2VEdXJhdGlvbihzdGFydFRpbWU6IGJpZ2ludCwgZW5kVGltZTogYmlnaW50KTogdm9pZCB7XG4gICAgaWYgKGVuZFRpbWUgPCBzdGFydFRpbWUpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0VuZCBkYXRlIGNhbm5vdCBiZSBsZXNzIHRoYW4gc3RhcnQgZGF0ZScpO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlU3Rha2VBbW91bnQoYW1vdW50OiBiaWdpbnQpOiB2b2lkIHtcbiAgICBjb25zdCBtaW5EZWxlZ2F0aW9uU3Rha2UgPSBCaWdJbnQoXG4gICAgICB0aGlzLnRyYW5zYWN0aW9uLl9uZXR3b3JrLm1pbkRlbGVnYXRpb25TdGFrZSB8fCB0aGlzLnRyYW5zYWN0aW9uLl9uZXR3b3JrLm1pblN0YWtlXG4gICAgKTtcbiAgICBpZiAoYW1vdW50IDwgbWluRGVsZWdhdGlvblN0YWtlKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgICAnTWluaW11bSBkZWxlZ2F0aW9uIGFtb3VudCBpcyAnICsgTnVtYmVyKG1pbkRlbGVnYXRpb25TdGFrZSkgLyAxMDAwMDAwMDAwICsgJyBGTFIuJ1xuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvLyBCdWlsZGVyIG1ldGhvZHNcbiAgLyoqXG4gICAqXG4gICAqIE5PVEU6IE9uIEZsYXJlLCBzdGFraW5nIHJld2FyZHMgYXJlIGRpc3RyaWJ1dGVkIG9uIEMtY2hhaW4gKG5vdCBQLWNoYWluKS5cbiAgICogUmV3YXJkcyBnbyB0byB0aGUgQy1jaGFpbiBhZGRyZXNzIGRlcml2ZWQgZnJvbSB0aGUgc2FtZSBwdWJsaWMga2V5IGFzXG4gICAqIHRoZSBQLWNoYWluIHN0YWtpbmcgYWRkcmVzcy4gVGhpcyBwYXJhbWV0ZXIgaXMgcGFzc2VkIHRvIHRoZSBGbGFyZUpTIEFQSVxuICAgKiBidXQgaGFzIE5PIG9uLWNoYWluIGVmZmVjdCBvbiByZXdhcmQgZGlzdHJpYnV0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gYWRkcmVzcyBQLWNoYWluIGFkZHJlc3MgaW4gQmVjaDMyIGZvcm1hdCAoZS5nLiwgXCJQLWZsYXJlMS4uLlwiIG9yIFwiUC1jb3N0d28xLi4uXCIpXG4gICAqL1xuICByZXdhcmRBZGRyZXNzKGFkZHJlc3M6IHN0cmluZyk6IHRoaXMge1xuICAgIHRoaXMudHJhbnNhY3Rpb24uX3Jld2FyZEFkZHJlc3NlcyA9IFt1dGlscy5wYXJzZUFkZHJlc3MoYWRkcmVzcyldO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgdmFsaWRhdG9yIG5vZGUgSUQgdG8gZGVsZWdhdGUgdG9cbiAgICogQHBhcmFtIG5vZGVJRCBWYWxpZGF0b3Igbm9kZSBJRCBpbiBmb3JtYXQgXCJOb2RlSUQtLi4uXCJcbiAgICovXG4gIG5vZGVJRChub2RlSUQ6IHN0cmluZyk6IHRoaXMge1xuICAgIHRoaXMudmFsaWRhdGVOb2RlSUQobm9kZUlEKTtcbiAgICB0aGlzLl9ub2RlSUQgPSBub2RlSUQ7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBzdGFydCB0aW1lIGZvciB0aGUgZGVsZWdhdGlvbiBwZXJpb2RcbiAgICogQHBhcmFtIHZhbHVlIFVuaXggdGltZXN0YW1wIGluIHNlY29uZHNcbiAgICovXG4gIHN0YXJ0VGltZSh2YWx1ZTogc3RyaW5nIHwgbnVtYmVyKTogdGhpcyB7XG4gICAgdGhpcy5fc3RhcnRUaW1lID0gQmlnSW50KHZhbHVlKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGVuZCB0aW1lIGZvciB0aGUgZGVsZWdhdGlvbiBwZXJpb2RcbiAgICogQHBhcmFtIHZhbHVlIFVuaXggdGltZXN0YW1wIGluIHNlY29uZHNcbiAgICovXG4gIGVuZFRpbWUodmFsdWU6IHN0cmluZyB8IG51bWJlcik6IHRoaXMge1xuICAgIHRoaXMuX2VuZFRpbWUgPSBCaWdJbnQodmFsdWUpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgYW1vdW50IHRvIHN0YWtlL2RlbGVnYXRlXG4gICAqIEBwYXJhbSB2YWx1ZSBBbW91bnQgaW4gbmFub0ZMUiAod2VpKVxuICAgKi9cbiAgc3Rha2VBbW91bnQodmFsdWU6IGJpZ2ludCB8IHN0cmluZyk6IHRoaXMge1xuICAgIGNvbnN0IHZhbHVlQmlnSW50ID0gdHlwZW9mIHZhbHVlID09PSAnYmlnaW50JyA/IHZhbHVlIDogQmlnSW50KHZhbHVlKTtcbiAgICB0aGlzLnZhbGlkYXRlU3Rha2VBbW91bnQodmFsdWVCaWdJbnQpO1xuICAgIHRoaXMuX3N0YWtlQW1vdW50ID0gdmFsdWVCaWdJbnQ7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIGZlZVN0YXRlIEZlZSBzdGF0ZSBmcm9tIFAtY2hhaW5cbiAgICovXG4gIGZlZVN0YXRlKGZlZVN0YXRlOiBGbHJwRmVlU3RhdGUpOiB0aGlzIHtcbiAgICB0aGlzLl9mZWVTdGF0ZSA9IGZlZVN0YXRlO1xuICAgIHRoaXMudHJhbnNhY3Rpb24uX2ZlZVN0YXRlID0gZmVlU3RhdGU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSBidWlsZGVyIGZyb20gYSBwYXJzZWQgQWRkUGVybWlzc2lvbmxlc3NEZWxlZ2F0b3JUeC5cbiAgICogVXNlZCB0byByZWNvbnN0cnVjdCB0aGUgYnVpbGRlciBzdGF0ZSBmcm9tIGEgcmF3IHRyYW5zYWN0aW9uIGZvciBzaWduaW5nLlxuICAgKlxuICAgKiBAcGFyYW0gdHggVGhlIHBhcnNlZCB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0gcmF3Qnl0ZXMgT3B0aW9uYWwgcmF3IHRyYW5zYWN0aW9uIGJ5dGVzXG4gICAqIEBwYXJhbSBwYXJzZWRDcmVkZW50aWFscyBPcHRpb25hbCBjcmVkZW50aWFscyBmcm9tIHRoZSBwYXJzZWQgdHJhbnNhY3Rpb25cbiAgICovXG4gIGluaXRCdWlsZGVyKHR4OiBUeCwgcmF3Qnl0ZXM/OiBCdWZmZXIsIHBhcnNlZENyZWRlbnRpYWxzPzogQ3JlZGVudGlhbFtdKTogdGhpcyB7XG4gICAgY29uc3QgZGVsZWdhdG9yVHggPSB0eCBhcyBwdm1TZXJpYWwuQWRkUGVybWlzc2lvbmxlc3NEZWxlZ2F0b3JUeDtcblxuICAgIGlmICghdGhpcy52ZXJpZnlUeFR5cGUoZGVsZWdhdG9yVHguX3R5cGUpKSB7XG4gICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKCdUcmFuc2FjdGlvbiBjYW5ub3QgYmUgcGFyc2VkIG9yIGhhcyBhbiB1bnN1cHBvcnRlZCB0cmFuc2FjdGlvbiB0eXBlJyk7XG4gICAgfVxuXG4gICAgLy8gRXh0cmFjdCB2YWxpZGF0b3IgaW5mbyAobm9kZUlELCBzdGFydFRpbWUsIGVuZFRpbWUsIHdlaWdodC9zdGFrZUFtb3VudClcbiAgICBjb25zdCB2YWxpZGF0b3IgPSBkZWxlZ2F0b3JUeC5zdWJuZXRWYWxpZGF0b3IudmFsaWRhdG9yO1xuICAgIHRoaXMuX25vZGVJRCA9IHZhbGlkYXRvci5ub2RlSWQudG9TdHJpbmcoKTtcbiAgICB0aGlzLl9zdGFydFRpbWUgPSB2YWxpZGF0b3Iuc3RhcnRUaW1lLnZhbHVlKCk7XG4gICAgdGhpcy5fZW5kVGltZSA9IHZhbGlkYXRvci5lbmRUaW1lLnZhbHVlKCk7XG4gICAgdGhpcy5fc3Rha2VBbW91bnQgPSB2YWxpZGF0b3Iud2VpZ2h0LnZhbHVlKCk7XG5cbiAgICAvLyBFeHRyYWN0IGZyb20gYWRkcmVzc2VzIGZyb20gc3Rha2Ugb3V0cHV0c1xuICAgIC8vIEluIGRlbGVnYXRpb24gdHJhbnNhY3Rpb25zLCBzdGFrZSBvdXRwdXRzIGNvbnRhaW4gdGhlIG93bmVyIGFkZHJlc3Nlc1xuICAgIGNvbnN0IHN0YWtlT3V0cHV0cyA9IGRlbGVnYXRvclR4LnN0YWtlO1xuICAgIGlmIChzdGFrZU91dHB1dHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZmlyc3RTdGFrZU91dHB1dCA9IHN0YWtlT3V0cHV0c1swXTtcbiAgICAgIC8vIFN0YWtlIG91dHB1dHMgdXNlIFRyYW5zZmVyT3V0cHV0IHR5cGUgd2l0aCBvdXRwdXRPd25lcnMgcHJvcGVydHlcbiAgICAgIGNvbnN0IHRyYW5zZmVyT3V0cHV0ID0gZmlyc3RTdGFrZU91dHB1dC5vdXRwdXQgYXMgVHJhbnNmZXJPdXRwdXQ7XG4gICAgICBjb25zdCBvdXRwdXRPd25lcnMgPSB0cmFuc2Zlck91dHB1dC5vdXRwdXRPd25lcnM7XG4gICAgICBpZiAob3V0cHV0T3duZXJzKSB7XG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb24uX3RocmVzaG9sZCA9IG91dHB1dE93bmVycy50aHJlc2hvbGQudmFsdWUoKTtcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbi5fZnJvbUFkZHJlc3NlcyA9IG91dHB1dE93bmVycy5hZGRycy5tYXAoKGFkZHIpID0+IEJ1ZmZlci5mcm9tKGFkZHIudG9CeXRlcygpKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRXh0cmFjdCByZXdhcmQgYWRkcmVzc2VzIGZyb20gZGVsZWdhdG9yUmV3YXJkc093bmVyXG4gICAgY29uc3QgcmV3YXJkc093bmVyID0gZGVsZWdhdG9yVHguZ2V0RGVsZWdhdG9yUmV3YXJkc093bmVyKCk7XG4gICAgaWYgKHJld2FyZHNPd25lciAmJiByZXdhcmRzT3duZXIuYWRkcnMgJiYgcmV3YXJkc093bmVyLmFkZHJzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMudHJhbnNhY3Rpb24uX3Jld2FyZEFkZHJlc3NlcyA9IHJld2FyZHNPd25lci5hZGRycy5tYXAoKGFkZHIpID0+IEJ1ZmZlci5mcm9tKGFkZHIudG9CeXRlcygpKSk7XG4gICAgfVxuXG4gICAgY29uc3QgY3JlZGVudGlhbHMgPSBwYXJzZWRDcmVkZW50aWFscyB8fCBbXTtcblxuICAgIGlmIChyYXdCeXRlcyAmJiBjcmVkZW50aWFscy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnRyYW5zYWN0aW9uLl9yYXdTaWduZWRCeXRlcyA9IHJhd0J5dGVzO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSB0aGUgVW5zaWduZWRUeCB3aXRoIHBhcnNlZCBjcmVkZW50aWFsc1xuICAgIC8vIEFkZHJlc3NNYXBzIHdpbGwgYmUgZW1wdHkgYXMgdGhleSdyZSBjb21wdXRlZCBkdXJpbmcgc2lnbmluZ1xuICAgIGNvbnN0IHVuc2lnbmVkVHggPSBuZXcgVW5zaWduZWRUeChkZWxlZ2F0b3JUeCwgW10sIG5ldyBGbGFyZVV0aWxzLkFkZHJlc3NNYXBzKFtdKSwgY3JlZGVudGlhbHMpO1xuXG4gICAgdGhpcy50cmFuc2FjdGlvbi5zZXRUcmFuc2FjdGlvbih1bnNpZ25lZFR4KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnN0YW5jZSBtZXRob2QgdG8gdmVyaWZ5IHRyYW5zYWN0aW9uIHR5cGVcbiAgICogQHBhcmFtIHR5cGUgVHlwZVN5bWJvbCBmcm9tIHBhcnNlZCB0cmFuc2FjdGlvblxuICAgKi9cbiAgdmVyaWZ5VHhUeXBlKHR5cGU6IFR5cGVTeW1ib2xzKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIFBlcm1pc3Npb25sZXNzRGVsZWdhdG9yVHhCdWlsZGVyLnZlcmlmeVR4VHlwZSh0eXBlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBidWlsZEltcGxlbWVudGF0aW9uKCk6IFByb21pc2U8VHJhbnNhY3Rpb24+IHtcbiAgICB0aGlzLmJ1aWxkRmxhcmVUcmFuc2FjdGlvbigpO1xuICAgIHRoaXMudHJhbnNhY3Rpb24uc2V0VHJhbnNhY3Rpb25UeXBlKHRoaXMudHJhbnNhY3Rpb25UeXBlKTtcbiAgICBpZiAodGhpcy5oYXNTaWduZXIoKSkge1xuICAgICAgZm9yIChjb25zdCBrZXlQYWlyIG9mIHRoaXMuX3NpZ25lcikge1xuICAgICAgICBhd2FpdCB0aGlzLnRyYW5zYWN0aW9uLnNpZ24oa2V5UGFpcik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgdXNlcidzIGFkZHJlc3MgKGluZGV4IDApIGZvciBkZWxlZ2F0aW9uLlxuICAgKlxuICAgKiBGb3IgZGVsZWdhdGlvbiB0cmFuc2FjdGlvbnMsIHdlIHVzZSBvbmx5IHRoZSB1c2VyIGtleSBiZWNhdXNlOlxuICAgKiAxLiBPbi1jaGFpbiByZXdhcmRzIGdvIHRvIHRoZSBDLWNoYWluIGFkZHJlc3MgZGVyaXZlZCBmcm9tIHRoZSBkZWxlZ2F0b3IncyBwdWJsaWMga2V5XG4gICAqIDIuIFVzaW5nIHRoZSB1c2VyIGtleSBlbnN1cmVzIHJld2FyZHMgZ28gdG8gdGhlIHVzZXIncyBjb3JyZXNwb25kaW5nIEMtY2hhaW4gYWRkcmVzc1xuICAgKiAzLiBUaGUgdXNlciBrZXkgaXMgYXQgaW5kZXggMCBpbiB0aGUgZnJvbUFkZHJlc3NlcyBhcnJheSAoQml0R28gY29udmVudGlvbjogW3VzZXIsIGJpdGdvLCBiYWNrdXBdKVxuICAgKlxuICAgKiBAcmV0dXJucyBCdWZmZXIgY29udGFpbmluZyB0aGUgdXNlcidzIGFkZHJlc3NcbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgcHJvdGVjdGVkIGdldFVzZXJBZGRyZXNzKCk6IEJ1ZmZlciB7XG4gICAgY29uc3QgdXNlckluZGV4ID0gMDtcbiAgICBpZiAoIXRoaXMudHJhbnNhY3Rpb24uX2Zyb21BZGRyZXNzZXMgfHwgdGhpcy50cmFuc2FjdGlvbi5fZnJvbUFkZHJlc3Nlcy5sZW5ndGggPD0gdXNlckluZGV4KSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdVc2VyIGFkZHJlc3MgKGluZGV4IDApIGlzIHJlcXVpcmVkIGZvciBkZWxlZ2F0aW9uJyk7XG4gICAgfVxuICAgIGNvbnN0IHVzZXJBZGRyZXNzID0gQnVmZmVyLmZyb20odGhpcy50cmFuc2FjdGlvbi5fZnJvbUFkZHJlc3Nlc1t1c2VySW5kZXhdKTtcbiAgICBpZiAodXNlckFkZHJlc3MubGVuZ3RoICE9PSAyMCkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihgSW52YWxpZCB1c2VyIGFkZHJlc3MgbGVuZ3RoOiBleHBlY3RlZCAyMCBieXRlcywgZ290ICR7dXNlckFkZHJlc3MubGVuZ3RofWApO1xuICAgIH1cbiAgICByZXR1cm4gdXNlckFkZHJlc3M7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgdGhlIHBlcm1pc3Npb25sZXNzIGRlbGVnYXRvciB0cmFuc2FjdGlvbiB1c2luZyBGbGFyZUpTLlxuICAgKiBVc2VzIHB2bS5lLm5ld0FkZFBlcm1pc3Npb25sZXNzRGVsZWdhdG9yVHggKHBvc3QtRXRuYSBBUEkpLlxuICAgKlxuICAgKiBOb3RlOiBUaGUgcmV3YXJkQWRkcmVzc2VzIHBhcmFtZXRlciBpcyBhY2NlcHRlZCBieSB0aGUgQVBJIGJ1dCBkb2VzIE5PVCBhZmZlY3RcbiAgICogd2hlcmUgcmV3YXJkcyBhcmUgc2VudCBvbi1jaGFpbiAtIHJld2FyZHMgYWx3YXlzIGdvIHRvIHRoZSBDLWNoYWluIGFkZHJlc3NcbiAgICogZGVyaXZlZCBmcm9tIHRoZSBkZWxlZ2F0b3IncyBwdWJsaWMga2V5ICh1c2VyIGtleSBhdCBpbmRleCAwKS5cbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgcHJvdGVjdGVkIGJ1aWxkRmxhcmVUcmFuc2FjdGlvbigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy50cmFuc2FjdGlvbi5oYXNDcmVkZW50aWFscykgcmV0dXJuO1xuXG4gICAgLy8gVmFsaWRhdGUgcmVxdWlyZWQgZmllbGRzXG4gICAgaWYgKCF0aGlzLl9ub2RlSUQpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ05vZGVJRCBpcyByZXF1aXJlZCBmb3IgZGVsZWdhdGlvbicpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuX3N0YXJ0VGltZSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignU3RhcnQgdGltZSBpcyByZXF1aXJlZCBmb3IgZGVsZWdhdGlvbicpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuX2VuZFRpbWUpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0VuZCB0aW1lIGlzIHJlcXVpcmVkIGZvciBkZWxlZ2F0aW9uJyk7XG4gICAgfVxuICAgIGlmICghdGhpcy5fc3Rha2VBbW91bnQpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ1N0YWtlIGFtb3VudCBpcyByZXF1aXJlZCBmb3IgZGVsZWdhdGlvbicpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMudHJhbnNhY3Rpb24uX2NvbnRleHQpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0NvbnRleHQgaXMgcmVxdWlyZWQgZm9yIGRlbGVnYXRpb24nKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnRyYW5zYWN0aW9uLl9mcm9tQWRkcmVzc2VzIHx8IHRoaXMudHJhbnNhY3Rpb24uX2Zyb21BZGRyZXNzZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdGcm9tIGFkZHJlc3NlcyBhcmUgcmVxdWlyZWQgZm9yIGRlbGVnYXRpb24nKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLl9mZWVTdGF0ZSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignRmVlIHN0YXRlIGlzIHJlcXVpcmVkIGZvciBkZWxlZ2F0aW9uJyk7XG4gICAgfVxuXG4gICAgdGhpcy52YWxpZGF0ZVN0YWtlRHVyYXRpb24odGhpcy5fc3RhcnRUaW1lLCB0aGlzLl9lbmRUaW1lKTtcblxuICAgIC8vIENvbnZlcnQgZGVjb2RlZCBVVFhPcyB0byBGbGFyZUpTIFV0eG8gb2JqZWN0c1xuICAgIGlmICghdGhpcy50cmFuc2FjdGlvbi5fdXR4b3MgfHwgdGhpcy50cmFuc2FjdGlvbi5fdXR4b3MubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdVVFhPcyBhcmUgcmVxdWlyZWQgZm9yIGRlbGVnYXRpb24nKTtcbiAgICB9XG4gICAgY29uc3QgdXR4b3MgPSB1dGlscy5kZWNvZGVkVG9VdHhvcyh0aGlzLnRyYW5zYWN0aW9uLl91dHhvcywgdGhpcy50cmFuc2FjdGlvbi5fbmV0d29yay5hc3NldElkKTtcblxuICAgIC8vIFVzZSBvbmx5IHRoZSB1c2VyIGtleSAoaW5kZXggMCkgZm9yIGZyb21BZGRyZXNzZXNCeXRlc1xuICAgIC8vIFRoaXMgZW5zdXJlcyB0aGUgQy1jaGFpbiByZXdhcmQgYWRkcmVzcyBpcyBkZXJpdmVkIGZyb20gdGhlIHVzZXIncyBwdWJsaWMga2V5XG4gICAgY29uc3QgdXNlckFkZHJlc3MgPSB0aGlzLmdldFVzZXJBZGRyZXNzKCk7XG5cbiAgICBjb25zdCByZXdhcmRBZGRyZXNzZXMgPVxuICAgICAgdGhpcy50cmFuc2FjdGlvbi5fcmV3YXJkQWRkcmVzc2VzLmxlbmd0aCA+IDAgPyB0aGlzLnRyYW5zYWN0aW9uLl9yZXdhcmRBZGRyZXNzZXMgOiBbdXNlckFkZHJlc3NdO1xuXG4gICAgLy8gVXNlIEV0bmEgKHBvc3QtZm9yaykgQVBJIC0gcHZtLmUubmV3QWRkUGVybWlzc2lvbmxlc3NEZWxlZ2F0b3JUeFxuICAgIGNvbnN0IGRlbGVnYXRvclR4ID0gcHZtLmUubmV3QWRkUGVybWlzc2lvbmxlc3NEZWxlZ2F0b3JUeChcbiAgICAgIHtcbiAgICAgICAgZW5kOiB0aGlzLl9lbmRUaW1lLFxuICAgICAgICBmZWVTdGF0ZTogdGhpcy5fZmVlU3RhdGUsXG4gICAgICAgIGZyb21BZGRyZXNzZXNCeXRlczogW3VzZXJBZGRyZXNzXSxcbiAgICAgICAgbm9kZUlkOiB0aGlzLl9ub2RlSUQsXG4gICAgICAgIHJld2FyZEFkZHJlc3NlczogcmV3YXJkQWRkcmVzc2VzLFxuICAgICAgICBzdGFydDogdGhpcy5fc3RhcnRUaW1lLFxuICAgICAgICBzdWJuZXRJZDogbmV0d29ya0lEcy5QcmltYXJ5TmV0d29ya0lELnRvU3RyaW5nKCksXG4gICAgICAgIHV0eG9zLFxuICAgICAgICB3ZWlnaHQ6IHRoaXMuX3N0YWtlQW1vdW50LFxuICAgICAgfSxcbiAgICAgIHRoaXMudHJhbnNhY3Rpb24uX2NvbnRleHRcbiAgICApO1xuXG4gICAgdGhpcy50cmFuc2FjdGlvbi5zZXRUcmFuc2FjdGlvbihkZWxlZ2F0b3JUeCBhcyBVbnNpZ25lZFR4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZnkgaWYgdGhlIHRyYW5zYWN0aW9uIHR5cGUgbWF0Y2hlcyBBZGRQZXJtaXNzaW9ubGVzc0RlbGVnYXRvclR4XG4gICAqIEBwYXJhbSB0eXBlIFR5cGVTeW1ib2wgZnJvbSBwYXJzZWQgdHJhbnNhY3Rpb25cbiAgICovXG4gIHN0YXRpYyB2ZXJpZnlUeFR5cGUodHlwZTogVHlwZVN5bWJvbHMpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHlwZSA9PT0gVHlwZVN5bWJvbHMuQWRkUGVybWlzc2lvbmxlc3NEZWxlZ2F0b3JUeDtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBwcm90ZWN0ZWQgZ2V0IHRyYW5zYWN0aW9uKCk6IFRyYW5zYWN0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNhY3Rpb247XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0IHRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbikge1xuICAgIHRoaXMuX3RyYW5zYWN0aW9uID0gdHJhbnNhY3Rpb247XG4gIH1cbn1cbiJdfQ==
402
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbmxlc3NEZWxlZ2F0b3JUeEJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3Blcm1pc3Npb25sZXNzRGVsZWdhdG9yVHhCdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLG1EQVkrQjtBQUMvQiw4Q0FBdUY7QUFHdkYseUVBQXNFO0FBQ3RFLG9EQUE0QjtBQUk1Qjs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQWEsZ0NBQWlDLFNBQVEsbURBQXdCO0lBTzVFLFlBQVksVUFBZ0M7UUFDMUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2xCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7SUFDOUQsQ0FBQztJQUVELElBQWMsZUFBZTtRQUMzQixPQUFPLDBCQUFlLENBQUMsMEJBQTBCLENBQUM7SUFDcEQsQ0FBQztJQUVELHFCQUFxQjtJQUNyQixjQUFjLENBQUMsTUFBYztRQUMzQixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWixNQUFNLElBQUksZ0NBQXFCLENBQUMscUNBQXFDLENBQUMsQ0FBQztRQUN6RSxDQUFDO1FBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUNsQyxNQUFNLElBQUksZ0NBQXFCLENBQUMseUNBQXlDLENBQUMsQ0FBQztRQUM3RSxDQUFDO1FBQ0QsSUFBSSxDQUFDLGVBQUssQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUNqQyxNQUFNLElBQUksZ0NBQXFCLENBQUMsbURBQW1ELENBQUMsQ0FBQztRQUN2RixDQUFDO0lBQ0gsQ0FBQztJQUVELHFCQUFxQixDQUFDLFNBQWlCLEVBQUUsT0FBZTtRQUN0RCxJQUFJLE9BQU8sR0FBRyxTQUFTLEVBQUUsQ0FBQztZQUN4QixNQUFNLElBQUksZ0NBQXFCLENBQUMseUNBQXlDLENBQUMsQ0FBQztRQUM3RSxDQUFDO1FBQ0QsK0RBQStEO1FBQy9ELHlEQUF5RDtJQUMzRCxDQUFDO0lBRUQsbUJBQW1CLENBQUMsTUFBYztRQUNoQyxNQUFNLGtCQUFrQixHQUFHLE1BQU0sQ0FDL0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsa0JBQWtCLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUNuRixDQUFDO1FBQ0YsSUFBSSxNQUFNLEdBQUcsa0JBQWtCLEVBQUUsQ0FBQztZQUNoQyxNQUFNLElBQUksZ0NBQXFCLENBQzdCLCtCQUErQixHQUFHLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLFVBQVUsR0FBRyxPQUFPLENBQ3BGLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVELGtCQUFrQjtJQUNsQjs7Ozs7Ozs7T0FRRztJQUNILGFBQWEsQ0FBQyxPQUFlO1FBQzNCLElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxlQUFLLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDbEUsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLE1BQWM7UUFDbkIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM1QixJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztRQUN0QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7O09BR0c7SUFDSCxTQUFTLENBQUMsS0FBc0I7UUFDOUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsT0FBTyxDQUFDLEtBQXNCO1FBQzVCLElBQUksQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7T0FHRztJQUNILFdBQVcsQ0FBQyxLQUFzQjtRQUNoQyxNQUFNLFdBQVcsR0FBRyxPQUFPLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsWUFBWSxHQUFHLFdBQVcsQ0FBQztRQUNoQyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7T0FFRztJQUNILFFBQVEsQ0FBQyxRQUFzQjtRQUM3QixJQUFJLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQztRQUMxQixJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUM7UUFDdEMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILFdBQVcsQ0FBQyxFQUFNLEVBQUUsUUFBaUIsRUFBRSxpQkFBZ0M7UUFDckUsTUFBTSxXQUFXLEdBQUcsRUFBNEMsQ0FBQztRQUVqRSxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUMxQyxNQUFNLElBQUksdUJBQVksQ0FBQyxxRUFBcUUsQ0FBQyxDQUFDO1FBQ2hHLENBQUM7UUFFRCwwRUFBMEU7UUFDMUUsTUFBTSxTQUFTLEdBQUcsV0FBVyxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUM7UUFDeEQsSUFBSSxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzNDLElBQUksQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM5QyxJQUFJLENBQUMsUUFBUSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDMUMsSUFBSSxDQUFDLFlBQVksR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBRTdDLDRDQUE0QztRQUM1Qyx3RUFBd0U7UUFDeEUsTUFBTSxZQUFZLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQztRQUN2QyxJQUFJLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDNUIsTUFBTSxnQkFBZ0IsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDekMsbUVBQW1FO1lBQ25FLE1BQU0sY0FBYyxHQUFHLGdCQUFnQixDQUFDLE1BQXdCLENBQUM7WUFDakUsTUFBTSxZQUFZLEdBQUcsY0FBYyxDQUFDLFlBQVksQ0FBQztZQUNqRCxJQUFJLFlBQVksRUFBRSxDQUFDO2dCQUNqQixJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsR0FBRyxZQUFZLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUM3RCxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2xHLENBQUM7UUFDSCxDQUFDO1FBRUQsc0RBQXNEO1FBQ3RELE1BQU0sWUFBWSxHQUFHLFdBQVcsQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1FBQzVELElBQUksWUFBWSxJQUFJLFlBQVksQ0FBQyxLQUFLLElBQUksWUFBWSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDeEUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3BHLENBQUM7UUFFRCx5RUFBeUU7UUFDekUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUNuRCxDQUFDLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFDOUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQ2hDLENBQUM7UUFFRixNQUFNLFdBQVcsR0FBRyxpQkFBaUIsSUFBSSxFQUFFLENBQUM7UUFFNUMsSUFBSSxRQUFRLElBQUksV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN2QyxJQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsR0FBRyxRQUFRLENBQUM7UUFDOUMsQ0FBQztRQUVELDBFQUEwRTtRQUMxRSxrRUFBa0U7UUFDbEUsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBRWpDLHFGQUFxRjtRQUNyRixrRkFBa0Y7UUFDbEYsNERBQTREO1FBQzVELE1BQU0sYUFBYSxHQUNqQixXQUFXLENBQUMsTUFBTSxHQUFHLENBQUM7WUFDcEIsQ0FBQyxDQUFDLFdBQVc7WUFDYixDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQ25DLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUM7Z0JBQ3BFLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxjQUFjLElBQUksRUFBRSxDQUFDO2dCQUM3QyxrRkFBa0Y7Z0JBQ2xGLElBQUksVUFBVSxDQUFDLE1BQU0sSUFBSSxhQUFhLElBQUksVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7b0JBQzlFLE9BQU8sSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksRUFBRSxhQUFhLEVBQUUsVUFBVSxDQUFDLENBQUM7Z0JBQ3ZFLENBQUM7Z0JBQ0QsT0FBTyxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1lBQzNELENBQUMsQ0FBQyxDQUFDO1FBRVQsOEVBQThFO1FBQzlFLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ3ZELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUM7WUFDcEUsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGNBQWMsSUFBSSxFQUFFLENBQUM7WUFDN0MsSUFBSSxVQUFVLENBQUMsTUFBTSxJQUFJLGFBQWEsSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDOUUsT0FBTyxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxFQUFFLGFBQWEsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUN2RSxDQUFDO1lBQ0QsT0FBTyxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQzNELENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxVQUFVLEdBQUcsSUFBSSxvQkFBVSxDQUFDLFdBQVcsRUFBRSxFQUFFLEVBQUUsSUFBSSxlQUFVLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBRTNHLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzVDLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7T0FHRztJQUNILFlBQVksQ0FBQyxJQUFpQjtRQUM1QixPQUFPLGdDQUFnQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSyxzQkFBc0IsQ0FBQyxNQUEyQixFQUFFLGFBQTJCO1FBQ3JGLE1BQU0sY0FBYyxHQUFHLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUNoRCxlQUFLLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUN6RyxDQUFDO1FBRUYsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDMUIsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztZQUM1QixNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsS0FBc0IsQ0FBQztZQUNuRCxNQUFNLFdBQVcsR0FBRyxhQUFhLENBQUMsV0FBVyxFQUFFLENBQUM7WUFFaEQsTUFBTSxJQUFJLEdBQW1CO2dCQUMzQixRQUFRLEVBQUUsQ0FBQyxFQUFFLGlDQUFpQztnQkFDOUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7Z0JBQ2pDLElBQUksRUFBRSxlQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO2dCQUMxRCxTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxRQUFRLEVBQUU7Z0JBQzlDLFNBQVMsRUFBRSxXQUFXLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVTtnQkFDNUQsU0FBUyxFQUFFLGNBQWM7Z0JBQ3pCLGNBQWMsRUFBRSxXQUFXO2FBQzVCLENBQUM7WUFDRixPQUFPLElBQUksQ0FBQztRQUNkLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVTLEtBQUssQ0FBQyxtQkFBbUI7UUFDakMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDMUQsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQztZQUNyQixLQUFLLE1BQU0sT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDbkMsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN2QyxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7O09BY0c7SUFDTyxjQUFjO1FBQ3RCLE1BQU0sU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDLDhDQUE4QztRQUNuRSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsTUFBTSxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQzVGLE1BQU0sSUFBSSxnQ0FBcUIsQ0FBQyxtREFBbUQsQ0FBQyxDQUFDO1FBQ3ZGLENBQUM7UUFDRCxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDNUUsSUFBSSxXQUFXLENBQUMsTUFBTSxLQUFLLEVBQUUsRUFBRSxDQUFDO1lBQzlCLE1BQU0sSUFBSSxnQ0FBcUIsQ0FBQyx1REFBdUQsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDL0csQ0FBQztRQUNELE9BQU8sV0FBVyxDQUFDO0lBQ3JCLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDTyxxQkFBcUI7UUFDN0IsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWM7WUFBRSxPQUFPO1FBRTVDLDJCQUEyQjtRQUMzQixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2xCLE1BQU0sSUFBSSxnQ0FBcUIsQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO1FBQ3ZFLENBQUM7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3JCLE1BQU0sSUFBSSxnQ0FBcUIsQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO1FBQzNFLENBQUM7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ25CLE1BQU0sSUFBSSxnQ0FBcUIsQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO1FBQ3pFLENBQUM7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sSUFBSSxnQ0FBcUIsQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDO1FBQzdFLENBQUM7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUMvQixNQUFNLElBQUksZ0NBQXFCLENBQUMsb0NBQW9DLENBQUMsQ0FBQztRQUN4RSxDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNyRixNQUFNLElBQUksZ0NBQXFCLENBQUMsNENBQTRDLENBQUMsQ0FBQztRQUNoRixDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNwQixNQUFNLElBQUksZ0NBQXFCLENBQUMsc0NBQXNDLENBQUMsQ0FBQztRQUMxRSxDQUFDO1FBRUQsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRTNELG9GQUFvRjtRQUNwRixJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUU3QixnREFBZ0Q7UUFDaEQsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNyRSxNQUFNLElBQUksZ0NBQXFCLENBQUMsbUNBQW1DLENBQUMsQ0FBQztRQUN2RSxDQUFDO1FBQ0QsTUFBTSxLQUFLLEdBQUcsZUFBSyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUUvRix5REFBeUQ7UUFDekQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBRTFDLE1BQU0sZUFBZSxHQUNuQixJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFbkcsbUVBQW1FO1FBQ25FLHlFQUF5RTtRQUN6RSx3RUFBd0U7UUFDeEUsa0RBQWtEO1FBQ2xELHNEQUFzRDtRQUN0RCxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBRXBELE1BQU0sV0FBVyxHQUFHLGFBQUcsQ0FBQyxDQUFDLENBQUMsK0JBQStCLENBQ3ZEO1lBQ0UsR0FBRyxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ2xCLFFBQVEsRUFBRSxJQUFJLENBQUMsU0FBUztZQUN4QixrQkFBa0IsRUFBRSxnQkFBZ0I7WUFDcEMsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQ3BCLGVBQWUsRUFBRSxlQUFlO1lBQ2hDLEtBQUssRUFBRSxJQUFJLENBQUMsVUFBVTtZQUN0QixRQUFRLEVBQUUsb0JBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUU7WUFDaEQsS0FBSztZQUNMLE1BQU0sRUFBRSxJQUFJLENBQUMsWUFBWTtTQUMxQixFQUNELElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUMxQixDQUFDO1FBRUYsK0RBQStEO1FBQy9ELE1BQU0sZUFBZSxHQUFHLFdBQXlCLENBQUM7UUFDbEQsTUFBTSxPQUFPLEdBQUcsZUFBZSxDQUFDLEtBQUssRUFBNEMsQ0FBQztRQUNsRixNQUFNLGFBQWEsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztRQUM3QyxJQUFJLG9CQUFvQixHQUEyQyxPQUFPLENBQUM7UUFFM0UsSUFBSSxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNoRSxzREFBc0Q7WUFDdEQsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUU1RixNQUFNLHNCQUFzQixHQUFHLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtnQkFDMUQsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLE1BQXdCLENBQUM7Z0JBRXBELE1BQU0sVUFBVSxHQUFHLGVBQUssQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ3pHLE9BQU8sNEJBQWtCLENBQUMsVUFBVSxDQUNsQyxVQUFVLEVBQ1YsV0FBVyxDQUFDLE1BQU0sRUFBRSxFQUNwQixrQkFBa0IsRUFDbEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQzFCLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLCtEQUErRDtpQkFDNUYsQ0FBQztZQUNKLENBQUMsQ0FBQyxDQUFDO1lBRUgsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixDQUFDLE9BQU8sRUFBRSxzQkFBc0IsQ0FBQyxDQUFDO1FBQzFGLENBQUM7UUFFRCx5RUFBeUU7UUFDekUsK0VBQStFO1FBQy9FLE1BQU0sY0FBYyxHQUFHLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDdEUsTUFBTSxTQUFTLEdBQUcsZUFBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQztZQUM3RSxNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUVqRSxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQy9DLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLGNBQWMsQ0FDdkUsQ0FBQztZQUVGLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDbEIsTUFBTSxJQUFJLGdDQUFxQixDQUFDLDBDQUEwQyxTQUFTLElBQUksY0FBYyxFQUFFLENBQUMsQ0FBQztZQUMzRyxDQUFDO1lBRUQsTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDLEtBQXNCLENBQUM7WUFDbkQsTUFBTSxnQkFBZ0IsR0FBRyxhQUFhLENBQUMsV0FBVyxFQUFFLENBQUM7WUFFckQsT0FBTztnQkFDTCxHQUFHLFlBQVk7Z0JBQ2YsY0FBYyxFQUFFLFlBQVksQ0FBQyxjQUFjO2dCQUMzQyxTQUFTLEVBQUUsWUFBWSxDQUFDLFNBQVM7Z0JBQ2pDLFNBQVMsRUFBRSxZQUFZLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVTtnQkFDaEUsZ0JBQWdCO2FBQ2pCLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLGNBQWMsQ0FBQztRQUV6QyxNQUFNLGFBQWEsR0FBRyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FDaEQsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUMxRSxDQUFDO1FBRUYsTUFBTSxXQUFXLEdBQUcsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQzlDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FDMUUsQ0FBQztRQUVGLDZFQUE2RTtRQUM3RSxNQUFNLGVBQWUsR0FBRyxJQUFJLG9CQUFVLENBQ3BDLG9CQUFvQixFQUNwQixFQUFFLEVBQ0YsSUFBSSxlQUFVLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxFQUN2QyxhQUFhLENBQ2QsQ0FBQztRQUVGLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRDs7Ozs7Ozs7Ozs7O09BWUc7SUFDSywwQkFBMEIsQ0FDaEMsVUFBa0QsRUFDbEQsZ0JBQXNDO1FBRXRDLDhGQUE4RjtRQUM5Riw2RkFBNkY7UUFDN0Ysd0hBQXdIO1FBQ3hILE1BQU0sQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUU7WUFDbEQsS0FBSyxFQUFFLGdCQUFnQjtZQUN2QixRQUFRLEVBQUUsS0FBSztZQUNmLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLFlBQVksRUFBRSxJQUFJO1NBQ25CLENBQUMsQ0FBQztRQUVILE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxNQUFNLENBQUMsWUFBWSxDQUFDLElBQWlCO1FBQ25DLE9BQU8sSUFBSSxLQUFLLHFCQUFXLENBQUMsNEJBQTRCLENBQUM7SUFDM0QsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixJQUFjLFdBQVc7UUFDdkIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzNCLENBQUM7SUFFRCxJQUFjLFdBQVcsQ0FBQyxXQUF3QjtRQUNoRCxJQUFJLENBQUMsWUFBWSxHQUFHLFdBQVcsQ0FBQztJQUNsQyxDQUFDO0NBSUY7QUE1ZEQsNEVBNGRDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgdXRpbHMgYXMgRmxhcmVVdGlscyxcbiAgVHlwZVN5bWJvbHMsXG4gIHB2bSxcbiAgbmV0d29ya0lEcyxcbiAgVW5zaWduZWRUeCxcbiAgcHZtU2VyaWFsLFxuICBDcmVkZW50aWFsLFxuICBUcmFuc2Zlck91dHB1dCxcbiAgVHJhbnNmZXJhYmxlT3V0cHV0LFxuICBUcmFuc2ZlcklucHV0LFxuICBUcmFuc2ZlcmFibGVJbnB1dCxcbn0gZnJvbSAnQGZsYXJlbmV0d29yay9mbGFyZWpzJztcbmltcG9ydCB7IEJ1aWxkVHJhbnNhY3Rpb25FcnJvciwgTm90U3VwcG9ydGVkLCBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgQmFzZUNvaW4gYXMgQ29pbkNvbmZpZyB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uIH0gZnJvbSAnLi90cmFuc2FjdGlvbic7XG5pbXBvcnQgeyBBdG9taWNUcmFuc2FjdGlvbkJ1aWxkZXIgfSBmcm9tICcuL2F0b21pY1RyYW5zYWN0aW9uQnVpbGRlcic7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBGbHJwRmVlU3RhdGUgfSBmcm9tICdAYml0Z28vcHVibGljLXR5cGVzJztcbmltcG9ydCB7IFR4LCBEZWNvZGVkVXR4b09iaiB9IGZyb20gJy4vaWZhY2UnO1xuXG4vKipcbiAqIEJ1aWxkZXIgZm9yIEFkZFBlcm1pc3Npb25sZXNzRGVsZWdhdG9yIHRyYW5zYWN0aW9ucyBvbiBGbGFyZSBQLUNoYWluLlxuICpcbiAqIFRoaXMgYnVpbGRlciBjcmVhdGVzIGRlbGVnYXRpb24gdHJhbnNhY3Rpb25zIHdoZXJlIGEgdXNlciBkZWxlZ2F0ZXMgc3Rha2VcbiAqIHRvIGFuIGV4aXN0aW5nIHZhbGlkYXRvci4gVW5saWtlIEFkZFBlcm1pc3Npb25sZXNzVmFsaWRhdG9yOlxuICogLSBObyBCTFMga2V5cyByZXF1aXJlZFxuICogLSBEZWxlZ2F0ZXMgdG8gYW4gZXhpc3RpbmcgdmFsaWRhdG9yJ3Mgbm9kZUlEXG4gKiAtIFJld2FyZHMgZ28gdG8gY29ycmVzcG9uZGluZyBDLWNoYWluIGFkZHJlc3NcbiAqXG4gKiBFeHRlbmRzIEF0b21pY1RyYW5zYWN0aW9uQnVpbGRlciB0byBpbmhlcml0IGFkZHJlc3Mgc29ydGluZyBhbmQgY3JlZGVudGlhbCBtYW5hZ2VtZW50XG4gKiBsb2dpYyBuZWVkZWQgZm9yIHByb3BlciBtdWx0aXNpZyBVVFhPIGhhbmRsaW5nLlxuICovXG5leHBvcnQgY2xhc3MgUGVybWlzc2lvbmxlc3NEZWxlZ2F0b3JUeEJ1aWxkZXIgZXh0ZW5kcyBBdG9taWNUcmFuc2FjdGlvbkJ1aWxkZXIge1xuICBwcm90ZWN0ZWQgX25vZGVJRDogc3RyaW5nO1xuICBwcm90ZWN0ZWQgX3N0YXJ0VGltZTogYmlnaW50O1xuICBwcm90ZWN0ZWQgX2VuZFRpbWU6IGJpZ2ludDtcbiAgcHJvdGVjdGVkIF9zdGFrZUFtb3VudDogYmlnaW50O1xuICBwcm90ZWN0ZWQgX2ZlZVN0YXRlOiBGbHJwRmVlU3RhdGUgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoY29pbkNvbmZpZzogUmVhZG9ubHk8Q29pbkNvbmZpZz4pIHtcbiAgICBzdXBlcihjb2luQ29uZmlnKTtcbiAgICB0aGlzLnRyYW5zYWN0aW9uLl9mZWUuZmVlID0gdGhpcy50cmFuc2FjdGlvbi5fbmV0d29yay50eEZlZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgdHJhbnNhY3Rpb25UeXBlKCk6IFRyYW5zYWN0aW9uVHlwZSB7XG4gICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5BZGRQZXJtaXNzaW9ubGVzc0RlbGVnYXRvcjtcbiAgfVxuXG4gIC8vIFZhbGlkYXRpb24gbWV0aG9kc1xuICB2YWxpZGF0ZU5vZGVJRChub2RlSUQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghbm9kZUlEKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdJbnZhbGlkIHRyYW5zYWN0aW9uOiBtaXNzaW5nIG5vZGVJRCcpO1xuICAgIH1cbiAgICBpZiAoIW5vZGVJRC5zdGFydHNXaXRoKCdOb2RlSUQtJykpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgdHJhbnNhY3Rpb246IGludmFsaWQgTm9kZUlEIHRhZycpO1xuICAgIH1cbiAgICBpZiAoIXV0aWxzLmlzVmFsaWROb2RlSUQobm9kZUlEKSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCB0cmFuc2FjdGlvbjogTm9kZUlEIGlzIG5vdCBpbiBjYjU4IGZvcm1hdCcpO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlU3Rha2VEdXJhdGlvbihzdGFydFRpbWU6IGJpZ2ludCwgZW5kVGltZTogYmlnaW50KTogdm9pZCB7XG4gICAgaWYgKGVuZFRpbWUgPCBzdGFydFRpbWUpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0VuZCBkYXRlIGNhbm5vdCBiZSBsZXNzIHRoYW4gc3RhcnQgZGF0ZScpO1xuICAgIH1cbiAgICAvLyBOb3RlOiBNaW5pbXVtIGR1cmF0aW9uIHZhbGlkYXRpb24gaXMgaGFuZGxlZCBieSB0aGUgbmV0d29yay5cbiAgICAvLyBGbGFyZSBQLWNoYWluIHJlcXVpcmVzIG1pbmltdW0gMTQgZGF5cyBmb3IgZGVsZWdhdGlvbi5cbiAgfVxuXG4gIHZhbGlkYXRlU3Rha2VBbW91bnQoYW1vdW50OiBiaWdpbnQpOiB2b2lkIHtcbiAgICBjb25zdCBtaW5EZWxlZ2F0aW9uU3Rha2UgPSBCaWdJbnQoXG4gICAgICB0aGlzLnRyYW5zYWN0aW9uLl9uZXR3b3JrLm1pbkRlbGVnYXRpb25TdGFrZSB8fCB0aGlzLnRyYW5zYWN0aW9uLl9uZXR3b3JrLm1pblN0YWtlXG4gICAgKTtcbiAgICBpZiAoYW1vdW50IDwgbWluRGVsZWdhdGlvblN0YWtlKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgICAnTWluaW11bSBkZWxlZ2F0aW9uIGFtb3VudCBpcyAnICsgTnVtYmVyKG1pbkRlbGVnYXRpb25TdGFrZSkgLyAxMDAwMDAwMDAwICsgJyBGTFIuJ1xuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvLyBCdWlsZGVyIG1ldGhvZHNcbiAgLyoqXG4gICAqXG4gICAqIE5PVEU6IE9uIEZsYXJlLCBzdGFraW5nIHJld2FyZHMgYXJlIGRpc3RyaWJ1dGVkIG9uIEMtY2hhaW4gKG5vdCBQLWNoYWluKS5cbiAgICogUmV3YXJkcyBnbyB0byB0aGUgQy1jaGFpbiBhZGRyZXNzIGRlcml2ZWQgZnJvbSB0aGUgc2FtZSBwdWJsaWMga2V5IGFzXG4gICAqIHRoZSBQLWNoYWluIHN0YWtpbmcgYWRkcmVzcy4gVGhpcyBwYXJhbWV0ZXIgaXMgcGFzc2VkIHRvIHRoZSBGbGFyZUpTIEFQSVxuICAgKiBidXQgaGFzIE5PIG9uLWNoYWluIGVmZmVjdCBvbiByZXdhcmQgZGlzdHJpYnV0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gYWRkcmVzcyBQLWNoYWluIGFkZHJlc3MgaW4gQmVjaDMyIGZvcm1hdCAoZS5nLiwgXCJQLWZsYXJlMS4uLlwiIG9yIFwiUC1jb3N0d28xLi4uXCIpXG4gICAqL1xuICByZXdhcmRBZGRyZXNzKGFkZHJlc3M6IHN0cmluZyk6IHRoaXMge1xuICAgIHRoaXMudHJhbnNhY3Rpb24uX3Jld2FyZEFkZHJlc3NlcyA9IFt1dGlscy5wYXJzZUFkZHJlc3MoYWRkcmVzcyldO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgdmFsaWRhdG9yIG5vZGUgSUQgdG8gZGVsZWdhdGUgdG9cbiAgICogQHBhcmFtIG5vZGVJRCBWYWxpZGF0b3Igbm9kZSBJRCBpbiBmb3JtYXQgXCJOb2RlSUQtLi4uXCJcbiAgICovXG4gIG5vZGVJRChub2RlSUQ6IHN0cmluZyk6IHRoaXMge1xuICAgIHRoaXMudmFsaWRhdGVOb2RlSUQobm9kZUlEKTtcbiAgICB0aGlzLl9ub2RlSUQgPSBub2RlSUQ7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBzdGFydCB0aW1lIGZvciB0aGUgZGVsZWdhdGlvbiBwZXJpb2RcbiAgICogQHBhcmFtIHZhbHVlIFVuaXggdGltZXN0YW1wIGluIHNlY29uZHNcbiAgICovXG4gIHN0YXJ0VGltZSh2YWx1ZTogc3RyaW5nIHwgbnVtYmVyKTogdGhpcyB7XG4gICAgdGhpcy5fc3RhcnRUaW1lID0gQmlnSW50KHZhbHVlKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGVuZCB0aW1lIGZvciB0aGUgZGVsZWdhdGlvbiBwZXJpb2RcbiAgICogQHBhcmFtIHZhbHVlIFVuaXggdGltZXN0YW1wIGluIHNlY29uZHNcbiAgICovXG4gIGVuZFRpbWUodmFsdWU6IHN0cmluZyB8IG51bWJlcik6IHRoaXMge1xuICAgIHRoaXMuX2VuZFRpbWUgPSBCaWdJbnQodmFsdWUpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgYW1vdW50IHRvIHN0YWtlL2RlbGVnYXRlXG4gICAqIEBwYXJhbSB2YWx1ZSBBbW91bnQgaW4gbmFub0ZMUiAod2VpKVxuICAgKi9cbiAgc3Rha2VBbW91bnQodmFsdWU6IGJpZ2ludCB8IHN0cmluZyk6IHRoaXMge1xuICAgIGNvbnN0IHZhbHVlQmlnSW50ID0gdHlwZW9mIHZhbHVlID09PSAnYmlnaW50JyA/IHZhbHVlIDogQmlnSW50KHZhbHVlKTtcbiAgICB0aGlzLnZhbGlkYXRlU3Rha2VBbW91bnQodmFsdWVCaWdJbnQpO1xuICAgIHRoaXMuX3N0YWtlQW1vdW50ID0gdmFsdWVCaWdJbnQ7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIGZlZVN0YXRlIEZlZSBzdGF0ZSBmcm9tIFAtY2hhaW5cbiAgICovXG4gIGZlZVN0YXRlKGZlZVN0YXRlOiBGbHJwRmVlU3RhdGUpOiB0aGlzIHtcbiAgICB0aGlzLl9mZWVTdGF0ZSA9IGZlZVN0YXRlO1xuICAgIHRoaXMudHJhbnNhY3Rpb24uX2ZlZVN0YXRlID0gZmVlU3RhdGU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSBidWlsZGVyIGZyb20gYSBwYXJzZWQgQWRkUGVybWlzc2lvbmxlc3NEZWxlZ2F0b3JUeC5cbiAgICogVXNlZCB0byByZWNvbnN0cnVjdCB0aGUgYnVpbGRlciBzdGF0ZSBmcm9tIGEgcmF3IHRyYW5zYWN0aW9uIGZvciBzaWduaW5nLlxuICAgKlxuICAgKiBAcGFyYW0gdHggVGhlIHBhcnNlZCB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0gcmF3Qnl0ZXMgT3B0aW9uYWwgcmF3IHRyYW5zYWN0aW9uIGJ5dGVzXG4gICAqIEBwYXJhbSBwYXJzZWRDcmVkZW50aWFscyBPcHRpb25hbCBjcmVkZW50aWFscyBmcm9tIHRoZSBwYXJzZWQgdHJhbnNhY3Rpb25cbiAgICovXG4gIGluaXRCdWlsZGVyKHR4OiBUeCwgcmF3Qnl0ZXM/OiBCdWZmZXIsIHBhcnNlZENyZWRlbnRpYWxzPzogQ3JlZGVudGlhbFtdKTogdGhpcyB7XG4gICAgY29uc3QgZGVsZWdhdG9yVHggPSB0eCBhcyBwdm1TZXJpYWwuQWRkUGVybWlzc2lvbmxlc3NEZWxlZ2F0b3JUeDtcblxuICAgIGlmICghdGhpcy52ZXJpZnlUeFR5cGUoZGVsZWdhdG9yVHguX3R5cGUpKSB7XG4gICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKCdUcmFuc2FjdGlvbiBjYW5ub3QgYmUgcGFyc2VkIG9yIGhhcyBhbiB1bnN1cHBvcnRlZCB0cmFuc2FjdGlvbiB0eXBlJyk7XG4gICAgfVxuXG4gICAgLy8gRXh0cmFjdCB2YWxpZGF0b3IgaW5mbyAobm9kZUlELCBzdGFydFRpbWUsIGVuZFRpbWUsIHdlaWdodC9zdGFrZUFtb3VudClcbiAgICBjb25zdCB2YWxpZGF0b3IgPSBkZWxlZ2F0b3JUeC5zdWJuZXRWYWxpZGF0b3IudmFsaWRhdG9yO1xuICAgIHRoaXMuX25vZGVJRCA9IHZhbGlkYXRvci5ub2RlSWQudG9TdHJpbmcoKTtcbiAgICB0aGlzLl9zdGFydFRpbWUgPSB2YWxpZGF0b3Iuc3RhcnRUaW1lLnZhbHVlKCk7XG4gICAgdGhpcy5fZW5kVGltZSA9IHZhbGlkYXRvci5lbmRUaW1lLnZhbHVlKCk7XG4gICAgdGhpcy5fc3Rha2VBbW91bnQgPSB2YWxpZGF0b3Iud2VpZ2h0LnZhbHVlKCk7XG5cbiAgICAvLyBFeHRyYWN0IGZyb20gYWRkcmVzc2VzIGZyb20gc3Rha2Ugb3V0cHV0c1xuICAgIC8vIEluIGRlbGVnYXRpb24gdHJhbnNhY3Rpb25zLCBzdGFrZSBvdXRwdXRzIGNvbnRhaW4gdGhlIG93bmVyIGFkZHJlc3Nlc1xuICAgIGNvbnN0IHN0YWtlT3V0cHV0cyA9IGRlbGVnYXRvclR4LnN0YWtlO1xuICAgIGlmIChzdGFrZU91dHB1dHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZmlyc3RTdGFrZU91dHB1dCA9IHN0YWtlT3V0cHV0c1swXTtcbiAgICAgIC8vIFN0YWtlIG91dHB1dHMgdXNlIFRyYW5zZmVyT3V0cHV0IHR5cGUgd2l0aCBvdXRwdXRPd25lcnMgcHJvcGVydHlcbiAgICAgIGNvbnN0IHRyYW5zZmVyT3V0cHV0ID0gZmlyc3RTdGFrZU91dHB1dC5vdXRwdXQgYXMgVHJhbnNmZXJPdXRwdXQ7XG4gICAgICBjb25zdCBvdXRwdXRPd25lcnMgPSB0cmFuc2Zlck91dHB1dC5vdXRwdXRPd25lcnM7XG4gICAgICBpZiAob3V0cHV0T3duZXJzKSB7XG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb24uX3RocmVzaG9sZCA9IG91dHB1dE93bmVycy50aHJlc2hvbGQudmFsdWUoKTtcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbi5fZnJvbUFkZHJlc3NlcyA9IG91dHB1dE93bmVycy5hZGRycy5tYXAoKGFkZHIpID0+IEJ1ZmZlci5mcm9tKGFkZHIudG9CeXRlcygpKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRXh0cmFjdCByZXdhcmQgYWRkcmVzc2VzIGZyb20gZGVsZWdhdG9yUmV3YXJkc093bmVyXG4gICAgY29uc3QgcmV3YXJkc093bmVyID0gZGVsZWdhdG9yVHguZ2V0RGVsZWdhdG9yUmV3YXJkc093bmVyKCk7XG4gICAgaWYgKHJld2FyZHNPd25lciAmJiByZXdhcmRzT3duZXIuYWRkcnMgJiYgcmV3YXJkc093bmVyLmFkZHJzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMudHJhbnNhY3Rpb24uX3Jld2FyZEFkZHJlc3NlcyA9IHJld2FyZHNPd25lci5hZGRycy5tYXAoKGFkZHIpID0+IEJ1ZmZlci5mcm9tKGFkZHIudG9CeXRlcygpKSk7XG4gICAgfVxuXG4gICAgLy8gUmVjb3ZlciBVVFhPcyBmcm9tIGJhc2VUeCBpbnB1dHMgdXNpbmcgc3Rha2Ugb3V0cHV0IGFkZHJlc3NlcyBhcyBwcm94eVxuICAgIHRoaXMudHJhbnNhY3Rpb24uX3V0eG9zID0gdGhpcy5yZWNvdmVyVXR4b3NGcm9tSW5wdXRzKFxuICAgICAgWy4uLmRlbGVnYXRvclR4LmJhc2VUeC5pbnB1dHNdLFxuICAgICAgdGhpcy50cmFuc2FjdGlvbi5fZnJvbUFkZHJlc3Nlc1xuICAgICk7XG5cbiAgICBjb25zdCBjcmVkZW50aWFscyA9IHBhcnNlZENyZWRlbnRpYWxzIHx8IFtdO1xuXG4gICAgaWYgKHJhd0J5dGVzICYmIGNyZWRlbnRpYWxzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMudHJhbnNhY3Rpb24uX3Jhd1NpZ25lZEJ5dGVzID0gcmF3Qnl0ZXM7XG4gICAgfVxuXG4gICAgLy8gQ29tcHV0ZSBhZGRyZXNzZXNJbmRleCB0byBtYXAgd2FsbGV0IHBvc2l0aW9ucyB0byBzb3J0ZWQgVVRYTyBwb3NpdGlvbnNcbiAgICAvLyBGb3JjZSByZWNvbXB1dGUgdG8gZW5zdXJlIGZyZXNoIG1hcHBpbmcgZnJvbSBwYXJzZWQgdHJhbnNhY3Rpb25cbiAgICB0aGlzLmNvbXB1dGVBZGRyZXNzZXNJbmRleCh0cnVlKTtcblxuICAgIC8vIFVzZSBwYXJzZWQgY3JlZGVudGlhbHMgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgY3JlYXRlIG5ldyBvbmVzIGJhc2VkIG9uIHNpZ0luZGljZXNcbiAgICAvLyBUaGUgc2lnSW5kaWNlcyBmcm9tIHRoZSBwYXJzZWQgdHJhbnNhY3Rpb24gKHN0b3JlZCBpbiBhZGRyZXNzZXNJbmRleCkgZGV0ZXJtaW5lXG4gICAgLy8gdGhlIGNvcnJlY3QgY3JlZGVudGlhbCBvcmRlcmluZyBmb3Igb24tY2hhaW4gdmVyaWZpY2F0aW9uXG4gICAgY29uc3QgdHhDcmVkZW50aWFscyA9XG4gICAgICBjcmVkZW50aWFscy5sZW5ndGggPiAwXG4gICAgICAgID8gY3JlZGVudGlhbHNcbiAgICAgICAgOiB0aGlzLnRyYW5zYWN0aW9uLl91dHhvcy5tYXAoKHV0eG8pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHV0eG9UaHJlc2hvbGQgPSB1dHhvLnRocmVzaG9sZCB8fCB0aGlzLnRyYW5zYWN0aW9uLl90aHJlc2hvbGQ7XG4gICAgICAgICAgICBjb25zdCBzaWdJbmRpY2VzID0gdXR4by5hZGRyZXNzZXNJbmRleCA/PyBbXTtcbiAgICAgICAgICAgIC8vIFVzZSBzaWdJbmRpY2VzLWJhc2VkIG1ldGhvZCBpZiB3ZSBoYXZlIHZhbGlkIHNpZ0luZGljZXMgZnJvbSBwYXJzZWQgdHJhbnNhY3Rpb25cbiAgICAgICAgICAgIGlmIChzaWdJbmRpY2VzLmxlbmd0aCA+PSB1dHhvVGhyZXNob2xkICYmIHNpZ0luZGljZXMuZXZlcnkoKGlkeCkgPT4gaWR4ID49IDApKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUNyZWRlbnRpYWxGb3JVdHhvKHV0eG8sIHV0eG9UaHJlc2hvbGQsIHNpZ0luZGljZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlQ3JlZGVudGlhbEZvclV0eG8odXR4bywgdXR4b1RocmVzaG9sZCk7XG4gICAgICAgICAgfSk7XG5cbiAgICAvLyBDcmVhdGUgYWRkcmVzc01hcHMgdXNpbmcgc2lnSW5kaWNlcyBmcm9tIHBhcnNlZCB0cmFuc2FjdGlvbiBmb3IgY29uc2lzdGVuY3lcbiAgICBjb25zdCBhZGRyZXNzTWFwcyA9IHRoaXMudHJhbnNhY3Rpb24uX3V0eG9zLm1hcCgodXR4bykgPT4ge1xuICAgICAgY29uc3QgdXR4b1RocmVzaG9sZCA9IHV0eG8udGhyZXNob2xkIHx8IHRoaXMudHJhbnNhY3Rpb24uX3RocmVzaG9sZDtcbiAgICAgIGNvbnN0IHNpZ0luZGljZXMgPSB1dHhvLmFkZHJlc3Nlc0luZGV4ID8/IFtdO1xuICAgICAgaWYgKHNpZ0luZGljZXMubGVuZ3RoID49IHV0eG9UaHJlc2hvbGQgJiYgc2lnSW5kaWNlcy5ldmVyeSgoaWR4KSA9PiBpZHggPj0gMCkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlQWRkcmVzc01hcEZvclV0eG8odXR4bywgdXR4b1RocmVzaG9sZCwgc2lnSW5kaWNlcyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVBZGRyZXNzTWFwRm9yVXR4byh1dHhvLCB1dHhvVGhyZXNob2xkKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHVuc2lnbmVkVHggPSBuZXcgVW5zaWduZWRUeChkZWxlZ2F0b3JUeCwgW10sIG5ldyBGbGFyZVV0aWxzLkFkZHJlc3NNYXBzKGFkZHJlc3NNYXBzKSwgdHhDcmVkZW50aWFscyk7XG5cbiAgICB0aGlzLnRyYW5zYWN0aW9uLnNldFRyYW5zYWN0aW9uKHVuc2lnbmVkVHgpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEluc3RhbmNlIG1ldGhvZCB0byB2ZXJpZnkgdHJhbnNhY3Rpb24gdHlwZVxuICAgKiBAcGFyYW0gdHlwZSBUeXBlU3ltYm9sIGZyb20gcGFyc2VkIHRyYW5zYWN0aW9uXG4gICAqL1xuICB2ZXJpZnlUeFR5cGUodHlwZTogVHlwZVN5bWJvbHMpOiBib29sZWFuIHtcbiAgICByZXR1cm4gUGVybWlzc2lvbmxlc3NEZWxlZ2F0b3JUeEJ1aWxkZXIudmVyaWZ5VHhUeXBlKHR5cGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY292ZXIgVVRYT3MgZnJvbSB0cmFuc2FjdGlvbiBpbnB1dHMuXG4gICAqIFVzZXMgZnJvbUFkZHJlc3NlcyBhcyBwcm94eSBmb3IgVVRYTyBhZGRyZXNzZXMgc2luY2Ugd2UncmUgcmVjb25zdHJ1Y3RpbmcgZnJvbSBhIHBhcnNlZCB0cmFuc2FjdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGlucHV0cyBBcnJheSBvZiBUcmFuc2ZlcmFibGVJbnB1dCBmcm9tIGJhc2VUeFxuICAgKiBAcGFyYW0gZnJvbUFkZHJlc3NlcyBXYWxsZXQgYWRkcmVzc2VzIHRvIHVzZSBhcyBwcm94eSBmb3IgVVRYTyBhZGRyZXNzZXNcbiAgICogQHJldHVybnMgQXJyYXkgb2YgZGVjb2RlZCBVVFhPIG9iamVjdHNcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgcmVjb3ZlclV0eG9zRnJvbUlucHV0cyhpbnB1dHM6IFRyYW5zZmVyYWJsZUlucHV0W10sIGZyb21BZGRyZXNzZXM6IFVpbnQ4QXJyYXlbXSk6IERlY29kZWRVdHhvT2JqW10ge1xuICAgIGNvbnN0IHByb3h5QWRkcmVzc2VzID0gZnJvbUFkZHJlc3Nlcy5tYXAoKGFkZHIpID0+XG4gICAgICB1dGlscy5hZGRyZXNzVG9TdHJpbmcodGhpcy50cmFuc2FjdGlvbi5fbmV0d29yay5ocnAsIHRoaXMudHJhbnNhY3Rpb24uX25ldHdvcmsuYWxpYXMsIEJ1ZmZlci5mcm9tKGFkZHIpKVxuICAgICk7XG5cbiAgICByZXR1cm4gaW5wdXRzLm1hcCgoaW5wdXQpID0+IHtcbiAgICAgIGNvbnN0IHV0eG9JZCA9IGlucHV0LnV0eG9JRDtcbiAgICAgIGNvbnN0IHRyYW5zZmVySW5wdXQgPSBpbnB1dC5pbnB1dCBhcyBUcmFuc2ZlcklucHV0O1xuICAgICAgY29uc3Qgc2lnSW5kaWNpZXMgPSB0cmFuc2ZlcklucHV0LnNpZ0luZGljaWVzKCk7XG5cbiAgICAgIGNvbnN0IHV0eG86IERlY29kZWRVdHhvT2JqID0ge1xuICAgICAgICBvdXRwdXRJRDogNywgLy8gU0VDUDI1NksxIFRyYW5zZmVyIE91dHB1dCB0eXBlXG4gICAgICAgIGFtb3VudDogaW5wdXQuYW1vdW50KCkudG9TdHJpbmcoKSxcbiAgICAgICAgdHhpZDogdXRpbHMuY2I1OEVuY29kZShCdWZmZXIuZnJvbSh1dHhvSWQudHhJRC50b0J5dGVzKCkpKSxcbiAgICAgICAgb3V0cHV0aWR4OiB1dHhvSWQub3V0cHV0SWR4LnZhbHVlKCkudG9TdHJpbmcoKSxcbiAgICAgICAgdGhyZXNob2xkOiBzaWdJbmRpY2llcy5sZW5ndGggfHwgdGhpcy50cmFuc2FjdGlvbi5fdGhyZXNob2xkLFxuICAgICAgICBhZGRyZXNzZXM6IHByb3h5QWRkcmVzc2VzLFxuICAgICAgICBhZGRyZXNzZXNJbmRleDogc2lnSW5kaWNpZXMsXG4gICAgICB9O1xuICAgICAgcmV0dXJuIHV0eG87XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgYnVpbGRJbXBsZW1lbnRhdGlvbigpOiBQcm9taXNlPFRyYW5zYWN0aW9uPiB7XG4gICAgdGhpcy5idWlsZEZsYXJlVHJhbnNhY3Rpb24oKTtcbiAgICB0aGlzLnRyYW5zYWN0aW9uLnNldFRyYW5zYWN0aW9uVHlwZSh0aGlzLnRyYW5zYWN0aW9uVHlwZSk7XG4gICAgaWYgKHRoaXMuaGFzU2lnbmVyKCkpIHtcbiAgICAgIGZvciAoY29uc3Qga2V5UGFpciBvZiB0aGlzLl9zaWduZXIpIHtcbiAgICAgICAgYXdhaXQgdGhpcy50cmFuc2FjdGlvbi5zaWduKGtleVBhaXIpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHVzZXIncyBhZGRyZXNzIChpbmRleCAwKSBmb3IgZGVmYXVsdCByZXdhcmQgYWRkcmVzcy5cbiAgICpcbiAgICogQml0R28gQ29udmVudGlvbiBmb3IgZnJvbUFkZHJlc3NlczpcbiAgICogLSBJbmRleCAwOiBVc2VyIGtleSAoc2lnbmVyIGluIG5vcm1hbCBtb2RlKVxuICAgKiAtIEluZGV4IDE6IEJpdEdvIGtleSAoYWx3YXlzIGEgc2lnbmVyKVxuICAgKiAtIEluZGV4IDI6IEJhY2t1cCBrZXkgKHNpZ25lciBpbiByZWNvdmVyeSBtb2RlKVxuICAgKlxuICAgKiBGb3IgZGVsZWdhdGlvbiB0cmFuc2FjdGlvbnMsIHRoZSB1c2VyJ3MgYWRkcmVzcyBhdCBpbmRleCAwIGlzIHVzZWQgYXMgdGhlIGRlZmF1bHRcbiAgICogcmV3YXJkIGFkZHJlc3MgcGFyYW1ldGVyICh0aG91Z2ggdGhlIHBhcmFtZXRlciBoYXMgbm8gb24tY2hhaW4gZWZmZWN0IC0gcmV3YXJkc1xuICAgKiBnbyB0byBDLWNoYWluIGFkZHJlc3NlcyBkZXJpdmVkIGZyb20gdGhlIFAtY2hhaW4gYWRkcmVzc2VzIGluIHN0YWtlIG91dHB1dHMpLlxuICAgKlxuICAgKiBAcmV0dXJucyBCdWZmZXIgY29udGFpbmluZyB0aGUgdXNlcidzIGFkZHJlc3NcbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgcHJvdGVjdGVkIGdldFVzZXJBZGRyZXNzKCk6IEJ1ZmZlciB7XG4gICAgY29uc3QgdXNlckluZGV4ID0gMDsgLy8gQml0R28gY29udmVudGlvbjogdXNlciBpcyBhbHdheXMgYXQgaW5kZXggMFxuICAgIGlmICghdGhpcy50cmFuc2FjdGlvbi5fZnJvbUFkZHJlc3NlcyB8fCB0aGlzLnRyYW5zYWN0aW9uLl9mcm9tQWRkcmVzc2VzLmxlbmd0aCA8PSB1c2VySW5kZXgpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ1VzZXIgYWRkcmVzcyAoaW5kZXggMCkgaXMgcmVxdWlyZWQgZm9yIGRlbGVnYXRpb24nKTtcbiAgICB9XG4gICAgY29uc3QgdXNlckFkZHJlc3MgPSBCdWZmZXIuZnJvbSh0aGlzLnRyYW5zYWN0aW9uLl9mcm9tQWRkcmVzc2VzW3VzZXJJbmRleF0pO1xuICAgIGlmICh1c2VyQWRkcmVzcy5sZW5ndGggIT09IDIwKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKGBJbnZhbGlkIHVzZXIgYWRkcmVzcyBsZW5ndGg6IGV4cGVjdGVkIDIwIGJ5dGVzLCBnb3QgJHt1c2VyQWRkcmVzcy5sZW5ndGh9YCk7XG4gICAgfVxuICAgIHJldHVybiB1c2VyQWRkcmVzcztcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCB0aGUgcGVybWlzc2lvbmxlc3MgZGVsZWdhdG9yIHRyYW5zYWN0aW9uIHVzaW5nIEZsYXJlSlMuXG4gICAqIFVzZXMgcHZtLmUubmV3QWRkUGVybWlzc2lvbmxlc3NEZWxlZ2F0b3JUeCAocG9zdC1FdG5hIEFQSSkuXG4gICAqXG4gICAqIE5vdGU6IFRoZSByZXdhcmRBZGRyZXNzZXMgcGFyYW1ldGVyIGlzIGFjY2VwdGVkIGJ5IHRoZSBBUEkgYnV0IGRvZXMgTk9UIGFmZmVjdFxuICAgKiB3aGVyZSByZXdhcmRzIGFyZSBzZW50IG9uLWNoYWluLiBSZXdhcmRzIGFjY3J1ZSB0byBDLWNoYWluIGFkZHJlc3NlcyBkZXJpdmVkXG4gICAqIGZyb20gdGhlIFAtY2hhaW4gYWRkcmVzc2VzIGluIHRoZSBzdGFrZSBvdXRwdXRzLiBUaGUgc3Rha2Ugb3V0cHV0cyBjb250YWluIHRoZVxuICAgKiBhZGRyZXNzZXMgZnJvbSBmcm9tQWRkcmVzc2VzQnl0ZXMgKHNvcnRlZCB0byBtYXRjaCBVVFhPIG93bmVyIG9yZGVyKS5cbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgcHJvdGVjdGVkIGJ1aWxkRmxhcmVUcmFuc2FjdGlvbigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy50cmFuc2FjdGlvbi5oYXNDcmVkZW50aWFscykgcmV0dXJuO1xuXG4gICAgLy8gVmFsaWRhdGUgcmVxdWlyZWQgZmllbGRzXG4gICAgaWYgKCF0aGlzLl9ub2RlSUQpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ05vZGVJRCBpcyByZXF1aXJlZCBmb3IgZGVsZWdhdGlvbicpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuX3N0YXJ0VGltZSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignU3RhcnQgdGltZSBpcyByZXF1aXJlZCBmb3IgZGVsZWdhdGlvbicpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuX2VuZFRpbWUpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0VuZCB0aW1lIGlzIHJlcXVpcmVkIGZvciBkZWxlZ2F0aW9uJyk7XG4gICAgfVxuICAgIGlmICghdGhpcy5fc3Rha2VBbW91bnQpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ1N0YWtlIGFtb3VudCBpcyByZXF1aXJlZCBmb3IgZGVsZWdhdGlvbicpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMudHJhbnNhY3Rpb24uX2NvbnRleHQpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0NvbnRleHQgaXMgcmVxdWlyZWQgZm9yIGRlbGVnYXRpb24nKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnRyYW5zYWN0aW9uLl9mcm9tQWRkcmVzc2VzIHx8IHRoaXMudHJhbnNhY3Rpb24uX2Zyb21BZGRyZXNzZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdGcm9tIGFkZHJlc3NlcyBhcmUgcmVxdWlyZWQgZm9yIGRlbGVnYXRpb24nKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLl9mZWVTdGF0ZSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignRmVlIHN0YXRlIGlzIHJlcXVpcmVkIGZvciBkZWxlZ2F0aW9uJyk7XG4gICAgfVxuXG4gICAgdGhpcy52YWxpZGF0ZVN0YWtlRHVyYXRpb24odGhpcy5fc3RhcnRUaW1lLCB0aGlzLl9lbmRUaW1lKTtcblxuICAgIC8vIENvbXB1dGUgYWRkcmVzc2VzSW5kZXggdG8gbWFwIHdhbGxldCBrZXkgaW5kaWNlcyB0byBzb3J0ZWQgVVRYTyBhZGRyZXNzIHBvc2l0aW9uc1xuICAgIHRoaXMuY29tcHV0ZUFkZHJlc3Nlc0luZGV4KCk7XG5cbiAgICAvLyBDb252ZXJ0IGRlY29kZWQgVVRYT3MgdG8gRmxhcmVKUyBVdHhvIG9iamVjdHNcbiAgICBpZiAoIXRoaXMudHJhbnNhY3Rpb24uX3V0eG9zIHx8IHRoaXMudHJhbnNhY3Rpb24uX3V0eG9zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignVVRYT3MgYXJlIHJlcXVpcmVkIGZvciBkZWxlZ2F0aW9uJyk7XG4gICAgfVxuICAgIGNvbnN0IHV0eG9zID0gdXRpbHMuZGVjb2RlZFRvVXR4b3ModGhpcy50cmFuc2FjdGlvbi5fdXR4b3MsIHRoaXMudHJhbnNhY3Rpb24uX25ldHdvcmsuYXNzZXRJZCk7XG5cbiAgICAvLyBHZXQgdXNlciBhZGRyZXNzIGZvciBkZWZhdWx0IHJld2FyZCBhZGRyZXNzIGRlcml2YXRpb25cbiAgICBjb25zdCB1c2VyQWRkcmVzcyA9IHRoaXMuZ2V0VXNlckFkZHJlc3MoKTtcblxuICAgIGNvbnN0IHJld2FyZEFkZHJlc3NlcyA9XG4gICAgICB0aGlzLnRyYW5zYWN0aW9uLl9yZXdhcmRBZGRyZXNzZXMubGVuZ3RoID4gMCA/IHRoaXMudHJhbnNhY3Rpb24uX3Jld2FyZEFkZHJlc3NlcyA6IFt1c2VyQWRkcmVzc107XG5cbiAgICAvLyBVc2UgRXRuYSAocG9zdC1mb3JrKSBBUEkgLSBwdm0uZS5uZXdBZGRQZXJtaXNzaW9ubGVzc0RlbGVnYXRvclR4XG4gICAgLy8gSU1QT1JUQU5UOiBVc2UgZ2V0U2lnbmluZ0FkZHJlc3NlcygpIHRvIGdldCB0aGUgY29ycmVjdCAyIHNpZ25pbmcga2V5c1xuICAgIC8vIFRoaXMgZW5zdXJlcyBwcm9wZXIga2V5IHNlbGVjdGlvbiBmb3IgYm90aCBub3JtYWwgYW5kIHJlY292ZXJ5IG1vZGVzOlxuICAgIC8vIC0gTm9ybWFsIG1vZGU6IHVzZXIgKGluZGV4IDApICsgYml0Z28gKGluZGV4IDEpXG4gICAgLy8gLSBSZWNvdmVyeSBtb2RlOiBiYWNrdXAgKGluZGV4IDIpICsgYml0Z28gKGluZGV4IDEpXG4gICAgY29uc3Qgc2lnbmluZ0FkZHJlc3NlcyA9IHRoaXMuZ2V0U2lnbmluZ0FkZHJlc3NlcygpO1xuXG4gICAgY29uc3QgZGVsZWdhdG9yVHggPSBwdm0uZS5uZXdBZGRQZXJtaXNzaW9ubGVzc0RlbGVnYXRvclR4KFxuICAgICAge1xuICAgICAgICBlbmQ6IHRoaXMuX2VuZFRpbWUsXG4gICAgICAgIGZlZVN0YXRlOiB0aGlzLl9mZWVTdGF0ZSxcbiAgICAgICAgZnJvbUFkZHJlc3Nlc0J5dGVzOiBzaWduaW5nQWRkcmVzc2VzLFxuICAgICAgICBub2RlSWQ6IHRoaXMuX25vZGVJRCxcbiAgICAgICAgcmV3YXJkQWRkcmVzc2VzOiByZXdhcmRBZGRyZXNzZXMsXG4gICAgICAgIHN0YXJ0OiB0aGlzLl9zdGFydFRpbWUsXG4gICAgICAgIHN1Ym5ldElkOiBuZXR3b3JrSURzLlByaW1hcnlOZXR3b3JrSUQudG9TdHJpbmcoKSxcbiAgICAgICAgdXR4b3MsXG4gICAgICAgIHdlaWdodDogdGhpcy5fc3Rha2VBbW91bnQsXG4gICAgICB9LFxuICAgICAgdGhpcy50cmFuc2FjdGlvbi5fY29udGV4dFxuICAgICk7XG5cbiAgICAvLyBGaXggY2hhbmdlIG91dHB1dCB0aHJlc2hvbGQgYnVnIChzYW1lIGFzIEV4cG9ydEluUFR4QnVpbGRlcilcbiAgICBjb25zdCBmbGFyZVVuc2lnbmVkVHggPSBkZWxlZ2F0b3JUeCBhcyBVbnNpZ25lZFR4O1xuICAgIGNvbnN0IGlubmVyVHggPSBmbGFyZVVuc2lnbmVkVHguZ2V0VHgoKSBhcyBwdm1TZXJpYWwuQWRkUGVybWlzc2lvbmxlc3NEZWxlZ2F0b3JUeDtcbiAgICBjb25zdCBjaGFuZ2VPdXRwdXRzID0gaW5uZXJUeC5iYXNlVHgub3V0cHV0cztcbiAgICBsZXQgY29ycmVjdGVkRGVsZWdhdG9yVHg6IHB2bVNlcmlhbC5BZGRQZXJtaXNzaW9ubGVzc0RlbGVnYXRvclR4ID0gaW5uZXJUeDtcblxuICAgIGlmIChjaGFuZ2VPdXRwdXRzLmxlbmd0aCA+IDAgJiYgdGhpcy50cmFuc2FjdGlvbi5fdGhyZXNob2xkID4gMSkge1xuICAgICAgLy8gT25seSBhcHBseSBmaXggZm9yIG11bHRpc2lnIHdhbGxldHMgKHRocmVzaG9sZCA+IDEpXG4gICAgICBjb25zdCBhbGxXYWxsZXRBZGRyZXNzZXMgPSB0aGlzLnRyYW5zYWN0aW9uLl9mcm9tQWRkcmVzc2VzLm1hcCgoYWRkcikgPT4gQnVmZmVyLmZyb20oYWRkcikpO1xuXG4gICAgICBjb25zdCBjb3JyZWN0ZWRDaGFuZ2VPdXRwdXRzID0gY2hhbmdlT3V0cHV0cy5tYXAoKG91dHB1dCkgPT4ge1xuICAgICAgICBjb25zdCB0cmFuc2Zlck91dCA9IG91dHB1dC5vdXRwdXQgYXMgVHJhbnNmZXJPdXRwdXQ7XG5cbiAgICAgICAgY29uc3QgYXNzZXRJZFN0ciA9IHV0aWxzLmZsYXJlSWRTdHJpbmcoQnVmZmVyLmZyb20ob3V0cHV0LmFzc2V0SWQudG9CeXRlcygpKS50b1N0cmluZygnaGV4JykpLnRvU3RyaW5nKCk7XG4gICAgICAgIHJldHVybiBUcmFuc2ZlcmFibGVPdXRwdXQuZnJvbU5hdGl2ZShcbiAgICAgICAgICBhc3NldElkU3RyLFxuICAgICAgICAgIHRyYW5zZmVyT3V0LmFtb3VudCgpLFxuICAgICAgICAgIGFsbFdhbGxldEFkZHJlc3NlcyxcbiAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9uLl9sb2NrdGltZSxcbiAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9uLl90aHJlc2hvbGQgLy8gRml4OiB1c2Ugd2FsbGV0J3MgdGhyZXNob2xkIGluc3RlYWQgb2YgRmxhcmVKUydzIGRlZmF1bHQgKDEpXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgY29ycmVjdGVkRGVsZWdhdG9yVHggPSB0aGlzLmNyZWF0ZUNvcnJlY3RlZERlbGVnYXRvclR4KGlubmVyVHgsIGNvcnJlY3RlZENoYW5nZU91dHB1dHMpO1xuICAgIH1cblxuICAgIC8vIFJlY3JlYXRlIGNyZWRlbnRpYWxzIGFuZCBhZGRyZXNzTWFwcyBmcm9tIGNvcnJlY3RlZCB0cmFuc2FjdGlvbiBpbnB1dHNcbiAgICAvLyBUaGlzIGZvbGxvd3MgdGhlIHNhbWUgcGF0dGVybiBhcyBFeHBvcnRJblBUeEJ1aWxkZXIgdG8gZW5zdXJlIHByb3BlciBzaWduaW5nXG4gICAgY29uc3QgdXR4b3NXaXRoSW5kZXggPSBjb3JyZWN0ZWREZWxlZ2F0b3JUeC5iYXNlVHguaW5wdXRzLm1hcCgoaW5wdXQpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0VHhpZCA9IHV0aWxzLmNiNThFbmNvZGUoQnVmZmVyLmZyb20oaW5wdXQudXR4b0lELnR4SUQudG9CeXRlcygpKSk7XG4gICAgICBjb25zdCBpbnB1dE91dHB1dElkeCA9IGlucHV0LnV0eG9JRC5vdXRwdXRJZHgudmFsdWUoKS50b1N0cmluZygpO1xuXG4gICAgICBjb25zdCBvcmlnaW5hbFV0eG8gPSB0aGlzLnRyYW5zYWN0aW9uLl91dHhvcy5maW5kKFxuICAgICAgICAodXR4bykgPT4gdXR4by50eGlkID09PSBpbnB1dFR4aWQgJiYgdXR4by5vdXRwdXRpZHggPT09IGlucHV0T3V0cHV0SWR4XG4gICAgICApO1xuXG4gICAgICBpZiAoIW9yaWdpbmFsVXR4bykge1xuICAgICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKGBDb3VsZCBub3QgZmluZCBtYXRjaGluZyBVVFhPIGZvciBpbnB1dCAke2lucHV0VHhpZH06JHtpbnB1dE91dHB1dElkeH1gKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdHJhbnNmZXJJbnB1dCA9IGlucHV0LmlucHV0IGFzIFRyYW5zZmVySW5wdXQ7XG4gICAgICBjb25zdCBhY3R1YWxTaWdJbmRpY2VzID0gdHJhbnNmZXJJbnB1dC5zaWdJbmRpY2llcygpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5vcmlnaW5hbFV0eG8sXG4gICAgICAgIGFkZHJlc3Nlc0luZGV4OiBvcmlnaW5hbFV0eG8uYWRkcmVzc2VzSW5kZXgsXG4gICAgICAgIGFkZHJlc3Nlczogb3JpZ2luYWxVdHhvLmFkZHJlc3NlcyxcbiAgICAgICAgdGhyZXNob2xkOiBvcmlnaW5hbFV0eG8udGhyZXNob2xkIHx8IHRoaXMudHJhbnNhY3Rpb24uX3RocmVzaG9sZCxcbiAgICAgICAgYWN0dWFsU2lnSW5kaWNlcyxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICB0aGlzLnRyYW5zYWN0aW9uLl91dHhvcyA9IHV0eG9zV2l0aEluZGV4O1xuXG4gICAgY29uc3QgdHhDcmVkZW50aWFscyA9IHV0eG9zV2l0aEluZGV4Lm1hcCgodXR4bykgPT5cbiAgICAgIHRoaXMuY3JlYXRlQ3JlZGVudGlhbEZvclV0eG8odXR4bywgdXR4by50aHJlc2hvbGQsIHV0eG8uYWN0dWFsU2lnSW5kaWNlcylcbiAgICApO1xuXG4gICAgY29uc3QgYWRkcmVzc01hcHMgPSB1dHhvc1dpdGhJbmRleC5tYXAoKHV0eG8pID0+XG4gICAgICB0aGlzLmNyZWF0ZUFkZHJlc3NNYXBGb3JVdHhvKHV0eG8sIHV0eG8udGhyZXNob2xkLCB1dHhvLmFjdHVhbFNpZ0luZGljZXMpXG4gICAgKTtcblxuICAgIC8vIENyZWF0ZSBuZXcgVW5zaWduZWRUeCB3aXRoIGNvcnJlY3RlZCBjaGFuZ2Ugb3V0cHV0cyBhbmQgcHJvcGVyIGNyZWRlbnRpYWxzXG4gICAgY29uc3QgZml4ZWRVbnNpZ25lZFR4ID0gbmV3IFVuc2lnbmVkVHgoXG4gICAgICBjb3JyZWN0ZWREZWxlZ2F0b3JUeCxcbiAgICAgIFtdLFxuICAgICAgbmV3IEZsYXJlVXRpbHMuQWRkcmVzc01hcHMoYWRkcmVzc01hcHMpLFxuICAgICAgdHhDcmVkZW50aWFsc1xuICAgICk7XG5cbiAgICB0aGlzLnRyYW5zYWN0aW9uLnNldFRyYW5zYWN0aW9uKGZpeGVkVW5zaWduZWRUeCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgY29ycmVjdGVkIEFkZFBlcm1pc3Npb25sZXNzRGVsZWdhdG9yVHggd2l0aCB0aGUgZ2l2ZW4gY2hhbmdlIG91dHB1dHMuXG4gICAqIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgRmxhcmVKUydzIG5ld0FkZFBlcm1pc3Npb25sZXNzRGVsZWdhdG9yVHggZG9lc24ndCBzdXBwb3J0IHNldHRpbmdcbiAgICogdGhlIHRocmVzaG9sZCBhbmQgbG9ja3RpbWUgZm9yIGNoYW5nZSBvdXRwdXRzIC0gaXQgZGVmYXVsdHMgdG8gdGhyZXNob2xkPTEuXG4gICAqXG4gICAqIEZsYXJlSlMgZGVjbGFyZXMgYmFzZVR4Lm91dHB1dHMgYXMgcmVhZG9ubHksIHNvIHdlIHVzZSBPYmplY3QuZGVmaW5lUHJvcGVydHlcbiAgICogdG8gb3ZlcnJpZGUgdGhlIHByb3BlcnR5IHdpdGggdGhlIGNvcnJlY3RlZCBvdXRwdXRzLiBUaGlzIGlzIGEgd29ya2Fyb3VuZCB1bnRpbFxuICAgKiBGbGFyZUpTIGFkZHMgcHJvcGVyIHN1cHBvcnQgZm9yIGNoYW5nZSBvdXRwdXQgdGhyZXNob2xkcy5cbiAgICpcbiAgICogQHBhcmFtIG9yaWdpbmFsVHggLSBUaGUgb3JpZ2luYWwgQWRkUGVybWlzc2lvbmxlc3NEZWxlZ2F0b3JUeFxuICAgKiBAcGFyYW0gY29ycmVjdGVkT3V0cHV0cyAtIFRoZSBjb3JyZWN0ZWQgY2hhbmdlIG91dHB1dHMgd2l0aCBwcm9wZXIgdGhyZXNob2xkXG4gICAqIEByZXR1cm5zIEEgbmV3IEFkZFBlcm1pc3Npb25sZXNzRGVsZWdhdG9yVHggd2l0aCB0aGUgY29ycmVjdGVkIGNoYW5nZSBvdXRwdXRzXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUNvcnJlY3RlZERlbGVnYXRvclR4KFxuICAgIG9yaWdpbmFsVHg6IHB2bVNlcmlhbC5BZGRQZXJtaXNzaW9ubGVzc0RlbGVnYXRvclR4LFxuICAgIGNvcnJlY3RlZE91dHB1dHM6IFRyYW5zZmVyYWJsZU91dHB1dFtdXG4gICk6IHB2bVNlcmlhbC5BZGRQZXJtaXNzaW9ubGVzc0RlbGVnYXRvclR4IHtcbiAgICAvLyBGbGFyZUpTIGRlY2xhcmVzIGJhc2VUeC5vdXRwdXRzIGFzIGBwdWJsaWMgcmVhZG9ubHkgb3V0cHV0czogcmVhZG9ubHkgVHJhbnNmZXJhYmxlT3V0cHV0W11gXG4gICAgLy8gV2UgdXNlIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSB0byBvdmVycmlkZSB0aGUgcmVhZG9ubHkgcHJvcGVydHkgd2l0aCBvdXIgY29ycmVjdGVkIG91dHB1dHMuXG4gICAgLy8gVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBGbGFyZUpTJ3MgbmV3QWRkUGVybWlzc2lvbmxlc3NEZWxlZ2F0b3JUeCBkb2Vzbid0IHN1cHBvcnQgY2hhbmdlIG91dHB1dCB0aHJlc2hvbGQvbG9ja3RpbWUuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9yaWdpbmFsVHguYmFzZVR4LCAnb3V0cHV0cycsIHtcbiAgICAgIHZhbHVlOiBjb3JyZWN0ZWRPdXRwdXRzLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB9KTtcblxuICAgIHJldHVybiBvcmlnaW5hbFR4O1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmeSBpZiB0aGUgdHJhbnNhY3Rpb24gdHlwZSBtYXRjaGVzIEFkZFBlcm1pc3Npb25sZXNzRGVsZWdhdG9yVHhcbiAgICogQHBhcmFtIHR5cGUgVHlwZVN5bWJvbCBmcm9tIHBhcnNlZCB0cmFuc2FjdGlvblxuICAgKi9cbiAgc3RhdGljIHZlcmlmeVR4VHlwZSh0eXBlOiBUeXBlU3ltYm9scyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0eXBlID09PSBUeXBlU3ltYm9scy5BZGRQZXJtaXNzaW9ubGVzc0RlbGVnYXRvclR4O1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHByb3RlY3RlZCBnZXQgdHJhbnNhY3Rpb24oKTogVHJhbnNhY3Rpb24ge1xuICAgIHJldHVybiB0aGlzLl90cmFuc2FjdGlvbjtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXQgdHJhbnNhY3Rpb24odHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uKSB7XG4gICAgdGhpcy5fdHJhbnNhY3Rpb24gPSB0cmFuc2FjdGlvbjtcbiAgfVxuXG4gIC8vIE5vdGU6IGNyZWF0ZUNyZWRlbnRpYWxGb3JVdHhvIGFuZCBjcmVhdGVBZGRyZXNzTWFwRm9yVXR4byBtZXRob2RzIGFyZSBpbmhlcml0ZWRcbiAgLy8gZnJvbSBBdG9taWNUcmFuc2FjdGlvbkJ1aWxkZXIgYW5kIHN1cHBvcnQgYm90aCBub3JtYWwgYW5kIHJlY292ZXJ5IHNpZ25pbmcgbW9kZXNcbn1cbiJdfQ==
@@ -0,0 +1,79 @@
1
+ /**
2
+ *
3
+ * This demonstrates the half-signing workflow for 2-of-3 multisig delegation transactions
4
+ */
5
+ /**
6
+ * Test accounts for half-signing workflow
7
+ * These are the actual keys used to create and sign the on-chain transaction
8
+ */
9
+ export declare const HALF_SIGN_TEST_ACCOUNTS: {
10
+ user: {
11
+ privateKey: string;
12
+ publicKey: string;
13
+ pChainAddress: string;
14
+ };
15
+ bitgo: {
16
+ privateKey: string;
17
+ publicKey: string;
18
+ pChainAddress: string;
19
+ };
20
+ backup: {
21
+ privateKey: string;
22
+ publicKey: string;
23
+ pChainAddress: string;
24
+ };
25
+ };
26
+ /**
27
+ * Transaction parameters for the multisig delegation
28
+ */
29
+ export declare const MULTISIG_DELEGATION_PARAMS: {
30
+ nodeID: string;
31
+ stakeAmount: string;
32
+ duration: number;
33
+ startTime: number;
34
+ endTime: number;
35
+ rewardAddress: string;
36
+ multisigAddresses: string[];
37
+ threshold: number;
38
+ };
39
+ /**
40
+ * Unsigned transaction hex (before any signatures)
41
+ * Built with sorted fromAddresses to match UTXO owner order
42
+ */
43
+ export declare const MULTISIG_DELEGATION_UNSIGNED_TX_HEX = "00000000001a0000007200000000000000000000000000000000000000000000000000000000000000000000000158734f94af871c3d131b56131b6fb7a0291eacadd261e69dfb42a9cdf6f7fddd000000070000000253e89cc00000000000000000000000010000000340c982503bb38f42bd88b8ba953281bca72fd0f16b50b020ff8556fc7f9f88efc17dad2c4fae01c7766cdb20a5bcd2dc7ff069d714911efd25c4aef700000001707288abed3b4da8d181ee2922ac55e1f269845583cf9adff0caee5fd47ddc3c0000000158734f94af871c3d131b56131b6fb7a0291eacadd261e69dfb42a9cdf6f7fddd0000000500002d7bdc49040000000002000000000000000100000000664b4924a25af8be5f07052b2c2e582f7c10a65400000000699c4cf00000000069aec1f000002d79883d200000000000000000000000000000000000000000000000000000000000000000000000000158734f94af871c3d131b56131b6fb7a0291eacadd261e69dfb42a9cdf6f7fddd0000000700002d79883d20000000000000000000000000010000000340c982503bb38f42bd88b8ba953281bca72fd0f16b50b020ff8556fc7f9f88efc17dad2c4fae01c7766cdb20a5bcd2dc7ff069d714911efd25c4aef70000000b0000000000000000000000010000000140c982503bb38f42bd88b8ba953281bca72fd0f1";
44
+ /**
45
+ * Half-signed transaction hex (signed by user key only)
46
+ * First signature slot filled, second slot empty
47
+ */
48
+ export declare const MULTISIG_DELEGATION_HALF_SIGNED_TX_HEX = "00000000001a0000007200000000000000000000000000000000000000000000000000000000000000000000000158734f94af871c3d131b56131b6fb7a0291eacadd261e69dfb42a9cdf6f7fddd000000070000000253e89cc00000000000000000000000010000000340c982503bb38f42bd88b8ba953281bca72fd0f16b50b020ff8556fc7f9f88efc17dad2c4fae01c7766cdb20a5bcd2dc7ff069d714911efd25c4aef700000001707288abed3b4da8d181ee2922ac55e1f269845583cf9adff0caee5fd47ddc3c0000000158734f94af871c3d131b56131b6fb7a0291eacadd261e69dfb42a9cdf6f7fddd0000000500002d7bdc49040000000002000000000000000100000000664b4924a25af8be5f07052b2c2e582f7c10a65400000000699c4cf00000000069aec1f000002d79883d200000000000000000000000000000000000000000000000000000000000000000000000000158734f94af871c3d131b56131b6fb7a0291eacadd261e69dfb42a9cdf6f7fddd0000000700002d79883d20000000000000000000000000010000000340c982503bb38f42bd88b8ba953281bca72fd0f16b50b020ff8556fc7f9f88efc17dad2c4fae01c7766cdb20a5bcd2dc7ff069d714911efd25c4aef70000000b0000000000000000000000010000000140c982503bb38f42bd88b8ba953281bca72fd0f1000000010000000900000002d488c1469bf92cfdeb2c164e1608f9c1bef4aec0b39fe33088a97b74268a908a579f079d56728dcfbda297b6f5c7792e26f109914b65ed974dcd1ad155cb61d3010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000";
49
+ /**
50
+ * Fully signed transaction hex (signed by both user and bitgo keys)
51
+ * This transaction was successfully broadcast to Coston2 testnet
52
+ */
53
+ export declare const MULTISIG_DELEGATION_FULLY_SIGNED_TX_HEX = "00000000001a0000007200000000000000000000000000000000000000000000000000000000000000000000000158734f94af871c3d131b56131b6fb7a0291eacadd261e69dfb42a9cdf6f7fddd000000070000000253e89cc00000000000000000000000010000000340c982503bb38f42bd88b8ba953281bca72fd0f16b50b020ff8556fc7f9f88efc17dad2c4fae01c7766cdb20a5bcd2dc7ff069d714911efd25c4aef700000001707288abed3b4da8d181ee2922ac55e1f269845583cf9adff0caee5fd47ddc3c0000000158734f94af871c3d131b56131b6fb7a0291eacadd261e69dfb42a9cdf6f7fddd0000000500002d7bdc49040000000002000000000000000100000000664b4924a25af8be5f07052b2c2e582f7c10a65400000000699c4cf00000000069aec1f000002d79883d200000000000000000000000000000000000000000000000000000000000000000000000000158734f94af871c3d131b56131b6fb7a0291eacadd261e69dfb42a9cdf6f7fddd0000000700002d79883d20000000000000000000000000010000000340c982503bb38f42bd88b8ba953281bca72fd0f16b50b020ff8556fc7f9f88efc17dad2c4fae01c7766cdb20a5bcd2dc7ff069d714911efd25c4aef70000000b0000000000000000000000010000000140c982503bb38f42bd88b8ba953281bca72fd0f1000000010000000900000002d488c1469bf92cfdeb2c164e1608f9c1bef4aec0b39fe33088a97b74268a908a579f079d56728dcfbda297b6f5c7792e26f109914b65ed974dcd1ad155cb61d30139507d355619359a57ce9f85b42c1d5daca3808db218513b45417f5c6bc1bc531bfefef6ae78309486fe114c6d64626b0ba619f453946a385dc8ff4a31b333b701";
54
+ /**
55
+ * On-chain transaction ID after broadcast
56
+ */
57
+ export declare const MULTISIG_DELEGATION_TX_ID = "2hGeGfU7vAi7aMWAGSc5RHfRBpum2LWhxqypv2uxQvZXVrnEA5";
58
+ /**
59
+ * Address sorting information for the 2-of-3 multisig wallet
60
+ * After lexicographic sorting by hex value, the addresses remain in the same order:
61
+ * 1. user (P-costwo1grycy5pmkw8590vghzaf2v5phjnjl583cmc3f5) - sorted index 0
62
+ * 2. bitgo (P-costwo1ddgtqg8ls4t0clul3rhuzldd9386uqw85nr98f) - sorted index 1
63
+ * 3. backup (P-costwo1wekdkg99hnfdcllsd8t3fyg7l5jufthhfysjgp) - sorted index 2
64
+ *
65
+ * Keys needed for signing (first 2 in sorted order for threshold=2):
66
+ * - user (original index 0, sorted index 0)
67
+ * - bitgo (original index 1, sorted index 1)
68
+ */
69
+ export declare const MULTISIG_ADDRESS_SORTING: {
70
+ original: string[];
71
+ sorted: string[];
72
+ addressesIndex: number[];
73
+ signingKeys: {
74
+ role: string;
75
+ originalIndex: number;
76
+ sortedIndex: number;
77
+ }[];
78
+ };
79
+ //# sourceMappingURL=multisigDelegationTx.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multisigDelegationTx.d.ts","sourceRoot":"","sources":["../../../../test/resources/transactionData/multisigDelegationTx.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;GAGG;AACH,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;CAgBnC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,0BAA0B;;;;;;;;;CAatC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,mCAAmC,y/BACw8B,CAAC;AAEz/B;;;GAGG;AACH,eAAO,MAAM,sCAAsC,qxCACiuC,CAAC;AAErxC;;;GAGG;AACH,eAAO,MAAM,uCAAuC,qxCACguC,CAAC;AAErxC;;GAEG;AACH,eAAO,MAAM,yBAAyB,uDAAuD,CAAC;AAE9F;;;;;;;;;;GAUG;AACH,eAAO,MAAM,wBAAwB;;;;;;;;;CAiBpC,CAAC"}