@angular-mdl/core
Version:
Angular components, directives and styles based on material design lite https://getmdl.io.
242 lines • 33 kB
JavaScript
import { ComponentFactoryResolver, EventEmitter, Injectable, Injector, ViewContainerRef, } from "@angular/core";
import { Subject } from "rxjs";
import { MdlSimpleDialogComponent } from "./mdl-simple-dialog.component";
import { MdlDialogHostComponent } from "./mdl-dialog-host.component";
import { InternalMdlDialogReference } from "./internal-dialog-reference";
import { MdlDialogOutletService } from "../dialog-outlet/mdl-dialog-outlet.service";
import { MdlDialogReference } from "./mdl-dialog-reference";
import { MDL_CONFIGUARTION, MIN_DIALOG_Z_INDEX } from "./config";
import * as i0 from "@angular/core";
import * as i1 from "../dialog-outlet/mdl-dialog-outlet.service";
/**
* The MdlDialogService is used to open different kind of dialogs. SimpleDialogs and Custom Dialogs.
*
* @experimental
*/
export class MdlDialogService {
constructor(componentFactoryResolver, mdlDialogOutletService, injector) {
this.componentFactoryResolver = componentFactoryResolver;
this.mdlDialogOutletService = mdlDialogOutletService;
this.injector = injector;
/**
* Emits an event when either all modals are closed, or one gets opened.
*
* @returns A subscribable event emitter that provides a boolean indicating whether a modal is open or not.
*/
this.onDialogsOpenChanged = new EventEmitter();
this.openDialogs = new Array();
this.mdlDialogOutletService.backdropClickEmitter.subscribe(() => {
this.onBackdropClick();
});
}
/**
* Shows a dialog that is just an alert - e.g. with one button.
*
* @param alertMessage The message that should be displayed.
* @param okText The text that the button should have
* @param title The optional title of the dialog
* returns An Observable that is called if the user hits the Ok button.
*/
alert(alertMessage, okText = "Ok", title) {
const result = new Subject();
this.showDialog({
title,
message: alertMessage,
actions: [
{
handler: () => {
result.next();
result.complete();
},
text: okText,
},
],
isModal: true,
});
return result;
}
/**
* Shows a dialog that is just a confirm message - e.g. with two button.
*
* @param question The question that should be displayed.
* @param title The title that should be displayed on top of Question.
* @param declineText The text for decline button. defaults to Cancel
* @param confirmText The text for the confirm button . defaults to Ok
* returns An Observable that is called if the user hits the Ok button.
*/
confirm(question, declineText = "Cancel", confirmText = "Ok", title) {
const result = new Subject();
this.showDialog({
title,
message: question,
actions: [
{
handler: () => {
result.next();
result.complete();
},
text: confirmText,
},
{
handler: () => {
result.error(null);
},
text: declineText,
isClosingAction: true,
},
],
isModal: true,
});
return result.asObservable();
}
/**
* Shows a dialog that is specified by the provided configuration.
*
* @param config The simple dialog configuration.
* returns An Observable that returns the MdlDialogReference.
*/
showDialog(config) {
if (config.actions.length === 0) {
throw new Error("a dialog mus have at least one action");
}
const internalDialogRef = new InternalMdlDialogReference(config);
const providers = [
{
provide: MdlDialogReference,
useValue: new MdlDialogReference(internalDialogRef),
},
{ provide: MDL_CONFIGUARTION, useValue: config },
];
const hostComponentRef = this.createHostDialog(internalDialogRef, config);
this.createComponentInstance(hostComponentRef?.instance?.dialogTarget, providers, MdlSimpleDialogComponent);
return this.showHostDialog(internalDialogRef.dialogRef, hostComponentRef);
}
/**
* Shows a dialog that is specified by the provided configuration.
*
* @param config The custom dialog configuration.
* returns An Observable that returns the MdlDialogReference.
*/
showCustomDialog(config) {
const internalDialogRef = new InternalMdlDialogReference(config);
const providers = [
{
provide: MdlDialogReference,
useValue: new MdlDialogReference(internalDialogRef),
},
];
if (config.providers) {
providers.push(...config.providers);
}
const hostComponentRef = this.createHostDialog(internalDialogRef, config);
this.createComponentInstance(hostComponentRef?.instance.dialogTarget, providers, config.component);
return this.showHostDialog(internalDialogRef.dialogRef, hostComponentRef);
}
showDialogTemplate(template, config) {
const internalDialogRef = new InternalMdlDialogReference(config);
const hostComponentRef = this.createHostDialog(internalDialogRef, config);
hostComponentRef?.instance.dialogTarget?.createEmbeddedView(template);
return this.showHostDialog(internalDialogRef.dialogRef, hostComponentRef);
}
showHostDialog(dialogRef, hostComponentRef) {
const result = new Subject();
setTimeout(() => {
result.next(dialogRef);
result.complete();
hostComponentRef?.instance.show();
});
return result.asObservable();
}
createHostDialog(internalDialogRef, dialogConfig) {
const viewContainerRef = this.mdlDialogOutletService.viewContainerRef;
if (!viewContainerRef) {
throw new Error("You did not provide a ViewContainerRef. " +
"Please see https://github.com/mseemann/angular2-mdl/wiki/How-to-use-the-MdlDialogService");
}
const providers = [
{ provide: MDL_CONFIGUARTION, useValue: dialogConfig },
{ provide: InternalMdlDialogReference, useValue: internalDialogRef },
];
const hostDialogComponent = this.createComponentInstance(viewContainerRef, providers, MdlDialogHostComponent);
internalDialogRef.hostDialogComponentRef = hostDialogComponent;
internalDialogRef.isModal = dialogConfig.isModal;
internalDialogRef.closeCallback = () => {
this.popDialog(internalDialogRef);
hostDialogComponent?.instance.hide(hostDialogComponent);
};
this.pushDialog(internalDialogRef);
return hostDialogComponent;
}
pushDialog(dialogRef) {
if (this.openDialogs.length === 0) {
// first dialog being opened
this.onDialogsOpenChanged.emit(true);
}
this.openDialogs.push(dialogRef);
this.orderDialogStack();
}
popDialog(dialogRef) {
this.openDialogs.splice(this.openDialogs.indexOf(dialogRef), 1);
this.orderDialogStack();
if (this.openDialogs.length === 0) {
// last dialog being closed
this.onDialogsOpenChanged.emit(false);
}
}
orderDialogStack() {
// +1 because the overlay may have MIN_DIALOG_Z_INDEX if the dialog is modal.
let zIndex = MIN_DIALOG_Z_INDEX + 1;
this.openDialogs.forEach((iDialogRef) => {
if (iDialogRef.hostDialog) {
iDialogRef.hostDialog.zIndex = zIndex;
}
// +2 to make room for the overlay if a dialog is modal
zIndex += 2;
});
this.mdlDialogOutletService.hideBackdrop();
// if there is a modal dialog append the overloay to the dom - if not remove the overlay from the body
const topMostModalDialog = this.getTopMostInternalDialogRef();
if (topMostModalDialog) {
// move the overlay diredct under the topmos modal dialog
this.mdlDialogOutletService.showBackdropWithZIndex(topMostModalDialog?.hostDialog?.zIndex
? topMostModalDialog.hostDialog.zIndex - 1
: 0);
}
}
getTopMostInternalDialogRef() {
let topMostModalDialog = null;
for (let i = this.openDialogs.length - 1; i >= 0; i--) {
if (this.openDialogs[i].isModal) {
topMostModalDialog = this.openDialogs[i];
break;
}
}
return topMostModalDialog;
}
onBackdropClick() {
const topMostModalDialog = this.getTopMostInternalDialogRef();
if (topMostModalDialog?.config.clickOutsideToClose) {
topMostModalDialog?.hide();
}
}
createComponentInstance(viewContainerRef, providers, component) {
const cFactory = this.componentFactoryResolver.resolveComponentFactory(component);
const injector = Injector.create({
providers: [
...providers,
{ provide: ViewContainerRef, useValue: viewContainerRef },
],
parent: this.injector,
});
return viewContainerRef?.createComponent(cFactory, viewContainerRef.length, injector);
}
}
MdlDialogService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: MdlDialogService, deps: [{ token: i0.ComponentFactoryResolver }, { token: i1.MdlDialogOutletService }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Injectable });
MdlDialogService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: MdlDialogService, providedIn: "root" });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: MdlDialogService, decorators: [{
type: Injectable,
args: [{
providedIn: "root",
}]
}], ctorParameters: function () { return [{ type: i0.ComponentFactoryResolver }, { type: i1.MdlDialogOutletService }, { type: i0.Injector }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWRsLWRpYWxvZy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZS9zcmMvbGliL2RpYWxvZy9tZGwtZGlhbG9nLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHdCQUF3QixFQUV4QixZQUFZLEVBQ1osVUFBVSxFQUNWLFFBQVEsRUFJUixnQkFBZ0IsR0FDakIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUzQyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQU1yRSxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN6RSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUNwRixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM1RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxVQUFVLENBQUM7OztBQUVqRTs7OztHQUlHO0FBS0gsTUFBTSxPQUFPLGdCQUFnQjtJQVUzQixZQUNVLHdCQUFrRCxFQUNsRCxzQkFBOEMsRUFDOUMsUUFBa0I7UUFGbEIsNkJBQXdCLEdBQXhCLHdCQUF3QixDQUEwQjtRQUNsRCwyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXdCO1FBQzlDLGFBQVEsR0FBUixRQUFRLENBQVU7UUFaNUI7Ozs7V0FJRztRQUNILHlCQUFvQixHQUEwQixJQUFJLFlBQVksRUFBVyxDQUFDO1FBRWxFLGdCQUFXLEdBQUcsSUFBSSxLQUFLLEVBQThCLENBQUM7UUFPNUQsSUFBSSxDQUFDLHNCQUFzQixDQUFDLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDOUQs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Q1QsQ0FBQztJQUNKLENBQUM7OzZHQXpUVSxnQkFBZ0I7aUhBQWhCLGdCQUFnQixjQUZmLE1BQU07MkZBRVAsZ0JBQWdCO2tCQUg1QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgQ29tcG9uZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIEluamVjdGFibGUsXG4gIEluamVjdG9yLFxuICBTdGF0aWNQcm92aWRlcixcbiAgVGVtcGxhdGVSZWYsXG4gIFR5cGUsXG4gIFZpZXdDb250YWluZXJSZWYsXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSBcInJ4anNcIjtcblxuaW1wb3J0IHsgTWRsU2ltcGxlRGlhbG9nQ29tcG9uZW50IH0gZnJvbSBcIi4vbWRsLXNpbXBsZS1kaWFsb2cuY29tcG9uZW50XCI7XG5pbXBvcnQgeyBNZGxEaWFsb2dIb3N0Q29tcG9uZW50IH0gZnJvbSBcIi4vbWRsLWRpYWxvZy1ob3N0LmNvbXBvbmVudFwiO1xuaW1wb3J0IHtcbiAgSU1kbEN1c3RvbURpYWxvZ0NvbmZpZ3VyYXRpb24sXG4gIElNZGxEaWFsb2dDb25maWd1cmF0aW9uLFxuICBJTWRsU2ltcGxlRGlhbG9nQ29uZmlndXJhdGlvbixcbn0gZnJvbSBcIi4vbWRsLWRpYWxvZy1jb25maWd1cmF0aW9uXCI7XG5pbXBvcnQgeyBJbnRlcm5hbE1kbERpYWxvZ1JlZmVyZW5jZSB9IGZyb20gXCIuL2ludGVybmFsLWRpYWxvZy1yZWZlcmVuY2VcIjtcbmltcG9ydCB7IE1kbERpYWxvZ091dGxldFNlcnZpY2UgfSBmcm9tIFwiLi4vZGlhbG9nLW91dGxldC9tZGwtZGlhbG9nLW91dGxldC5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBNZGxEaWFsb2dSZWZlcmVuY2UgfSBmcm9tIFwiLi9tZGwtZGlhbG9nLXJlZmVyZW5jZVwiO1xuaW1wb3J0IHsgTURMX0NPTkZJR1VBUlRJT04sIE1JTl9ESUFMT0dfWl9JTkRFWCB9IGZyb20gXCIuL2NvbmZpZ1wiO1xuXG4vKipcbiAqIFRoZSBNZGxEaWFsb2dTZXJ2aWNlIGlzIHVzZWQgdG8gb3BlbiBkaWZmZXJlbnQga2luZCBvZiBkaWFsb2dzLiBTaW1wbGVEaWFsb2dzIGFuZCBDdXN0b20gRGlhbG9ncy5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiBcInJvb3RcIixcbn0pXG5leHBvcnQgY2xhc3MgTWRsRGlhbG9nU2VydmljZSB7XG4gIC8qKlxuICAgKiBFbWl0cyBhbiBldmVudCB3aGVuIGVpdGhlciBhbGwgbW9kYWxzIGFyZSBjbG9zZWQsIG9yIG9uZSBnZXRzIG9wZW5lZC5cbiAgICpcbiAgICogQHJldHVybnMgQSBzdWJzY3JpYmFibGUgZXZlbnQgZW1pdHRlciB0aGF0IHByb3ZpZGVzIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgYSBtb2RhbCBpcyBvcGVuIG9yIG5vdC5cbiAgICovXG4gIG9uRGlhbG9nc09wZW5DaGFuZ2VkOiBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4gPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgcHJpdmF0ZSBvcGVuRGlhbG9ncyA9IG5ldyBBcnJheTxJbnRlcm5hbE1kbERpYWxvZ1JlZmVyZW5jZT4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNvbXBvbmVudEZhY3RvcnlSZXNvbHZlcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICAgIHByaXZhdGUgbWRsRGlhbG9nT3V0bGV0U2VydmljZTogTWRsRGlhbG9nT3V0bGV0U2VydmljZSxcbiAgICBwcml2YXRlIGluamVjdG9yOiBJbmplY3RvclxuICApIHtcbiAgICB0aGlzLm1kbERpYWxvZ091dGxldFNlcnZpY2UuYmFja2Ryb3BDbGlja0VtaXR0ZXIuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMub25CYWNrZHJvcENsaWNrKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2hvd3MgYSBkaWFsb2cgdGhhdCBpcyBqdXN0IGFuIGFsZXJ0IC0gZS5nLiB3aXRoIG9uZSBidXR0b24uXG4gICAqXG4gICAqIEBwYXJhbSBhbGVydE1lc3NhZ2UgVGhlIG1lc3NhZ2UgdGhhdCBzaG91bGQgYmUgZGlzcGxheWVkLlxuICAgKiBAcGFyYW0gb2tUZXh0IFRoZSB0ZXh0IHRoYXQgdGhlIGJ1dHRvbiBzaG91bGQgaGF2ZVxuICAgKiBAcGFyYW0gdGl0bGUgVGhlIG9wdGlvbmFsIHRpdGxlIG9mIHRoZSBkaWFsb2dcbiAgICogcmV0dXJucyBBbiBPYnNlcnZhYmxlIHRoYXQgaXMgY2FsbGVkIGlmIHRoZSB1c2VyIGhpdHMgdGhlIE9rIGJ1dHRvbi5cbiAgICovXG4gIHB1YmxpYyBhbGVydChcbiAgICBhbGVydE1lc3NhZ2U6IHN0cmluZyxcbiAgICBva1RleHQgPSBcIk9rXCIsXG4gICAgdGl0bGU/OiBzdHJpbmdcbiAgKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgY29uc3QgcmVzdWx0OiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3QoKTtcblxuICAgIHRoaXMuc2hvd0RpYWxvZyh7XG4gICAgICB0aXRsZSxcbiAgICAgIG1lc3NhZ2U6IGFsZXJ0TWVzc2FnZSxcbiAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGhhbmRsZXI6ICgpID0+IHtcbiAgICAgICAgICAgIHJlc3VsdC5uZXh0KCk7XG4gICAgICAgICAgICByZXN1bHQuY29tcGxldGUoKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHRleHQ6IG9rVGV4dCxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBpc01vZGFsOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93cyBhIGRpYWxvZyB0aGF0IGlzIGp1c3QgYSBjb25maXJtIG1lc3NhZ2UgLSBlLmcuIHdpdGggdHdvIGJ1dHRvbi5cbiAgICpcbiAgICogQHBhcmFtIHF1ZXN0aW9uIFRoZSBxdWVzdGlvbiB0aGF0IHNob3VsZCBiZSBkaXNwbGF5ZWQuXG4gICAqIEBwYXJhbSB0aXRsZSBUaGUgdGl0bGUgdGhhdCBzaG91bGQgYmUgZGlzcGxheWVkIG9uIHRvcCBvZiBRdWVzdGlvbi5cbiAgICogQHBhcmFtIGRlY2xpbmVUZXh0IFRoZSB0ZXh0IGZvciBkZWNsaW5lIGJ1dHRvbi4gZGVmYXVsdHMgdG8gQ2FuY2VsXG4gICAqIEBwYXJhbSBjb25maXJtVGV4dCBUaGUgdGV4dCBmb3IgdGhlIGNvbmZpcm0gYnV0dG9uIC4gZGVmYXVsdHMgdG8gT2tcbiAgICogcmV0dXJucyBBbiBPYnNlcnZhYmxlIHRoYXQgaXMgY2FsbGVkIGlmIHRoZSB1c2VyIGhpdHMgdGhlIE9rIGJ1dHRvbi5cbiAgICovXG4gIHB1YmxpYyBjb25maXJtKFxuICAgIHF1ZXN0aW9uOiBzdHJpbmcsXG4gICAgZGVjbGluZVRleHQgPSBcIkNhbmNlbFwiLFxuICAgIGNvbmZpcm1UZXh0ID0gXCJPa1wiLFxuICAgIHRpdGxlPzogc3RyaW5nXG4gICk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIGNvbnN0IHJlc3VsdDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgICB0aGlzLnNob3dEaWFsb2coe1xuICAgICAgdGl0bGUsXG4gICAgICBtZXNzYWdlOiBxdWVzdGlvbixcbiAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGhhbmRsZXI6ICgpID0+IHtcbiAgICAgICAgICAgIHJlc3VsdC5uZXh0KCk7XG4gICAgICAgICAgICByZXN1bHQuY29tcGxldGUoKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHRleHQ6IGNvbmZpcm1UZXh0LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgaGFuZGxlcjogKCkgPT4ge1xuICAgICAgICAgICAgcmVzdWx0LmVycm9yKG51bGwpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgdGV4dDogZGVjbGluZVRleHQsXG4gICAgICAgICAgaXNDbG9zaW5nQWN0aW9uOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGlzTW9kYWw6IHRydWUsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmVzdWx0LmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNob3dzIGEgZGlhbG9nIHRoYXQgaXMgc3BlY2lmaWVkIGJ5IHRoZSBwcm92aWRlZCBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gY29uZmlnIFRoZSBzaW1wbGUgZGlhbG9nIGNvbmZpZ3VyYXRpb24uXG4gICAqIHJldHVybnMgQW4gT2JzZXJ2YWJsZSB0aGF0IHJldHVybnMgdGhlIE1kbERpYWxvZ1JlZmVyZW5jZS5cbiAgICovXG4gIHB1YmxpYyBzaG93RGlhbG9nKFxuICAgIGNvbmZpZzogSU1kbFNpbXBsZURpYWxvZ0NvbmZpZ3VyYXRpb25cbiAgKTogT2JzZXJ2YWJsZTxNZGxEaWFsb2dSZWZlcmVuY2U+IHtcbiAgICBpZiAoY29uZmlnLmFjdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJhIGRpYWxvZyBtdXMgaGF2ZSBhdCBsZWFzdCBvbmUgYWN0aW9uXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IGludGVybmFsRGlhbG9nUmVmID0gbmV3IEludGVybmFsTWRsRGlhbG9nUmVmZXJlbmNlKGNvbmZpZyk7XG5cbiAgICBjb25zdCBwcm92aWRlcnMgPSBbXG4gICAgICB7XG4gICAgICAgIHByb3ZpZGU6IE1kbERpYWxvZ1JlZmVyZW5jZSxcbiAgICAgICAgdXNlVmFsdWU6IG5ldyBNZGxEaWFsb2dSZWZlcmVuY2UoaW50ZXJuYWxEaWFsb2dSZWYpLFxuICAgICAgfSxcbiAgICAgIHsgcHJvdmlkZTogTURMX0NPTkZJR1VBUlRJT04sIHVzZVZhbHVlOiBjb25maWcgfSxcbiAgICBdO1xuXG4gICAgY29uc3QgaG9zdENvbXBvbmVudFJlZiA9IHRoaXMuY3JlYXRlSG9zdERpYWxvZyhpbnRlcm5hbERpYWxvZ1JlZiwgY29uZmlnKTtcblxuICAgIHRoaXMuY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoXG4gICAgICBob3N0Q29tcG9uZW50UmVmPy5pbnN0YW5jZT8uZGlhbG9nVGFyZ2V0LFxuICAgICAgcHJvdmlkZXJzLFxuICAgICAgTWRsU2ltcGxlRGlhbG9nQ29tcG9uZW50XG4gICAgKTtcblxuICAgIHJldHVybiB0aGlzLnNob3dIb3N0RGlhbG9nKGludGVybmFsRGlhbG9nUmVmLmRpYWxvZ1JlZiwgaG9zdENvbXBvbmVudFJlZik7XG4gIH1cblxuICAvKipcbiAgICogU2hvd3MgYSBkaWFsb2cgdGhhdCBpcyBzcGVjaWZpZWQgYnkgdGhlIHByb3ZpZGVkIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBjb25maWcgVGhlIGN1c3RvbSBkaWFsb2cgY29uZmlndXJhdGlvbi5cbiAgICogcmV0dXJucyBBbiBPYnNlcnZhYmxlIHRoYXQgcmV0dXJucyB0aGUgTWRsRGlhbG9nUmVmZXJlbmNlLlxuICAgKi9cbiAgcHVibGljIHNob3dDdXN0b21EaWFsb2coXG4gICAgY29uZmlnOiBJTWRsQ3VzdG9tRGlhbG9nQ29uZmlndXJhdGlvblxuICApOiBPYnNlcnZhYmxlPE1kbERpYWxvZ1JlZmVyZW5jZT4ge1xuICAgIGNvbnN0IGludGVybmFsRGlhbG9nUmVmID0gbmV3IEludGVybmFsTWRsRGlhbG9nUmVmZXJlbmNlKGNvbmZpZyk7XG5cbiAgICBjb25zdCBwcm92aWRlcnM6IFN0YXRpY1Byb3ZpZGVyW10gPSBbXG4gICAgICB7XG4gICAgICAgIHByb3ZpZGU6IE1kbERpYWxvZ1JlZmVyZW5jZSxcbiAgICAgICAgdXNlVmFsdWU6IG5ldyBNZGxEaWFsb2dSZWZlcmVuY2UoaW50ZXJuYWxEaWFsb2dSZWYpLFxuICAgICAgfSxcbiAgICBdO1xuXG4gICAgaWYgKGNvbmZpZy5wcm92aWRlcnMpIHtcbiAgICAgIHByb3ZpZGVycy5wdXNoKC4uLmNvbmZpZy5wcm92aWRlcnMpO1xuICAgIH1cblxuICAgIGNvbnN0IGhvc3RDb21wb25lbnRSZWYgPSB0aGlzLmNyZWF0ZUhvc3REaWFsb2coaW50ZXJuYWxEaWFsb2dSZWYsIGNvbmZpZyk7XG5cbiAgICB0aGlzLmNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKFxuICAgICAgaG9zdENvbXBvbmVudFJlZj8uaW5zdGFuY2UuZGlhbG9nVGFyZ2V0LFxuICAgICAgcHJvdmlkZXJzLFxuICAgICAgY29uZmlnLmNvbXBvbmVudFxuICAgICk7XG5cbiAgICByZXR1cm4gdGhpcy5zaG93SG9zdERpYWxvZyhpbnRlcm5hbERpYWxvZ1JlZi5kaWFsb2dSZWYsIGhvc3RDb21wb25lbnRSZWYpO1xuICB9XG5cbiAgcHVibGljIHNob3dEaWFsb2dUZW1wbGF0ZShcbiAgICB0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8dW5rbm93bj4sXG4gICAgY29uZmlnOiBJTWRsRGlhbG9nQ29uZmlndXJhdGlvblxuICApOiBPYnNlcnZhYmxlPE1kbERpYWxvZ1JlZmVyZW5jZT4ge1xuICAgIGNvbnN0IGludGVybmFsRGlhbG9nUmVmID0gbmV3IEludGVybmFsTWRsRGlhbG9nUmVmZXJlbmNlKGNvbmZpZyk7XG5cbiAgICBjb25zdCBob3N0Q29tcG9uZW50UmVmID0gdGhpcy5jcmVhdGVIb3N0RGlhbG9nKGludGVybmFsRGlhbG9nUmVmLCBjb25maWcpO1xuXG4gICAgaG9zdENvbXBvbmVudFJlZj8uaW5zdGFuY2UuZGlhbG9nVGFyZ2V0Py5jcmVhdGVFbWJlZGRlZFZpZXcodGVtcGxhdGUpO1xuXG4gICAgcmV0dXJuIHRoaXMuc2hvd0hvc3REaWFsb2coaW50ZXJuYWxEaWFsb2dSZWYuZGlhbG9nUmVmLCBob3N0Q29tcG9uZW50UmVmKTtcbiAgfVxuXG4gIHByaXZhdGUgc2hvd0hvc3REaWFsb2coXG4gICAgZGlhbG9nUmVmOiBNZGxEaWFsb2dSZWZlcmVuY2UgfCB1bmRlZmluZWQsXG4gICAgaG9zdENvbXBvbmVudFJlZjogQ29tcG9uZW50UmVmPE1kbERpYWxvZ0hvc3RDb21wb25lbnQ+IHwgdW5kZWZpbmVkXG4gICkge1xuICAgIGNvbnN0IHJlc3VsdDogU3ViamVjdDxNZGxEaWFsb2dSZWZlcmVuY2U+ID0gbmV3IFN1YmplY3QoKTtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgcmVzdWx0Lm5leHQoZGlhbG9nUmVmKTtcbiAgICAgIHJlc3VsdC5jb21wbGV0ZSgpO1xuICAgICAgaG9zdENvbXBvbmVudFJlZj8uaW5zdGFuY2Uuc2hvdygpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlc3VsdC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlSG9zdERpYWxvZyhcbiAgICBpbnRlcm5hbERpYWxvZ1JlZjogSW50ZXJuYWxNZGxEaWFsb2dSZWZlcmVuY2UsXG4gICAgZGlhbG9nQ29uZmlnOiBJTWRsRGlhbG9nQ29uZmlndXJhdGlvblxuICApIHtcbiAgICBjb25zdCB2aWV3Q29udGFpbmVyUmVmID0gdGhpcy5tZGxEaWFsb2dPdXRsZXRTZXJ2aWNlLnZpZXdDb250YWluZXJSZWY7XG4gICAgaWYgKCF2aWV3Q29udGFpbmVyUmVmKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiWW91IGRpZCBub3QgcHJvdmlkZSBhIFZpZXdDb250YWluZXJSZWYuIFwiICtcbiAgICAgICAgICBcIlBsZWFzZSBzZWUgaHR0cHM6Ly9naXRodWIuY29tL21zZWVtYW5uL2FuZ3VsYXIyLW1kbC93aWtpL0hvdy10by11c2UtdGhlLU1kbERpYWxvZ1NlcnZpY2VcIlxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm92aWRlcnM6IFN0YXRpY1Byb3ZpZGVyW10gPSBbXG4gICAgICB7IHByb3ZpZGU6IE1ETF9DT05GSUdVQVJUSU9OLCB1c2VWYWx1ZTogZGlhbG9nQ29uZmlnIH0sXG4gICAgICB7IHByb3ZpZGU6IEludGVybmFsTWRsRGlhbG9nUmVmZXJlbmNlLCB1c2VWYWx1ZTogaW50ZXJuYWxEaWFsb2dSZWYgfSxcbiAgICBdO1xuXG4gICAgY29uc3QgaG9zdERpYWxvZ0NvbXBvbmVudCA9IHRoaXMuY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoXG4gICAgICB2aWV3Q29udGFpbmVyUmVmLFxuICAgICAgcHJvdmlkZXJzLFxuICAgICAgTWRsRGlhbG9nSG9zdENvbXBvbmVudFxuICAgICk7XG5cbiAgICBpbnRlcm5hbERpYWxvZ1JlZi5ob3N0RGlhbG9nQ29tcG9uZW50UmVmID0gaG9zdERpYWxvZ0NvbXBvbmVudDtcbiAgICBpbnRlcm5hbERpYWxvZ1JlZi5pc01vZGFsID0gZGlhbG9nQ29uZmlnLmlzTW9kYWw7XG5cbiAgICBpbnRlcm5hbERpYWxvZ1JlZi5jbG9zZUNhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgdGhpcy5wb3BEaWFsb2coaW50ZXJuYWxEaWFsb2dSZWYpO1xuICAgICAgaG9zdERpYWxvZ0NvbXBvbmVudD8uaW5zdGFuY2UuaGlkZShob3N0RGlhbG9nQ29tcG9uZW50KTtcbiAgICB9O1xuICAgIHRoaXMucHVzaERpYWxvZyhpbnRlcm5hbERpYWxvZ1JlZik7XG5cbiAgICByZXR1cm4gaG9zdERpYWxvZ0NvbXBvbmVudDtcbiAgfVxuXG4gIHByaXZhdGUgcHVzaERpYWxvZyhkaWFsb2dSZWY6IEludGVybmFsTWRsRGlhbG9nUmVmZXJlbmNlKSB7XG4gICAgaWYgKHRoaXMub3BlbkRpYWxvZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyBmaXJzdCBkaWFsb2cgYmVpbmcgb3BlbmVkXG4gICAgICB0aGlzLm9uRGlhbG9nc09wZW5DaGFuZ2VkLmVtaXQodHJ1ZSk7XG4gICAgfVxuXG4gICAgdGhpcy5vcGVuRGlhbG9ncy5wdXNoKGRpYWxvZ1JlZik7XG4gICAgdGhpcy5vcmRlckRpYWxvZ1N0YWNrKCk7XG4gIH1cblxuICBwcml2YXRlIHBvcERpYWxvZyhkaWFsb2dSZWY6IEludGVybmFsTWRsRGlhbG9nUmVmZXJlbmNlKSB7XG4gICAgdGhpcy5vcGVuRGlhbG9ncy5zcGxpY2UodGhpcy5vcGVuRGlhbG9ncy5pbmRleE9mKGRpYWxvZ1JlZiksIDEpO1xuICAgIHRoaXMub3JkZXJEaWFsb2dTdGFjaygpO1xuXG4gICAgaWYgKHRoaXMub3BlbkRpYWxvZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyBsYXN0IGRpYWxvZyBiZWluZyBjbG9zZWRcbiAgICAgIHRoaXMub25EaWFsb2dzT3BlbkNoYW5nZWQuZW1pdChmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvcmRlckRpYWxvZ1N0YWNrKCkge1xuICAgIC8vICsxIGJlY2F1c2UgdGhlIG92ZXJsYXkgbWF5IGhhdmUgTUlOX0RJQUxPR19aX0lOREVYIGlmIHRoZSBkaWFsb2cgaXMgbW9kYWwuXG4gICAgbGV0IHpJbmRleCA9IE1JTl9ESUFMT0dfWl9JTkRFWCArIDE7XG5cbiAgICB0aGlzLm9wZW5EaWFsb2dzLmZvckVhY2goKGlEaWFsb2dSZWYpID0+IHtcbiAgICAgIGlmIChpRGlhbG9nUmVmLmhvc3REaWFsb2cpIHtcbiAgICAgICAgaURpYWxvZ1JlZi5ob3N0RGlhbG9nLnpJbmRleCA9IHpJbmRleDtcbiAgICAgIH1cbiAgICAgIC8vICsyIHRvIG1ha2Ugcm9vbSBmb3IgdGhlIG92ZXJsYXkgaWYgYSBkaWFsb2cgaXMgbW9kYWxcbiAgICAgIHpJbmRleCArPSAyO1xuICAgIH0pO1xuXG4gICAgdGhpcy5tZGxEaWFsb2dPdXRsZXRTZXJ2aWNlLmhpZGVCYWNrZHJvcCgpO1xuXG4gICAgLy8gaWYgdGhlcmUgaXMgYSBtb2RhbCBkaWFsb2cgYXBwZW5kIHRoZSBvdmVybG9heSB0byB0aGUgZG9tIC0gaWYgbm90IHJlbW92ZSB0aGUgb3ZlcmxheSBmcm9tIHRoZSBib2R5XG4gICAgY29uc3QgdG9wTW9zdE1vZGFsRGlhbG9nOiBJbnRlcm5hbE1kbERpYWxvZ1JlZmVyZW5jZSB8IG51bGwgPVxuICAgICAgdGhpcy5nZXRUb3BNb3N0SW50ZXJuYWxEaWFsb2dSZWYoKTtcbiAgICBpZiAodG9wTW9zdE1vZGFsRGlhbG9nKSB7XG4gICAgICAvLyBtb3ZlIHRoZSBvdmVybGF5IGRpcmVkY3QgdW5kZXIgdGhlIHRvcG1vcyBtb2RhbCBkaWFsb2dcbiAgICAgIHRoaXMubWRsRGlhbG9nT3V0bGV0U2VydmljZS5zaG93QmFja2Ryb3BXaXRoWkluZGV4KFxuICAgICAgICB0b3BNb3N0TW9kYWxEaWFsb2c/Lmhvc3REaWFsb2c/LnpJbmRleFxuICAgICAgICAgID8gdG9wTW9zdE1vZGFsRGlhbG9nLmhvc3REaWFsb2cuekluZGV4IC0gMVxuICAgICAgICAgIDogMFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldFRvcE1vc3RJbnRlcm5hbERpYWxvZ1JlZigpOiBJbnRlcm5hbE1kbERpYWxvZ1JlZmVyZW5jZSB8IG51bGwge1xuICAgIGxldCB0b3BNb3N0TW9kYWxEaWFsb2c6IEludGVybmFsTWRsRGlhbG9nUmVmZXJlbmNlIHwgbnVsbCA9IG51bGw7XG5cbiAgICBmb3IgKGxldCBpID0gdGhpcy5vcGVuRGlhbG9ncy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgaWYgKHRoaXMub3BlbkRpYWxvZ3NbaV0uaXNNb2RhbCkge1xuICAgICAgICB0b3BNb3N0TW9kYWxEaWFsb2cgPSB0aGlzLm9wZW5EaWFsb2dzW2ldO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRvcE1vc3RNb2RhbERpYWxvZztcbiAgfVxuXG4gIHByaXZhdGUgb25CYWNrZHJvcENsaWNrKCkge1xuICAgIGNvbnN0IHRvcE1vc3RNb2RhbERpYWxvZzogSW50ZXJuYWxNZGxEaWFsb2dSZWZlcmVuY2UgfCBudWxsID1cbiAgICAgIHRoaXMuZ2V0VG9wTW9zdEludGVybmFsRGlhbG9nUmVmKCk7XG4gICAgaWYgKHRvcE1vc3RNb2RhbERpYWxvZz8uY29uZmlnLmNsaWNrT3V0c2lkZVRvQ2xvc2UpIHtcbiAgICAgIHRvcE1vc3RNb2RhbERpYWxvZz8uaGlkZSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQ29tcG9uZW50SW5zdGFuY2U8VD4oXG4gICAgdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZiB8IHVuZGVmaW5lZCxcbiAgICBwcm92aWRlcnM6IFN0YXRpY1Byb3ZpZGVyW10sXG4gICAgY29tcG9uZW50OiBUeXBlPFQ+XG4gICk6IENvbXBvbmVudFJlZjxUPiB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY0ZhY3RvcnkgPVxuICAgICAgdGhpcy5jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoY29tcG9uZW50KTtcblxuICAgIGNvbnN0IGluamVjdG9yID0gSW5qZWN0b3IuY3JlYXRlKHtcbiAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICAuLi5wcm92aWRlcnMsXG4gICAgICAgIHsgcHJvdmlkZTogVmlld0NvbnRhaW5lclJlZiwgdXNlVmFsdWU6IHZpZXdDb250YWluZXJSZWYgfSxcbiAgICAgIF0sXG4gICAgICBwYXJlbnQ6IHRoaXMuaW5qZWN0b3IsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdmlld0NvbnRhaW5lclJlZj8uY3JlYXRlQ29tcG9uZW50KFxuICAgICAgY0ZhY3RvcnksXG4gICAgICB2aWV3Q29udGFpbmVyUmVmLmxlbmd0aCxcbiAgICAgIGluamVjdG9yXG4gICAgKTtcbiAgfVxufVxuIl19