ngx-edu-sharing-metaqs2 0.9.9 → 0.9.11

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/README.md CHANGED
@@ -1,19 +1,141 @@
1
1
  # NgMetaWidgetsLib
2
2
 
3
3
  This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 18.0.3.
4
+ This library provides the widgets for the MetaDataQualityService.
5
+ A running version of the widgets can be found [here](https://metaqs-2-ng.staging.openeduhub.net/).
4
6
 
5
- ## Code scaffolding
7
+ ## Dependencies
8
+ - Angular 18 _should run with versions down to 16_
9
+ - [ng2-charts](https://valor-software.com/ng2-charts/)
6
10
 
7
- Run `ng generate component component-name --project ng-meta-widgets-lib` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module --project ng-meta-widgets-lib`.
8
- > Note: Don't forget to add `--project ng-meta-widgets-lib` or else it will be added to the default project in your `angular.json` file.
11
+ These are not enforced as peer dependencies, but are required for the widgets to work:
12
+ - [Angular Material](https://material.angular.io/)
13
+ - [ngx-translate](https://github.com/ngx-translate)
14
+ ## Installation
15
+ `npm install ngx-edu-sharing-metaqs2`
16
+
17
+ ## Usage
18
+ This library is provided as an Angular module.
19
+ To use it in your application, import the `NgMetaWidgetsModule` in your `app.module.ts` file:
20
+
21
+ ```typescript
22
+ @NgModule({
23
+ imports: [
24
+
25
+ NgMetaWidgetsLibModule.forRoot({
26
+ eduSharingPath: environment.eduSharingPath,
27
+ apiPath: environment.apiPath,
28
+ useDummyValues: environment.useDummyValues,
29
+ })
30
+ ]})
31
+ ```
32
+ or in a standalone Application declare the module in the `app.config.ts` file:
33
+ ```typescript
34
+ export const appConfig: ApplicationConfig = {
35
+ providers: [
36
+
37
+ importProvidersFrom(NgMetaWidgetsLibModule.forRoot({
38
+ eduSharingPath: environment.eduSharingPath,
39
+ apiPath: environment.apiPath,
40
+ useDummyValues: false,
41
+ }))
42
+ ]
43
+ };
44
+
45
+ ```
46
+
47
+ where `eduSharingPath` and `apiPath` are the base paths to the edu-sharing frontend (e.g. https://redaktion.openeduhub.net/edu-sharing) and the MetaDataQualityService backend (e.g. https://metaqs-2.staging.openeduhub.net) respectively.
48
+
49
+ ## Widgets
50
+ This library provides the following widgets:
51
+
52
+ ### Metadatenvollständigkeit von Sammlungen
53
+ [TreeCollectionDetailsComponent](./src/lib/tree-collection-details/tree-collection-details.component.ts)
54
+ selector: `<app-tree-collection-details />`
55
+ ### Metadatenvollständigkeit von Quellen
56
+ [QualityMatrixComponent](./src/lib/components/quality-matrix/quality_matrix.ts)
57
+ selector: `<app-quality-matrix-v2 />`
58
+ ### Material in Sammlungen
59
+ [TreeSearchCountsComponent](./src/lib/tree-search-counts/tree-search-counts.component.ts)
60
+ selector: `<app-tree-search-counts />`
61
+ ### Sammlungsverlauf
62
+ Übersicht über die Anzahl der Materialien in Sammlungen über die Zeit.
63
+ [CollectionCountHistoryComponent](./src/lib/collection-count-history/collection-count-history.component.ts)
64
+
65
+ ### Counts with History
66
+ [CountHistoryComponent](./src/lib/counts-with-history/counts-with-history.component.ts)
67
+ selector: `<lib-counts-with-history />`.
68
+
69
+ This is a generic component that can be used to display counts with a history.
70
+ It can be configered by providing the follwing data structure in it's routing configuration:
71
+ ```javascript
72
+ {
73
+ path: 'content-type-count',
74
+ component: CountsWithHistoryComponent,
75
+ data: {
76
+ title: 'pageTitle.content-type-count', // translation key for the title
77
+ apiMethod: 'getMaterialTypeCountsByReplicationSource', // the method to call on the MetaApiService
78
+ columnTranslationkey: 'issues.', // translation key for the columns (optional)
79
+ },
80
+ }
81
+ ```
82
+ Currently the following manifestations are implemented:
83
+ #### Materialtypen nach Quellen
84
+ ```javascript
85
+ {
86
+ path: 'content-type-count',
87
+ component: CountsWithHistoryComponent,
88
+ data: { title: 'pageTitle.content-type-count', apiMethod: 'getMaterialTypeCountsByReplicationSource' }
89
+ }
90
+ ```
91
+ #### Lizenzarten nach Quellen
92
+
93
+ ```javascript
94
+ {
95
+ path: 'license-count-sources',
96
+ component: CountsWithHistoryComponent,
97
+ data: { title: 'pageTitle.license-count-sources', apiMethod: 'getLicenseCountsByReplicationSource' },
98
+ },
99
+ ```
100
+ #### Lizenzarten nach Sammlungen
101
+ ```javascript
102
+ {
103
+ path: 'license-count-collections',
104
+ component: CountsWithHistoryComponent,
105
+ data: { title: 'pageTitle.license-count-collections', apiMethod: 'getMaterialCountMatrixByLicenseGroup' },
106
+ }
107
+ ```
108
+ #### Quellen und ihre Qualitätsprobleme
109
+ ```javascript
110
+ {
111
+ path: 'issues-replicationsources',
112
+ component: CountsWithHistoryComponent,
113
+ data: {
114
+ title: 'pageTitle.issues-replicationsources',
115
+ apiMethod: 'getCompletenessForReplicationSources',
116
+ columnTranslationkey: 'issues.'},
117
+ },
118
+ ```
119
+ #### Fachportale und ihre Qualitätsprobleme
120
+ ```javascript
121
+ {
122
+ path: 'issues-collections',
123
+ component: CountsWithHistoryComponent,
124
+ data: {
125
+ title: 'pageTitle.issues-collections',
126
+ apiMethod: 'getCompletenessForDisciplinaryPortals',
127
+ columnTranslationkey: 'issues.',
128
+ }
129
+ },
130
+ ```
9
131
 
10
132
  ## Build
11
133
 
12
- Run `ng build ng-meta-widgets-lib` to build the project. The build artifacts will be stored in the `dist/` directory.
134
+ Run `ng build ng-meta-widgets-lib -c production` to build the project. The build artifacts will be stored in the `dist/` directory.
13
135
 
14
136
  ## Publishing
15
-
16
- After building your library with `ng build ng-meta-widgets-lib`, go to the dist folder `cd dist/ng-meta-widgets-lib` and run `npm publish`.
137
+ The gitlab pipeline is configured to publish the library to npm on every tag.
138
+ Run the `publish` job in the pipeline manually to publish the library to npm.
17
139
 
18
140
  ## Running unit tests
19
141
 
@@ -75,14 +75,13 @@ export class CountsWithHistoryComponent {
75
75
  .getTimerangeFilter()
76
76
  .pipe(finalize(() => {
77
77
  this.timeFilterLoaded.set(true);
78
- this.registerDateRangeFilter();
79
78
  }))
80
79
  .subscribe((rangeFilter) => {
81
80
  if (rangeFilter) {
82
81
  const startDate = DateTime.fromISO(rangeFilter.values.find((v) => v.id === 'rangeStart')?.label, {
83
82
  zone: 'utc',
84
83
  }).startOf('day');
85
- this.range.setControl('start', new FormControl(startDate, { nonNullable: true }));
84
+ this.range.controls.start.setValue(startDate);
86
85
  }
87
86
  });
88
87
  }
@@ -113,6 +112,7 @@ export class CountsWithHistoryComponent {
113
112
  return { delta, trend, value: pastValue };
114
113
  }
115
114
  ngOnInit() {
115
+ this.registerDateRangeFilter();
116
116
  this.route.data.pipe(take(1)).subscribe(({ columnTranslationkey = null, title, apiMethod }) => {
117
117
  this.columnTranslationkey = columnTranslationkey;
118
118
  this.pageTitle.next(title);
@@ -158,4 +158,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
158
158
  AsyncPipe,
159
159
  ], template: "<mat-card appearance=\"raised\">\n <mat-card-header>\n <mat-card-title data-test-id=\"page-title\">\n Qualit\u00E4tsmetrik: {{(pageTitle | async ) || '' | translate}}{{isLoading() ? \": Lade neue Daten.\" : \"\"}}\n </mat-card-title>\n </mat-card-header>\n <!-- consider to put the filter in the table header to avoid that it is scrolled out of view-->\n <!-- show the filter after the values are loaded to avoid loading current data twice -->\n <mat-card-content *ngIf=\"timeFilterLoaded()\">\n <lib-datepicker [disabled]=\"isLoading()\" [inputGroup]=\"range\" ></lib-datepicker>\n </mat-card-content>\n</mat-card>\n<mat-card>\n <table [ngClass]=\"{'while-loading': isLoading()}\" mat-table [dataSource]=\"recentTypeCount$.value.rows\" class=\"quality-matrix\">\n <!-- Define columns of table -->\n <!-- Row Header Column -->\n <ng-container matColumnDef=\"label-col\" sticky>\n <th rowspan=\"2\" mat-header-cell *matHeaderCellDef>Quelle</th>\n <td\n mat-cell\n *matCellDef=\"let row\"\n matTooltip=\"{{row.meta.alt_label}}\"\n class=\"label-col\"\n >\n {{row.meta.label}}\n </td>\n </ng-container>\n <!-- one column for each type -->\n <ng-container *ngFor=\"let col of recentTypeCount$.value.columns; trackBy:columnIdent\" [matColumnDef]=\"col.id + '_type'\">\n <th colspan=\"2\" mat-header-cell *matHeaderCellDef matTooltip=\"{{col.label}}\" >\n {{columnTranslationkey ? (columnTranslationkey + col.label | translate ) : col.label }}\n </th>\n </ng-container>\n <!-- one column for each type for the most current date-->\n <ng-container *ngFor=\"let col of recentTypeCount$.value.columns; trackBy:columnIdent\" [matColumnDef]=\"col.id + '_recent'\">\n <th class=\"recent-data-cell\" mat-header-cell *matHeaderCellDef matTooltip=\"no tooltip\" >{{ range.controls.end.value.toLocaleString(DateTime.DATE_SHORT) }}</th>\n <td class=\"recent-data-cell\" mat-cell *matCellDef=\"let row\">{{ row.counts[col.id] ?? 'n/a' }}</td>\n </ng-container>\n <!-- one column for each type for the older date-->\n <ng-container *ngFor=\"let col of recentTypeCount$.value.columns; trackBy:columnIdent\" [matColumnDef]=\"col.id + '_past'\">\n <th class=\"past-data-cell\" mat-header-cell *matHeaderCellDef matTooltip=\"no tooltip\" >\n {{ pastTypeCount$.value.rows.length ? range.controls.start.value.toLocaleString(DateTime.DATE_SHORT) : 'no past data' }}\n </th>\n <td class=\"past-data-cell\" mat-cell *matCellDef=\"let row;\">\n <ng-container *ngIf=\"pastTypeCount$.value.rows.length && pastTypeCount(row, col.id) as trend\">\n <span [ngClass]=\"trend.trend\"> {{ trend.value ?? 'n/a' }}<mat-icon aria-hidden=\"false\" [attr.aria-label]=\"trend.trend\" [fontIcon]=\"trend.trend!\" /></span>\n <span class=\"cdk-visually-hidden\">{{trend.trend}}</span>\n </ng-container>\n </td>\n </ng-container>\n <!-- generate actual table -->\n <tr mat-header-row *matHeaderRowDef=\"['label-col'].concat(typeColumns); sticky:true;\"></tr>\n <tr mat-header-row *matHeaderRowDef=\"allColumns; sticky: true;\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: ['label-col'].concat(allColumns)\"></tr>\n\n </table>\n</mat-card>", styles: ["tr:nth-child(2n){background-color:#e4e4e4}tr:nth-child(2n)>td.label-col,tr:nth-child(2n) td.recent-data-cell{border-right:1px solid white}tr:nth-child(odd){background-color:#fff}tr:nth-child(odd)>td.label-col,tr:nth-child(odd) td.recent-data-cell{border-right:1px solid #e4e4e4}td.label-col{text-align:left}.mat-mdc-header-cell,.mat-mdc-cell{text-align:center}.mat-mdc-header-cell a,.mat-mdc-cell a{cursor:pointer;text-decoration:underline}.mat-mdc-header-cell a:hover,.mat-mdc-cell a:hover{text-decoration:underline}.mat-mdc-header-cell mat-icon,.mat-mdc-cell mat-icon{margin-left:5px;vertical-align:middle}.trending_up{color:#4abeff}.trending_down{color:#c20808}\n"] }]
160
160
  }], ctorParameters: () => [{ type: i1.MetaApiService }, { type: i2.ActivatedRoute }] });
161
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY291bnRzLXdpdGgtaGlzdG9yeS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1tZXRhLXdpZGdldHMtbGliL3NyYy9saWIvY291bnRzLXdpdGgtaGlzdG9yeS9jb3VudHMtd2l0aC1oaXN0b3J5LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLW1ldGEtd2lkZ2V0cy1saWIvc3JjL2xpYi9jb3VudHMtd2l0aC1oaXN0b3J5L2NvdW50cy13aXRoLWhpc3RvcnkuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBcUIsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0csT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3JILE9BQU8sRUFBRSxlQUFlLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzVELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFHcEUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUNqQyxPQUFPLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxT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cnQgeyBDb21wb25lbnQsIE9uRGVzdHJveSwgT25Jbml0LCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1hdENhcmQsIE1hdENhcmRDb250ZW50LCBNYXRDYXJkSGVhZGVyLCBNYXRDYXJkTW9kdWxlLCBNYXRDYXJkVGl0bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jYXJkJztcbmltcG9ydCB7IE1hdFRvb2x0aXAgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcbmltcG9ydCB7IE1hdEhlYWRlclJvdywgTWF0SGVhZGVyUm93RGVmLCBNYXRSb3csIE1hdFJvd0RlZiwgTWF0VGFibGUsIE1hdFRhYmxlTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IEFzeW5jUGlwZSwgTmdDbGFzcywgTmdGb3JPZiwgTmdJZiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBNZXRhQXBpU2VydmljZSB9IGZyb20gJy4uL21ldGEtYXBpLnNlcnZpY2UnO1xuaW1wb3J0IHsgRmlsdGVyLCBNYXRyaXhSb3dXaXRoQ291bnRzLCBNYXRyaXhXaXRoQ291bnRzLCBRdWFsaXR5TWF0cml4SGVhZGVyIH0gZnJvbSAnLi4vamF2YS1hcGknO1xuaW1wb3J0IHsgRGF0ZVRpbWUgfSBmcm9tICdsdXhvbic7XG5pbXBvcnQgeyBmaW5hbGl6ZSwgdGFrZSwgdGFrZVVudGlsLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRGF0ZXBpY2tlckNvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvZmlsdGVyL2RhdGVwaWNrZXIvZGF0ZXBpY2tlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgTWF0SWNvbiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItY291bnRzLXdpdGgtaGlzdG9yeScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBNYXRDYXJkTW9kdWxlLFxuICAgIE1hdENhcmQsXG4gICAgTWF0Q2FyZEhlYWRlcixcbiAgICBNYXRDYXJkVGl0bGUsXG4gICAgTWF0Q2FyZENvbnRlbnQsXG4gICAgTWF0VG9vbHRpcCxcbiAgICBNYXRUYWJsZU1vZHVsZSxcbiAgICBNYXRUYWJsZSxcbiAgICBUcmFuc2xhdGVNb2R1bGUsXG4gICAgTWF0SGVhZGVyUm93LFxuICAgIE1hdEhlYWRlclJvd0RlZixcbiAgICBNYXRSb3csXG4gICAgTWF0Um93RGVmLFxuICAgIE5nRm9yT2YsXG4gICAgRGF0ZXBpY2tlckNvbXBvbmVudCxcbiAgICBOZ0NsYXNzLFxuICAgIE1hdEljb24sXG4gICAgTmdJZixcbiAgICBBc3luY1BpcGUsXG4gIF0sXG4gIHRlbXBsYXRlVXJsOiAnLi9jb3VudHMtd2l0aC1oaXN0b3J5LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL2NvdW50cy13aXRoLWhpc3RvcnkuY29tcG9uZW50LnNjc3MnLFxufSlcbmV4cG9ydCBjbGFzcyBDb3VudHNXaXRoSGlzdG9yeUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGlzTG9hZGluZyA9IHNpZ25hbCh0cnVlKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHRpbWVGaWx0ZXJMb2FkZWQgPSBzaWduYWwoZmFsc2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3llZCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVjZW50VHlwZUNvdW50JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8TWF0cml4V2l0aENvdW50cz4oeyBjb2x1bW5zOiBbXSwgcm93czogW10gfSk7XG4gIHByb3RlY3RlZCByZWFkb25seSBwYXN0VHlwZUNvdW50JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8TWF0cml4V2l0aENvdW50cz4oeyBjb2x1bW5zOiBbXSwgcm93czogW10gfSk7XG4gIHByb3RlY3RlZCByZWFkb25seSBwYWdlVGl0bGUgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZyB8IG51bGw+KG51bGwpO1xuICBwcml2YXRlIGNvbHVtbnM6IFF1YWxpdHlNYXRyaXhIZWFkZXJbXSA9IFtdO1xuICBwcml2YXRlIGFwaU1ldGhvZDoga2V5b2YgTWV0YUFwaVNlcnZpY2UgPSAnZ2V0TWF0ZXJpYWxUeXBlQ291bnRzQnlSZXBsaWNhdGlvblNvdXJjZSc7XG5cbiAgLyogSW4gdGhpcyB3aWRnZXQncyBiYWNrZW5kIHdlIGRvIGhhdmUgZGF0YSBmb3IgdG9kYXlcbiAgICogdGhlcmVmb3JlIHdlIHNldCB0aGUgZW5kIGRhdGUgdG8gdG9kYXkgYW5kIHVzZSB0aGUgdGltZXJhbmdlKCkgZW5kcG9pbnQgdG8gb25seSBzZXQgdGhlIHN0YXJ0IGRhdGVcbiAgICovXG4gIHJlYWRvbmx5IHJhbmdlOiBGb3JtR3JvdXA8e1xuICAgIHN0YXJ0OiBGb3JtQ29udHJvbDxEYXRlVGltZTxib29sZWFuPj47XG4gICAgZW5kOiBGb3JtQ29udHJvbDxEYXRlVGltZTxib29sZWFuPj47XG4gIH0+ID0gbmV3IEZvcm1Hcm91cCh7XG4gICAgc3RhcnQ6IG5ldyBGb3JtQ29udHJvbCgpLFxuICAgIGVuZDogbmV3IEZvcm1Db250cm9sKERhdGVUaW1lLnV0YygpLnN0YXJ0T2YoJ2RheScpLCB7IG5vbk51bGxhYmxlOiB0cnVlIH0pLFxuICB9KTtcbiAgcHJvdGVjdGVkIGNvbHVtblRyYW5zbGF0aW9ua2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IG1ldGFBcGk6IE1ldGFBcGlTZXJ2aWNlLCBwcml2YXRlIHJlYWRvbmx5IHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSkge1xuICAgIHRoaXMucGFnZVRpdGxlLm5leHQoJ0hhbGxvIFdlbHQnKTtcbiAgfVxuICBjb2x1bW5JZGVudChfaW5kZXg6IG51bWJlciwgY29sOiBRdWFsaXR5TWF0cml4SGVhZGVyKSB7XG4gICAgcmV0dXJuIGNvbC5pZDtcbiAgfVxuXG4gIGdldCB0eXBlQ29sdW1ucygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuY29sdW1ucy5tYXAoKGMpID0+IGMuaWQgKyAnX3R5cGUnKTtcbiAgfVxuXG4gIGdldCByZWNlbnRDb2x1bW5zKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5jb2x1bW5zLm1hcCgoYykgPT4gYy5pZCArICdfcmVjZW50Jyk7XG4gIH1cblxuICBnZXQgcGFzdENvbHVtbnMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmNvbHVtbnMubWFwKChjKSA9PiBjLmlkICsgJ19wYXN0Jyk7XG4gIH1cblxuICBnZXQgYWxsQ29sdW1ucygpOiBzdHJpbmdbXSB7XG4gICAgLy9yZXR1cm4gdGhpcy5yZWNlbnRDb2x1bW5zO1xuICAgIHJldHVybiB0aGlzLnBhc3RDb2x1bW5zLmZsYXRNYXAoKGUsIGkpID0+IFtlLCB0aGlzLnJlY2VudENvbHVtbnNbaV1dKTtcbiAgfVxuICBwcml2YXRlIHJlZ2lzdGVyRGF0ZVJhbmdlRmlsdGVyKCkge1xuICAgIC8qIHdlIGNhbm5vdCB1c2UgdGhlIHRha2VVbnRpbERlc3Ryb3llZCgpIGhlbHBlciBoZXJlLFxuICAgICAqIGJlY2F1c2UgdGhpcyBtZXRob2QgaXMgaW5kaXJlY3RseSBjYWxsZWQgaW4gdGhlIGZpbmFsaXphdGlvbiBvZiB0aGUgZ2V0VGltZXJhbmdlRmlsdGVyKCkgY2FsbFxuICAgICAqL1xuICAgIHRoaXMucmFuZ2UuY29udHJvbHMuZW5kLnZhbHVlQ2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3llZCQpKS5zdWJzY3JpYmUoKGRhdGUpID0+IHtcbiAgICAgIHRoaXMuZ2V0Q291bnRCeURhdGUoZGF0ZSkuc3Vic2NyaWJlKChyZXNwb25zZSkgPT4ge1xuICAgICAgICB0aGlzLnJlY2VudFR5cGVDb3VudCQubmV4dChyZXNwb25zZSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICB0aGlzLnJhbmdlLmNvbnRyb2xzLnN0YXJ0LnZhbHVlQ2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3llZCQpKS5zdWJzY3JpYmUoKGRhdGUpID0+IHtcbiAgICAgIHRoaXMuZ2V0Q291bnRCeURhdGUoZGF0ZSkuc3Vic2NyaWJlKChyZXNwb25zZSkgPT4ge1xuICAgICAgICB0aGlzLnBhc3RUeXBlQ291bnQkLm5leHQocmVzcG9uc2UpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldFRpbWVSYW5nZUZpbHRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5tZXRhQXBpXG4gICAgICAuZ2V0VGltZXJhbmdlRmlsdGVyKClcbiAgICAgIC5waXBlKFxuICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy50aW1lRmlsdGVyTG9hZGVkLnNldCh0cnVlKTtcbiAgICAgICAgICB0aGlzLnJlZ2lzdGVyRGF0ZVJhbmdlRmlsdGVyKCk7XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChyYW5nZUZpbHRlcikgPT4ge1xuICAgICAgICBpZiAocmFuZ2VGaWx0ZXIpIHtcbiAgICAgICAgICBjb25zdCBzdGFydERhdGUgPSBEYXRlVGltZS5mcm9tSVNPKHJhbmdlRmlsdGVyLnZhbHVlcy5maW5kKCh2KSA9PiB2LmlkID09PSAncmFuZ2VTdGFydCcpPy5sYWJlbCEsIHtcbiAgICAgICAgICAgIHpvbmU6ICd1dGMnLFxuICAgICAgICAgIH0pLnN0YXJ0T2YoJ2RheScpO1xuICAgICAgICAgIHRoaXMucmFuZ2Uuc2V0Q29udHJvbCgnc3RhcnQnLCBuZXcgRm9ybUNvbnRyb2w8RGF0ZVRpbWU+KHN0YXJ0RGF0ZSwgeyBub25OdWxsYWJsZTogdHJ1ZSB9KSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDb3VudEJ5RGF0ZShkYXRlOiBEYXRlVGltZSk6IE9ic2VydmFibGU8TWF0cml4V2l0aENvdW50cz4ge1xuICAgIHRoaXMuaXNMb2FkaW5nLnNldCh0cnVlKTtcbiAgICBjb25zdCBmaWx0ZXI6IEZpbHRlciA9IHtcbiAgICAgIGZpZWxkOiAnYXNPZicsXG4gICAgICB2YWx1ZXM6IFt7IGlkOiBkYXRlLnRvSVNPKHsgaW5jbHVkZU9mZnNldDogZmFsc2UgfSkhLCBsYWJlbDogJycgfV0sXG4gICAgfTtcbiAgICAvLyB0eXBlIG9mIHRoaXMubWV0YUFwaVt0aGlzLmFwaU1ldGhvZF0oW2ZpbHRlcl0pIGlzIE9ic2VydmFibGU8TWF0cml4V2l0aENvdW50cz5cbiAgICAvLyBidXQgdHlwZXNjcmlwdCBkb2VzIG5vdCBrbm93IHRoYXRcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgcmV0dXJuIHRoaXMubWV0YUFwaVt0aGlzLmFwaU1ldGhvZF0oW2ZpbHRlcl0pLnBpcGUoZmluYWxpemUoKCkgPT4gdGhpcy5pc0xvYWRpbmcuc2V0KGZhbHNlKSkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHBhc3RUeXBlQ291bnQocm93OiBNYXRyaXhSb3dXaXRoQ291bnRzLCBjb2x1bW5pZDogc3RyaW5nKSB7XG4gICAgaWYgKCF0aGlzLnBhc3RUeXBlQ291bnQkLnZhbHVlLnJvd3MubGVuZ3RoKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIGNvbnN0IHBhc3Rfcm93ID0gdGhpcy5wYXN0VHlwZUNvdW50JC52YWx1ZS5yb3dzLmZpbmQoKHByKSA9PiBwci5tZXRhLmlkID09IHJvdy5tZXRhLmlkKTtcbiAgICBjb25zdCBwYXN0X2NvbHVtbiA9IHRoaXMucGFzdFR5cGVDb3VudCQudmFsdWUuY29sdW1ucy5maW5kKChjKSA9PiBjLmlkID09IGNvbHVtbmlkKTtcbiAgICBpZiAoIXBhc3Rfcm93IHx8ICFwYXN0X2NvbHVtbikge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHJvdy5jb3VudHNbY29sdW1uaWRdO1xuICAgIGNvbnN0IHBhc3RWYWx1ZSA9IHBhc3Rfcm93LmNvdW50c1tjb2x1bW5pZF07XG5cbiAgICBjb25zdCBkZWx0YSA9IChjdXJyZW50VmFsdWUgfHwgMCkgLSAocGFzdFZhbHVlIHx8IDApO1xuICAgIGNvbnN0IHRyZW5kID0gZGVsdGEgPT09IDAgPyAndHJlbmRpbmdfZmxhdCcgOiBkZWx0YSA8IDAgPyAndHJlbmRpbmdfZG93bicgOiAndHJlbmRpbmdfdXAnO1xuICAgIHJldHVybiB7IGRlbHRhLCB0cmVuZCwgdmFsdWU6IHBhc3RWYWx1ZSB9O1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5yb3V0ZS5kYXRhLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKCh7IGNvbHVtblRyYW5zbGF0aW9ua2V5ID0gbnVsbCwgdGl0bGUsIGFwaU1ldGhvZCB9KSA9PiB7XG4gICAgICB0aGlzLmNvbHVtblRyYW5zbGF0aW9ua2V5ID0gY29sdW1uVHJhbnNsYXRpb25rZXk7XG4gICAgICB0aGlzLnBhZ2VUaXRsZS5uZXh0KHRpdGxlKTtcbiAgICAgIHRoaXMuYXBpTWV0aG9kID0gYXBpTWV0aG9kO1xuICAgICAgdGhpcy5nZXRUaW1lUmFuZ2VGaWx0ZXIoKTtcbiAgICAgIHRoaXMuZ2V0Q291bnRCeURhdGUodGhpcy5yYW5nZS5jb250cm9scy5lbmQudmFsdWUpXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHRhcCgocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY29sdW1ucyA9IHJlc3BvbnNlLmNvbHVtbnMuc2xpY2UoKTtcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgdGhpcy5yZWNlbnRUeXBlQ291bnQkLm5leHQocmVzcG9uc2UpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZWFkb25seSBEYXRlVGltZSA9IERhdGVUaW1lO1xuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveWVkJC5uZXh0KCk7XG4gICAgdGhpcy5kZXN0cm95ZWQkLmNvbXBsZXRlKCk7XG4gIH1cbn1cbiIsIjxtYXQtY2FyZCBhcHBlYXJhbmNlPVwicmFpc2VkXCI+XG4gIDxtYXQtY2FyZC1oZWFkZXI+XG4gICAgPG1hdC1jYXJkLXRpdGxlIGRhdGEtdGVzdC1pZD1cInBhZ2UtdGl0bGVcIj5cbiAgICAgIFF1YWxpdMOkdHNtZXRyaWs6IHt7KHBhZ2VUaXRsZSB8IGFzeW5jICkgfHwgJycgfCB0cmFuc2xhdGV9fXt7aXNMb2FkaW5nKCkgPyBcIjogTGFkZSBuZXVlIERhdGVuLlwiIDogXCJcIn19XG4gICAgPC9tYXQtY2FyZC10aXRsZT5cbiAgPC9tYXQtY2FyZC1oZWFkZXI+XG4gIDwhLS0gY29uc2lkZXIgdG8gcHV0IHRoZSBmaWx0ZXIgaW4gdGhlIHRhYmxlIGhlYWRlciB0byBhdm9pZCB0aGF0IGl0IGlzIHNjcm9sbGVkIG91dCBvZiB2aWV3LS0+XG4gIDwhLS0gc2hvdyB0aGUgZmlsdGVyIGFmdGVyIHRoZSB2YWx1ZXMgYXJlIGxvYWRlZCB0byBhdm9pZCBsb2FkaW5nIGN1cnJlbnQgZGF0YSB0d2ljZSAtLT5cbiAgPG1hdC1jYXJkLWNvbnRlbnQgKm5nSWY9XCJ0aW1lRmlsdGVyTG9hZGVkKClcIj5cbiAgICA8bGliLWRhdGVwaWNrZXIgW2Rpc2FibGVkXT1cImlzTG9hZGluZygpXCIgW2lucHV0R3JvdXBdPVwicmFuZ2VcIiA+PC9saWItZGF0ZXBpY2tlcj5cbiAgPC9tYXQtY2FyZC1jb250ZW50PlxuPC9tYXQtY2FyZD5cbjxtYXQtY2FyZD5cbiAgPHRhYmxlIFtuZ0NsYXNzXT1cInsnd2hpbGUtbG9hZGluZyc6IGlzTG9hZGluZygpfVwiIG1hdC10YWJsZSBbZGF0YVNvdXJjZV09XCJyZWNlbnRUeXBlQ291bnQkLnZhbHVlLnJvd3NcIiBjbGFzcz1cInF1YWxpdHktbWF0cml4XCI+XG4gICAgPCEtLSBEZWZpbmUgY29sdW1ucyBvZiB0YWJsZSAtLT5cbiAgICA8IS0tIFJvdyBIZWFkZXIgQ29sdW1uIC0tPlxuICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwibGFiZWwtY29sXCIgc3RpY2t5PlxuICAgICAgPHRoIHJvd3NwYW49XCIyXCIgbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPlF1ZWxsZTwvdGg+XG4gICAgICA8dGRcbiAgICAgICAgbWF0LWNlbGxcbiAgICAgICAgKm1hdENlbGxEZWY9XCJsZXQgcm93XCJcbiAgICAgICAgbWF0VG9vbHRpcD1cInt7cm93Lm1ldGEuYWx0X2xhYmVsfX1cIlxuICAgICAgICBjbGFzcz1cImxhYmVsLWNvbFwiXG4gICAgICA+XG4gICAgICAgIHt7cm93Lm1ldGEubGFiZWx9fVxuICAgICAgPC90ZD5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8IS0tIG9uZSBjb2x1bW4gZm9yIGVhY2ggdHlwZSAtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2wgb2YgcmVjZW50VHlwZUNvdW50JC52YWx1ZS5jb2x1bW5zOyB0cmFja0J5OmNvbHVtbklkZW50XCIgW21hdENvbHVtbkRlZl09XCJjb2wuaWQgKyAnX3R5cGUnXCI+XG4gICAgICA8dGggY29sc3Bhbj1cIjJcIiBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgbWF0VG9vbHRpcD1cInt7Y29sLmxhYmVsfX1cIiA+XG4gICAgICAgIHt7Y29sdW1uVHJhbnNsYXRpb25rZXkgPyAoY29sdW1uVHJhbnNsYXRpb25rZXkgKyBjb2wubGFiZWwgfCB0cmFuc2xhdGUgKSA6IGNvbC5sYWJlbCB9fVxuICAgICAgPC90aD5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8IS0tIG9uZSBjb2x1bW4gZm9yIGVhY2ggdHlwZSBmb3IgdGhlIG1vc3QgY3VycmVudCBkYXRlLS0+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sIG9mIHJlY2VudFR5cGVDb3VudCQudmFsdWUuY29sdW1uczsgdHJhY2tCeTpjb2x1bW5JZGVudFwiIFttYXRDb2x1bW5EZWZdPVwiY29sLmlkICsgJ19yZWNlbnQnXCI+XG4gICAgICA8dGggY2xhc3M9XCJyZWNlbnQtZGF0YS1jZWxsXCIgbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIG1hdFRvb2x0aXA9XCJubyB0b29sdGlwXCIgPnt7IHJhbmdlLmNvbnRyb2xzLmVuZC52YWx1ZS50b0xvY2FsZVN0cmluZyhEYXRlVGltZS5EQVRFX1NIT1JUKSB9fTwvdGg+XG4gICAgICA8dGQgY2xhc3M9XCJyZWNlbnQtZGF0YS1jZWxsXCIgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93XCI+e3sgcm93LmNvdW50c1tjb2wuaWRdID8/ICduL2EnIH19PC90ZD5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8IS0tIG9uZSBjb2x1bW4gZm9yIGVhY2ggdHlwZSBmb3IgdGhlIG9sZGVyIGRhdGUtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2wgb2YgcmVjZW50VHlwZUNvdW50JC52YWx1ZS5jb2x1bW5zOyB0cmFja0J5OmNvbHVtbklkZW50XCIgW21hdENvbHVtbkRlZl09XCJjb2wuaWQgKyAnX3Bhc3QnXCI+XG4gICAgICA8dGggY2xhc3M9XCJwYXN0LWRhdGEtY2VsbFwiIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBtYXRUb29sdGlwPVwibm8gdG9vbHRpcFwiID5cbiAgICAgICAge3sgcGFzdFR5cGVDb3VudCQudmFsdWUucm93cy5sZW5ndGggPyByYW5nZS5jb250cm9scy5zdGFydC52YWx1ZS50b0xvY2FsZVN0cmluZyhEYXRlVGltZS5EQVRFX1NIT1JUKSA6ICdubyBwYXN0IGRhdGEnIH19XG4gICAgICA8L3RoPlxuICAgICAgPHRkIGNsYXNzPVwicGFzdC1kYXRhLWNlbGxcIiBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3c7XCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJwYXN0VHlwZUNvdW50JC52YWx1ZS5yb3dzLmxlbmd0aCAmJiBwYXN0VHlwZUNvdW50KHJvdywgY29sLmlkKSBhcyB0cmVuZFwiPlxuICAgICAgICAgIDxzcGFuIFtuZ0NsYXNzXT1cInRyZW5kLnRyZW5kXCI+IHt7IHRyZW5kLnZhbHVlID8/ICduL2EnIH19PG1hdC1pY29uIGFyaWEtaGlkZGVuPVwiZmFsc2VcIiBbYXR0ci5hcmlhLWxhYmVsXT1cInRyZW5kLnRyZW5kXCIgW2ZvbnRJY29uXT1cInRyZW5kLnRyZW5kIVwiIC8+PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2RrLXZpc3VhbGx5LWhpZGRlblwiPnt7dHJlbmQudHJlbmR9fTwvc3Bhbj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L3RkPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwhLS0gZ2VuZXJhdGUgYWN0dWFsIHRhYmxlIC0tPlxuICAgIDx0ciBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwiWydsYWJlbC1jb2wnXS5jb25jYXQodHlwZUNvbHVtbnMpOyBzdGlja3k6dHJ1ZTtcIj48L3RyPlxuICAgIDx0ciBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwiYWxsQ29sdW1uczsgc3RpY2t5OiB0cnVlO1wiPjwvdHI+XG4gICAgPHRyIG1hdC1yb3cgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IFsnbGFiZWwtY29sJ10uY29uY2F0KGFsbENvbHVtbnMpXCI+PC90cj5cblxuICA8L3RhYmxlPlxuPC9tYXQtY2FyZD4iXX0=
161
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY291bnRzLXdpdGgtaGlzdG9yeS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1tZXRhLXdpZGdldHMtbGliL3NyYy9saWIvY291bnRzLXdpdGgtaGlzdG9yeS9jb3VudHMtd2l0aC1oaXN0b3J5LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLW1ldGEtd2lkZ2V0cy1saWIvc3JjL2xpYi9jb3VudHMtd2l0aC1oaXN0b3J5L2NvdW50cy13aXRoLWhpc3RvcnkuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBcUIsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0csT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3JILE9BQU8sRUFBRSxlQUFlLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzVELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFHcEUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUNqQyxPQUFPLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxT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bCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWF0Q2FyZCwgTWF0Q2FyZENvbnRlbnQsIE1hdENhcmRIZWFkZXIsIE1hdENhcmRNb2R1bGUsIE1hdENhcmRUaXRsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NhcmQnO1xuaW1wb3J0IHsgTWF0VG9vbHRpcCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Rvb2x0aXAnO1xuaW1wb3J0IHsgTWF0SGVhZGVyUm93LCBNYXRIZWFkZXJSb3dEZWYsIE1hdFJvdywgTWF0Um93RGVmLCBNYXRUYWJsZSwgTWF0VGFibGVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJsZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgQXN5bmNQaXBlLCBOZ0NsYXNzLCBOZ0Zvck9mLCBOZ0lmIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE1ldGFBcGlTZXJ2aWNlIH0gZnJvbSAnLi4vbWV0YS1hcGkuc2VydmljZSc7XG5pbXBvcnQgeyBGaWx0ZXIsIE1hdHJpeFJvd1dpdGhDb3VudHMsIE1hdHJpeFdpdGhDb3VudHMsIFF1YWxpdHlNYXRyaXhIZWFkZXIgfSBmcm9tICcuLi9qYXZhLWFwaSc7XG5pbXBvcnQgeyBEYXRlVGltZSB9IGZyb20gJ2x1eG9uJztcbmltcG9ydCB7IGZpbmFsaXplLCB0YWtlLCB0YWtlVW50aWwsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEZvcm1Db250cm9sLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBEYXRlcGlja2VyQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50cy9maWx0ZXIvZGF0ZXBpY2tlci9kYXRlcGlja2VyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBNYXRJY29uIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1jb3VudHMtd2l0aC1oaXN0b3J5JyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIE1hdENhcmRNb2R1bGUsXG4gICAgTWF0Q2FyZCxcbiAgICBNYXRDYXJkSGVhZGVyLFxuICAgIE1hdENhcmRUaXRsZSxcbiAgICBNYXRDYXJkQ29udGVudCxcbiAgICBNYXRUb29sdGlwLFxuICAgIE1hdFRhYmxlTW9kdWxlLFxuICAgIE1hdFRhYmxlLFxuICAgIFRyYW5zbGF0ZU1vZHVsZSxcbiAgICBNYXRIZWFkZXJSb3csXG4gICAgTWF0SGVhZGVyUm93RGVmLFxuICAgIE1hdFJvdyxcbiAgICBNYXRSb3dEZWYsXG4gICAgTmdGb3JPZixcbiAgICBEYXRlcGlja2VyQ29tcG9uZW50LFxuICAgIE5nQ2xhc3MsXG4gICAgTWF0SWNvbixcbiAgICBOZ0lmLFxuICAgIEFzeW5jUGlwZSxcbiAgXSxcbiAgdGVtcGxhdGVVcmw6ICcuL2NvdW50cy13aXRoLWhpc3RvcnkuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vY291bnRzLXdpdGgtaGlzdG9yeS5jb21wb25lbnQuc2NzcycsXG59KVxuZXhwb3J0IGNsYXNzIENvdW50c1dpdGhIaXN0b3J5Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXNMb2FkaW5nID0gc2lnbmFsKHRydWUpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdGltZUZpbHRlckxvYWRlZCA9IHNpZ25hbChmYWxzZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveWVkJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByb3RlY3RlZCByZWFkb25seSByZWNlbnRUeXBlQ291bnQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxNYXRyaXhXaXRoQ291bnRzPih7IGNvbHVtbnM6IFtdLCByb3dzOiBbXSB9KTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHBhc3RUeXBlQ291bnQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxNYXRyaXhXaXRoQ291bnRzPih7IGNvbHVtbnM6IFtdLCByb3dzOiBbXSB9KTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHBhZ2VUaXRsZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIHByaXZhdGUgY29sdW1uczogUXVhbGl0eU1hdHJpeEhlYWRlcltdID0gW107XG4gIHByaXZhdGUgYXBpTWV0aG9kOiBrZXlvZiBNZXRhQXBpU2VydmljZSA9ICdnZXRNYXRlcmlhbFR5cGVDb3VudHNCeVJlcGxpY2F0aW9uU291cmNlJztcblxuICAvKiBJbiB0aGlzIHdpZGdldCdzIGJhY2tlbmQgd2UgZG8gaGF2ZSBkYXRhIGZvciB0b2RheVxuICAgKiB0aGVyZWZvcmUgd2Ugc2V0IHRoZSBlbmQgZGF0ZSB0byB0b2RheSBhbmQgdXNlIHRoZSB0aW1lcmFuZ2UoKSBlbmRwb2ludCB0byBvbmx5IHNldCB0aGUgc3RhcnQgZGF0ZVxuICAgKi9cbiAgcmVhZG9ubHkgcmFuZ2U6IEZvcm1Hcm91cDx7XG4gICAgc3RhcnQ6IEZvcm1Db250cm9sPERhdGVUaW1lPGJvb2xlYW4+PjtcbiAgICBlbmQ6IEZvcm1Db250cm9sPERhdGVUaW1lPGJvb2xlYW4+PjtcbiAgfT4gPSBuZXcgRm9ybUdyb3VwKHtcbiAgICBzdGFydDogbmV3IEZvcm1Db250cm9sKCksXG4gICAgZW5kOiBuZXcgRm9ybUNvbnRyb2woRGF0ZVRpbWUudXRjKCkuc3RhcnRPZignZGF5JyksIHsgbm9uTnVsbGFibGU6IHRydWUgfSksXG4gIH0pO1xuICBwcm90ZWN0ZWQgY29sdW1uVHJhbnNsYXRpb25rZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgbWV0YUFwaTogTWV0YUFwaVNlcnZpY2UsIHByaXZhdGUgcmVhZG9ubHkgcm91dGU6IEFjdGl2YXRlZFJvdXRlKSB7XG4gICAgdGhpcy5wYWdlVGl0bGUubmV4dCgnSGFsbG8gV2VsdCcpO1xuICB9XG4gIGNvbHVtbklkZW50KF9pbmRleDogbnVtYmVyLCBjb2w6IFF1YWxpdHlNYXRyaXhIZWFkZXIpIHtcbiAgICByZXR1cm4gY29sLmlkO1xuICB9XG5cbiAgZ2V0IHR5cGVDb2x1bW5zKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5jb2x1bW5zLm1hcCgoYykgPT4gYy5pZCArICdfdHlwZScpO1xuICB9XG5cbiAgZ2V0IHJlY2VudENvbHVtbnMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmNvbHVtbnMubWFwKChjKSA9PiBjLmlkICsgJ19yZWNlbnQnKTtcbiAgfVxuXG4gIGdldCBwYXN0Q29sdW1ucygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuY29sdW1ucy5tYXAoKGMpID0+IGMuaWQgKyAnX3Bhc3QnKTtcbiAgfVxuXG4gIGdldCBhbGxDb2x1bW5zKCk6IHN0cmluZ1tdIHtcbiAgICAvL3JldHVybiB0aGlzLnJlY2VudENvbHVtbnM7XG4gICAgcmV0dXJuIHRoaXMucGFzdENvbHVtbnMuZmxhdE1hcCgoZSwgaSkgPT4gW2UsIHRoaXMucmVjZW50Q29sdW1uc1tpXV0pO1xuICB9XG4gIHByaXZhdGUgcmVnaXN0ZXJEYXRlUmFuZ2VGaWx0ZXIoKSB7XG4gICAgLyogd2UgY2Fubm90IHVzZSB0aGUgdGFrZVVudGlsRGVzdHJveWVkKCkgaGVscGVyIGhlcmUsXG4gICAgICogYmVjYXVzZSB0aGlzIG1ldGhvZCBpcyBpbmRpcmVjdGx5IGNhbGxlZCBpbiB0aGUgZmluYWxpemF0aW9uIG9mIHRoZSBnZXRUaW1lcmFuZ2VGaWx0ZXIoKSBjYWxsXG4gICAgICovXG4gICAgdGhpcy5yYW5nZS5jb250cm9scy5lbmQudmFsdWVDaGFuZ2VzLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveWVkJCkpLnN1YnNjcmliZSgoZGF0ZSkgPT4ge1xuICAgICAgdGhpcy5nZXRDb3VudEJ5RGF0ZShkYXRlKS5zdWJzY3JpYmUoKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIHRoaXMucmVjZW50VHlwZUNvdW50JC5uZXh0KHJlc3BvbnNlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHRoaXMucmFuZ2UuY29udHJvbHMuc3RhcnQudmFsdWVDaGFuZ2VzLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveWVkJCkpLnN1YnNjcmliZSgoZGF0ZSkgPT4ge1xuICAgICAgdGhpcy5nZXRDb3VudEJ5RGF0ZShkYXRlKS5zdWJzY3JpYmUoKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIHRoaXMucGFzdFR5cGVDb3VudCQubmV4dChyZXNwb25zZSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VGltZVJhbmdlRmlsdGVyKCkge1xuICAgIHJldHVybiB0aGlzLm1ldGFBcGlcbiAgICAgIC5nZXRUaW1lcmFuZ2VGaWx0ZXIoKVxuICAgICAgLnBpcGUoXG4gICAgICAgIGZpbmFsaXplKCgpID0+IHtcbiAgICAgICAgICB0aGlzLnRpbWVGaWx0ZXJMb2FkZWQuc2V0KHRydWUpO1xuICAgICAgICB9KVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgocmFuZ2VGaWx0ZXIpID0+IHtcbiAgICAgICAgaWYgKHJhbmdlRmlsdGVyKSB7XG4gICAgICAgICAgY29uc3Qgc3RhcnREYXRlID0gRGF0ZVRpbWUuZnJvbUlTTyhyYW5nZUZpbHRlci52YWx1ZXMuZmluZCgodikgPT4gdi5pZCA9PT0gJ3JhbmdlU3RhcnQnKT8ubGFiZWwhLCB7XG4gICAgICAgICAgICB6b25lOiAndXRjJyxcbiAgICAgICAgICB9KS5zdGFydE9mKCdkYXknKTtcbiAgICAgICAgICB0aGlzLnJhbmdlLmNvbnRyb2xzLnN0YXJ0LnNldFZhbHVlKHN0YXJ0RGF0ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDb3VudEJ5RGF0ZShkYXRlOiBEYXRlVGltZSk6IE9ic2VydmFibGU8TWF0cml4V2l0aENvdW50cz4ge1xuICAgIHRoaXMuaXNMb2FkaW5nLnNldCh0cnVlKTtcbiAgICBjb25zdCBmaWx0ZXI6IEZpbHRlciA9IHtcbiAgICAgIGZpZWxkOiAnYXNPZicsXG4gICAgICB2YWx1ZXM6IFt7IGlkOiBkYXRlLnRvSVNPKHsgaW5jbHVkZU9mZnNldDogZmFsc2UgfSkhLCBsYWJlbDogJycgfV0sXG4gICAgfTtcbiAgICAvLyB0eXBlIG9mIHRoaXMubWV0YUFwaVt0aGlzLmFwaU1ldGhvZF0oW2ZpbHRlcl0pIGlzIE9ic2VydmFibGU8TWF0cml4V2l0aENvdW50cz5cbiAgICAvLyBidXQgdHlwZXNjcmlwdCBkb2VzIG5vdCBrbm93IHRoYXRcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgcmV0dXJuIHRoaXMubWV0YUFwaVt0aGlzLmFwaU1ldGhvZF0oW2ZpbHRlcl0pLnBpcGUoZmluYWxpemUoKCkgPT4gdGhpcy5pc0xvYWRpbmcuc2V0KGZhbHNlKSkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHBhc3RUeXBlQ291bnQocm93OiBNYXRyaXhSb3dXaXRoQ291bnRzLCBjb2x1bW5pZDogc3RyaW5nKSB7XG4gICAgaWYgKCF0aGlzLnBhc3RUeXBlQ291bnQkLnZhbHVlLnJvd3MubGVuZ3RoKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIGNvbnN0IHBhc3Rfcm93ID0gdGhpcy5wYXN0VHlwZUNvdW50JC52YWx1ZS5yb3dzLmZpbmQoKHByKSA9PiBwci5tZXRhLmlkID09IHJvdy5tZXRhLmlkKTtcbiAgICBjb25zdCBwYXN0X2NvbHVtbiA9IHRoaXMucGFzdFR5cGVDb3VudCQudmFsdWUuY29sdW1ucy5maW5kKChjKSA9PiBjLmlkID09IGNvbHVtbmlkKTtcbiAgICBpZiAoIXBhc3Rfcm93IHx8ICFwYXN0X2NvbHVtbikge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHJvdy5jb3VudHNbY29sdW1uaWRdO1xuICAgIGNvbnN0IHBhc3RWYWx1ZSA9IHBhc3Rfcm93LmNvdW50c1tjb2x1bW5pZF07XG5cbiAgICBjb25zdCBkZWx0YSA9IChjdXJyZW50VmFsdWUgfHwgMCkgLSAocGFzdFZhbHVlIHx8IDApO1xuICAgIGNvbnN0IHRyZW5kID0gZGVsdGEgPT09IDAgPyAndHJlbmRpbmdfZmxhdCcgOiBkZWx0YSA8IDAgPyAndHJlbmRpbmdfZG93bicgOiAndHJlbmRpbmdfdXAnO1xuICAgIHJldHVybiB7IGRlbHRhLCB0cmVuZCwgdmFsdWU6IHBhc3RWYWx1ZSB9O1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpc3RlckRhdGVSYW5nZUZpbHRlcigpO1xuICAgIHRoaXMucm91dGUuZGF0YS5waXBlKHRha2UoMSkpLnN1YnNjcmliZSgoeyBjb2x1bW5UcmFuc2xhdGlvbmtleSA9IG51bGwsIHRpdGxlLCBhcGlNZXRob2QgfSkgPT4ge1xuICAgICAgdGhpcy5jb2x1bW5UcmFuc2xhdGlvbmtleSA9IGNvbHVtblRyYW5zbGF0aW9ua2V5O1xuICAgICAgdGhpcy5wYWdlVGl0bGUubmV4dCh0aXRsZSk7XG4gICAgICB0aGlzLmFwaU1ldGhvZCA9IGFwaU1ldGhvZDtcbiAgICAgIHRoaXMuZ2V0VGltZVJhbmdlRmlsdGVyKCk7XG4gICAgICB0aGlzLmdldENvdW50QnlEYXRlKHRoaXMucmFuZ2UuY29udHJvbHMuZW5kLnZhbHVlKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICB0YXAoKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNvbHVtbnMgPSByZXNwb25zZS5jb2x1bW5zLnNsaWNlKCk7XG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgIHRoaXMucmVjZW50VHlwZUNvdW50JC5uZXh0KHJlc3BvbnNlKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgRGF0ZVRpbWUgPSBEYXRlVGltZTtcblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3llZCQubmV4dCgpO1xuICAgIHRoaXMuZGVzdHJveWVkJC5jb21wbGV0ZSgpO1xuICB9XG59XG4iLCI8bWF0LWNhcmQgYXBwZWFyYW5jZT1cInJhaXNlZFwiPlxuICA8bWF0LWNhcmQtaGVhZGVyPlxuICAgIDxtYXQtY2FyZC10aXRsZSBkYXRhLXRlc3QtaWQ9XCJwYWdlLXRpdGxlXCI+XG4gICAgICBRdWFsaXTDpHRzbWV0cmlrOiB7eyhwYWdlVGl0bGUgfCBhc3luYyApIHx8ICcnIHwgdHJhbnNsYXRlfX17e2lzTG9hZGluZygpID8gXCI6IExhZGUgbmV1ZSBEYXRlbi5cIiA6IFwiXCJ9fVxuICAgIDwvbWF0LWNhcmQtdGl0bGU+XG4gIDwvbWF0LWNhcmQtaGVhZGVyPlxuICA8IS0tIGNvbnNpZGVyIHRvIHB1dCB0aGUgZmlsdGVyIGluIHRoZSB0YWJsZSBoZWFkZXIgdG8gYXZvaWQgdGhhdCBpdCBpcyBzY3JvbGxlZCBvdXQgb2Ygdmlldy0tPlxuICA8IS0tIHNob3cgdGhlIGZpbHRlciBhZnRlciB0aGUgdmFsdWVzIGFyZSBsb2FkZWQgdG8gYXZvaWQgbG9hZGluZyBjdXJyZW50IGRhdGEgdHdpY2UgLS0+XG4gIDxtYXQtY2FyZC1jb250ZW50ICpuZ0lmPVwidGltZUZpbHRlckxvYWRlZCgpXCI+XG4gICAgPGxpYi1kYXRlcGlja2VyIFtkaXNhYmxlZF09XCJpc0xvYWRpbmcoKVwiIFtpbnB1dEdyb3VwXT1cInJhbmdlXCIgPjwvbGliLWRhdGVwaWNrZXI+XG4gIDwvbWF0LWNhcmQtY29udGVudD5cbjwvbWF0LWNhcmQ+XG48bWF0LWNhcmQ+XG4gIDx0YWJsZSBbbmdDbGFzc109XCJ7J3doaWxlLWxvYWRpbmcnOiBpc0xvYWRpbmcoKX1cIiBtYXQtdGFibGUgW2RhdGFTb3VyY2VdPVwicmVjZW50VHlwZUNvdW50JC52YWx1ZS5yb3dzXCIgY2xhc3M9XCJxdWFsaXR5LW1hdHJpeFwiPlxuICAgIDwhLS0gRGVmaW5lIGNvbHVtbnMgb2YgdGFibGUgLS0+XG4gICAgPCEtLSBSb3cgSGVhZGVyIENvbHVtbiAtLT5cbiAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImxhYmVsLWNvbFwiIHN0aWNreT5cbiAgICAgIDx0aCByb3dzcGFuPVwiMlwiIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5RdWVsbGU8L3RoPlxuICAgICAgPHRkXG4gICAgICAgIG1hdC1jZWxsXG4gICAgICAgICptYXRDZWxsRGVmPVwibGV0IHJvd1wiXG4gICAgICAgIG1hdFRvb2x0aXA9XCJ7e3Jvdy5tZXRhLmFsdF9sYWJlbH19XCJcbiAgICAgICAgY2xhc3M9XCJsYWJlbC1jb2xcIlxuICAgICAgPlxuICAgICAgICB7e3Jvdy5tZXRhLmxhYmVsfX1cbiAgICAgIDwvdGQ+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPCEtLSBvbmUgY29sdW1uIGZvciBlYWNoIHR5cGUgLS0+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sIG9mIHJlY2VudFR5cGVDb3VudCQudmFsdWUuY29sdW1uczsgdHJhY2tCeTpjb2x1bW5JZGVudFwiIFttYXRDb2x1bW5EZWZdPVwiY29sLmlkICsgJ190eXBlJ1wiPlxuICAgICAgPHRoIGNvbHNwYW49XCIyXCIgbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIG1hdFRvb2x0aXA9XCJ7e2NvbC5sYWJlbH19XCIgPlxuICAgICAgICB7e2NvbHVtblRyYW5zbGF0aW9ua2V5ID8gKGNvbHVtblRyYW5zbGF0aW9ua2V5ICsgY29sLmxhYmVsIHwgdHJhbnNsYXRlICkgOiBjb2wubGFiZWwgfX1cbiAgICAgIDwvdGg+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPCEtLSBvbmUgY29sdW1uIGZvciBlYWNoIHR5cGUgZm9yIHRoZSBtb3N0IGN1cnJlbnQgZGF0ZS0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbCBvZiByZWNlbnRUeXBlQ291bnQkLnZhbHVlLmNvbHVtbnM7IHRyYWNrQnk6Y29sdW1uSWRlbnRcIiBbbWF0Q29sdW1uRGVmXT1cImNvbC5pZCArICdfcmVjZW50J1wiPlxuICAgICAgPHRoIGNsYXNzPVwicmVjZW50LWRhdGEtY2VsbFwiIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBtYXRUb29sdGlwPVwibm8gdG9vbHRpcFwiID57eyByYW5nZS5jb250cm9scy5lbmQudmFsdWUudG9Mb2NhbGVTdHJpbmcoRGF0ZVRpbWUuREFURV9TSE9SVCkgfX08L3RoPlxuICAgICAgPHRkIGNsYXNzPVwicmVjZW50LWRhdGEtY2VsbFwiIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiPnt7IHJvdy5jb3VudHNbY29sLmlkXSA/PyAnbi9hJyB9fTwvdGQ+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPCEtLSBvbmUgY29sdW1uIGZvciBlYWNoIHR5cGUgZm9yIHRoZSBvbGRlciBkYXRlLS0+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sIG9mIHJlY2VudFR5cGVDb3VudCQudmFsdWUuY29sdW1uczsgdHJhY2tCeTpjb2x1bW5JZGVudFwiIFttYXRDb2x1bW5EZWZdPVwiY29sLmlkICsgJ19wYXN0J1wiPlxuICAgICAgPHRoIGNsYXNzPVwicGFzdC1kYXRhLWNlbGxcIiBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgbWF0VG9vbHRpcD1cIm5vIHRvb2x0aXBcIiA+XG4gICAgICAgIHt7IHBhc3RUeXBlQ291bnQkLnZhbHVlLnJvd3MubGVuZ3RoID8gcmFuZ2UuY29udHJvbHMuc3RhcnQudmFsdWUudG9Mb2NhbGVTdHJpbmcoRGF0ZVRpbWUuREFURV9TSE9SVCkgOiAnbm8gcGFzdCBkYXRhJyB9fVxuICAgICAgPC90aD5cbiAgICAgIDx0ZCBjbGFzcz1cInBhc3QtZGF0YS1jZWxsXCIgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93O1wiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicGFzdFR5cGVDb3VudCQudmFsdWUucm93cy5sZW5ndGggJiYgcGFzdFR5cGVDb3VudChyb3csIGNvbC5pZCkgYXMgdHJlbmRcIj5cbiAgICAgICAgICA8c3BhbiBbbmdDbGFzc109XCJ0cmVuZC50cmVuZFwiPiB7eyB0cmVuZC52YWx1ZSA/PyAnbi9hJyB9fTxtYXQtaWNvbiBhcmlhLWhpZGRlbj1cImZhbHNlXCIgW2F0dHIuYXJpYS1sYWJlbF09XCJ0cmVuZC50cmVuZFwiIFtmb250SWNvbl09XCJ0cmVuZC50cmVuZCFcIiAvPjwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNkay12aXN1YWxseS1oaWRkZW5cIj57e3RyZW5kLnRyZW5kfX08L3NwYW4+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC90ZD5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8IS0tIGdlbmVyYXRlIGFjdHVhbCB0YWJsZSAtLT5cbiAgICA8dHIgbWF0LWhlYWRlci1yb3cgKm1hdEhlYWRlclJvd0RlZj1cIlsnbGFiZWwtY29sJ10uY29uY2F0KHR5cGVDb2x1bW5zKTsgc3RpY2t5OnRydWU7XCI+PC90cj5cbiAgICA8dHIgbWF0LWhlYWRlci1yb3cgKm1hdEhlYWRlclJvd0RlZj1cImFsbENvbHVtbnM7IHN0aWNreTogdHJ1ZTtcIj48L3RyPlxuICAgIDx0ciBtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBbJ2xhYmVsLWNvbCddLmNvbmNhdChhbGxDb2x1bW5zKVwiPjwvdHI+XG5cbiAgPC90YWJsZT5cbjwvbWF0LWNhcmQ+Il19
@@ -3033,14 +3033,13 @@ class CountsWithHistoryComponent {
3033
3033
  .getTimerangeFilter()
3034
3034
  .pipe(finalize(() => {
3035
3035
  this.timeFilterLoaded.set(true);
3036
- this.registerDateRangeFilter();
3037
3036
  }))
3038
3037
  .subscribe((rangeFilter) => {
3039
3038
  if (rangeFilter) {
3040
3039
  const startDate = DateTime.fromISO(rangeFilter.values.find((v) => v.id === 'rangeStart')?.label, {
3041
3040
  zone: 'utc',
3042
3041
  }).startOf('day');
3043
- this.range.setControl('start', new FormControl(startDate, { nonNullable: true }));
3042
+ this.range.controls.start.setValue(startDate);
3044
3043
  }
3045
3044
  });
3046
3045
  }
@@ -3071,6 +3070,7 @@ class CountsWithHistoryComponent {
3071
3070
  return { delta, trend, value: pastValue };
3072
3071
  }
3073
3072
  ngOnInit() {
3073
+ this.registerDateRangeFilter();
3074
3074
  this.route.data.pipe(take(1)).subscribe(({ columnTranslationkey = null, title, apiMethod }) => {
3075
3075
  this.columnTranslationkey = columnTranslationkey;
3076
3076
  this.pageTitle.next(title);