ngx-acuw
Version:
Angular components using WEBGL (threejs)
95 lines • 20.8 kB
JavaScript
import { Component, HostListener, ViewChild } from '@angular/core';
import { ImageTransitionComponent } from '../image-transition/image-transition.component';
import * as i0 from "@angular/core";
import * as i1 from "../image-transition/image-transition.component";
import * as i2 from "@angular/common";
export class LightboxOverlayComponent {
constructor(changeRef) {
this.changeRef = changeRef;
this.imageUrls = new Array();
this.displacementImageUrl = '';
this.forceFullscreen = false;
this.forceShowNavButtons = false;
this.imageSize = 'cover';
this.autoPlay = false;
this.autoPlayInterval = 5000;
this.transitionDuration = 1000;
this.transitionType = 'split';
this.sizeX = 50.0;
this.sizeY = 50.0;
this.width = 0.5;
this.intensity = 40.0;
this.startIndex = 0;
this.currentImageIndex = 1;
this.showPerformanceMonitor = false;
this.swipeCoord = new Array();
this.swipeTime = 0;
}
ngOnInit() {
}
keyEvent(event) {
if (event.key === 'ArrowRight') {
this.imageTransition.next();
}
if (event.key === 'ArrowLeft') {
this.imageTransition.prev();
}
if (event.key === 'Escape') {
this.close();
}
}
/**
* Close the lightbox
*/
close() {
this.overlayRef?.detach();
}
/**
* method to set the index counter
* @param index index of the image
*/
imageIndexChange(index) {
this.currentImageIndex = index + 1;
this.changeRef.detectChanges();
}
/**
* Listen to touche events for gestures (mobile)
* @param e touch event
* @param when indicator if 'start' or 'end'
*/
swipe(e, when) {
const coord = [e.changedTouches[0].clientX, e.changedTouches[0].clientY];
const time = new Date().getTime();
if (when === 'start') {
this.swipeCoord = coord;
this.swipeTime = time;
}
else if (when === 'end') {
const direction = [coord[0] - this.swipeCoord[0], coord[1] - this.swipeCoord[1]];
const duration = time - this.swipeTime;
if (duration < 1000 && Math.abs(direction[0]) > 30 // Long enough
&& Math.abs(direction[0]) > Math.abs(direction[1] * 3)) { // Horizontal enough
const swipe = direction[0] < 0 ? 'next' : 'previous';
if (swipe === 'next') {
this.imageTransition.next();
}
else if (swipe === 'previous') {
this.imageTransition.prev();
}
}
}
}
}
LightboxOverlayComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: LightboxOverlayComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
LightboxOverlayComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.1", type: LightboxOverlayComponent, selector: "lib-lightbox-overlay", host: { listeners: { "window:keyup": "keyEvent($event)" } }, viewQueries: [{ propertyName: "imageTransition", first: true, predicate: ImageTransitionComponent, descendants: true }], ngImport: i0, template: "<div [ngClass]=\"{'full-container': forceFullscreen === true, 'auto-container': forceFullscreen === false }\">\r\n <div class=\"index-indicator\">\r\n <span>{{ currentImageIndex }}</span>\r\n <span>/</span>\r\n <span>{{ imageUrls.length }}</span>\r\n </div>\r\n <svg class=\"ligthbox-button close-button\" (click)=\"close()\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"white\">\r\n <path d=\"M0 0h24v24H0z\" fill=\"none\" />\r\n <path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\" />\r\n </svg>\r\n\r\n <svg [ngClass]=\"{'auto-visibility': forceShowNavButtons === false}\" \r\n class=\"ligthbox-button prev-button\" (click)=\"imageTransition.prev()\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"white\">\r\n <path d=\"M0 0h24v24H0z\" fill=\"none\" />\r\n <path d=\"M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z\" />\r\n </svg>\r\n\r\n <svg [ngClass]=\"{'auto-visibility': forceShowNavButtons === false}\" \r\n class=\"ligthbox-button next-button\" (click)=\"imageTransition.next()\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"white\">\r\n <path d=\"M0 0h24v24H0z\" fill=\"none\" />\r\n <path d=\"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\" />\r\n </svg>\r\n <lib-image-transition #imageTransition [imageUrls]=\"imageUrls\" [startIndex]=\"startIndex\" (imageIndexChange)=\"imageIndexChange($event)\"\r\n [imageSize]=\"imageSize\" [autoPlay]=\"autoPlay\" [autoPlayInterval]=\"autoPlayInterval\" [transitionDuration]=\"transitionDuration\"\r\n [transitionType]=\"transitionType\" [sizeX]=\"sizeX\" [sizeY]=\"sizeY\" [width]=\"width\" [intensity]=\"intensity\"\r\n (touchstart)=\"swipe($event, 'start')\" (touchend)=\"swipe($event, 'end')\"\r\n [displacementImageUrl]=\"displacementImageUrl\" [showPerformanceMonitor]=\"showPerformanceMonitor\">\r\n </lib-image-transition>\r\n</div>", styles: [".auto-container{position:relative;width:1100px;height:800px;max-width:90vw;max-height:90vh;background-color:#000;box-shadow:0 0 15px 10px #00000080}.full-container{position:relative;width:100vw;height:100vh;max-width:100vw;max-height:100vh;background-color:#000;box-shadow:0 0 15px 10px #00000080}.index-indicator{position:absolute;z-index:1;color:#fff;background-color:#0006;border-radius:0 0 5px;padding:8px}.ligthbox-button{position:absolute;z-index:1;cursor:pointer;background-color:#0006;width:36px;height:36px}.ligthbox-button:hover{fill:#ffffff80}.close-button{top:0;right:0;border-radius:0 0 0 5px}.prev-button{top:calc(50% - 18px);left:0;border-radius:0 5px 5px 0}.next-button{top:calc(50% - 18px);right:0;border-radius:5px 0 0 5px}@media (max-width: 600px){.auto-container{width:100vw;height:100vh;max-width:100vw;max-height:100vh}.auto-visibility{visibility:collapse}}lib-image-transition{touch-action:none}\n"], components: [{ type: i1.ImageTransitionComponent, selector: "lib-image-transition", inputs: ["imageUrls", "displacementImageUrl", "imageSize", "autoPlay", "autoPlayInterval", "transitionDuration", "transitionType", "sizeX", "sizeY", "width", "intensity", "animationEnabled", "startIndex", "showPerformanceMonitor"], outputs: ["imageIndexChange"] }], directives: [{ type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: LightboxOverlayComponent, decorators: [{
type: Component,
args: [{ selector: 'lib-lightbox-overlay', template: "<div [ngClass]=\"{'full-container': forceFullscreen === true, 'auto-container': forceFullscreen === false }\">\r\n <div class=\"index-indicator\">\r\n <span>{{ currentImageIndex }}</span>\r\n <span>/</span>\r\n <span>{{ imageUrls.length }}</span>\r\n </div>\r\n <svg class=\"ligthbox-button close-button\" (click)=\"close()\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"white\">\r\n <path d=\"M0 0h24v24H0z\" fill=\"none\" />\r\n <path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\" />\r\n </svg>\r\n\r\n <svg [ngClass]=\"{'auto-visibility': forceShowNavButtons === false}\" \r\n class=\"ligthbox-button prev-button\" (click)=\"imageTransition.prev()\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"white\">\r\n <path d=\"M0 0h24v24H0z\" fill=\"none\" />\r\n <path d=\"M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z\" />\r\n </svg>\r\n\r\n <svg [ngClass]=\"{'auto-visibility': forceShowNavButtons === false}\" \r\n class=\"ligthbox-button next-button\" (click)=\"imageTransition.next()\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"white\">\r\n <path d=\"M0 0h24v24H0z\" fill=\"none\" />\r\n <path d=\"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\" />\r\n </svg>\r\n <lib-image-transition #imageTransition [imageUrls]=\"imageUrls\" [startIndex]=\"startIndex\" (imageIndexChange)=\"imageIndexChange($event)\"\r\n [imageSize]=\"imageSize\" [autoPlay]=\"autoPlay\" [autoPlayInterval]=\"autoPlayInterval\" [transitionDuration]=\"transitionDuration\"\r\n [transitionType]=\"transitionType\" [sizeX]=\"sizeX\" [sizeY]=\"sizeY\" [width]=\"width\" [intensity]=\"intensity\"\r\n (touchstart)=\"swipe($event, 'start')\" (touchend)=\"swipe($event, 'end')\"\r\n [displacementImageUrl]=\"displacementImageUrl\" [showPerformanceMonitor]=\"showPerformanceMonitor\">\r\n </lib-image-transition>\r\n</div>", styles: [".auto-container{position:relative;width:1100px;height:800px;max-width:90vw;max-height:90vh;background-color:#000;box-shadow:0 0 15px 10px #00000080}.full-container{position:relative;width:100vw;height:100vh;max-width:100vw;max-height:100vh;background-color:#000;box-shadow:0 0 15px 10px #00000080}.index-indicator{position:absolute;z-index:1;color:#fff;background-color:#0006;border-radius:0 0 5px;padding:8px}.ligthbox-button{position:absolute;z-index:1;cursor:pointer;background-color:#0006;width:36px;height:36px}.ligthbox-button:hover{fill:#ffffff80}.close-button{top:0;right:0;border-radius:0 0 0 5px}.prev-button{top:calc(50% - 18px);left:0;border-radius:0 5px 5px 0}.next-button{top:calc(50% - 18px);right:0;border-radius:5px 0 0 5px}@media (max-width: 600px){.auto-container{width:100vw;height:100vh;max-width:100vw;max-height:100vh}.auto-visibility{visibility:collapse}}lib-image-transition{touch-action:none}\n"] }]
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { imageTransition: [{
type: ViewChild,
args: [ImageTransitionComponent]
}], keyEvent: [{
type: HostListener,
args: ['window:keyup', ['$event']]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlnaHRib3gtb3ZlcmxheS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtYWN1dy9zcmMvbGliL2xpZ2h0Ym94L2xpZ2h0Ym94LW92ZXJsYXkuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWFjdXcvc3JjL2xpYi9saWdodGJveC9saWdodGJveC1vdmVybGF5LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBcUIsU0FBUyxFQUFFLFlBQVksRUFBVSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDOUYsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sZ0RBQWdELENBQUM7Ozs7QUFPMUYsTUFBTSxPQUFPLHdCQUF3QjtJQXlCbkMsWUFBb0IsU0FBNEI7UUFBNUIsY0FBUyxHQUFULFNBQVMsQ0FBbUI7UUFwQmhELGNBQVMsR0FBRyxJQUFJLEtBQUssRUFBVSxDQUFDO1FBQ2hDLHlCQUFvQixHQUFHLEVBQUUsQ0FBQztRQUMxQixvQkFBZSxHQUFHLEtBQUssQ0FBQztRQUN4Qix3QkFBbUIsR0FBRyxLQUFLLENBQUM7UUFDNUIsY0FBUyxHQUFHLE9BQU8sQ0FBQztRQUNwQixhQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ2pCLHFCQUFnQixHQUFHLElBQUksQ0FBQztRQUN4Qix1QkFBa0IsR0FBRyxJQUFJLENBQUM7UUFDMUIsbUJBQWMsR0FBRyxPQUFPLENBQUM7UUFDekIsVUFBSyxHQUFHLElBQUksQ0FBQztRQUNiLFVBQUssR0FBRyxJQUFJLENBQUM7UUFDYixVQUFLLEdBQUcsR0FBRyxDQUFDO1FBQ1osY0FBUyxHQUFHLElBQUksQ0FBQztRQUNqQixlQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQ2Ysc0JBQWlCLEdBQUcsQ0FBQyxDQUFDO1FBQ3RCLDJCQUFzQixHQUFHLEtBQUssQ0FBQztRQUUvQixlQUFVLEdBQUcs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RSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE92ZXJsYXlSZWYgfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XHJcbmltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEhvc3RMaXN0ZW5lciwgT25Jbml0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgSW1hZ2VUcmFuc2l0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi4vaW1hZ2UtdHJhbnNpdGlvbi9pbWFnZS10cmFuc2l0aW9uLmNvbXBvbmVudCc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi1saWdodGJveC1vdmVybGF5JyxcclxuICB0ZW1wbGF0ZVVybDogJy4vbGlnaHRib3gtb3ZlcmxheS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vbGlnaHRib3gtb3ZlcmxheS5jb21wb25lbnQuY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIExpZ2h0Ym94T3ZlcmxheUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcblxyXG4gIEBWaWV3Q2hpbGQoSW1hZ2VUcmFuc2l0aW9uQ29tcG9uZW50KSBpbWFnZVRyYW5zaXRpb24hOiBJbWFnZVRyYW5zaXRpb25Db21wb25lbnQ7XHJcblxyXG4gIG92ZXJsYXlSZWYhOiBPdmVybGF5UmVmO1xyXG4gIGltYWdlVXJscyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XHJcbiAgZGlzcGxhY2VtZW50SW1hZ2VVcmwgPSAnJztcclxuICBmb3JjZUZ1bGxzY3JlZW4gPSBmYWxzZTtcclxuICBmb3JjZVNob3dOYXZCdXR0b25zID0gZmFsc2U7XHJcbiAgaW1hZ2VTaXplID0gJ2NvdmVyJztcclxuICBhdXRvUGxheSA9IGZhbHNlO1xyXG4gIGF1dG9QbGF5SW50ZXJ2YWwgPSA1MDAwO1xyXG4gIHRyYW5zaXRpb25EdXJhdGlvbiA9IDEwMDA7XHJcbiAgdHJhbnNpdGlvblR5cGUgPSAnc3BsaXQnO1xyXG4gIHNpemVYID0gNTAuMDtcclxuICBzaXplWSA9IDUwLjA7XHJcbiAgd2lkdGggPSAwLjU7XHJcbiAgaW50ZW5zaXR5ID0gNDAuMDtcclxuICBzdGFydEluZGV4ID0gMDtcclxuICBjdXJyZW50SW1hZ2VJbmRleCA9IDE7XHJcbiAgc2hvd1BlcmZvcm1hbmNlTW9uaXRvciA9IGZhbHNlO1xyXG5cclxuICBzd2lwZUNvb3JkID0gbmV3IEFycmF5PG51bWJlcj4oKTtcclxuICBzd2lwZVRpbWUgPSAwO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNoYW5nZVJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OmtleXVwJywgWyckZXZlbnQnXSlcclxuICBrZXlFdmVudChldmVudDogS2V5Ym9hcmRFdmVudCkge1xyXG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93UmlnaHQnKSB7XHJcbiAgICAgIHRoaXMuaW1hZ2VUcmFuc2l0aW9uLm5leHQoKTtcclxuICAgIH1cclxuICAgIGlmIChldmVudC5rZXkgPT09ICdBcnJvd0xlZnQnKXtcclxuICAgICAgdGhpcy5pbWFnZVRyYW5zaXRpb24ucHJldigpO1xyXG4gICAgfVxyXG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VzY2FwZScpe1xyXG4gICAgICB0aGlzLmNsb3NlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbG9zZSB0aGUgbGlnaHRib3hcclxuICAgKi9cclxuICBjbG9zZSgpIHtcclxuICAgIHRoaXMub3ZlcmxheVJlZj8uZGV0YWNoKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBtZXRob2QgdG8gc2V0IHRoZSBpbmRleCBjb3VudGVyXHJcbiAgICogQHBhcmFtIGluZGV4IGluZGV4IG9mIHRoZSBpbWFnZVxyXG4gICAqL1xyXG4gIGltYWdlSW5kZXhDaGFuZ2UoaW5kZXg6IG51bWJlcikge1xyXG4gICAgdGhpcy5jdXJyZW50SW1hZ2VJbmRleCA9IGluZGV4ICsgMTtcclxuICAgIHRoaXMuY2hhbmdlUmVmLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIExpc3RlbiB0byB0b3VjaGUgZXZlbnRzIGZvciBnZXN0dXJlcyAobW9iaWxlKVxyXG4gICAqIEBwYXJhbSBlIHRvdWNoIGV2ZW50XHJcbiAgICogQHBhcmFtIHdoZW4gaW5kaWNhdG9yIGlmICdzdGFydCcgb3IgJ2VuZCdcclxuICAgKi9cclxuICBzd2lwZShlOiBUb3VjaEV2ZW50LCB3aGVuOiBzdHJpbmcpOiB2b2lkIHtcclxuXHJcbiAgICBjb25zdCBjb29yZDogW251bWJlciwgbnVtYmVyXSA9IFtlLmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFgsIGUuY2hhbmdlZFRvdWNoZXNbMF0uY2xpZW50WV07XHJcbiAgICBjb25zdCB0aW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XHJcblxyXG4gICAgaWYgKHdoZW4gPT09ICdzdGFydCcpIHtcclxuICAgICAgdGhpcy5zd2lwZUNvb3JkID0gY29vcmQ7XHJcbiAgICAgIHRoaXMuc3dpcGVUaW1lID0gdGltZTtcclxuICAgIH0gZWxzZSBpZiAod2hlbiA9PT0gJ2VuZCcpIHtcclxuICAgICAgY29uc3QgZGlyZWN0aW9uID0gW2Nvb3JkWzBdIC0gdGhpcy5zd2lwZUNvb3JkWzBdLCBjb29yZFsxXSAtIHRoaXMuc3dpcGVDb29yZFsxXV07XHJcbiAgICAgIGNvbnN0IGR1cmF0aW9uID0gdGltZSAtIHRoaXMuc3dpcGVUaW1lO1xyXG5cclxuICAgICAgaWYgKGR1cmF0aW9uIDwgMTAwMCAmJiBNYXRoLmFicyhkaXJlY3Rpb25bMF0pID4gMzAgLy8gTG9uZyBlbm91Z2hcclxuICAgICAgICAmJiBNYXRoLmFicyhkaXJlY3Rpb25bMF0pID4gTWF0aC5hYnMoZGlyZWN0aW9uWzFdICogMykpIHsgLy8gSG9yaXpvbnRhbCBlbm91Z2hcclxuICAgICAgICBjb25zdCBzd2lwZSA9IGRpcmVjdGlvblswXSA8IDAgPyAnbmV4dCcgOiAncHJldmlvdXMnO1xyXG5cclxuICAgICAgICBpZiAoc3dpcGUgPT09ICduZXh0Jykge1xyXG4gICAgICAgICAgdGhpcy5pbWFnZVRyYW5zaXRpb24ubmV4dCgpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoc3dpcGUgPT09ICdwcmV2aW91cycpIHtcclxuICAgICAgICAgIHRoaXMuaW1hZ2VUcmFuc2l0aW9uLnByZXYoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiPGRpdiBbbmdDbGFzc109XCJ7J2Z1bGwtY29udGFpbmVyJzogZm9yY2VGdWxsc2NyZWVuID09PSB0cnVlLCAnYXV0by1jb250YWluZXInOiBmb3JjZUZ1bGxzY3JlZW4gPT09IGZhbHNlIH1cIj5cclxuICAgIDxkaXYgY2xhc3M9XCJpbmRleC1pbmRpY2F0b3JcIj5cclxuICAgICAgICA8c3Bhbj57eyBjdXJyZW50SW1hZ2VJbmRleCB9fTwvc3Bhbj5cclxuICAgICAgICA8c3Bhbj4vPC9zcGFuPlxyXG4gICAgICAgIDxzcGFuPnt7IGltYWdlVXJscy5sZW5ndGggfX08L3NwYW4+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxzdmcgY2xhc3M9XCJsaWd0aGJveC1idXR0b24gY2xvc2UtYnV0dG9uXCIgKGNsaWNrKT1cImNsb3NlKClcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJ3aGl0ZVwiPlxyXG4gICAgICAgIDxwYXRoIGQ9XCJNMCAwaDI0djI0SDB6XCIgZmlsbD1cIm5vbmVcIiAvPlxyXG4gICAgICAgIDxwYXRoIGQ9XCJNMTkgNi40MUwxNy41OSA1IDEyIDEwLjU5IDYuNDEgNSA1IDYuNDEgMTAuNTkgMTIgNSAxNy41OSA2LjQxIDE5IDEyIDEzLjQxIDE3LjU5IDE5IDE5IDE3LjU5IDEzLjQxIDEyelwiIC8+XHJcbiAgICA8L3N2Zz5cclxuXHJcbiAgICA8c3ZnIFtuZ0NsYXNzXT1cInsnYXV0by12aXNpYmlsaXR5JzogZm9yY2VTaG93TmF2QnV0dG9ucyA9PT0gZmFsc2V9XCIgXHJcbiAgICAgICAgY2xhc3M9XCJsaWd0aGJveC1idXR0b24gcHJldi1idXR0b25cIiAoY2xpY2spPVwiaW1hZ2VUcmFuc2l0aW9uLnByZXYoKVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIndoaXRlXCI+XHJcbiAgICAgICAgPHBhdGggZD1cIk0wIDBoMjR2MjRIMHpcIiBmaWxsPVwibm9uZVwiIC8+XHJcbiAgICAgICAgPHBhdGggZD1cIk0xNS40MSA3LjQxTDE0IDZsLTYgNiA2IDYgMS40MS0xLjQxTDEwLjgzIDEyelwiIC8+XHJcbiAgICA8L3N2Zz5cclxuXHJcbiAgICA8c3ZnIFtuZ0NsYXNzXT1cInsnYXV0by12aXNpYmlsaXR5JzogZm9yY2VTaG93TmF2QnV0dG9ucyA9PT0gZmFsc2V9XCIgXHJcbiAgICAgICAgY2xhc3M9XCJsaWd0aGJveC1idXR0b24gbmV4dC1idXR0b25cIiAoY2xpY2spPVwiaW1hZ2VUcmFuc2l0aW9uLm5leHQoKVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIndoaXRlXCI+XHJcbiAgICAgICAgPHBhdGggZD1cIk0wIDBoMjR2MjRIMHpcIiBmaWxsPVwibm9uZVwiIC8+XHJcbiAgICAgICAgPHBhdGggZD1cIk0xMCA2TDguNTkgNy40MSAxMy4xNyAxMmwtNC41OCA0LjU5TDEwIDE4bDYtNnpcIiAvPlxyXG4gICAgPC9zdmc+XHJcbiAgICA8bGliLWltYWdlLXRyYW5zaXRpb24gI2ltYWdlVHJhbnNpdGlvbiBbaW1hZ2VVcmxzXT1cImltYWdlVXJsc1wiIFtzdGFydEluZGV4XT1cInN0YXJ0SW5kZXhcIiAoaW1hZ2VJbmRleENoYW5nZSk9XCJpbWFnZUluZGV4Q2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgIFtpbWFnZVNpemVdPVwiaW1hZ2VTaXplXCIgW2F1dG9QbGF5XT1cImF1dG9QbGF5XCIgW2F1dG9QbGF5SW50ZXJ2YWxdPVwiYXV0b1BsYXlJbnRlcnZhbFwiIFt0cmFuc2l0aW9uRHVyYXRpb25dPVwidHJhbnNpdGlvbkR1cmF0aW9uXCJcclxuICAgICAgICBbdHJhbnNpdGlvblR5cGVdPVwidHJhbnNpdGlvblR5cGVcIiBbc2l6ZVhdPVwic2l6ZVhcIiBbc2l6ZVldPVwic2l6ZVlcIiBbd2lkdGhdPVwid2lkdGhcIiBbaW50ZW5zaXR5XT1cImludGVuc2l0eVwiXHJcbiAgICAgICAgKHRvdWNoc3RhcnQpPVwic3dpcGUoJGV2ZW50LCAnc3RhcnQnKVwiICh0b3VjaGVuZCk9XCJzd2lwZSgkZXZlbnQsICdlbmQnKVwiXHJcbiAgICAgICAgW2Rpc3BsYWNlbWVudEltYWdlVXJsXT1cImRpc3BsYWNlbWVudEltYWdlVXJsXCIgW3Nob3dQZXJmb3JtYW5jZU1vbml0b3JdPVwic2hvd1BlcmZvcm1hbmNlTW9uaXRvclwiPlxyXG4gICAgPC9saWItaW1hZ2UtdHJhbnNpdGlvbj5cclxuPC9kaXY+Il19