UNPKG

faastjs

Version:

Serverless batch computing made simple.

305 lines 26 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getEnv = exports.returnSize = exports.allocate = exports.returnsError = exports.customError = exports.processExit = exports.consoleInfo = exports.consoleError = exports.consoleWarn = exports.consoleLog = exports.optionalArg = exports.infiniteLoop = exports.spin = exports.timer = exports.rejected = exports.emptyReject = exports.path = exports.async = exports.delayReject = exports.sleep = exports.noargs = exports.error = exports.concat = exports.fact = exports.hello = exports.asyncArrow = exports.arrow = exports.identitySet = exports.identityMap = exports.identityBigUint64 = exports.identityBigInt64 = exports.identityFloat64 = exports.identityFloat32 = exports.identityUint32 = exports.identityInt32 = exports.identityUint16 = exports.identityInt16 = exports.identityUint8Clamped = exports.identityUint8 = exports.identityInt8 = exports.identityArrayString = exports.identityArrayNum = exports.identityObject = exports.identityNull = exports.identityUndefined = exports.identityBool = exports.identityNum = exports.identityString = exports.empty = exports.test = void 0; exports.classReturn = exports.identityClass = exports.Cls = exports.identityDate = exports.identityBuffer = exports.functionReturn = exports.identityFunction = exports.promiseArg = exports.asyncGeneratorError = exports.asyncGeneratorDelay = exports.generateThenInfiniteLoop = exports.asyncGenerator = exports.generator = exports.monteCarloPI = void 0; function test() { return "Successfully called test function."; } exports.test = test; function empty() { } exports.empty = empty; function identityString(name) { return name; } exports.identityString = identityString; function identityNum(n) { return n; } exports.identityNum = identityNum; function identityBool(b) { return b; } exports.identityBool = identityBool; function identityUndefined(u) { return u; } exports.identityUndefined = identityUndefined; function identityNull(n) { return n; } exports.identityNull = identityNull; function identityObject(o) { return o; } exports.identityObject = identityObject; function identityArrayNum(n) { return n; } exports.identityArrayNum = identityArrayNum; function identityArrayString(s) { return s; } exports.identityArrayString = identityArrayString; function identityInt8(a) { return a; } exports.identityInt8 = identityInt8; function identityUint8(a) { return a; } exports.identityUint8 = identityUint8; function identityUint8Clamped(a) { return a; } exports.identityUint8Clamped = identityUint8Clamped; function identityInt16(a) { return a; } exports.identityInt16 = identityInt16; function identityUint16(a) { return a; } exports.identityUint16 = identityUint16; function identityInt32(a) { return a; } exports.identityInt32 = identityInt32; function identityUint32(a) { return a; } exports.identityUint32 = identityUint32; function identityFloat32(a) { return a; } exports.identityFloat32 = identityFloat32; function identityFloat64(a) { return a; } exports.identityFloat64 = identityFloat64; function identityBigInt64(a) { return a; } exports.identityBigInt64 = identityBigInt64; function identityBigUint64(a) { return a; } exports.identityBigUint64 = identityBigUint64; function identityMap(m) { return m; } exports.identityMap = identityMap; function identitySet(s) { return s; } exports.identitySet = identitySet; const arrow = (str) => str; exports.arrow = arrow; const asyncArrow = async (str) => str; exports.asyncArrow = asyncArrow; function hello(name) { return `Hello ${name}!`; } exports.hello = hello; function fact(n) { return n <= 1 ? 1 : n * fact(n - 1); } exports.fact = fact; function concat(a, b) { return a + b; } exports.concat = concat; function error(a) { throw new Error(`Expected error. Arg: ${a}`); } exports.error = error; function noargs() { return "called function with no args."; } exports.noargs = noargs; function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } exports.sleep = sleep; function delayReject(ms) { return new Promise((_, reject) => setTimeout(reject, ms)); } exports.delayReject = delayReject; async function async() { await sleep(200); return "async function: success"; } exports.async = async; function path() { return sleep(200).then(() => process.env.PATH || "no PATH variable"); } exports.path = path; function emptyReject() { return Promise.reject(); } exports.emptyReject = emptyReject; function rejected() { return Promise.reject("intentionally rejected"); } exports.rejected = rejected; async function timer(delayMs) { const start = Date.now(); await sleep(delayMs); const end = Date.now(); return { start, end }; } exports.timer = timer; function spin(ms) { const start = Date.now(); while (true) { if (Date.now() - start >= ms) { break; } } const end = Date.now(); return { start, end }; } exports.spin = spin; function infiniteLoop() { while (true) { } } exports.infiniteLoop = infiniteLoop; function optionalArg(arg) { return arg ? arg : "No arg"; } exports.optionalArg = optionalArg; function consoleLog(str) { console.log(str); } exports.consoleLog = consoleLog; function consoleWarn(str) { console.warn(str); } exports.consoleWarn = consoleWarn; function consoleError(str) { console.error(str); } exports.consoleError = consoleError; function consoleInfo(str) { console.info(str); } exports.consoleInfo = consoleInfo; function processExit(code) { process.exit(code); } exports.processExit = processExit; class CustomError extends Error { constructor(message, custom) { super(message); this.custom = custom; } } function customError() { throw new CustomError("custom error message", "custom value"); } exports.customError = customError; function returnsError() { return new Error("a returned non-thrown error"); } exports.returnsError = returnsError; async function allocate(bytes) { const array = new Array(bytes / 8); const elems = array.length; for (let i = 0; i < elems; i++) { array[i] = i; } console.log(`allocated: %O`, { bytes, elems }); console.log(`post allocate memory usage: %O`, process.memoryUsage()); await sleep(1000); console.log(`Returning from allocate`); return { bytes, elems }; } exports.allocate = allocate; function returnSize(size) { // return a string of size characters const str = "a".repeat(size); return str; } exports.returnSize = returnSize; function getEnv(key) { return process.env[key]; } exports.getEnv = getEnv; function monteCarloPI(samples) { let inside = 0; for (let n = 0; n < samples; n++) { const [x, y] = [Math.random(), Math.random()]; if (x ** 2 + y ** 2 <= 1) { inside++; } } return { inside, samples }; } exports.monteCarloPI = monteCarloPI; function* generator(args) { yield* args; } exports.generator = generator; async function* asyncGenerator(args) { yield* args; } exports.asyncGenerator = asyncGenerator; async function* generateThenInfiniteLoop(arg) { yield arg; while (true) { } } exports.generateThenInfiniteLoop = generateThenInfiniteLoop; async function* asyncGeneratorDelay(args, delay) { for (const arg of args) { await sleep(delay); yield arg; } } exports.asyncGeneratorDelay = asyncGeneratorDelay; async function* asyncGeneratorError(msg) { yield 1; throw new Error(msg); } exports.asyncGeneratorError = asyncGeneratorError; /** * Not supported. * @remarks * Examples of functions arguments or return values that are not supported. */ function promiseArg(promise) { return promise; } exports.promiseArg = promiseArg; function identityFunction(fn) { return fn; } exports.identityFunction = identityFunction; function functionReturn() { return () => { console.log("returned a function"); }; } exports.functionReturn = functionReturn; function identityBuffer(buf) { return buf; } exports.identityBuffer = identityBuffer; function identityDate(arg) { return arg; } exports.identityDate = identityDate; class Cls { constructor() { } } exports.Cls = Cls; function identityClass(arg) { return arg; } exports.identityClass = identityClass; function classReturn() { return new Cls(); } exports.classReturn = classReturn; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVuY3Rpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdGVzdC9maXh0dXJlcy9mdW5jdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLFNBQWdCLElBQUk7SUFDaEIsT0FBTyxvQ0FBb0MsQ0FBQztBQUNoRCxDQUFDO0FBRkQsb0JBRUM7QUFFRCxTQUFnQixLQUFLLEtBQUksQ0FBQztBQUExQixzQkFBMEI7QUFFMUIsU0FBZ0IsY0FBYyxDQUFDLElBQVk7SUFDdkMsT0FBTyxJQUFJLENBQUM7QUFDaEIsQ0FBQztBQUZELHdDQUVDO0FBQ0QsU0FBZ0IsV0FBVyxDQUFDLENBQVM7SUFDakMsT0FBTyxDQUFDLENBQUM7QUFDYixDQUFDO0FBRkQsa0NBRUM7QUFDRCxTQUFnQixZQUFZLENBQUMsQ0FBVTtJQUNuQyxPQUFPLENBQUMsQ0FBQztBQUNiLENBQUM7QUFGRCxvQ0FFQztBQUNELFNBQWdCLGlCQUFpQixDQUFDLENBQVk7SUFDMUMsT0FBTyxDQUFDLENBQUM7QUFDYixDQUFDO0FBRkQsOENBRUM7QUFDRCxTQUFnQixZQUFZLENBQUMsQ0FBTztJQUNoQyxPQUFPLENBQUMsQ0FBQztBQUNiLENBQUM7QUFGRCxvQ0FFQztBQUNELFNBQWdCLGNBQWMsQ0FBQyxDQUFTO0lBQ3BDLE9BQU8sQ0FBQyxDQUFDO0FBQ2IsQ0FBQztBQUZELHdDQUVDO0FBQ0QsU0FBZ0IsZ0JBQWdCLENBQUMsQ0FBVztJQUN4QyxPQUFPLENBQUMsQ0FBQztBQUNiLENBQUM7QUFGRCw0Q0FFQztBQUNELFNBQWdCLG1CQUFtQixDQUFDLENBQVc7SUFDM0MsT0FBTyxDQUFDLENBQUM7QUFDYixDQUFDO0FBRkQsa0RBRUM7QUFDRCxTQUFnQixZQUFZLENBQUMsQ0FBWTtJQUNyQyxPQUFPLENBQUMsQ0FBQztBQUNiLENBQUM7QUFGRCxvQ0FFQztBQUNELFNBQWdCLGFBQWEsQ0FBQyxDQUFhO0lBQ3ZDLE9BQU8sQ0FBQyxDQUFDO0FBQ2Is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RUM7QUFFRCxTQUFnQixjQUFjO0lBQzFCLE9BQU8sR0FBRyxFQUFFO1FBQ1IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0lBQ3ZDLENBQUMsQ0FBQztBQUNOLENBQUM7QUFKRCx3Q0FJQztBQUVELFNBQWdCLGNBQWMsQ0FBQyxHQUFXO0lBQ3RDLE9BQU8sR0FBRyxDQUFDO0FBQ2YsQ0FBQztBQUZELHdDQUVDO0FBRUQsU0FBZ0IsWUFBWSxDQUFDLEdBQVM7SUFDbEMsT0FBTyxHQUFHLENBQUM7QUFDZixDQUFDO0FBRkQsb0NBRUM7QUFFRCxNQUFhLEdBQUc7SUFDWixnQkFBZSxDQUFDO0NBQ25CO0FBRkQsa0JBRUM7QUFFRCxTQUFnQixhQUFhLENBQUMsR0FBUTtJQUNsQyxPQUFPLEdBQUcsQ0FBQztBQUNmLENBQUM7QUFGRCxzQ0FFQztBQUVELFNBQWdCLFdBQVc7SUFDdkIsT0FBTyxJQUFJLEdBQUcsRUFBRSxDQUFDO0FBQ3JCLENBQUM7QUFGRCxrQ0FFQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBmdW5jdGlvbiB0ZXN0KCkge1xuICAgIHJldHVybiBcIlN1Y2Nlc3NmdWxseSBjYWxsZWQgdGVzdCBmdW5jdGlvbi5cIjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVtcHR5KCkge31cblxuZXhwb3J0IGZ1bmN0aW9uIGlkZW50aXR5U3RyaW5nKG5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiBuYW1lO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlkZW50aXR5TnVtKG46IG51bWJlcikge1xuICAgIHJldHVybiBuO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlkZW50aXR5Qm9vbChiOiBib29sZWFuKSB7XG4gICAgcmV0dXJuIGI7XG59XG5leHBvcnQgZnVuY3Rpb24gaWRlbnRpdHlVbmRlZmluZWQodTogdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHU7XG59XG5leHBvcnQgZnVuY3Rpb24gaWRlbnRpdHlOdWxsKG46IG51bGwpIHtcbiAgICByZXR1cm4gbjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpZGVudGl0eU9iamVjdChvOiBvYmplY3QpIHtcbiAgICByZXR1cm4gbztcbn1cbmV4cG9ydCBmdW5jdGlvbiBpZGVudGl0eUFycmF5TnVtKG46IG51bWJlcltdKSB7XG4gICAgcmV0dXJuIG47XG59XG5leHBvcnQgZnVuY3Rpb24gaWRlbnRpdHlBcnJheVN0cmluZyhzOiBzdHJpbmdbXSkge1xuICAgIHJldHVybiBzO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlkZW50aXR5SW50OChhOiBJbnQ4QXJyYXkpIHtcbiAgICByZXR1cm4gYTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpZGVudGl0eVVpbnQ4KGE6IFVpbnQ4QXJyYXkpIHtcbiAgICByZXR1cm4gYTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpZGVudGl0eVVpbnQ4Q2xhbXBlZChhOiBVaW50OENsYW1wZWRBcnJheSkge1xuICAgIHJldHVybiBhO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlkZW50aXR5SW50MTYoYTogSW50MTZBcnJheSkge1xuICAgIHJldHVybiBhO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlkZW50aXR5VWludDE2KGE6IFVpbnQxNkFycmF5KSB7XG4gICAgcmV0dXJuIGE7XG59XG5leHBvcnQgZnVuY3Rpb24gaWRlbnRpdHlJbnQzMihhOiBJbnQzMkFycmF5KSB7XG4gICAgcmV0dXJuIGE7XG59XG5leHBvcnQgZnVuY3Rpb24gaWRlbnRpdHlVaW50MzIoYTogVWludDMyQXJyYXkpIHtcbiAgICByZXR1cm4gYTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpZGVudGl0eUZsb2F0MzIoYTogRmxvYXQzMkFycmF5KSB7XG4gICAgcmV0dXJuIGE7XG59XG5leHBvcnQgZnVuY3Rpb24gaWRlbnRpdHlGbG9hdDY0KGE6IEZsb2F0NjRBcnJheSkge1xuICAgIHJldHVybiBhO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlkZW50aXR5QmlnSW50NjQoYTogQmlnSW50NjRBcnJheSkge1xuICAgIHJldHVybiBhO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlkZW50aXR5QmlnVWludDY0KGE6IEJpZ1VpbnQ2NEFycmF5KSB7XG4gICAgcmV0dXJuIGE7XG59XG5leHBvcnQgZnVuY3Rpb24gaWRlbnRpdHlNYXAobTogTWFwPG51bWJlciwgbnVtYmVyPikge1xuICAgIHJldHVybiBtO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlkZW50aXR5U2V0KHM6IFNldDxudW1iZXI+KSB7XG4gICAgcmV0dXJuIHM7XG59XG5cbmV4cG9ydCBjb25zdCBhcnJvdyA9IChzdHI6IHN0cmluZykgPT4gc3RyO1xuXG5leHBvcnQgY29uc3QgYXN5bmNBcnJvdyA9IGFzeW5jIChzdHI6IHN0cmluZykgPT4gc3RyO1xuXG5leHBvcnQgZnVuY3Rpb24gaGVsbG8obmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGBIZWxsbyAke25hbWV9IWA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmYWN0KG46IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIG4gPD0gMSA/IDEgOiBuICogZmFjdChuIC0gMSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb25jYXQoYTogc3RyaW5nLCBiOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYSArIGI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlcnJvcihhOiBzdHJpbmcpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGVycm9yLiBBcmc6ICR7YX1gKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vYXJncygpIHtcbiAgICByZXR1cm4gXCJjYWxsZWQgZnVuY3Rpb24gd2l0aCBubyBhcmdzLlwiO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2xlZXAobXM6IG51bWJlcikge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPihyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlbGF5UmVqZWN0KG1zOiBudW1iZXIpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKF8sIHJlamVjdCkgPT4gc2V0VGltZW91dChyZWplY3QsIG1zKSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhc3luYygpIHtcbiAgICBhd2FpdCBzbGVlcCgyMDApO1xuICAgIHJldHVybiBcImFzeW5jIGZ1bmN0aW9uOiBzdWNjZXNzXCI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXRoKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHNsZWVwKDIwMCkudGhlbigoKSA9PiBwcm9jZXNzLmVudi5QQVRIIHx8IFwibm8gUEFUSCB2YXJpYWJsZVwiKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVtcHR5UmVqZWN0KCkge1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdCgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVqZWN0ZWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KFwiaW50ZW50aW9uYWxseSByZWplY3RlZFwiKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUaW1pbmcge1xuICAgIHN0YXJ0OiBudW1iZXI7XG4gICAgZW5kOiBudW1iZXI7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0aW1lcihkZWxheU1zOiBudW1iZXIpOiBQcm9taXNlPFRpbWluZz4ge1xuICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICBhd2FpdCBzbGVlcChkZWxheU1zKTtcbiAgICBjb25zdCBlbmQgPSBEYXRlLm5vdygpO1xuICAgIHJldHVybiB7IHN0YXJ0LCBlbmQgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNwaW4obXM6IG51bWJlcik6IFRpbWluZyB7XG4gICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIGlmIChEYXRlLm5vdygpIC0gc3RhcnQgPj0gbXMpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGVuZCA9IERhdGUubm93KCk7XG4gICAgcmV0dXJuIHsgc3RhcnQsIGVuZCB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5maW5pdGVMb29wKCkge1xuICAgIHdoaWxlICh0cnVlKSB7fVxufVxuXG5leHBvcnQgZnVuY3Rpb24gb3B0aW9uYWxBcmcoYXJnPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGFyZyA/IGFyZyA6IFwiTm8gYXJnXCI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb25zb2xlTG9nKHN0cjogc3RyaW5nKSB7XG4gICAgY29uc29sZS5sb2coc3RyKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnNvbGVXYXJuKHN0cjogc3RyaW5nKSB7XG4gICAgY29uc29sZS53YXJuKHN0cik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb25zb2xlRXJyb3Ioc3RyOiBzdHJpbmcpIHtcbiAgICBjb25zb2xlLmVycm9yKHN0cik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb25zb2xlSW5mbyhzdHI6IHN0cmluZykge1xuICAgIGNvbnNvbGUuaW5mbyhzdHIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJvY2Vzc0V4aXQoY29kZT86IG51bWJlcikge1xuICAgIHByb2Nlc3MuZXhpdChjb2RlKTtcbn1cblxuY2xhc3MgQ3VzdG9tRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nLCBwdWJsaWMgY3VzdG9tOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3VzdG9tRXJyb3IoKSB7XG4gICAgdGhyb3cgbmV3IEN1c3RvbUVycm9yKFwiY3VzdG9tIGVycm9yIG1lc3NhZ2VcIiwgXCJjdXN0b20gdmFsdWVcIik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXR1cm5zRXJyb3IoKSB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihcImEgcmV0dXJuZWQgbm9uLXRocm93biBlcnJvclwiKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFsbG9jYXRlKGJ5dGVzOiBudW1iZXIpIHtcbiAgICBjb25zdCBhcnJheSA9IG5ldyBBcnJheShieXRlcyAvIDgpO1xuICAgIGNvbnN0IGVsZW1zID0gYXJyYXkubGVuZ3RoO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWxlbXM7IGkrKykge1xuICAgICAgICBhcnJheVtpXSA9IGk7XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKGBhbGxvY2F0ZWQ6ICVPYCwgeyBieXRlcywgZWxlbXMgfSk7XG4gICAgY29uc29sZS5sb2coYHBvc3QgYWxsb2NhdGUgbWVtb3J5IHVzYWdlOiAlT2AsIHByb2Nlc3MubWVtb3J5VXNhZ2UoKSk7XG4gICAgYXdhaXQgc2xlZXAoMTAwMCk7XG4gICAgY29uc29sZS5sb2coYFJldHVybmluZyBmcm9tIGFsbG9jYXRlYCk7XG4gICAgcmV0dXJuIHsgYnl0ZXMsIGVsZW1zIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXR1cm5TaXplKHNpemU6IG51bWJlcikge1xuICAgIC8vIHJldHVybiBhIHN0cmluZyBvZiBzaXplIGNoYXJhY3RlcnNcbiAgICBjb25zdCBzdHIgPSBcImFcIi5yZXBlYXQoc2l6ZSk7XG4gICAgcmV0dXJuIHN0cjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEVudihrZXk6IHN0cmluZykge1xuICAgIHJldHVybiBwcm9jZXNzLmVudltrZXldO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1vbnRlQ2FybG9SZXR1cm4ge1xuICAgIGluc2lkZTogbnVtYmVyO1xuICAgIHNhbXBsZXM6IG51bWJlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1vbnRlQ2FybG9QSShzYW1wbGVzOiBudW1iZXIpOiBNb250ZUNhcmxvUmV0dXJuIHtcbiAgICBsZXQgaW5zaWRlID0gMDtcbiAgICBmb3IgKGxldCBuID0gMDsgbiA8IHNhbXBsZXM7IG4rKykge1xuICAgICAgICBjb25zdCBbeCwgeV0gPSBbTWF0aC5yYW5kb20oKSwgTWF0aC5yYW5kb20oKV07XG4gICAgICAgIGlmICh4ICoqIDIgKyB5ICoqIDIgPD0gMSkge1xuICAgICAgICAgICAgaW5zaWRlKys7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgaW5zaWRlLFxuICAgICAgICBzYW1wbGVzXG4gICAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uKiBnZW5lcmF0b3IoYXJnczogc3RyaW5nW10pIHtcbiAgICB5aWVsZCogYXJncztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uKiBhc3luY0dlbmVyYXRvcihhcmdzOiBzdHJpbmdbXSkge1xuICAgIHlpZWxkKiBhcmdzO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24qIGdlbmVyYXRlVGhlbkluZmluaXRlTG9vcChhcmc6IHN0cmluZykge1xuICAgIHlpZWxkIGFyZztcbiAgICB3aGlsZSAodHJ1ZSkge31cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uKiBhc3luY0dlbmVyYXRvckRlbGF5KGFyZ3M6IHN0cmluZ1tdLCBkZWxheTogbnVtYmVyKSB7XG4gICAgZm9yIChjb25zdCBhcmcgb2YgYXJncykge1xuICAgICAgICBhd2FpdCBzbGVlcChkZWxheSk7XG4gICAgICAgIHlpZWxkIGFyZztcbiAgICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiogYXN5bmNHZW5lcmF0b3JFcnJvcihtc2c6IHN0cmluZykge1xuICAgIHlpZWxkIDE7XG4gICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG59XG5cbi8qKlxuICogTm90IHN1cHBvcnRlZC5cbiAqIEByZW1hcmtzXG4gKiBFeGFtcGxlcyBvZiBmdW5jdGlvbnMgYXJndW1lbnRzIG9yIHJldHVybiB2YWx1ZXMgdGhhdCBhcmUgbm90IHN1cHBvcnRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb21pc2VBcmcocHJvbWlzZTogUHJvbWlzZTxhbnk+KSB7XG4gICAgcmV0dXJuIHByb21pc2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZGVudGl0eUZ1bmN0aW9uKGZuOiAoKSA9PiB2b2lkKSB7XG4gICAgcmV0dXJuIGZuO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZnVuY3Rpb25SZXR1cm4oKSB7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coXCJyZXR1cm5lZCBhIGZ1bmN0aW9uXCIpO1xuICAgIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZGVudGl0eUJ1ZmZlcihidWY6IEJ1ZmZlcikge1xuICAgIHJldHVybiBidWY7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZGVudGl0eURhdGUoYXJnOiBEYXRlKSB7XG4gICAgcmV0dXJuIGFyZztcbn1cblxuZXhwb3J0IGNsYXNzIENscyB7XG4gICAgY29uc3RydWN0b3IoKSB7fVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaWRlbnRpdHlDbGFzcyhhcmc6IENscykge1xuICAgIHJldHVybiBhcmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGFzc1JldHVybigpIHtcbiAgICByZXR1cm4gbmV3IENscygpO1xufVxuIl19