@bitgo-beta/sdk-coin-ada 2.3.14-beta.162 → 2.3.14-beta.1621

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 (113) hide show
  1. package/dist/src/ada.d.ts +15 -13
  2. package/dist/src/ada.d.ts.map +1 -1
  3. package/dist/src/ada.js +108 -32
  4. package/dist/src/adaToken.d.ts +16 -11
  5. package/dist/src/adaToken.d.ts.map +1 -1
  6. package/dist/src/adaToken.js +108 -3
  7. package/dist/src/index.js +6 -2
  8. package/dist/src/lib/index.d.ts +2 -0
  9. package/dist/src/lib/index.d.ts.map +1 -1
  10. package/dist/src/lib/index.js +29 -9
  11. package/dist/src/lib/keyPair.js +29 -16
  12. package/dist/src/lib/messages/cip8/cip8Message.d.ts +25 -0
  13. package/dist/src/lib/messages/cip8/cip8Message.d.ts.map +1 -0
  14. package/dist/src/lib/messages/cip8/cip8Message.js +140 -0
  15. package/dist/src/lib/messages/cip8/cip8MessageBuilder.d.ts +19 -0
  16. package/dist/src/lib/messages/cip8/cip8MessageBuilder.d.ts.map +1 -0
  17. package/dist/src/lib/messages/cip8/cip8MessageBuilder.js +27 -0
  18. package/dist/src/lib/messages/cip8/index.d.ts +4 -0
  19. package/dist/src/lib/messages/cip8/index.d.ts.map +1 -0
  20. package/dist/src/lib/messages/cip8/index.js +20 -0
  21. package/dist/src/lib/messages/cip8/utils.d.ts +24 -0
  22. package/dist/src/lib/messages/cip8/utils.d.ts.map +1 -0
  23. package/dist/src/lib/messages/cip8/utils.js +73 -0
  24. package/dist/src/lib/messages/index.d.ts +3 -0
  25. package/dist/src/lib/messages/index.d.ts.map +1 -0
  26. package/dist/src/lib/messages/index.js +19 -0
  27. package/dist/src/lib/messages/messageBuilderFactory.d.ts +7 -0
  28. package/dist/src/lib/messages/messageBuilderFactory.d.ts.map +1 -0
  29. package/dist/src/lib/messages/messageBuilderFactory.js +20 -0
  30. package/dist/src/lib/stakingActivateBuilder.d.ts +1 -1
  31. package/dist/src/lib/stakingActivateBuilder.d.ts.map +1 -1
  32. package/dist/src/lib/stakingActivateBuilder.js +30 -10
  33. package/dist/src/lib/stakingDeactivateBuilder.js +24 -10
  34. package/dist/src/lib/transaction.d.ts +13 -7
  35. package/dist/src/lib/transaction.d.ts.map +1 -1
  36. package/dist/src/lib/transaction.js +48 -16
  37. package/dist/src/lib/transactionBuilder.d.ts +82 -3
  38. package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
  39. package/dist/src/lib/transactionBuilder.js +429 -27
  40. package/dist/src/lib/transactionBuilderFactory.d.ts +2 -0
  41. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
  42. package/dist/src/lib/transactionBuilderFactory.js +7 -1
  43. package/dist/src/lib/utils.d.ts +23 -0
  44. package/dist/src/lib/utils.d.ts.map +1 -1
  45. package/dist/src/lib/utils.js +153 -17
  46. package/dist/src/lib/voteDelegationBuilder.d.ts +24 -0
  47. package/dist/src/lib/voteDelegationBuilder.d.ts.map +1 -0
  48. package/dist/src/lib/voteDelegationBuilder.js +84 -0
  49. package/dist/test/resources/cip8Resources.d.ts +25 -0
  50. package/dist/test/resources/cip8Resources.d.ts.map +1 -0
  51. package/dist/test/resources/cip8Resources.js +76 -0
  52. package/dist/test/resources/index.d.ts +458 -0
  53. package/dist/test/resources/index.d.ts.map +1 -0
  54. package/dist/test/resources/index.js +659 -0
  55. package/dist/test/unit/StakingActivateBuilder.d.ts +2 -0
  56. package/dist/test/unit/StakingActivateBuilder.d.ts.map +1 -0
  57. package/dist/test/unit/StakingActivateBuilder.js +213 -0
  58. package/dist/test/unit/StakingDeactivateBuilder.d.ts +2 -0
  59. package/dist/test/unit/StakingDeactivateBuilder.d.ts.map +1 -0
  60. package/dist/test/unit/StakingDeactivateBuilder.js +158 -0
  61. package/dist/test/unit/ada.d.ts +5 -0
  62. package/dist/test/unit/ada.d.ts.map +1 -0
  63. package/dist/test/unit/ada.js +1246 -0
  64. package/dist/test/unit/getBuilderFactory.d.ts +3 -0
  65. package/dist/test/unit/getBuilderFactory.d.ts.map +1 -0
  66. package/dist/test/unit/getBuilderFactory.js +10 -0
  67. package/dist/test/unit/index.d.ts +2 -0
  68. package/dist/test/unit/index.d.ts.map +1 -0
  69. package/dist/test/unit/index.js +32 -0
  70. package/dist/test/unit/keyPair.d.ts +2 -0
  71. package/dist/test/unit/keyPair.d.ts.map +1 -0
  72. package/dist/test/unit/keyPair.js +88 -0
  73. package/dist/test/unit/messages/cip8/cip8Message.d.ts +2 -0
  74. package/dist/test/unit/messages/cip8/cip8Message.d.ts.map +1 -0
  75. package/dist/test/unit/messages/cip8/cip8Message.js +131 -0
  76. package/dist/test/unit/messages/cip8/cip8MessageBuilder.d.ts +2 -0
  77. package/dist/test/unit/messages/cip8/cip8MessageBuilder.d.ts.map +1 -0
  78. package/dist/test/unit/messages/cip8/cip8MessageBuilder.js +132 -0
  79. package/dist/test/unit/messages/cip8/utils.d.ts +2 -0
  80. package/dist/test/unit/messages/cip8/utils.d.ts.map +1 -0
  81. package/dist/test/unit/messages/cip8/utils.js +127 -0
  82. package/dist/test/unit/messages/messageBuilderFactory.d.ts +2 -0
  83. package/dist/test/unit/messages/messageBuilderFactory.d.ts.map +1 -0
  84. package/dist/test/unit/messages/messageBuilderFactory.js +35 -0
  85. package/dist/test/unit/stakingClaimRewardsBuilder.d.ts +2 -0
  86. package/dist/test/unit/stakingClaimRewardsBuilder.d.ts.map +1 -0
  87. package/dist/test/unit/stakingClaimRewardsBuilder.js +70 -0
  88. package/dist/test/unit/stakingPledgeBuilder.d.ts +2 -0
  89. package/dist/test/unit/stakingPledgeBuilder.d.ts.map +1 -0
  90. package/dist/test/unit/stakingPledgeBuilder.js +141 -0
  91. package/dist/test/unit/stakingWithdrawBuilder.d.ts +2 -0
  92. package/dist/test/unit/stakingWithdrawBuilder.d.ts.map +1 -0
  93. package/dist/test/unit/stakingWithdrawBuilder.js +167 -0
  94. package/dist/test/unit/tokenWithdrawal.d.ts +2 -0
  95. package/dist/test/unit/tokenWithdrawal.d.ts.map +1 -0
  96. package/dist/test/unit/tokenWithdrawal.js +842 -0
  97. package/dist/test/unit/transaction.d.ts +2 -0
  98. package/dist/test/unit/transaction.d.ts.map +1 -0
  99. package/dist/test/unit/transaction.js +100 -0
  100. package/dist/test/unit/transactionBuilder.d.ts +2 -0
  101. package/dist/test/unit/transactionBuilder.d.ts.map +1 -0
  102. package/dist/test/unit/transactionBuilder.js +454 -0
  103. package/dist/test/unit/utils.d.ts +2 -0
  104. package/dist/test/unit/utils.d.ts.map +1 -0
  105. package/dist/test/unit/utils.js +138 -0
  106. package/dist/test/unit/voteDelegationBuilder.d.ts +2 -0
  107. package/dist/test/unit/voteDelegationBuilder.d.ts.map +1 -0
  108. package/dist/test/unit/voteDelegationBuilder.js +96 -0
  109. package/dist/tsconfig.tsbuildinfo +1 -0
  110. package/package.json +17 -12
  111. package/.eslintignore +0 -5
  112. package/.mocharc.yml +0 -8
  113. package/CHANGELOG.md +0 -353
@@ -0,0 +1,454 @@
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 should_1 = __importDefault(require("should"));
40
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
41
+ const testData = __importStar(require("../resources"));
42
+ const src_1 = require("../../src");
43
+ const statics_1 = require("@bitgo-beta/statics");
44
+ const CardanoWasm = __importStar(require("@emurgo/cardano-serialization-lib-nodejs"));
45
+ const transaction_1 = require("../../src/lib/transaction");
46
+ describe('ADA Transaction Builder', async () => {
47
+ const factory = new src_1.TransactionBuilderFactory(statics_1.coins.get('tada'));
48
+ it('start and build an unsigned transfer tx for byron address', async () => {
49
+ const txBuilder = factory.getTransferBuilder();
50
+ txBuilder.input({
51
+ transaction_id: '1b53331e069a6e58fe77919d30c0cf299d13a2f5b3d9970ce473c1a66d71bf03',
52
+ transaction_index: 1,
53
+ });
54
+ const outputAmount = 200000000;
55
+ txBuilder.output({
56
+ address: testData.rawTxByron.outputAddress1.address,
57
+ amount: outputAmount.toString(),
58
+ });
59
+ const totalInput = 999600000;
60
+ txBuilder.changeAddress(testData.rawTxByron.outputAddress2.address, totalInput.toString());
61
+ txBuilder.ttl(800000000);
62
+ // txBuilder.fee('200000');
63
+ const tx = (await txBuilder.build());
64
+ should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
65
+ const txData = tx.toJson();
66
+ txData.witnesses.length.should.equal(0);
67
+ txData.certs.length.should.equal(0);
68
+ txData.withdrawals.length.should.equal(0);
69
+ txData.outputs.length.should.equal(2);
70
+ txData.outputs[0].address.should.equal(testData.rawTxByron.outputAddress1.address);
71
+ txData.outputs[1].address.should.equal(testData.rawTxByron.outputAddress2.address);
72
+ const fee = tx.getFee;
73
+ txData.outputs[1].amount.should.equal((totalInput - outputAmount - Number(fee)).toString());
74
+ fee.should.equal('167437');
75
+ txData.id.should.equal(testData.rawTxByron.txHash2);
76
+ const txBroadcast = tx.toBroadcastFormat();
77
+ should_1.default.equal(txBroadcast, testData.rawTxByron.unsignedTx2);
78
+ });
79
+ it('start and build an unsigned transfer tx for shelley address', async () => {
80
+ const txBuilder = factory.getTransferBuilder();
81
+ txBuilder.input({
82
+ transaction_id: '3677e75c7ba699bfdc6cd57d42f246f86f63aefd76025006ac78313fad2bba21',
83
+ transaction_index: 1,
84
+ });
85
+ const outputAmount = 7823121;
86
+ txBuilder.output({
87
+ address: testData.rawTx.outputAddress1.address,
88
+ amount: outputAmount.toString(),
89
+ });
90
+ const totalInput = 21032023;
91
+ txBuilder.changeAddress(testData.rawTx.outputAddress2.address, totalInput.toString());
92
+ txBuilder.ttl(800000000);
93
+ const tx = (await txBuilder.build());
94
+ should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
95
+ const txData = tx.toJson();
96
+ txData.witnesses.length.should.equal(0);
97
+ txData.certs.length.should.equal(0);
98
+ txData.withdrawals.length.should.equal(0);
99
+ txData.outputs.length.should.equal(2);
100
+ txData.outputs[0].address.should.equal(testData.rawTx.outputAddress1.address);
101
+ txData.outputs[1].address.should.equal(testData.rawTx.outputAddress2.address);
102
+ const fee = tx.getFee;
103
+ txData.outputs[1].amount.should.equal((totalInput - outputAmount - Number(fee)).toString());
104
+ fee.should.equal('167173');
105
+ txData.id.should.equal(testData.rawTx.txHash2);
106
+ const txBroadcast = tx.toBroadcastFormat();
107
+ should_1.default.equal(txBroadcast, testData.rawTx.unsignedTx2);
108
+ });
109
+ it('should build a consolidate tx with no asset', async () => {
110
+ const txBuilder = factory.getTransferBuilder();
111
+ txBuilder.input({
112
+ transaction_id: '3677e75c7ba699bfdc6cd57d42f246f86f63aefd76025006ac78313fad2bba21',
113
+ transaction_index: 1,
114
+ });
115
+ const outputAmount = 0;
116
+ const totalInput = 20000000;
117
+ txBuilder.changeAddress(testData.rawTx.outputAddress1.address, totalInput.toString());
118
+ txBuilder.ttl(800000000);
119
+ const tx = (await txBuilder.build());
120
+ should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
121
+ const txData = tx.toJson();
122
+ txData.witnesses.length.should.equal(0);
123
+ txData.certs.length.should.equal(0);
124
+ txData.withdrawals.length.should.equal(0);
125
+ txData.outputs.length.should.equal(1);
126
+ txData.outputs[0].address.should.equal(testData.rawTx.outputAddress1.address);
127
+ const fee = tx.getFee;
128
+ txData.outputs[0].amount.should.equal((totalInput - outputAmount - Number(fee)).toString());
129
+ fee.should.equal('165545');
130
+ txData.id.should.equal(testData.rawTx.txHash5);
131
+ const txBroadcast = tx.toBroadcastFormat();
132
+ should_1.default.equal(txBroadcast, testData.rawTx.unsignedTx5);
133
+ });
134
+ it('should initialize and build tx with asset data', async () => {
135
+ const policyId = 'e16c2dc8ae937e8d3790c7fd7168d7b994621ba14ca11415f39fed72';
136
+ const assetName = '4d494e';
137
+ const quantity = '2000000';
138
+ const preBuiltTx = new transaction_1.Transaction(statics_1.coins.get('tada'));
139
+ preBuiltTx.fromRawTransaction(testData.rawTx.unsignedTx3);
140
+ const txBuilder = factory.getTransferBuilder();
141
+ txBuilder.initBuilder(preBuiltTx);
142
+ const tx = (await txBuilder.build());
143
+ const txData = tx.toJson();
144
+ const expectedAssetName = CardanoWasm.AssetName.new(Buffer.from(assetName, 'hex'));
145
+ const expectedPolicyId = CardanoWasm.ScriptHash.from_bytes(Buffer.from(policyId, 'hex'));
146
+ txData.outputs[0].should.have.property('multiAssets');
147
+ txData.outputs[0].multiAssets
148
+ .get_asset(expectedPolicyId, expectedAssetName)
149
+ .to_str()
150
+ .should.equal(quantity);
151
+ txData.id.should.equal(testData.rawTx.txHash3);
152
+ const txBroadcast = tx.toBroadcastFormat();
153
+ should_1.default.equal(txBroadcast, testData.rawTx.unsignedTx3);
154
+ });
155
+ it('should build a consolidate tx with single asset', async () => {
156
+ const txBuilder = factory.getTransferBuilder();
157
+ txBuilder.input({
158
+ transaction_id: '3677e75c7ba699bfdc6cd57d42f246f86f63aefd76025006ac78313fad2bba21',
159
+ transaction_index: 1,
160
+ });
161
+ const outputAmount = 0;
162
+ const policyId = 'e16c2dc8ae937e8d3790c7fd7168d7b994621ba14ca11415f39fed72';
163
+ const assetName = '4d494e';
164
+ const quantity = '2000000';
165
+ txBuilder.assets({
166
+ policy_id: policyId,
167
+ asset_name: assetName,
168
+ quantity: quantity,
169
+ });
170
+ const minAmountForSingleAsset = 1500000;
171
+ const totalInput = 20000000;
172
+ txBuilder.changeAddress(testData.rawTx.outputAddress1.address, totalInput.toString());
173
+ txBuilder.ttl(800000000);
174
+ const tx = (await txBuilder.build());
175
+ should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
176
+ const txData = tx.toJson();
177
+ txData.witnesses.length.should.equal(0);
178
+ txData.certs.length.should.equal(0);
179
+ txData.withdrawals.length.should.equal(0);
180
+ txData.outputs.length.should.equal(2);
181
+ txData.outputs[0].address.should.equal(testData.rawTx.outputAddress1.address);
182
+ txData.outputs[1].address.should.equal(testData.rawTx.outputAddress1.address);
183
+ // token assertion
184
+ const expectedAssetName = CardanoWasm.AssetName.new(Buffer.from(assetName, 'hex'));
185
+ const expectedPolicyId = CardanoWasm.ScriptHash.from_bytes(Buffer.from(policyId, 'hex'));
186
+ txData.outputs[0].amount.should.equal(minAmountForSingleAsset.toString());
187
+ txData.outputs[0].should.have.property('multiAssets');
188
+ txData.outputs[0].multiAssets
189
+ .get_asset(expectedPolicyId, expectedAssetName)
190
+ .to_str()
191
+ .should.equal(quantity);
192
+ const fee = tx.getFee;
193
+ txData.outputs[1].amount.should.equal((totalInput - minAmountForSingleAsset - outputAmount - Number(fee)).toString());
194
+ fee.should.equal('170253');
195
+ txData.id.should.equal(testData.rawTx.txHash3);
196
+ const txBroadcast = tx.toBroadcastFormat();
197
+ should_1.default.equal(txBroadcast, testData.rawTx.unsignedTx3);
198
+ });
199
+ it('should build a consolidate tx with multiple assets', async () => {
200
+ const txBuilder = factory.getTransferBuilder();
201
+ txBuilder.input({
202
+ transaction_id: '3677e75c7ba699bfdc6cd57d42f246f86f63aefd76025006ac78313fad2bba21',
203
+ transaction_index: 1,
204
+ });
205
+ const outputAmount = 0;
206
+ const asset1_policyId = '279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f';
207
+ const asset1_assetName = '534e454b';
208
+ const asset1_quantity = '6000000';
209
+ const asset2_policyId = '1f7a58a1aa1e6b047a42109ade331ce26c9c2cce027d043ff264fb1f';
210
+ const asset2_assetName = '425249434b53';
211
+ const asset2_quantity = '5000000';
212
+ txBuilder.assets({
213
+ policy_id: asset1_policyId,
214
+ asset_name: asset1_assetName,
215
+ quantity: asset1_quantity,
216
+ });
217
+ txBuilder.assets({
218
+ policy_id: asset2_policyId,
219
+ asset_name: asset2_assetName,
220
+ quantity: asset2_quantity,
221
+ });
222
+ const totalInput = 20000000;
223
+ const minAmountForSingleAsset = 1500000;
224
+ txBuilder.changeAddress(testData.rawTx.outputAddress1.address, totalInput.toString());
225
+ txBuilder.ttl(800000000);
226
+ const tx = (await txBuilder.build());
227
+ should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
228
+ const txData = tx.toJson();
229
+ txData.witnesses.length.should.equal(0);
230
+ txData.certs.length.should.equal(0);
231
+ txData.withdrawals.length.should.equal(0);
232
+ txData.outputs.length.should.equal(3);
233
+ txData.outputs[0].address.should.equal(testData.rawTx.outputAddress1.address);
234
+ txData.outputs[1].address.should.equal(testData.rawTx.outputAddress1.address);
235
+ txData.outputs[2].address.should.equal(testData.rawTx.outputAddress1.address);
236
+ // token assertion
237
+ const asset1_expectedAssetName = CardanoWasm.AssetName.new(Buffer.from(asset1_assetName, 'hex'));
238
+ const asset1_expectedPolicyId = CardanoWasm.ScriptHash.from_bytes(Buffer.from(asset1_policyId, 'hex'));
239
+ txData.outputs[0].amount.should.equal(minAmountForSingleAsset.toString());
240
+ txData.outputs[0].should.have.property('multiAssets');
241
+ txData.outputs[0].multiAssets
242
+ .get_asset(asset1_expectedPolicyId, asset1_expectedAssetName)
243
+ .to_str()
244
+ .should.equal(asset1_quantity);
245
+ const asset2_expectedAssetName = CardanoWasm.AssetName.new(Buffer.from(asset2_assetName, 'hex'));
246
+ const asset2_expectedPolicyId = CardanoWasm.ScriptHash.from_bytes(Buffer.from(asset2_policyId, 'hex'));
247
+ txData.outputs[1].amount.should.equal(minAmountForSingleAsset.toString());
248
+ txData.outputs[1].should.have.property('multiAssets');
249
+ txData.outputs[1].multiAssets
250
+ .get_asset(asset2_expectedPolicyId, asset2_expectedAssetName)
251
+ .to_str()
252
+ .should.equal(asset2_quantity);
253
+ const fee = tx.getFee;
254
+ txData.outputs[2].amount.should.equal((totalInput - minAmountForSingleAsset * 2 - outputAmount - Number(fee)).toString());
255
+ fee.should.equal('175137');
256
+ txData.id.should.equal(testData.rawTx.txHash4);
257
+ const txBroadcast = tx.toBroadcastFormat();
258
+ should_1.default.equal(txBroadcast, testData.rawTx.unsignedTx4);
259
+ });
260
+ it('should fail to build a consolidate tx with single asset and insufficient minimum ADA', async () => {
261
+ const txBuilder = factory.getTransferBuilder();
262
+ txBuilder.input({
263
+ transaction_id: '3677e75c7ba699bfdc6cd57d42f246f86f63aefd76025006ac78313fad2bba21',
264
+ transaction_index: 1,
265
+ });
266
+ const policyId = '279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f';
267
+ const assetName = '534e454b';
268
+ const quantity = '6000000';
269
+ txBuilder.assets({
270
+ policy_id: policyId,
271
+ asset_name: assetName,
272
+ quantity: quantity,
273
+ });
274
+ // change = input amt - fee - output amt => change will be less than 1000000
275
+ // even if one output has less than 1 ADA, tx will fail
276
+ const totalInput = 1000000;
277
+ txBuilder.changeAddress(testData.rawTx.outputAddress1.address, totalInput.toString());
278
+ txBuilder.ttl(800000000);
279
+ await txBuilder
280
+ .build()
281
+ .should.rejectedWith('Insufficient funds: need a minimum of 1.5 ADA per output to construct token consolidation');
282
+ });
283
+ it('build and sign a transfer tx', async () => {
284
+ const txBuilder = factory.getTransferBuilder();
285
+ txBuilder.input({
286
+ transaction_id: '3677e75c7ba699bfdc6cd57d42f246f86f63aefd76025006ac78313fad2bba21',
287
+ transaction_index: 1,
288
+ });
289
+ const outputAmount = 7823121;
290
+ txBuilder.output({
291
+ address: testData.rawTx.outputAddress1.address,
292
+ amount: outputAmount.toString(),
293
+ });
294
+ const totalInput = 21032023;
295
+ txBuilder.changeAddress(testData.rawTx.outputAddress2.address, totalInput.toString());
296
+ txBuilder.ttl(800000000);
297
+ txBuilder.sign({ key: testData.privateKeys.prvKey4 });
298
+ const tx = (await txBuilder.build());
299
+ should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
300
+ const txData = tx.toJson();
301
+ txData.witnesses.length.should.equal(1);
302
+ txData.certs.length.should.equal(0);
303
+ txData.withdrawals.length.should.equal(0);
304
+ txData.outputs.length.should.equal(2);
305
+ txData.outputs[0].address.should.equal(testData.rawTx.outputAddress1.address);
306
+ txData.outputs[1].address.should.equal(testData.rawTx.outputAddress2.address);
307
+ const fee = tx.getFee;
308
+ txData.outputs[1].amount.should.equal((totalInput - outputAmount - Number(fee)).toString());
309
+ fee.should.equal('167173');
310
+ txData.id.should.equal(testData.rawTx.txHash2);
311
+ const txBroadcast = tx.toBroadcastFormat();
312
+ should_1.default.equal(txBroadcast, testData.rawTx.signedTx2);
313
+ });
314
+ it('should initialize a fee properly, not as zero', async () => {
315
+ const txBuilder = factory.getTransferBuilder();
316
+ txBuilder.input({
317
+ transaction_id: '3677e75c7ba699bfdc6cd57d42f246f86f63aefd76025006ac78313fad2bba21',
318
+ transaction_index: 1,
319
+ });
320
+ txBuilder.output({
321
+ address: 'addr1q8rm9z7w4yx5gz652kn2q238efvms6t0qelur9nlglun8eu4tr5knj4fu4adelzqhxg8adu5xca4jra0gtllfrpcawyq9psz23',
322
+ amount: '7328383',
323
+ });
324
+ txBuilder.changeAddress(testData.address.address2, '1000000000');
325
+ txBuilder.ttl(800000000);
326
+ txBuilder.sign({ key: testData.privateKeys.prvKey4 });
327
+ const builtTx = (await txBuilder.build());
328
+ builtTx.getFee.should.equal('168405');
329
+ });
330
+ it('should not calculate fee and use one passed in', async () => {
331
+ const txBuilder = factory.getTransferBuilder();
332
+ txBuilder.input({
333
+ transaction_id: '3677e75c7ba699bfdc6cd57d42f246f86f63aefd76025006ac78313fad2bba21',
334
+ transaction_index: 1,
335
+ });
336
+ txBuilder.output({
337
+ address: 'addr1q8rm9z7w4yx5gz652kn2q238efvms6t0qelur9nlglun8eu4tr5knj4fu4adelzqhxg8adu5xca4jra0gtllfrpcawyq9psz23',
338
+ amount: '7328383',
339
+ });
340
+ txBuilder.changeAddress(testData.address.address2, '1000000000');
341
+ txBuilder.ttl(800000000);
342
+ txBuilder.fee('170000');
343
+ txBuilder.sign({ key: testData.privateKeys.prvKey4 });
344
+ const builtTx = (await txBuilder.build());
345
+ builtTx.getFee.should.equal('170000');
346
+ });
347
+ it('build a send from unsigned rawTx', async () => {
348
+ const txBuilder = factory.from(testData.rawTx.unsignedTx2);
349
+ const builtTx = await txBuilder.build();
350
+ should_1.default.equal(builtTx.type, sdk_core_1.TransactionType.Send);
351
+ should_1.default.equal(builtTx.id, testData.rawTx.txHash2);
352
+ builtTx.outputs.length.should.equal(2);
353
+ builtTx.outputs[0].address.should.equal(testData.rawTx.outputAddress1.address);
354
+ builtTx.outputs[1].address.should.equal(testData.rawTx.outputAddress2.address);
355
+ });
356
+ it('match signature', async () => {
357
+ const txRaw = '582070081eeb1f312ec75af1b4f94a7963db3b264f2451369e4ea244a54de5d0';
358
+ const keyPair = new src_1.KeyPair();
359
+ const pkey = CardanoWasm.PrivateKey.from_normal_bytes(Buffer.from(keyPair.getKeys().prv, 'hex'));
360
+ const vkeyw = CardanoWasm.make_vkey_witness(CardanoWasm.TransactionHash.from_bytes(Buffer.from(txRaw, 'hex')), pkey);
361
+ const sig1 = vkeyw.signature().to_hex();
362
+ const sig2 = Buffer.from(keyPair.signMessage(txRaw)).toString('hex');
363
+ should_1.default.equal(sig1, sig2);
364
+ });
365
+ // NOTE: The tests below have been commented out as they are for testing during development changes. We don't
366
+ // want full node tests as part of our sdk unit tests. If you are commenting these back in, add axios and
367
+ // AddressFormat imports.
368
+ // xit('should submit a transaction', async () => {
369
+ // const keyPair = new KeyPair({ prv: testData.privateKeys.prvKey4 });
370
+ // const senderAddress = keyPair.getAddress(AddressFormat.testnet);
371
+ //
372
+ // const axiosConfig = {
373
+ // headers: {
374
+ // 'Content-Type': 'application/cbor',
375
+ // },
376
+ // timeout: 10000,
377
+ // };
378
+ //
379
+ // const txBuilder = factory.getTransferBuilder();
380
+ // const utxoData = await axios.get('https://testnet.koios.rest/api/v0/address_info?_address=' + senderAddress);
381
+ // const senderBalance = utxoData.data[0].balance;
382
+ // txBuilder.changeAddress(senderAddress, senderBalance);
383
+ // const utxoSet = utxoData.data[0].utxo_set;
384
+ // for (const utxo of utxoSet) {
385
+ // txBuilder.input({ transaction_id: utxo.tx_hash, transaction_index: utxo.tx_index });
386
+ // }
387
+ //
388
+ // txBuilder.output({
389
+ // address:
390
+ // 'addr_test1qz2fxv2umyhttkxyxp8x0dlpdt3k6cwng5pxj3jhsydzer3jcu5d8ps7zex2k2xt3uqxgjqnnj83ws8lhrn648jjxtwq2ytjqp',
391
+ // amount: '5000000',
392
+ // });
393
+ //
394
+ // txBuilder.ttl(800000000);
395
+ // txBuilder.sign({ key: keyPair.getKeys().prv });
396
+ //
397
+ // const tx = await txBuilder.build();
398
+ // const serializedTx = tx.toBroadcastFormat();
399
+ // const bytes = Uint8Array.from(Buffer.from(serializedTx, 'hex'));
400
+ //
401
+ // try {
402
+ // const res = await axios.post('https://testnet.koios.rest/api/v0/submittx', bytes, axiosConfig);
403
+ // console.log(res.data);
404
+ // } catch (err) {
405
+ // console.log(err);
406
+ // }
407
+ // });
408
+ //
409
+ // xit('should submit a transaction using signature interface', async () => {
410
+ // const keyPair = new KeyPair({ prv: testData.privateKeys.prvKey4 });
411
+ // const senderAddress = keyPair.getAddress(AddressFormat.testnet);
412
+ // const axiosConfig = {
413
+ // headers: {
414
+ // 'Content-Type': 'application/cbor',
415
+ // },
416
+ // timeout: 10000,
417
+ // };
418
+ // const txBuilder = factory.getTransferBuilder();
419
+ // const utxoData = await await axios.get('https://testnet.koios.rest/api/v0/address_info?_address=' + senderAddress);
420
+ // const senderBalance = utxoData.data[0].balance;
421
+ // txBuilder.changeAddress(senderAddress, senderBalance);
422
+ // const utxoSet = utxoData.data[0].utxo_set;
423
+ // for (const utxo of utxoSet) {
424
+ // txBuilder.input({ transaction_id: utxo.tx_hash, transaction_index: utxo.tx_index });
425
+ // }
426
+ // txBuilder.output({
427
+ // address:
428
+ // 'addr_test1qz2fxv2umyhttkxyxp8x0dlpdt3k6cwng5pxj3jhsydzer3jcu5d8ps7zex2k2xt3uqxgjqnnj83ws8lhrn648jjxtwq2ytjqp',
429
+ // amount: '5000000',
430
+ // });
431
+ //
432
+ // txBuilder.ttl(800000000);
433
+ //
434
+ // const unsignedTx = await txBuilder.build();
435
+ // const serializedTx = unsignedTx.toBroadcastFormat();
436
+ //
437
+ // const txBuilder2 = factory.from(serializedTx);
438
+ // const tx = await txBuilder2.build();
439
+ // const signableHex = tx.signablePayload.toString('hex');
440
+ // const signature = keyPair.signMessage(signableHex);
441
+ // txBuilder2.addSignature({ pub: keyPair.getKeys().pub }, Buffer.from(signature));
442
+ // const signedTransaction = await txBuilder2.build();
443
+ // const serializedTransaction = signedTransaction.toBroadcastFormat();
444
+ // const bytes = Uint8Array.from(Buffer.from(serializedTransaction, 'hex'));
445
+ //
446
+ // try {
447
+ // const res = await axios.post('https://testnet.koios.rest/api/v0/submittx', bytes, axiosConfig);
448
+ // console.log(res.data);
449
+ // } catch (err) {
450
+ // console.log(err);
451
+ // }
452
+ // });
453
+ });
454
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdGVzdC91bml0L3RyYW5zYWN0aW9uQnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG9EQUE0QjtBQUM1QixtREFBdUQ7QUFDdkQsdURBQXlDO0FBQ3pDLG1DQUErRDtBQUMvRCxpREFBNEM7QUFDNUMsc0ZBQXdFO0FBQ3hFLDJEQUF3RDtBQUV4RCxRQUFRLENBQUMseUJBQXlCLEVBQUUsS0FBSyxJQUFJLEVBQUU7SUFDN0MsTUFBTSxPQUFPLEdBQUcsSUFBSSwrQkFBeUIsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDakUsRUFBRSxDQUFDLDJEQUEyRCxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ3pFLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQy9DLFNBQVMsQ0FBQyxLQUFLLENBQUM7WUFDZCxjQUFjLEVBQUUsa0VBQWtFO1lBQ2xGLGlCQUFpQixFQUFFLENBQUM7U0FDckIsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxZQUFZLEdBQUcsU0FBUyxDQUFDO1FBQy9CLFNBQVMsQ0FBQyxNQUFNLENBQUM7WUFDZixPQUFPLEVBQUUsUUFBUSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsT0FBTztZQUNuRCxNQUFNLEVBQUUsWUFBWSxDQUFDLFFBQVEsRUFBRTtTQUNoQyxDQUFDLENBQUM7UUFDSCxNQUFNLFVBQVUsR0FBRyxTQUFTLENBQUM7UUFDN0IsU0FBUyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDM0YsU0FBUyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN6QiwyQkFB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SUFDeEMsaURBQWlEO0lBQ2pELHFFQUFxRTtJQUNyRSxFQUFFO0lBQ0YsVUFBVTtJQUNWLHNHQUFzRztJQUN0Ryw2QkFBNkI7SUFDN0Isb0JBQW9CO0lBQ3BCLHdCQUF3QjtJQUN4QixNQUFNO0lBQ04sTUFBTTtJQUNOLEVBQUU7SUFDRiw2RUFBNkU7SUFDN0Usd0VBQXdFO0lBQ3hFLHFFQUFxRTtJQUNyRSwwQkFBMEI7SUFDMUIsaUJBQWlCO0lBQ2pCLDRDQUE0QztJQUM1QyxTQUFTO0lBQ1Qsc0JBQXNCO0lBQ3RCLE9BQU87SUFDUCxvREFBb0Q7SUFDcEQsd0hBQXdIO0lBQ3hILG9EQUFvRDtJQUNwRCwyREFBMkQ7SUFDM0QsK0NBQStDO0lBQy9DLGtDQUFrQztJQUNsQywyRkFBMkY7SUFDM0YsTUFBTTtJQUNOLHVCQUF1QjtJQUN2QixlQUFlO0lBQ2Ysd0hBQXdIO0lBQ3hILHlCQUF5QjtJQUN6QixRQUFRO0lBQ1IsRUFBRTtJQUNGLDhCQUE4QjtJQUM5QixFQUFFO0lBQ0YsZ0RBQWdEO0lBQ2hELHlEQUF5RDtJQUN6RCxFQUFFO0lBQ0YsbURBQW1EO0lBQ25ELHlDQUF5QztJQUN6Qyw0REFBNEQ7SUFDNUQsd0RBQXdEO0lBQ3hELHFGQUFxRjtJQUNyRix3REFBd0Q7SUFDeEQseUVBQXlFO0lBQ3pFLDhFQUE4RTtJQUM5RSxFQUFFO0lBQ0YsVUFBVTtJQUNWLHNHQUFzRztJQUN0Ryw2QkFBNkI7SUFDN0Isb0JBQW9CO0lBQ3BCLHdCQUF3QjtJQUN4QixNQUFNO0lBQ04sTUFBTTtBQUNSLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHNob3VsZCBmcm9tICdzaG91bGQnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0ICogYXMgdGVzdERhdGEgZnJvbSAnLi4vcmVzb3VyY2VzJztcbmltcG9ydCB7IEtleVBhaXIsIFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkgfSBmcm9tICcuLi8uLi9zcmMnO1xuaW1wb3J0IHsgY29pbnMgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCAqIGFzIENhcmRhbm9XYXNtIGZyb20gJ0BlbXVyZ28vY2FyZGFuby1zZXJpYWxpemF0aW9uLWxpYi1ub2RlanMnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb24gfSBmcm9tICcuLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uJztcblxuZGVzY3JpYmUoJ0FEQSBUcmFuc2FjdGlvbiBCdWlsZGVyJywgYXN5bmMgKCkgPT4ge1xuICBjb25zdCBmYWN0b3J5ID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0YWRhJykpO1xuICBpdCgnc3RhcnQgYW5kIGJ1aWxkIGFuIHVuc2lnbmVkIHRyYW5zZmVyIHR4IGZvciBieXJvbiBhZGRyZXNzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgdHhCdWlsZGVyLmlucHV0KHtcbiAgICAgIHRyYW5zYWN0aW9uX2lkOiAnMWI1MzMzMWUwNjlhNmU1OGZlNzc5MTlkMzBjMGNmMjk5ZDEzYTJmNWIzZDk5NzBjZTQ3M2MxYTY2ZDcxYmYwMycsXG4gICAgICB0cmFuc2FjdGlvbl9pbmRleDogMSxcbiAgICB9KTtcbiAgICBjb25zdCBvdXRwdXRBbW91bnQgPSAyMDAwMDAwMDA7XG4gICAgdHhCdWlsZGVyLm91dHB1dCh7XG4gICAgICBhZGRyZXNzOiB0ZXN0RGF0YS5yYXdUeEJ5cm9uLm91dHB1dEFkZHJlc3MxLmFkZHJlc3MsXG4gICAgICBhbW91bnQ6IG91dHB1dEFtb3VudC50b1N0cmluZygpLFxuICAgIH0pO1xuICAgIGNvbnN0IHRvdGFsSW5wdXQgPSA5OTk2MDAwMDA7XG4gICAgdHhCdWlsZGVyLmNoYW5nZUFkZHJlc3ModGVzdERhdGEucmF3VHhCeXJvbi5vdXRwdXRBZGRyZXNzMi5hZGRyZXNzLCB0b3RhbElucHV0LnRvU3RyaW5nKCkpO1xuICAgIHR4QnVpbGRlci50dGwoODAwMDAwMDAwKTtcbiAgICAvLyB0eEJ1aWxkZXIuZmVlKCcyMDAwMDAnKTtcbiAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcbiAgICBjb25zdCB0eERhdGEgPSB0eC50b0pzb24oKTtcbiAgICB0eERhdGEud2l0bmVzc2VzLmxlbmd0aC5zaG91bGQuZXF1YWwoMCk7XG4gICAgdHhEYXRhLmNlcnRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMCk7XG4gICAgdHhEYXRhLndpdGhkcmF3YWxzLmxlbmd0aC5zaG91bGQuZXF1YWwoMCk7XG4gICAgdHhEYXRhLm91dHB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgyKTtcbiAgICB0eERhdGEub3V0cHV0c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5yYXdUeEJ5cm9uLm91dHB1dEFkZHJlc3MxLmFkZHJlc3MpO1xuICAgIHR4RGF0YS5vdXRwdXRzWzFdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKHRlc3REYXRhLnJhd1R4Qnlyb24ub3V0cHV0QWRkcmVzczIuYWRkcmVzcyk7XG4gICAgY29uc3QgZmVlID0gdHguZ2V0RmVlO1xuICAgIHR4RGF0YS5vdXRwdXRzWzFdLmFtb3VudC5zaG91bGQuZXF1YWwoKHRvdGFsSW5wdXQgLSBvdXRwdXRBbW91bnQgLSBOdW1iZXIoZmVlKSkudG9TdHJpbmcoKSk7XG4gICAgZmVlLnNob3VsZC5lcXVhbCgnMTY3NDM3Jyk7XG4gICAgdHhEYXRhLmlkLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5yYXdUeEJ5cm9uLnR4SGFzaDIpO1xuICAgIGNvbnN0IHR4QnJvYWRjYXN0ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICBzaG91bGQuZXF1YWwodHhCcm9hZGNhc3QsIHRlc3REYXRhLnJhd1R4Qnlyb24udW5zaWduZWRUeDIpO1xuICB9KTtcblxuICBpdCgnc3RhcnQgYW5kIGJ1aWxkIGFuIHVuc2lnbmVkIHRyYW5zZmVyIHR4IGZvciBzaGVsbGV5IGFkZHJlc3MnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICB0eEJ1aWxkZXIuaW5wdXQoe1xuICAgICAgdHJhbnNhY3Rpb25faWQ6ICczNjc3ZTc1YzdiYTY5OWJmZGM2Y2Q1N2Q0MmYyNDZmODZmNjNhZWZkNzYwMjUwMDZhYzc4MzEzZmFkMmJiYTIxJyxcbiAgICAgIHRyYW5zYWN0aW9uX2luZGV4OiAxLFxuICAgIH0pO1xuICAgIGNvbnN0IG91dHB1dEFtb3VudCA9IDc4MjMxMjE7XG4gICAgdHhCdWlsZGVyLm91dHB1dCh7XG4gICAgICBhZGRyZXNzOiB0ZXN0RGF0YS5yYXdUeC5vdXRwdXRBZGRyZXNzMS5hZGRyZXNzLFxuICAgICAgYW1vdW50OiBvdXRwdXRBbW91bnQudG9TdHJpbmcoKSxcbiAgICB9KTtcbiAgICBjb25zdCB0b3RhbElucHV0ID0gMjEwMzIwMjM7XG4gICAgdHhCdWlsZGVyLmNoYW5nZUFkZHJlc3ModGVzdERhdGEucmF3VHgub3V0cHV0QWRkcmVzczIuYWRkcmVzcywgdG90YWxJbnB1dC50b1N0cmluZygpKTtcbiAgICB0eEJ1aWxkZXIudHRsKDgwMDAwMDAwMCk7XG4gICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgY29uc3QgdHhEYXRhID0gdHgudG9Kc29uKCk7XG4gICAgdHhEYXRhLndpdG5lc3Nlcy5sZW5ndGguc2hvdWxkLmVxdWFsKDApO1xuICAgIHR4RGF0YS5jZXJ0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDApO1xuICAgIHR4RGF0YS53aXRoZHJhd2Fscy5sZW5ndGguc2hvdWxkLmVxdWFsKDApO1xuICAgIHR4RGF0YS5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMik7XG4gICAgdHhEYXRhLm91dHB1dHNbMF0uYWRkcmVzcy5zaG91bGQuZXF1YWwodGVzdERhdGEucmF3VHgub3V0cHV0QWRkcmVzczEuYWRkcmVzcyk7XG4gICAgdHhEYXRhLm91dHB1dHNbMV0uYWRkcmVzcy5zaG91bGQuZXF1YWwodGVzdERhdGEucmF3VHgub3V0cHV0QWRkcmVzczIuYWRkcmVzcyk7XG4gICAgY29uc3QgZmVlID0gdHguZ2V0RmVlO1xuICAgIHR4RGF0YS5vdXRwdXRzWzFdLmFtb3VudC5zaG91bGQuZXF1YWwoKHRvdGFsSW5wdXQgLSBvdXRwdXRBbW91bnQgLSBOdW1iZXIoZmVlKSkudG9TdHJpbmcoKSk7XG4gICAgZmVlLnNob3VsZC5lcXVhbCgnMTY3MTczJyk7XG4gICAgdHhEYXRhLmlkLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5yYXdUeC50eEhhc2gyKTtcbiAgICBjb25zdCB0eEJyb2FkY2FzdCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgc2hvdWxkLmVxdWFsKHR4QnJvYWRjYXN0LCB0ZXN0RGF0YS5yYXdUeC51bnNpZ25lZFR4Mik7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgYnVpbGQgYSBjb25zb2xpZGF0ZSB0eCB3aXRoIG5vIGFzc2V0JywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgdHhCdWlsZGVyLmlucHV0KHtcbiAgICAgIHRyYW5zYWN0aW9uX2lkOiAnMzY3N2U3NWM3YmE2OTliZmRjNmNkNTdkNDJmMjQ2Zjg2ZjYzYWVmZDc2MDI1MDA2YWM3ODMxM2ZhZDJiYmEyMScsXG4gICAgICB0cmFuc2FjdGlvbl9pbmRleDogMSxcbiAgICB9KTtcblxuICAgIGNvbnN0IG91dHB1dEFtb3VudCA9IDA7XG4gICAgY29uc3QgdG90YWxJbnB1dCA9IDIwMDAwMDAwO1xuICAgIHR4QnVpbGRlci5jaGFuZ2VBZGRyZXNzKHRlc3REYXRhLnJhd1R4Lm91dHB1dEFkZHJlc3MxLmFkZHJlc3MsIHRvdGFsSW5wdXQudG9TdHJpbmcoKSk7XG4gICAgdHhCdWlsZGVyLnR0bCg4MDAwMDAwMDApO1xuICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2FjdGlvbjtcbiAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuICAgIGNvbnN0IHR4RGF0YSA9IHR4LnRvSnNvbigpO1xuICAgIHR4RGF0YS53aXRuZXNzZXMubGVuZ3RoLnNob3VsZC5lcXVhbCgwKTtcbiAgICB0eERhdGEuY2VydHMubGVuZ3RoLnNob3VsZC5lcXVhbCgwKTtcbiAgICB0eERhdGEud2l0aGRyYXdhbHMubGVuZ3RoLnNob3VsZC5lcXVhbCgwKTtcbiAgICB0eERhdGEub3V0cHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgIHR4RGF0YS5vdXRwdXRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKHRlc3REYXRhLnJhd1R4Lm91dHB1dEFkZHJlc3MxLmFkZHJlc3MpO1xuICAgIGNvbnN0IGZlZSA9IHR4LmdldEZlZTtcbiAgICB0eERhdGEub3V0cHV0c1swXS5hbW91bnQuc2hvdWxkLmVxdWFsKCh0b3RhbElucHV0IC0gb3V0cHV0QW1vdW50IC0gTnVtYmVyKGZlZSkpLnRvU3RyaW5nKCkpO1xuICAgIGZlZS5zaG91bGQuZXF1YWwoJzE2NTU0NScpO1xuICAgIHR4RGF0YS5pZC5zaG91bGQuZXF1YWwodGVzdERhdGEucmF3VHgudHhIYXNoNSk7XG4gICAgY29uc3QgdHhCcm9hZGNhc3QgPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgIHNob3VsZC5lcXVhbCh0eEJyb2FkY2FzdCwgdGVzdERhdGEucmF3VHgudW5zaWduZWRUeDUpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGluaXRpYWxpemUgYW5kIGJ1aWxkIHR4IHdpdGggYXNzZXQgZGF0YScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBwb2xpY3lJZCA9ICdlMTZjMmRjOGFlOTM3ZThkMzc5MGM3ZmQ3MTY4ZDdiOTk0NjIxYmExNGNhMTE0MTVmMzlmZWQ3Mic7XG4gICAgY29uc3QgYXNzZXROYW1lID0gJzRkNDk0ZSc7XG4gICAgY29uc3QgcXVhbnRpdHkgPSAnMjAwMDAwMCc7XG4gICAgY29uc3QgcHJlQnVpbHRUeCA9IG5ldyBUcmFuc2FjdGlvbihjb2lucy5nZXQoJ3RhZGEnKSk7XG4gICAgcHJlQnVpbHRUeC5mcm9tUmF3VHJhbnNhY3Rpb24odGVzdERhdGEucmF3VHgudW5zaWduZWRUeDMpO1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgdHhCdWlsZGVyLmluaXRCdWlsZGVyKHByZUJ1aWx0VHgpO1xuXG4gICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuICAgIGNvbnN0IHR4RGF0YSA9IHR4LnRvSnNvbigpO1xuICAgIGNvbnN0IGV4cGVjdGVkQXNzZXROYW1lID0gQ2FyZGFub1dhc20uQXNzZXROYW1lLm5ldyhCdWZmZXIuZnJvbShhc3NldE5hbWUsICdoZXgnKSk7XG4gICAgY29uc3QgZXhwZWN0ZWRQb2xpY3lJZCA9IENhcmRhbm9XYXNtLlNjcmlwdEhhc2guZnJvbV9ieXRlcyhCdWZmZXIuZnJvbShwb2xpY3lJZCwgJ2hleCcpKTtcbiAgICB0eERhdGEub3V0cHV0c1swXS5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnbXVsdGlBc3NldHMnKTtcbiAgICAodHhEYXRhLm91dHB1dHNbMF0ubXVsdGlBc3NldHMgYXMgQ2FyZGFub1dhc20uTXVsdGlBc3NldClcbiAgICAgIC5nZXRfYXNzZXQoZXhwZWN0ZWRQb2xpY3lJZCwgZXhwZWN0ZWRBc3NldE5hbWUpXG4gICAgICAudG9fc3RyKClcbiAgICAgIC5zaG91bGQuZXF1YWwocXVhbnRpdHkpO1xuICAgIHR4RGF0YS5pZC5zaG91bGQuZXF1YWwodGVzdERhdGEucmF3VHgudHhIYXNoMyk7XG4gICAgY29uc3QgdHhCcm9hZGNhc3QgPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgIHNob3VsZC5lcXVhbCh0eEJyb2FkY2FzdCwgdGVzdERhdGEucmF3VHgudW5zaWduZWRUeDMpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGJ1aWxkIGEgY29uc29saWRhdGUgdHggd2l0aCBzaW5nbGUgYXNzZXQnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICB0eEJ1aWxkZXIuaW5wdXQoe1xuICAgICAgdHJhbnNhY3Rpb25faWQ6ICczNjc3ZTc1YzdiYTY5OWJmZGM2Y2Q1N2Q0MmYyNDZmODZmNjNhZWZkNzYwMjUwMDZhYzc4MzEzZmFkMmJiYTIxJyxcbiAgICAgIHRyYW5zYWN0aW9uX2luZGV4OiAxLFxuICAgIH0pO1xuXG4gICAgY29uc3Qgb3V0cHV0QW1vdW50ID0gMDtcbiAgICBjb25zdCBwb2xpY3lJZCA9ICdlMTZjMmRjOGFlOTM3ZThkMzc5MGM3ZmQ3MTY4ZDdiOTk0NjIxYmExNGNhMTE0MTVmMzlmZWQ3Mic7XG4gICAgY29uc3QgYXNzZXROYW1lID0gJzRkNDk0ZSc7XG4gICAgY29uc3QgcXVhbnRpdHkgPSAnMjAwMDAwMCc7XG4gICAgdHhCdWlsZGVyLmFzc2V0cyh7XG4gICAgICBwb2xpY3lfaWQ6IHBvbGljeUlkLFxuICAgICAgYXNzZXRfbmFtZTogYXNzZXROYW1lLFxuICAgICAgcXVhbnRpdHk6IHF1YW50aXR5LFxuICAgIH0pO1xuICAgIGNvbnN0IG1pbkFtb3VudEZvclNpbmdsZUFzc2V0ID0gMTUwMDAwMDtcbiAgICBjb25zdCB0b3RhbElucHV0ID0gMjAwMDAwMDA7XG4gICAgdHhCdWlsZGVyLmNoYW5nZUFkZHJlc3ModGVzdERhdGEucmF3VHgub3V0cHV0QWRkcmVzczEuYWRkcmVzcywgdG90YWxJbnB1dC50b1N0cmluZygpKTtcbiAgICB0eEJ1aWxkZXIudHRsKDgwMDAwMDAwMCk7XG4gICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgY29uc3QgdHhEYXRhID0gdHgudG9Kc29uKCk7XG4gICAgdHhEYXRhLndpdG5lc3Nlcy5sZW5ndGguc2hvdWxkLmVxdWFsKDApO1xuICAgIHR4RGF0YS5jZXJ0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDApO1xuICAgIHR4RGF0YS53aXRoZHJhd2Fscy5sZW5ndGguc2hvdWxkLmVxdWFsKDApO1xuICAgIHR4RGF0YS5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMik7XG4gICAgdHhEYXRhLm91dHB1dHNbMF0uYWRkcmVzcy5zaG91bGQuZXF1YWwodGVzdERhdGEucmF3VHgub3V0cHV0QWRkcmVzczEuYWRkcmVzcyk7XG4gICAgdHhEYXRhLm91dHB1dHNbMV0uYWRkcmVzcy5zaG91bGQuZXF1YWwodGVzdERhdGEucmF3VHgub3V0cHV0QWRkcmVzczEuYWRkcmVzcyk7XG5cbiAgICAvLyB0b2tlbiBhc3NlcnRpb25cbiAgICBjb25zdCBleHBlY3RlZEFzc2V0TmFtZSA9IENhcmRhbm9XYXNtLkFzc2V0TmFtZS5uZXcoQnVmZmVyLmZyb20oYXNzZXROYW1lLCAnaGV4JykpO1xuICAgIGNvbnN0IGV4cGVjdGVkUG9saWN5SWQgPSBDYXJkYW5vV2FzbS5TY3JpcHRIYXNoLmZyb21fYnl0ZXMoQnVmZmVyLmZyb20ocG9saWN5SWQsICdoZXgnKSk7XG4gICAgdHhEYXRhLm91dHB1dHNbMF0uYW1vdW50LnNob3VsZC5lcXVhbChtaW5BbW91bnRGb3JTaW5nbGVBc3NldC50b1N0cmluZygpKTtcbiAgICB0eERhdGEub3V0cHV0c1swXS5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnbXVsdGlBc3NldHMnKTtcbiAgICAodHhEYXRhLm91dHB1dHNbMF0ubXVsdGlBc3NldHMgYXMgQ2FyZGFub1dhc20uTXVsdGlBc3NldClcbiAgICAgIC5nZXRfYXNzZXQoZXhwZWN0ZWRQb2xpY3lJZCwgZXhwZWN0ZWRBc3NldE5hbWUpXG4gICAgICAudG9fc3RyKClcbiAgICAgIC5zaG91bGQuZXF1YWwocXVhbnRpdHkpO1xuXG4gICAgY29uc3QgZmVlID0gdHguZ2V0RmVlO1xuICAgIHR4RGF0YS5vdXRwdXRzWzFdLmFtb3VudC5zaG91bGQuZXF1YWwoXG4gICAgICAodG90YWxJbnB1dCAtIG1pbkFtb3VudEZvclNpbmdsZUFzc2V0IC0gb3V0cHV0QW1vdW50IC0gTnVtYmVyKGZlZSkpLnRvU3RyaW5nKClcbiAgICApO1xuICAgIGZlZS5zaG91bGQuZXF1YWwoJzE3MDI1MycpO1xuICAgIHR4RGF0YS5pZC5zaG91bGQuZXF1YWwodGVzdERhdGEucmF3VHgudHhIYXNoMyk7XG4gICAgY29uc3QgdHhCcm9hZGNhc3QgPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgIHNob3VsZC5lcXVhbCh0eEJyb2FkY2FzdCwgdGVzdERhdGEucmF3VHgudW5zaWduZWRUeDMpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGJ1aWxkIGEgY29uc29saWRhdGUgdHggd2l0aCBtdWx0aXBsZSBhc3NldHMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICB0eEJ1aWxkZXIuaW5wdXQoe1xuICAgICAgdHJhbnNhY3Rpb25faWQ6ICczNjc3ZTc1YzdiYTY5OWJmZGM2Y2Q1N2Q0MmYyNDZmODZmNjNhZWZkNzYwMjUwMDZhYzc4MzEzZmFkMmJiYTIxJyxcbiAgICAgIHRyYW5zYWN0aW9uX2luZGV4OiAxLFxuICAgIH0pO1xuXG4gICAgY29uc3Qgb3V0cHV0QW1vdW50ID0gMDtcbiAgICBjb25zdCBhc3NldDFfcG9saWN5SWQgPSAnMjc5YzkwOWYzNDhlNTMzZGE1ODA4ODk4Zjg3ZjlhMTRiYjJjM2RmYmJhY2NjZDYzMWQ5MjdhM2YnO1xuICAgIGNvbnN0IGFzc2V0MV9hc3NldE5hbWUgPSAnNTM0ZTQ1NGInO1xuICAgIGNvbnN0IGFzc2V0MV9xdWFudGl0eSA9ICc2MDAwMDAwJztcbiAgICBjb25zdCBhc3NldDJfcG9saWN5SWQgPSAnMWY3YTU4YTFhYTFlNmIwNDdhNDIxMDlhZGUzMzFjZTI2YzljMmNjZTAyN2QwNDNmZjI2NGZiMWYnO1xuICAgIGNvbnN0IGFzc2V0Ml9hc3NldE5hbWUgPSAnNDI1MjQ5NDM0YjUzJztcbiAgICBjb25zdCBhc3NldDJfcXVhbnRpdHkgPSAnNTAwMDAwMCc7XG5cbiAgICB0eEJ1aWxkZXIuYXNzZXRzKHtcbiAgICAgIHBvbGljeV9pZDogYXNzZXQxX3BvbGljeUlkLFxuICAgICAgYXNzZXRfbmFtZTogYXNzZXQxX2Fzc2V0TmFtZSxcbiAgICAgIHF1YW50aXR5OiBhc3NldDFfcXVhbnRpdHksXG4gICAgfSk7XG4gICAgdHhCdWlsZGVyLmFzc2V0cyh7XG4gICAgICBwb2xpY3lfaWQ6IGFzc2V0Ml9wb2xpY3lJZCxcbiAgICAgIGFzc2V0X25hbWU6IGFzc2V0Ml9hc3NldE5hbWUsXG4gICAgICBxdWFudGl0eTogYXNzZXQyX3F1YW50aXR5LFxuICAgIH0pO1xuXG4gICAgY29uc3QgdG90YWxJbnB1dCA9IDIwMDAwMDAwO1xuICAgIGNvbnN0IG1pbkFtb3VudEZvclNpbmdsZUFzc2V0ID0gMTUwMDAwMDtcbiAgICB0eEJ1aWxkZXIuY2hhbmdlQWRkcmVzcyh0ZXN0RGF0YS5yYXdUeC5vdXRwdXRBZGRyZXNzMS5hZGRyZXNzLCB0b3RhbElucHV0LnRvU3RyaW5nKCkpO1xuICAgIHR4QnVpbGRlci50dGwoODAwMDAwMDAwKTtcbiAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcbiAgICBjb25zdCB0eERhdGEgPSB0eC50b0pzb24oKTtcbiAgICB0eERhdGEud2l0bmVzc2VzLmxlbmd0aC5zaG91bGQuZXF1YWwoMCk7XG4gICAgdHhEYXRhLmNlcnRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMCk7XG4gICAgdHhEYXRhLndpdGhkcmF3YWxzLmxlbmd0aC5zaG91bGQuZXF1YWwoMCk7XG4gICAgdHhEYXRhLm91dHB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgzKTtcbiAgICB0eERhdGEub3V0cHV0c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5yYXdUeC5vdXRwdXRBZGRyZXNzMS5hZGRyZXNzKTtcbiAgICB0eERhdGEub3V0cHV0c1sxXS5hZGRyZXNzLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5yYXdUeC5vdXRwdXRBZGRyZXNzMS5hZGRyZXNzKTtcbiAgICB0eERhdGEub3V0cHV0c1syXS5hZGRyZXNzLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5yYXdUeC5vdXRwdXRBZGRyZXNzMS5hZGRyZXNzKTtcblxuICAgIC8vIHRva2VuIGFzc2VydGlvblxuICAgIGNvbnN0IGFzc2V0MV9leHBlY3RlZEFzc2V0TmFtZSA9IENhcmRhbm9XYXNtLkFzc2V0TmFtZS5uZXcoQnVmZmVyLmZyb20oYXNzZXQxX2Fzc2V0TmFtZSwgJ2hleCcpKTtcbiAgICBjb25zdCBhc3NldDFfZXhwZWN0ZWRQb2xpY3lJZCA9IENhcmRhbm9XYXNtLlNjcmlwdEhhc2guZnJvbV9ieXRlcyhCdWZmZXIuZnJvbShhc3NldDFfcG9saWN5SWQsICdoZXgnKSk7XG4gICAgdHhEYXRhLm91dHB1dHNbMF0uYW1vdW50LnNob3VsZC5lcXVhbChtaW5BbW91bnRGb3JTaW5nbGVBc3NldC50b1N0cmluZygpKTtcbiAgICB0eERhdGEub3V0cHV0c1swXS5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnbXVsdGlBc3NldHMnKTtcbiAgICAodHhEYXRhLm91dHB1dHNbMF0ubXVsdGlBc3NldHMgYXMgQ2FyZGFub1dhc20uTXVsdGlBc3NldClcbiAgICAgIC5nZXRfYXNzZXQoYXNzZXQxX2V4cGVjdGVkUG9saWN5SWQsIGFzc2V0MV9leHBlY3RlZEFzc2V0TmFtZSlcbiAgICAgIC50b19zdHIoKVxuICAgICAgLnNob3VsZC5lcXVhbChhc3NldDFfcXVhbnRpdHkpO1xuICAgIGNvbnN0IGFzc2V0Ml9leHBlY3RlZEFzc2V0TmFtZSA9IENhcmRhbm9XYXNtLkFzc2V0TmFtZS5uZXcoQnVmZmVyLmZyb20oYXNzZXQyX2Fzc2V0TmFtZSwgJ2hleCcpKTtcbiAgICBjb25zdCBhc3NldDJfZXhwZWN0ZWRQb2xpY3lJZCA9IENhcmRhbm9XYXNtLlNjcmlwdEhhc2guZnJvbV9ieXRlcyhCdWZmZXIuZnJvbShhc3NldDJfcG9saWN5SWQsICdoZXgnKSk7XG4gICAgdHhEYXRhLm91dHB1dHNbMV0uYW1vdW50LnNob3VsZC5lcXVhbChtaW5BbW91bnRGb3JTaW5nbGVBc3NldC50b1N0cmluZygpKTtcbiAgICB0eERhdGEub3V0cHV0c1sxXS5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnbXVsdGlBc3NldHMnKTtcbiAgICAodHhEYXRhLm91dHB1dHNbMV0ubXVsdGlBc3NldHMgYXMgQ2FyZGFub1dhc20uTXVsdGlBc3NldClcbiAgICAgIC5nZXRfYXNzZXQoYXNzZXQyX2V4cGVjdGVkUG9saWN5SWQsIGFzc2V0Ml9leHBlY3RlZEFzc2V0TmFtZSlcbiAgICAgIC50b19zdHIoKVxuICAgICAgLnNob3VsZC5lcXVhbChhc3NldDJfcXVhbnRpdHkpO1xuXG4gICAgY29uc3QgZmVlID0gdHguZ2V0RmVlO1xuICAgIHR4RGF0YS5vdXRwdXRzWzJdLmFtb3VudC5zaG91bGQuZXF1YWwoXG4gICAgICAodG90YWxJbnB1dCAtIG1pbkFtb3VudEZvclNpbmdsZUFzc2V0ICogMiAtIG91dHB1dEFtb3VudCAtIE51bWJlcihmZWUpKS50b1N0cmluZygpXG4gICAgKTtcbiAgICBmZWUuc2hvdWxkLmVxdWFsKCcxNzUxMzcnKTtcbiAgICB0eERhdGEuaWQuc2hvdWxkLmVxdWFsKHRlc3REYXRhLnJhd1R4LnR4SGFzaDQpO1xuICAgIGNvbnN0IHR4QnJvYWRjYXN0ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICBzaG91bGQuZXF1YWwodHhCcm9hZGNhc3QsIHRlc3REYXRhLnJhd1R4LnVuc2lnbmVkVHg0KTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBmYWlsIHRvIGJ1aWxkIGEgY29uc29saWRhdGUgdHggd2l0aCBzaW5nbGUgYXNzZXQgYW5kIGluc3VmZmljaWVudCBtaW5pbXVtIEFEQScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgIHR4QnVpbGRlci5pbnB1dCh7XG4gICAgICB0cmFuc2FjdGlvbl9pZDogJzM2NzdlNzVjN2JhNjk5YmZkYzZjZDU3ZDQyZjI0NmY4NmY2M2FlZmQ3NjAyNTAwNmFjNzgzMTNmYWQyYmJhMjEnLFxuICAgICAgdHJhbnNhY3Rpb25faW5kZXg6IDEsXG4gICAgfSk7XG5cbiAgICBjb25zdCBwb2xpY3lJZCA9ICcyNzljOTA5ZjM0OGU1MzNkYTU4MDg4OThmODdmOWExNGJiMmMzZGZiYmFjY2NkNjMxZDkyN2EzZic7XG4gICAgY29uc3QgYXNzZXROYW1lID0gJzUzNGU0NTRiJztcbiAgICBjb25zdCBxdWFudGl0eSA9ICc2MDAwMDAwJztcbiAgICB0eEJ1aWxkZXIuYXNzZXRzKHtcbiAgICAgIHBvbGljeV9pZDogcG9saWN5SWQsXG4gICAgICBhc3NldF9uYW1lOiBhc3NldE5hbWUsXG4gICAgICBxdWFudGl0eTogcXVhbnRpdHksXG4gICAgfSk7XG5cbiAgICAvLyBjaGFuZ2UgPSBpbnB1dCBhbXQgLSBmZWUgLSBvdXRwdXQgYW10ID0+IGNoYW5nZSB3aWxsIGJlIGxlc3MgdGhhbiAxMDAwMDAwXG4gICAgLy8gZXZlbiBpZiBvbmUgb3V0cHV0IGhhcyBsZXNzIHRoYW4gMSBBREEsIHR4IHdpbGwgZmFpbFxuICAgIGNvbnN0IHRvdGFsSW5wdXQgPSAxMDAwMDAwO1xuICAgIHR4QnVpbGRlci5jaGFuZ2VBZGRyZXNzKHRlc3REYXRhLnJhd1R4Lm91dHB1dEFkZHJlc3MxLmFkZHJlc3MsIHRvdGFsSW5wdXQudG9TdHJpbmcoKSk7XG4gICAgdHhCdWlsZGVyLnR0bCg4MDAwMDAwMDApO1xuICAgIGF3YWl0IHR4QnVpbGRlclxuICAgICAgLmJ1aWxkKClcbiAgICAgIC5zaG91bGQucmVqZWN0ZWRXaXRoKCdJbnN1ZmZpY2llbnQgZnVuZHM6IG5lZWQgYSBtaW5pbXVtIG9mIDEuNSBBREEgcGVyIG91dHB1dCB0byBjb25zdHJ1Y3QgdG9rZW4gY29uc29saWRhdGlvbicpO1xuICB9KTtcblxuICBpdCgnYnVpbGQgYW5kIHNpZ24gYSB0cmFuc2ZlciB0eCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgIHR4QnVpbGRlci5pbnB1dCh7XG4gICAgICB0cmFuc2FjdGlvbl9pZDogJzM2NzdlNzVjN2JhNjk5YmZkYzZjZDU3ZDQyZjI0NmY4NmY2M2FlZmQ3NjAyNTAwNmFjNzgzMTNmYWQyYmJhMjEnLFxuICAgICAgdHJhbnNhY3Rpb25faW5kZXg6IDEsXG4gICAgfSk7XG4gICAgY29uc3Qgb3V0cHV0QW1vdW50ID0gNzgyMzEyMTtcbiAgICB0eEJ1aWxkZXIub3V0cHV0KHtcbiAgICAgIGFkZHJlc3M6IHRlc3REYXRhLnJhd1R4Lm91dHB1dEFkZHJlc3MxLmFkZHJlc3MsXG4gICAgICBhbW91bnQ6IG91dHB1dEFtb3VudC50b1N0cmluZygpLFxuICAgIH0pO1xuICAgIGNvbnN0IHRvdGFsSW5wdXQgPSAyMTAzMjAyMztcbiAgICB0eEJ1aWxkZXIuY2hhbmdlQWRkcmVzcyh0ZXN0RGF0YS5yYXdUeC5vdXRwdXRBZGRyZXNzMi5hZGRyZXNzLCB0b3RhbElucHV0LnRvU3RyaW5nKCkpO1xuICAgIHR4QnVpbGRlci50dGwoODAwMDAwMDAwKTtcbiAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEucHJpdmF0ZUtleXMucHJ2S2V5NCB9KTtcbiAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcbiAgICBjb25zdCB0eERhdGEgPSB0eC50b0pzb24oKTtcbiAgICB0eERhdGEud2l0bmVzc2VzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgdHhEYXRhLmNlcnRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMCk7XG4gICAgdHhEYXRhLndpdGhkcmF3YWxzLmxlbmd0aC5zaG91bGQuZXF1YWwoMCk7XG4gICAgdHhEYXRhLm91dHB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgyKTtcbiAgICB0eERhdGEub3V0cHV0c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5yYXdUeC5vdXRwdXRBZGRyZXNzMS5hZGRyZXNzKTtcbiAgICB0eERhdGEub3V0cHV0c1sxXS5hZGRyZXNzLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5yYXdUeC5vdXRwdXRBZGRyZXNzMi5hZGRyZXNzKTtcbiAgICBjb25zdCBmZWUgPSB0eC5nZXRGZWU7XG4gICAgdHhEYXRhLm91dHB1dHNbMV0uYW1vdW50LnNob3VsZC5lcXVhbCgodG90YWxJbnB1dCAtIG91dHB1dEFtb3VudCAtIE51bWJlcihmZWUpKS50b1N0cmluZygpKTtcbiAgICBmZWUuc2hvdWxkLmVxdWFsKCcxNjcxNzMnKTtcbiAgICB0eERhdGEuaWQuc2hvdWxkLmVxdWFsKHRlc3REYXRhLnJhd1R4LnR4SGFzaDIpO1xuICAgIGNvbnN0IHR4QnJvYWRjYXN0ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICBzaG91bGQuZXF1YWwodHhCcm9hZGNhc3QsIHRlc3REYXRhLnJhd1R4LnNpZ25lZFR4Mik7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgaW5pdGlhbGl6ZSBhIGZlZSBwcm9wZXJseSwgbm90IGFzIHplcm8nLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICB0eEJ1aWxkZXIuaW5wdXQoe1xuICAgICAgdHJhbnNhY3Rpb25faWQ6ICczNjc3ZTc1YzdiYTY5OWJmZGM2Y2Q1N2Q0MmYyNDZmODZmNjNhZWZkNzYwMjUwMDZhYzc4MzEzZmFkMmJiYTIxJyxcbiAgICAgIHRyYW5zYWN0aW9uX2luZGV4OiAxLFxuICAgIH0pO1xuICAgIHR4QnVpbGRlci5vdXRwdXQoe1xuICAgICAgYWRkcmVzczpcbiAgICAgICAgJ2FkZHIxcThybTl6N3c0eXg1Z3o2NTJrbjJxMjM4ZWZ2bXM2dDBxZWx1cjlubGdsdW44ZXU0dHI1a25qNGZ1NGFkZWx6cWh4ZzhhZHU1eGNhNGpyYTBndGxsZnJwY2F3eXE5cHN6MjMnLFxuICAgICAgYW1vdW50OiAnNzMyODM4MycsXG4gICAgfSk7XG4gICAgdHhCdWlsZGVyLmNoYW5nZUFkZHJlc3ModGVzdERhdGEuYWRkcmVzcy5hZGRyZXNzMiwgJzEwMDAwMDAwMDAnKTtcbiAgICB0eEJ1aWxkZXIudHRsKDgwMDAwMDAwMCk7XG4gICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLnByaXZhdGVLZXlzLnBydktleTQgfSk7XG4gICAgY29uc3QgYnVpbHRUeCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgYnVpbHRUeC5nZXRGZWUuc2hvdWxkLmVxdWFsKCcxNjg0MDUnKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBub3QgY2FsY3VsYXRlIGZlZSBhbmQgdXNlIG9uZSBwYXNzZWQgaW4nLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICB0eEJ1aWxkZXIuaW5wdXQoe1xuICAgICAgdHJhbnNhY3Rpb25faWQ6ICczNjc3ZTc1YzdiYTY5OWJmZGM2Y2Q1N2Q0MmYyNDZmODZmNjNhZWZkNzYwMjUwMDZhYzc4MzEzZmFkMmJiYTIxJyxcbiAgICAgIHRyYW5zYWN0aW9uX2luZGV4OiAxLFxuICAgIH0pO1xuICAgIHR4QnVpbGRlci5vdXRwdXQoe1xuICAgICAgYWRkcmVzczpcbiAgICAgICAgJ2FkZHIxcThybTl6N3c0eXg1Z3o2NTJrbjJxMjM4ZWZ2bXM2dDBxZWx1cjlubGdsdW44ZXU0dHI1a25qNGZ1NGFkZWx6cWh4ZzhhZHU1eGNhNGpyYTBndGxsZnJwY2F3eXE5cHN6MjMnLFxuICAgICAgYW1vdW50OiAnNzMyODM4MycsXG4gICAgfSk7XG4gICAgdHhCdWlsZGVyLmNoYW5nZUFkZHJlc3ModGVzdERhdGEuYWRkcmVzcy5hZGRyZXNzMiwgJzEwMDAwMDAwMDAnKTtcbiAgICB0eEJ1aWxkZXIudHRsKDgwMDAwMDAwMCk7XG4gICAgdHhCdWlsZGVyLmZlZSgnMTcwMDAwJyk7XG4gICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLnByaXZhdGVLZXlzLnBydktleTQgfSk7XG4gICAgY29uc3QgYnVpbHRUeCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgYnVpbHRUeC5nZXRGZWUuc2hvdWxkLmVxdWFsKCcxNzAwMDAnKTtcbiAgfSk7XG5cbiAgaXQoJ2J1aWxkIGEgc2VuZCBmcm9tIHVuc2lnbmVkIHJhd1R4JywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZnJvbSh0ZXN0RGF0YS5yYXdUeC51bnNpZ25lZFR4Mik7XG4gICAgY29uc3QgYnVpbHRUeCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgIHNob3VsZC5lcXVhbChidWlsdFR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcbiAgICBzaG91bGQuZXF1YWwoYnVpbHRUeC5pZCwgdGVzdERhdGEucmF3VHgudHhIYXNoMik7XG4gICAgYnVpbHRUeC5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMik7XG4gICAgYnVpbHRUeC5vdXRwdXRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKHRlc3REYXRhLnJhd1R4Lm91dHB1dEFkZHJlc3MxLmFkZHJlc3MpO1xuICAgIGJ1aWx0VHgub3V0cHV0c1sxXS5hZGRyZXNzLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5yYXdUeC5vdXRwdXRBZGRyZXNzMi5hZGRyZXNzKTtcbiAgfSk7XG5cbiAgaXQoJ21hdGNoIHNpZ25hdHVyZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0eFJhdyA9ICc1ODIwNzAwODFlZWIxZjMxMmVjNzVhZjFiNGY5NGE3OTYzZGIzYjI2NGYyNDUxMzY5ZTRlYTI0NGE1NGRlNWQwJztcbiAgICBjb25zdCBrZXlQYWlyID0gbmV3IEtleVBhaXIoKTtcblxuICAgIGNvbnN0IHBrZXkgPSBDYXJkYW5vV2FzbS5Qcml2YXRlS2V5LmZyb21fbm9ybWFsX2J5dGVzKEJ1ZmZlci5mcm9tKGtleVBhaXIuZ2V0S2V5cygpLnBydiEsICdoZXgnKSk7XG4gICAgY29uc3QgdmtleXcgPSBDYXJkYW5vV2FzbS5tYWtlX3ZrZXlfd2l0bmVzcyhcbiAgICAgIENhcmRhbm9XYXNtLlRyYW5zYWN0aW9uSGFzaC5mcm9tX2J5dGVzKEJ1ZmZlci5mcm9tKHR4UmF3LCAnaGV4JykpLFxuICAgICAgcGtleVxuICAgICk7XG4gICAgY29uc3Qgc2lnMSA9IHZrZXl3LnNpZ25hdHVyZSgpLnRvX2hleCgpO1xuXG4gICAgY29uc3Qgc2lnMiA9IEJ1ZmZlci5mcm9tKGtleVBhaXIuc2lnbk1lc3NhZ2UodHhSYXcpKS50b1N0cmluZygnaGV4Jyk7XG4gICAgc2hvdWxkLmVxdWFsKHNpZzEsIHNpZzIpO1xuICB9KTtcblxuICAvLyBOT1RFOiBUaGUgdGVzdHMgYmVsb3cgaGF2ZSBiZWVuIGNvbW1lbnRlZCBvdXQgYXMgdGhleSBhcmUgZm9yIHRlc3RpbmcgZHVyaW5nIGRldmVsb3BtZW50IGNoYW5nZXMuIFdlIGRvbid0XG4gIC8vIHdhbnQgZnVsbCBub2RlIHRlc3RzIGFzIHBhcnQgb2Ygb3VyIHNkayB1bml0IHRlc3RzLiBJZiB5b3UgYXJlIGNvbW1lbnRpbmcgdGhlc2UgYmFjayBpbiwgYWRkIGF4aW9zIGFuZFxuICAvLyBBZGRyZXNzRm9ybWF0IGltcG9ydHMuXG5cbiAgLy8geGl0KCdzaG91bGQgc3VibWl0IGEgdHJhbnNhY3Rpb24nLCBhc3luYyAoKSA9PiB7XG4gIC8vICAgY29uc3Qga2V5UGFpciA9IG5ldyBLZXlQYWlyKHsgcHJ2OiB0ZXN0RGF0YS5wcml2YXRlS2V5cy5wcnZLZXk0IH0pO1xuICAvLyAgIGNvbnN0IHNlbmRlckFkZHJlc3MgPSBrZXlQYWlyLmdldEFkZHJlc3MoQWRkcmVzc0Zvcm1hdC50ZXN0bmV0KTtcbiAgLy9cbiAgLy8gICBjb25zdCBheGlvc0NvbmZpZyA9IHtcbiAgLy8gICAgIGhlYWRlcnM6IHtcbiAgLy8gICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9jYm9yJyxcbiAgLy8gICAgIH0sXG4gIC8vICAgICB0aW1lb3V0OiAxMDAwMCxcbiAgLy8gICB9O1xuICAvL1xuICAvLyAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gIC8vICAgY29uc3QgdXR4b0RhdGEgPSBhd2FpdCBheGlvcy5nZXQoJ2h0dHBzOi8vdGVzdG5ldC5rb2lvcy5yZXN0L2FwaS92MC9hZGRyZXNzX2luZm8/X2FkZHJlc3M9JyArIHNlbmRlckFkZHJlc3MpO1xuICAvLyAgIGNvbnN0IHNlbmRlckJhbGFuY2UgPSB1dHhvRGF0YS5kYXRhWzBdLmJhbGFuY2U7XG4gIC8vICAgdHhCdWlsZGVyLmNoYW5nZUFkZHJlc3Moc2VuZGVyQWRkcmVzcywgc2VuZGVyQmFsYW5jZSk7XG4gIC8vICAgY29uc3QgdXR4b1NldCA9IHV0eG9EYXRhLmRhdGFbMF0udXR4b19zZXQ7XG4gIC8vICAgZm9yIChjb25zdCB1dHhvIG9mIHV0eG9TZXQpIHtcbiAgLy8gICAgIHR4QnVpbGRlci5pbnB1dCh7IHRyYW5zYWN0aW9uX2lkOiB1dHhvLnR4X2hhc2gsIHRyYW5zYWN0aW9uX2luZGV4OiB1dHhvLnR4X2luZGV4IH0pO1xuICAvLyAgIH1cbiAgLy9cbiAgLy8gICB0eEJ1aWxkZXIub3V0cHV0KHtcbiAgLy8gICAgIGFkZHJlc3M6XG4gIC8vICAgICAgICdhZGRyX3Rlc3QxcXoyZnh2MnVteWh0dGt4eXhwOHgwZGxwZHQzazZjd25nNXB4ajNqaHN5ZHplcjNqY3U1ZDhwczd6ZXgyazJ4dDN1cXhnanFubmo4M3dzOGxocm42NDhqanh0d3EyeXRqcXAnLFxuICAvLyAgICAgYW1vdW50OiAnNTAwMDAwMCcsXG4gIC8vICAgfSk7XG4gIC8vXG4gIC8vICAgdHhCdWlsZGVyLnR0bCg4MDAwMDAwMDApO1xuICAvLyAgIHR4QnVpbGRlci5zaWduKHsga2V5OiBrZXlQYWlyLmdldEtleXMoKS5wcnYgfSk7XG4gIC8vXG4gIC8vICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgLy8gICBjb25zdCBzZXJpYWxpemVkVHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAvLyAgIGNvbnN0IGJ5dGVzID0gVWludDhBcnJheS5mcm9tKEJ1ZmZlci5mcm9tKHNlcmlhbGl6ZWRUeCwgJ2hleCcpKTtcbiAgLy9cbiAgLy8gICB0cnkge1xuICAvLyAgICAgY29uc3QgcmVzID0gYXdhaXQgYXhpb3MucG9zdCgnaHR0cHM6Ly90ZXN0bmV0LmtvaW9zLnJlc3QvYXBpL3YwL3N1Ym1pdHR4JywgYnl0ZXMsIGF4aW9zQ29uZmlnKTtcbiAgLy8gICAgIGNvbnNvbGUubG9nKHJlcy5kYXRhKTtcbiAgLy8gICB9IGNhdGNoIChlcnIpIHtcbiAgLy8gICAgIGNvbnNvbGUubG9nKGVycik7XG4gIC8vICAgfVxuICAvLyB9KTtcbiAgLy9cbiAgLy8geGl0KCdzaG91bGQgc3VibWl0IGEgdHJhbnNhY3Rpb24gdXNpbmcgc2lnbmF0dXJlIGludGVyZmFjZScsIGFzeW5jICgpID0+IHtcbiAgLy8gICBjb25zdCBrZXlQYWlyID0gbmV3IEtleVBhaXIoeyBwcnY6IHRlc3REYXRhLnByaXZhdGVLZXlzLnBydktleTQgfSk7XG4gIC8vICAgY29uc3Qgc2VuZGVyQWRkcmVzcyA9IGtleVBhaXIuZ2V0QWRkcmVzcyhBZGRyZXNzRm9ybWF0LnRlc3RuZXQpO1xuICAvLyAgIGNvbnN0IGF4aW9zQ29uZmlnID0ge1xuICAvLyAgICAgaGVhZGVyczoge1xuICAvLyAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2Nib3InLFxuICAvLyAgICAgfSxcbiAgLy8gICAgIHRpbWVvdXQ6IDEwMDAwLFxuICAvLyAgIH07XG4gIC8vICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgLy8gICBjb25zdCB1dHhvRGF0YSA9IGF3YWl0IGF3YWl0IGF4aW9zLmdldCgnaHR0cHM6Ly90ZXN0bmV0LmtvaW9zLnJlc3QvYXBpL3YwL2FkZHJlc3NfaW5mbz9fYWRkcmVzcz0nICsgc2VuZGVyQWRkcmVzcyk7XG4gIC8vICAgY29uc3Qgc2VuZGVyQmFsYW5jZSA9IHV0eG9EYXRhLmRhdGFbMF0uYmFsYW5jZTtcbiAgLy8gICB0eEJ1aWxkZXIuY2hhbmdlQWRkcmVzcyhzZW5kZXJBZGRyZXNzLCBzZW5kZXJCYWxhbmNlKTtcbiAgLy8gICBjb25zdCB1dHhvU2V0ID0gdXR4b0RhdGEuZGF0YVswXS51dHhvX3NldDtcbiAgLy8gICBmb3IgKGNvbnN0IHV0eG8gb2YgdXR4b1NldCkge1xuICAvLyAgICAgdHhCdWlsZGVyLmlucHV0KHsgdHJhbnNhY3Rpb25faWQ6IHV0eG8udHhfaGFzaCwgdHJhbnNhY3Rpb25faW5kZXg6IHV0eG8udHhfaW5kZXggfSk7XG4gIC8vICAgfVxuICAvLyAgIHR4QnVpbGRlci5vdXRwdXQoe1xuICAvLyAgICAgYWRkcmVzczpcbiAgLy8gICAgICAgJ2FkZHJfdGVzdDFxejJmeHYydW15aHR0a3h5eHA4eDBkbHBkdDNrNmN3bmc1cHhqM2poc3lkemVyM2pjdTVkOHBzN3pleDJrMnh0M3VxeGdqcW5uajgzd3M4bGhybjY0OGpqeHR3cTJ5dGpxcCcsXG4gIC8vICAgICBhbW91bnQ6ICc1MDAwMDAwJyxcbiAgLy8gICB9KTtcbiAgLy9cbiAgLy8gICB0eEJ1aWxkZXIudHRsKDgwMDAwMDAwMCk7XG4gIC8vXG4gIC8vICAgY29uc3QgdW5zaWduZWRUeCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAvLyAgIGNvbnN0IHNlcmlhbGl6ZWRUeCA9IHVuc2lnbmVkVHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgLy9cbiAgLy8gICBjb25zdCB0eEJ1aWxkZXIyID0gZmFjdG9yeS5mcm9tKHNlcmlhbGl6ZWRUeCk7XG4gIC8vICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIyLmJ1aWxkKCk7XG4gIC8vICAgY29uc3Qgc2lnbmFibGVIZXggPSB0eC5zaWduYWJsZVBheWxvYWQudG9TdHJpbmcoJ2hleCcpO1xuICAvLyAgIGNvbnN0IHNpZ25hdHVyZSA9IGtleVBhaXIuc2lnbk1lc3NhZ2Uoc2lnbmFibGVIZXgpO1xuICAvLyAgIHR4QnVpbGRlcjIuYWRkU2lnbmF0dXJlKHsgcHViOiBrZXlQYWlyLmdldEtleXMoKS5wdWIgfSwgQnVmZmVyLmZyb20oc2lnbmF0dXJlKSk7XG4gIC8vICAgY29uc3Qgc2lnbmVkVHJhbnNhY3Rpb24gPSBhd2FpdCB0eEJ1aWxkZXIyLmJ1aWxkKCk7XG4gIC8vICAgY29uc3Qgc2VyaWFsaXplZFRyYW5zYWN0aW9uID0gc2lnbmVkVHJhbnNhY3Rpb24udG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgLy8gICBjb25zdCBieXRlcyA9IFVpbnQ4QXJyYXkuZnJvbShCdWZmZXIuZnJvbShzZXJpYWxpemVkVHJhbnNhY3Rpb24sICdoZXgnKSk7XG4gIC8vXG4gIC8vICAgdHJ5IHtcbiAgLy8gICAgIGNvbnN0IHJlcyA9IGF3YWl0IGF4aW9zLnBvc3QoJ2h0dHBzOi8vdGVzdG5ldC5rb2lvcy5yZXN0L2FwaS92MC9zdWJtaXR0eCcsIGJ5dGVzLCBheGlvc0NvbmZpZyk7XG4gIC8vICAgICBjb25zb2xlLmxvZyhyZXMuZGF0YSk7XG4gIC8vICAgfSBjYXRjaCAoZXJyKSB7XG4gIC8vICAgICBjb25zb2xlLmxvZyhlcnIpO1xuICAvLyAgIH1cbiAgLy8gfSk7XG59KTtcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../test/unit/utils.ts"],"names":[],"mappings":""}