@neo-one/smart-contract-compiler
Version:
NEO•ONE TypeScript smart contract compiler.
113 lines (111 loc) • 17.7 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const tslib_1 = require("tslib");
const ts_utils_1 = require("@neo-one/ts-utils");
const typescript_1 = tslib_1.__importDefault(require("typescript"));
const DiagnosticCode_1 = require("../../DiagnosticCode");
const DiagnosticMessage_1 = require("../../DiagnosticMessage");
const builtins_1 = require("../builtins");
const NodeCompiler_1 = require("../NodeCompiler");
class PropertyAccessExpressionCompiler extends NodeCompiler_1.NodeCompiler {
constructor() {
super(...arguments);
this.kind = typescript_1.default.SyntaxKind.PropertyAccessExpression;
}
visitNode(sb, expr, optionsIn) {
const value = ts_utils_1.tsUtils.expression.getExpression(expr);
const valueType = sb.context.analysis.getType(value);
const name = ts_utils_1.tsUtils.node.getNameNode(expr);
const nameValue = ts_utils_1.tsUtils.node.getName(expr);
const handleBuiltin = (member, visited) => {
if (builtins_1.isBuiltinInstanceMemberValue(member)) {
member.emitValue(sb, expr, optionsIn, visited);
return;
}
if (builtins_1.isBuiltinMemberValue(member)) {
member.emitValue(sb, expr, optionsIn);
return;
}
if (optionsIn.setValue) {
sb.context.reportError(name, DiagnosticCode_1.DiagnosticCode.InvalidBuiltinModify, DiagnosticMessage_1.DiagnosticMessage.CannotModifyBuiltin);
}
else {
sb.context.reportError(name, DiagnosticCode_1.DiagnosticCode.InvalidBuiltinReference, DiagnosticMessage_1.DiagnosticMessage.CannotReferenceBuiltinProperty);
}
};
const builtin = sb.context.builtins.getMember(value, name);
if (builtin !== undefined) {
handleBuiltin(builtin, false);
return;
}
const throwTypeError = (innerOptions) => {
sb.emitOp(expr, 'DROP');
sb.emitHelper(expr, innerOptions, sb.helpers.throwTypeError);
};
const createProcessBuiltin = (valueName) => {
const member = sb.context.builtins.getOnlyMember(valueName, nameValue);
if (member === undefined) {
return throwTypeError;
}
return () => {
handleBuiltin(member, true);
};
};
const processObject = (innerOptions) => {
sb.emitPushString(name, nameValue);
if (optionsIn.pushValue && optionsIn.setValue) {
sb.emitOp(expr, 'OVER');
sb.emitOp(expr, 'OVER');
sb.emitPushInt(expr, 4);
sb.emitOp(expr, 'ROLL');
sb.emitHelper(expr, innerOptions, sb.helpers.setPropertyObjectProperty);
sb.emitHelper(expr, innerOptions, sb.helpers.getPropertyObjectProperty);
}
else if (optionsIn.setValue) {
sb.emitOp(expr, 'ROT');
sb.emitHelper(expr, innerOptions, sb.helpers.setPropertyObjectProperty);
}
else {
sb.emitHelper(expr, innerOptions, sb.helpers.getPropertyObjectProperty);
if (!optionsIn.pushValue) {
sb.emitOp(expr, 'DROP');
}
}
};
const options = sb.pushValueOptions(sb.noSetValueOptions(optionsIn));
sb.visit(value, options);
sb.emitHelper(value, options, sb.helpers.forBuiltinType({
type: valueType,
array: createProcessBuiltin('Array'),
arrayStorage: createProcessBuiltin('ArrayStorage'),
boolean: createProcessBuiltin('Boolean'),
buffer: createProcessBuiltin('Buffer'),
null: throwTypeError,
number: createProcessBuiltin('Number'),
object: processObject,
string: createProcessBuiltin('String'),
symbol: createProcessBuiltin('Symbol'),
undefined: throwTypeError,
map: createProcessBuiltin('Map'),
mapStorage: createProcessBuiltin('MapStorage'),
set: createProcessBuiltin('Set'),
setStorage: createProcessBuiltin('SetStorage'),
error: createProcessBuiltin('Error'),
forwardValue: createProcessBuiltin('ForwardValue'),
iteratorResult: createProcessBuiltin('IteratorResult'),
iterable: createProcessBuiltin('Iterable'),
iterableIterator: createProcessBuiltin('IterableIterator'),
transaction: createProcessBuiltin('TransactionBase'),
output: createProcessBuiltin('Output'),
attribute: createProcessBuiltin('AttributeBase'),
input: createProcessBuiltin('Input'),
account: createProcessBuiltin('Account'),
asset: createProcessBuiltin('Asset'),
contract: createProcessBuiltin('Contract'),
header: createProcessBuiltin('Header'),
block: createProcessBuiltin('Block'),
}));
}
}
exports.PropertyAccessExpressionCompiler = PropertyAccessExpressionCompiler;
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlByb3BlcnR5QWNjZXNzRXhwcmVzc2lvbkNvbXBpbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLGdEQUE0QztBQUM1QyxvRUFBNEI7QUFDNUIseURBQXNEO0FBQ3RELCtEQUE0RDtBQUM1RCwwQ0FBMEY7QUFDMUYsa0RBQStDO0FBSS9DLE1BQWEsZ0NBQWlDLFNBQVEsMkJBQXlDO0lBQS9GOztRQUNrQixTQUFJLEdBQUcsb0JBQUUsQ0FBQyxVQUFVLENBQUMsd0JBQXdCLENBQUM7SUFrSWhFLENBQUM7SUFoSVEsU0FBUyxDQUFDLEVBQWlCLEVBQUUsSUFBaUMsRUFBRSxTQUF1QjtRQUM1RixNQUFNLEtBQUssR0FBRyxrQkFBTyxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckQsTUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3JELE1BQU0sSUFBSSxHQUFHLGtCQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1QyxNQUFNLFNBQVMsR0FBRyxrQkFBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFN0MsTUFBTSxhQUFhLEdBQUcsQ0FBQyxNQUFlLEVBQUUsT0FBZ0IsRUFBRSxFQUFFO1lBQzFELElBQUksdUNBQTRCLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQ3hDLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBRS9DLE9BQU87YUFDUjtZQUVELElBQUksK0JBQW9CLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQ2hDLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztnQkFFdEMsT0FBTzthQUNSO1lBRUQsSUFBSSxTQUFTLENBQUMs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LFdBQVcsRUFBRSxvQkFBb0IsQ0FBQyxpQkFBaUIsQ0FBQztZQUNwRCxNQUFNLEVBQUUsb0JBQW9CLENBQUMsUUFBUSxDQUFDO1lBQ3RDLFNBQVMsRUFBRSxvQkFBb0IsQ0FBQyxlQUFlLENBQUM7WUFDaEQsS0FBSyxFQUFFLG9CQUFvQixDQUFDLE9BQU8sQ0FBQztZQUNwQyxPQUFPLEVBQUUsb0JBQW9CLENBQUMsU0FBUyxDQUFDO1lBQ3hDLEtBQUssRUFBRSxvQkFBb0IsQ0FBQyxPQUFPLENBQUM7WUFDcEMsUUFBUSxFQUFFLG9CQUFvQixDQUFDLFVBQVUsQ0FBQztZQUMxQyxNQUFNLEVBQUUsb0JBQW9CLENBQUMsUUFBUSxDQUFDO1lBQ3RDLEtBQUssRUFBRSxvQkFBb0IsQ0FBQyxPQUFPLENBQUM7U0FDckMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0NBQ0Y7QUFuSUQsNEVBbUlDIiwiZmlsZSI6Im5lby1vbmUtc21hcnQtY29udHJhY3QtY29tcGlsZXIvc3JjL2NvbXBpbGUvZXhwcmVzc2lvbi9Qcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb25Db21waWxlci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHRzVXRpbHMgfSBmcm9tICdAbmVvLW9uZS90cy11dGlscyc7XG5pbXBvcnQgdHMgZnJvbSAndHlwZXNjcmlwdCc7XG5pbXBvcnQgeyBEaWFnbm9zdGljQ29kZSB9IGZyb20gJy4uLy4uL0RpYWdub3N0aWNDb2RlJztcbmltcG9ydCB7IERpYWdub3N0aWNNZXNzYWdlIH0gZnJvbSAnLi4vLi4vRGlhZ25vc3RpY01lc3NhZ2UnO1xuaW1wb3J0IHsgQnVpbHRpbiwgaXNCdWlsdGluSW5zdGFuY2VNZW1iZXJWYWx1ZSwgaXNCdWlsdGluTWVtYmVyVmFsdWUgfSBmcm9tICcuLi9idWlsdGlucyc7XG5pbXBvcnQgeyBOb2RlQ29tcGlsZXIgfSBmcm9tICcuLi9Ob2RlQ29tcGlsZXInO1xuaW1wb3J0IHsgU2NyaXB0QnVpbGRlciB9IGZyb20gJy4uL3NiJztcbmltcG9ydCB7IFZpc2l0T3B0aW9ucyB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIFByb3BlcnR5QWNjZXNzRXhwcmVzc2lvbkNvbXBpbGVyIGV4dGVuZHMgTm9kZUNvbXBpbGVyPHRzLlByb3BlcnR5QWNjZXNzRXhwcmVzc2lvbj4ge1xuICBwdWJsaWMgcmVhZG9ubHkga2luZCA9IHRzLlN5bnRheEtpbmQuUHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uO1xuXG4gIHB1YmxpYyB2aXNpdE5vZGUoc2I6IFNjcmlwdEJ1aWxkZXIsIGV4cHI6IHRzLlByb3BlcnR5QWNjZXNzRXhwcmVzc2lvbiwgb3B0aW9uc0luOiBWaXNpdE9wdGlvbnMpOiB2b2lkIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRzVXRpbHMuZXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uKGV4cHIpO1xuICAgIGNvbnN0IHZhbHVlVHlwZSA9IHNiLmNvbnRleHQuYW5hbHlzaXMuZ2V0VHlwZSh2YWx1ZSk7XG4gICAgY29uc3QgbmFtZSA9IHRzVXRpbHMubm9kZS5nZXROYW1lTm9kZShleHByKTtcbiAgICBjb25zdCBuYW1lVmFsdWUgPSB0c1V0aWxzLm5vZGUuZ2V0TmFtZShleHByKTtcblxuICAgIGNvbnN0IGhhbmRsZUJ1aWx0aW4gPSAobWVtYmVyOiBCdWlsdGluLCB2aXNpdGVkOiBib29sZWFuKSA9PiB7XG4gICAgICBpZiAoaXNCdWlsdGluSW5zdGFuY2VNZW1iZXJWYWx1ZShtZW1iZXIpKSB7XG4gICAgICAgIG1lbWJlci5lbWl0VmFsdWUoc2IsIGV4cHIsIG9wdGlvbnNJbiwgdmlzaXRlZCk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNCdWlsdGluTWVtYmVyVmFsdWUobWVtYmVyKSkge1xuICAgICAgICBtZW1iZXIuZW1pdFZhbHVlKHNiLCBleHByLCBvcHRpb25zSW4pO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdGlvbnNJbi5zZXRWYWx1ZSkge1xuICAgICAgICBzYi5jb250ZXh0LnJlcG9ydEVycm9yKG5hbWUsIERpYWdub3N0aWNDb2RlLkludmFsaWRCdWlsdGluTW9kaWZ5LCBEaWFnbm9zdGljTWVzc2FnZS5DYW5ub3RNb2RpZnlCdWlsdGluKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNiLmNvbnRleHQucmVwb3J0RXJyb3IoXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICBEaWFnbm9zdGljQ29kZS5JbnZhbGlkQnVpbHRpblJlZmVyZW5jZSxcbiAgICAgICAgICBEaWFnbm9zdGljTWVzc2FnZS5DYW5ub3RSZWZlcmVuY2VCdWlsdGluUHJvcGVydHksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGJ1aWx0aW4gPSBzYi5jb250ZXh0LmJ1aWx0aW5zLmdldE1lbWJlcih2YWx1ZSwgbmFtZSk7XG4gICAgaWYgKGJ1aWx0aW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFuZGxlQnVpbHRpbihidWlsdGluLCBmYWxzZSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB0aHJvd1R5cGVFcnJvciA9IChpbm5lck9wdGlvbnM6IFZpc2l0T3B0aW9ucykgPT4ge1xuICAgICAgLy8gW11cbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICBzYi5lbWl0T3AoZXhwciwgJ0RST1AnKTtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICBzYi5lbWl0SGVscGVyKGV4cHIsIGlubmVyT3B0aW9ucywgc2IuaGVscGVycy50aHJvd1R5cGVFcnJvcik7XG4gICAgfTtcblxuICAgIGNvbnN0IGNyZWF0ZVByb2Nlc3NCdWlsdGluID0gKHZhbHVlTmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBtZW1iZXIgPSBzYi5jb250ZXh0LmJ1aWx0aW5zLmdldE9ubHlNZW1iZXIodmFsdWVOYW1lLCBuYW1lVmFsdWUpO1xuXG4gICAgICBpZiAobWVtYmVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHRocm93VHlwZUVycm9yO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBoYW5kbGVCdWlsdGluKG1lbWJlciwgdHJ1ZSk7XG4gICAgICB9O1xuICAgIH07XG5cbiAgICBjb25zdCBwcm9jZXNzT2JqZWN0ID0gKGlubmVyT3B0aW9uczogVmlzaXRPcHRpb25zKSA9PiB7XG4gICAgICBzYi5lbWl0UHVzaFN0cmluZyhuYW1lLCBuYW1lVmFsdWUpO1xuICAgICAgaWYgKG9wdGlvbnNJbi5wdXNoVmFsdWUgJiYgb3B0aW9uc0luLnNldFZhbHVlKSB7XG4gICAgICAgIC8vIFtvYmplY3RWYWwsIHN0cmluZywgb2JqZWN0VmFsLCB2YWxdXG4gICAgICAgIHNiLmVtaXRPcChleHByLCAnT1ZFUicpO1xuICAgICAgICAvLyBbc3RyaW5nLCBvYmplY3RWYWwsIHN0cmluZywgb2JqZWN0VmFsLCB2YWxdXG4gICAgICAgIHNiLmVtaXRPcChleHByLCAnT1ZFUicpO1xuICAgICAgICAvLyBbbnVtYmVyLCBzdHJpbmcsIG9iamVjdFZhbCwgc3RyaW5nLCBvYmplY3RWYWwsIHZhbF1cbiAgICAgICAgc2IuZW1pdFB1c2hJbnQoZXhwciwgNCk7XG4gICAgICAgIC8vIFt2YWwsIHN0cmluZywgb2JqZWN0VmFsLCBzdHJpbmcsIG9iamVjdFZhbF1cbiAgICAgICAgc2IuZW1pdE9wKGV4cHIsICdST0xMJyk7XG4gICAgICAgIC8vIFtzdHJpbmcsIG9iamVjdFZhbF1cbiAgICAgICAgc2IuZW1pdEhlbHBlcihleHByLCBpbm5lck9wdGlvbnMsIHNiLmhlbHBlcnMuc2V0UHJvcGVydHlPYmplY3RQcm9wZXJ0eSk7XG4gICAgICAgIC8vIFt2YWxdXG4gICAgICAgIHNiLmVtaXRIZWxwZXIoZXhwciwgaW5uZXJPcHRpb25zLCBzYi5oZWxwZXJzLmdldFByb3BlcnR5T2JqZWN0UHJvcGVydHkpO1xuICAgICAgfSBlbHNlIGlmIChvcHRpb25zSW4uc2V0VmFsdWUpIHtcbiAgICAgICAgLy8gW3ZhbCwgc3RyaW5nLCBvYmplY3RWYWxdXG4gICAgICAgIHNiLmVtaXRPcChleHByLCAnUk9UJyk7XG4gICAgICAgIC8vIFtdXG4gICAgICAgIHNiLmVtaXRIZWxwZXIoZXhwciwgaW5uZXJPcHRpb25zLCBzYi5oZWxwZXJzLnNldFByb3BlcnR5T2JqZWN0UHJvcGVydHkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSGFuZGxlIGdldHRlciBzaWRlIGVmZmVjdHNcbiAgICAgICAgLy8gW3ZhbF1cbiAgICAgICAgc2IuZW1pdEhlbHBlcihleHByLCBpbm5lck9wdGlvbnMsIHNiLmhlbHBlcnMuZ2V0UHJvcGVydHlPYmplY3RQcm9wZXJ0eSk7XG5cbiAgICAgICAgaWYgKCFvcHRpb25zSW4ucHVzaFZhbHVlKSB7XG4gICAgICAgICAgLy8gW11cbiAgICAgICAgICBzYi5lbWl0T3AoZXhwciwgJ0RST1AnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBvcHRpb25zID0gc2IucHVzaFZhbHVlT3B0aW9ucyhzYi5ub1NldFZhbHVlT3B0aW9ucyhvcHRpb25zSW4pKTtcbiAgICAvLyBbdmFsXVxuICAgIHNiLnZpc2l0KHZhbHVlLCBvcHRpb25zKTtcbiAgICBzYi5lbWl0SGVscGVyKFxuICAgICAgdmFsdWUsXG4gICAgICBvcHRpb25zLFxuICAgICAgc2IuaGVscGVycy5mb3JCdWlsdGluVHlwZSh7XG4gICAgICAgIHR5cGU6IHZhbHVlVHlwZSxcbiAgICAgICAgYXJyYXk6IGNyZWF0ZVByb2Nlc3NCdWlsdGluKCdBcnJheScpLFxuICAgICAgICBhcnJheVN0b3JhZ2U6IGNyZWF0ZVByb2Nlc3NCdWlsdGluKCdBcnJheVN0b3JhZ2UnKSxcbiAgICAgICAgYm9vbGVhbjogY3JlYXRlUHJvY2Vzc0J1aWx0aW4oJ0Jvb2xlYW4nKSxcbiAgICAgICAgYnVmZmVyOiBjcmVhdGVQcm9jZXNzQnVpbHRpbignQnVmZmVyJyksXG4gICAgICAgIG51bGw6IHRocm93VHlwZUVycm9yLFxuICAgICAgICBudW1iZXI6IGNyZWF0ZVByb2Nlc3NCdWlsdGluKCdOdW1iZXInKSxcbiAgICAgICAgb2JqZWN0OiBwcm9jZXNzT2JqZWN0LFxuICAgICAgICBzdHJpbmc6IGNyZWF0ZVByb2Nlc3NCdWlsdGluKCdTdHJpbmcnKSxcbiAgICAgICAgc3ltYm9sOiBjcmVhdGVQcm9jZXNzQnVpbHRpbignU3ltYm9sJyksXG4gICAgICAgIHVuZGVmaW5lZDogdGhyb3dUeXBlRXJyb3IsXG4gICAgICAgIG1hcDogY3JlYXRlUHJvY2Vzc0J1aWx0aW4oJ01hcCcpLFxuICAgICAgICBtYXBTdG9yYWdlOiBjcmVhdGVQcm9jZXNzQnVpbHRpbignTWFwU3RvcmFnZScpLFxuICAgICAgICBzZXQ6IGNyZWF0ZVByb2Nlc3NCdWlsdGluKCdTZXQnKSxcbiAgICAgICAgc2V0U3RvcmFnZTogY3JlYXRlUHJvY2Vzc0J1aWx0aW4oJ1NldFN0b3JhZ2UnKSxcbiAgICAgICAgZXJyb3I6IGNyZWF0ZVByb2Nlc3NCdWlsdGluKCdFcnJvcicpLFxuICAgICAgICBmb3J3YXJkVmFsdWU6IGNyZWF0ZVByb2Nlc3NCdWlsdGluKCdGb3J3YXJkVmFsdWUnKSxcbiAgICAgICAgaXRlcmF0b3JSZXN1bHQ6IGNyZWF0ZVByb2Nlc3NCdWlsdGluKCdJdGVyYXRvclJlc3VsdCcpLFxuICAgICAgICBpdGVyYWJsZTogY3JlYXRlUHJvY2Vzc0J1aWx0aW4oJ0l0ZXJhYmxlJyksXG4gICAgICAgIGl0ZXJhYmxlSXRlcmF0b3I6IGNyZWF0ZVByb2Nlc3NCdWlsdGluKCdJdGVyYWJsZUl0ZXJhdG9yJyksXG4gICAgICAgIHRyYW5zYWN0aW9uOiBjcmVhdGVQcm9jZXNzQnVpbHRpbignVHJhbnNhY3Rpb25CYXNlJyksXG4gICAgICAgIG91dHB1dDogY3JlYXRlUHJvY2Vzc0J1aWx0aW4oJ091dHB1dCcpLFxuICAgICAgICBhdHRyaWJ1dGU6IGNyZWF0ZVByb2Nlc3NCdWlsdGluKCdBdHRyaWJ1dGVCYXNlJyksXG4gICAgICAgIGlucHV0OiBjcmVhdGVQcm9jZXNzQnVpbHRpbignSW5wdXQnKSxcbiAgICAgICAgYWNjb3VudDogY3JlYXRlUHJvY2Vzc0J1aWx0aW4oJ0FjY291bnQnKSxcbiAgICAgICAgYXNzZXQ6IGNyZWF0ZVByb2Nlc3NCdWlsdGluKCdBc3NldCcpLFxuICAgICAgICBjb250cmFjdDogY3JlYXRlUHJvY2Vzc0J1aWx0aW4oJ0NvbnRyYWN0JyksXG4gICAgICAgIGhlYWRlcjogY3JlYXRlUHJvY2Vzc0J1aWx0aW4oJ0hlYWRlcicpLFxuICAgICAgICBibG9jazogY3JlYXRlUHJvY2Vzc0J1aWx0aW4oJ0Jsb2NrJyksXG4gICAgICB9KSxcbiAgICApO1xuICB9XG59XG4iXX0=