@bitgo/sdk-core 37.0.0 → 37.1.0

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 (59) hide show
  1. package/dist/src/account-lib/baseCoin/enum.d.ts +20 -17
  2. package/dist/src/account-lib/baseCoin/enum.d.ts.map +1 -1
  3. package/dist/src/account-lib/baseCoin/enum.js +24 -18
  4. package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts +10 -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/environments.d.ts +1 -0
  8. package/dist/src/bitgo/environments.d.ts.map +1 -1
  9. package/dist/src/bitgo/environments.js +9 -1
  10. package/dist/src/bitgo/keychain/iKeychains.d.ts +1 -0
  11. package/dist/src/bitgo/keychain/iKeychains.d.ts.map +1 -1
  12. package/dist/src/bitgo/keychain/iKeychains.js +1 -1
  13. package/dist/src/bitgo/keychain/keychains.d.ts +19 -2
  14. package/dist/src/bitgo/keychain/keychains.d.ts.map +1 -1
  15. package/dist/src/bitgo/keychain/keychains.js +65 -7
  16. package/dist/src/bitgo/trading/iTradingAccount.d.ts +1 -0
  17. package/dist/src/bitgo/trading/iTradingAccount.d.ts.map +1 -1
  18. package/dist/src/bitgo/trading/iTradingAccount.js +1 -1
  19. package/dist/src/bitgo/trading/tradingAccount.d.ts +1 -0
  20. package/dist/src/bitgo/trading/tradingAccount.d.ts.map +1 -1
  21. package/dist/src/bitgo/trading/tradingAccount.js +7 -5
  22. package/dist/src/bitgo/utils/tss/addressVerification.d.ts.map +1 -1
  23. package/dist/src/bitgo/utils/tss/addressVerification.js +10 -3
  24. package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts +31 -0
  25. package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts.map +1 -1
  26. package/dist/src/bitgo/utils/tss/baseTSSUtils.js +60 -1
  27. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts +4 -4
  28. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts.map +1 -1
  29. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.js +18 -11
  30. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts +0 -17
  31. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -1
  32. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +59 -70
  33. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts +3 -1
  34. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts.map +1 -1
  35. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.js +44 -1
  36. package/dist/src/bitgo/wallet/wallet.d.ts +7 -1
  37. package/dist/src/bitgo/wallet/wallet.d.ts.map +1 -1
  38. package/dist/src/bitgo/wallet/wallet.js +67 -2
  39. package/dist/src/coins/ofc.d.ts +15 -1
  40. package/dist/src/coins/ofc.d.ts.map +1 -1
  41. package/dist/src/coins/ofc.js +8 -1
  42. package/dist/src/coins/ofcToken.d.ts +14 -4
  43. package/dist/src/coins/ofcToken.d.ts.map +1 -1
  44. package/dist/src/coins/ofcToken.js +17 -4
  45. package/dist/test/unit/bitgo/trading/tradingAccount.js +29 -20
  46. package/dist/test/unit/bitgo/utils/tss/addressVerification.js +119 -1
  47. package/dist/test/unit/bitgo/utils/tss/baseTSSUtils.d.ts +2 -0
  48. package/dist/test/unit/bitgo/utils/tss/baseTSSUtils.d.ts.map +1 -0
  49. package/dist/test/unit/bitgo/utils/tss/baseTSSUtils.js +305 -0
  50. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +354 -1
  51. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.js +204 -1
  52. package/dist/test/unit/bitgo/wallet/ofcWalletSignTransaction.js +160 -37
  53. package/dist/test/unit/bitgo/wallet/resourceManagement.js +116 -1
  54. package/dist/test/unit/bitgo/wallet/walletTssAddressVerification.js +45 -1
  55. package/dist/test/unit/coins/ofc.d.ts +2 -0
  56. package/dist/test/unit/coins/ofc.d.ts.map +1 -0
  57. package/dist/test/unit/coins/ofc.js +124 -0
  58. package/dist/tsconfig.tsbuildinfo +1 -1
  59. package/package.json +4 -4
@@ -0,0 +1,124 @@
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 coins_1 = require("../../../src/coins");
12
+ const src_1 = require("../../../src");
13
+ const TEST_TOKEN_CONFIG = {
14
+ coin: 'ofcusdt',
15
+ decimalPlaces: 6,
16
+ name: 'OFCUSDT',
17
+ type: 'ofcusdt',
18
+ backingCoin: 'usdt',
19
+ isFiat: false,
20
+ };
21
+ describe('Ofc / OfcToken', function () {
22
+ let mockBitGo;
23
+ let signMessageStub;
24
+ const hexSignature = 'deadbeef';
25
+ const signatureBytes = Buffer.from('aabbccdd', 'hex');
26
+ const walletData = {
27
+ id: 'wallet-id',
28
+ keys: ['userKey', 'bitgoKey'],
29
+ type: 'trading',
30
+ multisigType: 'onchain',
31
+ enterprise: 'ent-id',
32
+ userKeySigningRequired: false,
33
+ };
34
+ beforeEach(function () {
35
+ signMessageStub = sinon_1.default.stub(src_1.BaseCoin.prototype, 'signMessage').resolves(signatureBytes);
36
+ mockBitGo = {
37
+ url: sinon_1.default.stub().returns('https://test.bitgo.com/'),
38
+ post: sinon_1.default.stub(),
39
+ };
40
+ });
41
+ afterEach(function () {
42
+ sinon_1.default.restore();
43
+ });
44
+ describe('signMessage', function () {
45
+ let ofc;
46
+ beforeEach(function () {
47
+ mockBitGo.post.returnsThis();
48
+ mockBitGo.send = sinon_1.default.stub().returnsThis();
49
+ mockBitGo.result = sinon_1.default.stub().resolves({ signature: hexSignature });
50
+ ofc = new coins_1.Ofc(mockBitGo);
51
+ mockBitGo.coin = sinon_1.default.stub().returns(ofc);
52
+ });
53
+ describe('with a Wallet instance', function () {
54
+ it('should delegate to wallet.toTradingAccount().signPayload() and return a Buffer', async function () {
55
+ const wallet = new src_1.Wallet(mockBitGo, ofc, walletData);
56
+ const message = 'test message';
57
+ const result = await ofc.signMessage(wallet, message);
58
+ mockBitGo.send.calledOnceWith({ payload: message }).should.be.true();
59
+ mockBitGo.result.calledOnce.should.be.true();
60
+ result.should.deepEqual(Buffer.from(hexSignature, 'hex'));
61
+ });
62
+ });
63
+ describe('with a prv key', function () {
64
+ it('should delegate to the base class signMessage with the exact key and message', async function () {
65
+ const key = {
66
+ prv: 'xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqhuCo36EkzGH6qiT9mJHBvuPKtLRYD4NxFb5hgXMQBB2LLT6mxLDHHo',
67
+ };
68
+ const message = 'test message';
69
+ const result = await ofc.signMessage(key, message);
70
+ signMessageStub.calledOnceWith(key, message).should.be.true();
71
+ result.should.equal(signatureBytes);
72
+ });
73
+ });
74
+ });
75
+ describe('signTransaction (OfcToken)', function () {
76
+ let ofcToken;
77
+ const payload = '{"amount":"100","from":"alice","to":"bob"}';
78
+ beforeEach(function () {
79
+ ofcToken = new coins_1.OfcToken(mockBitGo, TEST_TOKEN_CONFIG);
80
+ mockBitGo.coin = sinon_1.default.stub().returns(ofcToken);
81
+ });
82
+ describe('with wallet and no prv (BitGo remote signing)', function () {
83
+ it('should POST to the wallet sign endpoint with the payload and return the halfSigned result', async function () {
84
+ const sendStub = sinon_1.default.stub();
85
+ const resultStub = sinon_1.default.stub().resolves({ signature: hexSignature });
86
+ sendStub.returns({ result: resultStub });
87
+ mockBitGo.post.returns({ send: sendStub });
88
+ const wallet = new src_1.Wallet(mockBitGo, ofcToken, walletData);
89
+ const expectedUrl = ofcToken.url('/wallet/' + walletData.id + '/tx/sign');
90
+ const result = await ofcToken.signTransaction({ txPrebuild: { payload }, wallet });
91
+ mockBitGo.post.calledOnceWith(expectedUrl).should.be.true();
92
+ sendStub.calledOnceWith({ payload }).should.be.true();
93
+ result.should.deepEqual({ halfSigned: { payload, signature: hexSignature } });
94
+ });
95
+ });
96
+ describe('with wallet and prv (local signing routed through wallet)', function () {
97
+ it('should pass prv directly to signPayload and sign via baseCoin.signMessage', async function () {
98
+ const prv = 'test-prv';
99
+ const wallet = new src_1.Wallet(mockBitGo, ofcToken, walletData);
100
+ const result = await ofcToken.signTransaction({ txPrebuild: { payload }, wallet, prv });
101
+ signMessageStub.calledOnceWith({ prv }, payload).should.be.true();
102
+ mockBitGo.post.called.should.be.false();
103
+ result.should.deepEqual({ halfSigned: { payload, signature: signatureBytes.toString('hex') } });
104
+ });
105
+ });
106
+ describe('with prv only (local signing without wallet)', function () {
107
+ it('should pass the prv to baseCoin.signMessage and return the correct halfSigned result', async function () {
108
+ const prv = 'test-prv';
109
+ const result = await ofcToken.signTransaction({ txPrebuild: { payload }, prv });
110
+ signMessageStub.calledOnceWith({ prv }, payload).should.be.true();
111
+ mockBitGo.post.called.should.be.false();
112
+ result.should.deepEqual({ halfSigned: { payload, signature: signatureBytes.toString('hex') } });
113
+ });
114
+ });
115
+ describe('with neither wallet nor prv', function () {
116
+ it('should throw an error', async function () {
117
+ await ofcToken
118
+ .signTransaction({ txPrebuild: { payload } })
119
+ .should.be.rejectedWith('You must pass in either one of wallet or prv');
120
+ });
121
+ });
122
+ });
123
+ });
124
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2ZjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L2NvaW5zL29mYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBOztHQUVHO0FBQ0gsa0RBQTBCO0FBQzFCLGtCQUFnQjtBQUNoQiw4Q0FBMkU7QUFDM0Usc0NBQWdEO0FBRWhELE1BQU0saUJBQWlCLEdBQUc7SUFDeEIsSUFBSSxFQUFFLFNBQVM7SUFDZixhQUFhLEVBQUUsQ0FBQztJQUNoQixJQUFJLEVBQUUsU0FBUztJQUNmLElBQUksRUFBRSxTQUFTO0lBQ2YsV0FBVyxFQUFFLE1BQU07SUFDbkIsTUFBTSxFQUFFLEtBQUs7Q0FDZCxDQUFDO0FBRUYsUUFBUSxDQUFDLGdCQUFnQixFQUFFO0lBQ3pCLElBQUksU0FBYyxDQUFDO0lBQ25CLElBQUksZUFBZ0MsQ0FBQztJQUNyQyxNQUFNLFlBQVksR0FBRyxVQUFVLENBQUM7SUFDaEMsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDdEQsTUFBTSxVQUFVLEdBQUc7UUFDakIsRUFBRSxFQUFFLFdBQVc7UUFDZixJQUFJLEVBQUUsQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDO1FBQzdCLElBQUksRUFBRSxTQUFTO1FBQ2YsWUFBWSxFQUFFLFNBQVM7UUFDdkIsVUFBVSxFQUFFLFFBQVE7UUFDcEIsc0JBQXNCLEVBQUUsS0FBSztLQUM5QixDQUFDO0lBRUYsVUFBVSxDQUFDO1FBQ1QsZUFBZSxHQUFHLGVBQUssQ0FBQyxJQUFJLENBQUMsY0FBUSxDQUFDLFNBQVMsRUFBRSxhQUFhLENBQUMsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDekYsU0FBUyxHQUFHO1lBQ1YsR0FBRyxFQUFFLGVBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUMseUJBQXlCLENBQUM7WUFDcEQsSUFBSSxFQUFFLGVBQUssQ0FBQyxJ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S0FBSyxFQUFFLENBQUM7Z0JBQ3hDLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsVUFBVSxFQUFFLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxjQUFjLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ2xHLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxRQUFRLENBQUMsNkJBQTZCLEVBQUU7WUFDdEMsRUFBRSxDQUFDLHVCQUF1QixFQUFFLEtBQUs7Z0JBQy9CLE1BQU0sUUFBUTtxQkFDWCxlQUFlLENBQUMsRUFBRSxVQUFVLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBNEIsQ0FBQztxQkFDdEUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsOENBQThDLENBQUMsQ0FBQztZQUM1RSxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQHByZXR0aWVyXG4gKi9cbmltcG9ydCBzaW5vbiBmcm9tICdzaW5vbic7XG5pbXBvcnQgJ3Nob3VsZCc7XG5pbXBvcnQgeyBPZmMsIE9mY1Rva2VuLCBTaWduVHJhbnNhY3Rpb25PcHRpb25zIH0gZnJvbSAnLi4vLi4vLi4vc3JjL2NvaW5zJztcbmltcG9ydCB7IEJhc2VDb2luLCBXYWxsZXQgfSBmcm9tICcuLi8uLi8uLi9zcmMnO1xuXG5jb25zdCBURVNUX1RPS0VOX0NPTkZJRyA9IHtcbiAgY29pbjogJ29mY3VzZHQnLFxuICBkZWNpbWFsUGxhY2VzOiA2LFxuICBuYW1lOiAnT0ZDVVNEVCcsXG4gIHR5cGU6ICdvZmN1c2R0JyxcbiAgYmFja2luZ0NvaW46ICd1c2R0JyxcbiAgaXNGaWF0OiBmYWxzZSxcbn07XG5cbmRlc2NyaWJlKCdPZmMgLyBPZmNUb2tlbicsIGZ1bmN0aW9uICgpIHtcbiAgbGV0IG1vY2tCaXRHbzogYW55O1xuICBsZXQgc2lnbk1lc3NhZ2VTdHViOiBzaW5vbi5TaW5vblN0dWI7XG4gIGNvbnN0IGhleFNpZ25hdHVyZSA9ICdkZWFkYmVlZic7XG4gIGNvbnN0IHNpZ25hdHVyZUJ5dGVzID0gQnVmZmVyLmZyb20oJ2FhYmJjY2RkJywgJ2hleCcpO1xuICBjb25zdCB3YWxsZXREYXRhID0ge1xuICAgIGlkOiAnd2FsbGV0LWlkJyxcbiAgICBrZXlzOiBbJ3VzZXJLZXknLCAnYml0Z29LZXknXSxcbiAgICB0eXBlOiAndHJhZGluZycsXG4gICAgbXVsdGlzaWdUeXBlOiAnb25jaGFpbicsXG4gICAgZW50ZXJwcmlzZTogJ2VudC1pZCcsXG4gICAgdXNlcktleVNpZ25pbmdSZXF1aXJlZDogZmFsc2UsXG4gIH07XG5cbiAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgc2lnbk1lc3NhZ2VTdHViID0gc2lub24uc3R1YihCYXNlQ29pbi5wcm90b3R5cGUsICdzaWduTWVzc2FnZScpLnJlc29sdmVzKHNpZ25hdHVyZUJ5dGVzKTtcbiAgICBtb2NrQml0R28gPSB7XG4gICAgICB1cmw6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKCdodHRwczovL3Rlc3QuYml0Z28uY29tLycpLFxuICAgICAgcG9zdDogc2lub24uc3R1YigpLFxuICAgIH07XG4gIH0pO1xuXG4gIGFmdGVyRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgc2lub24ucmVzdG9yZSgpO1xuICB9KTtcblxuICBkZXNjcmliZSgnc2lnbk1lc3NhZ2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IG9mYzogT2ZjO1xuXG4gICAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBtb2NrQml0R28ucG9zdC5yZXR1cm5zVGhpcygpO1xuICAgICAgbW9ja0JpdEdvLnNlbmQgPSBzaW5vbi5zdHViKCkucmV0dXJuc1RoaXMoKTtcbiAgICAgIG1vY2tCaXRHby5yZXN1bHQgPSBzaW5vbi5zdHViKCkucmVzb2x2ZXMoeyBzaWduYXR1cmU6IGhleFNpZ25hdHVyZSB9KTtcbiAgICAgIG9mYyA9IG5ldyBPZmMobW9ja0JpdEdvKTtcbiAgICAgIG1vY2tCaXRHby5jb2luID0gc2lub24uc3R1YigpLnJldHVybnMob2ZjKTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCd3aXRoIGEgV2FsbGV0IGluc3RhbmNlJywgZnVuY3Rpb24gKCkge1xuICAgICAgaXQoJ3Nob3VsZCBkZWxlZ2F0ZSB0byB3YWxsZXQudG9UcmFkaW5nQWNjb3VudCgpLnNpZ25QYXlsb2FkKCkgYW5kIHJldHVybiBhIEJ1ZmZlcicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3Qgd2FsbGV0ID0gbmV3IFdhbGxldChtb2NrQml0R28sIG9mYywgd2FsbGV0RGF0YSk7XG5cbiAgICAgICAgY29uc3QgbWVzc2FnZSA9ICd0ZXN0IG1lc3NhZ2UnO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBvZmMuc2lnbk1lc3NhZ2Uod2FsbGV0LCBtZXNzYWdlKTtcblxuICAgICAgICBtb2NrQml0R28uc2VuZC5jYWxsZWRPbmNlV2l0aCh7IHBheWxvYWQ6IG1lc3NhZ2UgfSkuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgICAgbW9ja0JpdEdvLnJlc3VsdC5jYWxsZWRPbmNlLnNob3VsZC5iZS50cnVlKCk7XG4gICAgICAgIHJlc3VsdC5zaG91bGQuZGVlcEVxdWFsKEJ1ZmZlci5mcm9tKGhleFNpZ25hdHVyZSwgJ2hleCcpKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3dpdGggYSBwcnYga2V5JywgZnVuY3Rpb24gKCkge1xuICAgICAgaXQoJ3Nob3VsZCBkZWxlZ2F0ZSB0byB0aGUgYmFzZSBjbGFzcyBzaWduTWVzc2FnZSB3aXRoIHRoZSBleGFjdCBrZXkgYW5kIG1lc3NhZ2UnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IHtcbiAgICAgICAgICBwcnY6ICd4cHJ2OXMyMVpyUUgxNDNLM1FUREw0TFh3MkY3SEVLM3dKVUQyblcyblJrNHN0YlB5NmNxM2pQUHFodUNvMzZFa3pHSDZxaVQ5bUpIQnZ1UEt0TFJZRDROeEZiNWhnWE1RQkIyTExUNm14TERISG8nLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gJ3Rlc3QgbWVzc2FnZSc7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG9mYy5zaWduTWVzc2FnZShrZXksIG1lc3NhZ2UpO1xuXG4gICAgICAgIHNpZ25NZXNzYWdlU3R1Yi5jYWxsZWRPbmNlV2l0aChrZXksIG1lc3NhZ2UpLnNob3VsZC5iZS50cnVlKCk7XG4gICAgICAgIHJlc3VsdC5zaG91bGQuZXF1YWwoc2lnbmF0dXJlQnl0ZXMpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzaWduVHJhbnNhY3Rpb24gKE9mY1Rva2VuKScsIGZ1bmN0aW9uICgpIHtcbiAgICBsZXQgb2ZjVG9rZW46IE9mY1Rva2VuO1xuICAgIGNvbnN0IHBheWxvYWQgPSAne1wiYW1vdW50XCI6XCIxMDBcIixcImZyb21cIjpcImFsaWNlXCIsXCJ0b1wiOlwiYm9iXCJ9JztcblxuICAgIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgb2ZjVG9rZW4gPSBuZXcgT2ZjVG9rZW4obW9ja0JpdEdvLCBURVNUX1RPS0VOX0NPTkZJRyk7XG4gICAgICBtb2NrQml0R28uY29pbiA9IHNpbm9uLnN0dWIoKS5yZXR1cm5zKG9mY1Rva2VuKTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCd3aXRoIHdhbGxldCBhbmQgbm8gcHJ2IChCaXRHbyByZW1vdGUgc2lnbmluZyknLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpdCgnc2hvdWxkIFBPU1QgdG8gdGhlIHdhbGxldCBzaWduIGVuZHBvaW50IHdpdGggdGhlIHBheWxvYWQgYW5kIHJldHVybiB0aGUgaGFsZlNpZ25lZCByZXN1bHQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHNlbmRTdHViID0gc2lub24uc3R1YigpO1xuICAgICAgICBjb25zdCByZXN1bHRTdHViID0gc2lub24uc3R1YigpLnJlc29sdmVzKHsgc2lnbmF0dXJlOiBoZXhTaWduYXR1cmUgfSk7XG4gICAgICAgIHNlbmRTdHViLnJldHVybnMoeyByZXN1bHQ6IHJlc3VsdFN0dWIgfSk7XG4gICAgICAgIG1vY2tCaXRHby5wb3N0LnJldHVybnMoeyBzZW5kOiBzZW5kU3R1YiB9KTtcblxuICAgICAgICBjb25zdCB3YWxsZXQgPSBuZXcgV2FsbGV0KG1vY2tCaXRHbywgb2ZjVG9rZW4sIHdhbGxldERhdGEpO1xuICAgICAgICBjb25zdCBleHBlY3RlZFVybCA9IG9mY1Rva2VuLnVybCgnL3dhbGxldC8nICsgd2FsbGV0RGF0YS5pZCArICcvdHgvc2lnbicpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBvZmNUb2tlbi5zaWduVHJhbnNhY3Rpb24oeyB0eFByZWJ1aWxkOiB7IHBheWxvYWQgfSwgd2FsbGV0IH0pO1xuXG4gICAgICAgIG1vY2tCaXRHby5wb3N0LmNhbGxlZE9uY2VXaXRoKGV4cGVjdGVkVXJsKS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgICAgICBzZW5kU3R1Yi5jYWxsZWRPbmNlV2l0aCh7IHBheWxvYWQgfSkuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgICAgcmVzdWx0LnNob3VsZC5kZWVwRXF1YWwoeyBoYWxmU2lnbmVkOiB7IHBheWxvYWQsIHNpZ25hdHVyZTogaGV4U2lnbmF0dXJlIH0gfSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCd3aXRoIHdhbGxldCBhbmQgcHJ2IChsb2NhbCBzaWduaW5nIHJvdXRlZCB0aHJvdWdoIHdhbGxldCknLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpdCgnc2hvdWxkIHBhc3MgcHJ2IGRpcmVjdGx5IHRvIHNpZ25QYXlsb2FkIGFuZCBzaWduIHZpYSBiYXNlQ29pbi5zaWduTWVzc2FnZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgcHJ2ID0gJ3Rlc3QtcHJ2JztcbiAgICAgICAgY29uc3Qgd2FsbGV0ID0gbmV3IFdhbGxldChtb2NrQml0R28sIG9mY1Rva2VuLCB3YWxsZXREYXRhKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgb2ZjVG9rZW4uc2lnblRyYW5zYWN0aW9uKHsgdHhQcmVidWlsZDogeyBwYXlsb2FkIH0sIHdhbGxldCwgcHJ2IH0pO1xuXG4gICAgICAgIHNpZ25NZXNzYWdlU3R1Yi5jYWxsZWRPbmNlV2l0aCh7IHBydiB9LCBwYXlsb2FkKS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgICAgICBtb2NrQml0R28ucG9zdC5jYWxsZWQuc2hvdWxkLmJlLmZhbHNlKCk7XG4gICAgICAgIHJlc3VsdC5zaG91bGQuZGVlcEVxdWFsKHsgaGFsZlNpZ25lZDogeyBwYXlsb2FkLCBzaWduYXR1cmU6IHNpZ25hdHVyZUJ5dGVzLnRvU3RyaW5nKCdoZXgnKSB9IH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnd2l0aCBwcnYgb25seSAobG9jYWwgc2lnbmluZyB3aXRob3V0IHdhbGxldCknLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpdCgnc2hvdWxkIHBhc3MgdGhlIHBydiB0byBiYXNlQ29pbi5zaWduTWVzc2FnZSBhbmQgcmV0dXJuIHRoZSBjb3JyZWN0IGhhbGZTaWduZWQgcmVzdWx0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBwcnYgPSAndGVzdC1wcnYnO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG9mY1Rva2VuLnNpZ25UcmFuc2FjdGlvbih7IHR4UHJlYnVpbGQ6IHsgcGF5bG9hZCB9LCBwcnYgfSk7XG5cbiAgICAgICAgc2lnbk1lc3NhZ2VTdHViLmNhbGxlZE9uY2VXaXRoKHsgcHJ2IH0sIHBheWxvYWQpLnNob3VsZC5iZS50cnVlKCk7XG4gICAgICAgIG1vY2tCaXRHby5wb3N0LmNhbGxlZC5zaG91bGQuYmUuZmFsc2UoKTtcbiAgICAgICAgcmVzdWx0LnNob3VsZC5kZWVwRXF1YWwoeyBoYWxmU2lnbmVkOiB7IHBheWxvYWQsIHNpZ25hdHVyZTogc2lnbmF0dXJlQnl0ZXMudG9TdHJpbmcoJ2hleCcpIH0gfSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCd3aXRoIG5laXRoZXIgd2FsbGV0IG5vciBwcnYnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpdCgnc2hvdWxkIHRocm93IGFuIGVycm9yJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBhd2FpdCBvZmNUb2tlblxuICAgICAgICAgIC5zaWduVHJhbnNhY3Rpb24oeyB0eFByZWJ1aWxkOiB7IHBheWxvYWQgfSB9IGFzIFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMpXG4gICAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ1lvdSBtdXN0IHBhc3MgaW4gZWl0aGVyIG9uZSBvZiB3YWxsZXQgb3IgcHJ2Jyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==