@bitgo/sdk-coin-eth 25.3.2 → 25.3.3

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 (74) hide show
  1. package/dist/test/fixtures/eth.d.ts +39 -0
  2. package/dist/test/fixtures/eth.d.ts.map +1 -0
  3. package/dist/test/fixtures/eth.js +262 -0
  4. package/dist/test/resources/erc1155Abi.d.ts +40 -0
  5. package/dist/test/resources/erc1155Abi.d.ts.map +1 -0
  6. package/dist/test/resources/erc1155Abi.js +329 -0
  7. package/dist/test/resources/erc721Abi.d.ts +12 -0
  8. package/dist/test/resources/erc721Abi.d.ts.map +1 -0
  9. package/dist/test/resources/erc721Abi.js +34 -0
  10. package/dist/test/resources/eth.d.ts +51 -0
  11. package/dist/test/resources/eth.d.ts.map +1 -0
  12. package/dist/test/resources/eth.js +72 -0
  13. package/dist/test/resources/nftEncodings.d.ts +4 -0
  14. package/dist/test/resources/nftEncodings.d.ts.map +1 -0
  15. package/dist/test/resources/nftEncodings.js +7 -0
  16. package/dist/test/resources/walletSimpleAbi.d.ts +12 -0
  17. package/dist/test/resources/walletSimpleAbi.d.ts.map +1 -0
  18. package/dist/test/resources/walletSimpleAbi.js +44 -0
  19. package/dist/test/unit/eth.d.ts +2 -0
  20. package/dist/test/unit/eth.d.ts.map +1 -0
  21. package/dist/test/unit/eth.js +1171 -0
  22. package/dist/test/unit/ethWallet.d.ts +2 -0
  23. package/dist/test/unit/ethWallet.d.ts.map +1 -0
  24. package/dist/test/unit/ethWallet.js +472 -0
  25. package/dist/test/unit/fixtures/ethMultiSigBackupKey.d.ts +4 -0
  26. package/dist/test/unit/fixtures/ethMultiSigBackupKey.d.ts.map +1 -0
  27. package/dist/test/unit/fixtures/ethMultiSigBackupKey.js +10 -0
  28. package/dist/test/unit/fixtures/ethTssBackupKey.d.ts +5 -0
  29. package/dist/test/unit/fixtures/ethTssBackupKey.d.ts.map +1 -0
  30. package/dist/test/unit/fixtures/ethTssBackupKey.js +25 -0
  31. package/dist/test/unit/getBuilder.d.ts +3 -0
  32. package/dist/test/unit/getBuilder.d.ts.map +1 -0
  33. package/dist/test/unit/getBuilder.js +10 -0
  34. package/dist/test/unit/keyPair.d.ts +2 -0
  35. package/dist/test/unit/keyPair.d.ts.map +1 -0
  36. package/dist/test/unit/keyPair.js +175 -0
  37. package/dist/test/unit/transaction.d.ts +2 -0
  38. package/dist/test/unit/transaction.d.ts.map +1 -0
  39. package/dist/test/unit/transaction.js +96 -0
  40. package/dist/test/unit/transactionBuilder/addressInitialization.d.ts +2 -0
  41. package/dist/test/unit/transactionBuilder/addressInitialization.d.ts.map +1 -0
  42. package/dist/test/unit/transactionBuilder/addressInitialization.js +101 -0
  43. package/dist/test/unit/transactionBuilder/contractCall.d.ts +2 -0
  44. package/dist/test/unit/transactionBuilder/contractCall.d.ts.map +1 -0
  45. package/dist/test/unit/transactionBuilder/contractCall.js +101 -0
  46. package/dist/test/unit/transactionBuilder/flushCoins.d.ts +2 -0
  47. package/dist/test/unit/transactionBuilder/flushCoins.d.ts.map +1 -0
  48. package/dist/test/unit/transactionBuilder/flushCoins.js +133 -0
  49. package/dist/test/unit/transactionBuilder/flushTokens.d.ts +2 -0
  50. package/dist/test/unit/transactionBuilder/flushTokens.d.ts.map +1 -0
  51. package/dist/test/unit/transactionBuilder/flushTokens.js +281 -0
  52. package/dist/test/unit/transactionBuilder/send.d.ts +2 -0
  53. package/dist/test/unit/transactionBuilder/send.d.ts.map +1 -0
  54. package/dist/test/unit/transactionBuilder/send.js +331 -0
  55. package/dist/test/unit/transactionBuilder/sendNFT.d.ts +2 -0
  56. package/dist/test/unit/transactionBuilder/sendNFT.d.ts.map +1 -0
  57. package/dist/test/unit/transactionBuilder/sendNFT.js +250 -0
  58. package/dist/test/unit/transactionBuilder/singleSigSend.d.ts +2 -0
  59. package/dist/test/unit/transactionBuilder/singleSigSend.d.ts.map +1 -0
  60. package/dist/test/unit/transactionBuilder/singleSigSend.js +196 -0
  61. package/dist/test/unit/transactionBuilder/walletInitialization.d.ts +2 -0
  62. package/dist/test/unit/transactionBuilder/walletInitialization.d.ts.map +1 -0
  63. package/dist/test/unit/transactionBuilder/walletInitialization.js +423 -0
  64. package/dist/test/unit/transferBuilder.d.ts +2 -0
  65. package/dist/test/unit/transferBuilder.d.ts.map +1 -0
  66. package/dist/test/unit/transferBuilder.js +124 -0
  67. package/dist/test/unit/utils.d.ts +2 -0
  68. package/dist/test/unit/utils.d.ts.map +1 -0
  69. package/dist/test/unit/utils.js +74 -0
  70. package/dist/tsconfig.tsbuildinfo +1 -0
  71. package/package.json +10 -7
  72. package/.eslintignore +0 -5
  73. package/.mocharc.yml +0 -8
  74. package/CHANGELOG.md +0 -1858
@@ -0,0 +1,331 @@
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 sdk_core_1 = require("@bitgo/sdk-core");
40
+ const statics_1 = require("@bitgo/statics");
41
+ const ethereumjs_abi_1 = __importDefault(require("ethereumjs-abi"));
42
+ const assert_1 = __importDefault(require("assert"));
43
+ const should_1 = __importDefault(require("should"));
44
+ const ethUtil = __importStar(require("ethereumjs-util"));
45
+ const src_1 = require("../../../src");
46
+ const testData = __importStar(require("../../resources/eth"));
47
+ const getBuilder_1 = require("../getBuilder");
48
+ describe('Eth transaction builder send', () => {
49
+ it('should validate a send type transaction', () => {
50
+ const txBuilder = (0, getBuilder_1.getBuilder)('teth');
51
+ const coinConfig = statics_1.coins.get('eth');
52
+ const common = (0, src_1.getCommon)(coinConfig.network);
53
+ const tx = new src_1.Transaction(coinConfig, common);
54
+ txBuilder.counter(1);
55
+ txBuilder.type(sdk_core_1.TransactionType.Send);
56
+ assert_1.default.throws(() => txBuilder.validateTransaction(tx), /Invalid transaction: missing fee/);
57
+ txBuilder.fee({
58
+ fee: '10',
59
+ gasLimit: '1000',
60
+ });
61
+ assert_1.default.throws(() => txBuilder.validateTransaction(tx), /Invalid transaction: missing contract address/);
62
+ assert_1.default.throws(() => txBuilder.validateTransaction(tx), /Invalid transaction: missing contract address/);
63
+ });
64
+ describe('should sign and build', () => {
65
+ let txBuilder;
66
+ let key;
67
+ let contractAddress;
68
+ const getOperationHash = function (tx) {
69
+ const { data } = tx.toJson();
70
+ const { tokenContractAddress, expireTime, sequenceId, amount, to } = (0, src_1.decodeTransferData)(data);
71
+ const operationParams = [
72
+ ['string', 'address', 'uint', 'address', 'uint', 'uint'],
73
+ [
74
+ 'ERC20',
75
+ new ethUtil.BN(ethUtil.stripHexPrefix(to), 16),
76
+ amount,
77
+ new ethUtil.BN(ethUtil.stripHexPrefix(tokenContractAddress || ''), 16),
78
+ expireTime,
79
+ sequenceId,
80
+ ],
81
+ ];
82
+ return ethereumjs_abi_1.default.soliditySHA3(...operationParams);
83
+ };
84
+ beforeEach(() => {
85
+ contractAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
86
+ txBuilder = (0, getBuilder_1.getBuilder)('hteth');
87
+ key = testData.KEYPAIR_PRV.getKeys().prv;
88
+ txBuilder.fee({
89
+ fee: '1000000000',
90
+ gasLimit: '12100000',
91
+ });
92
+ txBuilder.counter(2);
93
+ txBuilder.type(sdk_core_1.TransactionType.Send);
94
+ txBuilder.contract(contractAddress);
95
+ });
96
+ it('a send funds transaction', async () => {
97
+ const recipient = '0x19645032c7f1533395d44a629462e751084d3e4c';
98
+ const amount = '1000000000';
99
+ const expireTime = 1590066728;
100
+ const sequenceId = 5;
101
+ txBuilder
102
+ .transfer()
103
+ .amount(amount)
104
+ .to(recipient)
105
+ .expirationTime(expireTime)
106
+ .contractSequenceId(sequenceId)
107
+ .key(key);
108
+ txBuilder.sign({ key: testData.PRIVATE_KEY });
109
+ const tx = await txBuilder.build();
110
+ should_1.default.equal(tx.toJson().chainId, 560048);
111
+ should_1.default.equal(tx.toBroadcastFormat(), testData.SEND_TX_BROADCAST_LEGACY);
112
+ should_1.default.equal(tx.signature.length, 2);
113
+ should_1.default.equal(tx.inputs.length, 1);
114
+ should_1.default.equal(tx.inputs[0].address, contractAddress);
115
+ should_1.default.equal(tx.inputs[0].value, amount);
116
+ should_1.default.equal(tx.outputs.length, 1);
117
+ should_1.default.equal(tx.outputs[0].address, recipient);
118
+ should_1.default.equal(tx.outputs[0].value, amount);
119
+ const data = tx.toJson().data;
120
+ const { to, amount: parsedAmount, expireTime: parsedExpireTime, sequenceId: parsedSequenceId, } = (0, src_1.decodeTransferData)(data);
121
+ should_1.default.equal(to, recipient);
122
+ should_1.default.equal(parsedAmount, amount);
123
+ should_1.default.equal(parsedExpireTime, expireTime);
124
+ should_1.default.equal(parsedSequenceId, sequenceId);
125
+ });
126
+ it('a send funds transaction built for a first signer', async () => {
127
+ const recipient = '0x19645032c7f1533395d44a629462e751084d3e4c';
128
+ const amount = '1000000000';
129
+ const expireTime = 1590066728;
130
+ const sequenceId = 5;
131
+ txBuilder.fee({
132
+ eip1559: {
133
+ maxFeePerGas: '100',
134
+ maxPriorityFeePerGas: '10',
135
+ },
136
+ fee: '10',
137
+ gasLimit: '1000',
138
+ });
139
+ const transfer = txBuilder.transfer();
140
+ transfer
141
+ .amount(amount)
142
+ .to(recipient)
143
+ .expirationTime(expireTime)
144
+ .contractSequenceId(sequenceId)
145
+ .isFirstSigner(true);
146
+ const tx = await txBuilder.build();
147
+ const methodId = ethereumjs_abi_1.default.methodID('sendMultiSig', src_1.sendMultiSigTypes);
148
+ const decodedData = ethereumjs_abi_1.default.rawDecode(['string', 'address', 'uint', 'bytes', 'uint', 'uint'], Buffer.from(ethUtil.stripHexPrefix(tx.toJson().data).slice(methodId.toString('hex').length, -2), 'hex'));
149
+ should_1.default.equal(decodedData[0], 'ETHER');
150
+ should_1.default.equal(decodedData[1], ethUtil.stripHexPrefix(recipient));
151
+ should_1.default.equal(decodedData[2].toString(), amount);
152
+ should_1.default.equal(decodedData[3].toString('hex'), '');
153
+ should_1.default.equal(decodedData[4].toString(), expireTime);
154
+ should_1.default.equal(decodedData[5].toString(), sequenceId);
155
+ should_1.default.equal(tx.toJson().chainId, 560048);
156
+ should_1.default.equal(tx.toBroadcastFormat(), testData.SEND_TX_BROADCAST_RECOVERY);
157
+ should_1.default.equal(tx.signature.length, 0);
158
+ should_1.default.equal(tx.inputs.length, 1);
159
+ should_1.default.equal(tx.inputs[0].address, contractAddress);
160
+ should_1.default.equal(tx.inputs[0].value, amount);
161
+ should_1.default.equal(tx.outputs.length, 1);
162
+ should_1.default.equal(tx.outputs[0].address, recipient);
163
+ should_1.default.equal(tx.outputs[0].value, amount);
164
+ const data = tx.toJson().data;
165
+ const { to, amount: parsedAmount, expireTime: parsedExpireTime, sequenceId: parsedSequenceId, } = (0, src_1.decodeTransferData)(data, true);
166
+ should_1.default.equal(to, recipient);
167
+ should_1.default.equal(parsedAmount, amount);
168
+ should_1.default.equal(parsedExpireTime, expireTime);
169
+ should_1.default.equal(parsedSequenceId, sequenceId);
170
+ // Add signature from first signer
171
+ transfer.setSignature('0x1234567890abcdef').isFirstSigner(false);
172
+ const signedTx = await txBuilder.build();
173
+ const { to: toSigned, amount: parsedAmountSigned, expireTime: parsedExpireTimeSigned, sequenceId: parsedSequenceIdSigned, signature, } = (0, src_1.decodeTransferData)(signedTx.toJson().data);
174
+ should_1.default.equal(toSigned, recipient);
175
+ should_1.default.equal(parsedAmountSigned, amount);
176
+ should_1.default.equal(parsedExpireTimeSigned, expireTime);
177
+ should_1.default.equal(parsedSequenceIdSigned, sequenceId);
178
+ should_1.default.equal(signature, '0x1234567890abcdef');
179
+ const fromSerializedTxBuilder = (0, getBuilder_1.getBuilder)('hteth');
180
+ fromSerializedTxBuilder.from(testData.SEND_TX_BROADCAST_RECOVERY, true);
181
+ const fromSerializedTx = await fromSerializedTxBuilder.build();
182
+ const { to: toFromSerialized, amount: amountFromSerialized, expireTime: expireTimeFromSerialized, sequenceId: sequenceIdFromSerialized, } = (0, src_1.decodeTransferData)(fromSerializedTx.toJson().data, true);
183
+ should_1.default.equal(toFromSerialized, recipient);
184
+ should_1.default.equal(amountFromSerialized, amount);
185
+ should_1.default.equal(expireTimeFromSerialized, expireTime);
186
+ should_1.default.equal(sequenceIdFromSerialized, sequenceId);
187
+ });
188
+ it('should send funds for wallet version 4', async () => {
189
+ const recipient = '0x19645032c7f1533395d44a629462e751084d3e4c';
190
+ const amount = '1000000000';
191
+ const expireTime = 1590066728;
192
+ const sequenceId = 5;
193
+ txBuilder.walletVersion(4);
194
+ txBuilder
195
+ .transfer()
196
+ .amount(amount)
197
+ .to(recipient)
198
+ .expirationTime(expireTime)
199
+ .contractSequenceId(sequenceId)
200
+ .key(key);
201
+ txBuilder.sign({ key: testData.PRIVATE_KEY });
202
+ await txBuilder.build();
203
+ const operationData = txBuilder.transfer().getOperationData();
204
+ should_1.default.equal(operationData[1][0], '560048');
205
+ should_1.default.equal(txBuilder.coinUsesNonPackedEncodingForTxData(), true);
206
+ });
207
+ it('a send funds with amount 0 transaction', async () => {
208
+ txBuilder
209
+ .transfer()
210
+ .amount('0')
211
+ .to('0x19645032c7f1533395d44a629462e751084d3e4c')
212
+ .expirationTime(1590066728)
213
+ .contractSequenceId(5)
214
+ .key(key);
215
+ txBuilder.sign({ key: testData.PRIVATE_KEY });
216
+ const tx = await txBuilder.build();
217
+ should_1.default.equal(tx.toBroadcastFormat(), testData.SEND_TX_AMOUNT_ZERO_BROADCAST);
218
+ });
219
+ it('Goerli chain id should be correct', async () => {
220
+ const txBuilder = (0, getBuilder_1.getBuilder)('gteth');
221
+ txBuilder.fee({
222
+ fee: '1000000000',
223
+ gasLimit: '12100000',
224
+ });
225
+ txBuilder.counter(2);
226
+ txBuilder.type(sdk_core_1.TransactionType.Send);
227
+ txBuilder.contract(contractAddress);
228
+ const transferBuilder = txBuilder.transfer();
229
+ transferBuilder
230
+ .amount('0')
231
+ .to('0x19645032c7f1533395d44a629462e751084d3e4c')
232
+ .expirationTime(1590066728)
233
+ .contractSequenceId(5)
234
+ .key(key);
235
+ txBuilder.sign({ key: testData.PRIVATE_KEY });
236
+ const tx = await txBuilder.build();
237
+ should_1.default.equal(tx.toJson().chainId, 5);
238
+ });
239
+ it('Hoodi chain id should be correct', async () => {
240
+ const txBuilder = (0, getBuilder_1.getBuilder)('hteth');
241
+ txBuilder.fee({
242
+ fee: '1000000000',
243
+ gasLimit: '12100000',
244
+ });
245
+ txBuilder.counter(2);
246
+ txBuilder.type(sdk_core_1.TransactionType.Send);
247
+ txBuilder.contract(contractAddress);
248
+ const transferBuilder = txBuilder.transfer();
249
+ transferBuilder
250
+ .amount('0')
251
+ .to('0x19645032c7f1533395d44a629462e751084d3e4c')
252
+ .expirationTime(1590066728)
253
+ .contractSequenceId(5)
254
+ .key(key);
255
+ txBuilder.sign({ key: testData.PRIVATE_KEY });
256
+ const tx = await txBuilder.build();
257
+ should_1.default.equal(tx.toJson().chainId, 560048);
258
+ });
259
+ it('a send token transaction', async () => {
260
+ const recipient = '0x72c2c8e08bf91d755cd7d26b49a2ee3dc99de1b9';
261
+ const contractAddress = '0xdf7decb1baa8f529f0c8982cbb4be50357195299';
262
+ const amount = '100';
263
+ txBuilder.contract(contractAddress);
264
+ txBuilder
265
+ .transfer()
266
+ .coin('trif')
267
+ .amount(amount)
268
+ .to(recipient)
269
+ .expirationTime(1590066728)
270
+ .contractSequenceId(5)
271
+ .key(key);
272
+ txBuilder.sign({
273
+ key: testData.PRIVATE_KEY,
274
+ });
275
+ const tx = await txBuilder.build();
276
+ should_1.default.equal(tx.toBroadcastFormat(), testData.SEND_TOKEN_TX_BROADCAST);
277
+ should_1.default.equal(tx.signature.length, 2);
278
+ should_1.default.equal(tx.inputs.length, 1);
279
+ should_1.default.equal(tx.inputs[0].address, contractAddress);
280
+ should_1.default.equal(tx.inputs[0].value, amount);
281
+ should_1.default.equal(tx.inputs[0].coin, 'trif');
282
+ should_1.default.equal(tx.outputs.length, 1);
283
+ should_1.default.equal(tx.outputs[0].address, recipient);
284
+ should_1.default.equal(tx.outputs[0].value, amount);
285
+ should_1.default.equal(tx.outputs[0].coin, 'trif');
286
+ const { signature } = (0, src_1.decodeTransferData)(tx.toJson().data);
287
+ const operationHash = getOperationHash(tx);
288
+ const { v, r, s } = ethUtil.fromRpcSig(signature);
289
+ const senderPubKey = ethUtil.ecrecover(Buffer.from(operationHash, 'hex'), v, r, s);
290
+ const senderAddress = ethUtil.pubToAddress(senderPubKey);
291
+ const senderKey = new src_1.KeyPair({ prv: testData.PRIVATE_KEY });
292
+ ethUtil.bufferToHex(senderAddress).should.equal(senderKey.getAddress());
293
+ });
294
+ it('a send token transactions from serialized', async () => {
295
+ const txBuilder = new src_1.TransactionBuilder(statics_1.coins.get('hteth'));
296
+ txBuilder.from(testData.SEND_TOKEN_TX_BROADCAST);
297
+ const tx = await txBuilder.build();
298
+ should_1.default.equal(tx.toBroadcastFormat(), testData.SEND_TOKEN_TX_BROADCAST);
299
+ const { signature } = (0, src_1.decodeTransferData)(tx.toJson().data);
300
+ const operationHash = getOperationHash(tx);
301
+ const { v, r, s } = ethUtil.fromRpcSig(signature);
302
+ const senderPubKey = ethUtil.ecrecover(Buffer.from(operationHash || ''), v, r, s);
303
+ const senderAddress = ethUtil.pubToAddress(senderPubKey);
304
+ const senderKey = new src_1.KeyPair({ prv: testData.PRIVATE_KEY });
305
+ ethUtil.bufferToHex(senderAddress).should.equal(senderKey.getAddress());
306
+ });
307
+ });
308
+ describe('sign and build from serialized', () => {
309
+ {
310
+ const testParams = [
311
+ ['Legacy', testData.SEND_TX_BROADCAST_LEGACY],
312
+ ['EIP1559', testData.SEND_TX_BROADCAST_EIP1559],
313
+ ];
314
+ testParams.map(([txnType, txnHex]) => {
315
+ it(`should be able to create a send transaction from serialized ${txnType} tx hex`, async () => {
316
+ const txBuilder = (0, getBuilder_1.getBuilder)('hteth');
317
+ txBuilder.from(txnHex);
318
+ const signedTx = await txBuilder.build();
319
+ should_1.default.equal(signedTx.toBroadcastFormat(), txnHex);
320
+ });
321
+ });
322
+ }
323
+ it('a send funds transaction with amount 0 from serialized', async () => {
324
+ const txBuilder = (0, getBuilder_1.getBuilder)('hteth');
325
+ txBuilder.from(testData.SEND_TX_AMOUNT_ZERO_BROADCAST);
326
+ const signedTx = await txBuilder.build();
327
+ should_1.default.equal(signedTx.toBroadcastFormat(), testData.SEND_TX_AMOUNT_ZERO_BROADCAST);
328
+ });
329
+ });
330
+ });
331
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VuZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Rlc3QvdW5pdC90cmFuc2FjdGlvbkJ1aWxkZXIvc2VuZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDhDQUFtRTtBQUNuRSw0Q0FBd0Q7QUFDeEQsb0VBQXlDO0FBQ3pDLG9EQUE0QjtBQUM1QixvREFBNEI7QUFDNUIseURBQTJDO0FBRTNDLHNDQVFzQjtBQUN0Qiw4REFBZ0Q7QUFDaEQsOENBQTJDO0FBRTNDLFFBQVEsQ0FBQyw4QkFBOEIsRUFBRSxHQUFHLEVBQUU7SUFDNUMsRUFBRSxDQUFDLHlDQUF5QyxFQUFFLEdBQUcsRUFBRTtRQUNqRCxNQUFNLFNBQVMsR0FBRyxJQUFBLHVCQUFVLEVBQUMsTUFBTSxDQUF1QixDQUFDO1FBQzNELE1BQU0sVUFBVSxHQUFHLGVBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDcEMsTUFBTSxNQUFNLEdBQUcsSUFBQSxlQUFTLEVBQUMsVUFBVSxDQUFDLE9BQTBCLENBQUMsQ0FBQztRQUNoRSxNQUFNLEVBQUUsR0FBRyxJQUFJLGlCQUFXLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQy9DLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckIsU0FBUyxDQUFDLElBQUksQ0FBQywwQkFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JDLGdCQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLENBQUMsRUFBRSxrQ0FBa0MsQ0FBQyxDQUFDO1FBQzNGLFNBQVMsQ0FBQyxHQUFHLENBQUM7WUFDWixHQUFHLEVBQUUsSUFBSTtZQUNULFFBQVEsRUFBRSxNQUFNO1NBQ2pCLENBQUMsQ0FBQztRQUNILGdCQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLENBQUMsRUFBRSwrQ0FBK0MsQ0FBQyxDQUFDO1FBQ3hHLGdCQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLENBQUMsRUFBRSwrQ0FBK0MsQ0FBQyxDQUFDO0lBQzFHLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLHVCQUF1QixFQUFFLEdBQUcsRUFBRTtRQUNyQyxJQUFJLFNBQVMsQ0FBQztRQUNkLElBQUksR0FBRyxDQUFDO1FBQ1IsSUFBSSxlQUFlLENBQUM7UUFFcEIsTUFBTSxnQkFBZ0IsR0FBRyxVQUFVLEVBQW1CO1lBQ3BELE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDN0IsTUFBTSxFQUFFLG9CQUFvQixFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxHQUFHLElBQUEsd0JBQWtCLEVBQUMsSUFBSSxDQUFDLENBQUM7WUFDOUYsTUFBTSxlQUFlLEdBQUc7Z0JBQ3RCLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUM7Z0JBQ3hEO29CQUNFLE9BQU87b0JBQ1AsSUFBSSxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO29CQUM5QyxNQUFNO29CQUNOLElBQUksT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLG9CQUFvQixJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztvQkFDdEUsVUFBVTtvQkFDVixVQUFVO2lCQUNYO2FBQ0YsQ0FBQztZQUNGLE9BQU8sd0JBQVcsQ0FBQyxZQUFZLENBQUMsR0FBRyxlQUFlLENBQUMsQ0FBQztRQUN0RCxDQUFDLENBQUM7UUFFRixVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsZUFBZSxHQUFHLDRDQUE0QyxDQUFDO1lBQy9ELFNBQVMsR0FBRyxJQUFBLHVCQUFVLEVBQUMsT0FBTyxDQUF1QixDQUFDO1lBQ3RELEdBQUcsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQWEsQ0FBQztZQUNuRCxTQUFTLENBQUMsR0FBRyxDQUFDO2dCQUNaLEdBQUcsRUFBRSxZQUFZO2dCQUNqQixRQUFRLEVBQUUsVUFBVTthQUNyQixDQUFDLENBQUM7WUFDSCxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3JCLFNBQVMsQ0FBQyxJQUFJLENBQUMsMEJBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNyQyxTQUFTLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ3RDLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDBCQUEwQixFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ3hDLE1BQU0sU0FBUyxHQUFHLDRDQUE0QyxDQUFDO1lBQy9ELE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQztZQUM1QixNQUFNLFVBQVUsR0FBRyxVQUFVLENBQUM7WUFDOUIsTUFBTSxVQUFVLEdBQUcsQ0FBQyxDQUFDO1lBQ3JCLFNBQVM7aUJBQ04sUUFBUSxFQUFFO2lCQUNWLE1BQU0sQ0FBQyxNQUFNLENBQUM7aUJBQ2QsRUFBRSxDQUFDLFNBQVMsQ0FBQztpQkFDYixjQUFjLENBQUMsVUFBVSxDQUFDO2lCQUMxQixrQkFBa0IsQ0FBQyxVQUFVLENBQUM7aUJBQzlCLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNaLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7WUFDOUMsTUFBTSxFQUFFLEdBQUcsTUFBTSxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7WUFFbkMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztZQUMxQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxRQUFRLENBQUMsd0JBQXdCLENBQUMsQ0FBQztZQUN4RSxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNyQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNsQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxlQUFlLENBQUMsQ0FBQztZQUNwRCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztZQUV6QyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNuQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMvQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztZQUUxQyxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDO1lBQzlCLE1BQU0sRUFDSixFQUFFLEVBQ0YsTUFBTSxFQUFFLFlBQVksRUFDcEIsVUFBVSxFQUFFLGdCQUFnQixFQUM1QixVQUFVLEVBQUUsZ0JBQWdCLEdBQzdCLEdBQUcsSUFBQSx3QkFBa0IsRUFBQyxJQUFJLENBQUMsQ0FBQztZQUM3QixnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDNUIsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ25DLGdCQUFNLENBQUMsS0FBSyxDQUFDLGdCQUFnQixFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQzNDLGdCQUFNLENBQUMsS0FBSyxDQUFDLGdCQUFnQixFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQzdDLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLG1EQUFtRCxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ2pFLE1BQU0sU0FBUyxHQUFHLDRDQUE0QyxDQUFDO1lBQy9ELE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQztZQUM1QixNQUFNLFVBQVUsR0FBRyxVQUFVLENBQUM7WUFDOUIsTUFBTSxVQUFVLEdBQUcsQ0FBQyxDQUFDO1lBQ3JCLFNBQVMsQ0FBQyxHQUFHLENBQUM7Z0JBQ1osT0FBTyxFQUFFO29CQUNQLFlBQVksRUFBRSxLQUFLO29CQUNuQixvQkFBb0IsRUFBRSxJQUFJO2lCQUMzQjtnQkFDRCxHQUFHLEVBQUUsSUFBSTtnQkFDVCxRQUFRLEVBQUUsTUFBTTthQUNqQixDQUFDLENBQUM7WUFDSCxNQUFNLFFBQVEsR0FBb0IsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3ZELFFBQVE7aUJBQ0wsTUFBTSxDQUFDLE1BQU0sQ0FBQztpQkFDZCxFQUFFLENBQUMsU0FBUyxDQUFDO2lCQUNiLGNBQWMsQ0FBQyxVQUFVLENBQUM7aUJBQzFCLGtCQUFrQixDQUFDLFVBQVUsQ0FBQztpQkFDOUIsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3ZCLE1BQU0sRUFBRSxHQUFnQixNQUFNLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUVoRCxNQUFNLFFBQVEsR0FBRyx3QkFBVyxDQUFDLFFBQVEsQ0FBQyxjQUFjLEVBQUUsdUJBQWlCLENBQUMsQ0FBQztZQUN6RSxNQUFNLFdBQVcsR0FBRyx3QkFBVyxDQUFDLFNBQVMsQ0FDdkMsQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxFQUN0RCxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUN4RyxDQUFDO1lBRUYsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3RDLGdCQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDaEUsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ2hELGdCQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDakQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQ3BELGdCQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUNwRCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQzFDLGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLFFBQVEsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1lBQzFFLGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3JDLGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2xDLGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLGVBQWUsQ0FBQyxDQUFDO1lBQ3BELGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBRXpDLGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ25DLGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQy9DLGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBRTFDLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUM7WUFDOUIsTUFBTSxFQUNKLEVBQUUsRUFDRixNQUFNLEVBQUUsWUFBWSxFQUNwQixVQUFVLEVBQUUsZ0JBQWdCLEVBQzVCLFVBQVUsRUFBRSxnQkFBZ0IsR0FDN0IsR0FBRyxJQUFBLHdCQUFrQixFQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNuQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDNUIsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ25DLGdCQUFNLENBQUMsS0FBSyxDQUFDLGdCQUFnQixFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQzNDLGdCQUFNLENBQUMsS0FBSyxDQUFDLGdCQUFnQixFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQzNDLGtDQUFrQztZQUNsQyxRQUFRLENBQUMsWUFBWSxDQUFDLG9CQUFvQixDQUFDLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2pFLE1BQU0sUUFBUSxHQUFHLE1BQU0sU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3pDLE1BQU0sRUFDSixFQUFFLEVBQUUsUUFBUSxFQUNaLE1BQU0sRUFBRSxrQkFBa0IsRUFDMUIsVUFBVSxFQUFFLHNCQUFzQixFQUNsQyxVQUFVLEVBQUUsc0JBQXNCLEVBQ2xDLFNBQVMsR0FDVixHQUFHLElBQUEsd0JBQWtCLEVBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQy9DLGdCQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUNsQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUN6QyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUNqRCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUNqRCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztZQUU5QyxNQUFNLHVCQUF1QixHQUFHLElBQUEsdUJBQVUsRUFBQyxPQUFPLENBQXVCLENBQUM7WUFDMUUsdUJBQXVCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQywwQkFBMEIsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUN4RSxNQUFNLGdCQUFnQixHQUFHLE1BQU0sdUJBQXVCLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDL0QsTUFBTSxFQUNKLEVBQUUsRUFBRSxnQkFBZ0IsRUFDcEIsTUFBTSxFQUFFLG9CQUFvQixFQUM1QixVQUFVLEVBQUUsd0JBQXdCLEVBQ3BDLFVBQVUsRUFBRSx3QkFBd0IsR0FDckMsR0FBRyxJQUFBLHdCQUFrQixFQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztZQUM3RCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMxQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUMzQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyx3QkFBd0IsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUNuRCxnQkFBTSxDQUFDLEtBQUssQ0FBQyx3QkFBd0IsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNyRCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyx3Q0FBd0MsRUFBRSxLQUFLLElBQUksRUFBRTtZQUN0RCxNQUFNLFNBQVMsR0FBRyw0Q0FBNEMsQ0FBQztZQUMvRCxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUM7WUFDNUIsTUFBTSxVQUFVLEdBQUcsVUFBVSxDQUFDO1lBQzlCLE1BQU0sVUFBVSxHQUFHLENBQUMsQ0FBQztZQUNyQixTQUFTLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNCLFNBQVM7aUJBQ04sUUFBUSxFQUFFO2lCQUNWLE1BQU0sQ0FBQyxNQUFNLENBQUM7aUJBQ2QsRUFBRSxDQUFDLFNBQVMsQ0FBQztpQkFDYixjQUFjLENBQUMsVUFBVSxDQUFDO2lCQUMxQixrQkFBa0IsQ0FBQyxVQUFVLENBQUM7aUJBQzlCLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNaLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7WUFDOUMsTUFBTSxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDeEIsTUFBTSxhQUFhLEdBQUcsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDOUQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQzVDLGdCQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxrQ0FBa0MsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3JFLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHdDQUF3QyxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ3RELFNBQVM7aUJBQ04sUUFBUSxFQUFFO2lCQUNWLE1BQU0sQ0FBQyxHQUFHLENBQUM7aUJBQ1gsRUFBRSxDQUFDLDRDQUE0QyxDQUFDO2lCQUNoRCxjQUFjLENBQUMsVUFBVSxDQUFDO2lCQUMxQixrQkFBa0IsQ0FBQyxDQUFDLENBQUM7aUJBQ3JCLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNaLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7WUFDOUMsTUFBTSxFQUFFLEdBQUcsTUFBTSxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbkMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLGlCQUFpQixFQUFFLEVBQUUsUUFBUSxDQUFDLDZCQUE2QixDQUFDLENBQUM7UUFDL0UsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsbUNBQW1DLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDakQsTUFBTSxTQUFTLEdBQUcsSUFBQSx1QkFBVSxFQUFDLE9BQU8sQ0FBdUIsQ0FBQztZQUM1RCxTQUFTLENBQUMsR0FBRyxDQUFDO2dCQUNaLEdBQUcsRUFBRSxZQUFZO2dCQUNqQixRQUFRLEVBQUUsVUFBVTthQUNyQixDQUFDLENBQUM7WUFDSCxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3JCLFNBQVMsQ0FBQyxJQUFJLENBQUMsMEJBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNyQyxTQUFTLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ3BDLE1BQU0sZUFBZSxHQUFHLFNBQVMsQ0FBQyxRQUFRLEVBQXFCLENBQUM7WUFDaEUsZUFBZTtpQkFDWixNQUFNLENBQUMsR0FBRyxDQUFDO2lCQUNYLEVBQUUsQ0FBQyw0Q0FBNEMsQ0FBQztpQkFDaEQsY0FBYyxDQUFDLFVBQVUsQ0FBQztpQkFDMUIsa0JBQWtCLENBQUMsQ0FBQyxDQUFDO2lCQUNyQixHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDWixTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1lBQzlDLE1BQU0sRUFBRSxHQUFHLE1BQU0sU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ25DLGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdkMsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsa0NBQWtDLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDaEQsTUFBTSxTQUFTLEdBQUcsSUFBQSx1QkFBVSxFQUFDLE9BQU8sQ0FBdUIsQ0FBQztZQUM1RCxTQUFTLENBQUMsR0FBRyxDQUFDO2dCQUNaLEdBQUcsRUFBRSxZQUFZO2dCQUNqQixRQUFRLEVBQUUsVUFBVTthQUNyQixDQUFDLENBQUM7WUFDSCxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3JCLFNBQVMsQ0FBQyxJQUFJLENBQUMsMEJBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNyQyxTQUFTLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ3BDLE1BQU0sZUFBZSxHQUFHLFNBQVMsQ0FBQyxRQUFRLEVBQXFCLENBQUM7WUFDaEUsZUFBZTtpQkFDWixNQUFNLENBQUMsR0FBRyxDQUFDO2lCQUNYLEVBQUUsQ0FBQyw0Q0FBNEMsQ0FBQztpQkFDaEQsY0FBYyxDQUFDLFVBQVUsQ0FBQztpQkFDMUIsa0JBQWtCLENBQUMsQ0FBQyxDQUFDO2lCQUNyQixHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDWixTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1lBQzlDLE1BQU0sRUFBRSxHQUFHLE1BQU0sU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ25DLGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDNUMsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsMEJBQTBCLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDeEMsTUFBTSxTQUFTLEdBQUcsNENBQTRDLENBQUM7WUFDL0QsTUFBTSxlQUFlLEdBQUcsNENBQTRDLENBQUM7WUFDckUsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDO1lBQ3JCLFNBQVMsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDcEMsU0FBUztpQkFDTixRQUFRLEVBQUU7aUJBQ1YsSUFBSSxDQUFDLE1BQU0sQ0FBQztpQkFDWixNQUFNLENBQUMsTUFBTSxDQUFDO2lCQUNkLEVBQUUsQ0FBQyxTQUFTLENBQUM7aUJBQ2IsY0FBYyxDQUFDLFVBQVUsQ0FBQztpQkFDMUIsa0JBQWtCLENBQUMsQ0FBQyxDQUFDO2lCQUNyQixHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDWixTQUFTLENBQUMsSUFBSSxDQUFDO2dCQUNiLEdBQUcsRUFBRSxRQUFRLENBQUMsV0FBVzthQUMxQixDQUFDLENBQUM7WUFDSCxNQUFNLEVBQUUsR0FBRyxNQUFNLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNuQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxRQUFRLENBQUMsdUJBQXVCLENBQUMsQ0FBQztZQUN2RSxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNyQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNsQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxlQUFlLENBQUMsQ0FBQztZQUNwRCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztZQUN6QyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztZQUV4QyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNuQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMvQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztZQUMxQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztZQUV6QyxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsSUFBQSx3QkFBa0IsRUFBQyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDM0QsTUFBTSxhQUFhLEdBQUcsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLENBQUM7WUFFM0MsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNsRCxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDbkYsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUN6RCxNQUFNLFNBQVMsR0FBRyxJQUFJLGFBQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztZQUM3RCxPQUFPLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFDMUUsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsMkNBQTJDLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDekQsTUFBTSxTQUFTLEdBQUcsSUFBSSx3QkFBa0IsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDN0QsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsdUJBQXVCLENBQUMsQ0FBQztZQUNqRCxNQUFNLEVBQUUsR0FBRyxNQUFNLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNuQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxRQUFRLENBQUMsdUJBQXVCLENBQUMsQ0FBQztZQUV2RSxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsSUFBQSx3QkFBa0IsRUFBQyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDM0QsTUFBTSxhQUFhLEdBQUcsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLENBQUM7WUFFM0MsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNsRCxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDbEYsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUN6RCxNQUFNLFNBQVMsR0FBRyxJQUFJLGFBQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztZQUM3RCxPQUFPLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFDMUUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxnQ0FBZ0MsRUFBRSxHQUFHLEVBQUU7UUFDOUMsQ0FBQztZQUNDLE1BQU0sVUFBVSxHQUFHO2dCQUNqQixDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsd0JBQXdCLENBQUM7Z0JBQzdDLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyx5QkFBeUIsQ0FBQzthQUNoRCxDQUFDO1lBRUYsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxFQUFFLEVBQUU7Z0JBQ25DLEVBQUUsQ0FBQywrREFBK0QsT0FBTyxTQUFTLEVBQUUsS0FBSyxJQUFJLEVBQUU7b0JBQzdGLE1BQU0sU0FBUyxHQUFHLElBQUEsdUJBQVUsRUFBQyxPQUFPLENBQXVCLENBQUM7b0JBQzVELFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBQ3ZCLE1BQU0sUUFBUSxHQUFHLE1BQU0sU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO29CQUN6QyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDckQsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFFRCxFQUFFLENBQUMsd0RBQXdELEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDdEUsTUFBTSxTQUFTLEdBQUcsSUFBQSx1QkFBVSxFQUFDLE9BQU8sQ0FBdUIsQ0FBQztZQUM1RCxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO1lBQ3ZELE1BQU0sUUFBUSxHQUFHLE1BQU0sU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3pDLGdCQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLFFBQVEsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO1FBQ3JGLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRyYW5zYWN0aW9uVHlwZSwgQmFzZVRyYW5zYWN0aW9uIH0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCB7IGNvaW5zLCBFdGhlcmV1bU5ldHdvcmsgfSBmcm9tICdAYml0Z28vc3RhdGljcyc7XG5pbXBvcnQgRXRoZXJldW1BYmkgZnJvbSAnZXRoZXJldW1qcy1hYmknO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHNob3VsZCBmcm9tICdzaG91bGQnO1xuaW1wb3J0ICogYXMgZXRoVXRpbCBmcm9tICdldGhlcmV1bWpzLXV0aWwnO1xuXG5pbXBvcnQge1xuICBkZWNvZGVUcmFuc2ZlckRhdGEsXG4gIGdldENvbW1vbixcbiAgVHJhbnNhY3Rpb24sXG4gIFRyYW5zYWN0aW9uQnVpbGRlcixcbiAgVHJhbnNmZXJCdWlsZGVyLFxuICBLZXlQYWlyLFxuICBzZW5kTXVsdGlTaWdUeXBlcyxcbn0gZnJvbSAnLi4vLi4vLi4vc3JjJztcbmltcG9ydCAqIGFzIHRlc3REYXRhIGZyb20gJy4uLy4uL3Jlc291cmNlcy9ldGgnO1xuaW1wb3J0IHsgZ2V0QnVpbGRlciB9IGZyb20gJy4uL2dldEJ1aWxkZXInO1xuXG5kZXNjcmliZSgnRXRoIHRyYW5zYWN0aW9uIGJ1aWxkZXIgc2VuZCcsICgpID0+IHtcbiAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBhIHNlbmQgdHlwZSB0cmFuc2FjdGlvbicsICgpID0+IHtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBnZXRCdWlsZGVyKCd0ZXRoJykgYXMgVHJhbnNhY3Rpb25CdWlsZGVyO1xuICAgIGNvbnN0IGNvaW5Db25maWcgPSBjb2lucy5nZXQoJ2V0aCcpO1xuICAgIGNvbnN0IGNvbW1vbiA9IGdldENvbW1vbihjb2luQ29uZmlnLm5ldHdvcmsgYXMgRXRoZXJldW1OZXR3b3JrKTtcbiAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihjb2luQ29uZmlnLCBjb21tb24pO1xuICAgIHR4QnVpbGRlci5jb3VudGVyKDEpO1xuICAgIHR4QnVpbGRlci50eXBlKFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IHR4QnVpbGRlci52YWxpZGF0ZVRyYW5zYWN0aW9uKHR4KSwgL0ludmFsaWQgdHJhbnNhY3Rpb246IG1pc3NpbmcgZmVlLyk7XG4gICAgdHhCdWlsZGVyLmZlZSh7XG4gICAgICBmZWU6ICcxMCcsXG4gICAgICBnYXNMaW1pdDogJzEwMDAnLFxuICAgIH0pO1xuICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdHhCdWlsZGVyLnZhbGlkYXRlVHJhbnNhY3Rpb24odHgpLCAvSW52YWxpZCB0cmFuc2FjdGlvbjogbWlzc2luZyBjb250cmFjdCBhZGRyZXNzLyk7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiB0eEJ1aWxkZXIudmFsaWRhdGVUcmFuc2FjdGlvbih0eCksIC9JbnZhbGlkIHRyYW5zYWN0aW9uOiBtaXNzaW5nIGNvbnRyYWN0IGFkZHJlc3MvKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3Nob3VsZCBzaWduIGFuZCBidWlsZCcsICgpID0+IHtcbiAgICBsZXQgdHhCdWlsZGVyO1xuICAgIGxldCBrZXk7XG4gICAgbGV0IGNvbnRyYWN0QWRkcmVzcztcblxuICAgIGNvbnN0IGdldE9wZXJhdGlvbkhhc2ggPSBmdW5jdGlvbiAodHg6IEJhc2VUcmFuc2FjdGlvbik6IHN0cmluZyB7XG4gICAgICBjb25zdCB7IGRhdGEgfSA9IHR4LnRvSnNvbigpO1xuICAgICAgY29uc3QgeyB0b2tlbkNvbnRyYWN0QWRkcmVzcywgZXhwaXJlVGltZSwgc2VxdWVuY2VJZCwgYW1vdW50LCB0byB9ID0gZGVjb2RlVHJhbnNmZXJEYXRhKGRhdGEpO1xuICAgICAgY29uc3Qgb3BlcmF0aW9uUGFyYW1zID0gW1xuICAgICAgICBbJ3N0cmluZycsICdhZGRyZXNzJywgJ3VpbnQnLCAnYWRkcmVzcycsICd1aW50JywgJ3VpbnQnXSxcbiAgICAgICAgW1xuICAgICAgICAgICdFUkMyMCcsXG4gICAgICAgICAgbmV3IGV0aFV0aWwuQk4oZXRoVXRpbC5zdHJpcEhleFByZWZpeCh0byksIDE2KSxcbiAgICAgICAgICBhbW91bnQsXG4gICAgICAgICAgbmV3IGV0aFV0aWwuQk4oZXRoVXRpbC5zdHJpcEhleFByZWZpeCh0b2tlbkNvbnRyYWN0QWRkcmVzcyB8fCAnJyksIDE2KSxcbiAgICAgICAgICBleHBpcmVUaW1lLFxuICAgICAgICAgIHNlcXVlbmNlSWQsXG4gICAgICAgIF0sXG4gICAgICBdO1xuICAgICAgcmV0dXJuIEV0aGVyZXVtQWJpLnNvbGlkaXR5U0hBMyguLi5vcGVyYXRpb25QYXJhbXMpO1xuICAgIH07XG5cbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgIGNvbnRyYWN0QWRkcmVzcyA9ICcweDhmOTc3ZTkxMmVmNTAwNTQ4YTBjM2JlNmRkZGU5ODk5ZjExOTliODEnO1xuICAgICAgdHhCdWlsZGVyID0gZ2V0QnVpbGRlcignaHRldGgnKSBhcyBUcmFuc2FjdGlvbkJ1aWxkZXI7XG4gICAgICBrZXkgPSB0ZXN0RGF0YS5LRVlQQUlSX1BSVi5nZXRLZXlzKCkucHJ2IGFzIHN0cmluZztcbiAgICAgIHR4QnVpbGRlci5mZWUoe1xuICAgICAgICBmZWU6ICcxMDAwMDAwMDAwJyxcbiAgICAgICAgZ2FzTGltaXQ6ICcxMjEwMDAwMCcsXG4gICAgICB9KTtcbiAgICAgIHR4QnVpbGRlci5jb3VudGVyKDIpO1xuICAgICAgdHhCdWlsZGVyLnR5cGUoVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuICAgICAgdHhCdWlsZGVyLmNvbnRyYWN0KGNvbnRyYWN0QWRkcmVzcyk7XG4gICAgfSk7XG5cbiAgICBpdCgnYSBzZW5kIGZ1bmRzIHRyYW5zYWN0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVjaXBpZW50ID0gJzB4MTk2NDUwMzJjN2YxNTMzMzk1ZDQ0YTYyOTQ2MmU3NTEwODRkM2U0Yyc7XG4gICAgICBjb25zdCBhbW91bnQgPSAnMTAwMDAwMDAwMCc7XG4gICAgICBjb25zdCBleHBpcmVUaW1lID0gMTU5MDA2NjcyODtcbiAgICAgIGNvbnN0IHNlcXVlbmNlSWQgPSA1O1xuICAgICAgdHhCdWlsZGVyXG4gICAgICAgIC50cmFuc2ZlcigpXG4gICAgICAgIC5hbW91bnQoYW1vdW50KVxuICAgICAgICAudG8ocmVjaXBpZW50KVxuICAgICAgICAuZXhwaXJhdGlvblRpbWUoZXhwaXJlVGltZSlcbiAgICAgICAgLmNvbnRyYWN0U2VxdWVuY2VJZChzZXF1ZW5jZUlkKVxuICAgICAgICAua2V5KGtleSk7XG4gICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEuUFJJVkFURV9LRVkgfSk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuXG4gICAgICBzaG91bGQuZXF1YWwodHgudG9Kc29uKCkuY2hhaW5JZCwgNTYwMDQ4KTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC50b0Jyb2FkY2FzdEZvcm1hdCgpLCB0ZXN0RGF0YS5TRU5EX1RYX0JST0FEQ0FTVF9MRUdBQ1kpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnNpZ25hdHVyZS5sZW5ndGgsIDIpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LmlucHV0cy5sZW5ndGgsIDEpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LmlucHV0c1swXS5hZGRyZXNzLCBjb250cmFjdEFkZHJlc3MpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LmlucHV0c1swXS52YWx1ZSwgYW1vdW50KTtcblxuICAgICAgc2hvdWxkLmVxdWFsKHR4Lm91dHB1dHMubGVuZ3RoLCAxKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5vdXRwdXRzWzBdLmFkZHJlc3MsIHJlY2lwaWVudCk7XG4gICAgICBzaG91bGQuZXF1YWwodHgub3V0cHV0c1swXS52YWx1ZSwgYW1vdW50KTtcblxuICAgICAgY29uc3QgZGF0YSA9IHR4LnRvSnNvbigpLmRhdGE7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHRvLFxuICAgICAgICBhbW91bnQ6IHBhcnNlZEFtb3VudCxcbiAgICAgICAgZXhwaXJlVGltZTogcGFyc2VkRXhwaXJlVGltZSxcbiAgICAgICAgc2VxdWVuY2VJZDogcGFyc2VkU2VxdWVuY2VJZCxcbiAgICAgIH0gPSBkZWNvZGVUcmFuc2ZlckRhdGEoZGF0YSk7XG4gICAgICBzaG91bGQuZXF1YWwodG8sIHJlY2lwaWVudCk7XG4gICAgICBzaG91bGQuZXF1YWwocGFyc2VkQW1vdW50LCBhbW91bnQpO1xuICAgICAgc2hvdWxkLmVxdWFsKHBhcnNlZEV4cGlyZVRpbWUsIGV4cGlyZVRpbWUpO1xuICAgICAgc2hvdWxkLmVxdWFsKHBhcnNlZFNlcXVlbmNlSWQsIHNlcXVlbmNlSWQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2Egc2VuZCBmdW5kcyB0cmFuc2FjdGlvbiBidWlsdCBmb3IgYSBmaXJzdCBzaWduZXInLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZWNpcGllbnQgPSAnMHgxOTY0NTAzMmM3ZjE1MzMzOTVkNDRhNjI5NDYyZTc1MTA4NGQzZTRjJztcbiAgICAgIGNvbnN0IGFtb3VudCA9ICcxMDAwMDAwMDAwJztcbiAgICAgIGNvbnN0IGV4cGlyZVRpbWUgPSAxNTkwMDY2NzI4O1xuICAgICAgY29uc3Qgc2VxdWVuY2VJZCA9IDU7XG4gICAgICB0eEJ1aWxkZXIuZmVlKHtcbiAgICAgICAgZWlwMTU1OToge1xuICAgICAgICAgIG1heEZlZVBlckdhczogJzEwMCcsXG4gICAgICAgICAgbWF4UHJpb3JpdHlGZWVQZXJHYXM6ICcxMCcsXG4gICAgICAgIH0sXG4gICAgICAgIGZlZTogJzEwJyxcbiAgICAgICAgZ2FzTGltaXQ6ICcxMDAwJyxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgdHJhbnNmZXI6IFRyYW5zZmVyQnVpbGRlciA9IHR4QnVpbGRlci50cmFuc2ZlcigpO1xuICAgICAgdHJhbnNmZXJcbiAgICAgICAgLmFtb3VudChhbW91bnQpXG4gICAgICAgIC50byhyZWNpcGllbnQpXG4gICAgICAgIC5leHBpcmF0aW9uVGltZShleHBpcmVUaW1lKVxuICAgICAgICAuY29udHJhY3RTZXF1ZW5jZUlkKHNlcXVlbmNlSWQpXG4gICAgICAgIC5pc0ZpcnN0U2lnbmVyKHRydWUpO1xuICAgICAgY29uc3QgdHg6IFRyYW5zYWN0aW9uID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG5cbiAgICAgIGNvbnN0IG1ldGhvZElkID0gRXRoZXJldW1BYmkubWV0aG9kSUQoJ3NlbmRNdWx0aVNpZycsIHNlbmRNdWx0aVNpZ1R5cGVzKTtcbiAgICAgIGNvbnN0IGRlY29kZWREYXRhID0gRXRoZXJldW1BYmkucmF3RGVjb2RlKFxuICAgICAgICBbJ3N0cmluZycsICdhZGRyZXNzJywgJ3VpbnQnLCAnYnl0ZXMnLCAndWludCcsICd1aW50J10sXG4gICAgICAgIEJ1ZmZlci5mcm9tKGV0aFV0aWwuc3RyaXBIZXhQcmVmaXgodHgudG9Kc29uKCkuZGF0YSkuc2xpY2UobWV0aG9kSWQudG9TdHJpbmcoJ2hleCcpLmxlbmd0aCwgLTIpLCAnaGV4JylcbiAgICAgICk7XG5cbiAgICAgIHNob3VsZC5lcXVhbChkZWNvZGVkRGF0YVswXSwgJ0VUSEVSJyk7XG4gICAgICBzaG91bGQuZXF1YWwoZGVjb2RlZERhdGFbMV0sIGV0aFV0aWwuc3RyaXBIZXhQcmVmaXgocmVjaXBpZW50KSk7XG4gICAgICBzaG91bGQuZXF1YWwoZGVjb2RlZERhdGFbMl0udG9TdHJpbmcoKSwgYW1vdW50KTtcbiAgICAgIHNob3VsZC5lcXVhbChkZWNvZGVkRGF0YVszXS50b1N0cmluZygnaGV4JyksICcnKTtcbiAgICAgIHNob3VsZC5lcXVhbChkZWNvZGVkRGF0YVs0XS50b1N0cmluZygpLCBleHBpcmVUaW1lKTtcbiAgICAgIHNob3VsZC5lcXVhbChkZWNvZGVkRGF0YVs1XS50b1N0cmluZygpLCBzZXF1ZW5jZUlkKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC50b0pzb24oKS5jaGFpbklkLCA1NjAwNDgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCksIHRlc3REYXRhLlNFTkRfVFhfQlJPQURDQVNUX1JFQ09WRVJZKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5zaWduYXR1cmUubGVuZ3RoLCAwKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5pbnB1dHMubGVuZ3RoLCAxKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5pbnB1dHNbMF0uYWRkcmVzcywgY29udHJhY3RBZGRyZXNzKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5pbnB1dHNbMF0udmFsdWUsIGFtb3VudCk7XG5cbiAgICAgIHNob3VsZC5lcXVhbCh0eC5vdXRwdXRzLmxlbmd0aCwgMSk7XG4gICAgICBzaG91bGQuZXF1YWwodHgub3V0cHV0c1swXS5hZGRyZXNzLCByZWNpcGllbnQpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4Lm91dHB1dHNbMF0udmFsdWUsIGFtb3VudCk7XG5cbiAgICAgIGNvbnN0IGRhdGEgPSB0eC50b0pzb24oKS5kYXRhO1xuICAgICAgY29uc3Qge1xuICAgICAgICB0byxcbiAgICAgICAgYW1vdW50OiBwYXJzZWRBbW91bnQsXG4gICAgICAgIGV4cGlyZVRpbWU6IHBhcnNlZEV4cGlyZVRpbWUsXG4gICAgICAgIHNlcXVlbmNlSWQ6IHBhcnNlZFNlcXVlbmNlSWQsXG4gICAgICB9ID0gZGVjb2RlVHJhbnNmZXJEYXRhKGRhdGEsIHRydWUpO1xuICAgICAgc2hvdWxkLmVxdWFsKHRvLCByZWNpcGllbnQpO1xuICAgICAgc2hvdWxkLmVxdWFsKHBhcnNlZEFtb3VudCwgYW1vdW50KTtcbiAgICAgIHNob3VsZC5lcXVhbChwYXJzZWRFeHBpcmVUaW1lLCBleHBpcmVUaW1lKTtcbiAgICAgIHNob3VsZC5lcXVhbChwYXJzZWRTZXF1ZW5jZUlkLCBzZXF1ZW5jZUlkKTtcbiAgICAgIC8vIEFkZCBzaWduYXR1cmUgZnJvbSBmaXJzdCBzaWduZXJcbiAgICAgIHRyYW5zZmVyLnNldFNpZ25hdHVyZSgnMHgxMjM0NTY3ODkwYWJjZGVmJykuaXNGaXJzdFNpZ25lcihmYWxzZSk7XG4gICAgICBjb25zdCBzaWduZWRUeCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3Qge1xuICAgICAgICB0bzogdG9TaWduZWQsXG4gICAgICAgIGFtb3VudDogcGFyc2VkQW1vdW50U2lnbmVkLFxuICAgICAgICBleHBpcmVUaW1lOiBwYXJzZWRFeHBpcmVUaW1lU2lnbmVkLFxuICAgICAgICBzZXF1ZW5jZUlkOiBwYXJzZWRTZXF1ZW5jZUlkU2lnbmVkLFxuICAgICAgICBzaWduYXR1cmUsXG4gICAgICB9ID0gZGVjb2RlVHJhbnNmZXJEYXRhKHNpZ25lZFR4LnRvSnNvbigpLmRhdGEpO1xuICAgICAgc2hvdWxkLmVxdWFsKHRvU2lnbmVkLCByZWNpcGllbnQpO1xuICAgICAgc2hvdWxkLmVxdWFsKHBhcnNlZEFtb3VudFNpZ25lZCwgYW1vdW50KTtcbiAgICAgIHNob3VsZC5lcXVhbChwYXJzZWRFeHBpcmVUaW1lU2lnbmVkLCBleHBpcmVUaW1lKTtcbiAgICAgIHNob3VsZC5lcXVhbChwYXJzZWRTZXF1ZW5jZUlkU2lnbmVkLCBzZXF1ZW5jZUlkKTtcbiAgICAgIHNob3VsZC5lcXVhbChzaWduYXR1cmUsICcweDEyMzQ1Njc4OTBhYmNkZWYnKTtcblxuICAgICAgY29uc3QgZnJvbVNlcmlhbGl6ZWRUeEJ1aWxkZXIgPSBnZXRCdWlsZGVyKCdodGV0aCcpIGFzIFRyYW5zYWN0aW9uQnVpbGRlcjtcbiAgICAgIGZyb21TZXJpYWxpemVkVHhCdWlsZGVyLmZyb20odGVzdERhdGEuU0VORF9UWF9CUk9BRENBU1RfUkVDT1ZFUlksIHRydWUpO1xuICAgICAgY29uc3QgZnJvbVNlcmlhbGl6ZWRUeCA9IGF3YWl0IGZyb21TZXJpYWxpemVkVHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHRvOiB0b0Zyb21TZXJpYWxpemVkLFxuICAgICAgICBhbW91bnQ6IGFtb3VudEZyb21TZXJpYWxpemVkLFxuICAgICAgICBleHBpcmVUaW1lOiBleHBpcmVUaW1lRnJvbVNlcmlhbGl6ZWQsXG4gICAgICAgIHNlcXVlbmNlSWQ6IHNlcXVlbmNlSWRGcm9tU2VyaWFsaXplZCxcbiAgICAgIH0gPSBkZWNvZGVUcmFuc2ZlckRhdGEoZnJvbVNlcmlhbGl6ZWRUeC50b0pzb24oKS5kYXRhLCB0cnVlKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0b0Zyb21TZXJpYWxpemVkLCByZWNpcGllbnQpO1xuICAgICAgc2hvdWxkLmVxdWFsKGFtb3VudEZyb21TZXJpYWxpemVkLCBhbW91bnQpO1xuICAgICAgc2hvdWxkLmVxdWFsKGV4cGlyZVRpbWVGcm9tU2VyaWFsaXplZCwgZXhwaXJlVGltZSk7XG4gICAgICBzaG91bGQuZXF1YWwoc2VxdWVuY2VJZEZyb21TZXJpYWxpemVkLCBzZXF1ZW5jZUlkKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc2VuZCBmdW5kcyBmb3Igd2FsbGV0IHZlcnNpb24gNCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlY2lwaWVudCA9ICcweDE5NjQ1MDMyYzdmMTUzMzM5NWQ0NGE2Mjk0NjJlNzUxMDg0ZDNlNGMnO1xuICAgICAgY29uc3QgYW1vdW50ID0gJzEwMDAwMDAwMDAnO1xuICAgICAgY29uc3QgZXhwaXJlVGltZSA9IDE1OTAwNjY3Mjg7XG4gICAgICBjb25zdCBzZXF1ZW5jZUlkID0gNTtcbiAgICAgIHR4QnVpbGRlci53YWxsZXRWZXJzaW9uKDQpO1xuICAgICAgdHhCdWlsZGVyXG4gICAgICAgIC50cmFuc2ZlcigpXG4gICAgICAgIC5hbW91bnQoYW1vdW50KVxuICAgICAgICAudG8ocmVjaXBpZW50KVxuICAgICAgICAuZXhwaXJhdGlvblRpbWUoZXhwaXJlVGltZSlcbiAgICAgICAgLmNvbnRyYWN0U2VxdWVuY2VJZChzZXF1ZW5jZUlkKVxuICAgICAgICAua2V5KGtleSk7XG4gICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEuUFJJVkFURV9LRVkgfSk7XG4gICAgICBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IG9wZXJhdGlvbkRhdGEgPSB0eEJ1aWxkZXIudHJhbnNmZXIoKS5nZXRPcGVyYXRpb25EYXRhKCk7XG4gICAgICBzaG91bGQuZXF1YWwob3BlcmF0aW9uRGF0YVsxXVswXSwgJzU2MDA0OCcpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4QnVpbGRlci5jb2luVXNlc05vblBhY2tlZEVuY29kaW5nRm9yVHhEYXRhKCksIHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2Egc2VuZCBmdW5kcyB3aXRoIGFtb3VudCAwIHRyYW5zYWN0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgdHhCdWlsZGVyXG4gICAgICAgIC50cmFuc2ZlcigpXG4gICAgICAgIC5hbW91bnQoJzAnKVxuICAgICAgICAudG8oJzB4MTk2NDUwMzJjN2YxNTMzMzk1ZDQ0YTYyOTQ2MmU3NTEwODRkM2U0YycpXG4gICAgICAgIC5leHBpcmF0aW9uVGltZSgxNTkwMDY2NzI4KVxuICAgICAgICAuY29udHJhY3RTZXF1ZW5jZUlkKDUpXG4gICAgICAgIC5rZXkoa2V5KTtcbiAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5QUklWQVRFX0tFWSB9KTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBzaG91bGQuZXF1YWwodHgudG9Ccm9hZGNhc3RGb3JtYXQoKSwgdGVzdERhdGEuU0VORF9UWF9BTU9VTlRfWkVST19CUk9BRENBU1QpO1xuICAgIH0pO1xuXG4gICAgaXQoJ0dvZXJsaSBjaGFpbiBpZCBzaG91bGQgYmUgY29ycmVjdCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGdldEJ1aWxkZXIoJ2d0ZXRoJykgYXMgVHJhbnNhY3Rpb25CdWlsZGVyO1xuICAgICAgdHhCdWlsZGVyLmZlZSh7XG4gICAgICAgIGZlZTogJzEwMDAwMDAwMDAnLFxuICAgICAgICBnYXNMaW1pdDogJzEyMTAwMDAwJyxcbiAgICAgIH0pO1xuICAgICAgdHhCdWlsZGVyLmNvdW50ZXIoMik7XG4gICAgICB0eEJ1aWxkZXIudHlwZShUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgICB0eEJ1aWxkZXIuY29udHJhY3QoY29udHJhY3RBZGRyZXNzKTtcbiAgICAgIGNvbnN0IHRyYW5zZmVyQnVpbGRlciA9IHR4QnVpbGRlci50cmFuc2ZlcigpIGFzIFRyYW5zZmVyQnVpbGRlcjtcbiAgICAgIHRyYW5zZmVyQnVpbGRlclxuICAgICAgICAuYW1vdW50KCcwJylcbiAgICAgICAgLnRvKCcweDE5NjQ1MDMyYzdmMTUzMzM5NWQ0NGE2Mjk0NjJlNzUxMDg0ZDNlNGMnKVxuICAgICAgICAuZXhwaXJhdGlvblRpbWUoMTU5MDA2NjcyOClcbiAgICAgICAgLmNvbnRyYWN0U2VxdWVuY2VJZCg1KVxuICAgICAgICAua2V5KGtleSk7XG4gICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEuUFJJVkFURV9LRVkgfSk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnRvSnNvbigpLmNoYWluSWQsIDUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ0hvb2RpIGNoYWluIGlkIHNob3VsZCBiZSBjb3JyZWN0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZ2V0QnVpbGRlcignaHRldGgnKSBhcyBUcmFuc2FjdGlvbkJ1aWxkZXI7XG4gICAgICB0eEJ1aWxkZXIuZmVlKHtcbiAgICAgICAgZmVlOiAnMTAwMDAwMDAwMCcsXG4gICAgICAgIGdhc0xpbWl0OiAnMTIxMDAwMDAnLFxuICAgICAgfSk7XG4gICAgICB0eEJ1aWxkZXIuY291bnRlcigyKTtcbiAgICAgIHR4QnVpbGRlci50eXBlKFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcbiAgICAgIHR4QnVpbGRlci5jb250cmFjdChjb250cmFjdEFkZHJlc3MpO1xuICAgICAgY29uc3QgdHJhbnNmZXJCdWlsZGVyID0gdHhCdWlsZGVyLnRyYW5zZmVyKCkgYXMgVHJhbnNmZXJCdWlsZGVyO1xuICAgICAgdHJhbnNmZXJCdWlsZGVyXG4gICAgICAgIC5hbW91bnQoJzAnKVxuICAgICAgICAudG8oJzB4MTk2NDUwMzJjN2YxNTMzMzk1ZDQ0YTYyOTQ2MmU3NTEwODRkM2U0YycpXG4gICAgICAgIC5leHBpcmF0aW9uVGltZSgxNTkwMDY2NzI4KVxuICAgICAgICAuY29udHJhY3RTZXF1ZW5jZUlkKDUpXG4gICAgICAgIC5rZXkoa2V5KTtcbiAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5QUklWQVRFX0tFWSB9KTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBzaG91bGQuZXF1YWwodHgudG9Kc29uKCkuY2hhaW5JZCwgNTYwMDQ4KTtcbiAgICB9KTtcblxuICAgIGl0KCdhIHNlbmQgdG9rZW4gdHJhbnNhY3Rpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZWNpcGllbnQgPSAnMHg3MmMyYzhlMDhiZjkxZDc1NWNkN2QyNmI0OWEyZWUzZGM5OWRlMWI5JztcbiAgICAgIGNvbnN0IGNvbnRyYWN0QWRkcmVzcyA9ICcweGRmN2RlY2IxYmFhOGY1MjlmMGM4OTgyY2JiNGJlNTAzNTcxOTUyOTknO1xuICAgICAgY29uc3QgYW1vdW50ID0gJzEwMCc7XG4gICAgICB0eEJ1aWxkZXIuY29udHJhY3QoY29udHJhY3RBZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlclxuICAgICAgICAudHJhbnNmZXIoKVxuICAgICAgICAuY29pbigndHJpZicpXG4gICAgICAgIC5hbW91bnQoYW1vdW50KVxuICAgICAgICAudG8ocmVjaXBpZW50KVxuICAgICAgICAuZXhwaXJhdGlvblRpbWUoMTU5MDA2NjcyOClcbiAgICAgICAgLmNvbnRyYWN0U2VxdWVuY2VJZCg1KVxuICAgICAgICAua2V5KGtleSk7XG4gICAgICB0eEJ1aWxkZXIuc2lnbih7XG4gICAgICAgIGtleTogdGVzdERhdGEuUFJJVkFURV9LRVksXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBzaG91bGQuZXF1YWwodHgudG9Ccm9hZGNhc3RGb3JtYXQoKSwgdGVzdERhdGEuU0VORF9UT0tFTl9UWF9CUk9BRENBU1QpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnNpZ25hdHVyZS5sZW5ndGgsIDIpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LmlucHV0cy5sZW5ndGgsIDEpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LmlucHV0c1swXS5hZGRyZXNzLCBjb250cmFjdEFkZHJlc3MpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LmlucHV0c1swXS52YWx1ZSwgYW1vdW50KTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5pbnB1dHNbMF0uY29pbiwgJ3RyaWYnKTtcblxuICAgICAgc2hvdWxkLmVxdWFsKHR4Lm91dHB1dHMubGVuZ3RoLCAxKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5vdXRwdXRzWzBdLmFkZHJlc3MsIHJlY2lwaWVudCk7XG4gICAgICBzaG91bGQuZXF1YWwodHgub3V0cHV0c1swXS52YWx1ZSwgYW1vdW50KTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5vdXRwdXRzWzBdLmNvaW4sICd0cmlmJyk7XG5cbiAgICAgIGNvbnN0IHsgc2lnbmF0dXJlIH0gPSBkZWNvZGVUcmFuc2ZlckRhdGEodHgudG9Kc29uKCkuZGF0YSk7XG4gICAgICBjb25zdCBvcGVyYXRpb25IYXNoID0gZ2V0T3BlcmF0aW9uSGFzaCh0eCk7XG5cbiAgICAgIGNvbnN0IHsgdiwgciwgcyB9ID0gZXRoVXRpbC5mcm9tUnBjU2lnKHNpZ25hdHVyZSk7XG4gICAgICBjb25zdCBzZW5kZXJQdWJLZXkgPSBldGhVdGlsLmVjcmVjb3ZlcihCdWZmZXIuZnJvbShvcGVyYXRpb25IYXNoLCAnaGV4JyksIHYsIHIsIHMpO1xuICAgICAgY29uc3Qgc2VuZGVyQWRkcmVzcyA9IGV0aFV0aWwucHViVG9BZGRyZXNzKHNlbmRlclB1YktleSk7XG4gICAgICBjb25zdCBzZW5kZXJLZXkgPSBuZXcgS2V5UGFpcih7IHBydjogdGVzdERhdGEuUFJJVkFURV9LRVkgfSk7XG4gICAgICBldGhVdGlsLmJ1ZmZlclRvSGV4KHNlbmRlckFkZHJlc3MpLnNob3VsZC5lcXVhbChzZW5kZXJLZXkuZ2V0QWRkcmVzcygpKTtcbiAgICB9KTtcblxuICAgIGl0KCdhIHNlbmQgdG9rZW4gdHJhbnNhY3Rpb25zIGZyb20gc2VyaWFsaXplZCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXIoY29pbnMuZ2V0KCdodGV0aCcpKTtcbiAgICAgIHR4QnVpbGRlci5mcm9tKHRlc3REYXRhLlNFTkRfVE9LRU5fVFhfQlJPQURDQVNUKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBzaG91bGQuZXF1YWwodHgudG9Ccm9hZGNhc3RGb3JtYXQoKSwgdGVzdERhdGEuU0VORF9UT0tFTl9UWF9CUk9BRENBU1QpO1xuXG4gICAgICBjb25zdCB7IHNpZ25hdHVyZSB9ID0gZGVjb2RlVHJhbnNmZXJEYXRhKHR4LnRvSnNvbigpLmRhdGEpO1xuICAgICAgY29uc3Qgb3BlcmF0aW9uSGFzaCA9IGdldE9wZXJhdGlvbkhhc2godHgpO1xuXG4gICAgICBjb25zdCB7IHYsIHIsIHMgfSA9IGV0aFV0aWwuZnJvbVJwY1NpZyhzaWduYXR1cmUpO1xuICAgICAgY29uc3Qgc2VuZGVyUHViS2V5ID0gZXRoVXRpbC5lY3JlY292ZXIoQnVmZmVyLmZyb20ob3BlcmF0aW9uSGFzaCB8fCAnJyksIHYsIHIsIHMpO1xuICAgICAgY29uc3Qgc2VuZGVyQWRkcmVzcyA9IGV0aFV0aWwucHViVG9BZGRyZXNzKHNlbmRlclB1YktleSk7XG4gICAgICBjb25zdCBzZW5kZXJLZXkgPSBuZXcgS2V5UGFpcih7IHBydjogdGVzdERhdGEuUFJJVkFURV9LRVkgfSk7XG4gICAgICBldGhVdGlsLmJ1ZmZlclRvSGV4KHNlbmRlckFkZHJlc3MpLnNob3VsZC5lcXVhbChzZW5kZXJLZXkuZ2V0QWRkcmVzcygpKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3NpZ24gYW5kIGJ1aWxkIGZyb20gc2VyaWFsaXplZCcsICgpID0+IHtcbiAgICB7XG4gICAgICBjb25zdCB0ZXN0UGFyYW1zID0gW1xuICAgICAgICBbJ0xlZ2FjeScsIHRlc3REYXRhLlNFTkRfVFhfQlJPQURDQVNUX0xFR0FDWV0sXG4gICAgICAgIFsnRUlQMTU1OScsIHRlc3REYXRhLlNFTkRfVFhfQlJPQURDQVNUX0VJUDE1NTldLFxuICAgICAgXTtcblxuICAgICAgdGVzdFBhcmFtcy5tYXAoKFt0eG5UeXBlLCB0eG5IZXhdKSA9PiB7XG4gICAgICAgIGl0KGBzaG91bGQgYmUgYWJsZSB0byBjcmVhdGUgYSBzZW5kIHRyYW5zYWN0aW9uIGZyb20gc2VyaWFsaXplZCAke3R4blR5cGV9IHR4IGhleGAsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBnZXRCdWlsZGVyKCdodGV0aCcpIGFzIFRyYW5zYWN0aW9uQnVpbGRlcjtcbiAgICAgICAgICB0eEJ1aWxkZXIuZnJvbSh0eG5IZXgpO1xuICAgICAgICAgIGNvbnN0IHNpZ25lZFR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICAgICAgc2hvdWxkLmVxdWFsKHNpZ25lZFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCksIHR4bkhleCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaXQoJ2Egc2VuZCBmdW5kcyB0cmFuc2FjdGlvbiB3aXRoIGFtb3VudCAwIGZyb20gc2VyaWFsaXplZCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGdldEJ1aWxkZXIoJ2h0ZXRoJykgYXMgVHJhbnNhY3Rpb25CdWlsZGVyO1xuICAgICAgdHhCdWlsZGVyLmZyb20odGVzdERhdGEuU0VORF9UWF9BTU9VTlRfWkVST19CUk9BRENBU1QpO1xuICAgICAgY29uc3Qgc2lnbmVkVHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHNob3VsZC5lcXVhbChzaWduZWRUeC50b0Jyb2FkY2FzdEZvcm1hdCgpLCB0ZXN0RGF0YS5TRU5EX1RYX0FNT1VOVF9aRVJPX0JST0FEQ0FTVCk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=sendNFT.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sendNFT.d.ts","sourceRoot":"","sources":["../../../../test/unit/transactionBuilder/sendNFT.ts"],"names":[],"mappings":""}