cytoscape-angular-ng17
Version:
Angular 17+ components for cytoscape charting.
233 lines • 25.3 kB
JavaScript
import { Component, Input, ViewChild, } from '@angular/core';
import cytoscape from 'cytoscape';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "primeng/progressspinner";
/**
* The API is a little odd to provide flexibility.
* EITHER bind to cyOptions (type CytoscapeOptions), to control the options yourself
* OR this component will build a CytoscapeOptions internally by using all the other inputs.
* If cyOptions is supplied, all other inputs are ignored.
* The cyOptions container (HTML element) is always ignored and set internally.
*/
export class CytoscapeGraphComponent {
cyGraph;
debug = false;
nodes;
edges;
autolock;
autoungrabify;
autounselectify;
boxSelectionEnabled;
desktopTapThreshold;
hideEdgesOnViewport;
hideLabelsOnViewport;
layoutOptions;
maxZoom;
minZoom;
motionBlur;
motionBlurOpacity;
pan;
panningEnabled;
pixelRatio;
selectionType;
style;
styleEnabled;
textureOnViewport;
touchTapThreshold;
userPanningEnabled;
userZoomingEnabled;
wheelSensitivity;
zoom;
zoomingEnabled;
showToolbar = true;
cyOptions;
cy;
loading = false;
constructor() { }
ngOnChanges(changes) {
console.log('cytoscape graph component ngOnChanges. changes:', JSON.stringify(changes));
if (changes['style']) {
console.log('changes["style"]:', JSON.stringify(changes['style']));
this.runWhileLoading(this.updateStyles.bind(this));
}
}
getCy() {
return this.cy;
}
centerElements(selector) {
if (!this.cy) {
return;
}
const elems = this.cy.$(selector);
this.cy.center(elems);
}
zoomToElement(selector, level = 3) {
let position = this.cy?.$(selector)?.position();
if (!position) {
console.warn(`Cannot zoom to ${selector}`);
}
this.cy.zoom({
level: level,
position: position,
});
}
render() {
this.runWhileLoading(this.rerender.bind(this));
}
runWhileLoading(f) {
this.loading = true;
setTimeout(() => {
f();
setTimeout(() => {
this.loading = false;
}, 30);
}, 0);
}
updateStyles() {
if (this.cy && this.style) {
this.cy.style(this.style);
}
}
rerender() {
//TODO : this takes a heavy-handed approach, refine for performance
if (!this.cyGraph) {
console.warn(`No cyGraph found`);
return;
}
const cyOptions = this.cyOptions || {
// ignored, use nodes and edges
// elements: this.elements,
autolock: this.autolock,
autoungrabify: this.autoungrabify,
autounselectify: this.autounselectify,
boxSelectionEnabled: this.boxSelectionEnabled,
container: this.cyGraph.nativeElement,
desktopTapThreshold: this.desktopTapThreshold,
hideEdgesOnViewport: this.hideEdgesOnViewport,
hideLabelsOnViewport: this.hideLabelsOnViewport,
layout: this.layoutOptions,
maxZoom: this.maxZoom,
minZoom: this.minZoom,
motionBlur: this.motionBlur,
motionBlurOpacity: this.motionBlurOpacity,
pan: this.pan,
panningEnabled: this.panningEnabled,
pixelRatio: this.pixelRatio,
selectionType: this.selectionType,
style: this.style,
styleEnabled: this.styleEnabled,
textureOnViewport: this.textureOnViewport,
touchTapThreshold: this.touchTapThreshold,
userPanningEnabled: this.userPanningEnabled,
userZoomingEnabled: this.userZoomingEnabled,
wheelSensitivity: this.wheelSensitivity,
zoomingEnabled: this.zoomingEnabled,
zoom: this.zoom,
};
// TODO do reset() instead?
if (!this.cy) {
this.cy = cytoscape(cyOptions);
}
this.cy.startBatch();
this.cy.boxSelectionEnabled(this.boxSelectionEnabled);
this.cy.nodes().remove();
this.cy.edges().remove();
if (this.nodes) {
this.cy.add(this.nodes);
}
if (this.edges) {
this.cy.add(this.edges);
}
this.cy.endBatch();
if (this.layoutOptions) {
this.cy.layout(this.layoutOptions).run();
}
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: CytoscapeGraphComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.3", type: CytoscapeGraphComponent, selector: "cytoscape-graph", inputs: { debug: "debug", nodes: "nodes", edges: "edges", autolock: "autolock", autoungrabify: "autoungrabify", autounselectify: "autounselectify", boxSelectionEnabled: "boxSelectionEnabled", desktopTapThreshold: "desktopTapThreshold", hideEdgesOnViewport: "hideEdgesOnViewport", hideLabelsOnViewport: "hideLabelsOnViewport", layoutOptions: "layoutOptions", maxZoom: "maxZoom", minZoom: "minZoom", motionBlur: "motionBlur", motionBlurOpacity: "motionBlurOpacity", pan: "pan", panningEnabled: "panningEnabled", pixelRatio: "pixelRatio", selectionType: "selectionType", style: "style", styleEnabled: "styleEnabled", textureOnViewport: "textureOnViewport", touchTapThreshold: "touchTapThreshold", userPanningEnabled: "userPanningEnabled", userZoomingEnabled: "userZoomingEnabled", wheelSensitivity: "wheelSensitivity", zoom: "zoom", zoomingEnabled: "zoomingEnabled", showToolbar: "showToolbar" }, viewQueries: [{ propertyName: "cyGraph", first: true, predicate: ["cyGraph"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
<p-progressSpinner
*ngIf="loading"
class="spinner"
strokeWidth="4"
fill="#EEEEEE"
animationDuration=".5s"
></p-progressSpinner>
<div #cyGraph class="graphWrapper"></div>
`, isInline: true, styles: [".spinner{position:absolute;left:\"350px\";z-index:10;width:\"250px\";height:\"250px\"}@keyframes ui-progress-spinner-color{to,0%{stroke:#d62d20}40%{stroke:#0057e7}66%{stroke:#008744}80%,90%{stroke:#ffa700}}.graphWrapper{height:100%;width:100%}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.ProgressSpinner, selector: "p-progressSpinner", inputs: ["styleClass", "style", "strokeWidth", "fill", "animationDuration", "ariaLabel"] }] });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: CytoscapeGraphComponent, decorators: [{
type: Component,
args: [{ selector: 'cytoscape-graph', template: `
<p-progressSpinner
*ngIf="loading"
class="spinner"
strokeWidth="4"
fill="#EEEEEE"
animationDuration=".5s"
></p-progressSpinner>
<div #cyGraph class="graphWrapper"></div>
`, styles: [".spinner{position:absolute;left:\"350px\";z-index:10;width:\"250px\";height:\"250px\"}@keyframes ui-progress-spinner-color{to,0%{stroke:#d62d20}40%{stroke:#0057e7}66%{stroke:#008744}80%,90%{stroke:#ffa700}}.graphWrapper{height:100%;width:100%}\n"] }]
}], ctorParameters: () => [], propDecorators: { cyGraph: [{
type: ViewChild,
args: ['cyGraph']
}], debug: [{
type: Input
}], nodes: [{
type: Input
}], edges: [{
type: Input
}], autolock: [{
type: Input
}], autoungrabify: [{
type: Input
}], autounselectify: [{
type: Input
}], boxSelectionEnabled: [{
type: Input
}], desktopTapThreshold: [{
type: Input
}], hideEdgesOnViewport: [{
type: Input
}], hideLabelsOnViewport: [{
type: Input
}], layoutOptions: [{
type: Input
}], maxZoom: [{
type: Input
}], minZoom: [{
type: Input
}], motionBlur: [{
type: Input
}], motionBlurOpacity: [{
type: Input
}], pan: [{
type: Input
}], panningEnabled: [{
type: Input
}], pixelRatio: [{
type: Input
}], selectionType: [{
type: Input
}], style: [{
type: Input
}], styleEnabled: [{
type: Input
}], textureOnViewport: [{
type: Input
}], touchTapThreshold: [{
type: Input
}], userPanningEnabled: [{
type: Input
}], userZoomingEnabled: [{
type: Input
}], wheelSensitivity: [{
type: Input
}], zoom: [{
type: Input
}], zoomingEnabled: [{
type: Input
}], showToolbar: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3l0b3NjYXBlLWdyYXBoLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2N5dG9zY2FwZS1hbmd1bGFyL3NyYy9saWIvY3l0b3NjYXBlLWdyYXBoLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsU0FBUyxFQUVULEtBQUssRUFHTCxTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxTQVFOLE1BQU0sV0FBVyxDQUFDOzs7O0FBR25COzs7Ozs7R0FNRztBQTZDSCxNQUFNLE9BQU8sdUJBQXVCO0lBRWxDLE9BQU8sQ0FBeUI7SUFHaEMsS0FBSyxHQUFHLEtBQUssQ0FBQztJQUdkLEtBQUssQ0FBK0I7SUFFcEMsS0FBSyxDQUErQjtJQUdwQyxRQUFRLENBQXNCO0lBRTlCLGFBQWEsQ0FBc0I7SUFFbkMsZUFBZSxDQUFzQjtJQUVyQyxtQkFBbUIsQ0FBc0I7SUFFekMsbUJBQW1CLENBQXFCO0lBRXhDLG1CQUFtQixDQUFzQjtJQUV6QyxvQkFBb0IsQ0FBc0I7SUFFMUMsYUFBYSxDQUE0QjtJQUV6QyxPQUFPLENBQXFCO0lBRTVCLE9BQU8sQ0FBcUI7SUFFNUIsVUFBVSxDQUFzQjtJQUVoQyxpQkFBaUIsQ0FBcUI7SUFFdEMsR0FBRyxDQUF1QjtJQUUxQixjQUFjLENBQXNCO0lBRXBDLFVBQVUsQ0FBOEI7SUFFeEMsYUFBYSxDQUE0QjtJQUV6QyxLQUFLLENBQTJCO0lBRWhDLFlBQVksQ0FBc0I7SUFFbEMsaUJBQWlCLENBQXNCO0lBRXZDLGlCQUFpQixDQUFxQjtJQUV0QyxrQkFBa0IsQ0FBc0I7SUFFeEMsa0JBQWtCLENBQXNCO0lBRXhDLGdCQUFnQixDQUFxQjtJQUVyQyxJQUFJLENBQWdCO0lBRXBCLGNBQWMsQ0FBc0I7SUFFcEMsV0FBVyxHQUFHLElBQUksQ0FBQztJQUVuQixTQUFTLENBQStCO0lBQ2hDLEVBQUUsQ0FBVztJQUNyQixPQUFPLEdBQVksS0FBSyxDQUFDO0lBRXpCLGdCQUFlLENBQUM7SUFFVCxXQUFXLENBQUMsT0FBc0I7UUFDdkMsT0FBTyxDQUFDLEdBQUcsQ0FDVCxpREFBaUQsRUFDakQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FDeEIsQ0FBQztRQUNGLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDckIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbkUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3JELENBQUM7SUFDSCxDQUFDO0lBRU0sS0FBSztRQUNWLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQztJQUNqQixDQUFDO0lBRU0sY0FBYyxDQUFDLFFBQVE7UUFDNUIsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNiLE9BQU87UUFDVCxDQUFDO1FBQ0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbEMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQUVNLGFBQWEsQ0FBQyxRQUFnQixFQUFFLEtBQUssR0FBRyxDQUFDO1FBQzlDLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDO1FBQ2hELElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNkLE9BQU8sQ0FBQyxJQUFJLENBQUMsa0JBQWtCLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDN0MsQ0FBQztRQUNELElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDO1lBQ1gsS0FBSyxFQUFFLEtBQUs7WUFDWixRQUFRLEVBQUUsUUFBUTtTQUNuQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sTUFBTTtRQUNYLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRU0sZUFBZSxDQUFDLENBQVc7UUFDaEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDcEIsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLENBQUMsRUFBRSxDQUFDO1lBQ0osVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDZCxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztZQUN2QixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDVCxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0lBRU8sWUFBWTtRQUNsQixJQUFJLElBQUksQ0FBQyxFQUFFLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzFCLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QixDQUFDO0lBQ0gsQ0FBQztJQUVNLFFBQVE7UUFDYixtRUFBbUU7UUFDbkUsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNsQixPQUFPLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7WUFDakMsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJO1lBQ2xDLCtCQUErQjtZQUMvQiwyQkFBMkI7WUFDM0IsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ3ZCLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYTtZQUNqQyxlQUFlLEVBQUUsSUFBSSxDQUFDLGVBQWU7WUFDckMsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLG1CQUFtQjtZQUM3QyxTQUFTLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhO1lBQ3JDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxtQkFBbUI7WUFDN0MsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLG1CQUFtQjtZQUM3QyxvQkFBb0IsRUFBRSxJQUFJLENBQUMsb0JBQW9CO1lBQy9DLE1BQU0sRUFBRSxJQUFJLENBQUMsYUFBYTtZQUMxQixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87WUFDckIsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQ3JCLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVTtZQUMzQixpQkFBaUIsRUFBRSxJQUFJLENBQUMsaUJBQWlCO1lBQ3pDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRztZQUNiLGNBQWMsRUFBRSxJQUFJLENBQUMsY0FBYztZQUNuQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7WUFDM0IsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhO1lBQ2pDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztZQUNqQixZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQVk7WUFDL0IsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLGlCQUFpQjtZQUN6QyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsaUJBQWlCO1lBQ3pDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxrQkFBa0I7WUFDM0Msa0JBQWtCLEVBQUUsSUFBSSxDQUFDLGtCQUFrQjtZQUMzQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsZ0JBQWdCO1lBQ3ZDLGNBQWMsRUFBRSxJQUFJLENBQUMsY0FBYztZQUNuQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7U0FDaEIsQ0FBQztRQUNGLDJCQUEyQjtRQUUzQixJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ2IsSUFBSSxDQUFDLEVBQUUsR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDakMsQ0FBQztRQUNELElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUN0RCxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDekIsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDZixJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUIsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2YsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFCLENBQUM7UUFDRCxJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ25CLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUMzQyxDQUFDO0lBQ0gsQ0FBQzt1R0FyTFUsdUJBQXVCOzJGQUF2Qix1QkFBdUIsOGlDQTFDeEI7Ozs7Ozs7OztHQVNUOzsyRkFpQ1UsdUJBQXVCO2tCQTVDbkMsU0FBUzsrQkFDRSxpQkFBaUIsWUFDakI7Ozs7Ozs7OztHQVNUO3dEQW1DRCxPQUFPO3NCQUROLFNBQVM7dUJBQUMsU0FBUztnQkFJcEIsS0FBSztzQkFESixLQUFLO2dCQUlOLEtBQUs7c0JBREosS0FBSztnQkFHTixLQUFLO3NCQURKLEtBQUs7Z0JBSU4sUUFBUTtzQkFEUCxLQUFLO2dCQUdOLGFBQWE7c0JBRFosS0FBSztnQkFHTixlQUFlO3NCQURkLEtBQUs7Z0JBR04sbUJBQW1CO3NCQURsQixLQUFLO2dCQUdOLG1CQUFtQjtzQkFEbEIsS0FBSztnQkFHTixtQkFBbUI7c0JBRGxCLEtBQUs7Z0JBR04sb0JBQW9CO3NCQURuQixLQUFLO2dCQUdOLGFBQWE7c0JBRFosS0FBSztnQkFHTixPQUFPO3NCQUROLEtBQUs7Z0JBR04sT0FBTztzQkFETixLQUFLO2dCQUdOLFVBQVU7c0JBRFQsS0FBSztnQkFHTixpQkFBaUI7c0JBRGhCLEtBQUs7Z0JBR04sR0FBRztzQkFERixLQUFLO2dCQUdOLGNBQWM7c0JBRGIsS0FBSztnQkFHTixVQUFVO3NCQURULEtBQUs7Z0JBR04sYUFBYTtzQkFEWixLQUFLO2dCQUdOLEtBQUs7c0JBREosS0FBSztnQkFHTixZQUFZO3NCQURYLEtBQUs7Z0JBR04saUJBQWlCO3NCQURoQixLQUFLO2dCQUdOLGlCQUFpQjtzQkFEaEIsS0FBSztnQkFHTixrQkFBa0I7c0JBRGpCLEtBQUs7Z0JBR04sa0JBQWtCO3NCQURqQixLQUFLO2dCQUdOLGdCQUFnQjtzQkFEZixLQUFLO2dCQUdOLElBQUk7c0JBREgsS0FBSztnQkFHTixjQUFjO3NCQURiLEtBQUs7Z0JBR04sV0FBVztzQkFEVixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0ICogYXMgY3kgZnJvbSAnY3l0b3NjYXBlJztcbmltcG9ydCBjeXRvc2NhcGUsIHtcbiAgQ3l0b3NjYXBlT3B0aW9ucyxcbiAgRWRnZURlZmluaXRpb24sXG4gIExheW91dE9wdGlvbnMsXG4gIE5vZGVEZWZpbml0aW9uLFxuICBQb3NpdGlvbixcbiAgU2VsZWN0aW9uVHlwZSxcbiAgU3R5bGVzaGVldCxcbn0gZnJvbSAnY3l0b3NjYXBlJztcblxuXG4vKipcbiAqIFRoZSBBUEkgaXMgYSBsaXR0bGUgb2RkIHRvIHByb3ZpZGUgZmxleGliaWxpdHkuXG4gKiBFSVRIRVIgYmluZCB0byBjeU9wdGlvbnMgKHR5cGUgQ3l0b3NjYXBlT3B0aW9ucyksIHRvIGNvbnRyb2wgdGhlIG9wdGlvbnMgeW91cnNlbGZcbiAqIE9SIHRoaXMgY29tcG9uZW50IHdpbGwgYnVpbGQgYSBDeXRvc2NhcGVPcHRpb25zIGludGVybmFsbHkgYnkgdXNpbmcgYWxsIHRoZSBvdGhlciBpbnB1dHMuXG4gKiBJZiBjeU9wdGlvbnMgaXMgc3VwcGxpZWQsIGFsbCBvdGhlciBpbnB1dHMgYXJlIGlnbm9yZWQuXG4gKiBUaGUgY3lPcHRpb25zIGNvbnRhaW5lciAoSFRNTCBlbGVtZW50KSBpcyBhbHdheXMgaWdub3JlZCBhbmQgc2V0IGludGVybmFsbHkuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2N5dG9zY2FwZS1ncmFwaCcsXG4gIHRlbXBsYXRlOiBgXG4gICAgPHAtcHJvZ3Jlc3NTcGlubmVyXG4gICAgICAqbmdJZj1cImxvYWRpbmdcIlxuICAgICAgY2xhc3M9XCJzcGlubmVyXCJcbiAgICAgIHN0cm9rZVdpZHRoPVwiNFwiXG4gICAgICBmaWxsPVwiI0VFRUVFRVwiXG4gICAgICBhbmltYXRpb25EdXJhdGlvbj1cIi41c1wiXG4gICAgPjwvcC1wcm9ncmVzc1NwaW5uZXI+XG4gICAgPGRpdiAjY3lHcmFwaCBjbGFzcz1cImdyYXBoV3JhcHBlclwiPjwvZGl2PlxuICBgLFxuICBzdHlsZXM6IFtcbiAgICBgXG4gICAgICAuc3Bpbm5lciB7XG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgbGVmdDogJzM1MHB4JztcbiAgICAgICAgei1pbmRleDogMTA7XG4gICAgICAgIHdpZHRoOiAnMjUwcHgnO1xuICAgICAgICBoZWlnaHQ6ICcyNTBweCc7XG4gICAgICB9XG4gICAgICBAa2V5ZnJhbWVzIHVpLXByb2dyZXNzLXNwaW5uZXItY29sb3Ige1xuICAgICAgICAxMDAlLFxuICAgICAgICAwJSB7XG4gICAgICAgICAgc3Ryb2tlOiAjZDYyZDIwO1xuICAgICAgICB9XG4gICAgICAgIDQwJSB7XG4gICAgICAgICAgc3Ryb2tlOiAjMDA1N2U3O1xuICAgICAgICB9XG4gICAgICAgIDY2JSB7XG4gICAgICAgICAgc3Ryb2tlOiAjMDA4NzQ0O1xuICAgICAgICB9XG4gICAgICAgIDgwJSxcbiAgICAgICAgOTAlIHtcbiAgICAgICAgICBzdHJva2U6ICNmZmE3MDA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC5ncmFwaFdyYXBwZXIge1xuICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgfVxuICAgIGAsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIEN5dG9zY2FwZUdyYXBoQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgQFZpZXdDaGlsZCgnY3lHcmFwaCcpXG4gIGN5R3JhcGg6IEVsZW1lbnRSZWYgfCB1bmRlZmluZWQ7XG5cbiAgQElucHV0KClcbiAgZGVidWcgPSBmYWxzZTtcblxuICBASW5wdXQoKVxuICBub2RlczogTm9kZURlZmluaXRpb25bXSB8IHVuZGVmaW5lZDtcbiAgQElucHV0KClcbiAgZWRnZXM6IEVkZ2VEZWZpbml0aW9uW10gfCB1bmRlZmluZWQ7XG5cbiAgQElucHV0KClcbiAgYXV0b2xvY2s6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpXG4gIGF1dG91bmdyYWJpZnk6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpXG4gIGF1dG91bnNlbGVjdGlmeTogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgQElucHV0KClcbiAgYm94U2VsZWN0aW9uRW5hYmxlZDogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgQElucHV0KClcbiAgZGVza3RvcFRhcFRocmVzaG9sZDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBASW5wdXQoKVxuICBoaWRlRWRnZXNPblZpZXdwb3J0OiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICBASW5wdXQoKVxuICBoaWRlTGFiZWxzT25WaWV3cG9ydDogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgQElucHV0KClcbiAgbGF5b3V0T3B0aW9uczogTGF5b3V0T3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgQElucHV0KClcbiAgbWF4Wm9vbTogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBASW5wdXQoKVxuICBtaW5ab29tOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpXG4gIG1vdGlvbkJsdXI6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpXG4gIG1vdGlvbkJsdXJPcGFjaXR5OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpXG4gIHBhbjogUG9zaXRpb24gfCB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpXG4gIHBhbm5pbmdFbmFibGVkOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICBASW5wdXQoKVxuICBwaXhlbFJhdGlvOiBudW1iZXIgfCAnYXV0bycgfCB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpXG4gIHNlbGVjdGlvblR5cGU6IFNlbGVjdGlvblR5cGUgfCB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpXG4gIHN0eWxlOiBTdHlsZXNoZWV0W10gfCB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpXG4gIHN0eWxlRW5hYmxlZDogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgQElucHV0KClcbiAgdGV4dHVyZU9uVmlld3BvcnQ6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpXG4gIHRvdWNoVGFwVGhyZXNob2xkOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpXG4gIHVzZXJQYW5uaW5nRW5hYmxlZDogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgQElucHV0KClcbiAgdXNlclpvb21pbmdFbmFibGVkOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICBASW5wdXQoKVxuICB3aGVlbFNlbnNpdGl2aXR5OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpXG4gIHpvb206IDEgfCB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpXG4gIHpvb21pbmdFbmFibGVkOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICBASW5wdXQoKVxuICBzaG93VG9vbGJhciA9IHRydWU7XG5cbiAgY3lPcHRpb25zOiBDeXRvc2NhcGVPcHRpb25zIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIGN5ITogY3kuQ29yZTtcbiAgbG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IGFueSB7XG4gICAgY29uc29sZS5sb2coXG4gICAgICAnY3l0b3NjYXBlIGdyYXBoIGNvbXBvbmVudCBuZ09uQ2hhbmdlcy4gY2hhbmdlczonLFxuICAgICAgSlNPTi5zdHJpbmdpZnkoY2hhbmdlcylcbiAgICApO1xuICAgIGlmIChjaGFuZ2VzWydzdHlsZSddKSB7XG4gICAgICBjb25zb2xlLmxvZygnY2hhbmdlc1tcInN0eWxlXCJdOicsIEpTT04uc3RyaW5naWZ5KGNoYW5nZXNbJ3N0eWxlJ10pKTtcbiAgICAgIHRoaXMucnVuV2hpbGVMb2FkaW5nKHRoaXMudXBkYXRlU3R5bGVzLmJpbmQodGhpcykpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXRDeSgpIHtcbiAgICByZXR1cm4gdGhpcy5jeTtcbiAgfVxuXG4gIHB1YmxpYyBjZW50ZXJFbGVtZW50cyhzZWxlY3Rvcikge1xuICAgIGlmICghdGhpcy5jeSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBlbGVtcyA9IHRoaXMuY3kuJChzZWxlY3Rvcik7XG4gICAgdGhpcy5jeS5jZW50ZXIoZWxlbXMpO1xuICB9XG5cbiAgcHVibGljIHpvb21Ub0VsZW1lbnQoc2VsZWN0b3I6IHN0cmluZywgbGV2ZWwgPSAzKSB7XG4gICAgbGV0IHBvc2l0aW9uID0gdGhpcy5jeT8uJChzZWxlY3Rvcik/LnBvc2l0aW9uKCk7XG4gICAgaWYgKCFwb3NpdGlvbikge1xuICAgICAgY29uc29sZS53YXJuKGBDYW5ub3Qgem9vbSB0byAke3NlbGVjdG9yfWApO1xuICAgIH1cbiAgICB0aGlzLmN5Lnpvb20oe1xuICAgICAgbGV2ZWw6IGxldmVsLFxuICAgICAgcG9zaXRpb246IHBvc2l0aW9uLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHJlbmRlcigpIHtcbiAgICB0aGlzLnJ1bldoaWxlTG9hZGluZyh0aGlzLnJlcmVuZGVyLmJpbmQodGhpcykpO1xuICB9XG5cbiAgcHVibGljIHJ1bldoaWxlTG9hZGluZyhmOiBGdW5jdGlvbikge1xuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBmKCk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICB9LCAzMCk7XG4gICAgfSwgMCk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVN0eWxlcygpIHtcbiAgICBpZiAodGhpcy5jeSAmJiB0aGlzLnN0eWxlKSB7XG4gICAgICB0aGlzLmN5LnN0eWxlKHRoaXMuc3R5bGUpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZXJlbmRlcigpIHtcbiAgICAvL1RPRE8gOiB0aGlzIHRha2VzIGEgaGVhdnktaGFuZGVkIGFwcHJvYWNoLCByZWZpbmUgZm9yIHBlcmZvcm1hbmNlXG4gICAgaWYgKCF0aGlzLmN5R3JhcGgpIHtcbiAgICAgIGNvbnNvbGUud2FybihgTm8gY3lHcmFwaCBmb3VuZGApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGN5T3B0aW9ucyA9IHRoaXMuY3lPcHRpb25zIHx8IHtcbiAgICAgIC8vIGlnbm9yZWQsIHVzZSBub2RlcyBhbmQgZWRnZXNcbiAgICAgIC8vIGVsZW1lbnRzOiB0aGlzLmVsZW1lbnRzLFxuICAgICAgYXV0b2xvY2s6IHRoaXMuYXV0b2xvY2ssXG4gICAgICBhdXRvdW5ncmFiaWZ5OiB0aGlzLmF1dG91bmdyYWJpZnksXG4gICAgICBhdXRvdW5zZWxlY3RpZnk6IHRoaXMuYXV0b3Vuc2VsZWN0aWZ5LFxuICAgICAgYm94U2VsZWN0aW9uRW5hYmxlZDogdGhpcy5ib3hTZWxlY3Rpb25FbmFibGVkLFxuICAgICAgY29udGFpbmVyOiB0aGlzLmN5R3JhcGgubmF0aXZlRWxlbWVudCxcbiAgICAgIGRlc2t0b3BUYXBUaHJlc2hvbGQ6IHRoaXMuZGVza3RvcFRhcFRocmVzaG9sZCxcbiAgICAgIGhpZGVFZGdlc09uVmlld3BvcnQ6IHRoaXMuaGlkZUVkZ2VzT25WaWV3cG9ydCxcbiAgICAgIGhpZGVMYWJlbHNPblZpZXdwb3J0OiB0aGlzLmhpZGVMYWJlbHNPblZpZXdwb3J0LFxuICAgICAgbGF5b3V0OiB0aGlzLmxheW91dE9wdGlvbnMsXG4gICAgICBtYXhab29tOiB0aGlzLm1heFpvb20sXG4gICAgICBtaW5ab29tOiB0aGlzLm1pblpvb20sXG4gICAgICBtb3Rpb25CbHVyOiB0aGlzLm1vdGlvbkJsdXIsXG4gICAgICBtb3Rpb25CbHVyT3BhY2l0eTogdGhpcy5tb3Rpb25CbHVyT3BhY2l0eSxcbiAgICAgIHBhbjogdGhpcy5wYW4sXG4gICAgICBwYW5uaW5nRW5hYmxlZDogdGhpcy5wYW5uaW5nRW5hYmxlZCxcbiAgICAgIHBpeGVsUmF0aW86IHRoaXMucGl4ZWxSYXRpbyxcbiAgICAgIHNlbGVjdGlvblR5cGU6IHRoaXMuc2VsZWN0aW9uVHlwZSxcbiAgICAgIHN0eWxlOiB0aGlzLnN0eWxlLFxuICAgICAgc3R5bGVFbmFibGVkOiB0aGlzLnN0eWxlRW5hYmxlZCxcbiAgICAgIHRleHR1cmVPblZpZXdwb3J0OiB0aGlzLnRleHR1cmVPblZpZXdwb3J0LFxuICAgICAgdG91Y2hUYXBUaHJlc2hvbGQ6IHRoaXMudG91Y2hUYXBUaHJlc2hvbGQsXG4gICAgICB1c2VyUGFubmluZ0VuYWJsZWQ6IHRoaXMudXNlclBhbm5pbmdFbmFibGVkLFxuICAgICAgdXNlclpvb21pbmdFbmFibGVkOiB0aGlzLnVzZXJab29taW5nRW5hYmxlZCxcbiAgICAgIHdoZWVsU2Vuc2l0aXZpdHk6IHRoaXMud2hlZWxTZW5zaXRpdml0eSxcbiAgICAgIHpvb21pbmdFbmFibGVkOiB0aGlzLnpvb21pbmdFbmFibGVkLFxuICAgICAgem9vbTogdGhpcy56b29tLFxuICAgIH07XG4gICAgLy8gVE9ETyBkbyByZXNldCgpIGluc3RlYWQ/XG5cbiAgICBpZiAoIXRoaXMuY3kpIHtcbiAgICAgIHRoaXMuY3kgPSBjeXRvc2NhcGUoY3lPcHRpb25zKTtcbiAgICB9XG4gICAgdGhpcy5jeS5zdGFydEJhdGNoKCk7XG4gICAgdGhpcy5jeS5ib3hTZWxlY3Rpb25FbmFibGVkKHRoaXMuYm94U2VsZWN0aW9uRW5hYmxlZCk7XG4gICAgdGhpcy5jeS5ub2RlcygpLnJlbW92ZSgpO1xuICAgIHRoaXMuY3kuZWRnZXMoKS5yZW1vdmUoKTtcbiAgICBpZiAodGhpcy5ub2Rlcykge1xuICAgICAgdGhpcy5jeS5hZGQodGhpcy5ub2Rlcyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmVkZ2VzKSB7XG4gICAgICB0aGlzLmN5LmFkZCh0aGlzLmVkZ2VzKTtcbiAgICB9XG4gICAgdGhpcy5jeS5lbmRCYXRjaCgpO1xuICAgIGlmICh0aGlzLmxheW91dE9wdGlvbnMpIHtcbiAgICAgIHRoaXMuY3kubGF5b3V0KHRoaXMubGF5b3V0T3B0aW9ucykucnVuKCk7XG4gICAgfVxuICB9XG59XG5cbi8qXG5HcmFkaWVudDpcblxuYmFja2dyb3VuZC1ncmFkaWVudC1zdG9wLWNvbG9ycyA6IFRoZSBjb2xvdXJzIG9mIHRoZSBiYWNrZ3JvdW5kIGdyYWRpZW50IHN0b3BzIChlLmcuIGN5YW4gbWFnZW50YSB5ZWxsb3cpLlxuYmFja2dyb3VuZC1ncmFkaWVudC1zdG9wLXBvc2l0aW9ucyA6IFRoZSBwb3NpdGlvbnMgb2YgdGhlIGJhY2tncm91bmQgZ3JhZGllbnQgc3RvcHMgKGUuZy4gMCUgNTAlIDEwMCUpLiBJZiBub3Qgc3BlY2lmaWVkIG9yIGludmFsaWQsIHRoZSBzdG9wcyB3aWxsIGRpdmlkZSBlcXVhbGx5LlxuYmFja2dyb3VuZC1ncmFkaWVudC1kaXJlY3Rpb24gOiBGb3IgYmFja2dyb3VuZC1maWxsOiBsaW5lYXItZ3JhZGllbnQsIHRoaXMgcHJvcGVydHkgZGVmaW5lcyB0aGUgZGlyZWN0aW9uIG9mIHRoZSBiYWNrZ3JvdW5kIGdyYWRpZW50LiBUaGUgZm9sbG93aW5nIHZhbHVlcyBhcmUgYWNjZXB0ZWQ6XG50by1ib3R0b20gKGRlZmF1bHQpXG50by10b3BcbnRvLWxlZnRcbnRvLXJpZ2h0XG50by1ib3R0b20tcmlnaHRcbnRvLWJvdHRvbS1sZWZ0XG50by10b3AtcmlnaHRcbnRvLXRvcC1sZWZ0XG4gKi9cbiJdfQ==