@versatiledatakit/shared
Version:
Versatile Data Kit Shared library enables reusability of shared features like: NgRx Redux, Error Handlers, Utils, Generic Components, etc.
242 lines • 31.8 kB
JavaScript
/*
* Copyright 2023-2025 Broadcom
* SPDX-License-Identifier: Apache-2.0
*/
import { Injectable } from '@angular/core';
import { CollectionsUtil } from '../../../utils';
import { TaurusObject } from '../../../common';
import { getApiFormattedErrorMessage } from '../../../core';
import * as i0 from "@angular/core";
export class PlaceholderService extends TaurusObject {
/**
* ** Constructor.
*/
constructor(renderer2) {
super(PlaceholderService.CLASS_NAME);
this.renderer2 = renderer2;
// lookup flags
this._lookupInProgress = false;
this._isGridParentFound = false;
this._hideDefaultEmptyStateImageInGrid = false;
this._gridRandomAttribute = CollectionsUtil.generateRandomString();
this._standalonePlaceholderRandomAttribute = CollectionsUtil.generateRandomString();
}
/**
* ** Extract public name of classes from multiple error records.
*/
static extractClassesPublicNames(errorRecords) {
const publicNames = errorRecords
.map((r) => PlaceholderService.extractClassPublicName(r))
.filter((publicName) => CollectionsUtil.isString(publicName) && publicName.length > 0);
return CollectionsUtil.uniqueArray(publicNames).join(', ');
}
/**
* ** Extract class public name from provided error record.
*/
static extractClassPublicName(errorRecord) {
if (errorRecord) {
if (errorRecord.code && errorRecord.code.length > 0) {
/**
* class public name is second with underscore following pattern described in {@link ErrorRecord.code}
*/
const codeChunks = errorRecord.code.split('_');
if (codeChunks.length >= 3) {
const publicName = codeChunks[1];
if (publicName && publicName.length > 2) {
const publicNameNormalized = publicName.replace(/-/g, ' ');
return publicNameNormalized.substring(0, 1).toUpperCase() + publicNameNormalized.substring(1).toLowerCase();
}
}
}
}
return '';
}
/**
* ** Refines elements state and their corresponding styles.
*/
refineElementsState(elementRef, hideDefaultEmptyStateImageInGrid) {
if (CollectionsUtil.isDefined(elementRef)) {
this._elementRef = elementRef;
}
if (CollectionsUtil.isDefined(hideDefaultEmptyStateImageInGrid)) {
this._hideDefaultEmptyStateImageInGrid = hideDefaultEmptyStateImageInGrid;
}
if (this._lookupInProgress) {
return;
}
if (!this._isGridParentFound) {
this._lookupInProgress = true;
this._findHeadElement();
this._findPlaceholderParentGrid()
.then((placeholderGridParent) => {
this._isGridParentFound = !!placeholderGridParent;
this._removeStandalonePlaceholderStyle();
this._appendGridPlaceholderStyle();
this._addGridDataAttribute(placeholderGridParent);
this._toggleGridPlaceholderStyle();
})
.catch((_error) => {
this._isGridParentFound = false;
this._removeGridPlaceholderStyle();
this._appendStandalonePlaceholderStyle();
this._addStandalonePlaceholderDataAttribute();
this._toggleStandalonePlaceholderStyle();
})
.finally(() => {
this._lookupInProgress = false;
});
}
else {
this._toggleGridPlaceholderStyle();
this._toggleStandalonePlaceholderStyle();
}
}
/**
* ** Get API formatted error message from provided Error.
*/
extractErrorInformation(error) {
return getApiFormattedErrorMessage(error);
}
/**
* @inheritDoc
*/
ngOnDestroy() {
if (this._finderLookupTimeoutRef) {
window.clearTimeout(this._finderLookupTimeoutRef);
}
this._removeGridPlaceholderStyle();
this._removeStandalonePlaceholderStyle();
super.ngOnDestroy();
}
_findPlaceholderParentGrid() {
let parentElementFinderAttempts = 0;
let resolveRef;
let rejectRef;
const parentFinder = () => {
parentElementFinderAttempts++;
const firstLevelParent = this.renderer2.parentNode(this._elementRef.nativeElement);
if (firstLevelParent) {
const foundParentGrid = this._traverseToFindParentGrid(firstLevelParent);
if (foundParentGrid) {
resolveRef(foundParentGrid);
}
else {
rejectRef('Cannot find parent grid (clr-datagrid)!');
}
}
else if (parentElementFinderAttempts < 200) {
this._finderLookupTimeoutRef = window.setTimeout(() => {
this._finderLookupTimeoutRef = null;
parentFinder();
}, 25);
}
else {
rejectRef('Cannot find parent grid (clr-datagrid)!');
}
};
return new Promise((resolve, reject) => {
resolveRef = resolve;
rejectRef = reject;
parentFinder();
});
}
_traverseToFindParentGrid(element) {
let loop = 0;
let parentElement = element;
while (loop < 15) {
if (parentElement) {
loop++;
if (!parentElement.tagName) {
break;
}
if (parentElement.tagName.toLowerCase() === 'clr-datagrid') {
return parentElement;
}
parentElement = this.renderer2.parentNode(parentElement);
}
else {
break;
}
}
return null;
}
_findHeadElement() {
if (this._headElement) {
return;
}
this._headElement = document.querySelector('head');
}
_appendGridPlaceholderStyle() {
if (!this._gridStyleElement) {
this._gridStyleElement = this.renderer2.createElement('style');
this.renderer2.setAttribute(this._gridStyleElement, 'data-shared-grid-style', this._gridRandomAttribute);
this.renderer2.appendChild(this._headElement, this._gridStyleElement);
}
}
_appendStandalonePlaceholderStyle() {
if (!this._standalonePlaceholderStyleElement) {
this._standalonePlaceholderStyleElement = this.renderer2.createElement('style');
this.renderer2.setAttribute(this._standalonePlaceholderStyleElement, 'data-shared-placeholder-style', this._standalonePlaceholderRandomAttribute);
this.renderer2.appendChild(this._headElement, this._standalonePlaceholderStyleElement);
}
}
_addGridDataAttribute(element) {
if (!element) {
return;
}
this.renderer2.setAttribute(element, 'data-shared-grid', this._gridRandomAttribute);
}
_addStandalonePlaceholderDataAttribute() {
if (!this._elementRef.nativeElement) {
return;
}
this.renderer2.setAttribute(this._elementRef.nativeElement, 'data-shared-placeholder', this._standalonePlaceholderRandomAttribute);
}
_toggleGridPlaceholderStyle() {
if (!this._gridStyleElement) {
return;
}
this._gridStyleElement.innerHTML = `
clr-datagrid[data-shared-grid="${this._gridRandomAttribute}"] clr-dg-placeholder .datagrid-placeholder.datagrid-empty {
justify-content: center;
}
clr-datagrid[data-shared-grid="${this._gridRandomAttribute}"] clr-dg-placeholder .datagrid-placeholder-image {
display: ${this._hideDefaultEmptyStateImageInGrid ? 'none' : 'block'};
}
`;
}
_toggleStandalonePlaceholderStyle() {
if (!this._standalonePlaceholderStyleElement) {
return;
}
this._standalonePlaceholderStyleElement.innerHTML = `
shared-placeholder[data-shared-placeholder="${this._standalonePlaceholderRandomAttribute}"] {
margin-top: 5rem;
}
`;
}
_removeGridPlaceholderStyle() {
if (this._gridStyleElement) {
this.renderer2.removeChild(this._headElement, this._gridStyleElement);
}
}
_removeStandalonePlaceholderStyle() {
if (this._standalonePlaceholderStyleElement) {
this.renderer2.removeChild(this._headElement, this._standalonePlaceholderStyleElement);
}
}
}
/**
* @inheritDoc
*/
PlaceholderService.CLASS_NAME = 'PlaceholderService';
/**
* @inheritDoc
*/
PlaceholderService.PUBLIC_NAME = 'Placeholder-Service';
PlaceholderService.ɵfac = function PlaceholderService_Factory(t) { return new (t || PlaceholderService)(i0.ɵɵinject(i0.Renderer2)); };
PlaceholderService.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: PlaceholderService, factory: PlaceholderService.ɵfac });
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PlaceholderService, [{
type: Injectable
}], function () { return [{ type: i0.Renderer2 }]; }, null); })();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhY2Vob2xkZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NoYXJlZC9zcmMvbGliL2ZlYXR1cmVzL3BsYWNlaG9sZGVyL3NlcnZpY2VzL3BsYWNlaG9sZGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsT0FBTyxFQUFjLFVBQVUsRUFBd0IsTUFBTSxlQUFlLENBQUM7QUFFN0UsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWpELE9BQU8sRUFBZ0MsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFN0UsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUc1RCxNQUFNLE9BQU8sa0JBQW1CLFNBQVEsWUFBWTtJQTZCaEQ7O09BRUc7SUFDSCxZQUE2QixTQUFvQjtRQUM3QyxLQUFLLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFEWixjQUFTLEdBQVQsU0FBUyxDQUFXO1FBckJqRCxlQUFlO1FBQ1Asc0JBQWlCLEdBQUcsS0FBSyxDQUFDO1FBQzFCLHVCQUFrQixHQUFHLEtBQUssQ0FBQztRQWMzQixzQ0FBaUMsR0FBRyxLQUFLLENBQUM7UUFROUMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLGVBQWUsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQ25FLElBQUksQ0FBQyxxQ0FBcUMsR0FBRyxlQUFlLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztJQUN4RixDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNLENBQUMseUJBQXlCLENBQUMsWUFBMkI7UUFDeEQsTUFBTSxXQUFXLEdBQUcsWUFBWTthQUMzQixHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLGtCQUFrQixDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3hELE1BQU0sQ0FBQyxDQUFDLFVB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Y29tXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5cbmltcG9ydCB7IEVsZW1lbnRSZWYsIEluamVjdGFibGUsIE9uRGVzdHJveSwgUmVuZGVyZXIyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IENvbGxlY3Rpb25zVXRpbCB9IGZyb20gJy4uLy4uLy4uL3V0aWxzJztcblxuaW1wb3J0IHsgQXBpRXJyb3JNZXNzYWdlLCBFcnJvclJlY29yZCwgVGF1cnVzT2JqZWN0IH0gZnJvbSAnLi4vLi4vLi4vY29tbW9uJztcblxuaW1wb3J0IHsgZ2V0QXBpRm9ybWF0dGVkRXJyb3JNZXNzYWdlIH0gZnJvbSAnLi4vLi4vLi4vY29yZSc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBQbGFjZWhvbGRlclNlcnZpY2UgZXh0ZW5kcyBUYXVydXNPYmplY3QgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgc3RhdGljIG92ZXJyaWRlIHJlYWRvbmx5IENMQVNTX05BTUU6IHN0cmluZyA9ICdQbGFjZWhvbGRlclNlcnZpY2UnO1xuXG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBzdGF0aWMgb3ZlcnJpZGUgcmVhZG9ubHkgUFVCTElDX05BTUU6IHN0cmluZyA9ICdQbGFjZWhvbGRlci1TZXJ2aWNlJztcblxuICAgIC8vIGxvb2t1cCBmbGFnc1xuICAgIHByaXZhdGUgX2xvb2t1cEluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9pc0dyaWRQYXJlbnRGb3VuZCA9IGZhbHNlO1xuICAgIHByaXZhdGUgX2ZpbmRlckxvb2t1cFRpbWVvdXRSZWY6IG51bWJlcjtcblxuICAgIC8vIHN0eWxpbmcgZWxlbWVudHNcbiAgICBwcml2YXRlIF9oZWFkRWxlbWVudDogSFRNTEhlYWRFbGVtZW50O1xuICAgIHByaXZhdGUgX2dyaWRTdHlsZUVsZW1lbnQ6IEhUTUxTdHlsZUVsZW1lbnQ7XG4gICAgcHJpdmF0ZSBfc3RhbmRhbG9uZVBsYWNlaG9sZGVyU3R5bGVFbGVtZW50OiBIVE1MRWxlbWVudDtcblxuICAgIC8vIHV0aWxpdHlcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9ncmlkUmFuZG9tQXR0cmlidXRlOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSByZWFkb25seSBfc3RhbmRhbG9uZVBsYWNlaG9sZGVyUmFuZG9tQXR0cmlidXRlOiBzdHJpbmc7XG5cbiAgICAvLyB0ZW1wb3Jhcnkgc3RvcmFnZVxuICAgIHByaXZhdGUgX2VsZW1lbnRSZWY6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuICAgIHByaXZhdGUgX2hpZGVEZWZhdWx0RW1wdHlTdGF0ZUltYWdlSW5HcmlkID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiAqKiBDb25zdHJ1Y3Rvci5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHJlbmRlcmVyMjogUmVuZGVyZXIyKSB7XG4gICAgICAgIHN1cGVyKFBsYWNlaG9sZGVyU2VydmljZS5DTEFTU19OQU1FKTtcblxuICAgICAgICB0aGlzLl9ncmlkUmFuZG9tQXR0cmlidXRlID0gQ29sbGVjdGlvbnNVdGlsLmdlbmVyYXRlUmFuZG9tU3RyaW5nKCk7XG4gICAgICAgIHRoaXMuX3N0YW5kYWxvbmVQbGFjZWhvbGRlclJhbmRvbUF0dHJpYnV0ZSA9IENvbGxlY3Rpb25zVXRpbC5nZW5lcmF0ZVJhbmRvbVN0cmluZygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICoqIEV4dHJhY3QgcHVibGljIG5hbWUgb2YgY2xhc3NlcyBmcm9tIG11bHRpcGxlIGVycm9yIHJlY29yZHMuXG4gICAgICovXG4gICAgc3RhdGljIGV4dHJhY3RDbGFzc2VzUHVibGljTmFtZXMoZXJyb3JSZWNvcmRzOiBFcnJvclJlY29yZFtdKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgcHVibGljTmFtZXMgPSBlcnJvclJlY29yZHNcbiAgICAgICAgICAgIC5tYXAoKHIpID0+IFBsYWNlaG9sZGVyU2VydmljZS5leHRyYWN0Q2xhc3NQdWJsaWNOYW1lKHIpKVxuICAgICAgICAgICAgLmZpbHRlcigocHVibGljTmFtZSkgPT4gQ29sbGVjdGlvbnNVdGlsLmlzU3RyaW5nKHB1YmxpY05hbWUpICYmIHB1YmxpY05hbWUubGVuZ3RoID4gMCk7XG5cbiAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zVXRpbC51bmlxdWVBcnJheShwdWJsaWNOYW1lcykuam9pbignLCAnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAqKiBFeHRyYWN0IGNsYXNzIHB1YmxpYyBuYW1lIGZyb20gcHJvdmlkZWQgZXJyb3IgcmVjb3JkLlxuICAgICAqL1xuICAgIHN0YXRpYyBleHRyYWN0Q2xhc3NQdWJsaWNOYW1lKGVycm9yUmVjb3JkOiBFcnJvclJlY29yZCk6IHN0cmluZyB7XG4gICAgICAgIGlmIChlcnJvclJlY29yZCkge1xuICAgICAgICAgICAgaWYgKGVycm9yUmVjb3JkLmNvZGUgJiYgZXJyb3JSZWNvcmQuY29kZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICogY2xhc3MgcHVibGljIG5hbWUgaXMgc2Vjb25kIHdpdGggdW5kZXJzY29yZSBmb2xsb3dpbmcgcGF0dGVybiBkZXNjcmliZWQgaW4ge0BsaW5rIEVycm9yUmVjb3JkLmNvZGV9XG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgY29uc3QgY29kZUNodW5rcyA9IGVycm9yUmVjb3JkLmNvZGUuc3BsaXQoJ18nKTtcblxuICAgICAgICAgICAgICAgIGlmIChjb2RlQ2h1bmtzLmxlbmd0aCA+PSAzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHB1YmxpY05hbWUgPSBjb2RlQ2h1bmtzWzFdO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwdWJsaWNOYW1lICYmIHB1YmxpY05hbWUubGVuZ3RoID4gMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHVibGljTmFtZU5vcm1hbGl6ZWQgPSBwdWJsaWNOYW1lLnJlcGxhY2UoLy0vZywgJyAnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHB1YmxpY05hbWVOb3JtYWxpemVkLnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZSgpICsgcHVibGljTmFtZU5vcm1hbGl6ZWQuc3Vic3RyaW5nKDEpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogKiogUmVmaW5lcyBlbGVtZW50cyBzdGF0ZSBhbmQgdGhlaXIgY29ycmVzcG9uZGluZyBzdHlsZXMuXG4gICAgICovXG4gICAgcmVmaW5lRWxlbWVudHNTdGF0ZShlbGVtZW50UmVmOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PiwgaGlkZURlZmF1bHRFbXB0eVN0YXRlSW1hZ2VJbkdyaWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgaWYgKENvbGxlY3Rpb25zVXRpbC5pc0RlZmluZWQoZWxlbWVudFJlZikpIHtcbiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnRSZWYgPSBlbGVtZW50UmVmO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKENvbGxlY3Rpb25zVXRpbC5pc0RlZmluZWQoaGlkZURlZmF1bHRFbXB0eVN0YXRlSW1hZ2VJbkdyaWQpKSB7XG4gICAgICAgICAgICB0aGlzLl9oaWRlRGVmYXVsdEVtcHR5U3RhdGVJbWFnZUluR3JpZCA9IGhpZGVEZWZhdWx0RW1wdHlTdGF0ZUltYWdlSW5HcmlkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2xvb2t1cEluUHJvZ3Jlc3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5faXNHcmlkUGFyZW50Rm91bmQpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvb2t1cEluUHJvZ3Jlc3MgPSB0cnVlO1xuXG4gICAgICAgICAgICB0aGlzLl9maW5kSGVhZEVsZW1lbnQoKTtcblxuICAgICAgICAgICAgdGhpcy5fZmluZFBsYWNlaG9sZGVyUGFyZW50R3JpZCgpXG4gICAgICAgICAgICAgICAgLnRoZW4oKHBsYWNlaG9sZGVyR3JpZFBhcmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0dyaWRQYXJlbnRGb3VuZCA9ICEhcGxhY2Vob2xkZXJHcmlkUGFyZW50O1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlbW92ZVN0YW5kYWxvbmVQbGFjZWhvbGRlclN0eWxlKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYXBwZW5kR3JpZFBsYWNlaG9sZGVyU3R5bGUoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYWRkR3JpZERhdGFBdHRyaWJ1dGUocGxhY2Vob2xkZXJHcmlkUGFyZW50KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdG9nZ2xlR3JpZFBsYWNlaG9sZGVyU3R5bGUoKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaCgoX2Vycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzR3JpZFBhcmVudEZvdW5kID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVtb3ZlR3JpZFBsYWNlaG9sZGVyU3R5bGUoKTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hcHBlbmRTdGFuZGFsb25lUGxhY2Vob2xkZXJTdHlsZSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hZGRTdGFuZGFsb25lUGxhY2Vob2xkZXJEYXRhQXR0cmlidXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RvZ2dsZVN0YW5kYWxvbmVQbGFjZWhvbGRlclN0eWxlKCk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuZmluYWxseSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xvb2t1cEluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3RvZ2dsZUdyaWRQbGFjZWhvbGRlclN0eWxlKCk7XG4gICAgICAgICAgICB0aGlzLl90b2dnbGVTdGFuZGFsb25lUGxhY2Vob2xkZXJTdHlsZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogKiogR2V0IEFQSSBmb3JtYXR0ZWQgZXJyb3IgbWVzc2FnZSBmcm9tIHByb3ZpZGVkIEVycm9yLlxuICAgICAqL1xuICAgIGV4dHJhY3RFcnJvckluZm9ybWF0aW9uKGVycm9yOiBFcnJvcik6IEFwaUVycm9yTWVzc2FnZSB7XG4gICAgICAgIHJldHVybiBnZXRBcGlGb3JtYXR0ZWRFcnJvck1lc3NhZ2UoZXJyb3IpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgb3ZlcnJpZGUgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLl9maW5kZXJMb29rdXBUaW1lb3V0UmVmKSB7XG4gICAgICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuX2ZpbmRlckxvb2t1cFRpbWVvdXRSZWYpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fcmVtb3ZlR3JpZFBsYWNlaG9sZGVyU3R5bGUoKTtcbiAgICAgICAgdGhpcy5fcmVtb3ZlU3RhbmRhbG9uZVBsYWNlaG9sZGVyU3R5bGUoKTtcblxuICAgICAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2ZpbmRQbGFjZWhvbGRlclBhcmVudEdyaWQoKTogUHJvbWlzZTxIVE1MRWxlbWVudD4ge1xuICAgICAgICBsZXQgcGFyZW50RWxlbWVudEZpbmRlckF0dGVtcHRzID0gMDtcblxuICAgICAgICBsZXQgcmVzb2x2ZVJlZjogKHZhbHVlOiBIVE1MRWxlbWVudCkgPT4gdm9pZDtcbiAgICAgICAgbGV0IHJlamVjdFJlZjogKHJlYXNvbjogc3RyaW5nKSA9PiB2b2lkO1xuXG4gICAgICAgIGNvbnN0IHBhcmVudEZpbmRlciA9ICgpID0+IHtcbiAgICAgICAgICAgIHBhcmVudEVsZW1lbnRGaW5kZXJBdHRlbXB0cysrO1xuXG4gICAgICAgICAgICBjb25zdCBmaXJzdExldmVsUGFyZW50OiBIVE1MRWxlbWVudCA9IHRoaXMucmVuZGVyZXIyLnBhcmVudE5vZGUodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgIGlmIChmaXJzdExldmVsUGFyZW50KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZm91bmRQYXJlbnRHcmlkID0gdGhpcy5fdHJhdmVyc2VUb0ZpbmRQYXJlbnRHcmlkKGZpcnN0TGV2ZWxQYXJlbnQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGZvdW5kUGFyZW50R3JpZCkge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlUmVmKGZvdW5kUGFyZW50R3JpZCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0UmVmKCdDYW5ub3QgZmluZCBwYXJlbnQgZ3JpZCAoY2xyLWRhdGFncmlkKSEnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmVudEVsZW1lbnRGaW5kZXJBdHRlbXB0cyA8IDIwMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2ZpbmRlckxvb2t1cFRpbWVvdXRSZWYgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2ZpbmRlckxvb2t1cFRpbWVvdXRSZWYgPSBudWxsO1xuXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudEZpbmRlcigpO1xuICAgICAgICAgICAgICAgIH0sIDI1KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0UmVmKCdDYW5ub3QgZmluZCBwYXJlbnQgZ3JpZCAoY2xyLWRhdGFncmlkKSEnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZVJlZiA9IHJlc29sdmU7XG4gICAgICAgICAgICByZWplY3RSZWYgPSByZWplY3Q7XG5cbiAgICAgICAgICAgIHBhcmVudEZpbmRlcigpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF90cmF2ZXJzZVRvRmluZFBhcmVudEdyaWQoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBIVE1MRWxlbWVudCB7XG4gICAgICAgIGxldCBsb29wID0gMDtcbiAgICAgICAgbGV0IHBhcmVudEVsZW1lbnQ6IEhUTUxFbGVtZW50ID0gZWxlbWVudDtcblxuICAgICAgICB3aGlsZSAobG9vcCA8IDE1KSB7XG4gICAgICAgICAgICBpZiAocGFyZW50RWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGxvb3ArKztcblxuICAgICAgICAgICAgICAgIGlmICghcGFyZW50RWxlbWVudC50YWdOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChwYXJlbnRFbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2Nsci1kYXRhZ3JpZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcmVudEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcGFyZW50RWxlbWVudCA9IHRoaXMucmVuZGVyZXIyLnBhcmVudE5vZGUocGFyZW50RWxlbWVudCkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZmluZEhlYWRFbGVtZW50KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5faGVhZEVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2hlYWRFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaGVhZCcpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2FwcGVuZEdyaWRQbGFjZWhvbGRlclN0eWxlKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuX2dyaWRTdHlsZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX2dyaWRTdHlsZUVsZW1lbnQgPSB0aGlzLnJlbmRlcmVyMi5jcmVhdGVFbGVtZW50KCdzdHlsZScpIGFzIEhUTUxTdHlsZUVsZW1lbnQ7XG5cbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIyLnNldEF0dHJpYnV0ZSh0aGlzLl9ncmlkU3R5bGVFbGVtZW50LCAnZGF0YS1zaGFyZWQtZ3JpZC1zdHlsZScsIHRoaXMuX2dyaWRSYW5kb21BdHRyaWJ1dGUpO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlcjIuYXBwZW5kQ2hpbGQodGhpcy5faGVhZEVsZW1lbnQsIHRoaXMuX2dyaWRTdHlsZUVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfYXBwZW5kU3RhbmRhbG9uZVBsYWNlaG9sZGVyU3R5bGUoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5fc3RhbmRhbG9uZVBsYWNlaG9sZGVyU3R5bGVFbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLl9zdGFuZGFsb25lUGxhY2Vob2xkZXJTdHlsZUVsZW1lbnQgPSB0aGlzLnJlbmRlcmVyMi5jcmVhdGVFbGVtZW50KCdzdHlsZScpIGFzIEhUTUxTdHlsZUVsZW1lbnQ7XG5cbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIyLnNldEF0dHJpYnV0ZShcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGFuZGFsb25lUGxhY2Vob2xkZXJTdHlsZUVsZW1lbnQsXG4gICAgICAgICAgICAgICAgJ2RhdGEtc2hhcmVkLXBsYWNlaG9sZGVyLXN0eWxlJyxcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGFuZGFsb25lUGxhY2Vob2xkZXJSYW5kb21BdHRyaWJ1dGVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyMi5hcHBlbmRDaGlsZCh0aGlzLl9oZWFkRWxlbWVudCwgdGhpcy5fc3RhbmRhbG9uZVBsYWNlaG9sZGVyU3R5bGVFbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX2FkZEdyaWREYXRhQXR0cmlidXRlKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgICAgIGlmICghZWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZW5kZXJlcjIuc2V0QXR0cmlidXRlKGVsZW1lbnQsICdkYXRhLXNoYXJlZC1ncmlkJywgdGhpcy5fZ3JpZFJhbmRvbUF0dHJpYnV0ZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfYWRkU3RhbmRhbG9uZVBsYWNlaG9sZGVyRGF0YUF0dHJpYnV0ZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVuZGVyZXIyLnNldEF0dHJpYnV0ZSh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdkYXRhLXNoYXJlZC1wbGFjZWhvbGRlcicsIHRoaXMuX3N0YW5kYWxvbmVQbGFjZWhvbGRlclJhbmRvbUF0dHJpYnV0ZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfdG9nZ2xlR3JpZFBsYWNlaG9sZGVyU3R5bGUoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5fZ3JpZFN0eWxlRWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fZ3JpZFN0eWxlRWxlbWVudC5pbm5lckhUTUwgPSBgXG4gICAgICAgICAgICBjbHItZGF0YWdyaWRbZGF0YS1zaGFyZWQtZ3JpZD1cIiR7dGhpcy5fZ3JpZFJhbmRvbUF0dHJpYnV0ZX1cIl0gY2xyLWRnLXBsYWNlaG9sZGVyIC5kYXRhZ3JpZC1wbGFjZWhvbGRlci5kYXRhZ3JpZC1lbXB0eSB7XG4gICAgICAgICAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjbHItZGF0YWdyaWRbZGF0YS1zaGFyZWQtZ3JpZD1cIiR7dGhpcy5fZ3JpZFJhbmRvbUF0dHJpYnV0ZX1cIl0gY2xyLWRnLXBsYWNlaG9sZGVyIC5kYXRhZ3JpZC1wbGFjZWhvbGRlci1pbWFnZSB7XG4gICAgICAgICAgICAgICAgZGlzcGxheTogJHt0aGlzLl9oaWRlRGVmYXVsdEVtcHR5U3RhdGVJbWFnZUluR3JpZCA/ICdub25lJyA6ICdibG9jayd9O1xuICAgICAgICAgICAgfVxuICAgICAgICBgO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3RvZ2dsZVN0YW5kYWxvbmVQbGFjZWhvbGRlclN0eWxlKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuX3N0YW5kYWxvbmVQbGFjZWhvbGRlclN0eWxlRWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fc3RhbmRhbG9uZVBsYWNlaG9sZGVyU3R5bGVFbGVtZW50LmlubmVySFRNTCA9IGBcbiAgICAgICAgICAgIHNoYXJlZC1wbGFjZWhvbGRlcltkYXRhLXNoYXJlZC1wbGFjZWhvbGRlcj1cIiR7dGhpcy5fc3RhbmRhbG9uZVBsYWNlaG9sZGVyUmFuZG9tQXR0cmlidXRlfVwiXSB7XG4gICAgICAgICAgICAgICAgbWFyZ2luLXRvcDogNXJlbTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgYDtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9yZW1vdmVHcmlkUGxhY2Vob2xkZXJTdHlsZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuX2dyaWRTdHlsZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIyLnJlbW92ZUNoaWxkKHRoaXMuX2hlYWRFbGVtZW50LCB0aGlzLl9ncmlkU3R5bGVFbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX3JlbW92ZVN0YW5kYWxvbmVQbGFjZWhvbGRlclN0eWxlKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5fc3RhbmRhbG9uZVBsYWNlaG9sZGVyU3R5bGVFbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyMi5yZW1vdmVDaGlsZCh0aGlzLl9oZWFkRWxlbWVudCwgdGhpcy5fc3RhbmRhbG9uZVBsYWNlaG9sZGVyU3R5bGVFbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ==