@tsi-developpement/tsi-shared-ui 1.8.48 → 1.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/enums/display-types.mjs +3 -1
- package/esm2022/lib/functions/file-preview.util.mjs +65 -0
- package/esm2022/lib/functions/modal-open.function.mjs +8 -1
- package/esm2022/lib/models/settings/fichier.mjs +2 -1
- package/esm2022/lib/shared.module.mjs +7 -3
- package/esm2022/lib/tsi-components/index.mjs +2 -1
- package/esm2022/lib/tsi-components/input-components/tsi-file-manager/tsi-file-manager.component.mjs +78 -39
- package/esm2022/lib/tsi-components/output-components/tsi-file-preview/tsi-file-preview.component.mjs +117 -0
- package/esm2022/lib/tsi-components/output-components/tsi-generic-grid/tsi-generic-grid.component.mjs +41 -3
- package/esm2022/lib/tsi-components/tsi-upload-fiche/tsi-upload-fiche.component.mjs +1 -1
- package/fesm2022/tsi-developpement-tsi-shared-ui.mjs +322 -55
- package/fesm2022/tsi-developpement-tsi-shared-ui.mjs.map +1 -1
- package/lib/consts/app-providers.d.ts +1 -1
- package/lib/enums/display-types.d.ts +2 -1
- package/lib/functions/file-preview.util.d.ts +9 -0
- package/lib/functions/modal-open.function.d.ts +1 -0
- package/lib/models/settings/fichier.d.ts +1 -0
- package/lib/providers/shared-ui-tsi.provider.d.ts +1 -1
- package/lib/shared.module.d.ts +114 -113
- package/lib/tsi-components/index.d.ts +1 -0
- package/lib/tsi-components/input-components/tsi-file-manager/tsi-file-manager.component.d.ts +24 -7
- package/lib/tsi-components/output-components/tsi-file-preview/tsi-file-preview.component.d.ts +47 -0
- package/lib/tsi-components/output-components/tsi-generic-grid/tsi-generic-grid.component.d.ts +2 -0
- package/package.json +1 -1
package/esm2022/lib/tsi-components/input-components/tsi-file-manager/tsi-file-manager.component.mjs
CHANGED
|
@@ -1,25 +1,28 @@
|
|
|
1
1
|
import { Component, ViewEncapsulation, Input, Output, EventEmitter } from "@angular/core";
|
|
2
2
|
import { TsiInputBase } from "../../../tsi-base/tsi-input-base/tsi-input-base.component";
|
|
3
|
+
import { ModalSizeEnum } from "../../../enums/modal-size-enum";
|
|
4
|
+
import { openTsiFilePreviewComponent } from "../../../functions/modal-open.function";
|
|
5
|
+
import { getFileExtension, getMediaCategory, getMimeTypeFromExtension } from "../../../functions/file-preview.util";
|
|
3
6
|
import * as i0 from "@angular/core";
|
|
4
7
|
import * as i1 from "../../../pipes/localize.pipe";
|
|
5
8
|
import * as i2 from "../../../services/notification/tsi-notification.service";
|
|
6
|
-
import * as i3 from "@angular/
|
|
7
|
-
import * as i4 from "
|
|
8
|
-
import * as i5 from "primeng/
|
|
9
|
-
import * as i6 from "primeng/
|
|
10
|
-
import * as i7 from "
|
|
9
|
+
import * as i3 from "@angular/common";
|
|
10
|
+
import * as i4 from "primeng/button";
|
|
11
|
+
import * as i5 from "primeng/api";
|
|
12
|
+
import * as i6 from "primeng/fileupload";
|
|
13
|
+
import * as i7 from "../../output-components/tsi-file-preview/tsi-file-preview.component";
|
|
11
14
|
export class TsiFileManagerComponent extends TsiInputBase {
|
|
12
15
|
/* ngAfterViewInit() {
|
|
13
16
|
if (this.showSelectButton && this.fileUploadInput) {
|
|
14
17
|
this.fileUploadInput.nativeElement.style.display = 'none';
|
|
15
18
|
}
|
|
16
19
|
} */
|
|
17
|
-
constructor(localize, notificationService, changeDetectorRef,
|
|
20
|
+
constructor(localize, notificationService, changeDetectorRef, _injector) {
|
|
18
21
|
super();
|
|
19
22
|
this.localize = localize;
|
|
20
23
|
this.notificationService = notificationService;
|
|
21
24
|
this.changeDetectorRef = changeDetectorRef;
|
|
22
|
-
this.
|
|
25
|
+
this._injector = _injector;
|
|
23
26
|
this.name = '';
|
|
24
27
|
this.accept = '';
|
|
25
28
|
this.maxFileSize = 10485760;
|
|
@@ -32,6 +35,8 @@ export class TsiFileManagerComponent extends TsiInputBase {
|
|
|
32
35
|
this.chooseLabel = '';
|
|
33
36
|
this.showSelectButton = true;
|
|
34
37
|
this.showFileUpload = true;
|
|
38
|
+
this.showPreviewButton = true;
|
|
39
|
+
this.contentHeight = '20rem';
|
|
35
40
|
this.onSelectFileManager = new EventEmitter();
|
|
36
41
|
this.onClear = new EventEmitter();
|
|
37
42
|
this.onRemove = new EventEmitter();
|
|
@@ -39,15 +44,46 @@ export class TsiFileManagerComponent extends TsiInputBase {
|
|
|
39
44
|
this.fileNameChange = new EventEmitter();
|
|
40
45
|
this.imageUrl = null;
|
|
41
46
|
this.fileSizeError = '';
|
|
47
|
+
/** Set when the inline preview reports a media load error → fall back to the download card. */
|
|
48
|
+
this.mediaLoadError = false;
|
|
49
|
+
}
|
|
50
|
+
/** True when the selected file can be rendered in the browser (image/video/audio/pdf). */
|
|
51
|
+
get canPreview() {
|
|
52
|
+
return !!this.inputField && getMediaCategory(this.fileName) !== 'unsupported';
|
|
53
|
+
}
|
|
54
|
+
/** True when the selected file cannot be previewed inline. */
|
|
55
|
+
get isUnsupported() {
|
|
56
|
+
return getMediaCategory(this.fileName) === 'unsupported';
|
|
57
|
+
}
|
|
58
|
+
/** Called when the inline preview component reports a media load failure. */
|
|
59
|
+
onPreviewError() {
|
|
60
|
+
this.mediaLoadError = true;
|
|
61
|
+
}
|
|
62
|
+
/** Open the selected file in a maximizable modal via the shared DialogService. */
|
|
63
|
+
async openPreview() {
|
|
64
|
+
if (!this.canPreview) {
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
const conf = {
|
|
68
|
+
header: this.fileName,
|
|
69
|
+
data: { content: this.inputField, fileName: this.fileName, mimeType: this.mimeType },
|
|
70
|
+
width: ModalSizeEnum.Medium.width,
|
|
71
|
+
height: ModalSizeEnum.Medium.height,
|
|
72
|
+
maximizable: true,
|
|
73
|
+
styleClass: '',
|
|
74
|
+
contentStyle: { overflow: 'auto' },
|
|
75
|
+
};
|
|
76
|
+
this._previewRef = await openTsiFilePreviewComponent(this._injector, conf);
|
|
42
77
|
}
|
|
43
78
|
getFileExtension(fileName) {
|
|
44
|
-
return fileName
|
|
79
|
+
return getFileExtension(fileName);
|
|
45
80
|
}
|
|
46
81
|
onFileSelect(event) {
|
|
47
82
|
const files = event.files;
|
|
48
83
|
// this.convertFileToBase64(files[0]).then((base64String: string) => {
|
|
49
84
|
// this.inputField = base64String;
|
|
50
85
|
// });
|
|
86
|
+
this.mediaLoadError = false;
|
|
51
87
|
const reader = new FileReader();
|
|
52
88
|
reader.onload = () => {
|
|
53
89
|
this.inputField = reader.result.split(',')[1];
|
|
@@ -56,6 +92,8 @@ export class TsiFileManagerComponent extends TsiInputBase {
|
|
|
56
92
|
};
|
|
57
93
|
reader.readAsDataURL(files[0]);
|
|
58
94
|
this.fileName = files[0].name;
|
|
95
|
+
// Prefer the browser-detected MIME type; fall back to the extension map.
|
|
96
|
+
this.mimeType = files[0].type || getMimeTypeFromExtension(getFileExtension(files[0].name));
|
|
59
97
|
const fileName = this.fileName;
|
|
60
98
|
if (files[0].size > this.maxFileSize) {
|
|
61
99
|
this.notificationService.warn(`
|
|
@@ -67,19 +105,20 @@ export class TsiFileManagerComponent extends TsiInputBase {
|
|
|
67
105
|
this.inputField = undefined;
|
|
68
106
|
return;
|
|
69
107
|
}
|
|
108
|
+
this.isDirty = true;
|
|
70
109
|
setTimeout(() => {
|
|
71
110
|
//this.fileName = files.map((file: any) => file.name).join(', ');
|
|
72
111
|
this.onSelectFileManager.emit({ event, files, inputField: this.inputField, fileName: fileName });
|
|
73
112
|
this.inputFieldChange.emit(this.inputField);
|
|
74
113
|
this.fileNameChange.emit(this.fileName);
|
|
75
|
-
this.isDirty = true;
|
|
76
114
|
}, 200);
|
|
77
115
|
}
|
|
78
116
|
onFileClear() {
|
|
79
|
-
this.isDirty =
|
|
117
|
+
this.isDirty = true;
|
|
80
118
|
this.inputField = null;
|
|
81
119
|
this.fileName = '';
|
|
82
120
|
this.imageUrl = null;
|
|
121
|
+
this.resetPreview();
|
|
83
122
|
this.inputFieldChange.emit(this.inputField);
|
|
84
123
|
this.fileNameChange.emit(this.fileName);
|
|
85
124
|
this.onClear.emit();
|
|
@@ -88,14 +127,19 @@ export class TsiFileManagerComponent extends TsiInputBase {
|
|
|
88
127
|
const file = event.file;
|
|
89
128
|
//this.inputField = this.inputField.filter((f: any) => f !== file);
|
|
90
129
|
//this.fileName = this.inputField.map((f: any) => f.name).join(', ');
|
|
91
|
-
this.isDirty =
|
|
130
|
+
this.isDirty = true;
|
|
92
131
|
this.inputField = null;
|
|
93
132
|
this.fileName = '';
|
|
94
133
|
this.imageUrl = null;
|
|
134
|
+
this.resetPreview();
|
|
95
135
|
this.onRemove.emit(file);
|
|
96
136
|
this.inputFieldChange.emit(this.inputField);
|
|
97
137
|
this.fileNameChange.emit(this.fileName);
|
|
98
138
|
}
|
|
139
|
+
resetPreview() {
|
|
140
|
+
this.mimeType = undefined;
|
|
141
|
+
this.mediaLoadError = false;
|
|
142
|
+
}
|
|
99
143
|
convertFileToBase64(file) {
|
|
100
144
|
return new Promise((resolve, reject) => {
|
|
101
145
|
const reader = new FileReader();
|
|
@@ -111,13 +155,7 @@ export class TsiFileManagerComponent extends TsiInputBase {
|
|
|
111
155
|
if (!this.inputField) {
|
|
112
156
|
return;
|
|
113
157
|
}
|
|
114
|
-
const
|
|
115
|
-
const byteNumbers = new Array(byteCharacters.length);
|
|
116
|
-
for (let i = 0; i < byteCharacters.length; i++) {
|
|
117
|
-
byteNumbers[i] = byteCharacters.charCodeAt(i);
|
|
118
|
-
}
|
|
119
|
-
const byteArray = new Uint8Array(byteNumbers);
|
|
120
|
-
const blob = new Blob([byteArray], { type: 'application/octet-stream' });
|
|
158
|
+
const blob = this.base64ToBlob(this.inputField, this.resolvedMimeType);
|
|
121
159
|
const url = window.URL.createObjectURL(blob);
|
|
122
160
|
const a = document.createElement('a');
|
|
123
161
|
document.body.appendChild(a);
|
|
@@ -127,6 +165,16 @@ export class TsiFileManagerComponent extends TsiInputBase {
|
|
|
127
165
|
a.click();
|
|
128
166
|
//window.URL.revokeObjectURL(url);
|
|
129
167
|
}
|
|
168
|
+
/** Decode a base64 string into a Blob tagged with the given MIME type. */
|
|
169
|
+
base64ToBlob(base64, mimeType) {
|
|
170
|
+
const byteCharacters = atob(base64);
|
|
171
|
+
const byteNumbers = new Array(byteCharacters.length);
|
|
172
|
+
for (let i = 0; i < byteCharacters.length; i++) {
|
|
173
|
+
byteNumbers[i] = byteCharacters.charCodeAt(i);
|
|
174
|
+
}
|
|
175
|
+
const byteArray = new Uint8Array(byteNumbers);
|
|
176
|
+
return new Blob([byteArray], { type: mimeType });
|
|
177
|
+
}
|
|
130
178
|
arrayBufferToBase64(buffer) {
|
|
131
179
|
const bytes = new Uint8Array(buffer);
|
|
132
180
|
let binary = '';
|
|
@@ -135,30 +183,17 @@ export class TsiFileManagerComponent extends TsiInputBase {
|
|
|
135
183
|
}
|
|
136
184
|
return 'data:application/octet-stream;base64,' + btoa(binary);
|
|
137
185
|
}
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
}
|
|
142
|
-
const byteCharacters = atob(this.inputField);
|
|
143
|
-
const byteNumbers = new Array(byteCharacters.length);
|
|
144
|
-
for (let i = 0; i < byteCharacters.length; i++) {
|
|
145
|
-
byteNumbers[i] = byteCharacters.charCodeAt(i);
|
|
146
|
-
}
|
|
147
|
-
const byteArray = new Uint8Array(byteNumbers);
|
|
148
|
-
const blob = new Blob([byteArray], { type: 'application/octet-stream' });
|
|
149
|
-
const url = window.URL.createObjectURL(blob);
|
|
150
|
-
return this.domSanitizer.bypassSecurityTrustUrl(url);
|
|
186
|
+
/** MIME type used for download — captured from the File, else derived from the extension. */
|
|
187
|
+
get resolvedMimeType() {
|
|
188
|
+
return this.mimeType || getMimeTypeFromExtension(getFileExtension(this.fileName));
|
|
151
189
|
}
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
}
|
|
155
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TsiFileManagerComponent, deps: [{ token: i1.LocalizePipe }, { token: i2.TsiNotificationService }, { token: i0.ChangeDetectorRef }, { token: i3.DomSanitizer }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
156
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TsiFileManagerComponent, selector: "Tsi-File-Manager", inputs: { fileName: "fileName", name: "name", id: "id", accept: "accept", maxFileSize: "maxFileSize", multiple: "multiple", exploreOnDownload: "exploreOnDownload", showUploadButton: "showUploadButton", showCancelButton: "showCancelButton", showDownloadButton: "showDownloadButton", chooseIcon: "chooseIcon", chooseLabel: "chooseLabel", showSelectButton: "showSelectButton", showFileUpload: "showFileUpload" }, outputs: { onSelectFileManager: "onSelectFileManager", onClear: "onClear", onRemove: "onRemove", inputFieldChange: "inputFieldChange", fileNameChange: "fileNameChange" }, usesInheritance: true, ngImport: i0, template: "<!-- <p-fileUpload class=\"file-manager\" #fileUpload [name]=\"name\" [id]=\"id\" [accept]=\"accept\" [maxFileSize]=\"maxFileSize\"\r\n [multiple]=\"multiple\" [showUploadButton]=\"showUploadButton\" [showCancelButton]=\"showCancelButton\"\r\n chooseIcon=\"pi pi-upload\" chooseLabel=\" \" (onSelect)=\"onFileSelect($event)\" (onClear)=\"onFileClear()\"\r\n (onRemove)=\"onFileRemove($event)\" class=\"custom-file-upload\" icon=\"pi pi-upload\">\r\n</p-fileUpload>\r\n\r\n<BR>\r\n<div *ngIf=\"showDownloadButton\">\r\n <button pButton type=\"button\" icon=\"pi pi-download\" (click)=\"downloadFile()\" class=\"h-2rem w-full text-center\">\r\n </button>\r\n</div> -->\r\n<div class=\"{{validationStatusCssClass}}\">\r\n\r\n <p-fileUpload class=\"file-manager custom-file-upload \" \r\n #fileUpload\r\n [name]=\"name\"\r\n [id]=\"id\" \r\n [accept]=\"accept\" \r\n [multiple]=\"multiple\"\r\n [disabled]=\"disabled\"\r\n [showUploadButton]=\"showUploadButton\" \r\n [showCancelButton]=\"showCancelButton\"\r\n chooseIcon=\"pi pi-upload\"\r\n chooseLabel= \"Upload\" \r\n (onSelect)=\"onFileSelect($event)\"\r\n (onClear)=\"onFileClear()\"\r\n (onRemove)=\"onFileRemove($event)\"\r\n >\r\n \r\n \r\n \r\n <!-- <ng-template pTemplate=\"content\">\r\n <button type=\"button\" pButton icon=\"pi pi-upload\" class=\"ml-4 h-2rem w-full text-center\">\r\n </button>\r\n </ng-template> -->\r\n <ng-template pTemplate=\"content\" let-files>\r\n <div *ngIf=\"fileExtensionImage() || inputField\">\r\n <img [src]=\"fileUrl\" style=\"width: 15rem;\"/>\r\n </div>\r\n <div *ngIf=\"fileName != undefined && fileName != null\">\r\n <p>File Name: {{ fileName }}</p>\r\n <p>File Extension: {{ getFileExtension(fileName) }}</p>\r\n </div>\r\n <div *ngIf=\"fileName != undefined && showDownloadButton\">\r\n <button pButton type=\"button\" icon=\"pi pi-download\" (click)=\"downloadFile()\" class=\" h-2rem w-full text-center\">\r\n <!-- <span class=\"font-bold ml-2\" >Download</span> -->\r\n </button>\r\n </div>\r\n </ng-template>\r\n \r\n </p-fileUpload>\r\n \r\n</div>", styles: [".ui-fileupload-choose{display:flex;align-items:center;justify-content:center;padding:.5rem;width:10rem;height:40px}.ui-fileupload-choose .ui-button-text{display:none}.ui-fileupload-choose .pi{font-size:2rem}.p-fileupload-choose input{display:none!important}:host ::ng-deep .p-fileupload-choose[disabled]{display:none!important}\n"], dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain"] }, { kind: "directive", type: i6.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "component", type: i7.FileUpload, selector: "p-fileUpload", inputs: ["name", "url", "method", "multiple", "accept", "disabled", "auto", "withCredentials", "maxFileSize", "invalidFileSizeMessageSummary", "invalidFileSizeMessageDetail", "invalidFileTypeMessageSummary", "invalidFileTypeMessageDetail", "invalidFileLimitMessageDetail", "invalidFileLimitMessageSummary", "style", "styleClass", "previewWidth", "chooseLabel", "uploadLabel", "cancelLabel", "chooseIcon", "uploadIcon", "cancelIcon", "showUploadButton", "showCancelButton", "mode", "headers", "customUpload", "fileLimit", "uploadStyleClass", "cancelStyleClass", "removeStyleClass", "chooseStyleClass", "files"], outputs: ["onBeforeUpload", "onSend", "onUpload", "onError", "onClear", "onRemove", "onSelect", "onProgress", "uploadHandler", "onImageError", "onRemoveUploadedFile"] }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
190
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TsiFileManagerComponent, deps: [{ token: i1.LocalizePipe }, { token: i2.TsiNotificationService }, { token: i0.ChangeDetectorRef }, { token: i0.EnvironmentInjector }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
191
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TsiFileManagerComponent, selector: "Tsi-File-Manager", inputs: { fileName: "fileName", name: "name", id: "id", accept: "accept", maxFileSize: "maxFileSize", multiple: "multiple", exploreOnDownload: "exploreOnDownload", showUploadButton: "showUploadButton", showCancelButton: "showCancelButton", showDownloadButton: "showDownloadButton", chooseIcon: "chooseIcon", chooseLabel: "chooseLabel", showSelectButton: "showSelectButton", showFileUpload: "showFileUpload", showPreviewButton: "showPreviewButton", contentHeight: "contentHeight" }, outputs: { onSelectFileManager: "onSelectFileManager", onClear: "onClear", onRemove: "onRemove", inputFieldChange: "inputFieldChange", fileNameChange: "fileNameChange" }, usesInheritance: true, ngImport: i0, template: "<!-- <p-fileUpload class=\"file-manager\" #fileUpload [name]=\"name\" [id]=\"id\" [accept]=\"accept\" [maxFileSize]=\"maxFileSize\"\r\n [multiple]=\"multiple\" [showUploadButton]=\"showUploadButton\" [showCancelButton]=\"showCancelButton\"\r\n chooseIcon=\"pi pi-upload\" chooseLabel=\" \" (onSelect)=\"onFileSelect($event)\" (onClear)=\"onFileClear()\"\r\n (onRemove)=\"onFileRemove($event)\" class=\"custom-file-upload\" icon=\"pi pi-upload\">\r\n</p-fileUpload>\r\n\r\n<BR>\r\n<div *ngIf=\"showDownloadButton\">\r\n <button pButton type=\"button\" icon=\"pi pi-download\" (click)=\"downloadFile()\" class=\"h-2rem w-full text-center\">\r\n </button>\r\n</div> -->\r\n<div class=\"{{validationStatusCssClass}}\">\r\n\r\n <p-fileUpload class=\"file-manager custom-file-upload \" \r\n #fileUpload\r\n [name]=\"name\"\r\n [id]=\"id\" \r\n [accept]=\"accept\" \r\n [multiple]=\"multiple\"\r\n [disabled]=\"disabled\"\r\n [showUploadButton]=\"showUploadButton\" \r\n [showCancelButton]=\"showCancelButton\"\r\n chooseIcon=\"pi pi-upload\"\r\n chooseLabel= \"Upload\" \r\n (onSelect)=\"onFileSelect($event)\"\r\n (onClear)=\"onFileClear()\"\r\n (onRemove)=\"onFileRemove($event)\"\r\n >\r\n \r\n \r\n \r\n <!-- <ng-template pTemplate=\"content\">\r\n <button type=\"button\" pButton icon=\"pi pi-upload\" class=\"ml-4 h-2rem w-full text-center\">\r\n </button>\r\n </ng-template> -->\r\n <ng-template pTemplate=\"content\" let-files>\r\n <div class=\"tsi-file-content\" [style.height]=\"contentHeight\">\r\n <div *ngIf=\"inputField\" class=\"tsi-file-preview\">\r\n <Tsi-File-Preview [content]=\"inputField\" [fileName]=\"fileName\" [mimeType]=\"mimeType\"\r\n mediaMaxWidth=\"15rem\" (previewError)=\"onPreviewError()\">\r\n </Tsi-File-Preview>\r\n </div>\r\n\r\n <div class=\"mt-2\" *ngIf=\"fileName != undefined && fileName != null\">\r\n <p>{{ 'tsi_file_manager_file_name' | localize }}: {{ fileName }}</p>\r\n <p>{{ 'tsi_file_manager_file_extension' | localize }}: {{ getFileExtension(fileName) }}</p>\r\n </div>\r\n\r\n <div class=\"pb-2 pt-2\" *ngIf=\"showPreviewButton && canPreview\">\r\n <button pButton type=\"button\" icon=\"pi pi-eye\"\r\n [label]=\"'tsi_file_manager_preview' | localize\"\r\n (click)=\"openPreview()\" class=\"h-2rem w-full text-center\">\r\n </button>\r\n </div>\r\n\r\n <div *ngIf=\"inputField && (isUnsupported || mediaLoadError)\">\r\n <button pButton type=\"button\" icon=\"pi pi-download\"\r\n [label]=\"'tsi_file_manager_download' | localize\"\r\n (click)=\"downloadFile()\" class=\"h-2rem w-full text-center\">\r\n </button>\r\n </div>\r\n\r\n <div *ngIf=\"fileName != undefined && showDownloadButton && !isUnsupported && !mediaLoadError\">\r\n <button pButton type=\"button\" icon=\"pi pi-download\" (click)=\"downloadFile()\" class=\" h-2rem w-full text-center\">\r\n </button>\r\n </div>\r\n </div>\r\n </ng-template>\r\n \r\n </p-fileUpload>\r\n \r\n</div>", styles: [".ui-fileupload-choose{display:flex;align-items:center;justify-content:center;padding:.5rem;width:10rem;height:40px}.ui-fileupload-choose .ui-button-text{display:none}.ui-fileupload-choose .pi{font-size:2rem}.p-fileupload-choose input{display:none!important}:host ::ng-deep .p-fileupload-choose[disabled]{display:none!important}.tsi-file-content{display:flex;flex-direction:column;overflow:auto;box-sizing:border-box;width:100%}.tsi-file-preview{display:flex;justify-content:center;align-items:center;width:100%;flex:1 1 auto;min-height:0}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain"] }, { kind: "directive", type: i5.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "component", type: i6.FileUpload, selector: "p-fileUpload", inputs: ["name", "url", "method", "multiple", "accept", "disabled", "auto", "withCredentials", "maxFileSize", "invalidFileSizeMessageSummary", "invalidFileSizeMessageDetail", "invalidFileTypeMessageSummary", "invalidFileTypeMessageDetail", "invalidFileLimitMessageDetail", "invalidFileLimitMessageSummary", "style", "styleClass", "previewWidth", "chooseLabel", "uploadLabel", "cancelLabel", "chooseIcon", "uploadIcon", "cancelIcon", "showUploadButton", "showCancelButton", "mode", "headers", "customUpload", "fileLimit", "uploadStyleClass", "cancelStyleClass", "removeStyleClass", "chooseStyleClass", "files"], outputs: ["onBeforeUpload", "onSend", "onUpload", "onError", "onClear", "onRemove", "onSelect", "onProgress", "uploadHandler", "onImageError", "onRemoveUploadedFile"] }, { kind: "component", type: i7.TsiFilePreviewComponent, selector: "Tsi-File-Preview", inputs: ["content", "fileName", "mimeType", "mediaMaxWidth"], outputs: ["previewError"] }, { kind: "pipe", type: i1.LocalizePipe, name: "localize" }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
157
192
|
}
|
|
158
193
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TsiFileManagerComponent, decorators: [{
|
|
159
194
|
type: Component,
|
|
160
|
-
args: [{ selector: 'Tsi-File-Manager', encapsulation: ViewEncapsulation.None, template: "<!-- <p-fileUpload class=\"file-manager\" #fileUpload [name]=\"name\" [id]=\"id\" [accept]=\"accept\" [maxFileSize]=\"maxFileSize\"\r\n [multiple]=\"multiple\" [showUploadButton]=\"showUploadButton\" [showCancelButton]=\"showCancelButton\"\r\n chooseIcon=\"pi pi-upload\" chooseLabel=\" \" (onSelect)=\"onFileSelect($event)\" (onClear)=\"onFileClear()\"\r\n (onRemove)=\"onFileRemove($event)\" class=\"custom-file-upload\" icon=\"pi pi-upload\">\r\n</p-fileUpload>\r\n\r\n<BR>\r\n<div *ngIf=\"showDownloadButton\">\r\n <button pButton type=\"button\" icon=\"pi pi-download\" (click)=\"downloadFile()\" class=\"h-2rem w-full text-center\">\r\n </button>\r\n</div> -->\r\n<div class=\"{{validationStatusCssClass}}\">\r\n\r\n <p-fileUpload class=\"file-manager custom-file-upload \" \r\n #fileUpload\r\n [name]=\"name\"\r\n [id]=\"id\" \r\n [accept]=\"accept\" \r\n [multiple]=\"multiple\"\r\n [disabled]=\"disabled\"\r\n [showUploadButton]=\"showUploadButton\" \r\n [showCancelButton]=\"showCancelButton\"\r\n chooseIcon=\"pi pi-upload\"\r\n chooseLabel= \"Upload\" \r\n (onSelect)=\"onFileSelect($event)\"\r\n (onClear)=\"onFileClear()\"\r\n (onRemove)=\"onFileRemove($event)\"\r\n >\r\n \r\n \r\n \r\n <!-- <ng-template pTemplate=\"content\">\r\n <button type=\"button\" pButton icon=\"pi pi-upload\" class=\"ml-4 h-2rem w-full text-center\">\r\n </button>\r\n </ng-template> -->\r\n <ng-template pTemplate=\"content\" let-files>\r\n <div *ngIf=\"
|
|
161
|
-
}], ctorParameters: () => [{ type: i1.LocalizePipe }, { type: i2.TsiNotificationService }, { type: i0.ChangeDetectorRef }, { type:
|
|
195
|
+
args: [{ selector: 'Tsi-File-Manager', encapsulation: ViewEncapsulation.None, template: "<!-- <p-fileUpload class=\"file-manager\" #fileUpload [name]=\"name\" [id]=\"id\" [accept]=\"accept\" [maxFileSize]=\"maxFileSize\"\r\n [multiple]=\"multiple\" [showUploadButton]=\"showUploadButton\" [showCancelButton]=\"showCancelButton\"\r\n chooseIcon=\"pi pi-upload\" chooseLabel=\" \" (onSelect)=\"onFileSelect($event)\" (onClear)=\"onFileClear()\"\r\n (onRemove)=\"onFileRemove($event)\" class=\"custom-file-upload\" icon=\"pi pi-upload\">\r\n</p-fileUpload>\r\n\r\n<BR>\r\n<div *ngIf=\"showDownloadButton\">\r\n <button pButton type=\"button\" icon=\"pi pi-download\" (click)=\"downloadFile()\" class=\"h-2rem w-full text-center\">\r\n </button>\r\n</div> -->\r\n<div class=\"{{validationStatusCssClass}}\">\r\n\r\n <p-fileUpload class=\"file-manager custom-file-upload \" \r\n #fileUpload\r\n [name]=\"name\"\r\n [id]=\"id\" \r\n [accept]=\"accept\" \r\n [multiple]=\"multiple\"\r\n [disabled]=\"disabled\"\r\n [showUploadButton]=\"showUploadButton\" \r\n [showCancelButton]=\"showCancelButton\"\r\n chooseIcon=\"pi pi-upload\"\r\n chooseLabel= \"Upload\" \r\n (onSelect)=\"onFileSelect($event)\"\r\n (onClear)=\"onFileClear()\"\r\n (onRemove)=\"onFileRemove($event)\"\r\n >\r\n \r\n \r\n \r\n <!-- <ng-template pTemplate=\"content\">\r\n <button type=\"button\" pButton icon=\"pi pi-upload\" class=\"ml-4 h-2rem w-full text-center\">\r\n </button>\r\n </ng-template> -->\r\n <ng-template pTemplate=\"content\" let-files>\r\n <div class=\"tsi-file-content\" [style.height]=\"contentHeight\">\r\n <div *ngIf=\"inputField\" class=\"tsi-file-preview\">\r\n <Tsi-File-Preview [content]=\"inputField\" [fileName]=\"fileName\" [mimeType]=\"mimeType\"\r\n mediaMaxWidth=\"15rem\" (previewError)=\"onPreviewError()\">\r\n </Tsi-File-Preview>\r\n </div>\r\n\r\n <div class=\"mt-2\" *ngIf=\"fileName != undefined && fileName != null\">\r\n <p>{{ 'tsi_file_manager_file_name' | localize }}: {{ fileName }}</p>\r\n <p>{{ 'tsi_file_manager_file_extension' | localize }}: {{ getFileExtension(fileName) }}</p>\r\n </div>\r\n\r\n <div class=\"pb-2 pt-2\" *ngIf=\"showPreviewButton && canPreview\">\r\n <button pButton type=\"button\" icon=\"pi pi-eye\"\r\n [label]=\"'tsi_file_manager_preview' | localize\"\r\n (click)=\"openPreview()\" class=\"h-2rem w-full text-center\">\r\n </button>\r\n </div>\r\n\r\n <div *ngIf=\"inputField && (isUnsupported || mediaLoadError)\">\r\n <button pButton type=\"button\" icon=\"pi pi-download\"\r\n [label]=\"'tsi_file_manager_download' | localize\"\r\n (click)=\"downloadFile()\" class=\"h-2rem w-full text-center\">\r\n </button>\r\n </div>\r\n\r\n <div *ngIf=\"fileName != undefined && showDownloadButton && !isUnsupported && !mediaLoadError\">\r\n <button pButton type=\"button\" icon=\"pi pi-download\" (click)=\"downloadFile()\" class=\" h-2rem w-full text-center\">\r\n </button>\r\n </div>\r\n </div>\r\n </ng-template>\r\n \r\n </p-fileUpload>\r\n \r\n</div>", styles: [".ui-fileupload-choose{display:flex;align-items:center;justify-content:center;padding:.5rem;width:10rem;height:40px}.ui-fileupload-choose .ui-button-text{display:none}.ui-fileupload-choose .pi{font-size:2rem}.p-fileupload-choose input{display:none!important}:host ::ng-deep .p-fileupload-choose[disabled]{display:none!important}.tsi-file-content{display:flex;flex-direction:column;overflow:auto;box-sizing:border-box;width:100%}.tsi-file-preview{display:flex;justify-content:center;align-items:center;width:100%;flex:1 1 auto;min-height:0}\n"] }]
|
|
196
|
+
}], ctorParameters: () => [{ type: i1.LocalizePipe }, { type: i2.TsiNotificationService }, { type: i0.ChangeDetectorRef }, { type: i0.EnvironmentInjector }], propDecorators: { fileName: [{
|
|
162
197
|
type: Input
|
|
163
198
|
}], name: [{
|
|
164
199
|
type: Input
|
|
@@ -186,6 +221,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
186
221
|
type: Input
|
|
187
222
|
}], showFileUpload: [{
|
|
188
223
|
type: Input
|
|
224
|
+
}], showPreviewButton: [{
|
|
225
|
+
type: Input
|
|
226
|
+
}], contentHeight: [{
|
|
227
|
+
type: Input
|
|
189
228
|
}], onSelectFileManager: [{
|
|
190
229
|
type: Output
|
|
191
230
|
}], onClear: [{
|
|
@@ -197,4 +236,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
197
236
|
}], fileNameChange: [{
|
|
198
237
|
type: Output
|
|
199
238
|
}] } });
|
|
200
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHNpLWZpbGUtbWFuYWdlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90c2ktc2hhcmVkLXVpL3NyYy9saWIvdHNpLWNvbXBvbmVudHMvaW5wdXQtY29tcG9uZW50cy90c2ktZmlsZS1tYW5hZ2VyL3RzaS1maWxlLW1hbmFnZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdHNpLXNoYXJlZC11aS9zcmMvbGliL3RzaS1jb21wb25lbnRzL2lucHV0LWNvbXBvbmVudHMvdHNpLWZpbGUtbWFuYWdlci90c2ktZmlsZS1tYW5hZ2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBRTdHLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyREFBMkQsQ0FBQzs7Ozs7Ozs7O0FBVXpGLE1BQU0sT0FBTyx1QkFBd0IsU0FBUSxZQUFxRDtJQTZCaEc7Ozs7UUFJSTtJQUVKLFlBQ1UsUUFBc0IsRUFDdEIsbUJBQTJDLEVBQzNDLGlCQUFvQyxFQUNwQyxZQUEwQjtRQUVsQyxLQUFLLEVBQUUsQ0FBQztRQUxBLGFBQVEsR0FBUixRQUFRLENBQWM7UUFDdEIsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUF3QjtRQUMzQyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQ3BDLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBcEMzQixTQUFJLEdBQVcsRUFBRSxDQUFDO1FBRWxCLFdBQU0sR0FBVyxFQUFFLENBQUM7UUFDcEIsZ0JBQVcsR0FBVyxRQUFRLENBQUM7UUFDL0IsYUFBUSxHQUFZLEtBQUssQ0FBQztRQUMxQixzQkFBaUIsR0FBWSxLQUFLLENBQUM7UUFDbkMscUJBQWdCLEdBQVksS0FB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QkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBRUksbUJBQW1CO3NCQUE1QixNQUFNO2dCQUNHLE9BQU87c0JBQWhCLE1BQU07Z0JBQ0csUUFBUTtzQkFBakIsTUFBTTtnQkFDRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBQ0csY0FBYztzQkFBdkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgVmlld0VuY2Fwc3VsYXRpb24sIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgQ2hhbmdlRGV0ZWN0b3JSZWYgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBTYWZlVXJsLCBEb21TYW5pdGl6ZXIgfSBmcm9tIFwiQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3NlclwiO1xyXG5pbXBvcnQgeyBUc2lJbnB1dEJhc2UgfSBmcm9tIFwiLi4vLi4vLi4vdHNpLWJhc2UvdHNpLWlucHV0LWJhc2UvdHNpLWlucHV0LWJhc2UuY29tcG9uZW50XCI7XHJcbmltcG9ydCB7IExvY2FsaXplUGlwZSB9IGZyb20gXCIuLi8uLi8uLi9waXBlcy9sb2NhbGl6ZS5waXBlXCI7XHJcbmltcG9ydCB7IFRzaU5vdGlmaWNhdGlvblNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vLi4vc2VydmljZXMvbm90aWZpY2F0aW9uL3RzaS1ub3RpZmljYXRpb24uc2VydmljZVwiO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdUc2ktRmlsZS1NYW5hZ2VyJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vdHNpLWZpbGUtbWFuYWdlci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vdHNpLWZpbGUtbWFuYWdlci5jb21wb25lbnQuc2NzcyddLFxyXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVcclxufSlcclxuZXhwb3J0IGNsYXNzIFRzaUZpbGVNYW5hZ2VyQ29tcG9uZW50IGV4dGVuZHMgVHNpSW5wdXRCYXNlPHN0cmluZyB8IEFycmF5QnVmZmVyIHwgdW5kZWZpbmVkIHwgbnVsbD4ge1xyXG4gIC8vIEBJbnB1dCgpIGlucHV0RmllbGQ6IHN0cmluZyB8IEFycmF5QnVmZmVyIHx1bmRlZmluZWQgfCBudWxsO1xyXG4gIEBJbnB1dCgpIGZpbGVOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgQElucHV0KCkgbmFtZTogc3RyaW5nID0gJyc7XHJcbiAgQElucHV0KCkgaWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICBASW5wdXQoKSBhY2NlcHQ6IHN0cmluZyA9ICcnO1xyXG4gIEBJbnB1dCgpIG1heEZpbGVTaXplOiBudW1iZXIgPSAxMDQ4NTc2MDtcclxuICBASW5wdXQoKSBtdWx0aXBsZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGV4cGxvcmVPbkRvd25sb2FkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgc2hvd1VwbG9hZEJ1dHRvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHNob3dDYW5jZWxCdXR0b246IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSBzaG93RG93bmxvYWRCdXR0b246IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSBjaG9vc2VJY29uOiBzdHJpbmcgPSAnJztcclxuICBASW5wdXQoKSBjaG9vc2VMYWJlbDogc3RyaW5nID0gJyc7XHJcbiAgQElucHV0KCkgc2hvd1NlbGVjdEJ1dHRvbjogYm9vbGVhbiA9IHRydWU7XHJcbiAgQElucHV0KCkgc2hvd0ZpbGVVcGxvYWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBAT3V0cHV0KCkgb25TZWxlY3RGaWxlTWFuYWdlciA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBvbkNsZWFyID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG4gIEBPdXRwdXQoKSBvblJlbW92ZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBpbnB1dEZpZWxkQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIGZpbGVOYW1lQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcblxyXG5cclxuICBpbWFnZVVybDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIGZpbGVFeHRlbnNpb24/OiBzdHJpbmc7XHJcblxyXG4gIGZpbGVTaXplRXJyb3I6IHN0cmluZyA9ICcnO1xyXG4gIC8qIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIGlmICh0aGlzLnNob3dTZWxlY3RCdXR0b24gJiYgdGhpcy5maWxlVXBsb2FkSW5wdXQpIHtcclxuICAgICAgdGhpcy5maWxlVXBsb2FkSW5wdXQubmF0aXZlRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgfVxyXG4gIH0gKi9cclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGxvY2FsaXplOiBMb2NhbGl6ZVBpcGUsXHJcbiAgICBwcml2YXRlIG5vdGlmaWNhdGlvblNlcnZpY2U6IFRzaU5vdGlmaWNhdGlvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIHByaXZhdGUgZG9tU2FuaXRpemVyOiBEb21TYW5pdGl6ZXJcclxuICApIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgZ2V0RmlsZUV4dGVuc2lvbihmaWxlTmFtZTogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4gZmlsZU5hbWU/LnNwbGl0KCcuJyk/LnBvcCgpO1xyXG4gIH1cclxuXHJcbiAgb25GaWxlU2VsZWN0KGV2ZW50OiBhbnkpIHtcclxuICAgIGNvbnN0IGZpbGVzOiBGaWxlW10gPSBldmVudC5maWxlcztcclxuICAgIC8vIHRoaXMuY29udmVydEZpbGVUb0Jhc2U2NChmaWxlc1swXSkudGhlbigoYmFzZTY0U3RyaW5nOiBzdHJpbmcpID0+IHtcclxuICAgIC8vIHRoaXMuaW5wdXRGaWVsZCA9IGJhc2U2NFN0cmluZztcclxuICAgIC8vIH0pO1xyXG4gICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgIHJlYWRlci5vbmxvYWQgPSAoKSA9PiB7XHJcbiAgICAgIHRoaXMuaW5wdXRGaWVsZCA9IChyZWFkZXIucmVzdWx0IGFzIHN0cmluZykuc3BsaXQoJywnKVsxXTtcclxuICAgIH07XHJcbiAgICByZWFkZXIub25lcnJvciA9IChlcnJvcikgPT4ge1xyXG4gICAgfTtcclxuICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGVzWzBdKTtcclxuICAgIHRoaXMuZmlsZU5hbWUgPSBmaWxlc1swXS5uYW1lO1xyXG4gICAgY29uc3QgZmlsZU5hbWU6IHN0cmluZyA9IHRoaXMuZmlsZU5hbWUhO1xyXG5cclxuICAgIGlmIChmaWxlc1swXS5zaXplID4gdGhpcy5tYXhGaWxlU2l6ZSkge1xyXG4gICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2Uud2FybihgXHJcbiAgICAgICAgJHt0aGlzLmxvY2FsaXplLnRyYW5zZm9ybShcInRzaV9maWxlX3VwbG9hZF9hdXRvX3ZhbGlkYXRpb25fbWF4X2xlbmd0aF9kZXRhaWxfMVwiKX0gXHJcbiAgICAgICAgJHsoZmlsZXNbMF0uc2l6ZSAvICgxMDI0ICogMTAyNCkpLnRvRml4ZWQoMil9IFxyXG4gICAgICAgICR7dGhpcy5sb2NhbGl6ZS50cmFuc2Zvcm0oXCJ0c2lfZmlsZV91cGxvYWRfYXV0b192YWxpZGF0aW9uX21heF9sZW5ndGhfZGV0YWlsXzJcIil9XHJcbiAgICAgICAgJHsodGhpcy5tYXhGaWxlU2l6ZSAvICgxMDI0ICogMTAyNCkpLnRvRml4ZWQoMil9IE1vYCxcclxuICAgICAgICB0aGlzLmxvY2FsaXplLnRyYW5zZm9ybShcInRzaV9maWxlX3VwbG9hZF9hdXRvX3ZhbGlkYXRpb25fbWF4X2xlbmd0aF90aXRsZVwiKSlcclxuXHJcbiAgICAgIHRoaXMuaXNEaXJ0eSA9IHRoaXMuaW5wdXRGaWVsZCAhPSB1bmRlZmluZWQgJiYgdGhpcy5pbnB1dEZpZWxkICE9IG51bGxcclxuICAgICAgdGhpcy5pbnB1dEZpZWxkID0gdW5kZWZpbmVkXHJcblxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgLy90aGlzLmZpbGVOYW1lID0gZmlsZXMubWFwKChmaWxlOiBhbnkpID0+IGZpbGUubmFtZSkuam9pbignLCAnKTtcclxuICAgICAgdGhpcy5vblNlbGVjdEZpbGVNYW5hZ2VyLmVtaXQoeyBldmVudCwgZmlsZXMsIGlucHV0RmllbGQ6IHRoaXMuaW5wdXRGaWVsZCwgZmlsZU5hbWU6IGZpbGVOYW1lIH0pO1xyXG4gICAgICB0aGlzLmlucHV0RmllbGRDaGFuZ2UuZW1pdCh0aGlzLmlucHV0RmllbGQpO1xyXG4gICAgICB0aGlzLmZpbGVOYW1lQ2hhbmdlLmVtaXQodGhpcy5maWxlTmFtZSk7XHJcbiAgICAgIHRoaXMuaXNEaXJ0eSA9IHRydWVcclxuICAgIH0sIDIwMCk7XHJcblxyXG5cclxuICB9XHJcblxyXG4gIG9uRmlsZUNsZWFyKCkge1xyXG4gICAgdGhpcy5pc0RpcnR5ID0gdGhpcy5pbnB1dEZpZWxkICE9IHVuZGVmaW5lZCAmJiB0aGlzLmlucHV0RmllbGQgIT0gbnVsbFxyXG4gICAgdGhpcy5pbnB1dEZpZWxkID0gbnVsbDtcclxuICAgIHRoaXMuZmlsZU5hbWUgPSAnJztcclxuICAgIHRoaXMuaW1hZ2VVcmwgPSBudWxsO1xyXG4gICAgdGhpcy5pbnB1dEZpZWxkQ2hhbmdlLmVtaXQodGhpcy5pbnB1dEZpZWxkKTtcclxuICAgIHRoaXMuZmlsZU5hbWVDaGFuZ2UuZW1pdCh0aGlzLmZpbGVOYW1lKTtcclxuICAgIHRoaXMub25DbGVhci5lbWl0KCk7XHJcbiAgfVxyXG5cclxuICBvbkZpbGVSZW1vdmUoZXZlbnQ6IGFueSkge1xyXG4gICAgY29uc3QgZmlsZSA9IGV2ZW50LmZpbGU7XHJcbiAgICAvL3RoaXMuaW5wdXRGaWVsZCA9IHRoaXMuaW5wdXRGaWVsZC5maWx0ZXIoKGY6IGFueSkgPT4gZiAhPT0gZmlsZSk7XHJcbiAgICAvL3RoaXMuZmlsZU5hbWUgPSB0aGlzLmlucHV0RmllbGQubWFwKChmOiBhbnkpID0+IGYubmFtZSkuam9pbignLCAnKTtcclxuICAgIHRoaXMuaXNEaXJ0eSA9IHRoaXMuaW5wdXRGaWVsZCAhPSB1bmRlZmluZWQgJiYgdGhpcy5pbnB1dEZpZWxkICE9IG51bGxcclxuICAgIHRoaXMuaW5wdXRGaWVsZCA9IG51bGw7XHJcbiAgICB0aGlzLmZpbGVOYW1lID0gJyc7XHJcbiAgICB0aGlzLmltYWdlVXJsID0gbnVsbDtcclxuICAgIHRoaXMub25SZW1vdmUuZW1pdChmaWxlKTtcclxuICAgIHRoaXMuaW5wdXRGaWVsZENoYW5nZS5lbWl0KHRoaXMuaW5wdXRGaWVsZCk7XHJcbiAgICB0aGlzLmZpbGVOYW1lQ2hhbmdlLmVtaXQodGhpcy5maWxlTmFtZSk7XHJcbiAgfVxyXG5cclxuICBjb252ZXJ0RmlsZVRvQmFzZTY0KGZpbGU6IEZpbGUpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XHJcbiAgICAgIHJlYWRlci5vbmxvYWQgPSAoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgYmFzZTY0U3RyaW5nID0gcmVhZGVyLnJlc3VsdCBhcyBzdHJpbmc7IC8vIENvbnZlcnNpb24gZXhwbGljaXRlIGVuIHN0cmluZ1xyXG4gICAgICAgIHJlc29sdmUoYmFzZTY0U3RyaW5nKTtcclxuICAgICAgfTtcclxuICAgICAgcmVhZGVyLm9uZXJyb3IgPSBlcnJvciA9PiByZWplY3QoZXJyb3IpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBkb3dubG9hZEZpbGUoKSB7XHJcbiAgICBpZiAoIXRoaXMuaW5wdXRGaWVsZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgYnl0ZUNoYXJhY3RlcnMgPSBhdG9iKHRoaXMuaW5wdXRGaWVsZCBhcyBzdHJpbmcpO1xyXG4gICAgY29uc3QgYnl0ZU51bWJlcnMgPSBuZXcgQXJyYXkoYnl0ZUNoYXJhY3RlcnMubGVuZ3RoKTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnl0ZUNoYXJhY3RlcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgYnl0ZU51bWJlcnNbaV0gPSBieXRlQ2hhcmFjdGVycy5jaGFyQ29kZUF0KGkpO1xyXG4gICAgfVxyXG4gICAgY29uc3QgYnl0ZUFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYnl0ZU51bWJlcnMpO1xyXG4gICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtieXRlQXJyYXldLCB7IHR5cGU6ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nIH0pO1xyXG5cclxuICAgIGNvbnN0IHVybCA9IHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xyXG5cclxuICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XHJcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpO1xyXG4gICAgYS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgYS5ocmVmID0gdXJsO1xyXG4gICAgYS5kb3dubG9hZCA9IHRoaXMuZmlsZU5hbWUhO1xyXG4gICAgYS5jbGljaygpO1xyXG5cclxuICAgIC8vd2luZG93LlVSTC5yZXZva2VPYmplY3RVUkwodXJsKTtcclxuICB9XHJcblxyXG4gIGFycmF5QnVmZmVyVG9CYXNlNjQoYnVmZmVyOiBBcnJheUJ1ZmZlcik6IHN0cmluZyB7XHJcbiAgICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcik7XHJcbiAgICBsZXQgYmluYXJ5ID0gJyc7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVzLmJ5dGVMZW5ndGg7IGkrKykge1xyXG4gICAgICBiaW5hcnkgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlc1tpXSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gJ2RhdGE6YXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtO2Jhc2U2NCwnICsgYnRvYShiaW5hcnkpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGZpbGVVcmwoKTogU2FmZVVybCB7XHJcbiAgICBpZiAoIXRoaXMuaW5wdXRGaWVsZCkge1xyXG4gICAgICByZXR1cm4gJyc7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgYnl0ZUNoYXJhY3RlcnMgPSBhdG9iKHRoaXMuaW5wdXRGaWVsZCBhcyBzdHJpbmcpO1xyXG4gICAgY29uc3QgYnl0ZU51bWJlcnMgPSBuZXcgQXJyYXkoYnl0ZUNoYXJhY3RlcnMubGVuZ3RoKTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnl0ZUNoYXJhY3RlcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgYnl0ZU51bWJlcnNbaV0gPSBieXRlQ2hhcmFjdGVycy5jaGFyQ29kZUF0KGkpO1xyXG4gICAgfVxyXG4gICAgY29uc3QgYnl0ZUFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYnl0ZU51bWJlcnMpO1xyXG4gICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtieXRlQXJyYXldLCB7IHR5cGU6ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nIH0pO1xyXG5cclxuICAgIGNvbnN0IHVybCA9IHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xyXG5cclxuICAgIHJldHVybiB0aGlzLmRvbVNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0VXJsKHVybCk7XHJcbiAgfVxyXG5cclxuICBmaWxlRXh0ZW5zaW9uSW1hZ2UoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRGaWxlRXh0ZW5zaW9uKHRoaXMuZmlsZU5hbWUhKSA9PSAnanBnJ1xyXG4gIH1cclxufSIsIjwhLS0gPHAtZmlsZVVwbG9hZCBjbGFzcz1cImZpbGUtbWFuYWdlclwiICNmaWxlVXBsb2FkIFtuYW1lXT1cIm5hbWVcIiBbaWRdPVwiaWRcIiBbYWNjZXB0XT1cImFjY2VwdFwiIFttYXhGaWxlU2l6ZV09XCJtYXhGaWxlU2l6ZVwiXHJcbiAgW211bHRpcGxlXT1cIm11bHRpcGxlXCIgW3Nob3dVcGxvYWRCdXR0b25dPVwic2hvd1VwbG9hZEJ1dHRvblwiIFtzaG93Q2FuY2VsQnV0dG9uXT1cInNob3dDYW5jZWxCdXR0b25cIlxyXG4gIGNob29zZUljb249XCJwaSBwaS11cGxvYWRcIiBjaG9vc2VMYWJlbD1cIiBcIiAob25TZWxlY3QpPVwib25GaWxlU2VsZWN0KCRldmVudClcIiAob25DbGVhcik9XCJvbkZpbGVDbGVhcigpXCJcclxuICAob25SZW1vdmUpPVwib25GaWxlUmVtb3ZlKCRldmVudClcIiBjbGFzcz1cImN1c3RvbS1maWxlLXVwbG9hZFwiIGljb249XCJwaSBwaS11cGxvYWRcIj5cclxuPC9wLWZpbGVVcGxvYWQ+XHJcblxyXG48QlI+XHJcbjxkaXYgKm5nSWY9XCJzaG93RG93bmxvYWRCdXR0b25cIj5cclxuICA8YnV0dG9uIHBCdXR0b24gdHlwZT1cImJ1dHRvblwiIGljb249XCJwaSBwaS1kb3dubG9hZFwiIChjbGljayk9XCJkb3dubG9hZEZpbGUoKVwiIGNsYXNzPVwiaC0ycmVtIHctZnVsbCB0ZXh0LWNlbnRlclwiPlxyXG4gIDwvYnV0dG9uPlxyXG48L2Rpdj4gLS0+XHJcbjxkaXYgY2xhc3M9XCJ7e3ZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc319XCI+XHJcblxyXG4gIDxwLWZpbGVVcGxvYWQgY2xhc3M9XCJmaWxlLW1hbmFnZXIgY3VzdG9tLWZpbGUtdXBsb2FkIFwiIFxyXG4gICAgI2ZpbGVVcGxvYWRcclxuICAgIFtuYW1lXT1cIm5hbWVcIlxyXG4gICAgW2lkXT1cImlkXCIgXHJcbiAgICBbYWNjZXB0XT1cImFjY2VwdFwiIFxyXG4gICAgW211bHRpcGxlXT1cIm11bHRpcGxlXCJcclxuICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXHJcbiAgICBbc2hvd1VwbG9hZEJ1dHRvbl09XCJzaG93VXBsb2FkQnV0dG9uXCIgXHJcbiAgICBbc2hvd0NhbmNlbEJ1dHRvbl09XCJzaG93Q2FuY2VsQnV0dG9uXCJcclxuICAgIGNob29zZUljb249XCJwaSBwaS11cGxvYWRcIlxyXG4gICAgY2hvb3NlTGFiZWw9IFwiVXBsb2FkXCIgXHJcbiAgICAob25TZWxlY3QpPVwib25GaWxlU2VsZWN0KCRldmVudClcIlxyXG4gICAgKG9uQ2xlYXIpPVwib25GaWxlQ2xlYXIoKVwiXHJcbiAgICAob25SZW1vdmUpPVwib25GaWxlUmVtb3ZlKCRldmVudClcIlxyXG4gICAgPlxyXG4gICAgXHJcbiAgICBcclxuICAgIFxyXG4gICAgPCEtLSA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiY29udGVudFwiPlxyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBwQnV0dG9uIGljb249XCJwaSBwaS11cGxvYWRcIiBjbGFzcz1cIm1sLTQgaC0ycmVtIHctZnVsbCB0ZXh0LWNlbnRlclwiPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIDwvbmctdGVtcGxhdGU+IC0tPlxyXG4gICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImNvbnRlbnRcIiBsZXQtZmlsZXM+XHJcbiAgICAgIDxkaXYgKm5nSWY9XCJmaWxlRXh0ZW5zaW9uSW1hZ2UoKSB8fCBpbnB1dEZpZWxkXCI+XHJcbiAgICAgICAgPGltZyBbc3JjXT1cImZpbGVVcmxcIiBzdHlsZT1cIndpZHRoOiAxNXJlbTtcIi8+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2ICpuZ0lmPVwiZmlsZU5hbWUgIT0gdW5kZWZpbmVkICYmIGZpbGVOYW1lICE9IG51bGxcIj5cclxuICAgICAgICA8cD5GaWxlIE5hbWU6IHt7IGZpbGVOYW1lIH19PC9wPlxyXG4gICAgICAgIDxwPkZpbGUgRXh0ZW5zaW9uOiB7eyBnZXRGaWxlRXh0ZW5zaW9uKGZpbGVOYW1lKSB9fTwvcD5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgKm5nSWY9XCJmaWxlTmFtZSAhPSB1bmRlZmluZWQgJiYgc2hvd0Rvd25sb2FkQnV0dG9uXCI+XHJcbiAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHR5cGU9XCJidXR0b25cIiBpY29uPVwicGkgcGktZG93bmxvYWRcIiAoY2xpY2spPVwiZG93bmxvYWRGaWxlKClcIiBjbGFzcz1cIiBoLTJyZW0gdy1mdWxsIHRleHQtY2VudGVyXCI+XHJcbiAgICAgICAgICA8IS0tIDxzcGFuIGNsYXNzPVwiZm9udC1ib2xkIG1sLTJcIiA+RG93bmxvYWQ8L3NwYW4+IC0tPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICBcclxuICA8L3AtZmlsZVVwbG9hZD5cclxuICBcclxuPC9kaXY+Il19
|
|
239
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHNpLWZpbGUtbWFuYWdlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90c2ktc2hhcmVkLXVpL3NyYy9saWIvdHNpLWNvbXBvbmVudHMvaW5wdXQtY29tcG9uZW50cy90c2ktZmlsZS1tYW5hZ2VyL3RzaS1maWxlLW1hbmFnZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdHNpLXNoYXJlZC11aS9zcmMvbGliL3RzaS1jb21wb25lbnRzL2lucHV0LWNvbXBvbmVudHMvdHNpLWZpbGUtbWFuYWdlci90c2ktZmlsZS1tYW5hZ2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQTBDLE1BQU0sZUFBZSxDQUFDO0FBRWxJLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyREFBMkQsQ0FBQztBQUd6RixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDL0QsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDckYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLHdCQUF3QixFQUFFLE1BQU0sc0NBQXNDLENBQUM7Ozs7Ozs7OztBQVFwSCxNQUFNLE9BQU8sdUJBQXdCLFNBQVEsWUFBcUQ7SUF1Q2hHOzs7O1FBSUk7SUFFSixZQUNVLFFBQXNCLEVBQ3RCLG1CQUEyQyxFQUMzQyxpQkFBb0MsRUFDcEMsU0FBOEI7UUFFdEMsS0FBSyxFQUFFLENBQUM7UUFMQSxhQUFRLEdBQVIsUUFBUSxDQUFjO1FBQ3RCLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBd0I7UUFDM0Msc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUNwQyxjQUFTLEdBQVQsU0FBUyxDQUFx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O2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUVJLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFDRyxPQUFPO3NCQUFoQixNQUFNO2dCQUNHLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ0csZ0JBQWdCO3NCQUF6QixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIFZpZXdFbmNhcHN1bGF0aW9uLCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIENoYW5nZURldGVjdG9yUmVmLCBFbnZpcm9ubWVudEluamVjdG9yIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgRHluYW1pY0RpYWxvZ0NvbmZpZywgRHluYW1pY0RpYWxvZ1JlZiB9IGZyb20gXCJwcmltZW5nL2R5bmFtaWNkaWFsb2dcIjtcclxuaW1wb3J0IHsgVHNpSW5wdXRCYXNlIH0gZnJvbSBcIi4uLy4uLy4uL3RzaS1iYXNlL3RzaS1pbnB1dC1iYXNlL3RzaS1pbnB1dC1iYXNlLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBMb2NhbGl6ZVBpcGUgfSBmcm9tIFwiLi4vLi4vLi4vcGlwZXMvbG9jYWxpemUucGlwZVwiO1xyXG5pbXBvcnQgeyBUc2lOb3RpZmljYXRpb25TZXJ2aWNlIH0gZnJvbSBcIi4uLy4uLy4uL3NlcnZpY2VzL25vdGlmaWNhdGlvbi90c2ktbm90aWZpY2F0aW9uLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgTW9kYWxTaXplRW51bSB9IGZyb20gXCIuLi8uLi8uLi9lbnVtcy9tb2RhbC1zaXplLWVudW1cIjtcclxuaW1wb3J0IHsgb3BlblRzaUZpbGVQcmV2aWV3Q29tcG9uZW50IH0gZnJvbSBcIi4uLy4uLy4uL2Z1bmN0aW9ucy9tb2RhbC1vcGVuLmZ1bmN0aW9uXCI7XHJcbmltcG9ydCB7IGdldEZpbGVFeHRlbnNpb24sIGdldE1lZGlhQ2F0ZWdvcnksIGdldE1pbWVUeXBlRnJvbUV4dGVuc2lvbiB9IGZyb20gXCIuLi8uLi8uLi9mdW5jdGlvbnMvZmlsZS1wcmV2aWV3LnV0aWxcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnVHNpLUZpbGUtTWFuYWdlcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3RzaS1maWxlLW1hbmFnZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3RzaS1maWxlLW1hbmFnZXIuY29tcG9uZW50LnNjc3MnXSxcclxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUc2lGaWxlTWFuYWdlckNvbXBvbmVudCBleHRlbmRzIFRzaUlucHV0QmFzZTxzdHJpbmcgfCBBcnJheUJ1ZmZlciB8IHVuZGVmaW5lZCB8IG51bGw+IHtcclxuICAvLyBASW5wdXQoKSBpbnB1dEZpZWxkOiBzdHJpbmcgfCBBcnJheUJ1ZmZlciB8dW5kZWZpbmVkIHwgbnVsbDtcclxuICBASW5wdXQoKSBmaWxlTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG4gIEBJbnB1dCgpIG5hbWU6IHN0cmluZyA9ICcnO1xyXG4gIEBJbnB1dCgpIGlkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgQElucHV0KCkgYWNjZXB0OiBzdHJpbmcgPSAnJztcclxuICBASW5wdXQoKSBtYXhGaWxlU2l6ZTogbnVtYmVyID0gMTA0ODU3NjA7XHJcbiAgQElucHV0KCkgbXVsdGlwbGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSBleHBsb3JlT25Eb3dubG9hZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHNob3dVcGxvYWRCdXR0b246IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSBzaG93Q2FuY2VsQnV0dG9uOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgc2hvd0Rvd25sb2FkQnV0dG9uOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgY2hvb3NlSWNvbjogc3RyaW5nID0gJyc7XHJcbiAgQElucHV0KCkgY2hvb3NlTGFiZWw6IHN0cmluZyA9ICcnO1xyXG4gIEBJbnB1dCgpIHNob3dTZWxlY3RCdXR0b246IGJvb2xlYW4gPSB0cnVlO1xyXG4gIEBJbnB1dCgpIHNob3dGaWxlVXBsb2FkOiBib29sZWFuID0gdHJ1ZTtcclxuICBASW5wdXQoKSBzaG93UHJldmlld0J1dHRvbjogYm9vbGVhbiA9IHRydWU7XHJcbiAgQElucHV0KCkgY29udGVudEhlaWdodDogc3RyaW5nID0gJzIwcmVtJztcclxuXHJcbiAgQE91dHB1dCgpIG9uU2VsZWN0RmlsZU1hbmFnZXIgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgb25DbGVhciA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuICBAT3V0cHV0KCkgb25SZW1vdmUgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgaW5wdXRGaWVsZENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBmaWxlTmFtZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xyXG5cclxuXHJcbiAgaW1hZ2VVcmw6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG5cclxuICBmaWxlRXh0ZW5zaW9uPzogc3RyaW5nO1xyXG5cclxuICBmaWxlU2l6ZUVycm9yOiBzdHJpbmcgPSAnJztcclxuXHJcbiAgLyoqIFJlYWwgTUlNRSB0eXBlIGNhcHR1cmVkIGZyb20gdGhlIHNlbGVjdGVkIEZpbGUgKHdoZW4gYXZhaWxhYmxlKS4gKi9cclxuICBtaW1lVHlwZT86IHN0cmluZztcclxuXHJcbiAgLyoqIFNldCB3aGVuIHRoZSBpbmxpbmUgcHJldmlldyByZXBvcnRzIGEgbWVkaWEgbG9hZCBlcnJvciDihpIgZmFsbCBiYWNrIHRvIHRoZSBkb3dubG9hZCBjYXJkLiAqL1xyXG4gIG1lZGlhTG9hZEVycm9yOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHByaXZhdGUgX3ByZXZpZXdSZWY/OiBEeW5hbWljRGlhbG9nUmVmO1xyXG4gIC8qIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIGlmICh0aGlzLnNob3dTZWxlY3RCdXR0b24gJiYgdGhpcy5maWxlVXBsb2FkSW5wdXQpIHtcclxuICAgICAgdGhpcy5maWxlVXBsb2FkSW5wdXQubmF0aXZlRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgfVxyXG4gIH0gKi9cclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGxvY2FsaXplOiBMb2NhbGl6ZVBpcGUsXHJcbiAgICBwcml2YXRlIG5vdGlmaWNhdGlvblNlcnZpY2U6IFRzaU5vdGlmaWNhdGlvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIHByaXZhdGUgX2luamVjdG9yOiBFbnZpcm9ubWVudEluamVjdG9yXHJcbiAgKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRydWUgd2hlbiB0aGUgc2VsZWN0ZWQgZmlsZSBjYW4gYmUgcmVuZGVyZWQgaW4gdGhlIGJyb3dzZXIgKGltYWdlL3ZpZGVvL2F1ZGlvL3BkZikuICovXHJcbiAgZ2V0IGNhblByZXZpZXcoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gISF0aGlzLmlucHV0RmllbGQgJiYgZ2V0TWVkaWFDYXRlZ29yeSh0aGlzLmZpbGVOYW1lKSAhPT0gJ3Vuc3VwcG9ydGVkJztcclxuICB9XHJcblxyXG4gIC8qKiBUcnVlIHdoZW4gdGhlIHNlbGVjdGVkIGZpbGUgY2Fubm90IGJlIHByZXZpZXdlZCBpbmxpbmUuICovXHJcbiAgZ2V0IGlzVW5zdXBwb3J0ZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gZ2V0TWVkaWFDYXRlZ29yeSh0aGlzLmZpbGVOYW1lKSA9PT0gJ3Vuc3VwcG9ydGVkJztcclxuICB9XHJcblxyXG4gIC8qKiBDYWxsZWQgd2hlbiB0aGUgaW5saW5lIHByZXZpZXcgY29tcG9uZW50IHJlcG9ydHMgYSBtZWRpYSBsb2FkIGZhaWx1cmUuICovXHJcbiAgb25QcmV2aWV3RXJyb3IoKTogdm9pZCB7XHJcbiAgICB0aGlzLm1lZGlhTG9hZEVycm9yID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8qKiBPcGVuIHRoZSBzZWxlY3RlZCBmaWxlIGluIGEgbWF4aW1pemFibGUgbW9kYWwgdmlhIHRoZSBzaGFyZWQgRGlhbG9nU2VydmljZS4gKi9cclxuICBhc3luYyBvcGVuUHJldmlldygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICghdGhpcy5jYW5QcmV2aWV3KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IGNvbmY6IER5bmFtaWNEaWFsb2dDb25maWcgPSB7XHJcbiAgICAgIGhlYWRlcjogdGhpcy5maWxlTmFtZSxcclxuICAgICAgZGF0YTogeyBjb250ZW50OiB0aGlzLmlucHV0RmllbGQsIGZpbGVOYW1lOiB0aGlzLmZpbGVOYW1lLCBtaW1lVHlwZTogdGhpcy5taW1lVHlwZSB9LFxyXG4gICAgICB3aWR0aDogTW9kYWxTaXplRW51bS5NZWRpdW0ud2lkdGgsXHJcbiAgICAgIGhlaWdodDogTW9kYWxTaXplRW51bS5NZWRpdW0uaGVpZ2h0LFxyXG4gICAgICBtYXhpbWl6YWJsZTogdHJ1ZSxcclxuICAgICAgc3R5bGVDbGFzczogJycsXHJcbiAgICAgIGNvbnRlbnRTdHlsZTogeyBvdmVyZmxvdzogJ2F1dG8nIH0sXHJcbiAgICB9O1xyXG4gICAgdGhpcy5fcHJldmlld1JlZiA9IGF3YWl0IG9wZW5Uc2lGaWxlUHJldmlld0NvbXBvbmVudCh0aGlzLl9pbmplY3RvciwgY29uZik7XHJcbiAgfVxyXG5cclxuXHJcbiAgZ2V0RmlsZUV4dGVuc2lvbihmaWxlTmFtZTogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4gZ2V0RmlsZUV4dGVuc2lvbihmaWxlTmFtZSk7XHJcbiAgfVxyXG5cclxuICBvbkZpbGVTZWxlY3QoZXZlbnQ6IGFueSkge1xyXG4gICAgY29uc3QgZmlsZXM6IEZpbGVbXSA9IGV2ZW50LmZpbGVzO1xyXG4gICAgLy8gdGhpcy5jb252ZXJ0RmlsZVRvQmFzZTY0KGZpbGVzWzBdKS50aGVuKChiYXNlNjRTdHJpbmc6IHN0cmluZykgPT4ge1xyXG4gICAgLy8gdGhpcy5pbnB1dEZpZWxkID0gYmFzZTY0U3RyaW5nO1xyXG4gICAgLy8gfSk7XHJcbiAgICB0aGlzLm1lZGlhTG9hZEVycm9yID0gZmFsc2U7XHJcbiAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgcmVhZGVyLm9ubG9hZCA9ICgpID0+IHtcclxuICAgICAgdGhpcy5pbnB1dEZpZWxkID0gKHJlYWRlci5yZXN1bHQgYXMgc3RyaW5nKS5zcGxpdCgnLCcpWzFdO1xyXG4gICAgfTtcclxuICAgIHJlYWRlci5vbmVycm9yID0gKGVycm9yKSA9PiB7XHJcbiAgICB9O1xyXG4gICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZXNbMF0pO1xyXG4gICAgdGhpcy5maWxlTmFtZSA9IGZpbGVzWzBdLm5hbWU7XHJcbiAgICAvLyBQcmVmZXIgdGhlIGJyb3dzZXItZGV0ZWN0ZWQgTUlNRSB0eXBlOyBmYWxsIGJhY2sgdG8gdGhlIGV4dGVuc2lvbiBtYXAuXHJcbiAgICB0aGlzLm1pbWVUeXBlID0gZmlsZXNbMF0udHlwZSB8fCBnZXRNaW1lVHlwZUZyb21FeHRlbnNpb24oZ2V0RmlsZUV4dGVuc2lvbihmaWxlc1swXS5uYW1lKSk7XHJcbiAgICBjb25zdCBmaWxlTmFtZTogc3RyaW5nID0gdGhpcy5maWxlTmFtZSE7XHJcblxyXG4gICAgaWYgKGZpbGVzWzBdLnNpemUgPiB0aGlzLm1heEZpbGVTaXplKSB7XHJcbiAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS53YXJuKGBcclxuICAgICAgICAke3RoaXMubG9jYWxpemUudHJhbnNmb3JtKFwidHNpX2ZpbGVfdXBsb2FkX2F1dG9fdmFsaWRhdGlvbl9tYXhfbGVuZ3RoX2RldGFpbF8xXCIpfSBcclxuICAgICAgICAkeyhmaWxlc1swXS5zaXplIC8gKDEwMjQgKiAxMDI0KSkudG9GaXhlZCgyKX0gXHJcbiAgICAgICAgJHt0aGlzLmxvY2FsaXplLnRyYW5zZm9ybShcInRzaV9maWxlX3VwbG9hZF9hdXRvX3ZhbGlkYXRpb25fbWF4X2xlbmd0aF9kZXRhaWxfMlwiKX1cclxuICAgICAgICAkeyh0aGlzLm1heEZpbGVTaXplIC8gKDEwMjQgKiAxMDI0KSkudG9GaXhlZCgyKX0gTW9gLFxyXG4gICAgICAgIHRoaXMubG9jYWxpemUudHJhbnNmb3JtKFwidHNpX2ZpbGVfdXBsb2FkX2F1dG9fdmFsaWRhdGlvbl9tYXhfbGVuZ3RoX3RpdGxlXCIpKVxyXG5cclxuICAgICAgdGhpcy5pc0RpcnR5ID0gdGhpcy5pbnB1dEZpZWxkICE9IHVuZGVmaW5lZCAmJiB0aGlzLmlucHV0RmllbGQgIT0gbnVsbFxyXG4gICAgICB0aGlzLmlucHV0RmllbGQgPSB1bmRlZmluZWRcclxuXHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmlzRGlydHkgPSB0cnVlXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgLy90aGlzLmZpbGVOYW1lID0gZmlsZXMubWFwKChmaWxlOiBhbnkpID0+IGZpbGUubmFtZSkuam9pbignLCAnKTtcclxuICAgICAgdGhpcy5vblNlbGVjdEZpbGVNYW5hZ2VyLmVtaXQoeyBldmVudCwgZmlsZXMsIGlucHV0RmllbGQ6IHRoaXMuaW5wdXRGaWVsZCwgZmlsZU5hbWU6IGZpbGVOYW1lIH0pO1xyXG4gICAgICB0aGlzLmlucHV0RmllbGRDaGFuZ2UuZW1pdCh0aGlzLmlucHV0RmllbGQpO1xyXG4gICAgICB0aGlzLmZpbGVOYW1lQ2hhbmdlLmVtaXQodGhpcy5maWxlTmFtZSk7XHJcbiAgICB9LCAyMDApO1xyXG5cclxuXHJcbiAgfVxyXG5cclxuICBvbkZpbGVDbGVhcigpIHtcclxuICAgIHRoaXMuaXNEaXJ0eSA9IHRydWVcclxuICAgIHRoaXMuaW5wdXRGaWVsZCA9IG51bGw7XHJcbiAgICB0aGlzLmZpbGVOYW1lID0gJyc7XHJcbiAgICB0aGlzLmltYWdlVXJsID0gbnVsbDtcclxuICAgIHRoaXMucmVzZXRQcmV2aWV3KCk7XHJcbiAgICB0aGlzLmlucHV0RmllbGRDaGFuZ2UuZW1pdCh0aGlzLmlucHV0RmllbGQpO1xyXG4gICAgdGhpcy5maWxlTmFtZUNoYW5nZS5lbWl0KHRoaXMuZmlsZU5hbWUpO1xyXG4gICAgdGhpcy5vbkNsZWFyLmVtaXQoKTtcclxuICB9XHJcblxyXG4gIG9uRmlsZVJlbW92ZShldmVudDogYW55KSB7XHJcbiAgICBjb25zdCBmaWxlID0gZXZlbnQuZmlsZTtcclxuICAgIC8vdGhpcy5pbnB1dEZpZWxkID0gdGhpcy5pbnB1dEZpZWxkLmZpbHRlcigoZjogYW55KSA9PiBmICE9PSBmaWxlKTtcclxuICAgIC8vdGhpcy5maWxlTmFtZSA9IHRoaXMuaW5wdXRGaWVsZC5tYXAoKGY6IGFueSkgPT4gZi5uYW1lKS5qb2luKCcsICcpO1xyXG4gICAgdGhpcy5pc0RpcnR5ID0gdHJ1ZVxyXG4gICAgdGhpcy5pbnB1dEZpZWxkID0gbnVsbDtcclxuICAgIHRoaXMuZmlsZU5hbWUgPSAnJztcclxuICAgIHRoaXMuaW1hZ2VVcmwgPSBudWxsO1xyXG4gICAgdGhpcy5yZXNldFByZXZpZXcoKTtcclxuICAgIHRoaXMub25SZW1vdmUuZW1pdChmaWxlKTtcclxuICAgIHRoaXMuaW5wdXRGaWVsZENoYW5nZS5lbWl0KHRoaXMuaW5wdXRGaWVsZCk7XHJcbiAgICB0aGlzLmZpbGVOYW1lQ2hhbmdlLmVtaXQodGhpcy5maWxlTmFtZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlc2V0UHJldmlldygpIHtcclxuICAgIHRoaXMubWltZVR5cGUgPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLm1lZGlhTG9hZEVycm9yID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBjb252ZXJ0RmlsZVRvQmFzZTY0KGZpbGU6IEZpbGUpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XHJcbiAgICAgIHJlYWRlci5vbmxvYWQgPSAoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgYmFzZTY0U3RyaW5nID0gcmVhZGVyLnJlc3VsdCBhcyBzdHJpbmc7IC8vIENvbnZlcnNpb24gZXhwbGljaXRlIGVuIHN0cmluZ1xyXG4gICAgICAgIHJlc29sdmUoYmFzZTY0U3RyaW5nKTtcclxuICAgICAgfTtcclxuICAgICAgcmVhZGVyLm9uZXJyb3IgPSBlcnJvciA9PiByZWplY3QoZXJyb3IpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBkb3dubG9hZEZpbGUoKSB7XHJcbiAgICBpZiAoIXRoaXMuaW5wdXRGaWVsZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgYmxvYiA9IHRoaXMuYmFzZTY0VG9CbG9iKHRoaXMuaW5wdXRGaWVsZCBhcyBzdHJpbmcsIHRoaXMucmVzb2x2ZWRNaW1lVHlwZSk7XHJcbiAgICBjb25zdCB1cmwgPSB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcclxuXHJcbiAgICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xyXG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKTtcclxuICAgIGEuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgIGEuaHJlZiA9IHVybDtcclxuICAgIGEuZG93bmxvYWQgPSB0aGlzLmZpbGVOYW1lITtcclxuICAgIGEuY2xpY2soKTtcclxuXHJcbiAgICAvL3dpbmRvdy5VUkwucmV2b2tlT2JqZWN0VVJMKHVybCk7XHJcbiAgfVxyXG5cclxuICAvKiogRGVjb2RlIGEgYmFzZTY0IHN0cmluZyBpbnRvIGEgQmxvYiB0YWdnZWQgd2l0aCB0aGUgZ2l2ZW4gTUlNRSB0eXBlLiAqL1xyXG4gIHByaXZhdGUgYmFzZTY0VG9CbG9iKGJhc2U2NDogc3RyaW5nLCBtaW1lVHlwZTogc3RyaW5nKTogQmxvYiB7XHJcbiAgICBjb25zdCBieXRlQ2hhcmFjdGVycyA9IGF0b2IoYmFzZTY0KTtcclxuICAgIGNvbnN0IGJ5dGVOdW1iZXJzID0gbmV3IEFycmF5KGJ5dGVDaGFyYWN0ZXJzLmxlbmd0aCk7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVDaGFyYWN0ZXJzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGJ5dGVOdW1iZXJzW2ldID0gYnl0ZUNoYXJhY3RlcnMuY2hhckNvZGVBdChpKTtcclxuICAgIH1cclxuICAgIGNvbnN0IGJ5dGVBcnJheSA9IG5ldyBVaW50OEFycmF5KGJ5dGVOdW1iZXJzKTtcclxuICAgIHJldHVybiBuZXcgQmxvYihbYnl0ZUFycmF5XSwgeyB0eXBlOiBtaW1lVHlwZSB9KTtcclxuICB9XHJcblxyXG4gIGFycmF5QnVmZmVyVG9CYXNlNjQoYnVmZmVyOiBBcnJheUJ1ZmZlcik6IHN0cmluZyB7XHJcbiAgICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcik7XHJcbiAgICBsZXQgYmluYXJ5ID0gJyc7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVzLmJ5dGVMZW5ndGg7IGkrKykge1xyXG4gICAgICBiaW5hcnkgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlc1tpXSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gJ2RhdGE6YXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtO2Jhc2U2NCwnICsgYnRvYShiaW5hcnkpO1xyXG4gIH1cclxuXHJcbiAgLyoqIE1JTUUgdHlwZSB1c2VkIGZvciBkb3dubG9hZCDigJQgY2FwdHVyZWQgZnJvbSB0aGUgRmlsZSwgZWxzZSBkZXJpdmVkIGZyb20gdGhlIGV4dGVuc2lvbi4gKi9cclxuICBnZXQgcmVzb2x2ZWRNaW1lVHlwZSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMubWltZVR5cGUgfHwgZ2V0TWltZVR5cGVGcm9tRXh0ZW5zaW9uKGdldEZpbGVFeHRlbnNpb24odGhpcy5maWxlTmFtZSkpO1xyXG4gIH1cclxufSIsIjwhLS0gPHAtZmlsZVVwbG9hZCBjbGFzcz1cImZpbGUtbWFuYWdlclwiICNmaWxlVXBsb2FkIFtuYW1lXT1cIm5hbWVcIiBbaWRdPVwiaWRcIiBbYWNjZXB0XT1cImFjY2VwdFwiIFttYXhGaWxlU2l6ZV09XCJtYXhGaWxlU2l6ZVwiXHJcbiAgW211bHRpcGxlXT1cIm11bHRpcGxlXCIgW3Nob3dVcGxvYWRCdXR0b25dPVwic2hvd1VwbG9hZEJ1dHRvblwiIFtzaG93Q2FuY2VsQnV0dG9uXT1cInNob3dDYW5jZWxCdXR0b25cIlxyXG4gIGNob29zZUljb249XCJwaSBwaS11cGxvYWRcIiBjaG9vc2VMYWJlbD1cIiBcIiAob25TZWxlY3QpPVwib25GaWxlU2VsZWN0KCRldmVudClcIiAob25DbGVhcik9XCJvbkZpbGVDbGVhcigpXCJcclxuICAob25SZW1vdmUpPVwib25GaWxlUmVtb3ZlKCRldmVudClcIiBjbGFzcz1cImN1c3RvbS1maWxlLXVwbG9hZFwiIGljb249XCJwaSBwaS11cGxvYWRcIj5cclxuPC9wLWZpbGVVcGxvYWQ+XHJcblxyXG48QlI+XHJcbjxkaXYgKm5nSWY9XCJzaG93RG93bmxvYWRCdXR0b25cIj5cclxuICA8YnV0dG9uIHBCdXR0b24gdHlwZT1cImJ1dHRvblwiIGljb249XCJwaSBwaS1kb3dubG9hZFwiIChjbGljayk9XCJkb3dubG9hZEZpbGUoKVwiIGNsYXNzPVwiaC0ycmVtIHctZnVsbCB0ZXh0LWNlbnRlclwiPlxyXG4gIDwvYnV0dG9uPlxyXG48L2Rpdj4gLS0+XHJcbjxkaXYgY2xhc3M9XCJ7e3ZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc319XCI+XHJcblxyXG4gIDxwLWZpbGVVcGxvYWQgY2xhc3M9XCJmaWxlLW1hbmFnZXIgY3VzdG9tLWZpbGUtdXBsb2FkIFwiIFxyXG4gICAgI2ZpbGVVcGxvYWRcclxuICAgIFtuYW1lXT1cIm5hbWVcIlxyXG4gICAgW2lkXT1cImlkXCIgXHJcbiAgICBbYWNjZXB0XT1cImFjY2VwdFwiIFxyXG4gICAgW211bHRpcGxlXT1cIm11bHRpcGxlXCJcclxuICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXHJcbiAgICBbc2hvd1VwbG9hZEJ1dHRvbl09XCJzaG93VXBsb2FkQnV0dG9uXCIgXHJcbiAgICBbc2hvd0NhbmNlbEJ1dHRvbl09XCJzaG93Q2FuY2VsQnV0dG9uXCJcclxuICAgIGNob29zZUljb249XCJwaSBwaS11cGxvYWRcIlxyXG4gICAgY2hvb3NlTGFiZWw9IFwiVXBsb2FkXCIgXHJcbiAgICAob25TZWxlY3QpPVwib25GaWxlU2VsZWN0KCRldmVudClcIlxyXG4gICAgKG9uQ2xlYXIpPVwib25GaWxlQ2xlYXIoKVwiXHJcbiAgICAob25SZW1vdmUpPVwib25GaWxlUmVtb3ZlKCRldmVudClcIlxyXG4gICAgPlxyXG4gICAgXHJcbiAgICBcclxuICAgIFxyXG4gICAgPCEtLSA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiY29udGVudFwiPlxyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBwQnV0dG9uIGljb249XCJwaSBwaS11cGxvYWRcIiBjbGFzcz1cIm1sLTQgaC0ycmVtIHctZnVsbCB0ZXh0LWNlbnRlclwiPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIDwvbmctdGVtcGxhdGU+IC0tPlxyXG4gICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImNvbnRlbnRcIiBsZXQtZmlsZXM+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ0c2ktZmlsZS1jb250ZW50XCIgW3N0eWxlLmhlaWdodF09XCJjb250ZW50SGVpZ2h0XCI+XHJcbiAgICAgIDxkaXYgKm5nSWY9XCJpbnB1dEZpZWxkXCIgY2xhc3M9XCJ0c2ktZmlsZS1wcmV2aWV3XCI+XHJcbiAgICAgICAgPFRzaS1GaWxlLVByZXZpZXcgW2NvbnRlbnRdPVwiaW5wdXRGaWVsZFwiIFtmaWxlTmFtZV09XCJmaWxlTmFtZVwiIFttaW1lVHlwZV09XCJtaW1lVHlwZVwiXHJcbiAgICAgICAgICBtZWRpYU1heFdpZHRoPVwiMTVyZW1cIiAocHJldmlld0Vycm9yKT1cIm9uUHJldmlld0Vycm9yKClcIj5cclxuICAgICAgICA8L1RzaS1GaWxlLVByZXZpZXc+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cIm10LTJcIiAqbmdJZj1cImZpbGVOYW1lICE9IHVuZGVmaW5lZCAmJiBmaWxlTmFtZSAhPSBudWxsXCI+XHJcbiAgICAgICAgPHA+e3sgJ3RzaV9maWxlX21hbmFnZXJfZmlsZV9uYW1lJyB8IGxvY2FsaXplIH19OiB7eyBmaWxlTmFtZSB9fTwvcD5cclxuICAgICAgICA8cD57eyAndHNpX2ZpbGVfbWFuYWdlcl9maWxlX2V4dGVuc2lvbicgfCBsb2NhbGl6ZSB9fToge3sgZ2V0RmlsZUV4dGVuc2lvbihmaWxlTmFtZSkgfX08L3A+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cInBiLTIgcHQtMlwiICpuZ0lmPVwic2hvd1ByZXZpZXdCdXR0b24gJiYgY2FuUHJldmlld1wiPlxyXG4gICAgICAgIDxidXR0b24gcEJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgaWNvbj1cInBpIHBpLWV5ZVwiXHJcbiAgICAgICAgICBbbGFiZWxdPVwiJ3RzaV9maWxlX21hbmFnZXJfcHJldmlldycgfCBsb2NhbGl6ZVwiXHJcbiAgICAgICAgICAoY2xpY2spPVwib3BlblByZXZpZXcoKVwiIGNsYXNzPVwiaC0ycmVtIHctZnVsbCB0ZXh0LWNlbnRlclwiPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgKm5nSWY9XCJpbnB1dEZpZWxkICYmIChpc1Vuc3VwcG9ydGVkIHx8IG1lZGlhTG9hZEVycm9yKVwiPlxyXG4gICAgICAgIDxidXR0b24gcEJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgaWNvbj1cInBpIHBpLWRvd25sb2FkXCJcclxuICAgICAgICAgIFtsYWJlbF09XCIndHNpX2ZpbGVfbWFuYWdlcl9kb3dubG9hZCcgfCBsb2NhbGl6ZVwiXHJcbiAgICAgICAgICAoY2xpY2spPVwiZG93bmxvYWRGaWxlKClcIiBjbGFzcz1cImgtMnJlbSB3LWZ1bGwgdGV4dC1jZW50ZXJcIj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2ICpuZ0lmPVwiZmlsZU5hbWUgIT0gdW5kZWZpbmVkICYmIHNob3dEb3dubG9hZEJ1dHRvbiAmJiAhaXNVbnN1cHBvcnRlZCAmJiAhbWVkaWFMb2FkRXJyb3JcIj5cclxuICAgICAgICA8YnV0dG9uIHBCdXR0b24gdHlwZT1cImJ1dHRvblwiIGljb249XCJwaSBwaS1kb3dubG9hZFwiIChjbGljayk9XCJkb3dubG9hZEZpbGUoKVwiIGNsYXNzPVwiIGgtMnJlbSB3LWZ1bGwgdGV4dC1jZW50ZXJcIj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgIFxyXG4gIDwvcC1maWxlVXBsb2FkPlxyXG4gIFxyXG48L2Rpdj4iXX0=
|
package/esm2022/lib/tsi-components/output-components/tsi-file-preview/tsi-file-preview.component.mjs
ADDED
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { Component, ViewEncapsulation, Input, Output, EventEmitter, Optional } from "@angular/core";
|
|
2
|
+
import { getFileExtension, getFileTypeIconClass, getMediaCategory, getMimeTypeFromExtension } from "../../../functions/file-preview.util";
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "@angular/platform-browser";
|
|
5
|
+
import * as i2 from "primeng/dynamicdialog";
|
|
6
|
+
import * as i3 from "@angular/common";
|
|
7
|
+
import * as i4 from "../../../pipes/localize.pipe";
|
|
8
|
+
/**
|
|
9
|
+
* Presentational file viewer. Renders the selected file inline when the browser supports the
|
|
10
|
+
* type (image / video / audio / pdf), otherwise shows an icon + "not supported" fallback.
|
|
11
|
+
*
|
|
12
|
+
* Dual-mode:
|
|
13
|
+
* - Inline: bind [content]/[fileName]/[mimeType] inputs.
|
|
14
|
+
* - Dialog: opened via DialogService; the same fields are read from DynamicDialogConfig.data.
|
|
15
|
+
*/
|
|
16
|
+
export class TsiFilePreviewComponent {
|
|
17
|
+
constructor(domSanitizer, config) {
|
|
18
|
+
this.domSanitizer = domSanitizer;
|
|
19
|
+
this.config = config;
|
|
20
|
+
/** Max width for <img>/<video>. Inline usage passes '15rem'; the dialog keeps full width. */
|
|
21
|
+
this.mediaMaxWidth = '100%';
|
|
22
|
+
this.previewError = new EventEmitter();
|
|
23
|
+
/** Set when an inline media element fails to load → show the fallback card. */
|
|
24
|
+
this.mediaLoadError = false;
|
|
25
|
+
this.safeMediaUrl = '';
|
|
26
|
+
this.safePdfUrl = '';
|
|
27
|
+
this.objectUrl = null;
|
|
28
|
+
this.urlCacheKey = null;
|
|
29
|
+
}
|
|
30
|
+
get category() {
|
|
31
|
+
return getMediaCategory(this.fileName);
|
|
32
|
+
}
|
|
33
|
+
get iconClass() {
|
|
34
|
+
return getFileTypeIconClass(this.fileName);
|
|
35
|
+
}
|
|
36
|
+
ngOnInit() {
|
|
37
|
+
const data = this.config?.data;
|
|
38
|
+
if (data && this.content == null && data.content != null) {
|
|
39
|
+
this.content = data.content;
|
|
40
|
+
this.fileName = data.fileName;
|
|
41
|
+
this.mimeType = data.mimeType;
|
|
42
|
+
this.mediaMaxWidth = data.mediaMaxWidth ?? this.mediaMaxWidth;
|
|
43
|
+
}
|
|
44
|
+
this.buildPreview();
|
|
45
|
+
}
|
|
46
|
+
ngOnChanges() {
|
|
47
|
+
// Inline mode: rebuild when [content] changes.
|
|
48
|
+
this.buildPreview();
|
|
49
|
+
}
|
|
50
|
+
ngOnDestroy() {
|
|
51
|
+
this.revokeObjectUrl();
|
|
52
|
+
}
|
|
53
|
+
onMediaError() {
|
|
54
|
+
this.mediaLoadError = true;
|
|
55
|
+
this.previewError.emit();
|
|
56
|
+
}
|
|
57
|
+
/** MIME type used to tag the preview Blob — captured from the File, else derived from the extension. */
|
|
58
|
+
get resolvedMimeType() {
|
|
59
|
+
return this.mimeType || getMimeTypeFromExtension(getFileExtension(this.fileName));
|
|
60
|
+
}
|
|
61
|
+
/** Build (and memoize) the sanitized object URL once per file. */
|
|
62
|
+
buildPreview() {
|
|
63
|
+
const current = this.content ?? null;
|
|
64
|
+
if (!current) {
|
|
65
|
+
this.revokeObjectUrl();
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
if (current === this.urlCacheKey) {
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
this.revokeObjectUrl();
|
|
72
|
+
this.mediaLoadError = false;
|
|
73
|
+
const blob = this.base64ToBlob(current, this.resolvedMimeType);
|
|
74
|
+
this.objectUrl = window.URL.createObjectURL(blob);
|
|
75
|
+
this.urlCacheKey = current;
|
|
76
|
+
this.safeMediaUrl = this.domSanitizer.bypassSecurityTrustUrl(this.objectUrl);
|
|
77
|
+
this.safePdfUrl = this.domSanitizer.bypassSecurityTrustResourceUrl(this.objectUrl);
|
|
78
|
+
}
|
|
79
|
+
revokeObjectUrl() {
|
|
80
|
+
if (this.objectUrl) {
|
|
81
|
+
window.URL.revokeObjectURL(this.objectUrl);
|
|
82
|
+
this.objectUrl = null;
|
|
83
|
+
}
|
|
84
|
+
this.urlCacheKey = null;
|
|
85
|
+
this.safeMediaUrl = '';
|
|
86
|
+
this.safePdfUrl = '';
|
|
87
|
+
}
|
|
88
|
+
/** Decode a base64 string into a Blob tagged with the given MIME type. */
|
|
89
|
+
base64ToBlob(base64, mimeType) {
|
|
90
|
+
const byteCharacters = atob(base64);
|
|
91
|
+
const byteNumbers = new Array(byteCharacters.length);
|
|
92
|
+
for (let i = 0; i < byteCharacters.length; i++) {
|
|
93
|
+
byteNumbers[i] = byteCharacters.charCodeAt(i);
|
|
94
|
+
}
|
|
95
|
+
const byteArray = new Uint8Array(byteNumbers);
|
|
96
|
+
return new Blob([byteArray], { type: mimeType });
|
|
97
|
+
}
|
|
98
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TsiFilePreviewComponent, deps: [{ token: i1.DomSanitizer }, { token: i2.DynamicDialogConfig, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
99
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TsiFilePreviewComponent, selector: "Tsi-File-Preview", inputs: { content: "content", fileName: "fileName", mimeType: "mimeType", mediaMaxWidth: "mediaMaxWidth" }, outputs: { previewError: "previewError" }, usesOnChanges: true, ngImport: i0, template: "<ng-container *ngIf=\"content\">\r\n <ng-container *ngIf=\"!mediaLoadError\" [ngSwitch]=\"category\">\r\n <img *ngSwitchCase=\"'image'\" class=\"tsi-file-preview-media\" [style.maxWidth]=\"mediaMaxWidth\"\r\n [src]=\"safeMediaUrl\" (error)=\"onMediaError()\" alt=\"{{ fileName }}\" />\r\n\r\n <video *ngSwitchCase=\"'video'\" class=\"tsi-file-preview-media\" [style.maxWidth]=\"mediaMaxWidth\"\r\n [src]=\"safeMediaUrl\" controls (error)=\"onMediaError()\">\r\n </video>\r\n\r\n <audio *ngSwitchCase=\"'audio'\" class=\"tsi-file-preview-audio\" [src]=\"safeMediaUrl\" controls\r\n (error)=\"onMediaError()\">\r\n </audio>\r\n\r\n <iframe *ngSwitchCase=\"'pdf'\" class=\"tsi-file-preview-pdf\" [src]=\"safePdfUrl\" title=\"{{ fileName }}\">\r\n </iframe>\r\n\r\n <div *ngSwitchDefault class=\"tsi-file-fallback\">\r\n <i [class]=\"iconClass\"></i>\r\n <p class=\"tsi-file-fallback-msg\">{{ 'tsi_file_manager_preview_not_supported' | localize }}</p>\r\n </div>\r\n </ng-container>\r\n\r\n <div *ngIf=\"mediaLoadError\" class=\"tsi-file-fallback\">\r\n <i [class]=\"iconClass\"></i>\r\n <p class=\"tsi-file-fallback-msg\">{{ 'tsi_file_manager_preview_not_supported' | localize }}</p>\r\n </div>\r\n</ng-container>\r\n", styles: [":host{display:flex;justify-content:center;align-items:center;width:100%;height:100%}.tsi-file-preview-media{max-width:100%;max-height:100%;object-fit:contain}.tsi-file-preview-audio{width:15rem}.tsi-file-preview-pdf{width:100%;height:100%;border:none}.tsi-file-fallback{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.5rem;padding:1rem;text-align:center}.tsi-file-fallback .pi{font-size:3rem}.tsi-file-fallback-msg{margin:0}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i3.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i3.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "pipe", type: i4.LocalizePipe, name: "localize" }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
100
|
+
}
|
|
101
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TsiFilePreviewComponent, decorators: [{
|
|
102
|
+
type: Component,
|
|
103
|
+
args: [{ selector: 'Tsi-File-Preview', encapsulation: ViewEncapsulation.None, template: "<ng-container *ngIf=\"content\">\r\n <ng-container *ngIf=\"!mediaLoadError\" [ngSwitch]=\"category\">\r\n <img *ngSwitchCase=\"'image'\" class=\"tsi-file-preview-media\" [style.maxWidth]=\"mediaMaxWidth\"\r\n [src]=\"safeMediaUrl\" (error)=\"onMediaError()\" alt=\"{{ fileName }}\" />\r\n\r\n <video *ngSwitchCase=\"'video'\" class=\"tsi-file-preview-media\" [style.maxWidth]=\"mediaMaxWidth\"\r\n [src]=\"safeMediaUrl\" controls (error)=\"onMediaError()\">\r\n </video>\r\n\r\n <audio *ngSwitchCase=\"'audio'\" class=\"tsi-file-preview-audio\" [src]=\"safeMediaUrl\" controls\r\n (error)=\"onMediaError()\">\r\n </audio>\r\n\r\n <iframe *ngSwitchCase=\"'pdf'\" class=\"tsi-file-preview-pdf\" [src]=\"safePdfUrl\" title=\"{{ fileName }}\">\r\n </iframe>\r\n\r\n <div *ngSwitchDefault class=\"tsi-file-fallback\">\r\n <i [class]=\"iconClass\"></i>\r\n <p class=\"tsi-file-fallback-msg\">{{ 'tsi_file_manager_preview_not_supported' | localize }}</p>\r\n </div>\r\n </ng-container>\r\n\r\n <div *ngIf=\"mediaLoadError\" class=\"tsi-file-fallback\">\r\n <i [class]=\"iconClass\"></i>\r\n <p class=\"tsi-file-fallback-msg\">{{ 'tsi_file_manager_preview_not_supported' | localize }}</p>\r\n </div>\r\n</ng-container>\r\n", styles: [":host{display:flex;justify-content:center;align-items:center;width:100%;height:100%}.tsi-file-preview-media{max-width:100%;max-height:100%;object-fit:contain}.tsi-file-preview-audio{width:15rem}.tsi-file-preview-pdf{width:100%;height:100%;border:none}.tsi-file-fallback{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.5rem;padding:1rem;text-align:center}.tsi-file-fallback .pi{font-size:3rem}.tsi-file-fallback-msg{margin:0}\n"] }]
|
|
104
|
+
}], ctorParameters: () => [{ type: i1.DomSanitizer }, { type: i2.DynamicDialogConfig, decorators: [{
|
|
105
|
+
type: Optional
|
|
106
|
+
}] }], propDecorators: { content: [{
|
|
107
|
+
type: Input
|
|
108
|
+
}], fileName: [{
|
|
109
|
+
type: Input
|
|
110
|
+
}], mimeType: [{
|
|
111
|
+
type: Input
|
|
112
|
+
}], mediaMaxWidth: [{
|
|
113
|
+
type: Input
|
|
114
|
+
}], previewError: [{
|
|
115
|
+
type: Output
|
|
116
|
+
}] } });
|
|
117
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHNpLWZpbGUtcHJldmlldy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90c2ktc2hhcmVkLXVpL3NyYy9saWIvdHNpLWNvbXBvbmVudHMvb3V0cHV0LWNvbXBvbmVudHMvdHNpLWZpbGUtcHJldmlldy90c2ktZmlsZS1wcmV2aWV3LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RzaS1zaGFyZWQtdWkvc3JjL2xpYi90c2ktY29tcG9uZW50cy9vdXRwdXQtY29tcG9uZW50cy90c2ktZmlsZS1wcmV2aWV3L3RzaS1maWxlLXByZXZpZXcuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQWdDLE1BQU0sZUFBZSxDQUFDO0FBR2xJLE9BQU8sRUFBaUIsZ0JBQWdCLEVBQUUsb0JBQW9CLEVBQUUsZ0JBQWdCLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQzs7Ozs7O0FBRXpKOzs7Ozs7O0dBT0c7QUFPSCxNQUFNLE9BQU8sdUJBQXVCO0lBb0JsQyxZQUNVLFlBQTBCLEVBQ2QsTUFBNEI7UUFEeEMsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDZCxXQUFNLEdBQU4sTUFBTSxDQUFzQjtRQWhCbEQsNkZBQTZGO1FBQ3BGLGtCQUFhLEdBQVcsTUFBTSxDQUFDO1FBRTlCLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUVsRCwrRUFBK0U7UUFDL0UsbUJBQWMsR0FBWSxLQUFLLENBQUM7UUFFaEMsaUJBQVksR0FBWSxFQUFFLENBQUM7UUFDM0IsZUFBVSxHQUFvQixFQUFFLENBQUM7UUFFekIsY0FBUyxHQUFrQixJQUFJLENBQUM7UUFDaEMsZ0JBQVcsR0FBa0IsSUFBSSxDQUFD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RUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCwwRUFBMEU7SUFDbEUsWUFBWSxDQUFDLE1BQWMsRUFBRSxRQUFnQjtRQUNuRCxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDcEMsTUFBTSxXQUFXLEdBQUcsSUFBSSxLQUFLLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3JELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDL0MsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEQsQ0FBQztRQUNELE1BQU0sU0FBUyxHQUFHLElBQUksVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzlDLE9BQU8sSUFBSSxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQ25ELENBQUM7K0dBckdVLHVCQUF1QjttR0FBdkIsdUJBQXVCLG9PQ25CcEMsOHZDQTJCQTs7NEZEUmEsdUJBQXVCO2tCQU5uQyxTQUFTOytCQUNFLGtCQUFrQixpQkFHYixpQkFBaUIsQ0FBQyxJQUFJOzswQkF3QmxDLFFBQVE7eUNBcEJGLE9BQU87c0JBQWYsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUVHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBRUcsYUFBYTtzQkFBckIsS0FBSztnQkFFSSxZQUFZO3NCQUFyQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBWaWV3RW5jYXBzdWxhdGlvbiwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBPcHRpb25hbCwgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IFNhZmVVcmwsIFNhZmVSZXNvdXJjZVVybCwgRG9tU2FuaXRpemVyIH0gZnJvbSBcIkBhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXJcIjtcclxuaW1wb3J0IHsgRHluYW1pY0RpYWxvZ0NvbmZpZyB9IGZyb20gXCJwcmltZW5nL2R5bmFtaWNkaWFsb2dcIjtcclxuaW1wb3J0IHsgTWVkaWFDYXRlZ29yeSwgZ2V0RmlsZUV4dGVuc2lvbiwgZ2V0RmlsZVR5cGVJY29uQ2xhc3MsIGdldE1lZGlhQ2F0ZWdvcnksIGdldE1pbWVUeXBlRnJvbUV4dGVuc2lvbiB9IGZyb20gXCIuLi8uLi8uLi9mdW5jdGlvbnMvZmlsZS1wcmV2aWV3LnV0aWxcIjtcclxuXHJcbi8qKlxyXG4gKiBQcmVzZW50YXRpb25hbCBmaWxlIHZpZXdlci4gUmVuZGVycyB0aGUgc2VsZWN0ZWQgZmlsZSBpbmxpbmUgd2hlbiB0aGUgYnJvd3NlciBzdXBwb3J0cyB0aGVcclxuICogdHlwZSAoaW1hZ2UgLyB2aWRlbyAvIGF1ZGlvIC8gcGRmKSwgb3RoZXJ3aXNlIHNob3dzIGFuIGljb24gKyBcIm5vdCBzdXBwb3J0ZWRcIiBmYWxsYmFjay5cclxuICpcclxuICogRHVhbC1tb2RlOlxyXG4gKiAgLSBJbmxpbmU6IGJpbmQgW2NvbnRlbnRdL1tmaWxlTmFtZV0vW21pbWVUeXBlXSBpbnB1dHMuXHJcbiAqICAtIERpYWxvZzogb3BlbmVkIHZpYSBEaWFsb2dTZXJ2aWNlOyB0aGUgc2FtZSBmaWVsZHMgYXJlIHJlYWQgZnJvbSBEeW5hbWljRGlhbG9nQ29uZmlnLmRhdGEuXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ1RzaS1GaWxlLVByZXZpZXcnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi90c2ktZmlsZS1wcmV2aWV3LmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi90c2ktZmlsZS1wcmV2aWV3LmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxyXG59KVxyXG5leHBvcnQgY2xhc3MgVHNpRmlsZVByZXZpZXdDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcclxuICAvKiogQmFzZTY0LWVuY29kZWQgZmlsZSBjb250ZW50ICh3aXRob3V0IHRoZSBgZGF0YTpgIHByZWZpeCkuICovXHJcbiAgQElucHV0KCkgY29udGVudDogc3RyaW5nIHwgQXJyYXlCdWZmZXIgfCBudWxsIHwgdW5kZWZpbmVkO1xyXG4gIEBJbnB1dCgpIGZpbGVOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgLyoqIFJlYWwgTUlNRSB0eXBlIHdoZW4ga25vd247IGZhbGxzIGJhY2sgdG8gdGhlIGV4dGVuc2lvbiBtYXAuICovXHJcbiAgQElucHV0KCkgbWltZVR5cGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICAvKiogTWF4IHdpZHRoIGZvciA8aW1nPi88dmlkZW8+LiBJbmxpbmUgdXNhZ2UgcGFzc2VzICcxNXJlbSc7IHRoZSBkaWFsb2cga2VlcHMgZnVsbCB3aWR0aC4gKi9cclxuICBASW5wdXQoKSBtZWRpYU1heFdpZHRoOiBzdHJpbmcgPSAnMTAwJSc7XHJcblxyXG4gIEBPdXRwdXQoKSBwcmV2aWV3RXJyb3IgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcblxyXG4gIC8qKiBTZXQgd2hlbiBhbiBpbmxpbmUgbWVkaWEgZWxlbWVudCBmYWlscyB0byBsb2FkIOKGkiBzaG93IHRoZSBmYWxsYmFjayBjYXJkLiAqL1xyXG4gIG1lZGlhTG9hZEVycm9yOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHNhZmVNZWRpYVVybDogU2FmZVVybCA9ICcnO1xyXG4gIHNhZmVQZGZVcmw6IFNhZmVSZXNvdXJjZVVybCA9ICcnO1xyXG5cclxuICBwcml2YXRlIG9iamVjdFVybDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSB1cmxDYWNoZUtleTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBkb21TYW5pdGl6ZXI6IERvbVNhbml0aXplcixcclxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgY29uZmlnPzogRHluYW1pY0RpYWxvZ0NvbmZpZ1xyXG4gICkgeyB9XHJcblxyXG4gIGdldCBjYXRlZ29yeSgpOiBNZWRpYUNhdGVnb3J5IHtcclxuICAgIHJldHVybiBnZXRNZWRpYUNhdGVnb3J5KHRoaXMuZmlsZU5hbWUpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGljb25DbGFzcygpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGdldEZpbGVUeXBlSWNvbkNsYXNzKHRoaXMuZmlsZU5hbWUpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICBjb25zdCBkYXRhID0gdGhpcy5jb25maWc/LmRhdGE7XHJcbiAgICBpZiAoZGF0YSAmJiB0aGlzLmNvbnRlbnQgPT0gbnVsbCAmJiBkYXRhLmNvbnRlbnQgIT0gbnVsbCkge1xyXG4gICAgICB0aGlzLmNvbnRlbnQgPSBkYXRhLmNvbnRlbnQ7XHJcbiAgICAgIHRoaXMuZmlsZU5hbWUgPSBkYXRhLmZpbGVOYW1lO1xyXG4gICAgICB0aGlzLm1pbWVUeXBlID0gZGF0YS5taW1lVHlwZTtcclxuICAgICAgdGhpcy5tZWRpYU1heFdpZHRoID0gZGF0YS5tZWRpYU1heFdpZHRoID8/IHRoaXMubWVkaWFNYXhXaWR0aDtcclxuICAgIH1cclxuICAgIHRoaXMuYnVpbGRQcmV2aWV3KCk7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcclxuICAgIC8vIElubGluZSBtb2RlOiByZWJ1aWxkIHdoZW4gW2NvbnRlbnRdIGNoYW5nZXMuXHJcbiAgICB0aGlzLmJ1aWxkUHJldmlldygpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLnJldm9rZU9iamVjdFVybCgpO1xyXG4gIH1cclxuXHJcbiAgb25NZWRpYUVycm9yKCk6IHZvaWQge1xyXG4gICAgdGhpcy5tZWRpYUxvYWRFcnJvciA9IHRydWU7XHJcbiAgICB0aGlzLnByZXZpZXdFcnJvci5lbWl0KCk7XHJcbiAgfVxyXG5cclxuICAvKiogTUlNRSB0eXBlIHVzZWQgdG8gdGFnIHRoZSBwcmV2aWV3IEJsb2Ig4oCUIGNhcHR1cmVkIGZyb20gdGhlIEZpbGUsIGVsc2UgZGVyaXZlZCBmcm9tIHRoZSBleHRlbnNpb24uICovXHJcbiAgcHJpdmF0ZSBnZXQgcmVzb2x2ZWRNaW1lVHlwZSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMubWltZVR5cGUgfHwgZ2V0TWltZVR5cGVGcm9tRXh0ZW5zaW9uKGdldEZpbGVFeHRlbnNpb24odGhpcy5maWxlTmFtZSkpO1xyXG4gIH1cclxuXHJcbiAgLyoqIEJ1aWxkIChhbmQgbWVtb2l6ZSkgdGhlIHNhbml0aXplZCBvYmplY3QgVVJMIG9uY2UgcGVyIGZpbGUuICovXHJcbiAgcHJpdmF0ZSBidWlsZFByZXZpZXcoKTogdm9pZCB7XHJcbiAgICBjb25zdCBjdXJyZW50ID0gKHRoaXMuY29udGVudCBhcyBzdHJpbmcpID8/IG51bGw7XHJcbiAgICBpZiAoIWN1cnJlbnQpIHtcclxuICAgICAgdGhpcy5yZXZva2VPYmplY3RVcmwoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKGN1cnJlbnQgPT09IHRoaXMudXJsQ2FjaGVLZXkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5yZXZva2VPYmplY3RVcmwoKTtcclxuICAgIHRoaXMubWVkaWFMb2FkRXJyb3IgPSBmYWxzZTtcclxuICAgIGNvbnN0IGJsb2IgPSB0aGlzLmJhc2U2NFRvQmxvYihjdXJyZW50LCB0aGlzLnJlc29sdmVkTWltZVR5cGUpO1xyXG4gICAgdGhpcy5vYmplY3RVcmwgPSB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcclxuICAgIHRoaXMudXJsQ2FjaGVLZXkgPSBjdXJyZW50O1xyXG4gICAgdGhpcy5zYWZlTWVkaWFVcmwgPSB0aGlzLmRvbVNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0VXJsKHRoaXMub2JqZWN0VXJsKTtcclxuICAgIHRoaXMuc2FmZVBkZlVybCA9IHRoaXMuZG9tU2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RSZXNvdXJjZVVybCh0aGlzLm9iamVjdFVybCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJldm9rZU9iamVjdFVybCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLm9iamVjdFVybCkge1xyXG4gICAgICB3aW5kb3cuVVJMLnJldm9rZU9iamVjdFVSTCh0aGlzLm9iamVjdFVybCk7XHJcbiAgICAgIHRoaXMub2JqZWN0VXJsID0gbnVsbDtcclxuICAgIH1cclxuICAgIHRoaXMudXJsQ2FjaGVLZXkgPSBudWxsO1xyXG4gICAgdGhpcy5zYWZlTWVkaWFVcmwgPSAnJztcclxuICAgIHRoaXMuc2FmZVBkZlVybCA9ICcnO1xyXG4gIH1cclxuXHJcbiAgLyoqIERlY29kZSBhIGJhc2U2NCBzdHJpbmcgaW50byBhIEJsb2IgdGFnZ2VkIHdpdGggdGhlIGdpdmVuIE1JTUUgdHlwZS4gKi9cclxuICBwcml2YXRlIGJhc2U2NFRvQmxvYihiYXNlNjQ6IHN0cmluZywgbWltZVR5cGU6IHN0cmluZyk6IEJsb2Ige1xyXG4gICAgY29uc3QgYnl0ZUNoYXJhY3RlcnMgPSBhdG9iKGJhc2U2NCk7XHJcbiAgICBjb25zdCBieXRlTnVtYmVycyA9IG5ldyBBcnJheShieXRlQ2hhcmFjdGVycy5sZW5ndGgpO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBieXRlQ2hhcmFjdGVycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBieXRlTnVtYmVyc1tpXSA9IGJ5dGVDaGFyYWN0ZXJzLmNoYXJDb2RlQXQoaSk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBieXRlQXJyYXkgPSBuZXcgVWludDhBcnJheShieXRlTnVtYmVycyk7XHJcbiAgICByZXR1cm4gbmV3IEJsb2IoW2J5dGVBcnJheV0sIHsgdHlwZTogbWltZVR5cGUgfSk7XHJcbiAgfVxyXG59XHJcbiIsIjxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50XCI+XHJcbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFtZWRpYUxvYWRFcnJvclwiIFtuZ1N3aXRjaF09XCJjYXRlZ29yeVwiPlxyXG4gICAgPGltZyAqbmdTd2l0Y2hDYXNlPVwiJ2ltYWdlJ1wiIGNsYXNzPVwidHNpLWZpbGUtcHJldmlldy1tZWRpYVwiIFtzdHlsZS5tYXhXaWR0aF09XCJtZWRpYU1heFdpZHRoXCJcclxuICAgICAgW3NyY109XCJzYWZlTWVkaWFVcmxcIiAoZXJyb3IpPVwib25NZWRpYUVycm9yKClcIiBhbHQ9XCJ7eyBmaWxlTmFtZSB9fVwiIC8+XHJcblxyXG4gICAgPHZpZGVvICpuZ1N3aXRjaENhc2U9XCIndmlkZW8nXCIgY2xhc3M9XCJ0c2ktZmlsZS1wcmV2aWV3LW1lZGlhXCIgW3N0eWxlLm1heFdpZHRoXT1cIm1lZGlhTWF4V2lkdGhcIlxyXG4gICAgICBbc3JjXT1cInNhZmVNZWRpYVVybFwiIGNvbnRyb2xzIChlcnJvcik9XCJvbk1lZGlhRXJyb3IoKVwiPlxyXG4gICAgPC92aWRlbz5cclxuXHJcbiAgICA8YXVkaW8gKm5nU3dpdGNoQ2FzZT1cIidhdWRpbydcIiBjbGFzcz1cInRzaS1maWxlLXByZXZpZXctYXVkaW9cIiBbc3JjXT1cInNhZmVNZWRpYVVybFwiIGNvbnRyb2xzXHJcbiAgICAgIChlcnJvcik9XCJvbk1lZGlhRXJyb3IoKVwiPlxyXG4gICAgPC9hdWRpbz5cclxuXHJcbiAgICA8aWZyYW1lICpuZ1N3aXRjaENhc2U9XCIncGRmJ1wiIGNsYXNzPVwidHNpLWZpbGUtcHJldmlldy1wZGZcIiBbc3JjXT1cInNhZmVQZGZVcmxcIiB0aXRsZT1cInt7IGZpbGVOYW1lIH19XCI+XHJcbiAgICA8L2lmcmFtZT5cclxuXHJcbiAgICA8ZGl2ICpuZ1N3aXRjaERlZmF1bHQgY2xhc3M9XCJ0c2ktZmlsZS1mYWxsYmFja1wiPlxyXG4gICAgICA8aSBbY2xhc3NdPVwiaWNvbkNsYXNzXCI+PC9pPlxyXG4gICAgICA8cCBjbGFzcz1cInRzaS1maWxlLWZhbGxiYWNrLW1zZ1wiPnt7ICd0c2lfZmlsZV9tYW5hZ2VyX3ByZXZpZXdfbm90X3N1cHBvcnRlZCcgfCBsb2NhbGl6ZSB9fTwvcD5cclxuICAgIDwvZGl2PlxyXG4gIDwvbmctY29udGFpbmVyPlxyXG5cclxuICA8ZGl2ICpuZ0lmPVwibWVkaWFMb2FkRXJyb3JcIiBjbGFzcz1cInRzaS1maWxlLWZhbGxiYWNrXCI+XHJcbiAgICA8aSBbY2xhc3NdPVwiaWNvbkNsYXNzXCI+PC9pPlxyXG4gICAgPHAgY2xhc3M9XCJ0c2ktZmlsZS1mYWxsYmFjay1tc2dcIj57eyAndHNpX2ZpbGVfbWFuYWdlcl9wcmV2aWV3X25vdF9zdXBwb3J0ZWQnIHwgbG9jYWxpemUgfX08L3A+XHJcbiAgPC9kaXY+XHJcbjwvbmctY29udGFpbmVyPlxyXG4iXX0=
|