ng-devui
Version:
DevUI components based on Angular
207 lines • 30.3 kB
JavaScript
import { animate, AnimationBuilder, style } from '@angular/animations';
import { DOCUMENT } from '@angular/common';
import { Directive, ElementRef, Host, HostBinding, HostListener, Inject, Renderer2 } from '@angular/core';
import { AnimationCurves, AnimationDuration } from 'ng-devui/utils';
import { WindowRef } from 'ng-devui/window-ref';
import { fromEvent } from 'rxjs';
import { filter } from 'rxjs/operators';
import { DropDownDirective } from './dropdown.directive';
import * as i0 from "@angular/core";
import * as i1 from "./dropdown.directive";
import * as i2 from "ng-devui/window-ref";
import * as i3 from "@angular/animations";
export class DropDownMenuDirective {
constructor(dropdown, el, render, windowRef, builder, doc) {
this.dropdown = dropdown;
this.el = el;
this.render = render;
this.windowRef = windowRef;
this.builder = builder;
this.doc = doc;
this.display = 'none';
this.tabIndex = -1;
this.addClass = true;
this.currentValue = false;
this.hide = (event) => {
this.dropdown.toggle();
};
this.keydownEscapeEvent$ = fromEvent(this.doc.body, 'keydown').pipe(
// chrome 为 Escape , ie 11为Esc
filter(event => event.key === 'Escape' || event.key === 'Esc'));
}
ngOnInit() {
this.dropdown.dropDownMenu = this;
this.subscription = this.dropdown.visibleSubject.subscribe(value => {
if (value !== this.currentValue) {
this.currentValue = value;
if (this.keydownEscapeSub) {
this.keydownEscapeSub.unsubscribe();
}
if (value) {
this.keydownEscapeSub = this.keydownEscapeEvent$.subscribe(event => {
if (event.defaultPrevented) {
return;
}
this.hide(event);
});
}
if (this.dropdown.appendToBody) {
this.render.setStyle(this.el.nativeElement, 'display', 'block'); // 立马生效不等host binding绑定
this.display = 'block';
return;
}
if (this.player) { // 此处保留一个防止点击过快
this.player.finish();
}
if (this.dropdown.showAnimation) {
const direction = this.calcPopDirection(value);
const metadata = value ? this.fadeIn(direction) : this.fadeOut(direction);
const factory = this.builder.build(metadata);
this.player = factory.create(this.el.nativeElement);
const player = this.player;
this.player.onDone(() => {
if (!value) {
this.render.setStyle(this.el.nativeElement, 'display', 'none');
this.display = 'none';
}
player.destroy();
if (this.player === player) {
this.player = undefined;
}
});
this.player.onStart(() => {
if (value) {
this.render.setStyle(this.el.nativeElement, 'display', 'block');
this.display = 'block';
}
});
this.player.play();
}
else {
this.render.setStyle(this.el.nativeElement, 'display', value ? 'block' : 'none');
this.display = value ? 'block' : 'none';
}
}
});
}
ngOnDestroy() {
if (this.keydownEscapeSub) {
this.keydownEscapeSub.unsubscribe();
}
if (this.subscription) {
this.subscription.unsubscribe();
}
}
calcPopDirection(value) {
const dropdownMenuElement = this.el.nativeElement;
const elementHeight = dropdownMenuElement.offsetHeight;
const bottomDistance = this.windowRef.innerHeight - this.dropdown.el.nativeElement.getBoundingClientRect().bottom;
const isBottomEnough = bottomDistance >= elementHeight;
if (!value) {
return this.popDirectionCache;
}
else {
if (!isBottomEnough) {
this.render.setStyle(dropdownMenuElement, 'bottom', '100%');
this.render.setStyle(dropdownMenuElement, 'top', 'auto');
this.popDirectionCache = 'top';
return 'top';
}
else {
this.render.removeStyle(dropdownMenuElement, 'bottom');
this.render.removeStyle(dropdownMenuElement, 'top');
this.popDirectionCache = 'bottom';
return 'bottom';
}
}
}
mouseEnter(event) {
this.dropdown.mouseenterFlag = true;
}
mouseLeave(event) {
event.stopPropagation();
this.dropdown.mouseenterFlag = false;
if ((this.dropdown.appendToBody && this.dropdown.trigger === 'hover')
|| (this.dropdown.trigger === 'click' && this.dropdown.closeOnMouseLeaveMenu)) {
if (this.dropdown.toggleEl?.nativeElement.contains(event.relatedTarget)
|| this.dropdown.dropdownChildren.some(children => children.menuEl !== this.el
&& children.menuEl?.nativeElement.parentElement?.contains(event.relatedTarget))) {
return;
}
else {
if (this.dropdown.trigger === 'hover') {
this.dropdown.simulateEventDispatch(event);
}
else {
const relatedTarget = event.originEvent?.relatedTarget;
if (relatedTarget && (this.dropdown.toggleEl?.nativeElement.contains(relatedTarget)
|| this.dropdown.dropdownChildren.some(children => children.menuEl?.nativeElement.contains(relatedTarget)))) {
return;
}
this.dropdown.isOpen = false;
}
}
}
return false;
}
fadeIn(direction) {
switch (direction) {
case 'top':
return [
style({ transform: 'scaleY(0.8) translateY(4px)', opacity: 0.8, transformOrigin: '0% 100%' }),
animate(`200ms ${AnimationCurves.EASE_IN}`, style({ transform: 'scaleY(0.9999) translateY(0)', opacity: 1, transformOrigin: '0% 100%' })),
];
case 'bottom':
default:
return [
style({ transform: 'scaleY(0.8) translateY(-4px)', opacity: 0.8, transformOrigin: '0% 0%' }),
animate(`200ms ${AnimationCurves.EASE_OUT}`, style({ transform: 'scaleY(0.9999) translateY(0)', opacity: 1, transformOrigin: '0% 0%' })),
];
}
}
fadeOut(direction) {
switch (direction) {
case 'top':
return [
style({ transform: 'scaleY(0.9999) translateY(0)', opacity: 1, transformOrigin: '0% 100%' }),
animate(`${AnimationDuration.BASE} ${AnimationCurves.EASE_IN}`, style({ transform: 'scaleY(0.8) translateY(4px)', opacity: 0.8, transformOrigin: '0% 100%' }))
];
case 'bottom':
default:
return [
style({ transform: 'scaleY(0.9999) translateY(0)', opacity: 1, transformOrigin: '0% 0%' }),
animate(`${AnimationDuration.BASE} ${AnimationCurves.EASE_IN}`, style({ transform: 'scaleY(0.8) translateY(-4px)', opacity: 0.8, transformOrigin: '0% 0%' }))
];
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DropDownMenuDirective, deps: [{ token: i1.DropDownDirective, host: true }, { token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i2.WindowRef }, { token: i3.AnimationBuilder }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Directive }); }
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: DropDownMenuDirective, selector: "[dDropDownMenu]", host: { listeners: { "mouseenter": "mouseEnter($event)", "mouseleave": "mouseLeave($event)" }, properties: { "style.display": "this.display", "attr.tabIndex": "this.tabIndex", "class.devui-dropdown-menu": "this.addClass" } }, exportAs: ["d-dropdown-menu"], ngImport: i0 }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DropDownMenuDirective, decorators: [{
type: Directive,
args: [{
selector: '[dDropDownMenu]',
exportAs: 'd-dropdown-menu',
}]
}], ctorParameters: () => [{ type: i1.DropDownDirective, decorators: [{
type: Host
}] }, { type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i2.WindowRef }, { type: i3.AnimationBuilder }, { type: undefined, decorators: [{
type: Inject,
args: [DOCUMENT]
}] }], propDecorators: { display: [{
type: HostBinding,
args: ['style.display']
}], tabIndex: [{
type: HostBinding,
args: ['attr.tabIndex']
}], addClass: [{
type: HostBinding,
args: ['class.devui-dropdown-menu']
}], mouseEnter: [{
type: HostListener,
args: ['mouseenter', ['$event']]
}], mouseLeave: [{
type: HostListener,
args: ['mouseleave', ['$event']]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24tbWVudS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9kZXZ1aS9kcm9wZG93bi9kcm9wZG93bi1tZW51LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixFQUFzQyxLQUFLLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMzRyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFxQixTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0gsT0FBTyxFQUFFLGVBQWUsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNoRCxPQUFPLEVBQUUsU0FBUyxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUMvQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7Ozs7O0FBTXpELE1BQU0sT0FBTyxxQkFBcUI7SUFVaEMsWUFBNEIsUUFBMkIsRUFBVSxFQUFjLEVBQVUsTUFBaUIsRUFDdEYsU0FBb0IsRUFBVSxPQUF5QixFQUE0QixHQUFRO1FBRG5GLGFBQVEsR0FBUixRQUFRLENBQW1CO1FBQVUsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQUFVLFdBQU0sR0FBTixNQUFNLENBQVc7UUFDdEYsY0FBUyxHQUFULFNBQVMsQ0FBVztRQUFVLFlBQU8sR0FBUCxPQUFPLENBQWtCO1FBQTRCLFFBQUcsR0FBSCxHQUFHLENBQUs7UUFUakYsWUFBTyxHQUFHLE1BQU0sQ0FBQztRQUNqQixhQUFRLEdBQUcsQ0FBQyxDQUFDLENB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QUFRO3NCQUFqRCxXQUFXO3VCQUFDLDJCQUEyQjtnQkFtR2pDLFVBQVU7c0JBRGhCLFlBQVk7dUJBQUMsWUFBWSxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQU0vQixVQUFVO3NCQURoQixZQUFZO3VCQUFDLFlBQVksRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGFuaW1hdGUsIEFuaW1hdGlvbkJ1aWxkZXIsIEFuaW1hdGlvbk1ldGFkYXRhLCBBbmltYXRpb25QbGF5ZXIsIHN0eWxlIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XHJcbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBIb3N0LCBIb3N0QmluZGluZywgSG9zdExpc3RlbmVyLCBJbmplY3QsIE9uRGVzdHJveSwgT25Jbml0LCBSZW5kZXJlcjIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQW5pbWF0aW9uQ3VydmVzLCBBbmltYXRpb25EdXJhdGlvbiB9IGZyb20gJ25nLWRldnVpL3V0aWxzJztcclxuaW1wb3J0IHsgV2luZG93UmVmIH0gZnJvbSAnbmctZGV2dWkvd2luZG93LXJlZic7XHJcbmltcG9ydCB7IGZyb21FdmVudCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGZpbHRlciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgRHJvcERvd25EaXJlY3RpdmUgfSBmcm9tICcuL2Ryb3Bkb3duLmRpcmVjdGl2ZSc7XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ1tkRHJvcERvd25NZW51XScsXHJcbiAgZXhwb3J0QXM6ICdkLWRyb3Bkb3duLW1lbnUnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgRHJvcERvd25NZW51RGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIHBsYXllcjogQW5pbWF0aW9uUGxheWVyO1xyXG4gIEBIb3N0QmluZGluZygnc3R5bGUuZGlzcGxheScpIGRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLnRhYkluZGV4JykgdGFiSW5kZXggPSAtMTtcclxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmRldnVpLWRyb3Bkb3duLW1lbnUnKSBhZGRDbGFzcyA9IHRydWU7XHJcbiAgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcbiAga2V5ZG93bkVzY2FwZUV2ZW50JDtcclxuICBrZXlkb3duRXNjYXBlU3ViOiBTdWJzY3JpcHRpb247XHJcbiAgcG9wRGlyZWN0aW9uQ2FjaGU6ICd0b3AnIHwgJ2JvdHRvbSc7XHJcbiAgcHJpdmF0ZSBjdXJyZW50VmFsdWU6IGFueSA9IGZhbHNlO1xyXG4gIGNvbnN0cnVjdG9yKEBIb3N0KCkgcHJpdmF0ZSBkcm9wZG93bjogRHJvcERvd25EaXJlY3RpdmUsIHByaXZhdGUgZWw6IEVsZW1lbnRSZWYsIHByaXZhdGUgcmVuZGVyOiBSZW5kZXJlcjIsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSB3aW5kb3dSZWY6IFdpbmRvd1JlZiwgcHJpdmF0ZSBidWlsZGVyOiBBbmltYXRpb25CdWlsZGVyLCBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIGRvYzogYW55KSB7XHJcbiAgICB0aGlzLmtleWRvd25Fc2NhcGVFdmVudCQgPSBmcm9tRXZlbnQodGhpcy5kb2MuYm9keSwgJ2tleWRvd24nKS5waXBlKFxyXG4gICAgICAvLyBjaHJvbWUg5Li6IEVzY2FwZSAsIGllIDEx5Li6RXNjXHJcbiAgICAgIGZpbHRlcihldmVudCA9PiAoPEtleWJvYXJkRXZlbnQ+ZXZlbnQpLmtleSA9PT0gJ0VzY2FwZScgfHwgKDxLZXlib2FyZEV2ZW50PmV2ZW50KS5rZXkgPT09ICdFc2MnKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5kcm9wZG93bi5kcm9wRG93bk1lbnUgPSB0aGlzO1xyXG4gICAgdGhpcy5zdWJzY3JpcHRpb24gPSB0aGlzLmRyb3Bkb3duLnZpc2libGVTdWJqZWN0LnN1YnNjcmliZSh2YWx1ZSA9PiB7XHJcbiAgICAgIGlmICh2YWx1ZSAhPT0gdGhpcy5jdXJyZW50VmFsdWUpIHtcclxuICAgICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IHZhbHVlO1xyXG4gICAgICAgIGlmICh0aGlzLmtleWRvd25Fc2NhcGVTdWIpIHtcclxuICAgICAgICAgIHRoaXMua2V5ZG93bkVzY2FwZVN1Yi51bnN1YnNjcmliZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodmFsdWUpIHtcclxuICAgICAgICAgIHRoaXMua2V5ZG93bkVzY2FwZVN1YiA9IHRoaXMua2V5ZG93bkVzY2FwZUV2ZW50JC5zdWJzY3JpYmUoZXZlbnQgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkgeyByZXR1cm47IH1cclxuICAgICAgICAgICAgdGhpcy5oaWRlKGV2ZW50KTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5kcm9wZG93bi5hcHBlbmRUb0JvZHkpIHtcclxuICAgICAgICAgIHRoaXMucmVuZGVyLnNldFN0eWxlKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgJ2Rpc3BsYXknLCAnYmxvY2snKTsgLy8g56uL6ams55Sf5pWI5LiN562JaG9zdCBiaW5kaW5n57uR5a6aXHJcbiAgICAgICAgICB0aGlzLmRpc3BsYXkgPSAnYmxvY2snO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5wbGF5ZXIpIHsgLy8g5q2k5aSE5L+d55WZ5LiA5Liq6Ziy5q2i54K55Ye76L+H5b+rXHJcbiAgICAgICAgICB0aGlzLnBsYXllci5maW5pc2goKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuZHJvcGRvd24uc2hvd0FuaW1hdGlvbikge1xyXG4gICAgICAgICAgY29uc3QgZGlyZWN0aW9uID0gdGhpcy5jYWxjUG9wRGlyZWN0aW9uKHZhbHVlKTtcclxuICAgICAgICAgIGNvbnN0IG1ldGFkYXRhID0gdmFsdWUgPyB0aGlzLmZhZGVJbihkaXJlY3Rpb24pIDogdGhpcy5mYWRlT3V0KGRpcmVjdGlvbik7XHJcbiAgICAgICAgICBjb25zdCBmYWN0b3J5ID0gdGhpcy5idWlsZGVyLmJ1aWxkKG1ldGFkYXRhKTtcclxuICAgICAgICAgIHRoaXMucGxheWVyID0gZmFjdG9yeS5jcmVhdGUodGhpcy5lbC5uYXRpdmVFbGVtZW50KTtcclxuICAgICAgICAgIGNvbnN0IHBsYXllciA9IHRoaXMucGxheWVyO1xyXG4gICAgICAgICAgdGhpcy5wbGF5ZXIub25Eb25lKCgpID0+IHtcclxuICAgICAgICAgICAgaWYgKCF2YWx1ZSkge1xyXG4gICAgICAgICAgICAgIHRoaXMucmVuZGVyLnNldFN0eWxlKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgJ2Rpc3BsYXknLCAnbm9uZScpO1xyXG4gICAgICAgICAgICAgIHRoaXMuZGlzcGxheSA9ICdub25lJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBwbGF5ZXIuZGVzdHJveSgpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5wbGF5ZXIgPT09IHBsYXllcikge1xyXG4gICAgICAgICAgICAgIHRoaXMucGxheWVyID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIHRoaXMucGxheWVyLm9uU3RhcnQoKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodmFsdWUpIHtcclxuICAgICAgICAgICAgICB0aGlzLnJlbmRlci5zZXRTdHlsZSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICdkaXNwbGF5JywgJ2Jsb2NrJyk7XHJcbiAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5ID0gJ2Jsb2NrJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICB0aGlzLnBsYXllci5wbGF5KCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMucmVuZGVyLnNldFN0eWxlKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgJ2Rpc3BsYXknLCB2YWx1ZSA/ICdibG9jaycgOiAnbm9uZScpO1xyXG4gICAgICAgICAgdGhpcy5kaXNwbGF5ID0gdmFsdWUgPyAnYmxvY2snIDogJ25vbmUnO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIGlmICh0aGlzLmtleWRvd25Fc2NhcGVTdWIpIHtcclxuICAgICAgdGhpcy5rZXlkb3duRXNjYXBlU3ViLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5zdWJzY3JpcHRpb24pIHtcclxuICAgICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNhbGNQb3BEaXJlY3Rpb24odmFsdWUpIHtcclxuICAgIGNvbnN0IGRyb3Bkb3duTWVudUVsZW1lbnQgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICBjb25zdCBlbGVtZW50SGVpZ2h0ID0gZHJvcGRvd25NZW51RWxlbWVudC5vZmZzZXRIZWlnaHQ7XHJcbiAgICBjb25zdCBib3R0b21EaXN0YW5jZSA9IHRoaXMud2luZG93UmVmLmlubmVySGVpZ2h0IC0gdGhpcy5kcm9wZG93bi5lbC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmJvdHRvbTtcclxuICAgIGNvbnN0IGlzQm90dG9tRW5vdWdoID0gYm90dG9tRGlzdGFuY2UgPj0gZWxlbWVudEhlaWdodDtcclxuICAgIGlmICghdmFsdWUpIHtcclxuICAgICAgcmV0dXJuIHRoaXMucG9wRGlyZWN0aW9uQ2FjaGU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAoIWlzQm90dG9tRW5vdWdoKSB7XHJcbiAgICAgICAgdGhpcy5yZW5kZXIuc2V0U3R5bGUoZHJvcGRvd25NZW51RWxlbWVudCwgJ2JvdHRvbScsICcxMDAlJyk7XHJcbiAgICAgICAgdGhpcy5yZW5kZXIuc2V0U3R5bGUoZHJvcGRvd25NZW51RWxlbWVudCwgJ3RvcCcsICdhdXRvJyk7XHJcbiAgICAgICAgdGhpcy5wb3BEaXJlY3Rpb25DYWNoZSA9ICd0b3AnO1xyXG4gICAgICAgIHJldHVybiAndG9wJztcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnJlbmRlci5yZW1vdmVTdHlsZShkcm9wZG93bk1lbnVFbGVtZW50LCAnYm90dG9tJyk7XHJcbiAgICAgICAgdGhpcy5yZW5kZXIucmVtb3ZlU3R5bGUoZHJvcGRvd25NZW51RWxlbWVudCwgJ3RvcCcpO1xyXG4gICAgICAgIHRoaXMucG9wRGlyZWN0aW9uQ2FjaGUgPSAnYm90dG9tJztcclxuICAgICAgICByZXR1cm4gJ2JvdHRvbSc7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ21vdXNlZW50ZXInLCBbJyRldmVudCddKVxyXG4gIHB1YmxpYyBtb3VzZUVudGVyKGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcbiAgICB0aGlzLmRyb3Bkb3duLm1vdXNlZW50ZXJGbGFnID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCBbJyRldmVudCddKVxyXG4gIHB1YmxpYyBtb3VzZUxlYXZlKGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIHRoaXMuZHJvcGRvd24ubW91c2VlbnRlckZsYWcgPSBmYWxzZTtcclxuICAgIGlmICgodGhpcy5kcm9wZG93bi5hcHBlbmRUb0JvZHkgJiYgdGhpcy5kcm9wZG93bi50cmlnZ2VyID09PSAnaG92ZXInKVxyXG4gICAgICB8fCAodGhpcy5kcm9wZG93bi50cmlnZ2VyID09PSAnY2xpY2snICYmIHRoaXMuZHJvcGRvd24uY2xvc2VPbk1vdXNlTGVhdmVNZW51KSkge1xyXG4gICAgICBpZiAodGhpcy5kcm9wZG93bi50b2dnbGVFbD8ubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC5yZWxhdGVkVGFyZ2V0KVxyXG4gICAgICAgIHx8IHRoaXMuZHJvcGRvd24uZHJvcGRvd25DaGlsZHJlbi5zb21lKFxyXG4gICAgICAgICAgY2hpbGRyZW4gPT5cclxuICAgICAgICAgICAgY2hpbGRyZW4ubWVudUVsICE9PSB0aGlzLmVsXHJcbiAgICAgICAgICAgICYmIGNoaWxkcmVuLm1lbnVFbD8ubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50Py5jb250YWlucyhldmVudC5yZWxhdGVkVGFyZ2V0KSkpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZHJvcGRvd24udHJpZ2dlciA9PT0gJ2hvdmVyJykge1xyXG4gICAgICAgICAgdGhpcy5kcm9wZG93bi5zaW11bGF0ZUV2ZW50RGlzcGF0Y2goZXZlbnQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb25zdCByZWxhdGVkVGFyZ2V0ID0gKGV2ZW50IGFzIGFueSkub3JpZ2luRXZlbnQ/LnJlbGF0ZWRUYXJnZXQ7XHJcbiAgICAgICAgICBpZiAocmVsYXRlZFRhcmdldCAmJiAoXHJcbiAgICAgICAgICAgIHRoaXMuZHJvcGRvd24udG9nZ2xlRWw/Lm5hdGl2ZUVsZW1lbnQuY29udGFpbnMocmVsYXRlZFRhcmdldClcclxuICAgICAgICAgICAgfHwgdGhpcy5kcm9wZG93bi5kcm9wZG93bkNoaWxkcmVuLnNvbWUoY2hpbGRyZW4gPT4gY2hpbGRyZW4ubWVudUVsPy5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKHJlbGF0ZWRUYXJnZXQpKVxyXG4gICAgICAgICAgKSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLmRyb3Bkb3duLmlzT3BlbiA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmYWRlSW4oZGlyZWN0aW9uKTogQW5pbWF0aW9uTWV0YWRhdGFbXSB7XHJcbiAgICBzd2l0Y2ggKGRpcmVjdGlvbikge1xyXG4gICAgY2FzZSAndG9wJzpcclxuICAgICAgcmV0dXJuIFtcclxuICAgICAgICBzdHlsZSh7dHJhbnNmb3JtOiAnc2NhbGVZKDAuOCkgdHJhbnNsYXRlWSg0cHgpJywgb3BhY2l0eTogMC44LCB0cmFuc2Zvcm1PcmlnaW46ICcwJSAxMDAlJ30pLFxyXG4gICAgICAgIGFuaW1hdGUoYDIwMG1zICR7QW5pbWF0aW9uQ3VydmVzLkVBU0VfSU59YCxcclxuICAgICAgICAgIHN0eWxlKHt0cmFuc2Zvcm06ICdzY2FsZVkoMC45OTk5KSB0cmFuc2xhdGVZKDApJywgb3BhY2l0eTogMSwgdHJhbnNmb3JtT3JpZ2luOiAnMCUgMTAwJSd9KSksXHJcbiAgICAgIF07XHJcbiAgICBjYXNlICdib3R0b20nOlxyXG4gICAgZGVmYXVsdDpcclxuICAgICAgcmV0dXJuIFtcclxuICAgICAgICBzdHlsZSh7dHJhbnNmb3JtOiAnc2NhbGVZKDAuOCkgIHRyYW5zbGF0ZVkoLTRweCknLCBvcGFjaXR5OiAwLjgsIHRyYW5zZm9ybU9yaWdpbjogJzAlIDAlJ30pLFxyXG4gICAgICAgIGFuaW1hdGUoYDIwMG1zICR7QW5pbWF0aW9uQ3VydmVzLkVBU0VfT1VUfWAsXHJcbiAgICAgICAgICBzdHlsZSh7dHJhbnNmb3JtOiAnc2NhbGVZKDAuOTk5OSkgIHRyYW5zbGF0ZVkoMCknLCBvcGFjaXR5OiAxLCB0cmFuc2Zvcm1PcmlnaW46ICcwJSAwJSd9KSksXHJcbiAgICAgIF07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaGlkZSA9IChldmVudDogRXZlbnQpID0+IHtcclxuICAgIHRoaXMuZHJvcGRvd24udG9nZ2xlKCk7XHJcbiAgfTtcclxuXHJcbiAgcHJpdmF0ZSBmYWRlT3V0KGRpcmVjdGlvbik6IEFuaW1hdGlvbk1ldGFkYXRhW10ge1xyXG4gICAgc3dpdGNoIChkaXJlY3Rpb24pIHtcclxuICAgIGNhc2UgJ3RvcCc6XHJcbiAgICAgIHJldHVybiBbXHJcbiAgICAgICAgc3R5bGUoe3RyYW5zZm9ybTogJ3NjYWxlWSgwLjk5OTkpICB0cmFuc2xhdGVZKDApJywgb3BhY2l0eTogMSwgdHJhbnNmb3JtT3JpZ2luOiAnMCUgMTAwJSd9KSxcclxuICAgICAgICBhbmltYXRlKGAke0FuaW1hdGlvbkR1cmF0aW9uLkJBU0V9ICR7QW5pbWF0aW9uQ3VydmVzLkVBU0VfSU59YCxcclxuICAgICAgICAgIHN0eWxlKHt0cmFuc2Zvcm06ICdzY2FsZVkoMC44KSAgdHJhbnNsYXRlWSg0cHgpJywgb3BhY2l0eTogMC44LCB0cmFuc2Zvcm1PcmlnaW46ICcwJSAxMDAlJ30pKVxyXG4gICAgICBdO1xyXG4gICAgY2FzZSAnYm90dG9tJzpcclxuICAgIGRlZmF1bHQ6XHJcbiAgICAgIHJldHVybiBbXHJcbiAgICAgICAgc3R5bGUoe3RyYW5zZm9ybTogJ3NjYWxlWSgwLjk5OTkpICB0cmFuc2xhdGVZKDApJywgb3BhY2l0eTogMSwgdHJhbnNmb3JtT3JpZ2luOiAnMCUgMCUnfSksXHJcbiAgICAgICAgYW5pbWF0ZShgJHtBbmltYXRpb25EdXJhdGlvbi5CQVNFfSAke0FuaW1hdGlvbkN1cnZlcy5FQVNFX0lOfWAsXHJcbiAgICAgICAgICBzdHlsZSh7dHJhbnNmb3JtOiAnc2NhbGVZKDAuOCkgIHRyYW5zbGF0ZVkoLTRweCknLCBvcGFjaXR5OiAwLjgsIHRyYW5zZm9ybU9yaWdpbjogJzAlIDAlJ30pKVxyXG4gICAgICBdO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=