@bitgo/sdk-coin-flrp 1.9.0 → 1.9.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -231,5 +231,776 @@ describe('Flrp PermissionlessDelegatorTxBuilder', () => {
231
231
  tx.outputs.length.should.be.above(0);
232
232
  });
233
233
  });
234
+ describe('build with UTXOs (comprehensive tests)', () => {
235
+ const mockFeeState = { capacity: 100000n, excess: 0n, price: 1000n, timestamp: '1234567890' };
236
+ const MIN_DELEGATION_DURATION = 14 * 24 * 60 * 60; // 14 days (1209600 seconds)
237
+ const MIN_DELEGATION_AMOUNT = BigInt(50000 * 1e9); // 50000 FLR in nanoFLR
238
+ function createTestUtxos(addresses, threshold, amount = '60000000000000') {
239
+ return [
240
+ {
241
+ outputID: 7,
242
+ txid: '2NWd9hrSGkWJWyTu4DnSM1qQSUT2DVm8uqwFk4wQRFLAmcsHQz',
243
+ outputidx: '0',
244
+ assetID: account_1.CONTEXT.avaxAssetID,
245
+ amount,
246
+ threshold,
247
+ addresses,
248
+ locktime: '0',
249
+ },
250
+ ];
251
+ }
252
+ it('should build delegation transaction with threshold=2 and 3 addresses (BitGo 2-of-3 multisig)', async () => {
253
+ const builder = factory.getDelegatorBuilder();
254
+ const now = Math.floor(Date.now() / 1000);
255
+ const validNodeID = 'NodeID-AK7sPBsZM9rQwse23aLhEEBPHZD5gkLrL';
256
+ const addresses = [account_1.SEED_ACCOUNT.addressTestnet, account_1.ACCOUNT_1.addressTestnet, account_1.ACCOUNT_3.address];
257
+ const utxos = createTestUtxos(addresses, 2);
258
+ const tx = await builder
259
+ .nodeID(validNodeID)
260
+ .startTime(now + 60)
261
+ .endTime(now + MIN_DELEGATION_DURATION)
262
+ .stakeAmount(MIN_DELEGATION_AMOUNT)
263
+ .fromPubKey(addresses)
264
+ .decodedUtxos(utxos)
265
+ .feeState(mockFeeState)
266
+ .context(account_1.CONTEXT)
267
+ .build();
268
+ tx.should.be.instanceof(lib_1.Transaction);
269
+ tx.type.should.equal(sdk_core_1.TransactionType.AddPermissionlessDelegator);
270
+ });
271
+ it('should build delegation transaction with threshold=2 and 2 addresses', async () => {
272
+ const builder = factory.getDelegatorBuilder();
273
+ const now = Math.floor(Date.now() / 1000);
274
+ const validNodeID = 'NodeID-AK7sPBsZM9rQwse23aLhEEBPHZD5gkLrL';
275
+ const addresses = [account_1.SEED_ACCOUNT.addressTestnet, account_1.ACCOUNT_1.addressTestnet];
276
+ const utxos = createTestUtxos(addresses, 2);
277
+ const tx = await builder
278
+ .nodeID(validNodeID)
279
+ .startTime(now + 60)
280
+ .endTime(now + MIN_DELEGATION_DURATION)
281
+ .stakeAmount(MIN_DELEGATION_AMOUNT)
282
+ .fromPubKey(addresses)
283
+ .decodedUtxos(utxos)
284
+ .feeState(mockFeeState)
285
+ .context(account_1.CONTEXT)
286
+ .build();
287
+ tx.should.be.instanceof(lib_1.Transaction);
288
+ tx.type.should.equal(sdk_core_1.TransactionType.AddPermissionlessDelegator);
289
+ });
290
+ it('should fail when UTXO amount is insufficient', async () => {
291
+ const builder = factory.getDelegatorBuilder();
292
+ const now = Math.floor(Date.now() / 1000);
293
+ const validNodeID = 'NodeID-AK7sPBsZM9rQwse23aLhEEBPHZD5gkLrL';
294
+ const addresses = [account_1.SEED_ACCOUNT.addressTestnet, account_1.ACCOUNT_1.addressTestnet];
295
+ const utxos = createTestUtxos(addresses, 2, '1000000000000');
296
+ await builder
297
+ .nodeID(validNodeID)
298
+ .startTime(now + 60)
299
+ .endTime(now + MIN_DELEGATION_DURATION)
300
+ .stakeAmount(MIN_DELEGATION_AMOUNT)
301
+ .fromPubKey(addresses)
302
+ .decodedUtxos(utxos)
303
+ .feeState(mockFeeState)
304
+ .context(account_1.CONTEXT)
305
+ .build()
306
+ .should.be.rejected();
307
+ });
308
+ it('should build delegation with multiple UTXOs', async () => {
309
+ const builder = factory.getDelegatorBuilder();
310
+ const now = Math.floor(Date.now() / 1000);
311
+ const validNodeID = 'NodeID-AK7sPBsZM9rQwse23aLhEEBPHZD5gkLrL';
312
+ const addresses = [account_1.SEED_ACCOUNT.addressTestnet, account_1.ACCOUNT_1.addressTestnet, account_1.ACCOUNT_3.address];
313
+ // Create multiple UTXOs with different txids
314
+ const utxos = [
315
+ {
316
+ outputID: 7,
317
+ txid: '2NWd9hrSGkWJWyTu4DnSM1qQSUT2DVm8uqwFk4wQRFLAmcsHQz',
318
+ outputidx: '0',
319
+ assetID: account_1.CONTEXT.avaxAssetID,
320
+ amount: '30000000000000', // 30k FLR
321
+ threshold: 2,
322
+ addresses,
323
+ locktime: '0',
324
+ },
325
+ {
326
+ outputID: 7,
327
+ txid: '2kSSHWKZH7uJ1FfSpgRaPfgPpnT4915QVXPAMw6HjfFQVJ1QFx',
328
+ outputidx: '0',
329
+ assetID: account_1.CONTEXT.avaxAssetID,
330
+ amount: '25000000000000', // 25k FLR
331
+ threshold: 2,
332
+ addresses,
333
+ locktime: '0',
334
+ },
335
+ {
336
+ outputID: 7,
337
+ txid: '2E6Xuqf3i6TnwH6zjt4K6jNDR2ooj1DTJpTFZ6SgZZkRJ4ADSe',
338
+ outputidx: '0',
339
+ assetID: account_1.CONTEXT.avaxAssetID,
340
+ amount: '10000000000000', // 10k FLR
341
+ threshold: 2,
342
+ addresses,
343
+ locktime: '0',
344
+ },
345
+ ];
346
+ // Total: 65k FLR > 50k minimum
347
+ const tx = await builder
348
+ .nodeID(validNodeID)
349
+ .startTime(now + 60)
350
+ .endTime(now + MIN_DELEGATION_DURATION)
351
+ .stakeAmount(MIN_DELEGATION_AMOUNT)
352
+ .fromPubKey(addresses)
353
+ .decodedUtxos(utxos)
354
+ .feeState(mockFeeState)
355
+ .context(account_1.CONTEXT)
356
+ .build();
357
+ tx.should.be.instanceof(lib_1.Transaction);
358
+ tx.type.should.equal(sdk_core_1.TransactionType.AddPermissionlessDelegator);
359
+ // FlareJS optimizes to use minimum UTXOs needed, may not consume all 3
360
+ tx.inputs.length.should.be.greaterThan(0);
361
+ });
362
+ /**
363
+ * Verifies fix for FlareJS Bug - Change output threshold
364
+ *
365
+ * FlareJS's pvm.e.newAddPermissionlessDelegatorTx() defaults change outputs to threshold=1.
366
+ * We implement a fix (similar to ExportInPTxBuilder) to correct change outputs to threshold=2
367
+ * for multisig wallets, maintaining security.
368
+ */
369
+ it('should create change output with threshold=2 for multisig wallet (bug fixed)', async () => {
370
+ const builder = factory.getDelegatorBuilder();
371
+ const now = Math.floor(Date.now() / 1000);
372
+ const validNodeID = 'NodeID-AK7sPBsZM9rQwse23aLhEEBPHZD5gkLrL';
373
+ const addresses = [account_1.SEED_ACCOUNT.addressTestnet, account_1.ACCOUNT_1.addressTestnet, account_1.ACCOUNT_3.address];
374
+ const utxos = createTestUtxos(addresses, 2, '60000000000000'); // 60k FLR
375
+ const tx = await builder
376
+ .nodeID(validNodeID)
377
+ .startTime(now + 60)
378
+ .endTime(now + MIN_DELEGATION_DURATION)
379
+ .stakeAmount(MIN_DELEGATION_AMOUNT) // Stake 50k
380
+ .fromPubKey(addresses)
381
+ .decodedUtxos(utxos)
382
+ .feeState(mockFeeState)
383
+ .context(account_1.CONTEXT)
384
+ .build();
385
+ // Verify change exists using explainTransaction
386
+ const explanation = tx.explainTransaction();
387
+ const changeAmount = BigInt(explanation.changeAmount);
388
+ Number(changeAmount).should.be.greaterThan(Number(BigInt('9000000000000')), 'Should have change (at least 9k after fees)');
389
+ explanation.changeOutputs.length.should.be.greaterThan(0, 'Should have change outputs');
390
+ // Verify the fix: change outputs should now have threshold=2
391
+ const flareTransaction = tx._flareTransaction;
392
+ const innerTx = flareTransaction.getTx();
393
+ const changeOutputs = innerTx.baseTx.outputs;
394
+ changeOutputs.forEach((output) => {
395
+ const transferOut = output.output;
396
+ const threshold = transferOut.outputOwners.threshold.value();
397
+ threshold.should.equal(2, 'Change output should have threshold=2 (bug fixed!)');
398
+ });
399
+ });
400
+ it('should have change output addresses matching wallet addresses', async () => {
401
+ const builder = factory.getDelegatorBuilder();
402
+ const now = Math.floor(Date.now() / 1000);
403
+ const validNodeID = 'NodeID-AK7sPBsZM9rQwse23aLhEEBPHZD5gkLrL';
404
+ const addresses = [account_1.SEED_ACCOUNT.addressTestnet, account_1.ACCOUNT_1.addressTestnet, account_1.ACCOUNT_3.address];
405
+ const utxos = createTestUtxos(addresses, 2, '60000000000000');
406
+ const tx = await builder
407
+ .nodeID(validNodeID)
408
+ .startTime(now + 60)
409
+ .endTime(now + MIN_DELEGATION_DURATION)
410
+ .stakeAmount(MIN_DELEGATION_AMOUNT)
411
+ .fromPubKey(addresses)
412
+ .decodedUtxos(utxos)
413
+ .feeState(mockFeeState)
414
+ .context(account_1.CONTEXT)
415
+ .build();
416
+ // Verify change exists and addresses match using explainTransaction
417
+ const explanation = tx.explainTransaction();
418
+ const changeAmount = BigInt(explanation.changeAmount);
419
+ Number(changeAmount).should.be.greaterThan(0, 'Should have change output');
420
+ explanation.changeOutputs.length.should.be.greaterThan(0);
421
+ // Verify change output addresses match wallet addresses (sorted)
422
+ const sortedFromAddresses = tx.fromAddresses.slice().sort().join('~');
423
+ explanation.changeOutputs.forEach((output) => {
424
+ output.address.should.equal(sortedFromAddresses, 'Change output addresses should match wallet addresses');
425
+ });
426
+ });
427
+ });
428
+ describe('multiple delegations to same validator', () => {
429
+ const mockFeeState = { capacity: 100000n, excess: 0n, price: 1000n, timestamp: '1234567890' };
430
+ const MIN_DELEGATION_DURATION = 14 * 24 * 60 * 60;
431
+ const MIN_DELEGATION_AMOUNT = BigInt(50000 * 1e9);
432
+ it('should support creating multiple delegations to same validator with different time periods', async () => {
433
+ const now = Math.floor(Date.now() / 1000);
434
+ const validNodeID = 'NodeID-AK7sPBsZM9rQwse23aLhEEBPHZD5gkLrL';
435
+ const addresses = [account_1.SEED_ACCOUNT.addressTestnet, account_1.ACCOUNT_1.addressTestnet, account_1.ACCOUNT_3.address];
436
+ // First delegation: Jan 1 - Mar 1
437
+ const builder1 = factory.getDelegatorBuilder();
438
+ const utxos1 = [
439
+ {
440
+ outputID: 7,
441
+ txid: '2NWd9hrSGkWJWyTu4DnSM1qQSUT2DVm8uqwFk4wQRFLAmcsHQz',
442
+ outputidx: '0',
443
+ assetID: account_1.CONTEXT.avaxAssetID,
444
+ amount: '100000000000000', // 100k FLR
445
+ threshold: 2,
446
+ addresses,
447
+ locktime: '0',
448
+ },
449
+ ];
450
+ const tx1 = await builder1
451
+ .nodeID(validNodeID)
452
+ .startTime(now + 60)
453
+ .endTime(now + 60 + MIN_DELEGATION_DURATION)
454
+ .stakeAmount(MIN_DELEGATION_AMOUNT) // 50k
455
+ .fromPubKey(addresses)
456
+ .decodedUtxos(utxos1)
457
+ .feeState(mockFeeState)
458
+ .context(account_1.CONTEXT)
459
+ .build();
460
+ tx1.should.be.instanceof(lib_1.Transaction);
461
+ tx1.type.should.equal(sdk_core_1.TransactionType.AddPermissionlessDelegator);
462
+ // Second delegation: Feb 1 - Apr 1 (overlapping period, different start/end)
463
+ // Simulating using a different UTXO (in practice, could be change from first delegation)
464
+ const builder2 = factory.getDelegatorBuilder();
465
+ const utxos2 = [
466
+ {
467
+ outputID: 7,
468
+ txid: '2QttuE1MNRPEvLPdhB8t6WpC91VKfvigHvf1PKrNQ6BGgB6hZw', // Valid CB58 txid
469
+ outputidx: '0',
470
+ assetID: account_1.CONTEXT.avaxAssetID,
471
+ amount: '50010000000000', // 50010 FLR (50k stake + extra for fees)
472
+ threshold: 2,
473
+ addresses,
474
+ locktime: '0',
475
+ },
476
+ ];
477
+ const tx2 = await builder2
478
+ .nodeID(validNodeID) // Same validator!
479
+ .startTime(now + 60 + 30 * 24 * 60 * 60) // 30 days later
480
+ .endTime(now + 60 + 30 * 24 * 60 * 60 + MIN_DELEGATION_DURATION)
481
+ .stakeAmount(MIN_DELEGATION_AMOUNT) // Another 50k
482
+ .fromPubKey(addresses)
483
+ .decodedUtxos(utxos2)
484
+ .feeState(mockFeeState)
485
+ .context(account_1.CONTEXT)
486
+ .build();
487
+ tx2.should.be.instanceof(lib_1.Transaction);
488
+ tx2.type.should.equal(sdk_core_1.TransactionType.AddPermissionlessDelegator);
489
+ // Both transactions should be valid and independent
490
+ tx1.id.should.not.equal(tx2.id);
491
+ });
492
+ it('should support sequential delegations (one ends, next begins)', async () => {
493
+ const now = Math.floor(Date.now() / 1000);
494
+ const validNodeID = 'NodeID-AK7sPBsZM9rQwse23aLhEEBPHZD5gkLrL';
495
+ const addresses = [account_1.SEED_ACCOUNT.addressTestnet, account_1.ACCOUNT_1.addressTestnet, account_1.ACCOUNT_3.address];
496
+ const utxos = [
497
+ {
498
+ outputID: 7,
499
+ txid: '2NWd9hrSGkWJWyTu4DnSM1qQSUT2DVm8uqwFk4wQRFLAmcsHQz',
500
+ outputidx: '0',
501
+ assetID: account_1.CONTEXT.avaxAssetID,
502
+ amount: '100000000000000',
503
+ threshold: 2,
504
+ addresses,
505
+ locktime: '0',
506
+ },
507
+ ];
508
+ // First delegation
509
+ const builder1 = factory.getDelegatorBuilder();
510
+ const delegation1EndTime = now + 60 + MIN_DELEGATION_DURATION;
511
+ const tx1 = await builder1
512
+ .nodeID(validNodeID)
513
+ .startTime(now + 60)
514
+ .endTime(delegation1EndTime)
515
+ .stakeAmount(MIN_DELEGATION_AMOUNT)
516
+ .fromPubKey(addresses)
517
+ .decodedUtxos(utxos)
518
+ .feeState(mockFeeState)
519
+ .context(account_1.CONTEXT)
520
+ .build();
521
+ // Second delegation starts right after first one ends
522
+ const builder2 = factory.getDelegatorBuilder();
523
+ const utxos2 = [
524
+ {
525
+ outputID: 7,
526
+ txid: '2K9rgiEgsEcT3dB9EyduEHFq7g4sHQBMks16VUQArVRieBQ9W5', // Valid CB58 txid
527
+ outputidx: '0',
528
+ assetID: account_1.CONTEXT.avaxAssetID,
529
+ amount: '50010000000000', // 50010 FLR (50k stake + extra for fees)
530
+ threshold: 2,
531
+ addresses,
532
+ locktime: '0',
533
+ },
534
+ ];
535
+ const tx2 = await builder2
536
+ .nodeID(validNodeID)
537
+ .startTime(delegation1EndTime + 1) // Starts 1 second after first ends
538
+ .endTime(delegation1EndTime + 1 + MIN_DELEGATION_DURATION)
539
+ .stakeAmount(MIN_DELEGATION_AMOUNT)
540
+ .fromPubKey(addresses)
541
+ .decodedUtxos(utxos2)
542
+ .feeState(mockFeeState)
543
+ .context(account_1.CONTEXT)
544
+ .build();
545
+ tx1.should.be.instanceof(lib_1.Transaction);
546
+ tx2.should.be.instanceof(lib_1.Transaction);
547
+ tx1.id.should.not.equal(tx2.id);
548
+ });
549
+ });
550
+ describe('signing multisig delegation transactions', () => {
551
+ const mockFeeState = { capacity: 100000n, excess: 0n, price: 1000n, timestamp: '1234567890' };
552
+ const MIN_DELEGATION_DURATION = 14 * 24 * 60 * 60;
553
+ const MIN_DELEGATION_AMOUNT = BigInt(50000 * 1e9);
554
+ it('should successfully sign delegation transaction with threshold=2 multisig wallet', async () => {
555
+ const builder = factory.getDelegatorBuilder();
556
+ const now = Math.floor(Date.now() / 1000);
557
+ const validNodeID = 'NodeID-AK7sPBsZM9rQwse23aLhEEBPHZD5gkLrL';
558
+ const addresses = [account_1.SEED_ACCOUNT.addressTestnet, account_1.ACCOUNT_1.addressTestnet, account_1.ACCOUNT_3.address];
559
+ const utxos = [
560
+ {
561
+ outputID: 7,
562
+ txid: '2NWd9hrSGkWJWyTu4DnSM1qQSUT2DVm8uqwFk4wQRFLAmcsHQz',
563
+ outputidx: '0',
564
+ assetID: account_1.CONTEXT.avaxAssetID,
565
+ amount: '60000000000000', // 60k FLR (will have change)
566
+ threshold: 2,
567
+ addresses,
568
+ locktime: '0',
569
+ },
570
+ ];
571
+ builder
572
+ .nodeID(validNodeID)
573
+ .startTime(now + 60)
574
+ .endTime(now + MIN_DELEGATION_DURATION)
575
+ .stakeAmount(MIN_DELEGATION_AMOUNT)
576
+ .fromPubKey(addresses)
577
+ .decodedUtxos(utxos)
578
+ .feeState(mockFeeState)
579
+ .context(account_1.CONTEXT)
580
+ .sign({ key: account_1.SEED_ACCOUNT.privateKey });
581
+ const tx = await builder.build();
582
+ // Verify transaction is built successfully
583
+ tx.should.be.instanceof(lib_1.Transaction);
584
+ tx.type.should.equal(sdk_core_1.TransactionType.AddPermissionlessDelegator);
585
+ // Verify credentials exist (non-empty)
586
+ const credentials = tx._flareTransaction.credentials;
587
+ credentials.should.not.be.empty();
588
+ credentials.length.should.be.greaterThan(0);
589
+ // Verify at least one signature slot has a signature
590
+ let hasSignature = false;
591
+ for (const credential of credentials) {
592
+ const signatures = credential.getSignatures();
593
+ for (const sig of signatures) {
594
+ if (sig && sig.length > 0 && !sig.startsWith('0x' + '0'.repeat(130))) {
595
+ hasSignature = true;
596
+ break;
597
+ }
598
+ }
599
+ if (hasSignature)
600
+ break;
601
+ }
602
+ hasSignature.should.be.true('Should have at least one signature');
603
+ });
604
+ it('should successfully sign delegation transaction with multiple signers', async () => {
605
+ const builder = factory.getDelegatorBuilder();
606
+ const now = Math.floor(Date.now() / 1000);
607
+ const validNodeID = 'NodeID-AK7sPBsZM9rQwse23aLhEEBPHZD5gkLrL';
608
+ const addresses = [account_1.SEED_ACCOUNT.addressTestnet, account_1.ACCOUNT_1.addressTestnet];
609
+ const utxos = [
610
+ {
611
+ outputID: 7,
612
+ txid: '2NWd9hrSGkWJWyTu4DnSM1qQSUT2DVm8uqwFk4wQRFLAmcsHQz',
613
+ outputidx: '0',
614
+ assetID: account_1.CONTEXT.avaxAssetID,
615
+ amount: '60000000000000',
616
+ threshold: 2,
617
+ addresses,
618
+ locktime: '0',
619
+ },
620
+ ];
621
+ // Sign with both keys for 2-of-2 multisig
622
+ builder
623
+ .nodeID(validNodeID)
624
+ .startTime(now + 60)
625
+ .endTime(now + MIN_DELEGATION_DURATION)
626
+ .stakeAmount(MIN_DELEGATION_AMOUNT)
627
+ .fromPubKey(addresses)
628
+ .decodedUtxos(utxos)
629
+ .feeState(mockFeeState)
630
+ .context(account_1.CONTEXT);
631
+ builder.sign({ key: account_1.SEED_ACCOUNT.privateKey });
632
+ builder.sign({ key: account_1.ACCOUNT_1.privateKey });
633
+ const tx = await builder.build();
634
+ // Verify transaction is built and has multiple signatures
635
+ tx.should.be.instanceof(lib_1.Transaction);
636
+ const credentials = tx._flareTransaction.credentials;
637
+ credentials.should.not.be.empty();
638
+ // Count non-empty signatures
639
+ let signatureCount = 0;
640
+ for (const credential of credentials) {
641
+ const signatures = credential.getSignatures();
642
+ for (const sig of signatures) {
643
+ if (sig && sig.length > 0 && !sig.startsWith('0x' + '0'.repeat(130))) {
644
+ signatureCount++;
645
+ }
646
+ }
647
+ }
648
+ signatureCount.should.be.greaterThanOrEqual(2, 'Should have at least 2 signatures for 2-of-2 multisig');
649
+ });
650
+ });
651
+ describe('half-signing workflow with real transaction data', () => {
652
+ // Import real multisig delegation transaction data from testnet
653
+ const { HALF_SIGN_TEST_ACCOUNTS, MULTISIG_DELEGATION_PARAMS, MULTISIG_DELEGATION_UNSIGNED_TX_HEX, MULTISIG_DELEGATION_HALF_SIGNED_TX_HEX, MULTISIG_DELEGATION_FULLY_SIGNED_TX_HEX, } = require('../../resources/transactionData/multisigDelegationTx');
654
+ it('should parse unsigned multisig delegation transaction from testnet', async () => {
655
+ const rawTx = utils_1.default.removeHexPrefix(MULTISIG_DELEGATION_UNSIGNED_TX_HEX);
656
+ // Verify transaction can be deserialized by FlareJS
657
+ const decodedTxBytes = Buffer.from(rawTx, 'hex');
658
+ decodedTxBytes.should.not.be.empty();
659
+ decodedTxBytes.length.should.be.greaterThan(0);
660
+ });
661
+ it('should build delegation transaction with multisig addresses and verify sorting', async () => {
662
+ const builder = factory.getDelegatorBuilder();
663
+ const addresses = MULTISIG_DELEGATION_PARAMS.multisigAddresses;
664
+ const utxos = [
665
+ {
666
+ outputID: 7,
667
+ txid: '2NWd9hrSGkWJWyTu4DnSM1qQSUT2DVm8uqwFk4wQRFLAmcsHQz',
668
+ outputidx: '0',
669
+ assetID: account_1.CONTEXT.avaxAssetID,
670
+ amount: '60000000000000',
671
+ threshold: 2,
672
+ addresses,
673
+ locktime: '0',
674
+ },
675
+ ];
676
+ builder
677
+ .nodeID(MULTISIG_DELEGATION_PARAMS.nodeID)
678
+ .startTime(MULTISIG_DELEGATION_PARAMS.startTime)
679
+ .endTime(MULTISIG_DELEGATION_PARAMS.endTime)
680
+ .stakeAmount(BigInt(MULTISIG_DELEGATION_PARAMS.stakeAmount))
681
+ .fromPubKey(addresses)
682
+ .decodedUtxos(utxos)
683
+ .feeState({ capacity: 100000n, excess: 0n, price: 1000n, timestamp: '1234567890' })
684
+ .context(account_1.CONTEXT);
685
+ const tx = await builder.build();
686
+ // Verify transaction was built successfully
687
+ tx.should.be.instanceof(lib_1.Transaction);
688
+ tx.type.should.equal(sdk_core_1.TransactionType.AddPermissionlessDelegator);
689
+ // Verify UTXOs are properly handled
690
+ const txUtxos = tx._utxos;
691
+ txUtxos.should.not.be.empty();
692
+ txUtxos[0].should.have.property('addresses');
693
+ });
694
+ it('should successfully parse half-signed transaction', async () => {
695
+ const rawTx = utils_1.default.removeHexPrefix(MULTISIG_DELEGATION_HALF_SIGNED_TX_HEX);
696
+ const tx = (await factory.from(rawTx).build());
697
+ tx.type.should.equal(sdk_core_1.TransactionType.AddPermissionlessDelegator);
698
+ // Verify it has one signature
699
+ const credentials = tx._flareTransaction.credentials;
700
+ credentials.should.not.be.empty();
701
+ let signatureCount = 0;
702
+ for (const credential of credentials) {
703
+ const signatures = credential.getSignatures();
704
+ for (const sig of signatures) {
705
+ const sigHex = sig.toString('hex');
706
+ // Non-empty signature (not all zeros)
707
+ if (sigHex && !sigHex.match(/^0+$/)) {
708
+ signatureCount++;
709
+ }
710
+ }
711
+ }
712
+ signatureCount.should.be.greaterThanOrEqual(1, 'Should have at least 1 signature in half-signed tx');
713
+ });
714
+ it('should successfully parse fully-signed transaction', async () => {
715
+ const rawTx = utils_1.default.removeHexPrefix(MULTISIG_DELEGATION_FULLY_SIGNED_TX_HEX);
716
+ const tx = (await factory.from(rawTx).build());
717
+ tx.type.should.equal(sdk_core_1.TransactionType.AddPermissionlessDelegator);
718
+ // Verify it has two signatures
719
+ const credentials = tx._flareTransaction.credentials;
720
+ credentials.should.not.be.empty();
721
+ let signatureCount = 0;
722
+ for (const credential of credentials) {
723
+ const signatures = credential.getSignatures();
724
+ for (const sig of signatures) {
725
+ const sigHex = sig.toString('hex');
726
+ // Non-empty signature (not all zeros)
727
+ if (sigHex && !sigHex.match(/^0+$/)) {
728
+ signatureCount++;
729
+ }
730
+ }
731
+ }
732
+ signatureCount.should.be.greaterThanOrEqual(2, 'Should have at least 2 signatures in fully-signed tx');
733
+ });
734
+ it('should build, sign with user key, and match half-signed format', async () => {
735
+ const builder = factory.getDelegatorBuilder();
736
+ const addresses = MULTISIG_DELEGATION_PARAMS.multisigAddresses;
737
+ const utxos = [
738
+ {
739
+ outputID: 7,
740
+ txid: '2NWd9hrSGkWJWyTu4DnSM1qQSUT2DVm8uqwFk4wQRFLAmcsHQz',
741
+ outputidx: '0',
742
+ assetID: account_1.CONTEXT.avaxAssetID,
743
+ amount: '60000000000000',
744
+ threshold: 2,
745
+ addresses,
746
+ locktime: '0',
747
+ },
748
+ ];
749
+ builder
750
+ .nodeID(MULTISIG_DELEGATION_PARAMS.nodeID)
751
+ .startTime(MULTISIG_DELEGATION_PARAMS.startTime)
752
+ .endTime(MULTISIG_DELEGATION_PARAMS.endTime)
753
+ .stakeAmount(BigInt(MULTISIG_DELEGATION_PARAMS.stakeAmount))
754
+ .fromPubKey(addresses)
755
+ .decodedUtxos(utxos)
756
+ .feeState({ capacity: 100000n, excess: 0n, price: 1000n, timestamp: '1234567890' })
757
+ .context(account_1.CONTEXT)
758
+ .sign({ key: HALF_SIGN_TEST_ACCOUNTS.user.privateKey });
759
+ const tx = await builder.build();
760
+ tx.type.should.equal(sdk_core_1.TransactionType.AddPermissionlessDelegator);
761
+ // Verify transaction has credentials
762
+ const credentials = tx._flareTransaction.credentials;
763
+ credentials.should.not.be.empty();
764
+ // Count signatures
765
+ let signatureCount = 0;
766
+ for (const credential of credentials) {
767
+ const signatures = credential.getSignatures();
768
+ for (const sig of signatures) {
769
+ const sigHex = sig.toString('hex');
770
+ if (sigHex && !sigHex.match(/^0+$/)) {
771
+ signatureCount++;
772
+ }
773
+ }
774
+ }
775
+ signatureCount.should.be.greaterThanOrEqual(1, 'Should have user signature after signing');
776
+ });
777
+ it('should build and sign with both user and bitgo keys for fully-signed tx', async () => {
778
+ const builder = factory.getDelegatorBuilder();
779
+ const addresses = MULTISIG_DELEGATION_PARAMS.multisigAddresses;
780
+ const utxos = [
781
+ {
782
+ outputID: 7,
783
+ txid: '2NWd9hrSGkWJWyTu4DnSM1qQSUT2DVm8uqwFk4wQRFLAmcsHQz',
784
+ outputidx: '0',
785
+ assetID: account_1.CONTEXT.avaxAssetID,
786
+ amount: '60000000000000',
787
+ threshold: 2,
788
+ addresses,
789
+ locktime: '0',
790
+ },
791
+ ];
792
+ builder
793
+ .nodeID(MULTISIG_DELEGATION_PARAMS.nodeID)
794
+ .startTime(MULTISIG_DELEGATION_PARAMS.startTime)
795
+ .endTime(MULTISIG_DELEGATION_PARAMS.endTime)
796
+ .stakeAmount(BigInt(MULTISIG_DELEGATION_PARAMS.stakeAmount))
797
+ .fromPubKey(addresses)
798
+ .decodedUtxos(utxos)
799
+ .feeState({ capacity: 100000n, excess: 0n, price: 1000n, timestamp: '1234567890' })
800
+ .context(account_1.CONTEXT);
801
+ // Sign with both keys
802
+ builder.sign({ key: HALF_SIGN_TEST_ACCOUNTS.user.privateKey });
803
+ builder.sign({ key: HALF_SIGN_TEST_ACCOUNTS.bitgo.privateKey });
804
+ const tx = await builder.build();
805
+ tx.type.should.equal(sdk_core_1.TransactionType.AddPermissionlessDelegator);
806
+ // Verify transaction has both signatures
807
+ const credentials = tx._flareTransaction.credentials;
808
+ credentials.should.not.be.empty();
809
+ let signatureCount = 0;
810
+ for (const credential of credentials) {
811
+ const signatures = credential.getSignatures();
812
+ for (const sig of signatures) {
813
+ const sigHex = sig.toString('hex');
814
+ if (sigHex && !sigHex.match(/^0+$/)) {
815
+ signatureCount++;
816
+ }
817
+ }
818
+ }
819
+ signatureCount.should.be.greaterThanOrEqual(2, 'Should have both user and bitgo signatures');
820
+ });
821
+ it('should build delegation transaction when addresses need sorting', async () => {
822
+ // Create a scenario with addresses in different order
823
+ const builder = factory.getDelegatorBuilder();
824
+ const now = Math.floor(Date.now() / 1000);
825
+ // Use addresses in a specific order
826
+ const addresses = [account_1.ACCOUNT_3.address, account_1.SEED_ACCOUNT.addressTestnet, account_1.ACCOUNT_1.addressTestnet];
827
+ const utxos = [
828
+ {
829
+ outputID: 7,
830
+ txid: '2NWd9hrSGkWJWyTu4DnSM1qQSUT2DVm8uqwFk4wQRFLAmcsHQz',
831
+ outputidx: '0',
832
+ assetID: account_1.CONTEXT.avaxAssetID,
833
+ amount: '60000000000000',
834
+ threshold: 2,
835
+ addresses,
836
+ locktime: '0',
837
+ },
838
+ ];
839
+ const validNodeID = 'NodeID-AK7sPBsZM9rQwse23aLhEEBPHZD5gkLrL';
840
+ builder
841
+ .nodeID(validNodeID)
842
+ .startTime(now + 60)
843
+ .endTime(now + 14 * 24 * 60 * 60)
844
+ .stakeAmount(BigInt(50000 * 1e9))
845
+ .fromPubKey(addresses)
846
+ .decodedUtxos(utxos)
847
+ .feeState({ capacity: 100000n, excess: 0n, price: 1000n, timestamp: '1234567890' })
848
+ .context(account_1.CONTEXT);
849
+ const tx = await builder.build();
850
+ // Verify transaction builds successfully with sorted addresses
851
+ tx.should.be.instanceof(lib_1.Transaction);
852
+ tx.type.should.equal(sdk_core_1.TransactionType.AddPermissionlessDelegator);
853
+ // Verify UTXOs are properly handled
854
+ const txUtxos = tx._utxos;
855
+ txUtxos.should.not.be.empty();
856
+ txUtxos[0].should.have.property('addresses');
857
+ txUtxos[0].addresses.length.should.equal(3);
858
+ });
859
+ });
860
+ describe('recovery mode signing', () => {
861
+ const mockFeeState = { capacity: 100000n, excess: 0n, price: 1000n, timestamp: '1234567890' };
862
+ const MIN_DELEGATION_DURATION = 14 * 24 * 60 * 60;
863
+ const MIN_DELEGATION_AMOUNT = BigInt(50000 * 1e9);
864
+ /**
865
+ * Recovery mode test verifies that when recoverSigner=true, the builder uses:
866
+ * - Backup key (index 2) instead of user key (index 0)
867
+ * - BitGo key (index 1) as always
868
+ *
869
+ * This is inherited from AtomicTransactionBuilder but should be verified
870
+ * to work correctly with delegation transactions.
871
+ */
872
+ it('should sign delegation transaction in recovery mode (backup + bitgo keys)', async () => {
873
+ const builder = factory.getDelegatorBuilder();
874
+ const now = Math.floor(Date.now() / 1000);
875
+ const validNodeID = 'NodeID-AK7sPBsZM9rQwse23aLhEEBPHZD5gkLrL';
876
+ // 2-of-3 multisig: user, bitgo, backup
877
+ const addresses = [account_1.SEED_ACCOUNT.addressTestnet, account_1.ACCOUNT_1.addressTestnet, account_1.ACCOUNT_3.address];
878
+ const utxos = [
879
+ {
880
+ outputID: 7,
881
+ txid: '2NWd9hrSGkWJWyTu4DnSM1qQSUT2DVm8uqwFk4wQRFLAmcsHQz',
882
+ outputidx: '0',
883
+ assetID: account_1.CONTEXT.avaxAssetID,
884
+ amount: '60000000000000', // 60k FLR
885
+ threshold: 2,
886
+ addresses,
887
+ locktime: '0',
888
+ },
889
+ ];
890
+ // Enable recovery mode - this tells the builder to use backup (index 2) instead of user (index 0)
891
+ builder.recoverSigner = true;
892
+ builder
893
+ .nodeID(validNodeID)
894
+ .startTime(now + 60)
895
+ .endTime(now + MIN_DELEGATION_DURATION)
896
+ .stakeAmount(MIN_DELEGATION_AMOUNT)
897
+ .fromPubKey(addresses)
898
+ .decodedUtxos(utxos)
899
+ .feeState(mockFeeState)
900
+ .context(account_1.CONTEXT);
901
+ // In recovery mode: sign with backup (index 2) and bitgo (index 1)
902
+ builder.sign({ key: account_1.ACCOUNT_3.privateKey }); // backup key
903
+ builder.sign({ key: account_1.ACCOUNT_1.privateKey }); // bitgo key
904
+ const tx = await builder.build();
905
+ // Verify transaction builds successfully
906
+ tx.should.be.instanceof(lib_1.Transaction);
907
+ tx.type.should.equal(sdk_core_1.TransactionType.AddPermissionlessDelegator);
908
+ // Verify credentials exist
909
+ const credentials = tx._flareTransaction.credentials;
910
+ credentials.should.not.be.empty();
911
+ credentials.length.should.be.greaterThan(0);
912
+ // Verify we have signatures from both recovery keys
913
+ let signatureCount = 0;
914
+ for (const credential of credentials) {
915
+ const signatures = credential.getSignatures();
916
+ for (const sig of signatures) {
917
+ const sigHex = sig.toString('hex');
918
+ // Non-empty signature (not all zeros)
919
+ if (sigHex && !sigHex.match(/^0+$/)) {
920
+ signatureCount++;
921
+ }
922
+ }
923
+ }
924
+ // Should have at least 2 signatures (backup + bitgo)
925
+ signatureCount.should.be.greaterThanOrEqual(2, 'Recovery mode should have backup + bitgo signatures');
926
+ });
927
+ it('should fail when signing in recovery mode with user key instead of backup', async () => {
928
+ const builder = factory.getDelegatorBuilder();
929
+ const now = Math.floor(Date.now() / 1000);
930
+ const validNodeID = 'NodeID-AK7sPBsZM9rQwse23aLhEEBPHZD5gkLrL';
931
+ const addresses = [account_1.SEED_ACCOUNT.addressTestnet, account_1.ACCOUNT_1.addressTestnet, account_1.ACCOUNT_3.address];
932
+ const utxos = [
933
+ {
934
+ outputID: 7,
935
+ txid: '2NWd9hrSGkWJWyTu4DnSM1qQSUT2DVm8uqwFk4wQRFLAmcsHQz',
936
+ outputidx: '0',
937
+ assetID: account_1.CONTEXT.avaxAssetID,
938
+ amount: '60000000000000',
939
+ threshold: 2,
940
+ addresses,
941
+ locktime: '0',
942
+ },
943
+ ];
944
+ builder.recoverSigner = true;
945
+ builder
946
+ .nodeID(validNodeID)
947
+ .startTime(now + 60)
948
+ .endTime(now + MIN_DELEGATION_DURATION)
949
+ .stakeAmount(MIN_DELEGATION_AMOUNT)
950
+ .fromPubKey(addresses)
951
+ .decodedUtxos(utxos)
952
+ .feeState(mockFeeState)
953
+ .context(account_1.CONTEXT);
954
+ // Try to sign with user key (index 0) - this should fail in recovery mode
955
+ // because recovery mode expects backup key (index 2) + bitgo key (index 1)
956
+ builder.sign({ key: account_1.SEED_ACCOUNT.privateKey }); // user key (wrong for recovery mode)
957
+ builder.sign({ key: account_1.ACCOUNT_1.privateKey }); // bitgo key
958
+ const tx = await builder.build();
959
+ // Transaction builds but may not have correct signature count
960
+ // In recovery mode with wrong key, signature matching may fail
961
+ tx.should.be.instanceof(lib_1.Transaction);
962
+ });
963
+ it('should verify recovery mode uses correct address indices (backup=2, bitgo=1)', async () => {
964
+ const builder = factory.getDelegatorBuilder();
965
+ const now = Math.floor(Date.now() / 1000);
966
+ const validNodeID = 'NodeID-AK7sPBsZM9rQwse23aLhEEBPHZD5gkLrL';
967
+ const addresses = [account_1.SEED_ACCOUNT.addressTestnet, account_1.ACCOUNT_1.addressTestnet, account_1.ACCOUNT_3.address];
968
+ const utxos = [
969
+ {
970
+ outputID: 7,
971
+ txid: '2NWd9hrSGkWJWyTu4DnSM1qQSUT2DVm8uqwFk4wQRFLAmcsHQz',
972
+ outputidx: '0',
973
+ assetID: account_1.CONTEXT.avaxAssetID,
974
+ amount: '60000000000000',
975
+ threshold: 2,
976
+ addresses,
977
+ locktime: '0',
978
+ },
979
+ ];
980
+ // Enable recovery mode
981
+ builder.recoverSigner = true;
982
+ builder
983
+ .nodeID(validNodeID)
984
+ .startTime(now + 60)
985
+ .endTime(now + MIN_DELEGATION_DURATION)
986
+ .stakeAmount(MIN_DELEGATION_AMOUNT)
987
+ .fromPubKey(addresses)
988
+ .decodedUtxos(utxos)
989
+ .feeState(mockFeeState)
990
+ .context(account_1.CONTEXT);
991
+ // Build without signing to inspect internal state
992
+ await builder.build();
993
+ const transaction = builder.transaction;
994
+ transaction._fromAddresses.length.should.equal(3);
995
+ // In recovery mode, getSigningAddresses should return [backup, bitgo]
996
+ const signingAddresses = builder.getSigningAddresses();
997
+ signingAddresses.length.should.equal(2);
998
+ // Verify signing addresses are backup (index 2) and bitgo (index 1)
999
+ // Note: We can't directly compare addresses as they may be sorted,
1000
+ // but we can verify the method returns exactly 2 addresses
1001
+ signingAddresses[0].length.should.equal(20);
1002
+ signingAddresses[1].length.should.equal(20);
1003
+ });
1004
+ });
234
1005
  });
235
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbmxlc3NEZWxlZ2F0b3JUeEJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L3VuaXQvbGliL3Blcm1pc3Npb25sZXNzRGVsZWdhdG9yVHhCdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLGtCQUFnQjtBQUNoQiw0Q0FBdUM7QUFDdkMsOENBQWtEO0FBQ2xELDBDQUE0RztBQUM1RyxxREFBMkU7QUFDM0UsbUVBQTJDO0FBQzNDLDZFQUE4RTtBQUU5RSxRQUFRLENBQUMsdUNBQXVDLEVBQUUsR0FBRyxFQUFFO0lBQ3JELE1BQU0sVUFBVSxHQUFHLGVBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdEMsTUFBTSxPQUFPLEdBQUcsSUFBSSwrQkFBeUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUUxRCxRQUFRLENBQUMscUJBQXFCLEVBQUUsR0FBRyxFQUFFO1FBQ25DLEVBQUUsQ0FBQywyREFBMkQsRUFBRSxHQUFHLEVBQUU7WUFDbkUsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDOUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLHNDQUFnQyxDQUFDLENBQUM7UUFDakUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxpQkFBaUIsRUFBRSxHQUFHLEVBQUU7UUFDL0IsRUFBRSxDQUFDLG9DQUFvQyxFQUFFLEdBQUcsRUFBRTtZQUM1QyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUM5QyxnQkFBTSxDQUFDLE1BQU0sQ0FDWCxHQUFHLEVBQUU7Z0JBQ0gsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNyQixDQUFDLEVBQ0QsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENB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QyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsa0RBQWtELEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDaEUsTUFBTSxLQUFLLEdBQUcsZUFBSyxDQUFDLGVBQWUsQ0FBQyw2QkFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQy9ELE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFnQixDQUFDO1lBQzlELE1BQU0sV0FBVyxHQUFHLGVBQUssQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQztZQUVsRSxXQUFXLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNsQyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyx5Q0FBeUMsRUFBRSxLQUFLLElBQUksRUFBRTtZQUN2RCxNQUFNLEtBQUssR0FBRyxlQUFLLENBQUMsZUFBZSxDQUFDLDZCQUFlLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDL0QsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQWdCLENBQUM7WUFDOUQsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoQyxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2QyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgJ3Nob3VsZCc7XG5pbXBvcnQgeyBjb2lucyB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5LCBQZXJtaXNzaW9ubGVzc0RlbGVnYXRvclR4QnVpbGRlciwgVHJhbnNhY3Rpb24gfSBmcm9tICcuLi8uLi8uLi9zcmMvbGliJztcbmltcG9ydCB7IFNFRURfQUNDT1VOVCwgQUNDT1VOVF8xLCBDT05URVhUIH0gZnJvbSAnLi4vLi4vcmVzb3VyY2VzL2FjY291bnQnO1xuaW1wb3J0IHV0aWxzIGZyb20gJy4uLy4uLy4uL3NyYy9saWIvdXRpbHMnO1xuaW1wb3J0IHsgREVMRUdBVElPTl9UWF8yIH0gZnJvbSAnLi4vLi4vcmVzb3VyY2VzL3RyYW5zYWN0aW9uRGF0YS9kZWxlZ2F0b3JUeCc7XG5cbmRlc2NyaWJlKCdGbHJwIFBlcm1pc3Npb25sZXNzRGVsZWdhdG9yVHhCdWlsZGVyJywgKCkgPT4ge1xuICBjb25zdCBjb2luQ29uZmlnID0gY29pbnMuZ2V0KCd0ZmxycCcpO1xuICBjb25zdCBmYWN0b3J5ID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbkNvbmZpZyk7XG5cbiAgZGVzY3JpYmUoJ2dldERlbGVnYXRvckJ1aWxkZXInLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYSBQZXJtaXNzaW9ubGVzc0RlbGVnYXRvclR4QnVpbGRlciBpbnN0YW5jZScsICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldERlbGVnYXRvckJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXIuc2hvdWxkLmJlLmluc3RhbmNlT2YoUGVybWlzc2lvbmxlc3NEZWxlZ2F0b3JUeEJ1aWxkZXIpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndmFsaWRhdGUgbm9kZUlEJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgZmFpbCB3aGVuIG5vZGVJRCBpcyBtaXNzaW5nJywgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0RGVsZWdhdG9yQnVpbGRlcigpO1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIGJ1aWxkZXIubm9kZUlEKCcnKTtcbiAgICAgICAgfSxcbiAgICAgICAgKGU6IGFueSkgPT4gZS5tZXNzYWdlID09PSAnSW52YWxpZCB0cmFuc2FjdGlvbjogbWlzc2luZyBub2RlSUQnXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHdoZW4gbm9kZUlEIGhhcyBpbnZhbGlkIHByZWZpeCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldERlbGVnYXRvckJ1aWxkZXIoKTtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICBidWlsZGVyLm5vZGVJRCgnSW52YWxpZFByZWZpeC0xMjM0NTY3ODknKTtcbiAgICAgICAgfSxcbiAgICAgICAgKGU6IGFueSkgPT4gZS5tZXNzYWdlID09PSAnSW52YWxpZCB0cmFuc2FjdGlvbjogaW52YWxpZCBOb2RlSUQgdGFnJ1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYWNjZXB0IHZhbGlkIG5vZGVJRCBmb3JtYXQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXREZWxlZ2F0b3JCdWlsZGVyKCk7XG4gICAgICBjb25zdCB2YWxpZE5vZGVJRCA9ICdOb2RlSUQtQUs3c1BCc1pNOXJRd3NlMjNhTGhFRUJQSFpENWdrTHJMJztcbiAgICAgICgoKSA9PiBidWlsZGVyLm5vZGVJRCh2YWxpZE5vZGVJRCkpLnNob3VsZC5ub3QudGhyb3coKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3ZhbGlkYXRlIHN0YWtlIGR1cmF0aW9uJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgZmFpbCB3aGVuIGVuZCB0aW1lIGlzIGxlc3MgdGhhbiBzdGFydCB0aW1lJywgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0RGVsZWdhdG9yQnVpbGRlcigpO1xuICAgICAgY29uc3Qgc3RhcnRUaW1lID0gQmlnSW50KE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApICsgNjApO1xuICAgICAgY29uc3QgZW5kVGltZSA9IEJpZ0ludChNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKSAtIDYwKTtcblxuICAgICAgYnVpbGRlci5zdGFydFRpbWUoc3RhcnRUaW1lLnRvU3RyaW5nKCkpO1xuICAgICAgYnVpbGRlci5lbmRUaW1lKGVuZFRpbWUudG9TdHJpbmcoKSk7XG5cbiAgICAgIC8vIFRoZSB2YWxpZGF0aW9uIGhhcHBlbnMgaW4gYnVpbGRGbGFyZVRyYW5zYWN0aW9uLCBidXQgd2UgY2FuIHRlc3QgdmFsaWRhdGVTdGFrZUR1cmF0aW9uIGRpcmVjdGx5XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgYnVpbGRlci52YWxpZGF0ZVN0YWtlRHVyYXRpb24oc3RhcnRUaW1lLCBlbmRUaW1lKTtcbiAgICAgICAgfSxcbiAgICAgICAgKGU6IGFueSkgPT4gZS5tZXNzYWdlID09PSAnRW5kIGRhdGUgY2Fubm90IGJlIGxlc3MgdGhhbiBzdGFydCBkYXRlJ1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYWNjZXB0IHZhbGlkIHN0YWtlIGR1cmF0aW9uJywgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0RGVsZWdhdG9yQnVpbGRlcigpO1xuICAgICAgY29uc3Qgc3RhcnRUaW1lID0gQmlnSW50KE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApICsgNjApO1xuICAgICAgY29uc3QgZW5kVGltZSA9IEJpZ0ludChNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKSArIDg2NDAwICogMTQpOyAvLyAxNCBkYXlzIGxhdGVyXG5cbiAgICAgICgoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXIudmFsaWRhdGVTdGFrZUR1cmF0aW9uKHN0YXJ0VGltZSwgZW5kVGltZSk7XG4gICAgICB9KS5zaG91bGQubm90LnRocm93KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdidWlsZGVyIG1ldGhvZHMnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBzZXQgc3RhcnRUaW1lIGNvcnJlY3RseScsICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldERlbGVnYXRvckJ1aWxkZXIoKTtcbiAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApICsgNjA7XG4gICAgICAoKCkgPT4gYnVpbGRlci5zdGFydFRpbWUoc3RhcnRUaW1lKSkuc2hvdWxkLm5vdC50aHJvdygpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzZXQgZW5kVGltZSBjb3JyZWN0bHknLCAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXREZWxlZ2F0b3JCdWlsZGVyKCk7XG4gICAgICBjb25zdCBlbmRUaW1lID0gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCkgKyA4NjQwMCAqIDE0O1xuICAgICAgKCgpID0+IGJ1aWxkZXIuZW5kVGltZShlbmRUaW1lKSkuc2hvdWxkLm5vdC50aHJvdygpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzZXQgcmV3YXJkQWRkcmVzcyB3aXRoIFAtY2hhaW4gYWRkcmVzcycsICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldERlbGVnYXRvckJ1aWxkZXIoKTtcbiAgICAgIC8vIFAtY2hhaW4gQmVjaDMyIGFkZHJlc3NcbiAgICAgICgoKSA9PiBidWlsZGVyLnJld2FyZEFkZHJlc3MoU0VFRF9BQ0NPVU5ULmFkZHJlc3NUZXN0bmV0KSkuc2hvdWxkLm5vdC50aHJvdygpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnYnVpbGQgdmFsaWRhdGlvbicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGZhaWwgYnVpbGQgd2hlbiBub2RlSUQgaXMgbm90IHNldCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldERlbGVnYXRvckJ1aWxkZXIoKTtcbiAgICAgIGNvbnN0IG5vdyA9IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApO1xuXG4gICAgICBidWlsZGVyXG4gICAgICAgIC5zdGFydFRpbWUobm93ICsgNjApXG4gICAgICAgIC5lbmRUaW1lKG5vdyArIDg2NDAwICogMTQpXG4gICAgICAgIC5zdGFrZUFtb3VudChCaWdJbnQoNTAwMDAgKiAxZTkpKVxuICAgICAgICAuZnJvbVB1YktleShbU0VFRF9BQ0NPVU5ULmFkZHJlc3NUZXN0bmV0LCBBQ0NPVU5UXzEuYWRkcmVzc1Rlc3RuZXRdKVxuICAgICAgICAuY29udGV4dChDT05URVhUIGFzIGFueSk7XG5cbiAgICAgIGF3YWl0IGJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdOb2RlSUQgaXMgcmVxdWlyZWQgZm9yIGRlbGVnYXRpb24nKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCBidWlsZCB3aGVuIHN0YXJ0IHRpbWUgaXMgbm90IHNldCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldERlbGVnYXRvckJ1aWxkZXIoKTtcbiAgICAgIGNvbnN0IG5vdyA9IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApO1xuICAgICAgY29uc3QgdmFsaWROb2RlSUQgPSAnTm9kZUlELUFLN3NQQnNaTTlyUXdzZTIzYUxoRUVCUEhaRDVna0xyTCc7XG5cbiAgICAgIGJ1aWxkZXJcbiAgICAgICAgLm5vZGVJRCh2YWxpZE5vZGVJRClcbiAgICAgICAgLmVuZFRpbWUobm93ICsgODY0MDAgKiAxNClcbiAgICAgICAgLnN0YWtlQW1vdW50KEJpZ0ludCg1MDAwMCAqIDFlOSkpXG4gICAgICAgIC5mcm9tUHViS2V5KFtTRUVEX0FDQ09VTlQuYWRkcmVzc1Rlc3RuZXQsIEFDQ09VTlRfMS5hZGRyZXNzVGVzdG5ldF0pXG4gICAgICAgIC5jb250ZXh0KENPTlRFWFQgYXMgYW55KTtcblxuICAgICAgYXdhaXQgYnVpbGRlci5idWlsZCgpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ1N0YXJ0IHRpbWUgaXMgcmVxdWlyZWQgZm9yIGRlbGVnYXRpb24nKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCBidWlsZCB3aGVuIGVuZCB0aW1lIGlzIG5vdCBzZXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXREZWxlZ2F0b3JCdWlsZGVyKCk7XG4gICAgICBjb25zdCBub3cgPSBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKTtcbiAgICAgIGNvbnN0IHZhbGlkTm9kZUlEID0gJ05vZGVJRC1BSzdzUEJzWk05clF3c2UyM2FMaEVFQlBIWkQ1Z2tMckwnO1xuXG4gICAgICBidWlsZGVyXG4gICAgICAgIC5ub2RlSUQodmFsaWROb2RlSUQpXG4gICAgICAgIC5zdGFydFRpbWUobm93ICsgNjApXG4gICAgICAgIC5zdGFrZUFtb3VudChCaWdJbnQoNTAwMDAgKiAxZTkpKVxuICAgICAgICAuZnJvbVB1YktleShbU0VFRF9BQ0NPVU5ULmFkZHJlc3NUZXN0bmV0LCBBQ0NPVU5UXzEuYWRkcmVzc1Rlc3RuZXRdKVxuICAgICAgICAuY29udGV4dChDT05URVhUIGFzIGFueSk7XG5cbiAgICAgIGF3YWl0IGJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdFbmQgdGltZSBpcyByZXF1aXJlZCBmb3IgZGVsZWdhdGlvbicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIGJ1aWxkIHdoZW4gc3Rha2UgYW1vdW50IGlzIG5vdCBzZXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXREZWxlZ2F0b3JCdWlsZGVyKCk7XG4gICAgICBjb25zdCBub3cgPSBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKTtcbiAgICAgIGNvbnN0IHZhbGlkTm9kZUlEID0gJ05vZGVJRC1BSzdzUEJzWk05clF3c2UyM2FMaEVFQlBIWkQ1Z2tMckwnO1xuXG4gICAgICBidWlsZGVyXG4gICAgICAgIC5ub2RlSUQodmFsaWROb2RlSUQpXG4gICAgICAgIC5zdGFydFRpbWUobm93ICsgNjApXG4gICAgICAgIC5lbmRUaW1lKG5vdyArIDg2NDAwICogMTQpXG4gICAgICAgIC5mcm9tUHViS2V5KFtTRUVEX0FDQ09VTlQuYWRkcmVzc1Rlc3RuZXQsIEFDQ09VTlRfMS5hZGRyZXNzVGVzdG5ldF0pXG4gICAgICAgIC5jb250ZXh0KENPTlRFWFQgYXMgYW55KTtcblxuICAgICAgYXdhaXQgYnVpbGRlci5idWlsZCgpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ1N0YWtlIGFtb3VudCBpcyByZXF1aXJlZCBmb3IgZGVsZWdhdGlvbicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIGJ1aWxkIHdoZW4gY29udGV4dCBpcyBub3Qgc2V0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0RGVsZWdhdG9yQnVpbGRlcigpO1xuICAgICAgY29uc3Qgbm93ID0gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCk7XG4gICAgICBjb25zdCB2YWxpZE5vZGVJRCA9ICdOb2RlSUQtQUs3c1BCc1pNOXJRd3NlMjNhTGhFRUJQSFpENWdrTHJMJztcblxuICAgICAgYnVpbGRlclxuICAgICAgICAubm9kZUlEKHZhbGlkTm9kZUlEKVxuICAgICAgICAuc3RhcnRUaW1lKG5vdyArIDYwKVxuICAgICAgICAuZW5kVGltZShub3cgKyA4NjQwMCAqIDE0KVxuICAgICAgICAuc3Rha2VBbW91bnQoQmlnSW50KDUwMDAwICogMWU5KSlcbiAgICAgICAgLmZyb21QdWJLZXkoW1NFRURfQUNDT1VOVC5hZGRyZXNzVGVzdG5ldCwgQUNDT1VOVF8xLmFkZHJlc3NUZXN0bmV0XSk7XG5cbiAgICAgIGF3YWl0IGJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdDb250ZXh0IGlzIHJlcXVpcmVkIGZvciBkZWxlZ2F0aW9uJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgYnVpbGQgd2hlbiBmcm9tIGFkZHJlc3NlcyBhcmUgbm90IHNldCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldERlbGVnYXRvckJ1aWxkZXIoKTtcbiAgICAgIGNvbnN0IG5vdyA9IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApO1xuICAgICAgY29uc3QgdmFsaWROb2RlSUQgPSAnTm9kZUlELUFLN3NQQnNaTTlyUXdzZTIzYUxoRUVCUEhaRDVna0xyTCc7XG5cbiAgICAgIGJ1aWxkZXJcbiAgICAgICAgLm5vZGVJRCh2YWxpZE5vZGVJRClcbiAgICAgICAgLnN0YXJ0VGltZShub3cgKyA2MClcbiAgICAgICAgLmVuZFRpbWUobm93ICsgODY0MDAgKiAxNClcbiAgICAgICAgLnN0YWtlQW1vdW50KEJpZ0ludCg1MDAwMCAqIDFlOSkpXG4gICAgICAgIC5jb250ZXh0KENPTlRFWFQgYXMgYW55KTtcblxuICAgICAgYXdhaXQgYnVpbGRlci5idWlsZCgpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ0Zyb20gYWRkcmVzc2VzIGFyZSByZXF1aXJlZCBmb3IgZGVsZWdhdGlvbicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIGJ1aWxkIHdoZW4gZmVlIHN0YXRlIGlzIG5vdCBzZXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXREZWxlZ2F0b3JCdWlsZGVyKCk7XG4gICAgICBjb25zdCBub3cgPSBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKTtcbiAgICAgIGNvbnN0IHZhbGlkTm9kZUlEID0gJ05vZGVJRC1BSzdzUEJzWk05clF3c2UyM2FMaEVFQlBIWkQ1Z2tMckwnO1xuXG4gICAgICBidWlsZGVyXG4gICAgICAgIC5ub2RlSUQodmFsaWROb2RlSUQpXG4gICAgICAgIC5zdGFydFRpbWUobm93ICsgNjApXG4gICAgICAgIC5lbmRUaW1lKG5vdyArIDg2NDAwICogMTQpXG4gICAgICAgIC5zdGFrZUFtb3VudChCaWdJbnQoNTAwMDAgKiAxZTkpKVxuICAgICAgICAuZnJvbVB1YktleShbU0VFRF9BQ0NPVU5ULmFkZHJlc3NUZXN0bmV0LCBBQ0NPVU5UXzEuYWRkcmVzc1Rlc3RuZXRdKVxuICAgICAgICAuY29udGV4dChDT05URVhUIGFzIGFueSk7XG5cbiAgICAgIGF3YWl0IGJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdGZWUgc3RhdGUgaXMgcmVxdWlyZWQgZm9yIGRlbGVnYXRpb24nKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCBidWlsZCB3aGVuIFVUWE9zIGFyZSBub3Qgc2V0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0RGVsZWdhdG9yQnVpbGRlcigpO1xuICAgICAgY29uc3Qgbm93ID0gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCk7XG4gICAgICBjb25zdCB2YWxpZE5vZGVJRCA9ICdOb2RlSUQtQUs3c1BCc1pNOXJRd3NlMjNhTGhFRUJQSFpENWdrTHJMJztcbiAgICAgIGNvbnN0IG1vY2tGZWVTdGF0ZSA9IHsgY2FwYWNpdHk6IDEwMDAwMG4sIGV4Y2VzczogMG4sIHByaWNlOiAxMDAwbiwgdGltZXN0YW1wOiAnMTIzNDU2Nzg5MCcgfTtcblxuICAgICAgYnVpbGRlclxuICAgICAgICAubm9kZUlEKHZhbGlkTm9kZUlEKVxuICAgICAgICAuc3RhcnRUaW1lKG5vdyArIDYwKVxuICAgICAgICAuZW5kVGltZShub3cgKyA4NjQwMCAqIDE0KVxuICAgICAgICAuc3Rha2VBbW91bnQoQmlnSW50KDUwMDAwICogMWU5KSlcbiAgICAgICAgLmZyb21QdWJLZXkoW1NFRURfQUNDT1VOVC5hZGRyZXNzVGVzdG5ldCwgQUNDT1VOVF8xLmFkZHJlc3NUZXN0bmV0XSlcbiAgICAgICAgLmNvbnRleHQoQ09OVEVYVCBhcyBhbnkpXG4gICAgICAgIC5mZWVTdGF0ZShtb2NrRmVlU3RhdGUpO1xuXG4gICAgICBhd2FpdCBidWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnVVRYT3MgYXJlIHJlcXVpcmVkIGZvciBkZWxlZ2F0aW9uJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd2YWxpZGF0ZSBzdGFrZSBhbW91bnQnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBmYWlsIHdoZW4gc3Rha2UgYW1vdW50IGlzIGJlbG93IG1pbmltdW0nLCAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXREZWxlZ2F0b3JCdWlsZGVyKCk7XG4gICAgICAvLyBNaW5pbXVtIGlzIDUwMDAwIEZMUiwgc28gMTAwMCBzaG91bGQgZmFpbFxuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIGJ1aWxkZXIuc3Rha2VBbW91bnQoQmlnSW50KDEwMDAgKiAxZTkpKTtcbiAgICAgICAgfSxcbiAgICAgICAgKGU6IGFueSkgPT4gZS5tZXNzYWdlLmluY2x1ZGVzKCdNaW5pbXVtIGRlbGVnYXRpb24gYW1vdW50JylcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFjY2VwdCBzdGFrZSBhbW91bnQgYXQgb3IgYWJvdmUgbWluaW11bScsICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldERlbGVnYXRvckJ1aWxkZXIoKTtcbiAgICAgIGNvbnN0IHN0YWtlQW1vdW50ID0gQmlnSW50KDUwMDAwICogMWU5KTtcbiAgICAgICgoKSA9PiBidWlsZGVyLnN0YWtlQW1vdW50KHN0YWtlQW1vdW50KSkuc2hvdWxkLm5vdC50aHJvdygpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndHJhbnNhY3Rpb24gdHlwZSBzdXBwb3J0JywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgYWxsb3cgc2V0dGluZyBBZGRQZXJtaXNzaW9ubGVzc0RlbGVnYXRvciB0cmFuc2FjdGlvbiB0eXBlJywgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0RGVsZWdhdG9yQnVpbGRlcigpO1xuICAgICAgLy8gVGhlIGJ1aWxkZXIgc2hvdWxkIHN1Y2Nlc3NmdWxseSBjb25maWd1cmUgd2l0aCBBZGRQZXJtaXNzaW9ubGVzc0RlbGVnYXRvciB0eXBlXG4gICAgICAvLyBUaGlzIHZlcmlmaWVzIHRyYW5zYWN0aW9uLnRzIHNldFRyYW5zYWN0aW9uVHlwZSBhY2NlcHRzIHRoZSBkZWxlZ2F0aW9uIHR5cGVcbiAgICAgIGJ1aWxkZXIuc2hvdWxkLmJlLmluc3RhbmNlb2YoUGVybWlzc2lvbmxlc3NEZWxlZ2F0b3JUeEJ1aWxkZXIpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYXZlIGNvcnJlY3QgbWluaW11bSBzdGFrZSBhbW91bnQgY29uc3RhbnQnLCAoKSA9PiB7XG4gICAgICAvLyBWZXJpZnkgdGhlIG1pbmltdW0gc3Rha2UgYW1vdW50IGlzIDUwMDAwIEZMUiAoaW4gbmFub0ZMUilcbiAgICAgIGNvbnN0IG1pblN0YWtlQW1vdW50ID0gQmlnSW50KDUwMDAwICogMWU5KTtcbiAgICAgIG1pblN0YWtlQW1vdW50LnNob3VsZC5lcXVhbChCaWdJbnQoJzUwMDAwMDAwMDAwMDAwJykpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgncm91bmQtdHJpcCBkZXNlcmlhbGl6YXRpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBkZXNlcmlhbGl6ZSBhIHNpZ25lZCBkZWxlZ2F0aW9uIHRyYW5zYWN0aW9uIGZyb20gaGV4JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmF3VHggPSB1dGlscy5yZW1vdmVIZXhQcmVmaXgoREVMRUdBVElPTl9UWF8yLnNpZ25lZEhleCk7XG4gICAgICBjb25zdCB0eCA9IChhd2FpdCBmYWN0b3J5LmZyb20ocmF3VHgpLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuICAgICAgdHgudHlwZS5zaG91bGQuZXF1YWwoVHJhbnNhY3Rpb25UeXBlLkFkZFBlcm1pc3Npb25sZXNzRGVsZWdhdG9yKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgY29ycmVjdGx5IGV4dHJhY3QgZGVsZWdhdGlvbiBwYXJhbWV0ZXJzIGZyb20gZGVzZXJpYWxpemVkIHRyYW5zYWN0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmF3VHggPSB1dGlscy5yZW1vdmVIZXhQcmVmaXgoREVMRUdBVElPTl9UWF8yLnNpZ25lZEhleCk7XG4gICAgICBjb25zdCB0eCA9IChhd2FpdCBmYWN0b3J5LmZyb20ocmF3VHgpLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuICAgICAgY29uc3QgZXhwbGFuYXRpb24gPSB0eC5leHBsYWluVHJhbnNhY3Rpb24oKTtcbiAgICAgIGV4cGxhbmF0aW9uLm91dHB1dHMubGVuZ3RoLnNob3VsZC5iZS5hYm92ZSgwKTtcbiAgICAgIGV4cGxhbmF0aW9uLm91dHB1dEFtb3VudC5zaG91bGQuZXF1YWwoREVMRUdBVElPTl9UWF8yLnN0YWtlQW1vdW50KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmUtc2VyaWFsaXplIHRvIHRoZSBzYW1lIGhleCAocm91bmQtdHJpcCknLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByYXdUeCA9IHV0aWxzLnJlbW92ZUhleFByZWZpeChERUxFR0FUSU9OX1RYXzIuc2lnbmVkSGV4KTtcbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IGZhY3RvcnkuZnJvbShyYXdUeCkuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgICBjb25zdCByZUVuY29kZWRUeCA9IHV0aWxzLnJlbW92ZUhleFByZWZpeCh0eC50b0Jyb2FkY2FzdEZvcm1hdCgpKTtcblxuICAgICAgcmVFbmNvZGVkVHguc2hvdWxkLmVxdWFsKHJhd1R4KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGF2ZSBjb3JyZWN0IGlucHV0L291dHB1dCBjb3VudHMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByYXdUeCA9IHV0aWxzLnJlbW92ZUhleFByZWZpeChERUxFR0FUSU9OX1RYXzIuc2lnbmVkSGV4KTtcbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IGZhY3RvcnkuZnJvbShyYXdUeCkuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgICB0eC5pbnB1dHMuc2hvdWxkLmhhdmUubGVuZ3RoKDMpO1xuICAgICAgdHgub3V0cHV0cy5sZW5ndGguc2hvdWxkLmJlLmFib3ZlKDApO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
1006
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbmxlc3NEZWxlZ2F0b3JUeEJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L3VuaXQvbGliL3Blcm1pc3Npb25sZXNzRGVsZWdhdG9yVHhCdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLGtCQUFnQjtBQUNoQiw0Q0FBdUM7QUFDdkMsOENBQWtEO0FBQ2xELDBDQUE0RztBQUM1RyxxREFBc0Y7QUFDdEYsbUVBQTJDO0FBQzNDLDZFQUE4RTtBQUU5RSxRQUFRLENBQUMsdUNBQXVDLEVBQUUsR0FBRyxFQUFFO0lBQ3JELE1BQU0sVUFBVSxHQUFHLGVBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdEMsTUFBTSxPQUFPLEdBQUcsSUFBSSwrQkFBeUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUUxRCxRQUFRLENBQUMscUJBQXFCLEVBQUUsR0FBRyxFQUFFO1FBQ25DLEVBQUUsQ0FBQywyREFBMkQsRUFBRSxHQUFHLEVBQUU7WUFDbkUsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDOUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLHNDQUFnQyxDQUFDLENBQUM7UUFDakUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxpQkFBaUIsRUFBRSxHQUFHLEVBQUU7UUFDL0IsRUFBRSxDQUFDLG9DQUFvQyxFQUFFLEdBQUcsRUFBRTtZQUM1QyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUM5QyxnQkFBTSxDQUFDLE1BQU0sQ0FDWCxHQUFHLEVBQUU7Z0JBQ0gsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNyQixDQUFDLEVBQ0QsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENB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b250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCAnc2hvdWxkJztcbmltcG9ydCB7IGNvaW5zIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnksIFBlcm1pc3Npb25sZXNzRGVsZWdhdG9yVHhCdWlsZGVyLCBUcmFuc2FjdGlvbiB9IGZyb20gJy4uLy4uLy4uL3NyYy9saWInO1xuaW1wb3J0IHsgU0VFRF9BQ0NPVU5ULCBBQ0NPVU5UXzEsIEFDQ09VTlRfMywgQ09OVEVYVCB9IGZyb20gJy4uLy4uL3Jlc291cmNlcy9hY2NvdW50JztcbmltcG9ydCB1dGlscyBmcm9tICcuLi8uLi8uLi9zcmMvbGliL3V0aWxzJztcbmltcG9ydCB7IERFTEVHQVRJT05fVFhfMiB9IGZyb20gJy4uLy4uL3Jlc291cmNlcy90cmFuc2FjdGlvbkRhdGEvZGVsZWdhdG9yVHgnO1xuXG5kZXNjcmliZSgnRmxycCBQZXJtaXNzaW9ubGVzc0RlbGVnYXRvclR4QnVpbGRlcicsICgpID0+IHtcbiAgY29uc3QgY29pbkNvbmZpZyA9IGNvaW5zLmdldCgndGZscnAnKTtcbiAgY29uc3QgZmFjdG9yeSA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5Db25maWcpO1xuXG4gIGRlc2NyaWJlKCdnZXREZWxlZ2F0b3JCdWlsZGVyJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGEgUGVybWlzc2lvbmxlc3NEZWxlZ2F0b3JUeEJ1aWxkZXIgaW5zdGFuY2UnLCAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXREZWxlZ2F0b3JCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLnNob3VsZC5iZS5pbnN0YW5jZU9mKFBlcm1pc3Npb25sZXNzRGVsZWdhdG9yVHhCdWlsZGVyKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3ZhbGlkYXRlIG5vZGVJRCcsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGZhaWwgd2hlbiBub2RlSUQgaXMgbWlzc2luZycsICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldERlbGVnYXRvckJ1aWxkZXIoKTtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICBidWlsZGVyLm5vZGVJRCgnJyk7XG4gICAgICAgIH0sXG4gICAgICAgIChlOiBhbnkpID0+IGUubWVzc2FnZSA9PT0gJ0ludmFsaWQgdHJhbnNhY3Rpb246IG1pc3Npbmcgbm9kZUlEJ1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB3aGVuIG5vZGVJRCBoYXMgaW52YWxpZCBwcmVmaXgnLCAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXREZWxlZ2F0b3JCdWlsZGVyKCk7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgYnVpbGRlci5ub2RlSUQoJ0ludmFsaWRQcmVmaXgtMTIzNDU2Nzg5Jyk7XG4gICAgICAgIH0sXG4gICAgICAgIChlOiBhbnkpID0+IGUubWVzc2FnZSA9PT0gJ0ludmFsaWQgdHJhbnNhY3Rpb246IGludmFsaWQgTm9kZUlEIHRhZydcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFjY2VwdCB2YWxpZCBub2RlSUQgZm9ybWF0JywgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0RGVsZWdhdG9yQnVpbGRlcigpO1xuICAgICAgY29uc3QgdmFsaWROb2RlSUQgPSAnTm9kZUlELUFLN3NQQnNaTTlyUXdzZTIzYUxoRUVCUEhaRDVna0xyTCc7XG4gICAgICAoKCkgPT4gYnVpbGRlci5ub2RlSUQodmFsaWROb2RlSUQpKS5zaG91bGQubm90LnRocm93KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd2YWxpZGF0ZSBzdGFrZSBkdXJhdGlvbicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGZhaWwgd2hlbiBlbmQgdGltZSBpcyBsZXNzIHRoYW4gc3RhcnQgdGltZScsICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldERlbGVnYXRvckJ1aWxkZXIoKTtcbiAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IEJpZ0ludChNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKSArIDYwKTtcbiAgICAgIGNvbnN0IGVuZFRpbWUgPSBCaWdJbnQoTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCkgLSA2MCk7XG5cbiAgICAgIGJ1aWxkZXIuc3RhcnRUaW1lKHN0YXJ0VGltZS50b1N0cmluZygpKTtcbiAgICAgIGJ1aWxkZXIuZW5kVGltZShlbmRUaW1lLnRvU3RyaW5nKCkpO1xuXG4gICAgICAvLyBUaGUgdmFsaWRhdGlvbiBoYXBwZW5zIGluIGJ1aWxkRmxhcmVUcmFuc2FjdGlvbiwgYnV0IHdlIGNhbiB0ZXN0IHZhbGlkYXRlU3Rha2VEdXJhdGlvbiBkaXJlY3RseVxuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIGJ1aWxkZXIudmFsaWRhdGVTdGFrZUR1cmF0aW9uKHN0YXJ0VGltZSwgZW5kVGltZSk7XG4gICAgICAgIH0sXG4gICAgICAgIChlOiBhbnkpID0+IGUubWVzc2FnZSA9PT0gJ0VuZCBkYXRlIGNhbm5vdCBiZSBsZXNzIHRoYW4gc3RhcnQgZGF0ZSdcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFjY2VwdCB2YWxpZCBzdGFrZSBkdXJhdGlvbicsICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldERlbGVnYXRvckJ1aWxkZXIoKTtcbiAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IEJpZ0ludChNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKSArIDYwKTtcbiAgICAgIGNvbnN0IGVuZFRpbWUgPSBCaWdJbnQoTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCkgKyA4NjQwMCAqIDE0KTsgLy8gMTQgZGF5cyBsYXRlclxuXG4gICAgICAoKCkgPT4ge1xuICAgICAgICBidWlsZGVyLnZhbGlkYXRlU3Rha2VEdXJhdGlvbihzdGFydFRpbWUsIGVuZFRpbWUpO1xuICAgICAgfSkuc2hvdWxkLm5vdC50aHJvdygpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnYnVpbGRlciBtZXRob2RzJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgc2V0IHN0YXJ0VGltZSBjb3JyZWN0bHknLCAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXREZWxlZ2F0b3JCdWlsZGVyKCk7XG4gICAgICBjb25zdCBzdGFydFRpbWUgPSBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKSArIDYwO1xuICAgICAgKCgpID0+IGJ1aWxkZXIuc3RhcnRUaW1lKHN0YXJ0VGltZSkpLnNob3VsZC5ub3QudGhyb3coKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc2V0IGVuZFRpbWUgY29ycmVjdGx5JywgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0RGVsZWdhdG9yQnVpbGRlcigpO1xuICAgICAgY29uc3QgZW5kVGltZSA9IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApICsgODY0MDAgKiAxNDtcbiAgICAgICgoKSA9PiBidWlsZGVyLmVuZFRpbWUoZW5kVGltZSkpLnNob3VsZC5ub3QudGhyb3coKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc2V0IHJld2FyZEFkZHJlc3Mgd2l0aCBQLWNoYWluIGFkZHJlc3MnLCAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXREZWxlZ2F0b3JCdWlsZGVyKCk7XG4gICAgICAvLyBQLWNoYWluIEJlY2gzMiBhZGRyZXNzXG4gICAgICAoKCkgPT4gYnVpbGRlci5yZXdhcmRBZGRyZXNzKFNFRURfQUNDT1VOVC5hZGRyZXNzVGVzdG5ldCkpLnNob3VsZC5ub3QudGhyb3coKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2J1aWxkIHZhbGlkYXRpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBmYWlsIGJ1aWxkIHdoZW4gbm9kZUlEIGlzIG5vdCBzZXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXREZWxlZ2F0b3JCdWlsZGVyKCk7XG4gICAgICBjb25zdCBub3cgPSBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKTtcblxuICAgICAgYnVpbGRlclxuICAgICAgICAuc3RhcnRUaW1lKG5vdyArIDYwKVxuICAgICAgICAuZW5kVGltZShub3cgKyA4NjQwMCAqIDE0KVxuICAgICAgICAuc3Rha2VBbW91bnQoQmlnSW50KDUwMDAwICogMWU5KSlcbiAgICAgICAgLmZyb21QdWJLZXkoW1NFRURfQUNDT1VOVC5hZGRyZXNzVGVzdG5ldCwgQUNDT1VOVF8xLmFkZHJlc3NUZXN0bmV0XSlcbiAgICAgICAgLmNvbnRleHQoQ09OVEVYVCBhcyBhbnkpO1xuXG4gICAgICBhd2FpdCBidWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnTm9kZUlEIGlzIHJlcXVpcmVkIGZvciBkZWxlZ2F0aW9uJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgYnVpbGQgd2hlbiBzdGFydCB0aW1lIGlzIG5vdCBzZXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXREZWxlZ2F0b3JCdWlsZGVyKCk7XG4gICAgICBjb25zdCBub3cgPSBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKTtcbiAgICAgIGNvbnN0IHZhbGlkTm9kZUlEID0gJ05vZGVJRC1BSzdzUEJzWk05clF3c2UyM2FMaEVFQlBIWkQ1Z2tMckwnO1xuXG4gICAgICBidWlsZGVyXG4gICAgICAgIC5ub2RlSUQodmFsaWROb2RlSUQpXG4gICAgICAgIC5lbmRUaW1lKG5vdyArIDg2NDAwICogMTQpXG4gICAgICAgIC5zdGFrZUFtb3VudChCaWdJbnQoNTAwMDAgKiAxZTkpKVxuICAgICAgICAuZnJvbVB1YktleShbU0VFRF9BQ0NPVU5ULmFkZHJlc3NUZXN0bmV0LCBBQ0NPVU5UXzEuYWRkcmVzc1Rlc3RuZXRdKVxuICAgICAgICAuY29udGV4dChDT05URVhUIGFzIGFueSk7XG5cbiAgICAgIGF3YWl0IGJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdTdGFydCB0aW1lIGlzIHJlcXVpcmVkIGZvciBkZWxlZ2F0aW9uJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgYnVpbGQgd2hlbiBlbmQgdGltZSBpcyBub3Qgc2V0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0RGVsZWdhdG9yQnVpbGRlcigpO1xuICAgICAgY29uc3Qgbm93ID0gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCk7XG4gICAgICBjb25zdCB2YWxpZE5vZGVJRCA9ICdOb2RlSUQtQUs3c1BCc1pNOXJRd3NlMjNhTGhFRUJQSFpENWdrTHJMJztcblxuICAgICAgYnVpbGRlclxuICAgICAgICAubm9kZUlEKHZhbGlkTm9kZUlEKVxuICAgICAgICAuc3RhcnRUaW1lKG5vdyArIDYwKVxuICAgICAgICAuc3Rha2VBbW91bnQoQmlnSW50KDUwMDAwICogMWU5KSlcbiAgICAgICAgLmZyb21QdWJLZXkoW1NFRURfQUNDT1VOVC5hZGRyZXNzVGVzdG5ldCwgQUNDT1VOVF8xLmFkZHJlc3NUZXN0bmV0XSlcbiAgICAgICAgLmNvbnRleHQoQ09OVEVYVCBhcyBhbnkpO1xuXG4gICAgICBhd2FpdCBidWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnRW5kIHRpbWUgaXMgcmVxdWlyZWQgZm9yIGRlbGVnYXRpb24nKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCBidWlsZCB3aGVuIHN0YWtlIGFtb3VudCBpcyBub3Qgc2V0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0RGVsZWdhdG9yQnVpbGRlcigpO1xuICAgICAgY29uc3Qgbm93ID0gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCk7XG4gICAgICBjb25zdCB2YWxpZE5vZGVJRCA9ICdOb2RlSUQtQUs3c1BCc1pNOXJRd3NlMjNhTGhFRUJQSFpENWdrTHJMJztcblxuICAgICAgYnVpbGRlclxuICAgICAgICAubm9kZUlEKHZhbGlkTm9kZUlEKVxuICAgICAgICAuc3RhcnRUaW1lKG5vdyArIDYwKVxuICAgICAgICAuZW5kVGltZShub3cgKyA4NjQwMCAqIDE0KVxuICAgICAgICAuZnJvbVB1YktleShbU0VFRF9BQ0NPVU5ULmFkZHJlc3NUZXN0bmV0LCBBQ0NPVU5UXzEuYWRkcmVzc1Rlc3RuZXRdKVxuICAgICAgICAuY29udGV4dChDT05URVhUIGFzIGFueSk7XG5cbiAgICAgIGF3YWl0IGJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdTdGFrZSBhbW91bnQgaXMgcmVxdWlyZWQgZm9yIGRlbGVnYXRpb24nKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCBidWlsZCB3aGVuIGNvbnRleHQgaXMgbm90IHNldCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldERlbGVnYXRvckJ1aWxkZXIoKTtcbiAgICAgIGNvbnN0IG5vdyA9IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApO1xuICAgICAgY29uc3QgdmFsaWROb2RlSUQgPSAnTm9kZUlELUFLN3NQQnNaTTlyUXdzZTIzYUxoRUVCUEhaRDVna0xyTCc7XG5cbiAgICAgIGJ1aWxkZXJcbiAgICAgICAgLm5vZGVJRCh2YWxpZE5vZGVJRClcbiAgICAgICAgLnN0YXJ0VGltZShub3cgKyA2MClcbiAgICAgICAgLmVuZFRpbWUobm93ICsgODY0MDAgKiAxNClcbiAgICAgICAgLnN0YWtlQW1vdW50KEJpZ0ludCg1MDAwMCAqIDFlOSkpXG4gICAgICAgIC5mcm9tUHViS2V5KFtTRUVEX0FDQ09VTlQuYWRkcmVzc1Rlc3RuZXQsIEFDQ09VTlRfMS5hZGRyZXNzVGVzdG5ldF0pO1xuXG4gICAgICBhd2FpdCBidWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnQ29udGV4dCBpcyByZXF1aXJlZCBmb3IgZGVsZWdhdGlvbicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIGJ1aWxkIHdoZW4gZnJvbSBhZGRyZXNzZXMgYXJlIG5vdCBzZXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXREZWxlZ2F0b3JCdWlsZGVyKCk7XG4gICAgICBjb25zdCBub3cgPSBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKTtcbiAgICAgIGNvbnN0IHZhbGlkTm9kZUlEID0gJ05vZGVJRC1BSzdzUEJzWk05clF3c2UyM2FMaEVFQlBIWkQ1Z2tMckwnO1xuXG4gICAgICBidWlsZGVyXG4gICAgICAgIC5ub2RlSUQodmFsaWROb2RlSUQpXG4gICAgICAgIC5zdGFydFRpbWUobm93ICsgNjApXG4gICAgICAgIC5lbmRUaW1lKG5vdyArIDg2NDAwICogMTQpXG4gICAgICAgIC5zdGFrZUFtb3VudChCaWdJbnQoNTAwMDAgKiAxZTkpKVxuICAgICAgICAuY29udGV4dChDT05URVhUIGFzIGFueSk7XG5cbiAgICAgIGF3YWl0IGJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdGcm9tIGFkZHJlc3NlcyBhcmUgcmVxdWlyZWQgZm9yIGRlbGVnYXRpb24nKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCBidWlsZCB3aGVuIGZlZSBzdGF0ZSBpcyBub3Qgc2V0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0RGVsZWdhdG9yQnVpbGRlcigpO1xuICAgICAgY29uc3Qgbm93ID0gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCk7XG4gICAgICBjb25zdCB2YWxpZE5vZGVJRCA9ICdOb2RlSUQtQUs3c1BCc1pNOXJRd3NlMjNhTGhFRUJQSFpENWdrTHJMJztcblxuICAgICAgYnVpbGRlclxuICAgICAgICAubm9kZUlEKHZhbGlkTm9kZUlEKVxuICAgICAgICAuc3RhcnRUaW1lKG5vdyArIDYwKVxuICAgICAgICAuZW5kVGltZShub3cgKyA4NjQwMCAqIDE0KVxuICAgICAgICAuc3Rha2VBbW91bnQoQmlnSW50KDUwMDAwICogMWU5KSlcbiAgICAgICAgLmZyb21QdWJLZXkoW1NFRURfQUNDT1VOVC5hZGRyZXNzVGVzdG5ldCwgQUNDT1VOVF8xLmFkZHJlc3NUZXN0bmV0XSlcbiAgICAgICAgLmNvbnRleHQoQ09OVEVYVCBhcyBhbnkpO1xuXG4gICAgICBhd2FpdCBidWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnRmVlIHN0YXRlIGlzIHJlcXVpcmVkIGZvciBkZWxlZ2F0aW9uJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgYnVpbGQgd2hlbiBVVFhPcyBhcmUgbm90IHNldCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldERlbGVnYXRvckJ1aWxkZXIoKTtcbiAgICAgIGNvbnN0IG5vdyA9IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApO1xuICAgICAgY29uc3QgdmFsaWROb2RlSUQgPSAnTm9kZUlELUFLN3NQQnNaTTlyUXdzZTIzYUxoRUVCUEhaRDVna0xyTCc7XG4gICAgICBjb25zdCBtb2NrRmVlU3RhdGUgPSB7IGNhcGFjaXR5OiAxMDAwMDBuLCBleGNlc3M6IDBuLCBwcmljZTogMTAwMG4sIHRpbWVzdGFtcDogJzEyMzQ1Njc4OTAnIH07XG5cbiAgICAgIGJ1aWxkZXJcbiAgICAgICAgLm5vZGVJRCh2YWxpZE5vZGVJRClcbiAgICAgICAgLnN0YXJ0VGltZShub3cgKyA2MClcbiAgICAgICAgLmVuZFRpbWUobm93ICsgODY0MDAgKiAxNClcbiAgICAgICAgLnN0YWtlQW1vdW50KEJpZ0ludCg1MDAwMCAqIDFlOSkpXG4gICAgICAgIC5mcm9tUHViS2V5KFtTRUVEX0FDQ09VTlQuYWRkcmVzc1Rlc3RuZXQsIEFDQ09VTlRfMS5hZGRyZXNzVGVzdG5ldF0pXG4gICAgICAgIC5jb250ZXh0KENPTlRFWFQgYXMgYW55KVxuICAgICAgICAuZmVlU3RhdGUobW9ja0ZlZVN0YXRlKTtcblxuICAgICAgYXdhaXQgYnVpbGRlci5idWlsZCgpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ1VUWE9zIGFyZSByZXF1aXJlZCBmb3IgZGVsZWdhdGlvbicpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndmFsaWRhdGUgc3Rha2UgYW1vdW50JywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgZmFpbCB3aGVuIHN0YWtlIGFtb3VudCBpcyBiZWxvdyBtaW5pbXVtJywgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0RGVsZWdhdG9yQnVpbGRlcigpO1xuICAgICAgLy8gTWluaW11bSBpcyA1MDAwMCBGTFIsIHNvIDEwMDAgc2hvdWxkIGZhaWxcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICBidWlsZGVyLnN0YWtlQW1vdW50KEJpZ0ludCgxMDAwICogMWU5KSk7XG4gICAgICAgIH0sXG4gICAgICAgIChlOiBhbnkpID0+IGUubWVzc2FnZS5pbmNsdWRlcygnTWluaW11bSBkZWxlZ2F0aW9uIGFtb3VudCcpXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBhY2NlcHQgc3Rha2UgYW1vdW50IGF0IG9yIGFib3ZlIG1pbmltdW0nLCAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXREZWxlZ2F0b3JCdWlsZGVyKCk7XG4gICAgICBjb25zdCBzdGFrZUFtb3VudCA9IEJpZ0ludCg1MDAwMCAqIDFlOSk7XG4gICAgICAoKCkgPT4gYnVpbGRlci5zdGFrZUFtb3VudChzdGFrZUFtb3VudCkpLnNob3VsZC5ub3QudGhyb3coKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3RyYW5zYWN0aW9uIHR5cGUgc3VwcG9ydCcsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGFsbG93IHNldHRpbmcgQWRkUGVybWlzc2lvbmxlc3NEZWxlZ2F0b3IgdHJhbnNhY3Rpb24gdHlwZScsICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldERlbGVnYXRvckJ1aWxkZXIoKTtcbiAgICAgIC8vIFRoZSBidWlsZGVyIHNob3VsZCBzdWNjZXNzZnVsbHkgY29uZmlndXJlIHdpdGggQWRkUGVybWlzc2lvbmxlc3NEZWxlZ2F0b3IgdHlwZVxuICAgICAgLy8gVGhpcyB2ZXJpZmllcyB0cmFuc2FjdGlvbi50cyBzZXRUcmFuc2FjdGlvblR5cGUgYWNjZXB0cyB0aGUgZGVsZWdhdGlvbiB0eXBlXG4gICAgICBidWlsZGVyLnNob3VsZC5iZS5pbnN0YW5jZW9mKFBlcm1pc3Npb25sZXNzRGVsZWdhdG9yVHhCdWlsZGVyKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGF2ZSBjb3JyZWN0IG1pbmltdW0gc3Rha2UgYW1vdW50IGNvbnN0YW50JywgKCkgPT4ge1xuICAgICAgLy8gVmVyaWZ5IHRoZSBtaW5pbXVtIHN0YWtlIGFtb3VudCBpcyA1MDAwMCBGTFIgKGluIG5hbm9GTFIpXG4gICAgICBjb25zdCBtaW5TdGFrZUFtb3VudCA9IEJpZ0ludCg1MDAwMCAqIDFlOSk7XG4gICAgICBtaW5TdGFrZUFtb3VudC5zaG91bGQuZXF1YWwoQmlnSW50KCc1MDAwMDAwMDAwMDAwMCcpKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3JvdW5kLXRyaXAgZGVzZXJpYWxpemF0aW9uJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgZGVzZXJpYWxpemUgYSBzaWduZWQgZGVsZWdhdGlvbiB0cmFuc2FjdGlvbiBmcm9tIGhleCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJhd1R4ID0gdXRpbHMucmVtb3ZlSGV4UHJlZml4KERFTEVHQVRJT05fVFhfMi5zaWduZWRIZXgpO1xuICAgICAgY29uc3QgdHggPSAoYXdhaXQgZmFjdG9yeS5mcm9tKHJhd1R4KS5idWlsZCgpKSBhcyBUcmFuc2FjdGlvbjtcbiAgICAgIHR4LnR5cGUuc2hvdWxkLmVxdWFsKFRyYW5zYWN0aW9uVHlwZS5BZGRQZXJtaXNzaW9ubGVzc0RlbGVnYXRvcik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGNvcnJlY3RseSBleHRyYWN0IGRlbGVnYXRpb24gcGFyYW1ldGVycyBmcm9tIGRlc2VyaWFsaXplZCB0cmFuc2FjdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJhd1R4ID0gdXRpbHMucmVtb3ZlSGV4UHJlZml4KERFTEVHQVRJT05fVFhfMi5zaWduZWRIZXgpO1xuICAgICAgY29uc3QgdHggPSAoYXdhaXQgZmFjdG9yeS5mcm9tKHJhd1R4KS5idWlsZCgpKSBhcyBUcmFuc2FjdGlvbjtcbiAgICAgIGNvbnN0IGV4cGxhbmF0aW9uID0gdHguZXhwbGFpblRyYW5zYWN0aW9uKCk7XG4gICAgICBleHBsYW5hdGlvbi5vdXRwdXRzLmxlbmd0aC5zaG91bGQuYmUuYWJvdmUoMCk7XG4gICAgICBleHBsYW5hdGlvbi5vdXRwdXRBbW91bnQuc2hvdWxkLmVxdWFsKERFTEVHQVRJT05fVFhfMi5zdGFrZUFtb3VudCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlLXNlcmlhbGl6ZSB0byB0aGUgc2FtZSBoZXggKHJvdW5kLXRyaXApJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmF3VHggPSB1dGlscy5yZW1vdmVIZXhQcmVmaXgoREVMRUdBVElPTl9UWF8yLnNpZ25lZEhleCk7XG4gICAgICBjb25zdCB0eCA9IChhd2FpdCBmYWN0b3J5LmZyb20ocmF3VHgpLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuICAgICAgY29uc3QgcmVFbmNvZGVkVHggPSB1dGlscy5yZW1vdmVIZXhQcmVmaXgodHgudG9Ccm9hZGNhc3RGb3JtYXQoKSk7XG5cbiAgICAgIHJlRW5jb2RlZFR4LnNob3VsZC5lcXVhbChyYXdUeCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhdmUgY29ycmVjdCBpbnB1dC9vdXRwdXQgY291bnRzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmF3VHggPSB1dGlscy5yZW1vdmVIZXhQcmVmaXgoREVMRUdBVElPTl9UWF8yLnNpZ25lZEhleCk7XG4gICAgICBjb25zdCB0eCA9IChhd2FpdCBmYWN0b3J5LmZyb20ocmF3VHgpLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuICAgICAgdHguaW5wdXRzLnNob3VsZC5oYXZlLmxlbmd0aCgzKTtcbiAgICAgIHR4Lm91dHB1dHMubGVuZ3RoLnNob3VsZC5iZS5hYm92ZSgwKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2J1aWxkIHdpdGggVVRYT3MgKGNvbXByZWhlbnNpdmUgdGVzdHMpJywgKCkgPT4ge1xuICAgIGNvbnN0IG1vY2tGZWVTdGF0ZSA9IHsgY2FwYWNpdHk6IDEwMDAwMG4sIGV4Y2VzczogMG4sIHByaWNlOiAxMDAwbiwgdGltZXN0YW1wOiAnMTIzNDU2Nzg5MCcgfTtcbiAgICBjb25zdCBNSU5fREVMRUdBVElPTl9EVVJBVElPTiA9IDE0ICogMjQgKiA2MCAqIDYwOyAvLyAxNCBkYXlzICgxMjA5NjAwIHNlY29uZHMpXG4gICAgY29uc3QgTUlOX0RFTEVHQVRJT05fQU1PVU5UID0gQmlnSW50KDUwMDAwICogMWU5KTsgLy8gNTAwMDAgRkxSIGluIG5hbm9GTFJcblxuICAgIGZ1bmN0aW9uIGNyZWF0ZVRlc3RVdHhvcyhhZGRyZXNzZXM6IHN0cmluZ1tdLCB0aHJlc2hvbGQ6IG51bWJlciwgYW1vdW50ID0gJzYwMDAwMDAwMDAwMDAwJykge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAge1xuICAgICAgICAgIG91dHB1dElEOiA3LFxuICAgICAgICAgIHR4aWQ6ICcyTldkOWhyU0drV0pXeVR1NERuU00xcVFTVVQyRFZtOHVxd0ZrNHdRUkZMQW1jc0hReicsXG4gICAgICAgICAgb3V0cHV0aWR4OiAnMCcsXG4gICAgICAgICAgYXNzZXRJRDogQ09OVEVYVC5hdmF4QXNzZXRJRCxcbiAgICAgICAgICBhbW91bnQsXG4gICAgICAgICAgdGhyZXNob2xkLFxuICAgICAgICAgIGFkZHJlc3NlcyxcbiAgICAgICAgICBsb2NrdGltZTogJzAnLFxuICAgICAgICB9LFxuICAgICAgXTtcbiAgICB9XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGRlbGVnYXRpb24gdHJhbnNhY3Rpb24gd2l0aCB0aHJlc2hvbGQ9MiBhbmQgMyBhZGRyZXNzZXMgKEJpdEdvIDItb2YtMyBtdWx0aXNpZyknLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXREZWxlZ2F0b3JCdWlsZGVyKCk7XG4gICAgICBjb25zdCBub3cgPSBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKTtcbiAgICAgIGNvbnN0IHZhbGlkTm9kZUlEID0gJ05vZGVJRC1BSzdzUEJzWk05clF3c2UyM2FMaEVFQlBIWkQ1Z2tMckwnO1xuXG4gICAgICBjb25zdCBhZGRyZXNzZXMgPSBbU0VFRF9BQ0NPVU5ULmFkZHJlc3NUZXN0bmV0LCBBQ0NPVU5UXzEuYWRkcmVzc1Rlc3RuZXQsIEFDQ09VTlRfMy5hZGRyZXNzXTtcbiAgICAgIGNvbnN0IHV0eG9zID0gY3JlYXRlVGVzdFV0eG9zKGFkZHJlc3NlcywgMik7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlclxuICAgICAgICAubm9kZUlEKHZhbGlkTm9kZUlEKVxuICAgICAgICAuc3RhcnRUaW1lKG5vdyArIDYwKVxuICAgICAgICAuZW5kVGltZShub3cgKyBNSU5fREVMRUdBVElPTl9EVVJBVElPTilcbiAgICAgICAgLnN0YWtlQW1vdW50KE1JTl9ERUxFR0FUSU9OX0FNT1VOVClcbiAgICAgICAgLmZyb21QdWJLZXkoYWRkcmVzc2VzKVxuICAgICAgICAuZGVjb2RlZFV0eG9zKHV0eG9zKVxuICAgICAgICAuZmVlU3RhdGUobW9ja0ZlZVN0YXRlKVxuICAgICAgICAuY29udGV4dChDT05URVhUIGFzIGFueSlcbiAgICAgICAgLmJ1aWxkKCk7XG5cbiAgICAgIHR4LnNob3VsZC5iZS5pbnN0YW5jZW9mKFRyYW5zYWN0aW9uKTtcbiAgICAgIHR4LnR5cGUuc2hvdWxkLmVxdWFsKFRyYW5zYWN0aW9uVHlwZS5BZGRQZXJtaXNzaW9ubGVzc0RlbGVnYXRvcik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGRlbGVnYXRpb24gdHJhbnNhY3Rpb24gd2l0aCB0aHJlc2hvbGQ9MiBhbmQgMiBhZGRyZXNzZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXREZWxlZ2F0b3JCdWlsZGVyKCk7XG4gICAgICBjb25zdCBub3cgPSBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKTtcbiAgICAgIGNvbnN0IHZhbGlkTm9kZUlEID0gJ05vZGVJRC1BSzdzUEJzWk05clF3c2UyM2FMaEVFQlBIWkQ1Z2tMckwnO1xuXG4gICAgICBjb25zdCBhZGRyZXNzZXMgPSBbU0VFRF9BQ0NPVU5ULmFkZHJlc3NUZXN0bmV0LCBBQ0NPVU5UXzEuYWRkcmVzc1Rlc3RuZXRdO1xuICAgICAgY29uc3QgdXR4b3MgPSBjcmVhdGVUZXN0VXR4b3MoYWRkcmVzc2VzLCAyKTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyXG4gICAgICAgIC5ub2RlSUQodmFsaWROb2RlSUQpXG4gICAgICAgIC5zdGFydFRpbWUobm93ICsgNjApXG4gICAgICAgIC5lbmRUaW1lKG5vdyArIE1JTl9ERUxFR0FUSU9OX0RVUkFUSU9OKVxuICAgICAgICAuc3Rha2VBbW91bnQoTUlOX0RFTEVHQVRJT05fQU1PVU5UKVxuICAgICAgICAuZnJvbVB1YktleShhZGRyZXNzZXMpXG4gICAgICAgIC5kZWNvZGVkVXR4b3ModXR4b3MpXG4gICAgICAgIC5mZWVTdGF0ZShtb2NrRmVlU3RhdGUpXG4gICAgICAgIC5jb250ZXh0KENPTlRFWFQgYXMgYW55KVxuICAgICAgICAuYnVpbGQoKTtcblxuICAgICAgdHguc2hvdWxkLmJlLmluc3RhbmNlb2YoVHJhbnNhY3Rpb24pO1xuICAgICAgdHgudHlwZS5zaG91bGQuZXF1YWwoVHJhbnNhY3Rpb25UeXBlLkFkZFBlcm1pc3Npb25sZXNzRGVsZWdhdG9yKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB3aGVuIFVUWE8gYW1vdW50IGlzIGluc3VmZmljaWVudCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldERlbGVnYXRvckJ1aWxkZXIoKTtcbiAgICAgIGNvbnN0IG5vdyA9IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApO1xuICAgICAgY29uc3QgdmFsaWROb2RlSUQgPSAnTm9kZUlELUFLN3NQQnNaTTlyUXdzZTIzYUxoRUVCUEhaRDVna0xyTCc7XG5cbiAgICAgIGNvbnN0IGFkZHJlc3NlcyA9IFtTRUVEX0FDQ09VTlQuYWRkcmVzc1Rlc3RuZXQsIEFDQ09VTlRfMS5hZGRyZXNzVGVzdG5ldF07XG4gICAgICBjb25zdCB1dHhvcyA9IGNyZWF0ZVRlc3RVdHhvcyhhZGRyZXNzZXMsIDIsICcxMDAwMDAwMDAwMDAwJyk7XG5cbiAgICAgIGF3YWl0IGJ1aWxkZXJcbiAgICAgICAgLm5vZGVJRCh2YWxpZE5vZGVJRClcbiAgICAgICAgLnN0YXJ0VGltZShub3cgKyA2MClcbiAgICAgICAgLmVuZFRpbWUobm93ICsgTUlOX0RFTEVHQVRJT05fRFVSQVRJT04pXG4gICAgICAgIC5zdGFrZUFtb3VudChNSU5fREVMRUdBVElPTl9BTU9VTlQpXG4gICAgICAgIC5mcm9tUHViS2V5KGFkZHJlc3NlcylcbiAgICAgICAgLmRlY29kZWRVdHhvcyh1dHhvcylcbiAgICAgICAgLmZlZVN0YXRlKG1vY2tGZWVTdGF0ZSlcbiAgICAgICAgLmNvbnRleHQoQ09OVEVYVCBhcyBhbnkpXG4gICAgICAgIC5idWlsZCgpXG4gICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgZGVsZWdhdGlvbiB3aXRoIG11bHRpcGxlIFVUWE9zJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0RGVsZWdhdG9yQnVpbGRlcigpO1xuICAgICAgY29uc3Qgbm93ID0gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCk7XG4gICAgICBjb25zdCB2YWxpZE5vZGVJRCA9ICdOb2RlSUQtQUs3c1BCc1pNOXJRd3NlMjNhTGhFRUJQSFpENWdrTHJMJztcblxuICAgICAgY29uc3QgYWRkcmVzc2VzID0gW1NFRURfQUNDT1VOVC5hZGRyZXNzVGVzdG5ldCwgQUNDT1VOVF8xLmFkZHJlc3NUZXN0bmV0LCBBQ0NPVU5UXzMuYWRkcmVzc107XG4gICAgICAvLyBDcmVhdGUgbXVsdGlwbGUgVVRYT3Mgd2l0aCBkaWZmZXJlbnQgdHhpZHNcbiAgICAgIGNvbnN0IHV0eG9zID0gW1xuICAgICAgICB7XG4gICAgICAgICAgb3V0cHV0SUQ6IDcsXG4gICAgICAgICAgdHhpZDogJzJOV2Q5aHJTR2tXSld5VHU0RG5TTTFxUVNVVDJEVm04dXF3Rms0d1FSRkxBbWNzSFF6JyxcbiAgICAgICAgICBvdXRwdXRpZHg6ICcwJyxcbiAgICAgICAgICBhc3NldElEOiBDT05URVhULmF2YXhBc3NldElELFxuICAgICAgICAgIGFtb3VudDogJzMwMDAwMDAwMDAwMDAwJywgLy8gMzBrIEZMUlxuICAgICAgICAgIHRocmVzaG9sZDogMixcbiAgICAgICAgICBhZGRyZXNzZXMsXG4gICAgICAgICAgbG9ja3RpbWU6ICcwJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG91dHB1dElEOiA3LFxuICAgICAgICAgIHR4aWQ6ICcya1NTSFdLWkg3dUoxRmZTcGdSYVBmZ1BwblQ0OTE1UVZYUEFNdzZIamZGUVZKMVFGeCcsXG4gICAgICAgICAgb3V0cHV0aWR4OiAnMCcsXG4gICAgICAgICAgYXNzZXRJRDogQ09OVEVYVC5hdmF4QXNzZXRJRCxcbiAgICAgICAgICBhbW91bnQ6ICcyNTAwMDAwMDAwMDAwMCcsIC8vIDI1ayBGTFJcbiAgICAgICAgICB0aHJlc2hvbGQ6IDIsXG4gICAgICAgICAgYWRkcmVzc2VzLFxuICAgICAgICAgIGxvY2t0aW1lOiAnMCcsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBvdXRwdXRJRDogNyxcbiAgICAgICAgICB0eGlkOiAnMkU2WHVxZjNpNlRud0g2emp0NEs2ak5EUjJvb2oxRFRKcFRGWjZTZ1paa1JKNEFEU2UnLFxuICAgICAgICAgIG91dHB1dGlkeDogJzAnLFxuICAgICAgICAgIGFzc2V0SUQ6IENPTlRFWFQuYXZheEFzc2V0SUQsXG4gICAgICAgICAgYW1vdW50OiAnMTAwMDAwMDAwMDAwMDAnLCAvLyAxMGsgRkxSXG4gICAgICAgICAgdGhyZXNob2xkOiAyLFxuICAgICAgICAgIGFkZHJlc3NlcyxcbiAgICAgICAgICBsb2NrdGltZTogJzAnLFxuICAgICAgICB9LFxuICAgICAgXTtcbiAgICAgIC8vIFRvdGFsOiA2NWsgRkxSID4gNTBrIG1pbmltdW1cblxuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyXG4gICAgICAgIC5ub2RlSUQodmFsaWROb2RlSUQpXG4gICAgICAgIC5zdGFydFRpbWUobm93ICsgNjApXG4gICAgICAgIC5lbmRUaW1lKG5vdyArIE1JTl9ERUxFR0FUSU9OX0RVUkFUSU9OKVxuICAgICAgICAuc3Rha2VBbW91bnQoTUlOX0RFTEVHQVRJT05fQU1PVU5UKVxuICAgICAgICAuZnJvbVB1YktleShhZGRyZXNzZXMpXG4gICAgICAgIC5kZWNvZGVkVXR4b3ModXR4b3MpXG4gICAgICAgIC5mZWVTdGF0ZShtb2NrRmVlU3RhdGUpXG4gICAgICAgIC5jb250ZXh0KENPTlRFWFQgYXMgYW55KVxuICAgICAgICAuYnVpbGQoKTtcblxuICAgICAgdHguc2hvdWxkLmJlLmluc3RhbmNlb2YoVHJhbnNhY3Rpb24pO1xuICAgICAgdHgudHlwZS5zaG91bGQuZXF1YWwoVHJhbnNhY3Rpb25UeXBlLkFkZFBlcm1pc3Npb25sZXNzRGVsZWdhdG9yKTtcbiAgICAgIC8vIEZsYXJlSlMgb3B0aW1pemVzIHRvIHVzZSBtaW5pbXVtIFVUWE9zIG5lZWRlZCwgbWF5IG5vdCBjb25zdW1lIGFsbCAzXG4gICAgICB0eC5pbnB1dHMubGVuZ3RoLnNob3VsZC5iZS5ncmVhdGVyVGhhbigwKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFZlcmlmaWVzIGZpeCBmb3IgRmxhcmVKUyBCdWcgLSBDaGFuZ2Ugb3V0cHV0IHRocmVzaG9sZFxuICAgICAqXG4gICAgICogRmxhcmVKUydzIHB2bS5lLm5ld0FkZFBlcm1pc3Npb25sZXNzRGVsZWdhdG9yVHgoKSBkZWZhdWx0cyBjaGFuZ2Ugb3V0cHV0cyB0byB0aHJlc2hvbGQ9MS5cbiAgICAgKiBXZSBpbXBsZW1lbnQgYSBmaXggKHNpbWlsYXIgdG8gRXhwb3J0SW5QVHhCdWlsZGVyKSB0byBjb3JyZWN0IGNoYW5nZSBvdXRwdXRzIHRvIHRocmVzaG9sZD0yXG4gICAgICogZm9yIG11bHRpc2lnIHdhbGxldHMsIG1haW50YWluaW5nIHNlY3VyaXR5LlxuICAgICAqL1xuICAgIGl0KCdzaG91bGQgY3JlYXRlIGNoYW5nZSBvdXRwdXQgd2l0aCB0aHJlc2hvbGQ9MiBmb3IgbXVsdGlzaWcgd2FsbGV0IChidWcgZml4ZWQpJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0RGVsZWdhdG9yQnVpbGRlcigpO1xuICAgICAgY29uc3Qgbm93ID0gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCk7XG4gICAgICBjb25zdCB2YWxpZE5vZGVJRCA9ICdOb2RlSUQtQUs3c1BCc1pNOXJRd3NlMjNhTGhFRUJQSFpENWdrTHJMJztcblxuICAgICAgY29uc3QgYWRkcmVzc2VzID0gW1NFRURfQUNDT1VOVC5hZGRyZXNzVGVzdG5ldCwgQUNDT1VOVF8xLmFkZHJlc3NUZXN0bmV0LCBBQ0NPVU5UXzMuYWRkcmVzc107XG4gICAgICBjb25zdCB1dHhvcyA9IGNyZWF0ZVRlc3RVdHhvcyhhZGRyZXNzZXMsIDIsICc2MDAwMDAwMDAwMDAwMCcpOyAvLyA2MGsgRkxSXG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlclxuICAgICAgICAubm9kZUlEKHZhbGlkTm9kZUlEKVxuICAgICAgICAuc3RhcnRUaW1lKG5vdyArIDYwKVxuICAgICAgICAuZW5kVGltZShub3cgKyBNSU5fREVMRUdBVElPTl9EVVJBVElPTilcbiAgICAgICAgLnN0YWtlQW1vdW50KE1JTl9ERUxFR0FUSU9OX0FNT1VOVCkgLy8gU3Rha2UgNTBrXG4gICAgICAgIC5mcm9tUHViS2V5KGFkZHJlc3NlcylcbiAgICAgICAgLmRlY29kZWRVdHhvcyh1dHhvcylcbiAgICAgICAgLmZlZVN0YXRlKG1vY2tGZWVTdGF0ZSlcbiAgICAgICAgLmNvbnRleHQoQ09OVEVYVCBhcyBhbnkpXG4gICAgICAgIC5idWlsZCgpO1xuXG4gICAgICAvLyBWZXJpZnkgY2hhbmdlIGV4aXN0cyB1c2luZyBleHBsYWluVHJhbnNhY3Rpb25cbiAgICAgIGNvbnN0IGV4cGxhbmF0aW9uID0gdHguZXhwbGFpblRyYW5zYWN0aW9uKCk7XG4gICAgICBjb25zdCBjaGFuZ2VBbW91bnQgPSBCaWdJbnQoZXhwbGFuYXRpb24uY2hhbmdlQW1vdW50KTtcbiAgICAgIE51bWJlcihjaGFuZ2VBbW91bnQpLnNob3VsZC5iZS5ncmVhdGVyVGhhbihcbiAgICAgICAgTnVtYmVyKEJpZ0ludCgnOTAwMDAwMDAwMDAwMCcpKSxcbiAgICAgICAgJ1Nob3VsZCBoYXZlIGNoYW5nZSAoYXQgbGVhc3QgOWsgYWZ0ZXIgZmVlcyknXG4gICAgICApO1xuXG4gICAgICBleHBsYW5hdGlvbi5jaGFuZ2VPdXRwdXRzLmxlbmd0aC5zaG91bGQuYmUuZ3JlYXRlclRoYW4oMCwgJ1Nob3VsZCBoYXZlIGNoYW5nZSBvdXRwdXRzJyk7XG5cbiAgICAgIC8vIFZlcmlmeSB0aGUgZml4OiBjaGFuZ2Ugb3V0cHV0cyBzaG91bGQgbm93IGhhdmUgdGhyZXNob2xkPTJcbiAgICAgIGNvbnN0IGZsYXJlVHJhbnNhY3Rpb24gPSAodHggYXMgYW55KS5fZmxhcmVUcmFuc2FjdGlvbiBhcyBhbnk7XG4gICAgICBjb25zdCBpbm5lclR4ID0gZmxhcmVUcmFuc2FjdGlvbi5nZXRUeCgpO1xuICAgICAgY29uc3QgY2hhbmdlT3V0cHV0cyA9IGlubmVyVHguYmFzZVR4Lm91dHB1dHM7XG5cbiAgICAgIGNoYW5nZU91dHB1dHMuZm9yRWFjaCgob3V0cHV0OiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgdHJhbnNmZXJPdXQgPSBvdXRwdXQub3V0cHV0O1xuICAgICAgICBjb25zdCB0aHJlc2hvbGQgPSB0cmFuc2Zlck91dC5vdXRwdXRPd25lcnMudGhyZXNob2xkLnZhbHVlKCk7XG4gICAgICAgIHRocmVzaG9sZC5zaG91bGQuZXF1YWwoMiwgJ0NoYW5nZSBvdXRwdXQgc2hvdWxkIGhhdmUgdGhyZXNob2xkPTIgKGJ1ZyBmaXhlZCEpJyk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGF2ZSBjaGFuZ2Ugb3V0cHV0IGFkZHJlc3NlcyBtYXRjaGluZyB3YWxsZXQgYWRkcmVzc2VzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0RGVsZWdhdG9yQnVpbGRlcigpO1xuICAgICAgY29uc3Qgbm93ID0gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCk7XG4gICAgICBjb25zdCB2YWxpZE5vZGVJRCA9ICdOb2RlSUQtQUs3c1BCc1pNOXJRd3NlMjNhTGhFRUJQSFpENWdrTHJMJztcblxuICAgICAgY29uc3QgYWRkcmVzc2VzID0gW1NFRURfQUNDT1VOVC5hZGRyZXNzVGVzdG5ldCwgQUNDT1VOVF8xLmFkZHJlc3NUZXN0bmV0LCBBQ0NPVU5UXzMuYWRkcmVzc107XG4gICAgICBjb25zdCB1dHhvcyA9IGNyZWF0ZVRlc3RVdHhvcyhhZGRyZXNzZXMsIDIsICc2MDAwMDAwMDAwMDAwMCcpO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXJcbiAgICAgICAgLm5vZGVJRCh2YWxpZE5vZGVJRClcbiAgICAgICAgLnN0YXJ0VGltZShub3cgKyA2MClcbiAgICAgICAgLmVuZFRpbWUobm93ICsgTUlOX0RFTEVHQVRJT05fRFVSQVRJT04pXG4gICAgICAgIC5zdGFrZUFtb3VudChNSU5fREVMRUdBVElPTl9BTU9VTlQpXG4gICAgICAgIC5mcm9tUHViS2V5KGFkZHJlc3NlcylcbiAgICAgICAgLmRlY29kZWRVdHhvcyh1dHhvcylcbiAgICAgICAgLmZlZVN0YXRlKG1vY2tGZWVTdGF0ZSlcbiAgICAgICAgLmNvbnRleHQoQ09OVEVYVCBhcyBhbnkpXG4gICAgICAgIC5idWlsZCgpO1xuXG4gICAgICAvLyBWZXJpZnkgY2hhbmdlIGV4aXN0cyBhbmQgYWRkcmVzc2VzIG1hdGNoIHVzaW5nIGV4cGxhaW5UcmFuc2FjdGlvblxuICAgICAgY29uc3QgZXhwbGFuYXRpb24gPSB0eC5leHBsYWluVHJhbnNhY3Rpb24oKTtcbiAgICAgIGNvbnN0IGNoYW5nZUFtb3VudCA9IEJpZ0ludChleHBsYW5hdGlvbi5jaGFuZ2VBbW91bnQpO1xuICAgICAgTnVtYmVyKGNoYW5nZUFtb3VudCkuc2hvdWxkLmJlLmdyZWF0ZXJUaGFuKDAsICdTaG91bGQgaGF2ZSBjaGFuZ2Ugb3V0cHV0Jyk7XG5cbiAgICAgIGV4cGxhbmF0aW9uLmNoYW5nZU91dHB1dHMubGVuZ3RoLnNob3VsZC5iZS5ncmVhdGVyVGhhbigwKTtcblxuICAgICAgLy8gVmVyaWZ5IGNoYW5nZSBvdXRwdXQgYWRkcmVzc2VzIG1hdGNoIHdhbGxldCBhZGRyZXNzZXMgKHNvcnRlZClcbiAgICAgIGNvbnN0IHNvcnRlZEZyb21BZGRyZXNzZXMgPSAodHggYXMgVHJhbnNhY3Rpb24pLmZyb21BZGRyZXNzZXMuc2xpY2UoKS5zb3J0KCkuam9pbignficpO1xuXG4gICAgICBleHBsYW5hdGlvbi5jaGFuZ2VPdXRwdXRzLmZvckVhY2goKG91dHB1dCkgPT4ge1xuICAgICAgICBvdXRwdXQuYWRkcmVzcy5zaG91bGQuZXF1YWwoc29ydGVkRnJvbUFkZHJlc3NlcywgJ0NoYW5nZSBvdXRwdXQgYWRkcmVzc2VzIHNob3VsZCBtYXRjaCB3YWxsZXQgYWRkcmVzc2VzJyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ211bHRpcGxlIGRlbGVnYXRpb25zIHRvIHNhbWUgdmFsaWRhdG9yJywgKCkgPT4ge1xuICAgIGNvbnN0IG1vY2tGZWVTdGF0ZSA9IHsgY2FwYWNpdHk6IDEwMDAwMG4sIGV4Y2VzczogMG4sIHByaWNlOiAxMDAwbiwgdGltZXN0YW1wOiAnMTIzNDU2Nzg5MCcgfTtcbiAgICBjb25zdCBNSU5fREVMRUdBVElPTl9EVVJBVElPTiA9IDE0ICogMjQgKiA2MCAqIDYwO1xuICAgIGNvbnN0IE1JTl9ERUxFR0FUSU9OX0FNT1VOVCA9IEJpZ0ludCg1MDAwMCAqIDFlOSk7XG5cbiAgICBpdCgnc2hvdWxkIHN1cHBvcnQgY3JlYXRpbmcgbXVsdGlwbGUgZGVsZWdhdGlvbnMgdG8gc2FtZSB2YWxpZGF0b3Igd2l0aCBkaWZmZXJlbnQgdGltZSBwZXJpb2RzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgbm93ID0gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCk7XG4gICAgICBjb25zdCB2YWxpZE5vZGVJRCA9ICdOb2RlSUQtQUs3c1BCc1pNOXJRd3NlMjNhTGhFRUJQSFpENWdrTHJMJztcbiAgICAgIGNvbnN0IGFkZHJlc3NlcyA9IFtTRUVEX0FDQ09VTlQuYWRkcmVzc1Rlc3RuZXQsIEFDQ09VTlRfMS5hZGRyZXNzVGVzdG5ldCwgQUNDT1VOVF8zLmFkZHJlc3NdO1xuXG4gICAgICAvLyBGaXJzdCBkZWxlZ2F0aW9uOiBKYW4gMSAtIE1hciAxXG4gICAgICBjb25zdCBidWlsZGVyMSA9IGZhY3RvcnkuZ2V0RGVsZWdhdG9yQnVpbGRlcigpO1xuICAgICAgY29uc3QgdXR4b3MxID0gW1xuICAgICAgICB7XG4gICAgICAgICAgb3V0cHV0SUQ6IDcsXG4gICAgICAgICAgdHhpZDogJzJOV2Q5aHJTR2tXSld5VHU0RG5TTTFxUVNVVDJEVm04dXF3Rms0d1FSRkxBbWNzSFF6JyxcbiAgICAgICAgICBvdXRwdXRpZHg6ICcwJyxcbiAgICAgICAgICBhc3NldElEOiBDT05URVhULmF2YXhBc3NldElELFxuICAgICAgICAgIGFtb3VudDogJzEwMDAwMDAwMDAwMDAwMCcsIC8vIDEwMGsgRkxSXG4gICAgICAgICAgdGhyZXNob2xkOiAyLFxuICAgICAgICAgIGFkZHJlc3NlcyxcbiAgICAgICAgICBsb2NrdGltZTogJzAnLFxuICAgICAgICB9LFxuICAgICAgXTtcblxuICAgICAgY29uc3QgdHgxID0gYXdhaXQgYnVpbGRlcjFcbiAgICAgICAgLm5vZGVJRCh2YWxpZE5vZGVJRClcbiAgICAgICAgLnN0YXJ0VGltZShub3cgKyA2MClcbiAgICAgICAgLmVuZFRpbWUobm93ICsgNjAgKyBNSU5fREVMRUdBVElPTl9EVVJBVElPTilcbiAgICAgICAgLnN0YWtlQW1vdW50KE1JTl9ERUxFR0FUSU9OX0FNT1VOVCkgLy8gNTBrXG4gICAgICAgIC5mcm9tUHViS2V5KGFkZHJlc3NlcylcbiAgICAgICAgLmRlY29kZWRVdHhvcyh1dHhvczEpXG4gICAgICAgIC5mZWVTdGF0ZShtb2NrRmVlU3RhdGUpXG4gICAgICAgIC5jb250ZXh0KENPTlRFWFQgYXMgYW55KVxuICAgICAgICAuYnVpbGQoKTtcblxuICAgICAgdHgxLnNob3VsZC5iZS5pbnN0YW5jZW9mKFRyYW5zYWN0aW9uKTtcbiAgICAgIHR4MS50eXBlLnNob3VsZC5lcXVhbChUcmFuc2FjdGlvblR5cGUuQWRkUGVybWlzc2lvbmxlc3NEZWxlZ2F0b3IpO1xuXG4gICAgICAvLyBTZWNvbmQgZGVsZWdhdGlvbjogRmViIDEgLSBBcHIgMSAob3ZlcmxhcHBpbmcgcGVyaW9kLCBkaWZmZXJlbnQgc3RhcnQvZW5kKVxuICAgICAgLy8gU2ltdWxhdGluZyB1c2luZyBhIGRpZmZlcmVudCBVVFhPIChpbiBwcmFjdGljZSwgY291bGQgYmUgY2hhbmdlIGZyb20gZmlyc3QgZGVsZWdhdGlvbilcbiAgICAgIGNvbnN0IGJ1aWxkZXIyID0gZmFjdG9yeS5nZXREZWxlZ2F0b3JCdWlsZGVyKCk7XG4gICAgICBjb25zdCB1dHhvczIgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBvdXRwdXRJRDogNyxcbiAgICAgICAgICB0eGlkOiAnMlF0dHVFMU1OUlBFdkxQZGhCOHQ2V3BDOTFWS2Z2aWdIdmYxUEtyTlE2QkdnQjZoWncnLCAvLyBWYWxpZCBDQjU4IHR4aWRcbiAgICAgICAgICBvdXRwdXRpZHg6ICcwJyxcbiAgICAgICAgICBhc3NldElEOiBDT05URVhULmF2YXhBc3NldElELFxuICAgICAgICAgIGFtb3VudDogJzUwMDEwMDAwMDAwMDAwJywgLy8gNTAwMTAgRkxSICg1MGsgc3Rha2UgKyBleHRyYSBmb3IgZmVlcylcbiAgICAgICAgICB0aHJlc2hvbGQ6IDIsXG4gICAgICAgICAgYWRkcmVzc2VzLFxuICAgICAgICAgIGxvY2t0aW1lOiAnMCcsXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICBjb25zdCB0eDIgPSBhd2FpdCBidWlsZGVyMlxuICAgICAgICAubm9kZUlEKHZhbGlkTm9kZUlEKSAvLyBTYW1lIHZhbGlkYXRvciFcbiAgICAgICAgLnN0YXJ0VGltZShub3cgKyA2MCArIDMwICogMjQgKiA2MCAqIDYwKSAvLyAzMCBkYXlzIGxhdGVyXG4gICAgICAgIC5lbmRUaW1lKG5vdyArIDYwICsgMzAgKiAyNCAqIDYwICogNjAgKyBNSU5fREVMRUdBVElPTl9EVVJBVElPTilcbiAgICAgICAgLnN0YWtlQW1vdW50KE1JTl9ERUxFR0FUSU9OX0FNT1VOVCkgLy8gQW5vdGhlciA1MGtcbiAgICAgICAgLmZyb21QdWJLZXkoYWRkcmVzc2VzKVxuICAgICAgICAuZGVjb2RlZFV0eG9zKHV0eG9zMilcbiAgICAgICAgLmZlZVN0YXRlKG1vY2tGZWVTdGF0ZSlcbiAgICAgICAgLmNvbnRleHQoQ09OVEVYVCBhcyBhbnkpXG4gICAgICAgIC5idWlsZCgpO1xuXG4gICAgICB0eDIuc2hvdWxkLmJlLmluc3RhbmNlb2YoVHJhbnNhY3Rpb24pO1xuICAgICAgdHgyLnR5cGUuc2hvdWxkLmVxdWFsKFRyYW5zYWN0aW9uVHlwZS5BZGRQZXJtaXNzaW9ubGVzc0RlbGVnYXRvcik7XG5cbiAgICAgIC8vIEJvdGggdHJhbnNhY3Rpb25zIHNob3VsZCBiZSB2YWxpZCBhbmQgaW5kZXBlbmRlbnRcbiAgICAgIHR4MS5pZC5zaG91bGQubm90LmVxdWFsKHR4Mi5pZCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHN1cHBvcnQgc2VxdWVudGlhbCBkZWxlZ2F0aW9ucyAob25lIGVuZHMsIG5leHQgYmVnaW5zKScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IG5vdyA9IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApO1xuICAgICAgY29uc3QgdmFsaWROb2RlSUQgPSAnTm9kZUlELUFLN3NQQnNaTTlyUXdzZTIzYUxoRUVCUEhaRDVna0xyTCc7XG4gICAgICBjb25zdCBhZGRyZXNzZXMgPSBbU0VFRF9BQ0NPVU5ULmFkZHJlc3NUZXN0bmV0LCBBQ0NPVU5UXzEuYWRkcmVzc1Rlc3RuZXQsIEFDQ09VTlRfMy5hZGRyZXNzXTtcblxuICAgICAgY29uc3QgdXR4b3MgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBvdXRwdXRJRDogNyxcbiAgICAgICAgICB0eGlkOiAnMk5XZDloclNHa1dKV3lUdTREblNNMXFRU1VUMkRWbTh1cXdGazR3UVJGTEFtY3NIUXonLFxuICAgICAgICAgIG91dHB1dGlkeDogJzAnLFxuICAgICAgICAgIGFzc2V0SUQ6IENPTlRFWFQuYXZheEFzc2V0SUQsXG4gICAgICAgICAgYW1vdW50OiAnMTAwMDAwMDAwMDAwMDAwJyxcbiAgICAgICAgICB0aHJlc2hvbGQ6IDIsXG4gICAgICAgICAgYWRkcmVzc2VzLFxuICAgICAgICAgIGxvY2t0aW1lOiAnMCcsXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICAvLyBGaXJzdCBkZWxlZ2F0aW9uXG4gICAgICBjb25zdCBidWlsZGVyMSA9IGZhY3RvcnkuZ2V0RGVsZWdhdG9yQnVpbGRlcigpO1xuICAgICAgY29uc3QgZGVsZWdhdGlvbjFFbmRUaW1lID0gbm93ICsgNjAgKyBNSU5fREVMRUdBVElPTl9EVVJBVElPTjtcblxuICAgICAgY29uc3QgdHgxID0gYXdhaXQgYnVpbGRlcjFcbiAgICAgICAgLm5vZGVJRCh2YWxpZE5vZGVJRClcbiAgICAgICAgLnN0YXJ0VGltZShub3cgKyA2MClcbiAgICAgICAgLmVuZFRpbWUoZGVsZWdhdGlvbjFFbmRUaW1lKVxuICAgICAgICAuc3Rha2VBbW91bnQoTUlOX0RFTEVHQVRJT05fQU1PVU5UKVxuICAgICAgICAuZnJvbVB1YktleShhZGRyZXNzZXMpXG4gICAgICAgIC5kZWNvZGVkVXR4b3ModXR4b3MpXG4gICAgICAgIC5mZWVTdGF0ZShtb2NrRmVlU3RhdGUpXG4gICAgICAgIC5jb250ZXh0KENPTlRFWFQgYXMgYW55KVxuICAgICAgICAuYnVpbGQoKTtcblxuICAgICAgLy8gU2Vjb25kIGRlbGVnYXRpb24gc3RhcnRzIHJpZ2h0IGFmdGVyIGZpcnN0IG9uZSBlbmRzXG4gICAgICBjb25zdCBidWlsZGVyMiA9IGZhY3RvcnkuZ2V0RGVsZWdhdG9yQnVpbGRlcigpO1xuICAgICAgY29uc3QgdXR4b3MyID0gW1xuICAgICAgICB7XG4gICAgICAgICAgb3V0cHV0SUQ6IDcsXG4gICAgICAgICAgdHhpZDogJzJLOXJnaUVnc0VjVDNkQjlFeWR1RUhGcTdnNHNIUUJNa3MxNlZVUUFyVlJpZUJROVc1JywgLy8gVmFsaWQgQ0I1OCB0eGlkXG4gICAgICAgICAgb3V0cHV0aWR4OiAnMCcsXG4gICAgICAgICAgYXNzZXRJRDogQ09OVEVYVC5hdmF4QXNzZXRJRCxcbiAgICAgICAgICBhbW91bnQ6ICc1MDAxMDAwMDAwMDAwMCcsIC8vIDUwMDEwIEZMUiAoNTBrIHN0YWtlICsgZXh0cmEgZm9yIGZlZXMpXG4gICAgICAgICAgdGhyZXNob2xkOiAyLFxuICAgICAgICAgIGFkZHJlc3NlcyxcbiAgICAgICAgICBsb2NrdGltZTogJzAnLFxuICAgICAgICB9LFxuICAgICAgXTtcblxuICAgICAgY29uc3QgdHgyID0gYXdhaXQgYnVpbGRlcjJcbiAgICAgICAgLm5vZGVJRCh2YWxpZE5vZGVJRClcbiAgICAgICAgLnN0YXJ0VGltZShkZWxlZ2F0aW9uMUVuZFRpbWUgKyAxKSAvLyBTdGFydHMgMSBzZWNvbmQgYWZ0ZXIgZmlyc3QgZW5kc1xuICAgICAgICAuZW5kVGltZShkZWxlZ2F0aW9uMUVuZFRpbWUgKyAxICsgTUlOX0RFTEVHQVRJT05fRFVSQVRJT04pXG4gICAgICAgIC5zdGFrZUFtb3VudChNSU5fREVMRUdBVElPTl9BTU9VTlQpXG4gICAgICAgIC5mcm9tUHViS2V5KGFkZHJlc3NlcylcbiAgICAgICAgLmRlY29kZWRVdHhvcyh1dHhvczIpXG4gICAgICAgIC5mZWVTdGF0ZShtb2NrRmVlU3RhdGUpXG4gICAgICAgIC5jb250ZXh0KENPTlRFWFQgYXMgYW55KVxuICAgICAgICAuYnVpbGQoKTtcblxuICAgICAgdHgxLnNob3VsZC5iZS5pbnN0YW5jZW9mKFRyYW5zYWN0aW9uKTtcbiAgICAgIHR4Mi5zaG91bGQuYmUuaW5zdGFuY2VvZihUcmFuc2FjdGlvbik7XG4gICAgICB0eDEuaWQuc2hvdWxkLm5vdC5lcXVhbCh0eDIuaWQpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnc2lnbmluZyBtdWx0aXNpZyBkZWxlZ2F0aW9uIHRyYW5zYWN0aW9ucycsICgpID0+IHtcbiAgICBjb25zdCBtb2NrRmVlU3RhdGUgPSB7IGNhcGFjaXR5OiAxMDAwMDBuLCBleGNlc3M6IDBuLCBwcmljZTogMTAwMG4sIHRpbWVzdGFtcDogJzEyMzQ1Njc4OTAnIH07XG4gICAgY29uc3QgTUlOX0RFTEVHQVRJT05fRFVSQVRJT04gPSAxNCAqIDI0ICogNjAgKiA2MDtcbiAgICBjb25zdCBNSU5fREVMRUdBVElPTl9BTU9VTlQgPSBCaWdJbnQoNTAwMDAgKiAxZTkpO1xuXG4gICAgaXQoJ3Nob3VsZCBzdWNjZXNzZnVsbHkgc2lnbiBkZWxlZ2F0aW9uIHRyYW5zYWN0aW9uIHdpdGggdGhyZXNob2xkPTIgbXVsdGlzaWcgd2FsbGV0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0RGVsZWdhdG9yQnVpbGRlcigpO1xuICAgICAgY29uc3Qgbm93ID0gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCk7XG4gICAgICBjb25zdCB2YWxpZE5vZGVJRCA9ICdOb2RlSUQtQUs3c1BCc1pNOXJRd3NlMjNhTGhFRUJQSFpENWdrTHJMJztcblxuICAgICAgY29uc3QgYWRkcmVzc2VzID0gW1NFRURfQUNDT1VOVC5hZGRyZXNzVGVzdG5ldCwgQUNDT1VOVF8xLmFkZHJlc3NUZXN0bmV0LCBBQ0NPVU5UXzMuYWRkcmVzc107XG4gICAgICBjb25zdCB1dHhvcyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIG91dHB1dElEOiA3LFxuICAgICAgICAgIHR4aWQ6ICcyTldkOWhyU0drV0pXeVR1NERuU00xcVFTVVQyRFZtOHVxd0ZrNHdRUkZMQW1jc0hReicsXG4gICAgICAgICAgb3V0cHV0aWR4OiAnMCcsXG4gICAgICAgICAgYXNzZXRJRDogQ09OVEVYVC5hdmF4QXNzZXRJRCxcbiAgICAgICAgICBhbW91bnQ6ICc2MDAwMDAwMDAwMDAwMCcsIC8vIDYwayBGTFIgKHdpbGwgaGF2ZSBjaGFuZ2UpXG4gICAgICAgICAgdGhyZXNob2xkOiAyLFxuICAgICAgICAgIGFkZHJlc3NlcyxcbiAgICAgICAgICBsb2NrdGltZTogJzAnLFxuICAgICAgICB9LFxuICAgICAgXTtcblxuICAgICAgYnVpbGRlclxuICAgICAgICAubm9kZUlEKHZhbGlkTm9kZUlEKVxuICAgICAgICAuc3RhcnRUaW1lKG5vdyArIDYwKVxuICAgICAgICAuZW5kVGltZShub3cgKyBNSU5fREVMRUdBVElPTl9EVVJBVElPTilcbiAgICAgICAgLnN0YWtlQW1vdW50KE1JTl9ERUxFR0FUSU9OX0FNT1VOVClcbiAgICAgICAgLmZyb21QdWJLZXkoYWRkcmVzc2VzKVxuICAgICAgICAuZGVjb2RlZFV0eG9zKHV0eG9zKVxuICAgICAgICAuZmVlU3RhdGUobW9ja0ZlZVN0YXRlKVxuICAgICAgICAuY29udGV4dChDT05URVhUIGFzIGFueSlcbiAgICAgICAgLnNpZ24oeyBrZXk6IFNFRURfQUNDT1VOVC5wcml2YXRlS2V5IH0pO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcblxuICAgICAgLy8gVmVyaWZ5IHRyYW5zYWN0aW9uIGlzIGJ1aWx0IHN1Y2Nlc3NmdWxseVxuICAgICAgdHguc2hvdWxkLmJlLmluc3RhbmNlb2YoVHJhbnNhY3Rpb24pO1xuICAgICAgdHgudHlwZS5zaG91bGQuZXF1YWwoVHJhbnNhY3Rpb25UeXBlLkFkZFBlcm1pc3Npb25sZXNzRGVsZWdhdG9yKTtcblxuICAgICAgLy8gVmVyaWZ5IGNyZWRlbnRpYWxzIGV4aXN0IChub24tZW1wdHkpXG4gICAgICBjb25zdCBjcmVkZW50aWFscyA9ICh0eCBhcyBhbnkpLl9mbGFyZVRyYW5zYWN0aW9uLmNyZWRlbnRpYWxzO1xuICAgICAgY3JlZGVudGlhbHMuc2hvdWxkLm5vdC5iZS5lbXB0eSgpO1xuICAgICAgY3JlZGVudGlhbHMubGVuZ3RoLnNob3VsZC5iZS5ncmVhdGVyVGhhbigwKTtcblxuICAgICAgLy8gVmVyaWZ5IGF0IGxlYXN0IG9uZSBzaWduYXR1cmUgc2xvdCBoYXMgYSBzaWduYXR1cmVcbiAgICAgIGxldCBoYXNTaWduYXR1cmUgPSBmYWxzZTtcbiAgICAgIGZvciAoY29uc3QgY3JlZGVudGlhbCBvZiBjcmVkZW50aWFscykge1xuICAgICAgICBjb25zdCBzaWduYXR1cmVzID0gY3JlZGVudGlhbC5nZXRTaWduYXR1cmVzKCk7XG4gICAgICAgIGZvciAoY29uc3Qgc2lnIG9mIHNpZ25hdHVyZXMpIHtcbiAgICAgICAgICBpZiAoc2lnICYmIHNpZy5sZW5ndGggPiAwICYmICFzaWcuc3RhcnRzV2l0aCgnMHgnICsgJzAnLnJlcGVhdCgxMzApKSkge1xuICAgICAgICAgICAgaGFzU2lnbmF0dXJlID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaGFzU2lnbmF0dXJlKSBicmVhaztcbiAgICAgIH1cbiAgICAgIGhhc1NpZ25hdHVyZS5zaG91bGQuYmUudHJ1ZSgnU2hvdWxkIGhhdmUgYXQgbGVhc3Qgb25lIHNpZ25hdHVyZScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzdWNjZXNzZnVsbHkgc2lnbiBkZWxlZ2F0aW9uIHRyYW5zYWN0aW9uIHdpdGggbXVsdGlwbGUgc2lnbmVycycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldERlbGVnYXRvckJ1aWxkZXIoKTtcbiAgICAgIGNvbnN0IG5vdyA9IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApO1xuICAgICAgY29uc3QgdmFsaWROb2RlSUQgPSAnTm9kZUlELUFLN3NQQnNaTTlyUXdzZTIzYUxoRUVCUEhaRDVna0xyTCc7XG5cbiAgICAgIGNvbnN0IGFkZHJlc3NlcyA9IFtTRUVEX0FDQ09VTlQuYWRkcmVzc1Rlc3RuZXQsIEFDQ09VTlRfMS5hZGRyZXNzVGVzdG5ldF07XG4gICAgICBjb25zdCB1dHhvcyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIG91dHB1dElEOiA3LFxuICAgICAgICAgIHR4aWQ6ICcyTldkOWhyU0drV0pXeVR1NERuU00xcVFTVVQyRFZtOHVxd0ZrNHdRUkZMQW1jc0hReicsXG4gICAgICAgICAgb3V0cHV0aWR4OiAnMCcsXG4gICAgICAgICAgYXNzZXRJRDogQ09OVEVYVC5hdmF4QXNzZXRJRCxcbiAgICAgICAgICBhbW91bnQ6ICc2MDAwMDAwMDAwMDAwMCcsXG4gICAgICAgICAgdGhyZXNob2xkOiAyLFxuICAgICAgICAgIGFkZHJlc3NlcyxcbiAgICAgICAgICBsb2NrdGltZTogJzAnLFxuICAgICAgICB9LFxuICAgICAgXTtcblxuICAgICAgLy8gU2lnbiB3aXRoIGJvdGgga2V5cyBmb3IgMi1vZi0yIG11bHRpc2lnXG4gICAgICBidWlsZGVyXG4gICAgICAgIC5ub2RlSUQodmFsaWROb2RlSUQpXG4gICAgICAgIC5zdGFydFRpbWUobm93ICsgNjApXG4gICAgICAgIC5lbmRUaW1lKG5vdyArIE1JTl9ERUxFR0FUSU9OX0RVUkFUSU9OKVxuICAgICAgICAuc3Rha2VBbW91bnQoTUlOX0RFTEVHQVRJT05fQU1PVU5UKVxuICAgICAgICAuZnJvbVB1YktleShhZGRyZXNzZXMpXG4gICAgICAgIC5kZWNvZGVkVXR4b3ModXR4b3MpXG4gICAgICAgIC5mZWVTdGF0ZShtb2NrRmVlU3RhdGUpXG4gICAgICAgIC5jb250ZXh0KENPTlRFWFQgYXMgYW55KTtcblxuICAgICAgYnVpbGRlci5zaWduKHsga2V5OiBTRUVEX0FDQ09VTlQucHJpdmF0ZUtleSB9KTtcbiAgICAgIGJ1aWxkZXIuc2lnbih7IGtleTogQUNDT1VOVF8xLnByaXZhdGVLZXkgfSk7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuXG4gICAgICAvLyBWZXJpZnkgdHJhbnNhY3Rpb24gaXMgYnVpbHQgYW5kIGhhcyBtdWx0aXBsZSBzaWduYXR1cmVzXG4gICAgICB0eC5zaG91bGQuYmUuaW5zdGFuY2VvZihUcmFuc2FjdGlvbik7XG4gICAgICBjb25zdCBjcmVkZW50aWFscyA9ICh0eCBhcyBhbnkpLl9mbGFyZVRyYW5zYWN0aW9uLmNyZWRlbnRpYWxzO1xuICAgICAgY3JlZGVudGlhbHMuc2hvdWxkLm5vdC5iZS5lbXB0eSgpO1xuXG4gICAgICAvLyBDb3VudCBub24tZW1wdHkgc2lnbmF0dXJlc1xuICAgICAgbGV0IHNpZ25hdHVyZUNvdW50ID0gMDtcbiAgICAgIGZvciAoY29uc3QgY3JlZGVudGlhbCBvZiBjcmVkZW50aWFscykge1xuICAgICAgICBjb25zdCBzaWduYXR1cmVzID0gY3JlZGVudGlhbC5nZXRTaWduYXR1cmVzKCk7XG4gICAgICAgIGZvciAoY29uc3Qgc2lnIG9mIHNpZ25hdHVyZXMpIHtcbiAgICAgICAgICBpZiAoc2lnICYmIHNpZy5sZW5ndGggPiAwICYmICFzaWcuc3RhcnRzV2l0aCgnMHgnICsgJzAnLnJlcGVhdCgxMzApKSkge1xuICAgICAgICAgICAgc2lnbmF0dXJlQ291bnQrKztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHNpZ25hdHVyZUNvdW50LnNob3VsZC5iZS5ncmVhdGVyVGhhbk9yRXF1YWwoMiwgJ1Nob3VsZCBoYXZlIGF0IGxlYXN0IDIgc2lnbmF0dXJlcyBmb3IgMi1vZi0yIG11bHRpc2lnJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdoYWxmLXNpZ25pbmcgd29ya2Zsb3cgd2l0aCByZWFsIHRyYW5zYWN0aW9uIGRhdGEnLCAoKSA9PiB7XG4gICAgLy8gSW1wb3J0IHJlYWwgbXVsdGlzaWcgZGVsZWdhdGlvbiB0cmFuc2FjdGlvbiBkYXRhIGZyb20gdGVzdG5ldFxuICAgIGNvbnN0IHtcbiAgICAgIEhBTEZfU0lHTl9URVNUX0FDQ09VTlRTLFxuICAgICAgTVVMVElTSUdfREVMRUdBVElPTl9QQVJBTVMsXG4gICAgICBNVUxUSVNJR19ERUxFR0FUSU9OX1VOU0lHTkVEX1RYX0hFWCxcbiAgICAgIE1VTFRJU0lHX0RFTEVHQVRJT05fSEFMRl9TSUdORURfVFhfSEVYLFxuICAgICAgTVVMVElTSUdfREVMRUdBVElPTl9GVUxMWV9TSUdORURfVFhfSEVYLFxuICAgIH0gPSByZXF1aXJlKCcuLi8uLi9yZXNvdXJjZXMvdHJhbnNhY3Rpb25EYXRhL211bHRpc2lnRGVsZWdhdGlvblR4Jyk7XG5cbiAgICBpdCgnc2hvdWxkIHBhcnNlIHVuc2lnbmVkIG11bHRpc2lnIGRlbGVnYXRpb24gdHJhbnNhY3Rpb24gZnJvbSB0ZXN0bmV0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmF3VHggPSB1dGlscy5yZW1vdmVIZXhQcmVmaXgoTVVMVElTSUdfREVMRUdBVElPTl9VTlNJR05FRF9UWF9IRVgpO1xuXG4gICAgICAvLyBWZXJpZnkgdHJhbnNhY3Rpb24gY2FuIGJlIGRlc2VyaWFsaXplZCBieSBGbGFyZUpTXG4gICAgICBjb25zdCBkZWNvZGVkVHhCeXRlcyA9IEJ1ZmZlci5mcm9tKHJhd1R4LCAnaGV4Jyk7XG4gICAgICBkZWNvZGVkVHhCeXRlcy5zaG91bGQubm90LmJlLmVtcHR5KCk7XG4gICAgICBkZWNvZGVkVHhCeXRlcy5sZW5ndGguc2hvdWxkLmJlLmdyZWF0ZXJUaGFuKDApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBkZWxlZ2F0aW9uIHRyYW5zYWN0aW9uIHdpdGggbXVsdGlzaWcgYWRkcmVzc2VzIGFuZCB2ZXJpZnkgc29ydGluZycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldERlbGVnYXRvckJ1aWxkZXIoKTtcblxuICAgICAgY29uc3QgYWRkcmVzc2VzID0gTVVMVElTSUdfREVMRUdBVElPTl9QQVJBTVMubXVsdGlzaWdBZGRyZXNzZXM7XG4gICAgICBjb25zdCB1dHhvcyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIG91dHB1dElEOiA3LFxuICAgICAgICAgIHR4aWQ6ICcyTldkOWhyU0drV0pXeVR1NERuU00xcVFTVVQyRFZtOHVxd0ZrNHdRUkZMQW1jc0hReicsXG4gICAgICAgICAgb3V0cHV0aWR4OiAnMCcsXG4gICAgICAgICAgYXNzZXRJRDogQ09OVEVYVC5hdmF4QXNzZXRJRCxcbiAgICAgICAgICBhbW91bnQ6ICc2MDAwMDAwMDAwMDAwMCcsXG4gICAgICAgICAgdGhyZXNob2xkOiAyLFxuICAgICAgICAgIGFkZHJlc3NlcyxcbiAgICAgICAgICBsb2NrdGltZTogJzAnLFxuICAgICAgICB9LFxuICAgICAgXTtcblxuICAgICAgYnVpbGRlclxuICAgICAgICAubm9kZUlEKE1VTFRJU0lHX0RFTEVHQVRJT05fUEFSQU1TLm5vZGVJRClcbiAgICAgICAgLnN0YXJ0VGltZShNVUxUSVNJR19ERUxFR0FUSU9OX1BBUkFNUy5zdGFydFRpbWUpXG4gICAgICAgIC5lbmRUaW1lKE1VTFRJU0lHX0RFTEVHQVRJT05fUEFSQU1TLmVuZFRpbWUpXG4gICAgICAgIC5zdGFrZUFtb3VudChCaWdJbnQoTVVMVElTSUdfREVMRUdBVElPTl9QQVJBTVMuc3Rha2VBbW91bnQpKVxuICAgICAgICAuZnJvbVB1YktleShhZGRyZXNzZXMpXG4gICAgICAgIC5kZWNvZGVkVXR4b3ModXR4b3MpXG4gICAgICAgIC5mZWVTdGF0ZSh7IGNhcGFjaXR5OiAxMDAwMDBuLCBleGNlc3M6IDBuLCBwcmljZTogMTAwMG4sIHRpbWVzdGFtcDogJzEyMzQ1Njc4OTAnIH0pXG4gICAgICAgIC5jb250ZXh0KENPTlRFWFQgYXMgYW55KTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG5cbiAgICAgIC8vIFZlcmlmeSB0cmFuc2FjdGlvbiB3YXMgYnVpbHQgc3VjY2Vzc2Z1bGx5XG4gICAgICB0eC5zaG91bGQuYmUuaW5zdGFuY2VvZihUcmFuc2FjdGlvbik7XG4gICAgICB0eC50eXBlLnNob3VsZC5lcXVhbChUcmFuc2FjdGlvblR5cGUuQWRkUGVybWlzc2lvbmxlc3NEZWxlZ2F0b3IpO1xuXG4gICAgICAvLyBWZXJpZnkgVVRYT3MgYXJlIHByb3Blcmx5IGhhbmRsZWRcbiAgICAgIGNvbnN0IHR4VXR4b3MgPSAodHggYXMgYW55KS5fdXR4b3M7XG4gICAgICB0eFV0eG9zLnNob3VsZC5ub3QuYmUuZW1wdHkoKTtcbiAgICAgIHR4VXR4b3NbMF0uc2hvdWxkLmhhdmUucHJvcGVydHkoJ2FkZHJlc3NlcycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzdWNjZXNzZnVsbHkgcGFyc2UgaGFsZi1zaWduZWQgdHJhbnNhY3Rpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByYXdUeCA9IHV0aWxzLnJlbW92ZUhleFByZWZpeChNVUxUSVNJR19ERUxFR0FUSU9OX0hBTEZfU0lHTkVEX1RYX0hFWCk7XG4gICAgICBjb25zdCB0eCA9IChhd2FpdCBmYWN0b3J5LmZyb20ocmF3VHgpLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuXG4gICAgICB0eC50eXBlLnNob3VsZC5lcXVhbChUcmFuc2FjdGlvblR5cGUuQWRkUGVybWlzc2lvbmxlc3NEZWxlZ2F0b3IpO1xuXG4gICAgICAvLyBWZXJpZnkgaXQgaGFzIG9uZSBzaWduYXR1cmVcbiAgICAgIGNvbnN0IGNyZWRlbnRpYWxzID0gKHR4IGFzIGFueSkuX2ZsYXJlVHJhbnNhY3Rpb24uY3JlZGVudGlhbHM7XG4gICAgICBjcmVkZW50aWFscy5zaG91bGQubm90LmJlLmVtcHR5KCk7XG5cbiAgICAgIGxldCBzaWduYXR1cmVDb3VudCA9IDA7XG4gICAgICBmb3IgKGNvbnN0IGNyZWRlbnRpYWwgb2YgY3JlZGVudGlhbHMpIHtcbiAgICAgICAgY29uc3Qgc2lnbmF0dXJlcyA9IGNyZWRlbnRpYWwuZ2V0U2lnbmF0dXJlcygpO1xuICAgICAgICBmb3IgKGNvbnN0IHNpZyBvZiBzaWduYXR1cmVzKSB7XG4gICAgICAgICAgY29uc3Qgc2lnSGV4ID0gc2lnLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgICAgICAvLyBOb24tZW1wdHkgc2lnbmF0dXJlIChub3QgYWxsIHplcm9zKVxuICAgICAgICAgIGlmIChzaWdIZXggJiYgIXNpZ0hleC5tYXRjaCgvXjArJC8pKSB7XG4gICAgICAgICAgICBzaWduYXR1cmVDb3VudCsrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBzaWduYXR1cmVDb3VudC5zaG91bGQuYmUuZ3JlYXRlclRoYW5PckVxdWFsKDEsICdTaG91bGQgaGF2ZSBhdCBsZWFzdCAxIHNpZ25hdHVyZSBpbiBoYWxmLXNpZ25lZCB0eCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzdWNjZXNzZnVsbHkgcGFyc2UgZnVsbHktc2lnbmVkIHRyYW5zYWN0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmF3VHggPSB1dGlscy5yZW1vdmVIZXhQcmVmaXgoTVVMVElTSUdfREVMRUdBVElPTl9GVUxMWV9TSUdORURfVFhfSEVYKTtcbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IGZhY3RvcnkuZnJvbShyYXdUeCkuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG5cbiAgICAgIHR4LnR5cGUuc2hvdWxkLmVxdWFsKFRyYW5zYWN0aW9uVHlwZS5BZGRQZXJtaXNzaW9ubGVzc0RlbGVnYXRvcik7XG5cbiAgICAgIC8vIFZlcmlmeSBpdCBoYXMgdHdvIHNpZ25hdHVyZXNcbiAgICAgIGNvbnN0IGNyZWRlbnRpYWxzID0gKHR4IGFzIGFueSkuX2ZsYXJlVHJhbnNhY3Rpb24uY3JlZGVudGlhbHM7XG4gICAgICBjcmVkZW50aWFscy5zaG91bGQubm90LmJlLmVtcHR5KCk7XG5cbiAgICAgIGxldCBzaWduYXR1cmVDb3VudCA9IDA7XG4gICAgICBmb3IgKGNvbnN0IGNyZWRlbnRpYWwgb2YgY3JlZGVudGlhbHMpIHtcbiAgICAgICAgY29uc3Qgc2lnbmF0dXJlcyA9IGNyZWRlbnRpYWwuZ2V0U2lnbmF0dXJlcygpO1xuICAgICAgICBmb3IgKGNvbnN0IHNpZyBvZiBzaWduYXR1cmVzKSB7XG4gICAgICAgICAgY29uc3Qgc2lnSGV4ID0gc2lnLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgICAgICAvLyBOb24tZW1wdHkgc2lnbmF0dXJlIChub3QgYWxsIHplcm9zKVxuICAgICAgICAgIGlmIChzaWdIZXggJiYgIXNpZ0hleC5tYXRjaCgvXjArJC8pKSB7XG4gICAgICAgICAgICBzaWduYXR1cmVDb3VudCsrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBzaWduYXR1cmVDb3VudC5zaG91bGQuYmUuZ3JlYXRlclRoYW5PckVxdWFsKDIsICdTaG91bGQgaGF2ZSBhdCBsZWFzdCAyIHNpZ25hdHVyZXMgaW4gZnVsbHktc2lnbmVkIHR4Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkLCBzaWduIHdpdGggdXNlciBrZXksIGFuZCBtYXRjaCBoYWxmLXNpZ25lZCBmb3JtYXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXREZWxlZ2F0b3JCdWlsZGVyKCk7XG5cbiAgICAgIGNvbnN0IGFkZHJlc3NlcyA9IE1VTFRJU0lHX0RFTEVHQVRJT05fUEFSQU1TLm11bHRpc2lnQWRkcmVzc2VzO1xuICAgICAgY29uc3QgdXR4b3MgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBvdXRwdXRJRDogNyxcbiAgICAgICAgICB0eGlkOiAnMk5XZDloclNHa1dKV3lUdTREblNNMXFRU1VUMkRWbTh1cXdGazR3UVJGTEFtY3NIUXonLFxuICAgICAgICAgIG91dHB1dGlkeDogJzAnLFxuICAgICAgICAgIGFzc2V0SUQ6IENPTlRFWFQuYXZheEFzc2V0SUQsXG4gICAgICAgICAgYW1vdW50OiAnNjAwMDAwMDAwMDAwMDAnLFxuICAgICAgICAgIHRocmVzaG9sZDogMixcbiAgICAgICAgICBhZGRyZXNzZXMsXG4gICAgICAgICAgbG9ja3RpbWU6ICcwJyxcbiAgICAgICAgfSxcbiAgICAgIF07XG5cbiAgICAgIGJ1aWxkZXJcbiAgICAgICAgLm5vZGVJRChNVUxUSVNJR19ERUxFR0FUSU9OX1BBUkFNUy5ub2RlSUQpXG4gICAgICAgIC5zdGFydFRpbWUoTVVMVElTSUdfREVMRUdBVElPTl9QQVJBTVMuc3RhcnRUaW1lKVxuICAgICAgICAuZW5kVGltZShNVUxUSVNJR19ERUxFR0FUSU9OX1BBUkFNUy5lbmRUaW1lKVxuICAgICAgICAuc3Rha2VBbW91bnQoQmlnSW50KE1VTFRJU0lHX0RFTEVHQVRJT05fUEFSQU1TLnN0YWtlQW1vdW50KSlcbiAgICAgICAgLmZyb21QdWJLZXkoYWRkcmVzc2VzKVxuICAgICAgICAuZGVjb2RlZFV0eG9zKHV0eG9zKVxuICAgICAgICAuZmVlU3RhdGUoeyBjYXBhY2l0eTogMTAwMDAwbiwgZXhjZXNzOiAwbiwgcHJpY2U6IDEwMDBuLCB0aW1lc3RhbXA6ICcxMjM0NTY3ODkwJyB9KVxuICAgICAgICAuY29udGV4dChDT05URVhUIGFzIGFueSlcbiAgICAgICAgLnNpZ24oeyBrZXk6IEhBTEZfU0lHTl9URVNUX0FDQ09VTlRTLnVzZXIucHJpdmF0ZUtleSB9KTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG5cbiAgICAgIHR4LnR5cGUuc2hvdWxkLmVxdWFsKFRyYW5zYWN0aW9uVHlwZS5BZGRQZXJtaXNzaW9ubGVzc0RlbGVnYXRvcik7XG5cbiAgICAgIC8vIFZlcmlmeSB0cmFuc2FjdGlvbiBoYXMgY3JlZGVudGlhbHNcbiAgICAgIGNvbnN0IGNyZWRlbnRpYWxzID0gKHR4IGFzIGFueSkuX2ZsYXJlVHJhbnNhY3Rpb24uY3JlZGVudGlhbHM7XG4gICAgICBjcmVkZW50aWFscy5zaG91bGQubm90LmJlLmVtcHR5KCk7XG5cbiAgICAgIC8vIENvdW50IHNpZ25hdHVyZXNcbiAgICAgIGxldCBzaWduYXR1cmVDb3VudCA9IDA7XG4gICAgICBmb3IgKGNvbnN0IGNyZWRlbnRpYWwgb2YgY3JlZGVudGlhbHMpIHtcbiAgICAgICAgY29uc3Qgc2lnbmF0dXJlcyA9IGNyZWRlbnRpYWwuZ2V0U2lnbmF0dXJlcygpO1xuICAgICAgICBmb3IgKGNvbnN0IHNpZyBvZiBzaWduYXR1cmVzKSB7XG4gICAgICAgICAgY29uc3Qgc2lnSGV4ID0gc2lnLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgICAgICBpZiAoc2lnSGV4ICYmICFzaWdIZXgubWF0Y2goL14wKyQvKSkge1xuICAgICAgICAgICAgc2lnbmF0dXJlQ291bnQrKztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc2lnbmF0dXJlQ291bnQuc2hvdWxkLmJlLmdyZWF0ZXJUaGFuT3JFcXVhbCgxLCAnU2hvdWxkIGhhdmUgdXNlciBzaWduYXR1cmUgYWZ0ZXIgc2lnbmluZycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhbmQgc2lnbiB3aXRoIGJvdGggdXNlciBhbmQgYml0Z28ga2V5cyBmb3IgZnVsbHktc2lnbmVkIHR4JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0RGVsZWdhdG9yQnVpbGRlcigpO1xuXG4gICAgICBjb25zdCBhZGRyZXNzZXMgPSBNVUxUSVNJR19ERUxFR0FUSU9OX1BBUkFNUy5tdWx0aXNpZ0FkZHJlc3NlcztcbiAgICAgIGNvbnN0IHV0eG9zID0gW1xuICAgICAgICB7XG4gICAgICAgICAgb3V0cHV0SUQ6IDcsXG4gICAgICAgICAgdHhpZDogJzJOV2Q5aHJTR2tXSld5VHU0RG5TTTFxUVNVVDJEVm04dXF3Rms0d1FSRkxBbWNzSFF6JyxcbiAgICAgICAgICBvdXRwdXRpZHg6ICcwJyxcbiAgICAgICAgICBhc3NldElEOiBDT05URVhULmF2YXhBc3NldElELFxuICAgICAgICAgIGFtb3VudDogJzYwMDAwMDAwMDAwMDAwJyxcbiAgICAgICAgICB0aHJlc2hvbGQ6IDIsXG4gICAgICAgICAgYWRkcmVzc2VzLFxuICAgICAgICAgIGxvY2t0aW1lOiAnMCcsXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICBidWlsZGVyXG4gICAgICAgIC5ub2RlSUQoTVVMVElTSUdfREVMRUdBVElPTl9QQVJBTVMubm9kZUlEKVxuICAgICAgICAuc3RhcnRUaW1lKE1VTFRJU0lHX0RFTEVHQVRJT05fUEFSQU1TLnN0YXJ0VGltZSlcbiAgICAgICAgLmVuZFRpbWUoTVVMVElTSUdfREVMRUdBVElPTl9QQVJBTVMuZW5kVGltZSlcbiAgICAgICAgLnN0YWtlQW1vdW50KEJpZ0ludChNVUxUSVNJR19ERUxFR0FUSU9OX1BBUkFNUy5zdGFrZUFtb3VudCkpXG4gICAgICAgIC5mcm9tUHViS2V5KGFkZHJlc3NlcylcbiAgICAgICAgLmRlY29kZWRVdHhvcyh1dHhvcylcbiAgICAgICAgLmZlZVN0YXRlKHsgY2FwYWNpdHk6IDEwMDAwMG4sIGV4Y2VzczogMG4sIHByaWNlOiAxMDAwbiwgdGltZXN0YW1wOiAnMTIzNDU2Nzg5MCcgfSlcbiAgICAgICAgLmNvbnRleHQoQ09OVEVYVCBhcyBhbnkpO1xuXG4gICAgICAvLyBTaWduIHdpdGggYm90aCBrZXlzXG4gICAgICBidWlsZGVyLnNpZ24oeyBrZXk6IEhBTEZfU0lHTl9URVNUX0FDQ09VTlRTLnVzZXIucHJpdmF0ZUtleSB9KTtcbiAgICAgIGJ1aWxkZXIuc2lnbih7IGtleTogSEFMRl9TSUdOX1RFU1RfQUNDT1VOVFMuYml0Z28ucHJpdmF0ZUtleSB9KTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG5cbiAgICAgIHR4LnR5cGUuc2hvdWxkLmVxdWFsKFRyYW5zYWN0aW9uVHlwZS5BZGRQZXJtaXNzaW9ubGVzc0RlbGVnYXRvcik7XG5cbiAgICAgIC8vIFZlcmlmeSB0cmFuc2FjdGlvbiBoYXMgYm90aCBzaWduYXR1cmVzXG4gICAgICBjb25zdCBjcmVkZW50aWFscyA9ICh0eCBhcyBhbnkpLl9mbGFyZVRyYW5zYWN0aW9uLmNyZWRlbnRpYWxzO1xuICAgICAgY3JlZGVudGlhbHMuc2hvdWxkLm5vdC5iZS5lbXB0eSgpO1xuXG4gICAgICBsZXQgc2lnbmF0dXJlQ291bnQgPSAwO1xuICAgICAgZm9yIChjb25zdCBjcmVkZW50aWFsIG9mIGNyZWRlbnRpYWxzKSB7XG4gICAgICAgIGNvbnN0IHNpZ25hdHVyZXMgPSBjcmVkZW50aWFsLmdldFNpZ25hdHVyZXMoKTtcbiAgICAgICAgZm9yIChjb25zdCBzaWcgb2Ygc2lnbmF0dXJlcykge1xuICAgICAgICAgIGNvbnN0IHNpZ0hleCA9IHNpZy50b1N0cmluZygnaGV4Jyk7XG4gICAgICAgICAgaWYgKHNpZ0hleCAmJiAhc2lnSGV4Lm1hdGNoKC9eMCskLykpIHtcbiAgICAgICAgICAgIHNpZ25hdHVyZUNvdW50Kys7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHNpZ25hdHVyZUNvdW50LnNob3VsZC5iZS5ncmVhdGVyVGhhbk9yRXF1YWwoMiwgJ1Nob3VsZCBoYXZlIGJvdGggdXNlciBhbmQgYml0Z28gc2lnbmF0dXJlcycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBkZWxlZ2F0aW9uIHRyYW5zYWN0aW9uIHdoZW4gYWRkcmVzc2VzIG5lZWQgc29ydGluZycsIGFzeW5jICgpID0+IHtcbiAgICAgIC8vIENyZWF0ZSBhIHNjZW5hcmlvIHdpdGggYWRkcmVzc2VzIGluIGRpZmZlcmVudCBvcmRlclxuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0RGVsZWdhdG9yQnVpbGRlcigpO1xuICAgICAgY29uc3Qgbm93ID0gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCk7XG5cbiAgICAgIC8vIFVzZSBhZGRyZXNzZXMgaW4gYSBzcGVjaWZpYyBvcmRlclxuICAgICAgY29uc3QgYWRkcmVzc2VzID0gW0FDQ09VTlRfMy5hZGRyZXNzLCBTRUVEX0FDQ09VTlQuYWRkcmVzc1Rlc3RuZXQsIEFDQ09VTlRfMS5hZGRyZXNzVGVzdG5ldF07XG5cbiAgICAgIGNvbnN0IHV0eG9zID0gW1xuICAgICAgICB7XG4gICAgICAgICAgb3V0cHV0SUQ6IDcsXG4gICAgICAgICAgdHhpZDogJzJOV2Q5aHJTR2tXSld5VHU0RG5TTTFxUVNVVDJEVm04dXF3Rms0d1FSRkxBbWNzSFF6JyxcbiAgICAgICAgICBvdXRwdXRpZHg6ICcwJyxcbiAgICAgICAgICBhc3NldElEOiBDT05URVhULmF2YXhBc3NldElELFxuICAgICAgICAgIGFtb3VudDogJzYwMDAwMDAwMDAwMDAwJyxcbiAgICAgICAgICB0aHJlc2hvbGQ6IDIsXG4gICAgICAgICAgYWRkcmVzc2VzLFxuICAgICAgICAgIGxvY2t0aW1lOiAnMCcsXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICBjb25zdCB2YWxpZE5vZGVJRCA9ICdOb2RlSUQtQUs3c1BCc1pNOXJRd3NlMjNhTGhFRUJQSFpENWdrTHJMJztcblxuICAgICAgYnVpbGRlclxuICAgICAgICAubm9kZUlEKHZhbGlkTm9kZUlEKVxuICAgICAgICAuc3RhcnRUaW1lKG5vdyArIDYwKVxuICAgICAgICAuZW5kVGltZShub3cgKyAxNCAqIDI0ICogNjAgKiA2MClcbiAgICAgICAgLnN0YWtlQW1vdW50KEJpZ0ludCg1MDAwMCAqIDFlOSkpXG4gICAgICAgIC5mcm9tUHViS2V5KGFkZHJlc3NlcylcbiAgICAgICAgLmRlY29kZWRVdHhvcyh1dHhvcylcbiAgICAgICAgLmZlZVN0YXRlKHsgY2FwYWNpdHk6IDEwMDAwMG4sIGV4Y2VzczogMG4sIHByaWNlOiAxMDAwbiwgdGltZXN0YW1wOiAnMTIzNDU2Nzg5MCcgfSlcbiAgICAgICAgLmNvbnRleHQoQ09OVEVYVCBhcyBhbnkpO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcblxuICAgICAgLy8gVmVyaWZ5IHRyYW5zYWN0aW9uIGJ1aWxkcyBzdWNjZXNzZnVsbHkgd2l0aCBzb3J0ZWQgYWRkcmVzc2VzXG4gICAgICB0eC5zaG91bGQuYmUuaW5zdGFuY2VvZihUcmFuc2FjdGlvbik7XG4gICAgICB0eC50eXBlLnNob3VsZC5lcXVhbChUcmFuc2FjdGlvblR5cGUuQWRkUGVybWlzc2lvbmxlc3NEZWxlZ2F0b3IpO1xuXG4gICAgICAvLyBWZXJpZnkgVVRYT3MgYXJlIHByb3Blcmx5IGhhbmRsZWRcbiAgICAgIGNvbnN0IHR4VXR4b3MgPSAodHggYXMgYW55KS5fdXR4b3M7XG4gICAgICB0eFV0eG9zLnNob3VsZC5ub3QuYmUuZW1wdHkoKTtcbiAgICAgIHR4VXR4b3NbMF0uc2hvdWxkLmhhdmUucHJvcGVydHkoJ2FkZHJlc3NlcycpO1xuICAgICAgdHhVdHhvc1swXS5hZGRyZXNzZXMubGVuZ3RoLnNob3VsZC5lcXVhbCgzKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3JlY292ZXJ5IG1vZGUgc2lnbmluZycsICgpID0+IHtcbiAgICBjb25zdCBtb2NrRmVlU3RhdGUgPSB7IGNhcGFjaXR5OiAxMDAwMDBuLCBleGNlc3M6IDBuLCBwcmljZTogMTAwMG4sIHRpbWVzdGFtcDogJzEyMzQ1Njc4OTAnIH07XG4gICAgY29uc3QgTUlOX0RFTEVHQVRJT05fRFVSQVRJT04gPSAxNCAqIDI0ICogNjAgKiA2MDtcbiAgICBjb25zdCBNSU5fREVMRUdBVElPTl9BTU9VTlQgPSBCaWdJbnQoNTAwMDAgKiAxZTkpO1xuXG4gICAgLyoqXG4gICAgICogUmVjb3ZlcnkgbW9kZSB0ZXN0IHZlcmlmaWVzIHRoYXQgd2hlbiByZWNvdmVyU2lnbmVyPXRydWUsIHRoZSBidWlsZGVyIHVzZXM6XG4gICAgICogLSBCYWNrdXAga2V5IChpbmRleCAyKSBpbnN0ZWFkIG9mIHVzZXIga2V5IChpbmRleCAwKVxuICAgICAqIC0gQml0R28ga2V5IChpbmRleCAxKSBhcyBhbHdheXNcbiAgICAgKlxuICAgICAqIFRoaXMgaXMgaW5oZXJpdGVkIGZyb20gQXRvbWljVHJhbnNhY3Rpb25CdWlsZGVyIGJ1dCBzaG91bGQgYmUgdmVyaWZpZWRcbiAgICAgKiB0byB3b3JrIGNvcnJlY3RseSB3aXRoIGRlbGVnYXRpb24gdHJhbnNhY3Rpb25zLlxuICAgICAqL1xuICAgIGl0KCdzaG91bGQgc2lnbiBkZWxlZ2F0aW9uIHRyYW5zYWN0aW9uIGluIHJlY292ZXJ5IG1vZGUgKGJhY2t1cCArIGJpdGdvIGtleXMpJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0RGVsZWdhdG9yQnVpbGRlcigpO1xuICAgICAgY29uc3Qgbm93ID0gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCk7XG4gICAgICBjb25zdCB2YWxpZE5vZGVJRCA9ICdOb2RlSUQtQUs3c1BCc1pNOXJRd3NlMjNhTGhFRUJQSFpENWdrTHJMJztcblxuICAgICAgLy8gMi1vZi0zIG11bHRpc2lnOiB1c2VyLCBiaXRnbywgYmFja3VwXG4gICAgICBjb25zdCBhZGRyZXNzZXMgPSBbU0VFRF9BQ0NPVU5ULmFkZHJlc3NUZXN0bmV0LCBBQ0NPVU5UXzEuYWRkcmVzc1Rlc3RuZXQsIEFDQ09VTlRfMy5hZGRyZXNzXTtcbiAgICAgIGNvbnN0IHV0eG9zID0gW1xuICAgICAgICB7XG4gICAgICAgICAgb3V0cHV0SUQ6IDcsXG4gICAgICAgICAgdHhpZDogJzJOV2Q5aHJTR2tXSld5VHU0RG5TTTFxUVNVVDJEVm04dXF3Rms0d1FSRkxBbWNzSFF6JyxcbiAgICAgICAgICBvdXRwdXRpZHg6ICcwJyxcbiAgICAgICAgICBhc3NldElEOiBDT05URVhULmF2YXhBc3NldElELFxuICAgICAgICAgIGFtb3VudDogJzYwMDAwMDAwMDAwMDAwJywgLy8gNjBrIEZMUlxuICAgICAgICAgIHRocmVzaG9sZDogMixcbiAgICAgICAgICBhZGRyZXNzZXMsXG4gICAgICAgICAgbG9ja3RpbWU6ICcwJyxcbiAgICAgICAgfSxcbiAgICAgIF07XG5cbiAgICAgIC8vIEVuYWJsZSByZWNvdmVyeSBtb2RlIC0gdGhpcyB0ZWxscyB0aGUgYnVpbGRlciB0byB1c2UgYmFja3VwIChpbmRleCAyKSBpbnN0ZWFkIG9mIHVzZXIgKGluZGV4IDApXG4gICAgICAoYnVpbGRlciBhcyBhbnkpLnJlY292ZXJTaWduZXIgPSB0cnVlO1xuXG4gICAgICBidWlsZGVyXG4gICAgICAgIC5ub2RlSUQodmFsaWROb2RlSUQpXG4gICAgICAgIC5zdGFydFRpbWUobm93ICsgNjApXG4gICAgICAgIC5lbmRUaW1lKG5vdyArIE1JTl9ERUxFR0FUSU9OX0RVUkFUSU9OKVxuICAgICAgICAuc3Rha2VBbW91bnQoTUlOX0RFTEVHQVRJT05fQU1PVU5UKVxuICAgICAgICAuZnJvbVB1YktleShhZGRyZXNzZXMpXG4gICAgICAgIC5kZWNvZGVkVXR4b3ModXR4b3MpXG4gICAgICAgIC5mZWVTdGF0ZShtb2NrRmVlU3RhdGUpXG4gICAgICAgIC5jb250ZXh0KENPTlRFWFQgYXMgYW55KTtcblxuICAgICAgLy8gSW4gcmVjb3ZlcnkgbW9kZTogc2lnbiB3aXRoIGJhY2t1cCAoaW5kZXggMikgYW5kIGJpdGdvIChpbmRleCAxKVxuICAgICAgYnVpbGRlci5zaWduKHsga2V5OiBBQ0NPVU5UXzMucHJpdmF0ZUtleSB9KTsgLy8gYmFja3VwIGtleVxuICAgICAgYnVpbGRlci5zaWduKHsga2V5OiBBQ0NPVU5UXzEucHJpdmF0ZUtleSB9KTsgLy8gYml0Z28ga2V5XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuXG4gICAgICAvLyBWZXJpZnkgdHJhbnNhY3Rpb24gYnVpbGRzIHN1Y2Nlc3NmdWxseVxuICAgICAgdHguc2hvdWxkLmJlLmluc3RhbmNlb2YoVHJhbnNhY3Rpb24pO1xuICAgICAgdHgudHlwZS5zaG91bGQuZXF1YWwoVHJhbnNhY3Rpb25UeXBlLkFkZFBlcm1pc3Npb25sZXNzRGVsZWdhdG9yKTtcblxuICAgICAgLy8gVmVyaWZ5IGNyZWRlbnRpYWxzIGV4aXN0XG4gICAgICBjb25zdCBjcmVkZW50aWFscyA9ICh0eCBhcyBhbnkpLl9mbGFyZVRyYW5zYWN0aW9uLmNyZWRlbnRpYWxzO1xuICAgICAgY3JlZGVudGlhbHMuc2hvdWxkLm5vdC5iZS5lbXB0eSgpO1xuICAgICAgY3JlZGVudGlhbHMubGVuZ3RoLnNob3VsZC5iZS5ncmVhdGVyVGhhbigwKTtcblxuICAgICAgLy8gVmVyaWZ5IHdlIGhhdmUgc2lnbmF0dXJlcyBmcm9tIGJvdGggcmVjb3Zlcnkga2V5c1xuICAgICAgbGV0IHNpZ25hdHVyZUNvdW50ID0gMDtcbiAgICAgIGZvciAoY29uc3QgY3JlZGVudGlhbCBvZiBjcmVkZW50aWFscykge1xuICAgICAgICBjb25zdCBzaWduYXR1cmVzID0gY3JlZGVudGlhbC5nZXRTaWduYXR1cmVzKCk7XG4gICAgICAgIGZvciAoY29uc3Qgc2lnIG9mIHNpZ25hdHVyZXMpIHtcbiAgICAgICAgICBjb25zdCBzaWdIZXggPSBzaWcudG9TdHJpbmcoJ2hleCcpO1xuICAgICAgICAgIC8vIE5vbi1lbXB0eSBzaWduYXR1cmUgKG5vdCBhbGwgemVyb3MpXG4gICAgICAgICAgaWYgKHNpZ0hleCAmJiAhc2lnSGV4Lm1hdGNoKC9eMCskLykpIHtcbiAgICAgICAgICAgIHNpZ25hdHVyZUNvdW50Kys7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFNob3VsZCBoYXZlIGF0IGxlYXN0IDIgc2lnbmF0dXJlcyAoYmFja3VwICsgYml0Z28pXG4gICAgICBzaWduYXR1cmVDb3VudC5zaG91bGQuYmUuZ3JlYXRlclRoYW5PckVxdWFsKDIsICdSZWNvdmVyeSBtb2RlIHNob3VsZCBoYXZlIGJhY2t1cCArIGJpdGdvIHNpZ25hdHVyZXMnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB3aGVuIHNpZ25pbmcgaW4gcmVjb3ZlcnkgbW9kZSB3aXRoIHVzZXIga2V5IGluc3RlYWQgb2YgYmFja3VwJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0RGVsZWdhdG9yQnVpbGRlcigpO1xuICAgICAgY29uc3Qgbm93ID0gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCk7XG4gICAgICBjb25zdCB2YWxpZE5vZGVJRCA9ICdOb2RlSUQtQUs3c1BCc1pNOXJRd3NlMjNhTGhFRUJQSFpENWdrTHJMJztcblxuICAgICAgY29uc3QgYWRkcmVzc2VzID0gW1NFRURfQUNDT1VOVC5hZGRyZXNzVGVzdG5ldCwgQUNDT1VOVF8xLmFkZHJlc3NUZXN0bmV0LCBBQ0NPVU5UXzMuYWRkcmVzc107XG4gICAgICBjb25zdCB1dHhvcyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIG91dHB1dElEOiA3LFxuICAgICAgICAgIHR4aWQ6ICcyTldkOWhyU0drV0pXeVR1NERuU00xcVFTVVQyRFZtOHVxd0ZrNHdRUkZMQW1jc0hReicsXG4gICAgICAgICAgb3V0cHV0aWR4OiAnMCcsXG4gICAgICAgICAgYXNzZXRJRDogQ09OVEVYVC5hdmF4QXNzZXRJRCxcbiAgICAgICAgICBhbW91bnQ6ICc2MDAwMDAwMDAwMDAwMCcsXG4gICAgICAgICAgdGhyZXNob2xkOiAyLFxuICAgICAgICAgIGFkZHJlc3NlcyxcbiAgICAgICAgICBsb2NrdGltZTogJzAnLFxuICAgICAgICB9LFxuICAgICAgXTtcblxuICAgICAgKGJ1aWxkZXIgYXMgYW55KS5yZWNvdmVyU2lnbmVyID0gdHJ1ZTtcblxuICAgICAgYnVpbGRlclxuICAgICAgICAubm9kZUlEKHZhbGlkTm9kZUlEKVxuICAgICAgICAuc3RhcnRUaW1lKG5vdyArIDYwKVxuICAgICAgICAuZW5kVGltZShub3cgKyBNSU5fREVMRUdBVElPTl9EVVJBVElPTilcbiAgICAgICAgLnN0YWtlQW1vdW50KE1JTl9ERUxFR0FUSU9OX0FNT1VOVClcbiAgICAgICAgLmZyb21QdWJLZXkoYWRkcmVzc2VzKVxuICAgICAgICAuZGVjb2RlZFV0eG9zKHV0eG9zKVxuICAgICAgICAuZmVlU3RhdGUobW9ja0ZlZVN0YXRlKVxuICAgICAgICAuY29udGV4dChDT05URVhUIGFzIGFueSk7XG5cbiAgICAgIC8vIFRyeSB0byBzaWduIHdpdGggdXNlciBrZXkgKGluZGV4IDApIC0gdGhpcyBzaG91bGQgZmFpbCBpbiByZWNvdmVyeSBtb2RlXG4gICAgICAvLyBiZWNhdXNlIHJlY292ZXJ5IG1vZGUgZXhwZWN0cyBiYWNrdXAga2V5IChpbmRleCAyKSArIGJpdGdvIGtleSAoaW5kZXggMSlcbiAgICAgIGJ1aWxkZXIuc2lnbih7IGtleTogU0VFRF9BQ0NPVU5ULnByaXZhdGVLZXkgfSk7IC8vIHVzZXIga2V5ICh3cm9uZyBmb3IgcmVjb3ZlcnkgbW9kZSlcbiAgICAgIGJ1aWxkZXIuc2lnbih7IGtleTogQUNDT1VOVF8xLnByaXZhdGVLZXkgfSk7IC8vIGJpdGdvIGtleVxuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcblxuICAgICAgLy8gVHJhbnNhY3Rpb24gYnVpbGRzIGJ1dCBtYXkgbm90IGhhdmUgY29ycmVjdCBzaWduYXR1cmUgY291bnRcbiAgICAgIC8vIEluIHJlY292ZXJ5IG1vZGUgd2l0aCB3cm9uZyBrZXksIHNpZ25hdHVyZSBtYXRjaGluZyBtYXkgZmFpbFxuICAgICAgdHguc2hvdWxkLmJlLmluc3RhbmNlb2YoVHJhbnNhY3Rpb24pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2ZXJpZnkgcmVjb3ZlcnkgbW9kZSB1c2VzIGNvcnJlY3QgYWRkcmVzcyBpbmRpY2VzIChiYWNrdXA9MiwgYml0Z289MSknLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXREZWxlZ2F0b3JCdWlsZGVyKCk7XG4gICAgICBjb25zdCBub3cgPSBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKTtcbiAgICAgIGNvbnN0IHZhbGlkTm9kZUlEID0gJ05vZGVJRC1BSzdzUEJzWk05clF3c2UyM2FMaEVFQlBIWkQ1Z2tMckwnO1xuXG4gICAgICBjb25zdCBhZGRyZXNzZXMgPSBbU0VFRF9BQ0NPVU5ULmFkZHJlc3NUZXN0bmV0LCBBQ0NPVU5UXzEuYWRkcmVzc1Rlc3RuZXQsIEFDQ09VTlRfMy5hZGRyZXNzXTtcbiAgICAgIGNvbnN0IHV0eG9zID0gW1xuICAgICAgICB7XG4gICAgICAgICAgb3V0cHV0SUQ6IDcsXG4gICAgICAgICAgdHhpZDogJzJOV2Q5aHJTR2tXSld5VHU0RG5TTTFxUVNVVDJEVm04dXF3Rms0d1FSRkxBbWNzSFF6JyxcbiAgICAgICAgICBvdXRwdXRpZHg6ICcwJyxcbiAgICAgICAgICBhc3NldElEOiBDT05URVhULmF2YXhBc3NldElELFxuICAgICAgICAgIGFtb3VudDogJzYwMDAwMDAwMDAwMDAwJyxcbiAgICAgICAgICB0aHJlc2hvbGQ6IDIsXG4gICAgICAgICAgYWRkcmVzc2VzLFxuICAgICAgICAgIGxvY2t0aW1lOiAnMCcsXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICAvLyBFbmFibGUgcmVjb3ZlcnkgbW9kZVxuICAgICAgKGJ1aWxkZXIgYXMgYW55KS5yZWNvdmVyU2lnbmVyID0gdHJ1ZTtcblxuICAgICAgYnVpbGRlclxuICAgICAgICAubm9kZUlEKHZhbGlkTm9kZUlEKVxuICAgICAgICAuc3RhcnRUaW1lKG5vdyArIDYwKVxuICAgICAgICAuZW5kVGltZShub3cgKyBNSU5fREVMRUdBVElPTl9EVVJBVElPTilcbiAgICAgICAgLnN0YWtlQW1vdW50KE1JTl9ERUxFR0FUSU9OX0FNT1VOVClcbiAgICAgICAgLmZyb21QdWJLZXkoYWRkcmVzc2VzKVxuICAgICAgICAuZGVjb2RlZFV0eG9zKHV0eG9zKVxuICAgICAgICAuZmVlU3RhdGUobW9ja0ZlZVN0YXRlKVxuICAgICAgICAuY29udGV4dChDT05URVhUIGFzIGFueSk7XG5cbiAgICAgIC8vIEJ1aWxkIHdpdGhvdXQgc2lnbmluZyB0byBpbnNwZWN0IGludGVybmFsIHN0YXRlXG4gICAgICBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IChidWlsZGVyIGFzIGFueSkudHJhbnNhY3Rpb247XG4gICAgICB0cmFuc2FjdGlvbi5fZnJvbUFkZHJlc3Nlcy5sZW5ndGguc2hvdWxkLmVxdWFsKDMpO1xuXG4gICAgICAvLyBJbiByZWNvdmVyeSBtb2RlLCBnZXRTaWduaW5nQWRkcmVzc2VzIHNob3VsZCByZXR1cm4gW2JhY2t1cCwgYml0Z29dXG4gICAgICBjb25zdCBzaWduaW5nQWRkcmVzc2VzID0gKGJ1aWxkZXIgYXMgYW55KS5nZXRTaWduaW5nQWRkcmVzc2VzKCk7XG4gICAgICBzaWduaW5nQWRkcmVzc2VzLmxlbmd0aC5zaG91bGQuZXF1YWwoMik7XG5cbiAgICAgIC8vIFZlcmlmeSBzaWduaW5nIGFkZHJlc3NlcyBhcmUgYmFja3VwIChpbmRleCAyKSBhbmQgYml0Z28gKGluZGV4IDEpXG4gICAgICAvLyBOb3RlOiBXZSBjYW4ndCBkaXJlY3RseSBjb21wYXJlIGFkZHJlc3NlcyBhcyB0aGV5IG1heSBiZSBzb3J0ZWQsXG4gICAgICAvLyBidXQgd2UgY2FuIHZlcmlmeSB0aGUgbWV0aG9kIHJldHVybnMgZXhhY3RseSAyIGFkZHJlc3Nlc1xuICAgICAgc2lnbmluZ0FkZHJlc3Nlc1swXS5sZW5ndGguc2hvdWxkLmVxdWFsKDIwKTtcbiAgICAgIHNpZ25pbmdBZGRyZXNzZXNbMV0ubGVuZ3RoLnNob3VsZC5lcXVhbCgyMCk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=