@bitgo-beta/sdk-coin-avaxc 2.2.3-alpha.44 → 2.2.3-alpha.441

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 (51) hide show
  1. package/dist/src/avaxc.d.ts +46 -17
  2. package/dist/src/avaxc.d.ts.map +1 -1
  3. package/dist/src/avaxc.js +221 -86
  4. package/dist/src/avaxcToken.d.ts +1 -1
  5. package/dist/src/avaxcToken.d.ts.map +1 -1
  6. package/dist/src/avaxcToken.js +3 -3
  7. package/dist/src/iface.d.ts +6 -3
  8. package/dist/src/iface.d.ts.map +1 -1
  9. package/dist/src/iface.js +1 -1
  10. package/dist/src/index.js +6 -2
  11. package/dist/src/lib/index.js +23 -9
  12. package/dist/src/lib/keyPair.js +10 -11
  13. package/dist/src/lib/transactionBuilder.js +2 -2
  14. package/dist/src/lib/utils.d.ts +2 -1
  15. package/dist/src/lib/utils.d.ts.map +1 -1
  16. package/dist/src/lib/utils.js +31 -10
  17. package/dist/test/resources/avaxc.d.ts +122 -0
  18. package/dist/test/resources/avaxc.d.ts.map +1 -0
  19. package/dist/test/resources/avaxc.js +137 -0
  20. package/dist/test/unit/avaxc.d.ts +2 -0
  21. package/dist/test/unit/avaxc.d.ts.map +1 -0
  22. package/dist/test/unit/avaxc.js +1104 -0
  23. package/dist/test/unit/avaxcToken.d.ts +2 -0
  24. package/dist/test/unit/avaxcToken.d.ts.map +1 -0
  25. package/dist/test/unit/avaxcToken.js +68 -0
  26. package/dist/test/unit/getBuilder.d.ts +3 -0
  27. package/dist/test/unit/getBuilder.d.ts.map +1 -0
  28. package/dist/test/unit/getBuilder.js +10 -0
  29. package/dist/test/unit/helpers.d.ts +15 -0
  30. package/dist/test/unit/helpers.d.ts.map +1 -0
  31. package/dist/test/unit/helpers.js +54 -0
  32. package/dist/test/unit/keyPair.d.ts +2 -0
  33. package/dist/test/unit/keyPair.d.ts.map +1 -0
  34. package/dist/test/unit/keyPair.js +135 -0
  35. package/dist/test/unit/transactionBuilder/transfer.d.ts +2 -0
  36. package/dist/test/unit/transactionBuilder/transfer.d.ts.map +1 -0
  37. package/dist/test/unit/transactionBuilder/transfer.js +223 -0
  38. package/dist/test/unit/transactionBuilder/walletInitializationBuilder.d.ts +2 -0
  39. package/dist/test/unit/transactionBuilder/walletInitializationBuilder.d.ts.map +1 -0
  40. package/dist/test/unit/transactionBuilder/walletInitializationBuilder.js +174 -0
  41. package/dist/test/unit/transferBuilder.d.ts +2 -0
  42. package/dist/test/unit/transferBuilder.d.ts.map +1 -0
  43. package/dist/test/unit/transferBuilder.js +119 -0
  44. package/dist/test/unit/util.d.ts +2 -0
  45. package/dist/test/unit/util.d.ts.map +1 -0
  46. package/dist/test/unit/util.js +235 -0
  47. package/dist/tsconfig.tsbuildinfo +1 -0
  48. package/package.json +22 -16
  49. package/.eslintignore +0 -5
  50. package/.mocharc.yml +0 -8
  51. package/CHANGELOG.md +0 -135
@@ -0,0 +1,235 @@
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
+ const assert_1 = __importDefault(require("assert"));
7
+ const should_1 = __importDefault(require("should"));
8
+ const statics_1 = require("@bitgo-beta/statics");
9
+ const avaxc_1 = require("../resources/avaxc");
10
+ const utils_1 = require("../../src/lib/utils");
11
+ const getBuilder_1 = require("./getBuilder");
12
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
13
+ const src_1 = require("../../src");
14
+ const sdk_coin_eth_1 = require("@bitgo-beta/sdk-coin-eth");
15
+ describe('AVAX util library', () => {
16
+ describe('keys validations success cases', () => {
17
+ it('validate valid eth private key', () => {
18
+ should_1.default.equal((0, utils_1.isValidEthPrivateKey)(avaxc_1.TEST_ACCOUNT.ethPrivateKey), true);
19
+ });
20
+ it('validate valid eth public key', () => {
21
+ should_1.default.equal((0, utils_1.isValidEthPublicKey)(avaxc_1.TEST_ACCOUNT.ethUncompressedPublicKey), true);
22
+ });
23
+ it('validate valid eth address', () => {
24
+ should_1.default.equal((0, utils_1.isValidEthAddress)(avaxc_1.TEST_ACCOUNT.ethAddress), true);
25
+ });
26
+ });
27
+ describe('keys validations failure cases', () => {
28
+ it('validate empty eth private key', () => {
29
+ should_1.default.equal((0, utils_1.isValidEthPrivateKey)(''), false);
30
+ });
31
+ it('validate empty eth public key', () => {
32
+ should_1.default.equal((0, utils_1.isValidEthPublicKey)(''), false);
33
+ });
34
+ it('validate empty eth address', () => {
35
+ should_1.default.equal((0, utils_1.isValidEthAddress)(''), false);
36
+ });
37
+ it('validate eth private key too short', () => {
38
+ should_1.default.equal((0, utils_1.isValidEthPrivateKey)(avaxc_1.TEST_ACCOUNT.ethPrivateKey.slice(1)), false);
39
+ });
40
+ it('validate eth public key too short', () => {
41
+ should_1.default.equal((0, utils_1.isValidEthPublicKey)(avaxc_1.TEST_ACCOUNT.ethUncompressedPublicKey.slice(1)), false);
42
+ });
43
+ it('validate eth address too short', () => {
44
+ should_1.default.equal((0, utils_1.isValidEthAddress)(avaxc_1.TEST_ACCOUNT.ethAddress.slice(1)), false);
45
+ });
46
+ it('validate eth private key too long', () => {
47
+ should_1.default.equal((0, utils_1.isValidEthPrivateKey)(avaxc_1.TEST_ACCOUNT.ethPrivateKey + '00'), false);
48
+ });
49
+ it('validate eth public key too long', () => {
50
+ should_1.default.equal((0, utils_1.isValidEthPublicKey)(avaxc_1.TEST_ACCOUNT.ethUncompressedPublicKey + '00'), false);
51
+ });
52
+ it('validate eth address too long', () => {
53
+ should_1.default.equal((0, utils_1.isValidEthAddress)(avaxc_1.TEST_ACCOUNT.ethAddress + '00'), false);
54
+ });
55
+ });
56
+ describe('sign success cases', () => {
57
+ let txBuilder;
58
+ const contractAddress = avaxc_1.TEST_ACCOUNT.ethAddress;
59
+ const initTxBuilder = () => {
60
+ txBuilder = (0, getBuilder_1.getBuilder)('tavaxc');
61
+ txBuilder.fee({
62
+ fee: '280000000000',
63
+ gasLimit: '7000000',
64
+ });
65
+ txBuilder.counter(1);
66
+ txBuilder.type(sdk_core_1.TransactionType.Send);
67
+ txBuilder.contract(contractAddress);
68
+ txBuilder.transfer().amount('10000').to(avaxc_1.TEST_ACCOUNT_2.ethAddress).contractSequenceId(1);
69
+ };
70
+ beforeEach(() => {
71
+ initTxBuilder();
72
+ });
73
+ it('sign a valid txData with valid KeyPair', async () => {
74
+ const tx = await txBuilder.build();
75
+ const txData = tx.toJson();
76
+ should_1.default.not.exists(txData.r);
77
+ should_1.default.not.exists(txData.s);
78
+ should_1.default.equal(txData.v, '0x0150f5');
79
+ const keyPair = new src_1.KeyPair({ prv: avaxc_1.TEST_ACCOUNT_2.ethPrivateKey });
80
+ const signedTx = await (0, utils_1.sign)(txData, keyPair);
81
+ const txBuilder2 = (0, getBuilder_1.getBuilder)('tavaxc');
82
+ txBuilder2.from(signedTx);
83
+ const tx2 = await txBuilder2.build();
84
+ const tx2Data = tx2.toJson();
85
+ should_1.default.exists(tx2Data.r);
86
+ should_1.default.exists(tx2Data.s);
87
+ should_1.default.exists(tx2Data.v);
88
+ tx2Data.r.length.should.be.above(0);
89
+ tx2Data.s.length.should.be.above(0);
90
+ tx2Data.v.length.should.be.above(0);
91
+ });
92
+ it('sign txData with gasLimit set as number', async () => {
93
+ const txData = {
94
+ _type: sdk_coin_eth_1.ETHTransactionType.LEGACY,
95
+ data: '',
96
+ gasLimit: '1',
97
+ gasPrice: '0x0',
98
+ nonce: 1,
99
+ value: '0',
100
+ };
101
+ const keyPair = new src_1.KeyPair({ prv: avaxc_1.TEST_ACCOUNT_2.ethPrivateKey });
102
+ (0, utils_1.sign)(txData, keyPair).should.be.fulfilled();
103
+ });
104
+ it('sign txData with gasPrice set as number', async () => {
105
+ const txData = {
106
+ _type: sdk_coin_eth_1.ETHTransactionType.LEGACY,
107
+ data: '',
108
+ gasLimit: '0x1',
109
+ gasPrice: '1',
110
+ nonce: 1,
111
+ value: '0',
112
+ };
113
+ const keyPair = new src_1.KeyPair({ prv: avaxc_1.TEST_ACCOUNT_2.ethPrivateKey });
114
+ (0, utils_1.sign)(txData, keyPair).should.be.fulfilled();
115
+ });
116
+ it('sign txData with hex gasLimit and gasPrice values', async () => {
117
+ const txData = {
118
+ _type: sdk_coin_eth_1.ETHTransactionType.LEGACY,
119
+ data: '',
120
+ gasLimit: '0x1',
121
+ gasPrice: '0x1',
122
+ nonce: 1,
123
+ value: '0',
124
+ };
125
+ const keyPair = new src_1.KeyPair({ prv: avaxc_1.TEST_ACCOUNT_2.ethPrivateKey });
126
+ (0, utils_1.sign)(txData, keyPair).should.be.fulfilled();
127
+ });
128
+ it('sign txData with nonce zero', async () => {
129
+ const txData = {
130
+ _type: sdk_coin_eth_1.ETHTransactionType.LEGACY,
131
+ data: '',
132
+ gasLimit: '0x1',
133
+ gasPrice: '0x1',
134
+ nonce: 0,
135
+ value: '0',
136
+ };
137
+ const keyPair = new src_1.KeyPair({ prv: avaxc_1.TEST_ACCOUNT_2.ethPrivateKey });
138
+ (0, utils_1.sign)(txData, keyPair).should.be.fulfilled();
139
+ });
140
+ it('sign txData with value set as number', async () => {
141
+ const txData = {
142
+ _type: sdk_coin_eth_1.ETHTransactionType.LEGACY,
143
+ data: '',
144
+ gasLimit: '0x1',
145
+ gasPrice: '0x1',
146
+ nonce: 0,
147
+ value: '0',
148
+ };
149
+ const keyPair = new src_1.KeyPair({ prv: avaxc_1.TEST_ACCOUNT_2.ethPrivateKey });
150
+ (0, utils_1.sign)(txData, keyPair).should.be.fulfilled();
151
+ });
152
+ it('sign txData with value set as hex', async () => {
153
+ const txData = {
154
+ _type: sdk_coin_eth_1.ETHTransactionType.LEGACY,
155
+ data: '',
156
+ gasLimit: '0x1',
157
+ gasPrice: '0x1',
158
+ nonce: 0,
159
+ value: '0x0',
160
+ };
161
+ const keyPair = new src_1.KeyPair({ prv: avaxc_1.TEST_ACCOUNT_2.ethPrivateKey });
162
+ (0, utils_1.sign)(txData, keyPair).should.be.fulfilled();
163
+ });
164
+ });
165
+ describe('sign failure cases', () => {
166
+ it('sign txData with invalid gasLimit', async () => {
167
+ const txData = {
168
+ _type: sdk_coin_eth_1.ETHTransactionType.LEGACY,
169
+ data: '',
170
+ gasLimit: '',
171
+ gasPrice: '0x0',
172
+ nonce: 1,
173
+ value: '0',
174
+ };
175
+ const keyPair = new src_1.KeyPair({ prv: avaxc_1.TEST_ACCOUNT_2.ethPrivateKey });
176
+ (0, utils_1.sign)(txData, keyPair).should.be.rejectedWith(new RegExp('Cannot convert string to buffer.+'));
177
+ });
178
+ it('sign txData with invalid gasPrice', async () => {
179
+ const txData = {
180
+ _type: sdk_coin_eth_1.ETHTransactionType.LEGACY,
181
+ data: '',
182
+ gasLimit: '0x0',
183
+ gasPrice: '',
184
+ nonce: 1,
185
+ value: '0',
186
+ };
187
+ const keyPair = new src_1.KeyPair({ prv: avaxc_1.TEST_ACCOUNT_2.ethPrivateKey });
188
+ (0, utils_1.sign)(txData, keyPair).should.be.rejectedWith(new RegExp('Cannot convert string to buffer.+'));
189
+ });
190
+ it('sign txData with invalid nonce', async () => {
191
+ const txData = {
192
+ _type: sdk_coin_eth_1.ETHTransactionType.LEGACY,
193
+ data: '',
194
+ gasLimit: '0x0',
195
+ gasPrice: '0x0',
196
+ nonce: -1,
197
+ value: '0',
198
+ };
199
+ const keyPair = new src_1.KeyPair({ prv: avaxc_1.TEST_ACCOUNT_2.ethPrivateKey });
200
+ (0, utils_1.sign)(txData, keyPair).should.be.rejectedWith(new RegExp('Cannot convert string to buffer.+'));
201
+ });
202
+ it('sign txData with invalid value', async () => {
203
+ const txData = {
204
+ _type: sdk_coin_eth_1.ETHTransactionType.LEGACY,
205
+ data: '',
206
+ gasLimit: '0x0',
207
+ gasPrice: '0x0',
208
+ nonce: 1,
209
+ value: '',
210
+ };
211
+ const keyPair = new src_1.KeyPair({ prv: avaxc_1.TEST_ACCOUNT_2.ethPrivateKey });
212
+ (0, utils_1.sign)(txData, keyPair).should.be.rejectedWith(new RegExp('Cannot convert string to buffer.+'));
213
+ });
214
+ });
215
+ describe('network common configuration', () => {
216
+ it('getCommon for mainnet', () => {
217
+ const common = (0, utils_1.getCommon)(statics_1.NetworkType.MAINNET);
218
+ should_1.default.equal(common.chainName(), 'mainnet');
219
+ should_1.default.equal(common.hardfork(), 'london');
220
+ should_1.default.equal(common.chainIdBN().toString(), '43114');
221
+ should_1.default.equal(common.networkIdBN().toString(), '1');
222
+ });
223
+ it('getCommon for testnet', () => {
224
+ const common = (0, utils_1.getCommon)(statics_1.NetworkType.TESTNET);
225
+ should_1.default.equal(common.chainName(), 'fuji');
226
+ should_1.default.equal(common.hardfork(), 'london');
227
+ should_1.default.equal(common.chainIdBN().toString(), '43113');
228
+ should_1.default.equal(common.networkIdBN().toString(), '1');
229
+ });
230
+ it('getCommon for invalid network', () => {
231
+ assert_1.default.throws(() => (0, utils_1.getCommon)('invalidNetwork'), (e) => e.message === 'Missing network common configuration');
232
+ });
233
+ });
234
+ });
235
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Rlc3QvdW5pdC91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLG9EQUE0QjtBQUM1QixpREFBa0Q7QUFDbEQsOENBQWtFO0FBQ2xFLCtDQUFvSDtBQUVwSCw2Q0FBMEM7QUFDMUMsbURBQXVEO0FBQ3ZELG1DQUF3RDtBQUN4RCwyREFBc0U7QUFFdEUsUUFBUSxDQUFDLG1CQUFtQixFQUFFLEdBQUcsRUFBRTtJQUNqQyxRQUFRLENBQUMsZ0NBQWdDLEVBQUUsR0FBRyxFQUFFO1FBQzlDLEVBQUUsQ0FBQyxnQ0FBZ0MsRUFBRSxHQUFHLEVBQUU7WUFDeEMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsSUFBQSw0QkFBb0IsRUFBQyxvQkFBWSxDQUFDLGFBQWEsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3ZFLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLCtCQUErQixFQUFFLEdBQUcsRUFBRTtZQUN2QyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxJQUFBLDJCQUFtQixFQUFDLG9CQUFZLENBQUMsd0JBQXdCLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNqRixDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyw0QkFBNEIsRUFBRSxHQUFHLEVBQUU7WUFDcEMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsSUFBQSx5QkFBaUIsRUFBQyxvQkFBWSxDQUFDLFVBQVUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2pFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsZ0NBQWdDLEVBQUUsR0FBRyxFQUFFO1FBQzlDLEVBQUUsQ0FBQyxnQ0FBZ0MsRUFBRSxHQUFHLEVBQUU7WUFDeEMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsSUFBQSw0QkFBb0IsRUFBQyxFQUFFLENBQUMsRUFBRSxLQUFLLENB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RUFBQyxnQkFBK0IsQ0FBQyxFQUNoRCxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxzQ0FBc0MsQ0FDakUsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCB7IE5ldHdvcmtUeXBlIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBURVNUX0FDQ09VTlQsIFRFU1RfQUNDT1VOVF8yIH0gZnJvbSAnLi4vcmVzb3VyY2VzL2F2YXhjJztcbmltcG9ydCB7IGlzVmFsaWRFdGhBZGRyZXNzLCBpc1ZhbGlkRXRoUHJpdmF0ZUtleSwgaXNWYWxpZEV0aFB1YmxpY0tleSwgc2lnbiwgZ2V0Q29tbW9uIH0gZnJvbSAnLi4vLi4vc3JjL2xpYi91dGlscyc7XG5cbmltcG9ydCB7IGdldEJ1aWxkZXIgfSBmcm9tICcuL2dldEJ1aWxkZXInO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgS2V5UGFpciwgVHJhbnNhY3Rpb25CdWlsZGVyIH0gZnJvbSAnLi4vLi4vc3JjJztcbmltcG9ydCB7IEVUSFRyYW5zYWN0aW9uVHlwZSwgVHhEYXRhIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvaW4tZXRoJztcblxuZGVzY3JpYmUoJ0FWQVggdXRpbCBsaWJyYXJ5JywgKCkgPT4ge1xuICBkZXNjcmliZSgna2V5cyB2YWxpZGF0aW9ucyBzdWNjZXNzIGNhc2VzJywgKCkgPT4ge1xuICAgIGl0KCd2YWxpZGF0ZSB2YWxpZCBldGggcHJpdmF0ZSBrZXknLCAoKSA9PiB7XG4gICAgICBzaG91bGQuZXF1YWwoaXNWYWxpZEV0aFByaXZhdGVLZXkoVEVTVF9BQ0NPVU5ULmV0aFByaXZhdGVLZXkpLCB0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCd2YWxpZGF0ZSB2YWxpZCBldGggcHVibGljIGtleScsICgpID0+IHtcbiAgICAgIHNob3VsZC5lcXVhbChpc1ZhbGlkRXRoUHVibGljS2V5KFRFU1RfQUNDT1VOVC5ldGhVbmNvbXByZXNzZWRQdWJsaWNLZXkpLCB0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCd2YWxpZGF0ZSB2YWxpZCBldGggYWRkcmVzcycsICgpID0+IHtcbiAgICAgIHNob3VsZC5lcXVhbChpc1ZhbGlkRXRoQWRkcmVzcyhURVNUX0FDQ09VTlQuZXRoQWRkcmVzcyksIHRydWUpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgna2V5cyB2YWxpZGF0aW9ucyBmYWlsdXJlIGNhc2VzJywgKCkgPT4ge1xuICAgIGl0KCd2YWxpZGF0ZSBlbXB0eSBldGggcHJpdmF0ZSBrZXknLCAoKSA9PiB7XG4gICAgICBzaG91bGQuZXF1YWwoaXNWYWxpZEV0aFByaXZhdGVLZXkoJycpLCBmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgndmFsaWRhdGUgZW1wdHkgZXRoIHB1YmxpYyBrZXknLCAoKSA9PiB7XG4gICAgICBzaG91bGQuZXF1YWwoaXNWYWxpZEV0aFB1YmxpY0tleSgnJyksIGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCd2YWxpZGF0ZSBlbXB0eSBldGggYWRkcmVzcycsICgpID0+IHtcbiAgICAgIHNob3VsZC5lcXVhbChpc1ZhbGlkRXRoQWRkcmVzcygnJyksIGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCd2YWxpZGF0ZSBldGggcHJpdmF0ZSBrZXkgdG9vIHNob3J0JywgKCkgPT4ge1xuICAgICAgc2hvdWxkLmVxdWFsKGlzVmFsaWRFdGhQcml2YXRlS2V5KFRFU1RfQUNDT1VOVC5ldGhQcml2YXRlS2V5LnNsaWNlKDEpKSwgZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3ZhbGlkYXRlIGV0aCBwdWJsaWMga2V5IHRvbyBzaG9ydCcsICgpID0+IHtcbiAgICAgIHNob3VsZC5lcXVhbChpc1ZhbGlkRXRoUHVibGljS2V5KFRFU1RfQUNDT1VOVC5ldGhVbmNvbXByZXNzZWRQdWJsaWNLZXkuc2xpY2UoMSkpLCBmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgndmFsaWRhdGUgZXRoIGFkZHJlc3MgdG9vIHNob3J0JywgKCkgPT4ge1xuICAgICAgc2hvdWxkLmVxdWFsKGlzVmFsaWRFdGhBZGRyZXNzKFRFU1RfQUNDT1VOVC5ldGhBZGRyZXNzLnNsaWNlKDEpKSwgZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3ZhbGlkYXRlIGV0aCBwcml2YXRlIGtleSB0b28gbG9uZycsICgpID0+IHtcbiAgICAgIHNob3VsZC5lcXVhbChpc1ZhbGlkRXRoUHJpdmF0ZUtleShURVNUX0FDQ09VTlQuZXRoUHJpdmF0ZUtleSArICcwMCcpLCBmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgndmFsaWRhdGUgZXRoIHB1YmxpYyBrZXkgdG9vIGxvbmcnLCAoKSA9PiB7XG4gICAgICBzaG91bGQuZXF1YWwoaXNWYWxpZEV0aFB1YmxpY0tleShURVNUX0FDQ09VTlQuZXRoVW5jb21wcmVzc2VkUHVibGljS2V5ICsgJzAwJyksIGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCd2YWxpZGF0ZSBldGggYWRkcmVzcyB0b28gbG9uZycsICgpID0+IHtcbiAgICAgIHNob3VsZC5lcXVhbChpc1ZhbGlkRXRoQWRkcmVzcyhURVNUX0FDQ09VTlQuZXRoQWRkcmVzcyArICcwMCcpLCBmYWxzZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzaWduIHN1Y2Nlc3MgY2FzZXMnLCAoKSA9PiB7XG4gICAgbGV0IHR4QnVpbGRlcjogVHJhbnNhY3Rpb25CdWlsZGVyO1xuICAgIGNvbnN0IGNvbnRyYWN0QWRkcmVzcyA9IFRFU1RfQUNDT1VOVC5ldGhBZGRyZXNzO1xuICAgIGNvbnN0IGluaXRUeEJ1aWxkZXIgPSAoKTogdm9pZCA9PiB7XG4gICAgICB0eEJ1aWxkZXIgPSBnZXRCdWlsZGVyKCd0YXZheGMnKSBhcyBUcmFuc2FjdGlvbkJ1aWxkZXI7XG4gICAgICB0eEJ1aWxkZXIuZmVlKHtcbiAgICAgICAgZmVlOiAnMjgwMDAwMDAwMDAwJyxcbiAgICAgICAgZ2FzTGltaXQ6ICc3MDAwMDAwJyxcbiAgICAgIH0pO1xuICAgICAgdHhCdWlsZGVyLmNvdW50ZXIoMSk7XG4gICAgICB0eEJ1aWxkZXIudHlwZShUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgICB0eEJ1aWxkZXIuY29udHJhY3QoY29udHJhY3RBZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci50cmFuc2ZlcigpLmFtb3VudCgnMTAwMDAnKS50byhURVNUX0FDQ09VTlRfMi5ldGhBZGRyZXNzKS5jb250cmFjdFNlcXVlbmNlSWQoMSk7XG4gICAgfTtcblxuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgaW5pdFR4QnVpbGRlcigpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3NpZ24gYSB2YWxpZCB0eERhdGEgd2l0aCB2YWxpZCBLZXlQYWlyJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHR4RGF0YSA9IHR4LnRvSnNvbigpO1xuXG4gICAgICBzaG91bGQubm90LmV4aXN0cyh0eERhdGEucik7XG4gICAgICBzaG91bGQubm90LmV4aXN0cyh0eERhdGEucyk7XG4gICAgICBzaG91bGQuZXF1YWwodHhEYXRhLnYsICcweDAxNTBmNScpO1xuXG4gICAgICBjb25zdCBrZXlQYWlyID0gbmV3IEtleVBhaXIoeyBwcnY6IFRFU1RfQUNDT1VOVF8yLmV0aFByaXZhdGVLZXkgfSk7XG4gICAgICBjb25zdCBzaWduZWRUeCA9IGF3YWl0IHNpZ24odHhEYXRhLCBrZXlQYWlyKTtcbiAgICAgIGNvbnN0IHR4QnVpbGRlcjIgPSBnZXRCdWlsZGVyKCd0YXZheGMnKSBhcyBUcmFuc2FjdGlvbkJ1aWxkZXI7XG4gICAgICB0eEJ1aWxkZXIyLmZyb20oc2lnbmVkVHgpO1xuICAgICAgY29uc3QgdHgyID0gYXdhaXQgdHhCdWlsZGVyMi5idWlsZCgpO1xuICAgICAgY29uc3QgdHgyRGF0YSA9IHR4Mi50b0pzb24oKTtcblxuICAgICAgc2hvdWxkLmV4aXN0cyh0eDJEYXRhLnIpO1xuICAgICAgc2hvdWxkLmV4aXN0cyh0eDJEYXRhLnMpO1xuICAgICAgc2hvdWxkLmV4aXN0cyh0eDJEYXRhLnYpO1xuICAgICAgdHgyRGF0YS5yLmxlbmd0aC5zaG91bGQuYmUuYWJvdmUoMCk7XG4gICAgICB0eDJEYXRhLnMubGVuZ3RoLnNob3VsZC5iZS5hYm92ZSgwKTtcbiAgICAgIHR4MkRhdGEudi5sZW5ndGguc2hvdWxkLmJlLmFib3ZlKDApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3NpZ24gdHhEYXRhIHdpdGggZ2FzTGltaXQgc2V0IGFzIG51bWJlcicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4RGF0YTogVHhEYXRhID0ge1xuICAgICAgICBfdHlwZTogRVRIVHJhbnNhY3Rpb25UeXBlLkxFR0FDWSxcbiAgICAgICAgZGF0YTogJycsXG4gICAgICAgIGdhc0xpbWl0OiAnMScsXG4gICAgICAgIGdhc1ByaWNlOiAnMHgwJyxcbiAgICAgICAgbm9uY2U6IDEsXG4gICAgICAgIHZhbHVlOiAnMCcsXG4gICAgICB9O1xuICAgICAgY29uc3Qga2V5UGFpciA9IG5ldyBLZXlQYWlyKHsgcHJ2OiBURVNUX0FDQ09VTlRfMi5ldGhQcml2YXRlS2V5IH0pO1xuICAgICAgc2lnbih0eERhdGEsIGtleVBhaXIpLnNob3VsZC5iZS5mdWxmaWxsZWQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaWduIHR4RGF0YSB3aXRoIGdhc1ByaWNlIHNldCBhcyBudW1iZXInLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eERhdGE6IFR4RGF0YSA9IHtcbiAgICAgICAgX3R5cGU6IEVUSFRyYW5zYWN0aW9uVHlwZS5MRUdBQ1ksXG4gICAgICAgIGRhdGE6ICcnLFxuICAgICAgICBnYXNMaW1pdDogJzB4MScsXG4gICAgICAgIGdhc1ByaWNlOiAnMScsXG4gICAgICAgIG5vbmNlOiAxLFxuICAgICAgICB2YWx1ZTogJzAnLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IGtleVBhaXIgPSBuZXcgS2V5UGFpcih7IHBydjogVEVTVF9BQ0NPVU5UXzIuZXRoUHJpdmF0ZUtleSB9KTtcbiAgICAgIHNpZ24odHhEYXRhLCBrZXlQYWlyKS5zaG91bGQuYmUuZnVsZmlsbGVkKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2lnbiB0eERhdGEgd2l0aCBoZXggZ2FzTGltaXQgYW5kIGdhc1ByaWNlIHZhbHVlcycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4RGF0YTogVHhEYXRhID0ge1xuICAgICAgICBfdHlwZTogRVRIVHJhbnNhY3Rpb25UeXBlLkxFR0FDWSxcbiAgICAgICAgZGF0YTogJycsXG4gICAgICAgIGdhc0xpbWl0OiAnMHgxJyxcbiAgICAgICAgZ2FzUHJpY2U6ICcweDEnLFxuICAgICAgICBub25jZTogMSxcbiAgICAgICAgdmFsdWU6ICcwJyxcbiAgICAgIH07XG4gICAgICBjb25zdCBrZXlQYWlyID0gbmV3IEtleVBhaXIoeyBwcnY6IFRFU1RfQUNDT1VOVF8yLmV0aFByaXZhdGVLZXkgfSk7XG4gICAgICBzaWduKHR4RGF0YSwga2V5UGFpcikuc2hvdWxkLmJlLmZ1bGZpbGxlZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3NpZ24gdHhEYXRhIHdpdGggbm9uY2UgemVybycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4RGF0YTogVHhEYXRhID0ge1xuICAgICAgICBfdHlwZTogRVRIVHJhbnNhY3Rpb25UeXBlLkxFR0FDWSxcbiAgICAgICAgZGF0YTogJycsXG4gICAgICAgIGdhc0xpbWl0OiAnMHgxJyxcbiAgICAgICAgZ2FzUHJpY2U6ICcweDEnLFxuICAgICAgICBub25jZTogMCxcbiAgICAgICAgdmFsdWU6ICcwJyxcbiAgICAgIH07XG4gICAgICBjb25zdCBrZXlQYWlyID0gbmV3IEtleVBhaXIoeyBwcnY6IFRFU1RfQUNDT1VOVF8yLmV0aFByaXZhdGVLZXkgfSk7XG4gICAgICBzaWduKHR4RGF0YSwga2V5UGFpcikuc2hvdWxkLmJlLmZ1bGZpbGxlZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3NpZ24gdHhEYXRhIHdpdGggdmFsdWUgc2V0IGFzIG51bWJlcicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4RGF0YTogVHhEYXRhID0ge1xuICAgICAgICBfdHlwZTogRVRIVHJhbnNhY3Rpb25UeXBlLkxFR0FDWSxcbiAgICAgICAgZGF0YTogJycsXG4gICAgICAgIGdhc0xpbWl0OiAnMHgxJyxcbiAgICAgICAgZ2FzUHJpY2U6ICcweDEnLFxuICAgICAgICBub25jZTogMCxcbiAgICAgICAgdmFsdWU6ICcwJyxcbiAgICAgIH07XG4gICAgICBjb25zdCBrZXlQYWlyID0gbmV3IEtleVBhaXIoeyBwcnY6IFRFU1RfQUNDT1VOVF8yLmV0aFByaXZhdGVLZXkgfSk7XG4gICAgICBzaWduKHR4RGF0YSwga2V5UGFpcikuc2hvdWxkLmJlLmZ1bGZpbGxlZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3NpZ24gdHhEYXRhIHdpdGggdmFsdWUgc2V0IGFzIGhleCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4RGF0YTogVHhEYXRhID0ge1xuICAgICAgICBfdHlwZTogRVRIVHJhbnNhY3Rpb25UeXBlLkxFR0FDWSxcbiAgICAgICAgZGF0YTogJycsXG4gICAgICAgIGdhc0xpbWl0OiAnMHgxJyxcbiAgICAgICAgZ2FzUHJpY2U6ICcweDEnLFxuICAgICAgICBub25jZTogMCxcbiAgICAgICAgdmFsdWU6ICcweDAnLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IGtleVBhaXIgPSBuZXcgS2V5UGFpcih7IHBydjogVEVTVF9BQ0NPVU5UXzIuZXRoUHJpdmF0ZUtleSB9KTtcbiAgICAgIHNpZ24odHhEYXRhLCBrZXlQYWlyKS5zaG91bGQuYmUuZnVsZmlsbGVkKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzaWduIGZhaWx1cmUgY2FzZXMnLCAoKSA9PiB7XG4gICAgaXQoJ3NpZ24gdHhEYXRhIHdpdGggaW52YWxpZCBnYXNMaW1pdCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4RGF0YTogVHhEYXRhID0ge1xuICAgICAgICBfdHlwZTogRVRIVHJhbnNhY3Rpb25UeXBlLkxFR0FDWSxcbiAgICAgICAgZGF0YTogJycsXG4gICAgICAgIGdhc0xpbWl0OiAnJyxcbiAgICAgICAgZ2FzUHJpY2U6ICcweDAnLFxuICAgICAgICBub25jZTogMSxcbiAgICAgICAgdmFsdWU6ICcwJyxcbiAgICAgIH07XG4gICAgICBjb25zdCBrZXlQYWlyID0gbmV3IEtleVBhaXIoeyBwcnY6IFRFU1RfQUNDT1VOVF8yLmV0aFByaXZhdGVLZXkgfSk7XG4gICAgICBzaWduKHR4RGF0YSwga2V5UGFpcikuc2hvdWxkLmJlLnJlamVjdGVkV2l0aChuZXcgUmVnRXhwKCdDYW5ub3QgY29udmVydCBzdHJpbmcgdG8gYnVmZmVyLisnKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2lnbiB0eERhdGEgd2l0aCBpbnZhbGlkIGdhc1ByaWNlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhEYXRhOiBUeERhdGEgPSB7XG4gICAgICAgIF90eXBlOiBFVEhUcmFuc2FjdGlvblR5cGUuTEVHQUNZLFxuICAgICAgICBkYXRhOiAnJyxcbiAgICAgICAgZ2FzTGltaXQ6ICcweDAnLFxuICAgICAgICBnYXNQcmljZTogJycsXG4gICAgICAgIG5vbmNlOiAxLFxuICAgICAgICB2YWx1ZTogJzAnLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IGtleVBhaXIgPSBuZXcgS2V5UGFpcih7IHBydjogVEVTVF9BQ0NPVU5UXzIuZXRoUHJpdmF0ZUtleSB9KTtcbiAgICAgIHNpZ24odHhEYXRhLCBrZXlQYWlyKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKG5ldyBSZWdFeHAoJ0Nhbm5vdCBjb252ZXJ0IHN0cmluZyB0byBidWZmZXIuKycpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaWduIHR4RGF0YSB3aXRoIGludmFsaWQgbm9uY2UnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eERhdGE6IFR4RGF0YSA9IHtcbiAgICAgICAgX3R5cGU6IEVUSFRyYW5zYWN0aW9uVHlwZS5MRUdBQ1ksXG4gICAgICAgIGRhdGE6ICcnLFxuICAgICAgICBnYXNMaW1pdDogJzB4MCcsXG4gICAgICAgIGdhc1ByaWNlOiAnMHgwJyxcbiAgICAgICAgbm9uY2U6IC0xLFxuICAgICAgICB2YWx1ZTogJzAnLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IGtleVBhaXIgPSBuZXcgS2V5UGFpcih7IHBydjogVEVTVF9BQ0NPVU5UXzIuZXRoUHJpdmF0ZUtleSB9KTtcbiAgICAgIHNpZ24odHhEYXRhLCBrZXlQYWlyKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKG5ldyBSZWdFeHAoJ0Nhbm5vdCBjb252ZXJ0IHN0cmluZyB0byBidWZmZXIuKycpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaWduIHR4RGF0YSB3aXRoIGludmFsaWQgdmFsdWUnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eERhdGE6IFR4RGF0YSA9IHtcbiAgICAgICAgX3R5cGU6IEVUSFRyYW5zYWN0aW9uVHlwZS5MRUdBQ1ksXG4gICAgICAgIGRhdGE6ICcnLFxuICAgICAgICBnYXNMaW1pdDogJzB4MCcsXG4gICAgICAgIGdhc1ByaWNlOiAnMHgwJyxcbiAgICAgICAgbm9uY2U6IDEsXG4gICAgICAgIHZhbHVlOiAnJyxcbiAgICAgIH07XG4gICAgICBjb25zdCBrZXlQYWlyID0gbmV3IEtleVBhaXIoeyBwcnY6IFRFU1RfQUNDT1VOVF8yLmV0aFByaXZhdGVLZXkgfSk7XG4gICAgICBzaWduKHR4RGF0YSwga2V5UGFpcikuc2hvdWxkLmJlLnJlamVjdGVkV2l0aChuZXcgUmVnRXhwKCdDYW5ub3QgY29udmVydCBzdHJpbmcgdG8gYnVmZmVyLisnKSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCduZXR3b3JrIGNvbW1vbiBjb25maWd1cmF0aW9uJywgKCkgPT4ge1xuICAgIGl0KCdnZXRDb21tb24gZm9yIG1haW5uZXQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBjb21tb24gPSBnZXRDb21tb24oTmV0d29ya1R5cGUuTUFJTk5FVCk7XG4gICAgICBzaG91bGQuZXF1YWwoY29tbW9uLmNoYWluTmFtZSgpLCAnbWFpbm5ldCcpO1xuICAgICAgc2hvdWxkLmVxdWFsKGNvbW1vbi5oYXJkZm9yaygpLCAnbG9uZG9uJyk7XG4gICAgICBzaG91bGQuZXF1YWwoY29tbW9uLmNoYWluSWRCTigpLnRvU3RyaW5nKCksICc0MzExNCcpO1xuICAgICAgc2hvdWxkLmVxdWFsKGNvbW1vbi5uZXR3b3JrSWRCTigpLnRvU3RyaW5nKCksICcxJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnZ2V0Q29tbW9uIGZvciB0ZXN0bmV0JywgKCkgPT4ge1xuICAgICAgY29uc3QgY29tbW9uID0gZ2V0Q29tbW9uKE5ldHdvcmtUeXBlLlRFU1RORVQpO1xuICAgICAgc2hvdWxkLmVxdWFsKGNvbW1vbi5jaGFpbk5hbWUoKSwgJ2Z1amknKTtcbiAgICAgIHNob3VsZC5lcXVhbChjb21tb24uaGFyZGZvcmsoKSwgJ2xvbmRvbicpO1xuICAgICAgc2hvdWxkLmVxdWFsKGNvbW1vbi5jaGFpbklkQk4oKS50b1N0cmluZygpLCAnNDMxMTMnKTtcbiAgICAgIHNob3VsZC5lcXVhbChjb21tb24ubmV0d29ya0lkQk4oKS50b1N0cmluZygpLCAnMScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2dldENvbW1vbiBmb3IgaW52YWxpZCBuZXR3b3JrJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4gZ2V0Q29tbW9uKCdpbnZhbGlkTmV0d29yaycgYXMgTmV0d29ya1R5cGUpLFxuICAgICAgICAoZTogYW55KSA9PiBlLm1lc3NhZ2UgPT09ICdNaXNzaW5nIG5ldHdvcmsgY29tbW9uIGNvbmZpZ3VyYXRpb24nXG4gICAgICApO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19