@bitgo-beta/abstract-substrate 1.0.1-beta.585 → 1.0.1-beta.586

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 (44) hide show
  1. package/dist/tsconfig.tsbuildinfo +1 -1
  2. package/package.json +5 -5
  3. package/dist/src/abstractSubstrateCoin.d.ts +0 -95
  4. package/dist/src/abstractSubstrateCoin.d.ts.map +0 -1
  5. package/dist/src/abstractSubstrateCoin.js +0 -435
  6. package/dist/src/index.d.ts +0 -3
  7. package/dist/src/index.d.ts.map +0 -1
  8. package/dist/src/index.js +0 -21
  9. package/dist/src/lib/constants.d.ts +0 -2
  10. package/dist/src/lib/constants.d.ts.map +0 -1
  11. package/dist/src/lib/constants.js +0 -5
  12. package/dist/src/lib/errors.d.ts +0 -8
  13. package/dist/src/lib/errors.d.ts.map +0 -1
  14. package/dist/src/lib/errors.js +0 -19
  15. package/dist/src/lib/iface.d.ts +0 -250
  16. package/dist/src/lib/iface.d.ts.map +0 -1
  17. package/dist/src/lib/iface.js +0 -83
  18. package/dist/src/lib/index.d.ts +0 -12
  19. package/dist/src/lib/index.d.ts.map +0 -1
  20. package/dist/src/lib/index.js +0 -61
  21. package/dist/src/lib/keyPair.d.ts +0 -31
  22. package/dist/src/lib/keyPair.d.ts.map +0 -1
  23. package/dist/src/lib/keyPair.js +0 -110
  24. package/dist/src/lib/nativeTransferBuilder.d.ts +0 -61
  25. package/dist/src/lib/nativeTransferBuilder.d.ts.map +0 -1
  26. package/dist/src/lib/nativeTransferBuilder.js +0 -150
  27. package/dist/src/lib/singletonRegistry.d.ts +0 -8
  28. package/dist/src/lib/singletonRegistry.d.ts.map +0 -1
  29. package/dist/src/lib/singletonRegistry.js +0 -20
  30. package/dist/src/lib/transaction.d.ts +0 -74
  31. package/dist/src/lib/transaction.d.ts.map +0 -1
  32. package/dist/src/lib/transaction.js +0 -553
  33. package/dist/src/lib/transactionBuilder.d.ts +0 -121
  34. package/dist/src/lib/transactionBuilder.d.ts.map +0 -1
  35. package/dist/src/lib/transactionBuilder.js +0 -334
  36. package/dist/src/lib/transferBuilder.d.ts +0 -6
  37. package/dist/src/lib/transferBuilder.d.ts.map +0 -1
  38. package/dist/src/lib/transferBuilder.js +0 -11
  39. package/dist/src/lib/txnSchema.d.ts +0 -12
  40. package/dist/src/lib/txnSchema.d.ts.map +0 -1
  41. package/dist/src/lib/txnSchema.js +0 -71
  42. package/dist/src/lib/utils.d.ts +0 -139
  43. package/dist/src/lib/utils.d.ts.map +0 -1
  44. package/dist/src/lib/utils.js +0 -281
@@ -1,553 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- var __importDefault = (this && this.__importDefault) || function (mod) {
36
- return (mod && mod.__esModule) ? mod : { "default": mod };
37
- };
38
- Object.defineProperty(exports, "__esModule", { value: true });
39
- exports.Transaction = void 0;
40
- const sdk_core_1 = require("@bitgo-beta/sdk-core");
41
- const keyring_1 = __importStar(require("@polkadot/keyring"));
42
- const util_1 = require("@polkadot/util");
43
- const txwrapper_polkadot_1 = require("@substrate/txwrapper-polkadot");
44
- const keyPair_1 = require("./keyPair");
45
- const utils_1 = __importDefault(require("./utils"));
46
- const Extrinsic_1 = require("@polkadot/types/extrinsic/v4/Extrinsic");
47
- const constants_1 = require("./constants");
48
- class Transaction extends sdk_core_1.BaseTransaction {
49
- constructor(coinConfig) {
50
- super(coinConfig);
51
- }
52
- /** @inheritdoc */
53
- canSign({ key }) {
54
- const kp = new keyPair_1.KeyPair({ prv: key });
55
- const addr = kp.getAddress(this.getAddressFormat());
56
- return addr === this._sender;
57
- }
58
- /**
59
- * Sign a substrate transaction and update the transaction hex
60
- *
61
- * @param {KeyPair} keyPair - ed signature
62
- */
63
- sign(keyPair) {
64
- if (!this._substrateTransaction) {
65
- throw new sdk_core_1.InvalidTransactionError('No transaction data to sign');
66
- }
67
- const { prv, pub } = keyPair.getKeys();
68
- if (!prv) {
69
- throw new sdk_core_1.SigningError('Missing private key');
70
- }
71
- const signingPayload = txwrapper_polkadot_1.construct.signingPayload(this._substrateTransaction, {
72
- registry: this._registry,
73
- });
74
- // Sign a payload. This operation should be performed on an offline device.
75
- const keyring = new keyring_1.default({ type: 'ed25519' });
76
- const secretKey = new Uint8Array(Buffer.from(prv, 'hex'));
77
- const publicKey = new Uint8Array(Buffer.from(pub, 'hex'));
78
- const signingKeyPair = keyring.addFromPair({ secretKey, publicKey });
79
- const txHex = utils_1.default.createSignedTx(signingKeyPair, signingPayload, this._substrateTransaction, {
80
- metadataRpc: this._substrateTransaction.metadataRpc,
81
- registry: this._registry,
82
- });
83
- // get signature from signed txHex generated above
84
- this._signatures = [utils_1.default.recoverSignatureFromRawTx(txHex, { registry: this._registry })];
85
- this._signedTransaction = txHex;
86
- }
87
- /**
88
- * Adds the signature to the Substrate Transaction
89
- * @param {string} signature
90
- */
91
- addSignature(signature) {
92
- this._signedTransaction = utils_1.default.serializeSignedTransaction(this._substrateTransaction, signature, this._substrateTransaction.metadataRpc, this._registry);
93
- }
94
- /**
95
- * Returns a serialized representation of this transaction with a fake signature attached which
96
- * can be used to estimate transaction fees.
97
- */
98
- fakeSign() {
99
- return utils_1.default.serializeSignedTransaction(this._substrateTransaction, Transaction.FAKE_SIGNATURE, this._substrateTransaction.metadataRpc, this._registry);
100
- }
101
- registry(registry) {
102
- this._registry = registry;
103
- }
104
- chainName(chainName) {
105
- this._chainName = chainName;
106
- }
107
- sender(sender) {
108
- this._sender = sender;
109
- }
110
- /** @inheritdoc */
111
- toBroadcastFormat() {
112
- if (!this._substrateTransaction) {
113
- throw new sdk_core_1.InvalidTransactionError('Empty transaction');
114
- }
115
- if (this._signedTransaction && this._signedTransaction.length > 0) {
116
- return this._signedTransaction;
117
- }
118
- else {
119
- return txwrapper_polkadot_1.construct.signingPayload(this._substrateTransaction, {
120
- registry: this._registry,
121
- });
122
- }
123
- }
124
- transactionSize() {
125
- return this.toBroadcastFormat().length / 2;
126
- }
127
- /** @inheritdoc */
128
- toJson() {
129
- if (!this._substrateTransaction) {
130
- throw new sdk_core_1.InvalidTransactionError('Empty transaction');
131
- }
132
- const decodedTx = (0, txwrapper_polkadot_1.decode)(this._substrateTransaction, {
133
- metadataRpc: this._substrateTransaction.metadataRpc,
134
- registry: this._registry,
135
- isImmortalEra: utils_1.default.isZeroHex(this._substrateTransaction.era),
136
- });
137
- const result = {
138
- id: txwrapper_polkadot_1.construct.txHash(this.toBroadcastFormat()),
139
- sender: decodedTx.address,
140
- referenceBlock: decodedTx.blockHash,
141
- blockNumber: decodedTx.blockNumber,
142
- genesisHash: decodedTx.genesisHash,
143
- nonce: decodedTx.nonce,
144
- specVersion: decodedTx.specVersion,
145
- transactionVersion: decodedTx.transactionVersion,
146
- eraPeriod: decodedTx.eraPeriod,
147
- chainName: this._chainName,
148
- tip: decodedTx.tip ? Number(decodedTx.tip) : 0,
149
- };
150
- const txMethod = decodedTx.method.args;
151
- if (this.type === sdk_core_1.TransactionType.Send) {
152
- if (utils_1.default.isTransfer(txMethod)) {
153
- const keypairDest = new keyPair_1.KeyPair({
154
- pub: Buffer.from((0, keyring_1.decodeAddress)(txMethod.dest.id)).toString('hex'),
155
- });
156
- result.to = keypairDest.getAddress(this.getAddressFormat());
157
- result.amount = txMethod.value;
158
- }
159
- else if (utils_1.default.isTransferAll(txMethod)) {
160
- const keypairDest = new keyPair_1.KeyPair({
161
- pub: Buffer.from((0, keyring_1.decodeAddress)(txMethod.dest.id)).toString('hex'),
162
- });
163
- result.to = keypairDest.getAddress(this.getAddressFormat());
164
- result.keepAlive = txMethod.keepAlive;
165
- }
166
- else {
167
- throw new sdk_core_1.ParseTransactionError(`Serializing unknown Transfer type parameters`);
168
- }
169
- }
170
- else if (this.type === sdk_core_1.TransactionType.StakingActivate) {
171
- if (utils_1.default.isAddStake(txMethod)) {
172
- const keypairDest = new keyPair_1.KeyPair({
173
- pub: Buffer.from((0, keyring_1.decodeAddress)(txMethod.hotkey)).toString('hex'),
174
- });
175
- // hotkey address of validator
176
- result.to = keypairDest.getAddress(this.getAddressFormat());
177
- result.amount = txMethod.amountStaked.toString();
178
- result.netuid = txMethod.netuid;
179
- }
180
- else if (utils_1.default.isBond(txMethod)) {
181
- result.amount = txMethod.value;
182
- result.payee = typeof txMethod.payee === 'string' ? txMethod.payee : txMethod.payee.Account;
183
- }
184
- else if (utils_1.default.isBondExtra(txMethod)) {
185
- result.amount = txMethod.maxAdditional;
186
- }
187
- }
188
- else if (this.type === sdk_core_1.TransactionType.StakingDeactivate) {
189
- if (utils_1.default.isRemoveStake(txMethod)) {
190
- const keypairDest = new keyPair_1.KeyPair({
191
- pub: Buffer.from((0, keyring_1.decodeAddress)(txMethod.hotkey)).toString('hex'),
192
- });
193
- // hotkey address of validator
194
- result.to = keypairDest.getAddress(this.getAddressFormat());
195
- result.amount = txMethod.amountUnstaked.toString();
196
- result.netuid = txMethod.netuid;
197
- }
198
- else if (utils_1.default.isUnbond(txMethod)) {
199
- result.amount = txMethod.value;
200
- }
201
- else if (utils_1.default.isWithdrawUnbonded(txMethod)) {
202
- result.numSlashingSpans = txMethod.numSlashingSpans;
203
- }
204
- }
205
- else if (this.type === sdk_core_1.TransactionType.Batch) {
206
- if (utils_1.default.isBatch(txMethod)) {
207
- result.batchCalls = txMethod.calls;
208
- // Extract amount from batch calls for display
209
- if (txMethod.calls && txMethod.calls.length === 2) {
210
- const firstCall = txMethod.calls[0];
211
- const secondCall = txMethod.calls[1];
212
- if (firstCall.method === 'bond' && secondCall.method === 'nominate') {
213
- // Staking batch: bond + nominate
214
- const bondArgs = firstCall.args;
215
- result.amount = bondArgs.value;
216
- }
217
- else if (firstCall.method === 'chill' && secondCall.method === 'unbond') {
218
- // Unstaking batch: chill + unbond
219
- const unbondArgs = secondCall.args;
220
- result.amount = unbondArgs.value;
221
- }
222
- }
223
- }
224
- }
225
- return result;
226
- }
227
- explainTransferTransaction(json, explanationResult) {
228
- return {
229
- ...explanationResult,
230
- outputs: [
231
- {
232
- address: json.to?.toString() || '',
233
- amount: json.amount?.toString() || '',
234
- },
235
- ],
236
- };
237
- }
238
- explainStakeTransaction(json, explanationResult) {
239
- return {
240
- ...explanationResult,
241
- outputs: [
242
- {
243
- address: json.to?.toString() || '',
244
- amount: json.amount?.toString() || '',
245
- },
246
- ],
247
- };
248
- }
249
- explainUnstakeTransaction(json, explanationResult) {
250
- return {
251
- ...explanationResult,
252
- outputs: [
253
- {
254
- address: json.sender.toString() || '',
255
- amount: json.amount?.toString() || '',
256
- },
257
- ],
258
- };
259
- }
260
- /** @inheritdoc */
261
- explainTransaction() {
262
- const result = this.toJson();
263
- const outputs = [];
264
- const explanationResult = {
265
- // txhash used to identify the transactions
266
- id: result.id,
267
- outputAmount: result.amount?.toString() || '0',
268
- changeAmount: '0',
269
- changeOutputs: [],
270
- outputs,
271
- fee: {
272
- fee: result.tip?.toString() || '',
273
- type: 'tip',
274
- },
275
- type: this.type,
276
- };
277
- switch (this.type) {
278
- case sdk_core_1.TransactionType.Send:
279
- return this.explainTransferTransaction(result, explanationResult);
280
- case sdk_core_1.TransactionType.StakingActivate:
281
- return this.explainStakeTransaction(result, explanationResult);
282
- case sdk_core_1.TransactionType.StakingDeactivate:
283
- return this.explainUnstakeTransaction(result, explanationResult);
284
- default:
285
- throw new sdk_core_1.InvalidTransactionError('Transaction type not supported');
286
- }
287
- }
288
- /**
289
- * Load the input and output data on this transaction.
290
- */
291
- loadInputsAndOutputs() {
292
- if (!this._substrateTransaction) {
293
- return;
294
- }
295
- const decodedTx = (0, txwrapper_polkadot_1.decode)(this._substrateTransaction, {
296
- metadataRpc: this._substrateTransaction.metadataRpc,
297
- registry: this._registry,
298
- isImmortalEra: utils_1.default.isZeroHex(this._substrateTransaction.era),
299
- });
300
- if (this.type === sdk_core_1.TransactionType.Send) {
301
- this.decodeInputsAndOutputsForSend(decodedTx);
302
- }
303
- else if (this.type === sdk_core_1.TransactionType.StakingActivate) {
304
- this.decodeInputsAndOutputsForStakingActivate(decodedTx);
305
- }
306
- else if (this.type === sdk_core_1.TransactionType.StakingDeactivate) {
307
- this.decodeInputsAndOutputsForStakingDeactivate(decodedTx);
308
- }
309
- else if (this.type === sdk_core_1.TransactionType.Batch) {
310
- this.decodeInputsAndOutputsForBatch(decodedTx);
311
- }
312
- }
313
- decodeInputsAndOutputsForSend(decodedTx) {
314
- const txMethod = decodedTx.method.args;
315
- let to;
316
- let value;
317
- let from;
318
- if (utils_1.default.isTransferAll(txMethod)) {
319
- const keypairDest = new keyPair_1.KeyPair({
320
- pub: Buffer.from((0, keyring_1.decodeAddress)(txMethod.dest.id)).toString('hex'),
321
- });
322
- to = keypairDest.getAddress(this.getAddressFormat());
323
- value = '0'; // substrate transferAll's do not deserialize amounts
324
- from = decodedTx.address;
325
- }
326
- else if (utils_1.default.isTransfer(txMethod)) {
327
- const keypairDest = new keyPair_1.KeyPair({
328
- pub: Buffer.from((0, keyring_1.decodeAddress)(txMethod.dest.id)).toString('hex'),
329
- });
330
- to = keypairDest.getAddress(this.getAddressFormat());
331
- value = txMethod.value;
332
- from = decodedTx.address;
333
- }
334
- else {
335
- throw new sdk_core_1.ParseTransactionError(`Loading inputs of unknown Transfer type parameters`);
336
- }
337
- this._outputs = [
338
- {
339
- address: to,
340
- value,
341
- coin: this._coinConfig.name,
342
- },
343
- ];
344
- this._inputs = [
345
- {
346
- address: from,
347
- value,
348
- coin: this._coinConfig.name,
349
- },
350
- ];
351
- }
352
- decodeInputsAndOutputsForStakingActivate(decodedTx) {
353
- const txMethod = decodedTx.method.args;
354
- let to;
355
- let value;
356
- let from;
357
- if (utils_1.default.isAddStake(txMethod)) {
358
- const keypairDest = new keyPair_1.KeyPair({
359
- pub: Buffer.from((0, keyring_1.decodeAddress)(txMethod.hotkey)).toString('hex'),
360
- });
361
- to = keypairDest.getAddress(this.getAddressFormat());
362
- value = txMethod.amountStaked.toString();
363
- from = decodedTx.address;
364
- }
365
- else if (utils_1.default.isBond(txMethod)) {
366
- to = decodedTx.address; // For bond, funds are locked in the same account
367
- value = txMethod.value;
368
- from = decodedTx.address;
369
- }
370
- else if (utils_1.default.isBondExtra(txMethod)) {
371
- to = decodedTx.address; // For bond extra, funds are locked in the same account
372
- value = txMethod.maxAdditional;
373
- from = decodedTx.address;
374
- }
375
- else {
376
- throw new sdk_core_1.ParseTransactionError(`Loading inputs of unknown StakingActivate type parameters`);
377
- }
378
- this._outputs = [
379
- {
380
- address: to,
381
- value,
382
- coin: this._coinConfig.name,
383
- },
384
- ];
385
- this._inputs = [
386
- {
387
- address: from,
388
- value,
389
- coin: this._coinConfig.name,
390
- },
391
- ];
392
- }
393
- decodeInputsAndOutputsForStakingDeactivate(decodedTx) {
394
- const txMethod = decodedTx.method.args;
395
- let to;
396
- let value;
397
- let from;
398
- if (utils_1.default.isRemoveStake(txMethod)) {
399
- const keypairDest = new keyPair_1.KeyPair({
400
- pub: Buffer.from((0, keyring_1.decodeAddress)(txMethod.hotkey)).toString('hex'),
401
- });
402
- to = keypairDest.getAddress(this.getAddressFormat());
403
- value = txMethod.amountUnstaked.toString();
404
- from = decodedTx.address;
405
- }
406
- else if (utils_1.default.isUnbond(txMethod)) {
407
- to = decodedTx.address; // For unbond, funds are unlocked from the same account
408
- value = txMethod.value;
409
- from = decodedTx.address;
410
- }
411
- else if (utils_1.default.isWithdrawUnbonded(txMethod)) {
412
- to = decodedTx.address; // For withdraw unbonded, funds are returned to the same account
413
- value = '0'; // Amount is not specified in withdraw unbonded
414
- from = decodedTx.address;
415
- }
416
- else {
417
- throw new sdk_core_1.ParseTransactionError(`Loading inputs of unknown StakingDeactivate type parameters`);
418
- }
419
- this._outputs = [
420
- {
421
- address: from,
422
- value,
423
- coin: this._coinConfig.name,
424
- },
425
- ];
426
- this._inputs = [
427
- {
428
- address: to,
429
- value,
430
- coin: this._coinConfig.name,
431
- },
432
- ];
433
- }
434
- decodeInputsAndOutputsForBatch(decodedTx) {
435
- const txMethod = decodedTx.method.args;
436
- const sender = decodedTx.address;
437
- this._inputs = [];
438
- this._outputs = [];
439
- if (utils_1.default.isBatch(txMethod)) {
440
- if (!txMethod.calls) {
441
- throw new sdk_core_1.InvalidTransactionError('failed to decode calls from batch transaction');
442
- }
443
- // Handle different types of batch operations
444
- let totalStakingValue = '0';
445
- let hasStakingOperations = false;
446
- let hasUnstakingOperations = false;
447
- for (const call of txMethod.calls) {
448
- // Handle both possible formats: simple method names or callIndex with registry lookup
449
- let methodName;
450
- if (typeof call.method === 'string') {
451
- methodName = call.method;
452
- }
453
- else {
454
- try {
455
- const callIndex = call.method;
456
- const decodedCall = this._registry.findMetaCall(new Uint8Array(Buffer.from(callIndex.replace('0x', ''), 'hex')));
457
- methodName = decodedCall.method;
458
- }
459
- catch (e) {
460
- methodName = call.method;
461
- }
462
- }
463
- if (methodName === 'bond') {
464
- const args = call.args;
465
- const value = args.value || '0';
466
- totalStakingValue = value;
467
- hasStakingOperations = true;
468
- }
469
- else if (methodName === 'chill') {
470
- hasUnstakingOperations = true;
471
- }
472
- else if (methodName === 'unbond') {
473
- const args = call.args;
474
- const value = args.value || '0';
475
- totalStakingValue = value;
476
- hasUnstakingOperations = true;
477
- }
478
- }
479
- // For staking batch operations (bond + nominate or bondExtra + nominate)
480
- if (hasStakingOperations && !hasUnstakingOperations) {
481
- this._inputs.push({
482
- address: sender,
483
- value: totalStakingValue,
484
- coin: this._coinConfig.name,
485
- });
486
- this._outputs.push({
487
- address: sender, // For staking, funds are locked in the same account
488
- value: totalStakingValue,
489
- coin: this._coinConfig.name,
490
- });
491
- }
492
- // For unstaking batch operations (chill + unbond)
493
- else if (hasUnstakingOperations && !hasStakingOperations) {
494
- this._inputs.push({
495
- address: sender,
496
- value: totalStakingValue,
497
- coin: this._coinConfig.name,
498
- });
499
- this._outputs.push({
500
- address: sender, // For unstaking, funds are unlocked from the same account
501
- value: totalStakingValue,
502
- coin: this._coinConfig.name,
503
- });
504
- }
505
- }
506
- }
507
- /**
508
- * Constructs a signed payload using construct.signTx
509
- * This method will be called during the build step if a TSS signature
510
- * is added and will set the signTransaction which is the txHex that will be broadcasted
511
- * As well as add the signature used to sign to the signature array in hex format
512
- *
513
- * @param {Buffer} signature The signature to be added to a substrate transaction
514
- */
515
- constructSignedPayload(signature) {
516
- // 0x00 means its an ED25519 signature
517
- const edSignature = `0x00${signature.toString('hex')}`;
518
- try {
519
- this._signedTransaction = txwrapper_polkadot_1.construct.signedTx(this._substrateTransaction, edSignature, {
520
- registry: this._registry,
521
- metadataRpc: this._substrateTransaction.metadataRpc,
522
- });
523
- }
524
- catch (e) {
525
- throw new sdk_core_1.SigningError(`Unable to sign transaction with signature ${edSignature} ` + e);
526
- }
527
- this._signatures = [signature.toString('hex')];
528
- }
529
- setTransaction(tx) {
530
- this._substrateTransaction = tx;
531
- }
532
- /** @inheritdoc **/
533
- get signablePayload() {
534
- const extrinsicPayload = this._registry.createType('ExtrinsicPayload', this._substrateTransaction, {
535
- version: Extrinsic_1.EXTRINSIC_VERSION,
536
- });
537
- return (0, util_1.u8aToBuffer)(extrinsicPayload.toU8a({ method: true }));
538
- }
539
- /**
540
- * Set the transaction type.
541
- *
542
- * @param {TransactionType} transactionType The transaction type to be set.
543
- */
544
- transactionType(transactionType) {
545
- this._type = transactionType;
546
- }
547
- getAddressFormat() {
548
- return constants_1.DEFAULT_SUBSTRATE_PREFIX;
549
- }
550
- }
551
- exports.Transaction = Transaction;
552
- Transaction.FAKE_SIGNATURE = `0x${Buffer.from(new Uint8Array(256).fill(1)).toString('hex')}`;
553
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG1EQVE4QjtBQUU5Qiw2REFBMkQ7QUFDM0QseUNBQTZDO0FBQzdDLHNFQUFrRTtBQUdsRSx1Q0FBb0M7QUFFcEMsb0RBQTRCO0FBQzVCLHNFQUEyRTtBQUMzRSwyQ0FBdUQ7QUFFdkQsTUFBYSxXQUFZLFNBQVEsMEJBQWU7SUFTOUMsWUFBWSxVQUFnQztRQUMxQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDcEIsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixPQUFPLENBQUMsRUFBRSxHQUFHLEVBQVc7UUFDdEIsTUFBTSxFQUFFLEdBQUcsSUFBSSxpQkFBTyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDckMsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO1FBQ3BELE9BQU8sSUFBSSxLQUFLLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDL0IsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxJQUFJLENBQUMsT0FBZ0I7UUFDbkIsSUFBSSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1lBQ2hDLE1BQU0sSUFBSSxrQ0FBdUIsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO1FBQ25FLENBQUM7UUFDRCxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUN2QyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDVCxNQUFNLElBQUksdUJBQVksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ2hELENBQUM7UUFDRCxNQUFNLGNBQWMsR0FBRyw4QkFBUyxD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QUcsRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFFRCxtQkFBbUI7SUFDbkIsSUFBSSxlQUFlO1FBQ2pCLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLHFCQUFxQixFQUFFO1lBQ2pHLE9BQU8sRUFBRSw2QkFBaUI7U0FDM0IsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxJQUFBLGtCQUFXLEVBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGVBQWUsQ0FBQyxlQUFnQztRQUM5QyxJQUFJLENBQUMsS0FBSyxHQUFHLGVBQWUsQ0FBQztJQUMvQixDQUFDO0lBRVMsZ0JBQWdCO1FBQ3hCLE9BQU8sb0NBQXdCLENBQUM7SUFDbEMsQ0FBQzs7QUFyaEJILGtDQXNoQkM7QUEvZ0JnQiwwQkFBYyxHQUFHLEtBQUssTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQWUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEJhc2VLZXksXG4gIEJhc2VUcmFuc2FjdGlvbixcbiAgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IsXG4gIFBhcnNlVHJhbnNhY3Rpb25FcnJvcixcbiAgU2lnbmluZ0Vycm9yLFxuICBUcmFuc2FjdGlvblJlY2lwaWVudCxcbiAgVHJhbnNhY3Rpb25UeXBlLFxufSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBCYXNlQ29pbiBhcyBDb2luQ29uZmlnIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgS2V5cmluZywgeyBkZWNvZGVBZGRyZXNzIH0gZnJvbSAnQHBvbGthZG90L2tleXJpbmcnO1xuaW1wb3J0IHsgdThhVG9CdWZmZXIgfSBmcm9tICdAcG9sa2Fkb3QvdXRpbCc7XG5pbXBvcnQgeyBjb25zdHJ1Y3QsIGRlY29kZSB9IGZyb20gJ0BzdWJzdHJhdGUvdHh3cmFwcGVyLXBvbGthZG90JztcbmltcG9ydCB7IFVuc2lnbmVkVHJhbnNhY3Rpb24gfSBmcm9tICdAc3Vic3RyYXRlL3R4d3JhcHBlci1jb3JlJztcbmltcG9ydCB7IFR5cGVSZWdpc3RyeSB9IGZyb20gJ0BzdWJzdHJhdGUvdHh3cmFwcGVyLWNvcmUvbGliL3R5cGVzJztcbmltcG9ydCB7IEtleVBhaXIgfSBmcm9tICcuL2tleVBhaXInO1xuaW1wb3J0IHsgRGVjb2RlZFR4LCBIZXhTdHJpbmcsIFRyYW5zYWN0aW9uRXhwbGFuYXRpb24sIFR4RGF0YSB9IGZyb20gJy4vaWZhY2UnO1xuaW1wb3J0IHV0aWxzIGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgRVhUUklOU0lDX1ZFUlNJT04gfSBmcm9tICdAcG9sa2Fkb3QvdHlwZXMvZXh0cmluc2ljL3Y0L0V4dHJpbnNpYyc7XG5pbXBvcnQgeyBERUZBVUxUX1NVQlNUUkFURV9QUkVGSVggfSBmcm9tICcuL2NvbnN0YW50cyc7XG5cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbiBleHRlbmRzIEJhc2VUcmFuc2FjdGlvbiB7XG4gIHByb3RlY3RlZCBfc3Vic3RyYXRlVHJhbnNhY3Rpb246IFVuc2lnbmVkVHJhbnNhY3Rpb247XG4gIHByb3RlY3RlZCBfc2lnbmVkVHJhbnNhY3Rpb24/OiBzdHJpbmc7XG4gIHByb3RlY3RlZCBfcmVnaXN0cnk6IFR5cGVSZWdpc3RyeTtcbiAgcHJvdGVjdGVkIF9jaGFpbk5hbWU6IHN0cmluZztcbiAgcHJvdGVjdGVkIF9zZW5kZXI6IHN0cmluZztcblxuICBwcml2YXRlIHN0YXRpYyBGQUtFX1NJR05BVFVSRSA9IGAweCR7QnVmZmVyLmZyb20obmV3IFVpbnQ4QXJyYXkoMjU2KS5maWxsKDEpKS50b1N0cmluZygnaGV4Jyl9YCBhcyBIZXhTdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoY29pbkNvbmZpZzogUmVhZG9ubHk8Q29pbkNvbmZpZz4pIHtcbiAgICBzdXBlcihjb2luQ29uZmlnKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBjYW5TaWduKHsga2V5IH06IEJhc2VLZXkpOiBib29sZWFuIHtcbiAgICBjb25zdCBrcCA9IG5ldyBLZXlQYWlyKHsgcHJ2OiBrZXkgfSk7XG4gICAgY29uc3QgYWRkciA9IGtwLmdldEFkZHJlc3ModGhpcy5nZXRBZGRyZXNzRm9ybWF0KCkpO1xuICAgIHJldHVybiBhZGRyID09PSB0aGlzLl9zZW5kZXI7XG4gIH1cblxuICAvKipcbiAgICogU2lnbiBhIHN1YnN0cmF0ZSB0cmFuc2FjdGlvbiBhbmQgdXBkYXRlIHRoZSB0cmFuc2FjdGlvbiBoZXhcbiAgICpcbiAgICogQHBhcmFtIHtLZXlQYWlyfSBrZXlQYWlyIC0gZWQgc2lnbmF0dXJlXG4gICAqL1xuICBzaWduKGtleVBhaXI6IEtleVBhaXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3N1YnN0cmF0ZVRyYW5zYWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ05vIHRyYW5zYWN0aW9uIGRhdGEgdG8gc2lnbicpO1xuICAgIH1cbiAgICBjb25zdCB7IHBydiwgcHViIH0gPSBrZXlQYWlyLmdldEtleXMoKTtcbiAgICBpZiAoIXBydikge1xuICAgICAgdGhyb3cgbmV3IFNpZ25pbmdFcnJvcignTWlzc2luZyBwcml2YXRlIGtleScpO1xuICAgIH1cbiAgICBjb25zdCBzaWduaW5nUGF5bG9hZCA9IGNvbnN0cnVjdC5zaWduaW5nUGF5bG9hZCh0aGlzLl9zdWJzdHJhdGVUcmFuc2FjdGlvbiwge1xuICAgICAgcmVnaXN0cnk6IHRoaXMuX3JlZ2lzdHJ5LFxuICAgIH0pO1xuICAgIC8vIFNpZ24gYSBwYXlsb2FkLiBUaGlzIG9wZXJhdGlvbiBzaG91bGQgYmUgcGVyZm9ybWVkIG9uIGFuIG9mZmxpbmUgZGV2aWNlLlxuICAgIGNvbnN0IGtleXJpbmcgPSBuZXcgS2V5cmluZyh7IHR5cGU6ICdlZDI1NTE5JyB9KTtcbiAgICBjb25zdCBzZWNyZXRLZXkgPSBuZXcgVWludDhBcnJheShCdWZmZXIuZnJvbShwcnYsICdoZXgnKSk7XG4gICAgY29uc3QgcHVibGljS2V5ID0gbmV3IFVpbnQ4QXJyYXkoQnVmZmVyLmZyb20ocHViLCAnaGV4JykpO1xuICAgIGNvbnN0IHNpZ25pbmdLZXlQYWlyID0ga2V5cmluZy5hZGRGcm9tUGFpcih7IHNlY3JldEtleSwgcHVibGljS2V5IH0pO1xuICAgIGNvbnN0IHR4SGV4ID0gdXRpbHMuY3JlYXRlU2lnbmVkVHgoc2lnbmluZ0tleVBhaXIsIHNpZ25pbmdQYXlsb2FkLCB0aGlzLl9zdWJzdHJhdGVUcmFuc2FjdGlvbiwge1xuICAgICAgbWV0YWRhdGFScGM6IHRoaXMuX3N1YnN0cmF0ZVRyYW5zYWN0aW9uLm1ldGFkYXRhUnBjLFxuICAgICAgcmVnaXN0cnk6IHRoaXMuX3JlZ2lzdHJ5LFxuICAgIH0pO1xuXG4gICAgLy8gZ2V0IHNpZ25hdHVyZSBmcm9tIHNpZ25lZCB0eEhleCBnZW5lcmF0ZWQgYWJvdmVcbiAgICB0aGlzLl9zaWduYXR1cmVzID0gW3V0aWxzLnJlY292ZXJTaWduYXR1cmVGcm9tUmF3VHgodHhIZXgsIHsgcmVnaXN0cnk6IHRoaXMuX3JlZ2lzdHJ5IH0pXTtcbiAgICB0aGlzLl9zaWduZWRUcmFuc2FjdGlvbiA9IHR4SGV4O1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgdGhlIHNpZ25hdHVyZSB0byB0aGUgU3Vic3RyYXRlIFRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzaWduYXR1cmVcbiAgICovXG4gIGFkZFNpZ25hdHVyZShzaWduYXR1cmU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuX3NpZ25lZFRyYW5zYWN0aW9uID0gdXRpbHMuc2VyaWFsaXplU2lnbmVkVHJhbnNhY3Rpb24oXG4gICAgICB0aGlzLl9zdWJzdHJhdGVUcmFuc2FjdGlvbixcbiAgICAgIHNpZ25hdHVyZSBhcyBIZXhTdHJpbmcsXG4gICAgICB0aGlzLl9zdWJzdHJhdGVUcmFuc2FjdGlvbi5tZXRhZGF0YVJwYyxcbiAgICAgIHRoaXMuX3JlZ2lzdHJ5XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgc2VyaWFsaXplZCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHRyYW5zYWN0aW9uIHdpdGggYSBmYWtlIHNpZ25hdHVyZSBhdHRhY2hlZCB3aGljaFxuICAgKiBjYW4gYmUgdXNlZCB0byBlc3RpbWF0ZSB0cmFuc2FjdGlvbiBmZWVzLlxuICAgKi9cbiAgZmFrZVNpZ24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdXRpbHMuc2VyaWFsaXplU2lnbmVkVHJhbnNhY3Rpb24oXG4gICAgICB0aGlzLl9zdWJzdHJhdGVUcmFuc2FjdGlvbixcbiAgICAgIFRyYW5zYWN0aW9uLkZBS0VfU0lHTkFUVVJFLFxuICAgICAgdGhpcy5fc3Vic3RyYXRlVHJhbnNhY3Rpb24ubWV0YWRhdGFScGMsXG4gICAgICB0aGlzLl9yZWdpc3RyeVxuICAgICk7XG4gIH1cblxuICByZWdpc3RyeShyZWdpc3RyeTogVHlwZVJlZ2lzdHJ5KTogdm9pZCB7XG4gICAgdGhpcy5fcmVnaXN0cnkgPSByZWdpc3RyeTtcbiAgfVxuXG4gIGNoYWluTmFtZShjaGFpbk5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuX2NoYWluTmFtZSA9IGNoYWluTmFtZTtcbiAgfVxuXG4gIHNlbmRlcihzZW5kZXI6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuX3NlbmRlciA9IHNlbmRlcjtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICB0b0Jyb2FkY2FzdEZvcm1hdCgpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5fc3Vic3RyYXRlVHJhbnNhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignRW1wdHkgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3NpZ25lZFRyYW5zYWN0aW9uICYmIHRoaXMuX3NpZ25lZFRyYW5zYWN0aW9uLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiB0aGlzLl9zaWduZWRUcmFuc2FjdGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGNvbnN0cnVjdC5zaWduaW5nUGF5bG9hZCh0aGlzLl9zdWJzdHJhdGVUcmFuc2FjdGlvbiwge1xuICAgICAgICByZWdpc3RyeTogdGhpcy5fcmVnaXN0cnksXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICB0cmFuc2FjdGlvblNpemUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy50b0Jyb2FkY2FzdEZvcm1hdCgpLmxlbmd0aCAvIDI7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdG9Kc29uKCk6IFR4RGF0YSB7XG4gICAgaWYgKCF0aGlzLl9zdWJzdHJhdGVUcmFuc2FjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdFbXB0eSB0cmFuc2FjdGlvbicpO1xuICAgIH1cbiAgICBjb25zdCBkZWNvZGVkVHggPSBkZWNvZGUodGhpcy5fc3Vic3RyYXRlVHJhbnNhY3Rpb24sIHtcbiAgICAgIG1ldGFkYXRhUnBjOiB0aGlzLl9zdWJzdHJhdGVUcmFuc2FjdGlvbi5tZXRhZGF0YVJwYyxcbiAgICAgIHJlZ2lzdHJ5OiB0aGlzLl9yZWdpc3RyeSxcbiAgICAgIGlzSW1tb3J0YWxFcmE6IHV0aWxzLmlzWmVyb0hleCh0aGlzLl9zdWJzdHJhdGVUcmFuc2FjdGlvbi5lcmEpLFxuICAgIH0pIGFzIHVua25vd24gYXMgRGVjb2RlZFR4O1xuXG4gICAgY29uc3QgcmVzdWx0OiBUeERhdGEgPSB7XG4gICAgICBpZDogY29uc3RydWN0LnR4SGFzaCh0aGlzLnRvQnJvYWRjYXN0Rm9ybWF0KCkpLFxuICAgICAgc2VuZGVyOiBkZWNvZGVkVHguYWRkcmVzcyxcbiAgICAgIHJlZmVyZW5jZUJsb2NrOiBkZWNvZGVkVHguYmxvY2tIYXNoLFxuICAgICAgYmxvY2tOdW1iZXI6IGRlY29kZWRUeC5ibG9ja051bWJlcixcbiAgICAgIGdlbmVzaXNIYXNoOiBkZWNvZGVkVHguZ2VuZXNpc0hhc2gsXG4gICAgICBub25jZTogZGVjb2RlZFR4Lm5vbmNlLFxuICAgICAgc3BlY1ZlcnNpb246IGRlY29kZWRUeC5zcGVjVmVyc2lvbixcbiAgICAgIHRyYW5zYWN0aW9uVmVyc2lvbjogZGVjb2RlZFR4LnRyYW5zYWN0aW9uVmVyc2lvbixcbiAgICAgIGVyYVBlcmlvZDogZGVjb2RlZFR4LmVyYVBlcmlvZCxcbiAgICAgIGNoYWluTmFtZTogdGhpcy5fY2hhaW5OYW1lLFxuICAgICAgdGlwOiBkZWNvZGVkVHgudGlwID8gTnVtYmVyKGRlY29kZWRUeC50aXApIDogMCxcbiAgICB9O1xuXG4gICAgY29uc3QgdHhNZXRob2QgPSBkZWNvZGVkVHgubWV0aG9kLmFyZ3M7XG4gICAgaWYgKHRoaXMudHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLlNlbmQpIHtcbiAgICAgIGlmICh1dGlscy5pc1RyYW5zZmVyKHR4TWV0aG9kKSkge1xuICAgICAgICBjb25zdCBrZXlwYWlyRGVzdCA9IG5ldyBLZXlQYWlyKHtcbiAgICAgICAgICBwdWI6IEJ1ZmZlci5mcm9tKGRlY29kZUFkZHJlc3ModHhNZXRob2QuZGVzdC5pZCkpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJlc3VsdC50byA9IGtleXBhaXJEZXN0LmdldEFkZHJlc3ModGhpcy5nZXRBZGRyZXNzRm9ybWF0KCkpO1xuICAgICAgICByZXN1bHQuYW1vdW50ID0gdHhNZXRob2QudmFsdWU7XG4gICAgICB9IGVsc2UgaWYgKHV0aWxzLmlzVHJhbnNmZXJBbGwodHhNZXRob2QpKSB7XG4gICAgICAgIGNvbnN0IGtleXBhaXJEZXN0ID0gbmV3IEtleVBhaXIoe1xuICAgICAgICAgIHB1YjogQnVmZmVyLmZyb20oZGVjb2RlQWRkcmVzcyh0eE1ldGhvZC5kZXN0LmlkKSkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICB9KTtcbiAgICAgICAgcmVzdWx0LnRvID0ga2V5cGFpckRlc3QuZ2V0QWRkcmVzcyh0aGlzLmdldEFkZHJlc3NGb3JtYXQoKSk7XG4gICAgICAgIHJlc3VsdC5rZWVwQWxpdmUgPSB0eE1ldGhvZC5rZWVwQWxpdmU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgUGFyc2VUcmFuc2FjdGlvbkVycm9yKGBTZXJpYWxpemluZyB1bmtub3duIFRyYW5zZmVyIHR5cGUgcGFyYW1ldGVyc2ApO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0FjdGl2YXRlKSB7XG4gICAgICBpZiAodXRpbHMuaXNBZGRTdGFrZSh0eE1ldGhvZCkpIHtcbiAgICAgICAgY29uc3Qga2V5cGFpckRlc3QgPSBuZXcgS2V5UGFpcih7XG4gICAgICAgICAgcHViOiBCdWZmZXIuZnJvbShkZWNvZGVBZGRyZXNzKHR4TWV0aG9kLmhvdGtleSkpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGhvdGtleSBhZGRyZXNzIG9mIHZhbGlkYXRvclxuICAgICAgICByZXN1bHQudG8gPSBrZXlwYWlyRGVzdC5nZXRBZGRyZXNzKHRoaXMuZ2V0QWRkcmVzc0Zvcm1hdCgpKTtcbiAgICAgICAgcmVzdWx0LmFtb3VudCA9IHR4TWV0aG9kLmFtb3VudFN0YWtlZC50b1N0cmluZygpO1xuICAgICAgICByZXN1bHQubmV0dWlkID0gdHhNZXRob2QubmV0dWlkO1xuICAgICAgfSBlbHNlIGlmICh1dGlscy5pc0JvbmQodHhNZXRob2QpKSB7XG4gICAgICAgIHJlc3VsdC5hbW91bnQgPSB0eE1ldGhvZC52YWx1ZTtcbiAgICAgICAgcmVzdWx0LnBheWVlID0gdHlwZW9mIHR4TWV0aG9kLnBheWVlID09PSAnc3RyaW5nJyA/IHR4TWV0aG9kLnBheWVlIDogdHhNZXRob2QucGF5ZWUuQWNjb3VudDtcbiAgICAgIH0gZWxzZSBpZiAodXRpbHMuaXNCb25kRXh0cmEodHhNZXRob2QpKSB7XG4gICAgICAgIHJlc3VsdC5hbW91bnQgPSB0eE1ldGhvZC5tYXhBZGRpdGlvbmFsO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0RlYWN0aXZhdGUpIHtcbiAgICAgIGlmICh1dGlscy5pc1JlbW92ZVN0YWtlKHR4TWV0aG9kKSkge1xuICAgICAgICBjb25zdCBrZXlwYWlyRGVzdCA9IG5ldyBLZXlQYWlyKHtcbiAgICAgICAgICBwdWI6IEJ1ZmZlci5mcm9tKGRlY29kZUFkZHJlc3ModHhNZXRob2QuaG90a2V5KSkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gaG90a2V5IGFkZHJlc3Mgb2YgdmFsaWRhdG9yXG4gICAgICAgIHJlc3VsdC50byA9IGtleXBhaXJEZXN0LmdldEFkZHJlc3ModGhpcy5nZXRBZGRyZXNzRm9ybWF0KCkpO1xuICAgICAgICByZXN1bHQuYW1vdW50ID0gdHhNZXRob2QuYW1vdW50VW5zdGFrZWQudG9TdHJpbmcoKTtcbiAgICAgICAgcmVzdWx0Lm5ldHVpZCA9IHR4TWV0aG9kLm5ldHVpZDtcbiAgICAgIH0gZWxzZSBpZiAodXRpbHMuaXNVbmJvbmQodHhNZXRob2QpKSB7XG4gICAgICAgIHJlc3VsdC5hbW91bnQgPSB0eE1ldGhvZC52YWx1ZTtcbiAgICAgIH0gZWxzZSBpZiAodXRpbHMuaXNXaXRoZHJhd1VuYm9uZGVkKHR4TWV0aG9kKSkge1xuICAgICAgICByZXN1bHQubnVtU2xhc2hpbmdTcGFucyA9IHR4TWV0aG9kLm51bVNsYXNoaW5nU3BhbnM7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5CYXRjaCkge1xuICAgICAgaWYgKHV0aWxzLmlzQmF0Y2godHhNZXRob2QpKSB7XG4gICAgICAgIHJlc3VsdC5iYXRjaENhbGxzID0gdHhNZXRob2QuY2FsbHM7XG4gICAgICAgIC8vIEV4dHJhY3QgYW1vdW50IGZyb20gYmF0Y2ggY2FsbHMgZm9yIGRpc3BsYXlcbiAgICAgICAgaWYgKHR4TWV0aG9kLmNhbGxzICYmIHR4TWV0aG9kLmNhbGxzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgIGNvbnN0IGZpcnN0Q2FsbCA9IHR4TWV0aG9kLmNhbGxzWzBdO1xuICAgICAgICAgIGNvbnN0IHNlY29uZENhbGwgPSB0eE1ldGhvZC5jYWxsc1sxXTtcbiAgICAgICAgICBpZiAoZmlyc3RDYWxsLm1ldGhvZCA9PT0gJ2JvbmQnICYmIHNlY29uZENhbGwubWV0aG9kID09PSAnbm9taW5hdGUnKSB7XG4gICAgICAgICAgICAvLyBTdGFraW5nIGJhdGNoOiBib25kICsgbm9taW5hdGVcbiAgICAgICAgICAgIGNvbnN0IGJvbmRBcmdzID0gZmlyc3RDYWxsLmFyZ3MgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgICAgICByZXN1bHQuYW1vdW50ID0gYm9uZEFyZ3MudmFsdWUgYXMgc3RyaW5nO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZmlyc3RDYWxsLm1ldGhvZCA9PT0gJ2NoaWxsJyAmJiBzZWNvbmRDYWxsLm1ldGhvZCA9PT0gJ3VuYm9uZCcpIHtcbiAgICAgICAgICAgIC8vIFVuc3Rha2luZyBiYXRjaDogY2hpbGwgKyB1bmJvbmRcbiAgICAgICAgICAgIGNvbnN0IHVuYm9uZEFyZ3MgPSBzZWNvbmRDYWxsLmFyZ3MgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgICAgICByZXN1bHQuYW1vdW50ID0gdW5ib25kQXJncy52YWx1ZSBhcyBzdHJpbmc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGV4cGxhaW5UcmFuc2ZlclRyYW5zYWN0aW9uKGpzb246IFR4RGF0YSwgZXhwbGFuYXRpb25SZXN1bHQ6IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24pOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uZXhwbGFuYXRpb25SZXN1bHQsXG4gICAgICBvdXRwdXRzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBhZGRyZXNzOiBqc29uLnRvPy50b1N0cmluZygpIHx8ICcnLFxuICAgICAgICAgIGFtb3VudDoganNvbi5hbW91bnQ/LnRvU3RyaW5nKCkgfHwgJycsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH07XG4gIH1cblxuICBleHBsYWluU3Rha2VUcmFuc2FjdGlvbihqc29uOiBUeERhdGEsIGV4cGxhbmF0aW9uUmVzdWx0OiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uKTogVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmV4cGxhbmF0aW9uUmVzdWx0LFxuICAgICAgb3V0cHV0czogW1xuICAgICAgICB7XG4gICAgICAgICAgYWRkcmVzczoganNvbi50bz8udG9TdHJpbmcoKSB8fCAnJyxcbiAgICAgICAgICBhbW91bnQ6IGpzb24uYW1vdW50Py50b1N0cmluZygpIHx8ICcnLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9O1xuICB9XG5cbiAgZXhwbGFpblVuc3Rha2VUcmFuc2FjdGlvbihqc29uOiBUeERhdGEsIGV4cGxhbmF0aW9uUmVzdWx0OiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uKTogVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmV4cGxhbmF0aW9uUmVzdWx0LFxuICAgICAgb3V0cHV0czogW1xuICAgICAgICB7XG4gICAgICAgICAgYWRkcmVzczoganNvbi5zZW5kZXIudG9TdHJpbmcoKSB8fCAnJyxcbiAgICAgICAgICBhbW91bnQ6IGpzb24uYW1vdW50Py50b1N0cmluZygpIHx8ICcnLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGV4cGxhaW5UcmFuc2FjdGlvbigpOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uIHtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLnRvSnNvbigpO1xuICAgIGNvbnN0IG91dHB1dHM6IFRyYW5zYWN0aW9uUmVjaXBpZW50W10gPSBbXTtcbiAgICBjb25zdCBleHBsYW5hdGlvblJlc3VsdDogVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiA9IHtcbiAgICAgIC8vIHR4aGFzaCB1c2VkIHRvIGlkZW50aWZ5IHRoZSB0cmFuc2FjdGlvbnNcbiAgICAgIGlkOiByZXN1bHQuaWQsXG4gICAgICBvdXRwdXRBbW91bnQ6IHJlc3VsdC5hbW91bnQ/LnRvU3RyaW5nKCkgfHwgJzAnLFxuICAgICAgY2hhbmdlQW1vdW50OiAnMCcsXG4gICAgICBjaGFuZ2VPdXRwdXRzOiBbXSxcbiAgICAgIG91dHB1dHMsXG4gICAgICBmZWU6IHtcbiAgICAgICAgZmVlOiByZXN1bHQudGlwPy50b1N0cmluZygpIHx8ICcnLFxuICAgICAgICB0eXBlOiAndGlwJyxcbiAgICAgIH0sXG4gICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgfTtcbiAgICBzd2l0Y2ggKHRoaXMudHlwZSkge1xuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuU2VuZDpcbiAgICAgICAgcmV0dXJuIHRoaXMuZXhwbGFpblRyYW5zZmVyVHJhbnNhY3Rpb24ocmVzdWx0LCBleHBsYW5hdGlvblJlc3VsdCk7XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQWN0aXZhdGU6XG4gICAgICAgIHJldHVybiB0aGlzLmV4cGxhaW5TdGFrZVRyYW5zYWN0aW9uKHJlc3VsdCwgZXhwbGFuYXRpb25SZXN1bHQpO1xuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0RlYWN0aXZhdGU6XG4gICAgICAgIHJldHVybiB0aGlzLmV4cGxhaW5VbnN0YWtlVHJhbnNhY3Rpb24ocmVzdWx0LCBleHBsYW5hdGlvblJlc3VsdCk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ1RyYW5zYWN0aW9uIHR5cGUgbm90IHN1cHBvcnRlZCcpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGRhdGEgb24gdGhpcyB0cmFuc2FjdGlvbi5cbiAgICovXG4gIGxvYWRJbnB1dHNBbmRPdXRwdXRzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fc3Vic3RyYXRlVHJhbnNhY3Rpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZGVjb2RlZFR4ID0gZGVjb2RlKHRoaXMuX3N1YnN0cmF0ZVRyYW5zYWN0aW9uLCB7XG4gICAgICBtZXRhZGF0YVJwYzogdGhpcy5fc3Vic3RyYXRlVHJhbnNhY3Rpb24ubWV0YWRhdGFScGMsXG4gICAgICByZWdpc3RyeTogdGhpcy5fcmVnaXN0cnksXG4gICAgICBpc0ltbW9ydGFsRXJhOiB1dGlscy5pc1plcm9IZXgodGhpcy5fc3Vic3RyYXRlVHJhbnNhY3Rpb24uZXJhKSxcbiAgICB9KSBhcyB1bmtub3duIGFzIERlY29kZWRUeDtcblxuICAgIGlmICh0aGlzLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5TZW5kKSB7XG4gICAgICB0aGlzLmRlY29kZUlucHV0c0FuZE91dHB1dHNGb3JTZW5kKGRlY29kZWRUeCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQWN0aXZhdGUpIHtcbiAgICAgIHRoaXMuZGVjb2RlSW5wdXRzQW5kT3V0cHV0c0ZvclN0YWtpbmdBY3RpdmF0ZShkZWNvZGVkVHgpO1xuICAgIH0gZWxzZSBpZiAodGhpcy50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0RlYWN0aXZhdGUpIHtcbiAgICAgIHRoaXMuZGVjb2RlSW5wdXRzQW5kT3V0cHV0c0ZvclN0YWtpbmdEZWFjdGl2YXRlKGRlY29kZWRUeCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5CYXRjaCkge1xuICAgICAgdGhpcy5kZWNvZGVJbnB1dHNBbmRPdXRwdXRzRm9yQmF0Y2goZGVjb2RlZFR4KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGRlY29kZUlucHV0c0FuZE91dHB1dHNGb3JTZW5kKGRlY29kZWRUeDogRGVjb2RlZFR4KSB7XG4gICAgY29uc3QgdHhNZXRob2QgPSBkZWNvZGVkVHgubWV0aG9kLmFyZ3M7XG4gICAgbGV0IHRvOiBzdHJpbmc7XG4gICAgbGV0IHZhbHVlOiBzdHJpbmc7XG4gICAgbGV0IGZyb206IHN0cmluZztcbiAgICBpZiAodXRpbHMuaXNUcmFuc2ZlckFsbCh0eE1ldGhvZCkpIHtcbiAgICAgIGNvbnN0IGtleXBhaXJEZXN0ID0gbmV3IEtleVBhaXIoe1xuICAgICAgICBwdWI6IEJ1ZmZlci5mcm9tKGRlY29kZUFkZHJlc3ModHhNZXRob2QuZGVzdC5pZCkpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIH0pO1xuICAgICAgdG8gPSBrZXlwYWlyRGVzdC5nZXRBZGRyZXNzKHRoaXMuZ2V0QWRkcmVzc0Zvcm1hdCgpKTtcbiAgICAgIHZhbHVlID0gJzAnOyAvLyBzdWJzdHJhdGUgdHJhbnNmZXJBbGwncyBkbyBub3QgZGVzZXJpYWxpemUgYW1vdW50c1xuICAgICAgZnJvbSA9IGRlY29kZWRUeC5hZGRyZXNzO1xuICAgIH0gZWxzZSBpZiAodXRpbHMuaXNUcmFuc2Zlcih0eE1ldGhvZCkpIHtcbiAgICAgIGNvbnN0IGtleXBhaXJEZXN0ID0gbmV3IEtleVBhaXIoe1xuICAgICAgICBwdWI6IEJ1ZmZlci5mcm9tKGRlY29kZUFkZHJlc3ModHhNZXRob2QuZGVzdC5pZCkpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIH0pO1xuICAgICAgdG8gPSBrZXlwYWlyRGVzdC5nZXRBZGRyZXNzKHRoaXMuZ2V0QWRkcmVzc0Zvcm1hdCgpKTtcbiAgICAgIHZhbHVlID0gdHhNZXRob2QudmFsdWU7XG4gICAgICBmcm9tID0gZGVjb2RlZFR4LmFkZHJlc3M7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZVRyYW5zYWN0aW9uRXJyb3IoYExvYWRpbmcgaW5wdXRzIG9mIHVua25vd24gVHJhbnNmZXIgdHlwZSBwYXJhbWV0ZXJzYCk7XG4gICAgfVxuICAgIHRoaXMuX291dHB1dHMgPSBbXG4gICAgICB7XG4gICAgICAgIGFkZHJlc3M6IHRvLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgY29pbjogdGhpcy5fY29pbkNvbmZpZy5uYW1lLFxuICAgICAgfSxcbiAgICBdO1xuXG4gICAgdGhpcy5faW5wdXRzID0gW1xuICAgICAge1xuICAgICAgICBhZGRyZXNzOiBmcm9tLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgY29pbjogdGhpcy5fY29pbkNvbmZpZy5uYW1lLFxuICAgICAgfSxcbiAgICBdO1xuICB9XG5cbiAgcHJpdmF0ZSBkZWNvZGVJbnB1dHNBbmRPdXRwdXRzRm9yU3Rha2luZ0FjdGl2YXRlKGRlY29kZWRUeDogRGVjb2RlZFR4KSB7XG4gICAgY29uc3QgdHhNZXRob2QgPSBkZWNvZGVkVHgubWV0aG9kLmFyZ3M7XG4gICAgbGV0IHRvOiBzdHJpbmc7XG4gICAgbGV0IHZhbHVlOiBzdHJpbmc7XG4gICAgbGV0IGZyb206IHN0cmluZztcbiAgICBpZiAodXRpbHMuaXNBZGRTdGFrZSh0eE1ldGhvZCkpIHtcbiAgICAgIGNvbnN0IGtleXBhaXJEZXN0ID0gbmV3IEtleVBhaXIoe1xuICAgICAgICBwdWI6IEJ1ZmZlci5mcm9tKGRlY29kZUFkZHJlc3ModHhNZXRob2QuaG90a2V5KSkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgfSk7XG4gICAgICB0byA9IGtleXBhaXJEZXN0LmdldEFkZHJlc3ModGhpcy5nZXRBZGRyZXNzRm9ybWF0KCkpO1xuICAgICAgdmFsdWUgPSB0eE1ldGhvZC5hbW91bnRTdGFrZWQudG9TdHJpbmcoKTtcbiAgICAgIGZyb20gPSBkZWNvZGVkVHguYWRkcmVzcztcbiAgICB9IGVsc2UgaWYgKHV0aWxzLmlzQm9uZCh0eE1ldGhvZCkpIHtcbiAgICAgIHRvID0gZGVjb2RlZFR4LmFkZHJlc3M7IC8vIEZvciBib25kLCBmdW5kcyBhcmUgbG9ja2VkIGluIHRoZSBzYW1lIGFjY291bnRcbiAgICAgIHZhbHVlID0gdHhNZXRob2QudmFsdWU7XG4gICAgICBmcm9tID0gZGVjb2RlZFR4LmFkZHJlc3M7XG4gICAgfSBlbHNlIGlmICh1dGlscy5pc0JvbmRFeHRyYSh0eE1ldGhvZCkpIHtcbiAgICAgIHRvID0gZGVjb2RlZFR4LmFkZHJlc3M7IC8vIEZvciBib25kIGV4dHJhLCBmdW5kcyBhcmUgbG9ja2VkIGluIHRoZSBzYW1lIGFjY291bnRcbiAgICAgIHZhbHVlID0gdHhNZXRob2QubWF4QWRkaXRpb25hbDtcbiAgICAgIGZyb20gPSBkZWNvZGVkVHguYWRkcmVzcztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlVHJhbnNhY3Rpb25FcnJvcihgTG9hZGluZyBpbnB1dHMgb2YgdW5rbm93biBTdGFraW5nQWN0aXZhdGUgdHlwZSBwYXJhbWV0ZXJzYCk7XG4gICAgfVxuICAgIHRoaXMuX291dHB1dHMgPSBbXG4gICAgICB7XG4gICAgICAgIGFkZHJlc3M6IHRvLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgY29pbjogdGhpcy5fY29pbkNvbmZpZy5uYW1lLFxuICAgICAgfSxcbiAgICBdO1xuXG4gICAgdGhpcy5faW5wdXRzID0gW1xuICAgICAge1xuICAgICAgICBhZGRyZXNzOiBmcm9tLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgY29pbjogdGhpcy5fY29pbkNvbmZpZy5uYW1lLFxuICAgICAgfSxcbiAgICBdO1xuICB9XG5cbiAgcHJpdmF0ZSBkZWNvZGVJbnB1dHNBbmRPdXRwdXRzRm9yU3Rha2luZ0RlYWN0aXZhdGUoZGVjb2RlZFR4OiBEZWNvZGVkVHgpIHtcbiAgICBjb25zdCB0eE1ldGhvZCA9IGRlY29kZWRUeC5tZXRob2QuYXJncztcbiAgICBsZXQgdG86IHN0cmluZztcbiAgICBsZXQgdmFsdWU6IHN0cmluZztcbiAgICBsZXQgZnJvbTogc3RyaW5nO1xuICAgIGlmICh1dGlscy5pc1JlbW92ZVN0YWtlKHR4TWV0aG9kKSkge1xuICAgICAgY29uc3Qga2V5cGFpckRlc3QgPSBuZXcgS2V5UGFpcih7XG4gICAgICAgIHB1YjogQnVmZmVyLmZyb20oZGVjb2RlQWRkcmVzcyh0eE1ldGhvZC5ob3RrZXkpKS50b1N0cmluZygnaGV4JyksXG4gICAgICB9KTtcbiAgICAgIHRvID0ga2V5cGFpckRlc3QuZ2V0QWRkcmVzcyh0aGlzLmdldEFkZHJlc3NGb3JtYXQoKSk7XG4gICAgICB2YWx1ZSA9IHR4TWV0aG9kLmFtb3VudFVuc3Rha2VkLnRvU3RyaW5nKCk7XG4gICAgICBmcm9tID0gZGVjb2RlZFR4LmFkZHJlc3M7XG4gICAgfSBlbHNlIGlmICh1dGlscy5pc1VuYm9uZCh0eE1ldGhvZCkpIHtcbiAgICAgIHRvID0gZGVjb2RlZFR4LmFkZHJlc3M7IC8vIEZvciB1bmJvbmQsIGZ1bmRzIGFyZSB1bmxvY2tlZCBmcm9tIHRoZSBzYW1lIGFjY291bnRcbiAgICAgIHZhbHVlID0gdHhNZXRob2QudmFsdWU7XG4gICAgICBmcm9tID0gZGVjb2RlZFR4LmFkZHJlc3M7XG4gICAgfSBlbHNlIGlmICh1dGlscy5pc1dpdGhkcmF3VW5ib25kZWQodHhNZXRob2QpKSB7XG4gICAgICB0byA9IGRlY29kZWRUeC5hZGRyZXNzOyAvLyBGb3Igd2l0aGRyYXcgdW5ib25kZWQsIGZ1bmRzIGFyZSByZXR1cm5lZCB0byB0aGUgc2FtZSBhY2NvdW50XG4gICAgICB2YWx1ZSA9ICcwJzsgLy8gQW1vdW50IGlzIG5vdCBzcGVjaWZpZWQgaW4gd2l0aGRyYXcgdW5ib25kZWRcbiAgICAgIGZyb20gPSBkZWNvZGVkVHguYWRkcmVzcztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlVHJhbnNhY3Rpb25FcnJvcihgTG9hZGluZyBpbnB1dHMgb2YgdW5rbm93biBTdGFraW5nRGVhY3RpdmF0ZSB0eXBlIHBhcmFtZXRlcnNgKTtcbiAgICB9XG4gICAgdGhpcy5fb3V0cHV0cyA9IFtcbiAgICAgIHtcbiAgICAgICAgYWRkcmVzczogZnJvbSxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIGNvaW46IHRoaXMuX2NvaW5Db25maWcubmFtZSxcbiAgICAgIH0sXG4gICAgXTtcblxuICAgIHRoaXMuX2lucHV0cyA9IFtcbiAgICAgIHtcbiAgICAgICAgYWRkcmVzczogdG8sXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBjb2luOiB0aGlzLl9jb2luQ29uZmlnLm5hbWUsXG4gICAgICB9LFxuICAgIF07XG4gIH1cblxuICBwcml2YXRlIGRlY29kZUlucHV0c0FuZE91dHB1dHNGb3JCYXRjaChkZWNvZGVkVHg6IERlY29kZWRUeCkge1xuICAgIGNvbnN0IHR4TWV0aG9kID0gZGVjb2RlZFR4Lm1ldGhvZC5hcmdzO1xuICAgIGNvbnN0IHNlbmRlciA9IGRlY29kZWRUeC5hZGRyZXNzO1xuICAgIHRoaXMuX2lucHV0cyA9IFtdO1xuICAgIHRoaXMuX291dHB1dHMgPSBbXTtcblxuICAgIGlmICh1dGlscy5pc0JhdGNoKHR4TWV0aG9kKSkge1xuICAgICAgaWYgKCF0eE1ldGhvZC5jYWxscykge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ2ZhaWxlZCB0byBkZWNvZGUgY2FsbHMgZnJvbSBiYXRjaCB0cmFuc2FjdGlvbicpO1xuICAgICAgfVxuICAgICAgLy8gSGFuZGxlIGRpZmZlcmVudCB0eXBlcyBvZiBiYXRjaCBvcGVyYXRpb25zXG4gICAgICBsZXQgdG90YWxTdGFraW5nVmFsdWUgPSAnMCc7XG4gICAgICBsZXQgaGFzU3Rha2luZ09wZXJhdGlvbnMgPSBmYWxzZTtcbiAgICAgIGxldCBoYXNVbnN0YWtpbmdPcGVyYXRpb25zID0gZmFsc2U7XG5cbiAgICAgIGZvciAoY29uc3QgY2FsbCBvZiB0eE1ldGhvZC5jYWxscykge1xuICAgICAgICAvLyBIYW5kbGUgYm90aCBwb3NzaWJsZSBmb3JtYXRzOiBzaW1wbGUgbWV0aG9kIG5hbWVzIG9yIGNhbGxJbmRleCB3aXRoIHJlZ2lzdHJ5IGxvb2t1cFxuICAgICAgICBsZXQgbWV0aG9kTmFtZTogc3RyaW5nO1xuXG4gICAgICAgIGlmICh0eXBlb2YgY2FsbC5tZXRob2QgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgbWV0aG9kTmFtZSA9IGNhbGwubWV0aG9kO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBjYWxsSW5kZXggPSBjYWxsLm1ldGhvZCBhcyBzdHJpbmc7XG4gICAgICAgICAgICBjb25zdCBkZWNvZGVkQ2FsbCA9IHRoaXMuX3JlZ2lzdHJ5LmZpbmRNZXRhQ2FsbChcbiAgICAgICAgICAgICAgbmV3IFVpbnQ4QXJyYXkoQnVmZmVyLmZyb20oY2FsbEluZGV4LnJlcGxhY2UoJzB4JywgJycpLCAnaGV4JykpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgbWV0aG9kTmFtZSA9IGRlY29kZWRDYWxsLm1ldGhvZDtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBtZXRob2ROYW1lID0gY2FsbC5tZXRob2QgYXMgc3RyaW5nO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtZXRob2ROYW1lID09PSAnYm9uZCcpIHtcbiAgICAgICAgICBjb25zdCBhcmdzID0gY2FsbC5hcmdzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gKGFyZ3MudmFsdWUgYXMgc3RyaW5nKSB8fCAnMCc7XG4gICAgICAgICAgdG90YWxTdGFraW5nVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICBoYXNTdGFraW5nT3BlcmF0aW9ucyA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAobWV0aG9kTmFtZSA9PT0gJ2NoaWxsJykge1xuICAgICAgICAgIGhhc1Vuc3Rha2luZ09wZXJhdGlvbnMgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZE5hbWUgPT09ICd1bmJvbmQnKSB7XG4gICAgICAgICAgY29uc3QgYXJncyA9IGNhbGwuYXJncyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IChhcmdzLnZhbHVlIGFzIHN0cmluZykgfHwgJzAnO1xuICAgICAgICAgIHRvdGFsU3Rha2luZ1ZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgaGFzVW5zdGFraW5nT3BlcmF0aW9ucyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gRm9yIHN0YWtpbmcgYmF0Y2ggb3BlcmF0aW9ucyAoYm9uZCArIG5vbWluYXRlIG9yIGJvbmRFeHRyYSArIG5vbWluYXRlKVxuICAgICAgaWYgKGhhc1N0YWtpbmdPcGVyYXRpb25zICYmICFoYXNVbnN0YWtpbmdPcGVyYXRpb25zKSB7XG4gICAgICAgIHRoaXMuX2lucHV0cy5wdXNoKHtcbiAgICAgICAgICBhZGRyZXNzOiBzZW5kZXIsXG4gICAgICAgICAgdmFsdWU6IHRvdGFsU3Rha2luZ1ZhbHVlLFxuICAgICAgICAgIGNvaW46IHRoaXMuX2NvaW5Db25maWcubmFtZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX291dHB1dHMucHVzaCh7XG4gICAgICAgICAgYWRkcmVzczogc2VuZGVyLCAvLyBGb3Igc3Rha2luZywgZnVuZHMgYXJlIGxvY2tlZCBpbiB0aGUgc2FtZSBhY2NvdW50XG4gICAgICAgICAgdmFsdWU6IHRvdGFsU3Rha2luZ1ZhbHVlLFxuICAgICAgICAgIGNvaW46IHRoaXMuX2NvaW5Db25maWcubmFtZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICAvLyBGb3IgdW5zdGFraW5nIGJhdGNoIG9wZXJhdGlvbnMgKGNoaWxsICsgdW5ib25kKVxuICAgICAgZWxzZSBpZiAoaGFzVW5zdGFraW5nT3BlcmF0aW9ucyAmJiAhaGFzU3Rha2luZ09wZXJhdGlvbnMpIHtcbiAgICAgICAgdGhpcy5faW5wdXRzLnB1c2goe1xuICAgICAgICAgIGFkZHJlc3M6IHNlbmRlcixcbiAgICAgICAgICB2YWx1ZTogdG90YWxTdGFraW5nVmFsdWUsXG4gICAgICAgICAgY29pbjogdGhpcy5fY29pbkNvbmZpZy5uYW1lLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fb3V0cHV0cy5wdXNoKHtcbiAgICAgICAgICBhZGRyZXNzOiBzZW5kZXIsIC8vIEZvciB1bnN0YWtpbmcsIGZ1bmRzIGFyZSB1bmxvY2tlZCBmcm9tIHRoZSBzYW1lIGFjY291bnRcbiAgICAgICAgICB2YWx1ZTogdG90YWxTdGFraW5nVmFsdWUsXG4gICAgICAgICAgY29pbjogdGhpcy5fY29pbkNvbmZpZy5uYW1lLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29uc3RydWN0cyBhIHNpZ25lZCBwYXlsb2FkIHVzaW5nIGNvbnN0cnVjdC5zaWduVHhcbiAgICogVGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgZHVyaW5nIHRoZSBidWlsZCBzdGVwIGlmIGEgVFNTIHNpZ25hdHVyZVxuICAgKiBpcyBhZGRlZCBhbmQgd2lsbCBzZXQgdGhlIHNpZ25UcmFuc2FjdGlvbiB3aGljaCBpcyB0aGUgdHhIZXggdGhhdCB3aWxsIGJlIGJyb2FkY2FzdGVkXG4gICAqIEFzIHdlbGwgYXMgYWRkIHRoZSBzaWduYXR1cmUgdXNlZCB0byBzaWduIHRvIHRoZSBzaWduYXR1cmUgYXJyYXkgaW4gaGV4IGZvcm1hdFxuICAgKlxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gc2lnbmF0dXJlIFRoZSBzaWduYXR1cmUgdG8gYmUgYWRkZWQgdG8gYSBzdWJzdHJhdGUgdHJhbnNhY3Rpb25cbiAgICovXG4gIGNvbnN0cnVjdFNpZ25lZFBheWxvYWQoc2lnbmF0dXJlOiBCdWZmZXIpOiB2b2lkIHtcbiAgICAvLyAweDAwIG1lYW5zIGl0cyBhbiBFRDI1NTE5IHNpZ25hdHVyZVxuICAgIGNvbnN0IGVkU2lnbmF0dXJlID0gYDB4MDAke3NpZ25hdHVyZS50b1N0cmluZygnaGV4Jyl9YCBhcyBIZXhTdHJpbmc7XG5cbiAgICB0cnkge1xuICAgICAgdGhpcy5fc2lnbmVkVHJhbnNhY3Rpb24gPSBjb25zdHJ1Y3Quc2lnbmVkVHgodGhpcy5fc3Vic3RyYXRlVHJhbnNhY3Rpb24sIGVkU2lnbmF0dXJlLCB7XG4gICAgICAgIHJlZ2lzdHJ5OiB0aGlzLl9yZWdpc3RyeSxcbiAgICAgICAgbWV0YWRhdGFScGM6IHRoaXMuX3N1YnN0cmF0ZVRyYW5zYWN0aW9uLm1ldGFkYXRhUnBjLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IFNpZ25pbmdFcnJvcihgVW5hYmxlIHRvIHNpZ24gdHJhbnNhY3Rpb24gd2l0aCBzaWduYXR1cmUgJHtlZFNpZ25hdHVyZX0gYCArIGUpO1xuICAgIH1cblxuICAgIHRoaXMuX3NpZ25hdHVyZXMgPSBbc2lnbmF0dXJlLnRvU3RyaW5nKCdoZXgnKV07XG4gIH1cblxuICBzZXRUcmFuc2FjdGlvbih0eDogVW5zaWduZWRUcmFuc2FjdGlvbik6IHZvaWQge1xuICAgIHRoaXMuX3N1YnN0cmF0ZVRyYW5zYWN0aW9uID0gdHg7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKiovXG4gIGdldCBzaWduYWJsZVBheWxvYWQoKTogQnVmZmVyIHtcbiAgICBjb25zdCBleHRyaW5zaWNQYXlsb2FkID0gdGhpcy5fcmVnaXN0cnkuY3JlYXRlVHlwZSgnRXh0cmluc2ljUGF5bG9hZCcsIHRoaXMuX3N1YnN0cmF0ZVRyYW5zYWN0aW9uLCB7XG4gICAgICB2ZXJzaW9uOiBFWFRSSU5TSUNfVkVSU0lPTixcbiAgICB9KTtcbiAgICByZXR1cm4gdThhVG9CdWZmZXIoZXh0cmluc2ljUGF5bG9hZC50b1U4YSh7IG1ldGhvZDogdHJ1ZSB9KSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSB0cmFuc2FjdGlvbiB0eXBlLlxuICAgKlxuICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uVHlwZX0gdHJhbnNhY3Rpb25UeXBlIFRoZSB0cmFuc2FjdGlvbiB0eXBlIHRvIGJlIHNldC5cbiAgICovXG4gIHRyYW5zYWN0aW9uVHlwZSh0cmFuc2FjdGlvblR5cGU6IFRyYW5zYWN0aW9uVHlwZSk6IHZvaWQge1xuICAgIHRoaXMuX3R5cGUgPSB0cmFuc2FjdGlvblR5cGU7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0QWRkcmVzc0Zvcm1hdCgpOiBudW1iZXIge1xuICAgIHJldHVybiBERUZBVUxUX1NVQlNUUkFURV9QUkVGSVg7XG4gIH1cbn1cbiJdfQ==