UNPKG

@ctrl/ngx-rightclick

Version:

GitHub Buttons for Angular. Star, Like, Follow and more

210 lines 23.2 kB
import { Overlay, ScrollStrategyOptions, } from '@angular/cdk/overlay'; import { ComponentPortal } from '@angular/cdk/portal'; import { ElementRef, Injectable, Injector } from '@angular/core'; import { BehaviorSubject } from 'rxjs'; import { filter, take } from 'rxjs/operators'; import { MenuInjector } from './context-menu-injector'; import * as i0 from "@angular/core"; import * as i1 from "@angular/cdk/overlay"; export class ContextMenuService { constructor(overlay, scrollStrategy, injector) { this.overlay = overlay; this.scrollStrategy = scrollStrategy; this.injector = injector; this.menus = []; this.id = 0; } /** * * @param $event triggering event * @param menuComponent the component to be shown * @param submenu is a menu within a menu * @param level if submenu, what level */ show($event, menuComponent, context, menuClose, menuAction, submenu = false, level) { let target; if (!submenu) { this.closeAll(); target = { getBoundingClientRect: () => ({ bottom: $event.clientY, height: 0, left: $event.clientX, right: $event.clientX, top: $event.clientY, width: 0, }), }; } else { // close other submenus this.closeAll(undefined, level); target = $event.target; } const el = new ElementRef(target); const positionStrategy = this.overlay .position() .flexibleConnectedTo(el) .withFlexibleDimensions(false); if (!submenu) { positionStrategy.withPositions([ { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top', }, { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom', }, { originX: 'end', originY: 'top', overlayX: 'start', overlayY: 'top', }, { originX: 'start', originY: 'top', overlayX: 'end', overlayY: 'top', }, { originX: 'end', originY: 'center', overlayX: 'start', overlayY: 'center', }, { originX: 'start', originY: 'center', overlayX: 'end', overlayY: 'center', }, ]); } else { positionStrategy.withPositions([ { originX: 'end', originY: 'top', overlayX: 'start', overlayY: 'top', }, { originX: 'start', originY: 'top', overlayX: 'end', overlayY: 'top', }, { originX: 'end', originY: 'bottom', overlayX: 'start', overlayY: 'bottom', }, { originX: 'start', originY: 'bottom', overlayX: 'end', overlayY: 'bottom', }, ]); } const t = { submenu, id: this.id++, isMenuHovered: new BehaviorSubject(false), isTriggerHovered: new BehaviorSubject(false), }; const menuInjector = new MenuInjector(t, this.injector, context); const componentPortal = new ComponentPortal(menuComponent, undefined, menuInjector); const overlayRef = this.overlay.create({ positionStrategy, panelClass: 'ngx-contextmenu', scrollStrategy: this.scrollStrategy.close(), }); const component = overlayRef.attach(componentPortal); const res = Object.assign(Object.assign({ overlayRef, component }, t), { menuClose, menuAction }); this.menus.push(res); return res; } getCurrentLevel() { return this.menus.length; } closeAll(context, idx = 0) { for (let index = idx; index < this.menus.length; index++) { const menu = this.menus[index]; this.destroyMenu(menu, context); } this.menus.splice(idx, this.menus.length); } destroyMenu(menu, context) { menu.component.instance._state = 'exit'; if (menu.component.instance.lazy) { menu.component.instance._animationDone .pipe(filter((event) => event.toState === 'exit'), take(1)) .subscribe(() => { menu.overlayRef.detach(); menu.overlayRef.dispose(); }); } else { menu.overlayRef.detach(); menu.overlayRef.dispose(); } if (context) { menu.menuAction.next(context); } menu.menuClose.next(); } close(menu, menuIndex, context) { this.destroyMenu(menu, context); this.menus.splice(menuIndex, 1); } checkOutsideClick($event) { for (const m of this.menus) { const clickedInside = m.component.location.nativeElement.contains($event.target); if (clickedInside) { $event.preventDefault(); $event.stopPropagation(); return; } } this.closeAll(); } closeSubMenu(id) { const menuIndex = this.menus.findIndex(n => n.id === id); if (menuIndex === -1 || menuIndex !== this.menus.length - 1) { return; } // make sure we can close the current menu const menu = this.menus[menuIndex]; if (menu.isMenuHovered.getValue() || menu.isTriggerHovered.getValue()) { return; } // close all menus up if possible for (let index = this.menus.length - 1; index >= 1; index--) { const m = this.menus[index]; if (!m.isMenuHovered.getValue() && !m.isTriggerHovered.getValue()) { this.close(m, index); } else { return; } } } } ContextMenuService.ɵprov = i0.ɵɵdefineInjectable({ factory: function ContextMenuService_Factory() { return new ContextMenuService(i0.ɵɵinject(i1.Overlay), i0.ɵɵinject(i1.ScrollStrategyOptions), i0.ɵɵinject(i0.INJECTOR)); }, token: ContextMenuService, providedIn: "root" }); ContextMenuService.decorators = [ { type: Injectable, args: [{ providedIn: 'root' },] } ]; ContextMenuService.ctorParameters = () => [ { type: Overlay }, { type: ScrollStrategyOptions }, { type: Injector } ]; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC1tZW51LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGliL2NvbnRleHQtbWVudS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxPQUFPLEVBRVAscUJBQXFCLEdBQ3RCLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBZ0IsTUFBTSxlQUFlLENBQUM7QUFFL0UsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN2QyxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTlDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQzs7O0FBZ0J2RCxNQUFNLE9BQU8sa0JBQWtCO0lBSTdCLFlBQ1UsT0FBZ0IsRUFDaEIsY0FBcUMsRUFDckMsUUFBa0I7UUFGbEIsWUFBTyxHQUFQLE9BQU8sQ0FBUztRQUNoQixtQkFBYyxHQUFkLGNBQWMsQ0FBdUI7UUFDckMsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQU41QixVQUFLLEdBQXdCLEVBQUUsQ0FBQztRQUNoQyxPQUFFLEdBQUcsQ0FBQyxDQUFDO0lBTUosQ0FBQztJQUVKOzs7Ozs7T0FNRztJQUNILElBQUksQ0FDRixNQUFrQixFQUNsQixhQUFrQixFQUNsQixPQUFZLEVBQ1osU0FBNEIsRUFDNUIsVUFBNkIsRUFDN0IsT0FBTyxHQUFHLEtBQUssRUFDZixLQUFjO1FBRWQsSUFBSSxNQUFXLENBQUM7UUFDaEIsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNaLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNoQixNQUFNLEdBQUc7Z0JBQ1AscUJBQXFCLEVBQUUsR0FBZSxFQUFFLENBQUMsQ0FBQztvQkFDeEMsTUFBTSxF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QUNSO1NBQ0Y7SUFDSCxDQUFDOzs7O1lBL01GLFVBQVUsU0FBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUU7OztZQXpCaEMsT0FBTztZQUVQLHFCQUFxQjtZQUdVLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBPdmVybGF5LFxuICBPdmVybGF5UmVmLFxuICBTY3JvbGxTdHJhdGVneU9wdGlvbnMsXG59IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7IENvbXBvbmVudFBvcnRhbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wb3J0YWwnO1xuaW1wb3J0IHsgRWxlbWVudFJlZiwgSW5qZWN0YWJsZSwgSW5qZWN0b3IsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciwgdGFrZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgTWVudUluamVjdG9yIH0gZnJvbSAnLi9jb250ZXh0LW1lbnUtaW5qZWN0b3InO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFjdGl2ZUNvbnRleHRNZW51U3ViIHtcbiAgaWQ6IG51bWJlcjtcbiAgaXNUcmlnZ2VySG92ZXJlZDogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+O1xuICBpc01lbnVIb3ZlcmVkOiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj47XG4gIHN1Ym1lbnU6IGJvb2xlYW47XG59XG5leHBvcnQgaW50ZXJmYWNlIEFjdGl2ZUNvbnRleHRNZW51IGV4dGVuZHMgQWN0aXZlQ29udGV4dE1lbnVTdWIge1xuICBvdmVybGF5UmVmOiBPdmVybGF5UmVmO1xuICBjb21wb25lbnQ6IGFueTtcbiAgbWVudUNsb3NlOiBFdmVudEVtaXR0ZXI8dm9pZD47XG4gIG1lbnVBY3Rpb246IEV2ZW50RW1pdHRlcjxhbnk+O1xufVxuXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIENvbnRleHRNZW51U2VydmljZSB7XG4gIG1lbnVzOiBBY3RpdmVDb250ZXh0TWVudVtdID0gW107XG4gIGlkID0gMDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIG92ZXJsYXk6IE92ZXJsYXksXG4gICAgcHJpdmF0ZSBzY3JvbGxTdHJhdGVneTogU2Nyb2xsU3RyYXRlZ3lPcHRpb25zLFxuICAgIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yLFxuICApIHt9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSAkZXZlbnQgdHJpZ2dlcmluZyBldmVudFxuICAgKiBAcGFyYW0gbWVudUNvbXBvbmVudCB0aGUgY29tcG9uZW50IHRvIGJlIHNob3duXG4gICAqIEBwYXJhbSBzdWJtZW51IGlzIGEgbWVudSB3aXRoaW4gYSBtZW51XG4gICAqIEBwYXJhbSBsZXZlbCBpZiBzdWJtZW51LCB3aGF0IGxldmVsXG4gICAqL1xuICBzaG93KFxuICAgICRldmVudDogTW91c2VFdmVudCxcbiAgICBtZW51Q29tcG9uZW50OiBhbnksXG4gICAgY29udGV4dDogYW55LFxuICAgIG1lbnVDbG9zZTogRXZlbnRFbWl0dGVyPGFueT4sXG4gICAgbWVudUFjdGlvbjogRXZlbnRFbWl0dGVyPGFueT4sXG4gICAgc3VibWVudSA9IGZhbHNlLFxuICAgIGxldmVsPzogbnVtYmVyLFxuICApOiBBY3RpdmVDb250ZXh0TWVudSB7XG4gICAgbGV0IHRhcmdldDogYW55O1xuICAgIGlmICghc3VibWVudSkge1xuICAgICAgdGhpcy5jbG9zZUFsbCgpO1xuICAgICAgdGFyZ2V0ID0ge1xuICAgICAgICBnZXRCb3VuZGluZ0NsaWVudFJlY3Q6ICgpOiBDbGllbnRSZWN0ID0+ICh7XG4gICAgICAgICAgYm90dG9tOiAkZXZlbnQuY2xpZW50WSxcbiAgICAgICAgICBoZWlnaHQ6IDAsXG4gICAgICAgICAgbGVmdDogJGV2ZW50LmNsaWVudFgsXG4gICAgICAgICAgcmlnaHQ6ICRldmVudC5jbGllbnRYLFxuICAgICAgICAgIHRvcDogJGV2ZW50LmNsaWVudFksXG4gICAgICAgICAgd2lkdGg6IDAsXG4gICAgICAgIH0pLFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gY2xvc2Ugb3RoZXIgc3VibWVudXNcbiAgICAgIHRoaXMuY2xvc2VBbGwodW5kZWZpbmVkLCBsZXZlbCk7XG4gICAgICB0YXJnZXQgPSAkZXZlbnQudGFyZ2V0O1xuICAgIH1cbiAgICBjb25zdCBlbCA9IG5ldyBFbGVtZW50UmVmKHRhcmdldCk7XG4gICAgY29uc3QgcG9zaXRpb25TdHJhdGVneSA9IHRoaXMub3ZlcmxheVxuICAgICAgLnBvc2l0aW9uKClcbiAgICAgIC5mbGV4aWJsZUNvbm5lY3RlZFRvKGVsKVxuICAgICAgLndpdGhGbGV4aWJsZURpbWVuc2lvbnMoZmFsc2UpO1xuXG4gICAgaWYgKCFzdWJtZW51KSB7XG4gICAgICBwb3NpdGlvblN0cmF0ZWd5LndpdGhQb3NpdGlvbnMoW1xuICAgICAgICB7XG4gICAgICAgICAgb3JpZ2luWDogJ3N0YXJ0JyxcbiAgICAgICAgICBvcmlnaW5ZOiAnYm90dG9tJyxcbiAgICAgICAgICBvdmVybGF5WDogJ3N0YXJ0JyxcbiAgICAgICAgICBvdmVybGF5WTogJ3RvcCcsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBvcmlnaW5YOiAnc3RhcnQnLFxuICAgICAgICAgIG9yaWdpblk6ICd0b3AnLFxuICAgICAgICAgIG92ZXJsYXlYOiAnc3RhcnQnLFxuICAgICAgICAgIG92ZXJsYXlZOiAnYm90dG9tJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG9yaWdpblg6ICdlbmQnLFxuICAgICAgICAgIG9yaWdpblk6ICd0b3AnLFxuICAgICAgICAgIG92ZXJsYXlYOiAnc3RhcnQnLFxuICAgICAgICAgIG92ZXJsYXlZOiAndG9wJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG9yaWdpblg6ICdzdGFydCcsXG4gICAgICAgICAgb3JpZ2luWTogJ3RvcCcsXG4gICAgICAgICAgb3ZlcmxheVg6ICdlbmQnLFxuICAgICAgICAgIG92ZXJsYXlZOiAndG9wJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG9yaWdpblg6ICdlbmQnLFxuICAgICAgICAgIG9yaWdpblk6ICdjZW50ZXInLFxuICAgICAgICAgIG92ZXJsYXlYOiAnc3RhcnQnLFxuICAgICAgICAgIG92ZXJsYXlZOiAnY2VudGVyJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG9yaWdpblg6ICdzdGFydCcsXG4gICAgICAgICAgb3JpZ2luWTogJ2NlbnRlcicsXG4gICAgICAgICAgb3ZlcmxheVg6ICdlbmQnLFxuICAgICAgICAgIG92ZXJsYXlZOiAnY2VudGVyJyxcbiAgICAgICAgfSxcbiAgICAgIF0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBwb3NpdGlvblN0cmF0ZWd5LndpdGhQb3NpdGlvbnMoW1xuICAgICAgICB7XG4gICAgICAgICAgb3JpZ2luWDogJ2VuZCcsXG4gICAgICAgICAgb3JpZ2luWTogJ3RvcCcsXG4gICAgICAgICAgb3ZlcmxheVg6ICdzdGFydCcsXG4gICAgICAgICAgb3ZlcmxheVk6ICd0b3AnLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgb3JpZ2luWDogJ3N0YXJ0JyxcbiAgICAgICAgICBvcmlnaW5ZOiAndG9wJyxcbiAgICAgICAgICBvdmVybGF5WDogJ2VuZCcsXG4gICAgICAgICAgb3ZlcmxheVk6ICd0b3AnLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgb3JpZ2luWDogJ2VuZCcsXG4gICAgICAgICAgb3JpZ2luWTogJ2JvdHRvbScsXG4gICAgICAgICAgb3ZlcmxheVg6ICdzdGFydCcsXG4gICAgICAgICAgb3ZlcmxheVk6ICdib3R0b20nLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgb3JpZ2luWDogJ3N0YXJ0JyxcbiAgICAgICAgICBvcmlnaW5ZOiAnYm90dG9tJyxcbiAgICAgICAgICBvdmVybGF5WDogJ2VuZCcsXG4gICAgICAgICAgb3ZlcmxheVk6ICdib3R0b20nLFxuICAgICAgICB9LFxuICAgICAgXSk7XG4gICAgfVxuICAgIGNvbnN0IHQ6IEFjdGl2ZUNvbnRleHRNZW51U3ViID0ge1xuICAgICAgc3VibWVudSxcbiAgICAgIGlkOiB0aGlzLmlkKyssXG4gICAgICBpc01lbnVIb3ZlcmVkOiBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKSxcbiAgICAgIGlzVHJpZ2dlckhvdmVyZWQ6IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpLFxuICAgIH07XG4gICAgY29uc3QgbWVudUluamVjdG9yID0gbmV3IE1lbnVJbmplY3Rvcih0LCB0aGlzLmluamVjdG9yLCBjb250ZXh0KTtcbiAgICBjb25zdCBjb21wb25lbnRQb3J0YWwgPSBuZXcgQ29tcG9uZW50UG9ydGFsKFxuICAgICAgbWVudUNvbXBvbmVudCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIG1lbnVJbmplY3RvcixcbiAgICApO1xuICAgIGNvbnN0IG92ZXJsYXlSZWYgPSB0aGlzLm92ZXJsYXkuY3JlYXRlKHtcbiAgICAgIHBvc2l0aW9uU3RyYXRlZ3ksXG4gICAgICBwYW5lbENsYXNzOiAnbmd4LWNvbnRleHRtZW51JyxcbiAgICAgIHNjcm9sbFN0cmF0ZWd5OiB0aGlzLnNjcm9sbFN0cmF0ZWd5LmNsb3NlKCksXG4gICAgfSk7XG4gICAgY29uc3QgY29tcG9uZW50ID0gb3ZlcmxheVJlZi5hdHRhY2g8YW55Pihjb21wb25lbnRQb3J0YWwpO1xuICAgIGNvbnN0IHJlcyA9IHsgb3ZlcmxheVJlZiwgY29tcG9uZW50LCAuLi50LCBtZW51Q2xvc2UsIG1lbnVBY3Rpb24gfTtcbiAgICB0aGlzLm1lbnVzLnB1c2gocmVzKTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIGdldEN1cnJlbnRMZXZlbCgpIHtcbiAgICByZXR1cm4gdGhpcy5tZW51cy5sZW5ndGg7XG4gIH1cbiAgY2xvc2VBbGwoY29udGV4dD86IGFueSwgaWR4ID0gMCkge1xuICAgIGZvciAobGV0IGluZGV4ID0gaWR4OyBpbmRleCA8IHRoaXMubWVudXMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBjb25zdCBtZW51ID0gdGhpcy5tZW51c1tpbmRleF07XG4gICAgICB0aGlzLmRlc3Ryb3lNZW51KG1lbnUsIGNvbnRleHQpO1xuICAgIH1cbiAgICB0aGlzLm1lbnVzLnNwbGljZShpZHgsIHRoaXMubWVudXMubGVuZ3RoKTtcbiAgfVxuICBkZXN0cm95TWVudShtZW51OiBBY3RpdmVDb250ZXh0TWVudSwgY29udGV4dD86IGFueSkge1xuICAgIG1lbnUuY29tcG9uZW50Lmluc3RhbmNlLl9zdGF0ZSA9ICdleGl0JztcbiAgICBpZiAobWVudS5jb21wb25lbnQuaW5zdGFuY2UubGF6eSkge1xuICAgICAgbWVudS5jb21wb25lbnQuaW5zdGFuY2UuX2FuaW1hdGlvbkRvbmVcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgZmlsdGVyKChldmVudDogYW55KSA9PiBldmVudC50b1N0YXRlID09PSAnZXhpdCcpLFxuICAgICAgICAgIHRha2UoMSksXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgbWVudS5vdmVybGF5UmVmLmRldGFjaCgpO1xuICAgICAgICAgIG1lbnUub3ZlcmxheVJlZi5kaXNwb3NlKCk7XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBtZW51Lm92ZXJsYXlSZWYuZGV0YWNoKCk7XG4gICAgICBtZW51Lm92ZXJsYXlSZWYuZGlzcG9zZSgpO1xuICAgIH1cbiAgICBpZiAoY29udGV4dCkge1xuICAgICAgbWVudS5tZW51QWN0aW9uLm5leHQoY29udGV4dCk7XG4gICAgfVxuICAgIG1lbnUubWVudUNsb3NlLm5leHQoKTtcbiAgfVxuICBjbG9zZShtZW51OiBBY3RpdmVDb250ZXh0TWVudSwgbWVudUluZGV4OiBudW1iZXIsIGNvbnRleHQ/OiBhbnkpIHtcbiAgICB0aGlzLmRlc3Ryb3lNZW51KG1lbnUsIGNvbnRleHQpO1xuICAgIHRoaXMubWVudXMuc3BsaWNlKG1lbnVJbmRleCwgMSk7XG4gIH1cbiAgY2hlY2tPdXRzaWRlQ2xpY2soJGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgZm9yIChjb25zdCBtIG9mIHRoaXMubWVudXMpIHtcbiAgICAgIGNvbnN0IGNsaWNrZWRJbnNpZGUgPSBtLmNvbXBvbmVudC5sb2NhdGlvbi5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKFxuICAgICAgICAkZXZlbnQudGFyZ2V0LFxuICAgICAgKTtcbiAgICAgIGlmIChjbGlja2VkSW5zaWRlKSB7XG4gICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5jbG9zZUFsbCgpO1xuICB9XG4gIGNsb3NlU3ViTWVudShpZDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgbWVudUluZGV4ID0gdGhpcy5tZW51cy5maW5kSW5kZXgobiA9PiBuLmlkID09PSBpZCk7XG4gICAgaWYgKG1lbnVJbmRleCA9PT0gLTEgfHwgbWVudUluZGV4ICE9PSB0aGlzLm1lbnVzLmxlbmd0aCAtIDEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gbWFrZSBzdXJlIHdlIGNhbiBjbG9zZSB0aGUgY3VycmVudCBtZW51XG4gICAgY29uc3QgbWVudSA9IHRoaXMubWVudXNbbWVudUluZGV4XTtcbiAgICBpZiAobWVudS5pc01lbnVIb3ZlcmVkLmdldFZhbHVlKCkgfHwgbWVudS5pc1RyaWdnZXJIb3ZlcmVkLmdldFZhbHVlKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gY2xvc2UgYWxsIG1lbnVzIHVwIGlmIHBvc3NpYmxlXG4gICAgZm9yIChsZXQgaW5kZXggPSB0aGlzLm1lbnVzLmxlbmd0aCAtIDE7IGluZGV4ID49IDE7IGluZGV4LS0pIHtcbiAgICAgIGNvbnN0IG0gPSB0aGlzLm1lbnVzW2luZGV4XTtcbiAgICAgIGlmICghbS5pc01lbnVIb3ZlcmVkLmdldFZhbHVlKCkgJiYgIW0uaXNUcmlnZ2VySG92ZXJlZC5nZXRWYWx1ZSgpKSB7XG4gICAgICAgIHRoaXMuY2xvc2UobSwgaW5kZXgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl19