@neo-one/smart-contract-compiler
Version:
NEO•ONE TypeScript smart contract compiler.
139 lines (137 loc) • 25.4 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const ts_utils_1 = require("@neo-one/ts-utils");
const utils_1 = require("@neo-one/utils");
const constants_1 = require("../../../constants");
const utils_2 = require("../../../utils");
const constants_2 = require("../../constants");
const BuiltinMemberCall_1 = require("../BuiltinMemberCall");
class SmartContractForBase extends BuiltinMemberCall_1.BuiltinMemberCall {
emitCall(sb, func, node, optionsIn) {
const options = sb.pushValueOptions(optionsIn);
const returnType = sb.context.analysis.getType(node);
if (returnType === undefined) {
return;
}
const properties = ts_utils_1.tsUtils.type_.getProperties(returnType);
const props = properties.map((prop) => {
const propType = sb.context.analysis.getTypeOfSymbol(prop, node);
if (propType === undefined) {
return undefined;
}
const propName = ts_utils_1.tsUtils.symbol.getName(prop);
if (constants_1.IGNORED_PROPERTIES.has(propName)) {
return undefined;
}
if (constants_1.BUILTIN_PROPERTIES.has(propName)) {
return undefined;
}
const propNode = ts_utils_1.tsUtils.symbol.getValueDeclarationOrThrow(prop);
if (ts_utils_1.tsUtils.modifier.isStatic(propNode) ||
ts_utils_1.tsUtils.modifier.isProtected(propNode) ||
ts_utils_1.tsUtils.modifier.isPrivate(propNode)) {
return undefined;
}
const result = sb.context.analysis.extractSignatureForType(propNode, propType, { error: true });
if (result === undefined) {
return {
paramDecls: [],
paramTypes: new Map(),
returnType: propType,
prop: propNode,
propName,
accessor: true,
isReadonly: ts_utils_1.tsUtils.modifier.isReadonly(propNode),
};
}
return Object.assign({}, result, { prop: propNode, propName, accessor: false, isReadonly: false });
});
const handleParams = (prop, paramDecls, paramTypes, innerOptions) => {
sb.emitHelper(prop, innerOptions, sb.helpers.parameters({
params: paramDecls,
asArgsArr: true,
map: (param, innerInnerOptions, isRestElement) => {
let type = paramTypes.get(param);
if (type !== undefined && isRestElement) {
type = ts_utils_1.tsUtils.type_.getArrayType(type);
}
sb.emitHelper(param, innerInnerOptions, sb.helpers.unwrapValRecursive({ type }));
},
}));
};
const addressName = sb.scope.addUnique();
this.emitInitial(sb, func, node, addressName, options);
sb.emitHelper(node, options, sb.helpers.createObject);
props
.filter(utils_1.utils.notNull)
.forEach(({ prop, propName, paramDecls, paramTypes, returnType: propReturnType, accessor, isReadonly }) => {
sb.emitOp(prop, 'DUP');
sb.emitPushString(prop, propName);
if (accessor && !isReadonly) {
sb.emitHelper(prop, options, sb.helpers.createFunctionArray({
body: (innerOptionsIn) => {
const innerOptions = sb.pushValueOptions(innerOptionsIn);
sb.emitPushInt(prop, 0);
sb.emitOp(prop, 'PICKITEM');
sb.emitHelper(prop, innerOptions, sb.helpers.unwrapValRecursive({ type: propReturnType }));
sb.emitPushInt(prop, 1);
sb.emitOp(prop, 'PACK');
sb.emitPushString(prop, utils_2.getSetterName(propName));
const callBuffer = Buffer.from([0, 2]);
this.emitInvoke(sb, func, node, prop, addressName, callBuffer, sb.noPushValueOptions(innerOptions));
sb.emitHelper(prop, innerOptions, sb.helpers.wrapUndefined);
sb.emitHelper(prop, innerOptions, sb.helpers.return);
},
}));
sb.emitHelper(prop, options, sb.helpers.createFunctionObject({
property: constants_2.InternalObjectProperty.Call,
}));
}
sb.emitHelper(prop, options, sb.helpers.createFunctionArray({
body: (innerOptionsIn) => {
const innerOptions = sb.pushValueOptions(innerOptionsIn);
if (accessor) {
sb.emitOp(prop, 'DROP');
sb.emitPushInt(prop, 0);
sb.emitOp(prop, 'NEWARRAY');
}
else {
handleParams(prop, paramDecls, paramTypes, innerOptions);
}
sb.emitPushString(prop, propName);
const isVoidReturn = propReturnType !== undefined && ts_utils_1.tsUtils.type_.isVoid(propReturnType);
const callBuffer = Buffer.from([isVoidReturn ? 0 : 1, 2]);
this.emitInvoke(sb, func, node, prop, addressName, callBuffer, innerOptions);
if (isVoidReturn) {
sb.emitHelper(prop, innerOptions, sb.helpers.wrapUndefined);
}
else {
sb.emitHelper(prop, innerOptions, sb.helpers.wrapValRecursive({
type: propReturnType,
}));
}
sb.emitHelper(prop, innerOptions, sb.helpers.return);
},
}));
sb.emitHelper(prop, options, sb.helpers.createFunctionObject({
property: constants_2.InternalObjectProperty.Call,
}));
if (accessor) {
sb.emitHelper(prop, options, sb.helpers.setAccessorPropertyObjectProperty({ hasGet: true, hasSet: !isReadonly }));
}
else {
sb.emitHelper(prop, options, sb.helpers.setDataPropertyObjectProperty);
}
});
this.emitAdditionalProperties(sb, func, node, options);
if (!optionsIn.pushValue) {
sb.emitOp(node, 'DROP');
}
}
emitInitial(_sb, _func, _node, _addressName, _options) {
}
emitAdditionalProperties(_sb, _func, _node, _options) {
}
}
exports.SmartContractForBase = SmartContractForBase;
//# sourceMappingURL=data:application/json;charset=utf8;base64,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Q0FBQyxDQUFDO1FBR0wsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRXZELElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFO1lBQ3hCLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1NBQ3pCO0lBQ0gsQ0FBQztJQUVTLFdBQVcsQ0FDbkIsR0FBa0IsRUFDbEIsS0FBMkIsRUFDM0IsS0FBd0IsRUFDeEIsWUFBa0IsRUFDbEIsUUFBc0I7SUFHeEIsQ0FBQztJQUVTLHdCQUF3QixDQUNoQyxHQUFrQixFQUNsQixLQUEyQixFQUMzQixLQUF3QixFQUN4QixRQUFzQjtJQUd4QixDQUFDO0NBV0Y7QUF0T0Qsb0RBc09DIiwiZmlsZSI6Im5lby1vbmUtc21hcnQtY29udHJhY3QtY29tcGlsZXIvc3JjL2NvbXBpbGUvYnVpbHRpbnMvY29udHJhY3QvU21hcnRDb250cmFjdEZvckJhc2UuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0c1V0aWxzIH0gZnJvbSAnQG5lby1vbmUvdHMtdXRpbHMnO1xuaW1wb3J0IHsgdXRpbHMgfSBmcm9tICdAbmVvLW9uZS91dGlscyc7XG5pbXBvcnQgdHMgZnJvbSAndHlwZXNjcmlwdCc7XG5pbXBvcnQgeyBCVUlMVElOX1BST1BFUlRJRVMsIElHTk9SRURfUFJPUEVSVElFUyB9IGZyb20gJy4uLy4uLy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBnZXRTZXR0ZXJOYW1lIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMnO1xuaW1wb3J0IHsgSW50ZXJuYWxPYmplY3RQcm9wZXJ0eSB9IGZyb20gJy4uLy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBTY3JpcHRCdWlsZGVyIH0gZnJvbSAnLi4vLi4vc2InO1xuaW1wb3J0IHsgTmFtZSB9IGZyb20gJy4uLy4uL3Njb3BlJztcbmltcG9ydCB7IFZpc2l0T3B0aW9ucyB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IEJ1aWx0aW5NZW1iZXJDYWxsIH0gZnJvbSAnLi4vQnVpbHRpbk1lbWJlckNhbGwnO1xuaW1wb3J0IHsgTWVtYmVyTGlrZUV4cHJlc3Npb24gfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTbWFydENvbnRyYWN0Rm9yQmFzZSBleHRlbmRzIEJ1aWx0aW5NZW1iZXJDYWxsIHtcbiAgcHVibGljIGVtaXRDYWxsKFxuICAgIHNiOiBTY3JpcHRCdWlsZGVyLFxuICAgIGZ1bmM6IE1lbWJlckxpa2VFeHByZXNzaW9uLFxuICAgIG5vZGU6IHRzLkNhbGxFeHByZXNzaW9uLFxuICAgIG9wdGlvbnNJbjogVmlzaXRPcHRpb25zLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBvcHRpb25zID0gc2IucHVzaFZhbHVlT3B0aW9ucyhvcHRpb25zSW4pO1xuICAgIGNvbnN0IHJldHVyblR5cGUgPSBzYi5jb250ZXh0LmFuYWx5c2lzLmdldFR5cGUobm9kZSk7XG4gICAgaWYgKHJldHVyblR5cGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9wZXJ0aWVzID0gdHNVdGlscy50eXBlXy5nZXRQcm9wZXJ0aWVzKHJldHVyblR5cGUpO1xuICAgIGNvbnN0IHByb3BzID0gcHJvcGVydGllcy5tYXAoKHByb3ApID0+IHtcbiAgICAgIGNvbnN0IHByb3BUeXBlID0gc2IuY29udGV4dC5hbmFseXNpcy5nZXRUeXBlT2ZTeW1ib2wocHJvcCwgbm9kZSk7XG4gICAgICBpZiAocHJvcFR5cGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwcm9wTmFtZSA9IHRzVXRpbHMuc3ltYm9sLmdldE5hbWUocHJvcCk7XG4gICAgICBpZiAoSUdOT1JFRF9QUk9QRVJUSUVTLmhhcyhwcm9wTmFtZSkpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGlmIChCVUlMVElOX1BST1BFUlRJRVMuaGFzKHByb3BOYW1lKSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgY29uc3QgcHJvcE5vZGUgPSB0c1V0aWxzLnN5bWJvbC5nZXRWYWx1ZURlY2xhcmF0aW9uT3JUaHJvdyhwcm9wKTtcbiAgICAgIGlmIChcbiAgICAgICAgdHNVdGlscy5tb2RpZmllci5pc1N0YXRpYyhwcm9wTm9kZSkgfHxcbiAgICAgICAgdHNVdGlscy5tb2RpZmllci5pc1Byb3RlY3RlZChwcm9wTm9kZSkgfHxcbiAgICAgICAgdHNVdGlscy5tb2RpZmllci5pc1ByaXZhdGUocHJvcE5vZGUpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0ID0gc2IuY29udGV4dC5hbmFseXNpcy5leHRyYWN0U2lnbmF0dXJlRm9yVHlwZShwcm9wTm9kZSwgcHJvcFR5cGUsIHsgZXJyb3I6IHRydWUgfSk7XG4gICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gTXVzdCBiZSBhIHByb3BlcnR5LCBub3QgYSBtZXRob2RcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBwYXJhbURlY2xzOiBbXSxcbiAgICAgICAgICBwYXJhbVR5cGVzOiBuZXcgTWFwPHRzLlBhcmFtZXRlckRlY2xhcmF0aW9uLCB0cy5UeXBlIHwgdW5kZWZpbmVkPigpLFxuICAgICAgICAgIHJldHVyblR5cGU6IHByb3BUeXBlLFxuICAgICAgICAgIHByb3A6IHByb3BOb2RlLFxuICAgICAgICAgIHByb3BOYW1lLFxuICAgICAgICAgIGFjY2Vzc29yOiB0cnVlLFxuICAgICAgICAgIGlzUmVhZG9ubHk6IHRzVXRpbHMubW9kaWZpZXIuaXNSZWFkb25seShwcm9wTm9kZSksXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7IC4uLnJlc3VsdCwgcHJvcDogcHJvcE5vZGUsIHByb3BOYW1lLCBhY2Nlc3NvcjogZmFsc2UsIGlzUmVhZG9ubHk6IGZhbHNlIH07XG4gICAgfSk7XG5cbiAgICBjb25zdCBoYW5kbGVQYXJhbXMgPSAoXG4gICAgICBwcm9wOiB0cy5EZWNsYXJhdGlvbixcbiAgICAgIHBhcmFtRGVjbHM6IFJlYWRvbmx5QXJyYXk8dHMuUGFyYW1ldGVyRGVjbGFyYXRpb24+LFxuICAgICAgcGFyYW1UeXBlczogTWFwPHRzLlBhcmFtZXRlckRlY2xhcmF0aW9uLCB0cy5UeXBlIHwgdW5kZWZpbmVkPixcbiAgICAgIGlubmVyT3B0aW9uczogVmlzaXRPcHRpb25zLFxuICAgICkgPT4ge1xuICAgICAgLy8gW3BhcmFtc11cbiAgICAgIHNiLmVtaXRIZWxwZXIoXG4gICAgICAgIHByb3AsXG4gICAgICAgIGlubmVyT3B0aW9ucyxcbiAgICAgICAgc2IuaGVscGVycy5wYXJhbWV0ZXJzKHtcbiAgICAgICAgICBwYXJhbXM6IHBhcmFtRGVjbHMsXG4gICAgICAgICAgYXNBcmdzQXJyOiB0cnVlLFxuICAgICAgICAgIG1hcDogKHBhcmFtLCBpbm5lcklubmVyT3B0aW9ucywgaXNSZXN0RWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgbGV0IHR5cGUgPSBwYXJhbVR5cGVzLmdldChwYXJhbSk7XG4gICAgICAgICAgICBpZiAodHlwZSAhPT0gdW5kZWZpbmVkICYmIGlzUmVzdEVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgdHlwZSA9IHRzVXRpbHMudHlwZV8uZ2V0QXJyYXlUeXBlKHR5cGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gW3ZhbHVlXVxuICAgICAgICAgICAgc2IuZW1pdEhlbHBlcihwYXJhbSwgaW5uZXJJbm5lck9wdGlvbnMsIHNiLmhlbHBlcnMudW53cmFwVmFsUmVjdXJzaXZlKHsgdHlwZSB9KSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH07XG5cbiAgICBjb25zdCBhZGRyZXNzTmFtZSA9IHNiLnNjb3BlLmFkZFVuaXF1ZSgpO1xuICAgIHRoaXMuZW1pdEluaXRpYWwoc2IsIGZ1bmMsIG5vZGUsIGFkZHJlc3NOYW1lLCBvcHRpb25zKTtcblxuICAgIC8vIFtvYmplY3RWYWxdXG4gICAgc2IuZW1pdEhlbHBlcihub2RlLCBvcHRpb25zLCBzYi5oZWxwZXJzLmNyZWF0ZU9iamVjdCk7XG4gICAgLy8gW29iamVjdFZhbF1cbiAgICBwcm9wc1xuICAgICAgLmZpbHRlcih1dGlscy5ub3ROdWxsKVxuICAgICAgLmZvckVhY2goKHsgcHJvcCwgcHJvcE5hbWUsIHBhcmFtRGVjbHMsIHBhcmFtVHlwZXMsIHJldHVyblR5cGU6IHByb3BSZXR1cm5UeXBlLCBhY2Nlc3NvciwgaXNSZWFkb25seSB9KSA9PiB7XG4gICAgICAgIC8vIFtvYmplY3RWYWwsIG9iamVjdFZhbF1cbiAgICAgICAgc2IuZW1pdE9wKHByb3AsICdEVVAnKTtcbiAgICAgICAgLy8gW3N0cmluZywgb2JqZWN0VmFsLCBvYmplY3RWYWxdXG4gICAgICAgIHNiLmVtaXRQdXNoU3RyaW5nKHByb3AsIHByb3BOYW1lKTtcbiAgICAgICAgaWYgKGFjY2Vzc29yICYmICFpc1JlYWRvbmx5KSB7XG4gICAgICAgICAgc2IuZW1pdEhlbHBlcihcbiAgICAgICAgICAgIHByb3AsXG4gICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgc2IuaGVscGVycy5jcmVhdGVGdW5jdGlvbkFycmF5KHtcbiAgICAgICAgICAgICAgYm9keTogKGlubmVyT3B0aW9uc0luKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5uZXJPcHRpb25zID0gc2IucHVzaFZhbHVlT3B0aW9ucyhpbm5lck9wdGlvbnNJbik7XG4gICAgICAgICAgICAgICAgLy8gWzAsIGFyZ3NhcnJdXG4gICAgICAgICAgICAgICAgc2IuZW1pdFB1c2hJbnQocHJvcCwgMCk7XG4gICAgICAgICAgICAgICAgLy8gW3ZhbF1cbiAgICAgICAgICAgICAgICBzYi5lbWl0T3AocHJvcCwgJ1BJQ0tJVEVNJyk7XG4gICAgICAgICAgICAgICAgLy8gW3ZhbHVlXVxuICAgICAgICAgICAgICAgIHNiLmVtaXRIZWxwZXIocHJvcCwgaW5uZXJPcHRpb25zLCBzYi5oZWxwZXJzLnVud3JhcFZhbFJlY3Vyc2l2ZSh7IHR5cGU6IHByb3BSZXR1cm5UeXBlIH0pKTtcbiAgICAgICAgICAgICAgICAvLyBbMSwgdmFsdWVdXG4gICAgICAgICAgICAgICAgc2IuZW1pdFB1c2hJbnQocHJvcCwgMSk7XG4gICAgICAgICAgICAgICAgLy8gW3BhcmFtc11cbiAgICAgICAgICAgICAgICBzYi5lbWl0T3AocHJvcCwgJ1BBQ0snKTtcbiAgICAgICAgICAgICAgICAvLyBbc3RyaW5nLCBwYXJhbXNdXG4gICAgICAgICAgICAgICAgc2IuZW1pdFB1c2hTdHJpbmcocHJvcCwgZ2V0U2V0dGVyTmFtZShwcm9wTmFtZSkpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgY2FsbEJ1ZmZlciA9IEJ1ZmZlci5mcm9tKFswLCAyXSk7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0SW52b2tlKHNiLCBmdW5jLCBub2RlLCBwcm9wLCBhZGRyZXNzTmFtZSwgY2FsbEJ1ZmZlciwgc2Iubm9QdXNoVmFsdWVPcHRpb25zKGlubmVyT3B0aW9ucykpO1xuICAgICAgICAgICAgICAgIC8vIFt2YWxdXG4gICAgICAgICAgICAgICAgc2IuZW1pdEhlbHBlcihwcm9wLCBpbm5lck9wdGlvbnMsIHNiLmhlbHBlcnMud3JhcFVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgLy8gW11cbiAgICAgICAgICAgICAgICBzYi5lbWl0SGVscGVyKHByb3AsIGlubmVyT3B0aW9ucywgc2IuaGVscGVycy5yZXR1cm4pO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBzYi5lbWl0SGVscGVyKFxuICAgICAgICAgICAgcHJvcCxcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICBzYi5oZWxwZXJzLmNyZWF0ZUZ1bmN0aW9uT2JqZWN0KHtcbiAgICAgICAgICAgICAgcHJvcGVydHk6IEludGVybmFsT2JqZWN0UHJvcGVydHkuQ2FsbCxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gW2ZhcnIsIHN0cmluZywgb2JqZWN0VmFsLCBvYmplY3RWYWxdXG4gICAgICAgIHNiLmVtaXRIZWxwZXIoXG4gICAgICAgICAgcHJvcCxcbiAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgIHNiLmhlbHBlcnMuY3JlYXRlRnVuY3Rpb25BcnJheSh7XG4gICAgICAgICAgICBib2R5OiAoaW5uZXJPcHRpb25zSW4pID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgaW5uZXJPcHRpb25zID0gc2IucHVzaFZhbHVlT3B0aW9ucyhpbm5lck9wdGlvbnNJbik7XG4gICAgICAgICAgICAgIGlmIChhY2Nlc3Nvcikge1xuICAgICAgICAgICAgICAgIC8vIFtdXG4gICAgICAgICAgICAgICAgc2IuZW1pdE9wKHByb3AsICdEUk9QJyk7XG4gICAgICAgICAgICAgICAgLy8gW251bWJlcl1cbiAgICAgICAgICAgICAgICBzYi5lbWl0UHVzaEludChwcm9wLCAwKTtcbiAgICAgICAgICAgICAgICAvLyBbcGFyYW1zXVxuICAgICAgICAgICAgICAgIHNiLmVtaXRPcChwcm9wLCAnTkVXQVJSQVknKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBbcGFyYW1zXVxuICAgICAgICAgICAgICAgIGhhbmRsZVBhcmFtcyhwcm9wLCBwYXJhbURlY2xzLCBwYXJhbVR5cGVzLCBpbm5lck9wdGlvbnMpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vIFtzdHJpbmcsIHBhcmFtc11cbiAgICAgICAgICAgICAgc2IuZW1pdFB1c2hTdHJpbmcocHJvcCwgcHJvcE5hbWUpO1xuXG4gICAgICAgICAgICAgIGNvbnN0IGlzVm9pZFJldHVybiA9IHByb3BSZXR1cm5UeXBlICE9PSB1bmRlZmluZWQgJiYgdHNVdGlscy50eXBlXy5pc1ZvaWQocHJvcFJldHVyblR5cGUpO1xuICAgICAgICAgICAgICBjb25zdCBjYWxsQnVmZmVyID0gQnVmZmVyLmZyb20oW2lzVm9pZFJldHVybiA/IDAgOiAxLCAyXSk7XG4gICAgICAgICAgICAgIHRoaXMuZW1pdEludm9rZShzYiwgZnVuYywgbm9kZSwgcHJvcCwgYWRkcmVzc05hbWUsIGNhbGxCdWZmZXIsIGlubmVyT3B0aW9ucyk7XG5cbiAgICAgICAgICAgICAgaWYgKGlzVm9pZFJldHVybikge1xuICAgICAgICAgICAgICAgIHNiLmVtaXRIZWxwZXIocHJvcCwgaW5uZXJPcHRpb25zLCBzYi5oZWxwZXJzLndyYXBVbmRlZmluZWQpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFt2YWxdXG4gICAgICAgICAgICAgICAgc2IuZW1pdEhlbHBlcihcbiAgICAgICAgICAgICAgICAgIHByb3AsXG4gICAgICAgICAgICAgICAgICBpbm5lck9wdGlvbnMsXG4gICAgICAgICAgICAgICAgICBzYi5oZWxwZXJzLndyYXBWYWxSZWN1cnNpdmUoe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBwcm9wUmV0dXJuVHlwZSxcbiAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBbXVxuICAgICAgICAgICAgICBzYi5lbWl0SGVscGVyKHByb3AsIGlubmVyT3B0aW9ucywgc2IuaGVscGVycy5yZXR1cm4pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgICAgLy8gW2ZvYmosIHN0cmluZywgb2JqZWN0VmFsLCBvYmplY3RWYWxdXG4gICAgICAgIHNiLmVtaXRIZWxwZXIoXG4gICAgICAgICAgcHJvcCxcbiAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgIHNiLmhlbHBlcnMuY3JlYXRlRnVuY3Rpb25PYmplY3Qoe1xuICAgICAgICAgICAgcHJvcGVydHk6IEludGVybmFsT2JqZWN0UHJvcGVydHkuQ2FsbCxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGFjY2Vzc29yKSB7XG4gICAgICAgICAgLy8gW29iamVjdFZhbF1cbiAgICAgICAgICBzYi5lbWl0SGVscGVyKFxuICAgICAgICAgICAgcHJvcCxcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICBzYi5oZWxwZXJzLnNldEFjY2Vzc29yUHJvcGVydHlPYmplY3RQcm9wZXJ0eSh7IGhhc0dldDogdHJ1ZSwgaGFzU2V0OiAhaXNSZWFkb25seSB9KSxcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFtvYmplY3RWYWxdXG4gICAgICAgICAgc2IuZW1pdEhlbHBlcihwcm9wLCBvcHRpb25zLCBzYi5oZWxwZXJzLnNldERhdGFQcm9wZXJ0eU9iamVjdFByb3BlcnR5KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAvLyBbb2JqZWN0VmFsXVxuICAgIHRoaXMuZW1pdEFkZGl0aW9uYWxQcm9wZXJ0aWVzKHNiLCBmdW5jLCBub2RlLCBvcHRpb25zKTtcblxuICAgIGlmICghb3B0aW9uc0luLnB1c2hWYWx1ZSkge1xuICAgICAgc2IuZW1pdE9wKG5vZGUsICdEUk9QJyk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGVtaXRJbml0aWFsKFxuICAgIF9zYjogU2NyaXB0QnVpbGRlcixcbiAgICBfZnVuYzogTWVtYmVyTGlrZUV4cHJlc3Npb24sXG4gICAgX25vZGU6IHRzLkNhbGxFeHByZXNzaW9uLFxuICAgIF9hZGRyZXNzTmFtZTogTmFtZSxcbiAgICBfb3B0aW9uczogVmlzaXRPcHRpb25zLFxuICApOiB2b2lkIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cblxuICBwcm90ZWN0ZWQgZW1pdEFkZGl0aW9uYWxQcm9wZXJ0aWVzKFxuICAgIF9zYjogU2NyaXB0QnVpbGRlcixcbiAgICBfZnVuYzogTWVtYmVyTGlrZUV4cHJlc3Npb24sXG4gICAgX25vZGU6IHRzLkNhbGxFeHByZXNzaW9uLFxuICAgIF9vcHRpb25zOiBWaXNpdE9wdGlvbnMsXG4gICk6IHZvaWQge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBlbWl0SW52b2tlKFxuICAgIHNiOiBTY3JpcHRCdWlsZGVyLFxuICAgIGZ1bmM6IE1lbWJlckxpa2VFeHByZXNzaW9uLFxuICAgIG5vZGU6IHRzLkNhbGxFeHByZXNzaW9uLFxuICAgIHByb3A6IHRzLkRlY2xhcmF0aW9uLFxuICAgIGFkZHJlc3NOYW1lOiBOYW1lLFxuICAgIGNhbGxCdWZmZXI6IEJ1ZmZlcixcbiAgICBvcHRpb25zSW46IFZpc2l0T3B0aW9ucyxcbiAgKTogdm9pZDtcbn1cbiJdfQ==