UNPKG

@nova-ui/bits

Version:

SolarWinds Nova Framework

223 lines 31.8 kB
import { Injectable } from "@angular/core"; import { PopoverOverlayPosition } from "./public-api"; import { OVERLAY_ARROW_SIZE } from "../overlay/constants"; import * as i0 from "@angular/core"; var PopoverOverlayPlacement; (function (PopoverOverlayPlacement) { PopoverOverlayPlacement["Left"] = "left"; PopoverOverlayPlacement["Right"] = "right"; PopoverOverlayPlacement["Top"] = "top"; PopoverOverlayPlacement["Bottom"] = "bottom"; })(PopoverOverlayPlacement || (PopoverOverlayPlacement = {})); var PanelClass; (function (PanelClass) { PanelClass["overlayLeftTop"] = "overlay-left-top"; PanelClass["overlayLeftBottom"] = "overlay-left-bottom"; PanelClass["overlayRightTop"] = "overlay-right-top"; PanelClass["overlayRightBottom"] = "overlay-right-bottom"; PanelClass["overlayTopLeft"] = "overlay-top-left"; PanelClass["overlayTopRight"] = "overlay-top-right"; PanelClass["overlayBottomLeft"] = "overlay-bottom-left"; PanelClass["overlayBottomRight"] = "overlay-bottom-right"; })(PanelClass || (PanelClass = {})); export class PopoverPositionService { constructor() { this.popoverPositions = getPopoverPositions(); } setPopoverOffset(panelClass, elRefHeight, overlayRefElement) { const ARROW_SIZE = OVERLAY_ARROW_SIZE; const popoverOffsetY = this.calculateOffsetY(elRefHeight); if (Array.isArray(panelClass)) { panelClass = this.getPopoverPositionPanelClass(panelClass); } if (!panelClass) { return; } overlayRefElement.style.marginLeft = ""; overlayRefElement.style.marginTop = ""; overlayRefElement.style.marginBottom = ""; overlayRefElement.style.marginRight = ""; switch (panelClass) { case PanelClass.overlayLeftTop: overlayRefElement.style.marginRight = ARROW_SIZE + "px"; overlayRefElement.style.marginBottom = -popoverOffsetY + "px"; break; case PanelClass.overlayLeftBottom: overlayRefElement.style.marginRight = ARROW_SIZE + "px"; overlayRefElement.style.marginTop = -popoverOffsetY + "px"; break; case PanelClass.overlayRightTop: overlayRefElement.style.marginLeft = ARROW_SIZE + "px"; overlayRefElement.style.marginBottom = -popoverOffsetY + "px"; break; case PanelClass.overlayRightBottom: overlayRefElement.style.marginLeft = ARROW_SIZE + "px"; overlayRefElement.style.marginTop = -popoverOffsetY + "px"; break; case PanelClass.overlayTopLeft: overlayRefElement.style.marginRight = -2 * ARROW_SIZE + "px"; overlayRefElement.style.marginBottom = ARROW_SIZE + "px"; break; case PanelClass.overlayTopRight: overlayRefElement.style.marginLeft = -2 * ARROW_SIZE + "px"; overlayRefElement.style.marginBottom = ARROW_SIZE + "px"; break; case PanelClass.overlayBottomLeft: overlayRefElement.style.marginRight = -2 * ARROW_SIZE + "px"; overlayRefElement.style.marginTop = ARROW_SIZE + "px"; break; case PanelClass.overlayBottomRight: overlayRefElement.style.marginLeft = -2 * ARROW_SIZE + "px"; overlayRefElement.style.marginTop = ARROW_SIZE + "px"; break; } } possiblePositionsForPlacement(placement) { const possiblePositions = []; switch (placement) { case PopoverOverlayPlacement.Left: possiblePositions.push(...this.getPositionsForPlacement(PopoverOverlayPlacement.Left)); break; case PopoverOverlayPlacement.Right: possiblePositions.push(...this.getPositionsForPlacement(PopoverOverlayPlacement.Right)); break; case PopoverOverlayPlacement.Top: possiblePositions.push(...this.getPositionsForPlacement(PopoverOverlayPlacement.Top)); break; case PopoverOverlayPlacement.Bottom: possiblePositions.push(...this.getPositionsForPlacement(PopoverOverlayPlacement.Bottom)); break; } return possiblePositions; } getConnectedPositions(positions) { return positions.map((positionName) => this.popoverPositions[positionName]); } /** * Returns all possible positions for a placement * Eg: left => [OVERLAY_POSITIONS[centerLeft], OVERLAY_POSITIONS[topLeft], OVERLAY_POSITIONS[bottomLeft]] * * @param placement * @returns ConnectedPosition[] */ getPositionsForPlacement(placement) { let possiblePositionNames = []; switch (placement) { case PopoverOverlayPlacement.Left: possiblePositionNames = [ PopoverOverlayPosition.leftBottom, PopoverOverlayPosition.leftTop, PopoverOverlayPosition.rightBottom, PopoverOverlayPosition.rightTop, ]; break; case PopoverOverlayPlacement.Right: possiblePositionNames = [ PopoverOverlayPosition.rightBottom, PopoverOverlayPosition.rightTop, PopoverOverlayPosition.leftBottom, PopoverOverlayPosition.leftTop, ]; break; case PopoverOverlayPlacement.Top: possiblePositionNames = [ PopoverOverlayPosition.topRight, PopoverOverlayPosition.topLeft, PopoverOverlayPosition.bottomRight, PopoverOverlayPosition.bottomLeft, ]; break; case PopoverOverlayPlacement.Bottom: possiblePositionNames = [ PopoverOverlayPosition.bottomRight, PopoverOverlayPosition.bottomLeft, PopoverOverlayPosition.topRight, PopoverOverlayPosition.topLeft, ]; break; } return this.getConnectedPositions(possiblePositionNames); } getPopoverPositionPanelClass(panelClass) { let result; for (const panelClassKey in PanelClass) { if (PanelClass.hasOwnProperty(panelClassKey)) { result = panelClass.find((i) => i === panelClassKey); } } return result || ""; } calculateOffsetY(elRefHeight) { const ARROW_CENTER_POSITION_PX = 20; if (!elRefHeight) { return 5; } return ARROW_CENTER_POSITION_PX - elRefHeight / 2; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PopoverPositionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PopoverPositionService }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PopoverPositionService, decorators: [{ type: Injectable }], ctorParameters: () => [] }); export function getPopoverPositions() { return { [PopoverOverlayPosition.topLeft]: { panelClass: "overlay-top-left", originX: "center", originY: "top", overlayX: "end", overlayY: "bottom", }, [PopoverOverlayPosition.bottomLeft]: { panelClass: "overlay-bottom-left", originX: "center", originY: "bottom", overlayX: "end", overlayY: "top", }, [PopoverOverlayPosition.topRight]: { panelClass: "overlay-top-right", originX: "center", originY: "top", overlayX: "start", overlayY: "bottom", }, [PopoverOverlayPosition.bottomRight]: { panelClass: "overlay-bottom-right", originX: "center", originY: "bottom", overlayX: "start", overlayY: "top", }, [PopoverOverlayPosition.leftTop]: { panelClass: "overlay-left-top", originX: "start", originY: "bottom", overlayX: "end", overlayY: "bottom", }, [PopoverOverlayPosition.leftBottom]: { panelClass: "overlay-left-bottom", originX: "start", originY: "top", overlayX: "end", overlayY: "top", }, [PopoverOverlayPosition.rightTop]: { panelClass: "overlay-right-top", originX: "end", originY: "bottom", overlayX: "start", overlayY: "bottom", }, [PopoverOverlayPosition.rightBottom]: { panelClass: "overlay-right-bottom", originX: "end", originY: "top", overlayX: "start", overlayY: "top", }, }; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wb3Zlci1wb3NpdGlvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9wb3BvdmVyL3BvcG92ZXItcG9zaXRpb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFxQkEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxPQUFPLEVBQUUsc0JBQXNCLEVBQW9CLE1BQU0sY0FBYyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDOztBQUUxRCxJQUFLLHVCQUtKO0FBTEQsV0FBSyx1QkFBdUI7SUFDeEIsd0NBQWEsQ0FBQTtJQUNiLDBDQUFlLENBQUE7SUFDZixzQ0FBVyxDQUFBO0lBQ1gsNENBQWlCLENBQUE7QUFDckIsQ0FBQyxFQUxJLHVCQUF1QixLQUF2Qix1QkFBdUIsUUFLM0I7QUFFRCxJQUFLLFVBU0o7QUFURCxXQUFLLFVBQVU7SUFDWCxpREFBbUMsQ0FBQTtJQUNuQyx1REFBeUMsQ0FBQTtJQUN6QyxtREFBcUMsQ0FBQTtJQUNyQyx5REFBMkMsQ0FBQTtJQUMzQyxpREFBbUMsQ0FBQTtJQUNuQyxtREFBcUMsQ0FBQTtJQUNyQyx1REFBeUMsQ0FBQTtJQUN6Qyx5REFBMkMsQ0FBQTtBQUMvQyxDQUFDLEVBVEksVUFBVSxLQUFWLFVBQVUsUUFTZDtBQUdELE1BQU0sT0FBTyxzQkFBc0I7SUFNL0I7UUFDSSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsbUJBQW1CLEVBQUUsQ0FBQztJQUNsRCxDQUFDO0lBRU0sZ0JBQWdCLENBQ25CLFVBQTZCLEVBQzdCLFdBQW1CLEVBQ25CLGlCQUE4QjtRQUU5QixNQUFNLFVBQVUsR0FBRyxrQkFBa0IsQ0FBQztRQUN0QyxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFMUQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQVUs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LFFBQVE7U0FDckI7UUFDRCxDQUFDLHNCQUFzQixDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQ2pDLFVBQVUsRUFBRSxxQkFBcUI7WUFDakMsT0FBTyxFQUFFLE9BQU87WUFDaEIsT0FBTyxFQUFFLEtBQUs7WUFDZCxRQUFRLEVBQUUsS0FBSztZQUNmLFFBQVEsRUFBRSxLQUFLO1NBQ2xCO1FBQ0QsQ0FBQyxzQkFBc0IsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUMvQixVQUFVLEVBQUUsbUJBQW1CO1lBQy9CLE9BQU8sRUFBRSxLQUFLO1lBQ2QsT0FBTyxFQUFFLFFBQVE7WUFDakIsUUFBUSxFQUFFLE9BQU87WUFDakIsUUFBUSxFQUFFLFFBQVE7U0FDckI7UUFDRCxDQUFDLHNCQUFzQixDQUFDLFdBQVcsQ0FBQyxFQUFFO1lBQ2xDLFVBQVUsRUFBRSxzQkFBc0I7WUFDbEMsT0FBTyxFQUFFLEtBQUs7WUFDZCxPQUFPLEVBQUUsS0FBSztZQUNkLFFBQVEsRUFBRSxPQUFPO1lBQ2pCLFFBQVEsRUFBRSxLQUFLO1NBQ2xCO0tBQ0osQ0FBQztBQUNOLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyDCqSAyMDIyIFNvbGFyV2luZHMgV29ybGR3aWRlLCBMTEMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvXG4vLyAgZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGVcbi8vICByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Jcbi8vICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vICBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyAgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyAgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyAgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IHsgQ29ubmVjdGVkUG9zaXRpb24gfSBmcm9tIFwiQGFuZ3VsYXIvY2RrL292ZXJsYXlcIjtcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuXG5pbXBvcnQgeyBQb3BvdmVyT3ZlcmxheVBvc2l0aW9uLCBQb3BvdmVyUGxhY2VtZW50IH0gZnJvbSBcIi4vcHVibGljLWFwaVwiO1xuaW1wb3J0IHsgT1ZFUkxBWV9BUlJPV19TSVpFIH0gZnJvbSBcIi4uL292ZXJsYXkvY29uc3RhbnRzXCI7XG5cbmVudW0gUG9wb3Zlck92ZXJsYXlQbGFjZW1lbnQge1xuICAgIExlZnQgPSBcImxlZnRcIixcbiAgICBSaWdodCA9IFwicmlnaHRcIixcbiAgICBUb3AgPSBcInRvcFwiLFxuICAgIEJvdHRvbSA9IFwiYm90dG9tXCIsXG59XG5cbmVudW0gUGFuZWxDbGFzcyB7XG4gICAgb3ZlcmxheUxlZnRUb3AgPSBcIm92ZXJsYXktbGVmdC10b3BcIixcbiAgICBvdmVybGF5TGVmdEJvdHRvbSA9IFwib3ZlcmxheS1sZWZ0LWJvdHRvbVwiLFxuICAgIG92ZXJsYXlSaWdodFRvcCA9IFwib3ZlcmxheS1yaWdodC10b3BcIixcbiAgICBvdmVybGF5UmlnaHRCb3R0b20gPSBcIm92ZXJsYXktcmlnaHQtYm90dG9tXCIsXG4gICAgb3ZlcmxheVRvcExlZnQgPSBcIm92ZXJsYXktdG9wLWxlZnRcIixcbiAgICBvdmVybGF5VG9wUmlnaHQgPSBcIm92ZXJsYXktdG9wLXJpZ2h0XCIsXG4gICAgb3ZlcmxheUJvdHRvbUxlZnQgPSBcIm92ZXJsYXktYm90dG9tLWxlZnRcIixcbiAgICBvdmVybGF5Qm90dG9tUmlnaHQgPSBcIm92ZXJsYXktYm90dG9tLXJpZ2h0XCIsXG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBQb3BvdmVyUG9zaXRpb25TZXJ2aWNlIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBvcG92ZXJQb3NpdGlvbnM6IFJlY29yZDxcbiAgICAgICAgUG9wb3Zlck92ZXJsYXlQb3NpdGlvbixcbiAgICAgICAgQ29ubmVjdGVkUG9zaXRpb25cbiAgICA+O1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMucG9wb3ZlclBvc2l0aW9ucyA9IGdldFBvcG92ZXJQb3NpdGlvbnMoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0UG9wb3Zlck9mZnNldChcbiAgICAgICAgcGFuZWxDbGFzczogc3RyaW5nIHwgc3RyaW5nW10sXG4gICAgICAgIGVsUmVmSGVpZ2h0OiBudW1iZXIsXG4gICAgICAgIG92ZXJsYXlSZWZFbGVtZW50OiBIVE1MRWxlbWVudFxuICAgICk6IHZvaWQge1xuICAgICAgICBjb25zdCBBUlJPV19TSVpFID0gT1ZFUkxBWV9BUlJPV19TSVpFO1xuICAgICAgICBjb25zdCBwb3BvdmVyT2Zmc2V0WSA9IHRoaXMuY2FsY3VsYXRlT2Zmc2V0WShlbFJlZkhlaWdodCk7XG5cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGFuZWxDbGFzcykpIHtcbiAgICAgICAgICAgIHBhbmVsQ2xhc3MgPSB0aGlzLmdldFBvcG92ZXJQb3NpdGlvblBhbmVsQ2xhc3MocGFuZWxDbGFzcyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXBhbmVsQ2xhc3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIG92ZXJsYXlSZWZFbGVtZW50LnN0eWxlLm1hcmdpbkxlZnQgPSBcIlwiO1xuICAgICAgICBvdmVybGF5UmVmRWxlbWVudC5zdHlsZS5tYXJnaW5Ub3AgPSBcIlwiO1xuICAgICAgICBvdmVybGF5UmVmRWxlbWVudC5zdHlsZS5tYXJnaW5Cb3R0b20gPSBcIlwiO1xuICAgICAgICBvdmVybGF5UmVmRWxlbWVudC5zdHlsZS5tYXJnaW5SaWdodCA9IFwiXCI7XG5cbiAgICAgICAgc3dpdGNoIChwYW5lbENsYXNzKSB7XG4gICAgICAgICAgICBjYXNlIFBhbmVsQ2xhc3Mub3ZlcmxheUxlZnRUb3A6XG4gICAgICAgICAgICAgICAgb3ZlcmxheVJlZkVsZW1lbnQuc3R5bGUubWFyZ2luUmlnaHQgPSBBUlJPV19TSVpFICsgXCJweFwiO1xuICAgICAgICAgICAgICAgIG92ZXJsYXlSZWZFbGVtZW50LnN0eWxlLm1hcmdpbkJvdHRvbSA9IC1wb3BvdmVyT2Zmc2V0WSArIFwicHhcIjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUGFuZWxDbGFzcy5vdmVybGF5TGVmdEJvdHRvbTpcbiAgICAgICAgICAgICAgICBvdmVybGF5UmVmRWxlbWVudC5zdHlsZS5tYXJnaW5SaWdodCA9IEFSUk9XX1NJWkUgKyBcInB4XCI7XG4gICAgICAgICAgICAgICAgb3ZlcmxheVJlZkVsZW1lbnQuc3R5bGUubWFyZ2luVG9wID0gLXBvcG92ZXJPZmZzZXRZICsgXCJweFwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBQYW5lbENsYXNzLm92ZXJsYXlSaWdodFRvcDpcbiAgICAgICAgICAgICAgICBvdmVybGF5UmVmRWxlbWVudC5zdHlsZS5tYXJnaW5MZWZ0ID0gQVJST1dfU0laRSArIFwicHhcIjtcbiAgICAgICAgICAgICAgICBvdmVybGF5UmVmRWxlbWVudC5zdHlsZS5tYXJnaW5Cb3R0b20gPSAtcG9wb3Zlck9mZnNldFkgKyBcInB4XCI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFBhbmVsQ2xhc3Mub3ZlcmxheVJpZ2h0Qm90dG9tOlxuICAgICAgICAgICAgICAgIG92ZXJsYXlSZWZFbGVtZW50LnN0eWxlLm1hcmdpbkxlZnQgPSBBUlJPV19TSVpFICsgXCJweFwiO1xuICAgICAgICAgICAgICAgIG92ZXJsYXlSZWZFbGVtZW50LnN0eWxlLm1hcmdpblRvcCA9IC1wb3BvdmVyT2Zmc2V0WSArIFwicHhcIjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUGFuZWxDbGFzcy5vdmVybGF5VG9wTGVmdDpcbiAgICAgICAgICAgICAgICBvdmVybGF5UmVmRWxlbWVudC5zdHlsZS5tYXJnaW5SaWdodCA9IC0yICogQVJST1dfU0laRSArIFwicHhcIjtcbiAgICAgICAgICAgICAgICBvdmVybGF5UmVmRWxlbWVudC5zdHlsZS5tYXJnaW5Cb3R0b20gPSBBUlJPV19TSVpFICsgXCJweFwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBQYW5lbENsYXNzLm92ZXJsYXlUb3BSaWdodDpcbiAgICAgICAgICAgICAgICBvdmVybGF5UmVmRWxlbWVudC5zdHlsZS5tYXJnaW5MZWZ0ID0gLTIgKiBBUlJPV19TSVpFICsgXCJweFwiO1xuICAgICAgICAgICAgICAgIG92ZXJsYXlSZWZFbGVtZW50LnN0eWxlLm1hcmdpbkJvdHRvbSA9IEFSUk9XX1NJWkUgKyBcInB4XCI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFBhbmVsQ2xhc3Mub3ZlcmxheUJvdHRvbUxlZnQ6XG4gICAgICAgICAgICAgICAgb3ZlcmxheVJlZkVsZW1lbnQuc3R5bGUubWFyZ2luUmlnaHQgPSAtMiAqIEFSUk9XX1NJWkUgKyBcInB4XCI7XG4gICAgICAgICAgICAgICAgb3ZlcmxheVJlZkVsZW1lbnQuc3R5bGUubWFyZ2luVG9wID0gQVJST1dfU0laRSArIFwicHhcIjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUGFuZWxDbGFzcy5vdmVybGF5Qm90dG9tUmlnaHQ6XG4gICAgICAgICAgICAgICAgb3ZlcmxheVJlZkVsZW1lbnQuc3R5bGUubWFyZ2luTGVmdCA9IC0yICogQVJST1dfU0laRSArIFwicHhcIjtcbiAgICAgICAgICAgICAgICBvdmVybGF5UmVmRWxlbWVudC5zdHlsZS5tYXJnaW5Ub3AgPSBBUlJPV19TSVpFICsgXCJweFwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHBvc3NpYmxlUG9zaXRpb25zRm9yUGxhY2VtZW50KFxuICAgICAgICBwbGFjZW1lbnQ6IFBvcG92ZXJQbGFjZW1lbnRcbiAgICApOiBDb25uZWN0ZWRQb3NpdGlvbltdIHtcbiAgICAgICAgY29uc3QgcG9zc2libGVQb3NpdGlvbnM6IENvbm5lY3RlZFBvc2l0aW9uW10gPSBbXTtcblxuICAgICAgICBzd2l0Y2ggKHBsYWNlbWVudCkge1xuICAgICAgICAgICAgY2FzZSBQb3BvdmVyT3ZlcmxheVBsYWNlbWVudC5MZWZ0OlxuICAgICAgICAgICAgICAgIHBvc3NpYmxlUG9zaXRpb25zLnB1c2goXG4gICAgICAgICAgICAgICAgICAgIC4uLnRoaXMuZ2V0UG9zaXRpb25zRm9yUGxhY2VtZW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgUG9wb3Zlck92ZXJsYXlQbGFjZW1lbnQuTGVmdFxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUG9wb3Zlck92ZXJsYXlQbGFjZW1lbnQuUmlnaHQ6XG4gICAgICAgICAgICAgICAgcG9zc2libGVQb3NpdGlvbnMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgLi4udGhpcy5nZXRQb3NpdGlvbnNGb3JQbGFjZW1lbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICBQb3BvdmVyT3ZlcmxheVBsYWNlbWVudC5SaWdodFxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUG9wb3Zlck92ZXJsYXlQbGFjZW1lbnQuVG9wOlxuICAgICAgICAgICAgICAgIHBvc3NpYmxlUG9zaXRpb25zLnB1c2goXG4gICAgICAgICAgICAgICAgICAgIC4uLnRoaXMuZ2V0UG9zaXRpb25zRm9yUGxhY2VtZW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgUG9wb3Zlck92ZXJsYXlQbGFjZW1lbnQuVG9wXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBQb3BvdmVyT3ZlcmxheVBsYWNlbWVudC5Cb3R0b206XG4gICAgICAgICAgICAgICAgcG9zc2libGVQb3NpdGlvbnMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgLi4udGhpcy5nZXRQb3NpdGlvbnNGb3JQbGFjZW1lbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICBQb3BvdmVyT3ZlcmxheVBsYWNlbWVudC5Cb3R0b21cbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcG9zc2libGVQb3NpdGlvbnM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbm5lY3RlZFBvc2l0aW9ucyhcbiAgICAgICAgcG9zaXRpb25zOiBQb3BvdmVyT3ZlcmxheVBvc2l0aW9uW11cbiAgICApOiBDb25uZWN0ZWRQb3NpdGlvbltdIHtcbiAgICAgICAgcmV0dXJuIHBvc2l0aW9ucy5tYXAoXG4gICAgICAgICAgICAocG9zaXRpb25OYW1lOiBQb3BvdmVyT3ZlcmxheVBvc2l0aW9uKSA9PlxuICAgICAgICAgICAgICAgIHRoaXMucG9wb3ZlclBvc2l0aW9uc1twb3NpdGlvbk5hbWVdXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbGwgcG9zc2libGUgcG9zaXRpb25zIGZvciBhIHBsYWNlbWVudFxuICAgICAqIEVnOiBsZWZ0ID0+IFtPVkVSTEFZX1BPU0lUSU9OU1tjZW50ZXJMZWZ0XSwgT1ZFUkxBWV9QT1NJVElPTlNbdG9wTGVmdF0sIE9WRVJMQVlfUE9TSVRJT05TW2JvdHRvbUxlZnRdXVxuICAgICAqXG4gICAgICogQHBhcmFtIHBsYWNlbWVudFxuICAgICAqIEByZXR1cm5zIENvbm5lY3RlZFBvc2l0aW9uW11cbiAgICAgKi9cbiAgICBwcml2YXRlIGdldFBvc2l0aW9uc0ZvclBsYWNlbWVudChcbiAgICAgICAgcGxhY2VtZW50OiBQb3BvdmVyT3ZlcmxheVBsYWNlbWVudFxuICAgICk6IENvbm5lY3RlZFBvc2l0aW9uW10ge1xuICAgICAgICBsZXQgcG9zc2libGVQb3NpdGlvbk5hbWVzOiBQb3BvdmVyT3ZlcmxheVBvc2l0aW9uW10gPSBbXTtcbiAgICAgICAgc3dpdGNoIChwbGFjZW1lbnQpIHtcbiAgICAgICAgICAgIGNhc2UgUG9wb3Zlck92ZXJsYXlQbGFjZW1lbnQuTGVmdDpcbiAgICAgICAgICAgICAgICBwb3NzaWJsZVBvc2l0aW9uTmFtZXMgPSBbXG4gICAgICAgICAgICAgICAgICAgIFBvcG92ZXJPdmVybGF5UG9zaXRpb24ubGVmdEJvdHRvbSxcbiAgICAgICAgICAgICAgICAgICAgUG9wb3Zlck92ZXJsYXlQb3NpdGlvbi5sZWZ0VG9wLFxuICAgICAgICAgICAgICAgICAgICBQb3BvdmVyT3ZlcmxheVBvc2l0aW9uLnJpZ2h0Qm90dG9tLFxuICAgICAgICAgICAgICAgICAgICBQb3BvdmVyT3ZlcmxheVBvc2l0aW9uLnJpZ2h0VG9wLFxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgUG9wb3Zlck92ZXJsYXlQbGFjZW1lbnQuUmlnaHQ6XG4gICAgICAgICAgICAgICAgcG9zc2libGVQb3NpdGlvbk5hbWVzID0gW1xuICAgICAgICAgICAgICAgICAgICBQb3BvdmVyT3ZlcmxheVBvc2l0aW9uLnJpZ2h0Qm90dG9tLFxuICAgICAgICAgICAgICAgICAgICBQb3BvdmVyT3ZlcmxheVBvc2l0aW9uLnJpZ2h0VG9wLFxuICAgICAgICAgICAgICAgICAgICBQb3BvdmVyT3ZlcmxheVBvc2l0aW9uLmxlZnRCb3R0b20sXG4gICAgICAgICAgICAgICAgICAgIFBvcG92ZXJPdmVybGF5UG9zaXRpb24ubGVmdFRvcCxcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIFBvcG92ZXJPdmVybGF5UGxhY2VtZW50LlRvcDpcbiAgICAgICAgICAgICAgICBwb3NzaWJsZVBvc2l0aW9uTmFtZXMgPSBbXG4gICAgICAgICAgICAgICAgICAgIFBvcG92ZXJPdmVybGF5UG9zaXRpb24udG9wUmlnaHQsXG4gICAgICAgICAgICAgICAgICAgIFBvcG92ZXJPdmVybGF5UG9zaXRpb24udG9wTGVmdCxcbiAgICAgICAgICAgICAgICAgICAgUG9wb3Zlck92ZXJsYXlQb3NpdGlvbi5ib3R0b21SaWdodCxcbiAgICAgICAgICAgICAgICAgICAgUG9wb3Zlck92ZXJsYXlQb3NpdGlvbi5ib3R0b21MZWZ0LFxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgUG9wb3Zlck92ZXJsYXlQbGFjZW1lbnQuQm90dG9tOlxuICAgICAgICAgICAgICAgIHBvc3NpYmxlUG9zaXRpb25OYW1lcyA9IFtcbiAgICAgICAgICAgICAgICAgICAgUG9wb3Zlck92ZXJsYXlQb3NpdGlvbi5ib3R0b21SaWdodCxcbiAgICAgICAgICAgICAgICAgICAgUG9wb3Zlck92ZXJsYXlQb3NpdGlvbi5ib3R0b21MZWZ0LFxuICAgICAgICAgICAgICAgICAgICBQb3BvdmVyT3ZlcmxheVBvc2l0aW9uLnRvcFJpZ2h0LFxuICAgICAgICAgICAgICAgICAgICBQb3BvdmVyT3ZlcmxheVBvc2l0aW9uLnRvcExlZnQsXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmdldENvbm5lY3RlZFBvc2l0aW9ucyhwb3NzaWJsZVBvc2l0aW9uTmFtZXMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0UG9wb3ZlclBvc2l0aW9uUGFuZWxDbGFzcyhwYW5lbENsYXNzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gICAgICAgIGxldCByZXN1bHQ7XG4gICAgICAgIGZvciAoY29uc3QgcGFuZWxDbGFzc0tleSBpbiBQYW5lbENsYXNzKSB7XG4gICAgICAgICAgICBpZiAoUGFuZWxDbGFzcy5oYXNPd25Qcm9wZXJ0eShwYW5lbENsYXNzS2V5KSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHBhbmVsQ2xhc3MuZmluZCgoaSkgPT4gaSA9PT0gcGFuZWxDbGFzc0tleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdCB8fCBcIlwiO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2FsY3VsYXRlT2Zmc2V0WShlbFJlZkhlaWdodDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgQVJST1dfQ0VOVEVSX1BPU0lUSU9OX1BYID0gMjA7XG4gICAgICAgIGlmICghZWxSZWZIZWlnaHQpIHtcbiAgICAgICAgICAgIHJldHVybiA1O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBBUlJPV19DRU5URVJfUE9TSVRJT05fUFggLSBlbFJlZkhlaWdodCAvIDI7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UG9wb3ZlclBvc2l0aW9ucygpOiBSZWNvcmQ8XG4gICAgUG9wb3Zlck92ZXJsYXlQb3NpdGlvbixcbiAgICBDb25uZWN0ZWRQb3NpdGlvblxuPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgW1BvcG92ZXJPdmVybGF5UG9zaXRpb24udG9wTGVmdF06IHtcbiAgICAgICAgICAgIHBhbmVsQ2xhc3M6IFwib3ZlcmxheS10b3AtbGVmdFwiLFxuICAgICAgICAgICAgb3JpZ2luWDogXCJjZW50ZXJcIixcbiAgICAgICAgICAgIG9yaWdpblk6IFwidG9wXCIsXG4gICAgICAgICAgICBvdmVybGF5WDogXCJlbmRcIixcbiAgICAgICAgICAgIG92ZXJsYXlZOiBcImJvdHRvbVwiLFxuICAgICAgICB9LFxuICAgICAgICBbUG9wb3Zlck92ZXJsYXlQb3NpdGlvbi5ib3R0b21MZWZ0XToge1xuICAgICAgICAgICAgcGFuZWxDbGFzczogXCJvdmVybGF5LWJvdHRvbS1sZWZ0XCIsXG4gICAgICAgICAgICBvcmlnaW5YOiBcImNlbnRlclwiLFxuICAgICAgICAgICAgb3JpZ2luWTogXCJib3R0b21cIixcbiAgICAgICAgICAgIG92ZXJsYXlYOiBcImVuZFwiLFxuICAgICAgICAgICAgb3ZlcmxheVk6IFwidG9wXCIsXG4gICAgICAgIH0sXG4gICAgICAgIFtQb3BvdmVyT3ZlcmxheVBvc2l0aW9uLnRvcFJpZ2h0XToge1xuICAgICAgICAgICAgcGFuZWxDbGFzczogXCJvdmVybGF5LXRvcC1yaWdodFwiLFxuICAgICAgICAgICAgb3JpZ2luWDogXCJjZW50ZXJcIixcbiAgICAgICAgICAgIG9yaWdpblk6IFwidG9wXCIsXG4gICAgICAgICAgICBvdmVybGF5WDogXCJzdGFydFwiLFxuICAgICAgICAgICAgb3ZlcmxheVk6IFwiYm90dG9tXCIsXG4gICAgICAgIH0sXG4gICAgICAgIFtQb3BvdmVyT3ZlcmxheVBvc2l0aW9uLmJvdHRvbVJpZ2h0XToge1xuICAgICAgICAgICAgcGFuZWxDbGFzczogXCJvdmVybGF5LWJvdHRvbS1yaWdodFwiLFxuICAgICAgICAgICAgb3JpZ2luWDogXCJjZW50ZXJcIixcbiAgICAgICAgICAgIG9yaWdpblk6IFwiYm90dG9tXCIsXG4gICAgICAgICAgICBvdmVybGF5WDogXCJzdGFydFwiLFxuICAgICAgICAgICAgb3ZlcmxheVk6IFwidG9wXCIsXG4gICAgICAgIH0sXG4gICAgICAgIFtQb3BvdmVyT3ZlcmxheVBvc2l0aW9uLmxlZnRUb3BdOiB7XG4gICAgICAgICAgICBwYW5lbENsYXNzOiBcIm92ZXJsYXktbGVmdC10b3BcIixcbiAgICAgICAgICAgIG9yaWdpblg6IFwic3RhcnRcIixcbiAgICAgICAgICAgIG9yaWdpblk6IFwiYm90dG9tXCIsXG4gICAgICAgICAgICBvdmVybGF5WDogXCJlbmRcIixcbiAgICAgICAgICAgIG92ZXJsYXlZOiBcImJvdHRvbVwiLFxuICAgICAgICB9LFxuICAgICAgICBbUG9wb3Zlck92ZXJsYXlQb3NpdGlvbi5sZWZ0Qm90dG9tXToge1xuICAgICAgICAgICAgcGFuZWxDbGFzczogXCJvdmVybGF5LWxlZnQtYm90dG9tXCIsXG4gICAgICAgICAgICBvcmlnaW5YOiBcInN0YXJ0XCIsXG4gICAgICAgICAgICBvcmlnaW5ZOiBcInRvcFwiLFxuICAgICAgICAgICAgb3ZlcmxheVg6IFwiZW5kXCIsXG4gICAgICAgICAgICBvdmVybGF5WTogXCJ0b3BcIixcbiAgICAgICAgfSxcbiAgICAgICAgW1BvcG92ZXJPdmVybGF5UG9zaXRpb24ucmlnaHRUb3BdOiB7XG4gICAgICAgICAgICBwYW5lbENsYXNzOiBcIm92ZXJsYXktcmlnaHQtdG9wXCIsXG4gICAgICAgICAgICBvcmlnaW5YOiBcImVuZFwiLFxuICAgICAgICAgICAgb3JpZ2luWTogXCJib3R0b21cIixcbiAgICAgICAgICAgIG92ZXJsYXlYOiBcInN0YXJ0XCIsXG4gICAgICAgICAgICBvdmVybGF5WTogXCJib3R0b21cIixcbiAgICAgICAgfSxcbiAgICAgICAgW1BvcG92ZXJPdmVybGF5UG9zaXRpb24ucmlnaHRCb3R0b21dOiB7XG4gICAgICAgICAgICBwYW5lbENsYXNzOiBcIm92ZXJsYXktcmlnaHQtYm90dG9tXCIsXG4gICAgICAgICAgICBvcmlnaW5YOiBcImVuZFwiLFxuICAgICAgICAgICAgb3JpZ2luWTogXCJ0b3BcIixcbiAgICAgICAgICAgIG92ZXJsYXlYOiBcInN0YXJ0XCIsXG4gICAgICAgICAgICBvdmVybGF5WTogXCJ0b3BcIixcbiAgICAgICAgfSxcbiAgICB9O1xufVxuIl19