@sunbird-cb/cbp-ai 0.1.74 → 0.1.75

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.
Files changed (36) hide show
  1. package/esm2022/lib/components/delete-role-mapping-popup/delete-role-mapping-popup.component.mjs +25 -3
  2. package/esm2022/lib/components/gap-analysis-recommended-course/gap-analysis-recommended-course.component.mjs +2 -2
  3. package/esm2022/lib/components/generate-course-recommendation/generate-course-recommendation.component.mjs +92 -34
  4. package/esm2022/lib/components/publish-request-form/publish-approve-request-form.component.mjs +14 -4
  5. package/esm2022/lib/components/reject-request-form/reject-request-form.component.mjs +10 -6
  6. package/esm2022/lib/components/review-request/review-request.component.mjs +2 -2
  7. package/esm2022/lib/components/role-mapping-generation/role-mapping-generation.component.mjs +29 -5
  8. package/esm2022/lib/components/suggest-more-courses/suggest-more-courses.component.mjs +299 -45
  9. package/esm2022/lib/components/update-designation-hierarchy/update-designation-hierarchy.component.mjs +5 -4
  10. package/esm2022/lib/modules/shared/services/shared.service.mjs +9 -2
  11. package/esm2022/lib/modules/upload-document-page/upload-dialog/upload-dialog.component.mjs +31 -16
  12. package/esm2022/lib/modules/upload-document-page/upload-document-page.component.mjs +13 -7
  13. package/fesm2022/sunbird-cb-cbp-ai.mjs +545 -154
  14. package/fesm2022/sunbird-cb-cbp-ai.mjs.map +1 -1
  15. package/lib/components/delete-role-mapping-popup/delete-role-mapping-popup.component.d.ts +3 -0
  16. package/lib/components/delete-role-mapping-popup/delete-role-mapping-popup.component.d.ts.map +1 -1
  17. package/lib/components/generate-course-recommendation/generate-course-recommendation.component.d.ts +2 -0
  18. package/lib/components/generate-course-recommendation/generate-course-recommendation.component.d.ts.map +1 -1
  19. package/lib/components/publish-request-form/publish-approve-request-form.component.d.ts +2 -0
  20. package/lib/components/publish-request-form/publish-approve-request-form.component.d.ts.map +1 -1
  21. package/lib/components/reject-request-form/reject-request-form.component.d.ts +1 -0
  22. package/lib/components/reject-request-form/reject-request-form.component.d.ts.map +1 -1
  23. package/lib/components/role-mapping-generation/role-mapping-generation.component.d.ts +2 -0
  24. package/lib/components/role-mapping-generation/role-mapping-generation.component.d.ts.map +1 -1
  25. package/lib/components/suggest-more-courses/suggest-more-courses.component.d.ts +34 -3
  26. package/lib/components/suggest-more-courses/suggest-more-courses.component.d.ts.map +1 -1
  27. package/lib/components/update-designation-hierarchy/update-designation-hierarchy.component.d.ts.map +1 -1
  28. package/lib/modules/shared/services/shared.service.d.ts +1 -0
  29. package/lib/modules/shared/services/shared.service.d.ts.map +1 -1
  30. package/lib/modules/upload-document-page/upload-dialog/upload-dialog.component.d.ts +1 -0
  31. package/lib/modules/upload-document-page/upload-dialog/upload-dialog.component.d.ts.map +1 -1
  32. package/lib/modules/upload-document-page/upload-document-page.component.d.ts +4 -1
  33. package/lib/modules/upload-document-page/upload-document-page.component.d.ts.map +1 -1
  34. package/package.json +1 -1
  35. package/sunbird-cb-cbp-ai-0.1.75.tgz +0 -0
  36. package/sunbird-cb-cbp-ai-0.1.74.tgz +0 -0
@@ -7,10 +7,14 @@ import * as i1 from "@angular/material/dialog";
7
7
  import * as i2 from "../../shared/services/shared.service";
8
8
  import * as i3 from "@angular/material/snack-bar";
9
9
  import * as i4 from "@angular/common";
10
- import * as i5 from "@angular/material/legacy-button";
11
- import * as i6 from "@angular/material/icon";
12
- import * as i7 from "@angular/material/progress-spinner";
13
- import * as i8 from "@angular/material/tooltip";
10
+ import * as i5 from "@angular/forms";
11
+ import * as i6 from "@angular/material/legacy-form-field";
12
+ import * as i7 from "@angular/material/legacy-button";
13
+ import * as i8 from "@angular/material/icon";
14
+ import * as i9 from "@angular/material/legacy-select";
15
+ import * as i10 from "@angular/material/legacy-core";
16
+ import * as i11 from "@angular/material/progress-spinner";
17
+ import * as i12 from "@angular/material/tooltip";
14
18
  export class UploadDialogComponent {
15
19
  constructor(dialogRef, sharedService, snackBar, dialog) {
16
20
  this.dialogRef = dialogRef;
@@ -23,6 +27,7 @@ export class UploadDialogComponent {
23
27
  this.cbpFinalObj = {};
24
28
  this.loading = false;
25
29
  this.uploadedFileData = {};
30
+ this.selectedDocumentType = '';
26
31
  this.cbpFinalObj = this.sharedService.getCBPPlanLocalStorage();
27
32
  }
28
33
  /** Already uploaded files count */
@@ -120,21 +125,31 @@ export class UploadDialogComponent {
120
125
  const formData = new FormData();
121
126
  // Required fields
122
127
  formData.append('state_center_id', this.cbpFinalObj?.ministry?.identifier || '');
123
- formData.append('department_id', this.cbpFinalObj?.departments || '');
128
+ if (this.cbpFinalObj?.departments && typeof this.cbpFinalObj?.departments === 'string') {
129
+ formData.append('department_id', this.cbpFinalObj?.departments || '');
130
+ }
131
+ formData.append('document_type', this.selectedDocumentType || '');
124
132
  // Append multiple files with SAME key "files"
125
133
  this.selectedFiles.forEach((file) => {
126
134
  formData.append('files', file, file.name);
127
135
  });
128
136
  this.loading = true;
137
+ console.log('formData--', formData);
129
138
  this.sharedService.uploadDocument(formData).subscribe({
130
139
  next: (res) => {
131
- this.loading = false;
132
- this.uploadedFileData = res;
133
- this.triggerFileSummary();
134
- this.snackBar.open(res?.message, 'X', {
135
- duration: 3000,
136
- panelClass: ['snackbar-success']
137
- });
140
+ if (res && res.status === 'complete') {
141
+ this.loading = false;
142
+ this.uploadedFileData = res;
143
+ this.triggerFileSummary();
144
+ this.snackBar.open(res?.message, 'X', {
145
+ duration: 3000,
146
+ panelClass: ['snackbar-success']
147
+ });
148
+ }
149
+ else {
150
+ this.loading = false;
151
+ this.snackBar.open(res?.message || 'Upload failed', 'X', { duration: 3000, panelClass: ['snackbar-error'] });
152
+ }
138
153
  },
139
154
  error: (error) => {
140
155
  this.loading = false;
@@ -152,7 +167,7 @@ export class UploadDialogComponent {
152
167
  data: { progress: 0, message: `Processing 0 of ${totalFiles} summaries...` }
153
168
  });
154
169
  let completedFiles = 0;
155
- const pollingRequests = files.map(file => interval(5000).pipe(startWith(0), // trigger immediately
170
+ const pollingRequests = files.map((file) => interval(5000).pipe(startWith(0), // trigger immediately
156
171
  switchMap(() => this.sharedService.triggerFileSummary(file.file_id)), // must return { summary_status }
157
172
  tap((res) => {
158
173
  if (res.summary_status === 'COMPLETED') {
@@ -177,10 +192,10 @@ export class UploadDialogComponent {
177
192
  });
178
193
  }
179
194
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: UploadDialogComponent, deps: [{ token: i1.MatDialogRef }, { token: i2.SharedService }, { token: i3.MatSnackBar }, { token: i1.MatDialog }], target: i0.ɵɵFactoryTarget.Component }); }
180
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: UploadDialogComponent, selector: "app-upload-dialog", ngImport: i0, template: "<h2 mat-dialog-title>Upload Document</h2>\n\n<mat-dialog-content>\n\n <!-- <mat-form-field appearance=\"fill\" style=\"width: 100%; border: 1px solid #000;\">\n <input\n matInput\n [(ngModel)]=\"documentName\"\n placeholder=\"Document Name\"\n [disabled]=\"totalFileCount >= MAX_FILES\"\n >\n </mat-form-field> -->\n\n <!-- Upload Box -->\n <div\n class=\"file-upload-box\"\n style=\"margin-top: 30px;\"\n [class.disabled]=\"totalFileCount >= MAX_FILES\"\n (click)=\"totalFileCount < MAX_FILES && fileInput.click()\"\n >\n <input\n type=\"file\"\n #fileInput\n hidden\n multiple\n accept=\".pdf,.doc,.docx\"\n (change)=\"onFileSelected($event)\"\n >\n\n <p *ngIf=\"totalFileCount < MAX_FILES\">\n Click to select files\n </p>\n\n <p *ngIf=\"totalFileCount >= MAX_FILES\" class=\"error-text\">\n Maximum 10 documents allowed\n </p>\n\n <p><strong>Note:</strong> <small>PDF Files Only (Max:25 MB)</small></p>\n </div>\n\n <!-- Selected Files List -->\n <div *ngIf=\"selectedFiles.length > 0\" class=\"file-list\" style=\"margin-top:10px\">\n <p><strong>Selected Files</strong></p>\n\n <div class=\"file-item\" *ngFor=\"let file of selectedFiles; let i = index\">\n <span>{{ file.name }}</span>\n <span (click)=\"removeFile(i)\">\n <mat-icon class=\"file-cross-icon\" matTooltip=\"Remove\" matTooltipPosition=\"above\">close</mat-icon>\n </span>\n </div>\n </div>\n\n</mat-dialog-content>\n\n<div class=\"disclaimer-text\">\n <p>Disclaimer: Please do not upload any confidential documents.</p>\n</div>\n\n<mat-dialog-actions align=\"center\" style=\"margin: 20px 0;\">\n <button mat-button mat-dialog-close>Cancel</button>\n\n <button class=\"primary-btn cursor-pointer\"\n mat-raised-button\n color=\"primary\"\n (click)=\"upload()\"\n [disabled]=\"selectedFiles.length === 0\"\n >\n Upload\n </button>\n</mat-dialog-actions>\n\n<div class=\"overlay-loader\" *ngIf=\"loading\">\n <mat-spinner diameter=\"50\"></mat-spinner>\n</div>\n", styles: [".file-upload-box{border:2px dashed #ccc;padding:20px;text-align:center;cursor:pointer;margin-top:10px}.primary-btn{background-color:#1b4ca1;color:#fff}.disclaimer-text p{font-size:16px;font-family:Lato;font-weight:400;margin-left:24px}.file-cross-icon{height:24px;width:24px;vertical-align:middle;background:#d3d3d3;margin-left:10px;border-radius:25px}:host .mat-mdc-dialog-content{max-height:100vh!important}.cursor-pointer{cursor:pointer}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.MatLegacyButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i1.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "component", type: i7.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "directive", type: i8.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }] }); }
195
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: UploadDialogComponent, selector: "app-upload-dialog", ngImport: i0, template: "<h2 mat-dialog-title style=\"color:#000;font-weight: 600;\">Upload Document</h2>\n\n<mat-dialog-content>\n\n <!-- <mat-form-field appearance=\"fill\" style=\"width: 100%; border: 1px solid #000;\">\n <input\n matInput\n [(ngModel)]=\"documentName\"\n placeholder=\"Document Name\"\n [disabled]=\"totalFileCount >= MAX_FILES\"\n >\n </mat-form-field> -->\n\n <!-- Upload Box -->\n <!-- Document Type Select -->\n <label class=\"document-type-label\" style=\"color:#000;margin-top: 10px;\"><strong>Document Type</strong>&nbsp;<span class=\"error\">*</span></label>\n <mat-form-field appearance=\"outline\" class=\"document-select\">\n\n\n <mat-label>\n {{ selectedDocumentType ? '' : 'Select Document Type' }}\n </mat-label>\n\n\n <mat-select [(ngModel)]=\"selectedDocumentType\" required>\n\n <mat-option value=\"Work Allocation Order\">\n Work Allocation Order\n </mat-option>\n\n <mat-option value=\"Annual Reports\">\n Annual Reports\n </mat-option>\n\n <mat-option value=\"Other Document\">\n Other Document\n </mat-option>\n\n </mat-select>\n\n <mat-error *ngIf=\"!selectedDocumentType\" style=\"margin-top: 16px;color:#ff0000;\">\n Document type is required\n </mat-error>\n\n </mat-form-field>\n\n <div class=\"file-upload-box\" style=\"margin-top: 30px;\" [class.disabled]=\"totalFileCount >= MAX_FILES\"\n (click)=\"totalFileCount < MAX_FILES && fileInput.click()\">\n <input type=\"file\" #fileInput hidden multiple accept=\".pdf,.doc,.docx\" (change)=\"onFileSelected($event)\">\n\n <p *ngIf=\"totalFileCount < MAX_FILES\">\n Click to select files or drag and drop\n </p>\n\n <p *ngIf=\"totalFileCount >= MAX_FILES\" class=\"error-text\">\n Maximum 10 documents allowed\n </p>\n\n <p><strong>Note:</strong> PDF Files Only. Maximum file size:<strong>25 MB.</strong></p>\n </div>\n\n <!-- Selected Files List -->\n <div *ngIf=\"selectedFiles.length > 0\" class=\"file-list\" style=\"margin-top:10px\">\n <p><strong>Selected Files</strong></p>\n\n <div class=\"file-item\" *ngFor=\"let file of selectedFiles; let i = index\">\n <span>{{ file.name }}</span>\n <span (click)=\"removeFile(i)\">\n <mat-icon class=\"file-cross-icon\" matTooltip=\"Remove\" matTooltipPosition=\"above\">close</mat-icon>\n </span>\n </div>\n </div>\n\n</mat-dialog-content>\n\n<div class=\"disclaimer-text\">\n <p><strong>Disclaimer:</strong> Please do not upload any confidential documents.</p>\n</div>\n\n<mat-dialog-actions align=\"end\" style=\"margin: 20px 20px;\">\n <button mat-button mat-dialog-close>Cancel</button>\n\n <button [ngClass]=\"selectedFiles.length === 0 || !selectedDocumentType ? 'primary-btn-disabled':'primary-btn'\"\n class=\"cursor-pointer\" mat-raised-button color=\"primary\" (click)=\"upload()\"\n [disabled]=\"selectedFiles.length === 0 || !selectedDocumentType\">\n Upload\n </button>\n</mat-dialog-actions>\n\n<div class=\"overlay-loader\" *ngIf=\"loading\">\n <mat-spinner diameter=\"50\"></mat-spinner>\n</div>", styles: [".file-upload-box{border:2px dashed #ccc;padding:20px;text-align:center;cursor:pointer;margin-top:10px}.primary-btn{background-color:#1b4ca1;color:#fff}.primary-btn-disabled{background-color:#1b4ca1;color:#fff;opacity:.6}.disclaimer-text p{font-size:16px;font-family:Lato;font-weight:400;margin-left:24px}.file-cross-icon{height:24px;width:24px;vertical-align:middle;background:#d3d3d3;margin-left:10px;border-radius:25px}:host .mat-mdc-dialog-content{max-height:100vh!important}.cursor-pointer{cursor:pointer}.document-select{width:100%;margin-top:15px;margin-bottom:18px}:host ::ng-deep .mat-select-arrow-wrapper{margin-top:5px!important}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline{color:#ccc}:host ::ng-deep .mat-form-field-appearance-outline.mat-focused .mat-form-field-outline-thick{color:#1b4ca1;border-color:#1b4ca1!important}::ng-deep .select-search-panel .mat-option.mat-selected:not(.mat-option-disabled){background-color:#1b4ca1!important;color:#fff!important}:host ::ng-deep .mat-form-field-appearance-outline{border-radius:10px!important;border:1px solid #ccc}:host ::ng-deep .mat-form-field-focused .mat-form-field-appearance-outline{border-color:#1b4ca1!important}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline-start{border-radius:10px 0 0 10px!important;border:none!important}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline-end{border-right:none!important;border:none!important;border-radius:0 10px 10px 0!important}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline-gap{border:none!important;border-radius:10px!important}:host::ng-deep .mat-form-field-appearance-outline .mat-form-field-infix{background-color:transparent!important}.error{color:red}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-subscript-wrapper{padding:0!important}:host ::ng-deep .mat-form-field{padding:0!important;height:auto!important}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i6.MatLegacyError, selector: "mat-error", inputs: ["id"] }, { kind: "component", type: i6.MatLegacyFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatLegacyLabel, selector: "mat-label" }, { kind: "component", type: i7.MatLegacyButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i1.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "component", type: i9.MatLegacySelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "component", type: i10.MatLegacyOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i11.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "directive", type: i12.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }] }); }
181
196
  }
182
197
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: UploadDialogComponent, decorators: [{
183
198
  type: Component,
184
- args: [{ selector: 'app-upload-dialog', template: "<h2 mat-dialog-title>Upload Document</h2>\n\n<mat-dialog-content>\n\n <!-- <mat-form-field appearance=\"fill\" style=\"width: 100%; border: 1px solid #000;\">\n <input\n matInput\n [(ngModel)]=\"documentName\"\n placeholder=\"Document Name\"\n [disabled]=\"totalFileCount >= MAX_FILES\"\n >\n </mat-form-field> -->\n\n <!-- Upload Box -->\n <div\n class=\"file-upload-box\"\n style=\"margin-top: 30px;\"\n [class.disabled]=\"totalFileCount >= MAX_FILES\"\n (click)=\"totalFileCount < MAX_FILES && fileInput.click()\"\n >\n <input\n type=\"file\"\n #fileInput\n hidden\n multiple\n accept=\".pdf,.doc,.docx\"\n (change)=\"onFileSelected($event)\"\n >\n\n <p *ngIf=\"totalFileCount < MAX_FILES\">\n Click to select files\n </p>\n\n <p *ngIf=\"totalFileCount >= MAX_FILES\" class=\"error-text\">\n Maximum 10 documents allowed\n </p>\n\n <p><strong>Note:</strong> <small>PDF Files Only (Max:25 MB)</small></p>\n </div>\n\n <!-- Selected Files List -->\n <div *ngIf=\"selectedFiles.length > 0\" class=\"file-list\" style=\"margin-top:10px\">\n <p><strong>Selected Files</strong></p>\n\n <div class=\"file-item\" *ngFor=\"let file of selectedFiles; let i = index\">\n <span>{{ file.name }}</span>\n <span (click)=\"removeFile(i)\">\n <mat-icon class=\"file-cross-icon\" matTooltip=\"Remove\" matTooltipPosition=\"above\">close</mat-icon>\n </span>\n </div>\n </div>\n\n</mat-dialog-content>\n\n<div class=\"disclaimer-text\">\n <p>Disclaimer: Please do not upload any confidential documents.</p>\n</div>\n\n<mat-dialog-actions align=\"center\" style=\"margin: 20px 0;\">\n <button mat-button mat-dialog-close>Cancel</button>\n\n <button class=\"primary-btn cursor-pointer\"\n mat-raised-button\n color=\"primary\"\n (click)=\"upload()\"\n [disabled]=\"selectedFiles.length === 0\"\n >\n Upload\n </button>\n</mat-dialog-actions>\n\n<div class=\"overlay-loader\" *ngIf=\"loading\">\n <mat-spinner diameter=\"50\"></mat-spinner>\n</div>\n", styles: [".file-upload-box{border:2px dashed #ccc;padding:20px;text-align:center;cursor:pointer;margin-top:10px}.primary-btn{background-color:#1b4ca1;color:#fff}.disclaimer-text p{font-size:16px;font-family:Lato;font-weight:400;margin-left:24px}.file-cross-icon{height:24px;width:24px;vertical-align:middle;background:#d3d3d3;margin-left:10px;border-radius:25px}:host .mat-mdc-dialog-content{max-height:100vh!important}.cursor-pointer{cursor:pointer}\n"] }]
199
+ args: [{ selector: 'app-upload-dialog', template: "<h2 mat-dialog-title style=\"color:#000;font-weight: 600;\">Upload Document</h2>\n\n<mat-dialog-content>\n\n <!-- <mat-form-field appearance=\"fill\" style=\"width: 100%; border: 1px solid #000;\">\n <input\n matInput\n [(ngModel)]=\"documentName\"\n placeholder=\"Document Name\"\n [disabled]=\"totalFileCount >= MAX_FILES\"\n >\n </mat-form-field> -->\n\n <!-- Upload Box -->\n <!-- Document Type Select -->\n <label class=\"document-type-label\" style=\"color:#000;margin-top: 10px;\"><strong>Document Type</strong>&nbsp;<span class=\"error\">*</span></label>\n <mat-form-field appearance=\"outline\" class=\"document-select\">\n\n\n <mat-label>\n {{ selectedDocumentType ? '' : 'Select Document Type' }}\n </mat-label>\n\n\n <mat-select [(ngModel)]=\"selectedDocumentType\" required>\n\n <mat-option value=\"Work Allocation Order\">\n Work Allocation Order\n </mat-option>\n\n <mat-option value=\"Annual Reports\">\n Annual Reports\n </mat-option>\n\n <mat-option value=\"Other Document\">\n Other Document\n </mat-option>\n\n </mat-select>\n\n <mat-error *ngIf=\"!selectedDocumentType\" style=\"margin-top: 16px;color:#ff0000;\">\n Document type is required\n </mat-error>\n\n </mat-form-field>\n\n <div class=\"file-upload-box\" style=\"margin-top: 30px;\" [class.disabled]=\"totalFileCount >= MAX_FILES\"\n (click)=\"totalFileCount < MAX_FILES && fileInput.click()\">\n <input type=\"file\" #fileInput hidden multiple accept=\".pdf,.doc,.docx\" (change)=\"onFileSelected($event)\">\n\n <p *ngIf=\"totalFileCount < MAX_FILES\">\n Click to select files or drag and drop\n </p>\n\n <p *ngIf=\"totalFileCount >= MAX_FILES\" class=\"error-text\">\n Maximum 10 documents allowed\n </p>\n\n <p><strong>Note:</strong> PDF Files Only. Maximum file size:<strong>25 MB.</strong></p>\n </div>\n\n <!-- Selected Files List -->\n <div *ngIf=\"selectedFiles.length > 0\" class=\"file-list\" style=\"margin-top:10px\">\n <p><strong>Selected Files</strong></p>\n\n <div class=\"file-item\" *ngFor=\"let file of selectedFiles; let i = index\">\n <span>{{ file.name }}</span>\n <span (click)=\"removeFile(i)\">\n <mat-icon class=\"file-cross-icon\" matTooltip=\"Remove\" matTooltipPosition=\"above\">close</mat-icon>\n </span>\n </div>\n </div>\n\n</mat-dialog-content>\n\n<div class=\"disclaimer-text\">\n <p><strong>Disclaimer:</strong> Please do not upload any confidential documents.</p>\n</div>\n\n<mat-dialog-actions align=\"end\" style=\"margin: 20px 20px;\">\n <button mat-button mat-dialog-close>Cancel</button>\n\n <button [ngClass]=\"selectedFiles.length === 0 || !selectedDocumentType ? 'primary-btn-disabled':'primary-btn'\"\n class=\"cursor-pointer\" mat-raised-button color=\"primary\" (click)=\"upload()\"\n [disabled]=\"selectedFiles.length === 0 || !selectedDocumentType\">\n Upload\n </button>\n</mat-dialog-actions>\n\n<div class=\"overlay-loader\" *ngIf=\"loading\">\n <mat-spinner diameter=\"50\"></mat-spinner>\n</div>", styles: [".file-upload-box{border:2px dashed #ccc;padding:20px;text-align:center;cursor:pointer;margin-top:10px}.primary-btn{background-color:#1b4ca1;color:#fff}.primary-btn-disabled{background-color:#1b4ca1;color:#fff;opacity:.6}.disclaimer-text p{font-size:16px;font-family:Lato;font-weight:400;margin-left:24px}.file-cross-icon{height:24px;width:24px;vertical-align:middle;background:#d3d3d3;margin-left:10px;border-radius:25px}:host .mat-mdc-dialog-content{max-height:100vh!important}.cursor-pointer{cursor:pointer}.document-select{width:100%;margin-top:15px;margin-bottom:18px}:host ::ng-deep .mat-select-arrow-wrapper{margin-top:5px!important}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline{color:#ccc}:host ::ng-deep .mat-form-field-appearance-outline.mat-focused .mat-form-field-outline-thick{color:#1b4ca1;border-color:#1b4ca1!important}::ng-deep .select-search-panel .mat-option.mat-selected:not(.mat-option-disabled){background-color:#1b4ca1!important;color:#fff!important}:host ::ng-deep .mat-form-field-appearance-outline{border-radius:10px!important;border:1px solid #ccc}:host ::ng-deep .mat-form-field-focused .mat-form-field-appearance-outline{border-color:#1b4ca1!important}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline-start{border-radius:10px 0 0 10px!important;border:none!important}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline-end{border-right:none!important;border:none!important;border-radius:0 10px 10px 0!important}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline-gap{border:none!important;border-radius:10px!important}:host::ng-deep .mat-form-field-appearance-outline .mat-form-field-infix{background-color:transparent!important}.error{color:red}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-subscript-wrapper{padding:0!important}:host ::ng-deep .mat-form-field{padding:0!important;height:auto!important}\n"] }]
185
200
  }], ctorParameters: function () { return [{ type: i1.MatDialogRef }, { type: i2.SharedService }, { type: i3.MatSnackBar }, { type: i1.MatDialog }]; } });
186
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkLWRpYWxvZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJyYXJ5L3N1bmJpcmQtY2IvY2JwLWFpL3NyYy9saWIvbW9kdWxlcy91cGxvYWQtZG9jdW1lbnQtcGFnZS91cGxvYWQtZGlhbG9nL3VwbG9hZC1kaWFsb2cuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL2NicC1haS9zcmMvbGliL21vZHVsZXMvdXBsb2FkLWRvY3VtZW50LXBhZ2UvdXBsb2FkLWRpYWxvZy91cGxvYWQtZGlhbG9nLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFLMUMsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sOENBQThDLENBQUM7QUFDdkYsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUMsT0FBTyxFQUFPLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7Ozs7O0FBTTNFLE1BQU0sT0FBTyxxQkFBcUI7SUFVaEMsWUFDUyxTQUE4QyxFQUM5QyxhQUE0QixFQUM1QixRQUFxQixFQUNyQixNQUFpQjtRQUhqQixjQUFTLEdBQVQsU0FBUyxDQUFxQztRQUM5QyxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1QixhQUFRLEdBQVIsUUFBUSxDQUFhO1FBQ3JCLFdBQU0sR0FBTixNQUFNLENBQVc7UUFaakIsY0FBUyxHQUFHLEVBQUUsQ0FBQztRQUV4QixpQkFBWSxHQUFHLEVBQUUsQ0FBQztRQUNsQixrQkFBYSxHQUFXLEVBQUUsQ0FBQztRQUMzQixnQkFBVyxHQUFRLEVBQUUsQ0FBQztRQUN0QixZQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ2hC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QUF1QixDQUFDO2dCQUMvRixVQUFVLENBQUMsR0FBRyxFQUFFO29CQUNkLG9CQUFvQixDQUFDLEtBQUssRUFBRSxDQUFDO29CQUM3QixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDaEMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ1YsQ0FBQztZQUNELEtBQUssRUFBRSxHQUFHLEVBQUU7Z0JBQ1Ysb0JBQW9CLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQzdCLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2hDLENBQUM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDOytHQTlOVSxxQkFBcUI7bUdBQXJCLHFCQUFxQix5RENibEMsNmlFQTBFQTs7NEZEN0RhLHFCQUFxQjtrQkFMakMsU0FBUzsrQkFDRSxtQkFBbUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1hdERpYWxvZ1JlZiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBTaGFyZWRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2hhcmVkL3NlcnZpY2VzL3NoYXJlZC5zZXJ2aWNlJztcbmltcG9ydCB7IE1hdFNuYWNrQmFyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc25hY2stYmFyJztcbmltcG9ydCB7IE1hdERpYWxvZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBQcm9ncmVzc0RpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4uL3Byb2dyZXNzLWRpYWxvZy9wcm9ncmVzcy1kaWFsb2cuY29tcG9uZW50JztcbmltcG9ydCB7IGludGVydmFsLCBmb3JrSm9pbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwLCBzdGFydFdpdGgsIHN3aXRjaE1hcCwgdGFrZVdoaWxlLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtdXBsb2FkLWRpYWxvZycsXG4gIHRlbXBsYXRlVXJsOiAnLi91cGxvYWQtZGlhbG9nLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdXBsb2FkLWRpYWxvZy5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIFVwbG9hZERpYWxvZ0NvbXBvbmVudCB7XG5cbiAgcmVhZG9ubHkgTUFYX0ZJTEVTID0gMTA7XG5cbiAgZG9jdW1lbnROYW1lID0gJyc7XG4gIHNlbGVjdGVkRmlsZXM6IEZpbGVbXSA9IFtdO1xuICBjYnBGaW5hbE9iajogYW55ID0ge307XG4gIGxvYWRpbmcgPSBmYWxzZTtcbiAgdXBsb2FkZWRGaWxlRGF0YTogYW55ID0ge307XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGRpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPFVwbG9hZERpYWxvZ0NvbXBvbmVudD4sXG4gICAgcHVibGljIHNoYXJlZFNlcnZpY2U6IFNoYXJlZFNlcnZpY2UsXG4gICAgcHVibGljIHNuYWNrQmFyOiBNYXRTbmFja0JhcixcbiAgICBwdWJsaWMgZGlhbG9nOiBNYXREaWFsb2dcbiAgKSB7XG4gICAgdGhpcy5jYnBGaW5hbE9iaiA9IHRoaXMuc2hhcmVkU2VydmljZS5nZXRDQlBQbGFuTG9jYWxTdG9yYWdlKCk7XG4gIH1cblxuICAvKiogQWxyZWFkeSB1cGxvYWRlZCBmaWxlcyBjb3VudCAqL1xuICBnZXQgdXBsb2FkZWRDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmNicEZpbmFsT2JqPy5kb2N1bWVudHM/Lmxlbmd0aCB8fCAwO1xuICB9XG5cbiAgLyoqIFVwbG9hZGVkICsgbmV3bHkgc2VsZWN0ZWQgKi9cbiAgZ2V0IHRvdGFsRmlsZUNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMudXBsb2FkZWRDb3VudCArIHRoaXMuc2VsZWN0ZWRGaWxlcy5sZW5ndGg7XG4gIH1cblxuICBvbkZpbGVTZWxlY3RlZChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgIGlmICghaW5wdXQuZmlsZXMpIHJldHVybjtcblxuICAgIGNvbnN0IGZpbGVzID0gQXJyYXkuZnJvbShpbnB1dC5maWxlcyk7XG4gICAgY29uc3QgYWxsb3dlZEV4dGVuc2lvbnMgPSBbJ3BkZicsICdkb2MnLCAnZG9jeCddO1xuXG4gICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICBpZiAodGhpcy50b3RhbEZpbGVDb3VudCA+PSB0aGlzLk1BWF9GSUxFUykge1xuICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oJ1lvdSBjYW4gdXBsb2FkIGEgbWF4aW11bSBvZiAxMCBkb2N1bWVudHMuJywgJ1gnLCB7XG4gICAgICAgICAgZHVyYXRpb246IDMwMDAsXG4gICAgICAgICAgcGFuZWxDbGFzczogWydzbmFja2Jhci1lcnJvciddXG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgY29uc3QgZXh0ID0gZmlsZS5uYW1lLnNwbGl0KCcuJykucG9wKCk/LnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAoIWV4dCB8fCAhYWxsb3dlZEV4dGVuc2lvbnMuaW5jbHVkZXMoZXh0KSkge1xuICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oXG4gICAgICAgICAgYEludmFsaWQgZmlsZSB0eXBlOiAke2ZpbGUubmFtZX1gLFxuICAgICAgICAgICdYJyxcbiAgICAgICAgICB7IGR1cmF0aW9uOiAzMDAwLCBwYW5lbENsYXNzOiBbJ3NuYWNrYmFyLWVycm9yJ10gfVxuICAgICAgICApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gUHJldmVudCBkdXBsaWNhdGUgc2VsZWN0aW9uXG4gICAgICBpZiAodGhpcy5zZWxlY3RlZEZpbGVzLnNvbWUoZiA9PiBmLm5hbWUgPT09IGZpbGUubmFtZSAmJiBmLnNpemUgPT09IGZpbGUuc2l6ZSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2VsZWN0ZWRGaWxlcy5wdXNoKGZpbGUpO1xuICAgIH1cblxuICAgIC8vIFJlc2V0IGlucHV0IHNvIHNhbWUgZmlsZSBjYW4gYmUgcmUtc2VsZWN0ZWRcbiAgICBpbnB1dC52YWx1ZSA9ICcnO1xuICB9XG5cbiAgcmVtb3ZlRmlsZShpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZEZpbGVzLnNwbGljZShpbmRleCwgMSk7XG4gIH1cblxuICAvLyB1cGxvYWQoKTogdm9pZCB7XG4gIC8vICAgaWYgKCF0aGlzLmRvY3VtZW50TmFtZSB8fCB0aGlzLnNlbGVjdGVkRmlsZXMubGVuZ3RoID09PSAwKSB7XG4gIC8vICAgICByZXR1cm47XG4gIC8vICAgfVxuXG4gIC8vICAgaWYgKHRoaXMudG90YWxGaWxlQ291bnQgPiB0aGlzLk1BWF9GSUxFUykge1xuICAvLyAgICAgdGhpcy5zbmFja0Jhci5vcGVuKCdNYXhpbXVtIDEwIGRvY3VtZW50cyBhbGxvd2VkLicsICdYJywge1xuICAvLyAgICAgICBkdXJhdGlvbjogMzAwMCxcbiAgLy8gICAgICAgcGFuZWxDbGFzczogWydzbmFja2Jhci1lcnJvciddXG4gIC8vICAgICB9KTtcbiAgLy8gICAgIHJldHVybjtcbiAgLy8gICB9XG5cbiAgLy8gICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuXG4gIC8vICAgY29uc3QgdXBsb2FkTmV4dCA9IChpbmRleDogbnVtYmVyKSA9PiB7XG4gIC8vICAgICBpZiAoaW5kZXggPj0gdGhpcy5zZWxlY3RlZEZpbGVzLmxlbmd0aCkge1xuICAvLyAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgLy8gICAgICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoJ2Nsb3NlJyk7XG4gIC8vICAgICAgIHJldHVybjtcbiAgLy8gICAgIH1cblxuICAvLyAgICAgY29uc3QgZmlsZSA9IHRoaXMuc2VsZWN0ZWRGaWxlc1tpbmRleF07XG5cbiAgLy8gICAgIGNvbnN0IHJlcUJvZHkgPSB7XG4gIC8vICAgICAgIHN0YXRlX2NlbnRlcl9pZDogdGhpcy5jYnBGaW5hbE9iaj8ubWluaXN0cnk/LmlkZW50aWZpZXIsXG4gIC8vICAgICAgIGRlcGFydG1lbnRfaWQ6IHRoaXMuY2JwRmluYWxPYmo/LmRlcGFydG1lbnRzLFxuICAvLyAgICAgICBkb2N1bWVudE5hbWU6IHRoaXMuZG9jdW1lbnROYW1lXG4gIC8vICAgICB9O1xuXG4gIC8vICAgICB0aGlzLnNoYXJlZFNlcnZpY2UudXBsb2FkRG9jdW1lbnQocmVxQm9keSwgZmlsZSkuc3Vic2NyaWJlKHtcbiAgLy8gICAgICAgbmV4dDogKHJlcykgPT4ge1xuICAvLyAgICAgICAgIHRoaXMudXBsb2FkZWRGaWxlRGF0YSA9IHJlcztcbiAgLy8gICAgICAgICB0aGlzLnRyaWdnZXJGaWxlU3VtbWFyeSgpO1xuICAvLyAgICAgICAgIHVwbG9hZE5leHQoaW5kZXggKyAxKTtcbiAgLy8gICAgICAgfSxcbiAgLy8gICAgICAgZXJyb3I6IChlcnIpID0+IHtcbiAgLy8gICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgLy8gICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oXG4gIC8vICAgICAgICAgICBlcnI/LmVycm9yPy5kZXRhaWwgfHwgJ1VwbG9hZCBmYWlsZWQnLFxuICAvLyAgICAgICAgICAgJ1gnLFxuICAvLyAgICAgICAgICAgeyBkdXJhdGlvbjogMzAwMCwgcGFuZWxDbGFzczogWydzbmFja2Jhci1lcnJvciddIH1cbiAgLy8gICAgICAgICApO1xuICAvLyAgICAgICB9XG4gIC8vICAgICB9KTtcbiAgLy8gICB9O1xuXG4gIC8vICAgdXBsb2FkTmV4dCgwKTtcbiAgLy8gfVxuXG4gIHVwbG9hZCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZEZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgXG4gICAgaWYgKHRoaXMudG90YWxGaWxlQ291bnQgPiB0aGlzLk1BWF9GSUxFUykge1xuICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKCdNYXhpbXVtIDEwIGRvY3VtZW50cyBhbGxvd2VkLicsICdYJywge1xuICAgICAgICBkdXJhdGlvbjogMzAwMCxcbiAgICAgICAgcGFuZWxDbGFzczogWydzbmFja2Jhci1lcnJvciddXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIFxuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XG4gIFxuICAgIC8vIFJlcXVpcmVkIGZpZWxkc1xuICAgIGZvcm1EYXRhLmFwcGVuZChcbiAgICAgICdzdGF0ZV9jZW50ZXJfaWQnLFxuICAgICAgdGhpcy5jYnBGaW5hbE9iaj8ubWluaXN0cnk/LmlkZW50aWZpZXIgfHwgJydcbiAgICApO1xuICBcbiAgICBmb3JtRGF0YS5hcHBlbmQoXG4gICAgICAnZGVwYXJ0bWVudF9pZCcsXG4gICAgICB0aGlzLmNicEZpbmFsT2JqPy5kZXBhcnRtZW50cyB8fCAnJ1xuICAgICk7XG4gIFxuICAgIC8vIEFwcGVuZCBtdWx0aXBsZSBmaWxlcyB3aXRoIFNBTUUga2V5IFwiZmlsZXNcIlxuICAgIHRoaXMuc2VsZWN0ZWRGaWxlcy5mb3JFYWNoKChmaWxlOiBGaWxlKSA9PiB7XG4gICAgICBmb3JtRGF0YS5hcHBlbmQoJ2ZpbGVzJywgZmlsZSwgZmlsZS5uYW1lKTtcbiAgICB9KTtcbiAgXG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgXG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLnVwbG9hZERvY3VtZW50KGZvcm1EYXRhKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlcykgPT4ge1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy51cGxvYWRlZEZpbGVEYXRhID0gcmVzO1xuICAgICAgICB0aGlzLnRyaWdnZXJGaWxlU3VtbWFyeSgpO1xuICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4ocmVzPy5tZXNzYWdlLCAnWCcsIHtcbiAgICAgICAgICBkdXJhdGlvbjogMzAwMCxcbiAgICAgICAgICBwYW5lbENsYXNzOiBbJ3NuYWNrYmFyLXN1Y2Nlc3MnXVxuICAgICAgICB9KTtcbiAgXG4gICAgICAgIFxuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gIFxuICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oXG4gICAgICAgICAgZXJyb3I/LmVycm9yPy5kZXRhaWwgfHwgJ1VwbG9hZCBmYWlsZWQnLFxuICAgICAgICAgICdYJyxcbiAgICAgICAgICB7IGR1cmF0aW9uOiAzMDAwLCBwYW5lbENsYXNzOiBbJ3NuYWNrYmFyLWVycm9yJ10gfVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIFxuXG5cbiAgdHJpZ2dlckZpbGVTdW1tYXJ5KCkge1xuICAgIGlmICghdGhpcy51cGxvYWRlZEZpbGVEYXRhPy5zdWNjZXNzZnVsX3VwbG9hZHM/Lmxlbmd0aCkgcmV0dXJuO1xuICBcbiAgICBjb25zdCBmaWxlcyA9IHRoaXMudXBsb2FkZWRGaWxlRGF0YS5zdWNjZXNzZnVsX3VwbG9hZHM7XG4gICAgY29uc3QgdG90YWxGaWxlcyA9IGZpbGVzLmxlbmd0aDtcbiAgXG4gICAgY29uc3QgZGlhbG9nUmVmRm9yUHJvZ3Jlc3MgPSB0aGlzLmRpYWxvZy5vcGVuKFByb2dyZXNzRGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICBkaXNhYmxlQ2xvc2U6IHRydWUsXG4gICAgICBkYXRhOiB7IHByb2dyZXNzOiAwLCBtZXNzYWdlOiBgUHJvY2Vzc2luZyAwIG9mICR7dG90YWxGaWxlc30gc3VtbWFyaWVzLi4uYCB9XG4gICAgfSk7XG4gIFxuICAgIGxldCBjb21wbGV0ZWRGaWxlcyA9IDA7XG4gIFxuICAgIGNvbnN0IHBvbGxpbmdSZXF1ZXN0cyA9IGZpbGVzLm1hcChmaWxlID0+XG4gICAgICBpbnRlcnZhbCg1MDAwKS5waXBlKFxuICAgICAgICBzdGFydFdpdGgoMCksIC8vIHRyaWdnZXIgaW1tZWRpYXRlbHlcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuc2hhcmVkU2VydmljZS50cmlnZ2VyRmlsZVN1bW1hcnkoZmlsZS5maWxlX2lkKSksIC8vIG11c3QgcmV0dXJuIHsgc3VtbWFyeV9zdGF0dXMgfVxuICAgICAgICB0YXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgaWYgKHJlcy5zdW1tYXJ5X3N0YXR1cyA9PT0gJ0NPTVBMRVRFRCcpIHtcbiAgICAgICAgICAgIGNvbXBsZXRlZEZpbGVzKys7XG4gICAgICAgICAgICBkaWFsb2dSZWZGb3JQcm9ncmVzcy5jb21wb25lbnRJbnN0YW5jZS5kYXRhLnByb2dyZXNzID0gTWF0aC5mbG9vcigoY29tcGxldGVkRmlsZXMgLyB0b3RhbEZpbGVzKSAqIDEwMCk7XG4gICAgICAgICAgICBkaWFsb2dSZWZGb3JQcm9ncmVzcy5jb21wb25lbnRJbnN0YW5jZS5kYXRhLm1lc3NhZ2UgPSBgUHJvY2Vzc2luZyAke2NvbXBsZXRlZEZpbGVzfSBvZiAke3RvdGFsRmlsZXN9IHN1bW1hcmllcy4uLmA7XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICAgdGFrZVdoaWxlKChyZXM6IGFueSkgPT4gcmVzLnN1bW1hcnlfc3RhdHVzICE9PSAnQ09NUExFVEVEJywgdHJ1ZSlcbiAgICAgIClcbiAgICApO1xuICBcbiAgICBmb3JrSm9pbihwb2xsaW5nUmVxdWVzdHMpLnN1YnNjcmliZSh7XG4gICAgICBjb21wbGV0ZTogKCkgPT4ge1xuICAgICAgICBkaWFsb2dSZWZGb3JQcm9ncmVzcy5jb21wb25lbnRJbnN0YW5jZS5kYXRhLnByb2dyZXNzID0gMTAwO1xuICAgICAgICBkaWFsb2dSZWZGb3JQcm9ncmVzcy5jb21wb25lbnRJbnN0YW5jZS5kYXRhLm1lc3NhZ2UgPSBgQWxsICR7dG90YWxGaWxlc30gc3VtbWFyaWVzIGNvbXBsZXRlZCFgO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBkaWFsb2dSZWZGb3JQcm9ncmVzcy5jbG9zZSgpO1xuICAgICAgICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKCdjbG9zZScpO1xuICAgICAgICB9LCA1MDApO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgIGRpYWxvZ1JlZkZvclByb2dyZXNzLmNsb3NlKCk7XG4gICAgICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKCdjbG9zZScpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIFxuXG5cbn1cbiIsIjxoMiBtYXQtZGlhbG9nLXRpdGxlPlVwbG9hZCBEb2N1bWVudDwvaDI+XG5cbjxtYXQtZGlhbG9nLWNvbnRlbnQ+XG5cbiAgPCEtLSA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cImZpbGxcIiBzdHlsZT1cIndpZHRoOiAxMDAlOyBib3JkZXI6IDFweCBzb2xpZCAjMDAwO1wiPlxuICAgIDxpbnB1dFxuICAgICAgbWF0SW5wdXRcbiAgICAgIFsobmdNb2RlbCldPVwiZG9jdW1lbnROYW1lXCJcbiAgICAgIHBsYWNlaG9sZGVyPVwiRG9jdW1lbnQgTmFtZVwiXG4gICAgICBbZGlzYWJsZWRdPVwidG90YWxGaWxlQ291bnQgPj0gTUFYX0ZJTEVTXCJcbiAgICA+XG4gIDwvbWF0LWZvcm0tZmllbGQ+IC0tPlxuXG4gIDwhLS0gVXBsb2FkIEJveCAtLT5cbiAgPGRpdlxuICAgIGNsYXNzPVwiZmlsZS11cGxvYWQtYm94XCJcbiAgICBzdHlsZT1cIm1hcmdpbi10b3A6IDMwcHg7XCJcbiAgICBbY2xhc3MuZGlzYWJsZWRdPVwidG90YWxGaWxlQ291bnQgPj0gTUFYX0ZJTEVTXCJcbiAgICAoY2xpY2spPVwidG90YWxGaWxlQ291bnQgPCBNQVhfRklMRVMgJiYgZmlsZUlucHV0LmNsaWNrKClcIlxuICA+XG4gICAgPGlucHV0XG4gICAgICB0eXBlPVwiZmlsZVwiXG4gICAgICAjZmlsZUlucHV0XG4gICAgICBoaWRkZW5cbiAgICAgIG11bHRpcGxlXG4gICAgICBhY2NlcHQ9XCIucGRmLC5kb2MsLmRvY3hcIlxuICAgICAgKGNoYW5nZSk9XCJvbkZpbGVTZWxlY3RlZCgkZXZlbnQpXCJcbiAgICA+XG5cbiAgICA8cCAqbmdJZj1cInRvdGFsRmlsZUNvdW50IDwgTUFYX0ZJTEVTXCI+XG4gICAgICBDbGljayB0byBzZWxlY3QgZmlsZXNcbiAgICA8L3A+XG5cbiAgICA8cCAqbmdJZj1cInRvdGFsRmlsZUNvdW50ID49IE1BWF9GSUxFU1wiIGNsYXNzPVwiZXJyb3ItdGV4dFwiPlxuICAgICAgTWF4aW11bSAxMCBkb2N1bWVudHMgYWxsb3dlZFxuICAgIDwvcD5cblxuICAgIDxwPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gPHNtYWxsPlBERiBGaWxlcyBPbmx5IChNYXg6MjUgTUIpPC9zbWFsbD48L3A+XG4gIDwvZGl2PlxuXG4gIDwhLS0gU2VsZWN0ZWQgRmlsZXMgTGlzdCAtLT5cbiAgPGRpdiAqbmdJZj1cInNlbGVjdGVkRmlsZXMubGVuZ3RoID4gMFwiIGNsYXNzPVwiZmlsZS1saXN0XCIgc3R5bGU9XCJtYXJnaW4tdG9wOjEwcHhcIj5cbiAgICA8cD48c3Ryb25nPlNlbGVjdGVkIEZpbGVzPC9zdHJvbmc+PC9wPlxuXG4gICAgPGRpdiBjbGFzcz1cImZpbGUtaXRlbVwiICpuZ0Zvcj1cImxldCBmaWxlIG9mIHNlbGVjdGVkRmlsZXM7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgIDxzcGFuPnt7IGZpbGUubmFtZSB9fTwvc3Bhbj5cbiAgICAgIDxzcGFuIChjbGljayk9XCJyZW1vdmVGaWxlKGkpXCI+XG4gICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImZpbGUtY3Jvc3MtaWNvblwiIG1hdFRvb2x0aXA9XCJSZW1vdmVcIiBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiPmNsb3NlPC9tYXQtaWNvbj5cbiAgICAgIDwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbjwvbWF0LWRpYWxvZy1jb250ZW50PlxuXG48ZGl2IGNsYXNzPVwiZGlzY2xhaW1lci10ZXh0XCI+XG4gIDxwPkRpc2NsYWltZXI6IFBsZWFzZSBkbyBub3QgdXBsb2FkIGFueSBjb25maWRlbnRpYWwgZG9jdW1lbnRzLjwvcD5cbjwvZGl2PlxuXG48bWF0LWRpYWxvZy1hY3Rpb25zIGFsaWduPVwiY2VudGVyXCIgc3R5bGU9XCJtYXJnaW46IDIwcHggMDtcIj5cbiAgPGJ1dHRvbiBtYXQtYnV0dG9uIG1hdC1kaWFsb2ctY2xvc2U+Q2FuY2VsPC9idXR0b24+XG5cbiAgPGJ1dHRvbiBjbGFzcz1cInByaW1hcnktYnRuIGN1cnNvci1wb2ludGVyXCJcbiAgICBtYXQtcmFpc2VkLWJ1dHRvblxuICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgKGNsaWNrKT1cInVwbG9hZCgpXCJcbiAgICBbZGlzYWJsZWRdPVwic2VsZWN0ZWRGaWxlcy5sZW5ndGggPT09IDBcIlxuICA+XG4gICAgVXBsb2FkXG4gIDwvYnV0dG9uPlxuPC9tYXQtZGlhbG9nLWFjdGlvbnM+XG5cbjxkaXYgY2xhc3M9XCJvdmVybGF5LWxvYWRlclwiICpuZ0lmPVwibG9hZGluZ1wiPlxuICA8bWF0LXNwaW5uZXIgZGlhbWV0ZXI9XCI1MFwiPjwvbWF0LXNwaW5uZXI+XG48L2Rpdj5cbiJdfQ==
201
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkLWRpYWxvZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJyYXJ5L3N1bmJpcmQtY2IvY2JwLWFpL3NyYy9saWIvbW9kdWxlcy91cGxvYWQtZG9jdW1lbnQtcGFnZS91cGxvYWQtZGlhbG9nL3VwbG9hZC1kaWFsb2cuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL2NicC1haS9zcmMvbGliL21vZHVsZXMvdXBsb2FkLWRvY3VtZW50LXBhZ2UvdXBsb2FkLWRpYWxvZy91cGxvYWQtZGlhbG9nLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFLMUMsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sOENBQThDLENBQUM7QUFDdkYsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUMsT0FBTyxFQUFPLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7Ozs7Ozs7OztBQU0zRSxNQUFNLE9BQU8scUJBQXFCO0lBVWhDLFlBQ1MsU0FBOEMsRUFDOUMsYUFBNEIsRUFDNUIsUUFBcUIsRUFDckIsTUFBaUI7UUFIakIsY0FBUyxHQUFULFNBQVMsQ0FBcUM7UUFDOUMsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsYUFBUSxHQUFSLFFBQVEsQ0FBYTtRQUNyQixXQUFNLEdBQU4sTUFBTSxDQUFXO1FBWmpCLGNBQVMsR0FBRyxFQUFFLENBQUM7UUFFeEIsaUJBQVksR0FBRyxFQUFFLENBQUM7UUFDbEIsa0JBQWEsR0FBVyxFQUFFLENBQUM7UUFDM0IsZ0JBQVcsR0FBUSxFQUFFLENBQUM7UUFDdEIsWUFBTyxHQUFHLEtBQUssQ0FBQztR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c291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNYXREaWFsb2dSZWYgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgU2hhcmVkU2VydmljZSB9IGZyb20gJy4uLy4uL3NoYXJlZC9zZXJ2aWNlcy9zaGFyZWQuc2VydmljZSc7XG5pbXBvcnQgeyBNYXRTbmFja0JhciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NuYWNrLWJhcic7XG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgUHJvZ3Jlc3NEaWFsb2dDb21wb25lbnQgfSBmcm9tICcuLi9wcm9ncmVzcy1kaWFsb2cvcHJvZ3Jlc3MtZGlhbG9nLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBpbnRlcnZhbCwgZm9ya0pvaW4gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCwgc3RhcnRXaXRoLCBzd2l0Y2hNYXAsIHRha2VXaGlsZSwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLXVwbG9hZC1kaWFsb2cnLFxuICB0ZW1wbGF0ZVVybDogJy4vdXBsb2FkLWRpYWxvZy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3VwbG9hZC1kaWFsb2cuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBVcGxvYWREaWFsb2dDb21wb25lbnQge1xuXG4gIHJlYWRvbmx5IE1BWF9GSUxFUyA9IDEwO1xuXG4gIGRvY3VtZW50TmFtZSA9ICcnO1xuICBzZWxlY3RlZEZpbGVzOiBGaWxlW10gPSBbXTtcbiAgY2JwRmluYWxPYmo6IGFueSA9IHt9O1xuICBsb2FkaW5nID0gZmFsc2U7XG4gIHVwbG9hZGVkRmlsZURhdGE6IGFueSA9IHt9O1xuICBzZWxlY3RlZERvY3VtZW50VHlwZSA9ICcnXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBkaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxVcGxvYWREaWFsb2dDb21wb25lbnQ+LFxuICAgIHB1YmxpYyBzaGFyZWRTZXJ2aWNlOiBTaGFyZWRTZXJ2aWNlLFxuICAgIHB1YmxpYyBzbmFja0JhcjogTWF0U25hY2tCYXIsXG4gICAgcHVibGljIGRpYWxvZzogTWF0RGlhbG9nXG4gICkge1xuICAgIHRoaXMuY2JwRmluYWxPYmogPSB0aGlzLnNoYXJlZFNlcnZpY2UuZ2V0Q0JQUGxhbkxvY2FsU3RvcmFnZSgpO1xuICB9XG5cbiAgLyoqIEFscmVhZHkgdXBsb2FkZWQgZmlsZXMgY291bnQgKi9cbiAgZ2V0IHVwbG9hZGVkQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5jYnBGaW5hbE9iaj8uZG9jdW1lbnRzPy5sZW5ndGggfHwgMDtcbiAgfVxuXG4gIC8qKiBVcGxvYWRlZCArIG5ld2x5IHNlbGVjdGVkICovXG4gIGdldCB0b3RhbEZpbGVDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnVwbG9hZGVkQ291bnQgKyB0aGlzLnNlbGVjdGVkRmlsZXMubGVuZ3RoO1xuICB9XG5cbiAgb25GaWxlU2VsZWN0ZWQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgaW5wdXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICBpZiAoIWlucHV0LmZpbGVzKSByZXR1cm47XG5cbiAgICBjb25zdCBmaWxlcyA9IEFycmF5LmZyb20oaW5wdXQuZmlsZXMpO1xuICAgIGNvbnN0IGFsbG93ZWRFeHRlbnNpb25zID0gWydwZGYnLCAnZG9jJywgJ2RvY3gnXTtcblxuICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgICAgaWYgKHRoaXMudG90YWxGaWxlQ291bnQgPj0gdGhpcy5NQVhfRklMRVMpIHtcbiAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKCdZb3UgY2FuIHVwbG9hZCBhIG1heGltdW0gb2YgMTAgZG9jdW1lbnRzLicsICdYJywge1xuICAgICAgICAgIGR1cmF0aW9uOiAzMDAwLFxuICAgICAgICAgIHBhbmVsQ2xhc3M6IFsnc25hY2tiYXItZXJyb3InXVxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV4dCA9IGZpbGUubmFtZS5zcGxpdCgnLicpLnBvcCgpPy50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKCFleHQgfHwgIWFsbG93ZWRFeHRlbnNpb25zLmluY2x1ZGVzKGV4dCkpIHtcbiAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKFxuICAgICAgICAgIGBJbnZhbGlkIGZpbGUgdHlwZTogJHtmaWxlLm5hbWV9YCxcbiAgICAgICAgICAnWCcsXG4gICAgICAgICAgeyBkdXJhdGlvbjogMzAwMCwgcGFuZWxDbGFzczogWydzbmFja2Jhci1lcnJvciddIH1cbiAgICAgICAgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIFByZXZlbnQgZHVwbGljYXRlIHNlbGVjdGlvblxuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRGaWxlcy5zb21lKGYgPT4gZi5uYW1lID09PSBmaWxlLm5hbWUgJiYgZi5zaXplID09PSBmaWxlLnNpemUpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNlbGVjdGVkRmlsZXMucHVzaChmaWxlKTtcbiAgICB9XG5cbiAgICAvLyBSZXNldCBpbnB1dCBzbyBzYW1lIGZpbGUgY2FuIGJlIHJlLXNlbGVjdGVkXG4gICAgaW5wdXQudmFsdWUgPSAnJztcbiAgfVxuXG4gIHJlbW92ZUZpbGUoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWRGaWxlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICB9XG5cbiAgLy8gdXBsb2FkKCk6IHZvaWQge1xuICAvLyAgIGlmICghdGhpcy5kb2N1bWVudE5hbWUgfHwgdGhpcy5zZWxlY3RlZEZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAvLyAgICAgcmV0dXJuO1xuICAvLyAgIH1cblxuICAvLyAgIGlmICh0aGlzLnRvdGFsRmlsZUNvdW50ID4gdGhpcy5NQVhfRklMRVMpIHtcbiAgLy8gICAgIHRoaXMuc25hY2tCYXIub3BlbignTWF4aW11bSAxMCBkb2N1bWVudHMgYWxsb3dlZC4nLCAnWCcsIHtcbiAgLy8gICAgICAgZHVyYXRpb246IDMwMDAsXG4gIC8vICAgICAgIHBhbmVsQ2xhc3M6IFsnc25hY2tiYXItZXJyb3InXVxuICAvLyAgICAgfSk7XG4gIC8vICAgICByZXR1cm47XG4gIC8vICAgfVxuXG4gIC8vICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcblxuICAvLyAgIGNvbnN0IHVwbG9hZE5leHQgPSAoaW5kZXg6IG51bWJlcikgPT4ge1xuICAvLyAgICAgaWYgKGluZGV4ID49IHRoaXMuc2VsZWN0ZWRGaWxlcy5sZW5ndGgpIHtcbiAgLy8gICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gIC8vICAgICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKCdjbG9zZScpO1xuICAvLyAgICAgICByZXR1cm47XG4gIC8vICAgICB9XG5cbiAgLy8gICAgIGNvbnN0IGZpbGUgPSB0aGlzLnNlbGVjdGVkRmlsZXNbaW5kZXhdO1xuXG4gIC8vICAgICBjb25zdCByZXFCb2R5ID0ge1xuICAvLyAgICAgICBzdGF0ZV9jZW50ZXJfaWQ6IHRoaXMuY2JwRmluYWxPYmo/Lm1pbmlzdHJ5Py5pZGVudGlmaWVyLFxuICAvLyAgICAgICBkZXBhcnRtZW50X2lkOiB0aGlzLmNicEZpbmFsT2JqPy5kZXBhcnRtZW50cyxcbiAgLy8gICAgICAgZG9jdW1lbnROYW1lOiB0aGlzLmRvY3VtZW50TmFtZVxuICAvLyAgICAgfTtcblxuICAvLyAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLnVwbG9hZERvY3VtZW50KHJlcUJvZHksIGZpbGUpLnN1YnNjcmliZSh7XG4gIC8vICAgICAgIG5leHQ6IChyZXMpID0+IHtcbiAgLy8gICAgICAgICB0aGlzLnVwbG9hZGVkRmlsZURhdGEgPSByZXM7XG4gIC8vICAgICAgICAgdGhpcy50cmlnZ2VyRmlsZVN1bW1hcnkoKTtcbiAgLy8gICAgICAgICB1cGxvYWROZXh0KGluZGV4ICsgMSk7XG4gIC8vICAgICAgIH0sXG4gIC8vICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XG4gIC8vICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gIC8vICAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKFxuICAvLyAgICAgICAgICAgZXJyPy5lcnJvcj8uZGV0YWlsIHx8ICdVcGxvYWQgZmFpbGVkJyxcbiAgLy8gICAgICAgICAgICdYJyxcbiAgLy8gICAgICAgICAgIHsgZHVyYXRpb246IDMwMDAsIHBhbmVsQ2xhc3M6IFsnc25hY2tiYXItZXJyb3InXSB9XG4gIC8vICAgICAgICAgKTtcbiAgLy8gICAgICAgfVxuICAvLyAgICAgfSk7XG4gIC8vICAgfTtcblxuICAvLyAgIHVwbG9hZE5leHQoMCk7XG4gIC8vIH1cblxuICB1cGxvYWQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRGaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy50b3RhbEZpbGVDb3VudCA+IHRoaXMuTUFYX0ZJTEVTKSB7XG4gICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oJ01heGltdW0gMTAgZG9jdW1lbnRzIGFsbG93ZWQuJywgJ1gnLCB7XG4gICAgICAgIGR1cmF0aW9uOiAzMDAwLFxuICAgICAgICBwYW5lbENsYXNzOiBbJ3NuYWNrYmFyLWVycm9yJ11cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XG5cbiAgICAvLyBSZXF1aXJlZCBmaWVsZHNcbiAgICBmb3JtRGF0YS5hcHBlbmQoXG4gICAgICAnc3RhdGVfY2VudGVyX2lkJyxcbiAgICAgIHRoaXMuY2JwRmluYWxPYmo/Lm1pbmlzdHJ5Py5pZGVudGlmaWVyIHx8ICcnXG4gICAgKTtcbiAgICBpZiAodGhpcy5jYnBGaW5hbE9iaj8uZGVwYXJ0bWVudHMgJiYgdHlwZW9mIHRoaXMuY2JwRmluYWxPYmo/LmRlcGFydG1lbnRzID09PSAnc3RyaW5nJykge1xuICAgICAgZm9ybURhdGEuYXBwZW5kKFxuICAgICAgICAnZGVwYXJ0bWVudF9pZCcsXG4gICAgICAgIHRoaXMuY2JwRmluYWxPYmo/LmRlcGFydG1lbnRzIHx8ICcnXG4gICAgICApO1xuICAgIH1cblxuICAgIGZvcm1EYXRhLmFwcGVuZChcbiAgICAgICdkb2N1bWVudF90eXBlJyxcbiAgICAgIHRoaXMuc2VsZWN0ZWREb2N1bWVudFR5cGUgfHwgJydcbiAgICApO1xuICAgIC8vIEFwcGVuZCBtdWx0aXBsZSBmaWxlcyB3aXRoIFNBTUUga2V5IFwiZmlsZXNcIlxuICAgIHRoaXMuc2VsZWN0ZWRGaWxlcy5mb3JFYWNoKChmaWxlOiBGaWxlKSA9PiB7XG4gICAgICBmb3JtRGF0YS5hcHBlbmQoJ2ZpbGVzJywgZmlsZSwgZmlsZS5uYW1lKTtcbiAgICB9KTtcblxuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG5cbiAgICBjb25zb2xlLmxvZygnZm9ybURhdGEtLScsZm9ybURhdGEpXG5cbiAgICB0aGlzLnNoYXJlZFNlcnZpY2UudXBsb2FkRG9jdW1lbnQoZm9ybURhdGEpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzKSA9PiB7XG4gICAgICAgIGlmIChyZXMgJiYgcmVzLnN0YXR1cyA9PT0gJ2NvbXBsZXRlJykge1xuICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMudXBsb2FkZWRGaWxlRGF0YSA9IHJlcztcbiAgICAgICAgICB0aGlzLnRyaWdnZXJGaWxlU3VtbWFyeSgpO1xuICAgICAgICAgIHRoaXMuc25hY2tCYXIub3BlbihyZXM/Lm1lc3NhZ2UsICdYJywge1xuICAgICAgICAgICAgZHVyYXRpb246IDMwMDAsXG4gICAgICAgICAgICBwYW5lbENsYXNzOiBbJ3NuYWNrYmFyLXN1Y2Nlc3MnXVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuXG4gICAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKFxuICAgICAgICAgICAgcmVzPy5tZXNzYWdlIHx8ICdVcGxvYWQgZmFpbGVkJyxcbiAgICAgICAgICAgICdYJyxcbiAgICAgICAgICAgIHsgZHVyYXRpb246IDMwMDAsIHBhbmVsQ2xhc3M6IFsnc25hY2tiYXItZXJyb3InXSB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG5cblxuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKFxuICAgICAgICAgIGVycm9yPy5lcnJvcj8uZGV0YWlsIHx8ICdVcGxvYWQgZmFpbGVkJyxcbiAgICAgICAgICAnWCcsXG4gICAgICAgICAgeyBkdXJhdGlvbjogMzAwMCwgcGFuZWxDbGFzczogWydzbmFja2Jhci1lcnJvciddIH1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG5cblxuICB0cmlnZ2VyRmlsZVN1bW1hcnkoKSB7XG4gICAgaWYgKCF0aGlzLnVwbG9hZGVkRmlsZURhdGE/LnN1Y2Nlc3NmdWxfdXBsb2Fkcz8ubGVuZ3RoKSByZXR1cm47XG5cbiAgICBjb25zdCBmaWxlcyA9IHRoaXMudXBsb2FkZWRGaWxlRGF0YS5zdWNjZXNzZnVsX3VwbG9hZHM7XG4gICAgY29uc3QgdG90YWxGaWxlcyA9IGZpbGVzLmxlbmd0aDtcblxuICAgIGNvbnN0IGRpYWxvZ1JlZkZvclByb2dyZXNzID0gdGhpcy5kaWFsb2cub3BlbihQcm9ncmVzc0RpYWxvZ0NvbXBvbmVudCwge1xuICAgICAgZGlzYWJsZUNsb3NlOiB0cnVlLFxuICAgICAgZGF0YTogeyBwcm9ncmVzczogMCwgbWVzc2FnZTogYFByb2Nlc3NpbmcgMCBvZiAke3RvdGFsRmlsZXN9IHN1bW1hcmllcy4uLmAgfVxuICAgIH0pO1xuXG4gICAgbGV0IGNvbXBsZXRlZEZpbGVzID0gMDtcblxuICAgIGNvbnN0IHBvbGxpbmdSZXF1ZXN0cyA9IGZpbGVzLm1hcCgoZmlsZTogYW55KSA9PlxuICAgICAgaW50ZXJ2YWwoNTAwMCkucGlwZShcbiAgICAgICAgc3RhcnRXaXRoKDApLCAvLyB0cmlnZ2VyIGltbWVkaWF0ZWx5XG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLnNoYXJlZFNlcnZpY2UudHJpZ2dlckZpbGVTdW1tYXJ5KGZpbGUuZmlsZV9pZCkpLCAvLyBtdXN0IHJldHVybiB7IHN1bW1hcnlfc3RhdHVzIH1cbiAgICAgICAgdGFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgIGlmIChyZXMuc3VtbWFyeV9zdGF0dXMgPT09ICdDT01QTEVURUQnKSB7XG4gICAgICAgICAgICBjb21wbGV0ZWRGaWxlcysrO1xuICAgICAgICAgICAgZGlhbG9nUmVmRm9yUHJvZ3Jlc3MuY29tcG9uZW50SW5zdGFuY2UuZGF0YS5wcm9ncmVzcyA9IE1hdGguZmxvb3IoKGNvbXBsZXRlZEZpbGVzIC8gdG90YWxGaWxlcykgKiAxMDApO1xuICAgICAgICAgICAgZGlhbG9nUmVmRm9yUHJvZ3Jlc3MuY29tcG9uZW50SW5zdGFuY2UuZGF0YS5tZXNzYWdlID0gYFByb2Nlc3NpbmcgJHtjb21wbGV0ZWRGaWxlc30gb2YgJHt0b3RhbEZpbGVzfSBzdW1tYXJpZXMuLi5gO1xuICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICAgIHRha2VXaGlsZSgocmVzOiBhbnkpID0+IHJlcy5zdW1tYXJ5X3N0YXR1cyAhPT0gJ0NPTVBMRVRFRCcsIHRydWUpXG4gICAgICApXG4gICAgKTtcblxuICAgIGZvcmtKb2luKHBvbGxpbmdSZXF1ZXN0cykuc3Vic2NyaWJlKHtcbiAgICAgIGNvbXBsZXRlOiAoKSA9PiB7XG4gICAgICAgIGRpYWxvZ1JlZkZvclByb2dyZXNzLmNvbXBvbmVudEluc3RhbmNlLmRhdGEucHJvZ3Jlc3MgPSAxMDA7XG4gICAgICAgIGRpYWxvZ1JlZkZvclByb2dyZXNzLmNvbXBvbmVudEluc3RhbmNlLmRhdGEubWVzc2FnZSA9IGBBbGwgJHt0b3RhbEZpbGVzfSBzdW1tYXJpZXMgY29tcGxldGVkIWA7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGRpYWxvZ1JlZkZvclByb2dyZXNzLmNsb3NlKCk7XG4gICAgICAgICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoJ2Nsb3NlJyk7XG4gICAgICAgIH0sIDUwMCk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgZGlhbG9nUmVmRm9yUHJvZ3Jlc3MuY2xvc2UoKTtcbiAgICAgICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoJ2Nsb3NlJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuXG5cbn0iLCI8aDIgbWF0LWRpYWxvZy10aXRsZSBzdHlsZT1cImNvbG9yOiMwMDA7Zm9udC13ZWlnaHQ6IDYwMDtcIj5VcGxvYWQgRG9jdW1lbnQ8L2gyPlxuXG48bWF0LWRpYWxvZy1jb250ZW50PlxuXG4gIDwhLS0gPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJmaWxsXCIgc3R5bGU9XCJ3aWR0aDogMTAwJTsgYm9yZGVyOiAxcHggc29saWQgIzAwMDtcIj5cbiAgICA8aW5wdXRcbiAgICAgIG1hdElucHV0XG4gICAgICBbKG5nTW9kZWwpXT1cImRvY3VtZW50TmFtZVwiXG4gICAgICBwbGFjZWhvbGRlcj1cIkRvY3VtZW50IE5hbWVcIlxuICAgICAgW2Rpc2FibGVkXT1cInRvdGFsRmlsZUNvdW50ID49IE1BWF9GSUxFU1wiXG4gICAgPlxuICA8L21hdC1mb3JtLWZpZWxkPiAtLT5cblxuICA8IS0tIFVwbG9hZCBCb3ggLS0+XG4gIDwhLS0gRG9jdW1lbnQgVHlwZSBTZWxlY3QgLS0+XG4gIDxsYWJlbCBjbGFzcz1cImRvY3VtZW50LXR5cGUtbGFiZWxcIiBzdHlsZT1cImNvbG9yOiMwMDA7bWFyZ2luLXRvcDogMTBweDtcIj48c3Ryb25nPkRvY3VtZW50IFR5cGU8L3N0cm9uZz4mbmJzcDs8c3BhbiBjbGFzcz1cImVycm9yXCI+Kjwvc3Bhbj48L2xhYmVsPlxuICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cImRvY3VtZW50LXNlbGVjdFwiPlxuXG5cbiAgICA8bWF0LWxhYmVsPlxuICAgICAge3sgc2VsZWN0ZWREb2N1bWVudFR5cGUgPyAnJyA6ICdTZWxlY3QgRG9jdW1lbnQgVHlwZScgfX1cbiAgICA8L21hdC1sYWJlbD5cblxuXG4gICAgPG1hdC1zZWxlY3QgWyhuZ01vZGVsKV09XCJzZWxlY3RlZERvY3VtZW50VHlwZVwiIHJlcXVpcmVkPlxuXG4gICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIldvcmsgQWxsb2NhdGlvbiBPcmRlclwiPlxuICAgICAgICBXb3JrIEFsbG9jYXRpb24gT3JkZXJcbiAgICAgIDwvbWF0LW9wdGlvbj5cblxuICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJBbm51YWwgUmVwb3J0c1wiPlxuICAgICAgICBBbm51YWwgUmVwb3J0c1xuICAgICAgPC9tYXQtb3B0aW9uPlxuXG4gICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIk90aGVyIERvY3VtZW50XCI+XG4gICAgICAgIE90aGVyIERvY3VtZW50XG4gICAgICA8L21hdC1vcHRpb24+XG5cbiAgICA8L21hdC1zZWxlY3Q+XG5cbiAgICA8bWF0LWVycm9yICpuZ0lmPVwiIXNlbGVjdGVkRG9jdW1lbnRUeXBlXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAxNnB4O2NvbG9yOiNmZjAwMDA7XCI+XG4gICAgICBEb2N1bWVudCB0eXBlIGlzIHJlcXVpcmVkXG4gICAgPC9tYXQtZXJyb3I+XG5cbiAgPC9tYXQtZm9ybS1maWVsZD5cblxuICA8ZGl2IGNsYXNzPVwiZmlsZS11cGxvYWQtYm94XCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAzMHB4O1wiIFtjbGFzcy5kaXNhYmxlZF09XCJ0b3RhbEZpbGVDb3VudCA+PSBNQVhfRklMRVNcIlxuICAgIChjbGljayk9XCJ0b3RhbEZpbGVDb3VudCA8IE1BWF9GSUxFUyAmJiBmaWxlSW5wdXQuY2xpY2soKVwiPlxuICAgIDxpbnB1dCB0eXBlPVwiZmlsZVwiICNmaWxlSW5wdXQgaGlkZGVuIG11bHRpcGxlIGFjY2VwdD1cIi5wZGYsLmRvYywuZG9jeFwiIChjaGFuZ2UpPVwib25GaWxlU2VsZWN0ZWQoJGV2ZW50KVwiPlxuXG4gICAgPHAgKm5nSWY9XCJ0b3RhbEZpbGVDb3VudCA8IE1BWF9GSUxFU1wiPlxuICAgICAgQ2xpY2sgdG8gc2VsZWN0IGZpbGVzIG9yIGRyYWcgYW5kIGRyb3BcbiAgICA8L3A+XG5cbiAgICA8cCAqbmdJZj1cInRvdGFsRmlsZUNvdW50ID49IE1BWF9GSUxFU1wiIGNsYXNzPVwiZXJyb3ItdGV4dFwiPlxuICAgICAgTWF4aW11bSAxMCBkb2N1bWVudHMgYWxsb3dlZFxuICAgIDwvcD5cblxuICAgIDxwPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gUERGIEZpbGVzIE9ubHkuIE1heGltdW0gZmlsZSBzaXplOjxzdHJvbmc+MjUgTUIuPC9zdHJvbmc+PC9wPlxuICA8L2Rpdj5cblxuICA8IS0tIFNlbGVjdGVkIEZpbGVzIExpc3QgLS0+XG4gIDxkaXYgKm5nSWY9XCJzZWxlY3RlZEZpbGVzLmxlbmd0aCA+IDBcIiBjbGFzcz1cImZpbGUtbGlzdFwiIHN0eWxlPVwibWFyZ2luLXRvcDoxMHB4XCI+XG4gICAgPHA+PHN0cm9uZz5TZWxlY3RlZCBGaWxlczwvc3Ryb25nPjwvcD5cblxuICAgIDxkaXYgY2xhc3M9XCJmaWxlLWl0ZW1cIiAqbmdGb3I9XCJsZXQgZmlsZSBvZiBzZWxlY3RlZEZpbGVzOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICA8c3Bhbj57eyBmaWxlLm5hbWUgfX08L3NwYW4+XG4gICAgICA8c3BhbiAoY2xpY2spPVwicmVtb3ZlRmlsZShpKVwiPlxuICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJmaWxlLWNyb3NzLWljb25cIiBtYXRUb29sdGlwPVwiUmVtb3ZlXCIgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYWJvdmVcIj5jbG9zZTwvbWF0LWljb24+XG4gICAgICA8L3NwYW4+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG48L21hdC1kaWFsb2ctY29udGVudD5cblxuPGRpdiBjbGFzcz1cImRpc2NsYWltZXItdGV4dFwiPlxuICA8cD48c3Ryb25nPkRpc2NsYWltZXI6PC9zdHJvbmc+IFBsZWFzZSBkbyBub3QgdXBsb2FkIGFueSBjb25maWRlbnRpYWwgZG9jdW1lbnRzLjwvcD5cbjwvZGl2PlxuXG48bWF0LWRpYWxvZy1hY3Rpb25zIGFsaWduPVwiZW5kXCIgc3R5bGU9XCJtYXJnaW46IDIwcHggMjBweDtcIj5cbiAgPGJ1dHRvbiBtYXQtYnV0dG9uIG1hdC1kaWFsb2ctY2xvc2U+Q2FuY2VsPC9idXR0b24+XG5cbiAgPGJ1dHRvbiBbbmdDbGFzc109XCJzZWxlY3RlZEZpbGVzLmxlbmd0aCA9PT0gMCB8fCAhc2VsZWN0ZWREb2N1bWVudFR5cGUgPyAncHJpbWFyeS1idG4tZGlzYWJsZWQnOidwcmltYXJ5LWJ0bidcIlxuICAgIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwidXBsb2FkKClcIlxuICAgIFtkaXNhYmxlZF09XCJzZWxlY3RlZEZpbGVzLmxlbmd0aCA9PT0gMCB8fCAhc2VsZWN0ZWREb2N1bWVudFR5cGVcIj5cbiAgICBVcGxvYWRcbiAgPC9idXR0b24+XG48L21hdC1kaWFsb2ctYWN0aW9ucz5cblxuPGRpdiBjbGFzcz1cIm92ZXJsYXktbG9hZGVyXCIgKm5nSWY9XCJsb2FkaW5nXCI+XG4gIDxtYXQtc3Bpbm5lciBkaWFtZXRlcj1cIjUwXCI+PC9tYXQtc3Bpbm5lcj5cbjwvZGl2PiJdfQ==