UNPKG

ngx-crystal-gallery

Version:

Responsive gallery with support for masonry layout and lightbox.

1,376 lines 145 kB
import { Component, Input, EventEmitter, HostBinding, HostListener, ViewChild, ElementRef, ChangeDetectorRef, Injectable, Injector, ComponentFactoryResolver, ApplicationRef, Output, Directive, NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
var LightboxComponent = /** @class */ (function () {
    function LightboxComponent(elementRef, ref) {
        this.elementRef = elementRef;
        this.ref = ref;
        this.currentImageIndex = 0;
        this.spinnerHeight = 30;
        this.descriptionHeight = 43;
        this.close = new EventEmitter();
        this.showLightbox = false;
        this.hideControls = false;
    }
    Object.defineProperty(LightboxComponent.prototype, "images", {
        get: /**
         * @return {?}
         */
        function () {
            return this.data.images;
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(LightboxComponent.prototype, "config", {
        get: /**
         * @return {?}
         */
        function () {
            return this.data.config;
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(LightboxComponent.prototype, "index", {
        get: /**
         * @return {?}
         */
        function () {
            return this.currentImageIndex;
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(LightboxComponent.prototype, "currImagePath", {
        get: /**
         * @return {?}
         */
        function () {
            /** @type {?} */
            var image = this.images[this.index];
            if (!image) {
                return false;
            }
            if (image.path) {
                image.full = image.path;
            }
            return image;
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(LightboxComponent.prototype, "prevImagePath", {
        get: /**
         * @return {?}
         */
        function () {
            return this.images[this.prevIndex];
        },
        set: /**
         * @param {?} value
         * @return {?}
         */
        function (value) {
            this.images[this.prevIndex] = value;
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(LightboxComponent.prototype, "isFirst", {
        get: /**
         * @return {?}
         */
        function () {
            return this.index === 0;
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(LightboxComponent.prototype, "isLast", {
        get: /**
         * @return {?}
         */
        function () {
            return this.index === (this.images.length - 1);
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(LightboxComponent.prototype, "latestImageIndex", {
        get: /**
         * @return {?}
         */
        function () {
            return this.images.length - 1;
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(LightboxComponent.prototype, "description", {
        get: /**
         * @return {?}
         */
        function () {
            return this.images[this.index].description;
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(LightboxComponent.prototype, "counter", {
        get: /**
         * @return {?}
         */
        function () {
            return this.currentImageIndex + 1 + '/' + this.images.length;
        },
        enumerable: true,
        configurable: true
    });
    /**
     * @param {?} event
     * @return {?}
     */
    LightboxComponent.prototype.onKeyDown = /**
     * @param {?} event
     * @return {?}
     */
    function (event) {
        switch (event.key) {
            case 'ArrowLeft':
                this.prev();
                break;
            case 'ArrowRight':
                this.next();
                break;
            case 'Escape':
                this.closeLightbox();
                break;
        }
    };
    /**
     * @param {?} event
     * @return {?}
     */
    LightboxComponent.prototype.onMouseEnter = /**
     * @param {?} event
     * @return {?}
     */
    function (event) {
        this.hideControls = false;
    };
    /**
     * @return {?}
     */
    LightboxComponent.prototype.ngOnInit = /**
     * @return {?}
     */
    function () {
        var _this = this;
        this.setBackgroundOpacity(this.config.backgroundOpacity);
        this.currentImageIndex = this.config.index;
        //document.body.style.overflow = 'hidden';
        setTimeout(function () {
            _this.showLightbox = true;
        }, 30);
        this.setMaxDimensions();
        this.setAnimationDuration();
    };
    /**
     * @return {?}
     */
    LightboxComponent.prototype.closeLightbox = /**
     * @return {?}
     */
    function () {
        var _this = this;
        this.showLightbox = false;
        setTimeout(function () {
            _this.close.emit('close');
            //document.body.style.overflow = '';
        }, this.config.animationDuration);
    };
    /**
     * @return {?}
     */
    LightboxComponent.prototype.next = /**
     * @return {?}
     */
    function () {
        var _this = this;
        if (this.isLast) {
            if (this.config.loop) {
                this.currentImageIndex = 0;
            }
            else {
                return;
            }
        }
        else {
            this.currentImageIndex++;
        }
        this.currImageLoaded = 'loading';
        setTimeout(function () {
            if (_this.currImageLoaded === 'loading') {
                _this.currImageLoaded = false;
            }
        }, 50);
        this.setMaxDimensions();
    };
    /**
     * @return {?}
     */
    LightboxComponent.prototype.prev = /**
     * @return {?}
     */
    function () {
        var _this = this;
        if (this.isFirst) {
            if (this.config.loop) {
                this.currentImageIndex = this.latestImageIndex;
            }
            else {
                return;
            }
        }
        else {
            this.currentImageIndex--;
        }
        setTimeout(function () {
            if (_this.currImageLoaded === 'loading') {
                _this.currImageLoaded = false;
            }
        }, 50);
        this.setMaxDimensions();
    };
    /**
     * @return {?}
     */
    LightboxComponent.prototype.onImageLoaded = /**
     * @return {?}
     */
    function () {
        this.currImageLoaded = true;
        this.ref.detectChanges();
    };
    /**
     * @param {?} opacity
     * @return {?}
     */
    LightboxComponent.prototype.setBackgroundOpacity = /**
     * @param {?} opacity
     * @return {?}
     */
    function (opacity) {
        this.hostStyleBackgroundColor = 'rgba(0, 0, 0, ' + opacity + ')';
    };
    /**
     * @return {?}
     */
    LightboxComponent.prototype.setMaxDimensions = /**
     * @return {?}
     */
    function () {
        if (this.description) {
            this.wrapperElem.nativeElement.style.height = 'calc(100% - ' + (this.descriptionHeight * 2) + 'px)';
        }
        else {
            this.wrapperElem.nativeElement.style.height = '';
        }
        this.currImageElem.nativeElement.style.maxHeight = 'calc(' + this.config.lightboxMaxHeight + ')';
        this.currImageElem.nativeElement.style.maxWidth = this.config.lightboxMaxWidth;
    };
    /**
     * @return {?}
     */
    LightboxComponent.prototype.setAnimationDuration = /**
     * @return {?}
     */
    function () {
        this.hostStyleTransition = 'opacity ' + this.config.animationDuration + 'ms';
    };
    LightboxComponent.decorators = [
        { type: Component, args: [{
                    selector: 'crystal-lightbox',
                    template: "<div class=\"cg-counter\" *ngIf=\"config.counter && images.length > 1\">{{counter}}</div>\n<div class=\"cg-description\" *ngIf=\"description\">{{description}}</div>\n\n<div \n\tclass=\"cg-close\" \n\t(click)=\"closeLightbox()\">Close</div>\n\n<div \n\tclass=\"cg-spinner\" \n\t *ngIf=\"!currImageLoaded\"></div>\n\n<div class=\"cg-wrapper\" #wrapper>\n\t<img \n\t\tclass=\"cg-curr-image\" \n\t\t#currImageElem \n\t\t[src]=\"currImagePath?.full\" \n\t\t[class.cg-show]=\"currImageLoaded\" \n\t\t(load)=\"onImageLoaded()\" />\n</div>\n\n<div \n\tclass=\"cg-prev\" \n\t[hidden]=\"isFirst && !config.loop\" \n\t(click)=\"prev()\"></div>\n<div \n\tclass=\"cg-next\" \n\t[hidden]=\"isLast && !config.loop\" \n\t(click)=\"next()\"></div>",
                    styles: ["._cg-spinner,._cg-spinner:after{border-radius:50%;width:36px;height:36px}._cg-spinner{margin:0 auto;font-size:10px;position:relative;text-indent:-9999em;border-top:4px solid rgba(255,255,255,.2);border-right:4px solid rgba(255,255,255,.2);border-bottom:4px solid rgba(255,255,255,.2);border-left:4px solid #fff;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-animation:.9s linear infinite load8;animation:.9s linear infinite load8}@-webkit-keyframes load8{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes load8{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.cg-spinner,.cg-spinner:after,.cg-spinner:before{border-radius:50%;width:10px;height:10px;-webkit-animation:1.5s ease-in-out infinite load7;animation:1.5s ease-in-out infinite load7}.cg-spinner{color:#fff;font-size:10px;margin:0 auto 20px;position:relative;text-indent:-9999em;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-animation-delay:-.16s;animation-delay:-.16s}.cg-spinner:after,.cg-spinner:before{content:\"\";position:absolute;top:0}.cg-spinner:before{left:-3em;-webkit-animation-delay:-.32s;animation-delay:-.32s}.cg-spinner:after{left:3em}@-webkit-keyframes load7{0%,100%,80%{box-shadow:0 2.5em 0 -1.3em}40%{box-shadow:0 2.5em 0 0}}@keyframes load7{0%,100%,80%{box-shadow:0 10px 0 -1.3em}40%{box-shadow:0 10px 0 0}}:host(.cg-show){opacity:1}:host(.cg-hide-controls) .cg-close,:host(.cg-hide-controls) .cg-next,:host(.cg-hide-controls) .cg-prev{opacity:0}:host{opacity:0;position:fixed;top:0;left:0;width:100%;height:100%;color:#fff;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;transition:opacity .1s cubic-bezier(.645,.045,.355,1);z-index:10000;background-color:rgba(0,0,0,.85)}:host img{opacity:1;max-width:100%;max-height:100%;box-shadow:0 4px 15px 2px rgba(0,0,0,.35)}:host img.cg-curr-image.cg-show{opacity:1}:host img.cg-curr-image{opacity:0;z-index:10}:host .cg-wrapper.cg-hide{display:none}:host .cg-wrapper{display:flex;align-items:center;justify-content:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;top:0;left:0;width:100%;height:100%}:host .cg-spinner{position:absolute;top:50%;left:50%;margin-top:-15px;margin-left:-5px}:host .cg-counter{text-align:left;position:absolute;left:22px;top:13px;font-size:14px;text-shadow:0 0 1px rgba(0,0,0,.65);z-index:30}:host .cg-description{text-align:center;max-width:calc(100% - 200px);margin:0 auto;font-size:14px;line-height:43px;position:relative;z-index:50}:host .cg-close{position:absolute;top:0;right:0;padding:13px 22px;font-size:13px;text-transform:uppercase;cursor:pointer;opacity:.5;z-index:30;transition:opacity .1s ease-in-out;text-shadow:0 0 1px rgba(0,0,0,.65)}:host .cg-close:hover{opacity:1}:host .cg-next,:host .cg-prev{width:40%;height:100%;position:absolute;top:0;cursor:pointer;opacity:.5;z-index:20;transition:opacity .1s ease-in-out;-webkit-tap-highlight-color:rgba(255,255,255,0)}:host .cg-next:hover,:host .cg-prev:hover{opacity:1}:host .cg-prev{left:0;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAiCAYAAABbXymAAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTM4IDc5LjE1OTgyNCwgMjAxNi8wOS8xNC0wMTowOTowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTcgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjMzMTZCQzFERDgzMTExRTc5QUYxQTUxRDI5MkM5ODZCIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjMzMTZCQzFFRDgzMTExRTc5QUYxQTUxRDI5MkM5ODZCIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MzMxNkJDMUJEODMxMTFFNzlBRjFBNTFEMjkyQzk4NkIiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MzMxNkJDMUNEODMxMTFFNzlBRjFBNTFEMjkyQzk4NkIiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7VrwZKAAAClElEQVR42qzWSY8SQRgGYLoVHPeTXlwCiIwMArJGtiABNep4IGZi4oEfMJooLjePrnFGf5yJS0hYmq2b/aBxiQ6+lRRJdaUZq5vp5E2TLnioVFd9VZLN+iUxIdeMiW2fRVCmvz2DpJBVCk6X6SVBHQRLpVKb7Xb782g0Usrl8jM8W0P20+9YQn3JZPIhwN6MXoPBoI3nG8iKGZhF14A+AqrOmKtWq31F213kkOgQ69B0Ol0BqrFot9vV/H7/c7RfEoVZ1G+EdjqdvtfrfYn2K8gJkaHQodlstjIej/ssihdH0Ddov4acQo7QlycJo5PJhEc1j8fzmqJk2h1D7Lv1lkUv5nK5xzzaarWMUIcwms/nCTrgUbfbTdCrVtAAQafTqQ5VFEVdCi0UCk/Q0yGLNptN1el0vqLoaRHUxqPoKY/2KFo0g0r0ba4Wi8WnQEcs2mg0VAPULrJsZTqpNzDZ6yxar9dVl8tFVtR10SnFohJdgnZYuh9IkjSTZfknPn5DviO/kL/IjkgtIOhhJJ7JZF5gdU24hdDG6qqg/QJywEzlmg/FSTLhE4nE9nA4nHJFRvH5fJto94gOBfvyjtJxXI/H4x+A63re6/UUVDCCnzeDz6fbceQscjsWi703wFsM7hDBJQN8PRqNbmNn0OGapu0JfoviYx4PBAL30e5dCg+Hw0Z4e8/wfr/P451QKPRgaRzIFjDdksefsbjdKn5zER6JRMiwuP+3Ne2KB4PBLVVVR1xd+YK2O2bOFYvwd8CHbK/x/J6Zc8Ui/AZmxdtqtdrAwlFLpRLZrS/PYcnkEUuiY7hCS+g5sovT55+Qj7QS/jYD8zjp/UF6t9GS+oPed8zCLC5zJ0tSo//Q+8wKLHTw/ifAAMQVS4vHZR2VAAAAAElFTkSuQmCC) center left 22px no-repeat}:host .cg-next{right:0;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAiCAYAAABbXymAAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTM4IDc5LjE1OTgyNCwgMjAxNi8wOS8xNC0wMTowOTowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTcgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjEyNDE3MDE1RDgzMTExRTc5NjM4QTIzQzI2Rjc2Qjg2IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjEyNDE3MDE2RDgzMTExRTc5NjM4QTIzQzI2Rjc2Qjg2Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MTI0MTcwMTNEODMxMTFFNzk2MzhBMjNDMjZGNzZCODYiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MTI0MTcwMTREODMxMTFFNzk2MzhBMjNDMjZGNzZCODYiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7zv5BKAAACl0lEQVR42rTW224SQRwGcHZb8FT1Sm88BJCiFAE5JpyCBNRE8coYEy94AGqi9XDXS0+JVh/CB/EhiFET5LjAclgWjaa1aazfJDM6u6LuLjrJl2124cd0duY/I9h+NoELabtcTLcFCon0bw+SRE4h28hn2xyNoIvISrlcfqAoSluSpLepVKqCe6cRB/2MYAXei1wfjUbSLm34gX4ymbyN+z6rOBmC/ciNer3+fpdrwGXgd8h/YwVn8Dm/37/e6/UGOnyQTqfXrOBsKI4g571e76Nutzv8De43gwv05S0hx5CLwJ/iBWrwyWQyzGazpnHyITtyCDlBcI/H8wS4ZlhUVbWMO/R4p9P5Bc/lcnfx/Ow8+AW32z0LH+Xz+X+Dt9ttmcen0ynDA1bx4wR3Op2PW62WrOv5uFAo3JsXL1K8r+v5LNxmZrb8wJvNpn5YlGKxeJ/WFruZBcRPxUsul2u90WhocCyqBqk3dLGJiwbgb/T6FflCSqkoiluCIGjqNGzWgQUz9YR8aQ9yBqtyDQtH0q1KNZPJPMTzOHKA4oaHwuPz+SooUm0eHY/H00QisUEWFHKUDYVRdBmVr9Lv9/WoGo/HX+J5iY7/QSMvj003hnb0aCwWe4HnV5GTyGEj002DDgYDDYqdRo1Goxu0p3pU+BvqDQQCqzPQCUWvzINKejQcDltHQ6HQLaBdHh0Oh5ZRO0OBaFD8iIL7z82ibGtyRyKR1T+gl82g/GZ6Dev/HY/KsqwEg0FLKL/93+R7C3QM9Nk8KDtiOWq12jb2s2XS01Kp9Kparb7G/TfIR2QT2TF6UBS42bBEi/UK/SIBPyCfkC0zKA+z6rWPXm30tLlJr6ZQ/ZmYDYnI1eEdejV9Thb+18H7uwADAOG/Wcm4x+knAAAAAElFTkSuQmCC) center right 22px no-repeat}"]
                },] },
    ];
    /** @nocollapse */
    LightboxComponent.ctorParameters = function () { return [
        { type: ElementRef },
        { type: ChangeDetectorRef }
    ]; };
    LightboxComponent.propDecorators = {
        data: [{ type: Input }],
        showLightbox: [{ type: HostBinding, args: ['class.cg-show',] }],
        hideControls: [{ type: HostBinding, args: ['class.cg-hide-controls',] }],
        hostStyleTransition: [{ type: HostBinding, args: ['style.transition',] }],
        hostStyleBackgroundColor: [{ type: HostBinding, args: ['style.backgroundColor',] }],
        currImageElem: [{ type: ViewChild, args: ['currImageElem',] }],
        prevImageElem: [{ type: ViewChild, args: ['prevImageElem',] }],
        wrapperElem: [{ type: ViewChild, args: ['wrapper',] }],
        onKeyDown: [{ type: HostListener, args: ['window:keydown', ['$event'],] }],
        onMouseEnter: [{ type: HostListener, args: ["mouseenter", ['$event'],] }]
    };
    return LightboxComponent;
}());

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
var LightboxMobileComponent = /** @class */ (function () {
    function LightboxMobileComponent(elementRef, ref) {
        this.elementRef = elementRef;
        this.ref = ref;
        this.currImage = {
            show: false,
            loaded: false,
            index: 0
        };
        this.prevImage = {
            loaded: false
        };
        this.nextImage = {
            loaded: false
        };
        this.close = new EventEmitter();
        this.lightboxShown = false;
    }
    Object.defineProperty(LightboxMobileComponent.prototype, "images", {
        get: /**
         * @return {?}
         */
        function () {
            return this.data.images;
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(LightboxMobileComponent.prototype, "config", {
        get: /**
         * @return {?}
         */
        function () {
            return this.data.config;
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(LightboxMobileComponent.prototype, "index", {
        get: /**
         * @return {?}
         */
        function () {
            return this.currImage.index;
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(LightboxMobileComponent.prototype, "currImagePath", {
        get: /**
         * @return {?}
         */
        function () {
            /** @type {?} */
            var image = this.images[this.index];
            if (!image) {
                return false;
            }
            if (image.path) {
                image.full = image.path;
            }
            return image;
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(LightboxMobileComponent.prototype, "prevImagePath", {
        get: /**
         * @return {?}
         */
        function () {
            if (this.prevIndex < 0 && this.config.loop) {
                this.prevIndex = this.latestImageIndex;
            }
            /** @type {?} */
            var image = this.images[this.prevIndex];
            if (image && image.path) {
                image.full = image.path;
            }
            return image;
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(LightboxMobileComponent.prototype, "nextImagePath", {
        get: /**
         * @return {?}
         */
        function () {
            /** @type {?} */
            var image = this.images[this.nextIndex];
            if (image && image.path) {
                image.full = image.path;
            }
            return image;
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(LightboxMobileComponent.prototype, "isFirst", {
        get: /**
         * @return {?}
         */
        function () {
            if (this.config.loop) {
                return false;
            }
            else {
                return this.index === 0;
            }
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(LightboxMobileComponent.prototype, "isLast", {
        get: /**
         * @return {?}
         */
        function () {
            if (this.config.loop) {
                return false;
            }
            else {
                return this.index === this.latestImageIndex;
            }
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(LightboxMobileComponent.prototype, "latestImageIndex", {
        get: /**
         * @return {?}
         */
        function () {
            return this.images.length - 1;
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(LightboxMobileComponent.prototype, "isLandscape", {
        get: /**
         * @return {?}
         */
        function () {
            return window.innerWidth > window.innerHeight;
        },
        enumerable: true,
        configurable: true
    });
    /**
     * @param {?} event
     * @return {?}
     */
    LightboxMobileComponent.prototype.onWindowResize = /**
     * @param {?} event
     * @return {?}
     */
    function (event) {
        this.landscapeMode = this.isLandscape;
        this.ref.detectChanges();
    };
    /**
     * @return {?}
     */
    LightboxMobileComponent.prototype.ngOnInit = /**
     * @return {?}
     */
    function () {
        this.currImage.index = this.config.index;
        this.prevIndex = this.currImage.index - 1;
        this.nextIndex = this.currImage.index + 1;
        this.showLightbox();
    };
    /**
     * @return {?}
     */
    LightboxMobileComponent.prototype.showLightbox = /**
     * @return {?}
     */
    function () {
        var _this = this;
        this.currImage.show = true;
        setTimeout(function () {
            _this.lightboxShown = true;
        }, 30);
    };
    /**
     * @return {?}
     */
    LightboxMobileComponent.prototype.closeLightbox = /**
     * @return {?}
     */
    function () {
        var _this = this;
        this.lightboxShown = false;
        setTimeout(function () {
            _this.close.emit(true);
        }, 200);
    };
    /**
     * @param {?} event
     * @return {?}
     */
    LightboxMobileComponent.prototype.slide = /**
     * @param {?} event
     * @return {?}
     */
    function (event) {
        var _this = this;
        if (event === 'next') {
            if (this.isLast) {
                return;
            }
            else {
                setTimeout(function () {
                    _this.currImage.index++;
                }, 200);
            }
            if (this.index === this.latestImageIndex) {
                setTimeout(function () {
                    _this.currImage.index = 0;
                }, 200);
            }
            setTimeout(function () {
                _this.afterSlide('next');
            }, 300);
        }
        if (event === 'prev') {
            if (this.isFirst) {
                return;
            }
            else {
                setTimeout(function () {
                    _this.currImage.index--;
                }, 200);
            }
            if (this.index === 0) {
                setTimeout(function () {
                    _this.currImage.index = _this.latestImageIndex;
                }, 200);
            }
            setTimeout(function () {
                _this.afterSlide('prev');
            }, 300);
        }
    };
    /**
     * @param {?} eventType
     * @return {?}
     */
    LightboxMobileComponent.prototype.afterSlide = /**
     * @param {?} eventType
     * @return {?}
     */
    function (eventType) {
        this.currImage.show = true;
        if (this.index === this.latestImageIndex && this.config.loop) {
            this.nextIndex = 0;
        }
        else {
            this.nextIndex = this.index + 1;
        }
        if (this.index === 0 && this.config.loop) {
            this.prevIndex = this.latestImageIndex;
        }
        else {
            this.prevIndex = this.index - 1;
        }
        if (eventType === 'prev') {
            if (!this.prevImage.loaded) {
                this.currImage.loaded = false;
                this.prevImage.loaded = false;
            }
            if (!this.currImage.loaded) {
                this.nextImage.loaded = false;
            }
        }
        if (eventType === 'next') {
            if (!this.nextImage.loaded) {
                this.currImage.loaded = false;
                this.nextImage.loaded = false;
            }
            if (!this.currImage.loaded) {
                this.prevImage.loaded = false;
            }
        }
        this.defaultWrapperPosition();
        this.ref.detectChanges();
    };
    /**
     * @param {?} elem
     * @return {?}
     */
    LightboxMobileComponent.prototype.onImageLoaded = /**
     * @param {?} elem
     * @return {?}
     */
    function (elem) {
        this[elem].loaded = true;
        this.ref.detectChanges();
    };
    /**
     * @param {?} $event
     * @return {?}
     */
    LightboxMobileComponent.prototype.handlePinchEvents = /**
     * @param {?} $event
     * @return {?}
     */
    function ($event) {
        if ($event === 'prev') {
            this.slide('prev');
        }
        if ($event === 'next') {
            this.slide('next');
        }
    };
    /**
     * @return {?}
     */
    LightboxMobileComponent.prototype.defaultWrapperPosition = /**
     * @return {?}
     */
    function () {
        /** @type {?} */
        var elem = this.wrapperEl.nativeElement;
        elem.style.transition = 'all 0ms';
        elem.style.transform = 'matrix(1, 0, 0, 1, 0, 0)';
        elem.style.webkitTransform = 'matrix(1, 0, 0, 1, 0, 0)';
    };
    LightboxMobileComponent.decorators = [
        { type: Component, args: [{
                    selector: 'crystal-lightbox-mobile',
                    template: "<div class=\"cg-back\" (click)=\"closeLightbox()\"></div>\n\n<div \n\tclass=\"cg-wrapper\" \n\t[class.cg-landscape]=\"landscapeMode\"\n\tpinch [isLast]=\"isLast\" [isFirst]=\"isFirst\" (events)=\"handlePinchEvents($event)\"\n\t#wrapper>\n\t<div class=\"cg-image-wrap cg-prev-image\">\n\t\t<img \n\t\t\t*ngIf=\"prevImagePath\"\n\t\t\t[src]=\"prevImagePath.full\" \n\t\t\t[class.cg-hide]=\"!prevImage.loaded\"\n\t\t\t(load)=\"onImageLoaded('prevImage')\"\n\t\t/>\n\t\t<div class=\"cg-spinner\" *ngIf=\"!prevImage.loaded && prevImagePath\"></div>\n\t</div>\n\n\t<div class=\"cg-image-wrap cg-curr-image\" *ngIf=\"currImage.show\">\n\t\t<img \n\t\t\t[src]=\"currImagePath?.full\" \n\t\t\t[class.cg-hide]=\"!currImage.loaded\" \n\t\t\t(load)=\"onImageLoaded('currImage')\"\n\t\t/>\n\t\t<div class=\"cg-spinner\" *ngIf=\"!currImage.loaded\"></div>\n\t</div>\n\t\n\t<div class=\"cg-image-wrap cg-next-image\">\n\t\t<img \n\t\t\t*ngIf=\"nextImagePath\"\n\t\t\t[src]=\"nextImagePath.full\" \n\t\t\t[class.cg-hide]=\"!nextImage.loaded\" \n\t\t\t(load)=\"onImageLoaded('nextImage')\"\n\t\t/>\n\t\t<div class=\"cg-spinner\" *ngIf=\"!nextImage.loaded && nextImagePath\"></div>\n\t</div>\n</div>",
                    styles: ["._cg-spinner,._cg-spinner:after{border-radius:50%;width:36px;height:36px}._cg-spinner{margin:0 auto;font-size:10px;position:relative;text-indent:-9999em;border-top:4px solid rgba(255,255,255,.2);border-right:4px solid rgba(255,255,255,.2);border-bottom:4px solid rgba(255,255,255,.2);border-left:4px solid #fff;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-animation:.9s linear infinite load8;animation:.9s linear infinite load8}@-webkit-keyframes load8{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes load8{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.cg-spinner,.cg-spinner:after,.cg-spinner:before{border-radius:50%;width:10px;height:10px;-webkit-animation:1.5s ease-in-out infinite load7;animation:1.5s ease-in-out infinite load7}.cg-spinner{color:#fff;font-size:10px;margin:0 auto 20px;position:relative;text-indent:-9999em;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-animation-delay:-.16s;animation-delay:-.16s}.cg-spinner:after,.cg-spinner:before{content:\"\";position:absolute;top:0}.cg-spinner:before{left:-3em;-webkit-animation-delay:-.32s;animation-delay:-.32s}.cg-spinner:after{left:3em}@-webkit-keyframes load7{0%,100%,80%{box-shadow:0 2.5em 0 -1.3em}40%{box-shadow:0 2.5em 0 0}}@keyframes load7{0%,100%,80%{box-shadow:0 10px 0 -1.3em}40%{box-shadow:0 10px 0 0}}:host(.cg-show){opacity:1}:host(.cg-hide-controls) .cg-close,:host(.cg-hide-controls) .cg-next,:host(.cg-hide-controls) .cg-prev{opacity:0}:host{opacity:0;position:fixed;top:0;left:0;width:100%;height:100%;color:#fff;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;transition:opacity .2s cubic-bezier(.645,.045,.355,1);z-index:10000;background-color:#000}:host .cg-back{background:url(\"data:image/svg+xml,%3C%3Fxml version%3D%221.0%22 encoding%3D%22UTF-8%22%3F%3E%3Csvg width%3D%2210px%22 height%3D%2216px%22 viewBox%3D%220 0 10 16%22 version%3D%221.1%22 xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22 xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%3E    %3C!-- Generator%3A sketchtool 40.2 (33826) - http%3A%2F%2Fwww.bohemiancoding.com%2Fsketch --%3E    %3Ctitle%3E11A73872-5EBF-46F6-B7C5-142D47A33339%3C%2Ftitle%3E    %3Cdesc%3ECreated with sketchtool.%3C%2Fdesc%3E    %3Cdefs%3E%3C%2Fdefs%3E    %3Cg id%3D%22Interface-1280-x-800%22 stroke%3D%22none%22 stroke-width%3D%221%22 fill%3D%22none%22 fill-rule%3D%22evenodd%22%3E        %3Cg id%3D%22Lot_viewpage_open%22 transform%3D%22translate(-111.000000%2C -296.000000)%22 fill%3D%22%23FFFFFF%22%3E            %3Cg id%3D%22arrows-16px-1_minimal-left%22 transform%3D%22translate(111.000000%2C 296.000000)%22%3E                %3Cpolygon id%3D%22Shape%22 points%3D%228.1 15.7 0.4 8 8.1 0.3 9.6 1.7 3.3 8 9.6 14.3%22%3E%3C%2Fpolygon%3E            %3C%2Fg%3E        %3C%2Fg%3E    %3C%2Fg%3E%3C%2Fsvg%3E\") center/12px no-repeat;width:40px;height:40px;opacity:.9;position:fixed;top:0;left:0;z-index:1000}:host .cg-wrapper.cg-landscape .cg-image-wrap img{height:100%}:host .cg-wrapper{transition:none;width:100%;height:100%;display:block}:host .cg-wrapper .cg-image-wrap.cg-prev-image{-webkit-transform:translate3d(calc(-100% - 8px),0,0);transform:translate3d(calc(-100% - 8px),0,0)}:host .cg-wrapper .cg-image-wrap.cg-next-image{-webkit-transform:translate3d(calc(100% + 8px),0,0);transform:translate3d(calc(100% + 8px),0,0)}:host .cg-wrapper .cg-image-wrap{width:100%;height:100%;text-align:center;position:absolute;display:flex;align-items:center;justify-content:center}:host .cg-wrapper .cg-image-wrap img{max-width:100%;max-height:100%;width:auto;height:auto;position:relative}:host .cg-wrapper .cg-image-wrap img.cg-hide{display:none}"]
                },] },
    ];
    /** @nocollapse */
    LightboxMobileComponent.ctorParameters = function () { return [
        { type: ElementRef },
        { type: ChangeDetectorRef }
    ]; };
    LightboxMobileComponent.propDecorators = {
        data: [{ type: Input }],
        wrapperEl: [{ type: ViewChild, args: ['wrapper',] }],
        lightboxShown: [{ type: HostBinding, args: ['class.cg-show',] }],
        onWindowResize: [{ type: HostListener, args: ['window:resize', ['$event'],] }]
    };
    return LightboxMobileComponent;
}());

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
/** @type {?} */
var defaultConfig = {
    masonry: true,
    masonryMaxHeight: 200,
    masonryGutter: 4,
    loop: false,
    index: 0,
    backgroundOpacity: 0.85,
    counter: false,
    lightboxMaxHeight: "100%",
    lightboxMaxWidth: "100%",
    animationDuration: 100
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
var CrystalLightbox = /** @class */ (function () {
    function CrystalLightbox(componentFactoryResolver, appRef, injector) {
        this.componentFactoryResolver = componentFactoryResolver;
        this.appRef = appRef;
        this.injector = injector;
    }
    Object.defineProperty(CrystalLightbox.prototype, "isMobile", {
        get: /**
         * @return {?}
         */
        function () {
            /** @type {?} */
            var check = false;
            (function (a) { if (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0, 4)))
                check = true; })(navigator.userAgent || navigator.vendor);
            return check;
        },
        enumerable: true,
        configurable: true
    });
    /**
     * @param {?} component
     * @param {?} data
     * @return {?}
     */
    CrystalLightbox.prototype.appendComponentToBody = /**
     * @param {?} component
     * @param {?} data
     * @return {?}
     */
    function (component, data) {
        var _this = this;
        /** @type {?} */
        var componentRef = this.componentFactoryResolver
            .resolveComponentFactory(component)
            .create(this.injector);
        (/** @type {?} */ (componentRef.instance)).data = data;
        this.appRef.attachView(componentRef.hostView);
        /** @type {?} */
        var domElem = /** @type {?} */ ((/** @type {?} */ (componentRef.hostView)).rootNodes[0]);
        document.body.appendChild(domElem);
        (/** @type {?} */ (componentRef.instance)).close.subscribe(function () {
            _this.appRef.detachView(componentRef.hostView);
            componentRef.destroy();
        });
    };
    /**
     * @param {?} images
     * @param {?=} config
     * @return {?}
     */
    CrystalLightbox.prototype.open = /**
     * @param {?} images
     * @param {?=} config
     * @return {?}
     */
    function (images, config) {
        if (config === void 0) { config = {}; }
        config = this.applyConfigDefaults(defaultConfig, config);
        /** @type {?} */
        var data = {
            images: images,
            config: config
        };
        /** @type {?} */
        var component = this.getLightboxComponent();
        this.appendComponentToBody(component, data);
    };
    /**
     * @return {?}
     */
    CrystalLightbox.prototype.getLightboxComponent = /**
     * @return {?}
     */
    function () {
        return !this.isMobile ? LightboxComponent : LightboxMobileComponent;
    };
    /**
     * @param {?} defaultConfig
     * @param {?} config
     * @return {?}
     */
    CrystalLightbox.prototype.applyConfigDefaults = /**
     * @param {?} defaultConfig
     * @param {?} config
     * @return {?}
     */
    function (defaultConfig$$1, config) {
        if (!config.index) {
            config.index = 0;
        }
        return Object.assign(defaultConfig$$1, config);
    };
    CrystalLightbox.decorators = [
        { type: Injectable },
    ];
    /** @nocollapse */
    CrystalLightbox.ctorParameters = function () { return [
        { type: ComponentFactoryResolver },
        { type: ApplicationRef },
        { type: Injector }
    ]; };
    return CrystalLightbox;
}());

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
var GalleryComponent = /** @class */ (function () {
    function GalleryComponent(lightbox, elementRef) {
        this.lightbox = lightbox;
        this.elementRef = elementRef;
        this.config = {};
    }
    Object.defineProperty(GalleryComponent.prototype, "isNgContent", {
        get: /**
         * @return {?}
         */
        function () {
            return this.contentWrapper.nativeElement.children.length > 0;
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(GalleryComponent.prototype, "masonryState", {
        get: /**
         * @return {?}
         */
        function () {
            return this.config.masonry;
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(GalleryComponent.prototype, "masonryMaxHeight", {
        get: /**
         * @return {?}
         */
        function () {
            return this.config.masonryMaxHeight;
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(GalleryComponent.prototype, "masonryGutter", {
        get: /**
         * @return {?}
         */
        function () {
            return this.config.masonryGutter;
        },
        enumerable: true,
        configurable: true
    });
    /**
     * @param {?} images
     * @param {?} i
     * @return {?}
     */
    GalleryComponent.prototype.showLightbox = /**
     * @param {?} images
     * @param {?} i
     * @return {?}
     */
    function (images, i) {
        this.config.index = i;
        this.lightbox.open(images, this.config);
    };
    /**
     * @param {?} event
     * @return {?}
     */
    GalleryComponent.prototype.handleMasonryLayoutEvents = /**
     * @param {?} event
     * @return {?}
     */
    function (event) {
        this.showLightbox(this.images, event.index);
    };
    GalleryComponent.decorators = [
        { type: Component, args: [{
                    selector: 'crystal-gallery',
                    template: "<div #contentWrapper [hidden]=\"isNgContent\">\n    <ng-content></ng-content>\n</div>\n\n<masonry-layout \n    class=\"cg-wrapper\"\n    *ngIf=\"!isNgContent\" \n\n    [max-height]=\"masonryMaxHeight\" \n    [gutter]=\"masonryGutter\"\n    [masonry]=\"masonryState\"\n    [class-name]=\"'cg-image'\"\n    [images]=\"images\"\n    (events)=\"handleMasonryLayoutEvents($event)\"></masonry-layout>",
                    styles: [":host{display:block;width:100%}:host .cg-wrapper{display:block;width:100%;overflow:hidden}:host .cg-wrapper.cg-show{height:auto;position:relative;display:table}:host .cg-image img{cursor:pointer;width:100%}"],
                },] },
    ];
    /** @nocollapse */
    GalleryComponent.ctorParameters = function () { return [
        { type: CrystalLightbox },
        { type: ElementRef }
    ]; };
    GalleryComponent.propDecorators = {
        images: [{ type: Input, args: ['images',] }],
        config: [{ type: Input, args: ['config',] }],
        contentWrapper: [{ type: ViewChild, args: ['contentWrapper',] }]
    };
    return GalleryComponent;
}());

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
var MasonryLayoutComponent = /** @class */ (function () {
    function MasonryLayoutComponent(elementRef) {
        this.elementRef = elementRef;
        this.GUTTER = 0;
        this.savedNodeDimensions = [];
        this.gridState = 'not started';
        this.ENABLE_MASONRY = true;
        this.MAX_HEIGHT = 400;
        this.events = new EventEmitter();
        this.elem = this.elementRef.nativeElement;
    }
    Object.defineProperty(MasonryLayoutComponent.prototype, "gutter", {
        set: /**
         * @param {?} value
         * @return {?}
         */
        function (value) {
            this.GUTTER = value / 2;
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(MasonryLayoutComponent.prototype, "isMobile", {
        get: /**
         * @return {?}
         */
        function () {
            /** @type {?} */
            var check = false;
            (function (a) { if (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0, 4)))
                check = true; })(navigator.userAgent || navigator.vendor);
            return check;
        },
        enumerable: true,
        configurable: true
    });
    /**
     * @param {?} event
     * @return {?}
     */
    MasonryLayoutComponent.prototype.onWindowResize = /**
     * @param {?} event
     * @return {?}
     */
    function (event) {
        var _this = this;
        clearTimeout(this.resizeTimer);
        this.resizeTimer = setTimeout(function () {
            _this.gridState = 'not started';
            _this.buildGrid();
        }, 250);
    };
    /**
     * @return {?}
     */
    MasonryLayoutComponent.prototype.ngOnInit = /**
     * @return {?}
     */
    function () {
        this.buildGrid();
    };
    /**
     * @return {?}
     */
    MasonryLayoutComponent.prototype.ngOnChanges = /**
     * @return {?}
     */
    function () {
        var _this = this;
        clearTimeout(this.changesTimer);
        this.changesTimer = setTimeout(function () {
            _this.gridState = 'not started';
            _this.buildGrid();
        }, 250);
    };
    /**
     * @return {?}
     */
    MasonryLayoutComponent.prototype.buildGrid = /**
     * @return {?}
     */
    function () {
        var _this = this;
        /** @type {?} */
        var parentWidth = Math.floor(this.elem.parentNode.offsetWidth);
        /** @type {?} */
        var row = {
            startIndex: 0,
            endIndex: 0,
            length: 0,
            totalWidth: 0
        };
        if (!this.images || !this.images.length) {
            return;
        }
        this.elem.style.width = parentWidth + 'px';
        this.elem.style.display = 'table';
        this.images.forEach(function (node, index) {
            if (row.totalWidth === 0) {
                row.startIndex = index;
                row.length = 0;
            }
            row.length++;
            row.totalWidth += _this.getComputedWidth(index);
            if (row.totalWidth >= parentWidth || _this.isLastChild(index)) {
                row.endIndex = index;
                /** @type {?} */
                var scaling = row.totalWidth / parentWidth;
                _this.setColDimensions(scaling, row);
                row.totalWidth = 0;
            }
        });
    };
    /**
     * @param {?} scaling
     * @param {?} row
     * @return {?}
     */
    MasonryLayoutComponent.prototype.setColDimensions = /**
     * @param {?} scaling
     * @param {?} row
     * @return {?}
     */
    function (scaling, row) {
        var _this = this;
        /** @type {?} */
        var totalRowWidth = 0;
        /** @type {?} */
        var parentWidth = this.elem.parentNode.offsetWidth;
        scaling = (scaling < 1) ? 1 : scaling;
        this.images.forEach(function (node, index) {
            if (!_this.ENABLE_MASONRY) {
                node.computedHeight = _this.MAX_HEIGHT + 'px';
                node.computedWidth = _this.getComputedWidth(index) + 'px';
                node.margin = _this.getNodeMargin(parentWidth);
                return;
            }
            if (index >= row.startIndex && index <= row.endIndex) {
                /** @type {?} */
                var nodeWidth = void 0;
                // last image
                if (index === row.endIndex && scaling > 1) {
                    nodeWidth = (100 - totalRowWidth) - ((_this.GUTTER * 2) / parentWidth * 100);
                    node.computedWidth = 'calc(' + nodeWidth + '%)';
                    if (_this.gridState === 'not started') {
                        _this.gridState = 'pre-building';
                        setTimeout(function () {
                            _this.buildGrid();
                        }, 100);
                    }
                }
                else {
                    nodeWidth = ((_this.getComputedWidth(index) / scaling) / parentWidth * 100) - ((row.length * (_this.GUTTER * 2)) * (_this.getComputedWidth(index) / scaling) / parentWidth) / parentWidth * 100;
                    node.computedWidth = 'calc(' + nodeWidth + '%)';
                    totalRowWidth += nodeWidth;
                    totalRowWidth += (_this.GUTTER / parentWidth * 100) * 2;
                }
                // last row and last image
                if (index === row.endIndex && row.length === 1 && _this.isMobile) {
                    nodeWidth = 100 - ((_this.GUTTER * 2) / parentWidth * 100);
                    /** @type {?} */
                    var height = node.height * (parentWidth * (nodeWidth / 100) / node.width);
                    if (height / 2 < _this.MAX_HEIGHT) {
                        node.computedWidth = 'calc(' + nodeWidth + '%)';
                    }
                }
                node.margin = _this.getNodeMargin(parentWidth);
                node.computedHeight = node.height * (parentWidth * (nodeWidth / 100) / node.width) + 'px';
            }
        });
    };
    /**
     * @param {?} index
     * @return {?}
     */
    MasonryLayoutComponent.prototype.getComputedWidth = /**
     * @param {?} index
     * @return {?}
     */
    function (index) {
        return this.images[index].width / (this.images[index].height / this.MAX_HEIGHT);
    };
    /**
     * @param {?} index
     * @return {?}
     */
    MasonryLayoutComponent.prototype.isLastChild = /**
     * @param {?} index
     * @return {?}
     */
    function (index) {
        return index + 1 === this.images.length;
    };
    /**
     * @param {?} parentWidth
     * @return {?}
     */
    MasonryLayoutComponent.prototype.getNodeMargin = /**
     * @param {?} parentWidth
     * @return {?}
     */
    function (parentWidth) {
        return 'calc(' + this.GUTTER / parentWidth * 100 + '%)';
    };
    /**
     * @param {?} image
     * @param {?} i
     * @return {?}
     */
    MasonryLayoutComponent.prototype.clickOnImage = /**
     * @param {?} image
     * @param {?} i
     * @return {?}
     */
    function (image, i) {
        this.events.emit({
            type: 'click-on-image',
            image: image,
            index: i
        });
    };
    /**
     * @param {?} elem
     * @return {?}
     */
    MasonryLayoutComponent.prototype.onImageLoaded = /**
     * @param {?} elem
     * @return {?}
     */
    function (elem) {
        elem.style.opacity = 1;
    };
    MasonryLayoutComponent.decorators = [
        { type: Component, args: [{
                    selector: 'masonry-layout',
                    template: "<div \n\t[ngClass]=\"CLASS_NAME\"\n\t*ngFor=\"let image of images; let i = index;\"\n    [style.width]=\"image.computedWidth\"\n    [style.height]=\"image.computedHeight\"\n    [style.float]=\"'left'\"\n    [style.margin]=\"image.margin\"\n    [style.background]=\"'#eeeeee'\"\n    [style.lineHeight]=\"0\">\n\t<img \n        #imageElem\n        [src]=\"image.preview || image.full\" \n        [style.width.%]=\"100\" \n        [style.height]=\"'auto'\"\n        [style.opacity]=\"0\"\n        (click)=\"clickOnImage(image, i)\"\n        (load)=\"onImageLoaded(imageElem)\" />\n</div>",
                },] },
    ];
    /** @nocollapse */
    MasonryLayoutComponent.ctorParameters = function () { return [
        { type: ElementRef }
    ]; };
    MasonryLayoutComponent.propDecorators = {
        images: [{ type: Input, args: ['images',] }],
        ENABLE_MASONRY: [{ type: Input, args: ['masonry',] }],
        MAX_HEIGHT: [{ type: Input, args: ['max-height',] }],
        CLASS_NAME: [{ type: Input, args: ['class-name',] }],
        gutter: [{ type: Input, args: ['gutter',] }],
        events: [{ type: Output }],
        onWindowResize: [{ type: HostListener, args: ['window:resize', ['$event'],] }]
    };
    return MasonryLayoutComponent;
}());

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
var PinchDirective = /** @class */ (function () {
    function PinchDirective(elementRef) {
        this.elementRef = elementRef;
        this.scale = 1;
        this.initialScale = 1;
        this.moveX = 0;
        this.moveY = 0;
        this.initialMoveX = 0;
        this.initialMoveY = 0;
        this.isNextImageLoaded = true;
        this.events = new EventEmitter();
        this.elem = this.elementRef.nativeElement;
    }
    /**
     * @param {?} event
     * @return {?}
     */
    PinchDirective.prototype.touchstartHandler = /**
     * @param {?} event
     * @return {?}
     */
    function (event) {
        this.elem.style.transformOrigin = '0 0';
    };
    /**
     * @param {?} event
     * @return {?}
     */
    PinchDirective.prototype.touchmoveHandler = /**
     * @param {?} event
     * @return {?}
     */
    function (event) {
        /** @type {?} */
        var touches = event.touches;
        if (touches.length === 1 && this.scale === 1 && !this.eventType || this.eventType == 'swipe') {
            event.preventDefault();
            if (!this.isNextImageLoaded) {
                return;
            }
            if (!this.eventType) {
                this.startX = event.touches[0].pageX;
                this.startY = event.touches[0].pageY;
            }
            this.eventType = 'swipe';
            this.moveX = this.initialMoveX + (event.touches[0].pageX - this.startX);
            this.moveY = 0;
            this.transformElem(0);
        }
    };
    /**
     * @param {?} event
     * @return {?}
     */
    PinchDirective.prototype.touchendHandler = /**
     * @param {?} event
     * @return {?}
     */
    function (event) {
        /** @type {?} */
        var touches = event.touches;
        /** @type {?} */
        var img = this.elem.getElementsByTagName("img")[0];
        if (!this.isNextImageLoaded) {
            return;
        }
        if (this.scale < 1) {
            this.scale = 1;
        }
        if (this.moveY > 0) {
            this.moveY = 0;
        }
        if (this.moveX > 100) {
            this.slide('prev');
        }
        else if (this.moveX < -100) {
            this.slide('next');
        }
        else {
            this.moveX = 0;
        }
        this.initialScale = this.scale;
        this.initialMoveX = this.moveX;
        this.initialMoveY = this.moveY;
        this.transformElem(200);
        this.eventType = 'touchend';
        if (touches.length == 0) {
            this.eventType = '';
        }
    };
    /**
     * @param {?} event
     * @return {?}
     */
    PinchDirective.prototype.slide = /**
     * @param {?} event
     * @return {?}
     */
    function (event) {
        var _this = this;
        this.onSlide(event);
        if (event === 'prev') {
            this.moveX = window.innerWidth + 8;
            if (this.isFirst) {
                this.moveX = 0;
            }
        }
        if (event === 'next') {
            this.moveX = -window.innerWidth - 8;
            if (this.isLast) {
                this.moveX = 0;
            }
        }
        this.isNextImageLoaded = false;
        setTimeout(function () {
            _this.moveX = 0;
            _this.initialMoveX = 0;
            _this.isNextImageLoaded = true;
        }, 200);
    };
    /**
     * @param {?} evenType
     * @return {?}
     */
    PinchDirective.prototype.onSlide = /**
     * @param {?} evenType
     * @return {?}
     */
    function (evenType) {
        this.events.emit(evenType);
    };
    /**
     * @param {?=} duration
     * @return {?}
     */
    PinchDirective.prototype.transformElem = /**
     * @param {?=} duration
     * @return {?}
     */
    function (duration) {
        if (duration === void 0) { duration = 50; }
        /** @type {?} */
        var matrixVal = 'matrix(' + Number(this.scale) + ',' + 0 + ',' + 0 + ',' + Number(this.scale) + ',' + Number(this.moveX) + ',' + Number(this.moveY) + ')';
        this.elem.style.transition = 'all ' + duration + 'ms';
        this.elem.style.transform = matrixVal;
        this.elem.style.webkitTransform = matrixVal;
    };
    PinchDirective.decorators = [
        { type: Directive, args: [{
                    selector: '[pinch]'
                },] },
    ];
    /** @nocollapse */
    PinchDirective.ctorParameters = function () { return [
        { type: ElementRef }
    ]; };
    PinchDirective.propDecorators = {
        isLast: [{ type: Input }],
        isFirst: [{ type: Input }],
        events: [{ type: Output }],
        touchstartHandler: [{ type: HostListener, args: ['touchstart', ['$event'],] }],
        touchmoveHandler: [{ type: HostListener, args: ['touchmove', ['$event'],] }],
        touchendHandler: [{ type: HostListener, args: ['touchend', ['$event'],] }]
    };
    return PinchDirective;
}());

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
var CrystalGalleryModule = /** @class */ (function () {
    function CrystalGalleryModule() {
    }
    CrystalGalleryModule.decorators = [
        { type: NgModule, args: [{
                    declarations: [
                        LightboxComponent,
                        LightboxMobileComponent,
                        GalleryComponent,
                        MasonryLayoutComponent,
                        PinchDirective
                    ],
                    imports: [
                        CommonModule
                    ],
                    exports: [
                        GalleryComponent
                    ],
                    providers: [
                        CrystalLightbox
                    ],
                    bootstrap: [],
                    entryComponents: [
                        LightboxComponent,
                        LightboxMobileComponent
                    ]
                },] },
    ];
    return CrystalGalleryModule;
}());

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */

export { CrystalLightbox, GalleryComponent, CrystalGalleryModule, LightboxComponent, LightboxMobileComponent, MasonryLayoutComponent, PinchDirective as ɵa };

//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWNyeXN0YWwtZ2FsbGVyeS5qcy5tYXAiLCJzb3VyY2VzIjpbIm5nOi8vbmd4LWNyeXN0YWwtZ2FsbGVyeS9saWIvbGlnaHRib3guY29tcG9uZW50LnRzIiwibmc6Ly9uZ3gtY3J5c3RhbC1nYWxsZXJ5L2xpYi9saWdodGJveC1tb2JpbGUuY29tcG9uZW50LnRzIiwibmc6Ly9uZ3gtY3J5c3RhbC1nYWxsZXJ5L2xpYi9jb25maWcudHMiLCJuZzovL25neC1jcnlzdGFsLWdhbGxlcnkvbGliL2RvbS5zZXJ2aWNlLnRzIiwibmc6Ly9uZ3gtY3J5c3RhbC1nYWxsZXJ5L2xpYi9nYWxsZXJ5LmNvbXBvbmVudC50cyIsIm5nOi8vbmd4LWNyeXN0YWwtZ2FsbGVyeS9saWIvbWFzb25yeS1sYXlvdXQuY29tcG9uZW50LnRzIiwibmc6Ly9uZ3gtY3J5c3RhbC1nYWxsZXJ5L2xpYi9waW5jaC5kaXJlY3RpdmUudHMiLCJuZzovL25neC1jcnlzdGFsLWdhbGxlcnkvbGliL2dhbGxlcnkubW9kdWxlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFxuICAgIENvbXBvbmVudCwgXG4gICAgSW5wdXQsIFxuICAgIEV2ZW50RW1pdHRlciwgXG4gICAgT25Jbml0LCBcbiAgICBIb3N0QmluZGluZywgXG4gICAgSG9zdExpc3RlbmVyLCBcbiAgICBWaWV3Q2hpbGQsIFxuICAgIEVsZW1lbnRSZWYsIFxuICAgIENoYW5nZURldGVjdG9yUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnY3J5c3RhbC1saWdodGJveCcsXG4gICAgdGVtcGxhdGU6IGA8ZGl2IGNsYXNzPVwiY2ctY291bnRlclwiICpuZ0lmPVwiY29uZmlnLmNvdW50ZXIgJiYgaW1hZ2VzLmxlbmd0aCA+IDFcIj57e2NvdW50ZXJ9fTwvZGl2PlxuPGRpdiBjbGFzcz1cImNnLWRlc2NyaXB0aW9uXCIgKm5nSWY9XCJkZXNjcmlwdGlvblwiPnt7ZGVzY3JpcHRpb259fTwvZGl2PlxuXG48ZGl2IFxuXHRjbGFzcz1cImNnLWNsb3NlXCIgXG5cdChjbGljayk9XCJjbG9zZUxpZ2h0Ym94KClcIj5DbG9zZTwvZGl2PlxuXG48ZGl2IFxuXHRjbGFzcz1cImNnLXNwaW5uZXJcIiBcblx0ICpuZ0lmPVwiIWN1cnJJbWFnZUxvYWRlZFwiPjwvZGl2PlxuXG48ZGl2IGNsYXNzPVwiY2ctd3JhcHBlclwiICN3cmFwcGVyPlxuXHQ8aW1nIFxuXHRcdGNsYXNzPVwiY2ctY3Vyci1pbWFnZVwiIFxuXHRcdCNjdXJySW1hZ2VFbGVtIFxuXHRcdFtzcmNdPVwiY3VyckltYWdlUGF0aD8uZnVsbFwiIFxuXHRcdFtjbGFzcy5jZy1zaG93XT1cImN1cnJJbWFnZUxvYWRlZFwiIFxuXHRcdChsb2FkKT1cIm9uSW1hZ2VMb2FkZWQoKVwiIC8+XG48L2Rpdj5cblxuPGRpdiBcblx0Y2xhc3M9XCJjZy1wcmV2XCIgXG5cdFtoaWRkZW5dPVwiaXNGaXJzdCAmJiAhY29uZmlnLmxvb3BcIiBcblx0KGNsaWNrKT1cInByZXYoKVwiPjwvZGl2PlxuPGRpdiBcblx0Y2xhc3M9XCJjZy1uZXh0XCIgXG5cdFtoaWRkZW5dPVwiaXNMYXN0ICYmICFjb25maWcubG9vcFwiIFxuXHQoY2xpY2spPVwibmV4dCgpXCI+PC9kaXY+YCxcbiAgICBzdHlsZXM6IFtgLl9jZy1zcGlubmVyLC5fY2ctc3Bpbm5lcjphZnRlcntib3JkZXItcmFkaXVzOjUwJTt3aWR0aDozNnB4O2hlaWdodDozNnB4fS5fY2ctc3Bpbm5lcnttYXJnaW46MCBhdXRvO2ZvbnQtc2l6ZToxMHB4O3Bvc2l0aW9uOnJlbGF0aXZlO3RleHQtaW5kZW50Oi05OTk5ZW07Ym9yZGVyLXRvcDo0cHggc29saWQgcmdiYSgyNTUsMjU1LDI1NSwuMik7Ym9yZGVyLXJpZ2h0OjRweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LC4yKTtib3JkZXItYm90dG9tOjRweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LC4yKTtib3JkZXItbGVmdDo0cHggc29saWQgI2ZmZjstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVaKDApO3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApOy13ZWJraXQtYW5pbWF0aW9uOi45cyBsaW5lYXIgaW5maW5pdGUgbG9hZDg7YW5pbWF0aW9uOi45cyBsaW5lYXIgaW5maW5pdGUgbG9hZDh9QC13ZWJraXQta2V5ZnJhbWVzIGxvYWQ4ezAley13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgwKTt0cmFuc2Zvcm06cm90YXRlKDApfTEwMCV7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDM2MGRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpfX1Aa2V5ZnJhbWVzIGxvYWQ4ezAley13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgwKTt0cmFuc2Zvcm06cm90YXRlKDApfTEwMCV7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDM2MGRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpfX0uY2ctc3Bpbm5lciwuY2ctc3Bpbm5lcjphZnRlciwuY2ctc3Bpbm5lcjpiZWZvcmV7Ym9yZGVyLXJhZGl1czo1MCU7d2lkdGg6MTBweDtoZWlnaHQ6MTBweDstd2Via2l0LWFuaW1hdGlvbjoxLjVzIGVhc2UtaW4tb3V0IGluZmluaXRlIGxvYWQ3O2FuaW1hdGlvbjoxLjVzIGVhc2UtaW4tb3V0IGluZmluaXRlIGxvYWQ3fS5jZy1zcGlubmVye2NvbG9yOiNmZmY7Zm9udC1zaXplOjEwcHg7bWFyZ2luOjAgYXV0byAyMHB4O3Bvc2l0aW9uOnJlbGF0aXZlO3RleHQtaW5kZW50Oi05OTk5ZW07LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWigwKTt0cmFuc2Zvcm06dHJhbnNsYXRlWigwKTstd2Via2l0LWFuaW1hdGlvbi1kZWxheTotLjE2czthbmltYXRpb24tZGVsYXk6LS4xNnN9LmNnLXNwaW5uZXI6YWZ0ZXIsLmNnLXNwaW5uZXI6YmVmb3Jle2NvbnRlbnQ6XCJcIjtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MH0uY2ctc3Bpbm5lcjpiZWZvcmV7bGVmdDotM2VtOy13ZWJraXQtYW5pbWF0aW9uLWRlbGF5Oi0uMzJzO2FuaW1hdGlvbi1kZWxheTotLjMyc30uY2ctc3Bpbm5lcjphZnRlcntsZWZ0OjNlbX1ALXdlYmtpdC1rZXlmcmFtZXMgbG9hZDd7MCUsMTAwJSw4MCV7Ym94LXNoYWRvdzowIDIuNWVtIDAgLTEuM2VtfTQwJXtib3gtc2hhZG93OjAgMi41ZW0gMCAwfX1Aa2V5ZnJhbWVzIGxvYWQ3ezAlLDEwMCUsODAle2JveC1zaGFkb3c6MCAxMHB4IDAgLTEuM2VtfTQwJXtib3gtc2hhZG93OjAgMTBweCAwIDB9fTpob3N0KC5jZy1zaG93KXtvcGFjaXR5OjF9Omhvc3QoLmNnLWhpZGUtY29udHJvbHMpIC5jZy1jbG9zZSw6aG9zdCguY2ctaGlkZS1jb250cm9scykgLmNnLW5leHQsOmhvc3QoLmNnLWhpZGUtY29udHJvbHMpIC5jZy1wcmV2e29wYWNpdHk6MH06aG9zdHtvcGFjaXR5OjA7cG9zaXRpb246Zml4ZWQ7dG9wOjA7bGVmdDowO3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7Y29sb3I6I2ZmZjstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lOy1tcy11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmU7dHJhbnNpdGlvbjpvcGFjaXR5IC4xcyBjdWJpYy1iZXppZXIoLjY0NSwuMDQ1LC4zNTUsMSk7ei1pbmRleDoxMDAwMDtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjg1KX06aG9zdCBpbWd7b3BhY2l0eToxO21heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6MTAwJTtib3gtc2hhZG93OjAgNHB4IDE1cHggMnB4IHJnYmEoMCwwLDAsLjM1KX06aG9zdCBpbWcuY2ctY3Vyci1pbWFnZS5jZy1zaG93e29wYWNpdHk6MX06aG9zdCBpbWcuY2ctY3Vyci1pbWFnZXtvcGFjaXR5OjA7ei1pbmRleDoxMH06aG9zdCAuY2ctd3JhcHBlci5jZy1oaWRle2Rpc3BsYXk6bm9uZX06aG9zdCAuY2ctd3JhcHBlcntkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tb3otdXNlci1zZWxlY3Q6bm9uZTstbXMtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lO3RvcDowO2xlZnQ6MDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlfTpob3N0IC5jZy1zcGlubmVye3Bvc2l0aW9uOmFic29sdXRlO3RvcDo1MCU7bGVmdDo1MCU7bWFyZ2luLXRvcDotMTVweDttYXJnaW4tbGVmdDotNXB4fTpob3N0IC5jZy1jb3VudGVye3RleHQtYWxpZ246bGVmdDtwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OjIycHg7dG9wOjEzcHg7Zm9udC1zaXplOjE0cHg7dGV4dC1zaGFkb3c6MCAwIDFweCByZ2JhKDAsMCwwLC42NSk7ei1pbmRleDozMH06aG9zdCAuY2ctZGVzY3JpcHRpb257dGV4dC1hbGlnbjpjZW50ZXI7bWF4LXdpZHRoOmNhbGMoMTAwJSAtIDIwMHB4KTttYXJnaW46MCBhdXRvO2ZvbnQtc2l6ZToxNHB4O2xpbmUtaGVpZ2h0OjQzcHg7cG9zaXRpb246cmVsYXRpdmU7ei1pbmRleDo1MH06aG9zdCAuY2ctY2xvc2V7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7cmlnaHQ6MDtwYWRkaW5nOjEzcHggMjJweDtmb250LXNpemU6MTNweDt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7Y3Vyc29yOnBvaW50ZXI7b3BhY2l0eTouNTt6LWluZGV4OjMwO3RyYW5zaXRpb246b3BhY2l0eSAuMXMgZWFzZS1pbi1vdXQ7dGV4dC1zaGFkb3c6MCAwIDFweCByZ2JhKDAsMCwwLC42NSl9Omhvc3QgLmNnLWNsb3NlOmhvdmVye29wYWNpdHk6MX06aG9zdCAuY2ctbmV4dCw6aG9zdCAuY2ctcHJldnt3aWR0aDo0MCU7aGVpZ2h0OjEwMCU7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Y3Vyc29yOnBvaW50ZXI7b3BhY2l0eTouNTt6LWluZGV4OjIwO3RyYW5zaXRpb246b3BhY2l0eSAuMXMgZWFzZS1pbi1vdXQ7LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsMCl9Omhvc3QgLmNnLW5leHQ6aG92ZXIsOmhvc3QgLmNnLXByZXY6aG92ZXJ7b3BhY2l0eToxfTpob3N0IC5jZy1wcmV2e2xlZnQ6MDtiYWNrZ3JvdW5kOnVybChkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJZQUFBQWlDQVlBQUFCYlh5bUFBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlacFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGNnS0ZkcGJtUnZkM01wSWlCNGJYQk5UVHBKYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT2pNek1UWkNRekZFUkRnek1URXhSVGM1UVVZeFFUVXhSREk1TWtNNU9EWkNJaUI0YlhCTlRUcEViMk4xYldWdWRFbEVQU0o0YlhBdVpHbGtPak16TVRaQ1F6RkZSRGd6TVRFeFJUYzVRVVl4UVRVeFJESTVNa001T0RaQ0lqNGdQSGh0Y0UxTk9rUmxjbWwyWldSR2NtOXRJSE4wVW1WbU9tbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZNek14TmtKRE1VSkVPRE14TVRGRk56bEJSakZCTlRGRU1qa3lRems0TmtJaUlITjBVbVZtT21SdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk16TXhOa0pETVVORU9ETXhNVEZGTnpsQlJqRkJOVEZFTWpreVF6azROa0lpTHo0Z1BDOXlaR1k2UkdWelkzSnBjSFJwYjI0K0lEd3ZjbVJtT2xKRVJqNGdQQzk0T25odGNHMWxkR0UrSUR3L2VIQmhZMnRsZENCbGJtUTlJbklpUHo3VnJ3WktBQUFDbEVsRVFWUjQycXpXU1k4U1FSZ0dZTG9WSFBlVFhsd0NpSXdNQXJKR3RpQUJOZXA0SUdaaTRvRWZNSm9vTGplUHJuRkdmNXlKUzBoWW1xMmIvYUJ4aVE2K2xSUkpkYVVacTV2cDVFMlRMbmlvVkZkOVZaTE4raVV4SWRlTWlXMmZSVkNtdnoyRHBKQlZDazZYNlNWQkhRUkxwVktiN1hiNzgyZzBVc3JsOGpNOFcwUDIwKzlZUW4zSlpQSWh3TjZNWG9QQm9JM25HOGlLR1poRjE0QStBcXJPbUt0V3EzMUYyMTNra09nUTY5QjBPbDBCcXJGb3Q5dlYvSDcvYzdSZkVvVloxRytFZGpxZHZ0ZnJmWW4ySzhnSmthSFFvZGxzdGpJZWovc3NpaGRIMERkb3Y0YWNRbzdRbHljSm81UEpoRWMxajhmem1xSmsyaDFEN0x2MWxrVXY1bks1eHp6YWFyV01VSWN3bXMvbkNUcmdVYmZiVGRDclZ0QUFRYWZUcVE1VkZFVmRDaTBVQ2svUTB5R0xOcHROMWVsMHZxTG9hUkhVeHFQb0tZLzJLRm8wZzByMGJhNFdpOFduUUVjczJtZzBWQVBVTHJKc1pUcXBOekRaNnl4YXI5ZFZsOHRGVnRSMTBTbkZvaEpkZ25aWXVoOUlralNUWmZrblBuNUR2aU8va0wvSWprZ3RJT2hoSko3SlpGNWdkVTI0aGRERzZxcWcvUUp5d0V6bG1nL0ZTVExoRTRuRTluQTRuSEpGUnZINWZKdG85NGdPQmZ2eWp0SnhYSS9INHgrQTYzcmU2L1VVVkRDQ256ZUR6NmZiY2VRc2Nqc1dpNzAzd0ZzTTdoREJKUU44UFJxTmJtTm4wT0dhcHUwSmZvdmlZeDRQQkFMMzBlNWRDZytIdzBaNGU4L3dmci9QNDUxUUtQUmdhUnpJRmpEZGtzZWZzYmpkS241ekVSNkpSTWl3dVArM05lMktCNFBCTFZWVlIxeGQrWUsyTzJiT0ZZdndkOENIYksveC9KNlpjOFVpL0FabXhkdHF0ZHJBd2xGTHBSTFpyUy9QWWNua0VVdWlZN2hDUytnNXNvdlQ1NStRajdRUy9qWUQ4empwL1VGNnQ5R1Mrb1BlZDh6Q0xDNXpKMHRTby8vUSs4d0tMSFR3L2lmQUFNUVZTNHZIWlIyVkFBQUFBRWxGVGtTdVFtQ0MpIGNlbnRlciBsZWZ0IDIycHggbm8tcmVwZWF0fTpob3N0IC5jZy1uZXh0e3JpZ2h0OjA7YmFja2dyb3VuZDp1cmwoZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCWUFBQUFpQ0FZQUFBQmJYeW1BQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5WnBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVE00SURjNUxqRTFPVGd5TkN3Z01qQXhOaTh3T1M4eE5DMHdNVG93T1Rvd01TQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRjZ0tGZHBibVJ2ZDNNcElpQjRiWEJOVFRwSmJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09qRXlOREUzTURFMVJEZ3pNVEV4UlRjNU5qTTRRVEl6UXpJMlJqYzJRamcySWlCNGJYQk5UVHBFYjJOMWJXVnVkRWxFUFNKNGJYQXVaR2xrT2pFeU5ERTNNREUyUkRnek1URXhSVGM1TmpNNFFUSXpRekkyUmpjMlFqZzJJajRnUEhodGNFMU5Pa1JsY21sMlpXUkdjbTl0SUhOMFVtVm1PbWx1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2TVRJME1UY3dNVE5FT0RNeE1URkZOemsyTXpoQk1qTkRNalpHTnpaQ09EWWlJSE4wVW1WbU9tUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZNVEkwTVRjd01UUkVPRE14TVRGRk56azJNemhCTWpORE1qWkdOelpDT0RZaUx6NGdQQzl5WkdZNlJHVnpZM0pwY0hScGIyNCtJRHd2Y21SbU9sSkVSajRnUEM5NE9uaHRjRzFsZEdFK0lEdy9lSEJoWTJ0bGRDQmxibVE5SW5JaVB6N3p2NUJLQUFBQ2wwbEVRVlI0MnJUVzIyNFNRUndHY0haYjhGVDFTbTg4QkpDaUZBRTVKcHlDQk5SRThjb1lFeTk0QUdxaTlYRFhTMCtKVmgvQ0IvRWhpRkVUNUxqQWNsZ1dqYWExYWF6ZkpETTZ1Nkx1TGpySmwyMTI0Y2QwZHVZL0k5aCtOb0VMYWJ0Y1RMY0ZDb24wYncrU1JFNGgyOGhuMnh5Tm9JdklTcmxjZnFBb1NsdVNwTGVwVktxQ2U2Y1JCLzJNWUFYZWkxd2ZqVWJTTG0zNGdYNHltYnlOK3o2ck9CbUMvY2lOZXIzK2ZwZHJ3R1hnZDhoL1l3Vm44RG0vMzcvZTYvVUdPbnlRVHFmWHJPQnNLSTRnNTcxZTc2TnV0enY4RGU0M2d3djA1UzBoeDVDTHdKL2lCV3J3eVdReXpHYXpwbkh5SVR0eUNEbEJjSS9IOHdTNFpsaFVWYldNTy9SNHA5UDVCYy9sY25meC9PdzgrQVczMnowTEgrWHorWCtEdDl0dG1jZW4weW5EQTFieDR3UjNPcDJQVzYyV3JPdjV1RkFvM0pzWEwxSzhyK3Y1TE54bVpyYjh3SnZOcG41WWxHS3hlSi9XRnJ1WkJjUlB4VXN1bDJ1OTBXaG9jQ3lxQnFrM2RMR0ppd2JnYi9UNkZmbENTcWtvaWx1Q0lHanFOR3pXZ1FVejlZUjhhUTl5QnF0eURRdEgwcTFLTlpQSlBNVHpPSEtBNG9hSHd1UHorU29vVW0wZUhZL0gwMFFpc1VFV0ZIS1VEWVZSZEJtVnI5THY5L1dvR28vSFgrSjVpWTcvUVNNdmowMDNobmIwYUN3V2U0SG5WNUdUeUdFajAwMkREZ1lERFlxZFJvMUdveHUwcDNwVStCdnFEUVFDcXpQUUNVV3Z6SU5LZWpRY0RsdEhRNkhRTGFCZEhoME9oNVpSTzBPQmFGRDhpSUw3ejgyaWJHdHlSeUtSMVQrZ2w4MmcvR1o2RGV2L0hZL0tzcXdFZzBGTEtMLzkzK1I3QzNRTTlOazhLRHRpT1dxMTJqYjJzMlhTMDFLcDlLcGFyYjdHL1RmSVIyUVQyVEY2VUJTNDJiQkVpL1VLL1NJQlB5Q2ZrQzB6S0ErejZyV1BYbTMwdExsSnI2WlEvWm1ZRFluSTFlRWRlalY5VGhiKzE4SDd1d0FEQU9HL1djbTR4K2tuQUFBQUFFbEZUa1N1UW1DQykgY2VudGVyIHJpZ2h0IDIycHggbm8tcmVwZWF0fWBdXG59KVxuZXhwb3J0IGNsYXNzIExpZ2h0Ym94Q29tcG9uZW50IHtcbiAgICBfaW5kZXg6IGFueTtcbiAgICBwcmV2SW5kZXg6IGFueTtcbiAgICBjdXJySW1hZ2VMb2FkZWQ6IGFueTsgXG4gICAgcHJldkltYWdlSGlkZTogYW55O1xuICAgIHdyYXBwZXJQcm9wOiBhbnk7XG4gICAgX2RhdGE6IGFueTtcbiAgICBjdXJyZW50SW1hZ2VJbmRleDogbnVtYmVyID0gMDtcbiAgICBzcGlubmVySGVpZ2h0OiBudW1iZXIgPSAzMDtcbiAgICBkZXNjcmlwdGlvbkhlaWdodDogbnVtYmVyID0gNDM7XG5cbiAgICBASW5wdXQoKSBkYXRhOiBhbnk7XG5cbiAgICBjbG9zZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MuY2ctc2hvdycpIHNob3dMaWdodGJveDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuY2ctaGlkZS1jb250cm9scycpIGhpZGVDb250cm9sczogYm9vbGVhbiA9IGZhbHNlO1xuICAgIEBIb3N0QmluZGluZygnc3R5bGUudHJhbnNpdGlvbicpIGhvc3RTdHlsZVRyYW5zaXRpb246IHN0cmluZztcbiAgICBASG9zdEJpbmRpbmcoJ3N0eWxlLmJhY2tncm91bmRDb2xvcicpIGhvc3RTdHlsZUJhY2tncm91bmRDb2xvcjogc3RyaW5nO1xuXG4gICAgQFZpZXdDaGlsZCgnY3VyckltYWdlRWxlbScpIGN1cnJJbWFnZUVsZW06IEVsZW1lbnRSZWY7XG4gICAgQFZpZXdDaGlsZCgncHJldkltYWdlRWxlbScpIHByZXZJbWFnZUVsZW06IEVsZW1lbnRSZWY7XG4gICAgQFZpZXdDaGlsZCgnd3JhcHBlcicpIHdyYXBwZXJFbGVtOiBFbGVtZW50UmVmO1xuXG4gICAgZ2V0IGltYWdlcygpe1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhLmltYWdlcztcbiAgICB9XG5cbiAgICBnZXQgY29uZmlnKCl7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEuY29uZmlnO1xuICAgIH1cblxuICAgIGdldCBpbmRleCgpe1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50SW1hZ2VJbmRleDtcbiAgICB9XG5cbiAgICBnZXQgY3VyckltYWdlUGF0aCgpe1xuICAgICAgICBsZXQgaW1hZ2UgPSB0aGlzLmltYWdlc1t0aGlzLmluZGV4XTtcblxuICAgICAgICBpZiAoIWltYWdlKXtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbWFnZS5wYXRoKXtcbiAgICAgICAgICAgIGltYWdlLmZ1bGwgPSBpbWFnZS5wYXRoO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGltYWdlO1xuICAgIH1cblxuICAgIGdldCBwcmV2SW1hZ2VQYXRoKCl7XG4gICAgICAgIHJldHVybiB0aGlzLmltYWdlc1t0aGlzLnByZXZJbmRleF07XG4gICAgfVxuXG4gICAgc2V0IHByZXZJbWFnZVBhdGgodmFsdWU6IGFueSl7XG4gICAgICAgIHRoaXMuaW1hZ2VzW3RoaXMucHJldkluZGV4XSA9IHZhbHVlO1xuICAgIH1cblxuICAgIGdldCBpc0ZpcnN0KCl7XG4gICAgICAgIHJldHVybiB0aGlzLmluZGV4ID09PSAwO1xuICAgIH1cblxuICAgIGdldCBpc0xhc3QoKXtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5kZXggPT09ICh0aGlzLmltYWdlcy5sZW5ndGgtMSk7XG4gICAgfVxuXG4gICAgZ2V0IGxhdGVzdEltYWdlSW5kZXgoKXtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW1hZ2VzLmxlbmd0aCAtIDE7XG4gICAgfVxuXG4gICAgZ2V0IGRlc2NyaXB0aW9uKCl7XG4gICAgICAgIHJldHVybiB0aGlzLmltYWdlc1t0aGlzLmluZGV4XS5kZXNjcmlwdGlvbjtcbiAgICB9XG5cbiAgICBnZXQgY291bnRlcigpe1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50SW1hZ2VJbmRleCArIDEgKycvJysgdGhpcy5pbWFnZXMubGVuZ3RoO1xuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzprZXlkb3duJywgWyckZXZlbnQnXSlcbiAgICBvbktleURvd24oZXZlbnQ6IGFueSkge1xuICAgICAgICBzd2l0Y2goZXZlbnQua2V5KSB7XG4gICAgICAgICAgICBjYXNlICdBcnJvd0xlZnQnOlxuICAgICAgICAgICAgICAgIHRoaXMucHJldigpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnQXJyb3dSaWdodCc6XG4gICAgICAgICAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdFc2NhcGUnOlxuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VMaWdodGJveCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcihcIm1vdXNlZW50ZXJcIiwgWyckZXZlbnQnXSlcbiAgICBvbk1vdXNlRW50ZXIoZXZlbnQ6IGFueSkge1xuICAgICAgICB0aGlzLmhpZGVDb250cm9scyA9IGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZiwgcHJpdmF0ZSByZWY6IENoYW5nZURldGVjdG9yUmVmKXtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpe1xuICAgICAgICB0aGlzLnNldEJhY2tncm91bmRPcGFjaXR5KHRoaXMuY29uZmlnLmJhY2tncm91bmRPcGFjaXR5KTtcbiAgICAgICAgdGhpcy5jdXJyZW50SW1hZ2VJbmRleCA9IHRoaXMuY29uZmlnLmluZGV4O1xuICAgICAgICAvL2RvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcblxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2hvd0xpZ2h0Ym94ID0gdHJ1ZTtcbiAgICAgICAgfSwgMzApO1xuXG4gICAgICAgIHRoaXMuc2V0TWF4RGltZW5zaW9ucygpO1xuICAgICAgICB0aGlzLnNldEFuaW1hdGlvbkR1cmF0aW9uKCk7XG4gICAgfVxuXG4gICAgY2xvc2VMaWdodGJveCgpe1xuICAgICAgICB0aGlzLnNob3dMaWdodGJveCA9IGZhbHNlO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgdGhpcy5jbG9zZS5lbWl0KCdjbG9zZScpO1xuICAgICAgICAgICAvL2RvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnJztcbiAgICAgICAgfSwgdGhpcy5jb25maWcuYW5pbWF0aW9uRHVyYXRpb24pOyBcbiAgICB9XG5cbiAgICBuZXh0KCl7XG4gICAgICAgIGlmICh0aGlzLmlzTGFzdCl7XG4gICAgICAgICAgICBpZiAodGhpcy5jb25maWcubG9vcCl7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50SW1hZ2VJbmRleCA9IDA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudEltYWdlSW5kZXgrKztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmN1cnJJbWFnZUxvYWRlZCA9ICdsb2FkaW5nJztcblxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmN1cnJJbWFnZUxvYWRlZCA9PT0gJ2xvYWRpbmcnKXtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJJbWFnZUxvYWRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCA1MCk7XG5cbiAgICAgICAgdGhpcy5zZXRNYXhEaW1lbnNpb25zKCk7XG4gICAgfVxuICAgIHByZXYoKXtcbiAgICAgICAgaWYgKHRoaXMuaXNGaXJzdCl7XG4gICAgICAgICAgICBpZiAodGhpcy5jb25maWcubG9vcCl7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50SW1hZ2VJbmRleCA9IHRoaXMubGF0ZXN0SW1hZ2VJbmRleDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50SW1hZ2VJbmRleC0tO1xuICAgICAgICB9XG5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5jdXJySW1hZ2VMb2FkZWQgPT09ICdsb2FkaW5nJyl7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJySW1hZ2VMb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgNTApO1xuXG4gICAgICAgIHRoaXMuc2V0TWF4RGltZW5zaW9ucygpO1xuICAgIH1cblxuICAgIG9uSW1hZ2VMb2FkZWQoKXtcbiAgICAgICAgdGhpcy5jdXJySW1hZ2VMb2FkZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgc2V0QmFja2dyb3VuZE9wYWNpdHkob3BhY2l0eTogYW55KXtcbiAgICAgICAgdGhpcy5ob3N0U3R5bGVCYWNrZ3JvdW5kQ29sb3IgPSAncmdiYSgwLCAwLCAwLCAnK29wYWNpdHkrJyknO1xuICAgIH1cblxuICAgIHNldE1heERpbWVuc2lvbnMoKXtcbiAgICAgICAgaWYgKHRoaXMuZGVzY3JpcHRpb24pe1xuICAgICAgICAgICAgdGhpcy53cmFwcGVyRWxlbS5uYXRpdmVFbGVtZW50LnN0eWxlLmhlaWdodCA9ICdjYWxjKDEwMCUgLSAnICsgKHRoaXMuZGVzY3JpcHRpb25IZWlnaHQgKiAyKSArICdweCknO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy53cmFwcGVyRWxlbS5uYXRpdmVFbGVtZW50LnN0eWxlLmhlaWdodCA9ICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jdXJySW1hZ2VFbGVtLm5hdGl2ZUVsZW1lbnQuc3R5bGUubWF4SGVpZ2h0ID0gJ2NhbGMoJyArIHRoaXMuY29uZmlnLmxpZ2h0Ym94TWF4SGVpZ2h0ICsgJyknO1xuICAgICAgICB0aGlzLmN1cnJJbWFnZUVsZW0ubmF0aXZlRWxlbWVudC5zdHlsZS5tYXhXaWR0aCA9IHRoaXMuY29uZmlnLmxpZ2h0Ym94TWF4V2lkdGg7XG4gICAgfVxuXG4gICAgc2V0QW5pbWF0aW9uRHVyYXRpb24oKXtcbiAgICAgICAgdGhpcy5ob3N0U3R5bGVUcmFuc2l0aW9uID0gJ29wYWNpdHkgJyt0aGlzLmNvbmZpZy5hbmltYXRpb25EdXJhdGlvbisnbXMnO1xuICAgIH1cbn0iLCJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBFdmVudEVtaXR0ZXIsIE9uSW5pdCwgSG9zdEJpbmRpbmcsIEhvc3RMaXN0ZW5lciwgVmlld0NoaWxkLCBFbGVtZW50UmVmLCBDaGFuZ2VEZXRlY3RvclJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcblx0c2VsZWN0b3I6ICdjcnlzdGFsLWxpZ2h0Ym94LW1vYmlsZScsXG5cdHRlbXBsYXRlOiBgPGRpdiBjbGFzcz1cImNnLWJhY2tcIiAoY2xpY2spPVwiY2xvc2VMaWdodGJveCgpXCI+PC9kaXY+XG5cbjxkaXYgXG5cdGNsYXNzPVwiY2ctd3JhcHBlclwiIFxuXHRbY2xhc3MuY2ctbGFuZHNjYXBlXT1cImxhbmRzY2FwZU1vZGVcIlxuXHRwaW5jaCBbaXNMYXN0XT1cImlzTGFzdFwiIFtpc0ZpcnN0XT1cImlzRmlyc3RcIiAoZXZlbnRzKT1cImhhbmRsZVBpbmNoRXZlbnRzKCRldmVudClcIlxuXHQjd3JhcHBlcj5cblx0PGRpdiBjbGFzcz1cImNnLWltYWdlLXdyYXAgY2ctcHJldi1pbWFnZVwiPlxuXHRcdDxpbWcgXG5cdFx0XHQqbmdJZj1cInByZXZJbWFnZVBhdGhcIlxuXHRcdFx0W3NyY109XCJwcmV2SW1hZ2VQYXRoLmZ1bGxcIiBcblx0XHRcdFtjbGFzcy5jZy1oaWRlXT1cIiFwcmV2SW1hZ2UubG9hZGVkXCJcblx0XHRcdChsb2FkKT1cIm9uSW1hZ2VMb2FkZWQoJ3ByZXZJbWFnZScpXCJcblx0XHQvPlxuXHRcdDxkaXYgY2xhc3M9XCJjZy1zcGlubmVyXCIgKm5nSWY9XCIhcHJldkltYWdlLmxvYWRlZCAmJiBwcmV2SW1hZ2VQYXRoXCI+PC9kaXY+XG5cdDwvZGl2PlxuXG5cdDxkaXYgY2xhc3M9XCJjZy1pbWFnZS13cmFwIGNnLWN1cnItaW1hZ2VcIiAqbmdJZj1cImN1cnJJbWFnZS5zaG93XCI+XG5cdFx0PGltZyBcblx0XHRcdFtzcmNdPVwiY3VyckltYWdlUGF0aD8uZnVsbFwiIFxuXHRcdFx0W2NsYXNzLmNnLWhpZGVdPVwiIWN1cnJJbWFnZS5sb2FkZWRcIiBcblx0XHRcdChsb2FkKT1cIm9uSW1hZ2VMb2FkZWQoJ2N1cnJJbWFnZScpXCJcblx0XHQvPlxuXHRcdDxkaXYgY2xhc3M9XCJjZy1zcGlubmVyXCIgKm5nSWY9XCIhY3VyckltYWdlLmxvYWRlZFwiPjwvZGl2PlxuXHQ8L2Rpdj5cblx0XG5cdDxkaXYgY2xhc3M9XCJjZy1pbWFnZS13cmFwIGNnLW5leHQtaW1hZ2VcIj5cblx0XHQ8aW1nIFxuXHRcdFx0Km5nSWY9XCJuZXh0SW1hZ2VQYXRoXCJcblx0XHRcdFtzcmNdPVwibmV4dEltYWdlUGF0aC5mdWxsXCIgXG5cdFx0XHRbY2xhc3MuY2ctaGlkZV09XCIhbmV4dEltYWdlLmxvYWRlZFwiIFxuXHRcdFx0KGxvYWQpPVwib25JbWFnZUxvYWRlZCgnbmV4dEltYWdlJylcIlxuXHRcdC8+XG5cdFx0PGRpdiBjbGFzcz1cImNnLXNwaW5uZXJcIiAqbmdJZj1cIiFuZXh0SW1hZ2UubG9hZGVkICYmIG5leHRJbWFnZVBhdGhcIj48L2Rpdj5cblx0PC9kaXY+XG48L2Rpdj5gLFxuICAgIHN0eWxlczogW2AuX2NnLXNwaW5uZXIsLl9jZy1zcGlubmVyOmFmdGVye2JvcmRlci1yYWRpdXM6NTAlO3dpZHRoOjM2cHg7aGVpZ2h0OjM2cHh9Ll9jZy1zcGlubmVye21hcmdpbjowIGF1dG87Zm9udC1zaXplOjEwcHg7cG9zaXRpb246cmVsYXRpdmU7dGV4dC1pbmRlbnQ6LTk5OTllbTtib3JkZXItdG9wOjRweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LC4yKTtib3JkZXItcmlnaHQ6NHB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsLjIpO2JvcmRlci1ib3R0b206NHB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsLjIpO2JvcmRlci1sZWZ0OjRweCBzb2xpZCAjZmZmOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVooMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCk7LXdlYmtpdC1hbmltYXRpb246LjlzIGxpbmVhciBpbmZpbml0ZSBsb2FkODthbmltYXRpb246LjlzIGxpbmVhciBpbmZpbml0ZSBsb2FkOH1ALXdlYmtpdC1rZXlmcmFtZXMgbG9hZDh7MCV7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDApO3RyYW5zZm9ybTpyb3RhdGUoMCl9MTAwJXstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoMzYwZGVnKTt0cmFuc2Zvcm06cm90YXRlKDM2MGRlZyl9fUBrZXlmcmFtZXMgbG9hZDh7MCV7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDApO3RyYW5zZm9ybTpyb3RhdGUoMCl9MTAwJXstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoMzYwZGVnKTt0cmFuc2Zvcm06cm90YXRlKDM2MGRlZyl9fS5jZy1zcGlubmVyLC5jZy1zcGlubmVyOmFmdGVyLC5jZy1zcGlubmVyOmJlZm9yZXtib3JkZXItcmFkaXVzOjUwJTt3aWR0aDoxMHB4O2hlaWdodDoxMHB4Oy13ZWJraXQtYW5pbWF0aW9uOjEuNXMgZWFzZS1pbi1vdXQgaW5maW5pdGUgbG9hZDc7YW5pbWF0aW9uOjEuNXMgZWFzZS1pbi1vdXQgaW5maW5pdGUgbG9hZDd9LmNnLXNwaW5uZXJ7Y29sb3I6I2ZmZjtmb250LXNpemU6MTBweDttYXJnaW46MCBhdXRvIDIwcHg7cG9zaXRpb246cmVsYXRpdmU7dGV4dC1pbmRlbnQ6LTk5OTllbTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVaKDApO3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApOy13ZWJraXQtYW5pbWF0aW9uLWRlbGF5Oi0uMTZzO2FuaW1hdGlvbi1kZWxheTotLjE2c30uY2ctc3Bpbm5lcjphZnRlciwuY2ctc3Bpbm5lcjpiZWZvcmV7Y29udGVudDpcIlwiO3Bvc2l0aW9uOmFic29sdXRlO3RvcDowfS5jZy1zcGlubmVyOmJlZm9yZXtsZWZ0Oi0zZW07LXdlYmtpdC1hbmltYXRpb24tZGVsYXk6LS4zMnM7YW5pbWF0aW9uLWRlbGF5Oi0uMzJzfS5jZy1zcGlubmVyOmFmdGVye2xlZnQ6M2VtfUAtd2Via2l0LWtleWZyYW1lcyBsb2FkN3swJSwxMDAlLDgwJXtib3gtc2hhZG93OjAgMi41ZW0gMCAtMS4zZW19NDAle2JveC1zaGFkb3c6MCAyLjVlbSAwIDB9fUBrZXlmcmFtZXMgbG9hZDd7MCUsMTAwJSw4MCV7Ym94LXNoYWRvdzowIDEwcHggMCAtMS4zZW19NDAle2JveC1zaGFkb3c6MCAxMHB4IDAgMH19Omhvc3QoLmNnLXNob3cpe29wYWNpdHk6MX06aG9zdCguY2ctaGlkZS1jb250cm9scykgLmNnLWNsb3NlLDpob3N0KC5jZy1oaWRlLWNvbnRyb2xzKSAuY2ctbmV4dCw6aG9zdCguY2ctaGlkZS1jb250cm9scykgLmNnLXByZXZ7b3BhY2l0eTowfTpob3N0e29wYWNpdHk6MDtwb3NpdGlvbjpmaXhlZDt0b3A6MDtsZWZ0OjA7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtjb2xvcjojZmZmOy13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTt0cmFuc2l0aW9uOm9wYWNpdHkgLjJzIGN1YmljLWJlemllciguNjQ1LC4wNDUsLjM1NSwxKTt6LWluZGV4OjEwMDAwO2JhY2tncm91bmQtY29sb3I6IzAwMH06aG9zdCAuY2ctYmFja3tiYWNrZ3JvdW5kOnVybChcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0MlM0Z4bWwgdmVyc2lvbiUzRCUyMjEuMCUyMiBlbmNvZGluZyUzRCUyMlVURi04JTIyJTNGJTNFJTNDc3ZnIHdpZHRoJTNEJTIyMTBweCUyMiBoZWlnaHQlM0QlMjIxNnB4JTIyIHZpZXdCb3glM0QlMjIwIDAgMTAgMTYlMjIgdmVyc2lvbiUzRCUyMjEuMSUyMiB4bWxucyUzRCUyMmh0dHAlM0ElMkYlMkZ3d3cudzMub3JnJTJGMjAwMCUyRnN2ZyUyMiB4bWxucyUzQXhsaW5rJTNEJTIyaHR0cCUzQSUyRiUyRnd3dy53My5vcmclMkYxOTk5JTJGeGxpbmslMjIlM0UgICAgJTNDIS0tIEdlbmVyYXRvciUzQSBza2V0Y2h0b29sIDQwLjIgKDMzODI2KSAtIGh0dHAlM0ElMkYlMkZ3d3cuYm9oZW1pYW5jb2RpbmcuY29tJTJGc2tldGNoIC0tJTNFICAgICUzQ3RpdGxlJTNFMTFBNzM4NzItNUVCRi00NkY2LUI3QzUtMTQyRDQ3QTMzMzM5JTNDJTJGdGl0bGUlM0UgICAgJTNDZGVzYyUzRUNyZWF0ZWQgd2l0aCBza2V0Y2h0b29sLiUzQyUyRmRlc2MlM0UgICAgJTNDZGVmcyUzRSUzQyUyRmRlZnMlM0UgICAgJTNDZyBpZCUzRCUyMkludGVyZmFjZS0xMjgwLXgtODAwJTIyIHN0cm9rZSUzRCUyMm5vbmUlMjIgc3Ryb2tlLXdpZHRoJTNEJTIyMSUyMiBmaWxsJTNEJTIybm9uZSUyMiBmaWxsLXJ1bGUlM0QlMjJldmVub2RkJTIyJTNFICAgICAgICAlM0NnIGlkJTNEJTIyTG90X3ZpZXdwYWdlX29wZW4lMjIgdHJhbnNmb3JtJTNEJTIydHJhbnNsYXRlKC0xMTEuMDAwMDAwJTJDIC0yOTYuMDAwMDAwKSUyMiBmaWxsJTNEJTIyJTIzRkZGRkZGJTIyJTNFICAgICAgICAgICAgJTNDZyBpZCUzRCUyMmFycm93cy0xNnB4LTFfbWluaW1hbC1sZWZ0JTIyIHRyYW5zZm9ybSUzRCUyMnRyYW5zbGF0ZSgxMTEuMDAwMDAwJTJDIDI5Ni4wMDAwMDApJTIyJTNFICAgICAgICAgICAgICAgICUzQ3BvbHlnb24gaWQlM0QlMjJTaGFwZSUyMiBwb2ludHMlM0QlMjI4LjEgMTUuNyAwLjQgOCA4LjEgMC4zIDkuNiAxLjcgMy4zIDggOS42IDE0LjMlMjIlM0UlM0MlMkZwb2x5Z29uJTNFICAgICAgICAgICAgJTNDJTJGZyUzRSAgICAgICAgJTNDJTJGZyUzRSAgICAlM0MlMkZnJTNFJTNDJTJGc3ZnJTNFXCIpIGNlbnRlci8xMnB4IG5vLXJlcGVhdDt3aWR0aDo0MHB4O2hlaWdodDo0MHB4O29wYWNpdHk6Ljk7cG9zaXRpb246Zml4ZWQ7dG9wOjA7bGVmdDowO3otaW5kZXg6MTAwMH06aG9zdCAuY2ctd3JhcHBlci5jZy1sYW5kc2NhcGUgLmNnLWltYWdlLXdyYXAgaW1ne2hlaWdodDoxMDAlfTpob3N0IC5jZy13cmFwcGVye3RyYW5zaXRpb246bm9uZTt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO2Rpc3BsYXk6YmxvY2t9Omhvc3QgLmNnLXdyYXBwZXIgLmNnLWltYWdlLXdyYXAuY2ctcHJldi1pbWFnZXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZChjYWxjKC0xMDAlIC0gOHB4KSwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZChjYWxjKC0xMDAlIC0gOHB4KSwwLDApfTpob3N0IC5jZy13cmFwcGVyIC5jZy1pbWFnZS13cmFwLmNnLW5leHQtaW1hZ2V7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoY2FsYygxMDAlICsgOHB4KSwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZChjYWxjKDEwMCUgKyA4cHgpLDAsMCl9Omhvc3QgLmNnLXdyYXBwZXIgLmNnLWltYWdlLXdyYXB7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTt0ZXh0LWFsaWduOmNlbnRlcjtwb3NpdGlvbjphYnNvbHV0ZTtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXJ9Omhvc3QgLmNnLXdyYXBwZXIgLmNnLWltYWdlLXdyYXAgaW1ne21heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6MTAwJTt3aWR0aDphdXRvO2hlaWdodDphdXRvO3Bvc2l0aW9uOnJlbGF0aXZlfTpob3N0IC5jZy13cmFwcGVyIC5jZy1pbWFnZS13cmFwIGltZy5jZy1oaWRle2Rpc3BsYXk6bm9uZX1gXVxufSlcbmV4cG9ydCBjbGFzcyBMaWdodGJveE1vYmlsZUNvbXBvbmVudCB7IFxuXHRfaW5kZXg6IGFueTtcbiAgICBwcmV2SW5kZXg6IGFueTtcbiAgICBuZXh0SW5kZXg6IGFueTtcblxuICAgIGN1cnJJbWFnZSA9IHtcbiAgICAgICAgc2hvdzogZmFsc2UsXG4gICAgICAgIGxvYWRlZDogZmFsc2UsXG4gICAgICAgIGluZGV4OiAwXG4gICAgfTsgXG5cbiAgICBwcmV2SW1hZ2UgPSB7XG4gICAgICAgIGxvYWRlZDogZmFsc2VcbiAgICB9OyBcblxuICAgIG5leHRJbWFnZSA9IHtcbiAgICAgICAgbG9hZGVkOiBmYWxzZVxuICAgIH07IFxuXG4gICAgd3JhcHBlclByb3A6IGFueTtcbiAgICBsYW5kc2NhcGVNb2RlOiBhbnk7XG5cblx0Y2xvc2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICBASW5wdXQoKSBkYXRhOiBhbnk7XG5cbiAgICBAVmlld0NoaWxkKCd3cmFwcGVyJykgd3JhcHBlckVsOiBFbGVtZW50UmVmO1xuXG4gICAgZ2V0IGltYWdlcygpe1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhLmltYWdlcztcbiAgICB9XG5cbiAgICBnZXQgY29uZmlnKCl7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEuY29uZmlnO1xuICAgIH1cblxuICAgIGdldCBpbmRleCgpe1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJySW1hZ2UuaW5kZXg7XG4gICAgfVxuXG4gICAgZ2V0IGN1cnJJbWFnZVBhdGgoKXtcbiAgICAgICAgbGV0IGltYWdlID0gdGhpcy5pbWFnZXNbdGhpcy5pbmRleF07XG5cbiAgICAgICAgaWYgKCFpbWFnZSl7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaW1hZ2UucGF0aCl7XG4gICAgICAgICAgICBpbWFnZS5mdWxsID0gaW1hZ2UucGF0aDtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIGltYWdlO1xuICAgIH1cblxuICAgIGdldCBwcmV2SW1hZ2VQYXRoKCl7XG4gICAgICAgIGlmICh0aGlzLnByZXZJbmRleCA8IDAgJiYgdGhpcy5jb25maWcubG9vcCl7XG4gICAgICAgICAgICB0aGlzLnByZXZJbmRleCA9IHRoaXMubGF0ZXN0SW1hZ2VJbmRleDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBpbWFnZSA9IHRoaXMuaW1hZ2VzW3RoaXMucHJldkluZGV4XTtcblxuICAgICAgICBpZiAoaW1hZ2UgJiYgaW1hZ2UucGF0aCl7XG4gICAgICAgICAgICBpbWFnZS5mdWxsID0gaW1hZ2UucGF0aDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW1hZ2U7XG4gICAgfVxuXG4gICAgZ2V0IG5leHRJbWFnZVBhdGgoKXtcbiAgICAgICAgbGV0IGltYWdlID0gdGhpcy5pbWFnZXNbdGhpcy5uZXh0SW5kZXhdO1xuXG4gICAgICAgIGlmIChpbWFnZSAmJiBpbWFnZS5wYXRoKXtcbiAgICAgICAgICAgIGltYWdlLmZ1bGwgPSBpbWFnZS5wYXRoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbWFnZTtcbiAgICB9XG5cbiAgICBnZXQgaXNGaXJzdCgpe1xuICAgICAgICBpZiAodGhpcy5jb25maWcubG9vcCl7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgXHQgICAgcmV0dXJuIHRoaXMuaW5kZXggPT09IDA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXQgaXNMYXN0KCl7XG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5sb29wKXtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmluZGV4ID09PSB0aGlzLmxhdGVzdEltYWdlSW5kZXg7XG4gICAgICAgIH0gICAgICAgIFxuICAgIH1cblxuICAgIGdldCBsYXRlc3RJbWFnZUluZGV4KCl7XG4gICAgICAgIHJldHVybiB0aGlzLmltYWdlcy5sZW5ndGggLSAxO1xuICAgIH1cblxuICAgIGdldCBpc0xhbmRzY2FwZSgpe1xuICAgICAgICByZXR1cm4gd2luZG93LmlubmVyV2lkdGggPiB3aW5kb3cuaW5uZXJIZWlnaHQ7XG4gICAgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5jZy1zaG93JykgbGlnaHRib3hTaG93bjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgQEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScsIFsnJGV2ZW50J10pXG4gICAgb25XaW5kb3dSZXNpemUoZXZlbnQ6IGFueSkge1xuICAgICAgICB0aGlzLmxhbmRzY2FwZU1vZGUgPSB0aGlzLmlzTGFuZHNjYXBlO1xuICAgICAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLCBwcml2YXRlIHJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYpe1xuICAgIH1cblxuICAgIG5nT25Jbml0KCl7XG4gICAgICAgIHRoaXMuY3VyckltYWdlLmluZGV4ID0gdGhpcy5jb25maWcuaW5kZXg7XG4gICAgICAgIHRoaXMucHJldkluZGV4ID0gdGhpcy5jdXJySW1hZ2UuaW5kZXgtMTtcbiAgICAgICAgdGhpcy5uZXh0SW5kZXggPSB0aGlzLmN1cnJJbWFnZS5pbmRleCsxO1xuXG4gICAgICAgIHRoaXMuc2hvd0xpZ2h0Ym94KCk7XG4gICAgfVxuXG4gICAgc2hvd0xpZ2h0Ym94KCl7XG4gICAgICAgIHRoaXMuY3VyckltYWdlLnNob3cgPSB0cnVlO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgdGhpcy5saWdodGJveFNob3duID0gdHJ1ZTtcbiAgICAgICAgfSwgMzApO1xuICAgIH1cblxuXHRjbG9zZUxpZ2h0Ym94KCl7XG5cdFx0dGhpcy5saWdodGJveFNob3duID0gZmFsc2U7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICB0aGlzLmNsb3NlLmVtaXQodHJ1ZSk7XG4gICAgICAgIH0sIDIwMCk7IFxuXHR9XG5cbiAgICBzbGlkZShldmVudDogYW55KXtcbiAgICAgICAgaWYgKGV2ZW50ID09PSAnbmV4dCcpe1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAodGhpcy5pc0xhc3Qpe1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VyckltYWdlLmluZGV4Kys7XG4gICAgICAgICAgICAgICAgfSwgMjAwKTsgXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmluZGV4ID09PSB0aGlzLmxhdGVzdEltYWdlSW5kZXgpe1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJJbWFnZS5pbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgfSwgMjAwKTsgXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuYWZ0ZXJTbGlkZSgnbmV4dCcpO1xuICAgICAgICAgICAgfSwgMzAwKTsgXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXZlbnQgPT09ICdwcmV2Jyl7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmlzRmlyc3Qpe1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VyckltYWdlLmluZGV4LS07XG4gICAgICAgICAgICAgICAgfSwgMjAwKTsgXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmluZGV4ID09PSAwKXtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJySW1hZ2UuaW5kZXggPSB0aGlzLmxhdGVzdEltYWdlSW5kZXg7XG4gICAgICAgICAgICAgICAgfSwgMjAwKTsgXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuYWZ0ZXJTbGlkZSgncHJldicpO1xuICAgICAgICAgICAgfSwgMzAwKTsgXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhZnRlclNsaWRlKGV2ZW50VHlwZTogYW55KXtcbiAgICAgICAgdGhpcy5jdXJySW1hZ2Uuc2hvdyA9IHRydWU7XG4gICAgICAgIFxuICAgICAgICBpZiAodGhpcy5pbmRleCA9PT0gdGhpcy5sYXRlc3RJbWFnZUluZGV4ICYmIHRoaXMuY29uZmlnLmxvb3Ape1xuICAgICAgICAgICAgdGhpcy5uZXh0SW5kZXggPSAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5uZXh0SW5kZXggPSB0aGlzLmluZGV4KzE7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pbmRleCA9PT0gMCAmJiB0aGlzLmNvbmZpZy5sb29wKXtcbiAgICAgICAgICAgIHRoaXMucHJldkluZGV4ID0gdGhpcy5sYXRlc3RJbWFnZUluZGV4O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wcmV2SW5kZXggPSB0aGlzLmluZGV4LTE7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXZlbnRUeXBlID09PSAncHJldicpe1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMucHJldkltYWdlLmxvYWRlZCl7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJySW1hZ2UubG9hZGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5wcmV2SW1hZ2UubG9hZGVkID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXRoaXMuY3VyckltYWdlLmxvYWRlZCl7XG4gICAgICAgICAgICAgICAgdGhpcy5uZXh0SW1hZ2UubG9hZGVkID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXZlbnRUeXBlID09PSAnbmV4dCcpe1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMubmV4dEltYWdlLmxvYWRlZCl7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJySW1hZ2UubG9hZGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5uZXh0SW1hZ2UubG9hZGVkID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXRoaXMuY3VyckltYWdlLmxvYWRlZCl7XG4gICAgICAgICAgICAgICAgdGhpcy5wcmV2SW1hZ2UubG9hZGVkID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRlZmF1bHRXcmFwcGVyUG9zaXRpb24oKTtcbiAgICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIG9uSW1hZ2VMb2FkZWQoZWxlbTogYW55KXtcbiAgICAgICAgdGhpc1tlbGVtXS5sb2FkZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgaGFuZGxlUGluY2hFdmVudHMoJGV2ZW50KXtcbiAgICAgICAgaWYgKCRldmVudCA9PT0gJ3ByZXYnKXtcbiAgICAgICAgICAgIHRoaXMuc2xpZGUoJ3ByZXYnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoJGV2ZW50ID09PSAnbmV4dCcpe1xuICAgICAgICAgICAgdGhpcy5zbGlkZSgnbmV4dCcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZGVmYXVsdFdyYXBwZXJQb3NpdGlvbigpe1xuICAgICAgICBsZXQgZWxlbSA9IHRoaXMud3JhcHBlckVsLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGVsZW0uc3R5bGUudHJhbnNpdGlvbiA9ICdhbGwgMG1zJztcbiAgICAgICAgZWxlbS5zdHlsZS50cmFuc2Zvcm0gPSAnbWF0cml4KDEsIDAsIDAsIDEsIDAsIDApJztcbiAgICAgICAgZWxlbS5zdHlsZS53ZWJraXRUcmFuc2Zvcm0gPSAnbWF0cml4KDEsIDAsIDAsIDEsIDAsIDApJztcbiAgICB9XG59IiwiZXhwb3J0IGNvbnN0IGRlZmF1bHRDb25maWcgPSB7XG5cdG1hc29ucnk6IHRydWUsXG5cdG1hc29ucnlNYXhIZWlnaHQ6IDIwMCxcblx0bWFzb25yeUd1dHRlcjogNCxcblx0bG9vcDogZmFsc2UsXG5cdGluZGV4OiAwLFxuXHRiYWNrZ3JvdW5kT3BhY2l0eTogMC44NSxcblx0Y291bnRlcjogZmFsc2UsXG5cdGxpZ2h0Ym94TWF4SGVpZ2h0OiBcIjEwMCVcIixcblx0bGlnaHRib3hNYXhXaWR0aDogXCIxMDAlXCIsXG5cdGFuaW1hdGlvbkR1cmF0aW9uOiAxMDBcbn0iLCJpbXBvcnQge1xuICAgIEluamVjdGFibGUsXG4gICAgSW5qZWN0b3IsXG4gICAgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICAgIEVtYmVkZGVkVmlld1JlZixcbiAgICBBcHBsaWNhdGlvblJlZixcbiAgICBDb21wb25lbnRSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IExpZ2h0Ym94Q29tcG9uZW50IH0gZnJvbSAnLi9saWdodGJveC5jb21wb25lbnQnO1xuaW1wb3J0IHsgTGlnaHRib3hNb2JpbGVDb21wb25lbnQgfSBmcm9tICcuL2xpZ2h0Ym94LW1vYmlsZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgZGVmYXVsdENvbmZpZyB9IGZyb20gJy4vY29uZmlnJztcblxuZXhwb3J0IGludGVyZmFjZSBBZENvbXBvbmVudCB7XG4gIGRhdGE6IGFueTtcbiAgY2xvc2U6IGFueTtcbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIENyeXN0YWxMaWdodGJveCB7XG5cbiAgICBnZXQgaXNNb2JpbGUoKSB7XG4gICAgICAgIHZhciBjaGVjayA9IGZhbHNlO1xuICAgICAgICAoZnVuY3Rpb24oYSl7aWYoLyhhbmRyb2lkfGJiXFxkK3xtZWVnbykuK21vYmlsZXxhdmFudGdvfGJhZGFcXC98YmxhY2tiZXJyeXxibGF6ZXJ8Y29tcGFsfGVsYWluZXxmZW5uZWN8aGlwdG9wfGllbW9iaWxlfGlwKGhvbmV8b2QpfGlyaXN8a2luZGxlfGxnZSB8bWFlbW98bWlkcHxtbXB8bW9iaWxlLitmaXJlZm94fG5ldGZyb250fG9wZXJhIG0ob2J8aW4paXxwYWxtKCBvcyk/fHBob25lfHAoaXhpfHJlKVxcL3xwbHVja2VyfHBvY2tldHxwc3B8c2VyaWVzKDR8NikwfHN5bWJpYW58dHJlb3x1cFxcLihicm93c2VyfGxpbmspfHZvZGFmb25lfHdhcHx3aW5kb3dzIGNlfHhkYXx4aWluby9pLnRlc3QoYSl8fC8xMjA3fDYzMTB8NjU5MHwzZ3NvfDR0aHB8NTBbMS02XWl8Nzcwc3w4MDJzfGEgd2F8YWJhY3xhYyhlcnxvb3xzXFwtKXxhaShrb3xybil8YWwoYXZ8Y2F8Y28pfGFtb2l8YW4oZXh8bnl8eXcpfGFwdHV8YXIoY2h8Z28pfGFzKHRlfHVzKXxhdHR3fGF1KGRpfFxcLW18ciB8cyApfGF2YW58YmUoY2t8bGx8bnEpfGJpKGxifHJkKXxibChhY3xheil8YnIoZXx2KXd8YnVtYnxid1xcLShufHUpfGM1NVxcL3xjYXBpfGNjd2F8Y2RtXFwtfGNlbGx8Y2h0bXxjbGRjfGNtZFxcLXxjbyhtcHxuZCl8Y3Jhd3xkYShpdHxsbHxuZyl8ZGJ0ZXxkY1xcLXN8ZGV2aXxkaWNhfGRtb2J8ZG8oY3xwKW98ZHMoMTJ8XFwtZCl8ZWwoNDl8YWkpfGVtKGwyfHVsKXxlcihpY3xrMCl8ZXNsOHxleihbNC03XTB8b3N8d2F8emUpfGZldGN8Zmx5KFxcLXxfKXxnMSB1fGc1NjB8Z2VuZXxnZlxcLTV8Z1xcLW1vfGdvKFxcLnd8b2QpfGdyKGFkfHVuKXxoYWllfGhjaXR8aGRcXC0obXxwfHQpfGhlaVxcLXxoaShwdHx0YSl8aHAoIGl8aXApfGhzXFwtY3xodChjKFxcLXwgfF98YXxnfHB8c3x0KXx0cCl8aHUoYXd8dGMpfGlcXC0oMjB8Z298bWEpfGkyMzB8aWFjKCB8XFwtfFxcLyl8aWJyb3xpZGVhfGlnMDF8aWtvbXxpbTFrfGlubm98aXBhcXxpcmlzfGphKHR8dilhfGpicm98amVtdXxqaWdzfGtkZGl8a2VqaXxrZ3QoIHxcXC8pfGtsb258a3B0IHxrd2NcXC18a3lvKGN8ayl8bGUobm98eGkpfGxnKCBnfFxcLyhrfGx8dSl8NTB8NTR8XFwtW2Etd10pfGxpYnd8bHlueHxtMVxcLXd8bTNnYXxtNTBcXC98bWEodGV8dWl8eG8pfG1jKDAxfDIxfGNhKXxtXFwtY3J8bWUocmN8cmkpfG1pKG84fG9hfHRzKXxtbWVmfG1vKDAxfDAyfGJpfGRlfGRvfHQoXFwtfCB8b3x2KXx6eil8bXQoNTB8cDF8diApfG13YnB8bXl3YXxuMTBbMC0yXXxuMjBbMi0zXXxuMzAoMHwyKXxuNTAoMHwyfDUpfG43KDAoMHwxKXwxMCl8bmUoKGN8bSlcXC18b258dGZ8d2Z8d2d8d3QpfG5vayg2fGkpfG56cGh8bzJpbXxvcCh0aXx3dil8b3Jhbnxvd2cxfHA4MDB8cGFuKGF8ZHx0KXxwZHhnfHBnKDEzfFxcLShbMS04XXxjKSl8cGhpbHxwaXJlfHBsKGF5fHVjKXxwblxcLTJ8cG8oY2t8cnR8c2UpfHByb3h8cHNpb3xwdFxcLWd8cWFcXC1hfHFjKDA3fDEyfDIxfDMyfDYwfFxcLVsyLTddfGlcXC0pfHF0ZWt8cjM4MHxyNjAwfHJha3N8cmltOXxybyh2ZXx6byl8czU1XFwvfHNhKGdlfG1hfG1tfG1zfG55fHZhKXxzYygwMXxoXFwtfG9vfHBcXC0pfHNka1xcL3xzZShjKFxcLXwwfDEpfDQ3fG1jfG5kfHJpKXxzZ2hcXC18c2hhcnxzaWUoXFwtfG0pfHNrXFwtMHxzbCg0NXxpZCl8c20oYWx8YXJ8YjN8aXR8dDUpfHNvKGZ0fG55KXxzcCgwMXxoXFwtfHZcXC18diApfHN5KDAxfG1iKXx0MigxOHw1MCl8dDYoMDB8MTB8MTgpfHRhKGd0fGxrKXx0Y2xcXC18dGRnXFwtfHRlbChpfG0pfHRpbVxcLXx0XFwtbW98dG8ocGx8c2gpfHRzKDcwfG1cXC18bTN8bTUpfHR4XFwtOXx1cChcXC5ifGcxfHNpKXx1dHN0fHY0MDB8djc1MHx2ZXJpfHZpKHJnfHRlKXx2ayg0MHw1WzAtM118XFwtdil8dm00MHx2b2RhfHZ1bGN8dngoNTJ8NTN8NjB8NjF8NzB8ODB8ODF8ODN8ODV8OTgpfHczYyhcXC18ICl8d2ViY3x3aGl0fHdpKGcgfG5jfG53KXx3bWxifHdvbnV8eDcwMHx5YXNcXC18eW91cnx6ZXRvfHp0ZVxcLS9pLnRlc3QoYS5zdWJzdHIoMCw0KSkpIGNoZWNrID0gdHJ1ZTt9KShuYXZpZ2F0b3IudXNlckFnZW50fHxuYXZpZ2F0b3IudmVuZG9yKTtcbiAgICAgICAgcmV0dXJuIGNoZWNrO1xuICAgIH07XG5cblx0Y29uc3RydWN0b3IoXG5cdFx0cHJpdmF0ZSBjb21wb25lbnRGYWN0b3J5UmVzb2x2ZXI6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcblx0XHRwcml2YXRlIGFwcFJlZjogQXBwbGljYXRpb25SZWYsXG5cdFx0cHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3Jcblx0KSB7IH1cbiBcblx0YXBwZW5kQ29tcG9uZW50VG9Cb2R5KGNvbXBvbmVudDogYW55LCBkYXRhOiBhbnkpIHtcdFx0XG5cdFx0Y29uc3QgY29tcG9uZW50UmVmID0gdGhpcy5jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXJcblx0XHRcdC5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShjb21wb25lbnQpXG5cdFx0XHQuY3JlYXRlKHRoaXMuaW5qZWN0b3IpO1xuXG5cdFx0KDxBZENvbXBvbmVudD5jb21wb25lbnRSZWYuaW5zdGFuY2UpLmRhdGEgPSBkYXRhO1xuXHRcdHRoaXMuYXBwUmVmLmF0dGFjaFZpZXcoY29tcG9uZW50UmVmLmhvc3RWaWV3KTtcblx0XHRjb25zdCBkb21FbGVtID0gKGNvbXBvbmVudFJlZi5ob3N0VmlldyBhcyBFbWJlZGRlZFZpZXdSZWY8YW55Pikucm9vdE5vZGVzWzBdIGFzIEhUTUxFbGVtZW50O1xuXHRcdGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZG9tRWxlbSk7XG5cdFx0XG4gICAgICAgICg8QWRDb21wb25lbnQ+Y29tcG9uZW50UmVmLmluc3RhbmNlKS5jbG9zZS5zdWJzY3JpYmUoKCkgPT4ge1xuXHRcdFx0dGhpcy5hcHBSZWYuZGV0YWNoVmlldyhjb21wb25lbnRSZWYuaG9zdFZpZXcpO1xuXHRcdFx0Y29tcG9uZW50UmVmLmRlc3Ryb3koKTtcbiAgICAgICAgfSk7XG5cdH1cblxuXHRvcGVuKGltYWdlczogYW55LCBjb25maWc6IGFueSA9IHt9KXtcblx0XHRjb25maWcgPSB0aGlzLmFwcGx5Q29uZmlnRGVmYXVsdHMoZGVmYXVsdENvbmZpZywgY29uZmlnKTtcblx0XHRsZXQgZGF0YSA9IHtcblx0XHRcdGltYWdlcywgXG5cdFx0XHRjb25maWdcblx0XHR9O1xuICAgICAgICBsZXQgY29tcG9uZW50ID0gdGhpcy5nZXRMaWdodGJveENvbXBvbmVudCgpO1xuICAgICAgICBcblx0XHR0aGlzLmFwcGVuZENvbXBvbmVudFRvQm9keShjb21wb25lbnQsIGRhdGEpO1xuXHR9XG5cblx0Z2V0TGlnaHRib3hDb21wb25lbnQoKXtcblx0XHRyZXR1cm4gIXRoaXMuaXNNb2JpbGUgPyBMaWdodGJveENvbXBvbmVudCA6IExpZ2h0Ym94TW9iaWxlQ29tcG9uZW50O1xuXHR9XG5cblx0YXBwbHlDb25maWdEZWZhdWx0cyhkZWZhdWx0Q29uZmlnLCBjb25maWcpe1xuXHRcdGlmICghY29uZmlnLmluZGV4KXsgXG5cdFx0XHRjb25maWcuaW5kZXggPSAwO1xuXHRcdH1cblx0XHRyZXR1cm4gT2JqZWN0LmFzc2lnbihkZWZhdWx0Q29uZmlnLCBjb25maWcpO1xuXHR9XG59IiwiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25Jbml0LCBFbGVtZW50UmVmLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENyeXN0YWxMaWdodGJveCB9IGZyb20nLi9kb20uc2VydmljZSdcblxuQENvbXBvbmVudCh7XG5cdHNlbGVjdG9yOiAnY3J5c3RhbC1nYWxsZXJ5JywgXG5cdHRlbXBsYXRlOiBgPGRpdiAjY29udGVudFdyYXBwZXIgW2hpZGRlbl09XCJpc05nQ29udGVudFwiPlxuICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbjwvZGl2PlxuXG48bWFzb25yeS1sYXlvdXQgXG4gICAgY2xhc3M9XCJjZy13cmFwcGVyXCJcbiAgICAqbmdJZj1cIiFpc05nQ29udGVudFwiIFxuXG4gICAgW21heC1oZWlnaHRdPVwibWFzb25yeU1heEhlaWdodFwiIFxuICAgIFtndXR0ZXJdPVwibWFzb25yeUd1dHRlclwiXG4gICAgW21hc29ucnldPVwibWFzb25yeVN0YXRlXCJcbiAgICBbY2xhc3MtbmFtZV09XCInY2ctaW1hZ2UnXCJcbiAgICBbaW1hZ2VzXT1cImltYWdlc1wiXG4gICAgKGV2ZW50cyk9XCJoYW5kbGVNYXNvbnJ5TGF5b3V0RXZlbnRzKCRldmVudClcIj48L21hc29ucnktbGF5b3V0PmAsXG4gICAgc3R5bGVzOiBbYDpob3N0e2Rpc3BsYXk6YmxvY2s7d2lkdGg6MTAwJX06aG9zdCAuY2ctd3JhcHBlcntkaXNwbGF5OmJsb2NrO3dpZHRoOjEwMCU7b3ZlcmZsb3c6aGlkZGVufTpob3N0IC5jZy13cmFwcGVyLmNnLXNob3d7aGVpZ2h0OmF1dG87cG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTp0YWJsZX06aG9zdCAuY2ctaW1hZ2UgaW1ne2N1cnNvcjpwb2ludGVyO3dpZHRoOjEwMCV9YF0sXG59KVxuZXhwb3J0IGNsYXNzIEdhbGxlcnlDb21wb25lbnQge1xuXG4gICAgQElucHV0KCdpbWFnZXMnKSBpbWFnZXM6IGFueTtcbiAgICBASW5wdXQoJ2NvbmZpZycpIGNvbmZpZzogYW55ID0ge307XG5cbiAgICBAVmlld0NoaWxkKCdjb250ZW50V3JhcHBlcicpIGNvbnRlbnRXcmFwcGVyOiBFbGVtZW50UmVmO1xuXG4gICAgZ2V0IGlzTmdDb250ZW50KCl7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnRXcmFwcGVyLm5hdGl2ZUVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoID4gMDtcbiAgICB9XG5cbiAgICBnZXQgbWFzb25yeVN0YXRlKCl7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbmZpZy5tYXNvbnJ5O1xuICAgIH1cblxuICAgIGdldCBtYXNvbnJ5TWF4SGVpZ2h0KCl7XG4gICAgXHRyZXR1cm4gdGhpcy5jb25maWcubWFzb25yeU1heEhlaWdodDtcbiAgICB9XG5cbiAgICBnZXQgbWFzb25yeUd1dHRlcigpe1xuICAgIFx0cmV0dXJuIHRoaXMuY29uZmlnLm1hc29ucnlHdXR0ZXI7XG4gICAgfVxuXG5cdGNvbnN0cnVjdG9yKFxuXHRcdHByaXZhdGUgbGlnaHRib3g6IENyeXN0YWxMaWdodGJveCxcblx0XHRwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWZcblx0KSB7fVxuXG5cdHNob3dMaWdodGJveChpbWFnZXM6IGFueSwgaTogbnVtYmVyKXtcbiAgICAgICAgdGhpcy5jb25maWcuaW5kZXggPSBpO1xuXHRcdHRoaXMubGlnaHRib3gub3BlbihpbWFnZXMsIHRoaXMuY29uZmlnKTtcblx0fVxuXG4gICAgaGFuZGxlTWFzb25yeUxheW91dEV2ZW50cyhldmVudCl7XG4gICAgICAgIHRoaXMuc2hvd0xpZ2h0Ym94KHRoaXMuaW1hZ2VzLCBldmVudC5pbmRleCk7XG4gICAgfVxufSIsImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgSG9zdExpc3RlbmVyLCBJbnB1dCwgT3V0cHV0LCBPbkluaXQsIE9uQ2hhbmdlcywgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW1hZ2Uge1xuICAgIHBhdGg6IHN0cmluZzsgXG4gICAgd2lkdGg6IG51bWJlcjsgXG4gICAgaGVpZ2h0OiBudW1iZXI7XG4gICAgY29tcHV0ZWRIZWlnaHQ/OiBzdHJpbmc7XG4gICAgY29tcHV0ZWRXaWR0aD86IHN0cmluZztcbiAgICBtYXJnaW4/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIEltYWdlcyBleHRlbmRzIEFycmF5PEltYWdlPnt9XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbWFzb25yeS1sYXlvdXQnLCBcbiAgICB0ZW1wbGF0ZTogYDxkaXYgXG5cdFtuZ0NsYXNzXT1cIkNMQVNTX05BTUVcIlxuXHQqbmdGb3I9XCJsZXQgaW1hZ2Ugb2YgaW1hZ2VzOyBsZXQgaSA9IGluZGV4O1wiXG4gICAgW3N0eWxlLndpZHRoXT1cImltYWdlLmNvbXB1dGVkV2lkdGhcIlxuICAgIFtzdHlsZS5oZWlnaHRdPVwiaW1hZ2UuY29tcHV0ZWRIZWlnaHRcIlxuICAgIFtzdHlsZS5mbG9hdF09XCInbGVmdCdcIlxuICAgIFtzdHlsZS5tYXJnaW5dPVwiaW1hZ2UubWFyZ2luXCJcbiAgICBbc3R5bGUuYmFja2dyb3VuZF09XCInI2VlZWVlZSdcIlxuICAgIFtzdHlsZS5saW5lSGVpZ2h0XT1cIjBcIj5cblx0PGltZyBcbiAgICAgICAgI2ltYWdlRWxlbVxuICAgICAgICBbc3JjXT1cImltYWdlLnByZXZpZXcgfHwgaW1hZ2UuZnVsbFwiIFxuICAgICAgICBbc3R5bGUud2lkdGguJV09XCIxMDBcIiBcbiAgICAgICAgW3N0eWxlLmhlaWdodF09XCInYXV0bydcIlxuICAgICAgICBbc3R5bGUub3BhY2l0eV09XCIwXCJcbiAgICAgICAgKGNsaWNrKT1cImNsaWNrT25JbWFnZShpbWFnZSwgaSlcIlxuICAgICAgICAobG9hZCk9XCJvbkltYWdlTG9hZGVkKGltYWdlRWxlbSlcIiAvPlxuPC9kaXY+YCxcbn0pXG5cbmV4cG9ydCBjbGFzcyBNYXNvbnJ5TGF5b3V0Q29tcG9uZW50IHtcbiAgICBHVVRURVI6IG51bWJlciA9IDA7XG4gICAgbm9kZXM6IGFueTtcbiAgICBlbGVtOiBhbnk7XG4gICAgc2F2ZWROb2RlRGltZW5zaW9uczogYW55ID0gW107XG4gICAgb2JzZXJ2ZXI6IGFueTtcbiAgICBncmlkU3RhdGU6IHN0cmluZyA9ICdub3Qgc3RhcnRlZCc7XG4gICAgcmVzaXplVGltZXI6IGFueTtcbiAgICBjaGFuZ2VzVGltZXI6IGFueTtcblxuICAgIEBJbnB1dCgnaW1hZ2VzJykgaW1hZ2VzOiBJbWFnZXM7IFxuICAgIEBJbnB1dCgnbWFzb25yeScpIEVOQUJMRV9NQVNPTlJZOiBib29sZWFuID0gdHJ1ZTsgXG4gICAgQElucHV0KCdtYXgtaGVpZ2h0JykgTUFYX0hFSUdIVDogbnVtYmVyID0gNDAwOyBcbiAgICBASW5wdXQoJ2NsYXNzLW5hbWUnKSBDTEFTU19OQU1FOiBzdHJpbmcgfCB7IFtrZXk6IHN0cmluZ106IGFueTsgfTtcblxuICAgIEBJbnB1dCgnZ3V0dGVyJylcbiAgICBzZXQgZ3V0dGVyKHZhbHVlOiBudW1iZXIpe1xuICAgICAgICB0aGlzLkdVVFRFUiA9IHZhbHVlIC8gMjtcbiAgICB9XG5cbiAgICBAT3V0cHV0KCkgZXZlbnRzOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICAgICBcbiAgICBnZXQgaXNNb2JpbGUoKTpib29sZWFuIHtcbiAgICAgICAgdmFyIGNoZWNrID0gZmFsc2U7XG4gICAgICAgIChmdW5jdGlvbihhKXtpZigvKGFuZHJvaWR8YmJcXGQrfG1lZWdvKS4rbW9iaWxlfGF2YW50Z298YmFkYVxcL3xibGFja2JlcnJ5fGJsYXplcnxjb21wYWx8ZWxhaW5lfGZlbm5lY3xoaXB0b3B8aWVtb2JpbGV8aXAoaG9uZXxvZCl8aXJpc3xraW5kbGV8bGdlIHxtYWVtb3xtaWRwfG1tcHxtb2JpbGUuK2ZpcmVmb3h8bmV0ZnJvbnR8b3BlcmEgbShvYnxpbilpfHBhbG0oIG9zKT98cGhvbmV8cChpeGl8cmUpXFwvfHBsdWNrZXJ8cG9ja2V0fHBzcHxzZXJpZXMoNHw2KTB8c3ltYmlhbnx0cmVvfHVwXFwuKGJyb3dzZXJ8bGluayl8dm9kYWZvbmV8d2FwfHdpbmRvd3MgY2V8eGRhfHhpaW5vL2kudGVzdChhKXx8LzEyMDd8NjMxMHw2NTkwfDNnc298NHRocHw1MFsxLTZdaXw3NzBzfDgwMnN8YSB3YXxhYmFjfGFjKGVyfG9vfHNcXC0pfGFpKGtvfHJuKXxhbChhdnxjYXxjbyl8YW1vaXxhbihleHxueXx5dyl8YXB0dXxhcihjaHxnbyl8YXModGV8dXMpfGF0dHd8YXUoZGl8XFwtbXxyIHxzICl8YXZhbnxiZShja3xsbHxucSl8YmkobGJ8cmQpfGJsKGFjfGF6KXxicihlfHYpd3xidW1ifGJ3XFwtKG58dSl8YzU1XFwvfGNhcGl8Y2N3YXxjZG1cXC18Y2VsbHxjaHRtfGNsZGN8Y21kXFwtfGNvKG1wfG5kKXxjcmF3fGRhKGl0fGxsfG5nKXxkYnRlfGRjXFwtc3xkZXZpfGRpY2F8ZG1vYnxkbyhjfHApb3xkcygxMnxcXC1kKXxlbCg0OXxhaSl8ZW0obDJ8dWwpfGVyKGljfGswKXxlc2w4fGV6KFs0LTddMHxvc3x3YXx6ZSl8ZmV0Y3xmbHkoXFwtfF8pfGcxIHV8ZzU2MHxnZW5lfGdmXFwtNXxnXFwtbW98Z28oXFwud3xvZCl8Z3IoYWR8dW4pfGhhaWV8aGNpdHxoZFxcLShtfHB8dCl8aGVpXFwtfGhpKHB0fHRhKXxocCggaXxpcCl8aHNcXC1jfGh0KGMoXFwtfCB8X3xhfGd8cHxzfHQpfHRwKXxodShhd3x0Yyl8aVxcLSgyMHxnb3xtYSl8aTIzMHxpYWMoIHxcXC18XFwvKXxpYnJvfGlkZWF8aWcwMXxpa29tfGltMWt8aW5ub3xpcGFxfGlyaXN8amEodHx2KWF8amJyb3xqZW11fGppZ3N8a2RkaXxrZWppfGtndCggfFxcLyl8a2xvbnxrcHQgfGt3Y1xcLXxreW8oY3xrKXxsZShub3x4aSl8bGcoIGd8XFwvKGt8bHx1KXw1MHw1NHxcXC1bYS13XSl8bGlid3xseW54fG0xXFwtd3xtM2dhfG01MFxcL3xtYSh0ZXx1aXx4byl8bWMoMDF8MjF8Y2EpfG1cXC1jcnxtZShyY3xyaSl8bWkobzh8b2F8dHMpfG1tZWZ8bW8oMDF8MDJ8Yml8ZGV8ZG98dChcXC18IHxvfHYpfHp6KXxtdCg1MHxwMXx2ICl8bXdicHxteXdhfG4xMFswLTJdfG4yMFsyLTNdfG4zMCgwfDIpfG41MCgwfDJ8NSl8bjcoMCgwfDEpfDEwKXxuZSgoY3xtKVxcLXxvbnx0Znx3Znx3Z3x3dCl8bm9rKDZ8aSl8bnpwaHxvMmltfG9wKHRpfHd2KXxvcmFufG93ZzF8cDgwMHxwYW4oYXxkfHQpfHBkeGd8cGcoMTN8XFwtKFsxLThdfGMpKXxwaGlsfHBpcmV8cGwoYXl8dWMpfHBuXFwtMnxwbyhja3xydHxzZSl8cHJveHxwc2lvfHB0XFwtZ3xxYVxcLWF8cWMoMDd8MTJ8MjF8MzJ8NjB8XFwtWzItN118aVxcLSl8cXRla3xyMzgwfHI2MDB8cmFrc3xyaW05fHJvKHZlfHpvKXxzNTVcXC98c2EoZ2V8bWF8bW18bXN8bnl8dmEpfHNjKDAxfGhcXC18b298cFxcLSl8c2RrXFwvfHNlKGMoXFwtfDB8MSl8NDd8bWN8bmR8cmkpfHNnaFxcLXxzaGFyfHNpZShcXC18bSl8c2tcXC0wfHNsKDQ1fGlkKXxzbShhbHxhcnxiM3xpdHx0NSl8c28oZnR8bnkpfHNwKDAxfGhcXC18dlxcLXx2ICl8c3koMDF8bWIpfHQyKDE4fDUwKXx0NigwMHwxMHwxOCl8dGEoZ3R8bGspfHRjbFxcLXx0ZGdcXC18dGVsKGl8bSl8dGltXFwtfHRcXC1tb3x0byhwbHxzaCl8dHMoNzB8bVxcLXxtM3xtNSl8dHhcXC05fHVwKFxcLmJ8ZzF8c2kpfHV0c3R8djQwMHx2NzUwfHZlcml8dmkocmd8dGUpfHZrKDQwfDVbMC0zXXxcXC12KXx2bTQwfHZvZGF8dnVsY3x2eCg1Mnw1M3w2MHw2MXw3MHw4MHw4MXw4M3w4NXw5OCl8dzNjKFxcLXwgKXx3ZWJjfHdoaXR8d2koZyB8bmN8bncpfHdtbGJ8d29udXx4NzAwfHlhc1xcLXx5b3VyfHpldG98enRlXFwtL2kudGVzdChhLnN1YnN0cigwLDQpKSkgY2hlY2sgPSB0cnVlO30pKG5hdmlnYXRvci51c2VyQWdlbnR8fG5hdmlnYXRvci52ZW5kb3IpO1xuICAgICAgICByZXR1cm4gY2hlY2s7XG4gICAgfTtcbiAgICAgXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmKXtcbiAgICAgICAgdGhpcy5lbGVtID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScsIFsnJGV2ZW50J10pXG4gICAgb25XaW5kb3dSZXNpemUoZXZlbnQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucmVzaXplVGltZXIpO1xuXG4gICAgICAgIHRoaXMucmVzaXplVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZ3JpZFN0YXRlID0gJ25vdCBzdGFydGVkJztcbiAgICAgICAgICAgIHRoaXMuYnVpbGRHcmlkKCk7IFxuICAgICAgICB9LCAyNTApO1xuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLmJ1aWxkR3JpZCgpO1xuICAgIH1cblxuICAgIG5nT25DaGFuZ2VzKCl7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmNoYW5nZXNUaW1lcik7XG5cbiAgICAgICAgdGhpcy5jaGFuZ2VzVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZ3JpZFN0YXRlID0gJ25vdCBzdGFydGVkJztcbiAgICAgICAgICAgIHRoaXMuYnVpbGRHcmlkKCk7IFxuICAgICAgICB9LCAyNTApO1xuICAgIH1cblxuICAgIGJ1aWxkR3JpZCgpe1xuICAgICAgICBsZXQgcGFyZW50V2lkdGggPSBNYXRoLmZsb29yKHRoaXMuZWxlbS5wYXJlbnROb2RlLm9mZnNldFdpZHRoKTtcbiAgICAgICAgbGV0IHRvdGFsUm93V2lkdGg6IGFueSA9IDA7IFxuICAgICAgICBsZXQgcm93OiBhbnkgPSB7XG4gICAgICAgICAgICBzdGFydEluZGV4OiAwLFxuICAgICAgICAgICAgZW5kSW5kZXg6IDAsXG4gICAgICAgICAgICBsZW5ndGg6IDAsXG4gICAgICAgICAgICB0b3RhbFdpZHRoOiAwXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKCF0aGlzLmltYWdlcyB8fCAhdGhpcy5pbWFnZXMubGVuZ3RoKXtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZWxlbS5zdHlsZS53aWR0aCA9IHBhcmVudFdpZHRoICsncHgnO1xuICAgICAgICB0aGlzLmVsZW0uc3R5bGUuZGlzcGxheSA9ICd0YWJsZSc7XG5cbiAgICAgICAgdGhpcy5pbWFnZXMuZm9yRWFjaCgobm9kZSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGlmIChyb3cudG90YWxXaWR0aCA9PT0gMCl7XG4gICAgICAgICAgICAgICAgcm93LnN0YXJ0SW5kZXggPSBpbmRleDtcbiAgICAgICAgICAgICAgICByb3cubGVuZ3RoID0gMDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcm93Lmxlbmd0aCsrO1xuICAgICAgICAgICAgcm93LnRvdGFsV2lkdGggKz0gdGhpcy5nZXRDb21wdXRlZFdpZHRoKGluZGV4KTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKHJvdy50b3RhbFdpZHRoID49IHBhcmVudFdpZHRoIHx8IHRoaXMuaXNMYXN0Q2hpbGQoaW5kZXgpKXtcbiAgICAgICAgICAgICAgICByb3cuZW5kSW5kZXggPSBpbmRleDtcbiAgICAgICAgICAgICAgICBsZXQgc2NhbGluZyA9IHJvdy50b3RhbFdpZHRoL3BhcmVudFdpZHRoO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRDb2xEaW1lbnNpb25zKHNjYWxpbmcsIHJvdyk7XG4gICAgICAgICAgICAgICAgcm93LnRvdGFsV2lkdGggPSAwOyBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2V0Q29sRGltZW5zaW9ucyhzY2FsaW5nOiBudW1iZXIsIHJvdzogYW55KXtcbiAgICAgICAgbGV0IHRvdGFsUm93V2lkdGg6IGFueSA9IDA7XG4gICAgICAgIGxldCBwYXJlbnRXaWR0aCA9IHRoaXMuZWxlbS5wYXJlbnROb2RlLm9mZnNldFdpZHRoO1xuICAgICAgICBzY2FsaW5nID0gKHNjYWxpbmcgPCAxKSA/IDEgOiBzY2FsaW5nO1xuXG4gICAgICAgIHRoaXMuaW1hZ2VzLmZvckVhY2goKG5vZGUsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuRU5BQkxFX01BU09OUlkpe1xuICAgICAgICAgICAgICAgIG5vZGUuY29tcHV0ZWRIZWlnaHQgPSB0aGlzLk1BWF9IRUlHSFQgKyAncHgnO1xuICAgICAgICAgICAgICAgIG5vZGUuY29tcHV0ZWRXaWR0aCA9IHRoaXMuZ2V0Q29tcHV0ZWRXaWR0aChpbmRleCkgKyAncHgnO1xuICAgICAgICAgICAgICAgIG5vZGUubWFyZ2luID0gdGhpcy5nZXROb2RlTWFyZ2luKHBhcmVudFdpZHRoKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpbmRleCA+PSByb3cuc3RhcnRJbmRleCAmJiBpbmRleCA8PSByb3cuZW5kSW5kZXgpe1xuICAgICAgICAgICAgICAgIGxldCBub2RlV2lkdGg7XG5cbiAgICAgICAgICAgICAgICAvLyBsYXN0IGltYWdlXG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ID09PSByb3cuZW5kSW5kZXggJiYgc2NhbGluZyA+IDEpeyBcbiAgICAgICAgICAgICAgICAgICAgbm9kZVdpZHRoID0gKDEwMCAtIHRvdGFsUm93V2lkdGgpIC0gKCh0aGlzLkdVVFRFUiAqIDIpIC8gcGFyZW50V2lkdGggKiAxMDApO1xuICAgICAgICAgICAgICAgICAgICBub2RlLmNvbXB1dGVkV2lkdGggPSAnY2FsYygnK25vZGVXaWR0aCsnJSknO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmdyaWRTdGF0ZSA9PT0gJ25vdCBzdGFydGVkJyl7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdyaWRTdGF0ZSA9ICdwcmUtYnVpbGRpbmcnO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkR3JpZCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSwgMTAwKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGVXaWR0aCA9ICgodGhpcy5nZXRDb21wdXRlZFdpZHRoKGluZGV4KSAvIHNjYWxpbmcpIC8gcGFyZW50V2lkdGggKiAxMDApIC0gKChyb3cubGVuZ3RoICogKHRoaXMuR1VUVEVSICogMikpICogKHRoaXMuZ2V0Q29tcHV0ZWRXaWR0aChpbmRleCkgLyBzY2FsaW5nKSAvIHBhcmVudFdpZHRoKSAvIHBhcmVudFdpZHRoICogMTAwO1xuICAgICAgICAgICAgICAgICAgICBub2RlLmNvbXB1dGVkV2lkdGggPSAnY2FsYygnK25vZGVXaWR0aCsnJSknO1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgdG90YWxSb3dXaWR0aCArPSBub2RlV2lkdGg7XG4gICAgICAgICAgICAgICAgICAgIHRvdGFsUm93V2lkdGggKz0gKHRoaXMuR1VUVEVSIC8gcGFyZW50V2lkdGggKiAxMDApICogMjsgIFxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIGxhc3Qgcm93IGFuZCBsYXN0IGltYWdlXG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ID09PSByb3cuZW5kSW5kZXggJiYgcm93Lmxlbmd0aCA9PT0gMSAmJiB0aGlzLmlzTW9iaWxlKXtcbiAgICAgICAgICAgICAgICBcdG5vZGVXaWR0aCA9IDEwMCAtICgodGhpcy5HVVRURVIgKiAyKSAvIHBhcmVudFdpZHRoICogMTAwKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGhlaWdodCA9IG5vZGUuaGVpZ2h0ICogKCBwYXJlbnRXaWR0aCAqIChub2RlV2lkdGggLyAxMDApIC8gbm9kZS53aWR0aCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGhlaWdodC8yIDwgdGhpcy5NQVhfSEVJR0hUKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY29tcHV0ZWRXaWR0aCA9ICdjYWxjKCcrbm9kZVdpZHRoKyclKSc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBub2RlLm1hcmdpbiA9IHRoaXMuZ2V0Tm9kZU1hcmdpbihwYXJlbnRXaWR0aCk7XG4gICAgICAgICAgICAgICAgbm9kZS5jb21wdXRlZEhlaWdodCA9IG5vZGUuaGVpZ2h0ICogKCBwYXJlbnRXaWR0aCAqIChub2RlV2lkdGggLyAxMDApIC8gbm9kZS53aWR0aCkgKyAncHgnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXRDb21wdXRlZFdpZHRoKGluZGV4OiBudW1iZXIpe1xuICAgICAgICByZXR1cm4gdGhpcy5pbWFnZXNbaW5kZXhdLndpZHRoIC8gKHRoaXMuaW1hZ2VzW2luZGV4XS5oZWlnaHQgLyB0aGlzLk1BWF9IRUlHSFQpO1xuICAgIH1cblxuICAgIGlzTGFzdENoaWxkKGluZGV4OiBudW1iZXIpe1xuICAgICAgICByZXR1cm4gaW5kZXggKyAxID09PSB0aGlzLmltYWdlcy5sZW5ndGg7XG4gICAgfVxuXG4gICAgZ2V0Tm9kZU1hcmdpbihwYXJlbnRXaWR0aDogbnVtYmVyKXtcbiAgICAgICAgcmV0dXJuICdjYWxjKCcrdGhpcy5HVVRURVIgLyBwYXJlbnRXaWR0aCAqIDEwMCsnJSknO1xuICAgIH1cblxuICAgIGNsaWNrT25JbWFnZShpbWFnZTogYW55LCBpOiBudW1iZXIpe1xuICAgICAgICB0aGlzLmV2ZW50cy5lbWl0KHtcbiAgICAgICAgICAgIHR5cGU6ICdjbGljay1vbi1pbWFnZScsXG4gICAgICAgICAgICBpbWFnZTogaW1hZ2UsXG4gICAgICAgICAgICBpbmRleDogaVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBvbkltYWdlTG9hZGVkKGVsZW0pe1xuICAgICAgICBlbGVtLnN0eWxlLm9wYWNpdHkgPSAxO1xuICAgIH1cbn0iLCJpbXBvcnQgeyBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIEhvc3RMaXN0ZW5lciwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiAnW3BpbmNoXSdcbn0pXG5cbmV4cG9ydCBjbGFzcyBQaW5jaERpcmVjdGl2ZXtcblxuICAgIGVsZW06IGFueTtcbiAgICBldmVudFR5cGU6IGFueTtcblxuICAgIHNjYWxlOiBhbnkgPSAxO1xuICAgIGluaXRpYWxTY2FsZTogYW55ID0gMTtcblxuICAgIHN0YXJ0WDogYW55O1xuICAgIHN0YXJ0WTogYW55O1xuXG4gICAgbW92ZVg6IGFueSA9IDA7XG4gICAgbW92ZVk6IGFueSA9IDA7XG4gICAgaW5pdGlhbE1vdmVYOiBhbnkgPSAwO1xuICAgIGluaXRpYWxNb3ZlWTogYW55ID0gMDtcblxuICAgIG1vdmVYQzogYW55O1xuICAgIG1vdmVZQzogYW55O1xuXG4gICAgZGlzdGFuY2U6IGFueTtcbiAgICBpbml0aWFsRGlzdGFuY2U6IGFueTtcblxuICAgIGlzTmV4dEltYWdlTG9hZGVkOiBhbnkgPSB0cnVlO1xuXG4gICAgQElucHV0KCkgaXNMYXN0OiBhbnk7XG4gICAgQElucHV0KCkgaXNGaXJzdDogYW55O1xuXG4gICAgQE91dHB1dCgpIGV2ZW50cyA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcbiAgICAgXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmKXtcbiAgICAgICAgdGhpcy5lbGVtID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcigndG91Y2hzdGFydCcsIFsnJGV2ZW50J10pXG4gICAgdG91Y2hzdGFydEhhbmRsZXIoZXZlbnQpIHtcbiAgICAgICAgdGhpcy5lbGVtLnN0eWxlLnRyYW5zZm9ybU9yaWdpbiA9ICcwIDAnO1xuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ3RvdWNobW92ZScsIFsnJGV2ZW50J10pXG4gICAgdG91Y2htb3ZlSGFuZGxlcihldmVudCkge1xuICAgICAgICBsZXQgdG91Y2hlcyA9IGV2ZW50LnRvdWNoZXM7XG5cbiAgICAgICAgaWYgKHRvdWNoZXMubGVuZ3RoID09PSAxICYmIHRoaXMuc2NhbGUgPT09IDEgJiYgIXRoaXMuZXZlbnRUeXBlIHx8IHRoaXMuZXZlbnRUeXBlID09ICdzd2lwZScpe1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLmlzTmV4dEltYWdlTG9hZGVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXRoaXMuZXZlbnRUeXBlKXtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0WCA9IGV2ZW50LnRvdWNoZXNbMF0ucGFnZVg7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGFydFkgPSBldmVudC50b3VjaGVzWzBdLnBhZ2VZO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmV2ZW50VHlwZSA9ICdzd2lwZSc7XG5cbiAgICAgICAgICAgIHRoaXMubW92ZVggPSB0aGlzLmluaXRpYWxNb3ZlWCArIChldmVudC50b3VjaGVzWzBdLnBhZ2VYIC0gdGhpcy5zdGFydFgpO1xuICAgICAgICAgICAgdGhpcy5tb3ZlWSA9IDA7XG5cbiAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtRWxlbSgwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ3RvdWNoZW5kJywgWyckZXZlbnQnXSlcbiAgICB0b3VjaGVuZEhhbmRsZXIoZXZlbnQpIHtcbiAgICAgICAgbGV0IHRvdWNoZXMgPSBldmVudC50b3VjaGVzO1xuICAgICAgICBsZXQgaW1nID0gdGhpcy5lbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiaW1nXCIpWzBdO1xuXG4gICAgICAgIGlmICghdGhpcy5pc05leHRJbWFnZUxvYWRlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZiAodGhpcy5zY2FsZSA8IDEpe1xuICAgICAgICAgICAgdGhpcy5zY2FsZSA9IDE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubW92ZVkgPiAwKXtcbiAgICAgICAgICAgIHRoaXMubW92ZVkgPSAwO1xuICAgICAgICB9IFxuXG4gICAgICAgIGlmICh0aGlzLm1vdmVYID4gMTAwKXtcbiAgICAgICAgICAgIHRoaXMuc2xpZGUoJ3ByZXYnKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm1vdmVYIDwgLTEwMCl7XG4gICAgICAgICAgICB0aGlzLnNsaWRlKCduZXh0Jyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm1vdmVYID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaW5pdGlhbFNjYWxlID0gdGhpcy5zY2FsZTtcbiAgICAgICAgdGhpcy5pbml0aWFsTW92ZVggPSB0aGlzLm1vdmVYO1xuICAgICAgICB0aGlzLmluaXRpYWxNb3ZlWSA9IHRoaXMubW92ZVk7XG5cbiAgICAgICAgdGhpcy50cmFuc2Zvcm1FbGVtKDIwMCk7IFxuXG4gICAgICAgIHRoaXMuZXZlbnRUeXBlID0gJ3RvdWNoZW5kJzsgICAgICAgIFxuICAgICAgICBpZiAodG91Y2hlcy5sZW5ndGggPT0gMCl7XG4gICAgICAgICAgICB0aGlzLmV2ZW50VHlwZSA9ICcnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2xpZGUoZXZlbnQ6IGFueSl7XG4gICAgICAgIHRoaXMub25TbGlkZShldmVudCk7XG5cbiAgICAgICAgaWYgKGV2ZW50ID09PSAncHJldicpe1xuICAgICAgICAgICAgdGhpcy5tb3ZlWCA9IHdpbmRvdy5pbm5lcldpZHRoICsgODsgXG4gICAgICAgICAgICBpZiAodGhpcy5pc0ZpcnN0KXtcbiAgICAgICAgICAgICAgICB0aGlzLm1vdmVYID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnQgPT09ICduZXh0Jyl7XG4gICAgICAgICAgICB0aGlzLm1vdmVYID0gLXdpbmRvdy5pbm5lcldpZHRoIC0gODtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzTGFzdCl7XG4gICAgICAgICAgICAgICAgdGhpcy5tb3ZlWCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmlzTmV4dEltYWdlTG9hZGVkID0gZmFsc2U7XG5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm1vdmVYID0gMDtcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbE1vdmVYID0gMDtcbiAgICAgICAgICAgIHRoaXMuaXNOZXh0SW1hZ2VMb2FkZWQgPSB0cnVlO1xuICAgICAgICB9LCAyMDApO1xuICAgIH1cblxuICAgIG9uU2xpZGUoZXZlblR5cGU6YW55KSB7XG4gICAgICAgIHRoaXMuZXZlbnRzLmVtaXQoZXZlblR5cGUpO1xuICAgIH1cblxuICAgIHRyYW5zZm9ybUVsZW0oZHVyYXRpb246IGFueSA9IDUwKXtcbiAgICAgICAgbGV0IG1hdHJpeFZhbCA9ICdtYXRyaXgoJysgTnVtYmVyKHRoaXMuc2NhbGUpICsnLCcrIDAgKycsJysgMCArJywnKyBOdW1iZXIodGhpcy5zY2FsZSkgKycsJysgTnVtYmVyKHRoaXMubW92ZVgpICsnLCcrIE51bWJlcih0aGlzLm1vdmVZKSArJyknO1xuICAgICAgICBcbiAgICAgICAgdGhpcy5lbGVtLnN0eWxlLnRyYW5zaXRpb24gPSAnYWxsICcrIGR1cmF0aW9uICsnbXMnO1xuICAgICAgICB0aGlzLmVsZW0uc3R5bGUudHJhbnNmb3JtID0gbWF0cml4VmFsO1xuICAgICAgICB0aGlzLmVsZW0uc3R5bGUud2Via2l0VHJhbnNmb3JtID0gbWF0cml4VmFsO1xuICAgIH1cbn0iLCJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IExpZ2h0Ym94Q29tcG9uZW50IH0gZnJvbSAnLi9saWdodGJveC5jb21wb25lbnQnO1xuaW1wb3J0IHsgTGlnaHRib3hNb2JpbGVDb21wb25lbnQgfSBmcm9tICcuL2xpZ2h0Ym94LW1vYmlsZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgR2FsbGVyeUNvbXBvbmVudCB9IGZyb20gJy4vZ2FsbGVyeS5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ3J5c3RhbExpZ2h0Ym94IH0gZnJvbScuL2RvbS5zZXJ2aWNlJyBcbmltcG9ydCB7IE1hc29ucnlMYXlvdXRDb21wb25lbnQgfSBmcm9tICcuL21hc29ucnktbGF5b3V0LmNvbXBvbmVudCc7IFxuaW1wb3J0IHsgUGluY2hEaXJlY3RpdmUgfSBmcm9tICcuL3BpbmNoLmRpcmVjdGl2ZSc7IFxuXG5ATmdNb2R1bGUoe1xuICAgIGRlY2xhcmF0aW9uczogW1xuICAgICAgICBMaWdodGJveENvbXBvbmVudCxcbiAgICAgICAgTGlnaHRib3hNb2JpbGVDb21wb25lbnQsXG4gICAgICAgIEdhbGxlcnlDb21wb25lbnQsXG4gICAgICAgIE1hc29ucnlMYXlvdXRDb21wb25lbnQsXG4gICAgICAgIFBpbmNoRGlyZWN0aXZlXG4gICAgXSxcbiAgICBpbXBvcnRzOiBbXG4gICAgICAgIENvbW1vbk1vZHVsZVxuICAgIF0sXG4gICAgZXhwb3J0czogW1xuICAgICAgICBHYWxsZXJ5Q29tcG9uZW50XG4gICAgXSxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgQ3J5c3RhbExpZ2h0Ym94XG4gICAgXSxcbiAgICBib290c3RyYXA6IFtcbiAgICAgICAgXG4gICAgXSxcbiAgICBlbnRyeUNvbXBvbmVudHM6IFtcbiAgICAgICAgTGlnaHRib3hDb21wb25lbnQsXG4gICAgICAgIExpZ2h0Ym94TW9iaWxlQ29tcG9uZW50XG4gICAgXVxufSlcbmV4cG9ydCBjbGFzcyBDcnlzdGFsR2FsbGVyeU1vZHVsZSB7IH1cbiJdLCJuYW1lcyI6WyJkZWZhdWx0Q29uZmlnIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7SUE2SUksMkJBQW9CLFVBQXNCLEVBQVUsR0FBc0I7UUFBdEQsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUFVLFFBQUcsR0FBSCxHQUFHLENBQW1CO2lDQTNGOUMsQ0FBQzs2QkFDTCxFQUFFO2lDQUNFLEVBQUU7cUJBSXRCLElBQUksWUFBWSxFQUFFOzRCQUU0QixLQUFLOzRCQUNJLEtBQUs7S0FtRm5FO0lBM0VELHNCQUFJLHFDQUFNOzs7O1FBQVY7WUFDSSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1NBQzNCOzs7T0FBQTtJQUVELHNCQUFJLHFDQUFNOzs7O1FBQVY7WUFDSSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1NBQzNCOzs7T0FBQTtJQUVELHNCQUFJLG9DQUFLOzs7O1FBQVQ7WUFDSSxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztTQUNqQzs7O09BQUE7SUFFRCxzQkFBSSw0Q0FBYTs7OztRQUFqQjs7WUFDSSxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUVwQyxJQUFJLENBQUMsS0FBSyxFQUFDO2dCQUNQLE9BQU8sS0FBSyxDQUFDO2FBQ2hCO1lBRUQsSUFBSSxLQUFLLENBQUMsSUFBSSxFQUFDO2dCQUNYLEtB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