@spartacus/storefront
Version:
Spartacus Storefront is a package that you can include in your application, which allows you to add default storefront features.
139 lines • 22.4 kB
JavaScript
import { ChangeDetectionStrategy, Component, HostBinding, HostListener, TemplateRef, } from '@angular/core';
import { NavigationStart } from '@angular/router';
import { filter } from 'rxjs/operators';
import { PopoverEvent } from './popover.model';
import { ICON_TYPE } from '../../../cms-components/misc/icon/icon.model';
import * as i0 from "@angular/core";
import * as i1 from "../../services/positioning/positioning.service";
import * as i2 from "@spartacus/core";
import * as i3 from "@angular/router";
import * as i4 from "../../../cms-components/misc/icon/icon.component";
import * as i5 from "../../../layout/a11y/keyboard-focus/focus.directive";
import * as i6 from "@angular/common";
export class PopoverComponent {
constructor(positioningService, winRef, changeDetectionRef, renderer, router) {
this.positioningService = positioningService;
this.winRef = winRef;
this.changeDetectionRef = changeDetectionRef;
this.renderer = renderer;
this.router = router;
/**
* Icon types for close button icon.
*/
this.iconTypes = ICON_TYPE;
}
/**
* Listens for click inside popover component wrapper.
*/
insideClick() {
this.eventSubject.next(PopoverEvent.INSIDE_CLICK);
}
/**
* Listens for every document click and ignores clicks
* inside component.
*/
outsideClick(event) {
if (!this.isClickedOnPopover(event) && !this.isClickedOnDirective(event)) {
this.eventSubject.next(PopoverEvent.OUTSIDE_CLICK);
}
}
/**
* Listens for `escape` keydown event.
*/
escapeKeydown() {
this.eventSubject.next(PopoverEvent.ESCAPE_KEYDOWN);
}
isClickedOnPopover(event) {
return this.popoverInstance.location.nativeElement.contains(event.target);
}
isClickedOnDirective(event) {
return this.triggerElement.nativeElement.contains(event.target);
}
/**
* Emits close event trigger.
*/
close(event) {
event.preventDefault();
if (event instanceof MouseEvent) {
this.eventSubject.next(PopoverEvent.CLOSE_BUTTON_CLICK);
}
else {
this.eventSubject.next(PopoverEvent.CLOSE_BUTTON_KEYDOWN);
}
}
/**
* Method uses `Renderer2` service to listen window scroll event.
*
* Registered only if property `positionOnScroll` is set to `true`.
*/
triggerScrollEvent() {
this.scrollEventUnlistener = this.renderer.listen(this.winRef.nativeWindow, 'scroll', () => this.positionPopover());
}
/**
* Method uses positioning service calculation and based on that
* updates class name for popover component instance.
*/
positionPopover() {
this.popoverClass = this.positioningService.positionElements(this.triggerElement.nativeElement, this.popoverInstance.location.nativeElement, this.positioningService.getPositioningClass(this.position, this.autoPositioning), this.appendToBody);
this.changeDetectionRef.markForCheck();
this.baseClass = `${this.customClass} ${this.popoverClass} opened`;
}
ngOnInit() {
this.isTemplate = this.content instanceof TemplateRef;
if (!this.customClass)
this.customClass = 'cx-popover';
if (!this.position)
this.position = 'top';
if (this.autoPositioning === undefined)
this.autoPositioning = true;
this.baseClass = `${this.customClass}`;
this.resizeSub = this.winRef.resize$.subscribe(() => {
this.positionPopover();
});
this.routeChangeSub = this.router.events
.pipe(filter((event) => event instanceof NavigationStart))
.subscribe(() => {
this.eventSubject.next(PopoverEvent.ROUTE_CHANGE);
});
if (this.positionOnScroll) {
this.triggerScrollEvent();
}
}
ngAfterViewChecked() {
this.positionPopover();
}
ngOnDestroy() {
if (this.resizeSub) {
this.resizeSub.unsubscribe();
}
if (this.routeChangeSub) {
this.routeChangeSub.unsubscribe();
}
if (this.scrollEventUnlistener) {
this.scrollEventUnlistener();
}
}
}
PopoverComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: PopoverComponent, deps: [{ token: i1.PositioningService }, { token: i2.WindowRef }, { token: i0.ChangeDetectorRef }, { token: i0.Renderer2 }, { token: i3.Router }], target: i0.ɵɵFactoryTarget.Component });
PopoverComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.0.5", type: PopoverComponent, selector: "cx-popover", host: { listeners: { "click": "insideClick()", "document:click": "outsideClick($event)", "keydown.escape": "escapeKeydown()" }, properties: { "className": "this.baseClass" } }, ngImport: i0, template: "<div class=\"arrow\"></div>\n<div class=\"popover-body\" [cxFocus]=\"focusConfig\">\n <div class=\"cx-close-row\">\n <button\n *ngIf=\"displayCloseButton\"\n type=\"button\"\n class=\"close\"\n (keydown.enter)=\"close($event)\"\n (keydown.space)=\"close($event)\"\n (click)=\"close($event)\"\n >\n <cx-icon [type]=\"iconTypes.CLOSE\"></cx-icon>\n </button>\n </div>\n <ng-container *ngIf=\"isTemplate\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n </ng-container>\n <span *ngIf=\"!isTemplate\">{{ content }}</span>\n</div>\n", components: [{ type: i4.IconComponent, selector: "cx-icon,[cxIcon]", inputs: ["cxIcon", "type"] }], directives: [{ type: i5.FocusDirective, selector: "[cxFocus]", inputs: ["cxFocus"] }, { type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: PopoverComponent, decorators: [{
type: Component,
args: [{
selector: 'cx-popover',
templateUrl: './popover.component.html',
changeDetection: ChangeDetectionStrategy.OnPush,
}]
}], ctorParameters: function () { return [{ type: i1.PositioningService }, { type: i2.WindowRef }, { type: i0.ChangeDetectorRef }, { type: i0.Renderer2 }, { type: i3.Router }]; }, propDecorators: { baseClass: [{
type: HostBinding,
args: ['className']
}], insideClick: [{
type: HostListener,
args: ['click']
}], outsideClick: [{
type: HostListener,
args: ['document:click', ['$event']]
}], escapeKeydown: [{
type: HostListener,
args: ['keydown.escape']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wb3Zlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zdG9yZWZyb250bGliL3NoYXJlZC9jb21wb25lbnRzL3BvcG92ZXIvcG9wb3Zlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zdG9yZWZyb250bGliL3NoYXJlZC9jb21wb25lbnRzL3BvcG92ZXIvcG9wb3Zlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsdUJBQXVCLEVBRXZCLFNBQVMsRUFHVCxXQUFXLEVBQ1gsWUFBWSxFQUlaLFdBQVcsR0FDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZUFBZSxFQUFVLE1BQU0saUJBQWlCLENBQUM7QUFDMUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR3hDLE9BQU8sRUFBRSxZQUFZLEVBQW1CLE1BQU0saUJBQWlCLENBQUM7QUFHaEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDhDQUE4QyxDQUFDOzs7Ozs7OztBQU96RSxNQUFNLE9BQU8sZ0JBQWdCO0lBb08zQixZQUNZLGtCQUFzQyxFQUN0QyxNQUFpQixFQUNqQixrQkFBcUMsRUFDckMsUUFBbUIsRUFDbkIsTUFBYztRQUpkLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFDdEMsV0FBTSxHQUFOLE1BQU0sQ0FBVztRQUNqQix1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW1CO1FBQ3JDLGFBQVEsR0FBUixRQUFRLENBQVc7UUFDbkIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQWxKMUI7O1dBRUc7UUFDSCxjQUFTLEdBQUcsU0FBUyxDQUFDO0lBZ0puQixDQUFDO0lBL0hKOztPQUVHO0lBRUgsV0FBVztRQUNULElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsQ0FB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QVEsQ0FBQztnQkFXMUMsYUFBYTtzQkFEWixZQUFZO3VCQUFDLGdCQUFnQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0NoZWNrZWQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBDb21wb25lbnRSZWYsXG4gIEVsZW1lbnRSZWYsXG4gIEhvc3RCaW5kaW5nLFxuICBIb3N0TGlzdGVuZXIsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBSZW5kZXJlcjIsXG4gIFRlbXBsYXRlUmVmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5hdmlnYXRpb25TdGFydCwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IGZpbHRlciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgV2luZG93UmVmIH0gZnJvbSAnQHNwYXJ0YWN1cy9jb3JlJztcbmltcG9ydCB7IFBvcG92ZXJFdmVudCwgUG9wb3ZlclBvc2l0aW9uIH0gZnJvbSAnLi9wb3BvdmVyLm1vZGVsJztcbmltcG9ydCB7IFBvc2l0aW9uaW5nU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3Bvc2l0aW9uaW5nL3Bvc2l0aW9uaW5nLnNlcnZpY2UnO1xuaW1wb3J0IHsgRm9jdXNDb25maWcgfSBmcm9tICcuLi8uLi8uLi9sYXlvdXQvYTExeS9rZXlib2FyZC1mb2N1cy9rZXlib2FyZC1mb2N1cy5tb2RlbCc7XG5pbXBvcnQgeyBJQ09OX1RZUEUgfSBmcm9tICcuLi8uLi8uLi9jbXMtY29tcG9uZW50cy9taXNjL2ljb24vaWNvbi5tb2RlbCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2N4LXBvcG92ZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vcG9wb3Zlci5jb21wb25lbnQuaHRtbCcsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBQb3BvdmVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIEFmdGVyVmlld0NoZWNrZWQge1xuICAvKipcbiAgICogU3RyaW5nIG9yIHRlbXBsYXRlIHRvIGJlIHJlbmRlcmVkIGluc2lkZSBwb3BvdmVyIHdyYXBwZXIgY29tcG9uZW50LlxuICAgKi9cbiAgY29udGVudDogc3RyaW5nIHwgVGVtcGxhdGVSZWY8YW55PjtcblxuICAvKipcbiAgICogRWxlbWVudCB3aGljaCB0cmlnZ2VycyBkaXNwbGF5aW5nIHBvcG92ZXIgY29tcG9uZW50LlxuICAgKiBUaGlzIHByb3BlcnR5IGlzIG5lZWRlZCB0byBjYWxjdWxhdGUgdmFsaWQgcG9zaXRpb24gZm9yIHBvcG92ZXIuXG4gICAqL1xuICB0cmlnZ2VyRWxlbWVudDogRWxlbWVudFJlZjtcblxuICAvKipcbiAgICogQ3VycmVudCBpbml0aWF0ZWQgcG9wb3ZlciBpbnN0YW5jZS5cbiAgICovXG4gIHBvcG92ZXJJbnN0YW5jZTogQ29tcG9uZW50UmVmPFBvcG92ZXJDb21wb25lbnQ+O1xuXG4gIC8qKlxuICAgKiBGbGFnIHdoaWNoIGluZm9ybXMgcG9zaXRpb25pbmcgc2VydmljZSBpZiBwb3BvdmVyIGNvbXBvbmVudFxuICAgKiBzaG91bGQgYmUgYXBwZW5kZWQgdG8gYm9keS4gT3RoZXJ3aXNlIHBvcG92ZXIgaXMgZGlzcGxheWVkIHJpZ2h0IGFmdGVyXG4gICAqIHRyaWdnZXIgZWxlbWVudCBpbiBET00uXG4gICAqL1xuICBhcHBlbmRUb0JvZHk/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgcHJlZmVycmVkIHBsYWNlbWVudCBvZiB0aGUgcG9wb3Zlci4gRGVmYXVsdCBwb3BvdmVyIHBvc2l0aW9uIGlzICd0b3AnLlxuICAgKlxuICAgKiBBbGxvd2VkIHBvcG92ZXIgcG9zaXRpb25zOiAnYXV0bycsICd0b3AnLCAnYm90dG9tJywgJ2xlZnQnLCAncmlnaHQnLFxuICAgKiAndG9wLWxlZnQnLCAndG9wLXJpZ2h0JywgJ2JvdHRvbS1sZWZ0JywgJ2JvdHRvbS1yaWdodCcsXG4gICAqICdsZWZ0LXRvcCcsICdsZWZ0LWJvdHRvbScsICdyaWdodC10b3AnLCAncmlnaHQtYm90dG9tJy5cbiAgICovXG4gIHBvc2l0aW9uPzogUG9wb3ZlclBvc2l0aW9uO1xuXG4gIC8qKlxuICAgKiBGbGFnIHVzZWQgdG8gZGVmaW5lIGlmIHBvcG92ZXIgc2hvdWxkIGxvb2sgZm9yIHRoZSBiZXN0IHBsYWNlbWVudFxuICAgKiBpbiBjYXNlIGlmIHRoZXJlIGlzIG5vdCBlbm91Z2ggc3BhY2UgaW4gdmlld3BvcnQgZm9yIHByZWZlcnJlZCBwb3NpdGlvbi5cbiAgICpcbiAgICogQnkgZGVmYXVsdCB0aGlzIHByb3BlcnR5IGlzIHNldCB0byBgdHJ1ZWAuXG4gICAqXG4gICAqIFZhbHVlIG9mIHRoaXMgZmxhZyBpcyBvbWl0dGVkIGlmIHByZWZlcnJlZCBwb3NpdGlvbiBpcyBzZXQgdG8gYGF1dG9gLlxuICAgKi9cbiAgYXV0b1Bvc2l0aW9uaW5nPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQ3VzdG9tIGNsYXNzIG5hbWUgcGFzc2VkIHRvIHBvcG92ZXIgY29tcG9uZW50LlxuICAgKlxuICAgKiBJZiB0aGlzIHByb3BlcnR5IGlzIG5vdCBzZXQgdGhlIGRlZmF1bHQgcG9wb3ZlciBjbGFzcyBpcyBgY3gtcG9wb3ZlcmAuXG4gICAqL1xuICBjdXN0b21DbGFzcz86IHN0cmluZztcblxuICAvKipcbiAgICogRmxhZyB1c2VkIHRvIHNob3cvaGlkZSBjbG9zZSBidXR0b24gaW4gcG9wb3ZlciBjb21wb25lbnQuXG4gICAqL1xuICBkaXNwbGF5Q2xvc2VCdXR0b24/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBGbGFnIHdoaWNoIGluZGljYXRlcyBpZiBwYXNzZWQgY29udGVudCBpcyBhIFRlbXBsYXRlUmVmIG9yIHN0cmluZy5cbiAgICovXG4gIGlzVGVtcGxhdGU6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEFmdGVyIHBvcG92ZXIgY29tcG9uZW50IGlzIGluaXRpYWxpemVkIHBvc2l0aW9uIG5lZWRzIHRvIGJlIGNoYW5naW5nIGR5bmFtaWNhbGx5XG4gICAqIGluIGNhc2UgaWYgYW55IHZpZXdwb3J0IGNoYW5nZXMgaGFwcGVuZWQuXG4gICAqL1xuICByZXNpemVTdWI6IFN1YnNjcmlwdGlvbjtcblxuICAvKipcbiAgICogQWZ0ZXIgcG9wb3ZlciBjb21wb25lbnQgaXMgaW5pdGlhbGl6ZWQgcG9wb3ZlciBzaG91bGQgYmUgY2xvc2VkIGluIGNhc2VcbiAgICogaWYgY3VycmVudCByb3V0ZSBoYXMgYmVlbiBjaGFuZ2VkLlxuICAgKi9cbiAgcm91dGVDaGFuZ2VTdWI6IFN1YnNjcmlwdGlvbjtcblxuICAvKipcbiAgICogQ2xhc3MgbmFtZSBnZW5lcmF0ZWQgYnkgcG9zaXRpb25pbmcgc2VydmljZSBpbmRpY2F0aW5nIHBvc2l0aW9uIG9mIHBvcG92ZXIuXG4gICAqL1xuICBwb3BvdmVyQ2xhc3M6IFBvcG92ZXJQb3NpdGlvbjtcblxuICAvKipcbiAgICogQ29uZmlndXJhdGlvbiBmb3IgYTExeSBpbXByb3ZlbWVudHMuXG4gICAqL1xuICBmb2N1c0NvbmZpZzogRm9jdXNDb25maWc7XG5cbiAgLyoqXG4gICAqIEZsYWcgaW5kaWNhdGVzIGlmIHBvcG92ZXIgc2hvdWxkIGJlIHJlLXBvc2l0aW9uZWQgb24gc2Nyb2xsIGV2ZW50LlxuICAgKi9cbiAgcG9zaXRpb25PblNjcm9sbD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEljb24gdHlwZXMgZm9yIGNsb3NlIGJ1dHRvbiBpY29uLlxuICAgKi9cbiAgaWNvblR5cGVzID0gSUNPTl9UWVBFO1xuXG4gIC8qKlxuICAgKiBTdWJqZWN0IHdoaWNoIGVtaXRzIHNwZWNpZmljIHR5cGUgb2YgYFBvcG92ZXJFdmVudGAuXG4gICAqL1xuICBldmVudFN1YmplY3Q6IFN1YmplY3Q8UG9wb3ZlckV2ZW50PjtcblxuICAvKipcbiAgICogU2Nyb2xsIGV2ZW50IHVubGlzdGVuZXIuXG4gICAqL1xuICBzY3JvbGxFdmVudFVubGlzdGVuZXI6ICgpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEJpbmRpbmcgY2xhc3MgbmFtZSBwcm9wZXJ0eS5cbiAgICovXG4gIEBIb3N0QmluZGluZygnY2xhc3NOYW1lJykgYmFzZUNsYXNzOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIExpc3RlbnMgZm9yIGNsaWNrIGluc2lkZSBwb3BvdmVyIGNvbXBvbmVudCB3cmFwcGVyLlxuICAgKi9cbiAgQEhvc3RMaXN0ZW5lcignY2xpY2snKVxuICBpbnNpZGVDbGljaygpIHtcbiAgICB0aGlzLmV2ZW50U3ViamVjdC5uZXh0KFBvcG92ZXJFdmVudC5JTlNJREVfQ0xJQ0spO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3RlbnMgZm9yIGV2ZXJ5IGRvY3VtZW50IGNsaWNrIGFuZCBpZ25vcmVzIGNsaWNrc1xuICAgKiBpbnNpZGUgY29tcG9uZW50LlxuICAgKi9cbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6Y2xpY2snLCBbJyRldmVudCddKVxuICBvdXRzaWRlQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuaXNDbGlja2VkT25Qb3BvdmVyKGV2ZW50KSAmJiAhdGhpcy5pc0NsaWNrZWRPbkRpcmVjdGl2ZShldmVudCkpIHtcbiAgICAgIHRoaXMuZXZlbnRTdWJqZWN0Lm5leHQoUG9wb3ZlckV2ZW50Lk9VVFNJREVfQ0xJQ0spO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0ZW5zIGZvciBgZXNjYXBlYCBrZXlkb3duIGV2ZW50LlxuICAgKi9cbiAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bi5lc2NhcGUnKVxuICBlc2NhcGVLZXlkb3duKCkge1xuICAgIHRoaXMuZXZlbnRTdWJqZWN0Lm5leHQoUG9wb3ZlckV2ZW50LkVTQ0FQRV9LRVlET1dOKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBpc0NsaWNrZWRPblBvcG92ZXIoZXZlbnQpIHtcbiAgICByZXR1cm4gdGhpcy5wb3BvdmVySW5zdGFuY2UubG9jYXRpb24ubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGlzQ2xpY2tlZE9uRGlyZWN0aXZlKGV2ZW50KSB7XG4gICAgcmV0dXJuIHRoaXMudHJpZ2dlckVsZW1lbnQubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtaXRzIGNsb3NlIGV2ZW50IHRyaWdnZXIuXG4gICAqL1xuICBjbG9zZShldmVudDogTW91c2VFdmVudCB8IEtleWJvYXJkRXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGlmIChldmVudCBpbnN0YW5jZW9mIE1vdXNlRXZlbnQpIHtcbiAgICAgIHRoaXMuZXZlbnRTdWJqZWN0Lm5leHQoUG9wb3ZlckV2ZW50LkNMT1NFX0JVVFRPTl9DTElDSyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZXZlbnRTdWJqZWN0Lm5leHQoUG9wb3ZlckV2ZW50LkNMT1NFX0JVVFRPTl9LRVlET1dOKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHVzZXMgYFJlbmRlcmVyMmAgc2VydmljZSB0byBsaXN0ZW4gd2luZG93IHNjcm9sbCBldmVudC5cbiAgICpcbiAgICogUmVnaXN0ZXJlZCBvbmx5IGlmIHByb3BlcnR5IGBwb3NpdGlvbk9uU2Nyb2xsYCBpcyBzZXQgdG8gYHRydWVgLlxuICAgKi9cbiAgdHJpZ2dlclNjcm9sbEV2ZW50KCkge1xuICAgIHRoaXMuc2Nyb2xsRXZlbnRVbmxpc3RlbmVyID0gdGhpcy5yZW5kZXJlci5saXN0ZW4oXG4gICAgICB0aGlzLndpblJlZi5uYXRpdmVXaW5kb3csXG4gICAgICAnc2Nyb2xsJyxcbiAgICAgICgpID0+IHRoaXMucG9zaXRpb25Qb3BvdmVyKClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB1c2VzIHBvc2l0aW9uaW5nIHNlcnZpY2UgY2FsY3VsYXRpb24gYW5kIGJhc2VkIG9uIHRoYXRcbiAgICogdXBkYXRlcyBjbGFzcyBuYW1lIGZvciBwb3BvdmVyIGNvbXBvbmVudCBpbnN0YW5jZS5cbiAgICovXG4gIHBvc2l0aW9uUG9wb3ZlcigpIHtcbiAgICB0aGlzLnBvcG92ZXJDbGFzcyA9IHRoaXMucG9zaXRpb25pbmdTZXJ2aWNlLnBvc2l0aW9uRWxlbWVudHMoXG4gICAgICB0aGlzLnRyaWdnZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsXG4gICAgICB0aGlzLnBvcG92ZXJJbnN0YW5jZS5sb2NhdGlvbi5uYXRpdmVFbGVtZW50LFxuICAgICAgdGhpcy5wb3NpdGlvbmluZ1NlcnZpY2UuZ2V0UG9zaXRpb25pbmdDbGFzcyhcbiAgICAgICAgdGhpcy5wb3NpdGlvbixcbiAgICAgICAgdGhpcy5hdXRvUG9zaXRpb25pbmdcbiAgICAgICksXG4gICAgICB0aGlzLmFwcGVuZFRvQm9keVxuICAgICk7XG5cbiAgICB0aGlzLmNoYW5nZURldGVjdGlvblJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICB0aGlzLmJhc2VDbGFzcyA9IGAke3RoaXMuY3VzdG9tQ2xhc3N9ICR7dGhpcy5wb3BvdmVyQ2xhc3N9IG9wZW5lZGA7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzVGVtcGxhdGUgPSB0aGlzLmNvbnRlbnQgaW5zdGFuY2VvZiBUZW1wbGF0ZVJlZjtcblxuICAgIGlmICghdGhpcy5jdXN0b21DbGFzcykgdGhpcy5jdXN0b21DbGFzcyA9ICdjeC1wb3BvdmVyJztcbiAgICBpZiAoIXRoaXMucG9zaXRpb24pIHRoaXMucG9zaXRpb24gPSAndG9wJztcbiAgICBpZiAodGhpcy5hdXRvUG9zaXRpb25pbmcgPT09IHVuZGVmaW5lZCkgdGhpcy5hdXRvUG9zaXRpb25pbmcgPSB0cnVlO1xuXG4gICAgdGhpcy5iYXNlQ2xhc3MgPSBgJHt0aGlzLmN1c3RvbUNsYXNzfWA7XG5cbiAgICB0aGlzLnJlc2l6ZVN1YiA9IHRoaXMud2luUmVmLnJlc2l6ZSQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMucG9zaXRpb25Qb3BvdmVyKCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnJvdXRlQ2hhbmdlU3ViID0gdGhpcy5yb3V0ZXIuZXZlbnRzXG4gICAgICAucGlwZShmaWx0ZXIoKGV2ZW50KSA9PiBldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25TdGFydCkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5ldmVudFN1YmplY3QubmV4dChQb3BvdmVyRXZlbnQuUk9VVEVfQ0hBTkdFKTtcbiAgICAgIH0pO1xuXG4gICAgaWYgKHRoaXMucG9zaXRpb25PblNjcm9sbCkge1xuICAgICAgdGhpcy50cmlnZ2VyU2Nyb2xsRXZlbnQoKTtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0NoZWNrZWQoKTogdm9pZCB7XG4gICAgdGhpcy5wb3NpdGlvblBvcG92ZXIoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlc2l6ZVN1Yikge1xuICAgICAgdGhpcy5yZXNpemVTdWIudW5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5yb3V0ZUNoYW5nZVN1Yikge1xuICAgICAgdGhpcy5yb3V0ZUNoYW5nZVN1Yi51bnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNjcm9sbEV2ZW50VW5saXN0ZW5lcikge1xuICAgICAgdGhpcy5zY3JvbGxFdmVudFVubGlzdGVuZXIoKTtcbiAgICB9XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgcG9zaXRpb25pbmdTZXJ2aWNlOiBQb3NpdGlvbmluZ1NlcnZpY2UsXG4gICAgcHJvdGVjdGVkIHdpblJlZjogV2luZG93UmVmLFxuICAgIHByb3RlY3RlZCBjaGFuZ2VEZXRlY3Rpb25SZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByb3RlY3RlZCByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIHByb3RlY3RlZCByb3V0ZXI6IFJvdXRlclxuICApIHt9XG59XG4iLCI8ZGl2IGNsYXNzPVwiYXJyb3dcIj48L2Rpdj5cbjxkaXYgY2xhc3M9XCJwb3BvdmVyLWJvZHlcIiBbY3hGb2N1c109XCJmb2N1c0NvbmZpZ1wiPlxuICA8ZGl2IGNsYXNzPVwiY3gtY2xvc2Utcm93XCI+XG4gICAgPGJ1dHRvblxuICAgICAgKm5nSWY9XCJkaXNwbGF5Q2xvc2VCdXR0b25cIlxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICBjbGFzcz1cImNsb3NlXCJcbiAgICAgIChrZXlkb3duLmVudGVyKT1cImNsb3NlKCRldmVudClcIlxuICAgICAgKGtleWRvd24uc3BhY2UpPVwiY2xvc2UoJGV2ZW50KVwiXG4gICAgICAoY2xpY2spPVwiY2xvc2UoJGV2ZW50KVwiXG4gICAgPlxuICAgICAgPGN4LWljb24gW3R5cGVdPVwiaWNvblR5cGVzLkNMT1NFXCI+PC9jeC1pY29uPlxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzVGVtcGxhdGVcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29udGVudFwiPjwvbmctY29udGFpbmVyPlxuICA8L25nLWNvbnRhaW5lcj5cbiAgPHNwYW4gKm5nSWY9XCIhaXNUZW1wbGF0ZVwiPnt7IGNvbnRlbnQgfX08L3NwYW4+XG48L2Rpdj5cbiJdfQ==