@bitgo/sdk-coin-avaxp 5.2.13 → 5.2.15

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 (133) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/package.json +6 -6
  3. package/LICENSE +0 -191
  4. package/dist/src/avaxp.d.ts +0 -91
  5. package/dist/src/avaxp.d.ts.map +0 -1
  6. package/dist/src/avaxp.js +0 -343
  7. package/dist/src/iface.d.ts +0 -42
  8. package/dist/src/iface.d.ts.map +0 -1
  9. package/dist/src/iface.js +0 -3
  10. package/dist/src/index.d.ts +0 -6
  11. package/dist/src/index.d.ts.map +0 -1
  12. package/dist/src/index.js +0 -45
  13. package/dist/src/lib/atomicInCTransactionBuilder.d.ts +0 -21
  14. package/dist/src/lib/atomicInCTransactionBuilder.d.ts.map +0 -1
  15. package/dist/src/lib/atomicInCTransactionBuilder.js +0 -49
  16. package/dist/src/lib/atomicTransactionBuilder.d.ts +0 -38
  17. package/dist/src/lib/atomicTransactionBuilder.d.ts.map +0 -1
  18. package/dist/src/lib/atomicTransactionBuilder.js +0 -129
  19. package/dist/src/lib/delegatorTxBuilder.d.ts +0 -95
  20. package/dist/src/lib/delegatorTxBuilder.d.ts.map +0 -1
  21. package/dist/src/lib/delegatorTxBuilder.js +0 -285
  22. package/dist/src/lib/deprecatedTransaction.d.ts +0 -98
  23. package/dist/src/lib/deprecatedTransaction.d.ts.map +0 -1
  24. package/dist/src/lib/deprecatedTransaction.js +0 -344
  25. package/dist/src/lib/deprecatedTransactionBuilder.d.ts +0 -114
  26. package/dist/src/lib/deprecatedTransactionBuilder.d.ts.map +0 -1
  27. package/dist/src/lib/deprecatedTransactionBuilder.js +0 -210
  28. package/dist/src/lib/errors.d.ts +0 -8
  29. package/dist/src/lib/errors.d.ts.map +0 -1
  30. package/dist/src/lib/errors.js +0 -19
  31. package/dist/src/lib/exportInCTxBuilder.d.ts +0 -55
  32. package/dist/src/lib/exportInCTxBuilder.d.ts.map +0 -1
  33. package/dist/src/lib/exportInCTxBuilder.js +0 -159
  34. package/dist/src/lib/exportTxBuilder.d.ts +0 -33
  35. package/dist/src/lib/exportTxBuilder.d.ts.map +0 -1
  36. package/dist/src/lib/exportTxBuilder.js +0 -88
  37. package/dist/src/lib/iface.d.ts +0 -68
  38. package/dist/src/lib/iface.d.ts.map +0 -1
  39. package/dist/src/lib/iface.js +0 -20
  40. package/dist/src/lib/importInCTxBuilder.d.ts +0 -44
  41. package/dist/src/lib/importInCTxBuilder.d.ts.map +0 -1
  42. package/dist/src/lib/importInCTxBuilder.js +0 -131
  43. package/dist/src/lib/importTxBuilder.d.ts +0 -18
  44. package/dist/src/lib/importTxBuilder.d.ts.map +0 -1
  45. package/dist/src/lib/importTxBuilder.js +0 -67
  46. package/dist/src/lib/index.d.ts +0 -11
  47. package/dist/src/lib/index.d.ts.map +0 -1
  48. package/dist/src/lib/index.js +0 -37
  49. package/dist/src/lib/keyPair.d.ts +0 -58
  50. package/dist/src/lib/keyPair.d.ts.map +0 -1
  51. package/dist/src/lib/keyPair.js +0 -150
  52. package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts +0 -154
  53. package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts.map +0 -1
  54. package/dist/src/lib/permissionlessValidatorTxBuilder.js +0 -452
  55. package/dist/src/lib/transaction.d.ts +0 -78
  56. package/dist/src/lib/transaction.d.ts.map +0 -1
  57. package/dist/src/lib/transaction.js +0 -254
  58. package/dist/src/lib/transactionBuilder.d.ts +0 -71
  59. package/dist/src/lib/transactionBuilder.d.ts.map +0 -1
  60. package/dist/src/lib/transactionBuilder.js +0 -138
  61. package/dist/src/lib/transactionBuilderFactory.d.ts +0 -57
  62. package/dist/src/lib/transactionBuilderFactory.d.ts.map +0 -1
  63. package/dist/src/lib/transactionBuilderFactory.js +0 -178
  64. package/dist/src/lib/utils.d.ts +0 -184
  65. package/dist/src/lib/utils.d.ts.map +0 -1
  66. package/dist/src/lib/utils.js +0 -378
  67. package/dist/src/lib/utxoEngine.d.ts +0 -53
  68. package/dist/src/lib/utxoEngine.d.ts.map +0 -1
  69. package/dist/src/lib/utxoEngine.js +0 -112
  70. package/dist/src/lib/validatorTxBuilder.d.ts +0 -37
  71. package/dist/src/lib/validatorTxBuilder.d.ts.map +0 -1
  72. package/dist/src/lib/validatorTxBuilder.js +0 -69
  73. package/dist/src/register.d.ts +0 -3
  74. package/dist/src/register.d.ts.map +0 -1
  75. package/dist/src/register.js +0 -11
  76. package/dist/src/tavaxp.d.ts +0 -9
  77. package/dist/src/tavaxp.d.ts.map +0 -1
  78. package/dist/src/tavaxp.js +0 -14
  79. package/dist/test/resources/avaxp.d.ts +0 -259
  80. package/dist/test/resources/avaxp.d.ts.map +0 -1
  81. package/dist/test/resources/avaxp.js +0 -1093
  82. package/dist/test/resources/errors.d.ts +0 -19
  83. package/dist/test/resources/errors.d.ts.map +0 -1
  84. package/dist/test/resources/errors.js +0 -22
  85. package/dist/test/resources/keychains.d.ts +0 -18
  86. package/dist/test/resources/keychains.d.ts.map +0 -1
  87. package/dist/test/resources/keychains.js +0 -30
  88. package/dist/test/resources/tx/exportC.d.ts +0 -14
  89. package/dist/test/resources/tx/exportC.d.ts.map +0 -1
  90. package/dist/test/resources/tx/exportC.js +0 -21
  91. package/dist/test/resources/tx/importC.d.ts +0 -29
  92. package/dist/test/resources/tx/importC.d.ts.map +0 -1
  93. package/dist/test/resources/tx/importC.js +0 -42
  94. package/dist/test/resources/tx/importP.d.ts +0 -29
  95. package/dist/test/resources/tx/importP.d.ts.map +0 -1
  96. package/dist/test/resources/tx/importP.js +0 -42
  97. package/dist/test/unit/avaxp.d.ts +0 -2
  98. package/dist/test/unit/avaxp.d.ts.map +0 -1
  99. package/dist/test/unit/avaxp.js +0 -732
  100. package/dist/test/unit/lib/exportC2PTxBuilder.d.ts +0 -2
  101. package/dist/test/unit/lib/exportC2PTxBuilder.d.ts.map +0 -1
  102. package/dist/test/unit/lib/exportC2PTxBuilder.js +0 -125
  103. package/dist/test/unit/lib/exportP2CTxBuilder.d.ts +0 -2
  104. package/dist/test/unit/lib/exportP2CTxBuilder.d.ts.map +0 -1
  105. package/dist/test/unit/lib/exportP2CTxBuilder.js +0 -183
  106. package/dist/test/unit/lib/importC2PTxBuilder.d.ts +0 -2
  107. package/dist/test/unit/lib/importC2PTxBuilder.d.ts.map +0 -1
  108. package/dist/test/unit/lib/importC2PTxBuilder.js +0 -99
  109. package/dist/test/unit/lib/importP2CTxBuilder.d.ts +0 -2
  110. package/dist/test/unit/lib/importP2CTxBuilder.d.ts.map +0 -1
  111. package/dist/test/unit/lib/importP2CTxBuilder.js +0 -137
  112. package/dist/test/unit/lib/keyPair.d.ts +0 -2
  113. package/dist/test/unit/lib/keyPair.d.ts.map +0 -1
  114. package/dist/test/unit/lib/keyPair.js +0 -186
  115. package/dist/test/unit/lib/permissionlessValidatorTxBuilder.d.ts +0 -2
  116. package/dist/test/unit/lib/permissionlessValidatorTxBuilder.d.ts.map +0 -1
  117. package/dist/test/unit/lib/permissionlessValidatorTxBuilder.js +0 -341
  118. package/dist/test/unit/lib/signFlowTestSuit.d.ts +0 -20
  119. package/dist/test/unit/lib/signFlowTestSuit.d.ts.map +0 -1
  120. package/dist/test/unit/lib/signFlowTestSuit.js +0 -80
  121. package/dist/test/unit/lib/transactionBuilderFactory.d.ts +0 -2
  122. package/dist/test/unit/lib/transactionBuilderFactory.d.ts.map +0 -1
  123. package/dist/test/unit/lib/transactionBuilderFactory.js +0 -179
  124. package/dist/test/unit/lib/utils.d.ts +0 -2
  125. package/dist/test/unit/lib/utils.d.ts.map +0 -1
  126. package/dist/test/unit/lib/utils.js +0 -83
  127. package/dist/test/unit/lib/utxoEngine.d.ts +0 -2
  128. package/dist/test/unit/lib/utxoEngine.d.ts.map +0 -1
  129. package/dist/test/unit/lib/utxoEngine.js +0 -168
  130. package/dist/test/unit/lib/validateTxBuilder.d.ts +0 -2
  131. package/dist/test/unit/lib/validateTxBuilder.d.ts.map +0 -1
  132. package/dist/test/unit/lib/validateTxBuilder.js +0 -327
  133. package/dist/tsconfig.tsbuildinfo +0 -1
@@ -1,327 +0,0 @@
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_1 = __importDefault(require("assert"));
40
- require("should");
41
- const utils_1 = __importDefault(require("../../../src/lib/utils"));
42
- const testData = __importStar(require("../../resources/avaxp"));
43
- const errorMessage = __importStar(require("../../resources/errors"));
44
- const lib_1 = require("../../../src/lib");
45
- const statics_1 = require("@bitgo/statics");
46
- const avalanche_1 = require("avalanche");
47
- describe('AvaxP Validate Tx Builder', () => {
48
- const factory = new lib_1.TransactionBuilderFactory(statics_1.coins.get('avaxp'));
49
- describe('validate txBuilder fields', () => {
50
- const txBuilder = factory.getValidatorBuilder();
51
- it('should fail nodeID tag incorrect', () => {
52
- assert_1.default.throws(() => {
53
- txBuilder.validateNodeID(testData.INVALID_NODE_ID_MISSING_NODE_ID);
54
- }, (e) => e.message === errorMessage.ERROR_NODE_ID);
55
- });
56
- it('should fail nodeID length incorrect', () => {
57
- assert_1.default.throws(() => {
58
- txBuilder.validateNodeID(testData.INVALID_NODE_ID_LENGTH);
59
- }, (e) => e.message === errorMessage.ERROR_NODE_ID_LENGTH);
60
- });
61
- it('should suucess nodeID length incorrect', () => {
62
- txBuilder.validateNodeID(testData.NODE_ID_2);
63
- });
64
- it('should fail endTime less than 2 weeks', () => {
65
- assert_1.default.throws(() => {
66
- txBuilder.validateStakeDuration(testData.START_TIME, testData.START_TIME.add(testData.ONE_WEEK));
67
- }, (e) => e.message === errorMessage.ERROR_STAKE_DURATION_SHORT_TIME);
68
- });
69
- it('should fail endTime greater than 1 year', () => {
70
- assert_1.default.throws(() => {
71
- txBuilder.validateStakeDuration(testData.START_TIME, testData.START_TIME.add(testData.TWO_YEAR));
72
- }, (e) => e.message === errorMessage.ERROR_STAKE_DURATION_LONG_TIME);
73
- });
74
- it('should fail startTime too soon', () => {
75
- assert_1.default.throws(() => {
76
- txBuilder.validateStakeDuration(new avalanche_1.BN(Date.now()), testData.ONE_WEEK);
77
- }, (e) => e.message === errorMessage.ERROR_STAKE_START_TIME_TOO_SHORT);
78
- });
79
- it('should fail stake amount less than 2000', () => {
80
- assert_1.default.throws(() => {
81
- txBuilder.validateStakeAmount(testData.INVALID_STAKE_AMOUNT);
82
- }, (e) => e.message === errorMessage.ERROR_STAKE_AMOUNT);
83
- });
84
- it('should fail delegationFeeRate too low', () => {
85
- assert_1.default.throws(() => {
86
- txBuilder.validateDelegationFeeRate(testData.INVALID_DELEGATION_FEE);
87
- }, (e) => e.message === errorMessage.ERROR_DELEGATION_FEE);
88
- });
89
- it('should fail validate Utxos empty string', () => {
90
- assert_1.default.throws(() => {
91
- txBuilder.validateUtxos([]);
92
- }, (e) => e.message === errorMessage.ERROR_UTXOS_EMPTY);
93
- });
94
- it('should fail validate Utxos without amount field', () => {
95
- assert_1.default.throws(() => {
96
- txBuilder.validateUtxos([{ outputID: '' }]);
97
- }, (e) => e.message === errorMessage.ERROR_UTXOS_AMOUNT);
98
- });
99
- });
100
- describe('Utils tests', () => {
101
- it('should fail address is invalid', () => {
102
- utils_1.default.isValidAddress(testData.INVALID_ADDRESS).should.be.false();
103
- });
104
- it('should fail blockId is invalid', () => {
105
- utils_1.default.isValidBlockId(testData.INVALID_BLOCK_ID).should.be.false();
106
- });
107
- it('should fail blockId length is invalid', () => {
108
- utils_1.default.isValidBlockId(testData.INVALID_BLOCK_ID_LENGTH).should.be.false();
109
- });
110
- it('should pass blockId is valid', () => {
111
- utils_1.default.isValidBlockId(testData.VALID_BLOCK_ID).should.be.true();
112
- });
113
- it('should pass address is valid', () => {
114
- utils_1.default.isValidAddress(testData.VALID_ADDRESS).should.be.true();
115
- });
116
- });
117
- describe('should build ', () => {
118
- it('Should create AddValidator tx for same values', async () => {
119
- const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tavaxp'))
120
- .getValidatorBuilder()
121
- .threshold(testData.ADDVALIDATOR_SAMPLES.threshold)
122
- .locktime(testData.ADDVALIDATOR_SAMPLES.locktime)
123
- .fromPubKey(testData.ADDVALIDATOR_SAMPLES.pAddresses)
124
- .startTime(testData.ADDVALIDATOR_SAMPLES.startTime)
125
- .endTime(testData.ADDVALIDATOR_SAMPLES.endTime)
126
- .stakeAmount(testData.ADDVALIDATOR_SAMPLES.minValidatorStake)
127
- .delegationFeeRate(testData.ADDVALIDATOR_SAMPLES.delegationFee)
128
- .nodeID(testData.ADDVALIDATOR_SAMPLES.nodeID)
129
- .utxos(testData.ADDVALIDATOR_SAMPLES.outputs);
130
- const tx = await txBuilder.build();
131
- const rawTx = tx.toBroadcastFormat();
132
- rawTx.should.equal(testData.ADDVALIDATOR_SAMPLES.unsignedTxHex);
133
- });
134
- it('Should create AddValidator tx when change amount is 0', async () => {
135
- const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tavaxp'))
136
- .getValidatorBuilder()
137
- .threshold(testData.ADDVALIDATOR_SAMPLES.threshold)
138
- .locktime(testData.ADDVALIDATOR_SAMPLES.locktime)
139
- .fromPubKey(testData.ADDVALIDATOR_SAMPLES.pAddresses)
140
- .startTime(testData.ADDVALIDATOR_SAMPLES.startTime)
141
- .endTime(testData.ADDVALIDATOR_SAMPLES.endTime)
142
- .stakeAmount('24938830298') // stake amount is total amount in outputs
143
- .delegationFeeRate(testData.ADDVALIDATOR_SAMPLES.delegationFee)
144
- .nodeID(testData.ADDVALIDATOR_SAMPLES.nodeID)
145
- .utxos(testData.ADDVALIDATOR_SAMPLES.outputs);
146
- await txBuilder.build().should.not.throw();
147
- });
148
- it('Should recover AddValidator tx from raw tx', async () => {
149
- const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tavaxp')).from(testData.ADDVALIDATOR_SAMPLES.unsignedTxHex);
150
- const tx = await txBuilder.build();
151
- const rawTx = tx.toBroadcastFormat();
152
- rawTx.should.equal(testData.ADDVALIDATOR_SAMPLES.unsignedTxHex);
153
- });
154
- it('Should create half signed AddValidator tx for same values', async () => {
155
- const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tavaxp'))
156
- .getValidatorBuilder()
157
- .threshold(testData.ADDVALIDATOR_SAMPLES.threshold)
158
- .locktime(testData.ADDVALIDATOR_SAMPLES.locktime)
159
- .fromPubKey(testData.ADDVALIDATOR_SAMPLES.pAddresses)
160
- .startTime(testData.ADDVALIDATOR_SAMPLES.startTime)
161
- .endTime(testData.ADDVALIDATOR_SAMPLES.endTime)
162
- .stakeAmount(testData.ADDVALIDATOR_SAMPLES.minValidatorStake)
163
- .delegationFeeRate(testData.ADDVALIDATOR_SAMPLES.delegationFee)
164
- .nodeID(testData.ADDVALIDATOR_SAMPLES.nodeID)
165
- .utxos(testData.ADDVALIDATOR_SAMPLES.outputs);
166
- txBuilder.sign({ key: testData.ADDVALIDATOR_SAMPLES.privKey.prv1 });
167
- const tx = await txBuilder.build();
168
- const rawTx = tx.toBroadcastFormat();
169
- rawTx.should.equal(testData.ADDVALIDATOR_SAMPLES.halfsigntxHex);
170
- });
171
- it('Should recover half signed AddValidator from raw tx', async () => {
172
- const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tavaxp')).from(testData.ADDVALIDATOR_SAMPLES.halfsigntxHex);
173
- const tx = await txBuilder.build();
174
- const rawTx = tx.toBroadcastFormat();
175
- rawTx.should.equal(testData.ADDVALIDATOR_SAMPLES.halfsigntxHex);
176
- });
177
- it('Should half sign a AddValidator tx from unsigned raw tx', async () => {
178
- const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tavaxp')).from(testData.ADDVALIDATOR_SAMPLES.unsignedTxHex);
179
- txBuilder.sign({ key: testData.ADDVALIDATOR_SAMPLES.privKey.prv1 });
180
- const tx = await txBuilder.build();
181
- const rawTx = tx.toBroadcastFormat();
182
- rawTx.should.equal(testData.ADDVALIDATOR_SAMPLES.halfsigntxHex);
183
- });
184
- it('Should recover half signed AddValidator from half signed raw tx', async () => {
185
- const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tavaxp')).from(testData.ADDVALIDATOR_SAMPLES.halfsigntxHex);
186
- const tx = await txBuilder.build();
187
- const rawTx = tx.toBroadcastFormat();
188
- rawTx.should.equal(testData.ADDVALIDATOR_SAMPLES.halfsigntxHex);
189
- });
190
- it('Should recover signed AddValidator from signed raw tx', async () => {
191
- const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tavaxp')).from(testData.ADDVALIDATOR_SAMPLES.fullsigntxHex);
192
- const tx = await txBuilder.build();
193
- const rawTx = tx.toBroadcastFormat();
194
- rawTx.should.equal(testData.ADDVALIDATOR_SAMPLES.fullsigntxHex);
195
- });
196
- it('Should full sign a AddValidator tx for same values', async () => {
197
- const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tavaxp'))
198
- .getValidatorBuilder()
199
- .threshold(testData.ADDVALIDATOR_SAMPLES.threshold)
200
- .locktime(testData.ADDVALIDATOR_SAMPLES.locktime)
201
- .fromPubKey(testData.ADDVALIDATOR_SAMPLES.pAddresses)
202
- .startTime(testData.ADDVALIDATOR_SAMPLES.startTime)
203
- .endTime(testData.ADDVALIDATOR_SAMPLES.endTime)
204
- .stakeAmount(testData.ADDVALIDATOR_SAMPLES.minValidatorStake)
205
- .delegationFeeRate(testData.ADDVALIDATOR_SAMPLES.delegationFee)
206
- .nodeID(testData.ADDVALIDATOR_SAMPLES.nodeID)
207
- .utxos(testData.ADDVALIDATOR_SAMPLES.outputs);
208
- txBuilder.sign({ key: testData.ADDVALIDATOR_SAMPLES.privKey.prv1 });
209
- txBuilder.sign({ key: testData.ADDVALIDATOR_SAMPLES.privKey.prv2 });
210
- const tx = await txBuilder.build();
211
- const rawTx = tx.toBroadcastFormat();
212
- rawTx.should.equal(testData.ADDVALIDATOR_SAMPLES.fullsigntxHex);
213
- });
214
- it('Should full sign a AddValidator tx from half signed raw tx', async () => {
215
- const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tavaxp')).from(testData.ADDVALIDATOR_SAMPLES.halfsigntxHex);
216
- txBuilder.sign({ key: testData.ADDVALIDATOR_SAMPLES.privKey.prv2 });
217
- const tx = await txBuilder.build();
218
- const rawTx = tx.toBroadcastFormat();
219
- rawTx.should.equal(testData.ADDVALIDATOR_SAMPLES.fullsigntxHex);
220
- });
221
- it('Should full sign a AddValidator tx from unsigned raw tx', async () => {
222
- const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tavaxp')).from(testData.ADDVALIDATOR_SAMPLES.unsignedTxHex);
223
- txBuilder.sign({ key: testData.ADDVALIDATOR_SAMPLES.privKey.prv1 });
224
- txBuilder.sign({ key: testData.ADDVALIDATOR_SAMPLES.privKey.prv2 });
225
- const tx = await txBuilder.build();
226
- const rawTx = tx.toBroadcastFormat();
227
- rawTx.should.equal(testData.ADDVALIDATOR_SAMPLES.fullsigntxHex);
228
- });
229
- it('Should full sign a AddValidator tx with recovery key for same values', async () => {
230
- const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tavaxp'))
231
- .getValidatorBuilder()
232
- .threshold(testData.ADDVALIDATOR_SAMPLES.threshold)
233
- .locktime(testData.ADDVALIDATOR_SAMPLES.locktime)
234
- .fromPubKey(testData.ADDVALIDATOR_SAMPLES.pAddresses)
235
- .startTime(testData.ADDVALIDATOR_SAMPLES.startTime)
236
- .endTime(testData.ADDVALIDATOR_SAMPLES.endTime)
237
- .stakeAmount(testData.ADDVALIDATOR_SAMPLES.minValidatorStake)
238
- .delegationFeeRate(testData.ADDVALIDATOR_SAMPLES.delegationFee)
239
- .nodeID(testData.ADDVALIDATOR_SAMPLES.nodeID)
240
- .utxos(testData.ADDVALIDATOR_SAMPLES.outputs)
241
- .recoverMode();
242
- txBuilder.sign({ key: testData.ADDVALIDATOR_SAMPLES.privKey.prv3 });
243
- txBuilder.sign({ key: testData.ADDVALIDATOR_SAMPLES.privKey.prv2 });
244
- const tx = await txBuilder.build();
245
- const rawTx = tx.toBroadcastFormat();
246
- rawTx.should.equal(testData.ADDVALIDATOR_SAMPLES.recoveryFullsigntxHexWithoutMemo);
247
- });
248
- it('Should recover half sign a AddValidator tx with recovery key from half signed raw tx', async () => {
249
- const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tavaxp')).from(testData.ADDVALIDATOR_SAMPLES.recoveryHalfsigntxHex);
250
- const tx = await txBuilder.build();
251
- const rawTx = tx.toBroadcastFormat();
252
- rawTx.should.equal(testData.ADDVALIDATOR_SAMPLES.recoveryHalfsigntxHex);
253
- });
254
- it('Should full sign a AddValidator tx with recovery key from half signed raw tx', async () => {
255
- const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tavaxp')).from(testData.ADDVALIDATOR_SAMPLES.recoveryHalfsigntxHex);
256
- txBuilder.sign({ key: testData.ADDVALIDATOR_SAMPLES.privKey.prv2 });
257
- const tx = await txBuilder.build();
258
- const rawTx = tx.toBroadcastFormat();
259
- rawTx.should.equal(testData.ADDVALIDATOR_SAMPLES.recoveryFullsigntxHex);
260
- });
261
- it('Should full sign a AddValidator tx with recovery key from unsigned raw tx', async () => {
262
- const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tavaxp')).from(testData.ADDVALIDATOR_SAMPLES.recoveryUnsignedTxHex);
263
- // txBuilder.recoverMode()
264
- txBuilder.sign({ key: testData.ADDVALIDATOR_SAMPLES.privKey.prv3 });
265
- txBuilder.sign({ key: testData.ADDVALIDATOR_SAMPLES.privKey.prv2 });
266
- const tx = await txBuilder.build();
267
- const rawTx = tx.toBroadcastFormat();
268
- rawTx.should.equal(testData.ADDVALIDATOR_SAMPLES.recoveryFullsigntxHexWithMemo);
269
- });
270
- it('Compare size and location of signatures in credentials for halfsign', async () => {
271
- const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tavaxp')).from(testData.ADDVALIDATOR_SAMPLES.unsignedTxHex);
272
- txBuilder.sign({ key: testData.ADDVALIDATOR_SAMPLES.privKey.prv1 });
273
- // look into credentials make sure that index 0 is signed with user key
274
- });
275
- it('Compare size and location of signatures in credentials for full sign', async () => {
276
- const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tavaxp')).from(testData.ADDVALIDATOR_SAMPLES.unsignedTxHex);
277
- txBuilder.sign({ key: testData.ADDVALIDATOR_SAMPLES.privKey.prv1 });
278
- txBuilder.sign({ key: testData.ADDVALIDATOR_SAMPLES.privKey.prv1 });
279
- // look into credentials make sure that index 0 and 2 is signed
280
- });
281
- });
282
- describe('Key cannot sign the transaction ', () => {
283
- it('Should full sign a AddValidator tx from unsigned raw tx', () => {
284
- const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tavaxp')).from(testData.ADDVALIDATOR_SAMPLES.unsignedTxHex);
285
- txBuilder.sign({ key: testData.ADDVALIDATOR_SAMPLES.privKey.prv2 });
286
- txBuilder
287
- .build()
288
- .then(() => assert_1.default.fail('it can sign'))
289
- .catch((err) => {
290
- err.message.should.be.equal(errorMessage.ERROR_KEY_CANNOT_SIGN);
291
- });
292
- });
293
- it('Should 2 full sign a AddValidator tx from unsigned raw tx', () => {
294
- const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tavaxp')).from(testData.ADDVALIDATOR_SAMPLES.recoveryUnsignedTxHex);
295
- txBuilder.sign({ key: testData.ADDVALIDATOR_SAMPLES.privKey.prv1 });
296
- txBuilder
297
- .build()
298
- .then(() => assert_1.default.fail('it can sign'))
299
- .catch((err) => {
300
- err.message.should.be.equal(errorMessage.ERROR_KEY_CANNOT_SIGN);
301
- });
302
- });
303
- // HSM expected empty credential, we cannot verify if the next signature is the correct.
304
- it('Should full sign a AddValidator tx from unsigned raw tx', () => {
305
- const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tavaxp')).from(testData.ADDVALIDATOR_SAMPLES.halfsigntxHex);
306
- txBuilder.sign({ key: testData.ADDVALIDATOR_SAMPLES.privKey.prv2 });
307
- txBuilder
308
- .build()
309
- .then(() => assert_1.default.fail('it can sign'))
310
- .catch((err) => {
311
- err.message.should.be.equal(errorMessage.ERROR_KEY_CANNOT_SIGN);
312
- });
313
- });
314
- // HSM expected empty credential, we cannot verify if the next signature is the correct.
315
- it('Should full sign a AddValidator tx from unsigned raw tx', () => {
316
- const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tavaxp')).from(testData.ADDVALIDATOR_SAMPLES.recoveryHalfsigntxHex);
317
- txBuilder.sign({ key: testData.ADDVALIDATOR_SAMPLES.privKey.prv1 });
318
- txBuilder
319
- .build()
320
- .then(() => assert_1.default.fail('it can sign'))
321
- .catch((err) => {
322
- err.message.should.be.equal(errorMessage.ERROR_KEY_CANNOT_SIGN);
323
- });
324
- });
325
- });
326
- });
327
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGVUeEJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L3VuaXQvbGliL3ZhbGlkYXRlVHhCdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLGtCQUFnQjtBQUNoQixtRUFBMkM7QUFDM0MsZ0VBQWtEO0FBQ2xELHFFQUF1RDtBQUN2RCwwQ0FBNkU7QUFDN0UsNENBQXVDO0FBQ3ZDLHlDQUErQjtBQUUvQixRQUFRLENBQUMsMkJBQTJCLEVBQUUsR0FBRyxFQUFFO0lBQ3pDLE1BQU0sT0FBTyxHQUFHLElBQUksK0JBQXlCLENBQUMsZUFBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBRWxFLFFBQVEsQ0FBQywyQkFBMkIsRUFBRSxHQUFHLEVBQUU7UUFDekMsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDaEQsRUFBRSxDQUFDLGtDQUFrQyxFQUFFLEdBQUcsRUFBRTtZQUMxQyxnQkFBTSxDQUFDLE1BQU0sQ0FDWCxHQUFHLEVBQUU7Z0JBQ0gsU0FBUyxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsK0JBQStCLENBQUMsQ0FBQztZQUNyRSxDQUFDLEVBQ0QsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssWUFBWSxDQUFDLGFBQWEsQ0FDckQsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBQ0gsRUFBRSxDQUFDLHFDQUFxQyxFQUFFLEdBQUcsRUFBRTtZQUM3QyxnQkFBTSxDQUFDLE1BQU0sQ0FDWCxHQUFHLEVBQUU7Z0JBQ0gsU0FBUyxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsc0JBQXNCLENBQUMsQ0FBQztZQUM1RCxDQUFDLEVBQ0QsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxP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SyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQ2IsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMscUJBQXFCLENBQUMsQ0FBQztZQUNsRSxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQyxDQUFDO1FBRUgsd0ZBQXdGO1FBQ3hGLEVBQUUsQ0FBQyx5REFBeUQsRUFBRSxHQUFHLEVBQUU7WUFDakUsTUFBTSxTQUFTLEdBQUcsSUFBSSwrQkFBeUIsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUN2RSxRQUFRLENBQUMsb0JBQW9CLENBQUMscUJBQXFCLENBQ3BELENBQUM7WUFDRixTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUNwRSxTQUFTO2lCQUNOLEtBQUssRUFBRTtpQkFDUCxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsZ0JBQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7aUJBQ3RDLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUNiLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLHFCQUFxQixDQUFDLENBQUM7WUFDbEUsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgJ3Nob3VsZCc7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vLi4vLi4vc3JjL2xpYi91dGlscyc7XG5pbXBvcnQgKiBhcyB0ZXN0RGF0YSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvYXZheHAnO1xuaW1wb3J0ICogYXMgZXJyb3JNZXNzYWdlIGZyb20gJy4uLy4uL3Jlc291cmNlcy9lcnJvcnMnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeSwgRGVjb2RlZFV0eG9PYmogfSBmcm9tICcuLi8uLi8uLi9zcmMvbGliJztcbmltcG9ydCB7IGNvaW5zIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuaW1wb3J0IHsgQk4gfSBmcm9tICdhdmFsYW5jaGUnO1xuXG5kZXNjcmliZSgnQXZheFAgVmFsaWRhdGUgVHggQnVpbGRlcicsICgpID0+IHtcbiAgY29uc3QgZmFjdG9yeSA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgnYXZheHAnKSk7XG5cbiAgZGVzY3JpYmUoJ3ZhbGlkYXRlIHR4QnVpbGRlciBmaWVsZHMnLCAoKSA9PiB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRWYWxpZGF0b3JCdWlsZGVyKCk7XG4gICAgaXQoJ3Nob3VsZCBmYWlsIG5vZGVJRCB0YWcgaW5jb3JyZWN0JywgKCkgPT4ge1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHR4QnVpbGRlci52YWxpZGF0ZU5vZGVJRCh0ZXN0RGF0YS5JTlZBTElEX05PREVfSURfTUlTU0lOR19OT0RFX0lEKTtcbiAgICAgICAgfSxcbiAgICAgICAgKGU6IGFueSkgPT4gZS5tZXNzYWdlID09PSBlcnJvck1lc3NhZ2UuRVJST1JfTk9ERV9JRFxuICAgICAgKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIGZhaWwgbm9kZUlEIGxlbmd0aCBpbmNvcnJlY3QnLCAoKSA9PiB7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdHhCdWlsZGVyLnZhbGlkYXRlTm9kZUlEKHRlc3REYXRhLklOVkFMSURfTk9ERV9JRF9MRU5HVEgpO1xuICAgICAgICB9LFxuICAgICAgICAoZTogYW55KSA9PiBlLm1lc3NhZ2UgPT09IGVycm9yTWVzc2FnZS5FUlJPUl9OT0RFX0lEX0xFTkdUSFxuICAgICAgKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIHN1dWNlc3Mgbm9kZUlEIGxlbmd0aCBpbmNvcnJlY3QnLCAoKSA9PiB7XG4gICAgICB0eEJ1aWxkZXIudmFsaWRhdGVOb2RlSUQodGVzdERhdGEuTk9ERV9JRF8yKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIGZhaWwgZW5kVGltZSBsZXNzIHRoYW4gMiB3ZWVrcycsICgpID0+IHtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0eEJ1aWxkZXIudmFsaWRhdGVTdGFrZUR1cmF0aW9uKHRlc3REYXRhLlNUQVJUX1RJTUUsIHRlc3REYXRhLlNUQVJUX1RJTUUuYWRkKHRlc3REYXRhLk9ORV9XRUVLKSk7XG4gICAgICAgIH0sXG4gICAgICAgIChlOiBhbnkpID0+IGUubWVzc2FnZSA9PT0gZXJyb3JNZXNzYWdlLkVSUk9SX1NUQUtFX0RVUkFUSU9OX1NIT1JUX1RJTUVcbiAgICAgICk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBmYWlsIGVuZFRpbWUgZ3JlYXRlciB0aGFuIDEgeWVhcicsICgpID0+IHtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0eEJ1aWxkZXIudmFsaWRhdGVTdGFrZUR1cmF0aW9uKHRlc3REYXRhLlNUQVJUX1RJTUUsIHRlc3REYXRhLlNUQVJUX1RJTUUuYWRkKHRlc3REYXRhLlRXT19ZRUFSKSk7XG4gICAgICAgIH0sXG4gICAgICAgIChlOiBhbnkpID0+IGUubWVzc2FnZSA9PT0gZXJyb3JNZXNzYWdlLkVSUk9SX1NUQUtFX0RVUkFUSU9OX0xPTkdfVElNRVxuICAgICAgKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIGZhaWwgc3RhcnRUaW1lIHRvbyBzb29uJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHR4QnVpbGRlci52YWxpZGF0ZVN0YWtlRHVyYXRpb24obmV3IEJOKERhdGUubm93KCkpLCB0ZXN0RGF0YS5PTkVfV0VFSyk7XG4gICAgICAgIH0sXG4gICAgICAgIChlOiBhbnkpID0+IGUubWVzc2FnZSA9PT0gZXJyb3JNZXNzYWdlLkVSUk9SX1NUQUtFX1NUQVJUX1RJTUVfVE9PX1NIT1JUXG4gICAgICApO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgZmFpbCBzdGFrZSBhbW91bnQgbGVzcyB0aGFuIDIwMDAnLCAoKSA9PiB7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdHhCdWlsZGVyLnZhbGlkYXRlU3Rha2VBbW91bnQodGVzdERhdGEuSU5WQUxJRF9TVEFLRV9BTU9VTlQpO1xuICAgICAgICB9LFxuICAgICAgICAoZTogYW55KSA9PiBlLm1lc3NhZ2UgPT09IGVycm9yTWVzc2FnZS5FUlJPUl9TVEFLRV9BTU9VTlRcbiAgICAgICk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBmYWlsIGRlbGVnYXRpb25GZWVSYXRlIHRvbyBsb3cnLCAoKSA9PiB7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdHhCdWlsZGVyLnZhbGlkYXRlRGVsZWdhdGlvbkZlZVJhdGUodGVzdERhdGEuSU5WQUxJRF9ERUxFR0FUSU9OX0ZFRSk7XG4gICAgICAgIH0sXG4gICAgICAgIChlOiBhbnkpID0+IGUubWVzc2FnZSA9PT0gZXJyb3JNZXNzYWdlLkVSUk9SX0RFTEVHQVRJT05fRkVFXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHZhbGlkYXRlIFV0eG9zIGVtcHR5IHN0cmluZycsICgpID0+IHtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0eEJ1aWxkZXIudmFsaWRhdGVVdHhvcyhbXSk7XG4gICAgICAgIH0sXG4gICAgICAgIChlOiBhbnkpID0+IGUubWVzc2FnZSA9PT0gZXJyb3JNZXNzYWdlLkVSUk9SX1VUWE9TX0VNUFRZXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHZhbGlkYXRlIFV0eG9zIHdpdGhvdXQgYW1vdW50IGZpZWxkJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHR4QnVpbGRlci52YWxpZGF0ZVV0eG9zKFt7IG91dHB1dElEOiAnJyB9IGFzIGFueSBhcyBEZWNvZGVkVXR4b09ial0pO1xuICAgICAgICB9LFxuICAgICAgICAoZTogYW55KSA9PiBlLm1lc3NhZ2UgPT09IGVycm9yTWVzc2FnZS5FUlJPUl9VVFhPU19BTU9VTlRcbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdVdGlscyB0ZXN0cycsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGZhaWwgYWRkcmVzcyBpcyBpbnZhbGlkJywgKCkgPT4ge1xuICAgICAgdXRpbHMuaXNWYWxpZEFkZHJlc3ModGVzdERhdGEuSU5WQUxJRF9BRERSRVNTKS5zaG91bGQuYmUuZmFsc2UoKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIGZhaWwgYmxvY2tJZCBpcyBpbnZhbGlkJywgKCkgPT4ge1xuICAgICAgdXRpbHMuaXNWYWxpZEJsb2NrSWQodGVzdERhdGEuSU5WQUxJRF9CTE9DS19JRCkuc2hvdWxkLmJlLmZhbHNlKCk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBmYWlsIGJsb2NrSWQgbGVuZ3RoIGlzIGludmFsaWQnLCAoKSA9PiB7XG4gICAgICB1dGlscy5pc1ZhbGlkQmxvY2tJZCh0ZXN0RGF0YS5JTlZBTElEX0JMT0NLX0lEX0xFTkdUSCkuc2hvdWxkLmJlLmZhbHNlKCk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBwYXNzIGJsb2NrSWQgaXMgdmFsaWQnLCAoKSA9PiB7XG4gICAgICB1dGlscy5pc1ZhbGlkQmxvY2tJZCh0ZXN0RGF0YS5WQUxJRF9CTE9DS19JRCkuc2hvdWxkLmJlLnRydWUoKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIHBhc3MgYWRkcmVzcyBpcyB2YWxpZCcsICgpID0+IHtcbiAgICAgIHV0aWxzLmlzVmFsaWRBZGRyZXNzKHRlc3REYXRhLlZBTElEX0FERFJFU1MpLnNob3VsZC5iZS50cnVlKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzaG91bGQgYnVpbGQgJywgKCkgPT4ge1xuICAgIGl0KCdTaG91bGQgY3JlYXRlIEFkZFZhbGlkYXRvciB0eCBmb3Igc2FtZSB2YWx1ZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RhdmF4cCcpKVxuICAgICAgICAuZ2V0VmFsaWRhdG9yQnVpbGRlcigpXG4gICAgICAgIC50aHJlc2hvbGQodGVzdERhdGEuQUREVkFMSURBVE9SX1NBTVBMRVMudGhyZXNob2xkKVxuICAgICAgICAubG9ja3RpbWUodGVzdERhdGEuQUREVkFMSURBVE9SX1NBTVBMRVMubG9ja3RpbWUpXG4gICAgICAgIC5mcm9tUHViS2V5KHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLnBBZGRyZXNzZXMpXG4gICAgICAgIC5zdGFydFRpbWUodGVzdERhdGEuQUREVkFMSURBVE9SX1NBTVBMRVMuc3RhcnRUaW1lKVxuICAgICAgICAuZW5kVGltZSh0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy5lbmRUaW1lKVxuICAgICAgICAuc3Rha2VBbW91bnQodGVzdERhdGEuQUREVkFMSURBVE9SX1NBTVBMRVMubWluVmFsaWRhdG9yU3Rha2UpXG4gICAgICAgIC5kZWxlZ2F0aW9uRmVlUmF0ZSh0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy5kZWxlZ2F0aW9uRmVlKVxuICAgICAgICAubm9kZUlEKHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLm5vZGVJRClcbiAgICAgICAgLnV0eG9zKHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLm91dHB1dHMpO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgcmF3VHguc2hvdWxkLmVxdWFsKHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLnVuc2lnbmVkVHhIZXgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Nob3VsZCBjcmVhdGUgQWRkVmFsaWRhdG9yIHR4IHdoZW4gY2hhbmdlIGFtb3VudCBpcyAwJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0YXZheHAnKSlcbiAgICAgICAgLmdldFZhbGlkYXRvckJ1aWxkZXIoKVxuICAgICAgICAudGhyZXNob2xkKHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLnRocmVzaG9sZClcbiAgICAgICAgLmxvY2t0aW1lKHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLmxvY2t0aW1lKVxuICAgICAgICAuZnJvbVB1YktleSh0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy5wQWRkcmVzc2VzKVxuICAgICAgICAuc3RhcnRUaW1lKHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLnN0YXJ0VGltZSlcbiAgICAgICAgLmVuZFRpbWUodGVzdERhdGEuQUREVkFMSURBVE9SX1NBTVBMRVMuZW5kVGltZSlcbiAgICAgICAgLnN0YWtlQW1vdW50KCcyNDkzODgzMDI5OCcpIC8vIHN0YWtlIGFtb3VudCBpcyB0b3RhbCBhbW91bnQgaW4gb3V0cHV0c1xuICAgICAgICAuZGVsZWdhdGlvbkZlZVJhdGUodGVzdERhdGEuQUREVkFMSURBVE9SX1NBTVBMRVMuZGVsZWdhdGlvbkZlZSlcbiAgICAgICAgLm5vZGVJRCh0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy5ub2RlSUQpXG4gICAgICAgIC51dHhvcyh0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy5vdXRwdXRzKTtcblxuICAgICAgYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkuc2hvdWxkLm5vdC50aHJvdygpO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Nob3VsZCByZWNvdmVyIEFkZFZhbGlkYXRvciB0eCBmcm9tIHJhdyB0eCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGF2YXhwJykpLmZyb20oXG4gICAgICAgIHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLnVuc2lnbmVkVHhIZXhcbiAgICAgICk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgcmF3VHguc2hvdWxkLmVxdWFsKHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLnVuc2lnbmVkVHhIZXgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Nob3VsZCBjcmVhdGUgaGFsZiBzaWduZWQgQWRkVmFsaWRhdG9yIHR4IGZvciBzYW1lIHZhbHVlcycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGF2YXhwJykpXG4gICAgICAgIC5nZXRWYWxpZGF0b3JCdWlsZGVyKClcbiAgICAgICAgLnRocmVzaG9sZCh0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy50aHJlc2hvbGQpXG4gICAgICAgIC5sb2NrdGltZSh0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy5sb2NrdGltZSlcbiAgICAgICAgLmZyb21QdWJLZXkodGVzdERhdGEuQUREVkFMSURBVE9SX1NBTVBMRVMucEFkZHJlc3NlcylcbiAgICAgICAgLnN0YXJ0VGltZSh0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy5zdGFydFRpbWUpXG4gICAgICAgIC5lbmRUaW1lKHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLmVuZFRpbWUpXG4gICAgICAgIC5zdGFrZUFtb3VudCh0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy5taW5WYWxpZGF0b3JTdGFrZSlcbiAgICAgICAgLmRlbGVnYXRpb25GZWVSYXRlKHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLmRlbGVnYXRpb25GZWUpXG4gICAgICAgIC5ub2RlSUQodGVzdERhdGEuQUREVkFMSURBVE9SX1NBTVBMRVMubm9kZUlEKVxuICAgICAgICAudXR4b3ModGVzdERhdGEuQUREVkFMSURBVE9SX1NBTVBMRVMub3V0cHV0cyk7XG5cbiAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy5wcml2S2V5LnBydjEgfSk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgcmF3VHguc2hvdWxkLmVxdWFsKHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLmhhbGZzaWdudHhIZXgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Nob3VsZCByZWNvdmVyIGhhbGYgc2lnbmVkIEFkZFZhbGlkYXRvciBmcm9tIHJhdyB0eCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGF2YXhwJykpLmZyb20oXG4gICAgICAgIHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLmhhbGZzaWdudHhIZXhcbiAgICAgICk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgcmF3VHguc2hvdWxkLmVxdWFsKHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLmhhbGZzaWdudHhIZXgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Nob3VsZCBoYWxmIHNpZ24gYSBBZGRWYWxpZGF0b3IgdHggZnJvbSB1bnNpZ25lZCByYXcgdHgnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RhdmF4cCcpKS5mcm9tKFxuICAgICAgICB0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy51bnNpZ25lZFR4SGV4XG4gICAgICApO1xuICAgICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLnByaXZLZXkucHJ2MSB9KTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICByYXdUeC5zaG91bGQuZXF1YWwodGVzdERhdGEuQUREVkFMSURBVE9SX1NBTVBMRVMuaGFsZnNpZ250eEhleCk7XG4gICAgfSk7XG5cbiAgICBpdCgnU2hvdWxkIHJlY292ZXIgaGFsZiBzaWduZWQgQWRkVmFsaWRhdG9yIGZyb20gaGFsZiBzaWduZWQgcmF3IHR4JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0YXZheHAnKSkuZnJvbShcbiAgICAgICAgdGVzdERhdGEuQUREVkFMSURBVE9SX1NBTVBMRVMuaGFsZnNpZ250eEhleFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICByYXdUeC5zaG91bGQuZXF1YWwodGVzdERhdGEuQUREVkFMSURBVE9SX1NBTVBMRVMuaGFsZnNpZ250eEhleCk7XG4gICAgfSk7XG5cbiAgICBpdCgnU2hvdWxkIHJlY292ZXIgc2lnbmVkIEFkZFZhbGlkYXRvciBmcm9tIHNpZ25lZCByYXcgdHgnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RhdmF4cCcpKS5mcm9tKFxuICAgICAgICB0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy5mdWxsc2lnbnR4SGV4XG4gICAgICApO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHJhd1R4LnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy5mdWxsc2lnbnR4SGV4KTtcbiAgICB9KTtcblxuICAgIGl0KCdTaG91bGQgZnVsbCBzaWduIGEgQWRkVmFsaWRhdG9yIHR4IGZvciBzYW1lIHZhbHVlcycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGF2YXhwJykpXG4gICAgICAgIC5nZXRWYWxpZGF0b3JCdWlsZGVyKClcbiAgICAgICAgLnRocmVzaG9sZCh0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy50aHJlc2hvbGQpXG4gICAgICAgIC5sb2NrdGltZSh0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy5sb2NrdGltZSlcbiAgICAgICAgLmZyb21QdWJLZXkodGVzdERhdGEuQUREVkFMSURBVE9SX1NBTVBMRVMucEFkZHJlc3NlcylcbiAgICAgICAgLnN0YXJ0VGltZSh0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy5zdGFydFRpbWUpXG4gICAgICAgIC5lbmRUaW1lKHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLmVuZFRpbWUpXG4gICAgICAgIC5zdGFrZUFtb3VudCh0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy5taW5WYWxpZGF0b3JTdGFrZSlcbiAgICAgICAgLmRlbGVnYXRpb25GZWVSYXRlKHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLmRlbGVnYXRpb25GZWUpXG4gICAgICAgIC5ub2RlSUQodGVzdERhdGEuQUREVkFMSURBVE9SX1NBTVBMRVMubm9kZUlEKVxuICAgICAgICAudXR4b3ModGVzdERhdGEuQUREVkFMSURBVE9SX1NBTVBMRVMub3V0cHV0cyk7XG5cbiAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy5wcml2S2V5LnBydjEgfSk7XG4gICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEuQUREVkFMSURBVE9SX1NBTVBMRVMucHJpdktleS5wcnYyIH0pO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHJhd1R4LnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy5mdWxsc2lnbnR4SGV4KTtcbiAgICB9KTtcblxuICAgIGl0KCdTaG91bGQgZnVsbCBzaWduIGEgQWRkVmFsaWRhdG9yIHR4IGZyb20gaGFsZiBzaWduZWQgcmF3IHR4JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0YXZheHAnKSkuZnJvbShcbiAgICAgICAgdGVzdERhdGEuQUREVkFMSURBVE9SX1NBTVBMRVMuaGFsZnNpZ250eEhleFxuICAgICAgKTtcbiAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy5wcml2S2V5LnBydjIgfSk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgcmF3VHguc2hvdWxkLmVxdWFsKHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLmZ1bGxzaWdudHhIZXgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Nob3VsZCBmdWxsIHNpZ24gYSBBZGRWYWxpZGF0b3IgdHggZnJvbSB1bnNpZ25lZCByYXcgdHgnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RhdmF4cCcpKS5mcm9tKFxuICAgICAgICB0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy51bnNpZ25lZFR4SGV4XG4gICAgICApO1xuICAgICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLnByaXZLZXkucHJ2MSB9KTtcbiAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy5wcml2S2V5LnBydjIgfSk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgcmF3VHguc2hvdWxkLmVxdWFsKHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLmZ1bGxzaWdudHhIZXgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Nob3VsZCBmdWxsIHNpZ24gYSBBZGRWYWxpZGF0b3IgdHggd2l0aCByZWNvdmVyeSBrZXkgZm9yIHNhbWUgdmFsdWVzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0YXZheHAnKSlcbiAgICAgICAgLmdldFZhbGlkYXRvckJ1aWxkZXIoKVxuICAgICAgICAudGhyZXNob2xkKHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLnRocmVzaG9sZClcbiAgICAgICAgLmxvY2t0aW1lKHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLmxvY2t0aW1lKVxuICAgICAgICAuZnJvbVB1YktleSh0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy5wQWRkcmVzc2VzKVxuICAgICAgICAuc3RhcnRUaW1lKHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLnN0YXJ0VGltZSlcbiAgICAgICAgLmVuZFRpbWUodGVzdERhdGEuQUREVkFMSURBVE9SX1NBTVBMRVMuZW5kVGltZSlcbiAgICAgICAgLnN0YWtlQW1vdW50KHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLm1pblZhbGlkYXRvclN0YWtlKVxuICAgICAgICAuZGVsZWdhdGlvbkZlZVJhdGUodGVzdERhdGEuQUREVkFMSURBVE9SX1NBTVBMRVMuZGVsZWdhdGlvbkZlZSlcbiAgICAgICAgLm5vZGVJRCh0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy5ub2RlSUQpXG4gICAgICAgIC51dHhvcyh0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy5vdXRwdXRzKVxuICAgICAgICAucmVjb3Zlck1vZGUoKTtcblxuICAgICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLnByaXZLZXkucHJ2MyB9KTtcbiAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy5wcml2S2V5LnBydjIgfSk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgcmF3VHguc2hvdWxkLmVxdWFsKHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLnJlY292ZXJ5RnVsbHNpZ250eEhleFdpdGhvdXRNZW1vKTtcbiAgICB9KTtcblxuICAgIGl0KCdTaG91bGQgcmVjb3ZlciBoYWxmIHNpZ24gYSBBZGRWYWxpZGF0b3IgdHggd2l0aCByZWNvdmVyeSBrZXkgZnJvbSBoYWxmIHNpZ25lZCByYXcgdHgnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RhdmF4cCcpKS5mcm9tKFxuICAgICAgICB0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy5yZWNvdmVyeUhhbGZzaWdudHhIZXhcbiAgICAgICk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgcmF3VHguc2hvdWxkLmVxdWFsKHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLnJlY292ZXJ5SGFsZnNpZ250eEhleCk7XG4gICAgfSk7XG5cbiAgICBpdCgnU2hvdWxkIGZ1bGwgc2lnbiBhIEFkZFZhbGlkYXRvciB0eCB3aXRoIHJlY292ZXJ5IGtleSBmcm9tIGhhbGYgc2lnbmVkIHJhdyB0eCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGF2YXhwJykpLmZyb20oXG4gICAgICAgIHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLnJlY292ZXJ5SGFsZnNpZ250eEhleFxuICAgICAgKTtcbiAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy5wcml2S2V5LnBydjIgfSk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgcmF3VHguc2hvdWxkLmVxdWFsKHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLnJlY292ZXJ5RnVsbHNpZ250eEhleCk7XG4gICAgfSk7XG5cbiAgICBpdCgnU2hvdWxkIGZ1bGwgc2lnbiBhIEFkZFZhbGlkYXRvciB0eCB3aXRoIHJlY292ZXJ5IGtleSBmcm9tIHVuc2lnbmVkIHJhdyB0eCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGF2YXhwJykpLmZyb20oXG4gICAgICAgIHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLnJlY292ZXJ5VW5zaWduZWRUeEhleFxuICAgICAgKTtcbiAgICAgIC8vIHR4QnVpbGRlci5yZWNvdmVyTW9kZSgpXG4gICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEuQUREVkFMSURBVE9SX1NBTVBMRVMucHJpdktleS5wcnYzIH0pO1xuICAgICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLnByaXZLZXkucHJ2MiB9KTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICByYXdUeC5zaG91bGQuZXF1YWwodGVzdERhdGEuQUREVkFMSURBVE9SX1NBTVBMRVMucmVjb3ZlcnlGdWxsc2lnbnR4SGV4V2l0aE1lbW8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ0NvbXBhcmUgc2l6ZSBhbmQgbG9jYXRpb24gb2Ygc2lnbmF0dXJlcyBpbiBjcmVkZW50aWFscyBmb3IgaGFsZnNpZ24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RhdmF4cCcpKS5mcm9tKFxuICAgICAgICB0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy51bnNpZ25lZFR4SGV4XG4gICAgICApO1xuICAgICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLnByaXZLZXkucHJ2MSB9KTtcbiAgICAgIC8vIGxvb2sgaW50byBjcmVkZW50aWFscyBtYWtlIHN1cmUgdGhhdCBpbmRleCAwIGlzIHNpZ25lZCB3aXRoIHVzZXIga2V5XG4gICAgfSk7XG4gICAgaXQoJ0NvbXBhcmUgc2l6ZSBhbmQgbG9jYXRpb24gb2Ygc2lnbmF0dXJlcyBpbiBjcmVkZW50aWFscyBmb3IgZnVsbCBzaWduJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0YXZheHAnKSkuZnJvbShcbiAgICAgICAgdGVzdERhdGEuQUREVkFMSURBVE9SX1NBTVBMRVMudW5zaWduZWRUeEhleFxuICAgICAgKTtcbiAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy5wcml2S2V5LnBydjEgfSk7XG4gICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEuQUREVkFMSURBVE9SX1NBTVBMRVMucHJpdktleS5wcnYxIH0pO1xuICAgICAgLy8gbG9vayBpbnRvIGNyZWRlbnRpYWxzIG1ha2Ugc3VyZSB0aGF0IGluZGV4IDAgYW5kIDIgaXMgc2lnbmVkXG4gICAgfSk7XG4gIH0pO1xuICBkZXNjcmliZSgnS2V5IGNhbm5vdCBzaWduIHRoZSB0cmFuc2FjdGlvbiAnLCAoKSA9PiB7XG4gICAgaXQoJ1Nob3VsZCBmdWxsIHNpZ24gYSBBZGRWYWxpZGF0b3IgdHggZnJvbSB1bnNpZ25lZCByYXcgdHgnLCAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RhdmF4cCcpKS5mcm9tKFxuICAgICAgICB0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy51bnNpZ25lZFR4SGV4XG4gICAgICApO1xuICAgICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLnByaXZLZXkucHJ2MiB9KTtcbiAgICAgIHR4QnVpbGRlclxuICAgICAgICAuYnVpbGQoKVxuICAgICAgICAudGhlbigoKSA9PiBhc3NlcnQuZmFpbCgnaXQgY2FuIHNpZ24nKSlcbiAgICAgICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICBlcnIubWVzc2FnZS5zaG91bGQuYmUuZXF1YWwoZXJyb3JNZXNzYWdlLkVSUk9SX0tFWV9DQU5OT1RfU0lHTik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Nob3VsZCAyIGZ1bGwgc2lnbiBhIEFkZFZhbGlkYXRvciB0eCBmcm9tIHVuc2lnbmVkIHJhdyB0eCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGF2YXhwJykpLmZyb20oXG4gICAgICAgIHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLnJlY292ZXJ5VW5zaWduZWRUeEhleFxuICAgICAgKTtcbiAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy5wcml2S2V5LnBydjEgfSk7XG4gICAgICB0eEJ1aWxkZXJcbiAgICAgICAgLmJ1aWxkKClcbiAgICAgICAgLnRoZW4oKCkgPT4gYXNzZXJ0LmZhaWwoJ2l0IGNhbiBzaWduJykpXG4gICAgICAgIC5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgZXJyLm1lc3NhZ2Uuc2hvdWxkLmJlLmVxdWFsKGVycm9yTWVzc2FnZS5FUlJPUl9LRVlfQ0FOTk9UX1NJR04pO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIEhTTSBleHBlY3RlZCBlbXB0eSBjcmVkZW50aWFsLCB3ZSBjYW5ub3QgdmVyaWZ5IGlmIHRoZSBuZXh0IHNpZ25hdHVyZSBpcyB0aGUgY29ycmVjdC5cbiAgICBpdCgnU2hvdWxkIGZ1bGwgc2lnbiBhIEFkZFZhbGlkYXRvciB0eCBmcm9tIHVuc2lnbmVkIHJhdyB0eCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGF2YXhwJykpLmZyb20oXG4gICAgICAgIHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLmhhbGZzaWdudHhIZXhcbiAgICAgICk7XG4gICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEuQUREVkFMSURBVE9SX1NBTVBMRVMucHJpdktleS5wcnYyIH0pO1xuXG4gICAgICB0eEJ1aWxkZXJcbiAgICAgICAgLmJ1aWxkKClcbiAgICAgICAgLnRoZW4oKCkgPT4gYXNzZXJ0LmZhaWwoJ2l0IGNhbiBzaWduJykpXG4gICAgICAgIC5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgZXJyLm1lc3NhZ2Uuc2hvdWxkLmJlLmVxdWFsKGVycm9yTWVzc2FnZS5FUlJPUl9LRVlfQ0FOTk9UX1NJR04pO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIEhTTSBleHBlY3RlZCBlbXB0eSBjcmVkZW50aWFsLCB3ZSBjYW5ub3QgdmVyaWZ5IGlmIHRoZSBuZXh0IHNpZ25hdHVyZSBpcyB0aGUgY29ycmVjdC5cbiAgICBpdCgnU2hvdWxkIGZ1bGwgc2lnbiBhIEFkZFZhbGlkYXRvciB0eCBmcm9tIHVuc2lnbmVkIHJhdyB0eCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGF2YXhwJykpLmZyb20oXG4gICAgICAgIHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLnJlY292ZXJ5SGFsZnNpZ250eEhleFxuICAgICAgKTtcbiAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy5wcml2S2V5LnBydjEgfSk7XG4gICAgICB0eEJ1aWxkZXJcbiAgICAgICAgLmJ1aWxkKClcbiAgICAgICAgLnRoZW4oKCkgPT4gYXNzZXJ0LmZhaWwoJ2l0IGNhbiBzaWduJykpXG4gICAgICAgIC5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgZXJyLm1lc3NhZ2Uuc2hvdWxkLmJlLmVxdWFsKGVycm9yTWVzc2FnZS5FUlJPUl9LRVlfQ0FOTk9UX1NJR04pO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==