UNPKG

@asoftwareworld/form-builder

Version:

ASW Form Builder helps you with rapid development and designed web forms which includes several controls. The key feature of Form Builder is to make your content attractive and effective. We can customize our control at run time and preview the same befor

170 lines 45.6 kB
/** * @license * Copyright ASW (A Software World) All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file */ import { Component, Inject } from '@angular/core'; import { MAT_DIALOG_DATA } from '@angular/material/dialog'; import { Constants } from '@asoftwareworld/form-builder/form-control/core'; import * as i0 from "@angular/core"; import * as i1 from "@angular/forms"; import * as i2 from "@angular/material/dialog"; import * as i3 from "@angular/common"; import * as i4 from "@asoftwareworld/form-builder/image-crop"; import * as i5 from "@angular/material/tooltip"; import * as i6 from "@angular/material/icon"; export class AswImageUploadDialog { formBuilder; dialogRef; control; constants = Constants; aswImageCropForm; imageChangedEvent = ''; croppedImage = ''; canvasRotation = 0; rotation = 0; scale = 1; showCropper = false; isImageLoaded = false; containWithinAspectRatio = false; transform = {}; constructor(formBuilder, dialogRef, control) { this.formBuilder = formBuilder; this.dialogRef = dialogRef; this.control = control; } ngOnInit() { this.validateFormBuilder(); this.editProperty(this.control); this.croppedImage = this.control.imageUrl; this.isImageLoaded = this.control.imageUrl ? false : true; } fileChangeEvent(event) { this.isImageLoaded = true; this.imageChangedEvent = event; } removeImage() { this.isImageLoaded = true; this.imageChangedEvent = null; } imageCropped(event) { this.croppedImage = event.base64; } imageLoaded() { this.showCropper = true; } cropperReady(sourceImageDimensions) { this.isImageLoaded = false; } loadImageFailed() { console.log('Load failed'); } rotateLeft() { this.isImageLoaded = true; setTimeout(() => { this.canvasRotation--; this.flipAfterRotate(); }); } rotateRight() { this.isImageLoaded = true; setTimeout(() => { this.canvasRotation++; this.flipAfterRotate(); }); } flipAfterRotate() { const flippedH = this.transform.flipH; const flippedV = this.transform.flipV; this.transform = { ...this.transform, flipH: flippedV, flipV: flippedH }; } flipHorizontal() { this.transform = { ...this.transform, flipH: !this.transform.flipH }; } flipVertical() { this.transform = { ...this.transform, flipV: !this.transform.flipV }; } resetImage() { this.scale = 1; this.rotation = 0; this.canvasRotation = 0; this.transform = {}; } zoomOut() { this.scale -= .1; this.transform = { ...this.transform, scale: this.scale }; } zoomIn() { this.scale += .1; this.transform = { ...this.transform, scale: this.scale }; } toggleContainWithinAspectRatio() { this.containWithinAspectRatio = !this.containWithinAspectRatio; } updateRotation() { this.transform = { ...this.transform, rotate: this.rotation }; } onNoClick() { this.dialogRef.close(); } validateFormBuilder() { this.aswImageCropForm = this.formBuilder.group({ file: [null] }); } editProperty(control) { if (control.event) { this.isImageLoaded = false; } this.aswImageCropForm.setValue({ file: control.imageUrl }); } onSubmit() { if (this.aswImageCropForm.invalid) { return; } this.aswImageCropForm.value.displayName = this.control.displayName; this.aswImageCropForm.value.controlType = this.control.controlType; this.aswImageCropForm.value.label = this.control.label; this.aswImageCropForm.value.class = this.control.class; this.aswImageCropForm.value.column = this.control.column; this.aswImageCropForm.value.imageUrl = this.croppedImage; this.aswImageCropForm.value.imageShape = this.control.imageShape; this.aswImageCropForm.value.height = this.control.height; this.aswImageCropForm.value.width = this.control.width; this.aswImageCropForm.value.event = this.imageChangedEvent; this.dialogRef.close(this.aswImageCropForm.value); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: AswImageUploadDialog, deps: [{ token: i1.FormBuilder }, { token: i2.MatDialogRef }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.11", type: AswImageUploadDialog, selector: "asw-image-upload-dialog", ngImport: i0, template: "<h4 mat-dialog-title>Crop Uploaded Image</h4>\r\n<form [formGroup]=\"aswImageCropForm\" (ngSubmit)=\"onSubmit()\">\r\n <mat-dialog-content class=\"mat-typography\">\r\n <div class=\"row\">\r\n <div class=\"col-md-2\">\r\n <div class=\"text-center btn-toolbar mt-2\" role=\"toolbar\" aria-label=\"Image controls toolbar\">\r\n <div class=\"btn-group-vertical\" role=\"group\" aria-label=\"toolbar\">\r\n <button type=\"button\" \r\n class=\"asw-btn btn btn-outline-primary\"\r\n (click)=\"fileInput.click()\"\r\n matTooltip=\"Load image\" \r\n *ngIf=\"isImageLoaded\">\r\n <input style=\"display: none\" \r\n type=\"file\" \r\n #fileInput \r\n (change)=\"fileChangeEvent($event)\"\r\n id=\"imageUpload\" \r\n accept=\".png, .jpg, .jpeg\">\r\n <mat-icon>attach_file</mat-icon>\r\n </button>\r\n <button type=\"button\" \r\n class=\"asw-btn btn btn-outline-primary\"\r\n matTooltip=\"Remove image\"\r\n matTooltipPosition=\"right\"\r\n *ngIf=\"!isImageLoaded\" \r\n (click)=\"removeImage()\">\r\n <mat-icon>clear</mat-icon>\r\n </button>\r\n <button type=\"button\" \r\n class=\"asw-btn btn btn-outline-primary\" \r\n [disabled]=\"isImageLoaded\" \r\n matTooltip=\"Left rotate\"\r\n matTooltipPosition=\"right\"\r\n (click)=\"rotateLeft()\">\r\n <mat-icon>rotate_left</mat-icon>\r\n </button>\r\n <button type=\"button\" \r\n class=\"asw-btn btn btn-outline-primary\" \r\n matTooltip=\"Right rotate\"\r\n matTooltipPosition=\"right\"\r\n [disabled]=\"isImageLoaded\" \r\n (click)=\"rotateRight()\">\r\n <mat-icon>rotate_right</mat-icon>\r\n </button>\r\n <button type=\"button\" \r\n class=\"asw-btn btn btn-outline-primary\"\r\n matTooltip=\"Swap horizontal\"\r\n matTooltipPosition=\"right\" \r\n [disabled]=\"isImageLoaded\" \r\n (click)=\"flipHorizontal()\">\r\n <mat-icon>swap_horiz</mat-icon>\r\n </button>\r\n <button type=\"button\" \r\n class=\"asw-btn btn btn-outline-primary\"\r\n matTooltip=\"Swap vertical\"\r\n matTooltipPosition=\"right\" \r\n [disabled]=\"isImageLoaded\" \r\n (click)=\"flipVertical()\">\r\n <mat-icon>swap_vert</mat-icon>\r\n </button>\r\n <button type=\"button\" \r\n class=\"asw-btn btn btn-outline-primary\" \r\n matTooltip=\"{{containWithinAspectRatio?'Fill Aspect Ratio':'Contain Within Aspect Ratio'}}\"\r\n matTooltipPosition=\"right\"\r\n [disabled]=\"isImageLoaded\" \r\n (click)=\"toggleContainWithinAspectRatio()\">\r\n <mat-icon>\r\n {{containWithinAspectRatio?'crop_free':'crop_din'}}\r\n </mat-icon>\r\n </button>\r\n <button type=\"button\" \r\n class=\"asw-btn btn btn-outline-primary\" \r\n [disabled]=\"isImageLoaded\"\r\n matTooltip=\"Reset image\"\r\n matTooltipPosition=\"right\" \r\n (click)=\"resetImage()\">\r\n <mat-icon>refresh</mat-icon>\r\n </button>\r\n <button type=\"button\" \r\n class=\"asw-btn btn btn-outline-primary\"\r\n matTooltip=\"Zoom out\"\r\n matTooltipPosition=\"right\" \r\n [disabled]=\"isImageLoaded\" \r\n (click)=\"zoomOut()\">\r\n <mat-icon>zoom_out</mat-icon>\r\n </button>\r\n <button type=\"button\" \r\n class=\"asw-btn btn btn-outline-primary\"\r\n matTooltip=\"Zoom in\"\r\n matTooltipPosition=\"right\" \r\n [disabled]=\"isImageLoaded\" \r\n (click)=\"zoomIn()\">\r\n <mat-icon>zoom_in</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-10\">\r\n <asw-image-crop\r\n [imageChangedEvent]=\"imageChangedEvent\"\r\n [imageBase64]=\"control.imageUrl\"\r\n [maintainAspectRatio]=\"true\"\r\n [containWithinAspectRatio]=\"containWithinAspectRatio\"\r\n [aspectRatio]=\"1\"\r\n [resizeToWidth]=\"256\"\r\n [onlyScaleDown]=\"true\" \r\n [roundCropper]=\"false\"\r\n [canvasRotation]=\"canvasRotation\"\r\n [transform]=\"transform\"\r\n [alignImage]=\"'center'\"\r\n [style.display]=\"showCropper ? null : 'none'\"\r\n format=\"png\"\r\n (imageCropped)=\"imageCropped($event)\"\r\n (imageLoaded)=\"imageLoaded()\"\r\n (cropperReady)=\"cropperReady($event)\"\r\n (loadImageFailed)=\"loadImageFailed()\">\r\n </asw-image-crop>\r\n </div>\r\n </div> \r\n </mat-dialog-content>\r\n <mat-dialog-actions align=\"end\">\r\n <button type=\"button\"\r\n class=\"btn btn-danger mr-2 mb-1 me-2\"\r\n (click)=\"onNoClick()\">\r\n No\r\n </button>\r\n <button type=\"submit\"\r\n class=\"btn btn-primary mb-1\"\r\n cdkFocusInitial>\r\n Yes\r\n </button>\r\n </mat-dialog-actions>\r\n</form>", dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i4.AswImageCropComponent, selector: "asw-image-crop", inputs: ["imageChangedEvent", "imageURL", "imageBase64", "imageFile", "format", "transform", "maintainAspectRatio", "aspectRatio", "resizeToWidth", "resizeToHeight", "cropperMinWidth", "cropperMinHeight", "cropperMaxHeight", "cropperMaxWidth", "cropperStaticWidth", "cropperStaticHeight", "canvasRotation", "initialStepSize", "roundCropper", "onlyScaleDown", "imageQuality", "autoCrop", "backgroundColor", "containWithinAspectRatio", "hideResizeSquares", "cropper", "alignImage", "disabled"], outputs: ["imageCropped", "startCropImage", "imageLoaded", "cropperReady", "loadImageFailed"] }, { kind: "directive", type: i5.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: i2.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i2.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i2.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }] }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: AswImageUploadDialog, decorators: [{ type: Component, args: [{ selector: 'asw-image-upload-dialog', template: "<h4 mat-dialog-title>Crop Uploaded Image</h4>\r\n<form [formGroup]=\"aswImageCropForm\" (ngSubmit)=\"onSubmit()\">\r\n <mat-dialog-content class=\"mat-typography\">\r\n <div class=\"row\">\r\n <div class=\"col-md-2\">\r\n <div class=\"text-center btn-toolbar mt-2\" role=\"toolbar\" aria-label=\"Image controls toolbar\">\r\n <div class=\"btn-group-vertical\" role=\"group\" aria-label=\"toolbar\">\r\n <button type=\"button\" \r\n class=\"asw-btn btn btn-outline-primary\"\r\n (click)=\"fileInput.click()\"\r\n matTooltip=\"Load image\" \r\n *ngIf=\"isImageLoaded\">\r\n <input style=\"display: none\" \r\n type=\"file\" \r\n #fileInput \r\n (change)=\"fileChangeEvent($event)\"\r\n id=\"imageUpload\" \r\n accept=\".png, .jpg, .jpeg\">\r\n <mat-icon>attach_file</mat-icon>\r\n </button>\r\n <button type=\"button\" \r\n class=\"asw-btn btn btn-outline-primary\"\r\n matTooltip=\"Remove image\"\r\n matTooltipPosition=\"right\"\r\n *ngIf=\"!isImageLoaded\" \r\n (click)=\"removeImage()\">\r\n <mat-icon>clear</mat-icon>\r\n </button>\r\n <button type=\"button\" \r\n class=\"asw-btn btn btn-outline-primary\" \r\n [disabled]=\"isImageLoaded\" \r\n matTooltip=\"Left rotate\"\r\n matTooltipPosition=\"right\"\r\n (click)=\"rotateLeft()\">\r\n <mat-icon>rotate_left</mat-icon>\r\n </button>\r\n <button type=\"button\" \r\n class=\"asw-btn btn btn-outline-primary\" \r\n matTooltip=\"Right rotate\"\r\n matTooltipPosition=\"right\"\r\n [disabled]=\"isImageLoaded\" \r\n (click)=\"rotateRight()\">\r\n <mat-icon>rotate_right</mat-icon>\r\n </button>\r\n <button type=\"button\" \r\n class=\"asw-btn btn btn-outline-primary\"\r\n matTooltip=\"Swap horizontal\"\r\n matTooltipPosition=\"right\" \r\n [disabled]=\"isImageLoaded\" \r\n (click)=\"flipHorizontal()\">\r\n <mat-icon>swap_horiz</mat-icon>\r\n </button>\r\n <button type=\"button\" \r\n class=\"asw-btn btn btn-outline-primary\"\r\n matTooltip=\"Swap vertical\"\r\n matTooltipPosition=\"right\" \r\n [disabled]=\"isImageLoaded\" \r\n (click)=\"flipVertical()\">\r\n <mat-icon>swap_vert</mat-icon>\r\n </button>\r\n <button type=\"button\" \r\n class=\"asw-btn btn btn-outline-primary\" \r\n matTooltip=\"{{containWithinAspectRatio?'Fill Aspect Ratio':'Contain Within Aspect Ratio'}}\"\r\n matTooltipPosition=\"right\"\r\n [disabled]=\"isImageLoaded\" \r\n (click)=\"toggleContainWithinAspectRatio()\">\r\n <mat-icon>\r\n {{containWithinAspectRatio?'crop_free':'crop_din'}}\r\n </mat-icon>\r\n </button>\r\n <button type=\"button\" \r\n class=\"asw-btn btn btn-outline-primary\" \r\n [disabled]=\"isImageLoaded\"\r\n matTooltip=\"Reset image\"\r\n matTooltipPosition=\"right\" \r\n (click)=\"resetImage()\">\r\n <mat-icon>refresh</mat-icon>\r\n </button>\r\n <button type=\"button\" \r\n class=\"asw-btn btn btn-outline-primary\"\r\n matTooltip=\"Zoom out\"\r\n matTooltipPosition=\"right\" \r\n [disabled]=\"isImageLoaded\" \r\n (click)=\"zoomOut()\">\r\n <mat-icon>zoom_out</mat-icon>\r\n </button>\r\n <button type=\"button\" \r\n class=\"asw-btn btn btn-outline-primary\"\r\n matTooltip=\"Zoom in\"\r\n matTooltipPosition=\"right\" \r\n [disabled]=\"isImageLoaded\" \r\n (click)=\"zoomIn()\">\r\n <mat-icon>zoom_in</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-10\">\r\n <asw-image-crop\r\n [imageChangedEvent]=\"imageChangedEvent\"\r\n [imageBase64]=\"control.imageUrl\"\r\n [maintainAspectRatio]=\"true\"\r\n [containWithinAspectRatio]=\"containWithinAspectRatio\"\r\n [aspectRatio]=\"1\"\r\n [resizeToWidth]=\"256\"\r\n [onlyScaleDown]=\"true\" \r\n [roundCropper]=\"false\"\r\n [canvasRotation]=\"canvasRotation\"\r\n [transform]=\"transform\"\r\n [alignImage]=\"'center'\"\r\n [style.display]=\"showCropper ? null : 'none'\"\r\n format=\"png\"\r\n (imageCropped)=\"imageCropped($event)\"\r\n (imageLoaded)=\"imageLoaded()\"\r\n (cropperReady)=\"cropperReady($event)\"\r\n (loadImageFailed)=\"loadImageFailed()\">\r\n </asw-image-crop>\r\n </div>\r\n </div> \r\n </mat-dialog-content>\r\n <mat-dialog-actions align=\"end\">\r\n <button type=\"button\"\r\n class=\"btn btn-danger mr-2 mb-1 me-2\"\r\n (click)=\"onNoClick()\">\r\n No\r\n </button>\r\n <button type=\"submit\"\r\n class=\"btn btn-primary mb-1\"\r\n cdkFocusInitial>\r\n Yes\r\n </button>\r\n </mat-dialog-actions>\r\n</form>" }] }], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i2.MatDialogRef }, { type: undefined, decorators: [{ type: Inject, args: [MAT_DIALOG_DATA] }] }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtdXBsb2FkLWRpYWxvZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2Zvcm0tY29udHJvbC9pbWFnZS9pbWFnZS11cGxvYWQtZGlhbG9nLnRzIiwiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvZm9ybS1jb250cm9sL2ltYWdlL2ltYWdlLXVwbG9hZC1kaWFsb2cuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUUxRCxPQUFPLEVBQWdCLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQzs7Ozs7Ozs7QUFPM0UsTUFBTSxPQUFPLG9CQUFvQjtJQWVqQjtJQUNEO0lBQ3lCO0lBZnBDLFNBQVMsR0FBUSxTQUFTLENBQUM7SUFDM0IsZ0JBQWdCLENBQWE7SUFDN0IsaUJBQWlCLEdBQVEsRUFBRSxDQUFDO0lBQzVCLFlBQVksR0FBUSxFQUFFLENBQUM7SUFDdkIsY0FBYyxHQUFHLENBQUMsQ0FBQztJQUNuQixRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBQ2IsS0FBSyxHQUFHLENBQUMsQ0FBQztJQUNWLFdBQVcsR0FBRyxLQUFLLENBQUM7SUFDcEIsYUFBYSxHQUFHLEtBQUssQ0FBQztJQUN0Qix3QkFBd0IsR0FBRyxLQUFLLENBQUM7SUFDakMsU0FBUyxHQUFtQixFQUFFLENBQUM7SUFFL0IsWUFDWSxXQUF3QixFQUN6QixTQUE2QyxFQUNwQixPQUFZO1FBRnBDLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3pCLGNBQVMsR0FBVCxTQUFTLENBQW9DO1FBQ3BCLFlBQU8sR0FBUCxPQUFPLENBQUs7SUFBSSxDQUFDO0lBRXJELFFBQVE7UUFDSixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUMzQixJ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eXJpZ2h0IEFTVyAoQSBTb2Z0d2FyZSBXb3JsZCkgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cclxuICpcclxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcclxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZVxyXG4gKi9cclxuXHJcbmltcG9ydCB7IENvbXBvbmVudCwgSW5qZWN0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgTWF0RGlhbG9nUmVmLCBNQVRfRElBTE9HX0RBVEEgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xyXG5pbXBvcnQgeyBDb25zdGFudHMgfSBmcm9tICdAYXNvZnR3YXJld29ybGQvZm9ybS1idWlsZGVyL2Zvcm0tY29udHJvbC9jb3JlJztcclxuaW1wb3J0IHsgRGltZW5zaW9ucywgSW1hZ2VDcm9wcGVkRXZlbnQsIEltYWdlVHJhbnNmb3JtIH0gZnJvbSAnQGFzb2Z0d2FyZXdvcmxkL2Zvcm0tYnVpbGRlci9pbWFnZS1jcm9wJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdhc3ctaW1hZ2UtdXBsb2FkLWRpYWxvZycsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vaW1hZ2UtdXBsb2FkLWRpYWxvZy5odG1sJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQXN3SW1hZ2VVcGxvYWREaWFsb2cgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cclxuICAgIGNvbnN0YW50czogYW55ID0gQ29uc3RhbnRzO1xyXG4gICAgYXN3SW1hZ2VDcm9wRm9ybSE6IEZvcm1Hcm91cDtcclxuICAgIGltYWdlQ2hhbmdlZEV2ZW50OiBhbnkgPSAnJztcclxuICAgIGNyb3BwZWRJbWFnZTogYW55ID0gJyc7XHJcbiAgICBjYW52YXNSb3RhdGlvbiA9IDA7XHJcbiAgICByb3RhdGlvbiA9IDA7XHJcbiAgICBzY2FsZSA9IDE7XHJcbiAgICBzaG93Q3JvcHBlciA9IGZhbHNlO1xyXG4gICAgaXNJbWFnZUxvYWRlZCA9IGZhbHNlO1xyXG4gICAgY29udGFpbldpdGhpbkFzcGVjdFJhdGlvID0gZmFsc2U7XHJcbiAgICB0cmFuc2Zvcm06IEltYWdlVHJhbnNmb3JtID0ge307XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSBmb3JtQnVpbGRlcjogRm9ybUJ1aWxkZXIsXHJcbiAgICAgICAgcHVibGljIGRpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPEFzd0ltYWdlVXBsb2FkRGlhbG9nPixcclxuICAgICAgICBASW5qZWN0KE1BVF9ESUFMT0dfREFUQSkgcHVibGljIGNvbnRyb2w6IGFueSkgeyB9XHJcblxyXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy52YWxpZGF0ZUZvcm1CdWlsZGVyKCk7XHJcbiAgICAgICAgdGhpcy5lZGl0UHJvcGVydHkodGhpcy5jb250cm9sKTtcclxuICAgICAgICB0aGlzLmNyb3BwZWRJbWFnZSA9IHRoaXMuY29udHJvbC5pbWFnZVVybDtcclxuICAgICAgICB0aGlzLmlzSW1hZ2VMb2FkZWQgPSB0aGlzLmNvbnRyb2wuaW1hZ2VVcmwgPyBmYWxzZSA6IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgZmlsZUNoYW5nZUV2ZW50KGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmlzSW1hZ2VMb2FkZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuaW1hZ2VDaGFuZ2VkRXZlbnQgPSBldmVudDtcclxuICAgIH1cclxuXHJcbiAgICByZW1vdmVJbWFnZSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmlzSW1hZ2VMb2FkZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuaW1hZ2VDaGFuZ2VkRXZlbnQgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGltYWdlQ3JvcHBlZChldmVudDogSW1hZ2VDcm9wcGVkRXZlbnQpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmNyb3BwZWRJbWFnZSA9IGV2ZW50LmJhc2U2NDtcclxuICAgIH1cclxuXHJcbiAgICBpbWFnZUxvYWRlZCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnNob3dDcm9wcGVyID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBjcm9wcGVyUmVhZHkoc291cmNlSW1hZ2VEaW1lbnNpb25zOiBEaW1lbnNpb25zKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5pc0ltYWdlTG9hZGVkID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgbG9hZEltYWdlRmFpbGVkKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdMb2FkIGZhaWxlZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIHJvdGF0ZUxlZnQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5pc0ltYWdlTG9hZGVkID0gdHJ1ZTtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgLy8gVXNlIHRpbWVvdXQgYmVjYXVzZSByb3RhdGluZyBpbWFnZSBpcyBhIGhlYXZ5IG9wZXJhdGlvbiBhbmQgd2lsbCBibG9jayB0aGUgdWkgdGhyZWFkXHJcbiAgICAgICAgICAgIHRoaXMuY2FudmFzUm90YXRpb24tLTtcclxuICAgICAgICAgICAgdGhpcy5mbGlwQWZ0ZXJSb3RhdGUoKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByb3RhdGVSaWdodCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmlzSW1hZ2VMb2FkZWQgPSB0cnVlO1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmNhbnZhc1JvdGF0aW9uKys7XHJcbiAgICAgICAgICAgIHRoaXMuZmxpcEFmdGVyUm90YXRlKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBmbGlwQWZ0ZXJSb3RhdGUoKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgZmxpcHBlZEggPSB0aGlzLnRyYW5zZm9ybS5mbGlwSDtcclxuICAgICAgICBjb25zdCBmbGlwcGVkViA9IHRoaXMudHJhbnNmb3JtLmZsaXBWO1xyXG4gICAgICAgIHRoaXMudHJhbnNmb3JtID0ge1xyXG4gICAgICAgICAgICAuLi50aGlzLnRyYW5zZm9ybSxcclxuICAgICAgICAgICAgZmxpcEg6IGZsaXBwZWRWLFxyXG4gICAgICAgICAgICBmbGlwVjogZmxpcHBlZEhcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBmbGlwSG9yaXpvbnRhbCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnRyYW5zZm9ybSA9IHtcclxuICAgICAgICAgICAgLi4udGhpcy50cmFuc2Zvcm0sXHJcbiAgICAgICAgICAgIGZsaXBIOiAhdGhpcy50cmFuc2Zvcm0uZmxpcEhcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIGZsaXBWZXJ0aWNhbCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnRyYW5zZm9ybSA9IHtcclxuICAgICAgICAgICAgLi4udGhpcy50cmFuc2Zvcm0sXHJcbiAgICAgICAgICAgIGZsaXBWOiAhdGhpcy50cmFuc2Zvcm0uZmxpcFZcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHJlc2V0SW1hZ2UoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zY2FsZSA9IDE7XHJcbiAgICAgICAgdGhpcy5yb3RhdGlvbiA9IDA7XHJcbiAgICAgICAgdGhpcy5jYW52YXNSb3RhdGlvbiA9IDA7XHJcbiAgICAgICAgdGhpcy50cmFuc2Zvcm0gPSB7fTtcclxuICAgIH1cclxuXHJcbiAgICB6b29tT3V0KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc2NhbGUgLT0gLjE7XHJcbiAgICAgICAgdGhpcy50cmFuc2Zvcm0gPSB7XHJcbiAgICAgICAgICAgIC4uLnRoaXMudHJhbnNmb3JtLFxyXG4gICAgICAgICAgICBzY2FsZTogdGhpcy5zY2FsZVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgem9vbUluKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc2NhbGUgKz0gLjE7XHJcbiAgICAgICAgdGhpcy50cmFuc2Zvcm0gPSB7XHJcbiAgICAgICAgICAgIC4uLnRoaXMudHJhbnNmb3JtLFxyXG4gICAgICAgICAgICBzY2FsZTogdGhpcy5zY2FsZVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgdG9nZ2xlQ29udGFpbldpdGhpbkFzcGVjdFJhdGlvKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuY29udGFpbldpdGhpbkFzcGVjdFJhdGlvID0gIXRoaXMuY29udGFpbldpdGhpbkFzcGVjdFJhdGlvO1xyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZVJvdGF0aW9uKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMudHJhbnNmb3JtID0ge1xyXG4gICAgICAgICAgICAuLi50aGlzLnRyYW5zZm9ybSxcclxuICAgICAgICAgICAgcm90YXRlOiB0aGlzLnJvdGF0aW9uXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBvbk5vQ2xpY2soKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoKTtcclxuICAgIH1cclxuXHJcbiAgICB2YWxpZGF0ZUZvcm1CdWlsZGVyKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuYXN3SW1hZ2VDcm9wRm9ybSA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoe1xyXG4gICAgICAgICAgICBmaWxlOiBbbnVsbF1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBlZGl0UHJvcGVydHkoY29udHJvbDogYW55KTogdm9pZCB7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wuZXZlbnQpIHsgdGhpcy5pc0ltYWdlTG9hZGVkID0gZmFsc2U7IH1cclxuICAgICAgICB0aGlzLmFzd0ltYWdlQ3JvcEZvcm0uc2V0VmFsdWUoe1xyXG4gICAgICAgICAgICBmaWxlOiBjb250cm9sLmltYWdlVXJsXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgb25TdWJtaXQoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuYXN3SW1hZ2VDcm9wRm9ybS5pbnZhbGlkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5hc3dJbWFnZUNyb3BGb3JtLnZhbHVlLmRpc3BsYXlOYW1lID0gdGhpcy5jb250cm9sLmRpc3BsYXlOYW1lO1xyXG4gICAgICAgIHRoaXMuYXN3SW1hZ2VDcm9wRm9ybS52YWx1ZS5jb250cm9sVHlwZSA9IHRoaXMuY29udHJvbC5jb250cm9sVHlwZTtcclxuICAgICAgICB0aGlzLmFzd0ltYWdlQ3JvcEZvcm0udmFsdWUubGFiZWwgPSB0aGlzLmNvbnRyb2wubGFiZWw7XHJcbiAgICAgICAgdGhpcy5hc3dJbWFnZUNyb3BGb3JtLnZhbHVlLmNsYXNzID0gdGhpcy5jb250cm9sLmNsYXNzO1xyXG4gICAgICAgIHRoaXMuYXN3SW1hZ2VDcm9wRm9ybS52YWx1ZS5jb2x1bW4gPSB0aGlzLmNvbnRyb2wuY29sdW1uO1xyXG4gICAgICAgIHRoaXMuYXN3SW1hZ2VDcm9wRm9ybS52YWx1ZS5pbWFnZVVybCA9IHRoaXMuY3JvcHBlZEltYWdlO1xyXG4gICAgICAgIHRoaXMuYXN3SW1hZ2VDcm9wRm9ybS52YWx1ZS5pbWFnZVNoYXBlID0gdGhpcy5jb250cm9sLmltYWdlU2hhcGU7XHJcbiAgICAgICAgdGhpcy5hc3dJbWFnZUNyb3BGb3JtLnZhbHVlLmhlaWdodCA9IHRoaXMuY29udHJvbC5oZWlnaHQ7XHJcbiAgICAgICAgdGhpcy5hc3dJbWFnZUNyb3BGb3JtLnZhbHVlLndpZHRoID0gdGhpcy5jb250cm9sLndpZHRoO1xyXG4gICAgICAgIHRoaXMuYXN3SW1hZ2VDcm9wRm9ybS52YWx1ZS5ldmVudCA9IHRoaXMuaW1hZ2VDaGFuZ2VkRXZlbnQ7XHJcbiAgICAgICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UodGhpcy5hc3dJbWFnZUNyb3BGb3JtLnZhbHVlKTtcclxuICAgIH1cclxufVxyXG4iLCI8aDQgbWF0LWRpYWxvZy10aXRsZT5Dcm9wIFVwbG9hZGVkIEltYWdlPC9oND5cclxuPGZvcm0gW2Zvcm1Hcm91cF09XCJhc3dJbWFnZUNyb3BGb3JtXCIgKG5nU3VibWl0KT1cIm9uU3VibWl0KClcIj5cclxuICAgIDxtYXQtZGlhbG9nLWNvbnRlbnQgY2xhc3M9XCJtYXQtdHlwb2dyYXBoeVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0yXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1jZW50ZXIgYnRuLXRvb2xiYXIgbXQtMlwiIHJvbGU9XCJ0b29sYmFyXCIgYXJpYS1sYWJlbD1cIkltYWdlIGNvbnRyb2xzIHRvb2xiYXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwLXZlcnRpY2FsXCIgcm9sZT1cImdyb3VwXCIgYXJpYS1sYWJlbD1cInRvb2xiYXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFzdy1idG4gYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImZpbGVJbnB1dC5jbGljaygpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJMb2FkIGltYWdlXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImlzSW1hZ2VMb2FkZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBzdHlsZT1cImRpc3BsYXk6IG5vbmVcIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImZpbGVcIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2ZpbGVJbnB1dCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJmaWxlQ2hhbmdlRXZlbnQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwiaW1hZ2VVcGxvYWRcIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXB0PVwiLnBuZywgLmpwZywgLmpwZWdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5hdHRhY2hfZmlsZTwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFzdy1idG4gYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJSZW1vdmUgaW1hZ2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXBQb3NpdGlvbj1cInJpZ2h0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFpc0ltYWdlTG9hZGVkXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZUltYWdlKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5jbGVhcjwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFzdy1idG4gYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnlcIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNJbWFnZUxvYWRlZFwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJMZWZ0IHJvdGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcFBvc2l0aW9uPVwicmlnaHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyb3RhdGVMZWZ0KClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5yb3RhdGVfbGVmdDwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFzdy1idG4gYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnlcIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiUmlnaHQgcm90YXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRUb29sdGlwUG9zaXRpb249XCJyaWdodFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzSW1hZ2VMb2FkZWRcIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicm90YXRlUmlnaHQoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPnJvdGF0ZV9yaWdodDwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFzdy1idG4gYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJTd2FwIGhvcml6b250YWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXBQb3NpdGlvbj1cInJpZ2h0XCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzSW1hZ2VMb2FkZWRcIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZmxpcEhvcml6b250YWwoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPnN3YXBfaG9yaXo8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhc3ctYnRuIGJ0biBidG4tb3V0bGluZS1wcmltYXJ5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiU3dhcCB2ZXJ0aWNhbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcFBvc2l0aW9uPVwicmlnaHRcIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNJbWFnZUxvYWRlZFwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJmbGlwVmVydGljYWwoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPnN3YXBfdmVydDwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFzdy1idG4gYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnlcIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVwie3tjb250YWluV2l0aGluQXNwZWN0UmF0aW8/J0ZpbGwgQXNwZWN0IFJhdGlvJzonQ29udGFpbiBXaXRoaW4gQXNwZWN0IFJhdGlvJ319XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRUb29sdGlwUG9zaXRpb249XCJyaWdodFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzSW1hZ2VMb2FkZWRcIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlQ29udGFpbldpdGhpbkFzcGVjdFJhdGlvKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2NvbnRhaW5XaXRoaW5Bc3BlY3RSYXRpbz8nY3JvcF9mcmVlJzonY3JvcF9kaW4nfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFzdy1idG4gYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnlcIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNJbWFnZUxvYWRlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIlJlc2V0IGltYWdlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRUb29sdGlwUG9zaXRpb249XCJyaWdodFwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZXNldEltYWdlKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5yZWZyZXNoPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYXN3LWJ0biBidG4gYnRuLW91dGxpbmUtcHJpbWFyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIlpvb20gb3V0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRUb29sdGlwUG9zaXRpb249XCJyaWdodFwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0ltYWdlTG9hZGVkXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInpvb21PdXQoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPnpvb21fb3V0PC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYXN3LWJ0biBidG4gYnRuLW91dGxpbmUtcHJpbWFyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIlpvb20gaW5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXBQb3NpdGlvbj1cInJpZ2h0XCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzSW1hZ2VMb2FkZWRcIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiem9vbUluKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj56b29tX2luPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTBcIj5cclxuICAgICAgICAgICAgICAgIDxhc3ctaW1hZ2UtY3JvcFxyXG4gICAgICAgICAgICAgICAgICAgIFtpbWFnZUNoYW5nZWRFdmVudF09XCJpbWFnZUNoYW5nZWRFdmVudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2ltYWdlQmFzZTY0XT1cImNvbnRyb2wuaW1hZ2VVcmxcIlxyXG4gICAgICAgICAgICAgICAgICAgIFttYWludGFpbkFzcGVjdFJhdGlvXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjb250YWluV2l0aGluQXNwZWN0UmF0aW9dPVwiY29udGFpbldpdGhpbkFzcGVjdFJhdGlvXCJcclxuICAgICAgICAgICAgICAgICAgICBbYXNwZWN0UmF0aW9dPVwiMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3Jlc2l6ZVRvV2lkdGhdPVwiMjU2XCJcclxuICAgICAgICAgICAgICAgICAgICBbb25seVNjYWxlRG93bl09XCJ0cnVlXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgW3JvdW5kQ3JvcHBlcl09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2NhbnZhc1JvdGF0aW9uXT1cImNhbnZhc1JvdGF0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgICBbdHJhbnNmb3JtXT1cInRyYW5zZm9ybVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2FsaWduSW1hZ2VdPVwiJ2NlbnRlcidcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtzdHlsZS5kaXNwbGF5XT1cInNob3dDcm9wcGVyID8gbnVsbCA6ICdub25lJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgZm9ybWF0PVwicG5nXCJcclxuICAgICAgICAgICAgICAgICAgICAoaW1hZ2VDcm9wcGVkKT1cImltYWdlQ3JvcHBlZCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAoaW1hZ2VMb2FkZWQpPVwiaW1hZ2VMb2FkZWQoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNyb3BwZXJSZWFkeSk9XCJjcm9wcGVyUmVhZHkoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGxvYWRJbWFnZUZhaWxlZCk9XCJsb2FkSW1hZ2VGYWlsZWQoKVwiPlxyXG4gICAgICAgICAgICAgICAgPC9hc3ctaW1hZ2UtY3JvcD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+ICAgICAgICBcclxuICAgIDwvbWF0LWRpYWxvZy1jb250ZW50PlxyXG4gICAgPG1hdC1kaWFsb2ctYWN0aW9ucyBhbGlnbj1cImVuZFwiPlxyXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tZGFuZ2VyIG1yLTIgbWItMSBtZS0yXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvbk5vQ2xpY2soKVwiPlxyXG4gICAgICAgICAgICBOb1xyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gdHlwZT1cInN1Ym1pdFwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBtYi0xXCJcclxuICAgICAgICAgICAgICAgIGNka0ZvY3VzSW5pdGlhbD5cclxuICAgICAgICAgICAgWWVzXHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICA8L21hdC1kaWFsb2ctYWN0aW9ucz5cclxuPC9mb3JtPiJdfQ==