ems-web-app-loader
Version:
The embedded angular.io component and service expose an interface for rendering a modal overlay and loader animation during server transactions.
188 lines (176 loc) • 24.2 kB
JavaScript
import { Component, Input, HostBinding } from '@angular/core';
import { LoaderType } from "./loader.classes";
import * as i0 from "@angular/core";
import * as i1 from "./loader.service";
import * as i2 from "@angular/platform-browser";
import * as i3 from "@angular/common";
export class LoaderComponent {
constructor(service, sanitizer) {
this.service = service;
this.sanitizer = sanitizer;
this.showLoader = false;
this.transparent = true;
this.spinner = true;
this.ellipsis = false;
this.speed = 1000;
this.animation = 1000;
this.size = 200;
this.color = "#001F39";
this.background = "rgba(255,255,255,0.25)";
this.zIndex = 10000;
this.type = LoaderType.Spinner;
this.LoaderType = LoaderType;
this.timeout = 0;
this.initialize = () => {
this.service.loader$.subscribe(request => {
this.type = request.type ?? LoaderType.Spinner;
this.ellipsis = this.type === LoaderType.Ellipsis;
this.spinner = this.type === LoaderType.Spinner;
this.render(request.render);
});
};
}
;
ngOnInit() {
this.buildStyles();
}
ngAfterViewInit() {
window.setTimeout(this.initialize);
}
ngOnChanges(changes) {
this.buildStyles();
}
buildStyles() {
const eclipseSize = this.size * 0.8;
const transformSize = (eclipseSize / 2) + 2;
const position = (this.size - eclipseSize) / 2;
const translate1 = -0.5 * this.size;
const translate2 = 0.5 * this.size;
const dotSize = this.size;
const dotBoxSize = dotSize * 6;
const dotTop = (dotBoxSize - dotSize) / 2;
const dotGap = (dotBoxSize - (3 * dotSize)) / 4;
const dotEdge2 = (2 * dotGap) + dotSize;
const dotEdge3 = (3 * dotGap) + (2 * dotSize);
const transform = dotGap + dotSize;
const styles = `<style>
lds-ellipsis2 {
0% {
transform: translate(0, 0);
}
100% {
transform: translate(${transform}px, 0);
}
}
loader.spinner,
loader.spinner.showLoader,
loader.spinner.hideLoader,
loader.ellipsis,
loader.ellipsis.showLoader,
loader.ellipsis.hideLoader {
transition: opacity ${this.speed / 1000}s;
}
loader.spinner.showLoader,
loader.ellipsis.showLoader {
background: ${this.background};
z-index: ${this.zIndex};
}
loader.spinner .lds-eclipse div:not(.percentage) {
box-shadow: 0 4px 0 0 ${this.color};
width: ${eclipseSize}px;
height: ${eclipseSize}px;
top: ${position}px;
left: ${position}px;
-webkit-transform-origin: ${eclipseSize / 2}px ${transformSize}px;
transform-origin: ${eclipseSize / 2}px ${transformSize}px;
-webkit-animation: lds-eclipse ${this.animation / 1000}s linear infinite;
animation: lds-eclipse ${this.animation / 1000}s linear infinite;
}
loader.spinner .lds-eclipse {
width: ${this.size}px;
height: ${this.size}px;
-webkit-transform: translate(${translate1}px, ${translate1}px) scale(1) translate(${translate2}px, ${translate2}px);
transform: translate(${translate1}px, ${translate1}px) scale(1) translate(${translate2}px, ${translate2}px);
}
loader.ellipsis .lds-ellipsis {
width: ${dotBoxSize}px;
height: ${dotBoxSize}px;
}
loader.ellipsis .lds-ellipsis div {
top: ${dotTop}px;
width: ${dotSize}px;
height: ${dotSize}px;
background: ${this.color};
}
loader.ellipsis .lds-ellipsis div:nth-child(1) {
left: ${dotGap}px;
animation-duration: ${this.animation / 1000}s !important;
}
loader.ellipsis .lds-ellipsis div:nth-child(2) {
left: ${dotGap}px;
animation: lds-ellipsis2 ${this.animation / 1000}s infinite !important;
}
loader.ellipsis .lds-ellipsis div:nth-child(3) {
left: ${dotEdge2}px;
animation: lds-ellipsis2 ${this.animation / 1000}s infinite !important;
}
loader.ellipsis .lds-ellipsis div:nth-child(4) {
left: ${dotEdge3}px;
animation-duration: ${this.animation / 1000}s !important;
}
</style>`;
this.styles = this.sanitizer.bypassSecurityTrustHtml(styles);
}
render(show) {
clearTimeout(this.timeout);
if (show)
this.show();
else
this.hide();
}
show() {
this.showLoader = true;
this.timeout = window.setTimeout(() => this.transparent = false);
}
hide() {
this.transparent = true;
this.timeout = window.setTimeout(() => this.showLoader = false, this.speed);
}
}
LoaderComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: LoaderComponent, deps: [{ token: i1.LoaderService }, { token: i2.DomSanitizer }], target: i0.ɵɵFactoryTarget.Component });
LoaderComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: LoaderComponent, selector: "loader", inputs: { speed: ["transition-speed", "speed"], animation: ["animation-duration", "animation"], size: "size", color: "color", background: "background", zIndex: ["z-index", "zIndex"] }, host: { properties: { "class.showLoader": "this.showLoader", "class.transparent": "this.transparent", "class.spinner": "this.spinner", "class.ellipsis": "this.ellipsis" } }, usesOnChanges: true, ngImport: i0, template: "<div class=\"loader-container\" *ngIf=\"type === LoaderType.Spinner\">\n\t<div class=\"lds-css\">\n\t\t<div class=\"lds-eclipse\">\n\t\t <div></div>\n\t\t</div>\n\t</div>\n</div>\n<div class=\"loader-container\" *ngIf=\"type === LoaderType.Ellipsis\">\n\t<div class=\"lds-ellipsis\">\n\t\t<div class=\"dot\"></div>\n\t\t<div class=\"dot\"></div>\n\t\t<div class=\"dot\"></div>\n\t\t<div class=\"dot\"></div>\n\t</div>\n</div>\n<div class=\"style-container\" [innerHtml]=\"styles\"></div>", styles: [":host.spinner{position:fixed;display:flex;justify-content:center;align-items:center;z-index:0;opacity:0;pointer-events:none;top:0;left:0;right:0;bottom:0}:host.spinner.showLoader{pointer-events:auto;opacity:1}:host.spinner.showLoader.transparent{opacity:0}:host.spinner.small{position:absolute}:host.spinner.small.showLoader{background:none}:host.spinner .lds-eclipse{position:relative;display:flex;justify-content:center;align-items:center}:host.spinner .lds-eclipse div:not(.percentage){position:absolute;border-radius:50%}:host.spinner .lds-eclipse div.percentage{font-size:1.25rem;background:rgba(0,0,0,.8);padding:.5rem;border-radius:2rem;width:4rem;height:4rem;display:flex;justify-content:center;align-items:center;box-sizing:border-box}:host.ellipsis{position:fixed;display:flex;justify-content:center;align-items:center;z-index:0;opacity:0;pointer-events:none;top:0;left:0;right:0;bottom:0}:host.ellipsis.showLoader{pointer-events:auto;opacity:1}:host.ellipsis.showLoader.transparent{opacity:0}:host.ellipsis .lds-ellipsis{display:block;position:relative;margin:0 auto}:host.ellipsis .lds-ellipsis div{position:absolute;border-radius:50%;animation-timing-function:cubic-bezier(0,1,1,0)}:host.ellipsis .lds-ellipsis div:nth-child(1){animation:lds-ellipsis1 .6s infinite}:host.ellipsis .lds-ellipsis div:nth-child(4){animation:lds-ellipsis3 .6s infinite}@keyframes lds-eclipse{0%{transform:rotate(0)}50%{transform:rotate(180deg)}to{transform:rotate(360deg)}}@keyframes lds-ellipsis1{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes lds-ellipsis3{0%{transform:scale(1)}to{transform:scale(0)}}\n"], directives: [{ type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: LoaderComponent, decorators: [{
type: Component,
args: [{ selector: 'loader', template: "<div class=\"loader-container\" *ngIf=\"type === LoaderType.Spinner\">\n\t<div class=\"lds-css\">\n\t\t<div class=\"lds-eclipse\">\n\t\t <div></div>\n\t\t</div>\n\t</div>\n</div>\n<div class=\"loader-container\" *ngIf=\"type === LoaderType.Ellipsis\">\n\t<div class=\"lds-ellipsis\">\n\t\t<div class=\"dot\"></div>\n\t\t<div class=\"dot\"></div>\n\t\t<div class=\"dot\"></div>\n\t\t<div class=\"dot\"></div>\n\t</div>\n</div>\n<div class=\"style-container\" [innerHtml]=\"styles\"></div>", styles: [":host.spinner{position:fixed;display:flex;justify-content:center;align-items:center;z-index:0;opacity:0;pointer-events:none;top:0;left:0;right:0;bottom:0}:host.spinner.showLoader{pointer-events:auto;opacity:1}:host.spinner.showLoader.transparent{opacity:0}:host.spinner.small{position:absolute}:host.spinner.small.showLoader{background:none}:host.spinner .lds-eclipse{position:relative;display:flex;justify-content:center;align-items:center}:host.spinner .lds-eclipse div:not(.percentage){position:absolute;border-radius:50%}:host.spinner .lds-eclipse div.percentage{font-size:1.25rem;background:rgba(0,0,0,.8);padding:.5rem;border-radius:2rem;width:4rem;height:4rem;display:flex;justify-content:center;align-items:center;box-sizing:border-box}:host.ellipsis{position:fixed;display:flex;justify-content:center;align-items:center;z-index:0;opacity:0;pointer-events:none;top:0;left:0;right:0;bottom:0}:host.ellipsis.showLoader{pointer-events:auto;opacity:1}:host.ellipsis.showLoader.transparent{opacity:0}:host.ellipsis .lds-ellipsis{display:block;position:relative;margin:0 auto}:host.ellipsis .lds-ellipsis div{position:absolute;border-radius:50%;animation-timing-function:cubic-bezier(0,1,1,0)}:host.ellipsis .lds-ellipsis div:nth-child(1){animation:lds-ellipsis1 .6s infinite}:host.ellipsis .lds-ellipsis div:nth-child(4){animation:lds-ellipsis3 .6s infinite}@keyframes lds-eclipse{0%{transform:rotate(0)}50%{transform:rotate(180deg)}to{transform:rotate(360deg)}}@keyframes lds-ellipsis1{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes lds-ellipsis3{0%{transform:scale(1)}to{transform:scale(0)}}\n"] }]
}], ctorParameters: function () { return [{ type: i1.LoaderService }, { type: i2.DomSanitizer }]; }, propDecorators: { showLoader: [{
type: HostBinding,
args: ['class.showLoader']
}], transparent: [{
type: HostBinding,
args: ['class.transparent']
}], spinner: [{
type: HostBinding,
args: ['class.spinner']
}], ellipsis: [{
type: HostBinding,
args: ['class.ellipsis']
}], speed: [{
type: Input,
args: ["transition-speed"]
}], animation: [{
type: Input,
args: ["animation-duration"]
}], size: [{
type: Input,
args: ["size"]
}], color: [{
type: Input,
args: ["color"]
}], background: [{
type: Input,
args: ["background"]
}], zIndex: [{
type: Input,
args: ["z-index"]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvbG9hZGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uL3NyYy9saWIvbG9hZGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFtRCxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHL0csT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDOzs7OztBQU85QyxNQUFNLE9BQU8sZUFBZTtJQW1CMUIsWUFBb0IsT0FBc0IsRUFBVSxTQUF1QjtRQUF2RCxZQUFPLEdBQVAsT0FBTyxDQUFlO1FBQVUsY0FBUyxHQUFULFNBQVMsQ0FBYztRQWpCMUMsZUFBVSxHQUFZLEtBQUssQ0FBQztRQUMzQixnQkFBVyxHQUFZLElBQUksQ0FBQztRQUNoQyxZQUFPLEdBQVksSUFBSSxDQUFDO1FBQ3ZCLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFDOUIsVUFBSyxHQUFXLElBQUksQ0FBQztRQUNuQixjQUFTLEdBQVcsSUFBSSxDQUFDO1FBQ3ZDLFNBQUksR0FBVyxHQUFHLENBQUM7UUFDbEIsVUFBSyxHQUFXLFNBQVMsQ0FBQztRQUNyQixlQUFVLEdBQVcsd0JBQXdCLENBQUM7UUFDakQsV0FBTSxHQUFXLEtBQUssQ0FBQztRQUVsQyxTQUFJLEdBQWUsVUFBVSxDQUFDLE9BQU8sQ0FBQztRQUN0QyxlQUFVLEdBQUcsVUFBVSxDQUFDO1FBR3ZCLFlBQU8sR0FBVyxDQUFDLENBQUM7UUFpSHBCLGVBQVUsR0FBRyxHQUFHLEVBQUU7WUFDeEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUN2QyxJQUFJLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLElBQUksVUFBVSxDQUFDLE9BQU8sQ0FBQztnQkFDL0MsSUFB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QW9CO2dCQUNaLElBQUk7c0JBQWxCLEtBQUs7dUJBQUMsTUFBTTtnQkFDRyxLQUFLO3NCQUFwQixLQUFLO3VCQUFDLE9BQU87Z0JBQ08sVUFBVTtzQkFBOUIsS0FBSzt1QkFBQyxZQUFZO2dCQUNELE1BQU07c0JBQXZCLEtBQUs7dUJBQUMsU0FBUyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBIb3N0QmluZGluZyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRG9tU2FuaXRpemVyLCBTYWZlSHRtbCB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHsgTG9hZGVyU2VydmljZSB9IGZyb20gXCIuL2xvYWRlci5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBMb2FkZXJUeXBlIH0gZnJvbSBcIi4vbG9hZGVyLmNsYXNzZXNcIjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbG9hZGVyJyxcbiAgdGVtcGxhdGVVcmw6ICdsb2FkZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnbG9hZGVyLmNvbXBvbmVudC5sZXNzJ11cbn0pXG5leHBvcnQgY2xhc3MgTG9hZGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkNoYW5nZXMgIHtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLnNob3dMb2FkZXInKSBzaG93TG9hZGVyOiBib29sZWFuID0gZmFsc2U7XG4gIEBIb3N0QmluZGluZygnY2xhc3MudHJhbnNwYXJlbnQnKSB0cmFuc3BhcmVudDogYm9vbGVhbiA9IHRydWU7XG4gIEBIb3N0QmluZGluZygnY2xhc3Muc3Bpbm5lcicpIHNwaW5uZXI6IGJvb2xlYW4gPSB0cnVlO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmVsbGlwc2lzJykgZWxsaXBzaXM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KFwidHJhbnNpdGlvbi1zcGVlZFwiKSBzcGVlZDogbnVtYmVyID0gMTAwMDtcbiAgQElucHV0KFwiYW5pbWF0aW9uLWR1cmF0aW9uXCIpIGFuaW1hdGlvbjogbnVtYmVyID0gMTAwMDtcbiAgQElucHV0KFwic2l6ZVwiKSBzaXplOiBudW1iZXIgPSAyMDA7XG4gIEBJbnB1dChcImNvbG9yXCIpIGNvbG9yOiBzdHJpbmcgPSBcIiMwMDFGMzlcIjtcbiAgQElucHV0KFwiYmFja2dyb3VuZFwiKSBiYWNrZ3JvdW5kOiBzdHJpbmcgPSBcInJnYmEoMjU1LDI1NSwyNTUsMC4yNSlcIjtcbiAgQElucHV0KFwiei1pbmRleFwiKSB6SW5kZXg6IG51bWJlciA9IDEwMDAwO1xuXG4gIHB1YmxpYyB0eXBlOiBMb2FkZXJUeXBlID0gTG9hZGVyVHlwZS5TcGlubmVyO1xuICBwdWJsaWMgTG9hZGVyVHlwZSA9IExvYWRlclR5cGU7XG4gIHB1YmxpYyBzdHlsZXMhOiBTYWZlSHRtbDtcblxuICBwcml2YXRlIHRpbWVvdXQ6IG51bWJlciA9IDA7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBzZXJ2aWNlOiBMb2FkZXJTZXJ2aWNlLCBwcml2YXRlIHNhbml0aXplcjogRG9tU2FuaXRpemVyKSB7fTtcblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmJ1aWxkU3R5bGVzKCk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgd2luZG93LnNldFRpbWVvdXQodGhpcy5pbml0aWFsaXplKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICB0aGlzLmJ1aWxkU3R5bGVzKCk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkU3R5bGVzKCkge1xuICAgIGNvbnN0IGVjbGlwc2VTaXplID0gdGhpcy5zaXplICogMC44O1xuICAgIGNvbnN0IHRyYW5zZm9ybVNpemUgPSAoZWNsaXBzZVNpemUgLyAyKSArIDI7XG4gICAgY29uc3QgcG9zaXRpb24gPSAodGhpcy5zaXplIC0gZWNsaXBzZVNpemUpIC8gMjtcbiAgICBjb25zdCB0cmFuc2xhdGUxID0gLTAuNSAqIHRoaXMuc2l6ZTtcbiAgICBjb25zdCB0cmFuc2xhdGUyID0gMC41ICogdGhpcy5zaXplO1xuXG4gICAgY29uc3QgZG90U2l6ZSA9IHRoaXMuc2l6ZTtcbiAgICBjb25zdCBkb3RCb3hTaXplID0gZG90U2l6ZSAqIDY7XG4gICAgY29uc3QgZG90VG9wID0gKGRvdEJveFNpemUgLSBkb3RTaXplKSAvIDI7XG4gICAgY29uc3QgZG90R2FwID0gKGRvdEJveFNpemUgLSAoMyAqIGRvdFNpemUpKSAvIDQ7XG4gICAgY29uc3QgZG90RWRnZTIgPSAoMiAqIGRvdEdhcCkgKyBkb3RTaXplO1xuICAgIGNvbnN0IGRvdEVkZ2UzID0gKDMgKiBkb3RHYXApICsgKDIgKiBkb3RTaXplKTtcbiAgICBjb25zdCB0cmFuc2Zvcm0gPSBkb3RHYXAgKyBkb3RTaXplO1xuXG4gICAgY29uc3Qgc3R5bGVzID0gYDxzdHlsZT5cbiAgICAgIEBrZXlmcmFtZXMgbGRzLWVsbGlwc2lzMiB7XG4gICAgICAgIDAlIHtcbiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwLCAwKTtcbiAgICAgICAgfVxuICAgICAgICAxMDAlIHtcbiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgke3RyYW5zZm9ybX1weCwgMCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbG9hZGVyLnNwaW5uZXIsXG4gICAgICBsb2FkZXIuc3Bpbm5lci5zaG93TG9hZGVyLFxuICAgICAgbG9hZGVyLnNwaW5uZXIuaGlkZUxvYWRlcixcbiAgICAgIGxvYWRlci5lbGxpcHNpcyxcbiAgICAgIGxvYWRlci5lbGxpcHNpcy5zaG93TG9hZGVyLFxuICAgICAgbG9hZGVyLmVsbGlwc2lzLmhpZGVMb2FkZXIge1xuICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5ICR7dGhpcy5zcGVlZCAvIDEwMDB9cztcbiAgICAgIH1cblxuICAgICAgbG9hZGVyLnNwaW5uZXIuc2hvd0xvYWRlcixcbiAgICAgIGxvYWRlci5lbGxpcHNpcy5zaG93TG9hZGVyIHtcbiAgICAgICAgYmFja2dyb3VuZDogJHt0aGlzLmJhY2tncm91bmR9O1xuICAgICAgICB6LWluZGV4OiAke3RoaXMuekluZGV4fTtcbiAgICAgIH1cblxuICAgICAgbG9hZGVyLnNwaW5uZXIgLmxkcy1lY2xpcHNlIGRpdjpub3QoLnBlcmNlbnRhZ2UpIHtcbiAgICAgICAgYm94LXNoYWRvdzogMCA0cHggMCAwICR7dGhpcy5jb2xvcn07XG4gICAgICAgIHdpZHRoOiAke2VjbGlwc2VTaXplfXB4O1xuICAgICAgICBoZWlnaHQ6ICR7ZWNsaXBzZVNpemV9cHg7XG4gICAgICAgIHRvcDogJHtwb3NpdGlvbn1weDtcbiAgICAgICAgbGVmdDogJHtwb3NpdGlvbn1weDtcbiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiAke2VjbGlwc2VTaXplLzJ9cHggJHt0cmFuc2Zvcm1TaXplfXB4O1xuICAgICAgICB0cmFuc2Zvcm0tb3JpZ2luOiAke2VjbGlwc2VTaXplLzJ9cHggJHt0cmFuc2Zvcm1TaXplfXB4O1xuICAgICAgICAtd2Via2l0LWFuaW1hdGlvbjogbGRzLWVjbGlwc2UgJHt0aGlzLmFuaW1hdGlvbi8xMDAwfXMgbGluZWFyIGluZmluaXRlO1xuICAgICAgICBhbmltYXRpb246IGxkcy1lY2xpcHNlICR7dGhpcy5hbmltYXRpb24vMTAwMH1zIGxpbmVhciBpbmZpbml0ZTtcbiAgICAgIH1cblxuICAgICAgbG9hZGVyLnNwaW5uZXIgLmxkcy1lY2xpcHNlIHtcbiAgICAgICAgd2lkdGg6ICR7dGhpcy5zaXplfXB4O1xuICAgICAgICBoZWlnaHQ6ICR7dGhpcy5zaXplfXB4O1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKCR7dHJhbnNsYXRlMX1weCwgJHt0cmFuc2xhdGUxfXB4KSBzY2FsZSgxKSB0cmFuc2xhdGUoJHt0cmFuc2xhdGUyfXB4LCAke3RyYW5zbGF0ZTJ9cHgpO1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgke3RyYW5zbGF0ZTF9cHgsICR7dHJhbnNsYXRlMX1weCkgc2NhbGUoMSkgdHJhbnNsYXRlKCR7dHJhbnNsYXRlMn1weCwgJHt0cmFuc2xhdGUyfXB4KTtcbiAgICAgIH1cblxuICAgICAgbG9hZGVyLmVsbGlwc2lzIC5sZHMtZWxsaXBzaXMge1xuICAgICAgICB3aWR0aDogJHtkb3RCb3hTaXplfXB4O1xuICAgICAgICBoZWlnaHQ6ICR7ZG90Qm94U2l6ZX1weDtcbiAgICAgIH1cblxuICAgICAgbG9hZGVyLmVsbGlwc2lzIC5sZHMtZWxsaXBzaXMgZGl2IHtcbiAgICAgICAgdG9wOiAke2RvdFRvcH1weDtcbiAgICAgICAgd2lkdGg6ICR7ZG90U2l6ZX1weDtcbiAgICAgICAgaGVpZ2h0OiAke2RvdFNpemV9cHg7XG4gICAgICAgIGJhY2tncm91bmQ6ICR7dGhpcy5jb2xvcn07XG4gICAgICB9XG5cbiAgICAgIGxvYWRlci5lbGxpcHNpcyAubGRzLWVsbGlwc2lzIGRpdjpudGgtY2hpbGQoMSkge1xuICAgICAgICBsZWZ0OiAke2RvdEdhcH1weDtcbiAgICAgICAgYW5pbWF0aW9uLWR1cmF0aW9uOiAke3RoaXMuYW5pbWF0aW9uLzEwMDB9cyAhaW1wb3J0YW50O1xuICAgICAgfVxuICAgICAgXG4gICAgICBsb2FkZXIuZWxsaXBzaXMgIC5sZHMtZWxsaXBzaXMgZGl2Om50aC1jaGlsZCgyKSB7XG4gICAgICAgIGxlZnQ6ICR7ZG90R2FwfXB4O1xuICAgICAgICBhbmltYXRpb246IGxkcy1lbGxpcHNpczIgJHt0aGlzLmFuaW1hdGlvbi8xMDAwfXMgaW5maW5pdGUgIWltcG9ydGFudDtcbiAgICAgIH1cblxuICAgICAgbG9hZGVyLmVsbGlwc2lzIC5sZHMtZWxsaXBzaXMgZGl2Om50aC1jaGlsZCgzKSB7XG4gICAgICAgIGxlZnQ6ICR7ZG90RWRnZTJ9cHg7XG4gICAgICAgIGFuaW1hdGlvbjogbGRzLWVsbGlwc2lzMiAke3RoaXMuYW5pbWF0aW9uLzEwMDB9cyBpbmZpbml0ZSAhaW1wb3J0YW50O1xuICAgICAgfVxuXG4gICAgICBsb2FkZXIuZWxsaXBzaXMgLmxkcy1lbGxpcHNpcyBkaXY6bnRoLWNoaWxkKDQpIHtcbiAgICAgICAgbGVmdDogJHtkb3RFZGdlM31weDtcbiAgICAgICAgYW5pbWF0aW9uLWR1cmF0aW9uOiAke3RoaXMuYW5pbWF0aW9uLzEwMDB9cyAhaW1wb3J0YW50O1xuICAgICAgfVxuXG4gICAgICBcbiAgICA8L3N0eWxlPmA7XG5cbiAgICB0aGlzLnN0eWxlcyA9IHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RIdG1sKHN0eWxlcyk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemUgPSAoKSA9PiB7XG4gICAgdGhpcy5zZXJ2aWNlLmxvYWRlciQuc3Vic2NyaWJlKHJlcXVlc3QgPT4ge1xuICAgICAgdGhpcy50eXBlID0gcmVxdWVzdC50eXBlID8/IExvYWRlclR5cGUuU3Bpbm5lcjtcbiAgICAgIHRoaXMuZWxsaXBzaXMgPSB0aGlzLnR5cGUgPT09IExvYWRlclR5cGUuRWxsaXBzaXM7XG4gICAgICB0aGlzLnNwaW5uZXIgPSB0aGlzLnR5cGUgPT09IExvYWRlclR5cGUuU3Bpbm5lcjtcbiAgICAgIHRoaXMucmVuZGVyKHJlcXVlc3QucmVuZGVyKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyKHNob3c6IGJvb2xlYW4pIHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0KTtcbiAgICBpZihzaG93KSB0aGlzLnNob3coKTtcbiAgICBlbHNlIHRoaXMuaGlkZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG93KCkge1xuICAgIHRoaXMuc2hvd0xvYWRlciA9IHRydWU7XG4gICAgdGhpcy50aW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4gdGhpcy50cmFuc3BhcmVudCA9IGZhbHNlKTtcbiAgfVxuXG4gIHByaXZhdGUgaGlkZSgpIHtcbiAgICB0aGlzLnRyYW5zcGFyZW50ID0gdHJ1ZTtcbiAgICB0aGlzLnRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB0aGlzLnNob3dMb2FkZXIgPSBmYWxzZSwgdGhpcy5zcGVlZCk7XG4gIH1cbn1cblxuIiwiPGRpdiBjbGFzcz1cImxvYWRlci1jb250YWluZXJcIiAqbmdJZj1cInR5cGUgPT09IExvYWRlclR5cGUuU3Bpbm5lclwiPlxuXHQ8ZGl2IGNsYXNzPVwibGRzLWNzc1wiPlxuXHRcdDxkaXYgY2xhc3M9XCJsZHMtZWNsaXBzZVwiPlxuXHRcdCAgPGRpdj48L2Rpdj5cblx0XHQ8L2Rpdj5cblx0PC9kaXY+XG48L2Rpdj5cbjxkaXYgY2xhc3M9XCJsb2FkZXItY29udGFpbmVyXCIgKm5nSWY9XCJ0eXBlID09PSBMb2FkZXJUeXBlLkVsbGlwc2lzXCI+XG5cdDxkaXYgY2xhc3M9XCJsZHMtZWxsaXBzaXNcIj5cblx0XHQ8ZGl2IGNsYXNzPVwiZG90XCI+PC9kaXY+XG5cdFx0PGRpdiBjbGFzcz1cImRvdFwiPjwvZGl2PlxuXHRcdDxkaXYgY2xhc3M9XCJkb3RcIj48L2Rpdj5cblx0XHQ8ZGl2IGNsYXNzPVwiZG90XCI+PC9kaXY+XG5cdDwvZGl2PlxuPC9kaXY+XG48ZGl2IGNsYXNzPVwic3R5bGUtY29udGFpbmVyXCIgW2lubmVySHRtbF09XCJzdHlsZXNcIj48L2Rpdj4iXX0=