@bitgo-beta/sdk-coin-sol 7.6.4-beta.720 → 7.6.4-beta.721
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/LICENSE +191 -0
- package/dist/cjs/src/lib/constants.d.ts +7 -0
- package/dist/cjs/src/lib/constants.d.ts.map +1 -1
- package/dist/cjs/src/lib/constants.js +9 -2
- package/dist/cjs/src/lib/customInstructionBuilder.d.ts +13 -2
- package/dist/cjs/src/lib/customInstructionBuilder.d.ts.map +1 -1
- package/dist/cjs/src/lib/customInstructionBuilder.js +131 -28
- package/dist/cjs/src/lib/instructionParamsFactory.d.ts.map +1 -1
- package/dist/cjs/src/lib/instructionParamsFactory.js +81 -21
- package/dist/cjs/src/lib/transaction.d.ts +12 -1
- package/dist/cjs/src/lib/transaction.d.ts.map +1 -1
- package/dist/cjs/src/lib/transaction.js +31 -1
- package/dist/cjs/src/lib/transactionBuilder.d.ts +33 -0
- package/dist/cjs/src/lib/transactionBuilder.d.ts.map +1 -1
- package/dist/cjs/src/lib/transactionBuilder.js +75 -1
- package/dist/cjs/src/lib/utils.d.ts.map +1 -1
- package/dist/cjs/src/lib/utils.js +12 -4
- package/dist/cjs/test/unit/transaction.js +22 -1
- package/dist/cjs/test/unit/transactionBuilder/computeUnitLimit.d.ts +2 -0
- package/dist/cjs/test/unit/transactionBuilder/computeUnitLimit.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/computeUnitLimit.js +346 -0
- package/dist/cjs/test/unit/transactionBuilder/customInstructionBuilder.js +334 -23
- package/dist/cjs/tsconfig.tsbuildinfo +1 -1
- package/dist/esm/lib/constants.d.ts +7 -0
- package/dist/esm/lib/constants.d.ts.map +1 -1
- package/dist/esm/lib/constants.js +8 -1
- package/dist/esm/lib/customInstructionBuilder.d.ts +13 -2
- package/dist/esm/lib/customInstructionBuilder.d.ts.map +1 -1
- package/dist/esm/lib/customInstructionBuilder.js +132 -29
- package/dist/esm/lib/instructionParamsFactory.d.ts.map +1 -1
- package/dist/esm/lib/instructionParamsFactory.js +81 -21
- package/dist/esm/lib/transaction.d.ts +12 -1
- package/dist/esm/lib/transaction.d.ts.map +1 -1
- package/dist/esm/lib/transaction.js +31 -1
- package/dist/esm/lib/transactionBuilder.d.ts +33 -0
- package/dist/esm/lib/transactionBuilder.d.ts.map +1 -1
- package/dist/esm/lib/transactionBuilder.js +76 -2
- package/dist/esm/lib/utils.d.ts.map +1 -1
- package/dist/esm/lib/utils.js +12 -4
- package/package.json +8 -8
|
@@ -54,6 +54,30 @@ describe('Sol Custom Instruction Builder', () => {
|
|
|
54
54
|
const otherAccount = new src_1.KeyPair({ prv: testData.prvKeys.prvKey1.base58 }).getKeys();
|
|
55
55
|
const recentBlockHash = 'GHtXQBsoZHVnNFa9YevAzFr17DJjgHXk3ycTKD5xD3Zi';
|
|
56
56
|
const memo = 'test memo';
|
|
57
|
+
// Helper to deconstruct a serialized VersionedTransaction into the data shape
|
|
58
|
+
// consumed by fromVersionedTransactionData
|
|
59
|
+
function extractVersionedTransactionData(base64Bytes) {
|
|
60
|
+
const buffer = Buffer.from(base64Bytes, 'base64');
|
|
61
|
+
const versionedTx = web3_js_1.VersionedTransaction.deserialize(buffer);
|
|
62
|
+
return {
|
|
63
|
+
versionedInstructions: versionedTx.message.compiledInstructions.map((ci) => ({
|
|
64
|
+
programIdIndex: ci.programIdIndex,
|
|
65
|
+
accountKeyIndexes: ci.accountKeyIndexes,
|
|
66
|
+
data: bs58_1.default.encode(ci.data),
|
|
67
|
+
})),
|
|
68
|
+
addressLookupTables: versionedTx.message.addressTableLookups.map((alt) => ({
|
|
69
|
+
accountKey: alt.accountKey.toString(),
|
|
70
|
+
writableIndexes: alt.writableIndexes,
|
|
71
|
+
readonlyIndexes: alt.readonlyIndexes,
|
|
72
|
+
})),
|
|
73
|
+
staticAccountKeys: versionedTx.message.staticAccountKeys.map((key) => key.toString()),
|
|
74
|
+
messageHeader: {
|
|
75
|
+
numRequiredSignatures: versionedTx.message.header.numRequiredSignatures,
|
|
76
|
+
numReadonlySignedAccounts: versionedTx.message.header.numReadonlySignedAccounts,
|
|
77
|
+
numReadonlyUnsignedAccounts: versionedTx.message.header.numReadonlyUnsignedAccounts,
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
}
|
|
57
81
|
// Helper function to convert TransactionInstruction to the expected format
|
|
58
82
|
const convertInstructionToParams = (instruction) => ({
|
|
59
83
|
programId: instruction.programId.toString(),
|
|
@@ -264,28 +288,6 @@ describe('Sol Custom Instruction Builder', () => {
|
|
|
264
288
|
});
|
|
265
289
|
});
|
|
266
290
|
describe('fromVersionedTransactionData', () => {
|
|
267
|
-
function extractVersionedTransactionData(base64Bytes) {
|
|
268
|
-
const buffer = Buffer.from(base64Bytes, 'base64');
|
|
269
|
-
const versionedTx = web3_js_1.VersionedTransaction.deserialize(buffer);
|
|
270
|
-
return {
|
|
271
|
-
versionedInstructions: versionedTx.message.compiledInstructions.map((ci) => ({
|
|
272
|
-
programIdIndex: ci.programIdIndex,
|
|
273
|
-
accountKeyIndexes: ci.accountKeyIndexes,
|
|
274
|
-
data: bs58_1.default.encode(ci.data),
|
|
275
|
-
})),
|
|
276
|
-
addressLookupTables: versionedTx.message.addressTableLookups.map((alt) => ({
|
|
277
|
-
accountKey: alt.accountKey.toString(),
|
|
278
|
-
writableIndexes: alt.writableIndexes,
|
|
279
|
-
readonlyIndexes: alt.readonlyIndexes,
|
|
280
|
-
})),
|
|
281
|
-
staticAccountKeys: versionedTx.message.staticAccountKeys.map((key) => key.toString()),
|
|
282
|
-
messageHeader: {
|
|
283
|
-
numRequiredSignatures: versionedTx.message.header.numRequiredSignatures,
|
|
284
|
-
numReadonlySignedAccounts: versionedTx.message.header.numReadonlySignedAccounts,
|
|
285
|
-
numReadonlyUnsignedAccounts: versionedTx.message.header.numReadonlyUnsignedAccounts,
|
|
286
|
-
},
|
|
287
|
-
};
|
|
288
|
-
}
|
|
289
291
|
it('should process VersionedTransactionData and extract instructions', () => {
|
|
290
292
|
const txBuilder = customInstructionBuilder();
|
|
291
293
|
const versionedTxData = extractVersionedTransactionData(testData.JUPITER_VERSIONED_TX_BYTES);
|
|
@@ -409,5 +411,314 @@ describe('Sol Custom Instruction Builder', () => {
|
|
|
409
411
|
sender.should.equal(authAccount.pub);
|
|
410
412
|
});
|
|
411
413
|
});
|
|
414
|
+
describe('durable nonce injection', () => {
|
|
415
|
+
const SYSTEM_PROGRAM_ID = web3_js_1.SystemProgram.programId.toBase58();
|
|
416
|
+
const SYSVAR_RECENT_BLOCKHASHES_ID = web3_js_1.SYSVAR_RECENT_BLOCKHASHES_PUBKEY.toBase58();
|
|
417
|
+
const walletNonceAddress = testData.nonceAccount.pub;
|
|
418
|
+
const authWalletAddress = authAccount.pub;
|
|
419
|
+
const seededPublicKey = (seed) => web3_js_1.Keypair.fromSeed(Buffer.alloc(32, seed)).publicKey;
|
|
420
|
+
// Deterministic fixture keys covering all four MessageV0 header sections
|
|
421
|
+
const fixturePayer = seededPublicKey(11); // writable signer (account 0)
|
|
422
|
+
const fixtureRoSigner = seededPublicKey(12); // read-only signer
|
|
423
|
+
const fixtureWritableNonSigner = seededPublicKey(13);
|
|
424
|
+
const fixtureRoNonSigner = seededPublicKey(14);
|
|
425
|
+
const fixtureAltWritable = seededPublicKey(15); // loaded from the lookup table
|
|
426
|
+
const fixtureAltReadonly = seededPublicKey(16); // loaded from the lookup table
|
|
427
|
+
const fixtureProgram = seededPublicKey(17);
|
|
428
|
+
// The lookup table has filler addresses at indexes 0 and 2 so the
|
|
429
|
+
// referenced indexes (1 writable, 3 readonly) are non-trivial
|
|
430
|
+
const lookupTableAccount = new web3_js_1.AddressLookupTableAccount({
|
|
431
|
+
key: seededPublicKey(200),
|
|
432
|
+
state: {
|
|
433
|
+
deactivationSlot: BigInt(0),
|
|
434
|
+
lastExtendedSlot: 0,
|
|
435
|
+
lastExtendedSlotStartIndex: 0,
|
|
436
|
+
addresses: [seededPublicKey(90), fixtureAltWritable, seededPublicKey(91), fixtureAltReadonly],
|
|
437
|
+
},
|
|
438
|
+
});
|
|
439
|
+
/**
|
|
440
|
+
* Compile versioned transaction data through web3.js with a lookup table,
|
|
441
|
+
* mirroring the data callers extract from a real VersionedTransaction.
|
|
442
|
+
*/
|
|
443
|
+
function buildVersionedFixture(payerKey, instructions) {
|
|
444
|
+
const message = web3_js_1.MessageV0.compile({
|
|
445
|
+
payerKey,
|
|
446
|
+
recentBlockhash: recentBlockHash,
|
|
447
|
+
addressLookupTableAccounts: [lookupTableAccount],
|
|
448
|
+
instructions: instructions.map((ix) => new web3_js_1.TransactionInstruction({
|
|
449
|
+
programId: ix.programId,
|
|
450
|
+
keys: ix.keys,
|
|
451
|
+
data: Buffer.from([1, 2, 3, 4]),
|
|
452
|
+
})),
|
|
453
|
+
});
|
|
454
|
+
const data = {
|
|
455
|
+
versionedInstructions: message.compiledInstructions.map((ci) => ({
|
|
456
|
+
programIdIndex: ci.programIdIndex,
|
|
457
|
+
accountKeyIndexes: [...ci.accountKeyIndexes],
|
|
458
|
+
data: bs58_1.default.encode(ci.data),
|
|
459
|
+
})),
|
|
460
|
+
addressLookupTables: message.addressTableLookups.map((alt) => ({
|
|
461
|
+
accountKey: alt.accountKey.toBase58(),
|
|
462
|
+
writableIndexes: [...alt.writableIndexes],
|
|
463
|
+
readonlyIndexes: [...alt.readonlyIndexes],
|
|
464
|
+
})),
|
|
465
|
+
staticAccountKeys: message.staticAccountKeys.map((key) => key.toBase58()),
|
|
466
|
+
messageHeader: {
|
|
467
|
+
numRequiredSignatures: message.header.numRequiredSignatures,
|
|
468
|
+
numReadonlySignedAccounts: message.header.numReadonlySignedAccounts,
|
|
469
|
+
numReadonlyUnsignedAccounts: message.header.numReadonlyUnsignedAccounts,
|
|
470
|
+
},
|
|
471
|
+
recentBlockhash: recentBlockHash,
|
|
472
|
+
};
|
|
473
|
+
return { message, data };
|
|
474
|
+
}
|
|
475
|
+
/** Compile processed VersionedTransactionData back into a MessageV0 */
|
|
476
|
+
function compileProcessedMessage(data) {
|
|
477
|
+
return new web3_js_1.MessageV0({
|
|
478
|
+
header: { ...data.messageHeader },
|
|
479
|
+
staticAccountKeys: data.staticAccountKeys.map((key) => new web3_js_1.PublicKey(key)),
|
|
480
|
+
recentBlockhash: data.recentBlockhash ?? recentBlockHash,
|
|
481
|
+
compiledInstructions: data.versionedInstructions.map((instruction) => ({
|
|
482
|
+
programIdIndex: instruction.programIdIndex,
|
|
483
|
+
accountKeyIndexes: [...instruction.accountKeyIndexes],
|
|
484
|
+
data: Buffer.from(bs58_1.default.decode(instruction.data)),
|
|
485
|
+
})),
|
|
486
|
+
addressTableLookups: data.addressLookupTables.map((alt) => ({
|
|
487
|
+
accountKey: new web3_js_1.PublicKey(alt.accountKey),
|
|
488
|
+
writableIndexes: [...alt.writableIndexes],
|
|
489
|
+
readonlyIndexes: [...alt.readonlyIndexes],
|
|
490
|
+
})),
|
|
491
|
+
});
|
|
492
|
+
}
|
|
493
|
+
/** Inject the durable nonce advance instruction and return the processed data */
|
|
494
|
+
function injectNonceAdvance(data) {
|
|
495
|
+
const txBuilder = factory.getCustomInstructionBuilder();
|
|
496
|
+
txBuilder.nonce(recentBlockHash, { walletNonceAddress, authWalletAddress });
|
|
497
|
+
txBuilder.fromVersionedTransactionData(data);
|
|
498
|
+
const processed = txBuilder['_transaction'].getVersionedTransactionData();
|
|
499
|
+
should_1.default.exist(processed);
|
|
500
|
+
return processed;
|
|
501
|
+
}
|
|
502
|
+
/** Fixture using every header section and both lookup-table slots */
|
|
503
|
+
const mainFixture = () => buildVersionedFixture(fixturePayer, [
|
|
504
|
+
{
|
|
505
|
+
programId: fixtureProgram,
|
|
506
|
+
keys: [
|
|
507
|
+
{ pubkey: fixturePayer, isSigner: true, isWritable: true },
|
|
508
|
+
{ pubkey: fixtureRoSigner, isSigner: true, isWritable: false },
|
|
509
|
+
{ pubkey: fixtureAltWritable, isSigner: false, isWritable: true },
|
|
510
|
+
{ pubkey: fixtureAltReadonly, isSigner: false, isWritable: false },
|
|
511
|
+
{ pubkey: fixtureWritableNonSigner, isSigner: false, isWritable: true },
|
|
512
|
+
{ pubkey: fixtureRoNonSigner, isSigner: false, isWritable: false },
|
|
513
|
+
],
|
|
514
|
+
},
|
|
515
|
+
]);
|
|
516
|
+
it('keeps lookup-table-referencing instructions pointing at the same accounts', () => {
|
|
517
|
+
const { message, data } = mainFixture();
|
|
518
|
+
const processed = injectNonceAdvance(data);
|
|
519
|
+
// The fixture must actually reference accounts loaded from the lookup table
|
|
520
|
+
Math.max(...data.versionedInstructions.flatMap((ix) => [...ix.accountKeyIndexes, ix.programIdIndex])).should.be.greaterThanOrEqual(data.staticAccountKeys.length);
|
|
521
|
+
const before = message.getAccountKeys({ addressLookupTableAccounts: [lookupTableAccount] });
|
|
522
|
+
const after = compileProcessedMessage(processed).getAccountKeys({
|
|
523
|
+
addressLookupTableAccounts: [lookupTableAccount],
|
|
524
|
+
});
|
|
525
|
+
processed.versionedInstructions.should.have.length(data.versionedInstructions.length + 1);
|
|
526
|
+
const remappedInstructions = processed.versionedInstructions.slice(1);
|
|
527
|
+
remappedInstructions.forEach((instruction, ixIndex) => {
|
|
528
|
+
const original = data.versionedInstructions[ixIndex];
|
|
529
|
+
before.get(original.programIdIndex).toBase58().should.equal(after.get(instruction.programIdIndex).toBase58());
|
|
530
|
+
instruction.accountKeyIndexes.should.have.length(original.accountKeyIndexes.length);
|
|
531
|
+
original.accountKeyIndexes.forEach((_, k) => {
|
|
532
|
+
before
|
|
533
|
+
.get(original.accountKeyIndexes[k])
|
|
534
|
+
.toBase58()
|
|
535
|
+
.should.equal(after.get(instruction.accountKeyIndexes[k]).toBase58());
|
|
536
|
+
});
|
|
537
|
+
instruction.data.should.equal(original.data);
|
|
538
|
+
});
|
|
539
|
+
});
|
|
540
|
+
it('keeps Jupiter lookup-table accounts pointing at the same accounts', () => {
|
|
541
|
+
const data = extractVersionedTransactionData(testData.JUPITER_VERSIONED_TX_BYTES);
|
|
542
|
+
const processed = injectNonceAdvance(data);
|
|
543
|
+
// authority, nonce account and sysvar are added; the system program is already present
|
|
544
|
+
const shift = processed.staticAccountKeys.length - data.staticAccountKeys.length;
|
|
545
|
+
shift.should.equal(3);
|
|
546
|
+
processed.messageHeader.should.deepEqual({
|
|
547
|
+
numRequiredSignatures: 2,
|
|
548
|
+
numReadonlySignedAccounts: 1,
|
|
549
|
+
numReadonlyUnsignedAccounts: 6,
|
|
550
|
+
});
|
|
551
|
+
const oldStaticLen = data.staticAccountKeys.length;
|
|
552
|
+
const remappedInstructions = processed.versionedInstructions.slice(1);
|
|
553
|
+
remappedInstructions.forEach((instruction, ixIndex) => {
|
|
554
|
+
const original = data.versionedInstructions[ixIndex];
|
|
555
|
+
const remappedProgramIndex = instruction.programIdIndex;
|
|
556
|
+
if (original.programIdIndex < oldStaticLen) {
|
|
557
|
+
processed.staticAccountKeys[remappedProgramIndex].should.equal(data.staticAccountKeys[original.programIdIndex]);
|
|
558
|
+
}
|
|
559
|
+
else {
|
|
560
|
+
remappedProgramIndex.should.equal(original.programIdIndex + shift);
|
|
561
|
+
}
|
|
562
|
+
original.accountKeyIndexes.forEach((oldIndex, k) => {
|
|
563
|
+
const newIndex = instruction.accountKeyIndexes[k];
|
|
564
|
+
if (oldIndex < oldStaticLen) {
|
|
565
|
+
processed.staticAccountKeys[newIndex].should.equal(data.staticAccountKeys[oldIndex]);
|
|
566
|
+
}
|
|
567
|
+
else {
|
|
568
|
+
newIndex.should.equal(oldIndex + shift);
|
|
569
|
+
}
|
|
570
|
+
});
|
|
571
|
+
});
|
|
572
|
+
});
|
|
573
|
+
it('makes the nonce account writable and keeps original read-only accounts read-only', () => {
|
|
574
|
+
const { data } = mainFixture();
|
|
575
|
+
const processed = injectNonceAdvance(data);
|
|
576
|
+
const message = compileProcessedMessage(processed);
|
|
577
|
+
// header adjusted for the new authority, nonce account, sysvar and system program
|
|
578
|
+
processed.messageHeader.should.deepEqual({
|
|
579
|
+
numRequiredSignatures: 3, // payer + ro signer + new authority
|
|
580
|
+
numReadonlySignedAccounts: 2, // ro signer + new authority
|
|
581
|
+
numReadonlyUnsignedAccounts: 4, // ro non-signer, program, system program, sysvar
|
|
582
|
+
});
|
|
583
|
+
const indexOf = (key) => processed.staticAccountKeys.indexOf(key);
|
|
584
|
+
// AdvanceNonceAccount requires a writable nonce account
|
|
585
|
+
message.isAccountWritable(indexOf(walletNonceAddress)).should.equal(true);
|
|
586
|
+
// original accounts keep their writability
|
|
587
|
+
message.isAccountWritable(indexOf(fixturePayer.toBase58())).should.equal(true);
|
|
588
|
+
message.isAccountWritable(indexOf(fixtureWritableNonSigner.toBase58())).should.equal(true);
|
|
589
|
+
message.isAccountWritable(indexOf(fixtureRoSigner.toBase58())).should.equal(false);
|
|
590
|
+
message.isAccountWritable(indexOf(fixtureRoNonSigner.toBase58())).should.equal(false);
|
|
591
|
+
message.isAccountWritable(indexOf(fixtureProgram.toBase58())).should.equal(false);
|
|
592
|
+
// the new authority is a read-only signer
|
|
593
|
+
message.isAccountSigner(indexOf(authWalletAddress)).should.equal(true);
|
|
594
|
+
message.isAccountWritable(indexOf(authWalletAddress)).should.equal(false);
|
|
595
|
+
// no duplicate keys
|
|
596
|
+
new Set(processed.staticAccountKeys).size.should.equal(processed.staticAccountKeys.length);
|
|
597
|
+
});
|
|
598
|
+
it('prepends a well-formed AdvanceNonceAccount instruction', () => {
|
|
599
|
+
const { data } = mainFixture();
|
|
600
|
+
const processed = injectNonceAdvance(data);
|
|
601
|
+
const [nonceAdvance] = processed.versionedInstructions;
|
|
602
|
+
should_1.default.exist(nonceAdvance);
|
|
603
|
+
nonceAdvance.data.should.equal('6vx8P'); // SystemProgram AdvanceNonceAccount
|
|
604
|
+
nonceAdvance.programIdIndex.should.equal(processed.staticAccountKeys.indexOf(SYSTEM_PROGRAM_ID));
|
|
605
|
+
nonceAdvance.accountKeyIndexes.should.deepEqual([
|
|
606
|
+
processed.staticAccountKeys.indexOf(walletNonceAddress),
|
|
607
|
+
processed.staticAccountKeys.indexOf(SYSVAR_RECENT_BLOCKHASHES_ID),
|
|
608
|
+
processed.staticAccountKeys.indexOf(authWalletAddress),
|
|
609
|
+
]);
|
|
610
|
+
});
|
|
611
|
+
it('turns an authority already present as a writable non-signer into a writable signer, once', () => {
|
|
612
|
+
const { data } = buildVersionedFixture(fixturePayer, [
|
|
613
|
+
{
|
|
614
|
+
programId: fixtureProgram,
|
|
615
|
+
keys: [
|
|
616
|
+
{ pubkey: fixturePayer, isSigner: true, isWritable: true },
|
|
617
|
+
// authority already present as a writable non-signer
|
|
618
|
+
{ pubkey: new web3_js_1.PublicKey(authWalletAddress), isSigner: false, isWritable: true },
|
|
619
|
+
{ pubkey: fixtureRoNonSigner, isSigner: false, isWritable: false },
|
|
620
|
+
],
|
|
621
|
+
},
|
|
622
|
+
]);
|
|
623
|
+
const processed = injectNonceAdvance(data);
|
|
624
|
+
const message = compileProcessedMessage(processed);
|
|
625
|
+
// appears once, as a signer, keeping its writability
|
|
626
|
+
processed.staticAccountKeys.filter((key) => key === authWalletAddress).should.have.length(1);
|
|
627
|
+
const authIndex = processed.staticAccountKeys.indexOf(authWalletAddress);
|
|
628
|
+
message.isAccountSigner(authIndex).should.equal(true);
|
|
629
|
+
message.isAccountWritable(authIndex).should.equal(true);
|
|
630
|
+
processed.messageHeader.numRequiredSignatures.should.equal(data.messageHeader.numRequiredSignatures + 1);
|
|
631
|
+
processed.messageHeader.numReadonlySignedAccounts.should.equal(data.messageHeader.numReadonlySignedAccounts);
|
|
632
|
+
});
|
|
633
|
+
it('turns an authority already present as a read-only non-signer into a read-only signer, once', () => {
|
|
634
|
+
const { data } = buildVersionedFixture(fixturePayer, [
|
|
635
|
+
{
|
|
636
|
+
programId: fixtureProgram,
|
|
637
|
+
keys: [
|
|
638
|
+
{ pubkey: fixturePayer, isSigner: true, isWritable: true },
|
|
639
|
+
// authority already present as a read-only non-signer
|
|
640
|
+
{ pubkey: new web3_js_1.PublicKey(authWalletAddress), isSigner: false, isWritable: false },
|
|
641
|
+
{ pubkey: fixtureWritableNonSigner, isSigner: false, isWritable: true },
|
|
642
|
+
],
|
|
643
|
+
},
|
|
644
|
+
]);
|
|
645
|
+
const processed = injectNonceAdvance(data);
|
|
646
|
+
const message = compileProcessedMessage(processed);
|
|
647
|
+
// appears once, as a read-only signer
|
|
648
|
+
processed.staticAccountKeys.filter((key) => key === authWalletAddress).should.have.length(1);
|
|
649
|
+
const authIndex = processed.staticAccountKeys.indexOf(authWalletAddress);
|
|
650
|
+
message.isAccountSigner(authIndex).should.equal(true);
|
|
651
|
+
message.isAccountWritable(authIndex).should.equal(false);
|
|
652
|
+
processed.messageHeader.numRequiredSignatures.should.equal(data.messageHeader.numRequiredSignatures + 1);
|
|
653
|
+
processed.messageHeader.numReadonlySignedAccounts.should.equal(data.messageHeader.numReadonlySignedAccounts + 1);
|
|
654
|
+
// it left the read-only non-signers (system program + sysvar are added)
|
|
655
|
+
processed.messageHeader.numReadonlyUnsignedAccounts.should.equal(data.messageHeader.numReadonlyUnsignedAccounts + 1);
|
|
656
|
+
});
|
|
657
|
+
it('does not add a signer when the nonce authority is already the fee payer', () => {
|
|
658
|
+
const { data } = buildVersionedFixture(new web3_js_1.PublicKey(authWalletAddress), [
|
|
659
|
+
{
|
|
660
|
+
programId: fixtureProgram,
|
|
661
|
+
keys: [
|
|
662
|
+
{ pubkey: new web3_js_1.PublicKey(authWalletAddress), isSigner: true, isWritable: true },
|
|
663
|
+
{ pubkey: fixtureWritableNonSigner, isSigner: false, isWritable: true },
|
|
664
|
+
],
|
|
665
|
+
},
|
|
666
|
+
]);
|
|
667
|
+
const processed = injectNonceAdvance(data);
|
|
668
|
+
const message = compileProcessedMessage(processed);
|
|
669
|
+
processed.staticAccountKeys[0].should.equal(authWalletAddress);
|
|
670
|
+
processed.staticAccountKeys.filter((key) => key === authWalletAddress).should.have.length(1);
|
|
671
|
+
processed.messageHeader.numRequiredSignatures.should.equal(data.messageHeader.numRequiredSignatures);
|
|
672
|
+
processed.messageHeader.numReadonlySignedAccounts.should.equal(data.messageHeader.numReadonlySignedAccounts);
|
|
673
|
+
message.isAccountSigner(0).should.equal(true);
|
|
674
|
+
});
|
|
675
|
+
it('moves a nonce account already present as read-only into the writable non-signers', () => {
|
|
676
|
+
const { data } = buildVersionedFixture(fixturePayer, [
|
|
677
|
+
{
|
|
678
|
+
programId: fixtureProgram,
|
|
679
|
+
keys: [
|
|
680
|
+
{ pubkey: fixturePayer, isSigner: true, isWritable: true },
|
|
681
|
+
{ pubkey: fixtureRoNonSigner, isSigner: false, isWritable: false },
|
|
682
|
+
// nonce account already present as a read-only non-signer
|
|
683
|
+
{ pubkey: new web3_js_1.PublicKey(walletNonceAddress), isSigner: false, isWritable: false },
|
|
684
|
+
],
|
|
685
|
+
},
|
|
686
|
+
]);
|
|
687
|
+
const processed = injectNonceAdvance(data);
|
|
688
|
+
const message = compileProcessedMessage(processed);
|
|
689
|
+
processed.staticAccountKeys.filter((key) => key === walletNonceAddress).should.have.length(1);
|
|
690
|
+
const nonceIndex = processed.staticAccountKeys.indexOf(walletNonceAddress);
|
|
691
|
+
message.isAccountWritable(nonceIndex).should.equal(true);
|
|
692
|
+
message.isAccountSigner(nonceIndex).should.equal(false);
|
|
693
|
+
// the other original read-only account stays read-only
|
|
694
|
+
message.isAccountWritable(processed.staticAccountKeys.indexOf(fixtureRoNonSigner.toBase58())).should.equal(false);
|
|
695
|
+
});
|
|
696
|
+
it('produces a signable payload that deserializes as a MessageV0 with the nonce advance first', async () => {
|
|
697
|
+
const { data } = mainFixture();
|
|
698
|
+
const txBuilder = factory.getCustomInstructionBuilder();
|
|
699
|
+
txBuilder.nonce(recentBlockHash, { walletNonceAddress, authWalletAddress });
|
|
700
|
+
txBuilder.fromVersionedTransactionData(data);
|
|
701
|
+
const tx = await txBuilder.build();
|
|
702
|
+
const message = web3_js_1.MessageV0.deserialize(tx.signablePayload);
|
|
703
|
+
message.compiledInstructions.should.have.length(data.versionedInstructions.length + 1);
|
|
704
|
+
const nonceAdvance = message.compiledInstructions[0];
|
|
705
|
+
message.staticAccountKeys[nonceAdvance.programIdIndex].toBase58().should.equal(SYSTEM_PROGRAM_ID);
|
|
706
|
+
message.staticAccountKeys[nonceAdvance.accountKeyIndexes[0]].toBase58().should.equal(walletNonceAddress);
|
|
707
|
+
message.staticAccountKeys[nonceAdvance.accountKeyIndexes[1]]
|
|
708
|
+
.toBase58()
|
|
709
|
+
.should.equal(SYSVAR_RECENT_BLOCKHASHES_ID);
|
|
710
|
+
message.staticAccountKeys[nonceAdvance.accountKeyIndexes[2]].toBase58().should.equal(authWalletAddress);
|
|
711
|
+
});
|
|
712
|
+
it('rejects versioned data whose message header is inconsistent', () => {
|
|
713
|
+
const { data } = mainFixture();
|
|
714
|
+
const inconsistent = {
|
|
715
|
+
...data,
|
|
716
|
+
messageHeader: { ...data.messageHeader, numReadonlyUnsignedAccounts: 99 },
|
|
717
|
+
};
|
|
718
|
+
const txBuilder = factory.getCustomInstructionBuilder();
|
|
719
|
+
txBuilder.nonce(recentBlockHash, { walletNonceAddress, authWalletAddress });
|
|
720
|
+
(0, should_1.default)(() => txBuilder.fromVersionedTransactionData(inconsistent)).throwError(/Invalid message header/);
|
|
721
|
+
});
|
|
722
|
+
});
|
|
412
723
|
});
|
|
413
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tSW5zdHJ1Y3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGVzdC91bml0L3RyYW5zYWN0aW9uQnVpbGRlci9jdXN0b21JbnN0cnVjdGlvbkJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsNkNBTXlCO0FBQ3pCLDREQUF5RDtBQUN6RCxzQ0FBMkQ7QUFDM0QsOERBQWdEO0FBRWhELGdEQUEwQjtBQUUxQixRQUFRLENBQUMsZ0NBQWdDLEVBQUUsR0FBRyxFQUFFO0lBQzlDLE1BQU0sT0FBTyxHQUFHLElBQUEscUNBQWlCLEVBQUMsTUFBTSxDQUFDLENBQUM7SUFFMUMsTUFBTSx3QkFBd0IsR0FBRyxHQUFHLEVBQUU7UUFDcEMsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLDJCQUEyQixFQUFFLENBQUM7UUFDeEQsU0FBUyxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNqQyxTQUFTLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNsQyxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDLENBQUM7SUFFRixNQUFNLFdBQVcsR0FBRyxJQUFJLGFBQU8sQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDaEUsTUFBTSxZQUFZLEdBQUcsSUFBSSxhQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNyRixNQUFNLGVBQWUsR0FBRyw4Q0FBOEMsQ0FBQztJQUN2RSxNQUFNLElBQUksR0FBRyxXQUFXLENBQUM7SUFFekIsMkVBQTJFO0lBQzNFLE1BQU0sMEJBQTBCLEdBQUcsQ0FBQyxXQUFtQyxFQUFFLEVB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QUNwQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUNwQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdkMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHNob3VsZCBmcm9tICdzaG91bGQnO1xuaW1wb3J0IHtcbiAgU3lzdGVtUHJvZ3JhbSxcbiAgUHVibGljS2V5LFxuICBUcmFuc2FjdGlvbkluc3RydWN0aW9uLFxuICBDb21wdXRlQnVkZ2V0UHJvZ3JhbSxcbiAgVmVyc2lvbmVkVHJhbnNhY3Rpb24sXG59IGZyb20gJ0Bzb2xhbmEvd2ViMy5qcyc7XG5pbXBvcnQgeyBnZXRCdWlsZGVyRmFjdG9yeSB9IGZyb20gJy4uL2dldEJ1aWxkZXJGYWN0b3J5JztcbmltcG9ydCB7IEtleVBhaXIsIFV0aWxzLCBUcmFuc2FjdGlvbiB9IGZyb20gJy4uLy4uLy4uL3NyYyc7XG5pbXBvcnQgKiBhcyB0ZXN0RGF0YSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvc29sJztcbmltcG9ydCB7IFNvbFZlcnNpb25lZEluc3RydWN0aW9uIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IGJhc2U1OCBmcm9tICdiczU4JztcblxuZGVzY3JpYmUoJ1NvbCBDdXN0b20gSW5zdHJ1Y3Rpb24gQnVpbGRlcicsICgpID0+IHtcbiAgY29uc3QgZmFjdG9yeSA9IGdldEJ1aWxkZXJGYWN0b3J5KCd0c29sJyk7XG5cbiAgY29uc3QgY3VzdG9tSW5zdHJ1Y3Rpb25CdWlsZGVyID0gKCkgPT4ge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0Q3VzdG9tSW5zdHJ1Y3Rpb25CdWlsZGVyKCk7XG4gICAgdHhCdWlsZGVyLm5vbmNlKHJlY2VudEJsb2NrSGFzaCk7XG4gICAgdHhCdWlsZGVyLnNlbmRlcihhdXRoQWNjb3VudC5wdWIpO1xuICAgIHJldHVybiB0eEJ1aWxkZXI7XG4gIH07XG5cbiAgY29uc3QgYXV0aEFjY291bnQgPSBuZXcgS2V5UGFpcih0ZXN0RGF0YS5hdXRoQWNjb3VudCkuZ2V0S2V5cygpO1xuICBjb25zdCBvdGhlckFjY291bnQgPSBuZXcgS2V5UGFpcih7IHBydjogdGVzdERhdGEucHJ2S2V5cy5wcnZLZXkxLmJhc2U1OCB9KS5nZXRLZXlzKCk7XG4gIGNvbnN0IHJlY2VudEJsb2NrSGFzaCA9ICdHSHRYUUJzb1pIVm5ORmE5WWV2QXpGcjE3REpqZ0hYazN5Y1RLRDV4RDNaaSc7XG4gIGNvbnN0IG1lbW8gPSAndGVzdCBtZW1vJztcblxuICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gY29udmVydCBUcmFuc2FjdGlvbkluc3RydWN0aW9uIHRvIHRoZSBleHBlY3RlZCBmb3JtYXRcbiAgY29uc3QgY29udmVydEluc3RydWN0aW9uVG9QYXJhbXMgPSAoaW5zdHJ1Y3Rpb246IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24pID0+ICh7XG4gICAgcHJvZ3JhbUlkOiBpbnN0cnVjdGlvbi5wcm9ncmFtSWQudG9TdHJpbmcoKSxcbiAgICBrZXlzOiBpbnN0cnVjdGlvbi5rZXlzLm1hcCgoa2V5KSA9PiAoe1xuICAgICAgcHVia2V5OiBrZXkucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICBpc1NpZ25lcjoga2V5LmlzU2lnbmVyLFxuICAgICAgaXNXcml0YWJsZToga2V5LmlzV3JpdGFibGUsXG4gICAgfSkpLFxuICAgIGRhdGE6IGluc3RydWN0aW9uLmRhdGEudG9TdHJpbmcoJ2hleCcpLFxuICB9KTtcblxuICBkZXNjcmliZSgnU3VjY2VlZCcsICgpID0+IHtcbiAgICBpdCgnYnVpbGQgYSB0cmFuc2FjdGlvbiB3aXRoIGEgc2luZ2xlIGN1c3RvbSBpbnN0cnVjdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHRyYW5zZmVySW5zdHJ1Y3Rpb24gPSBTeXN0ZW1Qcm9ncmFtLnRyYW5zZmVyKHtcbiAgICAgICAgZnJvbVB1YmtleTogbmV3IFB1YmxpY0tleShhdXRoQWNjb3VudC5wdWIpLFxuICAgICAgICB0b1B1YmtleTogbmV3IFB1YmxpY0tleShvdGhlckFjY291bnQucHViKSxcbiAgICAgICAgbGFtcG9ydHM6IDEwMDAwMDAsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdHhCdWlsZGVyID0gY3VzdG9tSW5zdHJ1Y3Rpb25CdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIuYWRkQ3VzdG9tSW5zdHJ1Y3Rpb24oY29udmVydEluc3RydWN0aW9uVG9QYXJhbXModHJhbnNmZXJJbnN0cnVjdGlvbikpO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcblxuICAgICAgdHguaW5wdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMCk7XG5cbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHNob3VsZC5lcXVhbChVdGlscy5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHgpLCB0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdidWlsZCBhIHRyYW5zYWN0aW9uIHdpdGggbXVsdGlwbGUgY3VzdG9tIGluc3RydWN0aW9ucycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHRyYW5zZmVySW5zdHJ1Y3Rpb24gPSBTeXN0ZW1Qcm9ncmFtLnRyYW5zZmVyKHtcbiAgICAgICAgZnJvbVB1YmtleTogbmV3IFB1YmxpY0tleShhdXRoQWNjb3VudC5wdWIpLFxuICAgICAgICB0b1B1YmtleTogbmV3IFB1YmxpY0tleShvdGhlckFjY291bnQucHViKSxcbiAgICAgICAgbGFtcG9ydHM6IDEwMDAwMDAsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcHJpb3JpdHlGZWVJbnN0cnVjdGlvbiA9IENvbXB1dGVCdWRnZXRQcm9ncmFtLnNldENvbXB1dGVVbml0UHJpY2Uoe1xuICAgICAgICBtaWNyb0xhbXBvcnRzOiAxMDAwLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGN1c3RvbUluc3RydWN0aW9uQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLmFkZEN1c3RvbUluc3RydWN0aW9ucyhbXG4gICAgICAgIGNvbnZlcnRJbnN0cnVjdGlvblRvUGFyYW1zKHRyYW5zZmVySW5zdHJ1Y3Rpb24pLFxuICAgICAgICBjb252ZXJ0SW5zdHJ1Y3Rpb25Ub1BhcmFtcyhwcmlvcml0eUZlZUluc3RydWN0aW9uKSxcbiAgICAgIF0pO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcblxuICAgICAgdHguaW5wdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMCk7XG4gICAgICB0eC5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMCk7XG5cbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHNob3VsZC5lcXVhbChVdGlscy5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHgpLCB0cnVlKTtcblxuICAgICAgLy8gU2hvdWxkIGhhdmUgMiBpbnN0cnVjdGlvbnNcbiAgICAgICh0eCBhcyBUcmFuc2FjdGlvbikuc29sVHJhbnNhY3Rpb24uaW5zdHJ1Y3Rpb25zLnNob3VsZC5oYXZlLmxlbmd0aCgyKTtcbiAgICB9KTtcblxuICAgIGl0KCdidWlsZCBhIHRyYW5zYWN0aW9uIHdpdGggY3VzdG9tIGluc3RydWN0aW9uIGFuZCBtZW1vJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHJhbnNmZXJJbnN0cnVjdGlvbiA9IFN5c3RlbVByb2dyYW0udHJhbnNmZXIoe1xuICAgICAgICBmcm9tUHVia2V5OiBuZXcgUHVibGljS2V5KGF1dGhBY2NvdW50LnB1YiksXG4gICAgICAgIHRvUHVia2V5OiBuZXcgUHVibGljS2V5KG90aGVyQWNjb3VudC5wdWIpLFxuICAgICAgICBsYW1wb3J0czogMTAwMDAwMCxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBjdXN0b21JbnN0cnVjdGlvbkJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci5hZGRDdXN0b21JbnN0cnVjdGlvbihjb252ZXJ0SW5zdHJ1Y3Rpb25Ub1BhcmFtcyh0cmFuc2Zlckluc3RydWN0aW9uKSk7XG4gICAgICB0eEJ1aWxkZXIubWVtbyhtZW1vKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG5cbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHNob3VsZC5lcXVhbChVdGlscy5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHgpLCB0cnVlKTtcblxuICAgICAgLy8gU2hvdWxkIGhhdmUgaW5zdHJ1Y3Rpb24gKyBtZW1vXG4gICAgICAodHggYXMgVHJhbnNhY3Rpb24pLnNvbFRyYW5zYWN0aW9uLmluc3RydWN0aW9ucy5zaG91bGQuaGF2ZS5sZW5ndGgoMik7XG4gICAgfSk7XG5cbiAgICBpdCgnYnVpbGQgYSBzaWduZWQgdHJhbnNhY3Rpb24gd2l0aCBjdXN0b20gaW5zdHJ1Y3Rpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0cmFuc2Zlckluc3RydWN0aW9uID0gU3lzdGVtUHJvZ3JhbS50cmFuc2Zlcih7XG4gICAgICAgIGZyb21QdWJrZXk6IG5ldyBQdWJsaWNLZXkoYXV0aEFjY291bnQucHViKSxcbiAgICAgICAgdG9QdWJrZXk6IG5ldyBQdWJsaWNLZXkob3RoZXJBY2NvdW50LnB1YiksXG4gICAgICAgIGxhbXBvcnRzOiAxMDAwMDAwLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGN1c3RvbUluc3RydWN0aW9uQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLmFkZEN1c3RvbUluc3RydWN0aW9uKGNvbnZlcnRJbnN0cnVjdGlvblRvUGFyYW1zKHRyYW5zZmVySW5zdHJ1Y3Rpb24pKTtcbiAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiBhdXRoQWNjb3VudC5wcnYgfSk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuXG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBzaG91bGQuZXF1YWwoVXRpbHMuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1R4KSwgdHJ1ZSk7XG5cbiAgICAgIC8vIFNob3VsZCBiZSBzaWduZWRcbiAgICAgICh0eCBhcyBUcmFuc2FjdGlvbikuc29sVHJhbnNhY3Rpb24uc2lnbmF0dXJlcy5zaG91bGQubm90LmJlLmVtcHR5KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnY2xlYXIgaW5zdHJ1Y3Rpb25zIGZyb20gYnVpbGRlcicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHRyYW5zZmVySW5zdHJ1Y3Rpb24gPSBTeXN0ZW1Qcm9ncmFtLnRyYW5zZmVyKHtcbiAgICAgICAgZnJvbVB1YmtleTogbmV3IFB1YmxpY0tleShhdXRoQWNjb3VudC5wdWIpLFxuICAgICAgICB0b1B1YmtleTogbmV3IFB1YmxpY0tleShvdGhlckFjY291bnQucHViKSxcbiAgICAgICAgbGFtcG9ydHM6IDEwMDAwMDAsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdHhCdWlsZGVyID0gY3VzdG9tSW5zdHJ1Y3Rpb25CdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIuYWRkQ3VzdG9tSW5zdHJ1Y3Rpb24oY29udmVydEluc3RydWN0aW9uVG9QYXJhbXModHJhbnNmZXJJbnN0cnVjdGlvbikpO1xuICAgICAgdHhCdWlsZGVyLmdldEluc3RydWN0aW9ucygpLnNob3VsZC5oYXZlLmxlbmd0aCgxKTtcblxuICAgICAgdHhCdWlsZGVyLmNsZWFySW5zdHJ1Y3Rpb25zKCk7XG4gICAgICB0eEJ1aWxkZXIuZ2V0SW5zdHJ1Y3Rpb25zKCkuc2hvdWxkLmhhdmUubGVuZ3RoKDApO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyBUeXBlIGZvciB0ZXN0aW5nIGludmFsaWQgaW5zdHJ1Y3Rpb24gZm9ybWF0c1xuICBpbnRlcmZhY2UgSW52YWxpZEluc3RydWN0aW9uIHtcbiAgICBwcm9ncmFtSWQ/OiBzdHJpbmc7XG4gICAga2V5cz86IHVua25vd247XG4gICAgZGF0YT86IHVua25vd247XG4gIH1cblxuICBkZXNjcmliZSgnRmFpbCcsICgpID0+IHtcbiAgICBpdCgnZm9yIG51bGwgaW5zdHJ1Y3Rpb24nLCAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBjdXN0b21JbnN0cnVjdGlvbkJ1aWxkZXIoKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICBzaG91bGQoKCkgPT4gdHhCdWlsZGVyLmFkZEN1c3RvbUluc3RydWN0aW9uKG51bGwgYXMgYW55KSkudGhyb3dFcnJvcignSW5zdHJ1Y3Rpb24gY2Fubm90IGJlIG51bGwgb3IgdW5kZWZpbmVkJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnZm9yIHVuZGVmaW5lZCBpbnN0cnVjdGlvbicsICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGN1c3RvbUluc3RydWN0aW9uQnVpbGRlcigpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIHNob3VsZCgoKSA9PiB0eEJ1aWxkZXIuYWRkQ3VzdG9tSW5zdHJ1Y3Rpb24odW5kZWZpbmVkIGFzIGFueSkpLnRocm93RXJyb3IoXG4gICAgICAgICdJbnN0cnVjdGlvbiBjYW5ub3QgYmUgbnVsbCBvciB1bmRlZmluZWQnXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ2ZvciBpbnN0cnVjdGlvbiB3aXRob3V0IHByb2dyYW1JZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGN1c3RvbUluc3RydWN0aW9uQnVpbGRlcigpO1xuICAgICAgY29uc3QgaW52YWxpZEluc3RydWN0aW9uOiBJbnZhbGlkSW5zdHJ1Y3Rpb24gPSB7XG4gICAgICAgIGtleXM6IFtdLFxuICAgICAgICBkYXRhOiAnJyxcbiAgICAgIH07XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICBzaG91bGQoKCkgPT4gdHhCdWlsZGVyLmFkZEN1c3RvbUluc3RydWN0aW9uKGludmFsaWRJbnN0cnVjdGlvbiBhcyBhbnkpKS50aHJvd0Vycm9yKFxuICAgICAgICAnVmVyc2lvbmVkIGluc3RydWN0aW9uIG11c3QgaGF2ZSBhIHZhbGlkIHByb2dyYW1JZEluZGV4IG51bWJlcidcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnZm9yIGluc3RydWN0aW9uIHdpdGhvdXQga2V5cycsICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGN1c3RvbUluc3RydWN0aW9uQnVpbGRlcigpO1xuICAgICAgY29uc3QgaW52YWxpZEluc3RydWN0aW9uOiBJbnZhbGlkSW5zdHJ1Y3Rpb24gPSB7XG4gICAgICAgIHByb2dyYW1JZDogJzExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyJyxcbiAgICAgICAgZGF0YTogJycsXG4gICAgICB9O1xuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgc2hvdWxkKCgpID0+IHR4QnVpbGRlci5hZGRDdXN0b21JbnN0cnVjdGlvbihpbnZhbGlkSW5zdHJ1Y3Rpb24gYXMgYW55KSkudGhyb3dFcnJvcihcbiAgICAgICAgJ0luc3RydWN0aW9uIG11c3QgaGF2ZSB2YWxpZCBrZXlzIGFycmF5J1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdmb3IgaW5zdHJ1Y3Rpb24gd2l0aG91dCBkYXRhJywgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gY3VzdG9tSW5zdHJ1Y3Rpb25CdWlsZGVyKCk7XG4gICAgICBjb25zdCBpbnZhbGlkSW5zdHJ1Y3Rpb246IEludmFsaWRJbnN0cnVjdGlvbiA9IHtcbiAgICAgICAgcHJvZ3JhbUlkOiAnMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTInLFxuICAgICAgICBrZXlzOiBbXSxcbiAgICAgIH07XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICBzaG91bGQoKCkgPT4gdHhCdWlsZGVyLmFkZEN1c3RvbUluc3RydWN0aW9uKGludmFsaWRJbnN0cnVjdGlvbiBhcyBhbnkpKS50aHJvd0Vycm9yKFxuICAgICAgICAnSW5zdHJ1Y3Rpb24gbXVzdCBoYXZlIHZhbGlkIGRhdGEgc3RyaW5nJ1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdmb3Igbm9uLWFycmF5IGluIGFkZEN1c3RvbUluc3RydWN0aW9ucycsICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGN1c3RvbUluc3RydWN0aW9uQnVpbGRlcigpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIHNob3VsZCgoKSA9PiB0eEJ1aWxkZXIuYWRkQ3VzdG9tSW5zdHJ1Y3Rpb25zKCdpbnZhbGlkJyBhcyBhbnkpKS50aHJvd0Vycm9yKCdJbnN0cnVjdGlvbnMgbXVzdCBiZSBhbiBhcnJheScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3doZW4gYnVpbGRpbmcgd2l0aG91dCBpbnN0cnVjdGlvbnMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBjdXN0b21JbnN0cnVjdGlvbkJ1aWxkZXIoKTtcbiAgICAgIGF3YWl0IHR4QnVpbGRlci5idWlsZCgpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ0F0IGxlYXN0IG9uZSBjdXN0b20gaW5zdHJ1Y3Rpb24gbXVzdCBiZSBzcGVjaWZpZWQnKTtcbiAgICB9KTtcblxuICAgIGl0KCd3aGVuIGJ1aWxkaW5nIHdpdGhvdXQgc2VuZGVyJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHJhbnNmZXJJbnN0cnVjdGlvbiA9IFN5c3RlbVByb2dyYW0udHJhbnNmZXIoe1xuICAgICAgICBmcm9tUHVia2V5OiBuZXcgUHVibGljS2V5KGF1dGhBY2NvdW50LnB1YiksXG4gICAgICAgIHRvUHVia2V5OiBuZXcgUHVibGljS2V5KG90aGVyQWNjb3VudC5wdWIpLFxuICAgICAgICBsYW1wb3J0czogMTAwMDAwMCxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldEN1c3RvbUluc3RydWN0aW9uQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLm5vbmNlKHJlY2VudEJsb2NrSGFzaCk7XG4gICAgICB0eEJ1aWxkZXIuYWRkQ3VzdG9tSW5zdHJ1Y3Rpb24oY29udmVydEluc3RydWN0aW9uVG9QYXJhbXModHJhbnNmZXJJbnN0cnVjdGlvbikpO1xuXG4gICAgICBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdJbnZhbGlkIHRyYW5zYWN0aW9uOiBtaXNzaW5nIHNlbmRlcicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3doZW4gYnVpbGRpbmcgd2l0aG91dCBub25jZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHRyYW5zZmVySW5zdHJ1Y3Rpb24gPSBTeXN0ZW1Qcm9ncmFtLnRyYW5zZmVyKHtcbiAgICAgICAgZnJvbVB1YmtleTogbmV3IFB1YmxpY0tleShhdXRoQWNjb3VudC5wdWIpLFxuICAgICAgICB0b1B1YmtleTogbmV3IFB1YmxpY0tleShvdGhlckFjY291bnQucHViKSxcbiAgICAgICAgbGFtcG9ydHM6IDEwMDAwMDAsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRDdXN0b21JbnN0cnVjdGlvbkJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIoYXV0aEFjY291bnQucHViKTtcbiAgICAgIHR4QnVpbGRlci5hZGRDdXN0b21JbnN0cnVjdGlvbihjb252ZXJ0SW5zdHJ1Y3Rpb25Ub1BhcmFtcyh0cmFuc2Zlckluc3RydWN0aW9uKSk7XG5cbiAgICAgIGF3YWl0IHR4QnVpbGRlci5idWlsZCgpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ0ludmFsaWQgdHJhbnNhY3Rpb246IG1pc3Npbmcgbm9uY2UgYmxvY2toYXNoJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdTb2xWZXJzaW9uZWRJbnN0cnVjdGlvbiBTdXBwb3J0JywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgYWNjZXB0IGFuZCB2YWxpZGF0ZSBTb2xWZXJzaW9uZWRJbnN0cnVjdGlvbiBmb3JtYXQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBjb21waWxlZEluc3RydWN0aW9uOiBTb2xWZXJzaW9uZWRJbnN0cnVjdGlvbiA9IHtcbiAgICAgICAgcHJvZ3JhbUlkSW5kZXg6IDEsXG4gICAgICAgIGFjY291bnRLZXlJbmRleGVzOiBbMCwgMiwgM10sXG4gICAgICAgIGRhdGE6ICczQnhzNDNaTWpTUlFMczZvJywgLy8gYmFzZTU4IGVuY29kZWQgaW5zdHJ1Y3Rpb24gZGF0YVxuICAgICAgfTtcblxuICAgICAgY29uc3QgdHhCdWlsZGVyID0gY3VzdG9tSW5zdHJ1Y3Rpb25CdWlsZGVyKCk7XG4gICAgICBzaG91bGQoKCkgPT4gdHhCdWlsZGVyLmFkZEN1c3RvbUluc3RydWN0aW9uKGNvbXBpbGVkSW5zdHJ1Y3Rpb24pKS5ub3QudGhyb3dFcnJvcigpO1xuXG4gICAgICB0eEJ1aWxkZXIuZ2V0SW5zdHJ1Y3Rpb25zKCkuc2hvdWxkLmhhdmUubGVuZ3RoKDEpO1xuICAgICAgY29uc3QgYWRkZWRJbnN0cnVjdGlvbiA9IHR4QnVpbGRlci5nZXRJbnN0cnVjdGlvbnMoKVswXTtcbiAgICAgIGFkZGVkSW5zdHJ1Y3Rpb24ucGFyYW1zLnNob3VsZC5kZWVwRXF1YWwoY29tcGlsZWRJbnN0cnVjdGlvbik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIHZlcnNpb25lZCBpbnN0cnVjdGlvbiBmb3JtYXQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBjdXN0b21JbnN0cnVjdGlvbkJ1aWxkZXIoKTtcblxuICAgICAgLy8gSW52YWxpZCBwcm9ncmFtSWRJbmRleFxuICAgICAgc2hvdWxkKCgpID0+XG4gICAgICAgIHR4QnVpbGRlci5hZGRDdXN0b21JbnN0cnVjdGlvbih7XG4gICAgICAgICAgcHJvZ3JhbUlkSW5kZXg6IC0xLFxuICAgICAgICAgIGFjY291bnRLZXlJbmRleGVzOiBbMF0sXG4gICAgICAgICAgZGF0YTogJzEnLCAvLyBiYXNlNTggZm9yIDB4MDBcbiAgICAgICAgfSBhcyBTb2xWZXJzaW9uZWRJbnN0cnVjdGlvbilcbiAgICAgICkudGhyb3dFcnJvcignVmVyc2lvbmVkIGluc3RydWN0aW9uIG11c3QgaGF2ZSBhIHZhbGlkIHByb2dyYW1JZEluZGV4IG51bWJlcicpO1xuXG4gICAgICAvLyBJbnZhbGlkIGFjY291bnRLZXlJbmRleGVzXG4gICAgICBzaG91bGQoKCkgPT5cbiAgICAgICAgdHhCdWlsZGVyLmFkZEN1c3RvbUluc3RydWN0aW9uKHtcbiAgICAgICAgICBwcm9ncmFtSWRJbmRleDogMCxcbiAgICAgICAgICBhY2NvdW50S2V5SW5kZXhlczogWy0xXSxcbiAgICAgICAgICBkYXRhOiAnMScsIC8vIGJhc2U1OCBmb3IgMHgwMFxuICAgICAgICB9IGFzIFNvbFZlcnNpb25lZEluc3RydWN0aW9uKVxuICAgICAgKS50aHJvd0Vycm9yKCdFYWNoIGFjY291bnRLZXlJbmRleCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlcicpO1xuXG4gICAgICAvLyBNaXNzaW5nIGRhdGFcbiAgICAgIHNob3VsZCgoKSA9PlxuICAgICAgICB0eEJ1aWxkZXIuYWRkQ3VzdG9tSW5zdHJ1Y3Rpb24oe1xuICAgICAgICAgIHByb2dyYW1JZEluZGV4OiAwLFxuICAgICAgICAgIGFjY291bnRLZXlJbmRleGVzOiBbMF0sXG4gICAgICAgIH0gYXMgU29sVmVyc2lvbmVkSW5zdHJ1Y3Rpb24pXG4gICAgICApLnRocm93RXJyb3IoJ1ZlcnNpb25lZCBpbnN0cnVjdGlvbiBtdXN0IGhhdmUgdmFsaWQgZGF0YSBzdHJpbmcnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIG1peGVkIFNvbEluc3RydWN0aW9uIGFuZCBTb2xWZXJzaW9uZWRJbnN0cnVjdGlvbicsICgpID0+IHtcbiAgICAgIGNvbnN0IHRyYWRpdGlvbmFsSW5zdHJ1Y3Rpb24gPSBjb252ZXJ0SW5zdHJ1Y3Rpb25Ub1BhcmFtcyhcbiAgICAgICAgU3lzdGVtUHJvZ3JhbS50cmFuc2Zlcih7XG4gICAgICAgICAgZnJvbVB1YmtleTogbmV3IFB1YmxpY0tleShhdXRoQWNjb3VudC5wdWIpLFxuICAgICAgICAgIHRvUHVia2V5OiBuZXcgUHVibGljS2V5KG90aGVyQWNjb3VudC5wdWIpLFxuICAgICAgICAgIGxhbXBvcnRzOiAxMDAwMDAwLFxuICAgICAgICB9KVxuICAgICAgKTtcblxuICAgICAgY29uc3QgY29tcGlsZWRJbnN0cnVjdGlvbjogU29sVmVyc2lvbmVkSW5zdHJ1Y3Rpb24gPSB7XG4gICAgICAgIHByb2dyYW1JZEluZGV4OiAxLFxuICAgICAgICBhY2NvdW50S2V5SW5kZXhlczogWzAsIDJdLFxuICAgICAgICBkYXRhOiAnNEhTbzVZVkJyZ0NoVFpYNScsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBjdXN0b21JbnN0cnVjdGlvbkJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci5hZGRDdXN0b21JbnN0cnVjdGlvbih0cmFkaXRpb25hbEluc3RydWN0aW9uKTtcbiAgICAgIHR4QnVpbGRlci5hZGRDdXN0b21JbnN0cnVjdGlvbihjb21waWxlZEluc3RydWN0aW9uKTtcblxuICAgICAgdHhCdWlsZGVyLmdldEluc3RydWN0aW9ucygpLnNob3VsZC5oYXZlLmxlbmd0aCgyKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2Zyb21WZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEnLCAoKSA9PiB7XG4gICAgZnVuY3Rpb24gZXh0cmFjdFZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YShiYXNlNjRCeXRlczogc3RyaW5nKSB7XG4gICAgICBjb25zdCBidWZmZXIgPSBCdWZmZXIuZnJvbShiYXNlNjRCeXRlcywgJ2Jhc2U2NCcpO1xuICAgICAgY29uc3QgdmVyc2lvbmVkVHggPSBWZXJzaW9uZWRUcmFuc2FjdGlvbi5kZXNlcmlhbGl6ZShidWZmZXIpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB2ZXJzaW9uZWRJbnN0cnVjdGlvbnM6IHZlcnNpb25lZFR4Lm1lc3NhZ2UuY29tcGlsZWRJbnN0cnVjdGlvbnMubWFwKChjaSkgPT4gKHtcbiAgICAgICAgICBwcm9ncmFtSWRJbmRleDogY2kucHJvZ3JhbUlkSW5kZXgsXG4gICAgICAgICAgYWNjb3VudEtleUluZGV4ZXM6IGNpLmFjY291bnRLZXlJbmRleGVzLFxuICAgICAgICAgIGRhdGE6IGJhc2U1OC5lbmNvZGUoY2kuZGF0YSksXG4gICAgICAgIH0pKSxcbiAgICAgICAgYWRkcmVzc0xvb2t1cFRhYmxlczogdmVyc2lvbmVkVHgubWVzc2FnZS5hZGRyZXNzVGFibGVMb29rdXBzLm1hcCgoYWx0KSA9PiAoe1xuICAgICAgICAgIGFjY291bnRLZXk6IGFsdC5hY2NvdW50S2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgd3JpdGFibGVJbmRleGVzOiBhbHQud3JpdGFibGVJbmRleGVzLFxuICAgICAgICAgIHJlYWRvbmx5SW5kZXhlczogYWx0LnJlYWRvbmx5SW5kZXhlcyxcbiAgICAgICAgfSkpLFxuICAgICAgICBzdGF0aWNBY2NvdW50S2V5czogdmVyc2lvbmVkVHgubWVzc2FnZS5zdGF0aWNBY2NvdW50S2V5cy5tYXAoKGtleSkgPT4ga2V5LnRvU3RyaW5nKCkpLFxuICAgICAgICBtZXNzYWdlSGVhZGVyOiB7XG4gICAgICAgICAgbnVtUmVxdWlyZWRTaWduYXR1cmVzOiB2ZXJzaW9uZWRUeC5tZXNzYWdlLmhlYWRlci5udW1SZXF1aXJlZFNpZ25hdHVyZXMsXG4gICAgICAgICAgbnVtUmVhZG9ubHlTaWduZWRBY2NvdW50czogdmVyc2lvbmVkVHgubWVzc2FnZS5oZWFkZXIubnVtUmVhZG9ubHlTaWduZWRBY2NvdW50cyxcbiAgICAgICAgICBudW1SZWFkb25seVVuc2lnbmVkQWNjb3VudHM6IHZlcnNpb25lZFR4Lm1lc3NhZ2UuaGVhZGVyLm51bVJlYWRvbmx5VW5zaWduZWRBY2NvdW50cyxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaXQoJ3Nob3VsZCBwcm9jZXNzIFZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YSBhbmQgZXh0cmFjdCBpbnN0cnVjdGlvbnMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBjdXN0b21JbnN0cnVjdGlvbkJ1aWxkZXIoKTtcbiAgICAgIGNvbnN0IHZlcnNpb25lZFR4RGF0YSA9IGV4dHJhY3RWZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEodGVzdERhdGEuSlVQSVRFUl9WRVJTSU9ORURfVFhfQllURVMpO1xuXG4gICAgICAvLyBTaG91bGQgcGFyc2Ugd2l0aG91dCB0aHJvd2luZyBlcnJvcnNcbiAgICAgIHNob3VsZCgoKSA9PiB0eEJ1aWxkZXIuZnJvbVZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YSh2ZXJzaW9uZWRUeERhdGEpKS5ub3QudGhyb3dFcnJvcigpO1xuXG4gICAgICAvLyBTaG91bGQgaGF2ZSBleHRyYWN0ZWQgaW5zdHJ1Y3Rpb25zXG4gICAgICBjb25zdCBpbnN0cnVjdGlvbnMgPSB0eEJ1aWxkZXIuZ2V0SW5zdHJ1Y3Rpb25zKCk7XG4gICAgICBpbnN0cnVjdGlvbnMubGVuZ3RoLnNob3VsZC5iZS5ncmVhdGVyVGhhbigwKTtcblxuICAgICAgZm9yIChjb25zdCBpbnN0cnVjdGlvbiBvZiBpbnN0cnVjdGlvbnMpIHtcbiAgICAgICAgaW5zdHJ1Y3Rpb24udHlwZS5zaG91bGQuZXF1YWwoJ1ZlcnNpb25lZEN1c3RvbUluc3RydWN0aW9uJyk7XG4gICAgICAgIGluc3RydWN0aW9uLnBhcmFtcy5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgncHJvZ3JhbUlkSW5kZXgnKTtcbiAgICAgICAgaW5zdHJ1Y3Rpb24ucGFyYW1zLnNob3VsZC5oYXZlLnByb3BlcnR5KCdhY2NvdW50S2V5SW5kZXhlcycpO1xuICAgICAgICBpbnN0cnVjdGlvbi5wYXJhbXMuc2hvdWxkLmhhdmUucHJvcGVydHkoJ2RhdGEnKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc3RvcmUgVmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhIGluIHVuZGVybHlpbmcgdHJhbnNhY3Rpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBjdXN0b21JbnN0cnVjdGlvbkJ1aWxkZXIoKTtcbiAgICAgIGNvbnN0IHZlcnNpb25lZFR4RGF0YSA9IGV4dHJhY3RWZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEodGVzdERhdGEuSlVQSVRFUl9WRVJTSU9ORURfVFhfQllURVMpO1xuXG4gICAgICB0eEJ1aWxkZXIuZnJvbVZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YSh2ZXJzaW9uZWRUeERhdGEpO1xuXG4gICAgICBjb25zdCB0eCA9IHR4QnVpbGRlclsnX3RyYW5zYWN0aW9uJ107XG4gICAgICBjb25zdCBzdG9yZWREYXRhID0gdHguZ2V0VmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhKCk7XG4gICAgICBzaG91bGQuZXhpc3Qoc3RvcmVkRGF0YSk7XG4gICAgICBzdG9yZWREYXRhIS52ZXJzaW9uZWRJbnN0cnVjdGlvbnMubGVuZ3RoLnNob3VsZC5lcXVhbCh2ZXJzaW9uZWRUeERhdGEudmVyc2lvbmVkSW5zdHJ1Y3Rpb25zLmxlbmd0aCk7XG4gICAgICBzdG9yZWREYXRhIS5hZGRyZXNzTG9va3VwVGFibGVzLmxlbmd0aC5zaG91bGQuZXF1YWwodmVyc2lvbmVkVHhEYXRhLmFkZHJlc3NMb29rdXBUYWJsZXMubGVuZ3RoKTtcbiAgICAgIHN0b3JlZERhdGEhLnN0YXRpY0FjY291bnRLZXlzLmxlbmd0aC5zaG91bGQuZXF1YWwodmVyc2lvbmVkVHhEYXRhLnN0YXRpY0FjY291bnRLZXlzLmxlbmd0aCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIGlucHV0IGRhdGEnLCAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBjdXN0b21JbnN0cnVjdGlvbkJ1aWxkZXIoKTtcblxuICAgICAgLy8gSW52YWxpZDogbnVsbC91bmRlZmluZWRcbiAgICAgIHNob3VsZCgoKSA9PiB0eEJ1aWxkZXIuZnJvbVZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YShudWxsIGFzIGFueSkpLnRocm93RXJyb3IoL211c3QgYmUgYSB2YWxpZCBvYmplY3QvKTtcbiAgICAgIHNob3VsZCgoKSA9PiB0eEJ1aWxkZXIuZnJvbVZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YSh1bmRlZmluZWQgYXMgYW55KSkudGhyb3dFcnJvcigvbXVzdCBiZSBhIHZhbGlkIG9iamVjdC8pO1xuXG4gICAgICAvLyBJbnZhbGlkOiBlbXB0eSBpbnN0cnVjdGlvbnNcbiAgICAgIHNob3VsZCgoKSA9PlxuICAgICAgICB0eEJ1aWxkZXIuZnJvbVZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YSh7XG4gICAgICAgICAgdmVyc2lvbmVkSW5zdHJ1Y3Rpb25zOiBbXSxcbiAgICAgICAgICBhZGRyZXNzTG9va3VwVGFibGVzOiBbXSxcbiAgICAgICAgICBzdGF0aWNBY2NvdW50S2V5czogWyd0ZXN0J10sXG4gICAgICAgICAgbWVzc2FnZUhlYWRlcjogeyBudW1SZXF1aXJlZFNpZ25hdHVyZXM6IDEsIG51bVJlYWRvbmx5U2lnbmVkQWNjb3VudHM6IDAsIG51bVJlYWRvbmx5VW5zaWduZWRBY2NvdW50czogMCB9LFxuICAgICAgICB9KVxuICAgICAgKS50aHJvd0Vycm9yKC9ub24tZW1wdHkgYXJyYXkvKTtcblxuICAgICAgLy8gSW52YWxpZDogbWlzc2luZyBhZGRyZXNzTG9va3VwVGFibGVzXG4gICAgICBzaG91bGQoKCkgPT5cbiAgICAgICAgdHhCdWlsZGVyLmZyb21WZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEoe1xuICAgICAgICAgIHZlcnNpb25lZEluc3RydWN0aW9uczogW3sgcHJvZ3JhbUlkSW5kZXg6IDAsIGFjY291bnRLZXlJbmRleGVzOiBbMF0sIGRhdGE6ICcxJyB9XSwgLy8gYmFzZTU4IGZvciAweDAwXG4gICAgICAgICAgc3RhdGljQWNjb3VudEtleXM6IFsndGVzdCddLFxuICAgICAgICB9IGFzIGFueSlcbiAgICAgICkudGhyb3dFcnJvcigvbXVzdCBiZSBhbiBhcnJheS8pO1xuXG4gICAgICAvLyBJbnZhbGlkOiBlbXB0eSBzdGF0aWNBY2NvdW50S2V5c1xuICAgICAgc2hvdWxkKCgpID0+XG4gICAgICAgIHR4QnVpbGRlci5mcm9tVmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhKHtcbiAgICAgICAgICB2ZXJzaW9uZWRJbnN0cnVjdGlvbnM6IFt7IHByb2dyYW1JZEluZGV4OiAwLCBhY2NvdW50S2V5SW5kZXhlczogWzBdLCBkYXRhOiAnMScgfV0sIC8vIGJhc2U1OCBmb3IgMHgwMFxuICAgICAgICAgIGFkZHJlc3NMb29rdXBUYWJsZXM6IFtdLFxuICAgICAgICAgIHN0YXRpY0FjY291bnRLZXlzOiBbXSxcbiAgICAgICAgICBtZXNzYWdlSGVhZGVyOiB7IG51bVJlcXVpcmVkU2lnbmF0dXJlczogMSwgbnVtUmVhZG9ubHlTaWduZWRBY2NvdW50czogMCwgbnVtUmVhZG9ubHlVbnNpZ25lZEFjY291bnRzOiAwIH0sXG4gICAgICAgIH0pXG4gICAgICApLnRocm93RXJyb3IoL25vbi1lbXB0eSBhcnJheS8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB3b3JrIHdpdGggdGhlIGNvbXBsZXRlIHRyYW5zYWN0aW9uIGJ1aWxkaW5nIGZsb3cnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBjdXN0b21JbnN0cnVjdGlvbkJ1aWxkZXIoKTtcbiAgICAgIGNvbnN0IHZlcnNpb25lZFR4RGF0YSA9IGV4dHJhY3RWZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEodGVzdERhdGEuSlVQSVRFUl9WRVJTSU9ORURfVFhfQllURVMpO1xuXG4gICAgICAvLyBQcm9jZXNzIHRoZSBWZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGFcbiAgICAgIHR4QnVpbGRlci5mcm9tVmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhKHZlcnNpb25lZFR4RGF0YSk7XG5cbiAgICAgIHR4QnVpbGRlci5zZW5kZXIodmVyc2lvbmVkVHhEYXRhLnN0YXRpY0FjY291bnRLZXlzWzBdKTsgLy8gRmVlIHBheWVyXG4gICAgICB0eEJ1aWxkZXIubm9uY2UodGVzdERhdGEuYmxvY2tIYXNoZXMudmFsaWRCbG9ja0hhc2hlc1swXSk7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG5cbiAgICAgIC8vIFZlcmlmeSB0cmFuc2FjdGlvbiBwcm9wZXJ0aWVzXG4gICAgICB0eC5zaG91bGQuYmUub2soKTtcbiAgICAgIHR4LnR5cGUuc2hvdWxkLmVxdWFsKDMxKTsgLy8gVHJhbnNhY3Rpb25UeXBlLkN1c3RvbVR4IGVudW0gdmFsdWVcblxuICAgICAgLy8gVmVyaWZ5IHNpZ25hYmxlIHBheWxvYWRcbiAgICAgIGNvbnN0IHBheWxvYWQgPSB0eC5zaWduYWJsZVBheWxvYWQ7XG4gICAgICBwYXlsb2FkLnNob3VsZC5iZS5pbnN0YW5jZU9mKEJ1ZmZlcik7XG4gICAgICBwYXlsb2FkLmxlbmd0aC5zaG91bGQuYmUuZ3JlYXRlclRoYW4oMCk7XG5cbiAgICAgIC8vIFZlcmlmeSBwYXlsb2FkIGlzIGRldGVybWluaXN0aWMgLSByZWJ1aWxkaW5nIHdpdGggc2FtZSBwYXJhbXMgcHJvZHVjZXMgc2FtZSBwYXlsb2FkXG4gICAgICBjb25zdCB0eEJ1aWxkZXIyID0gY3VzdG9tSW5zdHJ1Y3Rpb25CdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIyLmZyb21WZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEodmVyc2lvbmVkVHhEYXRhKTtcbiAgICAgIHR4QnVpbGRlcjIuc2VuZGVyKHZlcnNpb25lZFR4RGF0YS5zdGF0aWNBY2NvdW50S2V5c1swXSk7XG4gICAgICB0eEJ1aWxkZXIyLm5vbmNlKHRlc3REYXRhLmJsb2NrSGFzaGVzLnZhbGlkQmxvY2tIYXNoZXNbMF0pO1xuICAgICAgY29uc3QgdHgyID0gYXdhaXQgdHhCdWlsZGVyMi5idWlsZCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4Mi5zaWduYWJsZVBheWxvYWQudG9TdHJpbmcoJ2hleCcpLCBwYXlsb2FkLnRvU3RyaW5nKCdoZXgnKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGV4dHJhY3QgdGhlIGNvcnJlY3QgbnVtYmVyIG9mIGluc3RydWN0aW9ucyBmcm9tIEp1cGl0ZXIgdHJhbnNhY3Rpb24nLCAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBjdXN0b21JbnN0cnVjdGlvbkJ1aWxkZXIoKTtcbiAgICAgIGNvbnN0IHZlcnNpb25lZFR4RGF0YSA9IGV4dHJhY3RWZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEodGVzdERhdGEuSlVQSVRFUl9WRVJTSU9ORURfVFhfQllURVMpO1xuXG4gICAgICB0eEJ1aWxkZXIuZnJvbVZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YSh2ZXJzaW9uZWRUeERhdGEpO1xuXG4gICAgICBjb25zdCBpbnN0cnVjdGlvbnMgPSB0eEJ1aWxkZXIuZ2V0SW5zdHJ1Y3Rpb25zKCk7XG5cbiAgICAgIC8vIFZlcmlmeSB3ZSBleHRyYWN0ZWQgaW5zdHJ1Y3Rpb25zXG4gICAgICBpbnN0cnVjdGlvbnMubGVuZ3RoLnNob3VsZC5iZS5ncmVhdGVyVGhhbigwKTtcbiAgICAgIGluc3RydWN0aW9ucy5sZW5ndGguc2hvdWxkLmVxdWFsKHZlcnNpb25lZFR4RGF0YS52ZXJzaW9uZWRJbnN0cnVjdGlvbnMubGVuZ3RoKTtcblxuICAgICAgLy8gVmVyaWZ5IGVhY2ggaW5zdHJ1Y3Rpb24gaGFzIHZhbGlkIGNvbXBpbGVkIGZvcm1hdFxuICAgICAgZm9yIChjb25zdCBpbnN0cnVjdGlvbiBvZiBpbnN0cnVjdGlvbnMpIHtcbiAgICAgICAgY29uc3QgcGFyYW1zID0gaW5zdHJ1Y3Rpb24ucGFyYW1zIGFzIFNvbFZlcnNpb25lZEluc3RydWN0aW9uO1xuICAgICAgICAodHlwZW9mIHBhcmFtcy5wcm9ncmFtSWRJbmRleCkuc2hvdWxkLmVxdWFsKCdudW1iZXInKTtcbiAgICAgICAgcGFyYW1zLnByb2dyYW1JZEluZGV4LnNob3VsZC5iZS5ncmVhdGVyVGhhbk9yRXF1YWwoMCk7XG4gICAgICAgIEFycmF5LmlzQXJyYXkocGFyYW1zLmFjY291bnRLZXlJbmRleGVzKS5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgICAgICh0eXBlb2YgcGFyYW1zLmRhdGEpLnNob3VsZC5lcXVhbCgnc3RyaW5nJyk7XG4gICAgICAgIC8vIERhdGEgc2hvdWxkIGJlIHZhbGlkIGJhc2U1OCBzdHJpbmcgKG5vbi1lbXB0eSlcbiAgICAgICAgcGFyYW1zLmRhdGEubGVuZ3RoLnNob3VsZC5iZS5ncmVhdGVyVGhhbigwKTtcbiAgICAgICAgLy8gVmVyaWZ5IGl0IGNhbiBiZSBkZWNvZGVkXG4gICAgICAgIHNob3VsZC5kb2VzTm90VGhyb3coKCkgPT4gYmFzZTU4LmRlY29kZShwYXJhbXMuZGF0YSkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBjbGVhciBpbnN0cnVjdGlvbnMgcHJvcGVybHkgYWZ0ZXIgdXNpbmcgZnJvbVZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YScsICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGN1c3RvbUluc3RydWN0aW9uQnVpbGRlcigpO1xuICAgICAgY29uc3QgdmVyc2lvbmVkVHhEYXRhID0gZXh0cmFjdFZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YSh0ZXN0RGF0YS5KVVBJVEVSX1ZFUlNJT05FRF9UWF9CWVRFUyk7XG5cbiAgICAgIHR4QnVpbGRlci5mcm9tVmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhKHZlcnNpb25lZFR4RGF0YSk7XG4gICAgICB0eEJ1aWxkZXIuZ2V0SW5zdHJ1Y3Rpb25zKCkubGVuZ3RoLnNob3VsZC5iZS5ncmVhdGVyVGhhbigwKTtcblxuICAgICAgLy8gQ2xlYXIgc2hvdWxkIHdvcmtcbiAgICAgIHR4QnVpbGRlci5jbGVhckluc3RydWN0aW9ucygpO1xuICAgICAgdHhCdWlsZGVyLmdldEluc3RydWN0aW9ucygpLnNob3VsZC5oYXZlLmxlbmd0aCgwKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZXh0cmFjdCBmZWUgcGF5ZXIgZnJvbSBzdGF0aWNBY2NvdW50S2V5cycsICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0Q3VzdG9tSW5zdHJ1Y3Rpb25CdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIubm9uY2UocmVjZW50QmxvY2tIYXNoKTtcblxuICAgICAgY29uc3QgdmVyc2lvbmVkVHhEYXRhID0gZXh0cmFjdFZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YSh0ZXN0RGF0YS5KVVBJVEVSX1ZFUlNJT05FRF9UWF9CWVRFUyk7XG5cbiAgICAgIHR4QnVpbGRlci5mcm9tVmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhKHZlcnNpb25lZFR4RGF0YSk7XG5cbiAgICAgIGNvbnN0IHNlbmRlciA9IHR4QnVpbGRlclsnX3NlbmRlciddO1xuICAgICAgc2hvdWxkLmV4aXN0KHNlbmRlcik7XG4gICAgICBzZW5kZXIuc2hvdWxkLmVxdWFsKHZlcnNpb25lZFR4RGF0YS5zdGF0aWNBY2NvdW50S2V5c1swXSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIG5vdCBvdmVycmlkZSBleGlzdGluZyBzZW5kZXInLCAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBjdXN0b21JbnN0cnVjdGlvbkJ1aWxkZXIoKTtcbiAgICAgIGNvbnN0IHZlcnNpb25lZFR4RGF0YSA9IGV4dHJhY3RWZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEodGVzdERhdGEuSlVQSVRFUl9WRVJTSU9ORURfVFhfQllURVMpO1xuXG4gICAgICBjb25zdCBvcmlnaW5hbFNlbmRlciA9IHR4QnVpbGRlclsnX3NlbmRlciddO1xuICAgICAgdHhCdWlsZGVyLmZyb21WZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEodmVyc2lvbmVkVHhEYXRhKTtcblxuICAgICAgY29uc3Qgc2VuZGVyID0gdHhCdWlsZGVyWydfc2VuZGVyJ107XG4gICAgICBzZW5kZXIuc2hvdWxkLmVxdWFsKG9yaWdpbmFsU2VuZGVyKTtcbiAgICAgIHNlbmRlci5zaG91bGQuZXF1YWwoYXV0aEFjY291bnQucHViKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
|
|
724
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tSW5zdHJ1Y3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGVzdC91bml0L3RyYW5zYWN0aW9uQnVpbGRlci9jdXN0b21JbnN0cnVjdGlvbkJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsNkNBVXlCO0FBQ3pCLDREQUF5RDtBQUN6RCxzQ0FBMkQ7QUFDM0QsOERBQWdEO0FBR2hELGdEQUEwQjtBQUUxQixRQUFRLENBQUMsZ0NBQWdDLEVBQUUsR0FBRyxFQUFFO0lBQzlDLE1BQU0sT0FBTyxHQUFHLElBQUEscUNBQWlCLEVBQUMsTUFBTSxDQUFDLENBQUM7SUFFMUMsTUFBTSx3QkFBd0IsR0FBRyxHQUFHLEVBQUU7UUFDcEMsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLDJCQUEyQixFQUFFLENBQUM7UUFDeEQsU0FBUyxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNqQyxTQUFTLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNsQyxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDLENBQUM7SUFFRixNQUFNLFdBQVcsR0FBRyxJQUFJLGFBQU8sQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDaEUsTUFBTSxZQUFZLEdBQUcsSUFBSSxhQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNyRixNQUFNLGVBQWUsR0FBRyw4Q0FBOEMsQ0FBQztJQUN2RSxNQUFNLElBQUksR0FBRyxXQUFXLENBQUM7SUFFekIsOEVBQThFO0lBQzlFLDJDQUEyQztJQUMzQyxTQUFTLCtCQUErQixDQUFDLFdBQW1C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Q0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDekQsUUFBUSxFQUFFO2lCQUNWLE1BQU0sQ0FBQyxLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQztZQUM5QyxPQUFPLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQzFHLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDZEQUE2RCxFQUFFLEdBQUcsRUFBRTtZQUNyRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsV0FBVyxFQUFFLENBQUM7WUFDL0IsTUFBTSxZQUFZLEdBQUc7Z0JBQ25CLEdBQUcsSUFBSTtnQkFDUCxhQUFhLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsMkJBQTJCLEVBQUUsRUFBRSxFQUFFO2FBQzFFLENBQUM7WUFDRixNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztZQUN4RCxTQUFTLENBQUMsS0FBSyxDQUFDLGVBQWUsRUFBRSxFQUFFLGtCQUFrQixFQUFFLGlCQUFpQixFQUFFLENBQUMsQ0FBQztZQUM1RSxJQUFBLGdCQUFNLEVBQUMsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLDRCQUE0QixDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFDMUcsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHNob3VsZCBmcm9tICdzaG91bGQnO1xuaW1wb3J0IHtcbiAgU3lzdGVtUHJvZ3JhbSxcbiAgUHVibGljS2V5LFxuICBUcmFuc2FjdGlvbkluc3RydWN0aW9uLFxuICBDb21wdXRlQnVkZ2V0UHJvZ3JhbSxcbiAgVmVyc2lvbmVkVHJhbnNhY3Rpb24sXG4gIEtleXBhaXIsXG4gIE1lc3NhZ2VWMCxcbiAgQWRkcmVzc0xvb2t1cFRhYmxlQWNjb3VudCxcbiAgU1lTVkFSX1JFQ0VOVF9CTE9DS0hBU0hFU19QVUJLRVksXG59IGZyb20gJ0Bzb2xhbmEvd2ViMy5qcyc7XG5pbXBvcnQgeyBnZXRCdWlsZGVyRmFjdG9yeSB9IGZyb20gJy4uL2dldEJ1aWxkZXJGYWN0b3J5JztcbmltcG9ydCB7IEtleVBhaXIsIFV0aWxzLCBUcmFuc2FjdGlvbiB9IGZyb20gJy4uLy4uLy4uL3NyYyc7XG5pbXBvcnQgKiBhcyB0ZXN0RGF0YSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvc29sJztcbmltcG9ydCB7IFNvbFZlcnNpb25lZEluc3RydWN0aW9uIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgVmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhIH0gZnJvbSAnLi4vLi4vLi4vc3JjL2xpYi9pZmFjZSc7XG5pbXBvcnQgYmFzZTU4IGZyb20gJ2JzNTgnO1xuXG5kZXNjcmliZSgnU29sIEN1c3RvbSBJbnN0cnVjdGlvbiBCdWlsZGVyJywgKCkgPT4ge1xuICBjb25zdCBmYWN0b3J5ID0gZ2V0QnVpbGRlckZhY3RvcnkoJ3Rzb2wnKTtcblxuICBjb25zdCBjdXN0b21JbnN0cnVjdGlvbkJ1aWxkZXIgPSAoKSA9PiB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRDdXN0b21JbnN0cnVjdGlvbkJ1aWxkZXIoKTtcbiAgICB0eEJ1aWxkZXIubm9uY2UocmVjZW50QmxvY2tIYXNoKTtcbiAgICB0eEJ1aWxkZXIuc2VuZGVyKGF1dGhBY2NvdW50LnB1Yik7XG4gICAgcmV0dXJuIHR4QnVpbGRlcjtcbiAgfTtcblxuICBjb25zdCBhdXRoQWNjb3VudCA9IG5ldyBLZXlQYWlyKHRlc3REYXRhLmF1dGhBY2NvdW50KS5nZXRLZXlzKCk7XG4gIGNvbnN0IG90aGVyQWNjb3VudCA9IG5ldyBLZXlQYWlyKHsgcHJ2OiB0ZXN0RGF0YS5wcnZLZXlzLnBydktleTEuYmFzZTU4IH0pLmdldEtleXMoKTtcbiAgY29uc3QgcmVjZW50QmxvY2tIYXNoID0gJ0dIdFhRQnNvWkhWbk5GYTlZZXZBekZyMTdESmpnSFhrM3ljVEtENXhEM1ppJztcbiAgY29uc3QgbWVtbyA9ICd0ZXN0IG1lbW8nO1xuXG4gIC8vIEhlbHBlciB0byBkZWNvbnN0cnVjdCBhIHNlcmlhbGl6ZWQgVmVyc2lvbmVkVHJhbnNhY3Rpb24gaW50byB0aGUgZGF0YSBzaGFwZVxuICAvLyBjb25zdW1lZCBieSBmcm9tVmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhXG4gIGZ1bmN0aW9uIGV4dHJhY3RWZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEoYmFzZTY0Qnl0ZXM6IHN0cmluZyk6IFZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YSB7XG4gICAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmZyb20oYmFzZTY0Qnl0ZXMsICdiYXNlNjQnKTtcbiAgICBjb25zdCB2ZXJzaW9uZWRUeCA9IFZlcnNpb25lZFRyYW5zYWN0aW9uLmRlc2VyaWFsaXplKGJ1ZmZlcik7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdmVyc2lvbmVkSW5zdHJ1Y3Rpb25zOiB2ZXJzaW9uZWRUeC5tZXNzYWdlLmNvbXBpbGVkSW5zdHJ1Y3Rpb25zLm1hcCgoY2kpID0+ICh7XG4gICAgICAgIHByb2dyYW1JZEluZGV4OiBjaS5wcm9ncmFtSWRJbmRleCxcbiAgICAgICAgYWNjb3VudEtleUluZGV4ZXM6IGNpLmFjY291bnRLZXlJbmRleGVzLFxuICAgICAgICBkYXRhOiBiYXNlNTguZW5jb2RlKGNpLmRhdGEpLFxuICAgICAgfSkpLFxuICAgICAgYWRkcmVzc0xvb2t1cFRhYmxlczogdmVyc2lvbmVkVHgubWVzc2FnZS5hZGRyZXNzVGFibGVMb29rdXBzLm1hcCgoYWx0KSA9PiAoe1xuICAgICAgICBhY2NvdW50S2V5OiBhbHQuYWNjb3VudEtleS50b1N0cmluZygpLFxuICAgICAgICB3cml0YWJsZUluZGV4ZXM6IGFsdC53cml0YWJsZUluZGV4ZXMsXG4gICAgICAgIHJlYWRvbmx5SW5kZXhlczogYWx0LnJlYWRvbmx5SW5kZXhlcyxcbiAgICAgIH0pKSxcbiAgICAgIHN0YXRpY0FjY291bnRLZXlzOiB2ZXJzaW9uZWRUeC5tZXNzYWdlLnN0YXRpY0FjY291bnRLZXlzLm1hcCgoa2V5KSA9PiBrZXkudG9TdHJpbmcoKSksXG4gICAgICBtZXNzYWdlSGVhZGVyOiB7XG4gICAgICAgIG51bVJlcXVpcmVkU2lnbmF0dXJlczogdmVyc2lvbmVkVHgubWVzc2FnZS5oZWFkZXIubnVtUmVxdWlyZWRTaWduYXR1cmVzLFxuICAgICAgICBudW1SZWFkb25seVNpZ25lZEFjY291bnRzOiB2ZXJzaW9uZWRUeC5tZXNzYWdlLmhlYWRlci5udW1SZWFkb25seVNpZ25lZEFjY291bnRzLFxuICAgICAgICBudW1SZWFkb25seVVuc2lnbmVkQWNjb3VudHM6IHZlcnNpb25lZFR4Lm1lc3NhZ2UuaGVhZGVyLm51bVJlYWRvbmx5VW5zaWduZWRBY2NvdW50cyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8vIEhlbHBlciBmdW5jdGlvbiB0byBjb252ZXJ0IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24gdG8gdGhlIGV4cGVjdGVkIGZvcm1hdFxuICBjb25zdCBjb252ZXJ0SW5zdHJ1Y3Rpb25Ub1BhcmFtcyA9IChpbnN0cnVjdGlvbjogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbikgPT4gKHtcbiAgICBwcm9ncmFtSWQ6IGluc3RydWN0aW9uLnByb2dyYW1JZC50b1N0cmluZygpLFxuICAgIGtleXM6IGluc3RydWN0aW9uLmtleXMubWFwKChrZXkpID0+ICh7XG4gICAgICBwdWJrZXk6IGtleS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgIGlzU2lnbmVyOiBrZXkuaXNTaWduZXIsXG4gICAgICBpc1dyaXRhYmxlOiBrZXkuaXNXcml0YWJsZSxcbiAgICB9KSksXG4gICAgZGF0YTogaW5zdHJ1Y3Rpb24uZGF0YS50b1N0cmluZygnaGV4JyksXG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdTdWNjZWVkJywgKCkgPT4ge1xuICAgIGl0KCdidWlsZCBhIHRyYW5zYWN0aW9uIHdpdGggYSBzaW5nbGUgY3VzdG9tIGluc3RydWN0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHJhbnNmZXJJbnN0cnVjdGlvbiA9IFN5c3RlbVByb2dyYW0udHJhbnNmZXIoe1xuICAgICAgICBmcm9tUHVia2V5OiBuZXcgUHVibGljS2V5KGF1dGhBY2NvdW50LnB1YiksXG4gICAgICAgIHRvUHVia2V5OiBuZXcgUHVibGljS2V5KG90aGVyQWNjb3VudC5wdWIpLFxuICAgICAgICBsYW1wb3J0czogMTAwMDAwMCxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBjdXN0b21JbnN0cnVjdGlvbkJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci5hZGRDdXN0b21JbnN0cnVjdGlvbihjb252ZXJ0SW5zdHJ1Y3Rpb25Ub1BhcmFtcyh0cmFuc2Zlckluc3RydWN0aW9uKSk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuXG4gICAgICB0eC5pbnB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgwKTtcblxuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKFV0aWxzLmlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUeCksIHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2J1aWxkIGEgdHJhbnNhY3Rpb24gd2l0aCBtdWx0aXBsZSBjdXN0b20gaW5zdHJ1Y3Rpb25zJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHJhbnNmZXJJbnN0cnVjdGlvbiA9IFN5c3RlbVByb2dyYW0udHJhbnNmZXIoe1xuICAgICAgICBmcm9tUHVia2V5OiBuZXcgUHVibGljS2V5KGF1dGhBY2NvdW50LnB1YiksXG4gICAgICAgIHRvUHVia2V5OiBuZXcgUHVibGljS2V5KG90aGVyQWNjb3VudC5wdWIpLFxuICAgICAgICBsYW1wb3J0czogMTAwMDAwMCxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBwcmlvcml0eUZlZUluc3RydWN0aW9uID0gQ29tcHV0ZUJ1ZGdldFByb2dyYW0uc2V0Q29tcHV0ZVVuaXRQcmljZSh7XG4gICAgICAgIG1pY3JvTGFtcG9ydHM6IDEwMDAsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdHhCdWlsZGVyID0gY3VzdG9tSW5zdHJ1Y3Rpb25CdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIuYWRkQ3VzdG9tSW5zdHJ1Y3Rpb25zKFtcbiAgICAgICAgY29udmVydEluc3RydWN0aW9uVG9QYXJhbXModHJhbnNmZXJJbnN0cnVjdGlvbiksXG4gICAgICAgIGNvbnZlcnRJbnN0cnVjdGlvblRvUGFyYW1zKHByaW9yaXR5RmVlSW5zdHJ1Y3Rpb24pLFxuICAgICAgXSk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuXG4gICAgICB0eC5pbnB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgwKTtcbiAgICAgIHR4Lm91dHB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgwKTtcblxuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKFV0aWxzLmlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUeCksIHRydWUpO1xuXG4gICAgICAvLyBTaG91bGQgaGF2ZSAyIGluc3RydWN0aW9uc1xuICAgICAgKHR4IGFzIFRyYW5zYWN0aW9uKS5zb2xUcmFuc2FjdGlvbi5pbnN0cnVjdGlvbnMuc2hvdWxkLmhhdmUubGVuZ3RoKDIpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2J1aWxkIGEgdHJhbnNhY3Rpb24gd2l0aCBjdXN0b20gaW5zdHJ1Y3Rpb24gYW5kIG1lbW8nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0cmFuc2Zlckluc3RydWN0aW9uID0gU3lzdGVtUHJvZ3JhbS50cmFuc2Zlcih7XG4gICAgICAgIGZyb21QdWJrZXk6IG5ldyBQdWJsaWNLZXkoYXV0aEFjY291bnQucHViKSxcbiAgICAgICAgdG9QdWJrZXk6IG5ldyBQdWJsaWNLZXkob3RoZXJBY2NvdW50LnB1YiksXG4gICAgICAgIGxhbXBvcnRzOiAxMDAwMDAwLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGN1c3RvbUluc3RydWN0aW9uQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLmFkZEN1c3RvbUluc3RydWN0aW9uKGNvbnZlcnRJbnN0cnVjdGlvblRvUGFyYW1zKHRyYW5zZmVySW5zdHJ1Y3Rpb24pKTtcbiAgICAgIHR4QnVpbGRlci5tZW1vKG1lbW8pO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcblxuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKFV0aWxzLmlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUeCksIHRydWUpO1xuXG4gICAgICAvLyBTaG91bGQgaGF2ZSBpbnN0cnVjdGlvbiArIG1lbW9cbiAgICAgICh0eCBhcyBUcmFuc2FjdGlvbikuc29sVHJhbnNhY3Rpb24uaW5zdHJ1Y3Rpb25zLnNob3VsZC5oYXZlLmxlbmd0aCgyKTtcbiAgICB9KTtcblxuICAgIGl0KCdidWlsZCBhIHNpZ25lZCB0cmFuc2FjdGlvbiB3aXRoIGN1c3RvbSBpbnN0cnVjdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHRyYW5zZmVySW5zdHJ1Y3Rpb24gPSBTeXN0ZW1Qcm9ncmFtLnRyYW5zZmVyKHtcbiAgICAgICAgZnJvbVB1YmtleTogbmV3IFB1YmxpY0tleShhdXRoQWNjb3VudC5wdWIpLFxuICAgICAgICB0b1B1YmtleTogbmV3IFB1YmxpY0tleShvdGhlckFjY291bnQucHViKSxcbiAgICAgICAgbGFtcG9ydHM6IDEwMDAwMDAsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdHhCdWlsZGVyID0gY3VzdG9tSW5zdHJ1Y3Rpb25CdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIuYWRkQ3VzdG9tSW5zdHJ1Y3Rpb24oY29udmVydEluc3RydWN0aW9uVG9QYXJhbXModHJhbnNmZXJJbnN0cnVjdGlvbikpO1xuICAgICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IGF1dGhBY2NvdW50LnBydiB9KTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG5cbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHNob3VsZC5lcXVhbChVdGlscy5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHgpLCB0cnVlKTtcblxuICAgICAgLy8gU2hvdWxkIGJlIHNpZ25lZFxuICAgICAgKHR4IGFzIFRyYW5zYWN0aW9uKS5zb2xUcmFuc2FjdGlvbi5zaWduYXR1cmVzLnNob3VsZC5ub3QuYmUuZW1wdHkoKTtcbiAgICB9KTtcblxuICAgIGl0KCdjbGVhciBpbnN0cnVjdGlvbnMgZnJvbSBidWlsZGVyJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHJhbnNmZXJJbnN0cnVjdGlvbiA9IFN5c3RlbVByb2dyYW0udHJhbnNmZXIoe1xuICAgICAgICBmcm9tUHVia2V5OiBuZXcgUHVibGljS2V5KGF1dGhBY2NvdW50LnB1YiksXG4gICAgICAgIHRvUHVia2V5OiBuZXcgUHVibGljS2V5KG90aGVyQWNjb3VudC5wdWIpLFxuICAgICAgICBsYW1wb3J0czogMTAwMDAwMCxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBjdXN0b21JbnN0cnVjdGlvbkJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci5hZGRDdXN0b21JbnN0cnVjdGlvbihjb252ZXJ0SW5zdHJ1Y3Rpb25Ub1BhcmFtcyh0cmFuc2Zlckluc3RydWN0aW9uKSk7XG4gICAgICB0eEJ1aWxkZXIuZ2V0SW5zdHJ1Y3Rpb25zKCkuc2hvdWxkLmhhdmUubGVuZ3RoKDEpO1xuXG4gICAgICB0eEJ1aWxkZXIuY2xlYXJJbnN0cnVjdGlvbnMoKTtcbiAgICAgIHR4QnVpbGRlci5nZXRJbnN0cnVjdGlvbnMoKS5zaG91bGQuaGF2ZS5sZW5ndGgoMCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIFR5cGUgZm9yIHRlc3RpbmcgaW52YWxpZCBpbnN0cnVjdGlvbiBmb3JtYXRzXG4gIGludGVyZmFjZSBJbnZhbGlkSW5zdHJ1Y3Rpb24ge1xuICAgIHByb2dyYW1JZD86IHN0cmluZztcbiAgICBrZXlzPzogdW5rbm93bjtcbiAgICBkYXRhPzogdW5rbm93bjtcbiAgfVxuXG4gIGRlc2NyaWJlKCdGYWlsJywgKCkgPT4ge1xuICAgIGl0KCdmb3IgbnVsbCBpbnN0cnVjdGlvbicsICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGN1c3RvbUluc3RydWN0aW9uQnVpbGRlcigpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIHNob3VsZCgoKSA9PiB0eEJ1aWxkZXIuYWRkQ3VzdG9tSW5zdHJ1Y3Rpb24obnVsbCBhcyBhbnkpKS50aHJvd0Vycm9yKCdJbnN0cnVjdGlvbiBjYW5ub3QgYmUgbnVsbCBvciB1bmRlZmluZWQnKTtcbiAgICB9KTtcblxuICAgIGl0KCdmb3IgdW5kZWZpbmVkIGluc3RydWN0aW9uJywgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gY3VzdG9tSW5zdHJ1Y3Rpb25CdWlsZGVyKCk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgc2hvdWxkKCgpID0+IHR4QnVpbGRlci5hZGRDdXN0b21JbnN0cnVjdGlvbih1bmRlZmluZWQgYXMgYW55KSkudGhyb3dFcnJvcihcbiAgICAgICAgJ0luc3RydWN0aW9uIGNhbm5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZCdcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnZm9yIGluc3RydWN0aW9uIHdpdGhvdXQgcHJvZ3JhbUlkJywgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gY3VzdG9tSW5zdHJ1Y3Rpb25CdWlsZGVyKCk7XG4gICAgICBjb25zdCBpbnZhbGlkSW5zdHJ1Y3Rpb246IEludmFsaWRJbnN0cnVjdGlvbiA9IHtcbiAgICAgICAga2V5czogW10sXG4gICAgICAgIGRhdGE6ICcnLFxuICAgICAgfTtcblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIHNob3VsZCgoKSA9PiB0eEJ1aWxkZXIuYWRkQ3VzdG9tSW5zdHJ1Y3Rpb24oaW52YWxpZEluc3RydWN0aW9uIGFzIGFueSkpLnRocm93RXJyb3IoXG4gICAgICAgICdWZXJzaW9uZWQgaW5zdHJ1Y3Rpb24gbXVzdCBoYXZlIGEgdmFsaWQgcHJvZ3JhbUlkSW5kZXggbnVtYmVyJ1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdmb3IgaW5zdHJ1Y3Rpb24gd2l0aG91dCBrZXlzJywgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gY3VzdG9tSW5zdHJ1Y3Rpb25CdWlsZGVyKCk7XG4gICAgICBjb25zdCBpbnZhbGlkSW5zdHJ1Y3Rpb246IEludmFsaWRJbnN0cnVjdGlvbiA9IHtcbiAgICAgICAgcHJvZ3JhbUlkOiAnMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTInLFxuICAgICAgICBkYXRhOiAnJyxcbiAgICAgIH07XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICBzaG91bGQoKCkgPT4gdHhCdWlsZGVyLmFkZEN1c3RvbUluc3RydWN0aW9uKGludmFsaWRJbnN0cnVjdGlvbiBhcyBhbnkpKS50aHJvd0Vycm9yKFxuICAgICAgICAnSW5zdHJ1Y3Rpb24gbXVzdCBoYXZlIHZhbGlkIGtleXMgYXJyYXknXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ2ZvciBpbnN0cnVjdGlvbiB3aXRob3V0IGRhdGEnLCAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBjdXN0b21JbnN0cnVjdGlvbkJ1aWxkZXIoKTtcbiAgICAgIGNvbnN0IGludmFsaWRJbnN0cnVjdGlvbjogSW52YWxpZEluc3RydWN0aW9uID0ge1xuICAgICAgICBwcm9ncmFtSWQ6ICcxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMicsXG4gICAgICAgIGtleXM6IFtdLFxuICAgICAgfTtcblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIHNob3VsZCgoKSA9PiB0eEJ1aWxkZXIuYWRkQ3VzdG9tSW5zdHJ1Y3Rpb24oaW52YWxpZEluc3RydWN0aW9uIGFzIGFueSkpLnRocm93RXJyb3IoXG4gICAgICAgICdJbnN0cnVjdGlvbiBtdXN0IGhhdmUgdmFsaWQgZGF0YSBzdHJpbmcnXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ2ZvciBub24tYXJyYXkgaW4gYWRkQ3VzdG9tSW5zdHJ1Y3Rpb25zJywgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gY3VzdG9tSW5zdHJ1Y3Rpb25CdWlsZGVyKCk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgc2hvdWxkKCgpID0+IHR4QnVpbGRlci5hZGRDdXN0b21JbnN0cnVjdGlvbnMoJ2ludmFsaWQnIGFzIGFueSkpLnRocm93RXJyb3IoJ0luc3RydWN0aW9ucyBtdXN0IGJlIGFuIGFycmF5Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgnd2hlbiBidWlsZGluZyB3aXRob3V0IGluc3RydWN0aW9ucycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGN1c3RvbUluc3RydWN0aW9uQnVpbGRlcigpO1xuICAgICAgYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnQXQgbGVhc3Qgb25lIGN1c3RvbSBpbnN0cnVjdGlvbiBtdXN0IGJlIHNwZWNpZmllZCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3doZW4gYnVpbGRpbmcgd2l0aG91dCBzZW5kZXInLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0cmFuc2Zlckluc3RydWN0aW9uID0gU3lzdGVtUHJvZ3JhbS50cmFuc2Zlcih7XG4gICAgICAgIGZyb21QdWJrZXk6IG5ldyBQdWJsaWNLZXkoYXV0aEFjY291bnQucHViKSxcbiAgICAgICAgdG9QdWJrZXk6IG5ldyBQdWJsaWNLZXkob3RoZXJBY2NvdW50LnB1YiksXG4gICAgICAgIGxhbXBvcnRzOiAxMDAwMDAwLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0Q3VzdG9tSW5zdHJ1Y3Rpb25CdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIubm9uY2UocmVjZW50QmxvY2tIYXNoKTtcbiAgICAgIHR4QnVpbGRlci5hZGRDdXN0b21JbnN0cnVjdGlvbihjb252ZXJ0SW5zdHJ1Y3Rpb25Ub1BhcmFtcyh0cmFuc2Zlckluc3RydWN0aW9uKSk7XG5cbiAgICAgIGF3YWl0IHR4QnVpbGRlci5idWlsZCgpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ0ludmFsaWQgdHJhbnNhY3Rpb246IG1pc3Npbmcgc2VuZGVyJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnd2hlbiBidWlsZGluZyB3aXRob3V0IG5vbmNlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHJhbnNmZXJJbnN0cnVjdGlvbiA9IFN5c3RlbVByb2dyYW0udHJhbnNmZXIoe1xuICAgICAgICBmcm9tUHVia2V5OiBuZXcgUHVibGljS2V5KGF1dGhBY2NvdW50LnB1YiksXG4gICAgICAgIHRvUHVia2V5OiBuZXcgUHVibGljS2V5KG90aGVyQWNjb3VudC5wdWIpLFxuICAgICAgICBsYW1wb3J0czogMTAwMDAwMCxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldEN1c3RvbUluc3RydWN0aW9uQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcihhdXRoQWNjb3VudC5wdWIpO1xuICAgICAgdHhCdWlsZGVyLmFkZEN1c3RvbUluc3RydWN0aW9uKGNvbnZlcnRJbnN0cnVjdGlvblRvUGFyYW1zKHRyYW5zZmVySW5zdHJ1Y3Rpb24pKTtcblxuICAgICAgYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnSW52YWxpZCB0cmFuc2FjdGlvbjogbWlzc2luZyBub25jZSBibG9ja2hhc2gnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1NvbFZlcnNpb25lZEluc3RydWN0aW9uIFN1cHBvcnQnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBhY2NlcHQgYW5kIHZhbGlkYXRlIFNvbFZlcnNpb25lZEluc3RydWN0aW9uIGZvcm1hdCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGNvbXBpbGVkSW5zdHJ1Y3Rpb246IFNvbFZlcnNpb25lZEluc3RydWN0aW9uID0ge1xuICAgICAgICBwcm9ncmFtSWRJbmRleDogMSxcbiAgICAgICAgYWNjb3VudEtleUluZGV4ZXM6IFswLCAyLCAzXSxcbiAgICAgICAgZGF0YTogJzNCeHM0M1pNalNSUUxzNm8nLCAvLyBiYXNlNTggZW5jb2RlZCBpbnN0cnVjdGlvbiBkYXRhXG4gICAgICB9O1xuXG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBjdXN0b21JbnN0cnVjdGlvbkJ1aWxkZXIoKTtcbiAgICAgIHNob3VsZCgoKSA9PiB0eEJ1aWxkZXIuYWRkQ3VzdG9tSW5zdHJ1Y3Rpb24oY29tcGlsZWRJbnN0cnVjdGlvbikpLm5vdC50aHJvd0Vycm9yKCk7XG5cbiAgICAgIHR4QnVpbGRlci5nZXRJbnN0cnVjdGlvbnMoKS5zaG91bGQuaGF2ZS5sZW5ndGgoMSk7XG4gICAgICBjb25zdCBhZGRlZEluc3RydWN0aW9uID0gdHhCdWlsZGVyLmdldEluc3RydWN0aW9ucygpWzBdO1xuICAgICAgYWRkZWRJbnN0cnVjdGlvbi5wYXJhbXMuc2hvdWxkLmRlZXBFcXVhbChjb21waWxlZEluc3RydWN0aW9uKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgdmVyc2lvbmVkIGluc3RydWN0aW9uIGZvcm1hdCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGN1c3RvbUluc3RydWN0aW9uQnVpbGRlcigpO1xuXG4gICAgICAvLyBJbnZhbGlkIHByb2dyYW1JZEluZGV4XG4gICAgICBzaG91bGQoKCkgPT5cbiAgICAgICAgdHhCdWlsZGVyLmFkZEN1c3RvbUluc3RydWN0aW9uKHtcbiAgICAgICAgICBwcm9ncmFtSWRJbmRleDogLTEsXG4gICAgICAgICAgYWNjb3VudEtleUluZGV4ZXM6IFswXSxcbiAgICAgICAgICBkYXRhOiAnMScsIC8vIGJhc2U1OCBmb3IgMHgwMFxuICAgICAgICB9IGFzIFNvbFZlcnNpb25lZEluc3RydWN0aW9uKVxuICAgICAgKS50aHJvd0Vycm9yKCdWZXJzaW9uZWQgaW5zdHJ1Y3Rpb24gbXVzdCBoYXZlIGEgdmFsaWQgcHJvZ3JhbUlkSW5kZXggbnVtYmVyJyk7XG5cbiAgICAgIC8vIEludmFsaWQgYWNjb3VudEtleUluZGV4ZXNcbiAgICAgIHNob3VsZCgoKSA9PlxuICAgICAgICB0eEJ1aWxkZXIuYWRkQ3VzdG9tSW5zdHJ1Y3Rpb24oe1xuICAgICAgICAgIHByb2dyYW1JZEluZGV4OiAwLFxuICAgICAgICAgIGFjY291bnRLZXlJbmRleGVzOiBbLTFdLFxuICAgICAgICAgIGRhdGE6ICcxJywgLy8gYmFzZTU4IGZvciAweDAwXG4gICAgICAgIH0gYXMgU29sVmVyc2lvbmVkSW5zdHJ1Y3Rpb24pXG4gICAgICApLnRocm93RXJyb3IoJ0VhY2ggYWNjb3VudEtleUluZGV4IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyJyk7XG5cbiAgICAgIC8vIE1pc3NpbmcgZGF0YVxuICAgICAgc2hvdWxkKCgpID0+XG4gICAgICAgIHR4QnVpbGRlci5hZGRDdXN0b21JbnN0cnVjdGlvbih7XG4gICAgICAgICAgcHJvZ3JhbUlkSW5kZXg6IDAsXG4gICAgICAgICAgYWNjb3VudEtleUluZGV4ZXM6IFswXSxcbiAgICAgICAgfSBhcyBTb2xWZXJzaW9uZWRJbnN0cnVjdGlvbilcbiAgICAgICkudGhyb3dFcnJvcignVmVyc2lvbmVkIGluc3RydWN0aW9uIG11c3QgaGF2ZSB2YWxpZCBkYXRhIHN0cmluZycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgbWl4ZWQgU29sSW5zdHJ1Y3Rpb24gYW5kIFNvbFZlcnNpb25lZEluc3RydWN0aW9uJywgKCkgPT4ge1xuICAgICAgY29uc3QgdHJhZGl0aW9uYWxJbnN0cnVjdGlvbiA9IGNvbnZlcnRJbnN0cnVjdGlvblRvUGFyYW1zKFxuICAgICAgICBTeXN0ZW1Qcm9ncmFtLnRyYW5zZmVyKHtcbiAgICAgICAgICBmcm9tUHVia2V5OiBuZXcgUHVibGljS2V5KGF1dGhBY2NvdW50LnB1YiksXG4gICAgICAgICAgdG9QdWJrZXk6IG5ldyBQdWJsaWNLZXkob3RoZXJBY2NvdW50LnB1YiksXG4gICAgICAgICAgbGFtcG9ydHM6IDEwMDAwMDAsXG4gICAgICAgIH0pXG4gICAgICApO1xuXG4gICAgICBjb25zdCBjb21waWxlZEluc3RydWN0aW9uOiBTb2xWZXJzaW9uZWRJbnN0cnVjdGlvbiA9IHtcbiAgICAgICAgcHJvZ3JhbUlkSW5kZXg6IDEsXG4gICAgICAgIGFjY291bnRLZXlJbmRleGVzOiBbMCwgMl0sXG4gICAgICAgIGRhdGE6ICc0SFNvNVlWQnJnQ2hUWlg1JyxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGN1c3RvbUluc3RydWN0aW9uQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLmFkZEN1c3RvbUluc3RydWN0aW9uKHRyYWRpdGlvbmFsSW5zdHJ1Y3Rpb24pO1xuICAgICAgdHhCdWlsZGVyLmFkZEN1c3RvbUluc3RydWN0aW9uKGNvbXBpbGVkSW5zdHJ1Y3Rpb24pO1xuXG4gICAgICB0eEJ1aWxkZXIuZ2V0SW5zdHJ1Y3Rpb25zKCkuc2hvdWxkLmhhdmUubGVuZ3RoKDIpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZnJvbVZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHByb2Nlc3MgVmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhIGFuZCBleHRyYWN0IGluc3RydWN0aW9ucycsICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGN1c3RvbUluc3RydWN0aW9uQnVpbGRlcigpO1xuICAgICAgY29uc3QgdmVyc2lvbmVkVHhEYXRhID0gZXh0cmFjdFZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YSh0ZXN0RGF0YS5KVVBJVEVSX1ZFUlNJT05FRF9UWF9CWVRFUyk7XG5cbiAgICAgIC8vIFNob3VsZCBwYXJzZSB3aXRob3V0IHRocm93aW5nIGVycm9yc1xuICAgICAgc2hvdWxkKCgpID0+IHR4QnVpbGRlci5mcm9tVmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhKHZlcnNpb25lZFR4RGF0YSkpLm5vdC50aHJvd0Vycm9yKCk7XG5cbiAgICAgIC8vIFNob3VsZCBoYXZlIGV4dHJhY3RlZCBpbnN0cnVjdGlvbnNcbiAgICAgIGNvbnN0IGluc3RydWN0aW9ucyA9IHR4QnVpbGRlci5nZXRJbnN0cnVjdGlvbnMoKTtcbiAgICAgIGluc3RydWN0aW9ucy5sZW5ndGguc2hvdWxkLmJlLmdyZWF0ZXJUaGFuKDApO1xuXG4gICAgICBmb3IgKGNvbnN0IGluc3RydWN0aW9uIG9mIGluc3RydWN0aW9ucykge1xuICAgICAgICBpbnN0cnVjdGlvbi50eXBlLnNob3VsZC5lcXVhbCgnVmVyc2lvbmVkQ3VzdG9tSW5zdHJ1Y3Rpb24nKTtcbiAgICAgICAgaW5zdHJ1Y3Rpb24ucGFyYW1zLnNob3VsZC5oYXZlLnByb3BlcnR5KCdwcm9ncmFtSWRJbmRleCcpO1xuICAgICAgICBpbnN0cnVjdGlvbi5wYXJhbXMuc2hvdWxkLmhhdmUucHJvcGVydHkoJ2FjY291bnRLZXlJbmRleGVzJyk7XG4gICAgICAgIGluc3RydWN0aW9uLnBhcmFtcy5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnZGF0YScpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzdG9yZSBWZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEgaW4gdW5kZXJseWluZyB0cmFuc2FjdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGN1c3RvbUluc3RydWN0aW9uQnVpbGRlcigpO1xuICAgICAgY29uc3QgdmVyc2lvbmVkVHhEYXRhID0gZXh0cmFjdFZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YSh0ZXN0RGF0YS5KVVBJVEVSX1ZFUlNJT05FRF9UWF9CWVRFUyk7XG5cbiAgICAgIHR4QnVpbGRlci5mcm9tVmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhKHZlcnNpb25lZFR4RGF0YSk7XG5cbiAgICAgIGNvbnN0IHR4ID0gdHhCdWlsZGVyWydfdHJhbnNhY3Rpb24nXTtcbiAgICAgIGNvbnN0IHN0b3JlZERhdGEgPSB0eC5nZXRWZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEoKTtcbiAgICAgIHNob3VsZC5leGlzdChzdG9yZWREYXRhKTtcbiAgICAgIHN0b3JlZERhdGEhLnZlcnNpb25lZEluc3RydWN0aW9ucy5sZW5ndGguc2hvdWxkLmVxdWFsKHZlcnNpb25lZFR4RGF0YS52ZXJzaW9uZWRJbnN0cnVjdGlvbnMubGVuZ3RoKTtcbiAgICAgIHN0b3JlZERhdGEhLmFkZHJlc3NMb29rdXBUYWJsZXMubGVuZ3RoLnNob3VsZC5lcXVhbCh2ZXJzaW9uZWRUeERhdGEuYWRkcmVzc0xvb2t1cFRhYmxlcy5sZW5ndGgpO1xuICAgICAgc3RvcmVkRGF0YSEuc3RhdGljQWNjb3VudEtleXMubGVuZ3RoLnNob3VsZC5lcXVhbCh2ZXJzaW9uZWRUeERhdGEuc3RhdGljQWNjb3VudEtleXMubGVuZ3RoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgaW5wdXQgZGF0YScsICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGN1c3RvbUluc3RydWN0aW9uQnVpbGRlcigpO1xuXG4gICAgICAvLyBJbnZhbGlkOiBudWxsL3VuZGVmaW5lZFxuICAgICAgc2hvdWxkKCgpID0+IHR4QnVpbGRlci5mcm9tVmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhKG51bGwgYXMgYW55KSkudGhyb3dFcnJvcigvbXVzdCBiZSBhIHZhbGlkIG9iamVjdC8pO1xuICAgICAgc2hvdWxkKCgpID0+IHR4QnVpbGRlci5mcm9tVmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhKHVuZGVmaW5lZCBhcyBhbnkpKS50aHJvd0Vycm9yKC9tdXN0IGJlIGEgdmFsaWQgb2JqZWN0Lyk7XG5cbiAgICAgIC8vIEludmFsaWQ6IGVtcHR5IGluc3RydWN0aW9uc1xuICAgICAgc2hvdWxkKCgpID0+XG4gICAgICAgIHR4QnVpbGRlci5mcm9tVmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhKHtcbiAgICAgICAgICB2ZXJzaW9uZWRJbnN0cnVjdGlvbnM6IFtdLFxuICAgICAgICAgIGFkZHJlc3NMb29rdXBUYWJsZXM6IFtdLFxuICAgICAgICAgIHN0YXRpY0FjY291bnRLZXlzOiBbJ3Rlc3QnXSxcbiAgICAgICAgICBtZXNzYWdlSGVhZGVyOiB7IG51bVJlcXVpcmVkU2lnbmF0dXJlczogMSwgbnVtUmVhZG9ubHlTaWduZWRBY2NvdW50czogMCwgbnVtUmVhZG9ubHlVbnNpZ25lZEFjY291bnRzOiAwIH0sXG4gICAgICAgIH0pXG4gICAgICApLnRocm93RXJyb3IoL25vbi1lbXB0eSBhcnJheS8pO1xuXG4gICAgICAvLyBJbnZhbGlkOiBtaXNzaW5nIGFkZHJlc3NMb29rdXBUYWJsZXNcbiAgICAgIHNob3VsZCgoKSA9PlxuICAgICAgICB0eEJ1aWxkZXIuZnJvbVZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YSh7XG4gICAgICAgICAgdmVyc2lvbmVkSW5zdHJ1Y3Rpb25zOiBbeyBwcm9ncmFtSWRJbmRleDogMCwgYWNjb3VudEtleUluZGV4ZXM6IFswXSwgZGF0YTogJzEnIH1dLCAvLyBiYXNlNTggZm9yIDB4MDBcbiAgICAgICAgICBzdGF0aWNBY2NvdW50S2V5czogWyd0ZXN0J10sXG4gICAgICAgIH0gYXMgYW55KVxuICAgICAgKS50aHJvd0Vycm9yKC9tdXN0IGJlIGFuIGFycmF5Lyk7XG5cbiAgICAgIC8vIEludmFsaWQ6IGVtcHR5IHN0YXRpY0FjY291bnRLZXlzXG4gICAgICBzaG91bGQoKCkgPT5cbiAgICAgICAgdHhCdWlsZGVyLmZyb21WZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEoe1xuICAgICAgICAgIHZlcnNpb25lZEluc3RydWN0aW9uczogW3sgcHJvZ3JhbUlkSW5kZXg6IDAsIGFjY291bnRLZXlJbmRleGVzOiBbMF0sIGRhdGE6ICcxJyB9XSwgLy8gYmFzZTU4IGZvciAweDAwXG4gICAgICAgICAgYWRkcmVzc0xvb2t1cFRhYmxlczogW10sXG4gICAgICAgICAgc3RhdGljQWNjb3VudEtleXM6IFtdLFxuICAgICAgICAgIG1lc3NhZ2VIZWFkZXI6IHsgbnVtUmVxdWlyZWRTaWduYXR1cmVzOiAxLCBudW1SZWFkb25seVNpZ25lZEFjY291bnRzOiAwLCBudW1SZWFkb25seVVuc2lnbmVkQWNjb3VudHM6IDAgfSxcbiAgICAgICAgfSlcbiAgICAgICkudGhyb3dFcnJvcigvbm9uLWVtcHR5IGFycmF5Lyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHdvcmsgd2l0aCB0aGUgY29tcGxldGUgdHJhbnNhY3Rpb24gYnVpbGRpbmcgZmxvdycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGN1c3RvbUluc3RydWN0aW9uQnVpbGRlcigpO1xuICAgICAgY29uc3QgdmVyc2lvbmVkVHhEYXRhID0gZXh0cmFjdFZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YSh0ZXN0RGF0YS5KVVBJVEVSX1ZFUlNJT05FRF9UWF9CWVRFUyk7XG5cbiAgICAgIC8vIFByb2Nlc3MgdGhlIFZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YVxuICAgICAgdHhCdWlsZGVyLmZyb21WZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEodmVyc2lvbmVkVHhEYXRhKTtcblxuICAgICAgdHhCdWlsZGVyLnNlbmRlcih2ZXJzaW9uZWRUeERhdGEuc3RhdGljQWNjb3VudEtleXNbMF0pOyAvLyBGZWUgcGF5ZXJcbiAgICAgIHR4QnVpbGRlci5ub25jZSh0ZXN0RGF0YS5ibG9ja0hhc2hlcy52YWxpZEJsb2NrSGFzaGVzWzBdKTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcblxuICAgICAgLy8gVmVyaWZ5IHRyYW5zYWN0aW9uIHByb3BlcnRpZXNcbiAgICAgIHR4LnNob3VsZC5iZS5vaygpO1xuICAgICAgdHgudHlwZS5zaG91bGQuZXF1YWwoMzEpOyAvLyBUcmFuc2FjdGlvblR5cGUuQ3VzdG9tVHggZW51bSB2YWx1ZVxuXG4gICAgICAvLyBWZXJpZnkgc2lnbmFibGUgcGF5bG9hZFxuICAgICAgY29uc3QgcGF5bG9hZCA9IHR4LnNpZ25hYmxlUGF5bG9hZDtcbiAgICAgIHBheWxvYWQuc2hvdWxkLmJlLmluc3RhbmNlT2YoQnVmZmVyKTtcbiAgICAgIHBheWxvYWQubGVuZ3RoLnNob3VsZC5iZS5ncmVhdGVyVGhhbigwKTtcblxuICAgICAgLy8gVmVyaWZ5IHBheWxvYWQgaXMgZGV0ZXJtaW5pc3RpYyAtIHJlYnVpbGRpbmcgd2l0aCBzYW1lIHBhcmFtcyBwcm9kdWNlcyBzYW1lIHBheWxvYWRcbiAgICAgIGNvbnN0IHR4QnVpbGRlcjIgPSBjdXN0b21JbnN0cnVjdGlvbkJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlcjIuZnJvbVZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YSh2ZXJzaW9uZWRUeERhdGEpO1xuICAgICAgdHhCdWlsZGVyMi5zZW5kZXIodmVyc2lvbmVkVHhEYXRhLnN0YXRpY0FjY291bnRLZXlzWzBdKTtcbiAgICAgIHR4QnVpbGRlcjIubm9uY2UodGVzdERhdGEuYmxvY2tIYXNoZXMudmFsaWRCbG9ja0hhc2hlc1swXSk7XG4gICAgICBjb25zdCB0eDIgPSBhd2FpdCB0eEJ1aWxkZXIyLmJ1aWxkKCk7XG4gICAgICBzaG91bGQuZXF1YWwodHgyLnNpZ25hYmxlUGF5bG9hZC50b1N0cmluZygnaGV4JyksIHBheWxvYWQudG9TdHJpbmcoJ2hleCcpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZXh0cmFjdCB0aGUgY29ycmVjdCBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zIGZyb20gSnVwaXRlciB0cmFuc2FjdGlvbicsICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGN1c3RvbUluc3RydWN0aW9uQnVpbGRlcigpO1xuICAgICAgY29uc3QgdmVyc2lvbmVkVHhEYXRhID0gZXh0cmFjdFZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YSh0ZXN0RGF0YS5KVVBJVEVSX1ZFUlNJT05FRF9UWF9CWVRFUyk7XG5cbiAgICAgIHR4QnVpbGRlci5mcm9tVmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhKHZlcnNpb25lZFR4RGF0YSk7XG5cbiAgICAgIGNvbnN0IGluc3RydWN0aW9ucyA9IHR4QnVpbGRlci5nZXRJbnN0cnVjdGlvbnMoKTtcblxuICAgICAgLy8gVmVyaWZ5IHdlIGV4dHJhY3RlZCBpbnN0cnVjdGlvbnNcbiAgICAgIGluc3RydWN0aW9ucy5sZW5ndGguc2hvdWxkLmJlLmdyZWF0ZXJUaGFuKDApO1xuICAgICAgaW5zdHJ1Y3Rpb25zLmxlbmd0aC5zaG91bGQuZXF1YWwodmVyc2lvbmVkVHhEYXRhLnZlcnNpb25lZEluc3RydWN0aW9ucy5sZW5ndGgpO1xuXG4gICAgICAvLyBWZXJpZnkgZWFjaCBpbnN0cnVjdGlvbiBoYXMgdmFsaWQgY29tcGlsZWQgZm9ybWF0XG4gICAgICBmb3IgKGNvbnN0IGluc3RydWN0aW9uIG9mIGluc3RydWN0aW9ucykge1xuICAgICAgICBjb25zdCBwYXJhbXMgPSBpbnN0cnVjdGlvbi5wYXJhbXMgYXMgU29sVmVyc2lvbmVkSW5zdHJ1Y3Rpb247XG4gICAgICAgICh0eXBlb2YgcGFyYW1zLnByb2dyYW1JZEluZGV4KS5zaG91bGQuZXF1YWwoJ251bWJlcicpO1xuICAgICAgICBwYXJhbXMucHJvZ3JhbUlkSW5kZXguc2hvdWxkLmJlLmdyZWF0ZXJUaGFuT3JFcXVhbCgwKTtcbiAgICAgICAgQXJyYXkuaXNBcnJheShwYXJhbXMuYWNjb3VudEtleUluZGV4ZXMpLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICAgICAgKHR5cGVvZiBwYXJhbXMuZGF0YSkuc2hvdWxkLmVxdWFsKCdzdHJpbmcnKTtcbiAgICAgICAgLy8gRGF0YSBzaG91bGQgYmUgdmFsaWQgYmFzZTU4IHN0cmluZyAobm9uLWVtcHR5KVxuICAgICAgICBwYXJhbXMuZGF0YS5sZW5ndGguc2hvdWxkLmJlLmdyZWF0ZXJUaGFuKDApO1xuICAgICAgICAvLyBWZXJpZnkgaXQgY2FuIGJlIGRlY29kZWRcbiAgICAgICAgc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PiBiYXNlNTguZGVjb2RlKHBhcmFtcy5kYXRhKSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGNsZWFyIGluc3RydWN0aW9ucyBwcm9wZXJseSBhZnRlciB1c2luZyBmcm9tVmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhJywgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gY3VzdG9tSW5zdHJ1Y3Rpb25CdWlsZGVyKCk7XG4gICAgICBjb25zdCB2ZXJzaW9uZWRUeERhdGEgPSBleHRyYWN0VmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhKHRlc3REYXRhLkpVUElURVJfVkVSU0lPTkVEX1RYX0JZVEVTKTtcblxuICAgICAgdHhCdWlsZGVyLmZyb21WZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEodmVyc2lvbmVkVHhEYXRhKTtcbiAgICAgIHR4QnVpbGRlci5nZXRJbnN0cnVjdGlvbnMoKS5sZW5ndGguc2hvdWxkLmJlLmdyZWF0ZXJUaGFuKDApO1xuXG4gICAgICAvLyBDbGVhciBzaG91bGQgd29ya1xuICAgICAgdHhCdWlsZGVyLmNsZWFySW5zdHJ1Y3Rpb25zKCk7XG4gICAgICB0eEJ1aWxkZXIuZ2V0SW5zdHJ1Y3Rpb25zKCkuc2hvdWxkLmhhdmUubGVuZ3RoKDApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBleHRyYWN0IGZlZSBwYXllciBmcm9tIHN0YXRpY0FjY291bnRLZXlzJywgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRDdXN0b21JbnN0cnVjdGlvbkJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci5ub25jZShyZWNlbnRCbG9ja0hhc2gpO1xuXG4gICAgICBjb25zdCB2ZXJzaW9uZWRUeERhdGEgPSBleHRyYWN0VmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhKHRlc3REYXRhLkpVUElURVJfVkVSU0lPTkVEX1RYX0JZVEVTKTtcblxuICAgICAgdHhCdWlsZGVyLmZyb21WZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEodmVyc2lvbmVkVHhEYXRhKTtcblxuICAgICAgY29uc3Qgc2VuZGVyID0gdHhCdWlsZGVyWydfc2VuZGVyJ107XG4gICAgICBzaG91bGQuZXhpc3Qoc2VuZGVyKTtcbiAgICAgIHNlbmRlci5zaG91bGQuZXF1YWwodmVyc2lvbmVkVHhEYXRhLnN0YXRpY0FjY291bnRLZXlzWzBdKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbm90IG92ZXJyaWRlIGV4aXN0aW5nIHNlbmRlcicsICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGN1c3RvbUluc3RydWN0aW9uQnVpbGRlcigpO1xuICAgICAgY29uc3QgdmVyc2lvbmVkVHhEYXRhID0gZXh0cmFjdFZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YSh0ZXN0RGF0YS5KVVBJVEVSX1ZFUlNJT05FRF9UWF9CWVRFUyk7XG5cbiAgICAgIGNvbnN0IG9yaWdpbmFsU2VuZGVyID0gdHhCdWlsZGVyWydfc2VuZGVyJ107XG4gICAgICB0eEJ1aWxkZXIuZnJvbVZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YSh2ZXJzaW9uZWRUeERhdGEpO1xuXG4gICAgICBjb25zdCBzZW5kZXIgPSB0eEJ1aWxkZXJbJ19zZW5kZXInXTtcbiAgICAgIHNlbmRlci5zaG91bGQuZXF1YWwob3JpZ2luYWxTZW5kZXIpO1xuICAgICAgc2VuZGVyLnNob3VsZC5lcXVhbChhdXRoQWNjb3VudC5wdWIpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZHVyYWJsZSBub25jZSBpbmplY3Rpb24nLCAoKSA9PiB7XG4gICAgY29uc3QgU1lTVEVNX1BST0dSQU1fSUQgPSBTeXN0ZW1Qcm9ncmFtLnByb2dyYW1JZC50b0Jhc2U1OCgpO1xuICAgIGNvbnN0IFNZU1ZBUl9SRUNFTlRfQkxPQ0tIQVNIRVNfSUQgPSBTWVNWQVJfUkVDRU5UX0JMT0NLSEFTSEVTX1BVQktFWS50b0Jhc2U1OCgpO1xuICAgIGNvbnN0IHdhbGxldE5vbmNlQWRkcmVzcyA9IHRlc3REYXRhLm5vbmNlQWNjb3VudC5wdWI7XG4gICAgY29uc3QgYXV0aFdhbGxldEFkZHJlc3MgPSBhdXRoQWNjb3VudC5wdWI7XG5cbiAgICBjb25zdCBzZWVkZWRQdWJsaWNLZXkgPSAoc2VlZDogbnVtYmVyKTogUHVibGljS2V5ID0+IEtleXBhaXIuZnJvbVNlZWQoQnVmZmVyLmFsbG9jKDMyLCBzZWVkKSkucHVibGljS2V5O1xuXG4gICAgLy8gRGV0ZXJtaW5pc3RpYyBmaXh0dXJlIGtleXMgY292ZXJpbmcgYWxsIGZvdXIgTWVzc2FnZVYwIGhlYWRlciBzZWN0aW9uc1xuICAgIGNvbnN0IGZpeHR1cmVQYXllciA9IHNlZWRlZFB1YmxpY0tleSgxMSk7IC8vIHdyaXRhYmxlIHNpZ25lciAoYWNjb3VudCAwKVxuICAgIGNvbnN0IGZpeHR1cmVSb1NpZ25lciA9IHNlZWRlZFB1YmxpY0tleSgxMik7IC8vIHJlYWQtb25seSBzaWduZXJcbiAgICBjb25zdCBmaXh0dXJlV3JpdGFibGVOb25TaWduZXIgPSBzZWVkZWRQdWJsaWNLZXkoMTMpO1xuICAgIGNvbnN0IGZpeHR1cmVSb05vblNpZ25lciA9IHNlZWRlZFB1YmxpY0tleSgxNCk7XG4gICAgY29uc3QgZml4dHVyZUFsdFdyaXRhYmxlID0gc2VlZGVkUHVibGljS2V5KDE1KTsgLy8gbG9hZGVkIGZyb20gdGhlIGxvb2t1cCB0YWJsZVxuICAgIGNvbnN0IGZpeHR1cmVBbHRSZWFkb25seSA9IHNlZWRlZFB1YmxpY0tleSgxNik7IC8vIGxvYWRlZCBmcm9tIHRoZSBsb29rdXAgdGFibGVcbiAgICBjb25zdCBmaXh0dXJlUHJvZ3JhbSA9IHNlZWRlZFB1YmxpY0tleSgxNyk7XG5cbiAgICAvLyBUaGUgbG9va3VwIHRhYmxlIGhhcyBmaWxsZXIgYWRkcmVzc2VzIGF0IGluZGV4ZXMgMCBhbmQgMiBzbyB0aGVcbiAgICAvLyByZWZlcmVuY2VkIGluZGV4ZXMgKDEgd3JpdGFibGUsIDMgcmVhZG9ubHkpIGFyZSBub24tdHJpdmlhbFxuICAgIGNvbnN0IGxvb2t1cFRhYmxlQWNjb3VudCA9IG5ldyBBZGRyZXNzTG9va3VwVGFibGVBY2NvdW50KHtcbiAgICAgIGtleTogc2VlZGVkUHVibGljS2V5KDIwMCksXG4gICAgICBzdGF0ZToge1xuICAgICAgICBkZWFjdGl2YXRpb25TbG90OiBCaWdJbnQoMCksXG4gICAgICAgIGxhc3RFeHRlbmRlZFNsb3Q6IDAsXG4gICAgICAgIGxhc3RFeHRlbmRlZFNsb3RTdGFydEluZGV4OiAwLFxuICAgICAgICBhZGRyZXNzZXM6IFtzZWVkZWRQdWJsaWNLZXkoOTApLCBmaXh0dXJlQWx0V3JpdGFibGUsIHNlZWRlZFB1YmxpY0tleSg5MSksIGZpeHR1cmVBbHRSZWFkb25seV0sXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ29tcGlsZSB2ZXJzaW9uZWQgdHJhbnNhY3Rpb24gZGF0YSB0aHJvdWdoIHdlYjMuanMgd2l0aCBhIGxvb2t1cCB0YWJsZSxcbiAgICAgKiBtaXJyb3JpbmcgdGhlIGRhdGEgY2FsbGVycyBleHRyYWN0IGZyb20gYSByZWFsIFZlcnNpb25lZFRyYW5zYWN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJ1aWxkVmVyc2lvbmVkRml4dHVyZShcbiAgICAgIHBheWVyS2V5OiBQdWJsaWNLZXksXG4gICAgICBpbnN0cnVjdGlvbnM6IHtcbiAgICAgICAgcHJvZ3JhbUlkOiBQdWJsaWNLZXk7XG4gICAgICAgIGtleXM6IHsgcHVia2V5OiBQdWJsaWNLZXk7IGlzU2lnbmVyOiBib29sZWFuOyBpc1dyaXRhYmxlOiBib29sZWFuIH1bXTtcbiAgICAgIH1bXVxuICAgICk6IHsgbWVzc2FnZTogTWVzc2FnZVYwOyBkYXRhOiBWZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEgfSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gTWVzc2FnZVYwLmNvbXBpbGUoe1xuICAgICAgICBwYXllcktleSxcbiAgICAgICAgcmVjZW50QmxvY2toYXNoOiByZWNlbnRCbG9ja0hhc2gsXG4gICAgICAgIGFkZHJlc3NMb29rdXBUYWJsZUFjY291bnRzOiBbbG9va3VwVGFibGVBY2NvdW50XSxcbiAgICAgICAgaW5zdHJ1Y3Rpb25zOiBpbnN0cnVjdGlvbnMubWFwKFxuICAgICAgICAgIChpeCkgPT5cbiAgICAgICAgICAgIG5ldyBUcmFuc2FjdGlvbkluc3RydWN0aW9uKHtcbiAgICAgICAgICAgICAgcHJvZ3JhbUlkOiBpeC5wcm9ncmFtSWQsXG4gICAgICAgICAgICAgIGtleXM6IGl4LmtleXMsXG4gICAgICAgICAgICAgIGRhdGE6IEJ1ZmZlci5mcm9tKFsxLCAyLCAzLCA0XSksXG4gICAgICAgICAgICB9KVxuICAgICAgICApLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGRhdGE6IFZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YSA9IHtcbiAgICAgICAgdmVyc2lvbmVkSW5zdHJ1Y3Rpb25zOiBtZXNzYWdlLmNvbXBpbGVkSW5zdHJ1Y3Rpb25zLm1hcCgoY2kpID0+ICh7XG4gICAgICAgICAgcHJvZ3JhbUlkSW5kZXg6IGNpLnByb2dyYW1JZEluZGV4LFxuICAgICAgICAgIGFjY291bnRLZXlJbmRleGVzOiBbLi4uY2kuYWNjb3VudEtleUluZGV4ZXNdLFxuICAgICAgICAgIGRhdGE6IGJhc2U1OC5lbmNvZGUoY2kuZGF0YSksXG4gICAgICAgIH0pKSxcbiAgICAgICAgYWRkcmVzc0xvb2t1cFRhYmxlczogbWVzc2FnZS5hZGRyZXNzVGFibGVMb29rdXBzLm1hcCgoYWx0KSA9PiAoe1xuICAgICAgICAgIGFjY291bnRLZXk6IGFsdC5hY2NvdW50S2V5LnRvQmFzZTU4KCksXG4gICAgICAgICAgd3JpdGFibGVJbmRleGVzOiBbLi4uYWx0LndyaXRhYmxlSW5kZXhlc10sXG4gICAgICAgICAgcmVhZG9ubHlJbmRleGVzOiBbLi4uYWx0LnJlYWRvbmx5SW5kZXhlc10sXG4gICAgICAgIH0pKSxcbiAgICAgICAgc3RhdGljQWNjb3VudEtleXM6IG1lc3NhZ2Uuc3RhdGljQWNjb3VudEtleXMubWFwKChrZXkpID0+IGtleS50b0Jhc2U1OCgpKSxcbiAgICAgICAgbWVzc2FnZUhlYWRlcjoge1xuICAgICAgICAgIG51bVJlcXVpcmVkU2lnbmF0dXJlczogbWVzc2FnZS5oZWFkZXIubnVtUmVxdWlyZWRTaWduYXR1cmVzLFxuICAgICAgICAgIG51bVJlYWRvbmx5U2lnbmVkQWNjb3VudHM6IG1lc3NhZ2UuaGVhZGVyLm51bVJlYWRvbmx5U2lnbmVkQWNjb3VudHMsXG4gICAgICAgICAgbnVtUmVhZG9ubHlVbnNpZ25lZEFjY291bnRzOiBtZXNzYWdlLmhlYWRlci5udW1SZWFkb25seVVuc2lnbmVkQWNjb3VudHMsXG4gICAgICAgIH0sXG4gICAgICAgIHJlY2VudEJsb2NraGFzaDogcmVjZW50QmxvY2tIYXNoLFxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIHsgbWVzc2FnZSwgZGF0YSB9O1xuICAgIH1cblxuICAgIC8qKiBDb21waWxlIHByb2Nlc3NlZCBWZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEgYmFjayBpbnRvIGEgTWVzc2FnZVYwICovXG4gICAgZnVuY3Rpb24gY29tcGlsZVByb2Nlc3NlZE1lc3NhZ2UoZGF0YTogVmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhKTogTWVzc2FnZVYwIHtcbiAgICAgIHJldHVybiBuZXcgTWVzc2FnZVYwKHtcbiAgICAgICAgaGVhZGVyOiB7IC4uLmRhdGEubWVzc2FnZUhlYWRlciB9LFxuICAgICAgICBzdGF0aWNBY2NvdW50S2V5czogZGF0YS5zdGF0aWNBY2NvdW50S2V5cy5tYXAoKGtleSkgPT4gbmV3IFB1YmxpY0tleShrZXkpKSxcbiAgICAgICAgcmVjZW50QmxvY2toYXNoOiBkYXRhLnJlY2VudEJsb2NraGFzaCA/PyByZWNlbnRCbG9ja0hhc2gsXG4gICAgICAgIGNvbXBpbGVkSW5zdHJ1Y3Rpb25zOiBkYXRhLnZlcnNpb25lZEluc3RydWN0aW9ucy5tYXAoKGluc3RydWN0aW9uKSA9PiAoe1xuICAgICAgICAgIHByb2dyYW1JZEluZGV4OiBpbnN0cnVjdGlvbi5wcm9ncmFtSWRJbmRleCxcbiAgICAgICAgICBhY2NvdW50S2V5SW5kZXhlczogWy4uLmluc3RydWN0aW9uLmFjY291bnRLZXlJbmRleGVzXSxcbiAgICAgICAgICBkYXRhOiBCdWZmZXIuZnJvbShiYXNlNTguZGVjb2RlKGluc3RydWN0aW9uLmRhdGEpKSxcbiAgICAgICAgfSkpLFxuICAgICAgICBhZGRyZXNzVGFibGVMb29rdXBzOiBkYXRhLmFkZHJlc3NMb29rdXBUYWJsZXMubWFwKChhbHQpID0+ICh7XG4gICAgICAgICAgYWNjb3VudEtleTogbmV3IFB1YmxpY0tleShhbHQuYWNjb3VudEtleSksXG4gICAgICAgICAgd3JpdGFibGVJbmRleGVzOiBbLi4uYWx0LndyaXRhYmxlSW5kZXhlc10sXG4gICAgICAgICAgcmVhZG9ubHlJbmRleGVzOiBbLi4uYWx0LnJlYWRvbmx5SW5kZXhlc10sXG4gICAgICAgIH0pKSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKiBJbmplY3QgdGhlIGR1cmFibGUgbm9uY2UgYWR2YW5jZSBpbnN0cnVjdGlvbiBhbmQgcmV0dXJuIHRoZSBwcm9jZXNzZWQgZGF0YSAqL1xuICAgIGZ1bmN0aW9uIGluamVjdE5vbmNlQWR2YW5jZShkYXRhOiBWZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEpOiBWZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRDdXN0b21JbnN0cnVjdGlvbkJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci5ub25jZShyZWNlbnRCbG9ja0hhc2gsIHsgd2FsbGV0Tm9uY2VBZGRyZXNzLCBhdXRoV2FsbGV0QWRkcmVzcyB9KTtcbiAgICAgIHR4QnVpbGRlci5mcm9tVmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhKGRhdGEpO1xuICAgICAgY29uc3QgcHJvY2Vzc2VkID0gdHhCdWlsZGVyWydfdHJhbnNhY3Rpb24nXS5nZXRWZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEoKTtcbiAgICAgIHNob3VsZC5leGlzdChwcm9jZXNzZWQpO1xuICAgICAgcmV0dXJuIHByb2Nlc3NlZCE7XG4gICAgfVxuXG4gICAgLyoqIEZpeHR1cmUgdXNpbmcgZXZlcnkgaGVhZGVyIHNlY3Rpb24gYW5kIGJvdGggbG9va3VwLXRhYmxlIHNsb3RzICovXG4gICAgY29uc3QgbWFpbkZpeHR1cmUgPSAoKSA9PlxuICAgICAgYnVpbGRWZXJzaW9uZWRGaXh0dXJlKGZpeHR1cmVQYXllciwgW1xuICAgICAgICB7XG4gICAgICAgICAgcHJvZ3JhbUlkOiBmaXh0dXJlUHJvZ3JhbSxcbiAgICAgICAgICBrZXlzOiBbXG4gICAgICAgICAgICB7IHB1YmtleTogZml4dHVyZVBheWVyLCBpc1NpZ25lcjogdHJ1ZSwgaXNXcml0YWJsZTogdHJ1ZSB9LFxuICAgICAgICAgICAgeyBwdWJrZXk6IGZpeHR1cmVSb1NpZ25lciwgaXNTaWduZXI6IHRydWUsIGlzV3JpdGFibGU6IGZhbHNlIH0sXG4gICAgICAgICAgICB7IHB1YmtleTogZml4dHVyZUFsdFdyaXRhYmxlLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSxcbiAgICAgICAgICAgIHsgcHVia2V5OiBmaXh0dXJlQWx0UmVhZG9ubHksIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogZmFsc2UgfSxcbiAgICAgICAgICAgIHsgcHVia2V5OiBmaXh0dXJlV3JpdGFibGVOb25TaWduZXIsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9LFxuICAgICAgICAgICAgeyBwdWJrZXk6IGZpeHR1cmVSb05vblNpZ25lciwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiBmYWxzZSB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICBdKTtcblxuICAgIGl0KCdrZWVwcyBsb29rdXAtdGFibGUtcmVmZXJlbmNpbmcgaW5zdHJ1Y3Rpb25zIHBvaW50aW5nIGF0IHRoZSBzYW1lIGFjY291bnRzJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBtZXNzYWdlLCBkYXRhIH0gPSBtYWluRml4dHVyZSgpO1xuICAgICAgY29uc3QgcHJvY2Vzc2VkID0gaW5qZWN0Tm9uY2VBZHZhbmNlKGRhdGEpO1xuXG4gICAgICAvLyBUaGUgZml4dHVyZSBtdXN0IGFjdHVhbGx5IHJlZmVyZW5jZSBhY2NvdW50cyBsb2FkZWQgZnJvbSB0aGUgbG9va3VwIHRhYmxlXG4gICAgICBNYXRoLm1heChcbiAgICAgICAgLi4uZGF0YS52ZXJzaW9uZWRJbnN0cnVjdGlvbnMuZmxhdE1hcCgoaXgpID0+IFsuLi5peC5hY2NvdW50S2V5SW5kZXhlcywgaXgucHJvZ3JhbUlkSW5kZXhdKVxuICAgICAgKS5zaG91bGQuYmUuZ3JlYXRlclRoYW5PckVxdWFsKGRhdGEuc3RhdGljQWNjb3VudEtleXMubGVuZ3RoKTtcblxuICAgICAgY29uc3QgYmVmb3JlID0gbWVzc2FnZS5nZXRBY2NvdW50S2V5cyh7IGFkZHJlc3NMb29rdXBUYWJsZUFjY291bnRzOiBbbG9va3VwVGFibGVBY2NvdW50XSB9KTtcbiAgICAgIGNvbnN0IGFmdGVyID0gY29tcGlsZVByb2Nlc3NlZE1lc3NhZ2UocHJvY2Vzc2VkKS5nZXRBY2NvdW50S2V5cyh7XG4gICAgICAgIGFkZHJlc3NMb29rdXBUYWJsZUFjY291bnRzOiBbbG9va3VwVGFibGVBY2NvdW50XSxcbiAgICAgIH0pO1xuXG4gICAgICBwcm9jZXNzZWQudmVyc2lvbmVkSW5zdHJ1Y3Rpb25zLnNob3VsZC5oYXZlLmxlbmd0aChkYXRhLnZlcnNpb25lZEluc3RydWN0aW9ucy5sZW5ndGggKyAxKTtcbiAgICAgIGNvbnN0IHJlbWFwcGVkSW5zdHJ1Y3Rpb25zID0gcHJvY2Vzc2VkLnZlcnNpb25lZEluc3RydWN0aW9ucy5zbGljZSgxKTtcbiAgICAgIHJlbWFwcGVkSW5zdHJ1Y3Rpb25zLmZvckVhY2goKGluc3RydWN0aW9uLCBpeEluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IG9yaWdpbmFsID0gZGF0YS52ZXJzaW9uZWRJbnN0cnVjdGlvbnNbaXhJbmRleF07XG4gICAgICAgIGJlZm9yZS5nZXQob3JpZ2luYWwucHJvZ3JhbUlkSW5kZXgpIS50b0Jhc2U1OCgpLnNob3VsZC5lcXVhbChhZnRlci5nZXQoaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkSW5kZXgpIS50b0Jhc2U1OCgpKTtcbiAgICAgICAgaW5zdHJ1Y3Rpb24uYWNjb3VudEtleUluZGV4ZXMuc2hvdWxkLmhhdmUubGVuZ3RoKG9yaWdpbmFsLmFjY291bnRLZXlJbmRleGVzLmxlbmd0aCk7XG4gICAgICAgIG9yaWdpbmFsLmFjY291bnRLZXlJbmRleGVzLmZvckVhY2goKF8sIGspID0+IHtcbiAgICAgICAgICBiZWZvcmVcbiAgICAgICAgICAgIC5nZXQob3JpZ2luYWwuYWNjb3VudEtleUluZGV4ZXNba10pIVxuICAgICAgICAgICAgLnRvQmFzZTU4KClcbiAgICAgICAgICAgIC5zaG91bGQuZXF1YWwoYWZ0ZXIuZ2V0KGluc3RydWN0aW9uLmFjY291bnRLZXlJbmRleGVzW2tdKSEudG9CYXNlNTgoKSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpbnN0cnVjdGlvbi5kYXRhLnNob3VsZC5lcXVhbChvcmlnaW5hbC5kYXRhKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2tlZXBzIEp1cGl0ZXIgbG9va3VwLXRhYmxlIGFjY291bnRzIHBvaW50aW5nIGF0IHRoZSBzYW1lIGFjY291bnRzJywgKCkgPT4ge1xuICAgICAgY29uc3QgZGF0YSA9IGV4dHJhY3RWZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEodGVzdERhdGEuSlVQSVRFUl9WRVJTSU9ORURfVFhfQllURVMpO1xuICAgICAgY29uc3QgcHJvY2Vzc2VkID0gaW5qZWN0Tm9uY2VBZHZhbmNlKGRhdGEpO1xuXG4gICAgICAvLyBhdXRob3JpdHksIG5vbmNlIGFjY291bnQgYW5kIHN5c3ZhciBhcmUgYWRkZWQ7IHRoZSBzeXN0ZW0gcHJvZ3JhbSBpcyBhbHJlYWR5IHByZXNlbnRcbiAgICAgIGNvbnN0IHNoaWZ0ID0gcHJvY2Vzc2VkLnN0YXRpY0FjY291bnRLZXlzLmxlbmd0aCAtIGRhdGEuc3RhdGljQWNjb3VudEtleXMubGVuZ3RoO1xuICAgICAgc2hpZnQuc2hvdWxkLmVxdWFsKDMpO1xuICAgICAgcHJvY2Vzc2VkLm1lc3NhZ2VIZWFkZXIuc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIG51bVJlcXVpcmVkU2lnbmF0dXJlczogMixcbiAgICAgICAgbnVtUmVhZG9ubHlTaWduZWRBY2NvdW50czogMSxcbiAgICAgICAgbnVtUmVhZG9ubHlVbnNpZ25lZEFjY291bnRzOiA2LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IG9sZFN0YXRpY0xlbiA9IGRhdGEuc3RhdGljQWNjb3VudEtleXMubGVuZ3RoO1xuICAgICAgY29uc3QgcmVtYXBwZWRJbnN0cnVjdGlvbnMgPSBwcm9jZXNzZWQudmVyc2lvbmVkSW5zdHJ1Y3Rpb25zLnNsaWNlKDEpO1xuICAgICAgcmVtYXBwZWRJbnN0cnVjdGlvbnMuZm9yRWFjaCgoaW5zdHJ1Y3Rpb24sIGl4SW5kZXgpID0+IHtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWwgPSBkYXRhLnZlcnNpb25lZEluc3RydWN0aW9uc1tpeEluZGV4XTtcbiAgICAgICAgY29uc3QgcmVtYXBwZWRQcm9ncmFtSW5kZXggPSBpbnN0cnVjdGlvbi5wcm9ncmFtSWRJbmRleDtcbiAgICAgICAgaWYgKG9yaWdpbmFsLnByb2dyYW1JZEluZGV4IDwgb2xkU3RhdGljTGVuKSB7XG4gICAgICAgICAgcHJvY2Vzc2VkLnN0YXRpY0FjY291bnRLZXlzW3JlbWFwcGVkUHJvZ3JhbUluZGV4XS5zaG91bGQuZXF1YWwoXG4gICAgICAgICAgICBkYXRhLnN0YXRpY0FjY291bnRLZXlzW29yaWdpbmFsLnByb2dyYW1JZEluZGV4XVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVtYXBwZWRQcm9ncmFtSW5kZXguc2hvdWxkLmVxdWFsKG9yaWdpbmFsLnByb2dyYW1JZEluZGV4ICsgc2hpZnQpO1xuICAgICAgICB9XG4gICAgICAgIG9yaWdpbmFsLmFjY291bnRLZXlJbmRleGVzLmZvckVhY2goKG9sZEluZGV4LCBrKSA9PiB7XG4gICAgICAgICAgY29uc3QgbmV3SW5kZXggPSBpbnN0cnVjdGlvbi5hY2NvdW50S2V5SW5kZXhlc1trXTtcbiAgICAgICAgICBpZiAob2xkSW5kZXggPCBvbGRTdGF0aWNMZW4pIHtcbiAgICAgICAgICAgIHByb2Nlc3NlZC5zdGF0aWNBY2NvdW50S2V5c1tuZXdJbmRleF0uc2hvdWxkLmVxdWFsKGRhdGEuc3RhdGljQWNjb3VudEtleXNbb2xkSW5kZXhdKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmV3SW5kZXguc2hvdWxkLmVxdWFsKG9sZEluZGV4ICsgc2hpZnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdtYWtlcyB0aGUgbm9uY2UgYWNjb3VudCB3cml0YWJsZSBhbmQga2VlcHMgb3JpZ2luYWwgcmVhZC1vbmx5IGFjY291bnRzIHJlYWQtb25seScsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgZGF0YSB9ID0gbWFpbkZpeHR1cmUoKTtcbiAgICAgIGNvbnN0IHByb2Nlc3NlZCA9IGluamVjdE5vbmNlQWR2YW5jZShkYXRhKTtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjb21waWxlUHJvY2Vzc2VkTWVzc2FnZShwcm9jZXNzZWQpO1xuXG4gICAgICAvLyBoZWFkZXIgYWRqdXN0ZWQgZm9yIHRoZSBuZXcgYXV0aG9yaXR5LCBub25jZSBhY2NvdW50LCBzeXN2YXIgYW5kIHN5c3RlbSBwcm9ncmFtXG4gICAgICBwcm9jZXNzZWQubWVzc2FnZUhlYWRlci5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgbnVtUmVxdWlyZWRTaWduYXR1cmVzOiAzLCAvLyBwYXllciArIHJvIHNpZ25lciArIG5ldyBhdXRob3JpdHlcbiAgICAgICAgbnVtUmVhZG9ubHlTaWduZWRBY2NvdW50czogMiwgLy8gcm8gc2lnbmVyICsgbmV3IGF1dGhvcml0eVxuICAgICAgICBudW1SZWFkb25seVVuc2lnbmVkQWNjb3VudHM6IDQsIC8vIHJvIG5vbi1zaWduZXIsIHByb2dyYW0sIHN5c3RlbSBwcm9ncmFtLCBzeXN2YXJcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBpbmRleE9mID0gKGtleTogc3RyaW5nKSA9PiBwcm9jZXNzZWQuc3RhdGljQWNjb3VudEtleXMuaW5kZXhPZihrZXkpO1xuXG4gICAgICAvLyBBZHZhbmNlTm9uY2VBY2NvdW50IHJlcXVpcmVzIGEgd3JpdGFibGUgbm9uY2UgYWNjb3VudFxuICAgICAgbWVzc2FnZS5pc0FjY291bnRXcml0YWJsZShpbmRleE9mKHdhbGxldE5vbmNlQWRkcmVzcykpLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICAgIC8vIG9yaWdpbmFsIGFjY291bnRzIGtlZXAgdGhlaXIgd3JpdGFiaWxpdHlcbiAgICAgIG1lc3NhZ2UuaXNBY2NvdW50V3JpdGFibGUoaW5kZXhPZihmaXh0dXJlUGF5ZXIudG9CYXNlNTgoKSkpLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICAgIG1lc3NhZ2UuaXNBY2NvdW50V3JpdGFibGUoaW5kZXhPZihmaXh0dXJlV3JpdGFibGVOb25TaWduZXIudG9CYXNlNTgoKSkpLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICAgIG1lc3NhZ2UuaXNBY2NvdW50V3JpdGFibGUoaW5kZXhPZihmaXh0dXJlUm9TaWduZXIudG9CYXNlNTgoKSkpLnNob3VsZC5lcXVhbChmYWxzZSk7XG4gICAgICBtZXNzYWdlLmlzQWNjb3VudFdyaXRhYmxlKGluZGV4T2YoZml4dHVyZVJvTm9uU2lnbmVyLnRvQmFzZTU4KCkpKS5zaG91bGQuZXF1YWwoZmFsc2UpO1xuICAgICAgbWVzc2FnZS5pc0FjY291bnRXcml0YWJsZShpbmRleE9mKGZpeHR1cmVQcm9ncmFtLnRvQmFzZTU4KCkpKS5zaG91bGQuZXF1YWwoZmFsc2UpO1xuICAgICAgLy8gdGhlIG5ldyBhdXRob3JpdHkgaXMgYSByZWFkLW9ubHkgc2lnbmVyXG4gICAgICBtZXNzYWdlLmlzQWNjb3VudFNpZ25lcihpbmRleE9mKGF1dGhXYWxsZXRBZGRyZXNzKSkuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgICAgbWVzc2FnZS5pc0FjY291bnRXcml0YWJsZShpbmRleE9mKGF1dGhXYWxsZXRBZGRyZXNzKSkuc2hvdWxkLmVxdWFsKGZhbHNlKTtcbiAgICAgIC8vIG5vIGR1cGxpY2F0ZSBrZXlzXG4gICAgICBuZXcgU2V0KHByb2Nlc3NlZC5zdGF0aWNBY2NvdW50S2V5cykuc2l6ZS5zaG91bGQuZXF1YWwocHJvY2Vzc2VkLnN0YXRpY0FjY291bnRLZXlzLmxlbmd0aCk7XG4gICAgfSk7XG5cbiAgICBpdCgncHJlcGVuZHMgYSB3ZWxsLWZvcm1lZCBBZHZhbmNlTm9uY2VBY2NvdW50IGluc3RydWN0aW9uJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBkYXRhIH0gPSBtYWluRml4dHVyZSgpO1xuICAgICAgY29uc3QgcHJvY2Vzc2VkID0gaW5qZWN0Tm9uY2VBZHZhbmNlKGRhdGEpO1xuXG4gICAgICBjb25zdCBbbm9uY2VBZHZhbmNlXSA9IHByb2Nlc3NlZC52ZXJzaW9uZWRJbnN0cnVjdGlvbnM7XG4gICAgICBzaG91bGQuZXhpc3Qobm9uY2VBZHZhbmNlKTtcbiAgICAgIG5vbmNlQWR2YW5jZS5kYXRhLnNob3VsZC5lcXVhbCgnNnZ4OFAnKTsgLy8gU3lzdGVtUHJvZ3JhbSBBZHZhbmNlTm9uY2VBY2NvdW50XG4gICAgICBub25jZUFkdmFuY2UucHJvZ3JhbUlkSW5kZXguc2hvdWxkLmVxdWFsKHByb2Nlc3NlZC5zdGF0aWNBY2NvdW50S2V5cy5pbmRleE9mKFNZU1RFTV9QUk9HUkFNX0lEKSk7XG4gICAgICBub25jZUFkdmFuY2UuYWNjb3VudEtleUluZGV4ZXMuc2hvdWxkLmRlZXBFcXVhbChbXG4gICAgICAgIHByb2Nlc3NlZC5zdGF0aWNBY2NvdW50S2V5cy5pbmRleE9mKHdhbGxldE5vbmNlQWRkcmVzcyksXG4gICAgICAgIHByb2Nlc3NlZC5zdGF0aWNBY2NvdW50S2V5cy5pbmRleE9mKFNZU1ZBUl9SRUNFTlRfQkxPQ0tIQVNIRVNfSUQpLFxuICAgICAgICBwcm9jZXNzZWQuc3RhdGljQWNjb3VudEtleXMuaW5kZXhPZihhdXRoV2FsbGV0QWRkcmVzcyksXG4gICAgICBdKTtcbiAgICB9KTtcblxuICAgIGl0KCd0dXJucyBhbiBhdXRob3JpdHkgYWxyZWFkeSBwcmVzZW50IGFzIGEgd3JpdGFibGUgbm9uLXNpZ25lciBpbnRvIGEgd3JpdGFibGUgc2lnbmVyLCBvbmNlJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBkYXRhIH0gPSBidWlsZFZlcnNpb25lZEZpeHR1cmUoZml4dHVyZVBheWVyLCBbXG4gICAgICAgIHtcbiAgICAgICAgICBwcm9ncmFtSWQ6IGZpeHR1cmVQcm9ncmFtLFxuICAgICAgICAgIGtleXM6IFtcbiAgICAgICAgICAgIHsgcHVia2V5OiBmaXh0dXJlUGF5ZXIsIGlzU2lnbmVyOiB0cnVlLCBpc1dyaXRhYmxlOiB0cnVlIH0sXG4gICAgICAgICAgICAvLyBhdXRob3JpdHkgYWxyZWFkeSBwcmVzZW50IGFzIGEgd3JpdGFibGUgbm9uLXNpZ25lclxuICAgICAgICAgICAgeyBwdWJrZXk6IG5ldyBQdWJsaWNLZXkoYXV0aFdhbGxldEFkZHJlc3MpLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSxcbiAgICAgICAgICAgIHsgcHVia2V5OiBmaXh0dXJlUm9Ob25TaWduZXIsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogZmFsc2UgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgXSk7XG4gICAgICBjb25zdCBwcm9jZXNzZWQgPSBpbmplY3ROb25jZUFkdmFuY2UoZGF0YSk7XG4gICAgICBjb25zdCBtZXNzYWdlID0gY29tcGlsZVByb2Nlc3NlZE1lc3NhZ2UocHJvY2Vzc2VkKTtcblxuICAgICAgLy8gYXBwZWFycyBvbmNlLCBhcyBhIHNpZ25lciwga2VlcGluZyBpdHMgd3JpdGFiaWxpdHlcbiAgICAgIHByb2Nlc3NlZC5zdGF0aWNBY2NvdW50S2V5cy5maWx0ZXIoKGtleSkgPT4ga2V5ID09PSBhdXRoV2FsbGV0QWRkcmVzcykuc2hvdWxkLmhhdmUubGVuZ3RoKDEpO1xuICAgICAgY29uc3QgYXV0aEluZGV4ID0gcHJvY2Vzc2VkLnN0YXRpY0FjY291bnRLZXlzLmluZGV4T2YoYXV0aFdhbGxldEFkZHJlc3MpO1xuICAgICAgbWVzc2FnZS5pc0FjY291bnRTaWduZXIoYXV0aEluZGV4KS5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgICBtZXNzYWdlLmlzQWNjb3VudFdyaXRhYmxlKGF1dGhJbmRleCkuc2hvdWxkLmVxdWFsKHRydWUpO1xuXG4gICAgICBwcm9jZXNzZWQubWVzc2FnZUhlYWRlci5udW1SZXF1aXJlZFNpZ25hdHVyZXMuc2hvdWxkLmVxdWFsKGRhdGEubWVzc2FnZUhlYWRlci5udW1SZXF1aXJlZFNpZ25hdHVyZXMgKyAxKTtcbiAgICAgIHByb2Nlc3NlZC5tZXNzYWdlSGVhZGVyLm51bVJlYWRvbmx5U2lnbmVkQWNjb3VudHMuc2hvdWxkLmVxdWFsKGRhdGEubWVzc2FnZUhlYWRlci5udW1SZWFkb25seVNpZ25lZEFjY291bnRzKTtcbiAgICB9KTtcblxuICAgIGl0KCd0dXJucyBhbiBhdXRob3JpdHkgYWxyZWFkeSBwcmVzZW50IGFzIGEgcmVhZC1vbmx5IG5vbi1zaWduZXIgaW50byBhIHJlYWQtb25seSBzaWduZXIsIG9uY2UnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGRhdGEgfSA9IGJ1aWxkVmVyc2lvbmVkRml4dHVyZShmaXh0dXJlUGF5ZXIsIFtcbiAgICAgICAge1xuICAgICAgICAgIHByb2dyYW1JZDogZml4dHVyZVByb2dyYW0sXG4gICAgICAgICAga2V5czogW1xuICAgICAgICAgICAgeyBwdWJrZXk6IGZpeHR1cmVQYXllciwgaXNTaWduZXI6IHRydWUsIGlzV3JpdGFibGU6IHRydWUgfSxcbiAgICAgICAgICAgIC8vIGF1dGhvcml0eSBhbHJlYWR5IHByZXNlbnQgYXMgYSByZWFkLW9ubHkgbm9uLXNpZ25lclxuICAgICAgICAgICAgeyBwdWJrZXk6IG5ldyBQdWJsaWNLZXkoYXV0aFdhbGxldEFkZHJlc3MpLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IGZhbHNlIH0sXG4gICAgICAgICAgICB7IHB1YmtleTogZml4dHVyZVdyaXRhYmxlTm9uU2lnbmVyLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgXSk7XG4gICAgICBjb25zdCBwcm9jZXNzZWQgPSBpbmplY3ROb25jZUFkdmFuY2UoZGF0YSk7XG4gICAgICBjb25zdCBtZXNzYWdlID0gY29tcGlsZVByb2Nlc3NlZE1lc3NhZ2UocHJvY2Vzc2VkKTtcblxuICAgICAgLy8gYXBwZWFycyBvbmNlLCBhcyBhIHJlYWQtb25seSBzaWduZXJcbiAgICAgIHByb2Nlc3NlZC5zdGF0aWNBY2NvdW50S2V5cy5maWx0ZXIoKGtleSkgPT4ga2V5ID09PSBhdXRoV2FsbGV0QWRkcmVzcykuc2hvdWxkLmhhdmUubGVuZ3RoKDEpO1xuICAgICAgY29uc3QgYXV0aEluZGV4ID0gcHJvY2Vzc2VkLnN0YXRpY0FjY291bnRLZXlzLmluZGV4T2YoYXV0aFdhbGxldEFkZHJlc3MpO1xuICAgICAgbWVzc2FnZS5pc0FjY291bnRTaWduZXIoYXV0aEluZGV4KS5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgICBtZXNzYWdlLmlzQWNjb3VudFdyaXRhYmxlKGF1dGhJbmRleCkuc2hvdWxkLmVxdWFsKGZhbHNlKTtcblxuICAgICAgcHJvY2Vzc2VkLm1lc3NhZ2VIZWFkZXIubnVtUmVxdWlyZWRTaWduYXR1cmVzLnNob3VsZC5lcXVhbChkYXRhLm1lc3NhZ2VIZWFkZXIubnVtUmVxdWlyZWRTaWduYXR1cmVzICsgMSk7XG4gICAgICBwcm9jZXNzZWQubWVzc2FnZUhlYWRlci5udW1SZWFkb25seVNpZ25lZEFjY291bnRzLnNob3VsZC5lcXVhbChkYXRhLm1lc3NhZ2VIZWFkZXIubnVtUmVhZG9ubHlTaWduZWRBY2NvdW50cyArIDEpO1xuICAgICAgLy8gaXQgbGVmdCB0aGUgcmVhZC1vbmx5IG5vbi1zaWduZXJzIChzeXN0ZW0gcHJvZ3JhbSArIHN5c3ZhciBhcmUgYWRkZWQpXG4gICAgICBwcm9jZXNzZWQubWVzc2FnZUhlYWRlci5udW1SZWFkb25seVVuc2lnbmVkQWNjb3VudHMuc2hvdWxkLmVxdWFsKFxuICAgICAgICBkYXRhLm1lc3NhZ2VIZWFkZXIubnVtUmVhZG9ubHlVbnNpZ25lZEFjY291bnRzICsgMVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdkb2VzIG5vdCBhZGQgYSBzaWduZXIgd2hlbiB0aGUgbm9uY2UgYXV0aG9yaXR5IGlzIGFscmVhZHkgdGhlIGZlZSBwYXllcicsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgZGF0YSB9ID0gYnVpbGRWZXJzaW9uZWRGaXh0dXJlKG5ldyBQdWJsaWNLZXkoYXV0aFdhbGxldEFkZHJlc3MpLCBbXG4gICAgICAgIHtcbiAgICAgICAgICBwcm9ncmFtSWQ6IGZpeHR1cmVQcm9ncmFtLFxuICAgICAgICAgIGtleXM6IFtcbiAgICAgICAgICAgIHsgcHVia2V5OiBuZXcgUHVibGljS2V5KGF1dGhXYWxsZXRBZGRyZXNzKSwgaXNTaWduZXI6IHRydWUsIGlzV3JpdGFibGU6IHRydWUgfSxcbiAgICAgICAgICAgIHsgcHVia2V5OiBmaXh0dXJlV3JpdGFibGVOb25TaWduZXIsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICBdKTtcbiAgICAgIGNvbnN0IHByb2Nlc3NlZCA9IGluamVjdE5vbmNlQWR2YW5jZShkYXRhKTtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjb21waWxlUHJvY2Vzc2VkTWVzc2FnZShwcm9jZXNzZWQpO1xuXG4gICAgICBwcm9jZXNzZWQuc3RhdGljQWNjb3VudEtleXNbMF0uc2hvdWxkLmVxdWFsKGF1dGhXYWxsZXRBZGRyZXNzKTtcbiAgICAgIHByb2Nlc3NlZC5zdGF0aWNBY2NvdW50S2V5cy5maWx0ZXIoKGtleSkgPT4ga2V5ID09PSBhdXRoV2FsbGV0QWRkcmVzcykuc2hvdWxkLmhhdmUubGVuZ3RoKDEpO1xuICAgICAgcHJvY2Vzc2VkLm1lc3NhZ2VIZWFkZXIubnVtUmVxdWlyZWRTaWduYXR1cmVzLnNob3VsZC5lcXVhbChkYXRhLm1lc3NhZ2VIZWFkZXIubnVtUmVxdWlyZWRTaWduYXR1cmVzKTtcbiAgICAgIHByb2Nlc3NlZC5tZXNzYWdlSGVhZGVyLm51bVJlYWRvbmx5U2lnbmVkQWNjb3VudHMuc2hvdWxkLmVxdWFsKGRhdGEubWVzc2FnZUhlYWRlci5udW1SZWFkb25seVNpZ25lZEFjY291bnRzKTtcbiAgICAgIG1lc3NhZ2UuaXNBY2NvdW50U2lnbmVyKDApLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdtb3ZlcyBhIG5vbmNlIGFjY291bnQgYWxyZWFkeSBwcmVzZW50IGFzIHJlYWQtb25seSBpbnRvIHRoZSB3cml0YWJsZSBub24tc2lnbmVycycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgZGF0YSB9ID0gYnVpbGRWZXJzaW9uZWRGaXh0dXJlKGZpeHR1cmVQYXllciwgW1xuICAgICAgICB7XG4gICAgICAgICAgcHJvZ3JhbUlkOiBmaXh0dXJlUHJvZ3JhbSxcbiAgICAgICAgICBrZXlzOiBbXG4gICAgICAgICAgICB7IHB1YmtleTogZml4dHVyZVBheWVyLCBpc1NpZ25lcjogdHJ1ZSwgaXNXcml0YWJsZTogdHJ1ZSB9LFxuICAgICAgICAgICAgeyBwdWJrZXk6IGZpeHR1cmVSb05vblNpZ25lciwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiBmYWxzZSB9LFxuICAgICAgICAgICAgLy8gbm9uY2UgYWNjb3VudCBhbHJlYWR5IHByZXNlbnQgYXMgYSByZWFkLW9ubHkgbm9uLXNpZ25lclxuICAgICAgICAgICAgeyBwdWJrZXk6IG5ldyBQdWJsaWNLZXkod2FsbGV0Tm9uY2VBZGRyZXNzKSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiBmYWxzZSB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICBdKTtcbiAgICAgIGNvbnN0IHByb2Nlc3NlZCA9IGluamVjdE5vbmNlQWR2YW5jZShkYXRhKTtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjb21waWxlUHJvY2Vzc2VkTWVzc2FnZShwcm9jZXNzZWQpO1xuXG4gICAgICBwcm9jZXNzZWQuc3RhdGljQWNjb3VudEtleXMuZmlsdGVyKChrZXkpID0+IGtleSA9PT0gd2FsbGV0Tm9uY2VBZGRyZXNzKS5zaG91bGQuaGF2ZS5sZW5ndGgoMSk7XG4gICAgICBjb25zdCBub25jZUluZGV4ID0gcHJvY2Vzc2VkLnN0YXRpY0FjY291bnRLZXlzLmluZGV4T2Yod2FsbGV0Tm9uY2VBZGRyZXNzKTtcbiAgICAgIG1lc3NhZ2UuaXNBY2NvdW50V3JpdGFibGUobm9uY2VJbmRleCkuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgICAgbWVzc2FnZS5pc0FjY291bnRTaWduZXIobm9uY2VJbmRleCkuc2hvdWxkLmVxdWFsKGZhbHNlKTtcbiAgICAgIC8vIHRoZSBvdGhlciBvcmlnaW5hbCByZWFkLW9ubHkgYWNjb3VudCBzdGF5cyByZWFkLW9ubHlcbiAgICAgIG1lc3NhZ2UuaXNBY2NvdW50V3JpdGFibGUocHJvY2Vzc2VkLnN0YXRpY0FjY291bnRLZXlzLmluZGV4T2YoZml4dHVyZVJvTm9uU2lnbmVyLnRvQmFzZTU4KCkpKS5zaG91bGQuZXF1YWwoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Byb2R1Y2VzIGEgc2lnbmFibGUgcGF5bG9hZCB0aGF0IGRlc2VyaWFsaXplcyBhcyBhIE1lc3NhZ2VWMCB3aXRoIHRoZSBub25jZSBhZHZhbmNlIGZpcnN0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgeyBkYXRhIH0gPSBtYWluRml4dHVyZSgpO1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRDdXN0b21JbnN0cnVjdGlvbkJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci5ub25jZShyZWNlbnRCbG9ja0hhc2gsIHsgd2FsbGV0Tm9uY2VBZGRyZXNzLCBhdXRoV2FsbGV0QWRkcmVzcyB9KTtcbiAgICAgIHR4QnVpbGRlci5mcm9tVmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhKGRhdGEpO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgbWVzc2FnZSA9IE1lc3NhZ2VWMC5kZXNlcmlhbGl6ZSh0eC5zaWduYWJsZVBheWxvYWQpO1xuXG4gICAgICBtZXNzYWdlLmNvbXBpbGVkSW5zdHJ1Y3Rpb25zLnNob3VsZC5oYXZlLmxlbmd0aChkYXRhLnZlcnNpb25lZEluc3RydWN0aW9ucy5sZW5ndGggKyAxKTtcbiAgICAgIGNvbnN0IG5vbmNlQWR2YW5jZSA9IG1lc3NhZ2UuY29tcGlsZWRJbnN0cnVjdGlvbnNbMF07XG4gICAgICBtZXNzYWdlLnN0YXRpY0FjY291bnRLZXlzW25vbmNlQWR2YW5jZS5wcm9ncmFtSWRJbmRleF0udG9CYXNlNTgoKS5zaG91bGQuZXF1YWwoU1lTVEVNX1BST0dSQU1fSUQpO1xuICAgICAgbWVzc2FnZS5zdGF0aWNBY2NvdW50S2V5c1tub25jZUFkdmFuY2UuYWNjb3VudEtleUluZGV4ZXNbMF1dLnRvQmFzZTU4KCkuc2hvdWxkLmVxdWFsKHdhbGxldE5vbmNlQWRkcmVzcyk7XG4gICAgICBtZXNzYWdlLnN0YXRpY0FjY291bnRLZXlzW25vbmNlQWR2YW5jZS5hY2NvdW50S2V5SW5kZXhlc1sxXV1cbiAgICAgICAgLnRvQmFzZTU4KClcbiAgICAgICAgLnNob3VsZC5lcXVhbChTWVNWQVJfUkVDRU5UX0JMT0NLSEFTSEVTX0lEKTtcbiAgICAgIG1lc3NhZ2Uuc3RhdGljQWNjb3VudEtleXNbbm9uY2VBZHZhbmNlLmFjY291bnRLZXlJbmRleGVzWzJdXS50b0Jhc2U1OCgpLnNob3VsZC5lcXVhbChhdXRoV2FsbGV0QWRkcmVzcyk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVqZWN0cyB2ZXJzaW9uZWQgZGF0YSB3aG9zZSBtZXNzYWdlIGhlYWRlciBpcyBpbmNvbnNpc3RlbnQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGRhdGEgfSA9IG1haW5GaXh0dXJlKCk7XG4gICAgICBjb25zdCBpbmNvbnNpc3RlbnQgPSB7XG4gICAgICAgIC4uLmRhdGEsXG4gICAgICAgIG1lc3NhZ2VIZWFkZXI6IHsgLi4uZGF0YS5tZXNzYWdlSGVhZGVyLCBudW1SZWFkb25seVVuc2lnbmVkQWNjb3VudHM6IDk5IH0sXG4gICAgICB9O1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRDdXN0b21JbnN0cnVjdGlvbkJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci5ub25jZShyZWNlbnRCbG9ja0hhc2gsIHsgd2FsbGV0Tm9uY2VBZGRyZXNzLCBhdXRoV2FsbGV0QWRkcmVzcyB9KTtcbiAgICAgIHNob3VsZCgoKSA9PiB0eEJ1aWxkZXIuZnJvbVZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YShpbmNvbnNpc3RlbnQpKS50aHJvd0Vycm9yKC9JbnZhbGlkIG1lc3NhZ2UgaGVhZGVyLyk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
|