faastjs
Version:
Serverless batch computing made simple.
244 lines • 31.8 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
const tslib_1 = require("tslib");
const ava_1 = tslib_1.__importDefault(require("ava"));
const serialize_1 = require("../src/serialize");
const shared_1 = require("../src/shared");
const util_1 = require("./fixtures/util");
(0, ava_1.default)("deepCopyUndefined copies undefined properties", t => {
const obj = { prop: undefined };
const obj2 = {};
(0, serialize_1.deepCopyUndefined)(obj2, obj);
t.deepEqual(obj2, obj);
});
(0, ava_1.default)("deepCopyUndefined copies nested undefined properties", t => {
const obj = { outer: { inner: undefined } };
const obj2 = { outer: {} };
(0, serialize_1.deepCopyUndefined)(obj2, obj);
t.deepEqual(obj2, obj);
});
(0, ava_1.default)("deepCopyUndefined should not hang on cyclical references", t => {
const obj = { ref: {} };
obj.ref = obj;
const obj2 = { ref: {} };
obj2.ref = obj2;
(0, serialize_1.deepCopyUndefined)(obj2, obj);
t.deepEqual(obj2, obj);
});
(0, ava_1.default)("deepCopyUndefined copies symbol properties", t => {
const obj = { [Symbol()]: "value" };
const obj2 = {};
(0, serialize_1.deepCopyUndefined)(obj2, obj);
t.deepEqual(obj2, obj);
});
(0, ava_1.default)("deepCopyUndefined copies symbol values", t => {
const obj = { symbolValuedKey: Symbol() };
const obj2 = {};
(0, serialize_1.deepCopyUndefined)(obj2, obj);
t.deepEqual(obj2, obj);
});
(0, ava_1.default)("deep copy should not fail when objects are not shaped similarly", t => {
const obj = { geometry: { theorem: { name: "Pythagorean" } } };
const obj2 = { hypothesis: "Riemann" };
t.notThrows(() => (0, serialize_1.deepCopyUndefined)(obj2, obj));
});
function check(t, values) {
const stat = new shared_1.Statistics();
values.forEach(value => stat.update(value));
t.true(Math.abs(stat.mean - (0, util_1.avg)(values)) < 0.000000001);
t.true(Math.abs(stat.stdev - (0, util_1.stdev)(values)) < 0.000000001);
t.is(stat.samples, values.length);
}
(0, ava_1.default)("statistics empty values", t => {
const emptyStat = new shared_1.Statistics();
t.is(emptyStat.mean, NaN);
t.is(emptyStat.stdev, 0);
t.is(emptyStat.samples, 0);
});
(0, ava_1.default)("statistics single values", t => {
check(t, [0]);
check(t, [1]);
check(t, [-1]);
check(t, [0.5]);
check(t, [-0.5]);
check(t, [0.1]);
check(t, [-0.1]);
});
(0, ava_1.default)("statistics multiple values", t => {
check(t, [0, 1]);
check(t, [0, 1, 2]);
check(t, [42, 100, 1000]);
check(t, [1, 0.1]);
check(t, [-0.5, 0.5]);
check(t, [-1, 1]);
check(t, [3.14159, 2.717]);
});
(0, ava_1.default)("statistics random values", t => {
const a = [];
const b = [];
const c = [];
for (let i = 0; i < 1000; i++) {
a.push(Math.random());
b.push(Math.random() * 10);
c.push(Math.random() * 100);
}
check(t, a);
check(t, b);
check(t, c);
});
(0, ava_1.default)(`statistics clone`, t => {
const stats = new shared_1.Statistics();
stats.update(10);
stats.update(100);
stats.update(5);
const cloned = stats.clone();
t.deepEqual(cloned, stats);
t.is(cloned.toString(), stats.toString());
cloned.update(42);
t.true(cloned.mean !== stats.mean);
t.true(cloned.stdev !== stats.stdev);
t.is(stats.samples, 3);
t.is(cloned.samples, 4);
});
(0, ava_1.default)("MaxHeap basics", t => {
const h = new shared_1.MaxHeap();
h.insert(5);
h.insert(10);
h.insert(100);
h.insert(1);
t.is(h.extractMax(), 100);
t.is(h.extractMax(), 10);
t.is(h.extractMax(), 5);
t.is(h.extractMax(), 1);
t.throws(() => h.extractMax(), { message: /empty/ });
});
(0, ava_1.default)("MaxHeap empty", t => {
const h = new shared_1.MaxHeap();
t.throws(() => h.extractMax(), { message: /empty/ });
});
(0, ava_1.default)("MaxHeap sorting", t => {
const h = new shared_1.MaxHeap();
const N = 10000;
const size = 100;
for (let attempt = 0; attempt < N; attempt++) {
let orig = [];
const a = [];
for (let i = 0; i < size; i++) {
const value = Math.round(Math.random() * 1000);
a.push(value);
h.insert(value);
}
orig = a.slice();
a.sort((x, y) => y - x);
const b = [];
while (h.size > 0) {
b.push(h.extractMax());
}
t.deepEqual(a, b, `difference sorting ${orig}`);
}
});
(0, ava_1.default)("MaxHeap specific ordering", t => {
const h = new shared_1.MaxHeap();
h.insert(7);
h.insert(2);
h.insert(0);
h.insert(3);
h.insert(4);
h.insert(1);
h.insert(6);
h.insert(5);
t.is(h.extractMax(), 7);
t.is(h.extractMax(), 6);
t.is(h.extractMax(), 5);
t.is(h.extractMax(), 4);
t.is(h.extractMax(), 3);
t.is(h.extractMax(), 2);
t.is(h.extractMax(), 1);
t.is(h.extractMax(), 0);
});
(0, ava_1.default)("MaxHeap iterator", t => {
const h = new shared_1.MaxHeap();
h.insert(10);
h.insert(42);
h.insert(12);
t.deepEqual([...h], [42, 10, 12]);
});
(0, ava_1.default)("SmallestN saves smallest N keys", t => {
const s = new shared_1.SmallestN(3);
s.update(100);
s.update(42);
s.update(-1);
s.update(0);
s.update(4);
s.update(1000);
t.deepEqual(s.keys().sort(), [-1, 0, 4].sort());
});
(0, ava_1.default)("SmallestN saves smallest N values", t => {
const N = 3;
const s = new shared_1.SmallestN(N);
s.update(100, "100");
s.update(42, "42");
s.update(-1, "-1");
s.update(0, "0");
s.update(4, "4");
s.update(1000, "1000");
t.deepEqual([...s], [
[-1, "-1"],
[0, "0"],
[4, "4"]
]);
});
(0, ava_1.default)("SmallestN duplicate values", t => {
const N = 5;
const s = new shared_1.SmallestN(N);
s.update(88, "88.1");
s.update(88, "88.2");
s.update(88, "88.3");
s.update(42, "42");
s.update(88, "88.4");
s.update(88, "88.5");
s.update(88, "88.6");
s.update(10, "10.1");
s.update(10, "10.2");
s.update(88, "88.7");
s.update(88, "88.8");
t.deepEqual([...s], [
[88, "88.1"],
[88, "88.2"],
[42, "42"],
[10, "10.1"],
[10, "10.2"]
]);
});
function vals(a) {
return a.map(i => [i, undefined]);
}
(0, ava_1.default)("SmallestN can reduce size", t => {
const N = 5;
const s = new shared_1.SmallestN(N);
s.update(1);
s.update(2);
s.update(3);
s.update(4);
s.update(5);
s.update(6);
s.update(7);
s.setSize(3);
t.deepEqual([...s], vals([1, 2, 3]));
});
(0, ava_1.default)("SmallestN can increase size", t => {
const N = 3;
const s = new shared_1.SmallestN(N);
s.update(1);
s.update(2);
s.update(3);
s.update(4);
s.update(5);
t.deepEqual([...s], vals([1, 2, 3]));
s.setSize(5);
s.update(6);
s.update(7);
s.update(8);
t.deepEqual([...s], vals([1, 2, 3, 6, 7]));
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5pdC1zaGFyZWQudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3Rlc3QvdW5pdC1zaGFyZWQudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxzREFBdUM7QUFDdkMsZ0RBQXFEO0FBQ3JELDBDQUErRDtBQUMvRCwwQ0FBNkM7QUFFN0MsSUFBQSxhQUFJLEVBQUMsK0NBQStDLEVBQUUsQ0FBQyxDQUFDLEVBQUU7SUFDdEQsTUFBTSxHQUFHLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7SUFDaEMsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQ2hCLElBQUEsNkJBQWlCLEVBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzdCLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQzNCLENBQUMsQ0FBQyxDQUFDO0FBRUgsSUFBQSxhQUFJLEVBQUMsc0RBQXNELEVBQUUsQ0FBQyxDQUFDLEVBQUU7SUFDN0QsTUFBTSxHQUFHLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEVBQUUsQ0FBQztJQUM1QyxNQUFNLElBQUksR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQztJQUMzQixJQUFBLDZCQUFpQixFQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztJQUM3QixDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztBQUMzQixDQUFDLENBQUMsQ0FBQztBQUVILElBQUEsYUFBSSxFQUFDLDBEQUEwRCxFQUFFLENBQUMsQ0FBQyxFQUFFO0lBQ2pFLE1BQU0sR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDO0lBQ3hCLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO0lBRWQsTUFBTSxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLENB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QUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNmLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2hCLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDakIsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDaEIsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNyQixDQUFDLENBQUMsQ0FBQztBQUVILElBQUEsYUFBSSxFQUFDLDRCQUE0QixFQUFFLENBQUMsQ0FBQyxFQUFFO0lBQ25DLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNqQixLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BCLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDMUIsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ25CLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3RCLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xCLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUMvQixDQUFDLENB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WCxDQUNKLENBQUM7QUFDTixDQUFDLENBQUMsQ0FBQztBQUVILElBQUEsYUFBSSxFQUFDLDRCQUE0QixFQUFFLENBQUMsQ0FBQyxFQUFFO0lBQ25DLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNaLE1BQU0sQ0FBQyxHQUFHLElBQUksa0JBQVMsQ0FBUyxDQUFDLENBQUMsQ0FBQztJQUNuQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNyQixDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNyQixDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNyQixDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNuQixDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNyQixDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNyQixDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNyQixDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNyQixDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNyQixDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNyQixDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNyQixDQUFDLENBQUMsU0FBUyxDQUNQLENBQUMsR0FBRyxDQUFDLENBQUMsRUFDTjtRQUNJLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQztRQUNaLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQztRQUNaLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQztRQUNWLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQztRQUNaLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQztLQUNmLENBQ0osQ0FBQztBQUNOLENBQUMsQ0FBQyxDQUFDO0FBRUgsU0FBUyxJQUFJLENBQUMsQ0FBVztJQUNyQixPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQXdCLENBQUMsQ0FBQztBQUM3RCxDQUFDO0FBRUQsSUFBQSxhQUFJLEVBQUMsMkJBQTJCLEVBQUUsQ0FBQyxDQUFDLEVBQUU7SUFDbEMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1osTUFBTSxDQUFDLEdBQUcsSUFBSSxrQkFBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNCLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDWixDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1osQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNaLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDWixDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1osQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNaLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFWixDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2IsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDekMsQ0FBQyxDQUFDLENBQUM7QUFFSCxJQUFBLGFBQUksRUFBQyw2QkFBNkIsRUFBRSxDQUFDLENBQUMsRUFBRTtJQUNwQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWixNQUFNLENBQUMsR0FBRyxJQUFJLGtCQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDM0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNaLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDWixDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1osQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNaLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDWixDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVyQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNaLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDWixDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1osQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMvQyxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0ZXN0LCB7IEFzc2VydGlvbnMgfSBmcm9tIFwiYXZhXCI7XG5pbXBvcnQgeyBkZWVwQ29weVVuZGVmaW5lZCB9IGZyb20gXCIuLi9zcmMvc2VyaWFsaXplXCI7XG5pbXBvcnQgeyBNYXhIZWFwLCBTbWFsbGVzdE4sIFN0YXRpc3RpY3MgfSBmcm9tIFwiLi4vc3JjL3NoYXJlZFwiO1xuaW1wb3J0IHsgYXZnLCBzdGRldiB9IGZyb20gXCIuL2ZpeHR1cmVzL3V0aWxcIjtcblxudGVzdChcImRlZXBDb3B5VW5kZWZpbmVkIGNvcGllcyB1bmRlZmluZWQgcHJvcGVydGllc1wiLCB0ID0+IHtcbiAgICBjb25zdCBvYmogPSB7IHByb3A6IHVuZGVmaW5lZCB9O1xuICAgIGNvbnN0IG9iajIgPSB7fTtcbiAgICBkZWVwQ29weVVuZGVmaW5lZChvYmoyLCBvYmopO1xuICAgIHQuZGVlcEVxdWFsKG9iajIsIG9iaik7XG59KTtcblxudGVzdChcImRlZXBDb3B5VW5kZWZpbmVkIGNvcGllcyBuZXN0ZWQgdW5kZWZpbmVkIHByb3BlcnRpZXNcIiwgdCA9PiB7XG4gICAgY29uc3Qgb2JqID0geyBvdXRlcjogeyBpbm5lcjogdW5kZWZpbmVkIH0gfTtcbiAgICBjb25zdCBvYmoyID0geyBvdXRlcjoge30gfTtcbiAgICBkZWVwQ29weVVuZGVmaW5lZChvYmoyLCBvYmopO1xuICAgIHQuZGVlcEVxdWFsKG9iajIsIG9iaik7XG59KTtcblxudGVzdChcImRlZXBDb3B5VW5kZWZpbmVkIHNob3VsZCBub3QgaGFuZyBvbiBjeWNsaWNhbCByZWZlcmVuY2VzXCIsIHQgPT4ge1xuICAgIGNvbnN0IG9iaiA9IHsgcmVmOiB7fSB9O1xuICAgIG9iai5yZWYgPSBvYmo7XG5cbiAgICBjb25zdCBvYmoyID0geyByZWY6IHt9IH07XG4gICAgb2JqMi5yZWYgPSBvYmoyO1xuXG4gICAgZGVlcENvcHlVbmRlZmluZWQob2JqMiwgb2JqKTtcbiAgICB0LmRlZXBFcXVhbChvYmoyLCBvYmopO1xufSk7XG5cbnRlc3QoXCJkZWVwQ29weVVuZGVmaW5lZCBjb3BpZXMgc3ltYm9sIHByb3BlcnRpZXNcIiwgdCA9PiB7XG4gICAgY29uc3Qgb2JqID0geyBbU3ltYm9sKCldOiBcInZhbHVlXCIgfTtcbiAgICBjb25zdCBvYmoyID0ge307XG4gICAgZGVlcENvcHlVbmRlZmluZWQob2JqMiwgb2JqKTtcbiAgICB0LmRlZXBFcXVhbChvYmoyLCBvYmopO1xufSk7XG5cbnRlc3QoXCJkZWVwQ29weVVuZGVmaW5lZCBjb3BpZXMgc3ltYm9sIHZhbHVlc1wiLCB0ID0+IHtcbiAgICBjb25zdCBvYmogPSB7IHN5bWJvbFZhbHVlZEtleTogU3ltYm9sKCkgfTtcbiAgICBjb25zdCBvYmoyID0ge307XG4gICAgZGVlcENvcHlVbmRlZmluZWQob2JqMiwgb2JqKTtcbiAgICB0LmRlZXBFcXVhbChvYmoyLCBvYmopO1xufSk7XG5cbnRlc3QoXCJkZWVwIGNvcHkgc2hvdWxkIG5vdCBmYWlsIHdoZW4gb2JqZWN0cyBhcmUgbm90IHNoYXBlZCBzaW1pbGFybHlcIiwgdCA9PiB7XG4gICAgY29uc3Qgb2JqID0geyBnZW9tZXRyeTogeyB0aGVvcmVtOiB7IG5hbWU6IFwiUHl0aGFnb3JlYW5cIiB9IH0gfTtcbiAgICBjb25zdCBvYmoyID0geyBoeXBvdGhlc2lzOiBcIlJpZW1hbm5cIiB9O1xuICAgIHQubm90VGhyb3dzKCgpID0+IGRlZXBDb3B5VW5kZWZpbmVkKG9iajIsIG9iaikpO1xufSk7XG5cbmZ1bmN0aW9uIGNoZWNrKHQ6IEFzc2VydGlvbnMsIHZhbHVlczogbnVtYmVyW10pIHtcbiAgICBjb25zdCBzdGF0ID0gbmV3IFN0YXRpc3RpY3MoKTtcbiAgICB2YWx1ZXMuZm9yRWFjaCh2YWx1ZSA9PiBzdGF0LnVwZGF0ZSh2YWx1ZSkpO1xuICAgIHQudHJ1ZShNYXRoLmFicyhzdGF0Lm1lYW4gLSBhdmcodmFsdWVzKSkgPCAwLjAwMDAwMDAwMSk7XG4gICAgdC50cnVlKE1hdGguYWJzKHN0YXQuc3RkZXYgLSBzdGRldih2YWx1ZXMpKSA8IDAuMDAwMDAwMDAxKTtcbiAgICB0LmlzKHN0YXQuc2FtcGxlcywgdmFsdWVzLmxlbmd0aCk7XG59XG5cbnRlc3QoXCJzdGF0aXN0aWNzIGVtcHR5IHZhbHVlc1wiLCB0ID0+IHtcbiAgICBjb25zdCBlbXB0eVN0YXQgPSBuZXcgU3RhdGlzdGljcygpO1xuICAgIHQuaXMoZW1wdHlTdGF0Lm1lYW4sIE5hTik7XG4gICAgdC5pcyhlbXB0eVN0YXQuc3RkZXYsIDApO1xuICAgIHQuaXMoZW1wdHlTdGF0LnNhbXBsZXMsIDApO1xufSk7XG5cbnRlc3QoXCJzdGF0aXN0aWNzIHNpbmdsZSB2YWx1ZXNcIiwgdCA9PiB7XG4gICAgY2hlY2sodCwgWzBdKTtcbiAgICBjaGVjayh0LCBbMV0pO1xuICAgIGNoZWNrKHQsIFstMV0pO1xuICAgIGNoZWNrKHQsIFswLjVdKTtcbiAgICBjaGVjayh0LCBbLTAuNV0pO1xuICAgIGNoZWNrKHQsIFswLjFdKTtcbiAgICBjaGVjayh0LCBbLTAuMV0pO1xufSk7XG5cbnRlc3QoXCJzdGF0aXN0aWNzIG11bHRpcGxlIHZhbHVlc1wiLCB0ID0+IHtcbiAgICBjaGVjayh0LCBbMCwgMV0pO1xuICAgIGNoZWNrKHQsIFswLCAxLCAyXSk7XG4gICAgY2hlY2sodCwgWzQyLCAxMDAsIDEwMDBdKTtcbiAgICBjaGVjayh0LCBbMSwgMC4xXSk7XG4gICAgY2hlY2sodCwgWy0wLjUsIDAuNV0pO1xuICAgIGNoZWNrKHQsIFstMSwgMV0pO1xuICAgIGNoZWNrKHQsIFszLjE0MTU5LCAyLjcxN10pO1xufSk7XG5cbnRlc3QoXCJzdGF0aXN0aWNzIHJhbmRvbSB2YWx1ZXNcIiwgdCA9PiB7XG4gICAgY29uc3QgYSA9IFtdO1xuICAgIGNvbnN0IGIgPSBbXTtcbiAgICBjb25zdCBjID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMDAwOyBpKyspIHtcbiAgICAgICAgYS5wdXNoKE1hdGgucmFuZG9tKCkpO1xuICAgICAgICBiLnB1c2goTWF0aC5yYW5kb20oKSAqIDEwKTtcbiAgICAgICAgYy5wdXNoKE1hdGgucmFuZG9tKCkgKiAxMDApO1xuICAgIH1cbiAgICBjaGVjayh0LCBhKTtcbiAgICBjaGVjayh0LCBiKTtcbiAgICBjaGVjayh0LCBjKTtcbn0pO1xuXG50ZXN0KGBzdGF0aXN0aWNzIGNsb25lYCwgdCA9PiB7XG4gICAgY29uc3Qgc3RhdHMgPSBuZXcgU3RhdGlzdGljcygpO1xuICAgIHN0YXRzLnVwZGF0ZSgxMCk7XG4gICAgc3RhdHMudXBkYXRlKDEwMCk7XG4gICAgc3RhdHMudXBkYXRlKDUpO1xuXG4gICAgY29uc3QgY2xvbmVkID0gc3RhdHMuY2xvbmUoKTtcbiAgICB0LmRlZXBFcXVhbChjbG9uZWQsIHN0YXRzKTtcbiAgICB0LmlzKGNsb25lZC50b1N0cmluZygpLCBzdGF0cy50b1N0cmluZygpKTtcbiAgICBjbG9uZWQudXBkYXRlKDQyKTtcbiAgICB0LnRydWUoY2xvbmVkLm1lYW4gIT09IHN0YXRzLm1lYW4pO1xuICAgIHQudHJ1ZShjbG9uZWQuc3RkZXYgIT09IHN0YXRzLnN0ZGV2KTtcbiAgICB0LmlzKHN0YXRzLnNhbXBsZXMsIDMpO1xuICAgIHQuaXMoY2xvbmVkLnNhbXBsZXMsIDQpO1xufSk7XG5cbnRlc3QoXCJNYXhIZWFwIGJhc2ljc1wiLCB0ID0+IHtcbiAgICBjb25zdCBoID0gbmV3IE1heEhlYXAoKTtcbiAgICBoLmluc2VydCg1KTtcbiAgICBoLmluc2VydCgxMCk7XG4gICAgaC5pbnNlcnQoMTAwKTtcbiAgICBoLmluc2VydCgxKTtcblxuICAgIHQuaXMoaC5leHRyYWN0TWF4KCksIDEwMCk7XG4gICAgdC5pcyhoLmV4dHJhY3RNYXgoKSwgMTApO1xuICAgIHQuaXMoaC5leHRyYWN0TWF4KCksIDUpO1xuICAgIHQuaXMoaC5leHRyYWN0TWF4KCksIDEpO1xuICAgIHQudGhyb3dzKCgpID0+IGguZXh0cmFjdE1heCgpLCB7IG1lc3NhZ2U6IC9lbXB0eS8gfSk7XG59KTtcblxudGVzdChcIk1heEhlYXAgZW1wdHlcIiwgdCA9PiB7XG4gICAgY29uc3QgaCA9IG5ldyBNYXhIZWFwKCk7XG4gICAgdC50aHJvd3MoKCkgPT4gaC5leHRyYWN0TWF4KCksIHsgbWVzc2FnZTogL2VtcHR5LyB9KTtcbn0pO1xuXG50ZXN0KFwiTWF4SGVhcCBzb3J0aW5nXCIsIHQgPT4ge1xuICAgIGNvbnN0IGggPSBuZXcgTWF4SGVhcCgpO1xuICAgIGNvbnN0IE4gPSAxMDAwMDtcbiAgICBjb25zdCBzaXplID0gMTAwO1xuXG4gICAgZm9yIChsZXQgYXR0ZW1wdCA9IDA7IGF0dGVtcHQgPCBOOyBhdHRlbXB0KyspIHtcbiAgICAgICAgbGV0IG9yaWc6IG51bWJlcltdID0gW107XG4gICAgICAgIGNvbnN0IGE6IG51bWJlcltdID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSAqIDEwMDApO1xuICAgICAgICAgICAgYS5wdXNoKHZhbHVlKTtcbiAgICAgICAgICAgIGguaW5zZXJ0KHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBvcmlnID0gYS5zbGljZSgpO1xuICAgICAgICBhLnNvcnQoKHgsIHkpID0+IHkgLSB4KTtcbiAgICAgICAgY29uc3QgYiA9IFtdO1xuICAgICAgICB3aGlsZSAoaC5zaXplID4gMCkge1xuICAgICAgICAgICAgYi5wdXNoKGguZXh0cmFjdE1heCgpKTtcbiAgICAgICAgfVxuICAgICAgICB0LmRlZXBFcXVhbChhLCBiLCBgZGlmZmVyZW5jZSBzb3J0aW5nICR7b3JpZ31gKTtcbiAgICB9XG59KTtcblxudGVzdChcIk1heEhlYXAgc3BlY2lmaWMgb3JkZXJpbmdcIiwgdCA9PiB7XG4gICAgY29uc3QgaCA9IG5ldyBNYXhIZWFwKCk7XG4gICAgaC5pbnNlcnQoNyk7XG4gICAgaC5pbnNlcnQoMik7XG4gICAgaC5pbnNlcnQoMCk7XG4gICAgaC5pbnNlcnQoMyk7XG4gICAgaC5pbnNlcnQoNCk7XG4gICAgaC5pbnNlcnQoMSk7XG4gICAgaC5pbnNlcnQoNik7XG4gICAgaC5pbnNlcnQoNSk7XG5cbiAgICB0LmlzKGguZXh0cmFjdE1heCgpLCA3KTtcbiAgICB0LmlzKGguZXh0cmFjdE1heCgpLCA2KTtcbiAgICB0LmlzKGguZXh0cmFjdE1heCgpLCA1KTtcbiAgICB0LmlzKGguZXh0cmFjdE1heCgpLCA0KTtcbiAgICB0LmlzKGguZXh0cmFjdE1heCgpLCAzKTtcbiAgICB0LmlzKGguZXh0cmFjdE1heCgpLCAyKTtcbiAgICB0LmlzKGguZXh0cmFjdE1heCgpLCAxKTtcbiAgICB0LmlzKGguZXh0cmFjdE1heCgpLCAwKTtcbn0pO1xuXG50ZXN0KFwiTWF4SGVhcCBpdGVyYXRvclwiLCB0ID0+IHtcbiAgICBjb25zdCBoID0gbmV3IE1heEhlYXAoKTtcbiAgICBoLmluc2VydCgxMCk7XG4gICAgaC5pbnNlcnQoNDIpO1xuICAgIGguaW5zZXJ0KDEyKTtcbiAgICB0LmRlZXBFcXVhbChbLi4uaF0sIFs0MiwgMTAsIDEyXSk7XG59KTtcblxudGVzdChcIlNtYWxsZXN0TiBzYXZlcyBzbWFsbGVzdCBOIGtleXNcIiwgdCA9PiB7XG4gICAgY29uc3QgcyA9IG5ldyBTbWFsbGVzdE4oMyk7XG4gICAgcy51cGRhdGUoMTAwKTtcbiAgICBzLnVwZGF0ZSg0Mik7XG4gICAgcy51cGRhdGUoLTEpO1xuICAgIHMudXBkYXRlKDApO1xuICAgIHMudXBkYXRlKDQpO1xuICAgIHMudXBkYXRlKDEwMDApO1xuICAgIHQuZGVlcEVxdWFsKHMua2V5cygpLnNvcnQoKSwgWy0xLCAwLCA0XS5zb3J0KCkpO1xufSk7XG5cbnRlc3QoXCJTbWFsbGVzdE4gc2F2ZXMgc21hbGxlc3QgTiB2YWx1ZXNcIiwgdCA9PiB7XG4gICAgY29uc3QgTiA9IDM7XG4gICAgY29uc3QgcyA9IG5ldyBTbWFsbGVzdE48c3RyaW5nPihOKTtcbiAgICBzLnVwZGF0ZSgxMDAsIFwiMTAwXCIpO1xuICAgIHMudXBkYXRlKDQyLCBcIjQyXCIpO1xuICAgIHMudXBkYXRlKC0xLCBcIi0xXCIpO1xuICAgIHMudXBkYXRlKDAsIFwiMFwiKTtcbiAgICBzLnVwZGF0ZSg0LCBcIjRcIik7XG4gICAgcy51cGRhdGUoMTAwMCwgXCIxMDAwXCIpO1xuICAgIHQuZGVlcEVxdWFsKFxuICAgICAgICBbLi4uc10sXG4gICAgICAgIFtcbiAgICAgICAgICAgIFstMSwgXCItMVwiXSxcbiAgICAgICAgICAgIFswLCBcIjBcIl0sXG4gICAgICAgICAgICBbNCwgXCI0XCJdXG4gICAgICAgIF1cbiAgICApO1xufSk7XG5cbnRlc3QoXCJTbWFsbGVzdE4gZHVwbGljYXRlIHZhbHVlc1wiLCB0ID0+IHtcbiAgICBjb25zdCBOID0gNTtcbiAgICBjb25zdCBzID0gbmV3IFNtYWxsZXN0TjxzdHJpbmc+KE4pO1xuICAgIHMudXBkYXRlKDg4LCBcIjg4LjFcIik7XG4gICAgcy51cGRhdGUoODgsIFwiODguMlwiKTtcbiAgICBzLnVwZGF0ZSg4OCwgXCI4OC4zXCIpO1xuICAgIHMudXBkYXRlKDQyLCBcIjQyXCIpO1xuICAgIHMudXBkYXRlKDg4LCBcIjg4LjRcIik7XG4gICAgcy51cGRhdGUoODgsIFwiODguNVwiKTtcbiAgICBzLnVwZGF0ZSg4OCwgXCI4OC42XCIpO1xuICAgIHMudXBkYXRlKDEwLCBcIjEwLjFcIik7XG4gICAgcy51cGRhdGUoMTAsIFwiMTAuMlwiKTtcbiAgICBzLnVwZGF0ZSg4OCwgXCI4OC43XCIpO1xuICAgIHMudXBkYXRlKDg4LCBcIjg4LjhcIik7XG4gICAgdC5kZWVwRXF1YWwoXG4gICAgICAgIFsuLi5zXSxcbiAgICAgICAgW1xuICAgICAgICAgICAgWzg4LCBcIjg4LjFcIl0sXG4gICAgICAgICAgICBbODgsIFwiODguMlwiXSxcbiAgICAgICAgICAgIFs0MiwgXCI0MlwiXSxcbiAgICAgICAgICAgIFsxMCwgXCIxMC4xXCJdLFxuICAgICAgICAgICAgWzEwLCBcIjEwLjJcIl1cbiAgICAgICAgXVxuICAgICk7XG59KTtcblxuZnVuY3Rpb24gdmFscyhhOiBudW1iZXJbXSk6IFtudW1iZXIsIHVuZGVmaW5lZF1bXSB7XG4gICAgcmV0dXJuIGEubWFwKGkgPT4gW2ksIHVuZGVmaW5lZF0gYXMgW251bWJlciwgdW5kZWZpbmVkXSk7XG59XG5cbnRlc3QoXCJTbWFsbGVzdE4gY2FuIHJlZHVjZSBzaXplXCIsIHQgPT4ge1xuICAgIGNvbnN0IE4gPSA1O1xuICAgIGNvbnN0IHMgPSBuZXcgU21hbGxlc3ROKE4pO1xuICAgIHMudXBkYXRlKDEpO1xuICAgIHMudXBkYXRlKDIpO1xuICAgIHMudXBkYXRlKDMpO1xuICAgIHMudXBkYXRlKDQpO1xuICAgIHMudXBkYXRlKDUpO1xuICAgIHMudXBkYXRlKDYpO1xuICAgIHMudXBkYXRlKDcpO1xuXG4gICAgcy5zZXRTaXplKDMpO1xuICAgIHQuZGVlcEVxdWFsKFsuLi5zXSwgdmFscyhbMSwgMiwgM10pKTtcbn0pO1xuXG50ZXN0KFwiU21hbGxlc3ROIGNhbiBpbmNyZWFzZSBzaXplXCIsIHQgPT4ge1xuICAgIGNvbnN0IE4gPSAzO1xuICAgIGNvbnN0IHMgPSBuZXcgU21hbGxlc3ROKE4pO1xuICAgIHMudXBkYXRlKDEpO1xuICAgIHMudXBkYXRlKDIpO1xuICAgIHMudXBkYXRlKDMpO1xuICAgIHMudXBkYXRlKDQpO1xuICAgIHMudXBkYXRlKDUpO1xuICAgIHQuZGVlcEVxdWFsKFsuLi5zXSwgdmFscyhbMSwgMiwgM10pKTtcblxuICAgIHMuc2V0U2l6ZSg1KTtcbiAgICBzLnVwZGF0ZSg2KTtcbiAgICBzLnVwZGF0ZSg3KTtcbiAgICBzLnVwZGF0ZSg4KTtcbiAgICB0LmRlZXBFcXVhbChbLi4uc10sIHZhbHMoWzEsIDIsIDMsIDYsIDddKSk7XG59KTtcbiJdfQ==
;