@378q/ngx-photo-editor
Version:
An image cropper for Angular
251 lines • 64.9 kB
JavaScript
import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
import Cropper from "cropperjs";
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
export class NgxPhotoEditorComponent {
constructor() {
this.FILES_REGEX = /\.(gif|jpe?g|tiff|png|webp|bmp)$/i;
this.modalTitle = 'Photo Editor';
this.hideModalHeader = false;
this.aspectRatio = NaN;
this.autoCropArea = 0.8;
this.autoCrop = true;
this.mask = true;
this.guides = true;
this.centerIndicator = true;
this.viewMode = 0;
this.modalMaxWidth = '500px';
this.modalCentered = false;
this.scalable = true;
this.zoomable = true;
this.cropBoxMovable = true;
this.cropBoxResizable = true;
this.darkTheme = true;
this.roundCropper = false;
this.canvasHeight = 400;
this.imageSmoothingEnabled = true;
this.imageSmoothingQuality = 'high';
this.closeBtnText = 'Close';
this.applyBtnText = 'Apply';
this.quality = 92;
this.closeEvent = new EventEmitter();
this.imageCroppedEvent = new EventEmitter();
this.errorEvent = new EventEmitter();
this.imageLoaded = false;
this.isProcessing = false;
}
set imageQuality(value) {
if (value > 0 && value <= 100) {
this.quality = value;
}
else {
this.errorEvent.error('Invalid image quality');
}
}
set source(data) {
if (data instanceof Event) {
// @ts-ignore
const file = data.target.files[0];
if (this.FILES_REGEX.test(file.name)) {
if (!this.format) {
// @ts-ignore
this.format = data.target.files[0].type.split('/')[1];
}
const reader = new FileReader();
reader.onload = (ev) => {
this.imgUrl = ev.target.result;
};
// @ts-ignore
reader.readAsDataURL(data.target.files[0]);
}
else {
console.log('error');
this.errorEvent.emit('Not supported INPUT');
}
}
else if (data instanceof File) {
if (this.FILES_REGEX.test(data.name)) {
if (!this.format) {
this.format = data.type.split('/')[1];
}
const reader = new FileReader();
reader.onload = (ev) => {
this.imgUrl = ev.target.result;
};
reader.readAsDataURL(data);
}
else {
this.errorEvent.emit('Not supported INPUT');
}
}
else if (typeof data === 'string') {
if ((/^data:image\/([a-zA-Z]*);base64,([^\"]*)$/).test(data)) {
this.imgUrl = data;
if (!this.format) {
this.format = ((data.split(',')[0]).split(';')[0]).split(':')[1].split('/')[1];
}
}
else if (this.isValidImageURL(data)) {
this.imgUrl = data;
if (!this.format) {
// @ts-ignore
this.format = data.split(/[#?]/)[0].split('.').pop().trim();
}
}
else {
this.errorEvent.emit('Not supported URL');
}
}
else {
this.errorEvent.emit('Not supported INPUT');
}
}
isValidImageURL(str) {
return str.match(/^http[^\?]*.(jpg|jpeg|gif|png|tiff|bmp)(\?(.*))?(\#(.*))?$/gim);
}
rotateRight() {
this.cropper.rotate(45);
}
rotateLeft() {
this.cropper.rotate(-45);
}
crop() {
this.cropper.setDragMode('crop');
}
move() {
this.cropper.setDragMode('move');
}
zoomIn() {
this.cropper.zoom(0.1);
}
zoomOut() {
this.cropper.zoom(-0.1);
}
flipH() {
this.cropper.scaleX(-this.cropper.getImageData().scaleX);
}
flipV() {
this.cropper.scaleY(-this.cropper.getImageData().scaleY);
}
reset() {
this.cropper.reset();
}
export() {
this.isProcessing = true;
this.imageLoaded = false;
let cropedImage = this.cropper.getCroppedCanvas({
width: this.resizeToWidth,
height: this.resizeToHeight,
imageSmoothingEnabled: this.imageSmoothingEnabled,
imageSmoothingQuality: this.imageSmoothingQuality
});
const outputImage = cropedImage.toDataURL('image/' + this.format, this.quality);
fetch(outputImage)
.then(res => res.blob())
.then(blob => {
this.isProcessing = false;
this.imageLoaded = true;
this.imageCroppedEvent.emit({
base64: outputImage,
file: new File([blob], Date.now() + '.' + this.format, { type: 'image/' + this.format })
});
});
}
close() {
this.closeEvent.emit();
}
onLoad() {
this.image.nativeElement.addEventListener('ready', () => {
this.imageLoaded = true;
});
this.cropper = new Cropper(this.image.nativeElement, {
aspectRatio: this.aspectRatio,
autoCropArea: this.autoCropArea,
autoCrop: this.autoCrop,
modal: this.mask,
guides: this.guides,
center: this.centerIndicator,
viewMode: this.viewMode,
scalable: this.scalable,
zoomable: this.zoomable,
background: false,
cropBoxMovable: this.cropBoxMovable,
cropBoxResizable: this.cropBoxResizable,
});
}
ngOnDestroy() {
}
error() {
this.errorEvent.emit('Error loading image');
}
}
NgxPhotoEditorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: NgxPhotoEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
NgxPhotoEditorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.2", type: NgxPhotoEditorComponent, selector: "lib-ngx-photo-editor", inputs: { modalTitle: "modalTitle", hideModalHeader: "hideModalHeader", aspectRatio: "aspectRatio", autoCropArea: "autoCropArea", autoCrop: "autoCrop", mask: "mask", guides: "guides", centerIndicator: "centerIndicator", viewMode: "viewMode", modalMaxWidth: "modalMaxWidth", modalCentered: "modalCentered", scalable: "scalable", zoomable: "zoomable", cropBoxMovable: "cropBoxMovable", cropBoxResizable: "cropBoxResizable", darkTheme: "darkTheme", roundCropper: "roundCropper", canvasHeight: "canvasHeight", resizeToWidth: "resizeToWidth", resizeToHeight: "resizeToHeight", imageSmoothingEnabled: "imageSmoothingEnabled", imageSmoothingQuality: "imageSmoothingQuality", format: "format", closeBtnText: "closeBtnText", applyBtnText: "applyBtnText", imageQuality: "imageQuality", source: "source" }, outputs: { closeEvent: "closeEvent", imageCroppedEvent: "imageCroppedEvent", errorEvent: "errorEvent" }, viewQueries: [{ propertyName: "image", first: true, predicate: ["image"], descendants: true }], ngImport: i0, template: "<div class=\"ngx-pe-overlay-container\">\n <div class=\"ngx-pe-dialog-container\" [style.max-width]=\"modalMaxWidth\">\n <div class=\"ngx-pe-dialog-header\" *ngIf=\"!hideModalHeader\">\n {{modalTitle}}\n </div>\n <div class=\"ngx-pe-dialog-body\">\n <div class=\"ngx-pe-cropper-wrapper\" [class]=\"roundCropper ? 'ngx-pe-cropper-round' : ''\">\n <div class=\"ngx-pe-loading\" *ngIf=\"!imageLoaded\" [class.ngx-pe-processing]=\"isProcessing\">\n <svg xmlns=\"http://www.w3.org/2000/svg\"\n style=\"margin: auto; display: block; shape-rendering: auto; animation-play-state: running; animation-delay: 0s;\"\n viewBox=\"0 0 100 100\" preserveAspectRatio=\"xMidYMid\">\n <circle cx=\"50\" cy=\"50\" fill=\"none\" stroke=\"#f3f3f3\" stroke-width=\"10\" r=\"35\"\n stroke-dasharray=\"164.93361431346415 56.97787143782138\"\n style=\"animation-play-state: running; animation-delay: 0s;\">\n <animateTransform attributeName=\"transform\" type=\"rotate\" repeatCount=\"indefinite\" dur=\"1s\"\n values=\"0 50 50;360 50 50\" keyTimes=\"0;1\"\n style=\"animation-play-state: running; animation-delay: 0s;\"></animateTransform>\n </circle>\n </svg>\n </div>\n <img *ngIf=\"imgUrl\" class=\"ngx-pe-img\" #image loading=\"lazy\" (load)=\"onLoad()\" (error)=\"error()\" [src]=\"imgUrl\" alt=\"cropper-img\" crossorigin=\"anonymous\">\n <div class=\"ngx-pe-tool-bar\">\n <!--move-->\n <button (click)=\"move()\" title=\"Move\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 48 48\">\n <path\n d=\"M24 44 15.85 35.85 18.05 33.65 22.5 38.1V28.65H25.5V38.1L29.95 33.65L32.15 35.85ZM11.9 31.9 4 24 11.95 16.05 14.15 18.25 9.9 22.5H19.35V25.5H9.9L14.1 29.7ZM36.1 31.9 33.9 29.7 38.1 25.5H28.7V22.5H38.1L33.9 18.3L36.1 16.1L44 24ZM22.5 19.3V9.9L18.3 14.1L16.1 11.9L24 4L31.9 11.9L29.7 14.1L25.5 9.9V19.3Z\"/>\n </svg>\n </button>\n\n <!--crop-->\n <button (click)=\"crop()\" title=\"Crop\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 48 48\">\n <path\n d=\"M34.75 31.75V13.25Q34.75 13.25 34.75 13.25Q34.75 13.25 34.75 13.25H16.25V10.25H34.75Q35.95 10.25 36.85 11.15Q37.75 12.05 37.75 13.25V31.75ZM36.25 46Q35.6 46 35.175 45.575Q34.75 45.15 34.75 44.5V37.75H13.25Q12.05 37.75 11.15 36.85Q10.25 35.95 10.25 34.75V13.25H3.5Q2.85 13.25 2.425 12.825Q2 12.4 2 11.75Q2 11.1 2.425 10.675Q2.85 10.25 3.5 10.25H10.25V3.5Q10.25 2.85 10.675 2.425Q11.1 2 11.75 2Q12.4 2 12.825 2.425Q13.25 2.85 13.25 3.5V34.75Q13.25 34.75 13.25 34.75Q13.25 34.75 13.25 34.75H44.5Q45.15 34.75 45.575 35.175Q46 35.6 46 36.25Q46 36.9 45.575 37.325Q45.15 37.75 44.5 37.75H37.75V44.5Q37.75 45.15 37.325 45.575Q36.9 46 36.25 46Z\"/>\n </svg>\n </button>\n\n <!--zoom in-->\n <button (click)=\"zoomIn()\" title=\"Zoom In\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 48 48\">\n <path\n d=\"M38.7 40.85 26.65 28.8Q25.15 30.1 23.15 30.825Q21.15 31.55 18.9 31.55Q13.5 31.55 9.75 27.8Q6 24.05 6 18.75Q6 13.45 9.75 9.7Q13.5 5.95 18.85 5.95Q24.15 5.95 27.875 9.7Q31.6 13.45 31.6 18.75Q31.6 20.9 30.9 22.9Q30.2 24.9 28.8 26.65L40.95 38.7Q41.4 39.1 41.375 39.75Q41.35 40.4 40.9 40.85Q40.45 41.3 39.8 41.3Q39.15 41.3 38.7 40.85ZM18.85 28.55Q22.9 28.55 25.75 25.675Q28.6 22.8 28.6 18.75Q28.6 14.7 25.75 11.825Q22.9 8.95 18.85 8.95Q14.75 8.95 11.875 11.825Q9 14.7 9 18.75Q9 22.8 11.875 25.675Q14.75 28.55 18.85 28.55ZM18.8 24.3Q18.15 24.3 17.725 23.875Q17.3 23.45 17.3 22.8V20.2H14.65Q14.05 20.2 13.625 19.75Q13.2 19.3 13.2 18.65Q13.2 18.05 13.625 17.625Q14.05 17.2 14.7 17.2H17.3V14.6Q17.3 14 17.75 13.575Q18.2 13.15 18.85 13.15Q19.45 13.15 19.875 13.575Q20.3 14 20.3 14.65V17.2H22.9Q23.5 17.2 23.925 17.65Q24.35 18.1 24.35 18.7Q24.35 19.35 23.925 19.775Q23.5 20.2 22.85 20.2H20.3V22.85Q20.3 23.45 19.85 23.875Q19.4 24.3 18.8 24.3Z\"/>\n </svg>\n </button>\n\n <!--zoom out-->\n <button (click)=\"zoomOut()\" title=\"Zoom Out\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 48 48\">\n <path\n d=\"M38.7 40.85 26.65 28.8Q25.15 30.1 23.15 30.825Q21.15 31.55 18.9 31.55Q13.5 31.55 9.75 27.8Q6 24.05 6 18.75Q6 13.45 9.75 9.7Q13.5 5.95 18.85 5.95Q24.15 5.95 27.875 9.7Q31.6 13.45 31.6 18.75Q31.6 20.9 30.9 22.9Q30.2 24.9 28.8 26.65L40.95 38.7Q41.4 39.1 41.375 39.75Q41.35 40.4 40.9 40.85Q40.45 41.3 39.8 41.3Q39.15 41.3 38.7 40.85ZM18.85 28.55Q22.9 28.55 25.75 25.675Q28.6 22.8 28.6 18.75Q28.6 14.7 25.75 11.825Q22.9 8.95 18.85 8.95Q14.75 8.95 11.875 11.825Q9 14.7 9 18.75Q9 22.8 11.875 25.675Q14.75 28.55 18.85 28.55ZM15.2 20.2Q14.6 20.2 14.175 19.75Q13.75 19.3 13.75 18.65Q13.75 18.05 14.175 17.625Q14.6 17.2 15.25 17.2H22.35Q22.95 17.2 23.375 17.65Q23.8 18.1 23.8 18.7Q23.8 19.35 23.375 19.775Q22.95 20.2 22.3 20.2Z\"/>\n </svg>\n </button>\n\n <!--rotate left-->\n <button (click)=\"rotateLeft()\" title=\"Rotate Left\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 48 48\">\n <path\n d=\"M7.9 23.6Q7.15 23.6 6.7 23.075Q6.25 22.55 6.4 21.85Q6.75 20.3 7.325 18.85Q7.9 17.4 8.7 16.05Q9.1 15.4 9.775 15.35Q10.45 15.3 11 15.85Q11.4 16.2 11.45 16.75Q11.5 17.3 11.25 17.75Q10.55 18.9 10.075 20.075Q9.6 21.25 9.35 22.4Q9.25 22.95 8.85 23.275Q8.45 23.6 7.9 23.6ZM20.05 43.7Q18.6 43.35 17.15 42.775Q15.7 42.2 14.4 41.4Q13.75 41 13.7 40.3Q13.65 39.6 14.2 39Q14.55 38.65 15.05 38.6Q15.55 38.55 15.95 38.8Q17.1 39.5 18.225 39.975Q19.35 40.45 20.55 40.75Q21.05 40.85 21.4 41.275Q21.75 41.7 21.75 42.25Q21.75 43 21.25 43.425Q20.75 43.85 20.05 43.7ZM8.7 35.7Q7.9 34.4 7.325 32.925Q6.75 31.45 6.4 29.85Q6.25 29.15 6.675 28.625Q7.1 28.1 7.9 28.1Q8.4 28.1 8.825 28.425Q9.25 28.75 9.35 29.3Q9.6 30.55 10.05 31.725Q10.5 32.9 11.2 33.95Q11.5 34.4 11.45 34.95Q11.4 35.5 11 35.9Q10.45 36.45 9.775 36.4Q9.1 36.35 8.7 35.7ZM27.95 43.65Q27.25 43.85 26.75 43.425Q26.25 43 26.25 42.25Q26.25 41.75 26.6 41.325Q26.95 40.9 27.45 40.75Q32.5 39.4 35.75 35.375Q39 31.35 39 25.85Q39 19.5 34.675 15.175Q30.35 10.85 24 10.85H23L25.85 13.7Q26.3 14.15 26.3 14.8Q26.3 15.45 25.85 15.9Q25.4 16.35 24.75 16.35Q24.1 16.35 23.65 15.9L18.15 10.4Q17.9 10.15 17.8 9.9Q17.7 9.65 17.7 9.35Q17.7 9.05 17.8 8.8Q17.9 8.55 18.15 8.3L23.65 2.8Q24.1 2.35 24.75 2.35Q25.4 2.35 25.85 2.8Q26.3 3.25 26.3 3.9Q26.3 4.55 25.85 5L23 7.85H24Q31.55 7.85 36.775 13.075Q42 18.3 42 25.85Q42 32.4 38.075 37.275Q34.15 42.15 27.95 43.65Z\"/>\n </svg>\n </button>\n\n <!--rotate right-->\n <button (click)=\"rotateRight()\" title=\"Rotate Right\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 48 48\">\n <path\n d=\"M40.2 23.6Q39.7 23.6 39.275 23.25Q38.85 22.9 38.75 22.4Q38.5 21.2 38.025 20.05Q37.55 18.9 36.85 17.75Q36.6 17.3 36.65 16.75Q36.7 16.2 37.1 15.8Q37.65 15.25 38.35 15.325Q39.05 15.4 39.45 16.05Q40.25 17.35 40.8 18.775Q41.35 20.2 41.7 21.8Q41.85 22.5 41.4 23.05Q40.95 23.6 40.2 23.6ZM26.3 42.2Q26.3 41.7 26.65 41.275Q27 40.85 27.5 40.75Q28.65 40.5 29.8 40.025Q30.95 39.55 32.1 38.85Q32.55 38.6 33.075 38.625Q33.6 38.65 34 39.05Q34.55 39.6 34.475 40.3Q34.4 41 33.75 41.4Q32.4 42.25 30.975 42.8Q29.55 43.35 28.1 43.7Q27.4 43.85 26.85 43.4Q26.3 42.95 26.3 42.2ZM37.1 35.9Q36.75 35.55 36.7 34.975Q36.65 34.4 36.9 33.95Q37.6 32.8 38.05 31.65Q38.5 30.5 38.75 29.3Q38.85 28.8 39.25 28.45Q39.65 28.1 40.2 28.1Q40.95 28.1 41.375 28.625Q41.8 29.15 41.65 29.85Q41.25 31.45 40.7 32.9Q40.15 34.35 39.4 35.65Q39 36.3 38.325 36.375Q37.65 36.45 37.1 35.9ZM20.05 43.7Q13.9 42.3 10 37.35Q6.1 32.4 6.1 25.85Q6.1 18.3 11.325 13.075Q16.55 7.85 24.1 7.85H25.1L22.25 5Q21.8 4.55 21.8 3.9Q21.8 3.25 22.25 2.8Q22.7 2.35 23.35 2.35Q24 2.35 24.45 2.8L29.95 8.3Q30.2 8.55 30.3 8.8Q30.4 9.05 30.4 9.35Q30.4 9.65 30.3 9.9Q30.2 10.15 29.95 10.4L24.45 15.9Q24 16.35 23.35 16.35Q22.7 16.35 22.25 15.9Q21.8 15.45 21.8 14.8Q21.8 14.15 22.25 13.7L25.1 10.85H24.1Q17.75 10.85 13.425 15.175Q9.1 19.5 9.1 25.85Q9.1 31.35 12.35 35.375Q15.6 39.4 20.65 40.7Q21.15 40.8 21.5 41.225Q21.85 41.65 21.85 42.2Q21.85 42.95 21.3 43.4Q20.75 43.85 20.05 43.7Z\"/>\n </svg>\n </button>\n\n <!--flip vertical-->\n <button (click)=\"flipH()\" title=\"Flip Horizontal\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 48 48\">\n <path\n d=\"M9 42Q7.8 42 6.9 41.1Q6 40.2 6 39V9Q6 7.8 6.9 6.9Q7.8 6 9 6H18.1Q18.75 6 19.175 6.425Q19.6 6.85 19.6 7.5Q19.6 8.15 19.175 8.575Q18.75 9 18.1 9H9Q9 9 9 9Q9 9 9 9V39Q9 39 9 39Q9 39 9 39H18.1Q18.75 39 19.175 39.425Q19.6 39.85 19.6 40.5Q19.6 41.15 19.175 41.575Q18.75 42 18.1 42ZM24.1 46Q23.45 46 23.025 45.575Q22.6 45.15 22.6 44.5V3.5Q22.6 2.85 23.025 2.425Q23.45 2 24.1 2Q24.75 2 25.175 2.425Q25.6 2.85 25.6 3.5V44.5Q25.6 45.15 25.175 45.575Q24.75 46 24.1 46ZM39 9H38.3V6H39Q40.2 6 41.1 6.9Q42 7.8 42 9V9.7H39ZM39 26.75V21.25H42V26.75ZM39 42H38.3V39H39V38.3H42V39Q42 40.2 41.1 41.1Q40.2 42 39 42ZM39 18.25V12.7H42V18.25ZM39 35.3V29.75H42V35.3ZM28.6 42V39H35.3V42ZM28.6 9V6H35.3V9Z\"/>\n </svg>\n </button>\n\n <!--flip horizontal-->\n <button (click)=\"flipV()\" title=\"Flip Vertical\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 48 48\" transform='rotate(90)'>\n <path\n d=\"M9 42Q7.8 42 6.9 41.1Q6 40.2 6 39V9Q6 7.8 6.9 6.9Q7.8 6 9 6H18.1Q18.75 6 19.175 6.425Q19.6 6.85 19.6 7.5Q19.6 8.15 19.175 8.575Q18.75 9 18.1 9H9Q9 9 9 9Q9 9 9 9V39Q9 39 9 39Q9 39 9 39H18.1Q18.75 39 19.175 39.425Q19.6 39.85 19.6 40.5Q19.6 41.15 19.175 41.575Q18.75 42 18.1 42ZM24.1 46Q23.45 46 23.025 45.575Q22.6 45.15 22.6 44.5V3.5Q22.6 2.85 23.025 2.425Q23.45 2 24.1 2Q24.75 2 25.175 2.425Q25.6 2.85 25.6 3.5V44.5Q25.6 45.15 25.175 45.575Q24.75 46 24.1 46ZM39 9H38.3V6H39Q40.2 6 41.1 6.9Q42 7.8 42 9V9.7H39ZM39 26.75V21.25H42V26.75ZM39 42H38.3V39H39V38.3H42V39Q42 40.2 41.1 41.1Q40.2 42 39 42ZM39 18.25V12.7H42V18.25ZM39 35.3V29.75H42V35.3ZM28.6 42V39H35.3V42ZM28.6 9V6H35.3V9Z\"/>\n </svg>\n </button>\n <button (click)=\"reset()\" title=\"Reset\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 48 48\">\n <path\n d=\"M9.8 31.45Q8.8 29.65 8.4 27.825Q8 26 8 24.1Q8 17.55 12.725 12.825Q17.45 8.1 24 8.1H26.15L22.15 4.1L24.1 2.15L31.55 9.6L24.1 17.05L22.1 15.05L26.05 11.1H24Q18.65 11.1 14.825 14.925Q11 18.75 11 24.1Q11 25.55 11.275 26.85Q11.55 28.15 11.95 29.3ZM23.8 46 16.35 38.55 23.8 31.1 25.75 33.05 21.75 37.05H24Q29.35 37.05 33.175 33.225Q37 29.4 37 24.05Q37 22.6 36.75 21.3Q36.5 20 36 18.85L38.15 16.7Q39.15 18.5 39.575 20.325Q40 22.15 40 24.05Q40 30.6 35.275 35.325Q30.55 40.05 24 40.05H21.75L25.75 44.05Z\"/>\n </svg>\n </button>\n\n </div>\n </div>\n </div>\n <div class=\"ngx-pe-dialog-footer\">\n <button class=\"ngx-pe-btn ngx-pe-btn-outline-light\" (click)=\"close()\">{{closeBtnText}}</button>\n <button class=\"ngx-pe-btn ngx-pe-btn-primary\" [disabled]=\"isProcessing\" (click)=\"export()\">{{applyBtnText}}</button>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: NgxPhotoEditorComponent, decorators: [{
type: Component,
args: [{ selector: 'lib-ngx-photo-editor', template: "<div class=\"ngx-pe-overlay-container\">\n <div class=\"ngx-pe-dialog-container\" [style.max-width]=\"modalMaxWidth\">\n <div class=\"ngx-pe-dialog-header\" *ngIf=\"!hideModalHeader\">\n {{modalTitle}}\n </div>\n <div class=\"ngx-pe-dialog-body\">\n <div class=\"ngx-pe-cropper-wrapper\" [class]=\"roundCropper ? 'ngx-pe-cropper-round' : ''\">\n <div class=\"ngx-pe-loading\" *ngIf=\"!imageLoaded\" [class.ngx-pe-processing]=\"isProcessing\">\n <svg xmlns=\"http://www.w3.org/2000/svg\"\n style=\"margin: auto; display: block; shape-rendering: auto; animation-play-state: running; animation-delay: 0s;\"\n viewBox=\"0 0 100 100\" preserveAspectRatio=\"xMidYMid\">\n <circle cx=\"50\" cy=\"50\" fill=\"none\" stroke=\"#f3f3f3\" stroke-width=\"10\" r=\"35\"\n stroke-dasharray=\"164.93361431346415 56.97787143782138\"\n style=\"animation-play-state: running; animation-delay: 0s;\">\n <animateTransform attributeName=\"transform\" type=\"rotate\" repeatCount=\"indefinite\" dur=\"1s\"\n values=\"0 50 50;360 50 50\" keyTimes=\"0;1\"\n style=\"animation-play-state: running; animation-delay: 0s;\"></animateTransform>\n </circle>\n </svg>\n </div>\n <img *ngIf=\"imgUrl\" class=\"ngx-pe-img\" #image loading=\"lazy\" (load)=\"onLoad()\" (error)=\"error()\" [src]=\"imgUrl\" alt=\"cropper-img\" crossorigin=\"anonymous\">\n <div class=\"ngx-pe-tool-bar\">\n <!--move-->\n <button (click)=\"move()\" title=\"Move\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 48 48\">\n <path\n d=\"M24 44 15.85 35.85 18.05 33.65 22.5 38.1V28.65H25.5V38.1L29.95 33.65L32.15 35.85ZM11.9 31.9 4 24 11.95 16.05 14.15 18.25 9.9 22.5H19.35V25.5H9.9L14.1 29.7ZM36.1 31.9 33.9 29.7 38.1 25.5H28.7V22.5H38.1L33.9 18.3L36.1 16.1L44 24ZM22.5 19.3V9.9L18.3 14.1L16.1 11.9L24 4L31.9 11.9L29.7 14.1L25.5 9.9V19.3Z\"/>\n </svg>\n </button>\n\n <!--crop-->\n <button (click)=\"crop()\" title=\"Crop\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 48 48\">\n <path\n d=\"M34.75 31.75V13.25Q34.75 13.25 34.75 13.25Q34.75 13.25 34.75 13.25H16.25V10.25H34.75Q35.95 10.25 36.85 11.15Q37.75 12.05 37.75 13.25V31.75ZM36.25 46Q35.6 46 35.175 45.575Q34.75 45.15 34.75 44.5V37.75H13.25Q12.05 37.75 11.15 36.85Q10.25 35.95 10.25 34.75V13.25H3.5Q2.85 13.25 2.425 12.825Q2 12.4 2 11.75Q2 11.1 2.425 10.675Q2.85 10.25 3.5 10.25H10.25V3.5Q10.25 2.85 10.675 2.425Q11.1 2 11.75 2Q12.4 2 12.825 2.425Q13.25 2.85 13.25 3.5V34.75Q13.25 34.75 13.25 34.75Q13.25 34.75 13.25 34.75H44.5Q45.15 34.75 45.575 35.175Q46 35.6 46 36.25Q46 36.9 45.575 37.325Q45.15 37.75 44.5 37.75H37.75V44.5Q37.75 45.15 37.325 45.575Q36.9 46 36.25 46Z\"/>\n </svg>\n </button>\n\n <!--zoom in-->\n <button (click)=\"zoomIn()\" title=\"Zoom In\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 48 48\">\n <path\n d=\"M38.7 40.85 26.65 28.8Q25.15 30.1 23.15 30.825Q21.15 31.55 18.9 31.55Q13.5 31.55 9.75 27.8Q6 24.05 6 18.75Q6 13.45 9.75 9.7Q13.5 5.95 18.85 5.95Q24.15 5.95 27.875 9.7Q31.6 13.45 31.6 18.75Q31.6 20.9 30.9 22.9Q30.2 24.9 28.8 26.65L40.95 38.7Q41.4 39.1 41.375 39.75Q41.35 40.4 40.9 40.85Q40.45 41.3 39.8 41.3Q39.15 41.3 38.7 40.85ZM18.85 28.55Q22.9 28.55 25.75 25.675Q28.6 22.8 28.6 18.75Q28.6 14.7 25.75 11.825Q22.9 8.95 18.85 8.95Q14.75 8.95 11.875 11.825Q9 14.7 9 18.75Q9 22.8 11.875 25.675Q14.75 28.55 18.85 28.55ZM18.8 24.3Q18.15 24.3 17.725 23.875Q17.3 23.45 17.3 22.8V20.2H14.65Q14.05 20.2 13.625 19.75Q13.2 19.3 13.2 18.65Q13.2 18.05 13.625 17.625Q14.05 17.2 14.7 17.2H17.3V14.6Q17.3 14 17.75 13.575Q18.2 13.15 18.85 13.15Q19.45 13.15 19.875 13.575Q20.3 14 20.3 14.65V17.2H22.9Q23.5 17.2 23.925 17.65Q24.35 18.1 24.35 18.7Q24.35 19.35 23.925 19.775Q23.5 20.2 22.85 20.2H20.3V22.85Q20.3 23.45 19.85 23.875Q19.4 24.3 18.8 24.3Z\"/>\n </svg>\n </button>\n\n <!--zoom out-->\n <button (click)=\"zoomOut()\" title=\"Zoom Out\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 48 48\">\n <path\n d=\"M38.7 40.85 26.65 28.8Q25.15 30.1 23.15 30.825Q21.15 31.55 18.9 31.55Q13.5 31.55 9.75 27.8Q6 24.05 6 18.75Q6 13.45 9.75 9.7Q13.5 5.95 18.85 5.95Q24.15 5.95 27.875 9.7Q31.6 13.45 31.6 18.75Q31.6 20.9 30.9 22.9Q30.2 24.9 28.8 26.65L40.95 38.7Q41.4 39.1 41.375 39.75Q41.35 40.4 40.9 40.85Q40.45 41.3 39.8 41.3Q39.15 41.3 38.7 40.85ZM18.85 28.55Q22.9 28.55 25.75 25.675Q28.6 22.8 28.6 18.75Q28.6 14.7 25.75 11.825Q22.9 8.95 18.85 8.95Q14.75 8.95 11.875 11.825Q9 14.7 9 18.75Q9 22.8 11.875 25.675Q14.75 28.55 18.85 28.55ZM15.2 20.2Q14.6 20.2 14.175 19.75Q13.75 19.3 13.75 18.65Q13.75 18.05 14.175 17.625Q14.6 17.2 15.25 17.2H22.35Q22.95 17.2 23.375 17.65Q23.8 18.1 23.8 18.7Q23.8 19.35 23.375 19.775Q22.95 20.2 22.3 20.2Z\"/>\n </svg>\n </button>\n\n <!--rotate left-->\n <button (click)=\"rotateLeft()\" title=\"Rotate Left\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 48 48\">\n <path\n d=\"M7.9 23.6Q7.15 23.6 6.7 23.075Q6.25 22.55 6.4 21.85Q6.75 20.3 7.325 18.85Q7.9 17.4 8.7 16.05Q9.1 15.4 9.775 15.35Q10.45 15.3 11 15.85Q11.4 16.2 11.45 16.75Q11.5 17.3 11.25 17.75Q10.55 18.9 10.075 20.075Q9.6 21.25 9.35 22.4Q9.25 22.95 8.85 23.275Q8.45 23.6 7.9 23.6ZM20.05 43.7Q18.6 43.35 17.15 42.775Q15.7 42.2 14.4 41.4Q13.75 41 13.7 40.3Q13.65 39.6 14.2 39Q14.55 38.65 15.05 38.6Q15.55 38.55 15.95 38.8Q17.1 39.5 18.225 39.975Q19.35 40.45 20.55 40.75Q21.05 40.85 21.4 41.275Q21.75 41.7 21.75 42.25Q21.75 43 21.25 43.425Q20.75 43.85 20.05 43.7ZM8.7 35.7Q7.9 34.4 7.325 32.925Q6.75 31.45 6.4 29.85Q6.25 29.15 6.675 28.625Q7.1 28.1 7.9 28.1Q8.4 28.1 8.825 28.425Q9.25 28.75 9.35 29.3Q9.6 30.55 10.05 31.725Q10.5 32.9 11.2 33.95Q11.5 34.4 11.45 34.95Q11.4 35.5 11 35.9Q10.45 36.45 9.775 36.4Q9.1 36.35 8.7 35.7ZM27.95 43.65Q27.25 43.85 26.75 43.425Q26.25 43 26.25 42.25Q26.25 41.75 26.6 41.325Q26.95 40.9 27.45 40.75Q32.5 39.4 35.75 35.375Q39 31.35 39 25.85Q39 19.5 34.675 15.175Q30.35 10.85 24 10.85H23L25.85 13.7Q26.3 14.15 26.3 14.8Q26.3 15.45 25.85 15.9Q25.4 16.35 24.75 16.35Q24.1 16.35 23.65 15.9L18.15 10.4Q17.9 10.15 17.8 9.9Q17.7 9.65 17.7 9.35Q17.7 9.05 17.8 8.8Q17.9 8.55 18.15 8.3L23.65 2.8Q24.1 2.35 24.75 2.35Q25.4 2.35 25.85 2.8Q26.3 3.25 26.3 3.9Q26.3 4.55 25.85 5L23 7.85H24Q31.55 7.85 36.775 13.075Q42 18.3 42 25.85Q42 32.4 38.075 37.275Q34.15 42.15 27.95 43.65Z\"/>\n </svg>\n </button>\n\n <!--rotate right-->\n <button (click)=\"rotateRight()\" title=\"Rotate Right\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 48 48\">\n <path\n d=\"M40.2 23.6Q39.7 23.6 39.275 23.25Q38.85 22.9 38.75 22.4Q38.5 21.2 38.025 20.05Q37.55 18.9 36.85 17.75Q36.6 17.3 36.65 16.75Q36.7 16.2 37.1 15.8Q37.65 15.25 38.35 15.325Q39.05 15.4 39.45 16.05Q40.25 17.35 40.8 18.775Q41.35 20.2 41.7 21.8Q41.85 22.5 41.4 23.05Q40.95 23.6 40.2 23.6ZM26.3 42.2Q26.3 41.7 26.65 41.275Q27 40.85 27.5 40.75Q28.65 40.5 29.8 40.025Q30.95 39.55 32.1 38.85Q32.55 38.6 33.075 38.625Q33.6 38.65 34 39.05Q34.55 39.6 34.475 40.3Q34.4 41 33.75 41.4Q32.4 42.25 30.975 42.8Q29.55 43.35 28.1 43.7Q27.4 43.85 26.85 43.4Q26.3 42.95 26.3 42.2ZM37.1 35.9Q36.75 35.55 36.7 34.975Q36.65 34.4 36.9 33.95Q37.6 32.8 38.05 31.65Q38.5 30.5 38.75 29.3Q38.85 28.8 39.25 28.45Q39.65 28.1 40.2 28.1Q40.95 28.1 41.375 28.625Q41.8 29.15 41.65 29.85Q41.25 31.45 40.7 32.9Q40.15 34.35 39.4 35.65Q39 36.3 38.325 36.375Q37.65 36.45 37.1 35.9ZM20.05 43.7Q13.9 42.3 10 37.35Q6.1 32.4 6.1 25.85Q6.1 18.3 11.325 13.075Q16.55 7.85 24.1 7.85H25.1L22.25 5Q21.8 4.55 21.8 3.9Q21.8 3.25 22.25 2.8Q22.7 2.35 23.35 2.35Q24 2.35 24.45 2.8L29.95 8.3Q30.2 8.55 30.3 8.8Q30.4 9.05 30.4 9.35Q30.4 9.65 30.3 9.9Q30.2 10.15 29.95 10.4L24.45 15.9Q24 16.35 23.35 16.35Q22.7 16.35 22.25 15.9Q21.8 15.45 21.8 14.8Q21.8 14.15 22.25 13.7L25.1 10.85H24.1Q17.75 10.85 13.425 15.175Q9.1 19.5 9.1 25.85Q9.1 31.35 12.35 35.375Q15.6 39.4 20.65 40.7Q21.15 40.8 21.5 41.225Q21.85 41.65 21.85 42.2Q21.85 42.95 21.3 43.4Q20.75 43.85 20.05 43.7Z\"/>\n </svg>\n </button>\n\n <!--flip vertical-->\n <button (click)=\"flipH()\" title=\"Flip Horizontal\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 48 48\">\n <path\n d=\"M9 42Q7.8 42 6.9 41.1Q6 40.2 6 39V9Q6 7.8 6.9 6.9Q7.8 6 9 6H18.1Q18.75 6 19.175 6.425Q19.6 6.85 19.6 7.5Q19.6 8.15 19.175 8.575Q18.75 9 18.1 9H9Q9 9 9 9Q9 9 9 9V39Q9 39 9 39Q9 39 9 39H18.1Q18.75 39 19.175 39.425Q19.6 39.85 19.6 40.5Q19.6 41.15 19.175 41.575Q18.75 42 18.1 42ZM24.1 46Q23.45 46 23.025 45.575Q22.6 45.15 22.6 44.5V3.5Q22.6 2.85 23.025 2.425Q23.45 2 24.1 2Q24.75 2 25.175 2.425Q25.6 2.85 25.6 3.5V44.5Q25.6 45.15 25.175 45.575Q24.75 46 24.1 46ZM39 9H38.3V6H39Q40.2 6 41.1 6.9Q42 7.8 42 9V9.7H39ZM39 26.75V21.25H42V26.75ZM39 42H38.3V39H39V38.3H42V39Q42 40.2 41.1 41.1Q40.2 42 39 42ZM39 18.25V12.7H42V18.25ZM39 35.3V29.75H42V35.3ZM28.6 42V39H35.3V42ZM28.6 9V6H35.3V9Z\"/>\n </svg>\n </button>\n\n <!--flip horizontal-->\n <button (click)=\"flipV()\" title=\"Flip Vertical\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 48 48\" transform='rotate(90)'>\n <path\n d=\"M9 42Q7.8 42 6.9 41.1Q6 40.2 6 39V9Q6 7.8 6.9 6.9Q7.8 6 9 6H18.1Q18.75 6 19.175 6.425Q19.6 6.85 19.6 7.5Q19.6 8.15 19.175 8.575Q18.75 9 18.1 9H9Q9 9 9 9Q9 9 9 9V39Q9 39 9 39Q9 39 9 39H18.1Q18.75 39 19.175 39.425Q19.6 39.85 19.6 40.5Q19.6 41.15 19.175 41.575Q18.75 42 18.1 42ZM24.1 46Q23.45 46 23.025 45.575Q22.6 45.15 22.6 44.5V3.5Q22.6 2.85 23.025 2.425Q23.45 2 24.1 2Q24.75 2 25.175 2.425Q25.6 2.85 25.6 3.5V44.5Q25.6 45.15 25.175 45.575Q24.75 46 24.1 46ZM39 9H38.3V6H39Q40.2 6 41.1 6.9Q42 7.8 42 9V9.7H39ZM39 26.75V21.25H42V26.75ZM39 42H38.3V39H39V38.3H42V39Q42 40.2 41.1 41.1Q40.2 42 39 42ZM39 18.25V12.7H42V18.25ZM39 35.3V29.75H42V35.3ZM28.6 42V39H35.3V42ZM28.6 9V6H35.3V9Z\"/>\n </svg>\n </button>\n <button (click)=\"reset()\" title=\"Reset\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 48 48\">\n <path\n d=\"M9.8 31.45Q8.8 29.65 8.4 27.825Q8 26 8 24.1Q8 17.55 12.725 12.825Q17.45 8.1 24 8.1H26.15L22.15 4.1L24.1 2.15L31.55 9.6L24.1 17.05L22.1 15.05L26.05 11.1H24Q18.65 11.1 14.825 14.925Q11 18.75 11 24.1Q11 25.55 11.275 26.85Q11.55 28.15 11.95 29.3ZM23.8 46 16.35 38.55 23.8 31.1 25.75 33.05 21.75 37.05H24Q29.35 37.05 33.175 33.225Q37 29.4 37 24.05Q37 22.6 36.75 21.3Q36.5 20 36 18.85L38.15 16.7Q39.15 18.5 39.575 20.325Q40 22.15 40 24.05Q40 30.6 35.275 35.325Q30.55 40.05 24 40.05H21.75L25.75 44.05Z\"/>\n </svg>\n </button>\n\n </div>\n </div>\n </div>\n <div class=\"ngx-pe-dialog-footer\">\n <button class=\"ngx-pe-btn ngx-pe-btn-outline-light\" (click)=\"close()\">{{closeBtnText}}</button>\n <button class=\"ngx-pe-btn ngx-pe-btn-primary\" [disabled]=\"isProcessing\" (click)=\"export()\">{{applyBtnText}}</button>\n </div>\n </div>\n</div>\n" }]
}], propDecorators: { image: [{
type: ViewChild,
args: ['image']
}], modalTitle: [{
type: Input
}], hideModalHeader: [{
type: Input
}], aspectRatio: [{
type: Input
}], autoCropArea: [{
type: Input
}], autoCrop: [{
type: Input
}], mask: [{
type: Input
}], guides: [{
type: Input
}], centerIndicator: [{
type: Input
}], viewMode: [{
type: Input
}], modalMaxWidth: [{
type: Input
}], modalCentered: [{
type: Input
}], scalable: [{
type: Input
}], zoomable: [{
type: Input
}], cropBoxMovable: [{
type: Input
}], cropBoxResizable: [{
type: Input
}], darkTheme: [{
type: Input
}], roundCropper: [{
type: Input
}], canvasHeight: [{
type: Input
}], resizeToWidth: [{
type: Input
}], resizeToHeight: [{
type: Input
}], imageSmoothingEnabled: [{
type: Input
}], imageSmoothingQuality: [{
type: Input
}], format: [{
type: Input
}], closeBtnText: [{
type: Input
}], applyBtnText: [{
type: Input
}], imageQuality: [{
type: Input
}], closeEvent: [{
type: Output
}], imageCroppedEvent: [{
type: Output
}], errorEvent: [{
type: Output
}], source: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXBob3RvLWVkaXRvci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtcGhvdG8tZWRpdG9yL3NyYy9saWIvbmd4LXBob3RvLWVkaXRvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtcGhvdG8tZWRpdG9yL3NyYy9saWIvbmd4LXBob3RvLWVkaXRvci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFjLFlBQVksRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBRSxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDL0csT0FBTyxPQUFPLE1BQU0sV0FBVyxDQUFDOzs7QUFPaEMsTUFBTSxPQUFPLHVCQUF1QjtJQUpwQztRQVVVLGdCQUFXLEdBQUcsbUNBQW1DLENBQUM7UUFHakQsZUFBVSxHQUFHLGNBQWMsQ0FBQztRQUM1QixvQkFBZSxHQUFHLEtBQUssQ0FBQztRQUN4QixnQkFBVyxHQUFHLEdBQUcsQ0FBQztRQUNsQixpQkFBWSxHQUFHLEdBQUcsQ0FBQztRQUNuQixhQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ2hCLFNBQUksR0FBRyxJQUFJLENBQUM7UUFDWixXQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ2Qsb0JBQWUsR0FBRyxJQUFJLENBQUM7UUFDdkIsYUFBUSxHQUFhLENBQUMsQ0FBQztRQUN2QixrQkFBYSxHQUFHLE9BQU8sQ0FBQztRQUN4QixrQkFBYSxHQUFHLEtBQUssQ0FBQztRQUN0QixhQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ2hCLGFBQVEsR0FBRyxJQUFJLENBQUM7UUFDaEIsbUJBQWMsR0FBRyxJQUFJLENBQUM7UUFDdEIscUJBQWdCLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLGNBQVMsR0FBRyxJQUFJLENBQUM7UUFDakIsaUJBQVksR0FBRyxLQUFLLENBQUM7UUFDckIsaUJBQVksR0FBRyxH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QjtzQkFBeEIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFFRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0cscUJBQXFCO3NCQUE3QixLQUFLO2dCQUNHLHFCQUFxQjtzQkFBN0IsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBRUcsWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUlPLFlBQVk7c0JBQXhCLEtBQUs7Z0JBUUksVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxpQkFBaUI7c0JBQTFCLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTTtnQkFLTSxNQUFNO3NCQUFsQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQsIFZpZXdDaGlsZH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgQ3JvcHBlciBmcm9tIFwiY3JvcHBlcmpzXCI7XG5pbXBvcnQgVmlld01vZGUgPSBDcm9wcGVyLlZpZXdNb2RlO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItbmd4LXBob3RvLWVkaXRvcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9uZ3gtcGhvdG8tZWRpdG9yLmNvbXBvbmVudC5odG1sJyxcbn0pXG5leHBvcnQgY2xhc3MgTmd4UGhvdG9FZGl0b3JDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuXG4gIEBWaWV3Q2hpbGQoJ2ltYWdlJykgaW1hZ2UhOiBFbGVtZW50UmVmO1xuXG4gIHByaXZhdGUgY3JvcHBlciE6IENyb3BwZXI7XG4gIHB1YmxpYyBpbWdVcmwhOiBzdHJpbmc7XG4gIHByaXZhdGUgRklMRVNfUkVHRVggPSAvXFwuKGdpZnxqcGU/Z3x0aWZmfHBuZ3x3ZWJwfGJtcCkkL2k7XG5cblxuICBASW5wdXQoKSBtb2RhbFRpdGxlID0gJ1Bob3RvIEVkaXRvcic7XG4gIEBJbnB1dCgpIGhpZGVNb2RhbEhlYWRlciA9IGZhbHNlO1xuICBASW5wdXQoKSBhc3BlY3RSYXRpbyA9IE5hTjtcbiAgQElucHV0KCkgYXV0b0Nyb3BBcmVhID0gMC44O1xuICBASW5wdXQoKSBhdXRvQ3JvcCA9IHRydWU7XG4gIEBJbnB1dCgpIG1hc2sgPSB0cnVlO1xuICBASW5wdXQoKSBndWlkZXMgPSB0cnVlO1xuICBASW5wdXQoKSBjZW50ZXJJbmRpY2F0b3IgPSB0cnVlO1xuICBASW5wdXQoKSB2aWV3TW9kZTogVmlld01vZGUgPSAwO1xuICBASW5wdXQoKSBtb2RhbE1heFdpZHRoID0gJzUwMHB4JztcbiAgQElucHV0KCkgbW9kYWxDZW50ZXJlZCA9IGZhbHNlO1xuICBASW5wdXQoKSBzY2FsYWJsZSA9IHRydWU7XG4gIEBJbnB1dCgpIHpvb21hYmxlID0gdHJ1ZTtcbiAgQElucHV0KCkgY3JvcEJveE1vdmFibGUgPSB0cnVlO1xuICBASW5wdXQoKSBjcm9wQm94UmVzaXphYmxlID0gdHJ1ZTtcbiAgQElucHV0KCkgZGFya1RoZW1lID0gdHJ1ZTtcbiAgQElucHV0KCkgcm91bmRDcm9wcGVyID0gZmFsc2U7XG4gIEBJbnB1dCgpIGNhbnZhc0hlaWdodCA9IDQwMDtcblxuICBASW5wdXQoKSByZXNpemVUb1dpZHRoOiBudW1iZXIgfCBhbnk7XG4gIEBJbnB1dCgpIHJlc2l6ZVRvSGVpZ2h0OiBudW1iZXIgfCBhbnk7XG4gIEBJbnB1dCgpIGltYWdlU21vb3RoaW5nRW5hYmxlZCA9IHRydWU7XG4gIEBJbnB1dCgpIGltYWdlU21vb3RoaW5nUXVhbGl0eTogSW1hZ2VTbW9vdGhpbmdRdWFsaXR5ID0gJ2hpZ2gnO1xuICBASW5wdXQoKSBmb3JtYXQ6IHN0cmluZyB8IGFueTtcblxuICBASW5wdXQoKSBjbG9zZUJ0blRleHQgPSAnQ2xvc2UnO1xuICBASW5wdXQoKSBhcHBseUJ0blRleHQgPSAnQXBwbHknO1xuXG4gIHF1YWxpdHkgPSA5MjtcblxuICBASW5wdXQoKSBzZXQgaW1hZ2VRdWFsaXR5KHZhbHVlOiBudW1iZXIpIHtcbiAgICBpZiAodmFsdWUgPiAwICYmIHZhbHVlIDw9IDEwMCkge1xuICAgICAgdGhpcy5xdWFsaXR5ID0gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZXJyb3JFdmVudC5lcnJvcignSW52YWxpZCBpbWFnZSBxdWFsaXR5Jyk7XG4gICAgfVxuICB9XG5cbiAgQE91dHB1dCgpIGNsb3NlRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIGltYWdlQ3JvcHBlZEV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxOZ3hDcm9wcGVkRXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSBlcnJvckV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIGltYWdlTG9hZGVkID0gZmFsc2U7XG4gIGlzUHJvY2Vzc2luZyA9IGZhbHNlO1xuXG5cbiAgQElucHV0KCkgc2V0IHNvdXJjZShkYXRhOiBGaWxlIHwgc3RyaW5nIHwgYW55KSB7XG4gICAgaWYgKGRhdGEgaW5zdGFuY2VvZiBFdmVudCkge1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgY29uc3QgZmlsZSA9ICg8SFRNTElucHV0RWxlbWVudD5kYXRhLnRhcmdldCkuZmlsZXNbMF07XG4gICAgICBpZiAodGhpcy5GSUxFU19SRUdFWC50ZXN0KGZpbGUubmFtZSkpIHtcbiAgICAgICAgaWYgKCF0aGlzLmZvcm1hdCkge1xuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICB0aGlzLmZvcm1hdCA9IGRhdGEudGFyZ2V0LmZpbGVzWzBdLnR5cGUuc3BsaXQoJy8nKVsxXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgICByZWFkZXIub25sb2FkID0gKGV2OiBhbnkpID0+IHtcbiAgICAgICAgICB0aGlzLmltZ1VybCA9IGV2LnRhcmdldC5yZXN1bHQ7XG4gICAgICAgIH07XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZGF0YS50YXJnZXQuZmlsZXNbMF0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5sb2coJ2Vycm9yJyk7XG4gICAgICAgIHRoaXMuZXJyb3JFdmVudC5lbWl0KCdOb3Qgc3VwcG9ydGVkIElOUFVUJyk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChkYXRhIGluc3RhbmNlb2YgRmlsZSkge1xuICAgICAgaWYgKHRoaXMuRklMRVNfUkVHRVgudGVzdChkYXRhLm5hbWUpKSB7XG4gICAgICAgIGlmICghdGhpcy5mb3JtYXQpIHtcbiAgICAgICAgICB0aGlzLmZvcm1hdCA9IGRhdGEudHlwZS5zcGxpdCgnLycpWzFdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgICAgIHJlYWRlci5vbmxvYWQgPSAoZXY6IGFueSkgPT4ge1xuICAgICAgICAgIHRoaXMuaW1nVXJsID0gZXYudGFyZ2V0LnJlc3VsdDtcbiAgICAgICAgfTtcbiAgICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZGF0YSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmVycm9yRXZlbnQuZW1pdCgnTm90IHN1cHBvcnRlZCBJTlBVVCcpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICBpZiAoKC9eZGF0YTppbWFnZVxcLyhbYS16QS1aXSopO2Jhc2U2NCwoW15cXFwiXSopJC8pLnRlc3QoZGF0YSkpIHtcbiAgICAgICAgdGhpcy5pbWdVcmwgPSBkYXRhO1xuICAgICAgICBpZiAoIXRoaXMuZm9ybWF0KSB7XG4gICAgICAgICAgdGhpcy5mb3JtYXQgPSAoKGRhdGEuc3BsaXQoJywnKVswXSkuc3BsaXQoJzsnKVswXSkuc3BsaXQoJzonKVsxXS5zcGxpdCgnLycpWzFdO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuaXNWYWxpZEltYWdlVVJMKGRhdGEpKSB7XG4gICAgICAgIHRoaXMuaW1nVXJsID0gZGF0YTtcbiAgICAgICAgaWYgKCF0aGlzLmZvcm1hdCkge1xuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICB0aGlzLmZvcm1hdCA9IGRhdGEuc3BsaXQoL1sjP10vKVswXS5zcGxpdCgnLicpLnBvcCgpLnRyaW0oKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5lcnJvckV2ZW50LmVtaXQoJ05vdCBzdXBwb3J0ZWQgVVJMJyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZXJyb3JFdmVudC5lbWl0KCdOb3Qgc3VwcG9ydGVkIElOUFVUJyk7XG4gICAgfVxuICB9XG5cbiAgaXNWYWxpZEltYWdlVVJMKHN0cjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0ci5tYXRjaCgvXmh0dHBbXlxcP10qLihqcGd8anBlZ3xnaWZ8cG5nfHRpZmZ8Ym1wKShcXD8oLiopKT8oXFwjKC4qKSk/JC9naW0pO1xuICB9XG5cbiAgcm90YXRlUmlnaHQoKSB7XG4gICAgdGhpcy5jcm9wcGVyLnJvdGF0ZSg0NSk7XG4gIH1cblxuICByb3RhdGVMZWZ0KCkge1xuICAgIHRoaXMuY3JvcHBlci5yb3RhdGUoLTQ1KTtcbiAgfVxuXG4gIGNyb3AoKSB7XG4gICAgdGhpcy5jcm9wcGVyLnNldERyYWdNb2RlKCdjcm9wJyk7XG4gIH1cblxuICBtb3ZlKCkge1xuICAgIHRoaXMuY3JvcHBlci5zZXREcmFnTW9kZSgnbW92ZScpO1xuICB9XG5cbiAgem9vbUluKCkge1xuICAgIHRoaXMuY3JvcHBlci56b29tKDAuMSk7XG4gIH1cblxuICB6b29tT3V0KCkge1xuICAgIHRoaXMuY3JvcHBlci56b29tKC0wLjEpO1xuICB9XG5cbiAgZmxpcEgoKSB7XG4gICAgdGhpcy5jcm9wcGVyLnNjYWxlWCgtdGhpcy5jcm9wcGVyLmdldEltYWdlRGF0YSgpLnNjYWxlWCk7XG4gIH1cblxuICBmbGlwVigpIHtcbiAgICB0aGlzLmNyb3BwZXIuc2NhbGVZKC10aGlzLmNyb3BwZXIuZ2V0SW1hZ2VEYXRhKCkuc2NhbGVZKTtcbiAgfVxuXG4gIHJlc2V0KCkge1xuICAgIHRoaXMuY3JvcHBlci5yZXNldCgpO1xuICB9XG5cbiAgZXhwb3J0KCkge1xuICAgIHRoaXMuaXNQcm9jZXNzaW5nID0gdHJ1ZTtcbiAgICB0aGlzLmltYWdlTG9hZGVkID0gZmFsc2U7XG4gICAgbGV0IGNyb3BlZEltYWdlID0gdGhpcy5jcm9wcGVyLmdldENyb3BwZWRDYW52YXMoe1xuICAgICAgd2lkdGg6IHRoaXMucmVzaXplVG9XaWR0aCxcbiAgICAgIGhlaWdodDogdGhpcy5yZXNpemVUb0hlaWdodCxcbiAgICAgIGltYWdlU21vb3RoaW5nRW5hYmxlZDogdGhpcy5pbWFnZVNtb290aGluZ0VuYWJsZWQsXG4gICAgICBpbWFnZVNtb290aGluZ1F1YWxpdHk6IHRoaXMuaW1hZ2VTbW9vdGhpbmdRdWFsaXR5XG4gICAgfSk7XG5cbiAgICBjb25zdCBvdXRwdXRJbWFnZSA9IGNyb3BlZEltYWdlLnRvRGF0YVVSTCgnaW1hZ2UvJyArIHRoaXMuZm9ybWF0LCB0aGlzLnF1YWxpdHkpO1xuICAgIGZldGNoKG91dHB1dEltYWdlKVxuICAgICAgLnRoZW4ocmVzID0+IHJlcy5ibG9iKCkpXG4gICAgICAudGhlbihibG9iID0+IHtcbiAgICAgICAgdGhpcy5pc1Byb2Nlc3NpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pbWFnZUxvYWRlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuaW1hZ2VDcm9wcGVkRXZlbnQuZW1pdCh7XG4gICAgICAgICAgYmFzZTY0OiBvdXRwdXRJbWFnZSxcbiAgICAgICAgICBmaWxlOiBuZXcgRmlsZShbYmxvYl0sXG4gICAgICAgICAgICBEYXRlLm5vdygpICsgJy4nICsgdGhpcy5mb3JtYXQsXG4gICAgICAgICAgICB7dHlwZTogJ2ltYWdlLycgKyB0aGlzLmZvcm1hdH0pXG4gICAgICAgIH0pO1xuICAgICAgfSlcbiAgfVxuXG5cbiAgY2xvc2UoKSB7XG4gICAgdGhpcy5jbG9zZUV2ZW50LmVtaXQoKTtcbiAgfVxuXG4gIG9uTG9hZCgpIHtcbiAgICB0aGlzLmltYWdlLm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigncmVhZHknLCAoKSA9PiB7XG4gICAgICB0aGlzLmltYWdlTG9hZGVkID0gdHJ1ZTtcbiAgICB9KTtcblxuICAgIHRoaXMuY3JvcHBlciA9IG5ldyBDcm9wcGVyKHRoaXMuaW1hZ2UubmF0aXZlRWxlbWVudCwge1xuICAgICAgYXNwZWN0UmF0aW86IHRoaXMuYXNwZWN0UmF0aW8sXG4gICAgICBhdXRvQ3JvcEFyZWE6IHRoaXMuYXV0b0Nyb3BBcmVhLFxuICAgICAgYXV0b0Nyb3A6IHRoaXMuYXV0b0Nyb3AsXG4gICAgICBtb2RhbDogdGhpcy5tYXNrLCAvLyBibGFjayBtYXNrXG4gICAgICBndWlkZXM6IHRoaXMuZ3VpZGVzLCAvLyBncmlkXG4gICAgICBjZW50ZXI6IHRoaXMuY2VudGVySW5kaWNhdG9yLCAvLyBjZW50ZXIgaW5kaWNhdG9yXG4gICAgICB2aWV3TW9kZTogdGhpcy52aWV3TW9kZSxcbiAgICAgIHNjYWxhYmxlOiB0aGlzLnNjYWxhYmxlLFxuICAgICAgem9vbWFibGU6IHRoaXMuem9vbWFibGUsXG4gICAgICBiYWNrZ3JvdW5kOiBmYWxzZSxcbiAgICAgIGNyb3BCb3hNb3ZhYmxlOiB0aGlzLmNyb3BCb3hNb3ZhYmxlLFxuICAgICAgY3JvcEJveFJlc2l6YWJsZTogdGhpcy5jcm9wQm94UmVzaXphYmxlLFxuICAgIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gIH1cblxuICBlcnJvcigpIHtcbiAgICB0aGlzLmVycm9yRXZlbnQuZW1pdCgnRXJyb3IgbG9hZGluZyBpbWFnZScpO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmd4Q3JvcHBlZEV2ZW50IHtcbiAgYmFzZTY0Pzogc3RyaW5nO1xuICBmaWxlPzogRmlsZTtcbn1cblxuZXhwb3J0IHR5cGUgaW1hZ2VGb3JtYXQgPSAnZ2lmJyB8ICdqcGVnJyB8ICd0aWZmJyB8ICdwbmcnIHwgJ3dlYnAnIHwgJ2JtcCc7XG4iLCI8ZGl2IGNsYXNzPVwibmd4LXBlLW92ZXJsYXktY29udGFpbmVyXCI+XG4gIDxkaXYgY2xhc3M9XCJuZ3gtcGUtZGlhbG9nLWNvbnRhaW5lclwiIFtzdHlsZS5tYXgtd2lkdGhdPVwibW9kYWxNYXhXaWR0aFwiPlxuICAgIDxkaXYgY2xhc3M9XCJuZ3gtcGUtZGlhbG9nLWhlYWRlclwiICpuZ0lmPVwiIWhpZGVNb2RhbEhlYWRlclwiPlxuICAgICAge3ttb2RhbFRpdGxlfX1cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibmd4LXBlLWRpYWxvZy1ib2R5XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibmd4LXBlLWNyb3BwZXItd3JhcHBlclwiIFtjbGFzc109XCJyb3VuZENyb3BwZXIgPyAnbmd4LXBlLWNyb3BwZXItcm91bmQnIDogJydcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm5neC1wZS1sb2FkaW5nXCIgKm5nSWY9XCIhaW1hZ2VMb2FkZWRcIiBbY2xhc3Mubmd4LXBlLXByb2Nlc3NpbmddPVwiaXNQcm9jZXNzaW5nXCI+XG4gICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICAgICAgIHN0eWxlPVwibWFyZ2luOiBhdXRvOyBkaXNwbGF5OiBibG9jazsgc2hhcGUtcmVuZGVyaW5nOiBhdXRvOyBhbmltYXRpb24tcGxheS1zdGF0ZTogcnVubmluZzsgYW5pbWF0aW9uLWRlbGF5OiAwcztcIlxuICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAxMDAgMTAwXCIgcHJlc2VydmVBc3BlY3RSYXRpbz1cInhNaWRZTWlkXCI+XG4gICAgICAgICAgICA8Y2lyY2xlIGN4PVwiNTBcIiBjeT1cIjUwXCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIjZjNmM2YzXCIgc3Ryb2tlLXdpZHRoPVwiMTBcIiByPVwiMzVcIlxuICAgICAgICAgICAgICAgICAgICBzdHJva2UtZGFzaGFycmF5PVwiMTY0LjkzMzYxNDMxMzQ2NDE1IDU2Ljk3Nzg3MTQzNzgyMTM4XCJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJhbmltYXRpb24tcGxheS1zdGF0ZTogcnVubmluZzsgYW5pbWF0aW9uLWRlbGF5OiAwcztcIj5cbiAgICAgICAgICAgICAgPGFuaW1hdGVUcmFuc2Zvcm0gYXR0cmlidXRlTmFtZT1cInRyYW5zZm9ybVwiIHR5cGU9XCJyb3RhdGVcIiByZXBlYXRDb3VudD1cImluZGVmaW5pdGVcIiBkdXI9XCIxc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcz1cIjAgNTAgNTA7MzYwIDUwIDUwXCIga2V5VGltZXM9XCIwOzFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImFuaW1hdGlvbi1wbGF5LXN0YXRlOiBydW5uaW5nOyBhbmltYXRpb24tZGVsYXk6IDBzO1wiPjwvYW5pbWF0ZVRyYW5zZm9ybT5cbiAgICAgICAgICAgIDwvY2lyY2xlPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGltZyAqbmdJZj1cImltZ1VybFwiIGNsYXNzPVwibmd4LXBlLWltZ1wiICNpbWFnZSBsb2FkaW5nPVwibGF6eVwiIChsb2FkKT1cIm9uTG9hZCgpXCIgKGVycm9yKT1cImVycm9yKClcIiBbc3JjXT1cImltZ1VybFwiIGFsdD1cImNyb3BwZXItaW1nXCIgY3Jvc3NvcmlnaW49XCJhbm9ueW1vdXNcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm5neC1wZS10b29sLWJhclwiPlxuICAgICAgICAgIDwhLS1tb3ZlLS0+XG4gICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwibW92ZSgpXCIgdGl0bGU9XCJNb3ZlXCI+XG4gICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDQ4IDQ4XCI+XG4gICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgZD1cIk0yNCA0NCAxNS44NSAzNS44NSAxOC4wNSAzMy42NSAyMi41IDM4LjFWMjguNjVIMjUuNVYzOC4xTDI5Ljk1IDMzLjY1TDMyLjE1IDM1Ljg1Wk0xMS45IDMxLjkgNCAyNCAxMS45NSAxNi4wNSAxNC4xNSAxOC4yNSA5LjkgMjIuNUgxOS4zNVYyNS41SDkuOUwxNC4xIDI5LjdaTTM2LjEgMzEuOSAzMy45IDI5LjcgMzguMSAyNS41SDI4LjdWMjIuNUgzOC4xTDMzLjkgMTguM0wzNi4xIDE2LjFMNDQgMjRaTTIyLjUgMTkuM1Y5LjlMMTguMyAxNC4xTDE2LjEgMTEuOUwyNCA0TDMxLjkgMTEuOUwyOS43IDE0LjFMMjUuNSA5LjlWMTkuM1pcIi8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgIDwhLS1jcm9wLS0+XG4gICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiY3JvcCgpXCIgdGl0bGU9XCJDcm9wXCI+XG4gICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDQ4IDQ4XCI+XG4gICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgZD1cIk0zNC43NSAzMS43NVYxMy4yNVEzNC43NSAxMy4yNSAzNC43NSAxMy4yNVEzNC43NSAxMy4yNSAzNC43NSAxMy4yNUgxNi4yNVYxMC4yNUgzNC43NVEzNS45NSAxMC4yNSAzNi44NSAxMS4xNVEzNy43NSAxMi4wNSAzNy43NSAxMy4yNVYzMS43NVpNMzYuMjUgNDZRMzUuNiA0NiAzNS4xNzUgNDUuNTc1UTM0Ljc1IDQ1LjE1IDM0Ljc1IDQ0LjVWMzcuNzVIMTMuMjVRMTIuMDUgMzcuNzUgMTEuMTUgMzYuODVRMTAuMjUgMzUuOTUgMTAuMjUgMzQuNzVWMTMuMjVIMy41UTIuODUgMTMuMjUgMi40MjUgMTIuODI1UTIgMTIuNCAyIDExLjc1UTIgMTEuMSAyLjQyNSAxMC42NzVRMi44NSAxMC4yNSAzLjUgMTAuMjVIMTAuMjVWMy41UTEwLjI1IDIuODUgMTAuNjc1IDIuNDI1UTExLjEgMiAxMS43NSAyUTEyLjQgMiAxMi44MjUgMi40MjVRMTMuMjUgMi44NSAxMy4yNSAzLjVWMzQuNzVRMTMuMjUgMzQuNzUgMTMuMjUgMzQuNzVRMTMuMjUgMzQuNzUgMTMuMjUgMzQuNzVINDQuNVE0NS4xNSAzNC43NSA0NS41NzUgMzUuMTc1UTQ2IDM1LjYgNDYgMzYuMjVRNDYgMzYuOSA0NS41NzUgMzcuMzI1UTQ1LjE1IDM3Ljc1IDQ0LjUgMzcuNzVIMzcuNzVWNDQuNVEzNy43NSA0NS4xNSAzNy4zMjUgNDUuNTc1UTM2LjkgNDYgMzYuMjUgNDZaXCIvPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICA8IS0tem9vbSBpbi0tPlxuICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cInpvb21JbigpXCIgdGl0bGU9XCJab29tIEluXCI+XG4gICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDQ4IDQ4XCI+XG4gICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgZD1cIk0zOC43IDQwLjg1IDI2LjY1IDI4LjhRMjUuMTUgMzAuMSAyMy4xNSAzMC44MjVRMjEuMTUgMzEuNTUgMTguOSAzMS41NVExMy41IDMxLjU1IDkuNzUgMjcuOFE2IDI0LjA1IDYgMTguNzVRNiAxMy40NSA5Ljc1IDkuN1ExMy41IDUuOTUgMTguODUgNS45NVEyNC4xNSA1Ljk1IDI3Ljg3NSA5LjdRMzEuNiAxMy40NSAzMS42IDE4Ljc1UTMxLjYgMjAuOSAzMC45IDIyLjlRMzAuMiAyNC45IDI4LjggMjYuNjVMNDAuOTUgMzguN1E0MS40IDM5LjEgNDEuMzc1IDM5Ljc1UTQxLjM1IDQwLjQgNDAuOSA0MC44NVE0MC40NSA0MS4zIDM5LjggNDEuM1EzOS4xNSA0MS4zIDM4LjcgNDAuODVaTTE4Ljg1IDI4LjU1UTIyLjkgMjguNTUgMjUuNzUgMjUuNjc1UTI4LjYgMjIuOCAyOC42IDE4Ljc1UTI4LjYgMTQuNyAyNS43NSAxMS44MjVRMjIuOSA4Ljk1IDE4Ljg1IDguOTVRMTQuNzUgOC45NSAxMS44NzUgMTEuODI1UTkgMTQuNyA5IDE4Ljc1UTkgMjIuOCAxMS44NzUgMjUuNjc1UTE0Ljc1IDI4LjU1IDE4Ljg1IDI4LjU1Wk0xOC44IDI0LjNRMTguMTUgMjQuMyAxNy43MjUgMjMuODc1UTE3LjMgMjMuNDUgMTcuMyAyMi44VjIwLjJIMTQuNjVRMTQuMDUgMjAuMiAxMy42MjUgMTkuNzVRMTMuMiAxOS4zIDEzLjIgMTguNjVRMTMuMiAxOC4wNSAxMy42MjUgMTcuNjI1UTE0LjA1IDE3LjIgMTQuNyAxNy4ySDE3LjNWMTQuNlExNy4zIDE0IDE3Ljc1IDEzLjU3NVExOC4yIDEzLjE1IDE4Ljg1IDEzLjE1UTE5LjQ1IDEzLjE1IDE5Ljg3NSAxMy41NzVRMjAuMyAxNCAyMC4zIDE0LjY1VjE3LjJIMjIuOVEyMy41IDE3LjIgMjMuOTI1IDE3LjY1UTI0LjM1IDE4LjEgMjQuMzUgMTguN1EyNC4zNSAxOS4zNSAyMy45MjUgMTkuNzc1UTIzLjUgMjAuMiAyMi44NSAyMC4ySDIwLjNWMjIuODVRMjAuMyAyMy40NSAxOS44NSAyMy44NzVRMTkuNCAyNC4zIDE4LjggMjQuM1pcIi8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgIDwhLS16b29tIG91dC0tPlxuICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cInpvb21PdXQoKVwiIHRpdGxlPVwiWm9vbSBPdXRcIj5cbiAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgNDggNDhcIj5cbiAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICBkPVwiTTM4LjcgNDAuODUgMjYuNjUgMjguOFEyNS4xNSAzMC4xIDIzLjE1IDMwLjgyNVEyMS4xNSAzMS41NSAxOC45IDMxLjU1UTEzLjUgMzEuNTUgOS43NSAyNy44UTYgMjQuMDUgNiAxOC43NVE2IDEzLjQ1IDkuNzUgOS43UTEzLjUgNS45NSAxOC44NSA1Ljk1UTI0LjE1IDUuOTUgMjcuODc1IDkuN1EzMS42IDEzLjQ1IDMxLjYgMTguNzVRMzEuNiAyMC45IDMwLjkgMjIuOVEzMC4yIDI0LjkgMjguOCAyNi42NUw0MC45NSAzOC43UTQxLjQgMzkuMSA0MS4zNzUgMzkuNzVRNDEuMzUgNDAuNCA0MC45IDQwLjg1UTQwLjQ1IDQxLjMgMzkuOCA0MS4zUTM5LjE1IDQxLjMgMzguNyA0MC44NVpNMTguODUgMjguNTVRMjIuOSAyOC41NSAyNS43NSAyNS42NzVRMjguNiAyMi44IDI4LjYgMTguNzVRMjguNiAxNC43IDI1Ljc1IDExLjgyNVEyMi45IDguOTUgMTguODUgOC45NVExNC43NSA4Ljk1IDExLjg3NSAxMS44MjVROSAxNC43IDkgMTguNzVROSAyMi44IDExLjg3NSAyNS42NzVRMTQuNzUgMjguNTUgMTguODUgMjguNTVaTTE1LjIgMjAuMlExNC42IDIwLjIgMTQuMTc1IDE5Ljc1UTEzLjc1IDE5LjMgMTMuNzUgMTguNjVRMTMuNzUgMTguMDUgMTQuMTc1IDE3LjYyNVExNC42IDE3LjIgMTUuMjUgMTcuMkgyMi4zNVEyMi45NSAxNy4yIDIzLjM3NSAxNy42NVEyMy44IDE4LjEgMjMuOCAxOC43UTIzLjggMTkuMzUgMjMuMzc1IDE5Ljc3NVEyMi45NSAyMC4yIDIyLjMgMjAuMlpcIi8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgIDwhLS1yb3RhdGUgbGVmdC0tPlxuICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cInJvdGF0ZUxlZnQoKVwiIHRpdGxlPVwiUm90YXRlIExlZnRcIj5cbiAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgNDggNDhcIj5cbiAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICBkPVwiTTcuOSAyMy42UTcuMTUgMjMuNiA2LjcgMjMuMDc1UTYuMjUgMjIuNTUgNi40IDIxLjg1UTYuNzUgMjAuMyA3LjMyNSAxOC44NVE3LjkgMTcuNCA4LjcgMTYuMDVROS4xIDE1LjQgOS43NzUgMTUuMzVRMTAuNDUgMTUuMyAxMSAxNS44NVExMS40IDE2LjIgMTEuNDUgMTYuNzVRMTEuNSAxNy4zIDExLjI1IDE3Ljc1UTEwLjU1IDE4LjkgMTAuMDc1IDIwLjA3NVE5LjYgMjEuMjUgOS4zNSAyMi40UTkuMjUgMjIuOTUgOC44NSAyMy4yNzVROC40NSAyMy42IDcuOSAyMy42Wk0yMC4wNSA0My43UTE4LjYgNDMuMzUgMTcuMTUgNDIuNzc1UTE1LjcgNDIuMiAxNC40IDQxLjRRMTMuNzUgNDEgMTMuNyA0MC4zUTEzLjY1IDM5LjYgMTQuMiAzOVExNC41NSAzOC42NSAxNS4wNSAzOC42UTE1LjU1IDM4LjU1IDE1Ljk1IDM4LjhRMTcuMSAzOS41IDE4LjIyNSAzOS45NzVRMTkuMzUgNDAuNDUgMjAuNTUgNDAuNzVRMjEuMDUgNDAuODUgMjEuNCA0MS4yNzVRMjEuNzUgNDEuNyAyMS43NSA0Mi4yNVEyMS43NSA0MyAyMS4yNSA0My40MjVRMjAuNzUgNDMuODUgMjAuMDUgNDMuN1pNOC43IDM1LjdRNy45IDM0LjQgNy4zMjUgMzIuOTI1UTYuNzUgMzEuNDUgNi40IDI5Ljg1UTYuMjUgMjkuMTUgNi42NzUgMjguNjI1UTcuMSAyOC4xIDcuOSAyOC4xUTguNCAyOC4xIDguODI1IDI4LjQyNVE5LjI1IDI4Ljc1IDkuMzUgMjkuM1E5LjYgMzAuNTUgMTAuMDUgMzEuNzI1UTEwLjUgMzIuOSAxMS4yIDMzLjk1UTExLjUgMzQuNCAxMS40NSAzNC45NVExMS40IDM1LjUgMTEgMzUuOVExMC40NSAzNi40NSA5Ljc3NSAzNi40UTkuMSAzNi4zNSA4LjcgMzUuN1pNMjcuOTUgNDMuNjVRMjcuMjUgNDMuODUgMjYuNzUgNDMuNDI1UTI2LjI1IDQzIDI2LjI1IDQyLjI1UTI2LjI1IDQxLjc1IDI2LjYgNDEuMzI1UTI2Ljk1IDQwLjkgMjcuNDUgNDAuNzVRMzIuNSAzOS40IDM1Ljc1IDM1LjM3NVEzOSAzMS4zNSAzOSAyNS44NVEzOSAxOS41IDM0LjY3NSAxNS4xNzVRMzAuMzUgMTAuODUgMjQgMTAuODVIMjNMMjUuODUgMTMuN1EyNi4zIDE0LjE1IDI2LjMgMTQuOFEyNi4zIDE1LjQ1IDI1Ljg1IDE1LjlRMjUuNCAxNi4zNSAyNC43NSAxNi4zNVEyNC4xIDE2LjM1IDIzLjY1IDE1LjlMMTguMTUgMTAuNFExNy45IDEwLjE1IDE3LjggOS45UTE3LjcgOS42NSAxNy43IDkuMzVRMTcuNyA5LjA1IDE3LjggOC44UTE3LjkgOC41NSAxOC4xNSA4LjNMMjMuNjUgMi44UTI0LjEgMi4zNSAyNC43NSAyLjM1UTI1LjQgMi4zNSAyNS44NSAyLjhRMjYuMyAzLjI1IDI2LjMgMy45UTI2LjMgNC41NSAyNS44NSA1TDIzIDcuODVIMjRRMzEuNTUgNy44NSAzNi43NzUgMTMuMDc1UTQyIDE4LjMgNDIgMjUuODVRNDIgMzIuNCAzOC4wNzUgMzcuMjc1UTM0LjE1IDQyLjE1IDI3Ljk1IDQzLjY1WlwiLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgPCEtLXJvdGF0ZSByaWdodC0tPlxuICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cInJvdGF0ZVJpZ2h0KClcIiB0aXRsZT1cIlJvdGF0ZSBSaWdodFwiPlxuICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCA0OCA0OFwiPlxuICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgIGQ9XCJNNDAuMiAyMy42UTM5LjcgMjMuNiAzOS4yNzUgMjMuMjVRMzguODUgMjIuOSAzOC43NSAyMi40UTM4LjUgMjEuMiAzOC4wMjUgMjAuMDVRMzcuNTUgMTguOSAzNi44NSAxNy43NVEzNi42IDE3LjMgMzYuNjUgMTYuNzVRMzYuNyAxNi4yIDM3LjEgMTUuOFEzNy42NSAxNS4yNSAzOC4zNSAxNS4zMjVRMzkuMDUgMTUuNCAzOS40NSAxNi4wNVE0MC4yNSAxNy4zNSA0MC44IDE4Ljc3NVE0MS4zNSAyMC4yIDQxLjcgMjEuOFE0MS44NSAyMi41IDQxLjQgMjMuMDVRNDAuOTUgMjMuNiA0MC4yIDIzLjZaTTI2LjMgNDIuMlEyNi4zIDQxLjcgMjYuNjUgNDEuMjc1UTI3IDQwLjg1IDI3LjUgNDAuNzVRMjguNjUgNDAuNSAyOS44IDQwLjAyNVEzMC45NSAzOS41NSAzMi4xIDM4Ljg1UTMyLjU1IDM4LjYgMzMuMDc1IDM4LjYyNVEzMy42IDM4LjY1IDM0IDM5LjA1UTM0LjU1IDM5LjYgMzQuNDc1IDQwLjNRMzQuNCA0MSAzMy43NSA0MS40UTMyLjQgNDIuMjUgMzAuOTc1IDQyLjhRMjkuNTUgNDMuMzUgMjguMSA0My43UTI3LjQgNDMuODUgMjYuODUgNDMuNFEyNi4zIDQyLjk1IDI2LjMgNDIuMlpNMzcuMSAzNS45UTM2Ljc1IDM1LjU1IDM2LjcgMzQuOTc1UTM2LjY1IDM0LjQgMzYuOSAzMy45NVEzNy42IDMyLjggMzguMDUgMzEuNjVRMzguNSAzMC41IDM4Ljc1IDI5LjNRMzguODUgMjguOCAzOS4yNSAyOC40NVEzOS42NSAyOC4xIDQwLjIgMjguMVE0MC45NSAyOC4xIDQxLjM3NSAyOC42MjVRNDEuOCAyOS4xNSA0MS42NSAyOS44NVE0MS4yNSAzMS40NSA0MC43IDMyLjlRNDAuMTUgMzQuMzUgMzkuNCAzNS42NVEzOSAzNi4zIDM4LjMyNSAzNi4zNzVRMzcuNjUgMzYuNDUgMzcuMSAzNS45Wk0yMC4wNSA0My43UTEzLjkgNDIuMyAxMCAzNy4zNVE2LjEgMzIuNCA2LjEgMjUuODVRNi4xIDE4LjMgMTEuMzI1IDEzLjA3NVExNi41NSA3Ljg1IDI0LjEgNy44NUgyNS4xTDIyLjI1IDVRMjEuOCA0LjU1IDIxLjggMy45UTIxLjggMy4yNSAyMi4yNSAyLjhRMjIuNyAyLjM1IDIzLjM1IDIuMzVRMjQgMi4zNSAyNC40NSAyLjhMMjkuOTUgOC4zUTMwLjIgOC41NSAzMC4zIDguOFEzMC40IDkuMDUgMzAuNCA5LjM1UTMwLjQgOS42NSAzMC4zIDkuOVEzMC4yIDEwLjE1IDI5Ljk1IDEwLjRMMjQuNDUgMTUuOVEyNCAxNi4zNSAyMy4zNSAxNi4zNVEyMi43IDE2LjM1IDIyLjI1IDE1LjlRMjEuOCAxNS40NSAyMS44IDE0LjhRMjEuOCAxNC4xNSAyMi4yNSAxMy43TDI1LjEgMTAuODVIMjQuMVExNy43NSAxMC44NSAxMy40MjUgMTUuMTc1UTkuMSAxOS41IDkuMSAyNS44NVE5LjEgMzEuMzUgMTIuMzUgMzUuMzc1UTE1LjYgMzkuNCAyMC42NSA0MC43UTIxLjE1IDQwLjggMjEuNSA0MS4yMjVRMjEuODUgNDEuNjUgMjEuODUgNDIuMlEyMS44NSA0Mi45NSAyMS4zIDQzLjRRMjAuNzUgNDMuODUgMjAuMDUgNDMuN1pcIi8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgIDwhLS1mbGlwIHZlcnRpY2FsLS0+XG4gICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiZmxpcEgoKVwiIHRpdGxlPVwiRmxpcCBIb3Jpem9udGFsXCI+XG4gICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDQ4IDQ4XCI+XG4gICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgZD1cIk05IDQyUTcuOCA0MiA2LjkgNDEuMVE2IDQwLjIgNiAzOVY5UTYgNy44IDYuOSA2LjlRNy44IDYgOSA2SDE4LjFRMTguNzUgNiAxOS4xNzUgNi40MjVRMTkuNiA2Ljg1IDE5LjYgNy41UTE5LjYgOC4xNSAxOS4xNzUgOC41NzVRMTguNzUgOSAxOC4xIDlIOVE5IDkgOSA5UTkgOSA5IDlWMzlROSAzOSA5IDM5UTkgMzkgOSAzOUgxOC4xUTE4Ljc1IDM5IDE5LjE3NSAzOS40MjVRMTkuNiAzOS44NSAxOS42IDQwLjVRMTkuNiA0MS4xNSAxOS4xNzUgNDEuNTc1UTE4Ljc1IDQyIDE4LjEgNDJaTTI0LjEgNDZRMjMuNDUgNDYgMjMuMDI1IDQ1LjU3NVEyMi42IDQ1LjE1IDIyLjYgNDQuNVYzLjVRMjIuNiAyLjg1IDIzLjAyNSAyLjQyNVEyMy40NSAyIDI0LjEgMlEyNC43NSAyIDI1LjE3NSAyLjQyNVEyNS42IDIuODUgMjUuNiAzLjVWNDQuNVEyNS42IDQ1LjE1IDI1LjE3NSA0NS41NzVRMjQuNzUgNDYgMjQuMSA0NlpNMzkgOUgzOC4zVjZIMzlRNDAuMiA2IDQxLjEgNi45UTQyIDcuOCA0MiA5VjkuN0gzOVpNMzkgMjYuNzVWMjEuMjVINDJWMjYuNzVaTTM5IDQySDM4LjNWMzlIMzlWMzguM0g0MlYzOVE0MiA0MC4yIDQxLjEgNDEuMVE0MC4yIDQyIDM5IDQyWk0zOSAxOC4yNVYxMi43SDQyVjE4LjI1Wk0zOSAzNS4zVjI5Ljc1SDQyVjM1LjNaTTI4LjYgNDJWMzlIMzUuM1Y0MlpNMjguNiA5VjZIMzUuM1Y5WlwiLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgPCEtLWZsaXAgaG9yaXpvbnRhbC0tPlxuICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cImZsaXBWKClcIiB0aXRsZT1cIkZsaXAgVmVydGljYWxcIj5cbiAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgNDggNDhcIiB0cmFuc2Zvcm09J3JvdGF0ZSg5MCknPlxuICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgIGQ9XCJNOSA0MlE3LjggNDIgNi45IDQxLjFRNiA0MC4yIDYgMzlWOVE2IDcuOCA2LjkgNi45UTcuOCA2IDkgNkgxOC4xUTE4Ljc1IDYgMTkuMTc1IDYuNDI1UTE5LjYgNi44NSAxOS42IDcuNVExOS42IDguMTUgMTkuMTc1IDguNTc1UTE4Ljc1IDkgMTguMSA5SDlROSA5IDkgOVE5IDkgOSA5VjM5UTkgMzkgOSAzOVE5IDM5IDkgMzlIMTguMVExOC43NSAzOSAxOS4xNzUgMzkuNDI1UTE5LjYgMzkuODUgMTkuNiA0MC41UTE5LjYgNDEuMTUgMTkuMTc1IDQxLjU3NVExOC43NSA0MiAxOC4xIDQyWk0yNC4xIDQ2UTIzLjQ1IDQ2IDIzLjAyNSA0NS41NzVRMjIuNiA0NS4xNSAyMi42IDQ0LjVWMy41UTIyLjYgMi44NSAyMy4wMjUgMi40MjVRMjMuNDUgMiAyNC4xIDJRMjQuNzUgMiAyNS4xNzUgMi40MjVRMjUuNiAyLjg1IDI1LjYgMy41VjQ0LjVRMjUuNiA0NS4xNSAyNS4xNzUgNDUuNTc1UTI0Ljc1IDQ2IDI0LjEgNDZaTTM5IDlIMzguM1Y2SDM5UTQwLjIgNiA0MS4xIDYuOVE0MiA3LjggNDIgOVY5LjdIMzlaTTM5IDI2Ljc1VjIxLjI1SDQyVjI2Ljc1Wk0zOSA0MkgzOC4zVjM5SDM5VjM4LjNINDJWMzlRNDIgNDAuMiA0MS4xIDQxLjFRNDAuMiA0MiAzOSA0MlpNMzkgMTguMjVWMTIuN0g0MlYxOC4yNVpNMzkgMzUuM1YyOS43NUg0MlYzNS4zWk0yOC42IDQyVjM5SDM1LjNWNDJaTTI4LjYgOVY2SDM1LjNWOVpcIi8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJyZXNldCgpXCIgdGl0bGU9XCJSZXNldFwiPlxuICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCA0OCA0OFwiPlxuICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgIGQ9XCJNOS44IDMxLjQ1UTguOCAyOS42NSA4LjQgMjcuODI1UTggMjYgOCAyNC4xUTggMTcuNTUgMTIuNzI1IDEyLjgyNVExNy40NSA4LjEgMjQgOC4xSDI2LjE1TDIyLjE1IDQuMUwyNC4xIDIuMTVMMzEuNTUgOS42TDI0LjEgMTcuMDVMMjIuMSAxNS4wNUwyNi4wNSAxMS4xSDI0UTE4LjY1IDExLjEgMTQuODI1IDE0LjkyNVExMSAxOC43NSAxMSAyNC4xUTExIDI1LjU1IDExLjI3NSAyNi44NVExMS41NSAyOC4xNSAxMS45NSAyOS4zWk0yMy44IDQ2IDE2LjM1IDM4LjU1IDIzLjggMzEuMSAyNS43NSAzMy4wNSAyMS43NSAzNy4wNUgyNFEyOS4zNSAzNy4wNSAzMy4xNzUgMzMuMjI1UTM3IDI5LjQgMzcgMjQuMDVRMzcgMjIuNiAzNi43NSAyMS4zUTM2LjUgMjAgMzYgMTguODVMMzguMTUgMTYuN1EzOS4xNSAxOC41IDM5LjU3NSAyMC4zMjVRNDAgMjIuMTUgNDAgMjQuMDVRNDAgMzAuNiAzNS4yNzUgMzUuMzI1UTMwLjU1IDQwLjA1IDI0IDQwLjA1SDIxLjc1TDI1Ljc1IDQ0LjA1WlwiLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cIm5neC1wZS1kaWFsb2ctZm9vdGVyXCI+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwibmd4LXBlLWJ0biBuZ3gtcGUtYnRuLW91dGxpbmUtbGlnaHRcIiAoY2xpY2spPVwiY2xvc2UoKVwiPnt7Y2xvc2VCdG5UZXh0fX08L2J1dHRvbj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJuZ3gtcGUtYnRuIG5neC1wZS1idG4tcHJpbWFyeVwiIFtkaXNhYmxlZF09XCJpc1Byb2Nlc3NpbmdcIiAoY2xpY2spPVwiZXhwb3J0KClcIj57e2FwcGx5QnRuVGV4dH19PC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=