@lenne.tech/ng-base 14.31.0 → 14.33.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.
@@ -1,30 +1,51 @@
1
1
  import { Component, Input, ViewChild } from '@angular/core';
2
- import { Tooltip } from 'bootstrap';
3
2
  import * as i0 from "@angular/core";
4
3
  import * as i1 from "@angular/forms";
5
4
  import * as i2 from "@angular/common";
5
+ import * as i3 from "@ng-bootstrap/ng-bootstrap";
6
6
  export class TextareaComponent {
7
7
  constructor() {
8
8
  this.label = '';
9
9
  this.placeholder = '';
10
10
  this.rows = 5;
11
11
  this.required = false;
12
+ this.autoHeight = true;
12
13
  this.objectPath = '';
13
14
  }
14
- ngAfterViewInit() {
15
- if (this.toolTipElement && this.infoText) {
16
- new Tooltip(this.toolTipElement.nativeElement);
15
+ ngOnChanges(changes) {
16
+ if (changes['control'] && this.autoHeight) {
17
+ setTimeout(() => {
18
+ this.adjustInitHeight();
19
+ }, 350);
17
20
  }
18
21
  }
22
+ adjustInitHeight() {
23
+ if (!this.textarea || !this.autoHeight) {
24
+ return;
25
+ }
26
+ this.textarea.nativeElement.style.cssText = 'height:auto;';
27
+ this.textarea.nativeElement.style.cssText = 'height:' + (this.textarea.nativeElement.scrollHeight + 5) + 'px';
28
+ }
29
+ adjustHeight(event) {
30
+ if (!this.autoHeight) {
31
+ return;
32
+ }
33
+ setTimeout(() => {
34
+ event.target.style.cssText = 'height:auto;';
35
+ // for box-sizing other than "content-box" use:
36
+ // el.style.cssText = '-moz-box-sizing:content-box';
37
+ event.target.style.cssText = 'height:' + (event.target.scrollHeight + 5) + 'px';
38
+ }, 0);
39
+ }
19
40
  }
20
41
  TextareaComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: TextareaComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
21
- TextareaComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: TextareaComponent, selector: "base-textarea", inputs: { id: "id", name: "name", infoText: "infoText", label: "label", placeholder: "placeholder", control: "control", rows: "rows", required: "required", tabIndex: "tabIndex", objectPath: "objectPath" }, viewQueries: [{ propertyName: "toolTipElement", first: true, predicate: ["tooltip"], descendants: true }], ngImport: i0, template: "<div class=\"form-group mb-3\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <label [for]=\"id\" class=\"form-label\" [ngClass]=\"{ required: required }\" *ngIf=\"label\">{{ label }}</label>\n <i\n class=\"bi bi-info-circle\"\n #tooltip\n data-bs-toggle=\"tooltip\"\n data-bs-placement=\"top\"\n [attr.title]=\"infoText\"\n *ngIf=\"infoText\"\n ></i>\n </div>\n\n <textarea\n class=\"form-control\"\n [id]=\"objectPath ? objectPath + '.' + id : id\"\n [name]=\"name\"\n [rows]=\"rows\"\n [placeholder]=\"placeholder\"\n [formControl]=\"control\"\n [tabIndex]=\"tabIndex ?? null\"\n [ngClass]=\"{ 'is-invalid': control?.invalid && control?.touched }\"\n ></textarea>\n\n <div class=\"invalid-feedback m-2\" *ngIf=\"control?.invalid && (control?.dirty || control?.touched)\">\n <div *ngIf=\"control?.errors?.['required']\">Dieses Feld ist ein Pflichtfeld.</div>\n <div *ngIf=\"control?.errors?.['minlength']\">\n Die Mindestl\u00E4nge f\u00FCr dieses Feld betr\u00E4gt\n {{control?.errors?.['minlength']?.requiredLength}} Zeichen.\n </div>\n <div *ngIf=\"control?.errors?.['maxlength']\">\n Die maximale L\u00E4nge f\u00FCr dieses Feld betr\u00E4gt\n {{control?.errors?.['maxlength']?.requiredLength}} Zeichen.\n </div>\n </div>\n</div>\n", styles: [".required:after{content:\" *\"}\n"], dependencies: [{ kind: "directive", type: i1.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: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
42
+ TextareaComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: TextareaComponent, selector: "base-textarea", inputs: { id: "id", name: "name", infoText: "infoText", label: "label", placeholder: "placeholder", control: "control", rows: "rows", required: "required", autoHeight: "autoHeight", tabIndex: "tabIndex", objectPath: "objectPath" }, viewQueries: [{ propertyName: "textarea", first: true, predicate: ["textarea"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"form-group mb-3\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <label [for]=\"id\" class=\"form-label\" [ngClass]=\"{ required: required }\" *ngIf=\"label\">{{ label }}</label>\n <i class=\"bi bi-info-circle\" [ngbTooltip]=\"infoText\" placement=\"start\" *ngIf=\"infoText\"></i>\n </div>\n\n <textarea\n #textarea\n class=\"form-control\"\n [id]=\"objectPath ? objectPath + '.' + id : id\"\n [name]=\"name\"\n [rows]=\"rows\"\n (input)=\"adjustHeight($event)\"\n [placeholder]=\"placeholder\"\n [formControl]=\"control\"\n [tabIndex]=\"tabIndex ?? null\"\n [ngClass]=\"{ 'is-invalid': control?.invalid && control?.touched }\"\n ></textarea>\n\n <div class=\"invalid-feedback m-2\" *ngIf=\"control?.invalid && (control?.dirty || control?.touched)\">\n <div *ngIf=\"control?.errors?.['required']\">Dieses Feld ist ein Pflichtfeld.</div>\n <div *ngIf=\"control?.errors?.['minlength']\">\n Die Mindestl\u00E4nge f\u00FCr dieses Feld betr\u00E4gt\n {{control?.errors?.['minlength']?.requiredLength}} Zeichen.\n </div>\n <div *ngIf=\"control?.errors?.['maxlength']\">\n Die maximale L\u00E4nge f\u00FCr dieses Feld betr\u00E4gt\n {{control?.errors?.['maxlength']?.requiredLength}} Zeichen.\n </div>\n </div>\n</div>\n", styles: [".required:after{content:\" *\"}\n"], dependencies: [{ kind: "directive", type: i1.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: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }] });
22
43
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: TextareaComponent, decorators: [{
23
44
  type: Component,
24
- args: [{ selector: 'base-textarea', template: "<div class=\"form-group mb-3\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <label [for]=\"id\" class=\"form-label\" [ngClass]=\"{ required: required }\" *ngIf=\"label\">{{ label }}</label>\n <i\n class=\"bi bi-info-circle\"\n #tooltip\n data-bs-toggle=\"tooltip\"\n data-bs-placement=\"top\"\n [attr.title]=\"infoText\"\n *ngIf=\"infoText\"\n ></i>\n </div>\n\n <textarea\n class=\"form-control\"\n [id]=\"objectPath ? objectPath + '.' + id : id\"\n [name]=\"name\"\n [rows]=\"rows\"\n [placeholder]=\"placeholder\"\n [formControl]=\"control\"\n [tabIndex]=\"tabIndex ?? null\"\n [ngClass]=\"{ 'is-invalid': control?.invalid && control?.touched }\"\n ></textarea>\n\n <div class=\"invalid-feedback m-2\" *ngIf=\"control?.invalid && (control?.dirty || control?.touched)\">\n <div *ngIf=\"control?.errors?.['required']\">Dieses Feld ist ein Pflichtfeld.</div>\n <div *ngIf=\"control?.errors?.['minlength']\">\n Die Mindestl\u00E4nge f\u00FCr dieses Feld betr\u00E4gt\n {{control?.errors?.['minlength']?.requiredLength}} Zeichen.\n </div>\n <div *ngIf=\"control?.errors?.['maxlength']\">\n Die maximale L\u00E4nge f\u00FCr dieses Feld betr\u00E4gt\n {{control?.errors?.['maxlength']?.requiredLength}} Zeichen.\n </div>\n </div>\n</div>\n", styles: [".required:after{content:\" *\"}\n"] }]
25
- }], propDecorators: { toolTipElement: [{
45
+ args: [{ selector: 'base-textarea', template: "<div class=\"form-group mb-3\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <label [for]=\"id\" class=\"form-label\" [ngClass]=\"{ required: required }\" *ngIf=\"label\">{{ label }}</label>\n <i class=\"bi bi-info-circle\" [ngbTooltip]=\"infoText\" placement=\"start\" *ngIf=\"infoText\"></i>\n </div>\n\n <textarea\n #textarea\n class=\"form-control\"\n [id]=\"objectPath ? objectPath + '.' + id : id\"\n [name]=\"name\"\n [rows]=\"rows\"\n (input)=\"adjustHeight($event)\"\n [placeholder]=\"placeholder\"\n [formControl]=\"control\"\n [tabIndex]=\"tabIndex ?? null\"\n [ngClass]=\"{ 'is-invalid': control?.invalid && control?.touched }\"\n ></textarea>\n\n <div class=\"invalid-feedback m-2\" *ngIf=\"control?.invalid && (control?.dirty || control?.touched)\">\n <div *ngIf=\"control?.errors?.['required']\">Dieses Feld ist ein Pflichtfeld.</div>\n <div *ngIf=\"control?.errors?.['minlength']\">\n Die Mindestl\u00E4nge f\u00FCr dieses Feld betr\u00E4gt\n {{control?.errors?.['minlength']?.requiredLength}} Zeichen.\n </div>\n <div *ngIf=\"control?.errors?.['maxlength']\">\n Die maximale L\u00E4nge f\u00FCr dieses Feld betr\u00E4gt\n {{control?.errors?.['maxlength']?.requiredLength}} Zeichen.\n </div>\n </div>\n</div>\n", styles: [".required:after{content:\" *\"}\n"] }]
46
+ }], propDecorators: { textarea: [{
26
47
  type: ViewChild,
27
- args: ['tooltip']
48
+ args: ['textarea']
28
49
  }], id: [{
29
50
  type: Input
30
51
  }], name: [{
@@ -41,9 +62,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
41
62
  type: Input
42
63
  }], required: [{
43
64
  type: Input
65
+ }], autoHeight: [{
66
+ type: Input
44
67
  }], tabIndex: [{
45
68
  type: Input
46
69
  }], objectPath: [{
47
70
  type: Input
48
71
  }] } });
49
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dGFyZWEuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctYmFzZS9iYXNlLWNvbXBvbmVudHMvY29tcG9uZW50cy90ZXh0YXJlYS90ZXh0YXJlYS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1iYXNlL2Jhc2UtY29tcG9uZW50cy9jb21wb25lbnRzL3RleHRhcmVhL3RleHRhcmVhLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBaUIsU0FBUyxFQUFjLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkYsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQzs7OztBQU9wQyxNQUFNLE9BQU8saUJBQWlCO0lBTDlCO1FBV1csVUFBSyxHQUFZLEVBQUUsQ0FBQztRQUNwQixnQkFBVyxHQUFZLEVBQUUsQ0FBQztRQUUxQixTQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQ1QsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUVqQixlQUFVLEdBQUcsRUFBRSxDQUFDO0tBTzFCO0lBTEMsZUFBZTtRQUNiLElBQUksSUFBSSxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ3hDLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLENBQUM7U0FDaEQ7SUFDSCxDQUFDOzsrR0FsQlUsaUJBQWlCO21HQUFqQixpQkFBaUIsOFdDUjlCLHUxQ0FvQ0E7NEZENUJhLGlCQUFpQjtrQkFMN0IsU0FBUzsrQkFDRSxlQUFlOzhCQUtILGNBQWM7c0JBQW5DLFNBQVM7dUJBQUMsU0FBUztnQkFFWCxFQUFFO3NCQUFWLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgSW5wdXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVG9vbHRpcCB9IGZyb20gJ2Jvb3RzdHJhcCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Jhc2UtdGV4dGFyZWEnLFxuICB0ZW1wbGF0ZVVybDogJy4vdGV4dGFyZWEuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi90ZXh0YXJlYS5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBUZXh0YXJlYUNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQge1xuICBAVmlld0NoaWxkKCd0b29sdGlwJykgdG9vbFRpcEVsZW1lbnQ6IEVsZW1lbnRSZWY7XG5cbiAgQElucHV0KCkgaWQ6IHN0cmluZztcbiAgQElucHV0KCkgbmFtZTogc3RyaW5nO1xuICBASW5wdXQoKSBpbmZvVGV4dDogc3RyaW5nO1xuICBASW5wdXQoKSBsYWJlbD86IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBwbGFjZWhvbGRlcj86IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBjb250cm9sOiBhbnk7XG4gIEBJbnB1dCgpIHJvd3MgPSA1O1xuICBASW5wdXQoKSByZXF1aXJlZCA9IGZhbHNlO1xuICBASW5wdXQoKSB0YWJJbmRleD86IG51bWJlcjtcbiAgQElucHV0KCkgb2JqZWN0UGF0aCA9ICcnO1xuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICBpZiAodGhpcy50b29sVGlwRWxlbWVudCAmJiB0aGlzLmluZm9UZXh0KSB7XG4gICAgICBuZXcgVG9vbHRpcCh0aGlzLnRvb2xUaXBFbGVtZW50Lm5hdGl2ZUVsZW1lbnQpO1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgbWItM1wiPlxuICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgIDxsYWJlbCBbZm9yXT1cImlkXCIgY2xhc3M9XCJmb3JtLWxhYmVsXCIgW25nQ2xhc3NdPVwieyByZXF1aXJlZDogcmVxdWlyZWQgfVwiICpuZ0lmPVwibGFiZWxcIj57eyBsYWJlbCB9fTwvbGFiZWw+XG4gICAgPGlcbiAgICAgIGNsYXNzPVwiYmkgYmktaW5mby1jaXJjbGVcIlxuICAgICAgI3Rvb2x0aXBcbiAgICAgIGRhdGEtYnMtdG9nZ2xlPVwidG9vbHRpcFwiXG4gICAgICBkYXRhLWJzLXBsYWNlbWVudD1cInRvcFwiXG4gICAgICBbYXR0ci50aXRsZV09XCJpbmZvVGV4dFwiXG4gICAgICAqbmdJZj1cImluZm9UZXh0XCJcbiAgICA+PC9pPlxuICA8L2Rpdj5cblxuICA8dGV4dGFyZWFcbiAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgW2lkXT1cIm9iamVjdFBhdGggPyBvYmplY3RQYXRoICsgJy4nICsgaWQgOiBpZFwiXG4gICAgW25hbWVdPVwibmFtZVwiXG4gICAgW3Jvd3NdPVwicm93c1wiXG4gICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcbiAgICBbZm9ybUNvbnRyb2xdPVwiY29udHJvbFwiXG4gICAgW3RhYkluZGV4XT1cInRhYkluZGV4ID8/IG51bGxcIlxuICAgIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOiBjb250cm9sPy5pbnZhbGlkICYmIGNvbnRyb2w/LnRvdWNoZWQgfVwiXG4gID48L3RleHRhcmVhPlxuXG4gIDxkaXYgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrIG0tMlwiICpuZ0lmPVwiY29udHJvbD8uaW52YWxpZCAmJiAoY29udHJvbD8uZGlydHkgfHwgY29udHJvbD8udG91Y2hlZClcIj5cbiAgICA8ZGl2ICpuZ0lmPVwiY29udHJvbD8uZXJyb3JzPy5bJ3JlcXVpcmVkJ11cIj5EaWVzZXMgRmVsZCBpc3QgZWluIFBmbGljaHRmZWxkLjwvZGl2PlxuICAgIDxkaXYgKm5nSWY9XCJjb250cm9sPy5lcnJvcnM/LlsnbWlubGVuZ3RoJ11cIj5cbiAgICAgIERpZSBNaW5kZXN0bMOkbmdlIGbDvHIgZGllc2VzIEZlbGQgYmV0csOkZ3RcbiAgICAgIHt7Y29udHJvbD8uZXJyb3JzPy5bJ21pbmxlbmd0aCddPy5yZXF1aXJlZExlbmd0aH19IFplaWNoZW4uXG4gICAgPC9kaXY+XG4gICAgPGRpdiAqbmdJZj1cImNvbnRyb2w/LmVycm9ycz8uWydtYXhsZW5ndGgnXVwiPlxuICAgICAgRGllIG1heGltYWxlIEzDpG5nZSBmw7xyIGRpZXNlcyBGZWxkIGJldHLDpGd0XG4gICAgICB7e2NvbnRyb2w/LmVycm9ycz8uWydtYXhsZW5ndGgnXT8ucmVxdWlyZWRMZW5ndGh9fSBaZWljaGVuLlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
72
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dGFyZWEuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctYmFzZS9iYXNlLWNvbXBvbmVudHMvY29tcG9uZW50cy90ZXh0YXJlYS90ZXh0YXJlYS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1iYXNlL2Jhc2UtY29tcG9uZW50cy9jb21wb25lbnRzL3RleHRhcmVhL3RleHRhcmVhLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsS0FBSyxFQUE0QixTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7O0FBT2xHLE1BQU0sT0FBTyxpQkFBaUI7SUFMOUI7UUFVVyxVQUFLLEdBQVksRUFBRSxDQUFDO1FBQ3BCLGdCQUFXLEdBQVksRUFBRSxDQUFDO1FBRTFCLFNBQUksR0FBRyxDQUFDLENBQUM7UUFDVCxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ2pCLGVBQVUsR0FBRyxJQUFJLENBQUM7UUFFbEIsZUFBVSxHQUFHLEVBQUUsQ0FBQztLQStCMUI7SUE3QkMsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDekMsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDZCxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUMxQixDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7U0FDVDtJQUNILENBQUM7SUFFRCxnQkFBZ0I7UUFDZCxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDdEMsT0FBTztTQUNSO1FBRUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxjQUFjLENBQUM7UUFDM0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxTQUFTLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ2hILENBQUM7SUFFRCxZQUFZLENBQUMsS0FBSztRQUNoQixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNwQixPQUFPO1NBQ1I7UUFFRCxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLGNBQWMsQ0FBQztZQUM1QywrQ0FBK0M7WUFDL0Msb0RBQW9EO1lBQ3BELEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxTQUFTLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDbEYsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQzs7K0dBMUNVLGlCQUFpQjttR0FBakIsaUJBQWlCLHdaQ1A5QixrekNBK0JBOzRGRHhCYSxpQkFBaUI7a0JBTDdCLFNBQVM7K0JBQ0UsZUFBZTs4QkFLRixRQUFRO3NCQUE5QixTQUFTO3VCQUFDLFVBQVU7Z0JBQ1osRUFBRTtzQkFBVixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgSW5wdXQsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcywgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Jhc2UtdGV4dGFyZWEnLFxuICB0ZW1wbGF0ZVVybDogJy4vdGV4dGFyZWEuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi90ZXh0YXJlYS5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBUZXh0YXJlYUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gIEBWaWV3Q2hpbGQoJ3RleHRhcmVhJykgdGV4dGFyZWE6IEVsZW1lbnRSZWY7XG4gIEBJbnB1dCgpIGlkOiBzdHJpbmc7XG4gIEBJbnB1dCgpIG5hbWU6IHN0cmluZztcbiAgQElucHV0KCkgaW5mb1RleHQ6IHN0cmluZztcbiAgQElucHV0KCkgbGFiZWw/OiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgcGxhY2Vob2xkZXI/OiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgY29udHJvbDogYW55O1xuICBASW5wdXQoKSByb3dzID0gNTtcbiAgQElucHV0KCkgcmVxdWlyZWQgPSBmYWxzZTtcbiAgQElucHV0KCkgYXV0b0hlaWdodCA9IHRydWU7XG4gIEBJbnB1dCgpIHRhYkluZGV4PzogbnVtYmVyO1xuICBASW5wdXQoKSBvYmplY3RQYXRoID0gJyc7XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmIChjaGFuZ2VzWydjb250cm9sJ10gJiYgdGhpcy5hdXRvSGVpZ2h0KSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5hZGp1c3RJbml0SGVpZ2h0KCk7XG4gICAgICB9LCAzNTApO1xuICAgIH1cbiAgfVxuXG4gIGFkanVzdEluaXRIZWlnaHQoKSB7XG4gICAgaWYgKCF0aGlzLnRleHRhcmVhIHx8ICF0aGlzLmF1dG9IZWlnaHQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnRleHRhcmVhLm5hdGl2ZUVsZW1lbnQuc3R5bGUuY3NzVGV4dCA9ICdoZWlnaHQ6YXV0bzsnO1xuICAgIHRoaXMudGV4dGFyZWEubmF0aXZlRWxlbWVudC5zdHlsZS5jc3NUZXh0ID0gJ2hlaWdodDonICsgKHRoaXMudGV4dGFyZWEubmF0aXZlRWxlbWVudC5zY3JvbGxIZWlnaHQgKyA1KSArICdweCc7XG4gIH1cblxuICBhZGp1c3RIZWlnaHQoZXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuYXV0b0hlaWdodCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgZXZlbnQudGFyZ2V0LnN0eWxlLmNzc1RleHQgPSAnaGVpZ2h0OmF1dG87JztcbiAgICAgIC8vIGZvciBib3gtc2l6aW5nIG90aGVyIHRoYW4gXCJjb250ZW50LWJveFwiIHVzZTpcbiAgICAgIC8vIGVsLnN0eWxlLmNzc1RleHQgPSAnLW1vei1ib3gtc2l6aW5nOmNvbnRlbnQtYm94JztcbiAgICAgIGV2ZW50LnRhcmdldC5zdHlsZS5jc3NUZXh0ID0gJ2hlaWdodDonICsgKGV2ZW50LnRhcmdldC5zY3JvbGxIZWlnaHQgKyA1KSArICdweCc7XG4gICAgfSwgMCk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIG1iLTNcIj5cbiAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICA8bGFiZWwgW2Zvcl09XCJpZFwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiIFtuZ0NsYXNzXT1cInsgcmVxdWlyZWQ6IHJlcXVpcmVkIH1cIiAqbmdJZj1cImxhYmVsXCI+e3sgbGFiZWwgfX08L2xhYmVsPlxuICAgIDxpIGNsYXNzPVwiYmkgYmktaW5mby1jaXJjbGVcIiBbbmdiVG9vbHRpcF09XCJpbmZvVGV4dFwiIHBsYWNlbWVudD1cInN0YXJ0XCIgKm5nSWY9XCJpbmZvVGV4dFwiPjwvaT5cbiAgPC9kaXY+XG5cbiAgPHRleHRhcmVhXG4gICAgI3RleHRhcmVhXG4gICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgIFtpZF09XCJvYmplY3RQYXRoID8gb2JqZWN0UGF0aCArICcuJyArIGlkIDogaWRcIlxuICAgIFtuYW1lXT1cIm5hbWVcIlxuICAgIFtyb3dzXT1cInJvd3NcIlxuICAgIChpbnB1dCk9XCJhZGp1c3RIZWlnaHQoJGV2ZW50KVwiXG4gICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcbiAgICBbZm9ybUNvbnRyb2xdPVwiY29udHJvbFwiXG4gICAgW3RhYkluZGV4XT1cInRhYkluZGV4ID8/IG51bGxcIlxuICAgIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOiBjb250cm9sPy5pbnZhbGlkICYmIGNvbnRyb2w/LnRvdWNoZWQgfVwiXG4gID48L3RleHRhcmVhPlxuXG4gIDxkaXYgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrIG0tMlwiICpuZ0lmPVwiY29udHJvbD8uaW52YWxpZCAmJiAoY29udHJvbD8uZGlydHkgfHwgY29udHJvbD8udG91Y2hlZClcIj5cbiAgICA8ZGl2ICpuZ0lmPVwiY29udHJvbD8uZXJyb3JzPy5bJ3JlcXVpcmVkJ11cIj5EaWVzZXMgRmVsZCBpc3QgZWluIFBmbGljaHRmZWxkLjwvZGl2PlxuICAgIDxkaXYgKm5nSWY9XCJjb250cm9sPy5lcnJvcnM/LlsnbWlubGVuZ3RoJ11cIj5cbiAgICAgIERpZSBNaW5kZXN0bMOkbmdlIGbDvHIgZGllc2VzIEZlbGQgYmV0csOkZ3RcbiAgICAgIHt7Y29udHJvbD8uZXJyb3JzPy5bJ21pbmxlbmd0aCddPy5yZXF1aXJlZExlbmd0aH19IFplaWNoZW4uXG4gICAgPC9kaXY+XG4gICAgPGRpdiAqbmdJZj1cImNvbnRyb2w/LmVycm9ycz8uWydtYXhsZW5ndGgnXVwiPlxuICAgICAgRGllIG1heGltYWxlIEzDpG5nZSBmw7xyIGRpZXNlcyBGZWxkIGJldHLDpGd0XG4gICAgICB7e2NvbnRyb2w/LmVycm9ycz8uWydtYXhsZW5ndGgnXT8ucmVxdWlyZWRMZW5ndGh9fSBaZWljaGVuLlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
@@ -1,12 +1,12 @@
1
1
  import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
2
2
  import { ToastType, } from '@lenne.tech/ng-base/shared';
3
- import { Tooltip } from 'bootstrap';
4
3
  import * as i0 from "@angular/core";
5
4
  import * as i1 from "@angular/common/http";
6
5
  import * as i2 from "@lenne.tech/ng-base/shared";
7
6
  import * as i3 from "@angular/common";
8
7
  import * as i4 from "ngx-image-cropper";
9
- import * as i5 from "../../directives/stop-propagation.directive";
8
+ import * as i5 from "@ng-bootstrap/ng-bootstrap";
9
+ import * as i6 from "../../directives/stop-propagation.directive";
10
10
  export class UploadImageComponent {
11
11
  constructor(httpClient, authService, fileService, toastService) {
12
12
  this.httpClient = httpClient;
@@ -48,11 +48,6 @@ export class UploadImageComponent {
48
48
  ...this.croppingOptions,
49
49
  };
50
50
  }
51
- ngAfterViewInit() {
52
- if (this.toolTipElement && this.infoText) {
53
- new Tooltip(this.toolTipElement.nativeElement);
54
- }
55
- }
56
51
  /**
57
52
  * The dragOver function is called when the user drags a file over the dropzone. It prevents the default action of the
58
53
  * event, and sets the dragText to 'Release to Upload' and the dragActive to true
@@ -266,16 +261,13 @@ export class UploadImageComponent {
266
261
  }
267
262
  }
268
263
  UploadImageComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: UploadImageComponent, deps: [{ token: i1.HttpClient }, { token: i2.AuthService }, { token: i2.FileService }, { token: i2.ToastService }], target: i0.ɵɵFactoryTarget.Component });
269
- UploadImageComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: UploadImageComponent, selector: "base-upload-image", inputs: { id: "id", name: "name", infoText: "infoText", label: "label", supportText: "supportText", required: "required", defaultDragText: "defaultDragText", defaultReleaseText: "defaultReleaseText", preButtonText: "preButtonText", buttonText: "buttonText", validExtensions: "validExtensions", control: "control", url: "url", uploadPath: "uploadPath", deletePath: "deletePath", path: "path", compressOptions: "compressOptions", maxSize: "maxSize", uploadDirectly: "uploadDirectly", croppingImage: "croppingImage", croppingOptions: "croppingOptions", objectPath: "objectPath", mode: "mode" }, outputs: { imageUploaded: "imageUploaded", imageDeleted: "imageDeleted", fileChanged: "fileChanged" }, viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true }, { propertyName: "toolTipElement", first: true, predicate: ["tooltip"], descendants: true }], ngImport: i0, template: "<div class=\"form-group mt-3\" [ngClass]=\"{ 'is-invalid': control?.invalid && control?.touched }\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <label [for]=\"id\" class=\"form-label\" [ngClass]=\"{ required: required }\" *ngIf=\"label\">{{ label }}</label>\n <i\n class=\"bi bi-info-circle\"\n #tooltip\n data-bs-toggle=\"tooltip\"\n data-bs-placement=\"top\"\n [attr.title]=\"infoText\"\n *ngIf=\"infoText\"\n ></i>\n </div>\n\n <div\n [id]=\"objectPath ? objectPath + '.' + id : id\"\n class=\"drag-area\"\n (dragover)=\"dragOver($event)\"\n (dragleave)=\"dragLeave($event)\"\n (drop)=\"drop($event)\"\n [ngClass]=\"{ active: dragActive, pointer: !loading, 'is-invalid': control?.invalid && control?.touched }\"\n (click)=\"!croppedInProgress && !loading && fileInput.click()\"\n >\n <div class=\"d-flex justify-content-center\" *ngIf=\"loading\">\n <div class=\"spinner-border text-primary\" role=\"status\">\n <span class=\"visually-hidden\">Loading...</span>\n </div>\n </div>\n\n <ng-container *ngIf=\"selectedFile && !fileEvent && !croppedInProgress && !loading\">\n <img [src]=\"fileUrl\" *ngIf=\"selectedFile\" />\n <button class=\"btn btn-danger\" type=\"button\" (click)=\"deleteFile()\" baseStopPropagation>L\u00F6schen</button>\n </ng-container>\n\n <ng-container *ngIf=\"control?.value && !fileEvent && !selectedFile && !loading && !croppedInProgress\">\n <img [src]=\"control?.value.startsWith('data:') ? control?.value : url + path + control?.value\" />\n <button class=\"btn btn-danger\" type=\"button\" (click)=\"deleteFile(control?.value)\" baseStopPropagation>\n L\u00F6schen\n </button>\n </ng-container>\n\n <ng-container *ngIf=\"!selectedFile && !control?.value && !loading && !fileEvent\">\n <div class=\"icon\">\n <i class=\"bi bi-images\"></i>\n </div>\n\n <span class=\"header\">{{ dragText }}</span>\n <span class=\"header\"\n >{{ preButtonText }}\n <span class=\"button\" (click)=\"fileInput.click()\" baseStopPropagation>{{ buttonText }}</span></span\n >\n <span class=\"support\" [innerText]=\"supportText\"></span>\n </ng-container>\n\n <input type=\"file\" (change)=\"selectFile($event)\" [attr.accept]=\"validExtensions?.join(',')\" hidden #fileInput />\n\n <ng-container *ngIf=\"croppedInProgress && fileEvent\">\n <image-cropper\n [imageChangedEvent]=\"fileEvent\"\n [maintainAspectRatio]=\"cOptions.maintainAspectRatio\"\n [aspectRatio]=\"cOptions.aspectRatio\"\n [alignImage]=\"cOptions.alignImage\"\n [resizeToWidth]=\"cOptions.resizeToWidth\"\n [resizeToHeight]=\"cOptions.resizeToHeight\"\n [autoCrop]=\"cOptions.autoCrop\"\n [imageQuality]=\"cOptions.imageQuality\"\n [onlyScaleDown]=\"cOptions.onlyScaleDown\"\n [format]=\"cOptions.format\"\n (imageCropped)=\"imageCropped($event, fileEvent)\"\n (loadImageFailed)=\"loadImageFailed()\"\n ></image-cropper>\n <button class=\"btn btn-primary mt-2\" type=\"button\" (click)=\"finishedCropping()\" baseStopPropagation>\n Zuschneiden\n </button>\n </ng-container>\n </div>\n\n <div class=\"invalid-feedback m-2\" *ngIf=\"control?.invalid && (control?.dirty || control?.touched)\">\n <div *ngIf=\"control?.errors?.['required']\">Dieses Feld ist ein Pflichtfeld.</div>\n </div>\n</div>\n", styles: [":host{--base-upload-image-area-bg: #ffffff;--base-upload-image-area-border-color: #e1e1e1;--base-upload-image-area-height: 400px}.is-invalid .drag-area{border-color:var(--bs-danger)}.is-invalid .invalid-feedback{display:block}.required:after{content:\" *\"}.drag-area{height:var(--base-upload-image-area-height);border:2px dashed var(--base-upload-image-area-border-color);background-color:var(--base-upload-image-area-bg);display:flex;flex-direction:column;justify-content:center;align-items:center;margin:10px auto;padding:20px}.drag-area img{height:100%;max-height:280px;max-width:100%;object-fit:scale-down}.drag-area .btn-danger{margin-top:auto}.drag-area .icon{font-size:50px;color:var(--bs-primary)}.drag-area .header{font-size:20px;font-weight:500}.drag-area .support{font-size:12px;color:#e1e1e1;margin:10px 0 15px}.drag-area .button{font-size:20px;font-weight:500;color:var(--bs-primary);cursor:pointer}.active{border:2px solid var(--bs-primary)}.pointer{cursor:pointer}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.ImageCropperComponent, selector: "image-cropper", inputs: ["imageChangedEvent", "imageURL", "imageBase64", "imageFile", "imageAltText", "format", "transform", "maintainAspectRatio", "aspectRatio", "resetCropOnAspectRatioChange", "resizeToWidth", "resizeToHeight", "cropperMinWidth", "cropperMinHeight", "cropperMaxHeight", "cropperMaxWidth", "cropperStaticWidth", "cropperStaticHeight", "canvasRotation", "initialStepSize", "roundCropper", "onlyScaleDown", "imageQuality", "autoCrop", "backgroundColor", "containWithinAspectRatio", "hideResizeSquares", "allowMoveImage", "cropper", "alignImage", "disabled", "hidden"], outputs: ["imageCropped", "startCropImage", "imageLoaded", "cropperReady", "loadImageFailed", "transformChange"] }, { kind: "directive", type: i5.StopPropagationDirective, selector: "[baseStopPropagation]" }] });
264
+ UploadImageComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: UploadImageComponent, selector: "base-upload-image", inputs: { id: "id", name: "name", infoText: "infoText", label: "label", supportText: "supportText", required: "required", defaultDragText: "defaultDragText", defaultReleaseText: "defaultReleaseText", preButtonText: "preButtonText", buttonText: "buttonText", validExtensions: "validExtensions", control: "control", url: "url", uploadPath: "uploadPath", deletePath: "deletePath", path: "path", compressOptions: "compressOptions", maxSize: "maxSize", uploadDirectly: "uploadDirectly", croppingImage: "croppingImage", croppingOptions: "croppingOptions", objectPath: "objectPath", mode: "mode" }, outputs: { imageUploaded: "imageUploaded", imageDeleted: "imageDeleted", fileChanged: "fileChanged" }, viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true }], ngImport: i0, template: "<div class=\"form-group mt-3\" [ngClass]=\"{ 'is-invalid': control?.invalid && control?.touched }\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <label [for]=\"id\" class=\"form-label\" [ngClass]=\"{ required: required }\" *ngIf=\"label\">{{ label }}</label>\n <i class=\"bi bi-info-circle\" [ngbTooltip]=\"infoText\" placement=\"start\" *ngIf=\"infoText\"></i>\n </div>\n\n <div\n [id]=\"objectPath ? objectPath + '.' + id : id\"\n class=\"drag-area\"\n (dragover)=\"dragOver($event)\"\n (dragleave)=\"dragLeave($event)\"\n (drop)=\"drop($event)\"\n [ngClass]=\"{ active: dragActive, pointer: !loading, 'is-invalid': control?.invalid && control?.touched }\"\n (click)=\"!croppedInProgress && !loading && fileInput.click()\"\n >\n <div class=\"d-flex justify-content-center\" *ngIf=\"loading\">\n <div class=\"spinner-border text-primary\" role=\"status\">\n <span class=\"visually-hidden\">Loading...</span>\n </div>\n </div>\n\n <ng-container *ngIf=\"selectedFile && !fileEvent && !croppedInProgress && !loading\">\n <img [src]=\"fileUrl\" *ngIf=\"selectedFile\" />\n <button class=\"btn btn-danger\" type=\"button\" (click)=\"deleteFile()\" baseStopPropagation>L\u00F6schen</button>\n </ng-container>\n\n <ng-container *ngIf=\"control?.value && !fileEvent && !selectedFile && !loading && !croppedInProgress\">\n <img [src]=\"control?.value.startsWith('data:') ? control?.value : url + path + control?.value\" />\n <button class=\"btn btn-danger\" type=\"button\" (click)=\"deleteFile(control?.value)\" baseStopPropagation>\n L\u00F6schen\n </button>\n </ng-container>\n\n <ng-container *ngIf=\"!selectedFile && !control?.value && !loading && !fileEvent\">\n <div class=\"icon\">\n <i class=\"bi bi-images\"></i>\n </div>\n\n <span class=\"header\">{{ dragText }}</span>\n <span class=\"header\"\n >{{ preButtonText }}\n <span class=\"button\" (click)=\"fileInput.click()\" baseStopPropagation>{{ buttonText }}</span></span\n >\n <span class=\"support\" [innerText]=\"supportText\"></span>\n </ng-container>\n\n <input type=\"file\" (change)=\"selectFile($event)\" [attr.accept]=\"validExtensions?.join(',')\" hidden #fileInput />\n\n <ng-container *ngIf=\"croppedInProgress && fileEvent\">\n <image-cropper\n [imageChangedEvent]=\"fileEvent\"\n [maintainAspectRatio]=\"cOptions.maintainAspectRatio\"\n [aspectRatio]=\"cOptions.aspectRatio\"\n [alignImage]=\"cOptions.alignImage\"\n [resizeToWidth]=\"cOptions.resizeToWidth\"\n [resizeToHeight]=\"cOptions.resizeToHeight\"\n [autoCrop]=\"cOptions.autoCrop\"\n [imageQuality]=\"cOptions.imageQuality\"\n [onlyScaleDown]=\"cOptions.onlyScaleDown\"\n [format]=\"cOptions.format\"\n (imageCropped)=\"imageCropped($event, fileEvent)\"\n (loadImageFailed)=\"loadImageFailed()\"\n ></image-cropper>\n <button class=\"btn btn-primary mt-2\" type=\"button\" (click)=\"finishedCropping()\" baseStopPropagation>\n Zuschneiden\n </button>\n </ng-container>\n </div>\n\n <div class=\"invalid-feedback m-2\" *ngIf=\"control?.invalid && (control?.dirty || control?.touched)\">\n <div *ngIf=\"control?.errors?.['required']\">Dieses Feld ist ein Pflichtfeld.</div>\n </div>\n</div>\n", styles: [":host{--base-upload-image-area-bg: #ffffff;--base-upload-image-area-border-color: #e1e1e1;--base-upload-image-area-height: 400px}.is-invalid .drag-area{border-color:var(--bs-danger)}.is-invalid .invalid-feedback{display:block}.required:after{content:\" *\"}.drag-area{height:var(--base-upload-image-area-height);border:2px dashed var(--base-upload-image-area-border-color);background-color:var(--base-upload-image-area-bg);display:flex;flex-direction:column;justify-content:center;align-items:center;margin:10px auto;padding:20px}.drag-area img{height:100%;max-height:280px;max-width:100%;object-fit:scale-down}.drag-area .btn-danger{margin-top:auto}.drag-area .icon{font-size:50px;color:var(--bs-primary)}.drag-area .header{font-size:20px;font-weight:500}.drag-area .support{font-size:12px;color:#e1e1e1;margin:10px 0 15px}.drag-area .button{font-size:20px;font-weight:500;color:var(--bs-primary);cursor:pointer}.active{border:2px solid var(--bs-primary)}.pointer{cursor:pointer}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.ImageCropperComponent, selector: "image-cropper", inputs: ["imageChangedEvent", "imageURL", "imageBase64", "imageFile", "imageAltText", "format", "transform", "maintainAspectRatio", "aspectRatio", "resetCropOnAspectRatioChange", "resizeToWidth", "resizeToHeight", "cropperMinWidth", "cropperMinHeight", "cropperMaxHeight", "cropperMaxWidth", "cropperStaticWidth", "cropperStaticHeight", "canvasRotation", "initialStepSize", "roundCropper", "onlyScaleDown", "imageQuality", "autoCrop", "backgroundColor", "containWithinAspectRatio", "hideResizeSquares", "allowMoveImage", "cropper", "alignImage", "disabled", "hidden"], outputs: ["imageCropped", "startCropImage", "imageLoaded", "cropperReady", "loadImageFailed", "transformChange"] }, { kind: "directive", type: i5.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "directive", type: i6.StopPropagationDirective, selector: "[baseStopPropagation]" }] });
270
265
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: UploadImageComponent, decorators: [{
271
266
  type: Component,
272
- args: [{ selector: 'base-upload-image', template: "<div class=\"form-group mt-3\" [ngClass]=\"{ 'is-invalid': control?.invalid && control?.touched }\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <label [for]=\"id\" class=\"form-label\" [ngClass]=\"{ required: required }\" *ngIf=\"label\">{{ label }}</label>\n <i\n class=\"bi bi-info-circle\"\n #tooltip\n data-bs-toggle=\"tooltip\"\n data-bs-placement=\"top\"\n [attr.title]=\"infoText\"\n *ngIf=\"infoText\"\n ></i>\n </div>\n\n <div\n [id]=\"objectPath ? objectPath + '.' + id : id\"\n class=\"drag-area\"\n (dragover)=\"dragOver($event)\"\n (dragleave)=\"dragLeave($event)\"\n (drop)=\"drop($event)\"\n [ngClass]=\"{ active: dragActive, pointer: !loading, 'is-invalid': control?.invalid && control?.touched }\"\n (click)=\"!croppedInProgress && !loading && fileInput.click()\"\n >\n <div class=\"d-flex justify-content-center\" *ngIf=\"loading\">\n <div class=\"spinner-border text-primary\" role=\"status\">\n <span class=\"visually-hidden\">Loading...</span>\n </div>\n </div>\n\n <ng-container *ngIf=\"selectedFile && !fileEvent && !croppedInProgress && !loading\">\n <img [src]=\"fileUrl\" *ngIf=\"selectedFile\" />\n <button class=\"btn btn-danger\" type=\"button\" (click)=\"deleteFile()\" baseStopPropagation>L\u00F6schen</button>\n </ng-container>\n\n <ng-container *ngIf=\"control?.value && !fileEvent && !selectedFile && !loading && !croppedInProgress\">\n <img [src]=\"control?.value.startsWith('data:') ? control?.value : url + path + control?.value\" />\n <button class=\"btn btn-danger\" type=\"button\" (click)=\"deleteFile(control?.value)\" baseStopPropagation>\n L\u00F6schen\n </button>\n </ng-container>\n\n <ng-container *ngIf=\"!selectedFile && !control?.value && !loading && !fileEvent\">\n <div class=\"icon\">\n <i class=\"bi bi-images\"></i>\n </div>\n\n <span class=\"header\">{{ dragText }}</span>\n <span class=\"header\"\n >{{ preButtonText }}\n <span class=\"button\" (click)=\"fileInput.click()\" baseStopPropagation>{{ buttonText }}</span></span\n >\n <span class=\"support\" [innerText]=\"supportText\"></span>\n </ng-container>\n\n <input type=\"file\" (change)=\"selectFile($event)\" [attr.accept]=\"validExtensions?.join(',')\" hidden #fileInput />\n\n <ng-container *ngIf=\"croppedInProgress && fileEvent\">\n <image-cropper\n [imageChangedEvent]=\"fileEvent\"\n [maintainAspectRatio]=\"cOptions.maintainAspectRatio\"\n [aspectRatio]=\"cOptions.aspectRatio\"\n [alignImage]=\"cOptions.alignImage\"\n [resizeToWidth]=\"cOptions.resizeToWidth\"\n [resizeToHeight]=\"cOptions.resizeToHeight\"\n [autoCrop]=\"cOptions.autoCrop\"\n [imageQuality]=\"cOptions.imageQuality\"\n [onlyScaleDown]=\"cOptions.onlyScaleDown\"\n [format]=\"cOptions.format\"\n (imageCropped)=\"imageCropped($event, fileEvent)\"\n (loadImageFailed)=\"loadImageFailed()\"\n ></image-cropper>\n <button class=\"btn btn-primary mt-2\" type=\"button\" (click)=\"finishedCropping()\" baseStopPropagation>\n Zuschneiden\n </button>\n </ng-container>\n </div>\n\n <div class=\"invalid-feedback m-2\" *ngIf=\"control?.invalid && (control?.dirty || control?.touched)\">\n <div *ngIf=\"control?.errors?.['required']\">Dieses Feld ist ein Pflichtfeld.</div>\n </div>\n</div>\n", styles: [":host{--base-upload-image-area-bg: #ffffff;--base-upload-image-area-border-color: #e1e1e1;--base-upload-image-area-height: 400px}.is-invalid .drag-area{border-color:var(--bs-danger)}.is-invalid .invalid-feedback{display:block}.required:after{content:\" *\"}.drag-area{height:var(--base-upload-image-area-height);border:2px dashed var(--base-upload-image-area-border-color);background-color:var(--base-upload-image-area-bg);display:flex;flex-direction:column;justify-content:center;align-items:center;margin:10px auto;padding:20px}.drag-area img{height:100%;max-height:280px;max-width:100%;object-fit:scale-down}.drag-area .btn-danger{margin-top:auto}.drag-area .icon{font-size:50px;color:var(--bs-primary)}.drag-area .header{font-size:20px;font-weight:500}.drag-area .support{font-size:12px;color:#e1e1e1;margin:10px 0 15px}.drag-area .button{font-size:20px;font-weight:500;color:var(--bs-primary);cursor:pointer}.active{border:2px solid var(--bs-primary)}.pointer{cursor:pointer}\n"] }]
267
+ args: [{ selector: 'base-upload-image', template: "<div class=\"form-group mt-3\" [ngClass]=\"{ 'is-invalid': control?.invalid && control?.touched }\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <label [for]=\"id\" class=\"form-label\" [ngClass]=\"{ required: required }\" *ngIf=\"label\">{{ label }}</label>\n <i class=\"bi bi-info-circle\" [ngbTooltip]=\"infoText\" placement=\"start\" *ngIf=\"infoText\"></i>\n </div>\n\n <div\n [id]=\"objectPath ? objectPath + '.' + id : id\"\n class=\"drag-area\"\n (dragover)=\"dragOver($event)\"\n (dragleave)=\"dragLeave($event)\"\n (drop)=\"drop($event)\"\n [ngClass]=\"{ active: dragActive, pointer: !loading, 'is-invalid': control?.invalid && control?.touched }\"\n (click)=\"!croppedInProgress && !loading && fileInput.click()\"\n >\n <div class=\"d-flex justify-content-center\" *ngIf=\"loading\">\n <div class=\"spinner-border text-primary\" role=\"status\">\n <span class=\"visually-hidden\">Loading...</span>\n </div>\n </div>\n\n <ng-container *ngIf=\"selectedFile && !fileEvent && !croppedInProgress && !loading\">\n <img [src]=\"fileUrl\" *ngIf=\"selectedFile\" />\n <button class=\"btn btn-danger\" type=\"button\" (click)=\"deleteFile()\" baseStopPropagation>L\u00F6schen</button>\n </ng-container>\n\n <ng-container *ngIf=\"control?.value && !fileEvent && !selectedFile && !loading && !croppedInProgress\">\n <img [src]=\"control?.value.startsWith('data:') ? control?.value : url + path + control?.value\" />\n <button class=\"btn btn-danger\" type=\"button\" (click)=\"deleteFile(control?.value)\" baseStopPropagation>\n L\u00F6schen\n </button>\n </ng-container>\n\n <ng-container *ngIf=\"!selectedFile && !control?.value && !loading && !fileEvent\">\n <div class=\"icon\">\n <i class=\"bi bi-images\"></i>\n </div>\n\n <span class=\"header\">{{ dragText }}</span>\n <span class=\"header\"\n >{{ preButtonText }}\n <span class=\"button\" (click)=\"fileInput.click()\" baseStopPropagation>{{ buttonText }}</span></span\n >\n <span class=\"support\" [innerText]=\"supportText\"></span>\n </ng-container>\n\n <input type=\"file\" (change)=\"selectFile($event)\" [attr.accept]=\"validExtensions?.join(',')\" hidden #fileInput />\n\n <ng-container *ngIf=\"croppedInProgress && fileEvent\">\n <image-cropper\n [imageChangedEvent]=\"fileEvent\"\n [maintainAspectRatio]=\"cOptions.maintainAspectRatio\"\n [aspectRatio]=\"cOptions.aspectRatio\"\n [alignImage]=\"cOptions.alignImage\"\n [resizeToWidth]=\"cOptions.resizeToWidth\"\n [resizeToHeight]=\"cOptions.resizeToHeight\"\n [autoCrop]=\"cOptions.autoCrop\"\n [imageQuality]=\"cOptions.imageQuality\"\n [onlyScaleDown]=\"cOptions.onlyScaleDown\"\n [format]=\"cOptions.format\"\n (imageCropped)=\"imageCropped($event, fileEvent)\"\n (loadImageFailed)=\"loadImageFailed()\"\n ></image-cropper>\n <button class=\"btn btn-primary mt-2\" type=\"button\" (click)=\"finishedCropping()\" baseStopPropagation>\n Zuschneiden\n </button>\n </ng-container>\n </div>\n\n <div class=\"invalid-feedback m-2\" *ngIf=\"control?.invalid && (control?.dirty || control?.touched)\">\n <div *ngIf=\"control?.errors?.['required']\">Dieses Feld ist ein Pflichtfeld.</div>\n </div>\n</div>\n", styles: [":host{--base-upload-image-area-bg: #ffffff;--base-upload-image-area-border-color: #e1e1e1;--base-upload-image-area-height: 400px}.is-invalid .drag-area{border-color:var(--bs-danger)}.is-invalid .invalid-feedback{display:block}.required:after{content:\" *\"}.drag-area{height:var(--base-upload-image-area-height);border:2px dashed var(--base-upload-image-area-border-color);background-color:var(--base-upload-image-area-bg);display:flex;flex-direction:column;justify-content:center;align-items:center;margin:10px auto;padding:20px}.drag-area img{height:100%;max-height:280px;max-width:100%;object-fit:scale-down}.drag-area .btn-danger{margin-top:auto}.drag-area .icon{font-size:50px;color:var(--bs-primary)}.drag-area .header{font-size:20px;font-weight:500}.drag-area .support{font-size:12px;color:#e1e1e1;margin:10px 0 15px}.drag-area .button{font-size:20px;font-weight:500;color:var(--bs-primary);cursor:pointer}.active{border:2px solid var(--bs-primary)}.pointer{cursor:pointer}\n"] }]
273
268
  }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.AuthService }, { type: i2.FileService }, { type: i2.ToastService }]; }, propDecorators: { fileInput: [{
274
269
  type: ViewChild,
275
270
  args: ['fileInput']
276
- }], toolTipElement: [{
277
- type: ViewChild,
278
- args: ['tooltip']
279
271
  }], id: [{
280
272
  type: Input
281
273
  }], name: [{
@@ -329,4 +321,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
329
321
  }], fileChanged: [{
330
322
  type: Output
331
323
  }] } });
332
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkLWltYWdlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWJhc2UvYmFzZS1jb21wb25lbnRzL2NvbXBvbmVudHMvdXBsb2FkLWltYWdlL3VwbG9hZC1pbWFnZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1iYXNlL2Jhc2UtY29tcG9uZW50cy9jb21wb25lbnRzL3VwbG9hZC1pbWFnZS91cGxvYWQtaW1hZ2UuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQixTQUFTLEVBQWMsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXJILE9BQU8sRUFNTCxTQUFTLEdBQ1YsTUFBTSw0QkFBNEIsQ0FBQztBQUVwQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDOzs7Ozs7O0FBT3BDLE1BQU0sT0FBTyxvQkFBb0I7SUEwQy9CLFlBQ1UsVUFBc0IsRUFDdEIsV0FBd0IsRUFDeEIsV0FBd0IsRUFDeEIsWUFBMEI7UUFIMUIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN0QixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUN4QixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUN4QixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQXRDM0IsZ0JBQVcsR0FBRywwQkFBMEIsQ0FBQztRQUN6QyxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ2pCLG9CQUFlLEdBQUcsYUFBYSxDQUFDO1FBQ2hDLHVCQUFrQixHQUFHLG1CQUFtQixDQUFDO1FBQ3pDLGtCQUFhLEdBQUcsSUFBSSxDQUFDO1FBQ3JCLGVBQVUsR0FBRyxRQUFRLENBQUM7UUFDdEIsb0JBQWUsR0FBRyxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBRXpF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IENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7XG4gIEF1dGhTZXJ2aWNlLFxuICBDb21wcmVzc09wdGlvbnMsXG4gIENyb3BwaW5nT3B0aW9ucyxcbiAgRmlsZVNlcnZpY2UsXG4gIFRvYXN0U2VydmljZSxcbiAgVG9hc3RUeXBlLFxufSBmcm9tICdAbGVubmUudGVjaC9uZy1iYXNlL3NoYXJlZCc7XG5pbXBvcnQgeyBJbWFnZUNyb3BwZWRFdmVudCB9IGZyb20gJ25neC1pbWFnZS1jcm9wcGVyJztcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICdib290c3RyYXAnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdiYXNlLXVwbG9hZC1pbWFnZScsXG4gIHRlbXBsYXRlVXJsOiAnLi91cGxvYWQtaW1hZ2UuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi91cGxvYWQtaW1hZ2UuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgVXBsb2FkSW1hZ2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQge1xuICBAVmlld0NoaWxkKCdmaWxlSW5wdXQnKSBmaWxlSW5wdXQ6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ3Rvb2x0aXAnKSB0b29sVGlwRWxlbWVudDogRWxlbWVudFJlZjtcblxuICBASW5wdXQoKSBpZDogc3RyaW5nO1xuICBASW5wdXQoKSBuYW1lOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGluZm9UZXh0OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGxhYmVsPzogc3RyaW5nO1xuICBASW5wdXQoKSBzdXBwb3J0VGV4dCA9ICdTdXBwb3J0czogSlBFRywgSlBHLCBQTkcnO1xuICBASW5wdXQoKSByZXF1aXJlZCA9IGZhbHNlO1xuICBASW5wdXQoKSBkZWZhdWx0RHJhZ1RleHQgPSAnRHJhZyAmIERyb3AnO1xuICBASW5wdXQoKSBkZWZhdWx0UmVsZWFzZVRleHQgPSAnUmVsZWFzZSB0byBVcGxvYWQnO1xuICBASW5wdXQoKSBwcmVCdXR0b25UZXh0ID0gJ29yJztcbiAgQElucHV0KCkgYnV0dG9uVGV4dCA9ICdicm93c2UnO1xuICBASW5wdXQoKSB2YWxpZEV4dGVuc2lvbnMgPSBbJ2ltYWdlL2pwZWcnLCAnaW1hZ2UvanBnJywgJ2ltYWdlL3BuZycsICdpbWFnZS93ZWJwJ107XG4gIEBJbnB1dCgpIGNvbnRyb2w6IGFueTtcbiAgQElucHV0KCkgdXJsID0gJ2h0dHA6Ly9sb2NhbGhvc3Q6MzAwMCc7XG4gIEBJbnB1dCgpIHVwbG9hZFBhdGggPSAnL2ZpbGVzL3VwbG9hZCc7XG4gIEBJbnB1dCgpIGRlbGV0ZVBhdGggPSAnL2ZpbGVzLyc7XG4gIEBJbnB1dCgpIHBhdGggPSAnL2ZpbGVzLyc7XG4gIEBJbnB1dCgpIGNvbXByZXNzT3B0aW9uczogQ29tcHJlc3NPcHRpb25zO1xuICBASW5wdXQoKSBtYXhTaXplOiBudW1iZXI7XG4gIEBJbnB1dCgpIHVwbG9hZERpcmVjdGx5ID0gZmFsc2U7XG4gIEBJbnB1dCgpIGNyb3BwaW5nSW1hZ2UgPSBmYWxzZTtcbiAgQElucHV0KCkgY3JvcHBpbmdPcHRpb25zOiBDcm9wcGluZ09wdGlvbnM7XG4gIEBJbnB1dCgpIG9iamVjdFBhdGg6IHN0cmluZztcbiAgQElucHV0KCkgbW9kZTogJ2ZpbGUnIHwgJ2Jhc2U2NCcgPSAnZmlsZSc7XG5cbiAgQE91dHB1dCgpIGltYWdlVXBsb2FkZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBpbWFnZURlbGV0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBmaWxlQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBmaWVsZDogc3RyaW5nOyBmaWxlOiBGaWxlIHwgbnVsbDsgYmFzZTY0OiBzdHJpbmcgfCBudWxsIH0+KCk7XG5cbiAgZHJhZ0FjdGl2ZSA9IGZhbHNlO1xuICBkcmFnVGV4dCA9ICdEcmFnICYgRHJvcCc7XG4gIHNlbGVjdGVkRmlsZTogRmlsZTtcbiAgY3JvcHBlZEZpbGU6IEZpbGU7XG4gIGZpbGVVcmw6IHN0cmluZztcbiAgbG9hZGluZyA9IGZhbHNlO1xuICBjcm9wcGVkSW5Qcm9ncmVzcyA9IGZhbHNlO1xuICBmaWxlRXZlbnQ6IGFueTtcbiAgY09wdGlvbnM6IENyb3BwaW5nT3B0aW9ucztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGh0dHBDbGllbnQ6IEh0dHBDbGllbnQsXG4gICAgcHJpdmF0ZSBhdXRoU2VydmljZTogQXV0aFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBmaWxlU2VydmljZTogRmlsZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSB0b2FzdFNlcnZpY2U6IFRvYXN0U2VydmljZVxuICApIHt9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgLy8gU2V0IGRlZmF1bHQgb3B0aW9ucyBmb3IgY3JvcHBpbmdcbiAgICB0aGlzLmNPcHRpb25zID0ge1xuICAgICAgbWFpbnRhaW5Bc3BlY3RSYXRpbzogdHJ1ZSxcbiAgICAgIGFzcGVjdFJhdGlvOiA0IC8gMyxcbiAgICAgIG9ubHlTY2FsZURvd246IGZhbHNlLFxuICAgICAgaW1hZ2VRdWFsaXR5OiA5MixcbiAgICAgIGF1dG9Dcm9wOiB0cnVlLFxuICAgICAgYWxpZ25JbWFnZTogJ2NlbnRlcicsXG4gICAgICBmb3JtYXQ6ICdqcGVnJyxcbiAgICAgIC4uLnRoaXMuY3JvcHBpbmdPcHRpb25zLFxuICAgIH07XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgaWYgKHRoaXMudG9vbFRpcEVsZW1lbnQgJiYgdGhpcy5pbmZvVGV4dCkge1xuICAgICAgbmV3IFRvb2x0aXAodGhpcy50b29sVGlwRWxlbWVudC5uYXRpdmVFbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIGRyYWdPdmVyIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSB1c2VyIGRyYWdzIGEgZmlsZSBvdmVyIHRoZSBkcm9wem9uZS4gSXQgcHJldmVudHMgdGhlIGRlZmF1bHQgYWN0aW9uIG9mIHRoZVxuICAgKiBldmVudCwgYW5kIHNldHMgdGhlIGRyYWdUZXh0IHRvICdSZWxlYXNlIHRvIFVwbG9hZCcgYW5kIHRoZSBkcmFnQWN0aXZlIHRvIHRydWVcbiAgICpcbiAgICogQHBhcmFtIGV2ZW50IC0gYW55IC0gVGhpcyBpcyB0aGUgZXZlbnQgdGhhdCBpcyB0cmlnZ2VyZWQgd2hlbiB0aGUgdXNlciBkcmFncyBhIGZpbGUgb3ZlciB0aGUgZHJvcHpvbmUuXG4gICAqL1xuICBkcmFnT3ZlcihldmVudDogYW55KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLmRyYWdUZXh0ID0gdGhpcy5kZWZhdWx0UmVsZWFzZVRleHQ7XG4gICAgdGhpcy5kcmFnQWN0aXZlID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGVuIHRoZSB1c2VyIGRyYWdzIGEgZmlsZSBvdmVyIHRoZSBkcm9wIHpvbmUsIHRoZSBkcmFnQWN0aXZlIHZhcmlhYmxlIGlzIHNldCB0byB0cnVlLCB3aGljaCB3aWxsIGNoYW5nZSB0aGUgY29sb3Igb2ZcbiAgICogdGhlIGRyb3Agem9uZSB0byBncmVlblxuICAgKlxuICAgKiBAcGFyYW0gZXZlbnQgLSBUaGUgZXZlbnQgb2JqZWN0IHRoYXQgaXMgcGFzc2VkIHRvIHRoZSBkcmFnTGVhdmUgZXZlbnQuXG4gICAqL1xuICBkcmFnTGVhdmUoZXZlbnQ6IGFueSkge1xuICAgIHRoaXMuZHJhZ1RleHQgPSB0aGlzLmRlZmF1bHREcmFnVGV4dDtcbiAgICB0aGlzLmRyYWdBY3RpdmUgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZnVuY3Rpb24gdGFrZXMgYW4gZXZlbnQgYXMgYSBwYXJhbWV0ZXIsIHByZXZlbnRzIHRoZSBkZWZhdWx0IGFjdGlvbiBvZiB0aGUgZXZlbnQsIHNldHMgdGhlIFVSTCBvZiB0aGUgaW1hZ2UgdG8gdGhlXG4gICAqIGZpbGUgdGhhdCB3YXMgZHJhZ2dlZCBhbmQgZHJvcHBlZCwgc2V0cyB0aGUgdGV4dCBvZiB0aGUgZHJhZyBhbmQgZHJvcCBhcmVhIHRvIHRoZSBkZWZhdWx0IHRleHQsIGFuZCBzZXRzIHRoZVxuICAgKiBkcmFnQWN0aXZlIHZhcmlhYmxlIHRvIGZhbHNlXG4gICAqXG4gICAqIEBwYXJhbSBldmVudCAtIGFueSAtIFRoaXMgaXMgdGhlIGV2ZW50IHRoYXQgaXMgdHJpZ2dlcmVkIHdoZW4gdGhlIHVzZXIgZHJhZ3MgYW5kIGRyb3BzIGEgZmlsZS5cbiAgICovXG4gIGRyb3AoZXZlbnQ6IGFueSkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5maWxlSW5wdXQubmF0aXZlRWxlbWVudC5maWxlcyA9IGV2ZW50LmRhdGFUcmFuc2Zlci5maWxlcztcbiAgICBjb25zdCBlID0gbmV3IEV2ZW50KCdjaGFuZ2UnKTtcbiAgICB0aGlzLmZpbGVJbnB1dC5uYXRpdmVFbGVtZW50LmRpc3BhdGNoRXZlbnQoZSk7XG5cbiAgICB0aGlzLmRyYWdUZXh0ID0gJ0RyYWcgJiBEcm9wJztcbiAgICB0aGlzLmRyYWdBY3RpdmUgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJdCB0YWtlcyBhIGZpbGUgYXMgYW4gYXJndW1lbnQsIGNoZWNrcyBpZiB0aGUgZmlsZSB0eXBlIGlzIHZhbGlkLCBhbmQgaWYgaXQgaXMsIGl0IGNyZWF0ZXMgYSBuZXcgRmlsZVJlYWRlciBvYmplY3QsXG4gICAqIHNldHMgdGhlIG9ubG9hZCBmdW5jdGlvbiB0byBzZXQgdGhlIGZpbGVVcmwgdG8gdGhlIHJlc3VsdCBvZiB0aGUgZmlsZVJlYWRlciwgc2V0cyB0aGUgc2VsZWN0ZWRGaWxlIHRvIHRoZSBmaWxlLCBhbmRcbiAgICogY2FsbHMgdGhlIHVwbG9hZCBmdW5jdGlvblxuICAgKlxuICAgKiBAcGFyYW0gZmlsZSAtIGFueSAtIHRoaXMgaXMgdGhlIGZpbGUgdGhhdCBpcyBzZWxlY3RlZCBieSB0aGUgdXNlci5cbiAgICovXG4gIHNldFVybChmaWxlOiBGaWxlKSB7XG4gICAgY29uc3QgZmlsZVJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgZmlsZVJlYWRlci5vbmxvYWQgPSAocmVzdWx0KSA9PiB7XG4gICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgICAgdGhpcy5maWxlVXJsID0gZmlsZVJlYWRlci5yZXN1bHQgYXMgc3RyaW5nO1xuICAgICAgdGhpcy5zZWxlY3RlZEZpbGUgPSBmaWxlO1xuICAgICAgdGhpcy51cGxvYWQoKTtcbiAgICB9O1xuICAgIGZpbGVSZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTtcbiAgfVxuXG4gIGNoZWNrRmlsZShmaWxlOiBGaWxlKSB7XG4gICAgaWYgKHRoaXMubWF4U2l6ZSAmJiBmaWxlLnNpemUgPiB0aGlzLm1heFNpemUpIHtcbiAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLnNob3coXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogJ2ltYWdlLWludmFsaWQtc2l6ZScsXG4gICAgICAgICAgdHlwZTogVG9hc3RUeXBlLkVSUk9SLFxuICAgICAgICAgIHRpdGxlOiAnRmVobGdlc2NobGFnZW4nLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICAgJ0RpZSBEYXRlaSBpc3QgenUgZ3Jvw58uIERpZSBEYXRlaSBkYXJmIG5pY2h0IGdyw7bDn2VyIGFscyAnICtcbiAgICAgICAgICAgICh0aGlzLm1heFNpemUgLyAoMTAyNCAqIDEwMjQpKS50b0ZpeGVkKDIpICtcbiAgICAgICAgICAgICdNQiBzZWluLicsXG4gICAgICAgIH0sXG4gICAgICAgIDM1MDBcbiAgICAgICk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLnZhbGlkRXh0ZW5zaW9ucy5pbmNsdWRlcyhmaWxlPy50eXBlKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLnNob3coXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWQ6ICdpbWFnZS1pbnZhbGlkLWZvcm1hdCcsXG4gICAgICAgICAgICB0eXBlOiBUb2FzdFR5cGUuRVJST1IsXG4gICAgICAgICAgICB0aXRsZTogJ0ZlaGxnZXNjaGxhZ2VuJyxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnRGFzIEZvcm1hdCBkZXIgRGF0ZWkgd2lyZCBuaWNodCB1bnRlcnN0w7x0enQuJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIDM1MDBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZnVuY3Rpb24gdGFrZXMgYW4gZXZlbnQgYXMgYW4gYXJndW1lbnQsIGFuZCB0aGVuIHNldHMgdGhlIHVybCBvZiB0aGUgZmlsZSB0byB0aGUgZmlyc3QgZmlsZSBpbiB0aGUgZXZlbnQnc1xuICAgKiB0YXJnZXQncyBmaWxlcyBhcnJheVxuICAgKlxuICAgKiBAcGFyYW0gZXZlbnQgLSBhbnkgLSBUaGUgZXZlbnQgdGhhdCBpcyB0cmlnZ2VyZWQgd2hlbiB0aGUgdXNlciBzZWxlY3RzIGEgZmlsZS5cbiAgICovXG4gIHNlbGVjdEZpbGUoZXZlbnQ6IGFueSkge1xuICAgIGlmICghdGhpcy5jaGVja0ZpbGUoZXZlbnQudGFyZ2V0LmZpbGVzWzBdKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNyb3BwaW5nSW1hZ2UpIHtcbiAgICAgIHRoaXMuY3JvcHBlZEluUHJvZ3Jlc3MgPSB0cnVlO1xuICAgICAgdGhpcy5maWxlRXZlbnQgPSBldmVudDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRVcmwoZXZlbnQudGFyZ2V0LmZpbGVzWzBdKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV2UgY3JlYXRlIGEgbmV3IEZvcm1EYXRhIG9iamVjdCwgYXBwZW5kIHRoZSBzZWxlY3RlZCBmaWxlIHRvIGl0LCBhbmQgdGhlbiBzZW5kIGl0IHRvIHRoZSBzZXJ2ZXJcbiAgICovXG4gIGFzeW5jIHVwbG9hZCgpIHtcbiAgICAvLyBQcmVwYXJlIGZpbGUgZGF0YVxuICAgIGxldCBmaWxlID0gdGhpcy5zZWxlY3RlZEZpbGU7XG4gICAgaWYgKHRoaXMuY29tcHJlc3NPcHRpb25zKSB7XG4gICAgICBmaWxlID0gYXdhaXQgdGhpcy5maWxlU2VydmljZS5jb21wcmVzcyhmaWxlLCB0aGlzLmNvbXByZXNzT3B0aW9ucyk7XG4gICAgfVxuICAgIGNvbnN0IGZpbGVEYXRhID0ge1xuICAgICAgZmllbGQ6IHRoaXMub2JqZWN0UGF0aCA/IHRoaXMub2JqZWN0UGF0aCArICcuJyArIHRoaXMuaWQgOiB0aGlzLmlkLFxuICAgICAgZmlsZSxcbiAgICAgIGJhc2U2NDogYXdhaXQgdGhpcy5nZXRCYXNlNjQoZmlsZSksXG4gICAgfTtcblxuICAgIC8vIEVtaXQgZmlsZSBkYXRhXG4gICAgdGhpcy5maWxlQ2hhbmdlZC5lbWl0KGZpbGVEYXRhKTtcblxuICAgIC8vIFNldCBjb250cm9sIHZhbHVlIGFuZCB1cGxvYWQgZGlyZWN0bHkgaWYgcmVxdWlyZWRcbiAgICBpZiAodGhpcy51cGxvYWREaXJlY3RseSkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5maWxlU2VydmljZS51cGxvYWQodGhpcy51cmwsIHRoaXMudXBsb2FkUGF0aCwgdGhpcy5zZWxlY3RlZEZpbGUpO1xuICAgICAgaWYgKHJlc3VsdD8uaWQpIHtcbiAgICAgICAgdGhpcy5jb250cm9sLnNldFZhbHVlKHJlc3VsdC5pZCk7XG4gICAgICAgIHRoaXMuaW1hZ2VVcGxvYWRlZC5lbWl0KHJlc3VsdC5pZCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29udHJvbC5zZXRWYWx1ZSh0aGlzLm1vZGUgPT09ICdiYXNlNjQnID8gZmlsZURhdGEuYmFzZTY0IDogdGhpcy5zZWxlY3RlZEZpbGUpO1xuICAgIH1cblxuICAgIC8vIEZpbmFsIHByb2Nlc3Nlc1xuICAgIHRoaXMuY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XG4gICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogSXQgZGVsZXRlcyB0aGUgZmlsZSBmcm9tIHRoZSBzZXJ2ZXIgYW5kIHNldHMgdGhlIHNlbGVjdGVkRmlsZSBhbmQgZmlsZVVybCB0byBudWxsXG4gICAqXG4gICAqIEBwYXJhbSBbaWRdIC0gVGhlIGlkIG9mIHRoZSBmaWxlIHRvIGRlbGV0ZS5cbiAgICovXG4gIGFzeW5jIGRlbGV0ZUZpbGUoaWQ/OiBzdHJpbmcpIHtcbiAgICBpZiAoIXRoaXMudXBsb2FkRGlyZWN0bHkpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaWxlID0gbnVsbDtcbiAgICAgIHRoaXMuZmlsZVVybCA9IG51bGw7XG4gICAgICB0aGlzLmNvbnRyb2wuc2V0VmFsdWUoJycpO1xuICAgICAgdGhpcy5jb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcbiAgICAgIHRoaXMuZmlsZUNoYW5nZWQuZW1pdCh7XG4gICAgICAgIGZpZWxkOiB0aGlzLm9iamVjdFBhdGggPyB0aGlzLm9iamVjdFBhdGggKyAnLicgKyB0aGlzLmlkIDogdGhpcy5pZCxcbiAgICAgICAgZmlsZTogbnVsbCxcbiAgICAgICAgYmFzZTY0OiBudWxsLFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICB0aGlzLnNlbGVjdGVkRmlsZSA9IG51bGw7XG4gICAgdGhpcy5maWxlVXJsID0gbnVsbDtcblxuICAgIGlmIChpZCkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5maWxlU2VydmljZS5kZWxldGUodGhpcy51cmwsIHRoaXMuZGVsZXRlUGF0aCwgaWQpO1xuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkRmlsZSA9IG51bGw7XG4gICAgICAgIHRoaXMuZmlsZVVybCA9IG51bGw7XG4gICAgICAgIHRoaXMuY29udHJvbC5zZXRWYWx1ZSgnJyk7XG4gICAgICAgIHRoaXMuaW1hZ2VEZWxldGVkLmVtaXQoKTtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgYSBmaWxlIGludG8gYSBCQVNFNjQgZW5jb2RlZCBzdHJpbmdcbiAgICovXG4gIHByb3RlY3RlZCBnZXRCYXNlNjQoZmlsZSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHN0cmluZz4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgaWYgKCFmaWxlKSB7XG4gICAgICAgIHJldHVybiByZXNvbHZlKG51bGwpO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xuICAgICAgcmVhZGVyLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgaWYgKCFyZWFkZXIucmVzdWx0KSB7XG4gICAgICAgICAgcmV0dXJuIHJlamVjdChuZXcgRXJyb3IoJ0NvbnZlcnNpb24gZmFpbGVkJykpO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUocmVhZGVyLnJlc3VsdC50b1N0cmluZygpKTtcbiAgICAgIH07XG4gICAgICByZWFkZXIub25lcnJvciA9IChlcnJvcikgPT4ge1xuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIGJhc2U2NFRvRmlsZShiYXNlNjQ6IHN0cmluZywgZmlsZU5hbWU6IHN0cmluZywgZmlsZVR5cGU6IHN0cmluZyk6IFByb21pc2U8RmlsZT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTxGaWxlPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBmZXRjaChiYXNlNjQpXG4gICAgICAgIC50aGVuKChyZXMpID0+IHJlcy5ibG9iKCkpXG4gICAgICAgIC50aGVuKFxuICAgICAgICAgIChibG9iKSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlKG5ldyBGaWxlKFtibG9iXSwgZmlsZU5hbWUsIHsgdHlwZTogZmlsZVR5cGUgfSkpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgKGVycikgPT4ge1xuICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgaW1hZ2VDcm9wcGVkKCRldmVudDogSW1hZ2VDcm9wcGVkRXZlbnQsIGZpbGVFdmVudDogYW55KSB7XG4gICAgY29uc3QgZmlsZSA9IGZpbGVFdmVudC50YXJnZXQuZmlsZXNbMF07XG4gICAgdGhpcy5jcm9wcGVkRmlsZSA9IGF3YWl0IHRoaXMuYmFzZTY0VG9GaWxlKCRldmVudC5iYXNlNjQsIGZpbGUubmFtZSwgZmlsZS50eXBlKTtcbiAgfVxuXG4gIGZpbmlzaGVkQ3JvcHBpbmcoKSB7XG4gICAgdGhpcy5maWxlRXZlbnQgPSBudWxsO1xuICAgIHRoaXMuc2V0VXJsKHRoaXMuY3JvcHBlZEZpbGUpO1xuICAgIHRoaXMuY3JvcHBlZEluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICB0aGlzLmNyb3BwZWRGaWxlID0gbnVsbDtcbiAgfVxuXG4gIGxvYWRJbWFnZUZhaWxlZCgpIHtcbiAgICB0aGlzLnRvYXN0U2VydmljZS5zaG93KFxuICAgICAge1xuICAgICAgICBpZDogJ2ltYWdlLWludmFsaWQtY3JvcHBlZCcsXG4gICAgICAgIHR5cGU6IFRvYXN0VHlwZS5FUlJPUixcbiAgICAgICAgdGl0bGU6ICdGZWhsZ2VzY2hsYWdlbicsXG4gICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICdFcyBpc3QgZWluIEZlaGxlciBhdWZnZXRyZXRlbi4gQml0dGUgcHJvYmllcmVuIFNpZSBlcyBzcMOkdGVyIGVybmV1dCBvZGVyIHdlbmRlbiBTaWUgc2ljaCBhbiBkZW4gU3VwcG9ydC4nLFxuICAgICAgfSxcbiAgICAgIDM1MDBcbiAgICApO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBtdC0zXCIgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6IGNvbnRyb2w/LmludmFsaWQgJiYgY29udHJvbD8udG91Y2hlZCB9XCI+XG4gIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgPGxhYmVsIFtmb3JdPVwiaWRcIiBjbGFzcz1cImZvcm0tbGFiZWxcIiBbbmdDbGFzc109XCJ7IHJlcXVpcmVkOiByZXF1aXJlZCB9XCIgKm5nSWY9XCJsYWJlbFwiPnt7IGxhYmVsIH19PC9sYWJlbD5cbiAgICA8aVxuICAgICAgY2xhc3M9XCJiaSBiaS1pbmZvLWNpcmNsZVwiXG4gICAgICAjdG9vbHRpcFxuICAgICAgZGF0YS1icy10b2dnbGU9XCJ0b29sdGlwXCJcbiAgICAgIGRhdGEtYnMtcGxhY2VtZW50PVwidG9wXCJcbiAgICAgIFthdHRyLnRpdGxlXT1cImluZm9UZXh0XCJcbiAgICAgICpuZ0lmPVwiaW5mb1RleHRcIlxuICAgID48L2k+XG4gIDwvZGl2PlxuXG4gIDxkaXZcbiAgICBbaWRdPVwib2JqZWN0UGF0aCA/IG9iamVjdFBhdGggKyAnLicgKyBpZCA6IGlkXCJcbiAgICBjbGFzcz1cImRyYWctYXJlYVwiXG4gICAgKGRyYWdvdmVyKT1cImRyYWdPdmVyKCRldmVudClcIlxuICAgIChkcmFnbGVhdmUpPVwiZHJhZ0xlYXZlKCRldmVudClcIlxuICAgIChkcm9wKT1cImRyb3AoJGV2ZW50KVwiXG4gICAgW25nQ2xhc3NdPVwieyBhY3RpdmU6IGRyYWdBY3RpdmUsIHBvaW50ZXI6ICFsb2FkaW5nLCAnaXMtaW52YWxpZCc6IGNvbnRyb2w/LmludmFsaWQgJiYgY29udHJvbD8udG91Y2hlZCB9XCJcbiAgICAoY2xpY2spPVwiIWNyb3BwZWRJblByb2dyZXNzICYmICFsb2FkaW5nICYmIGZpbGVJbnB1dC5jbGljaygpXCJcbiAgPlxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlclwiICpuZ0lmPVwibG9hZGluZ1wiPlxuICAgICAgPGRpdiBjbGFzcz1cInNwaW5uZXItYm9yZGVyIHRleHQtcHJpbWFyeVwiIHJvbGU9XCJzdGF0dXNcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ2aXN1YWxseS1oaWRkZW5cIj5Mb2FkaW5nLi4uPC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0ZWRGaWxlICYmICFmaWxlRXZlbnQgJiYgIWNyb3BwZWRJblByb2dyZXNzICYmICFsb2FkaW5nXCI+XG4gICAgICA8aW1nIFtzcmNdPVwiZmlsZVVybFwiICpuZ0lmPVwic2VsZWN0ZWRGaWxlXCIgLz5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLWRhbmdlclwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiZGVsZXRlRmlsZSgpXCIgYmFzZVN0b3BQcm9wYWdhdGlvbj5Mw7ZzY2hlbjwvYnV0dG9uPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRyb2w/LnZhbHVlICYmICFmaWxlRXZlbnQgJiYgIXNlbGVjdGVkRmlsZSAmJiAhbG9hZGluZyAmJiAhY3JvcHBlZEluUHJvZ3Jlc3NcIj5cbiAgICAgIDxpbWcgW3NyY109XCJjb250cm9sPy52YWx1ZS5zdGFydHNXaXRoKCdkYXRhOicpID8gY29udHJvbD8udmFsdWUgOiB1cmwgKyBwYXRoICsgY29udHJvbD8udmFsdWVcIiAvPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tZGFuZ2VyXCIgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJkZWxldGVGaWxlKGNvbnRyb2w/LnZhbHVlKVwiIGJhc2VTdG9wUHJvcGFnYXRpb24+XG4gICAgICAgIEzDtnNjaGVuXG4gICAgICA8L2J1dHRvbj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc2VsZWN0ZWRGaWxlICYmICFjb250cm9sPy52YWx1ZSAmJiAhbG9hZGluZyAmJiAhZmlsZUV2ZW50XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiaWNvblwiPlxuICAgICAgICA8aSBjbGFzcz1cImJpIGJpLWltYWdlc1wiPjwvaT5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8c3BhbiBjbGFzcz1cImhlYWRlclwiPnt7IGRyYWdUZXh0IH19PC9zcGFuPlxuICAgICAgPHNwYW4gY2xhc3M9XCJoZWFkZXJcIlxuICAgICAgICA+e3sgcHJlQnV0dG9uVGV4dCB9fVxuICAgICAgICA8c3BhbiBjbGFzcz1cImJ1dHRvblwiIChjbGljayk9XCJmaWxlSW5wdXQuY2xpY2soKVwiIGJhc2VTdG9wUHJvcGFnYXRpb24+e3sgYnV0dG9uVGV4dCB9fTwvc3Bhbj48L3NwYW5cbiAgICAgID5cbiAgICAgIDxzcGFuIGNsYXNzPVwic3VwcG9ydFwiIFtpbm5lclRleHRdPVwic3VwcG9ydFRleHRcIj48L3NwYW4+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8aW5wdXQgdHlwZT1cImZpbGVcIiAoY2hhbmdlKT1cInNlbGVjdEZpbGUoJGV2ZW50KVwiIFthdHRyLmFjY2VwdF09XCJ2YWxpZEV4dGVuc2lvbnM/LmpvaW4oJywnKVwiIGhpZGRlbiAjZmlsZUlucHV0IC8+XG5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY3JvcHBlZEluUHJvZ3Jlc3MgJiYgZmlsZUV2ZW50XCI+XG4gICAgICA8aW1hZ2UtY3JvcHBlclxuICAgICAgICBbaW1hZ2VDaGFuZ2VkRXZlbnRdPVwiZmlsZUV2ZW50XCJcbiAgICAgICAgW21haW50YWluQXNwZWN0UmF0aW9dPVwiY09wdGlvbnMubWFpbnRhaW5Bc3BlY3RSYXRpb1wiXG4gICAgICAgIFthc3BlY3RSYXRpb109XCJjT3B0aW9ucy5hc3BlY3RSYXRpb1wiXG4gICAgICAgIFthbGlnbkltYWdlXT1cImNPcHRpb25zLmFsaWduSW1hZ2VcIlxuICAgICAgICBbcmVzaXplVG9XaWR0aF09XCJjT3B0aW9ucy5yZXNpemVUb1dpZHRoXCJcbiAgICAgICAgW3Jlc2l6ZVRvSGVpZ2h0XT1cImNPcHRpb25zLnJlc2l6ZVRvSGVpZ2h0XCJcbiAgICAgICAgW2F1dG9Dcm9wXT1cImNPcHRpb25zLmF1dG9Dcm9wXCJcbiAgICAgICAgW2ltYWdlUXVhbGl0eV09XCJjT3B0aW9ucy5pbWFnZVF1YWxpdHlcIlxuICAgICAgICBbb25seVNjYWxlRG93bl09XCJjT3B0aW9ucy5vbmx5U2NhbGVEb3duXCJcbiAgICAgICAgW2Zvcm1hdF09XCJjT3B0aW9ucy5mb3JtYXRcIlxuICAgICAgICAoaW1hZ2VDcm9wcGVkKT1cImltYWdlQ3JvcHBlZCgkZXZlbnQsIGZpbGVFdmVudClcIlxuICAgICAgICAobG9hZEltYWdlRmFpbGVkKT1cImxvYWRJbWFnZUZhaWxlZCgpXCJcbiAgICAgID48L2ltYWdlLWNyb3BwZXI+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IG10LTJcIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImZpbmlzaGVkQ3JvcHBpbmcoKVwiIGJhc2VTdG9wUHJvcGFnYXRpb24+XG4gICAgICAgIFp1c2NobmVpZGVuXG4gICAgICA8L2J1dHRvbj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2sgbS0yXCIgKm5nSWY9XCJjb250cm9sPy5pbnZhbGlkICYmIChjb250cm9sPy5kaXJ0eSB8fCBjb250cm9sPy50b3VjaGVkKVwiPlxuICAgIDxkaXYgKm5nSWY9XCJjb250cm9sPy5lcnJvcnM/LlsncmVxdWlyZWQnXVwiPkRpZXNlcyBGZWxkIGlzdCBlaW4gUGZsaWNodGZlbGQuPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
324
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkLWltYWdlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWJhc2UvYmFzZS1jb21wb25lbnRzL2NvbXBvbmVudHMvdXBsb2FkLWltYWdlL3VwbG9hZC1pbWFnZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1iYXNlL2Jhc2UtY29tcG9uZW50cy9jb21wb25lbnRzL3VwbG9hZC1pbWFnZS91cGxvYWQtaW1hZ2UuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFdEcsT0FBTyxFQU1MLFNBQVMsR0FDVixNQUFNLDRCQUE0QixDQUFDOzs7Ozs7OztBQVFwQyxNQUFNLE9BQU8sb0JBQW9CO0lBeUMvQixZQUNVLFVBQXNCLEVBQ3RCLFdBQXdCLEVBQ3hCLFdBQXdCLEVBQ3hCLFlBQTBCO1FBSDFCLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsaUJBQVksR0FBWixZQUFZLENBQWM7UUF0QzNCLGdCQUFXLEdBQUcsMEJBQTBCLENBQUM7UUFDekMsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUNqQixvQkFBZSxHQUFHLGFBQWEsQ0FBQztRQUNoQyx1QkFBa0IsR0FBRyxtQkFBbUIsQ0FBQztRQUN6QyxrQkFBYSxHQUFHLElBQUksQ0FBQztRQUNyQixlQUFVLEdBQUcsUUFBUSxDQUFDO1FBQ3RCLG9CQUFlLEdBQUcsQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUV6RSxRQUFHLEdBQUcsdUJBQXVCLENBQUM7UUFDOUIsZUFBVSxHQUFHLGVB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QkFMaEMsU0FBUzsrQkFDRSxtQkFBbUI7Z0xBS0wsU0FBUztzQkFBaEMsU0FBUzt1QkFBQyxXQUFXO2dCQUViLEVBQUU7c0JBQVYsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxHQUFHO3NCQUFYLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFFSSxhQUFhO3NCQUF0QixNQUFNO2dCQUNHLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7XG4gIEF1dGhTZXJ2aWNlLFxuICBDb21wcmVzc09wdGlvbnMsXG4gIENyb3BwaW5nT3B0aW9ucyxcbiAgRmlsZVNlcnZpY2UsXG4gIFRvYXN0U2VydmljZSxcbiAgVG9hc3RUeXBlLFxufSBmcm9tICdAbGVubmUudGVjaC9uZy1iYXNlL3NoYXJlZCc7XG5pbXBvcnQgeyBJbWFnZUNyb3BwZWRFdmVudCB9IGZyb20gJ25neC1pbWFnZS1jcm9wcGVyJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYmFzZS11cGxvYWQtaW1hZ2UnLFxuICB0ZW1wbGF0ZVVybDogJy4vdXBsb2FkLWltYWdlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdXBsb2FkLWltYWdlLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIFVwbG9hZEltYWdlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQFZpZXdDaGlsZCgnZmlsZUlucHV0JykgZmlsZUlucHV0OiBFbGVtZW50UmVmO1xuXG4gIEBJbnB1dCgpIGlkOiBzdHJpbmc7XG4gIEBJbnB1dCgpIG5hbWU6IHN0cmluZztcbiAgQElucHV0KCkgaW5mb1RleHQ6IHN0cmluZztcbiAgQElucHV0KCkgbGFiZWw/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIHN1cHBvcnRUZXh0ID0gJ1N1cHBvcnRzOiBKUEVHLCBKUEcsIFBORyc7XG4gIEBJbnB1dCgpIHJlcXVpcmVkID0gZmFsc2U7XG4gIEBJbnB1dCgpIGRlZmF1bHREcmFnVGV4dCA9ICdEcmFnICYgRHJvcCc7XG4gIEBJbnB1dCgpIGRlZmF1bHRSZWxlYXNlVGV4dCA9ICdSZWxlYXNlIHRvIFVwbG9hZCc7XG4gIEBJbnB1dCgpIHByZUJ1dHRvblRleHQgPSAnb3InO1xuICBASW5wdXQoKSBidXR0b25UZXh0ID0gJ2Jyb3dzZSc7XG4gIEBJbnB1dCgpIHZhbGlkRXh0ZW5zaW9ucyA9IFsnaW1hZ2UvanBlZycsICdpbWFnZS9qcGcnLCAnaW1hZ2UvcG5nJywgJ2ltYWdlL3dlYnAnXTtcbiAgQElucHV0KCkgY29udHJvbDogYW55O1xuICBASW5wdXQoKSB1cmwgPSAnaHR0cDovL2xvY2FsaG9zdDozMDAwJztcbiAgQElucHV0KCkgdXBsb2FkUGF0aCA9ICcvZmlsZXMvdXBsb2FkJztcbiAgQElucHV0KCkgZGVsZXRlUGF0aCA9ICcvZmlsZXMvJztcbiAgQElucHV0KCkgcGF0aCA9ICcvZmlsZXMvJztcbiAgQElucHV0KCkgY29tcHJlc3NPcHRpb25zOiBDb21wcmVzc09wdGlvbnM7XG4gIEBJbnB1dCgpIG1heFNpemU6IG51bWJlcjtcbiAgQElucHV0KCkgdXBsb2FkRGlyZWN0bHkgPSBmYWxzZTtcbiAgQElucHV0KCkgY3JvcHBpbmdJbWFnZSA9IGZhbHNlO1xuICBASW5wdXQoKSBjcm9wcGluZ09wdGlvbnM6IENyb3BwaW5nT3B0aW9ucztcbiAgQElucHV0KCkgb2JqZWN0UGF0aDogc3RyaW5nO1xuICBASW5wdXQoKSBtb2RlOiAnZmlsZScgfCAnYmFzZTY0JyA9ICdmaWxlJztcblxuICBAT3V0cHV0KCkgaW1hZ2VVcGxvYWRlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIGltYWdlRGVsZXRlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIGZpbGVDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjx7IGZpZWxkOiBzdHJpbmc7IGZpbGU6IEZpbGUgfCBudWxsOyBiYXNlNjQ6IHN0cmluZyB8IG51bGwgfT4oKTtcblxuICBkcmFnQWN0aXZlID0gZmFsc2U7XG4gIGRyYWdUZXh0ID0gJ0RyYWcgJiBEcm9wJztcbiAgc2VsZWN0ZWRGaWxlOiBGaWxlO1xuICBjcm9wcGVkRmlsZTogRmlsZTtcbiAgZmlsZVVybDogc3RyaW5nO1xuICBsb2FkaW5nID0gZmFsc2U7XG4gIGNyb3BwZWRJblByb2dyZXNzID0gZmFsc2U7XG4gIGZpbGVFdmVudDogYW55O1xuICBjT3B0aW9uczogQ3JvcHBpbmdPcHRpb25zO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgaHR0cENsaWVudDogSHR0cENsaWVudCxcbiAgICBwcml2YXRlIGF1dGhTZXJ2aWNlOiBBdXRoU2VydmljZSxcbiAgICBwcml2YXRlIGZpbGVTZXJ2aWNlOiBGaWxlU2VydmljZSxcbiAgICBwcml2YXRlIHRvYXN0U2VydmljZTogVG9hc3RTZXJ2aWNlXG4gICkge31cblxuICBuZ09uSW5pdCgpIHtcbiAgICAvLyBTZXQgZGVmYXVsdCBvcHRpb25zIGZvciBjcm9wcGluZ1xuICAgIHRoaXMuY09wdGlvbnMgPSB7XG4gICAgICBtYWludGFpbkFzcGVjdFJhdGlvOiB0cnVlLFxuICAgICAgYXNwZWN0UmF0aW86IDQgLyAzLFxuICAgICAgb25seVNjYWxlRG93bjogZmFsc2UsXG4gICAgICBpbWFnZVF1YWxpdHk6IDkyLFxuICAgICAgYXV0b0Nyb3A6IHRydWUsXG4gICAgICBhbGlnbkltYWdlOiAnY2VudGVyJyxcbiAgICAgIGZvcm1hdDogJ2pwZWcnLFxuICAgICAgLi4udGhpcy5jcm9wcGluZ09wdGlvbnMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZHJhZ092ZXIgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIHVzZXIgZHJhZ3MgYSBmaWxlIG92ZXIgdGhlIGRyb3B6b25lLiBJdCBwcmV2ZW50cyB0aGUgZGVmYXVsdCBhY3Rpb24gb2YgdGhlXG4gICAqIGV2ZW50LCBhbmQgc2V0cyB0aGUgZHJhZ1RleHQgdG8gJ1JlbGVhc2UgdG8gVXBsb2FkJyBhbmQgdGhlIGRyYWdBY3RpdmUgdG8gdHJ1ZVxuICAgKlxuICAgKiBAcGFyYW0gZXZlbnQgLSBhbnkgLSBUaGlzIGlzIHRoZSBldmVudCB0aGF0IGlzIHRyaWdnZXJlZCB3aGVuIHRoZSB1c2VyIGRyYWdzIGEgZmlsZSBvdmVyIHRoZSBkcm9wem9uZS5cbiAgICovXG4gIGRyYWdPdmVyKGV2ZW50OiBhbnkpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMuZHJhZ1RleHQgPSB0aGlzLmRlZmF1bHRSZWxlYXNlVGV4dDtcbiAgICB0aGlzLmRyYWdBY3RpdmUgPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZW4gdGhlIHVzZXIgZHJhZ3MgYSBmaWxlIG92ZXIgdGhlIGRyb3Agem9uZSwgdGhlIGRyYWdBY3RpdmUgdmFyaWFibGUgaXMgc2V0IHRvIHRydWUsIHdoaWNoIHdpbGwgY2hhbmdlIHRoZSBjb2xvciBvZlxuICAgKiB0aGUgZHJvcCB6b25lIHRvIGdyZWVuXG4gICAqXG4gICAqIEBwYXJhbSBldmVudCAtIFRoZSBldmVudCBvYmplY3QgdGhhdCBpcyBwYXNzZWQgdG8gdGhlIGRyYWdMZWF2ZSBldmVudC5cbiAgICovXG4gIGRyYWdMZWF2ZShldmVudDogYW55KSB7XG4gICAgdGhpcy5kcmFnVGV4dCA9IHRoaXMuZGVmYXVsdERyYWdUZXh0O1xuICAgIHRoaXMuZHJhZ0FjdGl2ZSA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBmdW5jdGlvbiB0YWtlcyBhbiBldmVudCBhcyBhIHBhcmFtZXRlciwgcHJldmVudHMgdGhlIGRlZmF1bHQgYWN0aW9uIG9mIHRoZSBldmVudCwgc2V0cyB0aGUgVVJMIG9mIHRoZSBpbWFnZSB0byB0aGVcbiAgICogZmlsZSB0aGF0IHdhcyBkcmFnZ2VkIGFuZCBkcm9wcGVkLCBzZXRzIHRoZSB0ZXh0IG9mIHRoZSBkcmFnIGFuZCBkcm9wIGFyZWEgdG8gdGhlIGRlZmF1bHQgdGV4dCwgYW5kIHNldHMgdGhlXG4gICAqIGRyYWdBY3RpdmUgdmFyaWFibGUgdG8gZmFsc2VcbiAgICpcbiAgICogQHBhcmFtIGV2ZW50IC0gYW55IC0gVGhpcyBpcyB0aGUgZXZlbnQgdGhhdCBpcyB0cmlnZ2VyZWQgd2hlbiB0aGUgdXNlciBkcmFncyBhbmQgZHJvcHMgYSBmaWxlLlxuICAgKi9cbiAgZHJvcChldmVudDogYW55KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLmZpbGVJbnB1dC5uYXRpdmVFbGVtZW50LmZpbGVzID0gZXZlbnQuZGF0YVRyYW5zZmVyLmZpbGVzO1xuICAgIGNvbnN0IGUgPSBuZXcgRXZlbnQoJ2NoYW5nZScpO1xuICAgIHRoaXMuZmlsZUlucHV0Lm5hdGl2ZUVsZW1lbnQuZGlzcGF0Y2hFdmVudChlKTtcblxuICAgIHRoaXMuZHJhZ1RleHQgPSAnRHJhZyAmIERyb3AnO1xuICAgIHRoaXMuZHJhZ0FjdGl2ZSA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEl0IHRha2VzIGEgZmlsZSBhcyBhbiBhcmd1bWVudCwgY2hlY2tzIGlmIHRoZSBmaWxlIHR5cGUgaXMgdmFsaWQsIGFuZCBpZiBpdCBpcywgaXQgY3JlYXRlcyBhIG5ldyBGaWxlUmVhZGVyIG9iamVjdCxcbiAgICogc2V0cyB0aGUgb25sb2FkIGZ1bmN0aW9uIHRvIHNldCB0aGUgZmlsZVVybCB0byB0aGUgcmVzdWx0IG9mIHRoZSBmaWxlUmVhZGVyLCBzZXRzIHRoZSBzZWxlY3RlZEZpbGUgdG8gdGhlIGZpbGUsIGFuZFxuICAgKiBjYWxscyB0aGUgdXBsb2FkIGZ1bmN0aW9uXG4gICAqXG4gICAqIEBwYXJhbSBmaWxlIC0gYW55IC0gdGhpcyBpcyB0aGUgZmlsZSB0aGF0IGlzIHNlbGVjdGVkIGJ5IHRoZSB1c2VyLlxuICAgKi9cbiAgc2V0VXJsKGZpbGU6IEZpbGUpIHtcbiAgICBjb25zdCBmaWxlUmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICBmaWxlUmVhZGVyLm9ubG9hZCA9IChyZXN1bHQpID0+IHtcbiAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgICB0aGlzLmZpbGVVcmwgPSBmaWxlUmVhZGVyLnJlc3VsdCBhcyBzdHJpbmc7XG4gICAgICB0aGlzLnNlbGVjdGVkRmlsZSA9IGZpbGU7XG4gICAgICB0aGlzLnVwbG9hZCgpO1xuICAgIH07XG4gICAgZmlsZVJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xuICB9XG5cbiAgY2hlY2tGaWxlKGZpbGU6IEZpbGUpIHtcbiAgICBpZiAodGhpcy5tYXhTaXplICYmIGZpbGUuc2l6ZSA+IHRoaXMubWF4U2l6ZSkge1xuICAgICAgdGhpcy50b2FzdFNlcnZpY2Uuc2hvdyhcbiAgICAgICAge1xuICAgICAgICAgIGlkOiAnaW1hZ2UtaW52YWxpZC1zaXplJyxcbiAgICAgICAgICB0eXBlOiBUb2FzdFR5cGUuRVJST1IsXG4gICAgICAgICAgdGl0bGU6ICdGZWhsZ2VzY2hsYWdlbicsXG4gICAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgICAnRGllIERhdGVpIGlzdCB6dSBncm/Dny4gRGllIERhdGVpIGRhcmYgbmljaHQgZ3LDtsOfZXIgYWxzICcgK1xuICAgICAgICAgICAgKHRoaXMubWF4U2l6ZSAvICgxMDI0ICogMTAyNCkpLnRvRml4ZWQoMikgK1xuICAgICAgICAgICAgJ01CIHNlaW4uJyxcbiAgICAgICAgfSxcbiAgICAgICAgMzUwMFxuICAgICAgKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMudmFsaWRFeHRlbnNpb25zLmluY2x1ZGVzKGZpbGU/LnR5cGUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy50b2FzdFNlcnZpY2Uuc2hvdyhcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZDogJ2ltYWdlLWludmFsaWQtZm9ybWF0JyxcbiAgICAgICAgICAgIHR5cGU6IFRvYXN0VHlwZS5FUlJPUixcbiAgICAgICAgICAgIHRpdGxlOiAnRmVobGdlc2NobGFnZW4nLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdEYXMgRm9ybWF0IGRlciBEYXRlaSB3aXJkIG5pY2h0IHVudGVyc3TDvHR6dC4nLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgMzUwMFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBmdW5jdGlvbiB0YWtlcyBhbiBldmVudCBhcyBhbiBhcmd1bWVudCwgYW5kIHRoZW4gc2V0cyB0aGUgdXJsIG9mIHRoZSBmaWxlIHRvIHRoZSBmaXJzdCBmaWxlIGluIHRoZSBldmVudCdzXG4gICAqIHRhcmdldCdzIGZpbGVzIGFycmF5XG4gICAqXG4gICAqIEBwYXJhbSBldmVudCAtIGFueSAtIFRoZSBldmVudCB0aGF0IGlzIHRyaWdnZXJlZCB3aGVuIHRoZSB1c2VyIHNlbGVjdHMgYSBmaWxlLlxuICAgKi9cbiAgc2VsZWN0RmlsZShldmVudDogYW55KSB7XG4gICAgaWYgKCF0aGlzLmNoZWNrRmlsZShldmVudC50YXJnZXQuZmlsZXNbMF0pKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY3JvcHBpbmdJbWFnZSkge1xuICAgICAgdGhpcy5jcm9wcGVkSW5Qcm9ncmVzcyA9IHRydWU7XG4gICAgICB0aGlzLmZpbGVFdmVudCA9IGV2ZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldFVybChldmVudC50YXJnZXQuZmlsZXNbMF0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXZSBjcmVhdGUgYSBuZXcgRm9ybURhdGEgb2JqZWN0LCBhcHBlbmQgdGhlIHNlbGVjdGVkIGZpbGUgdG8gaXQsIGFuZCB0aGVuIHNlbmQgaXQgdG8gdGhlIHNlcnZlclxuICAgKi9cbiAgYXN5bmMgdXBsb2FkKCkge1xuICAgIC8vIFByZXBhcmUgZmlsZSBkYXRhXG4gICAgbGV0IGZpbGUgPSB0aGlzLnNlbGVjdGVkRmlsZTtcbiAgICBpZiAodGhpcy5jb21wcmVzc09wdGlvbnMpIHtcbiAgICAgIGZpbGUgPSBhd2FpdCB0aGlzLmZpbGVTZXJ2aWNlLmNvbXByZXNzKGZpbGUsIHRoaXMuY29tcHJlc3NPcHRpb25zKTtcbiAgICB9XG4gICAgY29uc3QgZmlsZURhdGEgPSB7XG4gICAgICBmaWVsZDogdGhpcy5vYmplY3RQYXRoID8gdGhpcy5vYmplY3RQYXRoICsgJy4nICsgdGhpcy5pZCA6IHRoaXMuaWQsXG4gICAgICBmaWxlLFxuICAgICAgYmFzZTY0OiBhd2FpdCB0aGlzLmdldEJhc2U2NChmaWxlKSxcbiAgICB9O1xuXG4gICAgLy8gRW1pdCBmaWxlIGRhdGFcbiAgICB0aGlzLmZpbGVDaGFuZ2VkLmVtaXQoZmlsZURhdGEpO1xuXG4gICAgLy8gU2V0IGNvbnRyb2wgdmFsdWUgYW5kIHVwbG9hZCBkaXJlY3RseSBpZiByZXF1aXJlZFxuICAgIGlmICh0aGlzLnVwbG9hZERpcmVjdGx5KSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmZpbGVTZXJ2aWNlLnVwbG9hZCh0aGlzLnVybCwgdGhpcy51cGxvYWRQYXRoLCB0aGlzLnNlbGVjdGVkRmlsZSk7XG4gICAgICBpZiAocmVzdWx0Py5pZCkge1xuICAgICAgICB0aGlzLmNvbnRyb2wuc2V0VmFsdWUocmVzdWx0LmlkKTtcbiAgICAgICAgdGhpcy5pbWFnZVVwbG9hZGVkLmVtaXQocmVzdWx0LmlkKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb250cm9sLnNldFZhbHVlKHRoaXMubW9kZSA9PT0gJ2Jhc2U2NCcgPyBmaWxlRGF0YS5iYXNlNjQgOiB0aGlzLnNlbGVjdGVkRmlsZSk7XG4gICAgfVxuXG4gICAgLy8gRmluYWwgcHJvY2Vzc2VzXG4gICAgdGhpcy5jb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcbiAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJdCBkZWxldGVzIHRoZSBmaWxlIGZyb20gdGhlIHNlcnZlciBhbmQgc2V0cyB0aGUgc2VsZWN0ZWRGaWxlIGFuZCBmaWxlVXJsIHRvIG51bGxcbiAgICpcbiAgICogQHBhcmFtIFtpZF0gLSBUaGUgaWQgb2YgdGhlIGZpbGUgdG8gZGVsZXRlLlxuICAgKi9cbiAgYXN5bmMgZGVsZXRlRmlsZShpZD86IHN0cmluZykge1xuICAgIGlmICghdGhpcy51cGxvYWREaXJlY3RseSkge1xuICAgICAgdGhpcy5zZWxlY3RlZEZpbGUgPSBudWxsO1xuICAgICAgdGhpcy5maWxlVXJsID0gbnVsbDtcbiAgICAgIHRoaXMuY29udHJvbC5zZXRWYWx1ZSgnJyk7XG4gICAgICB0aGlzLmNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xuICAgICAgdGhpcy5maWxlQ2hhbmdlZC5lbWl0KHtcbiAgICAgICAgZmllbGQ6IHRoaXMub2JqZWN0UGF0aCA/IHRoaXMub2JqZWN0UGF0aCArICcuJyArIHRoaXMuaWQgOiB0aGlzLmlkLFxuICAgICAgICBmaWxlOiBudWxsLFxuICAgICAgICBiYXNlNjQ6IG51bGwsXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgIHRoaXMuc2VsZWN0ZWRGaWxlID0gbnVsbDtcbiAgICB0aGlzLmZpbGVVcmwgPSBudWxsO1xuXG4gICAgaWYgKGlkKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmZpbGVTZXJ2aWNlLmRlbGV0ZSh0aGlzLnVybCwgdGhpcy5kZWxldGVQYXRoLCBpZCk7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRGaWxlID0gbnVsbDtcbiAgICAgICAgdGhpcy5maWxlVXJsID0gbnVsbDtcbiAgICAgICAgdGhpcy5jb250cm9sLnNldFZhbHVlKCcnKTtcbiAgICAgICAgdGhpcy5pbWFnZURlbGV0ZWQuZW1pdCgpO1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCBhIGZpbGUgaW50byBhIEJBU0U2NCBlbmNvZGVkIHN0cmluZ1xuICAgKi9cbiAgcHJvdGVjdGVkIGdldEJhc2U2NChmaWxlKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8c3RyaW5nPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAoIWZpbGUpIHtcbiAgICAgICAgcmV0dXJuIHJlc29sdmUobnVsbCk7XG4gICAgICB9XG4gICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XG4gICAgICByZWFkZXIub25sb2FkID0gKCkgPT4ge1xuICAgICAgICBpZiAoIXJlYWRlci5yZXN1bHQpIHtcbiAgICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcignQ29udmVyc2lvbiBmYWlsZWQnKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZShyZWFkZXIucmVzdWx0LnRvU3RyaW5nKCkpO1xuICAgICAgfTtcbiAgICAgIHJlYWRlci5vbmVycm9yID0gKGVycm9yKSA9PiB7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgYmFzZTY0VG9GaWxlKGJhc2U2NDogc3RyaW5nLCBmaWxlTmFtZTogc3RyaW5nLCBmaWxlVHlwZTogc3RyaW5nKTogUHJvbWlzZTxGaWxlPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPEZpbGU+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGZldGNoKGJhc2U2NClcbiAgICAgICAgLnRoZW4oKHJlcykgPT4gcmVzLmJsb2IoKSlcbiAgICAgICAgLnRoZW4oXG4gICAgICAgICAgKGJsb2IpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUobmV3IEZpbGUoW2Jsb2JdLCBmaWxlTmFtZSwgeyB0eXBlOiBmaWxlVHlwZSB9KSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICAoZXJyKSA9PiB7XG4gICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBpbWFnZUNyb3BwZWQoJGV2ZW50OiBJbWFnZUNyb3BwZWRFdmVudCwgZmlsZUV2ZW50OiBhbnkpIHtcbiAgICBjb25zdCBmaWxlID0gZmlsZUV2ZW50LnRhcmdldC5maWxlc1swXTtcbiAgICB0aGlzLmNyb3BwZWRGaWxlID0gYXdhaXQgdGhpcy5iYXNlNjRUb0ZpbGUoJGV2ZW50LmJhc2U2NCwgZmlsZS5uYW1lLCBmaWxlLnR5cGUpO1xuICB9XG5cbiAgZmluaXNoZWRDcm9wcGluZygpIHtcbiAgICB0aGlzLmZpbGVFdmVudCA9IG51bGw7XG4gICAgdGhpcy5zZXRVcmwodGhpcy5jcm9wcGVkRmlsZSk7XG4gICAgdGhpcy5jcm9wcGVkSW5Qcm9ncmVzcyA9IGZhbHNlO1xuICAgIHRoaXMuY3JvcHBlZEZpbGUgPSBudWxsO1xuICB9XG5cbiAgbG9hZEltYWdlRmFpbGVkKCkge1xuICAgIHRoaXMudG9hc3RTZXJ2aWNlLnNob3coXG4gICAgICB7XG4gICAgICAgIGlkOiAnaW1hZ2UtaW52YWxpZC1jcm9wcGVkJyxcbiAgICAgICAgdHlwZTogVG9hc3RUeXBlLkVSUk9SLFxuICAgICAgICB0aXRsZTogJ0ZlaGxnZXNjaGxhZ2VuJyxcbiAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgJ0VzIGlzdCBlaW4gRmVobGVyIGF1ZmdldHJldGVuLiBCaXR0ZSBwcm9iaWVyZW4gU2llIGVzIHNww6R0ZXIgZXJuZXV0IG9kZXIgd2VuZGVuIFNpZSBzaWNoIGFuIGRlbiBTdXBwb3J0LicsXG4gICAgICB9LFxuICAgICAgMzUwMFxuICAgICk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIG10LTNcIiBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzogY29udHJvbD8uaW52YWxpZCAmJiBjb250cm9sPy50b3VjaGVkIH1cIj5cbiAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICA8bGFiZWwgW2Zvcl09XCJpZFwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiIFtuZ0NsYXNzXT1cInsgcmVxdWlyZWQ6IHJlcXVpcmVkIH1cIiAqbmdJZj1cImxhYmVsXCI+e3sgbGFiZWwgfX08L2xhYmVsPlxuICAgIDxpIGNsYXNzPVwiYmkgYmktaW5mby1jaXJjbGVcIiBbbmdiVG9vbHRpcF09XCJpbmZvVGV4dFwiIHBsYWNlbWVudD1cInN0YXJ0XCIgKm5nSWY9XCJpbmZvVGV4dFwiPjwvaT5cbiAgPC9kaXY+XG5cbiAgPGRpdlxuICAgIFtpZF09XCJvYmplY3RQYXRoID8gb2JqZWN0UGF0aCArICcuJyArIGlkIDogaWRcIlxuICAgIGNsYXNzPVwiZHJhZy1hcmVhXCJcbiAgICAoZHJhZ292ZXIpPVwiZHJhZ092ZXIoJGV2ZW50KVwiXG4gICAgKGRyYWdsZWF2ZSk9XCJkcmFnTGVhdmUoJGV2ZW50KVwiXG4gICAgKGRyb3ApPVwiZHJvcCgkZXZlbnQpXCJcbiAgICBbbmdDbGFzc109XCJ7IGFjdGl2ZTogZHJhZ0FjdGl2ZSwgcG9pbnRlcjogIWxvYWRpbmcsICdpcy1pbnZhbGlkJzogY29udHJvbD8uaW52YWxpZCAmJiBjb250cm9sPy50b3VjaGVkIH1cIlxuICAgIChjbGljayk9XCIhY3JvcHBlZEluUHJvZ3Jlc3MgJiYgIWxvYWRpbmcgJiYgZmlsZUlucHV0LmNsaWNrKClcIlxuICA+XG4gICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCIgKm5nSWY9XCJsb2FkaW5nXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwic3Bpbm5lci1ib3JkZXIgdGV4dC1wcmltYXJ5XCIgcm9sZT1cInN0YXR1c1wiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInZpc3VhbGx5LWhpZGRlblwiPkxvYWRpbmcuLi48L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3RlZEZpbGUgJiYgIWZpbGVFdmVudCAmJiAhY3JvcHBlZEluUHJvZ3Jlc3MgJiYgIWxvYWRpbmdcIj5cbiAgICAgIDxpbWcgW3NyY109XCJmaWxlVXJsXCIgKm5nSWY9XCJzZWxlY3RlZEZpbGVcIiAvPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tZGFuZ2VyXCIgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJkZWxldGVGaWxlKClcIiBiYXNlU3RvcFByb3BhZ2F0aW9uPkzDtnNjaGVuPC9idXR0b24+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udHJvbD8udmFsdWUgJiYgIWZpbGVFdmVudCAmJiAhc2VsZWN0ZWRGaWxlICYmICFsb2FkaW5nICYmICFjcm9wcGVkSW5Qcm9ncmVzc1wiPlxuICAgICAgPGltZyBbc3JjXT1cImNvbnRyb2w/LnZhbHVlLnN0YXJ0c1dpdGgoJ2RhdGE6JykgPyBjb250cm9sPy52YWx1ZSA6IHVybCArIHBhdGggKyBjb250cm9sPy52YWx1ZVwiIC8+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1kYW5nZXJcIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImRlbGV0ZUZpbGUoY29udHJvbD8udmFsdWUpXCIgYmFzZVN0b3BQcm9wYWdhdGlvbj5cbiAgICAgICAgTMO2c2NoZW5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFzZWxlY3RlZEZpbGUgJiYgIWNvbnRyb2w/LnZhbHVlICYmICFsb2FkaW5nICYmICFmaWxlRXZlbnRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJpY29uXCI+XG4gICAgICAgIDxpIGNsYXNzPVwiYmkgYmktaW1hZ2VzXCI+PC9pPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxzcGFuIGNsYXNzPVwiaGVhZGVyXCI+e3sgZHJhZ1RleHQgfX08L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzcz1cImhlYWRlclwiXG4gICAgICAgID57eyBwcmVCdXR0b25UZXh0IH19XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiYnV0dG9uXCIgKGNsaWNrKT1cImZpbGVJbnB1dC5jbGljaygpXCIgYmFzZVN0b3BQcm9wYWdhdGlvbj57eyBidXR0b25UZXh0IH19PC9zcGFuPjwvc3BhblxuICAgICAgPlxuICAgICAgPHNwYW4gY2xhc3M9XCJzdXBwb3J0XCIgW2lubmVyVGV4dF09XCJzdXBwb3J0VGV4dFwiPjwvc3Bhbj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxpbnB1dCB0eXBlPVwiZmlsZVwiIChjaGFuZ2UpPVwic2VsZWN0RmlsZSgkZXZlbnQpXCIgW2F0dHIuYWNjZXB0XT1cInZhbGlkRXh0ZW5zaW9ucz8uam9pbignLCcpXCIgaGlkZGVuICNmaWxlSW5wdXQgLz5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjcm9wcGVkSW5Qcm9ncmVzcyAmJiBmaWxlRXZlbnRcIj5cbiAgICAgIDxpbWFnZS1jcm9wcGVyXG4gICAgICAgIFtpbWFnZUNoYW5nZWRFdmVudF09XCJmaWxlRXZlbnRcIlxuICAgICAgICBbbWFpbnRhaW5Bc3BlY3RSYXRpb109XCJjT3B0aW9ucy5tYWludGFpbkFzcGVjdFJhdGlvXCJcbiAgICAgICAgW2FzcGVjdFJhdGlvXT1cImNPcHRpb25zLmFzcGVjdFJhdGlvXCJcbiAgICAgICAgW2FsaWduSW1hZ2VdPVwiY09wdGlvbnMuYWxpZ25JbWFnZVwiXG4gICAgICAgIFtyZXNpemVUb1dpZHRoXT1cImNPcHRpb25zLnJlc2l6ZVRvV2lkdGhcIlxuICAgICAgICBbcmVzaXplVG9IZWlnaHRdPVwiY09wdGlvbnMucmVzaXplVG9IZWlnaHRcIlxuICAgICAgICBbYXV0b0Nyb3BdPVwiY09wdGlvbnMuYXV0b0Nyb3BcIlxuICAgICAgICBbaW1hZ2VRdWFsaXR5XT1cImNPcHRpb25zLmltYWdlUXVhbGl0eVwiXG4gICAgICAgIFtvbmx5U2NhbGVEb3duXT1cImNPcHRpb25zLm9ubHlTY2FsZURvd25cIlxuICAgICAgICBbZm9ybWF0XT1cImNPcHRpb25zLmZvcm1hdFwiXG4gICAgICAgIChpbWFnZUNyb3BwZWQpPVwiaW1hZ2VDcm9wcGVkKCRldmVudCwgZmlsZUV2ZW50KVwiXG4gICAgICAgIChsb2FkSW1hZ2VGYWlsZWQpPVwibG9hZEltYWdlRmFpbGVkKClcIlxuICAgICAgPjwvaW1hZ2UtY3JvcHBlcj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgbXQtMlwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiZmluaXNoZWRDcm9wcGluZygpXCIgYmFzZVN0b3BQcm9wYWdhdGlvbj5cbiAgICAgICAgWnVzY2huZWlkZW5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwiaW52YWxpZC1mZWVkYmFjayBtLTJcIiAqbmdJZj1cImNvbnRyb2w/LmludmFsaWQgJiYgKGNvbnRyb2w/LmRpcnR5IHx8IGNvbnRyb2w/LnRvdWNoZWQpXCI+XG4gICAgPGRpdiAqbmdJZj1cImNvbnRyb2w/LmVycm9ycz8uWydyZXF1aXJlZCddXCI+RGllc2VzIEZlbGQgaXN0IGVpbiBQZmxpY2h0ZmVsZC48L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==