cytoscape-angular
Version:
Angular 12+ components for cytoscape charting.
223 lines (220 loc) • 21.2 kB
JavaScript
var _CytoscapeGraphToolbarComponent__layoutOptions, _CytoscapeGraphToolbarComponent__styles;
import { __classPrivateFieldGet, __classPrivateFieldSet } from "tslib";
import { Component, EventEmitter, Input, Output } from '@angular/core';
import * as i0 from "@angular/core";
import * as i1 from "primeng/overlaypanel";
import * as i2 from "primeng/api";
import * as i3 from "@angular/common";
import * as i4 from "../cytoscape-layout-tool/cytoscape-layout-tool.component";
import * as i5 from "primeng/button";
import * as i6 from "primeng/tooltip";
import * as i7 from "../cytoscape-style-tool/cytoscape-style-tool.component";
function CytoscapeGraphToolbarComponent_ng_template_3_Template(rf, ctx) { if (rf & 1) {
const _r9 = i0.ɵɵgetCurrentView();
i0.ɵɵelementStart(0, "cytoscape-layout-tool", 8);
i0.ɵɵlistener("layoutOptionsChange", function CytoscapeGraphToolbarComponent_ng_template_3_Template_cytoscape_layout_tool_layoutOptionsChange_0_listener($event) { i0.ɵɵrestoreView(_r9); const ctx_r8 = i0.ɵɵnextContext(); return ctx_r8.layoutOptions = $event; });
i0.ɵɵelementEnd();
} if (rf & 2) {
const ctx_r1 = i0.ɵɵnextContext();
i0.ɵɵproperty("layoutOptions", ctx_r1.layoutOptions);
} }
function CytoscapeGraphToolbarComponent_p_button_4_Template(rf, ctx) { if (rf & 1) {
const _r11 = i0.ɵɵgetCurrentView();
i0.ɵɵelementStart(0, "p-button", 9);
i0.ɵɵlistener("click", function CytoscapeGraphToolbarComponent_p_button_4_Template_p_button_click_0_listener($event) { i0.ɵɵrestoreView(_r11); i0.ɵɵnextContext(); const _r0 = i0.ɵɵreference(2); return _r0.toggle($event); });
i0.ɵɵpipe(1, "titlecase");
i0.ɵɵelementEnd();
} if (rf & 2) {
const ctx_r2 = i0.ɵɵnextContext();
i0.ɵɵclassProp("max-button-width", ctx_r2.direction === "column");
i0.ɵɵpropertyInterpolate1("label", "", i0.ɵɵpipeBind1(1, 3, ctx_r2.layoutOptions.name), " Layout");
} }
function CytoscapeGraphToolbarComponent_ng_template_7_Template(rf, ctx) { if (rf & 1) {
const _r13 = i0.ɵɵgetCurrentView();
i0.ɵɵelementStart(0, "cytoscape-style-tool", 10);
i0.ɵɵlistener("stylesChange", function CytoscapeGraphToolbarComponent_ng_template_7_Template_cytoscape_style_tool_stylesChange_0_listener($event) { i0.ɵɵrestoreView(_r13); const ctx_r12 = i0.ɵɵnextContext(); return ctx_r12.styles = $event; })("stylesChange", function CytoscapeGraphToolbarComponent_ng_template_7_Template_cytoscape_style_tool_stylesChange_0_listener($event) { i0.ɵɵrestoreView(_r13); const ctx_r14 = i0.ɵɵnextContext(); return ctx_r14.onStylesChange($event); })("styleSelectorChange", function CytoscapeGraphToolbarComponent_ng_template_7_Template_cytoscape_style_tool_styleSelectorChange_0_listener($event) { i0.ɵɵrestoreView(_r13); const ctx_r15 = i0.ɵɵnextContext(); return ctx_r15.onStyleSelectorChange($event); });
i0.ɵɵelementEnd();
} if (rf & 2) {
const ctx_r4 = i0.ɵɵnextContext();
i0.ɵɵproperty("styles", ctx_r4.styles);
} }
function CytoscapeGraphToolbarComponent_p_button_8_Template(rf, ctx) { if (rf & 1) {
const _r17 = i0.ɵɵgetCurrentView();
i0.ɵɵelementStart(0, "p-button", 11);
i0.ɵɵlistener("click", function CytoscapeGraphToolbarComponent_p_button_8_Template_p_button_click_0_listener($event) { i0.ɵɵrestoreView(_r17); i0.ɵɵnextContext(); const _r3 = i0.ɵɵreference(6); return _r3.toggle($event); });
i0.ɵɵelementEnd();
} if (rf & 2) {
const ctx_r5 = i0.ɵɵnextContext();
i0.ɵɵclassProp("max-button-width", ctx_r5.direction === "column");
} }
function CytoscapeGraphToolbarComponent_span_9_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "span", 12);
i0.ɵɵtext(1);
i0.ɵɵelementEnd();
} if (rf & 2) {
const ctx_r6 = i0.ɵɵnextContext();
i0.ɵɵadvance(1);
i0.ɵɵtextInterpolate1("", ctx_r6.nodes.length, " Nodes \u00A0");
} }
function CytoscapeGraphToolbarComponent_span_10_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "span", 12);
i0.ɵɵtext(1);
i0.ɵɵelementEnd();
} if (rf & 2) {
const ctx_r7 = i0.ɵɵnextContext();
i0.ɵɵadvance(1);
i0.ɵɵtextInterpolate1("", ctx_r7.edges.length, " Edges");
} }
export class CytoscapeGraphToolbarComponent {
constructor() {
this.direction = 'row';
_CytoscapeGraphToolbarComponent__layoutOptions.set(this, void 0);
this.layoutOptionsChange = new EventEmitter();
_CytoscapeGraphToolbarComponent__styles.set(this, void 0);
this.stylesChange = new EventEmitter();
this.styleSelectorChange = new EventEmitter();
}
get layoutOptions() {
return __classPrivateFieldGet(this, _CytoscapeGraphToolbarComponent__layoutOptions, "f");
}
set layoutOptions(value) {
console.log(`Graph toolbar gets new layout options ${JSON.stringify(value)}`);
__classPrivateFieldSet(this, _CytoscapeGraphToolbarComponent__layoutOptions, value, "f");
this.layoutOptionsChange.emit(__classPrivateFieldGet(this, _CytoscapeGraphToolbarComponent__layoutOptions, "f"));
}
get styles() {
return __classPrivateFieldGet(this, _CytoscapeGraphToolbarComponent__styles, "f");
}
set styles(styles) {
__classPrivateFieldSet(this, _CytoscapeGraphToolbarComponent__styles, styles, "f");
this.stylesChange.emit(__classPrivateFieldGet(this, _CytoscapeGraphToolbarComponent__styles, "f"));
}
ngOnInit() {
}
onStyleSelectorChange(selector) {
console.log(`onStyleSelectorChange: selector`);
this.styleSelectorChange.emit(selector);
}
onStylesChange(stylesheet) {
console.log(`onStylesChange`);
this.styles = stylesheet;
}
}
_CytoscapeGraphToolbarComponent__layoutOptions = new WeakMap(), _CytoscapeGraphToolbarComponent__styles = new WeakMap();
CytoscapeGraphToolbarComponent.ɵfac = function CytoscapeGraphToolbarComponent_Factory(t) { return new (t || CytoscapeGraphToolbarComponent)(); };
CytoscapeGraphToolbarComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: CytoscapeGraphToolbarComponent, selectors: [["cytoscape-graph-toolbar"]], inputs: { nodes: "nodes", edges: "edges", direction: "direction", layoutOptions: "layoutOptions", styles: "styles", showLayoutToolbarButton: "showLayoutToolbarButton", showStyleToolbarButton: "showStyleToolbarButton", showToolbarButtons: "showToolbarButtons" }, outputs: { layoutOptionsChange: "layoutOptionsChange", stylesChange: "stylesChange", styleSelectorChange: "styleSelectorChange" }, decls: 11, vars: 12, consts: [[1, "toolbar-container"], [3, "dismissable", "showCloseIcon"], ["layoutToolbaroverlay", ""], ["pTemplate", ""], ["pTooltip", "Layout Settings...", "icon", "pi pi-sliders-v", 3, "label", "max-button-width", "click", 4, "ngIf"], ["styleToolbaroverlay", ""], ["label", "Style", "pTooltip", "Styling...", "icon", "pi pi-palette", 3, "max-button-width", "click", 4, "ngIf"], ["class", "graph-data", 4, "ngIf"], [3, "layoutOptions", "layoutOptionsChange"], ["pTooltip", "Layout Settings...", "icon", "pi pi-sliders-v", 3, "label", "click"], [3, "styles", "stylesChange", "styleSelectorChange"], ["label", "Style", "pTooltip", "Styling...", "icon", "pi pi-palette", 3, "click"], [1, "graph-data"]], template: function CytoscapeGraphToolbarComponent_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "div", 0);
i0.ɵɵelementStart(1, "p-overlayPanel", 1, 2);
i0.ɵɵtemplate(3, CytoscapeGraphToolbarComponent_ng_template_3_Template, 1, 1, "ng-template", 3);
i0.ɵɵelementEnd();
i0.ɵɵtemplate(4, CytoscapeGraphToolbarComponent_p_button_4_Template, 2, 5, "p-button", 4);
i0.ɵɵelementStart(5, "p-overlayPanel", 1, 5);
i0.ɵɵtemplate(7, CytoscapeGraphToolbarComponent_ng_template_7_Template, 1, 1, "ng-template", 3);
i0.ɵɵelementEnd();
i0.ɵɵtemplate(8, CytoscapeGraphToolbarComponent_p_button_8_Template, 1, 2, "p-button", 6);
i0.ɵɵtemplate(9, CytoscapeGraphToolbarComponent_span_9_Template, 2, 1, "span", 7);
i0.ɵɵtemplate(10, CytoscapeGraphToolbarComponent_span_10_Template, 2, 1, "span", 7);
i0.ɵɵelementEnd();
} if (rf & 2) {
i0.ɵɵclassProp("row-layout", ctx.direction === "row")("column-layout", ctx.direction === "column");
i0.ɵɵadvance(1);
i0.ɵɵproperty("dismissable", true)("showCloseIcon", true);
i0.ɵɵadvance(3);
i0.ɵɵproperty("ngIf", ctx.showToolbarButtons);
i0.ɵɵadvance(1);
i0.ɵɵproperty("dismissable", true)("showCloseIcon", true);
i0.ɵɵadvance(3);
i0.ɵɵproperty("ngIf", ctx.showToolbarButtons);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", ctx.nodes);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", ctx.edges);
} }, directives: [i1.OverlayPanel, i2.PrimeTemplate, i3.NgIf, i4.CytoscapeLayoutToolComponent, i5.Button, i6.Tooltip, i7.CytoscapeStyleToolComponent], pipes: [i3.TitleCasePipe], styles: [".toolbar-container[_ngcontent-%COMP%] {\n display: flex;\n }\n\n .row-layout[_ngcontent-%COMP%] {\n flex-direction: row;\n align-items: center;\n padding-bottom: 4px;\n }\n\n .column-layout[_ngcontent-%COMP%] {\n flex-direction: column;\n align-items: stretch;\n justify-content: flex-start;\n padding-left: 4px;\n }\n\n p-button[_ngcontent-%COMP%] {\n padding-bottom: 4px;\n padding-right: 4px;\n }"] });
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(CytoscapeGraphToolbarComponent, [{
type: Component,
args: [{
// tslint:disable-next-line:component-selector
selector: 'cytoscape-graph-toolbar',
template: `
<div class="toolbar-container"
[class.row-layout]="direction === 'row'"
[class.column-layout]="direction === 'column'">
<p-overlayPanel #layoutToolbaroverlay
[dismissable]="true" [showCloseIcon]="true"
>
<ng-template pTemplate>
<cytoscape-layout-tool [(layoutOptions)]="layoutOptions"></cytoscape-layout-tool>
</ng-template>
</p-overlayPanel>
<p-button *ngIf="showToolbarButtons"
label="{{layoutOptions.name | titlecase }} Layout"
[class.max-button-width]="direction === 'column'"
pTooltip="Layout Settings..."
icon="pi pi-sliders-v"
(click)="layoutToolbaroverlay.toggle($event)"></p-button>
<p-overlayPanel #styleToolbaroverlay [dismissable]="true" [showCloseIcon]="true">
<ng-template pTemplate>
<cytoscape-style-tool
[(styles)]="styles"
(stylesChange)="onStylesChange($event)"
(styleSelectorChange)="onStyleSelectorChange($event)"></cytoscape-style-tool>
</ng-template>
</p-overlayPanel>
<p-button *ngIf="showToolbarButtons"
[class.max-button-width]="direction === 'column'"
label="Style"
pTooltip="Styling..."
icon="pi pi-palette"
(click)="styleToolbaroverlay.toggle($event)">
</p-button>
<span class="graph-data" *ngIf="nodes">{{nodes.length}} Nodes </span>
<span class="graph-data" *ngIf="edges">{{edges.length}} Edges</span>
</div>
`,
styles: [
`
.toolbar-container {
display: flex;
}
.row-layout {
flex-direction: row;
align-items: center;
padding-bottom: 4px;
}
.column-layout {
flex-direction: column;
align-items: stretch;
justify-content: flex-start;
padding-left: 4px;
}
p-button {
padding-bottom: 4px;
padding-right: 4px;
}
`
],
}]
}], function () { return []; }, { nodes: [{
type: Input
}], edges: [{
type: Input
}], direction: [{
type: Input
}], layoutOptions: [{
type: Input
}], layoutOptionsChange: [{
type: Output
}], styles: [{
type: Input
}], stylesChange: [{
type: Output
}], styleSelectorChange: [{
type: Output
}], showLayoutToolbarButton: [{
type: Input
}], showStyleToolbarButton: [{
type: Input
}], showToolbarButtons: [{
type: Input
}] }); })();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3l0b3NjYXBlLWdyYXBoLXRvb2xiYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY3l0b3NjYXBlLWFuZ3VsYXIvc3JjL2xpYi9jeXRvc2NhcGUtZ3JhcGgtdG9vbGJhci9jeXRvc2NhcGUtZ3JhcGgtdG9vbGJhci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFBOzs7Ozs7Ozs7OztJQWFwRSxnREFBeUQ7SUFBbEMscVFBQWlDO0lBQUMsaUJBQXdCOzs7SUFBMUQsb0RBQWlDOzs7O0lBRzVELG1DQUt3RDtJQUE5Qyx5TUFBUyxrQkFBbUMsSUFBQzs7SUFBQyxpQkFBVzs7O0lBSHpELGlFQUFpRDtJQURqRCxrR0FBa0Q7Ozs7SUFPeEQsZ0RBR3dEO0lBRnRELGtQQUFtQiw0T0FBQSxpUUFBQTtJQUVtQyxpQkFBdUI7OztJQUY3RSxzQ0FBbUI7Ozs7SUFLekIsb0NBS3VEO0lBQTdDLHlNQUFTLGtCQUFrQyxJQUFDO0lBQ3RELGlCQUFXOzs7SUFMRCxpRUFBaUQ7OztJQU0zRCxnQ0FBdUM7SUFBQSxZQUE2QjtJQUFBLGlCQUFPOzs7SUFBcEMsZUFBNkI7SUFBN0IsK0RBQTZCOzs7SUFDcEUsZ0NBQXVDO0lBQUEsWUFBc0I7SUFBQSxpQkFBTzs7O0lBQTdCLGVBQXNCO0lBQXRCLHdEQUFzQjs7QUE2Qm5FLE1BQU0sT0FBTyw4QkFBOEI7SUF3Q3pDO1FBbENBLGNBQVMsR0FBcUIsS0FBSyxDQUFBO1FBRW5DLGlFQUE4QjtRQVVwQix3QkFBbUIsR0FBZ0MsSUFBSSxZQUFZLEVBQWlCLENBQUE7UUFFOUYsMERBQXNCO1FBU1osaUJBQVksR0FBK0IsSUFBSSxZQUFZLEVBQWdCLENBQUE7UUFFM0Usd0JBQW1CLEdBQXlCLElBQUksWUFBWSxFQUFVLENBQUE7SUFVaEYsQ0FBQztJQWhDRCxJQUNJLGFBQWE7UUFDZixPQUFPLHVCQUFBLElBQUksc0RBQWdCLENBQUE7SUFDN0IsQ0FBQztJQUNELElBQUksYUFBYSxDQUFDLEtBQUs7UUFDckIsT0FBTyxDQUFDLEdBQUcsQ0FBQyx5Q0FBeUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDN0UsdUJBQUEsSUFBSSxrREFBbUIsS0FBSyxNQUFBLENBQUE7UUFDNUIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyx1QkFBQSxJQUFJLHNEQUFnQixDQUFDLENBQUE7SUFDckQsQ0FBQztJQUlELElBQ0ksTUFBTTtRQUNSLE9BQU8sdUJBQUEsSUFBSSwrQ0FBUyxDQUFBO0lBQ3RCLENBQUM7SUFDRCxJQUFJLE1BQU0sQ0FBQyxNQUFvQjtRQUM3Qix1QkFBQSxJQUFJLDJDQUFZLE1BQU0sTUFBQSxDQUFBO1FBQ3RCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLHVCQUFBLElBQUksK0NBQVMsQ0FBQyxDQUFBO0lBQ3ZDLENBQUM7SUFlRCxRQUFRO0lBQ1IsQ0FBQztJQUVELHFCQUFxQixDQUFDLFFBQWdCO1FBQ3BDLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUNBQWlDLENBQUMsQ0FBQTtRQUM5QyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQ3pDLENBQUM7SUFFRCxjQUFjLENBQUMsVUFBdUM7UUFDcEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO1FBQzdCLElBQUksQ0FBQyxNQUFNLEdBQUcsVUFBVSxDQUFBO0lBQzFCLENBQUM7Ozs0R0F0RFUsOEJBQThCO2lGQUE5Qiw4QkFBOEI7UUE3RHZDLDhCQUVvRDtRQUNsRCw0Q0FFQztRQUNDLCtGQUVjO1FBQ2hCLGlCQUFpQjtRQUNqQix5RkFLbUU7UUFDbkUsNENBQWlGO1FBQy9FLCtGQUtjO1FBQ2hCLGlCQUFpQjtRQUNqQix5RkFNVztRQUNYLGlGQUEyRTtRQUMzRSxtRkFBb0U7UUFDdEUsaUJBQU07O1FBaENELHFEQUF3Qyw2Q0FBQTtRQUczQixlQUFvQjtRQUFwQixrQ0FBb0IsdUJBQUE7UUFNekIsZUFBd0I7UUFBeEIsNkNBQXdCO1FBTUUsZUFBb0I7UUFBcEIsa0NBQW9CLHVCQUFBO1FBUTlDLGVBQXdCO1FBQXhCLDZDQUF3QjtRQU9ULGVBQVc7UUFBWCxnQ0FBVztRQUNYLGVBQVc7UUFBWCxnQ0FBVzs7dUZBNkI5Qiw4QkFBOEI7Y0FqRTFDLFNBQVM7ZUFBQztnQkFDVCw4Q0FBOEM7Z0JBQzlDLFFBQVEsRUFBRSx5QkFBeUI7Z0JBQ25DLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQ1Q7Z0JBQ0QsTUFBTSxFQUFFO29CQUNMOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0tBc0JBO2lCQUNGO2FBQ0Y7c0NBR0MsS0FBSztrQkFESixLQUFLO1lBR04sS0FBSztrQkFESixLQUFLO1lBR04sU0FBUztrQkFEUixLQUFLO1lBS0YsYUFBYTtrQkFEaEIsS0FBSztZQVNJLG1CQUFtQjtrQkFBNUIsTUFBTTtZQUlILE1BQU07a0JBRFQsS0FBSztZQVFJLFlBQVk7a0JBQXJCLE1BQU07WUFFRyxtQkFBbUI7a0JBQTVCLE1BQU07WUFHUCx1QkFBdUI7a0JBRHRCLEtBQUs7WUFHTixzQkFBc0I7a0JBRHJCLEtBQUs7WUFHTixrQkFBa0I7a0JBRGpCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcbmltcG9ydCB7IEVkZ2VEZWZpbml0aW9uLCBMYXlvdXRPcHRpb25zLCBOb2RlRGVmaW5pdGlvbiwgU3R5bGVzaGVldCB9IGZyb20gJ2N5dG9zY2FwZSdcbkBDb21wb25lbnQoe1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6Y29tcG9uZW50LXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnY3l0b3NjYXBlLWdyYXBoLXRvb2xiYXInLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgY2xhc3M9XCJ0b29sYmFyLWNvbnRhaW5lclwiXG4gICAgICAgICBbY2xhc3Mucm93LWxheW91dF09XCJkaXJlY3Rpb24gPT09ICdyb3cnXCJcbiAgICAgICAgIFtjbGFzcy5jb2x1bW4tbGF5b3V0XT1cImRpcmVjdGlvbiA9PT0gJ2NvbHVtbidcIj5cbiAgICAgIDxwLW92ZXJsYXlQYW5lbCAjbGF5b3V0VG9vbGJhcm92ZXJsYXlcbiAgICAgICAgICAgICAgICAgICAgICBbZGlzbWlzc2FibGVdPVwidHJ1ZVwiIFtzaG93Q2xvc2VJY29uXT1cInRydWVcIlxuICAgICAgPlxuICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPlxuICAgICAgICAgIDxjeXRvc2NhcGUtbGF5b3V0LXRvb2wgWyhsYXlvdXRPcHRpb25zKV09XCJsYXlvdXRPcHRpb25zXCI+PC9jeXRvc2NhcGUtbGF5b3V0LXRvb2w+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8L3Atb3ZlcmxheVBhbmVsPlxuICAgICAgPHAtYnV0dG9uICpuZ0lmPVwic2hvd1Rvb2xiYXJCdXR0b25zXCJcbiAgICAgICAgICAgICAgICBsYWJlbD1cInt7bGF5b3V0T3B0aW9ucy5uYW1lIHwgdGl0bGVjYXNlIH19IExheW91dFwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLm1heC1idXR0b24td2lkdGhdPVwiZGlyZWN0aW9uID09PSAnY29sdW1uJ1wiXG4gICAgICAgICAgICAgICAgcFRvb2x0aXA9XCJMYXlvdXQgU2V0dGluZ3MuLi5cIlxuICAgICAgICAgICAgICAgIGljb249XCJwaSBwaS1zbGlkZXJzLXZcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJsYXlvdXRUb29sYmFyb3ZlcmxheS50b2dnbGUoJGV2ZW50KVwiPjwvcC1idXR0b24+XG4gICAgICA8cC1vdmVybGF5UGFuZWwgI3N0eWxlVG9vbGJhcm92ZXJsYXkgW2Rpc21pc3NhYmxlXT1cInRydWVcIiBbc2hvd0Nsb3NlSWNvbl09XCJ0cnVlXCI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU+XG4gICAgICAgICAgPGN5dG9zY2FwZS1zdHlsZS10b29sXG4gICAgICAgICAgICBbKHN0eWxlcyldPVwic3R5bGVzXCJcbiAgICAgICAgICAgIChzdHlsZXNDaGFuZ2UpPVwib25TdHlsZXNDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAoc3R5bGVTZWxlY3RvckNoYW5nZSk9XCJvblN0eWxlU2VsZWN0b3JDaGFuZ2UoJGV2ZW50KVwiPjwvY3l0b3NjYXBlLXN0eWxlLXRvb2w+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8L3Atb3ZlcmxheVBhbmVsPlxuICAgICAgPHAtYnV0dG9uICpuZ0lmPVwic2hvd1Rvb2xiYXJCdXR0b25zXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MubWF4LWJ1dHRvbi13aWR0aF09XCJkaXJlY3Rpb24gPT09ICdjb2x1bW4nXCJcbiAgICAgICAgICAgICAgICBsYWJlbD1cIlN0eWxlXCJcbiAgICAgICAgICAgICAgICBwVG9vbHRpcD1cIlN0eWxpbmcuLi5cIlxuICAgICAgICAgICAgICAgIGljb249XCJwaSBwaS1wYWxldHRlXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwic3R5bGVUb29sYmFyb3ZlcmxheS50b2dnbGUoJGV2ZW50KVwiPlxuICAgICAgPC9wLWJ1dHRvbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiZ3JhcGgtZGF0YVwiICpuZ0lmPVwibm9kZXNcIj57e25vZGVzLmxlbmd0aH19IE5vZGVzICZuYnNwOzwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiZ3JhcGgtZGF0YVwiICpuZ0lmPVwiZWRnZXNcIj57e2VkZ2VzLmxlbmd0aH19IEVkZ2VzPC9zcGFuPlxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZXM6IFtcbiAgICAgYFxuICAgICAgLnRvb2xiYXItY29udGFpbmVyIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIH1cblxuICAgICAgLnJvdy1sYXlvdXQge1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICBwYWRkaW5nLWJvdHRvbTogNHB4O1xuICAgICAgfVxuXG4gICAgICAuY29sdW1uLWxheW91dCB7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIGFsaWduLWl0ZW1zOiBzdHJldGNoO1xuICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7XG4gICAgICAgIHBhZGRpbmctbGVmdDogNHB4O1xuICAgICAgfVxuXG4gICAgICBwLWJ1dHRvbiB7XG4gICAgICAgIHBhZGRpbmctYm90dG9tOiA0cHg7XG4gICAgICAgIHBhZGRpbmctcmlnaHQ6IDRweDtcbiAgICAgIH1cbiAgICBgXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIEN5dG9zY2FwZUdyYXBoVG9vbGJhckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBJbnB1dCgpXG4gIG5vZGVzOiBOb2RlRGVmaW5pdGlvbltdXG4gIEBJbnB1dCgpXG4gIGVkZ2VzOiBFZGdlRGVmaW5pdGlvbltdXG4gIEBJbnB1dCgpXG4gIGRpcmVjdGlvbjogJ2NvbHVtbicgfCAncm93JyA9ICdyb3cnXG5cbiAgI19sYXlvdXRPcHRpb25zOiBMYXlvdXRPcHRpb25zXG4gIEBJbnB1dCgpXG4gIGdldCBsYXlvdXRPcHRpb25zKCk6IExheW91dE9wdGlvbnMge1xuICAgIHJldHVybiB0aGlzLiNfbGF5b3V0T3B0aW9uc1xuICB9XG4gIHNldCBsYXlvdXRPcHRpb25zKHZhbHVlKSB7XG4gICAgY29uc29sZS5sb2coYEdyYXBoIHRvb2xiYXIgZ2V0cyBuZXcgbGF5b3V0IG9wdGlvbnMgJHtKU09OLnN0cmluZ2lmeSh2YWx1ZSl9YClcbiAgICB0aGlzLiNfbGF5b3V0T3B0aW9ucyA9IHZhbHVlXG4gICAgdGhpcy5sYXlvdXRPcHRpb25zQ2hhbmdlLmVtaXQodGhpcy4jX2xheW91dE9wdGlvbnMpXG4gIH1cbiAgQE91dHB1dCgpIGxheW91dE9wdGlvbnNDaGFuZ2U6IEV2ZW50RW1pdHRlcjxMYXlvdXRPcHRpb25zPiA9IG5ldyBFdmVudEVtaXR0ZXI8TGF5b3V0T3B0aW9ucz4oKVxuXG4gICNfc3R5bGVzOiBTdHlsZXNoZWV0W11cbiAgQElucHV0KClcbiAgZ2V0IHN0eWxlcygpOiBTdHlsZXNoZWV0W10ge1xuICAgIHJldHVybiB0aGlzLiNfc3R5bGVzXG4gIH1cbiAgc2V0IHN0eWxlcyhzdHlsZXM6IFN0eWxlc2hlZXRbXSkge1xuICAgIHRoaXMuI19zdHlsZXMgPSBzdHlsZXNcbiAgICB0aGlzLnN0eWxlc0NoYW5nZS5lbWl0KHRoaXMuI19zdHlsZXMpXG4gIH1cbiAgQE91dHB1dCgpIHN0eWxlc0NoYW5nZTogRXZlbnRFbWl0dGVyPFN0eWxlc2hlZXRbXT4gPSBuZXcgRXZlbnRFbWl0dGVyPFN0eWxlc2hlZXRbXT4oKVxuXG4gIEBPdXRwdXQoKSBzdHlsZVNlbGVjdG9yQ2hhbmdlOiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpXG5cbiAgQElucHV0KClcbiAgc2hvd0xheW91dFRvb2xiYXJCdXR0b246IGJvb2xlYW5cbiAgQElucHV0KClcbiAgc2hvd1N0eWxlVG9vbGJhckJ1dHRvbjogYm9vbGVhblxuICBASW5wdXQoKVxuICBzaG93VG9vbGJhckJ1dHRvbnM6IGJvb2xlYW5cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICB9XG5cbiAgb25TdHlsZVNlbGVjdG9yQ2hhbmdlKHNlbGVjdG9yOiBzdHJpbmcpIHtcbiAgICBjb25zb2xlLmxvZyhgb25TdHlsZVNlbGVjdG9yQ2hhbmdlOiBzZWxlY3RvcmApXG4gICAgdGhpcy5zdHlsZVNlbGVjdG9yQ2hhbmdlLmVtaXQoc2VsZWN0b3IpXG4gIH1cblxuICBvblN0eWxlc0NoYW5nZShzdHlsZXNoZWV0OiBjeXRvc2NhcGUuU3R5bGVzaGVldFN0eWxlW10pIHtcbiAgICBjb25zb2xlLmxvZyhgb25TdHlsZXNDaGFuZ2VgKVxuICAgIHRoaXMuc3R5bGVzID0gc3R5bGVzaGVldFxuICB9XG59XG4iXX0=