UNPKG

@neo-one/smart-contract-compiler

Version:

NEO•ONE TypeScript smart contract compiler.

153 lines (151 loc) 26 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const tslib_1 = require("tslib"); const ts_utils_1 = require("@neo-one/ts-utils"); const lodash_1 = tslib_1.__importDefault(require("lodash")); const typescript_1 = tslib_1.__importDefault(require("typescript")); const DiagnosticCode_1 = require("../../../DiagnosticCode"); const DiagnosticMessage_1 = require("../../../DiagnosticMessage"); const constants_1 = require("../../constants"); const Helper_1 = require("../Helper"); const types_1 = require("../types"); class ArgumentsHelper extends Helper_1.Helper { emit(sb, node, optionsIn) { const options = sb.pushValueOptions(optionsIn); const args = typescript_1.default.isArrayLiteralExpression(node) ? ts_utils_1.tsUtils.expression.getElements(node) : ts_utils_1.tsUtils.argumented.getArgumentsArray(node); if (!typescript_1.default.isArrayLiteralExpression(node) && args.length > 0) { const signatureTypes = sb.context.analysis.extractSignaturesForCall(node, { error: true }); if (signatureTypes !== undefined) { args.forEach((arg, idx) => { const argType = sb.context.analysis.getType(arg); if (argType !== undefined) { const mismatch = signatureTypes.some(({ paramDecls, paramTypes }) => { const paramDecl = paramDecls[Math.min(idx, paramDecls.length - 1)]; let paramTypeIn = paramTypes.get(paramDecl); if (paramTypeIn !== undefined && ts_utils_1.tsUtils.parameter.isRestParameter(paramDecl)) { paramTypeIn = ts_utils_1.tsUtils.type_.getArrayType(paramTypeIn); } const paramType = paramTypeIn; const hasBuiltins = types_1.getHasBuiltins(sb.context, arg, argType); return (paramType === undefined || hasBuiltins.some((hasBuiltin) => !hasBuiltin(sb.context, paramDecl, paramType))); }); if (mismatch) { sb.context.reportError(arg, DiagnosticCode_1.DiagnosticCode.InvalidBuiltinUsage, DiagnosticMessage_1.DiagnosticMessage.InvalidBuiltinCallArgument); } } }); } } if (args.some((arg) => typescript_1.default.isSpreadElement(arg))) { sb.emitPushInt(node, 0); sb.emitOp(node, 'NEWARRAY'); args.forEach((arg) => { const handleArrayLike = () => { sb.emitOp(arg, 'TUCK'); sb.emitOp(arg, 'SWAP'); sb.emitOp(arg, 'APPEND'); }; const handleArray = (innerOptions) => { sb.emitHelper(arg, innerOptions, sb.helpers.unwrapArray); sb.emitOp(arg, 'SWAP'); sb.emitHelper(arg, innerOptions, sb.helpers.arrReduce({ each: handleArrayLike, })); }; const handleMapLike = (innerOption) => { sb.emitOp(arg, 'ROT'); sb.emitOp(arg, 'ROT'); sb.emitPushInt(arg, 2); sb.emitOp(arg, 'PACK'); sb.emitHelper(arg, innerOption, sb.helpers.wrapArray); sb.emitOp(arg, 'OVER'); sb.emitOp(arg, 'SWAP'); sb.emitOp(arg, 'APPEND'); }; const handleMap = (innerOptions) => { sb.emitHelper(arg, innerOptions, sb.helpers.unwrapMap); sb.emitOp(arg, 'SWAP'); sb.emitHelper(arg, innerOptions, sb.helpers.mapReduce({ each: handleMapLike, })); }; const handleSetLike = () => { sb.emitOp(arg, 'ROT'); sb.emitOp(arg, 'DROP'); sb.emitOp(arg, 'TUCK'); sb.emitOp(arg, 'SWAP'); sb.emitOp(arg, 'APPEND'); }; const handleSet = (innerOptions) => { sb.emitHelper(arg, innerOptions, sb.helpers.unwrapSet); sb.emitOp(arg, 'SWAP'); sb.emitHelper(arg, innerOptions, sb.helpers.mapReduce({ each: handleSetLike, })); }; const handleArrayStorage = (innerOptions) => { sb.emitOp(arg, 'SWAP'); sb.emitHelper(arg, innerOptions, sb.helpers.structuredStorageReduceVal({ type: constants_1.Types.ArrayStorage, each: handleArrayLike, })); }; const handleMapStorage = (innerOptions) => { sb.emitOp(arg, 'SWAP'); sb.emitHelper(arg, innerOptions, sb.helpers.structuredStorageReduce({ type: constants_1.Types.MapStorage, each: handleMapLike, })); }; const handleSetStorage = (innerOptions) => { sb.emitOp(arg, 'SWAP'); sb.emitHelper(arg, innerOptions, sb.helpers.structuredStorageReduce({ type: constants_1.Types.SetStorage, each: handleSetLike, })); }; const handleIterableIterator = (innerOptions) => { sb.emitOp(arg, 'SWAP'); sb.emitHelper(arg, innerOptions, sb.helpers.iterableIteratorReduce({ each: handleArrayLike, })); }; if (typescript_1.default.isSpreadElement(arg)) { const expr = ts_utils_1.tsUtils.expression.getExpression(arg); sb.visit(expr, options); sb.emitHelper(arg, options, sb.helpers.forIterableType({ type: sb.context.analysis.getType(expr), array: handleArray, map: handleMap, set: handleSet, arrayStorage: handleArrayStorage, mapStorage: handleMapStorage, setStorage: handleSetStorage, iterableIterator: handleIterableIterator, })); } else { sb.emitOp(node, 'DUP'); sb.visit(arg, options); sb.emitOp(node, 'APPEND'); } }); } else { const reversedElements = lodash_1.default.reverse([...args]); reversedElements.forEach((arg) => { sb.visit(arg, options); }); sb.emitPushInt(node, args.length); sb.emitOp(node, 'PACK'); } if (!optionsIn.pushValue) { sb.emitOp(node, 'DROP'); } } } exports.ArgumentsHelper = ArgumentsHelper; //# sourceMappingURL=data:application/json;charset=utf8;base64,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QzVCLGdCQUFnQixFQUFFLHNCQUFzQjtxQkFDekMsQ0FBQyxDQUNILENBQUM7aUJBQ0g7cUJBQU07b0JBRUwsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7b0JBRXZCLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO29CQUV2QixFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztpQkFDM0I7WUFDSCxDQUFDLENBQUMsQ0FBQztTQUNKO2FBQU07WUFDTCxNQUFNLGdCQUFnQixHQUFHLGdCQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQzlDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUMvQixFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUN6QixDQUFDLENBQUMsQ0FBQztZQUVILEVBQUUsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUVsQyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztTQUN6QjtRQUVELElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFO1lBQ3hCLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1NBQ3pCO0lBQ0gsQ0FBQztDQUNGO0FBcE9ELDBDQW9PQyIsImZpbGUiOiJuZW8tb25lLXNtYXJ0LWNvbnRyYWN0LWNvbXBpbGVyL3NyYy9jb21waWxlL2hlbHBlci9mdW5jdGlvbi9Bcmd1bWVudHNIZWxwZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0c1V0aWxzIH0gZnJvbSAnQG5lby1vbmUvdHMtdXRpbHMnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB0cyBmcm9tICd0eXBlc2NyaXB0JztcbmltcG9ydCB7IERpYWdub3N0aWNDb2RlIH0gZnJvbSAnLi4vLi4vLi4vRGlhZ25vc3RpY0NvZGUnO1xuaW1wb3J0IHsgRGlhZ25vc3RpY01lc3NhZ2UgfSBmcm9tICcuLi8uLi8uLi9EaWFnbm9zdGljTWVzc2FnZSc7XG5pbXBvcnQgeyBUeXBlcyB9IGZyb20gJy4uLy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBTY3JpcHRCdWlsZGVyIH0gZnJvbSAnLi4vLi4vc2InO1xuaW1wb3J0IHsgVmlzaXRPcHRpb25zIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgSGVscGVyIH0gZnJvbSAnLi4vSGVscGVyJztcbmltcG9ydCB7IGdldEhhc0J1aWx0aW5zIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG4vLyBJbnB1dDogW11cbi8vIE91dHB1dDogW2FyZ3NBcnJheV1cbmV4cG9ydCBjbGFzcyBBcmd1bWVudHNIZWxwZXIgZXh0ZW5kcyBIZWxwZXI8dHMuQ2FsbEV4cHJlc3Npb24gfCB0cy5OZXdFeHByZXNzaW9uIHwgdHMuQXJyYXlMaXRlcmFsRXhwcmVzc2lvbj4ge1xuICBwdWJsaWMgZW1pdChcbiAgICBzYjogU2NyaXB0QnVpbGRlcixcbiAgICBub2RlOiB0cy5DYWxsRXhwcmVzc2lvbiB8IHRzLk5ld0V4cHJlc3Npb24gfCB0cy5BcnJheUxpdGVyYWxFeHByZXNzaW9uLFxuICAgIG9wdGlvbnNJbjogVmlzaXRPcHRpb25zLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBvcHRpb25zID0gc2IucHVzaFZhbHVlT3B0aW9ucyhvcHRpb25zSW4pO1xuICAgIGNvbnN0IGFyZ3MgPSB0cy5pc0FycmF5TGl0ZXJhbEV4cHJlc3Npb24obm9kZSlcbiAgICAgID8gdHNVdGlscy5leHByZXNzaW9uLmdldEVsZW1lbnRzKG5vZGUpXG4gICAgICA6IHRzVXRpbHMuYXJndW1lbnRlZC5nZXRBcmd1bWVudHNBcnJheShub2RlKTtcbiAgICBpZiAoIXRzLmlzQXJyYXlMaXRlcmFsRXhwcmVzc2lvbihub2RlKSAmJiBhcmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHNpZ25hdHVyZVR5cGVzID0gc2IuY29udGV4dC5hbmFseXNpcy5leHRyYWN0U2lnbmF0dXJlc0ZvckNhbGwobm9kZSwgeyBlcnJvcjogdHJ1ZSB9KTtcblxuICAgICAgaWYgKHNpZ25hdHVyZVR5cGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYXJncy5mb3JFYWNoKChhcmcsIGlkeCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGFyZ1R5cGUgPSBzYi5jb250ZXh0LmFuYWx5c2lzLmdldFR5cGUoYXJnKTtcbiAgICAgICAgICBpZiAoYXJnVHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCBtaXNtYXRjaCA9IHNpZ25hdHVyZVR5cGVzLnNvbWUoKHsgcGFyYW1EZWNscywgcGFyYW1UeXBlcyB9KSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHBhcmFtRGVjbCA9IHBhcmFtRGVjbHNbTWF0aC5taW4oaWR4LCBwYXJhbURlY2xzLmxlbmd0aCAtIDEpXTtcbiAgICAgICAgICAgICAgbGV0IHBhcmFtVHlwZUluID0gcGFyYW1UeXBlcy5nZXQocGFyYW1EZWNsKTtcbiAgICAgICAgICAgICAgaWYgKHBhcmFtVHlwZUluICE9PSB1bmRlZmluZWQgJiYgdHNVdGlscy5wYXJhbWV0ZXIuaXNSZXN0UGFyYW1ldGVyKHBhcmFtRGVjbCkpIHtcbiAgICAgICAgICAgICAgICBwYXJhbVR5cGVJbiA9IHRzVXRpbHMudHlwZV8uZ2V0QXJyYXlUeXBlKHBhcmFtVHlwZUluKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCBwYXJhbVR5cGUgPSBwYXJhbVR5cGVJbjtcbiAgICAgICAgICAgICAgY29uc3QgaGFzQnVpbHRpbnMgPSBnZXRIYXNCdWlsdGlucyhzYi5jb250ZXh0LCBhcmcsIGFyZ1R5cGUpO1xuXG4gICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgcGFyYW1UeXBlID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICAgICBoYXNCdWlsdGlucy5zb21lKChoYXNCdWlsdGluKSA9PiAhaGFzQnVpbHRpbihzYi5jb250ZXh0LCBwYXJhbURlY2wsIHBhcmFtVHlwZSkpXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKG1pc21hdGNoKSB7XG4gICAgICAgICAgICAgIHNiLmNvbnRleHQucmVwb3J0RXJyb3IoXG4gICAgICAgICAgICAgICAgYXJnLFxuICAgICAgICAgICAgICAgIERpYWdub3N0aWNDb2RlLkludmFsaWRCdWlsdGluVXNhZ2UsXG4gICAgICAgICAgICAgICAgRGlhZ25vc3RpY01lc3NhZ2UuSW52YWxpZEJ1aWx0aW5DYWxsQXJndW1lbnQsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoYXJncy5zb21lKChhcmcpID0+IHRzLmlzU3ByZWFkRWxlbWVudChhcmcpKSkge1xuICAgICAgLy8gWzBdXG4gICAgICBzYi5lbWl0UHVzaEludChub2RlLCAwKTtcbiAgICAgIC8vIFthcnJdXG4gICAgICBzYi5lbWl0T3Aobm9kZSwgJ05FV0FSUkFZJyk7XG4gICAgICAvLyBbYXJyXVxuICAgICAgYXJncy5mb3JFYWNoKChhcmcpID0+IHtcbiAgICAgICAgY29uc3QgaGFuZGxlQXJyYXlMaWtlID0gKCkgPT4ge1xuICAgICAgICAgIC8vIFthcnJPdXQsIHZhbCwgYXJyT3V0XVxuICAgICAgICAgIHNiLmVtaXRPcChhcmcsICdUVUNLJyk7XG4gICAgICAgICAgLy8gW3ZhbCwgYXJyT3V0LCBhcnJPdXRdXG4gICAgICAgICAgc2IuZW1pdE9wKGFyZywgJ1NXQVAnKTtcbiAgICAgICAgICAvLyBbYXJyT3V0XVxuICAgICAgICAgIHNiLmVtaXRPcChhcmcsICdBUFBFTkQnKTtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBoYW5kbGVBcnJheSA9IChpbm5lck9wdGlvbnM6IFZpc2l0T3B0aW9ucykgPT4ge1xuICAgICAgICAgIC8vIFthcnIsIGFyck91dF1cbiAgICAgICAgICBzYi5lbWl0SGVscGVyKGFyZywgaW5uZXJPcHRpb25zLCBzYi5oZWxwZXJzLnVud3JhcEFycmF5KTtcbiAgICAgICAgICAvLyBbYXJyT3V0LCBhcnJdXG4gICAgICAgICAgc2IuZW1pdE9wKGFyZywgJ1NXQVAnKTtcbiAgICAgICAgICBzYi5lbWl0SGVscGVyKFxuICAgICAgICAgICAgYXJnLFxuICAgICAgICAgICAgaW5uZXJPcHRpb25zLFxuICAgICAgICAgICAgc2IuaGVscGVycy5hcnJSZWR1Y2Uoe1xuICAgICAgICAgICAgICBlYWNoOiBoYW5kbGVBcnJheUxpa2UsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGhhbmRsZU1hcExpa2UgPSAoaW5uZXJPcHRpb246IFZpc2l0T3B0aW9ucykgPT4ge1xuICAgICAgICAgIC8vIFt2YWx1ZSwgYXJyT3V0LCBrZXldXG4gICAgICAgICAgc2IuZW1pdE9wKGFyZywgJ1JPVCcpO1xuICAgICAgICAgIC8vIFtrZXksIHZhbHVlLCBhcnJPdXRdXG4gICAgICAgICAgc2IuZW1pdE9wKGFyZywgJ1JPVCcpO1xuICAgICAgICAgIC8vIFsyLCBrZXksIHZhbHVlLCBhcnJPdXRdXG4gICAgICAgICAgc2IuZW1pdFB1c2hJbnQoYXJnLCAyKTtcbiAgICAgICAgICAvLyBbYXJyLCBhcnJPdXRdXG4gICAgICAgICAgc2IuZW1pdE9wKGFyZywgJ1BBQ0snKTtcbiAgICAgICAgICAvLyBbdmFsLCBhcnJPdXRdXG4gICAgICAgICAgc2IuZW1pdEhlbHBlcihhcmcsIGlubmVyT3B0aW9uLCBzYi5oZWxwZXJzLndyYXBBcnJheSk7XG4gICAgICAgICAgLy8gW2Fyck91dCwgdmFsLCBhcnJPdXRdXG4gICAgICAgICAgc2IuZW1pdE9wKGFyZywgJ09WRVInKTtcbiAgICAgICAgICAvLyBbdmFsLCBhcnJPdXQsIGFyck91dF1cbiAgICAgICAgICBzYi5lbWl0T3AoYXJnLCAnU1dBUCcpO1xuICAgICAgICAgIC8vIFthcnJPdXRdXG4gICAgICAgICAgc2IuZW1pdE9wKGFyZywgJ0FQUEVORCcpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGhhbmRsZU1hcCA9IChpbm5lck9wdGlvbnM6IFZpc2l0T3B0aW9ucykgPT4ge1xuICAgICAgICAgIC8vIFttYXAsIGFyck91dF1cbiAgICAgICAgICBzYi5lbWl0SGVscGVyKGFyZywgaW5uZXJPcHRpb25zLCBzYi5oZWxwZXJzLnVud3JhcE1hcCk7XG4gICAgICAgICAgLy8gW2Fyck91dCwgbWFwXVxuICAgICAgICAgIHNiLmVtaXRPcChhcmcsICdTV0FQJyk7XG4gICAgICAgICAgc2IuZW1pdEhlbHBlcihcbiAgICAgICAgICAgIGFyZyxcbiAgICAgICAgICAgIGlubmVyT3B0aW9ucyxcbiAgICAgICAgICAgIHNiLmhlbHBlcnMubWFwUmVkdWNlKHtcbiAgICAgICAgICAgICAgZWFjaDogaGFuZGxlTWFwTGlrZSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICk7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgaGFuZGxlU2V0TGlrZSA9ICgpID0+IHtcbiAgICAgICAgICAvLyBbdmFsdWUsIGFyck91dCwga2V5XVxuICAgICAgICAgIHNiLmVtaXRPcChhcmcsICdST1QnKTtcbiAgICAgICAgICAvLyBbYXJyT3V0LCBrZXldXG4gICAgICAgICAgc2IuZW1pdE9wKGFyZywgJ0RST1AnKTtcbiAgICAgICAgICAvLyBbYXJyT3V0LCBrZXksIGFyck91dF1cbiAgICAgICAgICBzYi5lbWl0T3AoYXJnLCAnVFVDSycpO1xuICAgICAgICAgIC8vIFtrZXksIGFyck91dCwgYXJyT3V0XVxuICAgICAgICAgIHNiLmVtaXRPcChhcmcsICdTV0FQJyk7XG4gICAgICAgICAgLy8gW2Fyck91dF1cbiAgICAgICAgICBzYi5lbWl0T3AoYXJnLCAnQVBQRU5EJyk7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgaGFuZGxlU2V0ID0gKGlubmVyT3B0aW9uczogVmlzaXRPcHRpb25zKSA9PiB7XG4gICAgICAgICAgLy8gW21hcCwgYXJyT3V0XVxuICAgICAgICAgIHNiLmVtaXRIZWxwZXIoYXJnLCBpbm5lck9wdGlvbnMsIHNiLmhlbHBlcnMudW53cmFwU2V0KTtcbiAgICAgICAgICAvLyBbYXJyT3V0LCBtYXBdXG4gICAgICAgICAgc2IuZW1pdE9wKGFyZywgJ1NXQVAnKTtcbiAgICAgICAgICBzYi5lbWl0SGVscGVyKFxuICAgICAgICAgICAgYXJnLFxuICAgICAgICAgICAgaW5uZXJPcHRpb25zLFxuICAgICAgICAgICAgc2IuaGVscGVycy5tYXBSZWR1Y2Uoe1xuICAgICAgICAgICAgICBlYWNoOiBoYW5kbGVTZXRMaWtlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKTtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBoYW5kbGVBcnJheVN0b3JhZ2UgPSAoaW5uZXJPcHRpb25zOiBWaXNpdE9wdGlvbnMpID0+IHtcbiAgICAgICAgICAvLyBbYXJyT3V0LCB2YWxdXG4gICAgICAgICAgc2IuZW1pdE9wKGFyZywgJ1NXQVAnKTtcbiAgICAgICAgICBzYi5lbWl0SGVscGVyKFxuICAgICAgICAgICAgYXJnLFxuICAgICAgICAgICAgaW5uZXJPcHRpb25zLFxuICAgICAgICAgICAgc2IuaGVscGVycy5zdHJ1Y3R1cmVkU3RvcmFnZVJlZHVjZVZhbCh7XG4gICAgICAgICAgICAgIHR5cGU6IFR5cGVzLkFycmF5U3RvcmFnZSxcbiAgICAgICAgICAgICAgZWFjaDogaGFuZGxlQXJyYXlMaWtlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKTtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBoYW5kbGVNYXBTdG9yYWdlID0gKGlubmVyT3B0aW9uczogVmlzaXRPcHRpb25zKSA9PiB7XG4gICAgICAgICAgLy8gW2Fyck91dCwgdmFsXVxuICAgICAgICAgIHNiLmVtaXRPcChhcmcsICdTV0FQJyk7XG4gICAgICAgICAgc2IuZW1pdEhlbHBlcihcbiAgICAgICAgICAgIGFyZyxcbiAgICAgICAgICAgIGlubmVyT3B0aW9ucyxcbiAgICAgICAgICAgIHNiLmhlbHBlcnMuc3RydWN0dXJlZFN0b3JhZ2VSZWR1Y2Uoe1xuICAgICAgICAgICAgICB0eXBlOiBUeXBlcy5NYXBTdG9yYWdlLFxuICAgICAgICAgICAgICBlYWNoOiBoYW5kbGVNYXBMaWtlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKTtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBoYW5kbGVTZXRTdG9yYWdlID0gKGlubmVyT3B0aW9uczogVmlzaXRPcHRpb25zKSA9PiB7XG4gICAgICAgICAgLy8gW2Fyck91dCwgdmFsXVxuICAgICAgICAgIHNiLmVtaXRPcChhcmcsICdTV0FQJyk7XG4gICAgICAgICAgc2IuZW1pdEhlbHBlcihcbiAgICAgICAgICAgIGFyZyxcbiAgICAgICAgICAgIGlubmVyT3B0aW9ucyxcbiAgICAgICAgICAgIHNiLmhlbHBlcnMuc3RydWN0dXJlZFN0b3JhZ2VSZWR1Y2Uoe1xuICAgICAgICAgICAgICB0eXBlOiBUeXBlcy5TZXRTdG9yYWdlLFxuICAgICAgICAgICAgICBlYWNoOiBoYW5kbGVTZXRMaWtlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKTtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBoYW5kbGVJdGVyYWJsZUl0ZXJhdG9yID0gKGlubmVyT3B0aW9uczogVmlzaXRPcHRpb25zKSA9PiB7XG4gICAgICAgICAgLy8gW2Fyck91dCwgdmFsXVxuICAgICAgICAgIHNiLmVtaXRPcChhcmcsICdTV0FQJyk7XG4gICAgICAgICAgc2IuZW1pdEhlbHBlcihcbiAgICAgICAgICAgIGFyZyxcbiAgICAgICAgICAgIGlubmVyT3B0aW9ucyxcbiAgICAgICAgICAgIHNiLmhlbHBlcnMuaXRlcmFibGVJdGVyYXRvclJlZHVjZSh7XG4gICAgICAgICAgICAgIGVhY2g6IGhhbmRsZUFycmF5TGlrZSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICk7XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHRzLmlzU3ByZWFkRWxlbWVudChhcmcpKSB7XG4gICAgICAgICAgY29uc3QgZXhwciA9IHRzVXRpbHMuZXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uKGFyZyk7XG4gICAgICAgICAgLy8gW2l0ZXJhYmxlLCBhcnJdXG4gICAgICAgICAgc2IudmlzaXQoZXhwciwgb3B0aW9ucyk7XG4gICAgICAgICAgLy8gW2Fycl1cbiAgICAgICAgICBzYi5lbWl0SGVscGVyKFxuICAgICAgICAgICAgYXJnLFxuICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICAgIHNiLmhlbHBlcnMuZm9ySXRlcmFibGVUeXBlKHtcbiAgICAgICAgICAgICAgdHlwZTogc2IuY29udGV4dC5hbmFseXNpcy5nZXRUeXBlKGV4cHIpLFxuICAgICAgICAgICAgICBhcnJheTogaGFuZGxlQXJyYXksXG4gICAgICAgICAgICAgIG1hcDogaGFuZGxlTWFwLFxuICAgICAgICAgICAgICBzZXQ6IGhhbmRsZVNldCxcbiAgICAgICAgICAgICAgYXJyYXlTdG9yYWdlOiBoYW5kbGVBcnJheVN0b3JhZ2UsXG4gICAgICAgICAgICAgIG1hcFN0b3JhZ2U6IGhhbmRsZU1hcFN0b3JhZ2UsXG4gICAgICAgICAgICAgIHNldFN0b3JhZ2U6IGhhbmRsZVNldFN0b3JhZ2UsXG4gICAgICAgICAgICAgIGl0ZXJhYmxlSXRlcmF0b3I6IGhhbmRsZUl0ZXJhYmxlSXRlcmF0b3IsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFthcnIsIGFycl1cbiAgICAgICAgICBzYi5lbWl0T3Aobm9kZSwgJ0RVUCcpO1xuICAgICAgICAgIC8vIFt2YWwsIGFyciwgYXJyXVxuICAgICAgICAgIHNiLnZpc2l0KGFyZywgb3B0aW9ucyk7XG4gICAgICAgICAgLy8gW2Fycl1cbiAgICAgICAgICBzYi5lbWl0T3Aobm9kZSwgJ0FQUEVORCcpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcmV2ZXJzZWRFbGVtZW50cyA9IF8ucmV2ZXJzZShbLi4uYXJnc10pO1xuICAgICAgcmV2ZXJzZWRFbGVtZW50cy5mb3JFYWNoKChhcmcpID0+IHtcbiAgICAgICAgc2IudmlzaXQoYXJnLCBvcHRpb25zKTtcbiAgICAgIH0pO1xuICAgICAgLy8gW2xlbmd0aCwgLi4udmFsc11cbiAgICAgIHNiLmVtaXRQdXNoSW50KG5vZGUsIGFyZ3MubGVuZ3RoKTtcbiAgICAgIC8vIFthcnJdXG4gICAgICBzYi5lbWl0T3Aobm9kZSwgJ1BBQ0snKTtcbiAgICB9XG5cbiAgICBpZiAoIW9wdGlvbnNJbi5wdXNoVmFsdWUpIHtcbiAgICAgIHNiLmVtaXRPcChub2RlLCAnRFJPUCcpO1xuICAgIH1cbiAgfVxufVxuIl19