@spartacus/storefront
Version:
Spartacus Storefront is a package that you can include in your application, which allows you to add default storefront features.
195 lines • 25.3 kB
JavaScript
import { Directive, Input, Output, EventEmitter, HostListener, } from '@angular/core';
import { Subject } from 'rxjs';
import { PopoverComponent } from './popover.component';
import { PopoverEvent } from './popover.model';
import * as i0 from "@angular/core";
import * as i1 from "./popover.service";
import * as i2 from "@spartacus/core";
/**
* Directive to bind popover with any DOM element.
*/
export class PopoverDirective {
constructor(element, viewContainer, componentFactoryResolver, renderer, changeDetectorRef, popoverService, winRef) {
this.element = element;
this.viewContainer = viewContainer;
this.componentFactoryResolver = componentFactoryResolver;
this.renderer = renderer;
this.changeDetectorRef = changeDetectorRef;
this.popoverService = popoverService;
this.winRef = winRef;
/**
* An event emitted when the popover is opened.
*/
this.openPopover = new EventEmitter();
/**
* An event emitted when the popover is closed.
*/
this.closePopover = new EventEmitter();
/**
* Subject which emits specific type of `PopoverEvent`.
*/
this.eventSubject = new Subject();
this.openTriggerEvents = [
PopoverEvent.OPEN,
PopoverEvent.OPEN_BY_KEYBOARD,
];
this.focusPopoverTriggerEvents = [
PopoverEvent.OPEN_BY_KEYBOARD,
];
this.closeTriggerEvents = [
PopoverEvent.ROUTE_CHANGE,
PopoverEvent.ESCAPE_KEYDOWN,
PopoverEvent.OUTSIDE_CLICK,
PopoverEvent.CLOSE_BUTTON_KEYDOWN,
PopoverEvent.CLOSE_BUTTON_CLICK,
];
this.focusDirectiveTriggerEvents = [
PopoverEvent.ESCAPE_KEYDOWN,
PopoverEvent.CLOSE_BUTTON_KEYDOWN,
];
}
/**
* Listen events fired on element binded to popover directive.
*
* Based on event type some a11y improvements can be made.
* For example if popover was opened by `space` or `enter` key
* dedicated `FocusConfig` can be set to autofocus first
* focusable element in popover container.
*/
handlePress(event) {
event === null || event === void 0 ? void 0 : event.preventDefault();
if ((event === null || event === void 0 ? void 0 : event.target) === this.element.nativeElement && !this.isOpen) {
this.eventSubject.next(PopoverEvent.OPEN_BY_KEYBOARD);
}
else if (this.isOpen) {
this.eventSubject.next(PopoverEvent.CLOSE_BUTTON_KEYDOWN);
}
}
handleTab() {
var _a;
if (!((_a = this.focusConfig) === null || _a === void 0 ? void 0 : _a.trap) && this.isOpen) {
this.eventSubject.next(PopoverEvent.CLOSE_BUTTON_KEYDOWN);
}
}
handleEscape() {
this.eventSubject.next(PopoverEvent.ESCAPE_KEYDOWN);
}
handleClick(event) {
event === null || event === void 0 ? void 0 : event.preventDefault();
if ((event === null || event === void 0 ? void 0 : event.target) === this.element.nativeElement && !this.isOpen) {
this.eventSubject.next(PopoverEvent.OPEN);
}
else if (this.isOpen) {
this.eventSubject.next(PopoverEvent.CLOSE_BUTTON_CLICK);
}
}
/**
* Method performs open action for popover component.
*/
open(event) {
var _a, _b;
if (!((_a = this.cxPopoverOptions) === null || _a === void 0 ? void 0 : _a.disable)) {
this.isOpen = true;
this.focusConfig = this.popoverService.getFocusConfig(event, ((_b = this.cxPopoverOptions) === null || _b === void 0 ? void 0 : _b.appendToBody) || false);
this.renderPopover();
this.openPopover.emit();
}
}
/**
* Method performs close action for popover component.
*/
close() {
this.isOpen = false;
this.viewContainer.clear();
this.closePopover.emit();
}
/**
* Method subscribes for events emitted by popover component
* and based on event performs specific action.
*/
handlePopoverEvents() {
this.eventSubject.subscribe((event) => {
var _a;
if (this.openTriggerEvents.includes(event)) {
this.open(event);
}
if (this.focusPopoverTriggerEvents.includes(event)) {
this.popoverContainer.location.nativeElement.focus();
}
if (this.closeTriggerEvents.includes(event)) {
this.close();
}
if (this.focusDirectiveTriggerEvents.includes(event)) {
this.popoverService.setFocusOnElement(this.element, this.focusConfig, (_a = this.cxPopoverOptions) === null || _a === void 0 ? void 0 : _a.appendToBody);
}
});
}
/**
* Method creates instance and pass parameters to popover component.
*/
renderPopover() {
var _a, _b, _c, _d, _e, _f, _g;
const containerFactory = this.componentFactoryResolver.resolveComponentFactory(PopoverComponent);
this.popoverContainer =
this.viewContainer.createComponent(containerFactory);
const componentInstance = this.popoverContainer.instance;
if (componentInstance) {
componentInstance.content = this.cxPopover;
componentInstance.triggerElement = this.element;
componentInstance.popoverInstance = this.popoverContainer;
componentInstance.focusConfig = this.focusConfig;
componentInstance.eventSubject = this.eventSubject;
componentInstance.position = (_a = this.cxPopoverOptions) === null || _a === void 0 ? void 0 : _a.placement;
componentInstance.customClass = (_b = this.cxPopoverOptions) === null || _b === void 0 ? void 0 : _b.class;
componentInstance.appendToBody = (_c = this.cxPopoverOptions) === null || _c === void 0 ? void 0 : _c.appendToBody;
componentInstance.positionOnScroll =
(_d = this.cxPopoverOptions) === null || _d === void 0 ? void 0 : _d.positionOnScroll;
componentInstance.displayCloseButton =
(_e = this.cxPopoverOptions) === null || _e === void 0 ? void 0 : _e.displayCloseButton;
componentInstance.autoPositioning =
(_f = this.cxPopoverOptions) === null || _f === void 0 ? void 0 : _f.autoPositioning;
if ((_g = this.cxPopoverOptions) === null || _g === void 0 ? void 0 : _g.appendToBody) {
this.renderer.appendChild(this.winRef.document.body, this.popoverContainer.location.nativeElement);
}
this.popoverContainer.changeDetectorRef.detectChanges();
}
}
ngOnInit() {
this.handlePopoverEvents();
}
}
PopoverDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: PopoverDirective, deps: [{ token: i0.ElementRef }, { token: i0.ViewContainerRef }, { token: i0.ComponentFactoryResolver }, { token: i0.Renderer2 }, { token: i0.ChangeDetectorRef }, { token: i1.PopoverService }, { token: i2.WindowRef }], target: i0.ɵɵFactoryTarget.Directive });
PopoverDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.0.5", type: PopoverDirective, selector: "[cxPopover]", inputs: { cxPopover: "cxPopover", cxPopoverOptions: "cxPopoverOptions" }, outputs: { openPopover: "openPopover", closePopover: "closePopover" }, host: { listeners: { "keydown.enter": "handlePress($event)", "keydown.space": "handlePress($event)", "keydown.tab": "handleTab()", "keydown.shift.tab": "handleTab()", "keydown.escape": "handleEscape()", "click": "handleClick($event)" } }, ngImport: i0 });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: PopoverDirective, decorators: [{
type: Directive,
args: [{
selector: '[cxPopover]',
}]
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ViewContainerRef }, { type: i0.ComponentFactoryResolver }, { type: i0.Renderer2 }, { type: i0.ChangeDetectorRef }, { type: i1.PopoverService }, { type: i2.WindowRef }]; }, propDecorators: { cxPopover: [{
type: Input
}], cxPopoverOptions: [{
type: Input
}], openPopover: [{
type: Output
}], closePopover: [{
type: Output
}], handlePress: [{
type: HostListener,
args: ['keydown.enter', ['$event']]
}, {
type: HostListener,
args: ['keydown.space', ['$event']]
}], handleTab: [{
type: HostListener,
args: ['keydown.tab']
}, {
type: HostListener,
args: ['keydown.shift.tab']
}], handleEscape: [{
type: HostListener,
args: ['keydown.escape']
}], handleClick: [{
type: HostListener,
args: ['click', ['$event']]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wb3Zlci5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zdG9yZWZyb250bGliL3NoYXJlZC9jb21wb25lbnRzL3BvcG92ZXIvcG9wb3Zlci5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFFVCxLQUFLLEVBT0wsTUFBTSxFQUNOLFlBQVksRUFDWixZQUFZLEdBRWIsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUvQixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsWUFBWSxFQUFrQixNQUFNLGlCQUFpQixDQUFDOzs7O0FBRy9EOztHQUVHO0FBSUgsTUFBTSxPQUFPLGdCQUFnQjtJQW9NM0IsWUFDWSxPQUFtQixFQUNuQixhQUErQixFQUMvQix3QkFBa0QsRUFDbEQsUUFBbUIsRUFDbkIsaUJBQW9DLEVBQ3BDLGNBQThCLEVBQzlCLE1BQWlCO1FBTmpCLFlBQU8sR0FBUCxPQUFPLENBQVk7UUFDbkIsa0JBQWEsR0FBYixhQUFhLENBQWtCO1FBQy9CLDZCQUF3QixHQUF4Qix3QkFBd0IsQ0FBMEI7UUFDbEQsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUNuQixzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQ3BDLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixXQUFNLEdBQU4sTUFBTSxDQUFXO1FBaE03Qjs7V0FFRztRQUNPLGdCQUFXLEdBQXVCLElBQUksWUFBWSxFQUFFLENBQUM7UUFFL0Q7O1dBRUc7UUFDTyxpQkFBWSxHQUF1QixJQUFJLFlBQVksRUFBRSxDQUFDO1FBa0JoRTs7V0FFRztRQUNILGlCQUFZLEdBQTBCLElBQUksT0FBTyxFQUFnQixDQUFDO1FBNEN4RCxzQkFBaUIsR0FBbUI7WUFDNUMsWUFB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Q04sSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7SUFDN0IsQ0FBQzs7NkdBbE1VLGdCQUFnQjtpR0FBaEIsZ0JBQWdCOzJGQUFoQixnQkFBZ0I7a0JBSDVCLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGFBQWE7aUJBQ3hCO29SQUtVLFNBQVM7c0JBQWpCLEtBQUs7Z0JBS0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUtJLFdBQVc7c0JBQXBCLE1BQU07Z0JBS0csWUFBWTtzQkFBckIsTUFBTTtnQkFpQ1AsV0FBVztzQkFGVixZQUFZO3VCQUFDLGVBQWUsRUFBRSxDQUFDLFFBQVEsQ0FBQzs7c0JBQ3hDLFlBQVk7dUJBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVl6QyxTQUFTO3NCQUZSLFlBQVk7dUJBQUMsYUFBYTs7c0JBQzFCLFlBQVk7dUJBQUMsbUJBQW1CO2dCQVFqQyxZQUFZO3NCQURYLFlBQVk7dUJBQUMsZ0JBQWdCO2dCQU05QixXQUFXO3NCQURWLFlBQVk7dUJBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRGlyZWN0aXZlLFxuICBFbGVtZW50UmVmLFxuICBJbnB1dCxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDb250YWluZXJSZWYsXG4gIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgQ29tcG9uZW50UmVmLFxuICBSZW5kZXJlcjIsXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdExpc3RlbmVyLFxuICBPbkluaXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgV2luZG93UmVmIH0gZnJvbSAnQHNwYXJ0YWN1cy9jb3JlJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEZvY3VzQ29uZmlnIH0gZnJvbSAnLi4vLi4vLi4vbGF5b3V0L2ExMXkva2V5Ym9hcmQtZm9jdXMva2V5Ym9hcmQtZm9jdXMubW9kZWwnO1xuaW1wb3J0IHsgUG9wb3ZlckNvbXBvbmVudCB9IGZyb20gJy4vcG9wb3Zlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgUG9wb3ZlckV2ZW50LCBQb3BvdmVyT3B0aW9ucyB9IGZyb20gJy4vcG9wb3Zlci5tb2RlbCc7XG5pbXBvcnQgeyBQb3BvdmVyU2VydmljZSB9IGZyb20gJy4vcG9wb3Zlci5zZXJ2aWNlJztcblxuLyoqXG4gKiBEaXJlY3RpdmUgdG8gYmluZCBwb3BvdmVyIHdpdGggYW55IERPTSBlbGVtZW50LlxuICovXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbY3hQb3BvdmVyXScsXG59KVxuZXhwb3J0IGNsYXNzIFBvcG92ZXJEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQge1xuICAvKipcbiAgICogVGVtcGxhdGUgb3Igc3RyaW5nIHRvIGJlIHJlbmRlcmVkIGluc2lkZSBwb3BvdmVyIHdyYXBwZXIgY29tcG9uZW50LlxuICAgKi9cbiAgQElucHV0KCkgY3hQb3BvdmVyOiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gIC8qKlxuICAgKiBPcHRpb25zIHNldCBmb3IgcG9wb3ZlciBjb21wb25lbnQuXG4gICAqL1xuICBASW5wdXQoKSBjeFBvcG92ZXJPcHRpb25zPzogUG9wb3Zlck9wdGlvbnM7XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IGVtaXR0ZWQgd2hlbiB0aGUgcG9wb3ZlciBpcyBvcGVuZWQuXG4gICAqL1xuICBAT3V0cHV0KCkgb3BlblBvcG92ZXI6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAvKipcbiAgICogQW4gZXZlbnQgZW1pdHRlZCB3aGVuIHRoZSBwb3BvdmVyIGlzIGNsb3NlZC5cbiAgICovXG4gIEBPdXRwdXQoKSBjbG9zZVBvcG92ZXI6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAvKipcbiAgICogRmxhZyB1c2VkIHRvIGluZm9ybSBhYm91dCBjdXJyZW50IHN0YXRlIG9mIHBvcG92ZXIgY29tcG9uZW50LlxuICAgKiBQb3BvdmVyIGlzIGNsb3NlZCBieSBkZWZhdWx0LCBzbyB2YWx1ZSBpcyBzZXQgdG8gZmFsc2UuXG4gICAqL1xuICBpc09wZW46IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFBvcG92ZXIgY29tcG9uZW50IGluc3RhbmNlLlxuICAgKi9cbiAgcG9wb3ZlckNvbnRhaW5lcjogQ29tcG9uZW50UmVmPFBvcG92ZXJDb21wb25lbnQ+O1xuXG4gIC8qKlxuICAgKiBDb25maWd1cmF0aW9uIGZvciBhMTF5IGltcHJvdmVtZW50cy5cbiAgICovXG4gIGZvY3VzQ29uZmlnOiBGb2N1c0NvbmZpZztcblxuICAvKipcbiAgICogU3ViamVjdCB3aGljaCBlbWl0cyBzcGVjaWZpYyB0eXBlIG9mIGBQb3BvdmVyRXZlbnRgLlxuICAgKi9cbiAgZXZlbnRTdWJqZWN0OiBTdWJqZWN0PFBvcG92ZXJFdmVudD4gPSBuZXcgU3ViamVjdDxQb3BvdmVyRXZlbnQ+KCk7XG5cbiAgLyoqXG4gICAqIExpc3RlbiBldmVudHMgZmlyZWQgb24gZWxlbWVudCBiaW5kZWQgdG8gcG9wb3ZlciBkaXJlY3RpdmUuXG4gICAqXG4gICAqIEJhc2VkIG9uIGV2ZW50IHR5cGUgc29tZSBhMTF5IGltcHJvdmVtZW50cyBjYW4gYmUgbWFkZS5cbiAgICogRm9yIGV4YW1wbGUgaWYgcG9wb3ZlciB3YXMgb3BlbmVkIGJ5IGBzcGFjZWAgb3IgYGVudGVyYCBrZXlcbiAgICogZGVkaWNhdGVkIGBGb2N1c0NvbmZpZ2AgY2FuIGJlIHNldCB0byBhdXRvZm9jdXMgZmlyc3RcbiAgICogZm9jdXNhYmxlIGVsZW1lbnQgaW4gcG9wb3ZlciBjb250YWluZXIuXG4gICAqL1xuICBASG9zdExpc3RlbmVyKCdrZXlkb3duLmVudGVyJywgWyckZXZlbnQnXSlcbiAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bi5zcGFjZScsIFsnJGV2ZW50J10pXG4gIGhhbmRsZVByZXNzKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQ/LnByZXZlbnREZWZhdWx0KCk7XG4gICAgaWYgKGV2ZW50Py50YXJnZXQgPT09IHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50ICYmICF0aGlzLmlzT3Blbikge1xuICAgICAgdGhpcy5ldmVudFN1YmplY3QubmV4dChQb3BvdmVyRXZlbnQuT1BFTl9CWV9LRVlCT0FSRCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmlzT3Blbikge1xuICAgICAgdGhpcy5ldmVudFN1YmplY3QubmV4dChQb3BvdmVyRXZlbnQuQ0xPU0VfQlVUVE9OX0tFWURPV04pO1xuICAgIH1cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24udGFiJylcbiAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bi5zaGlmdC50YWInKVxuICBoYW5kbGVUYWIoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmZvY3VzQ29uZmlnPy50cmFwICYmIHRoaXMuaXNPcGVuKSB7XG4gICAgICB0aGlzLmV2ZW50U3ViamVjdC5uZXh0KFBvcG92ZXJFdmVudC5DTE9TRV9CVVRUT05fS0VZRE9XTik7XG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bi5lc2NhcGUnKVxuICBoYW5kbGVFc2NhcGUoKTogdm9pZCB7XG4gICAgdGhpcy5ldmVudFN1YmplY3QubmV4dChQb3BvdmVyRXZlbnQuRVNDQVBFX0tFWURPV04pO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignY2xpY2snLCBbJyRldmVudCddKVxuICBoYW5kbGVDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50Py5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGlmIChldmVudD8udGFyZ2V0ID09PSB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudCAmJiAhdGhpcy5pc09wZW4pIHtcbiAgICAgIHRoaXMuZXZlbnRTdWJqZWN0Lm5leHQoUG9wb3ZlckV2ZW50Lk9QRU4pO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc09wZW4pIHtcbiAgICAgIHRoaXMuZXZlbnRTdWJqZWN0Lm5leHQoUG9wb3ZlckV2ZW50LkNMT1NFX0JVVFRPTl9DTElDSyk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG9wZW5UcmlnZ2VyRXZlbnRzOiBQb3BvdmVyRXZlbnRbXSA9IFtcbiAgICBQb3BvdmVyRXZlbnQuT1BFTixcbiAgICBQb3BvdmVyRXZlbnQuT1BFTl9CWV9LRVlCT0FSRCxcbiAgXTtcblxuICBwcm90ZWN0ZWQgZm9jdXNQb3BvdmVyVHJpZ2dlckV2ZW50czogUG9wb3ZlckV2ZW50W10gPSBbXG4gICAgUG9wb3ZlckV2ZW50Lk9QRU5fQllfS0VZQk9BUkQsXG4gIF07XG5cbiAgcHJvdGVjdGVkIGNsb3NlVHJpZ2dlckV2ZW50czogUG9wb3ZlckV2ZW50W10gPSBbXG4gICAgUG9wb3ZlckV2ZW50LlJPVVRFX0NIQU5HRSxcbiAgICBQb3BvdmVyRXZlbnQuRVNDQVBFX0tFWURPV04sXG4gICAgUG9wb3ZlckV2ZW50Lk9VVFNJREVfQ0xJQ0ssXG4gICAgUG9wb3ZlckV2ZW50LkNMT1NFX0JVVFRPTl9LRVlET1dOLFxuICAgIFBvcG92ZXJFdmVudC5DTE9TRV9CVVRUT05fQ0xJQ0ssXG4gIF07XG5cbiAgcHJvdGVjdGVkIGZvY3VzRGlyZWN0aXZlVHJpZ2dlckV2ZW50czogUG9wb3ZlckV2ZW50W10gPSBbXG4gICAgUG9wb3ZlckV2ZW50LkVTQ0FQRV9LRVlET1dOLFxuICAgIFBvcG92ZXJFdmVudC5DTE9TRV9CVVRUT05fS0VZRE9XTixcbiAgXTtcblxuICAvKipcbiAgICogTWV0aG9kIHBlcmZvcm1zIG9wZW4gYWN0aW9uIGZvciBwb3BvdmVyIGNvbXBvbmVudC5cbiAgICovXG4gIG9wZW4oZXZlbnQ6IFBvcG92ZXJFdmVudCkge1xuICAgIGlmICghdGhpcy5jeFBvcG92ZXJPcHRpb25zPy5kaXNhYmxlKSB7XG4gICAgICB0aGlzLmlzT3BlbiA9IHRydWU7XG4gICAgICB0aGlzLmZvY3VzQ29uZmlnID0gdGhpcy5wb3BvdmVyU2VydmljZS5nZXRGb2N1c0NvbmZpZyhcbiAgICAgICAgZXZlbnQsXG4gICAgICAgIHRoaXMuY3hQb3BvdmVyT3B0aW9ucz8uYXBwZW5kVG9Cb2R5IHx8IGZhbHNlXG4gICAgICApO1xuICAgICAgdGhpcy5yZW5kZXJQb3BvdmVyKCk7XG4gICAgICB0aGlzLm9wZW5Qb3BvdmVyLmVtaXQoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHBlcmZvcm1zIGNsb3NlIGFjdGlvbiBmb3IgcG9wb3ZlciBjb21wb25lbnQuXG4gICAqL1xuICBjbG9zZSgpIHtcbiAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xuICAgIHRoaXMudmlld0NvbnRhaW5lci5jbGVhcigpO1xuICAgIHRoaXMuY2xvc2VQb3BvdmVyLmVtaXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2Qgc3Vic2NyaWJlcyBmb3IgZXZlbnRzIGVtaXR0ZWQgYnkgcG9wb3ZlciBjb21wb25lbnRcbiAgICogYW5kIGJhc2VkIG9uIGV2ZW50IHBlcmZvcm1zIHNwZWNpZmljIGFjdGlvbi5cbiAgICovXG4gIGhhbmRsZVBvcG92ZXJFdmVudHMoKSB7XG4gICAgdGhpcy5ldmVudFN1YmplY3Quc3Vic2NyaWJlKChldmVudDogUG9wb3ZlckV2ZW50KSA9PiB7XG4gICAgICBpZiAodGhpcy5vcGVuVHJpZ2dlckV2ZW50cy5pbmNsdWRlcyhldmVudCkpIHtcbiAgICAgICAgdGhpcy5vcGVuKGV2ZW50KTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmZvY3VzUG9wb3ZlclRyaWdnZXJFdmVudHMuaW5jbHVkZXMoZXZlbnQpKSB7XG4gICAgICAgIHRoaXMucG9wb3ZlckNvbnRhaW5lci5sb2NhdGlvbi5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jbG9zZVRyaWdnZXJFdmVudHMuaW5jbHVkZXMoZXZlbnQpKSB7XG4gICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmZvY3VzRGlyZWN0aXZlVHJpZ2dlckV2ZW50cy5pbmNsdWRlcyhldmVudCkpIHtcbiAgICAgICAgdGhpcy5wb3BvdmVyU2VydmljZS5zZXRGb2N1c09uRWxlbWVudChcbiAgICAgICAgICB0aGlzLmVsZW1lbnQsXG4gICAgICAgICAgdGhpcy5mb2N1c0NvbmZpZyxcbiAgICAgICAgICB0aGlzLmN4UG9wb3Zlck9wdGlvbnM/LmFwcGVuZFRvQm9keVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCBjcmVhdGVzIGluc3RhbmNlIGFuZCBwYXNzIHBhcmFtZXRlcnMgdG8gcG9wb3ZlciBjb21wb25lbnQuXG4gICAqL1xuICByZW5kZXJQb3BvdmVyKCkge1xuICAgIGNvbnN0IGNvbnRhaW5lckZhY3RvcnkgPVxuICAgICAgdGhpcy5jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoUG9wb3ZlckNvbXBvbmVudCk7XG4gICAgdGhpcy5wb3BvdmVyQ29udGFpbmVyID1cbiAgICAgIHRoaXMudmlld0NvbnRhaW5lci5jcmVhdGVDb21wb25lbnQoY29udGFpbmVyRmFjdG9yeSk7XG5cbiAgICBjb25zdCBjb21wb25lbnRJbnN0YW5jZSA9IHRoaXMucG9wb3ZlckNvbnRhaW5lci5pbnN0YW5jZTtcbiAgICBpZiAoY29tcG9uZW50SW5zdGFuY2UpIHtcbiAgICAgIGNvbXBvbmVudEluc3RhbmNlLmNvbnRlbnQgPSB0aGlzLmN4UG9wb3ZlcjtcbiAgICAgIGNvbXBvbmVudEluc3RhbmNlLnRyaWdnZXJFbGVtZW50ID0gdGhpcy5lbGVtZW50O1xuICAgICAgY29tcG9uZW50SW5zdGFuY2UucG9wb3Zlckluc3RhbmNlID0gdGhpcy5wb3BvdmVyQ29udGFpbmVyO1xuICAgICAgY29tcG9uZW50SW5zdGFuY2UuZm9jdXNDb25maWcgPSB0aGlzLmZvY3VzQ29uZmlnO1xuICAgICAgY29tcG9uZW50SW5zdGFuY2UuZXZlbnRTdWJqZWN0ID0gdGhpcy5ldmVudFN1YmplY3Q7XG4gICAgICBjb21wb25lbnRJbnN0YW5jZS5wb3NpdGlvbiA9IHRoaXMuY3hQb3BvdmVyT3B0aW9ucz8ucGxhY2VtZW50O1xuICAgICAgY29tcG9uZW50SW5zdGFuY2UuY3VzdG9tQ2xhc3MgPSB0aGlzLmN4UG9wb3Zlck9wdGlvbnM/LmNsYXNzO1xuICAgICAgY29tcG9uZW50SW5zdGFuY2UuYXBwZW5kVG9Cb2R5ID0gdGhpcy5jeFBvcG92ZXJPcHRpb25zPy5hcHBlbmRUb0JvZHk7XG4gICAgICBjb21wb25lbnRJbnN0YW5jZS5wb3NpdGlvbk9uU2Nyb2xsID1cbiAgICAgICAgdGhpcy5jeFBvcG92ZXJPcHRpb25zPy5wb3NpdGlvbk9uU2Nyb2xsO1xuICAgICAgY29tcG9uZW50SW5zdGFuY2UuZGlzcGxheUNsb3NlQnV0dG9uID1cbiAgICAgICAgdGhpcy5jeFBvcG92ZXJPcHRpb25zPy5kaXNwbGF5Q2xvc2VCdXR0b247XG4gICAgICBjb21wb25lbnRJbnN0YW5jZS5hdXRvUG9zaXRpb25pbmcgPVxuICAgICAgICB0aGlzLmN4UG9wb3Zlck9wdGlvbnM/LmF1dG9Qb3NpdGlvbmluZztcblxuICAgICAgaWYgKHRoaXMuY3hQb3BvdmVyT3B0aW9ucz8uYXBwZW5kVG9Cb2R5KSB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQoXG4gICAgICAgICAgdGhpcy53aW5SZWYuZG9jdW1lbnQuYm9keSxcbiAgICAgICAgICB0aGlzLnBvcG92ZXJDb250YWluZXIubG9jYXRpb24ubmF0aXZlRWxlbWVudFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnBvcG92ZXJDb250YWluZXIuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuaGFuZGxlUG9wb3ZlckV2ZW50cygpO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGVsZW1lbnQ6IEVsZW1lbnRSZWYsXG4gICAgcHJvdGVjdGVkIHZpZXdDb250YWluZXI6IFZpZXdDb250YWluZXJSZWYsXG4gICAgcHJvdGVjdGVkIGNvbXBvbmVudEZhY3RvcnlSZXNvbHZlcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICAgIHByb3RlY3RlZCByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIHByb3RlY3RlZCBjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJvdGVjdGVkIHBvcG92ZXJTZXJ2aWNlOiBQb3BvdmVyU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgd2luUmVmOiBXaW5kb3dSZWZcbiAgKSB7fVxufVxuIl19