@muraai/mnl-form 0.0.1-alpha-db495b1 → 0.0.1-alpha-6116399
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/fesm2022/muraai-mnl-form.mjs +150 -143
- package/fesm2022/muraai-mnl-form.mjs.map +1 -1
- package/lib/types/upload-file.d.ts +1 -1
- package/lib/workflow-status/ workflow-status.module.d.ts +8 -8
- package/lib/workflow-status/workflow-status.component.d.ts +1 -1
- package/package.json +4 -5
- package/esm2022/lib/confirmation-dialog/confirmation-dialog.component.mjs +0 -34
- package/esm2022/lib/mnl-form/mnl-form-standalone.module.mjs +0 -155
- package/esm2022/lib/mnl-form/mnl-form.component.mjs +0 -199
- package/esm2022/lib/models/custom-form-field.model.mjs +0 -2
- package/esm2022/lib/models/workflow-status.model.mjs +0 -2
- package/esm2022/lib/services/graphql.service.mjs +0 -30
- package/esm2022/lib/services/scoring.service.mjs +0 -103
- package/esm2022/lib/types/action-button-renderer.component.mjs +0 -59
- package/esm2022/lib/types/autocomplete-type.component.mjs +0 -68
- package/esm2022/lib/types/button.type.mjs +0 -72
- package/esm2022/lib/types/comments.type.mjs +0 -102
- package/esm2022/lib/types/country-code-input.type.mjs +0 -181
- package/esm2022/lib/types/custom-date.type.mjs +0 -20
- package/esm2022/lib/types/custom-input.component.mjs +0 -62
- package/esm2022/lib/types/date-format.type.mjs +0 -196
- package/esm2022/lib/types/expansion-panel.types.mjs +0 -85
- package/esm2022/lib/types/formly-field-panel.type.mjs +0 -70
- package/esm2022/lib/types/grid-actionable.type.mjs +0 -197
- package/esm2022/lib/types/grid-formly-cell.component.mjs +0 -42
- package/esm2022/lib/types/grid.type.mjs +0 -125
- package/esm2022/lib/types/input.type.mjs +0 -43
- package/esm2022/lib/types/mu-helper-text.type.mjs +0 -331
- package/esm2022/lib/types/multi-select-autocomplete.mjs +0 -139
- package/esm2022/lib/types/multi-select-checkbox.component.mjs +0 -247
- package/esm2022/lib/types/radio.type.mjs +0 -71
- package/esm2022/lib/types/scrollable-tabs.types.mjs +0 -220
- package/esm2022/lib/types/select-api-auto-complete.component.mjs +0 -111
- package/esm2022/lib/types/select-autocomplete-redefined.component.mjs +0 -142
- package/esm2022/lib/types/select-autocomplete.type.mjs +0 -254
- package/esm2022/lib/types/stepper.type.mjs +0 -268
- package/esm2022/lib/types/table.types.mjs +0 -79
- package/esm2022/lib/types/tabs.types.mjs +0 -293
- package/esm2022/lib/types/tabular-form-dialog.component.mjs +0 -331
- package/esm2022/lib/types/tabular-form.type.mjs +0 -641
- package/esm2022/lib/types/upload-file.mjs +0 -524
- package/esm2022/lib/types/view-file-dialog.component.mjs +0 -90
- package/esm2022/lib/utils/formly.utils.mjs +0 -105
- package/esm2022/lib/validators/custom-email-validator.mjs +0 -18
- package/esm2022/lib/validators/ein-validators.mjs +0 -11
- package/esm2022/lib/validators/gst-validator.mjs +0 -11
- package/esm2022/lib/validators/normal-email-validator.mjs +0 -17
- package/esm2022/lib/validators/npi-validator.mjs +0 -11
- package/esm2022/lib/validators/pan-validator.mjs +0 -11
- package/esm2022/lib/validators/phone-number-validator.mjs +0 -22
- package/esm2022/lib/validators/select-validator.mjs +0 -7
- package/esm2022/lib/validators/tinSsn-validator.mjs +0 -12
- package/esm2022/lib/workflow-status/ workflow-status.module.mjs +0 -52
- package/esm2022/lib/workflow-status/workflow-status.component.mjs +0 -70
- package/esm2022/lib/wrappers/form-field-description-wrapper.component.mjs +0 -44
- package/esm2022/lib/wrappers/form-field-wrapper.component.mjs +0 -34
- package/esm2022/lib/wrappers/formly-wrapper-with-old-value.component.mjs +0 -140
- package/esm2022/lib/wrappers/prefix-suffix-wrapper.component.mjs +0 -95
- package/esm2022/lib/wrappers/prefix-sufix-extension.component.mjs +0 -9
- package/esm2022/muraai-mnl-form.mjs +0 -5
- package/esm2022/public-api.mjs +0 -12
|
@@ -1,524 +0,0 @@
|
|
|
1
|
-
import { Breakpoints } from '@angular/cdk/layout';
|
|
2
|
-
import { CommonModule, DatePipe } from '@angular/common';
|
|
3
|
-
import { ChangeDetectionStrategy, Component, DestroyRef, inject, } from '@angular/core';
|
|
4
|
-
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
5
|
-
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
|
|
6
|
-
import { MatFormFieldModule } from '@angular/material/form-field';
|
|
7
|
-
import { MatIconModule } from '@angular/material/icon';
|
|
8
|
-
import { MatInputModule } from '@angular/material/input';
|
|
9
|
-
import { MatSnackBarModule } from '@angular/material/snack-bar';
|
|
10
|
-
import { MatTableDataSource, MatTableModule } from '@angular/material/table';
|
|
11
|
-
import { MatTooltipModule } from '@angular/material/tooltip';
|
|
12
|
-
import { FieldType, FormlyModule } from '@ngx-formly/core';
|
|
13
|
-
import { TranslateModule } from '@ngx-translate/core';
|
|
14
|
-
import { Observable } from 'rxjs';
|
|
15
|
-
import * as i0 from "@angular/core";
|
|
16
|
-
import * as i1 from "@angular/material/snack-bar";
|
|
17
|
-
import * as i2 from "@ngx-translate/core";
|
|
18
|
-
import * as i3 from "@angular/cdk/layout";
|
|
19
|
-
import * as i4 from "@ngx-formly/core";
|
|
20
|
-
import * as i5 from "@angular/common";
|
|
21
|
-
import * as i6 from "@angular/material/table";
|
|
22
|
-
import * as i7 from "@angular/material/icon";
|
|
23
|
-
import * as i8 from "@angular/material/tooltip";
|
|
24
|
-
export class FormlyFileUploadComponent extends FieldType {
|
|
25
|
-
constructor(snackBar, translateService, breakpointObserver, cdr) {
|
|
26
|
-
super();
|
|
27
|
-
this.snackBar = snackBar;
|
|
28
|
-
this.translateService = translateService;
|
|
29
|
-
this.breakpointObserver = breakpointObserver;
|
|
30
|
-
this.cdr = cdr;
|
|
31
|
-
this.uploadedFiles = [];
|
|
32
|
-
this.displayedColumns = [
|
|
33
|
-
'fileName',
|
|
34
|
-
'convertedFileSize',
|
|
35
|
-
'uploadedBy',
|
|
36
|
-
'uploadedAt',
|
|
37
|
-
'actions',
|
|
38
|
-
];
|
|
39
|
-
this.dataSource = new MatTableDataSource();
|
|
40
|
-
this.showUploadbtn = true;
|
|
41
|
-
this.destroyRef = inject(DestroyRef);
|
|
42
|
-
this.isMobileDevice = false;
|
|
43
|
-
this.breakpointObserver
|
|
44
|
-
?.observe([Breakpoints.Handset])
|
|
45
|
-
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
46
|
-
.subscribe((result) => {
|
|
47
|
-
this.isMobileDevice = result?.matches;
|
|
48
|
-
});
|
|
49
|
-
}
|
|
50
|
-
ngOnInit() {
|
|
51
|
-
const userDetails = localStorage.getItem('loggedInUserDetails');
|
|
52
|
-
this.loggedInUserDetails = userDetails
|
|
53
|
-
? JSON.parse(userDetails)
|
|
54
|
-
: { email: '' };
|
|
55
|
-
if (this.field.props?.['isMultiFileUpload'] && this.formControl.value) {
|
|
56
|
-
this.uploadedFiles = this.formControl.value ?? [];
|
|
57
|
-
}
|
|
58
|
-
else {
|
|
59
|
-
if (this.formControl.value &&
|
|
60
|
-
Object.keys(this.formControl.value || {}).length) {
|
|
61
|
-
this.uploadedFiles = [this.formControl.value];
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
this.dataSource.data = [...this.uploadedFiles];
|
|
65
|
-
this.showUploadbtn = this.props?.['isMultiFileUpload']
|
|
66
|
-
? true
|
|
67
|
-
: !this.uploadedFiles.length;
|
|
68
|
-
}
|
|
69
|
-
onFileSelect(event) {
|
|
70
|
-
const selectedFile = event.target.files;
|
|
71
|
-
if (!selectedFile || !selectedFile.length)
|
|
72
|
-
return;
|
|
73
|
-
const maxFileSizeMB = this.field.props?.['maxFileSizeMB'] || 1;
|
|
74
|
-
const maxFileSize = maxFileSizeMB * 1024 * 1024;
|
|
75
|
-
if (this.props?.['isMultiFileUpload']) {
|
|
76
|
-
if (this.isFileAlreadyUploaded(event.target.files)) {
|
|
77
|
-
this.snackBar.open(this.translateService.instant('MNL_UPLOAD_FILE.DUPLICATE_UPLOADED'), 'Ok', {
|
|
78
|
-
duration: 3000,
|
|
79
|
-
panelClass: ['warn-snackbar'],
|
|
80
|
-
});
|
|
81
|
-
this.resetFileInput(event.target);
|
|
82
|
-
return;
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
const selectedFiles = Array.from(selectedFile);
|
|
86
|
-
const invalidChars = /[&,"]/;
|
|
87
|
-
const filesToProcess = this.field.props?.['isMultiFileUpload']
|
|
88
|
-
? selectedFiles
|
|
89
|
-
: [selectedFiles[0]];
|
|
90
|
-
filesToProcess.forEach((file) => {
|
|
91
|
-
if (file.size > maxFileSize) {
|
|
92
|
-
this.snackBar.open(`The file "${file.name}" exceeds the ${maxFileSizeMB} MB size limit.`, 'OK', {
|
|
93
|
-
duration: 3000,
|
|
94
|
-
panelClass: ['warn-snackbar'],
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
|
-
else if (invalidChars.test(file.name)) {
|
|
98
|
-
this.snackBar.open('MNL_UPLOAD_FILE.INVALID_CHARS_FILE_NAME', 'Ok', {
|
|
99
|
-
duration: 7000,
|
|
100
|
-
panelClass: ['error-snackbar'],
|
|
101
|
-
});
|
|
102
|
-
}
|
|
103
|
-
else {
|
|
104
|
-
const newFile = {
|
|
105
|
-
fileName: file.name,
|
|
106
|
-
fileSize: file.size,
|
|
107
|
-
fileType: file.type,
|
|
108
|
-
file: file,
|
|
109
|
-
uploadedBy: this.loggedInUserDetails.email,
|
|
110
|
-
uploadedAt: new Date(),
|
|
111
|
-
nodeId: '',
|
|
112
|
-
convertedFileSize: this.formatFileSize(file.size),
|
|
113
|
-
};
|
|
114
|
-
if (!this.props?.['isMultiFileUpload']) {
|
|
115
|
-
this.uploadedFiles = [newFile];
|
|
116
|
-
}
|
|
117
|
-
else {
|
|
118
|
-
this.uploadedFiles.push(newFile);
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
});
|
|
122
|
-
this.dataSource.data = [...this.uploadedFiles];
|
|
123
|
-
this.resetFileInput(event.target);
|
|
124
|
-
this.showUploadbtn = this.props?.['isMultiFileUpload']
|
|
125
|
-
? true
|
|
126
|
-
: !this.uploadedFiles.length;
|
|
127
|
-
if (this.field.props?.['onFilesAdded']) {
|
|
128
|
-
this.field.props['onFilesAdded'](this.uploadedFiles);
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
handleActionClick(action, index, element) {
|
|
132
|
-
const onUploadFileAction = this.field.props?.['onUploadFileAction'];
|
|
133
|
-
if (typeof onUploadFileAction === 'function') {
|
|
134
|
-
const result = onUploadFileAction(action.icon, element, index);
|
|
135
|
-
this.invokeAction(() => result, element, index, () => {
|
|
136
|
-
if (action.icon === 'delete')
|
|
137
|
-
this.removeFile(index);
|
|
138
|
-
if (action.icon === 'cloud_upload')
|
|
139
|
-
this.refreshUploadedTable(element, index);
|
|
140
|
-
if (action.icon === 'cloud_download' || action.icon === 'visibility')
|
|
141
|
-
() => { };
|
|
142
|
-
}, action.icon);
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
refreshUploadedTable(element, index) {
|
|
146
|
-
this.uploadedFiles[index] = element;
|
|
147
|
-
if (this.props?.['isMultiFileUpload']) {
|
|
148
|
-
const uploaded = this.uploadedFiles.filter((f) => !!f.nodeId);
|
|
149
|
-
this.formControl.setValue(uploaded);
|
|
150
|
-
}
|
|
151
|
-
else {
|
|
152
|
-
this.formControl.setValue(this.uploadedFiles[0]);
|
|
153
|
-
}
|
|
154
|
-
this.formControl.markAsTouched();
|
|
155
|
-
this.form.updateValueAndValidity();
|
|
156
|
-
this.dataSource.data = [...this.uploadedFiles];
|
|
157
|
-
this.cdr.detectChanges();
|
|
158
|
-
}
|
|
159
|
-
removeFile(index) {
|
|
160
|
-
this.uploadedFiles.splice(index, 1);
|
|
161
|
-
this.dataSource.data = [...this.uploadedFiles];
|
|
162
|
-
if (!this.field.props?.['isMultiFileUpload']) {
|
|
163
|
-
this.formControl.setValue(null);
|
|
164
|
-
}
|
|
165
|
-
else {
|
|
166
|
-
this.formControl.setValue(this.uploadedFiles);
|
|
167
|
-
const uploaded = this.uploadedFiles.filter((f) => !!f.nodeId);
|
|
168
|
-
this.formControl.setValue(uploaded);
|
|
169
|
-
}
|
|
170
|
-
this.showUploadbtn = this.props?.['isMultiFileUpload']
|
|
171
|
-
? true
|
|
172
|
-
: !this.uploadedFiles.length;
|
|
173
|
-
}
|
|
174
|
-
isFileAlreadyUploaded(selectedFile) {
|
|
175
|
-
return this.uploadedFiles.some((file) => file.fileName === selectedFile[0].name);
|
|
176
|
-
}
|
|
177
|
-
resetFileInput(fileInput) {
|
|
178
|
-
fileInput.value = '';
|
|
179
|
-
}
|
|
180
|
-
showUploadAction(action, file) {
|
|
181
|
-
const hasNode = !!file.nodeId;
|
|
182
|
-
const userRoles = this.options.formState?.userRoles ?? [];
|
|
183
|
-
const enabledRoles = this.field?.enabledForRoles ?? [];
|
|
184
|
-
switch (action.icon) {
|
|
185
|
-
case 'cloud_upload':
|
|
186
|
-
return !hasNode;
|
|
187
|
-
case 'cloud_download':
|
|
188
|
-
case 'visibility':
|
|
189
|
-
return hasNode;
|
|
190
|
-
case 'delete':
|
|
191
|
-
return (hasNode && userRoles.some((role) => enabledRoles.includes(role)));
|
|
192
|
-
default:
|
|
193
|
-
return false;
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
formatFileSize(bytes) {
|
|
197
|
-
if (bytes < 1024)
|
|
198
|
-
return bytes + ' B';
|
|
199
|
-
if (bytes < 1048576)
|
|
200
|
-
return (bytes / 1024).toFixed(2) + ' KB';
|
|
201
|
-
return (bytes / 1048576).toFixed(2) + ' MB';
|
|
202
|
-
}
|
|
203
|
-
invokeAction(actionCallback, element, index, defaultFn, icon) {
|
|
204
|
-
if (!actionCallback) {
|
|
205
|
-
defaultFn();
|
|
206
|
-
return;
|
|
207
|
-
}
|
|
208
|
-
const result = actionCallback(element, index);
|
|
209
|
-
if (result instanceof Observable) {
|
|
210
|
-
result.subscribe((shouldProceed) => {
|
|
211
|
-
if (shouldProceed) {
|
|
212
|
-
this.successMessage(icon);
|
|
213
|
-
defaultFn();
|
|
214
|
-
}
|
|
215
|
-
});
|
|
216
|
-
}
|
|
217
|
-
else {
|
|
218
|
-
Promise.resolve(result).then((shouldProceed) => {
|
|
219
|
-
if (shouldProceed) {
|
|
220
|
-
this.successMessage(icon);
|
|
221
|
-
defaultFn();
|
|
222
|
-
}
|
|
223
|
-
});
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
successMessage(icon) {
|
|
227
|
-
if (icon === 'cloud_upload') {
|
|
228
|
-
this.snackBar.open(this.translateService.instant('MNL_UPLOAD_FILE.FILE_SUCCESSFUL_UPLOADED'), 'Ok', {
|
|
229
|
-
duration: 5000,
|
|
230
|
-
panelClass: ['success-snackbar'],
|
|
231
|
-
});
|
|
232
|
-
}
|
|
233
|
-
else if (icon === 'delete') {
|
|
234
|
-
this.snackBar.open(this.translateService.instant('MNL_UPLOAD_FILE.FILE_SUCCESSFUL_DELETED'), 'Ok', {
|
|
235
|
-
duration: 5000,
|
|
236
|
-
panelClass: ['success-snackbar'],
|
|
237
|
-
});
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FormlyFileUploadComponent, deps: [{ token: i1.MatSnackBar }, { token: i2.TranslateService }, { token: i3.BreakpointObserver }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
241
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: FormlyFileUploadComponent, isStandalone: true, selector: "mu-formly-field-file", usesInheritance: true, ngImport: i0, template: `
|
|
242
|
-
@if(showUploadbtn) {
|
|
243
|
-
<div
|
|
244
|
-
class="input-btn"
|
|
245
|
-
[ngClass]="{ 'red-upload': !field.formControl?.valid }"
|
|
246
|
-
>
|
|
247
|
-
<button
|
|
248
|
-
type="button"
|
|
249
|
-
[disabled]="field.props?.['disabled']"
|
|
250
|
-
[ngClass]="[field.props?.['color']]"
|
|
251
|
-
(click)="fileInput.click()"
|
|
252
|
-
>
|
|
253
|
-
<mat-icon
|
|
254
|
-
*ngIf="field.props?.['icon']"
|
|
255
|
-
class="text-lg mb-1"
|
|
256
|
-
>{{ field.props?.['icon'] }}</mat-icon
|
|
257
|
-
>
|
|
258
|
-
{{ field.props?.label }}<span *ngIf="to.required">*</span>
|
|
259
|
-
</button>
|
|
260
|
-
<input
|
|
261
|
-
type="file"
|
|
262
|
-
#fileInput
|
|
263
|
-
(change)="onFileSelect($event)"
|
|
264
|
-
[formlyAttributes]="field"
|
|
265
|
-
[multiple]="field.props?.['isMultiFileUpload']"
|
|
266
|
-
[accept]="field.props?.['acceptedFileTypes'] || '.pdf,.xlsx,.jpg,.jpeg,.docx'"
|
|
267
|
-
class="hidden"
|
|
268
|
-
/>
|
|
269
|
-
<div class="text-[0.83rem] text-gray-500 mt-1">
|
|
270
|
-
Allowed file types:
|
|
271
|
-
{{ field.props?.['acceptedFileTypes'] || '.pdf, .xlsx, .jpg, jpeg, .docx' }}
|
|
272
|
-
<br />
|
|
273
|
-
Maximum file size: {{ field.props?.['maxFileSizeMB'] || 1 }}MB
|
|
274
|
-
</div>
|
|
275
|
-
</div>
|
|
276
|
-
}
|
|
277
|
-
<table
|
|
278
|
-
mat-table
|
|
279
|
-
*ngIf="this.props?.['isMultiFileUpload'] && uploadedFiles?.length"
|
|
280
|
-
[dataSource]="dataSource"
|
|
281
|
-
class="mat-elevation-z8"
|
|
282
|
-
>
|
|
283
|
-
<ng-container matColumnDef="fileName">
|
|
284
|
-
<th mat-header-cell *matHeaderCellDef class="header-cell">File Name</th>
|
|
285
|
-
<td mat-cell *matCellDef="let element">{{ element.fileName }}</td>
|
|
286
|
-
</ng-container>
|
|
287
|
-
|
|
288
|
-
<ng-container matColumnDef="convertedFileSize">
|
|
289
|
-
<th mat-header-cell *matHeaderCellDef class="header-cell">Size</th>
|
|
290
|
-
<td mat-cell *matCellDef="let element">
|
|
291
|
-
{{ element.convertedFileSize }}
|
|
292
|
-
</td>
|
|
293
|
-
</ng-container>
|
|
294
|
-
|
|
295
|
-
<ng-container matColumnDef="uploadedBy">
|
|
296
|
-
<th mat-header-cell *matHeaderCellDef class="header-cell">
|
|
297
|
-
Uploaded By
|
|
298
|
-
</th>
|
|
299
|
-
<td mat-cell *matCellDef="let element">{{ element.uploadedBy }}</td>
|
|
300
|
-
</ng-container>
|
|
301
|
-
|
|
302
|
-
<ng-container matColumnDef="uploadedAt">
|
|
303
|
-
<th mat-header-cell *matHeaderCellDef class="header-cell">
|
|
304
|
-
Uploaded Date
|
|
305
|
-
</th>
|
|
306
|
-
<td mat-cell *matCellDef="let element">
|
|
307
|
-
{{ element.uploadedAt | date : 'dd-MMM-yyyy, hh:mm:ss a' }}
|
|
308
|
-
</td>
|
|
309
|
-
</ng-container>
|
|
310
|
-
|
|
311
|
-
<ng-container matColumnDef="actions">
|
|
312
|
-
<th mat-header-cell *matHeaderCellDef class="header-cell">Actions</th>
|
|
313
|
-
<td mat-cell *matCellDef="let element; let i = index">
|
|
314
|
-
<div class="action-buttons">
|
|
315
|
-
<div
|
|
316
|
-
*ngFor="let action of field?.props?.['actions']"
|
|
317
|
-
class="actions-container"
|
|
318
|
-
>
|
|
319
|
-
<mat-icon
|
|
320
|
-
class="action-icons"
|
|
321
|
-
*ngIf="showUploadAction(action, element)"
|
|
322
|
-
matTooltip="{{ action.label | translate }}"
|
|
323
|
-
(click)="handleActionClick(action, i, element)"
|
|
324
|
-
>
|
|
325
|
-
{{ action.icon }}
|
|
326
|
-
</mat-icon>
|
|
327
|
-
</div>
|
|
328
|
-
</div>
|
|
329
|
-
</td>
|
|
330
|
-
</ng-container>
|
|
331
|
-
|
|
332
|
-
<tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
|
|
333
|
-
<tr mat-row *matRowDef="let row; columns: displayedColumns"></tr>
|
|
334
|
-
</table>
|
|
335
|
-
|
|
336
|
-
<div class="w-full">
|
|
337
|
-
<table
|
|
338
|
-
*ngIf="!this.props?.['isMultiFileUpload'] && uploadedFiles?.length"
|
|
339
|
-
class="w-full flex flex-col md:flex-row items-start md:items-center gap-2 md:gap-4"
|
|
340
|
-
>
|
|
341
|
-
<tr
|
|
342
|
-
class="flex flex-col md:flex-row items-start md:items-center gap-2 md:gap-4 w-full"
|
|
343
|
-
>
|
|
344
|
-
<td
|
|
345
|
-
class="text-sm truncate overflow-hidden whitespace-nowrap max-w-full flex-1 md:border-none"
|
|
346
|
-
[matTooltip]="uploadedFiles[0].fileName"
|
|
347
|
-
>
|
|
348
|
-
{{ uploadedFiles[0].fileName }}
|
|
349
|
-
</td>
|
|
350
|
-
<td class="flex items-center justify-end md:flex-shrink-0">
|
|
351
|
-
<div
|
|
352
|
-
*ngFor="let action of field?.props?.['actions']"
|
|
353
|
-
class="flex items-center"
|
|
354
|
-
>
|
|
355
|
-
<mat-icon
|
|
356
|
-
matTooltip="{{ action.label | translate }}"
|
|
357
|
-
*ngIf="showUploadAction(action, uploadedFiles[0])"
|
|
358
|
-
(click)="handleActionClick(action, 0, uploadedFiles[0])"
|
|
359
|
-
class="action-icons"
|
|
360
|
-
>
|
|
361
|
-
{{ action.icon }}
|
|
362
|
-
</mat-icon>
|
|
363
|
-
</div>
|
|
364
|
-
</td>
|
|
365
|
-
</tr>
|
|
366
|
-
</table>
|
|
367
|
-
</div>
|
|
368
|
-
<div
|
|
369
|
-
*ngIf="to['note']"
|
|
370
|
-
class="text-gray-500 mt-1 w-[900px]"
|
|
371
|
-
[innerHTML]="to['note']"
|
|
372
|
-
></div>
|
|
373
|
-
`, isInline: true, styles: [".mat-mdc-table{margin-top:5px;box-shadow:none}.header-cell{background-color:#7876761f!important}.action-buttons{display:flex;flex-direction:row;justify-content:start;align-items:center}.action-icons{font-size:20px}.actions-container{display:flex;justify-content:center;align-items:center;height:43px;padding-top:5px}.input-btn button,.red-upload button{color:#fff;padding:3px 10px;border:none;cursor:pointer;border-radius:50px;font-family:Poppins,Helvetica Neue,sans-serif;font-weight:500;font-size:14px;display:flex;align-items:center;justify-content:center}.input-btn button:disabled,.red-upload button:disabled{background-color:#d3d3d3;color:#b0b0b0}th,td,.upload-btn{font-family:Poppins,Helvetica Neue,sans-serif}.red-upload button{background-color:red}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "ngmodule", type: MatInputModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: FormlyModule }, { kind: "directive", type: i4.ɵFormlyAttributes, selector: "[formlyAttributes]", inputs: ["formlyAttributes", "id"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i5.DatePipe, name: "date" }, { kind: "ngmodule", type: MatTableModule }, { kind: "component", type: i6.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i6.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i6.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i6.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i6.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i6.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i6.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i6.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i6.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i6.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i8.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: MatSnackBarModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
374
|
-
}
|
|
375
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FormlyFileUploadComponent, decorators: [{
|
|
376
|
-
type: Component,
|
|
377
|
-
args: [{ selector: 'mu-formly-field-file', standalone: true, imports: [
|
|
378
|
-
FormsModule,
|
|
379
|
-
MatFormFieldModule,
|
|
380
|
-
MatInputModule,
|
|
381
|
-
ReactiveFormsModule,
|
|
382
|
-
FormlyModule,
|
|
383
|
-
CommonModule,
|
|
384
|
-
MatTableModule,
|
|
385
|
-
MatIconModule,
|
|
386
|
-
MatTooltipModule,
|
|
387
|
-
TranslateModule,
|
|
388
|
-
MatSnackBarModule,
|
|
389
|
-
DatePipe,
|
|
390
|
-
], template: `
|
|
391
|
-
@if(showUploadbtn) {
|
|
392
|
-
<div
|
|
393
|
-
class="input-btn"
|
|
394
|
-
[ngClass]="{ 'red-upload': !field.formControl?.valid }"
|
|
395
|
-
>
|
|
396
|
-
<button
|
|
397
|
-
type="button"
|
|
398
|
-
[disabled]="field.props?.['disabled']"
|
|
399
|
-
[ngClass]="[field.props?.['color']]"
|
|
400
|
-
(click)="fileInput.click()"
|
|
401
|
-
>
|
|
402
|
-
<mat-icon
|
|
403
|
-
*ngIf="field.props?.['icon']"
|
|
404
|
-
class="text-lg mb-1"
|
|
405
|
-
>{{ field.props?.['icon'] }}</mat-icon
|
|
406
|
-
>
|
|
407
|
-
{{ field.props?.label }}<span *ngIf="to.required">*</span>
|
|
408
|
-
</button>
|
|
409
|
-
<input
|
|
410
|
-
type="file"
|
|
411
|
-
#fileInput
|
|
412
|
-
(change)="onFileSelect($event)"
|
|
413
|
-
[formlyAttributes]="field"
|
|
414
|
-
[multiple]="field.props?.['isMultiFileUpload']"
|
|
415
|
-
[accept]="field.props?.['acceptedFileTypes'] || '.pdf,.xlsx,.jpg,.jpeg,.docx'"
|
|
416
|
-
class="hidden"
|
|
417
|
-
/>
|
|
418
|
-
<div class="text-[0.83rem] text-gray-500 mt-1">
|
|
419
|
-
Allowed file types:
|
|
420
|
-
{{ field.props?.['acceptedFileTypes'] || '.pdf, .xlsx, .jpg, jpeg, .docx' }}
|
|
421
|
-
<br />
|
|
422
|
-
Maximum file size: {{ field.props?.['maxFileSizeMB'] || 1 }}MB
|
|
423
|
-
</div>
|
|
424
|
-
</div>
|
|
425
|
-
}
|
|
426
|
-
<table
|
|
427
|
-
mat-table
|
|
428
|
-
*ngIf="this.props?.['isMultiFileUpload'] && uploadedFiles?.length"
|
|
429
|
-
[dataSource]="dataSource"
|
|
430
|
-
class="mat-elevation-z8"
|
|
431
|
-
>
|
|
432
|
-
<ng-container matColumnDef="fileName">
|
|
433
|
-
<th mat-header-cell *matHeaderCellDef class="header-cell">File Name</th>
|
|
434
|
-
<td mat-cell *matCellDef="let element">{{ element.fileName }}</td>
|
|
435
|
-
</ng-container>
|
|
436
|
-
|
|
437
|
-
<ng-container matColumnDef="convertedFileSize">
|
|
438
|
-
<th mat-header-cell *matHeaderCellDef class="header-cell">Size</th>
|
|
439
|
-
<td mat-cell *matCellDef="let element">
|
|
440
|
-
{{ element.convertedFileSize }}
|
|
441
|
-
</td>
|
|
442
|
-
</ng-container>
|
|
443
|
-
|
|
444
|
-
<ng-container matColumnDef="uploadedBy">
|
|
445
|
-
<th mat-header-cell *matHeaderCellDef class="header-cell">
|
|
446
|
-
Uploaded By
|
|
447
|
-
</th>
|
|
448
|
-
<td mat-cell *matCellDef="let element">{{ element.uploadedBy }}</td>
|
|
449
|
-
</ng-container>
|
|
450
|
-
|
|
451
|
-
<ng-container matColumnDef="uploadedAt">
|
|
452
|
-
<th mat-header-cell *matHeaderCellDef class="header-cell">
|
|
453
|
-
Uploaded Date
|
|
454
|
-
</th>
|
|
455
|
-
<td mat-cell *matCellDef="let element">
|
|
456
|
-
{{ element.uploadedAt | date : 'dd-MMM-yyyy, hh:mm:ss a' }}
|
|
457
|
-
</td>
|
|
458
|
-
</ng-container>
|
|
459
|
-
|
|
460
|
-
<ng-container matColumnDef="actions">
|
|
461
|
-
<th mat-header-cell *matHeaderCellDef class="header-cell">Actions</th>
|
|
462
|
-
<td mat-cell *matCellDef="let element; let i = index">
|
|
463
|
-
<div class="action-buttons">
|
|
464
|
-
<div
|
|
465
|
-
*ngFor="let action of field?.props?.['actions']"
|
|
466
|
-
class="actions-container"
|
|
467
|
-
>
|
|
468
|
-
<mat-icon
|
|
469
|
-
class="action-icons"
|
|
470
|
-
*ngIf="showUploadAction(action, element)"
|
|
471
|
-
matTooltip="{{ action.label | translate }}"
|
|
472
|
-
(click)="handleActionClick(action, i, element)"
|
|
473
|
-
>
|
|
474
|
-
{{ action.icon }}
|
|
475
|
-
</mat-icon>
|
|
476
|
-
</div>
|
|
477
|
-
</div>
|
|
478
|
-
</td>
|
|
479
|
-
</ng-container>
|
|
480
|
-
|
|
481
|
-
<tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
|
|
482
|
-
<tr mat-row *matRowDef="let row; columns: displayedColumns"></tr>
|
|
483
|
-
</table>
|
|
484
|
-
|
|
485
|
-
<div class="w-full">
|
|
486
|
-
<table
|
|
487
|
-
*ngIf="!this.props?.['isMultiFileUpload'] && uploadedFiles?.length"
|
|
488
|
-
class="w-full flex flex-col md:flex-row items-start md:items-center gap-2 md:gap-4"
|
|
489
|
-
>
|
|
490
|
-
<tr
|
|
491
|
-
class="flex flex-col md:flex-row items-start md:items-center gap-2 md:gap-4 w-full"
|
|
492
|
-
>
|
|
493
|
-
<td
|
|
494
|
-
class="text-sm truncate overflow-hidden whitespace-nowrap max-w-full flex-1 md:border-none"
|
|
495
|
-
[matTooltip]="uploadedFiles[0].fileName"
|
|
496
|
-
>
|
|
497
|
-
{{ uploadedFiles[0].fileName }}
|
|
498
|
-
</td>
|
|
499
|
-
<td class="flex items-center justify-end md:flex-shrink-0">
|
|
500
|
-
<div
|
|
501
|
-
*ngFor="let action of field?.props?.['actions']"
|
|
502
|
-
class="flex items-center"
|
|
503
|
-
>
|
|
504
|
-
<mat-icon
|
|
505
|
-
matTooltip="{{ action.label | translate }}"
|
|
506
|
-
*ngIf="showUploadAction(action, uploadedFiles[0])"
|
|
507
|
-
(click)="handleActionClick(action, 0, uploadedFiles[0])"
|
|
508
|
-
class="action-icons"
|
|
509
|
-
>
|
|
510
|
-
{{ action.icon }}
|
|
511
|
-
</mat-icon>
|
|
512
|
-
</div>
|
|
513
|
-
</td>
|
|
514
|
-
</tr>
|
|
515
|
-
</table>
|
|
516
|
-
</div>
|
|
517
|
-
<div
|
|
518
|
-
*ngIf="to['note']"
|
|
519
|
-
class="text-gray-500 mt-1 w-[900px]"
|
|
520
|
-
[innerHTML]="to['note']"
|
|
521
|
-
></div>
|
|
522
|
-
`, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".mat-mdc-table{margin-top:5px;box-shadow:none}.header-cell{background-color:#7876761f!important}.action-buttons{display:flex;flex-direction:row;justify-content:start;align-items:center}.action-icons{font-size:20px}.actions-container{display:flex;justify-content:center;align-items:center;height:43px;padding-top:5px}.input-btn button,.red-upload button{color:#fff;padding:3px 10px;border:none;cursor:pointer;border-radius:50px;font-family:Poppins,Helvetica Neue,sans-serif;font-weight:500;font-size:14px;display:flex;align-items:center;justify-content:center}.input-btn button:disabled,.red-upload button:disabled{background-color:#d3d3d3;color:#b0b0b0}th,td,.upload-btn{font-family:Poppins,Helvetica Neue,sans-serif}.red-upload button{background-color:red}\n"] }]
|
|
523
|
-
}], ctorParameters: () => [{ type: i1.MatSnackBar }, { type: i2.TranslateService }, { type: i3.BreakpointObserver }, { type: i0.ChangeDetectorRef }] });
|
|
524
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkLWZpbGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2Zvcm0vc3JjL2xpYi90eXBlcy91cGxvYWQtZmlsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXNCLFdBQVcsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekQsT0FBTyxFQUNMLHVCQUF1QixFQUV2QixTQUFTLEVBQ1QsVUFBVSxFQUNWLE1BQU0sR0FFUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEVBQWUsaUJBQWlCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM3RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDN0UsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsZUFBZSxFQUFvQixNQUFNLHFCQUFxQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7Ozs7Ozs7QUF1TmxDLE1BQU0sT0FBTyx5QkFDWCxTQUFRLFNBQWtDO0lBaUIxQyxZQUNVLFFBQXFCLEVBQ3JCLGdC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Qjs7NEZBaU1SLHlCQUF5QjtrQkEvTXJDLFNBQVM7K0JBQ0Usc0JBQXNCLGNBQ3BCLElBQUksV0FDUDt3QkFDUCxXQUFXO3dCQUNYLGtCQUFrQjt3QkFDbEIsY0FBYzt3QkFDZCxtQkFBbUI7d0JBQ25CLFlBQVk7d0JBQ1osWUFBWTt3QkFDWixjQUFjO3dCQUNkLGFBQWE7d0JBQ2IsZ0JBQWdCO3dCQUNoQixlQUFlO3dCQUNmLGlCQUFpQjt3QkFDakIsUUFBUTtxQkFDVCxZQUNTOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvSVQsbUJBd0RnQix1QkFBdUIsQ0FBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQnJlYWtwb2ludE9ic2VydmVyLCBCcmVha3BvaW50cyB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9sYXlvdXQnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlLCBEYXRlUGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRGVzdHJveVJlZixcbiAgaW5qZWN0LFxuICBPbkluaXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNYXRGb3JtRmllbGRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7IE1hdElucHV0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xuaW1wb3J0IHsgTWF0U25hY2tCYXIsIE1hdFNuYWNrQmFyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc25hY2stYmFyJztcbmltcG9ydCB7IE1hdFRhYmxlRGF0YVNvdXJjZSwgTWF0VGFibGVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJsZSc7XG5pbXBvcnQgeyBNYXRUb29sdGlwTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbHRpcCc7XG5pbXBvcnQgeyBGaWVsZFR5cGUsIEZvcm1seU1vZHVsZSB9IGZyb20gJ0BuZ3gtZm9ybWx5L2NvcmUnO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlLCBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1xuICBDdXN0b21Gb3JtbHlGaWVsZENvbmZpZyxcbiAgRmlsZUFjdGlvbixcbiAgTWF5YmVBc3luY0Jvb2wsXG59IGZyb20gJy4uL21vZGVscy9jdXN0b20tZm9ybS1maWVsZC5tb2RlbCc7XG5pbXBvcnQgeyBBY3Rpb24gfSBmcm9tICdyeGpzL2ludGVybmFsL3NjaGVkdWxlci9BY3Rpb24nO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdtdS1mb3JtbHktZmllbGQtZmlsZScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBNYXRGb3JtRmllbGRNb2R1bGUsXG4gICAgTWF0SW5wdXRNb2R1bGUsXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgICBGb3JtbHlNb2R1bGUsXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIE1hdFRhYmxlTW9kdWxlLFxuICAgIE1hdEljb25Nb2R1bGUsXG4gICAgTWF0VG9vbHRpcE1vZHVsZSxcbiAgICBUcmFuc2xhdGVNb2R1bGUsXG4gICAgTWF0U25hY2tCYXJNb2R1bGUsXG4gICAgRGF0ZVBpcGUsXG4gIF0sXG4gIHRlbXBsYXRlOiBgXG4gICAgQGlmKHNob3dVcGxvYWRidG4pIHtcbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cImlucHV0LWJ0blwiXG4gICAgICBbbmdDbGFzc109XCJ7ICdyZWQtdXBsb2FkJzogIWZpZWxkLmZvcm1Db250cm9sPy52YWxpZCB9XCJcbiAgICA+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBbZGlzYWJsZWRdPVwiZmllbGQucHJvcHM/LlsnZGlzYWJsZWQnXVwiXG4gICAgICAgIFtuZ0NsYXNzXT1cIltmaWVsZC5wcm9wcz8uWydjb2xvciddXVwiXG4gICAgICAgIChjbGljayk9XCJmaWxlSW5wdXQuY2xpY2soKVwiXG4gICAgICA+XG4gICAgICAgIDxtYXQtaWNvblxuICAgICAgICAgICpuZ0lmPVwiZmllbGQucHJvcHM/LlsnaWNvbiddXCJcbiAgICAgICAgICBjbGFzcz1cInRleHQtbGcgbWItMVwiXG4gICAgICAgICAgPnt7IGZpZWxkLnByb3BzPy5bJ2ljb24nXSB9fTwvbWF0LWljb25cbiAgICAgICAgPlxuICAgICAgICB7eyBmaWVsZC5wcm9wcz8ubGFiZWwgfX08c3BhbiAqbmdJZj1cInRvLnJlcXVpcmVkXCI+Kjwvc3Bhbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGlucHV0XG4gICAgICAgIHR5cGU9XCJmaWxlXCJcbiAgICAgICAgI2ZpbGVJbnB1dFxuICAgICAgICAoY2hhbmdlKT1cIm9uRmlsZVNlbGVjdCgkZXZlbnQpXCJcbiAgICAgICAgW2Zvcm1seUF0dHJpYnV0ZXNdPVwiZmllbGRcIlxuICAgICAgICBbbXVsdGlwbGVdPVwiZmllbGQucHJvcHM/LlsnaXNNdWx0aUZpbGVVcGxvYWQnXVwiXG4gICAgICAgIFthY2NlcHRdPVwiZmllbGQucHJvcHM/LlsnYWNjZXB0ZWRGaWxlVHlwZXMnXSB8fCAnLnBkZiwueGxzeCwuanBnLC5qcGVnLC5kb2N4J1wiXG4gICAgICAgIGNsYXNzPVwiaGlkZGVuXCJcbiAgICAgIC8+XG4gICAgICA8ZGl2IGNsYXNzPVwidGV4dC1bMC44M3JlbV0gdGV4dC1ncmF5LTUwMCBtdC0xXCI+XG4gICAgICAgIEFsbG93ZWQgZmlsZSB0eXBlczpcbiAgICAgICAge3sgZmllbGQucHJvcHM/LlsnYWNjZXB0ZWRGaWxlVHlwZXMnXSB8fCAnLnBkZiwgLnhsc3gsIC5qcGcsIGpwZWcsIC5kb2N4JyB9fVxuICAgICAgICA8YnIgLz5cbiAgICAgICAgTWF4aW11bSBmaWxlIHNpemU6IHt7IGZpZWxkLnByb3BzPy5bJ21heEZpbGVTaXplTUInXSB8fCAxIH19TUJcbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIH1cbiAgICA8dGFibGVcbiAgICAgIG1hdC10YWJsZVxuICAgICAgKm5nSWY9XCJ0aGlzLnByb3BzPy5bJ2lzTXVsdGlGaWxlVXBsb2FkJ10gJiYgdXBsb2FkZWRGaWxlcz8ubGVuZ3RoXCJcbiAgICAgIFtkYXRhU291cmNlXT1cImRhdGFTb3VyY2VcIlxuICAgICAgY2xhc3M9XCJtYXQtZWxldmF0aW9uLXo4XCJcbiAgICA+XG4gICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImZpbGVOYW1lXCI+XG4gICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgY2xhc3M9XCJoZWFkZXItY2VsbFwiPkZpbGUgTmFtZTwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+e3sgZWxlbWVudC5maWxlTmFtZSB9fTwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJjb252ZXJ0ZWRGaWxlU2l6ZVwiPlxuICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIGNsYXNzPVwiaGVhZGVyLWNlbGxcIj5TaXplPC90aD5cbiAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cbiAgICAgICAgICB7eyBlbGVtZW50LmNvbnZlcnRlZEZpbGVTaXplIH19XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJ1cGxvYWRlZEJ5XCI+XG4gICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgY2xhc3M9XCJoZWFkZXItY2VsbFwiPlxuICAgICAgICAgIFVwbG9hZGVkIEJ5XG4gICAgICAgIDwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+e3sgZWxlbWVudC51cGxvYWRlZEJ5IH19PC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInVwbG9hZGVkQXRcIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBjbGFzcz1cImhlYWRlci1jZWxsXCI+XG4gICAgICAgICAgVXBsb2FkZWQgRGF0ZVxuICAgICAgICA8L3RoPlxuICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPlxuICAgICAgICAgIHt7IGVsZW1lbnQudXBsb2FkZWRBdCB8IGRhdGUgOiAnZGQtTU1NLXl5eXksIGhoOm1tOnNzIGEnIH19XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJhY3Rpb25zXCI+XG4gICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgY2xhc3M9XCJoZWFkZXItY2VsbFwiPkFjdGlvbnM8L3RoPlxuICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudDsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb24tYnV0dG9uc1wiPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgYWN0aW9uIG9mIGZpZWxkPy5wcm9wcz8uWydhY3Rpb25zJ11cIlxuICAgICAgICAgICAgICBjbGFzcz1cImFjdGlvbnMtY29udGFpbmVyXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG1hdC1pY29uXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJhY3Rpb24taWNvbnNcIlxuICAgICAgICAgICAgICAgICpuZ0lmPVwic2hvd1VwbG9hZEFjdGlvbihhY3Rpb24sIGVsZW1lbnQpXCJcbiAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVwie3sgYWN0aW9uLmxhYmVsIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlQWN0aW9uQ2xpY2soYWN0aW9uLCBpLCBlbGVtZW50KVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7eyBhY3Rpb24uaWNvbiB9fVxuICAgICAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPHRyIG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJkaXNwbGF5ZWRDb2x1bW5zXCI+PC90cj5cbiAgICAgIDx0ciBtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBkaXNwbGF5ZWRDb2x1bW5zXCI+PC90cj5cbiAgICA8L3RhYmxlPlxuXG4gICAgPGRpdiBjbGFzcz1cInctZnVsbFwiPlxuICAgICAgPHRhYmxlXG4gICAgICAgICpuZ0lmPVwiIXRoaXMucHJvcHM/LlsnaXNNdWx0aUZpbGVVcGxvYWQnXSAmJiB1cGxvYWRlZEZpbGVzPy5sZW5ndGhcIlxuICAgICAgICBjbGFzcz1cInctZnVsbCBmbGV4IGZsZXgtY29sIG1kOmZsZXgtcm93IGl0ZW1zLXN0YXJ0IG1kOml0ZW1zLWNlbnRlciBnYXAtMiBtZDpnYXAtNFwiXG4gICAgICA+XG4gICAgICAgIDx0clxuICAgICAgICAgIGNsYXNzPVwiZmxleCBmbGV4LWNvbCBtZDpmbGV4LXJvdyBpdGVtcy1zdGFydCBtZDppdGVtcy1jZW50ZXIgZ2FwLTIgbWQ6Z2FwLTQgdy1mdWxsXCJcbiAgICAgICAgPlxuICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LXNtIHRydW5jYXRlIG92ZXJmbG93LWhpZGRlbiB3aGl0ZXNwYWNlLW5vd3JhcCBtYXgtdy1mdWxsIGZsZXgtMSBtZDpib3JkZXItbm9uZVwiXG4gICAgICAgICAgICBbbWF0VG9vbHRpcF09XCJ1cGxvYWRlZEZpbGVzWzBdLmZpbGVOYW1lXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyB1cGxvYWRlZEZpbGVzWzBdLmZpbGVOYW1lIH19XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgICA8dGQgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWVuZCBtZDpmbGV4LXNocmluay0wXCI+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBhY3Rpb24gb2YgZmllbGQ/LnByb3BzPy5bJ2FjdGlvbnMnXVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXJcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bWF0LWljb25cbiAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVwie3sgYWN0aW9uLmxhYmVsIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAqbmdJZj1cInNob3dVcGxvYWRBY3Rpb24oYWN0aW9uLCB1cGxvYWRlZEZpbGVzWzBdKVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImhhbmRsZUFjdGlvbkNsaWNrKGFjdGlvbiwgMCwgdXBsb2FkZWRGaWxlc1swXSlcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYWN0aW9uLWljb25zXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt7IGFjdGlvbi5pY29uIH19XG4gICAgICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L3RyPlxuICAgICAgPC90YWJsZT5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2XG4gICAgICAqbmdJZj1cInRvWydub3RlJ11cIlxuICAgICAgY2xhc3M9XCJ0ZXh0LWdyYXktNTAwIG10LTEgdy1bOTAwcHhdXCJcbiAgICAgIFtpbm5lckhUTUxdPVwidG9bJ25vdGUnXVwiXG4gICAgPjwvZGl2PlxuICBgLFxuICBzdHlsZXM6IFtcbiAgICBgXG4gICAgICAubWF0LW1kYy10YWJsZSB7XG4gICAgICAgIG1hcmdpbi10b3A6IDVweDtcbiAgICAgICAgYm94LXNoYWRvdzogbm9uZTtcbiAgICAgIH1cbiAgICAgIC5oZWFkZXItY2VsbCB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHJnYigxMjAgMTE4IDExOCAvIDEyJSkgIWltcG9ydGFudDtcbiAgICAgIH1cbiAgICAgIC5hY3Rpb24tYnV0dG9ucyB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgICAgIGp1c3RpZnktY29udGVudDogc3RhcnQ7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICB9XG4gICAgICAuYWN0aW9uLWljb25zIHtcbiAgICAgICAgZm9udC1zaXplOiAyMHB4O1xuICAgICAgfVxuICAgICAgLmFjdGlvbnMtY29udGFpbmVyIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIGhlaWdodDogNDNweDtcbiAgICAgICAgcGFkZGluZy10b3A6IDVweDtcbiAgICAgIH1cblxuICAgICAgLmlucHV0LWJ0biBidXR0b24sXG4gICAgICAucmVkLXVwbG9hZCBidXR0b24ge1xuICAgICAgICBjb2xvcjogd2hpdGU7XG4gICAgICAgIHBhZGRpbmc6IDNweCAxMHB4O1xuICAgICAgICBib3JkZXI6IG5vbmU7XG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogNTBweDtcbiAgICAgICAgZm9udC1mYW1pbHk6IFBvcHBpbnMsICdIZWx2ZXRpY2EgTmV1ZScsIHNhbnMtc2VyaWY7XG4gICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG4gICAgICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICB9XG4gICAgICAuaW5wdXQtYnRuIGJ1dHRvbjpkaXNhYmxlZCxcbiAgICAgIC5yZWQtdXBsb2FkIGJ1dHRvbjpkaXNhYmxlZCB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNkM2QzZDM7XG4gICAgICAgIGNvbG9yOiAjYjBiMGIwO1xuICAgICAgfVxuICAgICAgdGgsXG4gICAgICB0ZCxcbiAgICAgIC51cGxvYWQtYnRuIHtcbiAgICAgICAgZm9udC1mYW1pbHk6IFBvcHBpbnMsICdIZWx2ZXRpY2EgTmV1ZScsIHNhbnMtc2VyaWY7XG4gICAgICB9XG4gICAgICAucmVkLXVwbG9hZCBidXR0b24ge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZWQ7XG4gICAgICB9XG4gICAgYCxcbiAgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIEZvcm1seUZpbGVVcGxvYWRDb21wb25lbnRcbiAgZXh0ZW5kcyBGaWVsZFR5cGU8Q3VzdG9tRm9ybWx5RmllbGRDb25maWc+XG4gIGltcGxlbWVudHMgT25Jbml0XG57XG4gIHVwbG9hZGVkRmlsZXM6IGFueVtdID0gW107XG4gIGRpc3BsYXllZENvbHVtbnM6IHN0cmluZ1tdID0gW1xuICAgICdmaWxlTmFtZScsXG4gICAgJ2NvbnZlcnRlZEZpbGVTaXplJyxcbiAgICAndXBsb2FkZWRCeScsXG4gICAgJ3VwbG9hZGVkQXQnLFxuICAgICdhY3Rpb25zJyxcbiAgXTtcbiAgZGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2UoKTtcbiAgc2hvd1VwbG9hZGJ0biA9IHRydWU7XG4gIGxvZ2dlZEluVXNlckRldGFpbHMhOiBhbnk7XG4gIGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG4gIGlzTW9iaWxlRGV2aWNlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBzbmFja0JhcjogTWF0U25hY2tCYXIsXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgYnJlYWtwb2ludE9ic2VydmVyOiBCcmVha3BvaW50T2JzZXJ2ZXIsXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5icmVha3BvaW50T2JzZXJ2ZXJcbiAgICAgID8ub2JzZXJ2ZShbQnJlYWtwb2ludHMuSGFuZHNldF0pXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xuICAgICAgICB0aGlzLmlzTW9iaWxlRGV2aWNlID0gcmVzdWx0Py5tYXRjaGVzO1xuICAgICAgfSk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBjb25zdCB1c2VyRGV0YWlscyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdsb2dnZWRJblVzZXJEZXRhaWxzJyk7XG4gICAgdGhpcy5sb2dnZWRJblVzZXJEZXRhaWxzID0gdXNlckRldGFpbHNcbiAgICAgID8gSlNPTi5wYXJzZSh1c2VyRGV0YWlscylcbiAgICAgIDogeyBlbWFpbDogJycgfTtcblxuICAgIGlmICh0aGlzLmZpZWxkLnByb3BzPy5bJ2lzTXVsdGlGaWxlVXBsb2FkJ10gJiYgdGhpcy5mb3JtQ29udHJvbC52YWx1ZSkge1xuICAgICAgdGhpcy51cGxvYWRlZEZpbGVzID0gdGhpcy5mb3JtQ29udHJvbC52YWx1ZSA/PyBbXTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzLmZvcm1Db250cm9sLnZhbHVlICYmXG4gICAgICAgIE9iamVjdC5rZXlzKHRoaXMuZm9ybUNvbnRyb2wudmFsdWUgfHwge30pLmxlbmd0aFxuICAgICAgKSB7XG4gICAgICAgIHRoaXMudXBsb2FkZWRGaWxlcyA9IFt0aGlzLmZvcm1Db250cm9sLnZhbHVlXTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5kYXRhU291cmNlLmRhdGEgPSBbLi4udGhpcy51cGxvYWRlZEZpbGVzXTtcbiAgICB0aGlzLnNob3dVcGxvYWRidG4gPSB0aGlzLnByb3BzPy5bJ2lzTXVsdGlGaWxlVXBsb2FkJ11cbiAgICAgID8gdHJ1ZVxuICAgICAgOiAhdGhpcy51cGxvYWRlZEZpbGVzLmxlbmd0aDtcbiAgfVxuXG4gIG9uRmlsZVNlbGVjdChldmVudDogYW55KTogdm9pZCB7XG4gICAgY29uc3Qgc2VsZWN0ZWRGaWxlID0gZXZlbnQudGFyZ2V0LmZpbGVzO1xuICAgIGlmICghc2VsZWN0ZWRGaWxlIHx8ICFzZWxlY3RlZEZpbGUubGVuZ3RoKSByZXR1cm47XG5cbiAgICBjb25zdCBtYXhGaWxlU2l6ZU1CID0gdGhpcy5maWVsZC5wcm9wcz8uWydtYXhGaWxlU2l6ZU1CJ10gfHwgMTtcbiAgICBjb25zdCBtYXhGaWxlU2l6ZSA9IG1heEZpbGVTaXplTUIgKiAxMDI0ICogMTAyNDtcblxuICAgIGlmICh0aGlzLnByb3BzPy5bJ2lzTXVsdGlGaWxlVXBsb2FkJ10pIHtcbiAgICAgIGlmICh0aGlzLmlzRmlsZUFscmVhZHlVcGxvYWRlZChldmVudC50YXJnZXQuZmlsZXMpKSB7XG4gICAgICAgIHRoaXMuc25hY2tCYXIub3BlbihcbiAgICAgICAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnTU5MX1VQTE9BRF9GSUxFLkRVUExJQ0FURV9VUExPQURFRCcpLFxuICAgICAgICAgICdPaycsXG4gICAgICAgICAge1xuICAgICAgICAgICAgZHVyYXRpb246IDMwMDAsXG4gICAgICAgICAgICBwYW5lbENsYXNzOiBbJ3dhcm4tc25hY2tiYXInXSxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICAgIHRoaXMucmVzZXRGaWxlSW5wdXQoZXZlbnQudGFyZ2V0KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHNlbGVjdGVkRmlsZXMgPSBBcnJheS5mcm9tKHNlbGVjdGVkRmlsZSk7XG4gICAgY29uc3QgaW52YWxpZENoYXJzID0gL1smLFwiXS87XG5cbiAgICBjb25zdCBmaWxlc1RvUHJvY2VzcyA9IHRoaXMuZmllbGQucHJvcHM/LlsnaXNNdWx0aUZpbGVVcGxvYWQnXVxuICAgICAgPyBzZWxlY3RlZEZpbGVzXG4gICAgICA6IFtzZWxlY3RlZEZpbGVzWzBdXTtcblxuICAgIGZpbGVzVG9Qcm9jZXNzLmZvckVhY2goKGZpbGU6IGFueSkgPT4ge1xuICAgICAgaWYgKGZpbGUuc2l6ZSA+IG1heEZpbGVTaXplKSB7XG4gICAgICAgIHRoaXMuc25hY2tCYXIub3BlbihcbiAgICAgICAgICBgVGhlIGZpbGUgXCIke2ZpbGUubmFtZX1cIiBleGNlZWRzIHRoZSAke21heEZpbGVTaXplTUJ9IE1CIHNpemUgbGltaXQuYCxcbiAgICAgICAgICAnT0snLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGR1cmF0aW9uOiAzMDAwLFxuICAgICAgICAgICAgcGFuZWxDbGFzczogWyd3YXJuLXNuYWNrYmFyJ10sXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmIChpbnZhbGlkQ2hhcnMudGVzdChmaWxlLm5hbWUpKSB7XG4gICAgICAgIHRoaXMuc25hY2tCYXIub3BlbignTU5MX1VQTE9BRF9GSUxFLklOVkFMSURfQ0hBUlNfRklMRV9OQU1FJywgJ09rJywge1xuICAgICAgICAgIGR1cmF0aW9uOiA3MDAwLFxuICAgICAgICAgIHBhbmVsQ2xhc3M6IFsnZXJyb3Itc25hY2tiYXInXSxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBuZXdGaWxlID0ge1xuICAgICAgICAgIGZpbGVOYW1lOiBmaWxlLm5hbWUsXG4gICAgICAgICAgZmlsZVNpemU6IGZpbGUuc2l6ZSxcbiAgICAgICAgICBmaWxlVHlwZTogZmlsZS50eXBlLFxuICAgICAgICAgIGZpbGU6IGZpbGUsXG4gICAgICAgICAgdXBsb2FkZWRCeTogdGhpcy5sb2dnZWRJblVzZXJEZXRhaWxzLmVtYWlsLFxuICAgICAgICAgIHVwbG9hZGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgbm9kZUlkOiAnJyxcbiAgICAgICAgICBjb252ZXJ0ZWRGaWxlU2l6ZTogdGhpcy5mb3JtYXRGaWxlU2l6ZShmaWxlLnNpemUpLFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmICghdGhpcy5wcm9wcz8uWydpc011bHRpRmlsZVVwbG9hZCddKSB7XG4gICAgICAgICAgdGhpcy51cGxvYWRlZEZpbGVzID0gW25ld0ZpbGVdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMudXBsb2FkZWRGaWxlcy5wdXNoKG5ld0ZpbGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YSA9IFsuLi50aGlzLnVwbG9hZGVkRmlsZXNdO1xuXG4gICAgdGhpcy5yZXNldEZpbGVJbnB1dChldmVudC50YXJnZXQpO1xuICAgIHRoaXMuc2hvd1VwbG9hZGJ0biA9IHRoaXMucHJvcHM/LlsnaXNNdWx0aUZpbGVVcGxvYWQnXVxuICAgICAgPyB0cnVlXG4gICAgICA6ICF0aGlzLnVwbG9hZGVkRmlsZXMubGVuZ3RoO1xuXG4gICAgaWYgKHRoaXMuZmllbGQucHJvcHM/Llsnb25GaWxlc0FkZGVkJ10pIHtcbiAgICAgIHRoaXMuZmllbGQucHJvcHNbJ29uRmlsZXNBZGRlZCddKHRoaXMudXBsb2FkZWRGaWxlcyk7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlQWN0aW9uQ2xpY2soYWN0aW9uOiBGaWxlQWN0aW9uLCBpbmRleDogbnVtYmVyLCBlbGVtZW50OiBhbnkpIHtcbiAgICBjb25zdCBvblVwbG9hZEZpbGVBY3Rpb24gPSB0aGlzLmZpZWxkLnByb3BzPy5bJ29uVXBsb2FkRmlsZUFjdGlvbiddO1xuICAgIGlmICh0eXBlb2Ygb25VcGxvYWRGaWxlQWN0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBvblVwbG9hZEZpbGVBY3Rpb24oYWN0aW9uLmljb24sIGVsZW1lbnQsIGluZGV4KTtcbiAgICAgIHRoaXMuaW52b2tlQWN0aW9uKFxuICAgICAgICAoKSA9PiByZXN1bHQsXG4gICAgICAgIGVsZW1lbnQsXG4gICAgICAgIGluZGV4LFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgaWYgKGFjdGlvbi5pY29uID09PSAnZGVsZXRlJykgdGhpcy5yZW1vdmVGaWxlKGluZGV4KTtcbiAgICAgICAgICBpZiAoYWN0aW9uLmljb24gPT09ICdjbG91ZF91cGxvYWQnKVxuICAgICAgICAgICAgdGhpcy5yZWZyZXNoVXBsb2FkZWRUYWJsZShlbGVtZW50LCBpbmRleCk7XG4gICAgICAgICAgaWYgKGFjdGlvbi5pY29uID09PSAnY2xvdWRfZG93bmxvYWQnIHx8IGFjdGlvbi5pY29uID09PSAndmlzaWJpbGl0eScpXG4gICAgICAgICAgICAoKSA9PiB7fTtcbiAgICAgICAgfSxcbiAgICAgICAgYWN0aW9uLmljb25cbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcmVmcmVzaFVwbG9hZGVkVGFibGUoZWxlbWVudDogYW55LCBpbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy51cGxvYWRlZEZpbGVzW2luZGV4XSA9IGVsZW1lbnQ7XG4gICAgaWYgKHRoaXMucHJvcHM/LlsnaXNNdWx0aUZpbGVVcGxvYWQnXSkge1xuICAgICAgY29uc3QgdXBsb2FkZWQgPSB0aGlzLnVwbG9hZGVkRmlsZXMuZmlsdGVyKChmKSA9PiAhIWYubm9kZUlkKTtcbiAgICAgIHRoaXMuZm9ybUNvbnRyb2wuc2V0VmFsdWUodXBsb2FkZWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZvcm1Db250cm9sLnNldFZhbHVlKHRoaXMudXBsb2FkZWRGaWxlc1swXSk7XG4gICAgfVxuXG4gICAgdGhpcy5mb3JtQ29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XG4gICAgdGhpcy5mb3JtLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YSA9IFsuLi50aGlzLnVwbG9hZGVkRmlsZXNdO1xuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIHJlbW92ZUZpbGUoaW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMudXBsb2FkZWRGaWxlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIHRoaXMuZGF0YVNvdXJjZS5kYXRhID0gWy4uLnRoaXMudXBsb2FkZWRGaWxlc107XG5cbiAgICBpZiAoIXRoaXMuZmllbGQucHJvcHM/LlsnaXNNdWx0aUZpbGVVcGxvYWQnXSkge1xuICAgICAgdGhpcy5mb3JtQ29udHJvbC5zZXRWYWx1ZShudWxsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5mb3JtQ29udHJvbC5zZXRWYWx1ZSh0aGlzLnVwbG9hZGVkRmlsZXMpO1xuICAgICAgY29uc3QgdXBsb2FkZWQgPSB0aGlzLnVwbG9hZGVkRmlsZXMuZmlsdGVyKChmKSA9PiAhIWYubm9kZUlkKTtcbiAgICAgIHRoaXMuZm9ybUNvbnRyb2wuc2V0VmFsdWUodXBsb2FkZWQpO1xuICAgIH1cbiAgICB0aGlzLnNob3dVcGxvYWRidG4gPSB0aGlzLnByb3BzPy5bJ2lzTXVsdGlGaWxlVXBsb2FkJ11cbiAgICAgID8gdHJ1ZVxuICAgICAgOiAhdGhpcy51cGxvYWRlZEZpbGVzLmxlbmd0aDtcbiAgfVxuXG4gIGlzRmlsZUFscmVhZHlVcGxvYWRlZChzZWxlY3RlZEZpbGU6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnVwbG9hZGVkRmlsZXMuc29tZShcbiAgICAgIChmaWxlKSA9PiBmaWxlLmZpbGVOYW1lID09PSBzZWxlY3RlZEZpbGVbMF0ubmFtZVxuICAgICk7XG4gIH1cblxuICByZXNldEZpbGVJbnB1dChmaWxlSW5wdXQ6IGFueSk6IHZvaWQge1xuICAgIGZpbGVJbnB1dC52YWx1ZSA9ICcnO1xuICB9XG5cbiAgc2hvd1VwbG9hZEFjdGlvbihhY3Rpb246IGFueSwgZmlsZTogYW55KTogYm9vbGVhbiB7XG4gICAgY29uc3QgaGFzTm9kZSA9ICEhZmlsZS5ub2RlSWQ7XG4gICAgY29uc3QgdXNlclJvbGVzID0gdGhpcy5vcHRpb25zLmZvcm1TdGF0ZT8udXNlclJvbGVzID8/IFtdO1xuICAgIGNvbnN0IGVuYWJsZWRSb2xlcyA9IHRoaXMuZmllbGQ/LmVuYWJsZWRGb3JSb2xlcyA/PyBbXTtcblxuICAgIHN3aXRjaCAoYWN0aW9uLmljb24pIHtcbiAgICAgIGNhc2UgJ2Nsb3VkX3VwbG9hZCc6XG4gICAgICAgIHJldHVybiAhaGFzTm9kZTtcblxuICAgICAgY2FzZSAnY2xvdWRfZG93bmxvYWQnOlxuICAgICAgY2FzZSAndmlzaWJpbGl0eSc6XG4gICAgICAgIHJldHVybiBoYXNOb2RlO1xuXG4gICAgICBjYXNlICdkZWxldGUnOlxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIGhhc05vZGUgJiYgdXNlclJvbGVzLnNvbWUoKHJvbGU6IGFueSkgPT4gZW5hYmxlZFJvbGVzLmluY2x1ZGVzKHJvbGUpKVxuICAgICAgICApO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgZm9ybWF0RmlsZVNpemUoYnl0ZXM6IG51bWJlcik6IHN0cmluZyB7XG4gICAgaWYgKGJ5dGVzIDwgMTAyNCkgcmV0dXJuIGJ5dGVzICsgJyBCJztcbiAgICBpZiAoYnl0ZXMgPCAxMDQ4NTc2KSByZXR1cm4gKGJ5dGVzIC8gMTAyNCkudG9GaXhlZCgyKSArICcgS0InO1xuICAgIHJldHVybiAoYnl0ZXMgLyAxMDQ4NTc2KS50b0ZpeGVkKDIpICsgJyBNQic7XG4gIH1cblxuICBwcml2YXRlIGludm9rZUFjdGlvbihcbiAgICBhY3Rpb25DYWxsYmFjazpcbiAgICAgIHwgdW5kZWZpbmVkXG4gICAgICB8ICgoZWxlbWVudDogYW55LCBpbmRleDogbnVtYmVyKSA9PiBNYXliZUFzeW5jQm9vbCksXG4gICAgZWxlbWVudDogYW55LFxuICAgIGluZGV4OiBudW1iZXIsXG4gICAgZGVmYXVsdEZuOiAoKSA9PiB2b2lkLFxuICAgIGljb24/OiBzdHJpbmdcbiAgKTogdm9pZCB7XG4gICAgaWYgKCFhY3Rpb25DYWxsYmFjaykge1xuICAgICAgZGVmYXVsdEZuKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYWN0aW9uQ2FsbGJhY2soZWxlbWVudCwgaW5kZXgpO1xuXG4gICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIE9ic2VydmFibGUpIHtcbiAgICAgIChyZXN1bHQgYXMgT2JzZXJ2YWJsZTxib29sZWFuPikuc3Vic2NyaWJlKChzaG91bGRQcm9jZWVkKSA9PiB7XG4gICAgICAgIGlmIChzaG91bGRQcm9jZWVkKSB7XG4gICAgICAgICAgdGhpcy5zdWNjZXNzTWVzc2FnZShpY29uKTtcbiAgICAgICAgICBkZWZhdWx0Rm4oKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIFByb21pc2UucmVzb2x2ZShyZXN1bHQgYXMgYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj4pLnRoZW4oXG4gICAgICAgIChzaG91bGRQcm9jZWVkKSA9PiB7XG4gICAgICAgICAgaWYgKHNob3VsZFByb2NlZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc3VjY2Vzc01lc3NhZ2UoaWNvbik7XG4gICAgICAgICAgICBkZWZhdWx0Rm4oKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgc3VjY2Vzc01lc3NhZ2UoaWNvbjogc3RyaW5nKSB7XG4gICAgaWYgKGljb24gPT09ICdjbG91ZF91cGxvYWQnKSB7XG4gICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oXG4gICAgICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KFxuICAgICAgICAgICdNTkxfVVBMT0FEX0ZJTEUuRklMRV9TVUNDRVNTRlVMX1VQTE9BREVEJ1xuICAgICAgICApLFxuICAgICAgICAnT2snLFxuICAgICAgICB7XG4gICAgICAgICAgZHVyYXRpb246IDUwMDAsXG4gICAgICAgICAgcGFuZWxDbGFzczogWydzdWNjZXNzLXNuYWNrYmFyJ10sXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChpY29uID09PSAnZGVsZXRlJykge1xuICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKFxuICAgICAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChcbiAgICAgICAgICAnTU5MX1VQTE9BRF9GSUxFLkZJTEVfU1VDQ0VTU0ZVTF9ERUxFVEVEJ1xuICAgICAgICApLFxuICAgICAgICAnT2snLFxuICAgICAgICB7XG4gICAgICAgICAgZHVyYXRpb246IDUwMDAsXG4gICAgICAgICAgcGFuZWxDbGFzczogWydzdWNjZXNzLXNuYWNrYmFyJ10sXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfVxuICB9XG59XG4iXX0=
|