@nova-ui/bits
Version:
SolarWinds Nova Framework
128 lines • 19.8 kB
JavaScript
// © 2022 SolarWinds Worldwide, LLC. All rights reserved.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to
// deal in the Software without restriction, including without limitation the
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
// sell copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import { DOCUMENT } from "@angular/common";
import { Inject, Injectable } from "@angular/core";
import _isNull from "lodash/isNull";
import { OVERLAY_CONTAINER_CLASS, OVERLAY_DEFAULT_PRIORITY } from "./types";
import * as i0 from "@angular/core";
const PRIORITY_ATTRIBUTE = "priority";
/** @dynamic */
export class OverlayContainerService {
constructor(document) {
this.document = document;
}
/**
* Create a shared container to be used by all overlays if needed
*
* @param elementOrSelector - specifies the container where the overlay will be created
* @param priority - used for rendering overlays above or below others
* (lower values will be rendered below higher priority values)
*/
getOverlayContainer(elementOrSelector = this.document.body, priority = OVERLAY_DEFAULT_PRIORITY) {
// eslint-disable-next-line no-undef-init
let elementFromSelector = undefined;
if (typeof elementOrSelector === "string") {
const result = this.document.querySelector(elementOrSelector);
elementFromSelector = !_isNull(result) ? result : undefined;
if (!elementFromSelector) {
throw new Error(`Specified overlay container '${elementOrSelector || "body"}' was not found in the DOM.`);
}
}
// according priority to custom container selector provided by user.
const targetContainer = elementFromSelector ??
elementOrSelector ??
this.document.body;
const sharedContainer = this.createSharedContainer(targetContainer);
let overlayContainer;
const overlayPriorityClass = "overlay-container-priority";
const desiredPriorityClass = priority.toString().padStart(3, "0");
let lastPriorityDomEl;
let overlays;
if (targetContainer === this.document.body) {
overlays = this.document.querySelectorAll(`body > .cdk-overlay-container > .${overlayPriorityClass}`);
}
else {
overlays = sharedContainer.querySelectorAll(`.${overlayPriorityClass}`);
}
// loop through all our priorities in case we have any
for (let i = 0; i < overlays.length; i++) {
lastPriorityDomEl = overlays[i];
if (lastPriorityDomEl.getAttribute(PRIORITY_ATTRIBUTE) ===
desiredPriorityClass) {
// we already have our priority container
overlayContainer = lastPriorityDomEl;
}
// we need to stop if our priority is higher than the desired priority
if ((lastPriorityDomEl.getAttribute(PRIORITY_ATTRIBUTE) ?? "") >
desiredPriorityClass) {
break;
}
}
if (!overlayContainer) {
const div = this.document.createElement("div");
div.classList.add(overlayPriorityClass);
div.setAttribute(PRIORITY_ATTRIBUTE, desiredPriorityClass);
if (!lastPriorityDomEl) {
// create our priority element in case our shared container just got created
// and we don't have any priorities yet
overlayContainer = sharedContainer.appendChild(div);
}
else {
// create our priory element before or after the last priority DOM element
// depending on the desired priority
overlayContainer = lastPriorityDomEl.insertAdjacentElement((lastPriorityDomEl.getAttribute(PRIORITY_ATTRIBUTE) ?? "") >
desiredPriorityClass
? "beforebegin"
: "afterend", div);
}
}
return overlayContainer;
}
createSharedContainer(targetContainer) {
let sharedContainer;
if (targetContainer === this.document.body) {
// create shared container only if it doesn't exist already
sharedContainer =
targetContainer.querySelector(`body > .${OVERLAY_CONTAINER_CLASS}`) ?? undefined;
}
else {
// create shared container only if it doesn't exist already
sharedContainer =
targetContainer.querySelector(`.${OVERLAY_CONTAINER_CLASS}`) ??
undefined;
}
if (!sharedContainer) {
sharedContainer = this.document.createElement("div");
sharedContainer.classList.add(OVERLAY_CONTAINER_CLASS, "cdk-overlay-container");
targetContainer.appendChild(sharedContainer);
}
return sharedContainer;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OverlayContainerService, deps: [{ token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OverlayContainerService, providedIn: "root" }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OverlayContainerService, decorators: [{
type: Injectable,
args: [{ providedIn: "root" }]
}], ctorParameters: () => [{ type: Document, decorators: [{
type: Inject,
args: [DOCUMENT]
}] }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3ZlcmxheS1jb250YWluZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvb3ZlcmxheS9vdmVybGF5LWNvbnRhaW5lci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHlEQUF5RDtBQUN6RCxFQUFFO0FBQ0YsK0VBQStFO0FBQy9FLDRFQUE0RTtBQUM1RSw4RUFBOEU7QUFDOUUsK0VBQStFO0FBQy9FLDhFQUE4RTtBQUM5RSw0REFBNEQ7QUFDNUQsRUFBRTtBQUNGLDZFQUE2RTtBQUM3RSx1REFBdUQ7QUFDdkQsRUFBRTtBQUNGLDZFQUE2RTtBQUM3RSw0RUFBNEU7QUFDNUUsK0VBQStFO0FBQy9FLDBFQUEwRTtBQUMxRSxpRkFBaUY7QUFDakYsNkVBQTZFO0FBQzdFLGlCQUFpQjtBQUVqQixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxPQUFPLE1BQU0sZUFBZSxDQUFDO0FBRXBDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSx3QkFBd0IsRUFBRSxNQUFNLFNBQVMsQ0FBQzs7QUFFNUUsTUFBTSxrQkFBa0IsR0FBRyxVQUFVLENBQUM7QUFFdEMsZUFBZTtBQUVmLE1BQU0sT0FBTyx1QkFBdUI7SUFDaEMsWUFBc0MsUUFBa0I7UUFBbEIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtJQUFHLENBQUM7SUFFNUQ7Ozs7OztPQU1HO0lBQ0ksbUJBQW1CLENBQ3RCLG9CQUFzQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFDeEQsV0FBbUIsd0JBQXdCO1FBRTNDLHlDQUF5QztRQUN6QyxJQUFJLG1CQUFtQixHQUE0QixTQUFTLENBQUM7UUFFN0QsSUFBSSxPQUFPLGlCQUFpQixLQUFLLFFBQVEsRUFBRTtZQUN2QyxNQUFNLE1BQU0sR0FDUixJQUFJLENBQUMs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QyxJQUFJLEVBQUU7WUFDeEMsMkRBQTJEO1lBQzNELGVBQWU7Z0JBQ1gsZUFBZSxDQUFDLGFBQWEsQ0FDekIsV0FBVyx1QkFBdUIsRUFBRSxDQUN2QyxJQUFJLFNBQVMsQ0FBQztTQUN0QjthQUFNO1lBQ0gsMkRBQTJEO1lBQzNELGVBQWU7Z0JBQ1gsZUFBZSxDQUFDLGFBQWEsQ0FBQyxJQUFJLHVCQUF1QixFQUFFLENBQUM7b0JBQzVELFNBQVMsQ0FBQztTQUNqQjtRQUVELElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDbEIsZUFBZSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3JELGVBQWUsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUN6Qix1QkFBdUIsRUFDdkIsdUJBQXVCLENBQzFCLENBQUM7WUFDRixlQUFlLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1NBQ2hEO1FBRUQsT0FBTyxlQUFlLENBQUM7SUFDM0IsQ0FBQzsrR0FoSVEsdUJBQXVCLGtCQUNaLFFBQVE7bUhBRG5CLHVCQUF1QixjQURWLE1BQU07OzRGQUNuQix1QkFBdUI7a0JBRG5DLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFOzswQkFFakIsTUFBTTsyQkFBQyxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiLy8gwqkgMjAyMiBTb2xhcldpbmRzIFdvcmxkd2lkZSwgTExDLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vICBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0b1xuLy8gIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlXG4vLyAgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yXG4vLyAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vICBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyAgYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vICBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vICBUSEUgU09GVFdBUkUuXG5cbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xuaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCBfaXNOdWxsIGZyb20gXCJsb2Rhc2gvaXNOdWxsXCI7XG5cbmltcG9ydCB7IE9WRVJMQVlfQ09OVEFJTkVSX0NMQVNTLCBPVkVSTEFZX0RFRkFVTFRfUFJJT1JJVFkgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG5jb25zdCBQUklPUklUWV9BVFRSSUJVVEUgPSBcInByaW9yaXR5XCI7XG5cbi8qKiBAZHluYW1pYyAqL1xuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiBcInJvb3RcIiB9KVxuZXhwb3J0IGNsYXNzIE92ZXJsYXlDb250YWluZXJTZXJ2aWNlIHtcbiAgICBjb25zdHJ1Y3RvcihASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIGRvY3VtZW50OiBEb2N1bWVudCkge31cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIHNoYXJlZCBjb250YWluZXIgdG8gYmUgdXNlZCBieSBhbGwgb3ZlcmxheXMgaWYgbmVlZGVkXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZWxlbWVudE9yU2VsZWN0b3IgLSBzcGVjaWZpZXMgdGhlIGNvbnRhaW5lciB3aGVyZSB0aGUgb3ZlcmxheSB3aWxsIGJlIGNyZWF0ZWRcbiAgICAgKiBAcGFyYW0gcHJpb3JpdHkgICAgICAgICAgLSB1c2VkIGZvciByZW5kZXJpbmcgb3ZlcmxheXMgYWJvdmUgb3IgYmVsb3cgb3RoZXJzXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvd2VyIHZhbHVlcyB3aWxsIGJlIHJlbmRlcmVkIGJlbG93IGhpZ2hlciBwcmlvcml0eSB2YWx1ZXMpXG4gICAgICovXG4gICAgcHVibGljIGdldE92ZXJsYXlDb250YWluZXIoXG4gICAgICAgIGVsZW1lbnRPclNlbGVjdG9yOiBFbGVtZW50IHwgc3RyaW5nID0gdGhpcy5kb2N1bWVudC5ib2R5LFxuICAgICAgICBwcmlvcml0eTogbnVtYmVyID0gT1ZFUkxBWV9ERUZBVUxUX1BSSU9SSVRZXG4gICAgKTogSFRNTEVsZW1lbnQge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWYtaW5pdFxuICAgICAgICBsZXQgZWxlbWVudEZyb21TZWxlY3RvcjogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBlbGVtZW50T3JTZWxlY3RvciA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBIVE1MRWxlbWVudCB8IG51bGwgPVxuICAgICAgICAgICAgICAgIHRoaXMuZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oZWxlbWVudE9yU2VsZWN0b3IpO1xuICAgICAgICAgICAgZWxlbWVudEZyb21TZWxlY3RvciA9ICFfaXNOdWxsKHJlc3VsdCkgPyByZXN1bHQgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgIGlmICghZWxlbWVudEZyb21TZWxlY3Rvcikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgYFNwZWNpZmllZCBvdmVybGF5IGNvbnRhaW5lciAnJHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRPclNlbGVjdG9yIHx8IFwiYm9keVwiXG4gICAgICAgICAgICAgICAgICAgIH0nIHdhcyBub3QgZm91bmQgaW4gdGhlIERPTS5gXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGFjY29yZGluZyBwcmlvcml0eSB0byBjdXN0b20gY29udGFpbmVyIHNlbGVjdG9yIHByb3ZpZGVkIGJ5IHVzZXIuXG4gICAgICAgIGNvbnN0IHRhcmdldENvbnRhaW5lcjogSFRNTEVsZW1lbnQgPVxuICAgICAgICAgICAgZWxlbWVudEZyb21TZWxlY3RvciA/P1xuICAgICAgICAgICAgPEhUTUxFbGVtZW50PmVsZW1lbnRPclNlbGVjdG9yID8/XG4gICAgICAgICAgICB0aGlzLmRvY3VtZW50LmJvZHk7XG4gICAgICAgIGNvbnN0IHNoYXJlZENvbnRhaW5lciA9IHRoaXMuY3JlYXRlU2hhcmVkQ29udGFpbmVyKHRhcmdldENvbnRhaW5lcik7XG5cbiAgICAgICAgbGV0IG92ZXJsYXlDb250YWluZXI6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xuXG4gICAgICAgIGNvbnN0IG92ZXJsYXlQcmlvcml0eUNsYXNzID0gXCJvdmVybGF5LWNvbnRhaW5lci1wcmlvcml0eVwiO1xuICAgICAgICBjb25zdCBkZXNpcmVkUHJpb3JpdHlDbGFzcyA9IHByaW9yaXR5LnRvU3RyaW5nKCkucGFkU3RhcnQoMywgXCIwXCIpO1xuICAgICAgICBsZXQgbGFzdFByaW9yaXR5RG9tRWw6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBvdmVybGF5czogTm9kZUxpc3RPZjxIVE1MRWxlbWVudD47XG5cbiAgICAgICAgaWYgKHRhcmdldENvbnRhaW5lciA9PT0gdGhpcy5kb2N1bWVudC5ib2R5KSB7XG4gICAgICAgICAgICBvdmVybGF5cyA9IHRoaXMuZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcbiAgICAgICAgICAgICAgICBgYm9keSA+IC5jZGstb3ZlcmxheS1jb250YWluZXIgPiAuJHtvdmVybGF5UHJpb3JpdHlDbGFzc31gXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb3ZlcmxheXMgPSBzaGFyZWRDb250YWluZXIucXVlcnlTZWxlY3RvckFsbChcbiAgICAgICAgICAgICAgICBgLiR7b3ZlcmxheVByaW9yaXR5Q2xhc3N9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGxvb3AgdGhyb3VnaCBhbGwgb3VyIHByaW9yaXRpZXMgaW4gY2FzZSB3ZSBoYXZlIGFueVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG92ZXJsYXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsYXN0UHJpb3JpdHlEb21FbCA9IG92ZXJsYXlzW2ldO1xuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgbGFzdFByaW9yaXR5RG9tRWwuZ2V0QXR0cmlidXRlKFBSSU9SSVRZX0FUVFJJQlVURSkgPT09XG4gICAgICAgICAgICAgICAgZGVzaXJlZFByaW9yaXR5Q2xhc3NcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIC8vIHdlIGFscmVhZHkgaGF2ZSBvdXIgcHJpb3JpdHkgY29udGFpbmVyXG4gICAgICAgICAgICAgICAgb3ZlcmxheUNvbnRhaW5lciA9IGxhc3RQcmlvcml0eURvbUVsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIHN0b3AgaWYgb3VyIHByaW9yaXR5IGlzIGhpZ2hlciB0aGFuIHRoZSBkZXNpcmVkIHByaW9yaXR5XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgKGxhc3RQcmlvcml0eURvbUVsLmdldEF0dHJpYnV0ZShQUklPUklUWV9BVFRSSUJVVEUpID8/IFwiXCIpID5cbiAgICAgICAgICAgICAgICBkZXNpcmVkUHJpb3JpdHlDbGFzc1xuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIW92ZXJsYXlDb250YWluZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IGRpdjogSFRNTEVsZW1lbnQgPSB0aGlzLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgICBkaXYuY2xhc3NMaXN0LmFkZChvdmVybGF5UHJpb3JpdHlDbGFzcyk7XG4gICAgICAgICAgICBkaXYuc2V0QXR0cmlidXRlKFBSSU9SSVRZX0FUVFJJQlVURSwgZGVzaXJlZFByaW9yaXR5Q2xhc3MpO1xuXG4gICAgICAgICAgICBpZiAoIWxhc3RQcmlvcml0eURvbUVsKSB7XG4gICAgICAgICAgICAgICAgLy8gY3JlYXRlIG91ciBwcmlvcml0eSBlbGVtZW50IGluIGNhc2Ugb3VyIHNoYXJlZCBjb250YWluZXIganVzdCBnb3QgY3JlYXRlZFxuICAgICAgICAgICAgICAgIC8vIGFuZCB3ZSBkb24ndCBoYXZlIGFueSBwcmlvcml0aWVzIHlldFxuICAgICAgICAgICAgICAgIG92ZXJsYXlDb250YWluZXIgPSBzaGFyZWRDb250YWluZXIuYXBwZW5kQ2hpbGQoZGl2KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gY3JlYXRlIG91ciBwcmlvcnkgZWxlbWVudCBiZWZvcmUgb3IgYWZ0ZXIgdGhlIGxhc3QgcHJpb3JpdHkgRE9NIGVsZW1lbnRcbiAgICAgICAgICAgICAgICAvLyBkZXBlbmRpbmcgb24gdGhlIGRlc2lyZWQgcHJpb3JpdHlcbiAgICAgICAgICAgICAgICBvdmVybGF5Q29udGFpbmVyID0gbGFzdFByaW9yaXR5RG9tRWwuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KFxuICAgICAgICAgICAgICAgICAgICAobGFzdFByaW9yaXR5RG9tRWwuZ2V0QXR0cmlidXRlKFBSSU9SSVRZX0FUVFJJQlVURSkgPz8gXCJcIikgPlxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzaXJlZFByaW9yaXR5Q2xhc3NcbiAgICAgICAgICAgICAgICAgICAgICAgID8gXCJiZWZvcmViZWdpblwiXG4gICAgICAgICAgICAgICAgICAgICAgICA6IFwiYWZ0ZXJlbmRcIixcbiAgICAgICAgICAgICAgICAgICAgZGl2XG4gICAgICAgICAgICAgICAgKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvdmVybGF5Q29udGFpbmVyO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlU2hhcmVkQ29udGFpbmVyKHRhcmdldENvbnRhaW5lcjogRWxlbWVudCk6IEVsZW1lbnQge1xuICAgICAgICBsZXQgc2hhcmVkQ29udGFpbmVyOiBFbGVtZW50IHwgdW5kZWZpbmVkO1xuXG4gICAgICAgIGlmICh0YXJnZXRDb250YWluZXIgPT09IHRoaXMuZG9jdW1lbnQuYm9keSkge1xuICAgICAgICAgICAgLy8gY3JlYXRlIHNoYXJlZCBjb250YWluZXIgb25seSBpZiBpdCBkb2Vzbid0IGV4aXN0IGFscmVhZHlcbiAgICAgICAgICAgIHNoYXJlZENvbnRhaW5lciA9XG4gICAgICAgICAgICAgICAgdGFyZ2V0Q29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgICAgICAgICAgICAgIGBib2R5ID4gLiR7T1ZFUkxBWV9DT05UQUlORVJfQ0xBU1N9YFxuICAgICAgICAgICAgICAgICkgPz8gdW5kZWZpbmVkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gY3JlYXRlIHNoYXJlZCBjb250YWluZXIgb25seSBpZiBpdCBkb2Vzbid0IGV4aXN0IGFscmVhZHlcbiAgICAgICAgICAgIHNoYXJlZENvbnRhaW5lciA9XG4gICAgICAgICAgICAgICAgdGFyZ2V0Q29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoYC4ke09WRVJMQVlfQ09OVEFJTkVSX0NMQVNTfWApID8/XG4gICAgICAgICAgICAgICAgdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFzaGFyZWRDb250YWluZXIpIHtcbiAgICAgICAgICAgIHNoYXJlZENvbnRhaW5lciA9IHRoaXMuZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgICAgIHNoYXJlZENvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFxuICAgICAgICAgICAgICAgIE9WRVJMQVlfQ09OVEFJTkVSX0NMQVNTLFxuICAgICAgICAgICAgICAgIFwiY2RrLW92ZXJsYXktY29udGFpbmVyXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0YXJnZXRDb250YWluZXIuYXBwZW5kQ2hpbGQoc2hhcmVkQ29udGFpbmVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzaGFyZWRDb250YWluZXI7XG4gICAgfVxufVxuIl19