stimulsoft-forms
Version:
Stimulsoft PDF Forms
858 lines • 140 kB
JavaScript
import { Component, ViewChild } from "@angular/core";
import Color from "../../system/Color";
import { StiTextItem } from "../../elements/text/StiTextItem";
import { StiHorizontalAlignment } from "../../system/enums";
import { Enum } from "../../system/Enum";
import { StiImageEditorResult } from "../../elements/signature/StiImageEditorResult";
import * as i0 from "@angular/core";
import * as i1 from "../../services/model.service";
import * as i2 from "../../services/sti-localization.service";
import * as i3 from "../../services/mouse.service";
import * as i4 from "../../services/sti-signature.service";
import * as i5 from "../../services/sti-draggable-modal-window.service";
import * as i6 from "../../services/sti-color-dialog.service";
import * as i7 from "@angular/common";
import * as i8 from "@angular/forms";
import * as i9 from "../sti-tooltip/sti-tooltip.directive";
export class StiElectronicSignatureEditorComponent {
get brushColor() {
return this.signatureService?.currentEditableSignatureElement?.penColor
? this.signatureService?.currentEditableSignatureElement?.penColor
: Color.black();
}
constructor(model, loc, mouseService, signatureService, modalWindowService, colorService) {
this.model = model;
this.loc = loc;
this.mouseService = mouseService;
this.signatureService = signatureService;
this.modalWindowService = modalWindowService;
this.colorService = colorService;
this.drawingMode = false;
this.isDrawing = false;
this.defaultPreviewText = "FullName FN";
}
get hasTemplates() {
return this.signatureService.savedTemplates.length > 0;
}
get insertedText() {
return this.signatureService.currentEditableText;
}
get insertedImage() {
return this.signatureService.currentEditableImage;
}
get fullName() {
return this.signatureService.currentEditableFullName;
}
set fullName(value) {
this.signatureService.currentEditableFullName = value;
}
get initials() {
return this.signatureService.currentEditableInitials;
}
set initials(value) {
this.signatureService.currentEditableInitials = value;
}
isEmptyContent() {
if (this.signatureService.selectedMode == "Draw") {
return (!this.signatureService.currentEditableImage?.loadedImage &&
!this.signatureService.currentEditableText?.value &&
!this.signatureService.currentCanvasContent);
}
else {
return !this.signatureService.currentEditableFullName && !this.signatureService.currentEditableInitials;
}
}
saveTemplate() {
if (this.signatureService.selectedMode == "Draw") {
let imageObj = {
type: "Image",
image: this.signatureService.currentEditableImage,
text: this.signatureService.currentEditableText,
drawedImage: this.signatureService.currentCanvasContent,
};
if (!this.signatureService.savedTemplates.find((item) => item == imageObj)) {
this.signatureService.savedTemplates.push(imageObj);
}
}
else {
let textObj = {
type: "Text",
fullName: this.signatureService.currentEditableFullName,
initials: this.signatureService.currentEditableInitials,
specialFont: this.signatureService.currentPreviewFont,
};
if (!this.signatureService.savedTemplates.find((item) => item == textObj)) {
this.signatureService.savedTemplates.push(textObj);
}
}
localStorage.removeItem("StiSignatureTemplates");
localStorage.setItem("StiSignatureTemplates", JSON.stringify(this.signatureService.savedTemplates));
}
showSavedTemplatesPreview(button) {
let buttonRect = this.model.getPositionRelativeToForm(button);
this.signatureService.templatesPreviewX = buttonRect.right - 335;
this.signatureService.templatesPreviewY = buttonRect.bottom + 1;
this.signatureService.showSavedTemplates = !this.signatureService.showSavedTemplates;
}
ngOnDestroy() {
this.signatureService.currentEditableText = new StiTextItem();
this.signatureService.currentCanvasContent = null;
this.signatureService.currentEditableImage = new StiImageEditorResult();
this.signatureService.currentEditableSignatureElement = null;
}
isCanvasBlank(canvas) {
const context = canvas.getContext("2d");
const pixelBuffer = new Uint32Array(context.getImageData(0, 0, canvas.width, canvas.height).data.buffer);
return !pixelBuffer.some((color) => color !== 0);
}
ngAfterViewInit() {
const onResize = (event) => {
this.signatureService.editorComponentX = (window.innerWidth - this.signatureService.editorComponentWidth) / 2;
this.signatureService.editorComponentY = (window.innerHeight - this.signatureService.editorComponentHeight) / 2;
};
window.addEventListener("resize", onResize);
this.fillDrawingCanvas();
}
get image() {
return "url(" + this.insertedImage?.loadedImage + ")";
}
getHorizontalAlignment() {
if (this.insertedImage?.horizontalAlignment == StiHorizontalAlignment.Center) {
return "center";
}
else if (this.insertedImage?.horizontalAlignment == StiHorizontalAlignment.Left) {
return "start";
}
else {
return "end";
}
}
onMouseDown(event, canvasElement) {
if (this.drawingMode) {
event.preventDefault();
event.stopPropagation();
this.isDrawing = true;
this.context = canvasElement?.getContext("2d");
this.context.strokeStyle = this.brushColor.toHtmlColor();
const coords = this.relativeCoords(event, canvasElement);
this.context.moveTo(coords.x, coords.y);
}
}
relativeCoords(event, canvasElement) {
const bounds = this.model.getPositionRelativeToForm(canvasElement);
const x = (event.clientX - bounds.left) / this.model.zoom;
const y = (event.clientY - bounds.top) / this.model.zoom;
return { x: x, y: y };
}
onCanvasMove(event, canvasElement) {
if (this.isDrawing) {
const coords = this.relativeCoords(event, canvasElement);
this.context.lineTo(coords.x, coords.y);
this.context.stroke();
}
}
getBackgroundSize(container) {
if (!this.insertedImage?.loadedImage) {
return;
}
if (this.insertedImage?.aspectRatio && this.insertedImage?.stretch) {
return "contain";
}
if (this.insertedImage?.stretch) {
return `${container.offsetWidth}px ${container.offsetHeight}px`;
}
else {
return `${this.insertedImage?.naturalWidth}px ${this.insertedImage?.naturalHeight}px`;
}
}
getBackgroundPosition() {
if (this.insertedImage?.stretch && !this.insertedImage?.aspectRatio) {
return `center`;
}
else {
return `${this.signatureService.getVerticalPosition(this.insertedImage?.verticalAlignment)} ${this.signatureService.getHorizontalPosition(this.insertedImage?.horizontalAlignment)}`;
}
}
get previewText() {
return (this.fullName + " " + this.initials).length > 1
? this.fullName + " " + this.initials
: this.defaultPreviewText;
}
get alignment() {
if (this.insertedText.horizontalAlignment == StiHorizontalAlignment.Center) {
return "center";
}
else if (this.insertedText.horizontalAlignment == StiHorizontalAlignment.Right) {
return "end";
}
else {
return "start";
}
}
clear() {
this.signatureService.currentEditableText.value = "";
if (this.signatureService?.currentEditableImage?.loadedImage) {
this.signatureService.currentEditableImage.loadedImage = "";
}
if (!this.context) {
this.context = this.canvas?.nativeElement?.getContext("2d");
}
this.signatureService.currentCanvasContent = "";
this.context?.clearRect(0, 0, this.canvas?.nativeElement?.width, this.canvas?.nativeElement?.height);
this.context?.beginPath();
}
showEditor(editorType) {
this.model.showDraggableModalWindow = true;
if (editorType == "Text") {
this.modalWindowService.isTextEditor = true;
this.signatureService.currentEditableText = this.insertedText;
}
else {
this.modalWindowService.isImageEditor = true;
this.signatureService.currentEditableImage = this.insertedImage;
}
}
showColorPicker(element, object, isRichText = false) {
this.colorService.openDialog(element, object, isRichText);
}
fillDrawingCanvas() {
let ctx = this.canvas?.nativeElement?.getContext("2d");
if (ctx && this.signatureService.currentCanvasContent) {
ctx.clearRect(0, 0, this.canvas?.nativeElement?.width, this.canvas?.nativeElement?.height);
let image = new Image();
image.onload = () => {
ctx.drawImage(image, 0, 0, this.canvas?.nativeElement?.width, this.canvas?.nativeElement?.height);
};
image.src = this.signatureService.currentCanvasContent;
}
}
showFontsPreview(element) {
this.signatureService.showFontsPreview = !this.signatureService.showFontsPreview;
let rect = this.model.getPositionRelativeToForm(element);
this.signatureService.fontsPreviewX = rect.right - 200;
this.signatureService.fontsPreviewY = rect.bottom + 2;
}
acceptChanges() {
this.signatureService.currentActiveLoadingImages = 0;
this.signatureService.completedLoadingImages = 0;
this.signatureService.currentEditableSignatureElement.fullName = this.signatureService.currentEditableFullName;
this.signatureService.currentEditableSignatureElement.initials = this.signatureService.currentEditableInitials;
this.signatureService.currentEditableSignatureElement.specialFont = this.signatureService.currentPreviewFont;
let canvasRect = this.model.getPositionRelativeToForm(this.canvas?.nativeElement);
if (canvasRect && this.signatureService.selectedMode == "Draw") {
let resultCanvas = document.createElement("canvas");
this.canvasWidth = canvasRect.width;
this.canvasHeight = canvasRect.height;
resultCanvas.width = this.canvasWidth;
resultCanvas.height = this.canvasHeight;
let ctx = resultCanvas.getContext("2d");
this.resultCanvasContext = ctx;
this.insertedImageLayer = this.createLayer(resultCanvas);
this.insertedTextLayer = this.createLayer(resultCanvas);
this.drawedLayer = this.createLayer(resultCanvas);
if (this.insertedImage?.loadedImage) {
this.fillLayer(this.insertedImageLayer, this.insertedImage);
}
if (this.insertedText?.value) {
this.fillLayer(this.insertedTextLayer, this.insertedText);
}
if (!this.isCanvasBlank(this.canvas?.nativeElement)) {
this.fillLayer(this.drawedLayer, this.canvas?.nativeElement?.toDataURL("image/png"));
}
else {
this.signatureService.currentCanvasContent = "";
}
this.signatureService.checkLoading();
}
else {
this.updateResultCanvas("Text");
}
if (this.signatureService.selectedMode == "Draw") {
this.signatureService.currentEditableSignatureElement.currentSignatureMode = "Draw";
}
else {
this.signatureService.currentEditableSignatureElement.currentSignatureMode = "Type";
}
}
createLayer(canvas) {
let layer = document.createElement("canvas");
layer.width = canvas.width;
layer.height = canvas.height;
return layer.getContext("2d");
}
drawLayer(context, layer) {
if (layer) {
context.drawImage(layer.canvas, 0, 0);
}
}
fillLayer(layer, content) {
if (content instanceof StiTextItem) {
if (content.value) {
layer.font = `${content.font.isItalic() ? "italic " : ""}${content.font.isBold() ? "bold " : ""}${content.font.size + "px "}${content.font.family}`;
layer.textBaseline = "center";
layer.textAlign = Enum.getName(StiHorizontalAlignment, content.horizontalAlignment).toLocaleLowerCase();
layer.fillText(content.value, Enum.getName(StiHorizontalAlignment, content.horizontalAlignment).toLocaleLowerCase() == "left"
? 0
: Enum.getName(StiHorizontalAlignment, content.horizontalAlignment).toLocaleLowerCase() == "center"
? this.canvasWidth / 2
: this.canvasWidth - layer.measureText(content.value).width, this.canvasHeight / 2);
}
}
else if (content?.loadedImage) {
this.signatureService.currentActiveLoadingImages += 1;
let image = new Image();
image.onload = () => {
if (content?.aspectRatio && content?.stretch) {
let hRatio = this.canvasWidth / image.naturalWidth;
let vRatio = this.canvasHeight / image.naturalHeight;
let ratio = Math.min(hRatio, vRatio);
let centerShiftX = (this.canvasWidth - image.naturalWidth * ratio) / 2;
let centerShiftY = (this.canvasHeight - image.naturalHeight * ratio) / 2;
layer.drawImage(image, 0, 0, image.naturalWidth, image.naturalHeight, centerShiftX, centerShiftY, image.naturalWidth * ratio, image.naturalHeight * ratio);
this.signatureService.completedLoadingImages += 1;
}
else {
layer.drawImage(image, 0, 0, content.stretch ? this.canvasWidth : image.naturalWidth, content.stretch ? this.canvasHeight : image.naturalHeight);
this.signatureService.completedLoadingImages += 1;
}
};
image.src = content.loadedImage;
}
else {
if (typeof content === "string") {
this.signatureService.currentActiveLoadingImages += 1;
let image = new Image();
image.onload = () => {
layer.drawImage(image, 0, 0, this.canvasWidth, this.canvasHeight);
this.signatureService.completedLoadingImages += 1;
};
image.src = content;
}
}
}
changeMode(mode) {
this.signatureService.selectedMode = mode;
if (mode == "Draw") {
setTimeout(() => {
this.fillDrawingCanvas();
});
}
}
updateResultCanvas(type = "Draw") {
if (type == "Draw") {
this.drawLayer(this.resultCanvasContext, this.insertedImageLayer);
this.drawLayer(this.resultCanvasContext, this.insertedTextLayer);
this.drawLayer(this.resultCanvasContext, this.drawedLayer);
// console.log(this.resultCanvasContext.canvas.toDataURL("image/png"));
if (this.resultCanvasContext?.canvas?.toDataURL("image/png")) {
this.signatureService.currentEditableSignatureElement.backgroundImage =
this.resultCanvasContext.canvas.toDataURL("image/png");
}
this.signatureService.currentEditableSignatureElement.insertedImage = this.signatureService.currentEditableImage;
this.signatureService.currentEditableSignatureElement.insertedText = this.signatureService.currentEditableText;
if (this.signatureService.currentCanvasContent) {
this.signatureService.currentEditableSignatureElement.drawedImage = this.signatureService.currentCanvasContent;
}
else {
this.signatureService.currentEditableSignatureElement.drawedImage = "";
}
}
this.signatureService.currentEditableSignatureElement.isSigned = true;
this.model.showSignatureEditor = false;
// this.signatureService.currentSignatureElement = null;
}
onMouseMove(event) {
if (this.isDragging) {
let deltaX = event.clientX - this.startX;
let deltaY = event.clientY - this.startY;
if (this.startComponentX + deltaX < 0) {
this.signatureService.editorComponentX = 0;
}
else if (this.startComponentX + deltaX > window.innerWidth - this.signatureService.editorComponentWidth) {
this.signatureService.editorComponentX = window.innerWidth - this.signatureService.editorComponentWidth;
}
else {
this.signatureService.editorComponentX = this.startComponentX + deltaX;
}
if (this.startComponentY + deltaY < 0) {
this.signatureService.editorComponentY = 0;
}
else if (this.startComponentY + deltaY > window.innerHeight - this.signatureService.editorComponentHeight) {
this.signatureService.editorComponentY = window.innerHeight - this.signatureService.editorComponentHeight;
}
else {
this.signatureService.editorComponentY = this.startComponentY + deltaY;
}
}
}
startDrag(event) {
this.startX = event.clientX;
this.startY = event.clientY;
this.startComponentX = this.signatureService.editorComponentX;
this.startComponentY = this.signatureService.editorComponentY;
this.isDragging = true;
}
ngOnInit() {
this.drawingMode = true;
if (localStorage.getItem("StiSignatureTemplates")) {
this.signatureService.savedTemplates = JSON.parse(localStorage.getItem("StiSignatureTemplates"));
}
this.signatureService.editorComponentX = (window.innerWidth - this.signatureService.editorComponentWidth) / 2;
this.signatureService.editorComponentY = (window.innerHeight - this.signatureService.editorComponentHeight) / 2;
this.updateSignatureSubscription = this.signatureService.updateSignature.subscribe((event) => {
if (event.type == "Text") {
this.signatureService.currentEditableText = event.value;
}
else if (event.type == "Image") {
this.signatureService.currentEditableImage = event.value;
}
});
this.updateResultCanvasSubscription = this.signatureService.completedLoading.subscribe(() => {
this.updateResultCanvas();
});
this.mouseUpSubscription = this.mouseService.getDocumentMouseUp().subscribe(() => {
if (this.isDrawing && !this.isCanvasBlank(this.canvas?.nativeElement)) {
this.signatureService.currentCanvasContent = this.canvas?.nativeElement?.toDataURL("image/png");
}
this.isDragging = false;
this.isDrawing = false;
});
this.mouseMoveSubscription = this.mouseService.getDocumentMouseMove().subscribe((event) => {
this.onMouseMove(event);
});
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: StiElectronicSignatureEditorComponent, deps: [{ token: i1.StiModelService }, { token: i2.StiLocalizationService }, { token: i3.StiMouseService }, { token: i4.SignatureService }, { token: i5.StiDraggableModalWindowService }, { token: i6.StiColorDialogService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: StiElectronicSignatureEditorComponent, selector: "sti-electronic-signature-editor", viewQueries: [{ propertyName: "canvas", first: true, predicate: ["canvas"], descendants: true }], ngImport: i0, template: `<div
class="editor-container"
[style.left.px]="signatureService.editorComponentX"
[style.top.px]="signatureService.editorComponentY"
>
<div class="editor-navbar" (mousedown)="startDrag($event)">
<span [style.flex]="1">{{ loc.get2("Components", "StiSignature") }}</span>
<div class="close-button" (click)="model.showSignatureEditor = false">
<img [src]="model.getImage('images.Other.CloseForm.png')" />
</div>
</div>
<div class="content-container">
<div class="content-navigation">
<div
class="navigation-button {{ signatureService.selectedMode == 'Type' ? 'current' : '' }}"
(click)="changeMode('Type')"
>
<div class="navigation-label">
<span>{{ loc.get2("PropertyEnum", "StiSignatureTypeType") }}</span>
</div>
<div class="indicator {{ signatureService.selectedMode == 'Type' ? 'current-indicator' : '' }}"></div>
</div>
<div
class="navigation-button {{ signatureService.selectedMode == 'Draw' ? 'current' : '' }}"
(click)="changeMode('Draw')"
>
<div class="navigation-label">
<span>{{ loc.get2("PropertyEnum", "StiSignatureTypeDraw") }}</span>
</div>
<div class="indicator {{ signatureService.selectedMode == 'Draw' ? 'current-indicator' : '' }}"></div>
</div>
<div class="templates-navigation-container">
<div (click)="saveTemplate()" class="template-navigation-button {{ isEmptyContent() ? 'disabled' : '' }}">
<img [src]="model.getImage('signature.StiSignatureSave.png')" />
</div>
<div
#button
(click)="showSavedTemplatesPreview(button)"
class="template-navigation-button show-button"
[style.width.px]="38"
>
<img [src]="model.getImage('signature.StiSignatureOpen.png')" /><i class="pi pi-chevron-down"></i>
</div>
</div>
</div>
<div class="bottom-divider"></div>
<div class="type-container" *ngIf="signatureService.selectedMode == 'Type'">
<div class="input-field">
<span>{{ loc.getP("FullName") }}</span
><input type="text" [(ngModel)]="fullName" />
</div>
<div class="input-field">
<span>{{ loc.getP("Initials") }}</span
><input type="text" [(ngModel)]="initials" />
</div>
<div class="button-panel">
<div #selectButton class="select-button" (click)="showFontsPreview(selectButton)">
<span class="button-label">{{ loc.get2("ChartRibbon", "Style") }}</span
><i class="pi pi-chevron-down"></i>
</div>
</div>
<div class="preview-panel" [style.font-family]="signatureService.currentPreviewFont">
<span>{{ previewText }}</span>
</div>
</div>
<div class="draw-container" *ngIf="signatureService.selectedMode == 'Draw'">
<div class="draw-buttons-panel">
<div
class="button-container {{ drawingMode ? 'active' : '' }}"
[stiTooltip]="loc.getP('ForeColor')"
tooltipPosition="bottom"
showDelay="500"
(mousedown)="$event.preventDefault()"
#fontColorEditor
>
<div class="preview-container" (click)="drawingMode = !drawingMode">
<div class="foreground" [style]="{ backgroundPosition: 'center', backgroundRepeat: 'no-repeat' }">
<img [src]="model.getImage('images.Brush.png')" alt="" />
</div>
<span
class="color-preview"
[style.background-color]="brushColor != null ? brushColor?.toHtmlColor() : 'rgb(182, 181, 180)'"
></span>
</div>
<div
(click)="showColorPicker(fontColorEditor, brushColor)"
[style]="{ position: 'relative', display: 'flex', alignItems: 'center' }"
>
<i class="pi pi-chevron-down"></i>
</div>
</div>
<div class="draw-panel-button" (click)="showEditor('Text')">
<img [src]="model.getImage('signature.Text.png')" />
</div>
<div class="draw-panel-button" (click)="showEditor('Image')">
<img [src]="model.getImage('images.Toolbox.StiImageElement.png')" />
</div>
<div class="draw-panel-button" (click)="clear()">
<img [src]="model.getImage('images.Page.ClearContent.png')" />
</div>
</div>
<div class="draw-panel" #previewContainer>
<div class="canvas-container">
<canvas
[width]="previewContainer.clientWidth"
[height]="previewContainer.clientHeight"
(mousedown)="onMouseDown($event, canvas)"
(mousemove)="onCanvasMove($event, canvas)"
#canvas
>
</canvas>
</div>
<div class="preview-inserted-text" [style]="insertedText.htmlStyle()" [style.justify-content]="alignment">
<span>{{ insertedText.value }}</span>
</div>
<div class="inserted-image-container" [style.justify-content]="getHorizontalAlignment()">
<div
class="preview-inserted-image"
[style.width.px]="
insertedImage?.aspectRatio && insertedImage?.stretch
? previewContainer.clientHeight
: previewContainer.clientWidth
"
[style.height.px]="previewContainer.clientHeight"
[style.background-image]="image"
[style.background-position]="getBackgroundPosition()"
[style.background-size]="getBackgroundSize(previewContainer)"
[style.background-repeat]="image ? 'no-repeat' : ''"
></div>
</div>
<div class="signature-description">
<span>{{ "Signature" }}</span>
</div>
</div>
</div>
</div>
<div class="setup-accept">
<div class="accept button" (click)="acceptChanges()">
<span [style.margin-left.px]="0">{{
model.previewMode
? loc.get2("Buttons", "Sign")
: loc.get2("Buttons", "Save").replace("&", "").replace(";", "")
}}</span>
</div>
<div class="cancel button" (click)="model.showSignatureEditor = false">
<span [style.margin-left.px]="0">{{ loc.getP("Cancel") }}</span>
</div>
</div>
</div>
<div
class="fonts-preview-container"
*ngIf="signatureService.showFontsPreview"
[style.left.px]="signatureService.fontsPreviewX"
[style.top.px]="signatureService.fontsPreviewY"
>
<div
*ngFor="let font of signatureService.previewFonts"
class="font-preview"
[style.font-family]="font"
(click)="signatureService.currentPreviewFont = font; signatureService.showFontsPreview = false"
>
<div class="vertical-line {{ signatureService.currentPreviewFont == font ? 'current-indicator' : '' }}"></div>
<span> {{ previewText }}</span>
</div>
</div>
<div
*ngIf="signatureService.showSavedTemplates"
class="saved-templates-container"
[style.left.px]="signatureService.templatesPreviewX"
[style.top.px]="signatureService.templatesPreviewY"
[style.overflow-y]="hasTemplates ? 'scroll' : 'hidden'"
>
<div class="empty-container" *ngIf="!hasTemplates">
<span>{{ "No saved items" }}</span>
</div>
<div
class="template-item"
*ngFor="let temp of signatureService.savedTemplates; let i = index"
[style.margin-top.px]="i == 0 ? 6 : 0"
(click)="signatureService.setTemplate(temp)"
>
<div class="delete-button" (click)="signatureService.deleteTemplate(i)">
<img [src]="model.getImage('images.Other.CloseForm.png')" />
</div>
<div
class="image-template"
*ngIf="temp.type == 'Image'"
#parentContainer
[style.justify-content]="signatureService.getTemplateHorizontalAlignment(temp)"
>
<div
class="loadedImage image-content"
[style.background-image]="signatureService.getTemplateImage(temp)"
[style.background-position]="signatureService.getTemplateBackgroundPosition(temp)"
[style.background-size]="signatureService.getTemplateBackgroundSize(temp, parentContainer)"
[style.background-repeat]="'no-repeat'"
></div>
<div class="insertedText image-content">
<span [style]="temp.text.htmlStyle()">{{ temp?.text?.value }}</span>
</div>
<div
class="drawedImage image-content"
[style.background-size]="'contain'"
[style.background-image]="signatureService.getTemplateDrawedImage(temp)"
></div>
</div>
<div class="text-template" *ngIf="temp.type == 'Text'">
<span [style.font-family]="temp.specialFont" [style.font-size.pt]="16">{{
temp.fullName + " " + temp.initials
}}</span>
</div>
</div>
</div>`, isInline: true, styles: [".image-content{height:100%;width:100%;top:0;left:0;position:absolute}.drawedImage{z-index:3}.loadedImage{z-index:1}.insertedText{z-index:2;display:flex;align-items:center;justify-content:center}.text-template{display:flex;align-items:center;justify-content:center;height:50px}.image-template{position:relative;height:130px}.template-item{width:calc(100% - 12px);height:fit-content;padding:2px;margin:0 6px 6px;border:1px solid lightgray;border-radius:3px;position:relative}.delete-button{position:absolute;z-index:999;right:0;top:0;width:20px;height:20px;display:flex;align-items:center;justify-content:center;border-radius:3px}.delete-button img{height:16px;width:16px}.delete-button:hover img{filter:saturate(500%) contrast(100%) brightness(900%) invert(900%) sepia(50%)}.template-item:hover{background-color:#d7d7d7;cursor:pointer}.empty-container{height:100%;width:100%;background-color:#fafafa;display:flex;align-items:center;justify-content:center;color:#454545;font-size:13px;font-family:Arial}.saved-templates-container{position:absolute;overflow-x:hidden;overflow-y:scroll;width:335px;height:270px;border-radius:3px;-moz-box-shadow:0px 0px 7px rgba(0,0,0,.6);-webkit-box-shadow:0px 0px 7px rgb(0 0 0 / 60%);box-shadow:0 0 7px #0000004d;border:1px solid rgb(25,71,138);display:flex;flex-direction:column;background-color:#fff;z-index:99999999999999999}.active{background-color:#d3d3d3;outline:1px solid rgb(61,107,186)}.canvas-container{position:absolute;left:0;top:0;height:100%;width:100%;z-index:99999}.preview-inserted-image{position:absolute}.inserted-image-container{position:absolute;left:0;top:0;display:flex;height:100%;width:100%}.preview-inserted-text{position:absolute;height:100%;width:100%;display:flex;align-items:center;justify-content:center;z-index:999}.signature-content{z-index:9999;height:100%;width:100%}.signature-description{width:calc(100% - 10px);height:50px;margin:0 5px;padding:0 5px;border-top:1px solid lightgray;display:flex;align-items:center;overflow:hidden;z-index:999}.disabled{pointer-events:none;opacity:.5}.preview-container{display:flex;width:100%;position:relative;flex-direction:column}.preview-container img{height:16px;width:16px}.button-container{display:flex;height:26px;width:40px;position:relative;margin-right:5px;border-radius:3px}.button-container:hover{background-color:#d3d3d3}.button-container:active{background-color:var(--columnDeleteHover-color)}.color-preview{width:20px;height:5px;margin-left:4px}i{height:12px;width:12px;right:3px;top:50%;vertical-align:middle;color:var(--text-color)}.button-container:hover i{color:#fff}.foreground{margin-left:8px;margin-top:2px;width:16px;height:16px}.template-navigation-button{height:26px;width:26px;margin-right:2px;border-radius:3px;display:flex;align-items:center;justify-content:center}.template-navigation-button:hover{background-color:#d3d3d3}.template-navigation-button img{height:16px;width:16px}.templates-navigation-container{width:100%;display:flex;align-items:center;justify-content:flex-end}.vertical-line{width:3px;height:calc(100% - 14px);margin:7px 10px 7px 5px}.font-preview{font-size:16px;height:42px;display:flex;align-items:center;padding-left:5px;border-radius:3px;margin:1px}.font-preview:hover{background-color:#dadada}.fonts-preview-container{position:absolute;width:200px;height:134px;z-index:9999999999;padding:1px;border-radius:3px;border:1px solid #c6c6c6;background:#fff;color:#444;-moz-box-shadow:0px 0px 7px rgba(0,0,0,.6);-webkit-box-shadow:0px 0px 7px rgba(0,0,0,.6);box-shadow:0 0 7px #0000004d;cursor:default}.draw-buttons-panel{height:26px;margin-bottom:5px;margin-top:10px;display:flex;padding-left:24px}.draw-panel-button:hover{background-color:#d3d3d3}.draw-panel-button{height:26px;width:26px;margin-right:5px;border-radius:3px;display:flex;align-items:center;justify-content:center}.draw-panel-button img{height:16px;width:16px}.draw-panel{border:1px dashed #ababab;border-radius:3px;margin:0 24px;width:calc(100% - 48px);height:186px;display:flex;flex-direction:column-reverse;position:relative}i{margin-left:5px;font-size:7px;padding-top:4px}.select-button{border:1px solid #dddddd;border-radius:3px;min-width:30px;padding-left:10px;padding-right:6px;display:flex;color:#444;align-items:center;margin-right:24px;margin-top:24px;height:24px}.select-button:hover{background-color:#d3d3d3}.button-panel{width:100%;display:flex;justify-content:flex-end}.preview-panel{height:80px;width:calc(100% - 48px);border:1px solid #ababab;border-radius:3px;font-size:16pt;margin:10px 24px;padding-left:12px;display:flex;align-items:center;overflow:hidden}.input-field{width:calc(100% - 24px);display:flex;margin:12px 12px 6px;padding:0 12px;align-items:center}.input-field span{min-width:100px;font-size:12px}.input-field input{border-radius:3px;padding-left:5px;height:24px;outline:none;border:1px solid lightgray;width:100%}.input-field input:hover{border-color:#454545}.current-indicator{background-color:#19478a}.other-indicator{background-color:transparent}.current{background-color:#e5e5e5}.navigation-button:hover{background-color:#dadada}.navigation-button{border-radius:3px;height:26px;min-width:50px;display:flex;flex-direction:column;color:#444;font-size:12px;font-family:Arial;margin-right:2px}.navigation-label{height:27px;width:100%;height:18px;padding:0 10px;display:flex;align-items:center;justify-content:center;white-space:nowrap}.navigation-label span{margin-top:7px}.indicator{height:3px;margin:1px 9px}.bottom-divider{height:1px;width:calc(100% - 24px);background-color:#d3d3d3;margin:5px 12px}.content-navigation{display:flex;padding:12px 12px 0}.content-container{height:100%;width:100%}.editor-navbar{display:flex;height:30px;border-top-left-radius:3px;border-top-right-radius:3px;background-color:#515c6a;-webkit-user-select:none;color:#fff;align-items:center}.editor-navbar span{font-size:13px;margin-left:10px}.close-button{height:30px;width:30px;border-radius:3px;display:flex;align-items:center;justify-content:center}.close-button:hover{background-color:#dadada}.close-button img{height:16px;width:16px;filter:brightness(0) invert(1)}.editor-container{background-color:var(--back-color);position:absolute;left:calc(50% - 182px);top:calc(50% - 175px);z-index:999;width:365px;height:350px;overflow:hidden;display:flex;flex-direction:column;-moz-box-shadow:0px 0px 7px rgba(0,0,0,.6);-webkit-box-shadow:0px 0px 7px rgb(0 0 0 / 60%);box-shadow:0 0 7px #0000004d;border:1px solid rgb(25,71,138);color:var(--text-color);font-size:12px;border-radius:5px;font-family:Arial;-webkit-user-select:none}.button{height:24px;width:80px;border-radius:3px;margin:3px 5px;display:flex;align-items:center;justify-content:center;border:1px solid transparent}.accept:active{background-color:#355da0;border-color:#264c7d}.cancel:active{background-color:#e2e2e2;border-color:#838383}.accept{background-color:#19478a;color:#fff}.accept:hover{background-color:#3d6298}.cancel{background-color:#ddd;color:#444}.cancel:hover{background-color:#d5d5d5}.setup-accept{padding:8px;display:flex;align-items:flex-end;justify-content:flex-end}\n"], dependencies: [{ kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i8.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i8.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i9.StiTooltipDirective, selector: "[stiTooltip]", inputs: ["tooltipPosition", "stiTooltip", "showDelay"] }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: StiElectronicSignatureEditorComponent, decorators: [{
type: Component,
args: [{ selector: "sti-electronic-signature-editor", template: `<div
class="editor-container"
[style.left.px]="signatureService.editorComponentX"
[style.top.px]="signatureService.editorComponentY"
>
<div class="editor-navbar" (mousedown)="startDrag($event)">
<span [style.flex]="1">{{ loc.get2("Components", "StiSignature") }}</span>
<div class="close-button" (click)="model.showSignatureEditor = false">
<img [src]="model.getImage('images.Other.CloseForm.png')" />
</div>
</div>
<div class="content-container">
<div class="content-navigation">
<div
class="navigation-button {{ signatureService.selectedMode == 'Type' ? 'current' : '' }}"
(click)="changeMode('Type')"
>
<div class="navigation-label">
<span>{{ loc.get2("PropertyEnum", "StiSignatureTypeType") }}</span>
</div>
<div class="indicator {{ signatureService.selectedMode == 'Type' ? 'current-indicator' : '' }}"></div>
</div>
<div
class="navigation-button {{ signatureService.selectedMode == 'Draw' ? 'current' : '' }}"
(click)="changeMode('Draw')"
>
<div class="navigation-label">
<span>{{ loc.get2("PropertyEnum", "StiSignatureTypeDraw") }}</span>
</div>
<div class="indicator {{ signatureService.selectedMode == 'Draw' ? 'current-indicator' : '' }}"></div>
</div>
<div class="templates-navigation-container">
<div (click)="saveTemplate()" class="template-navigation-button {{ isEmptyContent() ? 'disabled' : '' }}">
<img [src]="model.getImage('signature.StiSignatureSave.png')" />
</div>
<div
#button
(click)="showSavedTemplatesPreview(button)"
class="template-navigation-button show-button"
[style.width.px]="38"
>
<img [src]="model.getImage('signature.StiSignatureOpen.png')" /><i class="pi pi-chevron-down"></i>
</div>
</div>
</div>
<div class="bottom-divider"></div>
<div class="type-container" *ngIf="signatureService.selectedMode == 'Type'">
<div class="input-field">
<span>{{ loc.getP("FullName") }}</span
><input type="text" [(ngModel)]="fullName" />
</div>
<div class="input-field">
<span>{{ loc.getP("Initials") }}</span
><input type="text" [(ngModel)]="initials" />
</div>
<div class="button-panel">
<div #selectButton class="select-button" (click)="showFontsPreview(selectButton)">
<span class="button-label">{{ loc.get2("ChartRibbon", "Style") }}</span
><i class="pi pi-chevron-down"></i>
</div>
</div>
<div class="preview-panel" [style.font-family]="signatureService.currentPreviewFont">
<span>{{ previewText }}</span>
</div>
</div>
<div class="draw-container" *ngIf="signatureService.selectedMode == 'Draw'">
<div class="draw-buttons-panel">
<div
class="button-container {{ drawingMode ? 'active' : '' }}"
[stiTooltip]="loc.getP('ForeColor')"
tooltipPosition="bottom"
showDelay="500"
(mousedown)="$event.preventDefault()"
#fontColorEditor
>
<div class="preview-container" (click)="drawingMode = !drawingMode">
<div class="foreground" [style]="{ backgroundPosition: 'center', backgroundRepeat: 'no-repeat' }">
<img [src]="model.getImage('images.Brush.png')" alt="" />
</div>
<span
class="color-preview"
[style.background-color]="brushColor != null ? brushColor?.toHtmlColor() : 'rgb(182, 181, 180)'"
></span>
</div>
<div
(click)="showColorPicker(fontColorEditor, brushColor)"
[style]="{ position: 'relative', display: 'flex', alignItems: 'center' }"
>
<i class="pi pi-chevron-down"></i>
</div>
</div>
<div class="draw-panel-button" (click)="showEditor('Text')">
<img [src]="model.getImage('signature.Text.png')" />
</div>
<div class="draw-panel-button" (click)="showEditor('Image')">
<img [src]="model.getImage('images.Toolbox.StiImageElement.png')" />
</div>
<div class="draw-panel-button" (click)="clear()">
<img [src]="model.getImage('images.Page.ClearContent.png')" />
</div>
</div>
<div class="draw-panel" #previewContainer>
<div class="canvas-container">
<canvas
[width]="previewContainer.clientWidth"
[height]="previewContainer.clientHeight"
(mousedown)="onMouseDown($event, canvas)"
(mousemove)="onCanvasMove($event, canvas)"
#canvas
>
</canvas>
</div>
<div class="preview-inserted-text" [style]="insertedText.htmlStyle()" [style.justify-content]="alignment">
<span>{{ insertedText.value }}</span>
</div>
<div class="inserted-image-container" [style.justify-content]="getHorizontalAlignment()">
<div
class="preview-inserted-image"
[style.width.px]="
insertedImage?.aspectRatio && insertedImage?.stretch
? previewContainer.clientHeight
: previewContainer.clientWidth
"
[style.height.px]="previewContainer.clientHeight"
[style.background-image]="image"
[style.background-position]="getBackgroundPosition()"
[style.background-size]="getBackgroundSize(previewContainer)"
[style.background-repeat]="image ? 'no-repeat' : ''"
></div>
</div>
<div class="signature-description">
<span>{{ "Signature" }}</span>
</div>
</div>
</div>
</div>
<div class="setup-accept">
<div class="accept button" (click)="acceptChanges()">
<span [style.margin-left.px]="0">{{
model.previewMode
? loc.get2("Buttons", "Sign")
: loc.get2("Buttons", "Save").replace("&", "").replace(";", "")
}}</span>
</div>
<div class="cancel button" (click)="model.showSignatureEditor = false">
<span [style.margin-left.px]="0">{{ loc.getP("Cancel") }}</span>
</div>
</div>
</div>
<div
class="fonts-preview-container"
*ngIf="signatureService.showFontsPreview"
[style.left.px]="signatureService.fontsPreviewX"
[style.top.px]="signatureService.fontsPreviewY"
>
<div
*ngFor="let font of signatureService.previewFonts"
class="font-preview"
[style.font-family]="font"
(click)="signatureService.currentPreviewFont = font; signatureService.showFontsPreview = false"
>
<div class="vertical-line {{ signatureService.currentPreviewFont == font ? 'current-indicator' : '' }}"></div>
<span> {{ previewText }}</span>
</div>
</div>
<div
*ngIf="signatureService.showSavedTemplates"
class="saved-templates-container"
[style.left.px]="signatureService.templatesPreviewX"
[style.top.px]="signatureService.templatesPreviewY"
[style.overflow-y]="hasTemplates ? 'scroll' : 'hidden'"
>
<div class="empty-container" *ngIf="!hasTemplates">
<span>{{ "No saved items" }}</span>
</div>
<div
class="template-item"
*ngFor="let temp of signatureService.savedTemplates; let i = index"
[style.margin-top.px]="i == 0 ? 6 : 0"
(click)="signatureService.setTemplate(temp)"
>
<div class="delete-button" (click)="signatureService.deleteTemplate(i)">
<img [src]="model.getImage('images.Other.CloseForm.png')" />
</div>
<div
class="image-template"
*ngIf="temp.type == 'Image'"
#parentContainer
[style.justify-content]="signatureService.getTemplateHorizontalAlignment(temp)"
>
<div
class="loadedImage image-content"
[style.background-image]="signatureService.getTemplateImage(temp)"
[style.background-position]="signatureService.getTemplateBackgroundPosition(temp)"
[style.background-size]="signatureService.getTemplateBackgroundSize(temp, parentContainer)"
[style.background-repeat]="'no-repeat'"
></div>
<div class="insertedText image-content">
<span [style]="temp.text.htmlStyle()">{{ temp?.text?.value }}</span>
</div>
<div
class="drawedImage image-content"
[style.background-size]="'contain'"
[style.background-image]="signatureService.getTemplateDrawedImage(temp)"
></div>
</div>
<div class="text-template" *ngIf="temp.type == 'Text'">
<span [style.font-family]="temp.specialFont" [style.font-size.pt]="16">{{
temp.fullName + " " + temp.initials
}}</span>
</div>
</div>
</div>`, styles: [".image-content{height:100%;width:100%;top:0;left:0;position:absolute}.drawedImage{z-index:3}.loadedImage{z-index:1}.insertedText{z-index:2;display:flex;align-items:center;justify-content:center}.text-template{display:flex;align-items:center;justify-content:center;height:50px}.image-template{position:relative;height:130px}.template-item{width:calc(100% - 12px);height:fit-content;padding:2px;margin:0 6px 6px;border:1px solid lightgray;border-radius:3px;position:relative}.delete-button{position:absolute;z-index:999;right:0;top:0;width:20px;height:20px;display:flex;align-items:center;justify-content:center;border-radius:3px}.delete-button img{height:16px;width:16px}.delete-button:hover img{filter:saturate(500%) contrast(100%) brightness(900%) invert(900%) sepia(50%)}.template-item:hover{background-color:#d7d7d7;cursor:pointer}.empty-container{height:100%;width:100%;background-color:#fafafa;display:flex;align-items:center;justify-content:center;color:#454545;font-size:13px;font-family:Arial}.saved-templates-container{position:absolute;overflow-x:hidden;overflow-y:scroll;width:335px;height:270px;border-radius:3px;-moz-box-shadow:0px 0px 7px rgba(0,0,0,.6);-webkit-box-shadow:0px 0px 7px rgb(0 0 0 / 60%);box-shadow:0 0 7px #0000004d;border:1px solid rgb(25,71,138);display:flex;flex-direction:column;background-color:#fff;z-index:99999999999999999}.active{background-color:#d3d3d3;outline:1px solid rgb(61,107,186)}.canvas-container{position:absolute;left:0;top:0;height:100%;width:100%;z-index:99999}.preview-inserted-image{position:absolute}.inserted-image-container{position:absolute;left:0;top:0;display:flex;height:100%;width:100%}.preview-inserted-text{position:absolute;height:100%;width:100%;display:flex;align-items:center;justify-content:center;z-index:999}.signature-content{z-index:9999;height:100%;width:100%}.signature-description{width:calc(100% - 10px);height:50px;margin:0 5px;padding:0 5px;border-top:1px solid lightgray;display:flex;align-items:center;overflow:hidden;z-index:999}.disabled{pointer-events:none;opacity:.5}.preview-container{display:flex;width:100%;position:relative;flex-direction:column}.preview-container img{height:16px;width:16px}.button-container{display:flex;height:26px;width:40px;position:relative;margin-right:5px;border-radius:3px}.button-container:hover{background-color:#d3d3d3}.button-container:active{background-color:var(--columnDeleteHover-color)}.color-preview{width:20px;height:5px;margin-left:4px}i{height:12px;width:12px;right:3px;top:50%;vertical-align:middle;color:var(--text-color)}.button-container:hover i{color:#fff}.foreground{margin-left:8px;margin-top:2px;width:16px;height:16px}.template-navigation-button{height:26px;width:26px;margin-right:2px;border-radius:3px;display:flex;align-items:center;justify-content:center}.template-navigation-button:hover{background-color:#d3d3d3}.template-navigation-button img{height:16px;width:16px}.templates-navigation-container{width:100%;display:flex;align-items:center;justify-content:flex-end}.vertical-line{width:3px;height:calc(100% - 14px);margin:7px 10px 7px 5px}.font-preview{font-size:16px;height:42px;display:flex;align-items:center;padding-left:5px;border-radius:3px;margin:1px}.font-preview:hover{background-color:#dadada}.fonts-preview-container{position:absolute;width:200px;height:134px;z-index:9999999999;padding:1px;border-radius:3px;border:1px solid #c6c6c6;background:#fff;color:#444;-moz-box-shadow:0px 0px 7px rgba(0,0,0,.6);-webkit-box-shadow:0px 0px 7px rgba(0,0,0,.6);box-shadow:0 0 7px #0000004d;cursor:default}.draw-buttons-panel{height:26px;margin-bottom:5px;margin-top:10px;display:flex;padding-left:24px}.draw-panel-button:hover{background-color:#d3d3d3}.draw-panel-button{height:26px;width:26px;margin-right:5px;border-radius:3px;display:flex;align-items:center;justify-content:center}.draw-panel-button img{height:16px;width:16px}.draw-panel{border:1px dashed #ababab;border-radius:3px;margin:0 24px;width:calc(100% - 48px);height:186px;display:flex;flex-direction:column-reverse;position:relative}i{margin-left:5px;font-size:7px;padding-top:4px}.select-button{border:1px solid #dddddd;border-radius:3px;min-width:30px;padding-left:10px;padding-right:6px;display:flex;color:#444;align-items:center;margin-right:24px;margin-top:24px;height:24px}.select-button:hover{background-color:#d3d3d3}.button-panel{width:100%;display:flex;justify-content:flex-end}.preview-panel{height:80px;width:calc(100% - 48px);border:1px solid #ababab;border-radius:3px;font-size:16pt;margin:10px 24px;padding-left:12px;display:flex;align-items:center;overflow:hidden}.input-field{width:calc(100% - 24px);display:flex;margin:12px 12px 6px;padding:0 12px;align-items:center}.input-field span{min-width:100px;font-size:12px}.input-field input{border-radius:3px;padding-left:5px;height:24px;outline:none;border:1px solid lightgray;width:100%}.input-field input:hover{border-color:#454545}.current-indicator{background-color:#19478a}.other-indicator{background-color:transparent}.current{background-color:#e5e5e5}.navigation-button:hover{background-color:#dadada}.navigation-button{border-radius:3px;height:26px;min-width:50px;display:flex;flex-direction:column;color:#444;font-size:12px;font-family:Arial;margin-right:2px}.navigation-label{height:27px;width:100%;height:18px;padding:0 10px;display:flex;align-items:center;justify-content:center;white-space:nowrap}.navigation-label span{margin-top:7px}.indicator{height:3px;margin:1px 9px}.bottom-divider{height:1px;width:calc(100% - 24px);background-color:#d3d3d3;margin:5px 12px}.content-navigation{display:flex;padding:12px 12px 0}.content-container{height:100%;width:100%}.editor-navbar{display:flex;height:30px;border-top-left-radius:3px;border-top-right-radius:3px;background-color:#515c6a;-webkit-user-select:none;color:#fff;align-items:center}.editor-navbar span{font-size:13px;margin-left:10px}.close-button{height:30px;width:30px;border-radius:3px;display:flex;align-items:center;justify-content:center}.close-button:hover{background-color:#dadada}.close-button img{height:16px;width:16px;filter:brightness(0) invert(1)}.editor-container{background-color:var(--back-color);position:absolute;left:calc(50% - 182px);top:calc(50% - 175px);z-index:999;width:365px;height:350px;overflow:hidden;display:flex;flex-direction:column;-moz-box-shadow:0px 0px 7px rgba(0,0,0,.6);-webkit-box-shadow:0px 0px 7px rgb(0 0 0 / 60%);box-shadow:0 0 7px #0000004d;border:1px solid rgb(25,71,138);color:var(--text-color);font-size:12px;border-radius:5px;font-family:Arial;-webkit-user-select:none}.button{height:24px;width:80px;border-radius:3px;margin:3px 5px;display:flex;align-items:center;justify-content:center;border:1px solid transparent}.accept:active{background-color:#355da0;border-color:#264c7d}.cancel:active{background-color:#e2e2e2;border-color:#838383}.accept{background-color:#19478a;color:#fff}.accept:hover{background-color:#3d6298}.cancel{background-color:#ddd;color:#444}.cancel:hover{background-color:#d5d5d5}.setup-accept{padding:8px;display:flex;align-items:flex-end;justify-content:flex-end}\n"] }]
}], ctorParameters: () => [{ type: i1.StiModelService }, { type: i2.StiLocalizationService }, { type: i3.StiMouseService }, { type: i4.SignatureService }, { type: i5.StiDraggableModalWindowService }, { type: i6.StiColorDialogService }], propDecorators: { canvas: [{
type: ViewChild,
args: ["canvas"]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RpLWVsZWN0cm9uaWMtc2lnbmF0dXJlLWVkaXRvci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zdGltdWxzb2Z0LWZvcm1zL3NyYy9saWIvY29tcG9uZW50cy9zdGktc2lnbmF0dXJlL3N0aS1lbGVjdHJvbmljLXNpZ25hdHVyZS1lZGl0b3IuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBaUIsU0FBUyxFQUFpQyxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFPbkcsT0FBTyxLQUFLLE1BQU0sb0JBQW9CLENBQUM7QUFFdkMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzlELE9BQU8sRUFBRSxzQkFBc0IsRUFBd0IsTUFBTSxvQkFBb0IsQ0FBQztBQU1sRixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDekMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sK0NBQStDLENBQUM7Ozs7Ozs7Ozs7O0FBZ3NCckYsTUFBTSxPQUFPLHFDQUFxQztJQUdoRCxJQUFXLFVBQVU7UUFDbkIsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsK0JBQStCLEVBQUUsUUFBUTtZQUNyRSxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLCtCQUErQixFQUFFLFFBQVE7WUFDbEUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNwQixDQUFDO0lBcUJELFlBQ1MsS0FBc0IsRUFDdEIsR0FBMkIsRUFDM0IsWUFBNkIsRUFDN0IsZ0JBQWtDLEVBQ2xDLGtCQUFrRCxFQUNsRCxZQUFtQztRQUxuQyxVQUFLLEdBQUwsS0FBSyxDQUFpQjtRQUN0QixRQUFHLEdBQUgsR0FBRyxDQUF3QjtRQUMzQixpQkFBWSxHQUFaLFlBQVksQ0FBaUI7UUFDN0IscUJBQWdCLEdBQWhCLGdCQUFnQixD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O1dBb05EOzs0RkF3ZUUscUNBQXFDO2tCQTlyQmpELFNBQVM7K0JBQ0UsaUNBQWlDLFlBQ2pDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztXQW9ORDt1UUF5ZVksTUFBTTtzQkFBMUIsU0FBUzt1QkFBQyxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBPbkRlc3Ryb3ksIE9uSW5pdCwgVmlld0NoaWxkIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgU3RpTW9kZWxTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL21vZGVsLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgU3RpTG9jYWxpemF0aW9uU2VydmljZSB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy9zdGktbG9jYWxpemF0aW9uLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHsgU3RpTW91c2VTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL21vdXNlLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgU2lnbmF0dXJlU2VydmljZSB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy9zdGktc2lnbmF0dXJlLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgU3RpRHJhZ2dhYmxlTW9kYWxXaW5kb3dTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL3N0aS1kcmFnZ2FibGUtbW9kYWwtd2luZG93LnNlcnZpY2VcIjtcclxuaW1wb3J0IENvbG9yIGZyb20gXCIuLi8uLi9zeXN0ZW0vQ29sb3JcIjtcclxuaW1wb3J0IHsgU3RpQ29sb3JEaWFsb2dTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL3N0aS1jb2xvci1kaWFsb2cuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBTdGlUZXh0SXRlbSB9IGZyb20gXCIuLi8uLi9lbGVtZW50cy90ZXh0L1N0aVRleHRJdGVtXCI7XHJcbmltcG9ydCB7IFN0aUhvcml6b250YWxBbGlnbm1lbnQsIFN0aVZlcnRpY2FsQWxpZ25tZW50IH0gZnJvbSBcIi4uLy4uL3N5c3RlbS9lbnVtc1wiO1xyXG5pbXBvcnQge1xyXG4gIFN0aUltYWdlRWRpdG9yUmVzdWx0T2JqZWN0LFxyXG4gIFN0aVNpZ25hdHVyZURyYXdUZW1wbGF0ZSxcclxuICBTdGlTaWduYXR1cmVUeXBlVGVtcGxhdGUsXHJcbn0gZnJvbSBcIi4uLy4uL3N5c3RlbS9pbnRlcmZhY2VzXCI7XHJcbmltcG9ydCB7IEVudW0gfSBmcm9tIFwiLi4vLi4vc3lzdGVtL0VudW1cIjtcclxuaW1wb3J0IHsgU3RpSW1hZ2VFZGl0b3JSZXN1bHQgfSBmcm9tIFwiLi4vLi4vZWxlbWVudHMvc2lnbmF0dXJlL1N0aUltYWdlRWRpdG9yUmVzdWx0XCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogXCJzdGktZWxlY3Ryb25pYy1zaWduYXR1cmUtZWRpdG9yXCIsXHJcbiAgdGVtcGxhdGU6IGA8ZGl2XHJcbiAgICAgIGNsYXNzPVwiZWRpdG9yLWNvbnRhaW5lclwiXHJcbiAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cInNpZ25hdHVyZVNlcnZpY2UuZWRpdG9yQ29tcG9uZW50WFwiXHJcbiAgICAgIFtzdHlsZS50b3AucHhdPVwic2lnbmF0dXJlU2VydmljZS5lZGl0b3JDb21wb25lbnRZXCJcclxuICAgID5cclxuICAgICAgPGRpdiBjbGFzcz1cImVkaXRvci1uYXZiYXJcIiAobW91c2Vkb3duKT1cInN0YXJ0RHJhZygkZXZlbnQpXCI+XHJcbiAgICAgICAgPHNwYW4gW3N0eWxlLmZsZXhdPVwiMVwiPnt7IGxvYy5nZXQyKFwiQ29tcG9uZW50c1wiLCBcIlN0aVNpZ25hdHVyZVwiKSB9fTwvc3Bhbj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2xvc2UtYnV0dG9uXCIgKGNsaWNrKT1cIm1vZGVsLnNob3dTaWduYXR1cmVFZGl0b3IgPSBmYWxzZVwiPlxyXG4gICAgICAgICAgPGltZyBbc3JjXT1cIm1vZGVsLmdldEltYWdlKCdpbWFnZXMuT3RoZXIuQ2xvc2VGb3JtLnBuZycpXCIgLz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjb250ZW50LWNvbnRhaW5lclwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb250ZW50LW5hdmlnYXRpb25cIj5cclxuICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgY2xhc3M9XCJuYXZpZ2F0aW9uLWJ1dHRvbiB7eyBzaWduYXR1cmVTZXJ2aWNlLnNlbGVjdGVkTW9kZSA9PSAnVHlwZScgPyAnY3VycmVudCcgOiAnJyB9fVwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJjaGFuZ2VNb2RlKCdUeXBlJylcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibmF2aWdhdGlvbi1sYWJlbFwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuPnt7IGxvYy5nZXQyKFwiUHJvcGVydHlFbnVtXCIsIFwiU3RpU2lnbmF0dXJlVHlwZVR5cGVcIikgfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5kaWNhdG9yIHt7IHNpZ25hdHVyZVNlcnZpY2Uuc2VsZWN0ZWRNb2RlID09ICdUeXBlJyA/ICdjdXJyZW50LWluZGljYXRvcicgOiAnJyB9fVwiPjwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgIGNsYXNzPVwibmF2aWdhdGlvbi1idXR0b24ge3sgc2lnbmF0dXJlU2VydmljZS5zZWxlY3RlZE1vZGUgPT0gJ0RyYXcnID8gJ2N1cnJlbnQnIDogJycgfX1cIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwiY2hhbmdlTW9kZSgnRHJhdycpXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5hdmlnYXRpb24tbGFiZWxcIj5cclxuICAgICAgICAgICAgICA8c3Bhbj57eyBsb2MuZ2V0MihcIlByb3BlcnR5RW51bVwiLCBcIlN0aVNpZ25hdHVyZVR5cGVEcmF3XCIpIH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImluZGljYXRvciB7eyBzaWduYXR1cmVTZXJ2aWNlLnNlbGVjdGVkTW9kZSA9PSAnRHJhdycgPyAnY3VycmVudC1pbmRpY2F0b3InIDogJycgfX1cIj48L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRlbXBsYXRlcy1uYXZpZ2F0aW9uLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICA8ZGl2IChjbGljayk9XCJzYXZlVGVtcGxhdGUoKVwiIGNsYXNzPVwidGVtcGxhdGUtbmF2aWdhdGlvbi1idXR0b24ge3sgaXNFbXB0eUNvbnRlbnQoKSA/ICdkaXNhYmxlZCcgOiAnJyB9fVwiPlxyXG4gICAgICAgICAgICAgIDxpbWcgW3NyY109XCJtb2RlbC5nZXRJbWFnZSgnc2lnbmF0dXJlLlN0aVNpZ25hdHVyZVNhdmUucG5nJylcIiAvPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICNidXR0b25cclxuICAgICAgICAgICAgICAoY2xpY2spPVwic2hvd1NhdmVkVGVtcGxhdGVzUHJldmlldyhidXR0b24pXCJcclxuICAgICAgICAgICAgICBjbGFzcz1cInRlbXBsYXRlLW5hdmlnYXRpb24tYnV0dG9uIHNob3ctYnV0dG9uXCJcclxuICAgICAgICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwiMzhcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPGltZyBbc3JjXT1cIm1vZGVsLmdldEltYWdlKCdzaWduYXR1cmUuU3RpU2lnbmF0dXJlT3Blbi5wbmcnKVwiIC8+PGkgY2xhc3M9XCJwaSBwaS1jaGV2cm9uLWRvd25cIj48L2k+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImJvdHRvbS1kaXZpZGVyXCI+PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInR5cGUtY29udGFpbmVyXCIgKm5nSWY9XCJzaWduYXR1cmVTZXJ2aWNlLnNlbGVjdGVkTW9kZSA9PSAnVHlwZSdcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1maWVsZFwiPlxyXG4gICAgICAgICAgICA8c3Bhbj57eyBsb2MuZ2V0UChcIkZ1bGxOYW1lXCIpIH19PC9zcGFuXHJcbiAgICAgICAgICAgID48aW5wdXQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cImZ1bGxOYW1lXCIgLz5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWZpZWxkXCI+XHJcbiAgICAgICAgICAgIDxzcGFuPnt7IGxvYy5nZXRQKFwiSW5pdGlhbHNcIikgfX08L3NwYW5cclxuICAgICAgICAgICAgPjxpbnB1dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwiaW5pdGlhbHNcIiAvPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnV0dG9uLXBhbmVsXCI+XHJcbiAgICAgICAgICAgIDxkaXYgI3NlbGVjdEJ1dHRvbiBjbGFzcz1cInNlbGVjdC1idXR0b25cIiAoY2xpY2spPVwic2hvd0ZvbnRzUHJldmlldyhzZWxlY3RCdXR0b24pXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJidXR0b24tbGFiZWxcIj57eyBsb2MuZ2V0MihcIkNoYXJ0UmliYm9uXCIsIFwiU3R5bGVcIikgfX08L3NwYW5cclxuICAgICAgICAgICAgICA+PGkgY2xhc3M9XCJwaSBwaS1jaGV2cm9uLWRvd25cIj48L2k+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJldmlldy1wYW5lbFwiIFtzdHlsZS5mb250LWZhbWlseV09XCJzaWduYXR1cmVTZXJ2aWNlLmN1cnJlbnRQcmV2aWV3Rm9udFwiPlxyXG4gICAgICAgICAgICA8c3Bhbj57eyBwcmV2aWV3VGV4dCB9fTwvc3Bhbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkcmF3LWNvbnRhaW5lclwiICpuZ0lmPVwic2lnbmF0dXJlU2VydmljZS5zZWxlY3RlZE1vZGUgPT0gJ0RyYXcnXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJhdy1idXR0b25zLXBhbmVsXCI+XHJcbiAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICBjbGFzcz1cImJ1dHRvbi1jb250YWluZXIge3sgZHJhd2luZ01vZGUgPyAnYWN0aXZlJyA6ICcnIH19XCJcclxuICAgICAgICAgICAgICBbc3RpVG9vbHRpcF09XCJsb2MuZ2V0UCgnRm9yZUNvbG9yJylcIlxyXG4gICAgICAgICAgICAgIHRvb2x0aXBQb3NpdGlvbj1cImJvdHRvbVwiXHJcbiAgICAgICAgICAgICAgc2hvd0RlbGF5PVwiNTAwXCJcclxuICAgICAgICAgICAgICAobW91c2Vkb3duKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCJcclxuICAgICAgICAgICAgICAjZm9udENvbG9yRWRpdG9yXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJldmlldy1jb250YWluZXJcIiAoY2xpY2spPVwiZHJhd2luZ01vZGUgPSAhZHJhd2luZ01vZGVcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JlZ3JvdW5kXCIgW3N0eWxlXT1cInsgYmFja2dyb3VuZFBvc2l0aW9uOiAnY2VudGVyJywgYmFja2dyb3VuZFJlcGVhdDogJ25vLXJlcGVhdCcgfVwiPlxyXG4gICAgICAgICAgICAgICAgICA8aW1nIFtzcmNdPVwibW9kZWwuZ2V0SW1hZ2UoJ2ltYWdlcy5CcnVzaC5wbmcnKVwiIGFsdD1cIlwiIC8+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29sb3ItcHJldmlld1wiXHJcbiAgICAgICAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kLWNvbG9yXT1cImJydXNoQ29sb3IgIT0gbnVsbCA/IGJydXNoQ29sb3I/LnRvSHRtbENvbG9yKCkgOiAncmdiKDE4MiwgMTgxLCAxODApJ1wiXHJcbiAgICAgICAgICAgICAgICA+PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJzaG93Q29sb3JQaWNrZXIoZm9udENvbG9yRWRpdG9yLCBicnVzaENvbG9yKVwiXHJcbiAgICAgICAgICAgICAgICBbc3R5bGVdPVwieyBwb3NpdGlvbjogJ3JlbGF0aXZlJywgZGlzcGxheTogJ2ZsZXgnLCBhbGlnbkl0ZW1zOiAnY2VudGVyJyB9XCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cInBpIHBpLWNoZXZyb24tZG93blwiPjwvaT5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcmF3LXBhbmVsLWJ1dHRvblwiIChjbGljayk9XCJzaG93RWRpdG9yKCdUZXh0JylcIj5cclxuICAgICAgICAgICAgICA8aW1nIFtzcmNdPVwibW9kZWwuZ2V0SW1hZ2UoJ3NpZ25hdHVyZS5UZXh0LnBuZycpXCIgLz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcmF3LXBhbmVsLWJ1dHRvblwiIChjbGljayk9XCJzaG93RWRpdG9yKCdJbWFnZScpXCI+XHJcbiAgICAgICAgICAgICAgPGltZyBbc3JjXT1cIm1vZGVsLmdldEltYWdlKCdpbWFnZXMuVG9vbGJveC5TdGlJbWFnZUVsZW1lbnQucG5nJylcIiAvPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyYXctcGFuZWwtYnV0dG9uXCIgKGNsaWNrKT1cImNsZWFyKClcIj5cclxuICAgICAgICAgICAgICA8aW1nIFtzcmNdPVwibW9kZWwuZ2V0SW1hZ2UoJ2ltYWdlcy5QYWdlLkNsZWFyQ29udGVudC5wbmcnKVwiIC8+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJhdy1wYW5lbFwiICNwcmV2aWV3Q29udGFpbmVyPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FudmFzLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgIDxjYW52YXNcclxuICAgICAgICAgICAgICAgIFt3aWR0aF09XCJwcmV2aWV3Q29udGFpbmVyLmNsaWVudFdpZHRoXCJcclxuICAgICAgICAgICAgICAgIFtoZWlnaHRdPVwicHJldmlld0NvbnRhaW5lci5jbGllbnRIZWlnaHRcIlxyXG4gICAgICAgICAgICAgICAgKG1vdXNlZG93bik9XCJvbk1vdXNlRG93bigkZXZlbnQsIGNhbnZhcylcIlxyXG4gICAgICAgICAgICAgICAgKG1vdXNlbW92ZSk9XCJvbkNhbnZhc01vdmUoJGV2ZW50LCBjYW52YXMpXCJcclxuICAgICAgICAgICAgICAgICNjYW52YXNcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPC9jYW52YXM+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJldmlldy1pbnNlcnRlZC10ZXh0XCIgW3N0eWxlXT1cImluc2VydGVkVGV4dC5odG1sU3R5bGUoKVwiIFtzdHlsZS5qdXN0aWZ5LWNvbnRlbnRdPVwiYWxpZ25tZW50XCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4+e3sgaW5zZXJ0ZWRUZXh0LnZhbHVlIH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImluc2VydGVkLWltYWdlLWNvbnRhaW5lclwiIFtzdHlsZS5qdXN0aWZ5LWNvbnRlbnRdPVwiZ2V0SG9yaXpvbnRhbEFsaWdubWVudCgpXCI+XHJcbiAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJwcmV2aWV3LWluc2VydGVkLWltYWdlXCJcclxuICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJcclxuICAgICAgICAgICAgICAgICAgaW5zZXJ0ZWRJbWFnZT8uYXNwZWN0UmF0aW8gJiYgaW5zZXJ0ZWRJbWFnZT8uc3RyZXRjaFxyXG4gICAgICAgICAgICAgICAgICAgID8gcHJldmlld0NvbnRhaW5lci5jbGllbnRIZWlnaHRcclxuICAgICAgICAgICAgICAgICAgICA6IHByZXZpZXdDb250YWluZXIuY2xpZW50V2lkdGhcclxuICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cInByZXZpZXdDb250YWluZXIuY2xpZW50SGVpZ2h0XCJcclxuICAgICAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kLWltYWdlXT1cImltYWdlXCJcclxuICAgICAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kLXBvc2l0aW9uXT1cImdldEJhY2tncm91bmRQb3NpdGlvbigpXCJcclxuICAgICAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kLXNpemVdPVwiZ2V0QmFja2dyb3VuZFNpemUocHJldmlld0NvbnRhaW5lcilcIlxyXG4gICAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmQtcmVwZWF0XT1cImltYWdlID8gJ25vLXJlcGVhdCcgOiAnJ1wiXHJcbiAgICAgICAgICAgICAgPjwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNpZ25hdHVyZS1kZXNjcmlwdGlvblwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuPnt7IFwiU2lnbmF0dXJlXCIgfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwic2V0dXAtYWNjZXB0XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImFjY2VwdCBidXR0b25cIiAoY2xpY2spPVwiYWNjZXB0Q2hhbmdlcygpXCI+XHJcbiAgICAgICAgICA8c3BhbiBbc3R5bGUubWFyZ2luLWxlZnQucHhdPVwiMFwiPnt7XHJcbiAgICAgICAgICAgIG1vZGVsLnByZXZpZXdNb2RlXHJcbiAgICAgICAgICAgICAgPyBsb2MuZ2V0MihcIkJ1dHRvbnNcIiwgXCJTaWduXCIpXHJcbiAgICAgICAgICAgICAgOiBsb2MuZ2V0MihcIkJ1dHRvbnNcIiwgXCJTYXZlXCIpLnJlcGxhY2UoXCImYW1wXCIsIFwiXCIpLnJlcGxhY2UoXCI7XCIsIFwiXCIpXHJcbiAgICAgICAgICB9fTwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FuY2VsIGJ1dHRvblwiIChjbGljayk9XCJtb2RlbC5zaG93U2lnbmF0dXJlRWRpdG9yID0gZmFsc2VcIj5cclxuICAgICAgICAgIDxzcGFuIFtzdHlsZS5tYXJnaW4tbGVmdC5weF09XCIwXCI+e3sgbG9jLmdldFAoXCJDYW5jZWxcIikgfX08L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2XHJcbiAgICAgIGNsYXNzPVwiZm9udHMtcHJldmlldy1jb250YWluZXJcIlxyXG4gICAgICAqbmdJZj1cInNpZ25hdHVyZVNlcnZpY2Uuc2hvd0ZvbnRzUHJldmlld1wiXHJcbiAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cInNpZ25hdHVyZVNlcnZpY2UuZm9udHNQcmV2aWV3WFwiXHJcbiAgICAgIFtzdHlsZS50b3AucHhdPVwic2lnbmF0dXJlU2VydmljZS5mb250c1ByZXZpZXdZXCJcclxuICAgID5cclxuICAgICAgPGRpdlxyXG4gICAgICAgICpuZ0Zvcj1cImxldCBmb250IG9mIHNpZ25hdHVyZVNlcnZpY2UucHJldmlld0ZvbnRzXCJcclxuICAgICAgICBjbGFzcz1cImZvbnQtcHJldmlld1wiXHJcbiAgICAgICAgW3N0eWxlLmZvbnQtZmFtaWx5XT1cImZvbnRcIlxyXG4gICAgICAgIChjbGljayk9XCJzaWduYXR1cmVTZXJ2aWNlLmN1cnJlbnRQcmV2aWV3Rm9udCA9IGZvbnQ7IHNpZ25hdHVyZVNlcnZpY2Uuc2hvd0ZvbnRzUHJldmlldyA9IGZhbHNlXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ2ZXJ0aWNhbC1saW5lIHt7IHNpZ25hdHVyZVNlcnZpY2UuY3VycmVudFByZXZpZXdGb250ID09IGZvbnQgPyAnY3VycmVudC1pbmRpY2F0b3InIDogJycgfX1cIj48L2Rpdj5cclxuICAgICAgICA8c3Bhbj4ge3sgcHJldmlld1RleHQgfX08L3NwYW4+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2XHJcbiAgICAgICpuZ0lmPVwic2lnbmF0dXJlU2VydmljZS5zaG93U2F2ZWRUZW1wbGF0ZXNcIlxyXG4gICAgICBjbGFzcz1cInNhdmVkLXRlbXBsYXRlcy1jb250YWluZXJcIlxyXG4gICAgICBbc3R5bGUubGVmdC5weF09XCJzaWduYXR1cmVTZXJ2aWNlLnRlbXBsYXRlc1ByZXZpZXdYXCJcclxuICAgICAgW3N0eWxlLnRvcC5weF09XCJzaWduYXR1cmVTZXJ2aWNlLnRlbXBsYXRlc1ByZXZpZXdZXCJcclxuICAgICAgW3N0eWxlLm92ZXJmbG93LXldPVwiaGFzVGVtcGxhdGVzID8gJ3Njcm9sbCcgOiAnaGlkZGVuJ1wiXHJcbiAgICA+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJlbXB0eS1jb250YWluZXJcIiAqbmdJZj1cIiFoYXNUZW1wbGF0ZXNcIj5cclxuICAgICAgICA8c3Bhbj57eyBcIk5vIHNhdmVkIGl0ZW1zXCIgfX08L3NwYW4+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgY2xhc3M9XCJ0ZW1wbGF0ZS1pdGVtXCJcclxuICAgICAgICAqbmdGb3I9XCJsZXQgdGVtcCBvZiBzaWduYXR1cmVTZXJ2aWNlLnNhdmVkVGVtcGxhdGVzOyBsZXQgaSA9IGluZGV4XCJcclxuICAgICAgICBbc3R5bGUubWFyZ2luLXRvcC5weF09XCJpID09IDAgPyA2IDogMFwiXHJcbiAgICAgICAgKGNsaWNrKT1cInNpZ25hdHVyZVNlcnZpY2Uuc2V0VGVtcGxhdGUodGVtcClcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRlbGV0ZS1idXR0b25cIiAoY2xpY2spPVwic2lnbmF0dXJlU2VydmljZS5kZWxldGVUZW1wbGF0ZShpKVwiPlxyXG4gICAgICAgICAgPGltZyBbc3JjXT1cIm1vZGVsLmdldEltYWdlKCdpbWFnZXMuT3RoZXIuQ2xvc2VGb3JtLnBuZycpXCIgLz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICBjbGFzcz1cImltYWdlLXRlbXBsYXRlXCJcclxuICAgICAgICAgICpuZ0lmPVwidGVtcC50eXBlID09ICdJbWFnZSdcIlxyXG4gICAgICAgICAgI3BhcmVudENvbnRhaW5lclxyXG4gICAgICAgICAgW3N0eWxlLmp1c3RpZnktY29udGVudF09XCJzaWduYXR1cmVTZXJ2aWNlLmdldFRlbXBsYXRlSG9yaXpvbnRhbEFsaWdubWVudCh0ZW1wKVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICBjbGFzcz1cImxvYWRlZEltYWdlIGltYWdlLWNvbnRlbnRcIlxyXG4gICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZC1pbWFnZV09XCJzaWduYXR1cmVTZXJ2aWNlLmdldFRlbXBsYXRlSW1hZ2UodGVtcClcIlxyXG4gICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZC1wb3NpdGlvbl09XCJzaWduYXR1cmVTZXJ2aWNlLmdldFRlbXBsYXRlQmFja2dyb3VuZFBvc2l0aW9uKHRlbXApXCJcclxuICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmQtc2l6ZV09XCJzaWduYXR1cmVTZXJ2aWNlLmdldFRlbXBsYXRlQmFja2dyb3VuZFNpemUodGVtcCwgcGFyZW50Q29udGFpbmVyKVwiXHJcbiAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kLXJlcGVhdF09XCInbm8tcmVwZWF0J1wiXHJcbiAgICAgICAgICA+PC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5zZXJ0ZWRUZXh0IGltYWdlLWNvbnRlbnRcIj5cclxuICAgICAgICAgICAgPHNwYW4gW3N0eWxlXT1cInRlbXAudGV4dC5odG1sU3R5bGUoKVwiPnt7IHRlbXA/LnRleHQ/LnZhbHVlIH19PC9zcGFuPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgIGNsYXNzPVwiZHJhd2VkSW1hZ2UgaW1hZ2UtY29udGVudFwiXHJcbiAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kLXNpemVdPVwiJ2NvbnRhaW4nXCJcclxuICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmQtaW1hZ2VdPVwic2lnbmF0dXJlU2VydmljZS5nZXRUZW1wbGF0ZURyYXdlZEltYWdlKHRlbXApXCJcclxuICAgICAgICAgID48L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC10ZW1wbGF0ZVwiICpuZ0lmPVwidGVtcC50eXBlID09ICdUZXh0J1wiPlxyXG4gICAgICAgICAgPHNwYW4gW3N0eWxlLmZvbnQtZmFtaWx5XT1cInRlbXAuc3BlY2lhbEZvbnRcIiBbc3R5bGUuZm9udC1zaXplLnB0XT1cIjE2XCI+e3tcclxuICAgICAgICAgICAgdGVtcC5mdWxsTmFtZSArIFwiIFwiICsgdGVtcC5pbml0aWFsc1xyXG4gICAgICAgICAgfX08L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+YCxcclxuICBzdHlsZXM6IFtcclxuICAgIGBcclxuICAgICAgLmltYWdlLWNvbnRlbnQge1xyXG4gICAgICAgIGhlaWdodDogMTAwJTtcclxuICAgICAgICB3aWR0aDogMTAwJTtcclxuICAgICAgICB0b3A6IDA7XHJcbiAgICAgICAgbGVmdDogMDtcclxuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICAgIH1cclxuICAgICAgLmRyYXdlZEltYWdlIHtcclxuICAgICAgICB6LWluZGV4OiAzO1xyXG4gICAgICB9XHJcbiAgICAgIC5sb2FkZWRJbWFnZSB7XHJcbiAgICAgICAgei1pbmRleDogMTtcclxuICAgICAgfVxyXG4gICAgICAuaW5zZXJ0ZWRUZXh0IHtcclxuICAgICAgICB6LWluZGV4OiAyO1xyXG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcclxuICAgICAgfVxyXG4gICAgICAudGV4dC10ZW1wbGF0ZSB7XHJcbiAgICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xyXG4gICAgICAgIGhlaWdodDogNTBweDtcclxuICAgICAgfVxyXG4gICAgICAuaW1hZ2UtdGVtcGxhdGUge1xyXG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICAgICAgICBoZWlnaHQ6IDEzMHB4O1xyXG4gICAgICB9XHJcbiAgICAgIC50ZW1wbGF0ZS1pdGVtIHtcclxuICAgICAgICB3aWR0aDogY2FsYygxMDAlIC0gMTJweCk7XHJcbiAgICAgICAgaGVpZ2h0OiBmaXQtY29udGVudDtcclxuICAgICAgICBwYWRkaW5nOiAycHg7XHJcbiAgICAgICAgbWFyZ2luOiA2cHg7XHJcbiAgICAgICAgbWFyZ2luLXRvcDogMHB4O1xyXG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIGxpZ2h0Z3JheTtcclxuICAgICAgICBib3JkZXItcmFkaXVzOiAzcHg7XHJcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gICAgICB9XHJcbiAgICAgIC5kZWxldGUtYnV0dG9uIHtcclxuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICAgICAgei1pbmRleDogOTk5O1xyXG4gICAgICAgIHJpZ2h0OiAwO1xyXG4gICAgICAgIHRvcDogMDtcclxuICAgICAgICB3aWR0aDogMjBweDtcclxuICAgICAgICBoZWlnaHQ6IDIwcHg7XHJcbiAgICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xyXG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDNweDtcclxuICAgICAgfVxyXG4gICAgICAuZGVsZXRlLWJ1dHRvbiBpbWcge1xyXG4gICAgICAgIGhlaWdodDogMTZweDtcclxuICAgICAgICB3aWR0aDogMTZweDtcclxuICAgICAgfVxyXG4gICAgICAuZGVsZXRlLWJ1dHRvbjpob3ZlciBpbWcge1xyXG4gICAgICAgIGZpbHRlcjogc2F0dXJhdGUoNTAwJSkgY29udHJhc3QoMTAwJSkgYnJpZ2h0bmVzcyg5MDAlKSBpbnZlcnQoOTAwJSkgc2VwaWEoNTAlKTtcclxuICAgICAgfVxyXG4gICAgICAudGVtcGxhdGUtaXRlbTpob3ZlciB7XHJcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDIxNSwgMjE1LCAyMTUpO1xyXG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcclxuICAgICAgfVxyXG4gICAgICAuZW1wdHktY29udGFpbmVyIHtcclxuICAgICAgICBoZWlnaHQ6IDEwMCU7XHJcbiAgICAgICAgd2lkdGg6IDEwMCU7XHJcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI1MCwgMjUwLCAyNTApO1xyXG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcclxuICAgICAgICBjb2xvcjogcmdiKDY5LCA2OSwgNjkpO1xyXG4gICAgICAgIGZvbnQtc2l6ZTogMTNweDtcclxuICAgICAgICBmb250LWZhbWlseTogQXJpYWw7XHJcbiAgICAgIH1cclxuICAgICAgLnNhdmVkLXRlbXBsYXRlcy1jb250YWluZXIge1xyXG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgICAgICBvdmVyZmxvdy14OiBoaWRkZW47XHJcbiAgICAgICAgb3ZlcmZsb3cteTogc2Nyb2xsO1xyXG4gICAgICAgIHdpZHRoOiAzMzVweDtcclxuICAgICAgICBoZWlnaHQ6IDI3MHB4O1xyXG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDNweDtcclxuICAgICAgICAtbW96LWJveC1zaGFkb3c6IDBweCAwcHggN3B4IHJnYmEoMCwgMCwgMCwgMC42KTtcclxuICAgICAgICAtd2Via2l0LWJveC1zaGFkb3c6IDBweCAwcHggN3B4IHJnYigwIDAgMCAvIDYwJSk7XHJcbiAgICAgICAgYm94LXNoYWRvdzogMCAwIDdweCByZ2IoMCAwIDAgLyAzMCUpO1xyXG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYigyNSwgNzEsIDEzOCk7XHJcbiAgICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xyXG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xyXG4gICAgICAgIHotaW5kZXg6IDk5OTk5OTk5OTk5OTk5OTk5O1xyXG4gICAgICB9XHJcbiAgICAgIC5hY3RpdmUge1xyXG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IGxpZ2h0Z3JheTtcclxuICAgICAgICBvdXRsaW5lOiAxcHggc29saWQgcmdiKDYxLCAxMDcsIDE4Nik7XHJcbiAgICAgIH1cclxuICAgICAgLmNhbnZhcy1jb250YWluZXIge1xyXG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgICAgICBsZWZ0OiAwO1xyXG4gICAgICAgIHRvcDogMDtcclxuICAgICAgICBoZWlnaHQ6IDEwMCU7XHJcbiAgICAgICAgd2lkdGg6IDEwMCU7XHJcbiAgICAgICAgei1pbmRleDogOTk5OTk7XHJcbiAgICAgIH1cclxuICAgICAgLnByZXZpZXctaW5zZXJ0ZWQtaW1hZ2Uge1xyXG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgICAgfVxyXG4gICAgICAuaW5zZXJ0ZWQtaW1hZ2UtY29udGFpbmVyIHtcclxuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICAgICAgbGVmdDogMDtcclxuICAgICAgICB0b3A6IDA7XHJcbiAgICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAgICBoZWlnaHQ6IDEwMCU7XHJcbiAgICAgICAgd2lkdGg6IDEwMCU7XHJcbiAgICAgIH1cclxuICAgICAgLnByZXZpZXctaW5zZXJ0ZWQtdGV4dCB7XHJcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgICAgIGhlaWdodDogMTAwJTtcclxuICAgICAgICB3aWR0aDogMTAwJTtcclxuICAgICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XHJcbiAgICAgICAgei1pbmRleDogOTk5O1xyXG4gICAgICB9XHJcbiAgICAgIC5zaWduYXR1cmUtY29udGVudCB7XHJcbiAgICAgICAgei1pbmRleDogOTk5OTtcclxuICAgICAgICBoZWlnaHQ6IDEwMCU7XHJcbiAgICAgICAgd2lkdGg6IDEwMCU7XHJcbiAgICAgIH1cclxuICAgICAgLnNpZ25hdHVyZS1kZXNjcmlwdGlvbiB7XHJcbiAgICAgICAgd2lkdGg6IGNhbGMoMTAwJSAtIDEwcHgpO1xyXG4gICAgICAgIGhlaWdodDogNTBweDtcclxuICAgICAgICBtYXJnaW46IDBweCA1cHg7XHJcbiAgICAgICAgcGFkZGluZzogMHB4IDVweDtcclxuICAgICAgICBib3JkZXItdG9wOiAxcHggc29saWQgbGlnaHRncmF5O1xyXG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gICAgICAgIHotaW5kZXg6IDk5OTtcclxuICAgICAgfVxyXG4gICAgICAuZGlzYWJsZWQge1xyXG4gICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xyXG4gICAgICAgIG9wYWNpdHk6IDAuNTtcclxuICAgICAgfVxyXG4gICAgICAucHJldmlldy1jb250YWluZXIge1xyXG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgICAgd2lkdGg6IDEwMCU7XHJcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAgICAgIH1cclxuICAgICAgLnByZXZpZXctY29udGFpbmVyIGltZyB7XHJcbiAgICAgICAgaGVpZ2h0OiAxNnB4O1xyXG4gICAgICAgIHdpZHRoOiAxNnB4O1xyXG4gICAgICB9XHJcbiAgICAgIC5idXR0b24tY29udGFpbmVyIHtcclxuICAgICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICAgIGhlaWdodDogMjZweDtcclxuICAgICAgICB3aWR0aDogNDBweDtcclxuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgICAgICAgbWFyZ2luLXJpZ2h0OiA1cHg7XHJcbiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4O1xyXG4gICAgICB9XHJcbiAgICAgIC5idXR0b24tY29udGFpbmVyOmhvdmVyIHtcclxuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBsaWdodGdyYXk7XHJcbiAgICAgIH1cclxuICAgICAgLmJ1dHRvbi1jb250YWluZXI6YWN0aXZlIHtcclxuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jb2x1bW5EZWxldGVIb3Zlci1jb2xvcik7XHJcbiAgICAgIH1cclxuICAgICAgLmNvbG9yLXByZXZpZXcge1xyXG4gICAgICAgIHdpZHRoOiAyMHB4O1xyXG4gICAgICAgIGhlaWdodDogNXB4O1xyXG4gICAgICAgIG1hcmdpbi1sZWZ0OiA0cHg7XHJcbiAgICAgIH1cclxuICAgICAgaSB7XHJcbiAgICAgICAgaGVpZ2h0OiAxMnB4O1xyXG4gICAgICAgIHdpZHRoOiAxMnB4O1xyXG4gICAgICAgIHJpZ2h0OiAzcHg7XHJcbiAgICAgICAgdG9wOiA1MCU7XHJcbiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcclxuICAgICAgICBjb2xvcjogdmFyKC0tdGV4dC1jb2xvcik7XHJcbiAgICAgIH1cclxuICAgICAgLmJ1dHRvbi1jb250YWluZXI6aG92ZXIgaSB7XHJcbiAgICAgICAgY29sb3I6IHdoaXRlO1xyXG4gICAgICB9XHJcbiAgICAgIC5mb3JlZ3JvdW5kIHtcclxuICAgICAgICBtYXJnaW4tbGVmdDogOHB4O1xyXG4gICAgICAgIG1hcmdpbi10b3A6IDJweDtcclxuICAgICAgICB3aWR0aDogMTZweDtcclxuICAgICAgICBoZWlnaHQ6IDE2cHg7XHJcbiAgICAgIH1cclxuICAgICAgLnRlbXBsYXRlLW5hdmlnYXRpb24tYnV0dG9uIHtcclxuICAgICAgICBoZWlnaHQ6IDI2cHg7XHJcbiAgICAgICAgd2lkdGg6IDI2cHg7XHJcbiAgICAgICAgbWFyZ2luLXJpZ2h0OiAycHg7XHJcbiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4O1xyXG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcclxuICAgICAgfVxyXG4gICAgICAudGVtcGxhdGUtbmF2aWdhdGlvbi1idXR0b246aG92ZXIge1xyXG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IGxpZ2h0Z3JheTtcclxuICAgICAgfVxyXG4gICAgICAudGVtcGxhdGUtbmF2aWdhdGlvbi1idXR0b24gaW1nIHtcclxuICAgICAgICBoZWlnaHQ6IDE2cHg7XHJcbiAgICAgICAgd2lkdGg6IDE2cHg7XHJcbiAgICAgIH1cclxuICAgICAgLnRlbXBsYXRlcy1uYXZpZ2F0aW9uLWNvbnRhaW5lciB7XHJcbiAgICAgICAgd2lkdGg6IDEwMCU7XHJcbiAgICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7XHJcbiAgICAgIH1cclxuICAgICAgLnZlcnRpY2FsLWxpbmUge1xyXG4gICAgICAgIHdpZHRoOiAzcHg7XHJcbiAgICAgICAgaGVpZ2h0OiBjYWxjKDEwMCUgLSAxNHB4KTtcclxuICAgICAgICBtYXJnaW46IDdweCAxMHB4IDdweCA1cHg7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC5mb250LXByZXZpZXcge1xyXG4gICAgICAgIGZvbnQtc2l6ZTogMTZweDtcclxuICAgICAgICBoZWlnaHQ6IDQycHg7XHJcbiAgICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gICAgICAgIHBhZGRpbmctbGVmdDogNXB4O1xyXG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDNweDtcclxuICAgICAgICBtYXJnaW46IDFweDtcclxuICAgICAgfVxyXG4gICAgICAuZm9udC1wcmV2aWV3OmhvdmVyIHtcclxuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGFkYWRhO1xyXG4gICAgICB9XHJcbiAgICAgIC5jdXJyZW50IHtcclxuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTVlNWU1O1xyXG4gICAgICB9XHJcbiAgICAgIC5mb250cy1wcmV2aWV3LWNvbnRhaW5lciB7XHJcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgICAgIHdpZHRoOiAyMDBweDtcclxuICAgICAgICBoZWlnaHQ6IDEzNHB4O1xyXG4gICAgICAgIHotaW5kZXg6IDk5OTk5OTk5OTk7XHJcbiAgICAgICAgcGFkZGluZzogMXB4O1xyXG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDNweDtcclxuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjYzZjNmM2O1xyXG4gICAgICAgIGJhY2tncm91bmQ6ICNmZmZmZmY7XHJcbiAgICAgICAgY29sb3I6ICM0NDQ0NDQ7XHJcbiAgICAgICAgLW1vei1ib3gtc2hhZG93OiAwcHggMHB4IDdweCByZ2JhKDAsIDAsIDAsIDAuNik7XHJcbiAgICAgICAgLXdlYmtpdC1ib3gtc2hhZG93OiAwcHggMHB4IDdweCByZ2JhKDAsIDAsIDAsIDAuNik7XHJcbiAgICAgICAgYm94LXNoYWRvdzogMCAwIDdweCByZ2JhKDAsIDAsIDAsIDAuMyk7XHJcbiAgICAgICAgY3Vyc29yOiBkZWZhdWx0O1xyXG4gICAgICB9XHJcbiAgICAgIC5kcmF3LWJ1dHRvbnMtcGFuZWwge1xyXG4gICAgICAgIGhlaWdodDogMjZweDtcclxuICAgICAgICBtYXJnaW4tYm90dG9tOiA1cHg7XHJcbiAgICAgICAgbWFyZ2luLXRvcDogMTBweDtcclxuICAgICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICAgIHBhZGRpbmctbGVmdDogMjRweDtcclxuICAgICAgfVxyXG4gICAgICAuZHJhdy1wYW5lbC1idXR0b246aG92ZXIge1xyXG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IGxpZ2h0Z3JheTtcclxuICAgICAgfVxyXG4gICAgICAuZHJhdy1wYW5lbC1idXR0b24ge1xyXG4gICAgICAgIGhlaWdodDogMjZweDtcclxuICAgICAgICB3aWR0aDogMjZweDtcclxuICAgICAgICBtYXJnaW4tcmlnaHQ6IDVweDtcclxuICAgICAgICBib3JkZXItcmFkaXVzOiAzcHg7XHJcbiAgICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xyXG4gICAgICB9XHJcbiAgICAgIC5kcmF3LXBhbmVsLWJ1dHRvbiBpbWcge1xyXG4gICAgICAgIGhlaWdodDogMTZweDtcclxuICAgICAgICB3aWR0aDogMTZweDtcclxuICAgICAgfVxyXG4gICAgICAuZHJhdy1wYW5lbCB7XHJcbiAgICAgICAgYm9yZGVyOiAxcHggZGFzaGVkICNhYmFiYWI7XHJcbiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4O1xyXG4gICAgICAgIG1hcmdpbjogMHB4IDI0cHg7XHJcbiAgICAgICAgd2lkdGg6IGNhbGMoMTAwJSAtIDQ4cHgpO1xyXG4gICAgICAgIGhlaWdodDogMTg2cHg7XHJcbiAgICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7XHJcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gICAgICB9XHJcbiAgICAgIGkge1xyXG4gICAgICAgIG1hcmdpbi1sZWZ0OiA1cHg7XHJcbiAgICAgICAgZm9udC1zaXplOiA3cHg7XHJcbiAgICAgICAgcGFkZGluZy10b3A6IDRweDtcclxuICAgICAgfVxyXG4gICAgICAuc2VsZWN0LWJ1dHRvbiB7XHJcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2RkZGRkZDtcclxuICAgICAgICBib3JkZXItcmFkaXVzOiAzcHg7XHJcbiAgICAgICAgbWluLXdpZHRoOiAzMHB4O1xyXG4gICAgICAgIHBhZGRpbmctbGVmdDogMTBweDtcclxuICAgICAgICBwYWRkaW5nLXJpZ2h0OiA2cHg7XHJcbiAgICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAgICBjb2xvcjogIzQ0NDQ0NDtcclxuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gICAgICAgIG1hcmdpbi1yaWdodDogMjRweDtcclxuICAgICAgICBtYXJnaW4tdG9wOiAyNHB4O1xyXG4gICAgICAgIGhlaWdodDogMjRweDtcclxuICAgICAgfVxyXG4gICAgICAuc2VsZWN0LWJ1dHRvbjpob3ZlciB7XHJcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogbGlnaHRncmF5O1xyXG4gICAgICB9XHJcbiAgICAgIC5idXR0b24tcGFuZWwge1xyXG4gICAgICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDtcclxuICAgICAgfVxyXG4gICAgICAucHJldmlldy1wYW5lbCB7XHJcbiAgICAgICAgaGVpZ2h0OiA4MHB4O1xyXG4gICAgICAgIHdpZHRoOiBjYWxjKDEwMCUgLSA0OHB4KTtcclxuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjYWJhYmFiO1xyXG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDNweDtcclxuICAgICAgICBmb250LXNpemU6IDE2cHQ7XHJcbiAgICAgICAgbWFyZ2luOiAxMHB4IDI0cHg7XHJcbiAgICAgICAgcGFkZGluZy1sZWZ0OiAxMnB4O1xyXG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gICAgICB9XHJcbiAgICAgIC5pbnB1dC1maWVsZCB7XHJcbiAgICAgICAgd2lkdGg6IGNhbGMoMTAwJSAtIDI0cHgpO1xyXG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgICAgbWFyZ2luOiAxMnB4O1xyXG4gICAgICAgIG1hcmdpbi1ib3R0b206IDZweDtcclxuICAgICAgICBwYWRkaW5nOiAwcHggMTJweDtcclxuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gICAgICB9XHJcbiAgICAgIC5pbnB1dC1maWVsZCBzcGFuIHtcclxuICAgICAgICBtaW4td2lkdGg6IDEwMHB4O1xyXG4gICAgICAgIGZvbnQtc2l6ZTogMTJweDtcclxuICAgICAgfVxyXG4gICAgICAuaW5wdXQtZmllbGQgaW5wdXQge1xyXG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDNweDtcclxuICAgICAgICBwYWRkaW5nLWxlZnQ6IDVweDtcclxuICAgICAgICBoZWlnaHQ6IDI0cHg7XHJcbiAgICAgICAgb3V0bGluZTogbm9uZTtcclxuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCBsaWdodGdyYXk7XHJcbiAgICAgICAgd2lkdGg6IDEwMCU7XHJcbiAgICAgIH1cclxuICAgICAgLmlucHV0LWZpZWxkIGlucHV0OmhvdmVyIHtcclxuICAgICAgICBib3JkZXItY29sb3I6IHJnYig2OSwgNjksIDY5KTtcclxuICAgICAgfVxyXG4gICAgICAuY3VycmVudC1pbmRpY2F0b3Ige1xyXG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHJnYigyNSwgNzEsIDEzOCk7XHJcbiAgICAgIH1cclxuICAgICAgLm90aGVyLWluZGljYXRvciB7XHJcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XHJcbiAgICAgIH1cclxuICAgICAgLmN1cnJlbnQge1xyXG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNlNWU1ZTU7XHJcbiAgICAgIH1cclxuICAgICAgLm5hdmlnYXRpb24tYnV0dG9uOmhvdmVyIHtcclxuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjE4LCAyMTgsIDIxOCk7XHJcbiAgICAgIH1cclxuICAgICAgLm5hdmlnYXRpb24tYnV0dG9uIHtcclxuICAgICAgICBib3JkZXItcmFkaXVzOiAzcHg7XHJcbiAgICAgICAgaGVpZ2h0OiAyNnB4O1xyXG4gICAgICAgIG1pbi13aWR0aDogNTBweDtcclxuICAgICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAgICAgICAgY29sb3I6IHJnYig2OCwgNjgsIDY4KTtcclxuICAgICAgICBmb250LXNpemU6IDEycHg7XHJcbiAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsO1xyXG4gICAgICAgIG1hcmdpbi1yaWdodDogMnB4O1xyXG4gICAgICB9XHJcbiAgICAgIC5uYXZpZ2F0aW9uLWxhYmVsIHtcclxuICAgICAgICBoZWlnaHQ6IDI3cHg7XHJcbiAgICAgICAgd2lkdGg6IDEwMCU7XHJcbiAgICAgICAgaGVpZ2h0OiAxOHB4O1xyXG4gICAgICAgIHBhZGRpbmc6IDBweCAxMHB4O1xyXG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcclxuICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xyXG4gICAgICB9XHJcbiAgICAgIC5uYXZpZ2F0aW9uLWxhYmVsIHNwYW4ge1xyXG4gICAgICAgIG1hcmdpbi10b3A6IDdweDtcclxuICAgICAgfVxyXG4gICAgICAuaW5kaWNhdG9yIHtcclxuICAgICAgICBoZWlnaHQ6IDNweDtcclxuICAgICAgICBtYXJnaW46IDFweCA5cHg7XHJcbiAgICAgIH1cclxuICAgICAgLmJvdHRvbS1kaXZpZGVyIHtcclxuICAgICAgICBoZWlnaHQ6IDFweDtcclxuICAgICAgICB3aWR0aDogY2FsYygxMDAlIC0gMjRweCk7XHJcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogbGlnaHRncmF5O1xyXG4gICAgICAgIG1hcmdpbjogNXB4IDEycHg7XHJcbiAgICAgIH1cclxuICAgICAgLmNvbnRlbnQtbmF2aWdhdGlvbiB7XHJcbiAgICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAgICBwYWRkaW5nOiAxMnB4IDEycHggMHB4IDEycHg7XHJcbiAgICAgIH1cclxuICAgICAgLmNvbnRlbnQtY29udGFpbmVyIHtcclxuICAgICAgICBoZWlnaHQ6IDEwMCU7XHJcbiAgICAgICAgd2lkdGg6IDEwMCU7XHJcbiAgICAgIH1cclxuICAgICAgLmVkaXRvci1uYXZiYXIge1xyXG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgICAgaGVpZ2h0OiAzMHB4O1xyXG4gICAgICAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDNweDtcclxuICAgICAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogM3B4O1xyXG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHJnYig4MSwgOTIsIDEwNik7XHJcbiAgICAgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcclxuICAgICAgICBjb2xvcjogd2hpdGU7XHJcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgICAgfVxyXG4gICAgICAuZWRpdG9yLW5hdmJhciBzcGFuIHtcclxuICAgICAgICBmb250LXNpemU6IDEzcHg7XHJcbiAgICAgICAgbWFyZ2luLWxlZnQ6IDEwcHg7XHJcbiAgICAgIH1cclxuICAgICAgLmNsb3NlLWJ1dHRvbiB7XHJcbiAgICAgICAgaGVpZ2h0OiAzMHB4O1xyXG4gICAgICAgIHdpZHRoOiAzMHB4O1xyXG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDNweDtcclxuICAgICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XHJcbiAgICAgIH1cclxuICAgICAgLmNsb3NlLWJ1dHRvbjpob3ZlciB7XHJcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDIxOCwgMjE4LCAyMTgpO1xyXG4gICAgICB9XHJcbiAgICAgIC5jbG9zZS1idXR0b24gaW1nIHtcclxuICAgICAgICBoZWlnaHQ6IDE2cHg7XHJcbiAgICAgICAgd2lkdGg6IDE2cHg7XHJcbiAgICAgICAgZmlsdGVyOiBicmlnaHRuZXNzKDApIGludmVydCgxKTtcclxuICAgICAgfVxyXG4gICAgICAuZWRpdG9yLWNvbnRhaW5lciB7XHJcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYmFjay1jb2xvcik7XHJcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgICAgIGxlZnQ6IGNhbGMoNTAlIC0gMTgycHgpO1xyXG4gICAgICAgIHRvcDogY2FsYyg1MCUgLSAxNzVweCk7XHJcbiAgICAgICAgei1pbmRleDogOTk5O1xyXG4gICAgICAgIHdpZHRoOiAzNjVweDtcclxuICAgICAgICBoZWlnaHQ6IDM1MHB4O1xyXG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xyXG4gICAgICAgIC1tb3otYm94LXNoYWRvdzogMHB4IDBweCA3cHggcmdiYSgwLCAwLCAwLCAwLjYpO1xyXG4gICAgICAgIC13ZWJraXQtYm94LXNoYWRvdzogMHB4IDBweCA3cHggcmdiKDAgMCAwIC8gNjAlKTtcclxuICAgICAgICBib3gtc2hhZG93OiAwIDAgN3B4IHJnYigwIDAgMCAvIDMwJSk7XHJcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgcmdiKDI1LCA3MSwgMTM4KTtcclxuICAgICAgICBjb2xvcjogdmFyKC0tdGV4dC1jb2xvcik7XHJcbiAgICAgICAgZm9udC1zaXplOiAxMnB4O1xyXG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDVweDtcclxuICAgICAgICBmb250LWZhbWlseTogXCJBcmlhbFwiO1xyXG4gICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XHJcbiAgICAgIH1cclxuICAgICAgLmJ1dHRvbiB7XHJcbiAgICAgICAgaGVpZ2h0OiAyNHB4O1xyXG4gICAgICAgIHdpZHRoOiA4MHB4O1xyXG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDNweDtcclxuICAgICAgICBtYXJnaW46IDNweCA1cHg7XHJcbiAgICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xyXG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50O1xyXG4gICAgICB9XHJcbiAgICAgIC5hY2NlcHQ6YWN0aXZlIHtcclxuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoNTMsIDkzLCAxNjApO1xyXG4gICAgICAgIGJvcmRlci1jb2xvcjogcmdiKDM4LCA3NiwgMTI1KTtcclxuICAgICAgfVxyXG4gICAgICAuY2FuY2VsOmFjdGl2ZSB7XHJcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDIyNiwgMjI2LCAyMjYpO1xyXG4gICAgICAgIGJvcmRlci1jb2xvcjogcmdiKDEzMSwgMTMxLCAxMzEpO1xyXG4gICAgICB9XHJcbiAgICAgIC5hY2NlcHQge1xyXG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHJnYigyNSwgNzEsIDEzOCk7XHJcbiAgICAgICAgY29sb3I6IHdoaXRlO1xyXG4gICAgICB9XHJcbiAgICAgIC5hY2NlcHQ6aG92ZXIge1xyXG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHJnYig2MSwgOTgsIDE1Mik7XHJcbiAgICAgIH1cclxuICAgICAgLmNhbmNlbCB7XHJcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDIyMSwgMjIxLCAyMjEpO1xyXG4gICAgICAgIGNvbG9yOiByZ2IoNjgsIDY4LCA2OCk7XHJcbiAgICAgIH1cclxuICAgICAgLmNhbmNlbDpob3ZlciB7XHJcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDIxMywgMjEzLCAyMTMpO1xyXG4gICAgICB9XHJcbiAgICAgIC5zZXR1cC1hY2NlcHQge1xyXG4gICAgICAgIHBhZGRpbmc6IDhweDtcclxuICAgICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICAgIGFsaWduLWl0ZW1zOiBmbGV4LWVuZDtcclxuICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1xyXG4gICAgICB9XHJcbiAgICBgLFxyXG4gIF0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTdGlFbGVjdHJvbmljU2lnbmF0dXJlRWRpdG9yQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xyXG4gIEBWaWV3Q2hpbGQoXCJjYW52YXNcIikgY2FudmFzOiBFbGVtZW50UmVmO1xyXG5cclxuICBwdWJsaWMgZ2V0IGJydXNoQ29sb3IoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5zaWduYXR1cmVTZXJ2aWNlPy5jdXJyZW50RWRpdGFibGVTaWduYXR1cmVFbGVtZW50Py5wZW5Db2xvclxyXG4gICAgICA/IHRoaXMuc2lnbmF0dXJlU2VydmljZT8uY3VycmVudEVkaXRhYmxlU2lnbmF0dXJlRWxlbWVudD8ucGVuQ29sb3JcclxuICAgICAgOiBDb2xvci5ibGFjaygpO1xyXG4gIH1cclxuICBwdWJsaWMgZHJhd2luZ01vZGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgaXNEcmF3aW5nOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIGNvbnRleHQ7XHJcbiAgcHVibGljIGRlZmF1bHRQcmV2aWV3VGV4dCA9IFwiRnVsbE5hbWUgRk5cIjtcclxuICBwdWJsaWMgc3RhcnRYOiBudW1iZXI7XHJcbiAgcHVibGljIHN0YXJ0WTogbnVtYmVyO1xyXG4gIHB1YmxpYyBzdGFydENvbXBvbmVudFg6IG51bWJlcjtcclxuICBwdWJsaWMgc3RhcnRDb21wb25lbnRZOiBudW1iZXI7XHJcbiAgcHVibGljIGlzRHJhZ2dpbmc6IGJvb2xlYW47XHJcbiAgcHVibGljIGRyYXdlZEltYWdlOiBhbnk7XHJcbiAgcHVibGljIGNhbnZhc1dpZHRoOiBudW1iZXI7XHJcbiAgcHVibGljIGNhbnZhc0hlaWdodDogbnVtYmVyO1xyXG4gIHB1YmxpYyBpbnNlcnRlZEltYWdlTGF5ZXI6IGFueTtcclxuICBwdWJsaWMgaW5zZXJ0ZWRUZXh0TGF5ZXI6IGFueTtcclxuICBwdWJsaWMgZHJhd2VkTGF5ZXI6IGFueTtcclxuICBwdWJsaWMgcmVzdWx0Q2FudmFzQ29udGV4dDogYW55O1xyXG4gIG1vdXNlVXBTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcclxuICBtb3VzZU1vdmVTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcclxuICB1cGRhdGVTaWduYXR1cmVTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcclxuICB1cGRhdGVSZXN1bHRDYW52YXNTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHB1YmxpYyBtb2RlbDogU3RpTW9kZWxTZXJ2aWNlLFxyXG4gICAgcHVibGljIGxvYzogU3RpTG9jYWxpemF0aW9uU2VydmljZSxcclxuICAgIHB1YmxpYyBtb3VzZVNlcnZpY2U6IFN0aU1vdXNlU2VydmljZSxcclxuICAgIHB1YmxpYyBzaWduYXR1cmVTZXJ2aWNlOiBTaWduYXR1cmVTZXJ2aWNlLFxyXG4gICAgcHVibGljIG1vZGFsV2luZG93U2VydmljZTogU3RpRHJhZ2dhYmxlTW9kYWxXaW5kb3dTZXJ2aWNlLFxyXG4gICAgcHVibGljIGNvbG9yU2VydmljZTogU3RpQ29sb3JEaWFsb2dTZXJ2aWNlXHJcbiAgKSB7IH1cclxuICBwdWJsaWMgZ2V0IGhhc1RlbXBsYXRlcygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnNpZ25hdHVyZVNlcnZpY2Uuc2F2ZWRUZW1wbGF0ZXMubGVuZ3RoID4gMDtcclxuICB9XHJcbiAgcHVibGljIGdldCBpbnNlcnRlZFRleHQoKTogU3RpVGV4dEl0ZW0ge1xyXG4gICAgcmV0dXJuIHRoaXMuc2lnbmF0dXJlU2VydmljZS5jdXJyZW50RWRpdGFibGVUZXh0O1xyXG4gIH1cclxuICBwdWJsaWMgZ2V0IGluc2VydGVkSW1hZ2UoKTogU3RpSW1hZ2VFZGl0b3JSZXN1bHQge1xyXG4gICAgcmV0dXJuIHRoaXMuc2lnbmF0dXJlU2VydmljZS5jdXJyZW50RWRpdGFibGVJbWFnZTtcclxuICB9XHJcbiAgcHVibGljIGdldCBmdWxsTmFtZSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuc2lnbmF0dXJlU2VydmljZS5jdXJyZW50RWRpdGFibGVGdWxsTmFtZTtcclxuICB9XHJcbiAgcHVibGljIHNldCBmdWxsTmFtZSh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnNpZ25hdHVyZVNlcnZpY2UuY3VycmVudEVkaXRhYmxlRnVsbE5hbWUgPSB2YWx1ZTtcclxuICB9XHJcbiAgcHVibGljIGdldCBpbml0aWFscygpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuc2lnbmF0dXJlU2VydmljZS5jdXJyZW50RWRpdGFibGVJbml0aWFscztcclxuICB9XHJcbiAgcHVibGljIHNldCBpbml0aWFscyh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnNpZ25hdHVyZVNlcnZpY2UuY3VycmVudEVkaXRhYmxlSW5pdGlhbHMgPSB2YWx1ZTtcclxuICB9XHJcbiAgaXNFbXB0eUNvbnRlbnQoKSB7XHJcbiAgICBpZiAodGhpcy5zaWduYXR1cmVTZXJ2aWNlLnNlbGVjdGVkTW9kZSA9PSBcIkRyYXdcIikge1xyXG4gICAgICByZXR1cm4gKFxyXG4gICAgICAgICF0aGlzLnNpZ25hdHVyZVNlcnZpY2UuY3VycmVudEVkaXRhYmxlSW1hZ2U/LmxvYWRlZEltYWdlICYmXHJcbiAgICAgICAgIXRoaXMuc2lnbmF0dXJlU2VydmljZS5jdXJyZW50RWRpdGFibGVUZXh0Py52YWx1ZSAmJlxyXG4gICAgICAgICF0aGlzLnNpZ25hdHVyZVNlcnZpY2UuY3VycmVudENhbnZhc0NvbnRlbnRcclxuICAgICAgKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiAhdGhpcy5zaWduYXR1cmVTZXJ2aWNlLmN1cnJlbnRFZGl0YWJsZUZ1bGxOYW1lICYmICF0aGlzLnNpZ25hdHVyZVNlcnZpY2UuY3VycmVudEVkaXRhYmxlSW5pdGlhbHM7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHNhdmVUZW1wbGF0ZSgpIHtcclxuICAgIGlmICh0aGlzLnNpZ25hdHVyZVNlcnZpY2Uuc2VsZWN0ZWRNb2RlID09IFwiRHJhd1wiKSB7XHJcbiAgICAgIGxldCBpbWFnZU9iajogU3RpU2lnbmF0dXJlRHJhd1RlbXBsYXRlID0ge1xyXG4gICAgICAgIHR5cGU6IFwiSW1hZ2VcIixcclxuICAgICAgICBpbWFnZTogdGhpcy5zaWduYXR1cmVTZXJ2aWNlLmN1cnJlbnRFZGl0YWJsZUltYWdlLFxyXG4gICAgICAgIHRleHQ6IHRoaXMuc2lnbmF0dXJlU2VydmljZS5jdXJyZW50RWRpdGFibGVUZXh0LFxyXG4gICAgICAgIGRyYXdlZEltYWdlOiB0aGlzLnNpZ25hdHVyZVNlcnZpY2UuY3VycmVudENhbnZhc0NvbnRlbnQsXHJcbiAgICAgIH07XHJcbiAgICAgIGlmICghdGhpcy5zaWduYXR1cmVTZXJ2aWNlLnNhdmVkVGVtcGxhdGVzLmZpbmQoKGl0ZW0pID0+IGl0ZW0gPT0gaW1hZ2VPYmopKSB7XHJcbiAgICAgICAgdGhpcy5zaWduYXR1cmVTZXJ2aWNlLnNhdmVkVGVtcGxhdGVzLnB1c2goaW1hZ2VPYmopO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsZXQgdGV4dE9iajogU3RpU2lnbmF0dXJlVHlwZVRlbXBsYXRlID0ge1xyXG4gICAgICAgIHR5cGU6IFwiVGV4dFwiLFxyXG4gICAgICAgIGZ1bGxOYW1lOiB0aGlzLnNpZ25hdHVyZVNlcnZpY2UuY3VycmVudEVkaXRhYmxlRnVsbE5hbWUsXHJcbiAgICAgICAgaW5pdGlhbHM6IHRoaXMuc2lnbmF0dXJlU2VydmljZS5jdXJyZW50RWRpdGFibGVJbml0aWFscyxcclxuICAgICAgICBzcGVjaWFsRm9udDogdGhpcy5zaWduYXR1cmVTZXJ2aWNlLmN1cnJlbnRQcmV2aWV3Rm9udCxcclxuICAgICAgfTtcclxuICAgICAgaWYgKCF0aGlzLnNpZ25hdHVyZVNlcnZpY2Uuc2F2ZWRUZW1wbGF0ZXMuZmluZCgoaXRlbSkgPT4gaXRlbSA9PSB0ZXh0T2JqKSkge1xyXG4gICAgICAgIHRoaXMuc2lnbmF0dXJlU2VydmljZS5zYXZlZFRlbXBsYXRlcy5wdXNoKHRleHRPYmopO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShcIlN0aVNpZ25hdHVyZVRlbXBsYXRlc1wiKTtcclxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiU3RpU2lnbmF0dXJlVGVtcGxhdGVzXCIsIEpTT04uc3RyaW5naWZ5KHRoaXMuc2lnbmF0dXJlU2VydmljZS5zYXZlZFRlbXBsYXRlcykpO1xyXG4gIH1cclxuICBzaG93U2F2ZWRUZW1wbGF0ZXNQcmV2aWV3KGJ1dHRvbikge1xyXG4gICAgbGV0IGJ1dHRvblJlY3QgPSB0aGlzLm1vZGVsLmdldFBvc2l0aW9uUmVsYXRpdmVUb0Zvcm0oYnV0dG9uKTtcclxuICAgIHRoaXMuc2lnbmF0dXJlU2VydmljZS50ZW1wbGF0ZXNQcmV2aWV3WCA9IGJ1dHRvblJlY3QucmlnaHQgLSAzMzU7XHJcbiAgICB0aGlzLnNpZ25hdHVyZVNlcnZpY2UudGVtcGxhdGVzUHJldmlld1kgPSBidXR0b25SZWN0LmJvdHRvbSArIDE7XHJcbiAgICB0aGlzLnNpZ25hdHVyZVNlcnZpY2Uuc2hvd1NhdmVkVGVtcGxhdGVzID0gIXRoaXMuc2lnbmF0dXJlU2VydmljZS5zaG93U2F2ZWRUZW1wbGF0ZXM7XHJcbiAgfVxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5zaWduYXR1cmVTZXJ2aWNlLmN1cnJlbnRFZGl0YWJsZVRleHQgPSBuZXcgU3RpVGV4dEl0ZW0oKTtcclxuICAgIHRoaXMuc2lnbmF0dXJlU2VydmljZS5jdXJyZW50Q2FudmFzQ29udGVudCA9IG51bGw7XHJcbiAgICB0aGlzLnNpZ25hdHVyZVNlcnZpY2UuY3VycmVudEVkaXRhYmxlSW1hZ2UgPSBuZXcgU3RpSW1hZ2VFZGl0b3JSZXN1bHQoKTtcclxuICAgIHRoaXMuc2lnbmF0dXJlU2VydmljZS5jdXJyZW50RWRpdGFibGVTaWduYXR1cmVFbGVtZW50ID0gbnVsbDtcclxuICB9XHJcbiAgcHVibGljIGlzQ2FudmFzQmxhbmsoY2FudmFzKSB7XHJcbiAgICBjb25zdCBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcclxuXHJcbiAgICBjb25zdCBwaXhlbEJ1ZmZlciA9IG5ldyBVaW50MzJBcnJheShjb250ZXh0LmdldEltYWdlRGF0YSgwLCAwLCBjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQpLmRhdGEuYnVmZmVyKTtcclxuXHJcbiAgICByZXR1cm4gIXBpeGVsQnVmZmVyLnNvbWUoKGNvbG9yKSA9PiBjb2xvciAhPT0gMCk7XHJcbiAgfVxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgIGNvbnN0IG9uUmVzaXplID0gKGV2ZW50KSA9PiB7XHJcbiAgICAgIHRoaXMuc2lnbmF0dXJlU2VydmljZS5lZGl0b3JDb21wb25lbnRYID0gKHdpbmRvdy5pbm5lcldpZHRoIC0gdGhpcy5zaWduYXR1cmVTZXJ2aWNlLmVkaXRvckNvbXBvbmVudFdpZHRoKSAvIDI7XHJcbiAgICAgIHRoaXMuc2lnbmF0dXJlU2VydmljZS5lZGl0b3JDb21wb25lbnRZID0gKHdpbmRvdy5pbm5lckhlaWdodCAtIHRoaXMuc2lnbmF0dXJlU2VydmljZS5lZGl0b3JDb21wb25lbnRIZWlnaHQpIC8gMjtcclxuICAgIH07XHJcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCBvblJlc2l6ZSk7XHJcbiAgICB0aGlzLmZpbGxEcmF3aW5nQ2FudmFzKCk7XHJcbiAgfVxyXG4gIGdldCBpbWFnZSgpIHtcclxuICAgIHJldHVybiBcInVybChcIiArIHRoaXMuaW5zZXJ0ZWRJbWFnZT8ubG9hZGVkSW1hZ2UgKyBcIilcIjtcclxuICB9XHJcbiAgZ2V0SG9yaXpvbnRhbEFsaWdubWVudCgpIHtcclxuICAgIGlmICh0aGlzLmluc2VydGVkSW1hZ2U/Lmhvcml6b250YWxBbGlnbm1lbnQgPT0gU3RpSG9yaXpvbnRhbEFsaWdubWVudC5DZW50ZXIpIHtcclxuICAgICAgcmV0dXJuIFwiY2VudGVyXCI7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuaW5zZXJ0ZWRJbWFnZT8uaG9yaXpvbnRhbEFsaWdubWVudCA9PSBTdGlIb3Jpem9udGFsQWxpZ25tZW50LkxlZnQpIHtcclxuICAgICAgcmV0dXJuIFwic3RhcnRcIjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBcImVuZFwiO1xyXG4gICAgfVxyXG4gIH1cclxuICBvbk1vdXNlRG93bihldmVudCwgY2FudmFzRWxlbWVudCkge1xyXG4gICAgaWYgKHRoaXMuZHJhd2luZ01vZGUpIHtcclxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgIHRoaXMuaXNEcmF3aW5nID0gdHJ1ZTtcclxuICAgICAgdGhpcy5jb250ZXh0ID0gY2FudmFzRWxlbWVudD8uZ2V0Q29udGV4dChcIjJkXCIpO1xyXG4gICAgICB0aGlzLmNvbnRleHQuc3Ryb2tlU3R5bGUgPSB0aGlzLmJydXNoQ29sb3IudG9IdG1sQ29sb3IoKTtcclxuICAgICAgY29uc3QgY29vcmRzID0gdGhpcy5yZWxhdGl2ZUNvb3JkcyhldmVudCwgY2FudmFzRWxlbWVudCk7XHJcbiAgICAgIHRoaXMuY29udGV4dC5tb3ZlVG8oY29vcmRzLngsIGNvb3Jkcy55KTtcclxuICAgIH1cclxuICB9XHJcbiAgcHJpdmF0ZSByZWxhdGl2ZUNvb3JkcyhldmVudCwgY2FudmFzRWxlbWVudCkge1xyXG4gICAgY29uc3QgYm91bmRzID0gdGhpcy5tb2RlbC5nZXRQb3NpdGlvblJlbGF0aXZlVG9Gb3JtKGNhbnZhc0VsZW1lbnQpO1xyXG4gICAgY29uc3QgeCA9IChldmVudC5jbGllbnRYIC0gYm91bmRzLmxlZnQpIC8gdGhpcy5tb2RlbC56b29tO1xyXG4gICAgY29uc3QgeSA9IChldmVudC5jbGllbnRZIC0gYm91bmRzLnRvcCkgLyB0aGlzLm1vZGVsLnpvb207XHJcbiAgICByZXR1cm4geyB4OiB4LCB5OiB5IH07XHJcbiAgfVxyXG4gIG9uQ2FudmFzTW92ZShldmVudCwgY2FudmFzRWxlbWVudCkge1xyXG4gICAgaWYgKHRoaXMuaXNEcmF3aW5nKSB7XHJcbiAgICAgIGNvbnN0IGNvb3JkcyA9IHRoaXMucmVsYXRpdmVDb29yZHMoZXZlbnQsIGNhbnZhc0VsZW1lbnQpO1xyXG4gICAgICB0aGlzLmNvbnRleHQubGluZVRvKGNvb3Jkcy54LCBjb29yZHMueSk7XHJcbiAgICAgIHRoaXMuY29udGV4dC5zdHJva2UoKTtcclxuICAgIH1cclxuICB9XHJcbiAgZ2V0QmFja2dyb3VuZFNpemUoY29udGFpbmVyKSB7XHJcbiAgICBpZiAoIXRoaXMuaW5zZXJ0ZWRJbWFnZT8ubG9hZGVkSW1hZ2UpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuaW5zZXJ0ZWRJbWFnZT8uYXNwZWN0UmF0aW8gJiYgdGhpcy5pbnNlcnRlZEltYWdlPy5zdHJldGNoKSB7XHJcbiAgICAgIHJldHVybiBcImNvbnRhaW5cIjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmluc2VydGVkSW1hZ2U/LnN0cmV0Y2gpIHtcclxuICAgICAgcmV0dXJuIGAke2NvbnRhaW5lci5vZmZzZXRXaWR0aH1weCAke2NvbnRhaW5lci5vZmZzZXRIZWlnaHR9cHhgO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGAke3RoaXMuaW5zZXJ0ZWRJbWFnZT8ubmF0dXJhbFdpZHRofXB4ICR7dGhpcy5pbnNlcnRlZEltYWdlPy5uYXR1cmFsSGVpZ2h0fXB4YDtcclxuICAgIH1cclxuICB9XHJcbiAgZ2V0QmFja2dyb3VuZFBvc2l0aW9uKCkge1xyXG4gICAgaWYgKHRoaXMuaW5zZXJ0ZWRJbWFnZT8uc3RyZXRjaCAmJiAhdGhpcy5pbnNlcnRlZEltYWdlPy5hc3BlY3RSYXRpbykge1xyXG4gICAgICByZXR1cm4gYGNlbnRlcmA7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gYCR7dGhpcy5zaWduYXR1cmVTZXJ2aWNlLmdldFZlcnRpY2FsUG9zaXRpb24oXHJcbiAgICAgICAgdGhpcy5pbnNlcnRlZEltYWdlPy52ZXJ0aWNhbEFsaWdubWVudFxyXG4gICAgICApfSAke3RoaXMuc2lnbmF0dXJlU2VydmljZS5nZXRIb3Jpem9udGFsUG9zaXRpb24odGhpcy5pbnNlcnRlZEltYWdlPy5ob3Jpem9udGFsQWxpZ25tZW50KX1gO1xyXG4gICAgfVxyXG4gIH1cclxuICBwdWJsaWMgZ2V0IHByZXZpZXdUZXh0KCkge1xyXG4gICAgcmV0dXJuICh0aGlzLmZ1bGxOYW1lICsgXCIgXCIgKyB0aGlzLmluaXRpYWxzKS5sZW5ndGggPiAxXHJcbiAgICAgID8gdGhpcy5mdWxsTmFtZSArIFwiIFwiICsgdGhpcy5pbml0aWFsc1xyXG4gICAgICA6IHRoaXMuZGVmYXVsdFByZXZpZXdUZXh0O1xyXG4gIH1cclxuICBnZXQgYWxpZ25tZW50KCkge1xyXG4gICAgaWYgKHRoaXMuaW5zZXJ0ZWRUZXh0Lmhvcml6b250YWxBbGlnbm1lbnQgPT0gU3RpSG9yaXpvbnRhbEFsaWdubWVudC5DZW50ZXIpIHtcclxuICAgICAgcmV0dXJuIFwiY2VudGVyXCI7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuaW5zZXJ0ZWRUZXh0Lmhvcml6b250YWxBbGlnbm1lbnQgPT0gU3RpSG9yaXpvbnRhbEFsaWdubWVudC5SaWdodCkge1xyXG4gICAgICByZXR1cm4gXCJlbmRcIjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBcInN0YXJ0XCI7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGNsZWFyKCkge1xyXG4gICAgdGhpcy5zaWduYXR1cmVTZXJ2aWNlLmN1cnJlbnRFZGl0YWJsZVRleHQudmFsdWUgPSBcIlwiO1xyXG4gICAgaWYgKHRoaXMuc2lnbmF0dXJlU2VydmljZT8uY3VycmVudEVkaXRhYmxlSW1hZ2U/LmxvYWRlZEltYWdlKSB7XHJcbiAgICAgIHRoaXMuc2lnbmF0dXJlU2VydmljZS5jdXJyZW50RWRpdGFibGVJbWFnZS5sb2FkZWRJbWFnZSA9IFwiXCI7XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMuY29udGV4dCkge1xyXG4gICAgICB0aGlzLmNvbnRleHQgPSB0aGlzLmNhbnZhcz8ubmF0aXZlRWxlbWVudD8uZ2V0Q29udGV4dChcIjJkXCIpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zaWduYXR1cmVTZXJ2aWNlLmN1cnJlbnRDYW52YXNDb250ZW50ID0gXCJcIjtcclxuICAgIHRoaXMuY29udGV4dD8uY2xlYXJSZWN0KDAsIDAsIHRoaXMuY2FudmFzPy5uYXRpdmVFbGVtZW50Py53aWR0aCwgdGhpcy5jYW52YXM/Lm5hdGl2ZUVsZW1lbnQ/LmhlaWdodCk7XHJcbiAgICB0aGlzLmNvbnRleHQ/LmJlZ2luUGF0aCgpO1xyXG4gIH1cclxuICBzaG93RWRpdG9yKGVkaXRvclR5cGU6IHN0cmluZykge1xyXG4gICAgdGhpcy5tb2RlbC5zaG93RHJhZ2dhYmxlTW9kYWxXaW5kb3cgPSB0cnVlO1xyXG4gICAgaWYgKGVkaXRvclR5cGUgPT0gXCJUZXh0XCIpIHtcclxuICAgICAgdGhpcy5tb2RhbFdpbmRvd1NlcnZpY2UuaXNUZXh0RWRpdG9yID0gdHJ1ZTtcclxuICAgICAgdGhpcy5zaWduYXR1cmVTZXJ2aWNlLmN1cnJlbnRFZGl0YWJsZVRleHQgPSB0aGlzLmluc2VydGVkVGV4dDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMubW9kYWxXaW5kb3dTZXJ2aWNlLmlzSW1hZ2VFZGl0b3IgPSB0cnVlO1xyXG4gICAgICB0aGlzLnNpZ25hdHVyZVNlcnZpY2UuY3VycmVudEVkaXRhYmxlSW1hZ2UgPSB0aGlzLmluc2VydGVkSW1hZ2U7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHNob3dDb2xvclBpY2tlcihlbGVtZW50LCBvYmplY3QsIGlzUmljaFRleHQgPSBmYWxzZSkge1xyXG4gICAgdGhpcy5jb2xvclNlcnZpY2Uub3BlbkRpYWxvZyhlbGVtZW50LCBvYmplY3QsIGlzUmljaFRleHQpO1xyXG4gIH1cclxuICBmaWxsRHJhd2luZ0NhbnZhcygpIHtcclxuICAgIGxldCBjdHggPSB0aGlzLmNhbnZhcz8ubmF0aXZlRWxlbWVudD8uZ2V0Q29udGV4dChcIjJkXCIpO1xyXG4gICAgaWYgKGN0eCAmJiB0aGlzLnNpZ25hdHVyZVNlcnZpY2UuY3VycmVudENhbnZhc0NvbnRlbnQpIHtcclxuICAgICAgY3R4LmNsZWFyUmVjdCgwLCAwLCB0aGlzLmNhbnZhcz8ubmF0aXZlRWxlbWVudD8ud2lkdGgsIHRoaXMuY2FudmFzPy5uYXRpdmVFbGVtZW50Py5oZWlnaHQpO1xyXG4gICAgICBsZXQgaW1hZ2UgPSBuZXcgSW1hZ2UoKTtcclxuICAgICAgaW1hZ2Uub25sb2FkID0gKCkgPT4ge1xyXG4gICAgICAgIGN0eC5kcmF3SW1hZ2UoaW1hZ2UsIDAsIDAsIHRoaXMuY2FudmFzPy5uYXRpdmVFbGVtZW50Py53aWR0aCwgdGhpcy5jYW52YXM/Lm5hdGl2ZUVsZW1lbnQ/LmhlaWdodCk7XHJcbiAgICAgIH07XHJcbiAgICAgIGltYWdlLnNyYyA9IHRoaXMuc2lnbmF0dXJlU2VydmljZS5jdXJyZW50Q2FudmFzQ29udGVudDtcclxuICAgIH1cclxuICB9XHJcbiAgc2hvd0ZvbnRzUHJldmlldyhlbGVtZW50KSB7XHJcbiAgICB0aGlzLnNpZ25hdHVyZVNlcnZpY2Uuc2hvd0ZvbnRzUHJldmlldyA9ICF0aGlzLnNpZ25hdHVyZVNlcnZpY2Uuc2hvd0ZvbnRzUHJldmlldztcclxuICAgIGxldCByZWN0ID0gdGhpcy5tb2RlbC5nZXRQb3NpdGlvblJlbGF0aXZlVG9Gb3JtKGVsZW1lbnQpO1xyXG4gICAgdGhpcy5zaWduYXR1cmVTZXJ2aWNlLmZvbnRzUHJldmlld1ggPSByZWN0LnJpZ2h0IC0gMjAwO1xyXG4gICAgdGhpcy5zaWduYXR1cmVTZXJ2aWNlLmZvbnRzUHJldmlld1kgPSByZWN0LmJvdHRvbSArIDI7XHJcbiAgfVxyXG4gIGFjY2VwdENoYW5nZXMoKSB7XHJcbiAgICB0aGlzLnNpZ25hdHVyZVNlcnZpY2UuY3VycmVudEFjdGl2ZUxvYWRpbmdJbWFnZXMgPSAwO1xyXG4gICAgdGhpcy5zaWduYXR1cmVTZXJ2aWNlLmNvbXBsZXRlZExvYWRpbmdJbWFnZXMgPSAwO1xyXG4gICAgdGhpcy5zaWduYXR1cmVTZXJ2aWNlLmN1cnJlbnRFZGl0YWJsZVNpZ25hdHVyZUVsZW1lbnQuZnVsbE5hbWUgPSB0aGlzLnNpZ25hdHVyZVNlcnZpY2UuY3VycmVudEVkaXRhYmxlRnVsbE5hbWU7XHJcbiAgICB0aGlzLnNpZ25hdHVyZVNlcnZpY2UuY3VycmVudEVkaXRhYmxlU2lnbmF0dXJlRWxlbWVudC5pbml0aWFscyA9IHRoaXMuc2lnbmF0dXJlU2VydmljZS5jdXJyZW50RWRpdGFibGVJbml0aWFscztcclxuICAgIHRoaXMuc2lnbmF0dXJlU2VydmljZS5jdXJyZW50RWRpdGFibGVTaWduYXR1cmVFbGVtZW50LnNwZWNpYWxGb250ID0gdGhpcy5zaWduYXR1cmVTZXJ2aWNlLmN1cnJlbnRQcmV2aWV3Rm9udDtcclxuICAgIGxldCBjYW52YXNSZWN0ID0gdGhpcy5tb2RlbC5nZXRQb3NpdGlvblJlbGF0aXZlVG9Gb3JtKHRoaXMuY2FudmFzPy5uYXRpdmVFbGVtZW50KTtcclxuICAgIGlmIChjYW52YXNSZWN0ICYmIHRoaXMuc2lnbmF0dXJlU2VydmljZS5zZWxlY3RlZE1vZGUgPT0gXCJEcmF3XCIpIHtcclxuICAgICAgbGV0IHJlc3VsdENhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XHJcbiAgICAgIHRoaXMuY2FudmFzV2lkdGggPSBjYW52YXNSZWN0LndpZHRoO1xyXG4gICAgICB0aGlzLmNhbnZhc0hlaWdodCA9IGNhbnZhc1JlY3QuaGVpZ2h0O1xyXG4gICAgICByZXN1bHRDYW52YXMud2lkdGggPSB0aGlzLmNhbnZhc1dpZHRoO1xyXG4gICAgICByZXN1bHRDYW52YXMuaGVpZ2h0ID0gdGhpcy5jYW52YXNIZWlnaHQ7XHJcbiAgICAgIGxldCBjdHggPSByZXN1bHRDYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xyXG4gICAgICB0aGlzLnJlc3VsdENhbnZhc0NvbnRleHQgPSBjdHg7XHJcbiAgICAgIHRoaXMuaW5zZXJ0ZWRJbWFnZUxheWVyID0gdGhpcy5jcmVhdGVMYXllcihyZXN1bHRDYW52YXMpO1xyXG4gICAgICB0aGlzLmluc2VydGVkVGV4dExheWVyID0gdGhpcy5jcmVhdGVMYXllcihyZXN1bHRDYW52YXMpO1xyXG4gICAgICB0aGlzLmRyYXdlZExheWVyID0gdGhpcy5jcmVhdGVMYXllcihyZXN1bHRDYW52YXMpO1xyXG4gICAgICBpZiAodGhpcy5pbnNlcnRlZEltYWdlPy5sb2FkZWRJbWFnZSkge1xyXG4gICAgICAgIHRoaXMuZmlsbExheWVyKHRoaXMuaW5zZXJ0ZWRJbWFnZUxheWVyLCB0aGlzLmluc2VydGVkSW1hZ2UpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLmluc2VydGVkVGV4dD8udmFsdWUpIHtcclxuICAgICAgICB0aGlzLmZpbGxMYXllcih0aGlzLmluc2VydGVkVGV4dExheWVyLCB0aGlzLmluc2VydGVkVGV4dCk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCF0aGlzLmlzQ2FudmFzQmxhbmsodGhpcy5jYW52YXM/Lm5hdGl2ZUVsZW1lbnQpKSB7XHJcbiAgICAgICAgdGhpcy5maWxsTGF5ZXIodGhpcy5kcmF3ZWRMYXllciwgdGhpcy5jYW52YXM/Lm5hdGl2ZUVsZW1lbnQ/LnRvRGF0YVVSTChcImltYWdlL3BuZ1wiKSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zaWduYXR1cmVTZXJ2aWNlLmN1cnJlbnRDYW52YXNDb250ZW50ID0gXCJcIjtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnNpZ25hdHVyZVNlcnZpY2UuY2hlY2tMb2FkaW5nKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnVwZGF0ZVJlc3VsdENhbnZhcyhcIlRleHRcIik7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5zaWduYXR1cmVTZXJ2aWNlLnNlbGVjdGVkTW9kZSA9PSBcIkRyYXdcIikge1xyXG4gICAgICB0aGlzLnNpZ25hdHVyZVNlcnZpY2UuY3VycmVudEVkaXRhYmxlU2lnbmF0dXJlRWxlbWVudC5jdXJyZW50U2lnbmF0dXJlTW9kZSA9IFwiRHJhd1wiO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zaWduYXR1cmVTZXJ2aWNlLmN1cnJlbnRFZGl0YWJsZVNpZ25hdHVyZUVsZW1lbnQuY3VycmVudFNpZ25hdHVyZU1vZGUgPSBcIlR5cGVcIjtcclxuICAgIH1cclxuICB9XHJcbiAgY3JlYXRlTGF5ZXIoY2FudmFzKSB7XHJcbiAgICBsZXQgbGF5ZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xyXG4gICAgbGF5ZXIud2lkdGggPSBjYW52YXMud2lkdGg7XHJcbiAgICBsYXllci5oZWlnaHQgPSBjYW52YXMuaGVpZ2h0O1xyXG4gICAgcmV0dXJuIGxheWVyLmdldENvbnRleHQoXCIyZFwiKTtcclxuICB9XHJcbiAgZHJhd0xheWVyKGNvbnRleHQsIGxheWVyKSB7XHJcbiAgICBpZiAobGF5ZXIpIHtcclxuICAgICAgY29udGV4dC5kcmF3SW1hZ2UobGF5ZXIuY2FudmFzLCAwLCAwKTtcclxuICAgIH1cclxuICB9XHJcbiAgZmlsbExheWVyKGxheWVyOiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsIGNvbnRlbnQ6IFN0aVRleHRJdGVtIHwgU3RpSW1hZ2VFZGl0b3JSZXN1bHQgfCBhbnkpIHtcclxuICAgIGlmIChjb250ZW50IGluc3RhbmNlb2YgU3RpVGV4dEl0ZW0pIHtcclxuICAgICAgaWYgKGNvbnRlbnQudmFsdWUpIHtcclxuICAgICAgICBsYXllci5mb250ID0gYCR7Y29udGVudC5mb250LmlzSXRhbGljKCkgPyBcIml0YWxpYyBcIiA6IFwiXCJ9JHtjb250ZW50LmZvbnQuaXNCb2xkKCkgPyBcImJvbGQgXCIgOiBcIlwifSR7Y29udGVudC5mb250LnNpemUgKyBcInB4IFwiXHJcbiAgICAgICAgICB9JHtjb250ZW50LmZvbnQuZmFtaWx5fWA7XHJcbiAgICAgICAgbGF5ZXIudGV4dEJhc2VsaW5lID0gXCJjZW50ZXJcIiBhcyBhbnk7XHJcbiAgICAgICAgbGF5ZXIudGV4dEFsaWduID0gRW51bS5nZXROYW1lKFN0aUhvcml6b250YWxBbGlnbm1lbnQsIGNvbnRlbnQuaG9yaXpvbnRhbEFsaWdubWVudCkudG9Mb2NhbGVMb3dlckNhc2UoKSBhcyBhbnk7XHJcbiAgICAgICAgbGF5ZXIuZmlsbFRleHQoXHJcbiAgICAgICAgICBjb250ZW50LnZhbHVlLFxyXG4gICAgICAgICAgRW51bS5nZXROYW1lKFN0aUhvcml6b250YWxBbGlnbm1lbnQsIGNvbnRlbnQuaG9yaXpvbnRhbEFsaWdubWVudCkudG9Mb2NhbGVMb3dlckNhc2UoKSA9PSBcImxlZnRcIlxyXG4gICAgICAgICAgICA/IDBcclxuICAgICAgICAgICAgOiBFbnVtLmdldE5hbWUoU3RpSG9yaXpvbnRhbEFsaWdubWVudCwgY29udGVudC5ob3Jpem9udGFsQWxpZ25tZW50KS50b0xvY2FsZUxvd2VyQ2FzZSgpID09IFwiY2VudGVyXCJcclxuICAgICAgICAgICAgICA/IHRoaXMuY2FudmFzV2lkdGggLyAyXHJcbiAgICAgICAgICAgICAgOiB0aGlzLmNhbnZhc1dpZHRoIC0gbGF5ZXIubWVhc3VyZVRleHQoY29udGVudC52YWx1ZSkud2lkdGgsXHJcbiAgICAgICAgICB0aGlzLmNhbnZhc0hlaWdodCAvIDJcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKGNvbnRlbnQ/LmxvYWRlZEltYWdlKSB7XHJcbiAgICAgIHRoaXMuc2lnbmF0dXJlU2VydmljZS5jdXJyZW50QWN0aXZlTG9hZGluZ0ltYWdlcyArPSAxO1xyXG4gICAgICBsZXQgaW1hZ2UgPSBuZXcgSW1hZ2UoKTtcclxuICAgICAgaW1hZ2Uub25sb2FkID0gKCkgPT4ge1xyXG4gICAgICAgIGlmIChjb250ZW50Py5hc3BlY3RSYXRpbyAmJiBjb250ZW50Py5zdHJldGNoKSB7XHJcbiAgICAgICAgICBsZXQgaFJhdGlvID0gdGhpcy5jYW52YXNXaWR0aCAvIGltYWdlLm5hdHVyYWxXaWR0aDtcclxuICAgICAgICAgIGxldCB2UmF0aW8gPSB0aGlzLmNhbnZhc0hlaWdodCAvIGltYWdlLm5hdHVyYWxIZWlnaHQ7XHJcbiAgICAgICAgICBsZXQgcmF0aW8gPSBNYXRoLm1pbihoUmF0aW8sIHZSYXRpbyk7XHJcbiAgICAgICAgICBsZXQgY2VudGVyU2hpZnRYID0gKHRoaXMuY2FudmFzV2lkdGggLSBpbWFnZS5uYXR1cmFsV2lkdGggKiByYXRpbykgLyAyO1xyXG4gICAgICAgICAgbGV0IGNlbnRlclNoaWZ0WSA9ICh0aGlzLmNhbnZhc0hlaWdodCAtIGltYWdlLm5hdHVyYWxIZWlnaHQgKiByYXRpbykgLyAyO1xyXG4gICAgICAgICAgbGF5ZXIuZHJhd0ltYWdlKFxyXG4gICAgICAgICAgICBpbWFnZSxcclxuICAgICAgICAgICAgMCxcclxuICAgICAgICAgICAgMCxcclxuICAgICAgICAgICAgaW1hZ2UubmF0dXJhbFdpZHRoLFxyXG4gICAgICAgICAgICBpbWFnZS5uYXR1cmFsSGVpZ2h0LFxyXG4gICAgICAgICAgICBjZW50ZXJTaGlmdFgsXHJcbiAgICAgICAgICAgIGNlbnRlclNoaWZ0WSxcclxuICAgICAgICAgICAgaW1hZ2UubmF0dXJhbFdpZHRoICogcmF0aW8sXHJcbiAgICAgICAgICAgIGltYWdlLm5hdHVyYWxIZWlnaHQgKiByYXRpb1xyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIHRoaXMuc2lnbmF0dXJlU2VydmljZS5jb21wbGV0ZWRMb2FkaW5nSW1hZ2VzICs9IDE7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGxheWVyLmRyYXdJbWFnZShcclxuICAgICAgICAgICAgaW1hZ2UsXHJcbiAgICAgICAgICAgIDAsXHJcbiAgICAgICAgICAgIDAsXHJcbiAgICAgICAgICAgIGNvbnRlbnQuc3RyZXRjaCA/IHRoaXMuY2FudmFzV2lkdGggOiBpbWFnZS5uYXR1cmFsV2lkdGgsXHJcbiAgICAgICAgICAgIGNvbnRlbnQuc3RyZXRjaCA/IHRoaXMuY2FudmFzSGVpZ2h0IDogaW1hZ2UubmF0dXJhbEhlaWdodFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIHRoaXMuc2lnbmF0dXJlU2VydmljZS5jb21wbGV0ZWRMb2FkaW5nSW1hZ2VzICs9IDE7XHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG4gICAgICBpbWFnZS5zcmMgPSBjb250ZW50LmxvYWRlZEltYWdlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHR5cGVvZiBjb250ZW50ID09PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgICAgdGhpcy5zaWduYXR1cmVTZXJ2aWNlLmN1cnJlbnRBY3RpdmVMb2FkaW5nSW1hZ2VzICs9IDE7XHJcbiAgICAgICAgbGV0IGltYWdlID0gbmV3IEltYWdlKCk7XHJcbiAgICAgICAgaW1hZ2Uub25sb2FkID0gKCkgPT4ge1xyXG4gICAgICAgICAgbGF5ZXIuZHJhd0ltYWdlKGltYWdlLCAwLCAwLCB0aGlzLmNhbnZhc1dpZHRoLCB0aGlzLmNhbnZhc0hlaWdodCk7XHJcbiAgICAgICAgICB0aGlzLnNpZ25hdHVyZVNlcnZpY2UuY29tcGxldGVkTG9hZGluZ0ltYWdlcyArPSAxO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgaW1hZ2Uuc3JjID0gY29udGVudDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2hhbmdlTW9kZShtb2RlKSB7XHJcbiAgICB0aGlzLnNpZ25hdHVyZVNlcnZpY2Uuc2VsZWN0ZWRNb2RlID0gbW9kZTtcclxuICAgIGlmIChtb2RlID09IFwiRHJhd1wiKSB7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuZmlsbERyYXdpbmdDYW52YXMoKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHVwZGF0ZVJlc3VsdENhbnZhcyh0eXBlID0gXCJEcmF3XCIpIHtcclxuICAgIGlmICh0eXBlID09IFwiRHJhd1wiKSB7XHJcbiAgICAgIHRoaXMuZHJhd0xheWVyKHRoaXMucmVzdWx0Q2FudmFzQ29udGV4dCwgdGhpcy5pbnNlcnRlZEltYWdlTGF5ZXIpO1xyXG4gICAgICB0aGlzLmRyYXdMYXllcih0aGlzLnJlc3VsdENhbnZhc0NvbnRleHQsIHRoaXMuaW5zZXJ0ZWRUZXh0TGF5ZXIpO1xyXG4gICAgICB0aGlzLmRyYXdMYXllcih0aGlzLnJlc3VsdENhbnZhc0NvbnRleHQsIHRoaXMuZHJhd2VkTGF5ZXIpO1xyXG4gICAgICAvLyBjb25zb2xlLmxvZyh0aGlzLnJlc3VsdENhbnZhc0NvbnRleHQuY2FudmFzLnRvRGF0YVVSTChcImltYWdlL3BuZ1wiKSk7XHJcbiAgICAgIGlmICh0aGlzLnJlc3VsdENhbnZhc0NvbnRleHQ/LmNhbnZhcz8udG9EYXRhVVJMKFwiaW1hZ2UvcG5nXCIpKSB7XHJcbiAgICAgICAgdGhpcy5zaWduYXR1cmVTZXJ2aWNlLmN1cnJlbnRFZGl0YWJsZVNpZ25hdHVyZUVsZW1lbnQuYmFja2dyb3VuZEltYWdlID1cclxuICAgICAgICAgIHRoaXMucmVzdWx0Q2FudmFzQ29udGV4dC5jYW52YXMudG9EYXRhVVJMKFwiaW1hZ2UvcG5nXCIpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuc2lnbmF0dXJlU2VydmljZS5jdXJyZW50RWRpdGFibGVTaWduYXR1cmVFbGVtZW50Lmluc2VydGVkSW1hZ2UgPSB0aGlzLnNpZ25hdHVyZVNlcnZpY2UuY3VycmVudEVkaXRhYmxlSW1hZ2U7XHJcbiAgICAgIHRoaXMuc2lnbmF0dXJlU2VydmljZS5jdXJyZW50RWRpdGFibGVTaWduYXR1cmVFbGVtZW50Lmluc2VydGVkVGV4dCA9IHRoaXMuc2lnbmF0dXJlU2VydmljZS5jdXJyZW50RWRpdGFibGVUZXh0O1xyXG4gICAgICBpZiAodGhpcy5zaWduYXR1cmVTZXJ2aWNlLmN1cnJlbnRDYW52YXNDb250ZW50KSB7XHJcbiAgICAgICAgdGhpcy5zaWduYXR1cmVTZXJ2aWNlLmN1cnJlbnRFZGl0YWJsZVNpZ25hdHVyZUVsZW1lbnQuZHJhd2VkSW1hZ2UgPSB0aGlzLnNpZ25hdHVyZVNlcnZpY2UuY3VycmVudENhbnZhc0NvbnRlbnQ7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zaWduYXR1cmVTZXJ2aWNlLmN1cnJlbnRFZGl0YWJsZVNpZ25hdHVyZUVsZW1lbnQuZHJhd2VkSW1hZ2UgPSBcIlwiO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLnNpZ25hdHVyZVNlcnZpY2UuY3VycmVudEVkaXRhYmxlU2lnbmF0dXJlRWxlbWVudC5pc1NpZ25lZCA9IHRydWU7XHJcbiAgICB0aGlzLm1vZGVsLnNob3dTaWduYXR1cmVFZGl0b3IgPSBmYWxzZTtcclxuICAgIC8vIHRoaXMuc2lnbmF0dXJlU2VydmljZS5jdXJyZW50U2lnbmF0dXJlRWxlbWVudCA9IG51bGw7XHJcbiAgfVxyXG4gIG9uTW91c2VNb3ZlKGV2ZW50KSB7XHJcbiAgICBpZiAodGhpcy5pc0RyYWdnaW5nKSB7XHJcbiAgICAgIGxldCBkZWx0YVggPSBldmVudC5jbGllbnRYIC0gdGhpcy5zdGFydFg7XHJcbiAgICAgIGxldCBkZWx0YVkgPSBldmVudC5jbGllbnRZIC0gdGhpcy5zdGFydFk7XHJcbiAgICAgIGlmICh0aGlzLnN0YXJ0Q29tcG9uZW50WCArIGRlbHRhWCA8IDApIHtcclxuICAgICAgICB0aGlzLnNpZ25hdHVyZVNlcnZpY2UuZWRpdG9yQ29tcG9uZW50WCA9IDA7XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5zdGFydENvbXBvbmVudFggKyBkZWx0YVggPiB3aW5kb3cuaW5uZXJXaWR0aCAtIHRoaXMuc2lnbmF0dXJlU2VydmljZS5lZGl0b3JDb21wb25lbnRXaWR0aCkge1xyXG4gICAgICAgIHRoaXMuc2lnbmF0dXJlU2VydmljZS5lZGl0b3JDb21wb25lbnRYID0gd2luZG93LmlubmVyV2lkdGggLSB0aGlzLnNpZ25hdHVyZVNlcnZpY2UuZWRpdG9yQ29tcG9uZW50V2lkdGg7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zaWduYXR1cmVTZXJ2aWNlLmVkaXRvckNvbXBvbmVudFggPSB0aGlzLnN0YXJ0Q29tcG9uZW50WCArIGRlbHRhWDtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMuc3RhcnRDb21wb25lbnRZICsgZGVsdGFZIDwgMCkge1xyXG4gICAgICAgIHRoaXMuc2lnbmF0dXJlU2VydmljZS5lZGl0b3JDb21wb25lbnRZID0gMDtcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLnN0YXJ0Q29tcG9uZW50WSArIGRlbHRhWSA+IHdpbmRvdy5pbm5lckhlaWdodCAtIHRoaXMuc2lnbmF0dXJlU2VydmljZS5lZGl0b3JDb21wb25lbnRIZWlnaHQpIHtcclxuICAgICAgICB0aGlzLnNpZ25hdHVyZVNlcnZpY2UuZWRpdG9yQ29tcG9uZW50WSA9IHdpbmRvdy5pbm5lckhlaWdodCAtIHRoaXMuc2lnbmF0dXJlU2VydmljZS5lZGl0b3JDb21wb25lbnRIZWlnaHQ7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zaWduYXR1cmVTZXJ2aWNlLmVkaXRvckNvbXBvbmVudFkgPSB0aGlzLnN0YXJ0Q29tcG9uZW50WSArIGRlbHRhWTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICBzdGFydERyYWcoZXZlbnQpIHtcclxuICAgIHRoaXMuc3RhcnRYID0gZXZlbnQuY2xpZW50WDtcclxuICAgIHRoaXMuc3RhcnRZID0gZXZlbnQuY2xpZW50WTtcclxuICAgIHRoaXMuc3RhcnRDb21wb25lbnRYID0gdGhpcy5zaWduYXR1cmVTZXJ2aWNlLmVkaXRvckNvbXBvbmVudFg7XHJcbiAgICB0aGlzLnN0YXJ0Q29tcG9uZW50WSA9IHRoaXMuc2lnbmF0dXJlU2VydmljZS5lZGl0b3JDb21wb25lbnRZO1xyXG4gICAgdGhpcy5pc0RyYWdnaW5nID0gdHJ1ZTtcclxuICB9XHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLmRyYXdpbmdNb2RlID0gdHJ1ZTtcclxuICAgIGlmIChsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcIlN0aVNpZ25hdHVyZVRlbXBsYXRlc1wiKSkge1xyXG4gICAgICB0aGlzLnNpZ25hdHVyZVNlcnZpY2Uuc2F2ZWRUZW1wbGF0ZXMgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiU3RpU2lnbmF0dXJlVGVtcGxhdGVzXCIpKTtcclxuICAgIH1cclxuICAgIHRoaXMuc2lnbmF0dXJlU2VydmljZS5lZGl0b3JDb21wb25lbnRYID0gKHdpbmRvdy5pbm5lcldpZHRoIC0gdGhpcy5zaWduYXR1cmVTZXJ2aWNlLmVkaXRvckNvbXBvbmVudFdpZHRoKSAvIDI7XHJcbiAgICB0aGlzLnNpZ25hdHVyZVNlcnZpY2UuZWRpdG9yQ29tcG9uZW50WSA9ICh3aW5kb3cuaW5uZXJIZWlnaHQgLSB0aGlzLnNpZ25hdHVyZVNlcnZpY2UuZWRpdG9yQ29tcG9uZW50SGVpZ2h0KSAvIDI7XHJcbiAgICB0aGlzLnVwZGF0ZVNpZ25hdHVyZVN1YnNjcmlwdGlvbiA9IHRoaXMuc2lnbmF0dXJlU2VydmljZS51cGRhdGVTaWduYXR1cmUuc3Vic2NyaWJlKChldmVudCkgPT4ge1xyXG4gICAgICBpZiAoZXZlbnQudHlwZSA9PSBcIlRleHRcIikge1xyXG4gICAgICAgIHRoaXMuc2lnbmF0dXJlU2VydmljZS5jdXJyZW50RWRpdGFibGVUZXh0ID0gZXZlbnQudmFsdWU7XHJcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQudHlwZSA9PSBcIkltYWdlXCIpIHtcclxuICAgICAgICB0aGlzLnNpZ25hdHVyZVNlcnZpY2UuY3VycmVudEVkaXRhYmxlSW1hZ2UgPSBldmVudC52YWx1ZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLnVwZGF0ZVJlc3VsdENhbnZhc1N1YnNjcmlwdGlvbiA9IHRoaXMuc2lnbmF0dXJlU2VydmljZS5jb21wbGV0ZWRMb2FkaW5nLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgIHRoaXMudXBkYXRlUmVzdWx0Q2FudmFzKCk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMubW91c2VVcFN1YnNjcmlwdGlvbiA9IHRoaXMubW91c2VTZXJ2aWNlLmdldERvY3VtZW50TW91c2VVcCgpLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLmlzRHJhd2luZyAmJiAhdGhpcy5pc0NhbnZhc0JsYW5rKHRoaXMuY2FudmFzPy5uYXRpdmVFbGVtZW50KSkge1xyXG4gICAgICAgIHRoaXMuc2lnbmF0dXJlU2VydmljZS5jdXJyZW50Q2FudmFzQ29udGVudCA9IHRoaXMuY2FudmFzPy5uYXRpdmVFbGVtZW50Py50b0RhdGFVUkwoXCJpbWFnZS9wbmdcIik7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5pc0RyYWdnaW5nID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuaXNEcmF3aW5nID0gZmFsc2U7XHJcbiAgICB9KTtcclxuICAgIHRoaXMubW91c2VNb3ZlU3Vic2NyaXB0aW9uID0gdGhpcy5tb3VzZVNlcnZpY2UuZ2V0RG9jdW1lbnRNb3VzZU1vdmUoKS5zdWJzY3JpYmUoKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XHJcbiAgICAgIHRoaXMub25Nb3VzZU1vdmUoZXZlbnQpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcbiJdfQ==