UNPKG

pretur.spec

Version:

MDA model specification builder for code generation

191 lines 30.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var attribute_1 = require("./attribute"); function appendRelation(spec, relation) { if (process.env.NODE_ENV !== 'production') { if (!spec) { throw new Error('Spec must be provided.'); } if (!relation) { throw new Error("No relation provided to be appended to " + spec.name + "."); } if (!relation.alias) { throw new Error('Relation should have an alias.'); } if (!relation.key) { throw new Error('Relation should have a key.'); } if (spec.relations.filter(function (r) { return r.alias === relation.alias; }).length > 0) { throw new Error("relation from " + spec.name + " to " + relation.target.model + " as " + relation.alias + " " + "cannot be applied because there is already another relation with the same alias."); } switch (relation.type) { case 'SUPERCLASS': case 'SUBCLASS': case 'MASTER': case 'DETAIL': case 'RECURSIVE': case 'MANY_TO_MANY': case 'INJECTIVE': break; default: throw new Error(relation.type + " is not a valid relation type. " + ("Please check " + spec.name + "." + relation.alias + ".")); } if (relation.type === 'MANY_TO_MANY' && !relation.through) { throw new Error("Many to many relations need a join table. " + ("Please check " + spec.name + "." + relation.alias)); } if (relation.type === 'RECURSIVE' && relation.target.model !== spec.name) { throw new Error("Recursive relations must reference their own model. " + ("Please check " + spec.name + "." + relation.alias)); } var checkMod = function (mod) { switch (mod) { case 'RESTRICT': case 'CASCADE': case 'NO ACTION': case 'SET NULL': case 'SET DEFAULT': break; default: throw new Error(mod + " is not a valid modification action type. " + ("Please check " + spec.name + "." + relation.alias + ".")); } }; checkMod(relation.onDelete); checkMod(relation.onUpdate); } spec.relations.push(relation); } exports.appendRelation = appendRelation; function inheritors(spec, options) { var typeEnumValues = []; for (var _i = 0, _a = options.inheritors; _i < _a.length; _i++) { var inheritor = _a[_i]; appendRelation(spec, { alias: inheritor.alias, key: options.sharedExistingUniqueField, target: { scope: inheritor.target.scope, model: inheritor.target.name }, onDelete: 'CASCADE', onUpdate: 'CASCADE', required: false, type: 'SUBCLASS', }); appendRelation(inheritor.target, { alias: options.aliasOnSubclasses, key: options.sharedExistingUniqueField, target: { scope: spec.scope, model: spec.name }, onDelete: 'CASCADE', onUpdate: 'CASCADE', required: false, type: 'SUPERCLASS', }); typeEnumValues.push(inheritor.alias); } attribute_1.appendAttribute(spec, { mutable: true, name: options.typeIdentifierFieldName, required: options.typeIdentifierRequired || false, type: 'ENUM', typename: spec.name + 'SubclassType', values: typeEnumValues, }); } function master(spec, options) { appendRelation(spec, { alias: options.alias, key: options.foreignKey.name, target: { scope: options.target.scope, model: options.target.name }, onDelete: options.onDelete || 'RESTRICT', onUpdate: options.onUpdate || 'CASCADE', required: options.required || false, type: 'MASTER', }); appendRelation(options.target, { alias: options.ownAliasOnTarget, key: options.foreignKey.name, target: { scope: spec.scope, model: spec.name }, onDelete: options.onDelete || 'RESTRICT', onUpdate: options.onUpdate || 'CASCADE', required: options.required || false, type: 'DETAIL', }); if (options.foreignKey.elide !== true) { attribute_1.appendAttribute(spec, { mutable: typeof options.foreignKey.mutable === 'boolean' ? options.foreignKey.mutable : !options.foreignKey.primary, name: options.foreignKey.name, primary: options.foreignKey.primary || false, required: typeof options.foreignKey.required === 'boolean' ? options.foreignKey.required : (!options.foreignKey.primary && options.required) || false, type: (options.foreignKey.type || 'INTEGER'), unique: options.foreignKey.unique || false, }); } } function injective(spec, options) { appendRelation(spec, { alias: options.alias, key: options.foreignKey.name, target: { scope: options.target.scope, model: options.target.name }, onDelete: options.onDelete || 'CASCADE', onUpdate: options.onUpdate || 'CASCADE', required: options.required || false, type: 'MASTER', }); appendRelation(options.target, { alias: options.ownAliasOnTarget, key: options.foreignKey.name, target: { scope: spec.scope, model: spec.name }, onDelete: options.onDelete || 'CASCADE', onUpdate: options.onUpdate || 'CASCADE', required: options.required || false, type: 'INJECTIVE', }); if (options.foreignKey.elide !== true) { attribute_1.appendAttribute(spec, { mutable: typeof options.foreignKey.mutable === 'boolean' ? options.foreignKey.mutable : !options.foreignKey.primary, name: options.foreignKey.name, primary: options.foreignKey.primary || false, required: typeof options.foreignKey.required === 'boolean' ? options.foreignKey.required : (!options.foreignKey.primary && options.required) || false, type: options.foreignKey.type || 'INTEGER', unique: typeof options.foreignKey.unique === 'boolean' ? options.foreignKey.unique : !options.foreignKey.primary, }); } } function recursive(spec, options) { appendRelation(spec, { alias: options.alias, key: options.key, target: { scope: spec.scope, model: spec.name }, onDelete: options.onDelete || 'RESTRICT', onUpdate: options.onUpdate || 'CASCADE', required: false, type: 'RECURSIVE', }); attribute_1.appendAttribute(spec, { mutable: true, name: options.key, required: false, type: options.keyType || 'INTEGER', }); } function createRelationBuilder(spec) { return { inheritors: function (options) { return inheritors(spec, options); }, injective: function (options) { return injective(spec, options); }, master: function (options) { return master(spec, options); }, recursive: function (options) { return recursive(spec, options); }, }; } exports.createRelationBuilder = createRelationBuilder; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVsYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcmVsYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSx5Q0FBMEQ7QUFpRjFELHdCQUFtRCxJQUFhLEVBQUUsUUFBcUI7SUFDckYsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEtBQUssWUFBWSxDQUFDLENBQUMsQ0FBQztRQUMxQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDVixNQUFNLElBQUksS0FBSyxDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFDNUMsQ0FBQztRQUVELEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUNkLE1BQU0sSUFBSSxLQUFLLENBQUMsNENBQTBDLElBQUksQ0FBQyxJQUFJLE1BQUcsQ0FBQyxDQUFDO1FBQzFFLENBQUM7UUFFRCxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ3BCLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztRQUNwRCxDQUFDO1FBRUQsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNsQixNQUFNLElBQUksS0FBSyxDQUFDLDZCQUE2QixDQUFDLENBQUM7UUFDakQsQ0FBQztRQUVELEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLEtBQUssS0FBSyxRQUFRLENBQUMsS0FBSyxFQUExQixDQUEwQixDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdEUsTUFBTSxJQUFJLEtBQUssQ0FDYixtQkFBaUIsSUFBSSxDQUFDLElBQUksWUFBTyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssWUFBTyxRQUFR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L0MsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRLElBQUksVUFBVTtRQUN4QyxRQUFRLEVBQUUsT0FBTyxDQUFDLFFBQVEsSUFBSSxTQUFTO1FBQ3ZDLFFBQVEsRUFBRSxLQUFLO1FBQ2YsSUFBSSxFQUFFLFdBQVc7S0FDbEIsQ0FBQyxDQUFDO0lBRUgsMkJBQWUsQ0FBQyxJQUFJLEVBQUU7UUFDcEIsT0FBTyxFQUFFLElBQUk7UUFDYixJQUFJLEVBQUUsT0FBTyxDQUFDLEdBQUc7UUFDakIsUUFBUSxFQUFFLEtBQUs7UUFDZixJQUFJLEVBQUUsT0FBTyxDQUFDLE9BQU8sSUFBSSxTQUFTO0tBQ25DLENBQUMsQ0FBQztBQUNMLENBQUM7QUFTRCwrQkFBMEQsSUFBYTtJQUNyRSxNQUFNLENBQUM7UUFDTCxVQUFVLEVBQUUsVUFBcUIsT0FBZ0MsSUFBSyxPQUFBLFVBQVUsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLEVBQXpCLENBQXlCO1FBQy9GLFNBQVMsRUFBRSxVQUFxQixPQUErQixJQUFLLE9BQUEsU0FBUyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsRUFBeEIsQ0FBd0I7UUFDNUYsTUFBTSxFQUFFLFVBQXFCLE9BQTRCLElBQUssT0FBQSxNQUFNLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxFQUFyQixDQUFxQjtRQUNuRixTQUFTLEVBQUUsVUFBQyxPQUE0QixJQUFLLE9BQUEsU0FBUyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsRUFBeEIsQ0FBd0I7S0FDdEUsQ0FBQztBQUNKLENBQUM7QUFQRCxzREFPQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGFwcGVuZEF0dHJpYnV0ZSwgTm9ybWFsVHlwZSB9IGZyb20gJy4vYXR0cmlidXRlJztcclxuaW1wb3J0IHsgU3BlYywgU3BlY1R5cGUgfSBmcm9tICcuL3NwZWMnO1xyXG5cclxuZXhwb3J0IHR5cGUgTW9kaWZpY2F0aW9uQWN0aW9ucyA9XHJcbiAgJ1JFU1RSSUNUJyB8XHJcbiAgJ0NBU0NBREUnIHxcclxuICAnTk8gQUNUSU9OJyB8XHJcbiAgJ1NFVCBOVUxMJyB8XHJcbiAgJ1NFVCBERUZBVUxUJztcclxuXHJcbmV4cG9ydCB0eXBlIFJlbGF0aW9uVHlwZSA9XHJcbiAgJ1NVUEVSQ0xBU1MnIHxcclxuICAnU1VCQ0xBU1MnIHxcclxuICAnTUFTVEVSJyB8XHJcbiAgJ0RFVEFJTCcgfFxyXG4gICdSRUNVUlNJVkUnIHxcclxuICAnTUFOWV9UT19NQU5ZJyB8XHJcbiAgJ0lOSkVDVElWRSc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFJlbGF0aW9uPFQgZXh0ZW5kcyBTcGVjVHlwZT4ge1xyXG4gIHR5cGU6IFJlbGF0aW9uVHlwZTtcclxuICB0YXJnZXQ6IHsgc2NvcGU6IHN0cmluZzsgbW9kZWw6IHN0cmluZyB9O1xyXG4gIHRocm91Z2g/OiB7IHNjb3BlOiBzdHJpbmc7IG1vZGVsOiBzdHJpbmcgfTtcclxuICBhbGlhczoga2V5b2YgVFsncmVjb3JkcyddIHwga2V5b2YgVFsnc2V0cyddO1xyXG4gIGtleTogc3RyaW5nO1xyXG4gIHJlcXVpcmVkPzogYm9vbGVhbjtcclxuICBvbkRlbGV0ZTogTW9kaWZpY2F0aW9uQWN0aW9ucztcclxuICBvblVwZGF0ZTogTW9kaWZpY2F0aW9uQWN0aW9ucztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBGb3JlaWduS2V5PE4gZXh0ZW5kcyBzdHJpbmc+IHtcclxuICBuYW1lOiBOO1xyXG4gIHR5cGU/OiBOb3JtYWxUeXBlO1xyXG4gIHJlcXVpcmVkPzogYm9vbGVhbjtcclxuICB1bmlxdWU/OiBib29sZWFuO1xyXG4gIHByaW1hcnk/OiBib29sZWFuO1xyXG4gIG11dGFibGU/OiBib29sZWFuO1xyXG4gIGVsaWRlPzogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJbmhlcml0b3I8UyBleHRlbmRzIFNwZWNUeXBlLCBUIGV4dGVuZHMgU3BlY1R5cGU+IHtcclxuICB0YXJnZXQ6IFNwZWM8VD47XHJcbiAgYWxpYXM6IGtleW9mIFNbJ3JlY29yZHMnXTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJbmhlcml0b3JzT3B0aW9uczxTIGV4dGVuZHMgU3BlY1R5cGUsIFQgZXh0ZW5kcyBTcGVjVHlwZT4ge1xyXG4gIHNoYXJlZEV4aXN0aW5nVW5pcXVlRmllbGQ6IGtleW9mIChTWydmaWVsZHMnXSB8IFRbJ2ZpZWxkcyddKTtcclxuICBhbGlhc09uU3ViY2xhc3Nlczoga2V5b2YgVFsncmVjb3JkcyddO1xyXG4gIHR5cGVJZGVudGlmaWVyRmllbGROYW1lOiBrZXlvZiBTWydmaWVsZHMnXTtcclxuICB0eXBlSWRlbnRpZmllclJlcXVpcmVkPzogYm9vbGVhbjtcclxuICBpbmhlcml0b3JzOiBJbmhlcml0b3I8UywgVD5bXTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBNYXN0ZXJPcHRpb25zPFMgZXh0ZW5kcyBTcGVjVHlwZSwgVCBleHRlbmRzIFNwZWNUeXBlPiB7XHJcbiAgdGFyZ2V0OiBTcGVjPFQ+O1xyXG4gIGFsaWFzOiBrZXlvZiBTWydyZWNvcmRzJ107XHJcbiAgb3duQWxpYXNPblRhcmdldDoga2V5b2YgVFsnc2V0cyddO1xyXG4gIGZvcmVpZ25LZXk6IEZvcmVpZ25LZXk8a2V5b2YgU1snZmllbGRzJ10+O1xyXG4gIHJlcXVpcmVkPzogYm9vbGVhbjtcclxuICBvbkRlbGV0ZT86IE1vZGlmaWNhdGlvbkFjdGlvbnM7XHJcbiAgb25VcGRhdGU/OiBNb2RpZmljYXRpb25BY3Rpb25zO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEluamVjdGl2ZU9wdGlvbnM8UyBleHRlbmRzIFNwZWNUeXBlLCBUIGV4dGVuZHMgU3BlY1R5cGU+IHtcclxuICB0YXJnZXQ6IFNwZWM8VD47XHJcbiAgYWxpYXM6IGtleW9mIFNbJ3JlY29yZHMnXTtcclxuICBvd25BbGlhc09uVGFyZ2V0OiBrZXlvZiBUWydyZWNvcmRzJ107XHJcbiAgZm9yZWlnbktleTogRm9yZWlnbktleTxrZXlvZiBTWydmaWVsZHMnXT47XHJcbiAgcmVxdWlyZWQ/OiBib29sZWFuO1xyXG4gIG9uRGVsZXRlPzogTW9kaWZpY2F0aW9uQWN0aW9ucztcclxuICBvblVwZGF0ZT86IE1vZGlmaWNhdGlvbkFjdGlvbnM7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmVjdXJzaXZlT3B0aW9uczxTIGV4dGVuZHMgU3BlY1R5cGU+IHtcclxuICBhbGlhczoga2V5b2YgU1sncmVjb3JkcyddIHwga2V5b2YgU1snc2V0cyddO1xyXG4gIGtleToga2V5b2YgU1snZmllbGRzJ107XHJcbiAga2V5VHlwZT86IE5vcm1hbFR5cGU7XHJcbiAgb25EZWxldGU/OiBNb2RpZmljYXRpb25BY3Rpb25zO1xyXG4gIG9uVXBkYXRlPzogTW9kaWZpY2F0aW9uQWN0aW9ucztcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFwcGVuZFJlbGF0aW9uPFQgZXh0ZW5kcyBTcGVjVHlwZT4oc3BlYzogU3BlYzxUPiwgcmVsYXRpb246IFJlbGF0aW9uPFQ+KTogdm9pZCB7XHJcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcclxuICAgIGlmICghc3BlYykge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NwZWMgbXVzdCBiZSBwcm92aWRlZC4nKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXJlbGF0aW9uKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gcmVsYXRpb24gcHJvdmlkZWQgdG8gYmUgYXBwZW5kZWQgdG8gJHtzcGVjLm5hbWV9LmApO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghcmVsYXRpb24uYWxpYXMpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZWxhdGlvbiBzaG91bGQgaGF2ZSBhbiBhbGlhcy4nKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXJlbGF0aW9uLmtleSkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlbGF0aW9uIHNob3VsZCBoYXZlIGEga2V5LicpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChzcGVjLnJlbGF0aW9ucy5maWx0ZXIociA9PiByLmFsaWFzID09PSByZWxhdGlvbi5hbGlhcykubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgYHJlbGF0aW9uIGZyb20gJHtzcGVjLm5hbWV9IHRvICR7cmVsYXRpb24udGFyZ2V0Lm1vZGVsfSBhcyAke3JlbGF0aW9uLmFsaWFzfSBgICtcclxuICAgICAgICBgY2Fubm90IGJlIGFwcGxpZWQgYmVjYXVzZSB0aGVyZSBpcyBhbHJlYWR5IGFub3RoZXIgcmVsYXRpb24gd2l0aCB0aGUgc2FtZSBhbGlhcy5gLFxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHN3aXRjaCAocmVsYXRpb24udHlwZSkge1xyXG4gICAgICBjYXNlICdTVVBFUkNMQVNTJzpcclxuICAgICAgY2FzZSAnU1VCQ0xBU1MnOlxyXG4gICAgICBjYXNlICdNQVNURVInOlxyXG4gICAgICBjYXNlICdERVRBSUwnOlxyXG4gICAgICBjYXNlICdSRUNVUlNJVkUnOlxyXG4gICAgICBjYXNlICdNQU5ZX1RPX01BTlknOlxyXG4gICAgICBjYXNlICdJTkpFQ1RJVkUnOlxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcclxuICAgICAgICAgIGAke3JlbGF0aW9uLnR5cGV9IGlzIG5vdCBhIHZhbGlkIHJlbGF0aW9uIHR5cGUuIGAgK1xyXG4gICAgICAgICAgYFBsZWFzZSBjaGVjayAke3NwZWMubmFtZX0uJHtyZWxhdGlvbi5hbGlhc30uYCxcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChyZWxhdGlvbi50eXBlID09PSAnTUFOWV9UT19NQU5ZJyAmJiAhcmVsYXRpb24udGhyb3VnaCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgYE1hbnkgdG8gbWFueSByZWxhdGlvbnMgbmVlZCBhIGpvaW4gdGFibGUuIGAgK1xyXG4gICAgICAgIGBQbGVhc2UgY2hlY2sgJHtzcGVjLm5hbWV9LiR7cmVsYXRpb24uYWxpYXN9YCxcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAocmVsYXRpb24udHlwZSA9PT0gJ1JFQ1VSU0lWRScgJiYgcmVsYXRpb24udGFyZ2V0Lm1vZGVsICE9PSBzcGVjLm5hbWUpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgIGBSZWN1cnNpdmUgcmVsYXRpb25zIG11c3QgcmVmZXJlbmNlIHRoZWlyIG93biBtb2RlbC4gYCArXHJcbiAgICAgICAgYFBsZWFzZSBjaGVjayAke3NwZWMubmFtZX0uJHtyZWxhdGlvbi5hbGlhc31gLFxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNoZWNrTW9kID0gKG1vZDogTW9kaWZpY2F0aW9uQWN0aW9ucykgPT4ge1xyXG4gICAgICBzd2l0Y2ggKG1vZCkge1xyXG4gICAgICAgIGNhc2UgJ1JFU1RSSUNUJzpcclxuICAgICAgICBjYXNlICdDQVNDQURFJzpcclxuICAgICAgICBjYXNlICdOTyBBQ1RJT04nOlxyXG4gICAgICAgIGNhc2UgJ1NFVCBOVUxMJzpcclxuICAgICAgICBjYXNlICdTRVQgREVGQVVMVCc6XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgICAgICBgJHttb2R9IGlzIG5vdCBhIHZhbGlkIG1vZGlmaWNhdGlvbiBhY3Rpb24gdHlwZS4gYCArXHJcbiAgICAgICAgICAgIGBQbGVhc2UgY2hlY2sgJHtzcGVjLm5hbWV9LiR7cmVsYXRpb24uYWxpYXN9LmAsXHJcbiAgICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIGNoZWNrTW9kKHJlbGF0aW9uLm9uRGVsZXRlKTtcclxuICAgIGNoZWNrTW9kKHJlbGF0aW9uLm9uVXBkYXRlKTtcclxuICB9XHJcblxyXG4gIHNwZWMucmVsYXRpb25zLnB1c2gocmVsYXRpb24pO1xyXG59XHJcblxyXG5mdW5jdGlvbiBpbmhlcml0b3JzPFMgZXh0ZW5kcyBTcGVjVHlwZSwgVCBleHRlbmRzIFNwZWNUeXBlPihcclxuICBzcGVjOiBTcGVjPFM+LFxyXG4gIG9wdGlvbnM6IEluaGVyaXRvcnNPcHRpb25zPFMsIFQ+LFxyXG4pIHtcclxuICBjb25zdCB0eXBlRW51bVZhbHVlczogKGtleW9mIFNbJ3JlY29yZHMnXSlbXSA9IFtdO1xyXG5cclxuICBmb3IgKGNvbnN0IGluaGVyaXRvciBvZiBvcHRpb25zLmluaGVyaXRvcnMpIHtcclxuICAgIGFwcGVuZFJlbGF0aW9uKHNwZWMsIHtcclxuICAgICAgYWxpYXM6IGluaGVyaXRvci5hbGlhcyxcclxuICAgICAga2V5OiBvcHRpb25zLnNoYXJlZEV4aXN0aW5nVW5pcXVlRmllbGQsXHJcbiAgICAgIHRhcmdldDogeyBzY29wZTogaW5oZXJpdG9yLnRhcmdldC5zY29wZSwgbW9kZWw6IGluaGVyaXRvci50YXJnZXQubmFtZSB9LFxyXG4gICAgICBvbkRlbGV0ZTogJ0NBU0NBREUnLFxyXG4gICAgICBvblVwZGF0ZTogJ0NBU0NBREUnLFxyXG4gICAgICByZXF1aXJlZDogZmFsc2UsXHJcbiAgICAgIHR5cGU6ICdTVUJDTEFTUycsXHJcbiAgICB9KTtcclxuXHJcbiAgICBhcHBlbmRSZWxhdGlvbihpbmhlcml0b3IudGFyZ2V0LCB7XHJcbiAgICAgIGFsaWFzOiBvcHRpb25zLmFsaWFzT25TdWJjbGFzc2VzLFxyXG4gICAgICBrZXk6IG9wdGlvbnMuc2hhcmVkRXhpc3RpbmdVbmlxdWVGaWVsZCxcclxuICAgICAgdGFyZ2V0OiB7IHNjb3BlOiBzcGVjLnNjb3BlLCBtb2RlbDogc3BlYy5uYW1lIH0sXHJcbiAgICAgIG9uRGVsZXRlOiAnQ0FTQ0FERScsXHJcbiAgICAgIG9uVXBkYXRlOiAnQ0FTQ0FERScsXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZSxcclxuICAgICAgdHlwZTogJ1NVUEVSQ0xBU1MnLFxyXG4gICAgfSk7XHJcblxyXG4gICAgdHlwZUVudW1WYWx1ZXMucHVzaChpbmhlcml0b3IuYWxpYXMpO1xyXG4gIH1cclxuXHJcbiAgYXBwZW5kQXR0cmlidXRlKHNwZWMsIHtcclxuICAgIG11dGFibGU6IHRydWUsXHJcbiAgICBuYW1lOiBvcHRpb25zLnR5cGVJZGVudGlmaWVyRmllbGROYW1lLFxyXG4gICAgcmVxdWlyZWQ6IG9wdGlvbnMudHlwZUlkZW50aWZpZXJSZXF1aXJlZCB8fCBmYWxzZSxcclxuICAgIHR5cGU6ICdFTlVNJyxcclxuICAgIHR5cGVuYW1lOiBzcGVjLm5hbWUgKyAnU3ViY2xhc3NUeXBlJyxcclxuICAgIHZhbHVlczogdHlwZUVudW1WYWx1ZXMsXHJcbiAgfSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIG1hc3RlcjxTIGV4dGVuZHMgU3BlY1R5cGUsIFQgZXh0ZW5kcyBTcGVjVHlwZT4oXHJcbiAgc3BlYzogU3BlYzxTPixcclxuICBvcHRpb25zOiBNYXN0ZXJPcHRpb25zPFMsIFQ+LFxyXG4pIHtcclxuICBhcHBlbmRSZWxhdGlvbihzcGVjLCB7XHJcbiAgICBhbGlhczogb3B0aW9ucy5hbGlhcyxcclxuICAgIGtleTogb3B0aW9ucy5mb3JlaWduS2V5Lm5hbWUsXHJcbiAgICB0YXJnZXQ6IHsgc2NvcGU6IG9wdGlvbnMudGFyZ2V0LnNjb3BlLCBtb2RlbDogb3B0aW9ucy50YXJnZXQubmFtZSB9LFxyXG4gICAgb25EZWxldGU6IG9wdGlvbnMub25EZWxldGUgfHwgJ1JFU1RSSUNUJyxcclxuICAgIG9uVXBkYXRlOiBvcHRpb25zLm9uVXBkYXRlIHx8ICdDQVNDQURFJyxcclxuICAgIHJlcXVpcmVkOiBvcHRpb25zLnJlcXVpcmVkIHx8IGZhbHNlLFxyXG4gICAgdHlwZTogJ01BU1RFUicsXHJcbiAgfSk7XHJcblxyXG4gIGFwcGVuZFJlbGF0aW9uKG9wdGlvbnMudGFyZ2V0LCB7XHJcbiAgICBhbGlhczogb3B0aW9ucy5vd25BbGlhc09uVGFyZ2V0LFxyXG4gICAga2V5OiBvcHRpb25zLmZvcmVpZ25LZXkubmFtZSxcclxuICAgIHRhcmdldDogeyBzY29wZTogc3BlYy5zY29wZSwgbW9kZWw6IHNwZWMubmFtZSB9LFxyXG4gICAgb25EZWxldGU6IG9wdGlvbnMub25EZWxldGUgfHwgJ1JFU1RSSUNUJyxcclxuICAgIG9uVXBkYXRlOiBvcHRpb25zLm9uVXBkYXRlIHx8ICdDQVNDQURFJyxcclxuICAgIHJlcXVpcmVkOiBvcHRpb25zLnJlcXVpcmVkIHx8IGZhbHNlLFxyXG4gICAgdHlwZTogJ0RFVEFJTCcsXHJcbiAgfSk7XHJcblxyXG4gIGlmIChvcHRpb25zLmZvcmVpZ25LZXkuZWxpZGUgIT09IHRydWUpIHtcclxuICAgIGFwcGVuZEF0dHJpYnV0ZShzcGVjLCB7XHJcbiAgICAgIG11dGFibGU6IHR5cGVvZiBvcHRpb25zLmZvcmVpZ25LZXkubXV0YWJsZSA9PT0gJ2Jvb2xlYW4nXHJcbiAgICAgICAgPyBvcHRpb25zLmZvcmVpZ25LZXkubXV0YWJsZVxyXG4gICAgICAgIDogIW9wdGlvbnMuZm9yZWlnbktleS5wcmltYXJ5LFxyXG4gICAgICBuYW1lOiBvcHRpb25zLmZvcmVpZ25LZXkubmFtZSxcclxuICAgICAgcHJpbWFyeTogb3B0aW9ucy5mb3JlaWduS2V5LnByaW1hcnkgfHwgZmFsc2UsXHJcbiAgICAgIHJlcXVpcmVkOiB0eXBlb2Ygb3B0aW9ucy5mb3JlaWduS2V5LnJlcXVpcmVkID09PSAnYm9vbGVhbidcclxuICAgICAgICA/IG9wdGlvbnMuZm9yZWlnbktleS5yZXF1aXJlZFxyXG4gICAgICAgIDogKCFvcHRpb25zLmZvcmVpZ25LZXkucHJpbWFyeSAmJiBvcHRpb25zLnJlcXVpcmVkKSB8fCBmYWxzZSxcclxuICAgICAgdHlwZTogKG9wdGlvbnMuZm9yZWlnbktleS50eXBlIHx8ICdJTlRFR0VSJyksXHJcbiAgICAgIHVuaXF1ZTogb3B0aW9ucy5mb3JlaWduS2V5LnVuaXF1ZSB8fCBmYWxzZSxcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gaW5qZWN0aXZlPFMgZXh0ZW5kcyBTcGVjVHlwZSwgVCBleHRlbmRzIFNwZWNUeXBlPihcclxuICBzcGVjOiBTcGVjPFM+LFxyXG4gIG9wdGlvbnM6IEluamVjdGl2ZU9wdGlvbnM8UywgVD4sXHJcbikge1xyXG4gIGFwcGVuZFJlbGF0aW9uKHNwZWMsIHtcclxuICAgIGFsaWFzOiBvcHRpb25zLmFsaWFzLFxyXG4gICAga2V5OiBvcHRpb25zLmZvcmVpZ25LZXkubmFtZSxcclxuICAgIHRhcmdldDogeyBzY29wZTogb3B0aW9ucy50YXJnZXQuc2NvcGUsIG1vZGVsOiBvcHRpb25zLnRhcmdldC5uYW1lIH0sXHJcbiAgICBvbkRlbGV0ZTogb3B0aW9ucy5vbkRlbGV0ZSB8fCAnQ0FTQ0FERScsXHJcbiAgICBvblVwZGF0ZTogb3B0aW9ucy5vblVwZGF0ZSB8fCAnQ0FTQ0FERScsXHJcbiAgICByZXF1aXJlZDogb3B0aW9ucy5yZXF1aXJlZCB8fCBmYWxzZSxcclxuICAgIHR5cGU6ICdNQVNURVInLFxyXG4gIH0pO1xyXG5cclxuICBhcHBlbmRSZWxhdGlvbihvcHRpb25zLnRhcmdldCwge1xyXG4gICAgYWxpYXM6IG9wdGlvbnMub3duQWxpYXNPblRhcmdldCxcclxuICAgIGtleTogb3B0aW9ucy5mb3JlaWduS2V5Lm5hbWUsXHJcbiAgICB0YXJnZXQ6IHsgc2NvcGU6IHNwZWMuc2NvcGUsIG1vZGVsOiBzcGVjLm5hbWUgfSxcclxuICAgIG9uRGVsZXRlOiBvcHRpb25zLm9uRGVsZXRlIHx8ICdDQVNDQURFJyxcclxuICAgIG9uVXBkYXRlOiBvcHRpb25zLm9uVXBkYXRlIHx8ICdDQVNDQURFJyxcclxuICAgIHJlcXVpcmVkOiBvcHRpb25zLnJlcXVpcmVkIHx8IGZhbHNlLFxyXG4gICAgdHlwZTogJ0lOSkVDVElWRScsXHJcbiAgfSk7XHJcblxyXG4gIGlmIChvcHRpb25zLmZvcmVpZ25LZXkuZWxpZGUgIT09IHRydWUpIHtcclxuICAgIGFwcGVuZEF0dHJpYnV0ZShzcGVjLCB7XHJcbiAgICAgIG11dGFibGU6IHR5cGVvZiBvcHRpb25zLmZvcmVpZ25LZXkubXV0YWJsZSA9PT0gJ2Jvb2xlYW4nXHJcbiAgICAgICAgPyBvcHRpb25zLmZvcmVpZ25LZXkubXV0YWJsZVxyXG4gICAgICAgIDogIW9wdGlvbnMuZm9yZWlnbktleS5wcmltYXJ5LFxyXG4gICAgICBuYW1lOiBvcHRpb25zLmZvcmVpZ25LZXkubmFtZSxcclxuICAgICAgcHJpbWFyeTogb3B0aW9ucy5mb3JlaWduS2V5LnByaW1hcnkgfHwgZmFsc2UsXHJcbiAgICAgIHJlcXVpcmVkOiB0eXBlb2Ygb3B0aW9ucy5mb3JlaWduS2V5LnJlcXVpcmVkID09PSAnYm9vbGVhbidcclxuICAgICAgICA/IG9wdGlvbnMuZm9yZWlnbktleS5yZXF1aXJlZFxyXG4gICAgICAgIDogKCFvcHRpb25zLmZvcmVpZ25LZXkucHJpbWFyeSAmJiBvcHRpb25zLnJlcXVpcmVkKSB8fCBmYWxzZSxcclxuICAgICAgdHlwZTogb3B0aW9ucy5mb3JlaWduS2V5LnR5cGUgfHwgJ0lOVEVHRVInLFxyXG4gICAgICB1bmlxdWU6IHR5cGVvZiBvcHRpb25zLmZvcmVpZ25LZXkudW5pcXVlID09PSAnYm9vbGVhbidcclxuICAgICAgICA/IG9wdGlvbnMuZm9yZWlnbktleS51bmlxdWVcclxuICAgICAgICA6ICFvcHRpb25zLmZvcmVpZ25LZXkucHJpbWFyeSxcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gcmVjdXJzaXZlPFMgZXh0ZW5kcyBTcGVjVHlwZT4oc3BlYzogU3BlYzxTPiwgb3B0aW9uczogUmVjdXJzaXZlT3B0aW9uczxTPikge1xyXG4gIGFwcGVuZFJlbGF0aW9uKHNwZWMsIHtcclxuICAgIGFsaWFzOiBvcHRpb25zLmFsaWFzLFxyXG4gICAga2V5OiBvcHRpb25zLmtleSxcclxuICAgIHRhcmdldDogeyBzY29wZTogc3BlYy5zY29wZSwgbW9kZWw6IHNwZWMubmFtZSB9LFxyXG4gICAgb25EZWxldGU6IG9wdGlvbnMub25EZWxldGUgfHwgJ1JFU1RSSUNUJyxcclxuICAgIG9uVXBkYXRlOiBvcHRpb25zLm9uVXBkYXRlIHx8ICdDQVNDQURFJyxcclxuICAgIHJlcXVpcmVkOiBmYWxzZSxcclxuICAgIHR5cGU6ICdSRUNVUlNJVkUnLFxyXG4gIH0pO1xyXG5cclxuICBhcHBlbmRBdHRyaWJ1dGUoc3BlYywge1xyXG4gICAgbXV0YWJsZTogdHJ1ZSxcclxuICAgIG5hbWU6IG9wdGlvbnMua2V5LFxyXG4gICAgcmVxdWlyZWQ6IGZhbHNlLFxyXG4gICAgdHlwZTogb3B0aW9ucy5rZXlUeXBlIHx8ICdJTlRFR0VSJyxcclxuICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBSZWxhdGlvbnNCdWlsZGVyPFMgZXh0ZW5kcyBTcGVjVHlwZT4ge1xyXG4gIGluaGVyaXRvcnM8VCBleHRlbmRzIFNwZWNUeXBlPihvcHRpb25zOiBJbmhlcml0b3JzT3B0aW9uczxTLCBUPik6IHZvaWQ7XHJcbiAgaW5qZWN0aXZlPFQgZXh0ZW5kcyBTcGVjVHlwZT4ob3B0aW9uczogSW5qZWN0aXZlT3B0aW9uczxTLCBUPik6IHZvaWQ7XHJcbiAgbWFzdGVyPFQgZXh0ZW5kcyBTcGVjVHlwZT4ob3B0aW9uczogTWFzdGVyT3B0aW9uczxTLCBUPik6IHZvaWQ7XHJcbiAgcmVjdXJzaXZlKG9wdGlvbnM6IFJlY3Vyc2l2ZU9wdGlvbnM8Uz4pOiB2b2lkO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVsYXRpb25CdWlsZGVyPFMgZXh0ZW5kcyBTcGVjVHlwZT4oc3BlYzogU3BlYzxTPik6IFJlbGF0aW9uc0J1aWxkZXI8Uz4ge1xyXG4gIHJldHVybiB7XHJcbiAgICBpbmhlcml0b3JzOiA8VCBleHRlbmRzIFNwZWNUeXBlPihvcHRpb25zOiBJbmhlcml0b3JzT3B0aW9uczxTLCBUPikgPT4gaW5oZXJpdG9ycyhzcGVjLCBvcHRpb25zKSxcclxuICAgIGluamVjdGl2ZTogPFQgZXh0ZW5kcyBTcGVjVHlwZT4ob3B0aW9uczogSW5qZWN0aXZlT3B0aW9uczxTLCBUPikgPT4gaW5qZWN0aXZlKHNwZWMsIG9wdGlvbnMpLFxyXG4gICAgbWFzdGVyOiA8VCBleHRlbmRzIFNwZWNUeXBlPihvcHRpb25zOiBNYXN0ZXJPcHRpb25zPFMsIFQ+KSA9PiBtYXN0ZXIoc3BlYywgb3B0aW9ucyksXHJcbiAgICByZWN1cnNpdmU6IChvcHRpb25zOiBSZWN1cnNpdmVPcHRpb25zPFM+KSA9PiByZWN1cnNpdmUoc3BlYywgb3B0aW9ucyksXHJcbiAgfTtcclxufVxyXG4iXX0=