UNPKG

86.8 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3const ava_1 = require("ava");
4const uuid_1 = require("uuid");
5const cache_1 = require("../src/cache");
6const throttle_1 = require("../src/throttle");
7const functions_1 = require("./fixtures/functions");
8const util_1 = require("./fixtures/util");
9(0, ava_1.default)("deferred resolves its promise", async (t) => {
10 const deferred = new throttle_1.Deferred();
11 let resolved = false;
12 deferred.promise.then(_ => (resolved = true));
13 t.is(resolved, false);
14 deferred.resolve();
15 await deferred.promise;
16 t.is(resolved, true);
17});
18(0, ava_1.default)("deferred rejects its promise", async (t) => {
19 const deferred = new throttle_1.Deferred();
20 let rejected = false;
21 t.is(rejected, false);
22 deferred.reject();
23 try {
24 await deferred.promise;
25 }
26 catch (_) {
27 rejected = true;
28 }
29 t.is(rejected, true);
30});
31(0, ava_1.default)("deferred resolves only once", async (t) => {
32 const deferred = new throttle_1.Deferred();
33 let value = 0;
34 deferred.promise.then(_ => value++);
35 deferred.resolve();
36 await deferred.promise;
37 t.is(value, 1);
38 deferred.resolve();
39 await deferred.promise;
40 t.is(value, 1);
41});
42(0, ava_1.default)("deferred cannot reject after resolving", async (t) => {
43 const deferred = new throttle_1.Deferred();
44 let value = 0;
45 deferred.promise.then(_ => value++);
46 deferred.resolve();
47 await deferred.promise;
48 t.is(value, 1);
49 deferred.reject();
50 await deferred.promise;
51 t.is(value, 1);
52});
53ava_1.default.serial("funnel defaults to infinite concurrency (tested with 200)", t => (0, util_1.withClock)(async () => {
54 const funnel = new throttle_1.Funnel(0);
55 const promises = [];
56 const N = 200;
57 for (let i = 0; i < N; i++) {
58 promises.push(funnel.push(() => (0, functions_1.timer)(300)));
59 }
60 const times = await Promise.all(promises);
61 t.is((0, util_1.measureConcurrency)(times), N);
62}));
63ava_1.default.serial("funnel single concurrency is mutually exclusive", t => (0, util_1.withClock)(async () => {
64 const funnel = new throttle_1.Funnel(1);
65 const promises = [];
66 const N = 10;
67 for (let i = 0; i < N; i++) {
68 promises.push(funnel.push(() => (0, functions_1.timer)(10)));
69 }
70 const times = await Promise.all(promises);
71 t.is((0, util_1.measureConcurrency)(times), 1);
72}));
73ava_1.default.serial("funnel handles concurrency level 2", t => (0, util_1.withClock)(async () => {
74 const funnel = new throttle_1.Funnel(2);
75 const promises = [];
76 const N = 10;
77 for (let i = 0; i < N; i++) {
78 promises.push(funnel.push(() => (0, functions_1.timer)(20)));
79 }
80 const times = await Promise.all(promises);
81 t.is((0, util_1.measureConcurrency)(times), 2);
82}));
83ava_1.default.serial("funnel handles concurrency level 10", t => (0, util_1.withClock)(async () => {
84 const funnel = new throttle_1.Funnel(10);
85 const promises = [];
86 const N = 100;
87 for (let i = 0; i < N; i++) {
88 promises.push(funnel.push(() => (0, functions_1.timer)(20)));
89 }
90 const times = await Promise.all(promises);
91 t.is((0, util_1.measureConcurrency)(times), 10);
92}));
93ava_1.default.serial("funnel resumes after finishing a worker", t => (0, util_1.withClock)(async () => {
94 const funnel = new throttle_1.Funnel(1);
95 const time1 = await funnel.push(() => (0, functions_1.timer)(10));
96 const time2 = await funnel.push(() => (0, functions_1.timer)(10));
97 t.is((0, util_1.measureConcurrency)([time1, time2]), 1);
98}));
99(0, ava_1.default)("funnel clearing", async (t) => {
100 const funnel = new throttle_1.Funnel(1);
101 let count = 0;
102 const promise0 = funnel.push(async () => count++);
103 const promise1 = funnel.push(async () => count++);
104 const promise2 = funnel.push(async () => count++);
105 funnel.clear();
106 t.is(await Promise.race([promise0, promise1, promise2, (0, util_1.sleep)(100).then(_ => "done")]), "done");
107 t.is(count, 0);
108});
109(0, ava_1.default)("funnel gets executed asynchronously, not at the moment of push", async (t) => {
110 const funnel = new throttle_1.Funnel(1);
111 let n = 0;
112 funnel.push(async () => {
113 n++;
114 });
115 t.is(n, 0);
116 await funnel.all();
117 t.is(n, 1);
118});
119(0, ava_1.default)("funnel handles promise rejections without losing concurrency", async (t) => {
120 const funnel = new throttle_1.Funnel(1);
121 let executed = false;
122 await t.throwsAsync(funnel.push(() => Promise.reject(new Error("message"))), { message: "message" });
123 await funnel.push(async () => {
124 executed = true;
125 });
126 t.is(executed, true);
127});
128(0, ava_1.default)("funnel.all() waits for all requests to finish", async (t) => {
129 const funnel = new throttle_1.Funnel(1);
130 let executed = false;
131 funnel.push(async () => {
132 await (0, util_1.sleep)(200);
133 executed = true;
134 return "first";
135 });
136 funnel.push(async () => "second");
137 t.is(executed, false);
138 const result = await funnel.all();
139 t.is(result.length, 2);
140 t.is(result[0], "first");
141 t.is(result[1], "second");
142 t.is(executed, true);
143});
144(0, ava_1.default)("funnel.all() ignores errors and waits for other requests to finish", async (t) => {
145 const funnel = new throttle_1.Funnel(1);
146 funnel.push(async () => {
147 throw new Error();
148 });
149 funnel.push(async () => {
150 await (0, util_1.sleep)(100);
151 return "done";
152 });
153 const result = await funnel.all();
154 t.is(result.length, 2);
155 t.falsy(result[0]);
156 t.is(result[1], "done");
157});
158(0, ava_1.default)("retryOp() retries failures", async (t) => {
159 let attempts = 0;
160 await (0, throttle_1.retryOp)(2, async () => {
161 attempts++;
162 throw new Error();
163 }).catch(_ => { });
164 t.is(attempts, 3);
165});
166(0, ava_1.default)("funnel shouldRetry parameter retries failures", async (t) => {
167 const funnel = new throttle_1.Funnel(1, 2);
168 let attempts = 0;
169 let errors = 0;
170 funnel
171 .push(async () => {
172 attempts++;
173 throw Error();
174 })
175 .catch(_ => errors++);
176 await funnel.all();
177 t.is(attempts, 3);
178 t.is(errors, 1);
179});
180(0, ava_1.default)("funnel cancellation", async (t) => {
181 const funnel = new throttle_1.Funnel(1);
182 let executed = 0;
183 const promise = funnel.push(async () => {
184 executed++;
185 }, 0, () => "cancelled");
186 await t.throwsAsync(promise);
187 t.is(executed, 0);
188});
189(0, ava_1.default)("funnel processed and error counts", async (t) => {
190 const funnel = new throttle_1.Funnel(2);
191 funnel.push(async () => { });
192 funnel.push(async () => Promise.reject());
193 funnel.push(async () => { });
194 funnel.push(async () => Promise.reject());
195 funnel.push(async () => { });
196 await funnel.all();
197 t.is(funnel.processed, 3);
198 t.is(funnel.errors, 2);
199});
200ava_1.default.serial("pump works for concurrency level 1", t => (0, util_1.withClock)(async () => {
201 let executed = 0;
202 const pump = new throttle_1.Pump({ concurrency: 1 }, () => {
203 executed++;
204 return (0, util_1.sleep)(100);
205 });
206 t.is(executed, 0);
207 pump.start();
208 await (0, util_1.sleep)(300);
209 pump.stop();
210 t.true(executed === 3);
211}));
212ava_1.default.serial("pump works for concurrency level 10", t => (0, util_1.withClock)(async () => {
213 let executed = 0;
214 const pump = new throttle_1.Pump({ concurrency: 10 }, () => {
215 executed++;
216 return (0, util_1.sleep)(100);
217 });
218 pump.start();
219 await (0, util_1.sleep)(100);
220 pump.stop();
221 t.is(executed, 10);
222}));
223ava_1.default.serial("pump handles promise rejections without losing concurrency", t => (0, util_1.withClock)(async () => {
224 let executed = 0;
225 const pump = new throttle_1.Pump({ concurrency: 1, verbose: false }, () => {
226 executed++;
227 return (0, util_1.sleep)(100).then(_ => Promise.reject("hi"));
228 });
229 pump.start();
230 await (0, util_1.sleep)(500);
231 pump.stop();
232 t.is(executed, 5);
233}));
234ava_1.default.serial("pump drain", t => (0, util_1.withClock)(async () => {
235 let started = 0;
236 let finished = 0;
237 const N = 5;
238 const pump = new throttle_1.Pump({ concurrency: N }, async () => {
239 started++;
240 await (0, util_1.sleep)(100);
241 finished++;
242 });
243 t.is(started, 0);
244 t.is(finished, 0);
245 pump.start();
246 await pump.drain();
247 t.is(started, N);
248 t.is(finished, N);
249}));
250ava_1.default.serial("memoize returns cached results for the same key", t => (0, util_1.withClock)(async () => {
251 const promises = [];
252 const N = 10;
253 const timerFn = (0, throttle_1.throttle)({ memoize: true, concurrency: 1, rate: 10 }, _ => (0, functions_1.timer)(10));
254 for (let i = 0; i < N; i++) {
255 promises.push(timerFn("key"));
256 }
257 const times = await Promise.all(promises);
258 t.is((0, util_1.measureConcurrency)(times), N);
259}));
260ava_1.default.serial("memoize runs the worker for different keys", t => (0, util_1.withClock)(async () => {
261 const promises = [];
262 const N = 10;
263 const timerFn = (0, throttle_1.throttle)({ memoize: true, concurrency: 1, rate: 10 }, _ => (0, functions_1.timer)(10));
264 for (let i = 0; i < N; i++) {
265 promises.push(timerFn(i));
266 }
267 const times = await Promise.all(promises);
268 t.is((0, util_1.measureConcurrency)(times), 1);
269}));
270async function withCache(fn) {
271 const nonce = (0, uuid_1.v4)();
272 const cache = new cache_1.PersistentCache(`.faast/test/${nonce}`);
273 await fn(cache).catch(console.error);
274 await cache.clear({ leaveEmptyDir: false });
275}
276(0, ava_1.default)("caching saves values and skips re-execution", t => withCache(async (cache) => {
277 let counter = 0;
278 function fn(_) {
279 return Promise.resolve(counter++);
280 }
281 const mfn = (0, throttle_1.cacheFn)(cache, fn);
282 await mfn(0);
283 await mfn(7);
284 await mfn(0);
285 t.is(counter, 2);
286 const mfn2 = (0, throttle_1.cacheFn)(cache, fn);
287 await mfn2(0);
288 await mfn2(7);
289 await mfn2(0);
290 await mfn2(10);
291 t.is(counter, 3);
292}));
293(0, ava_1.default)("cache works with string arguments", async (t) => withCache(async (cache) => {
294 let counter = 0;
295 function fn(_) {
296 return Promise.resolve(counter++);
297 }
298 const mfn = (0, throttle_1.cacheFn)(cache, fn);
299 await mfn("a");
300 await mfn("b");
301 await mfn("a");
302 t.is(counter, 2);
303}));
304(0, ava_1.default)("cache works with object arguments", async (t) => withCache(async (cache) => {
305 let counter = 0;
306 function fn(_) {
307 return Promise.resolve(counter++);
308 }
309 const mfn = (0, throttle_1.cacheFn)(cache, fn);
310 await mfn({ f: "field", i: 42 });
311 await mfn({ f: "field", i: 1 });
312 await mfn({ f: "other", i: 42 });
313 await mfn({ f: "field", i: 42 });
314 t.is(counter, 3);
315}));
316(0, ava_1.default)("cache does not save rejected promises from cached function", async (t) => withCache(async (cache) => {
317 let counter = 0;
318 function fn(_) {
319 counter++;
320 return Promise.reject(new Error("rejection"));
321 }
322 let caught = 0;
323 const mfn = (0, throttle_1.cacheFn)(cache, fn);
324 await mfn(1).catch(_ => caught++);
325 await mfn(2).catch(_ => caught++);
326 await mfn(1).catch(_ => caught++);
327 t.is(counter, 3);
328 t.is(caught, 3);
329}));
330function measureMaxRequestRatePerSecond(timings) {
331 const requestsPerSecondStartingAt = timings
332 .map(t => t.start)
333 .map(t => timings.filter(({ start }) => start >= t && start < t + 1000).length);
334 return Math.max(...requestsPerSecondStartingAt);
335}
336ava_1.default.serial("rate limiter restricts max request rate per second", t => (0, util_1.withClock)(async () => {
337 const requestRate = 10;
338 const rateLimiter = new throttle_1.RateLimiter(requestRate);
339 const promises = [];
340 for (let i = 0; i < 15; i++) {
341 promises.push(rateLimiter.push(() => (0, functions_1.timer)(0)));
342 }
343 const timings = await Promise.all(promises);
344 t.is(measureMaxRequestRatePerSecond(timings), requestRate);
345}));
346ava_1.default.serial("rate limiter works across second boundaries", t => (0, util_1.withClock)(async () => {
347 const requestRate = 10;
348 const rateLimiter = new throttle_1.RateLimiter(requestRate);
349 const promises = [];
350 promises.push(rateLimiter.push(() => (0, functions_1.timer)(0)));
351 await (0, util_1.sleep)(900);
352 for (let i = 0; i < 15; i++) {
353 promises.push(rateLimiter.push(() => (0, functions_1.timer)(0)));
354 }
355 const timings = await Promise.all(promises);
356 t.is(measureMaxRequestRatePerSecond(timings), requestRate);
357}));
358ava_1.default.serial("rate limiter bursting allows for request rate beyond target rate", t => (0, util_1.withClock)(async () => {
359 const requestRate = 10;
360 const maxBurst = 5;
361 const rateLimiter = new throttle_1.RateLimiter(requestRate, maxBurst);
362 const promises = [];
363 for (let i = 0; i < 15; i++) {
364 promises.push(rateLimiter.push(() => (0, functions_1.timer)(0)));
365 }
366 const timings = await Promise.all(promises);
367 const maxRate = measureMaxRequestRatePerSecond(timings);
368 t.true(maxRate <= maxBurst + requestRate);
369 t.true(maxRate > maxBurst);
370}));
371ava_1.default.serial("throttle limits max concurrency and rate", t => (0, util_1.withClock)(async () => {
372 const concurrency = 10;
373 const rate = 10;
374 const timerFn = (0, throttle_1.throttle)({ concurrency, rate }, functions_1.timer);
375 const promises = [];
376 for (let i = 0; i < 15; i++) {
377 promises.push(timerFn(1000));
378 }
379 const times = await Promise.all(promises);
380 t.is((0, util_1.measureConcurrency)(times), concurrency);
381 t.is(measureMaxRequestRatePerSecond(times), rate);
382}));
383ava_1.default.serial("throttle limits rate with single concurrency", t => (0, util_1.withClock)(async () => {
384 const concurrency = 1;
385 const rate = 10;
386 const processTimeMs = 200;
387 const timerFn = (0, throttle_1.throttle)({ concurrency, rate }, functions_1.timer);
388 const promises = [];
389 for (let i = 0; i < 10; i++) {
390 promises.push(timerFn(processTimeMs));
391 }
392 const times = await Promise.all(promises);
393 t.is((0, util_1.measureConcurrency)(times), concurrency);
394 t.true(measureMaxRequestRatePerSecond(times) <= 1000 / processTimeMs + 1);
395}));
396(0, ava_1.default)("throttle memoize option", async (t) => {
397 const concurrency = 1;
398 const rate = 100;
399 let counter = 0;
400 const N = 5;
401 async function fn(_) {
402 counter++;
403 }
404 const throttledFn = (0, throttle_1.throttle)({ concurrency, rate, memoize: true }, fn);
405 const promises = [];
406 for (let i = 0; i < N; i++) {
407 promises.push(throttledFn(i));
408 }
409 for (let i = 0; i < N; i++) {
410 promises.push(throttledFn(i));
411 }
412 await Promise.all(promises);
413 t.is(counter, N);
414});
415(0, ava_1.default)("throttle cache option persists values", async (t) => withCache(async (cache) => {
416 const concurrency = 1;
417 const rate = 100;
418 let counter = 0;
419 async function fn(_) {
420 return counter++;
421 }
422 const throttledFn = (0, throttle_1.throttle)({ concurrency, rate, cache }, fn);
423 const v = await throttledFn(10);
424 t.is(v, 0);
425 const throttledFn2 = (0, throttle_1.throttle)({ concurrency, rate, cache }, fn);
426 const u1 = await throttledFn2(10);
427 const u2 = await throttledFn2(20);
428 t.is(u1, 0);
429 t.is(u2, 1);
430 t.is(counter, 2);
431}));
432(0, ava_1.default)("throttle cache and memoize options work together", async (t) => withCache(async (cache) => {
433 const concurrency = 1;
434 const rate = 100;
435 let counter = 0;
436 async function fn(_) {
437 return counter++;
438 }
439 const throttledFn = (0, throttle_1.throttle)({ concurrency, rate, memoize: true, cache }, fn);
440 const v = await throttledFn(10);
441 const v2 = await throttledFn(10);
442 t.is(v, 0);
443 t.is(v2, 0);
444 const throttledFn2 = (0, throttle_1.throttle)({ concurrency, rate, memoize: true, cache }, fn);
445 const u1 = await throttledFn2(10);
446 const u2 = await throttledFn2(20);
447 const u3 = await throttledFn2(10);
448 t.is(u1, 0);
449 t.is(u2, 1);
450 t.is(u3, 0);
451 t.is(counter, 2);
452}));
453ava_1.default.serial("throttle cancellation", async (t) => (0, util_1.withClock)(async () => {
454 const concurrency = 10;
455 const rate = 100;
456 let counter = 0;
457 async function fn(_) {
458 return counter++;
459 }
460 const cancel = new throttle_1.Deferred();
461 const throttledFn = (0, throttle_1.throttle)({ concurrency, rate, memoize: true, cancel: cancel.promise }, fn);
462 throttledFn(1);
463 throttledFn(2);
464 throttledFn(3);
465 await (0, util_1.sleep)(100);
466 t.is(counter, 3);
467 counter = 0;
468 throttledFn(1);
469 throttledFn(2);
470 throttledFn(3);
471 cancel.resolve();
472 await (0, util_1.sleep)(100);
473 t.is(counter, 0);
474}));
475(0, ava_1.default)("AsyncQueue works with enqueue before dequeue", async (t) => {
476 const q = new throttle_1.AsyncQueue();
477 q.enqueue(42);
478 t.is(await q.next(), 42);
479});
480(0, ava_1.default)("AsyncQueue works with multiple enqueues before dequeue", async (t) => {
481 const q = new throttle_1.AsyncQueue();
482 q.enqueue(42);
483 q.enqueue(43);
484 t.is(await q.next(), 42);
485 t.is(await q.next(), 43);
486});
487(0, ava_1.default)("AsyncQueue works with dequeue before enqueue", async (t) => {
488 const q = new throttle_1.AsyncQueue();
489 const promise = q.next();
490 q.enqueue(42);
491 t.is(await promise, 42);
492});
493(0, ava_1.default)("AsyncQueue works with multiple dequeues before enqueue", async (t) => {
494 const q = new throttle_1.AsyncQueue();
495 const promises = [q.next(), q.next()];
496 q.enqueue(42);
497 q.enqueue(43);
498 t.deepEqual(await Promise.all(promises), [42, 43]);
499});
500(0, ava_1.default)("AsyncQueue transition from more enqueues to more dequeues", async (t) => {
501 const q = new throttle_1.AsyncQueue();
502 q.enqueue(42);
503 t.is(await q.next(), 42);
504 const promise = q.next();
505 q.enqueue(100);
506 t.is(await promise, 100);
507});
508(0, ava_1.default)("AsyncQueue transition from more dequeues to more enqueues", async (t) => {
509 const q = new throttle_1.AsyncQueue();
510 const promise = q.next();
511 q.enqueue(42);
512 q.enqueue(100);
513 t.is(await promise, 42);
514 t.is(await q.next(), 100);
515});
516(0, ava_1.default)("AsyncQueue handles async enqueueing", async (t) => {
517 const q = new throttle_1.AsyncQueue();
518 const promise = q.next();
519 setTimeout(() => q.enqueue(99), 100);
520 t.is(await promise, 99);
521});
522(0, ava_1.default)("AsyncQueue handles async dequeueing", async (t) => {
523 t.plan(1);
524 const q = new throttle_1.AsyncQueue();
525 q.enqueue(88);
526 await new Promise(resolve => setTimeout(async () => {
527 t.is(await q.next(), 88);
528 resolve();
529 }, 100));
530});
531(0, ava_1.default)("AsyncQueue clear", async (t) => {
532 const q = new throttle_1.AsyncQueue();
533 q.enqueue(1);
534 q.clear();
535 q.enqueue(2);
536 t.is(await q.next(), 2);
537 const p1 = q.next();
538 q.clear();
539 const p2 = q.next();
540 q.enqueue(3);
541 t.is(await p2, 3);
542});
543async function toArray(iterable) {
544 const result = [];
545 for await (const value of iterable) {
546 result.push(value);
547 }
548 return result;
549}
550async function take(q, n) {
551 const result = [];
552 for (let i = 0; i < n; i++) {
553 result.push(await q.next());
554 }
555 return result;
556}
557(0, ava_1.default)("AsyncIterableQueue done function finishes iterator", async (t) => {
558 const q = new throttle_1.AsyncIterableQueue();
559 q.push(10);
560 q.done();
561 t.deepEqual(await toArray(q), [10]);
562 // test times out if the done function doesn't work.
563});
564(0, ava_1.default)("AsyncIterableQueue done function finishes iterator with pending dequeus", async (t) => {
565 const q = new throttle_1.AsyncIterableQueue();
566 const value = q.next();
567 q.done();
568 t.is((await value).done, true);
569});
570(0, ava_1.default)("AsyncOrderedQueue reorders according to sequence value", async (t) => {
571 const q = new throttle_1.AsyncOrderedQueue();
572 q.push(42, 1);
573 q.push(-42, 0);
574 t.deepEqual(await take(q, 2), [-42, 42]);
575});
576(0, ava_1.default)("AsyncOrderedQueue takes the first value with a given sequence value", async (t) => {
577 const q = new throttle_1.AsyncOrderedQueue();
578 q.push(100, 1);
579 q.push(101, 1);
580 q.push(42, 0);
581 t.deepEqual(await take(q, 2), [42, 100]);
582});
583(0, ava_1.default)("AsyncOrderedQueue pushImmediate pre-empts arrival order", async (t) => {
584 const q = new throttle_1.AsyncOrderedQueue();
585 q.push(42, 0);
586 q.push(44, 2);
587 q.pushImmediate(100);
588 q.push(43, 1);
589 t.is(await q.next(), 42);
590 t.is(await q.next(), 100);
591 t.is(await q.next(), 43);
592 t.is(await q.next(), 44);
593});
594//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5pdC10aHJvdHRsZS50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdGVzdC91bml0LXRocm90dGxlLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSw2QkFBdUI7QUFDdkIsK0JBQW9DO0FBQ3BDLHdDQUErQztBQUMvQyw4Q0FXeUI7QUFDekIsb0RBQXFEO0FBQ3JELDBDQUF1RTtBQUV2RSxJQUFBLGFBQUksRUFBQywrQkFBK0IsRUFBRSxLQUFLLEVBQUMsQ0FBQyxFQUFDLEVBQUU7SUFDNUMsTUFBTSxRQUFRLEdBQUcsSUFBSSxtQkFBUSxFQUFFLENBQUM7SUFDaEMsSUFBSSxRQUFRLEdBQUcsS0FBSyxDQUFDO0lBQ3JCLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUM5QyxDQUFDLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN0QixRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDbkIsTUFBTSxRQUFRLENBQUMsT0FBTyxDQUFDO0lBQ3ZCLENBQUMsQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3pCLENBQUMsQ0FBQyxDQUFDO0FBRUgsSUFBQSxhQUFJLEVBQUMsOEJBQThCLEVBQUUsS0FBSyxFQUFDLENBQUMsRUFBQyxFQUFFO0lBQzNDLE1BQU0sUUFBUSxHQUFHLElBQUksbUJBQVEsRUFBRSxDQUFDO0lBQ2hDLElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQztJQUNyQixDQUFDLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN0QixRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDbEIsSUFBSTtRQUNBLE1BQU0sUUFBUSxDQUFDLE9BQU8sQ0FBQztLQUMxQjtJQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQ1Is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WyJpbXBvcnQgdGVzdCBmcm9tIFwiYXZhXCI7XG5pbXBvcnQgeyB2NCBhcyB1dWlkdjQgfSBmcm9tIFwidXVpZFwiO1xuaW1wb3J0IHsgUGVyc2lzdGVudENhY2hlIH0gZnJvbSBcIi4uL3NyYy9jYWNoZVwiO1xuaW1wb3J0IHtcbiAgICBBc3luY09yZGVyZWRRdWV1ZSxcbiAgICBBc3luY1F1ZXVlLFxuICAgIGNhY2hlRm4sXG4gICAgRGVmZXJyZWQsXG4gICAgRnVubmVsLFxuICAgIFB1bXAsXG4gICAgUmF0ZUxpbWl0ZXIsXG4gICAgcmV0cnlPcCxcbiAgICB0aHJvdHRsZSxcbiAgICBBc3luY0l0ZXJhYmxlUXVldWVcbn0gZnJvbSBcIi4uL3NyYy90aHJvdHRsZVwiO1xuaW1wb3J0IHsgdGltZXIsIFRpbWluZyB9IGZyb20gXCIuL2ZpeHR1cmVzL2Z1bmN0aW9uc1wiO1xuaW1wb3J0IHsgbWVhc3VyZUNvbmN1cnJlbmN5LCBzbGVlcCwgd2l0aENsb2NrIH0gZnJvbSBcIi4vZml4dHVyZXMvdXRpbFwiO1xuXG50ZXN0KFwiZGVmZXJyZWQgcmVzb2x2ZXMgaXRzIHByb21pc2VcIiwgYXN5bmMgdCA9PiB7XG4gICAgY29uc3QgZGVmZXJyZWQgPSBuZXcgRGVmZXJyZWQoKTtcbiAgICBsZXQgcmVzb2x2ZWQgPSBmYWxzZTtcbiAgICBkZWZlcnJlZC5wcm9taXNlLnRoZW4oXyA9PiAocmVzb2x2ZWQgPSB0cnVlKSk7XG4gICAgdC5pcyhyZXNvbHZlZCwgZmFsc2UpO1xuICAgIGRlZmVycmVkLnJlc29sdmUoKTtcbiAgICBhd2FpdCBkZWZlcnJlZC5wcm9taXNlO1xuICAgIHQuaXMocmVzb2x2ZWQsIHRydWUpO1xufSk7XG5cbnRlc3QoXCJkZWZlcnJlZCByZWplY3RzIGl0cyBwcm9taXNlXCIsIGFzeW5jIHQgPT4ge1xuICAgIGNvbnN0IGRlZmVycmVkID0gbmV3IERlZmVycmVkKCk7XG4gICAgbGV0IHJlamVjdGVkID0gZmFsc2U7XG4gICAgdC5pcyhyZWplY3RlZCwgZmFsc2UpO1xuICAgIGRlZmVycmVkLnJlamVjdCgpO1xuICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGRlZmVycmVkLnByb21pc2U7XG4gICAgfSBjYXRjaCAoXykge1xuICAgICAgICByZWplY3RlZCA9IHRydWU7XG4gICAgfVxuICAgIHQuaXMocmVqZWN0ZWQsIHRydWUpO1xufSk7XG5cbnRlc3QoXCJkZWZlcnJlZCByZXNvbHZlcyBvbmx5IG9uY2VcIiwgYXN5bmMgdCA9PiB7XG4gICAgY29uc3QgZGVmZXJyZWQgPSBuZXcgRGVmZXJyZWQoKTtcbiAgICBsZXQgdmFsdWUgPSAwO1xuICAgIGRlZmVycmVkLnByb21pc2UudGhlbihfID0+IHZhbHVlKyspO1xuXG4gICAgZGVmZXJyZWQucmVzb2x2ZSgpO1xuICAgIGF3YWl0IGRlZmVycmVkLnByb21pc2U7XG4gICAgdC5pcyh2YWx1ZSwgMSk7XG5cbiAgICBkZWZlcnJlZC5yZXNvbHZlKCk7XG4gICAgYXdhaXQgZGVmZXJyZWQucHJvbWlzZTtcbiAgICB0LmlzKHZhbHVlLCAxKTtcbn0pO1xuXG50ZXN0KFwiZGVmZXJyZWQgY2Fubm90IHJlamVjdCBhZnRlciByZXNvbHZpbmdcIiwgYXN5bmMgdCA9PiB7XG4gICAgY29uc3QgZGVmZXJyZWQgPSBuZXcgRGVmZXJyZWQoKTtcbiAgICBsZXQgdmFsdWUgPSAwO1xuICAgIGRlZmVycmVkLnByb21pc2UudGhlbihfID0+IHZhbHVlKyspO1xuXG4gICAgZGVmZXJyZWQucmVzb2x2ZSgpO1xuICAgIGF3YWl0IGRlZmVycmVkLnByb21pc2U7XG4gICAgdC5pcyh2YWx1ZSwgMSk7XG5cbiAgICBkZWZlcnJlZC5yZWplY3QoKTtcbiAgICBhd2FpdCBkZWZlcnJlZC5wcm9taXNlO1xuICAgIHQuaXModmFsdWUsIDEpO1xufSk7XG5cbnRlc3Quc2VyaWFsKFwiZnVubmVsIGRlZmF1bHRzIHRvIGluZmluaXRlIGNvbmN1cnJlbmN5ICh0ZXN0ZWQgd2l0aCAyMDApXCIsIHQgPT5cbiAgICB3aXRoQ2xvY2soYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBmdW5uZWwgPSBuZXcgRnVubmVsPFRpbWluZz4oMCk7XG4gICAgICAgIGNvbnN0IHByb21pc2VzID0gW107XG4gICAgICAgIGNvbnN0IE4gPSAyMDA7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTjsgaSsrKSB7XG4gICAgICAgICAgICBwcm9taXNlcy5wdXNoKGZ1bm5lbC5wdXNoKCgpID0+IHRpbWVyKDMwMCkpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0aW1lcyA9IGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICAgICAgdC5pcyhtZWFzdXJlQ29uY3VycmVuY3kodGltZXMpLCBOKTtcbiAgICB9KVxuKTtcblxudGVzdC5zZXJpYWwoXCJmdW5uZWwgc2luZ2xlIGNvbmN1cnJlbmN5IGlzIG11dHVhbGx5IGV4Y2x1c2l2ZVwiLCB0ID0+XG4gICAgd2l0aENsb2NrKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgZnVubmVsID0gbmV3IEZ1bm5lbDxUaW1pbmc+KDEpO1xuICAgICAgICBjb25zdCBwcm9taXNlcyA9IFtdO1xuICAgICAgICBjb25zdCBOID0gMTA7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTjsgaSsrKSB7XG4gICAgICAgICAgICBwcm9taXNlcy5wdXNoKGZ1bm5lbC5wdXNoKCgpID0+IHRpbWVyKDEwKSkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRpbWVzID0gYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgICAgICB0LmlzKG1lYXN1cmVDb25jdXJyZW5jeSh0aW1lcyksIDEpO1xuICAgIH0pXG4pO1xuXG50ZXN0LnNlcmlhbChcImZ1bm5lbCBoYW5kbGVzIGNvbmN1cnJlbmN5IGxldmVsIDJcIiwgdCA9PlxuICAgIHdpdGhDbG9jayhhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGZ1bm5lbCA9IG5ldyBGdW5uZWw8VGltaW5nPigyKTtcbiAgICAgICAgY29uc3QgcHJvbWlzZXMgPSBbXTtcbiAgICAgICAgY29uc3QgTiA9IDEwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IE47IGkrKykge1xuICAgICAgICAgICAgcHJvbWlzZXMucHVzaChmdW5uZWwucHVzaCgoKSA9PiB0aW1lcigyMCkpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0aW1lcyA9IGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICAgICAgdC5pcyhtZWFzdXJlQ29uY3VycmVuY3kodGltZXMpLCAyKTtcbiAgICB9KVxuKTtcblxudGVzdC5zZXJpYWwoXCJmdW5uZWwgaGFuZGxlcyBjb25jdXJyZW5jeSBsZXZlbCAxMFwiLCB0ID0+XG4gICAgd2l0aENsb2NrKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgZnVubmVsID0gbmV3IEZ1bm5lbDxUaW1pbmc+KDEwKTtcbiAgICAgICAgY29uc3QgcHJvbWlzZXMgPSBbXTtcbiAgICAgICAgY29uc3QgTiA9IDEwMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBOOyBpKyspIHtcbiAgICAgICAgICAgIHByb21pc2VzLnB1c2goZnVubmVsLnB1c2goKCkgPT4gdGltZXIoMjApKSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGltZXMgPSBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgICAgIHQuaXMobWVhc3VyZUNvbmN1cnJlbmN5KHRpbWVzKSwgMTApO1xuICAgIH0pXG4pO1xuXG50ZXN0LnNlcmlhbChcImZ1bm5lbCByZXN1bWVzIGFmdGVyIGZpbmlzaGluZyBhIHdvcmtlclwiLCB0ID0+XG4gICAgd2l0aENsb2NrKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgZnVubmVsID0gbmV3IEZ1bm5lbDxUaW1pbmc+KDEpO1xuICAgICAgICBjb25zdCB0aW1lMSA9IGF3YWl0IGZ1bm5lbC5wdXNoKCgpID0+IHRpbWVyKDEwKSk7XG4gICAgICAgIGNvbnN0IHRpbWUyID0gYXdhaXQgZnVubmVsLnB1c2goKCkgPT4gdGltZXIoMTApKTtcbiAgICAgICAgdC5pcyhtZWFzdXJlQ29uY3VycmVuY3koW3RpbWUxLCB0aW1lMl0pLCAxKTtcbiAgICB9KVxuKTtcblxudGVzdChcImZ1bm5lbCBjbGVhcmluZ1wiLCBhc3luYyB0ID0+IHtcbiAgICBjb25zdCBmdW5uZWwgPSBuZXcgRnVubmVsPG51bWJlcj4oMSk7XG4gICAgbGV0IGNvdW50ID0gMDtcbiAgICBjb25zdCBwcm9taXNlMCA9IGZ1bm5lbC5wdXNoKGFzeW5jICgpID0+IGNvdW50KyspO1xuICAgIGNvbnN0IHByb21pc2UxID0gZnVubmVsLnB1c2goYXN5bmMgKCkgPT4gY291bnQrKyk7XG4gICAgY29uc3QgcHJvbWlzZTIgPSBmdW5uZWwucHVzaChhc3luYyAoKSA9PiBjb3VudCsrKTtcbiAgICBmdW5uZWwuY2xlYXIoKTtcbiAgICB0LmlzKFxuICAgICAgICBhd2FpdCBQcm9taXNlLnJhY2UoW3Byb21pc2UwLCBwcm9taXNlMSwgcHJvbWlzZTIsIHNsZWVwKDEwMCkudGhlbihfID0+IFwiZG9uZVwiKV0pLFxuICAgICAgICBcImRvbmVcIlxuICAgICk7XG4gICAgdC5pcyhjb3VudCwgMCk7XG59KTtcbnRlc3QoXCJmdW5uZWwgZ2V0cyBleGVjdXRlZCBhc3luY2hyb25vdXNseSwgbm90IGF0IHRoZSBtb21lbnQgb2YgcHVzaFwiLCBhc3luYyB0ID0+IHtcbiAgICBjb25zdCBmdW5uZWwgPSBuZXcgRnVubmVsKDEpO1xuICAgIGxldCBuID0gMDtcbiAgICBmdW5uZWwucHVzaChhc3luYyAoKSA9PiB7XG4gICAgICAgIG4rKztcbiAgICB9KTtcbiAgICB0LmlzKG4sIDApO1xuICAgIGF3YWl0IGZ1bm5lbC5hbGwoKTtcbiAgICB0LmlzKG4sIDEpO1xufSk7XG50ZXN0KFwiZnVubmVsIGhhbmRsZXMgcHJvbWlzZSByZWplY3Rpb25zIHdpdGhvdXQgbG9zaW5nIGNvbmN1cnJlbmN5XCIsIGFzeW5jIHQgPT4ge1xuICAgIGNvbnN0IGZ1bm5lbCA9IG5ldyBGdW5uZWw8dm9pZD4oMSk7XG4gICAgbGV0IGV4ZWN1dGVkID0gZmFsc2U7XG4gICAgYXdhaXQgdC50aHJvd3NBc3luYyhcbiAgICAgICAgZnVubmVsLnB1c2goKCkgPT4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwibWVzc2FnZVwiKSkpLFxuICAgICAgICB7IG1lc3NhZ2U6IFwibWVzc2FnZVwiIH1cbiAgICApO1xuICAgIGF3YWl0IGZ1bm5lbC5wdXNoKGFzeW5jICgpID0+IHtcbiAgICAgICAgZXhlY3V0ZWQgPSB0cnVlO1xuICAgIH0pO1xuICAgIHQuaXMoZXhlY3V0ZWQsIHRydWUpO1xufSk7XG50ZXN0KFwiZnVubmVsLmFsbCgpIHdhaXRzIGZvciBhbGwgcmVxdWVzdHMgdG8gZmluaXNoXCIsIGFzeW5jIHQgPT4ge1xuICAgIGNvbnN0IGZ1bm5lbCA9IG5ldyBGdW5uZWw8c3RyaW5nPigxKTtcbiAgICBsZXQgZXhlY3V0ZWQgPSBmYWxzZTtcbiAgICBmdW5uZWwucHVzaChhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IHNsZWVwKDIwMCk7XG4gICAgICAgIGV4ZWN1dGVkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIFwiZmlyc3RcIjtcbiAgICB9KTtcbiAgICBmdW5uZWwucHVzaChhc3luYyAoKSA9PiBcInNlY29uZFwiKTtcbiAgICB0LmlzKGV4ZWN1dGVkLCBmYWxzZSk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZnVubmVsLmFsbCgpO1xuICAgIHQuaXMocmVzdWx0Lmxlbmd0aCwgMik7XG4gICAgdC5pcyhyZXN1bHRbMF0sIFwiZmlyc3RcIik7XG4gICAgdC5pcyhyZXN1bHRbMV0sIFwic2Vjb25kXCIpO1xuICAgIHQuaXMoZXhlY3V0ZWQsIHRydWUpO1xufSk7XG50ZXN0KFwiZnVubmVsLmFsbCgpIGlnbm9yZXMgZXJyb3JzIGFuZCB3YWl0cyBmb3Igb3RoZXIgcmVxdWVzdHMgdG8gZmluaXNoXCIsIGFzeW5jIHQgPT4ge1xuICAgIGNvbnN0IGZ1bm5lbCA9IG5ldyBGdW5uZWw8c3RyaW5nPigxKTtcbiAgICBmdW5uZWwucHVzaChhc3luYyAoKSA9PiB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigpO1xuICAgIH0pO1xuICAgIGZ1bm5lbC5wdXNoKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgc2xlZXAoMTAwKTtcbiAgICAgICAgcmV0dXJuIFwiZG9uZVwiO1xuICAgIH0pO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZ1bm5lbC5hbGwoKTtcbiAgICB0LmlzKHJlc3VsdC5sZW5ndGgsIDIpO1xuICAgIHQuZmFsc3kocmVzdWx0WzBdKTtcbiAgICB0LmlzKHJlc3VsdFsxXSwgXCJkb25lXCIpO1xufSk7XG5cbnRlc3QoXCJyZXRyeU9wKCkgcmV0cmllcyBmYWlsdXJlc1wiLCBhc3luYyB0ID0+IHtcbiAgICBsZXQgYXR0ZW1wdHMgPSAwO1xuICAgIGF3YWl0IHJldHJ5T3AoMiwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBhdHRlbXB0cysrO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKTtcbiAgICB9KS5jYXRjaChfID0+IHt9KTtcbiAgICB0LmlzKGF0dGVtcHRzLCAzKTtcbn0pO1xuXG50ZXN0KFwiZnVubmVsIHNob3VsZFJldHJ5IHBhcmFtZXRlciByZXRyaWVzIGZhaWx1cmVzXCIsIGFzeW5jIHQgPT4ge1xuICAgIGNvbnN0IGZ1bm5lbCA9IG5ldyBGdW5uZWw8c3RyaW5nPigxLCAyKTtcbiAgICBsZXQgYXR0ZW1wdHMgPSAwO1xuICAgIGxldCBlcnJvcnMgPSAwO1xuICAgIGZ1bm5lbFxuICAgICAgICAucHVzaChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBhdHRlbXB0cysrO1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKF8gPT4gZXJyb3JzKyspO1xuICAgIGF3YWl0IGZ1bm5lbC5hbGwoKTtcbiAgICB0LmlzKGF0dGVtcHRzLCAzKTtcbiAgICB0LmlzKGVycm9ycywgMSk7XG59KTtcblxudGVzdChcImZ1bm5lbCBjYW5jZWxsYXRpb25cIiwgYXN5bmMgdCA9PiB7XG4gICAgY29uc3QgZnVubmVsID0gbmV3IEZ1bm5lbCgxKTtcbiAgICBsZXQgZXhlY3V0ZWQgPSAwO1xuXG4gICAgY29uc3QgcHJvbWlzZSA9IGZ1bm5lbC5wdXNoKFxuICAgICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBleGVjdXRlZCsrO1xuICAgICAgICB9LFxuICAgICAgICAwLFxuICAgICAgICAoKSA9PiBcImNhbmNlbGxlZFwiXG4gICAgKTtcbiAgICBhd2FpdCB0LnRocm93c0FzeW5jKHByb21pc2UpO1xuICAgIHQuaXMoZXhlY3V0ZWQsIDApO1xufSk7XG5cbnRlc3QoXCJmdW5uZWwgcHJvY2Vzc2VkIGFuZCBlcnJvciBjb3VudHNcIiwgYXN5bmMgdCA9PiB7XG4gICAgY29uc3QgZnVubmVsID0gbmV3IEZ1bm5lbCgyKTtcbiAgICBmdW5uZWwucHVzaChhc3luYyAoKSA9PiB7fSk7XG4gICAgZnVubmVsLnB1c2goYXN5bmMgKCkgPT4gUHJvbWlzZS5yZWplY3QoKSk7XG4gICAgZnVubmVsLnB1c2goYXN5bmMgKCkgPT4ge30pO1xuICAgIGZ1bm5lbC5wdXNoKGFzeW5jICgpID0+IFByb21pc2UucmVqZWN0KCkpO1xuICAgIGZ1bm5lbC5wdXNoKGFzeW5jICgpID0+IHt9KTtcblxuICAgIGF3YWl0IGZ1bm5lbC5hbGwoKTtcbiAgICB0LmlzKGZ1bm5lbC5wcm9jZXNzZWQsIDMpO1xuICAgIHQuaXMoZnVubmVsLmVycm9ycywgMik7XG59KTtcblxudGVzdC5zZXJpYWwoXCJwdW1wIHdvcmtzIGZvciBjb25jdXJyZW5jeSBsZXZlbCAxXCIsIHQgPT5cbiAgICB3aXRoQ2xvY2soYXN5bmMgKCkgPT4ge1xuICAgICAgICBsZXQgZXhlY3V0ZWQgPSAwO1xuICAgICAgICBjb25zdCBwdW1wID0gbmV3IFB1bXAoeyBjb25jdXJyZW5jeTogMSB9LCAoKSA9PiB7XG4gICAgICAgICAgICBleGVjdXRlZCsrO1xuICAgICAgICAgICAgcmV0dXJuIHNsZWVwKDEwMCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0LmlzKGV4ZWN1dGVkLCAwKTtcbiAgICAgICAgcHVtcC5zdGFydCgpO1xuICAgICAgICBhd2FpdCBzbGVlcCgzMDApO1xuICAgICAgICBwdW1wLnN0b3AoKTtcbiAgICAgICAgdC50cnVlKGV4ZWN1dGVkID09PSAzKTtcbiAgICB9KVxuKTtcblxudGVzdC5zZXJpYWwoXCJwdW1wIHdvcmtzIGZvciBjb25jdXJyZW5jeSBsZXZlbCAxMFwiLCB0ID0+XG4gICAgd2l0aENsb2NrKGFzeW5jICgpID0+IHtcbiAgICAgICAgbGV0IGV4ZWN1dGVkID0gMDtcbiAgICAgICAgY29uc3QgcHVtcCA9IG5ldyBQdW1wKHsgY29uY3VycmVuY3k6IDEwIH0sICgpID0+IHtcbiAgICAgICAgICAgIGV4ZWN1dGVkKys7XG4gICAgICAgICAgICByZXR1cm4gc2xlZXAoMTAwKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHB1bXAuc3RhcnQoKTtcbiAgICAgICAgYXdhaXQgc2xlZXAoMTAwKTtcbiAgICAgICAgcHVtcC5zdG9wKCk7XG4gICAgICAgIHQuaXMoZXhlY3V0ZWQsIDEwKTtcbiAgICB9KVxuKTtcblxudGVzdC5zZXJpYWwoXCJwdW1wIGhhbmRsZXMgcHJvbWlzZSByZWplY3Rpb25zIHdpdGhvdXQgbG9zaW5nIGNvbmN1cnJlbmN5XCIsIHQgPT5cbiAgICB3aXRoQ2xvY2soYXN5bmMgKCkgPT4ge1xuICAgICAgICBsZXQgZXhlY3V0ZWQgPSAwO1xuICAgICAgICBjb25zdCBwdW1wID0gbmV3IFB1bXAoeyBjb25jdXJyZW5jeTogMSwgdmVyYm9zZTogZmFsc2UgfSwgKCkgPT4ge1xuICAgICAgICAgICAgZXhlY3V0ZWQrKztcbiAgICAgICAgICAgIHJldHVybiBzbGVlcCgxMDApLnRoZW4oXyA9PiBQcm9taXNlLnJlamVjdChcImhpXCIpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHB1bXAuc3RhcnQoKTtcbiAgICAgICAgYXdhaXQgc2xlZXAoNTAwKTtcbiAgICAgICAgcHVtcC5zdG9wKCk7XG4gICAgICAgIHQuaXMoZXhlY3V0ZWQsIDUpO1xuICAgIH0pXG4pO1xuXG50ZXN0LnNlcmlhbChcInB1bXAgZHJhaW5cIiwgdCA9PlxuICAgIHdpdGhDbG9jayhhc3luYyAoKSA9PiB7XG4gICAgICAgIGxldCBzdGFydGVkID0gMDtcbiAgICAgICAgbGV0IGZpbmlzaGVkID0gMDtcbiAgICAgICAgY29uc3QgTiA9IDU7XG5cbiAgICAgICAgY29uc3QgcHVtcCA9IG5ldyBQdW1wKHsgY29uY3VycmVuY3k6IE4gfSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgc3RhcnRlZCsrO1xuICAgICAgICAgICAgYXdhaXQgc2xlZXAoMTAwKTtcbiAgICAgICAgICAgIGZpbmlzaGVkKys7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHQuaXMoc3RhcnRlZCwgMCk7XG4gICAgICAgIHQuaXMoZmluaXNoZWQsIDApO1xuXG4gICAgICAgIHB1bXAuc3RhcnQoKTtcbiAgICAgICAgYXdhaXQgcHVtcC5kcmFpbigpO1xuICAgICAgICB0LmlzKHN0YXJ0ZWQsIE4pO1xuICAgICAgICB0LmlzKGZpbmlzaGVkLCBOKTtcbiAgICB9KVxuKTtcblxudGVzdC5zZXJpYWwoXCJtZW1vaXplIHJldHVybnMgY2FjaGVkIHJlc3VsdHMgZm9yIHRoZSBzYW1lIGtleVwiLCB0ID0+XG4gICAgd2l0aENsb2NrKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcHJvbWlzZXMgPSBbXTtcbiAgICAgICAgY29uc3QgTiA9IDEwO1xuICAgICAgICBjb25zdCB0aW1lckZuID0gdGhyb3R0bGUoeyBtZW1vaXplOiB0cnVlLCBjb25jdXJyZW5jeTogMSwgcmF0ZTogMTAgfSwgXyA9PlxuICAgICAgICAgICAgdGltZXIoMTApXG4gICAgICAgICk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTjsgaSsrKSB7XG4gICAgICAgICAgICBwcm9taXNlcy5wdXNoKHRpbWVyRm4oXCJrZXlcIikpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRpbWVzID0gYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgICAgICB0LmlzKG1lYXN1cmVDb25jdXJyZW5jeSh0aW1lcyksIE4pO1xuICAgIH0pXG4pO1xuXG50ZXN0LnNlcmlhbChcIm1lbW9pemUgcnVucyB0aGUgd29ya2VyIGZvciBkaWZmZXJlbnQga2V5c1wiLCB0ID0+XG4gICAgd2l0aENsb2NrKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcHJvbWlzZXMgPSBbXTtcbiAgICAgICAgY29uc3QgTiA9IDEwO1xuICAgICAgICBjb25zdCB0aW1lckZuID0gdGhyb3R0bGUoeyBtZW1vaXplOiB0cnVlLCBjb25jdXJyZW5jeTogMSwgcmF0ZTogMTAgfSwgXyA9PlxuICAgICAgICAgICAgdGltZXIoMTApXG4gICAgICAgICk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTjsgaSsrKSB7XG4gICAgICAgICAgICBwcm9taXNlcy5wdXNoKHRpbWVyRm4oaSkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRpbWVzID0gYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgICAgICB0LmlzKG1lYXN1cmVDb25jdXJyZW5jeSh0aW1lcyksIDEpO1xuICAgIH0pXG4pO1xuXG5hc3luYyBmdW5jdGlvbiB3aXRoQ2FjaGUoZm46IChjYWNoZTogUGVyc2lzdGVudENhY2hlKSA9PiBQcm9taXNlPHZvaWQ+KSB7XG4gICAgY29uc3Qgbm9uY2UgPSB1dWlkdjQoKTtcbiAgICBjb25zdCBjYWNoZSA9IG5ldyBQZXJzaXN0ZW50Q2FjaGUoYC5mYWFzdC90ZXN0LyR7bm9uY2V9YCk7XG4gICAgYXdhaXQgZm4oY2FjaGUpLmNhdGNoKGNvbnNvbGUuZXJyb3IpO1xuICAgIGF3YWl0IGNhY2hlLmNsZWFyKHsgbGVhdmVFbXB0eURpcjogZmFsc2UgfSk7XG59XG5cbnRlc3QoXCJjYWNoaW5nIHNhdmVzIHZhbHVlcyBhbmQgc2tpcHMgcmUtZXhlY3V0aW9uXCIsIHQgPT5cbiAgICB3aXRoQ2FjaGUoYXN5bmMgY2FjaGUgPT4ge1xuICAgICAgICBsZXQgY291bnRlciA9IDA7XG4gICAgICAgIGZ1bmN0aW9uIGZuKF86IG51bWJlcikge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShjb3VudGVyKyspO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1mbiA9IGNhY2hlRm4oY2FjaGUsIGZuKTtcbiAgICAgICAgYXdhaXQgbWZuKDApO1xuICAgICAgICBhd2FpdCBtZm4oNyk7XG4gICAgICAgIGF3YWl0IG1mbigwKTtcbiAgICAgICAgdC5pcyhjb3VudGVyLCAyKTtcblxuICAgICAgICBjb25zdCBtZm4yID0gY2FjaGVGbihjYWNoZSwgZm4pO1xuICAgICAgICBhd2FpdCBtZm4yKDApO1xuICAgICAgICBhd2FpdCBtZm4yKDcpO1xuICAgICAgICBhd2FpdCBtZm4yKDApO1xuICAgICAgICBhd2FpdCBtZm4yKDEwKTtcbiAgICAgICAgdC5pcyhjb3VudGVyLCAzKTtcbiAgICB9KSk7XG5cbnRlc3QoXCJjYWNoZSB3b3JrcyB3aXRoIHN0cmluZyBhcmd1bWVudHNcIiwgYXN5bmMgdCA9PlxuICAgIHdpdGhDYWNoZShhc3luYyBjYWNoZSA9PiB7XG4gICAgICAgIGxldCBjb3VudGVyID0gMDtcbiAgICAgICAgZnVuY3Rpb24gZm4oXzogc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGNvdW50ZXIrKyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbWZuID0gY2FjaGVGbihjYWNoZSwgZm4pO1xuICAgICAgICBhd2FpdCBtZm4oXCJhXCIpO1xuICAgICAgICBhd2FpdCBtZm4oXCJiXCIpO1xuICAgICAgICBhd2FpdCBtZm4oXCJhXCIpO1xuICAgICAgICB0LmlzKGNvdW50ZXIsIDIpO1xuICAgIH0pKTtcblxudGVzdChcImNhY2hlIHdvcmtzIHdpdGggb2JqZWN0IGFyZ3VtZW50c1wiLCBhc3luYyB0ID0+XG4gICAgd2l0aENhY2hlKGFzeW5jIGNhY2hlID0+IHtcbiAgICAgICAgbGV0IGNvdW50ZXIgPSAwO1xuICAgICAgICBmdW5jdGlvbiBmbihfOiB7IGY6IHN0cmluZzsgaTogbnVtYmVyIH0pIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoY291bnRlcisrKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtZm4gPSBjYWNoZUZuKGNhY2hlLCBmbik7XG4gICAgICAgIGF3YWl0IG1mbih7IGY6IFwiZmllbGRcIiwgaTogNDIgfSk7XG4gICAgICAgIGF3YWl0IG1mbih7IGY6IFwiZmllbGRcIiwgaTogMSB9KTtcbiAgICAgICAgYXdhaXQgbWZuKHsgZjogXCJvdGhlclwiLCBpOiA0MiB9KTtcbiAgICAgICAgYXdhaXQgbWZuKHsgZjogXCJmaWVsZFwiLCBpOiA0MiB9KTtcbiAgICAgICAgdC5pcyhjb3VudGVyLCAzKTtcbiAgICB9KSk7XG5cbnRlc3QoXCJjYWNoZSBkb2VzIG5vdCBzYXZlIHJlamVjdGVkIHByb21pc2VzIGZyb20gY2FjaGVkIGZ1bmN0aW9uXCIsIGFzeW5jIHQgPT5cbiAgICB3aXRoQ2FjaGUoYXN5bmMgY2FjaGUgPT4ge1xuICAgICAgICBsZXQgY291bnRlciA9IDA7XG4gICAgICAgIGZ1bmN0aW9uIGZuKF86IG51bWJlcikge1xuICAgICAgICAgICAgY291bnRlcisrO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcInJlamVjdGlvblwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGNhdWdodCA9IDA7XG4gICAgICAgIGNvbnN0IG1mbiA9IGNhY2hlRm4oY2FjaGUsIGZuKTtcbiAgICAgICAgYXdhaXQgbWZuKDEpLmNhdGNoKF8gPT4gY2F1Z2h0KyspO1xuICAgICAgICBhd2FpdCBtZm4oMikuY2F0Y2goXyA9PiBjYXVnaHQrKyk7XG4gICAgICAgIGF3YWl0IG1mbigxKS5jYXRjaChfID0+IGNhdWdodCsrKTtcbiAgICAgICAgdC5pcyhjb3VudGVyLCAzKTtcbiAgICAgICAgdC5pcyhjYXVnaHQsIDMpO1xuICAgIH0pKTtcblxuZnVuY3Rpb24gbWVhc3VyZU1heFJlcXVlc3RSYXRlUGVyU2Vjb25kKHRpbWluZ3M6IFRpbWluZ1tdKSB7XG4gICAgY29uc3QgcmVxdWVzdHNQZXJTZWNvbmRTdGFydGluZ0F0ID0gdGltaW5nc1xuICAgICAgICAubWFwKHQgPT4gdC5zdGFydClcbiAgICAgICAgLm1hcCh0ID0+IHRpbWluZ3MuZmlsdGVyKCh7IHN0YXJ0IH0pID0+IHN0YXJ0ID49IHQgJiYgc3RhcnQgPCB0ICsgMTAwMCkubGVuZ3RoKTtcbiAgICByZXR1cm4gTWF0aC5tYXgoLi4ucmVxdWVzdHNQZXJTZWNvbmRTdGFydGluZ0F0KTtcbn1cblxudGVzdC5zZXJpYWwoXCJyYXRlIGxpbWl0ZXIgcmVzdHJpY3RzIG1heCByZXF1ZXN0IHJhdGUgcGVyIHNlY29uZFwiLCB0ID0+XG4gICAgd2l0aENsb2NrKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVxdWVzdFJhdGUgPSAxMDtcbiAgICAgICAgY29uc3QgcmF0ZUxpbWl0ZXIgPSBuZXcgUmF0ZUxpbWl0ZXI8VGltaW5nPihyZXF1ZXN0UmF0ZSk7XG4gICAgICAgIGNvbnN0IHByb21pc2VzOiBQcm9taXNlPFRpbWluZz5bXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDE1OyBpKyspIHtcbiAgICAgICAgICAgIHByb21pc2VzLnB1c2gocmF0ZUxpbWl0ZXIucHVzaCgoKSA9PiB0aW1lcigwKSkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRpbWluZ3MgPSBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgICAgIHQuaXMobWVhc3VyZU1heFJlcXVlc3RSYXRlUGVyU2Vjb25kKHRpbWluZ3MpLCByZXF1ZXN0UmF0ZSk7XG4gICAgfSlcbik7XG5cbnRlc3Quc2VyaWFsKFwicmF0ZSBsaW1pdGVyIHdvcmtzIGFjcm9zcyBzZWNvbmQgYm91bmRhcmllc1wiLCB0ID0+XG4gICAgd2l0aENsb2NrKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVxdWVzdFJhdGUgPSAxMDtcbiAgICAgICAgY29uc3QgcmF0ZUxpbWl0ZXIgPSBuZXcgUmF0ZUxpbWl0ZXI8VGltaW5nPihyZXF1ZXN0UmF0ZSk7XG4gICAgICAgIGNvbnN0IHByb21pc2VzOiBQcm9taXNlPFRpbWluZz5bXSA9IFtdO1xuICAgICAgICBwcm9taXNlcy5wdXNoKHJhdGVMaW1pdGVyLnB1c2goKCkgPT4gdGltZXIoMCkpKTtcbiAgICAgICAgYXdhaXQgc2xlZXAoOTAwKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxNTsgaSsrKSB7XG4gICAgICAgICAgICBwcm9taXNlcy5wdXNoKHJhdGVMaW1pdGVyLnB1c2goKCkgPT4gdGltZXIoMCkpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0aW1pbmdzID0gYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgICAgICB0LmlzKG1lYXN1cmVNYXhSZXF1ZXN0UmF0ZVBlclNlY29uZCh0aW1pbmdzKSwgcmVxdWVzdFJhdGUpO1xuICAgIH0pXG4pO1xuXG50ZXN0LnNlcmlhbChcInJhdGUgbGltaXRlciBidXJzdGluZyBhbGxvd3MgZm9yIHJlcXVlc3QgcmF0ZSBiZXlvbmQgdGFyZ2V0IHJhdGVcIiwgdCA9PlxuICAgIHdpdGhDbG9jayhhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RSYXRlID0gMTA7XG4gICAgICAgIGNvbnN0IG1heEJ1cnN0ID0gNTtcbiAgICAgICAgY29uc3QgcmF0ZUxpbWl0ZXIgPSBuZXcgUmF0ZUxpbWl0ZXI8VGltaW5nPihyZXF1ZXN0UmF0ZSwgbWF4QnVyc3QpO1xuICAgICAgICBjb25zdCBwcm9taXNlczogUHJvbWlzZTxUaW1pbmc+W10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxNTsgaSsrKSB7XG4gICAgICAgICAgICBwcm9taXNlcy5wdXNoKHJhdGVMaW1pdGVyLnB1c2goKCkgPT4gdGltZXIoMCkpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0aW1pbmdzID0gYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgICAgICBjb25zdCBtYXhSYXRlID0gbWVhc3VyZU1heFJlcXVlc3RSYXRlUGVyU2Vjb25kKHRpbWluZ3MpO1xuICAgICAgICB0LnRydWUobWF4UmF0ZSA8PSBtYXhCdXJzdCArIHJlcXVlc3RSYXRlKTtcbiAgICAgICAgdC50cnVlKG1heFJhdGUgPiBtYXhCdXJzdCk7XG4gICAgfSlcbik7XG5cbnRlc3Quc2VyaWFsKFwidGhyb3R0bGUgbGltaXRzIG1heCBjb25jdXJyZW5jeSBhbmQgcmF0ZVwiLCB0ID0+XG4gICAgd2l0aENsb2NrKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgY29uY3VycmVuY3kgPSAxMDtcbiAgICAgICAgY29uc3QgcmF0ZSA9IDEwO1xuICAgICAgICBjb25zdCB0aW1lckZuID0gdGhyb3R0bGUoeyBjb25jdXJyZW5jeSwgcmF0ZSB9LCB0aW1lcik7XG4gICAgICAgIGNvbnN0IHByb21pc2VzID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTU7IGkrKykge1xuICAgICAgICAgICAgcHJvbWlzZXMucHVzaCh0aW1lckZuKDEwMDApKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRpbWVzID0gYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgICAgICB0LmlzKG1lYXN1cmVDb25jdXJyZW5jeSh0aW1lcyksIGNvbmN1cnJlbmN5KTtcbiAgICAgICAgdC5pcyhtZWFzdXJlTWF4UmVxdWVzdFJhdGVQZXJTZWNvbmQodGltZXMpLCByYXRlKTtcbiAgICB9KVxuKTtcblxudGVzdC5zZXJpYWwoXCJ0aHJvdHRsZSBsaW1pdHMgcmF0ZSB3aXRoIHNpbmdsZSBjb25jdXJyZW5jeVwiLCB0ID0+XG4gICAgd2l0aENsb2NrKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgY29uY3VycmVuY3kgPSAxO1xuICAgICAgICBjb25zdCByYXRlID0gMTA7XG4gICAgICAgIGNvbnN0IHByb2Nlc3NUaW1lTXMgPSAyMDA7XG4gICAgICAgIGNvbnN0IHRpbWVyRm4gPSB0aHJvdHRsZSh7IGNvbmN1cnJlbmN5LCByYXRlIH0sIHRpbWVyKTtcblxuICAgICAgICBjb25zdCBwcm9taXNlcyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDEwOyBpKyspIHtcbiAgICAgICAgICAgIHByb21pc2VzLnB1c2godGltZXJGbihwcm9jZXNzVGltZU1zKSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0aW1lcyA9IGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICAgICAgdC5pcyhtZWFzdXJlQ29uY3VycmVuY3kodGltZXMpLCBjb25jdXJyZW5jeSk7XG4gICAgICAgIHQudHJ1ZShtZWFzdXJlTWF4UmVxdWVzdFJhdGVQZXJTZWNvbmQodGltZXMpIDw9IDEwMDAgLyBwcm9jZXNzVGltZU1zICsgMSk7XG4gICAgfSlcbik7XG5cbnRlc3QoXCJ0aHJvdHRsZSBtZW1vaXplIG9wdGlvblwiLCBhc3luYyB0ID0+IHtcbiAgICBjb25zdCBjb25jdXJyZW5jeSA9IDE7XG4gICAgY29uc3QgcmF0ZSA9IDEwMDtcbiAgICBsZXQgY291bnRlciA9IDA7XG4gICAgY29uc3QgTiA9IDU7XG4gICAgYXN5bmMgZnVuY3Rpb24gZm4oXzogbnVtYmVyKSB7XG4gICAgICAgIGNvdW50ZXIrKztcbiAgICB9XG4gICAgY29uc3QgdGhyb3R0bGVkRm4gPSB0aHJvdHRsZSh7IGNvbmN1cnJlbmN5LCByYXRlLCBtZW1vaXplOiB0cnVlIH0sIGZuKTtcblxuICAgIGNvbnN0IHByb21pc2VzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBOOyBpKyspIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaCh0aHJvdHRsZWRGbihpKSk7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTjsgaSsrKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2godGhyb3R0bGVkRm4oaSkpO1xuICAgIH1cblxuICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICB0LmlzKGNvdW50ZXIsIE4pO1xufSk7XG5cbnRlc3QoXCJ0aHJvdHRsZSBjYWNoZSBvcHRpb24gcGVyc2lzdHMgdmFsdWVzXCIsIGFzeW5jIHQgPT5cbiAgICB3aXRoQ2FjaGUoYXN5bmMgY2FjaGUgPT4ge1xuICAgICAgICBjb25zdCBjb25jdXJyZW5jeSA9IDE7XG4gICAgICAgIGNvbnN0IHJhdGUgPSAxMDA7XG4gICAgICAgIGxldCBjb3VudGVyID0gMDtcblxuICAgICAgICBhc3luYyBmdW5jdGlvbiBmbihfOiBudW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBjb3VudGVyKys7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0aHJvdHRsZWRGbiA9IHRocm90dGxlKHsgY29uY3VycmVuY3ksIHJhdGUsIGNhY2hlIH0sIGZuKTtcblxuICAgICAgICBjb25zdCB2ID0gYXdhaXQgdGhyb3R0bGVkRm4oMTApO1xuICAgICAgICB0LmlzKHYsIDApO1xuXG4gICAgICAgIGNvbnN0IHRocm90dGxlZEZuMiA9IHRocm90dGxlKHsgY29uY3VycmVuY3ksIHJhdGUsIGNhY2hlIH0sIGZuKTtcblxuICAgICAgICBjb25zdCB1MSA9IGF3YWl0IHRocm90dGxlZEZuMigxMCk7XG4gICAgICAgIGNvbnN0IHUyID0gYXdhaXQgdGhyb3R0bGVkRm4yKDIwKTtcblxuICAgICAgICB0LmlzKHUxLCAwKTtcbiAgICAgICAgdC5pcyh1MiwgMSk7XG4gICAgICAgIHQuaXMoY291bnRlciwgMik7XG4gICAgfSkpO1xuXG50ZXN0KFwidGhyb3R0bGUgY2FjaGUgYW5kIG1lbW9pemUgb3B0aW9ucyB3b3JrIHRvZ2V0aGVyXCIsIGFzeW5jIHQgPT5cbiAgICB3aXRoQ2FjaGUoYXN5bmMgY2FjaGUgPT4ge1xuICAgICAgICBjb25zdCBjb25jdXJyZW5jeSA9IDE7XG4gICAgICAgIGNvbnN0IHJhdGUgPSAxMDA7XG4gICAgICAgIGxldCBjb3VudGVyID0gMDtcblxuICAgICAgICBhc3luYyBmdW5jdGlvbiBmbihfOiBudW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBjb3VudGVyKys7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0aHJvdHRsZWRGbiA9IHRocm90dGxlKHsgY29uY3VycmVuY3ksIHJhdGUsIG1lbW9pemU6IHRydWUsIGNhY2hlIH0sIGZuKTtcblxuICAgICAgICBjb25zdCB2ID0gYXdhaXQgdGhyb3R0bGVkRm4oMTApO1xuICAgICAgICBjb25zdCB2MiA9IGF3YWl0IHRocm90dGxlZEZuKDEwKTtcbiAgICAgICAgdC5pcyh2LCAwKTtcbiAgICAgICAgdC5pcyh2MiwgMCk7XG5cbiAgICAgICAgY29uc3QgdGhyb3R0bGVkRm4yID0gdGhyb3R0bGUoeyBjb25jdXJyZW5jeSwgcmF0ZSwgbWVtb2l6ZTogdHJ1ZSwgY2FjaGUgfSwgZm4pO1xuXG4gICAgICAgIGNvbnN0IHUxID0gYXdhaXQgdGhyb3R0bGVkRm4yKDEwKTtcbiAgICAgICAgY29uc3QgdTIgPSBhd2FpdCB0aHJvdHRsZWRGbjIoMjApO1xuICAgICAgICBjb25zdCB1MyA9IGF3YWl0IHRocm90dGxlZEZuMigxMCk7XG5cbiAgICAgICAgdC5pcyh1MSwgMCk7XG4gICAgICAgIHQuaXModTIsIDEpO1xuICAgICAgICB0LmlzKHUzLCAwKTtcblxuICAgICAgICB0LmlzKGNvdW50ZXIsIDIpO1xuICAgIH0pKTtcblxudGVzdC5zZXJpYWwoXCJ0aHJvdHRsZSBjYW5jZWxsYXRpb25cIiwgYXN5bmMgdCA9PlxuICAgIHdpdGhDbG9jayhhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbmN1cnJlbmN5ID0gMTA7XG4gICAgICAgIGNvbnN0IHJhdGUgPSAxMDA7XG4gICAgICAgIGxldCBjb3VudGVyID0gMDtcblxuICAgICAgICBhc3luYyBmdW5jdGlvbiBmbihfOiBudW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBjb3VudGVyKys7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2FuY2VsID0gbmV3IERlZmVycmVkKCk7XG4gICAgICAgIGNvbnN0IHRocm90dGxlZEZuID0gdGhyb3R0bGUoXG4gICAgICAgICAgICB7IGNvbmN1cnJlbmN5LCByYXRlLCBtZW1vaXplOiB0cnVlLCBjYW5jZWw6IGNhbmNlbC5wcm9taXNlIH0sXG4gICAgICAgICAgICBmblxuICAgICAgICApO1xuICAgICAgICB0aHJvdHRsZWRGbigxKTtcbiAgICAgICAgdGhyb3R0bGVkRm4oMik7XG4gICAgICAgIHRocm90dGxlZEZuKDMpO1xuICAgICAgICBhd2FpdCBzbGVlcCgxMDApO1xuICAgICAgICB0LmlzKGNvdW50ZXIsIDMpO1xuXG4gICAgICAgIGNvdW50ZXIgPSAwO1xuICAgICAgICB0aHJvdHRsZWRGbigxKTtcbiAgICAgICAgdGhyb3R0bGVkRm4oMik7XG4gICAgICAgIHRocm90dGxlZEZuKDMpO1xuICAgICAgICBjYW5jZWwucmVzb2x2ZSgpO1xuICAgICAgICBhd2FpdCBzbGVlcCgxMDApO1xuICAgICAgICB0LmlzKGNvdW50ZXIsIDApO1xuICAgIH0pXG4pO1xuXG50ZXN0KFwiQXN5bmNRdWV1ZSB3b3JrcyB3aXRoIGVucXVldWUgYmVmb3JlIGRlcXVldWVcIiwgYXN5bmMgdCA9PiB7XG4gICAgY29uc3QgcSA9IG5ldyBBc3luY1F1ZXVlPG51bWJlcj4oKTtcbiAgICBxLmVucXVldWUoNDIpO1xuICAgIHQuaXMoYXdhaXQgcS5uZXh0KCksIDQyKTtcbn0pO1xuXG50ZXN0KFwiQXN5bmNRdWV1ZSB3b3JrcyB3aXRoIG11bHRpcGxlIGVucXVldWVzIGJlZm9yZSBkZXF1ZXVlXCIsIGFzeW5jIHQgPT4ge1xuICAgIGNvbnN0IHEgPSBuZXcgQXN5bmNRdWV1ZTxudW1iZXI+KCk7XG4gICAgcS5lbnF1ZXVlKDQyKTtcbiAgICBxLmVucXVldWUoNDMpO1xuICAgIHQuaXMoYXdhaXQgcS5uZXh0KCksIDQyKTtcbiAgICB0LmlzKGF3YWl0IHEubmV4dCgpLCA0Myk7XG59KTtcblxudGVzdChcIkFzeW5jUXVldWUgd29ya3Mgd2l0aCBkZXF1ZXVlIGJlZm9yZSBlbnF1ZXVlXCIsIGFzeW5jIHQgPT4ge1xuICAgIGNvbnN0IHEgPSBuZXcgQXN5bmNRdWV1ZTxudW1iZXI+KCk7XG4gICAgY29uc3QgcHJvbWlzZSA9IHEubmV4dCgpO1xuICAgIHEuZW5xdWV1ZSg0Mik7XG4gICAgdC5pcyhhd2FpdCBwcm9taXNlLCA0Mik7XG59KTtcblxudGVzdChcIkFzeW5jUXVldWUgd29ya3Mgd2l0aCBtdWx0aXBsZSBkZXF1ZXVlcyBiZWZvcmUgZW5xdWV1ZVwiLCBhc3luYyB0ID0+IHtcbiAgICBjb25zdCBxID0gbmV3IEFzeW5jUXVldWU8bnVtYmVyPigpO1xuICAgIGNvbnN0IHByb21pc2VzID0gW3EubmV4dCgpLCBxLm5leHQoKV07XG4gICAgcS5lbnF1ZXVlKDQyKTtcbiAgICBxLmVucXVldWUoNDMpO1xuICAgIHQuZGVlcEVxdWFsKGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKSwgWzQyLCA0M10pO1xufSk7XG5cbnRlc3QoXCJBc3luY1F1ZXVlIHRyYW5zaXRpb24gZnJvbSBtb3JlIGVucXVldWVzIHRvIG1vcmUgZGVxdWV1ZXNcIiwgYXN5bmMgdCA9PiB7XG4gICAgY29uc3QgcSA9IG5ldyBBc3luY1F1ZXVlPG51bWJlcj4oKTtcbiAgICBxLmVucXVldWUoNDIpO1xuICAgIHQuaXMoYXdhaXQgcS5uZXh0KCksIDQyKTtcbiAgICBjb25zdCBwcm9taXNlID0gcS5uZXh0KCk7XG4gICAgcS5lbnF1ZXVlKDEwMCk7XG4gICAgdC5pcyhhd2FpdCBwcm9taXNlLCAxMDApO1xufSk7XG5cbnRlc3QoXCJBc3luY1F1ZXVlIHRyYW5zaXRpb24gZnJvbSBtb3JlIGRlcXVldWVzIHRvIG1vcmUgZW5xdWV1ZXNcIiwgYXN5bmMgdCA9PiB7XG4gICAgY29uc3QgcSA9IG5ldyBBc3luY1F1ZXVlPG51bWJlcj4oKTtcbiAgICBjb25zdCBwcm9taXNlID0gcS5uZXh0KCk7XG4gICAgcS5lbnF1ZXVlKDQyKTtcbiAgICBxLmVucXVldWUoMTAwKTtcbiAgICB0LmlzKGF3YWl0IHByb21pc2UsIDQyKTtcbiAgICB0LmlzKGF3YWl0IHEubmV4dCgpLCAxMDApO1xufSk7XG5cbnRlc3QoXCJBc3luY1F1ZXVlIGhhbmRsZXMgYXN5bmMgZW5xdWV1ZWluZ1wiLCBhc3luYyB0ID0+IHtcbiAgICBjb25zdCBxID0gbmV3IEFzeW5jUXVldWU8bnVtYmVyPigpO1xuICAgIGNvbnN0IHByb21pc2UgPSBxLm5leHQoKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHEuZW5xdWV1ZSg5OSksIDEwMCk7XG4gICAgdC5pcyhhd2FpdCBwcm9taXNlLCA5OSk7XG59KTtcblxudGVzdChcIkFzeW5jUXVldWUgaGFuZGxlcyBhc3luYyBkZXF1ZXVlaW5nXCIsIGFzeW5jIHQgPT4ge1xuICAgIHQucGxhbigxKTtcbiAgICBjb25zdCBxID0gbmV3IEFzeW5jUXVldWU8bnVtYmVyPigpO1xuICAgIHEuZW5xdWV1ZSg4OCk7XG4gICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4ocmVzb2x2ZSA9PlxuICAgICAgICBzZXRUaW1lb3V0KGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHQuaXMoYXdhaXQgcS5uZXh0KCksIDg4KTtcbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSwgMTAwKVxuICAgICk7XG59KTtcblxudGVzdChcIkFzeW5jUXVldWUgY2xlYXJcIiwgYXN5bmMgdCA9PiB7XG4gICAgY29uc3QgcSA9IG5ldyBBc3luY1F1ZXVlPG51bWJlcj4oKTtcbiAgICBxLmVucXVldWUoMSk7XG4gICAgcS5jbGVhcigpO1xuICAgIHEuZW5xdWV1ZSgyKTtcbiAgICB0LmlzKGF3YWl0IHEubmV4dCgpLCAyKTtcblxuICAgIGNvbnN0IHAxID0gcS5uZXh0KCk7XG4gICAgcS5jbGVhcigpO1xuICAgIGNvbnN0IHAyID0gcS5uZXh0KCk7XG4gICAgcS5lbnF1ZXVlKDMpO1xuICAgIHQuaXMoYXdhaXQgcDIsIDMpO1xufSk7XG5cbmFzeW5jIGZ1bmN0aW9uIHRvQXJyYXk8VD4oaXRlcmFibGU6IEFzeW5jSXRlcmFibGU8VD4gfCBJdGVyYWJsZTxUPikge1xuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgIGZvciBhd2FpdCAoY29uc3QgdmFsdWUgb2YgaXRlcmFibGUpIHtcbiAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5hc3luYyBmdW5jdGlvbiB0YWtlPFQ+KHE6IEFzeW5jT3JkZXJlZFF1ZXVlPFQ+LCBuOiBudW1iZXIpIHtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykge1xuICAgICAgICByZXN1bHQucHVzaChhd2FpdCBxLm5leHQoKSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbnRlc3QoXCJBc3luY0l0ZXJhYmxlUXVldWUgZG9uZSBmdW5jdGlvbiBmaW5pc2hlcyBpdGVyYXRvclwiLCBhc3luYyB0ID0+IHtcbiAgICBjb25zdCBxID0gbmV3IEFzeW5jSXRlcmFibGVRdWV1ZTxudW1iZXI+KCk7XG4gICAgcS5wdXNoKDEwKTtcbiAgICBxLmRvbmUoKTtcbiAgICB0LmRlZXBFcXVhbChhd2FpdCB0b0FycmF5KHEpLCBbMTBdKTtcbiAgICAvLyB0ZXN0IHRpbWVzIG91dCBpZiB0aGUgZG9uZSBmdW5jdGlvbiBkb2Vzbid0IHdvcmsuXG59KTtcblxudGVzdChcIkFzeW5jSXRlcmFibGVRdWV1ZSBkb25lIGZ1bmN0aW9uIGZpbmlzaGVzIGl0ZXJhdG9yIHdpdGggcGVuZGluZyBkZXF1ZXVzXCIsIGFzeW5jIHQgPT4ge1xuICAgIGNvbnN0IHEgPSBuZXcgQXN5bmNJdGVyYWJsZVF1ZXVlPG51bWJlcj4oKTtcbiAgICBjb25zdCB2YWx1ZSA9IHEubmV4dCgpO1xuICAgIHEuZG9uZSgpO1xuICAgIHQuaXMoKGF3YWl0IHZhbHVlKS5kb25lLCB0cnVlKTtcbn0pO1xuXG50ZXN0KFwiQXN5bmNPcmRlcmVkUXVldWUgcmVvcmRlcnMgYWNjb3JkaW5nIHRvIHNlcXVlbmNlIHZhbHVlXCIsIGFzeW5jIHQgPT4ge1xuICAgIGNvbnN0IHEgPSBuZXcgQXN5bmNPcmRlcmVkUXVldWU8bnVtYmVyPigpO1xuICAgIHEucHVzaCg0MiwgMSk7XG4gICAgcS5wdXNoKC00MiwgMCk7XG4gICAgdC5kZWVwRXF1YWwoYXdhaXQgdGFrZShxLCAyKSwgWy00MiwgNDJdKTtcbn0pO1xuXG50ZXN0KFwiQXN5bmNPcmRlcmVkUXVldWUgdGFrZXMgdGhlIGZpcnN0IHZhbHVlIHdpdGggYSBnaXZlbiBzZXF1ZW5jZSB2YWx1ZVwiLCBhc3luYyB0ID0+IHtcbiAgICBjb25zdCBxID0gbmV3IEFzeW5jT3JkZXJlZFF1ZXVlPG51bWJlcj4oKTtcbiAgICBxLnB1c2goMTAwLCAxKTtcbiAgICBxLnB1c2goMTAxLCAxKTtcbiAgICBxLnB1c2goNDIsIDApO1xuICAgIHQuZGVlcEVxdWFsKGF3YWl0IHRha2UocSwgMiksIFs0MiwgMTAwXSk7XG59KTtcblxudGVzdChcIkFzeW5jT3JkZXJlZFF1ZXVlIHB1c2hJbW1lZGlhdGUgcHJlLWVtcHRzIGFycml2YWwgb3JkZXJcIiwgYXN5bmMgdCA9PiB7XG4gICAgY29uc3QgcSA9IG5ldyBBc3luY09yZGVyZWRRdWV1ZTxudW1iZXI+KCk7XG4gICAgcS5wdXNoKDQyLCAwKTtcbiAgICBxLnB1c2goNDQsIDIpO1xuICAgIHEucHVzaEltbWVkaWF0ZSgxMDApO1xuICAgIHEucHVzaCg0MywgMSk7XG5cbiAgICB0LmlzKGF3YWl0IHEubmV4dCgpLCA0Mik7XG4gICAgdC5pcyhhd2FpdCBxLm5leHQoKSwgMTAwKTtcbiAgICB0LmlzKGF3YWl0IHEubmV4dCgpLCA0Myk7XG4gICAgdC5pcyhhd2FpdCBxLm5leHQoKSwgNDQpO1xufSk7XG4iXX0=
\No newline at end of file