UNPKG

ng-cw-v12

Version:

Angular UI component library

669 lines 126 kB
import { Component, Input, ViewChild, HostListener } from '@angular/core';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
export class GalleriaComponent {
    constructor() {
        /** 图片数组 */
        this._images = [];
        /** 组件宽度 */
        this.ncWidth = '100%';
        /** 组件高度 */
        this.ncHeight = '100%';
        /** 缩略图宽度 */
        this.ncThumbnailWidth = 80;
        /** 缩略图高度 */
        this.ncThumbnailHeight = 60;
        /** 图片适应方式 */
        this.ncObjectFit = 'contain';
        /** 自动播放 */
        this._autoPlay = false;
        /** 自动播放间隔 */
        this.ncAutoPlayInterval = 3000;
        /** 显示缩略图 */
        this._showThumbnails = true;
        /** 显示指示器 */
        this._showIndicators = false;
        /** 指示器显示位置 */
        this.ncIndicatorsPosition = 'outside';
        /** 显示导航按钮 */
        this._showNavButtons = false;
        /** 导航按钮显示方式 */
        this.ncNavButtonsDisplay = 'always';
        /** 启用全屏预览 */
        this._enableFullscreen = false;
        /** 全屏按钮显示方式 */
        this.ncFullscreenButtonDisplay = 'always';
        /** 显示图片数目 */
        this._showIndex = false;
        /** 显示图片标题 */
        this._showTitle = false;
        /** 滚轮缩放 */
        this._wheelScale = false;
        this.currentIndex = 0;
        this.thumbnailStartIndex = 0;
        this.thumbnailTransform = 0; // 缩略图滚动偏移量
        this.isFullscreen = false; // 全屏状态
        this.isFullscreenAutoPlaying = false; // 全屏模式下的自动播放状态
        // 全屏缩放相关属性
        this.fullscreenScale = 1; // 当前缩放比例
        this.fullscreenTranslateX = 0; // X轴偏移
        this.fullscreenTranslateY = 0; // Y轴偏移
        this.minScale = 0.5; // 最小缩放比例
        this.maxScale = 3; // 最大缩放比例
        this.isDragging = false; // 是否正在拖拽
        this.lastMouseX = 0; // 上次鼠标X位置
        this.lastMouseY = 0; // 上次鼠标Y位置
        this.actualContainerWidth = 0;
    }
    set ncImages(value) {
        // 如果传入的是string[],转换为NcGalleriaImage[]
        if (value && value.length > 0 && typeof value[0] === 'string') {
            this._images = value.map(src => ({
                src: src,
                title: ''
            }));
        }
        else {
            this._images = value;
        }
        setTimeout(() => {
            this.updateActualContainerWidth();
            this.init();
        });
    }
    get ncImages() {
        return this._images;
    }
    set ncAutoPlay(val) {
        this._autoPlay = val !== null && val !== undefined && val !== false && val !== 'false';
    }
    get ncAutoPlay() {
        return this._autoPlay;
    }
    set ncShowThumbnails(val) {
        this._showThumbnails = val !== null && val !== undefined && val !== false && val !== 'false';
    }
    get ncShowThumbnails() {
        return this._showThumbnails;
    }
    set ncShowIndicators(val) {
        this._showIndicators = val !== null && val !== undefined && val !== false && val !== 'false';
    }
    get ncShowIndicators() {
        return this._showIndicators;
    }
    set ncShowNavButtons(val) {
        this._showNavButtons = val !== null && val !== undefined && val !== false && val !== 'false';
    }
    get ncShowNavButtons() {
        return this._showNavButtons;
    }
    set ncEnableFullscreen(val) {
        this._enableFullscreen = val !== null && val !== undefined && val !== false && val !== 'false';
    }
    get ncEnableFullscreen() {
        return this._enableFullscreen;
    }
    set ncShowIndex(val) {
        this._showIndex = val !== null && val !== undefined && val !== false && val !== 'false';
    }
    get ncShowIndex() {
        return this._showIndex;
    }
    set ncShowTitle(val) {
        this._showTitle = val !== null && val !== undefined && val !== false && val !== 'false';
    }
    get ncShowTitle() {
        return this._showTitle;
    }
    set ncWheelScale(val) {
        this._wheelScale = val !== null && val !== undefined && val !== false && val !== 'false';
    }
    get ncWheelScale() {
        return this._wheelScale;
    }
    // 计算缩略图实际宽度(包含gap)
    get thumbnailActualWidth() {
        return this.ncThumbnailWidth + 8; // 8px gap
    }
    // 计算实际可显示的缩略图数量
    get actualVisibleThumbnailCount() {
        // 边界保护:如果没有图片,返回0
        if (!this.ncImages || this.ncImages.length === 0) {
            return 0;
        }
        let containerWidth = 0;
        if (this.ncWidth && this.ncWidth.includes('px')) {
            // 如果设置了具体像素宽度
            containerWidth = parseInt(this.ncWidth.replace('px', ''));
        }
        else if (this.actualContainerWidth > 0) {
            // 如果是百分比宽度,使用实际测量的宽度
            containerWidth = this.actualContainerWidth;
        }
        else {
            // 如果还没有测量到实际宽度,先返回图片数量(避免初始化时的问题)
            return this.ncImages.length;
        }
        // 边界保护:确保容器宽度和缩略图宽度都是正数
        if (containerWidth <= 0 || this.thumbnailActualWidth <= 0) {
            return 1;
        }
        // 减去左右滚动按钮的宽度(32px + 8px gap)× 2 = 80px,再减去容器padding
        const availableWidth = containerWidth - 80 - 32; // 额外减去32px的padding
        // 边界保护:确保可用宽度为正数
        if (availableWidth <= 0) {
            return 1;
        }
        const visibleCount = Math.floor(availableWidth / this.thumbnailActualWidth);
        // 确保至少显示1个,最多不超过图片总数
        return Math.max(1, Math.min(visibleCount, this.ncImages.length));
    }
    // 判断缩略图是否应该居中显示
    get shouldCenterThumbnails() {
        return this.ncImages.length <= this.actualVisibleThumbnailCount;
    }
    // 计算缩略图最大滚动距离
    getMaxThumbnailScroll() {
        const actualVisibleCount = this.actualVisibleThumbnailCount;
        if (this.ncImages.length <= actualVisibleCount) {
            return 0;
        }
        // 计算总宽度减去实际可见区域宽度
        const totalWidth = this.ncImages.length * this.thumbnailActualWidth;
        const visibleWidth = actualVisibleCount * this.thumbnailActualWidth;
        return -(totalWidth - visibleWidth);
    }
    ngOnInit() {
    }
    ngAfterViewInit() {
        // 获取实际的容器宽度
        this.updateActualContainerWidth();
    }
    updateActualContainerWidth() {
        if (this.galleriaContainer && this.galleriaContainer.nativeElement) {
            const newWidth = this.galleriaContainer.nativeElement.offsetWidth;
            // 只有当宽度真正发生变化时才更新
            if (newWidth !== this.actualContainerWidth) {
                const oldVisibleCount = this.actualVisibleThumbnailCount;
                this.actualContainerWidth = newWidth;
                const newVisibleCount = this.actualVisibleThumbnailCount;
                // 如果可显示数量发生变化,重新调整缩略图视图
                if (oldVisibleCount !== newVisibleCount) {
                    this.updateThumbnailView();
                }
            }
        }
    }
    init() {
        //先删除autoPlayTimer定时器,防止ncImages更换时重复autoPlayTimer
        if (this.autoPlayTimer) {
            clearInterval(this.autoPlayTimer);
            this.autoPlayTimer = null;
        }
        if (this.ncAutoPlay && this.ncImages.length > 1) {
            this.startAutoPlay();
        }
    }
    ngOnDestroy() {
        this.stopAutoPlay();
        // 清理resize定时器
        if (this.resizeTimeout) {
            clearTimeout(this.resizeTimeout);
        }
        // 如果组件销毁时还在全屏状态,恢复页面滚动
        if (this.isFullscreen) {
            document.body.style.overflow = '';
        }
    }
    // 选择图片
    selectImage(index) {
        if (index >= 0 && index < this.ncImages.length) {
            this.currentIndex = index;
            this.updateThumbnailView();
            // 切换图片时重置缩放状态
            this.resetFullscreenZoom();
        }
    }
    // 重置全屏缩放状态
    resetFullscreenZoom() {
        this.fullscreenScale = 1;
        this.fullscreenTranslateX = 0;
        this.fullscreenTranslateY = 0;
    }
    // 上一张图片
    previousImage() {
        this.currentIndex = this.currentIndex > 0 ? this.currentIndex - 1 : this.ncImages.length - 1;
        this.updateThumbnailView();
        // 切换图片时重置缩放状态
        this.resetFullscreenZoom();
    }
    // 下一张图片
    nextImage() {
        this.currentIndex = this.currentIndex < this.ncImages.length - 1 ? this.currentIndex + 1 : 0;
        this.updateThumbnailView();
        // 切换图片时重置缩放状态
        this.resetFullscreenZoom();
    }
    // 更新缩略图视图
    updateThumbnailView() {
        const actualVisibleCount = this.actualVisibleThumbnailCount;
        if (this.ncImages.length <= actualVisibleCount) {
            this.thumbnailStartIndex = 0;
            this.thumbnailTransform = 0;
            return;
        }
        // 根据缩略图数量决定滚动策略
        const triggerIndex = Math.max(2, actualVisibleCount - 2);
        if (this.currentIndex < triggerIndex) {
            // 前面几张图片时,缩略图位置不变
            this.thumbnailStartIndex = 0;
        }
        else if (this.currentIndex >= this.ncImages.length - Math.floor(actualVisibleCount / 2)) {
            // 最后几张图片时,显示最后几张缩略图
            this.thumbnailStartIndex = this.ncImages.length - actualVisibleCount;
        }
        else {
            // 中间部分,让当前图片居中或接近居中显示
            const centerOffset = Math.floor(actualVisibleCount / 2);
            this.thumbnailStartIndex = this.currentIndex - centerOffset;
        }
        // 确保不超出边界
        this.thumbnailStartIndex = Math.max(0, Math.min(this.thumbnailStartIndex, this.ncImages.length - actualVisibleCount));
        // 计算transform偏移量
        this.thumbnailTransform = -this.thumbnailStartIndex * this.thumbnailActualWidth;
        // 确保不超出最大滚动范围
        const maxScroll = this.getMaxThumbnailScroll();
        this.thumbnailTransform = Math.max(maxScroll, this.thumbnailTransform);
    }
    // 缩略图向左滚动
    scrollThumbnailsLeft() {
        if (this.canScrollLeft()) {
            // 每次滚动一个缩略图的宽度
            this.thumbnailTransform += this.thumbnailActualWidth;
            // 确保不超出左边界
            this.thumbnailTransform = Math.min(0, this.thumbnailTransform);
            // 更新thumbnailStartIndex以保持一致性
            this.thumbnailStartIndex = Math.max(0, Math.round(-this.thumbnailTransform / this.thumbnailActualWidth));
        }
    }
    // 缩略图向右滚动
    scrollThumbnailsRight() {
        if (this.canScrollRight()) {
            // 每次滚动一个缩略图的宽度
            this.thumbnailTransform -= this.thumbnailActualWidth;
            // 确保不超出右边界
            const maxScroll = this.getMaxThumbnailScroll();
            this.thumbnailTransform = Math.max(maxScroll, this.thumbnailTransform);
            // 更新thumbnailStartIndex以保持一致性
            this.thumbnailStartIndex = Math.max(0, Math.round(-this.thumbnailTransform / this.thumbnailActualWidth));
        }
    }
    // 是否可以向左滚动缩略图
    canScrollLeft() {
        return this.thumbnailTransform < 0;
    }
    // 是否可以向右滚动缩略图
    canScrollRight() {
        if (this.ncImages.length <= this.actualVisibleThumbnailCount) {
            return false;
        }
        const maxScroll = this.getMaxThumbnailScroll();
        return this.thumbnailTransform > maxScroll;
    }
    // 开始自动播放
    startAutoPlay() {
        this.autoPlayTimer = setInterval(() => {
            this.nextImage();
        }, this.ncAutoPlayInterval);
    }
    // 停止自动播放
    stopAutoPlay() {
        if (this.autoPlayTimer) {
            clearInterval(this.autoPlayTimer);
            this.autoPlayTimer = null;
        }
    }
    // 鼠标进入时暂停自动播放
    onMouseEnter() {
        // 如果在全屏模式下,不要自动暂停播放,让用户手动控制
        if (this.isFullscreen) {
            return;
        }
        if (this.ncAutoPlay) {
            this.stopAutoPlay();
        }
    }
    // 鼠标离开时恢复自动播放
    onMouseLeave() {
        // 如果在全屏模式下,不要自动恢复播放,让用户手动控制
        if (this.isFullscreen) {
            return;
        }
        if (this.ncAutoPlay && this.ncImages.length > 1) {
            this.startAutoPlay();
        }
    }
    // 监听窗口大小变化
    onWindowResize(event) {
        // 使用防抖处理,避免频繁计算
        if (this.resizeTimeout) {
            clearTimeout(this.resizeTimeout);
        }
        this.resizeTimeout = setTimeout(() => {
            this.updateActualContainerWidth();
        }, 150); // 150ms防抖延迟
    }
    // 键盘导航支持
    onKeyDown(event) {
        if (!this.ncImages || this.ncImages.length <= 1) {
            return;
        }
        switch (event.key) {
            case 'ArrowLeft':
                event.preventDefault();
                this.previousImage();
                break;
            case 'ArrowRight':
                event.preventDefault();
                this.nextImage();
                break;
            case 'Home':
                event.preventDefault();
                this.selectImage(0);
                break;
            case 'End':
                event.preventDefault();
                this.selectImage(this.ncImages.length - 1);
                break;
        }
    }
    // 图片加载错误处理
    onImageError(event) {
        // 防止错误图片再次触发错误事件
        if (event.target.src.startsWith('data:image/svg+xml')) {
            return;
        }
        console.warn('图片加载失败:', event.target.src);
        // 使用SVG占位图
        const errorSvg = this.createErrorImageSvg(400, 300);
        event.target.src = errorSvg;
        event.target.style.objectFit = 'contain';
    }
    // 缩略图加载错误处理
    onThumbnailError(event) {
        // 防止错误图片再次触发错误事件
        if (event.target.src.startsWith('data:image/svg+xml')) {
            return;
        }
        console.warn('缩略图加载失败:', event.target.src);
        // 使用SVG占位图
        const errorSvg = this.createErrorImageSvg(this.ncThumbnailWidth, this.ncThumbnailHeight);
        event.target.src = errorSvg;
        event.target.style.objectFit = 'contain';
    }
    // 创建错误图片的SVG占位图
    createErrorImageSvg(width, height) {
        const svg = `
      <svg width="${width}" height="${height}" viewBox="0 0 ${width} ${height}" xmlns="http://www.w3.org/2000/svg">
        <rect width="100%" height="100%" fill="#f8f9fa" stroke="#dee2e6" stroke-width="2"/>
        <g transform="translate(${width / 2}, ${height / 2})">
          <!-- 破损图片图标 -->
          <g transform="translate(-24, -24)">
            <rect x="4" y="4" width="40" height="32" rx="2" fill="none" stroke="#6c757d" stroke-width="2"/>
            <circle cx="14" cy="14" r="2" fill="#6c757d"/>
            <path d="M44 28L36 20L24 32L16 24L4 36" stroke="#6c757d" stroke-width="2" fill="none"/>
            <!-- X 标记 -->
            <line x1="32" y1="8" x2="40" y2="16" stroke="#dc3545" stroke-width="2"/>
            <line x1="40" y1="8" x2="32" y2="16" stroke="#dc3545" stroke-width="2"/>
          </g>
          <!-- 错误文字 -->
          <text x="0" y="32" text-anchor="middle" fill="#6c757d" font-family="Arial, sans-serif" font-size="12">
            图片加载失败
          </text>
        </g>
      </svg>
    `;
        // 使用现代方法:直接URL编码,无需base64
        return 'data:image/svg+xml,' + encodeURIComponent(svg);
    }
    // 打开全屏预览
    openFullscreen() {
        if (this.ncEnableFullscreen) {
            this.isFullscreen = true;
            // 阻止页面滚动
            document.body.style.overflow = 'hidden';
            // 重置缩放状态
            this.resetFullscreenZoom();
            // 检查当前是否有自动播放在运行
            const wasAutoPlaying = !!this.autoPlayTimer;
            // console.log('打开全屏,当前自动播放状态:', wasAutoPlaying);
            // 如果原本有自动播放,在全屏模式下继续播放
            if (this.ncAutoPlay && this.ncImages.length > 1) {
                this.isFullscreenAutoPlaying = wasAutoPlaying;
                // 如果之前没有在播放,需要启动
                if (!wasAutoPlaying) {
                    this.startAutoPlay();
                    this.isFullscreenAutoPlaying = true;
                }
            }
        }
    }
    // 关闭全屏预览
    closeFullscreen() {
        this.isFullscreen = false;
        this.isFullscreenAutoPlaying = false;
        // 恢复页面滚动
        document.body.style.overflow = '';
        // 重置缩放状态
        this.resetFullscreenZoom();
        //先删除autoPlayTimer定时器,防止恢复自动播放时重复autoPlayTimer
        if (this.autoPlayTimer) {
            clearInterval(this.autoPlayTimer);
            this.autoPlayTimer = null;
        }
        // 退出全屏时恢复自动播放
        if (this.ncAutoPlay && this.ncImages.length > 1) {
            this.startAutoPlay();
        }
    }
    // 全屏模式下切换自动播放
    toggleFullscreenAutoPlay() {
        if (!this.isFullscreen || this.ncImages.length <= 1) {
            return;
        }
        // console.log('切换前状态:', this.isFullscreenAutoPlaying, '定时器:', !!this.autoPlayTimer);
        if (this.isFullscreenAutoPlaying) {
            this.stopAutoPlay();
            this.isFullscreenAutoPlaying = false;
            // console.log('已暂停自动播放');
        }
        else {
            this.startAutoPlay();
            this.isFullscreenAutoPlaying = true;
            // console.log('已开始自动播放');
        }
    }
    // 全屏模式下的键盘事件处理
    onFullscreenKeyDown(event) {
        if (!this.isFullscreen)
            return;
        switch (event.key) {
            case 'Escape':
                event.preventDefault();
                this.closeFullscreen();
                break;
            case 'ArrowLeft':
                event.preventDefault();
                this.previousImage();
                break;
            case 'ArrowRight':
                event.preventDefault();
                this.nextImage();
                break;
            case ' ': // 空格键
                event.preventDefault();
                if (this.ncAutoPlay) {
                    this.toggleFullscreenAutoPlay();
                }
                break;
        }
    }
    // 全屏模式下的滚轮缩放事件
    onFullscreenWheel(event) {
        if (!this.isFullscreen || !this.ncWheelScale) {
            return;
        }
        event.preventDefault();
        event.stopPropagation();
        const delta = event.deltaY;
        const scaleStep = 0.1;
        const rect = event.target.getBoundingClientRect();
        // 计算鼠标相对于图片的位置
        const mouseX = event.clientX - rect.left - rect.width / 2;
        const mouseY = event.clientY - rect.top - rect.height / 2;
        const oldScale = this.fullscreenScale;
        // 计算新的缩放比例
        if (delta < 0) {
            // 向上滚动,放大
            this.fullscreenScale = Math.min(this.maxScale, this.fullscreenScale + scaleStep);
        }
        else {
            // 向下滚动,缩小
            this.fullscreenScale = Math.max(this.minScale, this.fullscreenScale - scaleStep);
        }
        // 如果缩放比例发生了变化,调整偏移量以保持鼠标位置不变
        if (this.fullscreenScale !== oldScale) {
            const scaleRatio = this.fullscreenScale / oldScale;
            // 调整偏移量,使缩放以鼠标位置为中心
            this.fullscreenTranslateX = mouseX + (this.fullscreenTranslateX - mouseX) * scaleRatio;
            this.fullscreenTranslateY = mouseY + (this.fullscreenTranslateY - mouseY) * scaleRatio;
            // 限制偏移量范围
            this.constrainTranslation();
        }
    }
    // 全屏模式下的鼠标按下事件(开始拖拽)
    onFullscreenMouseDown(event) {
        if (!this.isFullscreen || !this.ncWheelScale || this.fullscreenScale <= 1) {
            return;
        }
        event.preventDefault();
        this.isDragging = true;
        this.lastMouseX = event.clientX;
        this.lastMouseY = event.clientY;
        // 改变鼠标样式
        document.body.style.cursor = 'grabbing';
    }
    // 全屏模式下的鼠标移动事件(拖拽中)
    onFullscreenMouseMove(event) {
        if (!this.isFullscreen || !this.ncWheelScale || !this.isDragging) {
            return;
        }
        event.preventDefault();
        const deltaX = event.clientX - this.lastMouseX;
        const deltaY = event.clientY - this.lastMouseY;
        this.fullscreenTranslateX += deltaX;
        this.fullscreenTranslateY += deltaY;
        // 限制偏移量范围
        this.constrainTranslation();
        this.lastMouseX = event.clientX;
        this.lastMouseY = event.clientY;
    }
    // 全屏模式下的鼠标松开事件(结束拖拽)
    onFullscreenMouseUp(event) {
        if (!this.isFullscreen || !this.ncWheelScale) {
            return;
        }
        this.isDragging = false;
        document.body.style.cursor = '';
    }
    // 限制图片偏移量范围
    constrainTranslation() {
        if (this.fullscreenScale <= 1) {
            this.fullscreenTranslateX = 0;
            this.fullscreenTranslateY = 0;
            return;
        }
        // 获取全屏图片的实际显示尺寸(考虑object-fit: contain)
        const viewportWidth = window.innerWidth * 0.9; // 90vw
        const viewportHeight = window.innerHeight * 0.9; // 90vh
        // 计算图片在当前缩放下超出视口的部分
        const scaledWidth = viewportWidth * this.fullscreenScale;
        const scaledHeight = viewportHeight * this.fullscreenScale;
        const maxTranslateX = Math.max(0, (scaledWidth - window.innerWidth) / 2);
        const maxTranslateY = Math.max(0, (scaledHeight - window.innerHeight) / 2);
        // 限制X轴偏移
        this.fullscreenTranslateX = Math.max(-maxTranslateX, Math.min(maxTranslateX, this.fullscreenTranslateX));
        // 限制Y轴偏移
        this.fullscreenTranslateY = Math.max(-maxTranslateY, Math.min(maxTranslateY, this.fullscreenTranslateY));
    }
    // 获取全屏图片的transform样式
    getFullscreenImageTransform() {
        // 先平移再缩放,这样平移的像素值不会被缩放影响
        return `translate(${this.fullscreenTranslateX}px, ${this.fullscreenTranslateY}px) scale(${this.fullscreenScale})`;
    }
    // 双击重置缩放
    onFullscreenDoubleClick(event) {
        if (!this.isFullscreen || !this.ncWheelScale) {
            return;
        }
        event.preventDefault();
        this.resetFullscreenZoom();
    }
}
GalleriaComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: GalleriaComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
GalleriaComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: GalleriaComponent, selector: "nc-galleria", inputs: { ncImages: "ncImages", ncWidth: "ncWidth", ncHeight: "ncHeight", ncThumbnailWidth: "ncThumbnailWidth", ncThumbnailHeight: "ncThumbnailHeight", ncObjectFit: "ncObjectFit", ncAutoPlay: "ncAutoPlay", ncAutoPlayInterval: "ncAutoPlayInterval", ncShowThumbnails: "ncShowThumbnails", ncShowIndicators: "ncShowIndicators", ncIndicatorsPosition: "ncIndicatorsPosition", ncShowNavButtons: "ncShowNavButtons", ncNavButtonsDisplay: "ncNavButtonsDisplay", ncEnableFullscreen: "ncEnableFullscreen", ncFullscreenButtonDisplay: "ncFullscreenButtonDisplay", ncShowIndex: "ncShowIndex", ncShowTitle: "ncShowTitle", ncWheelScale: "ncWheelScale" }, host: { listeners: { "window:resize": "onWindowResize($event)", "keydown": "onKeyDown($event)" } }, viewQueries: [{ propertyName: "galleriaContainer", first: true, predicate: ["galleriaContainer"], descendants: true }], ngImport: i0, template: "<div class=\"nc-galleria\" #galleriaContainer [style.width]=\"ncWidth\" [style.height]=\"ncHeight\"\r\n    (mouseenter)=\"onMouseEnter()\" (mouseleave)=\"onMouseLeave()\" tabindex=\"0\" role=\"img\"\r\n    [attr.aria-label]=\"'\u56FE\u7247\u753B\u5ECA\uFF0C\u5F53\u524D\u7B2C' + (currentIndex + 1) + '\u5F20\uFF0C\u5171' + ncImages.length + '\u5F20'\"\r\n    *ngIf=\"ncImages && ncImages.length > 0\">\r\n\r\n    <!-- \u4E3B\u56FE\u663E\u793A\u533A\u57DF -->\r\n    <div class=\"galleria-main\">\r\n        <div class=\"main-image-container\" [class.nav-hover-mode]=\"ncNavButtonsDisplay === 'hover'\"\r\n            [class.full-hover-mode]=\"ncFullscreenButtonDisplay === 'hover'\">\r\n            <img [src]=\"ncImages[currentIndex].src\" [style.object-fit]=\"ncObjectFit\" [alt]=\"'\u56FE\u7247 ' + (currentIndex + 1)\"\r\n                [class.clickable]=\"ncEnableFullscreen\" (error)=\"onImageError($event)\"\r\n                (click)=\"ncEnableFullscreen && openFullscreen()\" class=\"main-image\">\r\n\r\n            <!-- \u6570\u76EE\u4FE1\u606F -->\r\n            <div class=\"index-container\" *ngIf=\"ncShowIndex && ncImages.length > 1\">\r\n                {{currentIndex + 1}} / {{ncImages.length}}\r\n            </div>\r\n\r\n            <!-- \u6807\u9898\u4FE1\u606F -->\r\n            <div class=\"title-container\" *ngIf=\"ncShowTitle && ncImages[currentIndex].title\">\r\n                {{ncImages[currentIndex].title}}\r\n            </div>\r\n\r\n            <!-- \u5168\u5C4F\u6309\u94AE -->\r\n            <button class=\"fullscreen-button\" *ngIf=\"ncEnableFullscreen && ncFullscreenButtonDisplay !== 'hidden'\"\r\n                (click)=\"openFullscreen()\" [attr.aria-label]=\"'\u5168\u5C4F\u9884\u89C8'\">\r\n                <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\r\n                    <path\r\n                        d=\"M8 3H5a2 2 0 0 0-2 2v3m18 0V5a2 2 0 0 0-2-2h-3m0 18h3a2 2 0 0 0 2-2v-3M3 16v3a2 2 0 0 0 2 2h3\"\r\n                        stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                </svg>\r\n            </button>\r\n\r\n            <!-- \u5BFC\u822A\u6309\u94AE -->\r\n            <button class=\"nav-button nav-prev\" (click)=\"previousImage()\"\r\n                *ngIf=\"ncShowNavButtons && ncImages.length > 1\" [attr.aria-label]=\"'\u4E0A\u4E00\u5F20\u56FE\u7247'\">\r\n                <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\r\n                    <path d=\"M15 18L9 12L15 6\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                        stroke-linejoin=\"round\" />\r\n                </svg>\r\n            </button>\r\n\r\n            <button class=\"nav-button nav-next\" (click)=\"nextImage()\" *ngIf=\"ncShowNavButtons && ncImages.length > 1\"\r\n                [attr.aria-label]=\"'\u4E0B\u4E00\u5F20\u56FE\u7247'\">\r\n                <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\r\n                    <path d=\"M9 18L15 12L9 6\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                        stroke-linejoin=\"round\" />\r\n                </svg>\r\n            </button>\r\n\r\n            <!-- \u5185\u90E8\u6307\u793A\u5668 -->\r\n            <div class=\"indicators indicators-inside\"\r\n                *ngIf=\"ncShowIndicators && ncIndicatorsPosition === 'inside' && ncImages.length > 1\">\r\n                <span class=\"indicator\" *ngFor=\"let image of ncImages; let i = index\"\r\n                    [class.active]=\"i === currentIndex\" [attr.aria-label]=\"'\u8DF3\u8F6C\u5230\u7B2C' + (i + 1) + '\u5F20\u56FE\u7247'\" role=\"button\"\r\n                    tabindex=\"0\" (click)=\"selectImage(i)\" (keydown.enter)=\"selectImage(i)\"\r\n                    (keydown.space)=\"selectImage(i)\">\r\n                </span>\r\n            </div>\r\n        </div>\r\n    </div>\r\n\r\n    <!-- \u7F29\u7565\u56FE\u5BFC\u822A -->\r\n    <div class=\"galleria-thumbnails\" *ngIf=\"ncShowThumbnails && ncImages.length > 1\">\r\n        <div class=\"thumbnails-container\">\r\n            <!-- \u5DE6\u6EDA\u52A8\u6309\u94AE -->\r\n            <button class=\"scroll-button scroll-left\" (click)=\"scrollThumbnailsLeft()\"\r\n                *ngIf=\"!shouldCenterThumbnails && canScrollLeft()\" [attr.aria-label]=\"'\u5411\u5DE6\u6EDA\u52A8\u7F29\u7565\u56FE'\">\r\n                <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n                    <path d=\"M15 18L9 12L15 6\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                        stroke-linejoin=\"round\" />\r\n                </svg>\r\n            </button>\r\n\r\n            <!-- \u7F29\u7565\u56FE\u5217\u8868 -->\r\n            <div class=\"thumbnails-list-container\">\r\n                <div class=\"thumbnails-list\" [class.center-thumbnails]=\"shouldCenterThumbnails\"\r\n                    [style.transform]=\"shouldCenterThumbnails ? 'none' : 'translateX(' + thumbnailTransform + 'px)'\">\r\n                    <div class=\"thumbnail-item\" *ngFor=\"let image of ncImages; let i = index\"\r\n                        [class.active]=\"i === currentIndex\" [style.width.px]=\"ncThumbnailWidth\"\r\n                        [style.height.px]=\"ncThumbnailHeight\" [attr.aria-label]=\"'\u7F29\u7565\u56FE ' + (i + 1)\" role=\"button\"\r\n                        tabindex=\"0\" (click)=\"selectImage(i)\" (keydown.enter)=\"selectImage(i)\"\r\n                        (keydown.space)=\"selectImage(i)\">\r\n                        <img [src]=\"image.src\" [alt]=\"'\u7F29\u7565\u56FE ' + (i + 1)\" (error)=\"onThumbnailError($event)\"\r\n                            class=\"thumbnail-image\">\r\n                    </div>\r\n                </div>\r\n            </div>\r\n\r\n            <!-- \u53F3\u6EDA\u52A8\u6309\u94AE -->\r\n            <button class=\"scroll-button scroll-right\" (click)=\"scrollThumbnailsRight()\"\r\n                *ngIf=\"!shouldCenterThumbnails && canScrollRight()\" [attr.aria-label]=\"'\u5411\u53F3\u6EDA\u52A8\u7F29\u7565\u56FE'\">\r\n                <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n                    <path d=\"M9 18L15 12L9 6\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                        stroke-linejoin=\"round\" />\r\n                </svg>\r\n            </button>\r\n        </div>\r\n    </div>\r\n\r\n    <!-- \u5916\u90E8\u6307\u793A\u5668 -->\r\n    <div class=\"indicators indicators-outside\"\r\n        *ngIf=\"ncShowIndicators && ncIndicatorsPosition === 'outside' && ncImages.length > 1\"\r\n        [ngStyle]=\"{'margin-top': ncShowThumbnails ? '0' : '12px'}\">\r\n        <span class=\"indicator\" *ngFor=\"let image of ncImages; let i = index\" [class.active]=\"i === currentIndex\"\r\n            [attr.aria-label]=\"'\u8DF3\u8F6C\u5230\u7B2C' + (i + 1) + '\u5F20\u56FE\u7247'\" role=\"button\" tabindex=\"0\" (click)=\"selectImage(i)\"\r\n            (keydown.enter)=\"selectImage(i)\" (keydown.space)=\"selectImage(i)\">\r\n        </span>\r\n    </div>\r\n</div>\r\n\r\n<!-- \u7A7A\u72B6\u6001 -->\r\n<div class=\"galleria-empty\" [style.width]=\"ncWidth\" [style.height]=\"ncHeight\"\r\n    *ngIf=\"!ncImages || ncImages.length === 0\">\r\n    <div class=\"empty-content\">\r\n        <svg width=\"64\" height=\"64\" viewBox=\"0 0 24 24\" fill=\"none\" class=\"empty-icon\">\r\n            <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\" stroke=\"currentColor\" stroke-width=\"2\" />\r\n            <circle cx=\"8.5\" cy=\"8.5\" r=\"1.5\" stroke=\"currentColor\" stroke-width=\"2\" />\r\n            <polyline points=\"21,15 16,10 5,21\" stroke=\"currentColor\" stroke-width=\"2\" />\r\n        </svg>\r\n        <p>\u6682\u65E0\u56FE\u7247</p>\r\n    </div>\r\n</div>\r\n\r\n<!-- \u5168\u5C4F\u9884\u89C8\u6A21\u6001\u6846 -->\r\n<div class=\"fullscreen-modal\" *ngIf=\"isFullscreen\" (click)=\"closeFullscreen()\" (keydown)=\"onFullscreenKeyDown($event)\"\r\n    tabindex=\"0\">\r\n    <div class=\"fullscreen-content\" (click)=\"$event.stopPropagation()\">\r\n        <!-- \u5173\u95ED\u6309\u94AE -->\r\n        <button class=\"fullscreen-close\" (click)=\"closeFullscreen()\" [attr.aria-label]=\"'\u5173\u95ED\u5168\u5C4F'\">\r\n            <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\r\n                <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" stroke=\"currentColor\" stroke-width=\"2\" />\r\n                <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" stroke=\"currentColor\" stroke-width=\"2\" />\r\n            </svg>\r\n        </button>\r\n\r\n        <!-- \u64AD\u653E/\u6682\u505C\u6309\u94AE -->\r\n        <button class=\"fullscreen-play-pause\" *ngIf=\"ncAutoPlay && ncImages.length > 1\"\r\n            (click)=\"toggleFullscreenAutoPlay()\" [attr.aria-label]=\"isFullscreenAutoPlaying ? '\u6682\u505C\u81EA\u52A8\u64AD\u653E' : '\u5F00\u59CB\u81EA\u52A8\u64AD\u653E'\">\r\n            <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\"\r\n                *ngIf=\"!isFullscreenAutoPlaying\">\r\n                <!-- \u64AD\u653E\u56FE\u6807 -->\r\n                <polygon points=\"5,3 19,12 5,21\" fill=\"currentColor\" />\r\n            </svg>\r\n            <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\"\r\n                *ngIf=\"isFullscreenAutoPlaying\">\r\n                <!-- \u6682\u505C\u56FE\u6807 -->\r\n                <rect x=\"6\" y=\"4\" width=\"4\" height=\"16\" fill=\"currentColor\" />\r\n                <rect x=\"14\" y=\"4\" width=\"4\" height=\"16\" fill=\"currentColor\" />\r\n            </svg>\r\n        </button>\r\n\r\n        <!-- \u7F29\u653E\u63D0\u793A -->\r\n        <div class=\"fullscreen-zoom-hint\" *ngIf=\"ncWheelScale\">\r\n            <div class=\"zoom-hint-content\">\r\n                <span>\u6EDA\u8F6E\u7F29\u653E \u2022 \u62D6\u62FD\u5E73\u79FB \u2022 \u53CC\u51FB\u91CD\u7F6E</span>\r\n            </div>\r\n        </div>\r\n\r\n        <!-- \u5168\u5C4F\u56FE\u7247 -->\r\n        <img [src]=\"ncImages[currentIndex].src\" [alt]=\"'\u5168\u5C4F\u9884\u89C8 - \u56FE\u7247 ' + (currentIndex + 1)\" (error)=\"onImageError($event)\"\r\n            class=\"fullscreen-image\" [class.scalable]=\"ncWheelScale\"\r\n            [style.transform]=\"ncWheelScale ? getFullscreenImageTransform() : ''\"\r\n            [style.cursor]=\"ncWheelScale && fullscreenScale > 1 ? 'grab' : (ncWheelScale ? 'zoom-in' : '')\"\r\n            (wheel)=\"onFullscreenWheel($event)\" (mousedown)=\"onFullscreenMouseDown($event)\"\r\n            (mousemove)=\"onFullscreenMouseMove($event)\" (mouseup)=\"onFullscreenMouseUp($event)\"\r\n            (mouseleave)=\"onFullscreenMouseUp($event)\" (dblclick)=\"onFullscreenDoubleClick($event)\">\r\n\r\n        <!-- \u5168\u5C4F\u5BFC\u822A\u6309\u94AE -->\r\n        <button class=\"fullscreen-nav fullscreen-nav-prev\" (click)=\"previousImage()\" *ngIf=\"ncImages.length > 1\"\r\n            [attr.aria-label]=\"'\u4E0A\u4E00\u5F20\u56FE\u7247'\">\r\n            <svg width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\r\n                <path d=\"M15 18L9 12L15 6\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                    stroke-linejoin=\"round\" />\r\n            </svg>\r\n        </button>\r\n\r\n        <button class=\"fullscreen-nav fullscreen-nav-next\" (click)=\"nextImage()\" *ngIf=\"ncImages.length > 1\"\r\n            [attr.aria-label]=\"'\u4E0B\u4E00\u5F20\u56FE\u7247'\">\r\n            <svg width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\r\n                <path d=\"M9 18L15 12L9 6\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                    stroke-linejoin=\"round\" />\r\n            </svg>\r\n        </button>\r\n\r\n        <!-- \u5168\u5C4F\u6307\u793A\u5668 -->\r\n        <div class=\"fullscreen-indicators\" *ngIf=\"ncImages.length > 1\">\r\n            <span class=\"fullscreen-indicator\" *ngFor=\"let image of ncImages; let i = index\"\r\n                [class.active]=\"i === currentIndex\" [attr.aria-label]=\"'\u8DF3\u8F6C\u5230\u7B2C' + (i + 1) + '\u5F20\u56FE\u7247'\" role=\"button\"\r\n                tabindex=\"0\" (click)=\"selectImage(i)\" (keydown.enter)=\"selectImage(i)\" (keydown.space)=\"selectImage(i)\">\r\n            </span>\r\n        </div>\r\n\r\n        <!-- \u56FE\u7247\u4FE1\u606F -->\r\n        <div class=\"fullscreen-info\">\r\n            <span>{{currentIndex + 1}} / {{ncImages.length}}</span>\r\n            <span *ngIf=\"ncWheelScale\" class=\"zoom-status\">\r\n                {{ (fullscreenScale * 100).toFixed(0) }}%\r\n            </span>\r\n            <span *ngIf=\"ncAutoPlay && ncImages.length > 1\" class=\"autoplay-status\">\r\n                {{ isFullscreenAutoPlaying ? '\u81EA\u52A8\u64AD\u653E\u4E2D' : '\u5DF2\u6682\u505C' }}\r\n            </span>\r\n        </div>\r\n    </div>\r\n</div>", styles: [".nc-galleria{display:flex;flex-direction:column;background:#fff;box-shadow:0 4px 12px #0000001a;overflow:hidden;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.nc-galleria .galleria-main{position:relative;background:#f8f9fa;flex:1;min-height:0}.nc-galleria .galleria-main .main-image-container{position:relative;width:100%;height:100%;overflow:hidden;display:flex;align-items:center;justify-content:center;background-color:#e5e5e5}.nc-galleria .galleria-main .main-image-container .main-image{width:100%;height:100%;transition:opacity .3s ease;-webkit-user-select:none;user-select:none;-webkit-user-drag:none}.nc-galleria .galleria-main .main-image-container .main-image.clickable{cursor:pointer}.nc-galleria .galleria-main .main-image-container .nav-button{position:absolute;top:50%;transform:translateY(-50%);width:40px;height:40px;border:none;border-radius:50%;background:rgba(0,0,0,.4);color:#fff;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .3s ease;z-index:2;outline:none;-webkit-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent}.nc-galleria .galleria-main .main-image-container .nav-button:hover{background:rgba(0,0,0,.6);transform:translateY(-50%) scale(1.1)}.nc-galleria .galleria-main .main-image-container .nav-button:focus{outline:none}.nc-galleria .galleria-main .main-image-container .nav-button:active{outline:none;background:rgba(0,0,0,.9)}.nc-galleria .galleria-main .main-image-container .nav-button.nav-prev{left:16px}.nc-galleria .galleria-main .main-image-container .nav-button.nav-next{right:16px}.nc-galleria .galleria-main .main-image-container .nav-button svg{width:24px;height:24px}.nc-galleria .galleria-main .main-image-container.nav-hover-mode .nav-button{opacity:0;visibility:hidden;transition:all .3s ease}.nc-galleria .galleria-main .main-image-container.nav-hover-mode:hover .nav-button{opacity:1;visibility:visible}.nc-galleria .galleria-main .main-image-container .indicators-inside{position:absolute;bottom:16px;left:50%;transform:translate(-50%);display:flex;justify-content:center;grid-gap:6px;gap:6px;z-index:3}.nc-galleria .galleria-main .main-image-container .indicators-inside .indicator{width:10px;height:10px;border-radius:50%;background:rgba(255,255,255,.6);cursor:pointer;transition:all .2s ease;border:1px solid rgba(0,0,0,.2)}.nc-galleria .galleria-main .main-image-container .indicators-inside .indicator:hover{background:rgba(255,255,255,.8)}.nc-galleria .galleria-main .main-image-container .indicators-inside .indicator.active{background:#007bff;box-shadow:0 0 4px #0000004d}.nc-galleria .galleria-main .main-image-container .fullscreen-button{position:absolute;top:16px;right:16px;width:36px;height:36px;border:none;border-radius:6px;background:rgba(0,0,0,.6);color:#fff;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .3s ease;z-index:3;opacity:.8}.nc-galleria .galleria-main .main-image-container .fullscreen-button:hover{background:rgba(0,0,0,.8);opacity:1;transform:scale(1.05)}.nc-galleria .galleria-main .main-image-container.full-hover-mode .fullscreen-button{opacity:0;visibility:hidden;transition:all .3s ease}.nc-galleria .galleria-main .main-image-container.full-hover-mode:hover .fullscreen-button{opacity:1;visibility:visible}.nc-galleria .galleria-main .main-image-container .index-container{position:absolute;top:14px;left:50%;transform:translate(-50%);color:#fff;font-size:16px;background:rgba(0,0,0,.3);padding:2px 16px;border-radius:20px}.nc-galleria .galleria-main .main-image-container .title-container{position:absolute;bottom:10px;right:10px;color:#fff;font-size:16px;background:rgba(0,0,0,.5);padding:2px 16px;border-radius:20px}.nc-galleria .galleria-thumbnails{background:#fff;padding:16px;border-top:1px solid #e9ecef;flex-shrink:0}.nc-galleria .galleria-thumbnails .thumbnails-container{display:flex;align-items:center;grid-gap:8px;gap:8px;position:relative;width:100%}.nc-galleria .galleria-thumbnails .thumbnails-container .scroll-button{flex-shrink:0;width:32px;height:32px;border:1px solid #dee2e6;border-radius:4px;background:#fff;color:#6c757d;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s ease;outline:none;-webkit-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent}.nc-galleria .galleria-thumbnails .thumbnails-container .scroll-button:hover{background:#f8f9fa;border-color:#adb5bd;color:#495057}.nc-galleria .galleria-thumbnails .thumbnails-container .scroll-button:focus{outline:none}.nc-galleria .galleria-thumbnails .thumbnails-container .scroll-button:active{outline:none;background:#e9ecef}.nc-galleria .galleria-thumbnails .thumbnails-container .scroll-button svg{width:16px;height:16px}.nc-galleria .galleria-thumbnails .thumbnails-container .thumbnails-list-container{overflow:hidden;position:relative;flex:1;min-width:0}.nc-galleria .galleria-thumbnails .thumbnails-container .thumbnails-list{display:flex;align-items:center;grid-gap:8px;gap:8px;justify-content:flex-start;transition:transform .4s cubic-bezier(.25,.46,.45,.94);will-change:transform}.nc-galleria .galleria-thumbnails .thumbnails-container .thumbnails-list.center-thumbnails{justify-content:center}.nc-galleria .galleria-thumbnails .thumbnails-container .thumbnails-list .thumbnail-item{flex-shrink:0;border:2px solid transparent;border-radius:4px;overflow:hidden;cursor:pointer;transition:all .2s ease;position:relative;opacity:.6}.nc-galleria .galleria-thumbnails .thumbnails-container .thumbnails-list .thumbnail-item:hover{opacity:1}.nc-galleria .galleria-thumbnails .thumbnails-container .thumbnails-list .thumbnail-item.active{border-color:#007bff91;box-shadow:0 0 0 2px #fffc;opacity:1}.nc-galleria .galleria-thumbnails .thumbnails-container .thumbnails-list .thumbnail-item .thumbnail-image{width:100%;height:100%;object-fit:cover;display:block;-webkit-user-select:none;user-select:none;-webkit-user-drag:none}.nc-galleria .indicators-outside{display:flex;justify-content:center;grid-gap:6px;gap:6px;margin-bottom:12px}.nc-galleria .indicators-outside .indicator{width:10px;height:10px;border-radius:50%;background:#dee2e6;cursor:pointer;transition:all .2s ease}.nc-galleria .indicators-outside .indicator:hover{background:#adb5bd}.nc-galleria .indicators-outside .indicator.active{background:#007bff}.galleria-empty{display:flex;align-items:center;justify-content:center;background:#f8f9fa;border-radius:8px;border:2px dashed #dee2e6;box-sizing:border-box}.galleria-empty .empty-content{text-align:center;color:#6c757d}.galleria-empty .empty-content .empty-icon{margin-bottom:16px;opacity:.5}.galleria-empty .empty-content p{margin:0;font-size:16px}.fullscreen-modal{position:fixed;top:0;left:0;width:100vw;height:100vh;background:rgba(0,0,0,.95);z-index:9999;display:flex;align-items:center;justify-content:center;animation:fadeIn .3s ease}.fullscreen-modal .fullscreen-content{position:relative;width:100%;height:100%;display:flex;align-items:center;justify-content:center}.fullscreen-modal .fullscreen-close{position:absolute;top:20px;right:20px;width:44px;height:44px;border:none;border-radius:50%;background:rgba(255,255,255,.2);color:#fff;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .3s ease;z-index:10}.fullscreen-modal .fullscreen-close:hover{background:rgba(255,255,255,.3);transform:scale(1.1)}.fullscreen-modal .fullscreen-play-pause{position:absolute;top:20px;right:80px;width:44px;height:44px;border:none;border-radius:50%;background:rgba(255,255,255,.2);color:#fff;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .3s ease;z-index:10}.fullscreen-modal .fullscreen-play-pause:hover{background:rgba(255,255,255,.3);transform:scale(1.1)}.fullscreen-modal .fullscreen-zoom-hint{position:absolute;top:20px;left:20px;z-index:10;opacity:.7;animation:fadeInOut 4s ease-in-out}.fullscreen-modal .fullscreen-zoom-hint .zoom-hint-content{background:rgba(0,0,0,.6);color:#fff;padding:8px 16px;border-radius:20px;font-size:14px;white-space:nowrap}.fullscreen-modal .fullscreen-image{max-width:90vw;max-height:90vh;object-fit:contain;-webkit-user-select:none;user-select:none;-webkit-user-drag:none;transition:transform .1s ease-out;transform-origin:center center}.fullscreen-modal .fullscreen-nav{position:absolute;top:50%;transform:translateY(-50%);width:60px;height:60px;border:none;border-radius:50%;background:rgba(255,255,255,.2);color:#fff;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .3s ease;z-index:10}.fullscreen-modal .fullscreen-nav:hover{background:rgba(255,255,255,.3);transform:translateY(-50%) scale(1.1)}.fullscreen-modal .fullscreen-nav.fullscreen-nav-prev{left:30px}.fullscreen-modal .fullscreen-nav.fullscreen-nav-next{right:30px}.fullscreen-modal .fullscreen-indicators{position:absolute;bottom:30px;left:50%;transform:translate(-50%);display:flex;grid-gap:8px;gap:8px;z-index:10}.fullscreen-modal .fullscreen-indicators .fullscreen-indicator{width:12px;height:12px;border-radius:50%;background:rgba(255,255,255,.5);cursor:pointer;transition:all .3s ease}.fullscreen-modal .fullscreen-indicators .fullscreen-indicator:hover{background:rgba(255,255,255,.8);transform:scale(1.2)}.fullscreen-modal .fullscreen-indicators .fullscreen-indicator.active{background:white;transform:scale(1.3)}.fullscreen-modal .fullscreen-info{position:absolute;bottom:20px;right:20px;color:#fff;font-size:16px;background:rgba(0,0,0,.5);padding:8px 16px;border-radius:20px;z-index:10}.fullscreen-modal .fullscreen-info .zoom-status{margin-left:12px;font-size:14px;opacity:.8}.fullscreen-modal .fullscreen-info .zoom-status:before{content:\"\\2022\";margin-right:6px}.fullscreen-modal .fullscreen-info .autoplay-status{margin-left:12px;font-size:14px;opacity:.8}.fullscreen-modal .fullscreen-info .autoplay-status:before{content:\"\\2022\";margin-right:6px}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes fadeInOut{0%{opacity:0}10%{opacity:.7}90%{opacity:.7}to{opacity:0}}\n"], directives: [{ type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: GalleriaComponent, decorators: [{
            type: Component,
            args: [{
                    selector: 'nc-galleria',
                    templateUrl: './galleria.component.html',
                    styleUrls: ['./galleria.component.less']
                }]
        }], ctorParameters: function () { return []; }, propDecorators: { ncImages: [{
                type: Input
            }], ncWidth: [{
                type: Input
            }], ncHeight: [{
                type: Input
            }], ncThumbnailWidth: [{
                type: Input
            }], ncThumbnailHeight: [{
                type: Input
            }], ncObjectFit: [{
                type: Input
            }], ncAutoPlay: [{
                type: Input
            }], ncAutoPlayInterval: [{
                type: Input
            }], ncShowThumbnails: [{
                type: Input
            }], ncShowIndicators: [{
                type: Input
            }], ncIndicatorsPosition: [{
                type: Input
            }], ncShowNavButtons: [{
                type: Input
            }], ncNavButtonsDisplay: [{
                type: Input
            }], ncEnableFullscreen: [{
                type: Input
            }], ncFullscreenButtonDisplay: [{
                type: Input
            }], ncShowIndex: [{
                type: Input
            }], ncShowTitle: [{
                type: Input
            }], ncWheelScale: [{
                type: Input
            }], galleriaContainer: [{
                type: ViewChild,
                args: ['galleriaContainer', { static: false }]
            }], onWindowResize: [{
                type: HostListener,
                args: ['window:resize', ['$event']]
            }], onKeyDown: [{
                type: HostListener,
                args: ['keydown', ['$event']]
            }] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FsbGVyaWEuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9nYWxsZXJpYS9nYWxsZXJpYS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL2dhbGxlcmlhL2dhbGxlcmlhLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQXFCLEtBQUssRUFBRSxTQUFTLEVBQTZCLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQzs7O0FBWXhILE1BQU0sT0FBTyxpQkFBaUI7SUFvTTVCO1FBbk1BLFdBQVc7UUFDSCxZQUFPLEdBQXNCLEVBQUUsQ0FBQztRQW9CeEMsV0FBVztRQUNGLFlBQU8sR0FBVyxNQUFNLENBQUM7UUFDbEMsV0FBVztRQUNGLGFBQVEsR0FBVyxNQUFNLENBQUM7UUFDbkMsWUFBWTtRQUNILHFCQUFnQixHQUFXLEVBQUUsQ0FBQztRQUN2QyxZQUFZO1FBQ0gsc0JBQWlCLEdBQVcsRUFBRSxDQUFDO1FBQ3hDLGFBQWE7UUFDSixnQkFBVyxHQUFpQyxTQUFTLENBQUM7UUFDL0QsV0FBVztRQUNILGNBQVMsR0FBWSxLQUFLLENBQUM7UUFRbkMsYUFBYTtRQUNKLHVCQUFrQixHQUFXLElBQUksQ0FBQztRQUMzQyxZQUFZO1FBQ0osb0JBQWUsR0FBWSxJQUFJLENBQUM7UUFReEMsWUFBWTtRQUNKLG9CQUFlLEdBQVksS0FBSyxDQUFDO1FBUXpDLGNBQWM7UUFDTCx5QkFBb0IsR0FBeUIsU0FBUyxDQUFDO1FBQ2hFLGFBQWE7UUFDTCxvQkFBZSxHQUFZLEtBQUssQ0FBQztRQVF6QyxlQUFlO1FBQ04sd0JBQW1CLEdBQXVCLFFBQVEsQ0FBQztRQUM1RCxhQUFhO1FBQ0wsc0JBQWlCLEdBQVksS0FBSyxDQUFDO1FBUTNDLGVBQWU7UUFDTiw4QkFBeUIsR0FBa0MsUUFBUSxDQUFDO1FBQzdF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aWxkLCBFbGVtZW50UmVmLCBBZnRlclZpZXdJbml0LCBIb3N0TGlzdGVuZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTmNHYWxsZXJpYUltYWdlIHtcclxuICBzcmM6IHN0cmluZztcclxuICB0aXRsZT86IHN0cmluZztcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICduYy1nYWxsZXJpYScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2dhbGxlcmlhLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9nYWxsZXJpYS5jb21wb25lbnQubGVzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBHYWxsZXJpYUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBBZnRlclZpZXdJbml0IHtcclxuICAvKiog5Zu+54mH5pWw57uEICovXHJcbiAgcHJpdmF0ZSBfaW1hZ2VzOiBOY0dhbGxlcmlhSW1hZ2VbXSA9IFtdO1xyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IG5jSW1hZ2VzKHZhbHVlOiBzdHJpbmdbXSB8IE5jR2FsbGVyaWFJbWFnZVtdKSB7XHJcbiAgICAvLyDlpoLmnpzkvKDlhaXnmoTmmK9zdHJpbmdbXe+8jOi9rOaNouS4uk5jR2FsbGVyaWFJbWFnZVtdXHJcbiAgICBpZiAodmFsdWUgJiYgdmFsdWUubGVuZ3RoID4gMCAmJiB0eXBlb2YgdmFsdWVbMF0gPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIHRoaXMuX2ltYWdlcyA9ICh2YWx1ZSBhcyBzdHJpbmdbXSkubWFwKHNyYyA9PiAoe1xyXG4gICAgICAgIHNyYzogc3JjLFxyXG4gICAgICAgIHRpdGxlOiAnJ1xyXG4gICAgICB9KSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLl9pbWFnZXMgPSB2YWx1ZSBhcyBOY0dhbGxlcmlhSW1hZ2VbXTtcclxuICAgIH1cclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLnVwZGF0ZUFjdHVhbENvbnRhaW5lcldpZHRoKCk7XHJcbiAgICAgIHRoaXMuaW5pdCgpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIGdldCBuY0ltYWdlcygpOiBOY0dhbGxlcmlhSW1hZ2VbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5faW1hZ2VzO1xyXG4gIH1cclxuICAvKiog57uE5Lu25a695bqmICovXHJcbiAgQElucHV0KCkgbmNXaWR0aDogc3RyaW5nID0gJzEwMCUnO1xyXG4gIC8qKiDnu4Tku7bpq5jluqYgKi9cclxuICBASW5wdXQoKSBuY0hlaWdodDogc3RyaW5nID0gJzEwMCUnO1xyXG4gIC8qKiDnvKnnlaXlm77lrr3luqYgKi9cclxuICBASW5wdXQoKSBuY1RodW1ibmFpbFdpZHRoOiBudW1iZXIgPSA4MDtcclxuICAvKiog57yp55Wl5Zu+6auY5bqmICovXHJcbiAgQElucHV0KCkgbmNUaHVtYm5haWxIZWlnaHQ6IG51bWJlciA9IDYwO1xyXG4gIC8qKiDlm77niYfpgILlupTmlrnlvI8gKi9cclxuICBASW5wdXQoKSBuY09iamVjdEZpdDogJ2NvbnRhaW4nIHwgJ2NvdmVyJyB8ICdmaWxsJyA9ICdjb250YWluJztcclxuICAvKiog6Ieq5Yqo5pKt5pS+ICovXHJcbiAgcHJpdmF0ZSBfYXV0b1BsYXk6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKVxyXG4gIHNldCBuY0F1dG9QbGF5KHZhbDogYm9vbGVhbiB8IHN0cmluZykge1xyXG4gICAgdGhpcy5fYXV0b1BsYXkgPSB2YWwgIT09IG51bGwgJiYgdmFsICE9PSB1bmRlZmluZWQgJiYgdmFsICE9PSBmYWxzZSAmJiB2YWwgIT09ICdmYWxzZSc7XHJcbiAgfVxyXG4gIGdldCBuY0F1dG9QbGF5KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2F1dG9QbGF5O1xyXG4gIH1cclxuICAvKiog6Ieq5Yqo5pKt5pS+6Ze06ZqUICovXHJcbiAgQElucHV0KCkgbmNBdXRvUGxheUludGVydmFsOiBudW1iZXIgPSAzMDAwO1xyXG4gIC8qKiDmmL7npLrnvKnnlaXlm74gKi9cclxuICBwcml2YXRlIF9zaG93VGh1bWJuYWlsczogYm9vbGVhbiA9IHRydWU7XHJcbiAgQElucHV0KClcclxuICBzZXQgbmNTaG93VGh1bWJuYWlscyh2YWw6IGJvb2xlYW4gfCBzdHJpbmcpIHtcclxuICAgIHRoaXMuX3Nob3dUaHVtYm5haWxzID0gdmFsICE9PSBudWxsICYmIHZhbCAhPT0gdW5kZWZpbmVkICYmIHZhbCAhPT0gZmFsc2UgJiYgdmFsICE9PSAnZmFsc2UnO1xyXG4gIH1cclxuICBnZXQgbmNTaG93VGh1bWJuYWlscygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9zaG93VGh1bWJuYWlscztcclxuICB9XHJcbiAgLyoqIOaYvuekuuaMh+ekuuWZqCAqL1xyXG4gIHByaXZhdGUgX3Nob3dJbmRpY2F0b3JzOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KClcclxuICBzZXQgbmNTaG93SW5kaWNhdG9ycyh2YWw6IGJvb2xlYW4gfCBzdHJpbmcpIHtcclxuICAgIHRoaXMuX3Nob3dJbmRpY2F0b3JzID0gdmFsICE9PSBudWxsICYmIHZhbCAhPT0gdW5kZWZpbmVkICYmIHZhbCAhPT0gZmFsc2UgJiYgdmFsICE9PSAnZmFsc2UnO1xyXG4gIH1cclxuICBnZXQgbmNTaG93SW5kaWNhdG9ycygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9zaG93SW5kaWNhdG9ycztcclxuICB9XHJcbiAgLyoqIOaMh+ekuuWZqOaYvuekuuS9jee9riAqL1xyXG4gIEBJbnB1dCgpIG5jSW5kaWNhdG9yc1Bvc2l0aW9uOiAnaW5zaWRlJyB8ICdvdXRzaWRlJyA9ICdvdXRzaWRlJztcclxuICAvKiog5pi+56S65a+86Iiq5oyJ6ZKuICovXHJcbiAgcHJpdmF0ZSBfc2hvd05hdkJ1dHRvbnM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKVxyXG4gIHNldCBuY1Nob3dOYXZCdXR0b25zKHZhbDogYm9vbGVhbiB8IHN0cmluZykge1xyXG4gICAgdGhpcy5fc2hvd05hdkJ1dHRvbnMgPSB2YWwgIT09IG51bGwgJiYgdmFsICE9PSB1bmRlZmluZWQgJiYgdmFsICE9PSBmYWxzZSAmJiB2YWwgIT09ICdmYWxzZSc7XHJcbiAgfVxyXG4gIGdldCBuY1Nob3dOYXZCdXR0b25zKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3Nob3dOYXZCdXR0b25zO1xyXG4gIH1cclxuICAvKiog5a+86Iiq5oyJ6ZKu5pi+56S65pa55byPICovXHJcbiAgQElucHV0KCkgbmNOYXZCdXR0b25zRGlzcGxheTogJ2hvdmVyJyB8ICdhbHdheXMnID0gJ2Fsd2F5cyc7XHJcbiAgLyoqIOWQr+eUqOWFqOWxj+mihOiniCAqL1xyXG4gIHByaXZhdGUgX2VuYWJsZUZ1bGxzY3JlZW46IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKVxyXG4gIHNldCBuY0VuYWJsZUZ1bGxzY3JlZW4odmFsOiBib29sZWFuIHwgc3RyaW5nKSB7XHJcbiAgICB0aGlzLl9lbmFibGVGdWxsc2NyZWVuID0gdmFsICE9PSBudWxsICYmIHZhbCAhPT0gdW5kZWZpbmVkICYmIHZhbCAhPT0gZmFsc2UgJiYgdmFsICE9PSAnZmFsc2UnO1xyXG4gIH1cclxuICBnZXQgbmNFbmFibGVGdWxsc2NyZWVuKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2VuYWJsZUZ1bGxzY3JlZW47XHJcbiAgfVxyXG4gIC8qKiDlhajlsY/mjInpkq7mmL7npLrmlrnlvI8gKi9cclxuICBASW5wdXQoKSBuY0Z1bGxzY3JlZW5CdXR0b25EaXNwbGF5OiAnaG92ZXInIHwgJ2Fsd2F5cycgfCAnaGlkZGVuJyA9ICdhbHdheXMnO1xyXG4gIC8qKiDmmL7npLrlm77niYfmlbDnm64gKi9cclxuICBwcml2YXRlIF9zaG93SW5kZXg6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKVxyXG4gIHNldCBuY1Nob3dJbmRleCh2YWw6IGJvb2xlYW4gfCBzdHJpbmcpIHtcclxuICAgIHRoaXMuX3Nob3dJbmRleCA9IHZhbCAhPT0gbnVsbCAmJiB2YWwgIT09IHVuZGVmaW5lZCAmJiB2YWwgIT09IGZhbHNlICYmIHZhbCAhPT0gJ2ZhbHNlJztcclxuICB9XHJcbiAgZ2V0IG5jU2hvd0luZGV4KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3Nob3dJbmRleDtcclxuICB9XHJcbiAgLyoqIOaYvuekuuWbvueJh+agh+mimCAqL1xyXG4gIHByaXZhdGUgX3Nob3dUaXRsZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IG5jU2hvd1RpdGxlKHZhbDogYm9vbGVhbiB8IHN0cmluZykge1xyXG4gICAgdGhpcy5fc2hvd1RpdGxlID0gdmFsICE9PSBudWxsICYmIHZhbCAhPT0gdW5kZWZpbmVkICYmIHZhbCAhPT0gZmFsc2UgJiYgdmFsICE9PSAnZmFsc2UnO1xyXG4gIH1cclxuICBnZXQgbmNTaG93VGl0bGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fc2hvd1RpdGxlO1xyXG4gIH1cclxuICAvKiog5rua6L2u57yp5pS+ICovXHJcbiAgcHJpdmF0ZSBfd2hlZWxTY2FsZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IG5jV2hlZWxTY2FsZSh2YWw6IGJvb2xlYW4gfCBzdHJpbmcpIHtcclxuICAgIHRoaXMuX3doZWVsU2NhbGUgPSB2YWwgIT09IG51bGwgJiYgdmFsICE9PSB1bmRlZmluZWQgJiYgdmFsICE9PSBmYWxzZSAmJiB2YWwgIT09ICdmYWxzZSc7XHJcbiAgfVxyXG4gIGdldCBuY1doZWVsU2NhbGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fd2hlZWxTY2FsZTtcclxuICB9XHJcblxyXG4gIGN1cnJlbnRJbmRleDogbnVtYmVyID0gMDtcclxuICB0aHVtYm5haWxTdGFydEluZGV4OiBudW1iZXIgPSAwO1xyXG4gIHRodW1ibmFpbFRyYW5zZm9ybTogbnVtYmVyID0gMDsgLy8g57yp55Wl5Zu+5rua5Yqo5YGP56e76YePXHJcbiAgaXNGdWxsc2NyZWVuOiBib29sZWFuID0gZmFsc2U7IC8vIOWFqOWxj+eKtuaAgVxyXG4gIGlzRnVsbHNjcmVlbkF1dG9QbGF5aW5nOiBib29sZWFuID0gZmFsc2U7IC8vIOWFqOWxj+aooeW8j+S4i+eahOiHquWKqOaSreaUvueKtuaAgVxyXG4gIHByaXZhdGUgYXV0b1BsYXlUaW1lcjogYW55O1xyXG5cclxuICAvLyDlhajlsY/nvKnmlL7nm7jlhbPlsZ7mgKdcclxuICBmdWxsc2NyZWVuU2NhbGU6IG51bWJlciA9IDE7IC8vIOW9k+WJjee8qeaUvuavlOS+i1xyXG4gIGZ1bGxzY3JlZW5UcmFuc2xhdGVYOiBudW1iZXIgPSAwOyAvLyBY6L205YGP56e7XHJcbiAgZnVsbHNjcmVlblRyYW5zbGF0ZVk6IG51bWJlciA9IDA7IC8vIFnovbTlgY/np7tcclxuICBwcml2YXRlIG1pblNjYWxlOiBudW1iZXIgPSAwLjU7IC8vIOacgOWwj+e8qeaUvuavlOS+i1xyXG4gIHByaXZhdGUgbWF4U2NhbGU6IG51bWJlciA9IDM7IC8vIOacgOWkp+e8qeaUvuavlOS+i1xyXG4gIHByaXZhdGUgaXNEcmFnZ2luZzogYm9vbGVhbiA9IGZhbHNlOyAvLyDmmK/lkKbmraPlnKjmi5bmi71cclxuICBwcml2YXRlIGxhc3RNb3VzZVg6IG51bWJlciA9IDA7IC8vIOS4iuasoem8oOagh1jkvY3nva5cclxuICBwcml2YXRlIGxhc3RNb3VzZVk6IG51bWJlciA9IDA7IC8vIOS4iuasoem8oOagh1nkvY3nva5cclxuXHJcbiAgQFZpZXdDaGlsZCgnZ2FsbGVyaWFDb250YWluZXInLCB7IHN0YXRpYzogZmFsc2UgfSkgZ2FsbGVyaWFDb250YWluZXIhOiBFbGVtZW50UmVmO1xyXG4gIHByaXZhdGUgYWN0dWFsQ29udGFpbmVyV2lkdGg6IG51bWJlciA9IDA7XHJcbiAgcHJpdmF0ZSByZXNpemVUaW1lb3V0OiBhbnk7XHJcblxyXG4gIC8vIOiuoeeul+e8qeeVpeWbvuWunumZheWuveW6pu+8iOWMheWQq2dhcO+8iVxyXG4gIGdldCB0aHVtYm5haWxBY3R1YWxXaWR0aCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMubmNUaHVtYm5haWxXaWR0aCArIDg7IC8vIDhweCBnYXBcclxuICB9XHJcblxyXG4gIC8vIOiuoeeul+WunumZheWPr+aYvuekuueahOe8qeeVpeWbvuaVsOmHj1xyXG4gIGdldCBhY3R1YWxWaXNpYmxlVGh1bWJuYWlsQ291bnQoKTogbnVtYmVyIHtcclxuICAgIC8vIOi+ueeVjOS/neaKpO+8muWmguaenOayoeacieWbvueJh++8jOi/lOWbnjBcclxuICAgIGlmICghdGhpcy5uY0ltYWdlcyB8fCB0aGlzLm5jSW1hZ2VzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgY29udGFpbmVyV2lkdGggPSAwO1xyXG5cclxuICAgIGlmICh0aGlzLm5jV2lkdGggJiYgdGhpcy5uY1dpZHRoLmluY2x1ZGVzKCdweCcpKSB7XHJcbiAgICAgIC8vIOWmguaenOiuvue9ruS6huWFt+S9k+WDj+e0oOWuveW6plxyXG4gICAgICBjb250YWluZXJXaWR0aCA9IHBhcnNlSW50KHRoaXMubmNXaWR0aC5yZXBsYWNlKCdweCcsICcnKSk7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuYWN0dWFsQ29udGFpbmVyV2lkdGggPiAwKSB7XHJcbiAgICAgIC8vIOWmguaenOaYr+eZvuWIhuavlOWuveW6pu+8jOS9v+eUqOWunumZhea1i+mHj+eahOWuveW6plxyXG4gICAgICBjb250YWluZXJXaWR0aCA9IHRoaXMuYWN0dWFsQ29udGFpbmVyV2lkdGg7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyDlpoLmnpzov5jmsqHmnInmtYvph4/liLDlrp7pmYXlrr3luqbvvIzlhYjov5Tlm57lm77niYfmlbDph4/vvIjpgb/lhY3liJ3lp4vljJbml7bnmoTpl67popjvvIlcclxuICAgICAgcmV0dXJuIHRoaXMubmNJbWFnZXMubGVuZ3RoO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOi+ueeVjOS/neaKpO+8muehruS/neWuueWZqOWuveW6puWSjOe8qeeVpeWbvuWuveW6pumDveaYr+ato+aVsFxyXG4gICAgaWYgKGNvbnRhaW5lcldpZHRoIDw9IDAgfHwgdGhpcy50aHVtYm5haWxBY3R1YWxXaWR0aCA8PSAwKSB7XHJcbiAgICAgIHJldHVybiAxO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOWHj+WOu+W3puWPs+a7muWKqOaMiemSrueahOWuveW6pu+8iDMycHggKyA4cHggZ2Fw77yJw5cgMiA9IDgwcHjvvIzlho3lh4/ljrvlrrnlmahwYWRkaW5nXHJcbiAgICBjb25zdCBhdmFpbGFibGVXaWR0aCA9IGNvbnRhaW5lcldpZHRoIC0gODAgLSAzMjsgLy8g6aKd5aSW5YeP5Y67MzJweOeahHBhZGRpbmdcclxuXHJcbiAgICAvLyDovrnnlYzkv53miqTvvJrnoa7kv53lj6/nlKjlrr3luqbkuLrmraPmlbBcclxuICAgIGlmIChhdmFpbGFibGVXaWR0aCA8PSAwKSB7XHJcbiAgICAgIHJldHVybiAxO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHZpc2libGVDb3VudCA9IE1hdGguZmxvb3IoYXZhaWxhYmxlV2lkdGggLyB0aGlzLnRodW1ibmFpbEFjdHVhbFdpZHRoKTtcclxuICAgIC8vIOehruS/neiHs+WwkeaYvuekujHkuKrvvIzmnIDlpJrkuI3otoXov4flm77niYfmgLvmlbBcclxuICAgIHJldHVybiBNYXRoLm1heCgxLCBNYXRoLm1pbih2aXNpYmxlQ291bnQsIHRoaXMubmNJbWFnZXMubGVuZ3RoKSk7XHJcbiAgfVxyXG5cclxuICAvLyDliKTmlq3nvKnnlaXlm77mmK/lkKblupTor6XlsYXkuK3mmL7npLpcclxuICBnZXQgc2hvdWxkQ2VudGVyVGh1bWJuYWlscygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLm5jSW1hZ2VzLmxlbmd0aCA8PSB0aGlzLmFjdHVhbFZpc2libGVUaHVtYm5haWxDb3VudDtcclxuICB9XHJcblxyXG4gIC8vIOiuoeeul+e8qeeVpeWbvuacgOWkp+a7muWKqOi3neemu1xyXG4gIHByaXZhdGUgZ2V0TWF4VGh1bWJuYWlsU2Nyb2xsKCk6IG51bWJlciB7XHJcbiAgICBjb25zdCBhY3R1YWxWaXNpYmxlQ291bnQgPSB0aGlzLmFjdHVhbFZpc2libGVUaHVtYm5haWxDb3VudDtcclxuXHJcbiAgICBpZiAodGhpcy5uY0ltYWdlcy5sZW5ndGggPD0gYWN0dWFsVmlzaWJsZUNvdW50KSB7XHJcbiAgICAgIHJldHVybiAwO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOiuoeeul+aAu+WuveW6puWHj+WOu+WunumZheWPr+ingeWMuuWfn+WuveW6plxyXG4gICAgY29uc3QgdG90YWxXaWR0aCA9IHRoaXMubmNJbWFnZXMubGVuZ3RoICogdGhpcy50aHVtYm5haWxBY3R1YWxXaWR0aDtcclxuICAgIGNvbnN0IHZpc2libGVXaWR0aCA9IGFjdHVhbFZpc2libGVDb3VudCAqIHRoaXMudGh1bWJuYWlsQWN0dWFsV2lkdGg7XHJcbiAgICByZXR1cm4gLSh0b3RhbFdpZHRoIC0gdmlzaWJsZVdpZHRoKTtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkgeyB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG5cclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgIC8vIOiOt+WPluWunumZheeahOWuueWZqOWuveW6plxyXG4gICAgdGhpcy51cGRhdGVBY3R1YWxDb250YWluZXJXaWR0aCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVBY3R1YWxDb250YWluZXJXaWR0aCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmdhbGxlcmlhQ29udGFpbmVyICYmIHRoaXMuZ2FsbGVyaWFDb250YWluZXIubmF0aXZlRWxlbWVudCkge1xyXG4gICAgICBjb25zdCBuZXdXaWR0aCA9IHRoaXMuZ2FsbGVyaWFDb250YWluZXIubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aDtcclxuICAgICAgLy8g5Y+q5pyJ5b2T5a695bqm55yf5q2j5Y+R55Sf5Y+Y5YyW5pe25omN5pu05pawXHJcbiAgICAgIGlmIChuZXdXaWR0aCAhPT0gdGhpcy5hY3R1YWxDb250YWluZXJXaWR0aCkge1xyXG4gICAgICAgIGNvbnN0IG9sZFZpc2libGVDb3VudCA9IHRoaXMuYWN0dWFsVmlzaWJsZVRodW1ibmFpbENvdW50O1xyXG4gICAgICAgIHRoaXMuYWN0dWFsQ29udGFpbmVyV2lkdGggPSBuZXdXaWR0aDtcclxuICAgICAgICBjb25zdCBuZXdWaXNpYmxlQ291bnQgPSB0aGlzLmFjdHVhbFZpc2libGVUaHVtYm5haWxDb3VudDtcclxuXHJcbiAgICAgICAgLy8g5aaC5p6c5Y+v5pi+56S65pWw6YeP5Y+R55Sf5Y+Y5YyW77yM6YeN5paw6LCD5pW057yp55Wl5Zu+6KeG5Zu+XHJcbiAgICAgICAgaWYgKG9sZFZpc2libGVDb3VudCAhPT0gbmV3VmlzaWJsZUNvdW50KSB7XHJcbiAgICAgICAgICB0aGlzLnVwZGF0ZVRodW1ibmFpbFZpZXcoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGluaXQoKTogdm9pZCB7XHJcbiAgICAvL+WFiOWIoOmZpGF1dG9QbGF5VGltZXLlrprml7blmajvvIzpmLLmraJuY0ltYWdlc+abtOaNouaXtumHjeWkjWF1dG9QbGF5VGltZXJcclxuICAgIGlmICh0aGlzLmF1dG9QbGF5VGltZXIpIHtcclxuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmF1dG9QbGF5VGltZXIpO1xyXG4gICAgICB0aGlzLmF1dG9QbGF5VGltZXIgPSBudWxsO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMubmNBdXRvUGxheSAmJiB0aGlzLm5jSW1hZ2VzLmxlbmd0aCA+IDEpIHtcclxuICAgICAgdGhpcy5zdGFydEF1dG9QbGF5KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuc3RvcEF1dG9QbGF5KCk7XHJcbiAgICAvLyDmuIXnkIZyZXNpemXlrprml7blmahcclxuICAgIGlmICh0aGlzLnJlc2l6ZVRpbWVvdXQpIHtcclxuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucmVzaXplVGltZW91dCk7XHJcbiAgICB9XHJcbiAgICAvLyDlpoLmnpznu4Tku7bplIDmr4Hml7bov5jlnKjlhajlsY/nirbmgIHvvIzmgaLlpI3pobXpnaLmu5rliqhcclxuICAgIGlmICh0aGlzLmlzRnVsbHNjcmVlbikge1xyXG4gICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gJyc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyDpgInmi6nlm77niYdcclxuICBzZWxlY3RJbWFnZShpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IHRoaXMubmNJbWFnZXMubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMuY3VycmVudEluZGV4ID0gaW5kZXg7XHJcbiAgICAgIHRoaXMudXBkYXRlVGh1bWJuYWlsVmlldygpO1xyXG4gICAgICAvLyDliIfmjaLlm77niYfml7bph43nva7nvKnmlL7nirbmgIFcclxuICAgICAgdGhpcy5yZXNldEZ1bGxzY3JlZW5ab29tKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyDph43nva7lhajlsY/nvKnmlL7nirbmgIFcclxuICBwcml2YXRlIHJlc2V0RnVsbHNjcmVlblpvb20oKTogdm9pZCB7XHJcbiAgICB0aGlzLmZ1bGxzY3JlZW5TY2FsZSA9IDE7XHJcbiAgICB0aGlzLmZ1bGxzY3JlZW5UcmFuc2xhdGVYID0gMDtcclxuICAgIHRoaXMuZnVsbHNjcmVlblRyYW5zbGF0ZVkgPSAwO1xyXG4gIH1cclxuXHJcbiAgLy8g5LiK5LiA5byg5Zu+54mHXHJcbiAgcHJldmlvdXNJbWFnZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuY3VycmVudEluZGV4ID0gdGhpcy5jdXJyZW50SW5kZXggPiAwID8gdGhpcy5jdXJyZW50SW5kZXggLSAxIDogdGhpcy5uY0ltYWdlcy5sZW5ndGggLSAxO1xyXG4gICAgdGhpcy51cGRhdGVUaHVtYm5haWxWaWV3KCk7XHJcbiAgICAvLyDliIfmjaLlm77niYfml7bph43nva7nvKnmlL7nirbmgIFcclxuICAgIHRoaXMucmVzZXRGdWxsc2NyZWVuWm9vbSgpO1xyXG4gIH1cclxuXHJcbiAgLy8g5LiL5LiA5byg5Zu+54mHXHJcbiAgbmV4dEltYWdlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5jdXJyZW50SW5kZXggPSB0aGlzLmN1cnJlbnRJbmRleCA8IHRoaXMubmNJbWFnZXMubGVuZ3RoIC0gMSA/IHRoaXMuY3VycmVudEluZGV4ICsgMSA6IDA7XHJcbiAgICB0aGlzLnVwZGF0ZVRodW1ibmFpbFZpZXcoKTtcclxuICAgIC8vIOWIh+aNouWbvueJh+aXtumHjee9rue8qeaUvueKtuaAgVxyXG4gICAgdGhpcy5yZXNldEZ1bGxzY3JlZW5ab29tKCk7XHJcbiAgfVxyXG5cclxuICAvLyDmm7TmlrDnvKnnlaXlm77op4blm75cclxuICBwcml2YXRlIHVwZGF0ZVRodW1ibmFpbFZpZXcoKTogdm9pZCB7XHJcbiAgICBjb25zdCBhY3R1YWxWaXNpYmxlQ291bnQgPSB0aGlzLmFjdHVhbFZpc2libGVUaHVtYm5haWxDb3VudDtcclxuXHJcbiAgICBpZiAodGhpcy5uY0ltYWdlcy5sZW5ndGggPD0gYWN0dWFsVmlzaWJsZUNvdW50KSB7XHJcbiAgICAgIHRoaXMudGh1bWJuYWlsU3RhcnRJbmRleCA9IDA7XHJcbiAgICAgIHRoaXMudGh1bWJuYWlsVHJhbnNmb3JtID0gMDtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOagueaNrue8qeeVpeWbvuaVsOmHj+WGs+Wumua7muWKqOetlueVpVxyXG4gICAgY29uc3QgdHJpZ2dlckluZGV4ID0gTWF0aC5tYXgoMiwgYWN0dWFsVmlzaWJsZUNvdW50IC0gMik7XHJcblxyXG4gICAgaWYgKHRoaXMuY3VycmVudEluZGV4IDwgdHJpZ2dlckluZGV4KSB7XHJcbiAgICAgIC8vIOWJjemdouWHoOW8oOWbvueJh+aXtu+8jOe8qeeVpeWbvuS9jee9ruS4jeWPmFxyXG4gICAgICB0aGlzLnRodW1ibmFpbFN0YXJ0SW5kZXggPSAwO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLmN1cnJlbnRJbmRleCA+PSB0aGlzLm5jSW1hZ2VzLmxlbmd0aCAtIE1hdGguZmxvb3IoYWN0dWFsVmlzaWJsZUNvdW50IC8gMikpIHtcclxuICAgICAgLy8g5pyA5ZCO5Yeg5byg5Zu+54mH5pe277yM5pi+56S65pyA5ZCO5Yeg5byg57yp55Wl5Zu+XHJcbiAgICAgIHRoaXMudGh1bWJuYWlsU3RhcnRJbmRleCA9IHRoaXMubmNJbWFnZXMubGVuZ3RoIC0gYWN0dWFsVmlzaWJsZUNvdW50O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8g5Lit6Ze06YOo5YiG77yM6K6p5b2T5YmN5Zu+54mH5bGF5Lit5oiW5o6l6L+R5bGF5Lit5pi+56S6XHJcbiAgICAgIGNvbnN0IGNlbnRlck9mZnNldCA9IE1hdGguZmxvb3IoYWN0dWFsVmlzaWJsZUNvdW50IC8gMik7XHJcbiAgICAgIHRoaXMudGh1bWJuYWlsU3RhcnRJbmRleCA9IHRoaXMuY3VycmVudEluZGV4IC0gY2VudGVyT2Zmc2V0O1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOehruS/neS4jei2heWHuui+ueeVjFxyXG4gICAgdGhpcy50aHVtYm5haWxTdGFydEluZGV4ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4odGhpcy50aHVtYm5haWxTdGFydEluZGV4LCB0aGlzLm5jSW1hZ2VzLmxlbmd0aCAtIGFjdHVhbFZpc2libGVDb3VudCkpO1xyXG5cclxuICAgIC8vIOiuoeeul3RyYW5zZm9ybeWBj+enu+mHj1xyXG4gICAgdGhpcy50aHVtYm5haWxUcmFuc2Zvcm0gPSAtdGhpcy50aHVtYm5haWxTdGFydEluZGV4ICogdGhpcy50aHVtYm5haWxBY3R1YWxXaWR0aDtcclxuXHJcbiAgICAvLyDnoa7kv53kuI3otoXlh7rmnIDlpKfmu5rliqjojIPlm7RcclxuICAgIGNvbnN0IG1heFNjcm9sbCA9IHRoaXMuZ2V0TWF4VGh1bWJuYWlsU2Nyb2xsKCk7XHJcbiAgICB0aGlzLnRodW1ibmFpbFRyYW5zZm9ybSA9IE1hdGgubWF4KG1heFNjcm9sbCwgdGhpcy50aHVtYm5haWxUcmFuc2Zvcm0pO1xyXG4gIH1cclxuXHJcbiAgLy8g57yp55Wl5Zu+5ZCR5bem5rua5YqoXHJcbiAgc2Nyb2xsVGh1bWJuYWlsc0xlZnQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5jYW5TY3JvbGxMZWZ0KCkpIHtcclxuICAgICAgLy8g5q+P5qyh5rua5Yqo5LiA5Liq57yp55Wl5Zu+55qE5a695bqmXHJcbiAgICAgIHRoaXMudGh1bWJuYWlsVHJhbnNmb3JtICs9IHRoaXMudGh1bWJuYWlsQWN0dWFsV2lkdGg7XHJcbiAgICAgIC8vIOehruS/neS4jei2heWHuuW3pui+ueeVjFxyXG4gICAgICB0aGlzLnRodW1ibmFpbFRyYW5zZm9ybSA9IE1hdGgubWluKDAsIHRoaXMudGh1bWJuYWlsVHJhbnNmb3JtKTtcclxuICAgICAgLy8g5pu05pawdGh1bWJuYWlsU3RhcnRJbmRleOS7peS/neaMgeS4gOiHtOaAp1xyXG4gICAgICB0aGlzLnRodW1ibmFpbFN0YXJ0SW5kZXggPSBNYXRoLm1heCgwLCBNYXRoLnJvdW5kKC10aGlzLnRodW1ibmFpbFRyYW5zZm9ybSAvIHRoaXMudGh1bWJuYWlsQWN0dWFsV2lkdGgpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIOe8qeeVpeWbvuWQkeWPs+a7muWKqFxyXG4gIHNjcm9sbFRodW1ibmFpbHNSaWdodCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmNhblNjcm9sbFJpZ2h0KCkpIHtcclxuICAgICAgLy8g5q+P5qyh5rua5Yqo5LiA5Liq57yp55Wl5Zu+55qE5a695bqmXHJcbiAgICAgIHRoaXMudGh1bWJuYWlsVHJhbnNmb3JtIC09IHRoaXMudGh1bWJuYWlsQWN0dWFsV2lkdGg7XHJcbiAgICAgIC8vIOehruS/neS4jei2heWHuuWPs+i+ueeVjFxyXG4gICAgICBjb25zdCBtYXhTY3JvbGwgPSB0aGlzLmdldE1heFRodW1ibmFpbFNjcm9sbCgpO1xyXG4gICAgICB0aGlzLnRodW1ibmFpbFRyYW5zZm9ybSA9IE1hdGgubWF4KG1heFNjcm9sbCwgdGhpcy50aHVtYm5haWxUcmFuc2Zvcm0pO1xyXG4gICAgICAvLyDmm7TmlrB0aHVtYm5haWxTdGFydEluZGV45Lul5L+d5oyB5LiA6Ie05oCnXHJcbiAgICAgIHRoaXMudGh1bWJuYWlsU3RhcnRJbmRleCA9IE1hdGgubWF4KDAsIE1hdGgucm91bmQoLXRoaXMudGh1bWJuYWlsVHJhbnNmb3JtIC8gdGhpcy50aHVtYm5haWxBY3R1YWxXaWR0aCkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8g5piv5ZCm5Y+v5Lul5ZCR5bem5rua5Yqo57yp55Wl5Zu+XHJcbiAgY2FuU2Nyb2xsTGVmdCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnRodW1ibmFpbFRyYW5zZm9ybSA8IDA7XHJcbiAgfVxyXG5cclxuICAvLyDmmK/lkKblj6/ku6XlkJHlj7Pmu5rliqjnvKnnlaXlm75cclxuICBjYW5TY3JvbGxSaWdodCgpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLm5jSW1hZ2VzLmxlbmd0aCA8PSB0aGlzLmFjdHVhbFZpc2libGVUaHVtYm5haWxDb3VudCkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBjb25zdCBtYXhTY3JvbGwgPSB0aGlzLmdldE1heFRodW1ibmFpbFNjcm9sbCgpO1xyXG4gICAgcmV0dXJuIHRoaXMudGh1bWJuYWlsVHJhbnNmb3JtID4gbWF4U2Nyb2xsO1xyXG4gIH1cclxuXHJcbiAgLy8g5byA5aeL6Ieq5Yqo5pKt5pS+XHJcbiAgcHJpdmF0ZSBzdGFydEF1dG9QbGF5KCk6IHZvaWQge1xyXG4gICAgdGhpcy5hdXRvUGxheVRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xyXG4gICAgICB0aGlzLm5leHRJbWFnZSgpO1xyXG4gICAgfSwgdGhpcy5uY0F1dG9QbGF5SW50ZXJ2YWwpO1xyXG4gIH1cclxuXHJcbiAgLy8g5YGc5q2i6Ieq5Yqo5pKt5pS+XHJcbiAgcHJpdmF0ZSBzdG9wQXV0b1BsYXkoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5hdXRvUGxheVRpbWVyKSB7XHJcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5hdXRvUGxheVRpbWVyKTtcclxuICAgICAgdGhpcy5hdXRvUGxheVRpbWVyID0gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIOm8oOagh+i/m+WFpeaXtuaaguWBnOiHquWKqOaSreaUvlxyXG4gIG9uTW91c2VFbnRlcigpOiB2b2lkIHtcclxuICAgIC8vIOWmguaenOWcqOWFqOWxj+aooeW8j+S4i++8jOS4jeimgeiHquWKqOaaguWBnOaSreaUvu+8jOiuqeeUqOaIt+aJi+WKqOaOp+WItlxyXG4gICAgaWYgKHRoaXMuaXNGdWxsc2NyZWVuKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5uY0F1dG9QbGF5KSB7XHJcbiAgICAgIHRoaXMuc3RvcEF1dG9QbGF5KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyDpvKDmoIfnprvlvIDml7bmgaLlpI3oh6rliqjmkq3mlL5cclxuICBvbk1vdXNlTGVhdmUoKTogdm9pZCB7XHJcbiAgICAvLyDlpoLmnpzlnKjlhajlsY/mqKHlvI/kuIvvvIzkuI3opoHoh6rliqjmgaLlpI3mkq3mlL7vvIzorqnnlKjmiLfmiYvliqjmjqfliLZcclxuICAgIGlmICh0aGlzLmlzRnVsbHNjcmVlbikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMubmNBdXRvUGxheSAmJiB0aGlzLm5jSW1hZ2VzLmxlbmd0aCA+IDEpIHtcclxuICAgICAgdGhpcy5zdGFydEF1dG9QbGF5KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyDnm5HlkKznqpflj6PlpKflsI/lj5jljJZcclxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJywgWyckZXZlbnQnXSlcclxuICBvbldpbmRvd1Jlc2l6ZShldmVudDogYW55KTogdm9pZCB7XHJcbiAgICAvLyDkvb/nlKjpmLLmipblpITnkIbvvIzpgb/lhY3popHnuYHorqHnrpdcclxuICAgIGlmICh0aGlzLnJlc2l6ZVRpbWVvdXQpIHtcclxuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucmVzaXplVGltZW91dCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnJlc2l6ZVRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy51cGRhdGVBY3R1YWxDb250YWluZXJXaWR0aCgpO1xyXG4gICAgfSwgMTUwKTsgLy8gMTUwbXPpmLLmipblu7bov59cclxuICB9XHJcblxyXG4gIC8vIOmUruebmOWvvOiIquaUr+aMgVxyXG4gIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24nLCBbJyRldmVudCddKVxyXG4gIG9uS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLm5jSW1hZ2VzIHx8IHRoaXMubmNJbWFnZXMubGVuZ3RoIDw9IDEpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XHJcbiAgICAgIGNhc2UgJ0Fycm93TGVmdCc6XHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICB0aGlzLnByZXZpb3VzSW1hZ2UoKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnQXJyb3dSaWdodCc6XHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICB0aGlzLm5leHRJbWFnZSgpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdIb21lJzpcclxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0SW1hZ2UoMCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ0VuZCc6XHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICB0aGlzLnNlbGVjdEltYWdlKHRoaXMubmNJbWFnZXMubGVuZ3RoIC0gMSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyDlm77niYfliqDovb3plJnor6/lpITnkIZcclxuICBvbkltYWdlRXJyb3IoZXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgLy8g6Ziy5q2i6ZSZ6K+v5Zu+54mH5YaN5qyh6Kem5Y+R6ZSZ6K+v5LqL5Lu2XHJcbiAgICBpZiAoZXZlbnQudGFyZ2V0LnNyYy5zdGFydHNXaXRoKCdkYXRhOmltYWdlL3N2Zyt4bWwnKSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc29sZS53YXJuKCflm77niYfliqDovb3lpLHotKU6JywgZXZlbnQudGFyZ2V0LnNyYyk7XHJcbiAgICAvLyDkvb/nlKhTVkfljaDkvY3lm75cclxuICAgIGNvbnN0IGVycm9yU3ZnID0gdGhpcy5jcmVhdGVFcnJvckltYWdlU3ZnKDQwMCwgMzAwKTtcclxuICAgIGV2ZW50LnRhcmdldC5zcmMgPSBlcnJvclN2ZztcclxuICAgIGV2ZW50LnRhcmdldC5zdHlsZS5vYmplY3RGaXQgPSAnY29udGFpbic7XHJcbiAgfVxyXG5cclxuICAvLyDnvKnnlaXlm77liqDovb3plJnor6/lpITnkIZcclxuICBvblRodW1ibmFpbEVycm9yKGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgIC8vIOmYsuatoumUmeivr+WbvueJh+WGjeasoeinpuWPkemUmeivr+S6i+S7tlxyXG4gICAgaWYgKGV2ZW50LnRhcmdldC5zcmMuc3RhcnRzV2l0aCgnZGF0YTppbWFnZS9zdmcreG1sJykpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnNvbGUud2Fybign57yp55Wl5Zu+5Yqg6L295aSx6LSlOicsIGV2ZW50LnRhcmdldC5zcmMpO1xyXG4gICAgLy8g5L2/55SoU1ZH5Y2g5L2N5Zu+XHJcbiAgICBjb25zdCBlcnJvclN2ZyA9IHRoaXMuY3JlYXRlRXJyb3JJbWFnZVN2Zyh0aGlzLm5jVGh1bWJuYWlsV2lkdGgsIHRoaXMubmNUaHVtYm5haWxIZWlnaHQpO1xyXG4gICAgZXZlbnQudGFyZ2V0LnNyYyA9IGVycm9yU3ZnO1xyXG4gICAgZXZlbnQudGFyZ2V0LnN0eWxlLm9iamVjdEZpdCA9ICdjb250YWluJztcclxuICB9XHJcblxyXG4gIC8vIOWIm+W7uumUmeivr+WbvueJh+eahFNWR+WNoOS9jeWbvlxyXG4gIHByaXZhdGUgY3JlYXRlRXJyb3JJbWFnZVN2Zyh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICBjb25zdCBzdmcgPSBgXHJcbiAgICAgIDxzdmcgd2lkdGg9XCIke3dpZHRofVwiIGhlaWdodD1cIiR7aGVpZ2h0fVwiIHZpZXdCb3g9XCIwIDAgJHt3aWR0aH0gJHtoZWlnaHR9XCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgIDxyZWN0IHdpZHRoPVwiMTAwJVwiIGhlaWdodD1cIjEwMCVcIiBmaWxsPVwiI2Y4ZjlmYVwiIHN0cm9rZT1cIiNkZWUyZTZcIiBzdHJva2Utd2lkdGg9XCIyXCIvPlxyXG4gICAgICAgIDxnIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgke3dpZHRoIC8gMn0sICR7aGVpZ2h0IC8gMn0pXCI+XHJcbiAgICAgICAgICA8IS0tIOegtOaNn+WbvueJh+WbvuaghyAtLT5cclxuICAgICAgICAgIDxnIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgtMjQsIC0yNClcIj5cclxuICAgICAgICAgICAgPHJlY3QgeD1cIjRcIiB5PVwiNFwiIHdpZHRoPVwiNDBcIiBoZWlnaHQ9XCIzMlwiIHJ4PVwiMlwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiIzZjNzU3ZFwiIHN0cm9rZS13aWR0aD1cIjJcIi8+XHJcbiAgICAgICAgICAgIDxjaXJjbGUgY3g9XCIxNFwiIGN5PVwiMTRcIiByPVwiMlwiIGZpbGw9XCIjNmM3NTdkXCIvPlxyXG4gICAgICAgICAgICA8cGF0aCBkPVwiTTQ0IDI4TDM2IDIwTDI0IDMyTDE2IDI0TDQgMzZcIiBzdHJva2U9XCIjNmM3NTdkXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIGZpbGw9XCJub25lXCIvPlxyXG4gICAgICAgICAgICA8IS0tIFgg5qCH6K6wIC0tPlxyXG4gICAgICAgICAgICA8bGluZSB4MT1cIjMyXCIgeTE9XCI4XCIgeDI9XCI0MFwiIHkyPVwiMTZcIiBzdHJva2U9XCIjZGMzNTQ1XCIgc3Ryb2tlLXdpZHRoPVwiMlwiLz5cclxuICAgICAgICAgICAgPGxpbmUgeDE9XCI0MFwiIHkxPVwiOFwiIHgyPVwiMzJcIiB5Mj1cIjE2XCIgc3Ryb2tlPVwiI2RjMzU0NVwiIHN0cm9rZS13aWR0aD1cIjJcIi8+XHJcbiAgICAgICAgICA8L2c+XHJcbiAgICAgICAgICA8IS0tIOmUmeivr+aWh+WtlyAtLT5cclxuICAgICAgICAgIDx0ZXh0IHg9XCIwXCIgeT1cIjMyXCIgdGV4dC1hbmNob3I9XCJtaWRkbGVcIiBmaWxsPVwiIzZjNzU3ZFwiIGZvbnQtZmFtaWx5PVwiQXJpYWwsIHNhbnMtc2VyaWZcIiBmb250LXNpemU9XCIxMlwiPlxyXG4gICAgICAgICAgICDlm77niYfliqDovb3lpLHotKVcclxuICAgICAgICAgIDwvdGV4dD5cclxuICAgICAgICA8L2c+XHJcbiAgICAgIDwvc3ZnPlxyXG4gICAgYDtcclxuXHJcbiAgICAvLyDkvb/nlKjnjrDku6Pmlrnms5XvvJrnm7TmjqVVUkznvJbnoIHvvIzml6DpnIBiYXNlNjRcclxuICAgIHJldHVybiAnZGF0YTppbWFnZS9zdmcreG1sLCcgKyBlbmNvZGVVUklDb21wb25lbnQoc3ZnKTtcclxuICB9XHJcblxyXG4gIC8vIOaJk+W8gOWFqOWxj+mihOiniFxyXG4gIG9wZW5GdWxsc2NyZWVuKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMubmNFbmFibGVGdWxsc2NyZWVuKSB7XHJcbiAgICAgIHRoaXMuaXNGdWxsc2NyZWVuID0gdHJ1ZTtcclxuICAgICAgLy8g6Zi75q2i6aG16Z2i5rua5YqoXHJcbiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcclxuICAgICAgLy8g6YeN572u57yp5pS+54q25oCBXHJcbiAgICAgIHRoaXMucmVzZXRGdWxsc2NyZWVuWm9vbSgpO1xyXG5cclxuICAgICAgLy8g5qOA5p+l5b2T5YmN5piv5ZCm5pyJ6Ieq5Yqo5pKt5pS+5Zyo6L+Q6KGMXHJcbiAgICAgIGNvbnN0IHdhc0F1dG9QbGF5aW5nID0gISF0aGlzLmF1dG9QbGF5VGltZXI7XHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKCfmiZPlvIDlhajlsY/vvIzlvZPliY3oh6rliqjmkq3mlL7nirbmgIE6Jywgd2FzQXV0b1BsYXlpbmcpO1xyXG5cclxuICAgICAgLy8g5aaC5p6c5Y6f5pys5pyJ6Ieq5Yqo5pKt5pS+77yM5Zyo5YWo5bGP5qih5byP5LiL57un57ut5pKt5pS+XHJcbiAgICAgIGlmICh0aGlzLm5jQXV0b1BsYXkgJiYgdGhpcy5uY0ltYWdlcy5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgdGhpcy5pc0Z1bGxzY3JlZW5BdXRvUGxheWluZyA9IHdhc0F1dG9QbGF5aW5nO1xyXG4gICAgICAgIC8vIOWmguaenOS5i+WJjeayoeacieWcqOaSreaUvu+8jOmcgOimgeWQr+WKqFxyXG4gICAgICAgIGlmICghd2FzQXV0b1BsYXlpbmcpIHtcclxuICAgICAgICAgIHRoaXMuc3RhcnRBdXRvUGxheSgpO1xyXG4gICAgICAgICAgdGhpcy5pc0Z1bGxzY3JlZW5BdXRvUGxheWluZyA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyDlhbPpl63lhajlsY/pooTop4hcclxuICBjbG9zZUZ1bGxzY3JlZW4oKTogdm9pZCB7XHJcbiAgICB0aGlzLmlzRnVsbHNjcmVlbiA9IGZhbHNlO1xyXG4gICAgdGhpcy5pc0Z1bGxzY3JlZW5BdXRvUGxheWluZyA9IGZhbHNlO1xyXG4gICAgLy8g5oGi5aSN6aG16Z2i5rua5YqoXHJcbiAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gJyc7XHJcbiAgICAvLyDph43nva7nvKnmlL7nirbmgIFcclxuICAgIHRoaXMucmVzZXRGdWxsc2NyZWVuWm9vbSgpO1xyXG4gICAgLy/lhYjliKDpmaRhdXRvUGxheVRpbWVy5a6a5pe25Zmo77yM6Ziy5q2i5oGi5aSN6Ieq5Yqo5pKt5pS+5pe26YeN5aSNYXV0b1BsYXlUaW1lclxyXG4gICAgaWYgKHRoaXMuYXV0b1BsYXlUaW1lcikge1xyXG4gICAgICBjbGVhckludGVydmFsKHRoaXMuYXV0b1BsYXlUaW1lcik7XHJcbiAgICAgIHRoaXMuYXV0b1BsYXlUaW1lciA9IG51bGw7XHJcbiAgICB9XHJcbiAgICAvLyDpgIDlh7rlhajlsY/ml7bmgaLlpI3oh6rliqjmkq3mlL5cclxuICAgIGlmICh0aGlzLm5jQXV0b1BsYXkgJiYgdGhpcy5uY0ltYWdlcy5sZW5ndGggPiAxKSB7XHJcbiAgICAgIHRoaXMuc3RhcnRBdXRvUGxheSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8g5YWo5bGP5qih5byP5LiL5YiH5o2i6Ieq5Yqo5pKt5pS+XHJcbiAgdG9nZ2xlRnVsbHNjcmVlbkF1dG9QbGF5KCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmlzRnVsbHNjcmVlbiB8fCB0aGlzLm5jSW1hZ2VzLmxlbmd0aCA8PSAxKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBjb25zb2xlLmxvZygn5YiH5o2i5YmN54q25oCBOicsIHRoaXMuaXNGdWxsc2NyZWVuQXV0b1BsYXlpbmcsICflrprml7blmag6JywgISF0aGlzLmF1dG9QbGF5VGltZXIpO1xyXG5cclxuICAgIGlmICh0aGlzLmlzRnVsbHNjcmVlbkF1dG9QbGF5aW5nKSB7XHJcbiAgICAgIHRoaXMuc3RvcEF1dG9QbGF5KCk7XHJcbiAgICAgIHRoaXMuaXNGdWxsc2NyZWVuQXV0b1BsYXlpbmcgPSBmYWxzZTtcclxuICAgICAgLy8gY29uc29sZS5sb2coJ+W3suaaguWBnOiHquWKqOaSreaUvicpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zdGFydEF1dG9QbGF5KCk7XHJcbiAgICAgIHRoaXMuaXNGdWxsc2NyZWVuQXV0b1BsYXlpbmcgPSB0cnVlO1xyXG4gICAgICAvLyBjb25zb2xlLmxvZygn5bey5byA5aeL6Ieq5Yqo5pKt5pS+Jyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyDlhajlsY/mqKHlvI/kuIvnmoTplK7nm5jkuovku7blpITnkIZcclxuICBvbkZ1bGxzY3JlZW5LZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuaXNGdWxsc2NyZWVuKSByZXR1cm47XHJcblxyXG4gICAgc3dpdGNoIChldmVudC5rZXkpIHtcclxuICAgICAgY2FzZSAnRXNjYXBlJzpcclxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIHRoaXMuY2xvc2VGdWxsc2NyZWVuKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ0Fycm93TGVmdCc6XHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICB0aGlzLnByZXZpb3VzSW1hZ2UoKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnQXJyb3dSaWdodCc6XHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICB0aGlzLm5leHRJbWFnZSgpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICcgJzogLy8g56m65qC86ZSuXHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICBpZiAodGhpcy5uY0F1dG9QbGF5KSB7XHJcbiAgICAgICAgICB0aGlzLnRvZ2dsZUZ1bGxzY3JlZW5BdXRvUGxheSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIOWFqOWxj+aooeW8j+S4i+eahOa7mui9rue8qeaUvuS6i+S7tlxyXG4gIG9uRnVsbHNjcmVlbldoZWVsKGV2ZW50OiBXaGVlbEV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuaXNGdWxsc2NyZWVuIHx8ICF0aGlzLm5jV2hlZWxTY2FsZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgIGNvbnN0IGRlbHRhID0gZXZlbnQuZGVsdGFZO1xyXG4gICAgY29uc3Qgc2NhbGVTdGVwID0gMC4xO1xyXG4gICAgY29uc3QgcmVjdCA9IChldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG5cclxuICAgIC8vIOiuoeeul+m8oOagh+ebuOWvueS6juWbvueJh+eahOS9jee9rlxyXG4gICAgY29uc3QgbW91c2VYID0gZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdCAtIHJlY3Qud2lkdGggLyAyO1xyXG4gICAgY29uc3QgbW91c2VZID0gZXZlbnQuY2xpZW50WSAtIHJlY3QudG9wIC0gcmVjdC5oZWlnaHQgLyAyO1xyXG5cclxuICAgIGNvbnN0IG9sZFNjYWxlID0gdGhpcy5mdWxsc2NyZWVuU2NhbGU7XHJcblxyXG4gICAgLy8g6K6h566X5paw55qE57yp5pS+5q+U5L6LXHJcbiAgICBpZiAoZGVsdGEgPCAwKSB7XHJcbiAgICAgIC8vIOWQkeS4iua7muWKqO+8jOaUvuWkp1xyXG4gICAgICB0aGlzLmZ1bGxzY3JlZW5TY2FsZSA9IE1hdGgubWluKHRoaXMubWF4U2NhbGUsIHRoaXMuZnVsbHNjcmVlblNjYWxlICsgc2NhbGVTdGVwKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIOWQkeS4i+a7muWKqO+8jOe8qeWwj1xyXG4gICAgICB0aGlzLmZ1bGxzY3JlZW5TY2FsZSA9IE1hdGgubWF4KHRoaXMubWluU2NhbGUsIHRoaXMuZnVsbHNjcmVlblNjYWxlIC0gc2NhbGVTdGVwKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyDlpoLmnpznvKnmlL7mr5Tkvovlj5HnlJ/kuoblj5jljJbvvIzosIPmlbTlgY/np7vph4/ku6Xkv53mjIHpvKDmoIfkvY3nva7kuI3lj5hcclxuICAgIGlmICh0aGlzLmZ1bGxzY3JlZW5TY2FsZSAhPT0gb2xkU2NhbGUpIHtcclxuICAgICAgY29uc3Qgc2NhbGVSYXRpbyA9IHRoaXMuZnVsbHNjcmVlblNjYWxlIC8gb2xkU2NhbGU7XHJcblxyXG4gICAgICAvLyDosIPmlbTlgY/np7vph4/vvIzkvb/nvKnmlL7ku6XpvKDmoIfkvY3nva7kuLrkuK3lv4NcclxuICAgICAgdGhpcy5mdWxsc2NyZWVuVHJhbnNsYXRlWCA9IG1vdXNlWCArICh0aGlzLmZ1bGxzY3JlZW5UcmFuc2xhdGVYIC0gbW91c2VYKSAqIHNjYWxlUmF0aW87XHJcbiAgICAgIHRoaXMuZnVsbHNjcmVlblRyYW5zbGF0ZVkgPSBtb3VzZVkgKyAodGhpcy5mdWxsc2NyZWVuVHJhbnNsYXRlWSAtIG1vdXNlWSkgKiBzY2FsZVJhdGlvO1xyXG5cclxuICAgICAgLy8g6ZmQ5Yi25YGP56e76YeP6IyD5Zu0XHJcbiAgICAgIHRoaXMuY29uc3RyYWluVHJhbnNsYXRpb24oKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIOWFqOWxj+aooeW8j+S4i+eahOm8oOagh+aMieS4i+S6i+S7tu+8iOW8gOWni+aLluaLve+8iVxyXG4gIG9uRnVsbHNjcmVlbk1vdXNlRG93bihldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmlzRnVsbHNjcmVlbiB8fCAhdGhpcy5uY1doZWVsU2NhbGUgfHwgdGhpcy5mdWxsc2NyZWVuU2NhbGUgPD0gMSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIHRoaXMuaXNEcmFnZ2luZyA9IHRydWU7XHJcbiAgICB0aGlzLmxhc3RNb3VzZVggPSBldmVudC5jbGllbnRYO1xyXG4gICAgdGhpcy5sYXN0TW91c2VZID0gZXZlbnQuY2xpZW50WTtcclxuXHJcbiAgICAvLyDmlLnlj5jpvKDmoIfmoLflvI9cclxuICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuY3Vyc29yID0gJ2dyYWJiaW5nJztcclxuICB9XHJcblxyXG4gIC8vIOWFqOWxj+aooeW8j+S4i+eahOm8oOagh+enu+WKqOS6i+S7tu+8iOaLluaLveS4re+8iVxyXG4gIG9uRnVsbHNjcmVlbk1vdXNlTW92ZShldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmlzRnVsbHNjcmVlbiB8fCAhdGhpcy5uY1doZWVsU2NhbGUgfHwgIXRoaXMuaXNEcmFnZ2luZykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHJcbiAgICBjb25zdCBkZWx0YVggPSBldmVudC5jbGllbnRYIC0gdGhpcy5sYXN0TW91c2VYO1xyXG4gICAgY29uc3QgZGVsdGFZID0gZXZlbnQuY2xpZW50WSAtIHRoaXMubGFzdE1vdXNlWTtcclxuXHJcbiAgICB0aGlzLmZ1bGxzY3JlZW5UcmFuc2xhdGVYICs9IGRlbHRhWDtcclxuICAgIHRoaXMuZnVsbHNjcmVlblRyYW5zbGF0ZVkgKz0gZGVsdGFZO1xyXG5cclxuICAgIC8vIOmZkOWItuWBj+enu+mHj+iMg+WbtFxyXG4gICAgdGhpcy5jb25zdHJhaW5UcmFuc2xhdGlvbigpO1xyXG5cclxuICAgIHRoaXMubGFzdE1vdXNlWCA9IGV2ZW50LmNsaWVudFg7XHJcbiAgICB0aGlzLmxhc3RNb3VzZVkgPSBldmVudC5jbGllbnRZO1xyXG4gIH1cclxuXHJcbiAgLy8g5YWo5bGP5qih5byP5LiL55qE6byg5qCH5p2+5byA5LqL5Lu277yI57uT5p2f5ouW5ou977yJXHJcbiAgb25GdWxsc2NyZWVuTW91c2VVcChldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmlzRnVsbHNjcmVlbiB8fCAhdGhpcy5uY1doZWVsU2NhbGUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaXNEcmFnZ2luZyA9IGZhbHNlO1xyXG4gICAgZG9jdW1lbnQuYm9keS5zdHlsZS5jdXJzb3IgPSAnJztcclxuICB9XHJcblxyXG4gIC8vIOmZkOWItuWbvueJh+WBj+enu+mHj+iMg+WbtFxyXG4gIHByaXZhdGUgY29uc3RyYWluVHJhbnNsYXRpb24oKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5mdWxsc2NyZWVuU2NhbGUgPD0gMSkge1xyXG4gICAgICB0aGlzLmZ1bGxzY3JlZW5UcmFuc2xhdGVYID0gMDtcclxuICAgICAgdGhpcy5mdWxsc2NyZWVuVHJhbnNsYXRlWSA9IDA7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyDojrflj5blhajlsY/lm77niYfnmoTlrp7pmYXmmL7npLrlsLrlr7jvvIjogIPomZFvYmplY3QtZml0OiBjb250YWlu77yJXHJcbiAgICBjb25zdCB2aWV3cG9ydFdpZHRoID0gd2luZG93LmlubmVyV2lkdGggKiAwLjk7IC8vIDkwdndcclxuICAgIGNvbnN0IHZpZXdwb3J0SGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0ICogMC45OyAvLyA5MHZoXHJcblxyXG4gICAgLy8g6K6h566X5Zu+54mH5Zyo5b2T5YmN57yp5pS+5LiL6LaF5Ye66KeG5Y+j55qE6YOo5YiGXHJcbiAgICBjb25zdCBzY2FsZWRXaWR0aCA9IHZpZXdwb3J0V2lkdGggKiB0aGlzLmZ1bGxzY3JlZW5TY2FsZTtcclxuICAgIGNvbnN0IHNjYWxlZEhlaWdodCA9IHZpZXdwb3J0SGVpZ2h0ICogdGhpcy5mdWxsc2NyZWVuU2NhbGU7XHJcblxyXG4gICAgY29uc3QgbWF4VHJhbnNsYXRlWCA9IE1hdGgubWF4KDAsIChzY2FsZWRXaWR0aCAtIHdpbmRvdy5pbm5lcldpZHRoKSAvIDIpO1xyXG4gICAgY29uc3QgbWF4VHJhbnNsYXRlWSA9IE1hdGgubWF4KDAsIChzY2FsZWRIZWlnaHQgLSB3aW5kb3cuaW5uZXJIZWlnaHQpIC8gMik7XHJcblxyXG4gICAgLy8g6ZmQ5Yi2WOi9tOWBj+enu1xyXG4gICAgdGhpcy5mdWxsc2NyZWVuVHJhbnNsYXRlWCA9IE1hdGgubWF4KC1tYXhUcmFuc2xhdGVYLCBNYXRoLm1pbihtYXhUcmFuc2xhdGVYLCB0aGlzLmZ1bGxzY3JlZW5UcmFuc2xhdGVYKSk7XHJcbiAgICAvLyDpmZDliLZZ6L205YGP56e7XHJcbiAgICB0aGlzLmZ1bGxzY3JlZW5UcmFuc2xhdGVZID0gTWF0aC5tYXgoLW1heFRyYW5zbGF0ZVksIE1hdGgubWluKG1heFRyYW5zbGF0ZVksIHRoaXMuZnVsbHNjcmVlblRyYW5zbGF0ZVkpKTtcclxuICB9XHJcblxyXG4gIC8vIOiOt+WPluWFqOWxj+WbvueJh+eahHRyYW5zZm9ybeagt+W8j1xyXG4gIGdldEZ1bGxzY3JlZW5JbWFnZVRyYW5zZm9ybSgpOiBzdHJpbmcge1xyXG4gICAgLy8g5YWI5bmz56e75YaN57yp5pS+77yM6L+Z5qC35bmz56e755qE5YOP57Sg5YC85LiN5Lya6KKr57yp5pS+5b2x5ZONXHJcbiAgICByZXR1cm4gYHRyYW5zbGF0ZSgke3RoaXMuZnVsbHNjcmVlblRyYW5zbGF0ZVh9cHgsICR7dGhpcy5mdWxsc2NyZWVuVHJhbnNsYXRlWX1weCkgc2NhbGUoJHt0aGlzLmZ1bGxzY3JlZW5TY2FsZX0pYDtcclxuICB9XHJcblxyXG4gIC8vIOWPjOWHu+mHjee9rue8qeaUvlxyXG4gIG9uRnVsbHNjcmVlbkRvdWJsZUNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuaXNGdWxsc2NyZWVuIHx8ICF0aGlzLm5jV2hlZWxTY2FsZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIHRoaXMucmVzZXRGdWxsc2NyZWVuWm9vbSgpO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwibmMtZ2FsbGVyaWFcIiAjZ2FsbGVyaWFDb250YWluZXIgW3N0eWxlLndpZHRoXT1cIm5jV2lkdGhcIiBbc3R5bGUuaGVpZ2h0XT1cIm5jSGVpZ2h0XCJcclxuICAgIChtb3VzZWVudGVyKT1cIm9uTW91c2VFbnRlcigpXCIgKG1vdXNlbGVhdmUpPVwib25Nb3VzZUxlYXZlKClcIiB0YWJpbmRleD1cIjBcIiByb2xlPVwiaW1nXCJcclxuICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ+WbvueJh+eUu+W7iu+8jOW9k+WJjeesrCcgKyAoY3VycmVudEluZGV4ICsgMSkgKyAn5byg77yM5YWxJyArIG5jSW1hZ2VzLmxlbmd0aCArICflvKAnXCJcclxuICAgICpuZ0lmPVwibmNJbWFnZXMgJiYgbmNJbWFnZXMubGVuZ3RoID4gMFwiPlxyXG5cclxuICAgIDwhLS0g5Li75Zu+5pi+56S65Yy65Z+fIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImdhbGxlcmlhLW1haW5cIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibWFpbi1pbWFnZS1jb250YWluZXJcIiBbY2xhc3MubmF2LWhvdmVyLW1vZGVdPVwibmNOYXZCdXR0b25zRGlzcGxheSA9PT0gJ2hvdmVyJ1wiXHJcbiAgICAgICAgICAgIFtjbGFzcy5mdWxsLWhvdmVyLW1vZGVdPVwibmNGdWxsc2NyZWVuQnV0dG9uRGlzcGxheSA9PT0gJ2hvdmVyJ1wiPlxyXG4gICAgICAgICAgICA8aW1nIFtzcmNdPVwibmNJbWFnZXNbY3VycmVudEluZGV4XS5zcmNcIiBbc3R5bGUub2JqZWN0LWZpdF09XCJuY09iamVjdEZpdFwiIFthbHRdPVwiJ+WbvueJhyAnICsgKGN1cnJlbnRJbmRleCArIDEpXCJcclxuICAgICAgICAgICAgICAgIFtjbGFzcy5jbGlja2FibGVdPVwibmNFbmFibGVGdWxsc2NyZWVuXCIgKGVycm9yKT1cIm9uSW1hZ2VFcnJvcigkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJuY0VuYWJsZUZ1bGxzY3JlZW4gJiYgb3BlbkZ1bGxzY3JlZW4oKVwiIGNsYXNzPVwibWFpbi1pbWFnZVwiPlxyXG5cclxuICAgICAgICAgICAgPCEtLSDmlbDnm67kv6Hmga8gLS0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbmRleC1jb250YWluZXJcIiAqbmdJZj1cIm5jU2hvd0luZGV4ICYmIG5jSW1hZ2VzLmxlbmd0aCA+IDFcIj5cclxuICAgICAgICAgICAgICAgIHt7Y3VycmVudEluZGV4ICsgMX19IC8ge3tuY0ltYWdlcy5sZW5ndGh9fVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDwhLS0g5qCH6aKY5L+h5oGvIC0tPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGUtY29udGFpbmVyXCIgKm5nSWY9XCJuY1Nob3dUaXRsZSAmJiBuY0ltYWdlc1tjdXJyZW50SW5kZXhdLnRpdGxlXCI+XHJcbiAgICAgICAgICAgICAgICB7e25jSW1hZ2VzW2N1cnJlbnRJbmRleF0udGl0bGV9fVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDwhLS0g5YWo5bGP5oyJ6ZKuIC0tPlxyXG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiZnVsbHNjcmVlbi1idXR0b25cIiAqbmdJZj1cIm5jRW5hYmxlRnVsbHNjcmVlbiAmJiBuY0Z1bGxzY3JlZW5CdXR0b25EaXNwbGF5ICE9PSAnaGlkZGVuJ1wiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib3BlbkZ1bGxzY3JlZW4oKVwiIFthdHRyLmFyaWEtbGFiZWxdPVwiJ+WFqOWxj+mihOiniCdcIj5cclxuICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk04IDNINWEyIDIgMCAwIDAtMiAydjNtMTggMFY1YTIgMiAwIDAgMC0yLTJoLTNtMCAxOGgzYTIgMiAwIDAgMCAyLTJ2LTNNMyAxNnYzYTIgMiAwIDAgMCAyIDJoM1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgICAgICAgPCEtLSDlr7zoiKrmjInpkq4gLS0+XHJcbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJuYXYtYnV0dG9uIG5hdi1wcmV2XCIgKGNsaWNrKT1cInByZXZpb3VzSW1hZ2UoKVwiXHJcbiAgICAgICAgICAgICAgICAqbmdJZj1cIm5jU2hvd05hdkJ1dHRvbnMgJiYgbmNJbWFnZXMubGVuZ3RoID4gMVwiIFthdHRyLmFyaWEtbGFiZWxdPVwiJ+S4iuS4gOW8oOWbvueJhydcIj5cclxuICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xNSAxOEw5IDEyTDE1IDZcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJuYXYtYnV0dG9uIG5hdi1uZXh0XCIgKGNsaWNrKT1cIm5leHRJbWFnZSgpXCIgKm5nSWY9XCJuY1Nob3dOYXZCdXR0b25zICYmIG5jSW1hZ2VzLmxlbmd0aCA+IDFcIlxyXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIn5LiL5LiA5byg5Zu+54mHJ1wiPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTkgMThMMTUgMTJMOSA2XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICAgICAgICA8IS0tIOWGhemDqOaMh+ekuuWZqCAtLT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImluZGljYXRvcnMgaW5kaWNhdG9ycy1pbnNpZGVcIlxyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJuY1Nob3dJbmRpY2F0b3JzICYmIG5jSW5kaWNhdG9yc1Bvc2l0aW9uID09PSAnaW5zaWRlJyAmJiBuY0ltYWdlcy5sZW5ndGggPiAxXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImluZGljYXRvclwiICpuZ0Zvcj1cImxldCBpbWFnZSBvZiBuY0ltYWdlczsgbGV0IGkgPSBpbmRleFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJpID09PSBjdXJyZW50SW5kZXhcIiBbYXR0ci5hcmlhLWxhYmVsXT1cIifot7PovazliLDnrKwnICsgKGkgKyAxKSArICflvKDlm77niYcnXCIgcm9sZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgdGFiaW5kZXg9XCIwXCIgKGNsaWNrKT1cInNlbGVjdEltYWdlKGkpXCIgKGtleWRvd24uZW50ZXIpPVwic2VsZWN0SW1hZ2UoaSlcIlxyXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duLnNwYWNlKT1cInNlbGVjdEltYWdlKGkpXCI+XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSDnvKnnlaXlm77lr7zoiKogLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZ2FsbGVyaWEtdGh1bWJuYWlsc1wiICpuZ0lmPVwibmNTaG93VGh1bWJuYWlscyAmJiBuY0ltYWdlcy5sZW5ndGggPiAxXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInRodW1ibmFpbHMtY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgIDwhLS0g5bem5rua5Yqo5oyJ6ZKuIC0tPlxyXG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2Nyb2xsLWJ1dHRvbiBzY3JvbGwtbGVmdFwiIChjbGljayk9XCJzY3JvbGxUaHVtYm5haWxzTGVmdCgpXCJcclxuICAgICAgICAgICAgICAgICpuZ0lmPVwiIXNob3VsZENlbnRlclRodW1ibmFpbHMgJiYgY2FuU2Nyb2xsTGVmdCgpXCIgW2F0dHIuYXJpYS1sYWJlbF09XCIn5ZCR5bem5rua5Yqo57yp55Wl5Zu+J1wiPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE1IDE4TDkgMTJMMTUgNlwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgICAgICAgPCEtLSDnvKnnlaXlm77liJfooaggLS0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aHVtYm5haWxzLWxpc3QtY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGh1bWJuYWlscy1saXN0XCIgW2NsYXNzLmNlbnRlci10aHVtYm5haWxzXT1cInNob3VsZENlbnRlclRodW1ibmFpbHNcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtzdHlsZS50cmFuc2Zvcm1dPVwic2hvdWxkQ2VudGVyVGh1bWJuYWlscyA/ICdub25lJyA6ICd0cmFuc2xhdGVYKCcgKyB0aHVtYm5haWxUcmFuc2Zvcm0gKyAncHgpJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aHVtYm5haWwtaXRlbVwiICpuZ0Zvcj1cImxldCBpbWFnZSBvZiBuY0ltYWdlczsgbGV0IGkgPSBpbmRleFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiaSA9PT0gY3VycmVudEluZGV4XCIgW3N0eWxlLndpZHRoLnB4XT1cIm5jVGh1bWJuYWlsV2lkdGhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cIm5jVGh1bWJuYWlsSGVpZ2h0XCIgW2F0dHIuYXJpYS1sYWJlbF09XCIn57yp55Wl5Zu+ICcgKyAoaSArIDEpXCIgcm9sZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiIChjbGljayk9XCJzZWxlY3RJbWFnZShpKVwiIChrZXlkb3duLmVudGVyKT1cInNlbGVjdEltYWdlKGkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uc3BhY2UpPVwic2VsZWN0SW1hZ2UoaSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBbc3JjXT1cImltYWdlLnNyY1wiIFthbHRdPVwiJ+e8qeeVpeWbviAnICsgKGkgKyAxKVwiIChlcnJvcik9XCJvblRodW1ibmFpbEVycm9yKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0aHVtYm5haWwtaW1hZ2VcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDwhLS0g5Y+z5rua5Yqo5oyJ6ZKuIC0tPlxyXG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2Nyb2xsLWJ1dHRvbiBzY3JvbGwtcmlnaHRcIiAoY2xpY2spPVwic2Nyb2xsVGh1bWJuYWlsc1JpZ2h0KClcIlxyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCIhc2hvdWxkQ2VudGVyVGh1bWJuYWlscyAmJiBjYW5TY3JvbGxSaWdodCgpXCIgW2F0dHIuYXJpYS1sYWJlbF09XCIn5ZCR5Y+z5rua5Yqo57yp55Wl5Zu+J1wiPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTkgMThMMTUgMTJMOSA2XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIOWklumDqOaMh+ekuuWZqCAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJpbmRpY2F0b3JzIGluZGljYXRvcnMtb3V0c2lkZVwiXHJcbiAgICAgICAgKm5nSWY9XCJuY1Nob3dJbmRpY2F0b3JzICYmIG5jSW5kaWNhdG9yc1Bvc2l0aW9uID09PSAnb3V0c2lkZScgJiYgbmNJbWFnZXMubGVuZ3RoID4gMVwiXHJcbiAgICAgICAgW25nU3R5bGVdPVwieydtYXJnaW4tdG9wJzogbmNTaG93VGh1bWJuYWlscyA/ICcwJyA6ICcxMnB4J31cIj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cImluZGljYXRvclwiICpuZ0Zvcj1cImxldCBpbWFnZSBvZiBuY0ltYWdlczsgbGV0IGkgPSBpbmRleFwiIFtjbGFzcy5hY3RpdmVdPVwiaSA9PT0gY3VycmVudEluZGV4XCJcclxuICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIn6Lez6L2s5Yiw56ysJyArIChpICsgMSkgKyAn5byg5Zu+54mHJ1wiIHJvbGU9XCJidXR0b25cIiB0YWJpbmRleD1cIjBcIiAoY2xpY2spPVwic2VsZWN0SW1hZ2UoaSlcIlxyXG4gICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJzZWxlY3RJbWFnZShpKVwiIChrZXlkb3duLnNwYWNlKT1cInNlbGVjdEltYWdlKGkpXCI+XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuPCEtLSDnqbrnirbmgIEgLS0+XHJcbjxkaXYgY2xhc3M9XCJnYWxsZXJpYS1lbXB0eVwiIFtzdHlsZS53aWR0aF09XCJuY1dpZHRoXCIgW3N0eWxlLmhlaWdodF09XCJuY0hlaWdodFwiXHJcbiAgICAqbmdJZj1cIiFuY0ltYWdlcyB8fCBuY0ltYWdlcy5sZW5ndGggPT09IDBcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJlbXB0eS1jb250ZW50XCI+XHJcbiAgICAgICAgPHN2ZyB3aWR0aD1cIjY0XCIgaGVpZ2h0PVwiNjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBjbGFzcz1cImVtcHR5LWljb25cIj5cclxuICAgICAgICAgICAgPHJlY3QgeD1cIjNcIiB5PVwiM1wiIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxOFwiIHJ4PVwiMlwiIHJ5PVwiMlwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIiAvPlxyXG4gICAgICAgICAgICA8Y2lyY2xlIGN4PVwiOC41XCIgY3k9XCI4LjVcIiByPVwiMS41XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIC8+XHJcbiAgICAgICAgICAgIDxwb2x5bGluZSBwb2ludHM9XCIyMSwxNSAxNiwxMCA1LDIxXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIC8+XHJcbiAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgPHA+5pqC5peg5Zu+54mHPC9wPlxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuPCEtLSDlhajlsY/pooTop4jmqKHmgIHmoYYgLS0+XHJcbjxkaXYgY2xhc3M9XCJmdWxsc2NyZWVuLW1vZGFsXCIgKm5nSWY9XCJpc0Z1bGxzY3JlZW5cIiAoY2xpY2spPVwiY2xvc2VGdWxsc2NyZWVuKClcIiAoa2V5ZG93bik9XCJvbkZ1bGxzY3JlZW5LZXlEb3duKCRldmVudClcIlxyXG4gICAgdGFiaW5kZXg9XCIwXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZnVsbHNjcmVlbi1jb250ZW50XCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxyXG4gICAgICAgIDwhLS0g5YWz6Zet5oyJ6ZKuIC0tPlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJmdWxsc2NyZWVuLWNsb3NlXCIgKGNsaWNrKT1cImNsb3NlRnVsbHNjcmVlbigpXCIgW2F0dHIuYXJpYS1sYWJlbF09XCIn5YWz6Zet5YWo5bGPJ1wiPlxyXG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxyXG4gICAgICAgICAgICAgICAgPGxpbmUgeDE9XCIxOFwiIHkxPVwiNlwiIHgyPVwiNlwiIHkyPVwiMThcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgLz5cclxuICAgICAgICAgICAgICAgIDxsaW5lIHgxPVwiNlwiIHkxPVwiNlwiIHgyPVwiMThcIiB5Mj1cIjE4XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIC8+XHJcbiAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgICA8IS0tIOaSreaUvi/mmoLlgZzmjInpkq4gLS0+XHJcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImZ1bGxzY3JlZW4tcGxheS1wYXVzZVwiICpuZ0lmPVwibmNBdXRvUGxheSAmJiBuY0ltYWdlcy5sZW5ndGggPiAxXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUZ1bGxzY3JlZW5BdXRvUGxheSgpXCIgW2F0dHIuYXJpYS1sYWJlbF09XCJpc0Z1bGxzY3JlZW5BdXRvUGxheWluZyA/ICfmmoLlgZzoh6rliqjmkq3mlL4nIDogJ+W8gOWni+iHquWKqOaSreaUvidcIj5cclxuICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBhcmlhLWhpZGRlbj1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCIhaXNGdWxsc2NyZWVuQXV0b1BsYXlpbmdcIj5cclxuICAgICAgICAgICAgICAgIDwhLS0g5pKt5pS+5Zu+5qCHIC0tPlxyXG4gICAgICAgICAgICAgICAgPHBvbHlnb24gcG9pbnRzPVwiNSwzIDE5LDEyIDUsMjFcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgLz5cclxuICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICpuZ0lmPVwiaXNGdWxsc2NyZWVuQXV0b1BsYXlpbmdcIj5cclxuICAgICAgICAgICAgICAgIDwhLS0g5pqC5YGc5Zu+5qCHIC0tPlxyXG4gICAgICAgICAgICAgICAgPHJlY3QgeD1cIjZcIiB5PVwiNFwiIHdpZHRoPVwiNFwiIGhlaWdodD1cIjE2XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiIC8+XHJcbiAgICAgICAgICAgICAgICA8cmVjdCB4PVwiMTRcIiB5PVwiNFwiIHdpZHRoPVwiNFwiIGhlaWdodD1cIjE2XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiIC8+XHJcbiAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgICA8IS0tIOe8qeaUvuaPkOekuiAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZnVsbHNjcmVlbi16b29tLWhpbnRcIiAqbmdJZj1cIm5jV2hlZWxTY2FsZVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiem9vbS1oaW50LWNvbnRlbnRcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuPua7mui9rue8qeaUviDigKIg5ouW5ou95bmz56e7IOKAoiDlj4zlh7vph43nva48L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIOWFqOWxj+WbvueJhyAtLT5cclxuICAgICAgICA8aW1nIFtzcmNdPVwibmNJbWFnZXNbY3VycmVudEluZGV4XS5zcmNcIiBbYWx0XT1cIiflhajlsY/pooTop4ggLSDlm77niYcgJyArIChjdXJyZW50SW5kZXggKyAxKVwiIChlcnJvcik9XCJvbkltYWdlRXJyb3IoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwiZnVsbHNjcmVlbi1pbWFnZVwiIFtjbGFzcy5zY2FsYWJsZV09XCJuY1doZWVsU2NhbGVcIlxyXG4gICAgICAgICAgICBbc3R5bGUudHJhbnNmb3JtXT1cIm5jV2hlZWxTY2FsZSA/IGdldEZ1bGxzY3JlZW5JbWFnZVRyYW5zZm9ybSgpIDogJydcIlxyXG4gICAgICAgICAgICBbc3R5bGUuY3Vyc29yXT1cIm5jV2hlZWxTY2FsZSAmJiBmdWxsc2NyZWVuU2NhbGUgPiAxID8gJ2dyYWInIDogKG5jV2hlZWxTY2FsZSA/ICd6b29tLWluJyA6ICcnKVwiXHJcbiAgICAgICAgICAgICh3aGVlbCk9XCJvbkZ1bGxzY3JlZW5XaGVlbCgkZXZlbnQpXCIgKG1vdXNlZG93bik9XCJvbkZ1bGxzY3JlZW5Nb3VzZURvd24oJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIChtb3VzZW1vdmUpPVwib25GdWxsc2NyZWVuTW91c2VNb3ZlKCRldmVudClcIiAobW91c2V1cCk9XCJvbkZ1bGxzY3JlZW5Nb3VzZVVwKCRldmVudClcIlxyXG4gICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJvbkZ1bGxzY3JlZW5Nb3VzZVVwKCRldmVudClcIiAoZGJsY2xpY2spPVwib25GdWxsc2NyZWVuRG91YmxlQ2xpY2soJGV2ZW50KVwiPlxyXG5cclxuICAgICAgICA8IS0tIOWFqOWxj+WvvOiIquaMiemSriAtLT5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiZnVsbHNjcmVlbi1uYXYgZnVsbHNjcmVlbi1uYXYtcHJldlwiIChjbGljayk9XCJwcmV2aW91c0ltYWdlKClcIiAqbmdJZj1cIm5jSW1hZ2VzLmxlbmd0aCA+IDFcIlxyXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIifkuIrkuIDlvKDlm77niYcnXCI+XHJcbiAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIzMlwiIGhlaWdodD1cIjMyXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XHJcbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE1IDE4TDkgMTJMMTUgNlwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiZnVsbHNjcmVlbi1uYXYgZnVsbHNjcmVlbi1uYXYtbmV4dFwiIChjbGljayk9XCJuZXh0SW1hZ2UoKVwiICpuZ0lmPVwibmNJbWFnZXMubGVuZ3RoID4gMVwiXHJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ+S4i+S4gOW8oOWbvueJhydcIj5cclxuICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjMyXCIgaGVpZ2h0PVwiMzJcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cclxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOSAxOEwxNSAxMkw5IDZcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgPCEtLSDlhajlsY/mjIfnpLrlmaggLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZ1bGxzY3JlZW4taW5kaWNhdG9yc1wiICpuZ0lmPVwibmNJbWFnZXMubGVuZ3RoID4gMVwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZ1bGxzY3JlZW4taW5kaWNhdG9yXCIgKm5nRm9yPVwibGV0IGltYWdlIG9mIG5jSW1hZ2VzOyBsZXQgaSA9IGluZGV4XCJcclxuICAgICAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiaSA9PT0gY3VycmVudEluZGV4XCIgW2F0dHIuYXJpYS1sYWJlbF09XCIn6Lez6L2s5Yiw56ysJyArIChpICsgMSkgKyAn5byg5Zu+54mHJ1wiIHJvbGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgdGFiaW5kZXg9XCIwXCIgKGNsaWNrKT1cInNlbGVjdEltYWdlKGkpXCIgKGtleWRvd24uZW50ZXIpPVwic2VsZWN0SW1hZ2UoaSlcIiAoa2V5ZG93bi5zcGFjZSk9XCJzZWxlY3RJbWFnZShpKVwiPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0g5Zu+54mH5L+h5oGvIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmdWxsc2NyZWVuLWluZm9cIj5cclxuICAgICAgICAgICAgPHNwYW4+e3tjdXJyZW50SW5kZXggKyAxfX0gLyB7e25jSW1hZ2VzLmxlbmd0aH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cIm5jV2hlZWxTY2FsZVwiIGNsYXNzPVwiem9vbS1zdGF0dXNcIj5cclxuICAgICAgICAgICAgICAgIHt7IChmdWxsc2NyZWVuU2NhbGUgKiAxMDApLnRvRml4ZWQoMCkgfX0lXHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJuY0F1dG9QbGF5ICYmIG5jSW1hZ2VzLmxlbmd0aCA+IDFcIiBjbGFzcz1cImF1dG9wbGF5LXN0YXR1c1wiPlxyXG4gICAgICAgICAgICAgICAge3sgaXNGdWxsc2NyZWVuQXV0b1BsYXlpbmcgPyAn6Ieq5Yqo5pKt5pS+5LitJyA6ICflt7LmmoLlgZwnIH19XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj4iXX0=