@neo-one/smart-contract-compiler
Version:
NEO•ONE TypeScript smart contract compiler.
195 lines (193 loc) • 38.9 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const ts_utils_1 = require("@neo-one/ts-utils");
const constants_1 = require("../../constants");
const Helper_1 = require("../Helper");
class EqualsEqualsHelper extends Helper_1.Helper {
constructor(options) {
super();
this.left = options.left;
this.right = options.right;
}
emit(sb, node, options) {
if (!options.pushValue) {
sb.visit(this.left, options);
sb.visit(this.right, options);
return;
}
const leftType = sb.context.analysis.getType(this.left);
const rightType = sb.context.analysis.getType(this.right);
if (leftType !== undefined && rightType !== undefined) {
this.equalsEqualsType(sb, node, options, leftType, rightType);
}
else {
this.equalsEqualsUnknown(sb, node, options);
}
}
equalsEqualsType(sb, node, options, leftType, rightType) {
if (ts_utils_1.tsUtils.type_.isOnly(leftType) &&
ts_utils_1.tsUtils.type_.isOnly(rightType) &&
ts_utils_1.tsUtils.type_.isSame(leftType, rightType)) {
sb.emitHelper(node, options, sb.helpers.equalsEqualsEquals({ leftType, rightType }));
}
else if ((ts_utils_1.tsUtils.type_.hasNull(leftType) || ts_utils_1.tsUtils.type_.hasUndefined(leftType)) &&
(ts_utils_1.tsUtils.type_.isOnlyUndefined(rightType) || ts_utils_1.tsUtils.type_.isOnlyNull(rightType))) {
sb.visit(this.left, options);
sb.visit(this.right, sb.noPushValueOptions(options));
sb.emitHelper(node, options, sb.helpers.isNullOrUndefined({ type: rightType }));
}
else if (ts_utils_1.tsUtils.type_.isOnlyNumberish(leftType) &&
(ts_utils_1.tsUtils.type_.isOnlyStringish(rightType) || ts_utils_1.tsUtils.type_.isOnlyBooleanish(rightType))) {
sb.visit(this.left, options);
sb.visit(this.right, options);
this.equalsEqualsLeftNumberRightBooleanOrString(sb, node, options);
}
else if (ts_utils_1.tsUtils.type_.isOnlyBooleanish(leftType) &&
(ts_utils_1.tsUtils.type_.isOnlyStringish(rightType) || ts_utils_1.tsUtils.type_.isOnlyBooleanish(rightType))) {
sb.visit(this.left, options);
sb.emitHelper(this.left, options, sb.helpers.toNumber({ type: sb.context.analysis.getType(this.left) }));
sb.emitHelper(this.left, options, sb.helpers.wrapNumber);
sb.visit(this.right, options);
this.equalsEqualsLeftNumberRightBooleanOrString(sb, node, options);
}
else if ((ts_utils_1.tsUtils.type_.isOnlyStringish(leftType) || ts_utils_1.tsUtils.type_.isOnlyBooleanish(leftType)) &&
ts_utils_1.tsUtils.type_.isOnlyNumberish(rightType)) {
sb.visit(this.left, options);
sb.visit(this.right, options);
this.equalsEqualsRightNumberLeftBooleanOrString(sb, node, options);
}
else if ((ts_utils_1.tsUtils.type_.isOnlyStringish(leftType) || ts_utils_1.tsUtils.type_.isOnlyBooleanish(leftType)) &&
ts_utils_1.tsUtils.type_.isOnlyBooleanish(rightType)) {
sb.visit(this.left, options);
sb.visit(this.right, options);
sb.emitHelper(this.right, options, sb.helpers.toNumber({ type: sb.context.analysis.getType(this.right) }));
sb.emitHelper(this.right, options, sb.helpers.wrapNumber);
this.equalsEqualsRightNumberLeftBooleanOrString(sb, node, options);
}
else {
this.equalsEqualsUnknown(sb, node, options);
}
}
equalsEqualsLeftNumberRightBooleanOrString(sb, node, options) {
sb.emitHelper(this.right, options, sb.helpers.toNumber({ type: sb.context.analysis.getType(this.right) }));
sb.emitHelper(this.right, options, sb.helpers.wrapNumber);
sb.emitHelper(node, options, sb.helpers.equalsEqualsEquals({
leftType: undefined,
leftKnownType: constants_1.Types.Number,
rightType: undefined,
rightKnownType: constants_1.Types.Number,
}));
}
equalsEqualsRightNumberLeftBooleanOrString(sb, node, options) {
sb.emitOp(node, 'SWAP');
sb.emitHelper(this.left, options, sb.helpers.toNumber({ type: sb.context.analysis.getType(this.left) }));
sb.emitHelper(this.left, options, sb.helpers.wrapNumber);
sb.emitOp(node, 'SWAP');
sb.emitHelper(node, options, sb.helpers.equalsEqualsEquals({
leftType: undefined,
leftKnownType: constants_1.Types.Number,
rightType: undefined,
rightKnownType: constants_1.Types.Number,
}));
}
equalsEqualsUnknown(sb, node, options) {
const copy = () => {
sb.emitOp(this.right, 'SWAP');
sb.emitOp(this.right, 'TUCK');
sb.emitOp(this.right, 'OVER');
};
sb.visit(this.left, options);
sb.visit(this.right, options);
const cases = [
{
condition: () => {
copy();
sb.emitHelper(node, options, sb.helpers.equalsEqualsEquals({
leftType: undefined,
rightType: undefined,
}));
},
whenTrue: () => {
sb.emitOp(node, 'DROP');
sb.emitOp(node, 'DROP');
sb.emitPushBoolean(node, true);
},
},
{
condition: () => {
copy();
sb.emitHelper(node, options, sb.helpers.isNullOrUndefined({ type: undefined }));
sb.emitOp(node, 'SWAP');
sb.emitHelper(node, options, sb.helpers.isNullOrUndefined({ type: undefined }));
sb.emitOp(node, 'BOOLOR');
},
whenTrue: () => {
sb.emitHelper(node, options, sb.helpers.isNullOrUndefined({ type: undefined }));
sb.emitOp(node, 'SWAP');
sb.emitHelper(node, options, sb.helpers.isNullOrUndefined({ type: undefined }));
sb.emitOp(node, 'EQUAL');
},
},
{
condition: () => {
copy();
sb.emitOp(node, 'DUP');
sb.emitHelper(this.right, options, sb.helpers.isString);
sb.emitOp(node, 'SWAP');
sb.emitHelper(this.right, options, sb.helpers.isBoolean);
sb.emitOp(node, 'BOOLOR');
sb.emitOp(node, 'SWAP');
sb.emitOp(node, 'DUP');
sb.emitHelper(this.right, options, sb.helpers.isNumber);
sb.emitOp(node, 'SWAP');
sb.emitHelper(this.right, options, sb.helpers.isBoolean);
sb.emitOp(node, 'BOOLOR');
sb.emitOp(node, 'BOOLAND');
},
whenTrue: () => {
sb.emitOp(node, 'SWAP');
sb.emitHelper(node, options, sb.helpers.toNumber({ type: sb.context.analysis.getType(this.left) }));
sb.emitHelper(node, options, sb.helpers.wrapNumber);
sb.emitOp(node, 'SWAP');
this.equalsEqualsLeftNumberRightBooleanOrString(sb, node, options);
},
},
{
condition: () => {
copy();
sb.emitOp(node, 'SWAP');
sb.emitOp(node, 'DUP');
sb.emitHelper(this.right, options, sb.helpers.isString);
sb.emitOp(node, 'SWAP');
sb.emitHelper(this.right, options, sb.helpers.isBoolean);
sb.emitOp(node, 'BOOLOR');
sb.emitOp(node, 'SWAP');
sb.emitOp(node, 'DUP');
sb.emitHelper(this.right, options, sb.helpers.isNumber);
sb.emitOp(node, 'SWAP');
sb.emitHelper(this.right, options, sb.helpers.isBoolean);
sb.emitOp(node, 'BOOLOR');
sb.emitOp(node, 'BOOLAND');
},
whenTrue: () => {
sb.emitHelper(node, options, sb.helpers.toNumber({ type: sb.context.analysis.getType(this.right) }));
sb.emitHelper(node, options, sb.helpers.wrapNumber);
this.equalsEqualsRightNumberLeftBooleanOrString(sb, node, options);
},
},
];
sb.emitHelper(node, options, sb.helpers.case(cases, () => {
sb.emitHelper(node, options, sb.helpers.toPrimitive({ type: sb.context.analysis.getType(this.right) }));
sb.emitOp(node, 'SWAP');
sb.emitHelper(node, options, sb.helpers.toPrimitive({ type: sb.context.analysis.getType(this.left) }));
sb.emitOp(node, 'SWAP');
sb.emitHelper(node, options, sb.helpers.case(cases, () => {
sb.emitOp(node, 'DROP');
sb.emitOp(node, 'DROP');
sb.emitPushBoolean(node, false);
}));
}));
}
}
exports.EqualsEqualsHelper = EqualsEqualsHelper;
//# sourceMappingURL=data:application/json;charset=utf8;base64,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QUUsS0FBSyxDQUFDLENBQUM7WUFDbEMsQ0FBQyxDQUFDLENBQ0gsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0NBQ0Y7QUFwVEQsZ0RBb1RDIiwiZmlsZSI6Im5lby1vbmUtc21hcnQtY29udHJhY3QtY29tcGlsZXIvc3JjL2NvbXBpbGUvaGVscGVyL3JlbGF0aW9uYWwvRXF1YWxzRXF1YWxzSGVscGVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHNVdGlscyB9IGZyb20gJ0BuZW8tb25lL3RzLXV0aWxzJztcbmltcG9ydCB0cyBmcm9tICd0eXBlc2NyaXB0JztcbmltcG9ydCB7IFR5cGVzIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IFNjcmlwdEJ1aWxkZXIgfSBmcm9tICcuLi8uLi9zYic7XG5pbXBvcnQgeyBWaXNpdE9wdGlvbnMgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBIZWxwZXIgfSBmcm9tICcuLi9IZWxwZXInO1xuXG5leHBvcnQgaW50ZXJmYWNlIEVxdWFsc0VxdWFsc0hlbHBlck9wdGlvbnMge1xuICByZWFkb25seSBsZWZ0OiB0cy5Ob2RlO1xuICByZWFkb25seSByaWdodDogdHMuTm9kZTtcbn1cblxuLy8gSW5wdXQ6IFtdXG4vLyBPdXRwdXQ6IFtib29sZWFuXVxuZXhwb3J0IGNsYXNzIEVxdWFsc0VxdWFsc0hlbHBlciBleHRlbmRzIEhlbHBlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgbGVmdDogdHMuTm9kZTtcbiAgcHJpdmF0ZSByZWFkb25seSByaWdodDogdHMuTm9kZTtcblxuICBwdWJsaWMgY29uc3RydWN0b3Iob3B0aW9uczogRXF1YWxzRXF1YWxzSGVscGVyT3B0aW9ucykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5sZWZ0ID0gb3B0aW9ucy5sZWZ0O1xuICAgIHRoaXMucmlnaHQgPSBvcHRpb25zLnJpZ2h0O1xuICB9XG5cbiAgcHVibGljIGVtaXQoc2I6IFNjcmlwdEJ1aWxkZXIsIG5vZGU6IHRzLk5vZGUsIG9wdGlvbnM6IFZpc2l0T3B0aW9ucyk6IHZvaWQge1xuICAgIGlmICghb3B0aW9ucy5wdXNoVmFsdWUpIHtcbiAgICAgIHNiLnZpc2l0KHRoaXMubGVmdCwgb3B0aW9ucyk7XG4gICAgICBzYi52aXNpdCh0aGlzLnJpZ2h0LCBvcHRpb25zKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGxlZnRUeXBlID0gc2IuY29udGV4dC5hbmFseXNpcy5nZXRUeXBlKHRoaXMubGVmdCk7XG4gICAgY29uc3QgcmlnaHRUeXBlID0gc2IuY29udGV4dC5hbmFseXNpcy5nZXRUeXBlKHRoaXMucmlnaHQpO1xuICAgIGlmIChsZWZ0VHlwZSAhPT0gdW5kZWZpbmVkICYmIHJpZ2h0VHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmVxdWFsc0VxdWFsc1R5cGUoc2IsIG5vZGUsIG9wdGlvbnMsIGxlZnRUeXBlLCByaWdodFR5cGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVxdWFsc0VxdWFsc1Vua25vd24oc2IsIG5vZGUsIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBlcXVhbHNFcXVhbHNUeXBlKFxuICAgIHNiOiBTY3JpcHRCdWlsZGVyLFxuICAgIG5vZGU6IHRzLk5vZGUsXG4gICAgb3B0aW9uczogVmlzaXRPcHRpb25zLFxuICAgIGxlZnRUeXBlOiB0cy5UeXBlLFxuICAgIHJpZ2h0VHlwZTogdHMuVHlwZSxcbiAgKTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgdHNVdGlscy50eXBlXy5pc09ubHkobGVmdFR5cGUpICYmXG4gICAgICB0c1V0aWxzLnR5cGVfLmlzT25seShyaWdodFR5cGUpICYmXG4gICAgICB0c1V0aWxzLnR5cGVfLmlzU2FtZShsZWZ0VHlwZSwgcmlnaHRUeXBlKVxuICAgICkge1xuICAgICAgc2IuZW1pdEhlbHBlcihub2RlLCBvcHRpb25zLCBzYi5oZWxwZXJzLmVxdWFsc0VxdWFsc0VxdWFscyh7IGxlZnRUeXBlLCByaWdodFR5cGUgfSkpO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICAodHNVdGlscy50eXBlXy5oYXNOdWxsKGxlZnRUeXBlKSB8fCB0c1V0aWxzLnR5cGVfLmhhc1VuZGVmaW5lZChsZWZ0VHlwZSkpICYmXG4gICAgICAodHNVdGlscy50eXBlXy5pc09ubHlVbmRlZmluZWQocmlnaHRUeXBlKSB8fCB0c1V0aWxzLnR5cGVfLmlzT25seU51bGwocmlnaHRUeXBlKSlcbiAgICApIHtcbiAgICAgIC8vIFtsZWZ0XVxuICAgICAgc2IudmlzaXQodGhpcy5sZWZ0LCBvcHRpb25zKTtcbiAgICAgIC8vIFtsZWZ0XVxuICAgICAgc2IudmlzaXQodGhpcy5yaWdodCwgc2Iubm9QdXNoVmFsdWVPcHRpb25zKG9wdGlvbnMpKTtcbiAgICAgIC8vIFtlcXVhbHNdXG4gICAgICBzYi5lbWl0SGVscGVyKG5vZGUsIG9wdGlvbnMsIHNiLmhlbHBlcnMuaXNOdWxsT3JVbmRlZmluZWQoeyB0eXBlOiByaWdodFR5cGUgfSkpO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICB0c1V0aWxzLnR5cGVfLmlzT25seU51bWJlcmlzaChsZWZ0VHlwZSkgJiZcbiAgICAgICh0c1V0aWxzLnR5cGVfLmlzT25seVN0cmluZ2lzaChyaWdodFR5cGUpIHx8IHRzVXRpbHMudHlwZV8uaXNPbmx5Qm9vbGVhbmlzaChyaWdodFR5cGUpKVxuICAgICkge1xuICAgICAgLy8gW2xlZnRdXG4gICAgICBzYi52aXNpdCh0aGlzLmxlZnQsIG9wdGlvbnMpO1xuICAgICAgLy8gW3JpZ2h0LCBsZWZ0XVxuICAgICAgc2IudmlzaXQodGhpcy5yaWdodCwgb3B0aW9ucyk7XG4gICAgICAvLyBbZXF1YWxzXVxuICAgICAgdGhpcy5lcXVhbHNFcXVhbHNMZWZ0TnVtYmVyUmlnaHRCb29sZWFuT3JTdHJpbmcoc2IsIG5vZGUsIG9wdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICB0c1V0aWxzLnR5cGVfLmlzT25seUJvb2xlYW5pc2gobGVmdFR5cGUpICYmXG4gICAgICAodHNVdGlscy50eXBlXy5pc09ubHlTdHJpbmdpc2gocmlnaHRUeXBlKSB8fCB0c1V0aWxzLnR5cGVfLmlzT25seUJvb2xlYW5pc2gocmlnaHRUeXBlKSlcbiAgICApIHtcbiAgICAgIC8vIFtsZWZ0XVxuICAgICAgc2IudmlzaXQodGhpcy5sZWZ0LCBvcHRpb25zKTtcbiAgICAgIC8vIFtsZWZ0TnVtYmVyXVxuICAgICAgc2IuZW1pdEhlbHBlcih0aGlzLmxlZnQsIG9wdGlvbnMsIHNiLmhlbHBlcnMudG9OdW1iZXIoeyB0eXBlOiBzYi5jb250ZXh0LmFuYWx5c2lzLmdldFR5cGUodGhpcy5sZWZ0KSB9KSk7XG4gICAgICAvLyBbbGVmdE51bWJlclZhbF1cbiAgICAgIHNiLmVtaXRIZWxwZXIodGhpcy5sZWZ0LCBvcHRpb25zLCBzYi5oZWxwZXJzLndyYXBOdW1iZXIpO1xuICAgICAgLy8gW3JpZ2h0LCBsZWZ0TnVtYmVyVmFsXVxuICAgICAgc2IudmlzaXQodGhpcy5yaWdodCwgb3B0aW9ucyk7XG4gICAgICAvLyBbZXF1YWxzXVxuICAgICAgdGhpcy5lcXVhbHNFcXVhbHNMZWZ0TnVtYmVyUmlnaHRCb29sZWFuT3JTdHJpbmcoc2IsIG5vZGUsIG9wdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICAodHNVdGlscy50eXBlXy5pc09ubHlTdHJpbmdpc2gobGVmdFR5cGUpIHx8IHRzVXRpbHMudHlwZV8uaXNPbmx5Qm9vbGVhbmlzaChsZWZ0VHlwZSkpICYmXG4gICAgICB0c1V0aWxzLnR5cGVfLmlzT25seU51bWJlcmlzaChyaWdodFR5cGUpXG4gICAgKSB7XG4gICAgICAvLyBbbGVmdF1cbiAgICAgIHNiLnZpc2l0KHRoaXMubGVmdCwgb3B0aW9ucyk7XG4gICAgICAvLyBbcmlnaHQsIGxlZnRdXG4gICAgICBzYi52aXNpdCh0aGlzLnJpZ2h0LCBvcHRpb25zKTtcbiAgICAgIC8vIFtlcXVhbHNdXG4gICAgICB0aGlzLmVxdWFsc0VxdWFsc1JpZ2h0TnVtYmVyTGVmdEJvb2xlYW5PclN0cmluZyhzYiwgbm9kZSwgb3B0aW9ucyk7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgICh0c1V0aWxzLnR5cGVfLmlzT25seVN0cmluZ2lzaChsZWZ0VHlwZSkgfHwgdHNVdGlscy50eXBlXy5pc09ubHlCb29sZWFuaXNoKGxlZnRUeXBlKSkgJiZcbiAgICAgIHRzVXRpbHMudHlwZV8uaXNPbmx5Qm9vbGVhbmlzaChyaWdodFR5cGUpXG4gICAgKSB7XG4gICAgICAvLyBbbGVmdF1cbiAgICAgIHNiLnZpc2l0KHRoaXMubGVmdCwgb3B0aW9ucyk7XG4gICAgICAvLyBbcmlnaHQsIGxlZnRdXG4gICAgICBzYi52aXNpdCh0aGlzLnJpZ2h0LCBvcHRpb25zKTtcbiAgICAgIC8vIFtyaWdodE51bWJlciwgbGVmdF1cbiAgICAgIHNiLmVtaXRIZWxwZXIodGhpcy5yaWdodCwgb3B0aW9ucywgc2IuaGVscGVycy50b051bWJlcih7IHR5cGU6IHNiLmNvbnRleHQuYW5hbHlzaXMuZ2V0VHlwZSh0aGlzLnJpZ2h0KSB9KSk7XG4gICAgICAvLyBbcmlnaHROdW1iZXJWYWwsIGxlZnRdXG4gICAgICBzYi5lbWl0SGVscGVyKHRoaXMucmlnaHQsIG9wdGlvbnMsIHNiLmhlbHBlcnMud3JhcE51bWJlcik7XG4gICAgICAvLyBbZXF1YWxzXVxuICAgICAgdGhpcy5lcXVhbHNFcXVhbHNSaWdodE51bWJlckxlZnRCb29sZWFuT3JTdHJpbmcoc2IsIG5vZGUsIG9wdGlvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVxdWFsc0VxdWFsc1Vua25vd24oc2IsIG5vZGUsIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBlcXVhbHNFcXVhbHNMZWZ0TnVtYmVyUmlnaHRCb29sZWFuT3JTdHJpbmcoc2I6IFNjcmlwdEJ1aWxkZXIsIG5vZGU6IHRzLk5vZGUsIG9wdGlvbnM6IFZpc2l0T3B0aW9ucyk6IHZvaWQge1xuICAgIC8vIFtyaWdodE51bWJlciwgbGVmdF1cbiAgICBzYi5lbWl0SGVscGVyKHRoaXMucmlnaHQsIG9wdGlvbnMsIHNiLmhlbHBlcnMudG9OdW1iZXIoeyB0eXBlOiBzYi5jb250ZXh0LmFuYWx5c2lzLmdldFR5cGUodGhpcy5yaWdodCkgfSkpO1xuICAgIC8vIFtyaWdodE51bWJlciwgbGVmdF1cbiAgICBzYi5lbWl0SGVscGVyKHRoaXMucmlnaHQsIG9wdGlvbnMsIHNiLmhlbHBlcnMud3JhcE51bWJlcik7XG4gICAgLy8gW2VxdWFsc11cbiAgICBzYi5lbWl0SGVscGVyKFxuICAgICAgbm9kZSxcbiAgICAgIG9wdGlvbnMsXG4gICAgICBzYi5oZWxwZXJzLmVxdWFsc0VxdWFsc0VxdWFscyh7XG4gICAgICAgIGxlZnRUeXBlOiB1bmRlZmluZWQsXG4gICAgICAgIGxlZnRLbm93blR5cGU6IFR5cGVzLk51bWJlcixcbiAgICAgICAgcmlnaHRUeXBlOiB1bmRlZmluZWQsXG4gICAgICAgIHJpZ2h0S25vd25UeXBlOiBUeXBlcy5OdW1iZXIsXG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGVxdWFsc0VxdWFsc1JpZ2h0TnVtYmVyTGVmdEJvb2xlYW5PclN0cmluZyhzYjogU2NyaXB0QnVpbGRlciwgbm9kZTogdHMuTm9kZSwgb3B0aW9uczogVmlzaXRPcHRpb25zKTogdm9pZCB7XG4gICAgLy8gW2xlZnQsIHJpZ2h0XVxuICAgIHNiLmVtaXRPcChub2RlLCAnU1dBUCcpO1xuICAgIC8vIFtsZWZ0TnVtYmVyLCByaWdodF1cbiAgICBzYi5lbWl0SGVscGVyKHRoaXMubGVmdCwgb3B0aW9ucywgc2IuaGVscGVycy50b051bWJlcih7IHR5cGU6IHNiLmNvbnRleHQuYW5hbHlzaXMuZ2V0VHlwZSh0aGlzLmxlZnQpIH0pKTtcbiAgICAvLyBbbGVmdE51bWJlciwgcmlnaHRdXG4gICAgc2IuZW1pdEhlbHBlcih0aGlzLmxlZnQsIG9wdGlvbnMsIHNiLmhlbHBlcnMud3JhcE51bWJlcik7XG4gICAgLy8gW3JpZ2h0LCBsZWZ0TnVtYmVyXVxuICAgIHNiLmVtaXRPcChub2RlLCAnU1dBUCcpO1xuICAgIC8vIFtlcXVhbHNdXG4gICAgc2IuZW1pdEhlbHBlcihcbiAgICAgIG5vZGUsXG4gICAgICBvcHRpb25zLFxuICAgICAgc2IuaGVscGVycy5lcXVhbHNFcXVhbHNFcXVhbHMoe1xuICAgICAgICBsZWZ0VHlwZTogdW5kZWZpbmVkLFxuICAgICAgICBsZWZ0S25vd25UeXBlOiBUeXBlcy5OdW1iZXIsXG4gICAgICAgIHJpZ2h0VHlwZTogdW5kZWZpbmVkLFxuICAgICAgICByaWdodEtub3duVHlwZTogVHlwZXMuTnVtYmVyLFxuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBlcXVhbHNFcXVhbHNVbmtub3duKHNiOiBTY3JpcHRCdWlsZGVyLCBub2RlOiB0cy5Ob2RlLCBvcHRpb25zOiBWaXNpdE9wdGlvbnMpOiB2b2lkIHtcbiAgICBjb25zdCBjb3B5ID0gKCkgPT4ge1xuICAgICAgLy8gW2xlZnQsIHJpZ2h0XVxuICAgICAgc2IuZW1pdE9wKHRoaXMucmlnaHQsICdTV0FQJyk7XG4gICAgICAvLyBbbGVmdCwgcmlnaHQsIGxlZnRdXG4gICAgICBzYi5lbWl0T3AodGhpcy5yaWdodCwgJ1RVQ0snKTtcbiAgICAgIC8vIFtyaWdodCwgbGVmdCwgcmlnaHQsIGxlZnRdXG4gICAgICBzYi5lbWl0T3AodGhpcy5yaWdodCwgJ09WRVInKTtcbiAgICB9O1xuXG4gICAgLy8gW2xlZnRdXG4gICAgc2IudmlzaXQodGhpcy5sZWZ0LCBvcHRpb25zKTtcbiAgICAvLyBbcmlnaHQsIGxlZnRdXG4gICAgc2IudmlzaXQodGhpcy5yaWdodCwgb3B0aW9ucyk7XG5cbiAgICBjb25zdCBjYXNlcyA9IFtcbiAgICAgIHtcbiAgICAgICAgY29uZGl0aW9uOiAoKSA9PiB7XG4gICAgICAgICAgY29weSgpO1xuICAgICAgICAgIC8vIFtyaWdodCwgbGVmdF1cbiAgICAgICAgICBzYi5lbWl0SGVscGVyKFxuICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICBzYi5oZWxwZXJzLmVxdWFsc0VxdWFsc0VxdWFscyh7XG4gICAgICAgICAgICAgIGxlZnRUeXBlOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIHJpZ2h0VHlwZTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgd2hlblRydWU6ICgpID0+IHtcbiAgICAgICAgICBzYi5lbWl0T3Aobm9kZSwgJ0RST1AnKTtcbiAgICAgICAgICBzYi5lbWl0T3Aobm9kZSwgJ0RST1AnKTtcbiAgICAgICAgICBzYi5lbWl0UHVzaEJvb2xlYW4obm9kZSwgdHJ1ZSk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBjb25kaXRpb246ICgpID0+IHtcbiAgICAgICAgICBjb3B5KCk7XG4gICAgICAgICAgLy8gW3JpZ2h0SXNOdWxsT3JVbmRlZmluZWQsIGxlZnQsIHJpZ2h0LCBsZWZ0XVxuICAgICAgICAgIHNiLmVtaXRIZWxwZXIobm9kZSwgb3B0aW9ucywgc2IuaGVscGVycy5pc051bGxPclVuZGVmaW5lZCh7IHR5cGU6IHVuZGVmaW5lZCB9KSk7XG4gICAgICAgICAgLy8gW2xlZnQsIHJpZ2h0SXNOdWxsT3JVbmRlZmluZWQsIHJpZ2h0LCBsZWZ0XVxuICAgICAgICAgIHNiLmVtaXRPcChub2RlLCAnU1dBUCcpO1xuICAgICAgICAgIC8vIFtsZWZ0SXNOdWxsT3JVbmRlZmluZWQsIHJpZ2h0SXNOdWxsT3JVbmRlZmluZWQsIHJpZ2h0LCBsZWZ0XVxuICAgICAgICAgIHNiLmVtaXRIZWxwZXIobm9kZSwgb3B0aW9ucywgc2IuaGVscGVycy5pc051bGxPclVuZGVmaW5lZCh7IHR5cGU6IHVuZGVmaW5lZCB9KSk7XG4gICAgICAgICAgLy8gW2VxdWFscywgcmlnaHQsIGxlZnRdXG4gICAgICAgICAgc2IuZW1pdE9wKG5vZGUsICdCT09MT1InKTtcbiAgICAgICAgfSxcbiAgICAgICAgd2hlblRydWU6ICgpID0+IHtcbiAgICAgICAgICAvLyBbaXNOdWxsT3JVbmRlZmluZWQsIGxlZnRdXG4gICAgICAgICAgc2IuZW1pdEhlbHBlcihub2RlLCBvcHRpb25zLCBzYi5oZWxwZXJzLmlzTnVsbE9yVW5kZWZpbmVkKHsgdHlwZTogdW5kZWZpbmVkIH0pKTtcbiAgICAgICAgICAvLyBbbGVmdCwgcmlnaHRJc051bGxPclVuZGVmaW5lZF1cbiAgICAgICAgICBzYi5lbWl0T3Aobm9kZSwgJ1NXQVAnKTtcbiAgICAgICAgICAvLyBbbGVmdElzTnVsbE9yVW5kZWZpbmVkLCByaWdodElzTnVsbE9yVW5kZWZpbmVkXVxuICAgICAgICAgIHNiLmVtaXRIZWxwZXIobm9kZSwgb3B0aW9ucywgc2IuaGVscGVycy5pc051bGxPclVuZGVmaW5lZCh7IHR5cGU6IHVuZGVmaW5lZCB9KSk7XG4gICAgICAgICAgLy8gW2VxdWFsc11cbiAgICAgICAgICBzYi5lbWl0T3Aobm9kZSwgJ0VRVUFMJyk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBjb25kaXRpb246ICgpID0+IHtcbiAgICAgICAgICBjb3B5KCk7XG4gICAgICAgICAgLy8gW3JpZ2h0LCByaWdodCwgbGVmdCwgcmlnaHQsIGxlZnRdXG4gICAgICAgICAgc2IuZW1pdE9wKG5vZGUsICdEVVAnKTtcbiAgICAgICAgICAvLyBbaXNTdHJpbmcsIHJpZ2h0LCBsZWZ0LCByaWdodCwgbGVmdF1cbiAgICAgICAgICBzYi5lbWl0SGVscGVyKHRoaXMucmlnaHQsIG9wdGlvbnMsIHNiLmhlbHBlcnMuaXNTdHJpbmcpO1xuICAgICAgICAgIC8vIFtyaWdodCwgaXNTdHJpbmcsIGxlZnQsIHJpZ2h0LCBsZWZ0XVxuICAgICAgICAgIHNiLmVtaXRPcChub2RlLCAnU1dBUCcpO1xuICAgICAgICAgIC8vIFtpc0Jvb2xlYW4sIGlzU3RyaW5nLCBsZWZ0LCByaWdodCwgbGVmdF1cbiAgICAgICAgICBzYi5lbWl0SGVscGVyKHRoaXMucmlnaHQsIG9wdGlvbnMsIHNiLmhlbHBlcnMuaXNCb29sZWFuKTtcbiAgICAgICAgICAvLyBbaXNCb29sZWFuT3JTdHJpbmcsIGxlZnQsIHJpZ2h0LCBsZWZ0XVxuICAgICAgICAgIHNiLmVtaXRPcChub2RlLCAnQk9PTE9SJyk7XG4gICAgICAgICAgLy8gW2xlZnQsIGlzQm9vbGVhbk9yU3RyaW5nLCByaWdodCwgbGVmdF1cbiAgICAgICAgICBzYi5lbWl0T3Aobm9kZSwgJ1NXQVAnKTtcbiAgICAgICAgICAvLyBbbGVmdCwgbGVmdCwgaXNCb29sZWFuT3JTdHJpbmcsIHJpZ2h0LCBsZWZ0XVxuICAgICAgICAgIHNiLmVtaXRPcChub2RlLCAnRFVQJyk7XG4gICAgICAgICAgLy8gW2lzTnVtYmVyLCBsZWZ0LCBpc0Jvb2xlYW5PclN0cmluZywgcmlnaHQsIGxlZnRdXG4gICAgICAgICAgc2IuZW1pdEhlbHBlcih0aGlzLnJpZ2h0LCBvcHRpb25zLCBzYi5oZWxwZXJzLmlzTnVtYmVyKTtcbiAgICAgICAgICAvLyBbbGVmdCwgaXNOdW1iZXIsIGlzQm9vbGVhbk9yU3RyaW5nLCByaWdodCwgbGVmdF1cbiAgICAgICAgICBzYi5lbWl0T3Aobm9kZSwgJ1NXQVAnKTtcbiAgICAgICAgICAvLyBbaXNCb29sZWFuLCBpc051bWJlciwgaXNCb29sZWFuT3JTdHJpbmcsIHJpZ2h0LCBsZWZ0XVxuICAgICAgICAgIHNiLmVtaXRIZWxwZXIodGhpcy5yaWdodCwgb3B0aW9ucywgc2IuaGVscGVycy5pc0Jvb2xlYW4pO1xuICAgICAgICAgIC8vIFtpc0Jvb2xlYW5Pck51bWJlciwgaXNCb29sZWFuT3JTdHJpbmcsIHJpZ2h0LCBsZWZ0XVxuICAgICAgICAgIHNiLmVtaXRPcChub2RlLCAnQk9PTE9SJyk7XG4gICAgICAgICAgLy8gW2lzKEJvb2xlYW5Pck51bWJlcilBbmQoQm9vbGVhbk9yU3RyaW5nKSwgcmlnaHQsIGxlZnRdXG4gICAgICAgICAgc2IuZW1pdE9wKG5vZGUsICdCT09MQU5EJyk7XG4gICAgICAgIH0sXG4gICAgICAgIHdoZW5UcnVlOiAoKSA9PiB7XG4gICAgICAgICAgLy8gW2xlZnQsIHJpZ2h0XVxuICAgICAgICAgIHNiLmVtaXRPcChub2RlLCAnU1dBUCcpO1xuICAgICAgICAgIC8vIFtsZWZ0TnVtYmVyLCByaWdodF1cbiAgICAgICAgICBzYi5lbWl0SGVscGVyKG5vZGUsIG9wdGlvbnMsIHNiLmhlbHBlcnMudG9OdW1iZXIoeyB0eXBlOiBzYi5jb250ZXh0LmFuYWx5c2lzLmdldFR5cGUodGhpcy5sZWZ0KSB9KSk7XG4gICAgICAgICAgLy8gW2xlZnROdW1iZXIsIHJpZ2h0XVxuICAgICAgICAgIHNiLmVtaXRIZWxwZXIobm9kZSwgb3B0aW9ucywgc2IuaGVscGVycy53cmFwTnVtYmVyKTtcbiAgICAgICAgICAvLyBbcmlnaHQsIGxlZnROdW1iZXJdXG4gICAgICAgICAgc2IuZW1pdE9wKG5vZGUsICdTV0FQJyk7XG4gICAgICAgICAgdGhpcy5lcXVhbHNFcXVhbHNMZWZ0TnVtYmVyUmlnaHRCb29sZWFuT3JTdHJpbmcoc2IsIG5vZGUsIG9wdGlvbnMpO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgY29uZGl0aW9uOiAoKSA9PiB7XG4gICAgICAgICAgY29weSgpO1xuICAgICAgICAgIC8vIFtsZWZ0LCByaWdodCwgcmlnaHQsIGxlZnRdXG4gICAgICAgICAgc2IuZW1pdE9wKG5vZGUsICdTV0FQJyk7XG4gICAgICAgICAgLy8gW2xlZnQsIGxlZnQsIHJpZ2h0LCByaWdodCwgbGVmdF1cbiAgICAgICAgICBzYi5lbWl0T3Aobm9kZSwgJ0RVUCcpO1xuICAgICAgICAgIC8vIFtpc1N0cmluZywgbGVmdCwgcmlnaHQsIHJpZ2h0LCBsZWZ0XVxuICAgICAgICAgIHNiLmVtaXRIZWxwZXIodGhpcy5yaWdodCwgb3B0aW9ucywgc2IuaGVscGVycy5pc1N0cmluZyk7XG4gICAgICAgICAgLy8gW2xlZnQsIGlzU3RyaW5nLCByaWdodCwgcmlnaHQsIGxlZnRdXG4gICAgICAgICAgc2IuZW1pdE9wKG5vZGUsICdTV0FQJyk7XG4gICAgICAgICAgLy8gW2lzQm9vbGVhbiwgaXNTdHJpbmcsIHJpZ2h0LCByaWdodCwgbGVmdF1cbiAgICAgICAgICBzYi5lbWl0SGVscGVyKHRoaXMucmlnaHQsIG9wdGlvbnMsIHNiLmhlbHBlcnMuaXNCb29sZWFuKTtcbiAgICAgICAgICAvLyBbaXNCb29sZWFuT3JTdHJpbmcsIHJpZ2h0LCByaWdodCwgbGVmdF1cbiAgICAgICAgICBzYi5lbWl0T3Aobm9kZSwgJ0JPT0xPUicpO1xuICAgICAgICAgIC8vIFtyaWdodCwgaXNCb29sZWFuT3JTdHJpbmcsIHJpZ2h0LCBsZWZ0XVxuICAgICAgICAgIHNiLmVtaXRPcChub2RlLCAnU1dBUCcpO1xuICAgICAgICAgIC8vIFtyaWdodCwgcmlnaHQsIGlzQm9vbGVhbk9yU3RyaW5nLCByaWdodCwgbGVmdF1cbiAgICAgICAgICBzYi5lbWl0T3Aobm9kZSwgJ0RVUCcpO1xuICAgICAgICAgIC8vIFtpc051bWJlciwgcmlnaHQsIGlzQm9vbGVhbk9yU3RyaW5nLCByaWdodCwgbGVmdF1cbiAgICAgICAgICBzYi5lbWl0SGVscGVyKHRoaXMucmlnaHQsIG9wdGlvbnMsIHNiLmhlbHBlcnMuaXNOdW1iZXIpO1xuICAgICAgICAgIC8vIFtyaWdodCwgaXNOdW1iZXIsIGlzQm9vbGVhbk9yU3RyaW5nLCByaWdodCwgbGVmdF1cbiAgICAgICAgICBzYi5lbWl0T3Aobm9kZSwgJ1NXQVAnKTtcbiAgICAgICAgICAvLyBbaXNCb29sZWFuLCBpc051bWJlciwgaXNCb29sZWFuT3JTdHJpbmcsIHJpZ2h0LCBsZWZ0XVxuICAgICAgICAgIHNiLmVtaXRIZWxwZXIodGhpcy5yaWdodCwgb3B0aW9ucywgc2IuaGVscGVycy5pc0Jvb2xlYW4pO1xuICAgICAgICAgIC8vIFtpc0Jvb2xlYW5Pck51bWJlciwgaXNCb29sZWFuT3JTdHJpbmcsIHJpZ2h0LCBsZWZ0XVxuICAgICAgICAgIHNiLmVtaXRPcChub2RlLCAnQk9PTE9SJyk7XG4gICAgICAgICAgLy8gW2lzKEJvb2xlYW5Pck51bWJlcilBbmQoQm9vbGVhbk9yU3RyaW5nKSwgcmlnaHQsIGxlZnRdXG4gICAgICAgICAgc2IuZW1pdE9wKG5vZGUsICdCT09MQU5EJyk7XG4gICAgICAgIH0sXG4gICAgICAgIHdoZW5UcnVlOiAoKSA9PiB7XG4gICAgICAgICAgLy8gW3JpZ2h0TnVtYmVyLCBsZWZ0XVxuICAgICAgICAgIHNiLmVtaXRIZWxwZXIobm9kZSwgb3B0aW9ucywgc2IuaGVscGVycy50b051bWJlcih7IHR5cGU6IHNiLmNvbnRleHQuYW5hbHlzaXMuZ2V0VHlwZSh0aGlzLnJpZ2h0KSB9KSk7XG4gICAgICAgICAgLy8gW3JpZ2h0TnVtYmVyLCBsZWZ0XVxuICAgICAgICAgIHNiLmVtaXRIZWxwZXIobm9kZSwgb3B0aW9ucywgc2IuaGVscGVycy53cmFwTnVtYmVyKTtcbiAgICAgICAgICB0aGlzLmVxdWFsc0VxdWFsc1JpZ2h0TnVtYmVyTGVmdEJvb2xlYW5PclN0cmluZyhzYiwgbm9kZSwgb3B0aW9ucyk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIF07XG5cbiAgICBzYi5lbWl0SGVscGVyKFxuICAgICAgbm9kZSxcbiAgICAgIG9wdGlvbnMsXG4gICAgICBzYi5oZWxwZXJzLmNhc2UoY2FzZXMsICgpID0+IHtcbiAgICAgICAgLy8gW3JpZ2h0UHJpbSwgbGVmdF1cbiAgICAgICAgc2IuZW1pdEhlbHBlcihub2RlLCBvcHRpb25zLCBzYi5oZWxwZXJzLnRvUHJpbWl0aXZlKHsgdHlwZTogc2IuY29udGV4dC5hbmFseXNpcy5nZXRUeXBlKHRoaXMucmlnaHQpIH0pKTtcbiAgICAgICAgLy8gW2xlZnQsIHJpZ2h0UHJpbV1cbiAgICAgICAgc2IuZW1pdE9wKG5vZGUsICdTV0FQJyk7XG4gICAgICAgIC8vIFtsZWZ0UHJpbSwgcmlnaHRQcmltXVxuICAgICAgICBzYi5lbWl0SGVscGVyKG5vZGUsIG9wdGlvbnMsIHNiLmhlbHBlcnMudG9QcmltaXRpdmUoeyB0eXBlOiBzYi5jb250ZXh0LmFuYWx5c2lzLmdldFR5cGUodGhpcy5sZWZ0KSB9KSk7XG4gICAgICAgIC8vIFtyaWdodFByaW0sIGxlZnRQcmltXVxuICAgICAgICBzYi5lbWl0T3Aobm9kZSwgJ1NXQVAnKTtcbiAgICAgICAgc2IuZW1pdEhlbHBlcihcbiAgICAgICAgICBub2RlLFxuICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgc2IuaGVscGVycy5jYXNlKGNhc2VzLCAoKSA9PiB7XG4gICAgICAgICAgICAvLyBbbGVmdFByaW1dXG4gICAgICAgICAgICBzYi5lbWl0T3Aobm9kZSwgJ0RST1AnKTtcbiAgICAgICAgICAgIC8vIFtdXG4gICAgICAgICAgICBzYi5lbWl0T3Aobm9kZSwgJ0RST1AnKTtcbiAgICAgICAgICAgIC8vIFtlcXVhbHNdXG4gICAgICAgICAgICBzYi5lbWl0UHVzaEJvb2xlYW4obm9kZSwgZmFsc2UpO1xuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxufVxuIl19