UNPKG

systelab-components

Version:

systelab-components is a set of components that use wide accepted and adopted standard technologies like Angular and Bootstrap, as well as other popular libraries. Please read the ATTRIBUTION.md file for a complete list of dependencies.

245 lines 34.3 kB
import { Directive, EventEmitter, HostListener, Input, Output, ViewChild } from '@angular/core'; import * as i0 from "@angular/core"; export class AbstractContextComponent { constructor(el, myRenderer, cdr) { this.el = el; this.myRenderer = myRenderer; this.cdr = cdr; this.action = new EventEmitter(); this.elementID = (Math.floor(Math.random() * (999999999999 - 1))).toString(); this.isEmbedded = false; this.overflow = false; this.isOpened = false; this.previousShownMenu = []; this.previousMenuWidth = []; this.lastMenuLevel = 0; } ngOnInit() { jQuery(this.dropdownParent.nativeElement) .on('hide.bs.dropdown', this.actionsAfterCloseDropDown.bind(this)); } onResize(event) { if (this.isDropDownOpened()) { this.closeDropDown(); } } isDropDownOpened() { return this.dropdownParent.nativeElement.className.includes('show'); } loop(x, y) { if (this.isDropDownOpened()) { this.myRenderer.setStyle(this.dropdownMenuElement.nativeElement, 'position', 'fixed'); if (this.isEmbedded) { this.myRenderer.setStyle(this.dropdownMenuElement.nativeElement, 'transform', 'unset'); } this.myRenderer.setStyle(this.dropdownElement.nativeElement, 'position', 'absolute'); y = y - this.dropdownParent.nativeElement.offsetHeight; if (y + this.dropdownElement.nativeElement.offsetHeight > window.innerHeight) { y = y - this.dropdownElement.nativeElement.offsetHeight; if (y < 0) { y = 0; } } if (x + this.dropdownElement.nativeElement.offsetWidth > window.innerWidth) { x = x - this.dropdownElement.nativeElement.offsetWidth; } this.myRenderer.setStyle(this.dropdownElement.nativeElement, 'top', y + 'px'); this.myRenderer.setStyle(this.dropdownElement.nativeElement, 'left', x + 'px'); this.myRenderer.setStyle(this.dropdownMenuElement.nativeElement, 'visibility', 'visible'); this.addListeners(); } else { setTimeout(() => this.loop(x, y), 10); } } showDropDown(x, y) { setTimeout(() => this.loop(x, y), 10); } resetDropDownPositionAndHeight() { this.myRenderer.setStyle(this.dropdownElement.nativeElement, 'top', null); this.myRenderer.setStyle(this.dropdownElement.nativeElement, 'left', null); } getFirstChildLeft(selectedChild) { let firstChildLeft = this.dropdownElement.nativeElement.offsetWidth + 15; const firstChildAbsoluteLeft = this.dropdownElement.nativeElement.offsetLeft; if (firstChildAbsoluteLeft + this.dropdownElement.nativeElement.offsetWidth + selectedChild.nativeElement.offsetWidth > window.innerWidth) { firstChildLeft = -selectedChild.nativeElement.offsetWidth + 10; } return firstChildLeft; } getFirstChildLeftWithLevels(selectedChild, optionLevel, previousMenuWidth) { let firstChildLeft; let accumulativeLeft = 0; const firstChildAbsoluteLeft = this.dropdownElement.nativeElement.offsetLeft; if (optionLevel < 1) { firstChildLeft = this.dropdownElement.nativeElement.offsetWidth + 12; } else { firstChildLeft = previousMenuWidth[optionLevel - 1] + 12; for (let i = 0; i < optionLevel; i++) { accumulativeLeft = accumulativeLeft + previousMenuWidth[i]; } } if (firstChildAbsoluteLeft + this.dropdownElement.nativeElement.offsetWidth + accumulativeLeft + selectedChild.nativeElement.offsetWidth > window.innerWidth) { firstChildLeft = -selectedChild.nativeElement.offsetWidth + 15; } return firstChildLeft; } getFirstChildTop(event, selectedChild) { const firstChildAbsoluteTop = event.clientY; let firstChildRelativeTop = event.target.offsetTop; if (firstChildAbsoluteTop + selectedChild.nativeElement.offsetHeight > window.innerHeight) { firstChildRelativeTop = firstChildRelativeTop - selectedChild.nativeElement.offsetHeight; } return firstChildRelativeTop; } actionsAfterCloseDropDown() { this.previousShownMenu = []; this.previousMenuWidth = []; this.lastMenuLevel = 0; this.previousActionId = undefined; this.isOpened = false; this.cdr.detectChanges(); this.removeScrollHandler(); if (this.destroyWheelListener) { this.destroyWheelListener(); } if (this.destroyKeyListener) { this.destroyKeyListener(); } if (this.destroyMouseListener) { this.destroyMouseListener(); } this.resetDropDownPositionAndHeight(); } closeDropDown() { if (this.isDropDownOpened()) { this.myRenderer.removeAttribute(this.dropdownParent.nativeElement, 'aria-expanded'); this.myRenderer.removeClass(this.dropdownParent.nativeElement, 'show'); this.myRenderer.removeClass(this.dropdownMenuElement.nativeElement, 'show'); this.myRenderer.setStyle(this.dropdownMenuElement.nativeElement, 'visibility', 'hidden'); } this.actionsAfterCloseDropDown(); } addListeners() { this.addScrollHandler(); this.destroyMouseListener = this.myRenderer.listen('window', 'click', (evt) => { this.handleMouseEvents(evt); }); this.destroyWheelListener = this.myRenderer.listen('window', 'scroll', (evt) => { this.handleWheelEvents(evt); }); this.destroyKeyListener = this.myRenderer.listen('document', 'keydown', (evt) => { this.handleKeyboardEvents(evt); }); } handleKeyboardEvents(event) { if (event.key === 'Escape') { if (this.isDropDownOpened()) { this.closeDropDown(); } } } handleWheelEvents(event) { this.checkTargetAndClose(event.target); } handleMouseEvents(event) { this.checkTargetAndClose(event.target); } scroll(event) { this.checkTargetAndClose(event.target); } checkTargetAndClose(target) { if (!this.checkIfNgContent(target)) { if (this.isDropDownOpened()) { this.closeDropDown(); } } } ngContentStopPropagation(event) { event.stopPropagation(); } checkIfNgContent(target) { let currentElement = target; while (currentElement !== this.dropdownElement && currentElement) { if (currentElement === this.ngcontent.nativeElement) { return true; } else { currentElement = currentElement.parentElement; } } return false; } addScrollHandler() { this.scrollHandler = this.scroll.bind(this); window.addEventListener('scroll', this.scrollHandler, true); } removeScrollHandler() { window.removeEventListener('scroll', this.scrollHandler, true); } ngOnDestroy() { this.removeScrollHandler(); } dotsClicked(event) { if (!this.isDropDownOpened()) { this.elementID = (Math.floor(Math.random() * (999999999999 - 1))).toString(); this.hideDivUntilIsPositioned(event.clientX, event.clientY); } } hideDivUntilIsPositioned(x, y) { // hide the div until is positioned in event x y position to avoid flick this.myRenderer.setStyle(this.dropdownMenuElement.nativeElement, 'visibility', 'hidden'); this.isOpened = true; this.cdr.detectChanges(); this.showDropDown(x, y); } open(event) { jQuery('#' + this.elementID) .dropdown('toggle'); if (!this.isDropDownOpened()) { // Add class manually because is not set when jquery.dropdwon toogle is executed this.myRenderer.addClass(this.dropdownParent.nativeElement, 'show'); this.hideDivUntilIsPositioned(event.clientX, event.clientY); } } toggle(elementID) { jQuery('#' + elementID) .toggle(); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.9", ngImport: i0, type: AbstractContextComponent, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.0.9", type: AbstractContextComponent, inputs: { elementID: "elementID", fontSize: "fontSize", fontColor: "fontColor", isEmbedded: "isEmbedded", overflow: "overflow" }, outputs: { action: "action" }, host: { listeners: { "window:resize": "onResize($event)" } }, viewQueries: [{ propertyName: "dropdownParent", first: true, predicate: ["dropdownparent"], descendants: true, static: true }, { propertyName: "dropdownMenuElement", first: true, predicate: ["dropdownmenu"], descendants: true }, { propertyName: "dropdownElement", first: true, predicate: ["dropdown"], descendants: true }, { propertyName: "ngcontent", first: true, predicate: ["ngcontent"], descendants: true }], ngImport: i0 }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.9", ngImport: i0, type: AbstractContextComponent, decorators: [{ type: Directive }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i0.ChangeDetectorRef }], propDecorators: { dropdownParent: [{ type: ViewChild, args: ['dropdownparent', { static: true }] }], dropdownMenuElement: [{ type: ViewChild, args: ['dropdownmenu', { static: false }] }], dropdownElement: [{ type: ViewChild, args: ['dropdown', { static: false }] }], ngcontent: [{ type: ViewChild, args: ['ngcontent', { static: false }] }], action: [{ type: Output }], elementID: [{ type: Input }], fontSize: [{ type: Input }], fontColor: [{ type: Input }], isEmbedded: [{ type: Input }], overflow: [{ type: Input }], onResize: [{ type: HostListener, args: ['window:resize', ['$event']] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3QtY29udGV4dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zeXN0ZWxhYi1jb21wb25lbnRzL3NyYy9saWIvY29udGV4dG1lbnUvYWJzdHJhY3QtY29udGV4dC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFxQixTQUFTLEVBQWMsWUFBWSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBYSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBSzdKLE1BQU0sT0FBZ0Isd0JBQXdCO0lBeUI3QyxZQUFnQyxFQUFjLEVBQVksVUFBcUIsRUFBWSxHQUFzQjtRQUFqRixPQUFFLEdBQUYsRUFBRSxDQUFZO1FBQVksZUFBVSxHQUFWLFVBQVUsQ0FBVztRQUFZLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBbEJoRyxXQUFNLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUU3QixjQUFTLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7UUFHeEUsZUFBVSxHQUFHLEtBQUssQ0FBQztRQUNuQixhQUFRLEdBQUcsS0FBSyxDQUFDO1FBTTFCLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFFZCxzQkFBaUIsR0FBa0IsRUFBRSxDQUFDO1FBQ3RDLHNCQUFpQixHQUFrQixFQUFFLENBQUM7UUFDdEMsa0JBQWEsR0FBRyxDQUFDLENBQUM7SUFHNUIsQ0FBQztJQUVNLFFBQVE7UUFDZCxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUM7YUFDdkMsRUFBRSxDQUFDLGtCQUFrQixFQUFFLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBR00sUUFBUSxDQUFDLEtBQVU7UUFDekIsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsRUFBRTtZQUM1QixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7U0FDckI7SUFDRixDQUFDO0lBRU0sZ0JBQWdCO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBRVMsSUFBSSxDQUFDLENBQVMsRUFBRSxDQUFTO1FBQ2xDLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFLEVBQUU7WUFDNUIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsRUFBRSxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDdEYsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO2dCQUNwQixJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxFQUFFLFdBQVcsRUFBRSxPQUFPLENBQUMsQ0FBQzthQUN2RjtZQUNELElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUNyRixDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQztZQUN2RCxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLFdBQVcsRUFBRTtnQkFDN0UsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUM7Z0JBQ3hELElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRTtvQkFDVixDQUFDLEdBQUcsQ0FBQyxDQUFDO2lCQUNOO2FBQ0Q7WUFDRCxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDLFVBQVUsRUFBRTtnQkFDM0UsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUM7YUFDdkQ7WUFDRCxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO1lBQzlFLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxFQUFFLE1BQU0sRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7WUFDL0UsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsRUFBRSxZQUFZLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDMUYsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1NBRXBCO2FBQU07WUFDTixVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7U0FDdEM7SUFDRixDQUFDO0lBRU0sWUFBWSxDQUFDLENBQVMsRUFBRSxDQUFTO1FBQ3ZDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRU0sOEJBQThCO1FBQ3BDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMxRSxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDNUUsQ0FBQztJQUVTLGlCQUFpQixDQUFDLGFBQXlCO1FBQ3BELElBQUksY0FBYyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFDekUsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUM7UUFFN0UsSUFBSSxzQkFBc0IsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxXQUFXO1lBQzFFLGFBQWEsQ0FBQyxhQUFhLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQUU7WUFDN0QsY0FBYyxHQUFHLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1NBQy9EO1FBQ0QsT0FBTyxjQUFjLENBQUM7SUFDdkIsQ0FBQztJQUVTLDJCQUEyQixDQUFDLGFBQXlCLEVBQUUsV0FBbUIsRUFBRSxpQkFBZ0M7UUFDckgsSUFBSSxjQUFjLENBQUM7UUFDbkIsSUFBSSxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7UUFDekIsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUM7UUFFN0UsSUFBSSxXQUFXLEdBQUcsQ0FBQyxFQUFFO1lBQ3BCLGNBQWMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1NBQ3JFO2FBQU07WUFDTixjQUFjLEdBQUcsaUJBQWlCLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUN6RCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsV0FBVyxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUNyQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsR0FBRyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUMzRDtTQUNEO1FBRUQsSUFBSSxzQkFBc0IsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEdBQUcsZ0JBQWdCO1lBQzdGLGFBQWEsQ0FBQyxhQUFhLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQUU7WUFDN0QsY0FBYyxHQUFHLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1NBQy9EO1FBQ0QsT0FBTyxjQUFjLENBQUM7SUFDdkIsQ0FBQztJQUVTLGdCQUFnQixDQUFDLEtBQVUsRUFBRSxhQUF5QjtRQUMvRCxNQUFNLHFCQUFxQixHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7UUFDNUMsSUFBSSxxQkFBcUIsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQztRQUVuRCxJQUFJLHFCQUFxQixHQUFHLGFBQWEsQ0FBQyxhQUFhLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxXQUFXLEVBQUU7WUFDMUYscUJBQXFCLEdBQUcscUJBQXFCLEdBQUcsYUFBYSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUM7U0FDekY7UUFDRCxPQUFPLHFCQUFxQixDQUFDO0lBQzlCLENBQUM7SUFFTSx5QkFBeUI7UUFDL0IsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxhQUFhLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxTQUFTLENBQUM7UUFDbEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFDdEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUMzQixJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRTtZQUM5QixJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztTQUM1QjtRQUNELElBQUksSUFBSSxDQUFDLGtCQUFrQixFQUFFO1lBQzVCLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1NBQzFCO1FBQ0QsSUFBSSxJQUFJLENBQUMsb0JBQW9CLEVBQUU7WUFDOUIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7U0FDNUI7UUFDRCxJQUFJLENBQUMsOEJBQThCLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0lBRU0sYUFBYTtRQUNuQixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFO1lBQzVCLElBQUksQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxFQUFFLGVBQWUsQ0FBQyxDQUFDO1lBQ3BGLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ3ZFLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDNUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsRUFBRSxZQUFZLEVBQUUsUUFBUSxDQUFDLENBQUM7U0FDekY7UUFDRCxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztJQUNsQyxDQUFDO0lBRVMsWUFBWTtRQUNyQixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxDQUFDLEdBQWUsRUFBRSxFQUFFO1lBQ3pGLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM3QixDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLENBQUMsR0FBZSxFQUFFLEVBQUU7WUFDMUYsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzdCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxHQUFrQixFQUFFLEVBQUU7WUFDOUYsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2hDLENBQUMsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUVTLG9CQUFvQixDQUFDLEtBQW9CO1FBQ2xELElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxRQUFRLEVBQUU7WUFDM0IsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsRUFBRTtnQkFDNUIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO2FBQ3JCO1NBQ0Q7SUFDRixDQUFDO0lBRVMsaUJBQWlCLENBQUMsS0FBaUI7UUFDNUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRVMsaUJBQWlCLENBQUMsS0FBaUI7UUFDNUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRVMsTUFBTSxDQUFDLEtBQVU7UUFDMUIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRVMsbUJBQW1CLENBQUMsTUFBVztRQUN4QyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ25DLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFLEVBQUU7Z0JBQzVCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQzthQUNyQjtTQUNEO0lBQ0YsQ0FBQztJQUVNLHdCQUF3QixDQUFDLEtBQVU7UUFDekMsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFUyxnQkFBZ0IsQ0FBQyxNQUFXO1FBQ3JDLElBQUksY0FBYyxHQUFHLE1BQU0sQ0FBQztRQUM1QixPQUFPLGNBQWMsS0FBSyxJQUFJLENBQUMsZUFBZSxJQUFJLGNBQWMsRUFBRTtZQUNqRSxJQUFJLGNBQWMsS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsRUFBRTtnQkFDcEQsT0FBTyxJQUFJLENBQUM7YUFDWjtpQkFBTTtnQkFDTixjQUFjLEdBQUcsY0FBYyxDQUFDLGFBQWEsQ0FBQzthQUM5QztTQUNEO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZCxDQUFDO0lBRVMsZ0JBQWdCO1FBQ3pCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFUyxtQkFBbUI7UUFDNUIsTUFBTSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFTSxXQUFXO1FBQ2pCLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFTSxXQUFXLENBQUMsS0FBaUI7UUFDbkMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFO1lBQzdCLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDN0UsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQzVEO0lBQ0YsQ0FBQztJQUVTLHdCQUF3QixDQUFDLENBQVMsRUFBRSxDQUFTO1FBQ3RELHdFQUF3RTtRQUN4RSxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxFQUFFLFlBQVksRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN6RixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUNyQixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFTSxJQUFJLENBQUMsS0FBaUI7UUFDNUIsTUFBTSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO2FBQzFCLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLEVBQUU7WUFDN0IsZ0ZBQWdGO1lBQ2hGLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ3BFLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUM1RDtJQUNGLENBQUM7SUFFTSxNQUFNLENBQUMsU0FBaUI7UUFDOUIsTUFBTSxDQUFDLEdBQUcsR0FBRyxTQUFTLENBQUM7YUFDckIsTUFBTSxFQUFFLENBQUM7SUFDWixDQUFDOzhHQTFQb0Isd0JBQXdCO2tHQUF4Qix3QkFBd0I7OzJGQUF4Qix3QkFBd0I7a0JBRDdDLFNBQVM7dUlBRzJDLGNBQWM7c0JBQWpFLFNBQVM7dUJBQUMsZ0JBQWdCLEVBQUUsRUFBQyxNQUFNLEVBQUUsSUFBSSxFQUFDO2dCQUNRLG1CQUFtQjtzQkFBckUsU0FBUzt1QkFBQyxjQUFjLEVBQUUsRUFBQyxNQUFNLEVBQUUsS0FBSyxFQUFDO2dCQUNLLGVBQWU7c0JBQTdELFNBQVM7dUJBQUMsVUFBVSxFQUFFLEVBQUMsTUFBTSxFQUFFLEtBQUssRUFBQztnQkFDVSxTQUFTO3NCQUF4RCxTQUFTO3VCQUFDLFdBQVcsRUFBRSxFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUM7Z0JBRXRCLE1BQU07c0JBQXRCLE1BQU07Z0JBRVMsU0FBUztzQkFBeEIsS0FBSztnQkFDVSxRQUFRO3NCQUF2QixLQUFLO2dCQUNVLFNBQVM7c0JBQXhCLEtBQUs7Z0JBQ1UsVUFBVTtzQkFBekIsS0FBSztnQkFDVSxRQUFRO3NCQUF2QixLQUFLO2dCQXFCQyxRQUFRO3NCQURkLFlBQVk7dUJBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBIb3N0TGlzdGVuZXIsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0LCBSZW5kZXJlcjIsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5kZWNsYXJlIHZhciBqUXVlcnk6IGFueTtcblxuQERpcmVjdGl2ZSgpXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDb250ZXh0Q29tcG9uZW50PFQ+IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuXG5cdEBWaWV3Q2hpbGQoJ2Ryb3Bkb3ducGFyZW50Jywge3N0YXRpYzogdHJ1ZX0pIHB1YmxpYyBkcm9wZG93blBhcmVudDogRWxlbWVudFJlZjtcblx0QFZpZXdDaGlsZCgnZHJvcGRvd25tZW51Jywge3N0YXRpYzogZmFsc2V9KSBwdWJsaWMgZHJvcGRvd25NZW51RWxlbWVudDogRWxlbWVudFJlZjtcblx0QFZpZXdDaGlsZCgnZHJvcGRvd24nLCB7c3RhdGljOiBmYWxzZX0pIHB1YmxpYyBkcm9wZG93bkVsZW1lbnQ6IEVsZW1lbnRSZWY7XG5cdEBWaWV3Q2hpbGQoJ25nY29udGVudCcsIHtzdGF0aWM6IGZhbHNlfSkgcHVibGljIG5nY29udGVudDogRWxlbWVudFJlZjtcblxuXHRAT3V0cHV0KCkgcHVibGljIGFjdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuXHRASW5wdXQoKSBwdWJsaWMgZWxlbWVudElEID0gKE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqICg5OTk5OTk5OTk5OTkgLSAxKSkpLnRvU3RyaW5nKCk7XG5cdEBJbnB1dCgpIHB1YmxpYyBmb250U2l6ZTogc3RyaW5nO1xuXHRASW5wdXQoKSBwdWJsaWMgZm9udENvbG9yOiBzdHJpbmc7XG5cdEBJbnB1dCgpIHB1YmxpYyBpc0VtYmVkZGVkID0gZmFsc2U7XG5cdEBJbnB1dCgpIHB1YmxpYyBvdmVyZmxvdyA9IGZhbHNlO1xuXG5cdHB1YmxpYyBkZXN0cm95V2hlZWxMaXN0ZW5lcjogRnVuY3Rpb247XG5cdHB1YmxpYyBkZXN0cm95TW91c2VMaXN0ZW5lcjogRnVuY3Rpb247XG5cdHB1YmxpYyBkZXN0cm95S2V5TGlzdGVuZXI6IEZ1bmN0aW9uO1xuXHRwdWJsaWMgc2Nyb2xsSGFuZGxlcjogYW55O1xuXHRwdWJsaWMgaXNPcGVuZWQgPSBmYWxzZTtcblx0cHJvdGVjdGVkIHByZXZpb3VzQWN0aW9uSWQ6IHN0cmluZztcblx0cHJvdGVjdGVkIHByZXZpb3VzU2hvd25NZW51OiBBcnJheTxzdHJpbmc+ID0gW107XG5cdHByb3RlY3RlZCBwcmV2aW91c01lbnVXaWR0aDogQXJyYXk8bnVtYmVyPiA9IFtdO1xuXHRwcm90ZWN0ZWQgbGFzdE1lbnVMZXZlbCA9IDA7XG5cblx0cHJvdGVjdGVkIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBlbDogRWxlbWVudFJlZiwgcHJvdGVjdGVkIG15UmVuZGVyZXI6IFJlbmRlcmVyMiwgcHJvdGVjdGVkIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHtcblx0fVxuXG5cdHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcblx0XHRqUXVlcnkodGhpcy5kcm9wZG93blBhcmVudC5uYXRpdmVFbGVtZW50KVxuXHRcdFx0Lm9uKCdoaWRlLmJzLmRyb3Bkb3duJywgdGhpcy5hY3Rpb25zQWZ0ZXJDbG9zZURyb3BEb3duLmJpbmQodGhpcykpO1xuXHR9XG5cblx0QEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScsIFsnJGV2ZW50J10pXG5cdHB1YmxpYyBvblJlc2l6ZShldmVudDogYW55KTogdm9pZCB7XG5cdFx0aWYgKHRoaXMuaXNEcm9wRG93bk9wZW5lZCgpKSB7XG5cdFx0XHR0aGlzLmNsb3NlRHJvcERvd24oKTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgaXNEcm9wRG93bk9wZW5lZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5kcm9wZG93blBhcmVudC5uYXRpdmVFbGVtZW50LmNsYXNzTmFtZS5pbmNsdWRlcygnc2hvdycpO1xuXHR9XG5cblx0cHJvdGVjdGVkIGxvb3AoeDogbnVtYmVyLCB5OiBudW1iZXIpOiB2b2lkIHtcblx0XHRpZiAodGhpcy5pc0Ryb3BEb3duT3BlbmVkKCkpIHtcblx0XHRcdHRoaXMubXlSZW5kZXJlci5zZXRTdHlsZSh0aGlzLmRyb3Bkb3duTWVudUVsZW1lbnQubmF0aXZlRWxlbWVudCwgJ3Bvc2l0aW9uJywgJ2ZpeGVkJyk7XG5cdFx0XHRpZiAodGhpcy5pc0VtYmVkZGVkKSB7XG5cdFx0XHRcdHRoaXMubXlSZW5kZXJlci5zZXRTdHlsZSh0aGlzLmRyb3Bkb3duTWVudUVsZW1lbnQubmF0aXZlRWxlbWVudCwgJ3RyYW5zZm9ybScsICd1bnNldCcpO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5teVJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZHJvcGRvd25FbGVtZW50Lm5hdGl2ZUVsZW1lbnQsICdwb3NpdGlvbicsICdhYnNvbHV0ZScpO1xuXHRcdFx0eSA9IHkgLSB0aGlzLmRyb3Bkb3duUGFyZW50Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuXHRcdFx0aWYgKHkgKyB0aGlzLmRyb3Bkb3duRWxlbWVudC5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodCA+IHdpbmRvdy5pbm5lckhlaWdodCkge1xuXHRcdFx0XHR5ID0geSAtIHRoaXMuZHJvcGRvd25FbGVtZW50Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuXHRcdFx0XHRpZiAoeSA8IDApIHtcblx0XHRcdFx0XHR5ID0gMDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKHggKyB0aGlzLmRyb3Bkb3duRWxlbWVudC5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoID4gd2luZG93LmlubmVyV2lkdGgpIHtcblx0XHRcdFx0eCA9IHggLSB0aGlzLmRyb3Bkb3duRWxlbWVudC5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5teVJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZHJvcGRvd25FbGVtZW50Lm5hdGl2ZUVsZW1lbnQsICd0b3AnLCB5ICsgJ3B4Jyk7XG5cdFx0XHR0aGlzLm15UmVuZGVyZXIuc2V0U3R5bGUodGhpcy5kcm9wZG93bkVsZW1lbnQubmF0aXZlRWxlbWVudCwgJ2xlZnQnLCB4ICsgJ3B4Jyk7XG5cdFx0XHR0aGlzLm15UmVuZGVyZXIuc2V0U3R5bGUodGhpcy5kcm9wZG93bk1lbnVFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsICd2aXNpYmlsaXR5JywgJ3Zpc2libGUnKTtcblx0XHRcdHRoaXMuYWRkTGlzdGVuZXJzKCk7XG5cblx0XHR9IGVsc2Uge1xuXHRcdFx0c2V0VGltZW91dCgoKSA9PiB0aGlzLmxvb3AoeCwgeSksIDEwKTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgc2hvd0Ryb3BEb3duKHg6IG51bWJlciwgeTogbnVtYmVyKTogdm9pZCB7XG5cdFx0c2V0VGltZW91dCgoKSA9PiB0aGlzLmxvb3AoeCwgeSksIDEwKTtcblx0fVxuXG5cdHB1YmxpYyByZXNldERyb3BEb3duUG9zaXRpb25BbmRIZWlnaHQoKTogdm9pZCB7XG5cdFx0dGhpcy5teVJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZHJvcGRvd25FbGVtZW50Lm5hdGl2ZUVsZW1lbnQsICd0b3AnLCBudWxsKTtcblx0XHR0aGlzLm15UmVuZGVyZXIuc2V0U3R5bGUodGhpcy5kcm9wZG93bkVsZW1lbnQubmF0aXZlRWxlbWVudCwgJ2xlZnQnLCBudWxsKTtcblx0fVxuXG5cdHByb3RlY3RlZCBnZXRGaXJzdENoaWxkTGVmdChzZWxlY3RlZENoaWxkOiBFbGVtZW50UmVmKTogbnVtYmVyIHtcblx0XHRsZXQgZmlyc3RDaGlsZExlZnQgPSB0aGlzLmRyb3Bkb3duRWxlbWVudC5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoICsgMTU7XG5cdFx0Y29uc3QgZmlyc3RDaGlsZEFic29sdXRlTGVmdCA9IHRoaXMuZHJvcGRvd25FbGVtZW50Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0TGVmdDtcblxuXHRcdGlmIChmaXJzdENoaWxkQWJzb2x1dGVMZWZ0ICsgdGhpcy5kcm9wZG93bkVsZW1lbnQubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aCArXG5cdFx0XHRzZWxlY3RlZENoaWxkLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGggPiB3aW5kb3cuaW5uZXJXaWR0aCkge1xuXHRcdFx0Zmlyc3RDaGlsZExlZnQgPSAtc2VsZWN0ZWRDaGlsZC5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoICsgMTA7XG5cdFx0fVxuXHRcdHJldHVybiBmaXJzdENoaWxkTGVmdDtcblx0fVxuXG5cdHByb3RlY3RlZCBnZXRGaXJzdENoaWxkTGVmdFdpdGhMZXZlbHMoc2VsZWN0ZWRDaGlsZDogRWxlbWVudFJlZiwgb3B0aW9uTGV2ZWw6IG51bWJlciwgcHJldmlvdXNNZW51V2lkdGg6IEFycmF5PG51bWJlcj4pOiBudW1iZXIge1xuXHRcdGxldCBmaXJzdENoaWxkTGVmdDtcblx0XHRsZXQgYWNjdW11bGF0aXZlTGVmdCA9IDA7XG5cdFx0Y29uc3QgZmlyc3RDaGlsZEFic29sdXRlTGVmdCA9IHRoaXMuZHJvcGRvd25FbGVtZW50Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0TGVmdDtcblxuXHRcdGlmIChvcHRpb25MZXZlbCA8IDEpIHtcblx0XHRcdGZpcnN0Q2hpbGRMZWZ0ID0gdGhpcy5kcm9wZG93bkVsZW1lbnQubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aCArIDEyO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRmaXJzdENoaWxkTGVmdCA9IHByZXZpb3VzTWVudVdpZHRoW29wdGlvbkxldmVsIC0gMV0gKyAxMjtcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgb3B0aW9uTGV2ZWw7IGkrKykge1xuXHRcdFx0XHRhY2N1bXVsYXRpdmVMZWZ0ID0gYWNjdW11bGF0aXZlTGVmdCArIHByZXZpb3VzTWVudVdpZHRoW2ldO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChmaXJzdENoaWxkQWJzb2x1dGVMZWZ0ICsgdGhpcy5kcm9wZG93bkVsZW1lbnQubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aCArIGFjY3VtdWxhdGl2ZUxlZnQgK1xuXHRcdFx0c2VsZWN0ZWRDaGlsZC5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoID4gd2luZG93LmlubmVyV2lkdGgpIHtcblx0XHRcdGZpcnN0Q2hpbGRMZWZ0ID0gLXNlbGVjdGVkQ2hpbGQubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aCArIDE1O1xuXHRcdH1cblx0XHRyZXR1cm4gZmlyc3RDaGlsZExlZnQ7XG5cdH1cblxuXHRwcm90ZWN0ZWQgZ2V0Rmlyc3RDaGlsZFRvcChldmVudDogYW55LCBzZWxlY3RlZENoaWxkOiBFbGVtZW50UmVmKTogbnVtYmVyIHtcblx0XHRjb25zdCBmaXJzdENoaWxkQWJzb2x1dGVUb3AgPSBldmVudC5jbGllbnRZO1xuXHRcdGxldCBmaXJzdENoaWxkUmVsYXRpdmVUb3AgPSBldmVudC50YXJnZXQub2Zmc2V0VG9wO1xuXG5cdFx0aWYgKGZpcnN0Q2hpbGRBYnNvbHV0ZVRvcCArIHNlbGVjdGVkQ2hpbGQubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQgPiB3aW5kb3cuaW5uZXJIZWlnaHQpIHtcblx0XHRcdGZpcnN0Q2hpbGRSZWxhdGl2ZVRvcCA9IGZpcnN0Q2hpbGRSZWxhdGl2ZVRvcCAtIHNlbGVjdGVkQ2hpbGQubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQ7XG5cdFx0fVxuXHRcdHJldHVybiBmaXJzdENoaWxkUmVsYXRpdmVUb3A7XG5cdH1cblxuXHRwdWJsaWMgYWN0aW9uc0FmdGVyQ2xvc2VEcm9wRG93bigpOiB2b2lkIHtcblx0XHR0aGlzLnByZXZpb3VzU2hvd25NZW51ID0gW107XG5cdFx0dGhpcy5wcmV2aW91c01lbnVXaWR0aCA9IFtdO1xuXHRcdHRoaXMubGFzdE1lbnVMZXZlbCA9IDA7XG5cdFx0dGhpcy5wcmV2aW91c0FjdGlvbklkID0gdW5kZWZpbmVkO1xuXHRcdHRoaXMuaXNPcGVuZWQgPSBmYWxzZTtcblx0XHR0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG5cdFx0dGhpcy5yZW1vdmVTY3JvbGxIYW5kbGVyKCk7XG5cdFx0aWYgKHRoaXMuZGVzdHJveVdoZWVsTGlzdGVuZXIpIHtcblx0XHRcdHRoaXMuZGVzdHJveVdoZWVsTGlzdGVuZXIoKTtcblx0XHR9XG5cdFx0aWYgKHRoaXMuZGVzdHJveUtleUxpc3RlbmVyKSB7XG5cdFx0XHR0aGlzLmRlc3Ryb3lLZXlMaXN0ZW5lcigpO1xuXHRcdH1cblx0XHRpZiAodGhpcy5kZXN0cm95TW91c2VMaXN0ZW5lcikge1xuXHRcdFx0dGhpcy5kZXN0cm95TW91c2VMaXN0ZW5lcigpO1xuXHRcdH1cblx0XHR0aGlzLnJlc2V0RHJvcERvd25Qb3NpdGlvbkFuZEhlaWdodCgpO1xuXHR9XG5cblx0cHVibGljIGNsb3NlRHJvcERvd24oKTogdm9pZCB7XG5cdFx0aWYgKHRoaXMuaXNEcm9wRG93bk9wZW5lZCgpKSB7XG5cdFx0XHR0aGlzLm15UmVuZGVyZXIucmVtb3ZlQXR0cmlidXRlKHRoaXMuZHJvcGRvd25QYXJlbnQubmF0aXZlRWxlbWVudCwgJ2FyaWEtZXhwYW5kZWQnKTtcblx0XHRcdHRoaXMubXlSZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLmRyb3Bkb3duUGFyZW50Lm5hdGl2ZUVsZW1lbnQsICdzaG93Jyk7XG5cdFx0XHR0aGlzLm15UmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5kcm9wZG93bk1lbnVFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsICdzaG93Jyk7XG5cdFx0XHR0aGlzLm15UmVuZGVyZXIuc2V0U3R5bGUodGhpcy5kcm9wZG93bk1lbnVFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsICd2aXNpYmlsaXR5JywgJ2hpZGRlbicpO1xuXHRcdH1cblx0XHR0aGlzLmFjdGlvbnNBZnRlckNsb3NlRHJvcERvd24oKTtcblx0fVxuXG5cdHByb3RlY3RlZCBhZGRMaXN0ZW5lcnMoKTogdm9pZCB7XG5cdFx0dGhpcy5hZGRTY3JvbGxIYW5kbGVyKCk7XG5cdFx0dGhpcy5kZXN0cm95TW91c2VMaXN0ZW5lciA9IHRoaXMubXlSZW5kZXJlci5saXN0ZW4oJ3dpbmRvdycsICdjbGljaycsIChldnQ6IE1vdXNlRXZlbnQpID0+IHtcblx0XHRcdHRoaXMuaGFuZGxlTW91c2VFdmVudHMoZXZ0KTtcblx0XHR9KTtcblx0XHR0aGlzLmRlc3Ryb3lXaGVlbExpc3RlbmVyID0gdGhpcy5teVJlbmRlcmVyLmxpc3Rlbignd2luZG93JywgJ3Njcm9sbCcsIChldnQ6IFdoZWVsRXZlbnQpID0+IHtcblx0XHRcdHRoaXMuaGFuZGxlV2hlZWxFdmVudHMoZXZ0KTtcblx0XHR9KTtcblx0XHR0aGlzLmRlc3Ryb3lLZXlMaXN0ZW5lciA9IHRoaXMubXlSZW5kZXJlci5saXN0ZW4oJ2RvY3VtZW50JywgJ2tleWRvd24nLCAoZXZ0OiBLZXlib2FyZEV2ZW50KSA9PiB7XG5cdFx0XHR0aGlzLmhhbmRsZUtleWJvYXJkRXZlbnRzKGV2dCk7XG5cdFx0fSk7XG5cdH1cblxuXHRwcm90ZWN0ZWQgaGFuZGxlS2V5Ym9hcmRFdmVudHMoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcblx0XHRpZiAoZXZlbnQua2V5ID09PSAnRXNjYXBlJykge1xuXHRcdFx0aWYgKHRoaXMuaXNEcm9wRG93bk9wZW5lZCgpKSB7XG5cdFx0XHRcdHRoaXMuY2xvc2VEcm9wRG93bigpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHByb3RlY3RlZCBoYW5kbGVXaGVlbEV2ZW50cyhldmVudDogV2hlZWxFdmVudCk6IHZvaWQge1xuXHRcdHRoaXMuY2hlY2tUYXJnZXRBbmRDbG9zZShldmVudC50YXJnZXQpO1xuXHR9XG5cblx0cHJvdGVjdGVkIGhhbmRsZU1vdXNlRXZlbnRzKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG5cdFx0dGhpcy5jaGVja1RhcmdldEFuZENsb3NlKGV2ZW50LnRhcmdldCk7XG5cdH1cblxuXHRwcm90ZWN0ZWQgc2Nyb2xsKGV2ZW50OiBhbnkpOiB2b2lkIHtcblx0XHR0aGlzLmNoZWNrVGFyZ2V0QW5kQ2xvc2UoZXZlbnQudGFyZ2V0KTtcblx0fVxuXG5cdHByb3RlY3RlZCBjaGVja1RhcmdldEFuZENsb3NlKHRhcmdldDogYW55KTogdm9pZCB7XG5cdFx0aWYgKCF0aGlzLmNoZWNrSWZOZ0NvbnRlbnQodGFyZ2V0KSkge1xuXHRcdFx0aWYgKHRoaXMuaXNEcm9wRG93bk9wZW5lZCgpKSB7XG5cdFx0XHRcdHRoaXMuY2xvc2VEcm9wRG93bigpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBuZ0NvbnRlbnRTdG9wUHJvcGFnYXRpb24oZXZlbnQ6IGFueSk6IHZvaWQge1xuXHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHR9XG5cblx0cHJvdGVjdGVkIGNoZWNrSWZOZ0NvbnRlbnQodGFyZ2V0OiBhbnkpOiBib29sZWFuIHtcblx0XHRsZXQgY3VycmVudEVsZW1lbnQgPSB0YXJnZXQ7XG5cdFx0d2hpbGUgKGN1cnJlbnRFbGVtZW50ICE9PSB0aGlzLmRyb3Bkb3duRWxlbWVudCAmJiBjdXJyZW50RWxlbWVudCkge1xuXHRcdFx0aWYgKGN1cnJlbnRFbGVtZW50ID09PSB0aGlzLm5nY29udGVudC5uYXRpdmVFbGVtZW50KSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50O1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRwcm90ZWN0ZWQgYWRkU2Nyb2xsSGFuZGxlcigpOiB2b2lkIHtcblx0XHR0aGlzLnNjcm9sbEhhbmRsZXIgPSB0aGlzLnNjcm9sbC5iaW5kKHRoaXMpO1xuXHRcdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGlzLnNjcm9sbEhhbmRsZXIsIHRydWUpO1xuXHR9XG5cblx0cHJvdGVjdGVkIHJlbW92ZVNjcm9sbEhhbmRsZXIoKTogdm9pZCB7XG5cdFx0d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMuc2Nyb2xsSGFuZGxlciwgdHJ1ZSk7XG5cdH1cblxuXHRwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG5cdFx0dGhpcy5yZW1vdmVTY3JvbGxIYW5kbGVyKCk7XG5cdH1cblxuXHRwdWJsaWMgZG90c0NsaWNrZWQoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcblx0XHRpZiAoIXRoaXMuaXNEcm9wRG93bk9wZW5lZCgpKSB7XG5cdFx0XHR0aGlzLmVsZW1lbnRJRCA9IChNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAoOTk5OTk5OTk5OTk5IC0gMSkpKS50b1N0cmluZygpO1xuXHRcdFx0dGhpcy5oaWRlRGl2VW50aWxJc1Bvc2l0aW9uZWQoZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSk7XG5cdFx0fVxuXHR9XG5cblx0cHJvdGVjdGVkIGhpZGVEaXZVbnRpbElzUG9zaXRpb25lZCh4OiBudW1iZXIsIHk6IG51bWJlcik6IHZvaWQge1xuXHRcdC8vIGhpZGUgdGhlIGRpdiB1bnRpbCBpcyBwb3NpdGlvbmVkIGluIGV2ZW50IHggeSBwb3NpdGlvbiB0byBhdm9pZCBmbGlja1xuXHRcdHRoaXMubXlSZW5kZXJlci5zZXRTdHlsZSh0aGlzLmRyb3Bkb3duTWVudUVsZW1lbnQubmF0aXZlRWxlbWVudCwgJ3Zpc2liaWxpdHknLCAnaGlkZGVuJyk7XG5cdFx0dGhpcy5pc09wZW5lZCA9IHRydWU7XG5cdFx0dGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuXHRcdHRoaXMuc2hvd0Ryb3BEb3duKHgsIHkpO1xuXHR9XG5cblx0cHVibGljIG9wZW4oZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcblx0XHRqUXVlcnkoJyMnICsgdGhpcy5lbGVtZW50SUQpXG5cdFx0XHQuZHJvcGRvd24oJ3RvZ2dsZScpO1xuXHRcdGlmICghdGhpcy5pc0Ryb3BEb3duT3BlbmVkKCkpIHtcblx0XHRcdC8vIEFkZCBjbGFzcyBtYW51YWxseSBiZWNhdXNlIGlzIG5vdCBzZXQgd2hlbiBqcXVlcnkuZHJvcGR3b24gdG9vZ2xlIGlzIGV4ZWN1dGVkXG5cdFx0XHR0aGlzLm15UmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5kcm9wZG93blBhcmVudC5uYXRpdmVFbGVtZW50LCAnc2hvdycpO1xuXHRcdFx0dGhpcy5oaWRlRGl2VW50aWxJc1Bvc2l0aW9uZWQoZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSk7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIHRvZ2dsZShlbGVtZW50SUQ6IHN0cmluZyk6IHZvaWQge1xuXHRcdGpRdWVyeSgnIycgKyBlbGVtZW50SUQpXG5cdFx0XHQudG9nZ2xlKCk7XG5cdH1cbn1cbiJdfQ==