@bitgo/sdk-coin-flrp 1.6.0 → 1.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/flrp.d.ts +1 -1
- package/dist/src/flrp.d.ts.map +1 -1
- package/dist/src/flrp.js +3 -3
- package/dist/src/lib/ExportInCTxBuilder.d.ts.map +1 -1
- package/dist/src/lib/ExportInCTxBuilder.js +8 -6
- package/dist/src/lib/ExportInPTxBuilder.d.ts.map +1 -1
- package/dist/src/lib/ExportInPTxBuilder.js +23 -73
- package/dist/src/lib/ImportInCTxBuilder.d.ts +3 -3
- package/dist/src/lib/ImportInCTxBuilder.d.ts.map +1 -1
- package/dist/src/lib/ImportInCTxBuilder.js +89 -63
- package/dist/src/lib/ImportInPTxBuilder.d.ts.map +1 -1
- package/dist/src/lib/ImportInPTxBuilder.js +19 -72
- package/dist/src/lib/atomicTransactionBuilder.d.ts +21 -1
- package/dist/src/lib/atomicTransactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/atomicTransactionBuilder.js +84 -1
- package/dist/src/lib/transaction.d.ts.map +1 -1
- package/dist/src/lib/transaction.js +4 -3
- package/dist/src/lib/utils.d.ts +9 -6
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +11 -10
- package/dist/test/resources/transactionData/exportInC.d.ts.map +1 -1
- package/dist/test/resources/transactionData/exportInC.js +8 -3
- package/dist/test/resources/transactionData/exportInP.js +4 -4
- package/dist/test/resources/transactionData/importInC.js +6 -6
- package/dist/test/resources/transactionData/importInP.js +2 -2
- package/dist/test/unit/flrp.js +4 -7
- package/dist/test/unit/lib/exportInCTxBuilder.js +37 -11
- package/dist/test/unit/lib/exportInPTxBuilder.js +169 -1
- package/dist/test/unit/lib/importInCTxBuilder.js +354 -1
- package/dist/test/unit/lib/importInPTxBuilder.js +203 -3
- package/dist/test/unit/lib/signFlowTestSuit.d.ts.map +1 -1
- package/dist/test/unit/lib/signFlowTestSuit.js +1 -7
- package/dist/test/unit/lib/utils.js +46 -14
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +6 -6
|
@@ -153,5 +153,173 @@ describe('Flrp Export In P Tx Builder', () => {
|
|
|
153
153
|
err.message.should.be.equal('Private key cannot sign the transaction');
|
|
154
154
|
});
|
|
155
155
|
});
|
|
156
|
+
describe('on-chain verified transactions', () => {
|
|
157
|
+
it('should verify on-chain tx id for signed P-chain export', async () => {
|
|
158
|
+
const signedExportHex = '0x0000000000120000007200000000000000000000000000000000000000000000000000000000000000000000000158734f94af871c3d131b56131b6fb7a0291eacadd261e69dfb42a9cdf6f7fddd00000007000000001ac6e558000000000000000000000001000000033329be7d01cd3ebaae6654d7327dd9f17a2e15817e918a5e8083ae4c9f2f0ed77055c24bf3665001c7324437c96c7c8a6a152da2385c1db5c3ab1f9100000003862ce86ba2e28884e8b83f5d6266d274b33632a1cc213d4c12996037fc21b2020000000058734f94af871c3d131b56131b6fb7a0291eacadd261e69dfb42a9cdf6f7fddd00000005000000001d6c96c60000000100000000a4891dfbd024a53b8e4512427d919910568989b9b4846026ac7bcb8290494c260000000058734f94af871c3d131b56131b6fb7a0291eacadd261e69dfb42a9cdf6f7fddd0000000500000000003ffabc0000000100000000c1fb3b438f8f49e1bb657a59106be9f5f91d2efce5e0259fcbbb9458e271f80d0000000058734f94af871c3d131b56131b6fb7a0291eacadd261e69dfb42a9cdf6f7fddd000000050000000000400e7000000001000000000000000078db5c30bed04c05ce209179812850bbb3fe6d46d7eef3744d814c0da55524790000000158734f94af871c3d131b56131b6fb7a0291eacadd261e69dfb42a9cdf6f7fddd000000070000000002faf080000000000000000000000002000000033329be7d01cd3ebaae6654d7327dd9f17a2e15817e918a5e8083ae4c9f2f0ed77055c24bf3665001c7324437c96c7c8a6a152da2385c1db5c3ab1f91000000030000000900000001afdf0ac2bdbfb1735081dd859f4d263e587d81ba81c6bd2cb345ee5a66cef4e97a634c740f35ef6ba600796a5add1d91e69a14cfcb22b65e6ae0bcdfbcebfaba000000000900000001afdf0ac2bdbfb1735081dd859f4d263e587d81ba81c6bd2cb345ee5a66cef4e97a634c740f35ef6ba600796a5add1d91e69a14cfcb22b65e6ae0bcdfbcebfaba000000000900000001afdf0ac2bdbfb1735081dd859f4d263e587d81ba81c6bd2cb345ee5a66cef4e97a634c740f35ef6ba600796a5add1d91e69a14cfcb22b65e6ae0bcdfbcebfaba00';
|
|
159
|
+
const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tflrp')).from(signedExportHex);
|
|
160
|
+
const tx = await txBuilder.build();
|
|
161
|
+
const rawTx = tx.toBroadcastFormat();
|
|
162
|
+
rawTx.should.equal(signedExportHex);
|
|
163
|
+
tx.id.should.equal('ka8at5CinmpUc6QMVr33dyUJi156LKMdodrJM59kS6EWr3vHg');
|
|
164
|
+
});
|
|
165
|
+
it('should FAIL with unsorted UTXO addresses - demonstrates AddressMap mismatch issue for export in P-chain tx', async () => {
|
|
166
|
+
// This test uses UTXO addresses in UNSORTED order to demonstrate the issue.
|
|
167
|
+
// With unsorted addresses, the current implementation will create AddressMaps incorrectly
|
|
168
|
+
// because it uses sorted addresses, not UTXO address order.
|
|
169
|
+
//
|
|
170
|
+
// Expected: AddressMap should map addresses to signature slots based on UTXO order (sigIndicies)
|
|
171
|
+
// Current (WRONG): AddressMap uses sorted addresses with sequential slots
|
|
172
|
+
//
|
|
173
|
+
// This test WILL FAIL with current implementation because AddressMaps don't match sigIndicies
|
|
174
|
+
// UTXO addresses in UNSORTED order (different from sorted)
|
|
175
|
+
// Sorted would be: [0x12cb... (smallest), 0xa6e0... (middle), 0xc386... (largest)]
|
|
176
|
+
// Unsorted: [0xc386... (largest), 0x12cb... (smallest), 0xa6e0... (middle)]
|
|
177
|
+
const unsortedUtxoAddresses = [
|
|
178
|
+
'0xc386d58d09a9ae77cf1cf07bf1c9de44ebb0c9f3', // Largest (would be index 2 if sorted)
|
|
179
|
+
'0x12cb32eaf92553064db98d271b56cba079ec78f5', // Smallest (would be index 0 if sorted)
|
|
180
|
+
'0xa6e0c1abd0132f70efb77e2274637ff336a29a57', // Middle (would be index 1 if sorted)
|
|
181
|
+
];
|
|
182
|
+
// Corresponding P-chain addresses (in same order as UTXO)
|
|
183
|
+
const pAddresses = [
|
|
184
|
+
'P-costwo15msvr27szvhhpmah0c38gcml7vm29xjh7tcek8', // Maps to 0xc386... (UTXO index 0)
|
|
185
|
+
'P-costwo1zt9n96hey4fsvnde35n3k4kt5pu7c784dzewzd', // Maps to 0x12cb... (UTXO index 1)
|
|
186
|
+
'P-costwo1cwrdtrgf4xh80ncu7palrjw7gn4mpj0n4dxghh', // Maps to 0xa6e0... (UTXO index 2)
|
|
187
|
+
];
|
|
188
|
+
// Create UTXO with UNSORTED addresses
|
|
189
|
+
// Amount must cover export amount + fee
|
|
190
|
+
const exportAmount = '50000000';
|
|
191
|
+
const fee = '1261000';
|
|
192
|
+
const utxoAmount = (BigInt(exportAmount) + BigInt(fee)).toString(); // amount + fee
|
|
193
|
+
const utxo = {
|
|
194
|
+
outputID: 0,
|
|
195
|
+
amount: utxoAmount,
|
|
196
|
+
txid: 'zstyYq5riDKYDSR3fUYKKkuXKJ1aJCe8WNrXKqEBJD4CGwzFw',
|
|
197
|
+
outputidx: '0',
|
|
198
|
+
addresses: unsortedUtxoAddresses, // UNSORTED order
|
|
199
|
+
threshold: 2,
|
|
200
|
+
};
|
|
201
|
+
// Build transaction
|
|
202
|
+
const txBuilder = factory
|
|
203
|
+
.getExportInPBuilder()
|
|
204
|
+
.threshold(2)
|
|
205
|
+
.locktime(0)
|
|
206
|
+
.fromPubKey(pAddresses)
|
|
207
|
+
.externalChainId(exportInP_1.EXPORT_IN_P.sourceChainId)
|
|
208
|
+
.amount(exportAmount)
|
|
209
|
+
.fee(fee)
|
|
210
|
+
.utxos([utxo]);
|
|
211
|
+
// Build unsigned transaction
|
|
212
|
+
const unsignedTx = await txBuilder.build();
|
|
213
|
+
const unsignedHex = unsignedTx.toBroadcastFormat();
|
|
214
|
+
// Parse it back to inspect AddressMaps and sigIndicies
|
|
215
|
+
const parsedBuilder = factory.from(unsignedHex);
|
|
216
|
+
const parsedTx = await parsedBuilder.build();
|
|
217
|
+
const flareTx = parsedTx._flareTransaction;
|
|
218
|
+
// Get the input to check sigIndicies
|
|
219
|
+
const exportTx = flareTx.tx;
|
|
220
|
+
const input = exportTx.baseTx.inputs[0];
|
|
221
|
+
const transferInput = input.input;
|
|
222
|
+
const sigIndicies = transferInput.sigIndicies();
|
|
223
|
+
// sigIndicies tells us: sigIndicies[slotIndex] = utxoAddressIndex
|
|
224
|
+
// For threshold=2, we need signatures for first 2 addresses in UTXO order
|
|
225
|
+
// UTXO order: [0xc386... (index 0), 0x12cb... (index 1), 0xa6e0... (index 2)]
|
|
226
|
+
// So sigIndicies should be [0, 1] meaning: slot 0 = UTXO index 0, slot 1 = UTXO index 1
|
|
227
|
+
// Verify sigIndicies are [0, 1] (first 2 addresses in UTXO order, NOT sorted order)
|
|
228
|
+
sigIndicies.length.should.equal(2);
|
|
229
|
+
sigIndicies[0].should.equal(0, 'First signature slot should be UTXO address index 0 (0xc386...)');
|
|
230
|
+
sigIndicies[1].should.equal(1, 'Second signature slot should be UTXO address index 1 (0x12cb...)');
|
|
231
|
+
// The critical test: Verify that signature slots have embedded addresses based on UTXO order
|
|
232
|
+
// With unsorted UTXO addresses, this will FAIL if AddressMaps don't match UTXO order
|
|
233
|
+
//
|
|
234
|
+
// sigIndicies tells us: sigIndicies[slotIndex] = utxoAddressIndex
|
|
235
|
+
// For threshold=2, we need signatures for first 2 addresses in UTXO order
|
|
236
|
+
// UTXO order: [0xc386... (index 0), 0x12cb... (index 1), 0xa6e0... (index 2)]
|
|
237
|
+
// So sigIndicies should be [0, 1] meaning: slot 0 = UTXO index 0, slot 1 = UTXO index 1
|
|
238
|
+
// Parse the credential to see which slots have which embedded addresses
|
|
239
|
+
const credential = flareTx.credentials[0];
|
|
240
|
+
const signatures = credential.getSignatures();
|
|
241
|
+
// Helper function to check if signature has embedded address (same logic as transaction.ts)
|
|
242
|
+
const testUtils2 = require('../../../src/lib/utils').default;
|
|
243
|
+
const isEmptySignature = (signature) => {
|
|
244
|
+
return !!signature && testUtils2.removeHexPrefix(signature).startsWith('0'.repeat(90));
|
|
245
|
+
};
|
|
246
|
+
const hasEmbeddedAddress = (signature) => {
|
|
247
|
+
if (!isEmptySignature(signature))
|
|
248
|
+
return false;
|
|
249
|
+
const cleanSig = testUtils2.removeHexPrefix(signature);
|
|
250
|
+
if (cleanSig.length < 130)
|
|
251
|
+
return false;
|
|
252
|
+
const embeddedPart = cleanSig.substring(90, 130);
|
|
253
|
+
// Check if embedded part is not all zeros
|
|
254
|
+
return embeddedPart !== '0'.repeat(40);
|
|
255
|
+
};
|
|
256
|
+
// Extract embedded addresses from signature slots
|
|
257
|
+
const embeddedAddresses = [];
|
|
258
|
+
signatures.forEach((sig, slotIndex) => {
|
|
259
|
+
if (hasEmbeddedAddress(sig)) {
|
|
260
|
+
// Extract embedded address (after position 90, 40 chars = 20 bytes)
|
|
261
|
+
const cleanSig = testUtils2.removeHexPrefix(sig);
|
|
262
|
+
const embeddedAddr = cleanSig.substring(90, 130).toLowerCase();
|
|
263
|
+
embeddedAddresses[slotIndex] = '0x' + embeddedAddr;
|
|
264
|
+
}
|
|
265
|
+
});
|
|
266
|
+
// Verify: Credentials only embed ONE address (user/recovery), not both
|
|
267
|
+
// The embedded address should be based on addressesIndex logic, not sorted order
|
|
268
|
+
//
|
|
269
|
+
// Compute addressesIndex to determine expected signature order
|
|
270
|
+
const utxoAddressBytes = unsortedUtxoAddresses.map((addr) => testUtils2.parseAddress(addr));
|
|
271
|
+
const pAddressBytes = pAddresses.map((addr) => testUtils2.parseAddress(addr));
|
|
272
|
+
const addressesIndex = [];
|
|
273
|
+
pAddressBytes.forEach((pAddr) => {
|
|
274
|
+
const utxoIndex = utxoAddressBytes.findIndex((uAddr) => Buffer.compare(Buffer.from(uAddr), Buffer.from(pAddr)) === 0);
|
|
275
|
+
addressesIndex.push(utxoIndex);
|
|
276
|
+
});
|
|
277
|
+
// firstIndex = 0 (user), bitgoIndex = 1
|
|
278
|
+
const firstIndex = 0;
|
|
279
|
+
const bitgoIndex = 1;
|
|
280
|
+
// Determine expected signature order based on addressesIndex
|
|
281
|
+
const userComesFirst = addressesIndex[bitgoIndex] > addressesIndex[firstIndex];
|
|
282
|
+
// Expected credential structure:
|
|
283
|
+
// - If user comes first: [userAddress, zeros]
|
|
284
|
+
// - If bitgo comes first: [zeros, userAddress]
|
|
285
|
+
const userAddressHex = Buffer.from(pAddressBytes[firstIndex]).toString('hex').toLowerCase();
|
|
286
|
+
const expectedUserAddr = '0x' + userAddressHex;
|
|
287
|
+
if (userComesFirst) {
|
|
288
|
+
// Expected: [userAddress, zeros]
|
|
289
|
+
// Slot 0 should have user address (pAddr0 = 0xc386... = UTXO index 0)
|
|
290
|
+
if (embeddedAddresses[0]) {
|
|
291
|
+
embeddedAddresses[0]
|
|
292
|
+
.toLowerCase()
|
|
293
|
+
.should.equal(expectedUserAddr, `Slot 0 should have user address (${expectedUserAddr}) because user comes first in UTXO order`);
|
|
294
|
+
}
|
|
295
|
+
else {
|
|
296
|
+
throw new Error(`Slot 0 should have embedded user address, but is empty`);
|
|
297
|
+
}
|
|
298
|
+
// Slot 1 should be zeros (no embedded address)
|
|
299
|
+
if (embeddedAddresses[1]) {
|
|
300
|
+
throw new Error(`Slot 1 should be zeros, but has embedded address: ${embeddedAddresses[1]}`);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
else {
|
|
304
|
+
// Expected: [zeros, userAddress]
|
|
305
|
+
// Slot 0 should be zeros
|
|
306
|
+
if (embeddedAddresses[0]) {
|
|
307
|
+
throw new Error(`Slot 0 should be zeros, but has embedded address: ${embeddedAddresses[0]}`);
|
|
308
|
+
}
|
|
309
|
+
// Slot 1 should have user address
|
|
310
|
+
if (embeddedAddresses[1]) {
|
|
311
|
+
embeddedAddresses[1]
|
|
312
|
+
.toLowerCase()
|
|
313
|
+
.should.equal(expectedUserAddr, `Slot 1 should have user address (${expectedUserAddr}) because bitgo comes first in UTXO order`);
|
|
314
|
+
}
|
|
315
|
+
else {
|
|
316
|
+
throw new Error(`Slot 1 should have embedded user address, but is empty`);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
// The key verification: AddressMaps should match the credential order
|
|
320
|
+
// With the fix, AddressMaps are created using the same addressesIndex logic as credentials
|
|
321
|
+
// This ensures signing works correctly even with unsorted UTXO addresses
|
|
322
|
+
});
|
|
323
|
+
});
|
|
156
324
|
});
|
|
157
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwb3J0SW5QVHhCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L2xpYi9leHBvcnRJblBUeEJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsa0JBQWdCO0FBQ2hCLHlFQUltRDtBQUNuRCwwQ0FBMEY7QUFDMUYsNENBQXFEO0FBQ3JELDBFQUE4QztBQUU5QyxRQUFRLENBQUMsNkJBQTZCLEVBQUUsR0FBRyxFQUFFO0lBQzNDLE1BQU0sVUFBVSxHQUFHLGVBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdEMsTUFBTSxPQUFPLEdBQUcsSUFBSSwrQkFBeUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUUxRCxRQUFRLENBQUMsYUFBYSxFQUFFLEdBQUcsRUFBRTtRQUMzQixNQUFNLFNBQVMsR0FBSSxVQUFVLENBQUMsT0FBd0IsQ0FBQyxLQUFLLENBQUM7UUFFN0QsRUFBRSxDQUFDLHlEQUF5RCxFQUFFLEdBQUcsRUFBRTtZQUNqRSxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUNoRCw0REFBNEQ7WUFDNUQsTUFBTSxXQUFXLEdBQUksU0FBaUIsQ0FBQyxXQUFXLENBQUM7WUFDbkQsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMvQyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyw0REFBNEQsRUFBRSxLQUFLLElBQUksRUFBRTtZQUMxRSxrRUFBa0U7WUFDbEUsTUFBTSxNQUFNLEdBQUcsV0FBVyxDQUFDLENBQUMsVUFBVTtZQUN0QyxNQUFNLFVBQVUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLG9CQUFvQjtZ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QUMsZUFBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyx1QkFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQy9GLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsdUJBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2pELFNBQVM7YUFDTixLQUFLLEVBQUU7YUFDUCxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsZ0JBQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7YUFDdEMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDYixHQUFHLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLHlDQUF5QyxDQUFDLENBQUM7UUFDekUsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0ICdzaG91bGQnO1xuaW1wb3J0IHtcbiAgRVhQT1JUX0lOX1AgYXMgdGVzdERhdGEsXG4gIEVYUE9SVF9JTl9QX1RXT19VVFhPUyBhcyB0d29VdHhvVGVzdERhdGEsXG4gIEVYUE9SVF9JTl9QX05PX0NIQU5HRSBhcyBub0NoYW5nZVRlc3REYXRhLFxufSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvdHJhbnNhY3Rpb25EYXRhL2V4cG9ydEluUCc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5LCBEZWNvZGVkVXR4b09iaiwgVHJhbnNhY3Rpb24gfSBmcm9tICcuLi8uLi8uLi9zcmMvbGliJztcbmltcG9ydCB7IGNvaW5zLCBGbGFyZU5ldHdvcmsgfSBmcm9tICdAYml0Z28vc3RhdGljcyc7XG5pbXBvcnQgc2lnbkZsb3dUZXN0IGZyb20gJy4vc2lnbkZsb3dUZXN0U3VpdCc7XG5cbmRlc2NyaWJlKCdGbHJwIEV4cG9ydCBJbiBQIFR4IEJ1aWxkZXInLCAoKSA9PiB7XG4gIGNvbnN0IGNvaW5Db25maWcgPSBjb2lucy5nZXQoJ3RmbHJwJyk7XG4gIGNvbnN0IGZhY3RvcnkgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2luQ29uZmlnKTtcblxuICBkZXNjcmliZSgnZGVmYXVsdCBmZWUnLCAoKSA9PiB7XG4gICAgY29uc3QgRklYRURfRkVFID0gKGNvaW5Db25maWcubmV0d29yayBhcyBGbGFyZU5ldHdvcmspLnR4RmVlO1xuXG4gICAgaXQoJ3Nob3VsZCBzZXQgZml4ZWRGZWUgKDEwMDAwMDApIGJ5IGRlZmF1bHQgaW4gY29uc3RydWN0b3InLCAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldEV4cG9ydEluUEJ1aWxkZXIoKTtcbiAgICAgIC8vIFRoZSBmaXhlZEZlZSBzaG91bGQgYmUgc2V0IGZyb20gbmV0d29yay50eEZlZSA9ICcxMDAwMDAwJ1xuICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSAodHhCdWlsZGVyIGFzIGFueSkudHJhbnNhY3Rpb247XG4gICAgICB0cmFuc2FjdGlvbi5fZmVlLmZlZS5zaG91bGQuZXF1YWwoRklYRURfRkVFKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdXNlIGRlZmF1bHQgZml4ZWRGZWUgd2hlbiBmZWUgaXMgbm90IGV4cGxpY2l0bHkgc2V0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gQ3JlYXRlIGEgVVRYTyB3aXRoIGVub3VnaCBiYWxhbmNlIHRvIGNvdmVyIGFtb3VudCArIGRlZmF1bHQgZmVlXG4gICAgICBjb25zdCBhbW91bnQgPSAnNTAwMDAwMDAwJzsgLy8gMC41IEZMUlxuICAgICAgY29uc3QgdXR4b0Ftb3VudCA9IChCaWdJbnQoYW1vdW50KSArIEJpZ0ludChGSVhFRF9GRUUpKS50b1N0cmluZygpOyAvLyBhbW91bnQgKyBmaXhlZEZlZVxuXG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5XG4gICAgICAgIC5nZXRFeHBvcnRJblBCdWlsZGVyKClcbiAgICAgICAgLnRocmVzaG9sZCh0ZXN0RGF0YS50aHJlc2hvbGQpXG4gICAgICAgIC5sb2NrdGltZSh0ZXN0RGF0YS5sb2NrdGltZSlcbiAgICAgICAgLmZyb21QdWJLZXkodGVzdERhdGEucEFkZHJlc3NlcylcbiAgICAgICAgLmFtb3VudChhbW91bnQpXG4gICAgICAgIC5leHRlcm5hbENoYWluSWQodGVzdERhdGEuc291cmNlQ2hhaW5JZClcbiAgICAgICAgLy8gTk9URTogLmZlZSgpIGlzIE5PVCBjYWxsZWQgLSBzaG91bGQgdXNlIGRlZmF1bHQgZml4ZWRGZWVcbiAgICAgICAgLnV0eG9zKFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBvdXRwdXRJRDogMCxcbiAgICAgICAgICAgIGFtb3VudDogdXR4b0Ftb3VudCxcbiAgICAgICAgICAgIHR4aWQ6ICcyMWhjRDY0TjlRemRheVBqaEtMc0JRQmE4RnlYY3NKR05TdEJaM3ZDUmRDQ0VzTHJ1MicsXG4gICAgICAgICAgICBvdXRwdXRpZHg6ICcwJyxcbiAgICAgICAgICAgIGFkZHJlc3NlczogdGVzdERhdGEub3V0cHV0c1swXS5hZGRyZXNzZXMsXG4gICAgICAgICAgICB0aHJlc2hvbGQ6IHRlc3REYXRhLnRocmVzaG9sZCxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcblxuICAgICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuXG4gICAgICAvLyBWZXJpZnkgdGhlIGZlZSBpbiB0aGUgYnVpbHQgdHJhbnNhY3Rpb24gZXF1YWxzIHRoZSBmaXhlZEZlZVxuICAgICAgdHguZmVlLmZlZS5zaG91bGQuZXF1YWwoRklYRURfRkVFKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3ZhbGlkYXRlIHR4QnVpbGRlciBmaWVsZHMnLCAoKSA9PiB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRFeHBvcnRJblBCdWlsZGVyKCk7XG4gICAgaXQoJ3Nob3VsZCBmYWlsIGFtb3VudCBsb3cgdGhhbiB6ZXJvJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHR4QnVpbGRlci5hbW91bnQoJy0xJyk7XG4gICAgICAgIH0sXG4gICAgICAgIChlOiBhbnkpID0+IGUubWVzc2FnZSA9PT0gJ0Ftb3VudCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwJ1xuICAgICAgKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIGZhaWwgdGFyZ2V0IGNoYWluIGlkIGxlbmd0aCBpbmNvcnJlY3QnLCAoKSA9PiB7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdHhCdWlsZGVyLmV4dGVybmFsQ2hhaW5JZChCdWZmZXIuZnJvbSh0ZXN0RGF0YS5JTlZBTElEX0NIQUlOX0lELnNsaWNlKDIpKSk7XG4gICAgICAgIH0sXG4gICAgICAgIChlOiBhbnkpID0+IGUubWVzc2FnZSA9PT0gJ0NoYWluIGlkIGFyZSAzMiBieXRlIHNpemUnXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHRhcmdldCBjaGFpbiBpZCBub3QgYSB2YWxpZCBiYXNlNTggc3RyaW5nJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHR4QnVpbGRlci5leHRlcm5hbENoYWluSWQodGVzdERhdGEuSU5WQUxJRF9DSEFJTl9JRCk7XG4gICAgICAgIH0sXG4gICAgICAgIChlOiBhbnkpID0+IGUubWVzc2FnZSA9PT0gJ05vbi1iYXNlNTggY2hhcmFjdGVyJ1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB0YXJnZXQgY2hhaW4gaWQgY2I1OCBpbnZhbGlkIGNoZWNrc3VtJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHR4QnVpbGRlci5leHRlcm5hbENoYWluSWQodGVzdERhdGEuVkFMSURfQ19DSEFJTl9JRC5zbGljZSgyKSk7XG4gICAgICAgIH0sXG4gICAgICAgIChlOiBhbnkpID0+IGUubWVzc2FnZSA9PT0gJ0ludmFsaWQgY2hlY2tzdW0nXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHZhbGlkYXRlIFV0eG9zIGVtcHR5IHN0cmluZycsICgpID0+IHtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0eEJ1aWxkZXIudmFsaWRhdGVVdHhvcyhbXSk7XG4gICAgICAgIH0sXG4gICAgICAgIChlOiBhbnkpID0+IGUubWVzc2FnZSA9PT0gJ1VUWE9zIGFycmF5IGNhbm5vdCBiZSBlbXB0eSdcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdmFsaWRhdGUgVXR4b3Mgd2l0aG91dCBhbW91bnQgZmllbGQnLCAoKSA9PiB7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdHhCdWlsZGVyLnZhbGlkYXRlVXR4b3MoW3sgb3V0cHV0SUQ6ICcnIH0gYXMgYW55IGFzIERlY29kZWRVdHhvT2JqXSk7XG4gICAgICAgIH0sXG4gICAgICAgIChlOiBhbnkpID0+IGUubWVzc2FnZSA9PT0gJ1VUWE8gbWlzc2luZyByZXF1aXJlZCBmaWVsZDogYW1vdW50J1xuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgc2lnbkZsb3dUZXN0KHtcbiAgICB0cmFuc2FjdGlvblR5cGU6ICdFeHBvcnQgUDJDIHdpdGggY2hhbmdlb3V0cHV0JyxcbiAgICBuZXdUeEZhY3Rvcnk6ICgpID0+IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGZscnAnKSksXG4gICAgbmV3VHhCdWlsZGVyOiAoKSA9PlxuICAgICAgbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0ZmxycCcpKVxuICAgICAgICAuZ2V0RXhwb3J0SW5QQnVpbGRlcigpXG4gICAgICAgIC50aHJlc2hvbGQodGVzdERhdGEudGhyZXNob2xkKVxuICAgICAgICAubG9ja3RpbWUodGVzdERhdGEubG9ja3RpbWUpXG4gICAgICAgIC5mcm9tUHViS2V5KHRlc3REYXRhLnBBZGRyZXNzZXMpXG4gICAgICAgIC5hbW91bnQodGVzdERhdGEuYW1vdW50KVxuICAgICAgICAuZXh0ZXJuYWxDaGFpbklkKHRlc3REYXRhLnNvdXJjZUNoYWluSWQpXG4gICAgICAgIC5mZWUodGVzdERhdGEuZmVlKVxuICAgICAgICAudXR4b3ModGVzdERhdGEub3V0cHV0cyksXG4gICAgdW5zaWduZWRUeEhleDogdGVzdERhdGEudW5zaWduZWRIZXgsXG4gICAgaGFsZlNpZ25lZFR4SGV4OiB0ZXN0RGF0YS5oYWxmU2lnbnR4SGV4LFxuICAgIGZ1bGxTaWduZWRUeEhleDogdGVzdERhdGEuZnVsbFNpZ250eEhleCxcbiAgICBwcml2YXRlS2V5OiB7XG4gICAgICBwcnYxOiB0ZXN0RGF0YS5wcml2YXRlS2V5c1swXSxcbiAgICAgIHBydjI6IHRlc3REYXRhLnByaXZhdGVLZXlzWzFdLFxuICAgIH0sXG4gICAgdHhIYXNoOiB0ZXN0RGF0YS50eGhhc2gsXG4gIH0pO1xuXG4gIHNpZ25GbG93VGVzdCh7XG4gICAgdHJhbnNhY3Rpb25UeXBlOiAnRXhwb3J0IFAyQyB3aXRoIDIgVVRYT3MnLFxuICAgIG5ld1R4RmFjdG9yeTogKCkgPT4gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0ZmxycCcpKSxcbiAgICBuZXdUeEJ1aWxkZXI6ICgpID0+XG4gICAgICBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RmbHJwJykpXG4gICAgICAgIC5nZXRFeHBvcnRJblBCdWlsZGVyKClcbiAgICAgICAgLnRocmVzaG9sZCh0d29VdHhvVGVzdERhdGEudGhyZXNob2xkKVxuICAgICAgICAubG9ja3RpbWUodHdvVXR4b1Rlc3REYXRhLmxvY2t0aW1lKVxuICAgICAgICAuZnJvbVB1YktleSh0d29VdHhvVGVzdERhdGEucEFkZHJlc3NlcylcbiAgICAgICAgLmFtb3VudCh0d29VdHhvVGVzdERhdGEuYW1vdW50KVxuICAgICAgICAuZXh0ZXJuYWxDaGFpbklkKHR3b1V0eG9UZXN0RGF0YS5zb3VyY2VDaGFpbklkKVxuICAgICAgICAuZmVlKHR3b1V0eG9UZXN0RGF0YS5mZWUpXG4gICAgICAgIC51dHhvcyh0d29VdHhvVGVzdERhdGEub3V0cHV0cyksXG4gICAgdW5zaWduZWRUeEhleDogdHdvVXR4b1Rlc3REYXRhLnVuc2lnbmVkSGV4LFxuICAgIGhhbGZTaWduZWRUeEhleDogdHdvVXR4b1Rlc3REYXRhLmhhbGZTaWdudHhIZXgsXG4gICAgZnVsbFNpZ25lZFR4SGV4OiB0d29VdHhvVGVzdERhdGEuZnVsbFNpZ250eEhleCxcbiAgICBwcml2YXRlS2V5OiB7XG4gICAgICBwcnYxOiB0d29VdHhvVGVzdERhdGEucHJpdmF0ZUtleXNbMF0sXG4gICAgICBwcnYyOiB0d29VdHhvVGVzdERhdGEucHJpdmF0ZUtleXNbMV0sXG4gICAgfSxcbiAgICB0eEhhc2g6IHR3b1V0eG9UZXN0RGF0YS50eGhhc2gsXG4gIH0pO1xuXG4gIHNpZ25GbG93VGVzdCh7XG4gICAgdHJhbnNhY3Rpb25UeXBlOiAnRXhwb3J0IFAyQyB3aXRoIG5vIGNoYW5nZSBvdXRwdXQnLFxuICAgIG5ld1R4RmFjdG9yeTogKCkgPT4gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0ZmxycCcpKSxcbiAgICBuZXdUeEJ1aWxkZXI6ICgpID0+XG4gICAgICBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RmbHJwJykpXG4gICAgICAgIC5nZXRFeHBvcnRJblBCdWlsZGVyKClcbiAgICAgICAgLnRocmVzaG9sZChub0NoYW5nZVRlc3REYXRhLnRocmVzaG9sZClcbiAgICAgICAgLmxvY2t0aW1lKG5vQ2hhbmdlVGVzdERhdGEubG9ja3RpbWUpXG4gICAgICAgIC5mcm9tUHViS2V5KG5vQ2hhbmdlVGVzdERhdGEucEFkZHJlc3NlcylcbiAgICAgICAgLmFtb3VudChub0NoYW5nZVRlc3REYXRhLmFtb3VudClcbiAgICAgICAgLmV4dGVybmFsQ2hhaW5JZChub0NoYW5nZVRlc3REYXRhLnNvdXJjZUNoYWluSWQpXG4gICAgICAgIC5mZWUobm9DaGFuZ2VUZXN0RGF0YS5mZWUpXG4gICAgICAgIC51dHhvcyhub0NoYW5nZVRlc3REYXRhLm91dHB1dHMpLFxuICAgIHVuc2lnbmVkVHhIZXg6IG5vQ2hhbmdlVGVzdERhdGEudW5zaWduZWRIZXgsXG4gICAgaGFsZlNpZ25lZFR4SGV4OiBub0NoYW5nZVRlc3REYXRhLmhhbGZTaWdudHhIZXgsXG4gICAgZnVsbFNpZ25lZFR4SGV4OiBub0NoYW5nZVRlc3REYXRhLmZ1bGxTaWdudHhIZXgsXG4gICAgcHJpdmF0ZUtleToge1xuICAgICAgcHJ2MTogbm9DaGFuZ2VUZXN0RGF0YS5wcml2YXRlS2V5c1swXSxcbiAgICAgIHBydjI6IG5vQ2hhbmdlVGVzdERhdGEucHJpdmF0ZUtleXNbMV0sXG4gICAgfSxcbiAgICB0eEhhc2g6IG5vQ2hhbmdlVGVzdERhdGEudHhoYXNoLFxuICB9KTtcblxuICBpdCgnU2hvdWxkIGZ1bGwgc2lnbiBhIGV4cG9ydCB0eCBmcm9tIHVuc2lnbmVkIHJhdyB0eCcsICgpID0+IHtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RmbHJwJykpLmZyb20odGVzdERhdGEudW5zaWduZWRIZXgpO1xuICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5wcml2YXRlS2V5c1swXSB9KTtcbiAgICB0eEJ1aWxkZXJcbiAgICAgIC5idWlsZCgpXG4gICAgICAudGhlbigoKSA9PiBhc3NlcnQuZmFpbCgnaXQgY2FuIHNpZ24nKSlcbiAgICAgIC5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgIGVyci5tZXNzYWdlLnNob3VsZC5iZS5lcXVhbCgnUHJpdmF0ZSBrZXkgY2Fubm90IHNpZ24gdGhlIHRyYW5zYWN0aW9uJyk7XG4gICAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
|
|
325
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwb3J0SW5QVHhCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L2xpYi9leHBvcnRJblBUeEJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsa0JBQWdCO0FBQ2hCLHlFQUltRDtBQUNuRCwwQ0FBMEY7QUFDMUYsNENBQXFEO0FBQ3JELDBFQUE4QztBQUU5QyxRQUFRLENBQUMsNkJBQTZCLEVBQUUsR0FBRyxFQUFFO0lBQzNDLE1BQU0sVUFBVSxHQUFHLGVBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdEMsTUFBTSxPQUFPLEdBQUcsSUFBSSwrQkFBeUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUUxRCxRQUFRLENBQUMsYUFBYSxFQUFFLEdBQUcsRUFBRTtRQUMzQixNQUFNLFNBQVMsR0FBSSxVQUFVLENBQUMsT0FBd0IsQ0FBQyxLQUFLLENBQUM7UUFFN0QsRUFBRSxDQUFDLHlEQUF5RCxFQUFFLEdBQUcsRUFBRTtZQUNqRSxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUNoRCw0REFBNEQ7WUFDNUQsTUFBTSxXQUFXLEdBQUksU0FBaUIsQ0FBQyxXQUFXLENBQUM7WUFDbkQsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMvQyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyw0REFBNEQsRUFBRSxLQUFLLElBQUksRUFBRTtZQUMxRSxrRUFBa0U7WUFDbEUsTUFBTSxNQUFNLEdBQUcsV0FBVyxDQUFDLENBQUMsVUFBVTtZQUN0QyxNQUFNLFVBQVUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLG9CQUFvQjtZ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QyxFQUFFLENBQUMsQ0FBQztnQkFDL0YsQ0FBQztnQkFDRCxrQ0FBa0M7Z0JBQ2xDLElBQUksaUJBQWlCLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQkFDekIsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO3lCQUNqQixXQUFXLEVBQUU7eUJBQ2IsTUFBTSxDQUFDLEtBQUssQ0FDWCxnQkFBZ0IsRUFDaEIsb0NBQW9DLGdCQUFnQiwyQ0FBMkMsQ0FDaEcsQ0FBQztnQkFDTixDQUFDO3FCQUFNLENBQUM7b0JBQ04sTUFBTSxJQUFJLEtBQUssQ0FBQyx3REFBd0QsQ0FBQyxDQUFDO2dCQUM1RSxDQUFDO1lBQ0gsQ0FBQztZQUVELHNFQUFzRTtZQUN0RSwyRkFBMkY7WUFDM0YseUVBQXlFO1FBQzNFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCAnc2hvdWxkJztcbmltcG9ydCB7XG4gIEVYUE9SVF9JTl9QIGFzIHRlc3REYXRhLFxuICBFWFBPUlRfSU5fUF9UV09fVVRYT1MgYXMgdHdvVXR4b1Rlc3REYXRhLFxuICBFWFBPUlRfSU5fUF9OT19DSEFOR0UgYXMgbm9DaGFuZ2VUZXN0RGF0YSxcbn0gZnJvbSAnLi4vLi4vcmVzb3VyY2VzL3RyYW5zYWN0aW9uRGF0YS9leHBvcnRJblAnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeSwgRGVjb2RlZFV0eG9PYmosIFRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vLi4vLi4vc3JjL2xpYic7XG5pbXBvcnQgeyBjb2lucywgRmxhcmVOZXR3b3JrIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuaW1wb3J0IHNpZ25GbG93VGVzdCBmcm9tICcuL3NpZ25GbG93VGVzdFN1aXQnO1xuXG5kZXNjcmliZSgnRmxycCBFeHBvcnQgSW4gUCBUeCBCdWlsZGVyJywgKCkgPT4ge1xuICBjb25zdCBjb2luQ29uZmlnID0gY29pbnMuZ2V0KCd0ZmxycCcpO1xuICBjb25zdCBmYWN0b3J5ID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbkNvbmZpZyk7XG5cbiAgZGVzY3JpYmUoJ2RlZmF1bHQgZmVlJywgKCkgPT4ge1xuICAgIGNvbnN0IEZJWEVEX0ZFRSA9IChjb2luQ29uZmlnLm5ldHdvcmsgYXMgRmxhcmVOZXR3b3JrKS50eEZlZTtcblxuICAgIGl0KCdzaG91bGQgc2V0IGZpeGVkRmVlICgxMDAwMDAwKSBieSBkZWZhdWx0IGluIGNvbnN0cnVjdG9yJywgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRFeHBvcnRJblBCdWlsZGVyKCk7XG4gICAgICAvLyBUaGUgZml4ZWRGZWUgc2hvdWxkIGJlIHNldCBmcm9tIG5ldHdvcmsudHhGZWUgPSAnMTAwMDAwMCdcbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gKHR4QnVpbGRlciBhcyBhbnkpLnRyYW5zYWN0aW9uO1xuICAgICAgdHJhbnNhY3Rpb24uX2ZlZS5mZWUuc2hvdWxkLmVxdWFsKEZJWEVEX0ZFRSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHVzZSBkZWZhdWx0IGZpeGVkRmVlIHdoZW4gZmVlIGlzIG5vdCBleHBsaWNpdGx5IHNldCcsIGFzeW5jICgpID0+IHtcbiAgICAgIC8vIENyZWF0ZSBhIFVUWE8gd2l0aCBlbm91Z2ggYmFsYW5jZSB0byBjb3ZlciBhbW91bnQgKyBkZWZhdWx0IGZlZVxuICAgICAgY29uc3QgYW1vdW50ID0gJzUwMDAwMDAwMCc7IC8vIDAuNSBGTFJcbiAgICAgIGNvbnN0IHV0eG9BbW91bnQgPSAoQmlnSW50KGFtb3VudCkgKyBCaWdJbnQoRklYRURfRkVFKSkudG9TdHJpbmcoKTsgLy8gYW1vdW50ICsgZml4ZWRGZWVcblxuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeVxuICAgICAgICAuZ2V0RXhwb3J0SW5QQnVpbGRlcigpXG4gICAgICAgIC50aHJlc2hvbGQodGVzdERhdGEudGhyZXNob2xkKVxuICAgICAgICAubG9ja3RpbWUodGVzdERhdGEubG9ja3RpbWUpXG4gICAgICAgIC5mcm9tUHViS2V5KHRlc3REYXRhLnBBZGRyZXNzZXMpXG4gICAgICAgIC5hbW91bnQoYW1vdW50KVxuICAgICAgICAuZXh0ZXJuYWxDaGFpbklkKHRlc3REYXRhLnNvdXJjZUNoYWluSWQpXG4gICAgICAgIC8vIE5PVEU6IC5mZWUoKSBpcyBOT1QgY2FsbGVkIC0gc2hvdWxkIHVzZSBkZWZhdWx0IGZpeGVkRmVlXG4gICAgICAgIC51dHhvcyhbXG4gICAgICAgICAge1xuICAgICAgICAgICAgb3V0cHV0SUQ6IDAsXG4gICAgICAgICAgICBhbW91bnQ6IHV0eG9BbW91bnQsXG4gICAgICAgICAgICB0eGlkOiAnMjFoY0Q2NE45UXpkYXlQamhLTHNCUUJhOEZ5WGNzSkdOU3RCWjN2Q1JkQ0NFc0xydTInLFxuICAgICAgICAgICAgb3V0cHV0aWR4OiAnMCcsXG4gICAgICAgICAgICBhZGRyZXNzZXM6IHRlc3REYXRhLm91dHB1dHNbMF0uYWRkcmVzc2VzLFxuICAgICAgICAgICAgdGhyZXNob2xkOiB0ZXN0RGF0YS50aHJlc2hvbGQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG5cbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2FjdGlvbjtcblxuICAgICAgLy8gVmVyaWZ5IHRoZSBmZWUgaW4gdGhlIGJ1aWx0IHRyYW5zYWN0aW9uIGVxdWFscyB0aGUgZml4ZWRGZWVcbiAgICAgIHR4LmZlZS5mZWUuc2hvdWxkLmVxdWFsKEZJWEVEX0ZFRSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd2YWxpZGF0ZSB0eEJ1aWxkZXIgZmllbGRzJywgKCkgPT4ge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0RXhwb3J0SW5QQnVpbGRlcigpO1xuICAgIGl0KCdzaG91bGQgZmFpbCBhbW91bnQgbG93IHRoYW4gemVybycsICgpID0+IHtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0eEJ1aWxkZXIuYW1vdW50KCctMScpO1xuICAgICAgICB9LFxuICAgICAgICAoZTogYW55KSA9PiBlLm1lc3NhZ2UgPT09ICdBbW91bnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCdcbiAgICAgICk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBmYWlsIHRhcmdldCBjaGFpbiBpZCBsZW5ndGggaW5jb3JyZWN0JywgKCkgPT4ge1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHR4QnVpbGRlci5leHRlcm5hbENoYWluSWQoQnVmZmVyLmZyb20odGVzdERhdGEuSU5WQUxJRF9DSEFJTl9JRC5zbGljZSgyKSkpO1xuICAgICAgICB9LFxuICAgICAgICAoZTogYW55KSA9PiBlLm1lc3NhZ2UgPT09ICdDaGFpbiBpZCBhcmUgMzIgYnl0ZSBzaXplJ1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB0YXJnZXQgY2hhaW4gaWQgbm90IGEgdmFsaWQgYmFzZTU4IHN0cmluZycsICgpID0+IHtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0eEJ1aWxkZXIuZXh0ZXJuYWxDaGFpbklkKHRlc3REYXRhLklOVkFMSURfQ0hBSU5fSUQpO1xuICAgICAgICB9LFxuICAgICAgICAoZTogYW55KSA9PiBlLm1lc3NhZ2UgPT09ICdOb24tYmFzZTU4IGNoYXJhY3RlcidcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdGFyZ2V0IGNoYWluIGlkIGNiNTggaW52YWxpZCBjaGVja3N1bScsICgpID0+IHtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0eEJ1aWxkZXIuZXh0ZXJuYWxDaGFpbklkKHRlc3REYXRhLlZBTElEX0NfQ0hBSU5fSUQuc2xpY2UoMikpO1xuICAgICAgICB9LFxuICAgICAgICAoZTogYW55KSA9PiBlLm1lc3NhZ2UgPT09ICdJbnZhbGlkIGNoZWNrc3VtJ1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB2YWxpZGF0ZSBVdHhvcyBlbXB0eSBzdHJpbmcnLCAoKSA9PiB7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdHhCdWlsZGVyLnZhbGlkYXRlVXR4b3MoW10pO1xuICAgICAgICB9LFxuICAgICAgICAoZTogYW55KSA9PiBlLm1lc3NhZ2UgPT09ICdVVFhPcyBhcnJheSBjYW5ub3QgYmUgZW1wdHknXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHZhbGlkYXRlIFV0eG9zIHdpdGhvdXQgYW1vdW50IGZpZWxkJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHR4QnVpbGRlci52YWxpZGF0ZVV0eG9zKFt7IG91dHB1dElEOiAnJyB9IGFzIGFueSBhcyBEZWNvZGVkVXR4b09ial0pO1xuICAgICAgICB9LFxuICAgICAgICAoZTogYW55KSA9PiBlLm1lc3NhZ2UgPT09ICdVVFhPIG1pc3NpbmcgcmVxdWlyZWQgZmllbGQ6IGFtb3VudCdcbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIHNpZ25GbG93VGVzdCh7XG4gICAgdHJhbnNhY3Rpb25UeXBlOiAnRXhwb3J0IFAyQyB3aXRoIGNoYW5nZW91dHB1dCcsXG4gICAgbmV3VHhGYWN0b3J5OiAoKSA9PiBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RmbHJwJykpLFxuICAgIG5ld1R4QnVpbGRlcjogKCkgPT5cbiAgICAgIG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGZscnAnKSlcbiAgICAgICAgLmdldEV4cG9ydEluUEJ1aWxkZXIoKVxuICAgICAgICAudGhyZXNob2xkKHRlc3REYXRhLnRocmVzaG9sZClcbiAgICAgICAgLmxvY2t0aW1lKHRlc3REYXRhLmxvY2t0aW1lKVxuICAgICAgICAuZnJvbVB1YktleSh0ZXN0RGF0YS5wQWRkcmVzc2VzKVxuICAgICAgICAuYW1vdW50KHRlc3REYXRhLmFtb3VudClcbiAgICAgICAgLmV4dGVybmFsQ2hhaW5JZCh0ZXN0RGF0YS5zb3VyY2VDaGFpbklkKVxuICAgICAgICAuZmVlKHRlc3REYXRhLmZlZSlcbiAgICAgICAgLnV0eG9zKHRlc3REYXRhLm91dHB1dHMpLFxuICAgIHVuc2lnbmVkVHhIZXg6IHRlc3REYXRhLnVuc2lnbmVkSGV4LFxuICAgIGhhbGZTaWduZWRUeEhleDogdGVzdERhdGEuaGFsZlNpZ250eEhleCxcbiAgICBmdWxsU2lnbmVkVHhIZXg6IHRlc3REYXRhLmZ1bGxTaWdudHhIZXgsXG4gICAgcHJpdmF0ZUtleToge1xuICAgICAgcHJ2MTogdGVzdERhdGEucHJpdmF0ZUtleXNbMF0sXG4gICAgICBwcnYyOiB0ZXN0RGF0YS5wcml2YXRlS2V5c1sxXSxcbiAgICB9LFxuICAgIHR4SGFzaDogdGVzdERhdGEudHhoYXNoLFxuICB9KTtcblxuICBzaWduRmxvd1Rlc3Qoe1xuICAgIHRyYW5zYWN0aW9uVHlwZTogJ0V4cG9ydCBQMkMgd2l0aCAyIFVUWE9zJyxcbiAgICBuZXdUeEZhY3Rvcnk6ICgpID0+IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGZscnAnKSksXG4gICAgbmV3VHhCdWlsZGVyOiAoKSA9PlxuICAgICAgbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0ZmxycCcpKVxuICAgICAgICAuZ2V0RXhwb3J0SW5QQnVpbGRlcigpXG4gICAgICAgIC50aHJlc2hvbGQodHdvVXR4b1Rlc3REYXRhLnRocmVzaG9sZClcbiAgICAgICAgLmxvY2t0aW1lKHR3b1V0eG9UZXN0RGF0YS5sb2NrdGltZSlcbiAgICAgICAgLmZyb21QdWJLZXkodHdvVXR4b1Rlc3REYXRhLnBBZGRyZXNzZXMpXG4gICAgICAgIC5hbW91bnQodHdvVXR4b1Rlc3REYXRhLmFtb3VudClcbiAgICAgICAgLmV4dGVybmFsQ2hhaW5JZCh0d29VdHhvVGVzdERhdGEuc291cmNlQ2hhaW5JZClcbiAgICAgICAgLmZlZSh0d29VdHhvVGVzdERhdGEuZmVlKVxuICAgICAgICAudXR4b3ModHdvVXR4b1Rlc3REYXRhLm91dHB1dHMpLFxuICAgIHVuc2lnbmVkVHhIZXg6IHR3b1V0eG9UZXN0RGF0YS51bnNpZ25lZEhleCxcbiAgICBoYWxmU2lnbmVkVHhIZXg6IHR3b1V0eG9UZXN0RGF0YS5oYWxmU2lnbnR4SGV4LFxuICAgIGZ1bGxTaWduZWRUeEhleDogdHdvVXR4b1Rlc3REYXRhLmZ1bGxTaWdudHhIZXgsXG4gICAgcHJpdmF0ZUtleToge1xuICAgICAgcHJ2MTogdHdvVXR4b1Rlc3REYXRhLnByaXZhdGVLZXlzWzBdLFxuICAgICAgcHJ2MjogdHdvVXR4b1Rlc3REYXRhLnByaXZhdGVLZXlzWzFdLFxuICAgIH0sXG4gICAgdHhIYXNoOiB0d29VdHhvVGVzdERhdGEudHhoYXNoLFxuICB9KTtcblxuICBzaWduRmxvd1Rlc3Qoe1xuICAgIHRyYW5zYWN0aW9uVHlwZTogJ0V4cG9ydCBQMkMgd2l0aCBubyBjaGFuZ2Ugb3V0cHV0JyxcbiAgICBuZXdUeEZhY3Rvcnk6ICgpID0+IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGZscnAnKSksXG4gICAgbmV3VHhCdWlsZGVyOiAoKSA9PlxuICAgICAgbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0ZmxycCcpKVxuICAgICAgICAuZ2V0RXhwb3J0SW5QQnVpbGRlcigpXG4gICAgICAgIC50aHJlc2hvbGQobm9DaGFuZ2VUZXN0RGF0YS50aHJlc2hvbGQpXG4gICAgICAgIC5sb2NrdGltZShub0NoYW5nZVRlc3REYXRhLmxvY2t0aW1lKVxuICAgICAgICAuZnJvbVB1YktleShub0NoYW5nZVRlc3REYXRhLnBBZGRyZXNzZXMpXG4gICAgICAgIC5hbW91bnQobm9DaGFuZ2VUZXN0RGF0YS5hbW91bnQpXG4gICAgICAgIC5leHRlcm5hbENoYWluSWQobm9DaGFuZ2VUZXN0RGF0YS5zb3VyY2VDaGFpbklkKVxuICAgICAgICAuZmVlKG5vQ2hhbmdlVGVzdERhdGEuZmVlKVxuICAgICAgICAudXR4b3Mobm9DaGFuZ2VUZXN0RGF0YS5vdXRwdXRzKSxcbiAgICB1bnNpZ25lZFR4SGV4OiBub0NoYW5nZVRlc3REYXRhLnVuc2lnbmVkSGV4LFxuICAgIGhhbGZTaWduZWRUeEhleDogbm9DaGFuZ2VUZXN0RGF0YS5oYWxmU2lnbnR4SGV4LFxuICAgIGZ1bGxTaWduZWRUeEhleDogbm9DaGFuZ2VUZXN0RGF0YS5mdWxsU2lnbnR4SGV4LFxuICAgIHByaXZhdGVLZXk6IHtcbiAgICAgIHBydjE6IG5vQ2hhbmdlVGVzdERhdGEucHJpdmF0ZUtleXNbMF0sXG4gICAgICBwcnYyOiBub0NoYW5nZVRlc3REYXRhLnByaXZhdGVLZXlzWzFdLFxuICAgIH0sXG4gICAgdHhIYXNoOiBub0NoYW5nZVRlc3REYXRhLnR4aGFzaCxcbiAgfSk7XG5cbiAgaXQoJ1Nob3VsZCBmdWxsIHNpZ24gYSBleHBvcnQgdHggZnJvbSB1bnNpZ25lZCByYXcgdHgnLCAoKSA9PiB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0ZmxycCcpKS5mcm9tKHRlc3REYXRhLnVuc2lnbmVkSGV4KTtcbiAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEucHJpdmF0ZUtleXNbMF0gfSk7XG4gICAgdHhCdWlsZGVyXG4gICAgICAuYnVpbGQoKVxuICAgICAgLnRoZW4oKCkgPT4gYXNzZXJ0LmZhaWwoJ2l0IGNhbiBzaWduJykpXG4gICAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICBlcnIubWVzc2FnZS5zaG91bGQuYmUuZXF1YWwoJ1ByaXZhdGUga2V5IGNhbm5vdCBzaWduIHRoZSB0cmFuc2FjdGlvbicpO1xuICAgICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdvbi1jaGFpbiB2ZXJpZmllZCB0cmFuc2FjdGlvbnMnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCB2ZXJpZnkgb24tY2hhaW4gdHggaWQgZm9yIHNpZ25lZCBQLWNoYWluIGV4cG9ydCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHNpZ25lZEV4cG9ydEhleCA9XG4gICAgICAgICcweDAwMDAwMDAwMDAxMjAwMDAwMDcyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxNTg3MzRmOTRhZjg3MWMzZDEzMWI1NjEzMWI2ZmI3YTAyOTFlYWNhZGQyNjFlNjlkZmI0MmE5Y2RmNmY3ZmRkZDAwMDAwMDA3MDAwMDAwMDAxYWM2ZTU1ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAzMzMyOWJlN2QwMWNkM2ViYWFlNjY1NGQ3MzI3ZGQ5ZjE3YTJlMTU4MTdlOTE4YTVlODA4M2FlNGM5ZjJmMGVkNzcwNTVjMjRiZjM2NjUwMDFjNzMyNDQzN2M5NmM3YzhhNmExNTJkYTIzODVjMWRiNWMzYWIxZjkxMDAwMDAwMDM4NjJjZTg2YmEyZTI4ODg0ZThiODNmNWQ2MjY2ZDI3NGIzMzYzMmExY2MyMTNkNGMxMjk5NjAzN2ZjMjFiMjAyMDAwMDAwMDA1ODczNGY5NGFmODcxYzNkMTMxYjU2MTMxYjZmYjdhMDI5MWVhY2FkZDI2MWU2OWRmYjQyYTljZGY2ZjdmZGRkMDAwMDAwMDUwMDAwMDAwMDFkNmM5NmM2MDAwMDAwMDEwMDAwMDAwMGE0ODkxZGZiZDAyNGE1M2I4ZTQ1MTI0MjdkOTE5OTEwNTY4OTg5YjliNDg0NjAyNmFjN2JjYjgyOTA0OTRjMjYwMDAwMDAwMDU4NzM0Zjk0YWY4NzFjM2QxMzFiNTYxMzFiNmZiN2EwMjkxZWFjYWRkMjYxZTY5ZGZiNDJhOWNkZjZmN2ZkZGQwMDAwMDAwNTAwMDAwMDAwMDAzZmZhYmMwMDAwMDAwMTAwMDAwMDAwYzFmYjNiNDM4ZjhmNDllMWJiNjU3YTU5MTA2YmU5ZjVmOTFkMmVmY2U1ZTAyNTlmY2JiYjk0NThlMjcxZjgwZDAwMDAwMDAwNTg3MzRmOTRhZjg3MWMzZDEzMWI1NjEzMWI2ZmI3YTAyOTFlYWNhZGQyNjFlNjlkZmI0MmE5Y2RmNmY3ZmRkZDAwMDAwMDA1MDAwMDAwMDAwMDQwMGU3MDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDc4ZGI1YzMwYmVkMDRjMDVjZTIwOTE3OTgxMjg1MGJiYjNmZTZkNDZkN2VlZjM3NDRkODE0YzBkYTU1NTI0NzkwMDAwMDAwMTU4NzM0Zjk0YWY4NzFjM2QxMzFiNTYxMzFiNmZiN2EwMjkxZWFjYWRkMjYxZTY5ZGZiNDJhOWNkZjZmN2ZkZGQwMDAwMDAwNzAwMDAwMDAwMDJmYWYwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMzMzMjliZTdkMDFjZDNlYmFhZTY2NTRkNzMyN2RkOWYxN2EyZTE1ODE3ZTkxOGE1ZTgwODNhZTRjOWYyZjBlZDc3MDU1YzI0YmYzNjY1MDAxYzczMjQ0MzdjOTZjN2M4YTZhMTUyZGEyMzg1YzFkYjVjM2FiMWY5MTAwMDAwMDAzMDAwMDAwMDkwMDAwMDAwMWFmZGYwYWMyYmRiZmIxNzM1MDgxZGQ4NTlmNGQyNjNlNTg3ZDgxYmE4MWM2YmQyY2IzNDVlZTVhNjZjZWY0ZTk3YTYzNGM3NDBmMzVlZjZiYTYwMDc5NmE1YWRkMWQ5MWU2OWExNGNmY2IyMmI2NWU2YWUwYmNkZmJjZWJmYWJhMDAwMDAwMDAwOTAwMDAwMDAxYWZkZjBhYzJiZGJmYjE3MzUwODFkZDg1OWY0ZDI2M2U1ODdkODFiYTgxYzZiZDJjYjM0NWVlNWE2NmNlZjRlOTdhNjM0Yzc0MGYzNWVmNmJhNjAwNzk2YTVhZGQxZDkxZTY5YTE0Y2ZjYjIyYjY1ZTZhZTBiY2RmYmNlYmZhYmEwMDAwMDAwMDA5MDAwMDAwMDFhZmRmMGFjMmJkYmZiMTczNTA4MWRkODU5ZjRkMjYzZTU4N2Q4MWJhODFjNmJkMmNiMzQ1ZWU1YTY2Y2VmNGU5N2E2MzRjNzQwZjM1ZWY2YmE2MDA3OTZhNWFkZDFkOTFlNjlhMTRjZmNiMjJiNjVlNmFlMGJjZGZiY2ViZmFiYTAwJztcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGZscnAnKSkuZnJvbShzaWduZWRFeHBvcnRIZXgpO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHJhd1R4LnNob3VsZC5lcXVhbChzaWduZWRFeHBvcnRIZXgpO1xuICAgICAgdHguaWQuc2hvdWxkLmVxdWFsKCdrYThhdDVDaW5tcFVjNlFNVnIzM2R5VUppMTU2TEtNZG9kckpNNTlrUzZFV3IzdkhnJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIEZBSUwgd2l0aCB1bnNvcnRlZCBVVFhPIGFkZHJlc3NlcyAtIGRlbW9uc3RyYXRlcyBBZGRyZXNzTWFwIG1pc21hdGNoIGlzc3VlIGZvciBleHBvcnQgaW4gUC1jaGFpbiB0eCcsIGFzeW5jICgpID0+IHtcbiAgICAgIC8vIFRoaXMgdGVzdCB1c2VzIFVUWE8gYWRkcmVzc2VzIGluIFVOU09SVEVEIG9yZGVyIHRvIGRlbW9uc3RyYXRlIHRoZSBpc3N1ZS5cbiAgICAgIC8vIFdpdGggdW5zb3J0ZWQgYWRkcmVzc2VzLCB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiB3aWxsIGNyZWF0ZSBBZGRyZXNzTWFwcyBpbmNvcnJlY3RseVxuICAgICAgLy8gYmVjYXVzZSBpdCB1c2VzIHNvcnRlZCBhZGRyZXNzZXMsIG5vdCBVVFhPIGFkZHJlc3Mgb3JkZXIuXG4gICAgICAvL1xuICAgICAgLy8gRXhwZWN0ZWQ6IEFkZHJlc3NNYXAgc2hvdWxkIG1hcCBhZGRyZXNzZXMgdG8gc2lnbmF0dXJlIHNsb3RzIGJhc2VkIG9uIFVUWE8gb3JkZXIgKHNpZ0luZGljaWVzKVxuICAgICAgLy8gQ3VycmVudCAoV1JPTkcpOiBBZGRyZXNzTWFwIHVzZXMgc29ydGVkIGFkZHJlc3NlcyB3aXRoIHNlcXVlbnRpYWwgc2xvdHNcbiAgICAgIC8vXG4gICAgICAvLyBUaGlzIHRlc3QgV0lMTCBGQUlMIHdpdGggY3VycmVudCBpbXBsZW1lbnRhdGlvbiBiZWNhdXNlIEFkZHJlc3NNYXBzIGRvbid0IG1hdGNoIHNpZ0luZGljaWVzXG5cbiAgICAgIC8vIFVUWE8gYWRkcmVzc2VzIGluIFVOU09SVEVEIG9yZGVyIChkaWZmZXJlbnQgZnJvbSBzb3J0ZWQpXG4gICAgICAvLyBTb3J0ZWQgd291bGQgYmU6IFsweDEyY2IuLi4gKHNtYWxsZXN0KSwgMHhhNmUwLi4uIChtaWRkbGUpLCAweGMzODYuLi4gKGxhcmdlc3QpXVxuICAgICAgLy8gVW5zb3J0ZWQ6IFsweGMzODYuLi4gKGxhcmdlc3QpLCAweDEyY2IuLi4gKHNtYWxsZXN0KSwgMHhhNmUwLi4uIChtaWRkbGUpXVxuICAgICAgY29uc3QgdW5zb3J0ZWRVdHhvQWRkcmVzc2VzID0gW1xuICAgICAgICAnMHhjMzg2ZDU4ZDA5YTlhZTc3Y2YxY2YwN2JmMWM5ZGU0NGViYjBjOWYzJywgLy8gTGFyZ2VzdCAod291bGQgYmUgaW5kZXggMiBpZiBzb3J0ZWQpXG4gICAgICAgICcweDEyY2IzMmVhZjkyNTUzMDY0ZGI5OGQyNzFiNTZjYmEwNzllYzc4ZjUnLCAvLyBTbWFsbGVzdCAod291bGQgYmUgaW5kZXggMCBpZiBzb3J0ZWQpXG4gICAgICAgICcweGE2ZTBjMWFiZDAxMzJmNzBlZmI3N2UyMjc0NjM3ZmYzMzZhMjlhNTcnLCAvLyBNaWRkbGUgKHdvdWxkIGJlIGluZGV4IDEgaWYgc29ydGVkKVxuICAgICAgXTtcblxuICAgICAgLy8gQ29ycmVzcG9uZGluZyBQLWNoYWluIGFkZHJlc3NlcyAoaW4gc2FtZSBvcmRlciBhcyBVVFhPKVxuICAgICAgY29uc3QgcEFkZHJlc3NlcyA9IFtcbiAgICAgICAgJ1AtY29zdHdvMTVtc3ZyMjdzenZoaHBtYWgwYzM4Z2NtbDd2bTI5eGpoN3RjZWs4JywgLy8gTWFwcyB0byAweGMzODYuLi4gKFVUWE8gaW5kZXggMClcbiAgICAgICAgJ1AtY29zdHdvMXp0OW45NmhleTRmc3ZuZGUzNW4zazRrdDVwdTdjNzg0ZHpld3pkJywgLy8gTWFwcyB0byAweDEyY2IuLi4gKFVUWE8gaW5kZXggMSlcbiAgICAgICAgJ1AtY29zdHdvMWN3cmR0cmdmNHhoODBuY3U3cGFscmp3N2duNG1wajBuNGR4Z2hoJywgLy8gTWFwcyB0byAweGE2ZTAuLi4gKFVUWE8gaW5kZXggMilcbiAgICAgIF07XG5cbiAgICAgIC8vIENyZWF0ZSBVVFhPIHdpdGggVU5TT1JURUQgYWRkcmVzc2VzXG4gICAgICAvLyBBbW91bnQgbXVzdCBjb3ZlciBleHBvcnQgYW1vdW50ICsgZmVlXG4gICAgICBjb25zdCBleHBvcnRBbW91bnQgPSAnNTAwMDAwMDAnO1xuICAgICAgY29uc3QgZmVlID0gJzEyNjEwMDAnO1xuICAgICAgY29uc3QgdXR4b0Ftb3VudCA9IChCaWdJbnQoZXhwb3J0QW1vdW50KSArIEJpZ0ludChmZWUpKS50b1N0cmluZygpOyAvLyBhbW91bnQgKyBmZWVcblxuICAgICAgY29uc3QgdXR4bzogRGVjb2RlZFV0eG9PYmogPSB7XG4gICAgICAgIG91dHB1dElEOiAwLFxuICAgICAgICBhbW91bnQ6IHV0eG9BbW91bnQsXG4gICAgICAgIHR4aWQ6ICd6c3R5WXE1cmlES1lEU1IzZlVZS0trdVhLSjFhSkNlOFdOclhLcUVCSkQ0Q0d3ekZ3JyxcbiAgICAgICAgb3V0cHV0aWR4OiAnMCcsXG4gICAgICAgIGFkZHJlc3NlczogdW5zb3J0ZWRVdHhvQWRkcmVzc2VzLCAvLyBVTlNPUlRFRCBvcmRlclxuICAgICAgICB0aHJlc2hvbGQ6IDIsXG4gICAgICB9O1xuXG4gICAgICAvLyBCdWlsZCB0cmFuc2FjdGlvblxuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeVxuICAgICAgICAuZ2V0RXhwb3J0SW5QQnVpbGRlcigpXG4gICAgICAgIC50aHJlc2hvbGQoMilcbiAgICAgICAgLmxvY2t0aW1lKDApXG4gICAgICAgIC5mcm9tUHViS2V5KHBBZGRyZXNzZXMpXG4gICAgICAgIC5leHRlcm5hbENoYWluSWQodGVzdERhdGEuc291cmNlQ2hhaW5JZClcbiAgICAgICAgLmFtb3VudChleHBvcnRBbW91bnQpXG4gICAgICAgIC5mZWUoZmVlKVxuICAgICAgICAudXR4b3MoW3V0eG9dKTtcblxuICAgICAgLy8gQnVpbGQgdW5zaWduZWQgdHJhbnNhY3Rpb25cbiAgICAgIGNvbnN0IHVuc2lnbmVkVHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHVuc2lnbmVkSGV4ID0gdW5zaWduZWRUeC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICAvLyBQYXJzZSBpdCBiYWNrIHRvIGluc3BlY3QgQWRkcmVzc01hcHMgYW5kIHNpZ0luZGljaWVzXG4gICAgICBjb25zdCBwYXJzZWRCdWlsZGVyID0gZmFjdG9yeS5mcm9tKHVuc2lnbmVkSGV4KTtcbiAgICAgIGNvbnN0IHBhcnNlZFR4ID0gYXdhaXQgcGFyc2VkQnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgZmxhcmVUeCA9IChwYXJzZWRUeCBhcyBhbnkpLl9mbGFyZVRyYW5zYWN0aW9uO1xuXG4gICAgICAvLyBHZXQgdGhlIGlucHV0IHRvIGNoZWNrIHNpZ0luZGljaWVzXG4gICAgICBjb25zdCBleHBvcnRUeCA9IGZsYXJlVHgudHggYXMgYW55O1xuICAgICAgY29uc3QgaW5wdXQgPSBleHBvcnRUeC5iYXNlVHguaW5wdXRzWzBdO1xuICAgICAgY29uc3QgdHJhbnNmZXJJbnB1dCA9IGlucHV0LmlucHV0O1xuICAgICAgY29uc3Qgc2lnSW5kaWNpZXMgPSB0cmFuc2ZlcklucHV0LnNpZ0luZGljaWVzKCk7XG5cbiAgICAgIC8vIHNpZ0luZGljaWVzIHRlbGxzIHVzOiBzaWdJbmRpY2llc1tzbG90SW5kZXhdID0gdXR4b0FkZHJlc3NJbmRleFxuICAgICAgLy8gRm9yIHRocmVzaG9sZD0yLCB3ZSBuZWVkIHNpZ25hdHVyZXMgZm9yIGZpcnN0IDIgYWRkcmVzc2VzIGluIFVUWE8gb3JkZXJcbiAgICAgIC8vIFVUWE8gb3JkZXI6IFsweGMzODYuLi4gKGluZGV4IDApLCAweDEyY2IuLi4gKGluZGV4IDEpLCAweGE2ZTAuLi4gKGluZGV4IDIpXVxuICAgICAgLy8gU28gc2lnSW5kaWNpZXMgc2hvdWxkIGJlIFswLCAxXSBtZWFuaW5nOiBzbG90IDAgPSBVVFhPIGluZGV4IDAsIHNsb3QgMSA9IFVUWE8gaW5kZXggMVxuXG4gICAgICAvLyBWZXJpZnkgc2lnSW5kaWNpZXMgYXJlIFswLCAxXSAoZmlyc3QgMiBhZGRyZXNzZXMgaW4gVVRYTyBvcmRlciwgTk9UIHNvcnRlZCBvcmRlcilcbiAgICAgIHNpZ0luZGljaWVzLmxlbmd0aC5zaG91bGQuZXF1YWwoMik7XG4gICAgICBzaWdJbmRpY2llc1swXS5zaG91bGQuZXF1YWwoMCwgJ0ZpcnN0IHNpZ25hdHVyZSBzbG90IHNob3VsZCBiZSBVVFhPIGFkZHJlc3MgaW5kZXggMCAoMHhjMzg2Li4uKScpO1xuICAgICAgc2lnSW5kaWNpZXNbMV0uc2hvdWxkLmVxdWFsKDEsICdTZWNvbmQgc2lnbmF0dXJlIHNsb3Qgc2hvdWxkIGJlIFVUWE8gYWRkcmVzcyBpbmRleCAxICgweDEyY2IuLi4pJyk7XG5cbiAgICAgIC8vIFRoZSBjcml0aWNhbCB0ZXN0OiBWZXJpZnkgdGhhdCBzaWduYXR1cmUgc2xvdHMgaGF2ZSBlbWJlZGRlZCBhZGRyZXNzZXMgYmFzZWQgb24gVVRYTyBvcmRlclxuICAgICAgLy8gV2l0aCB1bnNvcnRlZCBVVFhPIGFkZHJlc3NlcywgdGhpcyB3aWxsIEZBSUwgaWYgQWRkcmVzc01hcHMgZG9uJ3QgbWF0Y2ggVVRYTyBvcmRlclxuICAgICAgLy9cbiAgICAgIC8vIHNpZ0luZGljaWVzIHRlbGxzIHVzOiBzaWdJbmRpY2llc1tzbG90SW5kZXhdID0gdXR4b0FkZHJlc3NJbmRleFxuICAgICAgLy8gRm9yIHRocmVzaG9sZD0yLCB3ZSBuZWVkIHNpZ25hdHVyZXMgZm9yIGZpcnN0IDIgYWRkcmVzc2VzIGluIFVUWE8gb3JkZXJcbiAgICAgIC8vIFVUWE8gb3JkZXI6IFsweGMzODYuLi4gKGluZGV4IDApLCAweDEyY2IuLi4gKGluZGV4IDEpLCAweGE2ZTAuLi4gKGluZGV4IDIpXVxuICAgICAgLy8gU28gc2lnSW5kaWNpZXMgc2hvdWxkIGJlIFswLCAxXSBtZWFuaW5nOiBzbG90IDAgPSBVVFhPIGluZGV4IDAsIHNsb3QgMSA9IFVUWE8gaW5kZXggMVxuXG4gICAgICAvLyBQYXJzZSB0aGUgY3JlZGVudGlhbCB0byBzZWUgd2hpY2ggc2xvdHMgaGF2ZSB3aGljaCBlbWJlZGRlZCBhZGRyZXNzZXNcbiAgICAgIGNvbnN0IGNyZWRlbnRpYWwgPSBmbGFyZVR4LmNyZWRlbnRpYWxzWzBdO1xuICAgICAgY29uc3Qgc2lnbmF0dXJlcyA9IGNyZWRlbnRpYWwuZ2V0U2lnbmF0dXJlcygpO1xuXG4gICAgICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gY2hlY2sgaWYgc2lnbmF0dXJlIGhhcyBlbWJlZGRlZCBhZGRyZXNzIChzYW1lIGxvZ2ljIGFzIHRyYW5zYWN0aW9uLnRzKVxuICAgICAgY29uc3QgdGVzdFV0aWxzMiA9IHJlcXVpcmUoJy4uLy4uLy4uL3NyYy9saWIvdXRpbHMnKS5kZWZhdWx0O1xuICAgICAgY29uc3QgaXNFbXB0eVNpZ25hdHVyZSA9IChzaWduYXR1cmU6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICAgICAgICByZXR1cm4gISFzaWduYXR1cmUgJiYgdGVzdFV0aWxzMi5yZW1vdmVIZXhQcmVmaXgoc2lnbmF0dXJlKS5zdGFydHNXaXRoKCcwJy5yZXBlYXQoOTApKTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGhhc0VtYmVkZGVkQWRkcmVzcyA9IChzaWduYXR1cmU6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICAgICAgICBpZiAoIWlzRW1wdHlTaWduYXR1cmUoc2lnbmF0dXJlKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjb25zdCBjbGVhblNpZyA9IHRlc3RVdGlsczIucmVtb3ZlSGV4UHJlZml4KHNpZ25hdHVyZSk7XG4gICAgICAgIGlmIChjbGVhblNpZy5sZW5ndGggPCAxMzApIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgZW1iZWRkZWRQYXJ0ID0gY2xlYW5TaWcuc3Vic3RyaW5nKDkwLCAxMzApO1xuICAgICAgICAvLyBDaGVjayBpZiBlbWJlZGRlZCBwYXJ0IGlzIG5vdCBhbGwgemVyb3NcbiAgICAgICAgcmV0dXJuIGVtYmVkZGVkUGFydCAhPT0gJzAnLnJlcGVhdCg0MCk7XG4gICAgICB9O1xuXG4gICAgICAvLyBFeHRyYWN0IGVtYmVkZGVkIGFkZHJlc3NlcyBmcm9tIHNpZ25hdHVyZSBzbG90c1xuICAgICAgY29uc3QgZW1iZWRkZWRBZGRyZXNzZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICAgIHNpZ25hdHVyZXMuZm9yRWFjaCgoc2lnOiBzdHJpbmcsIHNsb3RJbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgIGlmIChoYXNFbWJlZGRlZEFkZHJlc3Moc2lnKSkge1xuICAgICAgICAgIC8vIEV4dHJhY3QgZW1iZWRkZWQgYWRkcmVzcyAoYWZ0ZXIgcG9zaXRpb24gOTAsIDQwIGNoYXJzID0gMjAgYnl0ZXMpXG4gICAgICAgICAgY29uc3QgY2xlYW5TaWcgPSB0ZXN0VXRpbHMyLnJlbW92ZUhleFByZWZpeChzaWcpO1xuICAgICAgICAgIGNvbnN0IGVtYmVkZGVkQWRkciA9IGNsZWFuU2lnLnN1YnN0cmluZyg5MCwgMTMwKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgIGVtYmVkZGVkQWRkcmVzc2VzW3Nsb3RJbmRleF0gPSAnMHgnICsgZW1iZWRkZWRBZGRyO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gVmVyaWZ5OiBDcmVkZW50aWFscyBvbmx5IGVtYmVkIE9ORSBhZGRyZXNzICh1c2VyL3JlY292ZXJ5KSwgbm90IGJvdGhcbiAgICAgIC8vIFRoZSBlbWJlZGRlZCBhZGRyZXNzIHNob3VsZCBiZSBiYXNlZCBvbiBhZGRyZXNzZXNJbmRleCBsb2dpYywgbm90IHNvcnRlZCBvcmRlclxuICAgICAgLy9cbiAgICAgIC8vIENvbXB1dGUgYWRkcmVzc2VzSW5kZXggdG8gZGV0ZXJtaW5lIGV4cGVjdGVkIHNpZ25hdHVyZSBvcmRlclxuICAgICAgY29uc3QgdXR4b0FkZHJlc3NCeXRlcyA9IHVuc29ydGVkVXR4b0FkZHJlc3Nlcy5tYXAoKGFkZHIpID0+IHRlc3RVdGlsczIucGFyc2VBZGRyZXNzKGFkZHIpKTtcbiAgICAgIGNvbnN0IHBBZGRyZXNzQnl0ZXMgPSBwQWRkcmVzc2VzLm1hcCgoYWRkcikgPT4gdGVzdFV0aWxzMi5wYXJzZUFkZHJlc3MoYWRkcikpO1xuXG4gICAgICBjb25zdCBhZGRyZXNzZXNJbmRleDogbnVtYmVyW10gPSBbXTtcbiAgICAgIHBBZGRyZXNzQnl0ZXMuZm9yRWFjaCgocEFkZHIpID0+IHtcbiAgICAgICAgY29uc3QgdXR4b0luZGV4ID0gdXR4b0FkZHJlc3NCeXRlcy5maW5kSW5kZXgoXG4gICAgICAgICAgKHVBZGRyKSA9PiBCdWZmZXIuY29tcGFyZShCdWZmZXIuZnJvbSh1QWRkciksIEJ1ZmZlci5mcm9tKHBBZGRyKSkgPT09IDBcbiAgICAgICAgKTtcbiAgICAgICAgYWRkcmVzc2VzSW5kZXgucHVzaCh1dHhvSW5kZXgpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIGZpcnN0SW5kZXggPSAwICh1c2VyKSwgYml0Z29JbmRleCA9IDFcbiAgICAgIGNvbnN0IGZpcnN0SW5kZXggPSAwO1xuICAgICAgY29uc3QgYml0Z29JbmRleCA9IDE7XG5cbiAgICAgIC8vIERldGVybWluZSBleHBlY3RlZCBzaWduYXR1cmUgb3JkZXIgYmFzZWQgb24gYWRkcmVzc2VzSW5kZXhcbiAgICAgIGNvbnN0IHVzZXJDb21lc0ZpcnN0ID0gYWRkcmVzc2VzSW5kZXhbYml0Z29JbmRleF0gPiBhZGRyZXNzZXNJbmRleFtmaXJzdEluZGV4XTtcblxuICAgICAgLy8gRXhwZWN0ZWQgY3JlZGVudGlhbCBzdHJ1Y3R1cmU6XG4gICAgICAvLyAtIElmIHVzZXIgY29tZXMgZmlyc3Q6IFt1c2VyQWRkcmVzcywgemVyb3NdXG4gICAgICAvLyAtIElmIGJpdGdvIGNvbWVzIGZpcnN0OiBbemVyb3MsIHVzZXJBZGRyZXNzXVxuICAgICAgY29uc3QgdXNlckFkZHJlc3NIZXggPSBCdWZmZXIuZnJvbShwQWRkcmVzc0J5dGVzW2ZpcnN0SW5kZXhdKS50b1N0cmluZygnaGV4JykudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNvbnN0IGV4cGVjdGVkVXNlckFkZHIgPSAnMHgnICsgdXNlckFkZHJlc3NIZXg7XG5cbiAgICAgIGlmICh1c2VyQ29tZXNGaXJzdCkge1xuICAgICAgICAvLyBFeHBlY3RlZDogW3VzZXJBZGRyZXNzLCB6ZXJvc11cbiAgICAgICAgLy8gU2xvdCAwIHNob3VsZCBoYXZlIHVzZXIgYWRkcmVzcyAocEFkZHIwID0gMHhjMzg2Li4uID0gVVRYTyBpbmRleCAwKVxuICAgICAgICBpZiAoZW1iZWRkZWRBZGRyZXNzZXNbMF0pIHtcbiAgICAgICAgICBlbWJlZGRlZEFkZHJlc3Nlc1swXVxuICAgICAgICAgICAgLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgIC5zaG91bGQuZXF1YWwoXG4gICAgICAgICAgICAgIGV4cGVjdGVkVXNlckFkZHIsXG4gICAgICAgICAgICAgIGBTbG90IDAgc2hvdWxkIGhhdmUgdXNlciBhZGRyZXNzICgke2V4cGVjdGVkVXNlckFkZHJ9KSBiZWNhdXNlIHVzZXIgY29tZXMgZmlyc3QgaW4gVVRYTyBvcmRlcmBcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTbG90IDAgc2hvdWxkIGhhdmUgZW1iZWRkZWQgdXNlciBhZGRyZXNzLCBidXQgaXMgZW1wdHlgKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTbG90IDEgc2hvdWxkIGJlIHplcm9zIChubyBlbWJlZGRlZCBhZGRyZXNzKVxuICAgICAgICBpZiAoZW1iZWRkZWRBZGRyZXNzZXNbMV0pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNsb3QgMSBzaG91bGQgYmUgemVyb3MsIGJ1dCBoYXMgZW1iZWRkZWQgYWRkcmVzczogJHtlbWJlZGRlZEFkZHJlc3Nlc1sxXX1gKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRXhwZWN0ZWQ6IFt6ZXJvcywgdXNlckFkZHJlc3NdXG4gICAgICAgIC8vIFNsb3QgMCBzaG91bGQgYmUgemVyb3NcbiAgICAgICAgaWYgKGVtYmVkZGVkQWRkcmVzc2VzWzBdKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTbG90IDAgc2hvdWxkIGJlIHplcm9zLCBidXQgaGFzIGVtYmVkZGVkIGFkZHJlc3M6ICR7ZW1iZWRkZWRBZGRyZXNzZXNbMF19YCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2xvdCAxIHNob3VsZCBoYXZlIHVzZXIgYWRkcmVzc1xuICAgICAgICBpZiAoZW1iZWRkZWRBZGRyZXNzZXNbMV0pIHtcbiAgICAgICAgICBlbWJlZGRlZEFkZHJlc3Nlc1sxXVxuICAgICAgICAgICAgLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgIC5zaG91bGQuZXF1YWwoXG4gICAgICAgICAgICAgIGV4cGVjdGVkVXNlckFkZHIsXG4gICAgICAgICAgICAgIGBTbG90IDEgc2hvdWxkIGhhdmUgdXNlciBhZGRyZXNzICgke2V4cGVjdGVkVXNlckFkZHJ9KSBiZWNhdXNlIGJpdGdvIGNvbWVzIGZpcnN0IGluIFVUWE8gb3JkZXJgXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU2xvdCAxIHNob3VsZCBoYXZlIGVtYmVkZGVkIHVzZXIgYWRkcmVzcywgYnV0IGlzIGVtcHR5YCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVGhlIGtleSB2ZXJpZmljYXRpb246IEFkZHJlc3NNYXBzIHNob3VsZCBtYXRjaCB0aGUgY3JlZGVudGlhbCBvcmRlclxuICAgICAgLy8gV2l0aCB0aGUgZml4LCBBZGRyZXNzTWFwcyBhcmUgY3JlYXRlZCB1c2luZyB0aGUgc2FtZSBhZGRyZXNzZXNJbmRleCBsb2dpYyBhcyBjcmVkZW50aWFsc1xuICAgICAgLy8gVGhpcyBlbnN1cmVzIHNpZ25pbmcgd29ya3MgY29ycmVjdGx5IGV2ZW4gd2l0aCB1bnNvcnRlZCBVVFhPIGFkZHJlc3Nlc1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
|