UNPKG

ngx-crystal-gallery

Version:

Responsive gallery with support for masonry layout and lightbox.

316 lines (311 loc) 40 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import { Component, Input, EventEmitter, HostBinding, HostListener, ViewChild, ElementRef, ChangeDetectorRef } from '@angular/core'; export class LightboxComponent { /** * @param {?} elementRef * @param {?} ref */ constructor(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; } /** * @return {?} */ get images() { return this.data.images; } /** * @return {?} */ get config() { return this.data.config; } /** * @return {?} */ get index() { return this.currentImageIndex; } /** * @return {?} */ get currImagePath() { /** @type {?} */ let image = this.images[this.index]; if (!image) { return false; } if (image.path) { image.full = image.path; } return image; } /** * @return {?} */ get prevImagePath() { return this.images[this.prevIndex]; } /** * @param {?} value * @return {?} */ set prevImagePath(value) { this.images[this.prevIndex] = value; } /** * @return {?} */ get isFirst() { return this.index === 0; } /** * @return {?} */ get isLast() { return this.index === (this.images.length - 1); } /** * @return {?} */ get latestImageIndex() { return this.images.length - 1; } /** * @return {?} */ get description() { return this.images[this.index].description; } /** * @return {?} */ get counter() { return this.currentImageIndex + 1 + '/' + this.images.length; } /** * @param {?} event * @return {?} */ onKeyDown(event) { switch (event.key) { case 'ArrowLeft': this.prev(); break; case 'ArrowRight': this.next(); break; case 'Escape': this.closeLightbox(); break; } } /** * @param {?} event * @return {?} */ onMouseEnter(event) { this.hideControls = false; } /** * @return {?} */ ngOnInit() { this.setBackgroundOpacity(this.config.backgroundOpacity); this.currentImageIndex = this.config.index; //document.body.style.overflow = 'hidden'; setTimeout(() => { this.showLightbox = true; }, 30); this.setMaxDimensions(); this.setAnimationDuration(); } /** * @return {?} */ closeLightbox() { this.showLightbox = false; setTimeout(() => { this.close.emit('close'); //document.body.style.overflow = ''; }, this.config.animationDuration); } /** * @return {?} */ next() { if (this.isLast) { if (this.config.loop) { this.currentImageIndex = 0; } else { return; } } else { this.currentImageIndex++; } this.currImageLoaded = 'loading'; setTimeout(() => { if (this.currImageLoaded === 'loading') { this.currImageLoaded = false; } }, 50); this.setMaxDimensions(); } /** * @return {?} */ prev() { if (this.isFirst) { if (this.config.loop) { this.currentImageIndex = this.latestImageIndex; } else { return; } } else { this.currentImageIndex--; } setTimeout(() => { if (this.currImageLoaded === 'loading') { this.currImageLoaded = false; } }, 50); this.setMaxDimensions(); } /** * @return {?} */ onImageLoaded() { this.currImageLoaded = true; this.ref.detectChanges(); } /** * @param {?} opacity * @return {?} */ setBackgroundOpacity(opacity) { this.hostStyleBackgroundColor = 'rgba(0, 0, 0, ' + opacity + ')'; } /** * @return {?} */ setMaxDimensions() { 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 {?} */ setAnimationDuration() { 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> <div class="cg-description" *ngIf="description">{{description}}</div> <div class="cg-close" (click)="closeLightbox()">Close</div> <div class="cg-spinner" *ngIf="!currImageLoaded"></div> <div class="cg-wrapper" #wrapper> <img class="cg-curr-image" #currImageElem [src]="currImagePath?.full" [class.cg-show]="currImageLoaded" (load)="onImageLoaded()" /> </div> <div class="cg-prev" [hidden]="isFirst && !config.loop" (click)="prev()"></div> <div class="cg-next" [hidden]="isLast && !config.loop" (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 = () => [ { 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'],] }] }; if (false) { /** @type {?} */ LightboxComponent.prototype._index; /** @type {?} */ LightboxComponent.prototype.prevIndex; /** @type {?} */ LightboxComponent.prototype.currImageLoaded; /** @type {?} */ LightboxComponent.prototype.prevImageHide; /** @type {?} */ LightboxComponent.prototype.wrapperProp; /** @type {?} */ LightboxComponent.prototype._data; /** @type {?} */ LightboxComponent.prototype.currentImageIndex; /** @type {?} */ LightboxComponent.prototype.spinnerHeight; /** @type {?} */ LightboxComponent.prototype.descriptionHeight; /** @type {?} */ LightboxComponent.prototype.data; /** @type {?} */ LightboxComponent.prototype.close; /** @type {?} */ LightboxComponent.prototype.showLightbox; /** @type {?} */ LightboxComponent.prototype.hideControls; /** @type {?} */ LightboxComponent.prototype.hostStyleTransition; /** @type {?} */ LightboxComponent.prototype.hostStyleBackgroundColor; /** @type {?} */ LightboxComponent.prototype.currImageElem; /** @type {?} */ LightboxComponent.prototype.prevImageElem; /** @type {?} */ LightboxComponent.prototype.wrapperElem; /** @type {?} */ LightboxComponent.prototype.elementRef; /** @type {?} */ LightboxComponent.prototype.ref; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlnaHRib3guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LWNyeXN0YWwtZ2FsbGVyeS8iLCJzb3VyY2VzIjpbImxpYi9saWdodGJveC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFDSCxTQUFTLEVBQ1QsS0FBSyxFQUNMLFlBQVksRUFFWixXQUFXLEVBQ1gsWUFBWSxFQUNaLFNBQVMsRUFDVCxVQUFVLEVBQ1YsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFrQzdDLE1BQU07Ozs7O0lBa0dGLFlBQW9CLFVBQXNCLEVBQVUsR0FBc0I7UUFBdEQsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUFVLFFBQUcsR0FBSCxHQUFHLENBQW1CO2lDQTNGOUMsQ0FBQzs2QkFDTCxFQUFFO2lDQUNFLEVBQUU7cUJBSXRCLElBQUksWUFBWSxFQUFFOzRCQUU0QixLQUFLOzRCQUNJLEtBQUs7S0FtRm5FOzs7O0lBM0VELElBQUksTUFBTTtRQUNOLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztLQUMzQjs7OztJQUVELElBQUksTUFBTTtRQUNOLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztLQUMzQjs7OztJQUVELElBQUksS0FBSztRQUNMLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUM7S0FDakM7Ozs7SUFFRCxJQUFJLGFBQWE7O1FBQ2IsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFcEMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQSxDQUFDO1lBQ1IsTUFBTSxDQUFDLEtBQUssQ0FBQztTQUNoQjtRQUVELEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQSxDQUFDO1lBQ1osS0FBSyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxD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QUFFLENBQUMsUUFBUSxDQUFDOzJCQWV6QyxZQUFZLFNBQUMsWUFBWSxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgXG4gICAgQ29tcG9uZW50LCBcbiAgICBJbnB1dCwgXG4gICAgRXZlbnRFbWl0dGVyLCBcbiAgICBPbkluaXQsIFxuICAgIEhvc3RCaW5kaW5nLCBcbiAgICBIb3N0TGlzdGVuZXIsIFxuICAgIFZpZXdDaGlsZCwgXG4gICAgRWxlbWVudFJlZiwgXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdjcnlzdGFsLWxpZ2h0Ym94JyxcbiAgICB0ZW1wbGF0ZTogYDxkaXYgY2xhc3M9XCJjZy1jb3VudGVyXCIgKm5nSWY9XCJjb25maWcuY291bnRlciAmJiBpbWFnZXMubGVuZ3RoID4gMVwiPnt7Y291bnRlcn19PC9kaXY+XG48ZGl2IGNsYXNzPVwiY2ctZGVzY3JpcHRpb25cIiAqbmdJZj1cImRlc2NyaXB0aW9uXCI+e3tkZXNjcmlwdGlvbn19PC9kaXY+XG5cbjxkaXYgXG5cdGNsYXNzPVwiY2ctY2xvc2VcIiBcblx0KGNsaWNrKT1cImNsb3NlTGlnaHRib3goKVwiPkNsb3NlPC9kaXY+XG5cbjxkaXYgXG5cdGNsYXNzPVwiY2ctc3Bpbm5lclwiIFxuXHQgKm5nSWY9XCIhY3VyckltYWdlTG9hZGVkXCI+PC9kaXY+XG5cbjxkaXYgY2xhc3M9XCJjZy13cmFwcGVyXCIgI3dyYXBwZXI+XG5cdDxpbWcgXG5cdFx0Y2xhc3M9XCJjZy1jdXJyLWltYWdlXCIgXG5cdFx0I2N1cnJJbWFnZUVsZW0gXG5cdFx0W3NyY109XCJjdXJySW1hZ2VQYXRoPy5mdWxsXCIgXG5cdFx0W2NsYXNzLmNnLXNob3ddPVwiY3VyckltYWdlTG9hZGVkXCIgXG5cdFx0KGxvYWQpPVwib25JbWFnZUxvYWRlZCgpXCIgLz5cbjwvZGl2PlxuXG48ZGl2IFxuXHRjbGFzcz1cImNnLXByZXZcIiBcblx0W2hpZGRlbl09XCJpc0ZpcnN0ICYmICFjb25maWcubG9vcFwiIFxuXHQoY2xpY2spPVwicHJldigpXCI+PC9kaXY+XG48ZGl2IFxuXHRjbGFzcz1cImNnLW5leHRcIiBcblx0W2hpZGRlbl09XCJpc0xhc3QgJiYgIWNvbmZpZy5sb29wXCIgXG5cdChjbGljayk9XCJuZXh0KClcIj48L2Rpdj5gLFxuICAgIHN0eWxlczogW2AuX2NnLXNwaW5uZXIsLl9jZy1zcGlubmVyOmFmdGVye2JvcmRlci1yYWRpdXM6NTAlO3dpZHRoOjM2cHg7aGVpZ2h0OjM2cHh9Ll9jZy1zcGlubmVye21hcmdpbjowIGF1dG87Zm9udC1zaXplOjEwcHg7cG9zaXRpb246cmVsYXRpdmU7dGV4dC1pbmRlbnQ6LTk5OTllbTtib3JkZXItdG9wOjRweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LC4yKTtib3JkZXItcmlnaHQ6NHB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsLjIpO2JvcmRlci1ib3R0b206NHB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsLjIpO2JvcmRlci1sZWZ0OjRweCBzb2xpZCAjZmZmOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVooMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCk7LXdlYmtpdC1hbmltYXRpb246LjlzIGxpbmVhciBpbmZpbml0ZSBsb2FkODthbmltYXRpb246LjlzIGxpbmVhciBpbmZpbml0ZSBsb2FkOH1ALXdlYmtpdC1rZXlmcmFtZXMgbG9hZDh7MCV7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDApO3RyYW5zZm9ybTpyb3RhdGUoMCl9MTAwJXstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoMzYwZGVnKTt0cmFuc2Zvcm06cm90YXRlKDM2MGRlZyl9fUBrZXlmcmFtZXMgbG9hZDh7MCV7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDApO3RyYW5zZm9ybTpyb3RhdGUoMCl9MTAwJXstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoMzYwZGVnKTt0cmFuc2Zvcm06cm90YXRlKDM2MGRlZyl9fS5jZy1zcGlubmVyLC5jZy1zcGlubmVyOmFmdGVyLC5jZy1zcGlubmVyOmJlZm9yZXtib3JkZXItcmFkaXVzOjUwJTt3aWR0aDoxMHB4O2hlaWdodDoxMHB4Oy13ZWJraXQtYW5pbWF0aW9uOjEuNXMgZWFzZS1pbi1vdXQgaW5maW5pdGUgbG9hZDc7YW5pbWF0aW9uOjEuNXMgZWFzZS1pbi1vdXQgaW5maW5pdGUgbG9hZDd9LmNnLXNwaW5uZXJ7Y29sb3I6I2ZmZjtmb250LXNpemU6MTBweDttYXJnaW46MCBhdXRvIDIwcHg7cG9zaXRpb246cmVsYXRpdmU7dGV4dC1pbmRlbnQ6LTk5OTllbTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVaKDApO3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApOy13ZWJraXQtYW5pbWF0aW9uLWRlbGF5Oi0uMTZzO2FuaW1hdGlvbi1kZWxheTotLjE2c30uY2ctc3Bpbm5lcjphZnRlciwuY2ctc3Bpbm5lcjpiZWZvcmV7Y29udGVudDpcIlwiO3Bvc2l0aW9uOmFic29sdXRlO3RvcDowfS5jZy1zcGlubmVyOmJlZm9yZXtsZWZ0Oi0zZW07LXdlYmtpdC1hbmltYXRpb24tZGVsYXk6LS4zMnM7YW5pbWF0aW9uLWRlbGF5Oi0uMzJzfS5jZy1zcGlubmVyOmFmdGVye2xlZnQ6M2VtfUAtd2Via2l0LWtleWZyYW1lcyBsb2FkN3swJSwxMDAlLDgwJXtib3gtc2hhZG93OjAgMi41ZW0gMCAtMS4zZW19NDAle2JveC1zaGFkb3c6MCAyLjVlbSAwIDB9fUBrZXlmcmFtZXMgbG9hZDd7MCUsMTAwJSw4MCV7Ym94LXNoYWRvdzowIDEwcHggMCAtMS4zZW19NDAle2JveC1zaGFkb3c6MCAxMHB4IDAgMH19Omhvc3QoLmNnLXNob3cpe29wYWNpdHk6MX06aG9zdCguY2ctaGlkZS1jb250cm9scykgLmNnLWNsb3NlLDpob3N0KC5jZy1oaWRlLWNvbnRyb2xzKSAuY2ctbmV4dCw6aG9zdCguY2ctaGlkZS1jb250cm9scykgLmNnLXByZXZ7b3BhY2l0eTowfTpob3N0e29wYWNpdHk6MDtwb3NpdGlvbjpmaXhlZDt0b3A6MDtsZWZ0OjA7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtjb2xvcjojZmZmOy13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTt0cmFuc2l0aW9uOm9wYWNpdHkgLjFzIGN1YmljLWJlemllciguNjQ1LC4wNDUsLjM1NSwxKTt6LWluZGV4OjEwMDAwO2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuODUpfTpob3N0IGltZ3tvcGFjaXR5OjE7bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlO2JveC1zaGFkb3c6MCA0cHggMTVweCAycHggcmdiYSgwLDAsMCwuMzUpfTpob3N0IGltZy5jZy1jdXJyLWltYWdlLmNnLXNob3d7b3BhY2l0eToxfTpob3N0IGltZy5jZy1jdXJyLWltYWdle29wYWNpdHk6MDt6LWluZGV4OjEwfTpob3N0IC5jZy13cmFwcGVyLmNnLWhpZGV7ZGlzcGxheTpub25lfTpob3N0IC5jZy13cmFwcGVye2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lOy1tcy11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmU7dG9wOjA7bGVmdDowO3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCV9Omhvc3QgLmNnLXNwaW5uZXJ7cG9zaXRpb246YWJzb2x1dGU7dG9wOjUwJTtsZWZ0OjUwJTttYXJnaW4tdG9wOi0xNXB4O21hcmdpbi1sZWZ0Oi01cHh9Omhvc3QgLmNnLWNvdW50ZXJ7dGV4dC1hbGlnbjpsZWZ0O3Bvc2l0aW9uOmFic29sdXRlO2xlZnQ6MjJweDt0b3A6MTNweDtmb250LXNpemU6MTRweDt0ZXh0LXNoYWRvdzowIDAgMXB4IHJnYmEoMCwwLDAsLjY1KTt6LWluZGV4OjMwfTpob3N0IC5jZy1kZXNjcmlwdGlvbnt0ZXh0LWFsaWduOmNlbnRlcjttYXgtd2lkdGg6Y2FsYygxMDAlIC0gMjAwcHgpO21hcmdpbjowIGF1dG87Zm9udC1zaXplOjE0cHg7bGluZS1oZWlnaHQ6NDNweDtwb3NpdGlvbjpyZWxhdGl2ZTt6LWluZGV4OjUwfTpob3N0IC5jZy1jbG9zZXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtyaWdodDowO3BhZGRpbmc6MTNweCAyMnB4O2ZvbnQtc2l6ZToxM3B4O3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTtjdXJzb3I6cG9pbnRlcjtvcGFjaXR5Oi41O3otaW5kZXg6MzA7dHJhbnNpdGlvbjpvcGFjaXR5IC4xcyBlYXNlLWluLW91dDt0ZXh0LXNoYWRvdzowIDAgMXB4IHJnYmEoMCwwLDAsLjY1KX06aG9zdCAuY2ctY2xvc2U6aG92ZXJ7b3BhY2l0eToxfTpob3N0IC5jZy1uZXh0LDpob3N0IC5jZy1wcmV2e3dpZHRoOjQwJTtoZWlnaHQ6MTAwJTtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtjdXJzb3I6cG9pbnRlcjtvcGFjaXR5Oi41O3otaW5kZXg6MjA7dHJhbnNpdGlvbjpvcGFjaXR5IC4xcyBlYXNlLWluLW91dDstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwwKX06aG9zdCAuY2ctbmV4dDpob3Zlciw6aG9zdCAuY2ctcHJldjpob3ZlcntvcGFjaXR5OjF9Omhvc3QgLmNnLXByZXZ7bGVmdDowO2JhY2tncm91bmQ6dXJsKGRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQllBQUFBaUNBWUFBQUJiWHltQUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeVpwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UY2dLRmRwYm1SdmQzTXBJaUI0YlhCTlRUcEpibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPak16TVRaQ1F6RkVSRGd6TVRFeFJUYzVRVVl4UVRVeFJESTVNa001T0RaQ0lpQjRiWEJOVFRwRWIyTjFiV1Z1ZEVsRVBTSjRiWEF1Wkdsa09qTXpNVFpDUXpGRlJEZ3pNVEV4UlRjNVFVWXhRVFV4UkRJNU1rTTVPRFpDSWo0Z1BIaHRjRTFOT2tSbGNtbDJaV1JHY205dElITjBVbVZtT21sdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk16TXhOa0pETVVKRU9ETXhNVEZGTnpsQlJqRkJOVEZFTWpreVF6azROa0lpSUhOMFVtVm1PbVJ2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2TXpNeE5rSkRNVU5FT0RNeE1URkZOemxCUmpGQk5URkVNamt5UXprNE5rSWlMejRnUEM5eVpHWTZSR1Z6WTNKcGNIUnBiMjQrSUR3dmNtUm1PbEpFUmo0Z1BDOTRPbmh0Y0cxbGRHRStJRHcvZUhCaFkydGxkQ0JsYm1ROUluSWlQejdWcndaS0FBQUNsRWxFUVZSNDJxeldTWThTUVJnR1lMb1ZIUGVUWGx3Q2lJd01BckpHdGlBQk5lcDRJR1ppNG9FZk1Kb29MamVQcm5GR2Y1eUpTMGhZbXEyYi9hQnhpUTYrbFJSSmRhVVpxNXZwNUUyVExuaW9WRmQ5VlpMTitpVXhJZGVNaVcyZlJWQ212ejJEcEpCVkNrNlg2U1ZCSFFSTHBWS2I3WGI3ODJnMFVzcmw4ak04VzBQMjArOVlRbjNKWlBJaHdONk1Yb1BCb0kzbkc4aUtHWmhGMTRBK0Fxck9tS3RXcTMxRjIxM2trT2dRNjlCME9sMEJxckZvdDl2Vi9INy9jN1JmRW9WWjFHK0VkanFkdnRmcmZZbjJLOGdKa2FIUW9kbHN0akllai9zc2loZEgwRGRvdjRhY1FvN1FseWNKbzVQSmhFYzFqOGZ6bXFKazJoMUQ3THYxbGtVdjVuSzV4enphYXJXTVVJY3dtcy9uQ1RyZ1ViZmJUZENyVnRBQVFhZlRxUTVWRkVWZENpMFVDay9RMHlHTE5wdE4xZWwwdnFMb2FSSFV4cVBvS1kvMktGbzBnMHIwYmE0V2k4V25RRWNzMm1nMFZBUFVMckpzWlRxcE56RFo2eXhhcjlkVmw4dEZWdFIxMFNuRm9oSmRnblpZdWg5SWtqU1RaZmtuUG41RHZpTy9rTC9JamtndElPaGhKSjdKWkY1Z2RVMjRoZERHNnFxZy9RSnl3RXpsbWcvRlNUTGhFNG5FOW5BNG5ISkZSdkg1Zkp0bzk0Z09CZnZ5anRKeFhJL0g0eCtBNjNyZTYvVVVWRENDbnplRHo2ZmJjZVFzY2pzV2k3MDN3RnNNN2hEQkpRTjhQUnFOYm1ObjBPR2FwdTBKZm92aVl4NFBCQUwzMGU1ZENnK0h3MFo0ZTgvd2ZyL1A0NTFRS1BSZ2FSeklGakRka3NlZnNiamRLbjV6RVI2SlJNaXd1UCszTmUyS0I0UEJMVlZWUjF4ZCtZSzJPMmJPRll2d2Q4Q0hiSy94L0o2WmM4VWkvQVpteGR0cXRkckF3bEZMcFJMWnJTL1BZY25rRVV1aVk3aENTK2c1c292VDU1K1FqN1FTL2pZRDh6anAvVUY2dDlHUytvUGVkOHpDTEM1ekowdFNvLy9RKzh3S0xIVHcvaWZBQU1RVlM0dkhaUjJWQUFBQUFFbEZUa1N1UW1DQykgY2VudGVyIGxlZnQgMjJweCBuby1yZXBlYXR9Omhvc3QgLmNnLW5leHR7cmlnaHQ6MDtiYWNrZ3JvdW5kOnVybChkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJZQUFBQWlDQVlBQUFCYlh5bUFBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlacFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGNnS0ZkcGJtUnZkM01wSWlCNGJYQk5UVHBKYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT2pFeU5ERTNNREUxUkRnek1URXhSVGM1TmpNNFFUSXpRekkyUmpjMlFqZzJJaUI0YlhCTlRUcEViMk4xYldWdWRFbEVQU0o0YlhBdVpHbGtPakV5TkRFM01ERTJSRGd6TVRFeFJUYzVOak00UVRJelF6STJSamMyUWpnMklqNGdQSGh0Y0UxTk9rUmxjbWwyWldSR2NtOXRJSE4wVW1WbU9tbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZNVEkwTVRjd01UTkVPRE14TVRGRk56azJNemhCTWpORE1qWkdOelpDT0RZaUlITjBVbVZtT21SdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk1USTBNVGN3TVRSRU9ETXhNVEZGTnprMk16aEJNak5ETWpaR056WkNPRFlpTHo0Z1BDOXlaR1k2UkdWelkzSnBjSFJwYjI0K0lEd3ZjbVJtT2xKRVJqNGdQQzk0T25odGNHMWxkR0UrSUR3L2VIQmhZMnRsZENCbGJtUTlJbklpUHo3enY1QktBQUFDbDBsRVFWUjQyclRXMjI0U1FSd0djSFpiOEZUMVNtODhCSkNpRkFFNUpweUNCTlJFOGNvWUV5OTRBR3FpOVhEWFMwK0pWaC9DQi9FaGlGRVQ1TGpBY2xnV2phYTFhYXpmSkRNNnU2THVManJKbDIxMjRjZDBkdVkvSTloK05vRUxhYnRjVExjRkNvbjBidytTUkU0aDI4aG4yeHlOb0l2SVNybGNmcUFvU2x1U3BMZXBWS3FDZTZjUkIvMk1ZQVhlaTF3ZmpVYlNMbTM0Z1g0eW1ieU4rejZyT0JtQy9jaU5lcjMrZnBkcndHWGdkOGgvWXdWbjhEbS8zNy9lNi9VR09ueVFUcWZYck9Cc0tJNGc1NzFlNzZOdXR6djhEZTQzZ3d2MDVTMGh4NUNMd0ovaUJXcnd5V1F5ekdhenBuSHlJVHR5Q0RsQmNJL0g4d1M0WmxoVVZiV01PL1I0cDlQNUJjL2xjbmZ4L093OCtBVzMyejBMSCtYeitYK0R0OXR0bWNlbjB5bkRBMWJ4NHdSM09wMlBXNjJXck92NXVGQW8zSnNYTDFLOHIrdjVMTnhtWnJiOHdKdk5wbjVZbEdLeGVKL1dGcnVaQmNSUHhVc3VsMnU5MFdob2NDeXFCcWszZExHSml3YmdiL1Q2RmZsQ1Nxa29pbHVDSUdqcU5HeldnUVV6OVlSOGFROXlCcXR5RFF0SDBxMUtOWlBKUE1Uek9IS0E0b2FId3VQeitTb29VbTBlSFkvSDAwUWlzVUVXRkhLVURZVlJkQm1WcjlMdjkvV29Hby9IWCtKNWlZNy9RU012ajAwM2huYjBhQ3dXZTRIblY1R1R5R0VqMDAyRERnWUREWXFkUm8xR294dTBwM3BVK0J2cURRUUNxelBRQ1VXdnpJTktlalFjRGx0SFE2SFFMYUJkSGgwT2g1WlJPME9CYUZEOGlJTDd6ODJpYkd0eVJ5S1IxVCtnbDgyZy9HWjZEZXYvSFkvS3Nxd0VnMEZMS0wvOTMrUjdDM1FNOU5rOEtEdGlPV3ExMmpiMnMyWFMwMUtwOUtwYXJiN0cvVGZJUjJRVDJURjZVQlM0MmJCRWkvVUsvU0lCUHlDZmtDMHpLQSt6NnJXUFhtMzB0TGxKcjZaUS9abVlEWW5JMWVFZGVqVjlUaGIrMThIN3V3QURBT0cvV2NtNHgra25BQUFBQUVsRlRrU3VRbUNDKSBjZW50ZXIgcmlnaHQgMjJweCBuby1yZXBlYXR9YF1cbn0pXG5leHBvcnQgY2xhc3MgTGlnaHRib3hDb21wb25lbnQge1xuICAgIF9pbmRleDogYW55O1xuICAgIHByZXZJbmRleDogYW55O1xuICAgIGN1cnJJbWFnZUxvYWRlZDogYW55OyBcbiAgICBwcmV2SW1hZ2VIaWRlOiBhbnk7XG4gICAgd3JhcHBlclByb3A6IGFueTtcbiAgICBfZGF0YTogYW55O1xuICAgIGN1cnJlbnRJbWFnZUluZGV4OiBudW1iZXIgPSAwO1xuICAgIHNwaW5uZXJIZWlnaHQ6IG51bWJlciA9IDMwO1xuICAgIGRlc2NyaXB0aW9uSGVpZ2h0OiBudW1iZXIgPSA0MztcblxuICAgIEBJbnB1dCgpIGRhdGE6IGFueTtcblxuICAgIGNsb3NlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5jZy1zaG93Jykgc2hvd0xpZ2h0Ym94OiBib29sZWFuID0gZmFsc2U7XG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5jZy1oaWRlLWNvbnRyb2xzJykgaGlkZUNvbnRyb2xzOiBib29sZWFuID0gZmFsc2U7XG4gICAgQEhvc3RCaW5kaW5nKCdzdHlsZS50cmFuc2l0aW9uJykgaG9zdFN0eWxlVHJhbnNpdGlvbjogc3RyaW5nO1xuICAgIEBIb3N0QmluZGluZygnc3R5bGUuYmFja2dyb3VuZENvbG9yJykgaG9zdFN0eWxlQmFja2dyb3VuZENvbG9yOiBzdHJpbmc7XG5cbiAgICBAVmlld0NoaWxkKCdjdXJySW1hZ2VFbGVtJykgY3VyckltYWdlRWxlbTogRWxlbWVudFJlZjtcbiAgICBAVmlld0NoaWxkKCdwcmV2SW1hZ2VFbGVtJykgcHJldkltYWdlRWxlbTogRWxlbWVudFJlZjtcbiAgICBAVmlld0NoaWxkKCd3cmFwcGVyJykgd3JhcHBlckVsZW06IEVsZW1lbnRSZWY7XG5cbiAgICBnZXQgaW1hZ2VzKCl7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEuaW1hZ2VzO1xuICAgIH1cblxuICAgIGdldCBjb25maWcoKXtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5jb25maWc7XG4gICAgfVxuXG4gICAgZ2V0IGluZGV4KCl7XG4gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRJbWFnZUluZGV4O1xuICAgIH1cblxuICAgIGdldCBjdXJySW1hZ2VQYXRoKCl7XG4gICAgICAgIGxldCBpbWFnZSA9IHRoaXMuaW1hZ2VzW3RoaXMuaW5kZXhdO1xuXG4gICAgICAgIGlmICghaW1hZ2Upe1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGltYWdlLnBhdGgpe1xuICAgICAgICAgICAgaW1hZ2UuZnVsbCA9IGltYWdlLnBhdGg7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaW1hZ2U7XG4gICAgfVxuXG4gICAgZ2V0IHByZXZJbWFnZVBhdGgoKXtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW1hZ2VzW3RoaXMucHJldkluZGV4XTtcbiAgICB9XG5cbiAgICBzZXQgcHJldkltYWdlUGF0aCh2YWx1ZTogYW55KXtcbiAgICAgICAgdGhpcy5pbWFnZXNbdGhpcy5wcmV2SW5kZXhdID0gdmFsdWU7XG4gICAgfVxuXG4gICAgZ2V0IGlzRmlyc3QoKXtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5kZXggPT09IDA7XG4gICAgfVxuXG4gICAgZ2V0IGlzTGFzdCgpe1xuICAgICAgICByZXR1cm4gdGhpcy5pbmRleCA9PT0gKHRoaXMuaW1hZ2VzLmxlbmd0aC0xKTtcbiAgICB9XG5cbiAgICBnZXQgbGF0ZXN0SW1hZ2VJbmRleCgpe1xuICAgICAgICByZXR1cm4gdGhpcy5pbWFnZXMubGVuZ3RoIC0gMTtcbiAgICB9XG5cbiAgICBnZXQgZGVzY3JpcHRpb24oKXtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW1hZ2VzW3RoaXMuaW5kZXhdLmRlc2NyaXB0aW9uO1xuICAgIH1cblxuICAgIGdldCBjb3VudGVyKCl7XG4gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRJbWFnZUluZGV4ICsgMSArJy8nKyB0aGlzLmltYWdlcy5sZW5ndGg7XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcignd2luZG93OmtleWRvd24nLCBbJyRldmVudCddKVxuICAgIG9uS2V5RG93bihldmVudDogYW55KSB7XG4gICAgICAgIHN3aXRjaChldmVudC5rZXkpIHtcbiAgICAgICAgICAgIGNhc2UgJ0Fycm93TGVmdCc6XG4gICAgICAgICAgICAgICAgdGhpcy5wcmV2KCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdBcnJvd1JpZ2h0JzpcbiAgICAgICAgICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0VzY2FwZSc6XG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZUxpZ2h0Ym94KCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKFwibW91c2VlbnRlclwiLCBbJyRldmVudCddKVxuICAgIG9uTW91c2VFbnRlcihldmVudDogYW55KSB7XG4gICAgICAgIHRoaXMuaGlkZUNvbnRyb2xzID0gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLCBwcml2YXRlIHJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYpe1xuICAgIH1cblxuICAgIG5nT25Jbml0KCl7XG4gICAgICAgIHRoaXMuc2V0QmFja2dyb3VuZE9wYWNpdHkodGhpcy5jb25maWcuYmFja2dyb3VuZE9wYWNpdHkpO1xuICAgICAgICB0aGlzLmN1cnJlbnRJbWFnZUluZGV4ID0gdGhpcy5jb25maWcuaW5kZXg7XG4gICAgICAgIC8vZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zaG93TGlnaHRib3ggPSB0cnVlO1xuICAgICAgICB9LCAzMCk7XG5cbiAgICAgICAgdGhpcy5zZXRNYXhEaW1lbnNpb25zKCk7XG4gICAgICAgIHRoaXMuc2V0QW5pbWF0aW9uRHVyYXRpb24oKTtcbiAgICB9XG5cbiAgICBjbG9zZUxpZ2h0Ym94KCl7XG4gICAgICAgIHRoaXMuc2hvd0xpZ2h0Ym94ID0gZmFsc2U7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICB0aGlzLmNsb3NlLmVtaXQoJ2Nsb3NlJyk7XG4gICAgICAgICAgIC8vZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICcnO1xuICAgICAgICB9LCB0aGlzLmNvbmZpZy5hbmltYXRpb25EdXJhdGlvbik7IFxuICAgIH1cblxuICAgIG5leHQoKXtcbiAgICAgICAgaWYgKHRoaXMuaXNMYXN0KXtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbmZpZy5sb29wKXtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRJbWFnZUluZGV4ID0gMDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50SW1hZ2VJbmRleCsrO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY3VyckltYWdlTG9hZGVkID0gJ2xvYWRpbmcnO1xuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuY3VyckltYWdlTG9hZGVkID09PSAnbG9hZGluZycpe1xuICAgICAgICAgICAgICAgIHRoaXMuY3VyckltYWdlTG9hZGVkID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIDUwKTtcblxuICAgICAgICB0aGlzLnNldE1heERpbWVuc2lvbnMoKTtcbiAgICB9XG4gICAgcHJldigpe1xuICAgICAgICBpZiAodGhpcy5pc0ZpcnN0KXtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbmZpZy5sb29wKXtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRJbWFnZUluZGV4ID0gdGhpcy5sYXRlc3RJbWFnZUluZGV4O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRJbWFnZUluZGV4LS07XG4gICAgICAgIH1cblxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmN1cnJJbWFnZUxvYWRlZCA9PT0gJ2xvYWRpbmcnKXtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJJbWFnZUxvYWRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCA1MCk7XG5cbiAgICAgICAgdGhpcy5zZXRNYXhEaW1lbnNpb25zKCk7XG4gICAgfVxuXG4gICAgb25JbWFnZUxvYWRlZCgpe1xuICAgICAgICB0aGlzLmN1cnJJbWFnZUxvYWRlZCA9IHRydWU7XG4gICAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBzZXRCYWNrZ3JvdW5kT3BhY2l0eShvcGFjaXR5OiBhbnkpe1xuICAgICAgICB0aGlzLmhvc3RTdHlsZUJhY2tncm91bmRDb2xvciA9ICdyZ2JhKDAsIDAsIDAsICcrb3BhY2l0eSsnKSc7XG4gICAgfVxuXG4gICAgc2V0TWF4RGltZW5zaW9ucygpe1xuICAgICAgICBpZiAodGhpcy5kZXNjcmlwdGlvbil7XG4gICAgICAgICAgICB0aGlzLndyYXBwZXJFbGVtLm5hdGl2ZUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJ2NhbGMoMTAwJSAtICcgKyAodGhpcy5kZXNjcmlwdGlvbkhlaWdodCAqIDIpICsgJ3B4KSc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLndyYXBwZXJFbGVtLm5hdGl2ZUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJyc7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmN1cnJJbWFnZUVsZW0ubmF0aXZlRWxlbWVudC5zdHlsZS5tYXhIZWlnaHQgPSAnY2FsYygnICsgdGhpcy5jb25maWcubGlnaHRib3hNYXhIZWlnaHQgKyAnKSc7XG4gICAgICAgIHRoaXMuY3VyckltYWdlRWxlbS5uYXRpdmVFbGVtZW50LnN0eWxlLm1heFdpZHRoID0gdGhpcy5jb25maWcubGlnaHRib3hNYXhXaWR0aDtcbiAgICB9XG5cbiAgICBzZXRBbmltYXRpb25EdXJhdGlvbigpe1xuICAgICAgICB0aGlzLmhvc3RTdHlsZVRyYW5zaXRpb24gPSAnb3BhY2l0eSAnK3RoaXMuY29uZmlnLmFuaW1hdGlvbkR1cmF0aW9uKydtcyc7XG4gICAgfVxufSJdfQ==