@bitgo-beta/utxo-staking 1.1.1-beta.826 → 1.1.1-beta.827

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 (135) hide show
  1. package/dist/cjs/scripts/babylon-sync.d.ts +2 -0
  2. package/dist/cjs/scripts/babylon-sync.d.ts.map +1 -0
  3. package/dist/cjs/scripts/babylon-sync.js +126 -0
  4. package/dist/cjs/src/babylon/delegationMessage.d.ts.map +1 -0
  5. package/dist/cjs/src/babylon/delegationMessage.js +285 -0
  6. package/dist/cjs/src/babylon/descriptor.d.ts.map +1 -0
  7. package/dist/cjs/src/babylon/descriptor.js +97 -0
  8. package/dist/cjs/src/babylon/index.d.ts.map +1 -0
  9. package/dist/{src → cjs/src}/babylon/index.js +1 -1
  10. package/dist/cjs/src/babylon/network.d.ts.map +1 -0
  11. package/dist/{src → cjs/src}/babylon/network.js +1 -1
  12. package/dist/cjs/src/babylon/parseDescriptor.d.ts.map +1 -0
  13. package/dist/cjs/src/babylon/parseDescriptor.js +159 -0
  14. package/dist/cjs/src/babylon/stakingManager.d.ts.map +1 -0
  15. package/dist/cjs/src/babylon/stakingManager.js +120 -0
  16. package/dist/cjs/src/babylon/stakingParams.d.ts.map +1 -0
  17. package/dist/cjs/src/babylon/stakingParams.js +132 -0
  18. package/dist/cjs/src/babylon/undelegation/UndelegationResponse.d.ts.map +1 -0
  19. package/dist/{src → cjs/src}/babylon/undelegation/UndelegationResponse.js +1 -1
  20. package/dist/cjs/src/babylon/undelegation/index.d.ts.map +1 -0
  21. package/dist/{src → cjs/src}/babylon/undelegation/index.js +1 -1
  22. package/dist/cjs/src/babylon/undelegation/unbonding.d.ts.map +1 -0
  23. package/dist/cjs/src/babylon/undelegation/unbonding.js +111 -0
  24. package/dist/cjs/src/coreDao/descriptor.d.ts.map +1 -0
  25. package/dist/cjs/src/coreDao/descriptor.js +38 -0
  26. package/dist/cjs/src/coreDao/index.d.ts.map +1 -0
  27. package/dist/{src → cjs/src}/coreDao/index.js +1 -1
  28. package/dist/cjs/src/coreDao/opReturn.d.ts.map +1 -0
  29. package/dist/cjs/src/coreDao/opReturn.js +183 -0
  30. package/dist/cjs/src/coreDao/transaction.d.ts.map +1 -0
  31. package/dist/cjs/src/coreDao/transaction.js +34 -0
  32. package/dist/cjs/src/index.d.ts.map +1 -0
  33. package/dist/{src → cjs/src}/index.js +1 -1
  34. package/dist/cjs/test/unit/babylon/bug71.d.ts +2 -0
  35. package/dist/cjs/test/unit/babylon/bug71.d.ts.map +1 -0
  36. package/dist/cjs/test/unit/babylon/bug71.js +108 -0
  37. package/dist/cjs/test/unit/babylon/key.utils.d.ts +6 -0
  38. package/dist/cjs/test/unit/babylon/key.utils.d.ts.map +1 -0
  39. package/dist/cjs/test/unit/babylon/key.utils.js +68 -0
  40. package/dist/cjs/test/unit/babylon/transactions.d.ts +2 -0
  41. package/dist/cjs/test/unit/babylon/transactions.d.ts.map +1 -0
  42. package/dist/cjs/test/unit/babylon/transactions.js +338 -0
  43. package/dist/cjs/test/unit/babylon/undelegation.d.ts +2 -0
  44. package/dist/cjs/test/unit/babylon/undelegation.d.ts.map +1 -0
  45. package/dist/cjs/test/unit/babylon/undelegation.js +156 -0
  46. package/dist/cjs/test/unit/babylon/vendor.utils.d.ts +13 -0
  47. package/dist/cjs/test/unit/babylon/vendor.utils.d.ts.map +1 -0
  48. package/dist/cjs/test/unit/babylon/vendor.utils.js +78 -0
  49. package/dist/cjs/test/unit/coreDao/descriptor.d.ts +2 -0
  50. package/dist/cjs/test/unit/coreDao/descriptor.d.ts.map +1 -0
  51. package/dist/cjs/test/unit/coreDao/descriptor.js +144 -0
  52. package/dist/cjs/test/unit/coreDao/opReturn.d.ts +2 -0
  53. package/dist/cjs/test/unit/coreDao/opReturn.d.ts.map +1 -0
  54. package/dist/cjs/test/unit/coreDao/opReturn.js +275 -0
  55. package/dist/cjs/test/unit/coreDao/utils.d.ts +5 -0
  56. package/dist/cjs/test/unit/coreDao/utils.d.ts.map +1 -0
  57. package/dist/cjs/test/unit/coreDao/utils.js +54 -0
  58. package/dist/cjs/test/unit/fixtures.utils.d.ts +9 -0
  59. package/dist/cjs/test/unit/fixtures.utils.d.ts.map +1 -0
  60. package/dist/cjs/test/unit/fixtures.utils.js +91 -0
  61. package/dist/cjs/tsconfig.tsbuildinfo +1 -0
  62. package/dist/esm/babylon/delegationMessage.d.ts +38 -0
  63. package/dist/esm/babylon/delegationMessage.js +239 -0
  64. package/dist/esm/babylon/descriptor.d.ts +48 -0
  65. package/dist/esm/babylon/descriptor.js +91 -0
  66. package/dist/esm/babylon/index.d.ts +6 -0
  67. package/dist/esm/babylon/index.js +11 -0
  68. package/dist/esm/babylon/network.d.ts +7 -0
  69. package/dist/esm/babylon/network.js +29 -0
  70. package/dist/esm/babylon/params.mainnet.json +152 -0
  71. package/dist/esm/babylon/params.testnet.json +212 -0
  72. package/dist/esm/babylon/parseDescriptor.d.ts +26 -0
  73. package/dist/esm/babylon/parseDescriptor.js +155 -0
  74. package/dist/esm/babylon/stakingManager.d.ts +6 -0
  75. package/dist/esm/babylon/stakingManager.js +83 -0
  76. package/dist/esm/babylon/stakingParams.d.ts +40 -0
  77. package/dist/esm/babylon/stakingParams.js +86 -0
  78. package/dist/esm/babylon/undelegation/UndelegationResponse.d.ts +24 -0
  79. package/dist/esm/babylon/undelegation/UndelegationResponse.js +18 -0
  80. package/dist/esm/babylon/undelegation/index.d.ts +3 -0
  81. package/dist/esm/babylon/undelegation/index.js +3 -0
  82. package/dist/esm/babylon/undelegation/unbonding.d.ts +16 -0
  83. package/dist/esm/babylon/undelegation/unbonding.js +70 -0
  84. package/dist/esm/coreDao/descriptor.d.ts +18 -0
  85. package/dist/esm/coreDao/descriptor.js +35 -0
  86. package/dist/esm/coreDao/index.d.ts +4 -0
  87. package/dist/esm/coreDao/index.js +4 -0
  88. package/dist/esm/coreDao/opReturn.d.ts +41 -0
  89. package/dist/esm/coreDao/opReturn.js +175 -0
  90. package/dist/esm/coreDao/transaction.d.ts +28 -0
  91. package/dist/esm/coreDao/transaction.js +30 -0
  92. package/dist/esm/index.d.ts +3 -0
  93. package/dist/esm/index.js +3 -0
  94. package/package.json +26 -10
  95. package/dist/src/babylon/delegationMessage.js +0 -285
  96. package/dist/src/babylon/descriptor.js +0 -97
  97. package/dist/src/babylon/parseDescriptor.js +0 -159
  98. package/dist/src/babylon/stakingManager.js +0 -120
  99. package/dist/src/babylon/stakingParams.js +0 -132
  100. package/dist/src/babylon/undelegation/unbonding.js +0 -111
  101. package/dist/src/coreDao/descriptor.js +0 -38
  102. package/dist/src/coreDao/opReturn.js +0 -183
  103. package/dist/src/coreDao/transaction.js +0 -34
  104. /package/dist/{src → cjs/src}/babylon/delegationMessage.d.ts +0 -0
  105. /package/dist/{src → cjs/src}/babylon/descriptor.d.ts +0 -0
  106. /package/dist/{src → cjs/src}/babylon/index.d.ts +0 -0
  107. /package/dist/{src → cjs/src}/babylon/network.d.ts +0 -0
  108. /package/dist/{src → cjs/src}/babylon/params.mainnet.json +0 -0
  109. /package/dist/{src → cjs/src}/babylon/params.testnet.json +0 -0
  110. /package/dist/{src → cjs/src}/babylon/parseDescriptor.d.ts +0 -0
  111. /package/dist/{src → cjs/src}/babylon/stakingManager.d.ts +0 -0
  112. /package/dist/{src → cjs/src}/babylon/stakingParams.d.ts +0 -0
  113. /package/dist/{src → cjs/src}/babylon/undelegation/UndelegationResponse.d.ts +0 -0
  114. /package/dist/{src → cjs/src}/babylon/undelegation/index.d.ts +0 -0
  115. /package/dist/{src → cjs/src}/babylon/undelegation/unbonding.d.ts +0 -0
  116. /package/dist/{src → cjs/src}/coreDao/descriptor.d.ts +0 -0
  117. /package/dist/{src → cjs/src}/coreDao/index.d.ts +0 -0
  118. /package/dist/{src → cjs/src}/coreDao/opReturn.d.ts +0 -0
  119. /package/dist/{src → cjs/src}/coreDao/transaction.d.ts +0 -0
  120. /package/dist/{src → cjs/src}/index.d.ts +0 -0
  121. /package/dist/{src → esm}/babylon/delegationMessage.d.ts.map +0 -0
  122. /package/dist/{src → esm}/babylon/descriptor.d.ts.map +0 -0
  123. /package/dist/{src → esm}/babylon/index.d.ts.map +0 -0
  124. /package/dist/{src → esm}/babylon/network.d.ts.map +0 -0
  125. /package/dist/{src → esm}/babylon/parseDescriptor.d.ts.map +0 -0
  126. /package/dist/{src → esm}/babylon/stakingManager.d.ts.map +0 -0
  127. /package/dist/{src → esm}/babylon/stakingParams.d.ts.map +0 -0
  128. /package/dist/{src → esm}/babylon/undelegation/UndelegationResponse.d.ts.map +0 -0
  129. /package/dist/{src → esm}/babylon/undelegation/index.d.ts.map +0 -0
  130. /package/dist/{src → esm}/babylon/undelegation/unbonding.d.ts.map +0 -0
  131. /package/dist/{src → esm}/coreDao/descriptor.d.ts.map +0 -0
  132. /package/dist/{src → esm}/coreDao/index.d.ts.map +0 -0
  133. /package/dist/{src → esm}/coreDao/opReturn.d.ts.map +0 -0
  134. /package/dist/{src → esm}/coreDao/transaction.d.ts.map +0 -0
  135. /package/dist/{src → esm}/index.d.ts.map +0 -0
@@ -0,0 +1,275 @@
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
+ const utxo_lib_1 = require("@bitgo-beta/utxo-lib");
8
+ const testutil_1 = require("@bitgo-beta/utxo-core/testutil");
9
+ const coreDao_1 = require("../../../src/coreDao");
10
+ describe('OP_RETURN', function () {
11
+ const validVersion = 2;
12
+ const validChainId = coreDao_1.CORE_DAO_MAINNET_CHAIN_ID;
13
+ // random 20 byte buffers
14
+ const validDelegator = Buffer.alloc(20, utxo_lib_1.testutil.getKey('wasm-possum').publicKey);
15
+ const validValidator = Buffer.alloc(20, utxo_lib_1.testutil.getKey('possum-wasm').publicKey);
16
+ const validFee = 1;
17
+ const validRedeemScript = Buffer.from('522103a8295453660d5e212d55556666666666666666666666666666666666', 'hex');
18
+ const validTimelock = 800800;
19
+ let defaultScript;
20
+ before(async function () {
21
+ // https://docs.coredao.org/docs/Learn/products/btc-staking/design#op_return-output-1
22
+ const script = await (0, testutil_1.getFixture)('test/fixtures/coreDao/opReturn/documentation.txt', undefined);
23
+ (0, assert_1.default)(typeof script === 'string');
24
+ defaultScript = script;
25
+ });
26
+ describe('createCoreDaoOpReturnOutputScript', function () {
27
+ it('should throw if invalid parameters are passed', function () {
28
+ assert_1.default.throws(() => (0, coreDao_1.createCoreDaoOpReturnOutputScript)({
29
+ version: 292,
30
+ chainId: validChainId,
31
+ delegator: validDelegator,
32
+ validator: validValidator,
33
+ fee: validFee,
34
+ timelock: validTimelock,
35
+ }));
36
+ assert_1.default.throws(() => (0, coreDao_1.createCoreDaoOpReturnOutputScript)({
37
+ version: validVersion,
38
+ chainId: Buffer.alloc(32, 0),
39
+ delegator: validDelegator,
40
+ validator: validValidator,
41
+ fee: validFee,
42
+ timelock: validTimelock,
43
+ }));
44
+ assert_1.default.throws(() => (0, coreDao_1.createCoreDaoOpReturnOutputScript)({
45
+ version: validVersion,
46
+ chainId: validChainId,
47
+ delegator: Buffer.alloc(19, 0),
48
+ validator: validValidator,
49
+ fee: validFee,
50
+ timelock: validTimelock,
51
+ }));
52
+ assert_1.default.throws(() => (0, coreDao_1.createCoreDaoOpReturnOutputScript)({
53
+ version: validVersion,
54
+ chainId: validChainId,
55
+ delegator: validDelegator,
56
+ validator: Buffer.alloc(19, 0),
57
+ fee: validFee,
58
+ timelock: validTimelock,
59
+ }));
60
+ assert_1.default.throws(() => (0, coreDao_1.createCoreDaoOpReturnOutputScript)({
61
+ version: validVersion,
62
+ chainId: validChainId,
63
+ delegator: validDelegator,
64
+ validator: validValidator,
65
+ fee: 256,
66
+ timelock: validTimelock,
67
+ }));
68
+ assert_1.default.throws(() => (0, coreDao_1.createCoreDaoOpReturnOutputScript)({
69
+ version: validVersion,
70
+ chainId: validChainId,
71
+ delegator: validDelegator,
72
+ validator: validValidator,
73
+ fee: validFee,
74
+ timelock: -1,
75
+ }));
76
+ });
77
+ it('should throw if the length of the script is too long', function () {
78
+ assert_1.default.throws(() => (0, coreDao_1.createCoreDaoOpReturnOutputScript)({
79
+ version: validVersion,
80
+ chainId: validChainId,
81
+ delegator: validDelegator,
82
+ validator: validValidator,
83
+ fee: validFee,
84
+ redeemScript: Buffer.alloc(100),
85
+ }));
86
+ });
87
+ it('should return a buffer with the correct length', function () {
88
+ const script = (0, coreDao_1.createCoreDaoOpReturnOutputScript)({
89
+ version: validVersion,
90
+ chainId: validChainId,
91
+ delegator: validDelegator,
92
+ validator: validValidator,
93
+ fee: validFee,
94
+ timelock: validTimelock,
95
+ });
96
+ // Make sure that the first byte is the OP_RETURN opcode
97
+ assert_1.default.strictEqual(script[0], 0x6a);
98
+ // Make sure that the length of the script matches what is in the buffer
99
+ assert_1.default.strictEqual(
100
+ // We do not count the OP_RETURN opcode or the bytes for the length
101
+ script.length - 2, script[1]);
102
+ });
103
+ it('should have the correct placement of the values provided with a redeem script', function () {
104
+ // This should produce an Op_RETURN that needs the extra push bytes for the length
105
+ const script = (0, coreDao_1.createCoreDaoOpReturnOutputScript)({
106
+ version: validVersion,
107
+ chainId: validChainId,
108
+ delegator: validDelegator,
109
+ validator: validValidator,
110
+ fee: validFee,
111
+ redeemScript: validRedeemScript,
112
+ });
113
+ // Make sure that the first byte is the OP_RETURN opcode
114
+ assert_1.default.strictEqual(script[0], 0x6a);
115
+ // Make sure that the length of the script matches what is in the buffer
116
+ assert_1.default.strictEqual(script[1], 0x4c);
117
+ assert_1.default.strictEqual(
118
+ // We do not count the OP_RETURN opcode or the length + pushbytes
119
+ script.length - 3, script[2]);
120
+ // Satoshi plus identifier
121
+ assert_1.default.deepStrictEqual(script.subarray(3, 7).toString('hex'), coreDao_1.CORE_DAO_SATOSHI_PLUS_IDENTIFIER.toString('hex'));
122
+ // Make sure that the version is correct
123
+ assert_1.default.strictEqual(script[7], validVersion);
124
+ // Make sure that the chainId is correct
125
+ assert_1.default.deepStrictEqual(script.subarray(8, 10).toString('hex'), validChainId.toString('hex'));
126
+ // Make sure that the delegator is correct
127
+ assert_1.default.deepStrictEqual(script.subarray(10, 30).toString('hex'), validDelegator.toString('hex'));
128
+ // Make sure that the validator is correct
129
+ assert_1.default.deepStrictEqual(script.subarray(30, 50).toString('hex'), validValidator.toString('hex'));
130
+ // Make sure that the fee is correct
131
+ assert_1.default.strictEqual(script[50], validFee);
132
+ // Make sure that the redeemScript is correct
133
+ assert_1.default.deepStrictEqual(script.subarray(51, 51 + validRedeemScript.length).toString('hex'), validRedeemScript.toString('hex'));
134
+ });
135
+ it('should have the correct placement of the values provided with a blockheight timelock', function () {
136
+ // This should produce an Op_RETURN that needs the extra push bytes for the length
137
+ const script = (0, coreDao_1.createCoreDaoOpReturnOutputScript)({
138
+ version: validVersion,
139
+ chainId: validChainId,
140
+ delegator: validDelegator,
141
+ validator: validValidator,
142
+ fee: validFee,
143
+ timelock: validTimelock,
144
+ });
145
+ // Make sure that the first byte is the OP_RETURN opcode
146
+ assert_1.default.strictEqual(script[0], 0x6a);
147
+ // Make sure that the length of the script matches what is in the buffer
148
+ assert_1.default.strictEqual(
149
+ // We do not count the OP_RETURN opcode or the length
150
+ script.length - 2, script[1]);
151
+ // Satoshi plus identifier
152
+ assert_1.default.deepStrictEqual(script.subarray(2, 6).toString('hex'), coreDao_1.CORE_DAO_SATOSHI_PLUS_IDENTIFIER.toString('hex'));
153
+ // Make sure that the version is correct
154
+ assert_1.default.strictEqual(script[6], validVersion);
155
+ // Make sure that the chainId is correct
156
+ assert_1.default.deepStrictEqual(script.subarray(7, 9).toString('hex'), validChainId.toString('hex'));
157
+ // Make sure that the delegator is correct
158
+ assert_1.default.deepStrictEqual(script.subarray(9, 29).toString('hex'), validDelegator.toString('hex'));
159
+ // Make sure that the validator is correct
160
+ assert_1.default.deepStrictEqual(script.subarray(29, 49).toString('hex'), validValidator.toString('hex'));
161
+ // Make sure that the fee is correct
162
+ assert_1.default.strictEqual(script[49], validFee);
163
+ // Make sure that the redeemScript is correct
164
+ assert_1.default.deepStrictEqual(script.subarray(50, 54).toString('hex'), (0, coreDao_1.encodeTimelock)(validTimelock).toString('hex'));
165
+ assert_1.default.deepStrictEqual((0, coreDao_1.decodeTimelock)(script.subarray(50, 54)), validTimelock);
166
+ });
167
+ it('should have the correct placement of the values provided with a time timelock', function () {
168
+ // This should produce an Op_RETURN that needs the extra push bytes for the length
169
+ const timelock = new Date('2022-01-01T00:00:00Z').getTime() / 1000;
170
+ const script = (0, coreDao_1.createCoreDaoOpReturnOutputScript)({
171
+ version: validVersion,
172
+ chainId: validChainId,
173
+ delegator: validDelegator,
174
+ validator: validValidator,
175
+ fee: validFee,
176
+ timelock,
177
+ });
178
+ // Make sure that the first byte is the OP_RETURN opcode
179
+ assert_1.default.strictEqual(script[0], 0x6a);
180
+ // Make sure that the length of the script matches what is in the buffer
181
+ assert_1.default.strictEqual(
182
+ // We do not count the OP_RETURN opcode or the length
183
+ script.length - 2, script[1]);
184
+ // Satoshi plus identifier
185
+ assert_1.default.deepStrictEqual(script.subarray(2, 6).toString('hex'), coreDao_1.CORE_DAO_SATOSHI_PLUS_IDENTIFIER.toString('hex'));
186
+ // Make sure that the version is correct
187
+ assert_1.default.strictEqual(script[6], validVersion);
188
+ // Make sure that the chainId is correct
189
+ assert_1.default.deepStrictEqual(script.subarray(7, 9).toString('hex'), validChainId.toString('hex'));
190
+ // Make sure that the delegator is correct
191
+ assert_1.default.deepStrictEqual(script.subarray(9, 29).toString('hex'), validDelegator.toString('hex'));
192
+ // Make sure that the validator is correct
193
+ assert_1.default.deepStrictEqual(script.subarray(29, 49).toString('hex'), validValidator.toString('hex'));
194
+ // Make sure that the fee is correct
195
+ assert_1.default.strictEqual(script[49], validFee);
196
+ // Make sure that the redeemScript is correct
197
+ assert_1.default.deepStrictEqual(script.subarray(50, 54).toString('hex'), (0, coreDao_1.encodeTimelock)(timelock).toString('hex'));
198
+ assert_1.default.deepStrictEqual((0, coreDao_1.decodeTimelock)(script.subarray(50, 54)), timelock);
199
+ });
200
+ it('should recreate the example OP_RETURN correctly', function () {
201
+ assert_1.default.deepStrictEqual((0, coreDao_1.createCoreDaoOpReturnOutputScript)({
202
+ version: 1,
203
+ chainId: Buffer.from('045b', 'hex'),
204
+ delegator: Buffer.from('de60b7d0e6b758ca5dd8c61d377a2c5f1af51ec1', 'hex'),
205
+ validator: Buffer.from('a9e209f5ea0036c8c2f41078a3cebee57d8a47d5', 'hex'),
206
+ fee: 1,
207
+ redeemScript: Buffer.from('041f5e0e66b17576a914c4b8ae927ff2b9ce218e20bf06d425d6b68424fd88ac', 'hex'),
208
+ }).toString('hex'), defaultScript);
209
+ });
210
+ });
211
+ describe('parseCoreDaoOpReturnOutputScript', function () {
212
+ it('should parse a valid script with a timelock', function () {
213
+ const script = (0, coreDao_1.createCoreDaoOpReturnOutputScript)({
214
+ version: validVersion,
215
+ chainId: validChainId,
216
+ delegator: validDelegator,
217
+ validator: validValidator,
218
+ fee: validFee,
219
+ timelock: validTimelock,
220
+ });
221
+ const parsed = (0, coreDao_1.parseCoreDaoOpReturnOutputScript)(script);
222
+ assert_1.default.strictEqual(parsed.version, validVersion);
223
+ assert_1.default.deepStrictEqual(parsed.chainId, validChainId);
224
+ assert_1.default.deepStrictEqual(parsed.delegator, validDelegator);
225
+ assert_1.default.deepStrictEqual(parsed.validator, validValidator);
226
+ assert_1.default.strictEqual(parsed.fee, validFee);
227
+ (0, assert_1.default)('timelock' in parsed);
228
+ assert_1.default.deepStrictEqual(parsed.timelock, validTimelock);
229
+ });
230
+ it('should parse a valid script with a redeem script', function () {
231
+ const script = (0, coreDao_1.createCoreDaoOpReturnOutputScript)({
232
+ version: validVersion,
233
+ chainId: validChainId,
234
+ delegator: validDelegator,
235
+ validator: validValidator,
236
+ fee: validFee,
237
+ redeemScript: validRedeemScript,
238
+ });
239
+ const parsed = (0, coreDao_1.parseCoreDaoOpReturnOutputScript)(script);
240
+ assert_1.default.strictEqual(parsed.version, validVersion);
241
+ assert_1.default.deepStrictEqual(parsed.chainId, validChainId);
242
+ assert_1.default.deepStrictEqual(parsed.delegator, validDelegator);
243
+ assert_1.default.deepStrictEqual(parsed.validator, validValidator);
244
+ assert_1.default.strictEqual(parsed.fee, validFee);
245
+ (0, assert_1.default)('redeemScript' in parsed);
246
+ assert_1.default.deepStrictEqual(parsed.redeemScript, validRedeemScript);
247
+ });
248
+ it('should parse valid opreturn script from testnet', async function () {
249
+ // Source: https://mempool.space/testnet/tx/66ed4cea26a410248a6d87f14b2bca514f33920c54d4af63ed46a903793115d5
250
+ const baseFixturePath = 'test/fixtures/coreDao/opReturn/66ed4cea26a410248a6d87f14b2bca514f33920c54d4af63ed46a903793115d5';
251
+ const opReturnHex = await (0, testutil_1.getFixture)(baseFixturePath + '.txt', undefined);
252
+ (0, assert_1.default)(typeof opReturnHex === 'string');
253
+ const parsed = (0, coreDao_1.parseCoreDaoOpReturnOutputScript)(Buffer.from(opReturnHex, 'hex'));
254
+ const parsedFixture = await (0, testutil_1.getFixture)(baseFixturePath + '.json', JSON.parse((0, coreDao_1.toString)(parsed)));
255
+ assert_1.default.deepStrictEqual((0, coreDao_1.toString)(parsed), JSON.stringify(parsedFixture));
256
+ });
257
+ it('should fail if there is an invalid op-return', function () {
258
+ const script = defaultScript.replace('6a4c50', '6b4c50');
259
+ assert_1.default.throws(() => (0, coreDao_1.parseCoreDaoOpReturnOutputScript)(Buffer.from(script, 'hex')));
260
+ });
261
+ it('should fail if the length is incorrect', function () {
262
+ const script = defaultScript.replace('4c50', '4c51');
263
+ assert_1.default.throws(() => (0, coreDao_1.parseCoreDaoOpReturnOutputScript)(Buffer.from(script, 'hex')));
264
+ });
265
+ it('should fail if the satoshi+ identifier is incorrect', function () {
266
+ const script = defaultScript.replace('5341542b', '5341532b');
267
+ assert_1.default.throws(() => (0, coreDao_1.parseCoreDaoOpReturnOutputScript)(Buffer.from(script, 'hex')));
268
+ });
269
+ it('should fail if the chainId is incorrect', function () {
270
+ const script = defaultScript.replace('045b', '0454');
271
+ assert_1.default.throws(() => (0, coreDao_1.parseCoreDaoOpReturnOutputScript)(Buffer.from(script, 'hex')));
272
+ });
273
+ });
274
+ });
275
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BSZXR1cm4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZXN0L3VuaXQvY29yZURhby9vcFJldHVybi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG9EQUE0QjtBQUU1QixtREFBZ0Q7QUFDaEQsNkRBQTREO0FBRTVELGtEQVE4QjtBQUU5QixRQUFRLENBQUMsV0FBVyxFQUFFO0lBQ3BCLE1BQU0sWUFBWSxHQUFHLENBQUMsQ0FBQztJQUN2QixNQUFNLFlBQVksR0FBRyxtQ0FBeUIsQ0FBQztJQUMvQyx5QkFBeUI7SUFDekIsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsbUJBQVEsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDbEYsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsbUJBQVEsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDbEYsTUFBTSxRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBQ25CLE1BQU0saUJBQWlCLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxnRUFBZ0UsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUMvRyxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUM7SUFDN0IsSUFBSSxhQUFxQixDQUFDO0lBRTFCLE1BQU0sQ0FBQyxLQUFLO1FBQ1YscUZBQXFGO1FBQ3JGLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBQSxxQkFBVSxFQUFDLGtEQUFrRCxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQy9GLElBQUEsZ0JBQU0sRUFBQyxPQUFPLE1BQU0sS0FBSyxRQUFRLENBQUMsQ0FBQztRQUNuQyxhQUFhLEdBQUcsTUFBTSxDQUFDO0lBQ3pCLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLG1DQUFtQyxFQUFFO1FBQzVDLEVBQUUsQ0FBQywrQ0FBK0Ms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LENBQUM7UUFFSCxFQUFFLENBQUMsOENBQThDLEVBQUU7WUFDakQsTUFBTSxNQUFNLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDekQsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBQSwwQ0FBZ0MsRUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEYsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsd0NBQXdDLEVBQUU7WUFDM0MsTUFBTSxNQUFNLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDckQsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBQSwwQ0FBZ0MsRUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEYsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMscURBQXFELEVBQUU7WUFDeEQsTUFBTSxNQUFNLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDN0QsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBQSwwQ0FBZ0MsRUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEYsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMseUNBQXlDLEVBQUU7WUFDNUMsTUFBTSxNQUFNLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDckQsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBQSwwQ0FBZ0MsRUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEYsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQgeyB0ZXN0dXRpbCB9IGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tbGliJztcbmltcG9ydCB7IGdldEZpeHR1cmUgfSBmcm9tICdAYml0Z28tYmV0YS91dHhvLWNvcmUvdGVzdHV0aWwnO1xuXG5pbXBvcnQge1xuICBDT1JFX0RBT19NQUlOTkVUX0NIQUlOX0lELFxuICBDT1JFX0RBT19TQVRPU0hJX1BMVVNfSURFTlRJRklFUixcbiAgY3JlYXRlQ29yZURhb09wUmV0dXJuT3V0cHV0U2NyaXB0LFxuICBkZWNvZGVUaW1lbG9jayxcbiAgZW5jb2RlVGltZWxvY2ssXG4gIHBhcnNlQ29yZURhb09wUmV0dXJuT3V0cHV0U2NyaXB0LFxuICB0b1N0cmluZyxcbn0gZnJvbSAnLi4vLi4vLi4vc3JjL2NvcmVEYW8nO1xuXG5kZXNjcmliZSgnT1BfUkVUVVJOJywgZnVuY3Rpb24gKCkge1xuICBjb25zdCB2YWxpZFZlcnNpb24gPSAyO1xuICBjb25zdCB2YWxpZENoYWluSWQgPSBDT1JFX0RBT19NQUlOTkVUX0NIQUlOX0lEO1xuICAvLyByYW5kb20gMjAgYnl0ZSBidWZmZXJzXG4gIGNvbnN0IHZhbGlkRGVsZWdhdG9yID0gQnVmZmVyLmFsbG9jKDIwLCB0ZXN0dXRpbC5nZXRLZXkoJ3dhc20tcG9zc3VtJykucHVibGljS2V5KTtcbiAgY29uc3QgdmFsaWRWYWxpZGF0b3IgPSBCdWZmZXIuYWxsb2MoMjAsIHRlc3R1dGlsLmdldEtleSgncG9zc3VtLXdhc20nKS5wdWJsaWNLZXkpO1xuICBjb25zdCB2YWxpZEZlZSA9IDE7XG4gIGNvbnN0IHZhbGlkUmVkZWVtU2NyaXB0ID0gQnVmZmVyLmZyb20oJzUyMjEwM2E4Mjk1NDUzNjYwZDVlMjEyZDU1NTU2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2JywgJ2hleCcpO1xuICBjb25zdCB2YWxpZFRpbWVsb2NrID0gODAwODAwO1xuICBsZXQgZGVmYXVsdFNjcmlwdDogc3RyaW5nO1xuXG4gIGJlZm9yZShhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgLy8gaHR0cHM6Ly9kb2NzLmNvcmVkYW8ub3JnL2RvY3MvTGVhcm4vcHJvZHVjdHMvYnRjLXN0YWtpbmcvZGVzaWduI29wX3JldHVybi1vdXRwdXQtMVxuICAgIGNvbnN0IHNjcmlwdCA9IGF3YWl0IGdldEZpeHR1cmUoJ3Rlc3QvZml4dHVyZXMvY29yZURhby9vcFJldHVybi9kb2N1bWVudGF0aW9uLnR4dCcsIHVuZGVmaW5lZCk7XG4gICAgYXNzZXJ0KHR5cGVvZiBzY3JpcHQgPT09ICdzdHJpbmcnKTtcbiAgICBkZWZhdWx0U2NyaXB0ID0gc2NyaXB0O1xuICB9KTtcblxuICBkZXNjcmliZSgnY3JlYXRlQ29yZURhb09wUmV0dXJuT3V0cHV0U2NyaXB0JywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgdGhyb3cgaWYgaW52YWxpZCBwYXJhbWV0ZXJzIGFyZSBwYXNzZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+XG4gICAgICAgIGNyZWF0ZUNvcmVEYW9PcFJldHVybk91dHB1dFNjcmlwdCh7XG4gICAgICAgICAgdmVyc2lvbjogMjkyLFxuICAgICAgICAgIGNoYWluSWQ6IHZhbGlkQ2hhaW5JZCxcbiAgICAgICAgICBkZWxlZ2F0b3I6IHZhbGlkRGVsZWdhdG9yLFxuICAgICAgICAgIHZhbGlkYXRvcjogdmFsaWRWYWxpZGF0b3IsXG4gICAgICAgICAgZmVlOiB2YWxpZEZlZSxcbiAgICAgICAgICB0aW1lbG9jazogdmFsaWRUaW1lbG9jayxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+XG4gICAgICAgIGNyZWF0ZUNvcmVEYW9PcFJldHVybk91dHB1dFNjcmlwdCh7XG4gICAgICAgICAgdmVyc2lvbjogdmFsaWRWZXJzaW9uLFxuICAgICAgICAgIGNoYWluSWQ6IEJ1ZmZlci5hbGxvYygzMiwgMCksXG4gICAgICAgICAgZGVsZWdhdG9yOiB2YWxpZERlbGVnYXRvcixcbiAgICAgICAgICB2YWxpZGF0b3I6IHZhbGlkVmFsaWRhdG9yLFxuICAgICAgICAgIGZlZTogdmFsaWRGZWUsXG4gICAgICAgICAgdGltZWxvY2s6IHZhbGlkVGltZWxvY2ssXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PlxuICAgICAgICBjcmVhdGVDb3JlRGFvT3BSZXR1cm5PdXRwdXRTY3JpcHQoe1xuICAgICAgICAgIHZlcnNpb246IHZhbGlkVmVyc2lvbixcbiAgICAgICAgICBjaGFpbklkOiB2YWxpZENoYWluSWQsXG4gICAgICAgICAgZGVsZWdhdG9yOiBCdWZmZXIuYWxsb2MoMTksIDApLFxuICAgICAgICAgIHZhbGlkYXRvcjogdmFsaWRWYWxpZGF0b3IsXG4gICAgICAgICAgZmVlOiB2YWxpZEZlZSxcbiAgICAgICAgICB0aW1lbG9jazogdmFsaWRUaW1lbG9jayxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+XG4gICAgICAgIGNyZWF0ZUNvcmVEYW9PcFJldHVybk91dHB1dFNjcmlwdCh7XG4gICAgICAgICAgdmVyc2lvbjogdmFsaWRWZXJzaW9uLFxuICAgICAgICAgIGNoYWluSWQ6IHZhbGlkQ2hhaW5JZCxcbiAgICAgICAgICBkZWxlZ2F0b3I6IHZhbGlkRGVsZWdhdG9yLFxuICAgICAgICAgIHZhbGlkYXRvcjogQnVmZmVyLmFsbG9jKDE5LCAwKSxcbiAgICAgICAgICBmZWU6IHZhbGlkRmVlLFxuICAgICAgICAgIHRpbWVsb2NrOiB2YWxpZFRpbWVsb2NrLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT5cbiAgICAgICAgY3JlYXRlQ29yZURhb09wUmV0dXJuT3V0cHV0U2NyaXB0KHtcbiAgICAgICAgICB2ZXJzaW9uOiB2YWxpZFZlcnNpb24sXG4gICAgICAgICAgY2hhaW5JZDogdmFsaWRDaGFpbklkLFxuICAgICAgICAgIGRlbGVnYXRvcjogdmFsaWREZWxlZ2F0b3IsXG4gICAgICAgICAgdmFsaWRhdG9yOiB2YWxpZFZhbGlkYXRvcixcbiAgICAgICAgICBmZWU6IDI1NixcbiAgICAgICAgICB0aW1lbG9jazogdmFsaWRUaW1lbG9jayxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+XG4gICAgICAgIGNyZWF0ZUNvcmVEYW9PcFJldHVybk91dHB1dFNjcmlwdCh7XG4gICAgICAgICAgdmVyc2lvbjogdmFsaWRWZXJzaW9uLFxuICAgICAgICAgIGNoYWluSWQ6IHZhbGlkQ2hhaW5JZCxcbiAgICAgICAgICBkZWxlZ2F0b3I6IHZhbGlkRGVsZWdhdG9yLFxuICAgICAgICAgIHZhbGlkYXRvcjogdmFsaWRWYWxpZGF0b3IsXG4gICAgICAgICAgZmVlOiB2YWxpZEZlZSxcbiAgICAgICAgICB0aW1lbG9jazogLTEsXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBpZiB0aGUgbGVuZ3RoIG9mIHRoZSBzY3JpcHQgaXMgdG9vIGxvbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+XG4gICAgICAgIGNyZWF0ZUNvcmVEYW9PcFJldHVybk91dHB1dFNjcmlwdCh7XG4gICAgICAgICAgdmVyc2lvbjogdmFsaWRWZXJzaW9uLFxuICAgICAgICAgIGNoYWluSWQ6IHZhbGlkQ2hhaW5JZCxcbiAgICAgICAgICBkZWxlZ2F0b3I6IHZhbGlkRGVsZWdhdG9yLFxuICAgICAgICAgIHZhbGlkYXRvcjogdmFsaWRWYWxpZGF0b3IsXG4gICAgICAgICAgZmVlOiB2YWxpZEZlZSxcbiAgICAgICAgICByZWRlZW1TY3JpcHQ6IEJ1ZmZlci5hbGxvYygxMDApLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGEgYnVmZmVyIHdpdGggdGhlIGNvcnJlY3QgbGVuZ3RoJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgc2NyaXB0ID0gY3JlYXRlQ29yZURhb09wUmV0dXJuT3V0cHV0U2NyaXB0KHtcbiAgICAgICAgdmVyc2lvbjogdmFsaWRWZXJzaW9uLFxuICAgICAgICBjaGFpbklkOiB2YWxpZENoYWluSWQsXG4gICAgICAgIGRlbGVnYXRvcjogdmFsaWREZWxlZ2F0b3IsXG4gICAgICAgIHZhbGlkYXRvcjogdmFsaWRWYWxpZGF0b3IsXG4gICAgICAgIGZlZTogdmFsaWRGZWUsXG4gICAgICAgIHRpbWVsb2NrOiB2YWxpZFRpbWVsb2NrLFxuICAgICAgfSk7XG4gICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgZmlyc3QgYnl0ZSBpcyB0aGUgT1BfUkVUVVJOIG9wY29kZVxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHNjcmlwdFswXSwgMHg2YSk7XG4gICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgbGVuZ3RoIG9mIHRoZSBzY3JpcHQgbWF0Y2hlcyB3aGF0IGlzIGluIHRoZSBidWZmZXJcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChcbiAgICAgICAgLy8gV2UgZG8gbm90IGNvdW50IHRoZSBPUF9SRVRVUk4gb3Bjb2RlIG9yIHRoZSBieXRlcyBmb3IgdGhlIGxlbmd0aFxuICAgICAgICBzY3JpcHQubGVuZ3RoIC0gMixcbiAgICAgICAgc2NyaXB0WzFdXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYXZlIHRoZSBjb3JyZWN0IHBsYWNlbWVudCBvZiB0aGUgdmFsdWVzIHByb3ZpZGVkIHdpdGggYSByZWRlZW0gc2NyaXB0JywgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gVGhpcyBzaG91bGQgcHJvZHVjZSBhbiBPcF9SRVRVUk4gdGhhdCBuZWVkcyB0aGUgZXh0cmEgcHVzaCBieXRlcyBmb3IgdGhlIGxlbmd0aFxuICAgICAgY29uc3Qgc2NyaXB0ID0gY3JlYXRlQ29yZURhb09wUmV0dXJuT3V0cHV0U2NyaXB0KHtcbiAgICAgICAgdmVyc2lvbjogdmFsaWRWZXJzaW9uLFxuICAgICAgICBjaGFpbklkOiB2YWxpZENoYWluSWQsXG4gICAgICAgIGRlbGVnYXRvcjogdmFsaWREZWxlZ2F0b3IsXG4gICAgICAgIHZhbGlkYXRvcjogdmFsaWRWYWxpZGF0b3IsXG4gICAgICAgIGZlZTogdmFsaWRGZWUsXG4gICAgICAgIHJlZGVlbVNjcmlwdDogdmFsaWRSZWRlZW1TY3JpcHQsXG4gICAgICB9KTtcbiAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBmaXJzdCBieXRlIGlzIHRoZSBPUF9SRVRVUk4gb3Bjb2RlXG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoc2NyaXB0WzBdLCAweDZhKTtcbiAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBsZW5ndGggb2YgdGhlIHNjcmlwdCBtYXRjaGVzIHdoYXQgaXMgaW4gdGhlIGJ1ZmZlclxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHNjcmlwdFsxXSwgMHg0Yyk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoXG4gICAgICAgIC8vIFdlIGRvIG5vdCBjb3VudCB0aGUgT1BfUkVUVVJOIG9wY29kZSBvciB0aGUgbGVuZ3RoICsgcHVzaGJ5dGVzXG4gICAgICAgIHNjcmlwdC5sZW5ndGggLSAzLFxuICAgICAgICBzY3JpcHRbMl1cbiAgICAgICk7XG4gICAgICAvLyBTYXRvc2hpIHBsdXMgaWRlbnRpZmllclxuICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChzY3JpcHQuc3ViYXJyYXkoMywgNykudG9TdHJpbmcoJ2hleCcpLCBDT1JFX0RBT19TQVRPU0hJX1BMVVNfSURFTlRJRklFUi50b1N0cmluZygnaGV4JykpO1xuICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIHZlcnNpb24gaXMgY29ycmVjdFxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHNjcmlwdFs3XSwgdmFsaWRWZXJzaW9uKTtcbiAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBjaGFpbklkIGlzIGNvcnJlY3RcbiAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoc2NyaXB0LnN1YmFycmF5KDgsIDEwKS50b1N0cmluZygnaGV4JyksIHZhbGlkQ2hhaW5JZC50b1N0cmluZygnaGV4JykpO1xuICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIGRlbGVnYXRvciBpcyBjb3JyZWN0XG4gICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHNjcmlwdC5zdWJhcnJheSgxMCwgMzApLnRvU3RyaW5nKCdoZXgnKSwgdmFsaWREZWxlZ2F0b3IudG9TdHJpbmcoJ2hleCcpKTtcbiAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSB2YWxpZGF0b3IgaXMgY29ycmVjdFxuICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChzY3JpcHQuc3ViYXJyYXkoMzAsIDUwKS50b1N0cmluZygnaGV4JyksIHZhbGlkVmFsaWRhdG9yLnRvU3RyaW5nKCdoZXgnKSk7XG4gICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgZmVlIGlzIGNvcnJlY3RcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChzY3JpcHRbNTBdLCB2YWxpZEZlZSk7XG4gICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgcmVkZWVtU2NyaXB0IGlzIGNvcnJlY3RcbiAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoXG4gICAgICAgIHNjcmlwdC5zdWJhcnJheSg1MSwgNTEgKyB2YWxpZFJlZGVlbVNjcmlwdC5sZW5ndGgpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgdmFsaWRSZWRlZW1TY3JpcHQudG9TdHJpbmcoJ2hleCcpXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYXZlIHRoZSBjb3JyZWN0IHBsYWNlbWVudCBvZiB0aGUgdmFsdWVzIHByb3ZpZGVkIHdpdGggYSBibG9ja2hlaWdodCB0aW1lbG9jaycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFRoaXMgc2hvdWxkIHByb2R1Y2UgYW4gT3BfUkVUVVJOIHRoYXQgbmVlZHMgdGhlIGV4dHJhIHB1c2ggYnl0ZXMgZm9yIHRoZSBsZW5ndGhcbiAgICAgIGNvbnN0IHNjcmlwdCA9IGNyZWF0ZUNvcmVEYW9PcFJldHVybk91dHB1dFNjcmlwdCh7XG4gICAgICAgIHZlcnNpb246IHZhbGlkVmVyc2lvbixcbiAgICAgICAgY2hhaW5JZDogdmFsaWRDaGFpbklkLFxuICAgICAgICBkZWxlZ2F0b3I6IHZhbGlkRGVsZWdhdG9yLFxuICAgICAgICB2YWxpZGF0b3I6IHZhbGlkVmFsaWRhdG9yLFxuICAgICAgICBmZWU6IHZhbGlkRmVlLFxuICAgICAgICB0aW1lbG9jazogdmFsaWRUaW1lbG9jayxcbiAgICAgIH0pO1xuICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIGZpcnN0IGJ5dGUgaXMgdGhlIE9QX1JFVFVSTiBvcGNvZGVcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChzY3JpcHRbMF0sIDB4NmEpO1xuICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIGxlbmd0aCBvZiB0aGUgc2NyaXB0IG1hdGNoZXMgd2hhdCBpcyBpbiB0aGUgYnVmZmVyXG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoXG4gICAgICAgIC8vIFdlIGRvIG5vdCBjb3VudCB0aGUgT1BfUkVUVVJOIG9wY29kZSBvciB0aGUgbGVuZ3RoXG4gICAgICAgIHNjcmlwdC5sZW5ndGggLSAyLFxuICAgICAgICBzY3JpcHRbMV1cbiAgICAgICk7XG4gICAgICAvLyBTYXRvc2hpIHBsdXMgaWRlbnRpZmllclxuICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChzY3JpcHQuc3ViYXJyYXkoMiwgNikudG9TdHJpbmcoJ2hleCcpLCBDT1JFX0RBT19TQVRPU0hJX1BMVVNfSURFTlRJRklFUi50b1N0cmluZygnaGV4JykpO1xuICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIHZlcnNpb24gaXMgY29ycmVjdFxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHNjcmlwdFs2XSwgdmFsaWRWZXJzaW9uKTtcbiAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBjaGFpbklkIGlzIGNvcnJlY3RcbiAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoc2NyaXB0LnN1YmFycmF5KDcsIDkpLnRvU3RyaW5nKCdoZXgnKSwgdmFsaWRDaGFpbklkLnRvU3RyaW5nKCdoZXgnKSk7XG4gICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgZGVsZWdhdG9yIGlzIGNvcnJlY3RcbiAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoc2NyaXB0LnN1YmFycmF5KDksIDI5KS50b1N0cmluZygnaGV4JyksIHZhbGlkRGVsZWdhdG9yLnRvU3RyaW5nKCdoZXgnKSk7XG4gICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgdmFsaWRhdG9yIGlzIGNvcnJlY3RcbiAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoc2NyaXB0LnN1YmFycmF5KDI5LCA0OSkudG9TdHJpbmcoJ2hleCcpLCB2YWxpZFZhbGlkYXRvci50b1N0cmluZygnaGV4JykpO1xuICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIGZlZSBpcyBjb3JyZWN0XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoc2NyaXB0WzQ5XSwgdmFsaWRGZWUpO1xuICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIHJlZGVlbVNjcmlwdCBpcyBjb3JyZWN0XG4gICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHNjcmlwdC5zdWJhcnJheSg1MCwgNTQpLnRvU3RyaW5nKCdoZXgnKSwgZW5jb2RlVGltZWxvY2sodmFsaWRUaW1lbG9jaykudG9TdHJpbmcoJ2hleCcpKTtcbiAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoZGVjb2RlVGltZWxvY2soc2NyaXB0LnN1YmFycmF5KDUwLCA1NCkpLCB2YWxpZFRpbWVsb2NrKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGF2ZSB0aGUgY29ycmVjdCBwbGFjZW1lbnQgb2YgdGhlIHZhbHVlcyBwcm92aWRlZCB3aXRoIGEgdGltZSB0aW1lbG9jaycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFRoaXMgc2hvdWxkIHByb2R1Y2UgYW4gT3BfUkVUVVJOIHRoYXQgbmVlZHMgdGhlIGV4dHJhIHB1c2ggYnl0ZXMgZm9yIHRoZSBsZW5ndGhcbiAgICAgIGNvbnN0IHRpbWVsb2NrID0gbmV3IERhdGUoJzIwMjItMDEtMDFUMDA6MDA6MDBaJykuZ2V0VGltZSgpIC8gMTAwMDtcbiAgICAgIGNvbnN0IHNjcmlwdCA9IGNyZWF0ZUNvcmVEYW9PcFJldHVybk91dHB1dFNjcmlwdCh7XG4gICAgICAgIHZlcnNpb246IHZhbGlkVmVyc2lvbixcbiAgICAgICAgY2hhaW5JZDogdmFsaWRDaGFpbklkLFxuICAgICAgICBkZWxlZ2F0b3I6IHZhbGlkRGVsZWdhdG9yLFxuICAgICAgICB2YWxpZGF0b3I6IHZhbGlkVmFsaWRhdG9yLFxuICAgICAgICBmZWU6IHZhbGlkRmVlLFxuICAgICAgICB0aW1lbG9jayxcbiAgICAgIH0pO1xuICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIGZpcnN0IGJ5dGUgaXMgdGhlIE9QX1JFVFVSTiBvcGNvZGVcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChzY3JpcHRbMF0sIDB4NmEpO1xuICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIGxlbmd0aCBvZiB0aGUgc2NyaXB0IG1hdGNoZXMgd2hhdCBpcyBpbiB0aGUgYnVmZmVyXG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoXG4gICAgICAgIC8vIFdlIGRvIG5vdCBjb3VudCB0aGUgT1BfUkVUVVJOIG9wY29kZSBvciB0aGUgbGVuZ3RoXG4gICAgICAgIHNjcmlwdC5sZW5ndGggLSAyLFxuICAgICAgICBzY3JpcHRbMV1cbiAgICAgICk7XG4gICAgICAvLyBTYXRvc2hpIHBsdXMgaWRlbnRpZmllclxuICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChzY3JpcHQuc3ViYXJyYXkoMiwgNikudG9TdHJpbmcoJ2hleCcpLCBDT1JFX0RBT19TQVRPU0hJX1BMVVNfSURFTlRJRklFUi50b1N0cmluZygnaGV4JykpO1xuICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIHZlcnNpb24gaXMgY29ycmVjdFxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHNjcmlwdFs2XSwgdmFsaWRWZXJzaW9uKTtcbiAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBjaGFpbklkIGlzIGNvcnJlY3RcbiAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoc2NyaXB0LnN1YmFycmF5KDcsIDkpLnRvU3RyaW5nKCdoZXgnKSwgdmFsaWRDaGFpbklkLnRvU3RyaW5nKCdoZXgnKSk7XG4gICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgZGVsZWdhdG9yIGlzIGNvcnJlY3RcbiAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoc2NyaXB0LnN1YmFycmF5KDksIDI5KS50b1N0cmluZygnaGV4JyksIHZhbGlkRGVsZWdhdG9yLnRvU3RyaW5nKCdoZXgnKSk7XG4gICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgdmFsaWRhdG9yIGlzIGNvcnJlY3RcbiAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoc2NyaXB0LnN1YmFycmF5KDI5LCA0OSkudG9TdHJpbmcoJ2hleCcpLCB2YWxpZFZhbGlkYXRvci50b1N0cmluZygnaGV4JykpO1xuICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIGZlZSBpcyBjb3JyZWN0XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoc2NyaXB0WzQ5XSwgdmFsaWRGZWUpO1xuICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIHJlZGVlbVNjcmlwdCBpcyBjb3JyZWN0XG4gICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHNjcmlwdC5zdWJhcnJheSg1MCwgNTQpLnRvU3RyaW5nKCdoZXgnKSwgZW5jb2RlVGltZWxvY2sodGltZWxvY2spLnRvU3RyaW5nKCdoZXgnKSk7XG4gICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKGRlY29kZVRpbWVsb2NrKHNjcmlwdC5zdWJhcnJheSg1MCwgNTQpKSwgdGltZWxvY2spO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWNyZWF0ZSB0aGUgZXhhbXBsZSBPUF9SRVRVUk4gY29ycmVjdGx5JywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChcbiAgICAgICAgY3JlYXRlQ29yZURhb09wUmV0dXJuT3V0cHV0U2NyaXB0KHtcbiAgICAgICAgICB2ZXJzaW9uOiAxLFxuICAgICAgICAgIGNoYWluSWQ6IEJ1ZmZlci5mcm9tKCcwNDViJywgJ2hleCcpLFxuICAgICAgICAgIGRlbGVnYXRvcjogQnVmZmVyLmZyb20oJ2RlNjBiN2QwZTZiNzU4Y2E1ZGQ4YzYxZDM3N2EyYzVmMWFmNTFlYzEnLCAnaGV4JyksXG4gICAgICAgICAgdmFsaWRhdG9yOiBCdWZmZXIuZnJvbSgnYTllMjA5ZjVlYTAwMzZjOGMyZjQxMDc4YTNjZWJlZTU3ZDhhNDdkNScsICdoZXgnKSxcbiAgICAgICAgICBmZWU6IDEsXG4gICAgICAgICAgcmVkZWVtU2NyaXB0OiBCdWZmZXIuZnJvbSgnMDQxZjVlMGU2NmIxNzU3NmE5MTRjNGI4YWU5MjdmZjJiOWNlMjE4ZTIwYmYwNmQ0MjVkNmI2ODQyNGZkODhhYycsICdoZXgnKSxcbiAgICAgICAgfSkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICBkZWZhdWx0U2NyaXB0XG4gICAgICApO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgncGFyc2VDb3JlRGFvT3BSZXR1cm5PdXRwdXRTY3JpcHQnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBwYXJzZSBhIHZhbGlkIHNjcmlwdCB3aXRoIGEgdGltZWxvY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBzY3JpcHQgPSBjcmVhdGVDb3JlRGFvT3BSZXR1cm5PdXRwdXRTY3JpcHQoe1xuICAgICAgICB2ZXJzaW9uOiB2YWxpZFZlcnNpb24sXG4gICAgICAgIGNoYWluSWQ6IHZhbGlkQ2hhaW5JZCxcbiAgICAgICAgZGVsZWdhdG9yOiB2YWxpZERlbGVnYXRvcixcbiAgICAgICAgdmFsaWRhdG9yOiB2YWxpZFZhbGlkYXRvcixcbiAgICAgICAgZmVlOiB2YWxpZEZlZSxcbiAgICAgICAgdGltZWxvY2s6IHZhbGlkVGltZWxvY2ssXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlQ29yZURhb09wUmV0dXJuT3V0cHV0U2NyaXB0KHNjcmlwdCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocGFyc2VkLnZlcnNpb24sIHZhbGlkVmVyc2lvbik7XG4gICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHBhcnNlZC5jaGFpbklkLCB2YWxpZENoYWluSWQpO1xuICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChwYXJzZWQuZGVsZWdhdG9yLCB2YWxpZERlbGVnYXRvcik7XG4gICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHBhcnNlZC52YWxpZGF0b3IsIHZhbGlkVmFsaWRhdG9yKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChwYXJzZWQuZmVlLCB2YWxpZEZlZSk7XG4gICAgICBhc3NlcnQoJ3RpbWVsb2NrJyBpbiBwYXJzZWQpO1xuICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChwYXJzZWQudGltZWxvY2ssIHZhbGlkVGltZWxvY2spO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBwYXJzZSBhIHZhbGlkIHNjcmlwdCB3aXRoIGEgcmVkZWVtIHNjcmlwdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHNjcmlwdCA9IGNyZWF0ZUNvcmVEYW9PcFJldHVybk91dHB1dFNjcmlwdCh7XG4gICAgICAgIHZlcnNpb246IHZhbGlkVmVyc2lvbixcbiAgICAgICAgY2hhaW5JZDogdmFsaWRDaGFpbklkLFxuICAgICAgICBkZWxlZ2F0b3I6IHZhbGlkRGVsZWdhdG9yLFxuICAgICAgICB2YWxpZGF0b3I6IHZhbGlkVmFsaWRhdG9yLFxuICAgICAgICBmZWU6IHZhbGlkRmVlLFxuICAgICAgICByZWRlZW1TY3JpcHQ6IHZhbGlkUmVkZWVtU2NyaXB0LFxuICAgICAgfSk7XG4gICAgICBjb25zdCBwYXJzZWQgPSBwYXJzZUNvcmVEYW9PcFJldHVybk91dHB1dFNjcmlwdChzY3JpcHQpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHBhcnNlZC52ZXJzaW9uLCB2YWxpZFZlcnNpb24pO1xuICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChwYXJzZWQuY2hhaW5JZCwgdmFsaWRDaGFpbklkKTtcbiAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwocGFyc2VkLmRlbGVnYXRvciwgdmFsaWREZWxlZ2F0b3IpO1xuICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChwYXJzZWQudmFsaWRhdG9yLCB2YWxpZFZhbGlkYXRvcik7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocGFyc2VkLmZlZSwgdmFsaWRGZWUpO1xuICAgICAgYXNzZXJ0KCdyZWRlZW1TY3JpcHQnIGluIHBhcnNlZCk7XG4gICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHBhcnNlZC5yZWRlZW1TY3JpcHQsIHZhbGlkUmVkZWVtU2NyaXB0KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcGFyc2UgdmFsaWQgb3ByZXR1cm4gc2NyaXB0IGZyb20gdGVzdG5ldCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFNvdXJjZTogaHR0cHM6Ly9tZW1wb29sLnNwYWNlL3Rlc3RuZXQvdHgvNjZlZDRjZWEyNmE0MTAyNDhhNmQ4N2YxNGIyYmNhNTE0ZjMzOTIwYzU0ZDRhZjYzZWQ0NmE5MDM3OTMxMTVkNVxuICAgICAgY29uc3QgYmFzZUZpeHR1cmVQYXRoID1cbiAgICAgICAgJ3Rlc3QvZml4dHVyZXMvY29yZURhby9vcFJldHVybi82NmVkNGNlYTI2YTQxMDI0OGE2ZDg3ZjE0YjJiY2E1MTRmMzM5MjBjNTRkNGFmNjNlZDQ2YTkwMzc5MzExNWQ1JztcbiAgICAgIGNvbnN0IG9wUmV0dXJuSGV4ID0gYXdhaXQgZ2V0Rml4dHVyZShiYXNlRml4dHVyZVBhdGggKyAnLnR4dCcsIHVuZGVmaW5lZCk7XG4gICAgICBhc3NlcnQodHlwZW9mIG9wUmV0dXJuSGV4ID09PSAnc3RyaW5nJyk7XG4gICAgICBjb25zdCBwYXJzZWQgPSBwYXJzZUNvcmVEYW9PcFJldHVybk91dHB1dFNjcmlwdChCdWZmZXIuZnJvbShvcFJldHVybkhleCwgJ2hleCcpKTtcbiAgICAgIGNvbnN0IHBhcnNlZEZpeHR1cmUgPSBhd2FpdCBnZXRGaXh0dXJlKGJhc2VGaXh0dXJlUGF0aCArICcuanNvbicsIEpTT04ucGFyc2UodG9TdHJpbmcocGFyc2VkKSkpO1xuICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbCh0b1N0cmluZyhwYXJzZWQpLCBKU09OLnN0cmluZ2lmeShwYXJzZWRGaXh0dXJlKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgaWYgdGhlcmUgaXMgYW4gaW52YWxpZCBvcC1yZXR1cm4nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBzY3JpcHQgPSBkZWZhdWx0U2NyaXB0LnJlcGxhY2UoJzZhNGM1MCcsICc2YjRjNTAnKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gcGFyc2VDb3JlRGFvT3BSZXR1cm5PdXRwdXRTY3JpcHQoQnVmZmVyLmZyb20oc2NyaXB0LCAnaGV4JykpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCBpZiB0aGUgbGVuZ3RoIGlzIGluY29ycmVjdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHNjcmlwdCA9IGRlZmF1bHRTY3JpcHQucmVwbGFjZSgnNGM1MCcsICc0YzUxJyk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHBhcnNlQ29yZURhb09wUmV0dXJuT3V0cHV0U2NyaXB0KEJ1ZmZlci5mcm9tKHNjcmlwdCwgJ2hleCcpKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgaWYgdGhlIHNhdG9zaGkrIGlkZW50aWZpZXIgaXMgaW5jb3JyZWN0JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgc2NyaXB0ID0gZGVmYXVsdFNjcmlwdC5yZXBsYWNlKCc1MzQxNTQyYicsICc1MzQxNTMyYicpO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiBwYXJzZUNvcmVEYW9PcFJldHVybk91dHB1dFNjcmlwdChCdWZmZXIuZnJvbShzY3JpcHQsICdoZXgnKSkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIGlmIHRoZSBjaGFpbklkIGlzIGluY29ycmVjdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHNjcmlwdCA9IGRlZmF1bHRTY3JpcHQucmVwbGFjZSgnMDQ1YicsICcwNDU0Jyk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHBhcnNlQ29yZURhb09wUmV0dXJuT3V0cHV0U2NyaXB0KEJ1ZmZlci5mcm9tKHNjcmlwdCwgJ2hleCcpKSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
@@ -0,0 +1,5 @@
1
+ import { Descriptor } from '@bitgo/wasm-utxo';
2
+ import * as utxolib from '@bitgo-beta/utxo-lib';
3
+ export declare function updateInputWithDescriptor(psbt: utxolib.Psbt, inputIndex: number, descriptor: Descriptor): void;
4
+ export declare function finalizePsbt(psbt: utxolib.Psbt): utxolib.bitgo.UtxoPsbt;
5
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../../test/unit/coreDao/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAQ,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,OAAO,MAAM,sBAAsB,CAAC;AAEhD,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,GAAG,IAAI,CAM9G;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,CAMvE"}
@@ -0,0 +1,54 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.updateInputWithDescriptor = updateInputWithDescriptor;
37
+ exports.finalizePsbt = finalizePsbt;
38
+ const wasm_utxo_1 = require("@bitgo/wasm-utxo");
39
+ const utxolib = __importStar(require("@bitgo-beta/utxo-lib"));
40
+ function updateInputWithDescriptor(psbt, inputIndex, descriptor) {
41
+ const wrappedPsbt = wasm_utxo_1.Psbt.deserialize(psbt.toBuffer());
42
+ wrappedPsbt.updateInputWithDescriptor(inputIndex, descriptor);
43
+ psbt.data.inputs[inputIndex] = utxolib.bitgo.UtxoPsbt.fromBuffer(Buffer.from(wrappedPsbt.serialize()), {
44
+ network: utxolib.networks.bitcoin,
45
+ }).data.inputs[inputIndex];
46
+ }
47
+ function finalizePsbt(psbt) {
48
+ const wrappedPsbt = wasm_utxo_1.Psbt.deserialize(psbt.toBuffer());
49
+ wrappedPsbt.finalize();
50
+ return utxolib.bitgo.UtxoPsbt.fromBuffer(Buffer.from(wrappedPsbt.serialize()), {
51
+ network: utxolib.networks.bitcoin,
52
+ });
53
+ }
54
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZXN0L3VuaXQvY29yZURhby91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUdBLDhEQU1DO0FBRUQsb0NBTUM7QUFqQkQsZ0RBQW9EO0FBQ3BELDhEQUFnRDtBQUVoRCxTQUFnQix5QkFBeUIsQ0FBQyxJQUFrQixFQUFFLFVBQWtCLEVBQUUsVUFBc0I7SUFDdEcsTUFBTSxXQUFXLEdBQUcsZ0JBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDdEQsV0FBVyxDQUFDLHlCQUF5QixDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUM5RCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLENBQUMsRUFBRTtRQUNyRyxPQUFPLEVBQUUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPO0tBQ2xDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQzdCLENBQUM7QUFFRCxTQUFnQixZQUFZLENBQUMsSUFBa0I7SUFDN0MsTUFBTSxXQUFXLEdBQUcsZ0JBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDdEQsV0FBVyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUU7UUFDN0UsT0FBTyxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTztLQUNsQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGVzY3JpcHRvciwgUHNidCB9IGZyb20gJ0BiaXRnby93YXNtLXV0eG8nO1xuaW1wb3J0ICogYXMgdXR4b2xpYiBmcm9tICdAYml0Z28tYmV0YS91dHhvLWxpYic7XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVJbnB1dFdpdGhEZXNjcmlwdG9yKHBzYnQ6IHV0eG9saWIuUHNidCwgaW5wdXRJbmRleDogbnVtYmVyLCBkZXNjcmlwdG9yOiBEZXNjcmlwdG9yKTogdm9pZCB7XG4gIGNvbnN0IHdyYXBwZWRQc2J0ID0gUHNidC5kZXNlcmlhbGl6ZShwc2J0LnRvQnVmZmVyKCkpO1xuICB3cmFwcGVkUHNidC51cGRhdGVJbnB1dFdpdGhEZXNjcmlwdG9yKGlucHV0SW5kZXgsIGRlc2NyaXB0b3IpO1xuICBwc2J0LmRhdGEuaW5wdXRzW2lucHV0SW5kZXhdID0gdXR4b2xpYi5iaXRnby5VdHhvUHNidC5mcm9tQnVmZmVyKEJ1ZmZlci5mcm9tKHdyYXBwZWRQc2J0LnNlcmlhbGl6ZSgpKSwge1xuICAgIG5ldHdvcms6IHV0eG9saWIubmV0d29ya3MuYml0Y29pbixcbiAgfSkuZGF0YS5pbnB1dHNbaW5wdXRJbmRleF07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5hbGl6ZVBzYnQocHNidDogdXR4b2xpYi5Qc2J0KTogdXR4b2xpYi5iaXRnby5VdHhvUHNidCB7XG4gIGNvbnN0IHdyYXBwZWRQc2J0ID0gUHNidC5kZXNlcmlhbGl6ZShwc2J0LnRvQnVmZmVyKCkpO1xuICB3cmFwcGVkUHNidC5maW5hbGl6ZSgpO1xuICByZXR1cm4gdXR4b2xpYi5iaXRnby5VdHhvUHNidC5mcm9tQnVmZmVyKEJ1ZmZlci5mcm9tKHdyYXBwZWRQc2J0LnNlcmlhbGl6ZSgpKSwge1xuICAgIG5ldHdvcms6IHV0eG9saWIubmV0d29ya3MuYml0Y29pbixcbiAgfSk7XG59XG4iXX0=
@@ -0,0 +1,9 @@
1
+ import assert from 'assert';
2
+ import { ast } from '@bitgo/wasm-utxo';
3
+ export declare function normalize(v: unknown): unknown;
4
+ type EqualsAssertion = typeof assert.deepStrictEqual;
5
+ export declare function assertEqualsFixture(fixtureName: string, value: unknown, n?: typeof normalize, eq?: EqualsAssertion): Promise<void>;
6
+ export declare function assertTransactionEqualsFixture(fixtureName: string, tx: unknown): Promise<void>;
7
+ export declare function assertEqualsMiniscript(script: Buffer, miniscript: ast.MiniscriptNode): void;
8
+ export {};
9
+ //# sourceMappingURL=fixtures.utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fixtures.utils.d.ts","sourceRoot":"","sources":["../../../../test/unit/fixtures.utils.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,OAAO,EAAE,GAAG,EAA0B,MAAM,kBAAkB,CAAC;AAM/D,wBAAgB,SAAS,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CA6B7C;AAED,KAAK,eAAe,GAAG,OAAO,MAAM,CAAC,eAAe,CAAC;AAErD,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,OAAO,EACd,CAAC,mBAAY,EACb,EAAE,GAAE,eAAwC,GAC3C,OAAO,CAAC,IAAI,CAAC,CAGf;AAED,wBAAsB,8BAA8B,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAEpG;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,CAAC,cAAc,GAAG,IAAI,CAO3F"}
@@ -0,0 +1,91 @@
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.normalize = normalize;
40
+ exports.assertEqualsFixture = assertEqualsFixture;
41
+ exports.assertTransactionEqualsFixture = assertTransactionEqualsFixture;
42
+ exports.assertEqualsMiniscript = assertEqualsMiniscript;
43
+ const assert_1 = __importDefault(require("assert"));
44
+ const wasm_utxo_1 = require("@bitgo/wasm-utxo");
45
+ const utxolib = __importStar(require("@bitgo-beta/utxo-lib"));
46
+ const bitcoinjslib = __importStar(require("bitcoinjs-lib"));
47
+ const testutil_1 = require("@bitgo-beta/utxo-core/testutil");
48
+ const descriptor_1 = require("@bitgo-beta/utxo-core/testutil/descriptor");
49
+ function normalize(v) {
50
+ if (typeof v === 'bigint') {
51
+ return v.toString();
52
+ }
53
+ if (v instanceof wasm_utxo_1.Descriptor) {
54
+ return v.toString();
55
+ }
56
+ if (v instanceof Uint8Array) {
57
+ v = Buffer.from(v);
58
+ }
59
+ if (v instanceof Buffer) {
60
+ return v.toString('hex');
61
+ }
62
+ if (v instanceof bitcoinjslib.Psbt) {
63
+ v = utxolib.Psbt.fromBuffer(v.toBuffer());
64
+ }
65
+ if (v instanceof utxolib.Psbt) {
66
+ return (0, descriptor_1.toPlainObjectFromPsbt)(v);
67
+ }
68
+ if (v instanceof utxolib.Transaction) {
69
+ return (0, descriptor_1.toPlainObjectFromTx)(v);
70
+ }
71
+ if (Array.isArray(v)) {
72
+ return v.map(normalize);
73
+ }
74
+ if (typeof v === 'object' && v !== null) {
75
+ return Object.fromEntries(Object.entries(v).flatMap(([k, v]) => (v === undefined ? [] : [[k, normalize(v)]])));
76
+ }
77
+ return v;
78
+ }
79
+ async function assertEqualsFixture(fixtureName, value, n = normalize, eq = assert_1.default.deepStrictEqual) {
80
+ value = n(value);
81
+ eq(await (0, testutil_1.getFixture)(fixtureName, value), value);
82
+ }
83
+ async function assertTransactionEqualsFixture(fixtureName, tx) {
84
+ await assertEqualsFixture(fixtureName, normalize(tx));
85
+ }
86
+ function assertEqualsMiniscript(script, miniscript) {
87
+ const ms = wasm_utxo_1.Miniscript.fromBitcoinScript(script, 'tap');
88
+ assert_1.default.deepStrictEqual(wasm_utxo_1.ast.fromMiniscript(ms), miniscript);
89
+ assert_1.default.deepStrictEqual(script.toString('hex'), Buffer.from(wasm_utxo_1.Miniscript.fromString(wasm_utxo_1.ast.formatNode(miniscript), 'tap').encode()).toString('hex'));
90
+ }
91
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml4dHVyZXMudXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L3VuaXQvZml4dHVyZXMudXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFRQSw4QkE2QkM7QUFJRCxrREFRQztBQUVELHdFQUVDO0FBRUQsd0RBT0M7QUE5REQsb0RBQTRCO0FBRTVCLGdEQUErRDtBQUMvRCw4REFBZ0Q7QUFDaEQsNERBQThDO0FBQzlDLDZEQUE0RDtBQUM1RCwwRUFBdUc7QUFFdkcsU0FBZ0IsU0FBUyxDQUFDLENBQVU7SUFDbEMsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUMxQixPQUFPLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBQ0QsSUFBSSxDQUFDLFlBQVksc0JBQVUsRUFBRSxDQUFDO1FBQzVCLE9BQU8sQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFDRCxJQUFJLENBQUMsWUFBWSxVQUFVLEVBQUUsQ0FBQztRQUM1QixDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyQixDQUFDO0lBQ0QsSUFBSSxDQUFDLFlBQVksTUFBTSxFQUFFLENBQUM7UUFDeEIsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUFDRCxJQUFJLENBQUMsWUFBWSxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbkMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFDRCxJQUFJLENBQUMsWUFBWSxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDOUIsT0FBTyxJQUFBLGtDQUFxQixFQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFDRCxJQUFJLENBQUMsWUFBWSxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDckMsT0FBTyxJQUFBLGdDQUFtQixFQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFDRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNyQixPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUNELElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUN4QyxPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNqSCxDQUFDO0lBQ0QsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDO0FBSU0sS0FBSyxVQUFVLG1CQUFtQixDQUN2QyxXQUFtQixFQUNuQixLQUFjLEVBQ2QsQ0FBQyxHQUFHLFNBQVMsRUFDYixLQUFzQixnQkFBTSxDQUFDLGVBQWU7SUFFNUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNqQixFQUFFLENBQUMsTUFBTSxJQUFBLHFCQUFVLEVBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ2xELENBQUM7QUFFTSxLQUFLLFVBQVUsOEJBQThCLENBQUMsV0FBbUIsRUFBRSxFQUFXO0lBQ25GLE1BQU0sbUJBQW1CLENBQUMsV0FBVyxFQUFFLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3hELENBQUM7QUFFRCxTQUFnQixzQkFBc0IsQ0FBQyxNQUFjLEVBQUUsVUFBOEI7SUFDbkYsTUFBTSxFQUFFLEdBQUcsc0JBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDdkQsZ0JBQU0sQ0FBQyxlQUFlLENBQUMsZUFBRyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUMzRCxnQkFBTSxDQUFDLGVBQWUsQ0FDcEIsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFDdEIsTUFBTSxDQUFDLElBQUksQ0FBQyxzQkFBVSxDQUFDLFVBQVUsQ0FBQyxlQUFHLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUMvRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuaW1wb3J0IHsgYXN0LCBEZXNjcmlwdG9yLCBNaW5pc2NyaXB0IH0gZnJvbSAnQGJpdGdvL3dhc20tdXR4byc7XG5pbXBvcnQgKiBhcyB1dHhvbGliIGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tbGliJztcbmltcG9ydCAqIGFzIGJpdGNvaW5qc2xpYiBmcm9tICdiaXRjb2luanMtbGliJztcbmltcG9ydCB7IGdldEZpeHR1cmUgfSBmcm9tICdAYml0Z28tYmV0YS91dHhvLWNvcmUvdGVzdHV0aWwnO1xuaW1wb3J0IHsgdG9QbGFpbk9iamVjdEZyb21UeCwgdG9QbGFpbk9iamVjdEZyb21Qc2J0IH0gZnJvbSAnQGJpdGdvLWJldGEvdXR4by1jb3JlL3Rlc3R1dGlsL2Rlc2NyaXB0b3InO1xuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplKHY6IHVua25vd24pOiB1bmtub3duIHtcbiAgaWYgKHR5cGVvZiB2ID09PSAnYmlnaW50Jykge1xuICAgIHJldHVybiB2LnRvU3RyaW5nKCk7XG4gIH1cbiAgaWYgKHYgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7XG4gICAgcmV0dXJuIHYudG9TdHJpbmcoKTtcbiAgfVxuICBpZiAodiBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICB2ID0gQnVmZmVyLmZyb20odik7XG4gIH1cbiAgaWYgKHYgaW5zdGFuY2VvZiBCdWZmZXIpIHtcbiAgICByZXR1cm4gdi50b1N0cmluZygnaGV4Jyk7XG4gIH1cbiAgaWYgKHYgaW5zdGFuY2VvZiBiaXRjb2luanNsaWIuUHNidCkge1xuICAgIHYgPSB1dHhvbGliLlBzYnQuZnJvbUJ1ZmZlcih2LnRvQnVmZmVyKCkpO1xuICB9XG4gIGlmICh2IGluc3RhbmNlb2YgdXR4b2xpYi5Qc2J0KSB7XG4gICAgcmV0dXJuIHRvUGxhaW5PYmplY3RGcm9tUHNidCh2KTtcbiAgfVxuICBpZiAodiBpbnN0YW5jZW9mIHV0eG9saWIuVHJhbnNhY3Rpb24pIHtcbiAgICByZXR1cm4gdG9QbGFpbk9iamVjdEZyb21UeCh2KTtcbiAgfVxuICBpZiAoQXJyYXkuaXNBcnJheSh2KSkge1xuICAgIHJldHVybiB2Lm1hcChub3JtYWxpemUpO1xuICB9XG4gIGlmICh0eXBlb2YgdiA9PT0gJ29iamVjdCcgJiYgdiAhPT0gbnVsbCkge1xuICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXModikuZmxhdE1hcCgoW2ssIHZdKSA9PiAodiA9PT0gdW5kZWZpbmVkID8gW10gOiBbW2ssIG5vcm1hbGl6ZSh2KV1dKSkpO1xuICB9XG4gIHJldHVybiB2O1xufVxuXG50eXBlIEVxdWFsc0Fzc2VydGlvbiA9IHR5cGVvZiBhc3NlcnQuZGVlcFN0cmljdEVxdWFsO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXNzZXJ0RXF1YWxzRml4dHVyZShcbiAgZml4dHVyZU5hbWU6IHN0cmluZyxcbiAgdmFsdWU6IHVua25vd24sXG4gIG4gPSBub3JtYWxpemUsXG4gIGVxOiBFcXVhbHNBc3NlcnRpb24gPSBhc3NlcnQuZGVlcFN0cmljdEVxdWFsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgdmFsdWUgPSBuKHZhbHVlKTtcbiAgZXEoYXdhaXQgZ2V0Rml4dHVyZShmaXh0dXJlTmFtZSwgdmFsdWUpLCB2YWx1ZSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhc3NlcnRUcmFuc2FjdGlvbkVxdWFsc0ZpeHR1cmUoZml4dHVyZU5hbWU6IHN0cmluZywgdHg6IHVua25vd24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgYXNzZXJ0RXF1YWxzRml4dHVyZShmaXh0dXJlTmFtZSwgbm9ybWFsaXplKHR4KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRFcXVhbHNNaW5pc2NyaXB0KHNjcmlwdDogQnVmZmVyLCBtaW5pc2NyaXB0OiBhc3QuTWluaXNjcmlwdE5vZGUpOiB2b2lkIHtcbiAgY29uc3QgbXMgPSBNaW5pc2NyaXB0LmZyb21CaXRjb2luU2NyaXB0KHNjcmlwdCwgJ3RhcCcpO1xuICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKGFzdC5mcm9tTWluaXNjcmlwdChtcyksIG1pbmlzY3JpcHQpO1xuICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKFxuICAgIHNjcmlwdC50b1N0cmluZygnaGV4JyksXG4gICAgQnVmZmVyLmZyb20oTWluaXNjcmlwdC5mcm9tU3RyaW5nKGFzdC5mb3JtYXROb2RlKG1pbmlzY3JpcHQpLCAndGFwJykuZW5jb2RlKCkpLnRvU3RyaW5nKCdoZXgnKVxuICApO1xufVxuIl19