@ohioepa/oepa-ui-lib 1.2.25 → 1.3.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.
@@ -2,10 +2,9 @@ import { Component, Input, Output, EventEmitter, ViewChild } from '@angular/core
2
2
  import { ConfirmationModalComponent } from '../confirmation-modal/confirmation-modal.component';
3
3
  import * as i0 from "@angular/core";
4
4
  import * as i1 from "@ohioepa/oepa-common-lib";
5
- import * as i2 from "../oepa-file-utils/oepa-file-util.service";
6
- import * as i3 from "ngx-bootstrap/modal";
7
- import * as i4 from "@angular/common";
8
- import * as i5 from "@angular/forms";
5
+ import * as i2 from "ngx-bootstrap/modal";
6
+ import * as i3 from "@angular/common";
7
+ import * as i4 from "@angular/forms";
9
8
  export class MultiFileUploadComponent {
10
9
  idService;
11
10
  fileUtilService;
@@ -99,13 +98,13 @@ export class MultiFileUploadComponent {
99
98
  this.downloadFile(this.blankForm);
100
99
  }
101
100
  }
102
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MultiFileUploadComponent, deps: [{ token: i1.OepaComponentIdService }, { token: i2.OepaFileUtilService }, { token: i3.BsModalService }], target: i0.ɵɵFactoryTarget.Component });
103
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: MultiFileUploadComponent, selector: "oepa-multi-file-upload", inputs: { group: "group", field: "field", label: "label", errorLabel: "errorLabel", blankForm: "blankForm", blankFormUrl: "blankFormUrl", showValidation: "showValidation", domain: "domain", attachments: "attachments", removeAllowed: "removeAllowed" }, outputs: { fileUploaded: "fileUploaded", fileRemoved: "fileRemoved", download: "download" }, viewQueries: [{ propertyName: "myFileInput", first: true, predicate: ["myFileInput"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<form [formGroup]=\"group\">\n <div class=\"form-group\">\n <div>\n <label *ngIf=\"label\">{{label}}</label>\n <span *ngIf=\"blankFormUrl\">&nbsp;<a href=\"{{blankFormUrl}}\" target=\"_blank\">Blank Form</a></span>\n <span *ngIf=\"blankForm\">&nbsp;<a href=\"\" (click)=\"downloadBlankForm()\">Blank Form</a></span>\n <div class=\"form-group\">\n <div class=\"input-group\">\n <span class=\"input-group-btn\">\n <label class=\"btn btn-primary btn-file\">\n Browse&hellip; \n <input #myFileInput type=\"file\" style=\"display: none;\" (change)=\"fileChange($event)\" \n [id]=\"componentId+'_BrowseBtn'\" [name]=\"componentId+'_BrowseBtn'\" class=\"form-control\"\n [disabled]=\"group.controls[field].status === 'DISABLED'\">\n </label>\n </span>\n <input [ngClass]=\"{'is-invalid':showValidation && group.controls[field].status === 'INVALID'}\"\n type=\"text\" class=\"form-control\" \n [placeholder]=\"(!attachments || attachments.length === 0) ? 'No files uploaded' : (attachments.length + ' file(s) uploaded')\"\n [id]=\"componentId+'_Input'\" [name]=\"componentId+'_Input'\" readonly>\n <small class=\"invalid-feedback\" *ngIf=\"showValidation && group.controls[field].status === 'INVALID'\">{{errorLabel || label}} is required</small>\n </div>\n <!-- dummy input field for validation purposes -->\n <input type=\"text\" [hidden]=\"true\" [formControlName]=\"field\"/>\n </div>\n </div>\n <div *ngIf=\"uploadError\" class=\"alert alert-danger\" role=\"alert\">{{uploadError}}</div>\n <div *ngIf=\"parserReport\">\n <div *ngIf=\"!attachments[0] && parserReport.successful\" class=\"alert alert-info\" role=\"alert\">Spreadsheet was successfully parsed.</div>\n <div [hidden]=\"parserReport.successful\" class=\"alert alert-danger\" role=\"alert\">\n There are errors in the uploaded spreadsheet:\n <ul>\n <li *ngFor=\"let error of parserReport.errors\">{{error.message}}</li>\n </ul>\n </div>\n </div>\n </div>\n <div *ngIf=\"attachments && attachments[0]\">\n <div *ngFor=\"let attachment of attachments; let i=index;\">\n <div class=\"form-group\">\n <div class=\"input-group\">\n <a (click)=\"downloadFile(attachment)\" [id]=\"componentId+'_DownloadFileLink_'+i\" [name]=\"componentId+'_DownloadFileLink_'+i\"\n class=\"form-control\">{{attachment.userFilename}}</a>\n <span *ngIf=\"removeAllowed\" class=\"input-group-btn\">\n <button type=\"button\" class=\"btn btn-primary\" [id]=\"componentId+'_RemoveFileBtn_'+i\" [name]=\"componentId+'_RemoveFileBtn_'+i\"\n (click)=\"removeFile(attachment)\" [disabled]=\"group.controls[field].status === 'DISABLED'\">Remove Attachment</button>\n </span>\n </div>\n </div>\n </div>\n </div>\n</form>", styles: ["a:hover{cursor:pointer}a{color:#3399f3!important}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i5.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: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i5.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }] });
101
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MultiFileUploadComponent, deps: [{ token: i1.OepaComponentIdService }, { token: i1.OepaFileUtilService }, { token: i2.BsModalService }], target: i0.ɵɵFactoryTarget.Component });
102
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: MultiFileUploadComponent, selector: "oepa-multi-file-upload", inputs: { group: "group", field: "field", label: "label", errorLabel: "errorLabel", blankForm: "blankForm", blankFormUrl: "blankFormUrl", showValidation: "showValidation", domain: "domain", attachments: "attachments", removeAllowed: "removeAllowed" }, outputs: { fileUploaded: "fileUploaded", fileRemoved: "fileRemoved", download: "download" }, viewQueries: [{ propertyName: "myFileInput", first: true, predicate: ["myFileInput"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<form [formGroup]=\"group\">\n <div class=\"form-group\">\n <div>\n <label *ngIf=\"label\">{{label}}</label>\n <span *ngIf=\"blankFormUrl\">&nbsp;<a href=\"{{blankFormUrl}}\" target=\"_blank\">Blank Form</a></span>\n <span *ngIf=\"blankForm\">&nbsp;<a href=\"\" (click)=\"downloadBlankForm()\">Blank Form</a></span>\n <div class=\"form-group\">\n <div class=\"input-group\">\n <span class=\"input-group-btn\">\n <label class=\"btn btn-primary btn-file\">\n Browse&hellip; \n <input #myFileInput type=\"file\" style=\"display: none;\" (change)=\"fileChange($event)\" \n [id]=\"componentId+'_BrowseBtn'\" [name]=\"componentId+'_BrowseBtn'\" class=\"form-control\"\n [disabled]=\"group.controls[field].status === 'DISABLED'\">\n </label>\n </span>\n <input [ngClass]=\"{'is-invalid':showValidation && group.controls[field].status === 'INVALID'}\"\n type=\"text\" class=\"form-control\" \n [placeholder]=\"(!attachments || attachments.length === 0) ? 'No files uploaded' : (attachments.length + ' file(s) uploaded')\"\n [id]=\"componentId+'_Input'\" [name]=\"componentId+'_Input'\" readonly>\n <small class=\"invalid-feedback\" *ngIf=\"showValidation && group.controls[field].status === 'INVALID'\">{{errorLabel || label}} is required</small>\n </div>\n <!-- dummy input field for validation purposes -->\n <input type=\"text\" [hidden]=\"true\" [formControlName]=\"field\"/>\n </div>\n </div>\n <div *ngIf=\"uploadError\" class=\"alert alert-danger\" role=\"alert\">{{uploadError}}</div>\n <div *ngIf=\"parserReport\">\n <div *ngIf=\"!attachments[0] && parserReport.successful\" class=\"alert alert-info\" role=\"alert\">Spreadsheet was successfully parsed.</div>\n <div [hidden]=\"parserReport.successful\" class=\"alert alert-danger\" role=\"alert\">\n There are errors in the uploaded spreadsheet:\n <ul>\n <li *ngFor=\"let error of parserReport.errors\">{{error.message}}</li>\n </ul>\n </div>\n </div>\n </div>\n <div *ngIf=\"attachments && attachments[0]\">\n <div *ngFor=\"let attachment of attachments; let i=index;\">\n <div class=\"form-group\">\n <div class=\"input-group\">\n <a (click)=\"downloadFile(attachment)\" [id]=\"componentId+'_DownloadFileLink_'+i\" [name]=\"componentId+'_DownloadFileLink_'+i\"\n class=\"form-control\">{{attachment.userFilename}}</a>\n <span *ngIf=\"removeAllowed\" class=\"input-group-btn\">\n <button type=\"button\" class=\"btn btn-primary\" [id]=\"componentId+'_RemoveFileBtn_'+i\" [name]=\"componentId+'_RemoveFileBtn_'+i\"\n (click)=\"removeFile(attachment)\" [disabled]=\"group.controls[field].status === 'DISABLED'\">Remove Attachment</button>\n </span>\n </div>\n </div>\n </div>\n </div>\n</form>", styles: ["a:hover{cursor:pointer}a{color:#3399f3!important}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i4.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: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }] });
104
103
  }
105
104
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MultiFileUploadComponent, decorators: [{
106
105
  type: Component,
107
106
  args: [{ selector: 'oepa-multi-file-upload', template: "<form [formGroup]=\"group\">\n <div class=\"form-group\">\n <div>\n <label *ngIf=\"label\">{{label}}</label>\n <span *ngIf=\"blankFormUrl\">&nbsp;<a href=\"{{blankFormUrl}}\" target=\"_blank\">Blank Form</a></span>\n <span *ngIf=\"blankForm\">&nbsp;<a href=\"\" (click)=\"downloadBlankForm()\">Blank Form</a></span>\n <div class=\"form-group\">\n <div class=\"input-group\">\n <span class=\"input-group-btn\">\n <label class=\"btn btn-primary btn-file\">\n Browse&hellip; \n <input #myFileInput type=\"file\" style=\"display: none;\" (change)=\"fileChange($event)\" \n [id]=\"componentId+'_BrowseBtn'\" [name]=\"componentId+'_BrowseBtn'\" class=\"form-control\"\n [disabled]=\"group.controls[field].status === 'DISABLED'\">\n </label>\n </span>\n <input [ngClass]=\"{'is-invalid':showValidation && group.controls[field].status === 'INVALID'}\"\n type=\"text\" class=\"form-control\" \n [placeholder]=\"(!attachments || attachments.length === 0) ? 'No files uploaded' : (attachments.length + ' file(s) uploaded')\"\n [id]=\"componentId+'_Input'\" [name]=\"componentId+'_Input'\" readonly>\n <small class=\"invalid-feedback\" *ngIf=\"showValidation && group.controls[field].status === 'INVALID'\">{{errorLabel || label}} is required</small>\n </div>\n <!-- dummy input field for validation purposes -->\n <input type=\"text\" [hidden]=\"true\" [formControlName]=\"field\"/>\n </div>\n </div>\n <div *ngIf=\"uploadError\" class=\"alert alert-danger\" role=\"alert\">{{uploadError}}</div>\n <div *ngIf=\"parserReport\">\n <div *ngIf=\"!attachments[0] && parserReport.successful\" class=\"alert alert-info\" role=\"alert\">Spreadsheet was successfully parsed.</div>\n <div [hidden]=\"parserReport.successful\" class=\"alert alert-danger\" role=\"alert\">\n There are errors in the uploaded spreadsheet:\n <ul>\n <li *ngFor=\"let error of parserReport.errors\">{{error.message}}</li>\n </ul>\n </div>\n </div>\n </div>\n <div *ngIf=\"attachments && attachments[0]\">\n <div *ngFor=\"let attachment of attachments; let i=index;\">\n <div class=\"form-group\">\n <div class=\"input-group\">\n <a (click)=\"downloadFile(attachment)\" [id]=\"componentId+'_DownloadFileLink_'+i\" [name]=\"componentId+'_DownloadFileLink_'+i\"\n class=\"form-control\">{{attachment.userFilename}}</a>\n <span *ngIf=\"removeAllowed\" class=\"input-group-btn\">\n <button type=\"button\" class=\"btn btn-primary\" [id]=\"componentId+'_RemoveFileBtn_'+i\" [name]=\"componentId+'_RemoveFileBtn_'+i\"\n (click)=\"removeFile(attachment)\" [disabled]=\"group.controls[field].status === 'DISABLED'\">Remove Attachment</button>\n </span>\n </div>\n </div>\n </div>\n </div>\n</form>", styles: ["a:hover{cursor:pointer}a{color:#3399f3!important}\n"] }]
108
- }], ctorParameters: () => [{ type: i1.OepaComponentIdService }, { type: i2.OepaFileUtilService }, { type: i3.BsModalService }], propDecorators: { group: [{
107
+ }], ctorParameters: () => [{ type: i1.OepaComponentIdService }, { type: i1.OepaFileUtilService }, { type: i2.BsModalService }], propDecorators: { group: [{
109
108
  type: Input
110
109
  }], field: [{
111
110
  type: Input
@@ -135,4 +134,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
135
134
  type: ViewChild,
136
135
  args: ['myFileInput', { static: true }]
137
136
  }] } });
138
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktZmlsZS11cGxvYWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb2VwYS11aS1saWIvc3JjL2xpYi9tdWx0aS1maWxlLXVwbG9hZC9tdWx0aS1maWxlLXVwbG9hZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vZXBhLXVpLWxpYi9zcmMvbGliL211bHRpLWZpbGUtdXBsb2FkL211bHRpLWZpbGUtdXBsb2FkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQW9DLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQU9wSCxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxvREFBb0QsQ0FBQzs7Ozs7OztBQVVoRyxNQUFNLE9BQU8sd0JBQXdCO0lBc0JmO0lBQTJDO0lBQ3JEO0lBdEJELEtBQUssQ0FBYTtJQUNsQixLQUFLLEdBQVcsRUFBRSxDQUFDO0lBQ25CLEtBQUssR0FBVyxFQUFFLENBQUM7SUFDbkIsVUFBVSxHQUFXLEVBQUUsQ0FBQztJQUN4QixTQUFTLENBQTZCO0lBQ3RDLFlBQVksR0FBVyxFQUFFLENBQUM7SUFDMUIsY0FBYyxHQUFHLEtBQUssQ0FBQztJQUN2QixNQUFNLEdBQUcsYUFBYSxDQUFDO0lBQ3ZCLFdBQVcsR0FBMEIsRUFBRSxDQUFDO0lBQ3hDLGFBQWEsR0FBRyxJQUFJLENBQUM7SUFFcEIsWUFBWSxHQUFpQyxJQUFJLFlBQVksRUFBRSxDQUFDO0lBQ2hFLFdBQVcsR0FBaUMsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUMvRCxRQUFRLEdBQWlDLElBQUksWUFBWSxFQUFFLENBQUM7SUFFM0IsV0FBVyxDQUFNO0lBRTVELFdBQVcsR0FBRyw4QkFBOEIsQ0FBQztJQUM3QyxXQUFXLEdBQVcsRUFBRSxDQUFDO0lBQ3pCLFlB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QUFDO1FBQ3BDLENBQUM7SUFDSCxDQUFDO3dHQTlGVSx3QkFBd0I7NEZBQXhCLHdCQUF3QixzaUJDakJyQyx1NUZBbURPOzs0RkRsQ00sd0JBQXdCO2tCQUxwQyxTQUFTOytCQUNFLHdCQUF3QjswSkFLekIsS0FBSztzQkFBYixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUVJLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxRQUFRO3NCQUFqQixNQUFNO2dCQUVvQyxXQUFXO3NCQUFyRCxTQUFTO3VCQUFDLGFBQWEsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQgeyBCc01vZGFsU2VydmljZSB9IGZyb20gJ25neC1ib290c3RyYXAvbW9kYWwnO1xuaW1wb3J0IHsgQnNNb2RhbFJlZiB9IGZyb20gJ25neC1ib290c3RyYXAvbW9kYWwnO1xuXG5pbXBvcnQgeyBPZXBhQXR0YWNobWVudCwgT2VwYVBhcnNlclJlcG9ydCwgT2VwYUNvbXBvbmVudElkU2VydmljZSB9IGZyb20gJ0BvaGlvZXBhL29lcGEtY29tbW9uLWxpYic7XG5pbXBvcnQgeyBDb25maXJtYXRpb25Nb2RhbENvbXBvbmVudCB9IGZyb20gJy4uL2NvbmZpcm1hdGlvbi1tb2RhbC9jb25maXJtYXRpb24tbW9kYWwuY29tcG9uZW50JztcbmltcG9ydCB7IE9lcGFGaWxlVXRpbFNlcnZpY2UgfSBmcm9tICcuLi9vZXBhLWZpbGUtdXRpbHMvb2VwYS1maWxlLXV0aWwuc2VydmljZSc7XG5cblxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdvZXBhLW11bHRpLWZpbGUtdXBsb2FkJyxcbiAgdGVtcGxhdGVVcmw6ICcuL211bHRpLWZpbGUtdXBsb2FkLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbXVsdGktZmlsZS11cGxvYWQuY29tcG9uZW50LmNzcyddXG59KVxuZXhwb3J0IGNsYXNzIE11bHRpRmlsZVVwbG9hZENvbXBvbmVudCAgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpIGdyb3VwITogRm9ybUdyb3VwO1xuICBASW5wdXQoKSBmaWVsZDogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIGxhYmVsOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgZXJyb3JMYWJlbDogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIGJsYW5rRm9ybTogT2VwYUF0dGFjaG1lbnQgfCB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpIGJsYW5rRm9ybVVybDogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIHNob3dWYWxpZGF0aW9uID0gZmFsc2U7XG4gIEBJbnB1dCgpIGRvbWFpbiA9ICdhcHBsaWNhdGlvbic7XG4gIEBJbnB1dCgpIGF0dGFjaG1lbnRzOiBBcnJheTxPZXBhQXR0YWNobWVudD4gPSBbXTtcbiAgQElucHV0KCkgcmVtb3ZlQWxsb3dlZCA9IHRydWU7XG5cbiAgQE91dHB1dCgpIGZpbGVVcGxvYWRlZDogRXZlbnRFbWl0dGVyPE9lcGFBdHRhY2htZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIGZpbGVSZW1vdmVkOiBFdmVudEVtaXR0ZXI8T2VwYUF0dGFjaG1lbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgZG93bmxvYWQ6IEV2ZW50RW1pdHRlcjxPZXBhQXR0YWNobWVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQFZpZXdDaGlsZCgnbXlGaWxlSW5wdXQnLCB7IHN0YXRpYzogdHJ1ZX0pIG15RmlsZUlucHV0OiBhbnk7XG5cbiAgY29tcG9uZW50SWQgPSAnT2VwYU11bHRpRmlsZVVwbG9hZENvbXBvbmVudCc7XG4gIHVwbG9hZEVycm9yOiBzdHJpbmcgPSAnJztcbiAgcGFyc2VyUmVwb3J0ITogT2VwYVBhcnNlclJlcG9ydDtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGlkU2VydmljZTogT2VwYUNvbXBvbmVudElkU2VydmljZSwgcHJpdmF0ZSBmaWxlVXRpbFNlcnZpY2U6IE9lcGFGaWxlVXRpbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBtb2RhbFNlcnZpY2U6IEJzTW9kYWxTZXJ2aWNlKSB7IH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICBpZiAodGhpcy5ncm91cCkge1xuICAgICAgdGhpcy5jb21wb25lbnRJZCA9IHRoaXMuaWRTZXJ2aWNlLmdldENvbXBvbmVudElkKHRoaXMuZ3JvdXApO1xuICAgICAgdGhpcy5jb21wb25lbnRJZCArPSAodGhpcy5jb21wb25lbnRJZC5sZW5ndGggPiAwID8gJ18nIDogJycpICsgdGhpcy5maWVsZDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5sb2coJ09PUFMgTm8gZ3JvdXAgeWV0Jyk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmIChjaGFuZ2VzWydhdHRhY2htZW50cyddICYmIGNoYW5nZXNbJ2F0dGFjaG1lbnRzJ10gLmN1cnJlbnRWYWx1ZSkge1xuICAgICAgaWYgKGNoYW5nZXNbJ2F0dGFjaG1lbnRzJ10gLmN1cnJlbnRWYWx1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdmaWxlIGNoYW5nZWQgdG86ICcgKyBjaGFuZ2VzWydhdHRhY2htZW50cyddIC5jdXJyZW50VmFsdWVbMF0udXNlckZpbGVuYW1lKTtcbiAgICAgICAgdGhpcy5ncm91cC5jb250cm9sc1t0aGlzLmZpZWxkXS5zZXRWYWx1ZShjaGFuZ2VzWydhdHRhY2htZW50cyddIC5jdXJyZW50VmFsdWVbMF0udXNlckZpbGVuYW1lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZ3JvdXAuY29udHJvbHNbdGhpcy5maWVsZF0uc2V0VmFsdWUoJycpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZygnZmlsZSBjaGFuZ2VkIGFuZCBpcyBub3cgZW1wdHknKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZmlsZUNoYW5nZShldmVudDogYW55KSB7XG4gICAgY29uc3QgZmlsZUxpc3Q6IEZpbGVMaXN0ID0gZXZlbnQudGFyZ2V0LmZpbGVzO1xuICAgIGlmIChmaWxlTGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBmaWxlOiBGaWxlID0gZmlsZUxpc3RbMF07XG4gICAgICB0aGlzLmZpbGVVdGlsU2VydmljZS51cGxvYWRGaWxlKGZpbGUpLnN1YnNjcmliZSgoYXR0YWNobWVudDogT2VwYUF0dGFjaG1lbnQpID0+IHtcbiAgICAgICAgdGhpcy5maWxlVXBsb2FkZWQuZW1pdChhdHRhY2htZW50KTtcbiAgICAgICAgdGhpcy5teUZpbGVJbnB1dC5uYXRpdmVFbGVtZW50LnZhbHVlID0gJyc7XG4gICAgICB9LCBlcnIgPT4ge1xuICAgICAgICB0aGlzLnVwbG9hZEVycm9yID0gJ0Vycm9yIHVwbG9hZGluZyBmaWxlICcgKyBlcnI7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVtb3ZlRmlsZShhdHRhY2htZW50OiBPZXBhQXR0YWNobWVudCkge1xuICAgIGNvbnN0IG1vZGFsOiBCc01vZGFsUmVmID0gdGhpcy5tb2RhbFNlcnZpY2Uuc2hvdyhDb25maXJtYXRpb25Nb2RhbENvbXBvbmVudCwgeyBpZ25vcmVCYWNrZHJvcENsaWNrOiB0cnVlIH0pO1xuICAgICg8Q29uZmlybWF0aW9uTW9kYWxDb21wb25lbnQ+bW9kYWwuY29udGVudCkuaGVhZGVyVGV4dCA9ICdSZW1vdmUgQXR0YWNobWVudCc7XG4gICAgKDxDb25maXJtYXRpb25Nb2RhbENvbXBvbmVudD5tb2RhbC5jb250ZW50KS5ib2R5VGV4dCA9ICdEbyB5b3Ugd2FudCB0byByZW1vdmUgdGhlIGF0dGFjaG1lbnQ6ICcgKyBhdHRhY2htZW50LnVzZXJGaWxlbmFtZSArICc/JztcbiAgICAoPENvbmZpcm1hdGlvbk1vZGFsQ29tcG9uZW50Pm1vZGFsLmNvbnRlbnQpLmNvbmZpcm1CdG5MYWJlbCA9ICdZZXMnO1xuICAgICg8Q29uZmlybWF0aW9uTW9kYWxDb21wb25lbnQ+bW9kYWwuY29udGVudCkuY2FuY2VsQnRuTGFiZWwgPSAnTm8nO1xuICAgICg8Q29uZmlybWF0aW9uTW9kYWxDb21wb25lbnQ+bW9kYWwuY29udGVudCkuY29uZmlybUNsaWNrZWQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuZmlsZVJlbW92ZWQuZW1pdChhdHRhY2htZW50KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBkb3dubG9hZEZpbGUoYXR0YWNobWVudDogT2VwYUF0dGFjaG1lbnQpIHtcbiAgICBpZiAoIWF0dGFjaG1lbnQuc3lzdGVtRmlsZW5hbWUgfHwgYXR0YWNobWVudC5zeXN0ZW1GaWxlbmFtZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuZG93bmxvYWQuZW1pdChhdHRhY2htZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5maWxlVXRpbFNlcnZpY2UuZG93bmxvYWRBdHRhY2htZW50KGF0dGFjaG1lbnQpLnN1YnNjcmliZShcbiAgICAgICAgZGF0YSA9PiB7XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coJ0ZpbGUgZG93bmxvYWQgc3VjY2VzcycpO1xuICAgICAgICAgIGNvbnN0IG1pbWVUeXBlOiBzdHJpbmcgPSB0aGlzLmZpbGVVdGlsU2VydmljZS5taW1lVHlwZUZvckZpbGUoYXR0YWNobWVudC5zeXN0ZW1GaWxlbmFtZSB8fCAnJyk7XG4gICAgICAgICAgaWYgKG1pbWVUeXBlKSB7XG4gICAgICAgICAgICB0aGlzLmZpbGVVdGlsU2VydmljZS5kb3dubG9hZEZpbGUoZGF0YSwgbWltZVR5cGUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnVwbG9hZEVycm9yID0gJ1VuYWJsZSB0byBkb3dubG9hZCBmaWxlOiAnICsgYXR0YWNobWVudC51c2VyRmlsZW5hbWUgKyAnLiBDYW5ub3QgZGV0ZXJtaW5lIG1pbWUgdHlwZSc7XG4gICAgICAgICAgfVxuICAgICAgICB9LCBlcnIgPT4ge1xuICAgICAgICAgIHRoaXMudXBsb2FkRXJyb3IgPSAnRXJyb3IgZG93bmxvYWRpbmcgZmlsZTogJyArIGF0dGFjaG1lbnQudXNlckZpbGVuYW1lICsgJy4gJyArIGVycjtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZG93bmxvYWRCbGFua0Zvcm0oKSB7XG4gICAgaWYgKHRoaXMuYmxhbmtGb3JtKSB7XG4gICAgICB0aGlzLmRvd25sb2FkRmlsZSh0aGlzLmJsYW5rRm9ybSk7XG4gICAgfVxuICB9XG5cbn1cbiIsIjxmb3JtIFtmb3JtR3JvdXBdPVwiZ3JvdXBcIj5cbiAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cbiAgICA8ZGl2PlxuICAgICAgPGxhYmVsICpuZ0lmPVwibGFiZWxcIj57e2xhYmVsfX08L2xhYmVsPlxuICAgICAgPHNwYW4gKm5nSWY9XCJibGFua0Zvcm1VcmxcIj4mbmJzcDs8YSBocmVmPVwie3tibGFua0Zvcm1Vcmx9fVwiIHRhcmdldD1cIl9ibGFua1wiPkJsYW5rIEZvcm08L2E+PC9zcGFuPlxuICAgICAgPHNwYW4gKm5nSWY9XCJibGFua0Zvcm1cIj4mbmJzcDs8YSBocmVmPVwiXCIgKGNsaWNrKT1cImRvd25sb2FkQmxhbmtGb3JtKClcIj5CbGFuayBGb3JtPC9hPjwvc3Bhbj5cbiAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXBcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnB1dC1ncm91cC1idG5cIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgYnRuLWZpbGVcIj5cbiAgICAgICAgICAgIEJyb3dzZSZoZWxsaXA7IFxuICAgICAgICAgICAgPGlucHV0ICNteUZpbGVJbnB1dCB0eXBlPVwiZmlsZVwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIiAoY2hhbmdlKT1cImZpbGVDaGFuZ2UoJGV2ZW50KVwiIFxuICAgICAgICAgICAgICBbaWRdPVwiY29tcG9uZW50SWQrJ19Ccm93c2VCdG4nXCIgW25hbWVdPVwiY29tcG9uZW50SWQrJ19Ccm93c2VCdG4nXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZ3JvdXAuY29udHJvbHNbZmllbGRdLnN0YXR1cyA9PT0gJ0RJU0FCTEVEJ1wiPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPGlucHV0ICBbbmdDbGFzc109XCJ7J2lzLWludmFsaWQnOnNob3dWYWxpZGF0aW9uICYmIGdyb3VwLmNvbnRyb2xzW2ZpZWxkXS5zdGF0dXMgPT09ICdJTlZBTElEJ31cIlxuICAgICAgICAgIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBcbiAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiKCFhdHRhY2htZW50cyB8fCBhdHRhY2htZW50cy5sZW5ndGggPT09IDApID8gJ05vIGZpbGVzIHVwbG9hZGVkJyA6IChhdHRhY2htZW50cy5sZW5ndGggKyAnIGZpbGUocykgdXBsb2FkZWQnKVwiXG4gICAgICAgICAgW2lkXT1cImNvbXBvbmVudElkKydfSW5wdXQnXCIgW25hbWVdPVwiY29tcG9uZW50SWQrJ19JbnB1dCdcIiByZWFkb25seT5cbiAgICAgICAgICA8c21hbGwgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCIgKm5nSWY9XCJzaG93VmFsaWRhdGlvbiAmJiBncm91cC5jb250cm9sc1tmaWVsZF0uc3RhdHVzID09PSAnSU5WQUxJRCdcIj57e2Vycm9yTGFiZWwgfHwgbGFiZWx9fSBpcyByZXF1aXJlZDwvc21hbGw+XG4gICAgICA8L2Rpdj5cbiAgICAgIDwhLS0gZHVtbXkgaW5wdXQgZmllbGQgZm9yIHZhbGlkYXRpb24gcHVycG9zZXMgLS0+XG4gICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBbaGlkZGVuXT1cInRydWVcIiBbZm9ybUNvbnRyb2xOYW1lXT1cImZpZWxkXCIvPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgICA8ZGl2ICpuZ0lmPVwidXBsb2FkRXJyb3JcIiBjbGFzcz1cImFsZXJ0IGFsZXJ0LWRhbmdlclwiIHJvbGU9XCJhbGVydFwiPnt7dXBsb2FkRXJyb3J9fTwvZGl2PlxuICAgIDxkaXYgKm5nSWY9XCJwYXJzZXJSZXBvcnRcIj5cbiAgICAgIDxkaXYgKm5nSWY9XCIhYXR0YWNobWVudHNbMF0gJiYgcGFyc2VyUmVwb3J0LnN1Y2Nlc3NmdWxcIiBjbGFzcz1cImFsZXJ0IGFsZXJ0LWluZm9cIiByb2xlPVwiYWxlcnRcIj5TcHJlYWRzaGVldCB3YXMgc3VjY2Vzc2Z1bGx5IHBhcnNlZC48L2Rpdj5cbiAgICAgIDxkaXYgW2hpZGRlbl09XCJwYXJzZXJSZXBvcnQuc3VjY2Vzc2Z1bFwiIGNsYXNzPVwiYWxlcnQgYWxlcnQtZGFuZ2VyXCIgcm9sZT1cImFsZXJ0XCI+XG4gICAgICAgIFRoZXJlIGFyZSBlcnJvcnMgaW4gdGhlIHVwbG9hZGVkIHNwcmVhZHNoZWV0OlxuICAgICAgICA8dWw+XG4gICAgICAgICAgPGxpICpuZ0Zvcj1cImxldCBlcnJvciBvZiBwYXJzZXJSZXBvcnQuZXJyb3JzXCI+e3tlcnJvci5tZXNzYWdlfX08L2xpPlxuICAgICAgICA8L3VsPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2ICpuZ0lmPVwiYXR0YWNobWVudHMgJiYgYXR0YWNobWVudHNbMF1cIj5cbiAgICA8ZGl2ICpuZ0Zvcj1cImxldCBhdHRhY2htZW50IG9mIGF0dGFjaG1lbnRzOyBsZXQgaT1pbmRleDtcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cFwiPlxuICAgICAgICAgIDxhIChjbGljayk9XCJkb3dubG9hZEZpbGUoYXR0YWNobWVudClcIiBbaWRdPVwiY29tcG9uZW50SWQrJ19Eb3dubG9hZEZpbGVMaW5rXycraVwiIFtuYW1lXT1cImNvbXBvbmVudElkKydfRG93bmxvYWRGaWxlTGlua18nK2lcIlxuICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIj57e2F0dGFjaG1lbnQudXNlckZpbGVuYW1lfX08L2E+XG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCJyZW1vdmVBbGxvd2VkXCIgY2xhc3M9XCJpbnB1dC1ncm91cC1idG5cIj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgW2lkXT1cImNvbXBvbmVudElkKydfUmVtb3ZlRmlsZUJ0bl8nK2lcIiBbbmFtZV09XCJjb21wb25lbnRJZCsnX1JlbW92ZUZpbGVCdG5fJytpXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZUZpbGUoYXR0YWNobWVudClcIiBbZGlzYWJsZWRdPVwiZ3JvdXAuY29udHJvbHNbZmllbGRdLnN0YXR1cyA9PT0gJ0RJU0FCTEVEJ1wiPlJlbW92ZSBBdHRhY2htZW50PC9idXR0b24+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZm9ybT4iXX0=
137
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktZmlsZS11cGxvYWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb2VwYS11aS1saWIvc3JjL2xpYi9tdWx0aS1maWxlLXVwbG9hZC9tdWx0aS1maWxlLXVwbG9hZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vZXBhLXVpLWxpYi9zcmMvbGliL211bHRpLWZpbGUtdXBsb2FkL211bHRpLWZpbGUtdXBsb2FkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQW9DLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQU9wSCxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxvREFBb0QsQ0FBQzs7Ozs7O0FBVWhHLE1BQU0sT0FBTyx3QkFBd0I7SUFzQmY7SUFBMkM7SUFDckQ7SUF0QkQsS0FBSyxDQUFhO0lBQ2xCLEtBQUssR0FBVyxFQUFFLENBQUM7SUFDbkIsS0FBSyxHQUFXLEVBQUUsQ0FBQztJQUNuQixVQUFVLEdBQVcsRUFBRSxDQUFDO0lBQ3hCLFNBQVMsQ0FBNkI7SUFDdEMsWUFBWSxHQUFXLEVBQUUsQ0FBQztJQUMxQixjQUFjLEdBQUcsS0FBSyxDQUFDO0lBQ3ZCLE1BQU0sR0FBRyxhQUFhLENBQUM7SUFDdkIsV0FBVyxHQUEwQixFQUFFLENBQUM7SUFDeEMsYUFBYSxHQUFHLElBQUksQ0FBQztJQUVwQixZQUFZLEdBQWlDLElBQUksWUFBWSxFQUFFLENBQUM7SUFDaEUsV0FBVyxHQUFpQyxJQUFJLFlBQVksRUFBRSxDQUFDO0lBQy9ELFFBQVEsR0FBaUMsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUUzQixXQUFXLENBQU07SUFFNUQsV0FBVyxHQUFHLDhCQUE4QixDQUFDO0lBQzdDLFdBQVcsR0FBVyxFQUFFLENBQUM7SUFDekIsWUFB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QUM7UUFDcEMsQ0FBQztJQUNILENBQUM7d0dBOUZVLHdCQUF3Qjs0RkFBeEIsd0JBQXdCLHNpQkNqQnJDLHU1RkFtRE87OzRGRGxDTSx3QkFBd0I7a0JBTHBDLFNBQVM7K0JBQ0Usd0JBQXdCOzBKQUt6QixLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBRUksWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLFFBQVE7c0JBQWpCLE1BQU07Z0JBRW9DLFdBQVc7c0JBQXJELFNBQVM7dUJBQUMsYUFBYSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IEJzTW9kYWxTZXJ2aWNlIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9tb2RhbCc7XG5pbXBvcnQgeyBCc01vZGFsUmVmIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9tb2RhbCc7XG5cbmltcG9ydCB7IE9lcGFBdHRhY2htZW50LCBPZXBhUGFyc2VyUmVwb3J0LCBPZXBhQ29tcG9uZW50SWRTZXJ2aWNlIH0gZnJvbSAnQG9oaW9lcGEvb2VwYS1jb21tb24tbGliJztcbmltcG9ydCB7IENvbmZpcm1hdGlvbk1vZGFsQ29tcG9uZW50IH0gZnJvbSAnLi4vY29uZmlybWF0aW9uLW1vZGFsL2NvbmZpcm1hdGlvbi1tb2RhbC5jb21wb25lbnQnO1xuaW1wb3J0IHsgT2VwYUZpbGVVdGlsU2VydmljZSB9IGZyb20gJ0BvaGlvZXBhL29lcGEtY29tbW9uLWxpYic7XG5cblxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdvZXBhLW11bHRpLWZpbGUtdXBsb2FkJyxcbiAgdGVtcGxhdGVVcmw6ICcuL211bHRpLWZpbGUtdXBsb2FkLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbXVsdGktZmlsZS11cGxvYWQuY29tcG9uZW50LmNzcyddXG59KVxuZXhwb3J0IGNsYXNzIE11bHRpRmlsZVVwbG9hZENvbXBvbmVudCAgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpIGdyb3VwITogRm9ybUdyb3VwO1xuICBASW5wdXQoKSBmaWVsZDogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIGxhYmVsOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgZXJyb3JMYWJlbDogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIGJsYW5rRm9ybTogT2VwYUF0dGFjaG1lbnQgfCB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpIGJsYW5rRm9ybVVybDogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIHNob3dWYWxpZGF0aW9uID0gZmFsc2U7XG4gIEBJbnB1dCgpIGRvbWFpbiA9ICdhcHBsaWNhdGlvbic7XG4gIEBJbnB1dCgpIGF0dGFjaG1lbnRzOiBBcnJheTxPZXBhQXR0YWNobWVudD4gPSBbXTtcbiAgQElucHV0KCkgcmVtb3ZlQWxsb3dlZCA9IHRydWU7XG5cbiAgQE91dHB1dCgpIGZpbGVVcGxvYWRlZDogRXZlbnRFbWl0dGVyPE9lcGFBdHRhY2htZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIGZpbGVSZW1vdmVkOiBFdmVudEVtaXR0ZXI8T2VwYUF0dGFjaG1lbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgZG93bmxvYWQ6IEV2ZW50RW1pdHRlcjxPZXBhQXR0YWNobWVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQFZpZXdDaGlsZCgnbXlGaWxlSW5wdXQnLCB7IHN0YXRpYzogdHJ1ZX0pIG15RmlsZUlucHV0OiBhbnk7XG5cbiAgY29tcG9uZW50SWQgPSAnT2VwYU11bHRpRmlsZVVwbG9hZENvbXBvbmVudCc7XG4gIHVwbG9hZEVycm9yOiBzdHJpbmcgPSAnJztcbiAgcGFyc2VyUmVwb3J0ITogT2VwYVBhcnNlclJlcG9ydDtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGlkU2VydmljZTogT2VwYUNvbXBvbmVudElkU2VydmljZSwgcHJpdmF0ZSBmaWxlVXRpbFNlcnZpY2U6IE9lcGFGaWxlVXRpbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBtb2RhbFNlcnZpY2U6IEJzTW9kYWxTZXJ2aWNlKSB7IH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICBpZiAodGhpcy5ncm91cCkge1xuICAgICAgdGhpcy5jb21wb25lbnRJZCA9IHRoaXMuaWRTZXJ2aWNlLmdldENvbXBvbmVudElkKHRoaXMuZ3JvdXApO1xuICAgICAgdGhpcy5jb21wb25lbnRJZCArPSAodGhpcy5jb21wb25lbnRJZC5sZW5ndGggPiAwID8gJ18nIDogJycpICsgdGhpcy5maWVsZDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5sb2coJ09PUFMgTm8gZ3JvdXAgeWV0Jyk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmIChjaGFuZ2VzWydhdHRhY2htZW50cyddICYmIGNoYW5nZXNbJ2F0dGFjaG1lbnRzJ10gLmN1cnJlbnRWYWx1ZSkge1xuICAgICAgaWYgKGNoYW5nZXNbJ2F0dGFjaG1lbnRzJ10gLmN1cnJlbnRWYWx1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdmaWxlIGNoYW5nZWQgdG86ICcgKyBjaGFuZ2VzWydhdHRhY2htZW50cyddIC5jdXJyZW50VmFsdWVbMF0udXNlckZpbGVuYW1lKTtcbiAgICAgICAgdGhpcy5ncm91cC5jb250cm9sc1t0aGlzLmZpZWxkXS5zZXRWYWx1ZShjaGFuZ2VzWydhdHRhY2htZW50cyddIC5jdXJyZW50VmFsdWVbMF0udXNlckZpbGVuYW1lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZ3JvdXAuY29udHJvbHNbdGhpcy5maWVsZF0uc2V0VmFsdWUoJycpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZygnZmlsZSBjaGFuZ2VkIGFuZCBpcyBub3cgZW1wdHknKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZmlsZUNoYW5nZShldmVudDogYW55KSB7XG4gICAgY29uc3QgZmlsZUxpc3Q6IEZpbGVMaXN0ID0gZXZlbnQudGFyZ2V0LmZpbGVzO1xuICAgIGlmIChmaWxlTGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBmaWxlOiBGaWxlID0gZmlsZUxpc3RbMF07XG4gICAgICB0aGlzLmZpbGVVdGlsU2VydmljZS51cGxvYWRGaWxlKGZpbGUpLnN1YnNjcmliZSgoYXR0YWNobWVudDogT2VwYUF0dGFjaG1lbnQpID0+IHtcbiAgICAgICAgdGhpcy5maWxlVXBsb2FkZWQuZW1pdChhdHRhY2htZW50KTtcbiAgICAgICAgdGhpcy5teUZpbGVJbnB1dC5uYXRpdmVFbGVtZW50LnZhbHVlID0gJyc7XG4gICAgICB9LCBlcnIgPT4ge1xuICAgICAgICB0aGlzLnVwbG9hZEVycm9yID0gJ0Vycm9yIHVwbG9hZGluZyBmaWxlICcgKyBlcnI7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVtb3ZlRmlsZShhdHRhY2htZW50OiBPZXBhQXR0YWNobWVudCkge1xuICAgIGNvbnN0IG1vZGFsOiBCc01vZGFsUmVmID0gdGhpcy5tb2RhbFNlcnZpY2Uuc2hvdyhDb25maXJtYXRpb25Nb2RhbENvbXBvbmVudCwgeyBpZ25vcmVCYWNrZHJvcENsaWNrOiB0cnVlIH0pO1xuICAgICg8Q29uZmlybWF0aW9uTW9kYWxDb21wb25lbnQ+bW9kYWwuY29udGVudCkuaGVhZGVyVGV4dCA9ICdSZW1vdmUgQXR0YWNobWVudCc7XG4gICAgKDxDb25maXJtYXRpb25Nb2RhbENvbXBvbmVudD5tb2RhbC5jb250ZW50KS5ib2R5VGV4dCA9ICdEbyB5b3Ugd2FudCB0byByZW1vdmUgdGhlIGF0dGFjaG1lbnQ6ICcgKyBhdHRhY2htZW50LnVzZXJGaWxlbmFtZSArICc/JztcbiAgICAoPENvbmZpcm1hdGlvbk1vZGFsQ29tcG9uZW50Pm1vZGFsLmNvbnRlbnQpLmNvbmZpcm1CdG5MYWJlbCA9ICdZZXMnO1xuICAgICg8Q29uZmlybWF0aW9uTW9kYWxDb21wb25lbnQ+bW9kYWwuY29udGVudCkuY2FuY2VsQnRuTGFiZWwgPSAnTm8nO1xuICAgICg8Q29uZmlybWF0aW9uTW9kYWxDb21wb25lbnQ+bW9kYWwuY29udGVudCkuY29uZmlybUNsaWNrZWQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuZmlsZVJlbW92ZWQuZW1pdChhdHRhY2htZW50KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBkb3dubG9hZEZpbGUoYXR0YWNobWVudDogT2VwYUF0dGFjaG1lbnQpIHtcbiAgICBpZiAoIWF0dGFjaG1lbnQuc3lzdGVtRmlsZW5hbWUgfHwgYXR0YWNobWVudC5zeXN0ZW1GaWxlbmFtZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuZG93bmxvYWQuZW1pdChhdHRhY2htZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5maWxlVXRpbFNlcnZpY2UuZG93bmxvYWRBdHRhY2htZW50KGF0dGFjaG1lbnQpLnN1YnNjcmliZShcbiAgICAgICAgZGF0YSA9PiB7XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coJ0ZpbGUgZG93bmxvYWQgc3VjY2VzcycpO1xuICAgICAgICAgIGNvbnN0IG1pbWVUeXBlOiBzdHJpbmcgPSB0aGlzLmZpbGVVdGlsU2VydmljZS5taW1lVHlwZUZvckZpbGUoYXR0YWNobWVudC5zeXN0ZW1GaWxlbmFtZSB8fCAnJyk7XG4gICAgICAgICAgaWYgKG1pbWVUeXBlKSB7XG4gICAgICAgICAgICB0aGlzLmZpbGVVdGlsU2VydmljZS5kb3dubG9hZEZpbGUoZGF0YSwgbWltZVR5cGUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnVwbG9hZEVycm9yID0gJ1VuYWJsZSB0byBkb3dubG9hZCBmaWxlOiAnICsgYXR0YWNobWVudC51c2VyRmlsZW5hbWUgKyAnLiBDYW5ub3QgZGV0ZXJtaW5lIG1pbWUgdHlwZSc7XG4gICAgICAgICAgfVxuICAgICAgICB9LCBlcnIgPT4ge1xuICAgICAgICAgIHRoaXMudXBsb2FkRXJyb3IgPSAnRXJyb3IgZG93bmxvYWRpbmcgZmlsZTogJyArIGF0dGFjaG1lbnQudXNlckZpbGVuYW1lICsgJy4gJyArIGVycjtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZG93bmxvYWRCbGFua0Zvcm0oKSB7XG4gICAgaWYgKHRoaXMuYmxhbmtGb3JtKSB7XG4gICAgICB0aGlzLmRvd25sb2FkRmlsZSh0aGlzLmJsYW5rRm9ybSk7XG4gICAgfVxuICB9XG5cbn1cbiIsIjxmb3JtIFtmb3JtR3JvdXBdPVwiZ3JvdXBcIj5cbiAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cbiAgICA8ZGl2PlxuICAgICAgPGxhYmVsICpuZ0lmPVwibGFiZWxcIj57e2xhYmVsfX08L2xhYmVsPlxuICAgICAgPHNwYW4gKm5nSWY9XCJibGFua0Zvcm1VcmxcIj4mbmJzcDs8YSBocmVmPVwie3tibGFua0Zvcm1Vcmx9fVwiIHRhcmdldD1cIl9ibGFua1wiPkJsYW5rIEZvcm08L2E+PC9zcGFuPlxuICAgICAgPHNwYW4gKm5nSWY9XCJibGFua0Zvcm1cIj4mbmJzcDs8YSBocmVmPVwiXCIgKGNsaWNrKT1cImRvd25sb2FkQmxhbmtGb3JtKClcIj5CbGFuayBGb3JtPC9hPjwvc3Bhbj5cbiAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXBcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnB1dC1ncm91cC1idG5cIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgYnRuLWZpbGVcIj5cbiAgICAgICAgICAgIEJyb3dzZSZoZWxsaXA7IFxuICAgICAgICAgICAgPGlucHV0ICNteUZpbGVJbnB1dCB0eXBlPVwiZmlsZVwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIiAoY2hhbmdlKT1cImZpbGVDaGFuZ2UoJGV2ZW50KVwiIFxuICAgICAgICAgICAgICBbaWRdPVwiY29tcG9uZW50SWQrJ19Ccm93c2VCdG4nXCIgW25hbWVdPVwiY29tcG9uZW50SWQrJ19Ccm93c2VCdG4nXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZ3JvdXAuY29udHJvbHNbZmllbGRdLnN0YXR1cyA9PT0gJ0RJU0FCTEVEJ1wiPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPGlucHV0ICBbbmdDbGFzc109XCJ7J2lzLWludmFsaWQnOnNob3dWYWxpZGF0aW9uICYmIGdyb3VwLmNvbnRyb2xzW2ZpZWxkXS5zdGF0dXMgPT09ICdJTlZBTElEJ31cIlxuICAgICAgICAgIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBcbiAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiKCFhdHRhY2htZW50cyB8fCBhdHRhY2htZW50cy5sZW5ndGggPT09IDApID8gJ05vIGZpbGVzIHVwbG9hZGVkJyA6IChhdHRhY2htZW50cy5sZW5ndGggKyAnIGZpbGUocykgdXBsb2FkZWQnKVwiXG4gICAgICAgICAgW2lkXT1cImNvbXBvbmVudElkKydfSW5wdXQnXCIgW25hbWVdPVwiY29tcG9uZW50SWQrJ19JbnB1dCdcIiByZWFkb25seT5cbiAgICAgICAgICA8c21hbGwgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCIgKm5nSWY9XCJzaG93VmFsaWRhdGlvbiAmJiBncm91cC5jb250cm9sc1tmaWVsZF0uc3RhdHVzID09PSAnSU5WQUxJRCdcIj57e2Vycm9yTGFiZWwgfHwgbGFiZWx9fSBpcyByZXF1aXJlZDwvc21hbGw+XG4gICAgICA8L2Rpdj5cbiAgICAgIDwhLS0gZHVtbXkgaW5wdXQgZmllbGQgZm9yIHZhbGlkYXRpb24gcHVycG9zZXMgLS0+XG4gICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBbaGlkZGVuXT1cInRydWVcIiBbZm9ybUNvbnRyb2xOYW1lXT1cImZpZWxkXCIvPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgICA8ZGl2ICpuZ0lmPVwidXBsb2FkRXJyb3JcIiBjbGFzcz1cImFsZXJ0IGFsZXJ0LWRhbmdlclwiIHJvbGU9XCJhbGVydFwiPnt7dXBsb2FkRXJyb3J9fTwvZGl2PlxuICAgIDxkaXYgKm5nSWY9XCJwYXJzZXJSZXBvcnRcIj5cbiAgICAgIDxkaXYgKm5nSWY9XCIhYXR0YWNobWVudHNbMF0gJiYgcGFyc2VyUmVwb3J0LnN1Y2Nlc3NmdWxcIiBjbGFzcz1cImFsZXJ0IGFsZXJ0LWluZm9cIiByb2xlPVwiYWxlcnRcIj5TcHJlYWRzaGVldCB3YXMgc3VjY2Vzc2Z1bGx5IHBhcnNlZC48L2Rpdj5cbiAgICAgIDxkaXYgW2hpZGRlbl09XCJwYXJzZXJSZXBvcnQuc3VjY2Vzc2Z1bFwiIGNsYXNzPVwiYWxlcnQgYWxlcnQtZGFuZ2VyXCIgcm9sZT1cImFsZXJ0XCI+XG4gICAgICAgIFRoZXJlIGFyZSBlcnJvcnMgaW4gdGhlIHVwbG9hZGVkIHNwcmVhZHNoZWV0OlxuICAgICAgICA8dWw+XG4gICAgICAgICAgPGxpICpuZ0Zvcj1cImxldCBlcnJvciBvZiBwYXJzZXJSZXBvcnQuZXJyb3JzXCI+e3tlcnJvci5tZXNzYWdlfX08L2xpPlxuICAgICAgICA8L3VsPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2ICpuZ0lmPVwiYXR0YWNobWVudHMgJiYgYXR0YWNobWVudHNbMF1cIj5cbiAgICA8ZGl2ICpuZ0Zvcj1cImxldCBhdHRhY2htZW50IG9mIGF0dGFjaG1lbnRzOyBsZXQgaT1pbmRleDtcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cFwiPlxuICAgICAgICAgIDxhIChjbGljayk9XCJkb3dubG9hZEZpbGUoYXR0YWNobWVudClcIiBbaWRdPVwiY29tcG9uZW50SWQrJ19Eb3dubG9hZEZpbGVMaW5rXycraVwiIFtuYW1lXT1cImNvbXBvbmVudElkKydfRG93bmxvYWRGaWxlTGlua18nK2lcIlxuICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIj57e2F0dGFjaG1lbnQudXNlckZpbGVuYW1lfX08L2E+XG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCJyZW1vdmVBbGxvd2VkXCIgY2xhc3M9XCJpbnB1dC1ncm91cC1idG5cIj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgW2lkXT1cImNvbXBvbmVudElkKydfUmVtb3ZlRmlsZUJ0bl8nK2lcIiBbbmFtZV09XCJjb21wb25lbnRJZCsnX1JlbW92ZUZpbGVCdG5fJytpXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZUZpbGUoYXR0YWNobWVudClcIiBbZGlzYWJsZWRdPVwiZ3JvdXAuY29udHJvbHNbZmllbGRdLnN0YXR1cyA9PT0gJ0RJU0FCTEVEJ1wiPlJlbW92ZSBBdHRhY2htZW50PC9idXR0b24+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZm9ybT4iXX0=