@seethelemurcricut/ngx-contextmenu
Version:
An Angular component to show a context menu on an arbitrary component
303 lines (302 loc) • 36.1 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import { Overlay, ScrollStrategyOptions } from '@angular/cdk/overlay';
import { ComponentPortal } from '@angular/cdk/portal';
import { ElementRef, Injectable } from '@angular/core';
import { Subject, Subscription } from 'rxjs';
import { ContextMenuContentComponent } from './contextMenuContent.component';
/**
* @record
*/
export function IContextMenuClickEvent() { }
function IContextMenuClickEvent_tsickle_Closure_declarations() {
/** @type {?|undefined} */
IContextMenuClickEvent.prototype.anchorElement;
/** @type {?|undefined} */
IContextMenuClickEvent.prototype.contextMenu;
/** @type {?|undefined} */
IContextMenuClickEvent.prototype.event;
/** @type {?|undefined} */
IContextMenuClickEvent.prototype.parentContextMenu;
/** @type {?} */
IContextMenuClickEvent.prototype.item;
/** @type {?|undefined} */
IContextMenuClickEvent.prototype.activeMenuItemIndex;
}
/**
* @record
*/
export function IContextMenuContext() { }
function IContextMenuContext_tsickle_Closure_declarations() {
/** @type {?} */
IContextMenuContext.prototype.menuItems;
/** @type {?} */
IContextMenuContext.prototype.menuClass;
}
/**
* @record
*/
export function CloseLeafMenuEvent() { }
function CloseLeafMenuEvent_tsickle_Closure_declarations() {
/** @type {?|undefined} */
CloseLeafMenuEvent.prototype.exceptRootMenu;
/** @type {?|undefined} */
CloseLeafMenuEvent.prototype.event;
}
/**
* @record
*/
export function OverlayRefWithContextMenu() { }
function OverlayRefWithContextMenu_tsickle_Closure_declarations() {
/** @type {?|undefined} */
OverlayRefWithContextMenu.prototype.contextMenu;
}
/**
* @record
*/
export function CancelContextMenuEvent() { }
function CancelContextMenuEvent_tsickle_Closure_declarations() {
/** @type {?} */
CancelContextMenuEvent.prototype.eventType;
/** @type {?|undefined} */
CancelContextMenuEvent.prototype.event;
}
/**
* @record
*/
export function ExecuteContextMenuEvent() { }
function ExecuteContextMenuEvent_tsickle_Closure_declarations() {
/** @type {?} */
ExecuteContextMenuEvent.prototype.eventType;
/** @type {?|undefined} */
ExecuteContextMenuEvent.prototype.event;
/** @type {?} */
ExecuteContextMenuEvent.prototype.item;
/** @type {?} */
ExecuteContextMenuEvent.prototype.menuItem;
}
export class ContextMenuService {
/**
* @param {?} overlay
* @param {?} scrollStrategy
*/
constructor(overlay, scrollStrategy) {
this.overlay = overlay;
this.scrollStrategy = scrollStrategy;
this.isDestroyingLeafMenu = false;
this.show = new Subject();
this.triggerClose = new Subject();
this.close = new Subject();
this.overlays = [];
this.fakeElement = {
getBoundingClientRect: () => ({
bottom: 0,
height: 0,
left: 0,
right: 0,
top: 0,
width: 0
})
};
}
/**
* @param {?} context
* @return {?}
*/
openContextMenu(context) {
const { anchorElement, event, parentContextMenu } = context;
if (!parentContextMenu) {
const /** @type {?} */ mouseEvent = /** @type {?} */ (event);
this.fakeElement.getBoundingClientRect = () => ({
bottom: mouseEvent.clientY,
height: 0,
left: mouseEvent.clientX,
right: mouseEvent.clientX,
top: mouseEvent.clientY,
width: 0
});
this.closeAllContextMenus({ eventType: 'cancel', event });
const /** @type {?} */ positionStrategy = this.overlay
.position()
.connectedTo(new ElementRef(anchorElement || this.fakeElement), { originX: 'start', originY: 'top' }, { overlayX: 'start', overlayY: 'top' })
.withFallbackPosition({ originX: 'start', originY: 'top' }, { overlayX: 'end', overlayY: 'top' })
.withFallbackPosition({ originX: 'start', originY: 'top' }, { overlayX: 'start', overlayY: 'center' })
.withFallbackPosition({ originX: 'start', originY: 'top' }, { overlayX: 'end', overlayY: 'center' })
.withFallbackPosition({ originX: 'start', originY: 'top' }, { overlayX: 'start', overlayY: 'bottom' })
.withFallbackPosition({ originX: 'start', originY: 'top' }, { overlayX: 'end', overlayY: 'bottom' });
this.overlays = [
this.overlay.create({
positionStrategy,
panelClass: 'ngx-contextmenu',
scrollStrategy: this.scrollStrategy.close()
})
];
this.attachContextMenu(this.overlays[0], context);
}
else {
const /** @type {?} */ positionStrategy = this.overlay
.position()
.connectedTo(new ElementRef(event ? event.target : anchorElement), { originX: context.menuClass === 'sub-to-side' ? 'end' : 'start', originY: 'top' }, { overlayX: 'start', overlayY: 'top' })
.withFallbackPosition({ originX: 'start', originY: 'top' }, { overlayX: 'end', overlayY: 'top' })
.withFallbackPosition({ originX: 'start', originY: 'top' }, { overlayX: 'start', overlayY: 'center' })
.withFallbackPosition({ originX: 'start', originY: 'top' }, { overlayX: 'end', overlayY: 'center' })
.withFallbackPosition({ originX: 'start', originY: 'top' }, { overlayX: 'start', overlayY: 'bottom' })
.withFallbackPosition({ originX: 'start', originY: 'top' }, { overlayX: 'end', overlayY: 'bottom' });
const /** @type {?} */ newOverlay = this.overlay.create({
positionStrategy,
panelClass: 'ngx-contextmenu',
scrollStrategy: this.scrollStrategy.close()
});
this.destroySubMenus(parentContextMenu);
this.overlays = this.overlays.concat(newOverlay);
this.attachContextMenu(newOverlay, context);
}
}
/**
* @param {?} overlay
* @param {?} context
* @return {?}
*/
attachContextMenu(overlay, context) {
const { event, item, menuItems, menuClass } = context;
const /** @type {?} */ contextMenuContent = overlay.attach(new ComponentPortal(ContextMenuContentComponent));
contextMenuContent.instance.event = event;
contextMenuContent.instance.item = item;
contextMenuContent.instance.menuItems = menuItems;
contextMenuContent.instance.overlay = overlay;
contextMenuContent.instance.isLeaf = true;
contextMenuContent.instance.menuClass = menuClass;
(/** @type {?} */ (overlay)).contextMenu = contextMenuContent.instance;
const /** @type {?} */ subscriptions = new Subscription();
subscriptions.add(contextMenuContent.instance.execute
.asObservable()
.subscribe((executeEvent) => this.closeAllContextMenus(Object.assign({ eventType: 'execute' }, executeEvent))));
subscriptions.add(contextMenuContent.instance.closeAllMenus
.asObservable()
.subscribe((closeAllEvent) => this.closeAllContextMenus(Object.assign({ eventType: 'cancel' }, closeAllEvent))));
subscriptions.add(contextMenuContent.instance.closeLeafMenu
.asObservable()
.subscribe((closeLeafMenuEvent) => this.destroyLeafMenu(closeLeafMenuEvent)));
subscriptions.add(contextMenuContent.instance.openSubMenu
.asObservable()
.subscribe((subMenuEvent) => {
this.destroySubMenus(contextMenuContent.instance);
if (!subMenuEvent.contextMenu) {
contextMenuContent.instance.isLeaf = true;
return;
}
contextMenuContent.instance.isLeaf = false;
this.show.next(subMenuEvent);
}));
contextMenuContent.onDestroy(() => {
menuItems.forEach((menuItem) => (menuItem.isActive = false));
subscriptions.unsubscribe();
});
contextMenuContent.changeDetectorRef.detectChanges();
}
/**
* @param {?} closeEvent
* @return {?}
*/
closeAllContextMenus(closeEvent) {
if (this.overlays) {
this.close.next(closeEvent);
this.overlays.forEach((overlay, index) => {
overlay.detach();
overlay.dispose();
});
}
this.overlays = [];
}
/**
* @return {?}
*/
getLastAttachedOverlay() {
let /** @type {?} */ overlay = this.overlays[this.overlays.length - 1];
while (this.overlays.length > 1 && overlay && !overlay.hasAttached()) {
overlay.detach();
overlay.dispose();
this.overlays = this.overlays.slice(0, -1);
overlay = this.overlays[this.overlays.length - 1];
}
return overlay;
}
/**
* @param {?=} __0
* @return {?}
*/
destroyLeafMenu({ exceptRootMenu, event } = {}) {
if (this.isDestroyingLeafMenu) {
return;
}
this.isDestroyingLeafMenu = true;
setTimeout(() => {
const /** @type {?} */ overlay = this.getLastAttachedOverlay();
if (this.overlays.length > 1 && overlay) {
overlay.detach();
overlay.dispose();
}
if (!exceptRootMenu && this.overlays.length > 0 && overlay) {
this.close.next({ eventType: 'cancel', event });
overlay.detach();
overlay.dispose();
}
const /** @type {?} */ newLeaf = this.getLastAttachedOverlay();
if (newLeaf) {
newLeaf.contextMenu.isLeaf = true;
}
this.isDestroyingLeafMenu = false;
});
}
/**
* @param {?} contextMenu
* @return {?}
*/
destroySubMenus(contextMenu) {
const /** @type {?} */ overlay = contextMenu.overlay;
const /** @type {?} */ index = this.overlays.indexOf(overlay);
this.overlays.slice(index + 1).forEach((subMenuOverlay) => {
subMenuOverlay.detach();
subMenuOverlay.dispose();
});
}
/**
* @param {?} contextMenuContent
* @return {?}
*/
isLeafMenu(contextMenuContent) {
const /** @type {?} */ overlay = this.getLastAttachedOverlay();
return contextMenuContent.overlay === overlay;
}
}
ContextMenuService.decorators = [
{ type: Injectable },
];
/** @nocollapse */
ContextMenuService.ctorParameters = () => [
{ type: Overlay },
{ type: ScrollStrategyOptions }
];
function ContextMenuService_tsickle_Closure_declarations() {
/** @type {?} */
ContextMenuService.prototype.isDestroyingLeafMenu;
/** @type {?} */
ContextMenuService.prototype.show;
/** @type {?} */
ContextMenuService.prototype.triggerClose;
/** @type {?} */
ContextMenuService.prototype.close;
/** @type {?} */
ContextMenuService.prototype.contextMenuContent;
/** @type {?} */
ContextMenuService.prototype.overlays;
/** @type {?} */
ContextMenuService.prototype.fakeElement;
/** @type {?} */
ContextMenuService.prototype.overlay;
/** @type {?} */
ContextMenuService.prototype.scrollStrategy;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dE1lbnUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BzZWV0aGVsZW11cmNyaWN1dC9uZ3gtY29udGV4dG1lbnUvIiwic291cmNlcyI6WyJsaWIvY29udGV4dE1lbnUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLE9BQU8sRUFBYyxxQkFBcUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQWdCLFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckUsT0FBTyxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFJN0MsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBbUM3RSxNQUFNOzs7OztJQW9CRixZQUFvQixPQUFnQixFQUFVLGNBQXFDO1FBQS9ELFlBQU8sR0FBUCxPQUFPLENBQVM7UUFBVSxtQkFBYyxHQUFkLGNBQWMsQ0FBdUI7b0NBbkJyRCxLQUFLO29CQUVZLElBQUksT0FBTyxFQUEwQjs0QkFDeEIsSUFBSSxPQUFPLEVBQUU7cUJBQzFCLElBQUksT0FBTyxFQUFFO3dCQUczQixFQUFFOzJCQUNSO1lBQ3ZCLHFCQUFxQixFQUFFLEdBQWUsRUFBRSxDQUFDLENBQUM7Z0JBQ3RDLE1BQU0sRUFBRSxDQUFDO2dCQUNULE1BQU0sRUFBRSxDQUFDO2dCQUNULElBQUksRUFBRSxDQUFDO2dCQUNQLEtBQUssRUFBRSxDQUFDO2dCQUNSLEdBQUcsRUFBRSxDQUFDO2dCQUNOLEtBQUssRUFBRSxDQUFDO2FBQ1gsQ0FBQztTQUNMO0tBRXNGOzs7OztJQUVoRixlQUFlLENBQUMsT0FBNEI7UUFDL0MsTUFB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QUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsY0FBYyxFQUFFLEVBQUU7WUFDdEQsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3hCLGNBQWMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUM1QixDQUFDLENBQUM7Ozs7OztJQUdBLFVBQVUsQ0FBQyxrQkFBK0M7UUFDN0QsdUJBQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQzlDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLEtBQUssT0FBTyxDQUFDOzs7O1lBak9yRCxVQUFVOzs7O1lBekNGLE9BQU87WUFBYyxxQkFBcUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPdmVybGF5LCBPdmVybGF5UmVmLCBTY3JvbGxTdHJhdGVneU9wdGlvbnMgfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQgeyBDb21wb25lbnRQb3J0YWwgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7IENvbXBvbmVudFJlZiwgRWxlbWVudFJlZiwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IENvbnRleHRNZW51Q29tcG9uZW50IH0gZnJvbSAnLi9jb250ZXh0TWVudS5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ29udGV4dE1lbnVJdGVtRGlyZWN0aXZlIH0gZnJvbSAnLi9jb250ZXh0TWVudS5pdGVtLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBDb250ZXh0TWVudUNvbnRlbnRDb21wb25lbnQgfSBmcm9tICcuL2NvbnRleHRNZW51Q29udGVudC5jb21wb25lbnQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElDb250ZXh0TWVudUNsaWNrRXZlbnQge1xuICAgIGFuY2hvckVsZW1lbnQ/OiBFbGVtZW50IHwgRXZlbnRUYXJnZXQ7XG4gICAgY29udGV4dE1lbnU/OiBDb250ZXh0TWVudUNvbXBvbmVudDtcbiAgICBldmVudD86IE1vdXNlRXZlbnQgfCBLZXlib2FyZEV2ZW50O1xuICAgIHBhcmVudENvbnRleHRNZW51PzogQ29udGV4dE1lbnVDb250ZW50Q29tcG9uZW50O1xuICAgIGl0ZW06IGFueTtcbiAgICBhY3RpdmVNZW51SXRlbUluZGV4PzogbnVtYmVyO1xufVxuZXhwb3J0IGludGVyZmFjZSBJQ29udGV4dE1lbnVDb250ZXh0IGV4dGVuZHMgSUNvbnRleHRNZW51Q2xpY2tFdmVudCB7XG4gICAgbWVudUl0ZW1zOiBDb250ZXh0TWVudUl0ZW1EaXJlY3RpdmVbXTtcbiAgICBtZW51Q2xhc3M6IHN0cmluZztcbn1cbmV4cG9ydCBpbnRlcmZhY2UgQ2xvc2VMZWFmTWVudUV2ZW50IHtcbiAgICBleGNlcHRSb290TWVudT86IGJvb2xlYW47XG4gICAgZXZlbnQ/OiBNb3VzZUV2ZW50IHwgS2V5Ym9hcmRFdmVudDtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgT3ZlcmxheVJlZldpdGhDb250ZXh0TWVudSBleHRlbmRzIE92ZXJsYXlSZWYge1xuICAgIGNvbnRleHRNZW51PzogQ29udGV4dE1lbnVDb250ZW50Q29tcG9uZW50O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENhbmNlbENvbnRleHRNZW51RXZlbnQge1xuICAgIGV2ZW50VHlwZTogJ2NhbmNlbCc7XG4gICAgZXZlbnQ/OiBNb3VzZUV2ZW50IHwgS2V5Ym9hcmRFdmVudDtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgRXhlY3V0ZUNvbnRleHRNZW51RXZlbnQge1xuICAgIGV2ZW50VHlwZTogJ2V4ZWN1dGUnO1xuICAgIGV2ZW50PzogTW91c2VFdmVudCB8IEtleWJvYXJkRXZlbnQ7XG4gICAgaXRlbTogYW55O1xuICAgIG1lbnVJdGVtOiBDb250ZXh0TWVudUl0ZW1EaXJlY3RpdmU7XG59XG5leHBvcnQgdHlwZSBDbG9zZUNvbnRleHRNZW51RXZlbnQgPSBFeGVjdXRlQ29udGV4dE1lbnVFdmVudCB8IENhbmNlbENvbnRleHRNZW51RXZlbnQ7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBDb250ZXh0TWVudVNlcnZpY2Uge1xuICAgIHB1YmxpYyBpc0Rlc3Ryb3lpbmdMZWFmTWVudSA9IGZhbHNlO1xuXG4gICAgcHVibGljIHNob3c6IFN1YmplY3Q8SUNvbnRleHRNZW51Q2xpY2tFdmVudD4gPSBuZXcgU3ViamVjdDxJQ29udGV4dE1lbnVDbGlja0V2ZW50PigpO1xuICAgIHB1YmxpYyB0cmlnZ2VyQ2xvc2U6IFN1YmplY3Q8Q29udGV4dE1lbnVDb250ZW50Q29tcG9uZW50PiA9IG5ldyBTdWJqZWN0KCk7XG4gICAgcHVibGljIGNsb3NlOiBTdWJqZWN0PENsb3NlQ29udGV4dE1lbnVFdmVudD4gPSBuZXcgU3ViamVjdCgpO1xuXG4gICAgcHJpdmF0ZSBjb250ZXh0TWVudUNvbnRlbnQ6IENvbXBvbmVudFJlZjxDb250ZXh0TWVudUNvbnRlbnRDb21wb25lbnQ+O1xuICAgIHByaXZhdGUgb3ZlcmxheXM6IE92ZXJsYXlSZWZbXSA9IFtdO1xuICAgIHByaXZhdGUgZmFrZUVsZW1lbnQ6IGFueSA9IHtcbiAgICAgICAgZ2V0Qm91bmRpbmdDbGllbnRSZWN0OiAoKTogQ2xpZW50UmVjdCA9PiAoe1xuICAgICAgICAgICAgYm90dG9tOiAwLFxuICAgICAgICAgICAgaGVpZ2h0OiAwLFxuICAgICAgICAgICAgbGVmdDogMCxcbiAgICAgICAgICAgIHJpZ2h0OiAwLFxuICAgICAgICAgICAgdG9wOiAwLFxuICAgICAgICAgICAgd2lkdGg6IDBcbiAgICAgICAgfSlcbiAgICB9O1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBvdmVybGF5OiBPdmVybGF5LCBwcml2YXRlIHNjcm9sbFN0cmF0ZWd5OiBTY3JvbGxTdHJhdGVneU9wdGlvbnMpIHt9XG5cbiAgICBwdWJsaWMgb3BlbkNvbnRleHRNZW51KGNvbnRleHQ6IElDb250ZXh0TWVudUNvbnRleHQpIHtcbiAgICAgICAgY29uc3QgeyBhbmNob3JFbGVtZW50LCBldmVudCwgcGFyZW50Q29udGV4dE1lbnUgfSA9IGNvbnRleHQ7XG5cbiAgICAgICAgaWYgKCFwYXJlbnRDb250ZXh0TWVudSkge1xuICAgICAgICAgICAgY29uc3QgbW91c2VFdmVudCA9IGV2ZW50IGFzIE1vdXNlRXZlbnQ7XG4gICAgICAgICAgICB0aGlzLmZha2VFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCA9ICgpOiBDbGllbnRSZWN0ID0+ICh7XG4gICAgICAgICAgICAgICAgYm90dG9tOiBtb3VzZUV2ZW50LmNsaWVudFksXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiAwLFxuICAgICAgICAgICAgICAgIGxlZnQ6IG1vdXNlRXZlbnQuY2xpZW50WCxcbiAgICAgICAgICAgICAgICByaWdodDogbW91c2VFdmVudC5jbGllbnRYLFxuICAgICAgICAgICAgICAgIHRvcDogbW91c2VFdmVudC5jbGllbnRZLFxuICAgICAgICAgICAgICAgIHdpZHRoOiAwXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VBbGxDb250ZXh0TWVudXMoeyBldmVudFR5cGU6ICdjYW5jZWwnLCBldmVudCB9KTtcbiAgICAgICAgICAgIGNvbnN0IHBvc2l0aW9uU3RyYXRlZ3kgPSB0aGlzLm92ZXJsYXlcbiAgICAgICAgICAgICAgICAucG9zaXRpb24oKVxuICAgICAgICAgICAgICAgIC5jb25uZWN0ZWRUbyhcbiAgICAgICAgICAgICAgICAgICAgbmV3IEVsZW1lbnRSZWYoYW5jaG9yRWxlbWVudCB8fCB0aGlzLmZha2VFbGVtZW50KSxcbiAgICAgICAgICAgICAgICAgICAgeyBvcmlnaW5YOiAnc3RhcnQnLCBvcmlnaW5ZOiAndG9wJyB9LFxuICAgICAgICAgICAgICAgICAgICB7IG92ZXJsYXlYOiAnc3RhcnQnLCBvdmVybGF5WTogJ3RvcCcgfVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAud2l0aEZhbGxiYWNrUG9zaXRpb24oXG4gICAgICAgICAgICAgICAgICAgIHsgb3JpZ2luWDogJ3N0YXJ0Jywgb3JpZ2luWTogJ3RvcCcgfSxcbiAgICAgICAgICAgICAgICAgICAgeyBvdmVybGF5WDogJ2VuZCcsIG92ZXJsYXlZOiAndG9wJyB9XG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC53aXRoRmFsbGJhY2tQb3NpdGlvbihcbiAgICAgICAgICAgICAgICAgICAgeyBvcmlnaW5YOiAnc3RhcnQnLCBvcmlnaW5ZOiAndG9wJyB9LFxuICAgICAgICAgICAgICAgICAgICB7IG92ZXJsYXlYOiAnc3RhcnQnLCBvdmVybGF5WTogJ2NlbnRlcicgfVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAud2l0aEZhbGxiYWNrUG9zaXRpb24oXG4gICAgICAgICAgICAgICAgICAgIHsgb3JpZ2luWDogJ3N0YXJ0Jywgb3JpZ2luWTogJ3RvcCcgfSxcbiAgICAgICAgICAgICAgICAgICAgeyBvdmVybGF5WDogJ2VuZCcsIG92ZXJsYXlZOiAnY2VudGVyJyB9XG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC53aXRoRmFsbGJhY2tQb3NpdGlvbihcbiAgICAgICAgICAgICAgICAgICAgeyBvcmlnaW5YOiAnc3RhcnQnLCBvcmlnaW5ZOiAndG9wJyB9LFxuICAgICAgICAgICAgICAgICAgICB7IG92ZXJsYXlYOiAnc3RhcnQnLCBvdmVybGF5WTogJ2JvdHRvbScgfVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAud2l0aEZhbGxiYWNrUG9zaXRpb24oXG4gICAgICAgICAgICAgICAgICAgIHsgb3JpZ2luWDogJ3N0YXJ0Jywgb3JpZ2luWTogJ3RvcCcgfSxcbiAgICAgICAgICAgICAgICAgICAgeyBvdmVybGF5WDogJ2VuZCcsIG92ZXJsYXlZOiAnYm90dG9tJyB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMub3ZlcmxheXMgPSBbXG4gICAgICAgICAgICAgICAgdGhpcy5vdmVybGF5LmNyZWF0ZSh7XG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uU3RyYXRlZ3ksXG4gICAgICAgICAgICAgICAgICAgIHBhbmVsQ2xhc3M6ICduZ3gtY29udGV4dG1lbnUnLFxuICAgICAgICAgICAgICAgICAgICBzY3JvbGxTdHJhdGVneTogdGhpcy5zY3JvbGxTdHJhdGVneS5jbG9zZSgpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICB0aGlzLmF0dGFjaENvbnRleHRNZW51KHRoaXMub3ZlcmxheXNbMF0sIGNvbnRleHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcG9zaXRpb25TdHJhdGVneSA9IHRoaXMub3ZlcmxheVxuICAgICAgICAgICAgICAgIC5wb3NpdGlvbigpXG4gICAgICAgICAgICAgICAgLmNvbm5lY3RlZFRvKFxuICAgICAgICAgICAgICAgICAgICBuZXcgRWxlbWVudFJlZihldmVudCA/IGV2ZW50LnRhcmdldCA6IGFuY2hvckVsZW1lbnQpLFxuICAgICAgICAgICAgICAgICAgICB7IG9yaWdpblg6IGNvbnRleHQubWVudUNsYXNzID09PSAnc3ViLXRvLXNpZGUnID8gJ2VuZCcgOiAnc3RhcnQnLCBvcmlnaW5ZOiAndG9wJyB9LFxuICAgICAgICAgICAgICAgICAgICB7IG92ZXJsYXlYOiAnc3RhcnQnLCBvdmVybGF5WTogJ3RvcCcgfVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAud2l0aEZhbGxiYWNrUG9zaXRpb24oXG4gICAgICAgICAgICAgICAgICAgIHsgb3JpZ2luWDogJ3N0YXJ0Jywgb3JpZ2luWTogJ3RvcCcgfSxcbiAgICAgICAgICAgICAgICAgICAgeyBvdmVybGF5WDogJ2VuZCcsIG92ZXJsYXlZOiAndG9wJyB9XG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC53aXRoRmFsbGJhY2tQb3NpdGlvbihcbiAgICAgICAgICAgICAgICAgICAgeyBvcmlnaW5YOiAnc3RhcnQnLCBvcmlnaW5ZOiAndG9wJyB9LFxuICAgICAgICAgICAgICAgICAgICB7IG92ZXJsYXlYOiAnc3RhcnQnLCBvdmVybGF5WTogJ2NlbnRlcicgfVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAud2l0aEZhbGxiYWNrUG9zaXRpb24oXG4gICAgICAgICAgICAgICAgICAgIHsgb3JpZ2luWDogJ3N0YXJ0Jywgb3JpZ2luWTogJ3RvcCcgfSxcbiAgICAgICAgICAgICAgICAgICAgeyBvdmVybGF5WDogJ2VuZCcsIG92ZXJsYXlZOiAnY2VudGVyJyB9XG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC53aXRoRmFsbGJhY2tQb3NpdGlvbihcbiAgICAgICAgICAgICAgICAgICAgeyBvcmlnaW5YOiAnc3RhcnQnLCBvcmlnaW5ZOiAndG9wJyB9LFxuICAgICAgICAgICAgICAgICAgICB7IG92ZXJsYXlYOiAnc3RhcnQnLCBvdmVybGF5WTogJ2JvdHRvbScgfVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAud2l0aEZhbGxiYWNrUG9zaXRpb24oXG4gICAgICAgICAgICAgICAgICAgIHsgb3JpZ2luWDogJ3N0YXJ0Jywgb3JpZ2luWTogJ3RvcCcgfSxcbiAgICAgICAgICAgICAgICAgICAgeyBvdmVybGF5WDogJ2VuZCcsIG92ZXJsYXlZOiAnYm90dG9tJyB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IG5ld092ZXJsYXkgPSB0aGlzLm92ZXJsYXkuY3JlYXRlKHtcbiAgICAgICAgICAgICAgICBwb3NpdGlvblN0cmF0ZWd5LFxuICAgICAgICAgICAgICAgIHBhbmVsQ2xhc3M6ICduZ3gtY29udGV4dG1lbnUnLFxuICAgICAgICAgICAgICAgIHNjcm9sbFN0cmF0ZWd5OiB0aGlzLnNjcm9sbFN0cmF0ZWd5LmNsb3NlKClcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5kZXN0cm95U3ViTWVudXMocGFyZW50Q29udGV4dE1lbnUpO1xuICAgICAgICAgICAgdGhpcy5vdmVybGF5cyA9IHRoaXMub3ZlcmxheXMuY29uY2F0KG5ld092ZXJsYXkpO1xuICAgICAgICAgICAgdGhpcy5hdHRhY2hDb250ZXh0TWVudShuZXdPdmVybGF5LCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhdHRhY2hDb250ZXh0TWVudShvdmVybGF5OiBPdmVybGF5UmVmLCBjb250ZXh0OiBJQ29udGV4dE1lbnVDb250ZXh0KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHsgZXZlbnQsIGl0ZW0sIG1lbnVJdGVtcywgbWVudUNsYXNzIH0gPSBjb250ZXh0O1xuXG4gICAgICAgIGNvbnN0IGNvbnRleHRNZW51Q29udGVudDogQ29tcG9uZW50UmVmPENvbnRleHRNZW51Q29udGVudENvbXBvbmVudD4gPSBvdmVybGF5LmF0dGFjaChcbiAgICAgICAgICAgIG5ldyBDb21wb25lbnRQb3J0YWwoQ29udGV4dE1lbnVDb250ZW50Q29tcG9uZW50KVxuICAgICAgICApO1xuICAgICAgICBjb250ZXh0TWVudUNvbnRlbnQuaW5zdGFuY2UuZXZlbnQgPSBldmVudDtcbiAgICAgICAgY29udGV4dE1lbnVDb250ZW50Lmluc3RhbmNlLml0ZW0gPSBpdGVtO1xuICAgICAgICBjb250ZXh0TWVudUNvbnRlbnQuaW5zdGFuY2UubWVudUl0ZW1zID0gbWVudUl0ZW1zO1xuICAgICAgICBjb250ZXh0TWVudUNvbnRlbnQuaW5zdGFuY2Uub3ZlcmxheSA9IG92ZXJsYXk7XG4gICAgICAgIGNvbnRleHRNZW51Q29udGVudC5pbnN0YW5jZS5pc0xlYWYgPSB0cnVlO1xuICAgICAgICBjb250ZXh0TWVudUNvbnRlbnQuaW5zdGFuY2UubWVudUNsYXNzID0gbWVudUNsYXNzO1xuICAgICAgICAoPE92ZXJsYXlSZWZXaXRoQ29udGV4dE1lbnU+b3ZlcmxheSkuY29udGV4dE1lbnUgPSBjb250ZXh0TWVudUNvbnRlbnQuaW5zdGFuY2U7XG5cbiAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICAgICAgICBzdWJzY3JpcHRpb25zLmFkZChcbiAgICAgICAgICAgIGNvbnRleHRNZW51Q29udGVudC5pbnN0YW5jZS5leGVjdXRlXG4gICAgICAgICAgICAgICAgLmFzT2JzZXJ2YWJsZSgpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoZXhlY3V0ZUV2ZW50KSA9PlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsb3NlQWxsQ29udGV4dE1lbnVzKHsgZXZlbnRUeXBlOiAnZXhlY3V0ZScsIC4uLmV4ZWN1dGVFdmVudCB9KVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgICAgc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICAgICAgICBjb250ZXh0TWVudUNvbnRlbnQuaW5zdGFuY2UuY2xvc2VBbGxNZW51c1xuICAgICAgICAgICAgICAgIC5hc09ic2VydmFibGUoKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKGNsb3NlQWxsRXZlbnQpID0+XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VBbGxDb250ZXh0TWVudXMoeyBldmVudFR5cGU6ICdjYW5jZWwnLCAuLi5jbG9zZUFsbEV2ZW50IH0pXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgICBzdWJzY3JpcHRpb25zLmFkZChcbiAgICAgICAgICAgIGNvbnRleHRNZW51Q29udGVudC5pbnN0YW5jZS5jbG9zZUxlYWZNZW51XG4gICAgICAgICAgICAgICAgLmFzT2JzZXJ2YWJsZSgpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoY2xvc2VMZWFmTWVudUV2ZW50KSA9PiB0aGlzLmRlc3Ryb3lMZWFmTWVudShjbG9zZUxlYWZNZW51RXZlbnQpKVxuICAgICAgICApO1xuICAgICAgICBzdWJzY3JpcHRpb25zLmFkZChcbiAgICAgICAgICAgIGNvbnRleHRNZW51Q29udGVudC5pbnN0YW5jZS5vcGVuU3ViTWVudVxuICAgICAgICAgICAgICAgIC5hc09ic2VydmFibGUoKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKHN1Yk1lbnVFdmVudDogSUNvbnRleHRNZW51Q29udGV4dCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRlc3Ryb3lTdWJNZW51cyhjb250ZXh0TWVudUNvbnRlbnQuaW5zdGFuY2UpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXN1Yk1lbnVFdmVudC5jb250ZXh0TWVudSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dE1lbnVDb250ZW50Lmluc3RhbmNlLmlzTGVhZiA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29udGV4dE1lbnVDb250ZW50Lmluc3RhbmNlLmlzTGVhZiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3cubmV4dChzdWJNZW51RXZlbnQpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICAgIGNvbnRleHRNZW51Q29udGVudC5vbkRlc3Ryb3koKCkgPT4ge1xuICAgICAgICAgICAgbWVudUl0ZW1zLmZvckVhY2goKG1lbnVJdGVtKSA9PiAobWVudUl0ZW0uaXNBY3RpdmUgPSBmYWxzZSkpO1xuICAgICAgICAgICAgc3Vic2NyaXB0aW9ucy51bnN1YnNjcmliZSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgY29udGV4dE1lbnVDb250ZW50LmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xvc2VBbGxDb250ZXh0TWVudXMoY2xvc2VFdmVudDogQ2xvc2VDb250ZXh0TWVudUV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm92ZXJsYXlzKSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlLm5leHQoY2xvc2VFdmVudCk7XG4gICAgICAgICAgICB0aGlzLm92ZXJsYXlzLmZvckVhY2goKG92ZXJsYXksIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgb3ZlcmxheS5kZXRhY2goKTtcbiAgICAgICAgICAgICAgICBvdmVybGF5LmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub3ZlcmxheXMgPSBbXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0TGFzdEF0dGFjaGVkT3ZlcmxheSgpOiBPdmVybGF5UmVmV2l0aENvbnRleHRNZW51IHtcbiAgICAgICAgbGV0IG92ZXJsYXk6IE92ZXJsYXlSZWYgPSB0aGlzLm92ZXJsYXlzW3RoaXMub3ZlcmxheXMubGVuZ3RoIC0gMV07XG4gICAgICAgIHdoaWxlICh0aGlzLm92ZXJsYXlzLmxlbmd0aCA+IDEgJiYgb3ZlcmxheSAmJiAhb3ZlcmxheS5oYXNBdHRhY2hlZCgpKSB7XG4gICAgICAgICAgICBvdmVybGF5LmRldGFjaCgpO1xuICAgICAgICAgICAgb3ZlcmxheS5kaXNwb3NlKCk7XG4gICAgICAgICAgICB0aGlzLm92ZXJsYXlzID0gdGhpcy5vdmVybGF5cy5zbGljZSgwLCAtMSk7XG4gICAgICAgICAgICBvdmVybGF5ID0gdGhpcy5vdmVybGF5c1t0aGlzLm92ZXJsYXlzLmxlbmd0aCAtIDFdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdmVybGF5O1xuICAgIH1cblxuICAgIHB1YmxpYyBkZXN0cm95TGVhZk1lbnUoeyBleGNlcHRSb290TWVudSwgZXZlbnQgfTogQ2xvc2VMZWFmTWVudUV2ZW50ID0ge30pOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNEZXN0cm95aW5nTGVhZk1lbnUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlzRGVzdHJveWluZ0xlYWZNZW51ID0gdHJ1ZTtcblxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG92ZXJsYXkgPSB0aGlzLmdldExhc3RBdHRhY2hlZE92ZXJsYXkoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLm92ZXJsYXlzLmxlbmd0aCA+IDEgJiYgb3ZlcmxheSkge1xuICAgICAgICAgICAgICAgIG92ZXJsYXkuZGV0YWNoKCk7XG4gICAgICAgICAgICAgICAgb3ZlcmxheS5kaXNwb3NlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWV4Y2VwdFJvb3RNZW51ICYmIHRoaXMub3ZlcmxheXMubGVuZ3RoID4gMCAmJiBvdmVybGF5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZS5uZXh0KHsgZXZlbnRUeXBlOiAnY2FuY2VsJywgZXZlbnQgfSk7XG4gICAgICAgICAgICAgICAgb3ZlcmxheS5kZXRhY2goKTtcbiAgICAgICAgICAgICAgICBvdmVybGF5LmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbmV3TGVhZiA9IHRoaXMuZ2V0TGFzdEF0dGFjaGVkT3ZlcmxheSgpO1xuICAgICAgICAgICAgaWYgKG5ld0xlYWYpIHtcbiAgICAgICAgICAgICAgICBuZXdMZWFmLmNvbnRleHRNZW51LmlzTGVhZiA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuaXNEZXN0cm95aW5nTGVhZk1lbnUgPSBmYWxzZTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGRlc3Ryb3lTdWJNZW51cyhjb250ZXh0TWVudTogQ29udGV4dE1lbnVDb250ZW50Q29tcG9uZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG92ZXJsYXkgPSBjb250ZXh0TWVudS5vdmVybGF5O1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMub3ZlcmxheXMuaW5kZXhPZihvdmVybGF5KTtcbiAgICAgICAgdGhpcy5vdmVybGF5cy5zbGljZShpbmRleCArIDEpLmZvckVhY2goKHN1Yk1lbnVPdmVybGF5KSA9PiB7XG4gICAgICAgICAgICBzdWJNZW51T3ZlcmxheS5kZXRhY2goKTtcbiAgICAgICAgICAgIHN1Yk1lbnVPdmVybGF5LmRpc3Bvc2UoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzTGVhZk1lbnUoY29udGV4dE1lbnVDb250ZW50OiBDb250ZXh0TWVudUNvbnRlbnRDb21wb25lbnQpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3Qgb3ZlcmxheSA9IHRoaXMuZ2V0TGFzdEF0dGFjaGVkT3ZlcmxheSgpO1xuICAgICAgICByZXR1cm4gY29udGV4dE1lbnVDb250ZW50Lm92ZXJsYXkgPT09IG92ZXJsYXk7XG4gICAgfVxufVxuIl19