ngx-techlify-core 18.81.0 → 18.83.0

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 (28) hide show
  1. package/esm2022/lib/audit-log/audit-log-for-model/audit-log-for-model.component.mjs +2 -2
  2. package/esm2022/lib/entity-files/entity-file-list/entity-file-list.component.mjs +3 -3
  3. package/esm2022/lib/export-excel/export-excel-button/export-excel-button.component.mjs +2 -2
  4. package/esm2022/lib/number-selector/number-selector.component.mjs +118 -0
  5. package/esm2022/lib/techlify-company-switcher/techlify-company-switcher/techlify-company-switcher.component.mjs +10 -8
  6. package/esm2022/lib/timeline-activity/timeline-activity-button/timeline-activity-button.component.mjs +2 -2
  7. package/esm2022/lib/timeline-filter/timeline-filter.component.mjs +2 -2
  8. package/esm2022/lib/user-client-enable-disable-button/user-client-enable-disable-button.component.mjs +4 -4
  9. package/esm2022/lib/user-clients-list/user-clients-list.component.mjs +4 -4
  10. package/esm2022/lib/user-clients-list/{user-client.service.mjs → user-tenant.service.mjs} +10 -10
  11. package/esm2022/lib/utility/index.mjs +1 -2
  12. package/esm2022/lib/utility/utility.module.mjs +5 -7
  13. package/esm2022/public-api.mjs +2 -1
  14. package/fesm2022/ngx-techlify-core.mjs +174 -104
  15. package/fesm2022/ngx-techlify-core.mjs.map +1 -1
  16. package/lib/number-selector/number-selector.component.d.ts +44 -0
  17. package/lib/techlify-company-switcher/techlify-company-switcher/techlify-company-switcher.component.d.ts +3 -1
  18. package/lib/user-client-enable-disable-button/user-client-enable-disable-button.component.d.ts +3 -3
  19. package/lib/user-clients-list/user-clients-list.component.d.ts +3 -3
  20. package/lib/user-clients-list/user-tenant.service.d.ts +11 -0
  21. package/lib/utility/index.d.ts +0 -1
  22. package/lib/utility/utility.module.d.ts +3 -4
  23. package/package.json +1 -1
  24. package/public-api.d.ts +1 -0
  25. package/styles/style.scss +3 -3
  26. package/esm2022/lib/utility/number-selector.component.mjs +0 -42
  27. package/lib/user-clients-list/user-client.service.d.ts +0 -11
  28. package/lib/utility/number-selector.component.d.ts +0 -23
@@ -44,11 +44,11 @@ export class AuditLogForModelComponent {
44
44
  });
45
45
  }
46
46
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AuditLogForModelComponent, deps: [{ token: i1.MatDialog }], target: i0.ɵɵFactoryTarget.Component }); }
47
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: AuditLogForModelComponent, selector: "app-audit-log-for-model", inputs: { isIconView: "isIconView", modelType: "modelType", modelId: "modelId", logView: "logView" }, ngImport: i0, template: "<ng-container *ngIf=\"isIconView\">\n <app-techlify-icon *ngIf=\"logView==='recent'\" name=\"history\" matTooltip=\"Recent Audit Log\"\n (click)=\"$event.stopPropagation();getLogView()\" class=\"clickable\"></app-techlify-icon>\n <app-techlify-icon *ngIf=\"logView==='all'\" name=\"history\" matTooltip=\"All Audit Logs\"\n (click)=\"$event.stopPropagation();getLogsView()\" class=\"clickable\"></app-techlify-icon>\n</ng-container>\n\n\n<ng-container *ngIf=\"!isIconView\">\n <button type=\"button\" *ngIf=\"logView==='recent'\" mat-icon-button matTooltip=\"Recent Audit Log\"\n (click)=\"$event.stopPropagation();getLogView()\">\n <mat-icon>history</mat-icon>\n </button>\n\n <button type=\"button\" *ngIf=\"logView==='all'\" mat-icon-button matTooltip=\"All Audit Logs\"\n (click)=\"$event.stopPropagation();getLogsView()\">\n <mat-icon>history</mat-icon>\n </button>\n</ng-container>", styles: [".icon-md{height:24px!important;width:24px!important;font-size:24px!important;margin:0 1px}.icon-sm{height:20px!important;width:20px!important;font-size:20px!important}.icon-xs{height:16px!important;width:16px!important;font-size:16px!important}.fl-md{width:200px!important}.fl-md .mat-mdc-form-field{width:100%!important}.fl-sm{width:150px!important}.fl-sm .mat-mdc-form-field{width:100%!important}.mat-btn-md{height:25px!important;padding:0 8px!important}.fs-12{font-size:12px!important}.fs-16{font-size:16px!important}.fs-13{font-size:13px!important}.fs-18{font-size:18px!important}.clickable:hover{cursor:pointer}.mat-mdc-form-field-hint-wrapper{padding:0 4px!important}.nil-subscript-wrapper .mat-mdc-form-field-subscript-wrapper{height:0!important}.create-another .mat-mdc-checkbox label{margin:0!important}.create-another .mdc-checkbox{padding:0!important}.create-another .mdc-checkbox__background{position:relative;top:0;left:0}.mat-mdc-form-field.mat-form-field-disabled .mat-mdc-input-element{color:#f0f0f0!important;-webkit-text-fill-color:#f0f0f0!important}.mat-mdc-form-field.mat-form-field-disabled .mat-mdc-select-value{color:#f0f0f0!important}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i5.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: i6.TechlifyIconComponent, selector: "app-techlify-icon", inputs: ["name", "size"] }] }); }
47
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: AuditLogForModelComponent, selector: "app-audit-log-for-model", inputs: { isIconView: "isIconView", modelType: "modelType", modelId: "modelId", logView: "logView" }, ngImport: i0, template: "<ng-container *ngIf=\"isIconView\">\n <app-techlify-icon *ngIf=\"logView==='recent'\" name=\"history\" matTooltip=\"Recent Audit Log\"\n (click)=\"$event.stopPropagation();getLogView()\" class=\"clickable\"></app-techlify-icon>\n <app-techlify-icon *ngIf=\"logView==='all'\" name=\"history\" matTooltip=\"All Audit Logs\"\n (click)=\"$event.stopPropagation();getLogsView()\" class=\"clickable\"></app-techlify-icon>\n</ng-container>\n\n\n<ng-container *ngIf=\"!isIconView\">\n <button type=\"button\" *ngIf=\"logView==='recent'\" mat-icon-button matTooltip=\"Recent Audit Log\"\n (click)=\"$event.stopPropagation();getLogView()\">\n <mat-icon>history</mat-icon>\n </button>\n\n <button type=\"button\" *ngIf=\"logView==='all'\" mat-icon-button matTooltip=\"All Audit Logs\"\n (click)=\"$event.stopPropagation();getLogsView()\">\n <mat-icon>history</mat-icon>\n </button>\n</ng-container>", styles: [".icon-md{height:24px!important;width:24px!important;font-size:24px!important;margin:0 1px}.icon-sm{height:20px!important;width:20px!important;font-size:20px!important}.icon-xs{height:16px!important;width:16px!important;font-size:16px!important}.fl-md{width:200px!important}.fl-md .mat-mdc-form-field{width:100%!important}.fl-sm{width:150px!important}.fl-sm .mat-mdc-form-field{width:100%!important}.mat-btn-md{height:25px!important;padding:0 8px!important}.fs-12{font-size:12px!important}.fs-16{font-size:16px!important}.fs-13{font-size:13px!important}.fs-18{font-size:18px!important}.clickable:hover{cursor:pointer}.mat-mdc-form-field-hint-wrapper{padding:0 4px!important}.nil-subscript-wrapper .mat-mdc-form-field-subscript-wrapper{height:0!important}.create-another .mat-mdc-checkbox label{margin:0!important}.create-another .mdc-checkbox{padding:0!important}.create-another .mdc-checkbox__background{position:relative;top:0;left:0}.mat-mdc-form-field.mat-form-field-disabled .mat-mdc-input-element{color:#555!important;-webkit-text-fill-color:#555555!important}.mat-mdc-form-field.mat-form-field-disabled .mat-mdc-select-value{color:#555!important}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i5.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: i6.TechlifyIconComponent, selector: "app-techlify-icon", inputs: ["name", "size"] }] }); }
48
48
  }
49
49
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AuditLogForModelComponent, decorators: [{
50
50
  type: Component,
51
- args: [{ selector: 'app-audit-log-for-model', template: "<ng-container *ngIf=\"isIconView\">\n <app-techlify-icon *ngIf=\"logView==='recent'\" name=\"history\" matTooltip=\"Recent Audit Log\"\n (click)=\"$event.stopPropagation();getLogView()\" class=\"clickable\"></app-techlify-icon>\n <app-techlify-icon *ngIf=\"logView==='all'\" name=\"history\" matTooltip=\"All Audit Logs\"\n (click)=\"$event.stopPropagation();getLogsView()\" class=\"clickable\"></app-techlify-icon>\n</ng-container>\n\n\n<ng-container *ngIf=\"!isIconView\">\n <button type=\"button\" *ngIf=\"logView==='recent'\" mat-icon-button matTooltip=\"Recent Audit Log\"\n (click)=\"$event.stopPropagation();getLogView()\">\n <mat-icon>history</mat-icon>\n </button>\n\n <button type=\"button\" *ngIf=\"logView==='all'\" mat-icon-button matTooltip=\"All Audit Logs\"\n (click)=\"$event.stopPropagation();getLogsView()\">\n <mat-icon>history</mat-icon>\n </button>\n</ng-container>", styles: [".icon-md{height:24px!important;width:24px!important;font-size:24px!important;margin:0 1px}.icon-sm{height:20px!important;width:20px!important;font-size:20px!important}.icon-xs{height:16px!important;width:16px!important;font-size:16px!important}.fl-md{width:200px!important}.fl-md .mat-mdc-form-field{width:100%!important}.fl-sm{width:150px!important}.fl-sm .mat-mdc-form-field{width:100%!important}.mat-btn-md{height:25px!important;padding:0 8px!important}.fs-12{font-size:12px!important}.fs-16{font-size:16px!important}.fs-13{font-size:13px!important}.fs-18{font-size:18px!important}.clickable:hover{cursor:pointer}.mat-mdc-form-field-hint-wrapper{padding:0 4px!important}.nil-subscript-wrapper .mat-mdc-form-field-subscript-wrapper{height:0!important}.create-another .mat-mdc-checkbox label{margin:0!important}.create-another .mdc-checkbox{padding:0!important}.create-another .mdc-checkbox__background{position:relative;top:0;left:0}.mat-mdc-form-field.mat-form-field-disabled .mat-mdc-input-element{color:#f0f0f0!important;-webkit-text-fill-color:#f0f0f0!important}.mat-mdc-form-field.mat-form-field-disabled .mat-mdc-select-value{color:#f0f0f0!important}\n"] }]
51
+ args: [{ selector: 'app-audit-log-for-model', template: "<ng-container *ngIf=\"isIconView\">\n <app-techlify-icon *ngIf=\"logView==='recent'\" name=\"history\" matTooltip=\"Recent Audit Log\"\n (click)=\"$event.stopPropagation();getLogView()\" class=\"clickable\"></app-techlify-icon>\n <app-techlify-icon *ngIf=\"logView==='all'\" name=\"history\" matTooltip=\"All Audit Logs\"\n (click)=\"$event.stopPropagation();getLogsView()\" class=\"clickable\"></app-techlify-icon>\n</ng-container>\n\n\n<ng-container *ngIf=\"!isIconView\">\n <button type=\"button\" *ngIf=\"logView==='recent'\" mat-icon-button matTooltip=\"Recent Audit Log\"\n (click)=\"$event.stopPropagation();getLogView()\">\n <mat-icon>history</mat-icon>\n </button>\n\n <button type=\"button\" *ngIf=\"logView==='all'\" mat-icon-button matTooltip=\"All Audit Logs\"\n (click)=\"$event.stopPropagation();getLogsView()\">\n <mat-icon>history</mat-icon>\n </button>\n</ng-container>", styles: [".icon-md{height:24px!important;width:24px!important;font-size:24px!important;margin:0 1px}.icon-sm{height:20px!important;width:20px!important;font-size:20px!important}.icon-xs{height:16px!important;width:16px!important;font-size:16px!important}.fl-md{width:200px!important}.fl-md .mat-mdc-form-field{width:100%!important}.fl-sm{width:150px!important}.fl-sm .mat-mdc-form-field{width:100%!important}.mat-btn-md{height:25px!important;padding:0 8px!important}.fs-12{font-size:12px!important}.fs-16{font-size:16px!important}.fs-13{font-size:13px!important}.fs-18{font-size:18px!important}.clickable:hover{cursor:pointer}.mat-mdc-form-field-hint-wrapper{padding:0 4px!important}.nil-subscript-wrapper .mat-mdc-form-field-subscript-wrapper{height:0!important}.create-another .mat-mdc-checkbox label{margin:0!important}.create-another .mdc-checkbox{padding:0!important}.create-another .mdc-checkbox__background{position:relative;top:0;left:0}.mat-mdc-form-field.mat-form-field-disabled .mat-mdc-input-element{color:#555!important;-webkit-text-fill-color:#555555!important}.mat-mdc-form-field.mat-form-field-disabled .mat-mdc-select-value{color:#555!important}\n"] }]
52
52
  }], ctorParameters: () => [{ type: i1.MatDialog }], propDecorators: { isIconView: [{
53
53
  type: Input
54
54
  }], modelType: [{
@@ -192,11 +192,11 @@ export class EntityFileListComponent extends TechlifyListComponent {
192
192
  }
193
193
  }
194
194
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: EntityFileListComponent, deps: [{ token: i1.EntityFileService }, { token: i2.AlertService }, { token: i3.UntypedFormBuilder }, { token: i4.ErrorHandlerService }, { token: i5.NgxPermissionsService }], target: i0.ɵɵFactoryTarget.Component }); }
195
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: EntityFileListComponent, selector: "app-entity-file-list, app-entity-files-view-all", inputs: { entityId: "entityId", entityType: "entityType", viewOnly: "viewOnly", removeSearch: "removeSearch", hideTitleAndDetails: "hideTitleAndDetails", displayMode: "displayMode", allowMultipleFiles: "allowMultipleFiles", allowBulkUpdate: "allowBulkUpdate", viewMode: "viewMode", fileDropperHeight: "fileDropperHeight", isShowDragDropSection: "isShowDragDropSection", isFilterPatchFromRoute: "isFilterPatchFromRoute", useTechlifyTags: "useTechlifyTags", techlifyTagCategories: "techlifyTagCategories", techlifyTagConfig: "techlifyTagConfig", title: "title", permission: "permission" }, usesInheritance: true, ngImport: i0, template: "<div *ngIf=\"viewMode === 'list'\">\n <div *ngIf=\"this.selectedModelIds.length\" class=\"d-none d-md-flex flex-column\">\n <mat-card class=\"update_card\" *ngIf=\"this.selectedModelIds.length\">\n <mat-card-header>\n <mat-card-title>\n <div mat-dialog-title class=\"mt-2 ml-2 text-center\">\n <div>Update Selected Rows</div>\n </div>\n </mat-card-title>\n </mat-card-header>\n <mat-card-content class=\"d-flex flex-column\">\n <form [formGroup]=\"updateRowForm\">\n <div class=\"d-flex flex-column\">\n\n <mat-form-field class=\"w-100 px-1\">\n <input matInput formControlName=\"title\" placeholder=\"Title\" autocomplete=\"off\" />\n <button *ngIf=\"updateRowForm.get('title').value || updateRowForm.get('title').value===0\" matSuffix\n mat-icon-button style=\"color:red\" (click)=\"updateRowForm.get('title').setValue('')\">\n <mat-icon>close</mat-icon>\n </button>\n <button matSuffix mat-icon-button type=\"button\" style=\"color:green\" *ngIf=\"(updateRowForm.get('title').value || updateRowForm.get('title').value===0)\n && updateRowForm.get('title').valid\" (click)=\"bulkUpdate('title')\">\n <mat-icon>done</mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field class=\"w-100 px-1\">\n <textarea matInput formControlName=\"details\" placeholder=\"Details\" autocomplete=\"off\"></textarea>\n <button *ngIf=\"updateRowForm.get('details').value || updateRowForm.get('details').value===0\" matSuffix\n mat-icon-button style=\"color:red\" (click)=\"updateRowForm.get('details').setValue('')\">\n <mat-icon>close</mat-icon>\n </button>\n <button matSuffix mat-icon-button type=\"button\" style=\"color:green\" *ngIf=\"(updateRowForm.get('details').value || updateRowForm.get('details').value===0)\n && updateRowForm.get('details').valid\" (click)=\"bulkUpdate('details')\">\n <mat-icon>done</mat-icon>\n </button>\n </mat-form-field>\n\n <ng-container *ngIf=\"useTechlifyTags\">\n <mat-form-field>\n <mat-label>Tag</mat-label>\n <app-techlify-tagger-tag-form-field modelType=\"entity-file\" formControlName=\"tag_ids\"\n placeholder=\"Enter new tag\">\n </app-techlify-tagger-tag-form-field>\n <button *ngIf=\"updateRowForm.get('tag_ids').value || updateRowForm.get('tag_ids').value===0\" matSuffix\n mat-icon-button style=\"color:red\" (click)=\"updateRowForm.get('tag_ids').setValue('')\">\n <mat-icon>close</mat-icon>\n </button>\n <button matSuffix mat-icon-button type=\"button\" style=\"color:green\" *ngIf=\"(updateRowForm.get('tag_ids').value || updateRowForm.get('tag_ids').value===0)\n && updateRowForm.get('tag_ids').valid\" (click)=\"bulkUpdate('tag_ids')\">\n <mat-icon>done</mat-icon>\n </button>\n </mat-form-field>\n </ng-container>\n </div>\n </form>\n </mat-card-content>\n </mat-card>\n\n </div>\n\n <div>\n <div class=\"mat-typography\" *ngIf=\"!displayMode\">\n <div class=\"d-flex flex-row gap-3\">\n <div class=\"d-flex flex-column gap-2 flex-grow-1\">\n <mat-card>\n <mat-card-content>\n <div class=\"d-flex gap-2 align-items-center\">\n <mat-icon>\n description\n </mat-icon>\n <h3 class=\"font-weight-bold mb-0\">\n {{title}}s\n </h3>\n <app-techlify-form-button class=\"ms-2\" *ngIf=\"!viewOnly && isShowCreateAction && entityId\"\n [component]=\"entityFileForm()\" [data]=\"formData\"\n (saved)=\"modelCreated($event)\"></app-techlify-form-button>\n <span class=\"flex-grow-1\"></span>\n <form [formGroup]=\"filterForm\" class=\"d-flex gap-2\">\n <mat-form-field *ngIf=\"!removeSearch\" appearance=\"outline\">\n <mat-label>Search</mat-label>\n <input type=\"text\" matInput formControlName=\"title\" placeholder=\"Search\" name=\"title\"\n autocomplete=\"off\" />\n <button *ngIf=\"filterForm.get('title').value\" matSuffix mat-icon-button\n (click)=\"resetFilter('title')\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <ng-container *ngIf=\"useTechlifyTags\">\n <mat-form-field>\n <mat-label>Tag</mat-label>\n <app-techlify-tagger-tag-form-field [categories]=\"techlifyTagCategories\" formControlName=\"tag_ids\"\n placeholder=\"Select Tags\" [config]=\"techlifyTagConfig\"></app-techlify-tagger-tag-form-field>\n </mat-form-field>\n </ng-container>\n\n <app-timeline-filter class=\"fl-sm\" formControlName='period_id' labelText=\"Expires On\"\n dateFrom=\"expires_on_from\" dateTo=\"expires_on_to\" [form]=\"filterForm\"></app-timeline-filter>\n </form>\n </div>\n </mat-card-content>\n <mat-card-content class=\"entity-file-card p-0\" *ngIf=\"entityId\">\n <ng-container *ngTemplateOutlet=\"tableView\"></ng-container>\n </mat-card-content>\n </mat-card>\n\n <mat-card *ngIf=\"!entityId\">\n <mat-card-content class=\"entity-file-card p-0\">\n <ng-container *ngTemplateOutlet=\"tableView\"></ng-container>\n </mat-card-content>\n </mat-card>\n </div>\n <ng-container *ngIf=\"isShowDragDropSection && entityId\">\n <section style=\"flex: 0 1 30%;\" *ngIf=\"!this.selectedModelIds.length && !viewOnly && isShowCreateAction\">\n <app-file-dropper [config]=\"fileConfig\" (fileChanged)=\"fileChanged($event)\">\n </app-file-dropper>\n </section>\n </ng-container>\n </div>\n </div>\n </div>\n\n <ng-template #tableView>\n <table mat-table [dataSource]=\"models\" class=\"w-100\" matSort multiTemplateDataRows infiniteScroll\n [infiniteScrollDistance]=\"1.5\" [infiniteScrollThrottle]=\"50\" (scrolled)=\"onScroll()\">\n\n <!-- Select Column -->\n <ng-container matColumnDef=\"select\">\n <th mat-header-cell *matHeaderCellDef style=\"width:30px\">\n <mat-checkbox name=\"employee\" [(ngModel)]=\"isAllSelected\" (change)=\"selectAll()\">\n </mat-checkbox>\n </th>\n <td mat-cell *matCellDef=\"let element\" style=\"width:30px\">\n <mat-checkbox name=\"employee[{{element?.id}}]\" (click)=\"$event.stopPropagation()\"\n [(ngModel)]=\"element.is_selected\" (change)=\"isSelectionModified($event, element)\"\n [disabled]=\"!models.length\">\n </mat-checkbox>\n </td>\n </ng-container>\n\n <!-- Index Column -->\n <ng-container matColumnDef=\"index\">\n <th mat-header-cell *matHeaderCellDef> # </th>\n <td mat-cell *matCellDef=\"let element; let i = dataIndex\"> {{ i+1 }} </td>\n </ng-container>\n\n <!-- Title Column -->\n <ng-container matColumnDef=\"title\">\n <th mat-header-cell *matHeaderCellDef> Title </th>\n <td mat-cell *matCellDef=\"let element\">\n {{element.title}}\n <ng-container *ngIf=\"useTechlifyTags\">\n <br>\n <small class=\"badge badge-secondary mr-1\" *ngFor=\"let tag of element?.tags\">{{tag?.title}}</small>\n </ng-container>\n\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"expires_on\">\n <th mat-header-cell *matHeaderCellDef> Expires On </th>\n <td mat-cell *matCellDef=\"let element\">\n {{element?.expires_on | date:'mediumDate'}}\n </td>\n </ng-container>\n\n <!-- Details Column -->\n <ng-container matColumnDef=\"details\">\n <th mat-header-cell *matHeaderCellDef> Details </th>\n <td mat-cell *matCellDef=\"let element\">\n <app-read-more [text]=\"element.details\" [maxLength]=\"50\"></app-read-more>\n </td>\n </ng-container>\n\n <!-- File size Column -->\n <ng-container matColumnDef=\"file_size\">\n <th mat-header-cell *matHeaderCellDef> File Size </th>\n <td mat-cell *matCellDef=\"let element\"> {{ element.file_size | fileSize }} </td>\n </ng-container>\n\n <!-- Uploaded On Column -->\n <ng-container matColumnDef=\"uploaded_on\">\n <th mat-header-cell *matHeaderCellDef> Uploaded On </th>\n <td mat-cell *matCellDef=\"let element\">\n <div>\n {{element.created_at | date: 'mediumDate'}}\n </div>\n <div class=\"text-muted\">\n By {{element.creator?.name}}\n </div>\n </td>\n </ng-container>\n\n <!-- Actions Column -->\n <ng-container matColumnDef=\"actions\">\n <th mat-header-cell *matHeaderCellDef> Actions </th>\n <td mat-cell *matCellDef=\"let element\" class=\"text-muted\">\n <div class=\"d-flex flex-row gap-2 text-secondary align-items-center\">\n <a href=\"{{element.url}}\" target=\"_blank\" class=\"text-decoration-none text-muted clickable\">\n <mat-icon>download</mat-icon>\n </a>\n <app-techlify-form-button *ngIf=\"!viewOnly && isShowUpdateAction\" [component]=\"entityFileForm()\"\n [model]=\"element\" [data]=\"formData\" (saved)=\"modelsUpdatedById($event)\"></app-techlify-form-button>\n <app-techlify-delete-button *ngIf=\"!viewOnly && isShowDeleteAction\" [model]=\"element\" [service]=\"service\"\n message=\"Are you sure to proceed delete the file {{element.title}}\"\n (deleted)=\"modelsDeletedById(element)\">\n </app-techlify-delete-button>\n </div>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n </table>\n\n <mat-progress-bar mode=\"indeterminate\" *ngIf=\"isWorking\"></mat-progress-bar>\n </ng-template>\n\n <div class=\"d-flex flex-wrap gap-3 mat-typography p-4\" *ngIf=\"displayMode\">\n <div *ngFor=\"let efile of models\">\n <app-document-viewer [file]=\"efile.file\" [fileUrl]=\"efile.url\" [config]=\"this.viewerConfig\" [disableEdit]=\"true\">\n </app-document-viewer>\n <a href=\"{{efile.url}}\" target=\"_blank\">\n <button mat-button type=\"button\">View</button>\n </a>\n </div>\n </div>\n</div>\n\n<mat-card *ngIf=\"viewMode === 'timeline'\">\n <mat-card-content>\n <div class=\"d-flex justify-content-start align-items-center gap-2\">\n <mat-icon>\n description\n </mat-icon>\n <h3 class=\"font-weight-bold mb-0\">\n {{title}}s\n </h3>\n <app-techlify-form-button *ngIf=\"!viewOnly && isShowCreateAction\" [component]=\"entityFileForm()\" [data]=\"formData\"\n (saved)=\"modelCreated($event)\"></app-techlify-form-button>\n </div>\n </mat-card-content>\n <mat-card-content *ngIf=\"!this.selectedModelIds.length && !viewOnly && isShowCreateAction\" class=\"mt-3\">\n <app-file-dropper [config]=\"fileConfig\" (fileChanged)=\"fileChanged($event)\">\n </app-file-dropper>\n </mat-card-content>\n\n <mat-card-content class=\"mt-3\">\n <div *ngFor=\"let entityFile of models\" class=\"d-flex flex-column gap-0\">\n <div class=\"d-flex flex-column gap-0\">\n <div class=\"d-flex justify-content-between align-items-center gap-1\">\n <p class=\"mb-0 fw-bold text-wrap\">{{ entityFile?.title | wrap:20 }}</p>\n <span class=\"badge bg-dark\" *ngFor=\"let tag of entityFile?.tags\">\n {{ tag?.title }}\n </span>\n <small class=\"text-dark\">{{ entityFile.file_size | fileSize }}</small>\n </div>\n </div>\n <app-read-more [text]=\"entityFile?.details\" [maxLength]=\"50\"></app-read-more>\n <div class=\"d-flex justify-content-between gap-2\">\n <small class=\"text-secondary\" style=\"max-width: 70%\">\n <i>Uploaded By {{ entityFile?.creator?.name }} {{ entityFile?.created_at | date: 'mediumDate'}}</i>\n </small>\n <div class=\"d-flex justify-content-end align-items-center gap-1\">\n <a href=\"{{entityFile?.url}}\" target=\"_blank\" class=\"text-decoration-none text-secondary mt-2\">\n <mat-icon>download</mat-icon>\n </a>\n <app-techlify-form-button class=\"text-secondary\" *ngIf=\"!viewOnly && isShowUpdateAction\"\n [component]=\"entityFileForm()\" [model]=\"entityFile\" [data]=\"formData\"\n (saved)=\"modelsUpdatedById($event)\"></app-techlify-form-button>\n <app-techlify-delete-button *ngIf=\"!viewOnly && isShowDeleteAction\" class='text-secondary ms-1'\n [model]=\"entityFile\" [service]=\"service\"\n message=\"Are you sure to proceed delete the file {{entityFile.title}}\"\n (deleted)=\"modelsDeletedById(entityFile)\">\n </app-techlify-delete-button>\n </div>\n </div>\n <hr style=\"margin: 0.5rem 0\">\n </div>\n <mat-progress-bar mode=\"indeterminate\" *ngIf=\"isWorking\"></mat-progress-bar>\n </mat-card-content>\n</mat-card>", styles: ["th.mat-header-cell,td.mat-cell,td.mat-footer-cell{padding:2px}.entity-file-card{overflow-x:auto}.clickable:hover{cursor:pointer}\n"], dependencies: [{ kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i7.InfiniteScrollDirective, selector: "[infiniteScroll], [infinite-scroll], [data-infinite-scroll]", inputs: ["infiniteScrollDistance", "infiniteScrollUpDistance", "infiniteScrollThrottle", "infiniteScrollDisabled", "infiniteScrollContainer", "scrollWindow", "immediateCheck", "horizontal", "alwaysCallback", "fromRoot"], outputs: ["scrolled", "scrolledUp"] }, { kind: "component", type: i8.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i8.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i9.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "directive", type: i10.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "component", type: i11.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i11.MatLabel, selector: "mat-label" }, { kind: "directive", type: i11.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: i12.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i13.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "directive", type: i14.MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i15.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i15.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i15.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i15.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i15.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i15.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i15.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i15.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i15.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i15.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i16.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i16.MatCardContent, selector: "mat-card-content" }, { kind: "component", type: i16.MatCardHeader, selector: "mat-card-header" }, { kind: "directive", type: i16.MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }, { kind: "component", type: i17.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i18.TechlifyDeleteButtonComponent, selector: "app-techlify-delete-button", inputs: ["data", "model", "message", "service"], outputs: ["deleted"] }, { kind: "component", type: i19.TimelineFilterComponent, selector: "app-timeline-filter", inputs: ["defaultValue", "required", "disabled", "value", "timelines", "dateFrom", "dateTo", "appearance", "showClearButton", "form", "labelText"], outputs: ["selectionChange"] }, { kind: "component", type: i20.TechlifyFormButtonComponent, selector: "app-techlify-form-button", inputs: ["component", "model", "data", "width"], outputs: ["saved"] }, { kind: "component", type: i21.FileDropperComponent, selector: "app-file-dropper", inputs: ["fileArray", "config", "styles"], outputs: ["fileChanged"] }, { kind: "component", type: i22.DocumentViewerComponent, selector: "app-document-viewer", inputs: ["config", "file", "fileUrl", "disableEdit"], outputs: ["remove"] }, { kind: "component", type: i23.TechlifyTaggerTagFormFieldComponent, selector: "app-techlify-tagger-tag-form-field", inputs: ["config", "modelType", "modelId", "allTags", "categories", "defaultCreateCategory", "required", "disabled", "value", "placeholder"] }, { kind: "component", type: i24.ReadMoreComponent, selector: "app-read-more", inputs: ["text", "maxLength"] }, { kind: "pipe", type: i6.DatePipe, name: "date" }, { kind: "pipe", type: i25.WrapPipe, name: "wrap" }, { kind: "pipe", type: i26.FileSizePipe, name: "fileSize" }] }); }
195
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: EntityFileListComponent, selector: "app-entity-file-list, app-entity-files-view-all", inputs: { entityId: "entityId", entityType: "entityType", viewOnly: "viewOnly", removeSearch: "removeSearch", hideTitleAndDetails: "hideTitleAndDetails", displayMode: "displayMode", allowMultipleFiles: "allowMultipleFiles", allowBulkUpdate: "allowBulkUpdate", viewMode: "viewMode", fileDropperHeight: "fileDropperHeight", isShowDragDropSection: "isShowDragDropSection", isFilterPatchFromRoute: "isFilterPatchFromRoute", useTechlifyTags: "useTechlifyTags", techlifyTagCategories: "techlifyTagCategories", techlifyTagConfig: "techlifyTagConfig", title: "title", permission: "permission" }, usesInheritance: true, ngImport: i0, template: "<div *ngIf=\"viewMode === 'list'\">\n <div *ngIf=\"this.selectedModelIds.length\" class=\"d-none d-md-flex flex-column\">\n <mat-card class=\"update_card\" *ngIf=\"this.selectedModelIds.length\">\n <mat-card-header>\n <mat-card-title>\n <div mat-dialog-title class=\"mt-2 ml-2 text-center\">\n <div>Update Selected Rows</div>\n </div>\n </mat-card-title>\n </mat-card-header>\n <mat-card-content class=\"d-flex flex-column\">\n <form [formGroup]=\"updateRowForm\">\n <div class=\"d-flex flex-column\">\n\n <mat-form-field class=\"w-100 px-1\">\n <input matInput formControlName=\"title\" placeholder=\"Title\" autocomplete=\"off\" />\n <button *ngIf=\"updateRowForm.get('title').value || updateRowForm.get('title').value===0\" matSuffix\n mat-icon-button style=\"color:red\" (click)=\"updateRowForm.get('title').setValue('')\">\n <mat-icon>close</mat-icon>\n </button>\n <button matSuffix mat-icon-button type=\"button\" style=\"color:green\" *ngIf=\"(updateRowForm.get('title').value || updateRowForm.get('title').value===0)\n && updateRowForm.get('title').valid\" (click)=\"bulkUpdate('title')\">\n <mat-icon>done</mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field class=\"w-100 px-1\">\n <textarea matInput formControlName=\"details\" placeholder=\"Details\" autocomplete=\"off\"></textarea>\n <button *ngIf=\"updateRowForm.get('details').value || updateRowForm.get('details').value===0\" matSuffix\n mat-icon-button style=\"color:red\" (click)=\"updateRowForm.get('details').setValue('')\">\n <mat-icon>close</mat-icon>\n </button>\n <button matSuffix mat-icon-button type=\"button\" style=\"color:green\" *ngIf=\"(updateRowForm.get('details').value || updateRowForm.get('details').value===0)\n && updateRowForm.get('details').valid\" (click)=\"bulkUpdate('details')\">\n <mat-icon>done</mat-icon>\n </button>\n </mat-form-field>\n\n <ng-container *ngIf=\"useTechlifyTags\">\n <mat-form-field>\n <mat-label>Tag</mat-label>\n <app-techlify-tagger-tag-form-field modelType=\"entity-file\" formControlName=\"tag_ids\"\n placeholder=\"Enter new tag\">\n </app-techlify-tagger-tag-form-field>\n <button *ngIf=\"updateRowForm.get('tag_ids').value || updateRowForm.get('tag_ids').value===0\" matSuffix\n mat-icon-button style=\"color:red\" (click)=\"updateRowForm.get('tag_ids').setValue('')\">\n <mat-icon>close</mat-icon>\n </button>\n <button matSuffix mat-icon-button type=\"button\" style=\"color:green\" *ngIf=\"(updateRowForm.get('tag_ids').value || updateRowForm.get('tag_ids').value===0)\n && updateRowForm.get('tag_ids').valid\" (click)=\"bulkUpdate('tag_ids')\">\n <mat-icon>done</mat-icon>\n </button>\n </mat-form-field>\n </ng-container>\n </div>\n </form>\n </mat-card-content>\n </mat-card>\n\n </div>\n\n <div>\n <div class=\"mat-typography\" *ngIf=\"!displayMode\">\n <div class=\"d-flex flex-row gap-3\">\n <div class=\"d-flex flex-column gap-2 flex-grow-1\">\n <mat-card>\n <mat-card-content>\n <div class=\"d-flex gap-2 align-items-center\">\n <mat-icon>\n description\n </mat-icon>\n <h3 class=\"font-weight-bold mb-0\">\n {{title}}s\n </h3>\n <app-techlify-form-button class=\"ms-2\" *ngIf=\"!viewOnly && isShowCreateAction && entityId\"\n [component]=\"entityFileForm()\" [data]=\"formData\"\n (saved)=\"modelCreated($event)\"></app-techlify-form-button>\n <span class=\"flex-grow-1\"></span>\n <form [formGroup]=\"filterForm\" class=\"d-flex gap-2\">\n <mat-form-field *ngIf=\"!removeSearch\" appearance=\"outline\">\n <mat-label>Search</mat-label>\n <input type=\"text\" matInput formControlName=\"title\" placeholder=\"Search\" name=\"title\"\n autocomplete=\"off\" />\n <button *ngIf=\"filterForm.get('title').value\" matSuffix mat-icon-button\n (click)=\"resetFilter('title')\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <ng-container *ngIf=\"useTechlifyTags\">\n <mat-form-field>\n <mat-label>Tag</mat-label>\n <app-techlify-tagger-tag-form-field [categories]=\"techlifyTagCategories\" formControlName=\"tag_ids\"\n placeholder=\"Select Tags\" [config]=\"techlifyTagConfig\"></app-techlify-tagger-tag-form-field>\n </mat-form-field>\n </ng-container>\n\n <app-timeline-filter class=\"fl-sm\" formControlName='period_id' labelText=\"Expires On\"\n dateFrom=\"expires_on_from\" dateTo=\"expires_on_to\" [form]=\"filterForm\"></app-timeline-filter>\n </form>\n </div>\n </mat-card-content>\n <mat-card-content class=\"entity-file-card p-0\" *ngIf=\"entityId\">\n <ng-container *ngTemplateOutlet=\"tableView\"></ng-container>\n </mat-card-content>\n </mat-card>\n\n <mat-card *ngIf=\"!entityId\">\n <mat-card-content class=\"entity-file-card p-0\">\n <ng-container *ngTemplateOutlet=\"tableView\"></ng-container>\n </mat-card-content>\n </mat-card>\n </div>\n <ng-container *ngIf=\"isShowDragDropSection && entityId\">\n <section style=\"flex: 0 1 30%;\" *ngIf=\"!this.selectedModelIds.length && !viewOnly && isShowCreateAction\">\n <app-file-dropper [config]=\"fileConfig\" (fileChanged)=\"fileChanged($event)\">\n </app-file-dropper>\n </section>\n </ng-container>\n </div>\n </div>\n </div>\n\n <ng-template #tableView>\n <table mat-table [dataSource]=\"models\" class=\"w-100\" matSort multiTemplateDataRows infiniteScroll\n [infiniteScrollDistance]=\"1.5\" [infiniteScrollThrottle]=\"50\" (scrolled)=\"onScroll()\">\n\n <!-- Select Column -->\n <ng-container matColumnDef=\"select\">\n <th mat-header-cell *matHeaderCellDef style=\"width:30px\">\n <mat-checkbox name=\"employee\" [(ngModel)]=\"isAllSelected\" (change)=\"selectAll()\">\n </mat-checkbox>\n </th>\n <td mat-cell *matCellDef=\"let element\" style=\"width:30px\">\n <mat-checkbox name=\"employee[{{element?.id}}]\" (click)=\"$event.stopPropagation()\"\n [(ngModel)]=\"element.is_selected\" (change)=\"isSelectionModified($event, element)\"\n [disabled]=\"!models.length\">\n </mat-checkbox>\n </td>\n </ng-container>\n\n <!-- Index Column -->\n <ng-container matColumnDef=\"index\">\n <th mat-header-cell *matHeaderCellDef> # </th>\n <td mat-cell *matCellDef=\"let element; let i = dataIndex\"> {{ i+1 }} </td>\n </ng-container>\n\n <!-- Title Column -->\n <ng-container matColumnDef=\"title\">\n <th mat-header-cell *matHeaderCellDef> Title </th>\n <td mat-cell *matCellDef=\"let element\">\n {{element.title}}\n <ng-container *ngIf=\"useTechlifyTags\">\n <br>\n <small class=\"badge badge-secondary mr-1\" *ngFor=\"let tag of element?.tags\">{{tag?.title}}</small>\n </ng-container>\n\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"expires_on\">\n <th mat-header-cell *matHeaderCellDef> Expires On </th>\n <td mat-cell *matCellDef=\"let element\">\n {{element?.expires_on | date:'mediumDate'}}\n </td>\n </ng-container>\n\n <!-- Details Column -->\n <ng-container matColumnDef=\"details\">\n <th mat-header-cell *matHeaderCellDef> Details </th>\n <td mat-cell *matCellDef=\"let element\">\n <app-read-more [text]=\"element.details\" [maxLength]=\"50\"></app-read-more>\n </td>\n </ng-container>\n\n <!-- File size Column -->\n <ng-container matColumnDef=\"file_size\">\n <th mat-header-cell *matHeaderCellDef> File Size </th>\n <td mat-cell *matCellDef=\"let element\">\n <span *ngIf=\"element?.file_size\"> {{ element.file_size | fileSize }} </span>\n </td>\n </ng-container>\n\n <!-- Uploaded On Column -->\n <ng-container matColumnDef=\"uploaded_on\">\n <th mat-header-cell *matHeaderCellDef> Uploaded On </th>\n <td mat-cell *matCellDef=\"let element\">\n <div>\n {{element.created_at | date: 'mediumDate'}}\n </div>\n <div class=\"text-muted\" *ngIf=\"element.creator\">\n By {{element.creator?.name}}\n </div>\n </td>\n </ng-container>\n\n <!-- Actions Column -->\n <ng-container matColumnDef=\"actions\">\n <th mat-header-cell *matHeaderCellDef> Actions </th>\n <td mat-cell *matCellDef=\"let element\" class=\"text-muted\">\n <div class=\"d-flex flex-row gap-2 text-secondary align-items-center\">\n <a href=\"{{element.url}}\" target=\"_blank\" class=\"text-decoration-none text-muted clickable\">\n <mat-icon>download</mat-icon>\n </a>\n <app-techlify-form-button *ngIf=\"!viewOnly && isShowUpdateAction\" [component]=\"entityFileForm()\"\n [model]=\"element\" [data]=\"formData\" (saved)=\"modelsUpdatedById($event)\"></app-techlify-form-button>\n <app-techlify-delete-button *ngIf=\"!viewOnly && isShowDeleteAction\" [model]=\"element\" [service]=\"service\"\n message=\"Are you sure to proceed delete the file {{element.title}}\"\n (deleted)=\"modelsDeletedById(element)\">\n </app-techlify-delete-button>\n </div>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n </table>\n\n <mat-progress-bar mode=\"indeterminate\" *ngIf=\"isWorking\"></mat-progress-bar>\n </ng-template>\n\n <div class=\"d-flex flex-wrap gap-3 mat-typography p-4\" *ngIf=\"displayMode\">\n <div *ngFor=\"let efile of models\">\n <app-document-viewer [file]=\"efile.file\" [fileUrl]=\"efile.url\" [config]=\"this.viewerConfig\" [disableEdit]=\"true\">\n </app-document-viewer>\n <a href=\"{{efile.url}}\" target=\"_blank\">\n <button mat-button type=\"button\">View</button>\n </a>\n </div>\n </div>\n</div>\n\n<mat-card *ngIf=\"viewMode === 'timeline'\">\n <mat-card-content>\n <div class=\"d-flex justify-content-start align-items-center gap-2\">\n <mat-icon>\n description\n </mat-icon>\n <h3 class=\"font-weight-bold mb-0\">\n {{title}}s\n </h3>\n <app-techlify-form-button *ngIf=\"!viewOnly && isShowCreateAction\" [component]=\"entityFileForm()\" [data]=\"formData\"\n (saved)=\"modelCreated($event)\"></app-techlify-form-button>\n </div>\n </mat-card-content>\n <mat-card-content *ngIf=\"!this.selectedModelIds.length && !viewOnly && isShowCreateAction\" class=\"mt-3\">\n <app-file-dropper [config]=\"fileConfig\" (fileChanged)=\"fileChanged($event)\">\n </app-file-dropper>\n </mat-card-content>\n\n <mat-card-content class=\"mt-3\">\n <div *ngFor=\"let entityFile of models\" class=\"d-flex flex-column gap-0\">\n <div class=\"d-flex flex-column gap-0\">\n <div class=\"d-flex justify-content-between align-items-center gap-1\">\n <p class=\"mb-0 fw-bold text-wrap\">{{ entityFile?.title | wrap:20 }}</p>\n <span class=\"badge bg-dark\" *ngFor=\"let tag of entityFile?.tags\">\n {{ tag?.title }}\n </span>\n <small class=\"text-dark\">{{ entityFile.file_size | fileSize }}</small>\n </div>\n </div>\n <app-read-more [text]=\"entityFile?.details\" [maxLength]=\"50\"></app-read-more>\n <div class=\"d-flex justify-content-between gap-2\">\n <small class=\"text-secondary\" style=\"max-width: 70%\">\n <i>Uploaded By {{ entityFile?.creator?.name }} {{ entityFile?.created_at | date: 'mediumDate'}}</i>\n </small>\n <div class=\"d-flex justify-content-end align-items-center gap-1\">\n <a href=\"{{entityFile?.url}}\" target=\"_blank\" class=\"text-decoration-none text-secondary mt-2\">\n <mat-icon>download</mat-icon>\n </a>\n <app-techlify-form-button class=\"text-secondary\" *ngIf=\"!viewOnly && isShowUpdateAction\"\n [component]=\"entityFileForm()\" [model]=\"entityFile\" [data]=\"formData\"\n (saved)=\"modelsUpdatedById($event)\"></app-techlify-form-button>\n <app-techlify-delete-button *ngIf=\"!viewOnly && isShowDeleteAction\" class='text-secondary ms-1'\n [model]=\"entityFile\" [service]=\"service\"\n message=\"Are you sure to proceed delete the file {{entityFile.title}}\"\n (deleted)=\"modelsDeletedById(entityFile)\">\n </app-techlify-delete-button>\n </div>\n </div>\n <hr style=\"margin: 0.5rem 0\">\n </div>\n <mat-progress-bar mode=\"indeterminate\" *ngIf=\"isWorking\"></mat-progress-bar>\n </mat-card-content>\n</mat-card>", styles: ["th.mat-header-cell,td.mat-cell,td.mat-footer-cell{padding:2px}.entity-file-card{overflow-x:auto}.clickable:hover{cursor:pointer}\n"], dependencies: [{ kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i7.InfiniteScrollDirective, selector: "[infiniteScroll], [infinite-scroll], [data-infinite-scroll]", inputs: ["infiniteScrollDistance", "infiniteScrollUpDistance", "infiniteScrollThrottle", "infiniteScrollDisabled", "infiniteScrollContainer", "scrollWindow", "immediateCheck", "horizontal", "alwaysCallback", "fromRoot"], outputs: ["scrolled", "scrolledUp"] }, { kind: "component", type: i8.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i8.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i9.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "directive", type: i10.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "component", type: i11.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i11.MatLabel, selector: "mat-label" }, { kind: "directive", type: i11.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: i12.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i13.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "directive", type: i14.MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i15.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i15.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i15.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i15.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i15.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i15.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i15.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i15.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i15.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i15.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i16.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i16.MatCardContent, selector: "mat-card-content" }, { kind: "component", type: i16.MatCardHeader, selector: "mat-card-header" }, { kind: "directive", type: i16.MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }, { kind: "component", type: i17.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i18.TechlifyDeleteButtonComponent, selector: "app-techlify-delete-button", inputs: ["data", "model", "message", "service"], outputs: ["deleted"] }, { kind: "component", type: i19.TimelineFilterComponent, selector: "app-timeline-filter", inputs: ["defaultValue", "required", "disabled", "value", "timelines", "dateFrom", "dateTo", "appearance", "showClearButton", "form", "labelText"], outputs: ["selectionChange"] }, { kind: "component", type: i20.TechlifyFormButtonComponent, selector: "app-techlify-form-button", inputs: ["component", "model", "data", "width"], outputs: ["saved"] }, { kind: "component", type: i21.FileDropperComponent, selector: "app-file-dropper", inputs: ["fileArray", "config", "styles"], outputs: ["fileChanged"] }, { kind: "component", type: i22.DocumentViewerComponent, selector: "app-document-viewer", inputs: ["config", "file", "fileUrl", "disableEdit"], outputs: ["remove"] }, { kind: "component", type: i23.TechlifyTaggerTagFormFieldComponent, selector: "app-techlify-tagger-tag-form-field", inputs: ["config", "modelType", "modelId", "allTags", "categories", "defaultCreateCategory", "required", "disabled", "value", "placeholder"] }, { kind: "component", type: i24.ReadMoreComponent, selector: "app-read-more", inputs: ["text", "maxLength"] }, { kind: "pipe", type: i6.DatePipe, name: "date" }, { kind: "pipe", type: i25.WrapPipe, name: "wrap" }, { kind: "pipe", type: i26.FileSizePipe, name: "fileSize" }] }); }
196
196
  }
197
197
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: EntityFileListComponent, decorators: [{
198
198
  type: Component,
199
- args: [{ selector: 'app-entity-file-list, app-entity-files-view-all', template: "<div *ngIf=\"viewMode === 'list'\">\n <div *ngIf=\"this.selectedModelIds.length\" class=\"d-none d-md-flex flex-column\">\n <mat-card class=\"update_card\" *ngIf=\"this.selectedModelIds.length\">\n <mat-card-header>\n <mat-card-title>\n <div mat-dialog-title class=\"mt-2 ml-2 text-center\">\n <div>Update Selected Rows</div>\n </div>\n </mat-card-title>\n </mat-card-header>\n <mat-card-content class=\"d-flex flex-column\">\n <form [formGroup]=\"updateRowForm\">\n <div class=\"d-flex flex-column\">\n\n <mat-form-field class=\"w-100 px-1\">\n <input matInput formControlName=\"title\" placeholder=\"Title\" autocomplete=\"off\" />\n <button *ngIf=\"updateRowForm.get('title').value || updateRowForm.get('title').value===0\" matSuffix\n mat-icon-button style=\"color:red\" (click)=\"updateRowForm.get('title').setValue('')\">\n <mat-icon>close</mat-icon>\n </button>\n <button matSuffix mat-icon-button type=\"button\" style=\"color:green\" *ngIf=\"(updateRowForm.get('title').value || updateRowForm.get('title').value===0)\n && updateRowForm.get('title').valid\" (click)=\"bulkUpdate('title')\">\n <mat-icon>done</mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field class=\"w-100 px-1\">\n <textarea matInput formControlName=\"details\" placeholder=\"Details\" autocomplete=\"off\"></textarea>\n <button *ngIf=\"updateRowForm.get('details').value || updateRowForm.get('details').value===0\" matSuffix\n mat-icon-button style=\"color:red\" (click)=\"updateRowForm.get('details').setValue('')\">\n <mat-icon>close</mat-icon>\n </button>\n <button matSuffix mat-icon-button type=\"button\" style=\"color:green\" *ngIf=\"(updateRowForm.get('details').value || updateRowForm.get('details').value===0)\n && updateRowForm.get('details').valid\" (click)=\"bulkUpdate('details')\">\n <mat-icon>done</mat-icon>\n </button>\n </mat-form-field>\n\n <ng-container *ngIf=\"useTechlifyTags\">\n <mat-form-field>\n <mat-label>Tag</mat-label>\n <app-techlify-tagger-tag-form-field modelType=\"entity-file\" formControlName=\"tag_ids\"\n placeholder=\"Enter new tag\">\n </app-techlify-tagger-tag-form-field>\n <button *ngIf=\"updateRowForm.get('tag_ids').value || updateRowForm.get('tag_ids').value===0\" matSuffix\n mat-icon-button style=\"color:red\" (click)=\"updateRowForm.get('tag_ids').setValue('')\">\n <mat-icon>close</mat-icon>\n </button>\n <button matSuffix mat-icon-button type=\"button\" style=\"color:green\" *ngIf=\"(updateRowForm.get('tag_ids').value || updateRowForm.get('tag_ids').value===0)\n && updateRowForm.get('tag_ids').valid\" (click)=\"bulkUpdate('tag_ids')\">\n <mat-icon>done</mat-icon>\n </button>\n </mat-form-field>\n </ng-container>\n </div>\n </form>\n </mat-card-content>\n </mat-card>\n\n </div>\n\n <div>\n <div class=\"mat-typography\" *ngIf=\"!displayMode\">\n <div class=\"d-flex flex-row gap-3\">\n <div class=\"d-flex flex-column gap-2 flex-grow-1\">\n <mat-card>\n <mat-card-content>\n <div class=\"d-flex gap-2 align-items-center\">\n <mat-icon>\n description\n </mat-icon>\n <h3 class=\"font-weight-bold mb-0\">\n {{title}}s\n </h3>\n <app-techlify-form-button class=\"ms-2\" *ngIf=\"!viewOnly && isShowCreateAction && entityId\"\n [component]=\"entityFileForm()\" [data]=\"formData\"\n (saved)=\"modelCreated($event)\"></app-techlify-form-button>\n <span class=\"flex-grow-1\"></span>\n <form [formGroup]=\"filterForm\" class=\"d-flex gap-2\">\n <mat-form-field *ngIf=\"!removeSearch\" appearance=\"outline\">\n <mat-label>Search</mat-label>\n <input type=\"text\" matInput formControlName=\"title\" placeholder=\"Search\" name=\"title\"\n autocomplete=\"off\" />\n <button *ngIf=\"filterForm.get('title').value\" matSuffix mat-icon-button\n (click)=\"resetFilter('title')\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <ng-container *ngIf=\"useTechlifyTags\">\n <mat-form-field>\n <mat-label>Tag</mat-label>\n <app-techlify-tagger-tag-form-field [categories]=\"techlifyTagCategories\" formControlName=\"tag_ids\"\n placeholder=\"Select Tags\" [config]=\"techlifyTagConfig\"></app-techlify-tagger-tag-form-field>\n </mat-form-field>\n </ng-container>\n\n <app-timeline-filter class=\"fl-sm\" formControlName='period_id' labelText=\"Expires On\"\n dateFrom=\"expires_on_from\" dateTo=\"expires_on_to\" [form]=\"filterForm\"></app-timeline-filter>\n </form>\n </div>\n </mat-card-content>\n <mat-card-content class=\"entity-file-card p-0\" *ngIf=\"entityId\">\n <ng-container *ngTemplateOutlet=\"tableView\"></ng-container>\n </mat-card-content>\n </mat-card>\n\n <mat-card *ngIf=\"!entityId\">\n <mat-card-content class=\"entity-file-card p-0\">\n <ng-container *ngTemplateOutlet=\"tableView\"></ng-container>\n </mat-card-content>\n </mat-card>\n </div>\n <ng-container *ngIf=\"isShowDragDropSection && entityId\">\n <section style=\"flex: 0 1 30%;\" *ngIf=\"!this.selectedModelIds.length && !viewOnly && isShowCreateAction\">\n <app-file-dropper [config]=\"fileConfig\" (fileChanged)=\"fileChanged($event)\">\n </app-file-dropper>\n </section>\n </ng-container>\n </div>\n </div>\n </div>\n\n <ng-template #tableView>\n <table mat-table [dataSource]=\"models\" class=\"w-100\" matSort multiTemplateDataRows infiniteScroll\n [infiniteScrollDistance]=\"1.5\" [infiniteScrollThrottle]=\"50\" (scrolled)=\"onScroll()\">\n\n <!-- Select Column -->\n <ng-container matColumnDef=\"select\">\n <th mat-header-cell *matHeaderCellDef style=\"width:30px\">\n <mat-checkbox name=\"employee\" [(ngModel)]=\"isAllSelected\" (change)=\"selectAll()\">\n </mat-checkbox>\n </th>\n <td mat-cell *matCellDef=\"let element\" style=\"width:30px\">\n <mat-checkbox name=\"employee[{{element?.id}}]\" (click)=\"$event.stopPropagation()\"\n [(ngModel)]=\"element.is_selected\" (change)=\"isSelectionModified($event, element)\"\n [disabled]=\"!models.length\">\n </mat-checkbox>\n </td>\n </ng-container>\n\n <!-- Index Column -->\n <ng-container matColumnDef=\"index\">\n <th mat-header-cell *matHeaderCellDef> # </th>\n <td mat-cell *matCellDef=\"let element; let i = dataIndex\"> {{ i+1 }} </td>\n </ng-container>\n\n <!-- Title Column -->\n <ng-container matColumnDef=\"title\">\n <th mat-header-cell *matHeaderCellDef> Title </th>\n <td mat-cell *matCellDef=\"let element\">\n {{element.title}}\n <ng-container *ngIf=\"useTechlifyTags\">\n <br>\n <small class=\"badge badge-secondary mr-1\" *ngFor=\"let tag of element?.tags\">{{tag?.title}}</small>\n </ng-container>\n\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"expires_on\">\n <th mat-header-cell *matHeaderCellDef> Expires On </th>\n <td mat-cell *matCellDef=\"let element\">\n {{element?.expires_on | date:'mediumDate'}}\n </td>\n </ng-container>\n\n <!-- Details Column -->\n <ng-container matColumnDef=\"details\">\n <th mat-header-cell *matHeaderCellDef> Details </th>\n <td mat-cell *matCellDef=\"let element\">\n <app-read-more [text]=\"element.details\" [maxLength]=\"50\"></app-read-more>\n </td>\n </ng-container>\n\n <!-- File size Column -->\n <ng-container matColumnDef=\"file_size\">\n <th mat-header-cell *matHeaderCellDef> File Size </th>\n <td mat-cell *matCellDef=\"let element\"> {{ element.file_size | fileSize }} </td>\n </ng-container>\n\n <!-- Uploaded On Column -->\n <ng-container matColumnDef=\"uploaded_on\">\n <th mat-header-cell *matHeaderCellDef> Uploaded On </th>\n <td mat-cell *matCellDef=\"let element\">\n <div>\n {{element.created_at | date: 'mediumDate'}}\n </div>\n <div class=\"text-muted\">\n By {{element.creator?.name}}\n </div>\n </td>\n </ng-container>\n\n <!-- Actions Column -->\n <ng-container matColumnDef=\"actions\">\n <th mat-header-cell *matHeaderCellDef> Actions </th>\n <td mat-cell *matCellDef=\"let element\" class=\"text-muted\">\n <div class=\"d-flex flex-row gap-2 text-secondary align-items-center\">\n <a href=\"{{element.url}}\" target=\"_blank\" class=\"text-decoration-none text-muted clickable\">\n <mat-icon>download</mat-icon>\n </a>\n <app-techlify-form-button *ngIf=\"!viewOnly && isShowUpdateAction\" [component]=\"entityFileForm()\"\n [model]=\"element\" [data]=\"formData\" (saved)=\"modelsUpdatedById($event)\"></app-techlify-form-button>\n <app-techlify-delete-button *ngIf=\"!viewOnly && isShowDeleteAction\" [model]=\"element\" [service]=\"service\"\n message=\"Are you sure to proceed delete the file {{element.title}}\"\n (deleted)=\"modelsDeletedById(element)\">\n </app-techlify-delete-button>\n </div>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n </table>\n\n <mat-progress-bar mode=\"indeterminate\" *ngIf=\"isWorking\"></mat-progress-bar>\n </ng-template>\n\n <div class=\"d-flex flex-wrap gap-3 mat-typography p-4\" *ngIf=\"displayMode\">\n <div *ngFor=\"let efile of models\">\n <app-document-viewer [file]=\"efile.file\" [fileUrl]=\"efile.url\" [config]=\"this.viewerConfig\" [disableEdit]=\"true\">\n </app-document-viewer>\n <a href=\"{{efile.url}}\" target=\"_blank\">\n <button mat-button type=\"button\">View</button>\n </a>\n </div>\n </div>\n</div>\n\n<mat-card *ngIf=\"viewMode === 'timeline'\">\n <mat-card-content>\n <div class=\"d-flex justify-content-start align-items-center gap-2\">\n <mat-icon>\n description\n </mat-icon>\n <h3 class=\"font-weight-bold mb-0\">\n {{title}}s\n </h3>\n <app-techlify-form-button *ngIf=\"!viewOnly && isShowCreateAction\" [component]=\"entityFileForm()\" [data]=\"formData\"\n (saved)=\"modelCreated($event)\"></app-techlify-form-button>\n </div>\n </mat-card-content>\n <mat-card-content *ngIf=\"!this.selectedModelIds.length && !viewOnly && isShowCreateAction\" class=\"mt-3\">\n <app-file-dropper [config]=\"fileConfig\" (fileChanged)=\"fileChanged($event)\">\n </app-file-dropper>\n </mat-card-content>\n\n <mat-card-content class=\"mt-3\">\n <div *ngFor=\"let entityFile of models\" class=\"d-flex flex-column gap-0\">\n <div class=\"d-flex flex-column gap-0\">\n <div class=\"d-flex justify-content-between align-items-center gap-1\">\n <p class=\"mb-0 fw-bold text-wrap\">{{ entityFile?.title | wrap:20 }}</p>\n <span class=\"badge bg-dark\" *ngFor=\"let tag of entityFile?.tags\">\n {{ tag?.title }}\n </span>\n <small class=\"text-dark\">{{ entityFile.file_size | fileSize }}</small>\n </div>\n </div>\n <app-read-more [text]=\"entityFile?.details\" [maxLength]=\"50\"></app-read-more>\n <div class=\"d-flex justify-content-between gap-2\">\n <small class=\"text-secondary\" style=\"max-width: 70%\">\n <i>Uploaded By {{ entityFile?.creator?.name }} {{ entityFile?.created_at | date: 'mediumDate'}}</i>\n </small>\n <div class=\"d-flex justify-content-end align-items-center gap-1\">\n <a href=\"{{entityFile?.url}}\" target=\"_blank\" class=\"text-decoration-none text-secondary mt-2\">\n <mat-icon>download</mat-icon>\n </a>\n <app-techlify-form-button class=\"text-secondary\" *ngIf=\"!viewOnly && isShowUpdateAction\"\n [component]=\"entityFileForm()\" [model]=\"entityFile\" [data]=\"formData\"\n (saved)=\"modelsUpdatedById($event)\"></app-techlify-form-button>\n <app-techlify-delete-button *ngIf=\"!viewOnly && isShowDeleteAction\" class='text-secondary ms-1'\n [model]=\"entityFile\" [service]=\"service\"\n message=\"Are you sure to proceed delete the file {{entityFile.title}}\"\n (deleted)=\"modelsDeletedById(entityFile)\">\n </app-techlify-delete-button>\n </div>\n </div>\n <hr style=\"margin: 0.5rem 0\">\n </div>\n <mat-progress-bar mode=\"indeterminate\" *ngIf=\"isWorking\"></mat-progress-bar>\n </mat-card-content>\n</mat-card>", styles: ["th.mat-header-cell,td.mat-cell,td.mat-footer-cell{padding:2px}.entity-file-card{overflow-x:auto}.clickable:hover{cursor:pointer}\n"] }]
199
+ args: [{ selector: 'app-entity-file-list, app-entity-files-view-all', template: "<div *ngIf=\"viewMode === 'list'\">\n <div *ngIf=\"this.selectedModelIds.length\" class=\"d-none d-md-flex flex-column\">\n <mat-card class=\"update_card\" *ngIf=\"this.selectedModelIds.length\">\n <mat-card-header>\n <mat-card-title>\n <div mat-dialog-title class=\"mt-2 ml-2 text-center\">\n <div>Update Selected Rows</div>\n </div>\n </mat-card-title>\n </mat-card-header>\n <mat-card-content class=\"d-flex flex-column\">\n <form [formGroup]=\"updateRowForm\">\n <div class=\"d-flex flex-column\">\n\n <mat-form-field class=\"w-100 px-1\">\n <input matInput formControlName=\"title\" placeholder=\"Title\" autocomplete=\"off\" />\n <button *ngIf=\"updateRowForm.get('title').value || updateRowForm.get('title').value===0\" matSuffix\n mat-icon-button style=\"color:red\" (click)=\"updateRowForm.get('title').setValue('')\">\n <mat-icon>close</mat-icon>\n </button>\n <button matSuffix mat-icon-button type=\"button\" style=\"color:green\" *ngIf=\"(updateRowForm.get('title').value || updateRowForm.get('title').value===0)\n && updateRowForm.get('title').valid\" (click)=\"bulkUpdate('title')\">\n <mat-icon>done</mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field class=\"w-100 px-1\">\n <textarea matInput formControlName=\"details\" placeholder=\"Details\" autocomplete=\"off\"></textarea>\n <button *ngIf=\"updateRowForm.get('details').value || updateRowForm.get('details').value===0\" matSuffix\n mat-icon-button style=\"color:red\" (click)=\"updateRowForm.get('details').setValue('')\">\n <mat-icon>close</mat-icon>\n </button>\n <button matSuffix mat-icon-button type=\"button\" style=\"color:green\" *ngIf=\"(updateRowForm.get('details').value || updateRowForm.get('details').value===0)\n && updateRowForm.get('details').valid\" (click)=\"bulkUpdate('details')\">\n <mat-icon>done</mat-icon>\n </button>\n </mat-form-field>\n\n <ng-container *ngIf=\"useTechlifyTags\">\n <mat-form-field>\n <mat-label>Tag</mat-label>\n <app-techlify-tagger-tag-form-field modelType=\"entity-file\" formControlName=\"tag_ids\"\n placeholder=\"Enter new tag\">\n </app-techlify-tagger-tag-form-field>\n <button *ngIf=\"updateRowForm.get('tag_ids').value || updateRowForm.get('tag_ids').value===0\" matSuffix\n mat-icon-button style=\"color:red\" (click)=\"updateRowForm.get('tag_ids').setValue('')\">\n <mat-icon>close</mat-icon>\n </button>\n <button matSuffix mat-icon-button type=\"button\" style=\"color:green\" *ngIf=\"(updateRowForm.get('tag_ids').value || updateRowForm.get('tag_ids').value===0)\n && updateRowForm.get('tag_ids').valid\" (click)=\"bulkUpdate('tag_ids')\">\n <mat-icon>done</mat-icon>\n </button>\n </mat-form-field>\n </ng-container>\n </div>\n </form>\n </mat-card-content>\n </mat-card>\n\n </div>\n\n <div>\n <div class=\"mat-typography\" *ngIf=\"!displayMode\">\n <div class=\"d-flex flex-row gap-3\">\n <div class=\"d-flex flex-column gap-2 flex-grow-1\">\n <mat-card>\n <mat-card-content>\n <div class=\"d-flex gap-2 align-items-center\">\n <mat-icon>\n description\n </mat-icon>\n <h3 class=\"font-weight-bold mb-0\">\n {{title}}s\n </h3>\n <app-techlify-form-button class=\"ms-2\" *ngIf=\"!viewOnly && isShowCreateAction && entityId\"\n [component]=\"entityFileForm()\" [data]=\"formData\"\n (saved)=\"modelCreated($event)\"></app-techlify-form-button>\n <span class=\"flex-grow-1\"></span>\n <form [formGroup]=\"filterForm\" class=\"d-flex gap-2\">\n <mat-form-field *ngIf=\"!removeSearch\" appearance=\"outline\">\n <mat-label>Search</mat-label>\n <input type=\"text\" matInput formControlName=\"title\" placeholder=\"Search\" name=\"title\"\n autocomplete=\"off\" />\n <button *ngIf=\"filterForm.get('title').value\" matSuffix mat-icon-button\n (click)=\"resetFilter('title')\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <ng-container *ngIf=\"useTechlifyTags\">\n <mat-form-field>\n <mat-label>Tag</mat-label>\n <app-techlify-tagger-tag-form-field [categories]=\"techlifyTagCategories\" formControlName=\"tag_ids\"\n placeholder=\"Select Tags\" [config]=\"techlifyTagConfig\"></app-techlify-tagger-tag-form-field>\n </mat-form-field>\n </ng-container>\n\n <app-timeline-filter class=\"fl-sm\" formControlName='period_id' labelText=\"Expires On\"\n dateFrom=\"expires_on_from\" dateTo=\"expires_on_to\" [form]=\"filterForm\"></app-timeline-filter>\n </form>\n </div>\n </mat-card-content>\n <mat-card-content class=\"entity-file-card p-0\" *ngIf=\"entityId\">\n <ng-container *ngTemplateOutlet=\"tableView\"></ng-container>\n </mat-card-content>\n </mat-card>\n\n <mat-card *ngIf=\"!entityId\">\n <mat-card-content class=\"entity-file-card p-0\">\n <ng-container *ngTemplateOutlet=\"tableView\"></ng-container>\n </mat-card-content>\n </mat-card>\n </div>\n <ng-container *ngIf=\"isShowDragDropSection && entityId\">\n <section style=\"flex: 0 1 30%;\" *ngIf=\"!this.selectedModelIds.length && !viewOnly && isShowCreateAction\">\n <app-file-dropper [config]=\"fileConfig\" (fileChanged)=\"fileChanged($event)\">\n </app-file-dropper>\n </section>\n </ng-container>\n </div>\n </div>\n </div>\n\n <ng-template #tableView>\n <table mat-table [dataSource]=\"models\" class=\"w-100\" matSort multiTemplateDataRows infiniteScroll\n [infiniteScrollDistance]=\"1.5\" [infiniteScrollThrottle]=\"50\" (scrolled)=\"onScroll()\">\n\n <!-- Select Column -->\n <ng-container matColumnDef=\"select\">\n <th mat-header-cell *matHeaderCellDef style=\"width:30px\">\n <mat-checkbox name=\"employee\" [(ngModel)]=\"isAllSelected\" (change)=\"selectAll()\">\n </mat-checkbox>\n </th>\n <td mat-cell *matCellDef=\"let element\" style=\"width:30px\">\n <mat-checkbox name=\"employee[{{element?.id}}]\" (click)=\"$event.stopPropagation()\"\n [(ngModel)]=\"element.is_selected\" (change)=\"isSelectionModified($event, element)\"\n [disabled]=\"!models.length\">\n </mat-checkbox>\n </td>\n </ng-container>\n\n <!-- Index Column -->\n <ng-container matColumnDef=\"index\">\n <th mat-header-cell *matHeaderCellDef> # </th>\n <td mat-cell *matCellDef=\"let element; let i = dataIndex\"> {{ i+1 }} </td>\n </ng-container>\n\n <!-- Title Column -->\n <ng-container matColumnDef=\"title\">\n <th mat-header-cell *matHeaderCellDef> Title </th>\n <td mat-cell *matCellDef=\"let element\">\n {{element.title}}\n <ng-container *ngIf=\"useTechlifyTags\">\n <br>\n <small class=\"badge badge-secondary mr-1\" *ngFor=\"let tag of element?.tags\">{{tag?.title}}</small>\n </ng-container>\n\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"expires_on\">\n <th mat-header-cell *matHeaderCellDef> Expires On </th>\n <td mat-cell *matCellDef=\"let element\">\n {{element?.expires_on | date:'mediumDate'}}\n </td>\n </ng-container>\n\n <!-- Details Column -->\n <ng-container matColumnDef=\"details\">\n <th mat-header-cell *matHeaderCellDef> Details </th>\n <td mat-cell *matCellDef=\"let element\">\n <app-read-more [text]=\"element.details\" [maxLength]=\"50\"></app-read-more>\n </td>\n </ng-container>\n\n <!-- File size Column -->\n <ng-container matColumnDef=\"file_size\">\n <th mat-header-cell *matHeaderCellDef> File Size </th>\n <td mat-cell *matCellDef=\"let element\">\n <span *ngIf=\"element?.file_size\"> {{ element.file_size | fileSize }} </span>\n </td>\n </ng-container>\n\n <!-- Uploaded On Column -->\n <ng-container matColumnDef=\"uploaded_on\">\n <th mat-header-cell *matHeaderCellDef> Uploaded On </th>\n <td mat-cell *matCellDef=\"let element\">\n <div>\n {{element.created_at | date: 'mediumDate'}}\n </div>\n <div class=\"text-muted\" *ngIf=\"element.creator\">\n By {{element.creator?.name}}\n </div>\n </td>\n </ng-container>\n\n <!-- Actions Column -->\n <ng-container matColumnDef=\"actions\">\n <th mat-header-cell *matHeaderCellDef> Actions </th>\n <td mat-cell *matCellDef=\"let element\" class=\"text-muted\">\n <div class=\"d-flex flex-row gap-2 text-secondary align-items-center\">\n <a href=\"{{element.url}}\" target=\"_blank\" class=\"text-decoration-none text-muted clickable\">\n <mat-icon>download</mat-icon>\n </a>\n <app-techlify-form-button *ngIf=\"!viewOnly && isShowUpdateAction\" [component]=\"entityFileForm()\"\n [model]=\"element\" [data]=\"formData\" (saved)=\"modelsUpdatedById($event)\"></app-techlify-form-button>\n <app-techlify-delete-button *ngIf=\"!viewOnly && isShowDeleteAction\" [model]=\"element\" [service]=\"service\"\n message=\"Are you sure to proceed delete the file {{element.title}}\"\n (deleted)=\"modelsDeletedById(element)\">\n </app-techlify-delete-button>\n </div>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n </table>\n\n <mat-progress-bar mode=\"indeterminate\" *ngIf=\"isWorking\"></mat-progress-bar>\n </ng-template>\n\n <div class=\"d-flex flex-wrap gap-3 mat-typography p-4\" *ngIf=\"displayMode\">\n <div *ngFor=\"let efile of models\">\n <app-document-viewer [file]=\"efile.file\" [fileUrl]=\"efile.url\" [config]=\"this.viewerConfig\" [disableEdit]=\"true\">\n </app-document-viewer>\n <a href=\"{{efile.url}}\" target=\"_blank\">\n <button mat-button type=\"button\">View</button>\n </a>\n </div>\n </div>\n</div>\n\n<mat-card *ngIf=\"viewMode === 'timeline'\">\n <mat-card-content>\n <div class=\"d-flex justify-content-start align-items-center gap-2\">\n <mat-icon>\n description\n </mat-icon>\n <h3 class=\"font-weight-bold mb-0\">\n {{title}}s\n </h3>\n <app-techlify-form-button *ngIf=\"!viewOnly && isShowCreateAction\" [component]=\"entityFileForm()\" [data]=\"formData\"\n (saved)=\"modelCreated($event)\"></app-techlify-form-button>\n </div>\n </mat-card-content>\n <mat-card-content *ngIf=\"!this.selectedModelIds.length && !viewOnly && isShowCreateAction\" class=\"mt-3\">\n <app-file-dropper [config]=\"fileConfig\" (fileChanged)=\"fileChanged($event)\">\n </app-file-dropper>\n </mat-card-content>\n\n <mat-card-content class=\"mt-3\">\n <div *ngFor=\"let entityFile of models\" class=\"d-flex flex-column gap-0\">\n <div class=\"d-flex flex-column gap-0\">\n <div class=\"d-flex justify-content-between align-items-center gap-1\">\n <p class=\"mb-0 fw-bold text-wrap\">{{ entityFile?.title | wrap:20 }}</p>\n <span class=\"badge bg-dark\" *ngFor=\"let tag of entityFile?.tags\">\n {{ tag?.title }}\n </span>\n <small class=\"text-dark\">{{ entityFile.file_size | fileSize }}</small>\n </div>\n </div>\n <app-read-more [text]=\"entityFile?.details\" [maxLength]=\"50\"></app-read-more>\n <div class=\"d-flex justify-content-between gap-2\">\n <small class=\"text-secondary\" style=\"max-width: 70%\">\n <i>Uploaded By {{ entityFile?.creator?.name }} {{ entityFile?.created_at | date: 'mediumDate'}}</i>\n </small>\n <div class=\"d-flex justify-content-end align-items-center gap-1\">\n <a href=\"{{entityFile?.url}}\" target=\"_blank\" class=\"text-decoration-none text-secondary mt-2\">\n <mat-icon>download</mat-icon>\n </a>\n <app-techlify-form-button class=\"text-secondary\" *ngIf=\"!viewOnly && isShowUpdateAction\"\n [component]=\"entityFileForm()\" [model]=\"entityFile\" [data]=\"formData\"\n (saved)=\"modelsUpdatedById($event)\"></app-techlify-form-button>\n <app-techlify-delete-button *ngIf=\"!viewOnly && isShowDeleteAction\" class='text-secondary ms-1'\n [model]=\"entityFile\" [service]=\"service\"\n message=\"Are you sure to proceed delete the file {{entityFile.title}}\"\n (deleted)=\"modelsDeletedById(entityFile)\">\n </app-techlify-delete-button>\n </div>\n </div>\n <hr style=\"margin: 0.5rem 0\">\n </div>\n <mat-progress-bar mode=\"indeterminate\" *ngIf=\"isWorking\"></mat-progress-bar>\n </mat-card-content>\n</mat-card>", styles: ["th.mat-header-cell,td.mat-cell,td.mat-footer-cell{padding:2px}.entity-file-card{overflow-x:auto}.clickable:hover{cursor:pointer}\n"] }]
200
200
  }], ctorParameters: () => [{ type: i1.EntityFileService }, { type: i2.AlertService }, { type: i3.UntypedFormBuilder }, { type: i4.ErrorHandlerService }, { type: i5.NgxPermissionsService }], propDecorators: { entityId: [{
201
201
  type: Input
202
202
  }], entityType: [{
@@ -232,4 +232,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
232
232
  }], permission: [{
233
233
  type: Input
234
234
  }] } });
235
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LWZpbGUtbGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdGVjaGxpZnktY29yZS9zcmMvbGliL2VudGl0eS1maWxlcy9lbnRpdHktZmlsZS1saXN0L2VudGl0eS1maWxlLWxpc3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXRlY2hsaWZ5LWNvcmUvc3JjL2xpYi9lbnRpdHktZmlsZXMvZW50aXR5LWZpbGUtbGlzdC9lbnRpdHktZmlsZS1saXN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQU96RixPQUFPLEVBQ0wsZ0NBQWdDLEVBQ2pDLE1BQU0sZ0ZBQWdGLENBQUM7QUFDeEYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFHekQ7Ozs7R0FJRztBQU1ILE1BQU0sT0FBTyx1QkFBd0IsU0FBUSxxQkFBcUI7SUFhaEUsSUFBc0Isc0JBQXNCLENBQUMsS0FBYztRQUN6RCxJQUFJLENBQUMsdUJBQXVCLEdBQUcsS0FBSyxDQUFDO0lBQ3ZDLENBQUM7SUFDRCxJQUFhLHNCQUFzQjtRQUNqQyxPQUFPLElBQUksQ0FBQyx1QkFBdUIsQ0FBQztJQUN0QyxDQUFDO0lBK0JELFlBQ2tCLE9BQTBCLEVBQ2xDLFlBQTBCLEVBQzFCLEVBQXNCLEVBQ3RCLFlBQWlDLEVBQ2pDLGtCQUF5QztRQUVqRCxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFOQyxZQUFPLEdBQVAsT0FBTyxDQUFtQjtRQUNsQyxpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMx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dkIsdUJBQXVCLDByQkN4QnBDLGdrYkEwUlc7OzRGRGxRRSx1QkFBdUI7a0JBTG5DLFNBQVM7K0JBQ0UsaURBQWlEO3dOQUtsRCxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLHFCQUFxQjtzQkFBN0IsS0FBSztnQkFFZ0Isc0JBQXNCO3NCQUEzQyxLQUFLO2dCQVVHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0cscUJBQXFCO3NCQUE3QixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFPRyxLQUFLO3NCQUFiLEtBQUs7Z0JBZUcsVUFBVTtzQkFBbEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBFbnRpdHlGaWxlRm9ybUNvbXBvbmVudCB9IGZyb20gJy4uL2VudGl0eS1maWxlLWZvcm0vZW50aXR5LWZpbGUtZm9ybS5jb21wb25lbnQnO1xuaW1wb3J0IHsgRW50aXR5RmlsZVNlcnZpY2UgfSBmcm9tICcuLi9lbnRpdHktZmlsZS5zZXJ2aWNlJztcbmltcG9ydCB7IFVudHlwZWRGb3JtQnVpbGRlciwgVW50eXBlZEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEFsZXJ0U2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvYWxlcnQuc2VydmljZSc7XG5pbXBvcnQgeyBWaWV3ZXJDb25maWcgfSBmcm9tICcuLi8uLi9kb2N1bWVudC12aWV3ZXIvdmlld2VyLWNvbmZpZy5tb2RlbCc7XG5pbXBvcnQgeyBGaWxlRHJvcHBlckNvbmZpZyB9IGZyb20gJy4uLy4uL2ZpbGUtZHJvcHBlcic7XG5pbXBvcnQgeyBFcnJvckhhbmRsZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9lcnJvci1oYW5kbGVyLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgVGVjaGxpZnlUYWdnZXJUYWdGb3JtQ29uZmlnTW9kZWxcbn0gZnJvbSBcIi4uLy4uL3RhZy90ZWNobGlmeS10YWdnZXItdGFnLWZvcm0tZmllbGQvdGVjaGxpZnktdGFnZ2VyLXRhZy1mb3JtLWNvbmZpZy5tb2RlbFwiO1xuaW1wb3J0IHsgVGVjaGxpZnlMaXN0Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vYmFzZS1tb2RlbCc7XG5pbXBvcnQgeyBOZ3hQZXJtaXNzaW9uc1NlcnZpY2UgfSBmcm9tICduZ3gtcGVybWlzc2lvbnMnO1xuXG4vKipcbiAqIFdlIGFyZSB1c2luZyBib3RoIGFwcC1lbnRpdHktZmlsZS1saXN0IGFuZCBhcHAtZW50aXR5LWZpbGVzLXZpZXctYWxsIFxuICogdG8gZW5zdXJlIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBwcm9qZWN0cyBgbmd4LXRlY2hsaWZ5LWRvY3VtZW50cywgbmd4LXRlY2hsaWZ5LWNoZWNrc2hlZXRzYFxuICogZXRjLiBgYXBwLWVudGl0eS1maWxlcy12aWV3LWFsbGAgd2lsbCBiZSByZW1vdmVkIGJ5IGB2MTguODAuMGBcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWVudGl0eS1maWxlLWxpc3QsIGFwcC1lbnRpdHktZmlsZXMtdmlldy1hbGwnLFxuICB0ZW1wbGF0ZVVybDogJy4vZW50aXR5LWZpbGUtbGlzdC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2VudGl0eS1maWxlLWxpc3QuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBFbnRpdHlGaWxlTGlzdENvbXBvbmVudCBleHRlbmRzIFRlY2hsaWZ5TGlzdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBJbnB1dCgpIGVudGl0eUlkOiBudW1iZXI7XG4gIEBJbnB1dCgpIGVudGl0eVR5cGU6IHN0cmluZztcbiAgQElucHV0KCkgdmlld09ubHk6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgcmVtb3ZlU2VhcmNoOiBib29sZWFuO1xuICBASW5wdXQoKSBoaWRlVGl0bGVBbmREZXRhaWxzOiBib29sZWFuO1xuICBASW5wdXQoKSBkaXNwbGF5TW9kZTogYm9vbGVhbjtcbiAgQElucHV0KCkgYWxsb3dNdWx0aXBsZUZpbGVzOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGFsbG93QnVsa1VwZGF0ZTogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSB2aWV3TW9kZTogJ2xpc3QnIHwgJ3RpbWVsaW5lJyA9ICdsaXN0JztcbiAgQElucHV0KCkgZmlsZURyb3BwZXJIZWlnaHQgPSAnNTAwcHgnO1xuICBASW5wdXQoKSBpc1Nob3dEcmFnRHJvcFNlY3Rpb246IGJvb2xlYW4gPSB0cnVlO1xuXG4gIEBJbnB1dCgpIG92ZXJyaWRlIHNldCBpc0ZpbHRlclBhdGNoRnJvbVJvdXRlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5faXNGaWx0ZXJQYXRjaEZyb21Sb3V0ZSA9IHZhbHVlO1xuICB9XG4gIG92ZXJyaWRlIGdldCBpc0ZpbHRlclBhdGNoRnJvbVJvdXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc0ZpbHRlclBhdGNoRnJvbVJvdXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNob3VsZCB3ZSBhbGxvdyB0YWdnaW5nIGVudGl0eS1maWxlcz9cbiAgICovXG4gIEBJbnB1dCgpIHVzZVRlY2hsaWZ5VGFncyA9IGZhbHNlO1xuICBASW5wdXQoKSB0ZWNobGlmeVRhZ0NhdGVnb3JpZXM6IHN0cmluZ1tdID0gW107XG4gIEBJbnB1dCgpIHRlY2hsaWZ5VGFnQ29uZmlnOiBUZWNobGlmeVRhZ2dlclRhZ0Zvcm1Db25maWdNb2RlbCA9IG5ldyBUZWNobGlmeVRhZ2dlclRhZ0Zvcm1Db25maWdNb2RlbCgpO1xuXG5cbiAgZW50aXR5RmlsZUZvcm0gPSBzaWduYWwoRW50aXR5RmlsZUZvcm1Db21wb25lbnQpO1xuICBmb3JtRGF0YTogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuXG4gIHZpZXdlckNvbmZpZzogVmlld2VyQ29uZmlnO1xuICBASW5wdXQoKSB0aXRsZTogc3RyaW5nID0gXCJGaWxlXCI7XG4gIGRpc3BsYXllZENvbHVtbnMgPSBbXG4gICAgJ2luZGV4JyxcbiAgICAndGl0bGUnLFxuICAgICdleHBpcmVzX29uJyxcbiAgICAnZGV0YWlscycsXG4gICAgJ2ZpbGVfc2l6ZScsXG4gICAgJ3VwbG9hZGVkX29uJyxcbiAgXTtcbiAgZmlsZUNvbmZpZzogRmlsZURyb3BwZXJDb25maWc7XG4gIHVwZGF0ZVJvd0Zvcm06IFVudHlwZWRGb3JtR3JvdXA7XG4gIGlzU2hvd0NyZWF0ZUFjdGlvbjogYm9vbGVhbiA9IHRydWU7XG4gIGlzU2hvd1VwZGF0ZUFjdGlvbjogYm9vbGVhbiA9IHRydWU7XG4gIGlzU2hvd0RlbGV0ZUFjdGlvbjogYm9vbGVhbiA9IHRydWU7XG4gIGlzU2hvd1JlYWRBY3Rpb246IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBwZXJtaXNzaW9uOiB7IGNyZWF0ZTogc3RyaW5nLCB1cGRhdGU6IHN0cmluZywgZGVsZXRlOiBzdHJpbmcsIHJlYWQ6IHN0cmluZyB9O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBvdmVycmlkZSBzZXJ2aWNlOiBFbnRpdHlGaWxlU2VydmljZSxcbiAgICBwcml2YXRlIGFsZXJ0U2VydmljZTogQWxlcnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgZmI6IFVudHlwZWRGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIGVycm9ySGFuZGxlcjogRXJyb3JIYW5kbGVyU2VydmljZSxcbiAgICBwcml2YXRlIHBlcm1pc3Npb25zU2VydmljZTogTmd4UGVybWlzc2lvbnNTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKHNlcnZpY2UpO1xuICAgIHRoaXMuZmlsdGVyRm9ybUNvbmZpZ3VyYXRpb24gPSB7XG4gICAgICB0YWdfaWRzOiB7IG11bHRpcGxlOiB0cnVlIH1cbiAgICB9O1xuICAgIHRoaXMuZmlsdGVyRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgdGl0bGU6IFtcIlwiXSxcbiAgICAgIHRhZ19pZHM6IFtbXV0sXG4gICAgICBwZXJpb2RfaWQ6IFsnJ10sXG4gICAgICBleHBpcmVzX29uX2Zyb206IFsnJ10sXG4gICAgICBleHBpcmVzX29uX3RvOiBbJyddXG4gICAgfSk7XG5cbiAgICB0aGlzLnVwZGF0ZVJvd0Zvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIHRpdGxlOiBbJyddLFxuICAgICAgZGV0YWlsczogWycnXSxcbiAgICAgIHRhZ19pZHM6IFsnJ10sXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBuZ09uSW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcblxuICAgIC8qKlxuICAgICAqIFRoZSByZWFzb24gd2UgYXJlIHNldHRpbmcgcGVybWlzc2lvbnMgdGhpcyB3YXkgaXMgYmVjYXVzZSB0aGUgdXNlciBjYW4gcGFzcyB3aGF0IHBlcm1pc3Npb25zIGFyZSB0byBiZSB1c2VkXG4gICAgICogd2hlbiBtYW5pcHVsYXRpbmcgdGhlIGZpbGVzL2RvY3VtZW50cy4gSWYgdGhleSBhcmUgYSBjbGllbnQgYWRtaW4gd2Ugd2lsbCBza2lwIHRoaXNcbiAgICAgKi9cbiAgICBpZiAoIWF3YWl0IHRoaXMucGVybWlzc2lvbnNTZXJ2aWNlLmhhc1Blcm1pc3Npb24oJ2NsaWVudF9hZG1pbicpKSB7XG4gICAgICB0aGlzLmlzU2hvd0NyZWF0ZUFjdGlvbiA9IHRoaXMucGVybWlzc2lvbj8uY3JlYXRlID8gYXdhaXQgdGhpcy5wZXJtaXNzaW9uc1NlcnZpY2UuaGFzUGVybWlzc2lvbih0aGlzLnBlcm1pc3Npb24uY3JlYXRlKSA6IHRydWU7XG4gICAgICB0aGlzLmlzU2hvd1VwZGF0ZUFjdGlvbiA9IHRoaXMucGVybWlzc2lvbj8udXBkYXRlID8gYXdhaXQgdGhpcy5wZXJtaXNzaW9uc1NlcnZpY2UuaGFzUGVybWlzc2lvbih0aGlzLnBlcm1pc3Npb24udXBkYXRlKSA6IHRydWU7XG4gICAgICB0aGlzLmlzU2hvd1JlYWRBY3Rpb24gPSB0aGlzLnBlcm1pc3Npb24/LnJlYWQgPyBhd2FpdCB0aGlzLnBlcm1pc3Npb25zU2VydmljZS5oYXNQZXJtaXNzaW9uKHRoaXMucGVybWlzc2lvbi5yZWFkKSA6IHRydWU7XG4gICAgICB0aGlzLmlzU2hvd0RlbGV0ZUFjdGlvbiA9IHRoaXMucGVybWlzc2lvbj8uZGVsZXRlID8gYXdhaXQgdGhpcy5wZXJtaXNzaW9uc1NlcnZpY2UuaGFzUGVybWlzc2lvbih0aGlzLnBlcm1pc3Npb24uZGVsZXRlKSA6IHRydWU7XG4gICAgfVxuXG4gICAgdGhpcy5mb3JtRGF0YSA9IHtcbiAgICAgIGVudGl0eToge1xuICAgICAgICBlbnRpdHlfdHlwZTogdGhpcy5lbnRpdHlUeXBlLFxuICAgICAgICBlbnRpdHlfaWQ6IHRoaXMuZW50aXR5SWRcbiAgICAgIH0sXG4gICAgICBoaWRlVGl0bGVBbmREZXRhaWxzOiB0aGlzLmhpZGVUaXRsZUFuZERldGFpbHMsXG4gICAgICB1c2VUZWNobGlmeVRhZ3M6IHRoaXMudXNlVGVjaGxpZnlUYWdzLFxuICAgICAgdGVjaGxpZnlUYWdDYXRlZ29yaWVzOiB0aGlzLnRlY2hsaWZ5VGFnQ2F0ZWdvcmllcyxcbiAgICAgIHRlY2hsaWZ5VGFnQ29uZmlnOiB0aGlzLnRlY2hsaWZ5VGFnQ29uZmlnLFxuICAgIH07XG5cbiAgICAvLyBGaWxlIGRyb3BwZXIgY29uZmlnXG4gICAgdGhpcy5maWxlQ29uZmlnID0ge1xuICAgICAgZmlsZUlkOiBcImVudGl0eURhc2hib2FyZERyb3BwZXJcIixcbiAgICAgIGNvbnRhaW5lcklkOiBcImVudGl0eURhc2hib2FyZERyb3BwZXJDb250YWluZXJcIixcbiAgICAgIHN0eWxlczoge1xuICAgICAgICBoZWlnaHQ6IHRoaXMuZmlsZURyb3BwZXJIZWlnaHRcbiAgICAgIH0sXG4gICAgICBtdWx0aXBsZTogdGhpcy5hbGxvd011bHRpcGxlRmlsZXMsXG4gICAgICBhY2NlcHRGaWxlOiBcIipcIixcbiAgICAgIG1heFNpemU6IDEwLFxuICAgICAgYWNjZXB0RmlsZVRleHQ6IFwiQWxsIEZpbGVzXCJcbiAgICB9O1xuXG4gICAgdGhpcy52aWV3ZXJDb25maWcgPSB7XG4gICAgICBpbWFnZVN0eWxlOiB7XG4gICAgICAgIGhlaWdodDogJzIwMHB4JyxcbiAgICAgICAgd2lkdGg6ICcyMDBweCdcbiAgICAgIH0sXG4gICAgICB2aWV3ZXJTdHlsZToge1xuICAgICAgICBoZWlnaHQ6ICcgMTYwcHgnLFxuICAgICAgICB3aWR0aDogJzIwMHB4J1xuICAgICAgfSxcbiAgICAgIGhpZGVSZW1vdmU6IHRydWVcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMuaGlkZVRpdGxlQW5kRGV0YWlscykge1xuICAgICAgdGhpcy5kaXNwbGF5ZWRDb2x1bW5zID0gdGhpcy5kaXNwbGF5ZWRDb2x1bW5zLmZpbHRlcih4ID0+ICh4ICE9PSAnZGV0YWlscycpICYmICh4ICE9PSAndGl0bGUnKSk7XG4gICAgfVxuICAgIGlmICghdGhpcy52aWV3T25seSkge1xuICAgICAgdGhpcy5kaXNwbGF5ZWRDb2x1bW5zLnB1c2goJ2FjdGlvbnMnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuYWxsb3dCdWxrVXBkYXRlKSB7XG4gICAgICB0aGlzLmRpc3BsYXllZENvbHVtbnMucHVzaCgnc2VsZWN0Jyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNGaWx0ZXJQYXRjaEZyb21Sb3V0ZSkge1xuICAgICAgdGhpcy5wYXRjaEZpbHRlcnNGcm9tUm91dGUoKTtcbiAgICB9XG4gICAgdGhpcy5saXN0ZW5GaWx0ZXJDaGFuZ2VzKCk7XG4gICAgdGhpcy5sb2FkRGF0YSgpO1xuICB9XG5cbiAgb3ZlcnJpZGUgbG9hZERhdGEoKTogdm9pZCB7XG4gICAgdGhpcy5maWx0ZXJzID0ge1xuICAgICAgLi4udGhpcy5yZXF1ZXN0SGVscGVyU2VydmljZT8uY29udmVydFRvRm9ybURhdGEoXG4gICAgICAgIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5maWx0ZXJGb3JtLnZhbHVlKSlcbiAgICAgICksXG4gICAgICBlbnRpdHlfdHlwZTogdGhpcy5lbnRpdHlUeXBlLFxuICAgICAgZW50aXR5X2lkOiB0aGlzLmVudGl0eUlkLFxuICAgICAgd2l0aDogJ2NyZWF0b3IsdGFncycsXG4gICAgICBwYWdlOiB0aGlzLnBhZ2UsXG4gICAgICBwZXJfcGFnZTogdGhpcy5wZXJQYWdlXG4gICAgfTtcbiAgICBzdXBlci5sb2FkRGF0YSh0aGlzLmZpbHRlcnMpO1xuICB9XG5cbiAgYXN5bmMgZmlsZUNoYW5nZWQoZXZlbnQ6IGFueSkge1xuICAgIGNvbnN0IGZpbGVzOiBhbnlbXSA9IGV2ZW50O1xuICAgIGlmIChmaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zZXJ2aWNlLnVwbG9hZEVudGl0eUZpbGUoXG4gICAgICAgICAgZmlsZSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBlbnRpdHlfdHlwZTogdGhpcy5lbnRpdHlUeXBlLFxuICAgICAgICAgICAgZW50aXR5X2lkOiB0aGlzLmVudGl0eUlkLFxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucmVsb2FkKCk7XG4gICAgICB0aGlzLmFsZXJ0U2VydmljZS5hZGRBbGVydCgnRmlsZXMgdXBsb2FkZWQgc3VjY2Vzc2Z1bGx5IScsICdzdWNjZXNzJyk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgYnVsa1VwZGF0ZShmaWVsZE5hbWU6IGFueSkge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLnVwZGF0ZVJvd0Zvcm0udmFsdWU7XG4gICAgdGhpcy5pc1dvcmtpbmcgPSB0cnVlO1xuICAgIGRhdGEuZmllbGRfbmFtZSA9IGZpZWxkTmFtZTtcbiAgICBkYXRhLmRvY3VtZW50X2lkcyA9IHRoaXMuc2VsZWN0ZWRNb2RlbElkcztcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnNlcnZpY2UuYnVsa1VwZGF0ZShkYXRhKS50aGVuKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5hbGVydFNlcnZpY2UuYWRkQWxlcnQoXCJTdWNjZXNzZnVsbHkgdXBkYXRlZFwiLCBcInN1Y2Nlc3NcIik7XG4gICAgICAgICAgdGhpcy5pc1dvcmtpbmcgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLnJlbG9hZCgpO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuZXJyb3JIYW5kbGVyLmhhbmRsZUVycm9yKGVycm9yKTtcbiAgICAgIHRoaXMuaXNXb3JraW5nID0gZmFsc2U7XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2ICpuZ0lmPVwidmlld01vZGUgPT09ICdsaXN0J1wiPlxuICA8ZGl2ICpuZ0lmPVwidGhpcy5zZWxlY3RlZE1vZGVsSWRzLmxlbmd0aFwiIGNsYXNzPVwiZC1ub25lIGQtbWQtZmxleCBmbGV4LWNvbHVtblwiPlxuICAgIDxtYXQtY2FyZCBjbGFzcz1cInVwZGF0ZV9jYXJkXCIgKm5nSWY9XCJ0aGlzLnNlbGVjdGVkTW9kZWxJZHMubGVuZ3RoXCI+XG4gICAgICA8bWF0LWNhcmQtaGVhZGVyPlxuICAgICAgICA8bWF0LWNhcmQtdGl0bGU+XG4gICAgICAgICAgPGRpdiBtYXQtZGlhbG9nLXRpdGxlIGNsYXNzPVwibXQtMiBtbC0yIHRleHQtY2VudGVyXCI+XG4gICAgICAgICAgICA8ZGl2PlVwZGF0ZSBTZWxlY3RlZCBSb3dzPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbWF0LWNhcmQtdGl0bGU+XG4gICAgICA8L21hdC1jYXJkLWhlYWRlcj5cbiAgICAgIDxtYXQtY2FyZC1jb250ZW50IGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uXCI+XG4gICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwidXBkYXRlUm93Rm9ybVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW5cIj5cblxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwidy0xMDAgcHgtMVwiPlxuICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwidGl0bGVcIiBwbGFjZWhvbGRlcj1cIlRpdGxlXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgLz5cbiAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cInVwZGF0ZVJvd0Zvcm0uZ2V0KCd0aXRsZScpLnZhbHVlIHx8IHVwZGF0ZVJvd0Zvcm0uZ2V0KCd0aXRsZScpLnZhbHVlPT09MFwiIG1hdFN1ZmZpeFxuICAgICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvbiBzdHlsZT1cImNvbG9yOnJlZFwiIChjbGljayk9XCJ1cGRhdGVSb3dGb3JtLmdldCgndGl0bGUnKS5zZXRWYWx1ZSgnJylcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBtYXRTdWZmaXggbWF0LWljb24tYnV0dG9uIHR5cGU9XCJidXR0b25cIiBzdHlsZT1cImNvbG9yOmdyZWVuXCIgKm5nSWY9XCIodXBkYXRlUm93Rm9ybS5nZXQoJ3RpdGxlJykudmFsdWUgfHwgdXBkYXRlUm93Rm9ybS5nZXQoJ3RpdGxlJykudmFsdWU9PT0wKVxuICAgICAgICAgICAgICAgICYmIHVwZGF0ZVJvd0Zvcm0uZ2V0KCd0aXRsZScpLnZhbGlkXCIgKGNsaWNrKT1cImJ1bGtVcGRhdGUoJ3RpdGxlJylcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24+ZG9uZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwidy0xMDAgcHgtMVwiPlxuICAgICAgICAgICAgICA8dGV4dGFyZWEgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwiZGV0YWlsc1wiIHBsYWNlaG9sZGVyPVwiRGV0YWlsc1wiIGF1dG9jb21wbGV0ZT1cIm9mZlwiPjwvdGV4dGFyZWE+XG4gICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJ1cGRhdGVSb3dGb3JtLmdldCgnZGV0YWlscycpLnZhbHVlIHx8IHVwZGF0ZVJvd0Zvcm0uZ2V0KCdkZXRhaWxzJykudmFsdWU9PT0wXCIgbWF0U3VmZml4XG4gICAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uIHN0eWxlPVwiY29sb3I6cmVkXCIgKGNsaWNrKT1cInVwZGF0ZVJvd0Zvcm0uZ2V0KCdkZXRhaWxzJykuc2V0VmFsdWUoJycpXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDxidXR0b24gbWF0U3VmZml4IG1hdC1pY29uLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgc3R5bGU9XCJjb2xvcjpncmVlblwiICpuZ0lmPVwiKHVwZGF0ZVJvd0Zvcm0uZ2V0KCdkZXRhaWxzJykudmFsdWUgfHwgdXBkYXRlUm93Rm9ybS5nZXQoJ2RldGFpbHMnKS52YWx1ZT09PTApXG4gICAgICAgICAgICAgICAgJiYgdXBkYXRlUm93Rm9ybS5nZXQoJ2RldGFpbHMnKS52YWxpZFwiIChjbGljayk9XCJidWxrVXBkYXRlKCdkZXRhaWxzJylcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24+ZG9uZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInVzZVRlY2hsaWZ5VGFnc1wiPlxuICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgPG1hdC1sYWJlbD5UYWc8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICA8YXBwLXRlY2hsaWZ5LXRhZ2dlci10YWctZm9ybS1maWVsZCBtb2RlbFR5cGU9XCJlbnRpdHktZmlsZVwiIGZvcm1Db250cm9sTmFtZT1cInRhZ19pZHNcIlxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJFbnRlciBuZXcgdGFnXCI+XG4gICAgICAgICAgICAgICAgPC9hcHAtdGVjaGxpZnktdGFnZ2VyLXRhZy1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJ1cGRhdGVSb3dGb3JtLmdldCgndGFnX2lkcycpLnZhbHVlIHx8IHVwZGF0ZVJvd0Zvcm0uZ2V0KCd0YWdfaWRzJykudmFsdWU9PT0wXCIgbWF0U3VmZml4XG4gICAgICAgICAgICAgICAgICBtYXQtaWNvbi1idXR0b24gc3R5bGU9XCJjb2xvcjpyZWRcIiAoY2xpY2spPVwidXBkYXRlUm93Rm9ybS5nZXQoJ3RhZ19pZHMnKS5zZXRWYWx1ZSgnJylcIj5cbiAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXRTdWZmaXggbWF0LWljb24tYnV0dG9uIHR5cGU9XCJidXR0b25cIiBzdHlsZT1cImNvbG9yOmdyZWVuXCIgKm5nSWY9XCIodXBkYXRlUm93Rm9ybS5nZXQoJ3RhZ19pZHMnKS52YWx1ZSB8fCB1cGRhdGVSb3dGb3JtLmdldCgndGFnX2lkcycpLnZhbHVlPT09MClcbiAgICAgICAgICAgICAgICAgICYmIHVwZGF0ZVJvd0Zvcm0uZ2V0KCd0YWdfaWRzJykudmFsaWRcIiAoY2xpY2spPVwiYnVsa1VwZGF0ZSgndGFnX2lkcycpXCI+XG4gICAgICAgICAgICAgICAgICA8bWF0LWljb24+ZG9uZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9mb3JtPlxuICAgICAgPC9tYXQtY2FyZC1jb250ZW50PlxuICAgIDwvbWF0LWNhcmQ+XG5cbiAgPC9kaXY+XG5cbiAgPGRpdj5cbiAgICA8ZGl2IGNsYXNzPVwibWF0LXR5cG9ncmFwaHlcIiAqbmdJZj1cIiFkaXNwbGF5TW9kZVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LXJvdyBnYXAtM1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uIGdhcC0yIGZsZXgtZ3Jvdy0xXCI+XG4gICAgICAgICAgPG1hdC1jYXJkPlxuICAgICAgICAgICAgPG1hdC1jYXJkLWNvbnRlbnQ+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZ2FwLTIgYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb25cbiAgICAgICAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cImZvbnQtd2VpZ2h0LWJvbGQgbWItMFwiPlxuICAgICAgICAgICAgICAgICAge3t0aXRsZX19c1xuICAgICAgICAgICAgICAgIDwvaDM+XG4gICAgICAgICAgICAgICAgPGFwcC10ZWNobGlmeS1mb3JtLWJ1dHRvbiBjbGFzcz1cIm1zLTJcIiAqbmdJZj1cIiF2aWV3T25seSAmJiBpc1Nob3dDcmVhdGVBY3Rpb24gJiYgZW50aXR5SWRcIlxuICAgICAgICAgICAgICAgICAgW2NvbXBvbmVudF09XCJlbnRpdHlGaWxlRm9ybSgpXCIgW2RhdGFdPVwiZm9ybURhdGFcIlxuICAgICAgICAgICAgICAgICAgKHNhdmVkKT1cIm1vZGVsQ3JlYXRlZCgkZXZlbnQpXCI+PC9hcHAtdGVjaGxpZnktZm9ybS1idXR0b24+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmbGV4LWdyb3ctMVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImZpbHRlckZvcm1cIiBjbGFzcz1cImQtZmxleCBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkICpuZ0lmPVwiIXJlbW92ZVNlYXJjaFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+U2VhcmNoPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cInRpdGxlXCIgcGxhY2Vob2xkZXI9XCJTZWFyY2hcIiBuYW1lPVwidGl0bGVcIlxuICAgICAgICAgICAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJmaWx0ZXJGb3JtLmdldCgndGl0bGUnKS52YWx1ZVwiIG1hdFN1ZmZpeCBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVzZXRGaWx0ZXIoJ3RpdGxlJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ1c2VUZWNobGlmeVRhZ3NcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+VGFnPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgPGFwcC10ZWNobGlmeS10YWdnZXItdGFnLWZvcm0tZmllbGQgW2NhdGVnb3JpZXNdPVwidGVjaGxpZnlUYWdDYXRlZ29yaWVzXCIgZm9ybUNvbnRyb2xOYW1lPVwidGFnX2lkc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjdCBUYWdzXCIgW2NvbmZpZ109XCJ0ZWNobGlmeVRhZ0NvbmZpZ1wiPjwvYXBwLXRlY2hsaWZ5LXRhZ2dlci10YWctZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICA8YXBwLXRpbWVsaW5lLWZpbHRlciBjbGFzcz1cImZsLXNtXCIgZm9ybUNvbnRyb2xOYW1lPSdwZXJpb2RfaWQnIGxhYmVsVGV4dD1cIkV4cGlyZXMgT25cIlxuICAgICAgICAgICAgICAgICAgICBkYXRlRnJvbT1cImV4cGlyZXNfb25fZnJvbVwiIGRhdGVUbz1cImV4cGlyZXNfb25fdG9cIiBbZm9ybV09XCJmaWx0ZXJGb3JtXCI+PC9hcHAtdGltZWxpbmUtZmlsdGVyPlxuICAgICAgICAgICAgICAgIDwvZm9ybT5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L21hdC1jYXJkLWNvbnRlbnQ+XG4gICAgICAgICAgICA8bWF0LWNhcmQtY29udGVudCBjbGFzcz1cImVudGl0eS1maWxlLWNhcmQgcC0wXCIgKm5nSWY9XCJlbnRpdHlJZFwiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGFibGVWaWV3XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L21hdC1jYXJkLWNvbnRlbnQ+XG4gICAgICAgICAgPC9tYXQtY2FyZD5cblxuICAgICAgICAgIDxtYXQtY2FyZCAqbmdJZj1cIiFlbnRpdHlJZFwiPlxuICAgICAgICAgICAgPG1hdC1jYXJkLWNvbnRlbnQgY2xhc3M9XCJlbnRpdHktZmlsZS1jYXJkIHAtMFwiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGFibGVWaWV3XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L21hdC1jYXJkLWNvbnRlbnQ+XG4gICAgICAgICAgPC9tYXQtY2FyZD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc1Nob3dEcmFnRHJvcFNlY3Rpb24gJiYgZW50aXR5SWRcIj5cbiAgICAgICAgICA8c2VjdGlvbiBzdHlsZT1cImZsZXg6IDAgMSAzMCU7XCIgKm5nSWY9XCIhdGhpcy5zZWxlY3RlZE1vZGVsSWRzLmxlbmd0aCAmJiAhdmlld09ubHkgJiYgaXNTaG93Q3JlYXRlQWN0aW9uXCI+XG4gICAgICAgICAgICA8YXBwLWZpbGUtZHJvcHBlciBbY29uZmlnXT1cImZpbGVDb25maWdcIiAoZmlsZUNoYW5nZWQpPVwiZmlsZUNoYW5nZWQoJGV2ZW50KVwiPlxuICAgICAgICAgICAgPC9hcHAtZmlsZS1kcm9wcGVyPlxuICAgICAgICAgIDwvc2VjdGlvbj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPG5nLXRlbXBsYXRlICN0YWJsZVZpZXc+XG4gICAgPHRhYmxlIG1hdC10YWJsZSBbZGF0YVNvdXJjZV09XCJtb2RlbHNcIiBjbGFzcz1cInctMTAwXCIgbWF0U29ydCBtdWx0aVRlbXBsYXRlRGF0YVJvd3MgaW5maW5pdGVTY3JvbGxcbiAgICAgIFtpbmZpbml0ZVNjcm9sbERpc3RhbmNlXT1cIjEuNVwiIFtpbmZpbml0ZVNjcm9sbFRocm90dGxlXT1cIjUwXCIgKHNjcm9sbGVkKT1cIm9uU2Nyb2xsKClcIj5cblxuICAgICAgPCEtLSBTZWxlY3QgQ29sdW1uIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJzZWxlY3RcIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBzdHlsZT1cIndpZHRoOjMwcHhcIj5cbiAgICAgICAgICA8bWF0LWNoZWNrYm94IG5hbWU9XCJlbXBsb3llZVwiIFsobmdNb2RlbCldPVwiaXNBbGxTZWxlY3RlZFwiIChjaGFuZ2UpPVwic2VsZWN0QWxsKClcIj5cbiAgICAgICAgICA8L21hdC1jaGVja2JveD5cbiAgICAgICAgPC90aD5cbiAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIiBzdHlsZT1cIndpZHRoOjMwcHhcIj5cbiAgICAgICAgICA8bWF0LWNoZWNrYm94IG5hbWU9XCJlbXBsb3llZVt7e2VsZW1lbnQ/LmlkfX1dXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cImVsZW1lbnQuaXNfc2VsZWN0ZWRcIiAoY2hhbmdlKT1cImlzU2VsZWN0aW9uTW9kaWZpZWQoJGV2ZW50LCBlbGVtZW50KVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiIW1vZGVscy5sZW5ndGhcIj5cbiAgICAgICAgICA8L21hdC1jaGVja2JveD5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8IS0tIEluZGV4IENvbHVtbiAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiaW5kZXhcIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj4gIyA8L3RoPlxuICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudDsgbGV0IGkgPSBkYXRhSW5kZXhcIj4ge3sgaSsxIH19IDwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBUaXRsZSBDb2x1bW4gLS0+XG4gICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInRpdGxlXCI+XG4gICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+IFRpdGxlIDwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XG4gICAgICAgICAge3tlbGVtZW50LnRpdGxlfX1cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidXNlVGVjaGxpZnlUYWdzXCI+XG4gICAgICAgICAgICA8YnI+XG4gICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJiYWRnZSBiYWRnZS1zZWNvbmRhcnkgbXItMVwiICpuZ0Zvcj1cImxldCB0YWcgb2YgZWxlbWVudD8udGFnc1wiPnt7dGFnPy50aXRsZX19PC9zbWFsbD5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiZXhwaXJlc19vblwiPlxuICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPiBFeHBpcmVzIE9uIDwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XG4gICAgICAgICAge3tlbGVtZW50Py5leHBpcmVzX29uIHwgZGF0ZTonbWVkaXVtRGF0ZSd9fVxuICAgICAgICA8L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDwhLS0gRGV0YWlscyBDb2x1bW4gLS0+XG4gICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImRldGFpbHNcIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj4gRGV0YWlscyA8L3RoPlxuICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPlxuICAgICAgICAgIDxhcHAtcmVhZC1tb3JlIFt0ZXh0XT1cImVsZW1lbnQuZGV0YWlsc1wiIFttYXhMZW5ndGhdPVwiNTBcIj48L2FwcC1yZWFkLW1vcmU+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBGaWxlIHNpemUgQ29sdW1uIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJmaWxlX3NpemVcIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj4gRmlsZSBTaXplIDwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+IHt7IGVsZW1lbnQuZmlsZV9zaXplIHwgZmlsZVNpemUgfX0gPC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8IS0tIFVwbG9hZGVkIE9uIENvbHVtbiAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwidXBsb2FkZWRfb25cIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj4gVXBsb2FkZWQgT24gPC90aD5cbiAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAge3tlbGVtZW50LmNyZWF0ZWRfYXQgfCBkYXRlOiAnbWVkaXVtRGF0ZSd9fVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW11dGVkXCI+XG4gICAgICAgICAgICBCeSB7e2VsZW1lbnQuY3JlYXRvcj8ubmFtZX19XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBBY3Rpb25zIENvbHVtbiAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiYWN0aW9uc1wiPlxuICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPiBBY3Rpb25zIDwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCIgY2xhc3M9XCJ0ZXh0LW11dGVkXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LXJvdyBnYXAtMiB0ZXh0LXNlY29uZGFyeSBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgIDxhIGhyZWY9XCJ7e2VsZW1lbnQudXJsfX1cIiB0YXJnZXQ9XCJfYmxhbmtcIiBjbGFzcz1cInRleHQtZGVjb3JhdGlvbi1ub25lIHRleHQtbXV0ZWQgY2xpY2thYmxlXCI+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbj5kb3dubG9hZDwvbWF0LWljb24+XG4gICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICA8YXBwLXRlY2hsaWZ5LWZvcm0tYnV0dG9uICpuZ0lmPVwiIXZpZXdPbmx5ICYmIGlzU2hvd1VwZGF0ZUFjdGlvblwiIFtjb21wb25lbnRdPVwiZW50aXR5RmlsZUZvcm0oKVwiXG4gICAgICAgICAgICAgIFttb2RlbF09XCJlbGVtZW50XCIgW2RhdGFdPVwiZm9ybURhdGFcIiAoc2F2ZWQpPVwibW9kZWxzVXBkYXRlZEJ5SWQoJGV2ZW50KVwiPjwvYXBwLXRlY2hsaWZ5LWZvcm0tYnV0dG9uPlxuICAgICAgICAgICAgPGFwcC10ZWNobGlmeS1kZWxldGUtYnV0dG9uICpuZ0lmPVwiIXZpZXdPbmx5ICYmIGlzU2hvd0RlbGV0ZUFjdGlvblwiIFttb2RlbF09XCJlbGVtZW50XCIgW3NlcnZpY2VdPVwic2VydmljZVwiXG4gICAgICAgICAgICAgIG1lc3NhZ2U9XCJBcmUgeW91IHN1cmUgdG8gcHJvY2VlZCBkZWxldGUgdGhlIGZpbGUge3tlbGVtZW50LnRpdGxlfX1cIlxuICAgICAgICAgICAgICAoZGVsZXRlZCk9XCJtb2RlbHNEZWxldGVkQnlJZChlbGVtZW50KVwiPlxuICAgICAgICAgICAgPC9hcHAtdGVjaGxpZnktZGVsZXRlLWJ1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8dHIgbWF0LWhlYWRlci1yb3cgKm1hdEhlYWRlclJvd0RlZj1cImRpc3BsYXllZENvbHVtbnNcIj48L3RyPlxuICAgICAgPHRyIG1hdC1yb3cgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IGRpc3BsYXllZENvbHVtbnM7XCI+PC90cj5cbiAgICA8L3RhYmxlPlxuXG4gICAgPG1hdC1wcm9ncmVzcy1iYXIgbW9kZT1cImluZGV0ZXJtaW5hdGVcIiAqbmdJZj1cImlzV29ya2luZ1wiPjwvbWF0LXByb2dyZXNzLWJhcj5cbiAgPC9uZy10ZW1wbGF0ZT5cblxuICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtd3JhcCBnYXAtMyBtYXQtdHlwb2dyYXBoeSBwLTRcIiAqbmdJZj1cImRpc3BsYXlNb2RlXCI+XG4gICAgPGRpdiAqbmdGb3I9XCJsZXQgZWZpbGUgb2YgbW9kZWxzXCI+XG4gICAgICA8YXBwLWRvY3VtZW50LXZpZXdlciBbZmlsZV09XCJlZmlsZS5maWxlXCIgW2ZpbGVVcmxdPVwiZWZpbGUudXJsXCIgW2NvbmZpZ109XCJ0aGlzLnZpZXdlckNvbmZpZ1wiIFtkaXNhYmxlRWRpdF09XCJ0cnVlXCI+XG4gICAgICA8L2FwcC1kb2N1bWVudC12aWV3ZXI+XG4gICAgICA8YSBocmVmPVwie3tlZmlsZS51cmx9fVwiIHRhcmdldD1cIl9ibGFua1wiPlxuICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gdHlwZT1cImJ1dHRvblwiPlZpZXc8L2J1dHRvbj5cbiAgICAgIDwvYT5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPG1hdC1jYXJkICpuZ0lmPVwidmlld01vZGUgPT09ICd0aW1lbGluZSdcIj5cbiAgPG1hdC1jYXJkLWNvbnRlbnQ+XG4gICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtc3RhcnQgYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICA8bWF0LWljb24+XG4gICAgICAgIGRlc2NyaXB0aW9uXG4gICAgICA8L21hdC1pY29uPlxuICAgICAgPGgzIGNsYXNzPVwiZm9udC13ZWlnaHQtYm9sZCBtYi0wXCI+XG4gICAgICAgIHt7dGl0bGV9fXNcbiAgICAgIDwvaDM+XG4gICAgICA8YXBwLXRlY2hsaWZ5LWZvcm0tYnV0dG9uICpuZ0lmPVwiIXZpZXdPbmx5ICYmIGlzU2hvd0NyZWF0ZUFjdGlvblwiIFtjb21wb25lbnRdPVwiZW50aXR5RmlsZUZvcm0oKVwiIFtkYXRhXT1cImZvcm1EYXRhXCJcbiAgICAgICAgKHNhdmVkKT1cIm1vZGVsQ3JlYXRlZCgkZXZlbnQpXCI+PC9hcHAtdGVjaGxpZnktZm9ybS1idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvbWF0LWNhcmQtY29udGVudD5cbiAgPG1hdC1jYXJkLWNvbnRlbnQgKm5nSWY9XCIhdGhpcy5zZWxlY3RlZE1vZGVsSWRzLmxlbmd0aCAmJiAhdmlld09ubHkgJiYgaXNTaG93Q3JlYXRlQWN0aW9uXCIgY2xhc3M9XCJtdC0zXCI+XG4gICAgPGFwcC1maWxlLWRyb3BwZXIgW2NvbmZpZ109XCJmaWxlQ29uZmlnXCIgKGZpbGVDaGFuZ2VkKT1cImZpbGVDaGFuZ2VkKCRldmVudClcIj5cbiAgICA8L2FwcC1maWxlLWRyb3BwZXI+XG4gIDwvbWF0LWNhcmQtY29udGVudD5cblxuICA8bWF0LWNhcmQtY29udGVudCBjbGFzcz1cIm10LTNcIj5cbiAgICA8ZGl2ICpuZ0Zvcj1cImxldCBlbnRpdHlGaWxlIG9mIG1vZGVsc1wiIGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uIGdhcC0wXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uIGdhcC0wXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIGdhcC0xXCI+XG4gICAgICAgICAgPHAgY2xhc3M9XCJtYi0wIGZ3LWJvbGQgdGV4dC13cmFwXCI+e3sgZW50aXR5RmlsZT8udGl0bGUgfCB3cmFwOjIwIH19PC9wPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UgYmctZGFya1wiICpuZ0Zvcj1cImxldCB0YWcgb2YgZW50aXR5RmlsZT8udGFnc1wiPlxuICAgICAgICAgICAge3sgdGFnPy50aXRsZSB9fVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhcmtcIj57eyBlbnRpdHlGaWxlLmZpbGVfc2l6ZSB8IGZpbGVTaXplIH19PC9zbWFsbD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxhcHAtcmVhZC1tb3JlIFt0ZXh0XT1cImVudGl0eUZpbGU/LmRldGFpbHNcIiBbbWF4TGVuZ3RoXT1cIjUwXCI+PC9hcHAtcmVhZC1tb3JlPlxuICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBnYXAtMlwiPlxuICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LXNlY29uZGFyeVwiIHN0eWxlPVwibWF4LXdpZHRoOiA3MCVcIj5cbiAgICAgICAgICA8aT5VcGxvYWRlZCBCeSB7eyBlbnRpdHlGaWxlPy5jcmVhdG9yPy5uYW1lIH19IHt7IGVudGl0eUZpbGU/LmNyZWF0ZWRfYXQgfCBkYXRlOiAnbWVkaXVtRGF0ZSd9fTwvaT5cbiAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMVwiPlxuICAgICAgICAgIDxhIGhyZWY9XCJ7e2VudGl0eUZpbGU/LnVybH19XCIgdGFyZ2V0PVwiX2JsYW5rXCIgY2xhc3M9XCJ0ZXh0LWRlY29yYXRpb24tbm9uZSB0ZXh0LXNlY29uZGFyeSBtdC0yXCI+XG4gICAgICAgICAgICA8bWF0LWljb24+ZG93bmxvYWQ8L21hdC1pY29uPlxuICAgICAgICAgIDwvYT5cbiAgICAgICAgICA8YXBwLXRlY2hsaWZ5LWZvcm0tYnV0dG9uIGNsYXNzPVwidGV4dC1zZWNvbmRhcnlcIiAqbmdJZj1cIiF2aWV3T25seSAmJiBpc1Nob3dVcGRhdGVBY3Rpb25cIlxuICAgICAgICAgICAgW2NvbXBvbmVudF09XCJlbnRpdHlGaWxlRm9ybSgpXCIgW21vZGVsXT1cImVudGl0eUZpbGVcIiBbZGF0YV09XCJmb3JtRGF0YVwiXG4gICAgICAgICAgICAoc2F2ZWQpPVwibW9kZWxzVXBkYXRlZEJ5SWQoJGV2ZW50KVwiPjwvYXBwLXRlY2hsaWZ5LWZvcm0tYnV0dG9uPlxuICAgICAgICAgIDxhcHAtdGVjaGxpZnktZGVsZXRlLWJ1dHRvbiAqbmdJZj1cIiF2aWV3T25seSAmJiBpc1Nob3dEZWxldGVBY3Rpb25cIiBjbGFzcz0ndGV4dC1zZWNvbmRhcnkgbXMtMSdcbiAgICAgICAgICAgIFttb2RlbF09XCJlbnRpdHlGaWxlXCIgW3NlcnZpY2VdPVwic2VydmljZVwiXG4gICAgICAgICAgICBtZXNzYWdlPVwiQXJlIHlvdSBzdXJlIHRvIHByb2NlZWQgZGVsZXRlIHRoZSBmaWxlIHt7ZW50aXR5RmlsZS50aXRsZX19XCJcbiAgICAgICAgICAgIChkZWxldGVkKT1cIm1vZGVsc0RlbGV0ZWRCeUlkKGVudGl0eUZpbGUpXCI+XG4gICAgICAgICAgPC9hcHAtdGVjaGxpZnktZGVsZXRlLWJ1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxociBzdHlsZT1cIm1hcmdpbjogMC41cmVtIDBcIj5cbiAgICA8L2Rpdj5cbiAgICA8bWF0LXByb2dyZXNzLWJhciBtb2RlPVwiaW5kZXRlcm1pbmF0ZVwiICpuZ0lmPVwiaXNXb3JraW5nXCI+PC9tYXQtcHJvZ3Jlc3MtYmFyPlxuICA8L21hdC1jYXJkLWNvbnRlbnQ+XG48L21hdC1jYXJkPiJdfQ==
235
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LWZpbGUtbGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdGVjaGxpZnktY29yZS9zcmMvbGliL2VudGl0eS1maWxlcy9lbnRpdHktZmlsZS1saXN0L2VudGl0eS1maWxlLWxpc3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXRlY2hsaWZ5LWNvcmUvc3JjL2xpYi9lbnRpdHktZmlsZXMvZW50aXR5LWZpbGUtbGlzdC9lbnRpdHktZmlsZS1saXN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQU96RixPQUFPLEVBQ0wsZ0NBQWdDLEVBQ2pDLE1BQU0sZ0ZBQWdGLENBQUM7QUFDeEYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFHekQ7Ozs7R0FJRztBQU1ILE1BQU0sT0FBTyx1QkFBd0IsU0FBUSxxQkFBcUI7SUFhaEUsSUFBc0Isc0JBQXNCLENBQUMsS0FBYztRQUN6RCxJQUFJLENBQUMsdUJBQXVCLEdBQUcsS0FBSyxDQUFDO0lBQ3ZDLENBQUM7SUFDRCxJQUFhLHNCQUFzQjtRQUNqQyxPQUFPLElBQUksQ0FBQyx1QkFBdUIsQ0FBQztJQUN0QyxDQUFDO0lBK0JELFlBQ2tCLE9BQTBCLEVBQ2xDLFlBQTBCLEVBQzFCLEVBQXNCLEVBQ3RCLFlBQWlDLEVBQ2pDLGtCQUF5QztRQUVqRCxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFOQyxZQUFPLEdBQVAsT0FBTyxDQUFtQjtRQUNsQyxpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMx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dkIsdUJBQXVCLDByQkN4QnBDLDBwYkE0Ulc7OzRGRHBRRSx1QkFBdUI7a0JBTG5DLFNBQVM7K0JBQ0UsaURBQWlEO3dOQUtsRCxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLHFCQUFxQjtzQkFBN0IsS0FBSztnQkFFZ0Isc0JBQXNCO3NCQUEzQyxLQUFLO2dCQVVHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0cscUJBQXFCO3NCQUE3QixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFPRyxLQUFLO3NCQUFiLEtBQUs7Z0JBZUcsVUFBVTtzQkFBbEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBFbnRpdHlGaWxlRm9ybUNvbXBvbmVudCB9IGZyb20gJy4uL2VudGl0eS1maWxlLWZvcm0vZW50aXR5LWZpbGUtZm9ybS5jb21wb25lbnQnO1xuaW1wb3J0IHsgRW50aXR5RmlsZVNlcnZpY2UgfSBmcm9tICcuLi9lbnRpdHktZmlsZS5zZXJ2aWNlJztcbmltcG9ydCB7IFVudHlwZWRGb3JtQnVpbGRlciwgVW50eXBlZEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEFsZXJ0U2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvYWxlcnQuc2VydmljZSc7XG5pbXBvcnQgeyBWaWV3ZXJDb25maWcgfSBmcm9tICcuLi8uLi9kb2N1bWVudC12aWV3ZXIvdmlld2VyLWNvbmZpZy5tb2RlbCc7XG5pbXBvcnQgeyBGaWxlRHJvcHBlckNvbmZpZyB9IGZyb20gJy4uLy4uL2ZpbGUtZHJvcHBlcic7XG5pbXBvcnQgeyBFcnJvckhhbmRsZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9lcnJvci1oYW5kbGVyLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgVGVjaGxpZnlUYWdnZXJUYWdGb3JtQ29uZmlnTW9kZWxcbn0gZnJvbSBcIi4uLy4uL3RhZy90ZWNobGlmeS10YWdnZXItdGFnLWZvcm0tZmllbGQvdGVjaGxpZnktdGFnZ2VyLXRhZy1mb3JtLWNvbmZpZy5tb2RlbFwiO1xuaW1wb3J0IHsgVGVjaGxpZnlMaXN0Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vYmFzZS1tb2RlbCc7XG5pbXBvcnQgeyBOZ3hQZXJtaXNzaW9uc1NlcnZpY2UgfSBmcm9tICduZ3gtcGVybWlzc2lvbnMnO1xuXG4vKipcbiAqIFdlIGFyZSB1c2luZyBib3RoIGFwcC1lbnRpdHktZmlsZS1saXN0IGFuZCBhcHAtZW50aXR5LWZpbGVzLXZpZXctYWxsIFxuICogdG8gZW5zdXJlIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBwcm9qZWN0cyBgbmd4LXRlY2hsaWZ5LWRvY3VtZW50cywgbmd4LXRlY2hsaWZ5LWNoZWNrc2hlZXRzYFxuICogZXRjLiBgYXBwLWVudGl0eS1maWxlcy12aWV3LWFsbGAgd2lsbCBiZSByZW1vdmVkIGJ5IGB2MTguODAuMGBcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWVudGl0eS1maWxlLWxpc3QsIGFwcC1lbnRpdHktZmlsZXMtdmlldy1hbGwnLFxuICB0ZW1wbGF0ZVVybDogJy4vZW50aXR5LWZpbGUtbGlzdC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2VudGl0eS1maWxlLWxpc3QuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBFbnRpdHlGaWxlTGlzdENvbXBvbmVudCBleHRlbmRzIFRlY2hsaWZ5TGlzdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBJbnB1dCgpIGVudGl0eUlkOiBudW1iZXI7XG4gIEBJbnB1dCgpIGVudGl0eVR5cGU6IHN0cmluZztcbiAgQElucHV0KCkgdmlld09ubHk6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgcmVtb3ZlU2VhcmNoOiBib29sZWFuO1xuICBASW5wdXQoKSBoaWRlVGl0bGVBbmREZXRhaWxzOiBib29sZWFuO1xuICBASW5wdXQoKSBkaXNwbGF5TW9kZTogYm9vbGVhbjtcbiAgQElucHV0KCkgYWxsb3dNdWx0aXBsZUZpbGVzOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGFsbG93QnVsa1VwZGF0ZTogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSB2aWV3TW9kZTogJ2xpc3QnIHwgJ3RpbWVsaW5lJyA9ICdsaXN0JztcbiAgQElucHV0KCkgZmlsZURyb3BwZXJIZWlnaHQgPSAnNTAwcHgnO1xuICBASW5wdXQoKSBpc1Nob3dEcmFnRHJvcFNlY3Rpb246IGJvb2xlYW4gPSB0cnVlO1xuXG4gIEBJbnB1dCgpIG92ZXJyaWRlIHNldCBpc0ZpbHRlclBhdGNoRnJvbVJvdXRlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5faXNGaWx0ZXJQYXRjaEZyb21Sb3V0ZSA9IHZhbHVlO1xuICB9XG4gIG92ZXJyaWRlIGdldCBpc0ZpbHRlclBhdGNoRnJvbVJvdXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc0ZpbHRlclBhdGNoRnJvbVJvdXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNob3VsZCB3ZSBhbGxvdyB0YWdnaW5nIGVudGl0eS1maWxlcz9cbiAgICovXG4gIEBJbnB1dCgpIHVzZVRlY2hsaWZ5VGFncyA9IGZhbHNlO1xuICBASW5wdXQoKSB0ZWNobGlmeVRhZ0NhdGVnb3JpZXM6IHN0cmluZ1tdID0gW107XG4gIEBJbnB1dCgpIHRlY2hsaWZ5VGFnQ29uZmlnOiBUZWNobGlmeVRhZ2dlclRhZ0Zvcm1Db25maWdNb2RlbCA9IG5ldyBUZWNobGlmeVRhZ2dlclRhZ0Zvcm1Db25maWdNb2RlbCgpO1xuXG5cbiAgZW50aXR5RmlsZUZvcm0gPSBzaWduYWwoRW50aXR5RmlsZUZvcm1Db21wb25lbnQpO1xuICBmb3JtRGF0YTogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuXG4gIHZpZXdlckNvbmZpZzogVmlld2VyQ29uZmlnO1xuICBASW5wdXQoKSB0aXRsZTogc3RyaW5nID0gXCJGaWxlXCI7XG4gIGRpc3BsYXllZENvbHVtbnMgPSBbXG4gICAgJ2luZGV4JyxcbiAgICAndGl0bGUnLFxuICAgICdleHBpcmVzX29uJyxcbiAgICAnZGV0YWlscycsXG4gICAgJ2ZpbGVfc2l6ZScsXG4gICAgJ3VwbG9hZGVkX29uJyxcbiAgXTtcbiAgZmlsZUNvbmZpZzogRmlsZURyb3BwZXJDb25maWc7XG4gIHVwZGF0ZVJvd0Zvcm06IFVudHlwZWRGb3JtR3JvdXA7XG4gIGlzU2hvd0NyZWF0ZUFjdGlvbjogYm9vbGVhbiA9IHRydWU7XG4gIGlzU2hvd1VwZGF0ZUFjdGlvbjogYm9vbGVhbiA9IHRydWU7XG4gIGlzU2hvd0RlbGV0ZUFjdGlvbjogYm9vbGVhbiA9IHRydWU7XG4gIGlzU2hvd1JlYWRBY3Rpb246IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBwZXJtaXNzaW9uOiB7IGNyZWF0ZTogc3RyaW5nLCB1cGRhdGU6IHN0cmluZywgZGVsZXRlOiBzdHJpbmcsIHJlYWQ6IHN0cmluZyB9O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBvdmVycmlkZSBzZXJ2aWNlOiBFbnRpdHlGaWxlU2VydmljZSxcbiAgICBwcml2YXRlIGFsZXJ0U2VydmljZTogQWxlcnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgZmI6IFVudHlwZWRGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIGVycm9ySGFuZGxlcjogRXJyb3JIYW5kbGVyU2VydmljZSxcbiAgICBwcml2YXRlIHBlcm1pc3Npb25zU2VydmljZTogTmd4UGVybWlzc2lvbnNTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKHNlcnZpY2UpO1xuICAgIHRoaXMuZmlsdGVyRm9ybUNvbmZpZ3VyYXRpb24gPSB7XG4gICAgICB0YWdfaWRzOiB7IG11bHRpcGxlOiB0cnVlIH1cbiAgICB9O1xuICAgIHRoaXMuZmlsdGVyRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgdGl0bGU6IFtcIlwiXSxcbiAgICAgIHRhZ19pZHM6IFtbXV0sXG4gICAgICBwZXJpb2RfaWQ6IFsnJ10sXG4gICAgICBleHBpcmVzX29uX2Zyb206IFsnJ10sXG4gICAgICBleHBpcmVzX29uX3RvOiBbJyddXG4gICAgfSk7XG5cbiAgICB0aGlzLnVwZGF0ZVJvd0Zvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIHRpdGxlOiBbJyddLFxuICAgICAgZGV0YWlsczogWycnXSxcbiAgICAgIHRhZ19pZHM6IFsnJ10sXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBuZ09uSW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcblxuICAgIC8qKlxuICAgICAqIFRoZSByZWFzb24gd2UgYXJlIHNldHRpbmcgcGVybWlzc2lvbnMgdGhpcyB3YXkgaXMgYmVjYXVzZSB0aGUgdXNlciBjYW4gcGFzcyB3aGF0IHBlcm1pc3Npb25zIGFyZSB0byBiZSB1c2VkXG4gICAgICogd2hlbiBtYW5pcHVsYXRpbmcgdGhlIGZpbGVzL2RvY3VtZW50cy4gSWYgdGhleSBhcmUgYSBjbGllbnQgYWRtaW4gd2Ugd2lsbCBza2lwIHRoaXNcbiAgICAgKi9cbiAgICBpZiAoIWF3YWl0IHRoaXMucGVybWlzc2lvbnNTZXJ2aWNlLmhhc1Blcm1pc3Npb24oJ2NsaWVudF9hZG1pbicpKSB7XG4gICAgICB0aGlzLmlzU2hvd0NyZWF0ZUFjdGlvbiA9IHRoaXMucGVybWlzc2lvbj8uY3JlYXRlID8gYXdhaXQgdGhpcy5wZXJtaXNzaW9uc1NlcnZpY2UuaGFzUGVybWlzc2lvbih0aGlzLnBlcm1pc3Npb24uY3JlYXRlKSA6IHRydWU7XG4gICAgICB0aGlzLmlzU2hvd1VwZGF0ZUFjdGlvbiA9IHRoaXMucGVybWlzc2lvbj8udXBkYXRlID8gYXdhaXQgdGhpcy5wZXJtaXNzaW9uc1NlcnZpY2UuaGFzUGVybWlzc2lvbih0aGlzLnBlcm1pc3Npb24udXBkYXRlKSA6IHRydWU7XG4gICAgICB0aGlzLmlzU2hvd1JlYWRBY3Rpb24gPSB0aGlzLnBlcm1pc3Npb24/LnJlYWQgPyBhd2FpdCB0aGlzLnBlcm1pc3Npb25zU2VydmljZS5oYXNQZXJtaXNzaW9uKHRoaXMucGVybWlzc2lvbi5yZWFkKSA6IHRydWU7XG4gICAgICB0aGlzLmlzU2hvd0RlbGV0ZUFjdGlvbiA9IHRoaXMucGVybWlzc2lvbj8uZGVsZXRlID8gYXdhaXQgdGhpcy5wZXJtaXNzaW9uc1NlcnZpY2UuaGFzUGVybWlzc2lvbih0aGlzLnBlcm1pc3Npb24uZGVsZXRlKSA6IHRydWU7XG4gICAgfVxuXG4gICAgdGhpcy5mb3JtRGF0YSA9IHtcbiAgICAgIGVudGl0eToge1xuICAgICAgICBlbnRpdHlfdHlwZTogdGhpcy5lbnRpdHlUeXBlLFxuICAgICAgICBlbnRpdHlfaWQ6IHRoaXMuZW50aXR5SWRcbiAgICAgIH0sXG4gICAgICBoaWRlVGl0bGVBbmREZXRhaWxzOiB0aGlzLmhpZGVUaXRsZUFuZERldGFpbHMsXG4gICAgICB1c2VUZWNobGlmeVRhZ3M6IHRoaXMudXNlVGVjaGxpZnlUYWdzLFxuICAgICAgdGVjaGxpZnlUYWdDYXRlZ29yaWVzOiB0aGlzLnRlY2hsaWZ5VGFnQ2F0ZWdvcmllcyxcbiAgICAgIHRlY2hsaWZ5VGFnQ29uZmlnOiB0aGlzLnRlY2hsaWZ5VGFnQ29uZmlnLFxuICAgIH07XG5cbiAgICAvLyBGaWxlIGRyb3BwZXIgY29uZmlnXG4gICAgdGhpcy5maWxlQ29uZmlnID0ge1xuICAgICAgZmlsZUlkOiBcImVudGl0eURhc2hib2FyZERyb3BwZXJcIixcbiAgICAgIGNvbnRhaW5lcklkOiBcImVudGl0eURhc2hib2FyZERyb3BwZXJDb250YWluZXJcIixcbiAgICAgIHN0eWxlczoge1xuICAgICAgICBoZWlnaHQ6IHRoaXMuZmlsZURyb3BwZXJIZWlnaHRcbiAgICAgIH0sXG4gICAgICBtdWx0aXBsZTogdGhpcy5hbGxvd011bHRpcGxlRmlsZXMsXG4gICAgICBhY2NlcHRGaWxlOiBcIipcIixcbiAgICAgIG1heFNpemU6IDEwLFxuICAgICAgYWNjZXB0RmlsZVRleHQ6IFwiQWxsIEZpbGVzXCJcbiAgICB9O1xuXG4gICAgdGhpcy52aWV3ZXJDb25maWcgPSB7XG4gICAgICBpbWFnZVN0eWxlOiB7XG4gICAgICAgIGhlaWdodDogJzIwMHB4JyxcbiAgICAgICAgd2lkdGg6ICcyMDBweCdcbiAgICAgIH0sXG4gICAgICB2aWV3ZXJTdHlsZToge1xuICAgICAgICBoZWlnaHQ6ICcgMTYwcHgnLFxuICAgICAgICB3aWR0aDogJzIwMHB4J1xuICAgICAgfSxcbiAgICAgIGhpZGVSZW1vdmU6IHRydWVcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMuaGlkZVRpdGxlQW5kRGV0YWlscykge1xuICAgICAgdGhpcy5kaXNwbGF5ZWRDb2x1bW5zID0gdGhpcy5kaXNwbGF5ZWRDb2x1bW5zLmZpbHRlcih4ID0+ICh4ICE9PSAnZGV0YWlscycpICYmICh4ICE9PSAndGl0bGUnKSk7XG4gICAgfVxuICAgIGlmICghdGhpcy52aWV3T25seSkge1xuICAgICAgdGhpcy5kaXNwbGF5ZWRDb2x1bW5zLnB1c2goJ2FjdGlvbnMnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuYWxsb3dCdWxrVXBkYXRlKSB7XG4gICAgICB0aGlzLmRpc3BsYXllZENvbHVtbnMucHVzaCgnc2VsZWN0Jyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNGaWx0ZXJQYXRjaEZyb21Sb3V0ZSkge1xuICAgICAgdGhpcy5wYXRjaEZpbHRlcnNGcm9tUm91dGUoKTtcbiAgICB9XG4gICAgdGhpcy5saXN0ZW5GaWx0ZXJDaGFuZ2VzKCk7XG4gICAgdGhpcy5sb2FkRGF0YSgpO1xuICB9XG5cbiAgb3ZlcnJpZGUgbG9hZERhdGEoKTogdm9pZCB7XG4gICAgdGhpcy5maWx0ZXJzID0ge1xuICAgICAgLi4udGhpcy5yZXF1ZXN0SGVscGVyU2VydmljZT8uY29udmVydFRvRm9ybURhdGEoXG4gICAgICAgIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5maWx0ZXJGb3JtLnZhbHVlKSlcbiAgICAgICksXG4gICAgICBlbnRpdHlfdHlwZTogdGhpcy5lbnRpdHlUeXBlLFxuICAgICAgZW50aXR5X2lkOiB0aGlzLmVudGl0eUlkLFxuICAgICAgd2l0aDogJ2NyZWF0b3IsdGFncycsXG4gICAgICBwYWdlOiB0aGlzLnBhZ2UsXG4gICAgICBwZXJfcGFnZTogdGhpcy5wZXJQYWdlXG4gICAgfTtcbiAgICBzdXBlci5sb2FkRGF0YSh0aGlzLmZpbHRlcnMpO1xuICB9XG5cbiAgYXN5bmMgZmlsZUNoYW5nZWQoZXZlbnQ6IGFueSkge1xuICAgIGNvbnN0IGZpbGVzOiBhbnlbXSA9IGV2ZW50O1xuICAgIGlmIChmaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zZXJ2aWNlLnVwbG9hZEVudGl0eUZpbGUoXG4gICAgICAgICAgZmlsZSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBlbnRpdHlfdHlwZTogdGhpcy5lbnRpdHlUeXBlLFxuICAgICAgICAgICAgZW50aXR5X2lkOiB0aGlzLmVudGl0eUlkLFxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucmVsb2FkKCk7XG4gICAgICB0aGlzLmFsZXJ0U2VydmljZS5hZGRBbGVydCgnRmlsZXMgdXBsb2FkZWQgc3VjY2Vzc2Z1bGx5IScsICdzdWNjZXNzJyk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgYnVsa1VwZGF0ZShmaWVsZE5hbWU6IGFueSkge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLnVwZGF0ZVJvd0Zvcm0udmFsdWU7XG4gICAgdGhpcy5pc1dvcmtpbmcgPSB0cnVlO1xuICAgIGRhdGEuZmllbGRfbmFtZSA9IGZpZWxkTmFtZTtcbiAgICBkYXRhLmRvY3VtZW50X2lkcyA9IHRoaXMuc2VsZWN0ZWRNb2RlbElkcztcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnNlcnZpY2UuYnVsa1VwZGF0ZShkYXRhKS50aGVuKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5hbGVydFNlcnZpY2UuYWRkQWxlcnQoXCJTdWNjZXNzZnVsbHkgdXBkYXRlZFwiLCBcInN1Y2Nlc3NcIik7XG4gICAgICAgICAgdGhpcy5pc1dvcmtpbmcgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLnJlbG9hZCgpO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuZXJyb3JIYW5kbGVyLmhhbmRsZUVycm9yKGVycm9yKTtcbiAgICAgIHRoaXMuaXNXb3JraW5nID0gZmFsc2U7XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2ICpuZ0lmPVwidmlld01vZGUgPT09ICdsaXN0J1wiPlxuICA8ZGl2ICpuZ0lmPVwidGhpcy5zZWxlY3RlZE1vZGVsSWRzLmxlbmd0aFwiIGNsYXNzPVwiZC1ub25lIGQtbWQtZmxleCBmbGV4LWNvbHVtblwiPlxuICAgIDxtYXQtY2FyZCBjbGFzcz1cInVwZGF0ZV9jYXJkXCIgKm5nSWY9XCJ0aGlzLnNlbGVjdGVkTW9kZWxJZHMubGVuZ3RoXCI+XG4gICAgICA8bWF0LWNhcmQtaGVhZGVyPlxuICAgICAgICA8bWF0LWNhcmQtdGl0bGU+XG4gICAgICAgICAgPGRpdiBtYXQtZGlhbG9nLXRpdGxlIGNsYXNzPVwibXQtMiBtbC0yIHRleHQtY2VudGVyXCI+XG4gICAgICAgICAgICA8ZGl2PlVwZGF0ZSBTZWxlY3RlZCBSb3dzPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbWF0LWNhcmQtdGl0bGU+XG4gICAgICA8L21hdC1jYXJkLWhlYWRlcj5cbiAgICAgIDxtYXQtY2FyZC1jb250ZW50IGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uXCI+XG4gICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwidXBkYXRlUm93Rm9ybVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW5cIj5cblxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwidy0xMDAgcHgtMVwiPlxuICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwidGl0bGVcIiBwbGFjZWhvbGRlcj1cIlRpdGxlXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgLz5cbiAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cInVwZGF0ZVJvd0Zvcm0uZ2V0KCd0aXRsZScpLnZhbHVlIHx8IHVwZGF0ZVJvd0Zvcm0uZ2V0KCd0aXRsZScpLnZhbHVlPT09MFwiIG1hdFN1ZmZpeFxuICAgICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvbiBzdHlsZT1cImNvbG9yOnJlZFwiIChjbGljayk9XCJ1cGRhdGVSb3dGb3JtLmdldCgndGl0bGUnKS5zZXRWYWx1ZSgnJylcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBtYXRTdWZmaXggbWF0LWljb24tYnV0dG9uIHR5cGU9XCJidXR0b25cIiBzdHlsZT1cImNvbG9yOmdyZWVuXCIgKm5nSWY9XCIodXBkYXRlUm93Rm9ybS5nZXQoJ3RpdGxlJykudmFsdWUgfHwgdXBkYXRlUm93Rm9ybS5nZXQoJ3RpdGxlJykudmFsdWU9PT0wKVxuICAgICAgICAgICAgICAgICYmIHVwZGF0ZVJvd0Zvcm0uZ2V0KCd0aXRsZScpLnZhbGlkXCIgKGNsaWNrKT1cImJ1bGtVcGRhdGUoJ3RpdGxlJylcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24+ZG9uZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwidy0xMDAgcHgtMVwiPlxuICAgICAgICAgICAgICA8dGV4dGFyZWEgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwiZGV0YWlsc1wiIHBsYWNlaG9sZGVyPVwiRGV0YWlsc1wiIGF1dG9jb21wbGV0ZT1cIm9mZlwiPjwvdGV4dGFyZWE+XG4gICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJ1cGRhdGVSb3dGb3JtLmdldCgnZGV0YWlscycpLnZhbHVlIHx8IHVwZGF0ZVJvd0Zvcm0uZ2V0KCdkZXRhaWxzJykudmFsdWU9PT0wXCIgbWF0U3VmZml4XG4gICAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uIHN0eWxlPVwiY29sb3I6cmVkXCIgKGNsaWNrKT1cInVwZGF0ZVJvd0Zvcm0uZ2V0KCdkZXRhaWxzJykuc2V0VmFsdWUoJycpXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDxidXR0b24gbWF0U3VmZml4IG1hdC1pY29uLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgc3R5bGU9XCJjb2xvcjpncmVlblwiICpuZ0lmPVwiKHVwZGF0ZVJvd0Zvcm0uZ2V0KCdkZXRhaWxzJykudmFsdWUgfHwgdXBkYXRlUm93Rm9ybS5nZXQoJ2RldGFpbHMnKS52YWx1ZT09PTApXG4gICAgICAgICAgICAgICAgJiYgdXBkYXRlUm93Rm9ybS5nZXQoJ2RldGFpbHMnKS52YWxpZFwiIChjbGljayk9XCJidWxrVXBkYXRlKCdkZXRhaWxzJylcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24+ZG9uZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInVzZVRlY2hsaWZ5VGFnc1wiPlxuICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgPG1hdC1sYWJlbD5UYWc8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICA8YXBwLXRlY2hsaWZ5LXRhZ2dlci10YWctZm9ybS1maWVsZCBtb2RlbFR5cGU9XCJlbnRpdHktZmlsZVwiIGZvcm1Db250cm9sTmFtZT1cInRhZ19pZHNcIlxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJFbnRlciBuZXcgdGFnXCI+XG4gICAgICAgICAgICAgICAgPC9hcHAtdGVjaGxpZnktdGFnZ2VyLXRhZy1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJ1cGRhdGVSb3dGb3JtLmdldCgndGFnX2lkcycpLnZhbHVlIHx8IHVwZGF0ZVJvd0Zvcm0uZ2V0KCd0YWdfaWRzJykudmFsdWU9PT0wXCIgbWF0U3VmZml4XG4gICAgICAgICAgICAgICAgICBtYXQtaWNvbi1idXR0b24gc3R5bGU9XCJjb2xvcjpyZWRcIiAoY2xpY2spPVwidXBkYXRlUm93Rm9ybS5nZXQoJ3RhZ19pZHMnKS5zZXRWYWx1ZSgnJylcIj5cbiAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXRTdWZmaXggbWF0LWljb24tYnV0dG9uIHR5cGU9XCJidXR0b25cIiBzdHlsZT1cImNvbG9yOmdyZWVuXCIgKm5nSWY9XCIodXBkYXRlUm93Rm9ybS5nZXQoJ3RhZ19pZHMnKS52YWx1ZSB8fCB1cGRhdGVSb3dGb3JtLmdldCgndGFnX2lkcycpLnZhbHVlPT09MClcbiAgICAgICAgICAgICAgICAgICYmIHVwZGF0ZVJvd0Zvcm0uZ2V0KCd0YWdfaWRzJykudmFsaWRcIiAoY2xpY2spPVwiYnVsa1VwZGF0ZSgndGFnX2lkcycpXCI+XG4gICAgICAgICAgICAgICAgICA8bWF0LWljb24+ZG9uZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9mb3JtPlxuICAgICAgPC9tYXQtY2FyZC1jb250ZW50PlxuICAgIDwvbWF0LWNhcmQ+XG5cbiAgPC9kaXY+XG5cbiAgPGRpdj5cbiAgICA8ZGl2IGNsYXNzPVwibWF0LXR5cG9ncmFwaHlcIiAqbmdJZj1cIiFkaXNwbGF5TW9kZVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LXJvdyBnYXAtM1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uIGdhcC0yIGZsZXgtZ3Jvdy0xXCI+XG4gICAgICAgICAgPG1hdC1jYXJkPlxuICAgICAgICAgICAgPG1hdC1jYXJkLWNvbnRlbnQ+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZ2FwLTIgYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb25cbiAgICAgICAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cImZvbnQtd2VpZ2h0LWJvbGQgbWItMFwiPlxuICAgICAgICAgICAgICAgICAge3t0aXRsZX19c1xuICAgICAgICAgICAgICAgIDwvaDM+XG4gICAgICAgICAgICAgICAgPGFwcC10ZWNobGlmeS1mb3JtLWJ1dHRvbiBjbGFzcz1cIm1zLTJcIiAqbmdJZj1cIiF2aWV3T25seSAmJiBpc1Nob3dDcmVhdGVBY3Rpb24gJiYgZW50aXR5SWRcIlxuICAgICAgICAgICAgICAgICAgW2NvbXBvbmVudF09XCJlbnRpdHlGaWxlRm9ybSgpXCIgW2RhdGFdPVwiZm9ybURhdGFcIlxuICAgICAgICAgICAgICAgICAgKHNhdmVkKT1cIm1vZGVsQ3JlYXRlZCgkZXZlbnQpXCI+PC9hcHAtdGVjaGxpZnktZm9ybS1idXR0b24+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmbGV4LWdyb3ctMVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImZpbHRlckZvcm1cIiBjbGFzcz1cImQtZmxleCBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkICpuZ0lmPVwiIXJlbW92ZVNlYXJjaFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+U2VhcmNoPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cInRpdGxlXCIgcGxhY2Vob2xkZXI9XCJTZWFyY2hcIiBuYW1lPVwidGl0bGVcIlxuICAgICAgICAgICAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJmaWx0ZXJGb3JtLmdldCgndGl0bGUnKS52YWx1ZVwiIG1hdFN1ZmZpeCBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVzZXRGaWx0ZXIoJ3RpdGxlJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ1c2VUZWNobGlmeVRhZ3NcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+VGFnPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgPGFwcC10ZWNobGlmeS10YWdnZXItdGFnLWZvcm0tZmllbGQgW2NhdGVnb3JpZXNdPVwidGVjaGxpZnlUYWdDYXRlZ29yaWVzXCIgZm9ybUNvbnRyb2xOYW1lPVwidGFnX2lkc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjdCBUYWdzXCIgW2NvbmZpZ109XCJ0ZWNobGlmeVRhZ0NvbmZpZ1wiPjwvYXBwLXRlY2hsaWZ5LXRhZ2dlci10YWctZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICA8YXBwLXRpbWVsaW5lLWZpbHRlciBjbGFzcz1cImZsLXNtXCIgZm9ybUNvbnRyb2xOYW1lPSdwZXJpb2RfaWQnIGxhYmVsVGV4dD1cIkV4cGlyZXMgT25cIlxuICAgICAgICAgICAgICAgICAgICBkYXRlRnJvbT1cImV4cGlyZXNfb25fZnJvbVwiIGRhdGVUbz1cImV4cGlyZXNfb25fdG9cIiBbZm9ybV09XCJmaWx0ZXJGb3JtXCI+PC9hcHAtdGltZWxpbmUtZmlsdGVyPlxuICAgICAgICAgICAgICAgIDwvZm9ybT5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L21hdC1jYXJkLWNvbnRlbnQ+XG4gICAgICAgICAgICA8bWF0LWNhcmQtY29udGVudCBjbGFzcz1cImVudGl0eS1maWxlLWNhcmQgcC0wXCIgKm5nSWY9XCJlbnRpdHlJZFwiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGFibGVWaWV3XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L21hdC1jYXJkLWNvbnRlbnQ+XG4gICAgICAgICAgPC9tYXQtY2FyZD5cblxuICAgICAgICAgIDxtYXQtY2FyZCAqbmdJZj1cIiFlbnRpdHlJZFwiPlxuICAgICAgICAgICAgPG1hdC1jYXJkLWNvbnRlbnQgY2xhc3M9XCJlbnRpdHktZmlsZS1jYXJkIHAtMFwiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGFibGVWaWV3XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L21hdC1jYXJkLWNvbnRlbnQ+XG4gICAgICAgICAgPC9tYXQtY2FyZD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc1Nob3dEcmFnRHJvcFNlY3Rpb24gJiYgZW50aXR5SWRcIj5cbiAgICAgICAgICA8c2VjdGlvbiBzdHlsZT1cImZsZXg6IDAgMSAzMCU7XCIgKm5nSWY9XCIhdGhpcy5zZWxlY3RlZE1vZGVsSWRzLmxlbmd0aCAmJiAhdmlld09ubHkgJiYgaXNTaG93Q3JlYXRlQWN0aW9uXCI+XG4gICAgICAgICAgICA8YXBwLWZpbGUtZHJvcHBlciBbY29uZmlnXT1cImZpbGVDb25maWdcIiAoZmlsZUNoYW5nZWQpPVwiZmlsZUNoYW5nZWQoJGV2ZW50KVwiPlxuICAgICAgICAgICAgPC9hcHAtZmlsZS1kcm9wcGVyPlxuICAgICAgICAgIDwvc2VjdGlvbj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPG5nLXRlbXBsYXRlICN0YWJsZVZpZXc+XG4gICAgPHRhYmxlIG1hdC10YWJsZSBbZGF0YVNvdXJjZV09XCJtb2RlbHNcIiBjbGFzcz1cInctMTAwXCIgbWF0U29ydCBtdWx0aVRlbXBsYXRlRGF0YVJvd3MgaW5maW5pdGVTY3JvbGxcbiAgICAgIFtpbmZpbml0ZVNjcm9sbERpc3RhbmNlXT1cIjEuNVwiIFtpbmZpbml0ZVNjcm9sbFRocm90dGxlXT1cIjUwXCIgKHNjcm9sbGVkKT1cIm9uU2Nyb2xsKClcIj5cblxuICAgICAgPCEtLSBTZWxlY3QgQ29sdW1uIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJzZWxlY3RcIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBzdHlsZT1cIndpZHRoOjMwcHhcIj5cbiAgICAgICAgICA8bWF0LWNoZWNrYm94IG5hbWU9XCJlbXBsb3llZVwiIFsobmdNb2RlbCldPVwiaXNBbGxTZWxlY3RlZFwiIChjaGFuZ2UpPVwic2VsZWN0QWxsKClcIj5cbiAgICAgICAgICA8L21hdC1jaGVja2JveD5cbiAgICAgICAgPC90aD5cbiAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIiBzdHlsZT1cIndpZHRoOjMwcHhcIj5cbiAgICAgICAgICA8bWF0LWNoZWNrYm94IG5hbWU9XCJlbXBsb3llZVt7e2VsZW1lbnQ/LmlkfX1dXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cImVsZW1lbnQuaXNfc2VsZWN0ZWRcIiAoY2hhbmdlKT1cImlzU2VsZWN0aW9uTW9kaWZpZWQoJGV2ZW50LCBlbGVtZW50KVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiIW1vZGVscy5sZW5ndGhcIj5cbiAgICAgICAgICA8L21hdC1jaGVja2JveD5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8IS0tIEluZGV4IENvbHVtbiAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiaW5kZXhcIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj4gIyA8L3RoPlxuICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudDsgbGV0IGkgPSBkYXRhSW5kZXhcIj4ge3sgaSsxIH19IDwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBUaXRsZSBDb2x1bW4gLS0+XG4gICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInRpdGxlXCI+XG4gICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+IFRpdGxlIDwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XG4gICAgICAgICAge3tlbGVtZW50LnRpdGxlfX1cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidXNlVGVjaGxpZnlUYWdzXCI+XG4gICAgICAgICAgICA8YnI+XG4gICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJiYWRnZSBiYWRnZS1zZWNvbmRhcnkgbXItMVwiICpuZ0Zvcj1cImxldCB0YWcgb2YgZWxlbWVudD8udGFnc1wiPnt7dGFnPy50aXRsZX19PC9zbWFsbD5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiZXhwaXJlc19vblwiPlxuICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPiBFeHBpcmVzIE9uIDwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XG4gICAgICAgICAge3tlbGVtZW50Py5leHBpcmVzX29uIHwgZGF0ZTonbWVkaXVtRGF0ZSd9fVxuICAgICAgICA8L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDwhLS0gRGV0YWlscyBDb2x1bW4gLS0+XG4gICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImRldGFpbHNcIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj4gRGV0YWlscyA8L3RoPlxuICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPlxuICAgICAgICAgIDxhcHAtcmVhZC1tb3JlIFt0ZXh0XT1cImVsZW1lbnQuZGV0YWlsc1wiIFttYXhMZW5ndGhdPVwiNTBcIj48L2FwcC1yZWFkLW1vcmU+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBGaWxlIHNpemUgQ29sdW1uIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJmaWxlX3NpemVcIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj4gRmlsZSBTaXplIDwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCJlbGVtZW50Py5maWxlX3NpemVcIj4ge3sgZWxlbWVudC5maWxlX3NpemUgfCBmaWxlU2l6ZSB9fSA8L3NwYW4+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBVcGxvYWRlZCBPbiBDb2x1bW4gLS0+XG4gICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInVwbG9hZGVkX29uXCI+XG4gICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+IFVwbG9hZGVkIE9uIDwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIHt7ZWxlbWVudC5jcmVhdGVkX2F0IHwgZGF0ZTogJ21lZGl1bURhdGUnfX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tdXRlZFwiICpuZ0lmPVwiZWxlbWVudC5jcmVhdG9yXCI+XG4gICAgICAgICAgICBCeSB7e2VsZW1lbnQuY3JlYXRvcj8ubmFtZX19XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBBY3Rpb25zIENvbHVtbiAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiYWN0aW9uc1wiPlxuICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPiBBY3Rpb25zIDwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCIgY2xhc3M9XCJ0ZXh0LW11dGVkXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LXJvdyBnYXAtMiB0ZXh0LXNlY29uZGFyeSBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgIDxhIGhyZWY9XCJ7e2VsZW1lbnQudXJsfX1cIiB0YXJnZXQ9XCJfYmxhbmtcIiBjbGFzcz1cInRleHQtZGVjb3JhdGlvbi1ub25lIHRleHQtbXV0ZWQgY2xpY2thYmxlXCI+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbj5kb3dubG9hZDwvbWF0LWljb24+XG4gICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICA8YXBwLXRlY2hsaWZ5LWZvcm0tYnV0dG9uICpuZ0lmPVwiIXZpZXdPbmx5ICYmIGlzU2hvd1VwZGF0ZUFjdGlvblwiIFtjb21wb25lbnRdPVwiZW50aXR5RmlsZUZvcm0oKVwiXG4gICAgICAgICAgICAgIFttb2RlbF09XCJlbGVtZW50XCIgW2RhdGFdPVwiZm9ybURhdGFcIiAoc2F2ZWQpPVwibW9kZWxzVXBkYXRlZEJ5SWQoJGV2ZW50KVwiPjwvYXBwLXRlY2hsaWZ5LWZvcm0tYnV0dG9uPlxuICAgICAgICAgICAgPGFwcC10ZWNobGlmeS1kZWxldGUtYnV0dG9uICpuZ0lmPVwiIXZpZXdPbmx5ICYmIGlzU2hvd0RlbGV0ZUFjdGlvblwiIFttb2RlbF09XCJlbGVtZW50XCIgW3NlcnZpY2VdPVwic2VydmljZVwiXG4gICAgICAgICAgICAgIG1lc3NhZ2U9XCJBcmUgeW91IHN1cmUgdG8gcHJvY2VlZCBkZWxldGUgdGhlIGZpbGUge3tlbGVtZW50LnRpdGxlfX1cIlxuICAgICAgICAgICAgICAoZGVsZXRlZCk9XCJtb2RlbHNEZWxldGVkQnlJZChlbGVtZW50KVwiPlxuICAgICAgICAgICAgPC9hcHAtdGVjaGxpZnktZGVsZXRlLWJ1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8dHIgbWF0LWhlYWRlci1yb3cgKm1hdEhlYWRlclJvd0RlZj1cImRpc3BsYXllZENvbHVtbnNcIj48L3RyPlxuICAgICAgPHRyIG1hdC1yb3cgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IGRpc3BsYXllZENvbHVtbnM7XCI+PC90cj5cbiAgICA8L3RhYmxlPlxuXG4gICAgPG1hdC1wcm9ncmVzcy1iYXIgbW9kZT1cImluZGV0ZXJtaW5hdGVcIiAqbmdJZj1cImlzV29ya2luZ1wiPjwvbWF0LXByb2dyZXNzLWJhcj5cbiAgPC9uZy10ZW1wbGF0ZT5cblxuICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtd3JhcCBnYXAtMyBtYXQtdHlwb2dyYXBoeSBwLTRcIiAqbmdJZj1cImRpc3BsYXlNb2RlXCI+XG4gICAgPGRpdiAqbmdGb3I9XCJsZXQgZWZpbGUgb2YgbW9kZWxzXCI+XG4gICAgICA8YXBwLWRvY3VtZW50LXZpZXdlciBbZmlsZV09XCJlZmlsZS5maWxlXCIgW2ZpbGVVcmxdPVwiZWZpbGUudXJsXCIgW2NvbmZpZ109XCJ0aGlzLnZpZXdlckNvbmZpZ1wiIFtkaXNhYmxlRWRpdF09XCJ0cnVlXCI+XG4gICAgICA8L2FwcC1kb2N1bWVudC12aWV3ZXI+XG4gICAgICA8YSBocmVmPVwie3tlZmlsZS51cmx9fVwiIHRhcmdldD1cIl9ibGFua1wiPlxuICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gdHlwZT1cImJ1dHRvblwiPlZpZXc8L2J1dHRvbj5cbiAgICAgIDwvYT5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPG1hdC1jYXJkICpuZ0lmPVwidmlld01vZGUgPT09ICd0aW1lbGluZSdcIj5cbiAgPG1hdC1jYXJkLWNvbnRlbnQ+XG4gICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtc3RhcnQgYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICA8bWF0LWljb24+XG4gICAgICAgIGRlc2NyaXB0aW9uXG4gICAgICA8L21hdC1pY29uPlxuICAgICAgPGgzIGNsYXNzPVwiZm9udC13ZWlnaHQtYm9sZCBtYi0wXCI+XG4gICAgICAgIHt7dGl0bGV9fXNcbiAgICAgIDwvaDM+XG4gICAgICA8YXBwLXRlY2hsaWZ5LWZvcm0tYnV0dG9uICpuZ0lmPVwiIXZpZXdPbmx5ICYmIGlzU2hvd0NyZWF0ZUFjdGlvblwiIFtjb21wb25lbnRdPVwiZW50aXR5RmlsZUZvcm0oKVwiIFtkYXRhXT1cImZvcm1EYXRhXCJcbiAgICAgICAgKHNhdmVkKT1cIm1vZGVsQ3JlYXRlZCgkZXZlbnQpXCI+PC9hcHAtdGVjaGxpZnktZm9ybS1idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvbWF0LWNhcmQtY29udGVudD5cbiAgPG1hdC1jYXJkLWNvbnRlbnQgKm5nSWY9XCIhdGhpcy5zZWxlY3RlZE1vZGVsSWRzLmxlbmd0aCAmJiAhdmlld09ubHkgJiYgaXNTaG93Q3JlYXRlQWN0aW9uXCIgY2xhc3M9XCJtdC0zXCI+XG4gICAgPGFwcC1maWxlLWRyb3BwZXIgW2NvbmZpZ109XCJmaWxlQ29uZmlnXCIgKGZpbGVDaGFuZ2VkKT1cImZpbGVDaGFuZ2VkKCRldmVudClcIj5cbiAgICA8L2FwcC1maWxlLWRyb3BwZXI+XG4gIDwvbWF0LWNhcmQtY29udGVudD5cblxuICA8bWF0LWNhcmQtY29udGVudCBjbGFzcz1cIm10LTNcIj5cbiAgICA8ZGl2ICpuZ0Zvcj1cImxldCBlbnRpdHlGaWxlIG9mIG1vZGVsc1wiIGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uIGdhcC0wXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uIGdhcC0wXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIGdhcC0xXCI+XG4gICAgICAgICAgPHAgY2xhc3M9XCJtYi0wIGZ3LWJvbGQgdGV4dC13cmFwXCI+e3sgZW50aXR5RmlsZT8udGl0bGUgfCB3cmFwOjIwIH19PC9wPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UgYmctZGFya1wiICpuZ0Zvcj1cImxldCB0YWcgb2YgZW50aXR5RmlsZT8udGFnc1wiPlxuICAgICAgICAgICAge3sgdGFnPy50aXRsZSB9fVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhcmtcIj57eyBlbnRpdHlGaWxlLmZpbGVfc2l6ZSB8IGZpbGVTaXplIH19PC9zbWFsbD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxhcHAtcmVhZC1tb3JlIFt0ZXh0XT1cImVudGl0eUZpbGU/LmRldGFpbHNcIiBbbWF4TGVuZ3RoXT1cIjUwXCI+PC9hcHAtcmVhZC1tb3JlPlxuICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBnYXAtMlwiPlxuICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LXNlY29uZGFyeVwiIHN0eWxlPVwibWF4LXdpZHRoOiA3MCVcIj5cbiAgICAgICAgICA8aT5VcGxvYWRlZCBCeSB7eyBlbnRpdHlGaWxlPy5jcmVhdG9yPy5uYW1lIH19IHt7IGVudGl0eUZpbGU/LmNyZWF0ZWRfYXQgfCBkYXRlOiAnbWVkaXVtRGF0ZSd9fTwvaT5cbiAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMVwiPlxuICAgICAgICAgIDxhIGhyZWY9XCJ7e2VudGl0eUZpbGU/LnVybH19XCIgdGFyZ2V0PVwiX2JsYW5rXCIgY2xhc3M9XCJ0ZXh0LWRlY29yYXRpb24tbm9uZSB0ZXh0LXNlY29uZGFyeSBtdC0yXCI+XG4gICAgICAgICAgICA8bWF0LWljb24+ZG93bmxvYWQ8L21hdC1pY29uPlxuICAgICAgICAgIDwvYT5cbiAgICAgICAgICA8YXBwLXRlY2hsaWZ5LWZvcm0tYnV0dG9uIGNsYXNzPVwidGV4dC1zZWNvbmRhcnlcIiAqbmdJZj1cIiF2aWV3T25seSAmJiBpc1Nob3dVcGRhdGVBY3Rpb25cIlxuICAgICAgICAgICAgW2NvbXBvbmVudF09XCJlbnRpdHlGaWxlRm9ybSgpXCIgW21vZGVsXT1cImVudGl0eUZpbGVcIiBbZGF0YV09XCJmb3JtRGF0YVwiXG4gICAgICAgICAgICAoc2F2ZWQpPVwibW9kZWxzVXBkYXRlZEJ5SWQoJGV2ZW50KVwiPjwvYXBwLXRlY2hsaWZ5LWZvcm0tYnV0dG9uPlxuICAgICAgICAgIDxhcHAtdGVjaGxpZnktZGVsZXRlLWJ1dHRvbiAqbmdJZj1cIiF2aWV3T25seSAmJiBpc1Nob3dEZWxldGVBY3Rpb25cIiBjbGFzcz0ndGV4dC1zZWNvbmRhcnkgbXMtMSdcbiAgICAgICAgICAgIFttb2RlbF09XCJlbnRpdHlGaWxlXCIgW3NlcnZpY2VdPVwic2VydmljZVwiXG4gICAgICAgICAgICBtZXNzYWdlPVwiQXJlIHlvdSBzdXJlIHRvIHByb2NlZWQgZGVsZXRlIHRoZSBmaWxlIHt7ZW50aXR5RmlsZS50aXRsZX19XCJcbiAgICAgICAgICAgIChkZWxldGVkKT1cIm1vZGVsc0RlbGV0ZWRCeUlkKGVudGl0eUZpbGUpXCI+XG4gICAgICAgICAgPC9hcHAtdGVjaGxpZnktZGVsZXRlLWJ1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxociBzdHlsZT1cIm1hcmdpbjogMC41cmVtIDBcIj5cbiAgICA8L2Rpdj5cbiAgICA8bWF0LXByb2dyZXNzLWJhciBtb2RlPVwiaW5kZXRlcm1pbmF0ZVwiICpuZ0lmPVwiaXNXb3JraW5nXCI+PC9tYXQtcHJvZ3Jlc3MtYmFyPlxuICA8L21hdC1jYXJkLWNvbnRlbnQ+XG48L21hdC1jYXJkPiJdfQ==
@@ -89,11 +89,11 @@ export class ExportExcelButtonComponent {
89
89
  });
90
90
  }
91
91
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ExportExcelButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
92
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ExportExcelButtonComponent, selector: "app-export-excel-button", inputs: { isCSV: "isCSV", iconName: "iconName", fileName: "fileName", data: "data", tableId: "tableId", isParseNumeric: "isParseNumeric" }, outputs: { isExportingToExcel: "isExportingToExcel" }, ngImport: i0, template: "<app-techlify-icon class=\"clickable d-print-none\" *ngIf=\"!isWorking\" [name]=\"iconName\" (click)=\"exportToExcel()\"\n matTooltip=\"Excel Export\">\n</app-techlify-icon>", styles: [".icon-md{height:24px!important;width:24px!important;font-size:24px!important;margin:0 1px}.icon-sm{height:20px!important;width:20px!important;font-size:20px!important}.icon-xs{height:16px!important;width:16px!important;font-size:16px!important}.fl-md{width:200px!important}.fl-md .mat-mdc-form-field{width:100%!important}.fl-sm{width:150px!important}.fl-sm .mat-mdc-form-field{width:100%!important}.mat-btn-md{height:25px!important;padding:0 8px!important}.fs-12{font-size:12px!important}.fs-16{font-size:16px!important}.fs-13{font-size:13px!important}.fs-18{font-size:18px!important}.clickable:hover{cursor:pointer}.mat-mdc-form-field-hint-wrapper{padding:0 4px!important}.nil-subscript-wrapper .mat-mdc-form-field-subscript-wrapper{height:0!important}.create-another .mat-mdc-checkbox label{margin:0!important}.create-another .mdc-checkbox{padding:0!important}.create-another .mdc-checkbox__background{position:relative;top:0;left:0}.mat-mdc-form-field.mat-form-field-disabled .mat-mdc-input-element{color:#f0f0f0!important;-webkit-text-fill-color:#f0f0f0!important}.mat-mdc-form-field.mat-form-field-disabled .mat-mdc-select-value{color:#f0f0f0!important}:host{display:flex;align-content:center}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: i3.TechlifyIconComponent, selector: "app-techlify-icon", inputs: ["name", "size"] }] }); }
92
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ExportExcelButtonComponent, selector: "app-export-excel-button", inputs: { isCSV: "isCSV", iconName: "iconName", fileName: "fileName", data: "data", tableId: "tableId", isParseNumeric: "isParseNumeric" }, outputs: { isExportingToExcel: "isExportingToExcel" }, ngImport: i0, template: "<app-techlify-icon class=\"clickable d-print-none\" *ngIf=\"!isWorking\" [name]=\"iconName\" (click)=\"exportToExcel()\"\n matTooltip=\"Excel Export\">\n</app-techlify-icon>", styles: [".icon-md{height:24px!important;width:24px!important;font-size:24px!important;margin:0 1px}.icon-sm{height:20px!important;width:20px!important;font-size:20px!important}.icon-xs{height:16px!important;width:16px!important;font-size:16px!important}.fl-md{width:200px!important}.fl-md .mat-mdc-form-field{width:100%!important}.fl-sm{width:150px!important}.fl-sm .mat-mdc-form-field{width:100%!important}.mat-btn-md{height:25px!important;padding:0 8px!important}.fs-12{font-size:12px!important}.fs-16{font-size:16px!important}.fs-13{font-size:13px!important}.fs-18{font-size:18px!important}.clickable:hover{cursor:pointer}.mat-mdc-form-field-hint-wrapper{padding:0 4px!important}.nil-subscript-wrapper .mat-mdc-form-field-subscript-wrapper{height:0!important}.create-another .mat-mdc-checkbox label{margin:0!important}.create-another .mdc-checkbox{padding:0!important}.create-another .mdc-checkbox__background{position:relative;top:0;left:0}.mat-mdc-form-field.mat-form-field-disabled .mat-mdc-input-element{color:#555!important;-webkit-text-fill-color:#555555!important}.mat-mdc-form-field.mat-form-field-disabled .mat-mdc-select-value{color:#555!important}:host{display:flex;align-content:center}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: i3.TechlifyIconComponent, selector: "app-techlify-icon", inputs: ["name", "size"] }] }); }
93
93
  }
94
94
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ExportExcelButtonComponent, decorators: [{
95
95
  type: Component,
96
- args: [{ selector: 'app-export-excel-button', template: "<app-techlify-icon class=\"clickable d-print-none\" *ngIf=\"!isWorking\" [name]=\"iconName\" (click)=\"exportToExcel()\"\n matTooltip=\"Excel Export\">\n</app-techlify-icon>", styles: [".icon-md{height:24px!important;width:24px!important;font-size:24px!important;margin:0 1px}.icon-sm{height:20px!important;width:20px!important;font-size:20px!important}.icon-xs{height:16px!important;width:16px!important;font-size:16px!important}.fl-md{width:200px!important}.fl-md .mat-mdc-form-field{width:100%!important}.fl-sm{width:150px!important}.fl-sm .mat-mdc-form-field{width:100%!important}.mat-btn-md{height:25px!important;padding:0 8px!important}.fs-12{font-size:12px!important}.fs-16{font-size:16px!important}.fs-13{font-size:13px!important}.fs-18{font-size:18px!important}.clickable:hover{cursor:pointer}.mat-mdc-form-field-hint-wrapper{padding:0 4px!important}.nil-subscript-wrapper .mat-mdc-form-field-subscript-wrapper{height:0!important}.create-another .mat-mdc-checkbox label{margin:0!important}.create-another .mdc-checkbox{padding:0!important}.create-another .mdc-checkbox__background{position:relative;top:0;left:0}.mat-mdc-form-field.mat-form-field-disabled .mat-mdc-input-element{color:#f0f0f0!important;-webkit-text-fill-color:#f0f0f0!important}.mat-mdc-form-field.mat-form-field-disabled .mat-mdc-select-value{color:#f0f0f0!important}:host{display:flex;align-content:center}\n"] }]
96
+ args: [{ selector: 'app-export-excel-button', template: "<app-techlify-icon class=\"clickable d-print-none\" *ngIf=\"!isWorking\" [name]=\"iconName\" (click)=\"exportToExcel()\"\n matTooltip=\"Excel Export\">\n</app-techlify-icon>", styles: [".icon-md{height:24px!important;width:24px!important;font-size:24px!important;margin:0 1px}.icon-sm{height:20px!important;width:20px!important;font-size:20px!important}.icon-xs{height:16px!important;width:16px!important;font-size:16px!important}.fl-md{width:200px!important}.fl-md .mat-mdc-form-field{width:100%!important}.fl-sm{width:150px!important}.fl-sm .mat-mdc-form-field{width:100%!important}.mat-btn-md{height:25px!important;padding:0 8px!important}.fs-12{font-size:12px!important}.fs-16{font-size:16px!important}.fs-13{font-size:13px!important}.fs-18{font-size:18px!important}.clickable:hover{cursor:pointer}.mat-mdc-form-field-hint-wrapper{padding:0 4px!important}.nil-subscript-wrapper .mat-mdc-form-field-subscript-wrapper{height:0!important}.create-another .mat-mdc-checkbox label{margin:0!important}.create-another .mdc-checkbox{padding:0!important}.create-another .mdc-checkbox__background{position:relative;top:0;left:0}.mat-mdc-form-field.mat-form-field-disabled .mat-mdc-input-element{color:#555!important;-webkit-text-fill-color:#555555!important}.mat-mdc-form-field.mat-form-field-disabled .mat-mdc-select-value{color:#555!important}:host{display:flex;align-content:center}\n"] }]
97
97
  }], ctorParameters: () => [], propDecorators: { isCSV: [{
98
98
  type: Input
99
99
  }], iconName: [{