@bitgo-beta/sdk-coin-flrp 1.0.1-beta.40 → 1.0.1-beta.400

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 (122) hide show
  1. package/dist/src/flrp.d.ts +10 -17
  2. package/dist/src/flrp.d.ts.map +1 -1
  3. package/dist/src/flrp.js +51 -77
  4. package/dist/src/index.d.ts +0 -1
  5. package/dist/src/index.d.ts.map +1 -1
  6. package/dist/src/index.js +1 -2
  7. package/dist/src/lib/ExportInCTxBuilder.d.ts +43 -0
  8. package/dist/src/lib/ExportInCTxBuilder.d.ts.map +1 -0
  9. package/dist/src/lib/ExportInCTxBuilder.js +150 -0
  10. package/dist/src/lib/ExportInPTxBuilder.d.ts +28 -0
  11. package/dist/src/lib/ExportInPTxBuilder.d.ts.map +1 -0
  12. package/dist/src/lib/ExportInPTxBuilder.js +174 -0
  13. package/dist/src/lib/ImportInCTxBuilder.d.ts +34 -0
  14. package/dist/src/lib/ImportInCTxBuilder.d.ts.map +1 -0
  15. package/dist/src/lib/ImportInCTxBuilder.js +175 -0
  16. package/dist/src/lib/ImportInPTxBuilder.d.ts +38 -0
  17. package/dist/src/lib/ImportInPTxBuilder.d.ts.map +1 -0
  18. package/dist/src/lib/ImportInPTxBuilder.js +208 -0
  19. package/dist/src/lib/atomicInCTransactionBuilder.d.ts +12 -16
  20. package/dist/src/lib/atomicInCTransactionBuilder.d.ts.map +1 -1
  21. package/dist/src/lib/atomicInCTransactionBuilder.js +30 -41
  22. package/dist/src/lib/atomicTransactionBuilder.d.ts +97 -69
  23. package/dist/src/lib/atomicTransactionBuilder.d.ts.map +1 -1
  24. package/dist/src/lib/atomicTransactionBuilder.js +217 -210
  25. package/dist/src/lib/iface.d.ts +65 -57
  26. package/dist/src/lib/iface.d.ts.map +1 -1
  27. package/dist/src/lib/iface.js +20 -14
  28. package/dist/src/lib/index.d.ts +5 -0
  29. package/dist/src/lib/index.d.ts.map +1 -1
  30. package/dist/src/lib/index.js +12 -2
  31. package/dist/src/lib/keyPair.d.ts +5 -5
  32. package/dist/src/lib/keyPair.d.ts.map +1 -1
  33. package/dist/src/lib/keyPair.js +17 -9
  34. package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts +41 -0
  35. package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts.map +1 -0
  36. package/dist/src/lib/permissionlessValidatorTxBuilder.js +126 -0
  37. package/dist/src/lib/transaction.d.ts +30 -66
  38. package/dist/src/lib/transaction.d.ts.map +1 -1
  39. package/dist/src/lib/transaction.js +338 -199
  40. package/dist/src/lib/transactionBuilder.d.ts +115 -0
  41. package/dist/src/lib/transactionBuilder.d.ts.map +1 -0
  42. package/dist/src/lib/transactionBuilder.js +228 -0
  43. package/dist/src/lib/transactionBuilderFactory.d.ts +50 -30
  44. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
  45. package/dist/src/lib/transactionBuilderFactory.js +129 -72
  46. package/dist/src/lib/utils.d.ts +125 -146
  47. package/dist/src/lib/utils.d.ts.map +1 -1
  48. package/dist/src/lib/utils.js +338 -321
  49. package/dist/test/resources/account.d.ts +81 -0
  50. package/dist/test/resources/account.d.ts.map +1 -0
  51. package/dist/test/resources/account.js +79 -0
  52. package/dist/test/resources/transactionData/exportInC.d.ts +50 -0
  53. package/dist/test/resources/transactionData/exportInC.d.ts.map +1 -0
  54. package/dist/test/resources/transactionData/exportInC.js +58 -0
  55. package/dist/test/resources/transactionData/exportInP.d.ts +60 -0
  56. package/dist/test/resources/transactionData/exportInP.d.ts.map +1 -0
  57. package/dist/test/resources/transactionData/exportInP.js +101 -0
  58. package/dist/test/resources/transactionData/importInC.d.ts +56 -0
  59. package/dist/test/resources/transactionData/importInC.d.ts.map +1 -0
  60. package/dist/test/resources/transactionData/importInC.js +120 -0
  61. package/dist/test/resources/transactionData/importInP.d.ts +66 -0
  62. package/dist/test/resources/transactionData/importInP.d.ts.map +1 -0
  63. package/dist/test/resources/transactionData/importInP.js +84 -0
  64. package/dist/test/unit/flrp.js +449 -68
  65. package/dist/test/unit/lib/exportInCTxBuilder.d.ts +2 -0
  66. package/dist/test/unit/lib/exportInCTxBuilder.d.ts.map +1 -0
  67. package/dist/test/unit/lib/exportInCTxBuilder.js +193 -0
  68. package/dist/test/unit/lib/exportInPTxBuilder.d.ts +2 -0
  69. package/dist/test/unit/lib/exportInPTxBuilder.d.ts.map +1 -0
  70. package/dist/test/unit/lib/exportInPTxBuilder.js +296 -0
  71. package/dist/test/unit/lib/importInCTxBuilder.d.ts +2 -0
  72. package/dist/test/unit/lib/importInCTxBuilder.d.ts.map +1 -0
  73. package/dist/test/unit/lib/importInCTxBuilder.js +309 -0
  74. package/dist/test/unit/lib/importInPTxBuilder.d.ts +2 -0
  75. package/dist/test/unit/lib/importInPTxBuilder.d.ts.map +1 -0
  76. package/dist/test/unit/lib/importInPTxBuilder.js +490 -0
  77. package/dist/test/unit/lib/keyPair.d.ts +2 -0
  78. package/dist/test/unit/lib/keyPair.d.ts.map +1 -0
  79. package/dist/test/unit/lib/keyPair.js +158 -0
  80. package/dist/test/unit/lib/signFlowTestSuit.d.ts +20 -0
  81. package/dist/test/unit/lib/signFlowTestSuit.d.ts.map +1 -0
  82. package/dist/test/unit/lib/signFlowTestSuit.js +83 -0
  83. package/dist/test/unit/lib/signatureIndex.d.ts +13 -0
  84. package/dist/test/unit/lib/signatureIndex.d.ts.map +1 -0
  85. package/dist/test/unit/lib/signatureIndex.js +843 -0
  86. package/dist/test/unit/lib/transactionBuilderFactory.d.ts +2 -0
  87. package/dist/test/unit/lib/transactionBuilderFactory.d.ts.map +1 -0
  88. package/dist/test/unit/lib/transactionBuilderFactory.js +60 -0
  89. package/dist/test/unit/lib/utils.js +681 -206
  90. package/dist/tsconfig.tsbuildinfo +1 -1
  91. package/package.json +20 -11
  92. package/.eslintignore +0 -5
  93. package/.eslintrc.json +0 -7
  94. package/.mocharc.yml +0 -8
  95. package/CHANGELOG.md +0 -0
  96. package/dist/src/iface.d.ts +0 -25
  97. package/dist/src/iface.d.ts.map +0 -1
  98. package/dist/src/iface.js +0 -3
  99. package/dist/src/lib/constants.d.ts +0 -11
  100. package/dist/src/lib/constants.d.ts.map +0 -1
  101. package/dist/src/lib/constants.js +0 -17
  102. package/dist/src/lib/errors.d.ts +0 -8
  103. package/dist/src/lib/errors.d.ts.map +0 -1
  104. package/dist/src/lib/errors.js +0 -19
  105. package/dist/src/lib/exportInCTxBuilder.d.ts +0 -77
  106. package/dist/src/lib/exportInCTxBuilder.d.ts.map +0 -1
  107. package/dist/src/lib/exportInCTxBuilder.js +0 -170
  108. package/dist/src/lib/exportInPTxBuilder.d.ts +0 -30
  109. package/dist/src/lib/exportInPTxBuilder.d.ts.map +0 -1
  110. package/dist/src/lib/exportInPTxBuilder.js +0 -56
  111. package/dist/test/unit/lib/atomicTransactionBuilder.d.ts +0 -2
  112. package/dist/test/unit/lib/atomicTransactionBuilder.d.ts.map +0 -1
  113. package/dist/test/unit/lib/atomicTransactionBuilder.js +0 -222
  114. package/dist/test/unit/lib/exportTxBuilder.d.ts +0 -2
  115. package/dist/test/unit/lib/exportTxBuilder.d.ts.map +0 -1
  116. package/dist/test/unit/lib/exportTxBuilder.js +0 -45
  117. package/dist/test/unit/lib/transaction.d.ts +0 -2
  118. package/dist/test/unit/lib/transaction.d.ts.map +0 -1
  119. package/dist/test/unit/lib/transaction.js +0 -460
  120. package/dist/test/unit/smoke.d.ts +0 -2
  121. package/dist/test/unit/smoke.d.ts.map +0 -1
  122. package/dist/test/unit/smoke.js +0 -23
@@ -0,0 +1,309 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const assert_1 = __importDefault(require("assert"));
7
+ require("should");
8
+ const lib_1 = require("../../../src/lib");
9
+ const statics_1 = require("@bitgo-beta/statics");
10
+ const importInC_1 = require("../../resources/transactionData/importInC");
11
+ const signFlowTestSuit_1 = __importDefault(require("./signFlowTestSuit"));
12
+ describe('Flrp Import In C Tx Builder', () => {
13
+ const factory = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tflrp'));
14
+ describe('validate txBuilder fields', () => {
15
+ it('should fail validate Utxos empty array', () => {
16
+ const txBuilder = factory.getImportInCBuilder();
17
+ assert_1.default.throws(() => {
18
+ txBuilder.validateUtxos([]);
19
+ }, (e) => e.message === 'UTXOs array cannot be empty');
20
+ });
21
+ it('should throw if to address is not set', async () => {
22
+ const txBuilder = factory
23
+ .getImportInCBuilder()
24
+ .threshold(importInC_1.IMPORT_IN_C.threshold)
25
+ .fromPubKey(importInC_1.IMPORT_IN_C.pAddresses)
26
+ .decodedUtxos(importInC_1.IMPORT_IN_C.utxos)
27
+ .fee(importInC_1.IMPORT_IN_C.fee)
28
+ .context(importInC_1.IMPORT_IN_C.context);
29
+ // to is NOT set
30
+ await txBuilder.build().should.be.rejectedWith('to is required');
31
+ });
32
+ it('should throw if context is not set', async () => {
33
+ const txBuilder = factory
34
+ .getImportInCBuilder()
35
+ .threshold(importInC_1.IMPORT_IN_C.threshold)
36
+ .fromPubKey(importInC_1.IMPORT_IN_C.pAddresses)
37
+ .decodedUtxos(importInC_1.IMPORT_IN_C.utxos)
38
+ .to(importInC_1.IMPORT_IN_C.to)
39
+ .fee(importInC_1.IMPORT_IN_C.fee);
40
+ // context is NOT set
41
+ await txBuilder.build().should.be.rejectedWith('context is required');
42
+ });
43
+ it('should throw if fromAddresses is not set', async () => {
44
+ const txBuilder = factory
45
+ .getImportInCBuilder()
46
+ .threshold(importInC_1.IMPORT_IN_C.threshold)
47
+ .decodedUtxos(importInC_1.IMPORT_IN_C.utxos)
48
+ .to(importInC_1.IMPORT_IN_C.to)
49
+ .fee(importInC_1.IMPORT_IN_C.fee)
50
+ .context(importInC_1.IMPORT_IN_C.context);
51
+ // fromPubKey is NOT set
52
+ await txBuilder.build().should.be.rejectedWith('fromAddresses are required');
53
+ });
54
+ it('should throw if UTXOs are not set', async () => {
55
+ const txBuilder = factory
56
+ .getImportInCBuilder()
57
+ .threshold(importInC_1.IMPORT_IN_C.threshold)
58
+ .fromPubKey(importInC_1.IMPORT_IN_C.pAddresses)
59
+ .to(importInC_1.IMPORT_IN_C.to)
60
+ .fee(importInC_1.IMPORT_IN_C.fee)
61
+ .context(importInC_1.IMPORT_IN_C.context);
62
+ // utxos is NOT set
63
+ await txBuilder.build().should.be.rejectedWith('UTXOs are required');
64
+ });
65
+ it('should fail when utxos hex array is empty', () => {
66
+ const txBuilder = factory.getImportInCBuilder();
67
+ assert_1.default.throws(() => {
68
+ txBuilder.decodedUtxos([]);
69
+ }, (e) => e.message === 'UTXOs array cannot be empty');
70
+ });
71
+ it('should fail with invalid threshold value (0)', () => {
72
+ const txBuilder = factory.getImportInCBuilder();
73
+ assert_1.default.throws(() => {
74
+ txBuilder.threshold(0);
75
+ }, (e) => e.message.includes('threshold') || e.message.includes('greater'));
76
+ });
77
+ it('should fail with invalid threshold value (negative)', () => {
78
+ const txBuilder = factory.getImportInCBuilder();
79
+ assert_1.default.throws(() => {
80
+ txBuilder.threshold(-1);
81
+ }, (e) => e.message.includes('threshold') || e.message.includes('greater'));
82
+ });
83
+ it('should fail with invalid to address format', () => {
84
+ const txBuilder = factory.getImportInCBuilder();
85
+ assert_1.default.throws(() => {
86
+ txBuilder.to('invalid-address');
87
+ }, (e) => e.message.includes('Invalid') || e.message.includes('address'));
88
+ });
89
+ it('should accept valid to address', () => {
90
+ const txBuilder = factory.getImportInCBuilder();
91
+ (() => txBuilder.to(importInC_1.IMPORT_IN_C.to)).should.not.throw();
92
+ });
93
+ it('should accept valid threshold', () => {
94
+ const txBuilder = factory.getImportInCBuilder();
95
+ (() => txBuilder.threshold(2)).should.not.throw();
96
+ });
97
+ it('should accept valid context', () => {
98
+ const txBuilder = factory.getImportInCBuilder();
99
+ (() => txBuilder.context(importInC_1.IMPORT_IN_C.context)).should.not.throw();
100
+ });
101
+ it('should accept valid fromPubKey addresses', () => {
102
+ const txBuilder = factory.getImportInCBuilder();
103
+ (() => txBuilder.fromPubKey(importInC_1.IMPORT_IN_C.pAddresses)).should.not.throw();
104
+ });
105
+ });
106
+ (0, signFlowTestSuit_1.default)({
107
+ transactionType: 'Import C2P',
108
+ newTxFactory: () => new lib_1.TransactionBuilderFactory(statics_1.coins.get('tflrp')),
109
+ newTxBuilder: () => new lib_1.TransactionBuilderFactory(statics_1.coins.get('tflrp'))
110
+ .getImportInCBuilder()
111
+ .threshold(importInC_1.IMPORT_IN_C.threshold)
112
+ .fromPubKey(importInC_1.IMPORT_IN_C.pAddresses)
113
+ .decodedUtxos(importInC_1.IMPORT_IN_C.utxos)
114
+ .to(importInC_1.IMPORT_IN_C.to)
115
+ .fee(importInC_1.IMPORT_IN_C.fee)
116
+ .context(importInC_1.IMPORT_IN_C.context),
117
+ unsignedTxHex: importInC_1.IMPORT_IN_C.unsignedHex,
118
+ halfSignedTxHex: importInC_1.IMPORT_IN_C.halfSigntxHex,
119
+ fullSignedTxHex: importInC_1.IMPORT_IN_C.fullSigntxHex,
120
+ privateKey: {
121
+ prv1: importInC_1.IMPORT_IN_C.privateKeys[2],
122
+ prv2: importInC_1.IMPORT_IN_C.privateKeys[0],
123
+ },
124
+ txHash: importInC_1.IMPORT_IN_C.txhash,
125
+ });
126
+ describe('addressesIndex extraction and signature slot mapping for ImportInC', () => {
127
+ it('should correctly parse half-signed ImportInC tx and add second signature', async () => {
128
+ const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tflrp')).from(importInC_1.IMPORT_IN_C.halfSigntxHex);
129
+ txBuilder.sign({ key: importInC_1.IMPORT_IN_C.privateKeys[0] });
130
+ const tx = await txBuilder.build();
131
+ const rawTx = tx.toBroadcastFormat();
132
+ rawTx.should.equal(importInC_1.IMPORT_IN_C.fullSigntxHex);
133
+ tx.id.should.equal(importInC_1.IMPORT_IN_C.txhash);
134
+ });
135
+ it('should preserve transaction structure when parsing unsigned ImportInC tx', async () => {
136
+ const parsedBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tflrp')).from(importInC_1.IMPORT_IN_C.unsignedHex);
137
+ const parsedTx = await parsedBuilder.build();
138
+ const parsedHex = parsedTx.toBroadcastFormat();
139
+ parsedHex.should.equal(importInC_1.IMPORT_IN_C.unsignedHex);
140
+ });
141
+ it('should correctly handle ImportInC signing flow: parse -> sign -> parse -> sign', async () => {
142
+ // Step 1: unsigned transaction
143
+ const builder1 = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tflrp')).from(importInC_1.IMPORT_IN_C.unsignedHex);
144
+ const unsignedTx = await builder1.build();
145
+ const unsignedHex = unsignedTx.toBroadcastFormat();
146
+ unsignedHex.should.equal(importInC_1.IMPORT_IN_C.unsignedHex);
147
+ const builder2 = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tflrp')).from(unsignedHex);
148
+ builder2.sign({ key: importInC_1.IMPORT_IN_C.privateKeys[2] });
149
+ const halfSignedTx = await builder2.build();
150
+ const halfSignedHex = halfSignedTx.toBroadcastFormat();
151
+ const builder3 = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tflrp')).from(halfSignedHex);
152
+ builder3.sign({ key: importInC_1.IMPORT_IN_C.privateKeys[0] });
153
+ const fullSignedTx = await builder3.build();
154
+ fullSignedTx.toBroadcastFormat().should.equal(importInC_1.IMPORT_IN_C.fullSigntxHex);
155
+ fullSignedTx.id.should.equal(importInC_1.IMPORT_IN_C.txhash);
156
+ });
157
+ it('should have correct number of signatures for ImportInC after full sign flow', async () => {
158
+ const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tflrp')).from(importInC_1.IMPORT_IN_C.fullSigntxHex);
159
+ const tx = await txBuilder.build();
160
+ const txJson = tx.toJson();
161
+ txJson.signatures.length.should.equal(2);
162
+ });
163
+ it('should have correct number of signatures for ImportInC half-signed tx', async () => {
164
+ const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tflrp')).from(importInC_1.IMPORT_IN_C.halfSigntxHex);
165
+ const tx = await txBuilder.build();
166
+ const txJson = tx.toJson();
167
+ txJson.signatures.length.should.equal(1);
168
+ });
169
+ it('should have 0 signatures for unsigned ImportInC tx', async () => {
170
+ const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tflrp')).from(importInC_1.IMPORT_IN_C.unsignedHex);
171
+ const tx = await txBuilder.build();
172
+ const txJson = tx.toJson();
173
+ txJson.signatures.length.should.equal(0);
174
+ });
175
+ });
176
+ describe('UTXO address sorting fix - addresses in non-sorted order for ImportInC', () => {
177
+ /**
178
+ * This test suite verifies the fix for the address ordering bug in ImportInC.
179
+ *
180
+ * The issue: When the API returns UTXO addresses in a different order than how they're
181
+ * stored on-chain (lexicographically sorted by byte value), the sigIndices would be
182
+ * computed incorrectly, causing signature verification to fail.
183
+ *
184
+ * The fix: Sort UTXO addresses before computing addressesIndex to match on-chain order.
185
+ */
186
+ // Helper to create UTXO with specific address order
187
+ const createUtxoWithAddressOrder = (utxo, addresses) => ({
188
+ ...utxo,
189
+ addresses: addresses,
190
+ });
191
+ it('should correctly sort UTXO addresses when building ImportInC transaction', async () => {
192
+ // Create UTXOs with addresses in reversed order (simulating API returning unsorted)
193
+ const reversedUtxos = importInC_1.IMPORT_IN_C.utxos.map((utxo) => createUtxoWithAddressOrder(utxo, [...utxo.addresses].reverse()));
194
+ const txBuilder = factory
195
+ .getImportInCBuilder()
196
+ .threshold(importInC_1.IMPORT_IN_C.threshold)
197
+ .locktime(importInC_1.IMPORT_IN_C.locktime)
198
+ .fromPubKey(importInC_1.IMPORT_IN_C.pAddresses)
199
+ .to(importInC_1.IMPORT_IN_C.to)
200
+ .externalChainId(importInC_1.IMPORT_IN_C.sourceChainId)
201
+ .fee(importInC_1.IMPORT_IN_C.fee)
202
+ .context(importInC_1.IMPORT_IN_C.context)
203
+ .decodedUtxos(reversedUtxos);
204
+ // Should not throw - the fix ensures addresses are sorted before computing sigIndices
205
+ const tx = await txBuilder.build();
206
+ const txJson = tx.toJson();
207
+ // Verify transaction built successfully
208
+ txJson.threshold.should.equal(2);
209
+ tx.toBroadcastFormat().should.be.a.String();
210
+ });
211
+ it('should produce same transaction hex regardless of input UTXO address order for ImportInC', async () => {
212
+ // Build with original address order
213
+ const txBuilder1 = factory
214
+ .getImportInCBuilder()
215
+ .threshold(importInC_1.IMPORT_IN_C.threshold)
216
+ .locktime(importInC_1.IMPORT_IN_C.locktime)
217
+ .fromPubKey(importInC_1.IMPORT_IN_C.pAddresses)
218
+ .to(importInC_1.IMPORT_IN_C.to)
219
+ .externalChainId(importInC_1.IMPORT_IN_C.sourceChainId)
220
+ .fee(importInC_1.IMPORT_IN_C.fee)
221
+ .context(importInC_1.IMPORT_IN_C.context)
222
+ .decodedUtxos(importInC_1.IMPORT_IN_C.utxos);
223
+ const tx1 = await txBuilder1.build();
224
+ const hex1 = tx1.toBroadcastFormat();
225
+ // Build with reversed address order in UTXOs
226
+ const reversedUtxos = importInC_1.IMPORT_IN_C.utxos.map((utxo) => createUtxoWithAddressOrder(utxo, [...utxo.addresses].reverse()));
227
+ const txBuilder2 = factory
228
+ .getImportInCBuilder()
229
+ .threshold(importInC_1.IMPORT_IN_C.threshold)
230
+ .locktime(importInC_1.IMPORT_IN_C.locktime)
231
+ .fromPubKey(importInC_1.IMPORT_IN_C.pAddresses)
232
+ .to(importInC_1.IMPORT_IN_C.to)
233
+ .externalChainId(importInC_1.IMPORT_IN_C.sourceChainId)
234
+ .fee(importInC_1.IMPORT_IN_C.fee)
235
+ .context(importInC_1.IMPORT_IN_C.context)
236
+ .decodedUtxos(reversedUtxos);
237
+ const tx2 = await txBuilder2.build();
238
+ const hex2 = tx2.toBroadcastFormat();
239
+ // Both should produce the same hex since addresses get sorted
240
+ hex1.should.equal(hex2);
241
+ });
242
+ it('should handle signing correctly with unsorted UTXO addresses for ImportInC', async () => {
243
+ const reversedUtxos = importInC_1.IMPORT_IN_C.utxos.map((utxo) => createUtxoWithAddressOrder(utxo, [...utxo.addresses].reverse()));
244
+ const txBuilder = factory
245
+ .getImportInCBuilder()
246
+ .threshold(importInC_1.IMPORT_IN_C.threshold)
247
+ .locktime(importInC_1.IMPORT_IN_C.locktime)
248
+ .fromPubKey(importInC_1.IMPORT_IN_C.pAddresses)
249
+ .to(importInC_1.IMPORT_IN_C.to)
250
+ .externalChainId(importInC_1.IMPORT_IN_C.sourceChainId)
251
+ .fee(importInC_1.IMPORT_IN_C.fee)
252
+ .context(importInC_1.IMPORT_IN_C.context)
253
+ .decodedUtxos(reversedUtxos);
254
+ txBuilder.sign({ key: importInC_1.IMPORT_IN_C.privateKeys[2] });
255
+ txBuilder.sign({ key: importInC_1.IMPORT_IN_C.privateKeys[0] });
256
+ const tx = await txBuilder.build();
257
+ const txJson = tx.toJson();
258
+ // Should have 2 signatures after signing
259
+ txJson.signatures.length.should.equal(2);
260
+ });
261
+ it('should produce valid signed transaction matching expected output with unsorted addresses for ImportInC', async () => {
262
+ const reversedUtxos = importInC_1.IMPORT_IN_C.utxos.map((utxo) => createUtxoWithAddressOrder(utxo, [...utxo.addresses].reverse()));
263
+ const txBuilder = factory
264
+ .getImportInCBuilder()
265
+ .threshold(importInC_1.IMPORT_IN_C.threshold)
266
+ .locktime(importInC_1.IMPORT_IN_C.locktime)
267
+ .fromPubKey(importInC_1.IMPORT_IN_C.pAddresses)
268
+ .to(importInC_1.IMPORT_IN_C.to)
269
+ .externalChainId(importInC_1.IMPORT_IN_C.sourceChainId)
270
+ .fee(importInC_1.IMPORT_IN_C.fee)
271
+ .context(importInC_1.IMPORT_IN_C.context)
272
+ .decodedUtxos(reversedUtxos);
273
+ txBuilder.sign({ key: importInC_1.IMPORT_IN_C.privateKeys[2] });
274
+ txBuilder.sign({ key: importInC_1.IMPORT_IN_C.privateKeys[0] });
275
+ const tx = await txBuilder.build();
276
+ // The signed tx should match the expected fullSigntxHex from testData
277
+ tx.toBroadcastFormat().should.equal(importInC_1.IMPORT_IN_C.fullSigntxHex);
278
+ tx.id.should.equal(importInC_1.IMPORT_IN_C.txhash);
279
+ });
280
+ });
281
+ describe('fresh build with different UTXO address order for ImportInC', () => {
282
+ it('should correctly complete full sign flow with different UTXO address order for ImportInC', async () => {
283
+ const builder1 = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tflrp')).from(importInC_1.IMPORT_IN_C.unsignedHex);
284
+ const unsignedTx = await builder1.build();
285
+ const unsignedHex = unsignedTx.toBroadcastFormat();
286
+ const builder2 = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tflrp')).from(unsignedHex);
287
+ builder2.sign({ key: importInC_1.IMPORT_IN_C.privateKeys[2] });
288
+ const halfSignedTx = await builder2.build();
289
+ const halfSignedHex = halfSignedTx.toBroadcastFormat();
290
+ halfSignedTx.toJson().signatures.length.should.equal(1);
291
+ const builder3 = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tflrp')).from(halfSignedHex);
292
+ builder3.sign({ key: importInC_1.IMPORT_IN_C.privateKeys[0] });
293
+ const fullSignedTx = await builder3.build();
294
+ fullSignedTx.toJson().signatures.length.should.equal(2);
295
+ const txId = fullSignedTx.id;
296
+ txId.should.be.a.String();
297
+ txId.length.should.be.greaterThan(0);
298
+ });
299
+ it('should handle ImportInC signing in different order and still produce valid tx', async () => {
300
+ const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tflrp')).from(importInC_1.IMPORT_IN_C.unsignedHex);
301
+ txBuilder.sign({ key: importInC_1.IMPORT_IN_C.privateKeys[0] });
302
+ txBuilder.sign({ key: importInC_1.IMPORT_IN_C.privateKeys[2] });
303
+ const tx = await txBuilder.build();
304
+ const txJson = tx.toJson();
305
+ txJson.signatures.length.should.equal(2);
306
+ });
307
+ });
308
+ });
309
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1wb3J0SW5DVHhCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L2xpYi9pbXBvcnRJbkNUeEJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsa0JBQWdCO0FBQ2hCLDBDQUE2RDtBQUM3RCxpREFBNEM7QUFDNUMseUVBQW9GO0FBQ3BGLDBFQUE4QztBQUU5QyxRQUFRLENBQUMsNkJBQTZCLEVBQUUsR0FBRyxFQUFFO0lBQzNDLE1BQU0sT0FBTyxHQUFHLElBQUksK0JBQXlCLENBQUMsZUFBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBRWxFLFFBQVEsQ0FBQywyQkFBMkIsRUFBRSxHQUFHLEVBQUU7UUFDekMsRUFBRSxDQUFDLHdDQUF3QyxFQUFFLEdBQUcsRUFBRTtZQUNoRCxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUNoRCxnQkFBTSxDQUFDLE1BQU0sQ0FDWCxHQUFHLEVBQUU7Z0JBQ0gsU0FBUyxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUM5QixDQUFDLEVBQ0QsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssNkJBQTZCLENBQ3hELENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyx1Q0FBdUMsRUFBRSxLQUFLLElBQUksRUFBRTtZQUNyRCxNQUFNLFNBQVMsR0FBRyxPQUFPO2lCQUN0QixtQkFBbUIsRUFBRTtpQkFDckIsU0FBUyxDQUFDLHVCQUFRLENBQUMsU0FBUyxDQUFDO2lCQUM3QixVQUFVLENBQUMsdUJBQVEsQ0FBQyxVQUFVLENBQUM7aUJBQy9CLFlBQVksQ0FBQyx1QkFBUSxDQUFDLEtBQUssQ0FBQztpQkFDNUIsR0FBRyxDQUFDLHVCQUFRLENBQUMsR0FBRyxDQUFDO2lCQUNqQixPQUFPLENBQUMs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SSxDQUFDLEVBQUUsR0FBRyxFQUFFLHVCQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNqRCxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLHVCQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUVqRCxNQUFNLEVBQUUsR0FBRyxNQUFNLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNuQyxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7WUFFM0IsTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgJ3Nob3VsZCc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5IH0gZnJvbSAnLi4vLi4vLi4vc3JjL2xpYic7XG5pbXBvcnQgeyBjb2lucyB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IHsgSU1QT1JUX0lOX0MgYXMgdGVzdERhdGEgfSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvdHJhbnNhY3Rpb25EYXRhL2ltcG9ydEluQyc7XG5pbXBvcnQgc2lnbkZsb3dUZXN0IGZyb20gJy4vc2lnbkZsb3dUZXN0U3VpdCc7XG5cbmRlc2NyaWJlKCdGbHJwIEltcG9ydCBJbiBDIFR4IEJ1aWxkZXInLCAoKSA9PiB7XG4gIGNvbnN0IGZhY3RvcnkgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RmbHJwJykpO1xuXG4gIGRlc2NyaWJlKCd2YWxpZGF0ZSB0eEJ1aWxkZXIgZmllbGRzJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgZmFpbCB2YWxpZGF0ZSBVdHhvcyBlbXB0eSBhcnJheScsICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0SW1wb3J0SW5DQnVpbGRlcigpO1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHR4QnVpbGRlci52YWxpZGF0ZVV0eG9zKFtdKTtcbiAgICAgICAgfSxcbiAgICAgICAgKGU6IGFueSkgPT4gZS5tZXNzYWdlID09PSAnVVRYT3MgYXJyYXkgY2Fubm90IGJlIGVtcHR5J1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgaWYgdG8gYWRkcmVzcyBpcyBub3Qgc2V0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeVxuICAgICAgICAuZ2V0SW1wb3J0SW5DQnVpbGRlcigpXG4gICAgICAgIC50aHJlc2hvbGQodGVzdERhdGEudGhyZXNob2xkKVxuICAgICAgICAuZnJvbVB1YktleSh0ZXN0RGF0YS5wQWRkcmVzc2VzKVxuICAgICAgICAuZGVjb2RlZFV0eG9zKHRlc3REYXRhLnV0eG9zKVxuICAgICAgICAuZmVlKHRlc3REYXRhLmZlZSlcbiAgICAgICAgLmNvbnRleHQodGVzdERhdGEuY29udGV4dCk7XG4gICAgICAvLyB0byBpcyBOT1Qgc2V0XG5cbiAgICAgIGF3YWl0IHR4QnVpbGRlci5idWlsZCgpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ3RvIGlzIHJlcXVpcmVkJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGlmIGNvbnRleHQgaXMgbm90IHNldCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnlcbiAgICAgICAgLmdldEltcG9ydEluQ0J1aWxkZXIoKVxuICAgICAgICAudGhyZXNob2xkKHRlc3REYXRhLnRocmVzaG9sZClcbiAgICAgICAgLmZyb21QdWJLZXkodGVzdERhdGEucEFkZHJlc3NlcylcbiAgICAgICAgLmRlY29kZWRVdHhvcyh0ZXN0RGF0YS51dHhvcylcbiAgICAgICAgLnRvKHRlc3REYXRhLnRvKVxuICAgICAgICAuZmVlKHRlc3REYXRhLmZlZSk7XG4gICAgICAvLyBjb250ZXh0IGlzIE5PVCBzZXRcblxuICAgICAgYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnY29udGV4dCBpcyByZXF1aXJlZCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBpZiBmcm9tQWRkcmVzc2VzIGlzIG5vdCBzZXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5XG4gICAgICAgIC5nZXRJbXBvcnRJbkNCdWlsZGVyKClcbiAgICAgICAgLnRocmVzaG9sZCh0ZXN0RGF0YS50aHJlc2hvbGQpXG4gICAgICAgIC5kZWNvZGVkVXR4b3ModGVzdERhdGEudXR4b3MpXG4gICAgICAgIC50byh0ZXN0RGF0YS50bylcbiAgICAgICAgLmZlZSh0ZXN0RGF0YS5mZWUpXG4gICAgICAgIC5jb250ZXh0KHRlc3REYXRhLmNvbnRleHQpO1xuICAgICAgLy8gZnJvbVB1YktleSBpcyBOT1Qgc2V0XG5cbiAgICAgIGF3YWl0IHR4QnVpbGRlci5idWlsZCgpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ2Zyb21BZGRyZXNzZXMgYXJlIHJlcXVpcmVkJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGlmIFVUWE9zIGFyZSBub3Qgc2V0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeVxuICAgICAgICAuZ2V0SW1wb3J0SW5DQnVpbGRlcigpXG4gICAgICAgIC50aHJlc2hvbGQodGVzdERhdGEudGhyZXNob2xkKVxuICAgICAgICAuZnJvbVB1YktleSh0ZXN0RGF0YS5wQWRkcmVzc2VzKVxuICAgICAgICAudG8odGVzdERhdGEudG8pXG4gICAgICAgIC5mZWUodGVzdERhdGEuZmVlKVxuICAgICAgICAuY29udGV4dCh0ZXN0RGF0YS5jb250ZXh0KTtcbiAgICAgIC8vIHV0eG9zIGlzIE5PVCBzZXRcblxuICAgICAgYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnVVRYT3MgYXJlIHJlcXVpcmVkJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgd2hlbiB1dHhvcyBoZXggYXJyYXkgaXMgZW1wdHknLCAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldEltcG9ydEluQ0J1aWxkZXIoKTtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0eEJ1aWxkZXIuZGVjb2RlZFV0eG9zKFtdKTtcbiAgICAgICAgfSxcbiAgICAgICAgKGU6IGFueSkgPT4gZS5tZXNzYWdlID09PSAnVVRYT3MgYXJyYXkgY2Fubm90IGJlIGVtcHR5J1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB3aXRoIGludmFsaWQgdGhyZXNob2xkIHZhbHVlICgwKScsICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0SW1wb3J0SW5DQnVpbGRlcigpO1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHR4QnVpbGRlci50aHJlc2hvbGQoMCk7XG4gICAgICAgIH0sXG4gICAgICAgIChlOiBhbnkpID0+IGUubWVzc2FnZS5pbmNsdWRlcygndGhyZXNob2xkJykgfHwgZS5tZXNzYWdlLmluY2x1ZGVzKCdncmVhdGVyJylcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgd2l0aCBpbnZhbGlkIHRocmVzaG9sZCB2YWx1ZSAobmVnYXRpdmUpJywgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRJbXBvcnRJbkNCdWlsZGVyKCk7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdHhCdWlsZGVyLnRocmVzaG9sZCgtMSk7XG4gICAgICAgIH0sXG4gICAgICAgIChlOiBhbnkpID0+IGUubWVzc2FnZS5pbmNsdWRlcygndGhyZXNob2xkJykgfHwgZS5tZXNzYWdlLmluY2x1ZGVzKCdncmVhdGVyJylcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgd2l0aCBpbnZhbGlkIHRvIGFkZHJlc3MgZm9ybWF0JywgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRJbXBvcnRJbkNCdWlsZGVyKCk7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdHhCdWlsZGVyLnRvKCdpbnZhbGlkLWFkZHJlc3MnKTtcbiAgICAgICAgfSxcbiAgICAgICAgKGU6IGFueSkgPT4gZS5tZXNzYWdlLmluY2x1ZGVzKCdJbnZhbGlkJykgfHwgZS5tZXNzYWdlLmluY2x1ZGVzKCdhZGRyZXNzJylcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFjY2VwdCB2YWxpZCB0byBhZGRyZXNzJywgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRJbXBvcnRJbkNCdWlsZGVyKCk7XG4gICAgICAoKCkgPT4gdHhCdWlsZGVyLnRvKHRlc3REYXRhLnRvKSkuc2hvdWxkLm5vdC50aHJvdygpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBhY2NlcHQgdmFsaWQgdGhyZXNob2xkJywgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRJbXBvcnRJbkNCdWlsZGVyKCk7XG4gICAgICAoKCkgPT4gdHhCdWlsZGVyLnRocmVzaG9sZCgyKSkuc2hvdWxkLm5vdC50aHJvdygpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBhY2NlcHQgdmFsaWQgY29udGV4dCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0SW1wb3J0SW5DQnVpbGRlcigpO1xuICAgICAgKCgpID0+IHR4QnVpbGRlci5jb250ZXh0KHRlc3REYXRhLmNvbnRleHQpKS5zaG91bGQubm90LnRocm93KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFjY2VwdCB2YWxpZCBmcm9tUHViS2V5IGFkZHJlc3NlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0SW1wb3J0SW5DQnVpbGRlcigpO1xuICAgICAgKCgpID0+IHR4QnVpbGRlci5mcm9tUHViS2V5KHRlc3REYXRhLnBBZGRyZXNzZXMpKS5zaG91bGQubm90LnRocm93KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIHNpZ25GbG93VGVzdCh7XG4gICAgdHJhbnNhY3Rpb25UeXBlOiAnSW1wb3J0IEMyUCcsXG4gICAgbmV3VHhGYWN0b3J5OiAoKSA9PiBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RmbHJwJykpLFxuICAgIG5ld1R4QnVpbGRlcjogKCkgPT5cbiAgICAgIG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGZscnAnKSlcbiAgICAgICAgLmdldEltcG9ydEluQ0J1aWxkZXIoKVxuICAgICAgICAudGhyZXNob2xkKHRlc3REYXRhLnRocmVzaG9sZClcbiAgICAgICAgLmZyb21QdWJLZXkodGVzdERhdGEucEFkZHJlc3NlcylcbiAgICAgICAgLmRlY29kZWRVdHhvcyh0ZXN0RGF0YS51dHhvcylcbiAgICAgICAgLnRvKHRlc3REYXRhLnRvKVxuICAgICAgICAuZmVlKHRlc3REYXRhLmZlZSlcbiAgICAgICAgLmNvbnRleHQodGVzdERhdGEuY29udGV4dCksXG4gICAgdW5zaWduZWRUeEhleDogdGVzdERhdGEudW5zaWduZWRIZXgsXG4gICAgaGFsZlNpZ25lZFR4SGV4OiB0ZXN0RGF0YS5oYWxmU2lnbnR4SGV4LFxuICAgIGZ1bGxTaWduZWRUeEhleDogdGVzdERhdGEuZnVsbFNpZ250eEhleCxcbiAgICBwcml2YXRlS2V5OiB7XG4gICAgICBwcnYxOiB0ZXN0RGF0YS5wcml2YXRlS2V5c1syXSxcbiAgICAgIHBydjI6IHRlc3REYXRhLnByaXZhdGVLZXlzWzBdLFxuICAgIH0sXG4gICAgdHhIYXNoOiB0ZXN0RGF0YS50eGhhc2gsXG4gIH0pO1xuICBkZXNjcmliZSgnYWRkcmVzc2VzSW5kZXggZXh0cmFjdGlvbiBhbmQgc2lnbmF0dXJlIHNsb3QgbWFwcGluZyBmb3IgSW1wb3J0SW5DJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgY29ycmVjdGx5IHBhcnNlIGhhbGYtc2lnbmVkIEltcG9ydEluQyB0eCBhbmQgYWRkIHNlY29uZCBzaWduYXR1cmUnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RmbHJwJykpLmZyb20odGVzdERhdGEuaGFsZlNpZ250eEhleCk7XG4gICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEucHJpdmF0ZUtleXNbMF0gfSk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgcmF3VHguc2hvdWxkLmVxdWFsKHRlc3REYXRhLmZ1bGxTaWdudHhIZXgpO1xuICAgICAgdHguaWQuc2hvdWxkLmVxdWFsKHRlc3REYXRhLnR4aGFzaCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHByZXNlcnZlIHRyYW5zYWN0aW9uIHN0cnVjdHVyZSB3aGVuIHBhcnNpbmcgdW5zaWduZWQgSW1wb3J0SW5DIHR4JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcGFyc2VkQnVpbGRlciA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGZscnAnKSkuZnJvbSh0ZXN0RGF0YS51bnNpZ25lZEhleCk7XG4gICAgICBjb25zdCBwYXJzZWRUeCA9IGF3YWl0IHBhcnNlZEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHBhcnNlZEhleCA9IHBhcnNlZFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBwYXJzZWRIZXguc2hvdWxkLmVxdWFsKHRlc3REYXRhLnVuc2lnbmVkSGV4KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgY29ycmVjdGx5IGhhbmRsZSBJbXBvcnRJbkMgc2lnbmluZyBmbG93OiBwYXJzZSAtPiBzaWduIC0+IHBhcnNlIC0+IHNpZ24nLCBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBTdGVwIDE6ICB1bnNpZ25lZCB0cmFuc2FjdGlvblxuICAgICAgY29uc3QgYnVpbGRlcjEgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RmbHJwJykpLmZyb20odGVzdERhdGEudW5zaWduZWRIZXgpO1xuICAgICAgY29uc3QgdW5zaWduZWRUeCA9IGF3YWl0IGJ1aWxkZXIxLmJ1aWxkKCk7XG4gICAgICBjb25zdCB1bnNpZ25lZEhleCA9IHVuc2lnbmVkVHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHVuc2lnbmVkSGV4LnNob3VsZC5lcXVhbCh0ZXN0RGF0YS51bnNpZ25lZEhleCk7XG4gICAgICBjb25zdCBidWlsZGVyMiA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGZscnAnKSkuZnJvbSh1bnNpZ25lZEhleCk7XG4gICAgICBidWlsZGVyMi5zaWduKHsga2V5OiB0ZXN0RGF0YS5wcml2YXRlS2V5c1syXSB9KTtcbiAgICAgIGNvbnN0IGhhbGZTaWduZWRUeCA9IGF3YWl0IGJ1aWxkZXIyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBoYWxmU2lnbmVkSGV4ID0gaGFsZlNpZ25lZFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBjb25zdCBidWlsZGVyMyA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGZscnAnKSkuZnJvbShoYWxmU2lnbmVkSGV4KTtcbiAgICAgIGJ1aWxkZXIzLnNpZ24oeyBrZXk6IHRlc3REYXRhLnByaXZhdGVLZXlzWzBdIH0pO1xuICAgICAgY29uc3QgZnVsbFNpZ25lZFR4ID0gYXdhaXQgYnVpbGRlcjMuYnVpbGQoKTtcbiAgICAgIGZ1bGxTaWduZWRUeC50b0Jyb2FkY2FzdEZvcm1hdCgpLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5mdWxsU2lnbnR4SGV4KTtcbiAgICAgIGZ1bGxTaWduZWRUeC5pZC5zaG91bGQuZXF1YWwodGVzdERhdGEudHhoYXNoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGF2ZSBjb3JyZWN0IG51bWJlciBvZiBzaWduYXR1cmVzIGZvciBJbXBvcnRJbkMgYWZ0ZXIgZnVsbCBzaWduIGZsb3cnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RmbHJwJykpLmZyb20odGVzdERhdGEuZnVsbFNpZ250eEhleCk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG4gICAgICB0eEpzb24uc2lnbmF0dXJlcy5sZW5ndGguc2hvdWxkLmVxdWFsKDIpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYXZlIGNvcnJlY3QgbnVtYmVyIG9mIHNpZ25hdHVyZXMgZm9yIEltcG9ydEluQyBoYWxmLXNpZ25lZCB0eCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGZscnAnKSkuZnJvbSh0ZXN0RGF0YS5oYWxmU2lnbnR4SGV4KTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcbiAgICAgIHR4SnNvbi5zaWduYXR1cmVzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhdmUgMCBzaWduYXR1cmVzIGZvciB1bnNpZ25lZCBJbXBvcnRJbkMgdHgnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RmbHJwJykpLmZyb20odGVzdERhdGEudW5zaWduZWRIZXgpO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuICAgICAgdHhKc29uLnNpZ25hdHVyZXMubGVuZ3RoLnNob3VsZC5lcXVhbCgwKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1VUWE8gYWRkcmVzcyBzb3J0aW5nIGZpeCAtIGFkZHJlc3NlcyBpbiBub24tc29ydGVkIG9yZGVyIGZvciBJbXBvcnRJbkMnLCAoKSA9PiB7XG4gICAgLyoqXG4gICAgICogVGhpcyB0ZXN0IHN1aXRlIHZlcmlmaWVzIHRoZSBmaXggZm9yIHRoZSBhZGRyZXNzIG9yZGVyaW5nIGJ1ZyBpbiBJbXBvcnRJbkMuXG4gICAgICpcbiAgICAgKiBUaGUgaXNzdWU6IFdoZW4gdGhlIEFQSSByZXR1cm5zIFVUWE8gYWRkcmVzc2VzIGluIGEgZGlmZmVyZW50IG9yZGVyIHRoYW4gaG93IHRoZXkncmVcbiAgICAgKiBzdG9yZWQgb24tY2hhaW4gKGxleGljb2dyYXBoaWNhbGx5IHNvcnRlZCBieSBieXRlIHZhbHVlKSwgdGhlIHNpZ0luZGljZXMgd291bGQgYmVcbiAgICAgKiBjb21wdXRlZCBpbmNvcnJlY3RseSwgY2F1c2luZyBzaWduYXR1cmUgdmVyaWZpY2F0aW9uIHRvIGZhaWwuXG4gICAgICpcbiAgICAgKiBUaGUgZml4OiBTb3J0IFVUWE8gYWRkcmVzc2VzIGJlZm9yZSBjb21wdXRpbmcgYWRkcmVzc2VzSW5kZXggdG8gbWF0Y2ggb24tY2hhaW4gb3JkZXIuXG4gICAgICovXG5cbiAgICAvLyBIZWxwZXIgdG8gY3JlYXRlIFVUWE8gd2l0aCBzcGVjaWZpYyBhZGRyZXNzIG9yZGVyXG4gICAgY29uc3QgY3JlYXRlVXR4b1dpdGhBZGRyZXNzT3JkZXIgPSAodXR4bzogKHR5cGVvZiB0ZXN0RGF0YS51dHhvcylbMF0sIGFkZHJlc3Nlczogc3RyaW5nW10pID0+ICh7XG4gICAgICAuLi51dHhvLFxuICAgICAgYWRkcmVzc2VzOiBhZGRyZXNzZXMsXG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGNvcnJlY3RseSBzb3J0IFVUWE8gYWRkcmVzc2VzIHdoZW4gYnVpbGRpbmcgSW1wb3J0SW5DIHRyYW5zYWN0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gQ3JlYXRlIFVUWE9zIHdpdGggYWRkcmVzc2VzIGluIHJldmVyc2VkIG9yZGVyIChzaW11bGF0aW5nIEFQSSByZXR1cm5pbmcgdW5zb3J0ZWQpXG4gICAgICBjb25zdCByZXZlcnNlZFV0eG9zID0gdGVzdERhdGEudXR4b3MubWFwKCh1dHhvKSA9PlxuICAgICAgICBjcmVhdGVVdHhvV2l0aEFkZHJlc3NPcmRlcih1dHhvLCBbLi4udXR4by5hZGRyZXNzZXNdLnJldmVyc2UoKSlcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnlcbiAgICAgICAgLmdldEltcG9ydEluQ0J1aWxkZXIoKVxuICAgICAgICAudGhyZXNob2xkKHRlc3REYXRhLnRocmVzaG9sZClcbiAgICAgICAgLmxvY2t0aW1lKHRlc3REYXRhLmxvY2t0aW1lKVxuICAgICAgICAuZnJvbVB1YktleSh0ZXN0RGF0YS5wQWRkcmVzc2VzKVxuICAgICAgICAudG8odGVzdERhdGEudG8pXG4gICAgICAgIC5leHRlcm5hbENoYWluSWQodGVzdERhdGEuc291cmNlQ2hhaW5JZClcbiAgICAgICAgLmZlZSh0ZXN0RGF0YS5mZWUpXG4gICAgICAgIC5jb250ZXh0KHRlc3REYXRhLmNvbnRleHQpXG4gICAgICAgIC5kZWNvZGVkVXR4b3MocmV2ZXJzZWRVdHhvcyk7XG5cbiAgICAgIC8vIFNob3VsZCBub3QgdGhyb3cgLSB0aGUgZml4IGVuc3VyZXMgYWRkcmVzc2VzIGFyZSBzb3J0ZWQgYmVmb3JlIGNvbXB1dGluZyBzaWdJbmRpY2VzXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG5cbiAgICAgIC8vIFZlcmlmeSB0cmFuc2FjdGlvbiBidWlsdCBzdWNjZXNzZnVsbHlcbiAgICAgIHR4SnNvbi50aHJlc2hvbGQuc2hvdWxkLmVxdWFsKDIpO1xuICAgICAgdHgudG9Ccm9hZGNhc3RGb3JtYXQoKS5zaG91bGQuYmUuYS5TdHJpbmcoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcHJvZHVjZSBzYW1lIHRyYW5zYWN0aW9uIGhleCByZWdhcmRsZXNzIG9mIGlucHV0IFVUWE8gYWRkcmVzcyBvcmRlciBmb3IgSW1wb3J0SW5DJywgYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gQnVpbGQgd2l0aCBvcmlnaW5hbCBhZGRyZXNzIG9yZGVyXG4gICAgICBjb25zdCB0eEJ1aWxkZXIxID0gZmFjdG9yeVxuICAgICAgICAuZ2V0SW1wb3J0SW5DQnVpbGRlcigpXG4gICAgICAgIC50aHJlc2hvbGQodGVzdERhdGEudGhyZXNob2xkKVxuICAgICAgICAubG9ja3RpbWUodGVzdERhdGEubG9ja3RpbWUpXG4gICAgICAgIC5mcm9tUHViS2V5KHRlc3REYXRhLnBBZGRyZXNzZXMpXG4gICAgICAgIC50byh0ZXN0RGF0YS50bylcbiAgICAgICAgLmV4dGVybmFsQ2hhaW5JZCh0ZXN0RGF0YS5zb3VyY2VDaGFpbklkKVxuICAgICAgICAuZmVlKHRlc3REYXRhLmZlZSlcbiAgICAgICAgLmNvbnRleHQodGVzdERhdGEuY29udGV4dClcbiAgICAgICAgLmRlY29kZWRVdHhvcyh0ZXN0RGF0YS51dHhvcyk7XG5cbiAgICAgIGNvbnN0IHR4MSA9IGF3YWl0IHR4QnVpbGRlcjEuYnVpbGQoKTtcbiAgICAgIGNvbnN0IGhleDEgPSB0eDEudG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgICAgLy8gQnVpbGQgd2l0aCByZXZlcnNlZCBhZGRyZXNzIG9yZGVyIGluIFVUWE9zXG4gICAgICBjb25zdCByZXZlcnNlZFV0eG9zID0gdGVzdERhdGEudXR4b3MubWFwKCh1dHhvKSA9PlxuICAgICAgICBjcmVhdGVVdHhvV2l0aEFkZHJlc3NPcmRlcih1dHhvLCBbLi4udXR4by5hZGRyZXNzZXNdLnJldmVyc2UoKSlcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHR4QnVpbGRlcjIgPSBmYWN0b3J5XG4gICAgICAgIC5nZXRJbXBvcnRJbkNCdWlsZGVyKClcbiAgICAgICAgLnRocmVzaG9sZCh0ZXN0RGF0YS50aHJlc2hvbGQpXG4gICAgICAgIC5sb2NrdGltZSh0ZXN0RGF0YS5sb2NrdGltZSlcbiAgICAgICAgLmZyb21QdWJLZXkodGVzdERhdGEucEFkZHJlc3NlcylcbiAgICAgICAgLnRvKHRlc3REYXRhLnRvKVxuICAgICAgICAuZXh0ZXJuYWxDaGFpbklkKHRlc3REYXRhLnNvdXJjZUNoYWluSWQpXG4gICAgICAgIC5mZWUodGVzdERhdGEuZmVlKVxuICAgICAgICAuY29udGV4dCh0ZXN0RGF0YS5jb250ZXh0KVxuICAgICAgICAuZGVjb2RlZFV0eG9zKHJldmVyc2VkVXR4b3MpO1xuXG4gICAgICBjb25zdCB0eDIgPSBhd2FpdCB0eEJ1aWxkZXIyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBoZXgyID0gdHgyLnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICAgIC8vIEJvdGggc2hvdWxkIHByb2R1Y2UgdGhlIHNhbWUgaGV4IHNpbmNlIGFkZHJlc3NlcyBnZXQgc29ydGVkXG4gICAgICBoZXgxLnNob3VsZC5lcXVhbChoZXgyKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIHNpZ25pbmcgY29ycmVjdGx5IHdpdGggdW5zb3J0ZWQgVVRYTyBhZGRyZXNzZXMgZm9yIEltcG9ydEluQycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJldmVyc2VkVXR4b3MgPSB0ZXN0RGF0YS51dHhvcy5tYXAoKHV0eG8pID0+XG4gICAgICAgIGNyZWF0ZVV0eG9XaXRoQWRkcmVzc09yZGVyKHV0eG8sIFsuLi51dHhvLmFkZHJlc3Nlc10ucmV2ZXJzZSgpKVxuICAgICAgKTtcblxuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeVxuICAgICAgICAuZ2V0SW1wb3J0SW5DQnVpbGRlcigpXG4gICAgICAgIC50aHJlc2hvbGQodGVzdERhdGEudGhyZXNob2xkKVxuICAgICAgICAubG9ja3RpbWUodGVzdERhdGEubG9ja3RpbWUpXG4gICAgICAgIC5mcm9tUHViS2V5KHRlc3REYXRhLnBBZGRyZXNzZXMpXG4gICAgICAgIC50byh0ZXN0RGF0YS50bylcbiAgICAgICAgLmV4dGVybmFsQ2hhaW5JZCh0ZXN0RGF0YS5zb3VyY2VDaGFpbklkKVxuICAgICAgICAuZmVlKHRlc3REYXRhLmZlZSlcbiAgICAgICAgLmNvbnRleHQodGVzdERhdGEuY29udGV4dClcbiAgICAgICAgLmRlY29kZWRVdHhvcyhyZXZlcnNlZFV0eG9zKTtcblxuICAgICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLnByaXZhdGVLZXlzWzJdIH0pO1xuICAgICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLnByaXZhdGVLZXlzWzBdIH0pO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG5cbiAgICAgIC8vIFNob3VsZCBoYXZlIDIgc2lnbmF0dXJlcyBhZnRlciBzaWduaW5nXG4gICAgICB0eEpzb24uc2lnbmF0dXJlcy5sZW5ndGguc2hvdWxkLmVxdWFsKDIpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBwcm9kdWNlIHZhbGlkIHNpZ25lZCB0cmFuc2FjdGlvbiBtYXRjaGluZyBleHBlY3RlZCBvdXRwdXQgd2l0aCB1bnNvcnRlZCBhZGRyZXNzZXMgZm9yIEltcG9ydEluQycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJldmVyc2VkVXR4b3MgPSB0ZXN0RGF0YS51dHhvcy5tYXAoKHV0eG8pID0+XG4gICAgICAgIGNyZWF0ZVV0eG9XaXRoQWRkcmVzc09yZGVyKHV0eG8sIFsuLi51dHhvLmFkZHJlc3Nlc10ucmV2ZXJzZSgpKVxuICAgICAgKTtcblxuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeVxuICAgICAgICAuZ2V0SW1wb3J0SW5DQnVpbGRlcigpXG4gICAgICAgIC50aHJlc2hvbGQodGVzdERhdGEudGhyZXNob2xkKVxuICAgICAgICAubG9ja3RpbWUodGVzdERhdGEubG9ja3RpbWUpXG4gICAgICAgIC5mcm9tUHViS2V5KHRlc3REYXRhLnBBZGRyZXNzZXMpXG4gICAgICAgIC50byh0ZXN0RGF0YS50bylcbiAgICAgICAgLmV4dGVybmFsQ2hhaW5JZCh0ZXN0RGF0YS5zb3VyY2VDaGFpbklkKVxuICAgICAgICAuZmVlKHRlc3REYXRhLmZlZSlcbiAgICAgICAgLmNvbnRleHQodGVzdERhdGEuY29udGV4dClcbiAgICAgICAgLmRlY29kZWRVdHhvcyhyZXZlcnNlZFV0eG9zKTtcblxuICAgICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLnByaXZhdGVLZXlzWzJdIH0pO1xuICAgICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLnByaXZhdGVLZXlzWzBdIH0pO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuXG4gICAgICAvLyBUaGUgc2lnbmVkIHR4IHNob3VsZCBtYXRjaCB0aGUgZXhwZWN0ZWQgZnVsbFNpZ250eEhleCBmcm9tIHRlc3REYXRhXG4gICAgICB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5mdWxsU2lnbnR4SGV4KTtcbiAgICAgIHR4LmlkLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS50eGhhc2gpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZnJlc2ggYnVpbGQgd2l0aCBkaWZmZXJlbnQgVVRYTyBhZGRyZXNzIG9yZGVyIGZvciBJbXBvcnRJbkMnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBjb3JyZWN0bHkgY29tcGxldGUgZnVsbCBzaWduIGZsb3cgd2l0aCBkaWZmZXJlbnQgVVRYTyBhZGRyZXNzIG9yZGVyIGZvciBJbXBvcnRJbkMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyMSA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGZscnAnKSkuZnJvbSh0ZXN0RGF0YS51bnNpZ25lZEhleCk7XG4gICAgICBjb25zdCB1bnNpZ25lZFR4ID0gYXdhaXQgYnVpbGRlcjEuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHVuc2lnbmVkSGV4ID0gdW5zaWduZWRUeC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICBjb25zdCBidWlsZGVyMiA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGZscnAnKSkuZnJvbSh1bnNpZ25lZEhleCk7XG4gICAgICBidWlsZGVyMi5zaWduKHsga2V5OiB0ZXN0RGF0YS5wcml2YXRlS2V5c1syXSB9KTtcbiAgICAgIGNvbnN0IGhhbGZTaWduZWRUeCA9IGF3YWl0IGJ1aWxkZXIyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBoYWxmU2lnbmVkSGV4ID0gaGFsZlNpZ25lZFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICAgIGhhbGZTaWduZWRUeC50b0pzb24oKS5zaWduYXR1cmVzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG5cbiAgICAgIGNvbnN0IGJ1aWxkZXIzID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0ZmxycCcpKS5mcm9tKGhhbGZTaWduZWRIZXgpO1xuICAgICAgYnVpbGRlcjMuc2lnbih7IGtleTogdGVzdERhdGEucHJpdmF0ZUtleXNbMF0gfSk7XG4gICAgICBjb25zdCBmdWxsU2lnbmVkVHggPSBhd2FpdCBidWlsZGVyMy5idWlsZCgpO1xuXG4gICAgICBmdWxsU2lnbmVkVHgudG9Kc29uKCkuc2lnbmF0dXJlcy5sZW5ndGguc2hvdWxkLmVxdWFsKDIpO1xuXG4gICAgICBjb25zdCB0eElkID0gZnVsbFNpZ25lZFR4LmlkO1xuICAgICAgdHhJZC5zaG91bGQuYmUuYS5TdHJpbmcoKTtcbiAgICAgIHR4SWQubGVuZ3RoLnNob3VsZC5iZS5ncmVhdGVyVGhhbigwKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIEltcG9ydEluQyBzaWduaW5nIGluIGRpZmZlcmVudCBvcmRlciBhbmQgc3RpbGwgcHJvZHVjZSB2YWxpZCB0eCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGZscnAnKSkuZnJvbSh0ZXN0RGF0YS51bnNpZ25lZEhleCk7XG5cbiAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5wcml2YXRlS2V5c1swXSB9KTtcbiAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5wcml2YXRlS2V5c1syXSB9KTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuXG4gICAgICB0eEpzb24uc2lnbmF0dXJlcy5sZW5ndGguc2hvdWxkLmVxdWFsKDIpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
@@ -0,0 +1,2 @@
1
+ import 'should';
2
+ //# sourceMappingURL=importInPTxBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"importInPTxBuilder.d.ts","sourceRoot":"","sources":["../../../../test/unit/lib/importInPTxBuilder.ts"],"names":[],"mappings":"AACA,OAAO,QAAQ,CAAC"}