@tsclean/core
Version:
Plugin for API Rest Full development, based on Clean Architecture, IoC and Dependency Injection.
163 lines • 25.1 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.GraphInspector = void 0;
const deterministic_uuid_registry_1 = require("./deterministic-uuid-registry");
const unknown_dependencies_1 = require("../errors/exceptions/unknown-dependencies");
const partial_graph_host_1 = require("./partial-graph.host");
class GraphInspector {
constructor(container) {
this.container = container;
this.enhancersMetadataCache = new Array();
this.graph = container.serializedGraph;
}
inspectModules(modules = this.container.getModules()) {
for (const moduleRef of modules.values()) {
this.insertModuleNode(moduleRef);
this.insertClassNodes(moduleRef);
this.insertModuleToModuleEdges(moduleRef);
}
this.enhancersMetadataCache.forEach(entry => this.insertEnhancerEdge(entry));
deterministic_uuid_registry_1.DeterministicUuidRegistry.clear();
}
registerPartial(error) {
var _a, _b;
this.graph.status = 'partial';
if (error instanceof unknown_dependencies_1.UnknownDependenciesException) {
this.graph.metadata = {
cause: {
type: 'unknown-dependencies',
context: error.context,
moduleId: (_a = error.moduleRef) === null || _a === void 0 ? void 0 : _a.id,
nodeId: (_b = error.metadata) === null || _b === void 0 ? void 0 : _b.id,
},
};
}
else {
this.graph.metadata = {
cause: {
type: 'unknown',
error,
},
};
}
partial_graph_host_1.PartialGraphHost.register(this.graph);
}
inspectInstanceWrapper(source, moduleRef) {
const ctorMetadata = source.getCtorMetadata();
ctorMetadata === null || ctorMetadata === void 0 ? void 0 : ctorMetadata.forEach((target, index) => this.insertClassToClassEdge(source, target, moduleRef, index, 'constructor'));
const propertiesMetadata = source.getPropertiesMetadata();
propertiesMetadata === null || propertiesMetadata === void 0 ? void 0 : propertiesMetadata.forEach(({ key, wrapper: target }) => this.insertClassToClassEdge(source, target, moduleRef, key, 'property'));
}
insertEnhancerMetadataCache(entry) {
this.enhancersMetadataCache.push(entry);
}
insertOrphanedEnhancer(entry) {
var _a, _b, _c;
this.graph.insertOrphanedEnhancer(Object.assign(Object.assign({}, entry), { ref: (_c = (_b = (_a = entry.ref) === null || _a === void 0 ? void 0 : _a.constructor) === null || _b === void 0 ? void 0 : _b.name) !== null && _c !== void 0 ? _c : 'Object' }));
}
insertAttachedEnhancer(wrapper) {
const existingNode = this.graph.getNodeById(wrapper.id);
existingNode.metadata.global = true;
this.graph.insertAttachedEnhancer(existingNode.id);
}
insertEntrypointDefinition(definition, parentId) {
definition = Object.assign(Object.assign({}, definition), { id: `${definition.classNodeId}_${definition.methodName}` });
this.graph.insertEntrypoint(definition, parentId);
}
insertClassNode(moduleRef, wrapper, type) {
this.graph.insertNode({
id: wrapper.id,
label: wrapper.name,
parent: moduleRef.id,
metadata: {
type,
internal: wrapper.metaType === moduleRef.metaType,
sourceModuleName: moduleRef.name,
durable: wrapper.isDependencyTreeDurable(),
static: wrapper.isDependencyTreeStatic(),
scope: wrapper.scope,
transient: wrapper.isTransient,
exported: moduleRef.exports.has(wrapper.token),
token: wrapper.token,
subtype: wrapper.subtype,
initTime: wrapper.initTime,
},
});
}
insertModuleNode(moduleRef) {
const dynamicMetadata = this.container.getDynamicMetadataByToken(moduleRef.token);
const node = {
id: moduleRef.id,
label: moduleRef.name,
metadata: {
type: 'module',
global: moduleRef.isGlobal,
dynamic: !!dynamicMetadata,
internal: moduleRef.name === 'InternalCoreModule',
},
};
this.graph.insertNode(node);
}
insertModuleToModuleEdges(moduleRef) {
for (const targetModuleRef of moduleRef.imports) {
this.graph.insertEdge({
source: moduleRef.id,
target: targetModuleRef.id,
metadata: {
type: 'module-to-module',
sourceModuleName: moduleRef.name,
targetModuleName: targetModuleRef.name,
},
});
}
}
insertEnhancerEdge(entry) {
var _a, _b, _c, _d;
const moduleRef = this.container.getModuleByKey(entry.moduleToken);
const sourceInstanceWrapper = (_a = moduleRef.controllers.get(entry.classRef)) !== null && _a !== void 0 ? _a : moduleRef.providers.get(entry.classRef);
const existingSourceNode = this.graph.getNodeById(sourceInstanceWrapper.id);
const enhancers = (_b = existingSourceNode.metadata.enhancers) !== null && _b !== void 0 ? _b : [];
if (entry.enhancerInstanceWrapper) {
this.insertClassToClassEdge(sourceInstanceWrapper, entry.enhancerInstanceWrapper, moduleRef, undefined, 'decorator');
enhancers.push({
id: entry.enhancerInstanceWrapper.id,
methodKey: entry.methodKey,
subtype: entry.subtype,
});
}
else {
const name = (_d = (_c = entry.enhancerRef.constructor) === null || _c === void 0 ? void 0 : _c.name) !== null && _d !== void 0 ? _d : entry.enhancerRef.name;
enhancers.push({
name,
methodKey: entry.methodKey,
subtype: entry.subtype,
});
}
existingSourceNode.metadata.enhancers = enhancers;
}
insertClassToClassEdge(source, target, moduleRef, keyOrIndex, injectionType) {
var _a;
this.graph.insertEdge({
source: source.id,
target: target.id,
metadata: {
type: 'class-to-class',
sourceModuleName: moduleRef.name,
sourceClassName: source.name,
targetClassName: target.name,
sourceClassToken: source.token,
targetClassToken: target.token,
targetModuleName: (_a = target.host) === null || _a === void 0 ? void 0 : _a.name,
keyOrIndex,
injectionType,
},
});
}
insertClassNodes(moduleRef) {
moduleRef.providers.forEach(value => this.insertClassNode(moduleRef, value, 'provider'));
moduleRef.injectables.forEach(value => this.insertClassNode(moduleRef, value, 'service'));
moduleRef.controllers.forEach(value => this.insertClassNode(moduleRef, value, 'controller'));
}
}
exports.GraphInspector = GraphInspector;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JhcGgtaW5zcGVjdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2luc3BlY3Rvci9ncmFwaC1pbnNwZWN0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEsK0VBQTBFO0FBQzFFLG9GQUF5RjtBQUt6Riw2REFBd0Q7QUFFeEQsTUFBYSxjQUFjO0lBS3ZCLFlBQTZCLFNBQXVCO1FBQXZCLGNBQVMsR0FBVCxTQUFTLENBQWM7UUFIbkMsMkJBQXNCLEdBQ3JDLElBQUksS0FBSyxFQUE4QixDQUFDO1FBR3hDLElBQUksQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDLGVBQWUsQ0FBQztJQUN6QyxDQUFDO0lBRU0sY0FBYyxDQUNuQixVQUErQixJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRTtRQUUxRCxLQUFLLE1BQU0sU0FBUyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO1lBQ3pDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNqQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDakMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzVDLENBQUM7UUFFRCxJQUFJLENBQUMsc0JBQXNCLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQzFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FDL0IsQ0FBQztRQUVGLHVEQUF5QixDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3BDLENBQUM7SUFFTSxlQUFlLENBQUMsS0FBYzs7UUFDbkMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDO1FBRTlCLElBQUksS0FBSyxZQUFZLG1EQUE0QixFQUFFLENBQUM7WUFDbEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUc7Z0JBQ3BCLEtBQUssRUFBRTtvQkFDTCxJQUFJLEVBQUUsc0JB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T0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQ3BDLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FDbEQsQ0FBQztRQUNGLFNBQVMsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQ3BDLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FDckQsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQW5PSCx3Q0FtT0ciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb250YWluZXJJb0MsIEluc3RhbmNlV3JhcHBlciwgTW9kdWxlIH0gZnJvbSBcIi4uL2NvcmVcIjtcbmltcG9ydCB7IEVuaGFuY2VyTWV0YWRhdGFDYWNoZUVudHJ5IH0gZnJvbSBcIi4vY29udHJhY3RzL2VuaGFuY2VyLW1ldGFkYXRhLWNhY2hlLWVudHJ5XCI7XG5pbXBvcnQgeyBEZXRlcm1pbmlzdGljVXVpZFJlZ2lzdHJ5IH0gZnJvbSBcIi4vZGV0ZXJtaW5pc3RpYy11dWlkLXJlZ2lzdHJ5XCI7XG5pbXBvcnQgeyBVbmtub3duRGVwZW5kZW5jaWVzRXhjZXB0aW9uIH0gZnJvbSBcIi4uL2Vycm9ycy9leGNlcHRpb25zL3Vua25vd24tZGVwZW5kZW5jaWVzXCI7XG5pbXBvcnQgeyBPcnBoYW5lZEVuaGFuY2VyRGVmaW5pdGlvbiB9IGZyb20gXCIuL2NvbnRyYWN0cy9leHRyYXNcIjtcbmltcG9ydCB7IEVudHJ5cG9pbnQgfSBmcm9tIFwiLi9jb250cmFjdHMvZW50cnlwb2ludFwiO1xuaW1wb3J0IHsgQ2xhc3NOb2RlLCBOb2RlIH0gZnJvbSBcIi4vY29udHJhY3RzL25vZGVcIjtcbmltcG9ydCB7IFNlcmlhbGl6ZWRHcmFwaCB9IGZyb20gXCIuL3NlcmlhbGl6ZWQtZ3JhcGhcIjtcbmltcG9ydCB7IFBhcnRpYWxHcmFwaEhvc3QgfSBmcm9tIFwiLi9wYXJ0aWFsLWdyYXBoLmhvc3RcIjtcblxuZXhwb3J0IGNsYXNzIEdyYXBoSW5zcGVjdG9yIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGdyYXBoOiBTZXJpYWxpemVkR3JhcGg7XG4gICAgcHJpdmF0ZSByZWFkb25seSBlbmhhbmNlcnNNZXRhZGF0YUNhY2hlID1cbiAgICAgIG5ldyBBcnJheTxFbmhhbmNlck1ldGFkYXRhQ2FjaGVFbnRyeT4oKTtcbiAgXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBjb250YWluZXI6IENvbnRhaW5lcklvQykge1xuICAgICAgdGhpcy5ncmFwaCA9IGNvbnRhaW5lci5zZXJpYWxpemVkR3JhcGg7XG4gICAgfVxuICBcbiAgICBwdWJsaWMgaW5zcGVjdE1vZHVsZXMoXG4gICAgICBtb2R1bGVzOiBNYXA8c3RyaW5nLCBNb2R1bGU+ID0gdGhpcy5jb250YWluZXIuZ2V0TW9kdWxlcygpLFxuICAgICkge1xuICAgICAgZm9yIChjb25zdCBtb2R1bGVSZWYgb2YgbW9kdWxlcy52YWx1ZXMoKSkge1xuICAgICAgICB0aGlzLmluc2VydE1vZHVsZU5vZGUobW9kdWxlUmVmKTtcbiAgICAgICAgdGhpcy5pbnNlcnRDbGFzc05vZGVzKG1vZHVsZVJlZik7XG4gICAgICAgIHRoaXMuaW5zZXJ0TW9kdWxlVG9Nb2R1bGVFZGdlcyhtb2R1bGVSZWYpO1xuICAgICAgfVxuICBcbiAgICAgIHRoaXMuZW5oYW5jZXJzTWV0YWRhdGFDYWNoZS5mb3JFYWNoKGVudHJ5ID0+XG4gICAgICAgIHRoaXMuaW5zZXJ0RW5oYW5jZXJFZGdlKGVudHJ5KSxcbiAgICAgICk7XG4gIFxuICAgICAgRGV0ZXJtaW5pc3RpY1V1aWRSZWdpc3RyeS5jbGVhcigpO1xuICAgIH1cbiAgXG4gICAgcHVibGljIHJlZ2lzdGVyUGFydGlhbChlcnJvcjogdW5rbm93bikge1xuICAgICAgdGhpcy5ncmFwaC5zdGF0dXMgPSAncGFydGlhbCc7XG4gIFxuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgVW5rbm93bkRlcGVuZGVuY2llc0V4Y2VwdGlvbikge1xuICAgICAgICB0aGlzLmdyYXBoLm1ldGFkYXRhID0ge1xuICAgICAgICAgIGNhdXNlOiB7XG4gICAgICAgICAgICB0eXBlOiAndW5rbm93bi1kZXBlbmRlbmNpZXMnLFxuICAgICAgICAgICAgY29udGV4dDogZXJyb3IuY29udGV4dCxcbiAgICAgICAgICAgIG1vZHVsZUlkOiBlcnJvci5tb2R1bGVSZWY/LmlkLFxuICAgICAgICAgICAgbm9kZUlkOiBlcnJvci5tZXRhZGF0YT8uaWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZ3JhcGgubWV0YWRhdGEgPSB7XG4gICAgICAgICAgY2F1c2U6IHtcbiAgICAgICAgICAgIHR5cGU6ICd1bmtub3duJyxcbiAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBQYXJ0aWFsR3JhcGhIb3N0LnJlZ2lzdGVyKHRoaXMuZ3JhcGgpO1xuICAgIH1cbiAgXG4gICAgcHVibGljIGluc3BlY3RJbnN0YW5jZVdyYXBwZXI8VCA9IGFueT4oXG4gICAgICBzb3VyY2U6IEluc3RhbmNlV3JhcHBlcjxUPixcbiAgICAgIG1vZHVsZVJlZjogTW9kdWxlLFxuICAgICkge1xuICAgICAgY29uc3QgY3Rvck1ldGFkYXRhID0gc291cmNlLmdldEN0b3JNZXRhZGF0YSgpO1xuICAgICAgY3Rvck1ldGFkYXRhPy5mb3JFYWNoKCh0YXJnZXQsIGluZGV4KSA9PlxuICAgICAgICB0aGlzLmluc2VydENsYXNzVG9DbGFzc0VkZ2UoXG4gICAgICAgICAgc291cmNlLFxuICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICBtb2R1bGVSZWYsXG4gICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgJ2NvbnN0cnVjdG9yJyxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gIFxuICAgICAgY29uc3QgcHJvcGVydGllc01ldGFkYXRhID0gc291cmNlLmdldFByb3BlcnRpZXNNZXRhZGF0YSgpO1xuICAgICAgcHJvcGVydGllc01ldGFkYXRhPy5mb3JFYWNoKCh7IGtleSwgd3JhcHBlcjogdGFyZ2V0IH0pID0+XG4gICAgICAgIHRoaXMuaW5zZXJ0Q2xhc3NUb0NsYXNzRWRnZShzb3VyY2UsIHRhcmdldCwgbW9kdWxlUmVmLCBrZXksICdwcm9wZXJ0eScpLFxuICAgICAgKTtcbiAgICB9XG4gIFxuICAgIHB1YmxpYyBpbnNlcnRFbmhhbmNlck1ldGFkYXRhQ2FjaGUoZW50cnk6IEVuaGFuY2VyTWV0YWRhdGFDYWNoZUVudHJ5KSB7XG4gICAgICB0aGlzLmVuaGFuY2Vyc01ldGFkYXRhQ2FjaGUucHVzaChlbnRyeSk7XG4gICAgfVxuICBcbiAgICBwdWJsaWMgaW5zZXJ0T3JwaGFuZWRFbmhhbmNlcihlbnRyeTogT3JwaGFuZWRFbmhhbmNlckRlZmluaXRpb24pIHtcbiAgICAgIHRoaXMuZ3JhcGguaW5zZXJ0T3JwaGFuZWRFbmhhbmNlcih7XG4gICAgICAgIC4uLmVudHJ5LFxuICAgICAgICByZWY6IGVudHJ5LnJlZj8uY29uc3RydWN0b3I/Lm5hbWUgPz8gJ09iamVjdCcsXG4gICAgICB9KTtcbiAgICB9XG4gIFxuICAgIHB1YmxpYyBpbnNlcnRBdHRhY2hlZEVuaGFuY2VyKHdyYXBwZXI6IEluc3RhbmNlV3JhcHBlcikge1xuICAgICAgY29uc3QgZXhpc3RpbmdOb2RlID0gdGhpcy5ncmFwaC5nZXROb2RlQnlJZCh3cmFwcGVyLmlkKTtcbiAgICAgIGV4aXN0aW5nTm9kZS5tZXRhZGF0YS5nbG9iYWwgPSB0cnVlO1xuICBcbiAgICAgIHRoaXMuZ3JhcGguaW5zZXJ0QXR0YWNoZWRFbmhhbmNlcihleGlzdGluZ05vZGUuaWQpO1xuICAgIH1cbiAgXG4gICAgcHVibGljIGluc2VydEVudHJ5cG9pbnREZWZpbml0aW9uPFQ+KFxuICAgICAgZGVmaW5pdGlvbjogRW50cnlwb2ludDxUPixcbiAgICAgIHBhcmVudElkOiBzdHJpbmcsXG4gICAgKSB7XG4gICAgICBkZWZpbml0aW9uID0ge1xuICAgICAgICAuLi5kZWZpbml0aW9uLFxuICAgICAgICBpZDogYCR7ZGVmaW5pdGlvbi5jbGFzc05vZGVJZH1fJHtkZWZpbml0aW9uLm1ldGhvZE5hbWV9YCxcbiAgICAgIH07XG4gICAgICB0aGlzLmdyYXBoLmluc2VydEVudHJ5cG9pbnQoZGVmaW5pdGlvbiwgcGFyZW50SWQpO1xuICAgIH1cbiAgXG4gICAgcHVibGljIGluc2VydENsYXNzTm9kZShcbiAgICAgIG1vZHVsZVJlZjogTW9kdWxlLFxuICAgICAgd3JhcHBlcjogSW5zdGFuY2VXcmFwcGVyLFxuICAgICAgdHlwZTogRXhjbHVkZTxOb2RlWydtZXRhZGF0YSddWyd0eXBlJ10sICdtb2R1bGUnPixcbiAgICApIHtcbiAgICAgIHRoaXMuZ3JhcGguaW5zZXJ0Tm9kZSh7XG4gICAgICAgIGlkOiB3cmFwcGVyLmlkLFxuICAgICAgICBsYWJlbDogd3JhcHBlci5uYW1lLFxuICAgICAgICBwYXJlbnQ6IG1vZHVsZVJlZi5pZCxcbiAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICB0eXBlLFxuICAgICAgICAgIGludGVybmFsOiB3cmFwcGVyLm1ldGFUeXBlID09PSBtb2R1bGVSZWYubWV0YVR5cGUsXG4gICAgICAgICAgc291cmNlTW9kdWxlTmFtZTogbW9kdWxlUmVmLm5hbWUsXG4gICAgICAgICAgZHVyYWJsZTogd3JhcHBlci5pc0RlcGVuZGVuY3lUcmVlRHVyYWJsZSgpLFxuICAgICAgICAgIHN0YXRpYzogd3JhcHBlci5pc0RlcGVuZGVuY3lUcmVlU3RhdGljKCksXG4gICAgICAgICAgc2NvcGU6IHdyYXBwZXIuc2NvcGUsXG4gICAgICAgICAgdHJhbnNpZW50OiB3cmFwcGVyLmlzVHJhbnNpZW50LFxuICAgICAgICAgIGV4cG9ydGVkOiBtb2R1bGVSZWYuZXhwb3J0cy5oYXMod3JhcHBlci50b2tlbiksXG4gICAgICAgICAgdG9rZW46IHdyYXBwZXIudG9rZW4sXG4gICAgICAgICAgc3VidHlwZTogd3JhcHBlci5zdWJ0eXBlLFxuICAgICAgICAgIGluaXRUaW1lOiB3cmFwcGVyLmluaXRUaW1lLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuICBcbiAgICBwcml2YXRlIGluc2VydE1vZHVsZU5vZGUobW9kdWxlUmVmOiBNb2R1bGUpIHtcbiAgICAgIGNvbnN0IGR5bmFtaWNNZXRhZGF0YSA9IHRoaXMuY29udGFpbmVyLmdldER5bmFtaWNNZXRhZGF0YUJ5VG9rZW4oXG4gICAgICAgIG1vZHVsZVJlZi50b2tlbixcbiAgICAgICk7XG4gICAgICBjb25zdCBub2RlOiBOb2RlID0ge1xuICAgICAgICBpZDogbW9kdWxlUmVmLmlkLFxuICAgICAgICBsYWJlbDogbW9kdWxlUmVmLm5hbWUsXG4gICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgdHlwZTogJ21vZHVsZScsXG4gICAgICAgICAgZ2xvYmFsOiBtb2R1bGVSZWYuaXNHbG9iYWwsXG4gICAgICAgICAgZHluYW1pYzogISFkeW5hbWljTWV0YWRhdGEsXG4gICAgICAgICAgaW50ZXJuYWw6IG1vZHVsZVJlZi5uYW1lID09PSAnSW50ZXJuYWxDb3JlTW9kdWxlJyxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICB0aGlzLmdyYXBoLmluc2VydE5vZGUobm9kZSk7XG4gICAgfVxuICBcbiAgICBwcml2YXRlIGluc2VydE1vZHVsZVRvTW9kdWxlRWRnZXMobW9kdWxlUmVmOiBNb2R1bGUpIHtcbiAgICAgIGZvciAoY29uc3QgdGFyZ2V0TW9kdWxlUmVmIG9mIG1vZHVsZVJlZi5pbXBvcnRzKSB7XG4gICAgICAgIHRoaXMuZ3JhcGguaW5zZXJ0RWRnZSh7XG4gICAgICAgICAgc291cmNlOiBtb2R1bGVSZWYuaWQsXG4gICAgICAgICAgdGFyZ2V0OiB0YXJnZXRNb2R1bGVSZWYuaWQsXG4gICAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAgIHR5cGU6ICdtb2R1bGUtdG8tbW9kdWxlJyxcbiAgICAgICAgICAgIHNvdXJjZU1vZHVsZU5hbWU6IG1vZHVsZVJlZi5uYW1lLFxuICAgICAgICAgICAgdGFyZ2V0TW9kdWxlTmFtZTogdGFyZ2V0TW9kdWxlUmVmLm5hbWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICBcbiAgICBwcml2YXRlIGluc2VydEVuaGFuY2VyRWRnZShlbnRyeTogRW5oYW5jZXJNZXRhZGF0YUNhY2hlRW50cnkpIHtcbiAgICAgIGNvbnN0IG1vZHVsZVJlZiA9IHRoaXMuY29udGFpbmVyLmdldE1vZHVsZUJ5S2V5KGVudHJ5Lm1vZHVsZVRva2VuKTtcbiAgICAgIGNvbnN0IHNvdXJjZUluc3RhbmNlV3JhcHBlciA9XG4gICAgICAgIG1vZHVsZVJlZi5jb250cm9sbGVycy5nZXQoZW50cnkuY2xhc3NSZWYpID8/XG4gICAgICAgIG1vZHVsZVJlZi5wcm92aWRlcnMuZ2V0KGVudHJ5LmNsYXNzUmVmKTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nU291cmNlTm9kZSA9IHRoaXMuZ3JhcGguZ2V0Tm9kZUJ5SWQoXG4gICAgICAgIHNvdXJjZUluc3RhbmNlV3JhcHBlci5pZCxcbiAgICAgICkgYXMgQ2xhc3NOb2RlO1xuICAgICAgY29uc3QgZW5oYW5jZXJzID0gZXhpc3RpbmdTb3VyY2VOb2RlLm1ldGFkYXRhLmVuaGFuY2VycyA/PyBbXTtcbiAgXG4gICAgICBpZiAoZW50cnkuZW5oYW5jZXJJbnN0YW5jZVdyYXBwZXIpIHtcbiAgICAgICAgdGhpcy5pbnNlcnRDbGFzc1RvQ2xhc3NFZGdlKFxuICAgICAgICAgIHNvdXJjZUluc3RhbmNlV3JhcHBlcixcbiAgICAgICAgICBlbnRyeS5lbmhhbmNlckluc3RhbmNlV3JhcHBlcixcbiAgICAgICAgICBtb2R1bGVSZWYsXG4gICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICdkZWNvcmF0b3InLFxuICAgICAgICApO1xuICBcbiAgICAgICAgZW5oYW5jZXJzLnB1c2goe1xuICAgICAgICAgIGlkOiBlbnRyeS5lbmhhbmNlckluc3RhbmNlV3JhcHBlci5pZCxcbiAgICAgICAgICBtZXRob2RLZXk6IGVudHJ5Lm1ldGhvZEtleSxcbiAgICAgICAgICBzdWJ0eXBlOiBlbnRyeS5zdWJ0eXBlLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG5hbWUgPVxuICAgICAgICAgIGVudHJ5LmVuaGFuY2VyUmVmLmNvbnN0cnVjdG9yPy5uYW1lID8/XG4gICAgICAgICAgKGVudHJ5LmVuaGFuY2VyUmVmIGFzIEZ1bmN0aW9uKS5uYW1lO1xuICBcbiAgICAgICAgZW5oYW5jZXJzLnB1c2goe1xuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgbWV0aG9kS2V5OiBlbnRyeS5tZXRob2RLZXksXG4gICAgICAgICAgc3VidHlwZTogZW50cnkuc3VidHlwZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBleGlzdGluZ1NvdXJjZU5vZGUubWV0YWRhdGEuZW5oYW5jZXJzID0gZW5oYW5jZXJzO1xuICAgIH1cbiAgXG4gICAgcHJpdmF0ZSBpbnNlcnRDbGFzc1RvQ2xhc3NFZGdlPFQ+KFxuICAgICAgc291cmNlOiBJbnN0YW5jZVdyYXBwZXI8VD4sXG4gICAgICB0YXJnZXQ6IEluc3RhbmNlV3JhcHBlcixcbiAgICAgIG1vZHVsZVJlZjogTW9kdWxlLFxuICAgICAga2V5T3JJbmRleDogbnVtYmVyIHwgc3RyaW5nIHwgc3ltYm9sIHwgdW5kZWZpbmVkLFxuICAgICAgaW5qZWN0aW9uVHlwZTogJ2NvbnN0cnVjdG9yJyB8ICdwcm9wZXJ0eScgfCAnZGVjb3JhdG9yJyxcbiAgICApIHtcbiAgICAgIHRoaXMuZ3JhcGguaW5zZXJ0RWRnZSh7XG4gICAgICAgIHNvdXJjZTogc291cmNlLmlkLFxuICAgICAgICB0YXJnZXQ6IHRhcmdldC5pZCxcbiAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICB0eXBlOiAnY2xhc3MtdG8tY2xhc3MnLFxuICAgICAgICAgIHNvdXJjZU1vZHVsZU5hbWU6IG1vZHVsZVJlZi5uYW1lLFxuICAgICAgICAgIHNvdXJjZUNsYXNzTmFtZTogc291cmNlLm5hbWUsXG4gICAgICAgICAgdGFyZ2V0Q2xhc3NOYW1lOiB0YXJnZXQubmFtZSxcbiAgICAgICAgICBzb3VyY2VDbGFzc1Rva2VuOiBzb3VyY2UudG9rZW4sXG4gICAgICAgICAgdGFyZ2V0Q2xhc3NUb2tlbjogdGFyZ2V0LnRva2VuLFxuICAgICAgICAgIHRhcmdldE1vZHVsZU5hbWU6IHRhcmdldC5ob3N0Py5uYW1lLFxuICAgICAgICAgIGtleU9ySW5kZXgsXG4gICAgICAgICAgaW5qZWN0aW9uVHlwZSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgXG4gICAgcHJpdmF0ZSBpbnNlcnRDbGFzc05vZGVzKG1vZHVsZVJlZjogTW9kdWxlKSB7XG4gICAgICBtb2R1bGVSZWYucHJvdmlkZXJzLmZvckVhY2godmFsdWUgPT5cbiAgICAgICAgdGhpcy5pbnNlcnRDbGFzc05vZGUobW9kdWxlUmVmLCB2YWx1ZSwgJ3Byb3ZpZGVyJyksXG4gICAgICApO1xuICAgICAgbW9kdWxlUmVmLmluamVjdGFibGVzLmZvckVhY2godmFsdWUgPT5cbiAgICAgICAgdGhpcy5pbnNlcnRDbGFzc05vZGUobW9kdWxlUmVmLCB2YWx1ZSwgJ3NlcnZpY2UnKSxcbiAgICAgICk7XG4gICAgICBtb2R1bGVSZWYuY29udHJvbGxlcnMuZm9yRWFjaCh2YWx1ZSA9PlxuICAgICAgICB0aGlzLmluc2VydENsYXNzTm9kZShtb2R1bGVSZWYsIHZhbHVlLCAnY29udHJvbGxlcicpLFxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgIl19