ets-fe-ng-sdk 17.0.310 → 17.0.312
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/Shared/components/file-upload/file-upload.component.mjs +3 -3
- package/esm2022/lib/Shared/components/webcam-media/webcam-media.component.mjs +40 -39
- package/fesm2022/ets-fe-ng-sdk.mjs +39 -39
- package/fesm2022/ets-fe-ng-sdk.mjs.map +1 -1
- package/lib/Services/utility.service.d.ts +1 -1
- package/lib/Shared/components/btn/btn.component.d.ts +1 -1
- package/lib/Shared/components/info-dialog/info-dialog.component.d.ts +1 -1
- package/lib/Shared/components/table-https/table-https.component.d.ts +1 -1
- package/lib/Shared/components/webcam-media/webcam-media.component.d.ts +8 -4
- package/package.json +1 -1
|
@@ -72,11 +72,11 @@ export class FileUploadComponent {
|
|
|
72
72
|
inp.click();
|
|
73
73
|
}
|
|
74
74
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.1", ngImport: i0, type: FileUploadComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
75
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.2.1", type: FileUploadComponent, isStandalone: true, selector: "app-file-upload", inputs: { help: { classPropertyName: "help", publicName: "help", isSignal: false, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: false, isRequired: false, transformFunction: null }, mediaWidth: { classPropertyName: "mediaWidth", publicName: "mediaWidth", isSignal: true, isRequired: false, transformFunction: null }, class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, useWebcam: { classPropertyName: "useWebcam", publicName: "useWebcam", isSignal: true, isRequired: false, transformFunction: null }, fileName: { classPropertyName: "fileName", publicName: "fileName", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: false, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: false, isRequired: false, transformFunction: null }, mini: { classPropertyName: "mini", publicName: "mini", isSignal: true, isRequired: false, transformFunction: null }, useDocumentModal: { classPropertyName: "useDocumentModal", publicName: "useDocumentModal", isSignal: false, isRequired: false, transformFunction: null }, listFiles: { classPropertyName: "listFiles", publicName: "listFiles", isSignal: true, isRequired: false, transformFunction: null }, _accept: { classPropertyName: "_accept", publicName: "accept", isSignal: false, isRequired: false, transformFunction: null }, file: { classPropertyName: "file", publicName: "file", isSignal: false, isRequired: false, transformFunction: null }, files: { classPropertyName: "files", publicName: "files", isSignal: false, isRequired: false, transformFunction: null } }, outputs: { mediaWidth: "mediaWidthChange", fileChange: "fileChange", filesChange: "filesChange" }, ngImport: i0, template: "@if (listFiles()) {\n <div [ngClass]=\"{ meta: mini() }\" class=\"{{ class() }} form-label mb-2 hide-scroll\">\n @for (item of files; track item) {\n <div class=\"row align-items-start mb-1\">\n <div class=\"col\">\n <div class=\"hide-scroll file-name\">\n {{ item?.name }}\n </div>\n </div>\n <div class=\"col-auto text-end\">\n <span class=\"text-danger pointer p-1 fa fa-close\" (click)=\"removeFile($index)\"></span>\n </div>\n </div>\n }\n </div>\n}\n<!-- <input type=\"file\" style=\"display: none;\" accept=\"{{accept}}\" (change)=\"onUpload($event)\" #uploadInput [multiple]=\"multiple\"> -->\n<app-btn\n icon=\"upload\"\n (mclick)=\"useWebcam() ? null : openDialog()\"\n [type]=\"file ? 'primary' : 'secondary'\"\n [disabled]=\"disabled\"\n [help]=\"help\"\n [text]=\"label\"\n [matMenuTriggerFor]=\"useWebcam() ? menu : null\" />\n\n<mat-menu #menu=\"matMenu\">\n <button mat-menu-item (click)=\"openDialog()\">Upload</button>\n <button mat-menu-item (click)=\"webcamModal.open()\">Use Camera</button>\n</mat-menu>\n\n<modal-comp #webcamModal width=\"1080px\" header=\"Webcam\">\n <ng-template modalBody>\n <lib-webcam-media [fileName]=\"fileName()\" [width]=\"mediaWidth()\" (closed)=\"webcamModal.close(); acceptFiles($event)\" />\n </ng-template>\n</modal-comp>\n", styles: [".meta,.file-name{height:23px}.meta{overflow-y:auto}.file-name{overflow:auto}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: BtnComponent, selector: "app-btn", inputs: ["formSchema", "debug", "centerBtn", "danger", "warning", "icon", "rightIcon", "leftIcon", "type", "group", "actionType", "animate", "excludeLogging", "loggingValue", "badge", "class", "customIcon", "disabled", "form", "forms", "help", "iconBtn", "loading", "mclass", "showHelpIcon", "rightCustomIcon", "leftCustomIcon", "text", "valid", "mini", "onFormInvalid"], outputs: ["mclick"] }, { kind: "component", type: i1.ModalComponent, selector: "modal-comp", inputs: ["header", "bodyTemplateRef", "footerTemplateRef", "showHeader", "loading", "isFullscreen", "showFooter", "width", "minWidth", "height", "maxHeight", "icon", "data", "disableClose", "hasBackdrop"], outputs: ["modalOpen", "modalClose"] }, { kind: "directive", type: i2.ModalBodyDirective, selector: "[modalBody]" }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i3.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i3.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i3.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "component", type: WebcamMediaComponent, selector: "lib-webcam-media", inputs: ["isVideo", "useAudio", "fileName", "fileNameFactory", "fileType", "extraClass", "recordingNotificationInterval", "isBackground", "width"], outputs: ["closed", "recorderStopped", "recorderErrored", "recorderStarted", "recordingState", "recordingChanged", "widthChange"] }] }); }
|
|
75
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.2.1", type: FileUploadComponent, isStandalone: true, selector: "app-file-upload", inputs: { help: { classPropertyName: "help", publicName: "help", isSignal: false, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: false, isRequired: false, transformFunction: null }, mediaWidth: { classPropertyName: "mediaWidth", publicName: "mediaWidth", isSignal: true, isRequired: false, transformFunction: null }, class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, useWebcam: { classPropertyName: "useWebcam", publicName: "useWebcam", isSignal: true, isRequired: false, transformFunction: null }, fileName: { classPropertyName: "fileName", publicName: "fileName", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: false, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: false, isRequired: false, transformFunction: null }, mini: { classPropertyName: "mini", publicName: "mini", isSignal: true, isRequired: false, transformFunction: null }, useDocumentModal: { classPropertyName: "useDocumentModal", publicName: "useDocumentModal", isSignal: false, isRequired: false, transformFunction: null }, listFiles: { classPropertyName: "listFiles", publicName: "listFiles", isSignal: true, isRequired: false, transformFunction: null }, _accept: { classPropertyName: "_accept", publicName: "accept", isSignal: false, isRequired: false, transformFunction: null }, file: { classPropertyName: "file", publicName: "file", isSignal: false, isRequired: false, transformFunction: null }, files: { classPropertyName: "files", publicName: "files", isSignal: false, isRequired: false, transformFunction: null } }, outputs: { mediaWidth: "mediaWidthChange", fileChange: "fileChange", filesChange: "filesChange" }, ngImport: i0, template: "@if (listFiles()) {\n <div [ngClass]=\"{ meta: mini() }\" class=\"{{ class() }} form-label mb-2 hide-scroll\">\n @for (item of files; track item) {\n <div class=\"row align-items-start mb-1\">\n <div class=\"col\">\n <div class=\"hide-scroll file-name\">\n {{ item?.name }}\n </div>\n </div>\n <div class=\"col-auto text-end\">\n <span class=\"text-danger pointer p-1 fa fa-close\" (click)=\"removeFile($index)\"></span>\n </div>\n </div>\n }\n </div>\n}\n<!-- <input type=\"file\" style=\"display: none;\" accept=\"{{accept}}\" (change)=\"onUpload($event)\" #uploadInput [multiple]=\"multiple\"> -->\n<app-btn\n icon=\"upload\"\n (mclick)=\"useWebcam() ? null : openDialog()\"\n [type]=\"file ? 'primary' : 'secondary'\"\n [disabled]=\"disabled\"\n [help]=\"help\"\n [text]=\"label\"\n [matMenuTriggerFor]=\"useWebcam() ? menu : null\" />\n\n<mat-menu #menu=\"matMenu\">\n <button mat-menu-item (click)=\"openDialog()\">Upload</button>\n <button mat-menu-item (click)=\"webcamModal.open()\">Use Camera</button>\n</mat-menu>\n\n<modal-comp #webcamModal width=\"1080px\" [showFooter]=\"false\" header=\"Webcam\">\n <ng-template modalBody>\n <lib-webcam-media [fileName]=\"fileName()\" [width]=\"mediaWidth()\" (closed)=\"webcamModal.close(); $event ? acceptFiles($event) : null\" />\n </ng-template>\n</modal-comp>\n", styles: [".meta,.file-name{height:23px}.meta{overflow-y:auto}.file-name{overflow:auto}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: BtnComponent, selector: "app-btn", inputs: ["formSchema", "debug", "centerBtn", "danger", "warning", "icon", "rightIcon", "leftIcon", "type", "group", "actionType", "animate", "excludeLogging", "loggingValue", "badge", "class", "customIcon", "disabled", "form", "forms", "help", "iconBtn", "loading", "mclass", "showHelpIcon", "rightCustomIcon", "leftCustomIcon", "text", "valid", "mini", "onFormInvalid"], outputs: ["mclick"] }, { kind: "component", type: i1.ModalComponent, selector: "modal-comp", inputs: ["header", "bodyTemplateRef", "footerTemplateRef", "showHeader", "loading", "isFullscreen", "showFooter", "width", "minWidth", "height", "maxHeight", "icon", "data", "disableClose", "hasBackdrop"], outputs: ["modalOpen", "modalClose"] }, { kind: "directive", type: i2.ModalBodyDirective, selector: "[modalBody]" }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i3.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i3.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i3.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "component", type: WebcamMediaComponent, selector: "lib-webcam-media", inputs: ["isVideo", "useAudio", "fileName", "fileNameFactory", "fileType", "extraClass", "recordingNotificationInterval", "isBackground", "width"], outputs: ["closed", "recorderStopped", "recorderErrored", "recorderStarted", "recordingState", "recordingChanged", "widthChange"] }] }); }
|
|
76
76
|
}
|
|
77
77
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.1", ngImport: i0, type: FileUploadComponent, decorators: [{
|
|
78
78
|
type: Component,
|
|
79
|
-
args: [{ selector: 'app-file-upload', standalone: true, imports: [NgIf, NgClass, NgFor, BtnComponent, ModalComponents, MatMenuModule, WebcamMediaComponent], template: "@if (listFiles()) {\n <div [ngClass]=\"{ meta: mini() }\" class=\"{{ class() }} form-label mb-2 hide-scroll\">\n @for (item of files; track item) {\n <div class=\"row align-items-start mb-1\">\n <div class=\"col\">\n <div class=\"hide-scroll file-name\">\n {{ item?.name }}\n </div>\n </div>\n <div class=\"col-auto text-end\">\n <span class=\"text-danger pointer p-1 fa fa-close\" (click)=\"removeFile($index)\"></span>\n </div>\n </div>\n }\n </div>\n}\n<!-- <input type=\"file\" style=\"display: none;\" accept=\"{{accept}}\" (change)=\"onUpload($event)\" #uploadInput [multiple]=\"multiple\"> -->\n<app-btn\n icon=\"upload\"\n (mclick)=\"useWebcam() ? null : openDialog()\"\n [type]=\"file ? 'primary' : 'secondary'\"\n [disabled]=\"disabled\"\n [help]=\"help\"\n [text]=\"label\"\n [matMenuTriggerFor]=\"useWebcam() ? menu : null\" />\n\n<mat-menu #menu=\"matMenu\">\n <button mat-menu-item (click)=\"openDialog()\">Upload</button>\n <button mat-menu-item (click)=\"webcamModal.open()\">Use Camera</button>\n</mat-menu>\n\n<modal-comp #webcamModal width=\"1080px\" header=\"Webcam\">\n <ng-template modalBody>\n <lib-webcam-media [fileName]=\"fileName()\" [width]=\"mediaWidth()\" (closed)=\"webcamModal.close(); acceptFiles($event)\" />\n </ng-template>\n</modal-comp>\n", styles: [".meta,.file-name{height:23px}.meta{overflow-y:auto}.file-name{overflow:auto}\n"] }]
|
|
79
|
+
args: [{ selector: 'app-file-upload', standalone: true, imports: [NgIf, NgClass, NgFor, BtnComponent, ModalComponents, MatMenuModule, WebcamMediaComponent], template: "@if (listFiles()) {\n <div [ngClass]=\"{ meta: mini() }\" class=\"{{ class() }} form-label mb-2 hide-scroll\">\n @for (item of files; track item) {\n <div class=\"row align-items-start mb-1\">\n <div class=\"col\">\n <div class=\"hide-scroll file-name\">\n {{ item?.name }}\n </div>\n </div>\n <div class=\"col-auto text-end\">\n <span class=\"text-danger pointer p-1 fa fa-close\" (click)=\"removeFile($index)\"></span>\n </div>\n </div>\n }\n </div>\n}\n<!-- <input type=\"file\" style=\"display: none;\" accept=\"{{accept}}\" (change)=\"onUpload($event)\" #uploadInput [multiple]=\"multiple\"> -->\n<app-btn\n icon=\"upload\"\n (mclick)=\"useWebcam() ? null : openDialog()\"\n [type]=\"file ? 'primary' : 'secondary'\"\n [disabled]=\"disabled\"\n [help]=\"help\"\n [text]=\"label\"\n [matMenuTriggerFor]=\"useWebcam() ? menu : null\" />\n\n<mat-menu #menu=\"matMenu\">\n <button mat-menu-item (click)=\"openDialog()\">Upload</button>\n <button mat-menu-item (click)=\"webcamModal.open()\">Use Camera</button>\n</mat-menu>\n\n<modal-comp #webcamModal width=\"1080px\" [showFooter]=\"false\" header=\"Webcam\">\n <ng-template modalBody>\n <lib-webcam-media [fileName]=\"fileName()\" [width]=\"mediaWidth()\" (closed)=\"webcamModal.close(); $event ? acceptFiles($event) : null\" />\n </ng-template>\n</modal-comp>\n", styles: [".meta,.file-name{height:23px}.meta{overflow-y:auto}.file-name{overflow:auto}\n"] }]
|
|
80
80
|
}], ctorParameters: () => [], propDecorators: { help: [{
|
|
81
81
|
type: Input
|
|
82
82
|
}], label: [{
|
|
@@ -99,4 +99,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.1", ngImpor
|
|
|
99
99
|
}], filesChange: [{
|
|
100
100
|
type: Output
|
|
101
101
|
}] } });
|
|
102
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
102
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS11cGxvYWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZXRzLWZlLW5nLXNkay9zcmMvbGliL1NoYXJlZC9jb21wb25lbnRzL2ZpbGUtdXBsb2FkL2ZpbGUtdXBsb2FkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2V0cy1mZS1uZy1zZGsvc3JjL2xpYi9TaGFyZWQvY29tcG9uZW50cy9maWxlLXVwbG9hZC9maWxlLXVwbG9hZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JHLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDbkUsT0FBTyxlQUFlLE1BQU0sc0NBQXNDLENBQUM7QUFDbkUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHdDQUF3QyxDQUFDOzs7OztBQVM5RSxNQUFNLE9BQU8sbUJBQW1CO0lBZ0I5QixJQUFxQixPQUFPLENBQUMsQ0FBUztRQUNwQyxRQUFRLENBQUMsRUFBRTtZQUNULEtBQUssT0FBTztnQkFDVixJQUFJLENBQUMsTUFBTSxHQUFHLHNCQUFzQixDQUFDO2dCQUNyQyxNQUFNO1lBRVI7Z0JBQ0UsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7Z0JBQ2hCLE1BQU07U0FDVDtJQUNILENBQUM7SUFT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LGNBR2YsSUFBSSxXQUNQLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFDLGVBQWUsRUFBQyxhQUFhLEVBQUMsb0JBQW9CLENBQUM7d0RBR3ZGLElBQUk7c0JBQVosS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBUUcsUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUVHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFHZSxPQUFPO3NCQUEzQixLQUFLO3VCQUFDLFFBQVE7Z0JBWU4sSUFBSTtzQkFBWixLQUFLO2dCQUNJLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0UsS0FBSztzQkFBYixLQUFLO2dCQUNJLFdBQVc7c0JBQXBCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBpbmplY3QsIGlucHV0LCBtb2RlbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmdJZiwgTmdDbGFzcywgTmdGb3IgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQnRuQ29tcG9uZW50IH0gZnJvbSAnLi4vYnRuL2J0bi5jb21wb25lbnQnO1xuaW1wb3J0IHsgVXRpbGl0eVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9TZXJ2aWNlcy91dGlsaXR5LnNlcnZpY2UnO1xuaW1wb3J0IE1vZGFsQ29tcG9uZW50cyBmcm9tICcuLi9tb2RhbC1jb21wb25lbnRzL21vZGFsLmNvbXBvbmVudHMnO1xuaW1wb3J0IHsgTWF0TWVudU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL21lbnUnO1xuaW1wb3J0IHsgV2ViY2FtTWVkaWFDb21wb25lbnQgfSBmcm9tICcuLi93ZWJjYW0tbWVkaWEvd2ViY2FtLW1lZGlhLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1maWxlLXVwbG9hZCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9maWxlLXVwbG9hZC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2ZpbGUtdXBsb2FkLmNvbXBvbmVudC5zY3NzJ10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtOZ0lmLCBOZ0NsYXNzLCBOZ0ZvciwgQnRuQ29tcG9uZW50LE1vZGFsQ29tcG9uZW50cyxNYXRNZW51TW9kdWxlLFdlYmNhbU1lZGlhQ29tcG9uZW50XSxcbn0pXG5leHBvcnQgY2xhc3MgRmlsZVVwbG9hZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBJbnB1dCgpIGhlbHA6IHN0cmluZztcbiAgQElucHV0KCkgbGFiZWw6IHN0cmluZztcbiAgbWVkaWFXaWR0aCA9IG1vZGVsPG51bWJlcj4oMTA4MCk7IFxuICBjbGFzcyA9IGlucHV0PHN0cmluZz4oKTtcbiAgdXNlV2ViY2FtID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuICAvKipcbiAgICogT25seSB1c2VmdWwgaWYgdXNpbmcgdGhlIHdlYmNhbSBvcHRpb25cbiAgICovXG4gIGZpbGVOYW1lID0gaW5wdXQ8c3RyaW5nPigpO1xuICBASW5wdXQoKSBkaXNhYmxlZDogYm9vbGVhbjtcbiAgQElucHV0KCkgbXVsdGlwbGU6IGJvb2xlYW47XG4gIG1pbmkgPSBpbnB1dCh0cnVlKTtcbiAgQElucHV0KCkgdXNlRG9jdW1lbnRNb2RhbDogYm9vbGVhbjtcbiAgbGlzdEZpbGVzID0gaW5wdXQodHJ1ZSk7XG4gIGFjY2VwdDogc3RyaW5nO1xuICBASW5wdXQoJ2FjY2VwdCcpIHNldCBfYWNjZXB0KHY6IHN0cmluZykge1xuICAgIHN3aXRjaCAodikge1xuICAgICAgY2FzZSAnaW1hZ2UnOlxuICAgICAgICB0aGlzLmFjY2VwdCA9ICcucG5nLC5qcGcsLmRvY3gsLnBkZic7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aGlzLmFjY2VwdCA9IHY7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICAvLyBAVmlld0NoaWxkKCd1cGxvYWRJbnB1dCcpIHVwbG9hZElucHV0UmVmOiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+O1xuICBASW5wdXQoKSBmaWxlOiBGaWxlO1xuICBAT3V0cHV0KCkgZmlsZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8RmlsZT4oKTtcbiAgQElucHV0KCkgZmlsZXM6IEZpbGVbXTtcbiAgQE91dHB1dCgpIGZpbGVzQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxGaWxlW10+KCk7XG5cbiAgcHVibGljIHVTID0gaW5qZWN0KFV0aWxpdHlTZXJ2aWNlKTtcblxuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7fVxuXG4gIGdldCBpc1NpbmdsZSgpIHtcbiAgICByZXR1cm4gIXRoaXMubXVsdGlwbGU7XG4gIH1cbiAgcHJvdGVjdGVkIGFjY2VwdEZpbGVzKC4uLmZpbGVzOiBGaWxlW10pIHtcbiAgICB0aGlzLmZpbGVzID0gZmlsZXM7XG4gICAgdGhpcy5maWxlID0gZmlsZXMgPyBmaWxlc1swXSA6IG51bGw7XG4gICAgdGhpcy5lbWl0RmlsZXMoKTtcbiAgfVxuICBwcm90ZWN0ZWQgZW1pdEZpbGVzKCkge1xuICAgIGlmICh0aGlzLm11bHRpcGxlKSB0aGlzLmZpbGVzQ2hhbmdlLmVtaXQodGhpcy5maWxlcyk7XG4gICAgZWxzZSB0aGlzLmZpbGVDaGFuZ2UuZW1pdCh0aGlzLmZpbGUpO1xuICB9XG5cbiAgb25VcGxvYWQoZXZlbnQ6IGFueSkge1xuICAgIGNvbnN0IGZpbGVzID0gQXJyYXkuZnJvbTxGaWxlPihldmVudC50YXJnZXQuZmlsZXMpO1xuICAgIHRoaXMuYWNjZXB0RmlsZXMoLi4uZmlsZXMpO1xuICB9XG5cbiAgcmVtb3ZlRmlsZShpbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy5maWxlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIHRoaXMuZmlsZSA9IHRoaXMuZmlsZXMgPyB0aGlzLmZpbGVzWzBdIDogbnVsbDtcblxuICAgIHRoaXMuZmlsZUNoYW5nZS5lbWl0KHRoaXMuZmlsZSk7XG4gICAgdGhpcy5maWxlc0NoYW5nZS5lbWl0KHRoaXMuZmlsZXMpO1xuICB9XG4gIG9wZW5EaWFsb2coKSB7XG4gICAgY29uc3QgaW5wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgICBpbnAudHlwZSA9ICdmaWxlJztcbiAgICBpbnAuYWNjZXB0ID0gdGhpcy5hY2NlcHQ7XG4gICAgaW5wLm11bHRpcGxlID0gdGhpcy5tdWx0aXBsZTtcbiAgICBpbnAub25jaGFuZ2UgPSAoZSkgPT4ge1xuICAgICAgdGhpcy5vblVwbG9hZChlKTtcbiAgICAgIGlucC5yZW1vdmUoKTtcbiAgICB9O1xuICAgIC8vIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaW5wKTtcbiAgICBpbnAuY2xpY2soKTtcbiAgfVxufVxuIiwiQGlmIChsaXN0RmlsZXMoKSkge1xuICA8ZGl2IFtuZ0NsYXNzXT1cInsgbWV0YTogbWluaSgpIH1cIiBjbGFzcz1cInt7IGNsYXNzKCkgfX0gZm9ybS1sYWJlbCBtYi0yIGhpZGUtc2Nyb2xsXCI+XG4gICAgQGZvciAoaXRlbSBvZiBmaWxlczsgdHJhY2sgaXRlbSkge1xuICAgICAgPGRpdiBjbGFzcz1cInJvdyBhbGlnbi1pdGVtcy1zdGFydCBtYi0xXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGlkZS1zY3JvbGwgZmlsZS1uYW1lXCI+XG4gICAgICAgICAgICB7eyBpdGVtPy5uYW1lIH19XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWF1dG8gdGV4dC1lbmRcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyIHBvaW50ZXIgcC0xIGZhIGZhLWNsb3NlXCIgKGNsaWNrKT1cInJlbW92ZUZpbGUoJGluZGV4KVwiPjwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gIDwvZGl2PlxufVxuPCEtLSA8aW5wdXQgdHlwZT1cImZpbGVcIiAgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiIGFjY2VwdD1cInt7YWNjZXB0fX1cIiAoY2hhbmdlKT1cIm9uVXBsb2FkKCRldmVudClcIiAjdXBsb2FkSW5wdXQgW211bHRpcGxlXT1cIm11bHRpcGxlXCI+IC0tPlxuPGFwcC1idG5cbiAgaWNvbj1cInVwbG9hZFwiXG4gIChtY2xpY2spPVwidXNlV2ViY2FtKCkgPyBudWxsIDogb3BlbkRpYWxvZygpXCJcbiAgW3R5cGVdPVwiZmlsZSA/ICdwcmltYXJ5JyA6ICdzZWNvbmRhcnknXCJcbiAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgW2hlbHBdPVwiaGVscFwiXG4gIFt0ZXh0XT1cImxhYmVsXCJcbiAgW21hdE1lbnVUcmlnZ2VyRm9yXT1cInVzZVdlYmNhbSgpID8gbWVudSA6IG51bGxcIiAvPlxuXG48bWF0LW1lbnUgI21lbnU9XCJtYXRNZW51XCI+XG4gIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwib3BlbkRpYWxvZygpXCI+VXBsb2FkPC9idXR0b24+XG4gIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwid2ViY2FtTW9kYWwub3BlbigpXCI+VXNlIENhbWVyYTwvYnV0dG9uPlxuPC9tYXQtbWVudT5cblxuPG1vZGFsLWNvbXAgI3dlYmNhbU1vZGFsIHdpZHRoPVwiMTA4MHB4XCIgW3Nob3dGb290ZXJdPVwiZmFsc2VcIiBoZWFkZXI9XCJXZWJjYW1cIj5cbiAgPG5nLXRlbXBsYXRlIG1vZGFsQm9keT5cbiAgICA8bGliLXdlYmNhbS1tZWRpYSBbZmlsZU5hbWVdPVwiZmlsZU5hbWUoKVwiIFt3aWR0aF09XCJtZWRpYVdpZHRoKClcIiAoY2xvc2VkKT1cIndlYmNhbU1vZGFsLmNsb3NlKCk7ICRldmVudCA/IGFjY2VwdEZpbGVzKCRldmVudCkgOiBudWxsXCIgLz5cbiAgPC9uZy10ZW1wbGF0ZT5cbjwvbW9kYWwtY29tcD5cbiJdfQ==
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { CommonModule } from '@angular/common';
|
|
2
2
|
import { Component, EventEmitter, Output, computed, input, model, signal, viewChild, } from '@angular/core';
|
|
3
3
|
import { BtnComponent } from '../btn/btn.component';
|
|
4
|
-
import {
|
|
4
|
+
import { map, Observable } from 'rxjs';
|
|
5
5
|
import { toSignal } from '@angular/core/rxjs-interop';
|
|
6
|
+
import { LoaderComponent } from '../loader/loader.component';
|
|
6
7
|
import * as i0 from "@angular/core";
|
|
7
8
|
import * as i1 from "@angular/common";
|
|
8
9
|
export class WebcamMediaComponent {
|
|
@@ -55,81 +56,81 @@ export class WebcamMediaComponent {
|
|
|
55
56
|
// will be set by the startup() function.
|
|
56
57
|
this.canvas = signal(undefined);
|
|
57
58
|
this.mediaFile = signal(undefined);
|
|
58
|
-
this.
|
|
59
|
-
this.videoSrc = signal(undefined);
|
|
59
|
+
this.mediaFileLink = computed(() => (this.mediaFile() ? URL.createObjectURL(this.mediaFile()) : undefined));
|
|
60
60
|
this.stream = signal(undefined);
|
|
61
61
|
this.isRecording = toSignal(this.recordingState.pipe(map((r) => r == 'recording' || r == 'paused')));
|
|
62
62
|
this.recordedBlobs = [];
|
|
63
|
-
|
|
63
|
+
/**In Milliseconds */
|
|
64
|
+
this.recordedTimeMS = signal(0);
|
|
65
|
+
this.recordedTime = computed(() => Math.round(this.recordedTimeMS() / 1000));
|
|
66
|
+
this.loading = signal(false);
|
|
64
67
|
this.startRecording = (stream = this.stream()) => {
|
|
65
68
|
if (!this.isVideo())
|
|
66
69
|
return;
|
|
67
70
|
this.recorder = new MediaRecorder(stream);
|
|
68
71
|
this.recordedBlobs = [];
|
|
69
|
-
this.
|
|
70
|
-
const
|
|
72
|
+
this.recordedTimeMS.set(0);
|
|
73
|
+
const startTime = Date.now();
|
|
71
74
|
this.recorder.ondataavailable = (event) => {
|
|
72
75
|
this.recordedBlobs.push(event.data);
|
|
76
|
+
this.recordedTimeMS.set(Date.now() - startTime);
|
|
73
77
|
this.mediaFile.set(new File(this.recordedBlobs, this.computedFileName(), { type: this.computedFileType() }));
|
|
74
|
-
|
|
78
|
+
this.recordingChanged.emit(this.mediaFile());
|
|
75
79
|
};
|
|
76
80
|
// this.recorder.ondataavailable = (event) => {
|
|
77
81
|
// this.recordedBlobs = [event.data];
|
|
78
82
|
// lengths.push(event.data.size);
|
|
79
83
|
// };
|
|
80
84
|
// this.recorder.ondataavailable = (event) => this.recordedBlobs.push(event.data);
|
|
81
|
-
this.recorder.start();
|
|
82
|
-
let notifSub;
|
|
83
|
-
const startTimer = () => {
|
|
84
|
-
let lastDateTime = Date.now();
|
|
85
|
-
notifSub = timer(1000, 1000)
|
|
86
|
-
.pipe(tap(() => this.recordedTime.update((t) => (t += 1))), tap(() => console.log(Date.now(), this.computedRecordingNotificationInterval(), this.recordingNotificationInterval())), filter(() => Date.now() - lastDateTime > this.computedRecordingNotificationInterval()), tap(() => this.recorder.requestData()))
|
|
87
|
-
.subscribe((r) => {
|
|
88
|
-
lastDateTime = Date.now();
|
|
89
|
-
this.recordingChanged.emit(this.mediaFile());
|
|
90
|
-
});
|
|
91
|
-
};
|
|
85
|
+
this.recorder.start(this.computedRecordingNotificationInterval());
|
|
92
86
|
this.recorder.onstart = (e) => {
|
|
93
87
|
this.recordingState.emit(this.recorder.state);
|
|
94
88
|
this.recorderStarted.emit(e);
|
|
95
|
-
startTimer();
|
|
96
89
|
};
|
|
97
90
|
this.recorder.onstop = (e) => {
|
|
98
91
|
this.recordingState.emit(this.recorder.state);
|
|
99
92
|
this.recorderStopped.emit(e);
|
|
100
|
-
console.log('new length', lengths);
|
|
101
|
-
notifSub?.unsubscribe();
|
|
102
93
|
};
|
|
103
94
|
this.recorder.onpause = (e) => {
|
|
104
95
|
this.recordingState.emit(this.recorder.state);
|
|
105
|
-
notifSub?.unsubscribe();
|
|
106
96
|
};
|
|
107
97
|
this.recorder.onresume = (e) => {
|
|
108
98
|
this.recordingState.emit(this.recorder.state);
|
|
109
|
-
startTimer();
|
|
110
99
|
};
|
|
111
100
|
this.recorder.onerror = (e) => {
|
|
112
101
|
this.recordingState.emit(this.recorder.state);
|
|
113
102
|
this.recorderErrored.emit(e);
|
|
114
|
-
notifSub?.unsubscribe();
|
|
115
103
|
};
|
|
116
104
|
};
|
|
105
|
+
this.extractImg = new Observable((sub) => this.canvas().toBlob((blob) => {
|
|
106
|
+
if (blob) {
|
|
107
|
+
this.mediaFile.set(new File([blob], this.computedFileName()));
|
|
108
|
+
sub.next(this.mediaFile());
|
|
109
|
+
sub.complete();
|
|
110
|
+
}
|
|
111
|
+
else
|
|
112
|
+
sub.error(`No ${this.subject()} file generated`);
|
|
113
|
+
}, this.computedFileType(), 1));
|
|
117
114
|
}
|
|
118
115
|
ngAfterViewInit() {
|
|
119
116
|
this.startUpWebcam();
|
|
120
117
|
}
|
|
121
118
|
ngOnDestroy() {
|
|
122
119
|
this.sub?.unsubscribe();
|
|
120
|
+
this.closeWebcam();
|
|
123
121
|
}
|
|
124
122
|
/**
|
|
125
123
|
* Start the webcam stream
|
|
126
124
|
*/
|
|
127
125
|
startUpWebcam() {
|
|
126
|
+
this.loading.set(true);
|
|
128
127
|
this.clear();
|
|
129
128
|
navigator.mediaDevices
|
|
130
129
|
.getUserMedia({ video: true, audio: this.useAudio() })
|
|
131
130
|
.then((stream) => {
|
|
132
131
|
this.streaming.set(true);
|
|
132
|
+
this.loading.set(false);
|
|
133
|
+
// stream.onaddtrack = () => this.loading.set(false);
|
|
133
134
|
this.canvas.set(document.createElement('canvas'));
|
|
134
135
|
this.canvas()?.setAttribute('width', this.width() + 'px');
|
|
135
136
|
this.canvas()?.setAttribute('height', this.height() + 'px');
|
|
@@ -147,15 +148,7 @@ export class WebcamMediaComponent {
|
|
|
147
148
|
*/
|
|
148
149
|
save() {
|
|
149
150
|
if (this.isPicture())
|
|
150
|
-
|
|
151
|
-
if (blob) {
|
|
152
|
-
this.mediaFile.set(new File([blob], this.computedFileName()));
|
|
153
|
-
sub.next(this.mediaFile());
|
|
154
|
-
sub.complete();
|
|
155
|
-
}
|
|
156
|
-
else
|
|
157
|
-
sub.error(`No ${this.subject()} file generated`);
|
|
158
|
-
}, this.computedFileType(), 1)).subscribe(() => {
|
|
151
|
+
this.extractImg.subscribe(() => {
|
|
159
152
|
this.closed.emit(this.mediaFile());
|
|
160
153
|
this.closeWebcam();
|
|
161
154
|
});
|
|
@@ -182,11 +175,18 @@ export class WebcamMediaComponent {
|
|
|
182
175
|
context.fillStyle = '#AAA';
|
|
183
176
|
context.fillRect(0, 0, this.canvas().width, this.canvas().height);
|
|
184
177
|
const data = this.canvas().toDataURL(this.computedFileType());
|
|
185
|
-
this.
|
|
178
|
+
this.mediaFile.set(undefined);
|
|
179
|
+
// this.photoSrc.set(data);
|
|
186
180
|
this.streaming.set(true);
|
|
187
181
|
this.preview.set(false);
|
|
188
182
|
}
|
|
189
183
|
}
|
|
184
|
+
retake() {
|
|
185
|
+
if (!this.stream())
|
|
186
|
+
this.startUpWebcam();
|
|
187
|
+
else
|
|
188
|
+
this.clear();
|
|
189
|
+
}
|
|
190
190
|
/**
|
|
191
191
|
* Shutdown the webcam stream
|
|
192
192
|
*/
|
|
@@ -223,8 +223,9 @@ export class WebcamMediaComponent {
|
|
|
223
223
|
return canvas;
|
|
224
224
|
});
|
|
225
225
|
context.drawImage(this.recordingVideoRefEl(), 0, 0, width, height);
|
|
226
|
-
|
|
227
|
-
this.
|
|
226
|
+
this.extractImg.subscribe();
|
|
227
|
+
// const data = this.canvas()!.toDataURL('image/png');
|
|
228
|
+
// this.photoSrc.set(data);
|
|
228
229
|
}
|
|
229
230
|
else
|
|
230
231
|
this.clear();
|
|
@@ -245,11 +246,11 @@ export class WebcamMediaComponent {
|
|
|
245
246
|
this.recorder.pause();
|
|
246
247
|
}
|
|
247
248
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.1", ngImport: i0, type: WebcamMediaComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
248
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.2.1", type: WebcamMediaComponent, isStandalone: true, selector: "lib-webcam-media", inputs: { isVideo: { classPropertyName: "isVideo", publicName: "isVideo", isSignal: true, isRequired: false, transformFunction: null }, useAudio: { classPropertyName: "useAudio", publicName: "useAudio", isSignal: true, isRequired: false, transformFunction: null }, fileName: { classPropertyName: "fileName", publicName: "fileName", isSignal: true, isRequired: false, transformFunction: null }, fileNameFactory: { classPropertyName: "fileNameFactory", publicName: "fileNameFactory", isSignal: true, isRequired: false, transformFunction: null }, fileType: { classPropertyName: "fileType", publicName: "fileType", isSignal: true, isRequired: false, transformFunction: null }, extraClass: { classPropertyName: "extraClass", publicName: "extraClass", isSignal: true, isRequired: false, transformFunction: null }, recordingNotificationInterval: { classPropertyName: "recordingNotificationInterval", publicName: "recordingNotificationInterval", isSignal: true, isRequired: false, transformFunction: null }, isBackground: { classPropertyName: "isBackground", publicName: "isBackground", isSignal: true, isRequired: false, transformFunction: null }, width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { closed: "closed", recorderStopped: "recorderStopped", recorderErrored: "recorderErrored", recorderStarted: "recorderStarted", recordingState: "recordingState", recordingChanged: "recordingChanged", width: "widthChange" }, viewQueries: [{ propertyName: "streamingVideoTemplate", first: true, predicate: ["streamVideoTemp"], descendants: true, isSignal: true }, { propertyName: "recordingVideoRef", first: true, predicate: ["recordingVideoTag"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"\" [hidden]=\"streaming() != true || isBackground()\">\n
|
|
249
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.2.1", type: WebcamMediaComponent, isStandalone: true, selector: "lib-webcam-media", inputs: { isVideo: { classPropertyName: "isVideo", publicName: "isVideo", isSignal: true, isRequired: false, transformFunction: null }, useAudio: { classPropertyName: "useAudio", publicName: "useAudio", isSignal: true, isRequired: false, transformFunction: null }, fileName: { classPropertyName: "fileName", publicName: "fileName", isSignal: true, isRequired: false, transformFunction: null }, fileNameFactory: { classPropertyName: "fileNameFactory", publicName: "fileNameFactory", isSignal: true, isRequired: false, transformFunction: null }, fileType: { classPropertyName: "fileType", publicName: "fileType", isSignal: true, isRequired: false, transformFunction: null }, extraClass: { classPropertyName: "extraClass", publicName: "extraClass", isSignal: true, isRequired: false, transformFunction: null }, recordingNotificationInterval: { classPropertyName: "recordingNotificationInterval", publicName: "recordingNotificationInterval", isSignal: true, isRequired: false, transformFunction: null }, isBackground: { classPropertyName: "isBackground", publicName: "isBackground", isSignal: true, isRequired: false, transformFunction: null }, width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { closed: "closed", recorderStopped: "recorderStopped", recorderErrored: "recorderErrored", recorderStarted: "recorderStarted", recordingState: "recordingState", recordingChanged: "recordingChanged", width: "widthChange" }, viewQueries: [{ propertyName: "streamingVideoTemplate", first: true, predicate: ["streamVideoTemp"], descendants: true, isSignal: true }, { propertyName: "recordingVideoRef", first: true, predicate: ["recordingVideoTag"], descendants: true, isSignal: true }], ngImport: i0, template: "<loader [loading]=\"loading()\">\n <div class=\"\" [hidden]=\"streaming() != true || isBackground()\">\n <ng-container *ngTemplateOutlet=\"streamVideoTemp\" />\n\n @if (!isBackground()) {\n <div class=\"wm-buttons\">\n <div class=\"row row-cols-lg-auto g-3 justify-content-center\">\n @if (!isRecording()) {\n <div>\n <app-btn [text]=\"isPicture() ? 'Take Picture' : 'Record Video'\" (mclick)=\"isPicture() ? takePicture() : startRecording()\" />\n </div>\n } @else {\n <div>\n <app-btn\n text=\"{{ isPaused() ? 'Play' : 'Pause' }} Recording\"\n (mclick)=\"pauseRecording()\"\n type=\"outline\"\n [icon]=\"isPaused() ? 'play' : 'pause'\" />\n </div>\n <div>\n <app-btn [text]=\"'Stop Recording'\" (mclick)=\"stopRecording()\" type=\"danger\" icon=\"stop\" />\n </div>\n }\n </div>\n </div>\n }\n </div>\n\n <ng-template #streamVideoTemp>\n <div class=\"wm-recording-video-cont\">\n <video #recordingVideoTag [srcObject]=\"stream()\" autoplay class=\"wm-recording-video {{ extraClass() }}\"></video>\n @if (isRecording()) {\n <div class=\"wm-recordingDot\"></div>\n }\n </div>\n </ng-template>\n\n @if (computedPreview()) {\n <div class=\"wm-preview\">\n <div>\n @if (isPicture()) {\n <img class=\"w-100\" [style.width.px]=\"width()\" [style.height.px]=\"height()\" [src]=\"mediaFileLink()\" />\n } @else {\n <video class=\"w-100\" [style.width.px]=\"width()\" [style.height.px]=\"height()\" controls autoplay [src]=\"mediaFileLink()\"></video>\n }\n </div>\n <div class=\"mt-3 row row-cols-lg-auto justify-content-center g-3\">\n <div>\n <app-btn text=\"Retake {{ subject() }}\" type=\"outline\" (mclick)=\"retake()\" />\n </div>\n <div>\n <app-btn (mclick)=\"save()\" text=\"Done\" type=\"primary\" icon=\"save\" />\n </div>\n <div>\n <app-btn (mclick)=\"cancel()\" text=\"Cancel\" type=\"danger\" icon=\"cancel\" />\n </div>\n </div>\n </div>\n }\n</loader>\n", styles: [":host{display:block}:host .wm-recording-video{width:100%}:host .wm-preview image,:host .wm-preview video{object-fit:contain}:host .wm-recording-video-cont{position:relative}@keyframes wmAnimateDot{0%{background-color:transparent}50%{background-color:#ff000086}}:host .wm-recordingDot{animation-name:wmAnimateDot;animation-duration:1s;animation-iteration-count:infinite;border-radius:5px;--dimen: 20px;width:var(--dimen);height:var(--dimen);position:absolute;top:10px;right:10px}:host .wm-buttons{margin-top:var(--space-16)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: BtnComponent, selector: "app-btn", inputs: ["formSchema", "debug", "centerBtn", "danger", "warning", "icon", "rightIcon", "leftIcon", "type", "group", "actionType", "animate", "excludeLogging", "loggingValue", "badge", "class", "customIcon", "disabled", "form", "forms", "help", "iconBtn", "loading", "mclass", "showHelpIcon", "rightCustomIcon", "leftCustomIcon", "text", "valid", "mini", "onFormInvalid"], outputs: ["mclick"] }, { kind: "component", type: LoaderComponent, selector: "loader", inputs: ["class", "text", "loading", "height"] }] }); }
|
|
249
250
|
}
|
|
250
251
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.1", ngImport: i0, type: WebcamMediaComponent, decorators: [{
|
|
251
252
|
type: Component,
|
|
252
|
-
args: [{ selector: 'lib-webcam-media', standalone: true, imports: [CommonModule, BtnComponent], template: "<div class=\"\" [hidden]=\"streaming() != true || isBackground()\">\n
|
|
253
|
+
args: [{ selector: 'lib-webcam-media', standalone: true, imports: [CommonModule, BtnComponent, LoaderComponent], template: "<loader [loading]=\"loading()\">\n <div class=\"\" [hidden]=\"streaming() != true || isBackground()\">\n <ng-container *ngTemplateOutlet=\"streamVideoTemp\" />\n\n @if (!isBackground()) {\n <div class=\"wm-buttons\">\n <div class=\"row row-cols-lg-auto g-3 justify-content-center\">\n @if (!isRecording()) {\n <div>\n <app-btn [text]=\"isPicture() ? 'Take Picture' : 'Record Video'\" (mclick)=\"isPicture() ? takePicture() : startRecording()\" />\n </div>\n } @else {\n <div>\n <app-btn\n text=\"{{ isPaused() ? 'Play' : 'Pause' }} Recording\"\n (mclick)=\"pauseRecording()\"\n type=\"outline\"\n [icon]=\"isPaused() ? 'play' : 'pause'\" />\n </div>\n <div>\n <app-btn [text]=\"'Stop Recording'\" (mclick)=\"stopRecording()\" type=\"danger\" icon=\"stop\" />\n </div>\n }\n </div>\n </div>\n }\n </div>\n\n <ng-template #streamVideoTemp>\n <div class=\"wm-recording-video-cont\">\n <video #recordingVideoTag [srcObject]=\"stream()\" autoplay class=\"wm-recording-video {{ extraClass() }}\"></video>\n @if (isRecording()) {\n <div class=\"wm-recordingDot\"></div>\n }\n </div>\n </ng-template>\n\n @if (computedPreview()) {\n <div class=\"wm-preview\">\n <div>\n @if (isPicture()) {\n <img class=\"w-100\" [style.width.px]=\"width()\" [style.height.px]=\"height()\" [src]=\"mediaFileLink()\" />\n } @else {\n <video class=\"w-100\" [style.width.px]=\"width()\" [style.height.px]=\"height()\" controls autoplay [src]=\"mediaFileLink()\"></video>\n }\n </div>\n <div class=\"mt-3 row row-cols-lg-auto justify-content-center g-3\">\n <div>\n <app-btn text=\"Retake {{ subject() }}\" type=\"outline\" (mclick)=\"retake()\" />\n </div>\n <div>\n <app-btn (mclick)=\"save()\" text=\"Done\" type=\"primary\" icon=\"save\" />\n </div>\n <div>\n <app-btn (mclick)=\"cancel()\" text=\"Cancel\" type=\"danger\" icon=\"cancel\" />\n </div>\n </div>\n </div>\n }\n</loader>\n", styles: [":host{display:block}:host .wm-recording-video{width:100%}:host .wm-preview image,:host .wm-preview video{object-fit:contain}:host .wm-recording-video-cont{position:relative}@keyframes wmAnimateDot{0%{background-color:transparent}50%{background-color:#ff000086}}:host .wm-recordingDot{animation-name:wmAnimateDot;animation-duration:1s;animation-iteration-count:infinite;border-radius:5px;--dimen: 20px;width:var(--dimen);height:var(--dimen);position:absolute;top:10px;right:10px}:host .wm-buttons{margin-top:var(--space-16)}\n"] }]
|
|
253
254
|
}], propDecorators: { closed: [{
|
|
254
255
|
type: Output
|
|
255
256
|
}], recorderStopped: [{
|
|
@@ -263,4 +264,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.1", ngImpor
|
|
|
263
264
|
}], recordingChanged: [{
|
|
264
265
|
type: Output
|
|
265
266
|
}] } });
|
|
266
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViY2FtLW1lZGlhLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2V0cy1mZS1uZy1zZGsvc3JjL2xpYi9TaGFyZWQvY29tcG9uZW50cy93ZWJjYW0tbWVkaWEvd2ViY2FtLW1lZGlhLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2V0cy1mZS1uZy1zZGsvc3JjL2xpYi9TaGFyZWQvY29tcG9uZW50cy93ZWJjYW0tbWVkaWEvd2ViY2FtLW1lZGlhLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBRUwsU0FBUyxFQUVULFlBQVksRUFDWixNQUFNLEVBRU4sUUFBUSxFQUNSLEtBQUssRUFDTCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDcEQsT0FBTyxFQUEwQixNQUFNLEVBQXVCLEdBQUcsRUFBRSxVQUFVLEVBQW9CLEdBQUcsRUFBRSxLQUFLLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUgsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDRCQUE0QixDQUFDOzs7QUFTdEQsTUFBTSxPQUFPLG9CQUFvQjtJQVBqQztRQVFZLFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBQ2xDLG9CQUFlLEdBQUcsSUFBSSxZQUFZLEVBQVMsQ0FBQztRQUM1QyxvQkFBZSxHQUFHLElBQUksWUFBWSxFQUFTLENBQUM7UUFDNUMsb0JBQWUsR0FBRyxJQUFJLFlBQVksRUFBUyxDQUFDO1FBQzVDLG1CQUFjLEdBQUcsSUFBSSxZQUFZLEVBQWtCLENBQUM7UUFDcEQscUJBQWdCLEdBQUcsSUFBSSxZQUFZLEVBQW9CLENBQUM7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QkFDRSxrQkFBa0IsY0FDaEIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLFlBQVksQ0FBQzs4QkFLM0IsTUFBTTtzQkFBZixNQUFNO2dCQUNHLGVBQWU7c0JBQXhCLE1BQU07Z0JBQ0csZUFBZTtzQkFBeEIsTUFBTTtnQkFDRyxlQUFlO3NCQUF4QixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU07Z0JBQ0csZ0JBQWdCO3NCQUF6QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgT3V0cHV0LFxuICBUZW1wbGF0ZVJlZixcbiAgY29tcHV0ZWQsXG4gIGlucHV0LFxuICBtb2RlbCxcbiAgc2lnbmFsLFxuICB2aWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQnRuQ29tcG9uZW50IH0gZnJvbSAnLi4vYnRuL2J0bi5jb21wb25lbnQnO1xuaW1wb3J0IHsgZGVib3VuY2UsIGRlYm91bmNlVGltZSwgZmlsdGVyLCBmcm9tRXZlbnQsIGludGVydmFsLCBtYXAsIE9ic2VydmFibGUsIG9mLCBTdWJzY3JpcHRpb24sIHRhcCwgdGltZXIgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRvU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItd2ViY2FtLW1lZGlhJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgQnRuQ29tcG9uZW50XSxcbiAgdGVtcGxhdGVVcmw6ICcuL3dlYmNhbS1tZWRpYS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi93ZWJjYW0tbWVkaWEuY29tcG9uZW50LnNjc3MnLFxufSlcbmV4cG9ydCBjbGFzcyBXZWJjYW1NZWRpYUNvbXBvbmVudCB7XG4gIEBPdXRwdXQoKSBjbG9zZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEZpbGU+KCk7XG4gIEBPdXRwdXQoKSByZWNvcmRlclN0b3BwZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEV2ZW50PigpO1xuICBAT3V0cHV0KCkgcmVjb3JkZXJFcnJvcmVkID0gbmV3IEV2ZW50RW1pdHRlcjxFdmVudD4oKTtcbiAgQE91dHB1dCgpIHJlY29yZGVyU3RhcnRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8RXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSByZWNvcmRpbmdTdGF0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8UmVjb3JkaW5nU3RhdGU+KCk7XG4gIEBPdXRwdXQoKSByZWNvcmRpbmdDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxGaWxlIHwgdW5kZWZpbmVkPigpO1xuXG4gIGlzVmlkZW8gPSBpbnB1dDxib29sZWFuPigpO1xuICB1c2VBdWRpbyA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIGZpbGVOYW1lID0gaW5wdXQ8c3RyaW5nPigpO1xuICBmaWxlTmFtZUZhY3RvcnkgPSBpbnB1dDwoY29tcDogV2ViY2FtTWVkaWFDb21wb25lbnQpID0+IHN0cmluZz4oKTtcbiAgZmlsZVR5cGUgPSBpbnB1dDxzdHJpbmc+KCk7XG4gIGV4dHJhQ2xhc3MgPSBpbnB1dDxzdHJpbmc+KCk7XG4gIC8qKlxuICAgKiBTZWNvbmRzXG4gICAqL1xuICByZWNvcmRpbmdOb3RpZmljYXRpb25JbnRlcnZhbCA9IGlucHV0PG51bWJlcj4oNSk7XG4gIGlzQmFja2dyb3VuZCA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcblxuICBjb21wdXRlZFJlY29yZGluZ05vdGlmaWNhdGlvbkludGVydmFsID0gY29tcHV0ZWQ8bnVtYmVyPigoKSA9PiAodGhpcy5yZWNvcmRpbmdOb3RpZmljYXRpb25JbnRlcnZhbCgpIHx8IDUpICogMTAwMCk7XG4gIGlzUGljdHVyZSA9IGNvbXB1dGVkKCgpID0+ICF0aGlzLmlzVmlkZW8oKSk7XG5cbiAgc3ViamVjdCA9IGNvbXB1dGVkKCgpID0+ICh0aGlzLmlzUGljdHVyZSgpID8gJ0ltYWdlJyA6ICdWaWRlbycpKTtcblxuICBpc1BhdXNlZCA9IHRvU2lnbmFsKHRoaXMucmVjb3JkaW5nU3RhdGUucGlwZShtYXAoKHIpID0+IHIgPT0gJ3BhdXNlZCcpKSk7XG5cbiAgY29tcHV0ZWRGaWxlVHlwZSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBmdCA9IHRoaXMuZmlsZVR5cGUoKSxcbiAgICAgIGlzcCA9IHRoaXMuaXNQaWN0dXJlKCk7XG4gICAgcmV0dXJuIGZ0IHx8IChpc3AgPyAnaW1hZ2UvanBlZycgOiAndmlkZW8vbXA0Jyk7XG4gIH0pO1xuICBjb21wdXRlZEZpbGVFeHRlbnNpb24gPSBjb21wdXRlZCgoKSA9PiB0aGlzLmNvbXB1dGVkRmlsZVR5cGUoKT8uc3BsaXQoJy8nKVsxXSk7XG4gIGNvbXB1dGVkRmlsZU5hbWUgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgZmYgPSB0aGlzLmZpbGVOYW1lRmFjdG9yeSgpLFxuICAgICAgZm4gPSB0aGlzLmZpbGVOYW1lKCkgfHwgZmY/Lih0aGlzKSxcbiAgICAgIGZ4ID0gdGhpcy5jb21wdXRlZEZpbGVFeHRlbnNpb24oKSxcbiAgICAgIHN1YmplY3QgPSB0aGlzLnN1YmplY3QoKTtcbiAgICByZXR1cm4gZm4/LmluY2x1ZGVzKCcuJyArIGZ4KSA/IGZuIDogYCR7Zm4gfHwgc3ViamVjdH0uJHtmeH1gO1xuICB9KTtcblxuICBzdHJlYW1pbmdWaWRlb1RlbXBsYXRlID0gdmlld0NoaWxkPFRlbXBsYXRlUmVmPGFueT4+KCdzdHJlYW1WaWRlb1RlbXAnKTtcbiAgcmVjb3JkaW5nVmlkZW9SZWYgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZjxIVE1MVmlkZW9FbGVtZW50Pj4oJ3JlY29yZGluZ1ZpZGVvVGFnJyk7XG4gIHJlY29yZGluZ1ZpZGVvUmVmRWwgPSBjb21wdXRlZCgoKSA9PiB0aGlzLnJlY29yZGluZ1ZpZGVvUmVmKCk/Lm5hdGl2ZUVsZW1lbnQpO1xuXG4gIHN0cmVhbWluZyA9IHNpZ25hbDxib29sZWFuIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcmV2aWV3ID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgY29tcHV0ZWRQcmV2aWV3ID0gY29tcHV0ZWQ8Ym9vbGVhbj4oKCkgPT4gIXRoaXMuaXNCYWNrZ3JvdW5kKCkgJiYgdGhpcy5wcmV2aWV3KCkpO1xuXG4gIC8vIFRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBjYXB0dXJlZCBwaG90by4gV2Ugd2lsbCBzZXQgdGhlXG4gIC8vIHdpZHRoIHRvIHRoZSB2YWx1ZSBkZWZpbmVkIGhlcmUsIGJ1dCB0aGUgaGVpZ2h0IHdpbGwgYmVcbiAgLy8gY2FsY3VsYXRlZCBiYXNlZCBvbiB0aGUgYXNwZWN0IHJhdGlvIG9mIHRoZSBpbnB1dCBzdHJlYW0uXG5cbiAgd2lkdGggPSBtb2RlbDxudW1iZXI+KDEwODApOyAvLyBXZSB3aWxsIHNjYWxlIHRoZSBwaG90byB3aWR0aCB0byB0aGlzXG4gIGhlaWdodCA9IGNvbXB1dGVkPG51bWJlcj4oKCkgPT4ge1xuICAgIGNvbnN0IHdpZHRoID0gdGhpcy53aWR0aCgpO1xuICAgIHJldHVybiB3aWR0aCAvICg0IC8gMyk7XG4gIH0pOyAvLyBUaGlzIHdpbGwgYmUgY29tcHV0ZWQgYmFzZWQgb24gdGhlIGlucHV0IHN0cmVhbVxuXG4gIC8vIFRoZSB2YXJpb3VzIEhUTUwgZWxlbWVudHMgd2UgbmVlZCB0byBjb25maWd1cmUgb3IgY29udHJvbC4gVGhlc2VcbiAgLy8gd2lsbCBiZSBzZXQgYnkgdGhlIHN0YXJ0dXAoKSBmdW5jdGlvbi5cblxuICBwcm90ZWN0ZWQgY2FudmFzID0gc2lnbmFsPEhUTUxDYW52YXNFbGVtZW50IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBtZWRpYUZpbGUgPSBzaWduYWw8RmlsZSB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcGhvdG9TcmMgPSBzaWduYWw8c3RyaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICB2aWRlb1NyYyA9IHNpZ25hbDxzdHJpbmcgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG5cbiAgc3RyZWFtID0gc2lnbmFsPE1lZGlhU3RyZWFtPih1bmRlZmluZWQpO1xuXG4gIHN1YjogU3Vic2NyaXB0aW9uO1xuICByZWNvcmRlcjogTWVkaWFSZWNvcmRlcjtcbiAgaXNSZWNvcmRpbmcgPSB0b1NpZ25hbDxib29sZWFuPih0aGlzLnJlY29yZGluZ1N0YXRlLnBpcGUobWFwKChyKSA9PiByID09ICdyZWNvcmRpbmcnIHx8IHIgPT0gJ3BhdXNlZCcpKSk7XG4gIHJlY29yZGVkQmxvYnM6IEJsb2JbXSA9IFtdO1xuXG4gIHJlY29yZGVkVGltZSA9IHNpZ25hbDxudW1iZXI+KDApO1xuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnN0YXJ0VXBXZWJjYW0oKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3ViPy51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0IHRoZSB3ZWJjYW0gc3RyZWFtXG4gICAqL1xuICBzdGFydFVwV2ViY2FtKCkge1xuICAgIHRoaXMuY2xlYXIoKTtcbiAgICBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzXG4gICAgICAuZ2V0VXNlck1lZGlhKHsgdmlkZW86IHRydWUsIGF1ZGlvOiB0aGlzLnVzZUF1ZGlvKCkgfSlcbiAgICAgIC50aGVuKChzdHJlYW0pID0+IHtcbiAgICAgICAgdGhpcy5zdHJlYW1pbmcuc2V0KHRydWUpO1xuICAgICAgICB0aGlzLmNhbnZhcy5zZXQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJykpO1xuICAgICAgICB0aGlzLmNhbnZhcygpPy5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgdGhpcy53aWR0aCgpICsgJ3B4Jyk7XG4gICAgICAgIHRoaXMuY2FudmFzKCk/LnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgdGhpcy5oZWlnaHQoKSArICdweCcpO1xuICAgICAgICB0aGlzLnN0cmVhbS5zZXQoc3RyZWFtKTtcbiAgICAgICAgLy8gZGVidWdnZXI7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgQW4gZXJyb3Igb2NjdXJyZWQ6YCwgZXJyKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEluZGljYXRlIHRoYXQgdGhlIHVzZXIgaXMgZG9uZSB3aXRoIHRoZSB3ZWJjYW0gY29tcG9uZW50LlxuICAgKlxuICAgKiBBbnkgbWVkaWEgb2J0YWluZWQgd2lsbCBiZSBlbWl0dGVkXG4gICAqL1xuICBzYXZlKCkge1xuICAgIGlmICh0aGlzLmlzUGljdHVyZSgpKVxuICAgICAgbmV3IE9ic2VydmFibGU8RmlsZT4oKHN1YikgPT5cbiAgICAgICAgdGhpcy5jYW52YXMoKSEudG9CbG9iKFxuICAgICAgICAgIChibG9iKSA9PiB7XG4gICAgICAgICAgICBpZiAoYmxvYikge1xuICAgICAgICAgICAgICB0aGlzLm1lZGlhRmlsZS5zZXQobmV3IEZpbGUoW2Jsb2JdLCB0aGlzLmNvbXB1dGVkRmlsZU5hbWUoKSkpO1xuICAgICAgICAgICAgICBzdWIubmV4dCh0aGlzLm1lZGlhRmlsZSgpKTtcbiAgICAgICAgICAgICAgc3ViLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICB9IGVsc2Ugc3ViLmVycm9yKGBObyAke3RoaXMuc3ViamVjdCgpfSBmaWxlIGdlbmVyYXRlZGApO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgdGhpcy5jb21wdXRlZEZpbGVUeXBlKCksXG4gICAgICAgICAgMSxcbiAgICAgICAgKSxcbiAgICAgICkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5jbG9zZWQuZW1pdCh0aGlzLm1lZGlhRmlsZSgpKTtcbiAgICAgICAgdGhpcy5jbG9zZVdlYmNhbSgpO1xuICAgICAgfSk7XG4gICAgZWxzZSB7IFxuICAgICAgdGhpcy5jbG9zZWQuZW1pdCh0aGlzLm1lZGlhRmlsZSgpKTtcbiAgICAgIHRoaXMuY2xvc2VXZWJjYW0oKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5kaWNhdGUgdGhhdCB0aGUgdXNlciBpcyBkb25lIHdpdGggdGhlIHdlYmNhbSBjb21wb25lbnQuXG4gICAqXG4gICAqIEFueSBtZWRpYSBvYnRhaW5lZCB3aWxsIGJlIGRlbGV0ZWRcbiAgICovXG4gIGNhbmNlbCgpIHtcbiAgICB0aGlzLmNsb3NlZC5lbWl0KG51bGwpO1xuICAgIHRoaXMuY2xvc2VXZWJjYW0oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciB0aGUgbWVkaWEgdGFrZW4gYW5kIGNsb3NlIHByZXZpZXdcbiAgICovXG4gIGNsZWFyKCkge1xuICAgIGlmICh0aGlzLmNhbnZhcygpKSB7XG4gICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5jYW52YXMoKT8uZ2V0Q29udGV4dCgnMmQnKTtcbiAgICAgIGNvbnRleHQhLmZpbGxTdHlsZSA9ICcjQUFBJztcbiAgICAgIGNvbnRleHQhLmZpbGxSZWN0KDAsIDAsIHRoaXMuY2FudmFzKCkhLndpZHRoLCB0aGlzLmNhbnZhcygpIS5oZWlnaHQpO1xuXG4gICAgICBjb25zdCBkYXRhID0gdGhpcy5jYW52YXMoKSEudG9EYXRhVVJMKHRoaXMuY29tcHV0ZWRGaWxlVHlwZSgpKTtcbiAgICAgIHRoaXMucGhvdG9TcmMuc2V0KGRhdGEpO1xuICAgICAgdGhpcy5zdHJlYW1pbmcuc2V0KHRydWUpO1xuICAgICAgdGhpcy5wcmV2aWV3LnNldChmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNodXRkb3duIHRoZSB3ZWJjYW0gc3RyZWFtXG4gICAqL1xuICBjbG9zZVdlYmNhbSgpIHtcbiAgICB0aGlzLnN0cmVhbSgpXG4gICAgICA/LmdldFRyYWNrcygpXG4gICAgICAuZm9yRWFjaCgoeCkgPT4geC5zdG9wKCkpO1xuICAgIHRoaXMuc3RyZWFtLnNldCh1bmRlZmluZWQpO1xuICAgIHRoaXMuc3RyZWFtaW5nLnNldCh1bmRlZmluZWQpO1xuICAgIC8vIHRoaXMuc3RyZWFtLnNldCh0aGlzLnN0cmVhbSgpPy5nZXRUcmFja3NbMF0uc3RvcCgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXB0dXJlIGEgcGhvdG8gYnkgZmV0Y2hpbmcgdGhlIGN1cnJlbnQgY29udGVudHMgb2YgdGhlIHZpZGVvXG4gICAqIGFuZCBkcmF3aW5nIGl0IGludG8gYSBjYW52YXMsIHRoZW4gY29udmVydGluZyB0aGF0IHRvIGEgUE5HXG4gICAqIGZvcm1hdCBkYXRhIFVSTC5cbiAgICpcbiAgICogQnkgZHJhd2luZyBpdCBvbiBhbiBvZmZzY3JlZW4gY2FudmFzIGFuZCB0aGVuXG4gICAqIGRyYXdpbmcgdGhhdCB0byB0aGUgc2NyZWVuLCB3ZSBjYW4gY2hhbmdlIGl0cyBzaXplIGFuZC9vciBhcHBseVxuICAgKiBvdGhlciBjaGFuZ2VzIGJlZm9yZSBkcmF3aW5nIGl0LlxuICAgKi9cbiAgdGFrZVBpY3R1cmUoKSB7XG4gICAgaWYgKCF0aGlzLmlzUGljdHVyZSgpKSByZXR1cm47XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMuY2FudmFzKCkhLmdldENvbnRleHQoJzJkJyksXG4gICAgICB3aWR0aCA9IHRoaXMud2lkdGgoKSxcbiAgICAgIGhlaWdodCA9IHRoaXMuaGVpZ2h0KCk7XG4gICAgaWYgKHdpZHRoICYmIGhlaWdodCAmJiBjb250ZXh0KSB7XG4gICAgICB0aGlzLmNhbnZhcy51cGRhdGUoKGNhbnZhcykgPT4ge1xuICAgICAgICBpZiAoY2FudmFzKSBjYW52YXMud2lkdGggPSB3aWR0aDtcbiAgICAgICAgcmV0dXJuIGNhbnZhcztcbiAgICAgIH0pO1xuICAgICAgdGhpcy5jYW52YXMudXBkYXRlKChjYW52YXMpID0+IHtcbiAgICAgICAgaWYgKGNhbnZhcykgY2FudmFzLmhlaWdodCA9IGhlaWdodDtcbiAgICAgICAgcmV0dXJuIGNhbnZhcztcbiAgICAgIH0pO1xuICAgICAgY29udGV4dC5kcmF3SW1hZ2UodGhpcy5yZWNvcmRpbmdWaWRlb1JlZkVsKCkhLCAwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcblxuICAgICAgY29uc3QgZGF0YSA9IHRoaXMuY2FudmFzKCkhLnRvRGF0YVVSTCgnaW1hZ2UvcG5nJyk7XG4gICAgICB0aGlzLnBob3RvU3JjLnNldChkYXRhKTtcbiAgICB9IGVsc2UgdGhpcy5jbGVhcigpO1xuXG4gICAgdGhpcy5zdHJlYW1pbmcuc2V0KGZhbHNlKTtcbiAgICB0aGlzLnByZXZpZXcuc2V0KHRydWUpO1xuICB9XG5cbiAgc3RhcnRSZWNvcmRpbmcgPSAoc3RyZWFtID0gdGhpcy5zdHJlYW0oKSkgPT4ge1xuICAgIGlmICghdGhpcy5pc1ZpZGVvKCkpIHJldHVybjtcbiAgICB0aGlzLnJlY29yZGVyID0gbmV3IE1lZGlhUmVjb3JkZXIoc3RyZWFtKTtcblxuICAgIHRoaXMucmVjb3JkZWRCbG9icyA9IFtdO1xuICAgIHRoaXMucmVjb3JkZWRUaW1lLnNldCgwKTtcbiAgICBjb25zdCBsZW5ndGhzOiBbbnVtYmVyLCBudW1iZXJdW10gPSBbXTtcbiAgICB0aGlzLnJlY29yZGVyLm9uZGF0YWF2YWlsYWJsZSA9IChldmVudCkgPT4ge1xuICAgICAgdGhpcy5yZWNvcmRlZEJsb2JzLnB1c2goZXZlbnQuZGF0YSk7XG4gICAgICB0aGlzLm1lZGlhRmlsZS5zZXQobmV3IEZpbGUodGhpcy5yZWNvcmRlZEJsb2JzLCB0aGlzLmNvbXB1dGVkRmlsZU5hbWUoKSwgeyB0eXBlOiB0aGlzLmNvbXB1dGVkRmlsZVR5cGUoKSB9KSk7XG4gICAgICBsZW5ndGhzLnB1c2goW3RoaXMubWVkaWFGaWxlKCkuc2l6ZSwgZXZlbnQuZGF0YS5zaXplXSk7XG4gICAgfTtcbiAgICAvLyB0aGlzLnJlY29yZGVyLm9uZGF0YWF2YWlsYWJsZSA9IChldmVudCkgPT4ge1xuICAgIC8vICAgdGhpcy5yZWNvcmRlZEJsb2JzID0gW2V2ZW50LmRhdGFdO1xuICAgIC8vICAgbGVuZ3Rocy5wdXNoKGV2ZW50LmRhdGEuc2l6ZSk7XG4gICAgLy8gfTtcbiAgICAvLyB0aGlzLnJlY29yZGVyLm9uZGF0YWF2YWlsYWJsZSA9IChldmVudCkgPT4gdGhpcy5yZWNvcmRlZEJsb2JzLnB1c2goZXZlbnQuZGF0YSk7XG5cbiAgICB0aGlzLnJlY29yZGVyLnN0YXJ0KCk7XG4gICAgbGV0IG5vdGlmU3ViOiBTdWJzY3JpcHRpb247XG4gICAgY29uc3Qgc3RhcnRUaW1lciA9ICgpID0+IHtcbiAgICAgIGxldCBsYXN0RGF0ZVRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgbm90aWZTdWIgPSB0aW1lcigxMDAwLCAxMDAwKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICB0YXAoKCkgPT4gdGhpcy5yZWNvcmRlZFRpbWUudXBkYXRlKCh0KSA9PiAodCArPSAxKSkpLFxuICAgICAgICAgIHRhcCgoKSA9PiBjb25zb2xlLmxvZyhEYXRlLm5vdygpLCB0aGlzLmNvbXB1dGVkUmVjb3JkaW5nTm90aWZpY2F0aW9uSW50ZXJ2YWwoKSwgdGhpcy5yZWNvcmRpbmdOb3RpZmljYXRpb25JbnRlcnZhbCgpKSksXG4gICAgICAgICAgZmlsdGVyKCgpID0+IERhdGUubm93KCkgLSBsYXN0RGF0ZVRpbWUgPiB0aGlzLmNvbXB1dGVkUmVjb3JkaW5nTm90aWZpY2F0aW9uSW50ZXJ2YWwoKSksXG4gICAgICAgICAgdGFwKCgpID0+IHRoaXMucmVjb3JkZXIucmVxdWVzdERhdGEoKSksXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgocikgPT4ge1xuICAgICAgICAgIGxhc3REYXRlVGltZSA9IERhdGUubm93KCk7IFxuICAgICAgICAgIHRoaXMucmVjb3JkaW5nQ2hhbmdlZC5lbWl0KHRoaXMubWVkaWFGaWxlKCkpO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHRoaXMucmVjb3JkZXIub25zdGFydCA9IChlKSA9PiB7XG4gICAgICB0aGlzLnJlY29yZGluZ1N0YXRlLmVtaXQodGhpcy5yZWNvcmRlci5zdGF0ZSk7XG4gICAgICB0aGlzLnJlY29yZGVyU3RhcnRlZC5lbWl0KGUpO1xuICAgICAgc3RhcnRUaW1lcigpO1xuICAgIH07XG4gICAgdGhpcy5yZWNvcmRlci5vbnN0b3AgPSAoZSkgPT4ge1xuICAgICAgdGhpcy5yZWNvcmRpbmdTdGF0ZS5lbWl0KHRoaXMucmVjb3JkZXIuc3RhdGUpO1xuICAgICAgdGhpcy5yZWNvcmRlclN0b3BwZWQuZW1pdChlKTtcbiAgICAgIGNvbnNvbGUubG9nKCduZXcgbGVuZ3RoJywgbGVuZ3Rocyk7XG4gICAgICBub3RpZlN1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICB9O1xuICAgIHRoaXMucmVjb3JkZXIub25wYXVzZSA9IChlKSA9PiB7XG4gICAgICB0aGlzLnJlY29yZGluZ1N0YXRlLmVtaXQodGhpcy5yZWNvcmRlci5zdGF0ZSk7XG4gICAgICBub3RpZlN1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICB9O1xuICAgIHRoaXMucmVjb3JkZXIub25yZXN1bWUgPSAoZSkgPT4ge1xuICAgICAgdGhpcy5yZWNvcmRpbmdTdGF0ZS5lbWl0KHRoaXMucmVjb3JkZXIuc3RhdGUpO1xuICAgICAgc3RhcnRUaW1lcigpO1xuICAgIH07XG4gICAgdGhpcy5yZWNvcmRlci5vbmVycm9yID0gKGUpID0+IHtcbiAgICAgIHRoaXMucmVjb3JkaW5nU3RhdGUuZW1pdCh0aGlzLnJlY29yZGVyLnN0YXRlKTtcbiAgICAgIHRoaXMucmVjb3JkZXJFcnJvcmVkLmVtaXQoZSk7XG4gICAgICBub3RpZlN1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICB9O1xuICB9O1xuXG4gIHN0b3BSZWNvcmRpbmcoKSB7XG4gICAgaWYgKHRoaXMucmVjb3JkZXIuc3RhdGUgPT09ICdyZWNvcmRpbmcnKSB0aGlzLnJlY29yZGVyLnN0b3AoKTtcblxuICAgIHRoaXMucHJldmlldy5zZXQodHJ1ZSk7XG4gICAgdGhpcy5zdHJlYW1pbmcuc2V0KGZhbHNlKTtcbiAgfVxuXG4gIHBhdXNlUmVjb3JkaW5nKCkge1xuICAgIC8vIGRlYnVnZ2VyO1xuICAgIGlmICh0aGlzLnJlY29yZGVyLnN0YXRlID09PSAncGF1c2VkJykgdGhpcy5yZWNvcmRlci5yZXN1bWUoKTtcbiAgICBlbHNlIHRoaXMucmVjb3JkZXIucGF1c2UoKTtcbiAgfVxuIFxufVxuIiwiPGRpdiBjbGFzcz1cIlwiIFtoaWRkZW5dPVwic3RyZWFtaW5nKCkgIT0gdHJ1ZSB8fCBpc0JhY2tncm91bmQoKVwiPlxuICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic3RyZWFtVmlkZW9UZW1wXCIgLz5cblxuICBAaWYgKCFpc0JhY2tncm91bmQoKSkge1xuICAgIDxkaXYgY2xhc3M9XCJ3bS1idXR0b25zXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiICByb3cgcm93LWNvbHMtbGctYXV0byBnLTMganVzdGlmeS1jb250ZW50LXN0YXJ0XCI+XG4gICAgICAgIEBpZiAoIWlzUmVjb3JkaW5nKCkpIHtcbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGFwcC1idG4gW3RleHRdPVwiaXNQaWN0dXJlKCkgPyAnVGFrZSBQaWN0dXJlJyA6ICdSZWNvcmQgVmlkZW8nXCIgKG1jbGljayk9XCJpc1BpY3R1cmUoKSA/IHRha2VQaWN0dXJlKCkgOiBzdGFydFJlY29yZGluZygpXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxhcHAtYnRuIHRleHQ9XCJ7e2lzUGF1c2VkKCk/J1BsYXknOiAnUGF1c2UnfX0gUmVjb3JkaW5nXCIgKG1jbGljayk9XCJwYXVzZVJlY29yZGluZygpXCIgdHlwZT1cIm91dGxpbmVcIiBbaWNvbl09XCJpc1BhdXNlZCgpPydwbGF5JzoncGF1c2UnXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGFwcC1idG4gW3RleHRdPVwiJ1N0b3AgUmVjb3JkaW5nJ1wiIChtY2xpY2spPVwic3RvcFJlY29yZGluZygpXCIgdHlwZT1cImRhbmdlclwiIGljb249XCJzdG9wXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIH1cbjwvZGl2PlxuXG48bmctdGVtcGxhdGUgI3N0cmVhbVZpZGVvVGVtcD5cbiAgPGRpdiBjbGFzcz1cIndtLXJlY29yZGluZy12aWRlby1jb250XCI+XG4gICAgPHZpZGVvICNyZWNvcmRpbmdWaWRlb1RhZyBbc3JjT2JqZWN0XT1cInN0cmVhbSgpXCIgYXV0b3BsYXkgY2xhc3M9XCJ3bS1yZWNvcmRpbmctdmlkZW8ge3sgZXh0cmFDbGFzcygpIH19XCI+PC92aWRlbz5cbiAgICBAaWYgKGlzUmVjb3JkaW5nKCkpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJ3bS1yZWNvcmRpbmdEb3RcIj48L2Rpdj5cbiAgICB9XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuQGlmIChjb21wdXRlZFByZXZpZXcoKSkge1xuICA8ZGl2IGNsYXNzPVwid20tcHJldmlld1wiPlxuICAgIDxkaXY+XG4gICAgICBAaWYgKGlzUGljdHVyZSgpKSB7XG4gICAgICAgIDxpbWcgY2xhc3M9XCJ3LTEwMFwiIFtzdHlsZS53aWR0aC5weF09XCJ3aWR0aCgpXCIgW3N0eWxlLmhlaWdodC5weF09XCJoZWlnaHQoKVwiIFtzcmNdPVwicGhvdG9TcmMoKVwiIC8+XG4gICAgICB9IEBlbHNlIHtcbiAgICAgICAgPHZpZGVvIGNsYXNzPVwidy0xMDBcIiBbc3R5bGUud2lkdGgucHhdPVwid2lkdGgoKVwiIFtzdHlsZS5oZWlnaHQucHhdPVwiaGVpZ2h0KClcIiBbc3JjXT1cIm1lZGlhRmlsZSgpXCI+PC92aWRlbz5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibXQtMyByb3cgcm93LWNvbHMtbGctYXV0byBnLTNcIj5cbiAgICAgIDxkaXY+XG4gICAgICAgIDxhcHAtYnRuIHRleHQ9XCJSZXRha2Uge3sgc3ViamVjdCgpIH19XCIgdHlwZT1cIm91dGxpbmVcIiAobWNsaWNrKT1cImNsZWFyKClcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2PlxuICAgICAgICA8YXBwLWJ0biAobWNsaWNrKT1cInNhdmUoKVwiIHRleHQ9XCJEb25lXCIgdHlwZT1cInByaW1hcnlcIiBpY29uPVwic2F2ZVwiIC8+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXY+XG4gICAgICAgIDxhcHAtYnRuIChtY2xpY2spPVwiY2FuY2VsKClcIiB0ZXh0PVwiQ2FuY2VsXCIgdHlwZT1cImRhbmdlclwiIGljb249XCJjYW5jZWxcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxufVxuIl19
|
|
267
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViY2FtLW1lZGlhLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2V0cy1mZS1uZy1zZGsvc3JjL2xpYi9TaGFyZWQvY29tcG9uZW50cy93ZWJjYW0tbWVkaWEvd2ViY2FtLW1lZGlhLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2V0cy1mZS1uZy1zZGsvc3JjL2xpYi9TaGFyZWQvY29tcG9uZW50cy93ZWJjYW0tbWVkaWEvd2ViY2FtLW1lZGlhLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBRUwsU0FBUyxFQUVULFlBQVksRUFDWixNQUFNLEVBRU4sUUFBUSxFQUNSLEtBQUssRUFDTCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDcEQsT0FBTyxFQUF1RCxHQUFHLEVBQUUsVUFBVSxFQUFnQyxNQUFNLE1BQU0sQ0FBQztBQUMxSCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDRCQUE0QixDQUFDOzs7QUFTN0QsTUFBTSxPQUFPLG9CQUFvQjtJQVBqQztRQVFZLFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBQ2xDLG9CQUFlLEdBQUcsSUFBSSxZQUFZLEVBQVMsQ0FBQztRQUM1QyxvQkFBZSxHQUFHLElBQUksWUFBWSxFQUFTLENBQUM7UUFDNUMsb0JBQWUsR0FBRyxJQUFJLFlBQVksRUFBUyxDQUFDO1FBQzVDLG1CQUFjLEdBQUcsSUFBSSxZQUFZLEVBQWtCLENBQUM7UUFDcEQscUJBQWdCLEdBQUcsSUFBSSxZQUFZ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LENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN6QixDQUFDO0lBMkNELGFBQWE7UUFDWCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxLQUFLLFdBQVc7WUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBRTlELElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFRCxjQUFjO1FBQ1osWUFBWTtRQUNaLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEtBQUssUUFBUTtZQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7O1lBQ3hELElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDN0IsQ0FBQzs4R0FoUVUsb0JBQW9CO2tHQUFwQixvQkFBb0Isd3lEQzFCakMsZ3RFQTREQSxza0JEdENZLFlBQVksc01BQUUsWUFBWSw2YkFBRSxlQUFlOzsyRkFJMUMsb0JBQW9CO2tCQVBoQyxTQUFTOytCQUNFLGtCQUFrQixjQUNoQixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsWUFBWSxFQUFFLGVBQWUsQ0FBQzs4QkFLNUMsTUFBTTtzQkFBZixNQUFNO2dCQUNHLGVBQWU7c0JBQXhCLE1BQU07Z0JBQ0csZUFBZTtzQkFBeEIsTUFBTTtnQkFDRyxlQUFlO3NCQUF4QixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU07Z0JBQ0csZ0JBQWdCO3NCQUF6QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgT3V0cHV0LFxuICBUZW1wbGF0ZVJlZixcbiAgY29tcHV0ZWQsXG4gIGlucHV0LFxuICBtb2RlbCxcbiAgc2lnbmFsLFxuICB2aWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQnRuQ29tcG9uZW50IH0gZnJvbSAnLi4vYnRuL2J0bi5jb21wb25lbnQnO1xuaW1wb3J0IHsgZGVib3VuY2UsIGRlYm91bmNlVGltZSwgZmlsdGVyLCBmcm9tRXZlbnQsIGludGVydmFsLCBtYXAsIE9ic2VydmFibGUsIG9mLCBTdWJzY3JpcHRpb24sIHRhcCwgdGltZXIgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRvU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgTG9hZGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vbG9hZGVyL2xvYWRlci5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItd2ViY2FtLW1lZGlhJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgQnRuQ29tcG9uZW50LCBMb2FkZXJDb21wb25lbnRdLFxuICB0ZW1wbGF0ZVVybDogJy4vd2ViY2FtLW1lZGlhLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL3dlYmNhbS1tZWRpYS5jb21wb25lbnQuc2NzcycsXG59KVxuZXhwb3J0IGNsYXNzIFdlYmNhbU1lZGlhQ29tcG9uZW50IHtcbiAgQE91dHB1dCgpIGNsb3NlZCA9IG5ldyBFdmVudEVtaXR0ZXI8RmlsZT4oKTtcbiAgQE91dHB1dCgpIHJlY29yZGVyU3RvcHBlZCA9IG5ldyBFdmVudEVtaXR0ZXI8RXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSByZWNvcmRlckVycm9yZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEV2ZW50PigpO1xuICBAT3V0cHV0KCkgcmVjb3JkZXJTdGFydGVkID0gbmV3IEV2ZW50RW1pdHRlcjxFdmVudD4oKTtcbiAgQE91dHB1dCgpIHJlY29yZGluZ1N0YXRlID0gbmV3IEV2ZW50RW1pdHRlcjxSZWNvcmRpbmdTdGF0ZT4oKTtcbiAgQE91dHB1dCgpIHJlY29yZGluZ0NoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEZpbGUgfCB1bmRlZmluZWQ+KCk7XG5cbiAgaXNWaWRlbyA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHVzZUF1ZGlvID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgZmlsZU5hbWUgPSBpbnB1dDxzdHJpbmc+KCk7XG4gIGZpbGVOYW1lRmFjdG9yeSA9IGlucHV0PChjb21wOiBXZWJjYW1NZWRpYUNvbXBvbmVudCkgPT4gc3RyaW5nPigpO1xuICBmaWxlVHlwZSA9IGlucHV0PHN0cmluZz4oKTtcbiAgZXh0cmFDbGFzcyA9IGlucHV0PHN0cmluZz4oKTtcbiAgLyoqXG4gICAqIFNlY29uZHNcbiAgICovXG4gIHJlY29yZGluZ05vdGlmaWNhdGlvbkludGVydmFsID0gaW5wdXQ8bnVtYmVyPig1KTtcbiAgaXNCYWNrZ3JvdW5kID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIGNvbXB1dGVkUmVjb3JkaW5nTm90aWZpY2F0aW9uSW50ZXJ2YWwgPSBjb21wdXRlZDxudW1iZXI+KCgpID0+ICh0aGlzLnJlY29yZGluZ05vdGlmaWNhdGlvbkludGVydmFsKCkgfHwgNSkgKiAxMDAwKTtcbiAgaXNQaWN0dXJlID0gY29tcHV0ZWQoKCkgPT4gIXRoaXMuaXNWaWRlbygpKTtcblxuICBzdWJqZWN0ID0gY29tcHV0ZWQoKCkgPT4gKHRoaXMuaXNQaWN0dXJlKCkgPyAnSW1hZ2UnIDogJ1ZpZGVvJykpO1xuXG4gIGlzUGF1c2VkID0gdG9TaWduYWwodGhpcy5yZWNvcmRpbmdTdGF0ZS5waXBlKG1hcCgocikgPT4gciA9PSAncGF1c2VkJykpKTtcblxuICBjb21wdXRlZEZpbGVUeXBlID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGZ0ID0gdGhpcy5maWxlVHlwZSgpLFxuICAgICAgaXNwID0gdGhpcy5pc1BpY3R1cmUoKTtcbiAgICByZXR1cm4gZnQgfHwgKGlzcCA/ICdpbWFnZS9qcGVnJyA6ICd2aWRlby9tcDQnKTtcbiAgfSk7XG4gIGNvbXB1dGVkRmlsZUV4dGVuc2lvbiA9IGNvbXB1dGVkKCgpID0+IHRoaXMuY29tcHV0ZWRGaWxlVHlwZSgpPy5zcGxpdCgnLycpWzFdKTtcbiAgY29tcHV0ZWRGaWxlTmFtZSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBmZiA9IHRoaXMuZmlsZU5hbWVGYWN0b3J5KCksXG4gICAgICBmbiA9IHRoaXMuZmlsZU5hbWUoKSB8fCBmZj8uKHRoaXMpLFxuICAgICAgZnggPSB0aGlzLmNvbXB1dGVkRmlsZUV4dGVuc2lvbigpLFxuICAgICAgc3ViamVjdCA9IHRoaXMuc3ViamVjdCgpO1xuICAgIHJldHVybiBmbj8uaW5jbHVkZXMoJy4nICsgZngpID8gZm4gOiBgJHtmbiB8fCBzdWJqZWN0fS4ke2Z4fWA7XG4gIH0pO1xuXG4gIHN0cmVhbWluZ1ZpZGVvVGVtcGxhdGUgPSB2aWV3Q2hpbGQ8VGVtcGxhdGVSZWY8YW55Pj4oJ3N0cmVhbVZpZGVvVGVtcCcpO1xuICByZWNvcmRpbmdWaWRlb1JlZiA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPEhUTUxWaWRlb0VsZW1lbnQ+PigncmVjb3JkaW5nVmlkZW9UYWcnKTtcbiAgcmVjb3JkaW5nVmlkZW9SZWZFbCA9IGNvbXB1dGVkKCgpID0+IHRoaXMucmVjb3JkaW5nVmlkZW9SZWYoKT8ubmF0aXZlRWxlbWVudCk7XG5cbiAgc3RyZWFtaW5nID0gc2lnbmFsPGJvb2xlYW4gfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHByZXZpZXcgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBjb21wdXRlZFByZXZpZXcgPSBjb21wdXRlZDxib29sZWFuPigoKSA9PiAhdGhpcy5pc0JhY2tncm91bmQoKSAmJiB0aGlzLnByZXZpZXcoKSk7XG5cbiAgLy8gVGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIGNhcHR1cmVkIHBob3RvLiBXZSB3aWxsIHNldCB0aGVcbiAgLy8gd2lkdGggdG8gdGhlIHZhbHVlIGRlZmluZWQgaGVyZSwgYnV0IHRoZSBoZWlnaHQgd2lsbCBiZVxuICAvLyBjYWxjdWxhdGVkIGJhc2VkIG9uIHRoZSBhc3BlY3QgcmF0aW8gb2YgdGhlIGlucHV0IHN0cmVhbS5cblxuICB3aWR0aCA9IG1vZGVsPG51bWJlcj4oMTA4MCk7IC8vIFdlIHdpbGwgc2NhbGUgdGhlIHBob3RvIHdpZHRoIHRvIHRoaXNcbiAgaGVpZ2h0ID0gY29tcHV0ZWQ8bnVtYmVyPigoKSA9PiB7XG4gICAgY29uc3Qgd2lkdGggPSB0aGlzLndpZHRoKCk7XG4gICAgcmV0dXJuIHdpZHRoIC8gKDQgLyAzKTtcbiAgfSk7IC8vIFRoaXMgd2lsbCBiZSBjb21wdXRlZCBiYXNlZCBvbiB0aGUgaW5wdXQgc3RyZWFtXG5cbiAgLy8gVGhlIHZhcmlvdXMgSFRNTCBlbGVtZW50cyB3ZSBuZWVkIHRvIGNvbmZpZ3VyZSBvciBjb250cm9sLiBUaGVzZVxuICAvLyB3aWxsIGJlIHNldCBieSB0aGUgc3RhcnR1cCgpIGZ1bmN0aW9uLlxuXG4gIHByb3RlY3RlZCBjYW52YXMgPSBzaWduYWw8SFRNTENhbnZhc0VsZW1lbnQgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIG1lZGlhRmlsZSA9IHNpZ25hbDxGaWxlIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBtZWRpYUZpbGVMaW5rID0gY29tcHV0ZWQ8c3RyaW5nIHwgdW5kZWZpbmVkPigoKSA9PiAodGhpcy5tZWRpYUZpbGUoKSA/IFVSTC5jcmVhdGVPYmplY3RVUkwodGhpcy5tZWRpYUZpbGUoKSkgOiB1bmRlZmluZWQpKTtcblxuICBzdHJlYW0gPSBzaWduYWw8TWVkaWFTdHJlYW0+KHVuZGVmaW5lZCk7XG5cbiAgc3ViOiBTdWJzY3JpcHRpb247XG4gIHJlY29yZGVyOiBNZWRpYVJlY29yZGVyO1xuICBpc1JlY29yZGluZyA9IHRvU2lnbmFsPGJvb2xlYW4+KHRoaXMucmVjb3JkaW5nU3RhdGUucGlwZShtYXAoKHIpID0+IHIgPT0gJ3JlY29yZGluZycgfHwgciA9PSAncGF1c2VkJykpKTtcbiAgcmVjb3JkZWRCbG9iczogQmxvYltdID0gW107XG5cbiAgLyoqSW4gTWlsbGlzZWNvbmRzICovXG4gIHJlY29yZGVkVGltZU1TID0gc2lnbmFsPG51bWJlcj4oMCk7XG4gIHJlY29yZGVkVGltZSA9IGNvbXB1dGVkPG51bWJlcj4oKCkgPT4gTWF0aC5yb3VuZCh0aGlzLnJlY29yZGVkVGltZU1TKCkgLyAxMDAwKSk7XG4gIGxvYWRpbmcgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnN0YXJ0VXBXZWJjYW0oKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuY2xvc2VXZWJjYW0oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydCB0aGUgd2ViY2FtIHN0cmVhbVxuICAgKi9cbiAgc3RhcnRVcFdlYmNhbSgpIHtcbiAgICB0aGlzLmxvYWRpbmcuc2V0KHRydWUpO1xuICAgIHRoaXMuY2xlYXIoKTtcbiAgICBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzXG4gICAgICAuZ2V0VXNlck1lZGlhKHsgdmlkZW86IHRydWUsIGF1ZGlvOiB0aGlzLnVzZUF1ZGlvKCkgfSlcbiAgICAgIC50aGVuKChzdHJlYW0pID0+IHtcbiAgICAgICAgdGhpcy5zdHJlYW1pbmcuc2V0KHRydWUpO1xuICAgICAgICB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgLy8gc3RyZWFtLm9uYWRkdHJhY2sgPSAoKSA9PiB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5jYW52YXMuc2V0KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpKTtcbiAgICAgICAgdGhpcy5jYW52YXMoKT8uc2V0QXR0cmlidXRlKCd3aWR0aCcsIHRoaXMud2lkdGgoKSArICdweCcpO1xuICAgICAgICB0aGlzLmNhbnZhcygpPy5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsIHRoaXMuaGVpZ2h0KCkgKyAncHgnKTtcbiAgICAgICAgdGhpcy5zdHJlYW0uc2V0KHN0cmVhbSk7XG4gICAgICAgIC8vIGRlYnVnZ2VyO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEFuIGVycm9yIG9jY3VycmVkOmAsIGVycik7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZSB0aGF0IHRoZSB1c2VyIGlzIGRvbmUgd2l0aCB0aGUgd2ViY2FtIGNvbXBvbmVudC5cbiAgICpcbiAgICogQW55IG1lZGlhIG9idGFpbmVkIHdpbGwgYmUgZW1pdHRlZFxuICAgKi9cbiAgc2F2ZSgpIHtcbiAgICBpZiAodGhpcy5pc1BpY3R1cmUoKSlcbiAgICAgIHRoaXMuZXh0cmFjdEltZy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLmNsb3NlZC5lbWl0KHRoaXMubWVkaWFGaWxlKCkpO1xuICAgICAgICB0aGlzLmNsb3NlV2ViY2FtKCk7XG4gICAgICB9KTtcbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuY2xvc2VkLmVtaXQodGhpcy5tZWRpYUZpbGUoKSk7XG4gICAgICB0aGlzLmNsb3NlV2ViY2FtKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEluZGljYXRlIHRoYXQgdGhlIHVzZXIgaXMgZG9uZSB3aXRoIHRoZSB3ZWJjYW0gY29tcG9uZW50LlxuICAgKlxuICAgKiBBbnkgbWVkaWEgb2J0YWluZWQgd2lsbCBiZSBkZWxldGVkXG4gICAqL1xuICBjYW5jZWwoKSB7XG4gICAgdGhpcy5jbG9zZWQuZW1pdChudWxsKTtcbiAgICB0aGlzLmNsb3NlV2ViY2FtKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgdGhlIG1lZGlhIHRha2VuIGFuZCBjbG9zZSBwcmV2aWV3XG4gICAqL1xuICBjbGVhcigpIHtcbiAgICBpZiAodGhpcy5jYW52YXMoKSkge1xuICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMuY2FudmFzKCk/LmdldENvbnRleHQoJzJkJyk7XG4gICAgICBjb250ZXh0IS5maWxsU3R5bGUgPSAnI0FBQSc7XG4gICAgICBjb250ZXh0IS5maWxsUmVjdCgwLCAwLCB0aGlzLmNhbnZhcygpIS53aWR0aCwgdGhpcy5jYW52YXMoKSEuaGVpZ2h0KTtcblxuICAgICAgY29uc3QgZGF0YSA9IHRoaXMuY2FudmFzKCkhLnRvRGF0YVVSTCh0aGlzLmNvbXB1dGVkRmlsZVR5cGUoKSk7XG4gICAgICB0aGlzLm1lZGlhRmlsZS5zZXQodW5kZWZpbmVkKTtcbiAgICAgIC8vIHRoaXMucGhvdG9TcmMuc2V0KGRhdGEpO1xuICAgICAgdGhpcy5zdHJlYW1pbmcuc2V0KHRydWUpO1xuICAgICAgdGhpcy5wcmV2aWV3LnNldChmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0YWtlKCkge1xuICAgIGlmICghdGhpcy5zdHJlYW0oKSkgdGhpcy5zdGFydFVwV2ViY2FtKCk7XG4gICAgZWxzZSB0aGlzLmNsZWFyKCk7XG4gIH1cblxuICAvKipcbiAgICogU2h1dGRvd24gdGhlIHdlYmNhbSBzdHJlYW1cbiAgICovXG4gIGNsb3NlV2ViY2FtKCkge1xuICAgIHRoaXMuc3RyZWFtKClcbiAgICAgID8uZ2V0VHJhY2tzKClcbiAgICAgIC5mb3JFYWNoKCh4KSA9PiB4LnN0b3AoKSk7XG4gICAgdGhpcy5zdHJlYW0uc2V0KHVuZGVmaW5lZCk7XG4gICAgdGhpcy5zdHJlYW1pbmcuc2V0KHVuZGVmaW5lZCk7XG4gICAgLy8gdGhpcy5zdHJlYW0uc2V0KHRoaXMuc3RyZWFtKCk/LmdldFRyYWNrc1swXS5zdG9wKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhcHR1cmUgYSBwaG90byBieSBmZXRjaGluZyB0aGUgY3VycmVudCBjb250ZW50cyBvZiB0aGUgdmlkZW9cbiAgICogYW5kIGRyYXdpbmcgaXQgaW50byBhIGNhbnZhcywgdGhlbiBjb252ZXJ0aW5nIHRoYXQgdG8gYSBQTkdcbiAgICogZm9ybWF0IGRhdGEgVVJMLlxuICAgKlxuICAgKiBCeSBkcmF3aW5nIGl0IG9uIGFuIG9mZnNjcmVlbiBjYW52YXMgYW5kIHRoZW5cbiAgICogZHJhd2luZyB0aGF0IHRvIHRoZSBzY3JlZW4sIHdlIGNhbiBjaGFuZ2UgaXRzIHNpemUgYW5kL29yIGFwcGx5XG4gICAqIG90aGVyIGNoYW5nZXMgYmVmb3JlIGRyYXdpbmcgaXQuXG4gICAqL1xuICB0YWtlUGljdHVyZSgpIHtcbiAgICBpZiAoIXRoaXMuaXNQaWN0dXJlKCkpIHJldHVybjtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5jYW52YXMoKSEuZ2V0Q29udGV4dCgnMmQnKSxcbiAgICAgIHdpZHRoID0gdGhpcy53aWR0aCgpLFxuICAgICAgaGVpZ2h0ID0gdGhpcy5oZWlnaHQoKTtcbiAgICBpZiAod2lkdGggJiYgaGVpZ2h0ICYmIGNvbnRleHQpIHtcbiAgICAgIHRoaXMuY2FudmFzLnVwZGF0ZSgoY2FudmFzKSA9PiB7XG4gICAgICAgIGlmIChjYW52YXMpIGNhbnZhcy53aWR0aCA9IHdpZHRoO1xuICAgICAgICByZXR1cm4gY2FudmFzO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmNhbnZhcy51cGRhdGUoKGNhbnZhcykgPT4ge1xuICAgICAgICBpZiAoY2FudmFzKSBjYW52YXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICByZXR1cm4gY2FudmFzO1xuICAgICAgfSk7XG4gICAgICBjb250ZXh0LmRyYXdJbWFnZSh0aGlzLnJlY29yZGluZ1ZpZGVvUmVmRWwoKSEsIDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgdGhpcy5leHRyYWN0SW1nLnN1YnNjcmliZSgpO1xuICAgICAgLy8gY29uc3QgZGF0YSA9IHRoaXMuY2FudmFzKCkhLnRvRGF0YVVSTCgnaW1hZ2UvcG5nJyk7XG4gICAgICAvLyB0aGlzLnBob3RvU3JjLnNldChkYXRhKTtcbiAgICB9IGVsc2UgdGhpcy5jbGVhcigpO1xuXG4gICAgdGhpcy5zdHJlYW1pbmcuc2V0KGZhbHNlKTtcbiAgICB0aGlzLnByZXZpZXcuc2V0KHRydWUpO1xuICB9XG5cbiAgc3RhcnRSZWNvcmRpbmcgPSAoc3RyZWFtID0gdGhpcy5zdHJlYW0oKSkgPT4ge1xuICAgIGlmICghdGhpcy5pc1ZpZGVvKCkpIHJldHVybjtcbiAgICB0aGlzLnJlY29yZGVyID0gbmV3IE1lZGlhUmVjb3JkZXIoc3RyZWFtKTtcblxuICAgIHRoaXMucmVjb3JkZWRCbG9icyA9IFtdO1xuICAgIHRoaXMucmVjb3JkZWRUaW1lTVMuc2V0KDApO1xuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgdGhpcy5yZWNvcmRlci5vbmRhdGFhdmFpbGFibGUgPSAoZXZlbnQpID0+IHtcbiAgICAgIHRoaXMucmVjb3JkZWRCbG9icy5wdXNoKGV2ZW50LmRhdGEpO1xuICAgICAgdGhpcy5yZWNvcmRlZFRpbWVNUy5zZXQoRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSk7XG4gICAgICB0aGlzLm1lZGlhRmlsZS5zZXQobmV3IEZpbGUodGhpcy5yZWNvcmRlZEJsb2JzLCB0aGlzLmNvbXB1dGVkRmlsZU5hbWUoKSwgeyB0eXBlOiB0aGlzLmNvbXB1dGVkRmlsZVR5cGUoKSB9KSk7XG4gICAgICB0aGlzLnJlY29yZGluZ0NoYW5nZWQuZW1pdCh0aGlzLm1lZGlhRmlsZSgpKTtcbiAgICB9O1xuICAgIC8vIHRoaXMucmVjb3JkZXIub25kYXRhYXZhaWxhYmxlID0gKGV2ZW50KSA9PiB7XG4gICAgLy8gICB0aGlzLnJlY29yZGVkQmxvYnMgPSBbZXZlbnQuZGF0YV07XG4gICAgLy8gICBsZW5ndGhzLnB1c2goZXZlbnQuZGF0YS5zaXplKTtcbiAgICAvLyB9O1xuICAgIC8vIHRoaXMucmVjb3JkZXIub25kYXRhYXZhaWxhYmxlID0gKGV2ZW50KSA9PiB0aGlzLnJlY29yZGVkQmxvYnMucHVzaChldmVudC5kYXRhKTtcblxuICAgIHRoaXMucmVjb3JkZXIuc3RhcnQodGhpcy5jb21wdXRlZFJlY29yZGluZ05vdGlmaWNhdGlvbkludGVydmFsKCkpO1xuXG4gICAgdGhpcy5yZWNvcmRlci5vbnN0YXJ0ID0gKGUpID0+IHtcbiAgICAgIHRoaXMucmVjb3JkaW5nU3RhdGUuZW1pdCh0aGlzLnJlY29yZGVyLnN0YXRlKTtcbiAgICAgIHRoaXMucmVjb3JkZXJTdGFydGVkLmVtaXQoZSk7XG4gICAgfTtcbiAgICB0aGlzLnJlY29yZGVyLm9uc3RvcCA9IChlKSA9PiB7XG4gICAgICB0aGlzLnJlY29yZGluZ1N0YXRlLmVtaXQodGhpcy5yZWNvcmRlci5zdGF0ZSk7XG4gICAgICB0aGlzLnJlY29yZGVyU3RvcHBlZC5lbWl0KGUpO1xuICAgIH07XG4gICAgdGhpcy5yZWNvcmRlci5vbnBhdXNlID0gKGUpID0+IHtcbiAgICAgIHRoaXMucmVjb3JkaW5nU3RhdGUuZW1pdCh0aGlzLnJlY29yZGVyLnN0YXRlKTtcbiAgICB9O1xuICAgIHRoaXMucmVjb3JkZXIub25yZXN1bWUgPSAoZSkgPT4ge1xuICAgICAgdGhpcy5yZWNvcmRpbmdTdGF0ZS5lbWl0KHRoaXMucmVjb3JkZXIuc3RhdGUpO1xuICAgIH07XG4gICAgdGhpcy5yZWNvcmRlci5vbmVycm9yID0gKGUpID0+IHtcbiAgICAgIHRoaXMucmVjb3JkaW5nU3RhdGUuZW1pdCh0aGlzLnJlY29yZGVyLnN0YXRlKTtcbiAgICAgIHRoaXMucmVjb3JkZXJFcnJvcmVkLmVtaXQoZSk7XG4gICAgfTtcbiAgfTtcblxuICBzdG9wUmVjb3JkaW5nKCkge1xuICAgIGlmICh0aGlzLnJlY29yZGVyLnN0YXRlID09PSAncmVjb3JkaW5nJykgdGhpcy5yZWNvcmRlci5zdG9wKCk7XG5cbiAgICB0aGlzLnByZXZpZXcuc2V0KHRydWUpO1xuICAgIHRoaXMuc3RyZWFtaW5nLnNldChmYWxzZSk7XG4gIH1cblxuICBwYXVzZVJlY29yZGluZygpIHtcbiAgICAvLyBkZWJ1Z2dlcjtcbiAgICBpZiAodGhpcy5yZWNvcmRlci5zdGF0ZSA9PT0gJ3BhdXNlZCcpIHRoaXMucmVjb3JkZXIucmVzdW1lKCk7XG4gICAgZWxzZSB0aGlzLnJlY29yZGVyLnBhdXNlKCk7XG4gIH1cblxuICBleHRyYWN0SW1nID0gbmV3IE9ic2VydmFibGU8RmlsZT4oKHN1YikgPT5cbiAgICB0aGlzLmNhbnZhcygpIS50b0Jsb2IoXG4gICAgICAoYmxvYikgPT4ge1xuICAgICAgICBpZiAoYmxvYikge1xuICAgICAgICAgIHRoaXMubWVkaWFGaWxlLnNldChuZXcgRmlsZShbYmxvYl0sIHRoaXMuY29tcHV0ZWRGaWxlTmFtZSgpKSk7XG4gICAgICAgICAgc3ViLm5leHQodGhpcy5tZWRpYUZpbGUoKSk7XG4gICAgICAgICAgc3ViLmNvbXBsZXRlKCk7XG4gICAgICAgIH0gZWxzZSBzdWIuZXJyb3IoYE5vICR7dGhpcy5zdWJqZWN0KCl9IGZpbGUgZ2VuZXJhdGVkYCk7XG4gICAgICB9LFxuICAgICAgdGhpcy5jb21wdXRlZEZpbGVUeXBlKCksXG4gICAgICAxLFxuICAgICksXG4gICk7XG59XG4iLCI8bG9hZGVyIFtsb2FkaW5nXT1cImxvYWRpbmcoKVwiPlxuICA8ZGl2IGNsYXNzPVwiXCIgW2hpZGRlbl09XCJzdHJlYW1pbmcoKSAhPSB0cnVlIHx8IGlzQmFja2dyb3VuZCgpXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInN0cmVhbVZpZGVvVGVtcFwiIC8+XG5cbiAgICBAaWYgKCFpc0JhY2tncm91bmQoKSkge1xuICAgICAgPGRpdiBjbGFzcz1cIndtLWJ1dHRvbnNcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJvdyByb3ctY29scy1sZy1hdXRvIGctMyBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCI+XG4gICAgICAgICAgQGlmICghaXNSZWNvcmRpbmcoKSkge1xuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGFwcC1idG4gW3RleHRdPVwiaXNQaWN0dXJlKCkgPyAnVGFrZSBQaWN0dXJlJyA6ICdSZWNvcmQgVmlkZW8nXCIgKG1jbGljayk9XCJpc1BpY3R1cmUoKSA/IHRha2VQaWN0dXJlKCkgOiBzdGFydFJlY29yZGluZygpXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGFwcC1idG5cbiAgICAgICAgICAgICAgICB0ZXh0PVwie3sgaXNQYXVzZWQoKSA/ICdQbGF5JyA6ICdQYXVzZScgfX0gUmVjb3JkaW5nXCJcbiAgICAgICAgICAgICAgICAobWNsaWNrKT1cInBhdXNlUmVjb3JkaW5nKClcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJvdXRsaW5lXCJcbiAgICAgICAgICAgICAgICBbaWNvbl09XCJpc1BhdXNlZCgpID8gJ3BsYXknIDogJ3BhdXNlJ1wiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxhcHAtYnRuIFt0ZXh0XT1cIidTdG9wIFJlY29yZGluZydcIiAobWNsaWNrKT1cInN0b3BSZWNvcmRpbmcoKVwiIHR5cGU9XCJkYW5nZXJcIiBpY29uPVwic3RvcFwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgfVxuICA8L2Rpdj5cblxuICA8bmctdGVtcGxhdGUgI3N0cmVhbVZpZGVvVGVtcD5cbiAgICA8ZGl2IGNsYXNzPVwid20tcmVjb3JkaW5nLXZpZGVvLWNvbnRcIj5cbiAgICAgIDx2aWRlbyAjcmVjb3JkaW5nVmlkZW9UYWcgW3NyY09iamVjdF09XCJzdHJlYW0oKVwiIGF1dG9wbGF5IGNsYXNzPVwid20tcmVjb3JkaW5nLXZpZGVvIHt7IGV4dHJhQ2xhc3MoKSB9fVwiPjwvdmlkZW8+XG4gICAgICBAaWYgKGlzUmVjb3JkaW5nKCkpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cIndtLXJlY29yZGluZ0RvdFwiPjwvZGl2PlxuICAgICAgfVxuICAgIDwvZGl2PlxuICA8L25nLXRlbXBsYXRlPlxuXG4gIEBpZiAoY29tcHV0ZWRQcmV2aWV3KCkpIHtcbiAgICA8ZGl2IGNsYXNzPVwid20tcHJldmlld1wiPlxuICAgICAgPGRpdj5cbiAgICAgICAgQGlmIChpc1BpY3R1cmUoKSkge1xuICAgICAgICAgIDxpbWcgY2xhc3M9XCJ3LTEwMFwiIFtzdHlsZS53aWR0aC5weF09XCJ3aWR0aCgpXCIgW3N0eWxlLmhlaWdodC5weF09XCJoZWlnaHQoKVwiIFtzcmNdPVwibWVkaWFGaWxlTGluaygpXCIgLz5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgPHZpZGVvIGNsYXNzPVwidy0xMDBcIiBbc3R5bGUud2lkdGgucHhdPVwid2lkdGgoKVwiIFtzdHlsZS5oZWlnaHQucHhdPVwiaGVpZ2h0KClcIiBjb250cm9scyBhdXRvcGxheSBbc3JjXT1cIm1lZGlhRmlsZUxpbmsoKVwiPjwvdmlkZW8+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cIm10LTMgcm93IHJvdy1jb2xzLWxnLWF1dG8ganVzdGlmeS1jb250ZW50LWNlbnRlciBnLTNcIj5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8YXBwLWJ0biB0ZXh0PVwiUmV0YWtlIHt7IHN1YmplY3QoKSB9fVwiIHR5cGU9XCJvdXRsaW5lXCIgKG1jbGljayk9XCJyZXRha2UoKVwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxhcHAtYnRuIChtY2xpY2spPVwic2F2ZSgpXCIgdGV4dD1cIkRvbmVcIiB0eXBlPVwicHJpbWFyeVwiIGljb249XCJzYXZlXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGFwcC1idG4gKG1jbGljayk9XCJjYW5jZWwoKVwiIHRleHQ9XCJDYW5jZWxcIiB0eXBlPVwiZGFuZ2VyXCIgaWNvbj1cImNhbmNlbFwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIH1cbjwvbG9hZGVyPlxuIl19
|