stimulsoft-forms
Version:
Stimulsoft PDF Forms
164 lines • 24.8 kB
JavaScript
import { Component, ViewChild } from "@angular/core";
import ResizeObserver from "resize-observer-polyfill";
import StiRectangleGeometryLayout from "../computed/StiRectangleGeometryLayout";
import * as i0 from "@angular/core";
import * as i1 from "../services/model.service";
import * as i2 from "../components/sti-components-holder.component";
export class StiCloneElementContainerComponent {
constructor(model, zone, render) {
this.model = model;
this.zone = zone;
this.render = render;
this.isClone = true;
model.formEvents.subscribe((e) => {
if (e.name == "ElementToUpdateChanged" || e.name == "SelectedComponentChanged") {
this.updateObservable();
}
});
}
ngOnInit() { }
ngAfterViewInit() {
this.observer = new ResizeObserver((entries) => {
for (let entry of entries) {
const cr = entry.contentRect;
let element;
if (this.model.draggingElement && this.model.draggingElement != this.lastUpdatedElement) {
element = this.model.draggingElement;
}
else if (this.model.elementToUpdate != null) {
element = this.model.elementToUpdate;
}
else {
this.model.form?.pages.forEach((page) => {
page.allElements.forEach((component) => {
if (component === this.element) {
element = component;
}
});
});
}
this.zone.run(() => {
this.updateElement(element, cr);
});
}
});
this.observer?.observe(this.clone?.nativeElement);
}
updateElement(component, cr) {
if (!component || component.type == "TextElement") {
return;
}
if (this.model.draggingElement && this.model.draggingElement == this.lastUpdatedElement) {
return;
}
if (this.lastUpdatedElement != component) {
this.lastUpdatedElement = component;
}
if (this.model.elementToUpdate == null) {
let bottomElements = [];
let freeAreaHeight;
let currentPage = this.model.getElementPage(this.model.selectedComponent?.element);
let currentPanel = this.model.getElementPanel(this.model.selectedComponent?.element);
currentPage?.elements?.forEach((elem) => {
if (elem.y >= this.model.selectedComponent.element.geometry.bottom) {
bottomElements.push(elem);
}
});
if (bottomElements.length > 0) {
let maxBottomPoint = Math.max(...bottomElements.map((elem) => elem.geometry.bottom));
freeAreaHeight = (currentPage?.contentAreaHeight || currentPanel?.height) - maxBottomPoint;
}
else {
freeAreaHeight =
(currentPage?.contentAreaHeight || currentPanel?.height) -
this.model.selectedComponent?.element.geometry.bottom;
}
}
let parentContainer = component.getParent(this.model.form) ?? this.model.form.pages[0];
let sizeChanged = false;
let minHeight = Number(((Math.round(cr.height) / this.currentVerticalStep) % 1).toFixed(2)) <= 0.5 &&
Math.round(cr.height) != parentContainer["contentAreaHeight"]
? Math.floor(cr.height / this.currentVerticalStep) * this.currentVerticalStep
: Math.ceil(cr.height / this.currentVerticalStep) * this.currentVerticalStep;
if (component.geometry.minHeight != minHeight &&
minHeight <= parentContainer["contentAreaHeight"] &&
minHeight != 0 &&
Math.abs(component.geometry.minHeight - minHeight) > 1) {
component.geometry.minHeight = minHeight;
sizeChanged = true;
}
else if (minHeight >= parentContainer["contentAreaHeight"] - component.geometry.y) {
component.geometry.minHeight = parentContainer["contentAreaHeight"] - component.geometry.y;
sizeChanged = true;
}
if (parentContainer) {
let columnWidth = parentContainer.getColumnWidth(this.model.form.settings.gridColumns);
let minWidth = Math.max(Math.min(Math.ceil(Number(cr.width.toFixed(2)) / columnWidth) * columnWidth, this.maxWidth), columnWidth);
if (minWidth != component.geometry.minWidth) {
component.geometry.minWidth = minWidth;
sizeChanged = true;
}
if (sizeChanged && this.model.draggingElement != component) {
this.render.insertElement(component);
this.render.checkOutputs(this.model.getElementPage(component));
}
}
else {
component.geometry.minWidth = Math.max(cr.width, 2);
}
this.model.elementToUpdate = null;
}
updateObservable() {
this.observer?.unobserve(this.clone?.nativeElement);
this.observer?.observe(this.clone?.nativeElement);
}
ngOnDestroy() {
this.observer?.unobserve(this.clone?.nativeElement);
}
get element() {
return this.model.draggingElement
? this.model.draggingElement
: this.model.elementToUpdate ?? this.model.selectedComponent?.element;
}
get maxWidth() {
return this.model?.draggingElement
? this.model?.form?.pages[0].contentAreaWidth - this.element?.x
: this.element?.getParent(this.model.form)?.contentAreaWidth - this.element?.x;
}
get currentVerticalStep() {
return this.model.form?.settings?.gridVerticalStep != 1 ? this.model.form?.settings?.gridVerticalStep : 5;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: StiCloneElementContainerComponent, deps: [{ token: i1.StiModelService }, { token: i0.NgZone }, { token: StiRectangleGeometryLayout }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: StiCloneElementContainerComponent, selector: "sti-clone-element-container", viewQueries: [{ propertyName: "clone", first: true, predicate: ["clone"], descendants: true }], ngImport: i0, template: `
<div
#clone
style="position: absolute; top:-9999px; left:-9999px; z-index: -1; opacity:0;white-space:nowrap; userSelect:none;"
[style.width]="'min-content'"
[style.height]="'auto'"
[style.max-width.px]="maxWidth"
>
<sti-component-holder [element]="element" [isClone]="this.isClone"></sti-component-holder>
</div>
`, isInline: true, dependencies: [{ kind: "component", type: i2.StiComponentHolderComponent, selector: "sti-component-holder", inputs: ["element", "isClone"] }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: StiCloneElementContainerComponent, decorators: [{
type: Component,
args: [{
selector: "sti-clone-element-container",
template: `
<div
#clone
style="position: absolute; top:-9999px; left:-9999px; z-index: -1; opacity:0;white-space:nowrap; userSelect:none;"
[style.width]="'min-content'"
[style.height]="'auto'"
[style.max-width.px]="maxWidth"
>
<sti-component-holder [element]="element" [isClone]="this.isClone"></sti-component-holder>
</div>
`,
}]
}], ctorParameters: () => [{ type: i1.StiModelService }, { type: i0.NgZone }, { type: StiRectangleGeometryLayout }], propDecorators: { clone: [{
type: ViewChild,
args: ["clone"]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RpLWNsb25lLWVsZW1lbnQtY29udGFpbmVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0aW11bHNvZnQtZm9ybXMvc3JjL2xpYi90b29sYm94L3N0aS1jbG9uZS1lbGVtZW50LWNvbnRhaW5lci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQixTQUFTLEVBQXlDLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzRyxPQUFPLGNBQWMsTUFBTSwwQkFBMEIsQ0FBQztBQUN0RCxPQUFPLDBCQUEwQixNQUFNLHdDQUF3QyxDQUFDOzs7O0FBa0JoRixNQUFNLE9BQU8saUNBQWlDO0lBTTVDLFlBQW1CLEtBQXNCLEVBQVUsSUFBWSxFQUFTLE1BQWtDO1FBQXZGLFVBQUssR0FBTCxLQUFLLENBQWlCO1FBQVUsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUFTLFdBQU0sR0FBTixNQUFNLENBQTRCO1FBTG5HLFlBQU8sR0FBWSxJQUFJLENBQUM7UUFNN0IsS0FBSyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUMvQixJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksd0JBQXdCLElBQUksQ0FBQyxDQUFDLElBQUksSUFBSSwwQkFBMEIsRUFBRSxDQUFDO2dCQUMvRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUMxQixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsUUFBUSxLQUFJLENBQUM7SUFFYixlQUFlO1FBQ2IsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLGNBQWMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQzdDLEtBQUssSUFBSSxLQUFLLElBQUksT0FBTyxFQUFFLENBQUM7Z0JBQzFCLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUM7Z0JBQzdCLElBQUks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T0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLGVBQWU7WUFDaEMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDL0QsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDbkYsQ0FBQztJQUVELElBQUksbUJBQW1CO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUcsQ0FBQzsrR0EzSVUsaUNBQWlDLHVFQWxCdkMsMEJBQTBCO21HQWtCcEIsaUNBQWlDLG1LQVpsQzs7Ozs7Ozs7OztHQVVUOzs0RkFFVSxpQ0FBaUM7a0JBZDdDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLDZCQUE2QjtvQkFDdkMsUUFBUSxFQUFFOzs7Ozs7Ozs7O0dBVVQ7aUJBQ0Y7OEZBakJNLDBCQUEwQix1QkFzQlgsS0FBSztzQkFBeEIsU0FBUzt1QkFBQyxPQUFPIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBOZ1pvbmUsIE9uRGVzdHJveSwgT25Jbml0LCBWaWV3Q2hpbGQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgUmVzaXplT2JzZXJ2ZXIgZnJvbSBcInJlc2l6ZS1vYnNlcnZlci1wb2x5ZmlsbFwiO1xyXG5pbXBvcnQgU3RpUmVjdGFuZ2xlR2VvbWV0cnlMYXlvdXQgZnJvbSBcIi4uL2NvbXB1dGVkL1N0aVJlY3RhbmdsZUdlb21ldHJ5TGF5b3V0XCI7XHJcbmltcG9ydCB7IFN0aUZvcm1FbGVtZW50IH0gZnJvbSBcIi4uL2VsZW1lbnRzL2Jhc2UvU3RpRm9ybUVsZW1lbnRcIjtcclxuaW1wb3J0IHsgU3RpTW9kZWxTZXJ2aWNlIH0gZnJvbSBcIi4uL3NlcnZpY2VzL21vZGVsLnNlcnZpY2VcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiBcInN0aS1jbG9uZS1lbGVtZW50LWNvbnRhaW5lclwiLFxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICA8ZGl2XHJcbiAgICAgICNjbG9uZVxyXG4gICAgICBzdHlsZT1cInBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOi05OTk5cHg7IGxlZnQ6LTk5OTlweDsgei1pbmRleDogLTE7IG9wYWNpdHk6MDt3aGl0ZS1zcGFjZTpub3dyYXA7IHVzZXJTZWxlY3Q6bm9uZTtcIlxyXG4gICAgICBbc3R5bGUud2lkdGhdPVwiJ21pbi1jb250ZW50J1wiXHJcbiAgICAgIFtzdHlsZS5oZWlnaHRdPVwiJ2F1dG8nXCJcclxuICAgICAgW3N0eWxlLm1heC13aWR0aC5weF09XCJtYXhXaWR0aFwiXHJcbiAgICA+XHJcbiAgICAgIDxzdGktY29tcG9uZW50LWhvbGRlciBbZWxlbWVudF09XCJlbGVtZW50XCIgW2lzQ2xvbmVdPVwidGhpcy5pc0Nsb25lXCI+PC9zdGktY29tcG9uZW50LWhvbGRlcj5cclxuICAgIDwvZGl2PlxyXG4gIGAsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTdGlDbG9uZUVsZW1lbnRDb250YWluZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XHJcbiAgcHVibGljIGlzQ2xvbmU6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIHB1YmxpYyBvYnNlcnZlcjtcclxuICBwdWJsaWMgbGFzdFVwZGF0ZWRFbGVtZW50OiBhbnk7XHJcbiAgQFZpZXdDaGlsZChcImNsb25lXCIpIGNsb25lOiBFbGVtZW50UmVmO1xyXG5cclxuICBjb25zdHJ1Y3RvcihwdWJsaWMgbW9kZWw6IFN0aU1vZGVsU2VydmljZSwgcHJpdmF0ZSB6b25lOiBOZ1pvbmUsIHB1YmxpYyByZW5kZXI6IFN0aVJlY3RhbmdsZUdlb21ldHJ5TGF5b3V0KSB7XHJcbiAgICBtb2RlbC5mb3JtRXZlbnRzLnN1YnNjcmliZSgoZSkgPT4ge1xyXG4gICAgICBpZiAoZS5uYW1lID09IFwiRWxlbWVudFRvVXBkYXRlQ2hhbmdlZFwiIHx8IGUubmFtZSA9PSBcIlNlbGVjdGVkQ29tcG9uZW50Q2hhbmdlZFwiKSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVPYnNlcnZhYmxlKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7fVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLm9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKChlbnRyaWVzKSA9PiB7XHJcbiAgICAgIGZvciAobGV0IGVudHJ5IG9mIGVudHJpZXMpIHtcclxuICAgICAgICBjb25zdCBjciA9IGVudHJ5LmNvbnRlbnRSZWN0O1xyXG4gICAgICAgIGxldCBlbGVtZW50O1xyXG4gICAgICAgIGlmICh0aGlzLm1vZGVsLmRyYWdnaW5nRWxlbWVudCAmJiB0aGlzLm1vZGVsLmRyYWdnaW5nRWxlbWVudCAhPSB0aGlzLmxhc3RVcGRhdGVkRWxlbWVudCkge1xyXG4gICAgICAgICAgZWxlbWVudCA9IHRoaXMubW9kZWwuZHJhZ2dpbmdFbGVtZW50O1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5tb2RlbC5lbGVtZW50VG9VcGRhdGUgIT0gbnVsbCkge1xyXG4gICAgICAgICAgZWxlbWVudCA9IHRoaXMubW9kZWwuZWxlbWVudFRvVXBkYXRlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLm1vZGVsLmZvcm0/LnBhZ2VzLmZvckVhY2goKHBhZ2UpID0+IHtcclxuICAgICAgICAgICAgcGFnZS5hbGxFbGVtZW50cy5mb3JFYWNoKChjb21wb25lbnQpID0+IHtcclxuICAgICAgICAgICAgICBpZiAoY29tcG9uZW50ID09PSB0aGlzLmVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBjb21wb25lbnQ7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnVwZGF0ZUVsZW1lbnQoZWxlbWVudCwgY3IpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMub2JzZXJ2ZXI/Lm9ic2VydmUodGhpcy5jbG9uZT8ubmF0aXZlRWxlbWVudCk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVFbGVtZW50KGNvbXBvbmVudDogU3RpRm9ybUVsZW1lbnQsIGNyOiBhbnkpIHtcclxuICAgIGlmICghY29tcG9uZW50IHx8IGNvbXBvbmVudC50eXBlID09IFwiVGV4dEVsZW1lbnRcIikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5tb2RlbC5kcmFnZ2luZ0VsZW1lbnQgJiYgdGhpcy5tb2RlbC5kcmFnZ2luZ0VsZW1lbnQgPT0gdGhpcy5sYXN0VXBkYXRlZEVsZW1lbnQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMubGFzdFVwZGF0ZWRFbGVtZW50ICE9IGNvbXBvbmVudCkge1xyXG4gICAgICB0aGlzLmxhc3RVcGRhdGVkRWxlbWVudCA9IGNvbXBvbmVudDtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLm1vZGVsLmVsZW1lbnRUb1VwZGF0ZSA9PSBudWxsKSB7XHJcbiAgICAgIGxldCBib3R0b21FbGVtZW50cyA9IFtdO1xyXG4gICAgICBsZXQgZnJlZUFyZWFIZWlnaHQ7XHJcbiAgICAgIGxldCBjdXJyZW50UGFnZSA9IHRoaXMubW9kZWwuZ2V0RWxlbWVudFBhZ2UodGhpcy5tb2RlbC5zZWxlY3RlZENvbXBvbmVudD8uZWxlbWVudCk7XHJcbiAgICAgIGxldCBjdXJyZW50UGFuZWwgPSB0aGlzLm1vZGVsLmdldEVsZW1lbnRQYW5lbCh0aGlzLm1vZGVsLnNlbGVjdGVkQ29tcG9uZW50Py5lbGVtZW50KTtcclxuICAgICAgY3VycmVudFBhZ2U/LmVsZW1lbnRzPy5mb3JFYWNoKChlbGVtKSA9PiB7XHJcbiAgICAgICAgaWYgKGVsZW0ueSA+PSB0aGlzLm1vZGVsLnNlbGVjdGVkQ29tcG9uZW50LmVsZW1lbnQuZ2VvbWV0cnkuYm90dG9tKSB7XHJcbiAgICAgICAgICBib3R0b21FbGVtZW50cy5wdXNoKGVsZW0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIGlmIChib3R0b21FbGVtZW50cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgbGV0IG1heEJvdHRvbVBvaW50ID0gTWF0aC5tYXgoLi4uYm90dG9tRWxlbWVudHMubWFwKChlbGVtKSA9PiBlbGVtLmdlb21ldHJ5LmJvdHRvbSkpO1xyXG4gICAgICAgIGZyZWVBcmVhSGVpZ2h0ID0gKGN1cnJlbnRQYWdlPy5jb250ZW50QXJlYUhlaWdodCB8fCBjdXJyZW50UGFuZWw/LmhlaWdodCkgLSBtYXhCb3R0b21Qb2ludDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBmcmVlQXJlYUhlaWdodCA9XHJcbiAgICAgICAgICAoY3VycmVudFBhZ2U/LmNvbnRlbnRBcmVhSGVpZ2h0IHx8IGN1cnJlbnRQYW5lbD8uaGVpZ2h0KSAtXHJcbiAgICAgICAgICB0aGlzLm1vZGVsLnNlbGVjdGVkQ29tcG9uZW50Py5lbGVtZW50Lmdlb21ldHJ5LmJvdHRvbTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGxldCBwYXJlbnRDb250YWluZXIgPSBjb21wb25lbnQuZ2V0UGFyZW50KHRoaXMubW9kZWwuZm9ybSkgPz8gdGhpcy5tb2RlbC5mb3JtLnBhZ2VzWzBdO1xyXG4gICAgbGV0IHNpemVDaGFuZ2VkID0gZmFsc2U7XHJcblxyXG4gICAgbGV0IG1pbkhlaWdodCA9XHJcbiAgICAgIE51bWJlcigoKE1hdGgucm91bmQoY3IuaGVpZ2h0KSAvIHRoaXMuY3VycmVudFZlcnRpY2FsU3RlcCkgJSAxKS50b0ZpeGVkKDIpKSA8PSAwLjUgJiZcclxuICAgICAgTWF0aC5yb3VuZChjci5oZWlnaHQpICE9IHBhcmVudENvbnRhaW5lcltcImNvbnRlbnRBcmVhSGVpZ2h0XCJdXHJcbiAgICAgICAgPyBNYXRoLmZsb29yKGNyLmhlaWdodCAvIHRoaXMuY3VycmVudFZlcnRpY2FsU3RlcCkgKiB0aGlzLmN1cnJlbnRWZXJ0aWNhbFN0ZXBcclxuICAgICAgICA6IE1hdGguY2VpbChjci5oZWlnaHQgLyB0aGlzLmN1cnJlbnRWZXJ0aWNhbFN0ZXApICogdGhpcy5jdXJyZW50VmVydGljYWxTdGVwO1xyXG4gICAgaWYgKFxyXG4gICAgICBjb21wb25lbnQuZ2VvbWV0cnkubWluSGVpZ2h0ICE9IG1pbkhlaWdodCAmJlxyXG4gICAgICBtaW5IZWlnaHQgPD0gcGFyZW50Q29udGFpbmVyW1wiY29udGVudEFyZWFIZWlnaHRcIl0gJiZcclxuICAgICAgbWluSGVpZ2h0ICE9IDAgJiZcclxuICAgICAgTWF0aC5hYnMoY29tcG9uZW50Lmdlb21ldHJ5Lm1pbkhlaWdodCAtIG1pbkhlaWdodCkgPiAxXHJcbiAgICApIHtcclxuICAgICAgY29tcG9uZW50Lmdlb21ldHJ5Lm1pbkhlaWdodCA9IG1pbkhlaWdodDtcclxuICAgICAgc2l6ZUNoYW5nZWQgPSB0cnVlO1xyXG4gICAgfSBlbHNlIGlmIChtaW5IZWlnaHQgPj0gcGFyZW50Q29udGFpbmVyW1wiY29udGVudEFyZWFIZWlnaHRcIl0gLSBjb21wb25lbnQuZ2VvbWV0cnkueSkge1xyXG4gICAgICBjb21wb25lbnQuZ2VvbWV0cnkubWluSGVpZ2h0ID0gcGFyZW50Q29udGFpbmVyW1wiY29udGVudEFyZWFIZWlnaHRcIl0gLSBjb21wb25lbnQuZ2VvbWV0cnkueTtcclxuICAgICAgc2l6ZUNoYW5nZWQgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChwYXJlbnRDb250YWluZXIpIHtcclxuICAgICAgbGV0IGNvbHVtbldpZHRoID0gcGFyZW50Q29udGFpbmVyLmdldENvbHVtbldpZHRoKHRoaXMubW9kZWwuZm9ybS5zZXR0aW5ncy5ncmlkQ29sdW1ucyk7XHJcbiAgICAgIGxldCBtaW5XaWR0aCA9IE1hdGgubWF4KFxyXG4gICAgICAgIE1hdGgubWluKE1hdGguY2VpbChOdW1iZXIoY3Iud2lkdGgudG9GaXhlZCgyKSkgLyBjb2x1bW5XaWR0aCkgKiBjb2x1bW5XaWR0aCwgdGhpcy5tYXhXaWR0aCksXHJcbiAgICAgICAgY29sdW1uV2lkdGhcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGlmIChtaW5XaWR0aCAhPSBjb21wb25lbnQuZ2VvbWV0cnkubWluV2lkdGgpIHtcclxuICAgICAgICBjb21wb25lbnQuZ2VvbWV0cnkubWluV2lkdGggPSBtaW5XaWR0aDtcclxuICAgICAgICBzaXplQ2hhbmdlZCA9IHRydWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChzaXplQ2hhbmdlZCAmJiB0aGlzLm1vZGVsLmRyYWdnaW5nRWxlbWVudCAhPSBjb21wb25lbnQpIHtcclxuICAgICAgICB0aGlzLnJlbmRlci5pbnNlcnRFbGVtZW50KGNvbXBvbmVudCk7XHJcbiAgICAgICAgdGhpcy5yZW5kZXIuY2hlY2tPdXRwdXRzKHRoaXMubW9kZWwuZ2V0RWxlbWVudFBhZ2UoY29tcG9uZW50KSk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbXBvbmVudC5nZW9tZXRyeS5taW5XaWR0aCA9IE1hdGgubWF4KGNyLndpZHRoLCAyKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLm1vZGVsLmVsZW1lbnRUb1VwZGF0ZSA9IG51bGw7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVPYnNlcnZhYmxlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5vYnNlcnZlcj8udW5vYnNlcnZlKHRoaXMuY2xvbmU/Lm5hdGl2ZUVsZW1lbnQpO1xyXG4gICAgdGhpcy5vYnNlcnZlcj8ub2JzZXJ2ZSh0aGlzLmNsb25lPy5uYXRpdmVFbGVtZW50KTtcclxuICB9XHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLm9ic2VydmVyPy51bm9ic2VydmUodGhpcy5jbG9uZT8ubmF0aXZlRWxlbWVudCk7XHJcbiAgfVxyXG5cclxuICBnZXQgZWxlbWVudCgpOiBTdGlGb3JtRWxlbWVudCB7XHJcbiAgICByZXR1cm4gdGhpcy5tb2RlbC5kcmFnZ2luZ0VsZW1lbnRcclxuICAgICAgPyB0aGlzLm1vZGVsLmRyYWdnaW5nRWxlbWVudFxyXG4gICAgICA6IHRoaXMubW9kZWwuZWxlbWVudFRvVXBkYXRlID8/IHRoaXMubW9kZWwuc2VsZWN0ZWRDb21wb25lbnQ/LmVsZW1lbnQ7XHJcbiAgfVxyXG5cclxuICBnZXQgbWF4V2lkdGgoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5tb2RlbD8uZHJhZ2dpbmdFbGVtZW50XHJcbiAgICAgID8gdGhpcy5tb2RlbD8uZm9ybT8ucGFnZXNbMF0uY29udGVudEFyZWFXaWR0aCAtIHRoaXMuZWxlbWVudD8ueFxyXG4gICAgICA6IHRoaXMuZWxlbWVudD8uZ2V0UGFyZW50KHRoaXMubW9kZWwuZm9ybSk/LmNvbnRlbnRBcmVhV2lkdGggLSB0aGlzLmVsZW1lbnQ/Lng7XHJcbiAgfVxyXG5cclxuICBnZXQgY3VycmVudFZlcnRpY2FsU3RlcCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMubW9kZWwuZm9ybT8uc2V0dGluZ3M/LmdyaWRWZXJ0aWNhbFN0ZXAgIT0gMSA/IHRoaXMubW9kZWwuZm9ybT8uc2V0dGluZ3M/LmdyaWRWZXJ0aWNhbFN0ZXAgOiA1O1xyXG4gIH1cclxufVxyXG4iXX0=