UNPKG

@rybos/ngx-gallery

Version:

A simple responsive native gallery component for Angular 15.

446 lines 66.7 kB
import { ChangeDetectionStrategy, Component, EventEmitter, HostListener, Input, Output } from '@angular/core';
import { NgxGalleryAnimation } from '../ngx-gallery-animation';
import { animate, state, style, transition, trigger } from '@angular/animations';
import * as i0 from "@angular/core";
import * as i1 from "@angular/platform-browser";
import * as i2 from "../ngx-gallery.service";
import * as i3 from "@angular/common";
import * as i4 from "../ngx-gallery-arrows/ngx-gallery-arrows.component";
import * as i5 from "../ngx-gallery-action/ngx-gallery-action.component";
import * as i6 from "../ngx-gallery-bullets/ngx-gallery-bullets.component";
export class NgxGalleryImageComponent {
    constructor(sanitization, changeDetectorRef, elementRef, helperService) {
        this.sanitization = sanitization;
        this.changeDetectorRef = changeDetectorRef;
        this.elementRef = elementRef;
        this.helperService = helperService;
        this.imageClick = new EventEmitter();
        this.activeChange = new EventEmitter();
        this.animating = new EventEmitter();
        this.canChangeImage = true;
        this.isAnimating = false;
        this.changeDetectorRef = changeDetectorRef;
        this.action = 'none';
    }
    set selectedIndex(index) {
        if (index > this._selectedIndex) {
            let action;
            if (this.animation === NgxGalleryAnimation.Slide) {
                action = 'slideRight';
            }
            else if (this.animation === NgxGalleryAnimation.Fade) {
                action = 'fade';
            }
            else if (this.animation === NgxGalleryAnimation.Rotate) {
                action = 'rotateRight';
            }
            else if (this.animation === NgxGalleryAnimation.Zoom) {
                action = 'zoom';
            }
            this.setAction(action);
        }
        else if (index < this._selectedIndex) {
            let action;
            if (this.animation === NgxGalleryAnimation.Slide) {
                action = 'slideLeft';
            }
            else if (this.animation === NgxGalleryAnimation.Fade) {
                action = 'fade';
            }
            else if (this.animation === NgxGalleryAnimation.Rotate) {
                action = 'rotateLeft';
            }
            else if (this.animation === NgxGalleryAnimation.Zoom) {
                action = 'zoom';
            }
            this.setAction(action);
        }
        this._selectedIndex = index;
    }
    // @HostBinding('style.display') public display = 'inline-block';
    // @HostBinding('style.background-color') public color = 'lime';
    ngOnInit() {
        if (this.arrows && this.arrowsAutoHide) {
            this.arrows = false;
        }
        if (this.autoPlay) {
            this.startAutoPlay();
        }
    }
    ngOnChanges(changes) {
        if (changes['swipe']) {
            this.helperService.manageSwipe(this.swipe, this.elementRef, 'image', () => this.showNext(), () => this.showPrev());
        }
    }
    onMouseEnter() {
        if (this.arrowsAutoHide && !this.arrows) {
            this.arrows = true;
        }
        if (this.autoPlay && this.autoPlayPauseOnHover) {
            this.stopAutoPlay();
        }
    }
    onMouseLeave() {
        if (this.arrowsAutoHide && this.arrows) {
            this.arrows = false;
        }
        if (this.autoPlay && this.autoPlayPauseOnHover) {
            this.startAutoPlay();
        }
    }
    reset(index) {
        this._selectedIndex = index;
        this.action = 'none';
    }
    getImages() {
        if (!this.images) {
            return [];
        }
        if (this.lazyLoading) {
            const indexes = [this._selectedIndex];
            const prevIndex = this._selectedIndex - 1;
            if (prevIndex === -1 && this.infinityMove) {
                indexes.push(this.images.length - 1);
            }
            else if (prevIndex >= 0) {
                indexes.push(prevIndex);
            }
            const nextIndex = this._selectedIndex + 1;
            if (nextIndex === this.images.length && this.infinityMove) {
                indexes.push(0);
            }
            else if (nextIndex < this.images.length) {
                indexes.push(nextIndex);
            }
            return this.images.filter((img, i) => indexes.indexOf(i) !== -1);
        }
        else {
            return this.images;
        }
    }
    startAutoPlay() {
        this.stopAutoPlay();
        this.timer = setInterval(() => {
            if (!this.showNext()) {
                this._selectedIndex = -1;
                this.showNext();
            }
        }, this.autoPlayInterval);
    }
    stopAutoPlay() {
        if (this.timer) {
            clearInterval(this.timer);
        }
    }
    handleClick(event, index) {
        if (this.clickable) {
            this.imageClick.emit(index);
            event.stopPropagation();
            event.preventDefault();
        }
    }
    show(index) {
        if (this.isAnimating) {
            return;
        }
        if (index > this._selectedIndex) {
            let action;
            if (this.animation === NgxGalleryAnimation.Slide) {
                action = 'slideRight';
            }
            else if (this.animation === NgxGalleryAnimation.Fade) {
                action = 'fade';
            }
            else if (this.animation === NgxGalleryAnimation.Rotate) {
                action = 'rotateRight';
            }
            else if (this.animation === NgxGalleryAnimation.Zoom) {
                action = 'zoom';
            }
            this.setAction(action);
        }
        else {
            let action;
            if (this.animation === NgxGalleryAnimation.Slide) {
                action = 'slideLeft';
            }
            else if (this.animation === NgxGalleryAnimation.Fade) {
                action = 'fade';
            }
            else if (this.animation === NgxGalleryAnimation.Rotate) {
                action = 'rotateLeft';
            }
            else if (this.animation === NgxGalleryAnimation.Zoom) {
                action = 'zoom';
            }
            this.setAction(action);
        }
        this._selectedIndex = index;
        this.activeChange.emit(this._selectedIndex);
        this.setChangeTimeout();
    }
    setAction(action) {
        this.action = action;
        this.changeDetectorRef.detectChanges();
    }
    showNext() {
        if (this.isAnimating) {
            return false;
        }
        if (this.canShowNext() && this.canChangeImage) {
            let action;
            if (this.animation === NgxGalleryAnimation.Slide) {
                action = 'slideRight';
            }
            else if (this.animation === NgxGalleryAnimation.Fade) {
                action = 'fade';
            }
            else if (this.animation === NgxGalleryAnimation.Rotate) {
                action = 'rotateRight';
            }
            else if (this.animation === NgxGalleryAnimation.Zoom) {
                action = 'zoom';
            }
            this.setAction(action);
            this._selectedIndex++;
            if (this._selectedIndex === this.images.length) {
                this._selectedIndex = 0;
            }
            this.activeChange.emit(this._selectedIndex);
            this.setChangeTimeout();
            return true;
        }
        else {
            return false;
        }
    }
    showPrev() {
        if (this.isAnimating) {
            return;
        }
        if (this.canShowPrev() && this.canChangeImage) {
            let action;
            if (this.animation === NgxGalleryAnimation.Slide) {
                action = 'slideLeft';
            }
            else if (this.animation === NgxGalleryAnimation.Fade) {
                action = 'fade';
            }
            else if (this.animation === NgxGalleryAnimation.Rotate) {
                action = 'rotateLeft';
            }
            else if (this.animation === NgxGalleryAnimation.Zoom) {
                action = 'zoom';
            }
            this.setAction(action);
            this._selectedIndex--;
            if (this._selectedIndex < 0) {
                this._selectedIndex = this.images.length - 1;
            }
            this.activeChange.emit(this._selectedIndex);
            this.setChangeTimeout();
        }
    }
    setChangeTimeout() {
        this.canChangeImage = false;
        let timeout = 1000;
        if (this.animation === NgxGalleryAnimation.Slide
            || this.animation === NgxGalleryAnimation.Fade) {
            timeout = 500;
        }
        setTimeout(() => {
            this.canChangeImage = true;
        }, timeout);
    }
    canShowNext() {
        if (this.images) {
            return this.infinityMove || this._selectedIndex < this.images.length - 1;
        }
        else {
            return false;
        }
    }
    canShowPrev() {
        if (this.images) {
            return this.infinityMove || this._selectedIndex > 0;
        }
        else {
            return false;
        }
    }
    getSafeUrl(image) {
        return this.sanitization.bypassSecurityTrustStyle(this.helperService.getBackgroundUrl(image.toString()));
    }
    getFileType(fileSource) {
        return this.helperService.getFileType(fileSource);
    }
    onStart(event) {
        this.isAnimating = true;
        this.animating.emit(true);
    }
    onDone(event) {
        this.isAnimating = false;
        this.animating.emit(false);
    }
}
NgxGalleryImageComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: NgxGalleryImageComponent, deps: [{ token: i1.DomSanitizer }, { token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i2.NgxGalleryService }], target: i0.ɵɵFactoryTarget.Component });
NgxGalleryImageComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.0", type: NgxGalleryImageComponent, selector: "ngx-gallery-image", inputs: { images: "images", clickable: "clickable", selectedIndex: "selectedIndex", arrows: "arrows", arrowsAutoHide: "arrowsAutoHide", swipe: "swipe", animation: "animation", size: "size", arrowPrevIcon: "arrowPrevIcon", arrowNextIcon: "arrowNextIcon", autoPlay: "autoPlay", autoPlayInterval: "autoPlayInterval", autoPlayPauseOnHover: "autoPlayPauseOnHover", infinityMove: "infinityMove", lazyLoading: "lazyLoading", actions: "actions", descriptions: "descriptions", showDescription: "showDescription", bullets: "bullets" }, outputs: { imageClick: "imageClick", activeChange: "activeChange", animating: "animating" }, host: { listeners: { "mouseenter": "onMouseEnter()", "mouseleave": "onMouseLeave()" } }, usesOnChanges: true, ngImport: i0, template: "<div class=\"ngx-gallery-image-wrapper ngx-gallery-animation-{{animation}} ngx-gallery-image-size-{{size}}\">\r\n  <ng-container *ngFor=\"let image of getImages(); let i = index;\">\r\n\r\n    <div *ngIf=\"image.type === 'image' && image.index === _selectedIndex\" class=\"ngx-gallery-image\"\r\n         [ngClass]=\"{'ngx-gallery-clickable': clickable }\"\r\n         [style.background-image]=\"getSafeUrl(image.src)\"\r\n         (click)=\"handleClick($event, image.index)\"\r\n         [@animation]=\"action\"\r\n         (@animation.start)=\"onStart($event)\"\r\n         (@animation.done)=\"onDone($event)\">\r\n      <div class=\"ngx-gallery-icons-wrapper\">\r\n        <ngx-gallery-action *ngFor=\"let action of actions\" [icon]=\"action.icon\" [disabled]=\"action.disabled\"\r\n                            [titleText]=\"action.titleText\"\r\n                            (closeClick)=\"action.onClick($event, image.index)\"></ngx-gallery-action>\r\n      </div>\r\n      <div class=\"ngx-gallery-image-text\" *ngIf=\"showDescription && descriptions[image.index]\"\r\n          [innerHTML]=\"descriptions[image.index]\" (click)=\"$event.stopPropagation()\"></div>\r\n    </div>\r\n\r\n    <div *ngIf=\"image.type === 'video' && image.index === _selectedIndex\" class=\"ngx-gallery-image\"\r\n         [ngClass]=\"{'ngx-gallery-clickable': clickable }\"\r\n         [style.background-image]=\"getSafeUrl(image.src)\"\r\n         (click)=\"handleClick($event, image.index)\"\r\n         [@animation]=\"action\"\r\n         (@animation.start)=\"onStart($event)\"\r\n         (@animation.done)=\"onDone($event)\">\r\n      <video controls style=\"width:100%; height:100%; background: #000;\">\r\n        <source [src]=\"image.src\">\r\n          Your browser does not support the video tag.\r\n      </video>\r\n      <div class=\"ngx-gallery-icons-wrapper\">\r\n      <ngx-gallery-action *ngFor=\"let action of actions\" [icon]=\"action.icon\" [disabled]=\"action.disabled\"\r\n                          [titleText]=\"action.titleText\"\r\n                          (closeClick)=\"action.onClick($event, image.index)\"></ngx-gallery-action>\r\n      </div>\r\n      <div class=\"ngx-gallery-image-text\" *ngIf=\"showDescription && descriptions[image.index]\"\r\n          [innerHTML]=\"descriptions[image.index]\" (click)=\"$event.stopPropagation()\"></div>\r\n      </div>\r\n\r\n\r\n  </ng-container>\r\n  <ngx-gallery-bullets *ngIf=\"bullets\" [count]=\"images.length\" [active]=\"_selectedIndex\"\r\n                       (bulletChange)=\"show($event)\"></ngx-gallery-bullets>\r\n  <ngx-gallery-arrows class=\"ngx-gallery-image-size-{{size}}\" *ngIf=\"arrows\" (prevClick)=\"showPrev()\"\r\n                      (nextClick)=\"showNext()\" [prevDisabled]=\"!canShowPrev()\" [nextDisabled]=\"!canShowNext()\"\r\n                      [arrowPrevIcon]=\"arrowPrevIcon\" [arrowNextIcon]=\"arrowNextIcon\"></ngx-gallery-arrows>\r\n</div>\r\n", styles: [":host{width:100%;display:inline-block;position:relative;font-size:25px}.ngx-gallery-image-wrapper{width:100%;height:100%;position:absolute;left:0;top:0;overflow:hidden}.ngx-gallery-image{background-position:center;background-repeat:no-repeat;height:100%;width:100%;position:absolute;top:0}.ngx-gallery-image-size-cover .ngx-gallery-image{background-size:cover}.ngx-gallery-image-size-contain .ngx-gallery-image{background-size:contain}.ngx-gallery-animation-fade .ngx-gallery-image{left:0;opacity:1;transition:.5s ease-in-out}.ngx-gallery-animation-fade .ngx-gallery-image.ngx-gallery-active{opacity:1}.ngx-gallery-animation-rotate .ngx-gallery-image{transition:1s ease;transform:scale(1) rotate(0);left:0;opacity:1}.ngx-gallery-animation-zoom .ngx-gallery-image{transition:1s ease;transform:scale(1);left:0;opacity:1}.ngx-gallery-image-text{width:100%;background:rgba(0,0,0,.7);padding:10px;text-align:center;color:#fff;font-size:16px;position:absolute;bottom:0;z-index:10}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.NgxGalleryArrowsComponent, selector: "ngx-gallery-arrows", inputs: ["prevDisabled", "nextDisabled", "arrowPrevIcon", "arrowNextIcon"], outputs: ["prevClick", "nextClick"] }, { kind: "component", type: i5.NgxGalleryActionComponent, selector: "ngx-gallery-action", inputs: ["icon", "disabled", "titleText"], outputs: ["closeClick"] }, { kind: "component", type: i6.NgxGalleryBulletsComponent, selector: "ngx-gallery-bullets", inputs: ["count", "active"], outputs: ["bulletChange"] }], animations: [
        trigger('animation', [
            // ...
            state('slideRight', style({})),
            state('slideLeft', style({})),
            state('fade', style({})),
            state('rotateLeft', style({})),
            state('rotateRight', style({})),
            state('zoom', style({})),
            transition('slideRight => void', [
                animate('500ms ease-in-out', style({ transform: 'translateX(-100%)' }))
            ]),
            transition('void => slideRight', [
                style({ transform: 'translateX(100%)' }),
                animate('500ms ease-in-out', style({ transform: 'translateX(0)' }))
            ]),
            transition('slideLeft => void', [
                animate('500ms ease-in-out', style({ transform: 'translateX(100%)' }))
            ]),
            transition('void => slideLeft', [
                style({ transform: 'translateX(-100%)' }),
                animate('500ms ease-in-out', style({ transform: 'translateX(0)' }))
            ]),
            transition('fade => void', [
                animate('500ms ease-in-out', style({ opacity: '0' }))
            ]),
            transition('void => fade', [
                style({ opacity: '0' }),
                animate('500ms ease-in-out', style({ opacity: '1' }))
            ]),
            transition('rotateLeft => void', [
                animate('500ms ease-in-out', style({ transform: 'scale(1, 1) rotate(-90deg)', opacity: '0' }))
            ]),
            transition('void => rotateLeft', [
                style({ transform: 'scale(1, 1) rotate(-90deg)', opacity: '0' }),
                animate('500ms ease-in-out', style({ transform: 'scale(1, 1) rotate(0deg)', opacity: '1' }))
            ]),
            transition('rotateRight => void', [
                animate('500ms ease-in-out', style({ transform: 'scale(1, 1) rotate(90deg)', opacity: '0' }))
            ]),
            transition('void => rotateRight', [
                style({ transform: 'scale(1, 1) rotate(90deg)', opacity: '0' }),
                animate('500ms ease-in-out', style({ transform: 'scale(1, 1) rotate(0deg)', opacity: '1' }))
            ]),
            transition('zoom => void', [
                animate('500ms ease-in-out', style({ transform: 'scale(2.5,2.5)', opacity: '0' }))
            ]),
            transition('void => zoom', [
                style({ transform: 'scale(2.5,2.5)', opacity: '0' }),
                animate('500ms ease-in-out', style({ transform: 'scale(1, 1)', opacity: '1' }))
            ]),
        ]),
    ], changeDetection: i0.ChangeDetectionStrategy.OnPush });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: NgxGalleryImageComponent, decorators: [{
            type: Component,
            args: [{ selector: 'ngx-gallery-image', changeDetection: ChangeDetectionStrategy.OnPush, animations: [
                        trigger('animation', [
                            // ...
                            state('slideRight', style({})),
                            state('slideLeft', style({})),
                            state('fade', style({})),
                            state('rotateLeft', style({})),
                            state('rotateRight', style({})),
                            state('zoom', style({})),
                            transition('slideRight => void', [
                                animate('500ms ease-in-out', style({ transform: 'translateX(-100%)' }))
                            ]),
                            transition('void => slideRight', [
                                style({ transform: 'translateX(100%)' }),
                                animate('500ms ease-in-out', style({ transform: 'translateX(0)' }))
                            ]),
                            transition('slideLeft => void', [
                                animate('500ms ease-in-out', style({ transform: 'translateX(100%)' }))
                            ]),
                            transition('void => slideLeft', [
                                style({ transform: 'translateX(-100%)' }),
                                animate('500ms ease-in-out', style({ transform: 'translateX(0)' }))
                            ]),
                            transition('fade => void', [
                                animate('500ms ease-in-out', style({ opacity: '0' }))
                            ]),
                            transition('void => fade', [
                                style({ opacity: '0' }),
                                animate('500ms ease-in-out', style({ opacity: '1' }))
                            ]),
                            transition('rotateLeft => void', [
                                animate('500ms ease-in-out', style({ transform: 'scale(1, 1) rotate(-90deg)', opacity: '0' }))
                            ]),
                            transition('void => rotateLeft', [
                                style({ transform: 'scale(1, 1) rotate(-90deg)', opacity: '0' }),
                                animate('500ms ease-in-out', style({ transform: 'scale(1, 1) rotate(0deg)', opacity: '1' }))
                            ]),
                            transition('rotateRight => void', [
                                animate('500ms ease-in-out', style({ transform: 'scale(1, 1) rotate(90deg)', opacity: '0' }))
                            ]),
                            transition('void => rotateRight', [
                                style({ transform: 'scale(1, 1) rotate(90deg)', opacity: '0' }),
                                animate('500ms ease-in-out', style({ transform: 'scale(1, 1) rotate(0deg)', opacity: '1' }))
                            ]),
                            transition('zoom => void', [
                                animate('500ms ease-in-out', style({ transform: 'scale(2.5,2.5)', opacity: '0' }))
                            ]),
                            transition('void => zoom', [
                                style({ transform: 'scale(2.5,2.5)', opacity: '0' }),
                                animate('500ms ease-in-out', style({ transform: 'scale(1, 1)', opacity: '1' }))
                            ]),
                        ]),
                    ], template: "<div class=\"ngx-gallery-image-wrapper ngx-gallery-animation-{{animation}} ngx-gallery-image-size-{{size}}\">\r\n  <ng-container *ngFor=\"let image of getImages(); let i = index;\">\r\n\r\n    <div *ngIf=\"image.type === 'image' && image.index === _selectedIndex\" class=\"ngx-gallery-image\"\r\n         [ngClass]=\"{'ngx-gallery-clickable': clickable }\"\r\n         [style.background-image]=\"getSafeUrl(image.src)\"\r\n         (click)=\"handleClick($event, image.index)\"\r\n         [@animation]=\"action\"\r\n         (@animation.start)=\"onStart($event)\"\r\n         (@animation.done)=\"onDone($event)\">\r\n      <div class=\"ngx-gallery-icons-wrapper\">\r\n        <ngx-gallery-action *ngFor=\"let action of actions\" [icon]=\"action.icon\" [disabled]=\"action.disabled\"\r\n                            [titleText]=\"action.titleText\"\r\n                            (closeClick)=\"action.onClick($event, image.index)\"></ngx-gallery-action>\r\n      </div>\r\n      <div class=\"ngx-gallery-image-text\" *ngIf=\"showDescription && descriptions[image.index]\"\r\n          [innerHTML]=\"descriptions[image.index]\" (click)=\"$event.stopPropagation()\"></div>\r\n    </div>\r\n\r\n    <div *ngIf=\"image.type === 'video' && image.index === _selectedIndex\" class=\"ngx-gallery-image\"\r\n         [ngClass]=\"{'ngx-gallery-clickable': clickable }\"\r\n         [style.background-image]=\"getSafeUrl(image.src)\"\r\n         (click)=\"handleClick($event, image.index)\"\r\n         [@animation]=\"action\"\r\n         (@animation.start)=\"onStart($event)\"\r\n         (@animation.done)=\"onDone($event)\">\r\n      <video controls style=\"width:100%; height:100%; background: #000;\">\r\n        <source [src]=\"image.src\">\r\n          Your browser does not support the video tag.\r\n      </video>\r\n      <div class=\"ngx-gallery-icons-wrapper\">\r\n      <ngx-gallery-action *ngFor=\"let action of actions\" [icon]=\"action.icon\" [disabled]=\"action.disabled\"\r\n                          [titleText]=\"action.titleText\"\r\n                          (closeClick)=\"action.onClick($event, image.index)\"></ngx-gallery-action>\r\n      </div>\r\n      <div class=\"ngx-gallery-image-text\" *ngIf=\"showDescription && descriptions[image.index]\"\r\n          [innerHTML]=\"descriptions[image.index]\" (click)=\"$event.stopPropagation()\"></div>\r\n      </div>\r\n\r\n\r\n  </ng-container>\r\n  <ngx-gallery-bullets *ngIf=\"bullets\" [count]=\"images.length\" [active]=\"_selectedIndex\"\r\n                       (bulletChange)=\"show($event)\"></ngx-gallery-bullets>\r\n  <ngx-gallery-arrows class=\"ngx-gallery-image-size-{{size}}\" *ngIf=\"arrows\" (prevClick)=\"showPrev()\"\r\n                      (nextClick)=\"showNext()\" [prevDisabled]=\"!canShowPrev()\" [nextDisabled]=\"!canShowNext()\"\r\n                      [arrowPrevIcon]=\"arrowPrevIcon\" [arrowNextIcon]=\"arrowNextIcon\"></ngx-gallery-arrows>\r\n</div>\r\n", styles: [":host{width:100%;display:inline-block;position:relative;font-size:25px}.ngx-gallery-image-wrapper{width:100%;height:100%;position:absolute;left:0;top:0;overflow:hidden}.ngx-gallery-image{background-position:center;background-repeat:no-repeat;height:100%;width:100%;position:absolute;top:0}.ngx-gallery-image-size-cover .ngx-gallery-image{background-size:cover}.ngx-gallery-image-size-contain .ngx-gallery-image{background-size:contain}.ngx-gallery-animation-fade .ngx-gallery-image{left:0;opacity:1;transition:.5s ease-in-out}.ngx-gallery-animation-fade .ngx-gallery-image.ngx-gallery-active{opacity:1}.ngx-gallery-animation-rotate .ngx-gallery-image{transition:1s ease;transform:scale(1) rotate(0);left:0;opacity:1}.ngx-gallery-animation-zoom .ngx-gallery-image{transition:1s ease;transform:scale(1);left:0;opacity:1}.ngx-gallery-image-text{width:100%;background:rgba(0,0,0,.7);padding:10px;text-align:center;color:#fff;font-size:16px;position:absolute;bottom:0;z-index:10}\n"] }]
        }], ctorParameters: function () { return [{ type: i1.DomSanitizer }, { type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i2.NgxGalleryService }]; }, propDecorators: { images: [{
                type: Input
            }], clickable: [{
                type: Input
            }], selectedIndex: [{
                type: Input
            }], arrows: [{
                type: Input
            }], arrowsAutoHide: [{
                type: Input
            }], swipe: [{
                type: Input
            }], animation: [{
                type: Input
            }], size: [{
                type: Input
            }], arrowPrevIcon: [{
                type: Input
            }], arrowNextIcon: [{
                type: Input
            }], autoPlay: [{
                type: Input
            }], autoPlayInterval: [{
                type: Input
            }], autoPlayPauseOnHover: [{
                type: Input
            }], infinityMove: [{
                type: Input
            }], lazyLoading: [{
                type: Input
            }], actions: [{
                type: Input
            }], descriptions: [{
                type: Input
            }], showDescription: [{
                type: Input
            }], bullets: [{
                type: Input
            }], imageClick: [{
                type: Output
            }], activeChange: [{
                type: Output
            }], animating: [{
                type: Output
            }], onMouseEnter: [{
                type: HostListener,
                args: ['mouseenter']
            }], onMouseLeave: [{
                type: HostListener,
                args: ['mouseleave']
            }] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWdhbGxlcnktaW1hZ2UuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2FsbGVyeS9zcmMvbGliL25neC1nYWxsZXJ5LWltYWdlL25neC1nYWxsZXJ5LWltYWdlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2dhbGxlcnkvc3JjL2xpYi9uZ3gtZ2FsbGVyeS1pbWFnZS9uZ3gtZ2FsbGVyeS1pbWFnZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBRXZCLFNBQVMsRUFFVCxZQUFZLEVBQ1osWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBRVAsTUFBTSxlQUFlLENBQUM7QUFLdkIsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDN0QsT0FBTyxFQUFDLE9BQU8sRUFBa0IsS0FBSyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFDLE1BQU0scUJBQXFCLENBQUM7Ozs7Ozs7O0FBK0QvRixNQUFNLE9BQU8sd0JBQXdCO0lBZ0VuQyxZQUFvQixZQUEwQixFQUFVLGlCQUFvQyxFQUN4RSxVQUFzQixFQUFVLGFBQWdDO1FBRGhFLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQVUsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUN4RSxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQVUsa0JBQWEsR0FBYixhQUFhLENBQW1CO1FBWjFFLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ2hDLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNsQyxjQUFTLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUV6QyxtQkFBYyxHQUFHLElBQUksQ0FBQztRQUd0QixnQkFBVyxHQUFHLEtBQUssQ0FBQztRQU1sQixJQUFJLENBQUMsaUJBQWlCLEdBQUcsaUJB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LENBQUMsRUFBQyxTQUFTLEVBQUUsYUFBYSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUMsQ0FBQyxDQUFDOzZCQUM5RSxDQUFDO3lCQUNILENBQUM7cUJBQ0g7NExBR1EsTUFBTTtzQkFBZCxLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBSUYsYUFBYTtzQkFEaEIsS0FBSztnQkErQkcsTUFBTTtzQkFBZCxLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxvQkFBb0I7c0JBQTVCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUVJLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxTQUFTO3NCQUFsQixNQUFNO2dCQWtDcUIsWUFBWTtzQkFBdkMsWUFBWTt1QkFBQyxZQUFZO2dCQVVFLFlBQVk7c0JBQXZDLFlBQVk7dUJBQUMsWUFBWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgQ29tcG9uZW50LFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIEhvc3RMaXN0ZW5lcixcclxuICBJbnB1dCxcclxuICBPbkNoYW5nZXMsXHJcbiAgT25Jbml0LFxyXG4gIE91dHB1dCxcclxuICBTaW1wbGVDaGFuZ2VzXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7RG9tU2FuaXRpemVyLCBTYWZlUmVzb3VyY2VVcmwsIFNhZmVTdHlsZX0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XHJcbmltcG9ydCB7Tmd4R2FsbGVyeVNlcnZpY2V9IGZyb20gJy4uL25neC1nYWxsZXJ5LnNlcnZpY2UnO1xyXG5pbXBvcnQge05neEdhbGxlcnlPcmRlcmVkSW1hZ2V9IGZyb20gJy4uL25neC1nYWxsZXJ5LW9yZGVyZWQtaW1hZ2UnO1xyXG5pbXBvcnQge05neEdhbGxlcnlBY3Rpb259IGZyb20gJy4uL25neC1nYWxsZXJ5LWFjdGlvbic7XHJcbmltcG9ydCB7Tmd4R2FsbGVyeUFuaW1hdGlvbn0gZnJvbSAnLi4vbmd4LWdhbGxlcnktYW5pbWF0aW9uJztcclxuaW1wb3J0IHthbmltYXRlLCBBbmltYXRpb25FdmVudCwgc3RhdGUsIHN0eWxlLCB0cmFuc2l0aW9uLCB0cmlnZ2VyfSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcclxuXHJcbnR5cGUgT3JpZW50YXRpb24gPSAoJ3NsaWRlTGVmdCcgfCAnc2xpZGVSaWdodCcgfCAnZmFkZScgfCAncm90YXRlTGVmdCcgfCAncm90YXRlUmlnaHQnIHwgJ3pvb20nIHwgJ25vbmUnKTtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbmd4LWdhbGxlcnktaW1hZ2UnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9uZ3gtZ2FsbGVyeS1pbWFnZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vbmd4LWdhbGxlcnktaW1hZ2UuY29tcG9uZW50LnNjc3MnXSxcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxuICBhbmltYXRpb25zOiBbXHJcbiAgICB0cmlnZ2VyKCdhbmltYXRpb24nLCBbXHJcbiAgICAgIC8vIC4uLlxyXG4gICAgICBzdGF0ZSgnc2xpZGVSaWdodCcsIHN0eWxlKHt9KSksXHJcbiAgICAgIHN0YXRlKCdzbGlkZUxlZnQnLCBzdHlsZSh7fSkpLFxyXG4gICAgICBzdGF0ZSgnZmFkZScsIHN0eWxlKHt9KSksXHJcbiAgICAgIHN0YXRlKCdyb3RhdGVMZWZ0Jywgc3R5bGUoe30pKSxcclxuICAgICAgc3RhdGUoJ3JvdGF0ZVJpZ2h0Jywgc3R5bGUoe30pKSxcclxuICAgICAgc3RhdGUoJ3pvb20nLCBzdHlsZSh7fSkpLFxyXG4gICAgICB0cmFuc2l0aW9uKCdzbGlkZVJpZ2h0ID0+IHZvaWQnLCBbXHJcbiAgICAgICAgYW5pbWF0ZSgnNTAwbXMgZWFzZS1pbi1vdXQnLCBzdHlsZSh7dHJhbnNmb3JtOiAndHJhbnNsYXRlWCgtMTAwJSknfSkpXHJcbiAgICAgIF0pLFxyXG4gICAgICB0cmFuc2l0aW9uKCd2b2lkID0+IHNsaWRlUmlnaHQnLCBbXHJcbiAgICAgICAgc3R5bGUoe3RyYW5zZm9ybTogJ3RyYW5zbGF0ZVgoMTAwJSknfSksXHJcbiAgICAgICAgYW5pbWF0ZSgnNTAwbXMgZWFzZS1pbi1vdXQnLCBzdHlsZSh7dHJhbnNmb3JtOiAndHJhbnNsYXRlWCgwKSd9KSlcclxuICAgICAgXSksXHJcbiAgICAgIHRyYW5zaXRpb24oJ3NsaWRlTGVmdCA9PiB2b2lkJywgW1xyXG4gICAgICAgIGFuaW1hdGUoJzUwMG1zIGVhc2UtaW4tb3V0Jywgc3R5bGUoe3RyYW5zZm9ybTogJ3RyYW5zbGF0ZVgoMTAwJSknfSkpXHJcbiAgICAgIF0pLFxyXG4gICAgICB0cmFuc2l0aW9uKCd2b2lkID0+IHNsaWRlTGVmdCcsIFtcclxuICAgICAgICBzdHlsZSh7dHJhbnNmb3JtOiAndHJhbnNsYXRlWCgtMTAwJSknfSksXHJcbiAgICAgICAgYW5pbWF0ZSgnNTAwbXMgZWFzZS1pbi1vdXQnLCBzdHlsZSh7dHJhbnNmb3JtOiAndHJhbnNsYXRlWCgwKSd9KSlcclxuICAgICAgXSksXHJcbiAgICAgIHRyYW5zaXRpb24oJ2ZhZGUgPT4gdm9pZCcsIFtcclxuICAgICAgICBhbmltYXRlKCc1MDBtcyBlYXNlLWluLW91dCcsIHN0eWxlKHtvcGFjaXR5OiAnMCd9KSlcclxuICAgICAgXSksXHJcbiAgICAgIHRyYW5zaXRpb24oJ3ZvaWQgPT4gZmFkZScsIFtcclxuICAgICAgICBzdHlsZSh7b3BhY2l0eTogJzAnfSksXHJcbiAgICAgICAgYW5pbWF0ZSgnNTAwbXMgZWFzZS1pbi1vdXQnLCBzdHlsZSh7b3BhY2l0eTogJzEnfSkpXHJcbiAgICAgIF0pLFxyXG4gICAgICB0cmFuc2l0aW9uKCdyb3RhdGVMZWZ0ID0+IHZvaWQnLCBbXHJcbiAgICAgICAgYW5pbWF0ZSgnNTAwbXMgZWFzZS1pbi1vdXQnLCBzdHlsZSh7dHJhbnNmb3JtOiAnc2NhbGUoMSwgMSkgcm90YXRlKC05MGRlZyknLCBvcGFjaXR5OiAnMCd9KSlcclxuICAgICAgXSksXHJcbiAgICAgIHRyYW5zaXRpb24oJ3ZvaWQgPT4gcm90YXRlTGVmdCcsIFtcclxuICAgICAgICBzdHlsZSh7dHJhbnNmb3JtOiAnc2NhbGUoMSwgMSkgcm90YXRlKC05MGRlZyknLCBvcGFjaXR5OiAnMCd9KSxcclxuICAgICAgICBhbmltYXRlKCc1MDBtcyBlYXNlLWluLW91dCcsIHN0eWxlKHt0cmFuc2Zvcm06ICdzY2FsZSgxLCAxKSByb3RhdGUoMGRlZyknLCBvcGFjaXR5OiAnMSd9KSlcclxuICAgICAgXSksXHJcbiAgICAgIHRyYW5zaXRpb24oJ3JvdGF0ZVJpZ2h0ID0+IHZvaWQnLCBbXHJcbiAgICAgICAgYW5pbWF0ZSgnNTAwbXMgZWFzZS1pbi1vdXQnLCBzdHlsZSh7dHJhbnNmb3JtOiAnc2NhbGUoMSwgMSkgcm90YXRlKDkwZGVnKScsIG9wYWNpdHk6ICcwJ30pKVxyXG4gICAgICBdKSxcclxuICAgICAgdHJhbnNpdGlvbigndm9pZCA9PiByb3RhdGVSaWdodCcsIFtcclxuICAgICAgICBzdHlsZSh7dHJhbnNmb3JtOiAnc2NhbGUoMSwgMSkgcm90YXRlKDkwZGVnKScsIG9wYWNpdHk6ICcwJ30pLFxyXG4gICAgICAgIGFuaW1hdGUoJzUwMG1zIGVhc2UtaW4tb3V0Jywgc3R5bGUoe3RyYW5zZm9ybTogJ3NjYWxlKDEsIDEpIHJvdGF0ZSgwZGVnKScsIG9wYWNpdHk6ICcxJ30pKVxyXG4gICAgICBdKSxcclxuICAgICAgdHJhbnNpdGlvbignem9vbSA9PiB2b2lkJywgW1xyXG4gICAgICAgIGFuaW1hdGUoJzUwMG1zIGVhc2UtaW4tb3V0Jywgc3R5bGUoe3RyYW5zZm9ybTogJ3NjYWxlKDIuNSwyLjUpJywgb3BhY2l0eTogJzAnfSkpXHJcbiAgICAgIF0pLFxyXG4gICAgICB0cmFuc2l0aW9uKCd2b2lkID0+IHpvb20nLCBbXHJcbiAgICAgICAgc3R5bGUoe3RyYW5zZm9ybTogJ3NjYWxlKDIuNSwyLjUpJywgb3BhY2l0eTogJzAnfSksXHJcbiAgICAgICAgYW5pbWF0ZSgnNTAwbXMgZWFzZS1pbi1vdXQnLCBzdHlsZSh7dHJhbnNmb3JtOiAnc2NhbGUoMSwgMSknLCBvcGFjaXR5OiAnMSd9KSlcclxuICAgICAgXSksXHJcbiAgICBdKSxcclxuICBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOZ3hHYWxsZXJ5SW1hZ2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XHJcbiAgQElucHV0KCkgaW1hZ2VzOiBOZ3hHYWxsZXJ5T3JkZXJlZEltYWdlW107XHJcbiAgQElucHV0KCkgY2xpY2thYmxlOiBib29sZWFuO1xyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb24sIG5vLXVuZGVyc2NvcmUtZGFuZ2xlLCBpZC1ibGFja2xpc3QsIGlkLW1hdGNoXHJcbiAgX3NlbGVjdGVkSW5kZXg7XHJcbiAgQElucHV0KClcclxuICBzZXQgc2VsZWN0ZWRJbmRleChpbmRleDogbnVtYmVyKSB7XHJcbiAgICBpZiAoaW5kZXggPiB0aGlzLl9zZWxlY3RlZEluZGV4KSB7XHJcbiAgICAgIGxldCBhY3Rpb247XHJcbiAgICAgIGlmICh0aGlzLmFuaW1hdGlvbiA9PT0gTmd4R2FsbGVyeUFuaW1hdGlvbi5TbGlkZSkge1xyXG4gICAgICAgIGFjdGlvbiA9ICdzbGlkZVJpZ2h0JztcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLmFuaW1hdGlvbiA9PT0gTmd4R2FsbGVyeUFuaW1hdGlvbi5GYWRlKSB7XHJcbiAgICAgICAgYWN0aW9uID0gJ2ZhZGUnO1xyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuYW5pbWF0aW9uID09PSBOZ3hHYWxsZXJ5QW5pbWF0aW9uLlJvdGF0ZSkge1xyXG4gICAgICAgIGFjdGlvbiA9ICdyb3RhdGVSaWdodCc7XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5hbmltYXRpb24gPT09IE5neEdhbGxlcnlBbmltYXRpb24uWm9vbSkge1xyXG4gICAgICAgIGFjdGlvbiA9ICd6b29tJztcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnNldEFjdGlvbihhY3Rpb24pO1xyXG4gICAgfSBlbHNlIGlmIChpbmRleCA8IHRoaXMuX3NlbGVjdGVkSW5kZXgpIHtcclxuICAgICAgbGV0IGFjdGlvbjtcclxuICAgICAgaWYgKHRoaXMuYW5pbWF0aW9uID09PSBOZ3hHYWxsZXJ5QW5pbWF0aW9uLlNsaWRlKSB7XHJcbiAgICAgICAgYWN0aW9uID0gJ3NsaWRlTGVmdCc7XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5hbmltYXRpb24gPT09IE5neEdhbGxlcnlBbmltYXRpb24uRmFkZSkge1xyXG4gICAgICAgIGFjdGlvbiA9ICdmYWRlJztcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLmFuaW1hdGlvbiA9PT0gTmd4R2FsbGVyeUFuaW1hdGlvbi5Sb3RhdGUpIHtcclxuICAgICAgICBhY3Rpb24gPSAncm90YXRlTGVmdCc7XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5hbmltYXRpb24gPT09IE5neEdhbGxlcnlBbmltYXRpb24uWm9vbSkge1xyXG4gICAgICAgIGFjdGlvbiA9ICd6b29tJztcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnNldEFjdGlvbihhY3Rpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX3NlbGVjdGVkSW5kZXggPSBpbmRleDtcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpIGFycm93czogYm9vbGVhbjtcclxuICBASW5wdXQoKSBhcnJvd3NBdXRvSGlkZTogYm9vbGVhbjtcclxuICBASW5wdXQoKSBzd2lwZTogYm9vbGVhbjtcclxuICBASW5wdXQoKSBhbmltYXRpb246IHN0cmluZztcclxuICBASW5wdXQoKSBzaXplOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgYXJyb3dQcmV2SWNvbjogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGFycm93TmV4dEljb246IHN0cmluZztcclxuICBASW5wdXQoKSBhdXRvUGxheTogYm9vbGVhbjtcclxuICBASW5wdXQoKSBhdXRvUGxheUludGVydmFsOiBudW1iZXI7XHJcbiAgQElucHV0KCkgYXV0b1BsYXlQYXVzZU9uSG92ZXI6IGJvb2xlYW47XHJcbiAgQElucHV0KCkgaW5maW5pdHlNb3ZlOiBib29sZWFuO1xyXG4gIEBJbnB1dCgpIGxhenlMb2FkaW5nOiBib29sZWFuO1xyXG4gIEBJbnB1dCgpIGFjdGlvbnM6IE5neEdhbGxlcnlBY3Rpb25bXTtcclxuICBASW5wdXQoKSBkZXNjcmlwdGlvbnM6IHN0cmluZ1tdO1xyXG4gIEBJbnB1dCgpIHNob3dEZXNjcmlwdGlvbjogYm9vbGVhbjtcclxuICBASW5wdXQoKSBidWxsZXRzOiBib29sZWFuO1xyXG5cclxuICBAT3V0cHV0KCkgaW1hZ2VDbGljayA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBAT3V0cHV0KCkgYWN0aXZlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKSBhbmltYXRpbmcgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gIGNhbkNoYW5nZUltYWdlID0gdHJ1ZTtcclxuICBwdWJsaWMgYWN0aW9uOiBPcmllbnRhdGlvbjtcclxuXHJcbiAgaXNBbmltYXRpbmcgPSBmYWxzZTtcclxuXHJcbiAgcHJpdmF0ZSB0aW1lcjtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBzYW5pdGl6YXRpb246IERvbVNhbml0aXplciwgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLCBwcml2YXRlIGhlbHBlclNlcnZpY2U6IE5neEdhbGxlcnlTZXJ2aWNlKSB7XHJcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmID0gY2hhbmdlRGV0ZWN0b3JSZWY7XHJcbiAgICB0aGlzLmFjdGlvbiA9ICdub25lJztcclxuICB9XHJcblxyXG4gIC8vIEBIb3N0QmluZGluZygnc3R5bGUuZGlzcGxheScpIHB1YmxpYyBkaXNwbGF5ID0gJ2lubGluZS1ibG9jayc7XHJcbiAgLy8gQEhvc3RCaW5kaW5nKCdzdHlsZS5iYWNrZ3JvdW5kLWNvbG9yJykgcHVibGljIGNvbG9yID0gJ2xpbWUnO1xyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIGlmICh0aGlzLmFycm93cyAmJiB0aGlzLmFycm93c0F1dG9IaWRlKSB7XHJcbiAgICAgIHRoaXMuYXJyb3dzID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuYXV0b1BsYXkpIHtcclxuICAgICAgdGhpcy5zdGFydEF1dG9QbGF5KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBpZiAoY2hhbmdlc1snc3dpcGUnXSkge1xyXG4gICAgICB0aGlzLmhlbHBlclNlcnZpY2UubWFuYWdlU3dpcGUodGhpcy5zd2lwZSwgdGhpcy5lbGVtZW50UmVmLCAnaW1hZ2UnLCAoKSA9PiB0aGlzLnNob3dOZXh0KCksICgpID0+IHRoaXMuc2hvd1ByZXYoKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdtb3VzZWVudGVyJykgb25Nb3VzZUVudGVyKCkge1xyXG4gICAgaWYgKHRoaXMuYXJyb3dzQXV0b0hpZGUgJiYgIXRoaXMuYXJyb3dzKSB7XHJcbiAgICAgIHRoaXMuYXJyb3dzID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5hdXRvUGxheSAmJiB0aGlzLmF1dG9QbGF5UGF1c2VPbkhvdmVyKSB7XHJcbiAgICAgIHRoaXMuc3RvcEF1dG9QbGF5KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdtb3VzZWxlYXZlJykgb25Nb3VzZUxlYXZlKCkge1xyXG4gICAgaWYgKHRoaXMuYXJyb3dzQXV0b0hpZGUgJiYgdGhpcy5hcnJvd3MpIHtcclxuICAgICAgdGhpcy5hcnJvd3MgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5hdXRvUGxheSAmJiB0aGlzLmF1dG9QbGF5UGF1c2VPbkhvdmVyKSB7XHJcbiAgICAgIHRoaXMuc3RhcnRBdXRvUGxheSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVzZXQoaW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5fc2VsZWN0ZWRJbmRleCA9IGluZGV4O1xyXG4gICAgdGhpcy5hY3Rpb24gPSAnbm9uZSc7XHJcbiAgfVxyXG5cclxuICBnZXRJbWFnZXMoKTogTmd4R2FsbGVyeU9yZGVyZWRJbWFnZVtdIHtcclxuICAgIGlmICghdGhpcy5pbWFnZXMpIHtcclxuICAgICAgcmV0dXJuIFtdO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmxhenlMb2FkaW5nKSB7XHJcbiAgICAgIGNvbnN0IGluZGV4ZXMgPSBbdGhpcy5fc2VsZWN0ZWRJbmRleF07XHJcbiAgICAgIGNvbnN0IHByZXZJbmRleCA9IHRoaXMuX3NlbGVjdGVkSW5kZXggLSAxO1xyXG5cclxuICAgICAgaWYgKHByZXZJbmRleCA9PT0gLTEgJiYgdGhpcy5pbmZpbml0eU1vdmUpIHtcclxuICAgICAgICBpbmRleGVzLnB1c2godGhpcy5pbWFnZXMubGVuZ3RoIC0gMSk7XHJcbiAgICAgIH0gZWxzZSBpZiAocHJldkluZGV4ID49IDApIHtcclxuICAgICAgICBpbmRleGVzLnB1c2gocHJldkluZGV4KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgbmV4dEluZGV4ID0gdGhpcy5fc2VsZWN0ZWRJbmRleCArIDE7XHJcblxyXG4gICAgICBpZiAobmV4dEluZGV4ID09PSB0aGlzLmltYWdlcy5sZW5ndGggJiYgdGhpcy5pbmZpbml0eU1vdmUpIHtcclxuICAgICAgICBpbmRleGVzLnB1c2goMCk7XHJcbiAgICAgIH0gZWxzZSBpZiAobmV4dEluZGV4IDwgdGhpcy5pbWFnZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgaW5kZXhlcy5wdXNoKG5leHRJbmRleCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiB0aGlzLmltYWdlcy5maWx0ZXIoKGltZywgaSkgPT4gaW5kZXhlcy5pbmRleE9mKGkpICE9PSAtMSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gdGhpcy5pbWFnZXM7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdGFydEF1dG9QbGF5KCk6IHZvaWQge1xyXG4gICAgdGhpcy5zdG9wQXV0b1BsYXkoKTtcclxuXHJcbiAgICB0aGlzLnRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xyXG4gICAgICBpZiAoIXRoaXMuc2hvd05leHQoKSkge1xyXG4gICAgICAgIHRoaXMuX3NlbGVjdGVkSW5kZXggPSAtMTtcclxuICAgICAgICB0aGlzLnNob3dOZXh0KCk7XHJcbiAgICAgIH1cclxuICAgIH0sIHRoaXMuYXV0b1BsYXlJbnRlcnZhbCk7XHJcbiAgfVxyXG5cclxuICBzdG9wQXV0b1BsYXkoKSB7XHJcbiAgICBpZiAodGhpcy50aW1lcikge1xyXG4gICAgICBjbGVhckludGVydmFsKHRoaXMudGltZXIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGFuZGxlQ2xpY2soZXZlbnQ6IEV2ZW50LCBpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5jbGlja2FibGUpIHtcclxuICAgICAgdGhpcy5pbWFnZUNsaWNrLmVtaXQoaW5kZXgpO1xyXG5cclxuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzaG93KGluZGV4OiBudW1iZXIpIHtcclxuICAgIGlmICh0aGlzLmlzQW5pbWF0aW5nKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmIChpbmRleCA+IHRoaXMuX3NlbGVjdGVkSW5kZXgpIHtcclxuICAgICAgbGV0IGFjdGlvbjtcclxuICAgICAgaWYgKHRoaXMuYW5pbWF0aW9uID09PSBOZ3hHYWxsZXJ5QW5pbWF0aW9uLlNsaWRlKSB7XHJcbiAgICAgICAgYWN0aW9uID0gJ3NsaWRlUmlnaHQnO1xyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuYW5pbWF0aW9uID09PSBOZ3hHYWxsZXJ5QW5pbWF0aW9uLkZhZGUpIHtcclxuICAgICAgICBhY3Rpb24gPSAnZmFkZSc7XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5hbmltYXRpb24gPT09IE5neEdhbGxlcnlBbmltYXRpb24uUm90YXRlKSB7XHJcbiAgICAgICAgYWN0aW9uID0gJ3JvdGF0ZVJpZ2h0JztcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLmFuaW1hdGlvbiA9PT0gTmd4R2FsbGVyeUFuaW1hdGlvbi5ab29tKSB7XHJcbiAgICAgICAgYWN0aW9uID0gJ3pvb20nO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuc2V0QWN0aW9uKGFjdGlvbik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsZXQgYWN0aW9uO1xyXG4gICAgICBpZiAodGhpcy5hbmltYXRpb24gPT09IE5neEdhbGxlcnlBbmltYXRpb24uU2xpZGUpIHtcclxuICAgICAgICBhY3Rpb24gPSAnc2xpZGVMZWZ0JztcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLmFuaW1hdGlvbiA9PT0gTmd4R2FsbGVyeUFuaW1hdGlvbi5GYWRlKSB7XHJcbiAgICAgICAgYWN0aW9uID0gJ2ZhZGUnO1xyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuYW5pbWF0aW9uID09PSBOZ3hHYWxsZXJ5QW5pbWF0aW9uLlJvdGF0ZSkge1xyXG4gICAgICAgIGFjdGlvbiA9ICdyb3RhdGVMZWZ0JztcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLmFuaW1hdGlvbiA9PT0gTmd4R2FsbGVyeUFuaW1hdGlvbi5ab29tKSB7XHJcbiAgICAgICAgYWN0aW9uID0gJ3pvb20nO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuc2V0QWN0aW9uKGFjdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fc2VsZWN0ZWRJbmRleCA9IGluZGV4O1xyXG4gICAgdGhpcy5hY3RpdmVDaGFuZ2UuZW1pdCh0aGlzLl9zZWxlY3RlZEluZGV4KTtcclxuICAgIHRoaXMuc2V0Q2hhbmdlVGltZW91dCgpO1xyXG4gIH1cclxuXHJcbiAgc2V0QWN0aW9uKGFjdGlvbjogT3JpZW50YXRpb24pIHtcclxuICAgIHRoaXMuYWN0aW9uID0gYWN0aW9uO1xyXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBzaG93TmV4dCgpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLmlzQW5pbWF0aW5nKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmNhblNob3dOZXh0KCkgJiYgdGhpcy5jYW5DaGFuZ2VJbWFnZSkge1xyXG4gICAgICBsZXQgYWN0aW9uO1xyXG4gICAgICBpZiAodGhpcy5hbmltYXRpb24gPT09IE5neEdhbGxlcnlBbmltYXRpb24uU2xpZGUpIHtcclxuICAgICAgICBhY3Rpb24gPSAnc2xpZGVSaWdodCc7XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5hbmltYXRpb24gPT09IE5neEdhbGxlcnlBbmltYXRpb24uRmFkZSkge1xyXG4gICAgICAgIGFjdGlvbiA9ICdmYWRlJztcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLmFuaW1hdGlvbiA9PT0gTmd4R2FsbGVyeUFuaW1hdGlvbi5Sb3RhdGUpIHtcclxuICAgICAgICBhY3Rpb24gPSAncm90YXRlUmlnaHQnO1xyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuYW5pbWF0aW9uID09PSBOZ3hHYWxsZXJ5QW5pbWF0aW9uLlpvb20pIHtcclxuICAgICAgICBhY3Rpb24gPSAnem9vbSc7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5zZXRBY3Rpb24oYWN0aW9uKTtcclxuICAgICAgdGhpcy5fc2VsZWN0ZWRJbmRleCsrO1xyXG4gICAgICBpZiAodGhpcy5fc2VsZWN0ZWRJbmRleCA9PT0gdGhpcy5pbWFnZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRJbmRleCA9IDA7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuYWN0aXZlQ2hhbmdlLmVtaXQodGhpcy5fc2VsZWN0ZWRJbmRleCk7XHJcbiAgICAgIHRoaXMuc2V0Q2hhbmdlVGltZW91dCgpO1xyXG5cclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzaG93UHJldigpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmlzQW5pbWF0aW5nKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmNhblNob3dQcmV2KCkgJiYgdGhpcy5jYW5DaGFuZ2VJbWFnZSkge1xyXG4gICAgICBsZXQgYWN0aW9uO1xyXG4gICAgICBpZiAodGhpcy5hbmltYXRpb24gPT09IE5neEdhbGxlcnlBbmltYXRpb24uU2xpZGUpIHtcclxuICAgICAgICBhY3Rpb24gPSAnc2xpZGVMZWZ0JztcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLmFuaW1hdGlvbiA9PT0gTmd4R2FsbGVyeUFuaW1hdGlvbi5GYWRlKSB7XHJcbiAgICAgICAgYWN0aW9uID0gJ2ZhZGUnO1xyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuYW5pbWF0aW9uID09PSBOZ3hHYWxsZXJ5QW5pbWF0aW9uLlJvdGF0ZSkge1xyXG4gICAgICAgIGFjdGlvbiA9ICdyb3RhdGVMZWZ0JztcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLmFuaW1hdGlvbiA9PT0gTmd4R2FsbGVyeUFuaW1hdGlvbi5ab29tKSB7XHJcbiAgICAgICAgYWN0aW9uID0gJ3pvb20nO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuc2V0QWN0aW9uKGFjdGlvbik7XHJcbiAgICAgIHRoaXMuX3NlbGVjdGVkSW5kZXgtLTtcclxuICAgICAgaWYgKHRoaXMuX3NlbGVjdGVkSW5kZXggPCAwKSB7XHJcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRJbmRleCA9IHRoaXMuaW1hZ2VzLmxlbmd0aCAtIDE7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuYWN0aXZlQ2hhbmdlLmVtaXQodGhpcy5fc2VsZWN0ZWRJbmRleCk7XHJcbiAgICAgIHRoaXMuc2V0Q2hhbmdlVGltZW91dCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0Q2hhbmdlVGltZW91dCgpIHtcclxuICAgIHRoaXMuY2FuQ2hhbmdlSW1hZ2UgPSBmYWxzZTtcclxuICAgIGxldCB0aW1lb3V0ID0gMTAwMDtcclxuXHJcbiAgICBpZiAodGhpcy5hbmltYXRpb24gPT09IE5neEdhbGxlcnlBbmltYXRpb24uU2xpZGVcclxuICAgICAgfHwgdGhpcy5hbmltYXRpb24gPT09IE5neEdhbGxlcnlBbmltYXRpb24uRmFkZSkge1xyXG4gICAgICB0aW1lb3V0ID0gNTAwO1xyXG4gICAgfVxyXG5cclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLmNhbkNoYW5nZUltYWdlID0gdHJ1ZTtcclxuICAgIH0sIHRpbWVvdXQpO1xyXG4gIH1cclxuXHJcbiAgY2FuU2hvd05leHQoKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5pbWFnZXMpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuaW5maW5pdHlNb3ZlIHx8IHRoaXMuX3NlbGVjdGVkSW5kZXggPCB0aGlzLmltYWdlcy5sZW5ndGggLSAxO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2FuU2hvd1ByZXYoKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5pbWFnZXMpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuaW5maW5pdHlNb3ZlIHx8IHRoaXMuX3NlbGVjdGVkSW5kZXggPiAwO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0U2FmZVVybChpbWFnZTogc3RyaW5nIHwgU2FmZVJlc291cmNlVXJsKTogU2FmZVN0eWxlIHtcclxuICAgIHJldHVybiB0aGlzLnNhbml0aXphdGlvbi5ieXBhc3NTZWN1cml0eVRydXN0U3R5bGUodGhpcy5oZWxwZXJTZXJ2aWNlLmdldEJhY2tncm91bmRVcmwoaW1hZ2UudG9TdHJpbmcoKSkpO1xyXG4gIH1cclxuXHJcbiAgZ2V0RmlsZVR5cGUoZmlsZVNvdXJjZTogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4gdGhpcy5oZWxwZXJTZXJ2aWNlLmdldEZpbGVUeXBlKGZpbGVTb3VyY2UpO1xyXG4gIH1cclxuXHJcbiAgb25TdGFydChldmVudDogQW5pbWF0aW9uRXZlbnQpIHtcclxuICAgIHRoaXMuaXNBbmltYXRpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5hbmltYXRpbmcuZW1pdCh0cnVlKTtcclxuICB9XHJcblxyXG4gIG9uRG9uZShldmVudDogQW5pbWF0aW9uRXZlbnQpIHtcclxuICAgIHRoaXMuaXNBbmltYXRpbmcgPSBmYWxzZTtcclxuICAgIHRoaXMuYW5pbWF0aW5nLmVtaXQoZmFsc2UpO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwibmd4LWdhbGxlcnktaW1hZ2Utd3JhcHBlciBuZ3gtZ2FsbGVyeS1hbmltYXRpb24te3thbmltYXRpb259fSBuZ3gtZ2FsbGVyeS1pbWFnZS1zaXplLXt7c2l6ZX19XCI+XHJcbiAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaW1hZ2Ugb2YgZ2V0SW1hZ2VzKCk7IGxldCBpID0gaW5kZXg7XCI+XHJcblxyXG4gICAgPGRpdiAqbmdJZj1cImltYWdlLnR5cGUgPT09ICdpbWFnZScgJiYgaW1hZ2UuaW5kZXggPT09IF9zZWxlY3RlZEluZGV4XCIgY2xhc3M9XCJuZ3gtZ2FsbGVyeS1pbWFnZVwiXHJcbiAgICAgICAgIFtuZ0NsYXNzXT1cInsnbmd4LWdhbGxlcnktY2xpY2thYmxlJzogY2xpY2thYmxlIH1cIlxyXG4gICAgICAgICBbc3R5bGUuYmFja2dyb3VuZC1pbWFnZV09XCJnZXRTYWZlVXJsKGltYWdlLnNyYylcIlxyXG4gICAgICAgICAoY2xpY2spPVwiaGFuZGxlQ2xpY2soJGV2ZW50LCBpbWFnZS5pbmRleClcIlxyXG4gICAgICAgICBbQGFuaW1hdGlvbl09XCJhY3Rpb25cIlxyXG4gICAgICAgICAoQGFuaW1hdGlvbi5zdGFydCk9XCJvblN0YXJ0KCRldmVudClcIlxyXG4gICAgICAgICAoQGFuaW1hdGlvbi5kb25lKT1cIm9uRG9uZSgkZXZlbnQpXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJuZ3gtZ2FsbGVyeS1pY29ucy13cmFwcGVyXCI+XHJcbiAgICAgICAgPG5neC1nYWxsZXJ5LWFjdGlvbiAqbmdGb3I9XCJsZXQgYWN0aW9uIG9mIGFjdGlvbnNcIiBbaWNvbl09XCJhY3Rpb24uaWNvblwiIFtkaXNhYmxlZF09XCJhY3Rpb24uZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlVGV4dF09XCJhY3Rpb24udGl0bGVUZXh0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbG9zZUNsaWNrKT1cImFjdGlvbi5vbkNsaWNrKCRldmVudCwgaW1hZ2UuaW5kZXgpXCI+PC9uZ3gtZ2FsbGVyeS1hY3Rpb24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibmd4LWdhbGxlcnktaW1hZ2UtdGV4dFwiICpuZ0lmPVwic2hvd0Rlc2NyaXB0aW9uICYmIGRlc2NyaXB0aW9uc1tpbWFnZS5pbmRleF1cIlxyXG4gICAgICAgICAgW2lubmVySFRNTF09XCJkZXNjcmlwdGlvbnNbaW1hZ2UuaW5kZXhdXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPjwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiAqbmdJZj1cImltYWdlLnR5cGUgPT09ICd2aWRlbycgJiYgaW1hZ2UuaW5kZXggPT09IF9zZWxlY3RlZEluZGV4XCIgY2xhc3M9XCJuZ3gtZ2FsbGVyeS1pbWFnZVwiXHJcbiAgICAgICAgIFtuZ0NsYXNzXT1cInsnbmd4LWdhbGxlcnktY2xpY2thYmxlJzogY2xpY2thYmxlIH1cIlxyXG4gICAgICAgICBbc3R5bGUuYmFja2dyb3VuZC1pbWFnZV09XCJnZXRTYWZlVXJsKGltYWdlLnNyYylcIlxyXG4gICAgICAgICAoY2xpY2spPVwiaGFuZGxlQ2xpY2soJGV2ZW50LCBpbWFnZS5pbmRleClcIlxyXG4gICAgICAgICBbQGFuaW1hdGlvbl09XCJhY3Rpb25cIlxyXG4gICAgICAgICAoQGFuaW1hdGlvbi5zdGFydCk9XCJvblN0YXJ0KCRldmVudClcIlxyXG4gICAgICAgICAoQGFuaW1hdGlvbi5kb25lKT1cIm9uRG9uZSgkZXZlbnQpXCI+XHJcbiAgICAgIDx2aWRlbyBjb250cm9scyBzdHlsZT1cIndpZHRoOjEwMCU7IGhlaWdodDoxMDAlOyBiYWNrZ3JvdW5kOiAjMDAwO1wiPlxyXG4gICAgICAgIDxzb3VyY2UgW3NyY109XCJpbWFnZS5zcmNcIj5cclxuICAgICAgICAgIFlvdXIgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IHRoZSB2aWRlbyB0YWcuXHJcbiAgICAgIDwvdmlkZW8+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJuZ3gtZ2FsbGVyeS1pY29ucy13cmFwcGVyXCI+XHJcbiAgICAgIDxuZ3gtZ2FsbGVyeS1hY3Rpb24gKm5nRm9yPVwibGV0IGFjdGlvbiBvZiBhY3Rpb25zXCIgW2ljb25dPVwiYWN0aW9uLmljb25cIiBbZGlzYWJsZWRdPVwiYWN0aW9uLmRpc2FibGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbdGl0bGVUZXh0XT1cImFjdGlvbi50aXRsZVRleHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjbG9zZUNsaWNrKT1cImFjdGlvbi5vbkNsaWNrKCRldmVudCwgaW1hZ2UuaW5kZXgpXCI+PC9uZ3gtZ2FsbGVyeS1hY3Rpb24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibmd4LWdhbGxlcnktaW1hZ2UtdGV4dFwiICpuZ0lmPVwic2hvd0Rlc2NyaXB0aW9uICYmIGRlc2NyaXB0aW9uc1tpbWFnZS5pbmRleF1cIlxyXG4gICAgICAgICAgW2lubmVySFRNTF09XCJkZXNjcmlwdGlvbnNbaW1hZ2UuaW5kZXhdXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPjwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcblxyXG4gIDwvbmctY29udGFpbmVyPlxyXG4gIDxuZ3gtZ2FsbGVyeS1idWxsZXRzICpuZ0lmPVwiYnVsbGV0c1wiIFtjb3VudF09XCJpbWFnZXMubGVuZ3RoXCIgW2FjdGl2ZV09XCJfc2VsZWN0ZWRJbmRleFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgKGJ1bGxldENoYW5nZSk9XCJzaG93KCRldmVudClcIj48L25neC1nYWxsZXJ5LWJ1bGxldHM+XHJcbiAgPG5neC1nYWxsZXJ5LWFycm93cyBjbGFzcz1cIm5neC1nYWxsZXJ5LWltYWdlLXNpemUte3tzaXplfX1cIiAqbmdJZj1cImFycm93c1wiIChwcmV2Q2xpY2spPVwic2hvd1ByZXYoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAobmV4dENsaWNrKT1cInNob3dOZXh0KClcIiBbcHJldkRpc2FibGVkXT1cIiFjYW5TaG93UHJldigpXCIgW25leHREaXNhYmxlZF09XCIhY2FuU2hvd05leHQoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbYXJyb3dQcmV2SWNvbl09XCJhcnJvd1ByZXZJY29uXCIgW2Fycm93TmV4dEljb25dPVwiYXJyb3dOZXh0SWNvblwiPjwvbmd4LWdhbGxlcnktYXJyb3dzPlxyXG48L2Rpdj5cclxuIl19