@bitgo-beta/sdk-core 8.2.1-beta.1737 → 8.2.1-beta.1739

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/dist/src/bitgo/baseCoin/baseCoin.d.ts +1 -0
  2. package/dist/src/bitgo/baseCoin/baseCoin.d.ts.map +1 -1
  3. package/dist/src/bitgo/baseCoin/baseCoin.js +4 -1
  4. package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts +1 -0
  5. package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts.map +1 -1
  6. package/dist/src/bitgo/baseCoin/iBaseCoin.js +1 -1
  7. package/dist/src/bitgo/trading/iTradingAccount.d.ts +12 -1
  8. package/dist/src/bitgo/trading/iTradingAccount.d.ts.map +1 -1
  9. package/dist/src/bitgo/trading/iTradingAccount.js +1 -1
  10. package/dist/src/bitgo/trading/network/network.d.ts +1 -1
  11. package/dist/src/bitgo/trading/network/network.d.ts.map +1 -1
  12. package/dist/src/bitgo/trading/network/network.js +3 -5
  13. package/dist/src/bitgo/trading/network/types.d.ts +1 -1
  14. package/dist/src/bitgo/trading/network/types.d.ts.map +1 -1
  15. package/dist/src/bitgo/trading/network/types.js +1 -1
  16. package/dist/src/bitgo/trading/tradingAccount.d.ts +14 -1
  17. package/dist/src/bitgo/trading/tradingAccount.d.ts.map +1 -1
  18. package/dist/src/bitgo/trading/tradingAccount.js +52 -7
  19. package/dist/src/bitgo/tss/common.d.ts.map +1 -1
  20. package/dist/src/bitgo/tss/common.js +4 -1
  21. package/dist/src/bitgo/tss/eddsa/eddsaMPCv2.d.ts +35 -0
  22. package/dist/src/bitgo/tss/eddsa/eddsaMPCv2.d.ts.map +1 -0
  23. package/dist/src/bitgo/tss/eddsa/eddsaMPCv2.js +100 -0
  24. package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts +2 -2
  25. package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts.map +1 -1
  26. package/dist/src/bitgo/utils/tss/baseTSSUtils.js +1 -1
  27. package/dist/src/bitgo/utils/tss/baseTypes.d.ts +50 -14
  28. package/dist/src/bitgo/utils/tss/baseTypes.d.ts.map +1 -1
  29. package/dist/src/bitgo/utils/tss/baseTypes.js +11 -2
  30. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts +4 -2
  31. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts.map +1 -1
  32. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.js +9 -1
  33. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts +4 -2
  34. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -1
  35. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +9 -1
  36. package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts +2 -2
  37. package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts.map +1 -1
  38. package/dist/src/bitgo/utils/tss/eddsa/eddsa.js +7 -1
  39. package/dist/src/bitgo/wallet/iWallet.d.ts +49 -1
  40. package/dist/src/bitgo/wallet/iWallet.d.ts.map +1 -1
  41. package/dist/src/bitgo/wallet/iWallet.js +1 -1
  42. package/dist/src/bitgo/wallet/wallet.d.ts +70 -1
  43. package/dist/src/bitgo/wallet/wallet.d.ts.map +1 -1
  44. package/dist/src/bitgo/wallet/wallet.js +201 -1
  45. package/dist/src/index.d.ts +2 -0
  46. package/dist/src/index.d.ts.map +1 -1
  47. package/dist/src/index.js +4 -2
  48. package/dist/test/unit/bitgo/trading/tradingAccount.d.ts +2 -0
  49. package/dist/test/unit/bitgo/trading/tradingAccount.d.ts.map +1 -0
  50. package/dist/test/unit/bitgo/trading/tradingAccount.js +162 -0
  51. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts +2 -0
  52. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts.map +1 -0
  53. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.js +239 -0
  54. package/dist/test/unit/bitgo/wallet/ofcWalletSignTransaction.d.ts +2 -0
  55. package/dist/test/unit/bitgo/wallet/ofcWalletSignTransaction.d.ts.map +1 -0
  56. package/dist/test/unit/bitgo/wallet/ofcWalletSignTransaction.js +62 -0
  57. package/dist/test/unit/bitgo/wallet/resourceManagement.d.ts +3 -0
  58. package/dist/test/unit/bitgo/wallet/resourceManagement.d.ts.map +1 -0
  59. package/dist/test/unit/bitgo/wallet/resourceManagement.js +326 -0
  60. package/dist/tsconfig.tsbuildinfo +1 -1
  61. package/package.json +8 -8
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ /**
7
+ * @prettier
8
+ */
9
+ const sinon_1 = __importDefault(require("sinon"));
10
+ require("should");
11
+ const src_1 = require("../../../../src");
12
+ describe('Wallet - OFC signTransaction', function () {
13
+ let wallet;
14
+ let mockBitGo;
15
+ let mockBaseCoin;
16
+ let mockWalletData;
17
+ beforeEach(function () {
18
+ mockBitGo = {
19
+ url: sinon_1.default.stub().returns('https://test.bitgo.com'),
20
+ post: sinon_1.default.stub(),
21
+ get: sinon_1.default.stub(),
22
+ setRequestTracer: sinon_1.default.stub(),
23
+ };
24
+ mockBaseCoin = {
25
+ getFamily: sinon_1.default.stub().returns('ofc'),
26
+ url: sinon_1.default.stub().returns('https://test.bitgo.com/wallet'),
27
+ keychains: sinon_1.default.stub(),
28
+ supportsTss: sinon_1.default.stub().returns(false),
29
+ getMPCAlgorithm: sinon_1.default.stub(),
30
+ presignTransaction: sinon_1.default.stub().resolvesArg(0),
31
+ keyIdsForSigning: sinon_1.default.stub().returns([0]),
32
+ signTransaction: sinon_1.default.stub().resolves({ halfSigned: { payload: 'test', signature: 'aabbcc' } }),
33
+ };
34
+ mockWalletData = {
35
+ id: 'test-wallet-id',
36
+ coin: 'ofcusdt',
37
+ keys: ['user-key', 'backup-key', 'bitgo-key'],
38
+ multisigType: 'onchain',
39
+ enterprise: 'ent-id',
40
+ };
41
+ wallet = new src_1.Wallet(mockBitGo, mockBaseCoin, mockWalletData);
42
+ });
43
+ afterEach(function () {
44
+ sinon_1.default.restore();
45
+ });
46
+ it('should pass prv and paylaod to baseCoin.signTransaction', async function () {
47
+ const txPrebuild = { txInfo: { payload: '{"amount":"100"}' } };
48
+ const prv = 'test-prv';
49
+ await wallet.signTransaction({ txPrebuild, prv });
50
+ mockBaseCoin.signTransaction.calledOnce.should.be.true();
51
+ mockBaseCoin.signTransaction.calledWith({ txPrebuild, prv });
52
+ const callArgs = mockBaseCoin.signTransaction.getCall(0).args[0];
53
+ callArgs.prv.should.equal(prv);
54
+ });
55
+ it('should return the result from baseCoin.signTransaction', async function () {
56
+ const txPrebuild = { txInfo: { payload: '{"amount":"100"}' } };
57
+ const prv = 'test-prv';
58
+ const result = await wallet.signTransaction({ txPrebuild, prv });
59
+ result.should.deepEqual({ halfSigned: { payload: 'test', signature: 'aabbcc' } });
60
+ });
61
+ });
62
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2ZjV2FsbGV0U2lnblRyYW5zYWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGVzdC91bml0L2JpdGdvL3dhbGxldC9vZmNXYWxsZXRTaWduVHJhbnNhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTs7R0FFRztBQUNILGtEQUEwQjtBQUMxQixrQkFBZ0I7QUFDaEIseUNBQXlDO0FBRXpDLFFBQVEsQ0FBQyw4QkFBOEIsRUFBRTtJQUN2QyxJQUFJLE1BQWMsQ0FBQztJQUNuQixJQUFJLFNBQWMsQ0FBQztJQUNuQixJQUFJLFlBQWlCLENBQUM7SUFDdEIsSUFBSSxjQUFtQixDQUFDO0lBRXhCLFVBQVUsQ0FBQztRQUNULFNBQVMsR0FBRztZQUNWLEdBQUcsRUFBRSxlQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLHdCQUF3QixDQUFDO1lBQ25ELElBQUksRUFBRSxlQUFLLENBQUMsSUFBSSxFQUFFO1lBQ2xCLEdBQUcsRUFBRSxlQUFLLENBQUMsSUFBSSxFQUFFO1lBQ2pCLGdCQUFnQixFQUFFLGVBQUssQ0FBQyxJQUFJLEVBQUU7U0FDL0IsQ0FBQztRQUVGLFlBQVksR0FBRztZQUNiLFNBQVMsRUFBRSxlQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztZQUN0QyxHQUFHLEVBQUUsZUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQywrQkFBK0IsQ0FBQztZQUMxRCxTQUFTLEVBQUUsZUFBSyxDQUFDLElBQUksRUFBRTtZQUN2QixXQUFXLEVBQUUsZUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7WUFDeEMsZUFBZSxFQUFFLGVBQUssQ0FBQyxJQUFJLEVBQUU7WUFDN0Isa0JBQWtCLEVBQUUsZUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7WUFDL0MsZ0JBQWdCLEVBQUUsZUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNDLGVBQWUsRUFBRSxlQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsVUFBVSxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FBQztTQUNqRyxDQUFDO1FBRUYsY0FBYyxHQUFHO1lBQ2YsRUFBRSxFQUFFLGdCQUFnQjtZQUNwQixJQUFJLEVBQUUsU0FBUztZQUNmLElBQUksRUFBRSxDQUFDLFVBQVUsRUFBRSxZQUFZLEVBQUUsV0FBVyxDQUFDO1lBQzdDLFlBQVksRUFBRSxTQUFTO1lBQ3ZCLFVBQVUsRUFBRSxRQUFRO1NBQ3JCLENBQUM7UUFFRixNQUFNLEdBQUcsSUFBSSxZQUFNLENBQUMsU0FBUyxFQUFFLFlBQVksRUFBRSxjQUFjLENBQUMsQ0FBQztJQUMvRCxDQUFDLENBQUMsQ0FBQztJQUVILFNBQVMsQ0FBQztRQUNSLGVBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNsQixDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyx5REFBeUQsRUFBRSxLQUFLO1FBQ2pFLE1BQU0sVUFBVSxHQUFHLEVBQUUsTUFBTSxFQUFFLEVBQUUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLEVBQVMsQ0FBQztRQUN0RSxNQUFNLEdBQUcsR0FBRyxVQUFVLENBQUM7UUFFdkIsTUFBTSxNQUFNLENBQUMsZUFBZSxDQUFDLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFFbEQsWUFBWSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN6RCxZQUFZLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQzdELE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqRSxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDakMsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsd0RBQXdELEVBQUUsS0FBSztRQUNoRSxNQUFNLFVBQVUsR0FBRyxFQUFFLE1BQU0sRUFBRSxFQUFFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxFQUFTLENBQUM7UUFDdEUsTUFBTSxHQUFHLEdBQUcsVUFBVSxDQUFDO1FBRXZCLE1BQU0sTUFBTSxHQUFHLE1BQU0sTUFBTSxDQUFDLGVBQWUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBRWpFLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsVUFBVSxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3BGLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBwcmV0dGllclxuICovXG5pbXBvcnQgc2lub24gZnJvbSAnc2lub24nO1xuaW1wb3J0ICdzaG91bGQnO1xuaW1wb3J0IHsgV2FsbGV0IH0gZnJvbSAnLi4vLi4vLi4vLi4vc3JjJztcblxuZGVzY3JpYmUoJ1dhbGxldCAtIE9GQyBzaWduVHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gIGxldCB3YWxsZXQ6IFdhbGxldDtcbiAgbGV0IG1vY2tCaXRHbzogYW55O1xuICBsZXQgbW9ja0Jhc2VDb2luOiBhbnk7XG4gIGxldCBtb2NrV2FsbGV0RGF0YTogYW55O1xuXG4gIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgIG1vY2tCaXRHbyA9IHtcbiAgICAgIHVybDogc2lub24uc3R1YigpLnJldHVybnMoJ2h0dHBzOi8vdGVzdC5iaXRnby5jb20nKSxcbiAgICAgIHBvc3Q6IHNpbm9uLnN0dWIoKSxcbiAgICAgIGdldDogc2lub24uc3R1YigpLFxuICAgICAgc2V0UmVxdWVzdFRyYWNlcjogc2lub24uc3R1YigpLFxuICAgIH07XG5cbiAgICBtb2NrQmFzZUNvaW4gPSB7XG4gICAgICBnZXRGYW1pbHk6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKCdvZmMnKSxcbiAgICAgIHVybDogc2lub24uc3R1YigpLnJldHVybnMoJ2h0dHBzOi8vdGVzdC5iaXRnby5jb20vd2FsbGV0JyksXG4gICAgICBrZXljaGFpbnM6IHNpbm9uLnN0dWIoKSxcbiAgICAgIHN1cHBvcnRzVHNzOiBzaW5vbi5zdHViKCkucmV0dXJucyhmYWxzZSksXG4gICAgICBnZXRNUENBbGdvcml0aG06IHNpbm9uLnN0dWIoKSxcbiAgICAgIHByZXNpZ25UcmFuc2FjdGlvbjogc2lub24uc3R1YigpLnJlc29sdmVzQXJnKDApLFxuICAgICAga2V5SWRzRm9yU2lnbmluZzogc2lub24uc3R1YigpLnJldHVybnMoWzBdKSxcbiAgICAgIHNpZ25UcmFuc2FjdGlvbjogc2lub24uc3R1YigpLnJlc29sdmVzKHsgaGFsZlNpZ25lZDogeyBwYXlsb2FkOiAndGVzdCcsIHNpZ25hdHVyZTogJ2FhYmJjYycgfSB9KSxcbiAgICB9O1xuXG4gICAgbW9ja1dhbGxldERhdGEgPSB7XG4gICAgICBpZDogJ3Rlc3Qtd2FsbGV0LWlkJyxcbiAgICAgIGNvaW46ICdvZmN1c2R0JyxcbiAgICAgIGtleXM6IFsndXNlci1rZXknLCAnYmFja3VwLWtleScsICdiaXRnby1rZXknXSxcbiAgICAgIG11bHRpc2lnVHlwZTogJ29uY2hhaW4nLFxuICAgICAgZW50ZXJwcmlzZTogJ2VudC1pZCcsXG4gICAgfTtcblxuICAgIHdhbGxldCA9IG5ldyBXYWxsZXQobW9ja0JpdEdvLCBtb2NrQmFzZUNvaW4sIG1vY2tXYWxsZXREYXRhKTtcbiAgfSk7XG5cbiAgYWZ0ZXJFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBzaW5vbi5yZXN0b3JlKCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgcGFzcyBwcnYgYW5kIHBheWxhb2QgdG8gYmFzZUNvaW4uc2lnblRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHR4UHJlYnVpbGQgPSB7IHR4SW5mbzogeyBwYXlsb2FkOiAne1wiYW1vdW50XCI6XCIxMDBcIn0nIH0gfSBhcyBhbnk7XG4gICAgY29uc3QgcHJ2ID0gJ3Rlc3QtcHJ2JztcblxuICAgIGF3YWl0IHdhbGxldC5zaWduVHJhbnNhY3Rpb24oeyB0eFByZWJ1aWxkLCBwcnYgfSk7XG5cbiAgICBtb2NrQmFzZUNvaW4uc2lnblRyYW5zYWN0aW9uLmNhbGxlZE9uY2Uuc2hvdWxkLmJlLnRydWUoKTtcbiAgICBtb2NrQmFzZUNvaW4uc2lnblRyYW5zYWN0aW9uLmNhbGxlZFdpdGgoeyB0eFByZWJ1aWxkLCBwcnYgfSk7XG4gICAgY29uc3QgY2FsbEFyZ3MgPSBtb2NrQmFzZUNvaW4uc2lnblRyYW5zYWN0aW9uLmdldENhbGwoMCkuYXJnc1swXTtcbiAgICBjYWxsQXJncy5wcnYuc2hvdWxkLmVxdWFsKHBydik7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgcmV0dXJuIHRoZSByZXN1bHQgZnJvbSBiYXNlQ29pbi5zaWduVHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgdHhQcmVidWlsZCA9IHsgdHhJbmZvOiB7IHBheWxvYWQ6ICd7XCJhbW91bnRcIjpcIjEwMFwifScgfSB9IGFzIGFueTtcbiAgICBjb25zdCBwcnYgPSAndGVzdC1wcnYnO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd2FsbGV0LnNpZ25UcmFuc2FjdGlvbih7IHR4UHJlYnVpbGQsIHBydiB9KTtcblxuICAgIHJlc3VsdC5zaG91bGQuZGVlcEVxdWFsKHsgaGFsZlNpZ25lZDogeyBwYXlsb2FkOiAndGVzdCcsIHNpZ25hdHVyZTogJ2FhYmJjYycgfSB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
@@ -0,0 +1,3 @@
1
+ import 'should';
2
+ import 'should-sinon';
3
+ //# sourceMappingURL=resourceManagement.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resourceManagement.d.ts","sourceRoot":"","sources":["../../../../../test/unit/bitgo/wallet/resourceManagement.ts"],"names":[],"mappings":"AAEA,OAAO,QAAQ,CAAC;AAChB,OAAO,cAAc,CAAC"}
@@ -0,0 +1,326 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const assert = __importStar(require("assert"));
40
+ const sinon_1 = __importDefault(require("sinon"));
41
+ require("should");
42
+ require("should-sinon");
43
+ const src_1 = require("../../../../src");
44
+ describe('Wallet - resource management', function () {
45
+ let wallet;
46
+ let mockBitGo;
47
+ let mockBaseCoin;
48
+ let mockWalletData;
49
+ const delegations = [
50
+ { receiverAddress: 'TRecv1', amount: '1000', resource: 'ENERGY' },
51
+ { receiverAddress: 'TRecv2', amount: '2000', resource: 'BANDWIDTH' },
52
+ ];
53
+ const undelegations = [{ receiverAddress: 'TRecv1', amount: '1000', resource: 'ENERGY' }];
54
+ function stubPost(response) {
55
+ const resultStub = sinon_1.default.stub().resolves(response);
56
+ const sendStub = sinon_1.default.stub().returns({ result: resultStub });
57
+ mockBitGo.post.returns({ send: sendStub });
58
+ return { sendStub };
59
+ }
60
+ beforeEach(function () {
61
+ mockBitGo = {
62
+ post: sinon_1.default.stub(),
63
+ setRequestTracer: sinon_1.default.stub(),
64
+ };
65
+ mockBaseCoin = {
66
+ url: sinon_1.default.stub().callsFake((path) => `/ttrx${path}`),
67
+ supportsResourceDelegation: sinon_1.default.stub().returns(true),
68
+ supportsTss: sinon_1.default.stub().returns(false),
69
+ getMPCAlgorithm: sinon_1.default.stub().returns('ecdsa'),
70
+ getFullName: sinon_1.default.stub().returns('Tron'),
71
+ postProcessPrebuild: sinon_1.default.stub().callsFake((prebuild) => Promise.resolve(prebuild)),
72
+ };
73
+ mockWalletData = {
74
+ id: 'test-wallet-id',
75
+ keys: ['user-key', 'backup-key', 'bitgo-key'],
76
+ type: 'hot',
77
+ multisigType: 'hot',
78
+ };
79
+ wallet = new src_1.Wallet(mockBitGo, mockBaseCoin, mockWalletData);
80
+ });
81
+ afterEach(function () {
82
+ sinon_1.default.restore();
83
+ });
84
+ // ---------------------------------------------------------------------------
85
+ // buildResourceDelegations
86
+ // ---------------------------------------------------------------------------
87
+ describe('buildResourceDelegations', function () {
88
+ it('should throw if coin does not support resource delegation', async function () {
89
+ mockBaseCoin.supportsResourceDelegation.returns(false);
90
+ await wallet.buildResourceDelegations({ delegations }).should.be.rejectedWith('Tron does not support resource delegation.');
91
+ });
92
+ it('should throw if delegations array is empty', async function () {
93
+ await wallet.buildResourceDelegations({ delegations: [] }).should.be.rejectedWith('delegations must be a non-empty array.');
94
+ });
95
+ it('should POST to /delegateResources/build and return prebuilds with walletId', async function () {
96
+ stubPost({ transactions: [{ txHex: 'aaa' }, { txHex: 'bbb' }], errors: [] });
97
+ const result = await wallet.buildResourceDelegations({ delegations });
98
+ result.prebuilds.should.have.length(2);
99
+ result.buildFailures.should.have.length(0);
100
+ result.prebuilds[0].walletId.should.equal('test-wallet-id');
101
+ result.prebuilds[1].walletId.should.equal('test-wallet-id');
102
+ sinon_1.default.assert.calledOnce(mockBitGo.post);
103
+ mockBitGo.post.firstCall.args[0].should.containEql('/delegateResources/build');
104
+ });
105
+ it('should return buildFailures when API returns errors', async function () {
106
+ stubPost({
107
+ transactions: [{ txHex: 'aaa' }],
108
+ errors: [{ error: 'insufficient balance', receiverAddress: 'TRecv2' }],
109
+ });
110
+ const result = await wallet.buildResourceDelegations({ delegations });
111
+ result.prebuilds.should.have.length(1);
112
+ result.buildFailures.should.have.length(1);
113
+ result.buildFailures[0].should.deepEqual({ message: 'insufficient balance', receiverAddress: 'TRecv2' });
114
+ });
115
+ it('should throw if API response is missing transactions array', async function () {
116
+ stubPost({ errors: [] });
117
+ await wallet.buildResourceDelegations({ delegations }).should.be.rejectedWith('Unexpected response from /delegateResources/build: missing transactions array');
118
+ });
119
+ it('should only send whitelisted params (delegations, apiVersion) to the API', async function () {
120
+ const { sendStub } = stubPost({ transactions: [{ txHex: 'aaa' }], errors: [] });
121
+ await wallet.buildResourceDelegations({ delegations, walletPassphrase: 'secret' });
122
+ const bodyArg = sendStub.firstCall.args[0];
123
+ bodyArg.should.have.property('delegations');
124
+ bodyArg.should.not.have.property('walletPassphrase');
125
+ });
126
+ });
127
+ // ---------------------------------------------------------------------------
128
+ // buildResourceUndelegations
129
+ // ---------------------------------------------------------------------------
130
+ describe('buildResourceUndelegations', function () {
131
+ it('should throw if undelegations array is empty', async function () {
132
+ await wallet.buildResourceUndelegations({ undelegations: [] }).should.be.rejectedWith('undelegations must be a non-empty array.');
133
+ });
134
+ it('should POST to /undelegateResources/build and return prebuilds', async function () {
135
+ stubPost({ transactions: [{ txHex: 'ccc' }], errors: [] });
136
+ const result = await wallet.buildResourceUndelegations({ undelegations });
137
+ result.prebuilds.should.have.length(1);
138
+ result.buildFailures.should.have.length(0);
139
+ sinon_1.default.assert.calledOnce(mockBitGo.post);
140
+ mockBitGo.post.firstCall.args[0].should.containEql('/undelegateResources/build');
141
+ });
142
+ it('should return buildFailures when API returns errors for undelegations', async function () {
143
+ stubPost({
144
+ transactions: [],
145
+ errors: [{ error: 'lock period active', receiverAddress: 'TRecv1' }],
146
+ });
147
+ const result = await wallet.buildResourceUndelegations({ undelegations });
148
+ result.prebuilds.should.have.length(0);
149
+ result.buildFailures.should.have.length(1);
150
+ result.buildFailures[0].should.deepEqual({ message: 'lock period active', receiverAddress: 'TRecv1' });
151
+ });
152
+ });
153
+ // ---------------------------------------------------------------------------
154
+ // sendResourceDelegation (single)
155
+ // ---------------------------------------------------------------------------
156
+ describe('sendResourceDelegation', function () {
157
+ it('should throw if coin does not support resource delegation', async function () {
158
+ mockBaseCoin.supportsResourceDelegation.returns(false);
159
+ await wallet.sendResourceDelegation({ prebuildTx: { txHex: 'aaa' } }).should.be.rejectedWith('Tron does not support resource delegation.');
160
+ });
161
+ it('should throw if prebuildTx is undefined for a non-custodial wallet', async function () {
162
+ await wallet.sendResourceDelegation({}).should.be.rejectedWith('Invalid prebuild for resource management transaction.');
163
+ });
164
+ it('should call sendManyTxRequests for a TSS wallet', async function () {
165
+ mockWalletData.multisigType = 'tss';
166
+ wallet = new src_1.Wallet(mockBitGo, mockBaseCoin, mockWalletData);
167
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendManyTxRequests').resolves({ txid: 'tss-tx-1' });
168
+ const result = await wallet.sendResourceDelegation({ prebuildTx: { txRequestId: 'req-1' } });
169
+ result.should.deepEqual({ txid: 'tss-tx-1' });
170
+ sendManyStub.should.be.calledOnce();
171
+ });
172
+ it('should call prebuildAndSignTransaction + submitTransaction for a hot wallet', async function () {
173
+ const signedPrebuild = { txHex: 'signed-aaa', wallet };
174
+ sinon_1.default.stub(wallet, 'prebuildAndSignTransaction').resolves(signedPrebuild);
175
+ const submitStub = sinon_1.default.stub(wallet, 'submitTransaction').resolves({ txid: 'hot-tx-1' });
176
+ const result = await wallet.sendResourceDelegation({ prebuildTx: { txHex: 'aaa' } });
177
+ result.should.deepEqual({ txid: 'hot-tx-1' });
178
+ submitStub.should.be.calledOnce();
179
+ });
180
+ it('should call initiateTransaction for a custodial non-TSS wallet with stakingParams and recipients promoted from prebuildTx', async function () {
181
+ mockWalletData.type = 'custodial';
182
+ mockWalletData.multisigType = 'multisig';
183
+ wallet = new src_1.Wallet(mockBitGo, mockBaseCoin, mockWalletData);
184
+ const initiateStub = sinon_1.default.stub(wallet, 'initiateTransaction').resolves({ txid: 'custodial-tx-1' });
185
+ const stakingParams = {
186
+ actionType: 'delegateResource',
187
+ owner_address: 'TOwner',
188
+ receiver_address: 'TReceiver',
189
+ receiverAddress: 'TReceiver',
190
+ amount: '1000000000',
191
+ resource: 'ENERGY',
192
+ };
193
+ const recipients = [{ address: 'TReceiver', amount: '0' }];
194
+ const result = await wallet.sendResourceDelegation({
195
+ prebuildTx: { txHex: 'aaa', stakingParams, recipients },
196
+ });
197
+ result.should.deepEqual({ txid: 'custodial-tx-1' });
198
+ initiateStub.should.be.calledOnce();
199
+ const calledWith = initiateStub.firstCall.args[0];
200
+ calledWith.should.containEql({ type: 'delegateResource', stakingParams, recipients });
201
+ });
202
+ });
203
+ // ---------------------------------------------------------------------------
204
+ // sendResourceDelegations (bulk)
205
+ // ---------------------------------------------------------------------------
206
+ describe('sendResourceDelegations', function () {
207
+ beforeEach(function () {
208
+ sinon_1.default.stub(wallet, 'getKeychainsAndValidatePassphrase').resolves();
209
+ });
210
+ it('should throw if coin does not support resource delegation', async function () {
211
+ mockBaseCoin.supportsResourceDelegation.returns(false);
212
+ await wallet.sendResourceDelegations({ delegations }).should.be.rejectedWith('Tron does not support resource delegation.');
213
+ });
214
+ it('should propagate build failures with receiverAddress into the failure array', async function () {
215
+ sinon_1.default.stub(wallet, 'buildResourceManagementTransactions').resolves({
216
+ prebuilds: [],
217
+ buildFailures: [{ message: 'build error', receiverAddress: 'TRecv2' }],
218
+ });
219
+ const result = await wallet.sendResourceDelegations({ delegations });
220
+ result.success.should.have.length(0);
221
+ result.failure.should.have.length(1);
222
+ result.failure[0].should.deepEqual({ message: 'build error', receiverAddress: 'TRecv2' });
223
+ });
224
+ it('should return all successes when no failures', async function () {
225
+ sinon_1.default.stub(wallet, 'buildResourceManagementTransactions').resolves({
226
+ prebuilds: [{ txHex: 'aaa' }, { txHex: 'bbb' }],
227
+ buildFailures: [],
228
+ });
229
+ sinon_1.default.stub(wallet, 'sendResourceManagementTransaction').resolves({ txid: 'tx-ok' });
230
+ const result = await wallet.sendResourceDelegations({ delegations });
231
+ result.success.should.have.length(2);
232
+ result.failure.should.have.length(0);
233
+ });
234
+ it('should capture send failures with the correct receiverAddress from input entries', async function () {
235
+ sinon_1.default.stub(wallet, 'buildResourceManagementTransactions').resolves({
236
+ prebuilds: [{ txHex: 'aaa' }, { txHex: 'bbb' }],
237
+ buildFailures: [],
238
+ });
239
+ const sendStub = sinon_1.default.stub(wallet, 'sendResourceManagementTransaction');
240
+ sendStub.onFirstCall().resolves({ txid: 'tx-1' });
241
+ sendStub.onSecondCall().rejects(new Error('send failed'));
242
+ const result = await wallet.sendResourceDelegations({ delegations });
243
+ result.success.should.have.length(1);
244
+ result.failure.should.have.length(1);
245
+ result.failure[0].message.should.equal('send failed');
246
+ result.failure[0].should.have.property('receiverAddress', 'TRecv2');
247
+ });
248
+ it('should combine build failures and send failures in the failure array', async function () {
249
+ sinon_1.default.stub(wallet, 'buildResourceManagementTransactions').resolves({
250
+ prebuilds: [{ txHex: 'aaa' }],
251
+ buildFailures: [{ message: 'build error', receiverAddress: 'TRecv2' }],
252
+ });
253
+ sinon_1.default.stub(wallet, 'sendResourceManagementTransaction').rejects(new Error('send failed'));
254
+ const result = await wallet.sendResourceDelegations({ delegations });
255
+ result.success.should.have.length(0);
256
+ result.failure.should.have.length(2);
257
+ assert.ok(result.failure.find((f) => f.receiverAddress === 'TRecv2' && f.message === 'build error'));
258
+ assert.ok(result.failure.find((f) => f.receiverAddress === 'TRecv1' && f.message === 'send failed'));
259
+ });
260
+ });
261
+ // ---------------------------------------------------------------------------
262
+ // sendResourceUndelegation (single)
263
+ // ---------------------------------------------------------------------------
264
+ describe('sendResourceUndelegation', function () {
265
+ it('should throw if coin does not support resource delegation', async function () {
266
+ mockBaseCoin.supportsResourceDelegation.returns(false);
267
+ await wallet.sendResourceUndelegation({ prebuildTx: { txHex: 'aaa' } }).should.be.rejectedWith('Tron does not support resource delegation.');
268
+ });
269
+ it('should call sendManyTxRequests for a TSS wallet', async function () {
270
+ mockWalletData.multisigType = 'tss';
271
+ wallet = new src_1.Wallet(mockBitGo, mockBaseCoin, mockWalletData);
272
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendManyTxRequests').resolves({ txid: 'tss-undel-1' });
273
+ const result = await wallet.sendResourceUndelegation({ prebuildTx: { txRequestId: 'req-2' } });
274
+ result.should.deepEqual({ txid: 'tss-undel-1' });
275
+ sendManyStub.should.be.calledOnce();
276
+ });
277
+ it('should call prebuildAndSignTransaction + submitTransaction for a hot wallet', async function () {
278
+ const signedPrebuild = { txHex: 'signed-ccc', wallet };
279
+ sinon_1.default.stub(wallet, 'prebuildAndSignTransaction').resolves(signedPrebuild);
280
+ const submitStub = sinon_1.default.stub(wallet, 'submitTransaction').resolves({ txid: 'hot-undel-1' });
281
+ const result = await wallet.sendResourceUndelegation({ prebuildTx: { txHex: 'ccc' } });
282
+ result.should.deepEqual({ txid: 'hot-undel-1' });
283
+ submitStub.should.be.calledOnce();
284
+ });
285
+ });
286
+ // ---------------------------------------------------------------------------
287
+ // sendResourceUndelegations (bulk)
288
+ // ---------------------------------------------------------------------------
289
+ describe('sendResourceUndelegations', function () {
290
+ beforeEach(function () {
291
+ sinon_1.default.stub(wallet, 'getKeychainsAndValidatePassphrase').resolves();
292
+ });
293
+ it('should return all successes for undelegations', async function () {
294
+ sinon_1.default.stub(wallet, 'buildResourceManagementTransactions').resolves({
295
+ prebuilds: [{ txHex: 'ccc' }],
296
+ buildFailures: [],
297
+ });
298
+ sinon_1.default.stub(wallet, 'sendResourceManagementTransaction').resolves({ txid: 'undel-tx-1' });
299
+ const result = await wallet.sendResourceUndelegations({ undelegations });
300
+ result.success.should.have.length(1);
301
+ result.failure.should.have.length(0);
302
+ });
303
+ it('should capture send failures with correct receiverAddress for undelegations', async function () {
304
+ sinon_1.default.stub(wallet, 'buildResourceManagementTransactions').resolves({
305
+ prebuilds: [{ txHex: 'ccc' }],
306
+ buildFailures: [],
307
+ });
308
+ sinon_1.default.stub(wallet, 'sendResourceManagementTransaction').rejects(new Error('undel send failed'));
309
+ const result = await wallet.sendResourceUndelegations({ undelegations });
310
+ result.failure.should.have.length(1);
311
+ result.failure[0].message.should.equal('undel send failed');
312
+ result.failure[0].should.have.property('receiverAddress', 'TRecv1');
313
+ });
314
+ it('should propagate undelegation build failures into the failure array', async function () {
315
+ sinon_1.default.stub(wallet, 'buildResourceManagementTransactions').resolves({
316
+ prebuilds: [],
317
+ buildFailures: [{ message: 'lock period active', receiverAddress: 'TRecv1' }],
318
+ });
319
+ const result = await wallet.sendResourceUndelegations({ undelegations });
320
+ result.success.should.have.length(0);
321
+ result.failure.should.have.length(1);
322
+ result.failure[0].should.deepEqual({ message: 'lock period active', receiverAddress: 'TRecv1' });
323
+ });
324
+ });
325
+ });
326
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb3VyY2VNYW5hZ2VtZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGVzdC91bml0L2JpdGdvL3dhbGxldC9yZXNvdXJjZU1hbmFnZW1lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwrQ0FBaUM7QUFDakMsa0RBQTBCO0FBQzFCLGtCQUFnQjtBQUNoQix3QkFBc0I7QUFDdEIseUNBQXlDO0FBRXpDLFFBQVEsQ0FBQyw4QkFBOEIsRUFBRTtJQUN2QyxJQUFJLE1BQWMsQ0FBQztJQUNuQixJQUFJLFNBQWMsQ0FBQztJQUNuQixJQUFJLFlBQWlCLENBQUM7SUFDdEIsSUFBSSxjQUFtQixDQUFDO0lBRXhCLE1BQU0sV0FBVyxHQUFHO1FBQ2xCLEVBQUUsZUFBZSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUU7UUFDakUsRUFBRSxlQUFlLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRTtLQUNyRSxDQUFDO0lBRUYsTUFBTSxhQUFhLEdBQUcsQ0FBQyxFQUFFLGVBQWUsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUUxRixTQUFTLFFBQVEsQ0FBQyxRQUFhO1FBQzdCLE1BQU0sVUFBVSxHQUFHLGVBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbkQsTUFBTSxRQUFRLEdBQUcsZUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQzlELFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFD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QU8sRUFBRSxvQkFBb0IsRUFBRSxlQUFlLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUNuRyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCBzaW5vbiBmcm9tICdzaW5vbic7XG5pbXBvcnQgJ3Nob3VsZCc7XG5pbXBvcnQgJ3Nob3VsZC1zaW5vbic7XG5pbXBvcnQgeyBXYWxsZXQgfSBmcm9tICcuLi8uLi8uLi8uLi9zcmMnO1xuXG5kZXNjcmliZSgnV2FsbGV0IC0gcmVzb3VyY2UgbWFuYWdlbWVudCcsIGZ1bmN0aW9uICgpIHtcbiAgbGV0IHdhbGxldDogV2FsbGV0O1xuICBsZXQgbW9ja0JpdEdvOiBhbnk7XG4gIGxldCBtb2NrQmFzZUNvaW46IGFueTtcbiAgbGV0IG1vY2tXYWxsZXREYXRhOiBhbnk7XG5cbiAgY29uc3QgZGVsZWdhdGlvbnMgPSBbXG4gICAgeyByZWNlaXZlckFkZHJlc3M6ICdUUmVjdjEnLCBhbW91bnQ6ICcxMDAwJywgcmVzb3VyY2U6ICdFTkVSR1knIH0sXG4gICAgeyByZWNlaXZlckFkZHJlc3M6ICdUUmVjdjInLCBhbW91bnQ6ICcyMDAwJywgcmVzb3VyY2U6ICdCQU5EV0lEVEgnIH0sXG4gIF07XG5cbiAgY29uc3QgdW5kZWxlZ2F0aW9ucyA9IFt7IHJlY2VpdmVyQWRkcmVzczogJ1RSZWN2MScsIGFtb3VudDogJzEwMDAnLCByZXNvdXJjZTogJ0VORVJHWScgfV07XG5cbiAgZnVuY3Rpb24gc3R1YlBvc3QocmVzcG9uc2U6IGFueSkge1xuICAgIGNvbnN0IHJlc3VsdFN0dWIgPSBzaW5vbi5zdHViKCkucmVzb2x2ZXMocmVzcG9uc2UpO1xuICAgIGNvbnN0IHNlbmRTdHViID0gc2lub24uc3R1YigpLnJldHVybnMoeyByZXN1bHQ6IHJlc3VsdFN0dWIgfSk7XG4gICAgbW9ja0JpdEdvLnBvc3QucmV0dXJucyh7IHNlbmQ6IHNlbmRTdHViIH0pO1xuICAgIHJldHVybiB7IHNlbmRTdHViIH07XG4gIH1cblxuICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBtb2NrQml0R28gPSB7XG4gICAgICBwb3N0OiBzaW5vbi5zdHViKCksXG4gICAgICBzZXRSZXF1ZXN0VHJhY2VyOiBzaW5vbi5zdHViKCksXG4gICAgfTtcblxuICAgIG1vY2tCYXNlQ29pbiA9IHtcbiAgICAgIHVybDogc2lub24uc3R1YigpLmNhbGxzRmFrZSgocGF0aDogc3RyaW5nKSA9PiBgL3R0cngke3BhdGh9YCksXG4gICAgICBzdXBwb3J0c1Jlc291cmNlRGVsZWdhdGlvbjogc2lub24uc3R1YigpLnJldHVybnModHJ1ZSksXG4gICAgICBzdXBwb3J0c1Rzczogc2lub24uc3R1YigpLnJldHVybnMoZmFsc2UpLFxuICAgICAgZ2V0TVBDQWxnb3JpdGhtOiBzaW5vbi5zdHViKCkucmV0dXJucygnZWNkc2EnKSxcbiAgICAgIGdldEZ1bGxOYW1lOiBzaW5vbi5zdHViKCkucmV0dXJucygnVHJvbicpLFxuICAgICAgcG9zdFByb2Nlc3NQcmVidWlsZDogc2lub24uc3R1YigpLmNhbGxzRmFrZSgocHJlYnVpbGQ6IGFueSkgPT4gUHJvbWlzZS5yZXNvbHZlKHByZWJ1aWxkKSksXG4gICAgfTtcblxuICAgIG1vY2tXYWxsZXREYXRhID0ge1xuICAgICAgaWQ6ICd0ZXN0LXdhbGxldC1pZCcsXG4gICAgICBrZXlzOiBbJ3VzZXIta2V5JywgJ2JhY2t1cC1rZXknLCAnYml0Z28ta2V5J10sXG4gICAgICB0eXBlOiAnaG90JyxcbiAgICAgIG11bHRpc2lnVHlwZTogJ2hvdCcsXG4gICAgfTtcblxuICAgIHdhbGxldCA9IG5ldyBXYWxsZXQobW9ja0JpdEdvLCBtb2NrQmFzZUNvaW4sIG1vY2tXYWxsZXREYXRhKTtcbiAgfSk7XG5cbiAgYWZ0ZXJFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBzaW5vbi5yZXN0b3JlKCk7XG4gIH0pO1xuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBidWlsZFJlc291cmNlRGVsZWdhdGlvbnNcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIGRlc2NyaWJlKCdidWlsZFJlc291cmNlRGVsZWdhdGlvbnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBpZiBjb2luIGRvZXMgbm90IHN1cHBvcnQgcmVzb3VyY2UgZGVsZWdhdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIG1vY2tCYXNlQ29pbi5zdXBwb3J0c1Jlc291cmNlRGVsZWdhdGlvbi5yZXR1cm5zKGZhbHNlKTtcbiAgICAgIGF3YWl0ICh3YWxsZXQuYnVpbGRSZXNvdXJjZURlbGVnYXRpb25zKHsgZGVsZWdhdGlvbnMgfSkgYXMgYW55KS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKFxuICAgICAgICAnVHJvbiBkb2VzIG5vdCBzdXBwb3J0IHJlc291cmNlIGRlbGVnYXRpb24uJ1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgaWYgZGVsZWdhdGlvbnMgYXJyYXkgaXMgZW1wdHknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCAod2FsbGV0LmJ1aWxkUmVzb3VyY2VEZWxlZ2F0aW9ucyh7IGRlbGVnYXRpb25zOiBbXSB9KSBhcyBhbnkpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoXG4gICAgICAgICdkZWxlZ2F0aW9ucyBtdXN0IGJlIGEgbm9uLWVtcHR5IGFycmF5LidcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIFBPU1QgdG8gL2RlbGVnYXRlUmVzb3VyY2VzL2J1aWxkIGFuZCByZXR1cm4gcHJlYnVpbGRzIHdpdGggd2FsbGV0SWQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBzdHViUG9zdCh7IHRyYW5zYWN0aW9uczogW3sgdHhIZXg6ICdhYWEnIH0sIHsgdHhIZXg6ICdiYmInIH1dLCBlcnJvcnM6IFtdIH0pO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB3YWxsZXQuYnVpbGRSZXNvdXJjZURlbGVnYXRpb25zKHsgZGVsZWdhdGlvbnMgfSk7XG5cbiAgICAgIHJlc3VsdC5wcmVidWlsZHMuc2hvdWxkLmhhdmUubGVuZ3RoKDIpO1xuICAgICAgcmVzdWx0LmJ1aWxkRmFpbHVyZXMuc2hvdWxkLmhhdmUubGVuZ3RoKDApO1xuICAgICAgcmVzdWx0LnByZWJ1aWxkc1swXS53YWxsZXRJZC5zaG91bGQuZXF1YWwoJ3Rlc3Qtd2FsbGV0LWlkJyk7XG4gICAgICByZXN1bHQucHJlYnVpbGRzWzFdLndhbGxldElkLnNob3VsZC5lcXVhbCgndGVzdC13YWxsZXQtaWQnKTtcbiAgICAgIHNpbm9uLmFzc2VydC5jYWxsZWRPbmNlKG1vY2tCaXRHby5wb3N0KTtcbiAgICAgIChtb2NrQml0R28ucG9zdC5maXJzdENhbGwuYXJnc1swXSBhcyBzdHJpbmcpLnNob3VsZC5jb250YWluRXFsKCcvZGVsZWdhdGVSZXNvdXJjZXMvYnVpbGQnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGJ1aWxkRmFpbHVyZXMgd2hlbiBBUEkgcmV0dXJucyBlcnJvcnMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBzdHViUG9zdCh7XG4gICAgICAgIHRyYW5zYWN0aW9uczogW3sgdHhIZXg6ICdhYWEnIH1dLFxuICAgICAgICBlcnJvcnM6IFt7IGVycm9yOiAnaW5zdWZmaWNpZW50IGJhbGFuY2UnLCByZWNlaXZlckFkZHJlc3M6ICdUUmVjdjInIH1dLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHdhbGxldC5idWlsZFJlc291cmNlRGVsZWdhdGlvbnMoeyBkZWxlZ2F0aW9ucyB9KTtcblxuICAgICAgcmVzdWx0LnByZWJ1aWxkcy5zaG91bGQuaGF2ZS5sZW5ndGgoMSk7XG4gICAgICByZXN1bHQuYnVpbGRGYWlsdXJlcy5zaG91bGQuaGF2ZS5sZW5ndGgoMSk7XG4gICAgICByZXN1bHQuYnVpbGRGYWlsdXJlc1swXS5zaG91bGQuZGVlcEVxdWFsKHsgbWVzc2FnZTogJ2luc3VmZmljaWVudCBiYWxhbmNlJywgcmVjZWl2ZXJBZGRyZXNzOiAnVFJlY3YyJyB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgaWYgQVBJIHJlc3BvbnNlIGlzIG1pc3NpbmcgdHJhbnNhY3Rpb25zIGFycmF5JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgc3R1YlBvc3QoeyBlcnJvcnM6IFtdIH0pO1xuXG4gICAgICBhd2FpdCAod2FsbGV0LmJ1aWxkUmVzb3VyY2VEZWxlZ2F0aW9ucyh7IGRlbGVnYXRpb25zIH0pIGFzIGFueSkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aChcbiAgICAgICAgJ1VuZXhwZWN0ZWQgcmVzcG9uc2UgZnJvbSAvZGVsZWdhdGVSZXNvdXJjZXMvYnVpbGQ6IG1pc3NpbmcgdHJhbnNhY3Rpb25zIGFycmF5J1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgb25seSBzZW5kIHdoaXRlbGlzdGVkIHBhcmFtcyAoZGVsZWdhdGlvbnMsIGFwaVZlcnNpb24pIHRvIHRoZSBBUEknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB7IHNlbmRTdHViIH0gPSBzdHViUG9zdCh7IHRyYW5zYWN0aW9uczogW3sgdHhIZXg6ICdhYWEnIH1dLCBlcnJvcnM6IFtdIH0pO1xuXG4gICAgICBhd2FpdCB3YWxsZXQuYnVpbGRSZXNvdXJjZURlbGVnYXRpb25zKHsgZGVsZWdhdGlvbnMsIHdhbGxldFBhc3NwaHJhc2U6ICdzZWNyZXQnIH0pO1xuXG4gICAgICBjb25zdCBib2R5QXJnID0gc2VuZFN0dWIuZmlyc3RDYWxsLmFyZ3NbMF07XG4gICAgICBib2R5QXJnLnNob3VsZC5oYXZlLnByb3BlcnR5KCdkZWxlZ2F0aW9ucycpO1xuICAgICAgYm9keUFyZy5zaG91bGQubm90LmhhdmUucHJvcGVydHkoJ3dhbGxldFBhc3NwaHJhc2UnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIGJ1aWxkUmVzb3VyY2VVbmRlbGVnYXRpb25zXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICBkZXNjcmliZSgnYnVpbGRSZXNvdXJjZVVuZGVsZWdhdGlvbnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBpZiB1bmRlbGVnYXRpb25zIGFycmF5IGlzIGVtcHR5JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgKHdhbGxldC5idWlsZFJlc291cmNlVW5kZWxlZ2F0aW9ucyh7IHVuZGVsZWdhdGlvbnM6IFtdIH0pIGFzIGFueSkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aChcbiAgICAgICAgJ3VuZGVsZWdhdGlvbnMgbXVzdCBiZSBhIG5vbi1lbXB0eSBhcnJheS4nXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBQT1NUIHRvIC91bmRlbGVnYXRlUmVzb3VyY2VzL2J1aWxkIGFuZCByZXR1cm4gcHJlYnVpbGRzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgc3R1YlBvc3QoeyB0cmFuc2FjdGlvbnM6IFt7IHR4SGV4OiAnY2NjJyB9XSwgZXJyb3JzOiBbXSB9KTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd2FsbGV0LmJ1aWxkUmVzb3VyY2VVbmRlbGVnYXRpb25zKHsgdW5kZWxlZ2F0aW9ucyB9KTtcblxuICAgICAgcmVzdWx0LnByZWJ1aWxkcy5zaG91bGQuaGF2ZS5sZW5ndGgoMSk7XG4gICAgICByZXN1bHQuYnVpbGRGYWlsdXJlcy5zaG91bGQuaGF2ZS5sZW5ndGgoMCk7XG4gICAgICBzaW5vbi5hc3NlcnQuY2FsbGVkT25jZShtb2NrQml0R28ucG9zdCk7XG4gICAgICAobW9ja0JpdEdvLnBvc3QuZmlyc3RDYWxsLmFyZ3NbMF0gYXMgc3RyaW5nKS5zaG91bGQuY29udGFpbkVxbCgnL3VuZGVsZWdhdGVSZXNvdXJjZXMvYnVpbGQnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGJ1aWxkRmFpbHVyZXMgd2hlbiBBUEkgcmV0dXJucyBlcnJvcnMgZm9yIHVuZGVsZWdhdGlvbnMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBzdHViUG9zdCh7XG4gICAgICAgIHRyYW5zYWN0aW9uczogW10sXG4gICAgICAgIGVycm9yczogW3sgZXJyb3I6ICdsb2NrIHBlcmlvZCBhY3RpdmUnLCByZWNlaXZlckFkZHJlc3M6ICdUUmVjdjEnIH1dLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHdhbGxldC5idWlsZFJlc291cmNlVW5kZWxlZ2F0aW9ucyh7IHVuZGVsZWdhdGlvbnMgfSk7XG5cbiAgICAgIHJlc3VsdC5wcmVidWlsZHMuc2hvdWxkLmhhdmUubGVuZ3RoKDApO1xuICAgICAgcmVzdWx0LmJ1aWxkRmFpbHVyZXMuc2hvdWxkLmhhdmUubGVuZ3RoKDEpO1xuICAgICAgcmVzdWx0LmJ1aWxkRmFpbHVyZXNbMF0uc2hvdWxkLmRlZXBFcXVhbCh7IG1lc3NhZ2U6ICdsb2NrIHBlcmlvZCBhY3RpdmUnLCByZWNlaXZlckFkZHJlc3M6ICdUUmVjdjEnIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gc2VuZFJlc291cmNlRGVsZWdhdGlvbiAoc2luZ2xlKVxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgZGVzY3JpYmUoJ3NlbmRSZXNvdXJjZURlbGVnYXRpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBpZiBjb2luIGRvZXMgbm90IHN1cHBvcnQgcmVzb3VyY2UgZGVsZWdhdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIG1vY2tCYXNlQ29pbi5zdXBwb3J0c1Jlc291cmNlRGVsZWdhdGlvbi5yZXR1cm5zKGZhbHNlKTtcbiAgICAgIGF3YWl0ICh3YWxsZXQuc2VuZFJlc291cmNlRGVsZWdhdGlvbih7IHByZWJ1aWxkVHg6IHsgdHhIZXg6ICdhYWEnIH0gYXMgYW55IH0pIGFzIGFueSkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aChcbiAgICAgICAgJ1Ryb24gZG9lcyBub3Qgc3VwcG9ydCByZXNvdXJjZSBkZWxlZ2F0aW9uLidcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGlmIHByZWJ1aWxkVHggaXMgdW5kZWZpbmVkIGZvciBhIG5vbi1jdXN0b2RpYWwgd2FsbGV0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgKHdhbGxldC5zZW5kUmVzb3VyY2VEZWxlZ2F0aW9uKHt9KSBhcyBhbnkpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoXG4gICAgICAgICdJbnZhbGlkIHByZWJ1aWxkIGZvciByZXNvdXJjZSBtYW5hZ2VtZW50IHRyYW5zYWN0aW9uLidcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGNhbGwgc2VuZE1hbnlUeFJlcXVlc3RzIGZvciBhIFRTUyB3YWxsZXQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBtb2NrV2FsbGV0RGF0YS5tdWx0aXNpZ1R5cGUgPSAndHNzJztcbiAgICAgIHdhbGxldCA9IG5ldyBXYWxsZXQobW9ja0JpdEdvLCBtb2NrQmFzZUNvaW4sIG1vY2tXYWxsZXREYXRhKTtcbiAgICAgIGNvbnN0IHNlbmRNYW55U3R1YiA9IHNpbm9uLnN0dWIod2FsbGV0IGFzIGFueSwgJ3NlbmRNYW55VHhSZXF1ZXN0cycpLnJlc29sdmVzKHsgdHhpZDogJ3Rzcy10eC0xJyB9KTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd2FsbGV0LnNlbmRSZXNvdXJjZURlbGVnYXRpb24oeyBwcmVidWlsZFR4OiB7IHR4UmVxdWVzdElkOiAncmVxLTEnIH0gYXMgYW55IH0pO1xuXG4gICAgICByZXN1bHQuc2hvdWxkLmRlZXBFcXVhbCh7IHR4aWQ6ICd0c3MtdHgtMScgfSk7XG4gICAgICBzZW5kTWFueVN0dWIuc2hvdWxkLmJlLmNhbGxlZE9uY2UoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgY2FsbCBwcmVidWlsZEFuZFNpZ25UcmFuc2FjdGlvbiArIHN1Ym1pdFRyYW5zYWN0aW9uIGZvciBhIGhvdCB3YWxsZXQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBzaWduZWRQcmVidWlsZCA9IHsgdHhIZXg6ICdzaWduZWQtYWFhJywgd2FsbGV0IH07XG4gICAgICBzaW5vbi5zdHViKHdhbGxldCwgJ3ByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uJykucmVzb2x2ZXMoc2lnbmVkUHJlYnVpbGQgYXMgYW55KTtcbiAgICAgIGNvbnN0IHN1Ym1pdFN0dWIgPSBzaW5vbi5zdHViKHdhbGxldCwgJ3N1Ym1pdFRyYW5zYWN0aW9uJykucmVzb2x2ZXMoeyB0eGlkOiAnaG90LXR4LTEnIH0gYXMgYW55KTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd2FsbGV0LnNlbmRSZXNvdXJjZURlbGVnYXRpb24oeyBwcmVidWlsZFR4OiB7IHR4SGV4OiAnYWFhJyB9IGFzIGFueSB9KTtcblxuICAgICAgcmVzdWx0LnNob3VsZC5kZWVwRXF1YWwoeyB0eGlkOiAnaG90LXR4LTEnIH0pO1xuICAgICAgc3VibWl0U3R1Yi5zaG91bGQuYmUuY2FsbGVkT25jZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBjYWxsIGluaXRpYXRlVHJhbnNhY3Rpb24gZm9yIGEgY3VzdG9kaWFsIG5vbi1UU1Mgd2FsbGV0IHdpdGggc3Rha2luZ1BhcmFtcyBhbmQgcmVjaXBpZW50cyBwcm9tb3RlZCBmcm9tIHByZWJ1aWxkVHgnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBtb2NrV2FsbGV0RGF0YS50eXBlID0gJ2N1c3RvZGlhbCc7XG4gICAgICBtb2NrV2FsbGV0RGF0YS5tdWx0aXNpZ1R5cGUgPSAnbXVsdGlzaWcnO1xuICAgICAgd2FsbGV0ID0gbmV3IFdhbGxldChtb2NrQml0R28sIG1vY2tCYXNlQ29pbiwgbW9ja1dhbGxldERhdGEpO1xuICAgICAgY29uc3QgaW5pdGlhdGVTdHViID0gc2lub24uc3R1Yih3YWxsZXQgYXMgYW55LCAnaW5pdGlhdGVUcmFuc2FjdGlvbicpLnJlc29sdmVzKHsgdHhpZDogJ2N1c3RvZGlhbC10eC0xJyB9KTtcblxuICAgICAgY29uc3Qgc3Rha2luZ1BhcmFtcyA9IHtcbiAgICAgICAgYWN0aW9uVHlwZTogJ2RlbGVnYXRlUmVzb3VyY2UnLFxuICAgICAgICBvd25lcl9hZGRyZXNzOiAnVE93bmVyJyxcbiAgICAgICAgcmVjZWl2ZXJfYWRkcmVzczogJ1RSZWNlaXZlcicsXG4gICAgICAgIHJlY2VpdmVyQWRkcmVzczogJ1RSZWNlaXZlcicsXG4gICAgICAgIGFtb3VudDogJzEwMDAwMDAwMDAnLFxuICAgICAgICByZXNvdXJjZTogJ0VORVJHWScsXG4gICAgICB9O1xuICAgICAgY29uc3QgcmVjaXBpZW50cyA9IFt7IGFkZHJlc3M6ICdUUmVjZWl2ZXInLCBhbW91bnQ6ICcwJyB9XTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd2FsbGV0LnNlbmRSZXNvdXJjZURlbGVnYXRpb24oe1xuICAgICAgICBwcmVidWlsZFR4OiB7IHR4SGV4OiAnYWFhJywgc3Rha2luZ1BhcmFtcywgcmVjaXBpZW50cyB9IGFzIGFueSxcbiAgICAgIH0pO1xuXG4gICAgICByZXN1bHQuc2hvdWxkLmRlZXBFcXVhbCh7IHR4aWQ6ICdjdXN0b2RpYWwtdHgtMScgfSk7XG4gICAgICBpbml0aWF0ZVN0dWIuc2hvdWxkLmJlLmNhbGxlZE9uY2UoKTtcbiAgICAgIGNvbnN0IGNhbGxlZFdpdGggPSBpbml0aWF0ZVN0dWIuZmlyc3RDYWxsLmFyZ3NbMF07XG4gICAgICBjYWxsZWRXaXRoLnNob3VsZC5jb250YWluRXFsKHsgdHlwZTogJ2RlbGVnYXRlUmVzb3VyY2UnLCBzdGFraW5nUGFyYW1zLCByZWNpcGllbnRzIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gc2VuZFJlc291cmNlRGVsZWdhdGlvbnMgKGJ1bGspXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICBkZXNjcmliZSgnc2VuZFJlc291cmNlRGVsZWdhdGlvbnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBzaW5vbi5zdHViKHdhbGxldCBhcyBhbnksICdnZXRLZXljaGFpbnNBbmRWYWxpZGF0ZVBhc3NwaHJhc2UnKS5yZXNvbHZlcygpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBpZiBjb2luIGRvZXMgbm90IHN1cHBvcnQgcmVzb3VyY2UgZGVsZWdhdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIG1vY2tCYXNlQ29pbi5zdXBwb3J0c1Jlc291cmNlRGVsZWdhdGlvbi5yZXR1cm5zKGZhbHNlKTtcbiAgICAgIGF3YWl0ICh3YWxsZXQuc2VuZFJlc291cmNlRGVsZWdhdGlvbnMoeyBkZWxlZ2F0aW9ucyB9KSBhcyBhbnkpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoXG4gICAgICAgICdUcm9uIGRvZXMgbm90IHN1cHBvcnQgcmVzb3VyY2UgZGVsZWdhdGlvbi4nXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBwcm9wYWdhdGUgYnVpbGQgZmFpbHVyZXMgd2l0aCByZWNlaXZlckFkZHJlc3MgaW50byB0aGUgZmFpbHVyZSBhcnJheScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNpbm9uLnN0dWIod2FsbGV0IGFzIGFueSwgJ2J1aWxkUmVzb3VyY2VNYW5hZ2VtZW50VHJhbnNhY3Rpb25zJykucmVzb2x2ZXMoe1xuICAgICAgICBwcmVidWlsZHM6IFtdLFxuICAgICAgICBidWlsZEZhaWx1cmVzOiBbeyBtZXNzYWdlOiAnYnVpbGQgZXJyb3InLCByZWNlaXZlckFkZHJlc3M6ICdUUmVjdjInIH1dLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHdhbGxldC5zZW5kUmVzb3VyY2VEZWxlZ2F0aW9ucyh7IGRlbGVnYXRpb25zIH0pO1xuXG4gICAgICByZXN1bHQuc3VjY2Vzcy5zaG91bGQuaGF2ZS5sZW5ndGgoMCk7XG4gICAgICByZXN1bHQuZmFpbHVyZS5zaG91bGQuaGF2ZS5sZW5ndGgoMSk7XG4gICAgICByZXN1bHQuZmFpbHVyZVswXS5zaG91bGQuZGVlcEVxdWFsKHsgbWVzc2FnZTogJ2J1aWxkIGVycm9yJywgcmVjZWl2ZXJBZGRyZXNzOiAnVFJlY3YyJyB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGFsbCBzdWNjZXNzZXMgd2hlbiBubyBmYWlsdXJlcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNpbm9uLnN0dWIod2FsbGV0IGFzIGFueSwgJ2J1aWxkUmVzb3VyY2VNYW5hZ2VtZW50VHJhbnNhY3Rpb25zJykucmVzb2x2ZXMoe1xuICAgICAgICBwcmVidWlsZHM6IFt7IHR4SGV4OiAnYWFhJyB9LCB7IHR4SGV4OiAnYmJiJyB9XSxcbiAgICAgICAgYnVpbGRGYWlsdXJlczogW10sXG4gICAgICB9KTtcbiAgICAgIHNpbm9uLnN0dWIod2FsbGV0IGFzIGFueSwgJ3NlbmRSZXNvdXJjZU1hbmFnZW1lbnRUcmFuc2FjdGlvbicpLnJlc29sdmVzKHsgdHhpZDogJ3R4LW9rJyB9KTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd2FsbGV0LnNlbmRSZXNvdXJjZURlbGVnYXRpb25zKHsgZGVsZWdhdGlvbnMgfSk7XG5cbiAgICAgIHJlc3VsdC5zdWNjZXNzLnNob3VsZC5oYXZlLmxlbmd0aCgyKTtcbiAgICAgIHJlc3VsdC5mYWlsdXJlLnNob3VsZC5oYXZlLmxlbmd0aCgwKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgY2FwdHVyZSBzZW5kIGZhaWx1cmVzIHdpdGggdGhlIGNvcnJlY3QgcmVjZWl2ZXJBZGRyZXNzIGZyb20gaW5wdXQgZW50cmllcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNpbm9uLnN0dWIod2FsbGV0IGFzIGFueSwgJ2J1aWxkUmVzb3VyY2VNYW5hZ2VtZW50VHJhbnNhY3Rpb25zJykucmVzb2x2ZXMoe1xuICAgICAgICBwcmVidWlsZHM6IFt7IHR4SGV4OiAnYWFhJyB9LCB7IHR4SGV4OiAnYmJiJyB9XSxcbiAgICAgICAgYnVpbGRGYWlsdXJlczogW10sXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHNlbmRTdHViID0gc2lub24uc3R1Yih3YWxsZXQgYXMgYW55LCAnc2VuZFJlc291cmNlTWFuYWdlbWVudFRyYW5zYWN0aW9uJyk7XG4gICAgICBzZW5kU3R1Yi5vbkZpcnN0Q2FsbCgpLnJlc29sdmVzKHsgdHhpZDogJ3R4LTEnIH0pO1xuICAgICAgc2VuZFN0dWIub25TZWNvbmRDYWxsKCkucmVqZWN0cyhuZXcgRXJyb3IoJ3NlbmQgZmFpbGVkJykpO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB3YWxsZXQuc2VuZFJlc291cmNlRGVsZWdhdGlvbnMoeyBkZWxlZ2F0aW9ucyB9KTtcblxuICAgICAgcmVzdWx0LnN1Y2Nlc3Muc2hvdWxkLmhhdmUubGVuZ3RoKDEpO1xuICAgICAgcmVzdWx0LmZhaWx1cmUuc2hvdWxkLmhhdmUubGVuZ3RoKDEpO1xuICAgICAgcmVzdWx0LmZhaWx1cmVbMF0ubWVzc2FnZS5zaG91bGQuZXF1YWwoJ3NlbmQgZmFpbGVkJyk7XG4gICAgICByZXN1bHQuZmFpbHVyZVswXS5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgncmVjZWl2ZXJBZGRyZXNzJywgJ1RSZWN2MicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBjb21iaW5lIGJ1aWxkIGZhaWx1cmVzIGFuZCBzZW5kIGZhaWx1cmVzIGluIHRoZSBmYWlsdXJlIGFycmF5JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgc2lub24uc3R1Yih3YWxsZXQgYXMgYW55LCAnYnVpbGRSZXNvdXJjZU1hbmFnZW1lbnRUcmFuc2FjdGlvbnMnKS5yZXNvbHZlcyh7XG4gICAgICAgIHByZWJ1aWxkczogW3sgdHhIZXg6ICdhYWEnIH1dLFxuICAgICAgICBidWlsZEZhaWx1cmVzOiBbeyBtZXNzYWdlOiAnYnVpbGQgZXJyb3InLCByZWNlaXZlckFkZHJlc3M6ICdUUmVjdjInIH1dLFxuICAgICAgfSk7XG4gICAgICBzaW5vbi5zdHViKHdhbGxldCBhcyBhbnksICdzZW5kUmVzb3VyY2VNYW5hZ2VtZW50VHJhbnNhY3Rpb24nKS5yZWplY3RzKG5ldyBFcnJvcignc2VuZCBmYWlsZWQnKSk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHdhbGxldC5zZW5kUmVzb3VyY2VEZWxlZ2F0aW9ucyh7IGRlbGVnYXRpb25zIH0pO1xuXG4gICAgICByZXN1bHQuc3VjY2Vzcy5zaG91bGQuaGF2ZS5sZW5ndGgoMCk7XG4gICAgICByZXN1bHQuZmFpbHVyZS5zaG91bGQuaGF2ZS5sZW5ndGgoMik7XG4gICAgICBhc3NlcnQub2socmVzdWx0LmZhaWx1cmUuZmluZCgoZikgPT4gZi5yZWNlaXZlckFkZHJlc3MgPT09ICdUUmVjdjInICYmIGYubWVzc2FnZSA9PT0gJ2J1aWxkIGVycm9yJykpO1xuICAgICAgYXNzZXJ0Lm9rKHJlc3VsdC5mYWlsdXJlLmZpbmQoKGYpID0+IGYucmVjZWl2ZXJBZGRyZXNzID09PSAnVFJlY3YxJyAmJiBmLm1lc3NhZ2UgPT09ICdzZW5kIGZhaWxlZCcpKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIHNlbmRSZXNvdXJjZVVuZGVsZWdhdGlvbiAoc2luZ2xlKVxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgZGVzY3JpYmUoJ3NlbmRSZXNvdXJjZVVuZGVsZWdhdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHRocm93IGlmIGNvaW4gZG9lcyBub3Qgc3VwcG9ydCByZXNvdXJjZSBkZWxlZ2F0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgbW9ja0Jhc2VDb2luLnN1cHBvcnRzUmVzb3VyY2VEZWxlZ2F0aW9uLnJldHVybnMoZmFsc2UpO1xuICAgICAgYXdhaXQgKHdhbGxldC5zZW5kUmVzb3VyY2VVbmRlbGVnYXRpb24oeyBwcmVidWlsZFR4OiB7IHR4SGV4OiAnYWFhJyB9IGFzIGFueSB9KSBhcyBhbnkpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoXG4gICAgICAgICdUcm9uIGRvZXMgbm90IHN1cHBvcnQgcmVzb3VyY2UgZGVsZWdhdGlvbi4nXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBjYWxsIHNlbmRNYW55VHhSZXF1ZXN0cyBmb3IgYSBUU1Mgd2FsbGV0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgbW9ja1dhbGxldERhdGEubXVsdGlzaWdUeXBlID0gJ3Rzcyc7XG4gICAgICB3YWxsZXQgPSBuZXcgV2FsbGV0KG1vY2tCaXRHbywgbW9ja0Jhc2VDb2luLCBtb2NrV2FsbGV0RGF0YSk7XG4gICAgICBjb25zdCBzZW5kTWFueVN0dWIgPSBzaW5vbi5zdHViKHdhbGxldCBhcyBhbnksICdzZW5kTWFueVR4UmVxdWVzdHMnKS5yZXNvbHZlcyh7IHR4aWQ6ICd0c3MtdW5kZWwtMScgfSk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHdhbGxldC5zZW5kUmVzb3VyY2VVbmRlbGVnYXRpb24oeyBwcmVidWlsZFR4OiB7IHR4UmVxdWVzdElkOiAncmVxLTInIH0gYXMgYW55IH0pO1xuXG4gICAgICByZXN1bHQuc2hvdWxkLmRlZXBFcXVhbCh7IHR4aWQ6ICd0c3MtdW5kZWwtMScgfSk7XG4gICAgICBzZW5kTWFueVN0dWIuc2hvdWxkLmJlLmNhbGxlZE9uY2UoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgY2FsbCBwcmVidWlsZEFuZFNpZ25UcmFuc2FjdGlvbiArIHN1Ym1pdFRyYW5zYWN0aW9uIGZvciBhIGhvdCB3YWxsZXQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBzaWduZWRQcmVidWlsZCA9IHsgdHhIZXg6ICdzaWduZWQtY2NjJywgd2FsbGV0IH07XG4gICAgICBzaW5vbi5zdHViKHdhbGxldCwgJ3ByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uJykucmVzb2x2ZXMoc2lnbmVkUHJlYnVpbGQgYXMgYW55KTtcbiAgICAgIGNvbnN0IHN1Ym1pdFN0dWIgPSBzaW5vbi5zdHViKHdhbGxldCwgJ3N1Ym1pdFRyYW5zYWN0aW9uJykucmVzb2x2ZXMoeyB0eGlkOiAnaG90LXVuZGVsLTEnIH0gYXMgYW55KTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd2FsbGV0LnNlbmRSZXNvdXJjZVVuZGVsZWdhdGlvbih7IHByZWJ1aWxkVHg6IHsgdHhIZXg6ICdjY2MnIH0gYXMgYW55IH0pO1xuXG4gICAgICByZXN1bHQuc2hvdWxkLmRlZXBFcXVhbCh7IHR4aWQ6ICdob3QtdW5kZWwtMScgfSk7XG4gICAgICBzdWJtaXRTdHViLnNob3VsZC5iZS5jYWxsZWRPbmNlKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBzZW5kUmVzb3VyY2VVbmRlbGVnYXRpb25zIChidWxrKVxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgZGVzY3JpYmUoJ3NlbmRSZXNvdXJjZVVuZGVsZWdhdGlvbnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBzaW5vbi5zdHViKHdhbGxldCBhcyBhbnksICdnZXRLZXljaGFpbnNBbmRWYWxpZGF0ZVBhc3NwaHJhc2UnKS5yZXNvbHZlcygpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYWxsIHN1Y2Nlc3NlcyBmb3IgdW5kZWxlZ2F0aW9ucycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNpbm9uLnN0dWIod2FsbGV0IGFzIGFueSwgJ2J1aWxkUmVzb3VyY2VNYW5hZ2VtZW50VHJhbnNhY3Rpb25zJykucmVzb2x2ZXMoe1xuICAgICAgICBwcmVidWlsZHM6IFt7IHR4SGV4OiAnY2NjJyB9XSxcbiAgICAgICAgYnVpbGRGYWlsdXJlczogW10sXG4gICAgICB9KTtcbiAgICAgIHNpbm9uLnN0dWIod2FsbGV0IGFzIGFueSwgJ3NlbmRSZXNvdXJjZU1hbmFnZW1lbnRUcmFuc2FjdGlvbicpLnJlc29sdmVzKHsgdHhpZDogJ3VuZGVsLXR4LTEnIH0pO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB3YWxsZXQuc2VuZFJlc291cmNlVW5kZWxlZ2F0aW9ucyh7IHVuZGVsZWdhdGlvbnMgfSk7XG5cbiAgICAgIHJlc3VsdC5zdWNjZXNzLnNob3VsZC5oYXZlLmxlbmd0aCgxKTtcbiAgICAgIHJlc3VsdC5mYWlsdXJlLnNob3VsZC5oYXZlLmxlbmd0aCgwKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgY2FwdHVyZSBzZW5kIGZhaWx1cmVzIHdpdGggY29ycmVjdCByZWNlaXZlckFkZHJlc3MgZm9yIHVuZGVsZWdhdGlvbnMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBzaW5vbi5zdHViKHdhbGxldCBhcyBhbnksICdidWlsZFJlc291cmNlTWFuYWdlbWVudFRyYW5zYWN0aW9ucycpLnJlc29sdmVzKHtcbiAgICAgICAgcHJlYnVpbGRzOiBbeyB0eEhleDogJ2NjYycgfV0sXG4gICAgICAgIGJ1aWxkRmFpbHVyZXM6IFtdLFxuICAgICAgfSk7XG4gICAgICBzaW5vbi5zdHViKHdhbGxldCBhcyBhbnksICdzZW5kUmVzb3VyY2VNYW5hZ2VtZW50VHJhbnNhY3Rpb24nKS5yZWplY3RzKG5ldyBFcnJvcigndW5kZWwgc2VuZCBmYWlsZWQnKSk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHdhbGxldC5zZW5kUmVzb3VyY2VVbmRlbGVnYXRpb25zKHsgdW5kZWxlZ2F0aW9ucyB9KTtcblxuICAgICAgcmVzdWx0LmZhaWx1cmUuc2hvdWxkLmhhdmUubGVuZ3RoKDEpO1xuICAgICAgcmVzdWx0LmZhaWx1cmVbMF0ubWVzc2FnZS5zaG91bGQuZXF1YWwoJ3VuZGVsIHNlbmQgZmFpbGVkJyk7XG4gICAgICByZXN1bHQuZmFpbHVyZVswXS5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgncmVjZWl2ZXJBZGRyZXNzJywgJ1RSZWN2MScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBwcm9wYWdhdGUgdW5kZWxlZ2F0aW9uIGJ1aWxkIGZhaWx1cmVzIGludG8gdGhlIGZhaWx1cmUgYXJyYXknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBzaW5vbi5zdHViKHdhbGxldCBhcyBhbnksICdidWlsZFJlc291cmNlTWFuYWdlbWVudFRyYW5zYWN0aW9ucycpLnJlc29sdmVzKHtcbiAgICAgICAgcHJlYnVpbGRzOiBbXSxcbiAgICAgICAgYnVpbGRGYWlsdXJlczogW3sgbWVzc2FnZTogJ2xvY2sgcGVyaW9kIGFjdGl2ZScsIHJlY2VpdmVyQWRkcmVzczogJ1RSZWN2MScgfV0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd2FsbGV0LnNlbmRSZXNvdXJjZVVuZGVsZWdhdGlvbnMoeyB1bmRlbGVnYXRpb25zIH0pO1xuXG4gICAgICByZXN1bHQuc3VjY2Vzcy5zaG91bGQuaGF2ZS5sZW5ndGgoMCk7XG4gICAgICByZXN1bHQuZmFpbHVyZS5zaG91bGQuaGF2ZS5sZW5ndGgoMSk7XG4gICAgICByZXN1bHQuZmFpbHVyZVswXS5zaG91bGQuZGVlcEVxdWFsKHsgbWVzc2FnZTogJ2xvY2sgcGVyaW9kIGFjdGl2ZScsIHJlY2VpdmVyQWRkcmVzczogJ1RSZWN2MScgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=