family-hierarchy
Version:
A small library for **Angular 9+** that implements [vis-network](https://github.com/visjs/vis-network) to generate a hierarchy chart of a family.
232 lines • 29.4 kB
JavaScript
import { __decorate, __read, __spread } from "tslib";
import { Injectable } from '@angular/core';
import { Subject, BehaviorSubject } from 'rxjs';
import { DataSet } from 'vis-network/standalone';
import { DEFAULT_CONFIG } from '../config/default';
import { isObject } from 'util';
import * as i0 from "@angular/core";
/* tslint:disable */
var FamilyHierarchyService = /** @class */ (function () {
function FamilyHierarchyService() {
this.currentEdges = new BehaviorSubject(new DataSet());
this._Edges = this.currentEdges.asObservable();
this.currentNodes = new BehaviorSubject(new DataSet());
this._Nodes = this.currentNodes.asObservable();
this.currentFhNodes = new BehaviorSubject([]);
this._fhNodes = this.currentFhNodes.asObservable();
this.currentFhUnions = new BehaviorSubject([]);
this._fhUnions = this.currentFhUnions.asObservable();
this.currentFhLinks = new BehaviorSubject([]);
this._fhLinks = this.currentFhLinks.asObservable();
this.currentConfig = new BehaviorSubject(DEFAULT_CONFIG);
this._config = this.currentConfig.asObservable();
this.init = new Subject();
this._init = this.init.asObservable();
this._clickNode = new Subject();
this.clickNode = this._clickNode.asObservable();
this._clickUnion = new Subject();
this.clickUnion = this._clickUnion.asObservable();
this._clickLink = new Subject();
this.clickLink = this._clickLink.asObservable();
}
Object.defineProperty(FamilyHierarchyService.prototype, "Edges", {
get: function () {
return this._Edges;
},
enumerable: true,
configurable: true
});
Object.defineProperty(FamilyHierarchyService.prototype, "Nodes", {
get: function () {
return this._Nodes;
},
enumerable: true,
configurable: true
});
FamilyHierarchyService.prototype.setFhNodes = function (nodes) {
this.currentNodes.next(this.generateNodes(nodes));
this.currentFhNodes.next(nodes);
};
Object.defineProperty(FamilyHierarchyService.prototype, "FhNodes", {
get: function () {
return this._fhNodes;
},
enumerable: true,
configurable: true
});
FamilyHierarchyService.prototype.setFhUnions = function (unions) {
this.generateUnions(unions);
this.currentFhUnions.next(unions);
};
Object.defineProperty(FamilyHierarchyService.prototype, "FhUnions", {
get: function () {
return this._fhUnions;
},
enumerable: true,
configurable: true
});
FamilyHierarchyService.prototype.setFhLinks = function (links) {
this.currentEdges.next(this.generateEdges(links));
this.currentFhLinks.next(links);
};
Object.defineProperty(FamilyHierarchyService.prototype, "FhLinks", {
get: function () {
return this._fhLinks;
},
enumerable: true,
configurable: true
});
FamilyHierarchyService.prototype.setConfig = function (config) {
this.currentConfig.next(this.mergeDeep(this.currentConfig.getValue(), config));
};
Object.defineProperty(FamilyHierarchyService.prototype, "config", {
get: function () {
return this._config;
},
enumerable: true,
configurable: true
});
FamilyHierarchyService.prototype.sendClickEvent = function (e, type) {
if (type === 'node') {
var node = this.currentFhNodes.getValue().find(function (el) { return el.id === e.nodes[0]; });
if (node) {
this._clickNode.next(node);
}
else {
var id_1 = e.nodes[0].replace('u', '');
var union = this.currentFhUnions.getValue().find(function (el) { return el.id == id_1; });
this._clickUnion.next(union);
}
}
else {
var link = this.currentFhLinks.getValue().find(function (el) { return el.id == e.edges[0]; });
if (link) {
this._clickLink.next(link);
}
else {
var regex = /(?<=l)(.*?)(?=_)/;
var id_2 = e.edges[0].toString().match(regex)[0];
this._clickLink.next(this.currentFhUnions.getValue().find(function (o) { return o.id == id_2; }));
}
}
};
FamilyHierarchyService.prototype.initialize = function (data, config) {
this.currentFhLinks.next(data.links);
this.currentFhNodes.next(data.nodes);
this.currentFhUnions.next(data.unions);
this.currentEdges.next(this.generateEdges(data.links)),
this.currentNodes.next(this.generateNodes(data.nodes));
this.generateUnions(data.unions);
if (config) {
this.setConfig(config);
}
this.init.next(true);
};
FamilyHierarchyService.prototype.mergeDeep = function (target) {
var _a, _b;
var sources = [];
for (var _i = 1; _i < arguments.length; _i++) {
sources[_i - 1] = arguments[_i];
}
if (!sources.length) {
return target;
}
var source = sources.shift();
if (isObject(target) && isObject(source)) {
for (var key in source) {
if (isObject(source[key])) {
if (!target[key]) {
Object.assign(target, (_a = {}, _a[key] = {}, _a));
}
else {
target[key] = Object.assign({}, target[key]);
}
this.mergeDeep(target[key], source[key]);
}
else {
Object.assign(target, (_b = {}, _b[key] = source[key], _b));
}
}
}
return this.mergeDeep.apply(this, __spread([target], sources));
};
FamilyHierarchyService.prototype.generateNodes = function (nodes) {
var _this = this;
return new DataSet(nodes.map(function (o) {
return _this.createNode(o);
}));
};
FamilyHierarchyService.prototype.createNode = function (o) {
return {
id: o.id,
image: o.image ? o.image : this.currentConfig.getValue().nodes.images,
shape: 'image',
size: this.currentConfig.getValue().nodes.size,
level: (o.level * 2) - 1,
label: o.label
};
};
FamilyHierarchyService.prototype.createEdge = function (o) {
return {
id: o.id,
from: o.nodeId,
to: "u" + o.unionId,
color: this.currentConfig.getValue().links.childrens.styles
};
};
FamilyHierarchyService.prototype.generateEdges = function (links) {
var _this = this;
return new DataSet(links.map(function (o) {
return _this.createEdge(o);
}));
};
FamilyHierarchyService.prototype.generateUnions = function (unions) {
var _this = this;
unions.forEach(function (u) {
_this.createUnion(u);
});
};
FamilyHierarchyService.prototype.createUnion = function (u) {
var _this = this;
var level;
var node = {
id: "u" + u.id,
image: this.currentConfig.getValue().union.images,
shape: 'image',
size: this.currentConfig.getValue().union.size,
};
u.components.forEach(function (e) {
var edge = {
id: "l" + u.id + "_" + node.id + "-" + e,
from: node.id,
to: e,
color: _this.currentConfig.getValue().links.parents.styles,
};
level = _this.currentFhNodes.getValue().filter(function (n) { return n.id === e; })[0].level;
_this.currentEdges.getValue().add(edge);
});
node.level = (level * 2);
this.currentNodes.getValue().add(node);
};
FamilyHierarchyService.prototype.addNode = function (node) {
this.currentFhNodes.getValue().push(node);
this.currentNodes.getValue().add(this.createNode(node));
};
FamilyHierarchyService.prototype.addLink = function (link) {
this.currentFhLinks.getValue().push(link);
this.currentEdges.getValue().add(this.createEdge(link));
};
FamilyHierarchyService.prototype.addUnion = function (union) {
this.currentFhUnions.getValue().push(union);
this.createUnion(union);
};
FamilyHierarchyService.ɵprov = i0.ɵɵdefineInjectable({ factory: function FamilyHierarchyService_Factory() { return new FamilyHierarchyService(); }, token: FamilyHierarchyService, providedIn: "root" });
FamilyHierarchyService = __decorate([
Injectable({
providedIn: 'root'
})
], FamilyHierarchyService);
return FamilyHierarchyService;
}());
export { FamilyHierarchyService };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFtaWx5LWhpZXJhcmNoeS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vZmFtaWx5LWhpZXJhcmNoeS8iLCJzb3VyY2VzIjpbImxpYi9zZXJ2aWNlL2ZhbWlseS1oaWVyYXJjaHkuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsT0FBTyxFQUFFLGVBQWUsRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUU1RCxPQUFPLEVBQUUsT0FBTyxFQUFvQixNQUFNLHdCQUF3QixDQUFDO0FBQ25FLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sTUFBTSxDQUFDOztBQUVoQyxvQkFBb0I7QUFLcEI7SUF3RkU7UUF2RlEsaUJBQVksR0FBRyxJQUFJLGVBQWUsQ0FBZ0IsSUFBSSxPQUFPLEVBQVEsQ0FBQyxDQUFDO1FBQ3ZFLFdBQU0sR0FBK0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQU10RSxpQkFBWSxHQUFHLElBQUksZUFBZSxDQUFnQixJQUFJLE9BQU8sRUFBUSxDQUFDLENBQUM7UUFDdkUsV0FBTSxHQUErQixJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBTXRFLG1CQUFjLEdBQUcsSUFBSSxlQUFlLENBQVksRUFBRSxDQUFDLENBQUM7UUFDckQsYUFBUSxHQUEwQixJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBU3BFLG9CQUFlLEdBQUcsSUFBSSxlQUFlLENBQWEsRUFBRSxDQUFDLENBQUM7UUFDdkQsY0FBUyxHQUEyQixJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBU3ZFLG1CQUFjLEdBQUcsSUFBSSxlQUFlLENBQVksRUFBRSxDQUFDLENBQUM7UUFDckQsYUFBUSxHQUEwQixJQUFJLENB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QUksQ0FBQyxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVNLHdDQUFPLEdBQWQsVUFBZSxJQUFZO1FBQ3pCLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRU0seUNBQVEsR0FBZixVQUFnQixLQUFjO1FBQzVCLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDMUIsQ0FBQzs7SUE5TVUsc0JBQXNCO1FBSGxDLFVBQVUsQ0FBQztZQUNWLFVBQVUsRUFBRSxNQUFNO1NBQ25CLENBQUM7T0FDVyxzQkFBc0IsQ0ErTWxDO2lDQTNORDtDQTJOQyxBQS9NRCxJQStNQztTQS9NWSxzQkFBc0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFN1YmplY3QsIEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBGaE5vZGUsIEZoVW5pb24sIEZoTGluaywgRmhDb25maWcsIEZoRGF0YSB9IGZyb20gJy4uL21vZGVscy9tb2RlbHMnO1xyXG5pbXBvcnQgeyBEYXRhU2V0LCBOb2RlLCBFZGdlLCBEYXRhIH0gZnJvbSAndmlzLW5ldHdvcmsvc3RhbmRhbG9uZSc7XHJcbmltcG9ydCB7IERFRkFVTFRfQ09ORklHIH0gZnJvbSAnLi4vY29uZmlnL2RlZmF1bHQnO1xyXG5pbXBvcnQgeyBpc09iamVjdCB9IGZyb20gJ3V0aWwnO1xyXG5cclxuLyogdHNsaW50OmRpc2FibGUgKi9cclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIEZhbWlseUhpZXJhcmNoeVNlcnZpY2Uge1xyXG4gIHByaXZhdGUgY3VycmVudEVkZ2VzID0gbmV3IEJlaGF2aW9yU3ViamVjdDxEYXRhU2V0PEVkZ2U+PihuZXcgRGF0YVNldDxFZGdlPigpKTtcclxuICBwcml2YXRlIF9FZGdlcyA6IE9ic2VydmFibGU8RGF0YVNldDxFZGdlPj4gPSB0aGlzLmN1cnJlbnRFZGdlcy5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgcHVibGljIGdldCBFZGdlcygpOiBPYnNlcnZhYmxlPERhdGFTZXQ8RWRnZT4+IHtcclxuICAgIHJldHVybiB0aGlzLl9FZGdlcztcclxuICB9XHJcbiAgXHJcbiAgcHJpdmF0ZSBjdXJyZW50Tm9kZXMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PERhdGFTZXQ8Tm9kZT4+KG5ldyBEYXRhU2V0PE5vZGU+KCkpO1xyXG4gIHByaXZhdGUgX05vZGVzIDogT2JzZXJ2YWJsZTxEYXRhU2V0PE5vZGU+PiA9IHRoaXMuY3VycmVudE5vZGVzLmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICBwdWJsaWMgZ2V0IE5vZGVzKCk6IE9ic2VydmFibGU8RGF0YVNldDxOb2RlPj4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX05vZGVzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjdXJyZW50RmhOb2RlcyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8RmhOb2RlIFtdPihbXSk7XHJcbiAgcHVibGljIF9maE5vZGVzOiBPYnNlcnZhYmxlPEZoTm9kZSBbXT4gPSB0aGlzLmN1cnJlbnRGaE5vZGVzLmFzT2JzZXJ2YWJsZSgpO1xyXG4gIHB1YmxpYyBzZXRGaE5vZGVzKG5vZGVzOiBGaE5vZGUgW10pIHtcclxuICAgIHRoaXMuY3VycmVudE5vZGVzLm5leHQodGhpcy5nZW5lcmF0ZU5vZGVzKG5vZGVzKSk7XHJcbiAgICB0aGlzLmN1cnJlbnRGaE5vZGVzLm5leHQobm9kZXMpO1xyXG4gIH1cclxuICBwdWJsaWMgZ2V0IEZoTm9kZXMoKTogT2JzZXJ2YWJsZTxGaE5vZGUgW10+IHtcclxuICAgIHJldHVybiB0aGlzLl9maE5vZGVzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjdXJyZW50RmhVbmlvbnMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEZoVW5pb24gW10+KFtdKTtcclxuICBwdWJsaWMgX2ZoVW5pb25zOiBPYnNlcnZhYmxlPEZoVW5pb24gW10+ID0gdGhpcy5jdXJyZW50RmhVbmlvbnMuYXNPYnNlcnZhYmxlKCk7XHJcbiAgcHVibGljIHNldEZoVW5pb25zKHVuaW9uczogRmhVbmlvbiBbXSkge1xyXG4gICAgdGhpcy5nZW5lcmF0ZVVuaW9ucyh1bmlvbnMpO1xyXG4gICAgdGhpcy5jdXJyZW50RmhVbmlvbnMubmV4dCh1bmlvbnMpO1xyXG4gIH1cclxuICBwdWJsaWMgZ2V0IEZoVW5pb25zKCk6IE9ic2VydmFibGU8RmhVbmlvbiBbXT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2ZoVW5pb25zO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjdXJyZW50RmhMaW5rcyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8RmhMaW5rIFtdPihbXSk7XHJcbiAgcHVibGljIF9maExpbmtzOiBPYnNlcnZhYmxlPEZoTGluayBbXT4gPSB0aGlzLmN1cnJlbnRGaExpbmtzLmFzT2JzZXJ2YWJsZSgpO1xyXG4gIHB1YmxpYyBzZXRGaExpbmtzKGxpbmtzOiBGaExpbmsgW10pIHtcclxuICAgIHRoaXMuY3VycmVudEVkZ2VzLm5leHQodGhpcy5nZW5lcmF0ZUVkZ2VzKGxpbmtzKSlcclxuICAgIHRoaXMuY3VycmVudEZoTGlua3MubmV4dChsaW5rcyk7XHJcbiAgfVxyXG4gIGdldCBGaExpbmtzKCk6IE9ic2VydmFibGU8RmhMaW5rIFtdPiB7XHJcbiAgICByZXR1cm4gdGhpcy5fZmhMaW5rcztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3VycmVudENvbmZpZyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8RmhDb25maWc+KERFRkFVTFRfQ09ORklHKTtcclxuICBwdWJsaWMgX2NvbmZpZzogT2JzZXJ2YWJsZTxGaENvbmZpZz4gPSB0aGlzLmN1cnJlbnRDb25maWcuYXNPYnNlcnZhYmxlKCk7XHJcbiAgcHVibGljIHNldENvbmZpZyhjb25maWc6IEZoQ29uZmlnKSB7XHJcbiAgICB0aGlzLmN1cnJlbnRDb25maWcubmV4dCh0aGlzLm1lcmdlRGVlcCh0aGlzLmN1cnJlbnRDb25maWcuZ2V0VmFsdWUoKSwgY29uZmlnKSk7XHJcbiAgfVxyXG4gIHB1YmxpYyBnZXQgY29uZmlnKCk6IE9ic2VydmFibGU8RmhDb25maWc+IHtcclxuICAgIHJldHVybiB0aGlzLl9jb25maWc7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXQgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xyXG4gIHB1YmxpYyBfaW5pdDogT2JzZXJ2YWJsZTxib29sZWFuPiA9IHRoaXMuaW5pdC5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgcHJpdmF0ZSBfY2xpY2tOb2RlID0gbmV3IFN1YmplY3Q8YW55PigpO1xyXG4gIHB1YmxpYyBjbGlja05vZGUgPSB0aGlzLl9jbGlja05vZGUuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIHByaXZhdGUgX2NsaWNrVW5pb24gPSBuZXcgU3ViamVjdDxhbnk+KCk7XHJcbiAgcHVibGljIGNsaWNrVW5pb24gPSB0aGlzLl9jbGlja1VuaW9uLmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICBwcml2YXRlIF9jbGlja0xpbmsgPSBuZXcgU3ViamVjdDxhbnk+KCk7XHJcbiAgcHVibGljIGNsaWNrTGluayA9IHRoaXMuX2NsaWNrTGluay5hc09ic2VydmFibGUoKTtcclxuICBcclxuICBwdWJsaWMgc2VuZENsaWNrRXZlbnQoZTogYW55LCB0eXBlPzogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAodHlwZSA9PT0gJ25vZGUnKSB7XHJcbiAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLmN1cnJlbnRGaE5vZGVzLmdldFZhbHVlKCkuZmluZCggZWwgPT4gZWwuaWQgPT09IGUubm9kZXNbMF0pO1xyXG4gICAgICBpZiAobm9kZSkge1xyXG4gICAgICAgIHRoaXMuX2NsaWNrTm9kZS5uZXh0KG5vZGUpO1xyXG4gICAgICB9IGVsc2UgeyBcclxuICAgICAgICBjb25zdCBpZCA9IGUubm9kZXNbMF0ucmVwbGFjZSgndScsJycpO1xyXG4gICAgICAgIGNvbnN0IHVuaW9uID0gdGhpcy5jdXJyZW50RmhVbmlvbnMuZ2V0VmFsdWUoKS5maW5kKCBlbCA9PiBlbC5pZCA9PSBpZClcclxuICAgICAgICB0aGlzLl9jbGlja1VuaW9uLm5leHQodW5pb24pO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBsaW5rICA9IHRoaXMuY3VycmVudEZoTGlua3MuZ2V0VmFsdWUoKS5maW5kKCBlbCA9PiBlbC5pZCA9PSBlLmVkZ2VzWzBdKTtcclxuICAgICAgaWYgKGxpbmspIHtcclxuICAgICAgICB0aGlzLl9jbGlja0xpbmsubmV4dChsaW5rKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCByZWdleCA9IC8oPzw9bCkoLio/KSg/PV8pLztcclxuICAgICAgICBjb25zdCBpZDogc3RyaW5nID0gZS5lZGdlc1swXS50b1N0cmluZygpLm1hdGNoKHJlZ2V4KVswXTtcclxuICAgICAgICB0aGlzLl9jbGlja0xpbmsubmV4dCh0aGlzLmN1cnJlbnRGaFVuaW9ucy5nZXRWYWx1ZSgpLmZpbmQoIG8gPT4gby5pZCA9PSBpZCkgKVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIFxyXG4gIGNvbnN0cnVjdG9yKCkgeyB9XHJcblxyXG4gIHB1YmxpYyBpbml0aWFsaXplKGRhdGE6IEZoRGF0YSwgY29uZmlnPzogRmhDb25maWcpOiB2b2lkIHtcclxuICAgIHRoaXMuY3VycmVudEZoTGlua3MubmV4dChkYXRhLmxpbmtzKTtcclxuICAgIHRoaXMuY3VycmVudEZoTm9kZXMubmV4dChkYXRhLm5vZGVzKTtcclxuICAgIHRoaXMuY3VycmVudEZoVW5pb25zLm5leHQoZGF0YS51bmlvbnMpO1xyXG4gICAgdGhpcy5jdXJyZW50RWRnZXMubmV4dCh0aGlzLmdlbmVyYXRlRWRnZXMoZGF0YS5saW5rcykpLFxyXG4gICAgdGhpcy5jdXJyZW50Tm9kZXMubmV4dCh0aGlzLmdlbmVyYXRlTm9kZXMoZGF0YS5ub2RlcykpXHJcbiAgICB0aGlzLmdlbmVyYXRlVW5pb25zKGRhdGEudW5pb25zKTtcclxuXHJcbiAgICBpZiAoY29uZmlnKSB7XHJcbiAgICAgIHRoaXMuc2V0Q29uZmlnKGNvbmZpZyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5pbml0Lm5leHQodHJ1ZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG1lcmdlRGVlcCh0YXJnZXQsIC4uLnNvdXJjZXMpIHtcclxuICAgIGlmICghc291cmNlcy5sZW5ndGgpIHsgcmV0dXJuIHRhcmdldDsgfVxyXG4gICAgY29uc3Qgc291cmNlID0gc291cmNlcy5zaGlmdCgpO1xyXG4gICAgaWYgKGlzT2JqZWN0KHRhcmdldCkgJiYgaXNPYmplY3Qoc291cmNlKSkge1xyXG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBzb3VyY2UpIHtcclxuICAgICAgICBpZiAoaXNPYmplY3Qoc291cmNlW2tleV0pKSB7XHJcbiAgICAgICAgICBpZiAoIXRhcmdldFtrZXldKSB7XHJcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24odGFyZ2V0LCB7IFtrZXldOiB7fSB9KTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRhcmdldFtrZXldID0gT2JqZWN0LmFzc2lnbih7fSwgdGFyZ2V0W2tleV0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5tZXJnZURlZXAodGFyZ2V0W2tleV0sIHNvdXJjZVtrZXldKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgT2JqZWN0LmFzc2lnbih0YXJnZXQsIHsgW2tleV06IHNvdXJjZVtrZXldIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMubWVyZ2VEZWVwKHRhcmdldCwgLi4uc291cmNlcyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdlbmVyYXRlTm9kZXMobm9kZXM6IEZoTm9kZSBbXSk6IERhdGFTZXQ8Tm9kZT4ge1xyXG4gICAgcmV0dXJuIG5ldyBEYXRhU2V0PE5vZGU+IChcclxuICAgICAgbm9kZXMubWFwKFxyXG4gICAgICAgIChvOiBGaE5vZGUpID0+IHtcclxuICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZU5vZGUobyk7XHJcbiAgICAgICAgfVxyXG4gICAgICApXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVOb2RlKG86IEZoTm9kZSk6IE5vZGUge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgaWQgOiBvLmlkLFxyXG4gICAgICBpbWFnZSA6IG8uaW1hZ2UgPyBvLmltYWdlIDogdGhpcy5jdXJyZW50Q29uZmlnLmdldFZhbHVlKCkubm9kZXMuaW1hZ2VzLFxyXG4gICAgICBzaGFwZTogJ2ltYWdlJyxcclxuICAgICAgc2l6ZSA6IHRoaXMuY3VycmVudENvbmZpZy5nZXRWYWx1ZSgpLm5vZGVzLnNpemUsXHJcbiAgICAgIGxldmVsIDogKG8ubGV2ZWwgKiAyKSAtIDEsXHJcbiAgICAgIGxhYmVsIDogby5sYWJlbFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlRWRnZShvOiBGaExpbmspOiBFZGdlIHtcclxuICAgcmV0dXJuIHtcclxuICAgICAgaWQ6IG8uaWQsXHJcbiAgICAgIGZyb206IG8ubm9kZUlkLFxyXG4gICAgICB0bzogYHUke28udW5pb25JZH1gLFxyXG4gICAgICBjb2xvcjogdGhpcy5jdXJyZW50Q29uZmlnLmdldFZhbHVlKCkubGlua3MuY2hpbGRyZW5zLnN0eWxlc1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2VuZXJhdGVFZGdlcyhsaW5rczogRmhMaW5rIFtdKTogRGF0YVNldDxFZGdlPiB7XHJcbiAgICByZXR1cm4gbmV3IERhdGFTZXQ8RWRnZT4gKFxyXG4gICAgICBsaW5rcy5tYXAoXHJcbiAgICAgICAgKG86IEZoTGluaykgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlRWRnZShvKTtcclxuICAgICAgICB9XHJcbiAgICAgIClcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdlbmVyYXRlVW5pb25zKHVuaW9uczogRmhVbmlvbiBbXSk6IHZvaWQge1xyXG4gICAgdW5pb25zLmZvckVhY2goKHU6IEZoVW5pb24pID0+IHtcclxuICAgICAgdGhpcy5jcmVhdGVVbmlvbih1KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVVbmlvbih1OiBGaFVuaW9uKTogdm9pZCB7XHJcbiAgICBsZXQgbGV2ZWw7XHJcbiAgICBjb25zdCBub2RlOiBOb2RlID0ge1xyXG4gICAgICBpZDogYHUke3UuaWR9YCxcclxuICAgICAgaW1hZ2U6IHRoaXMuY3VycmVudENvbmZpZy5nZXRWYWx1ZSgpLnVuaW9uLmltYWdlcyxcclxuICAgICAgc2hhcGU6ICdpbWFnZScsXHJcbiAgICAgIHNpemU6IHRoaXMuY3VycmVudENvbmZpZy5nZXRWYWx1ZSgpLnVuaW9uLnNpemUsXHJcbiAgICB9O1xyXG4gICAgdS5jb21wb25lbnRzLmZvckVhY2goKGU6bnVtYmVyIHwgc3RyaW5nKSA9PiB7XHJcbiAgICAgIGNvbnN0IGVkZ2U6IEVkZ2UgPSB7XHJcbiAgICAgICAgaWQ6IGBsJHt1LmlkfV8ke25vZGUuaWR9LSR7ZX1gLFxyXG4gICAgICAgIGZyb206IG5vZGUuaWQsXHJcbiAgICAgICAgdG86IGUsXHJcbiAgICAgICAgY29sb3I6IHRoaXMuY3VycmVudENvbmZpZy5nZXRWYWx1ZSgpLmxpbmtzLnBhcmVudHMuc3R5bGVzLFxyXG4gICAgICB9O1xyXG4gICAgICBsZXZlbCA9IHRoaXMuY3VycmVudEZoTm9kZXMuZ2V0VmFsdWUoKS5maWx0ZXIoIG4gPT4gbi5pZCA9PT0gZSlbMF0ubGV2ZWw7XHJcbiAgICAgIHRoaXMuY3VycmVudEVkZ2VzLmdldFZhbHVlKCkuYWRkKGVkZ2UpO1xyXG4gICAgfSk7XHJcbiAgICBub2RlLmxldmVsID0gKGxldmVsICogMik7XHJcbiAgICB0aGlzLmN1cnJlbnROb2Rlcy5nZXRWYWx1ZSgpLmFkZChub2RlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhZGROb2RlKG5vZGU6IEZoTm9kZSk6IHZvaWQge1xyXG4gICAgdGhpcy5jdXJyZW50RmhOb2Rlcy5nZXRWYWx1ZSgpLnB1c2gobm9kZSk7XHJcbiAgICB0aGlzLmN1cnJlbnROb2Rlcy5nZXRWYWx1ZSgpLmFkZCh0aGlzLmNyZWF0ZU5vZGUobm9kZSkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFkZExpbmsobGluazogRmhMaW5rKTogdm9pZCB7XHJcbiAgICB0aGlzLmN1cnJlbnRGaExpbmtzLmdldFZhbHVlKCkucHVzaChsaW5rKTtcclxuICAgIHRoaXMuY3VycmVudEVkZ2VzLmdldFZhbHVlKCkuYWRkKHRoaXMuY3JlYXRlRWRnZShsaW5rKSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYWRkVW5pb24odW5pb246IEZoVW5pb24pOiB2b2lkIHtcclxuICAgIHRoaXMuY3VycmVudEZoVW5pb25zLmdldFZhbHVlKCkucHVzaCh1bmlvbik7XHJcbiAgICB0aGlzLmNyZWF0ZVVuaW9uKHVuaW9uKTtcclxuICB9XHJcbn1cclxuIl19