faastjs
Version:
Serverless batch computing made simple.
127 lines • 18.3 kB
JavaScript
import test from "ava";
import { faast, providers } from "../index.js";
import * as funcs from "../test/fixtures/functions.mjs";
import { configs, noValidateConfigs, title } from "../test/fixtures/util.js";
async function testBasicEsm(t, provider, options) {
const opts = {
timeout: 60,
gc: "off",
description: t.title,
env: { faastEnvironmentVariable: "the_answer_is_42" },
...options
};
const faastModule = await faast(provider, funcs, opts);
const remote = faastModule.functions;
try {
t.is(await remote.hello("Andy"), "Hello Andy!");
t.is(await remote.identityString("你好"), "你好");
t.is(await remote.identityNum(42), 42);
t.is(await remote.identityNum(Infinity), Infinity);
t.is(await remote.identityNum(-Infinity), -Infinity);
// if (nodeMajorVersion() >= 10) {
// t.is(await remote.identityNum(NaN), NaN);
// }
// t.is(await remote.empty(), undefined);
// t.is(await remote.arrow("arrow"), "arrow");
// t.is(await remote.asyncArrow("asyncArrow"), "asyncArrow");
// t.is(await remote.fact(5), 120);
// t.is(await remote.concat("abc", "def"), "abcdef");
// await t.throwsAsync(() => remote.error("hey"), {
// message: /Expected error. Arg: hey/
// });
// t.is(await remote.noargs(), "called function with no args.");
// t.is(await remote.async(), "async function: success");
// t.is(typeof (await remote.path()), "string");
// t.is(await remote.optionalArg(), "No arg");
// t.is(await remote.optionalArg("has arg"), "has arg");
// const date = new Date();
// t.deepEqual(await remote.identityDate(date), date);
// const buffer = Buffer.from("contents");
// t.deepEqual(await remote.identityBuffer(buffer), buffer);
// t.deepEqual(await remote.identityArrayNum([42, 8, 10]), [42, 8, 10]);
// const inf = [Infinity, -Infinity];
// t.deepEqual(await remote.identityArrayNum(inf), inf);
// if (nodeMajorVersion() >= 10) {
// t.deepEqual(await remote.identityArrayNum([NaN]), [NaN]);
// }
// t.deepEqual(await remote.identityArrayString(["a", "there"]), ["a", "there"]);
// t.is(await remote.identityBool(true), true);
// t.is(await remote.identityBool(false), false);
// t.is(await remote.identityUndefined(undefined), undefined);
// t.is(await remote.identityNull(null), null);
// t.deepEqual(await remote.identityObject({}), {});
// t.deepEqual(await remote.identityObject({ a: 42, b: "hello" }), {
// a: 42,
// b: "hello"
// });
// const int8 = Int8Array.of(0, -8, 42);
// t.deepEqual(await remote.identityInt8(int8), int8);
// const uint8 = Uint8Array.of(0, 8, 42);
// t.deepEqual(await remote.identityUint8(uint8), uint8);
// const uint8Clamped = Uint8ClampedArray.of(0, 8, 42);
// t.deepEqual(await remote.identityUint8Clamped(uint8Clamped), uint8Clamped);
// const int16 = Int16Array.of(0, 8, 42, -1);
// t.deepEqual(await remote.identityInt16(int16), int16);
// const uint16 = Uint16Array.of(0, 8, 42, -1);
// t.deepEqual(await remote.identityUint16(uint16), uint16);
// const int32 = Int32Array.of(0, 8, 42, -1);
// t.deepEqual(await remote.identityInt32(int32), int32);
// const uint32 = Uint32Array.of(0, 8, 42, -1);
// t.deepEqual(await remote.identityUint32(uint32), uint32);
// const float32 = Float32Array.of(0, 0.3, 100.042, -1);
// t.deepEqual(await remote.identityFloat32(float32), float32);
// const float64 = Float64Array.of(0, 0.3, 100.042, -1);
// t.deepEqual(await remote.identityFloat64(float64), float64);
// const m = new Map([
// [1, 2],
// [42, 10]
// ]);
// t.deepEqual(await remote.identityMap(m), m);
// const s = new Set([1, 42, 100]);
// t.deepEqual(await remote.identitySet(s), s);
// try {
// await remote.emptyReject();
// t.fail("remote.emptyReject() did not reject as expected");
// } catch (err: any) {
// t.is(err, undefined);
// }
// try {
// await remote.rejected();
// t.fail("remote.rejected() did not reject as expected");
// } catch (err: any) {
// t.is(err, "intentionally rejected");
// }
// try {
// await remote.customError();
// t.fail("remote.customError() did not reject as expected");
// } catch (err: any) {
// t.true(err instanceof FaastError);
// t.truthy(err.message.match(/^custom error message/));
// t.is(FaastError.info(err).custom, "custom value");
// }
// t.is(await remote.getEnv("faastEnvironmentVariable"), "the_answer_is_42");
// t.is(await remote.getEnv("faastNonexistent"), undefined);
// t.deepEqual(await remote.returnsError(), funcs.returnsError());
// const elements = ["bar", "baz"];
// t.deepEqual(await toArray(remote.generator(elements)), elements);
// t.deepEqual(await toArray(remote.asyncGenerator(elements)), elements);
// try {
// for await (const _ of remote.asyncGeneratorError("async generator failed")) {
// // ignore
// }
// t.fail(`remote.asyncGeneratorError() did not reject as expected (2)`);
// } catch (err: any) {
// t.true(err instanceof FaastError);
// t.truthy((err as FaastError).message.match(/^async generator failed/));
// }
}
finally {
await faastModule.cleanup();
}
}
for (const provider of providers) {
for (const config of [...configs, ...noValidateConfigs]) {
test.serial(title(provider, `esm basic calls`, config), testBasicEsm, provider, config);
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXNtLnRlc3QubWpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdGVzdC9lc20udGVzdC5tdHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxJQUEwQixNQUFNLEtBQUssQ0FBQztBQUM3QyxPQUFPLEVBQWlCLEtBQUssRUFBWSxTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDeEUsT0FBTyxLQUFLLEtBQUssTUFBTSxnQ0FBZ0MsQ0FBQztBQUN4RCxPQUFPLEVBQUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLEtBQUssRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRTdFLEtBQUssVUFBVSxZQUFZLENBQ3ZCLENBQW1CLEVBQ25CLFFBQWtCLEVBQ2xCLE9BQXNCO0lBRXRCLE1BQU0sSUFBSSxHQUFrQjtRQUN4QixPQUFPLEVBQUUsRUFBRTtRQUNYLEVBQUUsRUFBRSxLQUFLO1FBQ1QsV0FBVyxFQUFFLENBQUMsQ0FBQyxLQUFLO1FBQ3BCLEdBQUcsRUFBRSxFQUFFLHdCQUF3QixFQUFFLGtCQUFrQixFQUFFO1FBQ3JELEdBQUcsT0FBTztLQUNiLENBQUM7SUFFRixNQUFNLFdBQVcsR0FBRyxNQUFNLEtBQUssQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3ZELE1BQU0sTUFBTSxHQUFHLFdBQVcsQ0FBQyxTQUFTLENBQUM7SUFFckMsSUFBSSxDQUFDO1FBQ0QsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDaEQsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDOUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDdkMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLE1BQU0sQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDbkQsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3JELGtDQUFrQztRQUNsQyxnREFBZ0Q7UUFDaEQsSUFBSTtRQUNKLHlDQUF5QztRQUN6Qyw4Q0FBOEM7UUFDOUMsNkRBQTZEO1FBQzdELG1DQUFtQztRQUNuQyxxREFBcUQ7UUFDckQsbURBQW1EO1FBQ25ELDBDQUEwQztRQUMxQyxNQUFNO1FBQ04sZ0VBQWdFO1FBQ2hFLHlEQUF5RDtRQUN6RCxnREFBZ0Q7UUFDaEQsOENBQThDO1FBQzlDLHdEQUF3RDtRQUV4RCwyQkFBMkI7UUFDM0Isc0RBQXNEO1FBRXRELDBDQUEwQztRQUMxQyw0REFBNEQ7UUFFNUQsd0VBQXdFO1FBRXhFLHFDQUFxQztRQUNyQyx3REFBd0Q7UUFFeEQsa0NBQWtDO1FBQ2xDLGdFQUFnRTtRQUNoRSxJQUFJO1FBQ0osaUZBQWlGO1FBQ2pGLCtDQUErQztRQUMvQyxpREFBaUQ7UUFDakQsOERBQThEO1FBQzlELCtDQUErQztRQUMvQyxvREFBb0Q7UUFDcEQsb0VBQW9FO1FBQ3BFLGFBQWE7UUFDYixpQkFBaUI7UUFDakIsTUFBTTtRQUNOLHdDQUF3QztRQUN4QyxzREFBc0Q7UUFFdEQseUNBQXlDO1FBQ3pDLHlEQUF5RDtRQUV6RCx1REFBdUQ7UUFDdkQsOEVBQThFO1FBRTlFLDZDQUE2QztRQUM3Qyx5REFBeUQ7UUFFekQsK0NBQStDO1FBQy9DLDREQUE0RDtRQUU1RCw2Q0FBNkM7UUFDN0MseURBQXlEO1FBRXpELCtDQUErQztRQUMvQyw0REFBNEQ7UUFFNUQsd0RBQXdEO1FBQ3hELCtEQUErRDtRQUUvRCx3REFBd0Q7UUFDeEQsK0RBQStEO1FBRS9ELHNCQUFzQjtRQUN0QixjQUFjO1FBQ2QsZUFBZTtRQUNmLE1BQU07UUFDTiwrQ0FBK0M7UUFFL0MsbUNBQW1DO1FBQ25DLCtDQUErQztRQUUvQyxRQUFRO1FBQ1Isa0NBQWtDO1FBQ2xDLGlFQUFpRTtRQUNqRSx1QkFBdUI7UUFDdkIsNEJBQTRCO1FBQzVCLElBQUk7UUFDSixRQUFRO1FBQ1IsK0JBQStCO1FBQy9CLDhEQUE4RDtRQUM5RCx1QkFBdUI7UUFDdkIsMkNBQTJDO1FBQzNDLElBQUk7UUFDSixRQUFRO1FBQ1Isa0NBQWtDO1FBQ2xDLGlFQUFpRTtRQUNqRSx1QkFBdUI7UUFDdkIseUNBQXlDO1FBQ3pDLDREQUE0RDtRQUM1RCx5REFBeUQ7UUFDekQsSUFBSTtRQUNKLDZFQUE2RTtRQUM3RSw0REFBNEQ7UUFDNUQsa0VBQWtFO1FBRWxFLG1DQUFtQztRQUNuQyxvRUFBb0U7UUFDcEUseUVBQXlFO1FBQ3pFLFFBQVE7UUFDUixvRkFBb0Y7UUFDcEYsb0JBQW9CO1FBQ3BCLFFBQVE7UUFDUiw2RUFBNkU7UUFDN0UsdUJBQXVCO1FBQ3ZCLHlDQUF5QztRQUN6Qyw4RUFBOEU7UUFDOUUsSUFBSTtJQUNSLENBQUM7WUFBUyxDQUFDO1FBQ1AsTUFBTSxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDaEMsQ0FBQztBQUNMLENBQUM7QUFFRCxLQUFLLE1BQU0sUUFBUSxJQUFJLFNBQVMsRUFBRSxDQUFDO0lBQy9CLEtBQUssTUFBTSxNQUFNLElBQUksQ0FBQyxHQUFHLE9BQU8sRUFBRSxHQUFHLGlCQUFpQixDQUFDLEVBQUUsQ0FBQztRQUN0RCxJQUFJLENBQUMsTUFBTSxDQUNQLEtBQUssQ0FBQyxRQUFRLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLEVBQzFDLFlBQVksRUFDWixRQUFRLEVBQ1IsTUFBTSxDQUNULENBQUM7SUFDTixDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0ZXN0LCB7IEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tIFwiYXZhXCI7XG5pbXBvcnQgeyBDb21tb25PcHRpb25zLCBmYWFzdCwgUHJvdmlkZXIsIHByb3ZpZGVycyB9IGZyb20gXCIuLi9pbmRleC5qc1wiO1xuaW1wb3J0ICogYXMgZnVuY3MgZnJvbSBcIi4uL3Rlc3QvZml4dHVyZXMvZnVuY3Rpb25zLm1qc1wiO1xuaW1wb3J0IHsgY29uZmlncywgbm9WYWxpZGF0ZUNvbmZpZ3MsIHRpdGxlIH0gZnJvbSBcIi4uL3Rlc3QvZml4dHVyZXMvdXRpbC5qc1wiO1xuXG5hc3luYyBmdW5jdGlvbiB0ZXN0QmFzaWNFc20oXG4gICAgdDogRXhlY3V0aW9uQ29udGV4dCxcbiAgICBwcm92aWRlcjogUHJvdmlkZXIsXG4gICAgb3B0aW9uczogQ29tbW9uT3B0aW9uc1xuKSB7XG4gICAgY29uc3Qgb3B0czogQ29tbW9uT3B0aW9ucyA9IHtcbiAgICAgICAgdGltZW91dDogNjAsXG4gICAgICAgIGdjOiBcIm9mZlwiLFxuICAgICAgICBkZXNjcmlwdGlvbjogdC50aXRsZSxcbiAgICAgICAgZW52OiB7IGZhYXN0RW52aXJvbm1lbnRWYXJpYWJsZTogXCJ0aGVfYW5zd2VyX2lzXzQyXCIgfSxcbiAgICAgICAgLi4ub3B0aW9uc1xuICAgIH07XG5cbiAgICBjb25zdCBmYWFzdE1vZHVsZSA9IGF3YWl0IGZhYXN0KHByb3ZpZGVyLCBmdW5jcywgb3B0cyk7XG4gICAgY29uc3QgcmVtb3RlID0gZmFhc3RNb2R1bGUuZnVuY3Rpb25zO1xuXG4gICAgdHJ5IHtcbiAgICAgICAgdC5pcyhhd2FpdCByZW1vdGUuaGVsbG8oXCJBbmR5XCIpLCBcIkhlbGxvIEFuZHkhXCIpO1xuICAgICAgICB0LmlzKGF3YWl0IHJlbW90ZS5pZGVudGl0eVN0cmluZyhcIuS9oOWlvVwiKSwgXCLkvaDlpb1cIik7XG4gICAgICAgIHQuaXMoYXdhaXQgcmVtb3RlLmlkZW50aXR5TnVtKDQyKSwgNDIpO1xuICAgICAgICB0LmlzKGF3YWl0IHJlbW90ZS5pZGVudGl0eU51bShJbmZpbml0eSksIEluZmluaXR5KTtcbiAgICAgICAgdC5pcyhhd2FpdCByZW1vdGUuaWRlbnRpdHlOdW0oLUluZmluaXR5KSwgLUluZmluaXR5KTtcbiAgICAgICAgLy8gaWYgKG5vZGVNYWpvclZlcnNpb24oKSA+PSAxMCkge1xuICAgICAgICAvLyAgICAgdC5pcyhhd2FpdCByZW1vdGUuaWRlbnRpdHlOdW0oTmFOKSwgTmFOKTtcbiAgICAgICAgLy8gfVxuICAgICAgICAvLyB0LmlzKGF3YWl0IHJlbW90ZS5lbXB0eSgpLCB1bmRlZmluZWQpO1xuICAgICAgICAvLyB0LmlzKGF3YWl0IHJlbW90ZS5hcnJvdyhcImFycm93XCIpLCBcImFycm93XCIpO1xuICAgICAgICAvLyB0LmlzKGF3YWl0IHJlbW90ZS5hc3luY0Fycm93KFwiYXN5bmNBcnJvd1wiKSwgXCJhc3luY0Fycm93XCIpO1xuICAgICAgICAvLyB0LmlzKGF3YWl0IHJlbW90ZS5mYWN0KDUpLCAxMjApO1xuICAgICAgICAvLyB0LmlzKGF3YWl0IHJlbW90ZS5jb25jYXQoXCJhYmNcIiwgXCJkZWZcIiksIFwiYWJjZGVmXCIpO1xuICAgICAgICAvLyBhd2FpdCB0LnRocm93c0FzeW5jKCgpID0+IHJlbW90ZS5lcnJvcihcImhleVwiKSwge1xuICAgICAgICAvLyAgICAgbWVzc2FnZTogL0V4cGVjdGVkIGVycm9yLiBBcmc6IGhleS9cbiAgICAgICAgLy8gfSk7XG4gICAgICAgIC8vIHQuaXMoYXdhaXQgcmVtb3RlLm5vYXJncygpLCBcImNhbGxlZCBmdW5jdGlvbiB3aXRoIG5vIGFyZ3MuXCIpO1xuICAgICAgICAvLyB0LmlzKGF3YWl0IHJlbW90ZS5hc3luYygpLCBcImFzeW5jIGZ1bmN0aW9uOiBzdWNjZXNzXCIpO1xuICAgICAgICAvLyB0LmlzKHR5cGVvZiAoYXdhaXQgcmVtb3RlLnBhdGgoKSksIFwic3RyaW5nXCIpO1xuICAgICAgICAvLyB0LmlzKGF3YWl0IHJlbW90ZS5vcHRpb25hbEFyZygpLCBcIk5vIGFyZ1wiKTtcbiAgICAgICAgLy8gdC5pcyhhd2FpdCByZW1vdGUub3B0aW9uYWxBcmcoXCJoYXMgYXJnXCIpLCBcImhhcyBhcmdcIik7XG5cbiAgICAgICAgLy8gY29uc3QgZGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgICAgIC8vIHQuZGVlcEVxdWFsKGF3YWl0IHJlbW90ZS5pZGVudGl0eURhdGUoZGF0ZSksIGRhdGUpO1xuXG4gICAgICAgIC8vIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5mcm9tKFwiY29udGVudHNcIik7XG4gICAgICAgIC8vIHQuZGVlcEVxdWFsKGF3YWl0IHJlbW90ZS5pZGVudGl0eUJ1ZmZlcihidWZmZXIpLCBidWZmZXIpO1xuXG4gICAgICAgIC8vIHQuZGVlcEVxdWFsKGF3YWl0IHJlbW90ZS5pZGVudGl0eUFycmF5TnVtKFs0MiwgOCwgMTBdKSwgWzQyLCA4LCAxMF0pO1xuXG4gICAgICAgIC8vIGNvbnN0IGluZiA9IFtJbmZpbml0eSwgLUluZmluaXR5XTtcbiAgICAgICAgLy8gdC5kZWVwRXF1YWwoYXdhaXQgcmVtb3RlLmlkZW50aXR5QXJyYXlOdW0oaW5mKSwgaW5mKTtcblxuICAgICAgICAvLyBpZiAobm9kZU1ham9yVmVyc2lvbigpID49IDEwKSB7XG4gICAgICAgIC8vICAgICB0LmRlZXBFcXVhbChhd2FpdCByZW1vdGUuaWRlbnRpdHlBcnJheU51bShbTmFOXSksIFtOYU5dKTtcbiAgICAgICAgLy8gfVxuICAgICAgICAvLyB0LmRlZXBFcXVhbChhd2FpdCByZW1vdGUuaWRlbnRpdHlBcnJheVN0cmluZyhbXCJhXCIsIFwidGhlcmVcIl0pLCBbXCJhXCIsIFwidGhlcmVcIl0pO1xuICAgICAgICAvLyB0LmlzKGF3YWl0IHJlbW90ZS5pZGVudGl0eUJvb2wodHJ1ZSksIHRydWUpO1xuICAgICAgICAvLyB0LmlzKGF3YWl0IHJlbW90ZS5pZGVudGl0eUJvb2woZmFsc2UpLCBmYWxzZSk7XG4gICAgICAgIC8vIHQuaXMoYXdhaXQgcmVtb3RlLmlkZW50aXR5VW5kZWZpbmVkKHVuZGVmaW5lZCksIHVuZGVmaW5lZCk7XG4gICAgICAgIC8vIHQuaXMoYXdhaXQgcmVtb3RlLmlkZW50aXR5TnVsbChudWxsKSwgbnVsbCk7XG4gICAgICAgIC8vIHQuZGVlcEVxdWFsKGF3YWl0IHJlbW90ZS5pZGVudGl0eU9iamVjdCh7fSksIHt9KTtcbiAgICAgICAgLy8gdC5kZWVwRXF1YWwoYXdhaXQgcmVtb3RlLmlkZW50aXR5T2JqZWN0KHsgYTogNDIsIGI6IFwiaGVsbG9cIiB9KSwge1xuICAgICAgICAvLyAgICAgYTogNDIsXG4gICAgICAgIC8vICAgICBiOiBcImhlbGxvXCJcbiAgICAgICAgLy8gfSk7XG4gICAgICAgIC8vIGNvbnN0IGludDggPSBJbnQ4QXJyYXkub2YoMCwgLTgsIDQyKTtcbiAgICAgICAgLy8gdC5kZWVwRXF1YWwoYXdhaXQgcmVtb3RlLmlkZW50aXR5SW50OChpbnQ4KSwgaW50OCk7XG5cbiAgICAgICAgLy8gY29uc3QgdWludDggPSBVaW50OEFycmF5Lm9mKDAsIDgsIDQyKTtcbiAgICAgICAgLy8gdC5kZWVwRXF1YWwoYXdhaXQgcmVtb3RlLmlkZW50aXR5VWludDgodWludDgpLCB1aW50OCk7XG5cbiAgICAgICAgLy8gY29uc3QgdWludDhDbGFtcGVkID0gVWludDhDbGFtcGVkQXJyYXkub2YoMCwgOCwgNDIpO1xuICAgICAgICAvLyB0LmRlZXBFcXVhbChhd2FpdCByZW1vdGUuaWRlbnRpdHlVaW50OENsYW1wZWQodWludDhDbGFtcGVkKSwgdWludDhDbGFtcGVkKTtcblxuICAgICAgICAvLyBjb25zdCBpbnQxNiA9IEludDE2QXJyYXkub2YoMCwgOCwgNDIsIC0xKTtcbiAgICAgICAgLy8gdC5kZWVwRXF1YWwoYXdhaXQgcmVtb3RlLmlkZW50aXR5SW50MTYoaW50MTYpLCBpbnQxNik7XG5cbiAgICAgICAgLy8gY29uc3QgdWludDE2ID0gVWludDE2QXJyYXkub2YoMCwgOCwgNDIsIC0xKTtcbiAgICAgICAgLy8gdC5kZWVwRXF1YWwoYXdhaXQgcmVtb3RlLmlkZW50aXR5VWludDE2KHVpbnQxNiksIHVpbnQxNik7XG5cbiAgICAgICAgLy8gY29uc3QgaW50MzIgPSBJbnQzMkFycmF5Lm9mKDAsIDgsIDQyLCAtMSk7XG4gICAgICAgIC8vIHQuZGVlcEVxdWFsKGF3YWl0IHJlbW90ZS5pZGVudGl0eUludDMyKGludDMyKSwgaW50MzIpO1xuXG4gICAgICAgIC8vIGNvbnN0IHVpbnQzMiA9IFVpbnQzMkFycmF5Lm9mKDAsIDgsIDQyLCAtMSk7XG4gICAgICAgIC8vIHQuZGVlcEVxdWFsKGF3YWl0IHJlbW90ZS5pZGVudGl0eVVpbnQzMih1aW50MzIpLCB1aW50MzIpO1xuXG4gICAgICAgIC8vIGNvbnN0IGZsb2F0MzIgPSBGbG9hdDMyQXJyYXkub2YoMCwgMC4zLCAxMDAuMDQyLCAtMSk7XG4gICAgICAgIC8vIHQuZGVlcEVxdWFsKGF3YWl0IHJlbW90ZS5pZGVudGl0eUZsb2F0MzIoZmxvYXQzMiksIGZsb2F0MzIpO1xuXG4gICAgICAgIC8vIGNvbnN0IGZsb2F0NjQgPSBGbG9hdDY0QXJyYXkub2YoMCwgMC4zLCAxMDAuMDQyLCAtMSk7XG4gICAgICAgIC8vIHQuZGVlcEVxdWFsKGF3YWl0IHJlbW90ZS5pZGVudGl0eUZsb2F0NjQoZmxvYXQ2NCksIGZsb2F0NjQpO1xuXG4gICAgICAgIC8vIGNvbnN0IG0gPSBuZXcgTWFwKFtcbiAgICAgICAgLy8gICAgIFsxLCAyXSxcbiAgICAgICAgLy8gICAgIFs0MiwgMTBdXG4gICAgICAgIC8vIF0pO1xuICAgICAgICAvLyB0LmRlZXBFcXVhbChhd2FpdCByZW1vdGUuaWRlbnRpdHlNYXAobSksIG0pO1xuXG4gICAgICAgIC8vIGNvbnN0IHMgPSBuZXcgU2V0KFsxLCA0MiwgMTAwXSk7XG4gICAgICAgIC8vIHQuZGVlcEVxdWFsKGF3YWl0IHJlbW90ZS5pZGVudGl0eVNldChzKSwgcyk7XG5cbiAgICAgICAgLy8gdHJ5IHtcbiAgICAgICAgLy8gICAgIGF3YWl0IHJlbW90ZS5lbXB0eVJlamVjdCgpO1xuICAgICAgICAvLyAgICAgdC5mYWlsKFwicmVtb3RlLmVtcHR5UmVqZWN0KCkgZGlkIG5vdCByZWplY3QgYXMgZXhwZWN0ZWRcIik7XG4gICAgICAgIC8vIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgIC8vICAgICB0LmlzKGVyciwgdW5kZWZpbmVkKTtcbiAgICAgICAgLy8gfVxuICAgICAgICAvLyB0cnkge1xuICAgICAgICAvLyAgICAgYXdhaXQgcmVtb3RlLnJlamVjdGVkKCk7XG4gICAgICAgIC8vICAgICB0LmZhaWwoXCJyZW1vdGUucmVqZWN0ZWQoKSBkaWQgbm90IHJlamVjdCBhcyBleHBlY3RlZFwiKTtcbiAgICAgICAgLy8gfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgLy8gICAgIHQuaXMoZXJyLCBcImludGVudGlvbmFsbHkgcmVqZWN0ZWRcIik7XG4gICAgICAgIC8vIH1cbiAgICAgICAgLy8gdHJ5IHtcbiAgICAgICAgLy8gICAgIGF3YWl0IHJlbW90ZS5jdXN0b21FcnJvcigpO1xuICAgICAgICAvLyAgICAgdC5mYWlsKFwicmVtb3RlLmN1c3RvbUVycm9yKCkgZGlkIG5vdCByZWplY3QgYXMgZXhwZWN0ZWRcIik7XG4gICAgICAgIC8vIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgIC8vICAgICB0LnRydWUoZXJyIGluc3RhbmNlb2YgRmFhc3RFcnJvcik7XG4gICAgICAgIC8vICAgICB0LnRydXRoeShlcnIubWVzc2FnZS5tYXRjaCgvXmN1c3RvbSBlcnJvciBtZXNzYWdlLykpO1xuICAgICAgICAvLyAgICAgdC5pcyhGYWFzdEVycm9yLmluZm8oZXJyKS5jdXN0b20sIFwiY3VzdG9tIHZhbHVlXCIpO1xuICAgICAgICAvLyB9XG4gICAgICAgIC8vIHQuaXMoYXdhaXQgcmVtb3RlLmdldEVudihcImZhYXN0RW52aXJvbm1lbnRWYXJpYWJsZVwiKSwgXCJ0aGVfYW5zd2VyX2lzXzQyXCIpO1xuICAgICAgICAvLyB0LmlzKGF3YWl0IHJlbW90ZS5nZXRFbnYoXCJmYWFzdE5vbmV4aXN0ZW50XCIpLCB1bmRlZmluZWQpO1xuICAgICAgICAvLyB0LmRlZXBFcXVhbChhd2FpdCByZW1vdGUucmV0dXJuc0Vycm9yKCksIGZ1bmNzLnJldHVybnNFcnJvcigpKTtcblxuICAgICAgICAvLyBjb25zdCBlbGVtZW50cyA9IFtcImJhclwiLCBcImJhelwiXTtcbiAgICAgICAgLy8gdC5kZWVwRXF1YWwoYXdhaXQgdG9BcnJheShyZW1vdGUuZ2VuZXJhdG9yKGVsZW1lbnRzKSksIGVsZW1lbnRzKTtcbiAgICAgICAgLy8gdC5kZWVwRXF1YWwoYXdhaXQgdG9BcnJheShyZW1vdGUuYXN5bmNHZW5lcmF0b3IoZWxlbWVudHMpKSwgZWxlbWVudHMpO1xuICAgICAgICAvLyB0cnkge1xuICAgICAgICAvLyAgICAgZm9yIGF3YWl0IChjb25zdCBfIG9mIHJlbW90ZS5hc3luY0dlbmVyYXRvckVycm9yKFwiYXN5bmMgZ2VuZXJhdG9yIGZhaWxlZFwiKSkge1xuICAgICAgICAvLyAgICAgICAgIC8vIGlnbm9yZVxuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyAgICAgdC5mYWlsKGByZW1vdGUuYXN5bmNHZW5lcmF0b3JFcnJvcigpIGRpZCBub3QgcmVqZWN0IGFzIGV4cGVjdGVkICgyKWApO1xuICAgICAgICAvLyB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICAvLyAgICAgdC50cnVlKGVyciBpbnN0YW5jZW9mIEZhYXN0RXJyb3IpO1xuICAgICAgICAvLyAgICAgdC50cnV0aHkoKGVyciBhcyBGYWFzdEVycm9yKS5tZXNzYWdlLm1hdGNoKC9eYXN5bmMgZ2VuZXJhdG9yIGZhaWxlZC8pKTtcbiAgICAgICAgLy8gfVxuICAgIH0gZmluYWxseSB7XG4gICAgICAgIGF3YWl0IGZhYXN0TW9kdWxlLmNsZWFudXAoKTtcbiAgICB9XG59XG5cbmZvciAoY29uc3QgcHJvdmlkZXIgb2YgcHJvdmlkZXJzKSB7XG4gICAgZm9yIChjb25zdCBjb25maWcgb2YgWy4uLmNvbmZpZ3MsIC4uLm5vVmFsaWRhdGVDb25maWdzXSkge1xuICAgICAgICB0ZXN0LnNlcmlhbChcbiAgICAgICAgICAgIHRpdGxlKHByb3ZpZGVyLCBgZXNtIGJhc2ljIGNhbGxzYCwgY29uZmlnKSxcbiAgICAgICAgICAgIHRlc3RCYXNpY0VzbSxcbiAgICAgICAgICAgIHByb3ZpZGVyLFxuICAgICAgICAgICAgY29uZmlnXG4gICAgICAgICk7XG4gICAgfVxufVxuIl19