@angular-mdl/core
Version:
Angular components, directives and styles based on material design lite https://getmdl.io.
171 lines • 28.5 kB
JavaScript
import { Component, ElementRef, forwardRef, HostBinding, Inject, NgZone, Renderer2, ViewChild, ViewContainerRef, ViewEncapsulation, } from "@angular/core";
import { MDL_CONFIGUARTION, MIN_DIALOG_Z_INDEX } from "./config";
import { MdlButtonComponent } from "../button/mdl-button.component";
import { InternalMdlDialogReference } from "./internal-dialog-reference";
import { Animations } from "../common/animations";
import * as i0 from "@angular/core";
import * as i1 from "../common/animations";
import * as i2 from "./internal-dialog-reference";
const enterTransitionDuration = 300;
const leaveTransitionDuration = 250;
const enterTransitionEasingCurve = "cubic-bezier(0.0, 0.0, 0.2, 1)";
const leaveTransitionEasingCurve = "cubic-bezier(0.0, 0.0, 0.2, 1)";
const createOpenCloseRect = (rect) => ({
height: rect.top - rect.bottom,
left: rect.left,
top: rect.top,
width: rect.right - rect.left,
});
const getCenterInScreen = (rect) => ({
cx: Math.round(rect.left + rect.width / 2),
cy: Math.round(rect.top + rect.height / 2),
});
const getClientRect = (input) => {
if (input instanceof MdlButtonComponent) {
const elRef = input.elementRef;
const rect = elRef.nativeElement.getBoundingClientRect();
return createOpenCloseRect(rect);
}
else if (input instanceof MouseEvent) {
const evt = input;
// just to make it possible to test this code with a fake event - target is
// readonly and con not be mutated.
// eslint-disable-next-line
const htmlElement = (evt.target || evt.testtarget);
const rect = htmlElement.getBoundingClientRect();
return createOpenCloseRect(rect);
}
return input;
};
// @experimental
export class MdlDialogHostComponent {
constructor(ngZone, renderer, animations, elementRef, config, internalDialogRef) {
this.ngZone = ngZone;
this.renderer = renderer;
this.animations = animations;
this.elementRef = elementRef;
this.config = config;
this.internalDialogRef = internalDialogRef;
this.isDialog = true;
this.visible = false;
this.zIndex = MIN_DIALOG_Z_INDEX + 1;
this.showAnimationStartStyle = {
top: "38%",
opacity: "0",
};
this.showStyle = {
top: "50%",
opacity: "1",
};
this.hideAnimationEndStyle = {
top: "63%",
opacity: "0",
};
}
show() {
this.visible = true;
// give the dialogs time to draw so that a focus can be set
setTimeout(() => {
this.internalDialogRef.visible();
});
if (this.isAnimateEnabled()) {
if (this.config.openFrom || this.config.closeTo) {
// transform is modified during anmiation and must be part of each animation keyframe.
this.showStyle["transform"] = "translate(0, -50%) scale(1.0)";
const targetClientRect = this.elementRef.nativeElement.getBoundingClientRect();
const openFromRect = getClientRect(this.config?.openFrom);
const closeToRect = this.config.closeTo
? getClientRect(this.config.closeTo)
: openFromRect;
const centerTarget = getCenterInScreen(targetClientRect);
const centerFrom = getCenterInScreen(openFromRect);
const centerTo = getCenterInScreen(closeToRect);
const translationFrom = {
x: Math.round(centerFrom.cx - centerTarget.cx),
y: Math.round(centerFrom.cy - centerTarget.cy),
scaleX: Math.round(100 * Math.min(0.25, openFromRect.width / targetClientRect.width)) / 100,
scaleY: Math.round(100 *
Math.min(0.25, openFromRect.height / targetClientRect.height)) / 100,
};
this.showAnimationStartStyle = {
top: `${targetClientRect.top}px`,
opacity: "0",
transform: `translate(${translationFrom.x}px, ${translationFrom.y}px) scale(${translationFrom.scaleX}, ${translationFrom.scaleY})`,
};
const translationTo = {
x: Math.round(centerTo.cx - centerTarget.cx),
y: Math.round(centerTo.cy - centerTarget.cy),
scaleX: Math.round(100 * Math.min(0.25, closeToRect.width / targetClientRect.width)) / 100,
scaleY: Math.round(100 * Math.min(0.25, closeToRect.height / targetClientRect.height)) / 100,
};
this.hideAnimationEndStyle = {
top: `${targetClientRect.top}px`,
opacity: "0",
transform: `translate(${translationTo.x}px, ${translationTo.y}px) scale(${translationTo.scaleX}, ${translationTo.scaleY})`,
};
}
const animation = this.animations.animate(this.elementRef.nativeElement, [this.showAnimationStartStyle, this.showStyle], this.config.enterTransitionDuration || enterTransitionDuration, this.config.enterTransitionEasingCurve || enterTransitionEasingCurve);
animation.play();
}
}
hide(selfComponentRef) {
if (this.isAnimateEnabled()) {
const animation = this.animations.animate(this.elementRef.nativeElement, [this.showStyle, this.hideAnimationEndStyle], this.config.leaveTransitionDuration || leaveTransitionDuration, this.config.leaveTransitionEasingCurve || leaveTransitionEasingCurve);
animation.onDone(() => {
selfComponentRef.destroy();
});
animation.play();
}
else {
selfComponentRef.destroy();
}
}
ngOnInit() {
this.applyStyle(this.config.styles);
this.applyClasses(this.config.classes ? this.config.classes : "");
}
applyStyle(styles) {
if (styles) {
for (const style of Object.keys(styles)) {
this.renderer.setStyle(this.elementRef.nativeElement, style, styles[style]);
}
}
}
applyClasses(classes) {
classes
.split(" ")
.filter((cssClass) => !!cssClass)
.forEach((cssClass) => {
this.renderer.addClass(this.elementRef.nativeElement, cssClass);
});
}
isAnimateEnabled() {
// not present? assume it is true.
if (typeof this.config.animate === "undefined") {
return true;
}
return this.config.animate;
}
}
MdlDialogHostComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: MdlDialogHostComponent, deps: [{ token: i0.NgZone }, { token: i0.Renderer2 }, { token: i1.Animations }, { token: i0.ElementRef }, { token: forwardRef(() => MDL_CONFIGUARTION) }, { token: i2.InternalMdlDialogReference }], target: i0.ɵɵFactoryTarget.Component });
MdlDialogHostComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.4", type: MdlDialogHostComponent, selector: "mdl-dialog-host-component", host: { properties: { "class.mdl-dialog": "this.isDialog", "class.open": "this.visible", "style.zIndex": "this.zIndex" } }, viewQueries: [{ propertyName: "dialogTarget", first: true, predicate: ["dialogTarget"], descendants: true, read: ViewContainerRef, static: true }], ngImport: i0, template: ` <div #dialogTarget></div>`, isInline: true, styles: ["mdl-dialog-host-component{width:-moz-fit-content;width:fit-content;height:-moz-fit-content;height:fit-content;padding:1em;background:white;color:#000;opacity:1;visibility:hidden;display:block;position:fixed;margin:auto;left:0;right:0;transition:all;top:50%;transform:translateY(-50%)}mdl-dialog-host-component.open{visibility:visible}\n"], encapsulation: i0.ViewEncapsulation.None });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: MdlDialogHostComponent, decorators: [{
type: Component,
args: [{ selector: "mdl-dialog-host-component", template: ` <div #dialogTarget></div>`, encapsulation: ViewEncapsulation.None, styles: ["mdl-dialog-host-component{width:-moz-fit-content;width:fit-content;height:-moz-fit-content;height:fit-content;padding:1em;background:white;color:#000;opacity:1;visibility:hidden;display:block;position:fixed;margin:auto;left:0;right:0;transition:all;top:50%;transform:translateY(-50%)}mdl-dialog-host-component.open{visibility:visible}\n"] }]
}], ctorParameters: function () { return [{ type: i0.NgZone }, { type: i0.Renderer2 }, { type: i1.Animations }, { type: i0.ElementRef }, { type: undefined, decorators: [{
type: Inject,
args: [forwardRef(() => MDL_CONFIGUARTION)]
}] }, { type: i2.InternalMdlDialogReference }]; }, propDecorators: { dialogTarget: [{
type: ViewChild,
args: ["dialogTarget", { read: ViewContainerRef, static: true }]
}], isDialog: [{
type: HostBinding,
args: ["class.mdl-dialog"]
}], visible: [{
type: HostBinding,
args: ["class.open"]
}], zIndex: [{
type: HostBinding,
args: ["style.zIndex"]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWRsLWRpYWxvZy1ob3N0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUvc3JjL2xpYi9kaWFsb2cvbWRsLWRpYWxvZy1ob3N0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULFVBQVUsRUFDVixVQUFVLEVBQ1YsV0FBVyxFQUNYLE1BQU0sRUFDTixNQUFNLEVBRU4sU0FBUyxFQUNULFNBQVMsRUFDVCxnQkFBZ0IsRUFDaEIsaUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUtqRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNwRSxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN6RSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7Ozs7QUFFbEQsTUFBTSx1QkFBdUIsR0FBRyxHQUFHLENBQUM7QUFDcEMsTUFBTSx1QkFBdUIsR0FBRyxHQUFHLENBQUM7QUFFcEMsTUFBTSwwQkFBMEIsR0FBRyxnQ0FBZ0MsQ0FBQztBQUNwRSxNQUFNLDBCQUEwQixHQUFHLGdDQUFnQyxDQUFDO0FBRXBFLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxJQUFnQixFQUFrQixFQUFFLENBQUMsQ0FBQztJQUNqRSxNQUFNLEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTTtJQUM5QixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7SUFDZixHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUc7SUFDYixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSTtDQUM5QixDQUFDLENBQUM7QUFFSCxNQUFNLGlCQUFpQixHQUFHLENB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QU07c0JBREwsV0FBVzt1QkFBQyxjQUFjIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBDb21wb25lbnRSZWYsXG4gIEVsZW1lbnRSZWYsXG4gIGZvcndhcmRSZWYsXG4gIEhvc3RCaW5kaW5nLFxuICBJbmplY3QsXG4gIE5nWm9uZSxcbiAgT25Jbml0LFxuICBSZW5kZXJlcjIsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0NvbnRhaW5lclJlZixcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5cbmltcG9ydCB7IE1ETF9DT05GSUdVQVJUSU9OLCBNSU5fRElBTE9HX1pfSU5ERVggfSBmcm9tIFwiLi9jb25maWdcIjtcbmltcG9ydCB7XG4gIElNZGxEaWFsb2dDb25maWd1cmF0aW9uLFxuICBJT3BlbkNsb3NlUmVjdCxcbn0gZnJvbSBcIi4vbWRsLWRpYWxvZy1jb25maWd1cmF0aW9uXCI7XG5pbXBvcnQgeyBNZGxCdXR0b25Db21wb25lbnQgfSBmcm9tIFwiLi4vYnV0dG9uL21kbC1idXR0b24uY29tcG9uZW50XCI7XG5pbXBvcnQgeyBJbnRlcm5hbE1kbERpYWxvZ1JlZmVyZW5jZSB9IGZyb20gXCIuL2ludGVybmFsLWRpYWxvZy1yZWZlcmVuY2VcIjtcbmltcG9ydCB7IEFuaW1hdGlvbnMgfSBmcm9tIFwiLi4vY29tbW9uL2FuaW1hdGlvbnNcIjtcblxuY29uc3QgZW50ZXJUcmFuc2l0aW9uRHVyYXRpb24gPSAzMDA7XG5jb25zdCBsZWF2ZVRyYW5zaXRpb25EdXJhdGlvbiA9IDI1MDtcblxuY29uc3QgZW50ZXJUcmFuc2l0aW9uRWFzaW5nQ3VydmUgPSBcImN1YmljLWJlemllcigwLjAsIDAuMCwgMC4yLCAxKVwiO1xuY29uc3QgbGVhdmVUcmFuc2l0aW9uRWFzaW5nQ3VydmUgPSBcImN1YmljLWJlemllcigwLjAsIDAuMCwgMC4yLCAxKVwiO1xuXG5jb25zdCBjcmVhdGVPcGVuQ2xvc2VSZWN0ID0gKHJlY3Q6IENsaWVudFJlY3QpOiBJT3BlbkNsb3NlUmVjdCA9PiAoe1xuICBoZWlnaHQ6IHJlY3QudG9wIC0gcmVjdC5ib3R0b20sXG4gIGxlZnQ6IHJlY3QubGVmdCxcbiAgdG9wOiByZWN0LnRvcCxcbiAgd2lkdGg6IHJlY3QucmlnaHQgLSByZWN0LmxlZnQsXG59KTtcblxuY29uc3QgZ2V0Q2VudGVySW5TY3JlZW4gPSAocmVjdDogSU9wZW5DbG9zZVJlY3QpID0+ICh7XG4gIGN4OiBNYXRoLnJvdW5kKHJlY3QubGVmdCArIHJlY3Qud2lkdGggLyAyKSxcbiAgY3k6IE1hdGgucm91bmQocmVjdC50b3AgKyByZWN0LmhlaWdodCAvIDIpLFxufSk7XG5cbmNvbnN0IGdldENsaWVudFJlY3QgPSAoXG4gIGlucHV0OiBNZGxCdXR0b25Db21wb25lbnQgfCBNb3VzZUV2ZW50IHwgSU9wZW5DbG9zZVJlY3QgfCB1bmRlZmluZWRcbik6IElPcGVuQ2xvc2VSZWN0ID0+IHtcbiAgaWYgKGlucHV0IGluc3RhbmNlb2YgTWRsQnV0dG9uQ29tcG9uZW50KSB7XG4gICAgY29uc3QgZWxSZWYgPSAoaW5wdXQgYXMgTWRsQnV0dG9uQ29tcG9uZW50KS5lbGVtZW50UmVmO1xuICAgIGNvbnN0IHJlY3Q6IENsaWVudFJlY3QgPSBlbFJlZi5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHJldHVybiBjcmVhdGVPcGVuQ2xvc2VSZWN0KHJlY3QpO1xuICB9IGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgTW91c2VFdmVudCkge1xuICAgIGNvbnN0IGV2dDogTW91c2VFdmVudCA9IGlucHV0IGFzIE1vdXNlRXZlbnQ7XG4gICAgLy8ganVzdCB0byBtYWtlIGl0IHBvc3NpYmxlIHRvIHRlc3QgdGhpcyBjb2RlIHdpdGggYSBmYWtlIGV2ZW50IC0gdGFyZ2V0IGlzXG4gICAgLy8gcmVhZG9ubHkgYW5kIGNvbiBub3QgYmUgbXV0YXRlZC5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICBjb25zdCBodG1sRWxlbWVudCA9IChldnQudGFyZ2V0IHx8IChldnQgYXMgYW55KS50ZXN0dGFyZ2V0KSBhcyBIVE1MRWxlbWVudDtcbiAgICBjb25zdCByZWN0OiBDbGllbnRSZWN0ID0gaHRtbEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgcmV0dXJuIGNyZWF0ZU9wZW5DbG9zZVJlY3QocmVjdCk7XG4gIH1cbiAgcmV0dXJuIGlucHV0IGFzIElPcGVuQ2xvc2VSZWN0O1xufTtcblxuLy8gQGV4cGVyaW1lbnRhbFxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcIm1kbC1kaWFsb2ctaG9zdC1jb21wb25lbnRcIixcbiAgdGVtcGxhdGU6IGAgPGRpdiAjZGlhbG9nVGFyZ2V0PjwvZGl2PmAsXG4gIHN0eWxlczogW1xuICAgIGBcbiAgICAgIG1kbC1kaWFsb2ctaG9zdC1jb21wb25lbnQge1xuICAgICAgICB3aWR0aDogZml0LWNvbnRlbnQ7XG4gICAgICAgIGhlaWdodDogZml0LWNvbnRlbnQ7XG4gICAgICAgIHBhZGRpbmc6IDFlbTtcbiAgICAgICAgYmFja2dyb3VuZDogd2hpdGU7XG4gICAgICAgIGNvbG9yOiBibGFjaztcbiAgICAgICAgb3BhY2l0eTogMTtcbiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuO1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgcG9zaXRpb246IGZpeGVkO1xuICAgICAgICBtYXJnaW46IGF1dG87XG4gICAgICAgIGxlZnQ6IDA7XG4gICAgICAgIHJpZ2h0OiAwO1xuICAgICAgICB0cmFuc2l0aW9uOiBhbGw7XG4gICAgICAgIHRvcDogNTAlO1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwLCAtNTAlKTtcbiAgICAgIH1cblxuICAgICAgbWRsLWRpYWxvZy1ob3N0LWNvbXBvbmVudC5vcGVuIHtcbiAgICAgICAgdmlzaWJpbGl0eTogdmlzaWJsZTtcbiAgICAgIH1cbiAgICBgLFxuICBdLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxufSlcbmV4cG9ydCBjbGFzcyBNZGxEaWFsb2dIb3N0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQFZpZXdDaGlsZChcImRpYWxvZ1RhcmdldFwiLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICBkaWFsb2dUYXJnZXQ6IFZpZXdDb250YWluZXJSZWYgfCB1bmRlZmluZWQ7XG5cbiAgQEhvc3RCaW5kaW5nKFwiY2xhc3MubWRsLWRpYWxvZ1wiKVxuICBpc0RpYWxvZyA9IHRydWU7XG5cbiAgQEhvc3RCaW5kaW5nKFwiY2xhc3Mub3BlblwiKVxuICB2aXNpYmxlID0gZmFsc2U7XG5cbiAgQEhvc3RCaW5kaW5nKFwic3R5bGUuekluZGV4XCIpXG4gIHpJbmRleDogbnVtYmVyID0gTUlOX0RJQUxPR19aX0lOREVYICsgMTtcblxuICBwcml2YXRlIHNob3dBbmltYXRpb25TdGFydFN0eWxlOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgIHRvcDogXCIzOCVcIixcbiAgICBvcGFjaXR5OiBcIjBcIixcbiAgfTtcbiAgcHJpdmF0ZSBzaG93U3R5bGU6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgdG9wOiBcIjUwJVwiLFxuICAgIG9wYWNpdHk6IFwiMVwiLFxuICB9O1xuICBwcml2YXRlIGhpZGVBbmltYXRpb25FbmRTdHlsZTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICB0b3A6IFwiNjMlXCIsXG4gICAgb3BhY2l0eTogXCIwXCIsXG4gIH07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSxcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgcHJpdmF0ZSBhbmltYXRpb25zOiBBbmltYXRpb25zLFxuICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICBASW5qZWN0KGZvcndhcmRSZWYoKCkgPT4gTURMX0NPTkZJR1VBUlRJT04pKVxuICAgIHByaXZhdGUgY29uZmlnOiBJTWRsRGlhbG9nQ29uZmlndXJhdGlvbixcbiAgICBwcml2YXRlIGludGVybmFsRGlhbG9nUmVmOiBJbnRlcm5hbE1kbERpYWxvZ1JlZmVyZW5jZVxuICApIHt9XG5cbiAgc2hvdygpOiB2b2lkIHtcbiAgICB0aGlzLnZpc2libGUgPSB0cnVlO1xuICAgIC8vIGdpdmUgdGhlIGRpYWxvZ3MgdGltZSB0byBkcmF3IHNvIHRoYXQgYSBmb2N1cyBjYW4gYmUgc2V0XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmludGVybmFsRGlhbG9nUmVmLnZpc2libGUoKTtcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLmlzQW5pbWF0ZUVuYWJsZWQoKSkge1xuICAgICAgaWYgKHRoaXMuY29uZmlnLm9wZW5Gcm9tIHx8IHRoaXMuY29uZmlnLmNsb3NlVG8pIHtcbiAgICAgICAgLy8gdHJhbnNmb3JtIGlzIG1vZGlmaWVkIGR1cmluZyBhbm1pYXRpb24gYW5kIG11c3QgYmUgcGFydCBvZiBlYWNoIGFuaW1hdGlvbiBrZXlmcmFtZS5cbiAgICAgICAgdGhpcy5zaG93U3R5bGVbXCJ0cmFuc2Zvcm1cIl0gPSBcInRyYW5zbGF0ZSgwLCAtNTAlKSBzY2FsZSgxLjApXCI7XG5cbiAgICAgICAgY29uc3QgdGFyZ2V0Q2xpZW50UmVjdCA9XG4gICAgICAgICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgICAgY29uc3Qgb3BlbkZyb21SZWN0ID0gZ2V0Q2xpZW50UmVjdCh0aGlzLmNvbmZpZz8ub3BlbkZyb20pO1xuICAgICAgICBjb25zdCBjbG9zZVRvUmVjdCA9IHRoaXMuY29uZmlnLmNsb3NlVG9cbiAgICAgICAgICA/IGdldENsaWVudFJlY3QodGhpcy5jb25maWcuY2xvc2VUbylcbiAgICAgICAgICA6IG9wZW5Gcm9tUmVjdDtcblxuICAgICAgICBjb25zdCBjZW50ZXJUYXJnZXQgPSBnZXRDZW50ZXJJblNjcmVlbih0YXJnZXRDbGllbnRSZWN0KTtcbiAgICAgICAgY29uc3QgY2VudGVyRnJvbSA9IGdldENlbnRlckluU2NyZWVuKG9wZW5Gcm9tUmVjdCk7XG4gICAgICAgIGNvbnN0IGNlbnRlclRvID0gZ2V0Q2VudGVySW5TY3JlZW4oY2xvc2VUb1JlY3QpO1xuXG4gICAgICAgIGNvbnN0IHRyYW5zbGF0aW9uRnJvbSA9IHtcbiAgICAgICAgICB4OiBNYXRoLnJvdW5kKGNlbnRlckZyb20uY3ggLSBjZW50ZXJUYXJnZXQuY3gpLFxuICAgICAgICAgIHk6IE1hdGgucm91bmQoY2VudGVyRnJvbS5jeSAtIGNlbnRlclRhcmdldC5jeSksXG4gICAgICAgICAgc2NhbGVYOlxuICAgICAgICAgICAgTWF0aC5yb3VuZChcbiAgICAgICAgICAgICAgMTAwICogTWF0aC5taW4oMC4yNSwgb3BlbkZyb21SZWN0LndpZHRoIC8gdGFyZ2V0Q2xpZW50UmVjdC53aWR0aClcbiAgICAgICAgICAgICkgLyAxMDAsXG4gICAgICAgICAgc2NhbGVZOlxuICAgICAgICAgICAgTWF0aC5yb3VuZChcbiAgICAgICAgICAgICAgMTAwICpcbiAgICAgICAgICAgICAgICBNYXRoLm1pbigwLjI1LCBvcGVuRnJvbVJlY3QuaGVpZ2h0IC8gdGFyZ2V0Q2xpZW50UmVjdC5oZWlnaHQpXG4gICAgICAgICAgICApIC8gMTAwLFxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuc2hvd0FuaW1hdGlvblN0YXJ0U3R5bGUgPSB7XG4gICAgICAgICAgdG9wOiBgJHt0YXJnZXRDbGllbnRSZWN0LnRvcH1weGAsXG4gICAgICAgICAgb3BhY2l0eTogXCIwXCIsXG4gICAgICAgICAgdHJhbnNmb3JtOiBgdHJhbnNsYXRlKCR7dHJhbnNsYXRpb25Gcm9tLnh9cHgsICR7dHJhbnNsYXRpb25Gcm9tLnl9cHgpIHNjYWxlKCR7dHJhbnNsYXRpb25Gcm9tLnNjYWxlWH0sICR7dHJhbnNsYXRpb25Gcm9tLnNjYWxlWX0pYCxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCB0cmFuc2xhdGlvblRvID0ge1xuICAgICAgICAgIHg6IE1hdGgucm91bmQoY2VudGVyVG8uY3ggLSBjZW50ZXJUYXJnZXQuY3gpLFxuICAgICAgICAgIHk6IE1hdGgucm91bmQoY2VudGVyVG8uY3kgLSBjZW50ZXJUYXJnZXQuY3kpLFxuICAgICAgICAgIHNjYWxlWDpcbiAgICAgICAgICAgIE1hdGgucm91bmQoXG4gICAgICAgICAgICAgIDEwMCAqIE1hdGgubWluKDAuMjUsIGNsb3NlVG9SZWN0LndpZHRoIC8gdGFyZ2V0Q2xpZW50UmVjdC53aWR0aClcbiAgICAgICAgICAgICkgLyAxMDAsXG4gICAgICAgICAgc2NhbGVZOlxuICAgICAgICAgICAgTWF0aC5yb3VuZChcbiAgICAgICAgICAgICAgMTAwICogTWF0aC5taW4oMC4yNSwgY2xvc2VUb1JlY3QuaGVpZ2h0IC8gdGFyZ2V0Q2xpZW50UmVjdC5oZWlnaHQpXG4gICAgICAgICAgICApIC8gMTAwLFxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuaGlkZUFuaW1hdGlvbkVuZFN0eWxlID0ge1xuICAgICAgICAgIHRvcDogYCR7dGFyZ2V0Q2xpZW50UmVjdC50b3B9cHhgLFxuICAgICAgICAgIG9wYWNpdHk6IFwiMFwiLFxuICAgICAgICAgIHRyYW5zZm9ybTogYHRyYW5zbGF0ZSgke3RyYW5zbGF0aW9uVG8ueH1weCwgJHt0cmFuc2xhdGlvblRvLnl9cHgpIHNjYWxlKCR7dHJhbnNsYXRpb25Uby5zY2FsZVh9LCAke3RyYW5zbGF0aW9uVG8uc2NhbGVZfSlgLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBhbmltYXRpb24gPSB0aGlzLmFuaW1hdGlvbnMuYW5pbWF0ZShcbiAgICAgICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgIFt0aGlzLnNob3dBbmltYXRpb25TdGFydFN0eWxlLCB0aGlzLnNob3dTdHlsZV0sXG4gICAgICAgIHRoaXMuY29uZmlnLmVudGVyVHJhbnNpdGlvbkR1cmF0aW9uIHx8IGVudGVyVHJhbnNpdGlvbkR1cmF0aW9uLFxuICAgICAgICB0aGlzLmNvbmZpZy5lbnRlclRyYW5zaXRpb25FYXNpbmdDdXJ2ZSB8fCBlbnRlclRyYW5zaXRpb25FYXNpbmdDdXJ2ZVxuICAgICAgKTtcblxuICAgICAgYW5pbWF0aW9uLnBsYXkoKTtcbiAgICB9XG4gIH1cblxuICBoaWRlKHNlbGZDb21wb25lbnRSZWY6IENvbXBvbmVudFJlZjxNZGxEaWFsb2dIb3N0Q29tcG9uZW50Pik6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzQW5pbWF0ZUVuYWJsZWQoKSkge1xuICAgICAgY29uc3QgYW5pbWF0aW9uID0gdGhpcy5hbmltYXRpb25zLmFuaW1hdGUoXG4gICAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LFxuICAgICAgICBbdGhpcy5zaG93U3R5bGUsIHRoaXMuaGlkZUFuaW1hdGlvbkVuZFN0eWxlXSxcbiAgICAgICAgdGhpcy5jb25maWcubGVhdmVUcmFuc2l0aW9uRHVyYXRpb24gfHwgbGVhdmVUcmFuc2l0aW9uRHVyYXRpb24sXG4gICAgICAgIHRoaXMuY29uZmlnLmxlYXZlVHJhbnNpdGlvbkVhc2luZ0N1cnZlIHx8IGxlYXZlVHJhbnNpdGlvbkVhc2luZ0N1cnZlXG4gICAgICApO1xuXG4gICAgICBhbmltYXRpb24ub25Eb25lKCgpID0+IHtcbiAgICAgICAgc2VsZkNvbXBvbmVudFJlZi5kZXN0cm95KCk7XG4gICAgICB9KTtcblxuICAgICAgYW5pbWF0aW9uLnBsYXkoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZkNvbXBvbmVudFJlZi5kZXN0cm95KCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5hcHBseVN0eWxlKHRoaXMuY29uZmlnLnN0eWxlcyk7XG4gICAgdGhpcy5hcHBseUNsYXNzZXModGhpcy5jb25maWcuY2xhc3NlcyA/IHRoaXMuY29uZmlnLmNsYXNzZXMgOiBcIlwiKTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlTdHlsZShzdHlsZXM6IHsgW3A6IHN0cmluZ106IHN0cmluZyB9IHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHN0eWxlcykge1xuICAgICAgZm9yIChjb25zdCBzdHlsZSBvZiBPYmplY3Qua2V5cyhzdHlsZXMpKSB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoXG4gICAgICAgICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgICAgc3R5bGUsXG4gICAgICAgICAgc3R5bGVzW3N0eWxlXVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlDbGFzc2VzKGNsYXNzZXM6IHN0cmluZykge1xuICAgIGNsYXNzZXNcbiAgICAgIC5zcGxpdChcIiBcIilcbiAgICAgIC5maWx0ZXIoKGNzc0NsYXNzKSA9PiAhIWNzc0NsYXNzKVxuICAgICAgLmZvckVhY2goKGNzc0NsYXNzKSA9PiB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsIGNzc0NsYXNzKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0FuaW1hdGVFbmFibGVkKCkge1xuICAgIC8vIG5vdCBwcmVzZW50PyAgYXNzdW1lIGl0IGlzIHRydWUuXG4gICAgaWYgKHR5cGVvZiB0aGlzLmNvbmZpZy5hbmltYXRlID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmFuaW1hdGU7XG4gIH1cbn1cbiJdfQ==