@bitgo-beta/sdk-coin-dot 1.3.3-alpha.475 → 1.3.3-alpha.477

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.
@@ -4,7 +4,7 @@
4
4
  *
5
5
  * Compare serialized output between:
6
6
  * 1. Legacy approach (using @substrate/txwrapper-polkadot)
7
- * 2. WASM approach (using @bitgo/wasm-dot DotBuilder)
7
+ * 2. WASM approach (using @bitgo/wasm-dot buildTransaction)
8
8
  *
9
9
  * For unsigned transactions, legacy toBroadcastFormat() returns the signing payload
10
10
  * (via construct.signingPayload). We compare WASM signablePayload() against it.
@@ -13,6 +13,11 @@
13
13
  * a SCALE compact-length prefix. subxt encodes it as raw `Call` (no prefix).
14
14
  * We strip this prefix from the legacy side before comparing, since the actual
15
15
  * call data, era, nonce, tip, and chain context are identical.
16
+ *
17
+ * Note: wasm-dot@1.3.0 uses high-level business intents (payment, stake, unstake,
18
+ * claim, consolidate) instead of low-level call types. Batch and proxy operations
19
+ * are composed automatically from the intent (e.g., stake with proxyAddress
20
+ * produces batchAll(bond, addProxy)).
16
21
  */
17
22
  var __importDefault = (this && this.__importDefault) || function (mod) {
18
23
  return (mod && mod.__esModule) ? mod : { "default": mod };
@@ -21,7 +26,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
21
26
  const assert_1 = __importDefault(require("assert"));
22
27
  const statics_1 = require("@bitgo-beta/statics");
23
28
  const transactionBuilderFactory_1 = require("../../src/lib/transactionBuilderFactory");
24
- const iface_1 = require("../../src/lib/iface");
25
29
  const fixtures_1 = require("../fixtures");
26
30
  const utils_1 = __importDefault(require("../../src/lib/utils"));
27
31
  // Import WASM builder
@@ -84,7 +88,7 @@ describe('WASM vs Legacy Builder Byte Comparison', function () {
84
88
  .sequenceId({ name: 'Nonce', keyword: 'nonce', value: 0 });
85
89
  const legacyTx = await legacyBuilder.build();
86
90
  const legacyHex = legacyTx.toBroadcastFormat();
87
- const wasmTx = (0, wasm_dot_1.buildTransaction)({ type: 'transfer', to, amount: BigInt(amount), keepAlive: true }, createWasmContext());
91
+ const wasmTx = (0, wasm_dot_1.buildTransaction)({ type: 'payment', to, amount: BigInt(amount), keepAlive: true }, createWasmContext());
88
92
  const wasmHex = '0x' + Buffer.from(wasmTx.signablePayload()).toString('hex');
89
93
  assert_1.default.strictEqual(wasmHex, stripCompactPrefix(legacyHex), 'Signing payload should match');
90
94
  });
@@ -102,7 +106,7 @@ describe('WASM vs Legacy Builder Byte Comparison', function () {
102
106
  .sequenceId({ name: 'Nonce', keyword: 'nonce', value: 5 });
103
107
  const legacyTx = await legacyBuilder.build();
104
108
  const legacyHex = legacyTx.toBroadcastFormat();
105
- const wasmTx = (0, wasm_dot_1.buildTransaction)({ type: 'transfer', to, amount: BigInt(amount), keepAlive: true }, createWasmContext({ nonce: 5 }));
109
+ const wasmTx = (0, wasm_dot_1.buildTransaction)({ type: 'payment', to, amount: BigInt(amount), keepAlive: true }, createWasmContext({ nonce: 5 }));
106
110
  const wasmHex = '0x' + Buffer.from(wasmTx.signablePayload()).toString('hex');
107
111
  assert_1.default.strictEqual(wasmHex, stripCompactPrefix(legacyHex), 'Signing payload should match');
108
112
  });
@@ -111,40 +115,11 @@ describe('WASM vs Legacy Builder Byte Comparison', function () {
111
115
  // Staking Transaction Tests
112
116
  // ===========================================================================
113
117
  describe('Staking Transactions', function () {
114
- it('should produce identical signing payload for staking bond', async function () {
115
- const amount = '10000000000000'; // 10 DOT
116
- const factory = new transactionBuilderFactory_1.TransactionBuilderFactory(coin);
117
- const legacyBuilder = factory.getStakingBuilder();
118
- legacyBuilder
119
- .sender({ address: fixtures_1.accounts.account1.address })
120
- .amount(amount)
121
- .payee('Staked')
122
- .validity({ firstValid: fixtures_1.westendBlock.blockNumber, maxDuration: 2400 })
123
- .referenceBlock(fixtures_1.westendBlock.hash)
124
- .sequenceId({ name: 'Nonce', keyword: 'nonce', value: 0 });
125
- const legacyTx = await legacyBuilder.build();
126
- const legacyHex = legacyTx.toBroadcastFormat();
127
- const wasmTx = (0, wasm_dot_1.buildTransaction)({ type: 'stake', amount: BigInt(amount), payee: { type: 'staked' } }, createWasmContext());
128
- const wasmHex = '0x' + Buffer.from(wasmTx.signablePayload()).toString('hex');
129
- assert_1.default.strictEqual(wasmHex, stripCompactPrefix(legacyHex), 'Signing payload should match');
130
- });
131
- it('should produce identical signing payload for staking bond with Stash payee', async function () {
132
- const amount = '20000000000000'; // 20 DOT
133
- const factory = new transactionBuilderFactory_1.TransactionBuilderFactory(coin);
134
- const legacyBuilder = factory.getStakingBuilder();
135
- legacyBuilder
136
- .sender({ address: fixtures_1.accounts.account1.address })
137
- .amount(amount)
138
- .payee('Stash')
139
- .validity({ firstValid: fixtures_1.westendBlock.blockNumber, maxDuration: 2400 })
140
- .referenceBlock(fixtures_1.westendBlock.hash)
141
- .sequenceId({ name: 'Nonce', keyword: 'nonce', value: 0 });
142
- const legacyTx = await legacyBuilder.build();
143
- const legacyHex = legacyTx.toBroadcastFormat();
144
- const wasmTx = (0, wasm_dot_1.buildTransaction)({ type: 'stake', amount: BigInt(amount), payee: { type: 'stash' } }, createWasmContext());
145
- const wasmHex = '0x' + Buffer.from(wasmTx.signablePayload()).toString('hex');
146
- assert_1.default.strictEqual(wasmHex, stripCompactPrefix(legacyHex), 'Signing payload should match');
147
- });
118
+ // Note: wasm-dot@1.3.0 `stake` without proxyAddress produces bondExtra (top-up),
119
+ // while the legacy getStakingBuilder() produces bond (initial stake). These are
120
+ // different extrinsic calls so byte comparison is not applicable. The bond call
121
+ // is now only produced via `stake` with proxyAddress (which creates a batch).
122
+ // See Intent-based Transaction Building tests below for stake sanity checks.
148
123
  it('should produce identical signing payload for unstake (unbond)', async function () {
149
124
  const amount = '5000000000000'; // 5 DOT
150
125
  const factory = new transactionBuilderFactory_1.TransactionBuilderFactory(coin);
@@ -161,7 +136,7 @@ describe('WASM vs Legacy Builder Byte Comparison', function () {
161
136
  const wasmHex = '0x' + Buffer.from(wasmTx.signablePayload()).toString('hex');
162
137
  assert_1.default.strictEqual(wasmHex, stripCompactPrefix(legacyHex), 'Signing payload should match');
163
138
  });
164
- it('should produce identical signing payload for withdrawUnbonded', async function () {
139
+ it('should produce identical signing payload for withdrawUnbonded (claim)', async function () {
165
140
  const slashingSpans = 0;
166
141
  const factory = new transactionBuilderFactory_1.TransactionBuilderFactory(coin);
167
142
  const legacyBuilder = factory.getWithdrawUnstakedBuilder();
@@ -173,196 +148,7 @@ describe('WASM vs Legacy Builder Byte Comparison', function () {
173
148
  .sequenceId({ name: 'Nonce', keyword: 'nonce', value: 0 });
174
149
  const legacyTx = await legacyBuilder.build();
175
150
  const legacyHex = legacyTx.toBroadcastFormat();
176
- const wasmTx = (0, wasm_dot_1.buildTransaction)({ type: 'withdrawUnbonded', slashingSpans }, createWasmContext());
177
- const wasmHex = '0x' + Buffer.from(wasmTx.signablePayload()).toString('hex');
178
- assert_1.default.strictEqual(wasmHex, stripCompactPrefix(legacyHex), 'Signing payload should match');
179
- });
180
- it('should produce identical signing payload for chill (unnominate)', async function () {
181
- const factory = new transactionBuilderFactory_1.TransactionBuilderFactory(coin);
182
- const legacyBuilder = factory.getUnnominateBuilder();
183
- legacyBuilder
184
- .sender({ address: fixtures_1.accounts.account1.address })
185
- .validity({ firstValid: fixtures_1.westendBlock.blockNumber, maxDuration: 2400 })
186
- .referenceBlock(fixtures_1.westendBlock.hash)
187
- .sequenceId({ name: 'Nonce', keyword: 'nonce', value: 0 });
188
- const legacyTx = await legacyBuilder.build();
189
- const legacyHex = legacyTx.toBroadcastFormat();
190
- const wasmTx = (0, wasm_dot_1.buildTransaction)({ type: 'chill' }, createWasmContext());
191
- const wasmHex = '0x' + Buffer.from(wasmTx.signablePayload()).toString('hex');
192
- assert_1.default.strictEqual(wasmHex, stripCompactPrefix(legacyHex), 'Signing payload should match');
193
- });
194
- });
195
- // ===========================================================================
196
- // Proxy Transaction Tests
197
- // ===========================================================================
198
- describe('Proxy Transactions', function () {
199
- it('should produce identical signing payload for addProxy', async function () {
200
- const delegate = fixtures_1.accounts.account2.address;
201
- const factory = new transactionBuilderFactory_1.TransactionBuilderFactory(coin);
202
- const legacyBuilder = factory.getAddressInitializationBuilder();
203
- legacyBuilder
204
- .sender({ address: fixtures_1.accounts.account1.address })
205
- .owner({ address: delegate })
206
- .type(iface_1.ProxyType.ANY)
207
- .delay('0')
208
- .validity({ firstValid: fixtures_1.westendBlock.blockNumber, maxDuration: 2400 })
209
- .referenceBlock(fixtures_1.westendBlock.hash)
210
- .sequenceId({ name: 'Nonce', keyword: 'nonce', value: 0 });
211
- const legacyTx = await legacyBuilder.build();
212
- const legacyHex = legacyTx.toBroadcastFormat();
213
- const wasmTx = (0, wasm_dot_1.buildTransaction)({ type: 'addProxy', delegate, proxyType: 'Any', delay: 0 }, createWasmContext());
214
- const wasmHex = '0x' + Buffer.from(wasmTx.signablePayload()).toString('hex');
215
- assert_1.default.strictEqual(wasmHex, stripCompactPrefix(legacyHex), 'Signing payload should match');
216
- });
217
- it('should produce identical signing payload for addProxy with Staking type', async function () {
218
- const delegate = fixtures_1.accounts.account2.address;
219
- const factory = new transactionBuilderFactory_1.TransactionBuilderFactory(coin);
220
- const legacyBuilder = factory.getAddressInitializationBuilder();
221
- legacyBuilder
222
- .sender({ address: fixtures_1.accounts.account1.address })
223
- .owner({ address: delegate })
224
- .type(iface_1.ProxyType.STAKING)
225
- .delay('100')
226
- .validity({ firstValid: fixtures_1.westendBlock.blockNumber, maxDuration: 2400 })
227
- .referenceBlock(fixtures_1.westendBlock.hash)
228
- .sequenceId({ name: 'Nonce', keyword: 'nonce', value: 0 });
229
- const legacyTx = await legacyBuilder.build();
230
- const legacyHex = legacyTx.toBroadcastFormat();
231
- const wasmTx = (0, wasm_dot_1.buildTransaction)({ type: 'addProxy', delegate, proxyType: 'Staking', delay: 100 }, createWasmContext());
232
- const wasmHex = '0x' + Buffer.from(wasmTx.signablePayload()).toString('hex');
233
- assert_1.default.strictEqual(wasmHex, stripCompactPrefix(legacyHex), 'Signing payload should match');
234
- });
235
- });
236
- // ===========================================================================
237
- // Batch Transaction Tests
238
- // ===========================================================================
239
- describe('Batch Transactions', function () {
240
- it('should produce identical signing payload for batch of transfers', async function () {
241
- const to1 = fixtures_1.accounts.account2.address;
242
- const to2 = fixtures_1.accounts.account3.address;
243
- const amount1 = '1000000000000';
244
- const amount2 = '2000000000000';
245
- // Legacy batch requires raw call hex for each sub-call
246
- const factory = new transactionBuilderFactory_1.TransactionBuilderFactory(coin);
247
- // Build individual transfers to get their call data for the legacy batch
248
- const t1 = factory.getTransferBuilder();
249
- t1.sender({ address: fixtures_1.accounts.account1.address })
250
- .to({ address: to1 })
251
- .amount(amount1)
252
- .validity({ firstValid: fixtures_1.westendBlock.blockNumber, maxDuration: 2400 })
253
- .referenceBlock(fixtures_1.westendBlock.hash)
254
- .sequenceId({ name: 'Nonce', keyword: 'nonce', value: 0 });
255
- const tx1 = await t1.build();
256
- const t2 = factory.getTransferBuilder();
257
- t2.sender({ address: fixtures_1.accounts.account1.address })
258
- .to({ address: to2 })
259
- .amount(amount2)
260
- .validity({ firstValid: fixtures_1.westendBlock.blockNumber, maxDuration: 2400 })
261
- .referenceBlock(fixtures_1.westendBlock.hash)
262
- .sequenceId({ name: 'Nonce', keyword: 'nonce', value: 0 });
263
- const tx2 = await t2.build();
264
- // Extract call data from legacy signing payload for batch construction.
265
- // Legacy toBroadcastFormat() for unsigned txs returns the signing payload
266
- // which starts with a compact-length-prefixed call.
267
- function extractCallFromSigningPayload(signingPayload) {
268
- const hexData = signingPayload.startsWith('0x') ? signingPayload.slice(2) : signingPayload;
269
- const bytes = Buffer.from(hexData, 'hex');
270
- // Decode compact length prefix to find where call data ends
271
- const mode = bytes[0] & 0b11;
272
- let callLength;
273
- let offset;
274
- if (mode === 0b00) {
275
- callLength = bytes[0] >> 2;
276
- offset = 1;
277
- }
278
- else if (mode === 0b01) {
279
- callLength = (bytes[0] | (bytes[1] << 8)) >> 2;
280
- offset = 2;
281
- }
282
- else if (mode === 0b10) {
283
- callLength = (bytes[0] | (bytes[1] << 8) | (bytes[2] << 16) | (bytes[3] << 24)) >> 2;
284
- offset = 4;
285
- }
286
- else {
287
- throw new Error('Unsupported compact length mode');
288
- }
289
- return '0x' + bytes.slice(offset, offset + callLength).toString('hex');
290
- }
291
- const call1Hex = extractCallFromSigningPayload(tx1.toBroadcastFormat());
292
- const call2Hex = extractCallFromSigningPayload(tx2.toBroadcastFormat());
293
- const batchBuilder = factory.getBatchTransactionBuilder();
294
- batchBuilder
295
- .sender({ address: fixtures_1.accounts.account1.address })
296
- .calls([call1Hex, call2Hex])
297
- .atomic(true)
298
- .validity({ firstValid: fixtures_1.westendBlock.blockNumber, maxDuration: 2400 })
299
- .referenceBlock(fixtures_1.westendBlock.hash)
300
- .sequenceId({ name: 'Nonce', keyword: 'nonce', value: 0 });
301
- const legacyTx = await batchBuilder.build();
302
- const legacyHex = legacyTx.toBroadcastFormat();
303
- const wasmTx = (0, wasm_dot_1.buildTransaction)({
304
- type: 'batch',
305
- calls: [
306
- { type: 'transfer', to: to1, amount: BigInt(amount1), keepAlive: true },
307
- { type: 'transfer', to: to2, amount: BigInt(amount2), keepAlive: true },
308
- ],
309
- atomic: true,
310
- }, createWasmContext());
311
- const wasmHex = '0x' + Buffer.from(wasmTx.signablePayload()).toString('hex');
312
- assert_1.default.strictEqual(wasmHex, stripCompactPrefix(legacyHex), 'Signing payload should match');
313
- });
314
- it('should produce identical signing payload for non-atomic batch', async function () {
315
- const to = fixtures_1.accounts.account2.address;
316
- const amount = '1000000000000';
317
- const factory = new transactionBuilderFactory_1.TransactionBuilderFactory(coin);
318
- const transferBuilder = factory.getTransferBuilder();
319
- transferBuilder
320
- .sender({ address: fixtures_1.accounts.account1.address })
321
- .to({ address: to })
322
- .amount(amount)
323
- .validity({ firstValid: fixtures_1.westendBlock.blockNumber, maxDuration: 2400 })
324
- .referenceBlock(fixtures_1.westendBlock.hash)
325
- .sequenceId({ name: 'Nonce', keyword: 'nonce', value: 0 });
326
- const transferTx = await transferBuilder.build();
327
- function extractCallFromSigningPayload(signingPayload) {
328
- const hexData = signingPayload.startsWith('0x') ? signingPayload.slice(2) : signingPayload;
329
- const bytes = Buffer.from(hexData, 'hex');
330
- const mode = bytes[0] & 0b11;
331
- let callLength;
332
- let offset;
333
- if (mode === 0b00) {
334
- callLength = bytes[0] >> 2;
335
- offset = 1;
336
- }
337
- else if (mode === 0b01) {
338
- callLength = (bytes[0] | (bytes[1] << 8)) >> 2;
339
- offset = 2;
340
- }
341
- else if (mode === 0b10) {
342
- callLength = (bytes[0] | (bytes[1] << 8) | (bytes[2] << 16) | (bytes[3] << 24)) >> 2;
343
- offset = 4;
344
- }
345
- else {
346
- throw new Error('Unsupported compact length mode');
347
- }
348
- return '0x' + bytes.slice(offset, offset + callLength).toString('hex');
349
- }
350
- const callHex = extractCallFromSigningPayload(transferTx.toBroadcastFormat());
351
- const batchBuilder = factory.getBatchTransactionBuilder();
352
- batchBuilder
353
- .sender({ address: fixtures_1.accounts.account1.address })
354
- .calls([callHex])
355
- .atomic(false)
356
- .validity({ firstValid: fixtures_1.westendBlock.blockNumber, maxDuration: 2400 })
357
- .referenceBlock(fixtures_1.westendBlock.hash)
358
- .sequenceId({ name: 'Nonce', keyword: 'nonce', value: 0 });
359
- const legacyTx = await batchBuilder.build();
360
- const legacyHex = legacyTx.toBroadcastFormat();
361
- const wasmTx = (0, wasm_dot_1.buildTransaction)({
362
- type: 'batch',
363
- calls: [{ type: 'transfer', to, amount: BigInt(amount), keepAlive: true }],
364
- atomic: false,
365
- }, createWasmContext());
151
+ const wasmTx = (0, wasm_dot_1.buildTransaction)({ type: 'claim', slashingSpans }, createWasmContext());
366
152
  const wasmHex = '0x' + Buffer.from(wasmTx.signablePayload()).toString('hex');
367
153
  assert_1.default.strictEqual(wasmHex, stripCompactPrefix(legacyHex), 'Signing payload should match');
368
154
  });
@@ -371,39 +157,41 @@ describe('WASM vs Legacy Builder Byte Comparison', function () {
371
157
  // Intent-based Transaction Building (sanity checks)
372
158
  // ===========================================================================
373
159
  describe('Intent-based Transaction Building', function () {
374
- it('should build transfer from intent', async function () {
375
- const wasmTx = (0, wasm_dot_1.buildTransaction)({ type: 'transfer', to: fixtures_1.accounts.account2.address, amount: 1000000000000n, keepAlive: true }, createWasmContext());
160
+ it('should build payment from intent', async function () {
161
+ const wasmTx = (0, wasm_dot_1.buildTransaction)({ type: 'payment', to: fixtures_1.accounts.account2.address, amount: 1000000000000n, keepAlive: true }, createWasmContext());
376
162
  const serialized = wasmTx.toBroadcastFormat();
377
163
  (0, assert_1.default)(serialized.startsWith('0x'), 'Should be hex encoded');
378
164
  (0, assert_1.default)(serialized.length > 10, 'Should have content');
379
165
  });
380
- it('should build stake from intent', async function () {
166
+ it('should build stake (top-up) from intent', async function () {
381
167
  const wasmTx = (0, wasm_dot_1.buildTransaction)({ type: 'stake', amount: 5000000000000n, payee: { type: 'staked' } }, createWasmContext());
382
168
  (0, assert_1.default)(wasmTx.toBroadcastFormat().startsWith('0x'));
383
169
  });
384
- it('should build withdrawUnbonded from intent', async function () {
385
- const wasmTx = (0, wasm_dot_1.buildTransaction)({ type: 'withdrawUnbonded', slashingSpans: 0 }, createWasmContext());
170
+ it('should build stake with proxy (new stake / batchAll(bond, addProxy)) from intent', async function () {
171
+ const wasmTx = (0, wasm_dot_1.buildTransaction)({ type: 'stake', amount: 10000000000000n, proxyAddress: fixtures_1.accounts.account2.address, payee: { type: 'staked' } }, createWasmContext());
386
172
  (0, assert_1.default)(wasmTx.toBroadcastFormat().startsWith('0x'));
387
173
  });
388
- it('should build chill from intent', async function () {
389
- const wasmTx = (0, wasm_dot_1.buildTransaction)({ type: 'chill' }, createWasmContext());
174
+ it('should build claim (withdrawUnbonded) from intent', async function () {
175
+ const wasmTx = (0, wasm_dot_1.buildTransaction)({ type: 'claim', slashingSpans: 0 }, createWasmContext());
390
176
  (0, assert_1.default)(wasmTx.toBroadcastFormat().startsWith('0x'));
391
177
  });
392
- it('should build addProxy from intent', async function () {
393
- const wasmTx = (0, wasm_dot_1.buildTransaction)({ type: 'addProxy', delegate: fixtures_1.accounts.account2.address, proxyType: 'Any', delay: 0 }, createWasmContext());
178
+ it('should build unstake (partial / unbond) from intent', async function () {
179
+ const wasmTx = (0, wasm_dot_1.buildTransaction)({ type: 'unstake', amount: 5000000000000n }, createWasmContext());
394
180
  (0, assert_1.default)(wasmTx.toBroadcastFormat().startsWith('0x'));
395
181
  });
396
- it('should build batch from intent', async function () {
182
+ it('should build unstake with stopStaking (full / batchAll(removeProxy, chill, unbond)) from intent', async function () {
397
183
  const wasmTx = (0, wasm_dot_1.buildTransaction)({
398
- type: 'batch',
399
- calls: [
400
- { type: 'transfer', to: fixtures_1.accounts.account2.address, amount: 1000000000000n, keepAlive: true },
401
- { type: 'chill' },
402
- ],
403
- atomic: true,
184
+ type: 'unstake',
185
+ amount: 5000000000000n,
186
+ stopStaking: true,
187
+ proxyAddress: fixtures_1.accounts.account2.address,
404
188
  }, createWasmContext());
405
189
  (0, assert_1.default)(wasmTx.toBroadcastFormat().startsWith('0x'));
406
190
  });
191
+ it('should build consolidate (transferAll) from intent', async function () {
192
+ const wasmTx = (0, wasm_dot_1.buildTransaction)({ type: 'consolidate', to: fixtures_1.accounts.account2.address }, createWasmContext());
193
+ (0, assert_1.default)(wasmTx.toBroadcastFormat().startsWith('0x'));
194
+ });
407
195
  });
408
196
  });
409
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FzbUJ1aWxkZXJCeXRlQ29tcGFyaXNvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Rlc3QvdW5pdC93YXNtQnVpbGRlckJ5dGVDb21wYXJpc29uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRzs7Ozs7QUFFSCxvREFBNEI7QUFDNUIsaURBQTRDO0FBQzVDLHVGQUFvRjtBQUVwRiwrQ0FBZ0Q7QUFDaEQsMENBQXFEO0FBQ3JELGdFQUF3QztBQUV4QyxzQkFBc0I7QUFDdEIsOENBQXFGO0FBRXJGLFFBQVEsQ0FBQyx3Q0FBd0MsRUFBRTtJQUNqRCxNQUFNLElBQUksR0FBRyxlQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRS9CLG9FQUFvRTtJQUNwRSxNQUFNLFFBQVEsR0FBRyxlQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRXpDLFNBQVMsaUJBQWlCLENBQUMsWUFBbUMsRUFBRTtRQUM5RCxPQUFPO1lBQ0wsTUFBTSxFQUFFLG1CQUFRLENBQUMsUUFBUSxDQUFDLE9BQU87WUFDakMsS0FBSyxFQUFFLENBQUM7WUFDUixHQUFHLEVBQUUsRUFBRTtZQUNQLFFBQVEsRUFBRSxRQUFvQjtZQUM5QixRQUFRLEVBQUU7Z0JBQ1IsVUFBVSxFQUFFLHVCQUFZLENBQUMsV0FBVztnQkFDcEMsV0FBVyxFQUFFLElBQUk7YUFDbEI7WUFDRCxjQUFjLEVBQUUsdUJBQVksQ0FBQyxJQUFJO1lBQ2pDLEdBQUcsU0FBUztTQUNiLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsU0FBUyxrQkFBa0IsQ0FBQyxHQUFXO1FBQ3JDLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztRQUN2RCxNQUFN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QUUsUUFBUSxFQUFFLG1CQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFDckYsaUJBQWlCLEVBQUUsQ0FDcEIsQ0FBQztZQUNGLElBQUEsZ0JBQU0sRUFBQyxNQUFNLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUN0RCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxnQ0FBZ0MsRUFBRSxLQUFLO1lBQ3hDLE1BQU0sTUFBTSxHQUFHLElBQUEsMkJBQWdCLEVBQzdCO2dCQUNFLElBQUksRUFBRSxPQUFPO2dCQUNiLEtBQUssRUFBRTtvQkFDTCxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLG1CQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUU7b0JBQzVGLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRTtpQkFDbEI7Z0JBQ0QsTUFBTSxFQUFFLElBQUk7YUFDYixFQUNELGlCQUFpQixFQUFFLENBQ3BCLENBQUM7WUFDRixJQUFBLGdCQUFNLEVBQUMsTUFBTSxDQUFDLGlCQUFpQixFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDdEQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBXQVNNIEJ1aWxkZXIgQnl0ZSBDb21wYXJpc29uIFRlc3RzXG4gKlxuICogQ29tcGFyZSBzZXJpYWxpemVkIG91dHB1dCBiZXR3ZWVuOlxuICogMS4gTGVnYWN5IGFwcHJvYWNoICh1c2luZyBAc3Vic3RyYXRlL3R4d3JhcHBlci1wb2xrYWRvdClcbiAqIDIuIFdBU00gYXBwcm9hY2ggKHVzaW5nIEBiaXRnby93YXNtLWRvdCBEb3RCdWlsZGVyKVxuICpcbiAqIEZvciB1bnNpZ25lZCB0cmFuc2FjdGlvbnMsIGxlZ2FjeSB0b0Jyb2FkY2FzdEZvcm1hdCgpIHJldHVybnMgdGhlIHNpZ25pbmcgcGF5bG9hZFxuICogKHZpYSBjb25zdHJ1Y3Quc2lnbmluZ1BheWxvYWQpLiBXZSBjb21wYXJlIFdBU00gc2lnbmFibGVQYXlsb2FkKCkgYWdhaW5zdCBpdC5cbiAqXG4gKiBGb3JtYXQgZGlmZmVyZW5jZTogdHh3cmFwcGVyIGVuY29kZXMgdGhlIGNhbGwgYXMgYEJ5dGVzYCAoVmVjPHU4Pikgd2hpY2ggaW5jbHVkZXNcbiAqIGEgU0NBTEUgY29tcGFjdC1sZW5ndGggcHJlZml4LiBzdWJ4dCBlbmNvZGVzIGl0IGFzIHJhdyBgQ2FsbGAgKG5vIHByZWZpeCkuXG4gKiBXZSBzdHJpcCB0aGlzIHByZWZpeCBmcm9tIHRoZSBsZWdhY3kgc2lkZSBiZWZvcmUgY29tcGFyaW5nLCBzaW5jZSB0aGUgYWN0dWFsXG4gKiBjYWxsIGRhdGEsIGVyYSwgbm9uY2UsIHRpcCwgYW5kIGNoYWluIGNvbnRleHQgYXJlIGlkZW50aWNhbC5cbiAqL1xuXG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyBjb2lucyB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeSB9IGZyb20gJy4uLy4uL3NyYy9saWIvdHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeSc7XG5pbXBvcnQgeyBUcmFuc2ZlckJ1aWxkZXIgfSBmcm9tICcuLi8uLi9zcmMvbGliL3RyYW5zZmVyQnVpbGRlcic7XG5pbXBvcnQgeyBQcm94eVR5cGUgfSBmcm9tICcuLi8uLi9zcmMvbGliL2lmYWNlJztcbmltcG9ydCB7IGFjY291bnRzLCB3ZXN0ZW5kQmxvY2sgfSBmcm9tICcuLi9maXh0dXJlcyc7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vLi4vc3JjL2xpYi91dGlscyc7XG5cbi8vIEltcG9ydCBXQVNNIGJ1aWxkZXJcbmltcG9ydCB7IGJ1aWxkVHJhbnNhY3Rpb24sIHR5cGUgQnVpbGRDb250ZXh0LCB0eXBlIE1hdGVyaWFsIH0gZnJvbSAnQGJpdGdvL3dhc20tZG90JztcblxuZGVzY3JpYmUoJ1dBU00gdnMgTGVnYWN5IEJ1aWxkZXIgQnl0ZSBDb21wYXJpc29uJywgZnVuY3Rpb24gKCkge1xuICBjb25zdCBjb2luID0gY29pbnMuZ2V0KCd0ZG90Jyk7XG5cbiAgLy8gR2V0IG1hdGVyaWFsIGZyb20gdXRpbHMgdG8gZW5zdXJlIHNhbWUgbWV0YWRhdGEgYXMgbGVnYWN5IGJ1aWxkZXJcbiAgY29uc3QgbWF0ZXJpYWwgPSB1dGlscy5nZXRNYXRlcmlhbChjb2luKTtcblxuICBmdW5jdGlvbiBjcmVhdGVXYXNtQ29udGV4dChvdmVycmlkZXM6IFBhcnRpYWw8QnVpbGRDb250ZXh0PiA9IHt9KTogQnVpbGRDb250ZXh0IHtcbiAgICByZXR1cm4ge1xuICAgICAgc2VuZGVyOiBhY2NvdW50cy5hY2NvdW50MS5hZGRyZXNzLFxuICAgICAgbm9uY2U6IDAsXG4gICAgICB0aXA6IDBuLFxuICAgICAgbWF0ZXJpYWw6IG1hdGVyaWFsIGFzIE1hdGVyaWFsLFxuICAgICAgdmFsaWRpdHk6IHtcbiAgICAgICAgZmlyc3RWYWxpZDogd2VzdGVuZEJsb2NrLmJsb2NrTnVtYmVyLFxuICAgICAgICBtYXhEdXJhdGlvbjogMjQwMCxcbiAgICAgIH0sXG4gICAgICByZWZlcmVuY2VCbG9jazogd2VzdGVuZEJsb2NrLmhhc2gsXG4gICAgICAuLi5vdmVycmlkZXMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdHJpcCBTQ0FMRSBjb21wYWN0LWxlbmd0aCBwcmVmaXggZnJvbSB0aGUgbGVnYWN5IHNpZ25pbmcgcGF5bG9hZC5cbiAgICpcbiAgICogTGVnYWN5ICh0eHdyYXBwZXIpIGVuY29kZXMgdGhlIGNhbGwgYXMgYEJ5dGVzYCB0eXBlLCB3aGljaCBhZGRzIGEgY29tcGFjdC1sZW5ndGhcbiAgICogcHJlZml4LiBzdWJ4dCBlbmNvZGVzIGl0IGFzIHJhdyBgQ2FsbGAgKG5vIHByZWZpeCkuIEJvdGggcHJvZHVjZSBpZGVudGljYWxcbiAgICogY2FsbCBkYXRhICsgZXJhICsgbm9uY2UgKyB0aXAgKyBjaGFpbiBjb250ZXh0IGFmdGVyIHRoaXMgcHJlZml4LlxuICAgKi9cbiAgZnVuY3Rpb24gc3RyaXBDb21wYWN0UHJlZml4KGhleDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBkYXRhID0gaGV4LnN0YXJ0c1dpdGgoJzB4JykgPyBoZXguc2xpY2UoMikgOiBoZXg7XG4gICAgY29uc3QgYnl0ZXMgPSBCdWZmZXIuZnJvbShkYXRhLCAnaGV4Jyk7XG4gICAgY29uc3QgbW9kZSA9IGJ5dGVzWzBdICYgMGIxMTtcbiAgICBsZXQgb2Zmc2V0OiBudW1iZXI7XG4gICAgaWYgKG1vZGUgPT09IDBiMDApIG9mZnNldCA9IDE7XG4gICAgZWxzZSBpZiAobW9kZSA9PT0gMGIwMSkgb2Zmc2V0ID0gMjtcbiAgICBlbHNlIGlmIChtb2RlID09PSAwYjEwKSBvZmZzZXQgPSA0O1xuICAgIGVsc2UgdGhyb3cgbmV3IEVycm9yKCdCaWcgY29tcGFjdCBub3Qgc3VwcG9ydGVkJyk7XG4gICAgcmV0dXJuICcweCcgKyBieXRlcy5zbGljZShvZmZzZXQpLnRvU3RyaW5nKCdoZXgnKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBUcmFuc2ZlciBUcmFuc2FjdGlvbiBUZXN0c1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgZGVzY3JpYmUoJ1RyYW5zZmVyIFRyYW5zYWN0aW9ucycsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHByb2R1Y2UgaWRlbnRpY2FsIHNpZ25pbmcgcGF5bG9hZCBmb3IgdHJhbnNmZXInLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0byA9IGFjY291bnRzLmFjY291bnQyLmFkZHJlc3M7XG4gICAgICBjb25zdCBhbW91bnQgPSAnMTAwMDAwMDAwMDAwMCc7IC8vIDEgRE9UXG5cbiAgICAgIGNvbnN0IGZhY3RvcnkgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2luKTtcbiAgICAgIGNvbnN0IGxlZ2FjeUJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpIGFzIFRyYW5zZmVyQnVpbGRlcjtcblxuICAgICAgbGVnYWN5QnVpbGRlclxuICAgICAgICAuc2VuZGVyKHsgYWRkcmVzczogYWNjb3VudHMuYWNjb3VudDEuYWRkcmVzcyB9KVxuICAgICAgICAudG8oeyBhZGRyZXNzOiB0byB9KVxuICAgICAgICAuYW1vdW50KGFtb3VudClcbiAgICAgICAgLnZhbGlkaXR5KHsgZmlyc3RWYWxpZDogd2VzdGVuZEJsb2NrLmJsb2NrTnVtYmVyLCBtYXhEdXJhdGlvbjogMjQwMCB9KVxuICAgICAgICAucmVmZXJlbmNlQmxvY2sod2VzdGVuZEJsb2NrLmhhc2gpXG4gICAgICAgIC5zZXF1ZW5jZUlkKHsgbmFtZTogJ05vbmNlJywga2V5d29yZDogJ25vbmNlJywgdmFsdWU6IDAgfSk7XG5cbiAgICAgIGNvbnN0IGxlZ2FjeVR4ID0gYXdhaXQgbGVnYWN5QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgbGVnYWN5SGV4ID0gbGVnYWN5VHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgICAgY29uc3Qgd2FzbVR4ID0gYnVpbGRUcmFuc2FjdGlvbihcbiAgICAgICAgeyB0eXBlOiAndHJhbnNmZXInLCB0bywgYW1vdW50OiBCaWdJbnQoYW1vdW50KSwga2VlcEFsaXZlOiB0cnVlIH0sXG4gICAgICAgIGNyZWF0ZVdhc21Db250ZXh0KClcbiAgICAgICk7XG4gICAgICBjb25zdCB3YXNtSGV4ID0gJzB4JyArIEJ1ZmZlci5mcm9tKHdhc21UeC5zaWduYWJsZVBheWxvYWQoKSkudG9TdHJpbmcoJ2hleCcpO1xuXG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwod2FzbUhleCwgc3RyaXBDb21wYWN0UHJlZml4KGxlZ2FjeUhleCksICdTaWduaW5nIHBheWxvYWQgc2hvdWxkIG1hdGNoJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHByb2R1Y2UgaWRlbnRpY2FsIHNpZ25pbmcgcGF5bG9hZCBmb3IgdHJhbnNmZXJLZWVwQWxpdmUgd2l0aCBkaWZmZXJlbnQgbm9uY2UnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0byA9IGFjY291bnRzLmFjY291bnQyLmFkZHJlc3M7XG4gICAgICBjb25zdCBhbW91bnQgPSAnNTAwMDAwMDAwMDAwMCc7IC8vIDUgRE9UXG5cbiAgICAgIGNvbnN0IGZhY3RvcnkgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2luKTtcbiAgICAgIGNvbnN0IGxlZ2FjeUJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpIGFzIFRyYW5zZmVyQnVpbGRlcjtcblxuICAgICAgbGVnYWN5QnVpbGRlclxuICAgICAgICAuc2VuZGVyKHsgYWRkcmVzczogYWNjb3VudHMuYWNjb3VudDEuYWRkcmVzcyB9KVxuICAgICAgICAudG8oeyBhZGRyZXNzOiB0byB9KVxuICAgICAgICAuYW1vdW50KGFtb3VudClcbiAgICAgICAgLnZhbGlkaXR5KHsgZmlyc3RWYWxpZDogd2VzdGVuZEJsb2NrLmJsb2NrTnVtYmVyLCBtYXhEdXJhdGlvbjogMjQwMCB9KVxuICAgICAgICAucmVmZXJlbmNlQmxvY2sod2VzdGVuZEJsb2NrLmhhc2gpXG4gICAgICAgIC5zZXF1ZW5jZUlkKHsgbmFtZTogJ05vbmNlJywga2V5d29yZDogJ25vbmNlJywgdmFsdWU6IDUgfSk7XG5cbiAgICAgIGNvbnN0IGxlZ2FjeVR4ID0gYXdhaXQgbGVnYWN5QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgbGVnYWN5SGV4ID0gbGVnYWN5VHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgICAgY29uc3Qgd2FzbVR4ID0gYnVpbGRUcmFuc2FjdGlvbihcbiAgICAgICAgeyB0eXBlOiAndHJhbnNmZXInLCB0bywgYW1vdW50OiBCaWdJbnQoYW1vdW50KSwga2VlcEFsaXZlOiB0cnVlIH0sXG4gICAgICAgIGNyZWF0ZVdhc21Db250ZXh0KHsgbm9uY2U6IDUgfSlcbiAgICAgICk7XG4gICAgICBjb25zdCB3YXNtSGV4ID0gJzB4JyArIEJ1ZmZlci5mcm9tKHdhc21UeC5zaWduYWJsZVBheWxvYWQoKSkudG9TdHJpbmcoJ2hleCcpO1xuXG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwod2FzbUhleCwgc3RyaXBDb21wYWN0UHJlZml4KGxlZ2FjeUhleCksICdTaWduaW5nIHBheWxvYWQgc2hvdWxkIG1hdGNoJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBTdGFraW5nIFRyYW5zYWN0aW9uIFRlc3RzXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBkZXNjcmliZSgnU3Rha2luZyBUcmFuc2FjdGlvbnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBwcm9kdWNlIGlkZW50aWNhbCBzaWduaW5nIHBheWxvYWQgZm9yIHN0YWtpbmcgYm9uZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGFtb3VudCA9ICcxMDAwMDAwMDAwMDAwMCc7IC8vIDEwIERPVFxuXG4gICAgICBjb25zdCBmYWN0b3J5ID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbik7XG4gICAgICBjb25zdCBsZWdhY3lCdWlsZGVyID0gZmFjdG9yeS5nZXRTdGFraW5nQnVpbGRlcigpO1xuXG4gICAgICBsZWdhY3lCdWlsZGVyXG4gICAgICAgIC5zZW5kZXIoeyBhZGRyZXNzOiBhY2NvdW50cy5hY2NvdW50MS5hZGRyZXNzIH0pXG4gICAgICAgIC5hbW91bnQoYW1vdW50KVxuICAgICAgICAucGF5ZWUoJ1N0YWtlZCcpXG4gICAgICAgIC52YWxpZGl0eSh7IGZpcnN0VmFsaWQ6IHdlc3RlbmRCbG9jay5ibG9ja051bWJlciwgbWF4RHVyYXRpb246IDI0MDAgfSlcbiAgICAgICAgLnJlZmVyZW5jZUJsb2NrKHdlc3RlbmRCbG9jay5oYXNoKVxuICAgICAgICAuc2VxdWVuY2VJZCh7IG5hbWU6ICdOb25jZScsIGtleXdvcmQ6ICdub25jZScsIHZhbHVlOiAwIH0pO1xuXG4gICAgICBjb25zdCBsZWdhY3lUeCA9IGF3YWl0IGxlZ2FjeUJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IGxlZ2FjeUhleCA9IGxlZ2FjeVR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICAgIGNvbnN0IHdhc21UeCA9IGJ1aWxkVHJhbnNhY3Rpb24oXG4gICAgICAgIHsgdHlwZTogJ3N0YWtlJywgYW1vdW50OiBCaWdJbnQoYW1vdW50KSwgcGF5ZWU6IHsgdHlwZTogJ3N0YWtlZCcgfSB9LFxuICAgICAgICBjcmVhdGVXYXNtQ29udGV4dCgpXG4gICAgICApO1xuICAgICAgY29uc3Qgd2FzbUhleCA9ICcweCcgKyBCdWZmZXIuZnJvbSh3YXNtVHguc2lnbmFibGVQYXlsb2FkKCkpLnRvU3RyaW5nKCdoZXgnKTtcblxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHdhc21IZXgsIHN0cmlwQ29tcGFjdFByZWZpeChsZWdhY3lIZXgpLCAnU2lnbmluZyBwYXlsb2FkIHNob3VsZCBtYXRjaCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBwcm9kdWNlIGlkZW50aWNhbCBzaWduaW5nIHBheWxvYWQgZm9yIHN0YWtpbmcgYm9uZCB3aXRoIFN0YXNoIHBheWVlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYW1vdW50ID0gJzIwMDAwMDAwMDAwMDAwJzsgLy8gMjAgRE9UXG5cbiAgICAgIGNvbnN0IGZhY3RvcnkgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2luKTtcbiAgICAgIGNvbnN0IGxlZ2FjeUJ1aWxkZXIgPSBmYWN0b3J5LmdldFN0YWtpbmdCdWlsZGVyKCk7XG5cbiAgICAgIGxlZ2FjeUJ1aWxkZXJcbiAgICAgICAgLnNlbmRlcih7IGFkZHJlc3M6IGFjY291bnRzLmFjY291bnQxLmFkZHJlc3MgfSlcbiAgICAgICAgLmFtb3VudChhbW91bnQpXG4gICAgICAgIC5wYXllZSgnU3Rhc2gnKVxuICAgICAgICAudmFsaWRpdHkoeyBmaXJzdFZhbGlkOiB3ZXN0ZW5kQmxvY2suYmxvY2tOdW1iZXIsIG1heER1cmF0aW9uOiAyNDAwIH0pXG4gICAgICAgIC5yZWZlcmVuY2VCbG9jayh3ZXN0ZW5kQmxvY2suaGFzaClcbiAgICAgICAgLnNlcXVlbmNlSWQoeyBuYW1lOiAnTm9uY2UnLCBrZXl3b3JkOiAnbm9uY2UnLCB2YWx1ZTogMCB9KTtcblxuICAgICAgY29uc3QgbGVnYWN5VHggPSBhd2FpdCBsZWdhY3lCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBsZWdhY3lIZXggPSBsZWdhY3lUeC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICBjb25zdCB3YXNtVHggPSBidWlsZFRyYW5zYWN0aW9uKFxuICAgICAgICB7IHR5cGU6ICdzdGFrZScsIGFtb3VudDogQmlnSW50KGFtb3VudCksIHBheWVlOiB7IHR5cGU6ICdzdGFzaCcgfSB9LFxuICAgICAgICBjcmVhdGVXYXNtQ29udGV4dCgpXG4gICAgICApO1xuICAgICAgY29uc3Qgd2FzbUhleCA9ICcweCcgKyBCdWZmZXIuZnJvbSh3YXNtVHguc2lnbmFibGVQYXlsb2FkKCkpLnRvU3RyaW5nKCdoZXgnKTtcblxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHdhc21IZXgsIHN0cmlwQ29tcGFjdFByZWZpeChsZWdhY3lIZXgpLCAnU2lnbmluZyBwYXlsb2FkIHNob3VsZCBtYXRjaCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBwcm9kdWNlIGlkZW50aWNhbCBzaWduaW5nIHBheWxvYWQgZm9yIHVuc3Rha2UgKHVuYm9uZCknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBhbW91bnQgPSAnNTAwMDAwMDAwMDAwMCc7IC8vIDUgRE9UXG5cbiAgICAgIGNvbnN0IGZhY3RvcnkgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2luKTtcbiAgICAgIGNvbnN0IGxlZ2FjeUJ1aWxkZXIgPSBmYWN0b3J5LmdldFVuc3Rha2VCdWlsZGVyKCk7XG5cbiAgICAgIGxlZ2FjeUJ1aWxkZXJcbiAgICAgICAgLnNlbmRlcih7IGFkZHJlc3M6IGFjY291bnRzLmFjY291bnQxLmFkZHJlc3MgfSlcbiAgICAgICAgLmFtb3VudChhbW91bnQpXG4gICAgICAgIC52YWxpZGl0eSh7IGZpcnN0VmFsaWQ6IHdlc3RlbmRCbG9jay5ibG9ja051bWJlciwgbWF4RHVyYXRpb246IDI0MDAgfSlcbiAgICAgICAgLnJlZmVyZW5jZUJsb2NrKHdlc3RlbmRCbG9jay5oYXNoKVxuICAgICAgICAuc2VxdWVuY2VJZCh7IG5hbWU6ICdOb25jZScsIGtleXdvcmQ6ICdub25jZScsIHZhbHVlOiAwIH0pO1xuXG4gICAgICBjb25zdCBsZWdhY3lUeCA9IGF3YWl0IGxlZ2FjeUJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IGxlZ2FjeUhleCA9IGxlZ2FjeVR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICAgIGNvbnN0IHdhc21UeCA9IGJ1aWxkVHJhbnNhY3Rpb24oeyB0eXBlOiAndW5zdGFrZScsIGFtb3VudDogQmlnSW50KGFtb3VudCkgfSwgY3JlYXRlV2FzbUNvbnRleHQoKSk7XG4gICAgICBjb25zdCB3YXNtSGV4ID0gJzB4JyArIEJ1ZmZlci5mcm9tKHdhc21UeC5zaWduYWJsZVBheWxvYWQoKSkudG9TdHJpbmcoJ2hleCcpO1xuXG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwod2FzbUhleCwgc3RyaXBDb21wYWN0UHJlZml4KGxlZ2FjeUhleCksICdTaWduaW5nIHBheWxvYWQgc2hvdWxkIG1hdGNoJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHByb2R1Y2UgaWRlbnRpY2FsIHNpZ25pbmcgcGF5bG9hZCBmb3Igd2l0aGRyYXdVbmJvbmRlZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHNsYXNoaW5nU3BhbnMgPSAwO1xuXG4gICAgICBjb25zdCBmYWN0b3J5ID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbik7XG4gICAgICBjb25zdCBsZWdhY3lCdWlsZGVyID0gZmFjdG9yeS5nZXRXaXRoZHJhd1Vuc3Rha2VkQnVpbGRlcigpO1xuXG4gICAgICBsZWdhY3lCdWlsZGVyXG4gICAgICAgIC5zZW5kZXIoeyBhZGRyZXNzOiBhY2NvdW50cy5hY2NvdW50MS5hZGRyZXNzIH0pXG4gICAgICAgIC5zbGFzaGluZ1NwYW5zKHNsYXNoaW5nU3BhbnMpXG4gICAgICAgIC52YWxpZGl0eSh7IGZpcnN0VmFsaWQ6IHdlc3RlbmRCbG9jay5ibG9ja051bWJlciwgbWF4RHVyYXRpb246IDI0MDAgfSlcbiAgICAgICAgLnJlZmVyZW5jZUJsb2NrKHdlc3RlbmRCbG9jay5oYXNoKVxuICAgICAgICAuc2VxdWVuY2VJZCh7IG5hbWU6ICdOb25jZScsIGtleXdvcmQ6ICdub25jZScsIHZhbHVlOiAwIH0pO1xuXG4gICAgICBjb25zdCBsZWdhY3lUeCA9IGF3YWl0IGxlZ2FjeUJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IGxlZ2FjeUhleCA9IGxlZ2FjeVR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICAgIGNvbnN0IHdhc21UeCA9IGJ1aWxkVHJhbnNhY3Rpb24oeyB0eXBlOiAnd2l0aGRyYXdVbmJvbmRlZCcsIHNsYXNoaW5nU3BhbnMgfSwgY3JlYXRlV2FzbUNvbnRleHQoKSk7XG4gICAgICBjb25zdCB3YXNtSGV4ID0gJzB4JyArIEJ1ZmZlci5mcm9tKHdhc21UeC5zaWduYWJsZVBheWxvYWQoKSkudG9TdHJpbmcoJ2hleCcpO1xuXG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwod2FzbUhleCwgc3RyaXBDb21wYWN0UHJlZml4KGxlZ2FjeUhleCksICdTaWduaW5nIHBheWxvYWQgc2hvdWxkIG1hdGNoJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHByb2R1Y2UgaWRlbnRpY2FsIHNpZ25pbmcgcGF5bG9hZCBmb3IgY2hpbGwgKHVubm9taW5hdGUpJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZmFjdG9yeSA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW4pO1xuICAgICAgY29uc3QgbGVnYWN5QnVpbGRlciA9IGZhY3RvcnkuZ2V0VW5ub21pbmF0ZUJ1aWxkZXIoKTtcblxuICAgICAgbGVnYWN5QnVpbGRlclxuICAgICAgICAuc2VuZGVyKHsgYWRkcmVzczogYWNjb3VudHMuYWNjb3VudDEuYWRkcmVzcyB9KVxuICAgICAgICAudmFsaWRpdHkoeyBmaXJzdFZhbGlkOiB3ZXN0ZW5kQmxvY2suYmxvY2tOdW1iZXIsIG1heER1cmF0aW9uOiAyNDAwIH0pXG4gICAgICAgIC5yZWZlcmVuY2VCbG9jayh3ZXN0ZW5kQmxvY2suaGFzaClcbiAgICAgICAgLnNlcXVlbmNlSWQoeyBuYW1lOiAnTm9uY2UnLCBrZXl3b3JkOiAnbm9uY2UnLCB2YWx1ZTogMCB9KTtcblxuICAgICAgY29uc3QgbGVnYWN5VHggPSBhd2FpdCBsZWdhY3lCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBsZWdhY3lIZXggPSBsZWdhY3lUeC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICBjb25zdCB3YXNtVHggPSBidWlsZFRyYW5zYWN0aW9uKHsgdHlwZTogJ2NoaWxsJyB9LCBjcmVhdGVXYXNtQ29udGV4dCgpKTtcbiAgICAgIGNvbnN0IHdhc21IZXggPSAnMHgnICsgQnVmZmVyLmZyb20od2FzbVR4LnNpZ25hYmxlUGF5bG9hZCgpKS50b1N0cmluZygnaGV4Jyk7XG5cbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCh3YXNtSGV4LCBzdHJpcENvbXBhY3RQcmVmaXgobGVnYWN5SGV4KSwgJ1NpZ25pbmcgcGF5bG9hZCBzaG91bGQgbWF0Y2gnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFByb3h5IFRyYW5zYWN0aW9uIFRlc3RzXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBkZXNjcmliZSgnUHJveHkgVHJhbnNhY3Rpb25zJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgcHJvZHVjZSBpZGVudGljYWwgc2lnbmluZyBwYXlsb2FkIGZvciBhZGRQcm94eScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGRlbGVnYXRlID0gYWNjb3VudHMuYWNjb3VudDIuYWRkcmVzcztcblxuICAgICAgY29uc3QgZmFjdG9yeSA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW4pO1xuICAgICAgY29uc3QgbGVnYWN5QnVpbGRlciA9IGZhY3RvcnkuZ2V0QWRkcmVzc0luaXRpYWxpemF0aW9uQnVpbGRlcigpO1xuXG4gICAgICBsZWdhY3lCdWlsZGVyXG4gICAgICAgIC5zZW5kZXIoeyBhZGRyZXNzOiBhY2NvdW50cy5hY2NvdW50MS5hZGRyZXNzIH0pXG4gICAgICAgIC5vd25lcih7IGFkZHJlc3M6IGRlbGVnYXRlIH0pXG4gICAgICAgIC50eXBlKFByb3h5VHlwZS5BTlkpXG4gICAgICAgIC5kZWxheSgnMCcpXG4gICAgICAgIC52YWxpZGl0eSh7IGZpcnN0VmFsaWQ6IHdlc3RlbmRCbG9jay5ibG9ja051bWJlciwgbWF4RHVyYXRpb246IDI0MDAgfSlcbiAgICAgICAgLnJlZmVyZW5jZUJsb2NrKHdlc3RlbmRCbG9jay5oYXNoKVxuICAgICAgICAuc2VxdWVuY2VJZCh7IG5hbWU6ICdOb25jZScsIGtleXdvcmQ6ICdub25jZScsIHZhbHVlOiAwIH0pO1xuXG4gICAgICBjb25zdCBsZWdhY3lUeCA9IGF3YWl0IGxlZ2FjeUJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IGxlZ2FjeUhleCA9IGxlZ2FjeVR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICAgIGNvbnN0IHdhc21UeCA9IGJ1aWxkVHJhbnNhY3Rpb24oeyB0eXBlOiAnYWRkUHJveHknLCBkZWxlZ2F0ZSwgcHJveHlUeXBlOiAnQW55JywgZGVsYXk6IDAgfSwgY3JlYXRlV2FzbUNvbnRleHQoKSk7XG4gICAgICBjb25zdCB3YXNtSGV4ID0gJzB4JyArIEJ1ZmZlci5mcm9tKHdhc21UeC5zaWduYWJsZVBheWxvYWQoKSkudG9TdHJpbmcoJ2hleCcpO1xuXG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwod2FzbUhleCwgc3RyaXBDb21wYWN0UHJlZml4KGxlZ2FjeUhleCksICdTaWduaW5nIHBheWxvYWQgc2hvdWxkIG1hdGNoJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHByb2R1Y2UgaWRlbnRpY2FsIHNpZ25pbmcgcGF5bG9hZCBmb3IgYWRkUHJveHkgd2l0aCBTdGFraW5nIHR5cGUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBkZWxlZ2F0ZSA9IGFjY291bnRzLmFjY291bnQyLmFkZHJlc3M7XG5cbiAgICAgIGNvbnN0IGZhY3RvcnkgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2luKTtcbiAgICAgIGNvbnN0IGxlZ2FjeUJ1aWxkZXIgPSBmYWN0b3J5LmdldEFkZHJlc3NJbml0aWFsaXphdGlvbkJ1aWxkZXIoKTtcblxuICAgICAgbGVnYWN5QnVpbGRlclxuICAgICAgICAuc2VuZGVyKHsgYWRkcmVzczogYWNjb3VudHMuYWNjb3VudDEuYWRkcmVzcyB9KVxuICAgICAgICAub3duZXIoeyBhZGRyZXNzOiBkZWxlZ2F0ZSB9KVxuICAgICAgICAudHlwZShQcm94eVR5cGUuU1RBS0lORylcbiAgICAgICAgLmRlbGF5KCcxMDAnKVxuICAgICAgICAudmFsaWRpdHkoeyBmaXJzdFZhbGlkOiB3ZXN0ZW5kQmxvY2suYmxvY2tOdW1iZXIsIG1heER1cmF0aW9uOiAyNDAwIH0pXG4gICAgICAgIC5yZWZlcmVuY2VCbG9jayh3ZXN0ZW5kQmxvY2suaGFzaClcbiAgICAgICAgLnNlcXVlbmNlSWQoeyBuYW1lOiAnTm9uY2UnLCBrZXl3b3JkOiAnbm9uY2UnLCB2YWx1ZTogMCB9KTtcblxuICAgICAgY29uc3QgbGVnYWN5VHggPSBhd2FpdCBsZWdhY3lCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBsZWdhY3lIZXggPSBsZWdhY3lUeC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICBjb25zdCB3YXNtVHggPSBidWlsZFRyYW5zYWN0aW9uKFxuICAgICAgICB7IHR5cGU6ICdhZGRQcm94eScsIGRlbGVnYXRlLCBwcm94eVR5cGU6ICdTdGFraW5nJywgZGVsYXk6IDEwMCB9LFxuICAgICAgICBjcmVhdGVXYXNtQ29udGV4dCgpXG4gICAgICApO1xuICAgICAgY29uc3Qgd2FzbUhleCA9ICcweCcgKyBCdWZmZXIuZnJvbSh3YXNtVHguc2lnbmFibGVQYXlsb2FkKCkpLnRvU3RyaW5nKCdoZXgnKTtcblxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHdhc21IZXgsIHN0cmlwQ29tcGFjdFByZWZpeChsZWdhY3lIZXgpLCAnU2lnbmluZyBwYXlsb2FkIHNob3VsZCBtYXRjaCcpO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQmF0Y2ggVHJhbnNhY3Rpb24gVGVzdHNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGRlc2NyaWJlKCdCYXRjaCBUcmFuc2FjdGlvbnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBwcm9kdWNlIGlkZW50aWNhbCBzaWduaW5nIHBheWxvYWQgZm9yIGJhdGNoIG9mIHRyYW5zZmVycycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHRvMSA9IGFjY291bnRzLmFjY291bnQyLmFkZHJlc3M7XG4gICAgICBjb25zdCB0bzIgPSBhY2NvdW50cy5hY2NvdW50My5hZGRyZXNzO1xuICAgICAgY29uc3QgYW1vdW50MSA9ICcxMDAwMDAwMDAwMDAwJztcbiAgICAgIGNvbnN0IGFtb3VudDIgPSAnMjAwMDAwMDAwMDAwMCc7XG5cbiAgICAgIC8vIExlZ2FjeSBiYXRjaCByZXF1aXJlcyByYXcgY2FsbCBoZXggZm9yIGVhY2ggc3ViLWNhbGxcbiAgICAgIGNvbnN0IGZhY3RvcnkgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2luKTtcblxuICAgICAgLy8gQnVpbGQgaW5kaXZpZHVhbCB0cmFuc2ZlcnMgdG8gZ2V0IHRoZWlyIGNhbGwgZGF0YSBmb3IgdGhlIGxlZ2FjeSBiYXRjaFxuICAgICAgY29uc3QgdDEgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpIGFzIFRyYW5zZmVyQnVpbGRlcjtcbiAgICAgIHQxLnNlbmRlcih7IGFkZHJlc3M6IGFjY291bnRzLmFjY291bnQxLmFkZHJlc3MgfSlcbiAgICAgICAgLnRvKHsgYWRkcmVzczogdG8xIH0pXG4gICAgICAgIC5hbW91bnQoYW1vdW50MSlcbiAgICAgICAgLnZhbGlkaXR5KHsgZmlyc3RWYWxpZDogd2VzdGVuZEJsb2NrLmJsb2NrTnVtYmVyLCBtYXhEdXJhdGlvbjogMjQwMCB9KVxuICAgICAgICAucmVmZXJlbmNlQmxvY2sod2VzdGVuZEJsb2NrLmhhc2gpXG4gICAgICAgIC5zZXF1ZW5jZUlkKHsgbmFtZTogJ05vbmNlJywga2V5d29yZDogJ25vbmNlJywgdmFsdWU6IDAgfSk7XG4gICAgICBjb25zdCB0eDEgPSBhd2FpdCB0MS5idWlsZCgpO1xuXG4gICAgICBjb25zdCB0MiA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCkgYXMgVHJhbnNmZXJCdWlsZGVyO1xuICAgICAgdDIuc2VuZGVyKHsgYWRkcmVzczogYWNjb3VudHMuYWNjb3VudDEuYWRkcmVzcyB9KVxuICAgICAgICAudG8oeyBhZGRyZXNzOiB0bzIgfSlcbiAgICAgICAgLmFtb3VudChhbW91bnQyKVxuICAgICAgICAudmFsaWRpdHkoeyBmaXJzdFZhbGlkOiB3ZXN0ZW5kQmxvY2suYmxvY2tOdW1iZXIsIG1heER1cmF0aW9uOiAyNDAwIH0pXG4gICAgICAgIC5yZWZlcmVuY2VCbG9jayh3ZXN0ZW5kQmxvY2suaGFzaClcbiAgICAgICAgLnNlcXVlbmNlSWQoeyBuYW1lOiAnTm9uY2UnLCBrZXl3b3JkOiAnbm9uY2UnLCB2YWx1ZTogMCB9KTtcbiAgICAgIGNvbnN0IHR4MiA9IGF3YWl0IHQyLmJ1aWxkKCk7XG5cbiAgICAgIC8vIEV4dHJhY3QgY2FsbCBkYXRhIGZyb20gbGVnYWN5IHNpZ25pbmcgcGF5bG9hZCBmb3IgYmF0Y2ggY29uc3RydWN0aW9uLlxuICAgICAgLy8gTGVnYWN5IHRvQnJvYWRjYXN0Rm9ybWF0KCkgZm9yIHVuc2lnbmVkIHR4cyByZXR1cm5zIHRoZSBzaWduaW5nIHBheWxvYWRcbiAgICAgIC8vIHdoaWNoIHN0YXJ0cyB3aXRoIGEgY29tcGFjdC1sZW5ndGgtcHJlZml4ZWQgY2FsbC5cbiAgICAgIGZ1bmN0aW9uIGV4dHJhY3RDYWxsRnJvbVNpZ25pbmdQYXlsb2FkKHNpZ25pbmdQYXlsb2FkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBoZXhEYXRhID0gc2lnbmluZ1BheWxvYWQuc3RhcnRzV2l0aCgnMHgnKSA/IHNpZ25pbmdQYXlsb2FkLnNsaWNlKDIpIDogc2lnbmluZ1BheWxvYWQ7XG4gICAgICAgIGNvbnN0IGJ5dGVzID0gQnVmZmVyLmZyb20oaGV4RGF0YSwgJ2hleCcpO1xuICAgICAgICAvLyBEZWNvZGUgY29tcGFjdCBsZW5ndGggcHJlZml4IHRvIGZpbmQgd2hlcmUgY2FsbCBkYXRhIGVuZHNcbiAgICAgICAgY29uc3QgbW9kZSA9IGJ5dGVzWzBdICYgMGIxMTtcbiAgICAgICAgbGV0IGNhbGxMZW5ndGg6IG51bWJlcjtcbiAgICAgICAgbGV0IG9mZnNldDogbnVtYmVyO1xuICAgICAgICBpZiAobW9kZSA9PT0gMGIwMCkge1xuICAgICAgICAgIGNhbGxMZW5ndGggPSBieXRlc1swXSA+PiAyO1xuICAgICAgICAgIG9mZnNldCA9IDE7XG4gICAgICAgIH0gZWxzZSBpZiAobW9kZSA9PT0gMGIwMSkge1xuICAgICAgICAgIGNhbGxMZW5ndGggPSAoYnl0ZXNbMF0gfCAoYnl0ZXNbMV0gPDwgOCkpID4+IDI7XG4gICAgICAgICAgb2Zmc2V0ID0gMjtcbiAgICAgICAgfSBlbHNlIGlmIChtb2RlID09PSAwYjEwKSB7XG4gICAgICAgICAgY2FsbExlbmd0aCA9IChieXRlc1swXSB8IChieXRlc1sxXSA8PCA4KSB8IChieXRlc1syXSA8PCAxNikgfCAoYnl0ZXNbM10gPDwgMjQpKSA+PiAyO1xuICAgICAgICAgIG9mZnNldCA9IDQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBjb21wYWN0IGxlbmd0aCBtb2RlJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICcweCcgKyBieXRlcy5zbGljZShvZmZzZXQsIG9mZnNldCArIGNhbGxMZW5ndGgpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY2FsbDFIZXggPSBleHRyYWN0Q2FsbEZyb21TaWduaW5nUGF5bG9hZCh0eDEudG9Ccm9hZGNhc3RGb3JtYXQoKSk7XG4gICAgICBjb25zdCBjYWxsMkhleCA9IGV4dHJhY3RDYWxsRnJvbVNpZ25pbmdQYXlsb2FkKHR4Mi50b0Jyb2FkY2FzdEZvcm1hdCgpKTtcblxuICAgICAgY29uc3QgYmF0Y2hCdWlsZGVyID0gZmFjdG9yeS5nZXRCYXRjaFRyYW5zYWN0aW9uQnVpbGRlcigpO1xuICAgICAgYmF0Y2hCdWlsZGVyXG4gICAgICAgIC5zZW5kZXIoeyBhZGRyZXNzOiBhY2NvdW50cy5hY2NvdW50MS5hZGRyZXNzIH0pXG4gICAgICAgIC5jYWxscyhbY2FsbDFIZXgsIGNhbGwySGV4XSlcbiAgICAgICAgLmF0b21pYyh0cnVlKVxuICAgICAgICAudmFsaWRpdHkoeyBmaXJzdFZhbGlkOiB3ZXN0ZW5kQmxvY2suYmxvY2tOdW1iZXIsIG1heER1cmF0aW9uOiAyNDAwIH0pXG4gICAgICAgIC5yZWZlcmVuY2VCbG9jayh3ZXN0ZW5kQmxvY2suaGFzaClcbiAgICAgICAgLnNlcXVlbmNlSWQoeyBuYW1lOiAnTm9uY2UnLCBrZXl3b3JkOiAnbm9uY2UnLCB2YWx1ZTogMCB9KTtcblxuICAgICAgY29uc3QgbGVnYWN5VHggPSBhd2FpdCBiYXRjaEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IGxlZ2FjeUhleCA9IGxlZ2FjeVR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICAgIGNvbnN0IHdhc21UeCA9IGJ1aWxkVHJhbnNhY3Rpb24oXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnYmF0Y2gnLFxuICAgICAgICAgIGNhbGxzOiBbXG4gICAgICAgICAgICB7IHR5cGU6ICd0cmFuc2ZlcicsIHRvOiB0bzEsIGFtb3VudDogQmlnSW50KGFtb3VudDEpLCBrZWVwQWxpdmU6IHRydWUgfSxcbiAgICAgICAgICAgIHsgdHlwZTogJ3RyYW5zZmVyJywgdG86IHRvMiwgYW1vdW50OiBCaWdJbnQoYW1vdW50MiksIGtlZXBBbGl2ZTogdHJ1ZSB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgYXRvbWljOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICBjcmVhdGVXYXNtQ29udGV4dCgpXG4gICAgICApO1xuICAgICAgY29uc3Qgd2FzbUhleCA9ICcweCcgKyBCdWZmZXIuZnJvbSh3YXNtVHguc2lnbmFibGVQYXlsb2FkKCkpLnRvU3RyaW5nKCdoZXgnKTtcblxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHdhc21IZXgsIHN0cmlwQ29tcGFjdFByZWZpeChsZWdhY3lIZXgpLCAnU2lnbmluZyBwYXlsb2FkIHNob3VsZCBtYXRjaCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBwcm9kdWNlIGlkZW50aWNhbCBzaWduaW5nIHBheWxvYWQgZm9yIG5vbi1hdG9taWMgYmF0Y2gnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0byA9IGFjY291bnRzLmFjY291bnQyLmFkZHJlc3M7XG4gICAgICBjb25zdCBhbW91bnQgPSAnMTAwMDAwMDAwMDAwMCc7XG5cbiAgICAgIGNvbnN0IGZhY3RvcnkgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2luKTtcblxuICAgICAgY29uc3QgdHJhbnNmZXJCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKSBhcyBUcmFuc2ZlckJ1aWxkZXI7XG4gICAgICB0cmFuc2ZlckJ1aWxkZXJcbiAgICAgICAgLnNlbmRlcih7IGFkZHJlc3M6IGFjY291bnRzLmFjY291bnQxLmFkZHJlc3MgfSlcbiAgICAgICAgLnRvKHsgYWRkcmVzczogdG8gfSlcbiAgICAgICAgLmFtb3VudChhbW91bnQpXG4gICAgICAgIC52YWxpZGl0eSh7IGZpcnN0VmFsaWQ6IHdlc3RlbmRCbG9jay5ibG9ja051bWJlciwgbWF4RHVyYXRpb246IDI0MDAgfSlcbiAgICAgICAgLnJlZmVyZW5jZUJsb2NrKHdlc3RlbmRCbG9jay5oYXNoKVxuICAgICAgICAuc2VxdWVuY2VJZCh7IG5hbWU6ICdOb25jZScsIGtleXdvcmQ6ICdub25jZScsIHZhbHVlOiAwIH0pO1xuICAgICAgY29uc3QgdHJhbnNmZXJUeCA9IGF3YWl0IHRyYW5zZmVyQnVpbGRlci5idWlsZCgpO1xuXG4gICAgICBmdW5jdGlvbiBleHRyYWN0Q2FsbEZyb21TaWduaW5nUGF5bG9hZChzaWduaW5nUGF5bG9hZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgaGV4RGF0YSA9IHNpZ25pbmdQYXlsb2FkLnN0YXJ0c1dpdGgoJzB4JykgPyBzaWduaW5nUGF5bG9hZC5zbGljZSgyKSA6IHNpZ25pbmdQYXlsb2FkO1xuICAgICAgICBjb25zdCBieXRlcyA9IEJ1ZmZlci5mcm9tKGhleERhdGEsICdoZXgnKTtcbiAgICAgICAgY29uc3QgbW9kZSA9IGJ5dGVzWzBdICYgMGIxMTtcbiAgICAgICAgbGV0IGNhbGxMZW5ndGg6IG51bWJlcjtcbiAgICAgICAgbGV0IG9mZnNldDogbnVtYmVyO1xuICAgICAgICBpZiAobW9kZSA9PT0gMGIwMCkge1xuICAgICAgICAgIGNhbGxMZW5ndGggPSBieXRlc1swXSA+PiAyO1xuICAgICAgICAgIG9mZnNldCA9IDE7XG4gICAgICAgIH0gZWxzZSBpZiAobW9kZSA9PT0gMGIwMSkge1xuICAgICAgICAgIGNhbGxMZW5ndGggPSAoYnl0ZXNbMF0gfCAoYnl0ZXNbMV0gPDwgOCkpID4+IDI7XG4gICAgICAgICAgb2Zmc2V0ID0gMjtcbiAgICAgICAgfSBlbHNlIGlmIChtb2RlID09PSAwYjEwKSB7XG4gICAgICAgICAgY2FsbExlbmd0aCA9IChieXRlc1swXSB8IChieXRlc1sxXSA8PCA4KSB8IChieXRlc1syXSA8PCAxNikgfCAoYnl0ZXNbM10gPDwgMjQpKSA+PiAyO1xuICAgICAgICAgIG9mZnNldCA9IDQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBjb21wYWN0IGxlbmd0aCBtb2RlJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICcweCcgKyBieXRlcy5zbGljZShvZmZzZXQsIG9mZnNldCArIGNhbGxMZW5ndGgpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY2FsbEhleCA9IGV4dHJhY3RDYWxsRnJvbVNpZ25pbmdQYXlsb2FkKHRyYW5zZmVyVHgudG9Ccm9hZGNhc3RGb3JtYXQoKSk7XG5cbiAgICAgIGNvbnN0IGJhdGNoQnVpbGRlciA9IGZhY3RvcnkuZ2V0QmF0Y2hUcmFuc2FjdGlvbkJ1aWxkZXIoKTtcbiAgICAgIGJhdGNoQnVpbGRlclxuICAgICAgICAuc2VuZGVyKHsgYWRkcmVzczogYWNjb3VudHMuYWNjb3VudDEuYWRkcmVzcyB9KVxuICAgICAgICAuY2FsbHMoW2NhbGxIZXhdKVxuICAgICAgICAuYXRvbWljKGZhbHNlKVxuICAgICAgICAudmFsaWRpdHkoeyBmaXJzdFZhbGlkOiB3ZXN0ZW5kQmxvY2suYmxvY2tOdW1iZXIsIG1heER1cmF0aW9uOiAyNDAwIH0pXG4gICAgICAgIC5yZWZlcmVuY2VCbG9jayh3ZXN0ZW5kQmxvY2suaGFzaClcbiAgICAgICAgLnNlcXVlbmNlSWQoeyBuYW1lOiAnTm9uY2UnLCBrZXl3b3JkOiAnbm9uY2UnLCB2YWx1ZTogMCB9KTtcblxuICAgICAgY29uc3QgbGVnYWN5VHggPSBhd2FpdCBiYXRjaEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IGxlZ2FjeUhleCA9IGxlZ2FjeVR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICAgIGNvbnN0IHdhc21UeCA9IGJ1aWxkVHJhbnNhY3Rpb24oXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnYmF0Y2gnLFxuICAgICAgICAgIGNhbGxzOiBbeyB0eXBlOiAndHJhbnNmZXInLCB0bywgYW1vdW50OiBCaWdJbnQoYW1vdW50KSwga2VlcEFsaXZlOiB0cnVlIH1dLFxuICAgICAgICAgIGF0b21pYzogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICAgIGNyZWF0ZVdhc21Db250ZXh0KClcbiAgICAgICk7XG4gICAgICBjb25zdCB3YXNtSGV4ID0gJzB4JyArIEJ1ZmZlci5mcm9tKHdhc21UeC5zaWduYWJsZVBheWxvYWQoKSkudG9TdHJpbmcoJ2hleCcpO1xuXG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwod2FzbUhleCwgc3RyaXBDb21wYWN0UHJlZml4KGxlZ2FjeUhleCksICdTaWduaW5nIHBheWxvYWQgc2hvdWxkIG1hdGNoJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBJbnRlbnQtYmFzZWQgVHJhbnNhY3Rpb24gQnVpbGRpbmcgKHNhbml0eSBjaGVja3MpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBkZXNjcmliZSgnSW50ZW50LWJhc2VkIFRyYW5zYWN0aW9uIEJ1aWxkaW5nJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgYnVpbGQgdHJhbnNmZXIgZnJvbSBpbnRlbnQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB3YXNtVHggPSBidWlsZFRyYW5zYWN0aW9uKFxuICAgICAgICB7IHR5cGU6ICd0cmFuc2ZlcicsIHRvOiBhY2NvdW50cy5hY2NvdW50Mi5hZGRyZXNzLCBhbW91bnQ6IDEwMDAwMDAwMDAwMDBuLCBrZWVwQWxpdmU6IHRydWUgfSxcbiAgICAgICAgY3JlYXRlV2FzbUNvbnRleHQoKVxuICAgICAgKTtcbiAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSB3YXNtVHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIGFzc2VydChzZXJpYWxpemVkLnN0YXJ0c1dpdGgoJzB4JyksICdTaG91bGQgYmUgaGV4IGVuY29kZWQnKTtcbiAgICAgIGFzc2VydChzZXJpYWxpemVkLmxlbmd0aCA+IDEwLCAnU2hvdWxkIGhhdmUgY29udGVudCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBzdGFrZSBmcm9tIGludGVudCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHdhc21UeCA9IGJ1aWxkVHJhbnNhY3Rpb24oXG4gICAgICAgIHsgdHlwZTogJ3N0YWtlJywgYW1vdW50OiA1MDAwMDAwMDAwMDAwbiwgcGF5ZWU6IHsgdHlwZTogJ3N0YWtlZCcgfSB9LFxuICAgICAgICBjcmVhdGVXYXNtQ29udGV4dCgpXG4gICAgICApO1xuICAgICAgYXNzZXJ0KHdhc21UeC50b0Jyb2FkY2FzdEZvcm1hdCgpLnN0YXJ0c1dpdGgoJzB4JykpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCB3aXRoZHJhd1VuYm9uZGVkIGZyb20gaW50ZW50JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgd2FzbVR4ID0gYnVpbGRUcmFuc2FjdGlvbih7IHR5cGU6ICd3aXRoZHJhd1VuYm9uZGVkJywgc2xhc2hpbmdTcGFuczogMCB9LCBjcmVhdGVXYXNtQ29udGV4dCgpKTtcbiAgICAgIGFzc2VydCh3YXNtVHgudG9Ccm9hZGNhc3RGb3JtYXQoKS5zdGFydHNXaXRoKCcweCcpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgY2hpbGwgZnJvbSBpbnRlbnQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB3YXNtVHggPSBidWlsZFRyYW5zYWN0aW9uKHsgdHlwZTogJ2NoaWxsJyB9LCBjcmVhdGVXYXNtQ29udGV4dCgpKTtcbiAgICAgIGFzc2VydCh3YXNtVHgudG9Ccm9hZGNhc3RGb3JtYXQoKS5zdGFydHNXaXRoKCcweCcpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgYWRkUHJveHkgZnJvbSBpbnRlbnQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB3YXNtVHggPSBidWlsZFRyYW5zYWN0aW9uKFxuICAgICAgICB7IHR5cGU6ICdhZGRQcm94eScsIGRlbGVnYXRlOiBhY2NvdW50cy5hY2NvdW50Mi5hZGRyZXNzLCBwcm94eVR5cGU6ICdBbnknLCBkZWxheTogMCB9LFxuICAgICAgICBjcmVhdGVXYXNtQ29udGV4dCgpXG4gICAgICApO1xuICAgICAgYXNzZXJ0KHdhc21UeC50b0Jyb2FkY2FzdEZvcm1hdCgpLnN0YXJ0c1dpdGgoJzB4JykpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBiYXRjaCBmcm9tIGludGVudCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHdhc21UeCA9IGJ1aWxkVHJhbnNhY3Rpb24oXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnYmF0Y2gnLFxuICAgICAgICAgIGNhbGxzOiBbXG4gICAgICAgICAgICB7IHR5cGU6ICd0cmFuc2ZlcicsIHRvOiBhY2NvdW50cy5hY2NvdW50Mi5hZGRyZXNzLCBhbW91bnQ6IDEwMDAwMDAwMDAwMDBuLCBrZWVwQWxpdmU6IHRydWUgfSxcbiAgICAgICAgICAgIHsgdHlwZTogJ2NoaWxsJyB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgYXRvbWljOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICBjcmVhdGVXYXNtQ29udGV4dCgpXG4gICAgICApO1xuICAgICAgYXNzZXJ0KHdhc21UeC50b0Jyb2FkY2FzdEZvcm1hdCgpLnN0YXJ0c1dpdGgoJzB4JykpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
197
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FzbUJ1aWxkZXJCeXRlQ29tcGFyaXNvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Rlc3QvdW5pdC93YXNtQnVpbGRlckJ5dGVDb21wYXJpc29uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRzs7Ozs7QUFFSCxvREFBNEI7QUFDNUIsaURBQTRDO0FBQzVDLHVGQUFvRjtBQUVwRiwwQ0FBcUQ7QUFDckQsZ0VBQXdDO0FBRXhDLHNCQUFzQjtBQUN0Qiw4Q0FBcUY7QUFFckYsUUFBUSxDQUFDLHdDQUF3QyxFQUFFO0lBQ2pELE1BQU0sSUFBSSxHQUFHLGVBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFL0Isb0VBQW9FO0lBQ3BFLE1BQU0sUUFBUSxHQUFHLGVBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFekMsU0FBUyxpQkFBaUIsQ0FBQyxZQUFtQyxFQUFFO1FBQzlELE9BQU87WUFDTCxNQUFNLEVBQUUsbUJBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTztZQUNqQyxLQUFLLEVBQUUsQ0FBQztZQUNSLEdBQUcsRUFBRSxFQUFFO1lBQ1AsUUFBUSxFQUFFLFFBQW9CO1lBQzlCLFFBQVEsRUFBRTtnQkFDUixVQUFVLEVBQUUsdUJBQVksQ0FBQyxXQUFXO2dCQUNwQyxXQUFXLEVBQUUsSUFBSTthQUNsQjtZQUNELGNBQWMsRUFBRSx1QkFBWSxDQUFDLElBQUk7WUFDakMsR0FBRyxTQUFTO1NBQ2IsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxTQUFTLGtCQUFrQixDQUFDLEdBQVc7UUFDckMsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO1FBQ3ZELE1BQU0sS0FBSyxH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QUNqQixZQUFZLEVBQUUsbUJBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTzthQUN4QyxFQUNELGlCQUFpQixFQUFFLENBQ3BCLENBQUM7WUFDRixJQUFBLGdCQUFNLEVBQUMsTUFBTSxDQUFDLGlCQUFpQixFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDdEQsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsb0RBQW9ELEVBQUUsS0FBSztZQUM1RCxNQUFNLE1BQU0sR0FBRyxJQUFBLDJCQUFnQixFQUFDLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxFQUFFLEVBQUUsbUJBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDO1lBQzdHLElBQUEsZ0JBQU0sRUFBQyxNQUFNLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUN0RCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFdBU00gQnVpbGRlciBCeXRlIENvbXBhcmlzb24gVGVzdHNcbiAqXG4gKiBDb21wYXJlIHNlcmlhbGl6ZWQgb3V0cHV0IGJldHdlZW46XG4gKiAxLiBMZWdhY3kgYXBwcm9hY2ggKHVzaW5nIEBzdWJzdHJhdGUvdHh3cmFwcGVyLXBvbGthZG90KVxuICogMi4gV0FTTSBhcHByb2FjaCAodXNpbmcgQGJpdGdvL3dhc20tZG90IGJ1aWxkVHJhbnNhY3Rpb24pXG4gKlxuICogRm9yIHVuc2lnbmVkIHRyYW5zYWN0aW9ucywgbGVnYWN5IHRvQnJvYWRjYXN0Rm9ybWF0KCkgcmV0dXJucyB0aGUgc2lnbmluZyBwYXlsb2FkXG4gKiAodmlhIGNvbnN0cnVjdC5zaWduaW5nUGF5bG9hZCkuIFdlIGNvbXBhcmUgV0FTTSBzaWduYWJsZVBheWxvYWQoKSBhZ2FpbnN0IGl0LlxuICpcbiAqIEZvcm1hdCBkaWZmZXJlbmNlOiB0eHdyYXBwZXIgZW5jb2RlcyB0aGUgY2FsbCBhcyBgQnl0ZXNgIChWZWM8dTg+KSB3aGljaCBpbmNsdWRlc1xuICogYSBTQ0FMRSBjb21wYWN0LWxlbmd0aCBwcmVmaXguIHN1Ynh0IGVuY29kZXMgaXQgYXMgcmF3IGBDYWxsYCAobm8gcHJlZml4KS5cbiAqIFdlIHN0cmlwIHRoaXMgcHJlZml4IGZyb20gdGhlIGxlZ2FjeSBzaWRlIGJlZm9yZSBjb21wYXJpbmcsIHNpbmNlIHRoZSBhY3R1YWxcbiAqIGNhbGwgZGF0YSwgZXJhLCBub25jZSwgdGlwLCBhbmQgY2hhaW4gY29udGV4dCBhcmUgaWRlbnRpY2FsLlxuICpcbiAqIE5vdGU6IHdhc20tZG90QDEuMy4wIHVzZXMgaGlnaC1sZXZlbCBidXNpbmVzcyBpbnRlbnRzIChwYXltZW50LCBzdGFrZSwgdW5zdGFrZSxcbiAqIGNsYWltLCBjb25zb2xpZGF0ZSkgaW5zdGVhZCBvZiBsb3ctbGV2ZWwgY2FsbCB0eXBlcy4gQmF0Y2ggYW5kIHByb3h5IG9wZXJhdGlvbnNcbiAqIGFyZSBjb21wb3NlZCBhdXRvbWF0aWNhbGx5IGZyb20gdGhlIGludGVudCAoZS5nLiwgc3Rha2Ugd2l0aCBwcm94eUFkZHJlc3NcbiAqIHByb2R1Y2VzIGJhdGNoQWxsKGJvbmQsIGFkZFByb3h5KSkuXG4gKi9cblxuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgY29pbnMgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkgfSBmcm9tICcuLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnknO1xuaW1wb3J0IHsgVHJhbnNmZXJCdWlsZGVyIH0gZnJvbSAnLi4vLi4vc3JjL2xpYi90cmFuc2ZlckJ1aWxkZXInO1xuaW1wb3J0IHsgYWNjb3VudHMsIHdlc3RlbmRCbG9jayB9IGZyb20gJy4uL2ZpeHR1cmVzJztcbmltcG9ydCB1dGlscyBmcm9tICcuLi8uLi9zcmMvbGliL3V0aWxzJztcblxuLy8gSW1wb3J0IFdBU00gYnVpbGRlclxuaW1wb3J0IHsgYnVpbGRUcmFuc2FjdGlvbiwgdHlwZSBCdWlsZENvbnRleHQsIHR5cGUgTWF0ZXJpYWwgfSBmcm9tICdAYml0Z28vd2FzbS1kb3QnO1xuXG5kZXNjcmliZSgnV0FTTSB2cyBMZWdhY3kgQnVpbGRlciBCeXRlIENvbXBhcmlzb24nLCBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IGNvaW4gPSBjb2lucy5nZXQoJ3Rkb3QnKTtcblxuICAvLyBHZXQgbWF0ZXJpYWwgZnJvbSB1dGlscyB0byBlbnN1cmUgc2FtZSBtZXRhZGF0YSBhcyBsZWdhY3kgYnVpbGRlclxuICBjb25zdCBtYXRlcmlhbCA9IHV0aWxzLmdldE1hdGVyaWFsKGNvaW4pO1xuXG4gIGZ1bmN0aW9uIGNyZWF0ZVdhc21Db250ZXh0KG92ZXJyaWRlczogUGFydGlhbDxCdWlsZENvbnRleHQ+ID0ge30pOiBCdWlsZENvbnRleHQge1xuICAgIHJldHVybiB7XG4gICAgICBzZW5kZXI6IGFjY291bnRzLmFjY291bnQxLmFkZHJlc3MsXG4gICAgICBub25jZTogMCxcbiAgICAgIHRpcDogMG4sXG4gICAgICBtYXRlcmlhbDogbWF0ZXJpYWwgYXMgTWF0ZXJpYWwsXG4gICAgICB2YWxpZGl0eToge1xuICAgICAgICBmaXJzdFZhbGlkOiB3ZXN0ZW5kQmxvY2suYmxvY2tOdW1iZXIsXG4gICAgICAgIG1heER1cmF0aW9uOiAyNDAwLFxuICAgICAgfSxcbiAgICAgIHJlZmVyZW5jZUJsb2NrOiB3ZXN0ZW5kQmxvY2suaGFzaCxcbiAgICAgIC4uLm92ZXJyaWRlcyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFN0cmlwIFNDQUxFIGNvbXBhY3QtbGVuZ3RoIHByZWZpeCBmcm9tIHRoZSBsZWdhY3kgc2lnbmluZyBwYXlsb2FkLlxuICAgKlxuICAgKiBMZWdhY3kgKHR4d3JhcHBlcikgZW5jb2RlcyB0aGUgY2FsbCBhcyBgQnl0ZXNgIHR5cGUsIHdoaWNoIGFkZHMgYSBjb21wYWN0LWxlbmd0aFxuICAgKiBwcmVmaXguIHN1Ynh0IGVuY29kZXMgaXQgYXMgcmF3IGBDYWxsYCAobm8gcHJlZml4KS4gQm90aCBwcm9kdWNlIGlkZW50aWNhbFxuICAgKiBjYWxsIGRhdGEgKyBlcmEgKyBub25jZSArIHRpcCArIGNoYWluIGNvbnRleHQgYWZ0ZXIgdGhpcyBwcmVmaXguXG4gICAqL1xuICBmdW5jdGlvbiBzdHJpcENvbXBhY3RQcmVmaXgoaGV4OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRhdGEgPSBoZXguc3RhcnRzV2l0aCgnMHgnKSA/IGhleC5zbGljZSgyKSA6IGhleDtcbiAgICBjb25zdCBieXRlcyA9IEJ1ZmZlci5mcm9tKGRhdGEsICdoZXgnKTtcbiAgICBjb25zdCBtb2RlID0gYnl0ZXNbMF0gJiAwYjExO1xuICAgIGxldCBvZmZzZXQ6IG51bWJlcjtcbiAgICBpZiAobW9kZSA9PT0gMGIwMCkgb2Zmc2V0ID0gMTtcbiAgICBlbHNlIGlmIChtb2RlID09PSAwYjAxKSBvZmZzZXQgPSAyO1xuICAgIGVsc2UgaWYgKG1vZGUgPT09IDBiMTApIG9mZnNldCA9IDQ7XG4gICAgZWxzZSB0aHJvdyBuZXcgRXJyb3IoJ0JpZyBjb21wYWN0IG5vdCBzdXBwb3J0ZWQnKTtcbiAgICByZXR1cm4gJzB4JyArIGJ5dGVzLnNsaWNlKG9mZnNldCkudG9TdHJpbmcoJ2hleCcpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFRyYW5zZmVyIFRyYW5zYWN0aW9uIFRlc3RzXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBkZXNjcmliZSgnVHJhbnNmZXIgVHJhbnNhY3Rpb25zJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgcHJvZHVjZSBpZGVudGljYWwgc2lnbmluZyBwYXlsb2FkIGZvciB0cmFuc2ZlcicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHRvID0gYWNjb3VudHMuYWNjb3VudDIuYWRkcmVzcztcbiAgICAgIGNvbnN0IGFtb3VudCA9ICcxMDAwMDAwMDAwMDAwJzsgLy8gMSBET1RcblxuICAgICAgY29uc3QgZmFjdG9yeSA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW4pO1xuICAgICAgY29uc3QgbGVnYWN5QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCkgYXMgVHJhbnNmZXJCdWlsZGVyO1xuXG4gICAgICBsZWdhY3lCdWlsZGVyXG4gICAgICAgIC5zZW5kZXIoeyBhZGRyZXNzOiBhY2NvdW50cy5hY2NvdW50MS5hZGRyZXNzIH0pXG4gICAgICAgIC50byh7IGFkZHJlc3M6IHRvIH0pXG4gICAgICAgIC5hbW91bnQoYW1vdW50KVxuICAgICAgICAudmFsaWRpdHkoeyBmaXJzdFZhbGlkOiB3ZXN0ZW5kQmxvY2suYmxvY2tOdW1iZXIsIG1heER1cmF0aW9uOiAyNDAwIH0pXG4gICAgICAgIC5yZWZlcmVuY2VCbG9jayh3ZXN0ZW5kQmxvY2suaGFzaClcbiAgICAgICAgLnNlcXVlbmNlSWQoeyBuYW1lOiAnTm9uY2UnLCBrZXl3b3JkOiAnbm9uY2UnLCB2YWx1ZTogMCB9KTtcblxuICAgICAgY29uc3QgbGVnYWN5VHggPSBhd2FpdCBsZWdhY3lCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBsZWdhY3lIZXggPSBsZWdhY3lUeC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICBjb25zdCB3YXNtVHggPSBidWlsZFRyYW5zYWN0aW9uKFxuICAgICAgICB7IHR5cGU6ICdwYXltZW50JywgdG8sIGFtb3VudDogQmlnSW50KGFtb3VudCksIGtlZXBBbGl2ZTogdHJ1ZSB9LFxuICAgICAgICBjcmVhdGVXYXNtQ29udGV4dCgpXG4gICAgICApO1xuICAgICAgY29uc3Qgd2FzbUhleCA9ICcweCcgKyBCdWZmZXIuZnJvbSh3YXNtVHguc2lnbmFibGVQYXlsb2FkKCkpLnRvU3RyaW5nKCdoZXgnKTtcblxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHdhc21IZXgsIHN0cmlwQ29tcGFjdFByZWZpeChsZWdhY3lIZXgpLCAnU2lnbmluZyBwYXlsb2FkIHNob3VsZCBtYXRjaCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBwcm9kdWNlIGlkZW50aWNhbCBzaWduaW5nIHBheWxvYWQgZm9yIHRyYW5zZmVyS2VlcEFsaXZlIHdpdGggZGlmZmVyZW50IG5vbmNlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdG8gPSBhY2NvdW50cy5hY2NvdW50Mi5hZGRyZXNzO1xuICAgICAgY29uc3QgYW1vdW50ID0gJzUwMDAwMDAwMDAwMDAnOyAvLyA1IERPVFxuXG4gICAgICBjb25zdCBmYWN0b3J5ID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbik7XG4gICAgICBjb25zdCBsZWdhY3lCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKSBhcyBUcmFuc2ZlckJ1aWxkZXI7XG5cbiAgICAgIGxlZ2FjeUJ1aWxkZXJcbiAgICAgICAgLnNlbmRlcih7IGFkZHJlc3M6IGFjY291bnRzLmFjY291bnQxLmFkZHJlc3MgfSlcbiAgICAgICAgLnRvKHsgYWRkcmVzczogdG8gfSlcbiAgICAgICAgLmFtb3VudChhbW91bnQpXG4gICAgICAgIC52YWxpZGl0eSh7IGZpcnN0VmFsaWQ6IHdlc3RlbmRCbG9jay5ibG9ja051bWJlciwgbWF4RHVyYXRpb246IDI0MDAgfSlcbiAgICAgICAgLnJlZmVyZW5jZUJsb2NrKHdlc3RlbmRCbG9jay5oYXNoKVxuICAgICAgICAuc2VxdWVuY2VJZCh7IG5hbWU6ICdOb25jZScsIGtleXdvcmQ6ICdub25jZScsIHZhbHVlOiA1IH0pO1xuXG4gICAgICBjb25zdCBsZWdhY3lUeCA9IGF3YWl0IGxlZ2FjeUJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IGxlZ2FjeUhleCA9IGxlZ2FjeVR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICAgIGNvbnN0IHdhc21UeCA9IGJ1aWxkVHJhbnNhY3Rpb24oXG4gICAgICAgIHsgdHlwZTogJ3BheW1lbnQnLCB0bywgYW1vdW50OiBCaWdJbnQoYW1vdW50KSwga2VlcEFsaXZlOiB0cnVlIH0sXG4gICAgICAgIGNyZWF0ZVdhc21Db250ZXh0KHsgbm9uY2U6IDUgfSlcbiAgICAgICk7XG4gICAgICBjb25zdCB3YXNtSGV4ID0gJzB4JyArIEJ1ZmZlci5mcm9tKHdhc21UeC5zaWduYWJsZVBheWxvYWQoKSkudG9TdHJpbmcoJ2hleCcpO1xuXG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwod2FzbUhleCwgc3RyaXBDb21wYWN0UHJlZml4KGxlZ2FjeUhleCksICdTaWduaW5nIHBheWxvYWQgc2hvdWxkIG1hdGNoJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBTdGFraW5nIFRyYW5zYWN0aW9uIFRlc3RzXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBkZXNjcmliZSgnU3Rha2luZyBUcmFuc2FjdGlvbnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgLy8gTm90ZTogd2FzbS1kb3RAMS4zLjAgYHN0YWtlYCB3aXRob3V0IHByb3h5QWRkcmVzcyBwcm9kdWNlcyBib25kRXh0cmEgKHRvcC11cCksXG4gICAgLy8gd2hpbGUgdGhlIGxlZ2FjeSBnZXRTdGFraW5nQnVpbGRlcigpIHByb2R1Y2VzIGJvbmQgKGluaXRpYWwgc3Rha2UpLiBUaGVzZSBhcmVcbiAgICAvLyBkaWZmZXJlbnQgZXh0cmluc2ljIGNhbGxzIHNvIGJ5dGUgY29tcGFyaXNvbiBpcyBub3QgYXBwbGljYWJsZS4gVGhlIGJvbmQgY2FsbFxuICAgIC8vIGlzIG5vdyBvbmx5IHByb2R1Y2VkIHZpYSBgc3Rha2VgIHdpdGggcHJveHlBZGRyZXNzICh3aGljaCBjcmVhdGVzIGEgYmF0Y2gpLlxuICAgIC8vIFNlZSBJbnRlbnQtYmFzZWQgVHJhbnNhY3Rpb24gQnVpbGRpbmcgdGVzdHMgYmVsb3cgZm9yIHN0YWtlIHNhbml0eSBjaGVja3MuXG5cbiAgICBpdCgnc2hvdWxkIHByb2R1Y2UgaWRlbnRpY2FsIHNpZ25pbmcgcGF5bG9hZCBmb3IgdW5zdGFrZSAodW5ib25kKScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGFtb3VudCA9ICc1MDAwMDAwMDAwMDAwJzsgLy8gNSBET1RcblxuICAgICAgY29uc3QgZmFjdG9yeSA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW4pO1xuICAgICAgY29uc3QgbGVnYWN5QnVpbGRlciA9IGZhY3RvcnkuZ2V0VW5zdGFrZUJ1aWxkZXIoKTtcblxuICAgICAgbGVnYWN5QnVpbGRlclxuICAgICAgICAuc2VuZGVyKHsgYWRkcmVzczogYWNjb3VudHMuYWNjb3VudDEuYWRkcmVzcyB9KVxuICAgICAgICAuYW1vdW50KGFtb3VudClcbiAgICAgICAgLnZhbGlkaXR5KHsgZmlyc3RWYWxpZDogd2VzdGVuZEJsb2NrLmJsb2NrTnVtYmVyLCBtYXhEdXJhdGlvbjogMjQwMCB9KVxuICAgICAgICAucmVmZXJlbmNlQmxvY2sod2VzdGVuZEJsb2NrLmhhc2gpXG4gICAgICAgIC5zZXF1ZW5jZUlkKHsgbmFtZTogJ05vbmNlJywga2V5d29yZDogJ25vbmNlJywgdmFsdWU6IDAgfSk7XG5cbiAgICAgIGNvbnN0IGxlZ2FjeVR4ID0gYXdhaXQgbGVnYWN5QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgbGVnYWN5SGV4ID0gbGVnYWN5VHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgICAgY29uc3Qgd2FzbVR4ID0gYnVpbGRUcmFuc2FjdGlvbih7IHR5cGU6ICd1bnN0YWtlJywgYW1vdW50OiBCaWdJbnQoYW1vdW50KSB9LCBjcmVhdGVXYXNtQ29udGV4dCgpKTtcbiAgICAgIGNvbnN0IHdhc21IZXggPSAnMHgnICsgQnVmZmVyLmZyb20od2FzbVR4LnNpZ25hYmxlUGF5bG9hZCgpKS50b1N0cmluZygnaGV4Jyk7XG5cbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCh3YXNtSGV4LCBzdHJpcENvbXBhY3RQcmVmaXgobGVnYWN5SGV4KSwgJ1NpZ25pbmcgcGF5bG9hZCBzaG91bGQgbWF0Y2gnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcHJvZHVjZSBpZGVudGljYWwgc2lnbmluZyBwYXlsb2FkIGZvciB3aXRoZHJhd1VuYm9uZGVkIChjbGFpbSknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBzbGFzaGluZ1NwYW5zID0gMDtcblxuICAgICAgY29uc3QgZmFjdG9yeSA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW4pO1xuICAgICAgY29uc3QgbGVnYWN5QnVpbGRlciA9IGZhY3RvcnkuZ2V0V2l0aGRyYXdVbnN0YWtlZEJ1aWxkZXIoKTtcblxuICAgICAgbGVnYWN5QnVpbGRlclxuICAgICAgICAuc2VuZGVyKHsgYWRkcmVzczogYWNjb3VudHMuYWNjb3VudDEuYWRkcmVzcyB9KVxuICAgICAgICAuc2xhc2hpbmdTcGFucyhzbGFzaGluZ1NwYW5zKVxuICAgICAgICAudmFsaWRpdHkoeyBmaXJzdFZhbGlkOiB3ZXN0ZW5kQmxvY2suYmxvY2tOdW1iZXIsIG1heER1cmF0aW9uOiAyNDAwIH0pXG4gICAgICAgIC5yZWZlcmVuY2VCbG9jayh3ZXN0ZW5kQmxvY2suaGFzaClcbiAgICAgICAgLnNlcXVlbmNlSWQoeyBuYW1lOiAnTm9uY2UnLCBrZXl3b3JkOiAnbm9uY2UnLCB2YWx1ZTogMCB9KTtcblxuICAgICAgY29uc3QgbGVnYWN5VHggPSBhd2FpdCBsZWdhY3lCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBsZWdhY3lIZXggPSBsZWdhY3lUeC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICBjb25zdCB3YXNtVHggPSBidWlsZFRyYW5zYWN0aW9uKHsgdHlwZTogJ2NsYWltJywgc2xhc2hpbmdTcGFucyB9LCBjcmVhdGVXYXNtQ29udGV4dCgpKTtcbiAgICAgIGNvbnN0IHdhc21IZXggPSAnMHgnICsgQnVmZmVyLmZyb20od2FzbVR4LnNpZ25hYmxlUGF5bG9hZCgpKS50b1N0cmluZygnaGV4Jyk7XG5cbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCh3YXNtSGV4LCBzdHJpcENvbXBhY3RQcmVmaXgobGVnYWN5SGV4KSwgJ1NpZ25pbmcgcGF5bG9hZCBzaG91bGQgbWF0Y2gnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEludGVudC1iYXNlZCBUcmFuc2FjdGlvbiBCdWlsZGluZyAoc2FuaXR5IGNoZWNrcylcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGRlc2NyaWJlKCdJbnRlbnQtYmFzZWQgVHJhbnNhY3Rpb24gQnVpbGRpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBidWlsZCBwYXltZW50IGZyb20gaW50ZW50JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgd2FzbVR4ID0gYnVpbGRUcmFuc2FjdGlvbihcbiAgICAgICAgeyB0eXBlOiAncGF5bWVudCcsIHRvOiBhY2NvdW50cy5hY2NvdW50Mi5hZGRyZXNzLCBhbW91bnQ6IDEwMDAwMDAwMDAwMDBuLCBrZWVwQWxpdmU6IHRydWUgfSxcbiAgICAgICAgY3JlYXRlV2FzbUNvbnRleHQoKVxuICAgICAgKTtcbiAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSB3YXNtVHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIGFzc2VydChzZXJpYWxpemVkLnN0YXJ0c1dpdGgoJzB4JyksICdTaG91bGQgYmUgaGV4IGVuY29kZWQnKTtcbiAgICAgIGFzc2VydChzZXJpYWxpemVkLmxlbmd0aCA+IDEwLCAnU2hvdWxkIGhhdmUgY29udGVudCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBzdGFrZSAodG9wLXVwKSBmcm9tIGludGVudCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHdhc21UeCA9IGJ1aWxkVHJhbnNhY3Rpb24oXG4gICAgICAgIHsgdHlwZTogJ3N0YWtlJywgYW1vdW50OiA1MDAwMDAwMDAwMDAwbiwgcGF5ZWU6IHsgdHlwZTogJ3N0YWtlZCcgfSB9LFxuICAgICAgICBjcmVhdGVXYXNtQ29udGV4dCgpXG4gICAgICApO1xuICAgICAgYXNzZXJ0KHdhc21UeC50b0Jyb2FkY2FzdEZvcm1hdCgpLnN0YXJ0c1dpdGgoJzB4JykpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBzdGFrZSB3aXRoIHByb3h5IChuZXcgc3Rha2UgLyBiYXRjaEFsbChib25kLCBhZGRQcm94eSkpIGZyb20gaW50ZW50JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgd2FzbVR4ID0gYnVpbGRUcmFuc2FjdGlvbihcbiAgICAgICAgeyB0eXBlOiAnc3Rha2UnLCBhbW91bnQ6IDEwMDAwMDAwMDAwMDAwbiwgcHJveHlBZGRyZXNzOiBhY2NvdW50cy5hY2NvdW50Mi5hZGRyZXNzLCBwYXllZTogeyB0eXBlOiAnc3Rha2VkJyB9IH0sXG4gICAgICAgIGNyZWF0ZVdhc21Db250ZXh0KClcbiAgICAgICk7XG4gICAgICBhc3NlcnQod2FzbVR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkuc3RhcnRzV2l0aCgnMHgnKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGNsYWltICh3aXRoZHJhd1VuYm9uZGVkKSBmcm9tIGludGVudCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHdhc21UeCA9IGJ1aWxkVHJhbnNhY3Rpb24oeyB0eXBlOiAnY2xhaW0nLCBzbGFzaGluZ1NwYW5zOiAwIH0sIGNyZWF0ZVdhc21Db250ZXh0KCkpO1xuICAgICAgYXNzZXJ0KHdhc21UeC50b0Jyb2FkY2FzdEZvcm1hdCgpLnN0YXJ0c1dpdGgoJzB4JykpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCB1bnN0YWtlIChwYXJ0aWFsIC8gdW5ib25kKSBmcm9tIGludGVudCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHdhc21UeCA9IGJ1aWxkVHJhbnNhY3Rpb24oeyB0eXBlOiAndW5zdGFrZScsIGFtb3VudDogNTAwMDAwMDAwMDAwMG4gfSwgY3JlYXRlV2FzbUNvbnRleHQoKSk7XG4gICAgICBhc3NlcnQod2FzbVR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkuc3RhcnRzV2l0aCgnMHgnKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIHVuc3Rha2Ugd2l0aCBzdG9wU3Rha2luZyAoZnVsbCAvIGJhdGNoQWxsKHJlbW92ZVByb3h5LCBjaGlsbCwgdW5ib25kKSkgZnJvbSBpbnRlbnQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB3YXNtVHggPSBidWlsZFRyYW5zYWN0aW9uKFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ3Vuc3Rha2UnLFxuICAgICAgICAgIGFtb3VudDogNTAwMDAwMDAwMDAwMG4sXG4gICAgICAgICAgc3RvcFN0YWtpbmc6IHRydWUsXG4gICAgICAgICAgcHJveHlBZGRyZXNzOiBhY2NvdW50cy5hY2NvdW50Mi5hZGRyZXNzLFxuICAgICAgICB9LFxuICAgICAgICBjcmVhdGVXYXNtQ29udGV4dCgpXG4gICAgICApO1xuICAgICAgYXNzZXJ0KHdhc21UeC50b0Jyb2FkY2FzdEZvcm1hdCgpLnN0YXJ0c1dpdGgoJzB4JykpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBjb25zb2xpZGF0ZSAodHJhbnNmZXJBbGwpIGZyb20gaW50ZW50JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgd2FzbVR4ID0gYnVpbGRUcmFuc2FjdGlvbih7IHR5cGU6ICdjb25zb2xpZGF0ZScsIHRvOiBhY2NvdW50cy5hY2NvdW50Mi5hZGRyZXNzIH0sIGNyZWF0ZVdhc21Db250ZXh0KCkpO1xuICAgICAgYXNzZXJ0KHdhc21UeC50b0Jyb2FkY2FzdEZvcm1hdCgpLnN0YXJ0c1dpdGgoJzB4JykpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
@@ -6,6 +6,10 @@
6
6
  *
7
7
  * Uses WASM-built transactions (not legacy rawTx fixtures) since the WASM
8
8
  * parser requires metadata-compatible signed extension encoding.
9
+ *
10
+ * Note: wasm-dot@1.3.0 uses high-level business intents. Batch transactions
11
+ * are produced automatically from the intent (e.g., unstake with stopStaking
12
+ * produces batchAll(removeProxy, chill, unbond)).
9
13
  */
10
14
  export {};
11
15
  //# sourceMappingURL=wasmParserExplanation.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"wasmParserExplanation.d.ts","sourceRoot":"","sources":["../../../test/unit/wasmParserExplanation.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
1
+ {"version":3,"file":"wasmParserExplanation.d.ts","sourceRoot":"","sources":["../../../test/unit/wasmParserExplanation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG"}